[
  {
    "path": ".gemini/config.yaml",
    "content": "# Config for the Gemini Pull Request Review Bot.\n# https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github\n\n# Enables fun features such as a poem in the initial pull request summary.\n# Type: boolean, default: false.\nhave_fun: false\n\ncode_review:\n  # Disables Gemini from acting on PRs.\n  # Type: boolean, default: false.\n  disable: false\n\n  # Minimum severity of comments to post (LOW, MEDIUM, HIGH, CRITICAL).\n  # Type: string, default: MEDIUM.\n  comment_severity_threshold: MEDIUM\n\n  # Max number of review comments (-1 for unlimited).\n  # Type: integer, default: -1.\n  max_review_comments: -1\n\n  pull_request_opened:\n    # Post helpful instructions when PR is opened.\n    # Type: boolean, default: false.\n    help: false\n\n    # Post PR summary when opened.\n    # Type boolean, default: true.\n    summary: true \n\n    # Post code review on PR open.\n    # Type boolean, default: true.\n    code_review: true\n\n# List of glob patterns to ignore (files and directories).\n# Type: array of string, default: [].\nignore_patterns: []\n"
  },
  {
    "path": ".gemini/styleguide.md",
    "content": "# LND Style Guide\n\n## Code Documentation and Commenting\n\n- Always use the Golang code style described below in this document. \n- Readable code is the most important requirement for any commit created. \n- Comments must not explain the code 1:1 but instead explain the _why_ behind a \n  certain block of code, in case it requires contextual knowledge. \n- Unit tests must always use the `require` library. Either table driven unit \n  tests or tests using the `rapid` library are preferred. \n- The line length MUST NOT exceed 80 characters, this is very important. \n  You must count the Golang indentation (tabulator character) as 8 spaces when \n  determining the line length. Use creative approaches or the wrapping rules \n  specified below to make sure the line length isn't exceeded.\n- Every function must be commented with its purpose and assumptions.\n- Function comments must begin with the function name.\n- Function comments should be complete sentences.\n- Exported functions require detailed comments for the caller.\n\n**WRONG**\n```go\n// generates a revocation key\nfunc DeriveRevocationPubkey(commitPubKey *btcec.PublicKey,\n\trevokePreimage []byte) *btcec.PublicKey {\n```\n**RIGHT**\n```go\n// DeriveRevocationPubkey derives the revocation public key given the\n// counterparty's commitment key, and revocation preimage derived via a\n// pseudo-random-function. In the event that we (for some reason) broadcast a\n// revoked commitment transaction, then if the other party knows the revocation\n// preimage, then they'll be able to derive the corresponding private key to\n// this private key by exploiting the homomorphism in the elliptic curve group.\n//\n// The derivation is performed as follows:\n//\n//   revokeKey := commitKey + revokePoint\n//             := G*k + G*h\n//             := G * (k+h)\n//\n// Therefore, once we divulge the revocation preimage, the remote peer is able\n// to compute the proper private key for the revokeKey by computing:\n//   revokePriv := commitPriv + revokePreimge mod N\n//\n// Where N is the order of the sub-group.\nfunc DeriveRevocationPubkey(commitPubKey *btcec.PublicKey,\n\trevokePreimage []byte) *btcec.PublicKey {\n```\n- In-body comments should explain the *intention* of the code.\n**WRONG**\n```go\n// return err if amt is less than 546\nif amt < 546 {\n\treturn err\n}\n```\n**RIGHT**\n```go\n// Treat transactions with amounts less than the amount which is considered dust\n// as non-standard.\nif amt < 546 {\n\treturn err\n}\n```\n## Code Spacing and formatting\n- Segment code into logical stanzas separated by newlines.\n**WRONG**\n```go\n\twitness := make([][]byte, 4)\n\twitness[0] = nil\n\tif bytes.Compare(pubA, pubB) == -1 {\n\t\twitness[1] = sigB\n\t\twitness[2] = sigA\n\t} else {\n\t\twitness[1] = sigA\n\t\twitness[2] = sigB\n\t}\n\twitness[3] = witnessScript\n\treturn witness\n```\n**RIGHT**\n```go\n\twitness := make([][]byte, 4)\n\n\t// When spending a p2wsh multi-sig script, rather than an OP_0, we add\n\t// a nil stack element to eat the extra pop.\n\twitness[0] = nil\n\n\t// When initially generating the witnessScript, we sorted the serialized\n\t// public keys in descending order. So we do a quick comparison in order\n\t// to ensure the signatures appear on the Script Virtual Machine stack in\n\t// the correct order.\n\tif bytes.Compare(pubA, pubB) == -1 {\n\t\twitness[1] = sigB\n\t\twitness[2] = sigA\n\t} else {\n\t\twitness[1] = sigA\n\t\twitness[2] = sigB\n\t}\n\n\t// Finally, add the preimage as the last witness element.\n\twitness[3] = witnessScript\n\n\treturn witness\n```\n- Use spacing between `case` and `select` stanzas.\n**WRONG**\n```go\n\tswitch {\n\t\tcase a:\n\t\t\t<code block>\n\t\tcase b:\n\t\t\t<code block>\n\t\tcase c:\n\t\t\t<code block>\n\t\tcase d:\n\t\t\t<code block>\n\t\tdefault:\n\t\t\t<code block>\n\t}\n```\n**RIGHT**\n```go\n\tswitch {\n\t\t// Brief comment detailing instances of this case (repeat below).\n\t\tcase a:\n\t\t\t<code block>\n\n\t\tcase b:\n\t\t\t<code block>\n\n\t\tcase c:\n\t\t\t<code block>\n\n\t\tcase d:\n\t\t\t<code block>\n\n\t\tdefault:\n\t\t\t<code block>\n\t}\n```\n## Additional Style Constraints\n### 80 character line length\n- Wrap columns at 80 characters.\n- Tabs are 8 spaces.\n**WRONG**\n```go\nmyKey := \"0214cd678a565041d00e6cf8d62ef8add33b4af4786fb2beb87b366a2e151fcee7\"\n```\n**RIGHT**\n```go\nmyKey := \"0214cd678a565041d00e6cf8d62ef8add33b4af4786fb2beb87b366a2e1\" +\n\t\"51fcee7\"\n```\n### Wrapping long function calls\n- If a function call exceeds the column limit, place the closing parenthesis\n  on its own line and start all arguments on a new line after the opening\n  parenthesis.\n**WRONG**\n```go\nvalue, err := bar(a,\n\ta, b, c)\n```\n**RIGHT**\n```go\nvalue, err := bar(\n\ta, a, b, c,\n)\n```\n- Compact form is acceptable if visual symmetry of parentheses is preserved.\n**ACCEPTABLE**\n```go\n\tresponse, err := node.AddInvoice(\n\t\tctx, &lnrpc.Invoice{\n\t\t\tMemo:      \"invoice\",\n\t\t\tValueMsat: int64(oneUnitMilliSat - 1),\n\t\t},\n\t)\n```\n**PREFERRED**\n```go\n\tresponse, err := node.AddInvoice(ctx, &lnrpc.Invoice{\n\t\tMemo:      \"invoice\",\n\t\tValueMsat: int64(oneUnitMilliSat - 1),\n\t})\n```\n### Exception for log and error message formatting\n- Minimize lines for log and error messages, while adhering to the\n  80-character limit.\n**WRONG**\n```go\nreturn fmt.Errorf(\n\t\"this is a long error message with a couple (%d) place holders\",\n\tlen(things),\n)\n\nlog.Debugf(\n\t\"Something happened here that we need to log: %v\",\n\tlongVariableNameHere,\n)\n```\n**RIGHT**\n```go\nreturn fmt.Errorf(\"this is a long error message with a couple (%d) place \"+\n\t\"holders\", len(things))\n\nlog.Debugf(\"Something happened here that we need to log: %v\",\n\tlongVariableNameHere)\n```\n### Exceptions and additional styling for structured logging\n- **Static messages:** Use key-value pairs instead of formatted strings for the\n  `msg` parameter.\n- **Key-value attributes:** Use `slog.Attr` helper functions.\n- **Line wrapping:** Structured log lines are an exception to the 80-character\n  rule. Use one line per key-value pair for multiple attributes.\n**WRONG**\n```go\nlog.DebugS(ctx, fmt.Sprintf(\"User %d just spent %.8f to open a channel\", userID, 0.0154))\n```\n**RIGHT**\n```go\nlog.InfoS(ctx, \"Channel open performed\",\n        slog.Int(\"user_id\", userID),\n        btclog.Fmt(\"amount\", \"%.8f\", 0.00154))\n```\n### Wrapping long function definitions\n- If function arguments exceed the 80-character limit, maintain indentation\n  on following lines.\n- Do not end a line with an open parenthesis if the function definition is not\n  finished.\n**WRONG**\n```go\nfunc foo(a, b, c,\n) (d, error) {\n\nfunc bar(a, b, c) (\n\td, error,\n) {\n\nfunc baz(a, b, c) (\n\td, error) {\n```\n**RIGHT**\n```go\nfunc foo(a, b,\n\tc) (d, error) {\n\nfunc baz(a, b, c) (d,\n\terror) {\n\nfunc longFunctionName(\n\ta, b, c) (d, error) {\n```\n- If a function declaration spans multiple lines, the body should start with an\n  empty line.\n**WRONG**\n```go\nfunc foo(a, b, c,\n\td, e) error {\n\tvar a int\n}\n```\n**RIGHT**\n```go\nfunc foo(a, b, c,\n\td, e) error {\n\n\tvar a int\n}\n```\n## Use of Log Levels\n- Available levels: `trace`, `debug`, `info`, `warn`, `error`, `critical`.\n- Only use `error` for internal errors not triggered by external sources.\n## Testing\n- To run all tests for a specific package:\n  `make unit pkg=$pkg`\n- To run a specific test case within a package:\n  `make unit pkg=$pkg case=$case`\n## Git Commit Messages\n- **Subject Line:**\n  - Format: `subsystem: short description of changes`\n  - `subsystem` should be the package primarily affected (e.g., `peer`, `rpcclient`).\n  - For multiple packages, use `+` or `,` as a delimiter (e.g., `peer+rpcclient`).\n  - For widespread changes, use `multi:`.\n  - Keep it under 50 characters.\n  - Use the present tense (e.g., \"Fix bug\", not \"Fixed bug\").\n- **Message Body:**\n  - Separate from the subject with a blank line.\n  - Explain the \"what\" and \"why\" of the change.\n  - Wrap text to 72 characters.\n  - Use bullet points for lists.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a bug report. Please use the discussions section for general or troubleshooting questions.\ntitle: '[bug]: '\nlabels: [\"bug\", \"needs triage\"]\nassignees: ''\n---\n\n### Background\n\nDescribe your issue here.\n\n### Your environment\n\n* version of `btcd`\n* which operating system (`uname -a` on *Nix)\n* any other relevant environment details\n\n### Steps to reproduce\n\nTell us how to reproduce this issue. Please provide stacktraces and links to code in question.\n\n### Expected behaviour\n\nTell us what should happen\n\n### Actual behaviour\n\nTell us what happens instead\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Discussions\n    url: https://github.com/btcsuite/btcd/discussions\n    about: For general or troubleshooting questions or if you're not sure what issue type to pick.\n  - name: Community Slack\n    url: https://lightning.engineering/slack.html\n    about: Please ask and answer questions here.\n  - name: Security issue disclosure policy\n    url: https://github.com/lightningnetwork/lnd#security\n    about: Please refer to this document when reporting security related issues.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest a new feature for `btcd`.\ntitle: '[feature]: '\nlabels: enhancement\nassignees: ''\n---\n\n**Is your feature request related to a problem? Please describe.**\n<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->\n\n**Describe the solution you'd like**\n<!-- A clear and concise description of what you want to happen. -->\n\n**Describe alternatives you've considered**\n<!-- A clear and concise description of any alternative solutions or features you've considered. -->\n\n**Additional context**\n<!-- Add any other context or screenshots about the feature request here. -->\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "## Change Description\nDescription of change / link to associated issue.\n\n## Steps to Test\nSteps for reviewers to follow to test the change.\n\n## Pull Request Checklist\n### Testing\n- [ ] Your PR passes all CI checks.\n- [ ] Tests covering the positive and negative (error paths) are included.\n- [ ] Bug fixes contain tests triggering the bug to prevent regressions.\n\n### Code Style and Documentation\n- [ ] The change is not [insubstantial](https://github.com/btcsuite/btcd/blob/master/docs/code_contribution_guidelines.md#substantial-contributions-only). Typo fixes are not accepted to fight bot spam.\n- [ ] The change obeys the [Code Documentation and Commenting](https://github.com/btcsuite/btcd/blob/master/docs/code_contribution_guidelines.md#code-documentation-and-commenting) guidelines, and lines wrap at 80.\n- [ ] Commits follow the [Ideal Git Commit Structure](https://github.com/btcsuite/btcd/blob/master/docs/code_contribution_guidelines.md#model-git-commit-messages). \n- [ ] Any new logging statements use an appropriate subsystem and logging level.\n\n📝 Please see our [Contribution Guidelines](https://github.com/btcsuite/btcd/blob/master/docs/code_contribution_guidelines.md) for further guidance.\n"
  },
  {
    "path": ".github/workflows/Dockerfile",
    "content": "# GitHub action dockerfile\n# Requires docker experimental features as buildx and BuildKit so not suitable for developers regular use.\n# https://docs.docker.com/develop/develop-images/build_enhancements/#to-enable-buildkit-builds\n\n###########################\n# Build binaries stage\n###########################\nFROM --platform=$BUILDPLATFORM golang:1.23-alpine AS build\nADD . /app\nWORKDIR /app\n# Arguments required to build binaries targetting the correct OS and CPU architectures\nARG TARGETOS TARGETARCH\n# Actually building the binaries\nRUN GOOS=$TARGETOS GOARCH=$TARGETARCH go install -v . ./cmd/...\n\n###########################\n# Build docker image stage\n###########################\nFROM alpine:3.15\nCOPY --from=build /go/bin /bin\n# 8333  Mainnet Bitcoin peer-to-peer port\n# 8334  Mainet RPC port\nEXPOSE 8333 8334\nENTRYPOINT [\"btcd\"]\n"
  },
  {
    "path": ".github/workflows/dimagespub.yml",
    "content": "name: Docker images build and publish\n\non:\n  push:\n    tags:\n      - v*\n  # Allows you to run this workflow manually from the Actions tab\n  workflow_dispatch:\n\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n  # Build for default OS, linux, and common CPU architectures\n  # Reference https://github.com/docker/setup-buildx-action#quick-start\n  TPLATFORMS: linux/amd64,linux/arm64,linux/arm,linux/386\n\njobs:\n  build-push:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      packages: write\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Docker Setup Buildx\n        id: buildx\n        uses: docker/setup-buildx-action@94ab11c41e45d028884a99163086648e898eed25\n\n      - name: Log in to the Container registry\n        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38\n        with:\n          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n       \n      - name: Build and push Docker images\n        uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a\n        with:\n          file: .github/workflows/Dockerfile\n          labels: ${{ steps.meta.outputs.labels }}\n          platforms: ${{ env.TPLATFORMS }}\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: Build and Test\non: [push, pull_request]\n\nenv:\n  # go needs absolute directories, using the $HOME variable doesn't work here.\n  GOCACHE: /home/runner/work/go/pkg/build\n  GOPATH: /home/runner/work/go\n  GOBIN: /home/runner/work/go/bin\n  GO_VERSION: 1.22.11\n\njobs:\n  build:\n    name: Build\n    runs-on: ubuntu-latest\n    steps:\n      - name: Set up Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: ${{ env.GO_VERSION }}\n\n      - name: Check out source\n        uses: actions/checkout@v4\n\n      - name: Build\n        run: make build\n\n  test-cover:\n    name: Unit coverage\n    runs-on: ubuntu-latest\n    steps:\n      - name: Set up Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: ${{ env.GO_VERSION }}\n\n      - name: Check out source\n        uses: actions/checkout@v4\n\n      - name: Test\n        run: make unit-cover\n\n      - name: Send top-level coverage\n        uses: coverallsapp/github-action@v2\n        continue-on-error: true\n        with:\n          file: coverage.txt\n          flag-name: btcd\n          format: 'golang'\n          parallel: true\n\n      - name: Send btcec\n        uses: coverallsapp/github-action@v2\n        continue-on-error: true\n        with:\n          file: btcec/coverage.txt\n          flag-name: btcec\n          format: 'golang'\n          parallel: true\n\n      - name: Send btcutil coverage\n        uses: coverallsapp/github-action@v2\n        continue-on-error: true\n        with:\n          file: btcutil/coverage.txt\n          flag-name: btcutil\n          format: 'golang'\n          parallel: true\n\n      - name: Send btcutil coverage for psbt package\n        uses: coverallsapp/github-action@v2\n        continue-on-error: true\n        with:\n          file: btcutil/psbt/coverage.txt\n          flag-name: btcutilpsbt\n          format: 'golang'\n          parallel: true\n      \n      - name: Notify coveralls all reports sent\n        uses: coverallsapp/github-action@v2\n        continue-on-error: true\n        with:\n          parallel-finished: true\n\n  test-race:\n    name: Unit race\n    runs-on: ubuntu-latest\n    steps:\n      - name: Set up Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: ${{ env.GO_VERSION }}\n\n      - name: Check out source\n        uses: actions/checkout@v4\n\n      - name: Test\n        run: make unit-race\n"
  },
  {
    "path": ".gitignore",
    "content": "# Temp files\n*~\n\n# Databases\nbtcd.db\n*-shm\n*-wal\n\n# Log files\n*.log\n\n# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o\n*.a\n*.so\n\n# Folders\n_obj\n_test\nvendor\n\n# Architecture specific extensions/prefixes\n*.[568vq]\n[568vq].out\n\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n\n_testmain.go\n\n*.exe\n\n# Code coverage files\nprofile.tmp\nprofile.cov\ncoverage.txt\nbtcec/coverage.txt\nbtcutil/coverage.txt\nbtcutil/psbt/coverage.txt\n\n# vim\n*.swp\n*.swo\n/.vim\n\n#IDE\n.idea\n\n# Binaries produced by \"make build\"\n/addblock\n/btcctl\n/btcd\n/findcheckpoint\n/gencerts\n\n.DS_Store\n.aider*\n"
  },
  {
    "path": ".golangci.yml",
    "content": "version: \"2\"\r\nissues:\r\n  # Only show newly introduced problems.\r\n  new-from-rev: 80b74d6c5a0088a66dc96df6777d21e15c04849c"
  },
  {
    "path": "CHANGES",
    "content": "============================================================================\nUser visible changes for btcd\n  A full-node bitcoin implementation written in Go\n============================================================================\n\nChanges in 0.22.0 (Tue Jun 01 2021)\n  - Protocol and network-related changes:\n    - Add support for witness tx and block in notfound msg (#1625)\n    - Add support for receiving sendaddrv2 messages from a peer (#1670)\n    - Fix bug in peer package causing last block height to go backwards\n      (#1606)\n    - Add chain parameters for connecting to the public Signet network\n      (#1692, #1718)\n  - Crypto changes:\n    - Fix bug causing panic due to bad R and S signature components in\n      btcec.RecoverCompact (#1691)\n    - Set the name (secp256k1) in the CurveParams of the S256 curve\n      (#1565)\n  - Notable developer-related package changes:\n    - Remove unknown block version warning in the blockchain package,\n      due to false positives triggered by AsicBoost (#1463)\n    - Add chaincfg.RegisterHDKeyID function to populate HD key ID pairs\n      (#1617)\n    - Add new method mining.AddWitnessCommitment to add the witness\n      commitment as an OP_RETURN output within the coinbase transaction.\n      (#1716)\n  - RPC changes:\n    - Support Batch JSON-RPC in rpcclient and server (#1583)\n    - Add rpcclient method to invoke getdescriptorinfo JSON-RPC command\n      (#1578)\n    - Update the rpcserver handler for validateaddress JSON-RPC command to\n      have parity with the bitcoind 0.20.0 interface (#1613)\n    - Add rpcclient method to invoke getblockfilter JSON-RPC command\n      (#1579)\n    - Add signmessagewithprivkey JSON-RPC command in rpcserver (#1585)\n    - Add rpcclient method to invoke importmulti JSON-RPC command (#1579)\n    - Add watchOnly argument in rpcclient method to invoke\n      listtransactions JSON-RPC command (#1628)\n    - Update btcjson.ListTransactionsResult for compatibility with Bitcoin\n      Core 0.20.0 (#1626)\n    - Support nullable optional JSON-RPC parameters (#1594)\n    - Add rpcclient and server method to invoke getnodeaddresses JSON-RPC\n      command (#1590)\n    - Add rpcclient methods to invoke PSBT JSON-RPC commands (#1596)\n    - Add rpcclient method to invoke listsinceblock with the\n      include_watchonly parameter enabled (#1451)\n    - Add rpcclient method to invoke deriveaddresses JSON-RPC command\n      (#1631)\n    - Add rpcclient method to invoke getblocktemplate JSON-RPC command\n      (#1629)\n    - Add rpcclient method to invoke getaddressinfo JSON-RPC command\n      (#1633)\n    - Add rpcclient method to invoke getwalletinfo JSON-RPC command\n      (#1638)\n    - Fix error message in rpcserver when an unknown RPC command is\n      encountered (#1695)\n    - Fix error message returned by estimatefee when the number of blocks\n      exceeds the max depth (#1678)\n    - Update btcjson.GetBlockChainInfoResult to include new fields in\n      Bitcoin Core (#1676)\n    - Add ExtraHeaders in rpcclient.ConnConfig struct (#1669)\n    - Fix bitcoind compatibility issue with the sendrawtransaction\n      JSON-RPC command (#1659)\n    - Add new JSON-RPC errors to btcjson package, and documented them\n      (#1648)\n    - Add rpcclient method to invoke createwallet JSON-RPC command\n      (#1650)\n    - Add rpcclient methods to invoke backupwallet, dumpwallet, loadwallet\n      and unloadwallet JSON-RPC commands (#1645)\n    - Fix unmarshalling error in getmininginfo JSON-RPC command, for valid\n      integers in scientific notation (#1644)\n    - Add rpcclient method to invoke gettxoutsetinfo JSON-RPC command\n      (#1641)\n    - Add rpcclient method to invoke signrawtransactionwithwallet JSON-RPC\n      command (#1642)\n    - Add txid to getblocktemplate response of rpcserver (#1639)\n    - Fix monetary unit used in createrawtransaction JSON-RPC command in\n      rpcserver (#1614)\n    - Add rawtx field to btcjson.GetBlockVerboseTxResult to provide\n      backwards compatibility with older versions of Bitcoin Core (#1677)\n  - Misc changes:\n    - Update btcutil dependency (#1704)\n    - Add Dockerfile to build and run btcd on Docker (#1465)\n    - Rework documentation and publish on https://btcd.readthedocs.io (#1468)\n    - Add support for Go 1.15 (#1619)\n    - Add Go 1.14 as the minimum supported version of Golang (#1621)\n  - Contributors (alphabetical order):\n    - 10gic\n    - Andrew Tugarinov\n    - Anirudha Bose\n    - Appelberg-s\n    - Armando Ochoa\n    - Aurèle Oulès\n    - Calvin Kim\n    - Christian Lehmann\n    - Conner Fromknecht\n    - Dan Cline\n    - David Mazary\n    - Elliott Minns\n    - Federico Bond\n    - Friedger Müffke\n    - Gustavo Chain\n    - Hanjun Kim\n    - Henry Fisher\n    - Iskander Sharipov\n    - Jake Sylvestre\n    - Johan T. Halseth\n    - John C. Vernaleo\n    - Liran Sharir\n    - Mikael Lindlof\n    - Olaoluwa Osuntokun\n    - Oliver Gugger\n    - Rjected\n    - Steven Kreuzer\n    - Torkel Rogstad\n    - Tristyn\n    - Victor Lavaud\n    - Vinayak Borkar\n    - Wilmer Paulino\n    - Yaacov Akiba Slama\n    - ebiiim\n    - ipriver\n    - wakiyamap\n    - yyforyongyu\n\nChanges in 0.21.0 (Thu Aug 27 2020)\n  - Network-related changes:\n    - Handle notfound messages from peers in netsync package (#1603)\n  - RPC changes:\n    - Add compatibility for getblock RPC changes in bitcoind 0.15.0 (#1529)\n    - Add new optional Params field to rpcclient.ConnConfig (#1467)\n    - Add new error code ErrRPCInWarmup in btcjson (#1541)\n    - Add compatibility for changes to getmempoolentry response in bitcoind\n      0.19.0 (#1524)\n    - Add rpcclient methods for estimatesmartfee and generatetoaddress\n      commands (#1500)\n    - Add rpcclient method for getblockstats command (#1500)\n    - Parse serialized transaction from createrawtransaction command using\n      both segwit, and legacy format (#1502)\n    - Support cookie-based authentication in rpcclient (#1460)\n    - Add rpcclient method for getchaintxstats command (#1571)\n    - Add rpcclient method for fundrawtransaction command (#1553)\n    - Add rpcclient method for getbalances command (#1595)\n    - Add new method rpcclient.GetTransactionWatchOnly (#1592)\n  - Crypto changes:\n    - Fix panic in fieldVal.SetByteSlice when called with large values, and\n      improve the method to be 35% faster (#1602)\n  - btcctl changes:\n    - Add -regtest mode to btcctl (#1556)\n  - Misc changes:\n    - Fix a bug due to a deadlock in connmgr's dynamic ban scoring (#1509)\n    - Add blockchain.NewUtxoEntry() to directly create entries for\n      UtxoViewpoint (#1588)\n    - Replace LRU cache implementation in peer package with a generic one\n      from decred/dcrd (#1599)\n  - Contributors (alphabetical order):\n    - Anirudha Bose\n    - Antonin Hildebrand\n    - Dan Cline\n    - Daniel McNally\n    - David Hill\n    - Federico Bond\n    - George Tankersley\n    - Henry\n    - Henry Harder\n    - Iskander Sharipov\n    - Ivan Kuznetsov\n    - Jake Sylvestre\n    - Javed Khan\n    - JeremyRand\n    - Jin\n    - John C. Vernaleo\n    - Kulpreet Singh\n    - Mikael Lindlof\n    - Murray Nesbitt\n    - Nisen\n    - Olaoluwa Osuntokun\n    - Oliver Gugger\n    - Steven Roose\n    - Torkel Rogstad\n    - Tyler Chambers\n    - Wilmer Paulino\n    - Yash Bhutwala\n    - adiabat\n    - jalavosus\n    - mohanson\n    - qqjettkgjzhxmwj\n    - qshuai\n    - shuai.qi\n    - tpkeeper\n\nChanges in v0.20.1 (Wed Nov 13 2019)\n  - RPC changes:\n    - Add compatibility for bitcoind v0.19.0 in rpcclient and btcjson\n      packages (#1484)\n  - Contributors (alphabetical order):\n    - Eugene Zeigel\n    - Olaoluwa Osuntokun\n    - Wilmer Paulino\n\nChanges in v0.20.0 (Tue Oct 15 2019)\n  - Significant changes made since 0.12.0. See git log or refer to release\n    notes on GitHub for full details.\n  - Contributors (alphabetical order):\n    - Albert Puigsech Galicia\n    - Alex Akselrod\n    - Alex Bosworth\n    - Alex Manuskin\n    - Alok Menghrajani\n    - Anatoli Babenia\n    - Andy Weidenbaum\n    - Calvin McAnarney\n    - Chris Martin\n    - Chris Pacia\n    - Chris Shepherd\n    - Conner Fromknecht\n    - Craig Sturdy\n    - Cédric Félizard\n    - Daniel Krawisz\n    - Daniel Martí\n    - Daniel McNally\n    - Dario Nieuwenhuis\n    - Dave Collins\n    - David Hill\n    - David de Kloet\n    - GeertJohan\n    - Grace Noah\n    - Gregory Trubetskoy\n    - Hector Jusforgues\n    - Iskander (Alex) Sharipov\n    - Janus Troelsen\n    - Jasper\n    - Javed Khan\n    - Jeremiah Goyette\n    - Jim Posen\n    - Jimmy Song\n    - Johan T. Halseth\n    - John C. Vernaleo\n    - Jonathan Gillham\n    - Josh Rickmar\n    - Jon Underwood\n    - Jonathan Zeppettini\n    - Jouke Hofman\n    - Julian Meyer\n    - Kai\n    - Kamil Slowikowski\n    - Kefkius\n    - Leonardo Lazzaro\n    - Marco Peereboom\n    - Marko Bencun\n    - Mawueli Kofi Adzoe\n    - Michail Kargakis\n    - Mitchell Paull\n    - Nathan Bass\n    - Nicola 'tekNico' Larosa\n    - Olaoluwa Osuntokun\n    - Pedro Martelletto\n    - Ricardo Velhote\n    - Roei Erez\n    - Ruben de Vries\n    - Rune T. Aune\n    - Sad Pencil\n    - Shuai Qi\n    - Steven Roose\n    - Tadge Dryja\n    - Tibor Bősze\n    - Tomás Senart\n    - Tzu-Jung Lee\n    - Vadym Popov\n    - Waldir Pimenta\n    - Wilmer Paulino\n    - benma\n    - danda\n    - dskloet\n    - esemplastic\n    - jadeblaquiere\n    - nakagawa\n    - preminem\n    - qshuai\n\nChanges in 0.12.0 (Fri Nov 20 2015)\n  - Protocol and network related changes:\n    - Add a new checkpoint at block height 382320 (#555)\n    - Implement BIP0065 which includes support for version 4 blocks, a new\n      consensus opcode (OP_CHECKLOCKTIMEVERIFY) that enforces transaction\n      lock times, and a double-threshold switchover mechanism (#535, #459,\n      #455)\n    - Implement BIP0111 which provides a new bloom filter service flag and\n      hence provides support for protocol version 70011 (#499)\n    - Add a new parameter --nopeerbloomfilters to allow disabling bloom\n      filter support (#499)\n    - Reject non-canonically encoded variable length integers (#507)\n    - Add mainnet peer discovery DNS seed (seed.bitcoin.jonasschnelli.ch)\n      (#496)\n    - Correct reconnect handling for persistent peers (#463, #464)\n    - Ignore requests for block headers if not fully synced (#444)\n    - Add CLI support for specifying the zone id on IPv6 addresses (#538)\n    - Fix a couple of issues where the initial block sync could stall (#518,\n      #229, #486)\n    - Fix an issue which prevented the --onion option from working as\n      intended (#446)\n  - Transaction relay (memory pool) changes:\n    - Require transactions to only include signatures encoded with the\n    canonical 'low-s' encoding (#512)\n    - Add a new parameter --minrelaytxfee to allow the minimum transaction\n      fee in BTC/kB to be overridden (#520)\n    - Retain memory pool transactions when they redeem another one that is\n      removed when a block is accepted (#539)\n    - Do not send reject messages for a transaction if it is valid but\n      causes an orphan transaction which depends on it to be determined\n      as invalid (#546)\n    - Refrain from attempting to add orphans to the memory pool multiple\n      times when the transaction they redeem is added (#551)\n    - Modify minimum transaction fee calculations to scale based on bytes\n      instead of full kilobyte boundaries (#521, #537)\n  - Implement signature cache:\n    - Provides a limited memory cache of validated signatures which is a\n      huge optimization when verifying blocks for transactions that are\n      already in the memory pool (#506)\n    - Add a new parameter '--sigcachemaxsize' which allows the size of the\n      new cache to be manually changed if desired (#506)\n  - Mining support changes:\n    - Notify getblocktemplate long polling clients when a block is pushed\n      via submitblock (#488)\n    - Speed up getblocktemplate by making use of the new signature cache\n      (#506)\n  - RPC changes:\n    - Implement getmempoolinfo command (#453)\n    - Implement getblockheader command (#461)\n    - Modify createrawtransaction command to accept a new optional parameter\n      'locktime' (#529)\n    - Modify listunspent result to include the 'spendable' field (#440)\n    - Modify getinfo command to include 'errors' field (#511)\n    - Add timestamps to blockconnected and blockdisconnected notifications\n      (#450)\n    - Several modifications to searchrawtranscations command:\n      - Accept a new optional parameter 'vinextra' which causes the results\n        to include information about the outputs referenced by a transaction's\n        inputs (#485, #487)\n      - Skip entries in the mempool too (#495)\n      - Accept a new optional parameter 'reverse' to return the results in\n        reverse order (most recent to oldest) (#497)\n      - Accept a new optional parameter 'filteraddrs' which causes the\n        results to only include inputs and outputs which involve the\n        provided addresses (#516)\n    - Change the notification order to notify clients about mined\n      transactions (recvtx, redeemingtx) before the blockconnected\n      notification (#449)\n    - Update verifymessage RPC to use the standard algorithm so it is\n      compatible with other implementations (#515)\n    - Improve ping statistics by pinging on an interval (#517)\n  - Websocket changes:\n    - Implement session command which returns a per-session unique id (#500,\n      #503)\n  - btcctl utility changes:\n    - Add getmempoolinfo command (#453)\n    - Add getblockheader command (#461)\n    - Add getwalletinfo command (#471)\n  - Notable developer-related package changes:\n    - Introduce a new peer package which acts a common base for creating and\n      concurrently managing bitcoin network peers (#445)\n    - Various cleanup of the new peer package (#528, #531, #524, #534,\n      #549)\n    - Blocks heights now consistently use int32 everywhere (#481)\n    - The BlockHeader type in the wire package now provides the BtcDecode\n      and BtcEncode methods (#467)\n    - Update wire package to recognize BIP0064 (getutxo) service bit (#489)\n    - Export LockTimeThreshold constant from txscript package (#454)\n    - Export MaxDataCarrierSize constant from txscript package (#466)\n    - Provide new IsUnspendable function from the txscript package (#478)\n    - Export variable length string functions from the wire package (#514)\n    - Export DNS Seeds for each network from the chaincfg package (#544)\n    - Preliminary work towards separating the memory pool into a separate\n      package (#525, #548)\n  - Misc changes:\n    - Various documentation updates (#442, #462, #465, #460, #470, #473,\n      #505, #530, #545)\n    - Add installation instructions for gentoo (#542)\n    - Ensure an error is shown if OS limits can't be set at startup (#498)\n    - Tighten the standardness checks for multisig scripts (#526)\n    - Test coverage improvement (#468, #494, #527, #543, #550)\n    - Several optimizations (#457, #474, #475, #476, #508, #509)\n    - Minor code cleanup and refactoring (#472, #479, #482, #519, #540)\n  - Contributors (alphabetical order):\n    - Ben Echols\n    - Bruno Clermont\n    - danda\n    - Daniel Krawisz\n    - Dario Nieuwenhuis\n    - Dave Collins\n    - David Hill\n    - Javed Khan\n    - Jonathan Gillham\n    - Joseph Becher\n    - Josh Rickmar\n    - Justus Ranvier\n    - Mawuli Adzoe\n    - Olaoluwa Osuntokun\n    - Rune T. Aune\n\nChanges in 0.11.1 (Wed May 27 2015)\n  - Protocol and network related changes:\n    - Use correct sub-command in reject message for rejected transactions\n      (#436, #437)\n    - Add a new parameter --torisolation which forces new circuits for each\n      connection when using tor (#430)\n  - Transaction relay (memory pool) changes:\n    - Reduce the default number max number of allowed orphan transactions\n      to 1000 (#419)\n    - Add a new parameter --maxorphantx which allows the maximum number of\n      orphan transactions stored in the mempool to be specified (#419)\n  - RPC changes:\n    - Modify listtransactions result to include the 'involveswatchonly' and\n      'vout' fields (#427)\n    - Update getrawtransaction result to omit the 'confirmations' field\n      when it is 0 (#420, #422)\n    - Update signrawtransaction result to include errors (#423)\n  - btcctl utility changes:\n    - Add gettxoutproof command (#428)\n    - Add verifytxoutproof command (#428)\n  - Notable developer-related package changes:\n    - The btcec package now provides the ability to perform ECDH\n      encryption and decryption (#375)\n    - The block and header validation in the blockchain package has been\n      split to help pave the way toward concurrent downloads (#386)\n  - Misc changes:\n    - Minor peer optimization (#433)\n  - Contributors (alphabetical order):\n    - Dave Collins\n    - David Hill\n    - Federico Bond\n    - Ishbir Singh\n    - Josh Rickmar\n\nChanges in 0.11.0 (Wed May 06 2015)\n  - Protocol and network related changes:\n    - **IMPORTANT: Update is required due to the following point**\n    - Correct a few corner cases in script handling which could result in\n      forking from the network on non-standard transactions (#425)\n    - Add a new checkpoint at block height 352940 (#418)\n    - Optimized script execution (#395, #400, #404, #409)\n    - Fix a case that could lead stalled syncs (#138, #296)\n  - Network address manager changes:\n    - Implement eclipse attack countermeasures as proposed in\n      http://cs-people.bu.edu/heilman/eclipse (#370, #373)\n  - Optional address indexing changes:\n    - Fix an issue where a reorg could cause an orderly shutdown when the\n      address index is active (#340, #357)\n  - Transaction relay (memory pool) changes:\n    - Increase maximum allowed space for nulldata transactions to 80 bytes\n      (#331)\n    - Implement support for the following rules specified by BIP0062:\n      - The S value in ECDSA signature must be at most half the curve order\n        (rule 5) (#349)\n      - Script execution must result in a single non-zero value on the stack\n        (rule 6) (#347)\n      - NOTE: All 7 rules of BIP0062 are now implemented\n    - Use network adjusted time in finalized transaction checks to improve\n      consistency across nodes (#332)\n    - Process orphan transactions on acceptance of new transactions (#345)\n  - RPC changes:\n    - Add support for a limited RPC user which is not allowed admin level\n      operations on the server (#363)\n    - Implement node command for more unified control over connected peers\n      (#79, #341)\n    - Implement generate command for regtest/simnet to support\n      deterministically mining a specified number of blocks (#362, #407)\n    - Update searchrawtransactions to return the matching transactions in\n      order (#354)\n    - Correct an issue with searchrawtransactions where it could return\n      duplicates (#346, #354)\n    - Increase precision of 'difficulty' field in getblock result to 8\n      (#414, #415)\n    - Omit 'nextblockhash' field from getblock result when it is empty\n      (#416, #417)\n    - Add 'id' and 'timeoffset' fields to getpeerinfo result (#335)\n  - Websocket changes:\n    - Implement new commands stopnotifyspent, stopnotifyreceived,\n      stopnotifyblocks, and stopnotifynewtransactions to allow clients to\n      cancel notification registrations (#122, #342)\n  - btcctl utility changes:\n    - A single dash can now be used as an argument to cause that argument to\n      be read from stdin (#348)\n    - Add generate command\n  - Notable developer-related package changes:\n    - The new version 2 btcjson package has now replaced the deprecated\n      version 1 package (#368)\n    - The btcec package now performs all signing using RFC6979 deterministic\n      signatures (#358, #360)\n    - The txscript package has been significantly cleaned up and had a few\n      API changes (#387, #388, #389, #390, #391, #392, #393, #395, #396,\n      #400, #403, #404, #405, #406, #408, #409, #410, #412)\n    - A new PkScriptLocs function has been added to the wire package MsgTx\n      type which provides callers that deal with scripts optimization\n      opportunities (#343)\n  - Misc changes:\n    - Minor wire hashing optimizations (#366, #367)\n    - Other minor internal optimizations\n  - Contributors (alphabetical order):\n    - Alex Akselrod\n    - Arne Brutschy\n    - Chris Jepson\n    - Daniel Krawisz\n    - Dave Collins\n    - David Hill\n    - Jimmy Song\n    - Jonas Nick\n    - Josh Rickmar\n    - Olaoluwa Osuntokun\n    - Oleg Andreev\n\nChanges in 0.10.0 (Sun Mar 01 2015)\n  - Protocol and network related changes:\n    - Add a new checkpoint at block height 343185\n    - Implement BIP066 which includes support for version 3 blocks, a new\n      consensus rule which prevents non-DER encoded signatures, and a\n      double-threshold switchover mechanism\n    - Rather than announcing all known addresses on getaddr requests which\n      can possibly result in multiple messages, randomize the results and\n      limit them to the max allowed by a single message (1000 addresses)\n    - Add more reserved IP spaces to the address manager\n  - Transaction relay (memory pool) changes:\n    - Make transactions which contain reserved opcodes nonstandard\n    - No longer accept or relay free and low-fee transactions that have\n      insufficient priority to be mined in the next block\n    - Implement support for the following rules specified by BIP0062:\n      - ECDSA signature must use strict DER encoding (rule 1)\n      - The signature script must only contain push operations (rule 2)\n      - All push operations must use the smallest possible encoding (rule 3)\n      - All stack values interpreted as a number must be encoding using the\n        shortest possible form (rule 4)\n      - NOTE: Rule 1 was already enforced, however the entire script now\n        evaluates to false rather than only the signature verification as\n        required by BIP0062\n    - Allow transactions with nulldata transaction outputs to be treated as\n      standard\n  - Mining support changes:\n    - Modify the getblocktemplate RPC to generate and return block templates\n      for version 3 blocks which are compatible with BIP0066\n    - Allow getblocktemplate to serve blocks when the current time is\n      less than the minimum allowed time for a generated block template\n      (https://github.com/btcsuite/btcd/issues/209)\n  - Crypto changes:\n    - Optimize scalar multiplication by the base point by using a\n      pre-computed table which results in approximately a 35% speedup\n     (https://github.com/btcsuite/btcec/issues/2)\n    - Optimize general scalar multiplication by using the secp256k1\n      endomorphism which results in approximately a 17-20% speedup\n     (https://github.com/btcsuite/btcec/issues/1)\n    - Optimize general scalar multiplication by using non-adjacent form\n      which results in approximately an additional 8% speedup\n     (https://github.com/btcsuite/btcec/issues/3)\n  - Implement optional address indexing:\n    - Add a new parameter --addrindex which will enable the creation of an\n      address index which can be queried to determine all transactions which\n      involve a given address\n      (https://github.com/btcsuite/btcd/issues/190)\n    - Add a new logging subsystem for address index related operations\n    - Support new searchrawtransactions RPC\n      (https://github.com/btcsuite/btcd/issues/185)\n  - RPC changes:\n    - Require TLS version 1.2 as the minimum version for all TLS connections\n    - Provide support for disabling TLS when only listening on localhost\n      (https://github.com/btcsuite/btcd/pull/192)\n    - Modify help output for all commands to provide much more consistent\n      and detailed information\n    - Correct case in getrawtransaction which would refuse to serve certain\n      transactions with invalid scripts\n      (https://github.com/btcsuite/btcd/issues/210)\n    - Correct error handling in the getrawtransaction RPC which could lead\n      to a crash in rare cases\n      (https://github.com/btcsuite/btcd/issues/196)\n    - Update getinfo RPC to include the appropriate 'timeoffset' calculated\n      from the median network time\n    - Modify listreceivedbyaddress result type to include txids field so it\n      is compatible\n    - Add 'iswatchonly' field to validateaddress result\n    - Add 'startingpriority' and 'currentpriority' fields to getrawmempool\n      (https://github.com/btcsuite/btcd/issues/178)\n    - Don't omit the 'confirmations' field from getrawtransaction when it is\n      zero\n  - Websocket changes:\n    - Modify the behavior of the rescan command to automatically register\n      for notifications about transactions paying to rescanned addresses\n      or spending outputs from the final rescan utxo set when the rescan\n      is through the best block in the chain\n  - btcctl utility changes:\n    - Make the list of commands available via the -l option rather than\n      dumping the entire list on usage errors\n    - Alphabetize and categorize the list of commands by chain and wallet\n    - Make the help option only show the help options instead of also\n      dumping all of the commands\n    - Make the usage syntax much more consistent and correct a few cases of\n      misnamed fields\n      (https://github.com/btcsuite/btcd/issues/305)\n    - Improve usage errors to show the specific parameter number, reason,\n      and error code\n    - Only show the usage for specific command is shown when a valid command\n      is provided with invalid parameters\n    - Add support for a SOCK5 proxy\n    - Modify output for integer fields (such as timestamps) to display\n      normally instead in scientific notation\n    - Add invalidateblock command\n    - Add reconsiderblock command\n    - Add createnewaccount command\n    - Add renameaccount command\n    - Add searchrawtransactions command\n    - Add importaddress command\n    - Add importpubkey command\n  - showblock utility changes:\n    - Remove utility in favor of the RPC getblock method\n  - Notable developer-related package changes:\n    - Many of the core packages have been relocated into the btcd repository\n      (https://github.com/btcsuite/btcd/issues/214)\n    - A new version of the btcjson package that has been completely\n      redesigned from the ground up based based upon how the project has\n      evolved and lessons learned while using it since it was first written\n      is now available in the btcjson/v2/btcjson directory\n      - This will ultimately replace the current version so anyone making\n        use of this package will need to update their code accordingly\n    - The btcec package now provides better facilities for working directly\n      with its public and private keys without having to mix elements from\n      the ecdsa package\n    - Update the script builder to ensure all rules specified by BIP0062 are\n      adhered to when creating scripts\n    - The blockchain package now provides a MedianTimeSource interface and\n      concrete implementation for providing time samples from remote peers\n      and using that data to calculate an offset against the local time\n  - Misc changes:\n    - Fix a slow memory leak due to tickers not being stopped\n      (https://github.com/btcsuite/btcd/issues/189)\n    - Fix an issue where a mix of orphans and SPV clients could trigger a\n      condition where peers would no longer be served\n      (https://github.com/btcsuite/btcd/issues/231)\n    - The RPC username and password can now contain symbols which previously\n      conflicted with special symbols used in URLs\n    - Improve handling of obtaining random nonces to prevent cases where it\n      could error when not enough entropy was available\n    - Improve handling of home directory creation errors such as in the case\n      of unmounted symlinks (https://github.com/btcsuite/btcd/issues/193)\n    - Improve the error reporting for rejected transactions to include the\n      inputs which are missing and/or being double spent\n    - Update sample config file with new options and correct a comment\n      regarding the fact the RPC server only listens on localhost by default\n      (https://github.com/btcsuite/btcd/issues/218)\n    - Update the continuous integration builds to run several tools which\n      help keep code quality high\n    - Significant amount of internal code cleanup and improvements\n    - Other minor internal optimizations\n  - Code Contributors (alphabetical order):\n    - Beldur\n    - Ben Holden-Crowther\n    - Dave Collins\n    - David Evans\n    - David Hill\n    - Guilherme Salgado\n    - Javed Khan\n    - Jimmy Song\n    - John C. Vernaleo\n    - Jonathan Gillham\n    - Josh Rickmar\n    - Michael Ford\n    - Michail Kargakis\n    - kac\n    - Olaoluwa Osuntokun\n\nChanges in 0.9.0 (Sat Sep 20 2014)\n  - Protocol and network related changes:\n    - Add a new checkpoint at block height 319400\n    - Add support for BIP0037 bloom filters\n      (https://github.com/conformal/btcd/issues/132)\n    - Implement BIP0061 reject handling and hence support for protocol\n      version 70002 (https://github.com/conformal/btcd/issues/133)\n    - Add testnet DNS seeds for peer discovery (testnet-seed.alexykot.me\n      and testnet-seed.bitcoin.schildbach.de)\n    - Add mainnet DNS seed for peer discovery (seeds.bitcoin.open-nodes.org)\n    - Make multisig transactions with non-null dummy data nonstandard\n      (https://github.com/conformal/btcd/issues/131)\n    - Make transactions with an excessive number of signature operations\n      nonstandard\n    - Perform initial DNS lookups concurrently which allows connections\n      more quickly\n    - Improve the address manager to significantly reduce memory usage and\n      add tests\n    - Remove orphan transactions when they appear in a mined block\n      (https://github.com/conformal/btcd/issues/166)\n    - Apply incremental back off on connection retries for persistent peers\n      that give invalid replies to mirror the logic used for failed\n      connections (https://github.com/conformal/btcd/issues/103)\n    - Correct rate-limiting of free and low-fee transactions\n  - Mining support changes:\n    - Implement getblocktemplate RPC with the following support:\n      (https://github.com/conformal/btcd/issues/124)\n      - BIP0022 Non-Optional Sections\n      - BIP0022 Long Polling\n      - BIP0023 Basic Pool Extensions\n      - BIP0023 Mutation coinbase/append\n      - BIP0023 Mutations time, time/increment, and time/decrement\n      - BIP0023 Mutation transactions/add\n      - BIP0023 Mutations prevblock, coinbase, and generation\n      - BIP0023 Block Proposals\n    - Implement built-in concurrent CPU miner\n      (https://github.com/conformal/btcd/issues/137)\n      NOTE: CPU mining on mainnet is pointless.  This has been provided\n      for testing purposes such as for the new simulation test network\n    - Add --generate flag to enable CPU mining\n    - Deprecate the --getworkkey flag in favor of --miningaddr which\n      specifies which addresses generated blocks will choose from to pay\n      the subsidy to\n  - RPC changes:\n    - Implement gettxout command\n      (https://github.com/conformal/btcd/issues/141)\n    - Implement validateaddress command\n    - Implement verifymessage command\n    - Mark getunconfirmedbalance RPC as wallet-only\n    - Mark getwalletinfo RPC as wallet-only\n    - Update getgenerate, setgenerate, gethashespersec, and getmininginfo\n      to return the appropriate information about new CPU mining status\n    - Modify getpeerinfo pingtime and pingwait field types to float64 so\n      they are compatible\n    - Improve disconnect handling for normal HTTP clients\n    - Make error code returns for invalid hex more consistent\n  - Websocket changes:\n    - Switch to a new more efficient websocket package\n      (https://github.com/conformal/btcd/issues/134)\n    - Add rescanfinished notification\n    - Modify the rescanprogress notification to include block hash as well\n      as height (https://github.com/conformal/btcd/issues/151)\n  - btcctl utility changes:\n    - Accept --simnet flag which automatically selects the appropriate port\n      and TLS certificates needed to communicate with btcd and btcwallet on\n      the simulation test network\n    - Fix createrawtransaction command to send amounts denominated in BTC\n    - Add estimatefee command\n    - Add estimatepriority command\n    - Add getmininginfo command\n    - Add getnetworkinfo command\n    - Add gettxout command\n    - Add lockunspent command\n    - Add signrawtransaction command\n  - addblock utility changes:\n    - Accept --simnet flag which automatically selects the appropriate port\n      and TLS certificates needed to communicate with btcd and btcwallet on\n      the simulation test network\n  - Notable developer-related package changes:\n    - Provide a new bloom package in btcutil which allows creating and\n      working with BIP0037 bloom filters\n    - Provide a new hdkeychain package in btcutil which allows working with\n      BIP0032 hierarchical deterministic key chains\n    - Introduce a new btcnet package which houses network parameters\n    - Provide new simnet network (--simnet) which is useful for private\n      simulation testing\n    - Enforce low S values in serialized signatures as detailed in BIP0062\n    - Return errors from all methods on the btcdb.Db interface\n      (https://github.com/conformal/btcdb/issues/5)\n    - Allow behavior flags to alter btcchain.ProcessBlock\n      (https://github.com/conformal/btcchain/issues/5)\n    - Provide a new SerializeSize API for blocks\n      (https://github.com/conformal/btcwire/issues/19)\n    - Several of the core packages now work with Google App Engine\n  - Misc changes:\n    - Correct an issue where the database could corrupt under certain\n      circumstances which would require a new chain download\n    - Slightly optimize deserialization\n    - Use the correct IP block for he.net\n    - Fix an issue where it was possible the block manager could hang on\n      shutdown\n    - Update sample config file so the comments are on a separate line\n      rather than the end of a line so they are not interpreted as settings\n      (https://github.com/conformal/btcd/issues/135)\n    - Correct an issue where getdata requests were not being properly\n      throttled which could lead to larger than necessary memory usage\n    - Always show help when given the help flag even when the config file\n      contains invalid entries\n    - General code cleanup and minor optimizations\n\nChanges in 0.8.0-beta (Sun May 25 2014)\n  - Btcd is now Beta (https://github.com/conformal/btcd/issues/130)\n  - Add a new checkpoint at block height 300255\n  - Protocol and network related changes:\n    - Lower the minimum transaction relay fee to 1000 satoshi to match\n      recent reference client changes\n      (https://github.com/conformal/btcd/issues/100)\n    - Raise the maximum signature script size to support standard 15-of-15\n      multi-signature pay-to-script-hash transactions with compressed pubkeys\n      to remain compatible with the reference client\n      (https://github.com/conformal/btcd/issues/128)\n    - Reduce max bytes allowed for a standard nulldata transaction to 40 for\n      compatibility with the reference client\n    - Introduce a new btcnet package which houses all of the network params\n      for each network (mainnet, testnet3, regtest) to ultimately enable\n      easier addition and tweaking of networks without needing to change\n      several packages\n    - Fix several script discrepancies found by reference client test data\n    - Add new DNS seed for peer discovery (seed.bitnodes.io)\n    - Reduce the max known inventory cache from 20000 items to 1000 items\n    - Fix an issue where unknown inventory types could lead to a hung peer\n    - Implement inventory rebroadcast handler for sendrawtransaction\n      (https://github.com/conformal/btcd/issues/99)\n    - Update user agent to fully support BIP0014\n      (https://github.com/conformal/btcwire/issues/10)\n  - Implement initial mining support:\n    - Add a new logging subsystem for mining related operations\n    - Implement infrastructure for creating block templates\n    - Provide options to control block template creation settings\n    - Support the getwork RPC\n    - Allow address identifiers to apply to more than one network since both\n      testnet3 and the regression test network unfortunately use the same\n      identifier\n  - RPC changes:\n    - Set the content type for HTTP POST RPC connections to application/json\n      (https://github.com/conformal/btcd/issues/121)\n    - Modified the RPC server startup so it only requires at least one valid\n      listen interface\n    - Correct an error path where it was possible certain errors would not\n      be returned\n    - Implement getwork command\n      (https://github.com/conformal/btcd/issues/125)\n    - Update sendrawtransaction command to reject orphans\n    - Update sendrawtransaction command to include the reason a transaction\n      was rejected\n    - Update getinfo command to populate connection count field\n    - Update getinfo command to include relay fee field\n      (https://github.com/conformal/btcd/issues/107)\n    - Allow transactions submitted with sendrawtransaction to bypass the\n      rate limiter\n    - Allow the getcurrentnet and getbestblock extensions to be accessed via\n      HTTP POST in addition to Websockets\n      (https://github.com/conformal/btcd/issues/127)\n  - Websocket changes:\n    - Rework notifications to ensure they are delivered in the order they\n      occur\n    - Rename notifynewtxs command to notifyreceived (funds received)\n    - Rename notifyallnewtxs command to notifynewtransactions\n    - Rename alltx notification to txaccepted\n    - Rename allverbosetx notification to txacceptedverbose\n      (https://github.com/conformal/btcd/issues/98)\n    - Add rescan progress notification\n    - Add recvtx notification\n    - Add redeemingtx notification\n    - Modify notifyspent command to accept an array of outpoints\n      (https://github.com/conformal/btcd/issues/123)\n    - Significantly optimize the rescan command to yield up to a 60x speed\n      increase\n  - btcctl utility changes:\n    - Add createencryptedwallet command\n    - Add getblockchaininfo command\n    - Add importwallet command\n    - Add addmultisigaddress command\n    - Add setgenerate command\n    - Accept --testnet and --wallet flags which automatically select\n      the appropriate port and TLS certificates needed to communicate\n      with btcd and btcwallet (https://github.com/conformal/btcd/issues/112)\n    - Allow path expansion from config file entries\n      (https://github.com/conformal/btcd/issues/113)\n    - Minor refactor simplify handling of options\n  - addblock utility changes:\n    - Improve logging by making it consistent with the logging provided by\n      btcd (https://github.com/conformal/btcd/issues/90)\n  - Improve several package APIs for developers:\n    - Add new amount type for consistently handling monetary values\n    - Add new coin selector API\n    - Add new WIF (Wallet Import Format) API\n    - Add new crypto types for private keys and signatures\n    - Add new API to sign transactions including script merging and hash\n      types\n    - Expose function to extract all pushed data from a script\n      (https://github.com/conformal/btcscript/issues/8)\n  - Misc changes:\n    - Optimize address manager shuffling to do 67% less work on average\n    - Resolve a couple of benign data races found by the race detector\n      (https://github.com/conformal/btcd/issues/101)\n    - Add IP address to all peer related errors to clarify which peer is the\n      cause (https://github.com/conformal/btcd/issues/102)\n    - Fix a UPNP case issue that prevented the --upnp option from working\n      with some UPNP servers\n    - Update documentation in the sample config file regarding debug levels\n    - Adjust some logging levels to improve debug messages\n    - Improve the throughput of query messages to the block manager\n    - Several minor optimizations to reduce GC churn and enhance speed\n    - Other minor refactoring\n    - General code cleanup\n\nChanges in 0.7.0 (Thu Feb 20 2014)\n  - Fix an issue when parsing scripts which contain a multi-signature script\n    which require zero signatures such as testnet block\n    000000001881dccfeda317393c261f76d09e399e15e27d280e5368420f442632\n    (https://github.com/conformal/btcscript/issues/7)\n  - Add check to ensure all transactions accepted to mempool only contain\n    canonical data pushes (https://github.com/conformal/btcscript/issues/6)\n  - Fix an issue causing excessive memory consumption\n  - Significantly rework and improve the websocket notification system:\n    - Each client is now independent so slow clients no longer limit the\n      speed of other connected clients\n    - Potentially long-running operations such as rescans are now run in\n      their own handler and rate-limited to one operation at a time without\n      preventing simultaneous requests from the same client for the faster\n      requests or notifications\n    - A couple of scenarios which could cause shutdown to hang have been\n      resolved\n    - Update notifynewtx notifications to support all address types instead\n      of only pay-to-pubkey-hash\n    - Provide a --rpcmaxwebsockets option to allow limiting the number of\n      concurrent websocket clients\n    - Add a new websocket command notifyallnewtxs to request notifications\n      (https://github.com/conformal/btcd/issues/86) (thanks @flammit)\n  - Improve btcctl utility in the following ways:\n    - Add getnetworkhashps command\n    - Add gettransaction command (wallet-specific)\n    - Add signmessage command (wallet-specific)\n    - Update getwork command to accept\n  - Continue cleanup and work on implementing the RPC API:\n    - Implement getnettotals command\n      (https://github.com/conformal/btcd/issues/84)\n    - Implement networkhashps command\n      (https://github.com/conformal/btcd/issues/87)\n    - Update getpeerinfo to always include syncnode field even when false\n    - Remove help addenda for getpeerinfo now that it supports all fields\n  - Close standard RPC connections on auth failure\n  - Provide a --rpcmaxclients option to allow limiting the number of\n    concurrent RPC clients (https://github.com/conformal/btcd/issues/68)\n  - Include IP address in RPC auth failure log messages\n  - Resolve a rather harmless data races found by the race detector\n    (https://github.com/conformal/btcd/issues/94)\n  - Increase block priority size and max standard transaction size to 50k\n    and 100k, respectively (https://github.com/conformal/btcd/issues/71)\n  - Add rate limiting of free transactions to the memory pool to prevent\n    penny flooding (https://github.com/conformal/btcd/issues/40)\n  - Provide a --logdir option (https://github.com/conformal/btcd/issues/95)\n  - Change the default log file path to include the network\n  - Add a new ScriptBuilder interface to btcscript to support creation of\n    custom scripts (https://github.com/conformal/btcscript/issues/5)\n  - General code cleanup\n\nChanges in 0.6.0 (Tue Feb 04 2014)\n  - Fix an issue when parsing scripts which contain invalid signatures that\n    caused a chain fork on block\n    0000000000000001e4241fd0b3469a713f41c5682605451c05d3033288fb2244\n  - Correct an issue which could lead to an error in removeBlockNode\n    (https://github.com/conformal/btcchain/issues/4)\n  - Improve addblock utility as follows:\n    - Check imported blocks against all chain rules and checkpoints\n    - Skip blocks which are already known so you can stop and restart the\n      import or start the import after you have already downloaded a portion\n      of the chain\n    - Correct an issue where the utility did not shutdown cleanly after\n      processing all blocks\n    - Add error on attempt to import orphan blocks\n    - Improve error handling and reporting\n    - Display statistics after input file has been fully processed\n  - Rework, optimize, and improve headers-first mode:\n    - Resuming the chain sync from any point before the final checkpoint\n      will now use headers-first mode\n      (https://github.com/conformal/btcd/issues/69)\n    - Verify all checkpoints as opposed to only the final one\n    - Reduce and bound memory usage\n    - Rollback to the last known good point when a header does not match a\n      checkpoint\n    - Log information about what is happening with headers\n  - Improve btcctl utility in the following ways:\n    - Add getaddednodeinfo command\n    - Add getnettotals command\n    - Add getblocktemplate command (wallet-specific)\n    - Add getwork command (wallet-specific)\n    - Add getnewaddress command (wallet-specific)\n    - Add walletpassphrasechange command (wallet-specific)\n    - Add walletlock command (wallet-specific)\n    - Add sendfrom command (wallet-specific)\n    - Add sendmany command (wallet-specific)\n    - Add settxfee command (wallet-specific)\n    - Add listsinceblock command (wallet-specific)\n    - Add listaccounts command (wallet-specific)\n    - Add keypoolrefill command (wallet-specific)\n    - Add getreceivedbyaccount command (wallet-specific)\n    - Add getrawchangeaddress command (wallet-specific)\n    - Add gettxoutsetinfo command (wallet-specific)\n    - Add listaddressgroupings command (wallet-specific)\n    - Add listlockunspent command (wallet-specific)\n    - Add listlock command (wallet-specific)\n    - Add listreceivedbyaccount command (wallet-specific)\n    - Add validateaddress command (wallet-specific)\n    - Add verifymessage command (wallet-specific)\n    - Add sendtoaddress command (wallet-specific)\n  - Continue cleanup and work on implementing the RPC API:\n    - Implement submitblock command\n      (https://github.com/conformal/btcd/issues/61)\n    - Implement help command\n    - Implement ping command\n    - Implement getaddednodeinfo command\n      (https://github.com/conformal/btcd/issues/78)\n    - Implement getinfo command\n    - Update getpeerinfo to support bytesrecv and bytessent\n      (https://github.com/conformal/btcd/issues/83)\n  - Improve and correct several RPC server and websocket areas:\n    - Change the connection endpoint for websockets from /wallet to /ws\n      (https://github.com/conformal/btcd/issues/80)\n    - Implement an alternative authentication for websockets so clients\n      such as javascript from browsers that don't support setting HTTP\n      headers can authenticate (https://github.com/conformal/btcd/issues/77)\n    - Add an authentication deadline for RPC connections\n      (https://github.com/conformal/btcd/issues/68)\n    - Use standard authentication failure responses for RPC connections\n    - Make automatically generated certificate more standard so it works\n      from client such as node.js and Firefox\n    - Correct some minor issues which could prevent the RPC server from\n      shutting down in an orderly fashion\n    - Make all websocket notifications require registration\n    - Change the data sent over websockets to text since it is JSON-RPC\n    - Allow connections that do not have an Origin header set\n  - Expose and track the number of bytes read and written per peer\n    (https://github.com/conformal/btcwire/issues/6)\n  - Correct an issue with sendrawtransaction when invoked via websockets\n    which prevented a minedtx notification from being added\n  - Rescan operations issued from remote wallets are no stopped when\n    the wallet disconnects mid-operation\n    (https://github.com/conformal/btcd/issues/66)\n  - Several optimizations related to fetching block information from the\n    database\n  - General code cleanup\n\nChanges in 0.5.0 (Mon Jan 13 2014)\n  - Optimize initial block download by introducing a new mode which\n    downloads the block headers first (up to the final checkpoint)\n  - Improve peer handling to remove the potential for slow peers to cause\n    sluggishness amongst all peers\n    (https://github.com/conformal/btcd/issues/63)\n  - Fix an issue where the initial block sync could stall when the sync peer\n    disconnects (https://github.com/conformal/btcd/issues/62)\n  - Correct an issue where --externalip was doing a DNS lookup on the full\n    host:port instead of just the host portion\n    (https://github.com/conformal/btcd/issues/38)\n  - Fix an issue which could lead to a panic on chain switches\n    (https://github.com/conformal/btcd/issues/70)\n  - Improve btcctl utility in the following ways:\n    - Show getdifficulty output as floating point to 6 digits of precision\n    - Show all JSON object replies formatted as standard JSON\n    - Allow btcctl getblock to accept optional params\n    - Add getaccount command (wallet-specific)\n    - Add getaccountaddress command (wallet-specific)\n    - Add sendrawtransaction command\n  - Continue cleanup and work on implementing RPC API calls\n    - Update getrawmempool to support new optional verbose flag\n    - Update getrawtransaction to match the reference client\n    - Update getblock to support new optional verbose flag\n    - Update raw transactions to fully match the reference client including\n      support for all transaction types and address types\n    - Correct getrawmempool fee field to return BTC instead of Satoshi\n    - Correct getpeerinfo service flag to return 8 digit string so it\n      matches the reference client\n    - Correct verifychain to return a boolean\n    - Implement decoderawtransaction command\n    - Implement createrawtransaction command\n    - Implement decodescript command\n    - Implement gethashespersec command\n    - Allow RPC handler overrides when invoked via a websocket versus\n      legacy connection\n  - Add new DNS seed for peer discovery\n  - Display user agent on new valid peer log message\n    (https://github.com/conformal/btcd/issues/64)\n  - Notify wallet when new transactions that pay to registered addresses\n    show up in the mempool before being mined into a block\n  - Support a tor-specific proxy in addition to a normal proxy\n    (https://github.com/conformal/btcd/issues/47)\n  - Remove deprecated sqlite3 imports from utilities\n  - Remove leftover profile write from addblock utility\n  - Quite a bit of code cleanup and refactoring to improve maintainability\n\nChanges in 0.4.0 (Thu Dec 12 2013)\n  - Allow listen interfaces to be specified via --listen instead of only the\n    port (https://github.com/conformal/btcd/issues/33)\n  - Allow listen interfaces for the RPC server to be specified via\n    --rpclisten instead of only the port\n    (https://github.com/conformal/btcd/issues/34)\n  - Only disable listening when --connect or --proxy are used when no\n    --listen interface are specified\n    (https://github.com/conformal/btcd/issues/10)\n  - Add several new standard transaction checks to transaction memory pool:\n    - Support nulldata scripts as standard\n    - Only allow a max of one nulldata output per transaction\n    - Enforce a maximum of 3 public keys in multi-signature transactions\n    - The number of signatures in multi-signature transactions must not\n      exceed the number of public keys\n    - The number of inputs to a signature script must match the expected\n      number of inputs for the script type\n    - The number of inputs pushed onto the stack by a redeeming signature\n      script must match the number of inputs consumed by the referenced\n      public key script\n  - When a block is connected, remove any transactions from the memory pool\n    which are now double spends as a result of the newly connected\n    transactions\n  - Don't relay transactions resurrected during a chain switch since\n    other peers will also be switching chains and therefore already know\n    about them\n  - Cleanup a few cases where rejected transactions showed as an error\n    rather than as a rejected transaction\n  - Ignore the default configuration file when --regtest (regression test\n    mode) is specified\n  - Implement TLS support for RPC including automatic certificate generation\n  - Support HTTP authentication headers for web sockets\n  - Update address manager to recognize and properly work with Tor\n    addresses (https://github.com/conformal/btcd/issues/36) and\n    (https://github.com/conformal/btcd/issues/37)\n  - Improve btcctl utility in the following ways:\n    - Add the ability to specify a configuration file\n    - Add a default entry for the RPC cert to point to the location\n      it will likely be in the btcd home directory\n    - Implement --version flag\n    - Provide a --notls option to support non-TLS configurations\n  - Fix a couple of minor races found by the Go race detector\n  - Improve logging\n    - Allow logging level to be specified on a per subsystem basis\n      (https://github.com/conformal/btcd/issues/48)\n    - Allow logging levels to be dynamically changed via RPC\n      (https://github.com/conformal/btcd/issues/15)\n    - Implement a rolling log file with a max of 10MB per file and a\n      rotation size of 3 which results in a max logging size of 30 MB\n  - Correct a minor issue with the rescanning websocket call\n    (https://github.com/conformal/btcd/issues/54)\n  - Fix a race with pushing address messages that could lead to a panic\n    (https://github.com/conformal/btcd/issues/58)\n  - Improve which external IP address is reported to peers based on which\n    interface they are connected through\n    (https://github.com/conformal/btcd/issues/35)\n  - Add --externalip option to allow an external IP address to be specified\n    for cases such as tor hidden services or advanced network configurations\n    (https://github.com/conformal/btcd/issues/38)\n  - Add --upnp option to support automatic port mapping via UPnP\n    (https://github.com/conformal/btcd/issues/51)\n  - Update Ctrl+C interrupt handler to properly sync address manager and\n    remove the UPnP port mapping (if needed)\n  - Continue cleanup and work on implementing RPC API calls\n    - Add importprivkey (import private key) command to btcctl\n    - Update getrawtransaction to provide addresses properly, support\n      new verbose param, and match the reference implementation with the\n      exception of MULTISIG (thanks @flammit)\n    - Update getblock with new verbose flag (thanks @flammit)\n    - Add listtransactions command to btcctl\n    - Add getbalance command to btcctl\n  - Add basic support for btcd to run as a native Windows service\n    (https://github.com/conformal/btcd/issues/42)\n  - Package addblock utility with Windows MSIs\n  - Add support for TravisCI (continuous build integration)\n  - Cleanup some documentation and usage\n  - Several other minor bug fixes and general code cleanup\n\nChanges in 0.3.3 (Wed Nov 13 2013)\n  - Significantly improve initial block chain download speed\n    (https://github.com/conformal/btcd/issues/20)\n  - Add a new checkpoint at block height 267300\n  - Optimize most recently used inventory handling\n    (https://github.com/conformal/btcd/issues/21)\n  - Optimize duplicate transaction input check\n    (https://github.com/conformal/btcchain/issues/2)\n  - Optimize transaction hashing\n    (https://github.com/conformal/btcd/issues/25)\n  - Rework and optimize wallet listener notifications\n    (https://github.com/conformal/btcd/issues/22)\n  - Optimize serialization and deserialization\n    (https://github.com/conformal/btcd/issues/27)\n  - Add support for minimum transaction fee to memory pool acceptance\n    (https://github.com/conformal/btcd/issues/29)\n  - Improve leveldb database performance by removing explicit GC call\n  - Fix an issue where Ctrl+C was not always finishing orderly database\n    shutdown\n  - Fix an issue in the script handling for OP_CHECKSIG\n  - Impose max limits on all variable length protocol entries to prevent\n    abuse from malicious peers\n  - Enforce DER signatures for transactions allowed into the memory pool\n  - Separate the debug profile http server from the RPC server\n  - Rework of the RPC code to improve performance and make the code cleaner\n  - The getrawtransaction RPC call now properly checks the memory pool\n    before consulting the db (https://github.com/conformal/btcd/issues/26)\n  - Add support for the following RPC calls: getpeerinfo, getconnectedcount,\n    addnode, verifychain\n    (https://github.com/conformal/btcd/issues/13)\n    (https://github.com/conformal/btcd/issues/17)\n  - Implement rescan websocket extension to allow wallet rescans\n  - Use correct paths for application data storage for all supported\n    operating systems (https://github.com/conformal/btcd/issues/30)\n  - Add a default redirect to the http profiling page when accessing the\n    http profile server\n  - Add a new --cpuprofile option which can be used to generate CPU\n    profiling data on platforms that support it\n  - Several other minor performance optimizations\n  - Other minor bug fixes and general code cleanup\n\nChanges in 0.3.2 (Tue Oct 22 2013)\n  - Fix an issue that could cause the download of the block chain to stall\n    (https://github.com/conformal/btcd/issues/12)\n  - Remove deprecated sqlite as an available database backend\n  - Close sqlite compile issue as sqlite has now been removed\n    (https://github.com/conformal/btcd/issues/11)\n  - Change default RPC ports to 8334 (mainnet) and 18334 (testnet)\n  - Continue cleanup and work on implementing RPC API calls\n  - Add support for the following RPC calls: getrawmempool,\n    getbestblockhash, decoderawtransaction, getdifficulty,\n    getconnectioncount, getpeerinfo, and addnode\n  - Improve the btcctl utility that is used to issue JSON-RPC commands\n  - Fix an issue preventing btcd from cleanly shutting down with the RPC\n    stop command\n  - Add a number of database interface tests to ensure backends implement\n    the expected interface\n  - Expose some additional information from btcscript to be used for\n    identifying \"standard\"\" transactions\n  - Add support for plan9 - thanks @mischief\n    (https://github.com/conformal/btcd/pull/19)\n  - Other minor bug fixes and general code cleanup\n\nChanges in 0.3.1-alpha (Tue Oct 15 2013)\n  - Change default database to leveldb\n    NOTE: This does mean you will have to redownload the block chain.  Since we\n    are still in alpha, we didn't feel writing a converter was worth the time as\n    it would take away from more important issues at this stage\n  - Add a warning if there are multiple block chain databases of different types\n  - Fix issue with unexpected EOF in leveldb -- https://github.com/conformal/btcd/issues/18\n  - Fix issue preventing block 21066 on testnet -- https://github.com/conformal/btcchain/issues/1\n  - Fix issue preventing block 96464 on testnet -- https://github.com/conformal/btcscript/issues/1\n  - Optimize transaction lookups\n  - Correct a few cases of list removal that could result in improper cleanup\n    of no longer needed orphans\n  - Add functionality to increase ulimits on non-Windows platforms\n  - Add support for mempool command which allows remote peers to query the\n    transaction memory pool via the bitcoin protocol\n  - Clean up logging a bit\n  - Add a flag to disable checkpoints for developers\n  - Add a lot of useful debug logging such as message summaries\n  - Other minor bug fixes and general code cleanup\n\nInitial Release 0.3.0-alpha (Sat Oct 05 2013):\n  - Initial release\n"
  },
  {
    "path": "Dockerfile",
    "content": "# This Dockerfile builds btcd from source and creates a small (55 MB) docker container based on alpine linux.\n#\n# Clone this repository and run the following command to build and tag a fresh btcd amd64 container:\n#\n# docker build . -t yourregistry/btcd\n#\n# You can use the following command to build an arm64v8 container:\n#\n# docker build . -t yourregistry/btcd --build-arg ARCH=arm64v8\n#\n# For more information how to use this docker image visit:\n# https://github.com/btcsuite/btcd/tree/master/docs\n#\n# 8333  Mainnet Bitcoin peer-to-peer port\n# 8334  Mainet RPC port\n\nARG ARCH=amd64\n# using the SHA256 instead of tags\n# https://github.com/opencontainers/image-spec/blob/main/descriptor.md#digests\n# https://cloud.google.com/architecture/using-container-images\n# https://github.com/google/go-containerregistry/blob/main/cmd/crane/README.md\n# ➜  ~ crane digest golang:1.23.12-alpine3.21\n# sha256:4bb4be21ac98da06bc26437ee870c4973f8039f13e9a1a36971b4517632b0fc6\nFROM golang@sha256:4bb4be21ac98da06bc26437ee870c4973f8039f13e9a1a36971b4517632b0fc6 AS build-container\n\nARG ARCH\n\nADD . /app\nWORKDIR /app\nRUN set -ex \\\n  && if [ \"${ARCH}\" = \"amd64\" ]; then export GOARCH=amd64; fi \\\n  && if [ \"${ARCH}\" = \"arm32v7\" ]; then export GOARCH=arm; fi \\\n  && if [ \"${ARCH}\" = \"arm64v8\" ]; then export GOARCH=arm64; fi \\\n  && echo \"Compiling for $GOARCH\" \\\n  && go install -v . ./cmd/...\n\nFROM $ARCH/alpine:3.21\n\nCOPY --from=build-container /go/bin /bin\n\nVOLUME [\"/root/.btcd\"]\n\nEXPOSE 8333 8334\n\nENTRYPOINT [\"btcd\"]\n"
  },
  {
    "path": "LICENSE",
    "content": "ISC License\n\nCopyright (c) 2013-2025 The btcsuite developers\nCopyright (c) 2015-2016 The Decred developers\n\nPermission to use, copy, modify, and distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "PKG := github.com/btcsuite/btcd\n\nLINT_PKG := github.com/golangci/golangci-lint/v2/cmd/golangci-lint\nGOIMPORTS_PKG := golang.org/x/tools/cmd/goimports\n\nGO_BIN := ${shell go env GOBIN}\n\n# If GOBIN is not set, default to GOPATH/bin.\nifeq ($(GO_BIN),)\nGO_BIN := $(shell go env GOPATH)/bin\nendif\n\nLINT_BIN := $(GO_BIN)/golangci-lint\nGOIMPORTS_BIN := $(GO_BIN)/goimports\n\nLINT_COMMIT := v2.1.6\nGOIMPORTS_COMMIT := a24facf9e5586c95743d2f4ad15d148c7a8cf00b\n\nGOBUILD := go build -v\nGOINSTALL := go install -v \nDEV_TAGS := rpctest\nGOTEST_DEV = go test -v -tags=$(DEV_TAGS)\nGOTEST := go test -v\nCOVER_FLAGS = -coverprofile=coverage.txt -covermode=atomic -coverpkg=$(PKG)/...\n\n# Linting uses a lot of memory, so keep it under control by limiting the number\n# of workers if requested.\nifneq ($(workers),)\nLINT_WORKERS = --concurrency=$(workers)\nendif\nLINT_TIMEOUT := 5m\n\nLINT = $(LINT_BIN) run -v $(LINT_WORKERS) --timeout=$(LINT_TIMEOUT)\n\nGREEN := \"\\\\033[0;32m\"\nNC := \"\\\\033[0m\"\ndefine print\n\techo $(GREEN)$1$(NC)\nendef\n\n#? default: Run `make build`\ndefault: build\n\n#? all: Run `make build` and `make check`\nall: build check\n\n# ============\n# DEPENDENCIES\n# ============\n\n$(LINT_BIN):\n\t@$(call print, \"Fetching linter\")\n\t$(GOINSTALL) $(LINT_PKG)@$(LINT_COMMIT)\n\n#? goimports: Install goimports\ngoimports:\n\t@$(call print, \"Installing goimports.\")\n\t$(GOINSTALL) $(GOIMPORTS_PKG)@$(GOIMPORTS_COMMIT)\n\n# ============\n# INSTALLATION\n# ============\n\n#? build: Build all binaries, place them in project directory\nbuild:\n\t@$(call print, \"Building all binaries\")\n\t$(GOBUILD) $(PKG)\n\t$(GOBUILD) $(PKG)/cmd/btcctl\n\t$(GOBUILD) $(PKG)/cmd/gencerts\n\t$(GOBUILD) $(PKG)/cmd/findcheckpoint\n\t$(GOBUILD) $(PKG)/cmd/addblock\n\n#? install: Install all binaries, place them in $GOPATH/bin\ninstall:\n\t@$(call print, \"Installing all binaries\")\n\t$(GOINSTALL) $(PKG)\n\t$(GOINSTALL) $(PKG)/cmd/btcctl\n\t$(GOINSTALL) $(PKG)/cmd/gencerts\n\t$(GOINSTALL) $(PKG)/cmd/findcheckpoint\n\t$(GOINSTALL) $(PKG)/cmd/addblock\n\n#? release-install: Install btcd and btcctl release binaries, place them in $GOBIN\nrelease-install:\n\t@$(call print, \"Installing btcd and btcctl release binaries\")\n\tenv CGO_ENABLED=0 $(GOINSTALL) -trimpath -ldflags=\"-s -w -buildid=\" $(PKG)\n\tenv CGO_ENABLED=0 $(GOINSTALL) -trimpath -ldflags=\"-s -w -buildid=\" $(PKG)/cmd/btcctl\n\n# =======\n# TESTING\n# =======\n\n#? check: Run `make unit`\ncheck: unit\n\n#? unit: Run unit tests\nunit:\n\t@$(call print, \"Running unit tests.\")\n\t$(GOTEST_DEV) ./... -test.timeout=20m\n\tcd btcec && $(GOTEST_DEV) ./... -test.timeout=20m\n\tcd btcutil && $(GOTEST_DEV) ./... -test.timeout=20m\n\tcd btcutil/psbt && $(GOTEST_DEV) ./... -test.timeout=20m\n\n#? unit-cover: Run unit coverage tests\nunit-cover:\n\t@$(call print, \"Running unit coverage tests.\")\n\t$(GOTEST) $(COVER_FLAGS) ./...\n\n\t# We need to remove the /v2 pathing from the module to have it work\n\t# nicely with the CI tool we use to render live code coverage.\n\tcd btcec && $(GOTEST) $(COVER_FLAGS) ./... && sed -i.bak 's/v2\\///g' coverage.txt\n\tcd btcutil && $(GOTEST) $(COVER_FLAGS) ./...\n\tcd btcutil/psbt && $(GOTEST) $(COVER_FLAGS) ./...\n\n#? unit-race: Run unit race tests\nunit-race:\n\t@$(call print, \"Running unit race tests.\")\n\tenv CGO_ENABLED=1 GORACE=\"history_size=7 halt_on_errors=1\" $(GOTEST) -race -test.timeout=20m ./...\n\tcd btcec && env CGO_ENABLED=1 GORACE=\"history_size=7 halt_on_errors=1\" $(GOTEST) -race -test.timeout=20m ./...\n\tcd btcutil && env CGO_ENABLED=1 GORACE=\"history_size=7 halt_on_errors=1\" $(GOTEST) -race -test.timeout=20m ./...\n\tcd btcutil/psbt && env CGO_ENABLED=1 GORACE=\"history_size=7 halt_on_errors=1\" $(GOTEST) -race -test.timeout=20m ./...\n\n# =========\n# UTILITIES\n# =========\n\n#? fmt: Fix imports and formatting source\nfmt: goimports\n\t@$(call print, \"Fixing imports.\")\n\t$(GOIMPORTS_BIN) -w .\n\t@$(call print, \"Formatting source.\")\n\tgofmt -l -w -s .\n\n#? lint: Lint source\nlint: $(LINT_BIN)\n\t@$(call print, \"Linting source.\")\n\t$(LINT)\n\n#? clean: Clean source\nclean:\n\t@$(call print, \"Cleaning source.$(NC)\")\n\trm -f coverage.txt btcec/coverage.txt btcutil/coverage.txt btcutil/psbt/coverage.txt\n\n#? tidy-module: Run 'go mod tidy' for all modules\ntidy-module:\n\techo \"Running 'go mod tidy' for all modules\"\n\tscripts/tidy_modules.sh\n\n.PHONY: all \\\n\tdefault \\\n\tbuild \\\n\tcheck \\\n\tunit \\\n\tunit-cover \\\n\tunit-race \\\n\tfmt \\\n\tlint \\\n\tclean \\\n\ttidy-module\n\n#? help: Get more info on make commands\nhelp: Makefile\n\t@echo \" Choose a command run in btcd:\"\n\t@sed -n 's/^#?//p' $< | column -t -s ':' |  sort | sed -e 's/^/ /'\n\n.PHONY: help"
  },
  {
    "path": "README.md",
    "content": "btcd\n====\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![Coverage Status](https://coveralls.io/repos/github/btcsuite/btcd/badge.svg?branch=master)](https://coveralls.io/github/btcsuite/btcd?branch=master)\n[![ISC License](https://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd)\n\nbtcd is an alternative full node bitcoin implementation written in Go (golang).\n\nThis project is currently under active development and is in a Beta state.  It\nis extremely stable and has been in production use since October 2013.\n\nIt properly downloads, validates, and serves the block chain using the exact\nrules (including consensus bugs) for block acceptance as Bitcoin Core.  We have\ntaken great care to avoid btcd causing a fork to the block chain.  It includes a\nfull block validation testing framework which contains all of the 'official'\nblock acceptance tests (and some additional ones) that is run on every pull\nrequest to help ensure it properly follows consensus.  Also, it passes all of\nthe JSON test data in the Bitcoin Core code.\n\nIt also properly relays newly mined blocks, maintains a transaction pool, and\nrelays individual transactions that have not yet made it into a block.  It\nensures all individual transactions admitted to the pool follow the rules\nrequired by the block chain and also includes more strict checks which filter\ntransactions based on miner requirements (\"standard\" transactions).\n\nOne key difference between btcd and Bitcoin Core is that btcd does *NOT* include\nwallet functionality and this was a very intentional design decision.  See the\nblog entry [here](https://web.archive.org/web/20171125143919/https://blog.conformal.com/btcd-not-your-moms-bitcoin-daemon)\nfor more details.  This means you can't actually make or receive payments\ndirectly with btcd.  That functionality is provided by the\n[btcwallet](https://github.com/btcsuite/btcwallet) and\n[Paymetheus](https://github.com/btcsuite/Paymetheus) (Windows-only) projects\nwhich are both under active development.\n\n## Requirements\n\n[Go](http://golang.org) 1.22 or newer.\n\n## Installation\n\nhttps://github.com/btcsuite/btcd/releases\n\n#### Linux/BSD/MacOSX/POSIX - Build from Source\n\n- Install Go according to the installation instructions here:\n  http://golang.org/doc/install\n\n- Ensure Go was installed properly and is a supported version:\n\n```bash\n$ go version\n$ go env GOROOT GOPATH\n```\n\nNOTE: The `GOROOT` and `GOPATH` above must not be the same path.  It is\nrecommended that `GOPATH` is set to a directory in your home directory such as\n`~/goprojects` to avoid write permission issues.  It is also recommended to add\n`$GOPATH/bin` to your `PATH` at this point.\n\n- Run the following commands to obtain btcd, all dependencies, and install it:\n\n```bash\n$ cd $GOPATH/src/github.com/btcsuite/btcd\n$ go install -v . ./cmd/...\n```\n\n- btcd (and utilities) will now be installed in ```$GOPATH/bin```.  If you did\n  not already add the bin directory to your system path during Go installation,\n  we recommend you do so now.\n\n## Updating\n\n#### Linux/BSD/MacOSX/POSIX - Build from Source\n\n- Run the following commands to update btcd, all dependencies, and install it:\n\n```bash\n$ cd $GOPATH/src/github.com/btcsuite/btcd\n$ git pull\n$ go install -v . ./cmd/...\n```\n\n## Getting Started\n\nbtcd has several configuration options available to tweak how it runs, but all\nof the basic operations described in the intro section work with zero\nconfiguration.\n\n#### Linux/BSD/POSIX/Source\n\n```bash\n$ ./btcd\n```\n\n## IRC\n\n- irc.libera.chat\n- channel #btcd\n- [webchat](https://web.libera.chat/gamja/?channels=btcd)\n\n## Issue Tracker\n\nThe [integrated github issue tracker](https://github.com/btcsuite/btcd/issues)\nis used for this project.\n\n## Documentation\n\nThe documentation is a work-in-progress.  It is located in the [docs](https://github.com/btcsuite/btcd/tree/master/docs) folder.\n\n## Release Verification\n\nPlease see our [documentation on the current build/verification\nprocess](https://github.com/btcsuite/btcd/tree/master/release) for all our\nreleases for information on how to verify the integrity of published releases\nusing our reproducible build system.\n\n## License\n\nbtcd is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\nThe last major `btcd` release is to be considered the current support version.\nGiven an issue severe enough, a backport will be issued either to the prior\nmajor release or the set of releases considered utilized enough. \n\n## Reporting a Vulnerability\n\nTo report security issues, send an email to security@lightning.engineering\n(this list isn't to be used for support). \n\nThe following key can be used to communicate sensitive information: `91FE 464C\nD751 01DA 6B6B  AB60 555C 6465 E5BC B3AF`. \n"
  },
  {
    "path": "addrmgr/addrmanager.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Copyright (c) 2015-2018 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage addrmgr\n\nimport (\n\t\"container/list\"\n\tcrand \"crypto/rand\" // for seeding\n\t\"encoding/base32\"\n\t\"encoding/binary\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/rand\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// AddrManager provides a concurrency safe address manager for caching potential\n// peers on the bitcoin network.\ntype AddrManager struct {\n\tmtx            sync.RWMutex\n\tpeersFile      string\n\tlookupFunc     func(string) ([]net.IP, error)\n\trand           *rand.Rand\n\tkey            [32]byte\n\taddrIndex      map[string]*KnownAddress // address key to ka for all addrs.\n\taddrNew        [newBucketCount]map[string]*KnownAddress\n\taddrTried      [triedBucketCount]*list.List\n\tstarted        int32\n\tshutdown       int32\n\twg             sync.WaitGroup\n\tquit           chan struct{}\n\tnTried         int\n\tnNew           int\n\tlamtx          sync.Mutex\n\tlocalAddresses map[string]*localAddress\n\tversion        int\n}\n\ntype serializedKnownAddress struct {\n\tAddr        string\n\tSrc         string\n\tAttempts    int\n\tTimeStamp   int64\n\tLastAttempt int64\n\tLastSuccess int64\n\tServices    wire.ServiceFlag\n\tSrcServices wire.ServiceFlag\n\t// no refcount or tried, that is available from context.\n}\n\ntype serializedAddrManager struct {\n\tVersion      int\n\tKey          [32]byte\n\tAddresses    []*serializedKnownAddress\n\tNewBuckets   [newBucketCount][]string // string is NetAddressKey\n\tTriedBuckets [triedBucketCount][]string\n}\n\ntype localAddress struct {\n\tna    *wire.NetAddressV2\n\tscore AddressPriority\n}\n\n// AddressPriority type is used to describe the hierarchy of local address\n// discovery methods.\ntype AddressPriority int\n\nconst (\n\t// InterfacePrio signifies the address is on a local interface\n\tInterfacePrio AddressPriority = iota\n\n\t// BoundPrio signifies the address has been explicitly bounded to.\n\tBoundPrio\n\n\t// UpnpPrio signifies the address was obtained from UPnP.\n\tUpnpPrio\n\n\t// HTTPPrio signifies the address was obtained from an external HTTP service.\n\tHTTPPrio\n\n\t// ManualPrio signifies the address was provided by --externalip.\n\tManualPrio\n)\n\nconst (\n\t// needAddressThreshold is the number of addresses under which the\n\t// address manager will claim to need more addresses.\n\tneedAddressThreshold = 1000\n\n\t// dumpAddressInterval is the interval used to dump the address\n\t// cache to disk for future use.\n\tdumpAddressInterval = time.Minute * 10\n\n\t// triedBucketSize is the maximum number of addresses in each\n\t// tried address bucket.\n\ttriedBucketSize = 256\n\n\t// triedBucketCount is the number of buckets we split tried\n\t// addresses over.\n\ttriedBucketCount = 64\n\n\t// newBucketSize is the maximum number of addresses in each new address\n\t// bucket.\n\tnewBucketSize = 64\n\n\t// newBucketCount is the number of buckets that we spread new addresses\n\t// over.\n\tnewBucketCount = 1024\n\n\t// triedBucketsPerGroup is the number of tried buckets over which an\n\t// address group will be spread.\n\ttriedBucketsPerGroup = 8\n\n\t// newBucketsPerGroup is the number of new buckets over which an\n\t// source address group will be spread.\n\tnewBucketsPerGroup = 64\n\n\t// newBucketsPerAddress is the number of buckets a frequently seen new\n\t// address may end up in.\n\tnewBucketsPerAddress = 8\n\n\t// numMissingDays is the number of days before which we assume an\n\t// address has vanished if we have not seen it announced  in that long.\n\tnumMissingDays = 30\n\n\t// numRetries is the number of tried without a single success before\n\t// we assume an address is bad.\n\tnumRetries = 3\n\n\t// maxFailures is the maximum number of failures we will accept without\n\t// a success before considering an address bad.\n\tmaxFailures = 10\n\n\t// minBadDays is the number of days since the last success before we\n\t// will consider evicting an address.\n\tminBadDays = 7\n\n\t// getAddrMax is the most addresses that we will send in response\n\t// to a getAddr (in practise the most addresses we will return from a\n\t// call to AddressCache()).\n\tgetAddrMax = 2500\n\n\t// getAddrPercent is the percentage of total addresses known that we\n\t// will share with a call to AddressCache.\n\tgetAddrPercent = 23\n\n\t// serialisationVersion is the current version of the on-disk format.\n\tserialisationVersion = 2\n)\n\n// updateAddress is a helper function to either update an address already known\n// to the address manager, or to add the address if not already known.\nfunc (a *AddrManager) updateAddress(netAddr, srcAddr *wire.NetAddressV2) {\n\t// Filter out non-routable addresses. Note that non-routable\n\t// also includes invalid and local addresses.\n\tif !IsRoutable(netAddr) {\n\t\treturn\n\t}\n\n\taddr := NetAddressKey(netAddr)\n\tka := a.find(netAddr)\n\tif ka != nil {\n\t\t// TODO: only update addresses periodically.\n\t\t// Update the last seen time and services.\n\t\t// note that to prevent causing excess garbage on getaddr\n\t\t// messages the netaddresses in addrmanager are *immutable*,\n\t\t// if we need to change them then we replace the pointer with a\n\t\t// new copy so that we don't have to copy every na for getaddr.\n\t\tif netAddr.Timestamp.After(ka.na.Timestamp) ||\n\t\t\t(ka.na.Services&netAddr.Services) !=\n\t\t\t\tnetAddr.Services {\n\n\t\t\tnaCopy := *ka.na\n\t\t\tnaCopy.Timestamp = netAddr.Timestamp\n\t\t\tnaCopy.AddService(netAddr.Services)\n\t\t\tka.mtx.Lock()\n\t\t\tka.na = &naCopy\n\t\t\tka.mtx.Unlock()\n\t\t}\n\n\t\t// If already in tried, we have nothing to do here.\n\t\tif ka.tried {\n\t\t\treturn\n\t\t}\n\n\t\t// Already at our max?\n\t\tif ka.refs == newBucketsPerAddress {\n\t\t\treturn\n\t\t}\n\n\t\t// The more entries we have, the less likely we are to add more.\n\t\t// likelihood is 2N.\n\t\tfactor := int32(2 * ka.refs)\n\t\tif a.rand.Int31n(factor) != 0 {\n\t\t\treturn\n\t\t}\n\t} else {\n\t\t// Make a copy of the net address to avoid races since it is\n\t\t// updated elsewhere in the addrmanager code and would otherwise\n\t\t// change the actual netaddress on the peer.\n\t\tnetAddrCopy := *netAddr\n\t\tka = &KnownAddress{na: &netAddrCopy, srcAddr: srcAddr}\n\t\ta.addrIndex[addr] = ka\n\t\ta.nNew++\n\t\t// XXX time penalty?\n\t}\n\n\tbucket := a.getNewBucket(netAddr, srcAddr)\n\n\t// Already exists?\n\tif _, ok := a.addrNew[bucket][addr]; ok {\n\t\treturn\n\t}\n\n\t// Enforce max addresses.\n\tif len(a.addrNew[bucket]) > newBucketSize {\n\t\tlog.Tracef(\"new bucket is full, expiring old\")\n\t\ta.expireNew(bucket)\n\t}\n\n\t// Add to new bucket.\n\tka.refs++\n\ta.addrNew[bucket][addr] = ka\n\n\tlog.Tracef(\"Added new address %s for a total of %d addresses\", addr,\n\t\ta.nTried+a.nNew)\n}\n\n// expireNew makes space in the new buckets by expiring the really bad entries.\n// If no bad entries are available we look at a few and remove the oldest.\nfunc (a *AddrManager) expireNew(bucket int) {\n\t// First see if there are any entries that are so bad we can just throw\n\t// them away. otherwise we throw away the oldest entry in the cache.\n\t// Bitcoind here chooses four random and just throws the oldest of\n\t// those away, but we keep track of oldest in the initial traversal and\n\t// use that information instead.\n\tvar oldest *KnownAddress\n\tfor k, v := range a.addrNew[bucket] {\n\t\tif v.isBad() {\n\t\t\tlog.Tracef(\"expiring bad address %v\", k)\n\t\t\tdelete(a.addrNew[bucket], k)\n\t\t\tv.refs--\n\t\t\tif v.refs == 0 {\n\t\t\t\ta.nNew--\n\t\t\t\tdelete(a.addrIndex, k)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif oldest == nil {\n\t\t\toldest = v\n\t\t} else if !v.na.Timestamp.After(oldest.na.Timestamp) {\n\t\t\toldest = v\n\t\t}\n\t}\n\n\tif oldest != nil {\n\t\tkey := NetAddressKey(oldest.na)\n\t\tlog.Tracef(\"expiring oldest address %v\", key)\n\n\t\tdelete(a.addrNew[bucket], key)\n\t\toldest.refs--\n\t\tif oldest.refs == 0 {\n\t\t\ta.nNew--\n\t\t\tdelete(a.addrIndex, key)\n\t\t}\n\t}\n}\n\n// pickTried selects an address from the tried bucket to be evicted.\n// We just choose the eldest. Bitcoind selects 4 random entries and throws away\n// the older of them.\nfunc (a *AddrManager) pickTried(bucket int) *list.Element {\n\tvar oldest *KnownAddress\n\tvar oldestElem *list.Element\n\tfor e := a.addrTried[bucket].Front(); e != nil; e = e.Next() {\n\t\tka := e.Value.(*KnownAddress)\n\t\tif oldest == nil || oldest.na.Timestamp.After(ka.na.Timestamp) {\n\t\t\toldestElem = e\n\t\t\toldest = ka\n\t\t}\n\n\t}\n\treturn oldestElem\n}\n\nfunc (a *AddrManager) getNewBucket(netAddr, srcAddr *wire.NetAddressV2) int {\n\t// bitcoind:\n\t// doublesha256(key + sourcegroup + int64(doublesha256(key + group + sourcegroup))%bucket_per_source_group) % num_new_buckets\n\n\tdata1 := []byte{}\n\tdata1 = append(data1, a.key[:]...)\n\tdata1 = append(data1, []byte(GroupKey(netAddr))...)\n\tdata1 = append(data1, []byte(GroupKey(srcAddr))...)\n\thash1 := chainhash.DoubleHashB(data1)\n\thash64 := binary.LittleEndian.Uint64(hash1)\n\thash64 %= newBucketsPerGroup\n\tvar hashbuf [8]byte\n\tbinary.LittleEndian.PutUint64(hashbuf[:], hash64)\n\tdata2 := []byte{}\n\tdata2 = append(data2, a.key[:]...)\n\tdata2 = append(data2, GroupKey(srcAddr)...)\n\tdata2 = append(data2, hashbuf[:]...)\n\n\thash2 := chainhash.DoubleHashB(data2)\n\treturn int(binary.LittleEndian.Uint64(hash2) % newBucketCount)\n}\n\nfunc (a *AddrManager) getTriedBucket(netAddr *wire.NetAddressV2) int {\n\t// bitcoind hashes this as:\n\t// doublesha256(key + group + truncate_to_64bits(doublesha256(key)) % buckets_per_group) % num_buckets\n\tdata1 := []byte{}\n\tdata1 = append(data1, a.key[:]...)\n\tdata1 = append(data1, []byte(NetAddressKey(netAddr))...)\n\thash1 := chainhash.DoubleHashB(data1)\n\thash64 := binary.LittleEndian.Uint64(hash1)\n\thash64 %= triedBucketsPerGroup\n\tvar hashbuf [8]byte\n\tbinary.LittleEndian.PutUint64(hashbuf[:], hash64)\n\tdata2 := []byte{}\n\tdata2 = append(data2, a.key[:]...)\n\tdata2 = append(data2, GroupKey(netAddr)...)\n\tdata2 = append(data2, hashbuf[:]...)\n\n\thash2 := chainhash.DoubleHashB(data2)\n\treturn int(binary.LittleEndian.Uint64(hash2) % triedBucketCount)\n}\n\n// addressHandler is the main handler for the address manager.  It must be run\n// as a goroutine.\nfunc (a *AddrManager) addressHandler() {\n\tdumpAddressTicker := time.NewTicker(dumpAddressInterval)\n\tdefer dumpAddressTicker.Stop()\nout:\n\tfor {\n\t\tselect {\n\t\tcase <-dumpAddressTicker.C:\n\t\t\ta.savePeers()\n\n\t\tcase <-a.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\ta.savePeers()\n\ta.wg.Done()\n\tlog.Trace(\"Address handler done\")\n}\n\n// savePeers saves all the known addresses to a file so they can be read back\n// in at next run.\nfunc (a *AddrManager) savePeers() {\n\ta.mtx.Lock()\n\tdefer a.mtx.Unlock()\n\n\t// First we make a serialisable datastructure so we can encode it to\n\t// json.\n\tsam := new(serializedAddrManager)\n\tsam.Version = a.version\n\tcopy(sam.Key[:], a.key[:])\n\n\tsam.Addresses = make([]*serializedKnownAddress, len(a.addrIndex))\n\ti := 0\n\tfor k, v := range a.addrIndex {\n\t\tska := new(serializedKnownAddress)\n\t\tska.Addr = k\n\t\tska.TimeStamp = v.na.Timestamp.Unix()\n\t\tska.Src = NetAddressKey(v.srcAddr)\n\t\tska.Attempts = v.attempts\n\t\tska.LastAttempt = v.lastattempt.Unix()\n\t\tska.LastSuccess = v.lastsuccess.Unix()\n\t\tif a.version > 1 {\n\t\t\tska.Services = v.na.Services\n\t\t\tska.SrcServices = v.srcAddr.Services\n\t\t}\n\t\t// Tried and refs are implicit in the rest of the structure\n\t\t// and will be worked out from context on unserialisation.\n\t\tsam.Addresses[i] = ska\n\t\ti++\n\t}\n\tfor i := range a.addrNew {\n\t\tsam.NewBuckets[i] = make([]string, len(a.addrNew[i]))\n\t\tj := 0\n\t\tfor k := range a.addrNew[i] {\n\t\t\tsam.NewBuckets[i][j] = k\n\t\t\tj++\n\t\t}\n\t}\n\tfor i := range a.addrTried {\n\t\tsam.TriedBuckets[i] = make([]string, a.addrTried[i].Len())\n\t\tj := 0\n\t\tfor e := a.addrTried[i].Front(); e != nil; e = e.Next() {\n\t\t\tka := e.Value.(*KnownAddress)\n\t\t\tsam.TriedBuckets[i][j] = NetAddressKey(ka.na)\n\t\t\tj++\n\t\t}\n\t}\n\n\tw, err := os.Create(a.peersFile)\n\tif err != nil {\n\t\tlog.Errorf(\"Error opening file %s: %v\", a.peersFile, err)\n\t\treturn\n\t}\n\tenc := json.NewEncoder(w)\n\tdefer w.Close()\n\tif err := enc.Encode(&sam); err != nil {\n\t\tlog.Errorf(\"Failed to encode file %s: %v\", a.peersFile, err)\n\t\treturn\n\t}\n}\n\n// loadPeers loads the known address from the saved file.  If empty, missing, or\n// malformed file, just don't load anything and start fresh\nfunc (a *AddrManager) loadPeers() {\n\ta.mtx.Lock()\n\tdefer a.mtx.Unlock()\n\n\terr := a.deserializePeers(a.peersFile)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to parse file %s: %v\", a.peersFile, err)\n\t\t// if it is invalid we nuke the old one unconditionally.\n\t\terr = os.Remove(a.peersFile)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Failed to remove corrupt peers file %s: %v\",\n\t\t\t\ta.peersFile, err)\n\t\t}\n\t\ta.reset()\n\t\treturn\n\t}\n\tlog.Infof(\"Loaded %d addresses from file '%s'\", a.numAddresses(), a.peersFile)\n}\n\nfunc (a *AddrManager) deserializePeers(filePath string) error {\n\n\t_, err := os.Stat(filePath)\n\tif os.IsNotExist(err) {\n\t\treturn nil\n\t}\n\tr, err := os.Open(filePath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%s error opening file: %v\", filePath, err)\n\t}\n\tdefer r.Close()\n\n\tvar sam serializedAddrManager\n\tdec := json.NewDecoder(r)\n\terr = dec.Decode(&sam)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error reading %s: %v\", filePath, err)\n\t}\n\n\t// Since decoding JSON is backwards compatible (i.e., only decodes\n\t// fields it understands), we'll only return an error upon seeing a\n\t// version past our latest supported version.\n\tif sam.Version > serialisationVersion {\n\t\treturn fmt.Errorf(\"unknown version %v in serialized \"+\n\t\t\t\"addrmanager\", sam.Version)\n\t}\n\n\tcopy(a.key[:], sam.Key[:])\n\n\tfor _, v := range sam.Addresses {\n\t\tka := new(KnownAddress)\n\n\t\t// The first version of the serialized address manager was not\n\t\t// aware of the service bits associated with this address, so\n\t\t// we'll assign a default of SFNodeNetwork to it.\n\t\tif sam.Version == 1 {\n\t\t\tv.Services = wire.SFNodeNetwork\n\t\t}\n\t\tka.na, err = a.DeserializeNetAddress(v.Addr, v.Services)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to deserialize netaddress \"+\n\t\t\t\t\"%s: %v\", v.Addr, err)\n\t\t}\n\n\t\t// The first version of the serialized address manager was not\n\t\t// aware of the service bits associated with the source address,\n\t\t// so we'll assign a default of SFNodeNetwork to it.\n\t\tif sam.Version == 1 {\n\t\t\tv.SrcServices = wire.SFNodeNetwork\n\t\t}\n\t\tka.srcAddr, err = a.DeserializeNetAddress(v.Src, v.SrcServices)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to deserialize netaddress \"+\n\t\t\t\t\"%s: %v\", v.Src, err)\n\t\t}\n\n\t\tka.attempts = v.Attempts\n\t\tka.lastattempt = time.Unix(v.LastAttempt, 0)\n\t\tka.lastsuccess = time.Unix(v.LastSuccess, 0)\n\t\ta.addrIndex[NetAddressKey(ka.na)] = ka\n\t}\n\n\tfor i := range sam.NewBuckets {\n\t\tfor _, val := range sam.NewBuckets[i] {\n\t\t\tka, ok := a.addrIndex[val]\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"newbucket contains %s but \"+\n\t\t\t\t\t\"none in address list\", val)\n\t\t\t}\n\n\t\t\tif ka.refs == 0 {\n\t\t\t\ta.nNew++\n\t\t\t}\n\t\t\tka.refs++\n\t\t\ta.addrNew[i][val] = ka\n\t\t}\n\t}\n\tfor i := range sam.TriedBuckets {\n\t\tfor _, val := range sam.TriedBuckets[i] {\n\t\t\tka, ok := a.addrIndex[val]\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"Newbucket contains %s but \"+\n\t\t\t\t\t\"none in address list\", val)\n\t\t\t}\n\n\t\t\tka.tried = true\n\t\t\ta.nTried++\n\t\t\ta.addrTried[i].PushBack(ka)\n\t\t}\n\t}\n\n\t// Sanity checking.\n\tfor k, v := range a.addrIndex {\n\t\tif v.refs == 0 && !v.tried {\n\t\t\treturn fmt.Errorf(\"address %s after serialisation \"+\n\t\t\t\t\"with no references\", k)\n\t\t}\n\n\t\tif v.refs > 0 && v.tried {\n\t\t\treturn fmt.Errorf(\"address %s after serialisation \"+\n\t\t\t\t\"which is both new and tried!\", k)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// DeserializeNetAddress converts a given address string to a *wire.NetAddress.\nfunc (a *AddrManager) DeserializeNetAddress(addr string,\n\tservices wire.ServiceFlag) (*wire.NetAddressV2, error) {\n\n\thost, portStr, err := net.SplitHostPort(addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tport, err := strconv.ParseUint(portStr, 10, 16)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn a.HostToNetAddress(host, uint16(port), services)\n}\n\n// Start begins the core address handler which manages a pool of known\n// addresses, timeouts, and interval based writes.\nfunc (a *AddrManager) Start() {\n\t// Already started?\n\tif atomic.AddInt32(&a.started, 1) != 1 {\n\t\treturn\n\t}\n\n\tlog.Trace(\"Starting address manager\")\n\n\t// Load peers we already know about from file.\n\ta.loadPeers()\n\n\t// Start the address ticker to save addresses periodically.\n\ta.wg.Add(1)\n\tgo a.addressHandler()\n}\n\n// Stop gracefully shuts down the address manager by stopping the main handler.\nfunc (a *AddrManager) Stop() error {\n\tif atomic.AddInt32(&a.shutdown, 1) != 1 {\n\t\tlog.Warnf(\"Address manager is already in the process of \" +\n\t\t\t\"shutting down\")\n\t\treturn nil\n\t}\n\n\tlog.Infof(\"Address manager shutting down\")\n\tclose(a.quit)\n\ta.wg.Wait()\n\treturn nil\n}\n\n// AddAddresses adds new addresses to the address manager.  It enforces a max\n// number of addresses and silently ignores duplicate addresses.  It is\n// safe for concurrent access.\nfunc (a *AddrManager) AddAddresses(addrs []*wire.NetAddressV2, srcAddr *wire.NetAddressV2) {\n\ta.mtx.Lock()\n\tdefer a.mtx.Unlock()\n\n\tfor _, na := range addrs {\n\t\ta.updateAddress(na, srcAddr)\n\t}\n}\n\n// AddAddress adds a new address to the address manager.  It enforces a max\n// number of addresses and silently ignores duplicate addresses.  It is\n// safe for concurrent access.\nfunc (a *AddrManager) AddAddress(addr, srcAddr *wire.NetAddressV2) {\n\ta.mtx.Lock()\n\tdefer a.mtx.Unlock()\n\n\ta.updateAddress(addr, srcAddr)\n}\n\n// AddAddressByIP adds an address where we are given an ip:port and not a\n// wire.NetAddress.\nfunc (a *AddrManager) AddAddressByIP(addrIP string) error {\n\t// Split IP and port\n\taddr, portStr, err := net.SplitHostPort(addrIP)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Put it in wire.Netaddress\n\tip := net.ParseIP(addr)\n\tif ip == nil {\n\t\treturn fmt.Errorf(\"invalid ip address %s\", addr)\n\t}\n\tport, err := strconv.ParseUint(portStr, 10, 0)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid port %s: %v\", portStr, err)\n\t}\n\tna := wire.NetAddressV2FromBytes(time.Now(), 0, ip, uint16(port))\n\ta.AddAddress(na, na) // XXX use correct src address\n\treturn nil\n}\n\n// NumAddresses returns the number of addresses known to the address manager.\nfunc (a *AddrManager) numAddresses() int {\n\treturn a.nTried + a.nNew\n}\n\n// NumAddresses returns the number of addresses known to the address manager.\nfunc (a *AddrManager) NumAddresses() int {\n\ta.mtx.RLock()\n\tdefer a.mtx.RUnlock()\n\n\treturn a.numAddresses()\n}\n\n// NeedMoreAddresses returns whether or not the address manager needs more\n// addresses.\nfunc (a *AddrManager) NeedMoreAddresses() bool {\n\ta.mtx.RLock()\n\tdefer a.mtx.RUnlock()\n\n\treturn a.numAddresses() < needAddressThreshold\n}\n\n// AddressCache returns the current address cache.  It must be treated as\n// read-only (but since it is a copy now, this is not as dangerous).\nfunc (a *AddrManager) AddressCache() []*wire.NetAddressV2 {\n\tallAddr := a.getAddresses()\n\n\tnumAddresses := len(allAddr) * getAddrPercent / 100\n\tif numAddresses > getAddrMax {\n\t\tnumAddresses = getAddrMax\n\t}\n\n\t// Fisher-Yates shuffle the array. We only need to do the first\n\t// `numAddresses' since we are throwing the rest.\n\tfor i := 0; i < numAddresses; i++ {\n\t\t// pick a number between current index and the end\n\t\tj := rand.Intn(len(allAddr)-i) + i\n\t\tallAddr[i], allAddr[j] = allAddr[j], allAddr[i]\n\t}\n\n\t// slice off the limit we are willing to share.\n\treturn allAddr[0:numAddresses]\n}\n\n// getAddresses returns all of the addresses currently found within the\n// manager's address cache.\nfunc (a *AddrManager) getAddresses() []*wire.NetAddressV2 {\n\ta.mtx.RLock()\n\tdefer a.mtx.RUnlock()\n\n\taddrIndexLen := len(a.addrIndex)\n\tif addrIndexLen == 0 {\n\t\treturn nil\n\t}\n\n\taddrs := make([]*wire.NetAddressV2, 0, addrIndexLen)\n\tfor _, v := range a.addrIndex {\n\t\taddrs = append(addrs, v.na)\n\t}\n\n\treturn addrs\n}\n\n// reset resets the address manager by reinitialising the random source\n// and allocating fresh empty bucket storage.\nfunc (a *AddrManager) reset() {\n\n\ta.addrIndex = make(map[string]*KnownAddress)\n\n\t// fill key with bytes from a good random source.\n\tio.ReadFull(crand.Reader, a.key[:])\n\tfor i := range a.addrNew {\n\t\ta.addrNew[i] = make(map[string]*KnownAddress)\n\t}\n\tfor i := range a.addrTried {\n\t\ta.addrTried[i] = list.New()\n\t}\n}\n\n// HostToNetAddress returns a netaddress given a host address.  If the address\n// is a Tor .onion address this will be taken care of.  Else if the host is\n// not an IP address it will be resolved (via Tor if required).\nfunc (a *AddrManager) HostToNetAddress(host string, port uint16,\n\tservices wire.ServiceFlag) (*wire.NetAddressV2, error) {\n\n\tvar (\n\t\tna *wire.NetAddressV2\n\t\tip net.IP\n\t)\n\n\t// Tor v2 address is 16 char base32 + \".onion\"\n\tif len(host) == wire.TorV2EncodedSize && host[wire.TorV2EncodedSize-6:] == \".onion\" {\n\t\t// go base32 encoding uses capitals (as does the rfc\n\t\t// but Tor and bitcoind tend to user lowercase, so we switch\n\t\t// case here.\n\t\tdata, err := base32.StdEncoding.DecodeString(\n\t\t\tstrings.ToUpper(host[:wire.TorV2EncodedSize-6]))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tna = wire.NetAddressV2FromBytes(\n\t\t\ttime.Now(), services, data, port,\n\t\t)\n\t} else if len(host) == wire.TorV3EncodedSize && host[wire.TorV3EncodedSize-6:] == \".onion\" {\n\t\t// Tor v3 addresses are 56 base32 characters with the 6 byte\n\t\t// onion suffix.\n\t\tdata, err := base32.StdEncoding.DecodeString(\n\t\t\tstrings.ToUpper(host[:wire.TorV3EncodedSize-6]),\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// The first 32 bytes is the ed25519 public key and is enough\n\t\t// to reconstruct the .onion address.\n\t\tna = wire.NetAddressV2FromBytes(\n\t\t\ttime.Now(), services, data[:wire.TorV3Size], port,\n\t\t)\n\t} else if ip = net.ParseIP(host); ip == nil {\n\t\tips, err := a.lookupFunc(host)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif len(ips) == 0 {\n\t\t\treturn nil, fmt.Errorf(\"no addresses found for %s\", host)\n\t\t}\n\t\tip = ips[0]\n\n\t\tna = wire.NetAddressV2FromBytes(time.Now(), services, ip, port)\n\t} else {\n\t\t// This is an non-nil IP address that was parsed in the else if\n\t\t// above.\n\t\tna = wire.NetAddressV2FromBytes(time.Now(), services, ip, port)\n\t}\n\n\treturn na, nil\n}\n\n// NetAddressKey returns a string key in the form of ip:port for IPv4 addresses\n// or [ip]:port for IPv6 addresses. It also handles onion v2 and v3 addresses.\nfunc NetAddressKey(na *wire.NetAddressV2) string {\n\tport := strconv.FormatUint(uint64(na.Port), 10)\n\n\treturn net.JoinHostPort(na.Addr.String(), port)\n}\n\n// GetAddress returns a single address that should be routable.  It picks a\n// random one from the possible addresses with preference given to ones that\n// have not been used recently and should not pick 'close' addresses\n// consecutively.\nfunc (a *AddrManager) GetAddress() *KnownAddress {\n\t// Protect concurrent access.\n\ta.mtx.Lock()\n\tdefer a.mtx.Unlock()\n\n\tif a.numAddresses() == 0 {\n\t\treturn nil\n\t}\n\n\t// Use a 50% chance for choosing between tried and new table entries.\n\tif a.nTried > 0 && (a.nNew == 0 || a.rand.Intn(2) == 0) {\n\t\t// Tried entry.\n\t\tlarge := 1 << 30\n\t\tfactor := 1.0\n\t\tfor {\n\t\t\t// pick a random bucket.\n\t\t\tbucket := a.rand.Intn(len(a.addrTried))\n\t\t\tif a.addrTried[bucket].Len() == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Pick a random entry in the list\n\t\t\te := a.addrTried[bucket].Front()\n\t\t\tfor i :=\n\t\t\t\ta.rand.Int63n(int64(a.addrTried[bucket].Len())); i > 0; i-- {\n\t\t\t\te = e.Next()\n\t\t\t}\n\t\t\tka := e.Value.(*KnownAddress)\n\t\t\trandval := a.rand.Intn(large)\n\t\t\tif float64(randval) < (factor * ka.chance() * float64(large)) {\n\t\t\t\tlog.Tracef(\"Selected %v from tried bucket\",\n\t\t\t\t\tNetAddressKey(ka.na))\n\t\t\t\treturn ka\n\t\t\t}\n\t\t\tfactor *= 1.2\n\t\t}\n\t} else {\n\t\t// new node.\n\t\t// XXX use a closure/function to avoid repeating this.\n\t\tlarge := 1 << 30\n\t\tfactor := 1.0\n\t\tfor {\n\t\t\t// Pick a random bucket.\n\t\t\tbucket := a.rand.Intn(len(a.addrNew))\n\t\t\tif len(a.addrNew[bucket]) == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Then, a random entry in it.\n\t\t\tvar ka *KnownAddress\n\t\t\tnth := a.rand.Intn(len(a.addrNew[bucket]))\n\t\t\tfor _, value := range a.addrNew[bucket] {\n\t\t\t\tif nth == 0 {\n\t\t\t\t\tka = value\n\t\t\t\t}\n\t\t\t\tnth--\n\t\t\t}\n\t\t\trandval := a.rand.Intn(large)\n\t\t\tif float64(randval) < (factor * ka.chance() * float64(large)) {\n\t\t\t\tlog.Tracef(\"Selected %v from new bucket\",\n\t\t\t\t\tNetAddressKey(ka.na))\n\t\t\t\treturn ka\n\t\t\t}\n\t\t\tfactor *= 1.2\n\t\t}\n\t}\n}\n\nfunc (a *AddrManager) find(addr *wire.NetAddressV2) *KnownAddress {\n\treturn a.addrIndex[NetAddressKey(addr)]\n}\n\n// Attempt increases the given address' attempt counter and updates\n// the last attempt time.\nfunc (a *AddrManager) Attempt(addr *wire.NetAddressV2) {\n\ta.mtx.Lock()\n\tdefer a.mtx.Unlock()\n\n\t// find address.\n\t// Surely address will be in tried by now?\n\tka := a.find(addr)\n\tif ka == nil {\n\t\treturn\n\t}\n\t// set last tried time to now\n\tnow := time.Now()\n\tka.mtx.Lock()\n\tka.attempts++\n\tka.lastattempt = now\n\tka.mtx.Unlock()\n}\n\n// Connected Marks the given address as currently connected and working at the\n// current time.  The address must already be known to AddrManager else it will\n// be ignored.\nfunc (a *AddrManager) Connected(addr *wire.NetAddressV2) {\n\ta.mtx.Lock()\n\tdefer a.mtx.Unlock()\n\n\tka := a.find(addr)\n\tif ka == nil {\n\t\treturn\n\t}\n\n\t// Update the time as long as it has been 20 minutes since last we did\n\t// so.\n\tnow := time.Now()\n\tif now.After(ka.na.Timestamp.Add(time.Minute * 20)) {\n\t\t// ka.na is immutable, so replace it.\n\t\tnaCopy := *ka.na\n\t\tnaCopy.Timestamp = time.Now()\n\t\tka.mtx.Lock()\n\t\tka.na = &naCopy\n\t\tka.mtx.Unlock()\n\t}\n}\n\n// Good marks the given address as good.  To be called after a successful\n// connection and version exchange.  If the address is unknown to the address\n// manager it will be ignored.\nfunc (a *AddrManager) Good(addr *wire.NetAddressV2) {\n\ta.mtx.Lock()\n\tdefer a.mtx.Unlock()\n\n\tka := a.find(addr)\n\tif ka == nil {\n\t\treturn\n\t}\n\n\t// ka.Timestamp is not updated here to avoid leaking information\n\t// about currently connected peers.\n\tnow := time.Now()\n\tka.mtx.Lock()\n\tka.lastsuccess = now\n\tka.lastattempt = now\n\tka.attempts = 0\n\tka.mtx.Unlock() // tried and refs synchronized via a.mtx\n\n\t// move to tried set, optionally evicting other addresses if need.\n\tif ka.tried {\n\t\treturn\n\t}\n\n\t// ok, need to move it to tried.\n\n\t// remove from all new buckets.\n\t// record one of the buckets in question and call it the `first'\n\taddrKey := NetAddressKey(addr)\n\toldBucket := -1\n\tfor i := range a.addrNew {\n\t\t// we check for existence so we can record the first one\n\t\tif _, ok := a.addrNew[i][addrKey]; ok {\n\t\t\tdelete(a.addrNew[i], addrKey)\n\t\t\tka.refs--\n\t\t\tif oldBucket == -1 {\n\t\t\t\toldBucket = i\n\t\t\t}\n\t\t}\n\t}\n\ta.nNew--\n\n\tif oldBucket == -1 {\n\t\t// What? wasn't in a bucket after all.... Panic?\n\t\treturn\n\t}\n\n\tbucket := a.getTriedBucket(ka.na)\n\n\t// Room in this tried bucket?\n\tif a.addrTried[bucket].Len() < triedBucketSize {\n\t\tka.tried = true\n\t\ta.addrTried[bucket].PushBack(ka)\n\t\ta.nTried++\n\t\treturn\n\t}\n\n\t// No room, we have to evict something else.\n\tentry := a.pickTried(bucket)\n\trmka := entry.Value.(*KnownAddress)\n\n\t// First bucket it would have been put in.\n\tnewBucket := a.getNewBucket(rmka.na, rmka.srcAddr)\n\n\t// If no room in the original bucket, we put it in a bucket we just\n\t// freed up a space in.\n\tif len(a.addrNew[newBucket]) >= newBucketSize {\n\t\tnewBucket = oldBucket\n\t}\n\n\t// replace with ka in list.\n\tka.tried = true\n\tentry.Value = ka\n\n\trmka.tried = false\n\trmka.refs++\n\n\t// We don't touch a.nTried here since the number of tried stays the same\n\t// but we decemented new above, raise it again since we're putting\n\t// something back.\n\ta.nNew++\n\n\trmkey := NetAddressKey(rmka.na)\n\tlog.Tracef(\"Replacing %s with %s in tried\", rmkey, addrKey)\n\n\t// We made sure there is space here just above.\n\ta.addrNew[newBucket][rmkey] = rmka\n}\n\n// SetServices sets the services for the giiven address to the provided value.\nfunc (a *AddrManager) SetServices(addr *wire.NetAddressV2, services wire.ServiceFlag) {\n\ta.mtx.Lock()\n\tdefer a.mtx.Unlock()\n\n\tka := a.find(addr)\n\tif ka == nil {\n\t\treturn\n\t}\n\n\t// Update the services if needed.\n\tif ka.na.Services != services {\n\t\t// ka.na is immutable, so replace it.\n\t\tnaCopy := *ka.na\n\t\tnaCopy.Services = services\n\t\tka.mtx.Lock()\n\t\tka.na = &naCopy\n\t\tka.mtx.Unlock()\n\t}\n}\n\n// AddLocalAddress adds na to the list of known local addresses to advertise\n// with the given priority.\nfunc (a *AddrManager) AddLocalAddress(na *wire.NetAddressV2, priority AddressPriority) error {\n\tif !IsRoutable(na) {\n\t\treturn fmt.Errorf(\n\t\t\t\"address %s is not routable\", na.Addr.String(),\n\t\t)\n\t}\n\n\ta.lamtx.Lock()\n\tdefer a.lamtx.Unlock()\n\n\tkey := NetAddressKey(na)\n\tla, ok := a.localAddresses[key]\n\tif !ok || la.score < priority {\n\t\tif ok {\n\t\t\tla.score = priority + 1\n\t\t} else {\n\t\t\ta.localAddresses[key] = &localAddress{\n\t\t\t\tna:    na,\n\t\t\t\tscore: priority,\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// getReachabilityFrom returns the relative reachability of the provided local\n// address to the provided remote address.\nfunc getReachabilityFrom(localAddr, remoteAddr *wire.NetAddressV2) int {\n\tconst (\n\t\tUnreachable = 0\n\t\tDefault     = iota\n\t\tTeredo\n\t\tIpv6Weak\n\t\tIpv4\n\t\tIpv6Strong\n\t\tPrivate\n\t)\n\n\tif !IsRoutable(remoteAddr) {\n\t\treturn Unreachable\n\t}\n\n\tif remoteAddr.IsTorV3() {\n\t\tif localAddr.IsTorV3() {\n\t\t\treturn Private\n\t\t}\n\n\t\tlna := localAddr.ToLegacy()\n\t\tif IsOnionCatTor(lna) {\n\t\t\t// Modern v3 clients should not be able to connect to\n\t\t\t// deprecated v2 hidden services.\n\t\t\treturn Unreachable\n\t\t}\n\n\t\tif IsRoutable(localAddr) && IsIPv4(lna) {\n\t\t\treturn Ipv4\n\t\t}\n\n\t\treturn Default\n\t}\n\n\t// We can't be sure if the remote party can actually connect to this\n\t// address or not.\n\tif localAddr.IsTorV3() {\n\t\treturn Default\n\t}\n\n\t// Convert the V2 addresses into legacy to access the network\n\t// functions.\n\tremoteLna := remoteAddr.ToLegacy()\n\tlocalLna := localAddr.ToLegacy()\n\n\tif IsOnionCatTor(remoteLna) {\n\t\tif IsOnionCatTor(localLna) {\n\t\t\treturn Private\n\t\t}\n\n\t\tif IsRoutable(localAddr) && IsIPv4(localLna) {\n\t\t\treturn Ipv4\n\t\t}\n\n\t\treturn Default\n\t}\n\n\tif IsRFC4380(remoteLna) {\n\t\tif !IsRoutable(localAddr) {\n\t\t\treturn Default\n\t\t}\n\n\t\tif IsRFC4380(localLna) {\n\t\t\treturn Teredo\n\t\t}\n\n\t\tif IsIPv4(localLna) {\n\t\t\treturn Ipv4\n\t\t}\n\n\t\treturn Ipv6Weak\n\t}\n\n\tif IsIPv4(remoteLna) {\n\t\tif IsRoutable(localAddr) && IsIPv4(localLna) {\n\t\t\treturn Ipv4\n\t\t}\n\t\treturn Unreachable\n\t}\n\n\t/* ipv6 */\n\tvar tunnelled bool\n\t// Is our v6 is tunnelled?\n\tif IsRFC3964(localLna) || IsRFC6052(localLna) || IsRFC6145(localLna) {\n\t\ttunnelled = true\n\t}\n\n\tif !IsRoutable(localAddr) {\n\t\treturn Default\n\t}\n\n\tif IsRFC4380(localLna) {\n\t\treturn Teredo\n\t}\n\n\tif IsIPv4(localLna) {\n\t\treturn Ipv4\n\t}\n\n\tif tunnelled {\n\t\t// only prioritise ipv6 if we aren't tunnelling it.\n\t\treturn Ipv6Weak\n\t}\n\n\treturn Ipv6Strong\n}\n\n// GetBestLocalAddress returns the most appropriate local address to use\n// for the given remote address.\nfunc (a *AddrManager) GetBestLocalAddress(remoteAddr *wire.NetAddressV2) *wire.NetAddressV2 {\n\ta.lamtx.Lock()\n\tdefer a.lamtx.Unlock()\n\n\tbestreach := 0\n\tvar bestscore AddressPriority\n\tvar bestAddress *wire.NetAddressV2\n\tfor _, la := range a.localAddresses {\n\t\treach := getReachabilityFrom(la.na, remoteAddr)\n\t\tif reach > bestreach ||\n\t\t\t(reach == bestreach && la.score > bestscore) {\n\t\t\tbestreach = reach\n\t\t\tbestscore = la.score\n\t\t\tbestAddress = la.na\n\t\t}\n\t}\n\tif bestAddress != nil {\n\t\tlog.Debugf(\"Suggesting address %s:%d for %s:%d\",\n\t\t\tbestAddress.Addr.String(), bestAddress.Port,\n\t\t\tremoteAddr.Addr.String(), remoteAddr.Port)\n\t} else {\n\t\tlog.Debugf(\"No worthy address for %s:%d\",\n\t\t\tremoteAddr.Addr.String(), remoteAddr.Port)\n\n\t\t// Send something unroutable if nothing suitable.\n\t\tvar ip net.IP\n\t\tif remoteAddr.IsTorV3() {\n\t\t\tip = net.IPv4zero\n\t\t} else {\n\t\t\tremoteLna := remoteAddr.ToLegacy()\n\t\t\tif !IsIPv4(remoteLna) && !IsOnionCatTor(remoteLna) {\n\t\t\t\tip = net.IPv6zero\n\t\t\t} else {\n\t\t\t\tip = net.IPv4zero\n\t\t\t}\n\t\t}\n\t\tservices := wire.SFNodeNetwork | wire.SFNodeWitness | wire.SFNodeBloom\n\t\tbestAddress = wire.NetAddressV2FromBytes(\n\t\t\ttime.Now(), services, ip, 0,\n\t\t)\n\t}\n\n\treturn bestAddress\n}\n\n// New returns a new bitcoin address manager.\n// Use Start to begin processing asynchronous address updates.\nfunc New(dataDir string, lookupFunc func(string) ([]net.IP, error)) *AddrManager {\n\tam := AddrManager{\n\t\tpeersFile:      filepath.Join(dataDir, \"peers.json\"),\n\t\tlookupFunc:     lookupFunc,\n\t\trand:           rand.New(rand.NewSource(time.Now().UnixNano())),\n\t\tquit:           make(chan struct{}),\n\t\tlocalAddresses: make(map[string]*localAddress),\n\t\tversion:        serialisationVersion,\n\t}\n\tam.reset()\n\treturn &am\n}\n"
  },
  {
    "path": "addrmgr/addrmanager_internal_test.go",
    "content": "package addrmgr\n\nimport (\n\t\"math/rand\"\n\t\"net\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// randAddr generates a *wire.NetAddressV2 backed by a random IPv4/IPv6\n// address.  Some of the returned addresses may not be routable.\nfunc randAddr(t *testing.T) *wire.NetAddressV2 {\n\tt.Helper()\n\n\tipv4 := rand.Intn(2) == 0\n\tvar ip net.IP\n\tif ipv4 {\n\t\tvar b [4]byte\n\t\tif _, err := rand.Read(b[:]); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tip = b[:]\n\t} else {\n\t\tvar b [16]byte\n\t\tif _, err := rand.Read(b[:]); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tip = b[:]\n\t}\n\n\tservices := wire.ServiceFlag(rand.Uint64())\n\tport := uint16(rand.Uint32())\n\n\treturn wire.NetAddressV2FromBytes(\n\t\ttime.Now(), services, ip, port,\n\t)\n}\n\n// routableRandAddr generates a *wire.NetAddressV2 backed by a random IPv4/IPv6\n// address that is always routable.\nfunc routableRandAddr(t *testing.T) *wire.NetAddressV2 {\n\tt.Helper()\n\n\tvar addr *wire.NetAddressV2\n\n\t// If the address is not routable, try again.\n\troutable := false\n\tfor !routable {\n\t\taddr = randAddr(t)\n\t\troutable = IsRoutable(addr)\n\t}\n\n\treturn addr\n}\n\n// assertAddr ensures that the two addresses match. The timestamp is not\n// checked as it does not affect uniquely identifying a specific address.\nfunc assertAddr(t *testing.T, got, expected *wire.NetAddressV2) {\n\tif got.Services != expected.Services {\n\t\tt.Fatalf(\"expected address services %v, got %v\",\n\t\t\texpected.Services, got.Services)\n\t}\n\tgotAddr := got.Addr.String()\n\texpectedAddr := expected.Addr.String()\n\tif gotAddr != expectedAddr {\n\t\tt.Fatalf(\"expected address IP %v, got %v\", expectedAddr,\n\t\t\tgotAddr)\n\t}\n\tif got.Port != expected.Port {\n\t\tt.Fatalf(\"expected address port %d, got %d\", expected.Port,\n\t\t\tgot.Port)\n\t}\n}\n\n// assertAddrs ensures that the manager's address cache matches the given\n// expected addresses.\nfunc assertAddrs(t *testing.T, addrMgr *AddrManager,\n\texpectedAddrs map[string]*wire.NetAddressV2) {\n\n\tt.Helper()\n\n\taddrs := addrMgr.getAddresses()\n\n\tif len(addrs) != len(expectedAddrs) {\n\t\tt.Fatalf(\"expected to find %d addresses, found %d\",\n\t\t\tlen(expectedAddrs), len(addrs))\n\t}\n\n\tfor _, addr := range addrs {\n\t\taddrStr := NetAddressKey(addr)\n\t\texpectedAddr, ok := expectedAddrs[addrStr]\n\t\tif !ok {\n\t\t\tt.Fatalf(\"expected to find address %v\", addrStr)\n\t\t}\n\n\t\tassertAddr(t, addr, expectedAddr)\n\t}\n}\n\n// TestAddrManagerSerialization ensures that we can properly serialize and\n// deserialize the manager's current address cache.\nfunc TestAddrManagerSerialization(t *testing.T) {\n\tt.Parallel()\n\n\t// We'll start by creating our address manager backed by a temporary\n\t// directory.\n\ttempDir := t.TempDir()\n\n\taddrMgr := New(tempDir, nil)\n\n\t// We'll be adding 5 random addresses to the manager.\n\tconst numAddrs = 5\n\n\texpectedAddrs := make(map[string]*wire.NetAddressV2, numAddrs)\n\tfor i := 0; i < numAddrs; i++ {\n\t\taddr := routableRandAddr(t)\n\t\texpectedAddrs[NetAddressKey(addr)] = addr\n\t\taddrMgr.AddAddress(addr, routableRandAddr(t))\n\t}\n\n\t// Now that the addresses have been added, we should be able to retrieve\n\t// them.\n\tassertAddrs(t, addrMgr, expectedAddrs)\n\n\t// Then, we'll persist these addresses to disk and restart the address\n\t// manager.\n\taddrMgr.savePeers()\n\taddrMgr = New(tempDir, nil)\n\n\t// Finally, we'll read all of the addresses from disk and ensure they\n\t// match as expected.\n\taddrMgr.loadPeers()\n\tassertAddrs(t, addrMgr, expectedAddrs)\n}\n\n// TestAddrManagerV1ToV2 ensures that we can properly upgrade the serialized\n// version of the address manager from v1 to v2.\nfunc TestAddrManagerV1ToV2(t *testing.T) {\n\tt.Parallel()\n\n\t// We'll start by creating our address manager backed by a temporary\n\t// directory.\n\ttempDir := t.TempDir()\n\n\taddrMgr := New(tempDir, nil)\n\n\t// As we're interested in testing the upgrade path from v1 to v2, we'll\n\t// override the manager's current version.\n\taddrMgr.version = 1\n\n\t// We'll be adding 5 random addresses to the manager. Since this is v1,\n\t// each addresses' services will not be stored.\n\tconst numAddrs = 5\n\n\texpectedAddrs := make(map[string]*wire.NetAddressV2, numAddrs)\n\tfor i := 0; i < numAddrs; i++ {\n\t\taddr := routableRandAddr(t)\n\t\texpectedAddrs[NetAddressKey(addr)] = addr\n\t\taddrMgr.AddAddress(addr, routableRandAddr(t))\n\t}\n\n\t// Then, we'll persist these addresses to disk and restart the address\n\t// manager - overriding its version back to v1.\n\taddrMgr.savePeers()\n\taddrMgr = New(tempDir, nil)\n\taddrMgr.version = 1\n\n\t// When we read all of the addresses back from disk, we should expect to\n\t// find all of them, but their services will be set to a default of\n\t// SFNodeNetwork since they were not previously stored. After ensuring\n\t// that this default is set, we'll override each addresses' services\n\t// with the original value from when they were created.\n\taddrMgr.loadPeers()\n\taddrs := addrMgr.getAddresses()\n\tif len(addrs) != len(expectedAddrs) {\n\t\tt.Fatalf(\"expected to find %d addresses, found %d\",\n\t\t\tlen(expectedAddrs), len(addrs))\n\t}\n\tfor _, addr := range addrs {\n\t\taddrStr := NetAddressKey(addr)\n\t\texpectedAddr, ok := expectedAddrs[addrStr]\n\t\tif !ok {\n\t\t\tt.Fatalf(\"expected to find address %v\", addrStr)\n\t\t}\n\n\t\tif addr.Services != wire.SFNodeNetwork {\n\t\t\tt.Fatalf(\"expected address services to be %v, got %v\",\n\t\t\t\twire.SFNodeNetwork, addr.Services)\n\t\t}\n\n\t\taddrMgr.SetServices(addr, expectedAddr.Services)\n\t}\n\n\t// We'll also bump up the manager's version to v2, which should signal\n\t// that it should include the address services when persisting its\n\t// state.\n\taddrMgr.version = 2\n\taddrMgr.savePeers()\n\n\t// Finally, we'll recreate the manager and ensure that the services were\n\t// persisted correctly.\n\taddrMgr = New(tempDir, nil)\n\taddrMgr.loadPeers()\n\tassertAddrs(t, addrMgr, expectedAddrs)\n}\n"
  },
  {
    "path": "addrmgr/addrmanager_test.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage addrmgr_test\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/addrmgr\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// naTest is used to describe a test to be performed against the NetAddressKey\n// method.\ntype naTest struct {\n\tin   wire.NetAddressV2\n\twant string\n}\n\n// naTests houses all of the tests to be performed against the NetAddressKey\n// method.\nvar naTests = make([]naTest, 0)\n\n// Put some IP in here for convenience. Points to google.\nvar someIP = \"173.194.115.66\"\n\n// addNaTests\nfunc addNaTests() {\n\t// IPv4\n\t// Localhost\n\taddNaTest(\"127.0.0.1\", 8333, \"127.0.0.1:8333\")\n\taddNaTest(\"127.0.0.1\", 8334, \"127.0.0.1:8334\")\n\n\t// Class A\n\taddNaTest(\"1.0.0.1\", 8333, \"1.0.0.1:8333\")\n\taddNaTest(\"2.2.2.2\", 8334, \"2.2.2.2:8334\")\n\taddNaTest(\"27.253.252.251\", 8335, \"27.253.252.251:8335\")\n\taddNaTest(\"123.3.2.1\", 8336, \"123.3.2.1:8336\")\n\n\t// Private Class A\n\taddNaTest(\"10.0.0.1\", 8333, \"10.0.0.1:8333\")\n\taddNaTest(\"10.1.1.1\", 8334, \"10.1.1.1:8334\")\n\taddNaTest(\"10.2.2.2\", 8335, \"10.2.2.2:8335\")\n\taddNaTest(\"10.10.10.10\", 8336, \"10.10.10.10:8336\")\n\n\t// Class B\n\taddNaTest(\"128.0.0.1\", 8333, \"128.0.0.1:8333\")\n\taddNaTest(\"129.1.1.1\", 8334, \"129.1.1.1:8334\")\n\taddNaTest(\"180.2.2.2\", 8335, \"180.2.2.2:8335\")\n\taddNaTest(\"191.10.10.10\", 8336, \"191.10.10.10:8336\")\n\n\t// Private Class B\n\taddNaTest(\"172.16.0.1\", 8333, \"172.16.0.1:8333\")\n\taddNaTest(\"172.16.1.1\", 8334, \"172.16.1.1:8334\")\n\taddNaTest(\"172.16.2.2\", 8335, \"172.16.2.2:8335\")\n\taddNaTest(\"172.16.172.172\", 8336, \"172.16.172.172:8336\")\n\n\t// Class C\n\taddNaTest(\"193.0.0.1\", 8333, \"193.0.0.1:8333\")\n\taddNaTest(\"200.1.1.1\", 8334, \"200.1.1.1:8334\")\n\taddNaTest(\"205.2.2.2\", 8335, \"205.2.2.2:8335\")\n\taddNaTest(\"223.10.10.10\", 8336, \"223.10.10.10:8336\")\n\n\t// Private Class C\n\taddNaTest(\"192.168.0.1\", 8333, \"192.168.0.1:8333\")\n\taddNaTest(\"192.168.1.1\", 8334, \"192.168.1.1:8334\")\n\taddNaTest(\"192.168.2.2\", 8335, \"192.168.2.2:8335\")\n\taddNaTest(\"192.168.192.192\", 8336, \"192.168.192.192:8336\")\n\n\t// IPv6\n\t// Localhost\n\taddNaTest(\"::1\", 8333, \"[::1]:8333\")\n\taddNaTest(\"fe80::1\", 8334, \"[fe80::1]:8334\")\n\n\t// Link-local\n\taddNaTest(\"fe80::1:1\", 8333, \"[fe80::1:1]:8333\")\n\taddNaTest(\"fe91::2:2\", 8334, \"[fe91::2:2]:8334\")\n\taddNaTest(\"fea2::3:3\", 8335, \"[fea2::3:3]:8335\")\n\taddNaTest(\"feb3::4:4\", 8336, \"[feb3::4:4]:8336\")\n\n\t// Site-local\n\taddNaTest(\"fec0::1:1\", 8333, \"[fec0::1:1]:8333\")\n\taddNaTest(\"fed1::2:2\", 8334, \"[fed1::2:2]:8334\")\n\taddNaTest(\"fee2::3:3\", 8335, \"[fee2::3:3]:8335\")\n\taddNaTest(\"fef3::4:4\", 8336, \"[fef3::4:4]:8336\")\n}\n\nfunc addNaTest(ip string, port uint16, want string) {\n\tnip := net.ParseIP(ip)\n\tna := wire.NetAddressV2FromBytes(\n\t\ttime.Now(), wire.SFNodeNetwork, nip, port,\n\t)\n\ttest := naTest{*na, want}\n\tnaTests = append(naTests, test)\n}\n\nfunc lookupFunc(host string) ([]net.IP, error) {\n\treturn nil, errors.New(\"not implemented\")\n}\n\nfunc TestStartStop(t *testing.T) {\n\tn := addrmgr.New(\"teststartstop\", lookupFunc)\n\tn.Start()\n\terr := n.Stop()\n\tif err != nil {\n\t\tt.Fatalf(\"Address Manager failed to stop: %v\", err)\n\t}\n}\n\nfunc TestAddAddressByIP(t *testing.T) {\n\tfmtErr := fmt.Errorf(\"\")\n\taddrErr := &net.AddrError{}\n\tvar tests = []struct {\n\t\taddrIP string\n\t\terr    error\n\t}{\n\t\t{\n\t\t\tsomeIP + \":8333\",\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\tsomeIP,\n\t\t\taddrErr,\n\t\t},\n\t\t{\n\t\t\tsomeIP[:12] + \":8333\",\n\t\t\tfmtErr,\n\t\t},\n\t\t{\n\t\t\tsomeIP + \":abcd\",\n\t\t\tfmtErr,\n\t\t},\n\t}\n\n\tamgr := addrmgr.New(\"testaddressbyip\", nil)\n\tfor i, test := range tests {\n\t\terr := amgr.AddAddressByIP(test.addrIP)\n\t\tif test.err != nil && err == nil {\n\t\t\tt.Errorf(\"TestGood test %d failed expected an error and got none\", i)\n\t\t\tcontinue\n\t\t}\n\t\tif test.err == nil && err != nil {\n\t\t\tt.Errorf(\"TestGood test %d failed expected no error and got one\", i)\n\t\t\tcontinue\n\t\t}\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"TestGood test %d failed got %v, want %v\", i,\n\t\t\t\treflect.TypeOf(err), reflect.TypeOf(test.err))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc TestAddLocalAddress(t *testing.T) {\n\tvar tests = []struct {\n\t\taddress  wire.NetAddressV2\n\t\tpriority addrmgr.AddressPriority\n\t\tvalid    bool\n\t}{\n\t\t{\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"192.168.0.100\"), 0,\n\t\t\t),\n\t\t\taddrmgr.InterfacePrio,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"204.124.1.1\"), 0,\n\t\t\t),\n\t\t\taddrmgr.InterfacePrio,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"204.124.1.1\"), 0,\n\t\t\t),\n\t\t\taddrmgr.BoundPrio,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"::1\"), 0,\n\t\t\t),\n\t\t\taddrmgr.InterfacePrio,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"fe80::1\"), 0,\n\t\t\t),\n\t\t\taddrmgr.InterfacePrio,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"2620:100::1\"), 0,\n\t\t\t),\n\t\t\taddrmgr.InterfacePrio,\n\t\t\ttrue,\n\t\t},\n\t}\n\tamgr := addrmgr.New(\"testaddlocaladdress\", nil)\n\tfor x, test := range tests {\n\t\tresult := amgr.AddLocalAddress(&test.address, test.priority)\n\t\tif result == nil && !test.valid {\n\t\t\tt.Errorf(\"TestAddLocalAddress test #%d failed: %s should have \"+\n\t\t\t\t\"been accepted\", x, test.address.Addr.String())\n\t\t\tcontinue\n\t\t}\n\t\tif result != nil && test.valid {\n\t\t\tt.Errorf(\"TestAddLocalAddress test #%d failed: %s should not have \"+\n\t\t\t\t\"been accepted\", x, test.address.Addr.String())\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc TestAttempt(t *testing.T) {\n\tn := addrmgr.New(\"testattempt\", lookupFunc)\n\n\t// Add a new address and get it\n\terr := n.AddAddressByIP(someIP + \":8333\")\n\tif err != nil {\n\t\tt.Fatalf(\"Adding address failed: %v\", err)\n\t}\n\tka := n.GetAddress()\n\n\tif !ka.LastAttempt().IsZero() {\n\t\tt.Errorf(\"Address should not have attempts, but does\")\n\t}\n\n\tna := ka.NetAddress()\n\tn.Attempt(na)\n\n\tif ka.LastAttempt().IsZero() {\n\t\tt.Errorf(\"Address should have an attempt, but does not\")\n\t}\n}\n\nfunc TestConnected(t *testing.T) {\n\tn := addrmgr.New(\"testconnected\", lookupFunc)\n\n\t// Add a new address and get it\n\terr := n.AddAddressByIP(someIP + \":8333\")\n\tif err != nil {\n\t\tt.Fatalf(\"Adding address failed: %v\", err)\n\t}\n\tka := n.GetAddress()\n\tna := ka.NetAddress()\n\t// make it an hour ago\n\tna.Timestamp = time.Unix(time.Now().Add(time.Hour*-1).Unix(), 0)\n\n\tn.Connected(na)\n\n\tif !ka.NetAddress().Timestamp.After(na.Timestamp) {\n\t\tt.Errorf(\"Address should have a new timestamp, but does not\")\n\t}\n}\n\nfunc TestNeedMoreAddresses(t *testing.T) {\n\tn := addrmgr.New(\"testneedmoreaddresses\", lookupFunc)\n\taddrsToAdd := 1500\n\tb := n.NeedMoreAddresses()\n\tif !b {\n\t\tt.Errorf(\"Expected that we need more addresses\")\n\t}\n\taddrs := make([]*wire.NetAddressV2, addrsToAdd)\n\n\tvar err error\n\tfor i := 0; i < addrsToAdd; i++ {\n\t\ts := fmt.Sprintf(\"%d.%d.173.147:8333\", i/128+60, i%128+60)\n\t\taddrs[i], err = n.DeserializeNetAddress(s, wire.SFNodeNetwork)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to turn %s into an address: %v\", s, err)\n\t\t}\n\t}\n\n\tsrcAddr := wire.NetAddressV2FromBytes(\n\t\ttime.Now(), 0, net.IPv4(173, 144, 173, 111), 8333,\n\t)\n\n\tn.AddAddresses(addrs, srcAddr)\n\tnumAddrs := n.NumAddresses()\n\tif numAddrs > addrsToAdd {\n\t\tt.Errorf(\"Number of addresses is too many %d vs %d\", numAddrs, addrsToAdd)\n\t}\n\n\tb = n.NeedMoreAddresses()\n\tif b {\n\t\tt.Errorf(\"Expected that we don't need more addresses\")\n\t}\n}\n\nfunc TestGood(t *testing.T) {\n\tn := addrmgr.New(\"testgood\", lookupFunc)\n\taddrsToAdd := 64 * 64\n\taddrs := make([]*wire.NetAddressV2, addrsToAdd)\n\n\tvar err error\n\tfor i := 0; i < addrsToAdd; i++ {\n\t\ts := fmt.Sprintf(\"%d.173.147.%d:8333\", i/64+60, i%64+60)\n\t\taddrs[i], err = n.DeserializeNetAddress(s, wire.SFNodeNetwork)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to turn %s into an address: %v\", s, err)\n\t\t}\n\t}\n\n\tsrcAddr := wire.NetAddressV2FromBytes(\n\t\ttime.Now(), 0, net.IPv4(173, 144, 173, 111), 8333,\n\t)\n\n\tn.AddAddresses(addrs, srcAddr)\n\tfor _, addr := range addrs {\n\t\tn.Good(addr)\n\t}\n\n\tnumAddrs := n.NumAddresses()\n\tif numAddrs >= addrsToAdd {\n\t\tt.Errorf(\"Number of addresses is too many: %d vs %d\", numAddrs, addrsToAdd)\n\t}\n\n\tnumCache := len(n.AddressCache())\n\tif numCache >= numAddrs/4 {\n\t\tt.Errorf(\"Number of addresses in cache: got %d, want %d\", numCache, numAddrs/4)\n\t}\n}\n\nfunc TestGetAddress(t *testing.T) {\n\tn := addrmgr.New(\"testgetaddress\", lookupFunc)\n\n\t// Get an address from an empty set (should error)\n\tif rv := n.GetAddress(); rv != nil {\n\t\tt.Errorf(\"GetAddress failed: got: %v want: %v\\n\", rv, nil)\n\t}\n\n\t// Add a new address and get it\n\terr := n.AddAddressByIP(someIP + \":8333\")\n\tif err != nil {\n\t\tt.Fatalf(\"Adding address failed: %v\", err)\n\t}\n\tka := n.GetAddress()\n\tif ka == nil {\n\t\tt.Fatalf(\"Did not get an address where there is one in the pool\")\n\t}\n\tif ka.NetAddress().Addr.String() != someIP {\n\t\tt.Errorf(\"Wrong IP: got %v, want %v\", ka.NetAddress().Addr.String(), someIP)\n\t}\n\n\t// Mark this as a good address and get it\n\tn.Good(ka.NetAddress())\n\tka = n.GetAddress()\n\tif ka == nil {\n\t\tt.Fatalf(\"Did not get an address where there is one in the pool\")\n\t}\n\tif ka.NetAddress().Addr.String() != someIP {\n\t\tt.Errorf(\"Wrong IP: got %v, want %v\", ka.NetAddress().Addr.String(), someIP)\n\t}\n\n\tnumAddrs := n.NumAddresses()\n\tif numAddrs != 1 {\n\t\tt.Errorf(\"Wrong number of addresses: got %d, want %d\", numAddrs, 1)\n\t}\n}\n\nfunc TestGetBestLocalAddress(t *testing.T) {\n\tlocalAddrs := []wire.NetAddressV2{\n\t\t*wire.NetAddressV2FromBytes(\n\t\t\ttime.Now(), 0, net.ParseIP(\"192.168.0.100\"), 0,\n\t\t),\n\t\t*wire.NetAddressV2FromBytes(\n\t\t\ttime.Now(), 0, net.ParseIP(\"::1\"), 0,\n\t\t),\n\t\t*wire.NetAddressV2FromBytes(\n\t\t\ttime.Now(), 0, net.ParseIP(\"fe80::1\"), 0,\n\t\t),\n\t\t*wire.NetAddressV2FromBytes(\n\t\t\ttime.Now(), 0, net.ParseIP(\"2001:470::1\"), 0,\n\t\t),\n\t}\n\n\tvar tests = []struct {\n\t\tremoteAddr wire.NetAddressV2\n\t\twant0      wire.NetAddressV2\n\t\twant1      wire.NetAddressV2\n\t\twant2      wire.NetAddressV2\n\t\twant3      wire.NetAddressV2\n\t}{\n\t\t{\n\t\t\t// Remote connection from public IPv4\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"204.124.8.1\"), 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.IPv4zero, 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.IPv4zero, 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"204.124.8.100\"), 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0,\n\t\t\t\tnet.ParseIP(\"fd87:d87e:eb43:25::1\"), 0,\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\t// Remote connection from private IPv4\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"172.16.0.254\"), 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.IPv4zero, 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.IPv4zero, 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.IPv4zero, 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.IPv4zero, 0,\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\t// Remote connection from public IPv6\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0,\n\t\t\t\tnet.ParseIP(\"2602:100:abcd::102\"), 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.IPv6zero, 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"2001:470::1\"), 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"2001:470::1\"), 0,\n\t\t\t),\n\t\t\t*wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), 0, net.ParseIP(\"2001:470::1\"), 0,\n\t\t\t),\n\t\t},\n\t\t/* XXX\n\t\t{\n\t\t\t// Remote connection from Tor\n\t\t\twire.NetAddress{IP: net.ParseIP(\"fd87:d87e:eb43::100\")},\n\t\t\twire.NetAddress{IP: net.IPv4zero},\n\t\t\twire.NetAddress{IP: net.ParseIP(\"204.124.8.100\")},\n\t\t\twire.NetAddress{IP: net.ParseIP(\"fd87:d87e:eb43:25::1\")},\n\t\t},\n\t\t*/\n\t}\n\n\tamgr := addrmgr.New(\"testgetbestlocaladdress\", nil)\n\n\t// Test against default when there's no address\n\tfor x, test := range tests {\n\t\tgot := amgr.GetBestLocalAddress(&test.remoteAddr)\n\t\twantAddr := test.want0.Addr.String()\n\t\tgotAddr := got.Addr.String()\n\t\tif wantAddr != gotAddr {\n\t\t\tremoteAddr := test.remoteAddr.Addr.String()\n\t\t\tt.Errorf(\"TestGetBestLocalAddress test1 #%d failed for remote address %s: want %s got %s\",\n\t\t\t\tx, remoteAddr, wantAddr, gotAddr)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tfor _, localAddr := range localAddrs {\n\t\tamgr.AddLocalAddress(&localAddr, addrmgr.InterfacePrio)\n\t}\n\n\t// Test against want1\n\tfor x, test := range tests {\n\t\tgot := amgr.GetBestLocalAddress(&test.remoteAddr)\n\t\twantAddr := test.want1.Addr.String()\n\t\tgotAddr := got.Addr.String()\n\t\tif wantAddr != gotAddr {\n\t\t\tremoteAddr := test.remoteAddr.Addr.String()\n\t\t\tt.Errorf(\"TestGetBestLocalAddress test1 #%d failed for remote address %s: want %s got %s\",\n\t\t\t\tx, remoteAddr, wantAddr, gotAddr)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// Add a public IP to the list of local addresses.\n\tlocalAddr := wire.NetAddressV2FromBytes(\n\t\ttime.Now(), 0, net.ParseIP(\"204.124.8.100\"), 0,\n\t)\n\tamgr.AddLocalAddress(localAddr, addrmgr.InterfacePrio)\n\n\t// Test against want2\n\tfor x, test := range tests {\n\t\tgot := amgr.GetBestLocalAddress(&test.remoteAddr)\n\t\twantAddr := test.want2.Addr.String()\n\t\tgotAddr := got.Addr.String()\n\t\tif wantAddr != gotAddr {\n\t\t\tremoteAddr := test.remoteAddr.Addr.String()\n\t\t\tt.Errorf(\"TestGetBestLocalAddress test2 #%d failed for remote address %s: want %s got %s\",\n\t\t\t\tx, remoteAddr, wantAddr, gotAddr)\n\t\t\tcontinue\n\t\t}\n\t}\n\t/*\n\t\t// Add a Tor generated IP address\n\t\tlocalAddr = wire.NetAddress{IP: net.ParseIP(\"fd87:d87e:eb43:25::1\")}\n\t\tamgr.AddLocalAddress(&localAddr, addrmgr.ManualPrio)\n\n\t\t// Test against want3\n\t\tfor x, test := range tests {\n\t\t\tgot := amgr.GetBestLocalAddress(&test.remoteAddr)\n\t\t\tif !test.want3.IP.Equal(got.IP) {\n\t\t\t\tt.Errorf(\"TestGetBestLocalAddress test3 #%d failed for remote address %s: want %s got %s\",\n\t\t\t\t\tx, test.remoteAddr.IP, test.want3.IP, got.IP)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t*/\n}\n\nfunc TestNetAddressKey(t *testing.T) {\n\taddNaTests()\n\n\tt.Logf(\"Running %d tests\", len(naTests))\n\tfor i, test := range naTests {\n\t\tkey := addrmgr.NetAddressKey(&test.in)\n\t\tif key != test.want {\n\t\t\tt.Errorf(\"NetAddressKey #%d\\n got: %s want: %s\", i, key, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "addrmgr/cov_report.sh",
    "content": "#!/bin/sh\n\n# This script uses the standard Go test coverage tools to generate a test coverage report.\n\n# Run tests with coverage enabled and generate coverage profile.\ngo test -cover -coverprofile=coverage.txt ./...\n\n# Display function-level coverage statistics.\ngo tool cover -func=coverage.txt\n"
  },
  {
    "path": "addrmgr/doc.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage addrmgr implements concurrency safe Bitcoin address manager.\n\n# Address Manager Overview\n\nIn order maintain the peer-to-peer Bitcoin network, there needs to be a source\nof addresses to connect to as nodes come and go.  The Bitcoin protocol provides\nthe getaddr and addr messages to allow peers to communicate known addresses with\neach other.  However, there needs to a mechanism to store those results and\nselect peers from them.  It is also important to note that remote peers can't\nbe trusted to send valid peers nor attempt to provide you with only peers they\ncontrol with malicious intent.\n\nWith that in mind, this package provides a concurrency safe address manager for\ncaching and selecting peers in a non-deterministic manner.  The general idea is\nthe caller adds addresses to the address manager and notifies it when addresses\nare connected, known good, and attempted.  The caller also requests addresses as\nit needs them.\n\nThe address manager internally segregates the addresses into groups and\nnon-deterministically selects groups in a cryptographically random manner.  This\nreduce the chances multiple addresses from the same nets are selected which\ngenerally helps provide greater peer diversity, and perhaps more importantly,\ndrastically reduces the chances an attacker is able to coerce your peer into\nonly connecting to nodes they control.\n\nThe address manager also understands routability and Tor addresses and tries\nhard to only return routable addresses.  In addition, it uses the information\nprovided by the caller about connected, known good, and attempted addresses to\nperiodically purge peers which no longer appear to be good peers as well as\nbias the selection toward known good peers.  The general idea is to make a best\neffort at only providing usable addresses.\n*/\npackage addrmgr\n"
  },
  {
    "path": "addrmgr/internal_test.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage addrmgr\n\nimport (\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nfunc TstKnownAddressIsBad(ka *KnownAddress) bool {\n\treturn ka.isBad()\n}\n\nfunc TstKnownAddressChance(ka *KnownAddress) float64 {\n\treturn ka.chance()\n}\n\nfunc TstNewKnownAddress(na *wire.NetAddressV2, attempts int,\n\tlastattempt, lastsuccess time.Time, tried bool, refs int) *KnownAddress {\n\treturn &KnownAddress{na: na, attempts: attempts, lastattempt: lastattempt,\n\t\tlastsuccess: lastsuccess, tried: tried, refs: refs}\n}\n"
  },
  {
    "path": "addrmgr/knownaddress.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage addrmgr\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// KnownAddress tracks information about a known network address that is used\n// to determine how viable an address is.\ntype KnownAddress struct {\n\tmtx         sync.RWMutex // na and lastattempt\n\tna          *wire.NetAddressV2\n\tsrcAddr     *wire.NetAddressV2\n\tattempts    int\n\tlastattempt time.Time\n\tlastsuccess time.Time\n\ttried       bool\n\trefs        int // reference count of new buckets\n}\n\n// NetAddress returns the underlying wire.NetAddressV2 associated with the\n// known address.\nfunc (ka *KnownAddress) NetAddress() *wire.NetAddressV2 {\n\tka.mtx.RLock()\n\tdefer ka.mtx.RUnlock()\n\treturn ka.na\n}\n\n// LastAttempt returns the last time the known address was attempted.\nfunc (ka *KnownAddress) LastAttempt() time.Time {\n\tka.mtx.RLock()\n\tdefer ka.mtx.RUnlock()\n\treturn ka.lastattempt\n}\n\n// Services returns the services supported by the peer with the known address.\nfunc (ka *KnownAddress) Services() wire.ServiceFlag {\n\tka.mtx.RLock()\n\tdefer ka.mtx.RUnlock()\n\treturn ka.na.Services\n}\n\n// The unexported methods, chance and isBad, are used from within AddrManager\n// where KnownAddress field access is synchronized via it's own Mutex.\n\n// chance returns the selection probability for a known address.  The priority\n// depends upon how recently the address has been seen, how recently it was last\n// attempted and how often attempts to connect to it have failed.\nfunc (ka *KnownAddress) chance() float64 {\n\tnow := time.Now()\n\tlastAttempt := now.Sub(ka.lastattempt)\n\n\tif lastAttempt < 0 {\n\t\tlastAttempt = 0\n\t}\n\n\tc := 1.0\n\n\t// Very recent attempts are less likely to be retried.\n\tif lastAttempt < 10*time.Minute {\n\t\tc *= 0.01\n\t}\n\n\t// Failed attempts deprioritise.\n\tfor i := ka.attempts; i > 0; i-- {\n\t\tc /= 1.5\n\t}\n\n\treturn c\n}\n\n// isBad returns true if the address in question has not been tried in the last\n// minute and meets one of the following criteria:\n// 1) It claims to be from the future\n// 2) It hasn't been seen in over a month\n// 3) It has failed at least three times and never succeeded\n// 4) It has failed ten times in the last week\n// All addresses that meet these criteria are assumed to be worthless and not\n// worth keeping hold of.\nfunc (ka *KnownAddress) isBad() bool {\n\tif ka.lastattempt.After(time.Now().Add(-1 * time.Minute)) {\n\t\treturn false\n\t}\n\n\t// From the future?\n\tif ka.na.Timestamp.After(time.Now().Add(10 * time.Minute)) {\n\t\treturn true\n\t}\n\n\t// Over a month old?\n\tif ka.na.Timestamp.Before(time.Now().Add(-1 * numMissingDays * time.Hour * 24)) {\n\t\treturn true\n\t}\n\n\t// Never succeeded?\n\tif ka.lastsuccess.IsZero() && ka.attempts >= numRetries {\n\t\treturn true\n\t}\n\n\t// Hasn't succeeded in too long?\n\tif !ka.lastsuccess.After(time.Now().Add(-1*minBadDays*time.Hour*24)) &&\n\t\tka.attempts >= maxFailures {\n\t\treturn true\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "addrmgr/knownaddress_test.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage addrmgr_test\n\nimport (\n\t\"math\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/addrmgr\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nfunc TestChance(t *testing.T) {\n\tnow := time.Unix(time.Now().Unix(), 0)\n\tvar tests = []struct {\n\t\taddr     *addrmgr.KnownAddress\n\t\texpected float64\n\t}{\n\t\t{\n\t\t\t//Test normal case\n\t\t\taddrmgr.TstNewKnownAddress(&wire.NetAddressV2{Timestamp: now.Add(-35 * time.Second)},\n\t\t\t\t0, time.Now().Add(-30*time.Minute), time.Now(), false, 0),\n\t\t\t1.0,\n\t\t}, {\n\t\t\t//Test case in which lastseen < 0\n\t\t\taddrmgr.TstNewKnownAddress(&wire.NetAddressV2{Timestamp: now.Add(20 * time.Second)},\n\t\t\t\t0, time.Now().Add(-30*time.Minute), time.Now(), false, 0),\n\t\t\t1.0,\n\t\t}, {\n\t\t\t//Test case in which lastattempt < 0\n\t\t\taddrmgr.TstNewKnownAddress(&wire.NetAddressV2{Timestamp: now.Add(-35 * time.Second)},\n\t\t\t\t0, time.Now().Add(30*time.Minute), time.Now(), false, 0),\n\t\t\t1.0 * .01,\n\t\t}, {\n\t\t\t//Test case in which lastattempt < ten minutes\n\t\t\taddrmgr.TstNewKnownAddress(&wire.NetAddressV2{Timestamp: now.Add(-35 * time.Second)},\n\t\t\t\t0, time.Now().Add(-5*time.Minute), time.Now(), false, 0),\n\t\t\t1.0 * .01,\n\t\t}, {\n\t\t\t//Test case with several failed attempts.\n\t\t\taddrmgr.TstNewKnownAddress(&wire.NetAddressV2{Timestamp: now.Add(-35 * time.Second)},\n\t\t\t\t2, time.Now().Add(-30*time.Minute), time.Now(), false, 0),\n\t\t\t1 / 1.5 / 1.5,\n\t\t},\n\t}\n\n\terr := .0001\n\tfor i, test := range tests {\n\t\tchance := addrmgr.TstKnownAddressChance(test.addr)\n\t\tif math.Abs(test.expected-chance) >= err {\n\t\t\tt.Errorf(\"case %d: got %f, expected %f\", i, chance, test.expected)\n\t\t}\n\t}\n}\n\nfunc TestIsBad(t *testing.T) {\n\tnow := time.Unix(time.Now().Unix(), 0)\n\tfuture := now.Add(35 * time.Minute)\n\tmonthOld := now.Add(-43 * time.Hour * 24)\n\tsecondsOld := now.Add(-2 * time.Second)\n\tminutesOld := now.Add(-27 * time.Minute)\n\thoursOld := now.Add(-5 * time.Hour)\n\tzeroTime := time.Time{}\n\n\tfutureNa := &wire.NetAddressV2{Timestamp: future}\n\tminutesOldNa := &wire.NetAddressV2{Timestamp: minutesOld}\n\tmonthOldNa := &wire.NetAddressV2{Timestamp: monthOld}\n\tcurrentNa := &wire.NetAddressV2{Timestamp: secondsOld}\n\n\t//Test addresses that have been tried in the last minute.\n\tif addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(futureNa, 3, secondsOld, zeroTime, false, 0)) {\n\t\tt.Errorf(\"test case 1: addresses that have been tried in the last minute are not bad.\")\n\t}\n\tif addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(monthOldNa, 3, secondsOld, zeroTime, false, 0)) {\n\t\tt.Errorf(\"test case 2: addresses that have been tried in the last minute are not bad.\")\n\t}\n\tif addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(currentNa, 3, secondsOld, zeroTime, false, 0)) {\n\t\tt.Errorf(\"test case 3: addresses that have been tried in the last minute are not bad.\")\n\t}\n\tif addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(currentNa, 3, secondsOld, monthOld, true, 0)) {\n\t\tt.Errorf(\"test case 4: addresses that have been tried in the last minute are not bad.\")\n\t}\n\tif addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(currentNa, 2, secondsOld, secondsOld, true, 0)) {\n\t\tt.Errorf(\"test case 5: addresses that have been tried in the last minute are not bad.\")\n\t}\n\n\t//Test address that claims to be from the future.\n\tif !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(futureNa, 0, minutesOld, hoursOld, true, 0)) {\n\t\tt.Errorf(\"test case 6: addresses that claim to be from the future are bad.\")\n\t}\n\n\t//Test address that has not been seen in over a month.\n\tif !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(monthOldNa, 0, minutesOld, hoursOld, true, 0)) {\n\t\tt.Errorf(\"test case 7: addresses more than a month old are bad.\")\n\t}\n\n\t//It has failed at least three times and never succeeded.\n\tif !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(minutesOldNa, 3, minutesOld, zeroTime, true, 0)) {\n\t\tt.Errorf(\"test case 8: addresses that have never succeeded are bad.\")\n\t}\n\n\t//It has failed ten times in the last week\n\tif !addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(minutesOldNa, 10, minutesOld, monthOld, true, 0)) {\n\t\tt.Errorf(\"test case 9: addresses that have not succeeded in too long are bad.\")\n\t}\n\n\t//Test an address that should work.\n\tif addrmgr.TstKnownAddressIsBad(addrmgr.TstNewKnownAddress(minutesOldNa, 2, minutesOld, hoursOld, true, 0)) {\n\t\tt.Errorf(\"test case 10: This should be a valid address.\")\n\t}\n}\n"
  },
  {
    "path": "addrmgr/log.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage addrmgr\n\nimport (\n\t\"github.com/btcsuite/btclog\"\n)\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until either UseLogger or SetLogWriter are called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\n// This should be used in preference to SetLogWriter if the caller is also\n// using btclog.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n"
  },
  {
    "path": "addrmgr/network.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage addrmgr\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nvar (\n\t// rfc1918Nets specifies the IPv4 private address blocks as defined by\n\t// by RFC1918 (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16).\n\trfc1918Nets = []net.IPNet{\n\t\tipNet(\"10.0.0.0\", 8, 32),\n\t\tipNet(\"172.16.0.0\", 12, 32),\n\t\tipNet(\"192.168.0.0\", 16, 32),\n\t}\n\n\t// rfc2544Net specifies the IPv4 block as defined by RFC2544\n\t// (198.18.0.0/15)\n\trfc2544Net = ipNet(\"198.18.0.0\", 15, 32)\n\n\t// rfc3849Net specifies the IPv6 documentation address block as defined\n\t// by RFC3849 (2001:DB8::/32).\n\trfc3849Net = ipNet(\"2001:DB8::\", 32, 128)\n\n\t// rfc3927Net specifies the IPv4 auto configuration address block as\n\t// defined by RFC3927 (169.254.0.0/16).\n\trfc3927Net = ipNet(\"169.254.0.0\", 16, 32)\n\n\t// rfc3964Net specifies the IPv6 to IPv4 encapsulation address block as\n\t// defined by RFC3964 (2002::/16).\n\trfc3964Net = ipNet(\"2002::\", 16, 128)\n\n\t// rfc4193Net specifies the IPv6 unique local address block as defined\n\t// by RFC4193 (FC00::/7).\n\trfc4193Net = ipNet(\"FC00::\", 7, 128)\n\n\t// rfc4380Net specifies the IPv6 teredo tunneling over UDP address block\n\t// as defined by RFC4380 (2001::/32).\n\trfc4380Net = ipNet(\"2001::\", 32, 128)\n\n\t// rfc4843Net specifies the IPv6 ORCHID address block as defined by\n\t// RFC4843 (2001:10::/28).\n\trfc4843Net = ipNet(\"2001:10::\", 28, 128)\n\n\t// rfc7343Net specifies the IPv6 ORCHIDv2 address block as defined by\n\t// RFC7343 (2001:20::/28).\n\trfc7343Net = ipNet(\"2001:20::\", 28, 128)\n\n\t// rfc4862Net specifies the IPv6 stateless address autoconfiguration\n\t// address block as defined by RFC4862 (FE80::/64).\n\trfc4862Net = ipNet(\"FE80::\", 64, 128)\n\n\t// rfc5737Net specifies the IPv4 documentation address blocks as defined\n\t// by RFC5737 (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24)\n\trfc5737Net = []net.IPNet{\n\t\tipNet(\"192.0.2.0\", 24, 32),\n\t\tipNet(\"198.51.100.0\", 24, 32),\n\t\tipNet(\"203.0.113.0\", 24, 32),\n\t}\n\n\t// rfc6052Net specifies the IPv6 well-known prefix address block as\n\t// defined by RFC6052 (64:FF9B::/96).\n\trfc6052Net = ipNet(\"64:FF9B::\", 96, 128)\n\n\t// rfc6145Net specifies the IPv6 to IPv4 translated address range as\n\t// defined by RFC6145 (::FFFF:0:0:0/96).\n\trfc6145Net = ipNet(\"::FFFF:0:0:0\", 96, 128)\n\n\t// rfc6598Net specifies the IPv4 block as defined by RFC6598 (100.64.0.0/10)\n\trfc6598Net = ipNet(\"100.64.0.0\", 10, 32)\n\n\t// onionCatNet defines the IPv6 address block used to support Tor.\n\t// bitcoind encodes a .onion address as a 16 byte number by decoding the\n\t// address prior to the .onion (i.e. the key hash) base32 into a ten\n\t// byte number. It then stores the first 6 bytes of the address as\n\t// 0xfd, 0x87, 0xd8, 0x7e, 0xeb, 0x43.\n\t//\n\t// This is the same range used by OnionCat, which is part part of the\n\t// RFC4193 unique local IPv6 range.\n\t//\n\t// In summary the format is:\n\t// { magic 6 bytes, 10 bytes base32 decode of key hash }\n\tonionCatNet = ipNet(\"fd87:d87e:eb43::\", 48, 128)\n\n\t// zero4Net defines the IPv4 address block for address staring with 0\n\t// (0.0.0.0/8).\n\tzero4Net = ipNet(\"0.0.0.0\", 8, 32)\n\n\t// heNet defines the Hurricane Electric IPv6 address block.\n\theNet = ipNet(\"2001:470::\", 32, 128)\n)\n\n// ipNet returns a net.IPNet struct given the passed IP address string, number\n// of one bits to include at the start of the mask, and the total number of bits\n// for the mask.\nfunc ipNet(ip string, ones, bits int) net.IPNet {\n\treturn net.IPNet{IP: net.ParseIP(ip), Mask: net.CIDRMask(ones, bits)}\n}\n\n// IsIPv4 returns whether or not the given address is an IPv4 address.\nfunc IsIPv4(na *wire.NetAddress) bool {\n\treturn na.IP.To4() != nil\n}\n\n// IsLocal returns whether or not the given address is a local address.\nfunc IsLocal(na *wire.NetAddress) bool {\n\treturn na.IP.IsLoopback() || zero4Net.Contains(na.IP)\n}\n\n// IsOnionCatTor returns whether or not the passed address is in the IPv6 range\n// used by bitcoin to support Tor (fd87:d87e:eb43::/48).  Note that this range\n// is the same range used by OnionCat, which is part of the RFC4193 unique local\n// IPv6 range.\nfunc IsOnionCatTor(na *wire.NetAddress) bool {\n\treturn onionCatNet.Contains(na.IP)\n}\n\n// IsRFC1918 returns whether or not the passed address is part of the IPv4\n// private network address space as defined by RFC1918 (10.0.0.0/8,\n// 172.16.0.0/12, or 192.168.0.0/16).\nfunc IsRFC1918(na *wire.NetAddress) bool {\n\tfor _, rfc := range rfc1918Nets {\n\t\tif rfc.Contains(na.IP) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// IsRFC2544 returns whether or not the passed address is part of the IPv4\n// address space as defined by RFC2544 (198.18.0.0/15)\nfunc IsRFC2544(na *wire.NetAddress) bool {\n\treturn rfc2544Net.Contains(na.IP)\n}\n\n// IsRFC3849 returns whether or not the passed address is part of the IPv6\n// documentation range as defined by RFC3849 (2001:DB8::/32).\nfunc IsRFC3849(na *wire.NetAddress) bool {\n\treturn rfc3849Net.Contains(na.IP)\n}\n\n// IsRFC3927 returns whether or not the passed address is part of the IPv4\n// autoconfiguration range as defined by RFC3927 (169.254.0.0/16).\nfunc IsRFC3927(na *wire.NetAddress) bool {\n\treturn rfc3927Net.Contains(na.IP)\n}\n\n// IsRFC3964 returns whether or not the passed address is part of the IPv6 to\n// IPv4 encapsulation range as defined by RFC3964 (2002::/16).\nfunc IsRFC3964(na *wire.NetAddress) bool {\n\treturn rfc3964Net.Contains(na.IP)\n}\n\n// IsRFC4193 returns whether or not the passed address is part of the IPv6\n// unique local range as defined by RFC4193 (FC00::/7).\nfunc IsRFC4193(na *wire.NetAddress) bool {\n\treturn rfc4193Net.Contains(na.IP)\n}\n\n// IsRFC4380 returns whether or not the passed address is part of the IPv6\n// teredo tunneling over UDP range as defined by RFC4380 (2001::/32).\nfunc IsRFC4380(na *wire.NetAddress) bool {\n\treturn rfc4380Net.Contains(na.IP)\n}\n\n// IsRFC4843 returns whether or not the passed address is part of the IPv6\n// ORCHID range as defined by RFC4843 (2001:10::/28).\nfunc IsRFC4843(na *wire.NetAddress) bool {\n\treturn rfc4843Net.Contains(na.IP)\n}\n\n// IsRFC7343 returns whether or not the passed address is part of the IPv6\n// ORCHIDv2 range as defined by RFC7343 (2001:20::/28).\nfunc IsRFC7343(na *wire.NetAddress) bool {\n\treturn rfc7343Net.Contains(na.IP)\n}\n\n// IsRFC4862 returns whether or not the passed address is part of the IPv6\n// stateless address autoconfiguration range as defined by RFC4862 (FE80::/64).\nfunc IsRFC4862(na *wire.NetAddress) bool {\n\treturn rfc4862Net.Contains(na.IP)\n}\n\n// IsRFC5737 returns whether or not the passed address is part of the IPv4\n// documentation address space as defined by RFC5737 (192.0.2.0/24,\n// 198.51.100.0/24, 203.0.113.0/24)\nfunc IsRFC5737(na *wire.NetAddress) bool {\n\tfor _, rfc := range rfc5737Net {\n\t\tif rfc.Contains(na.IP) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// IsRFC6052 returns whether or not the passed address is part of the IPv6\n// well-known prefix range as defined by RFC6052 (64:FF9B::/96).\nfunc IsRFC6052(na *wire.NetAddress) bool {\n\treturn rfc6052Net.Contains(na.IP)\n}\n\n// IsRFC6145 returns whether or not the passed address is part of the IPv6 to\n// IPv4 translated address range as defined by RFC6145 (::FFFF:0:0:0/96).\nfunc IsRFC6145(na *wire.NetAddress) bool {\n\treturn rfc6145Net.Contains(na.IP)\n}\n\n// IsRFC6598 returns whether or not the passed address is part of the IPv4\n// shared address space specified by RFC6598 (100.64.0.0/10)\nfunc IsRFC6598(na *wire.NetAddress) bool {\n\treturn rfc6598Net.Contains(na.IP)\n}\n\n// IsValid returns whether or not the passed address is valid.  The address is\n// considered invalid under the following circumstances:\n// IPv4: It is either a zero or all bits set address.\n// IPv6: It is either a zero or RFC3849 documentation address.\nfunc IsValid(na *wire.NetAddress) bool {\n\t// IsUnspecified returns if address is 0, so only all bits set, and\n\t// RFC3849 need to be explicitly checked.\n\treturn na.IP != nil && !(na.IP.IsUnspecified() ||\n\t\tna.IP.Equal(net.IPv4bcast))\n}\n\n// IsRoutable returns whether or not the passed address is routable over\n// the public internet.  This is true as long as the address is valid and is not\n// in any reserved ranges.\nfunc IsRoutable(na *wire.NetAddressV2) bool {\n\tif na.IsTorV3() {\n\t\t// na is a torv3 address, return true.\n\t\treturn true\n\t}\n\n\t// Else na can be represented as a legacy NetAddress since i2p and\n\t// cjdns are unsupported.\n\tlna := na.ToLegacy()\n\treturn IsValid(lna) && !(IsRFC1918(lna) || IsRFC2544(lna) ||\n\t\tIsRFC3927(lna) || IsRFC4862(lna) || IsRFC3849(lna) ||\n\t\tIsRFC4843(lna) || IsRFC7343(lna) || IsRFC5737(lna) ||\n\t\tIsRFC6598(lna) || IsLocal(lna) || (IsRFC4193(lna) &&\n\t\t!IsOnionCatTor(lna)))\n}\n\n// GroupKey returns a string representing the network group an address is part\n// of.  This is the /16 for IPv4, the /32 (/36 for he.net) for IPv6, the string\n// \"local\" for a local address, the string \"tor:key\" where key is the /4 of the\n// onion address for Tor address, and the string \"unroutable\" for an unroutable\n// address.\nfunc GroupKey(na *wire.NetAddressV2) string {\n\tif na.IsTorV3() {\n\t\t// na is a torv3 address. Use the same network group keying as\n\t\t// for torv2.\n\t\treturn fmt.Sprintf(\"tor:%d\", na.TorV3Key()&((1<<4)-1))\n\t}\n\n\tlna := na.ToLegacy()\n\n\tif IsLocal(lna) {\n\t\treturn \"local\"\n\t}\n\tif !IsRoutable(na) {\n\t\treturn \"unroutable\"\n\t}\n\tif IsIPv4(lna) {\n\t\treturn lna.IP.Mask(net.CIDRMask(16, 32)).String()\n\t}\n\tif IsRFC6145(lna) || IsRFC6052(lna) {\n\t\t// last four bytes are the ip address\n\t\tip := lna.IP[12:16]\n\t\treturn ip.Mask(net.CIDRMask(16, 32)).String()\n\t}\n\n\tif IsRFC3964(lna) {\n\t\tip := lna.IP[2:6]\n\t\treturn ip.Mask(net.CIDRMask(16, 32)).String()\n\n\t}\n\tif IsRFC4380(lna) {\n\t\t// teredo tunnels have the last 4 bytes as the v4 address XOR\n\t\t// 0xff.\n\t\tip := net.IP(make([]byte, 4))\n\t\tfor i, byte := range lna.IP[12:16] {\n\t\t\tip[i] = byte ^ 0xff\n\t\t}\n\t\treturn ip.Mask(net.CIDRMask(16, 32)).String()\n\t}\n\tif IsOnionCatTor(lna) {\n\t\t// group is keyed off the first 4 bits of the actual onion key.\n\t\treturn fmt.Sprintf(\"tor:%d\", lna.IP[6]&((1<<4)-1))\n\t}\n\n\t// OK, so now we know ourselves to be a IPv6 address.\n\t// bitcoind uses /32 for everything, except for Hurricane Electric's\n\t// (he.net) IP range, which it uses /36 for.\n\tbits := 32\n\tif heNet.Contains(lna.IP) {\n\t\tbits = 36\n\t}\n\n\treturn lna.IP.Mask(net.CIDRMask(bits, 128)).String()\n}\n"
  },
  {
    "path": "addrmgr/network_test.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage addrmgr_test\n\nimport (\n\t\"net\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/addrmgr\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TestIPTypes ensures the various functions which determine the type of an IP\n// address based on RFCs work as intended.\nfunc TestIPTypes(t *testing.T) {\n\ttype ipTest struct {\n\t\tin       wire.NetAddress\n\t\trfc1918  bool\n\t\trfc2544  bool\n\t\trfc3849  bool\n\t\trfc3927  bool\n\t\trfc3964  bool\n\t\trfc4193  bool\n\t\trfc4380  bool\n\t\trfc4843  bool\n\t\trfc4862  bool\n\t\trfc5737  bool\n\t\trfc6052  bool\n\t\trfc6145  bool\n\t\trfc6598  bool\n\t\trfc7343  bool\n\t\tlocal    bool\n\t\tvalid    bool\n\t\troutable bool\n\t}\n\n\tnewIPTest := func(ip string, rfc1918, rfc2544, rfc3849, rfc3927, rfc3964,\n\t\trfc4193, rfc4380, rfc4843, rfc4862, rfc5737, rfc6052, rfc6145, rfc6598,\n\t\trfc7343, local, valid, routable bool) ipTest {\n\t\tnip := net.ParseIP(ip)\n\t\tna := *wire.NewNetAddressIPPort(nip, 8333, wire.SFNodeNetwork)\n\t\ttest := ipTest{na, rfc1918, rfc2544, rfc3849, rfc3927, rfc3964, rfc4193, rfc4380,\n\t\t\trfc4843, rfc4862, rfc5737, rfc6052, rfc6145, rfc6598, rfc7343, local, valid, routable}\n\t\treturn test\n\t}\n\n\ttests := []ipTest{\n\t\tnewIPTest(\"10.255.255.255\", true, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, false, false, true, false),\n\t\tnewIPTest(\"192.168.0.1\", true, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, false, false, true, false),\n\t\tnewIPTest(\"172.31.255.1\", true, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, false, false, true, false),\n\t\tnewIPTest(\"172.32.1.1\", false, false, false, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, true, true),\n\t\tnewIPTest(\"169.254.250.120\", false, false, false, true, false, false,\n\t\t\tfalse, false, false, false, false, false, false, false, false, true, false),\n\t\tnewIPTest(\"0.0.0.0\", false, false, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, true, false, false),\n\t\tnewIPTest(\"255.255.255.255\", false, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, false, false, false, false),\n\t\tnewIPTest(\"127.0.0.1\", false, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, false, true, true, false),\n\t\tnewIPTest(\"fd00:dead::1\", false, false, false, false, false, true,\n\t\t\tfalse, false, false, false, false, false, false, false, false, true, false),\n\t\tnewIPTest(\"2001::1\", false, false, false, false, false, false,\n\t\t\ttrue, false, false, false, false, false, false, false, false, true, true),\n\t\tnewIPTest(\"2001:10:abcd::1:1\", false, false, false, false, false, false,\n\t\t\tfalse, true, false, false, false, false, false, false, false, true, false),\n\t\tnewIPTest(\"2001:20:abcd::1:1\", false, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, true, false, true, false),\n\t\tnewIPTest(\"fe80::1\", false, false, false, false, false, false,\n\t\t\tfalse, false, true, false, false, false, false, false, false, true, false),\n\t\tnewIPTest(\"fe80:1::1\", false, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, false, false, true, true),\n\t\tnewIPTest(\"64:ff9b::1\", false, false, false, false, false, false,\n\t\t\tfalse, false, false, false, true, false, false, false, false, true, true),\n\t\tnewIPTest(\"::ffff:abcd:ef12:1\", false, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, false, false, true, true),\n\t\tnewIPTest(\"::1\", false, false, false, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, true, true, false),\n\t\tnewIPTest(\"198.18.0.1\", false, true, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, false, true, false),\n\t\tnewIPTest(\"100.127.255.1\", false, false, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, true, false, false, true, false),\n\t\tnewIPTest(\"203.0.113.1\", false, false, false, false, false, false, false,\n\t\t\tfalse, false, false, false, false, false, false, false, true, false),\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor _, test := range tests {\n\t\tif rv := addrmgr.IsRFC1918(&test.in); rv != test.rfc1918 {\n\t\t\tt.Errorf(\"IsRFC1918 %s\\n got: %v want: %v\", test.in.IP, rv, test.rfc1918)\n\t\t}\n\n\t\tif rv := addrmgr.IsRFC3849(&test.in); rv != test.rfc3849 {\n\t\t\tt.Errorf(\"IsRFC3849 %s\\n got: %v want: %v\", test.in.IP, rv, test.rfc3849)\n\t\t}\n\n\t\tif rv := addrmgr.IsRFC3927(&test.in); rv != test.rfc3927 {\n\t\t\tt.Errorf(\"IsRFC3927 %s\\n got: %v want: %v\", test.in.IP, rv, test.rfc3927)\n\t\t}\n\n\t\tif rv := addrmgr.IsRFC3964(&test.in); rv != test.rfc3964 {\n\t\t\tt.Errorf(\"IsRFC3964 %s\\n got: %v want: %v\", test.in.IP, rv, test.rfc3964)\n\t\t}\n\n\t\tif rv := addrmgr.IsRFC4193(&test.in); rv != test.rfc4193 {\n\t\t\tt.Errorf(\"IsRFC4193 %s\\n got: %v want: %v\", test.in.IP, rv, test.rfc4193)\n\t\t}\n\n\t\tif rv := addrmgr.IsRFC4380(&test.in); rv != test.rfc4380 {\n\t\t\tt.Errorf(\"IsRFC4380 %s\\n got: %v want: %v\", test.in.IP, rv, test.rfc4380)\n\t\t}\n\n\t\tif rv := addrmgr.IsRFC4843(&test.in); rv != test.rfc4843 {\n\t\t\tt.Errorf(\"IsRFC4843 %s\\n got: %v want: %v\", test.in.IP, rv, test.rfc4843)\n\t\t}\n\n\t\tif rv := addrmgr.IsRFC4862(&test.in); rv != test.rfc4862 {\n\t\t\tt.Errorf(\"IsRFC4862 %s\\n got: %v want: %v\", test.in.IP, rv, test.rfc4862)\n\t\t}\n\n\t\tif rv := addrmgr.IsRFC6052(&test.in); rv != test.rfc6052 {\n\t\t\tt.Errorf(\"isRFC6052 %s\\n got: %v want: %v\", test.in.IP, rv, test.rfc6052)\n\t\t}\n\n\t\tif rv := addrmgr.IsRFC6145(&test.in); rv != test.rfc6145 {\n\t\t\tt.Errorf(\"IsRFC6145 %s\\n got: %v want: %v\", test.in.IP, rv, test.rfc6145)\n\t\t}\n\n\t\tif rv := addrmgr.IsRFC7343(&test.in); rv != test.rfc7343 {\n\t\t\tt.Errorf(\"IsRFC7343 %s\\n got: %v want: %v\", test.in.IP, rv, test.rfc7343)\n\t\t}\n\n\t\tif rv := addrmgr.IsLocal(&test.in); rv != test.local {\n\t\t\tt.Errorf(\"IsLocal %s\\n got: %v want: %v\", test.in.IP, rv, test.local)\n\t\t}\n\n\t\tif rv := addrmgr.IsValid(&test.in); rv != test.valid {\n\t\t\tt.Errorf(\"IsValid %s\\n got: %v want: %v\", test.in.IP, rv, test.valid)\n\t\t}\n\n\t\tcurrentNa := wire.NetAddressV2FromBytes(\n\t\t\ttime.Now(), test.in.Services, test.in.IP, test.in.Port,\n\t\t)\n\t\tif rv := addrmgr.IsRoutable(currentNa); rv != test.routable {\n\t\t\tt.Errorf(\"IsRoutable %s\\n got: %v want: %v\", test.in.IP, rv, test.routable)\n\t\t}\n\t}\n}\n\n// TestGroupKey tests the GroupKey function to ensure it properly groups various\n// IP addresses.\nfunc TestGroupKey(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tip       string\n\t\texpected string\n\t}{\n\t\t// Local addresses.\n\t\t{name: \"ipv4 localhost\", ip: \"127.0.0.1\", expected: \"local\"},\n\t\t{name: \"ipv6 localhost\", ip: \"::1\", expected: \"local\"},\n\t\t{name: \"ipv4 zero\", ip: \"0.0.0.0\", expected: \"local\"},\n\t\t{name: \"ipv4 first octet zero\", ip: \"0.1.2.3\", expected: \"local\"},\n\n\t\t// Unroutable addresses.\n\t\t{name: \"ipv4 invalid bcast\", ip: \"255.255.255.255\", expected: \"unroutable\"},\n\t\t{name: \"ipv4 rfc1918 10/8\", ip: \"10.1.2.3\", expected: \"unroutable\"},\n\t\t{name: \"ipv4 rfc1918 172.16/12\", ip: \"172.16.1.2\", expected: \"unroutable\"},\n\t\t{name: \"ipv4 rfc1918 192.168/16\", ip: \"192.168.1.2\", expected: \"unroutable\"},\n\t\t{name: \"ipv6 rfc3849 2001:db8::/32\", ip: \"2001:db8::1234\", expected: \"unroutable\"},\n\t\t{name: \"ipv4 rfc3927 169.254/16\", ip: \"169.254.1.2\", expected: \"unroutable\"},\n\t\t{name: \"ipv6 rfc4193 fc00::/7\", ip: \"fc00::1234\", expected: \"unroutable\"},\n\t\t{name: \"ipv6 rfc4843 2001:10::/28\", ip: \"2001:10::1234\", expected: \"unroutable\"},\n\t\t{name: \"ipv6 rfc7343 2001:20::/28\", ip: \"2001:20::1234\", expected: \"unroutable\"},\n\t\t{name: \"ipv6 rfc4862 fe80::/64\", ip: \"fe80::1234\", expected: \"unroutable\"},\n\n\t\t// IPv4 normal.\n\t\t{name: \"ipv4 normal class a\", ip: \"12.1.2.3\", expected: \"12.1.0.0\"},\n\t\t{name: \"ipv4 normal class b\", ip: \"173.1.2.3\", expected: \"173.1.0.0\"},\n\t\t{name: \"ipv4 normal class c\", ip: \"196.1.2.3\", expected: \"196.1.0.0\"},\n\n\t\t// IPv6/IPv4 translations.\n\t\t{name: \"ipv6 rfc3964 with ipv4 encap\", ip: \"2002:0c01:0203::\", expected: \"12.1.0.0\"},\n\t\t{name: \"ipv6 rfc4380 toredo ipv4\", ip: \"2001:0:1234::f3fe:fdfc\", expected: \"12.1.0.0\"},\n\t\t{name: \"ipv6 rfc6052 well-known prefix with ipv4\", ip: \"64:ff9b::0c01:0203\", expected: \"12.1.0.0\"},\n\t\t{name: \"ipv6 rfc6145 translated ipv4\", ip: \"::ffff:0:0c01:0203\", expected: \"12.1.0.0\"},\n\n\t\t// Tor.\n\t\t{name: \"ipv6 tor onioncat\", ip: \"fd87:d87e:eb43:1234::5678\", expected: \"tor:2\"},\n\t\t{name: \"ipv6 tor onioncat 2\", ip: \"fd87:d87e:eb43:1245::6789\", expected: \"tor:2\"},\n\t\t{name: \"ipv6 tor onioncat 3\", ip: \"fd87:d87e:eb43:1345::6789\", expected: \"tor:3\"},\n\n\t\t// IPv6 normal.\n\t\t{name: \"ipv6 normal\", ip: \"2602:100::1\", expected: \"2602:100::\"},\n\t\t{name: \"ipv6 normal 2\", ip: \"2602:0100::1234\", expected: \"2602:100::\"},\n\t\t{name: \"ipv6 hurricane electric\", ip: \"2001:470:1f10:a1::2\", expected: \"2001:470:1000::\"},\n\t\t{name: \"ipv6 hurricane electric 2\", ip: \"2001:0470:1f10:a1::2\", expected: \"2001:470:1000::\"},\n\t}\n\n\tfor i, test := range tests {\n\t\tnip := net.ParseIP(test.ip)\n\t\tna := wire.NetAddressV2FromBytes(\n\t\t\ttime.Now(), wire.SFNodeNetwork, nip, 8333,\n\t\t)\n\t\tif key := addrmgr.GroupKey(na); key != test.expected {\n\t\t\tt.Errorf(\"TestGroupKey #%d (%s): unexpected group key \"+\n\t\t\t\t\"- got '%s', want '%s'\", i, test.name,\n\t\t\t\tkey, test.expected)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "addrmgr/test_coverage.txt",
    "content": "\ngithub.com/conformal/btcd/addrmgr/network.go\t\t GroupKey\t\t\t\t 100.00% (23/23)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.reset\t\t\t 100.00% (6/6)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC5737\t\t\t\t 100.00% (4/4)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC1918\t\t\t\t 100.00% (4/4)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t New\t\t\t\t\t 100.00% (3/3)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t NetAddressKey\t\t\t\t 100.00% (2/2)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC4862\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.numAddresses\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/log.go\t\t init\t\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/log.go\t\t DisableLog\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t ipNet\t\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsIPv4\t\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsLocal\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsOnionCatTor\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC2544\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC3849\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC3927\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC3964\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC4193\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC4380\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC4843\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC6052\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC6145\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRFC6598\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsValid\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/network.go\t\t IsRoutable\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.GetBestLocalAddress\t 94.74% (18/19)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.AddLocalAddress\t\t 90.91% (10/11)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t getReachabilityFrom\t\t\t 51.52% (17/33)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t ipString\t\t\t\t 50.00% (2/4)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.GetAddress\t\t\t 9.30% (4/43)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.deserializePeers\t\t 0.00% (0/50)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.Good\t\t\t 0.00% (0/44)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.savePeers\t\t\t 0.00% (0/39)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.updateAddress\t\t 0.00% (0/30)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.expireNew\t\t\t 0.00% (0/22)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.AddressCache\t\t 0.00% (0/16)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.HostToNetAddress\t\t 0.00% (0/15)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.getNewBucket\t\t 0.00% (0/15)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.AddAddressByIP\t\t 0.00% (0/14)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.getTriedBucket\t\t 0.00% (0/14)\ngithub.com/conformal/btcd/addrmgr/knownaddress.go\t knownAddress.chance\t\t\t 0.00% (0/13)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.loadPeers\t\t\t 0.00% (0/11)\ngithub.com/conformal/btcd/addrmgr/knownaddress.go\t knownAddress.isBad\t\t\t 0.00% (0/11)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.Connected\t\t\t 0.00% (0/10)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.addressHandler\t\t 0.00% (0/9)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.pickTried\t\t\t 0.00% (0/8)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.DeserializeNetAddress\t 0.00% (0/7)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.Stop\t\t\t 0.00% (0/7)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.Attempt\t\t\t 0.00% (0/7)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.Start\t\t\t 0.00% (0/6)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.AddAddresses\t\t 0.00% (0/4)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.NeedMoreAddresses\t\t 0.00% (0/3)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.NumAddresses\t\t 0.00% (0/3)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.AddAddress\t\t\t 0.00% (0/3)\ngithub.com/conformal/btcd/addrmgr/knownaddress.go\t knownAddress.LastAttempt\t\t 0.00% (0/1)\ngithub.com/conformal/btcd/addrmgr/knownaddress.go\t knownAddress.NetAddress\t\t 0.00% (0/1)\ngithub.com/conformal/btcd/addrmgr/addrmanager.go\t AddrManager.find\t\t\t 0.00% (0/1)\ngithub.com/conformal/btcd/addrmgr/log.go\t\t UseLogger\t\t\t\t 0.00% (0/1)\ngithub.com/conformal/btcd/addrmgr\t\t\t ---------------------------------\t 21.04% (113/537)\n\n"
  },
  {
    "path": "blockchain/README.md",
    "content": "blockchain\n==========\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain)\n\nPackage blockchain implements bitcoin block handling and chain selection rules.\nThe test coverage is currently only around 60%, but will be increasing over\ntime. See `test_coverage.txt` for the gocov coverage report.  Alternatively, if\nyou are running a POSIX OS, you can run the `cov_report.sh` script for a\nreal-time report.  Package blockchain is licensed under the liberal ISC license.\n\nThere is an associated blog post about the release of this package\n[here](https://blog.conformal.com/btcchain-the-bitcoin-chain-package-from-bctd/).\n\nThis package has intentionally been designed so it can be used as a standalone\npackage for any projects needing to handle processing of blocks into the bitcoin\nblock chain.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/blockchain\n```\n\n## Bitcoin Chain Processing Overview\n\nBefore a block is allowed into the block chain, it must go through an intensive\nseries of validation rules.  The following list serves as a general outline of\nthose rules to provide some intuition into what is going on under the hood, but\nis by no means exhaustive:\n\n - Reject duplicate blocks\n - Perform a series of sanity checks on the block and its transactions such as\n   verifying proof of work, timestamps, number and character of transactions,\n   transaction amounts, script complexity, and merkle root calculations\n - Compare the block against predetermined checkpoints for expected timestamps\n   and difficulty based on elapsed time since the checkpoint\n - Save the most recent orphan blocks for a limited time in case their parent\n   blocks become available\n - Stop processing if the block is an orphan as the rest of the processing\n   depends on the block's position within the block chain\n - Perform a series of more thorough checks that depend on the block's position\n   within the block chain such as verifying block difficulties adhere to\n   difficulty retarget rules, timestamps are after the median of the last\n   several blocks, all transactions are finalized, checkpoint blocks match, and\n   block versions are in line with the previous blocks\n - Determine how the block fits into the chain and perform different actions\n   accordingly in order to ensure any side chains which have higher difficulty\n   than the main chain become the new main chain\n - When a block is being connected to the main chain (either through\n   reorganization of a side chain to the main chain or just extending the\n   main chain), perform further checks on the block's transactions such as\n   verifying transaction duplicates, script complexity for the combination of\n   connected scripts, coinbase maturity, double spends, and connected\n   transaction values\n - Run the transaction scripts to verify the spender is allowed to spend the\n   coins\n - Insert the block into the block database\n\n## Examples\n\n* [ProcessBlock Example](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain#example-BlockChain-ProcessBlock)  \n  Demonstrates how to create a new chain instance and use ProcessBlock to\n  attempt to add a block to the chain.  This example intentionally\n  attempts to insert a duplicate genesis block to illustrate how an invalid\n  block is handled.\n\n* [CompactToBig Example](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain#example-CompactToBig)  \n  Demonstrates how to convert the compact \"bits\" in a block header which\n  represent the target difficulty to a big integer and display it using the\n  typical hex notation.\n\n* [BigToCompact Example](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain#example-BigToCompact)  \n  Demonstrates how to convert a target difficulty into the\n  compact \"bits\" in a block header which represent that target difficulty.\n\n## GPG Verification Key\n\nAll official release tags are signed by Conformal so users can ensure the code\nhas not been tampered with and is coming from the btcsuite developers.  To\nverify the signature perform the following:\n\n- Download the public key from the Conformal website at\n  https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt\n\n- Import the public key into your GPG keyring:\n  ```bash\n  gpg --import GIT-GPG-KEY-conformal.txt\n  ```\n\n- Verify the release tag with the following command where `TAG_NAME` is a\n  placeholder for the specific tag:\n  ```bash\n  git tag -v TAG_NAME\n  ```\n\n## License\n\n\nPackage blockchain is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "blockchain/accept.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/database\"\n)\n\n// maybeAcceptBlock potentially accepts a block into the block chain and, if\n// accepted, returns whether or not it is on the main chain.  It performs\n// several validation checks which depend on its position within the block chain\n// before adding it.  The block is expected to have already gone through\n// ProcessBlock before calling this function with it.\n//\n// The flags are also passed to checkBlockContext and connectBestChain.  See\n// their documentation for how the flags modify their behavior.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) maybeAcceptBlock(block *btcutil.Block, flags BehaviorFlags) (bool, error) {\n\t// The height of this block is one more than the referenced previous\n\t// block.\n\tprevHash := &block.MsgBlock().Header.PrevBlock\n\tprevNode := b.index.LookupNode(prevHash)\n\tif prevNode == nil {\n\t\tstr := fmt.Sprintf(\"previous block %s is unknown\", prevHash)\n\t\treturn false, ruleError(ErrPreviousBlockUnknown, str)\n\t} else if b.index.NodeStatus(prevNode).KnownInvalid() {\n\t\tstr := fmt.Sprintf(\"previous block %s is known to be invalid\", prevHash)\n\t\treturn false, ruleError(ErrInvalidAncestorBlock, str)\n\t}\n\n\tblockHeight := prevNode.height + 1\n\tblock.SetHeight(blockHeight)\n\n\t// The block must pass all of the validation rules which depend on the\n\t// position of the block within the block chain.\n\terr := b.checkBlockContext(block, prevNode, flags)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Insert the block into the database if it's not already there.  Even\n\t// though it is possible the block will ultimately fail to connect, it\n\t// has already passed all proof-of-work and validity tests which means\n\t// it would be prohibitively expensive for an attacker to fill up the\n\t// disk with a bunch of blocks that fail to connect.  This is necessary\n\t// since it allows block download to be decoupled from the much more\n\t// expensive connection logic.  It also has some other nice properties\n\t// such as making blocks that never become part of the main chain or\n\t// blocks that fail to connect available for further analysis.\n\terr = b.db.Update(func(dbTx database.Tx) error {\n\t\treturn dbStoreBlock(dbTx, block)\n\t})\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Create a new block node for the block and add it to the node index. Even\n\t// if the block ultimately gets connected to the main chain, it starts out\n\t// on a side chain.\n\tblockHeader := &block.MsgBlock().Header\n\tnewNode := newBlockNode(blockHeader, prevNode)\n\tnewNode.status = statusDataStored\n\n\tb.index.AddNode(newNode)\n\terr = b.index.flushToDB()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Connect the passed block to the chain while respecting proper chain\n\t// selection according to the chain with the most proof of work.  This\n\t// also handles validation of the transaction scripts.\n\tisMainChain, err := b.connectBestChain(newNode, block, flags)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Notify the caller that the new block was accepted into the block\n\t// chain.  The caller would typically want to react by relaying the\n\t// inventory to other peers.\n\tfunc() {\n\t\tb.chainLock.Unlock()\n\t\tdefer b.chainLock.Lock()\n\t\tb.sendNotification(NTBlockAccepted, block)\n\t}()\n\n\treturn isMainChain, nil\n}\n"
  },
  {
    "path": "blockchain/bench_test.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// BenchmarkIsCoinBase performs a simple benchmark against the IsCoinBase\n// function.\nfunc BenchmarkIsCoinBase(b *testing.B) {\n\ttx, _ := btcutil.NewBlock(&Block100000).Tx(1)\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tIsCoinBase(tx)\n\t}\n}\n\n// BenchmarkIsCoinBaseTx performs a simple benchmark against the IsCoinBaseTx\n// function.\nfunc BenchmarkIsCoinBaseTx(b *testing.B) {\n\ttx := Block100000.Transactions[1]\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tIsCoinBaseTx(tx)\n\t}\n}\n\nfunc BenchmarkUtxoFetchMap(b *testing.B) {\n\tblock := Block100000\n\ttransactions := block.Transactions\n\tb.ResetTimer()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tneeded := make(map[wire.OutPoint]struct{}, len(transactions))\n\t\tfor _, tx := range transactions[1:] {\n\t\t\tfor _, txIn := range tx.TxIn {\n\t\t\t\tneeded[txIn.PreviousOutPoint] = struct{}{}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc BenchmarkUtxoFetchSlices(b *testing.B) {\n\tblock := Block100000\n\ttransactions := block.Transactions\n\tb.ResetTimer()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tneeded := make([]wire.OutPoint, 0, len(transactions))\n\t\tfor _, tx := range transactions[1:] {\n\t\t\tfor _, txIn := range tx.TxIn {\n\t\t\t\tneeded = append(needed, txIn.PreviousOutPoint)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc BenchmarkAncestor(b *testing.B) {\n\theight := 1 << 19\n\tblockNodes := chainedNodes(nil, height)\n\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tblockNodes[len(blockNodes)-1].Ancestor(0)\n\t\tfor j := 0; j <= 19; j++ {\n\t\t\tblockNodes[len(blockNodes)-1].Ancestor(1 << j)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blockchain/blockindex.go",
    "content": "// Copyright (c) 2015-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"math/big\"\n\t\"sort\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// blockStatus is a bit field representing the validation state of the block.\ntype blockStatus byte\n\nconst (\n\t// statusDataStored indicates that the block's payload is stored on disk.\n\tstatusDataStored blockStatus = 1 << iota\n\n\t// statusValid indicates that the block has been fully validated.\n\tstatusValid\n\n\t// statusValidateFailed indicates that the block has failed validation.\n\tstatusValidateFailed\n\n\t// statusInvalidAncestor indicates that one of the block's ancestors has\n\t// has failed validation, thus the block is also invalid.\n\tstatusInvalidAncestor\n\n\t// statusNone indicates that the block has no validation state flags set.\n\t//\n\t// NOTE: This must be defined last in order to avoid influencing iota.\n\tstatusNone blockStatus = 0\n)\n\n// HaveData returns whether the full block data is stored in the database. This\n// will return false for a block node where only the header is downloaded or\n// kept.\nfunc (status blockStatus) HaveData() bool {\n\treturn status&statusDataStored != 0\n}\n\n// KnownValid returns whether the block is known to be valid. This will return\n// false for a valid block that has not been fully validated yet.\nfunc (status blockStatus) KnownValid() bool {\n\treturn status&statusValid != 0\n}\n\n// KnownInvalid returns whether the block is known to be invalid. This may be\n// because the block itself failed validation or any of its ancestors is\n// invalid. This will return false for invalid blocks that have not been proven\n// invalid yet.\nfunc (status blockStatus) KnownInvalid() bool {\n\treturn status&(statusValidateFailed|statusInvalidAncestor) != 0\n}\n\n// blockNode represents a block within the block chain and is primarily used to\n// aid in selecting the best chain to be the main chain.  The main chain is\n// stored into the block database.\ntype blockNode struct {\n\t// NOTE: Additions, deletions, or modifications to the order of the\n\t// definitions in this struct should not be changed without considering\n\t// how it affects alignment on 64-bit platforms.  The current order is\n\t// specifically crafted to result in minimal padding.  There will be\n\t// hundreds of thousands of these in memory, so a few extra bytes of\n\t// padding adds up.\n\n\t// parent is the parent block for this node.\n\tparent *blockNode\n\n\t// ancestor is a block that is more than one block back from this node.\n\tancestor *blockNode\n\n\t// hash is the double sha 256 of the block.\n\thash chainhash.Hash\n\n\t// workSum is the total amount of work in the chain up to and including\n\t// this node.\n\tworkSum *big.Int\n\n\t// height is the position in the block chain.\n\theight int32\n\n\t// Some fields from block headers to aid in best chain selection and\n\t// reconstructing headers from memory.  These must be treated as\n\t// immutable and are intentionally ordered to avoid padding on 64-bit\n\t// platforms.\n\tversion    int32\n\tbits       uint32\n\tnonce      uint32\n\ttimestamp  int64\n\tmerkleRoot chainhash.Hash\n\n\t// status is a bitfield representing the validation state of the block. The\n\t// status field, unlike the other fields, may be written to and so should\n\t// only be accessed using the concurrent-safe NodeStatus method on\n\t// blockIndex once the node has been added to the global index.\n\tstatus blockStatus\n}\n\n// initBlockNode initializes a block node from the given header and parent node,\n// calculating the height and workSum from the respective fields on the parent.\n// This function is NOT safe for concurrent access.  It must only be called when\n// initially creating a node.\nfunc initBlockNode(node *blockNode, blockHeader *wire.BlockHeader, parent *blockNode) {\n\t*node = blockNode{\n\t\thash:       blockHeader.BlockHash(),\n\t\tworkSum:    CalcWork(blockHeader.Bits),\n\t\tversion:    blockHeader.Version,\n\t\tbits:       blockHeader.Bits,\n\t\tnonce:      blockHeader.Nonce,\n\t\ttimestamp:  blockHeader.Timestamp.Unix(),\n\t\tmerkleRoot: blockHeader.MerkleRoot,\n\t}\n\tif parent != nil {\n\t\tnode.parent = parent\n\t\tnode.height = parent.height + 1\n\t\tnode.workSum = node.workSum.Add(parent.workSum, node.workSum)\n\t\tnode.buildAncestor()\n\t}\n}\n\n// newBlockNode returns a new block node for the given block header and parent\n// node, calculating the height and workSum from the respective fields on the\n// parent. This function is NOT safe for concurrent access.\nfunc newBlockNode(blockHeader *wire.BlockHeader, parent *blockNode) *blockNode {\n\tvar node blockNode\n\tinitBlockNode(&node, blockHeader, parent)\n\treturn &node\n}\n\n// Equals compares all the fields of the block node except for the parent and\n// ancestor and returns true if they're equal.\nfunc (node *blockNode) Equals(other *blockNode) bool {\n\treturn node.hash == other.hash &&\n\t\tnode.workSum.Cmp(other.workSum) == 0 &&\n\t\tnode.height == other.height &&\n\t\tnode.version == other.version &&\n\t\tnode.bits == other.bits &&\n\t\tnode.nonce == other.nonce &&\n\t\tnode.timestamp == other.timestamp &&\n\t\tnode.merkleRoot == other.merkleRoot &&\n\t\tnode.status == other.status\n}\n\n// Header constructs a block header from the node and returns it.\n//\n// This function is safe for concurrent access.\nfunc (node *blockNode) Header() wire.BlockHeader {\n\t// No lock is needed because all accessed fields are immutable.\n\tprevHash := &zeroHash\n\tif node.parent != nil {\n\t\tprevHash = &node.parent.hash\n\t}\n\treturn wire.BlockHeader{\n\t\tVersion:    node.version,\n\t\tPrevBlock:  *prevHash,\n\t\tMerkleRoot: node.merkleRoot,\n\t\tTimestamp:  time.Unix(node.timestamp, 0),\n\t\tBits:       node.bits,\n\t\tNonce:      node.nonce,\n\t}\n}\n\n// invertLowestOne turns the lowest 1 bit in the binary representation of a number into a 0.\nfunc invertLowestOne(n int32) int32 {\n\treturn n & (n - 1)\n}\n\n// getAncestorHeight returns a suitable ancestor for the node at the given height.\nfunc getAncestorHeight(height int32) int32 {\n\t// We pop off two 1 bits of the height.\n\t// This results in a maximum of 330 steps to go back to an ancestor\n\t// from height 1<<29.\n\treturn invertLowestOne(invertLowestOne(height))\n}\n\n// buildAncestor sets an ancestor for the given blocknode.\nfunc (node *blockNode) buildAncestor() {\n\tif node.parent != nil {\n\t\tnode.ancestor = node.parent.Ancestor(getAncestorHeight(node.height))\n\t}\n}\n\n// Ancestor returns the ancestor block node at the provided height by following\n// the chain backwards from this node.  The returned block will be nil when a\n// height is requested that is after the height of the passed node or is less\n// than zero.\n//\n// This function is safe for concurrent access.\nfunc (node *blockNode) Ancestor(height int32) *blockNode {\n\tif height < 0 || height > node.height {\n\t\treturn nil\n\t}\n\n\t// Traverse back until we find the desired node.\n\tn := node\n\tfor n != nil && n.height != height {\n\t\t// If there's an ancestor available, use it. Otherwise, just\n\t\t// follow the parent.\n\t\tif n.ancestor != nil {\n\t\t\t// Calculate the height for this ancestor and\n\t\t\t// check if we can take the ancestor skip.\n\t\t\tif getAncestorHeight(n.height) >= height {\n\t\t\t\tn = n.ancestor\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// We couldn't take the ancestor skip so traverse back to the parent.\n\t\tn = n.parent\n\t}\n\n\treturn n\n}\n\n// Height returns the blockNode's height in the chain.\n//\n// NOTE: Part of the HeaderCtx interface.\nfunc (node *blockNode) Height() int32 {\n\treturn node.height\n}\n\n// Bits returns the blockNode's nBits.\n//\n// NOTE: Part of the HeaderCtx interface.\nfunc (node *blockNode) Bits() uint32 {\n\treturn node.bits\n}\n\n// Timestamp returns the blockNode's timestamp.\n//\n// NOTE: Part of the HeaderCtx interface.\nfunc (node *blockNode) Timestamp() int64 {\n\treturn node.timestamp\n}\n\n// Parent returns the blockNode's parent.\n//\n// NOTE: Part of the HeaderCtx interface.\nfunc (node *blockNode) Parent() HeaderCtx {\n\tif node.parent == nil {\n\t\t// This is required since node.parent is a *blockNode and if we\n\t\t// do not explicitly return nil here, the caller may fail when\n\t\t// nil-checking this.\n\t\treturn nil\n\t}\n\n\treturn node.parent\n}\n\n// RelativeAncestorCtx returns the blockNode's ancestor that is distance blocks\n// before it in the chain. This is equivalent to the RelativeAncestor function\n// below except that the return type is different.\n//\n// This function is safe for concurrent access.\n//\n// NOTE: Part of the HeaderCtx interface.\nfunc (node *blockNode) RelativeAncestorCtx(distance int32) HeaderCtx {\n\tancestor := node.RelativeAncestor(distance)\n\tif ancestor == nil {\n\t\t// This is required since RelativeAncestor returns a *blockNode\n\t\t// and if we do not explicitly return nil here, the caller may\n\t\t// fail when nil-checking this.\n\t\treturn nil\n\t}\n\n\treturn ancestor\n}\n\n// IsAncestor returns if the other node is an ancestor of this block node.\nfunc (node *blockNode) IsAncestor(otherNode *blockNode) bool {\n\t// Return early as false if the otherNode is nil.\n\tif otherNode == nil {\n\t\treturn false\n\t}\n\n\tancestor := node.Ancestor(otherNode.height)\n\tif ancestor == nil {\n\t\treturn false\n\t}\n\n\t// If the otherNode has the same height as me, then the returned\n\t// ancestor will be me.  Return false since I'm not an ancestor of me.\n\tif node.height == ancestor.height {\n\t\treturn false\n\t}\n\n\t// Return true if the fetched ancestor is other node.\n\treturn ancestor.Equals(otherNode)\n}\n\n// RelativeAncestor returns the ancestor block node a relative 'distance' blocks\n// before this node.  This is equivalent to calling Ancestor with the node's\n// height minus provided distance.\n//\n// This function is safe for concurrent access.\nfunc (node *blockNode) RelativeAncestor(distance int32) *blockNode {\n\treturn node.Ancestor(node.height - distance)\n}\n\n// CalcPastMedianTime calculates the median time of the previous few blocks\n// prior to, and including, the block node.\n//\n// This function is safe for concurrent access.\nfunc CalcPastMedianTime(node HeaderCtx) time.Time {\n\t// Create a slice of the previous few block timestamps used to calculate\n\t// the median per the number defined by the constant medianTimeBlocks.\n\ttimestamps := make([]int64, medianTimeBlocks)\n\tnumNodes := 0\n\titerNode := node\n\tfor i := 0; i < medianTimeBlocks && iterNode != nil; i++ {\n\t\ttimestamps[i] = iterNode.Timestamp()\n\t\tnumNodes++\n\n\t\titerNode = iterNode.Parent()\n\t}\n\n\t// Prune the slice to the actual number of available timestamps which\n\t// will be fewer than desired near the beginning of the block chain\n\t// and sort them.\n\ttimestamps = timestamps[:numNodes]\n\tsort.Sort(timeSorter(timestamps))\n\n\t// NOTE: The consensus rules incorrectly calculate the median for even\n\t// numbers of blocks.  A true median averages the middle two elements\n\t// for a set with an even number of elements in it.   Since the constant\n\t// for the previous number of blocks to be used is odd, this is only an\n\t// issue for a few blocks near the beginning of the chain.  I suspect\n\t// this is an optimization even though the result is slightly wrong for\n\t// a few of the first blocks since after the first few blocks, there\n\t// will always be an odd number of blocks in the set per the constant.\n\t//\n\t// This code follows suit to ensure the same rules are used, however, be\n\t// aware that should the medianTimeBlocks constant ever be changed to an\n\t// even number, this code will be wrong.\n\tmedianTimestamp := timestamps[numNodes/2]\n\treturn time.Unix(medianTimestamp, 0)\n}\n\n// A compile-time assertion to ensure blockNode implements the HeaderCtx\n// interface.\nvar _ HeaderCtx = (*blockNode)(nil)\n\n// blockIndex provides facilities for keeping track of an in-memory index of the\n// block chain.  Although the name block chain suggests a single chain of\n// blocks, it is actually a tree-shaped structure where any node can have\n// multiple children.  However, there can only be one active branch which does\n// indeed form a chain from the tip all the way back to the genesis block.\ntype blockIndex struct {\n\t// The following fields are set when the instance is created and can't\n\t// be changed afterwards, so there is no need to protect them with a\n\t// separate mutex.\n\tdb          database.DB\n\tchainParams *chaincfg.Params\n\n\tsync.RWMutex\n\tindex map[chainhash.Hash]*blockNode\n\tdirty map[*blockNode]struct{}\n}\n\n// newBlockIndex returns a new empty instance of a block index.  The index will\n// be dynamically populated as block nodes are loaded from the database and\n// manually added.\nfunc newBlockIndex(db database.DB, chainParams *chaincfg.Params) *blockIndex {\n\treturn &blockIndex{\n\t\tdb:          db,\n\t\tchainParams: chainParams,\n\t\tindex:       make(map[chainhash.Hash]*blockNode),\n\t\tdirty:       make(map[*blockNode]struct{}),\n\t}\n}\n\n// HaveBlock returns whether or not the block index contains the provided hash.\n//\n// This function is safe for concurrent access.\nfunc (bi *blockIndex) HaveBlock(hash *chainhash.Hash) bool {\n\tbi.RLock()\n\t_, hasBlock := bi.index[*hash]\n\tbi.RUnlock()\n\treturn hasBlock\n}\n\n// LookupNode returns the block node identified by the provided hash.  It will\n// return nil if there is no entry for the hash.\n//\n// This function is safe for concurrent access.\nfunc (bi *blockIndex) LookupNode(hash *chainhash.Hash) *blockNode {\n\tbi.RLock()\n\tnode := bi.index[*hash]\n\tbi.RUnlock()\n\treturn node\n}\n\n// AddNode adds the provided node to the block index and marks it as dirty.\n// Duplicate entries are not checked so it is up to caller to avoid adding them.\n//\n// This function is safe for concurrent access.\nfunc (bi *blockIndex) AddNode(node *blockNode) {\n\tbi.Lock()\n\tbi.addNode(node)\n\tbi.dirty[node] = struct{}{}\n\tbi.Unlock()\n}\n\n// addNode adds the provided node to the block index, but does not mark it as\n// dirty. This can be used while initializing the block index.\n//\n// This function is NOT safe for concurrent access.\nfunc (bi *blockIndex) addNode(node *blockNode) {\n\tbi.index[node.hash] = node\n}\n\n// NodeStatus provides concurrent-safe access to the status field of a node.\n//\n// This function is safe for concurrent access.\nfunc (bi *blockIndex) NodeStatus(node *blockNode) blockStatus {\n\tbi.RLock()\n\tstatus := node.status\n\tbi.RUnlock()\n\treturn status\n}\n\n// SetStatusFlags flips the provided status flags on the block node to on,\n// regardless of whether they were on or off previously. This does not unset any\n// flags currently on.\n//\n// This function is safe for concurrent access.\nfunc (bi *blockIndex) SetStatusFlags(node *blockNode, flags blockStatus) {\n\tbi.Lock()\n\tnode.status |= flags\n\tbi.dirty[node] = struct{}{}\n\tbi.Unlock()\n}\n\n// UnsetStatusFlags flips the provided status flags on the block node to off,\n// regardless of whether they were on or off previously.\n//\n// This function is safe for concurrent access.\nfunc (bi *blockIndex) UnsetStatusFlags(node *blockNode, flags blockStatus) {\n\tbi.Lock()\n\tnode.status &^= flags\n\tbi.dirty[node] = struct{}{}\n\tbi.Unlock()\n}\n\n// InactiveTips returns all the block nodes that aren't in the best chain.\n//\n// This function is safe for concurrent access.\nfunc (bi *blockIndex) InactiveTips(bestChain *chainView) []*blockNode {\n\tbi.RLock()\n\tdefer bi.RUnlock()\n\n\t// Look through the entire blockindex and look for nodes that aren't in\n\t// the best chain. We're gonna keep track of all the orphans and the parents\n\t// of the orphans.\n\torphans := make(map[chainhash.Hash]*blockNode)\n\torphanParent := make(map[chainhash.Hash]*blockNode)\n\tfor hash, node := range bi.index {\n\t\tfound := bestChain.Contains(node)\n\t\tif !found {\n\t\t\torphans[hash] = node\n\t\t\torphanParent[node.parent.hash] = node.parent\n\t\t}\n\t}\n\n\t// If an orphan isn't pointed to by another orphan, it is a chain tip.\n\t//\n\t// We can check this by looking for the orphan in the orphan parent map.\n\t// If the orphan exists in the orphan parent map, it means that another\n\t// orphan is pointing to it.\n\ttips := make([]*blockNode, 0, len(orphans))\n\tfor hash, orphan := range orphans {\n\t\t_, found := orphanParent[hash]\n\t\tif !found {\n\t\t\ttips = append(tips, orphan)\n\t\t}\n\n\t\tdelete(orphanParent, hash)\n\t}\n\n\treturn tips\n}\n\n// flushToDB writes all dirty block nodes to the database. If all writes\n// succeed, this clears the dirty set.\nfunc (bi *blockIndex) flushToDB() error {\n\tbi.Lock()\n\tif len(bi.dirty) == 0 {\n\t\tbi.Unlock()\n\t\treturn nil\n\t}\n\n\terr := bi.db.Update(func(dbTx database.Tx) error {\n\t\tfor node := range bi.dirty {\n\t\t\terr := dbStoreBlockNode(dbTx, node)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n\n\t// If write was successful, clear the dirty set.\n\tif err == nil {\n\t\tbi.dirty = make(map[*blockNode]struct{})\n\t}\n\n\tbi.Unlock()\n\treturn err\n}\n"
  },
  {
    "path": "blockchain/blockindex_test.go",
    "content": "// Copyright (c) 2023 The utreexo developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"math/rand\"\n\t\"testing\"\n)\n\nfunc TestAncestor(t *testing.T) {\n\theight := 500_000\n\tblockNodes := chainedNodes(nil, height)\n\n\tfor i, blockNode := range blockNodes {\n\t\t// Grab a random node that's a child of this node\n\t\t// and try to fetch the current blockNode with Ancestor.\n\t\trandNode := blockNodes[rand.Intn(height-i)+i]\n\t\tgot := randNode.Ancestor(blockNode.height)\n\n\t\t// See if we got the right one.\n\t\tif got.hash != blockNode.hash {\n\t\t\tt.Fatalf(\"expected ancestor at height %d \"+\n\t\t\t\t\"but got a node at height %d\",\n\t\t\t\tblockNode.height, got.height)\n\t\t}\n\n\t\t// Gensis doesn't have ancestors so skip the check below.\n\t\tif blockNode.height == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\t// The ancestors are deterministic so check that this node's\n\t\t// ancestor is the correct one.\n\t\tif blockNode.ancestor.height != getAncestorHeight(blockNode.height) {\n\t\t\tt.Fatalf(\"expected anestor at height %d, but it was at %d\",\n\t\t\t\tgetAncestorHeight(blockNode.height),\n\t\t\t\tblockNode.ancestor.height)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blockchain/chain.go",
    "content": "// Copyright (c) 2013-2018 The btcsuite developers\n// Copyright (c) 2015-2018 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"container/list\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// maxOrphanBlocks is the maximum number of orphan blocks that can be\n\t// queued.\n\tmaxOrphanBlocks = 100\n)\n\n// BlockLocator is used to help locate a specific block.  The algorithm for\n// building the block locator is to add the hashes in reverse order until\n// the genesis block is reached.  In order to keep the list of locator hashes\n// to a reasonable number of entries, first the most recent previous 12 block\n// hashes are added, then the step is doubled each loop iteration to\n// exponentially decrease the number of hashes as a function of the distance\n// from the block being located.\n//\n// For example, assume a block chain with a side chain as depicted below:\n//\n//\tgenesis -> 1 -> 2 -> ... -> 15 -> 16  -> 17  -> 18\n//\t                              \\-> 16a -> 17a\n//\n// The block locator for block 17a would be the hashes of blocks:\n// [17a 16a 15 14 13 12 11 10 9 8 7 6 4 genesis]\ntype BlockLocator []*chainhash.Hash\n\n// orphanBlock represents a block that we don't yet have the parent for.  It\n// is a normal block plus an expiration time to prevent caching the orphan\n// forever.\ntype orphanBlock struct {\n\tblock      *btcutil.Block\n\texpiration time.Time\n}\n\n// BestState houses information about the current best block and other info\n// related to the state of the main chain as it exists from the point of view of\n// the current best block.\n//\n// The BestSnapshot method can be used to obtain access to this information\n// in a concurrent safe manner and the data will not be changed out from under\n// the caller when chain state changes occur as the function name implies.\n// However, the returned snapshot must be treated as immutable since it is\n// shared by all callers.\ntype BestState struct {\n\tHash        chainhash.Hash // The hash of the block.\n\tHeight      int32          // The height of the block.\n\tBits        uint32         // The difficulty bits of the block.\n\tBlockSize   uint64         // The size of the block.\n\tBlockWeight uint64         // The weight of the block.\n\tNumTxns     uint64         // The number of txns in the block.\n\tTotalTxns   uint64         // The total number of txns in the chain.\n\tMedianTime  time.Time      // Median time as per CalcPastMedianTime.\n}\n\n// newBestState returns a new best stats instance for the given parameters.\nfunc newBestState(node *blockNode, blockSize, blockWeight, numTxns,\n\ttotalTxns uint64, medianTime time.Time) *BestState {\n\n\treturn &BestState{\n\t\tHash:        node.hash,\n\t\tHeight:      node.height,\n\t\tBits:        node.bits,\n\t\tBlockSize:   blockSize,\n\t\tBlockWeight: blockWeight,\n\t\tNumTxns:     numTxns,\n\t\tTotalTxns:   totalTxns,\n\t\tMedianTime:  medianTime,\n\t}\n}\n\n// BlockChain provides functions for working with the bitcoin block chain.\n// It includes functionality such as rejecting duplicate blocks, ensuring blocks\n// follow all rules, orphan handling, checkpoint handling, and best chain\n// selection with reorganization.\ntype BlockChain struct {\n\t// The following fields are set when the instance is created and can't\n\t// be changed afterwards, so there is no need to protect them with a\n\t// separate mutex.\n\tcheckpoints         []chaincfg.Checkpoint\n\tcheckpointsByHeight map[int32]*chaincfg.Checkpoint\n\tdb                  database.DB\n\tchainParams         *chaincfg.Params\n\ttimeSource          MedianTimeSource\n\tsigCache            *txscript.SigCache\n\tindexManager        IndexManager\n\thashCache           *txscript.HashCache\n\n\t// The following fields are calculated based upon the provided chain\n\t// parameters.  They are also set when the instance is created and\n\t// can't be changed afterwards, so there is no need to protect them with\n\t// a separate mutex.\n\tminRetargetTimespan int64 // target timespan / adjustment factor\n\tmaxRetargetTimespan int64 // target timespan * adjustment factor\n\tblocksPerRetarget   int32 // target timespan / target time per block\n\n\t// chainLock protects concurrent access to the vast majority of the\n\t// fields in this struct below this point.\n\tchainLock sync.RWMutex\n\n\t// pruneTarget is the size in bytes the database targets for when the node\n\t// is pruned.\n\tpruneTarget uint64\n\n\t// These fields are related to the memory block index.  They both have\n\t// their own locks, however they are often also protected by the chain\n\t// lock to help prevent logic races when blocks are being processed.\n\t//\n\t// index houses the entire block index in memory.  The block index is\n\t// a tree-shaped structure.\n\t//\n\t// bestChain tracks the current active chain by making use of an\n\t// efficient chain view into the block index.\n\tindex     *blockIndex\n\tbestChain *chainView\n\n\t// The UTXO state holds a cached view of the UTXO state of the chain.\n\t// It is protected by the chain lock.\n\tutxoCache *utxoCache\n\n\t// These fields are related to handling of orphan blocks.  They are\n\t// protected by a combination of the chain lock and the orphan lock.\n\torphanLock   sync.RWMutex\n\torphans      map[chainhash.Hash]*orphanBlock\n\tprevOrphans  map[chainhash.Hash][]*orphanBlock\n\toldestOrphan *orphanBlock\n\n\t// These fields are related to checkpoint handling.  They are protected\n\t// by the chain lock.\n\tnextCheckpoint *chaincfg.Checkpoint\n\tcheckpointNode *blockNode\n\n\t// The state is used as a fairly efficient way to cache information\n\t// about the current best chain state that is returned to callers when\n\t// requested.  It operates on the principle of MVCC such that any time a\n\t// new block becomes the best block, the state pointer is replaced with\n\t// a new struct and the old state is left untouched.  In this way,\n\t// multiple callers can be pointing to different best chain states.\n\t// This is acceptable for most callers because the state is only being\n\t// queried at a specific point in time.\n\t//\n\t// In addition, some of the fields are stored in the database so the\n\t// chain state can be quickly reconstructed on load.\n\tstateLock     sync.RWMutex\n\tstateSnapshot *BestState\n\n\t// The following caches are used to efficiently keep track of the\n\t// current deployment threshold state of each rule change deployment.\n\t//\n\t// This information is stored in the database so it can be quickly\n\t// reconstructed on load.\n\t//\n\t// warningCaches caches the current deployment threshold state for blocks\n\t// in each of the **possible** deployments.  This is used in order to\n\t// detect when new unrecognized rule changes are being voted on and/or\n\t// have been activated such as will be the case when older versions of\n\t// the software are being used\n\t//\n\t// deploymentCaches caches the current deployment threshold state for\n\t// blocks in each of the actively defined deployments.\n\twarningCaches    []thresholdStateCache\n\tdeploymentCaches []thresholdStateCache\n\n\t// The following fields are used to determine if certain warnings have\n\t// already been shown.\n\t//\n\t// unknownRulesWarned refers to warnings due to unknown rules being\n\t// activated.\n\tunknownRulesWarned bool\n\n\t// The notifications field stores a slice of callbacks to be executed on\n\t// certain blockchain events.\n\tnotificationsLock sync.RWMutex\n\tnotifications     []NotificationCallback\n}\n\n// HaveBlock returns whether or not the chain instance has the block represented\n// by the passed hash.  This includes checking the various places a block can\n// be like part of the main chain, on a side chain, or in the orphan pool.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) HaveBlock(hash *chainhash.Hash) (bool, error) {\n\texists, err := b.blockExists(hash)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn exists || b.IsKnownOrphan(hash), nil\n}\n\n// IsKnownOrphan returns whether the passed hash is currently a known orphan.\n// Keep in mind that only a limited number of orphans are held onto for a\n// limited amount of time, so this function must not be used as an absolute\n// way to test if a block is an orphan block.  A full block (as opposed to just\n// its hash) must be passed to ProcessBlock for that purpose.  However, calling\n// ProcessBlock with an orphan that already exists results in an error, so this\n// function provides a mechanism for a caller to intelligently detect *recent*\n// duplicate orphans and react accordingly.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) IsKnownOrphan(hash *chainhash.Hash) bool {\n\t// Protect concurrent access.  Using a read lock only so multiple\n\t// readers can query without blocking each other.\n\tb.orphanLock.RLock()\n\t_, exists := b.orphans[*hash]\n\tb.orphanLock.RUnlock()\n\n\treturn exists\n}\n\n// GetOrphanRoot returns the head of the chain for the provided hash from the\n// map of orphan blocks.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) GetOrphanRoot(hash *chainhash.Hash) *chainhash.Hash {\n\t// Protect concurrent access.  Using a read lock only so multiple\n\t// readers can query without blocking each other.\n\tb.orphanLock.RLock()\n\tdefer b.orphanLock.RUnlock()\n\n\t// Keep looping while the parent of each orphaned block is\n\t// known and is an orphan itself.\n\torphanRoot := hash\n\tprevHash := hash\n\tfor {\n\t\torphan, exists := b.orphans[*prevHash]\n\t\tif !exists {\n\t\t\tbreak\n\t\t}\n\t\torphanRoot = prevHash\n\t\tprevHash = &orphan.block.MsgBlock().Header.PrevBlock\n\t}\n\n\treturn orphanRoot\n}\n\n// removeOrphanBlock removes the passed orphan block from the orphan pool and\n// previous orphan index.\nfunc (b *BlockChain) removeOrphanBlock(orphan *orphanBlock) {\n\t// Protect concurrent access.\n\tb.orphanLock.Lock()\n\tdefer b.orphanLock.Unlock()\n\n\t// Remove the orphan block from the orphan pool.\n\torphanHash := orphan.block.Hash()\n\tdelete(b.orphans, *orphanHash)\n\n\t// Remove the reference from the previous orphan index too.  An indexing\n\t// for loop is intentionally used over a range here as range does not\n\t// reevaluate the slice on each iteration nor does it adjust the index\n\t// for the modified slice.\n\tprevHash := &orphan.block.MsgBlock().Header.PrevBlock\n\torphans := b.prevOrphans[*prevHash]\n\tfor i := 0; i < len(orphans); i++ {\n\t\thash := orphans[i].block.Hash()\n\t\tif hash.IsEqual(orphanHash) {\n\t\t\tcopy(orphans[i:], orphans[i+1:])\n\t\t\torphans[len(orphans)-1] = nil\n\t\t\torphans = orphans[:len(orphans)-1]\n\t\t\ti--\n\t\t}\n\t}\n\tb.prevOrphans[*prevHash] = orphans\n\n\t// Remove the map entry altogether if there are no longer any orphans\n\t// which depend on the parent hash.\n\tif len(b.prevOrphans[*prevHash]) == 0 {\n\t\tdelete(b.prevOrphans, *prevHash)\n\t}\n}\n\n// addOrphanBlock adds the passed block (which is already determined to be\n// an orphan prior calling this function) to the orphan pool.  It lazily cleans\n// up any expired blocks so a separate cleanup poller doesn't need to be run.\n// It also imposes a maximum limit on the number of outstanding orphan\n// blocks and will remove the oldest received orphan block if the limit is\n// exceeded.\nfunc (b *BlockChain) addOrphanBlock(block *btcutil.Block) {\n\t// Remove expired orphan blocks.\n\tfor _, oBlock := range b.orphans {\n\t\tif time.Now().After(oBlock.expiration) {\n\t\t\tb.removeOrphanBlock(oBlock)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Update the oldest orphan block pointer so it can be discarded\n\t\t// in case the orphan pool fills up.\n\t\tif b.oldestOrphan == nil || oBlock.expiration.Before(b.oldestOrphan.expiration) {\n\t\t\tb.oldestOrphan = oBlock\n\t\t}\n\t}\n\n\t// Limit orphan blocks to prevent memory exhaustion.\n\tif len(b.orphans)+1 > maxOrphanBlocks {\n\t\t// Remove the oldest orphan to make room for the new one.\n\t\tb.removeOrphanBlock(b.oldestOrphan)\n\t\tb.oldestOrphan = nil\n\t}\n\n\t// Protect concurrent access.  This is intentionally done here instead\n\t// of near the top since removeOrphanBlock does its own locking and\n\t// the range iterator is not invalidated by removing map entries.\n\tb.orphanLock.Lock()\n\tdefer b.orphanLock.Unlock()\n\n\t// Insert the block into the orphan map with an expiration time\n\t// 1 hour from now.\n\texpiration := time.Now().Add(time.Hour)\n\toBlock := &orphanBlock{\n\t\tblock:      block,\n\t\texpiration: expiration,\n\t}\n\tb.orphans[*block.Hash()] = oBlock\n\n\t// Add to previous hash lookup index for faster dependency lookups.\n\tprevHash := &block.MsgBlock().Header.PrevBlock\n\tb.prevOrphans[*prevHash] = append(b.prevOrphans[*prevHash], oBlock)\n}\n\n// SequenceLock represents the converted relative lock-time in seconds, and\n// absolute block-height for a transaction input's relative lock-times.\n// According to SequenceLock, after the referenced input has been confirmed\n// within a block, a transaction spending that input can be included into a\n// block either after 'seconds' (according to past median time), or once the\n// 'BlockHeight' has been reached.\ntype SequenceLock struct {\n\tSeconds     int64\n\tBlockHeight int32\n}\n\n// CalcSequenceLock computes a relative lock-time SequenceLock for the passed\n// transaction using the passed UtxoViewpoint to obtain the past median time\n// for blocks in which the referenced inputs of the transactions were included\n// within. The generated SequenceLock lock can be used in conjunction with a\n// block height, and adjusted median block time to determine if all the inputs\n// referenced within a transaction have reached sufficient maturity allowing\n// the candidate transaction to be included in a block.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) CalcSequenceLock(tx *btcutil.Tx, utxoView *UtxoViewpoint, mempool bool) (*SequenceLock, error) {\n\tb.chainLock.Lock()\n\tdefer b.chainLock.Unlock()\n\n\treturn b.calcSequenceLock(b.bestChain.Tip(), tx, utxoView, mempool)\n}\n\n// calcSequenceLock computes the relative lock-times for the passed\n// transaction. See the exported version, CalcSequenceLock for further details.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) calcSequenceLock(node *blockNode, tx *btcutil.Tx, utxoView *UtxoViewpoint, mempool bool) (*SequenceLock, error) {\n\t// A value of -1 for each relative lock type represents a relative time\n\t// lock value that will allow a transaction to be included in a block\n\t// at any given height or time. This value is returned as the relative\n\t// lock time in the case that BIP 68 is disabled, or has not yet been\n\t// activated.\n\tsequenceLock := &SequenceLock{Seconds: -1, BlockHeight: -1}\n\n\t// The sequence locks semantics are always active for transactions\n\t// within the mempool.\n\tcsvSoftforkActive := mempool\n\n\t// If we're performing block validation, then we need to query the BIP9\n\t// state.\n\tif !csvSoftforkActive {\n\t\t// Obtain the latest BIP9 version bits state for the\n\t\t// CSV-package soft-fork deployment. The adherence of sequence\n\t\t// locks depends on the current soft-fork state.\n\t\tcsvState, err := b.deploymentState(node.parent, chaincfg.DeploymentCSV)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcsvSoftforkActive = csvState == ThresholdActive\n\t}\n\n\t// If the transaction's version is less than 2, and BIP 68 has not yet\n\t// been activated then sequence locks are disabled. Additionally,\n\t// sequence locks don't apply to coinbase transactions Therefore, we\n\t// return sequence lock values of -1 indicating that this transaction\n\t// can be included within a block at any given height or time.\n\tmTx := tx.MsgTx()\n\tsequenceLockActive := uint32(mTx.Version) >= 2 && csvSoftforkActive\n\tif !sequenceLockActive || IsCoinBase(tx) {\n\t\treturn sequenceLock, nil\n\t}\n\n\t// Grab the next height from the PoV of the passed blockNode to use for\n\t// inputs present in the mempool.\n\tnextHeight := node.height + 1\n\n\tfor txInIndex, txIn := range mTx.TxIn {\n\t\tutxo := utxoView.LookupEntry(txIn.PreviousOutPoint)\n\t\tif utxo == nil {\n\t\t\tstr := fmt.Sprintf(\"output %v referenced from \"+\n\t\t\t\t\"transaction %s:%d either does not exist or \"+\n\t\t\t\t\"has already been spent\", txIn.PreviousOutPoint,\n\t\t\t\ttx.Hash(), txInIndex)\n\t\t\treturn sequenceLock, ruleError(ErrMissingTxOut, str)\n\t\t}\n\n\t\t// If the input height is set to the mempool height, then we\n\t\t// assume the transaction makes it into the next block when\n\t\t// evaluating its sequence blocks.\n\t\tinputHeight := utxo.BlockHeight()\n\t\tif inputHeight == 0x7fffffff {\n\t\t\tinputHeight = nextHeight\n\t\t}\n\n\t\t// Given a sequence number, we apply the relative time lock\n\t\t// mask in order to obtain the time lock delta required before\n\t\t// this input can be spent.\n\t\tsequenceNum := txIn.Sequence\n\t\trelativeLock := int64(sequenceNum & wire.SequenceLockTimeMask)\n\n\t\tswitch {\n\t\t// Relative time locks are disabled for this input, so we can\n\t\t// skip any further calculation.\n\t\tcase sequenceNum&wire.SequenceLockTimeDisabled == wire.SequenceLockTimeDisabled:\n\t\t\tcontinue\n\t\tcase sequenceNum&wire.SequenceLockTimeIsSeconds == wire.SequenceLockTimeIsSeconds:\n\t\t\t// This input requires a relative time lock expressed\n\t\t\t// in seconds before it can be spent.  Therefore, we\n\t\t\t// need to query for the block prior to the one in\n\t\t\t// which this input was included within so we can\n\t\t\t// compute the past median time for the block prior to\n\t\t\t// the one which included this referenced output.\n\t\t\tprevInputHeight := inputHeight - 1\n\t\t\tif prevInputHeight < 0 {\n\t\t\t\tprevInputHeight = 0\n\t\t\t}\n\t\t\tblockNode := node.Ancestor(prevInputHeight)\n\t\t\tmedianTime := CalcPastMedianTime(blockNode)\n\n\t\t\t// Time based relative time-locks as defined by BIP 68\n\t\t\t// have a time granularity of RelativeLockSeconds, so\n\t\t\t// we shift left by this amount to convert to the\n\t\t\t// proper relative time-lock. We also subtract one from\n\t\t\t// the relative lock to maintain the original lockTime\n\t\t\t// semantics.\n\t\t\ttimeLockSeconds := (relativeLock << wire.SequenceLockTimeGranularity) - 1\n\t\t\ttimeLock := medianTime.Unix() + timeLockSeconds\n\t\t\tif timeLock > sequenceLock.Seconds {\n\t\t\t\tsequenceLock.Seconds = timeLock\n\t\t\t}\n\t\tdefault:\n\t\t\t// The relative lock-time for this input is expressed\n\t\t\t// in blocks so we calculate the relative offset from\n\t\t\t// the input's height as its converted absolute\n\t\t\t// lock-time. We subtract one from the relative lock in\n\t\t\t// order to maintain the original lockTime semantics.\n\t\t\tblockHeight := inputHeight + int32(relativeLock-1)\n\t\t\tif blockHeight > sequenceLock.BlockHeight {\n\t\t\t\tsequenceLock.BlockHeight = blockHeight\n\t\t\t}\n\t\t}\n\t}\n\n\treturn sequenceLock, nil\n}\n\n// LockTimeToSequence converts the passed relative locktime to a sequence\n// number in accordance to BIP-68.\n// See: https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki\n//   - (Compatibility)\nfunc LockTimeToSequence(isSeconds bool, locktime uint32) uint32 {\n\t// If we're expressing the relative lock time in blocks, then the\n\t// corresponding sequence number is simply the desired input age.\n\tif !isSeconds {\n\t\treturn locktime\n\t}\n\n\t// Set the 22nd bit which indicates the lock time is in seconds, then\n\t// shift the locktime over by 9 since the time granularity is in\n\t// 512-second intervals (2^9). This results in a max lock-time of\n\t// 33,553,920 seconds, or 1.1 years.\n\treturn wire.SequenceLockTimeIsSeconds |\n\t\tlocktime>>wire.SequenceLockTimeGranularity\n}\n\n// getReorganizeNodes finds the fork point between the main chain and the passed\n// node and returns a list of block nodes that would need to be detached from\n// the main chain and a list of block nodes that would need to be attached to\n// the fork point (which will be the end of the main chain after detaching the\n// returned list of block nodes) in order to reorganize the chain such that the\n// passed node is the new end of the main chain.  The lists will be empty if the\n// passed node is not on a side chain.\n//\n// This function may modify node statuses in the block index without flushing.\n//\n// This function MUST be called with the chain state lock held (for reads).\nfunc (b *BlockChain) getReorganizeNodes(node *blockNode) (*list.List, *list.List) {\n\tattachNodes := list.New()\n\tdetachNodes := list.New()\n\n\t// Do not reorganize to a known invalid chain. Ancestors deeper than the\n\t// direct parent are checked below but this is a quick check before doing\n\t// more unnecessary work.\n\tif b.index.NodeStatus(node.parent).KnownInvalid() {\n\t\tb.index.SetStatusFlags(node, statusInvalidAncestor)\n\t\treturn detachNodes, attachNodes\n\t}\n\n\t// Find the fork point (if any) adding each block to the list of nodes\n\t// to attach to the main tree.  Push them onto the list in reverse order\n\t// so they are attached in the appropriate order when iterating the list\n\t// later.\n\tforkNode := b.bestChain.FindFork(node)\n\tinvalidChain := false\n\tfor n := node; n != nil && n != forkNode; n = n.parent {\n\t\tif b.index.NodeStatus(n).KnownInvalid() {\n\t\t\tinvalidChain = true\n\t\t\tbreak\n\t\t}\n\t\tattachNodes.PushFront(n)\n\t}\n\n\t// If any of the node's ancestors are invalid, unwind attachNodes, marking\n\t// each one as invalid for future reference.\n\tif invalidChain {\n\t\tvar next *list.Element\n\t\tfor e := attachNodes.Front(); e != nil; e = next {\n\t\t\tnext = e.Next()\n\t\t\tn := attachNodes.Remove(e).(*blockNode)\n\t\t\tb.index.SetStatusFlags(n, statusInvalidAncestor)\n\t\t}\n\t\treturn detachNodes, attachNodes\n\t}\n\n\t// Start from the end of the main chain and work backwards until the\n\t// common ancestor adding each block to the list of nodes to detach from\n\t// the main chain.\n\tfor n := b.bestChain.Tip(); n != nil && n != forkNode; n = n.parent {\n\t\tdetachNodes.PushBack(n)\n\t}\n\n\treturn detachNodes, attachNodes\n}\n\n// connectBlock handles connecting the passed node/block to the end of the main\n// (best) chain.\n//\n// Passing in a utxo view is optional.  If the passed in utxo view is nil,\n// connectBlock will assume that the utxo cache has already connected all the\n// txs in the block being connected.\n// If a utxo view is passed in, this passed utxo view must have all referenced\n// txos the block spends marked as spent and all of the new txos the block creates\n// added to it.\n//\n// The passed stxos slice must be populated with all of the information for the\n// spent txos.  This approach is used because the connection validation that\n// must happen prior to calling this function requires the same details, so\n// it would be inefficient to repeat it.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) connectBlock(node *blockNode, block *btcutil.Block,\n\tstxos []SpentTxOut) error {\n\n\t// Make sure it's extending the end of the best chain.\n\tprevHash := &block.MsgBlock().Header.PrevBlock\n\tif !prevHash.IsEqual(&b.bestChain.Tip().hash) {\n\t\treturn AssertError(\"connectBlock must be called with a block \" +\n\t\t\t\"that extends the main chain\")\n\t}\n\n\t// Sanity check the correct number of stxos are provided.\n\tif len(stxos) != countSpentOutputs(block) {\n\t\treturn AssertError(\"connectBlock called with inconsistent \" +\n\t\t\t\"spent transaction out information\")\n\t}\n\n\t// No warnings about unknown rules until the chain is current.\n\tif b.isCurrent() {\n\t\t// Warn if any unknown new rules are either about to activate or\n\t\t// have already been activated.\n\t\tif err := b.warnUnknownRuleActivations(node); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Write any block status changes to DB before updating best state.\n\terr := b.index.flushToDB()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Generate a new best state snapshot that will be used to update the\n\t// database and later memory if all database updates are successful.\n\tb.stateLock.RLock()\n\tcurTotalTxns := b.stateSnapshot.TotalTxns\n\tb.stateLock.RUnlock()\n\tnumTxns := uint64(len(block.MsgBlock().Transactions))\n\tblockSize := uint64(block.MsgBlock().SerializeSize())\n\tblockWeight := uint64(GetBlockWeight(block))\n\tstate := newBestState(node, blockSize, blockWeight, numTxns,\n\t\tcurTotalTxns+numTxns, CalcPastMedianTime(node),\n\t)\n\n\t// Atomically insert info into the database.\n\terr = b.db.Update(func(dbTx database.Tx) error {\n\t\t// If the pruneTarget isn't 0, we should attempt to delete older blocks\n\t\t// from the database.\n\t\tif b.pruneTarget != 0 {\n\t\t\t// When the total block size is under the prune target, prune blocks is\n\t\t\t// a no-op and the deleted hashes are nil.\n\t\t\tdeletedHashes, err := dbTx.PruneBlocks(b.pruneTarget)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Only attempt to delete if we have any deleted blocks.\n\t\t\tif len(deletedHashes) != 0 {\n\t\t\t\t// Delete the spend journals of the pruned blocks.\n\t\t\t\terr = dbPruneSpendJournalEntry(dbTx, deletedHashes)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\t// We may need to flush if the prune will delete blocks that\n\t\t\t\t// are past our last flush block.\n\t\t\t\t//\n\t\t\t\t// NOTE: the database will never be inconsistent here as the\n\t\t\t\t// actual blocks are not deleted until the db.Update returns.\n\t\t\t\tneedsFlush, err := b.flushNeededAfterPrune(deletedHashes)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif needsFlush {\n\t\t\t\t\t// Since the deleted hashes are past our last\n\t\t\t\t\t// flush block, flush the utxo cache now.\n\t\t\t\t\terr = b.utxoCache.flush(dbTx, FlushRequired, state)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update best block state.\n\t\terr := dbPutBestState(dbTx, state, node.workSum)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Add the block hash and height to the block index which tracks\n\t\t// the main chain.\n\t\terr = dbPutBlockIndex(dbTx, block.Hash(), node.height)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Update the transaction spend journal by adding a record for\n\t\t// the block that contains all txos spent by it.\n\t\terr = dbPutSpendJournalEntry(dbTx, block.Hash(), stxos)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Allow the index manager to call each of the currently active\n\t\t// optional indexes with the block being connected so they can\n\t\t// update themselves accordingly.\n\t\tif b.indexManager != nil {\n\t\t\terr := b.indexManager.ConnectBlock(dbTx, block, stxos)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// This node is now the end of the best chain.\n\tb.bestChain.SetTip(node)\n\n\t// Update the state for the best block.  Notice how this replaces the\n\t// entire struct instead of updating the existing one.  This effectively\n\t// allows the old version to act as a snapshot which callers can use\n\t// freely without needing to hold a lock for the duration.  See the\n\t// comments on the state variable for more details.\n\tb.stateLock.Lock()\n\tb.stateSnapshot = state\n\tb.stateLock.Unlock()\n\n\t// Notify the caller that the block was connected to the main chain.\n\t// The caller would typically want to react with actions such as\n\t// updating wallets.\n\tfunc() {\n\t\tb.chainLock.Unlock()\n\t\tdefer b.chainLock.Lock()\n\t\tb.sendNotification(NTBlockConnected, block)\n\t}()\n\n\t// Since we may have changed the UTXO cache, we make sure it didn't exceed its\n\t// maximum size.  If we're pruned and have flushed already, this will be a no-op.\n\treturn b.db.Update(func(dbTx database.Tx) error {\n\t\treturn b.utxoCache.flush(dbTx, FlushIfNeeded, state)\n\t})\n}\n\n// disconnectBlock handles disconnecting the passed node/block from the end of\n// the main (best) chain.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) disconnectBlock(node *blockNode, block *btcutil.Block, view *UtxoViewpoint) error {\n\t// Make sure the node being disconnected is the end of the best chain.\n\tif !node.hash.IsEqual(&b.bestChain.Tip().hash) {\n\t\treturn AssertError(\"disconnectBlock must be called with the \" +\n\t\t\t\"block at the end of the main chain\")\n\t}\n\n\t// Load the previous block since some details for it are needed below.\n\tprevNode := node.parent\n\tvar prevBlock *btcutil.Block\n\terr := b.db.View(func(dbTx database.Tx) error {\n\t\tvar err error\n\t\tprevBlock, err = dbFetchBlockByNode(dbTx, prevNode)\n\t\treturn err\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Write any block status changes to DB before updating best state.\n\terr = b.index.flushToDB()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Generate a new best state snapshot that will be used to update the\n\t// database and later memory if all database updates are successful.\n\tb.stateLock.RLock()\n\tcurTotalTxns := b.stateSnapshot.TotalTxns\n\tb.stateLock.RUnlock()\n\tnumTxns := uint64(len(prevBlock.MsgBlock().Transactions))\n\tblockSize := uint64(prevBlock.MsgBlock().SerializeSize())\n\tblockWeight := uint64(GetBlockWeight(prevBlock))\n\tnewTotalTxns := curTotalTxns - uint64(len(block.MsgBlock().Transactions))\n\tstate := newBestState(prevNode, blockSize, blockWeight, numTxns,\n\t\tnewTotalTxns, CalcPastMedianTime(prevNode))\n\n\terr = b.db.Update(func(dbTx database.Tx) error {\n\t\t// Update best block state.\n\t\terr := dbPutBestState(dbTx, state, node.workSum)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Remove the block hash and height from the block index which\n\t\t// tracks the main chain.\n\t\terr = dbRemoveBlockIndex(dbTx, block.Hash(), node.height)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Flush the cache on every disconnect.  Since the code for\n\t\t// reorganization modifies the database directly, the cache\n\t\t// will be left in an inconsistent state if we don't flush it\n\t\t// prior to the dbPutUtxoView that happens below.\n\t\terr = b.utxoCache.flush(dbTx, FlushRequired, state)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Update the utxo set using the state of the utxo view.  This\n\t\t// entails restoring all of the utxos spent and removing the new\n\t\t// ones created by the block.\n\t\terr = dbPutUtxoView(dbTx, view)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Before we delete the spend journal entry for this back,\n\t\t// we'll fetch it as is so the indexers can utilize if needed.\n\t\tstxos, err := dbFetchSpendJournalEntry(dbTx, block)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Update the transaction spend journal by removing the record\n\t\t// that contains all txos spent by the block.\n\t\terr = dbRemoveSpendJournalEntry(dbTx, block.Hash())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Allow the index manager to call each of the currently active\n\t\t// optional indexes with the block being disconnected so they\n\t\t// can update themselves accordingly.\n\t\tif b.indexManager != nil {\n\t\t\terr := b.indexManager.DisconnectBlock(dbTx, block, stxos)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Prune fully spent entries and mark all entries in the view unmodified\n\t// now that the modifications have been committed to the database.\n\tview.commit()\n\n\t// This node's parent is now the end of the best chain.\n\tb.bestChain.SetTip(node.parent)\n\n\t// Update the state for the best block.  Notice how this replaces the\n\t// entire struct instead of updating the existing one.  This effectively\n\t// allows the old version to act as a snapshot which callers can use\n\t// freely without needing to hold a lock for the duration.  See the\n\t// comments on the state variable for more details.\n\tb.stateLock.Lock()\n\tb.stateSnapshot = state\n\tb.stateLock.Unlock()\n\n\t// Notify the caller that the block was disconnected from the main\n\t// chain.  The caller would typically want to react with actions such as\n\t// updating wallets.\n\tfunc() {\n\t\tb.chainLock.Unlock()\n\t\tdefer b.chainLock.Lock()\n\t\tb.sendNotification(NTBlockDisconnected, block)\n\t}()\n\n\treturn nil\n}\n\n// countSpentOutputs returns the number of utxos the passed block spends.\nfunc countSpentOutputs(block *btcutil.Block) int {\n\t// Exclude the coinbase transaction since it can't spend anything.\n\tvar numSpent int\n\tfor _, tx := range block.Transactions()[1:] {\n\t\tnumSpent += len(tx.MsgTx().TxIn)\n\t}\n\treturn numSpent\n}\n\n// reorganizeChain reorganizes the block chain by disconnecting the nodes in the\n// detachNodes list and connecting the nodes in the attach list.  It expects\n// that the lists are already in the correct order and are in sync with the\n// end of the current best chain.  Specifically, nodes that are being\n// disconnected must be in reverse order (think of popping them off the end of\n// the chain) and nodes the are being attached must be in forwards order\n// (think pushing them onto the end of the chain).\n//\n// This function may modify node statuses in the block index without flushing.\n//\n// This function never leaves the utxo set in an inconsistent state for block\n// disconnects.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) reorganizeChain(detachNodes, attachNodes *list.List) error {\n\t// Check first that the detach and the attach nodes are valid and they\n\t// pass verification.\n\tdetachBlocks, attachBlocks, detachSpentTxOuts,\n\t\terr := b.verifyReorganizationValidity(detachNodes, attachNodes)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Track the old and new best chains heads.\n\ttip := b.bestChain.Tip()\n\toldBest := tip\n\tnewBest := tip\n\n\t// Reset the view for the actual connection code below.  This is\n\t// required because the view was previously modified when checking if\n\t// the reorg would be successful and the connection code requires the\n\t// view to be valid from the viewpoint of each block being disconnected.\n\tview := NewUtxoViewpoint()\n\tview.SetBestHash(&b.bestChain.Tip().hash)\n\n\t// Disconnect blocks from the main chain.\n\tfor i, e := 0, detachNodes.Front(); e != nil; i, e = i+1, e.Next() {\n\t\tn := e.Value.(*blockNode)\n\t\tblock := detachBlocks[i]\n\n\t\t// Load all of the utxos referenced by the block that aren't\n\t\t// already in the view.\n\t\terr := view.fetchInputUtxos(b.utxoCache, block)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Update the view to unspend all of the spent txos and remove\n\t\t// the utxos created by the block.\n\t\terr = view.disconnectTransactions(\n\t\t\tb.db, block, detachSpentTxOuts[i],\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Update the database and chain state. The cache will be flushed\n\t\t// here before the utxoview modifications happen to the database.\n\t\terr = b.disconnectBlock(n, block, view)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tnewBest = n.parent\n\t}\n\n\t// Set the fork point only if there are nodes to attach since otherwise\n\t// blocks are only being disconnected and thus there is no fork point.\n\tvar forkNode *blockNode\n\tif attachNodes.Len() > 0 {\n\t\tforkNode = newBest\n\t}\n\n\t// Connect the new best chain blocks using the utxocache directly.  It's more\n\t// efficient and since we already checked that the blocks are correct and that\n\t// the transactions connect properly, it's ok to access the cache.  If we suddenly\n\t// crash here, we are able to recover as well.\n\tfor i, e := 0, attachNodes.Front(); e != nil; i, e = i+1, e.Next() {\n\t\tn := e.Value.(*blockNode)\n\t\tblock := attachBlocks[i]\n\n\t\t// Update the cache to mark all utxos referenced by the block\n\t\t// as spent and add all transactions being created by this block\n\t\t// to it.  Also, provide an stxo slice so the spent txout\n\t\t// details are generated.\n\t\tstxos := make([]SpentTxOut, 0, countSpentOutputs(block))\n\t\terr = b.utxoCache.connectTransactions(block, &stxos)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Update the database and chain state.\n\t\terr = b.connectBlock(n, block, stxos)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tnewBest = n\n\t}\n\n\t// Log the point where the chain forked and old and new best chain\n\t// heads.\n\tif forkNode != nil {\n\t\tlog.Infof(\"REORGANIZE: Chain forks at %v (height %v)\", forkNode.hash,\n\t\t\tforkNode.height)\n\t}\n\tlog.Infof(\"REORGANIZE: Old best chain head was %v (height %v)\",\n\t\t&oldBest.hash, oldBest.height)\n\tlog.Infof(\"REORGANIZE: New best chain head is %v (height %v)\",\n\t\tnewBest.hash, newBest.height)\n\n\treturn nil\n}\n\n// verifyReorganizationValidity will verify that the disconnects and the connects\n// that are in the list are able to be processed without mutating the chain.\n//\n// For the attach nodes, it'll check that each of the blocks are valid and will\n// change the status of the block node in the list to invalid if the block fails\n// to pass verification.  For the detach nodes, it'll check that the blocks being\n// detached and their spend journals are present on the database.\nfunc (b *BlockChain) verifyReorganizationValidity(detachNodes, attachNodes *list.List) (\n\t[]*btcutil.Block, []*btcutil.Block, [][]SpentTxOut, error) {\n\n\t// Nothing to do if no reorganize nodes were provided.\n\tif detachNodes.Len() == 0 && attachNodes.Len() == 0 {\n\t\treturn nil, nil, nil, nil\n\t}\n\n\t// Ensure the provided nodes match the current best chain.\n\ttip := b.bestChain.Tip()\n\tif detachNodes.Len() != 0 {\n\t\tfirstDetachNode := detachNodes.Front().Value.(*blockNode)\n\t\tif firstDetachNode.hash != tip.hash {\n\t\t\treturn nil, nil, nil,\n\t\t\t\tAssertError(fmt.Sprintf(\"reorganize nodes to detach are \"+\n\t\t\t\t\t\"not for the current best chain -- first detach node %v, \"+\n\t\t\t\t\t\"current chain %v\", &firstDetachNode.hash, &tip.hash))\n\t\t}\n\t}\n\n\t// Ensure the provided nodes are for the same fork point.\n\tif attachNodes.Len() != 0 && detachNodes.Len() != 0 {\n\t\tfirstAttachNode := attachNodes.Front().Value.(*blockNode)\n\t\tlastDetachNode := detachNodes.Back().Value.(*blockNode)\n\t\tif firstAttachNode.parent.hash != lastDetachNode.parent.hash {\n\t\t\treturn nil, nil, nil,\n\t\t\t\tAssertError(fmt.Sprintf(\"reorganize nodes do not have the \"+\n\t\t\t\t\t\"same fork point -- first attach parent %v, last detach \"+\n\t\t\t\t\t\"parent %v\", &firstAttachNode.parent.hash,\n\t\t\t\t\t&lastDetachNode.parent.hash))\n\t\t}\n\t}\n\n\t// All of the blocks to detach and related spend journal entries needed\n\t// to unspend transaction outputs in the blocks being disconnected must\n\t// be loaded from the database during the reorg check phase below and\n\t// then they are needed again when doing the actual database updates.\n\t// Rather than doing two loads, cache the loaded data into these slices.\n\tdetachBlocks := make([]*btcutil.Block, 0, detachNodes.Len())\n\tdetachSpentTxOuts := make([][]SpentTxOut, 0, detachNodes.Len())\n\tattachBlocks := make([]*btcutil.Block, 0, attachNodes.Len())\n\n\t// Disconnect all of the blocks back to the point of the fork.  This\n\t// entails loading the blocks and their associated spent txos from the\n\t// database and using that information to unspend all of the spent txos\n\t// and remove the utxos created by the blocks.\n\tview := NewUtxoViewpoint()\n\tview.SetBestHash(&tip.hash)\n\tfor e := detachNodes.Front(); e != nil; e = e.Next() {\n\t\tn := e.Value.(*blockNode)\n\t\tvar block *btcutil.Block\n\t\terr := b.db.View(func(dbTx database.Tx) error {\n\t\t\tvar err error\n\t\t\tblock, err = dbFetchBlockByNode(dbTx, n)\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, nil, nil, err\n\t\t}\n\t\tif n.hash != *block.Hash() {\n\t\t\treturn nil, nil, nil, AssertError(\n\t\t\t\tfmt.Sprintf(\"detach block node hash %v (height \"+\n\t\t\t\t\t\"%v) does not match previous parent block hash %v\",\n\t\t\t\t\t&n.hash, n.height, block.Hash()))\n\t\t}\n\n\t\t// Load all of the utxos referenced by the block that aren't\n\t\t// already in the view.\n\t\terr = view.fetchInputUtxos(b.utxoCache, block)\n\t\tif err != nil {\n\t\t\treturn nil, nil, nil, err\n\t\t}\n\n\t\t// Load all of the spent txos for the block from the spend\n\t\t// journal.\n\t\tvar stxos []SpentTxOut\n\t\terr = b.db.View(func(dbTx database.Tx) error {\n\t\t\tstxos, err = dbFetchSpendJournalEntry(dbTx, block)\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, nil, nil, err\n\t\t}\n\n\t\t// Store the loaded block and spend journal entry for later.\n\t\tdetachBlocks = append(detachBlocks, block)\n\t\tdetachSpentTxOuts = append(detachSpentTxOuts, stxos)\n\n\t\terr = view.disconnectTransactions(b.db, block, stxos)\n\t\tif err != nil {\n\t\t\treturn nil, nil, nil, err\n\t\t}\n\t}\n\n\t// Perform several checks to verify each block that needs to be attached\n\t// to the main chain can be connected without violating any rules and\n\t// without actually connecting the block.\n\t//\n\t// NOTE: These checks could be done directly when connecting a block,\n\t// however the downside to that approach is that if any of these checks\n\t// fail after disconnecting some blocks or attaching others, all of the\n\t// operations have to be rolled back to get the chain back into the\n\t// state it was before the rule violation (or other failure).  There are\n\t// at least a couple of ways accomplish that rollback, but both involve\n\t// tweaking the chain and/or database.  This approach catches these\n\t// issues before ever modifying the chain.\n\tfor e := attachNodes.Front(); e != nil; e = e.Next() {\n\t\tn := e.Value.(*blockNode)\n\n\t\tvar block *btcutil.Block\n\t\terr := b.db.View(func(dbTx database.Tx) error {\n\t\t\tvar err error\n\t\t\tblock, err = dbFetchBlockByNode(dbTx, n)\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, nil, nil, err\n\t\t}\n\n\t\t// Store the loaded block for later.\n\t\tattachBlocks = append(attachBlocks, block)\n\n\t\t// Skip checks if node has already been fully validated. Although\n\t\t// checkConnectBlock gets skipped, we still need to update the UTXO\n\t\t// view.\n\t\tif b.index.NodeStatus(n).KnownValid() {\n\t\t\terr = view.fetchInputUtxos(b.utxoCache, block)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, nil, nil, err\n\t\t\t}\n\t\t\terr = view.connectTransactions(block, nil)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, nil, nil, err\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\n\t\t// Notice the spent txout details are not requested here and\n\t\t// thus will not be generated.  This is done because the state\n\t\t// is not being immediately written to the database, so it is\n\t\t// not needed.\n\t\t//\n\t\t// In the case the block is determined to be invalid due to a\n\t\t// rule violation, mark it as invalid and mark all of its\n\t\t// descendants as having an invalid ancestor.\n\t\terr = b.checkConnectBlock(n, block, view, nil)\n\t\tif err != nil {\n\t\t\tif _, ok := err.(RuleError); ok {\n\t\t\t\tb.index.SetStatusFlags(n, statusValidateFailed)\n\t\t\t\tfor de := e.Next(); de != nil; de = de.Next() {\n\t\t\t\t\tdn := de.Value.(*blockNode)\n\t\t\t\t\tb.index.SetStatusFlags(dn, statusInvalidAncestor)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil, nil, nil, err\n\t\t}\n\t\tb.index.SetStatusFlags(n, statusValid)\n\t}\n\n\treturn detachBlocks, attachBlocks, detachSpentTxOuts, nil\n}\n\n// connectBestChain handles connecting the passed block to the chain while\n// respecting proper chain selection according to the chain with the most\n// proof of work.  In the typical case, the new block simply extends the main\n// chain.  However, it may also be extending (or creating) a side chain (fork)\n// which may or may not end up becoming the main chain depending on which fork\n// cumulatively has the most proof of work.  It returns whether or not the block\n// ended up on the main chain (either due to extending the main chain or causing\n// a reorganization to become the main chain).\n//\n// The flags modify the behavior of this function as follows:\n//   - BFFastAdd: Avoids several expensive transaction validation operations.\n//     This is useful when using checkpoints.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) connectBestChain(node *blockNode, block *btcutil.Block, flags BehaviorFlags) (bool, error) {\n\tfastAdd := flags&BFFastAdd == BFFastAdd\n\n\tflushIndexState := func() {\n\t\t// Intentionally ignore errors writing updated node status to DB. If\n\t\t// it fails to write, it's not the end of the world. If the block is\n\t\t// valid, we flush in connectBlock and if the block is invalid, the\n\t\t// worst that can happen is we revalidate the block after a restart.\n\t\tif writeErr := b.index.flushToDB(); writeErr != nil {\n\t\t\tlog.Warnf(\"Error flushing block index changes to disk: %v\",\n\t\t\t\twriteErr)\n\t\t}\n\t}\n\n\t// We are extending the main (best) chain with a new block.  This is the\n\t// most common case.\n\tparentHash := &block.MsgBlock().Header.PrevBlock\n\tif parentHash.IsEqual(&b.bestChain.Tip().hash) {\n\t\t// Skip checks if node has already been fully validated.\n\t\tfastAdd = fastAdd || b.index.NodeStatus(node).KnownValid()\n\n\t\t// Perform several checks to verify the block can be connected\n\t\t// to the main chain without violating any rules and without\n\t\t// actually connecting the block.\n\t\tif !fastAdd {\n\t\t\t// We create a viewpoint here to avoid spending or adding new\n\t\t\t// coins to the utxo cache.\n\t\t\t//\n\t\t\t// checkConnectBlock spends and adds utxos before doing the\n\t\t\t// signature validation and if the signature validation fails,\n\t\t\t// we would be forced to undo the utxo cache.\n\t\t\t//\n\t\t\t// TODO (kcalvinalvin): Doing all of the validation before connecting\n\t\t\t// the tx inside check connect block would allow us to pass the utxo\n\t\t\t// cache directly to the check connect block.  This would save on the\n\t\t\t// expensive memory allocation done by fetch input utxos.\n\t\t\tview := NewUtxoViewpoint()\n\t\t\tview.SetBestHash(parentHash)\n\t\t\terr := b.checkConnectBlock(node, block, view, nil)\n\t\t\tif err == nil {\n\t\t\t\tb.index.SetStatusFlags(node, statusValid)\n\t\t\t} else if _, ok := err.(RuleError); ok {\n\t\t\t\tb.index.SetStatusFlags(node, statusValidateFailed)\n\t\t\t} else {\n\t\t\t\treturn false, err\n\t\t\t}\n\n\t\t\tflushIndexState()\n\n\t\t\tif err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t}\n\n\t\t// Connect the transactions to the cache.  All the txs are considered valid\n\t\t// at this point as they have passed validation or was considered valid already.\n\t\tstxos := make([]SpentTxOut, 0, countSpentOutputs(block))\n\t\terr := b.utxoCache.connectTransactions(block, &stxos)\n\t\tif err != nil {\n\t\t\treturn false, err\n\t\t}\n\n\t\t// Connect the block to the main chain.\n\t\terr = b.connectBlock(node, block, stxos)\n\t\tif err != nil {\n\t\t\t// If we got hit with a rule error, then we'll mark\n\t\t\t// that status of the block as invalid and flush the\n\t\t\t// index state to disk before returning with the error.\n\t\t\tif _, ok := err.(RuleError); ok {\n\t\t\t\tb.index.SetStatusFlags(\n\t\t\t\t\tnode, statusValidateFailed,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tflushIndexState()\n\n\t\t\treturn false, err\n\t\t}\n\n\t\t// If this is fast add, or this block node isn't yet marked as\n\t\t// valid, then we'll update its status and flush the state to\n\t\t// disk again.\n\t\tif fastAdd || !b.index.NodeStatus(node).KnownValid() {\n\t\t\tb.index.SetStatusFlags(node, statusValid)\n\t\t\tflushIndexState()\n\t\t}\n\n\t\treturn true, nil\n\t}\n\tif fastAdd {\n\t\tlog.Warnf(\"fastAdd set in the side chain case? %v\\n\",\n\t\t\tblock.Hash())\n\t}\n\n\t// We're extending (or creating) a side chain, but the cumulative\n\t// work for this new side chain is not enough to make it the new chain.\n\tif node.workSum.Cmp(b.bestChain.Tip().workSum) <= 0 {\n\t\t// Log information about how the block is forking the chain.\n\t\tfork := b.bestChain.FindFork(node)\n\t\tif fork.hash.IsEqual(parentHash) {\n\t\t\tlog.Infof(\"FORK: Block %v forks the chain at height %d\"+\n\t\t\t\t\"/block %v, but does not cause a reorganize\",\n\t\t\t\tnode.hash, fork.height, fork.hash)\n\t\t} else {\n\t\t\tlog.Infof(\"EXTEND FORK: Block %v extends a side chain \"+\n\t\t\t\t\"which forks the chain at height %d/block %v\",\n\t\t\t\tnode.hash, fork.height, fork.hash)\n\t\t}\n\n\t\treturn false, nil\n\t}\n\n\t// We're extending (or creating) a side chain and the cumulative work\n\t// for this new side chain is more than the old best chain, so this side\n\t// chain needs to become the main chain.  In order to accomplish that,\n\t// find the common ancestor of both sides of the fork, disconnect the\n\t// blocks that form the (now) old fork from the main chain, and attach\n\t// the blocks that form the new chain to the main chain starting at the\n\t// common ancenstor (the point where the chain forked).\n\tdetachNodes, attachNodes := b.getReorganizeNodes(node)\n\n\t// Reorganize the chain.\n\tlog.Infof(\"REORGANIZE: Block %v is causing a reorganize.\", node.hash)\n\terr := b.reorganizeChain(detachNodes, attachNodes)\n\n\t// Either getReorganizeNodes or reorganizeChain could have made unsaved\n\t// changes to the block index, so flush regardless of whether there was an\n\t// error. The index would only be dirty if the block failed to connect, so\n\t// we can ignore any errors writing.\n\tif writeErr := b.index.flushToDB(); writeErr != nil {\n\t\tlog.Warnf(\"Error flushing block index changes to disk: %v\", writeErr)\n\t}\n\n\treturn err == nil, err\n}\n\n// isCurrent returns whether or not the chain believes it is current.  Several\n// factors are used to guess, but the key factors that allow the chain to\n// believe it is current are:\n//   - Latest block height is after the latest checkpoint (if enabled)\n//   - Latest block has a timestamp newer than 24 hours ago\n//\n// This function MUST be called with the chain state lock held (for reads).\nfunc (b *BlockChain) isCurrent() bool {\n\t// Not current if the latest main (best) chain height is before the\n\t// latest known good checkpoint (when checkpoints are enabled).\n\tcheckpoint := b.LatestCheckpoint()\n\tif checkpoint != nil && b.bestChain.Tip().height < checkpoint.Height {\n\t\treturn false\n\t}\n\n\t// Not current if the latest best block has a timestamp before 24 hours\n\t// ago.\n\t//\n\t// The chain appears to be current if none of the checks reported\n\t// otherwise.\n\tminus24Hours := b.timeSource.AdjustedTime().Add(-24 * time.Hour).Unix()\n\treturn b.bestChain.Tip().timestamp >= minus24Hours\n}\n\n// IsCurrent returns whether or not the chain believes it is current.  Several\n// factors are used to guess, but the key factors that allow the chain to\n// believe it is current are:\n//   - Latest block height is after the latest checkpoint (if enabled)\n//   - Latest block has a timestamp newer than 24 hours ago\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) IsCurrent() bool {\n\tb.chainLock.RLock()\n\tdefer b.chainLock.RUnlock()\n\n\treturn b.isCurrent()\n}\n\n// BestSnapshot returns information about the current best chain block and\n// related state as of the current point in time.  The returned instance must be\n// treated as immutable since it is shared by all callers.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) BestSnapshot() *BestState {\n\tb.stateLock.RLock()\n\tsnapshot := b.stateSnapshot\n\tb.stateLock.RUnlock()\n\treturn snapshot\n}\n\n// TipStatus is the status of a chain tip.\ntype TipStatus byte\n\nconst (\n\t// StatusUnknown indicates that the tip status isn't any of the defined\n\t// statuses.\n\tStatusUnknown TipStatus = iota\n\n\t// StatusActive indicates that the tip is considered active and is in\n\t// the best chain.\n\tStatusActive\n\n\t// StatusInvalid indicates that this tip or any of the ancestors of this\n\t// tip are invalid.\n\tStatusInvalid\n\n\t// StatusValidFork is given if:\n\t// 1: Not a part of the best chain.\n\t// 2: Is not invalid.\n\t// 3: Has the block data stored to disk.\n\tStatusValidFork\n)\n\n// String returns the status flags as string.\nfunc (ts TipStatus) String() string {\n\tswitch ts {\n\tcase StatusActive:\n\t\treturn \"active\"\n\tcase StatusInvalid:\n\t\treturn \"invalid\"\n\tcase StatusValidFork:\n\t\treturn \"valid-fork\"\n\t}\n\treturn fmt.Sprintf(\"unknown: %b\", ts)\n}\n\n// ChainTip represents the last block in a branch of the block tree.\ntype ChainTip struct {\n\t// Height of the tip.\n\tHeight int32\n\n\t// BlockHash hash of the tip.\n\tBlockHash chainhash.Hash\n\n\t// BranchLen is length of the fork point of this chain from the main chain.\n\t// Returns 0 if the chain tip is a part of the best chain.\n\tBranchLen int32\n\n\t// Status is the validity status of the branch this tip is in.\n\tStatus TipStatus\n}\n\n// ChainTips returns all the chain tips the node itself is aware of.  Each tip is\n// represented by its height, block hash, branch length, and status.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) ChainTips() []ChainTip {\n\tb.chainLock.RLock()\n\tdefer b.chainLock.RUnlock()\n\n\t// Grab all the inactive tips.\n\ttips := b.index.InactiveTips(b.bestChain)\n\n\t// Add the current tip.\n\ttips = append(tips, b.bestChain.Tip())\n\n\tchainTips := make([]ChainTip, 0, len(tips))\n\n\t// Go through all the tips and grab the height, hash, branch length, and the block\n\t// status.\n\tfor _, tip := range tips {\n\t\tvar status TipStatus\n\t\tswitch {\n\t\t// The tip is considered active if it's in the best chain.\n\t\tcase b.bestChain.Contains(tip):\n\t\t\tstatus = StatusActive\n\n\t\t// This block or any of the ancestors of this block are invalid.\n\t\tcase tip.status.KnownInvalid():\n\t\t\tstatus = StatusInvalid\n\n\t\t// If the tip meets the following criteria:\n\t\t// 1: Not a part of the best chain.\n\t\t// 2: Is not invalid.\n\t\t// 3: Has the block data stored to disk.\n\t\t//\n\t\t// The tip is considered a valid fork.\n\t\t//\n\t\t// We can check if a tip is a valid-fork by checking that\n\t\t// its data is available. Since the behavior is to give a\n\t\t// block node the statusDataStored status once it passes\n\t\t// the proof of work checks and basic chain validity checks.\n\t\t//\n\t\t// We can't use the KnownValid status since it's only given\n\t\t// to blocks that passed the validation AND were a part of\n\t\t// the bestChain.\n\t\tcase tip.status.HaveData():\n\t\t\tstatus = StatusValidFork\n\t\t}\n\n\t\tchainTip := ChainTip{\n\t\t\tHeight:    tip.height,\n\t\t\tBlockHash: tip.hash,\n\t\t\tBranchLen: tip.height - b.bestChain.FindFork(tip).height,\n\t\t\tStatus:    status,\n\t\t}\n\n\t\tchainTips = append(chainTips, chainTip)\n\t}\n\n\treturn chainTips\n}\n\n// HeaderByHash returns the block header identified by the given hash or an\n// error if it doesn't exist. Note that this will return headers from both the\n// main and side chains.\nfunc (b *BlockChain) HeaderByHash(hash *chainhash.Hash) (wire.BlockHeader, error) {\n\tnode := b.index.LookupNode(hash)\n\tif node == nil {\n\t\terr := fmt.Errorf(\"block %s is not known\", hash)\n\t\treturn wire.BlockHeader{}, err\n\t}\n\n\treturn node.Header(), nil\n}\n\n// MainChainHasBlock returns whether or not the block with the given hash is in\n// the main chain.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) MainChainHasBlock(hash *chainhash.Hash) bool {\n\tnode := b.index.LookupNode(hash)\n\treturn node != nil && b.bestChain.Contains(node)\n}\n\n// BlockLocatorFromHash returns a block locator for the passed block hash.\n// See BlockLocator for details on the algorithm used to create a block locator.\n//\n// In addition to the general algorithm referenced above, this function will\n// return the block locator for the latest known tip of the main (best) chain if\n// the passed hash is not currently known.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) BlockLocatorFromHash(hash *chainhash.Hash) BlockLocator {\n\tb.chainLock.RLock()\n\tnode := b.index.LookupNode(hash)\n\tlocator := b.bestChain.blockLocator(node)\n\tb.chainLock.RUnlock()\n\treturn locator\n}\n\n// LatestBlockLocator returns a block locator for the latest known tip of the\n// main (best) chain.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) LatestBlockLocator() (BlockLocator, error) {\n\tb.chainLock.RLock()\n\tlocator := b.bestChain.BlockLocator(nil)\n\tb.chainLock.RUnlock()\n\treturn locator, nil\n}\n\n// BlockHeightByHash returns the height of the block with the given hash in the\n// main chain.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) BlockHeightByHash(hash *chainhash.Hash) (int32, error) {\n\tnode := b.index.LookupNode(hash)\n\tif node == nil || !b.bestChain.Contains(node) {\n\t\tstr := fmt.Sprintf(\"block %s is not in the main chain\", hash)\n\t\treturn 0, errNotInMainChain(str)\n\t}\n\n\treturn node.height, nil\n}\n\n// BlockHashByHeight returns the hash of the block at the given height in the\n// main chain.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) BlockHashByHeight(blockHeight int32) (*chainhash.Hash, error) {\n\tnode := b.bestChain.NodeByHeight(blockHeight)\n\tif node == nil {\n\t\tstr := fmt.Sprintf(\"no block at height %d exists\", blockHeight)\n\t\treturn nil, errNotInMainChain(str)\n\n\t}\n\n\treturn &node.hash, nil\n}\n\n// HeightRange returns a range of block hashes for the given start and end\n// heights.  It is inclusive of the start height and exclusive of the end\n// height.  The end height will be limited to the current main chain height.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) HeightRange(startHeight, endHeight int32) ([]chainhash.Hash, error) {\n\t// Ensure requested heights are sane.\n\tif startHeight < 0 {\n\t\treturn nil, fmt.Errorf(\"start height of fetch range must not \"+\n\t\t\t\"be less than zero - got %d\", startHeight)\n\t}\n\tif endHeight < startHeight {\n\t\treturn nil, fmt.Errorf(\"end height of fetch range must not \"+\n\t\t\t\"be less than the start height - got start %d, end %d\",\n\t\t\tstartHeight, endHeight)\n\t}\n\n\t// There is nothing to do when the start and end heights are the same,\n\t// so return now to avoid the chain view lock.\n\tif startHeight == endHeight {\n\t\treturn nil, nil\n\t}\n\n\t// Grab a lock on the chain view to prevent it from changing due to a\n\t// reorg while building the hashes.\n\tb.bestChain.mtx.Lock()\n\tdefer b.bestChain.mtx.Unlock()\n\n\t// When the requested start height is after the most recent best chain\n\t// height, there is nothing to do.\n\tlatestHeight := b.bestChain.tip().height\n\tif startHeight > latestHeight {\n\t\treturn nil, nil\n\t}\n\n\t// Limit the ending height to the latest height of the chain.\n\tif endHeight > latestHeight+1 {\n\t\tendHeight = latestHeight + 1\n\t}\n\n\t// Fetch as many as are available within the specified range.\n\thashes := make([]chainhash.Hash, 0, endHeight-startHeight)\n\tfor i := startHeight; i < endHeight; i++ {\n\t\thashes = append(hashes, b.bestChain.nodeByHeight(i).hash)\n\t}\n\treturn hashes, nil\n}\n\n// HeightToHashRange returns a range of block hashes for the given start height\n// and end hash, inclusive on both ends.  The hashes are for all blocks that are\n// ancestors of endHash with height greater than or equal to startHeight.  The\n// end hash must belong to a block that is known to be valid.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) HeightToHashRange(startHeight int32,\n\tendHash *chainhash.Hash, maxResults int) ([]chainhash.Hash, error) {\n\n\tendNode := b.index.LookupNode(endHash)\n\tif endNode == nil {\n\t\treturn nil, fmt.Errorf(\"no known block header with hash %v\", endHash)\n\t}\n\tif !b.index.NodeStatus(endNode).KnownValid() {\n\t\treturn nil, fmt.Errorf(\"block %v is not yet validated\", endHash)\n\t}\n\tendHeight := endNode.height\n\n\tif startHeight < 0 {\n\t\treturn nil, fmt.Errorf(\"start height (%d) is below 0\", startHeight)\n\t}\n\tif startHeight > endHeight {\n\t\treturn nil, fmt.Errorf(\"start height (%d) is past end height (%d)\",\n\t\t\tstartHeight, endHeight)\n\t}\n\n\tresultsLength := int(endHeight - startHeight + 1)\n\tif resultsLength > maxResults {\n\t\treturn nil, fmt.Errorf(\"number of results (%d) would exceed max (%d)\",\n\t\t\tresultsLength, maxResults)\n\t}\n\n\t// Walk backwards from endHeight to startHeight, collecting block hashes.\n\tnode := endNode\n\thashes := make([]chainhash.Hash, resultsLength)\n\tfor i := resultsLength - 1; i >= 0; i-- {\n\t\thashes[i] = node.hash\n\t\tnode = node.parent\n\t}\n\treturn hashes, nil\n}\n\n// IntervalBlockHashes returns hashes for all blocks that are ancestors of\n// endHash where the block height is a positive multiple of interval.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) IntervalBlockHashes(endHash *chainhash.Hash, interval int,\n) ([]chainhash.Hash, error) {\n\n\tendNode := b.index.LookupNode(endHash)\n\tif endNode == nil {\n\t\treturn nil, fmt.Errorf(\"no known block header with hash %v\", endHash)\n\t}\n\tif !b.index.NodeStatus(endNode).KnownValid() {\n\t\treturn nil, fmt.Errorf(\"block %v is not yet validated\", endHash)\n\t}\n\tendHeight := endNode.height\n\n\tresultsLength := int(endHeight) / interval\n\thashes := make([]chainhash.Hash, resultsLength)\n\n\tb.bestChain.mtx.Lock()\n\tdefer b.bestChain.mtx.Unlock()\n\n\tblockNode := endNode\n\tfor index := int(endHeight) / interval; index > 0; index-- {\n\t\t// Use the bestChain chainView for faster lookups once lookup intersects\n\t\t// the best chain.\n\t\tblockHeight := int32(index * interval)\n\t\tif b.bestChain.contains(blockNode) {\n\t\t\tblockNode = b.bestChain.nodeByHeight(blockHeight)\n\t\t} else {\n\t\t\tblockNode = blockNode.Ancestor(blockHeight)\n\t\t}\n\n\t\thashes[index-1] = blockNode.hash\n\t}\n\n\treturn hashes, nil\n}\n\n// locateInventory returns the node of the block after the first known block in\n// the locator along with the number of subsequent nodes needed to either reach\n// the provided stop hash or the provided max number of entries.\n//\n// In addition, there are two special cases:\n//\n//   - When no locators are provided, the stop hash is treated as a request for\n//     that block, so it will either return the node associated with the stop hash\n//     if it is known, or nil if it is unknown\n//   - When locators are provided, but none of them are known, nodes starting\n//     after the genesis block will be returned\n//\n// This is primarily a helper function for the locateBlocks and locateHeaders\n// functions.\n//\n// This function MUST be called with the chain state lock held (for reads).\nfunc (b *BlockChain) locateInventory(locator BlockLocator, hashStop *chainhash.Hash, maxEntries uint32) (*blockNode, uint32) {\n\t// There are no block locators so a specific block is being requested\n\t// as identified by the stop hash.\n\tstopNode := b.index.LookupNode(hashStop)\n\tif len(locator) == 0 {\n\t\tif stopNode == nil {\n\t\t\t// No blocks with the stop hash were found so there is\n\t\t\t// nothing to do.\n\t\t\treturn nil, 0\n\t\t}\n\t\treturn stopNode, 1\n\t}\n\n\t// Find the most recent locator block hash in the main chain.  In the\n\t// case none of the hashes in the locator are in the main chain, fall\n\t// back to the genesis block.\n\tstartNode := b.bestChain.Genesis()\n\tfor _, hash := range locator {\n\t\tnode := b.index.LookupNode(hash)\n\t\tif node != nil && b.bestChain.Contains(node) {\n\t\t\tstartNode = node\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// Start at the block after the most recently known block.  When there\n\t// is no next block it means the most recently known block is the tip of\n\t// the best chain, so there is nothing more to do.\n\tstartNode = b.bestChain.Next(startNode)\n\tif startNode == nil {\n\t\treturn nil, 0\n\t}\n\n\t// Calculate how many entries are needed.\n\ttotal := uint32((b.bestChain.Tip().height - startNode.height) + 1)\n\tif stopNode != nil && b.bestChain.Contains(stopNode) &&\n\t\tstopNode.height >= startNode.height {\n\n\t\ttotal = uint32((stopNode.height - startNode.height) + 1)\n\t}\n\tif total > maxEntries {\n\t\ttotal = maxEntries\n\t}\n\n\treturn startNode, total\n}\n\n// locateBlocks returns the hashes of the blocks after the first known block in\n// the locator until the provided stop hash is reached, or up to the provided\n// max number of block hashes.\n//\n// See the comment on the exported function for more details on special cases.\n//\n// This function MUST be called with the chain state lock held (for reads).\nfunc (b *BlockChain) locateBlocks(locator BlockLocator, hashStop *chainhash.Hash, maxHashes uint32) []chainhash.Hash {\n\t// Find the node after the first known block in the locator and the\n\t// total number of nodes after it needed while respecting the stop hash\n\t// and max entries.\n\tnode, total := b.locateInventory(locator, hashStop, maxHashes)\n\tif total == 0 {\n\t\treturn nil\n\t}\n\n\t// Populate and return the found hashes.\n\thashes := make([]chainhash.Hash, 0, total)\n\tfor i := uint32(0); i < total; i++ {\n\t\thashes = append(hashes, node.hash)\n\t\tnode = b.bestChain.Next(node)\n\t}\n\treturn hashes\n}\n\n// LocateBlocks returns the hashes of the blocks after the first known block in\n// the locator until the provided stop hash is reached, or up to the provided\n// max number of block hashes.\n//\n// In addition, there are two special cases:\n//\n//   - When no locators are provided, the stop hash is treated as a request for\n//     that block, so it will either return the stop hash itself if it is known,\n//     or nil if it is unknown\n//   - When locators are provided, but none of them are known, hashes starting\n//     after the genesis block will be returned\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) LocateBlocks(locator BlockLocator, hashStop *chainhash.Hash, maxHashes uint32) []chainhash.Hash {\n\tb.chainLock.RLock()\n\thashes := b.locateBlocks(locator, hashStop, maxHashes)\n\tb.chainLock.RUnlock()\n\treturn hashes\n}\n\n// locateHeaders returns the headers of the blocks after the first known block\n// in the locator until the provided stop hash is reached, or up to the provided\n// max number of block headers.\n//\n// See the comment on the exported function for more details on special cases.\n//\n// This function MUST be called with the chain state lock held (for reads).\nfunc (b *BlockChain) locateHeaders(locator BlockLocator, hashStop *chainhash.Hash, maxHeaders uint32) []wire.BlockHeader {\n\t// Find the node after the first known block in the locator and the\n\t// total number of nodes after it needed while respecting the stop hash\n\t// and max entries.\n\tnode, total := b.locateInventory(locator, hashStop, maxHeaders)\n\tif total == 0 {\n\t\treturn nil\n\t}\n\n\t// Populate and return the found headers.\n\theaders := make([]wire.BlockHeader, 0, total)\n\tfor i := uint32(0); i < total; i++ {\n\t\theaders = append(headers, node.Header())\n\t\tnode = b.bestChain.Next(node)\n\t}\n\treturn headers\n}\n\n// LocateHeaders returns the headers of the blocks after the first known block\n// in the locator until the provided stop hash is reached, or up to a max of\n// wire.MaxBlockHeadersPerMsg headers.\n//\n// In addition, there are two special cases:\n//\n//   - When no locators are provided, the stop hash is treated as a request for\n//     that header, so it will either return the header for the stop hash itself\n//     if it is known, or nil if it is unknown\n//   - When locators are provided, but none of them are known, headers starting\n//     after the genesis block will be returned\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) LocateHeaders(locator BlockLocator, hashStop *chainhash.Hash) []wire.BlockHeader {\n\tb.chainLock.RLock()\n\theaders := b.locateHeaders(locator, hashStop, wire.MaxBlockHeadersPerMsg)\n\tb.chainLock.RUnlock()\n\treturn headers\n}\n\n// InvalidateBlock invalidates the requested block and all its descedents.  If a block\n// in the best chain is invalidated, the active chain tip will be the parent of the\n// invalidated block.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) InvalidateBlock(hash *chainhash.Hash) error {\n\tb.chainLock.Lock()\n\tdefer b.chainLock.Unlock()\n\n\tnode := b.index.LookupNode(hash)\n\tif node == nil {\n\t\t// Return an error if the block doesn't exist.\n\t\treturn fmt.Errorf(\"Requested block hash of %s is not found \"+\n\t\t\t\"and thus cannot be invalidated.\", hash)\n\t}\n\tif node.height == 0 {\n\t\treturn fmt.Errorf(\"Requested block hash of %s is a at height 0 \"+\n\t\t\t\"and is thus a genesis block and cannot be invalidated.\",\n\t\t\tnode.hash)\n\t}\n\n\t// Nothing to do if the given block is already invalid.\n\tif node.status.KnownInvalid() {\n\t\treturn nil\n\t}\n\n\t// Set the status of the block being invalidated.\n\tb.index.SetStatusFlags(node, statusValidateFailed)\n\tb.index.UnsetStatusFlags(node, statusValid)\n\n\t// If the block we're invalidating is not on the best chain, we simply\n\t// mark the block and all its descendants as invalid and return.\n\tif !b.bestChain.Contains(node) {\n\t\t// Grab all the tips excluding the active tip.\n\t\ttips := b.index.InactiveTips(b.bestChain)\n\t\tfor _, tip := range tips {\n\t\t\t// Continue if the given inactive tip is not a descendant of the block\n\t\t\t// being invalidated.\n\t\t\tif !tip.IsAncestor(node) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Keep going back until we get to the block being invalidated.\n\t\t\t// For each of the parent, we'll unset valid status and set invalid\n\t\t\t// ancestor status.\n\t\t\tfor n := tip; n != nil && n != node; n = n.parent {\n\t\t\t\t// Continue if it's already invalid.\n\t\t\t\tif n.status.KnownInvalid() {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tb.index.SetStatusFlags(n, statusInvalidAncestor)\n\t\t\t\tb.index.UnsetStatusFlags(n, statusValid)\n\t\t\t}\n\t\t}\n\n\t\tif writeErr := b.index.flushToDB(); writeErr != nil {\n\t\t\treturn fmt.Errorf(\"Error flushing block index \"+\n\t\t\t\t\"changes to disk: %v\", writeErr)\n\t\t}\n\n\t\t// Return since the block being invalidated is on a side branch.\n\t\t// Nothing else left to do.\n\t\treturn nil\n\t}\n\n\t// If we're here, it means a block from the active chain tip is getting\n\t// invalidated.\n\t//\n\t// Grab all the nodes to detach from the active chain.\n\tdetachNodes := list.New()\n\tfor n := b.bestChain.Tip(); n != nil && n != node; n = n.parent {\n\t\t// Continue if it's already invalid.\n\t\tif n.status.KnownInvalid() {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Change the status of the block node.\n\t\tb.index.SetStatusFlags(n, statusInvalidAncestor)\n\t\tb.index.UnsetStatusFlags(n, statusValid)\n\t\tdetachNodes.PushBack(n)\n\t}\n\n\t// Push back the block node being invalidated.\n\tdetachNodes.PushBack(node)\n\n\t// Reorg back to the parent of the block being invalidated.\n\t// Nothing to attach so just pass an empty list.\n\terr := b.reorganizeChain(detachNodes, list.New())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif writeErr := b.index.flushToDB(); writeErr != nil {\n\t\tlog.Warnf(\"Error flushing block index changes to disk: %v\", writeErr)\n\t}\n\n\t// Grab all the tips.\n\ttips := b.index.InactiveTips(b.bestChain)\n\ttips = append(tips, b.bestChain.Tip())\n\n\t// Here we'll check if the invalidation of the block in the active tip\n\t// changes the status of the chain tips.  If a side branch now has more\n\t// worksum, it becomes the active chain tip.\n\tvar bestTip *blockNode\n\tfor _, tip := range tips {\n\t\t// Skip invalid tips as they cannot become the active tip.\n\t\tif tip.status.KnownInvalid() {\n\t\t\tcontinue\n\t\t}\n\n\t\t// If we have no best tips, then set this tip as the best tip.\n\t\tif bestTip == nil {\n\t\t\tbestTip = tip\n\t\t} else {\n\t\t\t// If there is an existing best tip, then compare it\n\t\t\t// against the current tip.\n\t\t\tif tip.workSum.Cmp(bestTip.workSum) == 1 {\n\t\t\t\tbestTip = tip\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return if the best tip is the current tip.\n\tif bestTip == b.bestChain.Tip() {\n\t\treturn nil\n\t}\n\n\t// Reorganize to the best tip if a side branch is now the most work tip.\n\tdetachNodes, attachNodes := b.getReorganizeNodes(bestTip)\n\terr = b.reorganizeChain(detachNodes, attachNodes)\n\n\tif writeErr := b.index.flushToDB(); writeErr != nil {\n\t\tlog.Warnf(\"Error flushing block index changes to disk: %v\", writeErr)\n\t}\n\n\treturn err\n}\n\n// ReconsiderBlock reconsiders the validity of the block with the given hash.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) ReconsiderBlock(hash *chainhash.Hash) error {\n\tb.chainLock.Lock()\n\tdefer b.chainLock.Unlock()\n\n\tlog.Infof(\"Reconsidering block_hash=%v\", hash[:])\n\n\treconsiderNode := b.index.LookupNode(hash)\n\tif reconsiderNode == nil {\n\t\t// Return an error if the block doesn't exist.\n\t\treturn fmt.Errorf(\"requested block hash of %s is not found \"+\n\t\t\t\"and thus cannot be reconsidered\", hash)\n\t}\n\n\t// Nothing to do if the given block is already valid.\n\tif reconsiderNode.status.KnownValid() {\n\t\tlog.Infof(\"block_hash=%x is valid, nothing to reconsider\", hash[:])\n\t\treturn nil\n\t}\n\n\t// Clear the status of the block being reconsidered.\n\tb.index.UnsetStatusFlags(reconsiderNode, statusInvalidAncestor)\n\tb.index.UnsetStatusFlags(reconsiderNode, statusValidateFailed)\n\n\t// Grab all the tips.\n\ttips := b.index.InactiveTips(b.bestChain)\n\ttips = append(tips, b.bestChain.Tip())\n\n\tlog.Debugf(\"Examining %v inactive chain tips for reconsideration\")\n\n\t// Go through all the tips and unset the status for all the descendents of the\n\t// block being reconsidered.\n\tvar reconsiderTip *blockNode\n\tfor _, tip := range tips {\n\t\t// Continue if the given inactive tip is not a descendant of the block\n\t\t// being invalidated.\n\t\tif !tip.IsAncestor(reconsiderNode) {\n\t\t\t// Set as the reconsider tip if the block node being reconsidered\n\t\t\t// is a tip.\n\t\t\tif tip == reconsiderNode {\n\t\t\t\treconsiderTip = reconsiderNode\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Mark the current tip as the tip being reconsidered.\n\t\treconsiderTip = tip\n\n\t\t// Unset the status of all the parents up until it reaches the block\n\t\t// being reconsidered.\n\t\tfor n := tip; n != nil && n != reconsiderNode; n = n.parent {\n\t\t\tb.index.UnsetStatusFlags(n, statusInvalidAncestor)\n\t\t}\n\t}\n\n\t// Compare the cumulative work for the branch being reconsidered.\n\tbestTipWork := b.bestChain.Tip().workSum\n\tif reconsiderTip.workSum.Cmp(bestTipWork) <= 0 {\n\t\tlog.Debugf(\"Tip to reconsider has less cumulative work than current \"+\n\t\t\t\"chain tip: %v vs %v\", reconsiderTip.workSum, bestTipWork)\n\t\treturn nil\n\t}\n\n\t// If the reconsider tip has a higher cumulative work, then reorganize\n\t// to it after checking the validity of the nodes.\n\tdetachNodes, attachNodes := b.getReorganizeNodes(reconsiderTip)\n\n\t// We're checking if the reorganization that'll happen is actually valid.\n\t// While this is called in reorganizeChain, we call it beforehand as the error\n\t// returned from reorganizeChain doesn't differentiate between actual disconnect/\n\t// connect errors or whether the branch we're trying to fork to is invalid.\n\t//\n\t// The block status changes here without being flushed so we immediately flush\n\t// the blockindex after we call this function.\n\t_, _, _, err := b.verifyReorganizationValidity(detachNodes, attachNodes)\n\tif writeErr := b.index.flushToDB(); writeErr != nil {\n\t\tlog.Warnf(\"Error flushing block index changes to disk: %v\", writeErr)\n\t}\n\tif err != nil {\n\t\t// If we errored out during the verification of the reorg branch,\n\t\t// it's ok to return nil as we reconsidered the block and determined\n\t\t// that it's invalid.\n\t\treturn nil\n\t}\n\n\treturn b.reorganizeChain(detachNodes, attachNodes)\n}\n\n// IndexManager provides a generic interface that the is called when blocks are\n// connected and disconnected to and from the tip of the main chain for the\n// purpose of supporting optional indexes.\ntype IndexManager interface {\n\t// Init is invoked during chain initialize in order to allow the index\n\t// manager to initialize itself and any indexes it is managing.  The\n\t// channel parameter specifies a channel the caller can close to signal\n\t// that the process should be interrupted.  It can be nil if that\n\t// behavior is not desired.\n\tInit(*BlockChain, <-chan struct{}) error\n\n\t// ConnectBlock is invoked when a new block has been connected to the\n\t// main chain. The set of output spent within a block is also passed in\n\t// so indexers can access the previous output scripts input spent if\n\t// required.\n\tConnectBlock(database.Tx, *btcutil.Block, []SpentTxOut) error\n\n\t// DisconnectBlock is invoked when a block has been disconnected from\n\t// the main chain. The set of outputs scripts that were spent within\n\t// this block is also returned so indexers can clean up the prior index\n\t// state for this block.\n\tDisconnectBlock(database.Tx, *btcutil.Block, []SpentTxOut) error\n}\n\n// Config is a descriptor which specifies the blockchain instance configuration.\ntype Config struct {\n\t// DB defines the database which houses the blocks and will be used to\n\t// store all metadata created by this package such as the utxo set.\n\t//\n\t// This field is required.\n\tDB database.DB\n\n\t// The maximum size in bytes of the UTXO cache.\n\t//\n\t// This field is required.\n\tUtxoCacheMaxSize uint64\n\n\t// Interrupt specifies a channel the caller can close to signal that\n\t// long running operations, such as catching up indexes or performing\n\t// database migrations, should be interrupted.\n\t//\n\t// This field can be nil if the caller does not desire the behavior.\n\tInterrupt <-chan struct{}\n\n\t// ChainParams identifies which chain parameters the chain is associated\n\t// with.\n\t//\n\t// This field is required.\n\tChainParams *chaincfg.Params\n\n\t// Checkpoints hold caller-defined checkpoints that should be added to\n\t// the default checkpoints in ChainParams.  Checkpoints must be sorted\n\t// by height.\n\t//\n\t// This field can be nil if the caller does not wish to specify any\n\t// checkpoints.\n\tCheckpoints []chaincfg.Checkpoint\n\n\t// TimeSource defines the median time source to use for things such as\n\t// block processing and determining whether or not the chain is current.\n\t//\n\t// The caller is expected to keep a reference to the time source as well\n\t// and add time samples from other peers on the network so the local\n\t// time is adjusted to be in agreement with other peers.\n\tTimeSource MedianTimeSource\n\n\t// SigCache defines a signature cache to use when when validating\n\t// signatures.  This is typically most useful when individual\n\t// transactions are already being validated prior to their inclusion in\n\t// a block such as what is usually done via a transaction memory pool.\n\t//\n\t// This field can be nil if the caller is not interested in using a\n\t// signature cache.\n\tSigCache *txscript.SigCache\n\n\t// IndexManager defines an index manager to use when initializing the\n\t// chain and connecting and disconnecting blocks.\n\t//\n\t// This field can be nil if the caller does not wish to make use of an\n\t// index manager.\n\tIndexManager IndexManager\n\n\t// HashCache defines a transaction hash mid-state cache to use when\n\t// validating transactions. This cache has the potential to greatly\n\t// speed up transaction validation as re-using the pre-calculated\n\t// mid-state eliminates the O(N^2) validation complexity due to the\n\t// SigHashAll flag.\n\t//\n\t// This field can be nil if the caller is not interested in using a\n\t// signature cache.\n\tHashCache *txscript.HashCache\n\n\t// Prune specifies the target database usage (in bytes) the database\n\t// will target for with block files.  Prune at 0 specifies that no\n\t// blocks will be deleted.\n\tPrune uint64\n}\n\n// New returns a BlockChain instance using the provided configuration details.\nfunc New(config *Config) (*BlockChain, error) {\n\t// Enforce required config fields.\n\tif config.DB == nil {\n\t\treturn nil, AssertError(\"blockchain.New database is nil\")\n\t}\n\tif config.ChainParams == nil {\n\t\treturn nil, AssertError(\"blockchain.New chain parameters nil\")\n\t}\n\tif config.TimeSource == nil {\n\t\treturn nil, AssertError(\"blockchain.New timesource is nil\")\n\t}\n\n\t// Generate a checkpoint by height map from the provided checkpoints\n\t// and assert the provided checkpoints are sorted by height as required.\n\tvar checkpointsByHeight map[int32]*chaincfg.Checkpoint\n\tvar prevCheckpointHeight int32\n\tif len(config.Checkpoints) > 0 {\n\t\tcheckpointsByHeight = make(map[int32]*chaincfg.Checkpoint)\n\t\tfor i := range config.Checkpoints {\n\t\t\tcheckpoint := &config.Checkpoints[i]\n\t\t\tif checkpoint.Height <= prevCheckpointHeight {\n\t\t\t\treturn nil, AssertError(\"blockchain.New \" +\n\t\t\t\t\t\"checkpoints are not sorted by height\")\n\t\t\t}\n\n\t\t\tcheckpointsByHeight[checkpoint.Height] = checkpoint\n\t\t\tprevCheckpointHeight = checkpoint.Height\n\t\t}\n\t}\n\n\tparams := config.ChainParams\n\ttargetTimespan := int64(params.TargetTimespan / time.Second)\n\ttargetTimePerBlock := int64(params.TargetTimePerBlock / time.Second)\n\tadjustmentFactor := params.RetargetAdjustmentFactor\n\tb := BlockChain{\n\t\tcheckpoints:         config.Checkpoints,\n\t\tcheckpointsByHeight: checkpointsByHeight,\n\t\tdb:                  config.DB,\n\t\tchainParams:         params,\n\t\ttimeSource:          config.TimeSource,\n\t\tsigCache:            config.SigCache,\n\t\tindexManager:        config.IndexManager,\n\t\tminRetargetTimespan: targetTimespan / adjustmentFactor,\n\t\tmaxRetargetTimespan: targetTimespan * adjustmentFactor,\n\t\tblocksPerRetarget:   int32(targetTimespan / targetTimePerBlock),\n\t\tindex:               newBlockIndex(config.DB, params),\n\t\tutxoCache:           newUtxoCache(config.DB, config.UtxoCacheMaxSize),\n\t\thashCache:           config.HashCache,\n\t\tbestChain:           newChainView(nil),\n\t\torphans:             make(map[chainhash.Hash]*orphanBlock),\n\t\tprevOrphans:         make(map[chainhash.Hash][]*orphanBlock),\n\t\twarningCaches:       newThresholdCaches(vbNumBits),\n\t\tdeploymentCaches:    newThresholdCaches(chaincfg.DefinedDeployments),\n\t\tpruneTarget:         config.Prune,\n\t}\n\n\t// Ensure all the deployments are synchronized with our clock if\n\t// needed.\n\tfor _, deployment := range b.chainParams.Deployments {\n\t\tdeploymentStarter := deployment.DeploymentStarter\n\t\tif clockStarter, ok := deploymentStarter.(chaincfg.ClockConsensusDeploymentStarter); ok {\n\t\t\tclockStarter.SynchronizeClock(&b)\n\t\t}\n\n\t\tdeploymentEnder := deployment.DeploymentEnder\n\t\tif clockEnder, ok := deploymentEnder.(chaincfg.ClockConsensusDeploymentEnder); ok {\n\t\t\tclockEnder.SynchronizeClock(&b)\n\t\t}\n\t}\n\n\t// Initialize the chain state from the passed database.  When the db\n\t// does not yet contain any chain state, both it and the chain state\n\t// will be initialized to contain only the genesis block.\n\tif err := b.initChainState(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Perform any upgrades to the various chain-specific buckets as needed.\n\tif err := b.maybeUpgradeDbBuckets(config.Interrupt); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Initialize and catch up all of the currently active optional indexes\n\t// as needed.\n\tif config.IndexManager != nil {\n\t\terr := config.IndexManager.Init(&b, config.Interrupt)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Initialize rule change threshold state caches.\n\tif err := b.initThresholdCaches(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Make sure the utxo state is catched up if it was left in an inconsistent\n\t// state.\n\tbestNode := b.bestChain.Tip()\n\tif err := b.InitConsistentState(bestNode, config.Interrupt); err != nil {\n\t\treturn nil, err\n\t}\n\tlog.Infof(\"Chain state (height %d, hash %v, totaltx %d, work %v)\",\n\t\tbestNode.height, bestNode.hash, b.stateSnapshot.TotalTxns,\n\t\tbestNode.workSum)\n\n\treturn &b, nil\n}\n\n// CachedStateSize returns the total size of the cached state of the blockchain\n// in bytes.\nfunc (b *BlockChain) CachedStateSize() uint64 {\n\tb.chainLock.Lock()\n\tdefer b.chainLock.Unlock()\n\treturn b.utxoCache.totalMemoryUsage()\n}\n"
  },
  {
    "path": "blockchain/chain_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain/internal/testhelper\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TestHaveBlock tests the HaveBlock API to ensure proper functionality.\nfunc TestHaveBlock(t *testing.T) {\n\t// Load up blocks such that there is a side chain.\n\t// (genesis block) -> 1 -> 2 -> 3 -> 4\n\t//                          \\-> 3a\n\ttestFiles := []string{\n\t\t\"blk_0_to_4.dat.bz2\",\n\t\t\"blk_3A.dat.bz2\",\n\t}\n\n\tvar blocks []*btcutil.Block\n\tfor _, file := range testFiles {\n\t\tblockTmp, err := loadBlocks(file)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Error loading file: %v\\n\", err)\n\t\t\treturn\n\t\t}\n\t\tblocks = append(blocks, blockTmp...)\n\t}\n\n\t// Create a new database and chain instance to run tests against.\n\tchain, teardownFunc, err := chainSetup(\"haveblock\",\n\t\t&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to setup chain instance: %v\", err)\n\t\treturn\n\t}\n\tdefer teardownFunc()\n\n\t// Since we're not dealing with the real block chain, set the coinbase\n\t// maturity to 1.\n\tchain.TstSetCoinbaseMaturity(1)\n\n\tfor i := 1; i < len(blocks); i++ {\n\t\t_, isOrphan, err := chain.ProcessBlock(blocks[i], BFNone)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"ProcessBlock fail on block %v: %v\\n\", i, err)\n\t\t\treturn\n\t\t}\n\t\tif isOrphan {\n\t\t\tt.Errorf(\"ProcessBlock incorrectly returned block %v \"+\n\t\t\t\t\"is an orphan\\n\", i)\n\t\t\treturn\n\t\t}\n\t}\n\n\t// Insert an orphan block.\n\t_, isOrphan, err := chain.ProcessBlock(btcutil.NewBlock(&Block100000),\n\t\tBFNone)\n\tif err != nil {\n\t\tt.Errorf(\"Unable to process block: %v\", err)\n\t\treturn\n\t}\n\tif !isOrphan {\n\t\tt.Errorf(\"ProcessBlock indicated block is an not orphan when \" +\n\t\t\t\"it should be\\n\")\n\t\treturn\n\t}\n\n\ttests := []struct {\n\t\thash string\n\t\twant bool\n\t}{\n\t\t// Genesis block should be present (in the main chain).\n\t\t{hash: chaincfg.MainNetParams.GenesisHash.String(), want: true},\n\n\t\t// Block 3a should be present (on a side chain).\n\t\t{hash: \"00000000474284d20067a4d33f6a02284e6ef70764a3a26d6a5b9df52ef663dd\", want: true},\n\n\t\t// Block 100000 should be present (as an orphan).\n\t\t{hash: \"000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506\", want: true},\n\n\t\t// Random hashes should not be available.\n\t\t{hash: \"123\", want: false},\n\t}\n\n\tfor i, test := range tests {\n\t\thash, err := chainhash.NewHashFromStr(test.hash)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t\t\tcontinue\n\t\t}\n\n\t\tresult, err := chain.HaveBlock(hash)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"HaveBlock #%d unexpected error: %v\", i, err)\n\t\t\treturn\n\t\t}\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"HaveBlock #%d got %v want %v\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestCalcSequenceLock tests the LockTimeToSequence function, and the\n// CalcSequenceLock method of a Chain instance. The tests exercise several\n// combinations of inputs to the CalcSequenceLock function in order to ensure\n// the returned SequenceLocks are correct for each test instance.\nfunc TestCalcSequenceLock(t *testing.T) {\n\tnetParams := &chaincfg.SimNetParams\n\n\t// We need to activate CSV in order to test the processing logic, so\n\t// manually craft the block version that's used to signal the soft-fork\n\t// activation.\n\tcsvBit := netParams.Deployments[chaincfg.DeploymentCSV].BitNumber\n\tblockVersion := int32(0x20000000 | (uint32(1) << csvBit))\n\n\t// Generate enough synthetic blocks to activate CSV.\n\tchain := newFakeChain(netParams)\n\tnode := chain.bestChain.Tip()\n\tblockTime := node.Header().Timestamp\n\tnumBlocksToActivate := (netParams.MinerConfirmationWindow * 3)\n\tfor i := uint32(0); i < numBlocksToActivate; i++ {\n\t\tblockTime = blockTime.Add(time.Second)\n\t\tnode = newFakeNode(node, blockVersion, 0, blockTime)\n\t\tchain.index.AddNode(node)\n\t\tchain.bestChain.SetTip(node)\n\t}\n\n\t// Create a utxo view with a fake utxo for the inputs used in the\n\t// transactions created below.  This utxo is added such that it has an\n\t// age of 4 blocks.\n\ttargetTx := btcutil.NewTx(&wire.MsgTx{\n\t\tTxOut: []*wire.TxOut{{\n\t\t\tPkScript: nil,\n\t\t\tValue:    10,\n\t\t}},\n\t})\n\tutxoView := NewUtxoViewpoint()\n\tutxoView.AddTxOuts(targetTx, int32(numBlocksToActivate)-4)\n\tutxoView.SetBestHash(&node.hash)\n\n\t// Create a utxo that spends the fake utxo created above for use in the\n\t// transactions created in the tests.  It has an age of 4 blocks.  Note\n\t// that the sequence lock heights are always calculated from the same\n\t// point of view that they were originally calculated from for a given\n\t// utxo.  That is to say, the height prior to it.\n\tutxo := wire.OutPoint{\n\t\tHash:  *targetTx.Hash(),\n\t\tIndex: 0,\n\t}\n\tprevUtxoHeight := int32(numBlocksToActivate) - 4\n\n\t// Obtain the median time past from the PoV of the input created above.\n\t// The MTP for the input is the MTP from the PoV of the block *prior*\n\t// to the one that included it.\n\tmedianTime := CalcPastMedianTime(node.RelativeAncestor(5)).Unix()\n\n\t// The median time calculated from the PoV of the best block in the\n\t// test chain.  For unconfirmed inputs, this value will be used since\n\t// the MTP will be calculated from the PoV of the yet-to-be-mined\n\t// block.\n\tnextMedianTime := CalcPastMedianTime(node).Unix()\n\tnextBlockHeight := int32(numBlocksToActivate) + 1\n\n\t// Add an additional transaction which will serve as our unconfirmed\n\t// output.\n\tunConfTx := &wire.MsgTx{\n\t\tTxOut: []*wire.TxOut{{\n\t\t\tPkScript: nil,\n\t\t\tValue:    5,\n\t\t}},\n\t}\n\tunConfUtxo := wire.OutPoint{\n\t\tHash:  unConfTx.TxHash(),\n\t\tIndex: 0,\n\t}\n\n\t// Adding a utxo with a height of 0x7fffffff indicates that the output\n\t// is currently unmined.\n\tutxoView.AddTxOuts(btcutil.NewTx(unConfTx), 0x7fffffff)\n\n\ttests := []struct {\n\t\ttx      *wire.MsgTx\n\t\tview    *UtxoViewpoint\n\t\tmempool bool\n\t\twant    *SequenceLock\n\t}{\n\t\t// A transaction of version one should disable sequence locks\n\t\t// as the new sequence number semantics only apply to\n\t\t// transactions version 2 or higher.\n\t\t{\n\t\t\ttx: &wire.MsgTx{\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(false, 3),\n\t\t\t\t}},\n\t\t\t},\n\t\t\tview: utxoView,\n\t\t\twant: &SequenceLock{\n\t\t\t\tSeconds:     -1,\n\t\t\t\tBlockHeight: -1,\n\t\t\t},\n\t\t},\n\t\t// A transaction with a single input with max sequence number.\n\t\t// This sequence number has the high bit set, so sequence locks\n\t\t// should be disabled.\n\t\t{\n\t\t\ttx: &wire.MsgTx{\n\t\t\t\tVersion: 2,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         wire.MaxTxInSequenceNum,\n\t\t\t\t}},\n\t\t\t},\n\t\t\tview: utxoView,\n\t\t\twant: &SequenceLock{\n\t\t\t\tSeconds:     -1,\n\t\t\t\tBlockHeight: -1,\n\t\t\t},\n\t\t},\n\t\t// A transaction with a single input whose lock time is\n\t\t// expressed in seconds.  However, the specified lock time is\n\t\t// below the required floor for time based lock times since\n\t\t// they have time granularity of 512 seconds.  As a result, the\n\t\t// seconds lock-time should be just before the median time of\n\t\t// the targeted block.\n\t\t{\n\t\t\ttx: &wire.MsgTx{\n\t\t\t\tVersion: 2,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(true, 2),\n\t\t\t\t}},\n\t\t\t},\n\t\t\tview: utxoView,\n\t\t\twant: &SequenceLock{\n\t\t\t\tSeconds:     medianTime - 1,\n\t\t\t\tBlockHeight: -1,\n\t\t\t},\n\t\t},\n\t\t// A transaction with a single input whose lock time is\n\t\t// expressed in seconds.  The number of seconds should be 1023\n\t\t// seconds after the median past time of the last block in the\n\t\t// chain.\n\t\t{\n\t\t\ttx: &wire.MsgTx{\n\t\t\t\tVersion: 2,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(true, 1024),\n\t\t\t\t}},\n\t\t\t},\n\t\t\tview: utxoView,\n\t\t\twant: &SequenceLock{\n\t\t\t\tSeconds:     medianTime + 1023,\n\t\t\t\tBlockHeight: -1,\n\t\t\t},\n\t\t},\n\t\t// A transaction with multiple inputs.  The first input has a\n\t\t// lock time expressed in seconds.  The second input has a\n\t\t// sequence lock in blocks with a value of 4.  The last input\n\t\t// has a sequence number with a value of 5, but has the disable\n\t\t// bit set.  So the first lock should be selected as it's the\n\t\t// latest lock that isn't disabled.\n\t\t{\n\t\t\ttx: &wire.MsgTx{\n\t\t\t\tVersion: 2,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(true, 2560),\n\t\t\t\t}, {\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(false, 4),\n\t\t\t\t}, {\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence: LockTimeToSequence(false, 5) |\n\t\t\t\t\t\twire.SequenceLockTimeDisabled,\n\t\t\t\t}},\n\t\t\t},\n\t\t\tview: utxoView,\n\t\t\twant: &SequenceLock{\n\t\t\t\tSeconds:     medianTime + (5 << wire.SequenceLockTimeGranularity) - 1,\n\t\t\t\tBlockHeight: prevUtxoHeight + 3,\n\t\t\t},\n\t\t},\n\t\t// Transaction with a single input.  The input's sequence number\n\t\t// encodes a relative lock-time in blocks (3 blocks).  The\n\t\t// sequence lock should  have a value of -1 for seconds, but a\n\t\t// height of 2 meaning it can be included at height 3.\n\t\t{\n\t\t\ttx: &wire.MsgTx{\n\t\t\t\tVersion: 2,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(false, 3),\n\t\t\t\t}},\n\t\t\t},\n\t\t\tview: utxoView,\n\t\t\twant: &SequenceLock{\n\t\t\t\tSeconds:     -1,\n\t\t\t\tBlockHeight: prevUtxoHeight + 2,\n\t\t\t},\n\t\t},\n\t\t// A transaction with two inputs with lock times expressed in\n\t\t// seconds.  The selected sequence lock value for seconds should\n\t\t// be the time further in the future.\n\t\t{\n\t\t\ttx: &wire.MsgTx{\n\t\t\t\tVersion: 2,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(true, 5120),\n\t\t\t\t}, {\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(true, 2560),\n\t\t\t\t}},\n\t\t\t},\n\t\t\tview: utxoView,\n\t\t\twant: &SequenceLock{\n\t\t\t\tSeconds:     medianTime + (10 << wire.SequenceLockTimeGranularity) - 1,\n\t\t\t\tBlockHeight: -1,\n\t\t\t},\n\t\t},\n\t\t// A transaction with two inputs with lock times expressed in\n\t\t// blocks.  The selected sequence lock value for blocks should\n\t\t// be the height further in the future, so a height of 10\n\t\t// indicating it can be included at height 11.\n\t\t{\n\t\t\ttx: &wire.MsgTx{\n\t\t\t\tVersion: 2,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(false, 1),\n\t\t\t\t}, {\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(false, 11),\n\t\t\t\t}},\n\t\t\t},\n\t\t\tview: utxoView,\n\t\t\twant: &SequenceLock{\n\t\t\t\tSeconds:     -1,\n\t\t\t\tBlockHeight: prevUtxoHeight + 10,\n\t\t\t},\n\t\t},\n\t\t// A transaction with multiple inputs.  Two inputs are time\n\t\t// based, and the other two are block based. The lock lying\n\t\t// further into the future for both inputs should be chosen.\n\t\t{\n\t\t\ttx: &wire.MsgTx{\n\t\t\t\tVersion: 2,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(true, 2560),\n\t\t\t\t}, {\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(true, 6656),\n\t\t\t\t}, {\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(false, 3),\n\t\t\t\t}, {\n\t\t\t\t\tPreviousOutPoint: utxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(false, 9),\n\t\t\t\t}},\n\t\t\t},\n\t\t\tview: utxoView,\n\t\t\twant: &SequenceLock{\n\t\t\t\tSeconds:     medianTime + (13 << wire.SequenceLockTimeGranularity) - 1,\n\t\t\t\tBlockHeight: prevUtxoHeight + 8,\n\t\t\t},\n\t\t},\n\t\t// A transaction with a single unconfirmed input.  As the input\n\t\t// is confirmed, the height of the input should be interpreted\n\t\t// as the height of the *next* block.  So, a 2 block relative\n\t\t// lock means the sequence lock should be for 1 block after the\n\t\t// *next* block height, indicating it can be included 2 blocks\n\t\t// after that.\n\t\t{\n\t\t\ttx: &wire.MsgTx{\n\t\t\t\tVersion: 2,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: unConfUtxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(false, 2),\n\t\t\t\t}},\n\t\t\t},\n\t\t\tview:    utxoView,\n\t\t\tmempool: true,\n\t\t\twant: &SequenceLock{\n\t\t\t\tSeconds:     -1,\n\t\t\t\tBlockHeight: nextBlockHeight + 1,\n\t\t\t},\n\t\t},\n\t\t// A transaction with a single unconfirmed input.  The input has\n\t\t// a time based lock, so the lock time should be based off the\n\t\t// MTP of the *next* block.\n\t\t{\n\t\t\ttx: &wire.MsgTx{\n\t\t\t\tVersion: 2,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: unConfUtxo,\n\t\t\t\t\tSequence:         LockTimeToSequence(true, 1024),\n\t\t\t\t}},\n\t\t\t},\n\t\t\tview:    utxoView,\n\t\t\tmempool: true,\n\t\t\twant: &SequenceLock{\n\t\t\t\tSeconds:     nextMedianTime + 1023,\n\t\t\t\tBlockHeight: -1,\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %v SequenceLock tests\", len(tests))\n\tfor i, test := range tests {\n\t\tutilTx := btcutil.NewTx(test.tx)\n\t\tseqLock, err := chain.CalcSequenceLock(utilTx, test.view, test.mempool)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"test #%d, unable to calc sequence lock: %v\", i, err)\n\t\t}\n\n\t\tif seqLock.Seconds != test.want.Seconds {\n\t\t\tt.Fatalf(\"test #%d got %v seconds want %v seconds\",\n\t\t\t\ti, seqLock.Seconds, test.want.Seconds)\n\t\t}\n\t\tif seqLock.BlockHeight != test.want.BlockHeight {\n\t\t\tt.Fatalf(\"test #%d got height of %v want height of %v \",\n\t\t\t\ti, seqLock.BlockHeight, test.want.BlockHeight)\n\t\t}\n\t}\n}\n\n// nodeHashes is a convenience function that returns the hashes for all of the\n// passed indexes of the provided nodes.  It is used to construct expected hash\n// slices in the tests.\nfunc nodeHashes(nodes []*blockNode, indexes ...int) []chainhash.Hash {\n\thashes := make([]chainhash.Hash, 0, len(indexes))\n\tfor _, idx := range indexes {\n\t\thashes = append(hashes, nodes[idx].hash)\n\t}\n\treturn hashes\n}\n\n// nodeHeaders is a convenience function that returns the headers for all of\n// the passed indexes of the provided nodes.  It is used to construct expected\n// located headers in the tests.\nfunc nodeHeaders(nodes []*blockNode, indexes ...int) []wire.BlockHeader {\n\theaders := make([]wire.BlockHeader, 0, len(indexes))\n\tfor _, idx := range indexes {\n\t\theaders = append(headers, nodes[idx].Header())\n\t}\n\treturn headers\n}\n\n// TestLocateInventory ensures that locating inventory via the LocateHeaders and\n// LocateBlocks functions behaves as expected.\nfunc TestLocateInventory(t *testing.T) {\n\t// Construct a synthetic block chain with a block index consisting of\n\t// the following structure.\n\t// \tgenesis -> 1 -> 2 -> ... -> 15 -> 16  -> 17  -> 18\n\t// \t                              \\-> 16a -> 17a\n\ttip := tstTip\n\tchain := newFakeChain(&chaincfg.MainNetParams)\n\tbranch0Nodes := chainedNodes(chain.bestChain.Genesis(), 18)\n\tbranch1Nodes := chainedNodes(branch0Nodes[14], 2)\n\tfor _, node := range branch0Nodes {\n\t\tchain.index.AddNode(node)\n\t}\n\tfor _, node := range branch1Nodes {\n\t\tchain.index.AddNode(node)\n\t}\n\tchain.bestChain.SetTip(tip(branch0Nodes))\n\n\t// Create chain views for different branches of the overall chain to\n\t// simulate a local and remote node on different parts of the chain.\n\tlocalView := newChainView(tip(branch0Nodes))\n\tremoteView := newChainView(tip(branch1Nodes))\n\n\t// Create a chain view for a completely unrelated block chain to\n\t// simulate a remote node on a totally different chain.\n\tunrelatedBranchNodes := chainedNodes(nil, 5)\n\tunrelatedView := newChainView(tip(unrelatedBranchNodes))\n\n\ttests := []struct {\n\t\tname       string\n\t\tlocator    BlockLocator       // locator for requested inventory\n\t\thashStop   chainhash.Hash     // stop hash for locator\n\t\tmaxAllowed uint32             // max to locate, 0 = wire const\n\t\theaders    []wire.BlockHeader // expected located headers\n\t\thashes     []chainhash.Hash   // expected located hashes\n\t}{\n\t\t{\n\t\t\t// Empty block locators and unknown stop hash.  No\n\t\t\t// inventory should be located.\n\t\t\tname:     \"no locators, no stop\",\n\t\t\tlocator:  nil,\n\t\t\thashStop: chainhash.Hash{},\n\t\t\theaders:  nil,\n\t\t\thashes:   nil,\n\t\t},\n\t\t{\n\t\t\t// Empty block locators and stop hash in side chain.\n\t\t\t// The expected result is the requested block.\n\t\t\tname:     \"no locators, stop in side\",\n\t\t\tlocator:  nil,\n\t\t\thashStop: tip(branch1Nodes).hash,\n\t\t\theaders:  nodeHeaders(branch1Nodes, 1),\n\t\t\thashes:   nodeHashes(branch1Nodes, 1),\n\t\t},\n\t\t{\n\t\t\t// Empty block locators and stop hash in main chain.\n\t\t\t// The expected result is the requested block.\n\t\t\tname:     \"no locators, stop in main\",\n\t\t\tlocator:  nil,\n\t\t\thashStop: branch0Nodes[12].hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 12),\n\t\t\thashes:   nodeHashes(branch0Nodes, 12),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on side chain and a\n\t\t\t// stop hash local node doesn't know about.  The\n\t\t\t// expected result is the blocks after the fork point in\n\t\t\t// the main chain and the stop hash has no effect.\n\t\t\tname:     \"remote side chain, unknown stop\",\n\t\t\tlocator:  remoteView.BlockLocator(nil),\n\t\t\thashStop: chainhash.Hash{0x01},\n\t\t\theaders:  nodeHeaders(branch0Nodes, 15, 16, 17),\n\t\t\thashes:   nodeHashes(branch0Nodes, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on side chain and a\n\t\t\t// stop hash in side chain.  The expected result is the\n\t\t\t// blocks after the fork point in the main chain and the\n\t\t\t// stop hash has no effect.\n\t\t\tname:     \"remote side chain, stop in side\",\n\t\t\tlocator:  remoteView.BlockLocator(nil),\n\t\t\thashStop: tip(branch1Nodes).hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 15, 16, 17),\n\t\t\thashes:   nodeHashes(branch0Nodes, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on side chain and a\n\t\t\t// stop hash in main chain, but before fork point.  The\n\t\t\t// expected result is the blocks after the fork point in\n\t\t\t// the main chain and the stop hash has no effect.\n\t\t\tname:     \"remote side chain, stop in main before\",\n\t\t\tlocator:  remoteView.BlockLocator(nil),\n\t\t\thashStop: branch0Nodes[13].hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 15, 16, 17),\n\t\t\thashes:   nodeHashes(branch0Nodes, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on side chain and a\n\t\t\t// stop hash in main chain, but exactly at the fork\n\t\t\t// point.  The expected result is the blocks after the\n\t\t\t// fork point in the main chain and the stop hash has no\n\t\t\t// effect.\n\t\t\tname:     \"remote side chain, stop in main exact\",\n\t\t\tlocator:  remoteView.BlockLocator(nil),\n\t\t\thashStop: branch0Nodes[14].hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 15, 16, 17),\n\t\t\thashes:   nodeHashes(branch0Nodes, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on side chain and a\n\t\t\t// stop hash in main chain just after the fork point.\n\t\t\t// The expected result is the blocks after the fork\n\t\t\t// point in the main chain up to and including the stop\n\t\t\t// hash.\n\t\t\tname:     \"remote side chain, stop in main after\",\n\t\t\tlocator:  remoteView.BlockLocator(nil),\n\t\t\thashStop: branch0Nodes[15].hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 15),\n\t\t\thashes:   nodeHashes(branch0Nodes, 15),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on side chain and a\n\t\t\t// stop hash in main chain some time after the fork\n\t\t\t// point.  The expected result is the blocks after the\n\t\t\t// fork point in the main chain up to and including the\n\t\t\t// stop hash.\n\t\t\tname:     \"remote side chain, stop in main after more\",\n\t\t\tlocator:  remoteView.BlockLocator(nil),\n\t\t\thashStop: branch0Nodes[16].hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 15, 16),\n\t\t\thashes:   nodeHashes(branch0Nodes, 15, 16),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on main chain in the\n\t\t\t// past and a stop hash local node doesn't know about.\n\t\t\t// The expected result is the blocks after the known\n\t\t\t// point in the main chain and the stop hash has no\n\t\t\t// effect.\n\t\t\tname:     \"remote main chain past, unknown stop\",\n\t\t\tlocator:  localView.BlockLocator(branch0Nodes[12]),\n\t\t\thashStop: chainhash.Hash{0x01},\n\t\t\theaders:  nodeHeaders(branch0Nodes, 13, 14, 15, 16, 17),\n\t\t\thashes:   nodeHashes(branch0Nodes, 13, 14, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on main chain in the\n\t\t\t// past and a stop hash in a side chain.  The expected\n\t\t\t// result is the blocks after the known point in the\n\t\t\t// main chain and the stop hash has no effect.\n\t\t\tname:     \"remote main chain past, stop in side\",\n\t\t\tlocator:  localView.BlockLocator(branch0Nodes[12]),\n\t\t\thashStop: tip(branch1Nodes).hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 13, 14, 15, 16, 17),\n\t\t\thashes:   nodeHashes(branch0Nodes, 13, 14, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on main chain in the\n\t\t\t// past and a stop hash in the main chain before that\n\t\t\t// point.  The expected result is the blocks after the\n\t\t\t// known point in the main chain and the stop hash has\n\t\t\t// no effect.\n\t\t\tname:     \"remote main chain past, stop in main before\",\n\t\t\tlocator:  localView.BlockLocator(branch0Nodes[12]),\n\t\t\thashStop: branch0Nodes[11].hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 13, 14, 15, 16, 17),\n\t\t\thashes:   nodeHashes(branch0Nodes, 13, 14, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on main chain in the\n\t\t\t// past and a stop hash in the main chain exactly at that\n\t\t\t// point.  The expected result is the blocks after the\n\t\t\t// known point in the main chain and the stop hash has\n\t\t\t// no effect.\n\t\t\tname:     \"remote main chain past, stop in main exact\",\n\t\t\tlocator:  localView.BlockLocator(branch0Nodes[12]),\n\t\t\thashStop: branch0Nodes[12].hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 13, 14, 15, 16, 17),\n\t\t\thashes:   nodeHashes(branch0Nodes, 13, 14, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on main chain in the\n\t\t\t// past and a stop hash in the main chain just after\n\t\t\t// that point.  The expected result is the blocks after\n\t\t\t// the known point in the main chain and the stop hash\n\t\t\t// has no effect.\n\t\t\tname:     \"remote main chain past, stop in main after\",\n\t\t\tlocator:  localView.BlockLocator(branch0Nodes[12]),\n\t\t\thashStop: branch0Nodes[13].hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 13),\n\t\t\thashes:   nodeHashes(branch0Nodes, 13),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being on main chain in the\n\t\t\t// past and a stop hash in the main chain some time\n\t\t\t// after that point.  The expected result is the blocks\n\t\t\t// after the known point in the main chain and the stop\n\t\t\t// hash has no effect.\n\t\t\tname:     \"remote main chain past, stop in main after more\",\n\t\t\tlocator:  localView.BlockLocator(branch0Nodes[12]),\n\t\t\thashStop: branch0Nodes[15].hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 13, 14, 15),\n\t\t\thashes:   nodeHashes(branch0Nodes, 13, 14, 15),\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being at exactly the same\n\t\t\t// point in the main chain and a stop hash local node\n\t\t\t// doesn't know about.  The expected result is no\n\t\t\t// located inventory.\n\t\t\tname:     \"remote main chain same, unknown stop\",\n\t\t\tlocator:  localView.BlockLocator(nil),\n\t\t\thashStop: chainhash.Hash{0x01},\n\t\t\theaders:  nil,\n\t\t\thashes:   nil,\n\t\t},\n\t\t{\n\t\t\t// Locators based on remote being at exactly the same\n\t\t\t// point in the main chain and a stop hash at exactly\n\t\t\t// the same point.  The expected result is no located\n\t\t\t// inventory.\n\t\t\tname:     \"remote main chain same, stop same point\",\n\t\t\tlocator:  localView.BlockLocator(nil),\n\t\t\thashStop: tip(branch0Nodes).hash,\n\t\t\theaders:  nil,\n\t\t\thashes:   nil,\n\t\t},\n\t\t{\n\t\t\t// Locators from remote that don't include any blocks\n\t\t\t// the local node knows.  This would happen if the\n\t\t\t// remote node is on a completely separate chain that\n\t\t\t// isn't rooted with the same genesis block.  The\n\t\t\t// expected result is the blocks after the genesis\n\t\t\t// block.\n\t\t\tname:     \"remote unrelated chain\",\n\t\t\tlocator:  unrelatedView.BlockLocator(nil),\n\t\t\thashStop: chainhash.Hash{},\n\t\t\theaders: nodeHeaders(branch0Nodes, 0, 1, 2, 3, 4, 5, 6,\n\t\t\t\t7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17),\n\t\t\thashes: nodeHashes(branch0Nodes, 0, 1, 2, 3, 4, 5, 6,\n\t\t\t\t7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\t// Locators from remote for second block in main chain\n\t\t\t// and no stop hash, but with an overridden max limit.\n\t\t\t// The expected result is the blocks after the second\n\t\t\t// block limited by the max.\n\t\t\tname:       \"remote genesis\",\n\t\t\tlocator:    locatorHashes(branch0Nodes, 0),\n\t\t\thashStop:   chainhash.Hash{},\n\t\t\tmaxAllowed: 3,\n\t\t\theaders:    nodeHeaders(branch0Nodes, 1, 2, 3),\n\t\t\thashes:     nodeHashes(branch0Nodes, 1, 2, 3),\n\t\t},\n\t\t{\n\t\t\t// Poorly formed locator.\n\t\t\t//\n\t\t\t// Locator from remote that only includes a single\n\t\t\t// block on a side chain the local node knows.  The\n\t\t\t// expected result is the blocks after the genesis\n\t\t\t// block since even though the block is known, it is on\n\t\t\t// a side chain and there are no more locators to find\n\t\t\t// the fork point.\n\t\t\tname:     \"weak locator, single known side block\",\n\t\t\tlocator:  locatorHashes(branch1Nodes, 1),\n\t\t\thashStop: chainhash.Hash{},\n\t\t\theaders: nodeHeaders(branch0Nodes, 0, 1, 2, 3, 4, 5, 6,\n\t\t\t\t7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17),\n\t\t\thashes: nodeHashes(branch0Nodes, 0, 1, 2, 3, 4, 5, 6,\n\t\t\t\t7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\t// Poorly formed locator.\n\t\t\t//\n\t\t\t// Locator from remote that only includes multiple\n\t\t\t// blocks on a side chain the local node knows however\n\t\t\t// none in the main chain.  The expected result is the\n\t\t\t// blocks after the genesis block since even though the\n\t\t\t// blocks are known, they are all on a side chain and\n\t\t\t// there are no more locators to find the fork point.\n\t\t\tname:     \"weak locator, multiple known side blocks\",\n\t\t\tlocator:  locatorHashes(branch1Nodes, 1),\n\t\t\thashStop: chainhash.Hash{},\n\t\t\theaders: nodeHeaders(branch0Nodes, 0, 1, 2, 3, 4, 5, 6,\n\t\t\t\t7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17),\n\t\t\thashes: nodeHashes(branch0Nodes, 0, 1, 2, 3, 4, 5, 6,\n\t\t\t\t7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\t// Poorly formed locator.\n\t\t\t//\n\t\t\t// Locator from remote that only includes multiple\n\t\t\t// blocks on a side chain the local node knows however\n\t\t\t// none in the main chain but includes a stop hash in\n\t\t\t// the main chain.  The expected result is the blocks\n\t\t\t// after the genesis block up to the stop hash since\n\t\t\t// even though the blocks are known, they are all on a\n\t\t\t// side chain and there are no more locators to find the\n\t\t\t// fork point.\n\t\t\tname:     \"weak locator, multiple known side blocks, stop in main\",\n\t\t\tlocator:  locatorHashes(branch1Nodes, 1),\n\t\t\thashStop: branch0Nodes[5].hash,\n\t\t\theaders:  nodeHeaders(branch0Nodes, 0, 1, 2, 3, 4, 5),\n\t\t\thashes:   nodeHashes(branch0Nodes, 0, 1, 2, 3, 4, 5),\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\t// Ensure the expected headers are located.\n\t\tvar headers []wire.BlockHeader\n\t\tif test.maxAllowed != 0 {\n\t\t\t// Need to use the unexported function to override the\n\t\t\t// max allowed for headers.\n\t\t\tchain.chainLock.RLock()\n\t\t\theaders = chain.locateHeaders(test.locator,\n\t\t\t\t&test.hashStop, test.maxAllowed)\n\t\t\tchain.chainLock.RUnlock()\n\t\t} else {\n\t\t\theaders = chain.LocateHeaders(test.locator,\n\t\t\t\t&test.hashStop)\n\t\t}\n\t\tif !reflect.DeepEqual(headers, test.headers) {\n\t\t\tt.Errorf(\"%s: unexpected headers -- got %v, want %v\",\n\t\t\t\ttest.name, headers, test.headers)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the expected block hashes are located.\n\t\tmaxAllowed := uint32(wire.MaxBlocksPerMsg)\n\t\tif test.maxAllowed != 0 {\n\t\t\tmaxAllowed = test.maxAllowed\n\t\t}\n\t\thashes := chain.LocateBlocks(test.locator, &test.hashStop,\n\t\t\tmaxAllowed)\n\t\tif !reflect.DeepEqual(hashes, test.hashes) {\n\t\t\tt.Errorf(\"%s: unexpected hashes -- got %v, want %v\",\n\t\t\t\ttest.name, hashes, test.hashes)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestHeightToHashRange ensures that fetching a range of block hashes by start\n// height and end hash works as expected.\nfunc TestHeightToHashRange(t *testing.T) {\n\t// Construct a synthetic block chain with a block index consisting of\n\t// the following structure.\n\t// \tgenesis -> 1 -> 2 -> ... -> 15 -> 16  -> 17  -> 18\n\t// \t                              \\-> 16a -> 17a -> 18a (unvalidated)\n\ttip := tstTip\n\tchain := newFakeChain(&chaincfg.MainNetParams)\n\tbranch0Nodes := chainedNodes(chain.bestChain.Genesis(), 18)\n\tbranch1Nodes := chainedNodes(branch0Nodes[14], 3)\n\tfor _, node := range branch0Nodes {\n\t\tchain.index.SetStatusFlags(node, statusValid)\n\t\tchain.index.AddNode(node)\n\t}\n\tfor _, node := range branch1Nodes {\n\t\tif node.height < 18 {\n\t\t\tchain.index.SetStatusFlags(node, statusValid)\n\t\t}\n\t\tchain.index.AddNode(node)\n\t}\n\tchain.bestChain.SetTip(tip(branch0Nodes))\n\n\ttests := []struct {\n\t\tname        string\n\t\tstartHeight int32            // locator for requested inventory\n\t\tendHash     chainhash.Hash   // stop hash for locator\n\t\tmaxResults  int              // max to locate, 0 = wire const\n\t\thashes      []chainhash.Hash // expected located hashes\n\t\texpectError bool\n\t}{\n\t\t{\n\t\t\tname:        \"blocks below tip\",\n\t\t\tstartHeight: 11,\n\t\t\tendHash:     branch0Nodes[14].hash,\n\t\t\tmaxResults:  10,\n\t\t\thashes:      nodeHashes(branch0Nodes, 10, 11, 12, 13, 14),\n\t\t},\n\t\t{\n\t\t\tname:        \"blocks on main chain\",\n\t\t\tstartHeight: 15,\n\t\t\tendHash:     branch0Nodes[17].hash,\n\t\t\tmaxResults:  10,\n\t\t\thashes:      nodeHashes(branch0Nodes, 14, 15, 16, 17),\n\t\t},\n\t\t{\n\t\t\tname:        \"blocks on stale chain\",\n\t\t\tstartHeight: 15,\n\t\t\tendHash:     branch1Nodes[1].hash,\n\t\t\tmaxResults:  10,\n\t\t\thashes: append(nodeHashes(branch0Nodes, 14),\n\t\t\t\tnodeHashes(branch1Nodes, 0, 1)...),\n\t\t},\n\t\t{\n\t\t\tname:        \"invalid start height\",\n\t\t\tstartHeight: 19,\n\t\t\tendHash:     branch0Nodes[17].hash,\n\t\t\tmaxResults:  10,\n\t\t\texpectError: true,\n\t\t},\n\t\t{\n\t\t\tname:        \"too many results\",\n\t\t\tstartHeight: 1,\n\t\t\tendHash:     branch0Nodes[17].hash,\n\t\t\tmaxResults:  10,\n\t\t\texpectError: true,\n\t\t},\n\t\t{\n\t\t\tname:        \"unvalidated block\",\n\t\t\tstartHeight: 15,\n\t\t\tendHash:     branch1Nodes[2].hash,\n\t\t\tmaxResults:  10,\n\t\t\texpectError: true,\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\thashes, err := chain.HeightToHashRange(test.startHeight, &test.endHash,\n\t\t\ttest.maxResults)\n\t\tif err != nil {\n\t\t\tif !test.expectError {\n\t\t\t\tt.Errorf(\"%s: unexpected error: %v\", test.name, err)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(hashes, test.hashes) {\n\t\t\tt.Errorf(\"%s: unexpected hashes -- got %v, want %v\",\n\t\t\t\ttest.name, hashes, test.hashes)\n\t\t}\n\t}\n}\n\n// TestIntervalBlockHashes ensures that fetching block hashes at specified\n// intervals by end hash works as expected.\nfunc TestIntervalBlockHashes(t *testing.T) {\n\t// Construct a synthetic block chain with a block index consisting of\n\t// the following structure.\n\t// \tgenesis -> 1 -> 2 -> ... -> 15 -> 16  -> 17  -> 18\n\t// \t                              \\-> 16a -> 17a -> 18a (unvalidated)\n\ttip := tstTip\n\tchain := newFakeChain(&chaincfg.MainNetParams)\n\tbranch0Nodes := chainedNodes(chain.bestChain.Genesis(), 18)\n\tbranch1Nodes := chainedNodes(branch0Nodes[14], 3)\n\tfor _, node := range branch0Nodes {\n\t\tchain.index.SetStatusFlags(node, statusValid)\n\t\tchain.index.AddNode(node)\n\t}\n\tfor _, node := range branch1Nodes {\n\t\tif node.height < 18 {\n\t\t\tchain.index.SetStatusFlags(node, statusValid)\n\t\t}\n\t\tchain.index.AddNode(node)\n\t}\n\tchain.bestChain.SetTip(tip(branch0Nodes))\n\n\ttests := []struct {\n\t\tname        string\n\t\tendHash     chainhash.Hash\n\t\tinterval    int\n\t\thashes      []chainhash.Hash\n\t\texpectError bool\n\t}{\n\t\t{\n\t\t\tname:     \"blocks on main chain\",\n\t\t\tendHash:  branch0Nodes[17].hash,\n\t\t\tinterval: 8,\n\t\t\thashes:   nodeHashes(branch0Nodes, 7, 15),\n\t\t},\n\t\t{\n\t\t\tname:     \"blocks on stale chain\",\n\t\t\tendHash:  branch1Nodes[1].hash,\n\t\t\tinterval: 8,\n\t\t\thashes: append(nodeHashes(branch0Nodes, 7),\n\t\t\t\tnodeHashes(branch1Nodes, 0)...),\n\t\t},\n\t\t{\n\t\t\tname:     \"no results\",\n\t\t\tendHash:  branch0Nodes[17].hash,\n\t\t\tinterval: 20,\n\t\t\thashes:   []chainhash.Hash{},\n\t\t},\n\t\t{\n\t\t\tname:        \"unvalidated block\",\n\t\t\tendHash:     branch1Nodes[2].hash,\n\t\t\tinterval:    8,\n\t\t\texpectError: true,\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\thashes, err := chain.IntervalBlockHashes(&test.endHash, test.interval)\n\t\tif err != nil {\n\t\t\tif !test.expectError {\n\t\t\t\tt.Errorf(\"%s: unexpected error: %v\", test.name, err)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(hashes, test.hashes) {\n\t\t\tt.Errorf(\"%s: unexpected hashes -- got %v, want %v\",\n\t\t\t\ttest.name, hashes, test.hashes)\n\t\t}\n\t}\n}\n\nfunc TestChainTips(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\tchainTipGen func() (*BlockChain, map[chainhash.Hash]ChainTip)\n\t}{\n\t\t{\n\t\t\tname: \"one active chain tip\",\n\t\t\tchainTipGen: func() (*BlockChain, map[chainhash.Hash]ChainTip) {\n\t\t\t\t// Construct a synthetic block chain with a block index consisting of\n\t\t\t\t// the following structure.\n\t\t\t\t// \tgenesis -> 1 -> 2 -> 3\n\t\t\t\ttip := tstTip\n\t\t\t\tchain := newFakeChain(&chaincfg.MainNetParams)\n\t\t\t\tbranch0Nodes := chainedNodes(chain.bestChain.Genesis(), 3)\n\t\t\t\tfor _, node := range branch0Nodes {\n\t\t\t\t\tchain.index.SetStatusFlags(node, statusDataStored)\n\t\t\t\t\tchain.index.SetStatusFlags(node, statusValid)\n\t\t\t\t\tchain.index.AddNode(node)\n\t\t\t\t}\n\t\t\t\tchain.bestChain.SetTip(tip(branch0Nodes))\n\n\t\t\t\tactiveTip := ChainTip{\n\t\t\t\t\tHeight:    3,\n\t\t\t\t\tBlockHash: (tip(branch0Nodes)).hash,\n\t\t\t\t\tBranchLen: 0,\n\t\t\t\t\tStatus:    StatusActive,\n\t\t\t\t}\n\t\t\t\tchainTips := make(map[chainhash.Hash]ChainTip)\n\t\t\t\tchainTips[activeTip.BlockHash] = activeTip\n\n\t\t\t\treturn chain, chainTips\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"one active chain tip, one unknown chain tip\",\n\t\t\tchainTipGen: func() (*BlockChain, map[chainhash.Hash]ChainTip) {\n\t\t\t\t// Construct a synthetic block chain with a block index consisting of\n\t\t\t\t// the following structure.\n\t\t\t\t// \tgenesis -> 1 -> 2 -> 3 ... -> 10 -> 11  -> 12  -> 13 (active)\n\t\t\t\t//                                      \\-> 11a -> 12a (unknown)\n\t\t\t\ttip := tstTip\n\t\t\t\tchain := newFakeChain(&chaincfg.MainNetParams)\n\t\t\t\tbranch0Nodes := chainedNodes(chain.bestChain.Genesis(), 13)\n\t\t\t\tfor _, node := range branch0Nodes {\n\t\t\t\t\tchain.index.SetStatusFlags(node, statusDataStored)\n\t\t\t\t\tchain.index.SetStatusFlags(node, statusValid)\n\t\t\t\t\tchain.index.AddNode(node)\n\t\t\t\t}\n\t\t\t\tchain.bestChain.SetTip(tip(branch0Nodes))\n\n\t\t\t\tbranch1Nodes := chainedNodes(branch0Nodes[9], 2)\n\t\t\t\tfor _, node := range branch1Nodes {\n\t\t\t\t\tchain.index.AddNode(node)\n\t\t\t\t}\n\n\t\t\t\tactiveTip := ChainTip{\n\t\t\t\t\tHeight:    13,\n\t\t\t\t\tBlockHash: (tip(branch0Nodes)).hash,\n\t\t\t\t\tBranchLen: 0,\n\t\t\t\t\tStatus:    StatusActive,\n\t\t\t\t}\n\t\t\t\tunknownTip := ChainTip{\n\t\t\t\t\tHeight:    12,\n\t\t\t\t\tBlockHash: (tip(branch1Nodes)).hash,\n\t\t\t\t\tBranchLen: 2,\n\t\t\t\t\tStatus:    StatusUnknown,\n\t\t\t\t}\n\t\t\t\tchainTips := make(map[chainhash.Hash]ChainTip)\n\t\t\t\tchainTips[activeTip.BlockHash] = activeTip\n\t\t\t\tchainTips[unknownTip.BlockHash] = unknownTip\n\n\t\t\t\treturn chain, chainTips\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"1 inactive tip, 1 invalid tip, 1 active tip\",\n\t\t\tchainTipGen: func() (*BlockChain, map[chainhash.Hash]ChainTip) {\n\t\t\t\t// Construct a synthetic block chain with a block index consisting of\n\t\t\t\t// the following structure.\n\t\t\t\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t\t\t\t//            \\ -> 1a (valid-fork)\n\t\t\t\t//            \\ -> 1b (invalid)\n\t\t\t\ttip := tstTip\n\t\t\t\tchain := newFakeChain(&chaincfg.MainNetParams)\n\t\t\t\tbranch0Nodes := chainedNodes(chain.bestChain.Genesis(), 3)\n\t\t\t\tfor _, node := range branch0Nodes {\n\t\t\t\t\tchain.index.SetStatusFlags(node, statusDataStored)\n\t\t\t\t\tchain.index.SetStatusFlags(node, statusValid)\n\t\t\t\t\tchain.index.AddNode(node)\n\t\t\t\t}\n\t\t\t\tchain.bestChain.SetTip(tip(branch0Nodes))\n\n\t\t\t\tbranch1Nodes := chainedNodes(chain.bestChain.Genesis(), 1)\n\t\t\t\tfor _, node := range branch1Nodes {\n\t\t\t\t\tchain.index.SetStatusFlags(node, statusDataStored)\n\t\t\t\t\tchain.index.SetStatusFlags(node, statusValid)\n\t\t\t\t\tchain.index.AddNode(node)\n\t\t\t\t}\n\n\t\t\t\tbranch2Nodes := chainedNodes(chain.bestChain.Genesis(), 1)\n\t\t\t\tfor _, node := range branch2Nodes {\n\t\t\t\t\tchain.index.SetStatusFlags(node, statusDataStored)\n\t\t\t\t\tchain.index.SetStatusFlags(node, statusValidateFailed)\n\t\t\t\t\tchain.index.AddNode(node)\n\t\t\t\t}\n\n\t\t\t\tactiveTip := ChainTip{\n\t\t\t\t\tHeight:    tip(branch0Nodes).height,\n\t\t\t\t\tBlockHash: (tip(branch0Nodes)).hash,\n\t\t\t\t\tBranchLen: 0,\n\t\t\t\t\tStatus:    StatusActive,\n\t\t\t\t}\n\n\t\t\t\tinactiveTip := ChainTip{\n\t\t\t\t\tHeight:    tip(branch1Nodes).height,\n\t\t\t\t\tBlockHash: (tip(branch1Nodes)).hash,\n\t\t\t\t\tBranchLen: 1,\n\t\t\t\t\tStatus:    StatusValidFork,\n\t\t\t\t}\n\n\t\t\t\tinvalidTip := ChainTip{\n\t\t\t\t\tHeight:    tip(branch2Nodes).height,\n\t\t\t\t\tBlockHash: (tip(branch2Nodes)).hash,\n\t\t\t\t\tBranchLen: 1,\n\t\t\t\t\tStatus:    StatusInvalid,\n\t\t\t\t}\n\n\t\t\t\tchainTips := make(map[chainhash.Hash]ChainTip)\n\t\t\t\tchainTips[activeTip.BlockHash] = activeTip\n\t\t\t\tchainTips[inactiveTip.BlockHash] = inactiveTip\n\t\t\t\tchainTips[invalidTip.BlockHash] = invalidTip\n\n\t\t\t\treturn chain, chainTips\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tchain, expectedChainTips := test.chainTipGen()\n\t\tgotChainTips := chain.ChainTips()\n\t\tif len(gotChainTips) != len(expectedChainTips) {\n\t\t\tt.Errorf(\"TestChainTips Failed test %s. Expected %d \"+\n\t\t\t\t\"chain tips, got %d\", test.name, len(expectedChainTips), len(gotChainTips))\n\t\t}\n\n\t\tfor _, gotChainTip := range gotChainTips {\n\t\t\ttestChainTip, found := expectedChainTips[gotChainTip.BlockHash]\n\t\t\tif !found {\n\t\t\t\tt.Errorf(\"TestChainTips Failed test %s. Couldn't find an expected \"+\n\t\t\t\t\t\"chain tip with height %d, hash %s, branchlen %d, status \\\"%s\\\"\",\n\t\t\t\t\ttest.name, testChainTip.Height, testChainTip.BlockHash.String(),\n\t\t\t\t\ttestChainTip.BranchLen, testChainTip.Status.String())\n\t\t\t}\n\n\t\t\tif !reflect.DeepEqual(testChainTip, gotChainTip) {\n\t\t\t\tt.Errorf(\"TestChainTips Failed test %s. Expected chain tip with \"+\n\t\t\t\t\t\"height %d, hash %s, branchlen %d, status \\\"%s\\\" but got \"+\n\t\t\t\t\t\"height %d, hash %s, branchlen %d, status \\\"%s\\\"\", test.name,\n\t\t\t\t\ttestChainTip.Height, testChainTip.BlockHash.String(),\n\t\t\t\t\ttestChainTip.BranchLen, testChainTip.Status.String(),\n\t\t\t\t\tgotChainTip.Height, gotChainTip.BlockHash.String(),\n\t\t\t\t\tgotChainTip.BranchLen, gotChainTip.Status.String())\n\t\t\t}\n\n\t\t\tswitch testChainTip.Status {\n\t\t\tcase StatusActive:\n\t\t\t\tif testChainTip.Status.String() != \"active\" {\n\t\t\t\t\tt.Errorf(\"TestChainTips Fail: Expected string of \\\"active\\\", got \\\"%s\\\"\",\n\t\t\t\t\t\ttestChainTip.Status.String())\n\t\t\t\t}\n\t\t\tcase StatusInvalid:\n\t\t\t\tif testChainTip.Status.String() != \"invalid\" {\n\t\t\t\t\tt.Errorf(\"TestChainTips Fail: Expected string of \\\"invalid\\\", got \\\"%s\\\"\",\n\t\t\t\t\t\ttestChainTip.Status.String())\n\t\t\t\t}\n\t\t\tcase StatusValidFork:\n\t\t\t\tif testChainTip.Status.String() != \"valid-fork\" {\n\t\t\t\t\tt.Errorf(\"TestChainTips Fail: Expected string of \\\"valid-fork\\\", got \\\"%s\\\"\",\n\t\t\t\t\t\ttestChainTip.Status.String())\n\t\t\t\t}\n\t\t\tcase StatusUnknown:\n\t\t\t\tif testChainTip.Status.String() != fmt.Sprintf(\"unknown: %b\", testChainTip.Status) {\n\t\t\t\t\tt.Errorf(\"TestChainTips Fail: Expected string of \\\"unknown\\\", got \\\"%s\\\"\",\n\t\t\t\t\t\ttestChainTip.Status.String())\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIsAncestor(t *testing.T) {\n\t// Construct a synthetic block chain with a block index consisting of\n\t// the following structure.\n\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t//            \\ -> 1a (valid-fork)\n\t//            \\ -> 1b (invalid)\n\ttip := tstTip\n\tchain := newFakeChain(&chaincfg.MainNetParams)\n\tbranch0Nodes := chainedNodes(chain.bestChain.Genesis(), 3)\n\tfor _, node := range branch0Nodes {\n\t\tchain.index.SetStatusFlags(node, statusDataStored)\n\t\tchain.index.SetStatusFlags(node, statusValid)\n\t\tchain.index.AddNode(node)\n\t}\n\tchain.bestChain.SetTip(tip(branch0Nodes))\n\n\tbranch1Nodes := chainedNodes(chain.bestChain.Genesis(), 1)\n\tfor _, node := range branch1Nodes {\n\t\tchain.index.SetStatusFlags(node, statusDataStored)\n\t\tchain.index.SetStatusFlags(node, statusValid)\n\t\tchain.index.AddNode(node)\n\t}\n\n\tbranch2Nodes := chainedNodes(chain.bestChain.Genesis(), 1)\n\tfor _, node := range branch2Nodes {\n\t\tchain.index.SetStatusFlags(node, statusDataStored)\n\t\tchain.index.SetStatusFlags(node, statusValidateFailed)\n\t\tchain.index.AddNode(node)\n\t}\n\n\t// Is 1 an ancestor of 3?\n\t//\n\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t//            \\ -> 1a (valid-fork)\n\t//            \\ -> 1b (invalid)\n\tshouldBeTrue := branch0Nodes[2].IsAncestor(branch0Nodes[0])\n\tif !shouldBeTrue {\n\t\tt.Errorf(\"TestIsAncestor fail. Node %s is an ancestor of node %s but got false\",\n\t\t\tbranch0Nodes[0].hash.String(), branch0Nodes[2].hash.String())\n\t}\n\n\t// Is 1 an ancestor of 2?\n\t//\n\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t//            \\ -> 1a (valid-fork)\n\t//            \\ -> 1b (invalid)\n\tshouldBeTrue = branch0Nodes[1].IsAncestor(branch0Nodes[0])\n\tif !shouldBeTrue {\n\t\tt.Errorf(\"TestIsAncestor fail. Node %s is an ancestor of node %s but got false\",\n\t\t\tbranch0Nodes[0].hash.String(), branch0Nodes[1].hash.String())\n\t}\n\n\t// Is the genesis an ancestor of 1?\n\t//\n\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t//            \\ -> 1a (valid-fork)\n\t//            \\ -> 1b (invalid)\n\tshouldBeTrue = branch0Nodes[0].IsAncestor(chain.bestChain.Genesis())\n\tif !shouldBeTrue {\n\t\tt.Errorf(\"TestIsAncestor fail. The genesis block is an ancestor of all blocks \"+\n\t\t\t\"but got false for node %s\",\n\t\t\tbranch0Nodes[0].hash.String())\n\t}\n\n\t// Is the genesis an ancestor of 1a?\n\t//\n\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t//            \\ -> 1a (valid-fork)\n\t//            \\ -> 1b (invalid)\n\tshouldBeTrue = branch1Nodes[0].IsAncestor(chain.bestChain.Genesis())\n\tif !shouldBeTrue {\n\t\tt.Errorf(\"TestIsAncestor fail. The genesis block is an ancestor of all blocks \"+\n\t\t\t\"but got false for node %s\",\n\t\t\tbranch1Nodes[0].hash.String())\n\t}\n\n\t// Is the genesis an ancestor of 1b?\n\t//\n\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t//            \\ -> 1a (valid-fork)\n\t//            \\ -> 1b (invalid)\n\tshouldBeTrue = branch2Nodes[0].IsAncestor(chain.bestChain.Genesis())\n\tif !shouldBeTrue {\n\t\tt.Errorf(\"TestIsAncestor fail. The genesis block is an ancestor of all blocks \"+\n\t\t\t\"but got false for node %s\",\n\t\t\tbranch2Nodes[0].hash.String())\n\t}\n\n\t// Is 1 an ancestor of 1a?\n\t//\n\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t//            \\ -> 1a (valid-fork)\n\t//            \\ -> 1b (invalid)\n\tshouldBeFalse := branch1Nodes[0].IsAncestor(branch0Nodes[0])\n\tif shouldBeFalse {\n\t\tt.Errorf(\"TestIsAncestor fail. Node %s is in a different branch than \"+\n\t\t\t\"node %s but got true\", branch1Nodes[0].hash.String(),\n\t\t\tbranch0Nodes[0].hash.String())\n\t}\n\n\t// Is 1 an ancestor of 1b?\n\t//\n\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t//            \\ -> 1a (valid-fork)\n\t//            \\ -> 1b (invalid)\n\tshouldBeFalse = branch2Nodes[0].IsAncestor(branch0Nodes[0])\n\tif shouldBeFalse {\n\t\tt.Errorf(\"TestIsAncestor fail. Node %s is in a different branch than \"+\n\t\t\t\"node %s but got true\", branch2Nodes[0].hash.String(),\n\t\t\tbranch0Nodes[0].hash.String())\n\t}\n\n\t// Is 1a an ancestor of 1b?\n\t//\n\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t//            \\ -> 1a (valid-fork)\n\t//            \\ -> 1b (invalid)\n\tshouldBeFalse = branch2Nodes[0].IsAncestor(branch1Nodes[0])\n\tif shouldBeFalse {\n\t\tt.Errorf(\"TestIsAncestor fail. Node %s is in a different branch than \"+\n\t\t\t\"node %s but got true\", branch2Nodes[0].hash.String(),\n\t\t\tbranch1Nodes[0].hash.String())\n\t}\n\n\t// Is 1 an ancestor of 1?\n\t//\n\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t//            \\ -> 1a (valid-fork)\n\t//            \\ -> 1b (invalid)\n\tshouldBeFalse = branch0Nodes[0].IsAncestor(branch0Nodes[0])\n\tif shouldBeFalse {\n\t\tt.Errorf(\"TestIsAncestor fail. Node is not an ancestor of itself but got true for node %s\",\n\t\t\tbranch0Nodes[0].hash.String())\n\t}\n\n\t// Is the geneis an ancestor of genesis?\n\t//\n\t// \tgenesis -> 1  -> 2  -> 3 (active)\n\t//            \\ -> 1a (valid-fork)\n\t//            \\ -> 1b (invalid)\n\tshouldBeFalse = chain.bestChain.Genesis().IsAncestor(chain.bestChain.Genesis())\n\tif shouldBeFalse {\n\t\tt.Errorf(\"TestIsAncestor fail. Node is not an ancestor of itself but got true for node %s\",\n\t\t\tchain.bestChain.Genesis().hash.String())\n\t}\n\n\t// Is a block from another chain an ancestor of 1b?\n\tfakeChain := newFakeChain(&chaincfg.TestNet3Params)\n\tshouldBeFalse = branch2Nodes[0].IsAncestor(fakeChain.bestChain.Genesis())\n\tif shouldBeFalse {\n\t\tt.Errorf(\"TestIsAncestor fail. Node %s is in a different chain than \"+\n\t\t\t\"node %s but got true\", fakeChain.bestChain.Genesis().hash.String(),\n\t\t\tbranch2Nodes[0].hash.String())\n\t}\n}\n\n// randomSelect selects random amount of random elements from a slice and returns a\n// new slice.  The selected elements are removed.\nfunc randomSelect(input []*testhelper.SpendableOut) (\n\t[]*testhelper.SpendableOut, []*testhelper.SpendableOut) {\n\n\tselected := []*testhelper.SpendableOut{}\n\n\t// Select random elements from the input slice\n\tamount := rand.Intn(len(input))\n\tfor i := 0; i < amount; i++ {\n\t\t// Generate a random index\n\t\trandIdx := rand.Intn(len(input))\n\n\t\t// Append the selected element to the new slice\n\t\tselected = append(selected, input[randIdx])\n\n\t\t// Remove the selected element from the input slice.\n\t\t// This ensures that each selected element is unique.\n\t\tinput = append(input[:randIdx], input[randIdx+1:]...)\n\t}\n\n\treturn input, selected\n}\n\n// addBlocks generates new blocks and adds them to the chain.  The newly generated\n// blocks will spend from the spendable outputs passed in.  The returned hases are\n// the hashes of the newly generated blocks.\nfunc addBlocks(count int, chain *BlockChain, prevBlock *btcutil.Block,\n\tallSpendableOutputs []*testhelper.SpendableOut) (\n\t[]*chainhash.Hash, [][]*testhelper.SpendableOut, error) {\n\n\tblockHashes := make([]*chainhash.Hash, 0, count)\n\tspendablesOuts := make([][]*testhelper.SpendableOut, 0, count)\n\n\t// Always spend everything on the first block.  This ensures we get unique blocks\n\t// every time.  The random select may choose not to spend any and that results\n\t// in getting the same block.\n\tnextSpends := allSpendableOutputs\n\tallSpendableOutputs = allSpendableOutputs[:0]\n\tfor b := 0; b < count; b++ {\n\t\tnewBlock, newSpendableOuts, err := addBlock(chain, prevBlock, nextSpends)\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t\tprevBlock = newBlock\n\n\t\tblockHashes = append(blockHashes, newBlock.Hash())\n\t\tspendablesOuts = append(spendablesOuts, newSpendableOuts)\n\t\tallSpendableOutputs = append(allSpendableOutputs, newSpendableOuts...)\n\n\t\t// Grab utxos to be spent in the next block.\n\t\tallSpendableOutputs, nextSpends = randomSelect(allSpendableOutputs)\n\t}\n\n\treturn blockHashes, spendablesOuts, nil\n}\n\nfunc TestInvalidateBlock(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tchainGen func() (*BlockChain, []*chainhash.Hash, func())\n\t}{\n\t\t{\n\t\t\tname: \"one branch, invalidate once\",\n\t\t\tchainGen: func() (*BlockChain, []*chainhash.Hash, func()) {\n\t\t\t\tchain, params, tearDown := utxoCacheTestChain(\n\t\t\t\t\t\"TestInvalidateBlock-one-branch-\" +\n\t\t\t\t\t\t\"invalidate-once\")\n\t\t\t\t// Grab the tip of the chain.\n\t\t\t\ttip := btcutil.NewBlock(params.GenesisBlock)\n\n\t\t\t\t// Create a chain with 11 blocks.\n\t\t\t\t_, _, err := addBlocks(11, chain, tip, []*testhelper.SpendableOut{})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Invalidate block 5.\n\t\t\t\tblock, err := chain.BlockByHeight(5)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tinvalidateHash := block.Hash()\n\n\t\t\t\treturn chain, []*chainhash.Hash{invalidateHash}, tearDown\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"invalidate twice\",\n\t\t\tchainGen: func() (*BlockChain, []*chainhash.Hash, func()) {\n\t\t\t\tchain, params, tearDown := utxoCacheTestChain(\"TestInvalidateBlock-invalidate-twice\")\n\t\t\t\t// Grab the tip of the chain.\n\t\t\t\ttip := btcutil.NewBlock(params.GenesisBlock)\n\n\t\t\t\t// Create a chain with 11 blocks.\n\t\t\t\t_, spendableOuts, err := addBlocks(11, chain, tip, []*testhelper.SpendableOut{})\n\t\t\t\t//_, _, err := addBlocks(11, chain, tip, []*testhelper.SpendableOut{})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Set invalidateHash as block 5.\n\t\t\t\tblock, err := chain.BlockByHeight(5)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tinvalidateHash := block.Hash()\n\n\t\t\t\t// Create a side chain with 7 blocks that builds on block 1.\n\t\t\t\tb1, err := chain.BlockByHeight(1)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\taltBlockHashes, _, err := addBlocks(6, chain, b1, spendableOuts[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Grab block at height 5:\n\t\t\t\t//\n\t\t\t\t// b2, b3, b4, b5\n\t\t\t\t//  0,  1,  2,  3\n\t\t\t\tinvalidateHash2 := altBlockHashes[3]\n\n\t\t\t\t// Sanity checking that we grabbed the correct hash.\n\t\t\t\tnode := chain.index.LookupNode(invalidateHash)\n\t\t\t\tif node == nil || node.height != 5 {\n\t\t\t\t\tt.Fatalf(\"wanted to grab block at height 5 but got height %v\",\n\t\t\t\t\t\tnode.height)\n\t\t\t\t}\n\n\t\t\t\treturn chain, []*chainhash.Hash{invalidateHash, invalidateHash2}, tearDown\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"invalidate a side branch\",\n\t\t\tchainGen: func() (*BlockChain, []*chainhash.Hash, func()) {\n\t\t\t\tchain, params, tearDown := utxoCacheTestChain(\"TestInvalidateBlock-invalidate-side-branch\")\n\t\t\t\ttip := btcutil.NewBlock(params.GenesisBlock)\n\n\t\t\t\t// Grab the tip of the chain.\n\t\t\t\ttip, err := chain.BlockByHash(&chain.bestChain.Tip().hash)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Create a chain with 11 blocks.\n\t\t\t\t_, spendableOuts, err := addBlocks(11, chain, tip, []*testhelper.SpendableOut{})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Create a side chain with 7 blocks that builds on block 1.\n\t\t\t\tb1, err := chain.BlockByHeight(1)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\taltBlockHashes, _, err := addBlocks(6, chain, b1, spendableOuts[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Grab block at height 4:\n\t\t\t\t//\n\t\t\t\t// b2, b3, b4\n\t\t\t\t//  0,  1,  2\n\t\t\t\tinvalidateHash := altBlockHashes[2]\n\n\t\t\t\t// Sanity checking that we grabbed the correct hash.\n\t\t\t\tnode := chain.index.LookupNode(invalidateHash)\n\t\t\t\tif node == nil || node.height != 4 {\n\t\t\t\t\tt.Fatalf(\"wanted to grab block at height 4 but got height %v\",\n\t\t\t\t\t\tnode.height)\n\t\t\t\t}\n\n\t\t\t\treturn chain, []*chainhash.Hash{invalidateHash}, tearDown\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tchain, invalidateHashes, tearDown := test.chainGen()\n\t\tfunc() {\n\t\t\tdefer tearDown()\n\t\t\tfor _, invalidateHash := range invalidateHashes {\n\t\t\t\tchainTipsBefore := chain.ChainTips()\n\n\t\t\t\t// Mark if we're invalidating a block that's a part of the best chain.\n\t\t\t\tvar bestChainBlock bool\n\t\t\t\tnode := chain.index.LookupNode(invalidateHash)\n\t\t\t\tif chain.bestChain.Contains(node) {\n\t\t\t\t\tbestChainBlock = true\n\t\t\t\t}\n\n\t\t\t\t// Actual invalidation.\n\t\t\t\terr := chain.InvalidateBlock(invalidateHash)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\tchainTipsAfter := chain.ChainTips()\n\n\t\t\t\t// Create a map for easy lookup.\n\t\t\t\tchainTipMap := make(map[chainhash.Hash]ChainTip, len(chainTipsAfter))\n\t\t\t\tactiveTipCount := 0\n\t\t\t\tfor _, chainTip := range chainTipsAfter {\n\t\t\t\t\tchainTipMap[chainTip.BlockHash] = chainTip\n\n\t\t\t\t\tif chainTip.Status == StatusActive {\n\t\t\t\t\t\tactiveTipCount++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif activeTipCount != 1 {\n\t\t\t\t\tt.Fatalf(\"TestInvalidateBlock fail. Expected \"+\n\t\t\t\t\t\t\"1 active chain tip but got %d\", activeTipCount)\n\t\t\t\t}\n\n\t\t\t\tbestTip := chain.bestChain.Tip()\n\n\t\t\t\tvalidForkCount := 0\n\t\t\t\tfor _, tip := range chainTipsBefore {\n\t\t\t\t\t// If the chaintip was an active tip and we invalidated a block\n\t\t\t\t\t// in the active tip, assert that it's invalid now.\n\t\t\t\t\tif bestChainBlock && tip.Status == StatusActive {\n\t\t\t\t\t\tgotTip, found := chainTipMap[tip.BlockHash]\n\t\t\t\t\t\tif !found {\n\t\t\t\t\t\t\tt.Fatalf(\"TestInvalidateBlock fail. Expected \"+\n\t\t\t\t\t\t\t\t\"block %s not found in chaintips after \"+\n\t\t\t\t\t\t\t\t\"invalidateblock\", tip.BlockHash.String())\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif gotTip.Status != StatusInvalid {\n\t\t\t\t\t\t\tt.Fatalf(\"TestInvalidateBlock fail. \"+\n\t\t\t\t\t\t\t\t\"Expected block %s to be invalid, got status: %s\",\n\t\t\t\t\t\t\t\tgotTip.BlockHash.String(), gotTip.Status)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif !bestChainBlock && tip.Status != StatusActive {\n\t\t\t\t\t\tgotTip, found := chainTipMap[tip.BlockHash]\n\t\t\t\t\t\tif !found {\n\t\t\t\t\t\t\tt.Fatalf(\"TestInvalidateBlock fail. Expected \"+\n\t\t\t\t\t\t\t\t\"block %s not found in chaintips after \"+\n\t\t\t\t\t\t\t\t\"invalidateblock\", tip.BlockHash.String())\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif gotTip.BlockHash == *invalidateHash && gotTip.Status != StatusInvalid {\n\t\t\t\t\t\t\tt.Fatalf(\"TestInvalidateBlock fail. \"+\n\t\t\t\t\t\t\t\t\"Expected block %s to be invalid, got status: %s\",\n\t\t\t\t\t\t\t\tgotTip.BlockHash.String(), gotTip.Status)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we're not invalidating the branch with an active tip,\n\t\t\t\t\t// we expect the active tip to remain the same.\n\t\t\t\t\tif !bestChainBlock && tip.Status == StatusActive && tip.BlockHash != bestTip.hash {\n\t\t\t\t\t\tt.Fatalf(\"TestInvalidateBlock fail. Expected block %s as the tip but got %s\",\n\t\t\t\t\t\t\ttip.BlockHash.String(), bestTip.hash.String())\n\t\t\t\t\t}\n\n\t\t\t\t\t// If this tip is not invalid and not active, it should be\n\t\t\t\t\t// lighter than the current best tip.\n\t\t\t\t\tif tip.Status != StatusActive && tip.Status != StatusInvalid &&\n\t\t\t\t\t\ttip.Height > bestTip.height {\n\n\t\t\t\t\t\ttipNode := chain.index.LookupNode(&tip.BlockHash)\n\t\t\t\t\t\tif bestTip.workSum.Cmp(tipNode.workSum) == -1 {\n\t\t\t\t\t\t\tt.Fatalf(\"TestInvalidateBlock fail. Expected \"+\n\t\t\t\t\t\t\t\t\"block %s to be the active tip but block %s \"+\n\t\t\t\t\t\t\t\t\"was\", tipNode.hash.String(), bestTip.hash.String())\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif tip.Status == StatusValidFork {\n\t\t\t\t\t\tvalidForkCount++\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If there are no other valid chain tips besides the active chaintip,\n\t\t\t\t// we expect to have one more chain tip after the invalidate.\n\t\t\t\tif validForkCount == 0 && len(chainTipsAfter) != len(chainTipsBefore)+1 {\n\t\t\t\t\tt.Fatalf(\"TestInvalidateBlock fail. Expected %d chaintips but got %d\",\n\t\t\t\t\t\tlen(chainTipsBefore)+1, len(chainTipsAfter))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to invaliate the already invalidated hash.\n\t\t\terr := chain.InvalidateBlock(invalidateHashes[0])\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\t// Try to invaliate a genesis block\n\t\t\terr = chain.InvalidateBlock(chain.chainParams.GenesisHash)\n\t\t\tif err == nil {\n\t\t\t\tt.Fatalf(\"TestInvalidateBlock fail. Expected to err when trying to\" +\n\t\t\t\t\t\"invalidate a genesis block.\")\n\t\t\t}\n\n\t\t\t// Try to invaliate a block that doesn't exist.\n\t\t\terr = chain.InvalidateBlock(chaincfg.MainNetParams.GenesisHash)\n\t\t\tif err == nil {\n\t\t\t\tt.Fatalf(\"TestInvalidateBlock fail. Expected to err when trying to\" +\n\t\t\t\t\t\"invalidate a block that doesn't exist.\")\n\t\t\t}\n\t\t}()\n\t}\n}\n\nfunc TestReconsiderBlock(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tchainGen func() (*BlockChain, []*chainhash.Hash, func())\n\t}{\n\t\t{\n\t\t\tname: \"one branch, invalidate once and revalidate\",\n\t\t\tchainGen: func() (*BlockChain, []*chainhash.Hash, func()) {\n\t\t\t\tchain, params, tearDown := utxoCacheTestChain(\"TestInvalidateBlock-one-branch-invalidate-once\")\n\n\t\t\t\t// Create a chain with 101 blocks.\n\t\t\t\ttip := btcutil.NewBlock(params.GenesisBlock)\n\t\t\t\t_, _, err := addBlocks(101, chain, tip, []*testhelper.SpendableOut{})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Invalidate block 5.\n\t\t\t\tblock, err := chain.BlockByHeight(5)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tinvalidateHash := block.Hash()\n\n\t\t\t\treturn chain, []*chainhash.Hash{invalidateHash}, tearDown\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"invalidate the active branch with a side branch present and revalidate\",\n\t\t\tchainGen: func() (*BlockChain, []*chainhash.Hash, func()) {\n\t\t\t\tchain, params, tearDown := utxoCacheTestChain(\"TestReconsiderBlock-invalidate-with-side-branch\")\n\n\t\t\t\t// Create a chain with 101 blocks.\n\t\t\t\ttip := btcutil.NewBlock(params.GenesisBlock)\n\t\t\t\t_, spendableOuts, err := addBlocks(101, chain, tip, []*testhelper.SpendableOut{})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Invalidate block 5.\n\t\t\t\tblock, err := chain.BlockByHeight(5)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tinvalidateHash := block.Hash()\n\n\t\t\t\t// Create a side chain with 7 blocks that builds on block 1.\n\t\t\t\tb1, err := chain.BlockByHeight(1)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\t_, _, err = addBlocks(6, chain, b1, spendableOuts[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\treturn chain, []*chainhash.Hash{invalidateHash}, tearDown\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"invalidate a side branch and revalidate it\",\n\t\t\tchainGen: func() (*BlockChain, []*chainhash.Hash, func()) {\n\t\t\t\tchain, params, tearDown := utxoCacheTestChain(\"TestReconsiderBlock-invalidate-a-side-branch\")\n\n\t\t\t\t// Create a chain with 101 blocks.\n\t\t\t\ttip := btcutil.NewBlock(params.GenesisBlock)\n\t\t\t\t_, spendableOuts, err := addBlocks(101, chain, tip, []*testhelper.SpendableOut{})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Create a side chain with 7 blocks that builds on block 1.\n\t\t\t\tb1, err := chain.BlockByHeight(1)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\taltBlockHashes, _, err := addBlocks(6, chain, b1, spendableOuts[0])\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\t// Grab block at height 4:\n\t\t\t\t//\n\t\t\t\t// b2, b3, b4, b5\n\t\t\t\t//  0,  1,  2,  3\n\t\t\t\tinvalidateHash := altBlockHashes[2]\n\n\t\t\t\treturn chain, []*chainhash.Hash{invalidateHash}, tearDown\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"reconsider an invalid side branch with a higher work\",\n\t\t\tchainGen: func() (*BlockChain, []*chainhash.Hash, func()) {\n\t\t\t\tchain, params, tearDown := utxoCacheTestChain(\"TestReconsiderBlock-reconsider-an-invalid-side-branch-higher\")\n\n\t\t\t\ttip := btcutil.NewBlock(params.GenesisBlock)\n\t\t\t\t_, spendableOuts, err := addBlocks(6, chain, tip, []*testhelper.SpendableOut{})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Select utxos to be spent from the best block and\n\t\t\t\t// modify the amount so that the block will be invalid.\n\t\t\t\tnextSpends, _ := randomSelect(spendableOuts[len(spendableOuts)-1])\n\t\t\t\tnextSpends[0].Amount += testhelper.LowFee\n\n\t\t\t\t// Make an invalid block that best on top of the current tip.\n\t\t\t\tbestBlock, err := chain.BlockByHash(&chain.BestSnapshot().Hash)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tinvalidBlock, _, _ := newBlock(chain, bestBlock, nextSpends)\n\t\t\t\tinvalidateHash := invalidBlock.Hash()\n\n\t\t\t\t// The block validation will fail here and we'll mark the\n\t\t\t\t// block as invalid in the block index.\n\t\t\t\tchain.ProcessBlock(invalidBlock, BFNone)\n\n\t\t\t\t// Modify the amount again so it's valid.\n\t\t\t\tnextSpends[0].Amount -= testhelper.LowFee\n\n\t\t\t\treturn chain, []*chainhash.Hash{invalidateHash}, tearDown\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"reconsider an invalid side branch with a lower work\",\n\t\t\tchainGen: func() (*BlockChain, []*chainhash.Hash, func()) {\n\t\t\t\tchain, params, tearDown := utxoCacheTestChain(\"TestReconsiderBlock-reconsider-an-invalid-side-branch-lower\")\n\n\t\t\t\ttip := btcutil.NewBlock(params.GenesisBlock)\n\t\t\t\t_, spendableOuts, err := addBlocks(6, chain, tip, []*testhelper.SpendableOut{})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Select utxos to be spent from the best block and\n\t\t\t\t// modify the amount so that the block will be invalid.\n\t\t\t\tnextSpends, _ := randomSelect(spendableOuts[len(spendableOuts)-1])\n\t\t\t\tnextSpends[0].Amount += testhelper.LowFee\n\n\t\t\t\t// Make an invalid block that best on top of the current tip.\n\t\t\t\tbestBlock, err := chain.BlockByHash(&chain.BestSnapshot().Hash)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t\tinvalidBlock, _, _ := newBlock(chain, bestBlock, nextSpends)\n\t\t\t\tinvalidateHash := invalidBlock.Hash()\n\n\t\t\t\t// The block validation will fail here and we'll mark the\n\t\t\t\t// block as invalid in the block index.\n\t\t\t\tchain.ProcessBlock(invalidBlock, BFNone)\n\n\t\t\t\t// Modify the amount again so it's valid.\n\t\t\t\tnextSpends[0].Amount -= testhelper.LowFee\n\n\t\t\t\t// Add more blocks to make the invalid block a\n\t\t\t\t// side chain and not the most pow.\n\t\t\t\t_, _, err = addBlocks(3, chain, bestBlock, []*testhelper.SpendableOut{})\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\treturn chain, []*chainhash.Hash{invalidateHash}, tearDown\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tchain, invalidateHashes, tearDown := test.chainGen()\n\t\tfunc() {\n\t\t\tdefer tearDown()\n\t\t\tfor _, invalidateHash := range invalidateHashes {\n\t\t\t\t// Cache the chain tips before the invalidate. Since we'll reconsider\n\t\t\t\t// the invalidated block, we should come back to these tips in the end.\n\t\t\t\ttips := chain.ChainTips()\n\t\t\t\texpectedChainTips := make(map[chainhash.Hash]ChainTip, len(tips))\n\t\t\t\tfor _, tip := range tips {\n\t\t\t\t\texpectedChainTips[tip.BlockHash] = tip\n\t\t\t\t}\n\n\t\t\t\t// Invalidation.\n\t\t\t\terr := chain.InvalidateBlock(invalidateHash)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Reconsideration.\n\t\t\t\terr = chain.ReconsiderBlock(invalidateHash)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\t// Compare the tips aginst the tips we've cached.\n\t\t\t\tgotChainTips := chain.ChainTips()\n\t\t\t\tfor _, gotChainTip := range gotChainTips {\n\t\t\t\t\ttestChainTip, found := expectedChainTips[gotChainTip.BlockHash]\n\t\t\t\t\tif !found {\n\t\t\t\t\t\tt.Errorf(\"TestReconsiderBlock Failed test \\\"%s\\\". Couldn't find an expected \"+\n\t\t\t\t\t\t\t\"chain tip with height %d, hash %s, branchlen %d, status \\\"%s\\\"\",\n\t\t\t\t\t\t\ttest.name, testChainTip.Height, testChainTip.BlockHash.String(),\n\t\t\t\t\t\t\ttestChainTip.BranchLen, testChainTip.Status.String())\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the invalid side branch is a lower work, we'll never\n\t\t\t\t\t// actually process the block again until the branch becomes\n\t\t\t\t\t// a greater work chain so it'll show up as valid-fork.\n\t\t\t\t\tif test.name == \"reconsider an invalid side branch with a lower work\" &&\n\t\t\t\t\t\ttestChainTip.BlockHash == *invalidateHash {\n\n\t\t\t\t\t\ttestChainTip.Status = StatusValidFork\n\t\t\t\t\t}\n\n\t\t\t\t\tif !reflect.DeepEqual(testChainTip, gotChainTip) {\n\t\t\t\t\t\tt.Errorf(\"TestReconsiderBlock Failed test \\\"%s\\\". Expected chain tip with \"+\n\t\t\t\t\t\t\t\"height %d, hash %s, branchlen %d, status \\\"%s\\\" but got \"+\n\t\t\t\t\t\t\t\"height %d, hash %s, branchlen %d, status \\\"%s\\\"\", test.name,\n\t\t\t\t\t\t\ttestChainTip.Height, testChainTip.BlockHash.String(),\n\t\t\t\t\t\t\ttestChainTip.BranchLen, testChainTip.Status.String(),\n\t\t\t\t\t\t\tgotChainTip.Height, gotChainTip.BlockHash.String(),\n\t\t\t\t\t\t\tgotChainTip.BranchLen, gotChainTip.Status.String())\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\t}\n}\n"
  },
  {
    "path": "blockchain/chainio.go",
    "content": "// Copyright (c) 2015-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// blockHdrSize is the size of a block header.  This is simply the\n\t// constant from wire and is only provided here for convenience since\n\t// wire.MaxBlockHeaderPayload is quite long.\n\tblockHdrSize = wire.MaxBlockHeaderPayload\n\n\t// latestUtxoSetBucketVersion is the current version of the utxo set\n\t// bucket that is used to track all unspent outputs.\n\tlatestUtxoSetBucketVersion = 2\n\n\t// latestSpendJournalBucketVersion is the current version of the spend\n\t// journal bucket that is used to track all spent transactions for use\n\t// in reorgs.\n\tlatestSpendJournalBucketVersion = 1\n)\n\nvar (\n\t// blockIndexBucketName is the name of the db bucket used to house to the\n\t// block headers and contextual information.\n\tblockIndexBucketName = []byte(\"blockheaderidx\")\n\n\t// hashIndexBucketName is the name of the db bucket used to house to the\n\t// block hash -> block height index.\n\thashIndexBucketName = []byte(\"hashidx\")\n\n\t// heightIndexBucketName is the name of the db bucket used to house to\n\t// the block height -> block hash index.\n\theightIndexBucketName = []byte(\"heightidx\")\n\n\t// chainStateKeyName is the name of the db key used to store the best\n\t// chain state.\n\tchainStateKeyName = []byte(\"chainstate\")\n\n\t// utxoStateConsistencyKeyName is the name of the db key used to store the\n\t// consistency status of the utxo state.\n\tutxoStateConsistencyKeyName = []byte(\"utxostateconsistency\")\n\n\t// spendJournalVersionKeyName is the name of the db key used to store\n\t// the version of the spend journal currently in the database.\n\tspendJournalVersionKeyName = []byte(\"spendjournalversion\")\n\n\t// spendJournalBucketName is the name of the db bucket used to house\n\t// transactions outputs that are spent in each block.\n\tspendJournalBucketName = []byte(\"spendjournal\")\n\n\t// utxoSetVersionKeyName is the name of the db key used to store the\n\t// version of the utxo set currently in the database.\n\tutxoSetVersionKeyName = []byte(\"utxosetversion\")\n\n\t// utxoSetBucketName is the name of the db bucket used to house the\n\t// unspent transaction output set.\n\tutxoSetBucketName = []byte(\"utxosetv2\")\n\n\t// byteOrder is the preferred byte order used for serializing numeric\n\t// fields for storage in the database.\n\tbyteOrder = binary.LittleEndian\n)\n\n// errNotInMainChain signifies that a block hash or height that is not in the\n// main chain was requested.\ntype errNotInMainChain string\n\n// Error implements the error interface.\nfunc (e errNotInMainChain) Error() string {\n\treturn string(e)\n}\n\n// isNotInMainChainErr returns whether or not the passed error is an\n// errNotInMainChain error.\nfunc isNotInMainChainErr(err error) bool {\n\t_, ok := err.(errNotInMainChain)\n\treturn ok\n}\n\n// errDeserialize signifies that a problem was encountered when deserializing\n// data.\ntype errDeserialize string\n\n// Error implements the error interface.\nfunc (e errDeserialize) Error() string {\n\treturn string(e)\n}\n\n// isDeserializeErr returns whether or not the passed error is an errDeserialize\n// error.\nfunc isDeserializeErr(err error) bool {\n\t_, ok := err.(errDeserialize)\n\treturn ok\n}\n\n// isDbBucketNotFoundErr returns whether or not the passed error is a\n// database.Error with an error code of database.ErrBucketNotFound.\nfunc isDbBucketNotFoundErr(err error) bool {\n\tdbErr, ok := err.(database.Error)\n\treturn ok && dbErr.ErrorCode == database.ErrBucketNotFound\n}\n\n// dbFetchVersion fetches an individual version with the given key from the\n// metadata bucket.  It is primarily used to track versions on entities such as\n// buckets.  It returns zero if the provided key does not exist.\nfunc dbFetchVersion(dbTx database.Tx, key []byte) uint32 {\n\tserialized := dbTx.Metadata().Get(key)\n\tif serialized == nil {\n\t\treturn 0\n\t}\n\n\treturn byteOrder.Uint32(serialized)\n}\n\n// dbPutVersion uses an existing database transaction to update the provided\n// key in the metadata bucket to the given version.  It is primarily used to\n// track versions on entities such as buckets.\nfunc dbPutVersion(dbTx database.Tx, key []byte, version uint32) error {\n\tvar serialized [4]byte\n\tbyteOrder.PutUint32(serialized[:], version)\n\treturn dbTx.Metadata().Put(key, serialized[:])\n}\n\n// dbFetchOrCreateVersion uses an existing database transaction to attempt to\n// fetch the provided key from the metadata bucket as a version and in the case\n// it doesn't exist, it adds the entry with the provided default version and\n// returns that.  This is useful during upgrades to automatically handle loading\n// and adding version keys as necessary.\nfunc dbFetchOrCreateVersion(dbTx database.Tx, key []byte, defaultVersion uint32) (uint32, error) {\n\tversion := dbFetchVersion(dbTx, key)\n\tif version == 0 {\n\t\tversion = defaultVersion\n\t\terr := dbPutVersion(dbTx, key, version)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\n\treturn version, nil\n}\n\n// -----------------------------------------------------------------------------\n// The transaction spend journal consists of an entry for each block connected\n// to the main chain which contains the transaction outputs the block spends\n// serialized such that the order is the reverse of the order they were spent.\n//\n// This is required because reorganizing the chain necessarily entails\n// disconnecting blocks to get back to the point of the fork which implies\n// unspending all of the transaction outputs that each block previously spent.\n// Since the utxo set, by definition, only contains unspent transaction outputs,\n// the spent transaction outputs must be resurrected from somewhere.  There is\n// more than one way this could be done, however this is the most straight\n// forward method that does not require having a transaction index and unpruned\n// blockchain.\n//\n// NOTE: This format is NOT self describing.  The additional details such as\n// the number of entries (transaction inputs) are expected to come from the\n// block itself and the utxo set (for legacy entries).  The rationale in doing\n// this is to save space.  This is also the reason the spent outputs are\n// serialized in the reverse order they are spent because later transactions are\n// allowed to spend outputs from earlier ones in the same block.\n//\n// The reserved field below used to keep track of the version of the containing\n// transaction when the height in the header code was non-zero, however the\n// height is always non-zero now, but keeping the extra reserved field allows\n// backwards compatibility.\n//\n// The serialized format is:\n//\n//   [<header code><reserved><compressed txout>],...\n//\n//   Field                Type     Size\n//   header code          VLQ      variable\n//   reserved             byte     1\n//   compressed txout\n//     compressed amount  VLQ      variable\n//     compressed script  []byte   variable\n//\n// The serialized header code format is:\n//   bit 0 - containing transaction is a coinbase\n//   bits 1-x - height of the block that contains the spent txout\n//\n// Example 1:\n// From block 170 in main blockchain.\n//\n//    1300320511db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5c\n//    <><><------------------------------------------------------------------>\n//     | |                                  |\n//     | reserved                  compressed txout\n//    header code\n//\n//  - header code: 0x13 (coinbase, height 9)\n//  - reserved: 0x00\n//  - compressed txout 0:\n//    - 0x32: VLQ-encoded compressed amount for 5000000000 (50 BTC)\n//    - 0x05: special script type pay-to-pubkey\n//    - 0x11...5c: x-coordinate of the pubkey\n//\n// Example 2:\n// Adapted from block 100025 in main blockchain.\n//\n//    8b99700091f20f006edbc6c4d31bae9f1ccc38538a114bf42de65e868b99700086c64700b2fb57eadf61e106a100a7445a8c3f67898841ec\n//    <----><><----------------------------------------------><----><><---------------------------------------------->\n//     |    |                         |                        |    |                         |\n//     |    reserved         compressed txout                  |    reserved         compressed txout\n//    header code                                          header code\n//\n//  - Last spent output:\n//    - header code: 0x8b9970 (not coinbase, height 100024)\n//    - reserved: 0x00\n//    - compressed txout:\n//      - 0x91f20f: VLQ-encoded compressed amount for 34405000000 (344.05 BTC)\n//      - 0x00: special script type pay-to-pubkey-hash\n//      - 0x6e...86: pubkey hash\n//  - Second to last spent output:\n//    - header code: 0x8b9970 (not coinbase, height 100024)\n//    - reserved: 0x00\n//    - compressed txout:\n//      - 0x86c647: VLQ-encoded compressed amount for 13761000000 (137.61 BTC)\n//      - 0x00: special script type pay-to-pubkey-hash\n//      - 0xb2...ec: pubkey hash\n// -----------------------------------------------------------------------------\n\n// SpentTxOut contains a spent transaction output and potentially additional\n// contextual information such as whether or not it was contained in a coinbase\n// transaction, the version of the transaction it was contained in, and which\n// block height the containing transaction was included in.  As described in\n// the comments above, the additional contextual information will only be valid\n// when this spent txout is spending the last unspent output of the containing\n// transaction.\ntype SpentTxOut struct {\n\t// Amount is the amount of the output.\n\tAmount int64\n\n\t// PkScript is the public key script for the output.\n\tPkScript []byte\n\n\t// Height is the height of the block containing the creating tx.\n\tHeight int32\n\n\t// Denotes if the creating tx is a coinbase.\n\tIsCoinBase bool\n}\n\n// FetchSpendJournal attempts to retrieve the spend journal, or the set of\n// outputs spent for the target block. This provides a view of all the outputs\n// that will be consumed once the target block is connected to the end of the\n// main chain.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) FetchSpendJournal(targetBlock *btcutil.Block) ([]SpentTxOut, error) {\n\tb.chainLock.RLock()\n\tdefer b.chainLock.RUnlock()\n\n\tvar spendEntries []SpentTxOut\n\terr := b.db.View(func(dbTx database.Tx) error {\n\t\tvar err error\n\n\t\tspendEntries, err = dbFetchSpendJournalEntry(dbTx, targetBlock)\n\t\treturn err\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn spendEntries, nil\n}\n\n// spentTxOutHeaderCode returns the calculated header code to be used when\n// serializing the provided stxo entry.\nfunc spentTxOutHeaderCode(stxo *SpentTxOut) uint64 {\n\t// As described in the serialization format comments, the header code\n\t// encodes the height shifted over one bit and the coinbase flag in the\n\t// lowest bit.\n\theaderCode := uint64(stxo.Height) << 1\n\tif stxo.IsCoinBase {\n\t\theaderCode |= 0x01\n\t}\n\n\treturn headerCode\n}\n\n// spentTxOutSerializeSize returns the number of bytes it would take to\n// serialize the passed stxo according to the format described above.\nfunc spentTxOutSerializeSize(stxo *SpentTxOut) int {\n\tsize := serializeSizeVLQ(spentTxOutHeaderCode(stxo))\n\tif stxo.Height > 0 {\n\t\t// The legacy v1 spend journal format conditionally tracked the\n\t\t// containing transaction version when the height was non-zero,\n\t\t// so this is required for backwards compat.\n\t\tsize += serializeSizeVLQ(0)\n\t}\n\treturn size + compressedTxOutSize(uint64(stxo.Amount), stxo.PkScript)\n}\n\n// putSpentTxOut serializes the passed stxo according to the format described\n// above directly into the passed target byte slice.  The target byte slice must\n// be at least large enough to handle the number of bytes returned by the\n// SpentTxOutSerializeSize function or it will panic.\nfunc putSpentTxOut(target []byte, stxo *SpentTxOut) int {\n\theaderCode := spentTxOutHeaderCode(stxo)\n\toffset := putVLQ(target, headerCode)\n\tif stxo.Height > 0 {\n\t\t// The legacy v1 spend journal format conditionally tracked the\n\t\t// containing transaction version when the height was non-zero,\n\t\t// so this is required for backwards compat.\n\t\toffset += putVLQ(target[offset:], 0)\n\t}\n\treturn offset + putCompressedTxOut(target[offset:], uint64(stxo.Amount),\n\t\tstxo.PkScript)\n}\n\n// decodeSpentTxOut decodes the passed serialized stxo entry, possibly followed\n// by other data, into the passed stxo struct.  It returns the number of bytes\n// read.\nfunc decodeSpentTxOut(serialized []byte, stxo *SpentTxOut) (int, error) {\n\t// Ensure there are bytes to decode.\n\tif len(serialized) == 0 {\n\t\treturn 0, errDeserialize(\"no serialized bytes\")\n\t}\n\n\t// Deserialize the header code.\n\tcode, offset := deserializeVLQ(serialized)\n\tif offset >= len(serialized) {\n\t\treturn offset, errDeserialize(\"unexpected end of data after \" +\n\t\t\t\"header code\")\n\t}\n\n\t// Decode the header code.\n\t//\n\t// Bit 0 indicates containing transaction is a coinbase.\n\t// Bits 1-x encode height of containing transaction.\n\tstxo.IsCoinBase = code&0x01 != 0\n\tstxo.Height = int32(code >> 1)\n\tif stxo.Height > 0 {\n\t\t// The legacy v1 spend journal format conditionally tracked the\n\t\t// containing transaction version when the height was non-zero,\n\t\t// so this is required for backwards compat.\n\t\t_, bytesRead := deserializeVLQ(serialized[offset:])\n\t\toffset += bytesRead\n\t\tif offset >= len(serialized) {\n\t\t\treturn offset, errDeserialize(\"unexpected end of data \" +\n\t\t\t\t\"after reserved\")\n\t\t}\n\t}\n\n\t// Decode the compressed txout.\n\tamount, pkScript, bytesRead, err := decodeCompressedTxOut(\n\t\tserialized[offset:])\n\toffset += bytesRead\n\tif err != nil {\n\t\treturn offset, errDeserialize(fmt.Sprintf(\"unable to decode \"+\n\t\t\t\"txout: %v\", err))\n\t}\n\tstxo.Amount = int64(amount)\n\tstxo.PkScript = pkScript\n\treturn offset, nil\n}\n\n// deserializeSpendJournalEntry decodes the passed serialized byte slice into a\n// slice of spent txouts according to the format described in detail above.\n//\n// Since the serialization format is not self describing, as noted in the\n// format comments, this function also requires the transactions that spend the\n// txouts.\nfunc deserializeSpendJournalEntry(serialized []byte, txns []*wire.MsgTx) ([]SpentTxOut, error) {\n\t// Calculate the total number of stxos.\n\tvar numStxos int\n\tfor _, tx := range txns {\n\t\tnumStxos += len(tx.TxIn)\n\t}\n\n\t// When a block has no spent txouts there is nothing to serialize.\n\tif len(serialized) == 0 {\n\t\t// Ensure the block actually has no stxos.  This should never\n\t\t// happen unless there is database corruption or an empty entry\n\t\t// erroneously made its way into the database.\n\t\tif numStxos != 0 {\n\t\t\treturn nil, AssertError(fmt.Sprintf(\"mismatched spend \"+\n\t\t\t\t\"journal serialization - no serialization for \"+\n\t\t\t\t\"expected %d stxos\", numStxos))\n\t\t}\n\n\t\treturn nil, nil\n\t}\n\n\t// Loop backwards through all transactions so everything is read in\n\t// reverse order to match the serialization order.\n\tstxoIdx := numStxos - 1\n\toffset := 0\n\tstxos := make([]SpentTxOut, numStxos)\n\tfor txIdx := len(txns) - 1; txIdx > -1; txIdx-- {\n\t\ttx := txns[txIdx]\n\n\t\t// Loop backwards through all of the transaction inputs and read\n\t\t// the associated stxo.\n\t\tfor txInIdx := len(tx.TxIn) - 1; txInIdx > -1; txInIdx-- {\n\t\t\ttxIn := tx.TxIn[txInIdx]\n\t\t\tstxo := &stxos[stxoIdx]\n\t\t\tstxoIdx--\n\n\t\t\tn, err := decodeSpentTxOut(serialized[offset:], stxo)\n\t\t\toffset += n\n\t\t\tif err != nil {\n\t\t\t\treturn nil, errDeserialize(fmt.Sprintf(\"unable \"+\n\t\t\t\t\t\"to decode stxo for %v: %v\",\n\t\t\t\t\ttxIn.PreviousOutPoint, err))\n\t\t\t}\n\t\t}\n\t}\n\n\treturn stxos, nil\n}\n\n// serializeSpendJournalEntry serializes all of the passed spent txouts into a\n// single byte slice according to the format described in detail above.\nfunc serializeSpendJournalEntry(stxos []SpentTxOut) []byte {\n\tif len(stxos) == 0 {\n\t\treturn nil\n\t}\n\n\t// Calculate the size needed to serialize the entire journal entry.\n\tvar size int\n\tfor i := range stxos {\n\t\tsize += spentTxOutSerializeSize(&stxos[i])\n\t}\n\tserialized := make([]byte, size)\n\n\t// Serialize each individual stxo directly into the slice in reverse\n\t// order one after the other.\n\tvar offset int\n\tfor i := len(stxos) - 1; i > -1; i-- {\n\t\toffset += putSpentTxOut(serialized[offset:], &stxos[i])\n\t}\n\n\treturn serialized\n}\n\n// dbFetchSpendJournalEntry fetches the spend journal entry for the passed block\n// and deserializes it into a slice of spent txout entries.\n//\n// NOTE: Legacy entries will not have the coinbase flag or height set unless it\n// was the final output spend in the containing transaction.  It is up to the\n// caller to handle this properly by looking the information up in the utxo set.\nfunc dbFetchSpendJournalEntry(dbTx database.Tx, block *btcutil.Block) ([]SpentTxOut, error) {\n\t// Exclude the coinbase transaction since it can't spend anything.\n\tspendBucket := dbTx.Metadata().Bucket(spendJournalBucketName)\n\tserialized := spendBucket.Get(block.Hash()[:])\n\tblockTxns := block.MsgBlock().Transactions[1:]\n\tstxos, err := deserializeSpendJournalEntry(serialized, blockTxns)\n\tif err != nil {\n\t\t// Ensure any deserialization errors are returned as database\n\t\t// corruption errors.\n\t\tif isDeserializeErr(err) {\n\t\t\treturn nil, database.Error{\n\t\t\t\tErrorCode: database.ErrCorruption,\n\t\t\t\tDescription: fmt.Sprintf(\"corrupt spend \"+\n\t\t\t\t\t\"information for %v: %v\", block.Hash(),\n\t\t\t\t\terr),\n\t\t\t}\n\t\t}\n\n\t\treturn nil, err\n\t}\n\n\treturn stxos, nil\n}\n\n// dbPutSpendJournalEntry uses an existing database transaction to update the\n// spend journal entry for the given block hash using the provided slice of\n// spent txouts.   The spent txouts slice must contain an entry for every txout\n// the transactions in the block spend in the order they are spent.\nfunc dbPutSpendJournalEntry(dbTx database.Tx, blockHash *chainhash.Hash, stxos []SpentTxOut) error {\n\tspendBucket := dbTx.Metadata().Bucket(spendJournalBucketName)\n\tserialized := serializeSpendJournalEntry(stxos)\n\treturn spendBucket.Put(blockHash[:], serialized)\n}\n\n// dbRemoveSpendJournalEntry uses an existing database transaction to remove the\n// spend journal entry for the passed block hash.\nfunc dbRemoveSpendJournalEntry(dbTx database.Tx, blockHash *chainhash.Hash) error {\n\tspendBucket := dbTx.Metadata().Bucket(spendJournalBucketName)\n\treturn spendBucket.Delete(blockHash[:])\n}\n\n// dbPruneSpendJournalEntry uses an existing database transaction to remove all\n// the spend journal entries for the pruned blocks.\nfunc dbPruneSpendJournalEntry(dbTx database.Tx, blockHashes []chainhash.Hash) error {\n\tspendBucket := dbTx.Metadata().Bucket(spendJournalBucketName)\n\n\tfor _, blockHash := range blockHashes {\n\t\terr := spendBucket.Delete(blockHash[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// -----------------------------------------------------------------------------\n// The unspent transaction output (utxo) set consists of an entry for each\n// unspent output using a format that is optimized to reduce space using domain\n// specific compression algorithms.  This format is a slightly modified version\n// of the format used in Bitcoin Core.\n//\n// Each entry is keyed by an outpoint as specified below.  It is important to\n// note that the key encoding uses a VLQ, which employs an MSB encoding so\n// iteration of utxos when doing byte-wise comparisons will produce them in\n// order.\n//\n// The serialized key format is:\n//   <hash><output index>\n//\n//   Field                Type             Size\n//   hash                 chainhash.Hash   chainhash.HashSize\n//   output index         VLQ              variable\n//\n// The serialized value format is:\n//\n//   <header code><compressed txout>\n//\n//   Field                Type     Size\n//   header code          VLQ      variable\n//   compressed txout\n//     compressed amount  VLQ      variable\n//     compressed script  []byte   variable\n//\n// The serialized header code format is:\n//   bit 0 - containing transaction is a coinbase\n//   bits 1-x - height of the block that contains the unspent txout\n//\n// Example 1:\n// From tx in main blockchain:\n// Blk 1, 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098:0\n//\n//    03320496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52\n//    <><------------------------------------------------------------------>\n//     |                                          |\n//   header code                         compressed txout\n//\n//  - header code: 0x03 (coinbase, height 1)\n//  - compressed txout:\n//    - 0x32: VLQ-encoded compressed amount for 5000000000 (50 BTC)\n//    - 0x04: special script type pay-to-pubkey\n//    - 0x96...52: x-coordinate of the pubkey\n//\n// Example 2:\n// From tx in main blockchain:\n// Blk 113931, 4a16969aa4764dd7507fc1de7f0baa4850a246de90c45e59a3207f9a26b5036f:2\n//\n//    8cf316800900b8025be1b3efc63b0ad48e7f9f10e87544528d58\n//    <----><------------------------------------------>\n//      |                             |\n//   header code             compressed txout\n//\n//  - header code: 0x8cf316 (not coinbase, height 113931)\n//  - compressed txout:\n//    - 0x8009: VLQ-encoded compressed amount for 15000000 (0.15 BTC)\n//    - 0x00: special script type pay-to-pubkey-hash\n//    - 0xb8...58: pubkey hash\n//\n// Example 3:\n// From tx in main blockchain:\n// Blk 338156, 1b02d1c8cfef60a189017b9a420c682cf4a0028175f2f563209e4ff61c8c3620:22\n//\n//    a8a2588ba5b9e763011dd46a006572d820e448e12d2bbb38640bc718e6\n//    <----><-------------------------------------------------->\n//      |                             |\n//   header code             compressed txout\n//\n//  - header code: 0xa8a258 (not coinbase, height 338156)\n//  - compressed txout:\n//    - 0x8ba5b9e763: VLQ-encoded compressed amount for 366875659 (3.66875659 BTC)\n//    - 0x01: special script type pay-to-script-hash\n//    - 0x1d...e6: script hash\n// -----------------------------------------------------------------------------\n\n// maxUint32VLQSerializeSize is the maximum number of bytes a max uint32 takes\n// to serialize as a VLQ.\nvar maxUint32VLQSerializeSize = serializeSizeVLQ(1<<32 - 1)\n\n// outpointKeyPool defines a concurrent safe free list of byte slices used to\n// provide temporary buffers for outpoint database keys.\nvar outpointKeyPool = sync.Pool{\n\tNew: func() interface{} {\n\t\tb := make([]byte, chainhash.HashSize+maxUint32VLQSerializeSize)\n\t\treturn &b // Pointer to slice to avoid boxing alloc.\n\t},\n}\n\n// outpointKey returns a key suitable for use as a database key in the utxo set\n// while making use of a free list.  A new buffer is allocated if there are not\n// already any available on the free list.  The returned byte slice should be\n// returned to the free list by using the recycleOutpointKey function when the\n// caller is done with it _unless_ the slice will need to live for longer than\n// the caller can calculate such as when used to write to the database.\nfunc outpointKey(outpoint wire.OutPoint) *[]byte {\n\t// A VLQ employs an MSB encoding, so they are useful not only to reduce\n\t// the amount of storage space, but also so iteration of utxos when\n\t// doing byte-wise comparisons will produce them in order.\n\tkey := outpointKeyPool.Get().(*[]byte)\n\tidx := uint64(outpoint.Index)\n\t*key = (*key)[:chainhash.HashSize+serializeSizeVLQ(idx)]\n\tcopy(*key, outpoint.Hash[:])\n\tputVLQ((*key)[chainhash.HashSize:], idx)\n\treturn key\n}\n\n// recycleOutpointKey puts the provided byte slice, which should have been\n// obtained via the outpointKey function, back on the free list.\nfunc recycleOutpointKey(key *[]byte) {\n\toutpointKeyPool.Put(key)\n}\n\n// utxoEntryHeaderCode returns the calculated header code to be used when\n// serializing the provided utxo entry.\nfunc utxoEntryHeaderCode(entry *UtxoEntry) (uint64, error) {\n\tif entry.IsSpent() {\n\t\treturn 0, AssertError(\"attempt to serialize spent utxo header\")\n\t}\n\n\t// As described in the serialization format comments, the header code\n\t// encodes the height shifted over one bit and the coinbase flag in the\n\t// lowest bit.\n\theaderCode := uint64(entry.BlockHeight()) << 1\n\tif entry.IsCoinBase() {\n\t\theaderCode |= 0x01\n\t}\n\n\treturn headerCode, nil\n}\n\n// serializeUtxoEntry returns the entry serialized to a format that is suitable\n// for long-term storage.  The format is described in detail above.\nfunc serializeUtxoEntry(entry *UtxoEntry) ([]byte, error) {\n\t// Spent outputs have no serialization.\n\tif entry.IsSpent() {\n\t\treturn nil, nil\n\t}\n\n\t// Encode the header code.\n\theaderCode, err := utxoEntryHeaderCode(entry)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Calculate the size needed to serialize the entry.\n\tsize := serializeSizeVLQ(headerCode) +\n\t\tcompressedTxOutSize(uint64(entry.Amount()), entry.PkScript())\n\n\t// Serialize the header code followed by the compressed unspent\n\t// transaction output.\n\tserialized := make([]byte, size)\n\toffset := putVLQ(serialized, headerCode)\n\toffset += putCompressedTxOut(serialized[offset:], uint64(entry.Amount()),\n\t\tentry.PkScript())\n\n\treturn serialized, nil\n}\n\n// deserializeUtxoEntry decodes a utxo entry from the passed serialized byte\n// slice into a new UtxoEntry using a format that is suitable for long-term\n// storage.  The format is described in detail above.\nfunc deserializeUtxoEntry(serialized []byte) (*UtxoEntry, error) {\n\t// Deserialize the header code.\n\tcode, offset := deserializeVLQ(serialized)\n\tif offset >= len(serialized) {\n\t\treturn nil, errDeserialize(\"unexpected end of data after header\")\n\t}\n\n\t// Decode the header code.\n\t//\n\t// Bit 0 indicates whether the containing transaction is a coinbase.\n\t// Bits 1-x encode height of containing transaction.\n\tisCoinBase := code&0x01 != 0\n\tblockHeight := int32(code >> 1)\n\n\t// Decode the compressed unspent transaction output.\n\tamount, pkScript, _, err := decodeCompressedTxOut(serialized[offset:])\n\tif err != nil {\n\t\treturn nil, errDeserialize(fmt.Sprintf(\"unable to decode \"+\n\t\t\t\"utxo: %v\", err))\n\t}\n\n\tentry := &UtxoEntry{\n\t\tamount:      int64(amount),\n\t\tpkScript:    pkScript,\n\t\tblockHeight: blockHeight,\n\t\tpackedFlags: 0,\n\t}\n\tif isCoinBase {\n\t\tentry.packedFlags |= tfCoinBase\n\t}\n\n\treturn entry, nil\n}\n\n// dbFetchUtxoEntryByHash attempts to find and fetch a utxo for the given hash.\n// It uses a cursor and seek to try and do this as efficiently as possible.\n//\n// When there are no entries for the provided hash, nil will be returned for the\n// both the entry and the error.\nfunc dbFetchUtxoEntryByHash(dbTx database.Tx, hash *chainhash.Hash) (*UtxoEntry, error) {\n\t// Attempt to find an entry by seeking for the hash along with a zero\n\t// index.  Due to the fact the keys are serialized as <hash><index>,\n\t// where the index uses an MSB encoding, if there are any entries for\n\t// the hash at all, one will be found.\n\tcursor := dbTx.Metadata().Bucket(utxoSetBucketName).Cursor()\n\tkey := outpointKey(wire.OutPoint{Hash: *hash, Index: 0})\n\tok := cursor.Seek(*key)\n\trecycleOutpointKey(key)\n\tif !ok {\n\t\treturn nil, nil\n\t}\n\n\t// An entry was found, but it could just be an entry with the next\n\t// highest hash after the requested one, so make sure the hashes\n\t// actually match.\n\tcursorKey := cursor.Key()\n\tif len(cursorKey) < chainhash.HashSize {\n\t\treturn nil, nil\n\t}\n\tif !bytes.Equal(hash[:], cursorKey[:chainhash.HashSize]) {\n\t\treturn nil, nil\n\t}\n\n\treturn deserializeUtxoEntry(cursor.Value())\n}\n\n// dbFetchUtxoEntry uses an existing database transaction to fetch the specified\n// transaction output from the utxo set.\n//\n// When there is no entry for the provided output, nil will be returned for both\n// the entry and the error.\nfunc dbFetchUtxoEntry(dbTx database.Tx, utxoBucket database.Bucket,\n\toutpoint wire.OutPoint) (*UtxoEntry, error) {\n\n\t// Fetch the unspent transaction output information for the passed\n\t// transaction output.  Return now when there is no entry.\n\tkey := outpointKey(outpoint)\n\tserializedUtxo := utxoBucket.Get(*key)\n\trecycleOutpointKey(key)\n\tif serializedUtxo == nil {\n\t\treturn nil, nil\n\t}\n\n\t// A non-nil zero-length entry means there is an entry in the database\n\t// for a spent transaction output which should never be the case.\n\tif len(serializedUtxo) == 0 {\n\t\treturn nil, AssertError(fmt.Sprintf(\"database contains entry \"+\n\t\t\t\"for spent tx output %v\", outpoint))\n\t}\n\n\t// Deserialize the utxo entry and return it.\n\tentry, err := deserializeUtxoEntry(serializedUtxo)\n\tif err != nil {\n\t\t// Ensure any deserialization errors are returned as database\n\t\t// corruption errors.\n\t\tif isDeserializeErr(err) {\n\t\t\treturn nil, database.Error{\n\t\t\t\tErrorCode: database.ErrCorruption,\n\t\t\t\tDescription: fmt.Sprintf(\"corrupt utxo entry \"+\n\t\t\t\t\t\"for %v: %v\", outpoint, err),\n\t\t\t}\n\t\t}\n\n\t\treturn nil, err\n\t}\n\n\treturn entry, nil\n}\n\n// dbPutUtxoView uses an existing database transaction to update the utxo set\n// in the database based on the provided utxo view contents and state.  In\n// particular, only the entries that have been marked as modified are written\n// to the database.\nfunc dbPutUtxoView(dbTx database.Tx, view *UtxoViewpoint) error {\n\t// Return early if the view is nil.\n\tif view == nil {\n\t\treturn nil\n\t}\n\n\tutxoBucket := dbTx.Metadata().Bucket(utxoSetBucketName)\n\tfor outpoint, entry := range view.entries {\n\t\t// No need to update the database if the entry was not modified.\n\t\tif entry == nil || !entry.isModified() {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Remove the utxo entry if it is spent.\n\t\tif entry.IsSpent() {\n\t\t\terr := dbDeleteUtxoEntry(utxoBucket, outpoint)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\terr := dbPutUtxoEntry(utxoBucket, outpoint, entry)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// dbDeleteUtxoEntry uses an existing database transaction to delete the utxo\n// entry from the database.\nfunc dbDeleteUtxoEntry(utxoBucket database.Bucket, outpoint wire.OutPoint) error {\n\tkey := outpointKey(outpoint)\n\terr := utxoBucket.Delete(*key)\n\trecycleOutpointKey(key)\n\treturn err\n}\n\n// dbPutUtxoEntry uses an existing database transaction to update the utxo entry\n// in the database.\nfunc dbPutUtxoEntry(utxoBucket database.Bucket, outpoint wire.OutPoint,\n\tentry *UtxoEntry) error {\n\n\tif entry == nil || entry.IsSpent() {\n\t\treturn AssertError(\"trying to store nil or spent entry\")\n\t}\n\n\t// Serialize and store the utxo entry.\n\tserialized, err := serializeUtxoEntry(entry)\n\tif err != nil {\n\t\treturn err\n\t}\n\tkey := outpointKey(outpoint)\n\terr = utxoBucket.Put(*key, serialized)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// NOTE: The key is intentionally not recycled here since the\n\t// database interface contract prohibits modifications.  It will\n\t// be garbage collected normally when the database is done with\n\t// it.\n\treturn nil\n}\n\n// -----------------------------------------------------------------------------\n// The block index consists of two buckets with an entry for every block in the\n// main chain.  One bucket is for the hash to height mapping and the other is\n// for the height to hash mapping.\n//\n// The serialized format for values in the hash to height bucket is:\n//   <height>\n//\n//   Field      Type     Size\n//   height     uint32   4 bytes\n//\n// The serialized format for values in the height to hash bucket is:\n//   <hash>\n//\n//   Field      Type             Size\n//   hash       chainhash.Hash   chainhash.HashSize\n// -----------------------------------------------------------------------------\n\n// dbPutBlockIndex uses an existing database transaction to update or add the\n// block index entries for the hash to height and height to hash mappings for\n// the provided values.\nfunc dbPutBlockIndex(dbTx database.Tx, hash *chainhash.Hash, height int32) error {\n\t// Serialize the height for use in the index entries.\n\tvar serializedHeight [4]byte\n\tbyteOrder.PutUint32(serializedHeight[:], uint32(height))\n\n\t// Add the block hash to height mapping to the index.\n\tmeta := dbTx.Metadata()\n\thashIndex := meta.Bucket(hashIndexBucketName)\n\tif err := hashIndex.Put(hash[:], serializedHeight[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Add the block height to hash mapping to the index.\n\theightIndex := meta.Bucket(heightIndexBucketName)\n\treturn heightIndex.Put(serializedHeight[:], hash[:])\n}\n\n// dbRemoveBlockIndex uses an existing database transaction remove block index\n// entries from the hash to height and height to hash mappings for the provided\n// values.\nfunc dbRemoveBlockIndex(dbTx database.Tx, hash *chainhash.Hash, height int32) error {\n\t// Remove the block hash to height mapping.\n\tmeta := dbTx.Metadata()\n\thashIndex := meta.Bucket(hashIndexBucketName)\n\tif err := hashIndex.Delete(hash[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Remove the block height to hash mapping.\n\tvar serializedHeight [4]byte\n\tbyteOrder.PutUint32(serializedHeight[:], uint32(height))\n\theightIndex := meta.Bucket(heightIndexBucketName)\n\treturn heightIndex.Delete(serializedHeight[:])\n}\n\n// dbFetchHeightByHash uses an existing database transaction to retrieve the\n// height for the provided hash from the index.\nfunc dbFetchHeightByHash(dbTx database.Tx, hash *chainhash.Hash) (int32, error) {\n\tmeta := dbTx.Metadata()\n\thashIndex := meta.Bucket(hashIndexBucketName)\n\tserializedHeight := hashIndex.Get(hash[:])\n\tif serializedHeight == nil {\n\t\tstr := fmt.Sprintf(\"block %s is not in the main chain\", hash)\n\t\treturn 0, errNotInMainChain(str)\n\t}\n\n\treturn int32(byteOrder.Uint32(serializedHeight)), nil\n}\n\n// dbFetchHashByHeight uses an existing database transaction to retrieve the\n// hash for the provided height from the index.\nfunc dbFetchHashByHeight(dbTx database.Tx, height int32) (*chainhash.Hash, error) {\n\tvar serializedHeight [4]byte\n\tbyteOrder.PutUint32(serializedHeight[:], uint32(height))\n\n\tmeta := dbTx.Metadata()\n\theightIndex := meta.Bucket(heightIndexBucketName)\n\thashBytes := heightIndex.Get(serializedHeight[:])\n\tif hashBytes == nil {\n\t\tstr := fmt.Sprintf(\"no block at height %d exists\", height)\n\t\treturn nil, errNotInMainChain(str)\n\t}\n\n\tvar hash chainhash.Hash\n\tcopy(hash[:], hashBytes)\n\treturn &hash, nil\n}\n\n// -----------------------------------------------------------------------------\n// The best chain state consists of the best block hash and height, the total\n// number of transactions up to and including those in the best block, and the\n// accumulated work sum up to and including the best block.\n//\n// The serialized format is:\n//\n//   <block hash><block height><total txns><work sum length><work sum>\n//\n//   Field             Type             Size\n//   block hash        chainhash.Hash   chainhash.HashSize\n//   block height      uint32           4 bytes\n//   total txns        uint64           8 bytes\n//   work sum length   uint32           4 bytes\n//   work sum          big.Int          work sum length\n// -----------------------------------------------------------------------------\n\n// bestChainState represents the data to be stored the database for the current\n// best chain state.\ntype bestChainState struct {\n\thash      chainhash.Hash\n\theight    uint32\n\ttotalTxns uint64\n\tworkSum   *big.Int\n}\n\n// serializeBestChainState returns the serialization of the passed block best\n// chain state.  This is data to be stored in the chain state bucket.\nfunc serializeBestChainState(state bestChainState) []byte {\n\t// Calculate the full size needed to serialize the chain state.\n\tworkSumBytes := state.workSum.Bytes()\n\tworkSumBytesLen := uint32(len(workSumBytes))\n\tserializedLen := chainhash.HashSize + 4 + 8 + 4 + workSumBytesLen\n\n\t// Serialize the chain state.\n\tserializedData := make([]byte, serializedLen)\n\tcopy(serializedData[0:chainhash.HashSize], state.hash[:])\n\toffset := uint32(chainhash.HashSize)\n\tbyteOrder.PutUint32(serializedData[offset:], state.height)\n\toffset += 4\n\tbyteOrder.PutUint64(serializedData[offset:], state.totalTxns)\n\toffset += 8\n\tbyteOrder.PutUint32(serializedData[offset:], workSumBytesLen)\n\toffset += 4\n\tcopy(serializedData[offset:], workSumBytes)\n\treturn serializedData\n}\n\n// deserializeBestChainState deserializes the passed serialized best chain\n// state.  This is data stored in the chain state bucket and is updated after\n// every block is connected or disconnected form the main chain.\n// block.\nfunc deserializeBestChainState(serializedData []byte) (bestChainState, error) {\n\t// Ensure the serialized data has enough bytes to properly deserialize\n\t// the hash, height, total transactions, and work sum length.\n\tif len(serializedData) < chainhash.HashSize+16 {\n\t\treturn bestChainState{}, database.Error{\n\t\t\tErrorCode:   database.ErrCorruption,\n\t\t\tDescription: \"corrupt best chain state\",\n\t\t}\n\t}\n\n\tstate := bestChainState{}\n\tcopy(state.hash[:], serializedData[0:chainhash.HashSize])\n\toffset := uint32(chainhash.HashSize)\n\tstate.height = byteOrder.Uint32(serializedData[offset : offset+4])\n\toffset += 4\n\tstate.totalTxns = byteOrder.Uint64(serializedData[offset : offset+8])\n\toffset += 8\n\tworkSumBytesLen := byteOrder.Uint32(serializedData[offset : offset+4])\n\toffset += 4\n\n\t// Ensure the serialized data has enough bytes to deserialize the work\n\t// sum.\n\tif uint32(len(serializedData[offset:])) < workSumBytesLen {\n\t\treturn bestChainState{}, database.Error{\n\t\t\tErrorCode:   database.ErrCorruption,\n\t\t\tDescription: \"corrupt best chain state\",\n\t\t}\n\t}\n\tworkSumBytes := serializedData[offset : offset+workSumBytesLen]\n\tstate.workSum = new(big.Int).SetBytes(workSumBytes)\n\n\treturn state, nil\n}\n\n// dbPutBestState uses an existing database transaction to update the best chain\n// state with the given parameters.\nfunc dbPutBestState(dbTx database.Tx, snapshot *BestState, workSum *big.Int) error {\n\t// Serialize the current best chain state.\n\tserializedData := serializeBestChainState(bestChainState{\n\t\thash:      snapshot.Hash,\n\t\theight:    uint32(snapshot.Height),\n\t\ttotalTxns: snapshot.TotalTxns,\n\t\tworkSum:   workSum,\n\t})\n\n\t// Store the current best chain state into the database.\n\treturn dbTx.Metadata().Put(chainStateKeyName, serializedData)\n}\n\n// dbPutUtxoStateConsistency uses an existing database transaction to\n// update the utxo state consistency status with the given parameters.\nfunc dbPutUtxoStateConsistency(dbTx database.Tx, hash *chainhash.Hash) error {\n\t// Store the utxo state consistency status into the database.\n\treturn dbTx.Metadata().Put(utxoStateConsistencyKeyName, hash[:])\n}\n\n// dbFetchUtxoStateConsistency uses an existing database transaction to retrieve\n// the utxo state consistency status from the database.  The code is 0 when\n// nothing was found.\nfunc dbFetchUtxoStateConsistency(dbTx database.Tx) []byte {\n\t// Fetch the serialized data from the database.\n\tstatusBytes := dbTx.Metadata().Get(utxoStateConsistencyKeyName)\n\tif statusBytes != nil {\n\t\tresult := make([]byte, len(statusBytes))\n\t\tcopy(result, statusBytes)\n\t\treturn result\n\t}\n\n\treturn nil\n}\n\n// createChainState initializes both the database and the chain state to the\n// genesis block.  This includes creating the necessary buckets and inserting\n// the genesis block, so it must only be called on an uninitialized database.\nfunc (b *BlockChain) createChainState() error {\n\t// Create a new node from the genesis block and set it as the best node.\n\tgenesisBlock := btcutil.NewBlock(b.chainParams.GenesisBlock)\n\tgenesisBlock.SetHeight(0)\n\theader := &genesisBlock.MsgBlock().Header\n\tnode := newBlockNode(header, nil)\n\tnode.status = statusDataStored | statusValid\n\tb.bestChain.SetTip(node)\n\n\t// Add the new node to the index which is used for faster lookups.\n\tb.index.addNode(node)\n\n\t// Initialize the state related to the best block.  Since it is the\n\t// genesis block, use its timestamp for the median time.\n\tnumTxns := uint64(len(genesisBlock.MsgBlock().Transactions))\n\tblockSize := uint64(genesisBlock.MsgBlock().SerializeSize())\n\tblockWeight := uint64(GetBlockWeight(genesisBlock))\n\tb.stateSnapshot = newBestState(node, blockSize, blockWeight, numTxns,\n\t\tnumTxns, time.Unix(node.timestamp, 0))\n\n\t// Create the initial the database chain state including creating the\n\t// necessary index buckets and inserting the genesis block.\n\terr := b.db.Update(func(dbTx database.Tx) error {\n\t\tmeta := dbTx.Metadata()\n\n\t\t// Create the bucket that houses the block index data.\n\t\t_, err := meta.CreateBucket(blockIndexBucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Create the bucket that houses the chain block hash to height\n\t\t// index.\n\t\t_, err = meta.CreateBucket(hashIndexBucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Create the bucket that houses the chain block height to hash\n\t\t// index.\n\t\t_, err = meta.CreateBucket(heightIndexBucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Create the bucket that houses the spend journal data and\n\t\t// store its version.\n\t\t_, err = meta.CreateBucket(spendJournalBucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = dbPutVersion(dbTx, utxoSetVersionKeyName,\n\t\t\tlatestUtxoSetBucketVersion)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Create the bucket that houses the utxo set and store its\n\t\t// version.  Note that the genesis block coinbase transaction is\n\t\t// intentionally not inserted here since it is not spendable by\n\t\t// consensus rules.\n\t\t_, err = meta.CreateBucket(utxoSetBucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = dbPutVersion(dbTx, spendJournalVersionKeyName,\n\t\t\tlatestSpendJournalBucketVersion)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Save the genesis block to the block index database.\n\t\terr = dbStoreBlockNode(dbTx, node)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Add the genesis block hash to height and height to hash\n\t\t// mappings to the index.\n\t\terr = dbPutBlockIndex(dbTx, &node.hash, node.height)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Store the current best chain state into the database.\n\t\terr = dbPutBestState(dbTx, b.stateSnapshot, node.workSum)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Store the genesis block into the database.\n\t\treturn dbStoreBlock(dbTx, genesisBlock)\n\t})\n\treturn err\n}\n\n// initChainState attempts to load and initialize the chain state from the\n// database.  When the db does not yet contain any chain state, both it and the\n// chain state are initialized to the genesis block.\nfunc (b *BlockChain) initChainState() error {\n\t// Determine the state of the chain database. We may need to initialize\n\t// everything from scratch or upgrade certain buckets.\n\tvar initialized, hasBlockIndex bool\n\terr := b.db.View(func(dbTx database.Tx) error {\n\t\tinitialized = dbTx.Metadata().Get(chainStateKeyName) != nil\n\t\thasBlockIndex = dbTx.Metadata().Bucket(blockIndexBucketName) != nil\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !initialized {\n\t\t// At this point the database has not already been initialized, so\n\t\t// initialize both it and the chain state to the genesis block.\n\t\treturn b.createChainState()\n\t}\n\n\tif !hasBlockIndex {\n\t\terr := migrateBlockIndex(b.db)\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\t// Attempt to load the chain state from the database.\n\terr = b.db.View(func(dbTx database.Tx) error {\n\t\t// Fetch the stored chain state from the database metadata.\n\t\t// When it doesn't exist, it means the database hasn't been\n\t\t// initialized for use with chain yet, so break out now to allow\n\t\t// that to happen under a writable database transaction.\n\t\tserializedData := dbTx.Metadata().Get(chainStateKeyName)\n\t\tlog.Tracef(\"Serialized chain state: %x\", serializedData)\n\t\tstate, err := deserializeBestChainState(serializedData)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Load all of the headers from the data for the known best\n\t\t// chain and construct the block index accordingly.  Since the\n\t\t// number of nodes are already known, perform a single alloc\n\t\t// for them versus a whole bunch of little ones to reduce\n\t\t// pressure on the GC.\n\t\tlog.Infof(\"Loading block index...\")\n\n\t\tblockIndexBucket := dbTx.Metadata().Bucket(blockIndexBucketName)\n\n\t\tvar i int32\n\t\tvar lastNode *blockNode\n\t\tcursor := blockIndexBucket.Cursor()\n\t\tfor ok := cursor.First(); ok; ok = cursor.Next() {\n\t\t\theader, status, err := deserializeBlockRow(cursor.Value())\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Determine the parent block node. Since we iterate block headers\n\t\t\t// in order of height, if the blocks are mostly linear there is a\n\t\t\t// very good chance the previous header processed is the parent.\n\t\t\tvar parent *blockNode\n\t\t\tif lastNode == nil {\n\t\t\t\tblockHash := header.BlockHash()\n\t\t\t\tif !blockHash.IsEqual(b.chainParams.GenesisHash) {\n\t\t\t\t\treturn AssertError(fmt.Sprintf(\"initChainState: Expected \"+\n\t\t\t\t\t\t\"first entry in block index to be genesis block, \"+\n\t\t\t\t\t\t\"found %s\", blockHash))\n\t\t\t\t}\n\t\t\t} else if header.PrevBlock == lastNode.hash {\n\t\t\t\t// Since we iterate block headers in order of height, if the\n\t\t\t\t// blocks are mostly linear there is a very good chance the\n\t\t\t\t// previous header processed is the parent.\n\t\t\t\tparent = lastNode\n\t\t\t} else {\n\t\t\t\tparent = b.index.LookupNode(&header.PrevBlock)\n\t\t\t\tif parent == nil {\n\t\t\t\t\treturn AssertError(fmt.Sprintf(\"initChainState: Could \"+\n\t\t\t\t\t\t\"not find parent for block %s\", header.BlockHash()))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Initialize the block node for the block, connect it,\n\t\t\t// and add it to the block index.\n\t\t\tnode := new(blockNode)\n\t\t\tinitBlockNode(node, header, parent)\n\t\t\tnode.status = status\n\t\t\tb.index.addNode(node)\n\n\t\t\tlastNode = node\n\t\t\ti++\n\t\t}\n\n\t\t// Set the best chain view to the stored best state.\n\t\ttip := b.index.LookupNode(&state.hash)\n\t\tif tip == nil {\n\t\t\treturn AssertError(fmt.Sprintf(\"initChainState: cannot find \"+\n\t\t\t\t\"chain tip %s in block index\", state.hash))\n\t\t}\n\t\tb.bestChain.SetTip(tip)\n\n\t\t// Load the raw block bytes for the best block.\n\t\tblockBytes, err := dbTx.FetchBlock(&state.hash)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tvar block wire.MsgBlock\n\t\terr = block.Deserialize(bytes.NewReader(blockBytes))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// As a final consistency check, we'll run through all the\n\t\t// nodes which are ancestors of the current chain tip, and mark\n\t\t// them as valid if they aren't already marked as such.  This\n\t\t// is a safe assumption as all the block before the current tip\n\t\t// are valid by definition.\n\t\tfor iterNode := tip; iterNode != nil; iterNode = iterNode.parent {\n\t\t\t// If this isn't already marked as valid in the index, then\n\t\t\t// we'll mark it as valid now to ensure consistency once\n\t\t\t// we're up and running.\n\t\t\tif !iterNode.status.KnownValid() {\n\t\t\t\tlog.Infof(\"Block %v (height=%v) ancestor of \"+\n\t\t\t\t\t\"chain tip not marked as valid, \"+\n\t\t\t\t\t\"upgrading to valid for consistency\",\n\t\t\t\t\titerNode.hash, iterNode.height)\n\n\t\t\t\tb.index.SetStatusFlags(iterNode, statusValid)\n\t\t\t}\n\t\t}\n\n\t\t// Initialize the state related to the best block.\n\t\tblockSize := uint64(len(blockBytes))\n\t\tblockWeight := uint64(GetBlockWeight(btcutil.NewBlock(&block)))\n\t\tnumTxns := uint64(len(block.Transactions))\n\t\tb.stateSnapshot = newBestState(tip, blockSize, blockWeight,\n\t\t\tnumTxns, state.totalTxns, CalcPastMedianTime(tip))\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// As we might have updated the index after it was loaded, we'll\n\t// attempt to flush the index to the DB. This will only result in a\n\t// write if the elements are dirty, so it'll usually be a noop.\n\treturn b.index.flushToDB()\n}\n\n// deserializeBlockRow parses a value in the block index bucket into a block\n// header and block status bitfield.\nfunc deserializeBlockRow(blockRow []byte) (*wire.BlockHeader, blockStatus, error) {\n\tbuffer := bytes.NewReader(blockRow)\n\n\tvar header wire.BlockHeader\n\terr := header.Deserialize(buffer)\n\tif err != nil {\n\t\treturn nil, statusNone, err\n\t}\n\n\tstatusByte, err := buffer.ReadByte()\n\tif err != nil {\n\t\treturn nil, statusNone, err\n\t}\n\n\treturn &header, blockStatus(statusByte), nil\n}\n\n// dbFetchHeaderByHash uses an existing database transaction to retrieve the\n// block header for the provided hash.\nfunc dbFetchHeaderByHash(dbTx database.Tx, hash *chainhash.Hash) (*wire.BlockHeader, error) {\n\theaderBytes, err := dbTx.FetchBlockHeader(hash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar header wire.BlockHeader\n\terr = header.Deserialize(bytes.NewReader(headerBytes))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &header, nil\n}\n\n// dbFetchHeaderByHeight uses an existing database transaction to retrieve the\n// block header for the provided height.\nfunc dbFetchHeaderByHeight(dbTx database.Tx, height int32) (*wire.BlockHeader, error) {\n\thash, err := dbFetchHashByHeight(dbTx, height)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn dbFetchHeaderByHash(dbTx, hash)\n}\n\n// dbFetchBlockByNode uses an existing database transaction to retrieve the\n// raw block for the provided node, deserialize it, and return a btcutil.Block\n// with the height set.\nfunc dbFetchBlockByNode(dbTx database.Tx, node *blockNode) (*btcutil.Block, error) {\n\t// Load the raw block bytes from the database.\n\tblockBytes, err := dbTx.FetchBlock(&node.hash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Create the encapsulated block and set the height appropriately.\n\tblock, err := btcutil.NewBlockFromBytes(blockBytes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tblock.SetHeight(node.height)\n\n\treturn block, nil\n}\n\n// dbStoreBlockNode stores the block header and validation status to the block\n// index bucket. This overwrites the current entry if there exists one.\nfunc dbStoreBlockNode(dbTx database.Tx, node *blockNode) error {\n\t// Serialize block data to be stored.\n\tw := bytes.NewBuffer(make([]byte, 0, blockHdrSize+1))\n\theader := node.Header()\n\terr := header.Serialize(w)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = w.WriteByte(byte(node.status))\n\tif err != nil {\n\t\treturn err\n\t}\n\tvalue := w.Bytes()\n\n\t// Write block header data to block index bucket.\n\tblockIndexBucket := dbTx.Metadata().Bucket(blockIndexBucketName)\n\tkey := blockIndexKey(&node.hash, uint32(node.height))\n\treturn blockIndexBucket.Put(key, value)\n}\n\n// dbStoreBlock stores the provided block in the database if it is not already\n// there. The full block data is written to ffldb.\nfunc dbStoreBlock(dbTx database.Tx, block *btcutil.Block) error {\n\thasBlock, err := dbTx.HasBlock(block.Hash())\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hasBlock {\n\t\treturn nil\n\t}\n\treturn dbTx.StoreBlock(block)\n}\n\n// blockIndexKey generates the binary key for an entry in the block index\n// bucket. The key is composed of the block height encoded as a big-endian\n// 32-bit unsigned int followed by the 32 byte block hash.\nfunc blockIndexKey(blockHash *chainhash.Hash, blockHeight uint32) []byte {\n\tindexKey := make([]byte, chainhash.HashSize+4)\n\tbinary.BigEndian.PutUint32(indexKey[0:4], blockHeight)\n\tcopy(indexKey[4:chainhash.HashSize+4], blockHash[:])\n\treturn indexKey\n}\n\n// BlockByHeight returns the block at the given height in the main chain.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) BlockByHeight(blockHeight int32) (*btcutil.Block, error) {\n\t// Lookup the block height in the best chain.\n\tnode := b.bestChain.NodeByHeight(blockHeight)\n\tif node == nil {\n\t\tstr := fmt.Sprintf(\"no block at height %d exists\", blockHeight)\n\t\treturn nil, errNotInMainChain(str)\n\t}\n\n\t// Load the block from the database and return it.\n\tvar block *btcutil.Block\n\terr := b.db.View(func(dbTx database.Tx) error {\n\t\tvar err error\n\t\tblock, err = dbFetchBlockByNode(dbTx, node)\n\t\treturn err\n\t})\n\treturn block, err\n}\n\n// BlockByHash returns the block from the main chain with the given hash with\n// the appropriate chain height set.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) BlockByHash(hash *chainhash.Hash) (*btcutil.Block, error) {\n\t// Lookup the block hash in block index and ensure it is in the best\n\t// chain.\n\tnode := b.index.LookupNode(hash)\n\tif node == nil || !b.bestChain.Contains(node) {\n\t\tstr := fmt.Sprintf(\"block %s is not in the main chain\", hash)\n\t\treturn nil, errNotInMainChain(str)\n\t}\n\n\t// Load the block from the database and return it.\n\tvar block *btcutil.Block\n\terr := b.db.View(func(dbTx database.Tx) error {\n\t\tvar err error\n\t\tblock, err = dbFetchBlockByNode(dbTx, node)\n\t\treturn err\n\t})\n\treturn block, err\n}\n"
  },
  {
    "path": "blockchain/chainio_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"math/big\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TestErrNotInMainChain ensures the functions related to errNotInMainChain work\n// as expected.\nfunc TestErrNotInMainChain(t *testing.T) {\n\terrStr := \"no block at height 1 exists\"\n\terr := error(errNotInMainChain(errStr))\n\n\t// Ensure the stringized output for the error is as expected.\n\tif err.Error() != errStr {\n\t\tt.Fatalf(\"errNotInMainChain returned unexpected error string - \"+\n\t\t\t\"got %q, want %q\", err.Error(), errStr)\n\t}\n\n\t// Ensure error is detected as the correct type.\n\tif !isNotInMainChainErr(err) {\n\t\tt.Fatalf(\"isNotInMainChainErr did not detect as expected type\")\n\t}\n\terr = errors.New(\"something else\")\n\tif isNotInMainChainErr(err) {\n\t\tt.Fatalf(\"isNotInMainChainErr detected incorrect type\")\n\t}\n}\n\n// TestStxoSerialization ensures serializing and deserializing spent transaction\n// output entries works as expected.\nfunc TestStxoSerialization(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname       string\n\t\tstxo       SpentTxOut\n\t\tserialized []byte\n\t}{\n\t\t// From block 170 in main blockchain.\n\t\t{\n\t\t\tname: \"Spends last output of coinbase\",\n\t\t\tstxo: SpentTxOut{\n\t\t\t\tAmount:     5000000000,\n\t\t\t\tPkScript:   hexToBytes(\"410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac\"),\n\t\t\t\tIsCoinBase: true,\n\t\t\t\tHeight:     9,\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"1300320511db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5c\"),\n\t\t},\n\t\t// Adapted from block 100025 in main blockchain.\n\t\t{\n\t\t\tname: \"Spends last output of non coinbase\",\n\t\t\tstxo: SpentTxOut{\n\t\t\t\tAmount:     13761000000,\n\t\t\t\tPkScript:   hexToBytes(\"76a914b2fb57eadf61e106a100a7445a8c3f67898841ec88ac\"),\n\t\t\t\tIsCoinBase: false,\n\t\t\t\tHeight:     100024,\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"8b99700086c64700b2fb57eadf61e106a100a7445a8c3f67898841ec\"),\n\t\t},\n\t\t// Adapted from block 100025 in main blockchain.\n\t\t{\n\t\t\tname: \"Does not spend last output, legacy format\",\n\t\t\tstxo: SpentTxOut{\n\t\t\t\tAmount:   34405000000,\n\t\t\t\tPkScript: hexToBytes(\"76a9146edbc6c4d31bae9f1ccc38538a114bf42de65e8688ac\"),\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"0091f20f006edbc6c4d31bae9f1ccc38538a114bf42de65e86\"),\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Ensure the function to calculate the serialized size without\n\t\t// actually serializing it is calculated properly.\n\t\tgotSize := spentTxOutSerializeSize(&test.stxo)\n\t\tif gotSize != len(test.serialized) {\n\t\t\tt.Errorf(\"SpentTxOutSerializeSize (%s): did not get \"+\n\t\t\t\t\"expected size - got %d, want %d\", test.name,\n\t\t\t\tgotSize, len(test.serialized))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the stxo serializes to the expected value.\n\t\tgotSerialized := make([]byte, gotSize)\n\t\tgotBytesWritten := putSpentTxOut(gotSerialized, &test.stxo)\n\t\tif !bytes.Equal(gotSerialized, test.serialized) {\n\t\t\tt.Errorf(\"putSpentTxOut (%s): did not get expected \"+\n\t\t\t\t\"bytes - got %x, want %x\", test.name,\n\t\t\t\tgotSerialized, test.serialized)\n\t\t\tcontinue\n\t\t}\n\t\tif gotBytesWritten != len(test.serialized) {\n\t\t\tt.Errorf(\"putSpentTxOut (%s): did not get expected \"+\n\t\t\t\t\"number of bytes written - got %d, want %d\",\n\t\t\t\ttest.name, gotBytesWritten,\n\t\t\t\tlen(test.serialized))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the serialized bytes are decoded back to the expected\n\t\t// stxo.\n\t\tvar gotStxo SpentTxOut\n\t\tgotBytesRead, err := decodeSpentTxOut(test.serialized, &gotStxo)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"decodeSpentTxOut (%s): unexpected error: %v\",\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(gotStxo, test.stxo) {\n\t\t\tt.Errorf(\"decodeSpentTxOut (%s) mismatched entries - \"+\n\t\t\t\t\"got %v, want %v\", test.name, gotStxo, test.stxo)\n\t\t\tcontinue\n\t\t}\n\t\tif gotBytesRead != len(test.serialized) {\n\t\t\tt.Errorf(\"decodeSpentTxOut (%s): did not get expected \"+\n\t\t\t\t\"number of bytes read - got %d, want %d\",\n\t\t\t\ttest.name, gotBytesRead, len(test.serialized))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestStxoDecodeErrors performs negative tests against decoding spent\n// transaction outputs to ensure error paths work as expected.\nfunc TestStxoDecodeErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname       string\n\t\tstxo       SpentTxOut\n\t\tserialized []byte\n\t\tbytesRead  int // Expected number of bytes read.\n\t\terrType    error\n\t}{\n\t\t{\n\t\t\tname:       \"nothing serialized\",\n\t\t\tstxo:       SpentTxOut{},\n\t\t\tserialized: hexToBytes(\"\"),\n\t\t\terrType:    errDeserialize(\"\"),\n\t\t\tbytesRead:  0,\n\t\t},\n\t\t{\n\t\t\tname:       \"no data after header code w/o reserved\",\n\t\t\tstxo:       SpentTxOut{},\n\t\t\tserialized: hexToBytes(\"00\"),\n\t\t\terrType:    errDeserialize(\"\"),\n\t\t\tbytesRead:  1,\n\t\t},\n\t\t{\n\t\t\tname:       \"no data after header code with reserved\",\n\t\t\tstxo:       SpentTxOut{},\n\t\t\tserialized: hexToBytes(\"13\"),\n\t\t\terrType:    errDeserialize(\"\"),\n\t\t\tbytesRead:  1,\n\t\t},\n\t\t{\n\t\t\tname:       \"no data after reserved\",\n\t\t\tstxo:       SpentTxOut{},\n\t\t\tserialized: hexToBytes(\"1300\"),\n\t\t\terrType:    errDeserialize(\"\"),\n\t\t\tbytesRead:  2,\n\t\t},\n\t\t{\n\t\t\tname:       \"incomplete compressed txout\",\n\t\t\tstxo:       SpentTxOut{},\n\t\t\tserialized: hexToBytes(\"1332\"),\n\t\t\terrType:    errDeserialize(\"\"),\n\t\t\tbytesRead:  2,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Ensure the expected error type is returned.\n\t\tgotBytesRead, err := decodeSpentTxOut(test.serialized,\n\t\t\t&test.stxo)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.errType) {\n\t\t\tt.Errorf(\"decodeSpentTxOut (%s): expected error type \"+\n\t\t\t\t\"does not match - got %T, want %T\", test.name,\n\t\t\t\terr, test.errType)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the expected number of bytes read is returned.\n\t\tif gotBytesRead != test.bytesRead {\n\t\t\tt.Errorf(\"decodeSpentTxOut (%s): unexpected number of \"+\n\t\t\t\t\"bytes read - got %d, want %d\", test.name,\n\t\t\t\tgotBytesRead, test.bytesRead)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestSpendJournalSerialization ensures serializing and deserializing spend\n// journal entries works as expected.\nfunc TestSpendJournalSerialization(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname       string\n\t\tentry      []SpentTxOut\n\t\tblockTxns  []*wire.MsgTx\n\t\tserialized []byte\n\t}{\n\t\t// From block 2 in main blockchain.\n\t\t{\n\t\t\tname:       \"No spends\",\n\t\t\tentry:      nil,\n\t\t\tblockTxns:  nil,\n\t\t\tserialized: nil,\n\t\t},\n\t\t// From block 170 in main blockchain.\n\t\t{\n\t\t\tname: \"One tx with one input spends last output of coinbase\",\n\t\t\tentry: []SpentTxOut{{\n\t\t\t\tAmount:     5000000000,\n\t\t\t\tPkScript:   hexToBytes(\"410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac\"),\n\t\t\t\tIsCoinBase: true,\n\t\t\t\tHeight:     9,\n\t\t\t}},\n\t\t\tblockTxns: []*wire.MsgTx{{ // Coinbase omitted.\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash:  *newHashFromStr(\"0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9\"),\n\t\t\t\t\t\tIndex: 0,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: hexToBytes(\"47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901\"),\n\t\t\t\t\tSequence:        0xffffffff,\n\t\t\t\t}},\n\t\t\t\tTxOut: []*wire.TxOut{{\n\t\t\t\t\tValue:    1000000000,\n\t\t\t\t\tPkScript: hexToBytes(\"4104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac\"),\n\t\t\t\t}, {\n\t\t\t\t\tValue:    4000000000,\n\t\t\t\t\tPkScript: hexToBytes(\"410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac\"),\n\t\t\t\t}},\n\t\t\t\tLockTime: 0,\n\t\t\t}},\n\t\t\tserialized: hexToBytes(\"1300320511db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5c\"),\n\t\t},\n\t\t// Adapted from block 100025 in main blockchain.\n\t\t{\n\t\t\tname: \"Two txns when one spends last output, one doesn't\",\n\t\t\tentry: []SpentTxOut{{\n\t\t\t\tAmount:     34405000000,\n\t\t\t\tPkScript:   hexToBytes(\"76a9146edbc6c4d31bae9f1ccc38538a114bf42de65e8688ac\"),\n\t\t\t\tIsCoinBase: false,\n\t\t\t\tHeight:     100024,\n\t\t\t}, {\n\t\t\t\tAmount:     13761000000,\n\t\t\t\tPkScript:   hexToBytes(\"76a914b2fb57eadf61e106a100a7445a8c3f67898841ec88ac\"),\n\t\t\t\tIsCoinBase: false,\n\t\t\t\tHeight:     100024,\n\t\t\t}},\n\t\t\tblockTxns: []*wire.MsgTx{{ // Coinbase omitted.\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash:  *newHashFromStr(\"c0ed017828e59ad5ed3cf70ee7c6fb0f426433047462477dc7a5d470f987a537\"),\n\t\t\t\t\t\tIndex: 1,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: hexToBytes(\"493046022100c167eead9840da4a033c9a56470d7794a9bb1605b377ebe5688499b39f94be59022100fb6345cab4324f9ea0b9ee9169337534834638d818129778370f7d378ee4a325014104d962cac5390f12ddb7539507065d0def320d68c040f2e73337c3a1aaaab7195cb5c4d02e0959624d534f3c10c3cf3d73ca5065ebd62ae986b04c6d090d32627c\"),\n\t\t\t\t\tSequence:        0xffffffff,\n\t\t\t\t}},\n\t\t\t\tTxOut: []*wire.TxOut{{\n\t\t\t\t\tValue:    5000000,\n\t\t\t\t\tPkScript: hexToBytes(\"76a914f419b8db4ba65f3b6fcc233acb762ca6f51c23d488ac\"),\n\t\t\t\t}, {\n\t\t\t\t\tValue:    34400000000,\n\t\t\t\t\tPkScript: hexToBytes(\"76a914cadf4fc336ab3c6a4610b75f31ba0676b7f663d288ac\"),\n\t\t\t\t}},\n\t\t\t\tLockTime: 0,\n\t\t\t}, {\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash:  *newHashFromStr(\"92fbe1d4be82f765dfabc9559d4620864b05cc897c4db0e29adac92d294e52b7\"),\n\t\t\t\t\t\tIndex: 0,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: hexToBytes(\"483045022100e256743154c097465cf13e89955e1c9ff2e55c46051b627751dee0144183157e02201d8d4f02cde8496aae66768f94d35ce54465bd4ae8836004992d3216a93a13f00141049d23ce8686fe9b802a7a938e8952174d35dd2c2089d4112001ed8089023ab4f93a3c9fcd5bfeaa9727858bf640dc1b1c05ec3b434bb59837f8640e8810e87742\"),\n\t\t\t\t\tSequence:        0xffffffff,\n\t\t\t\t}},\n\t\t\t\tTxOut: []*wire.TxOut{{\n\t\t\t\t\tValue:    5000000,\n\t\t\t\t\tPkScript: hexToBytes(\"76a914a983ad7c92c38fc0e2025212e9f972204c6e687088ac\"),\n\t\t\t\t}, {\n\t\t\t\t\tValue:    13756000000,\n\t\t\t\t\tPkScript: hexToBytes(\"76a914a6ebd69952ab486a7a300bfffdcb395dc7d47c2388ac\"),\n\t\t\t\t}},\n\t\t\t\tLockTime: 0,\n\t\t\t}},\n\t\t\tserialized: hexToBytes(\"8b99700086c64700b2fb57eadf61e106a100a7445a8c3f67898841ec8b99700091f20f006edbc6c4d31bae9f1ccc38538a114bf42de65e86\"),\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\t// Ensure the journal entry serializes to the expected value.\n\t\tgotBytes := serializeSpendJournalEntry(test.entry)\n\t\tif !bytes.Equal(gotBytes, test.serialized) {\n\t\t\tt.Errorf(\"serializeSpendJournalEntry #%d (%s): \"+\n\t\t\t\t\"mismatched bytes - got %x, want %x\", i,\n\t\t\t\ttest.name, gotBytes, test.serialized)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Deserialize to a spend journal entry.\n\t\tgotEntry, err := deserializeSpendJournalEntry(test.serialized,\n\t\t\ttest.blockTxns)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"deserializeSpendJournalEntry #%d (%s) \"+\n\t\t\t\t\"unexpected error: %v\", i, test.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure that the deserialized spend journal entry has the\n\t\t// correct properties.\n\t\tif !reflect.DeepEqual(gotEntry, test.entry) {\n\t\t\tt.Errorf(\"deserializeSpendJournalEntry #%d (%s) \"+\n\t\t\t\t\"mismatched entries - got %v, want %v\",\n\t\t\t\ti, test.name, gotEntry, test.entry)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestSpendJournalErrors performs negative tests against deserializing spend\n// journal entries to ensure error paths work as expected.\nfunc TestSpendJournalErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname       string\n\t\tblockTxns  []*wire.MsgTx\n\t\tserialized []byte\n\t\terrType    error\n\t}{\n\t\t// Adapted from block 170 in main blockchain.\n\t\t{\n\t\t\tname: \"Force assertion due to missing stxos\",\n\t\t\tblockTxns: []*wire.MsgTx{{ // Coinbase omitted.\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash:  *newHashFromStr(\"0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9\"),\n\t\t\t\t\t\tIndex: 0,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: hexToBytes(\"47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901\"),\n\t\t\t\t\tSequence:        0xffffffff,\n\t\t\t\t}},\n\t\t\t\tLockTime: 0,\n\t\t\t}},\n\t\t\tserialized: hexToBytes(\"\"),\n\t\t\terrType:    AssertError(\"\"),\n\t\t},\n\t\t{\n\t\t\tname: \"Force deserialization error in stxos\",\n\t\t\tblockTxns: []*wire.MsgTx{{ // Coinbase omitted.\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash:  *newHashFromStr(\"0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9\"),\n\t\t\t\t\t\tIndex: 0,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: hexToBytes(\"47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901\"),\n\t\t\t\t\tSequence:        0xffffffff,\n\t\t\t\t}},\n\t\t\t\tLockTime: 0,\n\t\t\t}},\n\t\t\tserialized: hexToBytes(\"1301320511db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a\"),\n\t\t\terrType:    errDeserialize(\"\"),\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Ensure the expected error type is returned and the returned\n\t\t// slice is nil.\n\t\tstxos, err := deserializeSpendJournalEntry(test.serialized,\n\t\t\ttest.blockTxns)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.errType) {\n\t\t\tt.Errorf(\"deserializeSpendJournalEntry (%s): expected \"+\n\t\t\t\t\"error type does not match - got %T, want %T\",\n\t\t\t\ttest.name, err, test.errType)\n\t\t\tcontinue\n\t\t}\n\t\tif stxos != nil {\n\t\t\tt.Errorf(\"deserializeSpendJournalEntry (%s): returned \"+\n\t\t\t\t\"slice of spent transaction outputs is not nil\",\n\t\t\t\ttest.name)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestUtxoSerialization ensures serializing and deserializing unspent\n// transaction output entries works as expected.\nfunc TestUtxoSerialization(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname       string\n\t\tentry      *UtxoEntry\n\t\tserialized []byte\n\t}{\n\t\t// From tx in main blockchain:\n\t\t// 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098:0\n\t\t{\n\t\t\tname: \"height 1, coinbase\",\n\t\t\tentry: &UtxoEntry{\n\t\t\t\tamount:      5000000000,\n\t\t\t\tpkScript:    hexToBytes(\"410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac\"),\n\t\t\t\tblockHeight: 1,\n\t\t\t\tpackedFlags: tfCoinBase,\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"03320496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52\"),\n\t\t},\n\t\t// From tx in main blockchain:\n\t\t// 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098:0\n\t\t{\n\t\t\tname: \"height 1, coinbase, spent\",\n\t\t\tentry: &UtxoEntry{\n\t\t\t\tamount:      5000000000,\n\t\t\t\tpkScript:    hexToBytes(\"410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac\"),\n\t\t\t\tblockHeight: 1,\n\t\t\t\tpackedFlags: tfCoinBase | tfSpent,\n\t\t\t},\n\t\t\tserialized: nil,\n\t\t},\n\t\t// From tx in main blockchain:\n\t\t// 8131ffb0a2c945ecaf9b9063e59558784f9c3a74741ce6ae2a18d0571dac15bb:1\n\t\t{\n\t\t\tname: \"height 100001, not coinbase\",\n\t\t\tentry: &UtxoEntry{\n\t\t\t\tamount:      1000000,\n\t\t\t\tpkScript:    hexToBytes(\"76a914ee8bd501094a7d5ca318da2506de35e1cb025ddc88ac\"),\n\t\t\t\tblockHeight: 100001,\n\t\t\t\tpackedFlags: 0,\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"8b99420700ee8bd501094a7d5ca318da2506de35e1cb025ddc\"),\n\t\t},\n\t\t// From tx in main blockchain:\n\t\t// 8131ffb0a2c945ecaf9b9063e59558784f9c3a74741ce6ae2a18d0571dac15bb:1\n\t\t{\n\t\t\tname: \"height 100001, not coinbase, spent\",\n\t\t\tentry: &UtxoEntry{\n\t\t\t\tamount:      1000000,\n\t\t\t\tpkScript:    hexToBytes(\"76a914ee8bd501094a7d5ca318da2506de35e1cb025ddc88ac\"),\n\t\t\t\tblockHeight: 100001,\n\t\t\t\tpackedFlags: tfSpent,\n\t\t\t},\n\t\t\tserialized: nil,\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\t// Ensure the utxo entry serializes to the expected value.\n\t\tgotBytes, err := serializeUtxoEntry(test.entry)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"serializeUtxoEntry #%d (%s) unexpected \"+\n\t\t\t\t\"error: %v\", i, test.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(gotBytes, test.serialized) {\n\t\t\tt.Errorf(\"serializeUtxoEntry #%d (%s): mismatched \"+\n\t\t\t\t\"bytes - got %x, want %x\", i, test.name,\n\t\t\t\tgotBytes, test.serialized)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Don't try to deserialize if the test entry was spent since it\n\t\t// will have a nil serialization.\n\t\tif test.entry.IsSpent() {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Deserialize to a utxo entry.\n\t\tutxoEntry, err := deserializeUtxoEntry(test.serialized)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"deserializeUtxoEntry #%d (%s) unexpected \"+\n\t\t\t\t\"error: %v\", i, test.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// The deserialized entry must not be marked spent since unspent\n\t\t// entries are not serialized.\n\t\tif utxoEntry.IsSpent() {\n\t\t\tt.Errorf(\"deserializeUtxoEntry #%d (%s) output should \"+\n\t\t\t\t\"not be marked spent\", i, test.name)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the deserialized entry has the same properties as the\n\t\t// ones in the test entry.\n\t\tif utxoEntry.Amount() != test.entry.Amount() {\n\t\t\tt.Errorf(\"deserializeUtxoEntry #%d (%s) mismatched \"+\n\t\t\t\t\"amounts: got %d, want %d\", i, test.name,\n\t\t\t\tutxoEntry.Amount(), test.entry.Amount())\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(utxoEntry.PkScript(), test.entry.PkScript()) {\n\t\t\tt.Errorf(\"deserializeUtxoEntry #%d (%s) mismatched \"+\n\t\t\t\t\"scripts: got %x, want %x\", i, test.name,\n\t\t\t\tutxoEntry.PkScript(), test.entry.PkScript())\n\t\t\tcontinue\n\t\t}\n\t\tif utxoEntry.BlockHeight() != test.entry.BlockHeight() {\n\t\t\tt.Errorf(\"deserializeUtxoEntry #%d (%s) mismatched \"+\n\t\t\t\t\"block height: got %d, want %d\", i, test.name,\n\t\t\t\tutxoEntry.BlockHeight(), test.entry.BlockHeight())\n\t\t\tcontinue\n\t\t}\n\t\tif utxoEntry.IsCoinBase() != test.entry.IsCoinBase() {\n\t\t\tt.Errorf(\"deserializeUtxoEntry #%d (%s) mismatched \"+\n\t\t\t\t\"coinbase flag: got %v, want %v\", i, test.name,\n\t\t\t\tutxoEntry.IsCoinBase(), test.entry.IsCoinBase())\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestUtxoEntryHeaderCodeErrors performs negative tests against unspent\n// transaction output header codes to ensure error paths work as expected.\nfunc TestUtxoEntryHeaderCodeErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname    string\n\t\tentry   *UtxoEntry\n\t\tcode    uint64\n\t\terrType error\n\t}{\n\t\t{\n\t\t\tname:    \"Force assertion due to spent output\",\n\t\t\tentry:   &UtxoEntry{packedFlags: tfSpent},\n\t\t\terrType: AssertError(\"\"),\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Ensure the expected error type is returned and the code is 0.\n\t\tcode, err := utxoEntryHeaderCode(test.entry)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.errType) {\n\t\t\tt.Errorf(\"utxoEntryHeaderCode (%s): expected error \"+\n\t\t\t\t\"type does not match - got %T, want %T\",\n\t\t\t\ttest.name, err, test.errType)\n\t\t\tcontinue\n\t\t}\n\t\tif code != 0 {\n\t\t\tt.Errorf(\"utxoEntryHeaderCode (%s): unexpected code \"+\n\t\t\t\t\"on error - got %d, want 0\", test.name, code)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestUtxoEntryDeserializeErrors performs negative tests against deserializing\n// unspent transaction outputs to ensure error paths work as expected.\nfunc TestUtxoEntryDeserializeErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname       string\n\t\tserialized []byte\n\t\terrType    error\n\t}{\n\t\t{\n\t\t\tname:       \"no data after header code\",\n\t\t\tserialized: hexToBytes(\"02\"),\n\t\t\terrType:    errDeserialize(\"\"),\n\t\t},\n\t\t{\n\t\t\tname:       \"incomplete compressed txout\",\n\t\t\tserialized: hexToBytes(\"0232\"),\n\t\t\terrType:    errDeserialize(\"\"),\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Ensure the expected error type is returned and the returned\n\t\t// entry is nil.\n\t\tentry, err := deserializeUtxoEntry(test.serialized)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.errType) {\n\t\t\tt.Errorf(\"deserializeUtxoEntry (%s): expected error \"+\n\t\t\t\t\"type does not match - got %T, want %T\",\n\t\t\t\ttest.name, err, test.errType)\n\t\t\tcontinue\n\t\t}\n\t\tif entry != nil {\n\t\t\tt.Errorf(\"deserializeUtxoEntry (%s): returned entry \"+\n\t\t\t\t\"is not nil\", test.name)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestBestChainStateSerialization ensures serializing and deserializing the\n// best chain state works as expected.\nfunc TestBestChainStateSerialization(t *testing.T) {\n\tt.Parallel()\n\n\tworkSum := new(big.Int)\n\ttests := []struct {\n\t\tname       string\n\t\tstate      bestChainState\n\t\tserialized []byte\n\t}{\n\t\t{\n\t\t\tname: \"genesis\",\n\t\t\tstate: bestChainState{\n\t\t\t\thash:      *newHashFromStr(\"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\"),\n\t\t\t\theight:    0,\n\t\t\t\ttotalTxns: 1,\n\t\t\t\tworkSum: func() *big.Int {\n\t\t\t\t\tworkSum.Add(workSum, CalcWork(486604799))\n\t\t\t\t\treturn new(big.Int).Set(workSum)\n\t\t\t\t}(), // 0x0100010001\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000000000000100000000000000050000000100010001\"),\n\t\t},\n\t\t{\n\t\t\tname: \"block 1\",\n\t\t\tstate: bestChainState{\n\t\t\t\thash:      *newHashFromStr(\"00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048\"),\n\t\t\t\theight:    1,\n\t\t\t\ttotalTxns: 2,\n\t\t\t\tworkSum: func() *big.Int {\n\t\t\t\t\tworkSum.Add(workSum, CalcWork(486604799))\n\t\t\t\t\treturn new(big.Int).Set(workSum)\n\t\t\t\t}(), // 0x0200020002\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"4860eb18bf1b1620e37e9490fc8a427514416fd75159ab86688e9a8300000000010000000200000000000000050000000200020002\"),\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\t// Ensure the state serializes to the expected value.\n\t\tgotBytes := serializeBestChainState(test.state)\n\t\tif !bytes.Equal(gotBytes, test.serialized) {\n\t\t\tt.Errorf(\"serializeBestChainState #%d (%s): mismatched \"+\n\t\t\t\t\"bytes - got %x, want %x\", i, test.name,\n\t\t\t\tgotBytes, test.serialized)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the serialized bytes are decoded back to the expected\n\t\t// state.\n\t\tstate, err := deserializeBestChainState(test.serialized)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"deserializeBestChainState #%d (%s) \"+\n\t\t\t\t\"unexpected error: %v\", i, test.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(state, test.state) {\n\t\t\tt.Errorf(\"deserializeBestChainState #%d (%s) \"+\n\t\t\t\t\"mismatched state - got %v, want %v\", i,\n\t\t\t\ttest.name, state, test.state)\n\t\t\tcontinue\n\n\t\t}\n\t}\n}\n\n// TestBestChainStateDeserializeErrors performs negative tests against\n// deserializing the chain state to ensure error paths work as expected.\nfunc TestBestChainStateDeserializeErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname       string\n\t\tserialized []byte\n\t\terrType    error\n\t}{\n\t\t{\n\t\t\tname:       \"nothing serialized\",\n\t\t\tserialized: hexToBytes(\"\"),\n\t\t\terrType:    database.Error{ErrorCode: database.ErrCorruption},\n\t\t},\n\t\t{\n\t\t\tname:       \"short data in hash\",\n\t\t\tserialized: hexToBytes(\"0000\"),\n\t\t\terrType:    database.Error{ErrorCode: database.ErrCorruption},\n\t\t},\n\t\t{\n\t\t\tname:       \"short data in work sum\",\n\t\t\tserialized: hexToBytes(\"6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d61900000000000000000001000000000000000500000001000100\"),\n\t\t\terrType:    database.Error{ErrorCode: database.ErrCorruption},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Ensure the expected error type and code is returned.\n\t\t_, err := deserializeBestChainState(test.serialized)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.errType) {\n\t\t\tt.Errorf(\"deserializeBestChainState (%s): expected \"+\n\t\t\t\t\"error type does not match - got %T, want %T\",\n\t\t\t\ttest.name, err, test.errType)\n\t\t\tcontinue\n\t\t}\n\t\tif derr, ok := err.(database.Error); ok {\n\t\t\ttderr := test.errType.(database.Error)\n\t\t\tif derr.ErrorCode != tderr.ErrorCode {\n\t\t\t\tt.Errorf(\"deserializeBestChainState (%s): \"+\n\t\t\t\t\t\"wrong  error code got: %v, want: %v\",\n\t\t\t\t\ttest.name, derr.ErrorCode,\n\t\t\t\t\ttderr.ErrorCode)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blockchain/chainview.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"sync\"\n)\n\n// approxNodesPerWeek is an approximation of the number of new blocks there are\n// in a week on average.\nconst approxNodesPerWeek = 6 * 24 * 7\n\n// log2FloorMasks defines the masks to use when quickly calculating\n// floor(log2(x)) in a constant log2(32) = 5 steps, where x is a uint32, using\n// shifts.  They are derived from (2^(2^x) - 1) * (2^(2^x)), for x in 4..0.\nvar log2FloorMasks = []uint32{0xffff0000, 0xff00, 0xf0, 0xc, 0x2}\n\n// fastLog2Floor calculates and returns floor(log2(x)) in a constant 5 steps.\nfunc fastLog2Floor(n uint32) uint8 {\n\trv := uint8(0)\n\texponent := uint8(16)\n\tfor i := 0; i < 5; i++ {\n\t\tif n&log2FloorMasks[i] != 0 {\n\t\t\trv += exponent\n\t\t\tn >>= exponent\n\t\t}\n\t\texponent >>= 1\n\t}\n\treturn rv\n}\n\n// chainView provides a flat view of a specific branch of the block chain from\n// its tip back to the genesis block and provides various convenience functions\n// for comparing chains.\n//\n// For example, assume a block chain with a side chain as depicted below:\n//\n//\tgenesis -> 1 -> 2 -> 3 -> 4  -> 5 ->  6  -> 7  -> 8\n//\t                      \\-> 4a -> 5a -> 6a\n//\n// The chain view for the branch ending in 6a consists of:\n//\n//\tgenesis -> 1 -> 2 -> 3 -> 4a -> 5a -> 6a\ntype chainView struct {\n\tmtx   sync.Mutex\n\tnodes []*blockNode\n}\n\n// newChainView returns a new chain view for the given tip block node.  Passing\n// nil as the tip will result in a chain view that is not initialized.  The tip\n// can be updated at any time via the setTip function.\nfunc newChainView(tip *blockNode) *chainView {\n\t// The mutex is intentionally not held since this is a constructor.\n\tvar c chainView\n\tc.setTip(tip)\n\treturn &c\n}\n\n// genesis returns the genesis block for the chain view.  This only differs from\n// the exported version in that it is up to the caller to ensure the lock is\n// held.\n//\n// This function MUST be called with the view mutex locked (for reads).\nfunc (c *chainView) genesis() *blockNode {\n\tif len(c.nodes) == 0 {\n\t\treturn nil\n\t}\n\n\treturn c.nodes[0]\n}\n\n// Genesis returns the genesis block for the chain view.\n//\n// This function is safe for concurrent access.\nfunc (c *chainView) Genesis() *blockNode {\n\tc.mtx.Lock()\n\tgenesis := c.genesis()\n\tc.mtx.Unlock()\n\treturn genesis\n}\n\n// tip returns the current tip block node for the chain view.  It will return\n// nil if there is no tip.  This only differs from the exported version in that\n// it is up to the caller to ensure the lock is held.\n//\n// This function MUST be called with the view mutex locked (for reads).\nfunc (c *chainView) tip() *blockNode {\n\tif len(c.nodes) == 0 {\n\t\treturn nil\n\t}\n\n\treturn c.nodes[len(c.nodes)-1]\n}\n\n// Tip returns the current tip block node for the chain view.  It will return\n// nil if there is no tip.\n//\n// This function is safe for concurrent access.\nfunc (c *chainView) Tip() *blockNode {\n\tc.mtx.Lock()\n\ttip := c.tip()\n\tc.mtx.Unlock()\n\treturn tip\n}\n\n// setTip sets the chain view to use the provided block node as the current tip\n// and ensures the view is consistent by populating it with the nodes obtained\n// by walking backwards all the way to genesis block as necessary.  Further\n// calls will only perform the minimum work needed, so switching between chain\n// tips is efficient.  This only differs from the exported version in that it is\n// up to the caller to ensure the lock is held.\n//\n// This function MUST be called with the view mutex locked (for writes).\nfunc (c *chainView) setTip(node *blockNode) {\n\tif node == nil {\n\t\t// Keep the backing array around for potential future use.\n\t\tc.nodes = c.nodes[:0]\n\t\treturn\n\t}\n\n\t// Create or resize the slice that will hold the block nodes to the\n\t// provided tip height.  When creating the slice, it is created with\n\t// some additional capacity for the underlying array as append would do\n\t// in order to reduce overhead when extending the chain later.  As long\n\t// as the underlying array already has enough capacity, simply expand or\n\t// contract the slice accordingly.  The additional capacity is chosen\n\t// such that the array should only have to be extended about once a\n\t// week.\n\tneeded := node.height + 1\n\tif int32(cap(c.nodes)) < needed {\n\t\tnodes := make([]*blockNode, needed, needed+approxNodesPerWeek)\n\t\tcopy(nodes, c.nodes)\n\t\tc.nodes = nodes\n\t} else {\n\t\tprevLen := int32(len(c.nodes))\n\t\tc.nodes = c.nodes[0:needed]\n\t\tfor i := prevLen; i < needed; i++ {\n\t\t\tc.nodes[i] = nil\n\t\t}\n\t}\n\n\tfor node != nil && c.nodes[node.height] != node {\n\t\tc.nodes[node.height] = node\n\t\tnode = node.parent\n\t}\n}\n\n// SetTip sets the chain view to use the provided block node as the current tip\n// and ensures the view is consistent by populating it with the nodes obtained\n// by walking backwards all the way to genesis block as necessary.  Further\n// calls will only perform the minimum work needed, so switching between chain\n// tips is efficient.\n//\n// This function is safe for concurrent access.\nfunc (c *chainView) SetTip(node *blockNode) {\n\tc.mtx.Lock()\n\tc.setTip(node)\n\tc.mtx.Unlock()\n}\n\n// height returns the height of the tip of the chain view.  It will return -1 if\n// there is no tip (which only happens if the chain view has not been\n// initialized).  This only differs from the exported version in that it is up\n// to the caller to ensure the lock is held.\n//\n// This function MUST be called with the view mutex locked (for reads).\nfunc (c *chainView) height() int32 {\n\treturn int32(len(c.nodes) - 1)\n}\n\n// Height returns the height of the tip of the chain view.  It will return -1 if\n// there is no tip (which only happens if the chain view has not been\n// initialized).\n//\n// This function is safe for concurrent access.\nfunc (c *chainView) Height() int32 {\n\tc.mtx.Lock()\n\theight := c.height()\n\tc.mtx.Unlock()\n\treturn height\n}\n\n// nodeByHeight returns the block node at the specified height.  Nil will be\n// returned if the height does not exist.  This only differs from the exported\n// version in that it is up to the caller to ensure the lock is held.\n//\n// This function MUST be called with the view mutex locked (for reads).\nfunc (c *chainView) nodeByHeight(height int32) *blockNode {\n\tif height < 0 || height >= int32(len(c.nodes)) {\n\t\treturn nil\n\t}\n\n\treturn c.nodes[height]\n}\n\n// NodeByHeight returns the block node at the specified height.  Nil will be\n// returned if the height does not exist.\n//\n// This function is safe for concurrent access.\nfunc (c *chainView) NodeByHeight(height int32) *blockNode {\n\tc.mtx.Lock()\n\tnode := c.nodeByHeight(height)\n\tc.mtx.Unlock()\n\treturn node\n}\n\n// Equals returns whether or not two chain views are the same.  Uninitialized\n// views (tip set to nil) are considered equal.\n//\n// This function is safe for concurrent access.\nfunc (c *chainView) Equals(other *chainView) bool {\n\tc.mtx.Lock()\n\tother.mtx.Lock()\n\tequals := len(c.nodes) == len(other.nodes) && c.tip() == other.tip()\n\tother.mtx.Unlock()\n\tc.mtx.Unlock()\n\treturn equals\n}\n\n// contains returns whether or not the chain view contains the passed block\n// node.  This only differs from the exported version in that it is up to the\n// caller to ensure the lock is held.\n//\n// This function MUST be called with the view mutex locked (for reads).\nfunc (c *chainView) contains(node *blockNode) bool {\n\treturn c.nodeByHeight(node.height) == node\n}\n\n// Contains returns whether or not the chain view contains the passed block\n// node.\n//\n// This function is safe for concurrent access.\nfunc (c *chainView) Contains(node *blockNode) bool {\n\tc.mtx.Lock()\n\tcontains := c.contains(node)\n\tc.mtx.Unlock()\n\treturn contains\n}\n\n// next returns the successor to the provided node for the chain view.  It will\n// return nil if there is no successor or the provided node is not part of the\n// view.  This only differs from the exported version in that it is up to the\n// caller to ensure the lock is held.\n//\n// See the comment on the exported function for more details.\n//\n// This function MUST be called with the view mutex locked (for reads).\nfunc (c *chainView) next(node *blockNode) *blockNode {\n\tif node == nil || !c.contains(node) {\n\t\treturn nil\n\t}\n\n\treturn c.nodeByHeight(node.height + 1)\n}\n\n// Next returns the successor to the provided node for the chain view.  It will\n// return nil if there is no successfor or the provided node is not part of the\n// view.\n//\n// For example, assume a block chain with a side chain as depicted below:\n//\n//\tgenesis -> 1 -> 2 -> 3 -> 4  -> 5 ->  6  -> 7  -> 8\n//\t                      \\-> 4a -> 5a -> 6a\n//\n// Further, assume the view is for the longer chain depicted above.  That is to\n// say it consists of:\n//\n//\tgenesis -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8\n//\n// Invoking this function with block node 5 would return block node 6 while\n// invoking it with block node 5a would return nil since that node is not part\n// of the view.\n//\n// This function is safe for concurrent access.\nfunc (c *chainView) Next(node *blockNode) *blockNode {\n\tc.mtx.Lock()\n\tnext := c.next(node)\n\tc.mtx.Unlock()\n\treturn next\n}\n\n// findFork returns the final common block between the provided node and the\n// the chain view.  It will return nil if there is no common block.  This only\n// differs from the exported version in that it is up to the caller to ensure\n// the lock is held.\n//\n// See the exported FindFork comments for more details.\n//\n// This function MUST be called with the view mutex locked (for reads).\nfunc (c *chainView) findFork(node *blockNode) *blockNode {\n\t// No fork point for node that doesn't exist.\n\tif node == nil {\n\t\treturn nil\n\t}\n\n\t// When the height of the passed node is higher than the height of the\n\t// tip of the current chain view, walk backwards through the nodes of\n\t// the other chain until the heights match (or there or no more nodes in\n\t// which case there is no common node between the two).\n\t//\n\t// NOTE: This isn't strictly necessary as the following section will\n\t// find the node as well, however, it is more efficient to avoid the\n\t// contains check since it is already known that the common node can't\n\t// possibly be past the end of the current chain view.  It also allows\n\t// this code to take advantage of any potential future optimizations to\n\t// the Ancestor function such as using an O(log n) skip list.\n\tchainHeight := c.height()\n\tif node.height > chainHeight {\n\t\tnode = node.Ancestor(chainHeight)\n\t}\n\n\t// Walk the other chain backwards as long as the current one does not\n\t// contain the node or there are no more nodes in which case there is no\n\t// common node between the two.\n\tfor node != nil && !c.contains(node) {\n\t\tnode = node.parent\n\t}\n\n\treturn node\n}\n\n// FindFork returns the final common block between the provided node and the\n// the chain view.  It will return nil if there is no common block.\n//\n// For example, assume a block chain with a side chain as depicted below:\n//\n//\tgenesis -> 1 -> 2 -> ... -> 5 -> 6  -> 7  -> 8\n//\t                             \\-> 6a -> 7a\n//\n// Further, assume the view is for the longer chain depicted above.  That is to\n// say it consists of:\n//\n//\tgenesis -> 1 -> 2 -> ... -> 5 -> 6 -> 7 -> 8.\n//\n// Invoking this function with block node 7a would return block node 5 while\n// invoking it with block node 7 would return itself since it is already part of\n// the branch formed by the view.\n//\n// This function is safe for concurrent access.\nfunc (c *chainView) FindFork(node *blockNode) *blockNode {\n\tc.mtx.Lock()\n\tfork := c.findFork(node)\n\tc.mtx.Unlock()\n\treturn fork\n}\n\n// blockLocator returns a block locator for the passed block node.  The passed\n// node can be nil in which case the block locator for the current tip\n// associated with the view will be returned.  This only differs from the\n// exported version in that it is up to the caller to ensure the lock is held.\n//\n// See the exported BlockLocator function comments for more details.\n//\n// This function MUST be called with the view mutex locked (for reads).\nfunc (c *chainView) blockLocator(node *blockNode) BlockLocator {\n\t// Use the current tip if requested.\n\tif node == nil {\n\t\tnode = c.tip()\n\t}\n\tif node == nil {\n\t\treturn nil\n\t}\n\n\t// Calculate the max number of entries that will ultimately be in the\n\t// block locator.  See the description of the algorithm for how these\n\t// numbers are derived.\n\tvar maxEntries uint8\n\tif node.height <= 12 {\n\t\tmaxEntries = uint8(node.height) + 1\n\t} else {\n\t\t// Requested hash itself + previous 10 entries + genesis block.\n\t\t// Then floor(log2(height-10)) entries for the skip portion.\n\t\tadjustedHeight := uint32(node.height) - 10\n\t\tmaxEntries = 12 + fastLog2Floor(adjustedHeight)\n\t}\n\tlocator := make(BlockLocator, 0, maxEntries)\n\n\tstep := int32(1)\n\tfor node != nil {\n\t\tlocator = append(locator, &node.hash)\n\n\t\t// Nothing more to add once the genesis block has been added.\n\t\tif node.height == 0 {\n\t\t\tbreak\n\t\t}\n\n\t\t// Calculate height of previous node to include ensuring the\n\t\t// final node is the genesis block.\n\t\theight := node.height - step\n\t\tif height < 0 {\n\t\t\theight = 0\n\t\t}\n\n\t\t// When the node is in the current chain view, all of its\n\t\t// ancestors must be too, so use a much faster O(1) lookup in\n\t\t// that case.  Otherwise, fall back to walking backwards through\n\t\t// the nodes of the other chain to the correct ancestor.\n\t\tif c.contains(node) {\n\t\t\tnode = c.nodes[height]\n\t\t} else {\n\t\t\tnode = node.Ancestor(height)\n\t\t}\n\n\t\t// Once 11 entries have been included, start doubling the\n\t\t// distance between included hashes.\n\t\tif len(locator) > 10 {\n\t\t\tstep *= 2\n\t\t}\n\t}\n\n\treturn locator\n}\n\n// BlockLocator returns a block locator for the passed block node.  The passed\n// node can be nil in which case the block locator for the current tip\n// associated with the view will be returned.\n//\n// See the BlockLocator type for details on the algorithm used to create a block\n// locator.\n//\n// This function is safe for concurrent access.\nfunc (c *chainView) BlockLocator(node *blockNode) BlockLocator {\n\tc.mtx.Lock()\n\tlocator := c.blockLocator(node)\n\tc.mtx.Unlock()\n\treturn locator\n}\n"
  },
  {
    "path": "blockchain/chainview_test.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// testNoncePrng provides a deterministic prng for the nonce in generated fake\n// nodes.  The ensures that the node have unique hashes.\nvar testNoncePrng = rand.New(rand.NewSource(0))\n\n// chainedNodes returns the specified number of nodes constructed such that each\n// subsequent node points to the previous one to create a chain.  The first node\n// will point to the passed parent which can be nil if desired.\nfunc chainedNodes(parent *blockNode, numNodes int) []*blockNode {\n\tnodes := make([]*blockNode, numNodes)\n\ttip := parent\n\tfor i := 0; i < numNodes; i++ {\n\t\t// This is invalid, but all that is needed is enough to get the\n\t\t// synthetic tests to work.\n\t\theader := wire.BlockHeader{Nonce: testNoncePrng.Uint32()}\n\t\tif tip != nil {\n\t\t\theader.PrevBlock = tip.hash\n\t\t}\n\t\tnodes[i] = newBlockNode(&header, tip)\n\t\ttip = nodes[i]\n\t}\n\treturn nodes\n}\n\n// String returns the block node as a human-readable name.\nfunc (node blockNode) String() string {\n\treturn fmt.Sprintf(\"%s(%d)\", node.hash, node.height)\n}\n\n// tstTip is a convenience function to grab the tip of a chain of block nodes\n// created via chainedNodes.\nfunc tstTip(nodes []*blockNode) *blockNode {\n\treturn nodes[len(nodes)-1]\n}\n\n// locatorHashes is a convenience function that returns the hashes for all of\n// the passed indexes of the provided nodes.  It is used to construct expected\n// block locators in the tests.\nfunc locatorHashes(nodes []*blockNode, indexes ...int) BlockLocator {\n\thashes := make(BlockLocator, 0, len(indexes))\n\tfor _, idx := range indexes {\n\t\thashes = append(hashes, &nodes[idx].hash)\n\t}\n\treturn hashes\n}\n\n// zipLocators is a convenience function that returns a single block locator\n// given a variable number of them and is used in the tests.\nfunc zipLocators(locators ...BlockLocator) BlockLocator {\n\tvar hashes BlockLocator\n\tfor _, locator := range locators {\n\t\thashes = append(hashes, locator...)\n\t}\n\treturn hashes\n}\n\n// TestChainView ensures all of the exported functionality of chain views works\n// as intended with the exception of some special cases which are handled in\n// other tests.\nfunc TestChainView(t *testing.T) {\n\t// Construct a synthetic block index consisting of the following\n\t// structure.\n\t// 0 -> 1 -> 2  -> 3  -> 4\n\t//       \\-> 2a -> 3a -> 4a  -> 5a -> 6a -> 7a -> ... -> 26a\n\t//             \\-> 3a'-> 4a' -> 5a'\n\tbranch0Nodes := chainedNodes(nil, 5)\n\tbranch1Nodes := chainedNodes(branch0Nodes[1], 25)\n\tbranch2Nodes := chainedNodes(branch1Nodes[0], 3)\n\n\ttip := tstTip\n\ttests := []struct {\n\t\tname       string\n\t\tview       *chainView   // active view\n\t\tgenesis    *blockNode   // expected genesis block of active view\n\t\ttip        *blockNode   // expected tip of active view\n\t\tside       *chainView   // side chain view\n\t\tsideTip    *blockNode   // expected tip of side chain view\n\t\tfork       *blockNode   // expected fork node\n\t\tcontains   []*blockNode // expected nodes in active view\n\t\tnoContains []*blockNode // expected nodes NOT in active view\n\t\tequal      *chainView   // view expected equal to active view\n\t\tunequal    *chainView   // view expected NOT equal to active\n\t\tlocator    BlockLocator // expected locator for active view tip\n\t}{\n\t\t{\n\t\t\t// Create a view for branch 0 as the active chain and\n\t\t\t// another view for branch 1 as the side chain.\n\t\t\tname:       \"chain0-chain1\",\n\t\t\tview:       newChainView(tip(branch0Nodes)),\n\t\t\tgenesis:    branch0Nodes[0],\n\t\t\ttip:        tip(branch0Nodes),\n\t\t\tside:       newChainView(tip(branch1Nodes)),\n\t\t\tsideTip:    tip(branch1Nodes),\n\t\t\tfork:       branch0Nodes[1],\n\t\t\tcontains:   branch0Nodes,\n\t\t\tnoContains: branch1Nodes,\n\t\t\tequal:      newChainView(tip(branch0Nodes)),\n\t\t\tunequal:    newChainView(tip(branch1Nodes)),\n\t\t\tlocator:    locatorHashes(branch0Nodes, 4, 3, 2, 1, 0),\n\t\t},\n\t\t{\n\t\t\t// Create a view for branch 1 as the active chain and\n\t\t\t// another view for branch 2 as the side chain.\n\t\t\tname:       \"chain1-chain2\",\n\t\t\tview:       newChainView(tip(branch1Nodes)),\n\t\t\tgenesis:    branch0Nodes[0],\n\t\t\ttip:        tip(branch1Nodes),\n\t\t\tside:       newChainView(tip(branch2Nodes)),\n\t\t\tsideTip:    tip(branch2Nodes),\n\t\t\tfork:       branch1Nodes[0],\n\t\t\tcontains:   branch1Nodes,\n\t\t\tnoContains: branch2Nodes,\n\t\t\tequal:      newChainView(tip(branch1Nodes)),\n\t\t\tunequal:    newChainView(tip(branch2Nodes)),\n\t\t\tlocator: zipLocators(\n\t\t\t\tlocatorHashes(branch1Nodes, 24, 23, 22, 21, 20,\n\t\t\t\t\t19, 18, 17, 16, 15, 14, 13, 11, 7),\n\t\t\t\tlocatorHashes(branch0Nodes, 1, 0)),\n\t\t},\n\t\t{\n\t\t\t// Create a view for branch 2 as the active chain and\n\t\t\t// another view for branch 0 as the side chain.\n\t\t\tname:       \"chain2-chain0\",\n\t\t\tview:       newChainView(tip(branch2Nodes)),\n\t\t\tgenesis:    branch0Nodes[0],\n\t\t\ttip:        tip(branch2Nodes),\n\t\t\tside:       newChainView(tip(branch0Nodes)),\n\t\t\tsideTip:    tip(branch0Nodes),\n\t\t\tfork:       branch0Nodes[1],\n\t\t\tcontains:   branch2Nodes,\n\t\t\tnoContains: branch0Nodes[2:],\n\t\t\tequal:      newChainView(tip(branch2Nodes)),\n\t\t\tunequal:    newChainView(tip(branch0Nodes)),\n\t\t\tlocator: zipLocators(\n\t\t\t\tlocatorHashes(branch2Nodes, 2, 1, 0),\n\t\t\t\tlocatorHashes(branch1Nodes, 0),\n\t\t\t\tlocatorHashes(branch0Nodes, 1, 0)),\n\t\t},\n\t}\ntestLoop:\n\tfor _, test := range tests {\n\t\t// Ensure the active and side chain heights are the expected\n\t\t// values.\n\t\tif test.view.Height() != test.tip.height {\n\t\t\tt.Errorf(\"%s: unexpected active view height -- got \"+\n\t\t\t\t\"%d, want %d\", test.name, test.view.Height(),\n\t\t\t\ttest.tip.height)\n\t\t\tcontinue\n\t\t}\n\t\tif test.side.Height() != test.sideTip.height {\n\t\t\tt.Errorf(\"%s: unexpected side view height -- got %d, \"+\n\t\t\t\t\"want %d\", test.name, test.side.Height(),\n\t\t\t\ttest.sideTip.height)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the active and side chain genesis block is the\n\t\t// expected value.\n\t\tif test.view.Genesis() != test.genesis {\n\t\t\tt.Errorf(\"%s: unexpected active view genesis -- got \"+\n\t\t\t\t\"%v, want %v\", test.name, test.view.Genesis(),\n\t\t\t\ttest.genesis)\n\t\t\tcontinue\n\t\t}\n\t\tif test.side.Genesis() != test.genesis {\n\t\t\tt.Errorf(\"%s: unexpected side view genesis -- got %v, \"+\n\t\t\t\t\"want %v\", test.name, test.view.Genesis(),\n\t\t\t\ttest.genesis)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the active and side chain tips are the expected nodes.\n\t\tif test.view.Tip() != test.tip {\n\t\t\tt.Errorf(\"%s: unexpected active view tip -- got %v, \"+\n\t\t\t\t\"want %v\", test.name, test.view.Tip(), test.tip)\n\t\t\tcontinue\n\t\t}\n\t\tif test.side.Tip() != test.sideTip {\n\t\t\tt.Errorf(\"%s: unexpected active view tip -- got %v, \"+\n\t\t\t\t\"want %v\", test.name, test.side.Tip(),\n\t\t\t\ttest.sideTip)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure that regardless of the order the two chains are\n\t\t// compared they both return the expected fork point.\n\t\tforkNode := test.view.FindFork(test.side.Tip())\n\t\tif forkNode != test.fork {\n\t\t\tt.Errorf(\"%s: unexpected fork node (view, side) -- \"+\n\t\t\t\t\"got %v, want %v\", test.name, forkNode,\n\t\t\t\ttest.fork)\n\t\t\tcontinue\n\t\t}\n\t\tforkNode = test.side.FindFork(test.view.Tip())\n\t\tif forkNode != test.fork {\n\t\t\tt.Errorf(\"%s: unexpected fork node (side, view) -- \"+\n\t\t\t\t\"got %v, want %v\", test.name, forkNode,\n\t\t\t\ttest.fork)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure that the fork point for a node that is already part\n\t\t// of the chain view is the node itself.\n\t\tforkNode = test.view.FindFork(test.view.Tip())\n\t\tif forkNode != test.view.Tip() {\n\t\t\tt.Errorf(\"%s: unexpected fork node (view, tip) -- \"+\n\t\t\t\t\"got %v, want %v\", test.name, forkNode,\n\t\t\t\ttest.view.Tip())\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure all expected nodes are contained in the active view.\n\t\tfor _, node := range test.contains {\n\t\t\tif !test.view.Contains(node) {\n\t\t\t\tt.Errorf(\"%s: expected %v in active view\",\n\t\t\t\t\ttest.name, node)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\t\t}\n\n\t\t// Ensure all nodes from side chain view are NOT contained in\n\t\t// the active view.\n\t\tfor _, node := range test.noContains {\n\t\t\tif test.view.Contains(node) {\n\t\t\t\tt.Errorf(\"%s: unexpected %v in active view\",\n\t\t\t\t\ttest.name, node)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\t\t}\n\n\t\t// Ensure equality of different views into the same chain works\n\t\t// as intended.\n\t\tif !test.view.Equals(test.equal) {\n\t\t\tt.Errorf(\"%s: unexpected unequal views\", test.name)\n\t\t\tcontinue\n\t\t}\n\t\tif test.view.Equals(test.unequal) {\n\t\t\tt.Errorf(\"%s: unexpected equal views\", test.name)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure all nodes contained in the view return the expected\n\t\t// next node.\n\t\tfor i, node := range test.contains {\n\t\t\t// Final node expects nil for the next node.\n\t\t\tvar expected *blockNode\n\t\t\tif i < len(test.contains)-1 {\n\t\t\t\texpected = test.contains[i+1]\n\t\t\t}\n\t\t\tif next := test.view.Next(node); next != expected {\n\t\t\t\tt.Errorf(\"%s: unexpected next node -- got %v, \"+\n\t\t\t\t\t\"want %v\", test.name, next, expected)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\t\t}\n\n\t\t// Ensure nodes that are not contained in the view do not\n\t\t// produce a successor node.\n\t\tfor _, node := range test.noContains {\n\t\t\tif next := test.view.Next(node); next != nil {\n\t\t\t\tt.Errorf(\"%s: unexpected next node -- got %v, \"+\n\t\t\t\t\t\"want nil\", test.name, next)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\t\t}\n\n\t\t// Ensure all nodes contained in the view can be retrieved by\n\t\t// height.\n\t\tfor _, wantNode := range test.contains {\n\t\t\tnode := test.view.NodeByHeight(wantNode.height)\n\t\t\tif node != wantNode {\n\t\t\t\tt.Errorf(\"%s: unexpected node for height %d -- \"+\n\t\t\t\t\t\"got %v, want %v\", test.name,\n\t\t\t\t\twantNode.height, node, wantNode)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the block locator for the tip of the active view\n\t\t// consists of the expected hashes.\n\t\tlocator := test.view.BlockLocator(test.view.tip())\n\t\tif !reflect.DeepEqual(locator, test.locator) {\n\t\t\tt.Errorf(\"%s: unexpected locator -- got %v, want %v\",\n\t\t\t\ttest.name, locator, test.locator)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestChainViewForkCorners ensures that finding the fork between two chains\n// works in some corner cases such as when the two chains have completely\n// unrelated histories.\nfunc TestChainViewForkCorners(t *testing.T) {\n\t// Construct two unrelated single branch synthetic block indexes.\n\tbranchNodes := chainedNodes(nil, 5)\n\tunrelatedBranchNodes := chainedNodes(nil, 7)\n\n\t// Create chain views for the two unrelated histories.\n\tview1 := newChainView(tstTip(branchNodes))\n\tview2 := newChainView(tstTip(unrelatedBranchNodes))\n\n\t// Ensure attempting to find a fork point with a node that doesn't exist\n\t// doesn't produce a node.\n\tif fork := view1.FindFork(nil); fork != nil {\n\t\tt.Fatalf(\"FindFork: unexpected fork -- got %v, want nil\", fork)\n\t}\n\n\t// Ensure attempting to find a fork point in two chain views with\n\t// totally unrelated histories doesn't produce a node.\n\tfor _, node := range branchNodes {\n\t\tif fork := view2.FindFork(node); fork != nil {\n\t\t\tt.Fatalf(\"FindFork: unexpected fork -- got %v, want nil\",\n\t\t\t\tfork)\n\t\t}\n\t}\n\tfor _, node := range unrelatedBranchNodes {\n\t\tif fork := view1.FindFork(node); fork != nil {\n\t\t\tt.Fatalf(\"FindFork: unexpected fork -- got %v, want nil\",\n\t\t\t\tfork)\n\t\t}\n\t}\n}\n\n// TestChainViewSetTip ensures changing the tip works as intended including\n// capacity changes.\nfunc TestChainViewSetTip(t *testing.T) {\n\t// Construct a synthetic block index consisting of the following\n\t// structure.\n\t// 0 -> 1 -> 2  -> 3  -> 4\n\t//       \\-> 2a -> 3a -> 4a  -> 5a -> 6a -> 7a -> ... -> 26a\n\tbranch0Nodes := chainedNodes(nil, 5)\n\tbranch1Nodes := chainedNodes(branch0Nodes[1], 25)\n\n\ttip := tstTip\n\ttests := []struct {\n\t\tname     string\n\t\tview     *chainView     // active view\n\t\ttips     []*blockNode   // tips to set\n\t\tcontains [][]*blockNode // expected nodes in view for each tip\n\t}{\n\t\t{\n\t\t\t// Create an empty view and set the tip to increasingly\n\t\t\t// longer chains.\n\t\t\tname:     \"increasing\",\n\t\t\tview:     newChainView(nil),\n\t\t\ttips:     []*blockNode{tip(branch0Nodes), tip(branch1Nodes)},\n\t\t\tcontains: [][]*blockNode{branch0Nodes, branch1Nodes},\n\t\t},\n\t\t{\n\t\t\t// Create a view with a longer chain and set the tip to\n\t\t\t// increasingly shorter chains.\n\t\t\tname:     \"decreasing\",\n\t\t\tview:     newChainView(tip(branch1Nodes)),\n\t\t\ttips:     []*blockNode{tip(branch0Nodes), nil},\n\t\t\tcontains: [][]*blockNode{branch0Nodes, nil},\n\t\t},\n\t\t{\n\t\t\t// Create a view with a shorter chain and set the tip to\n\t\t\t// a longer chain followed by setting it back to the\n\t\t\t// shorter chain.\n\t\t\tname:     \"small-large-small\",\n\t\t\tview:     newChainView(tip(branch0Nodes)),\n\t\t\ttips:     []*blockNode{tip(branch1Nodes), tip(branch0Nodes)},\n\t\t\tcontains: [][]*blockNode{branch1Nodes, branch0Nodes},\n\t\t},\n\t\t{\n\t\t\t// Create a view with a longer chain and set the tip to\n\t\t\t// a smaller chain followed by setting it back to the\n\t\t\t// longer chain.\n\t\t\tname:     \"large-small-large\",\n\t\t\tview:     newChainView(tip(branch1Nodes)),\n\t\t\ttips:     []*blockNode{tip(branch0Nodes), tip(branch1Nodes)},\n\t\t\tcontains: [][]*blockNode{branch0Nodes, branch1Nodes},\n\t\t},\n\t}\n\ntestLoop:\n\tfor _, test := range tests {\n\t\tfor i, tip := range test.tips {\n\t\t\t// Ensure the view tip is the expected node.\n\t\t\ttest.view.SetTip(tip)\n\t\t\tif test.view.Tip() != tip {\n\t\t\t\tt.Errorf(\"%s: unexpected view tip -- got %v, \"+\n\t\t\t\t\t\"want %v\", test.name, test.view.Tip(),\n\t\t\t\t\ttip)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\n\t\t\t// Ensure all expected nodes are contained in the view.\n\t\t\tfor _, node := range test.contains[i] {\n\t\t\t\tif !test.view.Contains(node) {\n\t\t\t\t\tt.Errorf(\"%s: expected %v in active view\",\n\t\t\t\t\t\ttest.name, node)\n\t\t\t\t\tcontinue testLoop\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n}\n\n// TestChainViewNil ensures that creating and accessing a nil chain view behaves\n// as expected.\nfunc TestChainViewNil(t *testing.T) {\n\t// Ensure two unininitialized views are considered equal.\n\tview := newChainView(nil)\n\tif !view.Equals(newChainView(nil)) {\n\t\tt.Fatal(\"uninitialized nil views unequal\")\n\t}\n\n\t// Ensure the genesis of an uninitialized view does not produce a node.\n\tif genesis := view.Genesis(); genesis != nil {\n\t\tt.Fatalf(\"Genesis: unexpected genesis -- got %v, want nil\",\n\t\t\tgenesis)\n\t}\n\n\t// Ensure the tip of an uninitialized view does not produce a node.\n\tif tip := view.Tip(); tip != nil {\n\t\tt.Fatalf(\"Tip: unexpected tip -- got %v, want nil\", tip)\n\t}\n\n\t// Ensure the height of an uninitialized view is the expected value.\n\tif height := view.Height(); height != -1 {\n\t\tt.Fatalf(\"Height: unexpected height -- got %d, want -1\", height)\n\t}\n\n\t// Ensure attempting to get a node for a height that does not exist does\n\t// not produce a node.\n\tif node := view.NodeByHeight(10); node != nil {\n\t\tt.Fatalf(\"NodeByHeight: unexpected node -- got %v, want nil\", node)\n\t}\n\n\t// Ensure an uninitialized view does not report it contains nodes.\n\tfakeNode := chainedNodes(nil, 1)[0]\n\tif view.Contains(fakeNode) {\n\t\tt.Fatalf(\"Contains: view claims it contains node %v\", fakeNode)\n\t}\n\n\t// Ensure the next node for a node that does not exist does not produce\n\t// a node.\n\tif next := view.Next(nil); next != nil {\n\t\tt.Fatalf(\"Next: unexpected next node -- got %v, want nil\", next)\n\t}\n\n\t// Ensure the next node for a node that exists does not produce a node.\n\tif next := view.Next(fakeNode); next != nil {\n\t\tt.Fatalf(\"Next: unexpected next node -- got %v, want nil\", next)\n\t}\n\n\t// Ensure attempting to find a fork point with a node that doesn't exist\n\t// doesn't produce a node.\n\tif fork := view.FindFork(nil); fork != nil {\n\t\tt.Fatalf(\"FindFork: unexpected fork -- got %v, want nil\", fork)\n\t}\n\n\t// Ensure attempting to get a block locator for the tip doesn't produce\n\t// one since the tip is nil.\n\tif locator := view.BlockLocator(nil); locator != nil {\n\t\tt.Fatalf(\"BlockLocator: unexpected locator -- got %v, want nil\",\n\t\t\tlocator)\n\t}\n\n\t// Ensure attempting to get a block locator for a node that exists still\n\t// works as intended.\n\tbranchNodes := chainedNodes(nil, 50)\n\twantLocator := locatorHashes(branchNodes, 49, 48, 47, 46, 45, 44, 43,\n\t\t42, 41, 40, 39, 38, 36, 32, 24, 8, 0)\n\tlocator := view.BlockLocator(tstTip(branchNodes))\n\tif !reflect.DeepEqual(locator, wantLocator) {\n\t\tt.Fatalf(\"BlockLocator: unexpected locator -- got %v, want %v\",\n\t\t\tlocator, wantLocator)\n\t}\n}\n"
  },
  {
    "path": "blockchain/checkpoints.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n)\n\n// CheckpointConfirmations is the number of blocks before the end of the current\n// best block chain that a good checkpoint candidate must be.\nconst CheckpointConfirmations = 2016\n\n// newHashFromStr converts the passed big-endian hex string into a\n// chainhash.Hash.  It only differs from the one available in chainhash in that\n// it ignores the error since it will only (and must only) be called with\n// hard-coded, and therefore known good, hashes.\nfunc newHashFromStr(hexStr string) *chainhash.Hash {\n\thash, _ := chainhash.NewHashFromStr(hexStr)\n\treturn hash\n}\n\n// Checkpoints returns a slice of checkpoints (regardless of whether they are\n// already known).  When there are no checkpoints for the chain, it will return\n// nil.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) Checkpoints() []chaincfg.Checkpoint {\n\treturn b.checkpoints\n}\n\n// HasCheckpoints returns whether this BlockChain has checkpoints defined.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) HasCheckpoints() bool {\n\treturn len(b.checkpoints) > 0\n}\n\n// LatestCheckpoint returns the most recent checkpoint (regardless of whether it\n// is already known). When there are no defined checkpoints for the active chain\n// instance, it will return nil.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) LatestCheckpoint() *chaincfg.Checkpoint {\n\tif !b.HasCheckpoints() {\n\t\treturn nil\n\t}\n\treturn &b.checkpoints[len(b.checkpoints)-1]\n}\n\n// verifyCheckpoint returns whether the passed block height and hash combination\n// match the checkpoint data.  It also returns true if there is no checkpoint\n// data for the passed block height.\nfunc (b *BlockChain) verifyCheckpoint(height int32, hash *chainhash.Hash) bool {\n\tif !b.HasCheckpoints() {\n\t\treturn true\n\t}\n\n\t// Nothing to check if there is no checkpoint data for the block height.\n\tcheckpoint, exists := b.checkpointsByHeight[height]\n\tif !exists {\n\t\treturn true\n\t}\n\n\tif !checkpoint.Hash.IsEqual(hash) {\n\t\treturn false\n\t}\n\n\tlog.Infof(\"Verified checkpoint at height %d/block %s\", checkpoint.Height,\n\t\tcheckpoint.Hash)\n\treturn true\n}\n\n// findPreviousCheckpoint finds the most recent checkpoint that is already\n// available in the downloaded portion of the block chain and returns the\n// associated block node.  It returns nil if a checkpoint can't be found (this\n// should really only happen for blocks before the first checkpoint).\n//\n// This function MUST be called with the chain lock held (for reads).\nfunc (b *BlockChain) findPreviousCheckpoint() (*blockNode, error) {\n\tif !b.HasCheckpoints() {\n\t\treturn nil, nil\n\t}\n\n\t// Perform the initial search to find and cache the latest known\n\t// checkpoint if the best chain is not known yet or we haven't already\n\t// previously searched.\n\tcheckpoints := b.checkpoints\n\tnumCheckpoints := len(checkpoints)\n\tif b.checkpointNode == nil && b.nextCheckpoint == nil {\n\t\t// Loop backwards through the available checkpoints to find one\n\t\t// that is already available.\n\t\tfor i := numCheckpoints - 1; i >= 0; i-- {\n\t\t\tnode := b.index.LookupNode(checkpoints[i].Hash)\n\t\t\tif node == nil || !b.bestChain.Contains(node) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Checkpoint found.  Cache it for future lookups and\n\t\t\t// set the next expected checkpoint accordingly.\n\t\t\tb.checkpointNode = node\n\t\t\tif i < numCheckpoints-1 {\n\t\t\t\tb.nextCheckpoint = &checkpoints[i+1]\n\t\t\t}\n\t\t\treturn b.checkpointNode, nil\n\t\t}\n\n\t\t// No known latest checkpoint.  This will only happen on blocks\n\t\t// before the first known checkpoint.  So, set the next expected\n\t\t// checkpoint to the first checkpoint and return the fact there\n\t\t// is no latest known checkpoint block.\n\t\tb.nextCheckpoint = &checkpoints[0]\n\t\treturn nil, nil\n\t}\n\n\t// At this point we've already searched for the latest known checkpoint,\n\t// so when there is no next checkpoint, the current checkpoint lockin\n\t// will always be the latest known checkpoint.\n\tif b.nextCheckpoint == nil {\n\t\treturn b.checkpointNode, nil\n\t}\n\n\t// When there is a next checkpoint and the height of the current best\n\t// chain does not exceed it, the current checkpoint lockin is still\n\t// the latest known checkpoint.\n\tif b.bestChain.Tip().height < b.nextCheckpoint.Height {\n\t\treturn b.checkpointNode, nil\n\t}\n\n\t// We've reached or exceeded the next checkpoint height.  Note that\n\t// once a checkpoint lockin has been reached, forks are prevented from\n\t// any blocks before the checkpoint, so we don't have to worry about the\n\t// checkpoint going away out from under us due to a chain reorganize.\n\n\t// Cache the latest known checkpoint for future lookups.  Note that if\n\t// this lookup fails something is very wrong since the chain has already\n\t// passed the checkpoint which was verified as accurate before inserting\n\t// it.\n\tcheckpointNode := b.index.LookupNode(b.nextCheckpoint.Hash)\n\tif checkpointNode == nil {\n\t\treturn nil, AssertError(fmt.Sprintf(\"findPreviousCheckpoint \"+\n\t\t\t\"failed lookup of known good block node %s\",\n\t\t\tb.nextCheckpoint.Hash))\n\t}\n\tb.checkpointNode = checkpointNode\n\n\t// Set the next expected checkpoint.\n\tcheckpointIndex := -1\n\tfor i := numCheckpoints - 1; i >= 0; i-- {\n\t\tif checkpoints[i].Hash.IsEqual(b.nextCheckpoint.Hash) {\n\t\t\tcheckpointIndex = i\n\t\t\tbreak\n\t\t}\n\t}\n\tb.nextCheckpoint = nil\n\tif checkpointIndex != -1 && checkpointIndex < numCheckpoints-1 {\n\t\tb.nextCheckpoint = &checkpoints[checkpointIndex+1]\n\t}\n\n\treturn b.checkpointNode, nil\n}\n\n// isNonstandardTransaction determines whether a transaction contains any\n// scripts which are not one of the standard types.\nfunc isNonstandardTransaction(tx *btcutil.Tx) bool {\n\t// Check all of the output public key scripts for non-standard scripts.\n\tfor _, txOut := range tx.MsgTx().TxOut {\n\t\tscriptClass := txscript.GetScriptClass(txOut.PkScript)\n\t\tif scriptClass == txscript.NonStandardTy {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// IsCheckpointCandidate returns whether or not the passed block is a good\n// checkpoint candidate.\n//\n// The factors used to determine a good checkpoint are:\n//   - The block must be in the main chain\n//   - The block must be at least 'CheckpointConfirmations' blocks prior to the\n//     current end of the main chain\n//   - The timestamps for the blocks before and after the checkpoint must have\n//     timestamps which are also before and after the checkpoint, respectively\n//     (due to the median time allowance this is not always the case)\n//   - The block must not contain any strange transaction such as those with\n//     nonstandard scripts\n//\n// The intent is that candidates are reviewed by a developer to make the final\n// decision and then manually added to the list of checkpoints for a network.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) IsCheckpointCandidate(block *btcutil.Block) (bool, error) {\n\tb.chainLock.RLock()\n\tdefer b.chainLock.RUnlock()\n\n\t// A checkpoint must be in the main chain.\n\tnode := b.index.LookupNode(block.Hash())\n\tif node == nil || !b.bestChain.Contains(node) {\n\t\treturn false, nil\n\t}\n\n\t// Ensure the height of the passed block and the entry for the block in\n\t// the main chain match.  This should always be the case unless the\n\t// caller provided an invalid block.\n\tif node.height != block.Height() {\n\t\treturn false, fmt.Errorf(\"passed block height of %d does not \"+\n\t\t\t\"match the main chain height of %d\", block.Height(),\n\t\t\tnode.height)\n\t}\n\n\t// A checkpoint must be at least CheckpointConfirmations blocks\n\t// before the end of the main chain.\n\tmainChainHeight := b.bestChain.Tip().height\n\tif node.height > (mainChainHeight - CheckpointConfirmations) {\n\t\treturn false, nil\n\t}\n\n\t// A checkpoint must be have at least one block after it.\n\t//\n\t// This should always succeed since the check above already made sure it\n\t// is CheckpointConfirmations back, but be safe in case the constant\n\t// changes.\n\tnextNode := b.bestChain.Next(node)\n\tif nextNode == nil {\n\t\treturn false, nil\n\t}\n\n\t// A checkpoint must be have at least one block before it.\n\tif node.parent == nil {\n\t\treturn false, nil\n\t}\n\n\t// A checkpoint must have timestamps for the block and the blocks on\n\t// either side of it in order (due to the median time allowance this is\n\t// not always the case).\n\tprevTime := time.Unix(node.parent.timestamp, 0)\n\tcurTime := block.MsgBlock().Header.Timestamp\n\tnextTime := time.Unix(nextNode.timestamp, 0)\n\tif prevTime.After(curTime) || nextTime.Before(curTime) {\n\t\treturn false, nil\n\t}\n\n\t// A checkpoint must have transactions that only contain standard\n\t// scripts.\n\tfor _, tx := range block.Transactions() {\n\t\tif isNonstandardTransaction(tx) {\n\t\t\treturn false, nil\n\t\t}\n\t}\n\n\t// All of the checks passed, so the block is a candidate.\n\treturn true, nil\n}\n"
  },
  {
    "path": "blockchain/common_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"compress/bzip2\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain/internal/testhelper\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t_ \"github.com/btcsuite/btcd/database/ffldb\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// testDbType is the database backend type to use for the tests.\n\ttestDbType = \"ffldb\"\n\n\t// testDbRoot is the root directory used to create all test databases.\n\ttestDbRoot = \"testdbs\"\n\n\t// blockDataNet is the expected network in the test block data.\n\tblockDataNet = wire.MainNet\n)\n\n// filesExists returns whether or not the named file or directory exists.\nfunc fileExists(name string) bool {\n\tif _, err := os.Stat(name); err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// isSupportedDbType returns whether or not the passed database type is\n// currently supported.\nfunc isSupportedDbType(dbType string) bool {\n\tsupportedDrivers := database.SupportedDrivers()\n\tfor _, driver := range supportedDrivers {\n\t\tif dbType == driver {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// loadBlocks reads files containing bitcoin block data (gzipped but otherwise\n// in the format bitcoind writes) from disk and returns them as an array of\n// btcutil.Block.  This is largely borrowed from the test code in btcdb.\nfunc loadBlocks(filename string) (blocks []*btcutil.Block, err error) {\n\tfilename = filepath.Join(\"testdata/\", filename)\n\n\tvar network = wire.MainNet\n\tvar dr io.Reader\n\tvar fi io.ReadCloser\n\n\tfi, err = os.Open(filename)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif strings.HasSuffix(filename, \".bz2\") {\n\t\tdr = bzip2.NewReader(fi)\n\t} else {\n\t\tdr = fi\n\t}\n\tdefer fi.Close()\n\n\tvar block *btcutil.Block\n\n\terr = nil\n\tfor height := int64(1); err == nil; height++ {\n\t\tvar rintbuf uint32\n\t\terr = binary.Read(dr, binary.LittleEndian, &rintbuf)\n\t\tif err == io.EOF {\n\t\t\t// hit end of file at expected offset: no warning\n\t\t\theight--\n\t\t\terr = nil\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\tbreak\n\t\t}\n\t\tif rintbuf != uint32(network) {\n\t\t\tbreak\n\t\t}\n\t\terr = binary.Read(dr, binary.LittleEndian, &rintbuf)\n\t\tblocklen := rintbuf\n\n\t\trbytes := make([]byte, blocklen)\n\n\t\t// read block\n\t\tdr.Read(rbytes)\n\n\t\tblock, err = btcutil.NewBlockFromBytes(rbytes)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tblocks = append(blocks, block)\n\t}\n\n\treturn\n}\n\n// chainSetup is used to create a new db and chain instance with the genesis\n// block already inserted.  In addition to the new chain instance, it returns\n// a teardown function the caller should invoke when done testing to clean up.\nfunc chainSetup(dbName string, params *chaincfg.Params) (*BlockChain, func(), error) {\n\tif !isSupportedDbType(testDbType) {\n\t\treturn nil, nil, fmt.Errorf(\"unsupported db type %v\", testDbType)\n\t}\n\n\t// Handle memory database specially since it doesn't need the disk\n\t// specific handling.\n\tvar db database.DB\n\tvar teardown func()\n\tif testDbType == \"memdb\" {\n\t\tndb, err := database.Create(testDbType)\n\t\tif err != nil {\n\t\t\treturn nil, nil, fmt.Errorf(\"error creating db: %v\", err)\n\t\t}\n\t\tdb = ndb\n\n\t\t// Setup a teardown function for cleaning up.  This function is\n\t\t// returned to the caller to be invoked when it is done testing.\n\t\tteardown = func() {\n\t\t\tdb.Close()\n\t\t}\n\t} else {\n\t\t// Create the root directory for test databases.\n\t\tif !fileExists(testDbRoot) {\n\t\t\tif err := os.MkdirAll(testDbRoot, 0700); err != nil {\n\t\t\t\terr := fmt.Errorf(\"unable to create test db \"+\n\t\t\t\t\t\"root: %v\", err)\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t}\n\n\t\t// Create a new database to store the accepted blocks into.\n\t\tdbPath := filepath.Join(testDbRoot, dbName)\n\t\t_ = os.RemoveAll(dbPath)\n\t\tndb, err := database.Create(testDbType, dbPath, blockDataNet)\n\t\tif err != nil {\n\t\t\treturn nil, nil, fmt.Errorf(\"error creating db: %v\", err)\n\t\t}\n\t\tdb = ndb\n\n\t\t// Setup a teardown function for cleaning up.  This function is\n\t\t// returned to the caller to be invoked when it is done testing.\n\t\tteardown = func() {\n\t\t\tdb.Close()\n\t\t\tos.RemoveAll(dbPath)\n\t\t\tos.RemoveAll(testDbRoot)\n\t\t}\n\t}\n\n\t// Copy the chain params to ensure any modifications the tests do to\n\t// the chain parameters do not affect the global instance.\n\tparamsCopy := *params\n\n\t// Create the main chain instance.\n\tchain, err := New(&Config{\n\t\tDB:          db,\n\t\tChainParams: &paramsCopy,\n\t\tCheckpoints: nil,\n\t\tTimeSource:  NewMedianTime(),\n\t\tSigCache:    txscript.NewSigCache(1000),\n\t})\n\tif err != nil {\n\t\tteardown()\n\t\terr := fmt.Errorf(\"failed to create chain instance: %v\", err)\n\t\treturn nil, nil, err\n\t}\n\treturn chain, teardown, nil\n}\n\n// loadUtxoView returns a utxo view loaded from a file.\nfunc loadUtxoView(filename string) (*UtxoViewpoint, error) {\n\t// The utxostore file format is:\n\t// <tx hash><output index><serialized utxo len><serialized utxo>\n\t//\n\t// The output index and serialized utxo len are little endian uint32s\n\t// and the serialized utxo uses the format described in chainio.go.\n\n\tfilename = filepath.Join(\"testdata\", filename)\n\tfi, err := os.Open(filename)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Choose read based on whether the file is compressed or not.\n\tvar r io.Reader\n\tif strings.HasSuffix(filename, \".bz2\") {\n\t\tr = bzip2.NewReader(fi)\n\t} else {\n\t\tr = fi\n\t}\n\tdefer fi.Close()\n\n\tview := NewUtxoViewpoint()\n\tfor {\n\t\t// Hash of the utxo entry.\n\t\tvar hash chainhash.Hash\n\t\t_, err := io.ReadAtLeast(r, hash[:], len(hash[:]))\n\t\tif err != nil {\n\t\t\t// Expected EOF at the right offset.\n\t\t\tif err == io.EOF {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Output index of the utxo entry.\n\t\tvar index uint32\n\t\terr = binary.Read(r, binary.LittleEndian, &index)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Num of serialized utxo entry bytes.\n\t\tvar numBytes uint32\n\t\terr = binary.Read(r, binary.LittleEndian, &numBytes)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Serialized utxo entry.\n\t\tserialized := make([]byte, numBytes)\n\t\t_, err = io.ReadAtLeast(r, serialized, int(numBytes))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Deserialize it and add it to the view.\n\t\tentry, err := deserializeUtxoEntry(serialized)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tview.Entries()[wire.OutPoint{Hash: hash, Index: index}] = entry\n\t}\n\n\treturn view, nil\n}\n\n// convertUtxoStore reads a utxostore from the legacy format and writes it back\n// out using the latest format.  It is only useful for converting utxostore data\n// used in the tests, which has already been done.  However, the code is left\n// available for future reference.\nfunc convertUtxoStore(r io.Reader, w io.Writer) error {\n\t// The old utxostore file format was:\n\t// <tx hash><serialized utxo len><serialized utxo>\n\t//\n\t// The serialized utxo len was a little endian uint32 and the serialized\n\t// utxo uses the format described in upgrade.go.\n\n\tlittleEndian := binary.LittleEndian\n\tfor {\n\t\t// Hash of the utxo entry.\n\t\tvar hash chainhash.Hash\n\t\t_, err := io.ReadAtLeast(r, hash[:], len(hash[:]))\n\t\tif err != nil {\n\t\t\t// Expected EOF at the right offset.\n\t\t\tif err == io.EOF {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\n\t\t// Num of serialized utxo entry bytes.\n\t\tvar numBytes uint32\n\t\terr = binary.Read(r, littleEndian, &numBytes)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Serialized utxo entry.\n\t\tserialized := make([]byte, numBytes)\n\t\t_, err = io.ReadAtLeast(r, serialized, int(numBytes))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Deserialize the entry.\n\t\tentries, err := deserializeUtxoEntryV0(serialized)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Loop through all of the utxos and write them out in the new\n\t\t// format.\n\t\tfor outputIdx, entry := range entries {\n\t\t\t// Reserialize the entries using the new format.\n\t\t\tserialized, err := serializeUtxoEntry(entry)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Write the hash of the utxo entry.\n\t\t\t_, err = w.Write(hash[:])\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Write the output index of the utxo entry.\n\t\t\terr = binary.Write(w, littleEndian, outputIdx)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Write num of serialized utxo entry bytes.\n\t\t\terr = binary.Write(w, littleEndian, uint32(len(serialized)))\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Write the serialized utxo.\n\t\t\t_, err = w.Write(serialized)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// TstSetCoinbaseMaturity makes the ability to set the coinbase maturity\n// available when running tests.\nfunc (b *BlockChain) TstSetCoinbaseMaturity(maturity uint16) {\n\tb.chainParams.CoinbaseMaturity = maturity\n}\n\n// newFakeChain returns a chain that is usable for synthetic tests.  It is\n// important to note that this chain has no database associated with it, so\n// it is not usable with all functions and the tests must take care when making\n// use of it.\nfunc newFakeChain(params *chaincfg.Params) *BlockChain {\n\t// Create a genesis block node and block index index populated with it\n\t// for use when creating the fake chain below.\n\tnode := newBlockNode(&params.GenesisBlock.Header, nil)\n\tindex := newBlockIndex(nil, params)\n\tindex.AddNode(node)\n\n\ttargetTimespan := int64(params.TargetTimespan / time.Second)\n\ttargetTimePerBlock := int64(params.TargetTimePerBlock / time.Second)\n\tadjustmentFactor := params.RetargetAdjustmentFactor\n\tb := &BlockChain{\n\t\tchainParams:         params,\n\t\ttimeSource:          NewMedianTime(),\n\t\tminRetargetTimespan: targetTimespan / adjustmentFactor,\n\t\tmaxRetargetTimespan: targetTimespan * adjustmentFactor,\n\t\tblocksPerRetarget:   int32(targetTimespan / targetTimePerBlock),\n\t\tindex:               index,\n\t\tbestChain:           newChainView(node),\n\t\twarningCaches:       newThresholdCaches(vbNumBits),\n\t\tdeploymentCaches:    newThresholdCaches(chaincfg.DefinedDeployments),\n\t}\n\n\tfor _, deployment := range params.Deployments {\n\t\tdeploymentStarter := deployment.DeploymentStarter\n\t\tif clockStarter, ok := deploymentStarter.(chaincfg.ClockConsensusDeploymentStarter); ok {\n\t\t\tclockStarter.SynchronizeClock(b)\n\t\t}\n\n\t\tdeploymentEnder := deployment.DeploymentEnder\n\t\tif clockEnder, ok := deploymentEnder.(chaincfg.ClockConsensusDeploymentEnder); ok {\n\t\t\tclockEnder.SynchronizeClock(b)\n\t\t}\n\t}\n\n\treturn b\n}\n\n// newFakeNode creates a block node connected to the passed parent with the\n// provided fields populated and fake values for the other fields.\nfunc newFakeNode(parent *blockNode, blockVersion int32, bits uint32, timestamp time.Time) *blockNode {\n\t// Make up a header and create a block node from it.\n\theader := &wire.BlockHeader{\n\t\tVersion:   blockVersion,\n\t\tPrevBlock: parent.hash,\n\t\tBits:      bits,\n\t\tTimestamp: timestamp,\n\t}\n\treturn newBlockNode(header, parent)\n}\n\n// addBlock adds a block to the blockchain that succeeds the previous block.\n// The blocks spends all the provided spendable outputs.  The new block and\n// the new spendable outputs created in the block are returned.\nfunc addBlock(chain *BlockChain, prev *btcutil.Block, spends []*testhelper.SpendableOut) (\n\t*btcutil.Block, []*testhelper.SpendableOut, error) {\n\n\tblock, outs, err := newBlock(chain, prev, spends)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t_, _, err = chain.ProcessBlock(block, BFNone)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn block, outs, nil\n}\n\n// calcMerkleRoot creates a merkle tree from the slice of transactions and\n// returns the root of the tree.\nfunc calcMerkleRoot(txns []*wire.MsgTx) chainhash.Hash {\n\tif len(txns) == 0 {\n\t\treturn chainhash.Hash{}\n\t}\n\n\tutilTxns := make([]*btcutil.Tx, 0, len(txns))\n\tfor _, tx := range txns {\n\t\tutilTxns = append(utilTxns, btcutil.NewTx(tx))\n\t}\n\treturn CalcMerkleRoot(utilTxns, false)\n}\n\n// newBlock creates a block to the blockchain that succeeds the previous block.\n// The blocks spends all the provided spendable outputs.  The new block and the\n// newly spendable outputs created in the block are returned.\nfunc newBlock(chain *BlockChain, prev *btcutil.Block,\n\tspends []*testhelper.SpendableOut) (*btcutil.Block, []*testhelper.SpendableOut, error) {\n\n\tblockHeight := prev.Height() + 1\n\ttxns := make([]*wire.MsgTx, 0, 1+len(spends))\n\n\t// Create and add coinbase tx.\n\tcb := testhelper.CreateCoinbaseTx(blockHeight, CalcBlockSubsidy(blockHeight, chain.chainParams))\n\ttxns = append(txns, cb)\n\n\t// Spend all txs to be spent.\n\tfor _, spend := range spends {\n\t\tcb.TxOut[0].Value += int64(testhelper.LowFee)\n\n\t\tspendTx := testhelper.CreateSpendTx(spend, testhelper.LowFee)\n\t\ttxns = append(txns, spendTx)\n\t}\n\n\t// Use a timestamp that is one second after the previous block unless\n\t// this is the first block in which case the current time is used.\n\tvar ts time.Time\n\tif blockHeight == 1 {\n\t\tts = time.Unix(time.Now().Unix(), 0)\n\t} else {\n\t\tts = prev.MsgBlock().Header.Timestamp.Add(time.Second)\n\t}\n\n\t// Create the block. The nonce will be solved in the below code in\n\t// SolveBlock.\n\tblock := btcutil.NewBlock(&wire.MsgBlock{\n\t\tHeader: wire.BlockHeader{\n\t\t\tVersion:    1,\n\t\t\tPrevBlock:  *prev.Hash(),\n\t\t\tMerkleRoot: calcMerkleRoot(txns),\n\t\t\tBits:       chain.chainParams.PowLimitBits,\n\t\t\tTimestamp:  ts,\n\t\t\tNonce:      0, // To be solved.\n\t\t},\n\t\tTransactions: txns,\n\t})\n\tblock.SetHeight(blockHeight)\n\n\t// Solve the block.\n\tif !testhelper.SolveBlock(&block.MsgBlock().Header) {\n\t\treturn nil, nil, fmt.Errorf(\"Unable to solve block at height %d\", blockHeight)\n\t}\n\n\t// Create spendable outs to return.\n\touts := make([]*testhelper.SpendableOut, len(txns))\n\tfor i, tx := range txns {\n\t\tout := testhelper.MakeSpendableOutForTx(tx, 0)\n\t\touts[i] = &out\n\t}\n\n\treturn block, outs, nil\n}\n"
  },
  {
    "path": "blockchain/compress.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/txscript\"\n)\n\n// -----------------------------------------------------------------------------\n// A variable length quantity (VLQ) is an encoding that uses an arbitrary number\n// of binary octets to represent an arbitrarily large integer.  The scheme\n// employs a most significant byte (MSB) base-128 encoding where the high bit in\n// each byte indicates whether or not the byte is the final one.  In addition,\n// to ensure there are no redundant encodings, an offset is subtracted every\n// time a group of 7 bits is shifted out.  Therefore each integer can be\n// represented in exactly one way, and each representation stands for exactly\n// one integer.\n//\n// Another nice property of this encoding is that it provides a compact\n// representation of values that are typically used to indicate sizes.  For\n// example, the values 0 - 127 are represented with a single byte, 128 - 16511\n// with two bytes, and 16512 - 2113663 with three bytes.\n//\n// While the encoding allows arbitrarily large integers, it is artificially\n// limited in this code to an unsigned 64-bit integer for efficiency purposes.\n//\n// Example encodings:\n//           0 -> [0x00]\n//         127 -> [0x7f]                 * Max 1-byte value\n//         128 -> [0x80 0x00]\n//         129 -> [0x80 0x01]\n//         255 -> [0x80 0x7f]\n//         256 -> [0x81 0x00]\n//       16511 -> [0xff 0x7f]            * Max 2-byte value\n//       16512 -> [0x80 0x80 0x00]\n//       32895 -> [0x80 0xff 0x7f]\n//     2113663 -> [0xff 0xff 0x7f]       * Max 3-byte value\n//   270549119 -> [0xff 0xff 0xff 0x7f]  * Max 4-byte value\n//      2^64-1 -> [0x80 0xfe 0xfe 0xfe 0xfe 0xfe 0xfe 0xfe 0xfe 0x7f]\n//\n// References:\n//   https://en.wikipedia.org/wiki/Variable-length_quantity\n//   http://www.codecodex.com/wiki/Variable-Length_Integers\n// -----------------------------------------------------------------------------\n\n// serializeSizeVLQ returns the number of bytes it would take to serialize the\n// passed number as a variable-length quantity according to the format described\n// above.\nfunc serializeSizeVLQ(n uint64) int {\n\tsize := 1\n\tfor ; n > 0x7f; n = (n >> 7) - 1 {\n\t\tsize++\n\t}\n\n\treturn size\n}\n\n// putVLQ serializes the provided number to a variable-length quantity according\n// to the format described above and returns the number of bytes of the encoded\n// value.  The result is placed directly into the passed byte slice which must\n// be at least large enough to handle the number of bytes returned by the\n// serializeSizeVLQ function or it will panic.\nfunc putVLQ(target []byte, n uint64) int {\n\toffset := 0\n\tfor ; ; offset++ {\n\t\t// The high bit is set when another byte follows.\n\t\thighBitMask := byte(0x80)\n\t\tif offset == 0 {\n\t\t\thighBitMask = 0x00\n\t\t}\n\n\t\ttarget[offset] = byte(n&0x7f) | highBitMask\n\t\tif n <= 0x7f {\n\t\t\tbreak\n\t\t}\n\t\tn = (n >> 7) - 1\n\t}\n\n\t// Reverse the bytes so it is MSB-encoded.\n\tfor i, j := 0, offset; i < j; i, j = i+1, j-1 {\n\t\ttarget[i], target[j] = target[j], target[i]\n\t}\n\n\treturn offset + 1\n}\n\n// deserializeVLQ deserializes the provided variable-length quantity according\n// to the format described above.  It also returns the number of bytes\n// deserialized.\nfunc deserializeVLQ(serialized []byte) (uint64, int) {\n\tvar n uint64\n\tvar size int\n\tfor _, val := range serialized {\n\t\tsize++\n\t\tn = (n << 7) | uint64(val&0x7f)\n\t\tif val&0x80 != 0x80 {\n\t\t\tbreak\n\t\t}\n\t\tn++\n\t}\n\n\treturn n, size\n}\n\n// -----------------------------------------------------------------------------\n// In order to reduce the size of stored scripts, a domain specific compression\n// algorithm is used which recognizes standard scripts and stores them using\n// less bytes than the original script.  The compression algorithm used here was\n// obtained from Bitcoin Core, so all credits for the algorithm go to it.\n//\n// The general serialized format is:\n//\n//   <script size or type><script data>\n//\n//   Field                 Type     Size\n//   script size or type   VLQ      variable\n//   script data           []byte   variable\n//\n// The specific serialized format for each recognized standard script is:\n//\n// - Pay-to-pubkey-hash: (21 bytes) - <0><20-byte pubkey hash>\n// - Pay-to-script-hash: (21 bytes) - <1><20-byte script hash>\n// - Pay-to-pubkey**:    (33 bytes) - <2, 3, 4, or 5><32-byte pubkey X value>\n//   2, 3 = compressed pubkey with bit 0 specifying the y coordinate to use\n//   4, 5 = uncompressed pubkey with bit 0 specifying the y coordinate to use\n//   ** Only valid public keys starting with 0x02, 0x03, and 0x04 are supported.\n//\n// Any scripts which are not recognized as one of the aforementioned standard\n// scripts are encoded using the general serialized format and encode the script\n// size as the sum of the actual size of the script and the number of special\n// cases.\n// -----------------------------------------------------------------------------\n\n// The following constants specify the special constants used to identify a\n// special script type in the domain-specific compressed script encoding.\n//\n// NOTE: This section specifically does not use iota since these values are\n// serialized and must be stable for long-term storage.\nconst (\n\t// cstPayToPubKeyHash identifies a compressed pay-to-pubkey-hash script.\n\tcstPayToPubKeyHash = 0\n\n\t// cstPayToScriptHash identifies a compressed pay-to-script-hash script.\n\tcstPayToScriptHash = 1\n\n\t// cstPayToPubKeyComp2 identifies a compressed pay-to-pubkey script to\n\t// a compressed pubkey.  Bit 0 specifies which y-coordinate to use\n\t// to reconstruct the full uncompressed pubkey.\n\tcstPayToPubKeyComp2 = 2\n\n\t// cstPayToPubKeyComp3 identifies a compressed pay-to-pubkey script to\n\t// a compressed pubkey.  Bit 0 specifies which y-coordinate to use\n\t// to reconstruct the full uncompressed pubkey.\n\tcstPayToPubKeyComp3 = 3\n\n\t// cstPayToPubKeyUncomp4 identifies a compressed pay-to-pubkey script to\n\t// an uncompressed pubkey.  Bit 0 specifies which y-coordinate to use\n\t// to reconstruct the full uncompressed pubkey.\n\tcstPayToPubKeyUncomp4 = 4\n\n\t// cstPayToPubKeyUncomp5 identifies a compressed pay-to-pubkey script to\n\t// an uncompressed pubkey.  Bit 0 specifies which y-coordinate to use\n\t// to reconstruct the full uncompressed pubkey.\n\tcstPayToPubKeyUncomp5 = 5\n\n\t// numSpecialScripts is the number of special scripts recognized by the\n\t// domain-specific script compression algorithm.\n\tnumSpecialScripts = 6\n)\n\n// isPubKeyHash returns whether or not the passed public key script is a\n// standard pay-to-pubkey-hash script along with the pubkey hash it is paying to\n// if it is.\nfunc isPubKeyHash(script []byte) (bool, []byte) {\n\tif len(script) == 25 && script[0] == txscript.OP_DUP &&\n\t\tscript[1] == txscript.OP_HASH160 &&\n\t\tscript[2] == txscript.OP_DATA_20 &&\n\t\tscript[23] == txscript.OP_EQUALVERIFY &&\n\t\tscript[24] == txscript.OP_CHECKSIG {\n\n\t\treturn true, script[3:23]\n\t}\n\n\treturn false, nil\n}\n\n// isScriptHash returns whether or not the passed public key script is a\n// standard pay-to-script-hash script along with the script hash it is paying to\n// if it is.\nfunc isScriptHash(script []byte) (bool, []byte) {\n\tif len(script) == 23 && script[0] == txscript.OP_HASH160 &&\n\t\tscript[1] == txscript.OP_DATA_20 &&\n\t\tscript[22] == txscript.OP_EQUAL {\n\n\t\treturn true, script[2:22]\n\t}\n\n\treturn false, nil\n}\n\n// isPubKey returns whether or not the passed public key script is a standard\n// pay-to-pubkey script that pays to a valid compressed or uncompressed public\n// key along with the serialized pubkey it is paying to if it is.\n//\n// NOTE: This function ensures the public key is actually valid since the\n// compression algorithm requires valid pubkeys.  It does not support hybrid\n// pubkeys.  This means that even if the script has the correct form for a\n// pay-to-pubkey script, this function will only return true when it is paying\n// to a valid compressed or uncompressed pubkey.\nfunc isPubKey(script []byte) (bool, []byte) {\n\t// Pay-to-compressed-pubkey script.\n\tif len(script) == 35 && script[0] == txscript.OP_DATA_33 &&\n\t\tscript[34] == txscript.OP_CHECKSIG && (script[1] == 0x02 ||\n\t\tscript[1] == 0x03) {\n\n\t\t// Ensure the public key is valid.\n\t\tserializedPubKey := script[1:34]\n\t\t_, err := btcec.ParsePubKey(serializedPubKey)\n\t\tif err == nil {\n\t\t\treturn true, serializedPubKey\n\t\t}\n\t}\n\n\t// Pay-to-uncompressed-pubkey script.\n\tif len(script) == 67 && script[0] == txscript.OP_DATA_65 &&\n\t\tscript[66] == txscript.OP_CHECKSIG && script[1] == 0x04 {\n\n\t\t// Ensure the public key is valid.\n\t\tserializedPubKey := script[1:66]\n\t\t_, err := btcec.ParsePubKey(serializedPubKey)\n\t\tif err == nil {\n\t\t\treturn true, serializedPubKey\n\t\t}\n\t}\n\n\treturn false, nil\n}\n\n// compressedScriptSize returns the number of bytes the passed script would take\n// when encoded with the domain specific compression algorithm described above.\nfunc compressedScriptSize(pkScript []byte) int {\n\t// Pay-to-pubkey-hash script.\n\tif valid, _ := isPubKeyHash(pkScript); valid {\n\t\treturn 21\n\t}\n\n\t// Pay-to-script-hash script.\n\tif valid, _ := isScriptHash(pkScript); valid {\n\t\treturn 21\n\t}\n\n\t// Pay-to-pubkey (compressed or uncompressed) script.\n\tif valid, _ := isPubKey(pkScript); valid {\n\t\treturn 33\n\t}\n\n\t// When none of the above special cases apply, encode the script as is\n\t// preceded by the sum of its size and the number of special cases\n\t// encoded as a variable length quantity.\n\treturn serializeSizeVLQ(uint64(len(pkScript)+numSpecialScripts)) +\n\t\tlen(pkScript)\n}\n\n// decodeCompressedScriptSize treats the passed serialized bytes as a compressed\n// script, possibly followed by other data, and returns the number of bytes it\n// occupies taking into account the special encoding of the script size by the\n// domain specific compression algorithm described above.\nfunc decodeCompressedScriptSize(serialized []byte) int {\n\tscriptSize, bytesRead := deserializeVLQ(serialized)\n\tif bytesRead == 0 {\n\t\treturn 0\n\t}\n\n\tswitch scriptSize {\n\tcase cstPayToPubKeyHash:\n\t\treturn 21\n\n\tcase cstPayToScriptHash:\n\t\treturn 21\n\n\tcase cstPayToPubKeyComp2, cstPayToPubKeyComp3, cstPayToPubKeyUncomp4,\n\t\tcstPayToPubKeyUncomp5:\n\t\treturn 33\n\t}\n\n\tscriptSize -= numSpecialScripts\n\tscriptSize += uint64(bytesRead)\n\treturn int(scriptSize)\n}\n\n// putCompressedScript compresses the passed script according to the domain\n// specific compression algorithm described above directly into the passed\n// target byte slice.  The target byte slice must be at least large enough to\n// handle the number of bytes returned by the compressedScriptSize function or\n// it will panic.\nfunc putCompressedScript(target, pkScript []byte) int {\n\t// Pay-to-pubkey-hash script.\n\tif valid, hash := isPubKeyHash(pkScript); valid {\n\t\ttarget[0] = cstPayToPubKeyHash\n\t\tcopy(target[1:21], hash)\n\t\treturn 21\n\t}\n\n\t// Pay-to-script-hash script.\n\tif valid, hash := isScriptHash(pkScript); valid {\n\t\ttarget[0] = cstPayToScriptHash\n\t\tcopy(target[1:21], hash)\n\t\treturn 21\n\t}\n\n\t// Pay-to-pubkey (compressed or uncompressed) script.\n\tif valid, serializedPubKey := isPubKey(pkScript); valid {\n\t\tpubKeyFormat := serializedPubKey[0]\n\t\tswitch pubKeyFormat {\n\t\tcase 0x02, 0x03:\n\t\t\ttarget[0] = pubKeyFormat\n\t\t\tcopy(target[1:33], serializedPubKey[1:33])\n\t\t\treturn 33\n\t\tcase 0x04:\n\t\t\t// Encode the oddness of the serialized pubkey into the\n\t\t\t// compressed script type.\n\t\t\ttarget[0] = pubKeyFormat | (serializedPubKey[64] & 0x01)\n\t\t\tcopy(target[1:33], serializedPubKey[1:33])\n\t\t\treturn 33\n\t\t}\n\t}\n\n\t// When none of the above special cases apply, encode the unmodified\n\t// script preceded by the sum of its size and the number of special\n\t// cases encoded as a variable length quantity.\n\tencodedSize := uint64(len(pkScript) + numSpecialScripts)\n\tvlqSizeLen := putVLQ(target, encodedSize)\n\tcopy(target[vlqSizeLen:], pkScript)\n\treturn vlqSizeLen + len(pkScript)\n}\n\n// decompressScript returns the original script obtained by decompressing the\n// passed compressed script according to the domain specific compression\n// algorithm described above.\n//\n// NOTE: The script parameter must already have been proven to be long enough\n// to contain the number of bytes returned by decodeCompressedScriptSize or it\n// will panic.  This is acceptable since it is only an internal function.\nfunc decompressScript(compressedPkScript []byte) []byte {\n\t// In practice this function will not be called with a zero-length or\n\t// nil script since the nil script encoding includes the length, however\n\t// the code below assumes the length exists, so just return nil now if\n\t// the function ever ends up being called with a nil script in the\n\t// future.\n\tif len(compressedPkScript) == 0 {\n\t\treturn nil\n\t}\n\n\t// Decode the script size and examine it for the special cases.\n\tencodedScriptSize, bytesRead := deserializeVLQ(compressedPkScript)\n\tswitch encodedScriptSize {\n\t// Pay-to-pubkey-hash script.  The resulting script is:\n\t// <OP_DUP><OP_HASH160><20 byte hash><OP_EQUALVERIFY><OP_CHECKSIG>\n\tcase cstPayToPubKeyHash:\n\t\tpkScript := make([]byte, 25)\n\t\tpkScript[0] = txscript.OP_DUP\n\t\tpkScript[1] = txscript.OP_HASH160\n\t\tpkScript[2] = txscript.OP_DATA_20\n\t\tcopy(pkScript[3:], compressedPkScript[bytesRead:bytesRead+20])\n\t\tpkScript[23] = txscript.OP_EQUALVERIFY\n\t\tpkScript[24] = txscript.OP_CHECKSIG\n\t\treturn pkScript\n\n\t// Pay-to-script-hash script.  The resulting script is:\n\t// <OP_HASH160><20 byte script hash><OP_EQUAL>\n\tcase cstPayToScriptHash:\n\t\tpkScript := make([]byte, 23)\n\t\tpkScript[0] = txscript.OP_HASH160\n\t\tpkScript[1] = txscript.OP_DATA_20\n\t\tcopy(pkScript[2:], compressedPkScript[bytesRead:bytesRead+20])\n\t\tpkScript[22] = txscript.OP_EQUAL\n\t\treturn pkScript\n\n\t// Pay-to-compressed-pubkey script.  The resulting script is:\n\t// <OP_DATA_33><33 byte compressed pubkey><OP_CHECKSIG>\n\tcase cstPayToPubKeyComp2, cstPayToPubKeyComp3:\n\t\tpkScript := make([]byte, 35)\n\t\tpkScript[0] = txscript.OP_DATA_33\n\t\tpkScript[1] = byte(encodedScriptSize)\n\t\tcopy(pkScript[2:], compressedPkScript[bytesRead:bytesRead+32])\n\t\tpkScript[34] = txscript.OP_CHECKSIG\n\t\treturn pkScript\n\n\t// Pay-to-uncompressed-pubkey script.  The resulting script is:\n\t// <OP_DATA_65><65 byte uncompressed pubkey><OP_CHECKSIG>\n\tcase cstPayToPubKeyUncomp4, cstPayToPubKeyUncomp5:\n\t\t// Change the leading byte to the appropriate compressed pubkey\n\t\t// identifier (0x02 or 0x03) so it can be decoded as a\n\t\t// compressed pubkey.  This really should never fail since the\n\t\t// encoding ensures it is valid before compressing to this type.\n\t\tcompressedKey := make([]byte, 33)\n\t\tcompressedKey[0] = byte(encodedScriptSize - 2)\n\t\tcopy(compressedKey[1:], compressedPkScript[1:])\n\t\tkey, err := btcec.ParsePubKey(compressedKey)\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\n\t\tpkScript := make([]byte, 67)\n\t\tpkScript[0] = txscript.OP_DATA_65\n\t\tcopy(pkScript[1:], key.SerializeUncompressed())\n\t\tpkScript[66] = txscript.OP_CHECKSIG\n\t\treturn pkScript\n\t}\n\n\t// When none of the special cases apply, the script was encoded using\n\t// the general format, so reduce the script size by the number of\n\t// special cases and return the unmodified script.\n\tscriptSize := int(encodedScriptSize - numSpecialScripts)\n\tpkScript := make([]byte, scriptSize)\n\tcopy(pkScript, compressedPkScript[bytesRead:bytesRead+scriptSize])\n\treturn pkScript\n}\n\n// -----------------------------------------------------------------------------\n// In order to reduce the size of stored amounts, a domain specific compression\n// algorithm is used which relies on there typically being a lot of zeroes at\n// end of the amounts.  The compression algorithm used here was obtained from\n// Bitcoin Core, so all credits for the algorithm go to it.\n//\n// While this is simply exchanging one uint64 for another, the resulting value\n// for typical amounts has a much smaller magnitude which results in fewer bytes\n// when encoded as variable length quantity.  For example, consider the amount\n// of 0.1 BTC which is 10000000 satoshi.  Encoding 10000000 as a VLQ would take\n// 4 bytes while encoding the compressed value of 8 as a VLQ only takes 1 byte.\n//\n// Essentially the compression is achieved by splitting the value into an\n// exponent in the range [0-9] and a digit in the range [1-9], when possible,\n// and encoding them in a way that can be decoded.  More specifically, the\n// encoding is as follows:\n// - 0 is 0\n// - Find the exponent, e, as the largest power of 10 that evenly divides the\n//   value up to a maximum of 9\n// - When e < 9, the final digit can't be 0 so store it as d and remove it by\n//   dividing the value by 10 (call the result n).  The encoded value is thus:\n//   1 + 10*(9*n + d-1) + e\n// - When e==9, the only thing known is the amount is not 0.  The encoded value\n//   is thus:\n//   1 + 10*(n-1) + e   ==   10 + 10*(n-1)\n//\n// Example encodings:\n// (The numbers in parenthesis are the number of bytes when serialized as a VLQ)\n//            0 (1) -> 0        (1)           *  0.00000000 BTC\n//         1000 (2) -> 4        (1)           *  0.00001000 BTC\n//        10000 (2) -> 5        (1)           *  0.00010000 BTC\n//     12345678 (4) -> 111111101(4)           *  0.12345678 BTC\n//     50000000 (4) -> 47       (1)           *  0.50000000 BTC\n//    100000000 (4) -> 9        (1)           *  1.00000000 BTC\n//    500000000 (5) -> 49       (1)           *  5.00000000 BTC\n//   1000000000 (5) -> 10       (1)           * 10.00000000 BTC\n// -----------------------------------------------------------------------------\n\n// compressTxOutAmount compresses the passed amount according to the domain\n// specific compression algorithm described above.\nfunc compressTxOutAmount(amount uint64) uint64 {\n\t// No need to do any work if it's zero.\n\tif amount == 0 {\n\t\treturn 0\n\t}\n\n\t// Find the largest power of 10 (max of 9) that evenly divides the\n\t// value.\n\texponent := uint64(0)\n\tfor amount%10 == 0 && exponent < 9 {\n\t\tamount /= 10\n\t\texponent++\n\t}\n\n\t// The compressed result for exponents less than 9 is:\n\t// 1 + 10*(9*n + d-1) + e\n\tif exponent < 9 {\n\t\tlastDigit := amount % 10\n\t\tamount /= 10\n\t\treturn 1 + 10*(9*amount+lastDigit-1) + exponent\n\t}\n\n\t// The compressed result for an exponent of 9 is:\n\t// 1 + 10*(n-1) + e   ==   10 + 10*(n-1)\n\treturn 10 + 10*(amount-1)\n}\n\n// decompressTxOutAmount returns the original amount the passed compressed\n// amount represents according to the domain specific compression algorithm\n// described above.\nfunc decompressTxOutAmount(amount uint64) uint64 {\n\t// No need to do any work if it's zero.\n\tif amount == 0 {\n\t\treturn 0\n\t}\n\n\t// The decompressed amount is either of the following two equations:\n\t// x = 1 + 10*(9*n + d - 1) + e\n\t// x = 1 + 10*(n - 1)       + 9\n\tamount--\n\n\t// The decompressed amount is now one of the following two equations:\n\t// x = 10*(9*n + d - 1) + e\n\t// x = 10*(n - 1)       + 9\n\texponent := amount % 10\n\tamount /= 10\n\n\t// The decompressed amount is now one of the following two equations:\n\t// x = 9*n + d - 1  | where e < 9\n\t// x = n - 1        | where e = 9\n\tn := uint64(0)\n\tif exponent < 9 {\n\t\tlastDigit := amount%9 + 1\n\t\tamount /= 9\n\t\tn = amount*10 + lastDigit\n\t} else {\n\t\tn = amount + 1\n\t}\n\n\t// Apply the exponent.\n\tfor ; exponent > 0; exponent-- {\n\t\tn *= 10\n\t}\n\n\treturn n\n}\n\n// -----------------------------------------------------------------------------\n// Compressed transaction outputs consist of an amount and a public key script\n// both compressed using the domain specific compression algorithms previously\n// described.\n//\n// The serialized format is:\n//\n//   <compressed amount><compressed script>\n//\n//   Field                 Type     Size\n//     compressed amount   VLQ      variable\n//     compressed script   []byte   variable\n// -----------------------------------------------------------------------------\n\n// compressedTxOutSize returns the number of bytes the passed transaction output\n// fields would take when encoded with the format described above.\nfunc compressedTxOutSize(amount uint64, pkScript []byte) int {\n\treturn serializeSizeVLQ(compressTxOutAmount(amount)) +\n\t\tcompressedScriptSize(pkScript)\n}\n\n// putCompressedTxOut compresses the passed amount and script according to their\n// domain specific compression algorithms and encodes them directly into the\n// passed target byte slice with the format described above.  The target byte\n// slice must be at least large enough to handle the number of bytes returned by\n// the compressedTxOutSize function or it will panic.\nfunc putCompressedTxOut(target []byte, amount uint64, pkScript []byte) int {\n\toffset := putVLQ(target, compressTxOutAmount(amount))\n\toffset += putCompressedScript(target[offset:], pkScript)\n\treturn offset\n}\n\n// decodeCompressedTxOut decodes the passed compressed txout, possibly followed\n// by other data, into its uncompressed amount and script and returns them along\n// with the number of bytes they occupied prior to decompression.\nfunc decodeCompressedTxOut(serialized []byte) (uint64, []byte, int, error) {\n\t// Deserialize the compressed amount and ensure there are bytes\n\t// remaining for the compressed script.\n\tcompressedAmount, bytesRead := deserializeVLQ(serialized)\n\tif bytesRead >= len(serialized) {\n\t\treturn 0, nil, bytesRead, errDeserialize(\"unexpected end of \" +\n\t\t\t\"data after compressed amount\")\n\t}\n\n\t// Decode the compressed script size and ensure there are enough bytes\n\t// left in the slice for it.\n\tscriptSize := decodeCompressedScriptSize(serialized[bytesRead:])\n\tif len(serialized[bytesRead:]) < scriptSize {\n\t\treturn 0, nil, bytesRead, errDeserialize(\"unexpected end of \" +\n\t\t\t\"data after script size\")\n\t}\n\n\t// Decompress and return the amount and script.\n\tamount := decompressTxOutAmount(compressedAmount)\n\tscript := decompressScript(serialized[bytesRead : bytesRead+scriptSize])\n\treturn amount, script, bytesRead + scriptSize, nil\n}\n"
  },
  {
    "path": "blockchain/compress_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"testing\"\n)\n\n// hexToBytes converts the passed hex string into bytes and will panic if there\n// is an error.  This is only provided for the hard-coded constants so errors in\n// the source code can be detected. It will only (and must only) be called with\n// hard-coded values.\nfunc hexToBytes(s string) []byte {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn b\n}\n\n// TestVLQ ensures the variable length quantity serialization, deserialization,\n// and size calculation works as expected.\nfunc TestVLQ(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tval        uint64\n\t\tserialized []byte\n\t}{\n\t\t{0, hexToBytes(\"00\")},\n\t\t{1, hexToBytes(\"01\")},\n\t\t{127, hexToBytes(\"7f\")},\n\t\t{128, hexToBytes(\"8000\")},\n\t\t{129, hexToBytes(\"8001\")},\n\t\t{255, hexToBytes(\"807f\")},\n\t\t{256, hexToBytes(\"8100\")},\n\t\t{16383, hexToBytes(\"fe7f\")},\n\t\t{16384, hexToBytes(\"ff00\")},\n\t\t{16511, hexToBytes(\"ff7f\")}, // Max 2-byte value\n\t\t{16512, hexToBytes(\"808000\")},\n\t\t{16513, hexToBytes(\"808001\")},\n\t\t{16639, hexToBytes(\"80807f\")},\n\t\t{32895, hexToBytes(\"80ff7f\")},\n\t\t{2113663, hexToBytes(\"ffff7f\")}, // Max 3-byte value\n\t\t{2113664, hexToBytes(\"80808000\")},\n\t\t{270549119, hexToBytes(\"ffffff7f\")}, // Max 4-byte value\n\t\t{270549120, hexToBytes(\"8080808000\")},\n\t\t{2147483647, hexToBytes(\"86fefefe7f\")},\n\t\t{2147483648, hexToBytes(\"86fefeff00\")},\n\t\t{4294967295, hexToBytes(\"8efefefe7f\")}, // Max uint32, 5 bytes\n\t\t// Max uint64, 10 bytes\n\t\t{18446744073709551615, hexToBytes(\"80fefefefefefefefe7f\")},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Ensure the function to calculate the serialized size without\n\t\t// actually serializing the value is calculated properly.\n\t\tgotSize := serializeSizeVLQ(test.val)\n\t\tif gotSize != len(test.serialized) {\n\t\t\tt.Errorf(\"serializeSizeVLQ: did not get expected size \"+\n\t\t\t\t\"for %d - got %d, want %d\", test.val, gotSize,\n\t\t\t\tlen(test.serialized))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the value serializes to the expected bytes.\n\t\tgotBytes := make([]byte, gotSize)\n\t\tgotBytesWritten := putVLQ(gotBytes, test.val)\n\t\tif !bytes.Equal(gotBytes, test.serialized) {\n\t\t\tt.Errorf(\"putVLQUnchecked: did not get expected bytes \"+\n\t\t\t\t\"for %d - got %x, want %x\", test.val, gotBytes,\n\t\t\t\ttest.serialized)\n\t\t\tcontinue\n\t\t}\n\t\tif gotBytesWritten != len(test.serialized) {\n\t\t\tt.Errorf(\"putVLQUnchecked: did not get expected number \"+\n\t\t\t\t\"of bytes written for %d - got %d, want %d\",\n\t\t\t\ttest.val, gotBytesWritten, len(test.serialized))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the serialized bytes deserialize to the expected\n\t\t// value.\n\t\tgotVal, gotBytesRead := deserializeVLQ(test.serialized)\n\t\tif gotVal != test.val {\n\t\t\tt.Errorf(\"deserializeVLQ: did not get expected value \"+\n\t\t\t\t\"for %x - got %d, want %d\", test.serialized,\n\t\t\t\tgotVal, test.val)\n\t\t\tcontinue\n\t\t}\n\t\tif gotBytesRead != len(test.serialized) {\n\t\t\tt.Errorf(\"deserializeVLQ: did not get expected number \"+\n\t\t\t\t\"of bytes read for %d - got %d, want %d\",\n\t\t\t\ttest.serialized, gotBytesRead,\n\t\t\t\tlen(test.serialized))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestScriptCompression ensures the domain-specific script compression and\n// decompression works as expected.\nfunc TestScriptCompression(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname         string\n\t\tuncompressed []byte\n\t\tcompressed   []byte\n\t}{\n\t\t{\n\t\t\tname:         \"nil\",\n\t\t\tuncompressed: nil,\n\t\t\tcompressed:   hexToBytes(\"06\"),\n\t\t},\n\t\t{\n\t\t\tname:         \"pay-to-pubkey-hash 1\",\n\t\t\tuncompressed: hexToBytes(\"76a9141018853670f9f3b0582c5b9ee8ce93764ac32b9388ac\"),\n\t\t\tcompressed:   hexToBytes(\"001018853670f9f3b0582c5b9ee8ce93764ac32b93\"),\n\t\t},\n\t\t{\n\t\t\tname:         \"pay-to-pubkey-hash 2\",\n\t\t\tuncompressed: hexToBytes(\"76a914e34cce70c86373273efcc54ce7d2a491bb4a0e8488ac\"),\n\t\t\tcompressed:   hexToBytes(\"00e34cce70c86373273efcc54ce7d2a491bb4a0e84\"),\n\t\t},\n\t\t{\n\t\t\tname:         \"pay-to-script-hash 1\",\n\t\t\tuncompressed: hexToBytes(\"a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87\"),\n\t\t\tcompressed:   hexToBytes(\"01da1745e9b549bd0bfa1a569971c77eba30cd5a4b\"),\n\t\t},\n\t\t{\n\t\t\tname:         \"pay-to-script-hash 2\",\n\t\t\tuncompressed: hexToBytes(\"a914f815b036d9bbbce5e9f2a00abd1bf3dc91e9551087\"),\n\t\t\tcompressed:   hexToBytes(\"01f815b036d9bbbce5e9f2a00abd1bf3dc91e95510\"),\n\t\t},\n\t\t{\n\t\t\tname:         \"pay-to-pubkey compressed 0x02\",\n\t\t\tuncompressed: hexToBytes(\"2102192d74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4ac\"),\n\t\t\tcompressed:   hexToBytes(\"02192d74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4\"),\n\t\t},\n\t\t{\n\t\t\tname:         \"pay-to-pubkey compressed 0x03\",\n\t\t\tuncompressed: hexToBytes(\"2103b0bd634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e65ac\"),\n\t\t\tcompressed:   hexToBytes(\"03b0bd634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e65\"),\n\t\t},\n\t\t{\n\t\t\tname:         \"pay-to-pubkey uncompressed 0x04 even\",\n\t\t\tuncompressed: hexToBytes(\"4104192d74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b40d45264838c0bd96852662ce6a847b197376830160c6d2eb5e6a4c44d33f453eac\"),\n\t\t\tcompressed:   hexToBytes(\"04192d74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4\"),\n\t\t},\n\t\t{\n\t\t\tname:         \"pay-to-pubkey uncompressed 0x04 odd\",\n\t\t\tuncompressed: hexToBytes(\"410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac\"),\n\t\t\tcompressed:   hexToBytes(\"0511db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5c\"),\n\t\t},\n\t\t{\n\t\t\tname:         \"pay-to-pubkey invalid pubkey\",\n\t\t\tuncompressed: hexToBytes(\"3302aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac\"),\n\t\t\tcompressed:   hexToBytes(\"293302aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac\"),\n\t\t},\n\t\t{\n\t\t\tname:         \"null data\",\n\t\t\tuncompressed: hexToBytes(\"6a200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20\"),\n\t\t\tcompressed:   hexToBytes(\"286a200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20\"),\n\t\t},\n\t\t{\n\t\t\tname:         \"requires 2 size bytes - data push 200 bytes\",\n\t\t\tuncompressed: append(hexToBytes(\"4cc8\"), bytes.Repeat([]byte{0x00}, 200)...),\n\t\t\t// [0x80, 0x50] = 208 as a variable length quantity\n\t\t\t// [0x4c, 0xc8] = OP_PUSHDATA1 200\n\t\t\tcompressed: append(hexToBytes(\"80504cc8\"), bytes.Repeat([]byte{0x00}, 200)...),\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Ensure the function to calculate the serialized size without\n\t\t// actually serializing the value is calculated properly.\n\t\tgotSize := compressedScriptSize(test.uncompressed)\n\t\tif gotSize != len(test.compressed) {\n\t\t\tt.Errorf(\"compressedScriptSize (%s): did not get \"+\n\t\t\t\t\"expected size - got %d, want %d\", test.name,\n\t\t\t\tgotSize, len(test.compressed))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the script compresses to the expected bytes.\n\t\tgotCompressed := make([]byte, gotSize)\n\t\tgotBytesWritten := putCompressedScript(gotCompressed,\n\t\t\ttest.uncompressed)\n\t\tif !bytes.Equal(gotCompressed, test.compressed) {\n\t\t\tt.Errorf(\"putCompressedScript (%s): did not get \"+\n\t\t\t\t\"expected bytes - got %x, want %x\", test.name,\n\t\t\t\tgotCompressed, test.compressed)\n\t\t\tcontinue\n\t\t}\n\t\tif gotBytesWritten != len(test.compressed) {\n\t\t\tt.Errorf(\"putCompressedScript (%s): did not get \"+\n\t\t\t\t\"expected number of bytes written - got %d, \"+\n\t\t\t\t\"want %d\", test.name, gotBytesWritten,\n\t\t\t\tlen(test.compressed))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the compressed script size is properly decoded from\n\t\t// the compressed script.\n\t\tgotDecodedSize := decodeCompressedScriptSize(test.compressed)\n\t\tif gotDecodedSize != len(test.compressed) {\n\t\t\tt.Errorf(\"decodeCompressedScriptSize (%s): did not get \"+\n\t\t\t\t\"expected size - got %d, want %d\", test.name,\n\t\t\t\tgotDecodedSize, len(test.compressed))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the script decompresses to the expected bytes.\n\t\tgotDecompressed := decompressScript(test.compressed)\n\t\tif !bytes.Equal(gotDecompressed, test.uncompressed) {\n\t\t\tt.Errorf(\"decompressScript (%s): did not get expected \"+\n\t\t\t\t\"bytes - got %x, want %x\", test.name,\n\t\t\t\tgotDecompressed, test.uncompressed)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestScriptCompressionErrors ensures calling various functions related to\n// script compression with incorrect data returns the expected results.\nfunc TestScriptCompressionErrors(t *testing.T) {\n\tt.Parallel()\n\n\t// A nil script must result in a decoded size of 0.\n\tif gotSize := decodeCompressedScriptSize(nil); gotSize != 0 {\n\t\tt.Fatalf(\"decodeCompressedScriptSize with nil script did not \"+\n\t\t\t\"return 0 - got %d\", gotSize)\n\t}\n\n\t// A nil script must result in a nil decompressed script.\n\tif gotScript := decompressScript(nil); gotScript != nil {\n\t\tt.Fatalf(\"decompressScript with nil script did not return nil \"+\n\t\t\t\"decompressed script - got %x\", gotScript)\n\t}\n\n\t// A compressed script for a pay-to-pubkey (uncompressed) that results\n\t// in an invalid pubkey must result in a nil decompressed script.\n\tcompressedScript := hexToBytes(\"04012d74d0cb94344c9569c2e77901573d8d\" +\n\t\t\"7903c3ebec3a957724895dca52c6b4\")\n\tif gotScript := decompressScript(compressedScript); gotScript != nil {\n\t\tt.Fatalf(\"decompressScript with compressed pay-to-\"+\n\t\t\t\"uncompressed-pubkey that is invalid did not return \"+\n\t\t\t\"nil decompressed script - got %x\", gotScript)\n\t}\n}\n\n// TestAmountCompression ensures the domain-specific transaction output amount\n// compression and decompression works as expected.\nfunc TestAmountCompression(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname         string\n\t\tuncompressed uint64\n\t\tcompressed   uint64\n\t}{\n\t\t{\n\t\t\tname:         \"0 BTC (sometimes used in nulldata)\",\n\t\t\tuncompressed: 0,\n\t\t\tcompressed:   0,\n\t\t},\n\t\t{\n\t\t\tname:         \"546 Satoshi (current network dust value)\",\n\t\t\tuncompressed: 546,\n\t\t\tcompressed:   4911,\n\t\t},\n\t\t{\n\t\t\tname:         \"0.00001 BTC (typical transaction fee)\",\n\t\t\tuncompressed: 1000,\n\t\t\tcompressed:   4,\n\t\t},\n\t\t{\n\t\t\tname:         \"0.0001 BTC (typical transaction fee)\",\n\t\t\tuncompressed: 10000,\n\t\t\tcompressed:   5,\n\t\t},\n\t\t{\n\t\t\tname:         \"0.12345678 BTC\",\n\t\t\tuncompressed: 12345678,\n\t\t\tcompressed:   111111101,\n\t\t},\n\t\t{\n\t\t\tname:         \"0.5 BTC\",\n\t\t\tuncompressed: 50000000,\n\t\t\tcompressed:   48,\n\t\t},\n\t\t{\n\t\t\tname:         \"1 BTC\",\n\t\t\tuncompressed: 100000000,\n\t\t\tcompressed:   9,\n\t\t},\n\t\t{\n\t\t\tname:         \"5 BTC\",\n\t\t\tuncompressed: 500000000,\n\t\t\tcompressed:   49,\n\t\t},\n\t\t{\n\t\t\tname:         \"21000000 BTC (max minted coins)\",\n\t\t\tuncompressed: 2100000000000000,\n\t\t\tcompressed:   21000000,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Ensure the amount compresses to the expected value.\n\t\tgotCompressed := compressTxOutAmount(test.uncompressed)\n\t\tif gotCompressed != test.compressed {\n\t\t\tt.Errorf(\"compressTxOutAmount (%s): did not get \"+\n\t\t\t\t\"expected value - got %d, want %d\", test.name,\n\t\t\t\tgotCompressed, test.compressed)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the value decompresses to the expected value.\n\t\tgotDecompressed := decompressTxOutAmount(test.compressed)\n\t\tif gotDecompressed != test.uncompressed {\n\t\t\tt.Errorf(\"decompressTxOutAmount (%s): did not get \"+\n\t\t\t\t\"expected value - got %d, want %d\", test.name,\n\t\t\t\tgotDecompressed, test.uncompressed)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestCompressedTxOut ensures the transaction output serialization and\n// deserialization works as expected.\nfunc TestCompressedTxOut(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname       string\n\t\tamount     uint64\n\t\tpkScript   []byte\n\t\tcompressed []byte\n\t}{\n\t\t{\n\t\t\tname:       \"nulldata with 0 BTC\",\n\t\t\tamount:     0,\n\t\t\tpkScript:   hexToBytes(\"6a200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20\"),\n\t\t\tcompressed: hexToBytes(\"00286a200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20\"),\n\t\t},\n\t\t{\n\t\t\tname:       \"pay-to-pubkey-hash dust\",\n\t\t\tamount:     546,\n\t\t\tpkScript:   hexToBytes(\"76a9141018853670f9f3b0582c5b9ee8ce93764ac32b9388ac\"),\n\t\t\tcompressed: hexToBytes(\"a52f001018853670f9f3b0582c5b9ee8ce93764ac32b93\"),\n\t\t},\n\t\t{\n\t\t\tname:       \"pay-to-pubkey uncompressed 1 BTC\",\n\t\t\tamount:     100000000,\n\t\t\tpkScript:   hexToBytes(\"4104192d74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b40d45264838c0bd96852662ce6a847b197376830160c6d2eb5e6a4c44d33f453eac\"),\n\t\t\tcompressed: hexToBytes(\"0904192d74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4\"),\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Ensure the function to calculate the serialized size without\n\t\t// actually serializing the txout is calculated properly.\n\t\tgotSize := compressedTxOutSize(test.amount, test.pkScript)\n\t\tif gotSize != len(test.compressed) {\n\t\t\tt.Errorf(\"compressedTxOutSize (%s): did not get \"+\n\t\t\t\t\"expected size - got %d, want %d\", test.name,\n\t\t\t\tgotSize, len(test.compressed))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the txout compresses to the expected value.\n\t\tgotCompressed := make([]byte, gotSize)\n\t\tgotBytesWritten := putCompressedTxOut(gotCompressed,\n\t\t\ttest.amount, test.pkScript)\n\t\tif !bytes.Equal(gotCompressed, test.compressed) {\n\t\t\tt.Errorf(\"compressTxOut (%s): did not get expected \"+\n\t\t\t\t\"bytes - got %x, want %x\", test.name,\n\t\t\t\tgotCompressed, test.compressed)\n\t\t\tcontinue\n\t\t}\n\t\tif gotBytesWritten != len(test.compressed) {\n\t\t\tt.Errorf(\"compressTxOut (%s): did not get expected \"+\n\t\t\t\t\"number of bytes written - got %d, want %d\",\n\t\t\t\ttest.name, gotBytesWritten,\n\t\t\t\tlen(test.compressed))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the serialized bytes are decoded back to the expected\n\t\t// uncompressed values.\n\t\tgotAmount, gotScript, gotBytesRead, err := decodeCompressedTxOut(\n\t\t\ttest.compressed)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"decodeCompressedTxOut (%s): unexpected \"+\n\t\t\t\t\"error: %v\", test.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif gotAmount != test.amount {\n\t\t\tt.Errorf(\"decodeCompressedTxOut (%s): did not get \"+\n\t\t\t\t\"expected amount - got %d, want %d\",\n\t\t\t\ttest.name, gotAmount, test.amount)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(gotScript, test.pkScript) {\n\t\t\tt.Errorf(\"decodeCompressedTxOut (%s): did not get \"+\n\t\t\t\t\"expected script - got %x, want %x\",\n\t\t\t\ttest.name, gotScript, test.pkScript)\n\t\t\tcontinue\n\t\t}\n\t\tif gotBytesRead != len(test.compressed) {\n\t\t\tt.Errorf(\"decodeCompressedTxOut (%s): did not get \"+\n\t\t\t\t\"expected number of bytes read - got %d, want %d\",\n\t\t\t\ttest.name, gotBytesRead, len(test.compressed))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestTxOutCompressionErrors ensures calling various functions related to\n// txout compression with incorrect data returns the expected results.\nfunc TestTxOutCompressionErrors(t *testing.T) {\n\tt.Parallel()\n\n\t// A compressed txout with missing compressed script must error.\n\tcompressedTxOut := hexToBytes(\"00\")\n\t_, _, _, err := decodeCompressedTxOut(compressedTxOut)\n\tif !isDeserializeErr(err) {\n\t\tt.Fatalf(\"decodeCompressedTxOut with missing compressed script \"+\n\t\t\t\"did not return expected error type - got %T, want \"+\n\t\t\t\"errDeserialize\", err)\n\t}\n\n\t// A compressed txout with short compressed script must error.\n\tcompressedTxOut = hexToBytes(\"0010\")\n\t_, _, _, err = decodeCompressedTxOut(compressedTxOut)\n\tif !isDeserializeErr(err) {\n\t\tt.Fatalf(\"decodeCompressedTxOut with short compressed script \"+\n\t\t\t\"did not return expected error type - got %T, want \"+\n\t\t\t\"errDeserialize\", err)\n\t}\n}\n"
  },
  {
    "path": "blockchain/difficulty.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"math/big\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain/internal/workmath\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// HashToBig converts a chainhash.Hash into a big.Int that can be used to\n// perform math comparisons.\nfunc HashToBig(hash *chainhash.Hash) *big.Int {\n\treturn workmath.HashToBig(hash)\n}\n\n// CompactToBig converts a compact representation of a whole number N to an\n// unsigned 32-bit number.  The representation is similar to IEEE754 floating\n// point numbers.\n//\n// Like IEEE754 floating point, there are three basic components: the sign,\n// the exponent, and the mantissa.  They are broken out as follows:\n//\n// - the most significant 8 bits represent the unsigned base 256 exponent\n// - bit 23 (the 24th bit) represents the sign bit\n// - the least significant 23 bits represent the mantissa\n//\n//\t-------------------------------------------------\n//\t|   Exponent     |    Sign    |    Mantissa     |\n//\t-------------------------------------------------\n//\t| 8 bits [31-24] | 1 bit [23] | 23 bits [22-00] |\n//\t-------------------------------------------------\n//\n// The formula to calculate N is:\n//\n//\tN = (-1^sign) * mantissa * 256^(exponent-3)\n//\n// This compact form is only used in bitcoin to encode unsigned 256-bit numbers\n// which represent difficulty targets, thus there really is not a need for a\n// sign bit, but it is implemented here to stay consistent with bitcoind.\nfunc CompactToBig(compact uint32) *big.Int {\n\treturn workmath.CompactToBig(compact)\n}\n\n// BigToCompact converts a whole number N to a compact representation using\n// an unsigned 32-bit number.  The compact representation only provides 23 bits\n// of precision, so values larger than (2^23 - 1) only encode the most\n// significant digits of the number.  See CompactToBig for details.\nfunc BigToCompact(n *big.Int) uint32 {\n\treturn workmath.BigToCompact(n)\n}\n\n// CalcWork calculates a work value from difficulty bits.  Bitcoin increases\n// the difficulty for generating a block by decreasing the value which the\n// generated hash must be less than.  This difficulty target is stored in each\n// block header using a compact representation as described in the documentation\n// for CompactToBig.  The main chain is selected by choosing the chain that has\n// the most proof of work (highest difficulty).  Since a lower target difficulty\n// value equates to higher actual difficulty, the work value which will be\n// accumulated must be the inverse of the difficulty.  Also, in order to avoid\n// potential division by zero and really small floating point numbers, the\n// result adds 1 to the denominator and multiplies the numerator by 2^256.\nfunc CalcWork(bits uint32) *big.Int {\n\treturn workmath.CalcWork(bits)\n}\n\n// calcEasiestDifficulty calculates the easiest possible difficulty that a block\n// can have given starting difficulty bits and a duration.  It is mainly used to\n// verify that claimed proof of work by a block is sane as compared to a\n// known good checkpoint.\nfunc (b *BlockChain) calcEasiestDifficulty(bits uint32, duration time.Duration) uint32 {\n\t// Convert types used in the calculations below.\n\tdurationVal := int64(duration / time.Second)\n\tadjustmentFactor := big.NewInt(b.chainParams.RetargetAdjustmentFactor)\n\n\t// The test network rules allow minimum difficulty blocks after more\n\t// than twice the desired amount of time needed to generate a block has\n\t// elapsed.\n\tif b.chainParams.ReduceMinDifficulty {\n\t\treductionTime := int64(b.chainParams.MinDiffReductionTime /\n\t\t\ttime.Second)\n\t\tif durationVal > reductionTime {\n\t\t\treturn b.chainParams.PowLimitBits\n\t\t}\n\t}\n\n\t// Since easier difficulty equates to higher numbers, the easiest\n\t// difficulty for a given duration is the largest value possible given\n\t// the number of retargets for the duration and starting difficulty\n\t// multiplied by the max adjustment factor.\n\tnewTarget := CompactToBig(bits)\n\tfor durationVal > 0 && newTarget.Cmp(b.chainParams.PowLimit) < 0 {\n\t\tnewTarget.Mul(newTarget, adjustmentFactor)\n\t\tdurationVal -= b.maxRetargetTimespan\n\t}\n\n\t// Limit new value to the proof of work limit.\n\tif newTarget.Cmp(b.chainParams.PowLimit) > 0 {\n\t\tnewTarget.Set(b.chainParams.PowLimit)\n\t}\n\n\treturn BigToCompact(newTarget)\n}\n\n// findPrevTestNetDifficulty returns the difficulty of the previous block which\n// did not have the special testnet minimum difficulty rule applied.\nfunc findPrevTestNetDifficulty(startNode HeaderCtx, c ChainCtx) uint32 {\n\t// Search backwards through the chain for the last block without\n\t// the special rule applied.\n\titerNode := startNode\n\tfor iterNode != nil && iterNode.Height()%c.BlocksPerRetarget() != 0 &&\n\t\titerNode.Bits() == c.ChainParams().PowLimitBits {\n\n\t\titerNode = iterNode.Parent()\n\t}\n\n\t// Return the found difficulty or the minimum difficulty if no\n\t// appropriate block was found.\n\tlastBits := c.ChainParams().PowLimitBits\n\tif iterNode != nil {\n\t\tlastBits = iterNode.Bits()\n\t}\n\treturn lastBits\n}\n\n// calcNextRequiredDifficulty calculates the required difficulty for the block\n// after the passed previous HeaderCtx based on the difficulty retarget rules.\n// This function differs from the exported CalcNextRequiredDifficulty in that\n// the exported version uses the current best chain as the previous HeaderCtx\n// while this function accepts any block node. This function accepts a ChainCtx\n// parameter that gives the necessary difficulty context variables.\nfunc calcNextRequiredDifficulty(lastNode HeaderCtx, newBlockTime time.Time,\n\tc ChainCtx) (uint32, error) {\n\n\t// Emulate the same behavior as Bitcoin Core that for regtest there is\n\t// no difficulty retargeting.\n\tif c.ChainParams().PoWNoRetargeting {\n\t\treturn c.ChainParams().PowLimitBits, nil\n\t}\n\n\t// Genesis block.\n\tif lastNode == nil {\n\t\treturn c.ChainParams().PowLimitBits, nil\n\t}\n\n\t// Return the previous block's difficulty requirements if this block\n\t// is not at a difficulty retarget interval.\n\tif (lastNode.Height()+1)%c.BlocksPerRetarget() != 0 {\n\t\t// For networks that support it, allow special reduction of the\n\t\t// required difficulty once too much time has elapsed without\n\t\t// mining a block.\n\t\tif c.ChainParams().ReduceMinDifficulty {\n\t\t\t// Return minimum difficulty when more than the desired\n\t\t\t// amount of time has elapsed without mining a block.\n\t\t\treductionTime := int64(c.ChainParams().MinDiffReductionTime /\n\t\t\t\ttime.Second)\n\t\t\tallowMinTime := lastNode.Timestamp() + reductionTime\n\t\t\tif newBlockTime.Unix() > allowMinTime {\n\t\t\t\treturn c.ChainParams().PowLimitBits, nil\n\t\t\t}\n\n\t\t\t// The block was mined within the desired timeframe, so\n\t\t\t// return the difficulty for the last block which did\n\t\t\t// not have the special minimum difficulty rule applied.\n\t\t\treturn findPrevTestNetDifficulty(lastNode, c), nil\n\t\t}\n\n\t\t// For the main network (or any unrecognized networks), simply\n\t\t// return the previous block's difficulty requirements.\n\t\treturn lastNode.Bits(), nil\n\t}\n\n\t// Get the block node at the previous retarget (targetTimespan days\n\t// worth of blocks).\n\tfirstNode := lastNode.RelativeAncestorCtx(c.BlocksPerRetarget() - 1)\n\tif firstNode == nil {\n\t\treturn 0, AssertError(\"unable to obtain previous retarget block\")\n\t}\n\n\t// Limit the amount of adjustment that can occur to the previous\n\t// difficulty.\n\tactualTimespan := lastNode.Timestamp() - firstNode.Timestamp()\n\tadjustedTimespan := actualTimespan\n\tif actualTimespan < c.MinRetargetTimespan() {\n\t\tadjustedTimespan = c.MinRetargetTimespan()\n\t} else if actualTimespan > c.MaxRetargetTimespan() {\n\t\tadjustedTimespan = c.MaxRetargetTimespan()\n\t}\n\n\t// Special difficulty rule for Testnet4\n\toldTarget := CompactToBig(lastNode.Bits())\n\tif c.ChainParams().EnforceBIP94 {\n\t\t// Here we use the first block of the difficulty period. This way\n\t\t// the real difficulty is always preserved in the first block as\n\t\t// it is not allowed to use the min-difficulty exception.\n\t\toldTarget = CompactToBig(firstNode.Bits())\n\t}\n\n\t// Calculate new target difficulty as:\n\t//  currentDifficulty * (adjustedTimespan / targetTimespan)\n\t// The result uses integer division which means it will be slightly\n\t// rounded down.  Bitcoind also uses integer division to calculate this\n\t// result.\n\tnewTarget := new(big.Int).Mul(oldTarget, big.NewInt(adjustedTimespan))\n\ttargetTimeSpan := int64(c.ChainParams().TargetTimespan / time.Second)\n\tnewTarget.Div(newTarget, big.NewInt(targetTimeSpan))\n\n\t// Limit new value to the proof of work limit.\n\tif newTarget.Cmp(c.ChainParams().PowLimit) > 0 {\n\t\tnewTarget.Set(c.ChainParams().PowLimit)\n\t}\n\n\t// Log new target difficulty and return it.  The new target logging is\n\t// intentionally converting the bits back to a number instead of using\n\t// newTarget since conversion to the compact representation loses\n\t// precision.\n\tnewTargetBits := BigToCompact(newTarget)\n\tlog.Debugf(\"Difficulty retarget at block height %d\", lastNode.Height()+1)\n\tlog.Debugf(\"Old target %08x (%064x)\", lastNode.Bits(), oldTarget)\n\tlog.Debugf(\"New target %08x (%064x)\", newTargetBits, CompactToBig(newTargetBits))\n\tlog.Debugf(\"Actual timespan %v, adjusted timespan %v, target timespan %v\",\n\t\ttime.Duration(actualTimespan)*time.Second,\n\t\ttime.Duration(adjustedTimespan)*time.Second,\n\t\tc.ChainParams().TargetTimespan)\n\n\treturn newTargetBits, nil\n}\n\n// CalcNextRequiredDifficulty calculates the required difficulty for the block\n// after the end of the current best chain based on the difficulty retarget\n// rules.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) CalcNextRequiredDifficulty(timestamp time.Time) (uint32, error) {\n\tb.chainLock.Lock()\n\tdifficulty, err := calcNextRequiredDifficulty(b.bestChain.Tip(), timestamp, b)\n\tb.chainLock.Unlock()\n\treturn difficulty, err\n}\n"
  },
  {
    "path": "blockchain/doc.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage blockchain implements bitcoin block handling and chain selection rules.\n\nThe bitcoin block handling and chain selection rules are an integral, and quite\nlikely the most important, part of bitcoin.  Unfortunately, at the time of\nthis writing, these rules are also largely undocumented and had to be\nascertained from the bitcoind source code.  At its core, bitcoin is a\ndistributed consensus of which blocks are valid and which ones will comprise the\nmain block chain (public ledger) that ultimately determines accepted\ntransactions, so it is extremely important that fully validating nodes agree on\nall rules.\n\nAt a high level, this package provides support for inserting new blocks into\nthe block chain according to the aforementioned rules.  It includes\nfunctionality such as rejecting duplicate blocks, ensuring blocks and\ntransactions follow all rules, orphan handling, and best chain selection along\nwith reorganization.\n\nSince this package does not deal with other bitcoin specifics such as network\ncommunication or wallets, it provides a notification system which gives the\ncaller a high level of flexibility in how they want to react to certain events\nsuch as orphan blocks which need their parents requested and newly connected\nmain chain blocks which might result in wallet updates.\n\n# Bitcoin Chain Processing Overview\n\nBefore a block is allowed into the block chain, it must go through an intensive\nseries of validation rules.  The following list serves as a general outline of\nthose rules to provide some intuition into what is going on under the hood, but\nis by no means exhaustive:\n\n  - Reject duplicate blocks\n  - Perform a series of sanity checks on the block and its transactions such as\n    verifying proof of work, timestamps, number and character of transactions,\n    transaction amounts, script complexity, and merkle root calculations\n  - Compare the block against predetermined checkpoints for expected timestamps\n    and difficulty based on elapsed time since the checkpoint\n  - Save the most recent orphan blocks for a limited time in case their parent\n    blocks become available\n  - Stop processing if the block is an orphan as the rest of the processing\n    depends on the block's position within the block chain\n  - Perform a series of more thorough checks that depend on the block's position\n    within the block chain such as verifying block difficulties adhere to\n    difficulty retarget rules, timestamps are after the median of the last\n    several blocks, all transactions are finalized, checkpoint blocks match, and\n    block versions are in line with the previous blocks\n  - Determine how the block fits into the chain and perform different actions\n    accordingly in order to ensure any side chains which have higher difficulty\n    than the main chain become the new main chain\n  - When a block is being connected to the main chain (either through\n    reorganization of a side chain to the main chain or just extending the\n    main chain), perform further checks on the block's transactions such as\n    verifying transaction duplicates, script complexity for the combination of\n    connected scripts, coinbase maturity, double spends, and connected\n    transaction values\n  - Run the transaction scripts to verify the spender is allowed to spend the\n    coins\n  - Insert the block into the block database\n\n# Errors\n\nErrors returned by this package are either the raw errors provided by underlying\ncalls or of type blockchain.RuleError.  This allows the caller to differentiate\nbetween unexpected errors, such as database errors, versus errors due to rule\nviolations through type assertions.  In addition, callers can programmatically\ndetermine the specific rule violation by examining the ErrorCode field of the\ntype asserted blockchain.RuleError.\n\n# Bitcoin Improvement Proposals\n\nThis package includes spec changes outlined by the following BIPs:\n\n\tBIP0016 (https://en.bitcoin.it/wiki/BIP_0016)\n\tBIP0030 (https://en.bitcoin.it/wiki/BIP_0030)\n\tBIP0034 (https://en.bitcoin.it/wiki/BIP_0034)\n*/\npackage blockchain\n"
  },
  {
    "path": "blockchain/error.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n)\n\n// DeploymentError identifies an error that indicates a deployment ID was\n// specified that does not exist.\ntype DeploymentError uint32\n\n// Error returns the assertion error as a human-readable string and satisfies\n// the error interface.\nfunc (e DeploymentError) Error() string {\n\treturn fmt.Sprintf(\"deployment ID %d does not exist\", uint32(e))\n}\n\n// AssertError identifies an error that indicates an internal code consistency\n// issue and should be treated as a critical and unrecoverable error.\ntype AssertError string\n\n// Error returns the assertion error as a human-readable string and satisfies\n// the error interface.\nfunc (e AssertError) Error() string {\n\treturn \"assertion failed: \" + string(e)\n}\n\n// ErrorCode identifies a kind of error.\ntype ErrorCode int\n\n// These constants are used to identify a specific RuleError.\nconst (\n\t// ErrDuplicateBlock indicates a block with the same hash already\n\t// exists.\n\tErrDuplicateBlock ErrorCode = iota\n\n\t// ErrBlockTooBig indicates the serialized block size exceeds the\n\t// maximum allowed size.\n\tErrBlockTooBig\n\n\t// ErrBlockWeightTooHigh indicates that the block's computed weight\n\t// metric exceeds the maximum allowed value.\n\tErrBlockWeightTooHigh\n\n\t// ErrBlockVersionTooOld indicates the block version is too old and is\n\t// no longer accepted since the majority of the network has upgraded\n\t// to a newer version.\n\tErrBlockVersionTooOld\n\n\t// ErrInvalidTime indicates the time in the passed block has a precision\n\t// that is more than one second.  The chain consensus rules require\n\t// timestamps to have a maximum precision of one second.\n\tErrInvalidTime\n\n\t// ErrTimeTooOld indicates the time is either before the median time of\n\t// the last several blocks per the chain consensus rules or prior to the\n\t// most recent checkpoint.\n\tErrTimeTooOld\n\n\t// ErrTimeTooNew indicates the time is too far in the future as compared\n\t// the current time.\n\tErrTimeTooNew\n\n\t// ErrDifficultyTooLow indicates the difficulty for the block is lower\n\t// than the difficulty required by the most recent checkpoint.\n\tErrDifficultyTooLow\n\n\t// ErrUnexpectedDifficulty indicates specified bits do not align with\n\t// the expected value either because it doesn't match the calculated\n\t// valued based on difficulty regarded rules or it is out of the valid\n\t// range.\n\tErrUnexpectedDifficulty\n\n\t// ErrHighHash indicates the block does not hash to a value which is\n\t// lower than the required target difficultly.\n\tErrHighHash\n\n\t// ErrBadMerkleRoot indicates the calculated merkle root does not match\n\t// the expected value.\n\tErrBadMerkleRoot\n\n\t// ErrBadCheckpoint indicates a block that is expected to be at a\n\t// checkpoint height does not match the expected one.\n\tErrBadCheckpoint\n\n\t// ErrForkTooOld indicates a block is attempting to fork the block chain\n\t// before the most recent checkpoint.\n\tErrForkTooOld\n\n\t// ErrCheckpointTimeTooOld indicates a block has a timestamp before the\n\t// most recent checkpoint.\n\tErrCheckpointTimeTooOld\n\n\t// ErrNoTransactions indicates the block does not have a least one\n\t// transaction.  A valid block must have at least the coinbase\n\t// transaction.\n\tErrNoTransactions\n\n\t// ErrNoTxInputs indicates a transaction does not have any inputs.  A\n\t// valid transaction must have at least one input.\n\tErrNoTxInputs\n\n\t// ErrNoTxOutputs indicates a transaction does not have any outputs.  A\n\t// valid transaction must have at least one output.\n\tErrNoTxOutputs\n\n\t// ErrTxTooBig indicates a transaction exceeds the maximum allowed size\n\t// when serialized.\n\tErrTxTooBig\n\n\t// ErrBadTxOutValue indicates an output value for a transaction is\n\t// invalid in some way such as being out of range.\n\tErrBadTxOutValue\n\n\t// ErrDuplicateTxInputs indicates a transaction references the same\n\t// input more than once.\n\tErrDuplicateTxInputs\n\n\t// ErrBadTxInput indicates a transaction input is invalid in some way\n\t// such as referencing a previous transaction outpoint which is out of\n\t// range or not referencing one at all.\n\tErrBadTxInput\n\n\t// ErrMissingTxOut indicates a transaction output referenced by an input\n\t// either does not exist or has already been spent.\n\tErrMissingTxOut\n\n\t// ErrUnfinalizedTx indicates a transaction has not been finalized.\n\t// A valid block may only contain finalized transactions.\n\tErrUnfinalizedTx\n\n\t// ErrDuplicateTx indicates a block contains an identical transaction\n\t// (or at least two transactions which hash to the same value).  A\n\t// valid block may only contain unique transactions.\n\tErrDuplicateTx\n\n\t// ErrOverwriteTx indicates a block contains a transaction that has\n\t// the same hash as a previous transaction which has not been fully\n\t// spent.\n\tErrOverwriteTx\n\n\t// ErrImmatureSpend indicates a transaction is attempting to spend a\n\t// coinbase that has not yet reached the required maturity.\n\tErrImmatureSpend\n\n\t// ErrSpendTooHigh indicates a transaction is attempting to spend more\n\t// value than the sum of all of its inputs.\n\tErrSpendTooHigh\n\n\t// ErrBadFees indicates the total fees for a block are invalid due to\n\t// exceeding the maximum possible value.\n\tErrBadFees\n\n\t// ErrTooManySigOps indicates the total number of signature operations\n\t// for a transaction or block exceed the maximum allowed limits.\n\tErrTooManySigOps\n\n\t// ErrFirstTxNotCoinbase indicates the first transaction in a block\n\t// is not a coinbase transaction.\n\tErrFirstTxNotCoinbase\n\n\t// ErrMultipleCoinbases indicates a block contains more than one\n\t// coinbase transaction.\n\tErrMultipleCoinbases\n\n\t// ErrBadCoinbaseScriptLen indicates the length of the signature script\n\t// for a coinbase transaction is not within the valid range.\n\tErrBadCoinbaseScriptLen\n\n\t// ErrBadCoinbaseValue indicates the amount of a coinbase value does\n\t// not match the expected value of the subsidy plus the sum of all fees.\n\tErrBadCoinbaseValue\n\n\t// ErrMissingCoinbaseHeight indicates the coinbase transaction for a\n\t// block does not start with the serialized block block height as\n\t// required for version 2 and higher blocks.\n\tErrMissingCoinbaseHeight\n\n\t// ErrBadCoinbaseHeight indicates the serialized block height in the\n\t// coinbase transaction for version 2 and higher blocks does not match\n\t// the expected value.\n\tErrBadCoinbaseHeight\n\n\t// ErrScriptMalformed indicates a transaction script is malformed in\n\t// some way.  For example, it might be longer than the maximum allowed\n\t// length or fail to parse.\n\tErrScriptMalformed\n\n\t// ErrScriptValidation indicates the result of executing transaction\n\t// script failed.  The error covers any failure when executing scripts\n\t// such signature verification failures and execution past the end of\n\t// the stack.\n\tErrScriptValidation\n\n\t// ErrUnexpectedWitness indicates that a block includes transactions\n\t// with witness data, but doesn't also have a witness commitment within\n\t// the coinbase transaction.\n\tErrUnexpectedWitness\n\n\t// ErrInvalidWitnessCommitment indicates that a block's witness\n\t// commitment is not well formed.\n\tErrInvalidWitnessCommitment\n\n\t// ErrWitnessCommitmentMismatch indicates that the witness commitment\n\t// included in the block's coinbase transaction doesn't match the\n\t// manually computed witness commitment.\n\tErrWitnessCommitmentMismatch\n\n\t// ErrPreviousBlockUnknown indicates that the previous block is not known.\n\tErrPreviousBlockUnknown\n\n\t// ErrInvalidAncestorBlock indicates that an ancestor of this block has\n\t// already failed validation.\n\tErrInvalidAncestorBlock\n\n\t// ErrPrevBlockNotBest indicates that the block's previous block is not the\n\t// current chain tip. This is not a block validation rule, but is required\n\t// for block proposals submitted via getblocktemplate RPC.\n\tErrPrevBlockNotBest\n\n\t// ErrTimewarpAttack indicates a timewarp attack i.e.\n\t// when block's timestamp is too early on diff adjustment block.\n\tErrTimewarpAttack\n)\n\n// Map of ErrorCode values back to their constant names for pretty printing.\nvar errorCodeStrings = map[ErrorCode]string{\n\tErrDuplicateBlock:            \"ErrDuplicateBlock\",\n\tErrBlockTooBig:               \"ErrBlockTooBig\",\n\tErrBlockVersionTooOld:        \"ErrBlockVersionTooOld\",\n\tErrBlockWeightTooHigh:        \"ErrBlockWeightTooHigh\",\n\tErrInvalidTime:               \"ErrInvalidTime\",\n\tErrTimeTooOld:                \"ErrTimeTooOld\",\n\tErrTimeTooNew:                \"ErrTimeTooNew\",\n\tErrDifficultyTooLow:          \"ErrDifficultyTooLow\",\n\tErrUnexpectedDifficulty:      \"ErrUnexpectedDifficulty\",\n\tErrHighHash:                  \"ErrHighHash\",\n\tErrBadMerkleRoot:             \"ErrBadMerkleRoot\",\n\tErrBadCheckpoint:             \"ErrBadCheckpoint\",\n\tErrForkTooOld:                \"ErrForkTooOld\",\n\tErrCheckpointTimeTooOld:      \"ErrCheckpointTimeTooOld\",\n\tErrNoTransactions:            \"ErrNoTransactions\",\n\tErrNoTxInputs:                \"ErrNoTxInputs\",\n\tErrNoTxOutputs:               \"ErrNoTxOutputs\",\n\tErrTxTooBig:                  \"ErrTxTooBig\",\n\tErrBadTxOutValue:             \"ErrBadTxOutValue\",\n\tErrDuplicateTxInputs:         \"ErrDuplicateTxInputs\",\n\tErrBadTxInput:                \"ErrBadTxInput\",\n\tErrMissingTxOut:              \"ErrMissingTxOut\",\n\tErrUnfinalizedTx:             \"ErrUnfinalizedTx\",\n\tErrDuplicateTx:               \"ErrDuplicateTx\",\n\tErrOverwriteTx:               \"ErrOverwriteTx\",\n\tErrImmatureSpend:             \"ErrImmatureSpend\",\n\tErrSpendTooHigh:              \"ErrSpendTooHigh\",\n\tErrBadFees:                   \"ErrBadFees\",\n\tErrTooManySigOps:             \"ErrTooManySigOps\",\n\tErrFirstTxNotCoinbase:        \"ErrFirstTxNotCoinbase\",\n\tErrMultipleCoinbases:         \"ErrMultipleCoinbases\",\n\tErrBadCoinbaseScriptLen:      \"ErrBadCoinbaseScriptLen\",\n\tErrBadCoinbaseValue:          \"ErrBadCoinbaseValue\",\n\tErrMissingCoinbaseHeight:     \"ErrMissingCoinbaseHeight\",\n\tErrBadCoinbaseHeight:         \"ErrBadCoinbaseHeight\",\n\tErrScriptMalformed:           \"ErrScriptMalformed\",\n\tErrScriptValidation:          \"ErrScriptValidation\",\n\tErrUnexpectedWitness:         \"ErrUnexpectedWitness\",\n\tErrInvalidWitnessCommitment:  \"ErrInvalidWitnessCommitment\",\n\tErrWitnessCommitmentMismatch: \"ErrWitnessCommitmentMismatch\",\n\tErrPreviousBlockUnknown:      \"ErrPreviousBlockUnknown\",\n\tErrInvalidAncestorBlock:      \"ErrInvalidAncestorBlock\",\n\tErrPrevBlockNotBest:          \"ErrPrevBlockNotBest\",\n}\n\n// String returns the ErrorCode as a human-readable name.\nfunc (e ErrorCode) String() string {\n\tif s := errorCodeStrings[e]; s != \"\" {\n\t\treturn s\n\t}\n\treturn fmt.Sprintf(\"Unknown ErrorCode (%d)\", int(e))\n}\n\n// RuleError identifies a rule violation.  It is used to indicate that\n// processing of a block or transaction failed due to one of the many validation\n// rules.  The caller can use type assertions to determine if a failure was\n// specifically due to a rule violation and access the ErrorCode field to\n// ascertain the specific reason for the rule violation.\ntype RuleError struct {\n\tErrorCode   ErrorCode // Describes the kind of error\n\tDescription string    // Human readable description of the issue\n}\n\n// Error satisfies the error interface and prints human-readable errors.\nfunc (e RuleError) Error() string {\n\treturn e.Description\n}\n\n// ruleError creates an RuleError given a set of arguments.\nfunc ruleError(c ErrorCode, desc string) RuleError {\n\treturn RuleError{ErrorCode: c, Description: desc}\n}\n"
  },
  {
    "path": "blockchain/error_test.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"testing\"\n)\n\n// TestErrorCodeStringer tests the stringized output for the ErrorCode type.\nfunc TestErrorCodeStringer(t *testing.T) {\n\ttests := []struct {\n\t\tin   ErrorCode\n\t\twant string\n\t}{\n\t\t{ErrDuplicateBlock, \"ErrDuplicateBlock\"},\n\t\t{ErrBlockTooBig, \"ErrBlockTooBig\"},\n\t\t{ErrBlockWeightTooHigh, \"ErrBlockWeightTooHigh\"},\n\t\t{ErrBlockVersionTooOld, \"ErrBlockVersionTooOld\"},\n\t\t{ErrInvalidTime, \"ErrInvalidTime\"},\n\t\t{ErrTimeTooOld, \"ErrTimeTooOld\"},\n\t\t{ErrTimeTooNew, \"ErrTimeTooNew\"},\n\t\t{ErrDifficultyTooLow, \"ErrDifficultyTooLow\"},\n\t\t{ErrUnexpectedDifficulty, \"ErrUnexpectedDifficulty\"},\n\t\t{ErrHighHash, \"ErrHighHash\"},\n\t\t{ErrBadMerkleRoot, \"ErrBadMerkleRoot\"},\n\t\t{ErrBadCheckpoint, \"ErrBadCheckpoint\"},\n\t\t{ErrForkTooOld, \"ErrForkTooOld\"},\n\t\t{ErrCheckpointTimeTooOld, \"ErrCheckpointTimeTooOld\"},\n\t\t{ErrNoTransactions, \"ErrNoTransactions\"},\n\t\t{ErrNoTxInputs, \"ErrNoTxInputs\"},\n\t\t{ErrNoTxOutputs, \"ErrNoTxOutputs\"},\n\t\t{ErrTxTooBig, \"ErrTxTooBig\"},\n\t\t{ErrBadTxOutValue, \"ErrBadTxOutValue\"},\n\t\t{ErrDuplicateTxInputs, \"ErrDuplicateTxInputs\"},\n\t\t{ErrBadTxInput, \"ErrBadTxInput\"},\n\t\t{ErrBadCheckpoint, \"ErrBadCheckpoint\"},\n\t\t{ErrMissingTxOut, \"ErrMissingTxOut\"},\n\t\t{ErrUnfinalizedTx, \"ErrUnfinalizedTx\"},\n\t\t{ErrDuplicateTx, \"ErrDuplicateTx\"},\n\t\t{ErrOverwriteTx, \"ErrOverwriteTx\"},\n\t\t{ErrImmatureSpend, \"ErrImmatureSpend\"},\n\t\t{ErrSpendTooHigh, \"ErrSpendTooHigh\"},\n\t\t{ErrBadFees, \"ErrBadFees\"},\n\t\t{ErrTooManySigOps, \"ErrTooManySigOps\"},\n\t\t{ErrFirstTxNotCoinbase, \"ErrFirstTxNotCoinbase\"},\n\t\t{ErrMultipleCoinbases, \"ErrMultipleCoinbases\"},\n\t\t{ErrBadCoinbaseScriptLen, \"ErrBadCoinbaseScriptLen\"},\n\t\t{ErrBadCoinbaseValue, \"ErrBadCoinbaseValue\"},\n\t\t{ErrMissingCoinbaseHeight, \"ErrMissingCoinbaseHeight\"},\n\t\t{ErrBadCoinbaseHeight, \"ErrBadCoinbaseHeight\"},\n\t\t{ErrScriptMalformed, \"ErrScriptMalformed\"},\n\t\t{ErrScriptValidation, \"ErrScriptValidation\"},\n\t\t{ErrUnexpectedWitness, \"ErrUnexpectedWitness\"},\n\t\t{ErrInvalidWitnessCommitment, \"ErrInvalidWitnessCommitment\"},\n\t\t{ErrWitnessCommitmentMismatch, \"ErrWitnessCommitmentMismatch\"},\n\t\t{ErrPreviousBlockUnknown, \"ErrPreviousBlockUnknown\"},\n\t\t{ErrInvalidAncestorBlock, \"ErrInvalidAncestorBlock\"},\n\t\t{ErrPrevBlockNotBest, \"ErrPrevBlockNotBest\"},\n\t\t{0xffff, \"Unknown ErrorCode (65535)\"},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.String()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"String #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestRuleError tests the error output for the RuleError type.\nfunc TestRuleError(t *testing.T) {\n\ttests := []struct {\n\t\tin   RuleError\n\t\twant string\n\t}{\n\t\t{\n\t\t\tRuleError{Description: \"duplicate block\"},\n\t\t\t\"duplicate block\",\n\t\t},\n\t\t{\n\t\t\tRuleError{Description: \"human-readable error\"},\n\t\t\t\"human-readable error\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.Error()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"Error #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestDeploymentError tests the stringized output for the DeploymentError type.\nfunc TestDeploymentError(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tin   DeploymentError\n\t\twant string\n\t}{\n\t\t{\n\t\t\tDeploymentError(0),\n\t\t\t\"deployment ID 0 does not exist\",\n\t\t},\n\t\t{\n\t\t\tDeploymentError(10),\n\t\t\t\"deployment ID 10 does not exist\",\n\t\t},\n\t\t{\n\t\t\tDeploymentError(123),\n\t\t\t\"deployment ID 123 does not exist\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.Error()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"Error #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "blockchain/example_test.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain_test\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/database\"\n\t_ \"github.com/btcsuite/btcd/database/ffldb\"\n)\n\n// This example demonstrates how to create a new chain instance and use\n// ProcessBlock to attempt to add a block to the chain.  As the package\n// overview documentation describes, this includes all of the Bitcoin consensus\n// rules.  This example intentionally attempts to insert a duplicate genesis\n// block to illustrate how an invalid block is handled.\nfunc ExampleBlockChain_ProcessBlock() {\n\t// Create a new database to store the accepted blocks into.  Typically\n\t// this would be opening an existing database and would not be deleting\n\t// and creating a new database like this, but it is done here so this is\n\t// a complete working example and does not leave temporary files laying\n\t// around.\n\tdbPath := filepath.Join(os.TempDir(), \"exampleprocessblock\")\n\t_ = os.RemoveAll(dbPath)\n\tdb, err := database.Create(\"ffldb\", dbPath, chaincfg.MainNetParams.Net)\n\tif err != nil {\n\t\tfmt.Printf(\"Failed to create database: %v\\n\", err)\n\t\treturn\n\t}\n\tdefer os.RemoveAll(dbPath)\n\tdefer db.Close()\n\n\t// Create a new BlockChain instance using the underlying database for\n\t// the main bitcoin network.  This example does not demonstrate some\n\t// of the other available configuration options such as specifying a\n\t// notification callback and signature cache.  Also, the caller would\n\t// ordinarily keep a reference to the median time source and add time\n\t// values obtained from other peers on the network so the local time is\n\t// adjusted to be in agreement with other peers.\n\tchain, err := blockchain.New(&blockchain.Config{\n\t\tDB:          db,\n\t\tChainParams: &chaincfg.MainNetParams,\n\t\tTimeSource:  blockchain.NewMedianTime(),\n\t})\n\tif err != nil {\n\t\tfmt.Printf(\"Failed to create chain instance: %v\\n\", err)\n\t\treturn\n\t}\n\n\t// Process a block.  For this example, we are going to intentionally\n\t// cause an error by trying to process the genesis block which already\n\t// exists.\n\tgenesisBlock := btcutil.NewBlock(chaincfg.MainNetParams.GenesisBlock)\n\tisMainChain, isOrphan, err := chain.ProcessBlock(genesisBlock,\n\t\tblockchain.BFNone)\n\tif err != nil {\n\t\tfmt.Printf(\"Failed to process block: %v\\n\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"Block accepted. Is it on the main chain?: %v\", isMainChain)\n\tfmt.Printf(\"Block accepted. Is it an orphan?: %v\", isOrphan)\n\n\t// Output:\n\t// Failed to process block: already have block 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\n}\n\n// This example demonstrates how to convert the compact \"bits\" in a block header\n// which represent the target difficulty to a big integer and display it using\n// the typical hex notation.\nfunc ExampleCompactToBig() {\n\t// Convert the bits from block 300000 in the main block chain.\n\tbits := uint32(419465580)\n\ttargetDifficulty := blockchain.CompactToBig(bits)\n\n\t// Display it in hex.\n\tfmt.Printf(\"%064x\\n\", targetDifficulty.Bytes())\n\n\t// Output:\n\t// 0000000000000000896c00000000000000000000000000000000000000000000\n}\n\n// This example demonstrates how to convert a target difficulty into the compact\n// \"bits\" in a block header which represent that target difficulty .\nfunc ExampleBigToCompact() {\n\t// Convert the target difficulty from block 300000 in the main block\n\t// chain to compact form.\n\tt := \"0000000000000000896c00000000000000000000000000000000000000000000\"\n\ttargetDifficulty, success := new(big.Int).SetString(t, 16)\n\tif !success {\n\t\tfmt.Println(\"invalid target difficulty\")\n\t\treturn\n\t}\n\tbits := blockchain.BigToCompact(targetDifficulty)\n\n\tfmt.Println(bits)\n\n\t// Output:\n\t// 419465580\n}\n"
  },
  {
    "path": "blockchain/fullblocks_test.go",
    "content": "// Copyright (c) 2016 The Decred developers\n// Copyright (c) 2016-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain_test\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/blockchain/fullblocktests\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t_ \"github.com/btcsuite/btcd/database/ffldb\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// testDbType is the database backend type to use for the tests.\n\ttestDbType = \"ffldb\"\n\n\t// testDbRoot is the root directory used to create all test databases.\n\ttestDbRoot = \"testdbs\"\n\n\t// blockDataNet is the expected network in the test block data.\n\tblockDataNet = wire.MainNet\n)\n\n// filesExists returns whether or not the named file or directory exists.\nfunc fileExists(name string) bool {\n\tif _, err := os.Stat(name); err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// isSupportedDbType returns whether or not the passed database type is\n// currently supported.\nfunc isSupportedDbType(dbType string) bool {\n\tsupportedDrivers := database.SupportedDrivers()\n\tfor _, driver := range supportedDrivers {\n\t\tif dbType == driver {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// chainSetup is used to create a new db and chain instance with the genesis\n// block already inserted.  In addition to the new chain instance, it returns\n// a teardown function the caller should invoke when done testing to clean up.\nfunc chainSetup(dbName string, params *chaincfg.Params) (*blockchain.BlockChain, func(), error) {\n\tif !isSupportedDbType(testDbType) {\n\t\treturn nil, nil, fmt.Errorf(\"unsupported db type %v\", testDbType)\n\t}\n\n\t// Handle memory database specially since it doesn't need the disk\n\t// specific handling.\n\tvar db database.DB\n\tvar teardown func()\n\tif testDbType == \"memdb\" {\n\t\tndb, err := database.Create(testDbType)\n\t\tif err != nil {\n\t\t\treturn nil, nil, fmt.Errorf(\"error creating db: %v\", err)\n\t\t}\n\t\tdb = ndb\n\n\t\t// Setup a teardown function for cleaning up.  This function is\n\t\t// returned to the caller to be invoked when it is done testing.\n\t\tteardown = func() {\n\t\t\tdb.Close()\n\t\t}\n\t} else {\n\t\t// Create the root directory for test databases.\n\t\tif !fileExists(testDbRoot) {\n\t\t\tif err := os.MkdirAll(testDbRoot, 0700); err != nil {\n\t\t\t\terr := fmt.Errorf(\"unable to create test db \"+\n\t\t\t\t\t\"root: %v\", err)\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t}\n\n\t\t// Create a new database to store the accepted blocks into.\n\t\tdbPath := filepath.Join(testDbRoot, dbName)\n\t\t_ = os.RemoveAll(dbPath)\n\t\tndb, err := database.Create(testDbType, dbPath, blockDataNet)\n\t\tif err != nil {\n\t\t\treturn nil, nil, fmt.Errorf(\"error creating db: %v\", err)\n\t\t}\n\t\tdb = ndb\n\n\t\t// Setup a teardown function for cleaning up.  This function is\n\t\t// returned to the caller to be invoked when it is done testing.\n\t\tteardown = func() {\n\t\t\tdb.Close()\n\t\t\tos.RemoveAll(dbPath)\n\t\t\tos.RemoveAll(testDbRoot)\n\t\t}\n\t}\n\n\t// Copy the chain params to ensure any modifications the tests do to\n\t// the chain parameters do not affect the global instance.\n\tparamsCopy := *params\n\n\t// Create the main chain instance.\n\tchain, err := blockchain.New(&blockchain.Config{\n\t\tDB:          db,\n\t\tChainParams: &paramsCopy,\n\t\tCheckpoints: nil,\n\t\tTimeSource:  blockchain.NewMedianTime(),\n\t\tSigCache:    txscript.NewSigCache(1000),\n\t})\n\tif err != nil {\n\t\tteardown()\n\t\terr := fmt.Errorf(\"failed to create chain instance: %v\", err)\n\t\treturn nil, nil, err\n\t}\n\treturn chain, teardown, nil\n}\n\n// TestFullBlocks ensures all tests generated by the fullblocktests package\n// have the expected result when processed via ProcessBlock.\nfunc TestFullBlocks(t *testing.T) {\n\ttests, err := fullblocktests.Generate(false)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to generate tests: %v\", err)\n\t}\n\n\t// Create a new database and chain instance to run tests against.\n\tchain, teardownFunc, err := chainSetup(\"fullblocktest\",\n\t\t&chaincfg.RegressionNetParams)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to setup chain instance: %v\", err)\n\t\treturn\n\t}\n\tdefer teardownFunc()\n\n\ttestBlockDisconnectExpectUTXO := func(item fullblocktests.BlockDisconnectExpectUTXO) {\n\t\texpectedCallBack := func(notification *blockchain.Notification) {\n\t\t\tswitch notification.Type {\n\n\t\t\tcase blockchain.NTBlockDisconnected:\n\t\t\t\tblock, ok := notification.Data.(*btcutil.Block)\n\t\t\t\tif !ok {\n\t\t\t\t\tt.Fatalf(\"expected a block\")\n\t\t\t\t}\n\n\t\t\t\t// Return early if the block we get isn't the relevant\n\t\t\t\t// block.\n\t\t\t\tif !block.Hash().IsEqual(&item.BlockHash) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tentry, err := chain.FetchUtxoEntry(item.OutPoint)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\tif entry == nil || entry.IsSpent() {\n\t\t\t\t\tt.Logf(\"expected utxo %v to exist but it's \"+\n\t\t\t\t\t\t\"nil or spent\\n\", item.OutPoint.String())\n\t\t\t\t\tt.Fatalf(\"expected utxo %v to exist but it's \"+\n\t\t\t\t\t\t\"nil or spent\", item.OutPoint.String())\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tunexpectedCallBack := func(notification *blockchain.Notification) {\n\t\t\tswitch notification.Type {\n\t\t\tcase blockchain.NTBlockDisconnected:\n\t\t\t\tblock, ok := notification.Data.(*btcutil.Block)\n\t\t\t\tif !ok {\n\t\t\t\t\tt.Fatalf(\"expected a block\")\n\t\t\t\t}\n\n\t\t\t\t// Return early if the block we get isn't the relevant\n\t\t\t\t// block.\n\t\t\t\tif !block.Hash().IsEqual(&item.BlockHash) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tentry, err := chain.FetchUtxoEntry(item.OutPoint)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\tif entry != nil && !entry.IsSpent() {\n\t\t\t\t\tt.Logf(\"unexpected utxo %v to exist but it's \"+\n\t\t\t\t\t\t\"not nil and not spent\", item.OutPoint.String())\n\t\t\t\t\tt.Fatalf(\"unexpected utxo %v exists but it's \"+\n\t\t\t\t\t\t\"not nil and not spent\\n\", item.OutPoint.String())\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif item.Expected {\n\t\t\tchain.Subscribe(expectedCallBack)\n\t\t} else {\n\t\t\tchain.Subscribe(unexpectedCallBack)\n\t\t}\n\t}\n\n\t// testAcceptedBlock attempts to process the block in the provided test\n\t// instance and ensures that it was accepted according to the flags\n\t// specified in the test.\n\ttestAcceptedBlock := func(item fullblocktests.AcceptedBlock) {\n\t\tblockHeight := item.Height\n\t\tblock := btcutil.NewBlock(item.Block)\n\t\tblock.SetHeight(blockHeight)\n\t\tt.Logf(\"Testing block %s (hash %s, height %d)\",\n\t\t\titem.Name, block.Hash(), blockHeight)\n\n\t\tisMainChain, isOrphan, err := chain.ProcessBlock(block,\n\t\t\tblockchain.BFNone)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"block %q (hash %s, height %d) should \"+\n\t\t\t\t\"have been accepted: %v\", item.Name,\n\t\t\t\tblock.Hash(), blockHeight, err)\n\t\t}\n\n\t\t// Ensure the main chain and orphan flags match the values\n\t\t// specified in the test.\n\t\tif isMainChain != item.IsMainChain {\n\t\t\tt.Fatalf(\"block %q (hash %s, height %d) unexpected main \"+\n\t\t\t\t\"chain flag -- got %v, want %v\", item.Name,\n\t\t\t\tblock.Hash(), blockHeight, isMainChain,\n\t\t\t\titem.IsMainChain)\n\t\t}\n\t\tif isOrphan != item.IsOrphan {\n\t\t\tt.Fatalf(\"block %q (hash %s, height %d) unexpected \"+\n\t\t\t\t\"orphan flag -- got %v, want %v\", item.Name,\n\t\t\t\tblock.Hash(), blockHeight, isOrphan,\n\t\t\t\titem.IsOrphan)\n\t\t}\n\t}\n\n\t// testRejectedBlock attempts to process the block in the provided test\n\t// instance and ensures that it was rejected with the reject code\n\t// specified in the test.\n\ttestRejectedBlock := func(item fullblocktests.RejectedBlock) {\n\t\tblockHeight := item.Height\n\t\tblock := btcutil.NewBlock(item.Block)\n\t\tblock.SetHeight(blockHeight)\n\t\tt.Logf(\"Testing block %s (hash %s, height %d)\",\n\t\t\titem.Name, block.Hash(), blockHeight)\n\n\t\t_, _, err := chain.ProcessBlock(block, blockchain.BFNone)\n\t\tif err == nil {\n\t\t\tt.Fatalf(\"block %q (hash %s, height %d) should not \"+\n\t\t\t\t\"have been accepted\", item.Name, block.Hash(),\n\t\t\t\tblockHeight)\n\t\t}\n\n\t\t// Ensure the error code is of the expected type and the reject\n\t\t// code matches the value specified in the test instance.\n\t\trerr, ok := err.(blockchain.RuleError)\n\t\tif !ok {\n\t\t\tt.Fatalf(\"block %q (hash %s, height %d) returned \"+\n\t\t\t\t\"unexpected error type -- got %T, want \"+\n\t\t\t\t\"blockchain.RuleError\", item.Name, block.Hash(),\n\t\t\t\tblockHeight, err)\n\t\t}\n\t\tif rerr.ErrorCode != item.RejectCode {\n\t\t\tt.Fatalf(\"block %q (hash %s, height %d) does not have \"+\n\t\t\t\t\"expected reject code -- got %v, want %v\",\n\t\t\t\titem.Name, block.Hash(), blockHeight,\n\t\t\t\trerr.ErrorCode, item.RejectCode)\n\t\t}\n\t}\n\n\t// testRejectedNonCanonicalBlock attempts to decode the block in the\n\t// provided test instance and ensures that it failed to decode with a\n\t// message error.\n\ttestRejectedNonCanonicalBlock := func(item fullblocktests.RejectedNonCanonicalBlock) {\n\t\theaderLen := len(item.RawBlock)\n\t\tif headerLen > 80 {\n\t\t\theaderLen = 80\n\t\t}\n\t\tblockHash := chainhash.DoubleHashH(item.RawBlock[0:headerLen])\n\t\tblockHeight := item.Height\n\t\tt.Logf(\"Testing block %s (hash %s, height %d)\", item.Name,\n\t\t\tblockHash, blockHeight)\n\n\t\t// Ensure there is an error due to deserializing the block.\n\t\tvar msgBlock wire.MsgBlock\n\t\terr := msgBlock.BtcDecode(bytes.NewReader(item.RawBlock), 0, wire.BaseEncoding)\n\t\tif _, ok := err.(*wire.MessageError); !ok {\n\t\t\tt.Fatalf(\"block %q (hash %s, height %d) should have \"+\n\t\t\t\t\"failed to decode\", item.Name, blockHash,\n\t\t\t\tblockHeight)\n\t\t}\n\t}\n\n\t// testOrphanOrRejectedBlock attempts to process the block in the\n\t// provided test instance and ensures that it was either accepted as an\n\t// orphan or rejected with a rule violation.\n\ttestOrphanOrRejectedBlock := func(item fullblocktests.OrphanOrRejectedBlock) {\n\t\tblockHeight := item.Height\n\t\tblock := btcutil.NewBlock(item.Block)\n\t\tblock.SetHeight(blockHeight)\n\t\tt.Logf(\"Testing block %s (hash %s, height %d)\",\n\t\t\titem.Name, block.Hash(), blockHeight)\n\n\t\t_, isOrphan, err := chain.ProcessBlock(block, blockchain.BFNone)\n\t\tif err != nil {\n\t\t\t// Ensure the error code is of the expected type.\n\t\t\tif _, ok := err.(blockchain.RuleError); !ok {\n\t\t\t\tt.Fatalf(\"block %q (hash %s, height %d) \"+\n\t\t\t\t\t\"returned unexpected error type -- \"+\n\t\t\t\t\t\"got %T, want blockchain.RuleError\",\n\t\t\t\t\titem.Name, block.Hash(), blockHeight,\n\t\t\t\t\terr)\n\t\t\t}\n\t\t}\n\n\t\tif !isOrphan {\n\t\t\tt.Fatalf(\"block %q (hash %s, height %d) was accepted, \"+\n\t\t\t\t\"but is not considered an orphan\", item.Name,\n\t\t\t\tblock.Hash(), blockHeight)\n\t\t}\n\t}\n\n\t// testExpectedTip ensures the current tip of the blockchain is the\n\t// block specified in the provided test instance.\n\ttestExpectedTip := func(item fullblocktests.ExpectedTip) {\n\t\tblockHeight := item.Height\n\t\tblock := btcutil.NewBlock(item.Block)\n\t\tblock.SetHeight(blockHeight)\n\t\tt.Logf(\"Testing tip for block %s (hash %s, height %d)\",\n\t\t\titem.Name, block.Hash(), blockHeight)\n\n\t\t// Ensure hash and height match.\n\t\tbest := chain.BestSnapshot()\n\t\tif best.Hash != item.Block.BlockHash() ||\n\t\t\tbest.Height != blockHeight {\n\n\t\t\tt.Fatalf(\"block %q (hash %s, height %d) should be \"+\n\t\t\t\t\"the current tip -- got (hash %s, height %d)\",\n\t\t\t\titem.Name, block.Hash(), blockHeight, best.Hash,\n\t\t\t\tbest.Height)\n\t\t}\n\t}\n\n\tfor testNum, test := range tests {\n\t\tfor itemNum, item := range test {\n\t\t\tswitch item := item.(type) {\n\t\t\tcase fullblocktests.AcceptedBlock:\n\t\t\t\ttestAcceptedBlock(item)\n\t\t\tcase fullblocktests.RejectedBlock:\n\t\t\t\ttestRejectedBlock(item)\n\t\t\tcase fullblocktests.RejectedNonCanonicalBlock:\n\t\t\t\ttestRejectedNonCanonicalBlock(item)\n\t\t\tcase fullblocktests.OrphanOrRejectedBlock:\n\t\t\t\ttestOrphanOrRejectedBlock(item)\n\t\t\tcase fullblocktests.ExpectedTip:\n\t\t\t\ttestExpectedTip(item)\n\t\t\tcase fullblocktests.BlockDisconnectExpectUTXO:\n\t\t\t\ttestBlockDisconnectExpectUTXO(item)\n\t\t\tdefault:\n\t\t\t\tt.Fatalf(\"test #%d, item #%d is not one of \"+\n\t\t\t\t\t\"the supported test instance types -- \"+\n\t\t\t\t\t\"got type: %T\", testNum, itemNum, item)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blockchain/fullblocktests/README.md",
    "content": "fullblocktests\n==============\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain/fullblocktests)\n\nPackage fullblocktests provides a set of full block tests to be used for testing\nthe consensus validation rules.  The tests are intended to be flexible enough to\nallow both unit-style tests directly against the blockchain code as well as\nintegration style tests over the peer-to-peer network.  To achieve that goal,\neach test contains additional information about the expected result, however\nthat information can be ignored when doing comparison tests between two\nindependent versions over the peer-to-peer network.\n\nThis package has intentionally been designed so it can be used as a standalone\npackage for any projects needing to test their implementation against a full set\nof blocks that exercise the consensus validation rules.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/blockchain/fullblocktests\n```\n\n## License\n\nPackage fullblocktests is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "blockchain/fullblocktests/doc.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage fullblocktests provides a set of block consensus validation tests.\n\nAll of the generated test instances involve full blocks that are to be used for\ntesting the consensus validation rules.  The tests are intended to be flexible\nenough to allow both unit-style tests directly against the blockchain code as\nwell as integration style tests over the peer-to-peer network.  To achieve that\ngoal, each test contains additional information about the expected result,\nhowever that information can be ignored when doing comparison tests between two\nindependent versions over the peer-to-peer network.\n\nThis package has intentionally been designed so it can be used as a standalone\npackage for any projects needing to test their implementation against a full set\nof blocks that exercise the consensus validation rules.\n*/\npackage fullblocktests\n"
  },
  {
    "path": "blockchain/fullblocktests/generate.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// The vast majority of the rules tested in this package were ported from the\n// the original Java-based 'official' block acceptance tests at\n// https://github.com/TheBlueMatt/test-scripts as well as some additional tests\n// available in the Core python port of the same.\n\npackage fullblocktests\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/blockchain/internal/testhelper\"\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// Intentionally defined here rather than using constants from codebase\n\t// to ensure consensus changes are detected.\n\tmaxBlockSigOps       = 20000\n\tmaxBlockSize         = 1000000\n\tminCoinbaseScriptLen = 2\n\tmaxCoinbaseScriptLen = 100\n\tmedianTimeBlocks     = 11\n\tmaxScriptElementSize = 520\n\n\t// numLargeReorgBlocks is the number of blocks to use in the large block\n\t// reorg test (when enabled).  This is the equivalent of 1 week's worth\n\t// of blocks.\n\tnumLargeReorgBlocks = 1088\n)\n\n// TestInstance is an interface that describes a specific test instance returned\n// by the tests generated in this package.  It should be type asserted to one\n// of the concrete test instance types in order to test accordingly.\ntype TestInstance interface {\n\tFullBlockTestInstance()\n}\n\n// AcceptedBlock defines a test instance that expects a block to be accepted to\n// the blockchain either by extending the main chain, on a side chain, or as an\n// orphan.\ntype AcceptedBlock struct {\n\tName        string\n\tBlock       *wire.MsgBlock\n\tHeight      int32\n\tIsMainChain bool\n\tIsOrphan    bool\n}\n\n// Ensure AcceptedBlock implements the TestInstance interface.\nvar _ TestInstance = AcceptedBlock{}\n\n// FullBlockTestInstance only exists to allow AcceptedBlock to be treated as a\n// TestInstance.\n//\n// This implements the TestInstance interface.\nfunc (b AcceptedBlock) FullBlockTestInstance() {}\n\n// RejectedBlock defines a test instance that expects a block to be rejected by\n// the blockchain consensus rules.\ntype RejectedBlock struct {\n\tName       string\n\tBlock      *wire.MsgBlock\n\tHeight     int32\n\tRejectCode blockchain.ErrorCode\n}\n\n// Ensure RejectedBlock implements the TestInstance interface.\nvar _ TestInstance = RejectedBlock{}\n\n// FullBlockTestInstance only exists to allow RejectedBlock to be treated as a\n// TestInstance.\n//\n// This implements the TestInstance interface.\nfunc (b RejectedBlock) FullBlockTestInstance() {}\n\n// OrphanOrRejectedBlock defines a test instance that expects a block to either\n// be accepted as an orphan or rejected.  This is useful since some\n// implementations might optimize the immediate rejection of orphan blocks when\n// their parent was previously rejected, while others might accept it as an\n// orphan that eventually gets flushed (since the parent can never be accepted\n// to ultimately link it).\ntype OrphanOrRejectedBlock struct {\n\tName   string\n\tBlock  *wire.MsgBlock\n\tHeight int32\n}\n\n// Ensure ExpectedTip implements the TestInstance interface.\nvar _ TestInstance = OrphanOrRejectedBlock{}\n\n// FullBlockTestInstance only exists to allow OrphanOrRejectedBlock to be\n// treated as a TestInstance.\n//\n// This implements the TestInstance interface.\nfunc (b OrphanOrRejectedBlock) FullBlockTestInstance() {}\n\n// ExpectedTip defines a test instance that expects a block to be the current\n// tip of the main chain.\ntype ExpectedTip struct {\n\tName   string\n\tBlock  *wire.MsgBlock\n\tHeight int32\n}\n\n// Ensure ExpectedTip implements the TestInstance interface.\nvar _ TestInstance = ExpectedTip{}\n\n// FullBlockTestInstance only exists to allow ExpectedTip to be treated as a\n// TestInstance.\n//\n// This implements the TestInstance interface.\nfunc (b ExpectedTip) FullBlockTestInstance() {}\n\n// RejectedNonCanonicalBlock defines a test instance that expects a serialized\n// block that is not canonical and therefore should be rejected.\ntype RejectedNonCanonicalBlock struct {\n\tName     string\n\tRawBlock []byte\n\tHeight   int32\n}\n\n// FullBlockTestInstance only exists to allow RejectedNonCanonicalBlock to be treated as\n// a TestInstance.\n//\n// This implements the TestInstance interface.\nfunc (b RejectedNonCanonicalBlock) FullBlockTestInstance() {}\n\n// BlockDisconnectExpectUTXO defines a test instance that tests an utxo to exist or not\n// exist after a specified block has been disconnected.\ntype BlockDisconnectExpectUTXO struct {\n\tName      string\n\tExpected  bool\n\tBlockHash chainhash.Hash\n\tOutPoint  wire.OutPoint\n}\n\n// FullBlockTestInstance only exists to allow BlockDisconnectExpectUTXO to be treated as\n// a TestInstance.\n//\n// This implements the TestInstance interface.\nfunc (b BlockDisconnectExpectUTXO) FullBlockTestInstance() {}\n\n// testGenerator houses state used to easy the process of generating test blocks\n// that build from one another along with housing other useful things such as\n// available spendable outputs used throughout the tests.\ntype testGenerator struct {\n\tparams       *chaincfg.Params\n\ttip          *wire.MsgBlock\n\ttipName      string\n\ttipHeight    int32\n\tblocks       map[chainhash.Hash]*wire.MsgBlock\n\tblocksByName map[string]*wire.MsgBlock\n\tblockHeights map[string]int32\n\n\t// Used for tracking spendable coinbase outputs.\n\tspendableOuts     []testhelper.SpendableOut\n\tprevCollectedHash chainhash.Hash\n\n\t// Common key for any tests which require signed transactions.\n\tprivKey *btcec.PrivateKey\n}\n\n// makeTestGenerator returns a test generator instance initialized with the\n// genesis block as the tip.\nfunc makeTestGenerator(params *chaincfg.Params) (testGenerator, error) {\n\tprivKey, _ := btcec.PrivKeyFromBytes([]byte{0x01})\n\tgenesis := params.GenesisBlock\n\tgenesisHash := genesis.BlockHash()\n\treturn testGenerator{\n\t\tparams:       params,\n\t\tblocks:       map[chainhash.Hash]*wire.MsgBlock{genesisHash: genesis},\n\t\tblocksByName: map[string]*wire.MsgBlock{\"genesis\": genesis},\n\t\tblockHeights: map[string]int32{\"genesis\": 0},\n\t\ttip:          genesis,\n\t\ttipName:      \"genesis\",\n\t\ttipHeight:    0,\n\t\tprivKey:      privKey,\n\t}, nil\n}\n\n// payToScriptHashScript returns a standard pay-to-script-hash for the provided\n// redeem script.\nfunc payToScriptHashScript(redeemScript []byte) []byte {\n\tredeemScriptHash := btcutil.Hash160(redeemScript)\n\tscript, err := txscript.NewScriptBuilder().\n\t\tAddOp(txscript.OP_HASH160).AddData(redeemScriptHash).\n\t\tAddOp(txscript.OP_EQUAL).Script()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn script\n}\n\n// pushDataScript returns a script with the provided items individually pushed\n// to the stack.\nfunc pushDataScript(items ...[]byte) []byte {\n\tbuilder := txscript.NewScriptBuilder()\n\tfor _, item := range items {\n\t\tbuilder.AddData(item)\n\t}\n\tscript, err := builder.Script()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn script\n}\n\n// createCoinbaseTx returns a coinbase transaction paying an appropriate\n// subsidy based on the passed block height.  The coinbase signature script\n// conforms to the requirements of version 2 blocks.\nfunc (g *testGenerator) createCoinbaseTx(blockHeight int32) *wire.MsgTx {\n\treturn testhelper.CreateCoinbaseTx(\n\t\tblockHeight, blockchain.CalcBlockSubsidy(blockHeight, g.params))\n}\n\n// calcMerkleRoot creates a merkle tree from the slice of transactions and\n// returns the root of the tree.\nfunc calcMerkleRoot(txns []*wire.MsgTx) chainhash.Hash {\n\tif len(txns) == 0 {\n\t\treturn chainhash.Hash{}\n\t}\n\n\tutilTxns := make([]*btcutil.Tx, 0, len(txns))\n\tfor _, tx := range txns {\n\t\tutilTxns = append(utilTxns, btcutil.NewTx(tx))\n\t}\n\treturn blockchain.CalcMerkleRoot(utilTxns, false)\n}\n\n// additionalCoinbase returns a function that itself takes a block and\n// modifies it by adding the provided amount to coinbase subsidy.\nfunc additionalCoinbase(amount btcutil.Amount) func(*wire.MsgBlock) {\n\treturn func(b *wire.MsgBlock) {\n\t\t// Increase the first proof-of-work coinbase subsidy by the\n\t\t// provided amount.\n\t\tb.Transactions[0].TxOut[0].Value += int64(amount)\n\t}\n}\n\n// additionalSpendFee returns a function that itself takes a block and modifies\n// it by adding the provided fee to the spending transaction.\n//\n// NOTE: The coinbase value is NOT updated to reflect the additional fee.  Use\n// 'additionalCoinbase' for that purpose.\nfunc additionalSpendFee(fee btcutil.Amount) func(*wire.MsgBlock) {\n\treturn func(b *wire.MsgBlock) {\n\t\t// Increase the fee of the spending transaction by reducing the\n\t\t// amount paid.\n\t\tif int64(fee) > b.Transactions[1].TxOut[0].Value {\n\t\t\tpanic(fmt.Sprintf(\"additionalSpendFee: fee of %d \"+\n\t\t\t\t\"exceeds available spend transaction value\",\n\t\t\t\tfee))\n\t\t}\n\t\tb.Transactions[1].TxOut[0].Value -= int64(fee)\n\t}\n}\n\n// replaceSpendScript returns a function that itself takes a block and modifies\n// it by replacing the public key script of the spending transaction.\nfunc replaceSpendScript(pkScript []byte) func(*wire.MsgBlock) {\n\treturn func(b *wire.MsgBlock) {\n\t\tb.Transactions[1].TxOut[0].PkScript = pkScript\n\t}\n}\n\n// replaceCoinbaseSigScript returns a function that itself takes a block and\n// modifies it by replacing the signature key script of the coinbase.\nfunc replaceCoinbaseSigScript(script []byte) func(*wire.MsgBlock) {\n\treturn func(b *wire.MsgBlock) {\n\t\tb.Transactions[0].TxIn[0].SignatureScript = script\n\t}\n}\n\n// additionalTx returns a function that itself takes a block and modifies it by\n// adding the provided transaction.\nfunc additionalTx(tx *wire.MsgTx) func(*wire.MsgBlock) {\n\treturn func(b *wire.MsgBlock) {\n\t\tb.AddTransaction(tx)\n\t}\n}\n\n// createSpendTxForTx creates a transaction that spends from the first output of\n// the provided transaction and includes an additional unique OP_RETURN output\n// to ensure the transaction ends up with a unique hash.  The public key script\n// is a simple OP_TRUE script which avoids the need to track addresses and\n// signature scripts in the tests.  The signature script is nil.\nfunc createSpendTxForTx(tx *wire.MsgTx, fee btcutil.Amount) *wire.MsgTx {\n\tspend := testhelper.MakeSpendableOutForTx(tx, 0)\n\treturn testhelper.CreateSpendTx(&spend, fee)\n}\n\n// nextBlock builds a new block that extends the current tip associated with the\n// generator and updates the generator's tip to the newly generated block.\n//\n// The block will include the following:\n// - A coinbase that pays the required subsidy to an OP_TRUE script\n// - When a spendable output is provided:\n//   - A transaction that spends from the provided output the following outputs:\n//   - One that pays the inputs amount minus 1 atom to an OP_TRUE script\n//   - One that contains an OP_RETURN output with a random uint64 in order to\n//     ensure the transaction has a unique hash\n//\n// Additionally, if one or more munge functions are specified, they will be\n// invoked with the block prior to solving it.  This provides callers with the\n// opportunity to modify the block which is especially useful for testing.\n//\n// In order to simply the logic in the munge functions, the following rules are\n// applied after all munge functions have been invoked:\n// - The merkle root will be recalculated unless it was manually changed\n// - The block will be solved unless the nonce was changed\nfunc (g *testGenerator) nextBlock(blockName string, spend *testhelper.SpendableOut, mungers ...func(*wire.MsgBlock)) *wire.MsgBlock {\n\t// Create coinbase transaction for the block using any additional\n\t// subsidy if specified.\n\tnextHeight := g.tipHeight + 1\n\tcoinbaseTx := g.createCoinbaseTx(nextHeight)\n\ttxns := []*wire.MsgTx{coinbaseTx}\n\tif spend != nil {\n\t\t// Create the transaction with a fee of 1 atom for the\n\t\t// miner and increase the coinbase subsidy accordingly.\n\t\tfee := btcutil.Amount(1)\n\t\tcoinbaseTx.TxOut[0].Value += int64(fee)\n\n\t\t// Create a transaction that spends from the provided spendable\n\t\t// output and includes an additional unique OP_RETURN output to\n\t\t// ensure the transaction ends up with a unique hash, then add\n\t\t// add it to the list of transactions to include in the block.\n\t\t// The script is a simple OP_TRUE script in order to avoid the\n\t\t// need to track addresses and signature scripts in the tests.\n\t\ttxns = append(txns, testhelper.CreateSpendTx(spend, fee))\n\t}\n\n\t// Use a timestamp that is one second after the previous block unless\n\t// this is the first block in which case the current time is used.\n\tvar ts time.Time\n\tif nextHeight == 1 {\n\t\tts = time.Unix(time.Now().Unix(), 0)\n\t} else {\n\t\tts = g.tip.Header.Timestamp.Add(time.Second)\n\t}\n\n\tblock := wire.MsgBlock{\n\t\tHeader: wire.BlockHeader{\n\t\t\tVersion:    1,\n\t\t\tPrevBlock:  g.tip.BlockHash(),\n\t\t\tMerkleRoot: calcMerkleRoot(txns),\n\t\t\tBits:       g.params.PowLimitBits,\n\t\t\tTimestamp:  ts,\n\t\t\tNonce:      0, // To be solved.\n\t\t},\n\t\tTransactions: txns,\n\t}\n\n\t// Perform any block munging just before solving.  Only recalculate the\n\t// merkle root if it wasn't manually changed by a munge function.\n\tcurMerkleRoot := block.Header.MerkleRoot\n\tcurNonce := block.Header.Nonce\n\tfor _, f := range mungers {\n\t\tf(&block)\n\t}\n\tif block.Header.MerkleRoot == curMerkleRoot {\n\t\tblock.Header.MerkleRoot = calcMerkleRoot(block.Transactions)\n\t}\n\n\t// Only solve the block if the nonce wasn't manually changed by a munge\n\t// function.\n\tif block.Header.Nonce == curNonce && !testhelper.SolveBlock(&block.Header) {\n\t\tpanic(fmt.Sprintf(\"Unable to solve block at height %d\",\n\t\t\tnextHeight))\n\t}\n\n\t// Update generator state and return the block.\n\tblockHash := block.BlockHash()\n\tg.blocks[blockHash] = &block\n\tg.blocksByName[blockName] = &block\n\tg.blockHeights[blockName] = nextHeight\n\tg.tip = &block\n\tg.tipName = blockName\n\tg.tipHeight = nextHeight\n\treturn &block\n}\n\n// updateBlockState manually updates the generator state to remove all internal\n// map references to a block via its old hash and insert new ones for the new\n// block hash.  This is useful if the test code has to manually change a block\n// after 'nextBlock' has returned.\nfunc (g *testGenerator) updateBlockState(oldBlockName string, oldBlockHash chainhash.Hash, newBlockName string, newBlock *wire.MsgBlock) {\n\t// Look up the height from the existing entries.\n\tblockHeight := g.blockHeights[oldBlockName]\n\n\t// Remove existing entries.\n\tdelete(g.blocks, oldBlockHash)\n\tdelete(g.blocksByName, oldBlockName)\n\tdelete(g.blockHeights, oldBlockName)\n\n\t// Add new entries.\n\tnewBlockHash := newBlock.BlockHash()\n\tg.blocks[newBlockHash] = newBlock\n\tg.blocksByName[newBlockName] = newBlock\n\tg.blockHeights[newBlockName] = blockHeight\n}\n\n// setTip changes the tip of the instance to the block with the provided name.\n// This is useful since the tip is used for things such as generating subsequent\n// blocks.\nfunc (g *testGenerator) setTip(blockName string) {\n\tg.tip = g.blocksByName[blockName]\n\tg.tipName = blockName\n\tg.tipHeight = g.blockHeights[blockName]\n}\n\n// oldestCoinbaseOuts removes the oldest coinbase output that was previously\n// saved to the generator and returns the set as a slice.\nfunc (g *testGenerator) oldestCoinbaseOut() testhelper.SpendableOut {\n\top := g.spendableOuts[0]\n\tg.spendableOuts = g.spendableOuts[1:]\n\treturn op\n}\n\n// saveTipCoinbaseOut adds the coinbase tx output in the current tip block to\n// the list of spendable outputs.\nfunc (g *testGenerator) saveTipCoinbaseOut() {\n\tg.spendableOuts = append(g.spendableOuts, testhelper.MakeSpendableOut(g.tip, 0, 0))\n\tg.prevCollectedHash = g.tip.BlockHash()\n}\n\n// saveSpendableCoinbaseOuts adds all coinbase outputs from the last block that\n// had its coinbase tx output collected to the current tip.  This is useful to\n// batch the collection of coinbase outputs once the tests reach a stable point\n// so they don't have to manually add them for the right tests which will\n// ultimately end up being the best chain.\nfunc (g *testGenerator) saveSpendableCoinbaseOuts() {\n\t// Ensure tip is reset to the current one when done.\n\tcurTipName := g.tipName\n\tdefer g.setTip(curTipName)\n\n\t// Loop through the ancestors of the current tip until the\n\t// reaching the block that has already had the coinbase outputs\n\t// collected.\n\tvar collectBlocks []*wire.MsgBlock\n\tfor b := g.tip; b != nil; b = g.blocks[b.Header.PrevBlock] {\n\t\tif b.BlockHash() == g.prevCollectedHash {\n\t\t\tbreak\n\t\t}\n\t\tcollectBlocks = append(collectBlocks, b)\n\t}\n\tfor i := range collectBlocks {\n\t\tg.tip = collectBlocks[len(collectBlocks)-1-i]\n\t\tg.saveTipCoinbaseOut()\n\t}\n}\n\n// nonCanonicalVarInt return a variable-length encoded integer that is encoded\n// with 9 bytes even though it could be encoded with a minimal canonical\n// encoding.\nfunc nonCanonicalVarInt(val uint32) []byte {\n\tvar rv [9]byte\n\trv[0] = 0xff\n\tbinary.LittleEndian.PutUint64(rv[1:], uint64(val))\n\treturn rv[:]\n}\n\n// encodeNonCanonicalBlock serializes the block in a non-canonical way by\n// encoding the number of transactions using a variable-length encoded integer\n// with 9 bytes even though it should be encoded with a minimal canonical\n// encoding.\nfunc encodeNonCanonicalBlock(b *wire.MsgBlock) []byte {\n\tvar buf bytes.Buffer\n\tb.Header.BtcEncode(&buf, 0, wire.BaseEncoding)\n\tbuf.Write(nonCanonicalVarInt(uint32(len(b.Transactions))))\n\tfor _, tx := range b.Transactions {\n\t\ttx.BtcEncode(&buf, 0, wire.BaseEncoding)\n\t}\n\treturn buf.Bytes()\n}\n\n// cloneBlock returns a deep copy of the provided block.\nfunc cloneBlock(b *wire.MsgBlock) wire.MsgBlock {\n\tvar blockCopy wire.MsgBlock\n\tblockCopy.Header = b.Header\n\tfor _, tx := range b.Transactions {\n\t\tblockCopy.AddTransaction(tx.Copy())\n\t}\n\treturn blockCopy\n}\n\n// repeatOpcode returns a byte slice with the provided opcode repeated the\n// specified number of times.\nfunc repeatOpcode(opcode uint8, numRepeats int) []byte {\n\treturn bytes.Repeat([]byte{opcode}, numRepeats)\n}\n\n// assertScriptSigOpsCount panics if the provided script does not have the\n// specified number of signature operations.\nfunc assertScriptSigOpsCount(script []byte, expected int) {\n\tnumSigOps := txscript.GetSigOpCount(script)\n\tif numSigOps != expected {\n\t\t_, file, line, _ := runtime.Caller(1)\n\t\tpanic(fmt.Sprintf(\"assertion failed at %s:%d: generated number \"+\n\t\t\t\"of sigops for script is %d instead of expected %d\",\n\t\t\tfile, line, numSigOps, expected))\n\t}\n}\n\n// countBlockSigOps returns the number of legacy signature operations in the\n// scripts in the passed block.\nfunc countBlockSigOps(block *wire.MsgBlock) int {\n\ttotalSigOps := 0\n\tfor _, tx := range block.Transactions {\n\t\tfor _, txIn := range tx.TxIn {\n\t\t\tnumSigOps := txscript.GetSigOpCount(txIn.SignatureScript)\n\t\t\ttotalSigOps += numSigOps\n\t\t}\n\t\tfor _, txOut := range tx.TxOut {\n\t\t\tnumSigOps := txscript.GetSigOpCount(txOut.PkScript)\n\t\t\ttotalSigOps += numSigOps\n\t\t}\n\t}\n\n\treturn totalSigOps\n}\n\n// assertTipBlockSigOpsCount panics if the current tip block associated with the\n// generator does not have the specified number of signature operations.\nfunc (g *testGenerator) assertTipBlockSigOpsCount(expected int) {\n\tnumSigOps := countBlockSigOps(g.tip)\n\tif numSigOps != expected {\n\t\tpanic(fmt.Sprintf(\"generated number of sigops for block %q \"+\n\t\t\t\"(height %d) is %d instead of expected %d\", g.tipName,\n\t\t\tg.tipHeight, numSigOps, expected))\n\t}\n}\n\n// assertTipBlockSize panics if the if the current tip block associated with the\n// generator does not have the specified size when serialized.\nfunc (g *testGenerator) assertTipBlockSize(expected int) {\n\tserializeSize := g.tip.SerializeSize()\n\tif serializeSize != expected {\n\t\tpanic(fmt.Sprintf(\"block size of block %q (height %d) is %d \"+\n\t\t\t\"instead of expected %d\", g.tipName, g.tipHeight,\n\t\t\tserializeSize, expected))\n\t}\n}\n\n// assertTipNonCanonicalBlockSize panics if the if the current tip block\n// associated with the generator does not have the specified non-canonical size\n// when serialized.\nfunc (g *testGenerator) assertTipNonCanonicalBlockSize(expected int) {\n\tserializeSize := len(encodeNonCanonicalBlock(g.tip))\n\tif serializeSize != expected {\n\t\tpanic(fmt.Sprintf(\"block size of block %q (height %d) is %d \"+\n\t\t\t\"instead of expected %d\", g.tipName, g.tipHeight,\n\t\t\tserializeSize, expected))\n\t}\n}\n\n// assertTipBlockNumTxns panics if the number of transactions in the current tip\n// block associated with the generator does not match the specified value.\nfunc (g *testGenerator) assertTipBlockNumTxns(expected int) {\n\tnumTxns := len(g.tip.Transactions)\n\tif numTxns != expected {\n\t\tpanic(fmt.Sprintf(\"number of txns in block %q (height %d) is \"+\n\t\t\t\"%d instead of expected %d\", g.tipName, g.tipHeight,\n\t\t\tnumTxns, expected))\n\t}\n}\n\n// assertTipBlockHash panics if the current tip block associated with the\n// generator does not match the specified hash.\nfunc (g *testGenerator) assertTipBlockHash(expected chainhash.Hash) {\n\thash := g.tip.BlockHash()\n\tif hash != expected {\n\t\tpanic(fmt.Sprintf(\"block hash of block %q (height %d) is %v \"+\n\t\t\t\"instead of expected %v\", g.tipName, g.tipHeight, hash,\n\t\t\texpected))\n\t}\n}\n\n// assertTipBlockMerkleRoot panics if the merkle root in header of the current\n// tip block associated with the generator does not match the specified hash.\nfunc (g *testGenerator) assertTipBlockMerkleRoot(expected chainhash.Hash) {\n\thash := g.tip.Header.MerkleRoot\n\tif hash != expected {\n\t\tpanic(fmt.Sprintf(\"merkle root of block %q (height %d) is %v \"+\n\t\t\t\"instead of expected %v\", g.tipName, g.tipHeight, hash,\n\t\t\texpected))\n\t}\n}\n\n// assertTipBlockTxOutOpReturn panics if the current tip block associated with\n// the generator does not have an OP_RETURN script for the transaction output at\n// the provided tx index and output index.\nfunc (g *testGenerator) assertTipBlockTxOutOpReturn(txIndex, txOutIndex uint32) {\n\tif txIndex >= uint32(len(g.tip.Transactions)) {\n\t\tpanic(fmt.Sprintf(\"Transaction index %d in block %q \"+\n\t\t\t\"(height %d) does not exist\", txIndex, g.tipName,\n\t\t\tg.tipHeight))\n\t}\n\n\ttx := g.tip.Transactions[txIndex]\n\tif txOutIndex >= uint32(len(tx.TxOut)) {\n\t\tpanic(fmt.Sprintf(\"transaction index %d output %d in block %q \"+\n\t\t\t\"(height %d) does not exist\", txIndex, txOutIndex,\n\t\t\tg.tipName, g.tipHeight))\n\t}\n\n\ttxOut := tx.TxOut[txOutIndex]\n\tif txOut.PkScript[0] != txscript.OP_RETURN {\n\t\tpanic(fmt.Sprintf(\"transaction index %d output %d in block %q \"+\n\t\t\t\"(height %d) is not an OP_RETURN\", txIndex, txOutIndex,\n\t\t\tg.tipName, g.tipHeight))\n\t}\n}\n\n// Generate returns a slice of tests that can be used to exercise the consensus\n// validation rules.  The tests are intended to be flexible enough to allow both\n// unit-style tests directly against the blockchain code as well as integration\n// style tests over the peer-to-peer network.  To achieve that goal, each test\n// contains additional information about the expected result, however that\n// information can be ignored when doing comparison tests between two\n// independent versions over the peer-to-peer network.\nfunc Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) {\n\t// In order to simplify the generation code which really should never\n\t// fail unless the test code itself is broken, panics are used\n\t// internally.  This deferred func ensures any panics don't escape the\n\t// generator by replacing the named error return with the underlying\n\t// panic error.\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\ttests = nil\n\n\t\t\tswitch rt := r.(type) {\n\t\t\tcase string:\n\t\t\t\terr = errors.New(rt)\n\t\t\tcase error:\n\t\t\t\terr = rt\n\t\t\tdefault:\n\t\t\t\terr = errors.New(\"Unknown panic\")\n\t\t\t}\n\t\t}\n\t}()\n\n\t// Create a test generator instance initialized with the genesis block\n\t// as the tip.\n\tg, err := makeTestGenerator(regressionNetParams)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Define some convenience helper functions to return an individual test\n\t// instance that has the described characteristics.\n\t//\n\t// acceptBlock creates a test instance that expects the provided block\n\t// to be accepted by the consensus rules.\n\t//\n\t// rejectBlock creates a test instance that expects the provided block\n\t// to be rejected by the consensus rules.\n\t//\n\t// rejectNonCanonicalBlock creates a test instance that encodes the\n\t// provided block using a non-canonical encoded as described by the\n\t// encodeNonCanonicalBlock function and expected it to be rejected.\n\t//\n\t// orphanOrRejectBlock creates a test instance that expected the\n\t// provided block to either by accepted as an orphan or rejected by the\n\t// consensus rules.\n\t//\n\t// expectTipBlock creates a test instance that expects the provided\n\t// block to be the current tip of the block chain.\n\tacceptBlock := func(blockName string, block *wire.MsgBlock, isMainChain, isOrphan bool) TestInstance {\n\t\tblockHeight := g.blockHeights[blockName]\n\t\treturn AcceptedBlock{blockName, block, blockHeight, isMainChain,\n\t\t\tisOrphan}\n\t}\n\trejectBlock := func(blockName string, block *wire.MsgBlock, code blockchain.ErrorCode) TestInstance {\n\t\tblockHeight := g.blockHeights[blockName]\n\t\treturn RejectedBlock{blockName, block, blockHeight, code}\n\t}\n\trejectNonCanonicalBlock := func(blockName string, block *wire.MsgBlock) TestInstance {\n\t\tblockHeight := g.blockHeights[blockName]\n\t\tencoded := encodeNonCanonicalBlock(block)\n\t\treturn RejectedNonCanonicalBlock{blockName, encoded, blockHeight}\n\t}\n\torphanOrRejectBlock := func(blockName string, block *wire.MsgBlock) TestInstance {\n\t\tblockHeight := g.blockHeights[blockName]\n\t\treturn OrphanOrRejectedBlock{blockName, block, blockHeight}\n\t}\n\texpectTipBlock := func(blockName string, block *wire.MsgBlock) TestInstance {\n\t\tblockHeight := g.blockHeights[blockName]\n\t\treturn ExpectedTip{blockName, block, blockHeight}\n\t}\n\n\t// Define some convenience helper functions to populate the tests slice\n\t// with test instances that have the described characteristics.\n\t//\n\t// accepted creates and appends a single acceptBlock test instance for\n\t// the current tip which expects the block to be accepted to the main\n\t// chain.\n\t//\n\t// acceptedToSideChainWithExpectedTip creates an appends a two-instance\n\t// test.  The first instance is an acceptBlock test instance for the\n\t// current tip which expects the block to be accepted to a side chain.\n\t// The second instance is an expectBlockTip test instance for provided\n\t// values.\n\t//\n\t// rejected creates and appends a single rejectBlock test instance for\n\t// the current tip.\n\t//\n\t// rejectedNonCanonical creates and appends a single\n\t// rejectNonCanonicalBlock test instance for the current tip.\n\t//\n\t// orphanedOrRejected creates and appends a single orphanOrRejectBlock\n\t// test instance for the current tip.\n\t//\n\t// blockDisconnectExpectUTXO creates and appends a BlockDisconnectExpectUTXO test\n\t// instance with the passed in values.\n\taccepted := func() {\n\t\ttests = append(tests, []TestInstance{\n\t\t\tacceptBlock(g.tipName, g.tip, true, false),\n\t\t})\n\t}\n\tacceptedToSideChainWithExpectedTip := func(tipName string) {\n\t\ttests = append(tests, []TestInstance{\n\t\t\tacceptBlock(g.tipName, g.tip, false, false),\n\t\t\texpectTipBlock(tipName, g.blocksByName[tipName]),\n\t\t})\n\t}\n\trejected := func(code blockchain.ErrorCode) {\n\t\ttests = append(tests, []TestInstance{\n\t\t\trejectBlock(g.tipName, g.tip, code),\n\t\t})\n\t}\n\trejectedNonCanonical := func() {\n\t\ttests = append(tests, []TestInstance{\n\t\t\trejectNonCanonicalBlock(g.tipName, g.tip),\n\t\t})\n\t}\n\torphanedOrRejected := func() {\n\t\ttests = append(tests, []TestInstance{\n\t\t\torphanOrRejectBlock(g.tipName, g.tip),\n\t\t})\n\t}\n\tblockDisconnectExpectUTXO := func(name string, expected bool, op wire.OutPoint,\n\t\thash chainhash.Hash) {\n\t\ttests = append(tests, []TestInstance{\n\t\t\tBlockDisconnectExpectUTXO{name, expected, hash, op},\n\t\t})\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Generate enough blocks to have mature coinbase outputs to work with.\n\t//\n\t//   genesis -> bm0 -> bm1 -> ... -> bm99\n\t// ---------------------------------------------------------------------\n\n\tcoinbaseMaturity := g.params.CoinbaseMaturity\n\tvar testInstances []TestInstance\n\tfor i := uint16(0); i < coinbaseMaturity; i++ {\n\t\tblockName := fmt.Sprintf(\"bm%d\", i)\n\t\tg.nextBlock(blockName, nil)\n\t\tg.saveTipCoinbaseOut()\n\t\ttestInstances = append(testInstances, acceptBlock(g.tipName,\n\t\t\tg.tip, true, false))\n\t}\n\ttests = append(tests, testInstances)\n\n\t// Collect spendable outputs.  This simplifies the code below.\n\tvar outs []*testhelper.SpendableOut\n\tfor i := uint16(0); i < coinbaseMaturity; i++ {\n\t\top := g.oldestCoinbaseOut()\n\t\touts = append(outs, &op)\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Basic forking and reorg tests.\n\t// ---------------------------------------------------------------------\n\n\t// ---------------------------------------------------------------------\n\t// The comments below identify the structure of the chain being built.\n\t//\n\t// The values in parenthesis represent which outputs are being spent.\n\t//\n\t// For example, b1(0) indicates the first collected spendable output\n\t// which, due to the code above to create the correct number of blocks,\n\t// is the first output that can be spent at the current block height due\n\t// to the coinbase maturity requirement.\n\t// ---------------------------------------------------------------------\n\n\t// Start by building a couple of blocks at current tip (value in parens\n\t// is which output is spent):\n\t//\n\t//   ... -> b1(0) -> b2(1)\n\tg.nextBlock(\"b1\", outs[0])\n\taccepted()\n\n\tg.nextBlock(\"b2\", outs[1])\n\taccepted()\n\n\t// Create a fork from b1.  There should not be a reorg since b2 was seen\n\t// first.\n\t//\n\t//   ... -> b1(0) -> b2(1)\n\t//               \\-> b3(1)\n\tg.setTip(\"b1\")\n\tg.nextBlock(\"b3\", outs[1])\n\tb3Tx1Out := testhelper.MakeSpendableOut(g.tip, 1, 0)\n\tacceptedToSideChainWithExpectedTip(\"b2\")\n\n\t// Extend b3 fork to make the alternative chain longer and force reorg.\n\t//\n\t//   ... -> b1(0) -> b2(1)\n\t//               \\-> b3(1) -> b4(2)\n\tg.nextBlock(\"b4\", outs[2])\n\taccepted()\n\n\t// Extend b2 fork twice to make first chain longer and force reorg.\n\t//\n\t//   ... -> b1(0) -> b2(1) -> b5(2) -> b6(3)\n\t//               \\-> b3(1) -> b4(2)\n\tg.setTip(\"b2\")\n\tg.nextBlock(\"b5\", outs[2])\n\tacceptedToSideChainWithExpectedTip(\"b4\")\n\n\tg.nextBlock(\"b6\", outs[3])\n\taccepted()\n\n\t// ---------------------------------------------------------------------\n\t// Double spend tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create a fork that double spends.\n\t//\n\t//   ... -> b1(0) -> b2(1) -> b5(2) -> b6(3)\n\t//                                 \\-> b7(2) -> b8(4)\n\t//               \\-> b3(1) -> b4(2)\n\tg.setTip(\"b5\")\n\tg.nextBlock(\"b7\", outs[2])\n\tacceptedToSideChainWithExpectedTip(\"b6\")\n\n\tg.nextBlock(\"b8\", outs[4])\n\trejected(blockchain.ErrMissingTxOut)\n\n\t// ---------------------------------------------------------------------\n\t// Too much proof-of-work coinbase tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create a block that generates too coinbase.\n\t//\n\t//   ... -> b1(0) -> b2(1) -> b5(2) -> b6(3)\n\t//                                         \\-> b9(4)\n\t//               \\-> b3(1) -> b4(2)\n\tg.setTip(\"b6\")\n\tg.nextBlock(\"b9\", outs[4], additionalCoinbase(1))\n\trejected(blockchain.ErrBadCoinbaseValue)\n\n\t// Create a fork that ends with block that generates too much coinbase.\n\t//\n\t//   ... -> b1(0) -> b2(1) -> b5(2) -> b6(3)\n\t//                                 \\-> b10(3) -> b11(4)\n\t//               \\-> b3(1) -> b4(2)\n\tg.setTip(\"b5\")\n\tg.nextBlock(\"b10\", outs[3])\n\tacceptedToSideChainWithExpectedTip(\"b6\")\n\n\tg.nextBlock(\"b11\", outs[4], additionalCoinbase(1))\n\trejected(blockchain.ErrBadCoinbaseValue)\n\n\t// Create a fork that ends with block that generates too much coinbase\n\t// as before, but with a valid fork first.\n\t//\n\t//   ... -> b1(0) -> b2(1) -> b5(2) -> b6(3)\n\t//              |                  \\-> b12(3) -> b13(4) -> b14(5)\n\t//              |                      (b12 added last)\n\t//               \\-> b3(1) -> b4(2)\n\tg.setTip(\"b5\")\n\tb12 := g.nextBlock(\"b12\", outs[3])\n\tb13 := g.nextBlock(\"b13\", outs[4])\n\tb14 := g.nextBlock(\"b14\", outs[5], additionalCoinbase(1))\n\ttests = append(tests, []TestInstance{\n\t\tacceptBlock(\"b13\", b13, false, true),\n\t\tacceptBlock(\"b14\", b14, false, true),\n\t\trejectBlock(\"b12\", b12, blockchain.ErrBadCoinbaseValue),\n\t\texpectTipBlock(\"b13\", b13),\n\t})\n\n\t// ---------------------------------------------------------------------\n\t// Checksig signature operation count tests.\n\t// ---------------------------------------------------------------------\n\n\t// Add a block with max allowed signature operations using OP_CHECKSIG.\n\t//\n\t//   ... -> b5(2) -> b12(3) -> b13(4) -> b15(5)\n\t//   \\-> b3(1) -> b4(2)\n\tg.setTip(\"b13\")\n\tmanySigOps := repeatOpcode(txscript.OP_CHECKSIG, maxBlockSigOps)\n\tg.nextBlock(\"b15\", outs[5], replaceSpendScript(manySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps)\n\taccepted()\n\n\t// Attempt to add block with more than max allowed signature operations\n\t// using OP_CHECKSIG.\n\t//\n\t//   ... -> b5(2) -> b12(3) -> b13(4) -> b15(5)\n\t//   \\                                         \\-> b16(7)\n\t//    \\-> b3(1) -> b4(2)\n\ttooManySigOps := repeatOpcode(txscript.OP_CHECKSIG, maxBlockSigOps+1)\n\tg.nextBlock(\"b16\", outs[6], replaceSpendScript(tooManySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps + 1)\n\trejected(blockchain.ErrTooManySigOps)\n\n\t// ---------------------------------------------------------------------\n\t// Cross-fork spend tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block that spends a tx created on a different fork.\n\t//\n\t//   ... -> b5(2) -> b12(3) -> b13(4) -> b15(5)\n\t//   \\                                         \\-> b17(b3.tx[1])\n\t//    \\-> b3(1) -> b4(2)\n\tg.setTip(\"b15\")\n\tg.nextBlock(\"b17\", &b3Tx1Out)\n\trejected(blockchain.ErrMissingTxOut)\n\n\t// Create block that forks and spends a tx created on a third fork.\n\t//\n\t//   ... -> b5(2) -> b12(3) -> b13(4) -> b15(5)\n\t//   |                               \\-> b18(b3.tx[1]) -> b19(6)\n\t//    \\-> b3(1) -> b4(2)\n\tg.setTip(\"b13\")\n\tg.nextBlock(\"b18\", &b3Tx1Out)\n\tacceptedToSideChainWithExpectedTip(\"b15\")\n\n\tg.nextBlock(\"b19\", outs[6])\n\trejected(blockchain.ErrMissingTxOut)\n\n\t// ---------------------------------------------------------------------\n\t// Immature coinbase tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block that spends immature coinbase.\n\t//\n\t//   ... -> b13(4) -> b15(5)\n\t//                          \\-> b20(7)\n\tg.setTip(\"b15\")\n\tg.nextBlock(\"b20\", outs[7])\n\trejected(blockchain.ErrImmatureSpend)\n\n\t// Create block that spends immature coinbase on a fork.\n\t//\n\t//   ... -> b13(4) -> b15(5)\n\t//                \\-> b21(5) -> b22(7)\n\tg.setTip(\"b13\")\n\tg.nextBlock(\"b21\", outs[5])\n\tacceptedToSideChainWithExpectedTip(\"b15\")\n\n\tg.nextBlock(\"b22\", outs[7])\n\trejected(blockchain.ErrImmatureSpend)\n\n\t// ---------------------------------------------------------------------\n\t// Max block size tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block that is the max allowed size.\n\t//\n\t//   ... -> b15(5) -> b23(6)\n\tg.setTip(\"b15\")\n\tg.nextBlock(\"b23\", outs[6], func(b *wire.MsgBlock) {\n\t\tbytesToMaxSize := maxBlockSize - b.SerializeSize() - 3\n\t\tsizePadScript := repeatOpcode(0x00, bytesToMaxSize)\n\t\treplaceSpendScript(sizePadScript)(b)\n\t})\n\tg.assertTipBlockSize(maxBlockSize)\n\taccepted()\n\n\t// Create block that is the one byte larger than max allowed size.  This\n\t// is done on a fork and should be rejected regardless.\n\t//\n\t//   ... -> b15(5) -> b23(6)\n\t//                \\-> b24(6) -> b25(7)\n\tg.setTip(\"b15\")\n\tg.nextBlock(\"b24\", outs[6], func(b *wire.MsgBlock) {\n\t\tbytesToMaxSize := maxBlockSize - b.SerializeSize() - 3\n\t\tsizePadScript := repeatOpcode(0x00, bytesToMaxSize+1)\n\t\treplaceSpendScript(sizePadScript)(b)\n\t})\n\tg.assertTipBlockSize(maxBlockSize + 1)\n\trejected(blockchain.ErrBlockTooBig)\n\n\t// Parent was rejected, so this block must either be an orphan or\n\t// outright rejected due to an invalid parent.\n\tg.nextBlock(\"b25\", outs[7])\n\torphanedOrRejected()\n\n\t// ---------------------------------------------------------------------\n\t// Coinbase script length limits tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block that has a coinbase script that is smaller than the\n\t// required length.  This is done on a fork and should be rejected\n\t// regardless.  Also, create a block that builds on the rejected block.\n\t//\n\t//   ... -> b15(5) -> b23(6)\n\t//                \\-> b26(6) -> b27(7)\n\tg.setTip(\"b15\")\n\ttooSmallCbScript := repeatOpcode(0x00, minCoinbaseScriptLen-1)\n\tg.nextBlock(\"b26\", outs[6], replaceCoinbaseSigScript(tooSmallCbScript))\n\trejected(blockchain.ErrBadCoinbaseScriptLen)\n\n\t// Parent was rejected, so this block must either be an orphan or\n\t// outright rejected due to an invalid parent.\n\tg.nextBlock(\"b27\", outs[7])\n\torphanedOrRejected()\n\n\t// Create block that has a coinbase script that is larger than the\n\t// allowed length.  This is done on a fork and should be rejected\n\t// regardless.  Also, create a block that builds on the rejected block.\n\t//\n\t//   ... -> b15(5) -> b23(6)\n\t//                \\-> b28(6) -> b29(7)\n\tg.setTip(\"b15\")\n\ttooLargeCbScript := repeatOpcode(0x00, maxCoinbaseScriptLen+1)\n\tg.nextBlock(\"b28\", outs[6], replaceCoinbaseSigScript(tooLargeCbScript))\n\trejected(blockchain.ErrBadCoinbaseScriptLen)\n\n\t// Parent was rejected, so this block must either be an orphan or\n\t// outright rejected due to an invalid parent.\n\tg.nextBlock(\"b29\", outs[7])\n\torphanedOrRejected()\n\n\t// Create block that has a max length coinbase script.\n\t//\n\t//   ... -> b23(6) -> b30(7)\n\tg.setTip(\"b23\")\n\tmaxSizeCbScript := repeatOpcode(0x00, maxCoinbaseScriptLen)\n\tg.nextBlock(\"b30\", outs[7], replaceCoinbaseSigScript(maxSizeCbScript))\n\taccepted()\n\n\t// ---------------------------------------------------------------------\n\t// Multisig[Verify]/ChecksigVerify signature operation count tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block with max signature operations as OP_CHECKMULTISIG.\n\t//\n\t//   ... -> b30(7) -> b31(8)\n\t//\n\t// OP_CHECKMULTISIG counts for 20 sigops.\n\tmanySigOps = repeatOpcode(txscript.OP_CHECKMULTISIG, maxBlockSigOps/20)\n\tg.nextBlock(\"b31\", outs[8], replaceSpendScript(manySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps)\n\taccepted()\n\n\t// Create block with more than max allowed signature operations using\n\t// OP_CHECKMULTISIG.\n\t//\n\t//   ... -> b31(8)\n\t//                \\-> b32(9)\n\t//\n\t// OP_CHECKMULTISIG counts for 20 sigops.\n\ttooManySigOps = repeatOpcode(txscript.OP_CHECKMULTISIG, maxBlockSigOps/20)\n\ttooManySigOps = append(manySigOps, txscript.OP_CHECKSIG)\n\tg.nextBlock(\"b32\", outs[9], replaceSpendScript(tooManySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps + 1)\n\trejected(blockchain.ErrTooManySigOps)\n\n\t// Create block with max signature operations as OP_CHECKMULTISIGVERIFY.\n\t//\n\t//   ... -> b31(8) -> b33(9)\n\tg.setTip(\"b31\")\n\tmanySigOps = repeatOpcode(txscript.OP_CHECKMULTISIGVERIFY, maxBlockSigOps/20)\n\tg.nextBlock(\"b33\", outs[9], replaceSpendScript(manySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps)\n\taccepted()\n\n\t// Create block with more than max allowed signature operations using\n\t// OP_CHECKMULTISIGVERIFY.\n\t//\n\t//   ... -> b33(9)\n\t//                \\-> b34(10)\n\t//\n\ttooManySigOps = repeatOpcode(txscript.OP_CHECKMULTISIGVERIFY, maxBlockSigOps/20)\n\ttooManySigOps = append(manySigOps, txscript.OP_CHECKSIG)\n\tg.nextBlock(\"b34\", outs[10], replaceSpendScript(tooManySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps + 1)\n\trejected(blockchain.ErrTooManySigOps)\n\n\t// Create block with max signature operations as OP_CHECKSIGVERIFY.\n\t//\n\t//   ... -> b33(9) -> b35(10)\n\t//\n\tg.setTip(\"b33\")\n\tmanySigOps = repeatOpcode(txscript.OP_CHECKSIGVERIFY, maxBlockSigOps)\n\tg.nextBlock(\"b35\", outs[10], replaceSpendScript(manySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps)\n\taccepted()\n\n\t// Create block with more than max allowed signature operations using\n\t// OP_CHECKSIGVERIFY.\n\t//\n\t//   ... -> b35(10)\n\t//                 \\-> b36(11)\n\t//\n\ttooManySigOps = repeatOpcode(txscript.OP_CHECKSIGVERIFY, maxBlockSigOps+1)\n\tg.nextBlock(\"b36\", outs[11], replaceSpendScript(tooManySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps + 1)\n\trejected(blockchain.ErrTooManySigOps)\n\n\t// ---------------------------------------------------------------------\n\t// Spending of tx outputs in block that failed to connect tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block that spends a transaction from a block that failed to\n\t// connect (due to containing a double spend).\n\t//\n\t//   ... -> b35(10)\n\t//                 \\-> b37(11)\n\t//                 \\-> b38(b37.tx[1])\n\t//\n\tg.setTip(\"b35\")\n\tdoubleSpendTx := testhelper.CreateSpendTx(outs[11], testhelper.LowFee)\n\tg.nextBlock(\"b37\", outs[11], additionalTx(doubleSpendTx))\n\tb37Tx1Out := testhelper.MakeSpendableOut(g.tip, 1, 0)\n\trejected(blockchain.ErrMissingTxOut)\n\n\tg.setTip(\"b35\")\n\tg.nextBlock(\"b38\", &b37Tx1Out)\n\trejected(blockchain.ErrMissingTxOut)\n\n\t// ---------------------------------------------------------------------\n\t// Pay-to-script-hash signature operation count tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create a pay-to-script-hash redeem script that consists of 9\n\t// signature operations to be used in the next three blocks.\n\tconst redeemScriptSigOps = 9\n\tredeemScript := pushDataScript(g.privKey.PubKey().SerializeCompressed())\n\tredeemScript = append(redeemScript, bytes.Repeat([]byte{txscript.OP_2DUP,\n\t\ttxscript.OP_CHECKSIGVERIFY}, redeemScriptSigOps-1)...)\n\tredeemScript = append(redeemScript, txscript.OP_CHECKSIG)\n\tassertScriptSigOpsCount(redeemScript, redeemScriptSigOps)\n\n\t// Create a block that has enough pay-to-script-hash outputs such that\n\t// another block can be created that consumes them all and exceeds the\n\t// max allowed signature operations per block.\n\t//\n\t//   ... -> b35(10) -> b39(11)\n\tg.setTip(\"b35\")\n\tb39 := g.nextBlock(\"b39\", outs[11], func(b *wire.MsgBlock) {\n\t\t// Create a chain of transactions each spending from the\n\t\t// previous one such that each contains an output that pays to\n\t\t// the redeem script and the total number of signature\n\t\t// operations in those redeem scripts will be more than the\n\t\t// max allowed per block.\n\t\tp2shScript := payToScriptHashScript(redeemScript)\n\t\ttxnsNeeded := (maxBlockSigOps / redeemScriptSigOps) + 1\n\t\tprevTx := b.Transactions[1]\n\t\tfor i := 0; i < txnsNeeded; i++ {\n\t\t\tprevTx = createSpendTxForTx(prevTx, testhelper.LowFee)\n\t\t\tprevTx.TxOut[0].Value -= 2\n\t\t\tprevTx.AddTxOut(wire.NewTxOut(2, p2shScript))\n\t\t\tb.AddTransaction(prevTx)\n\t\t}\n\t})\n\tg.assertTipBlockNumTxns((maxBlockSigOps / redeemScriptSigOps) + 3)\n\taccepted()\n\n\t// Create a block with more than max allowed signature operations where\n\t// the majority of them are in pay-to-script-hash scripts.\n\t//\n\t//   ... -> b35(10) -> b39(11)\n\t//                            \\-> b40(12)\n\tg.setTip(\"b39\")\n\tg.nextBlock(\"b40\", outs[12], func(b *wire.MsgBlock) {\n\t\ttxnsNeeded := (maxBlockSigOps / redeemScriptSigOps)\n\t\tfor i := 0; i < txnsNeeded; i++ {\n\t\t\t// Create a signed transaction that spends from the\n\t\t\t// associated p2sh output in b39.\n\t\t\tspend := testhelper.MakeSpendableOutForTx(b39.Transactions[i+2], 2)\n\t\t\ttx := testhelper.CreateSpendTx(&spend, testhelper.LowFee)\n\t\t\tsig, err := txscript.RawTxInSignature(tx, 0,\n\t\t\t\tredeemScript, txscript.SigHashAll, g.privKey)\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\ttx.TxIn[0].SignatureScript = pushDataScript(sig,\n\t\t\t\tredeemScript)\n\t\t\tb.AddTransaction(tx)\n\t\t}\n\n\t\t// Create a final tx that includes a non-pay-to-script-hash\n\t\t// output with the number of signature operations needed to push\n\t\t// the block one over the max allowed.\n\t\tfill := maxBlockSigOps - (txnsNeeded * redeemScriptSigOps) + 1\n\t\tfinalTx := b.Transactions[len(b.Transactions)-1]\n\t\ttx := createSpendTxForTx(finalTx, testhelper.LowFee)\n\t\ttx.TxOut[0].PkScript = repeatOpcode(txscript.OP_CHECKSIG, fill)\n\t\tb.AddTransaction(tx)\n\t})\n\trejected(blockchain.ErrTooManySigOps)\n\n\t// Create a block with the max allowed signature operations where the\n\t// majority of them are in pay-to-script-hash scripts.\n\t//\n\t//   ... -> b35(10) -> b39(11) -> b41(12)\n\tg.setTip(\"b39\")\n\tg.nextBlock(\"b41\", outs[12], func(b *wire.MsgBlock) {\n\t\ttxnsNeeded := (maxBlockSigOps / redeemScriptSigOps)\n\t\tfor i := 0; i < txnsNeeded; i++ {\n\t\t\tspend := testhelper.MakeSpendableOutForTx(b39.Transactions[i+2], 2)\n\t\t\ttx := testhelper.CreateSpendTx(&spend, testhelper.LowFee)\n\t\t\tsig, err := txscript.RawTxInSignature(tx, 0,\n\t\t\t\tredeemScript, txscript.SigHashAll, g.privKey)\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\ttx.TxIn[0].SignatureScript = pushDataScript(sig,\n\t\t\t\tredeemScript)\n\t\t\tb.AddTransaction(tx)\n\t\t}\n\n\t\t// Create a final tx that includes a non-pay-to-script-hash\n\t\t// output with the number of signature operations needed to push\n\t\t// the block to exactly the max allowed.\n\t\tfill := maxBlockSigOps - (txnsNeeded * redeemScriptSigOps)\n\t\tif fill == 0 {\n\t\t\treturn\n\t\t}\n\t\tfinalTx := b.Transactions[len(b.Transactions)-1]\n\t\ttx := createSpendTxForTx(finalTx, testhelper.LowFee)\n\t\ttx.TxOut[0].PkScript = repeatOpcode(txscript.OP_CHECKSIG, fill)\n\t\tb.AddTransaction(tx)\n\t})\n\taccepted()\n\n\t// ---------------------------------------------------------------------\n\t// Reset the chain to a stable base.\n\t//\n\t//   ... -> b35(10) -> b39(11) -> b42(12) -> b43(13)\n\t//                            \\-> b41(12)\n\t// ---------------------------------------------------------------------\n\n\tg.setTip(\"b39\")\n\tg.nextBlock(\"b42\", outs[12])\n\tacceptedToSideChainWithExpectedTip(\"b41\")\n\n\tg.nextBlock(\"b43\", outs[13])\n\taccepted()\n\n\t// ---------------------------------------------------------------------\n\t// Various malformed block tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block with an otherwise valid transaction in place of where\n\t// the coinbase must be.\n\t//\n\t//   ... -> b43(13)\n\t//                 \\-> b44(14)\n\tg.nextBlock(\"b44\", nil, func(b *wire.MsgBlock) {\n\t\tnonCoinbaseTx := testhelper.CreateSpendTx(outs[14], testhelper.LowFee)\n\t\tb.Transactions[0] = nonCoinbaseTx\n\t})\n\trejected(blockchain.ErrFirstTxNotCoinbase)\n\n\t// Create block with no transactions.\n\t//\n\t//   ... -> b43(13)\n\t//                 \\-> b45(_)\n\tg.setTip(\"b43\")\n\tg.nextBlock(\"b45\", nil, func(b *wire.MsgBlock) {\n\t\tb.Transactions = nil\n\t})\n\trejected(blockchain.ErrNoTransactions)\n\n\t// Create block with invalid proof of work.\n\t//\n\t//   ... -> b43(13)\n\t//                 \\-> b46(14)\n\tg.setTip(\"b43\")\n\tb46 := g.nextBlock(\"b46\", outs[14])\n\t// This can't be done inside a munge function passed to nextBlock\n\t// because the block is solved after the function returns and this test\n\t// requires an unsolved block.\n\t{\n\t\torigHash := b46.BlockHash()\n\t\tfor {\n\t\t\t// Keep incrementing the nonce until the hash treated as\n\t\t\t// a uint256 is higher than the limit.\n\t\t\tb46.Header.Nonce++\n\t\t\tblockHash := b46.BlockHash()\n\t\t\thashNum := blockchain.HashToBig(&blockHash)\n\t\t\tif hashNum.Cmp(g.params.PowLimit) >= 0 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tg.updateBlockState(\"b46\", origHash, \"b46\", b46)\n\t}\n\trejected(blockchain.ErrHighHash)\n\n\t// Create block with a timestamp too far in the future.\n\t//\n\t//   ... -> b43(13)\n\t//                 \\-> b47(14)\n\tg.setTip(\"b43\")\n\tg.nextBlock(\"b47\", outs[14], func(b *wire.MsgBlock) {\n\t\t// 3 hours in the future clamped to 1 second precision.\n\t\tnowPlus3Hours := time.Now().Add(time.Hour * 3)\n\t\tb.Header.Timestamp = time.Unix(nowPlus3Hours.Unix(), 0)\n\t})\n\trejected(blockchain.ErrTimeTooNew)\n\n\t// Create block with an invalid merkle root.\n\t//\n\t//   ... -> b43(13)\n\t//                 \\-> b48(14)\n\tg.setTip(\"b43\")\n\tg.nextBlock(\"b48\", outs[14], func(b *wire.MsgBlock) {\n\t\tb.Header.MerkleRoot = chainhash.Hash{}\n\t})\n\trejected(blockchain.ErrBadMerkleRoot)\n\n\t// Create block with an invalid proof-of-work limit.\n\t//\n\t//   ... -> b43(13)\n\t//                 \\-> b49(14)\n\tg.setTip(\"b43\")\n\tg.nextBlock(\"b49\", outs[14], func(b *wire.MsgBlock) {\n\t\tb.Header.Bits--\n\t})\n\trejected(blockchain.ErrUnexpectedDifficulty)\n\n\t// Create block with an invalid negative proof-of-work limit.\n\t//\n\t//   ... -> b43(13)\n\t//                 \\-> b49a(14)\n\tg.setTip(\"b43\")\n\tb49a := g.nextBlock(\"b49a\", outs[14])\n\t// This can't be done inside a munge function passed to nextBlock\n\t// because the block is solved after the function returns and this test\n\t// involves an unsolvable block.\n\t{\n\t\torigHash := b49a.BlockHash()\n\t\tb49a.Header.Bits = 0x01810000 // -1 in compact form.\n\t\tg.updateBlockState(\"b49a\", origHash, \"b49a\", b49a)\n\t}\n\trejected(blockchain.ErrUnexpectedDifficulty)\n\n\t// Create block with two coinbase transactions.\n\t//\n\t//   ... -> b43(13)\n\t//                 \\-> b50(14)\n\tg.setTip(\"b43\")\n\tcoinbaseTx := g.createCoinbaseTx(g.tipHeight + 1)\n\tg.nextBlock(\"b50\", outs[14], additionalTx(coinbaseTx))\n\trejected(blockchain.ErrMultipleCoinbases)\n\n\t// Create block with duplicate transactions.\n\t//\n\t// This test relies on the shape of the shape of the merkle tree to test\n\t// the intended condition and thus is asserted below.\n\t//\n\t//   ... -> b43(13)\n\t//                 \\-> b51(14)\n\tg.setTip(\"b43\")\n\tg.nextBlock(\"b51\", outs[14], func(b *wire.MsgBlock) {\n\t\tb.AddTransaction(b.Transactions[1])\n\t})\n\tg.assertTipBlockNumTxns(3)\n\trejected(blockchain.ErrDuplicateTx)\n\n\t// Create a block that spends a transaction that does not exist.\n\t//\n\t//   ... -> b43(13)\n\t//                 \\-> b52(14)\n\tg.setTip(\"b43\")\n\tg.nextBlock(\"b52\", outs[14], func(b *wire.MsgBlock) {\n\t\thash := newHashFromStr(\"00000000000000000000000000000000\" +\n\t\t\t\"00000000000000000123456789abcdef\")\n\t\tb.Transactions[1].TxIn[0].PreviousOutPoint.Hash = *hash\n\t\tb.Transactions[1].TxIn[0].PreviousOutPoint.Index = 0\n\t})\n\trejected(blockchain.ErrMissingTxOut)\n\n\t// ---------------------------------------------------------------------\n\t// Block header median time tests.\n\t// ---------------------------------------------------------------------\n\n\t// Reset the chain to a stable base.\n\t//\n\t//   ... -> b33(9) -> b35(10) -> b39(11) -> b42(12) -> b43(13) -> b53(14)\n\tg.setTip(\"b43\")\n\tg.nextBlock(\"b53\", outs[14])\n\taccepted()\n\n\t// Create a block with a timestamp that is exactly the median time.  The\n\t// block must be rejected.\n\t//\n\t//   ... -> b33(9) -> b35(10) -> b39(11) -> b42(12) -> b43(13) -> b53(14)\n\t//                                                                       \\-> b54(15)\n\tg.nextBlock(\"b54\", outs[15], func(b *wire.MsgBlock) {\n\t\tmedianBlock := g.blocks[b.Header.PrevBlock]\n\t\tfor i := 0; i < medianTimeBlocks/2; i++ {\n\t\t\tmedianBlock = g.blocks[medianBlock.Header.PrevBlock]\n\t\t}\n\t\tb.Header.Timestamp = medianBlock.Header.Timestamp\n\t})\n\trejected(blockchain.ErrTimeTooOld)\n\n\t// Create a block with a timestamp that is one second after the median\n\t// time.  The block must be accepted.\n\t//\n\t//   ... -> b33(9) -> b35(10) -> b39(11) -> b42(12) -> b43(13) -> b53(14) -> b55(15)\n\tg.setTip(\"b53\")\n\tg.nextBlock(\"b55\", outs[15], func(b *wire.MsgBlock) {\n\t\tmedianBlock := g.blocks[b.Header.PrevBlock]\n\t\tfor i := 0; i < medianTimeBlocks/2; i++ {\n\t\t\tmedianBlock = g.blocks[medianBlock.Header.PrevBlock]\n\t\t}\n\t\tmedianBlockTime := medianBlock.Header.Timestamp\n\t\tb.Header.Timestamp = medianBlockTime.Add(time.Second)\n\t})\n\taccepted()\n\n\t// ---------------------------------------------------------------------\n\t// CVE-2012-2459 (block hash collision due to merkle tree algo) tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create two blocks that have the same hash via merkle tree tricks to\n\t// ensure that the valid block is accepted even though it has the same\n\t// hash as the invalid block that was rejected first.\n\t//\n\t// This is accomplished by building the blocks as follows:\n\t//\n\t// b57 (valid block):\n\t//\n\t//                root = h1234 = h(h12 || h34)\n\t//\t        //                           \\\\\n\t//\t  h12 = h(h(cb) || h(tx2))  h34 = h(h(tx3) || h(tx3))\n\t//\t   //                  \\\\             //           \\\\\n\t//\t coinbase              tx2           tx3           nil\n\t//\n\t//   transactions: coinbase, tx2, tx3\n\t//   merkle tree level 1: h12 = h(h(cb) || h(tx2))\n\t//                        h34 = h(h(tx3) || h(tx3)) // Algo reuses tx3\n\t//   merkle tree root: h(h12 || h34)\n\t//\n\t// b56 (invalid block with the same hash):\n\t//\n\t//                root = h1234 = h(h12 || h34)\n\t//\t        //                          \\\\\n\t//\t  h12 = h(h(cb) || h(tx2))  h34 = h(h(tx3) || h(tx3))\n\t//\t   //                  \\\\             //           \\\\\n\t//\t coinbase              tx2           tx3           tx3\n\t//\n\t//   transactions: coinbase, tx2, tx3, tx3\n\t//   merkle tree level 1: h12 = h(h(cb) || h(tx2))\n\t//                        h34 = h(h(tx3) || h(tx3)) // real tx3 dup\n\t//   merkle tree root: h(h12 || h34)\n\t//\n\t//   ... -> b55(15) -> b57(16)\n\t//                 \\-> b56(16)\n\tg.setTip(\"b55\")\n\tb57 := g.nextBlock(\"b57\", outs[16], func(b *wire.MsgBlock) {\n\t\ttx2 := b.Transactions[1]\n\t\ttx3 := createSpendTxForTx(tx2, testhelper.LowFee)\n\t\tb.AddTransaction(tx3)\n\t})\n\tg.assertTipBlockNumTxns(3)\n\n\tg.setTip(\"b55\")\n\tb56 := g.nextBlock(\"b56\", nil, func(b *wire.MsgBlock) {\n\t\t*b = cloneBlock(b57)\n\t\tb.AddTransaction(b.Transactions[2])\n\t})\n\tg.assertTipBlockNumTxns(4)\n\tg.assertTipBlockHash(b57.BlockHash())\n\tg.assertTipBlockMerkleRoot(b57.Header.MerkleRoot)\n\trejected(blockchain.ErrDuplicateTx)\n\n\t// Since the two blocks have the same hash and the generator state now\n\t// has b56 associated with the hash, manually remove b56, replace it\n\t// with b57, and then reset the tip to it.\n\tg.updateBlockState(\"b56\", b56.BlockHash(), \"b57\", b57)\n\tg.setTip(\"b57\")\n\taccepted()\n\n\t// Create a block that contains two duplicate txns that are not in a\n\t// consecutive position within the merkle tree.\n\t//\n\t// This is accomplished by building the block as follows:\n\t//\n\t//   transactions: coinbase, tx2, tx3, tx4, tx5, tx6, tx3, tx4\n\t//   merkle tree level 2: h12 = h(h(cb) || h(tx2))\n\t//                        h34 = h(h(tx3) || h(tx4))\n\t//                        h56 = h(h(tx5) || h(tx6))\n\t//                        h78 = h(h(tx3) || h(tx4)) // Same as h34\n\t//   merkle tree level 1: h1234 = h(h12 || h34)\n\t//                        h5678 = h(h56 || h78)\n\t//   merkle tree root: h(h1234 || h5678)\n\t//\n\t//\n\t//   ... -> b55(15) -> b57(16)\n\t//                 \\-> b56p2(16)\n\tg.setTip(\"b55\")\n\tg.nextBlock(\"b56p2\", outs[16], func(b *wire.MsgBlock) {\n\t\t// Create 4 transactions that each spend from the previous tx\n\t\t// in the block.\n\t\tspendTx := b.Transactions[1]\n\t\tfor i := 0; i < 4; i++ {\n\t\t\tspendTx = createSpendTxForTx(spendTx, testhelper.LowFee)\n\t\t\tb.AddTransaction(spendTx)\n\t\t}\n\n\t\t// Add the duplicate transactions (3rd and 4th).\n\t\tb.AddTransaction(b.Transactions[2])\n\t\tb.AddTransaction(b.Transactions[3])\n\t})\n\tg.assertTipBlockNumTxns(8)\n\trejected(blockchain.ErrDuplicateTx)\n\n\t// ---------------------------------------------------------------------\n\t// Invalid transaction type tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block with a transaction that tries to spend from an index\n\t// that is out of range from an otherwise valid and existing tx.\n\t//\n\t//   ... -> b57(16)\n\t//                 \\-> b58(17)\n\tg.setTip(\"b57\")\n\tg.nextBlock(\"b58\", outs[17], func(b *wire.MsgBlock) {\n\t\tb.Transactions[1].TxIn[0].PreviousOutPoint.Index = 42\n\t})\n\trejected(blockchain.ErrMissingTxOut)\n\n\t// Create block with transaction that pays more than its inputs.\n\t//\n\t//   ... -> b57(16)\n\t//                 \\-> b59(17)\n\tg.setTip(\"b57\")\n\tg.nextBlock(\"b59\", outs[17], func(b *wire.MsgBlock) {\n\t\tb.Transactions[1].TxOut[0].Value = int64(outs[17].Amount) + 1\n\t})\n\trejected(blockchain.ErrSpendTooHigh)\n\n\t// ---------------------------------------------------------------------\n\t// BIP0030 tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create a good block to reset the chain to a stable base.\n\t//\n\t//   ... -> b57(16) -> b60(17)\n\tg.setTip(\"b57\")\n\tg.nextBlock(\"b60\", outs[17])\n\taccepted()\n\n\t// Create block that has a tx with the same hash as an existing tx that\n\t// has not been fully spent.\n\t//\n\t//   ... -> b60(17)\n\t//                 \\-> b61(18)\n\tg.nextBlock(\"b61\", outs[18], func(b *wire.MsgBlock) {\n\t\t// Duplicate the coinbase of the parent block to force the\n\t\t// condition.\n\t\tparent := g.blocks[b.Header.PrevBlock]\n\t\tb.Transactions[0] = parent.Transactions[0]\n\t})\n\trejected(blockchain.ErrOverwriteTx)\n\n\t// ---------------------------------------------------------------------\n\t// Blocks with non-final transaction tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block that contains a non-final non-coinbase transaction.\n\t//\n\t//   ... -> b60(17)\n\t//                 \\-> b62(18)\n\tg.setTip(\"b60\")\n\tg.nextBlock(\"b62\", outs[18], func(b *wire.MsgBlock) {\n\t\t// A non-final transaction must have at least one input with a\n\t\t// non-final sequence number in addition to a non-final lock\n\t\t// time.\n\t\tb.Transactions[1].LockTime = 0xffffffff\n\t\tb.Transactions[1].TxIn[0].Sequence = 0\n\t})\n\trejected(blockchain.ErrUnfinalizedTx)\n\n\t// Create block that contains a non-final coinbase transaction.\n\t//\n\t//   ... -> b60(17)\n\t//                 \\-> b63(18)\n\tg.setTip(\"b60\")\n\tg.nextBlock(\"b63\", outs[18], func(b *wire.MsgBlock) {\n\t\t// A non-final transaction must have at least one input with a\n\t\t// non-final sequence number in addition to a non-final lock\n\t\t// time.\n\t\tb.Transactions[0].LockTime = 0xffffffff\n\t\tb.Transactions[0].TxIn[0].Sequence = 0\n\t})\n\trejected(blockchain.ErrUnfinalizedTx)\n\n\t// ---------------------------------------------------------------------\n\t// Non-canonical variable-length integer tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create a max size block with the variable-length integer for the\n\t// number of transactions replaced with a larger non-canonical version\n\t// that causes the block size to exceed the max allowed size.  Then,\n\t// create another block that is identical except with the canonical\n\t// encoding and ensure it is accepted.  The intent is to verify the\n\t// implementation does not reject the second block, which will have the\n\t// same hash, due to the first one already being rejected.\n\t//\n\t//   ... -> b60(17) -> b64(18)\n\t//                 \\-> b64a(18)\n\tg.setTip(\"b60\")\n\tb64a := g.nextBlock(\"b64a\", outs[18], func(b *wire.MsgBlock) {\n\t\tbytesToMaxSize := maxBlockSize - b.SerializeSize() - 3\n\t\tsizePadScript := repeatOpcode(0x00, bytesToMaxSize)\n\t\treplaceSpendScript(sizePadScript)(b)\n\t})\n\tg.assertTipNonCanonicalBlockSize(maxBlockSize + 8)\n\trejectedNonCanonical()\n\n\tg.setTip(\"b60\")\n\tb64 := g.nextBlock(\"b64\", outs[18], func(b *wire.MsgBlock) {\n\t\t*b = cloneBlock(b64a)\n\t})\n\t// Since the two blocks have the same hash and the generator state now\n\t// has b64a associated with the hash, manually remove b64a, replace it\n\t// with b64, and then reset the tip to it.\n\tg.updateBlockState(\"b64a\", b64a.BlockHash(), \"b64\", b64)\n\tg.setTip(\"b64\")\n\tg.assertTipBlockHash(b64a.BlockHash())\n\tg.assertTipBlockSize(maxBlockSize)\n\taccepted()\n\n\t// ---------------------------------------------------------------------\n\t// Same block transaction spend tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block that spends an output created earlier in the same block.\n\t//\n\t//   ... b64(18) -> b65(19)\n\tg.setTip(\"b64\")\n\tg.nextBlock(\"b65\", outs[19], func(b *wire.MsgBlock) {\n\t\ttx3 := createSpendTxForTx(b.Transactions[1], testhelper.LowFee)\n\t\tb.AddTransaction(tx3)\n\t})\n\taccepted()\n\n\t// Create block that spends an output created later in the same block.\n\t//\n\t//   ... -> b65(19)\n\t//                 \\-> b66(20)\n\tg.nextBlock(\"b66\", nil, func(b *wire.MsgBlock) {\n\t\ttx2 := testhelper.CreateSpendTx(outs[20], testhelper.LowFee)\n\t\ttx3 := createSpendTxForTx(tx2, testhelper.LowFee)\n\t\tb.AddTransaction(tx3)\n\t\tb.AddTransaction(tx2)\n\t})\n\trejected(blockchain.ErrMissingTxOut)\n\n\t// Create block that double spends a transaction created in the same\n\t// block.\n\t//\n\t//   ... -> b65(19)\n\t//                 \\-> b67(20)\n\tg.setTip(\"b65\")\n\tg.nextBlock(\"b67\", outs[20], func(b *wire.MsgBlock) {\n\t\ttx2 := b.Transactions[1]\n\t\ttx3 := createSpendTxForTx(tx2, testhelper.LowFee)\n\t\ttx4 := createSpendTxForTx(tx2, testhelper.LowFee)\n\t\tb.AddTransaction(tx3)\n\t\tb.AddTransaction(tx4)\n\t})\n\trejected(blockchain.ErrMissingTxOut)\n\n\t// ---------------------------------------------------------------------\n\t// Extra subsidy tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block that pays 10 extra to the coinbase and a tx that only\n\t// pays 9 fee.\n\t//\n\t//   ... -> b65(19)\n\t//                 \\-> b68(20)\n\tg.setTip(\"b65\")\n\tg.nextBlock(\"b68\", outs[20], additionalCoinbase(10), additionalSpendFee(9))\n\trejected(blockchain.ErrBadCoinbaseValue)\n\n\t// Create block that pays 10 extra to the coinbase and a tx that pays\n\t// the extra 10 fee.\n\t//\n\t//   ... -> b65(19) -> b69(20)\n\tg.setTip(\"b65\")\n\tg.nextBlock(\"b69\", outs[20], additionalCoinbase(10), additionalSpendFee(10))\n\taccepted()\n\n\t// ---------------------------------------------------------------------\n\t// More signature operations counting tests.\n\t//\n\t// The next several tests ensure signature operations are counted before\n\t// script elements that cause parse failure while those after are\n\t// ignored and that signature operations after script elements that\n\t// successfully parse even if that element will fail at run-time are\n\t// counted.\n\t// ---------------------------------------------------------------------\n\n\t// Create block with more than max allowed signature operations such\n\t// that the signature operation that pushes it over the limit is after\n\t// a push data with a script element size that is larger than the max\n\t// allowed size when executed.  The block must be rejected because the\n\t// signature operation after the script element must be counted since\n\t// the script parses validly.\n\t//\n\t// The script generated consists of the following form:\n\t//\n\t//  Comment assumptions:\n\t//    maxBlockSigOps = 20000\n\t//    maxScriptElementSize = 520\n\t//\n\t//  [0-19999]    : OP_CHECKSIG\n\t//  [20000]      : OP_PUSHDATA4\n\t//  [20001-20004]: 521 (little-endian encoded maxScriptElementSize+1)\n\t//  [20005-20525]: too large script element\n\t//  [20526]      : OP_CHECKSIG (goes over the limit)\n\t//\n\t//   ... -> b69(20)\n\t//                 \\-> b70(21)\n\tscriptSize := maxBlockSigOps + 5 + (maxScriptElementSize + 1) + 1\n\ttooManySigOps = repeatOpcode(txscript.OP_CHECKSIG, scriptSize)\n\ttooManySigOps[maxBlockSigOps] = txscript.OP_PUSHDATA4\n\tbinary.LittleEndian.PutUint32(tooManySigOps[maxBlockSigOps+1:],\n\t\tmaxScriptElementSize+1)\n\tg.nextBlock(\"b70\", outs[21], replaceSpendScript(tooManySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps + 1)\n\trejected(blockchain.ErrTooManySigOps)\n\n\t// Create block with more than max allowed signature operations such\n\t// that the signature operation that pushes it over the limit is before\n\t// an invalid push data that claims a large amount of data even though\n\t// that much data is not provided.\n\t//\n\t//   ... -> b69(20)\n\t//                 \\-> b71(21)\n\tg.setTip(\"b69\")\n\tscriptSize = maxBlockSigOps + 5 + maxScriptElementSize + 1\n\ttooManySigOps = repeatOpcode(txscript.OP_CHECKSIG, scriptSize)\n\ttooManySigOps[maxBlockSigOps+1] = txscript.OP_PUSHDATA4\n\tbinary.LittleEndian.PutUint32(tooManySigOps[maxBlockSigOps+2:], 0xffffffff)\n\tg.nextBlock(\"b71\", outs[21], replaceSpendScript(tooManySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps + 1)\n\trejected(blockchain.ErrTooManySigOps)\n\n\t// Create block with the max allowed signature operations such that all\n\t// counted signature operations are before an invalid push data that\n\t// claims a large amount of data even though that much data is not\n\t// provided.  The pushed data itself consists of OP_CHECKSIG so the\n\t// block would be rejected if any of them were counted.\n\t//\n\t//   ... -> b69(20) -> b72(21)\n\tg.setTip(\"b69\")\n\tscriptSize = maxBlockSigOps + 5 + maxScriptElementSize\n\tmanySigOps = repeatOpcode(txscript.OP_CHECKSIG, scriptSize)\n\tmanySigOps[maxBlockSigOps] = txscript.OP_PUSHDATA4\n\tbinary.LittleEndian.PutUint32(manySigOps[maxBlockSigOps+1:], 0xffffffff)\n\tg.nextBlock(\"b72\", outs[21], replaceSpendScript(manySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps)\n\taccepted()\n\n\t// Create block with the max allowed signature operations such that all\n\t// counted signature operations are before an invalid push data that\n\t// contains OP_CHECKSIG in the number of bytes to push.  The block would\n\t// be rejected if any of them were counted.\n\t//\n\t//   ... -> b72(21) -> b73(22)\n\tscriptSize = maxBlockSigOps + 5 + (maxScriptElementSize + 1)\n\tmanySigOps = repeatOpcode(txscript.OP_CHECKSIG, scriptSize)\n\tmanySigOps[maxBlockSigOps] = txscript.OP_PUSHDATA4\n\tg.nextBlock(\"b73\", outs[22], replaceSpendScript(manySigOps))\n\tg.assertTipBlockSigOpsCount(maxBlockSigOps)\n\taccepted()\n\n\t// ---------------------------------------------------------------------\n\t// Dead execution path tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create block with an invalid opcode in a dead execution path.\n\t//\n\t//   ... -> b73(22) -> b74(23)\n\tscript := []byte{txscript.OP_IF, txscript.OP_INVALIDOPCODE,\n\t\ttxscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}\n\tg.nextBlock(\"b74\", outs[23], replaceSpendScript(script), func(b *wire.MsgBlock) {\n\t\ttx2 := b.Transactions[1]\n\t\ttx3 := createSpendTxForTx(tx2, testhelper.LowFee)\n\t\ttx3.TxIn[0].SignatureScript = []byte{txscript.OP_FALSE}\n\t\tb.AddTransaction(tx3)\n\t})\n\taccepted()\n\n\t// ---------------------------------------------------------------------\n\t// Various OP_RETURN tests.\n\t// ---------------------------------------------------------------------\n\n\t// Create a block that has multiple transactions each with a single\n\t// OP_RETURN output.\n\t//\n\t//   ... -> b74(23) -> b75(24)\n\tg.nextBlock(\"b75\", outs[24], func(b *wire.MsgBlock) {\n\t\t// Add 4 outputs to the spending transaction that are spent\n\t\t// below.\n\t\tconst numAdditionalOutputs = 4\n\t\tconst zeroCoin = int64(0)\n\t\tspendTx := b.Transactions[1]\n\t\tfor i := 0; i < numAdditionalOutputs; i++ {\n\t\t\tspendTx.AddTxOut(wire.NewTxOut(zeroCoin, testhelper.OpTrueScript))\n\t\t}\n\n\t\t// Add transactions spending from the outputs added above that\n\t\t// each contain an OP_RETURN output.\n\t\t//\n\t\t// NOTE: The createSpendTx func adds the OP_RETURN output.\n\t\tzeroFee := btcutil.Amount(0)\n\t\tfor i := uint32(0); i < numAdditionalOutputs; i++ {\n\t\t\tspend := testhelper.MakeSpendableOut(b, 1, i+2)\n\t\t\ttx := testhelper.CreateSpendTx(&spend, zeroFee)\n\t\t\tb.AddTransaction(tx)\n\t\t}\n\t})\n\tg.assertTipBlockNumTxns(6)\n\tg.assertTipBlockTxOutOpReturn(5, 1)\n\tb75OpReturnOut := testhelper.MakeSpendableOut(g.tip, 5, 1)\n\taccepted()\n\n\t// Reorg to a side chain that does not contain the OP_RETURNs.\n\t//\n\t//   ... -> b74(23) -> b75(24)\n\t//                 \\-> b76(24) -> b77(25)\n\tg.setTip(\"b74\")\n\tg.nextBlock(\"b76\", outs[24])\n\tacceptedToSideChainWithExpectedTip(\"b75\")\n\n\tg.nextBlock(\"b77\", outs[25])\n\taccepted()\n\n\t// Reorg back to the original chain that contains the OP_RETURNs.\n\t//\n\t//   ... -> b74(23) -> b75(24) -> b78(25) -> b79(26)\n\t//                 \\-> b76(24) -> b77(25)\n\tg.setTip(\"b75\")\n\tg.nextBlock(\"b78\", outs[25])\n\tacceptedToSideChainWithExpectedTip(\"b77\")\n\n\tg.nextBlock(\"b79\", outs[26])\n\taccepted()\n\n\t// Create a block that spends an OP_RETURN.\n\t//\n\t//   ... -> b74(23) -> b75(24) -> b78(25) -> b79(26)\n\t//                 \\-> b76(24) -> b77(25)           \\-> b80(b75.tx[5].out[1])\n\t//\n\t// An OP_RETURN output doesn't have any value and the default behavior\n\t// of nextBlock is to assign a fee of one, so increment the amount here\n\t// to effective negate that behavior.\n\tb75OpReturnOut.Amount++\n\tg.nextBlock(\"b80\", &b75OpReturnOut)\n\trejected(blockchain.ErrMissingTxOut)\n\n\t// Create a block that has a transaction with multiple OP_RETURNs.  Even\n\t// though it's not considered a standard transaction, it is still valid\n\t// by the consensus rules.\n\t//\n\t//   ... -> b79(26) -> b81(27)\n\t//\n\tg.setTip(\"b79\")\n\tg.nextBlock(\"b81\", outs[27], func(b *wire.MsgBlock) {\n\t\tconst numAdditionalOutputs = 4\n\t\tconst zeroCoin = int64(0)\n\t\tspendTx := b.Transactions[1]\n\t\tfor i := 0; i < numAdditionalOutputs; i++ {\n\t\t\topRetScript, err := testhelper.UniqueOpReturnScript()\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tspendTx.AddTxOut(wire.NewTxOut(zeroCoin, opRetScript))\n\t\t}\n\t})\n\tfor i := uint32(2); i < 6; i++ {\n\t\tg.assertTipBlockTxOutOpReturn(1, i)\n\t}\n\taccepted()\n\n\t// Create a chain where the utxo created in b82a is spent in b83a.\n\t//\n\t//   b81() -> b82a(28) -> b83a(b82.tx[1].out[0])\n\t//\n\tg.nextBlock(\"b82a\", outs[28])\n\taccepted()\n\n\tb82aTx1Out0 := testhelper.MakeSpendableOut(g.tip, 1, 0)\n\tg.nextBlock(\"b83a\", &b82aTx1Out0)\n\taccepted()\n\n\t// Now we'll build a side-chain where we don't spend any of the outputs.\n\t//\n\t//   b81() -> b82a(28) -> b83a(b82.tx[1].out[0])\n\t//        \\-> b82()    -> b83()\n\t//\n\tg.setTip(\"b81\")\n\tg.nextBlock(\"b82\", nil)\n\tacceptedToSideChainWithExpectedTip(\"b83a\")\n\n\tg.nextBlock(\"b83\", nil)\n\tacceptedToSideChainWithExpectedTip(\"b83a\")\n\n\t// At this point b83a is still the tip.  When we add block 84, the tip\n\t// will change. Pre-load up the expected utxos test before the reorganization.\n\t//\n\t// We expect b82a output to now be a utxo since b83a was spending it and it was\n\t// removed from the main chain.\n\tblockDisconnectExpectUTXO(\"b82aTx1Out0\",\n\t\ttrue, b82aTx1Out0.PrevOut, g.blocksByName[\"b83a\"].BlockHash())\n\n\t// We expect the output from b82 to not exist once b82a itself has been removed\n\t// from the main chain.\n\tblockDisconnectExpectUTXO(\"b82aTx1Out0\",\n\t\tfalse, b82aTx1Out0.PrevOut, g.blocksByName[\"b82a\"].BlockHash())\n\n\t// The output that was being spent in b82a should exist after the removal of\n\t// b82a.\n\tblockDisconnectExpectUTXO(\"outs[28]\",\n\t\ttrue, outs[28].PrevOut, g.blocksByName[\"b82a\"].BlockHash())\n\n\t// Create block 84 and reorg out the sidechain with b83a as the tip.\n\t//\n\t//   b81() -> b82a(28) -> b83a(b82.tx[1].out[0])\n\t//        \\-> b82()    -> b83()                  -> b84()\n\t//\n\tg.nextBlock(\"b84\", nil)\n\taccepted()\n\n\t// ---------------------------------------------------------------------\n\t// Large block re-org test.\n\t// ---------------------------------------------------------------------\n\n\tif !includeLargeReorg {\n\t\treturn tests, nil\n\t}\n\n\t// Ensure the tip the re-org test builds on is the best chain tip.\n\t//\n\t//   ... -> b84() -> ...\n\tg.setTip(\"b84\")\n\n\t// Collect all of the spendable coinbase outputs from the previous\n\t// collection point up to the current tip.\n\tg.saveSpendableCoinbaseOuts()\n\tspendableOutOffset := g.tipHeight - int32(coinbaseMaturity)\n\n\t// Extend the main chain by a large number of max size blocks.\n\t//\n\t//   ... -> br0 -> br1 -> ... -> br#\n\ttestInstances = nil\n\treorgSpend := *outs[spendableOutOffset]\n\treorgStartBlockName := g.tipName\n\tchain1TipName := g.tipName\n\tfor i := int32(0); i < numLargeReorgBlocks; i++ {\n\t\tchain1TipName = fmt.Sprintf(\"br%d\", i)\n\t\tg.nextBlock(chain1TipName, &reorgSpend, func(b *wire.MsgBlock) {\n\t\t\tbytesToMaxSize := maxBlockSize - b.SerializeSize() - 3\n\t\t\tsizePadScript := repeatOpcode(0x00, bytesToMaxSize)\n\t\t\treplaceSpendScript(sizePadScript)(b)\n\t\t})\n\t\tg.assertTipBlockSize(maxBlockSize)\n\t\tg.saveTipCoinbaseOut()\n\t\ttestInstances = append(testInstances, acceptBlock(g.tipName,\n\t\t\tg.tip, true, false))\n\n\t\t// Use the next available spendable output.  First use up any\n\t\t// remaining spendable outputs that were already popped into the\n\t\t// outs slice, then just pop them from the stack.\n\t\tif spendableOutOffset+1+i < int32(len(outs)) {\n\t\t\treorgSpend = *outs[spendableOutOffset+1+i]\n\t\t} else {\n\t\t\treorgSpend = g.oldestCoinbaseOut()\n\t\t}\n\t}\n\ttests = append(tests, testInstances)\n\n\t// Create a side chain that has the same length.\n\t//\n\t//   ... -> br0    -> ... -> br#\n\t//      \\-> bralt0 -> ... -> bralt#\n\tg.setTip(reorgStartBlockName)\n\ttestInstances = nil\n\tchain2TipName := g.tipName\n\tfor i := uint16(0); i < numLargeReorgBlocks; i++ {\n\t\tchain2TipName = fmt.Sprintf(\"bralt%d\", i)\n\t\tg.nextBlock(chain2TipName, nil)\n\t\ttestInstances = append(testInstances, acceptBlock(g.tipName,\n\t\t\tg.tip, false, false))\n\t}\n\ttestInstances = append(testInstances, expectTipBlock(chain1TipName,\n\t\tg.blocksByName[chain1TipName]))\n\ttests = append(tests, testInstances)\n\n\t// Extend the side chain by one to force the large reorg.\n\t//\n\t//   ... -> bralt0 -> ... -> bralt# -> bralt#+1\n\t//      \\-> br0    -> ... -> br#\n\tg.nextBlock(fmt.Sprintf(\"bralt%d\", g.tipHeight+1), nil)\n\tchain2TipName = g.tipName\n\taccepted()\n\n\t// Extend the first chain by two to force a large reorg back to it.\n\t//\n\t//   ... -> br0    -> ... -> br#    -> br#+1    -> br#+2\n\t//      \\-> bralt0 -> ... -> bralt# -> bralt#+1\n\tg.setTip(chain1TipName)\n\tg.nextBlock(fmt.Sprintf(\"br%d\", g.tipHeight+1), nil)\n\tchain1TipName = g.tipName\n\tacceptedToSideChainWithExpectedTip(chain2TipName)\n\n\tg.nextBlock(fmt.Sprintf(\"br%d\", g.tipHeight+2), nil)\n\tchain1TipName = g.tipName\n\taccepted()\n\n\treturn tests, nil\n}\n"
  },
  {
    "path": "blockchain/fullblocktests/params.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage fullblocktests\n\nimport (\n\t\"encoding/hex\"\n\t\"math/big\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// newHashFromStr converts the passed big-endian hex string into a\n// wire.Hash.  It only differs from the one available in chainhash in that\n// it panics on an error since it will only (and must only) be called with\n// hard-coded, and therefore known good, hashes.\nfunc newHashFromStr(hexStr string) *chainhash.Hash {\n\thash, err := chainhash.NewHashFromStr(hexStr)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn hash\n}\n\n// fromHex converts the passed hex string into a byte slice and will panic if\n// there is an error.  This is only provided for the hard-coded constants so\n// errors in the source code can be detected. It will only (and must only) be\n// called for initialization purposes.\nfunc fromHex(s string) []byte {\n\tr, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn r\n}\n\nvar (\n\t// bigOne is 1 represented as a big.Int.  It is defined here to avoid\n\t// the overhead of creating it multiple times.\n\tbigOne = big.NewInt(1)\n\n\t// regressionPowLimit is the highest proof of work value a Bitcoin block\n\t// can have for the regression test network.  It is the value 2^255 - 1.\n\tregressionPowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 255), bigOne)\n\n\t// regTestGenesisBlock defines the genesis block of the block chain which serves\n\t// as the public transaction ledger for the regression test network.\n\tregTestGenesisBlock = wire.MsgBlock{\n\t\tHeader: wire.BlockHeader{\n\t\t\tVersion:    1,\n\t\t\tPrevBlock:  *newHashFromStr(\"0000000000000000000000000000000000000000000000000000000000000000\"),\n\t\t\tMerkleRoot: *newHashFromStr(\"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\"),\n\t\t\tTimestamp:  time.Unix(1296688602, 0), // 2011-02-02 23:16:42 +0000 UTC\n\t\t\tBits:       0x207fffff,               // 545259519 [7fffff0000000000000000000000000000000000000000000000000000000000]\n\t\t\tNonce:      2,\n\t\t},\n\t\tTransactions: []*wire.MsgTx{{\n\t\t\tVersion: 1,\n\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\t\tIndex: 0xffffffff,\n\t\t\t\t},\n\t\t\t\tSignatureScript: fromHex(\"04ffff001d010445\" +\n\t\t\t\t\t\"5468652054696d65732030332f4a616e2f\" +\n\t\t\t\t\t\"32303039204368616e63656c6c6f72206f\" +\n\t\t\t\t\t\"6e206272696e6b206f66207365636f6e64\" +\n\t\t\t\t\t\"206261696c6f757420666f72206261686b73\"),\n\t\t\t\tSequence: 0xffffffff,\n\t\t\t}},\n\t\t\tTxOut: []*wire.TxOut{{\n\t\t\t\tValue: 0,\n\t\t\t\tPkScript: fromHex(\"4104678afdb0fe5548271967f1\" +\n\t\t\t\t\t\"a67130b7105cd6a828e03909a67962e0ea1f\" +\n\t\t\t\t\t\"61deb649f6bc3f4cef38c4f35504e51ec138\" +\n\t\t\t\t\t\"c4f35504e51ec112de5c384df7ba0b8d578a\" +\n\t\t\t\t\t\"4c702b6bf11d5fac\"),\n\t\t\t}},\n\t\t\tLockTime: 0,\n\t\t}},\n\t}\n)\n\n// regressionNetParams defines the network parameters for the regression test\n// network.\n//\n// NOTE: The test generator intentionally does not use the existing definitions\n// in the chaincfg package since the intent is to be able to generate known\n// good tests which exercise that code.  Using the chaincfg parameters would\n// allow them to change out from under the tests potentially invalidating them.\nvar regressionNetParams = &chaincfg.Params{\n\tName:        \"regtest\",\n\tNet:         wire.TestNet,\n\tDefaultPort: \"18444\",\n\n\t// Chain parameters\n\tGenesisBlock:             &regTestGenesisBlock,\n\tGenesisHash:              newHashFromStr(\"5bec7567af40504e0994db3b573c186fffcc4edefe096ff2e58d00523bd7e8a6\"),\n\tPowLimit:                 regressionPowLimit,\n\tPowLimitBits:             0x207fffff,\n\tCoinbaseMaturity:         100,\n\tBIP0034Height:            100000000, // Not active - Permit ver 1 blocks\n\tBIP0065Height:            1351,      // Used by regression tests\n\tBIP0066Height:            1251,      // Used by regression tests\n\tSubsidyReductionInterval: 150,\n\tTargetTimespan:           time.Hour * 24 * 14, // 14 days\n\tTargetTimePerBlock:       time.Minute * 10,    // 10 minutes\n\tRetargetAdjustmentFactor: 4,                   // 25% less, 400% more\n\tReduceMinDifficulty:      true,\n\tMinDiffReductionTime:     time.Minute * 20, // TargetTimePerBlock * 2\n\tGenerateSupported:        true,\n\n\t// Checkpoints ordered from oldest to newest.\n\tCheckpoints: nil,\n\n\t// Mempool parameters\n\tRelayNonStdTxs: true,\n\n\t// Address encoding magics\n\tPubKeyHashAddrID: 0x6f, // starts with m or n\n\tScriptHashAddrID: 0xc4, // starts with 2\n\tPrivateKeyID:     0xef, // starts with 9 (uncompressed) or c (compressed)\n\n\t// BIP32 hierarchical deterministic extended key magics\n\tHDPrivateKeyID: [4]byte{0x04, 0x35, 0x83, 0x94}, // starts with tprv\n\tHDPublicKeyID:  [4]byte{0x04, 0x35, 0x87, 0xcf}, // starts with tpub\n\n\t// BIP44 coin type used in the hierarchical deterministic path for\n\t// address generation.\n\tHDCoinType: 1,\n}\n"
  },
  {
    "path": "blockchain/indexers/README.md",
    "content": "indexers\n========\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain/indexers?status.png)](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain/indexers)\n\nPackage indexers implements optional block chain indexes.\n\nThese indexes are typically used to enhance the amount of information available\nvia an RPC interface.\n\n## Supported Indexers\n\n- Transaction-by-hash (txbyhashidx) Index\n  - Creates a mapping from the hash of each transaction to the block that\n    contains it along with its offset and length within the serialized block\n- Transaction-by-address (txbyaddridx) Index\n  - Creates a mapping from every address to all transactions which either credit\n    or debit the address\n  - Requires the transaction-by-hash index\n\n## Installation\n\n```bash\n$ go get -u github.com/btcsuite/btcd/blockchain/indexers\n```\n\n## License\n\nPackage indexers is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "blockchain/indexers/addrindex.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage indexers\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// addrIndexName is the human-readable name for the index.\n\taddrIndexName = \"address index\"\n\n\t// level0MaxEntries is the maximum number of transactions that are\n\t// stored in level 0 of an address index entry.  Subsequent levels store\n\t// 2^n * level0MaxEntries entries, or in words, double the maximum of\n\t// the previous level.\n\tlevel0MaxEntries = 8\n\n\t// addrKeySize is the number of bytes an address key consumes in the\n\t// index.  It consists of 1 byte address type + 20 bytes hash160.\n\taddrKeySize = 1 + 20\n\n\t// levelKeySize is the number of bytes a level key in the address index\n\t// consumes.  It consists of the address key + 1 byte for the level.\n\tlevelKeySize = addrKeySize + 1\n\n\t// levelOffset is the offset in the level key which identifies the level.\n\tlevelOffset = levelKeySize - 1\n\n\t// addrKeyTypePubKeyHash is the address type in an address key which\n\t// represents both a pay-to-pubkey-hash and a pay-to-pubkey address.\n\t// This is done because both are identical for the purposes of the\n\t// address index.\n\taddrKeyTypePubKeyHash = 0\n\n\t// addrKeyTypeScriptHash is the address type in an address key which\n\t// represents a pay-to-script-hash address.  This is necessary because\n\t// the hash of a pubkey address might be the same as that of a script\n\t// hash.\n\taddrKeyTypeScriptHash = 1\n\n\t// addrKeyTypePubKeyHash is the address type in an address key which\n\t// represents a pay-to-witness-pubkey-hash address. This is required\n\t// as the 20-byte data push of a p2wkh witness program may be the same\n\t// data push used a p2pkh address.\n\taddrKeyTypeWitnessPubKeyHash = 2\n\n\t// addrKeyTypeScriptHash is the address type in an address key which\n\t// represents a pay-to-witness-script-hash address. This is required,\n\t// as p2wsh are distinct from p2sh addresses since they use a new\n\t// script template, as well as a 32-byte data push.\n\taddrKeyTypeWitnessScriptHash = 3\n\n\t// addrKeyTypeTaprootPubKey is the address type in an address key that\n\t// represents a pay-to-taproot address. We use this to denote addresses\n\t// related to the segwit v1 that are encoded in the bech32m format.\n\taddrKeyTypeTaprootPubKey = 4\n\n\t// Size of a transaction entry.  It consists of 4 bytes block id + 4\n\t// bytes offset + 4 bytes length.\n\ttxEntrySize = 4 + 4 + 4\n)\n\nvar (\n\t// addrIndexKey is the key of the address index and the db bucket used\n\t// to house it.\n\taddrIndexKey = []byte(\"txbyaddridx\")\n\n\t// errUnsupportedAddressType is an error that is used to signal an\n\t// unsupported address type has been used.\n\terrUnsupportedAddressType = errors.New(\"address type is not supported \" +\n\t\t\"by the address index\")\n)\n\n// -----------------------------------------------------------------------------\n// The address index maps addresses referenced in the blockchain to a list of\n// all the transactions involving that address.  Transactions are stored\n// according to their order of appearance in the blockchain.  That is to say\n// first by block height and then by offset inside the block.  It is also\n// important to note that this implementation requires the transaction index\n// since it is needed in order to catch up old blocks due to the fact the spent\n// outputs will already be pruned from the utxo set.\n//\n// The approach used to store the index is similar to a log-structured merge\n// tree (LSM tree) and is thus similar to how leveldb works internally.\n//\n// Every address consists of one or more entries identified by a level starting\n// from 0 where each level holds a maximum number of entries such that each\n// subsequent level holds double the maximum of the previous one.  In equation\n// form, the number of entries each level holds is 2^n * firstLevelMaxSize.\n//\n// New transactions are appended to level 0 until it becomes full at which point\n// the entire level 0 entry is appended to the level 1 entry and level 0 is\n// cleared.  This process continues until level 1 becomes full at which point it\n// will be appended to level 2 and cleared and so on.\n//\n// The result of this is the lower levels contain newer transactions and the\n// transactions within each level are ordered from oldest to newest.\n//\n// The intent of this approach is to provide a balance between space efficiency\n// and indexing cost.  Storing one entry per transaction would have the lowest\n// indexing cost, but would waste a lot of space because the same address hash\n// would be duplicated for every transaction key.  On the other hand, storing a\n// single entry with all transactions would be the most space efficient, but\n// would cause indexing cost to grow quadratically with the number of\n// transactions involving the same address.  The approach used here provides\n// logarithmic insertion and retrieval.\n//\n// The serialized key format is:\n//\n//   <addr type><addr hash><level>\n//\n//   Field           Type      Size\n//   addr type       uint8     1 byte\n//   addr hash       hash160   20 bytes\n//   level           uint8     1 byte\n//   -----\n//   Total: 22 bytes\n//\n// The serialized value format is:\n//\n//   [<block id><start offset><tx length>,...]\n//\n//   Field           Type      Size\n//   block id        uint32    4 bytes\n//   start offset    uint32    4 bytes\n//   tx length       uint32    4 bytes\n//   -----\n//   Total: 12 bytes per indexed tx\n// -----------------------------------------------------------------------------\n\n// fetchBlockHashFunc defines a callback function to use in order to convert a\n// serialized block ID to an associated block hash.\ntype fetchBlockHashFunc func(serializedID []byte) (*chainhash.Hash, error)\n\n// serializeAddrIndexEntry serializes the provided block id and transaction\n// location according to the format described in detail above.\nfunc serializeAddrIndexEntry(blockID uint32, txLoc wire.TxLoc) []byte {\n\t// Serialize the entry.\n\tserialized := make([]byte, 12)\n\tbyteOrder.PutUint32(serialized, blockID)\n\tbyteOrder.PutUint32(serialized[4:], uint32(txLoc.TxStart))\n\tbyteOrder.PutUint32(serialized[8:], uint32(txLoc.TxLen))\n\treturn serialized\n}\n\n// deserializeAddrIndexEntry decodes the passed serialized byte slice into the\n// provided region struct according to the format described in detail above and\n// uses the passed block hash fetching function in order to convert the block ID\n// to the associated block hash.\nfunc deserializeAddrIndexEntry(serialized []byte, region *database.BlockRegion,\n\tfetchBlockHash fetchBlockHashFunc) error {\n\n\t// Ensure there are enough bytes to decode.\n\tif len(serialized) < txEntrySize {\n\t\treturn errDeserialize(\"unexpected end of data\")\n\t}\n\n\thash, err := fetchBlockHash(serialized[0:4])\n\tif err != nil {\n\t\treturn err\n\t}\n\tregion.Hash = hash\n\tregion.Offset = byteOrder.Uint32(serialized[4:8])\n\tregion.Len = byteOrder.Uint32(serialized[8:12])\n\treturn nil\n}\n\n// keyForLevel returns the key for a specific address and level in the address\n// index entry.\nfunc keyForLevel(addrKey [addrKeySize]byte, level uint8) [levelKeySize]byte {\n\tvar key [levelKeySize]byte\n\tcopy(key[:], addrKey[:])\n\tkey[levelOffset] = level\n\treturn key\n}\n\n// dbPutAddrIndexEntry updates the address index to include the provided entry\n// according to the level-based scheme described in detail above.\nfunc dbPutAddrIndexEntry(bucket internalBucket, addrKey [addrKeySize]byte,\n\tblockID uint32, txLoc wire.TxLoc) error {\n\n\t// Start with level 0 and its initial max number of entries.\n\tcurLevel := uint8(0)\n\tmaxLevelBytes := level0MaxEntries * txEntrySize\n\n\t// Simply append the new entry to level 0 and return now when it will\n\t// fit.  This is the most common path.\n\tnewData := serializeAddrIndexEntry(blockID, txLoc)\n\tlevel0Key := keyForLevel(addrKey, 0)\n\tlevel0Data := bucket.Get(level0Key[:])\n\tif len(level0Data)+len(newData) <= maxLevelBytes {\n\t\tmergedData := newData\n\t\tif len(level0Data) > 0 {\n\t\t\tmergedData = make([]byte, len(level0Data)+len(newData))\n\t\t\tcopy(mergedData, level0Data)\n\t\t\tcopy(mergedData[len(level0Data):], newData)\n\t\t}\n\t\treturn bucket.Put(level0Key[:], mergedData)\n\t}\n\n\t// At this point, level 0 is full, so merge each level into higher\n\t// levels as many times as needed to free up level 0.\n\tprevLevelData := level0Data\n\tfor {\n\t\t// Each new level holds twice as much as the previous one.\n\t\tcurLevel++\n\t\tmaxLevelBytes *= 2\n\n\t\t// Move to the next level as long as the current level is full.\n\t\tcurLevelKey := keyForLevel(addrKey, curLevel)\n\t\tcurLevelData := bucket.Get(curLevelKey[:])\n\t\tif len(curLevelData) == maxLevelBytes {\n\t\t\tprevLevelData = curLevelData\n\t\t\tcontinue\n\t\t}\n\n\t\t// The current level has room for the data in the previous one,\n\t\t// so merge the data from previous level into it.\n\t\tmergedData := prevLevelData\n\t\tif len(curLevelData) > 0 {\n\t\t\tmergedData = make([]byte, len(curLevelData)+\n\t\t\t\tlen(prevLevelData))\n\t\t\tcopy(mergedData, curLevelData)\n\t\t\tcopy(mergedData[len(curLevelData):], prevLevelData)\n\t\t}\n\t\terr := bucket.Put(curLevelKey[:], mergedData)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Move all of the levels before the previous one up a level.\n\t\tfor mergeLevel := curLevel - 1; mergeLevel > 0; mergeLevel-- {\n\t\t\tmergeLevelKey := keyForLevel(addrKey, mergeLevel)\n\t\t\tprevLevelKey := keyForLevel(addrKey, mergeLevel-1)\n\t\t\tprevData := bucket.Get(prevLevelKey[:])\n\t\t\terr := bucket.Put(mergeLevelKey[:], prevData)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tbreak\n\t}\n\n\t// Finally, insert the new entry into level 0 now that it is empty.\n\treturn bucket.Put(level0Key[:], newData)\n}\n\n// dbFetchAddrIndexEntries returns block regions for transactions referenced by\n// the given address key and the number of entries skipped since it could have\n// been less in the case where there are less total entries than the requested\n// number of entries to skip.\nfunc dbFetchAddrIndexEntries(bucket internalBucket, addrKey [addrKeySize]byte,\n\tnumToSkip, numRequested uint32, reverse bool,\n\tfetchBlockHash fetchBlockHashFunc) ([]database.BlockRegion, uint32, error) {\n\n\t// When the reverse flag is not set, all levels need to be fetched\n\t// because numToSkip and numRequested are counted from the oldest\n\t// transactions (highest level) and thus the total count is needed.\n\t// However, when the reverse flag is set, only enough records to satisfy\n\t// the requested amount are needed.\n\tvar level uint8\n\tvar serialized []byte\n\tfor !reverse || len(serialized) < int(numToSkip+numRequested)*txEntrySize {\n\t\tcurLevelKey := keyForLevel(addrKey, level)\n\t\tlevelData := bucket.Get(curLevelKey[:])\n\t\tif levelData == nil {\n\t\t\t// Stop when there are no more levels.\n\t\t\tbreak\n\t\t}\n\n\t\t// Higher levels contain older transactions, so prepend them.\n\t\tprepended := make([]byte, len(serialized)+len(levelData))\n\t\tcopy(prepended, levelData)\n\t\tcopy(prepended[len(levelData):], serialized)\n\t\tserialized = prepended\n\t\tlevel++\n\t}\n\n\t// When the requested number of entries to skip is larger than the\n\t// number available, skip them all and return now with the actual number\n\t// skipped.\n\tnumEntries := uint32(len(serialized) / txEntrySize)\n\tif numToSkip >= numEntries {\n\t\treturn nil, numEntries, nil\n\t}\n\n\t// Nothing more to do when there are no requested entries.\n\tif numRequested == 0 {\n\t\treturn nil, numToSkip, nil\n\t}\n\n\t// Limit the number to load based on the number of available entries,\n\t// the number to skip, and the number requested.\n\tnumToLoad := numEntries - numToSkip\n\tif numToLoad > numRequested {\n\t\tnumToLoad = numRequested\n\t}\n\n\t// Start the offset after all skipped entries and load the calculated\n\t// number.\n\tresults := make([]database.BlockRegion, numToLoad)\n\tfor i := uint32(0); i < numToLoad; i++ {\n\t\t// Calculate the read offset according to the reverse flag.\n\t\tvar offset uint32\n\t\tif reverse {\n\t\t\toffset = (numEntries - numToSkip - i - 1) * txEntrySize\n\t\t} else {\n\t\t\toffset = (numToSkip + i) * txEntrySize\n\t\t}\n\n\t\t// Deserialize and populate the result.\n\t\terr := deserializeAddrIndexEntry(serialized[offset:],\n\t\t\t&results[i], fetchBlockHash)\n\t\tif err != nil {\n\t\t\t// Ensure any deserialization errors are returned as\n\t\t\t// database corruption errors.\n\t\t\tif isDeserializeErr(err) {\n\t\t\t\terr = database.Error{\n\t\t\t\t\tErrorCode: database.ErrCorruption,\n\t\t\t\t\tDescription: fmt.Sprintf(\"failed to \"+\n\t\t\t\t\t\t\"deserialized address index \"+\n\t\t\t\t\t\t\"for key %x: %v\", addrKey, err),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nil, 0, err\n\t\t}\n\t}\n\n\treturn results, numToSkip, nil\n}\n\n// minEntriesToReachLevel returns the minimum number of entries that are\n// required to reach the given address index level.\nfunc minEntriesToReachLevel(level uint8) int {\n\tmaxEntriesForLevel := level0MaxEntries\n\tminRequired := 1\n\tfor l := uint8(1); l <= level; l++ {\n\t\tminRequired += maxEntriesForLevel\n\t\tmaxEntriesForLevel *= 2\n\t}\n\treturn minRequired\n}\n\n// maxEntriesForLevel returns the maximum number of entries allowed for the\n// given address index level.\nfunc maxEntriesForLevel(level uint8) int {\n\tnumEntries := level0MaxEntries\n\tfor l := level; l > 0; l-- {\n\t\tnumEntries *= 2\n\t}\n\treturn numEntries\n}\n\n// dbRemoveAddrIndexEntries removes the specified number of entries from from\n// the address index for the provided key.  An assertion error will be returned\n// if the count exceeds the total number of entries in the index.\nfunc dbRemoveAddrIndexEntries(bucket internalBucket, addrKey [addrKeySize]byte,\n\tcount int) error {\n\n\t// Nothing to do if no entries are being deleted.\n\tif count <= 0 {\n\t\treturn nil\n\t}\n\n\t// Make use of a local map to track pending updates and define a closure\n\t// to apply it to the database.  This is done in order to reduce the\n\t// number of database reads and because there is more than one exit\n\t// path that needs to apply the updates.\n\tpendingUpdates := make(map[uint8][]byte)\n\tapplyPending := func() error {\n\t\tfor level, data := range pendingUpdates {\n\t\t\tcurLevelKey := keyForLevel(addrKey, level)\n\t\t\tif len(data) == 0 {\n\t\t\t\terr := bucket.Delete(curLevelKey[:])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\terr := bucket.Put(curLevelKey[:], data)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\t// Loop forwards through the levels while removing entries until the\n\t// specified number has been removed.  This will potentially result in\n\t// entirely empty lower levels which will be backfilled below.\n\tvar highestLoadedLevel uint8\n\tnumRemaining := count\n\tfor level := uint8(0); numRemaining > 0; level++ {\n\t\t// Load the data for the level from the database.\n\t\tcurLevelKey := keyForLevel(addrKey, level)\n\t\tcurLevelData := bucket.Get(curLevelKey[:])\n\t\tif len(curLevelData) == 0 && numRemaining > 0 {\n\t\t\treturn AssertError(fmt.Sprintf(\"dbRemoveAddrIndexEntries \"+\n\t\t\t\t\"not enough entries for address key %x to \"+\n\t\t\t\t\"delete %d entries\", addrKey, count))\n\t\t}\n\t\tpendingUpdates[level] = curLevelData\n\t\thighestLoadedLevel = level\n\n\t\t// Delete the entire level as needed.\n\t\tnumEntries := len(curLevelData) / txEntrySize\n\t\tif numRemaining >= numEntries {\n\t\t\tpendingUpdates[level] = nil\n\t\t\tnumRemaining -= numEntries\n\t\t\tcontinue\n\t\t}\n\n\t\t// Remove remaining entries to delete from the level.\n\t\toffsetEnd := len(curLevelData) - (numRemaining * txEntrySize)\n\t\tpendingUpdates[level] = curLevelData[:offsetEnd]\n\t\tbreak\n\t}\n\n\t// When all elements in level 0 were not removed there is nothing left\n\t// to do other than updating the database.\n\tif len(pendingUpdates[0]) != 0 {\n\t\treturn applyPending()\n\t}\n\n\t// At this point there are one or more empty levels before the current\n\t// level which need to be backfilled and the current level might have\n\t// had some entries deleted from it as well.  Since all levels after\n\t// level 0 are required to either be empty, half full, or completely\n\t// full, the current level must be adjusted accordingly by backfilling\n\t// each previous levels in a way which satisfies the requirements.  Any\n\t// entries that are left are assigned to level 0 after the loop as they\n\t// are guaranteed to fit by the logic in the loop.  In other words, this\n\t// effectively squashes all remaining entries in the current level into\n\t// the lowest possible levels while following the level rules.\n\t//\n\t// Note that the level after the current level might also have entries\n\t// and gaps are not allowed, so this also keeps track of the lowest\n\t// empty level so the code below knows how far to backfill in case it is\n\t// required.\n\tlowestEmptyLevel := uint8(255)\n\tcurLevelData := pendingUpdates[highestLoadedLevel]\n\tcurLevelMaxEntries := maxEntriesForLevel(highestLoadedLevel)\n\tfor level := highestLoadedLevel; level > 0; level-- {\n\t\t// When there are not enough entries left in the current level\n\t\t// for the number that would be required to reach it, clear the\n\t\t// the current level which effectively moves them all up to the\n\t\t// previous level on the next iteration.  Otherwise, there are\n\t\t// are sufficient entries, so update the current level to\n\t\t// contain as many entries as possible while still leaving\n\t\t// enough remaining entries required to reach the level.\n\t\tnumEntries := len(curLevelData) / txEntrySize\n\t\tprevLevelMaxEntries := curLevelMaxEntries / 2\n\t\tminPrevRequired := minEntriesToReachLevel(level - 1)\n\t\tif numEntries < prevLevelMaxEntries+minPrevRequired {\n\t\t\tlowestEmptyLevel = level\n\t\t\tpendingUpdates[level] = nil\n\t\t} else {\n\t\t\t// This level can only be completely full or half full,\n\t\t\t// so choose the appropriate offset to ensure enough\n\t\t\t// entries remain to reach the level.\n\t\t\tvar offset int\n\t\t\tif numEntries-curLevelMaxEntries >= minPrevRequired {\n\t\t\t\toffset = curLevelMaxEntries * txEntrySize\n\t\t\t} else {\n\t\t\t\toffset = prevLevelMaxEntries * txEntrySize\n\t\t\t}\n\t\t\tpendingUpdates[level] = curLevelData[:offset]\n\t\t\tcurLevelData = curLevelData[offset:]\n\t\t}\n\n\t\tcurLevelMaxEntries = prevLevelMaxEntries\n\t}\n\tpendingUpdates[0] = curLevelData\n\tif len(curLevelData) == 0 {\n\t\tlowestEmptyLevel = 0\n\t}\n\n\t// When the highest loaded level is empty, it's possible the level after\n\t// it still has data and thus that data needs to be backfilled as well.\n\tfor len(pendingUpdates[highestLoadedLevel]) == 0 {\n\t\t// When the next level is empty too, the is no data left to\n\t\t// continue backfilling, so there is nothing left to do.\n\t\t// Otherwise, populate the pending updates map with the newly\n\t\t// loaded data and update the highest loaded level accordingly.\n\t\tlevel := highestLoadedLevel + 1\n\t\tcurLevelKey := keyForLevel(addrKey, level)\n\t\tlevelData := bucket.Get(curLevelKey[:])\n\t\tif len(levelData) == 0 {\n\t\t\tbreak\n\t\t}\n\t\tpendingUpdates[level] = levelData\n\t\thighestLoadedLevel = level\n\n\t\t// At this point the highest level is not empty, but it might\n\t\t// be half full.  When that is the case, move it up a level to\n\t\t// simplify the code below which backfills all lower levels that\n\t\t// are still empty.  This also means the current level will be\n\t\t// empty, so the loop will perform another another iteration to\n\t\t// potentially backfill this level with data from the next one.\n\t\tcurLevelMaxEntries := maxEntriesForLevel(level)\n\t\tif len(levelData)/txEntrySize != curLevelMaxEntries {\n\t\t\tpendingUpdates[level] = nil\n\t\t\tpendingUpdates[level-1] = levelData\n\t\t\tlevel--\n\t\t\tcurLevelMaxEntries /= 2\n\t\t}\n\n\t\t// Backfill all lower levels that are still empty by iteratively\n\t\t// halfing the data until the lowest empty level is filled.\n\t\tfor level > lowestEmptyLevel {\n\t\t\toffset := (curLevelMaxEntries / 2) * txEntrySize\n\t\t\tpendingUpdates[level] = levelData[:offset]\n\t\t\tlevelData = levelData[offset:]\n\t\t\tpendingUpdates[level-1] = levelData\n\t\t\tlevel--\n\t\t\tcurLevelMaxEntries /= 2\n\t\t}\n\n\t\t// The lowest possible empty level is now the highest loaded\n\t\t// level.\n\t\tlowestEmptyLevel = highestLoadedLevel\n\t}\n\n\t// Apply the pending updates.\n\treturn applyPending()\n}\n\n// addrToKey converts known address types to an addrindex key.  An error is\n// returned for unsupported types.\nfunc addrToKey(addr btcutil.Address) ([addrKeySize]byte, error) {\n\tswitch addr := addr.(type) {\n\tcase *btcutil.AddressPubKeyHash:\n\t\tvar result [addrKeySize]byte\n\t\tresult[0] = addrKeyTypePubKeyHash\n\t\tcopy(result[1:], addr.Hash160()[:])\n\t\treturn result, nil\n\n\tcase *btcutil.AddressScriptHash:\n\t\tvar result [addrKeySize]byte\n\t\tresult[0] = addrKeyTypeScriptHash\n\t\tcopy(result[1:], addr.Hash160()[:])\n\t\treturn result, nil\n\n\tcase *btcutil.AddressPubKey:\n\t\tvar result [addrKeySize]byte\n\t\tresult[0] = addrKeyTypePubKeyHash\n\t\tcopy(result[1:], addr.AddressPubKeyHash().Hash160()[:])\n\t\treturn result, nil\n\n\tcase *btcutil.AddressWitnessScriptHash:\n\t\tvar result [addrKeySize]byte\n\t\tresult[0] = addrKeyTypeWitnessScriptHash\n\n\t\t// P2WSH outputs utilize a 32-byte data push created by hashing\n\t\t// the script with sha256 instead of hash160. In order to keep\n\t\t// all address entries within the database uniform and compact,\n\t\t// we use a hash160 here to reduce the size of the salient data\n\t\t// push to 20-bytes.\n\t\tcopy(result[1:], btcutil.Hash160(addr.ScriptAddress()))\n\t\treturn result, nil\n\n\tcase *btcutil.AddressWitnessPubKeyHash:\n\t\tvar result [addrKeySize]byte\n\t\tresult[0] = addrKeyTypeWitnessPubKeyHash\n\t\tcopy(result[1:], addr.Hash160()[:])\n\t\treturn result, nil\n\n\tcase *btcutil.AddressTaproot:\n\t\tvar result [addrKeySize]byte\n\t\tresult[0] = addrKeyTypeTaprootPubKey\n\n\t\t// Taproot outputs are actually just the 32-byte public key.\n\t\t// Similar to the P2WSH outputs, we'll map these to 20-bytes\n\t\t// via the hash160.\n\t\tcopy(result[1:], btcutil.Hash160(addr.ScriptAddress()))\n\t\treturn result, nil\n\t}\n\n\treturn [addrKeySize]byte{}, errUnsupportedAddressType\n}\n\n// AddrIndex implements a transaction by address index.  That is to say, it\n// supports querying all transactions that reference a given address because\n// they are either crediting or debiting the address.  The returned transactions\n// are ordered according to their order of appearance in the blockchain.  In\n// other words, first by block height and then by offset inside the block.\n//\n// In addition, support is provided for a memory-only index of unconfirmed\n// transactions such as those which are kept in the memory pool before inclusion\n// in a block.\ntype AddrIndex struct {\n\t// The following fields are set when the instance is created and can't\n\t// be changed afterwards, so there is no need to protect them with a\n\t// separate mutex.\n\tdb          database.DB\n\tchainParams *chaincfg.Params\n\n\t// The following fields are used to quickly link transactions and\n\t// addresses that have not been included into a block yet when an\n\t// address index is being maintained.  The are protected by the\n\t// unconfirmedLock field.\n\t//\n\t// The txnsByAddr field is used to keep an index of all transactions\n\t// which either create an output to a given address or spend from a\n\t// previous output to it keyed by the address.\n\t//\n\t// The addrsByTx field is essentially the reverse and is used to\n\t// keep an index of all addresses which a given transaction involves.\n\t// This allows fairly efficient updates when transactions are removed\n\t// once they are included into a block.\n\tunconfirmedLock sync.RWMutex\n\ttxnsByAddr      map[[addrKeySize]byte]map[chainhash.Hash]*btcutil.Tx\n\taddrsByTx       map[chainhash.Hash]map[[addrKeySize]byte]struct{}\n}\n\n// Ensure the AddrIndex type implements the Indexer interface.\nvar _ Indexer = (*AddrIndex)(nil)\n\n// Ensure the AddrIndex type implements the NeedsInputser interface.\nvar _ NeedsInputser = (*AddrIndex)(nil)\n\n// NeedsInputs signals that the index requires the referenced inputs in order\n// to properly create the index.\n//\n// This implements the NeedsInputser interface.\nfunc (idx *AddrIndex) NeedsInputs() bool {\n\treturn true\n}\n\n// Init is only provided to satisfy the Indexer interface as there is nothing to\n// initialize for this index.\n//\n// This is part of the Indexer interface.\nfunc (idx *AddrIndex) Init() error {\n\t// Nothing to do.\n\treturn nil\n}\n\n// Key returns the database key to use for the index as a byte slice.\n//\n// This is part of the Indexer interface.\nfunc (idx *AddrIndex) Key() []byte {\n\treturn addrIndexKey\n}\n\n// Name returns the human-readable name of the index.\n//\n// This is part of the Indexer interface.\nfunc (idx *AddrIndex) Name() string {\n\treturn addrIndexName\n}\n\n// Create is invoked when the indexer manager determines the index needs\n// to be created for the first time.  It creates the bucket for the address\n// index.\n//\n// This is part of the Indexer interface.\nfunc (idx *AddrIndex) Create(dbTx database.Tx) error {\n\t_, err := dbTx.Metadata().CreateBucket(addrIndexKey)\n\treturn err\n}\n\n// writeIndexData represents the address index data to be written for one block.\n// It consists of the address mapped to an ordered list of the transactions\n// that involve the address in block.  It is ordered so the transactions can be\n// stored in the order they appear in the block.\ntype writeIndexData map[[addrKeySize]byte][]int\n\n// indexPkScript extracts all standard addresses from the passed public key\n// script and maps each of them to the associated transaction using the passed\n// map.\nfunc (idx *AddrIndex) indexPkScript(data writeIndexData, pkScript []byte, txIdx int) {\n\t// Nothing to index if the script is non-standard or otherwise doesn't\n\t// contain any addresses.\n\t_, addrs, _, err := txscript.ExtractPkScriptAddrs(pkScript,\n\t\tidx.chainParams)\n\tif err != nil || len(addrs) == 0 {\n\t\treturn\n\t}\n\n\tfor _, addr := range addrs {\n\t\taddrKey, err := addrToKey(addr)\n\t\tif err != nil {\n\t\t\t// Ignore unsupported address types.\n\t\t\tcontinue\n\t\t}\n\n\t\t// Avoid inserting the transaction more than once.  Since the\n\t\t// transactions are indexed serially any duplicates will be\n\t\t// indexed in a row, so checking the most recent entry for the\n\t\t// address is enough to detect duplicates.\n\t\tindexedTxns := data[addrKey]\n\t\tnumTxns := len(indexedTxns)\n\t\tif numTxns > 0 && indexedTxns[numTxns-1] == txIdx {\n\t\t\tcontinue\n\t\t}\n\t\tindexedTxns = append(indexedTxns, txIdx)\n\t\tdata[addrKey] = indexedTxns\n\t}\n}\n\n// indexBlock extract all of the standard addresses from all of the transactions\n// in the passed block and maps each of them to the associated transaction using\n// the passed map.\nfunc (idx *AddrIndex) indexBlock(data writeIndexData, block *btcutil.Block,\n\tstxos []blockchain.SpentTxOut) {\n\n\tstxoIndex := 0\n\tfor txIdx, tx := range block.Transactions() {\n\t\t// Coinbases do not reference any inputs.  Since the block is\n\t\t// required to have already gone through full validation, it has\n\t\t// already been proven on the first transaction in the block is\n\t\t// a coinbase.\n\t\tif txIdx != 0 {\n\t\t\tfor range tx.MsgTx().TxIn {\n\t\t\t\t// We'll access the slice of all the\n\t\t\t\t// transactions spent in this block properly\n\t\t\t\t// ordered to fetch the previous input script.\n\t\t\t\tpkScript := stxos[stxoIndex].PkScript\n\t\t\t\tidx.indexPkScript(data, pkScript, txIdx)\n\n\t\t\t\t// With an input indexed, we'll advance the\n\t\t\t\t// stxo counter.\n\t\t\t\tstxoIndex++\n\t\t\t}\n\t\t}\n\n\t\tfor _, txOut := range tx.MsgTx().TxOut {\n\t\t\tidx.indexPkScript(data, txOut.PkScript, txIdx)\n\t\t}\n\t}\n}\n\n// ConnectBlock is invoked by the index manager when a new block has been\n// connected to the main chain.  This indexer adds a mapping for each address\n// the transactions in the block involve.\n//\n// This is part of the Indexer interface.\nfunc (idx *AddrIndex) ConnectBlock(dbTx database.Tx, block *btcutil.Block,\n\tstxos []blockchain.SpentTxOut) error {\n\n\t// The offset and length of the transactions within the serialized\n\t// block.\n\ttxLocs, err := block.TxLoc()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Get the internal block ID associated with the block.\n\tblockID, err := dbFetchBlockIDByHash(dbTx, block.Hash())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Build all of the address to transaction mappings in a local map.\n\taddrsToTxns := make(writeIndexData)\n\tidx.indexBlock(addrsToTxns, block, stxos)\n\n\t// Add all of the index entries for each address.\n\taddrIdxBucket := dbTx.Metadata().Bucket(addrIndexKey)\n\tfor addrKey, txIdxs := range addrsToTxns {\n\t\tfor _, txIdx := range txIdxs {\n\t\t\terr := dbPutAddrIndexEntry(addrIdxBucket, addrKey,\n\t\t\t\tblockID, txLocs[txIdx])\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// DisconnectBlock is invoked by the index manager when a block has been\n// disconnected from the main chain.  This indexer removes the address mappings\n// each transaction in the block involve.\n//\n// This is part of the Indexer interface.\nfunc (idx *AddrIndex) DisconnectBlock(dbTx database.Tx, block *btcutil.Block,\n\tstxos []blockchain.SpentTxOut) error {\n\n\t// Build all of the address to transaction mappings in a local map.\n\taddrsToTxns := make(writeIndexData)\n\tidx.indexBlock(addrsToTxns, block, stxos)\n\n\t// Remove all of the index entries for each address.\n\tbucket := dbTx.Metadata().Bucket(addrIndexKey)\n\tfor addrKey, txIdxs := range addrsToTxns {\n\t\terr := dbRemoveAddrIndexEntries(bucket, addrKey, len(txIdxs))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// TxRegionsForAddress returns a slice of block regions which identify each\n// transaction that involves the passed address according to the specified\n// number to skip, number requested, and whether or not the results should be\n// reversed.  It also returns the number actually skipped since it could be less\n// in the case where there are not enough entries.\n//\n// NOTE: These results only include transactions confirmed in blocks.  See the\n// UnconfirmedTxnsForAddress method for obtaining unconfirmed transactions\n// that involve a given address.\n//\n// This function is safe for concurrent access.\nfunc (idx *AddrIndex) TxRegionsForAddress(dbTx database.Tx, addr btcutil.Address,\n\tnumToSkip, numRequested uint32, reverse bool) ([]database.BlockRegion, uint32, error) {\n\n\taddrKey, err := addrToKey(addr)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\tvar regions []database.BlockRegion\n\tvar skipped uint32\n\terr = idx.db.View(func(dbTx database.Tx) error {\n\t\t// Create closure to lookup the block hash given the ID using\n\t\t// the database transaction.\n\t\tfetchBlockHash := func(id []byte) (*chainhash.Hash, error) {\n\t\t\t// Deserialize and populate the result.\n\t\t\treturn dbFetchBlockHashBySerializedID(dbTx, id)\n\t\t}\n\n\t\tvar err error\n\t\taddrIdxBucket := dbTx.Metadata().Bucket(addrIndexKey)\n\t\tregions, skipped, err = dbFetchAddrIndexEntries(addrIdxBucket,\n\t\t\taddrKey, numToSkip, numRequested, reverse,\n\t\t\tfetchBlockHash)\n\t\treturn err\n\t})\n\n\treturn regions, skipped, err\n}\n\n// indexUnconfirmedAddresses modifies the unconfirmed (memory-only) address\n// index to include mappings for the addresses encoded by the passed public key\n// script to the transaction.\n//\n// This function is safe for concurrent access.\nfunc (idx *AddrIndex) indexUnconfirmedAddresses(pkScript []byte, tx *btcutil.Tx) {\n\t// The error is ignored here since the only reason it can fail is if the\n\t// script fails to parse and it was already validated before being\n\t// admitted to the mempool.\n\t_, addresses, _, _ := txscript.ExtractPkScriptAddrs(pkScript,\n\t\tidx.chainParams)\n\tfor _, addr := range addresses {\n\t\t// Ignore unsupported address types.\n\t\taddrKey, err := addrToKey(addr)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Add a mapping from the address to the transaction.\n\t\tidx.unconfirmedLock.Lock()\n\t\taddrIndexEntry := idx.txnsByAddr[addrKey]\n\t\tif addrIndexEntry == nil {\n\t\t\taddrIndexEntry = make(map[chainhash.Hash]*btcutil.Tx)\n\t\t\tidx.txnsByAddr[addrKey] = addrIndexEntry\n\t\t}\n\t\taddrIndexEntry[*tx.Hash()] = tx\n\n\t\t// Add a mapping from the transaction to the address.\n\t\taddrsByTxEntry := idx.addrsByTx[*tx.Hash()]\n\t\tif addrsByTxEntry == nil {\n\t\t\taddrsByTxEntry = make(map[[addrKeySize]byte]struct{})\n\t\t\tidx.addrsByTx[*tx.Hash()] = addrsByTxEntry\n\t\t}\n\t\taddrsByTxEntry[addrKey] = struct{}{}\n\t\tidx.unconfirmedLock.Unlock()\n\t}\n}\n\n// AddUnconfirmedTx adds all addresses related to the transaction to the\n// unconfirmed (memory-only) address index.\n//\n// NOTE: This transaction MUST have already been validated by the memory pool\n// before calling this function with it and have all of the inputs available in\n// the provided utxo view.  Failure to do so could result in some or all\n// addresses not being indexed.\n//\n// This function is safe for concurrent access.\nfunc (idx *AddrIndex) AddUnconfirmedTx(tx *btcutil.Tx, utxoView *blockchain.UtxoViewpoint) {\n\t// Index addresses of all referenced previous transaction outputs.\n\t//\n\t// The existence checks are elided since this is only called after the\n\t// transaction has already been validated and thus all inputs are\n\t// already known to exist.\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tentry := utxoView.LookupEntry(txIn.PreviousOutPoint)\n\t\tif entry == nil {\n\t\t\t// Ignore missing entries.  This should never happen\n\t\t\t// in practice since the function comments specifically\n\t\t\t// call out all inputs must be available.\n\t\t\tcontinue\n\t\t}\n\t\tidx.indexUnconfirmedAddresses(entry.PkScript(), tx)\n\t}\n\n\t// Index addresses of all created outputs.\n\tfor _, txOut := range tx.MsgTx().TxOut {\n\t\tidx.indexUnconfirmedAddresses(txOut.PkScript, tx)\n\t}\n}\n\n// RemoveUnconfirmedTx removes the passed transaction from the unconfirmed\n// (memory-only) address index.\n//\n// This function is safe for concurrent access.\nfunc (idx *AddrIndex) RemoveUnconfirmedTx(hash *chainhash.Hash) {\n\tidx.unconfirmedLock.Lock()\n\tdefer idx.unconfirmedLock.Unlock()\n\n\t// Remove all address references to the transaction from the address\n\t// index and remove the entry for the address altogether if it no longer\n\t// references any transactions.\n\tfor addrKey := range idx.addrsByTx[*hash] {\n\t\tdelete(idx.txnsByAddr[addrKey], *hash)\n\t\tif len(idx.txnsByAddr[addrKey]) == 0 {\n\t\t\tdelete(idx.txnsByAddr, addrKey)\n\t\t}\n\t}\n\n\t// Remove the entry from the transaction to address lookup map as well.\n\tdelete(idx.addrsByTx, *hash)\n}\n\n// UnconfirmedTxnsForAddress returns all transactions currently in the\n// unconfirmed (memory-only) address index that involve the passed address.\n// Unsupported address types are ignored and will result in no results.\n//\n// This function is safe for concurrent access.\nfunc (idx *AddrIndex) UnconfirmedTxnsForAddress(addr btcutil.Address) []*btcutil.Tx {\n\t// Ignore unsupported address types.\n\taddrKey, err := addrToKey(addr)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\t// Protect concurrent access.\n\tidx.unconfirmedLock.RLock()\n\tdefer idx.unconfirmedLock.RUnlock()\n\n\t// Return a new slice with the results if there are any.  This ensures\n\t// safe concurrency.\n\tif txns, exists := idx.txnsByAddr[addrKey]; exists {\n\t\taddressTxns := make([]*btcutil.Tx, 0, len(txns))\n\t\tfor _, tx := range txns {\n\t\t\taddressTxns = append(addressTxns, tx)\n\t\t}\n\t\treturn addressTxns\n\t}\n\n\treturn nil\n}\n\n// NewAddrIndex returns a new instance of an indexer that is used to create a\n// mapping of all addresses in the blockchain to the respective transactions\n// that involve them.\n//\n// It implements the Indexer interface which plugs into the IndexManager that in\n// turn is used by the blockchain package.  This allows the index to be\n// seamlessly maintained along with the chain.\nfunc NewAddrIndex(db database.DB, chainParams *chaincfg.Params) *AddrIndex {\n\treturn &AddrIndex{\n\t\tdb:          db,\n\t\tchainParams: chainParams,\n\t\ttxnsByAddr:  make(map[[addrKeySize]byte]map[chainhash.Hash]*btcutil.Tx),\n\t\taddrsByTx:   make(map[chainhash.Hash]map[[addrKeySize]byte]struct{}),\n\t}\n}\n\n// DropAddrIndex drops the address index from the provided database if it\n// exists.\nfunc DropAddrIndex(db database.DB, interrupt <-chan struct{}) error {\n\treturn dropIndex(db, addrIndexKey, addrIndexName, interrupt)\n}\n\n// AddrIndexInitialized returns true if the address index has been created previously.\nfunc AddrIndexInitialized(db database.DB) bool {\n\tvar exists bool\n\tdb.View(func(dbTx database.Tx) error {\n\t\tbucket := dbTx.Metadata().Bucket(addrIndexKey)\n\t\texists = bucket != nil\n\t\treturn nil\n\t})\n\n\treturn exists\n}\n"
  },
  {
    "path": "blockchain/indexers/addrindex_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage indexers\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// addrIndexBucket provides a mock address index database bucket by implementing\n// the internalBucket interface.\ntype addrIndexBucket struct {\n\tlevels map[[levelKeySize]byte][]byte\n}\n\n// Clone returns a deep copy of the mock address index bucket.\nfunc (b *addrIndexBucket) Clone() *addrIndexBucket {\n\tlevels := make(map[[levelKeySize]byte][]byte)\n\tfor k, v := range b.levels {\n\t\tvCopy := make([]byte, len(v))\n\t\tcopy(vCopy, v)\n\t\tlevels[k] = vCopy\n\t}\n\treturn &addrIndexBucket{levels: levels}\n}\n\n// Get returns the value associated with the key from the mock address index\n// bucket.\n//\n// This is part of the internalBucket interface.\nfunc (b *addrIndexBucket) Get(key []byte) []byte {\n\tvar levelKey [levelKeySize]byte\n\tcopy(levelKey[:], key)\n\treturn b.levels[levelKey]\n}\n\n// Put stores the provided key/value pair to the mock address index bucket.\n//\n// This is part of the internalBucket interface.\nfunc (b *addrIndexBucket) Put(key []byte, value []byte) error {\n\tvar levelKey [levelKeySize]byte\n\tcopy(levelKey[:], key)\n\tb.levels[levelKey] = value\n\treturn nil\n}\n\n// Delete removes the provided key from the mock address index bucket.\n//\n// This is part of the internalBucket interface.\nfunc (b *addrIndexBucket) Delete(key []byte) error {\n\tvar levelKey [levelKeySize]byte\n\tcopy(levelKey[:], key)\n\tdelete(b.levels, levelKey)\n\treturn nil\n}\n\n// printLevels returns a string with a visual representation of the provided\n// address key taking into account the max size of each level.  It is useful\n// when creating and debugging test cases.\nfunc (b *addrIndexBucket) printLevels(addrKey [addrKeySize]byte) string {\n\thighestLevel := uint8(0)\n\tfor k := range b.levels {\n\t\tif !bytes.Equal(k[:levelOffset], addrKey[:]) {\n\t\t\tcontinue\n\t\t}\n\t\tlevel := k[levelOffset]\n\t\tif level > highestLevel {\n\t\t\thighestLevel = level\n\t\t}\n\t}\n\n\tvar levelBuf bytes.Buffer\n\t_, _ = levelBuf.WriteString(\"\\n\")\n\tmaxEntries := level0MaxEntries\n\tfor level := uint8(0); level <= highestLevel; level++ {\n\t\tdata := b.levels[keyForLevel(addrKey, level)]\n\t\tnumEntries := len(data) / txEntrySize\n\t\tfor i := 0; i < numEntries; i++ {\n\t\t\tstart := i * txEntrySize\n\t\t\tnum := byteOrder.Uint32(data[start:])\n\t\t\t_, _ = levelBuf.WriteString(fmt.Sprintf(\"%02d \", num))\n\t\t}\n\t\tfor i := numEntries; i < maxEntries; i++ {\n\t\t\t_, _ = levelBuf.WriteString(\"_  \")\n\t\t}\n\t\t_, _ = levelBuf.WriteString(\"\\n\")\n\t\tmaxEntries *= 2\n\t}\n\n\treturn levelBuf.String()\n}\n\n// sanityCheck ensures that all data stored in the bucket for the given address\n// adheres to the level-based rules described by the address index\n// documentation.\nfunc (b *addrIndexBucket) sanityCheck(addrKey [addrKeySize]byte, expectedTotal int) error {\n\t// Find the highest level for the key.\n\thighestLevel := uint8(0)\n\tfor k := range b.levels {\n\t\tif !bytes.Equal(k[:levelOffset], addrKey[:]) {\n\t\t\tcontinue\n\t\t}\n\t\tlevel := k[levelOffset]\n\t\tif level > highestLevel {\n\t\t\thighestLevel = level\n\t\t}\n\t}\n\n\t// Ensure the expected total number of entries are present and that\n\t// all levels adhere to the rules described in the address index\n\t// documentation.\n\tvar totalEntries int\n\tmaxEntries := level0MaxEntries\n\tfor level := uint8(0); level <= highestLevel; level++ {\n\t\t// Level 0 can'have more entries than the max allowed if the\n\t\t// levels after it have data and it can't be empty.  All other\n\t\t// levels must either be half full or full.\n\t\tdata := b.levels[keyForLevel(addrKey, level)]\n\t\tnumEntries := len(data) / txEntrySize\n\t\ttotalEntries += numEntries\n\t\tif level == 0 {\n\t\t\tif (highestLevel != 0 && numEntries == 0) ||\n\t\t\t\tnumEntries > maxEntries {\n\n\t\t\t\treturn fmt.Errorf(\"level %d has %d entries\",\n\t\t\t\t\tlevel, numEntries)\n\t\t\t}\n\t\t} else if numEntries != maxEntries && numEntries != maxEntries/2 {\n\t\t\treturn fmt.Errorf(\"level %d has %d entries\", level,\n\t\t\t\tnumEntries)\n\t\t}\n\t\tmaxEntries *= 2\n\t}\n\tif totalEntries != expectedTotal {\n\t\treturn fmt.Errorf(\"expected %d entries - got %d\", expectedTotal,\n\t\t\ttotalEntries)\n\t}\n\n\t// Ensure all of the numbers are in order starting from the highest\n\t// level moving to the lowest level.\n\texpectedNum := uint32(0)\n\tfor level := highestLevel + 1; level > 0; level-- {\n\t\tdata := b.levels[keyForLevel(addrKey, level)]\n\t\tnumEntries := len(data) / txEntrySize\n\t\tfor i := 0; i < numEntries; i++ {\n\t\t\tstart := i * txEntrySize\n\t\t\tnum := byteOrder.Uint32(data[start:])\n\t\t\tif num != expectedNum {\n\t\t\t\treturn fmt.Errorf(\"level %d offset %d does \"+\n\t\t\t\t\t\"not contain the expected number of \"+\n\t\t\t\t\t\"%d - got %d\", level, i, num,\n\t\t\t\t\texpectedNum)\n\t\t\t}\n\t\t\texpectedNum++\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// TestAddrIndexLevels ensures that adding and deleting entries to the address\n// index creates multiple levels as described by the address index\n// documentation.\nfunc TestAddrIndexLevels(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname        string\n\t\tkey         [addrKeySize]byte\n\t\tnumInsert   int\n\t\tprintLevels bool // Set to help debug a specific test.\n\t}{\n\t\t{\n\t\t\tname:      \"level 0 not full\",\n\t\t\tnumInsert: level0MaxEntries - 1,\n\t\t},\n\t\t{\n\t\t\tname:      \"level 1 half\",\n\t\t\tnumInsert: level0MaxEntries + 1,\n\t\t},\n\t\t{\n\t\t\tname:      \"level 1 full\",\n\t\t\tnumInsert: level0MaxEntries*2 + 1,\n\t\t},\n\t\t{\n\t\t\tname:      \"level 2 half, level 1 half\",\n\t\t\tnumInsert: level0MaxEntries*3 + 1,\n\t\t},\n\t\t{\n\t\t\tname:      \"level 2 half, level 1 full\",\n\t\t\tnumInsert: level0MaxEntries*4 + 1,\n\t\t},\n\t\t{\n\t\t\tname:      \"level 2 full, level 1 half\",\n\t\t\tnumInsert: level0MaxEntries*5 + 1,\n\t\t},\n\t\t{\n\t\t\tname:      \"level 2 full, level 1 full\",\n\t\t\tnumInsert: level0MaxEntries*6 + 1,\n\t\t},\n\t\t{\n\t\t\tname:      \"level 3 half, level 2 half, level 1 half\",\n\t\t\tnumInsert: level0MaxEntries*7 + 1,\n\t\t},\n\t\t{\n\t\t\tname:      \"level 3 full, level 2 half, level 1 full\",\n\t\t\tnumInsert: level0MaxEntries*12 + 1,\n\t\t},\n\t}\n\nnextTest:\n\tfor testNum, test := range tests {\n\t\t// Insert entries in order.\n\t\tpopulatedBucket := &addrIndexBucket{\n\t\t\tlevels: make(map[[levelKeySize]byte][]byte),\n\t\t}\n\t\tfor i := 0; i < test.numInsert; i++ {\n\t\t\ttxLoc := wire.TxLoc{TxStart: i * 2}\n\t\t\terr := dbPutAddrIndexEntry(populatedBucket, test.key,\n\t\t\t\tuint32(i), txLoc)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"dbPutAddrIndexEntry #%d (%s) - \"+\n\t\t\t\t\t\"unexpected error: %v\", testNum,\n\t\t\t\t\ttest.name, err)\n\t\t\t\tcontinue nextTest\n\t\t\t}\n\t\t}\n\t\tif test.printLevels {\n\t\t\tt.Log(populatedBucket.printLevels(test.key))\n\t\t}\n\n\t\t// Delete entries from the populated bucket until all entries\n\t\t// have been deleted.  The bucket is reset to the fully\n\t\t// populated bucket on each iteration so every combination is\n\t\t// tested.  Notice the upper limit purposes exceeds the number\n\t\t// of entries to ensure attempting to delete more entries than\n\t\t// there are works correctly.\n\t\tfor numDelete := 0; numDelete <= test.numInsert+1; numDelete++ {\n\t\t\t// Clone populated bucket to run each delete against.\n\t\t\tbucket := populatedBucket.Clone()\n\n\t\t\t// Remove the number of entries for this iteration.\n\t\t\terr := dbRemoveAddrIndexEntries(bucket, test.key,\n\t\t\t\tnumDelete)\n\t\t\tif err != nil {\n\t\t\t\tif numDelete <= test.numInsert {\n\t\t\t\t\tt.Errorf(\"dbRemoveAddrIndexEntries (%s) \"+\n\t\t\t\t\t\t\" delete %d - unexpected error: \"+\n\t\t\t\t\t\t\"%v\", test.name, numDelete, err)\n\t\t\t\t\tcontinue nextTest\n\t\t\t\t}\n\t\t\t}\n\t\t\tif test.printLevels {\n\t\t\t\tt.Log(bucket.printLevels(test.key))\n\t\t\t}\n\n\t\t\t// Sanity check the levels to ensure the adhere to all\n\t\t\t// rules.\n\t\t\tnumExpected := test.numInsert\n\t\t\tif numDelete <= test.numInsert {\n\t\t\t\tnumExpected -= numDelete\n\t\t\t}\n\t\t\terr = bucket.sanityCheck(test.key, numExpected)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"sanity check fail (%s) delete %d: %v\",\n\t\t\t\t\ttest.name, numDelete, err)\n\t\t\t\tcontinue nextTest\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blockchain/indexers/blocklogger.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage indexers\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btclog\"\n)\n\n// blockProgressLogger provides periodic logging for other services in order\n// to show users progress of certain \"actions\" involving some or all current\n// blocks. Ex: syncing to best chain, indexing all blocks, etc.\ntype blockProgressLogger struct {\n\treceivedLogBlocks int64\n\treceivedLogTx     int64\n\tlastBlockLogTime  time.Time\n\n\tsubsystemLogger btclog.Logger\n\tprogressAction  string\n\tsync.Mutex\n}\n\n// newBlockProgressLogger returns a new block progress logger.\n// The progress message is templated as follows:\n//\n//\t{progressAction} {numProcessed} {blocks|block} in the last {timePeriod}\n//\t({numTxs}, height {lastBlockHeight}, {lastBlockTimeStamp})\nfunc newBlockProgressLogger(progressMessage string, logger btclog.Logger) *blockProgressLogger {\n\treturn &blockProgressLogger{\n\t\tlastBlockLogTime: time.Now(),\n\t\tprogressAction:   progressMessage,\n\t\tsubsystemLogger:  logger,\n\t}\n}\n\n// LogBlockHeight logs a new block height as an information message to show\n// progress to the user. In order to prevent spam, it limits logging to one\n// message every 10 seconds with duration and totals included.\nfunc (b *blockProgressLogger) LogBlockHeight(block *btcutil.Block) {\n\tb.Lock()\n\tdefer b.Unlock()\n\n\tb.receivedLogBlocks++\n\tb.receivedLogTx += int64(len(block.MsgBlock().Transactions))\n\n\tnow := time.Now()\n\tduration := now.Sub(b.lastBlockLogTime)\n\tif duration < time.Second*10 {\n\t\treturn\n\t}\n\n\t// Truncate the duration to 10s of milliseconds.\n\tdurationMillis := int64(duration / time.Millisecond)\n\ttDuration := 10 * time.Millisecond * time.Duration(durationMillis/10)\n\n\t// Log information about new block height.\n\tblockStr := \"blocks\"\n\tif b.receivedLogBlocks == 1 {\n\t\tblockStr = \"block\"\n\t}\n\ttxStr := \"transactions\"\n\tif b.receivedLogTx == 1 {\n\t\ttxStr = \"transaction\"\n\t}\n\tb.subsystemLogger.Infof(\"%s %d %s in the last %s (%d %s, height %d, %s)\",\n\t\tb.progressAction, b.receivedLogBlocks, blockStr, tDuration, b.receivedLogTx,\n\t\ttxStr, block.Height(), block.MsgBlock().Header.Timestamp)\n\n\tb.receivedLogBlocks = 0\n\tb.receivedLogTx = 0\n\tb.lastBlockLogTime = now\n}\n"
  },
  {
    "path": "blockchain/indexers/cfindex.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage indexers\n\nimport (\n\t\"errors\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/btcutil/gcs\"\n\t\"github.com/btcsuite/btcd/btcutil/gcs/builder\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// cfIndexName is the human-readable name for the index.\n\tcfIndexName = \"committed filter index\"\n)\n\n// Committed filters come in one flavor currently: basic. They are generated\n// and dropped in pairs, and both are indexed by a block's hash.  Besides\n// holding different content, they also live in different buckets.\nvar (\n\t// cfIndexParentBucketKey is the name of the parent bucket used to\n\t// house the index. The rest of the buckets live below this bucket.\n\tcfIndexParentBucketKey = []byte(\"cfindexparentbucket\")\n\n\t// cfIndexKeys is an array of db bucket names used to house indexes of\n\t// block hashes to cfilters.\n\tcfIndexKeys = [][]byte{\n\t\t[]byte(\"cf0byhashidx\"),\n\t}\n\n\t// cfHeaderKeys is an array of db bucket names used to house indexes of\n\t// block hashes to cf headers.\n\tcfHeaderKeys = [][]byte{\n\t\t[]byte(\"cf0headerbyhashidx\"),\n\t}\n\n\t// cfHashKeys is an array of db bucket names used to house indexes of\n\t// block hashes to cf hashes.\n\tcfHashKeys = [][]byte{\n\t\t[]byte(\"cf0hashbyhashidx\"),\n\t}\n\n\tmaxFilterType = uint8(len(cfHeaderKeys) - 1)\n\n\t// zeroHash is the chainhash.Hash value of all zero bytes, defined here\n\t// for convenience.\n\tzeroHash chainhash.Hash\n)\n\n// dbFetchFilterIdxEntry retrieves a data blob from the filter index database.\n// An entry's absence is not considered an error.\nfunc dbFetchFilterIdxEntry(dbTx database.Tx, key []byte, h *chainhash.Hash) ([]byte, error) {\n\tidx := dbTx.Metadata().Bucket(cfIndexParentBucketKey).Bucket(key)\n\treturn idx.Get(h[:]), nil\n}\n\n// dbStoreFilterIdxEntry stores a data blob in the filter index database.\nfunc dbStoreFilterIdxEntry(dbTx database.Tx, key []byte, h *chainhash.Hash, f []byte) error {\n\tidx := dbTx.Metadata().Bucket(cfIndexParentBucketKey).Bucket(key)\n\treturn idx.Put(h[:], f)\n}\n\n// dbDeleteFilterIdxEntry deletes a data blob from the filter index database.\nfunc dbDeleteFilterIdxEntry(dbTx database.Tx, key []byte, h *chainhash.Hash) error {\n\tidx := dbTx.Metadata().Bucket(cfIndexParentBucketKey).Bucket(key)\n\treturn idx.Delete(h[:])\n}\n\n// CfIndex implements a committed filter (cf) by hash index.\ntype CfIndex struct {\n\tdb          database.DB\n\tchainParams *chaincfg.Params\n}\n\n// Ensure the CfIndex type implements the Indexer interface.\nvar _ Indexer = (*CfIndex)(nil)\n\n// Ensure the CfIndex type implements the NeedsInputser interface.\nvar _ NeedsInputser = (*CfIndex)(nil)\n\n// NeedsInputs signals that the index requires the referenced inputs in order\n// to properly create the index.\n//\n// This implements the NeedsInputser interface.\nfunc (idx *CfIndex) NeedsInputs() bool {\n\treturn true\n}\n\n// Init initializes the hash-based cf index. This is part of the Indexer\n// interface.\nfunc (idx *CfIndex) Init() error {\n\treturn nil // Nothing to do.\n}\n\n// Key returns the database key to use for the index as a byte slice. This is\n// part of the Indexer interface.\nfunc (idx *CfIndex) Key() []byte {\n\treturn cfIndexParentBucketKey\n}\n\n// Name returns the human-readable name of the index. This is part of the\n// Indexer interface.\nfunc (idx *CfIndex) Name() string {\n\treturn cfIndexName\n}\n\n// Create is invoked when the indexer manager determines the index needs to\n// be created for the first time. It creates buckets for the two hash-based cf\n// indexes (regular only currently).\nfunc (idx *CfIndex) Create(dbTx database.Tx) error {\n\tmeta := dbTx.Metadata()\n\n\tcfIndexParentBucket, err := meta.CreateBucket(cfIndexParentBucketKey)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, bucketName := range cfIndexKeys {\n\t\t_, err = cfIndexParentBucket.CreateBucket(bucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, bucketName := range cfHeaderKeys {\n\t\t_, err = cfIndexParentBucket.CreateBucket(bucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, bucketName := range cfHashKeys {\n\t\t_, err = cfIndexParentBucket.CreateBucket(bucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// storeFilter stores a given filter, and performs the steps needed to\n// generate the filter's header.\nfunc storeFilter(dbTx database.Tx, block *btcutil.Block, f *gcs.Filter,\n\tfilterType wire.FilterType) error {\n\tif uint8(filterType) > maxFilterType {\n\t\treturn errors.New(\"unsupported filter type\")\n\t}\n\n\t// Figure out which buckets to use.\n\tfkey := cfIndexKeys[filterType]\n\thkey := cfHeaderKeys[filterType]\n\thashkey := cfHashKeys[filterType]\n\n\t// Start by storing the filter.\n\th := block.Hash()\n\tfilterBytes, err := f.NBytes()\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = dbStoreFilterIdxEntry(dbTx, fkey, h, filterBytes)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Next store the filter hash.\n\tfilterHash, err := builder.GetFilterHash(f)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = dbStoreFilterIdxEntry(dbTx, hashkey, h, filterHash[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Then fetch the previous block's filter header.\n\tvar prevHeader *chainhash.Hash\n\tph := &block.MsgBlock().Header.PrevBlock\n\tif ph.IsEqual(&zeroHash) {\n\t\tprevHeader = &zeroHash\n\t} else {\n\t\tpfh, err := dbFetchFilterIdxEntry(dbTx, hkey, ph)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Construct the new block's filter header, and store it.\n\t\tprevHeader, err = chainhash.NewHash(pfh)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfh, err := builder.MakeHeaderForFilter(f, *prevHeader)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn dbStoreFilterIdxEntry(dbTx, hkey, h, fh[:])\n}\n\n// ConnectBlock is invoked by the index manager when a new block has been\n// connected to the main chain. This indexer adds a hash-to-cf mapping for\n// every passed block. This is part of the Indexer interface.\nfunc (idx *CfIndex) ConnectBlock(dbTx database.Tx, block *btcutil.Block,\n\tstxos []blockchain.SpentTxOut) error {\n\n\tprevScripts := make([][]byte, len(stxos))\n\tfor i, stxo := range stxos {\n\t\tprevScripts[i] = stxo.PkScript\n\t}\n\n\tf, err := builder.BuildBasicFilter(block.MsgBlock(), prevScripts)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn storeFilter(dbTx, block, f, wire.GCSFilterRegular)\n}\n\n// DisconnectBlock is invoked by the index manager when a block has been\n// disconnected from the main chain.  This indexer removes the hash-to-cf\n// mapping for every passed block. This is part of the Indexer interface.\nfunc (idx *CfIndex) DisconnectBlock(dbTx database.Tx, block *btcutil.Block,\n\t_ []blockchain.SpentTxOut) error {\n\n\tfor _, key := range cfIndexKeys {\n\t\terr := dbDeleteFilterIdxEntry(dbTx, key, block.Hash())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, key := range cfHeaderKeys {\n\t\terr := dbDeleteFilterIdxEntry(dbTx, key, block.Hash())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, key := range cfHashKeys {\n\t\terr := dbDeleteFilterIdxEntry(dbTx, key, block.Hash())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// entryByBlockHash fetches a filter index entry of a particular type\n// (eg. filter, filter header, etc) for a filter type and block hash.\nfunc (idx *CfIndex) entryByBlockHash(filterTypeKeys [][]byte,\n\tfilterType wire.FilterType, h *chainhash.Hash) ([]byte, error) {\n\n\tif uint8(filterType) > maxFilterType {\n\t\treturn nil, errors.New(\"unsupported filter type\")\n\t}\n\tkey := filterTypeKeys[filterType]\n\n\tvar entry []byte\n\terr := idx.db.View(func(dbTx database.Tx) error {\n\t\tvar err error\n\t\tentry, err = dbFetchFilterIdxEntry(dbTx, key, h)\n\t\treturn err\n\t})\n\treturn entry, err\n}\n\n// entriesByBlockHashes batch fetches a filter index entry of a particular type\n// (eg. filter, filter header, etc) for a filter type and slice of block hashes.\nfunc (idx *CfIndex) entriesByBlockHashes(filterTypeKeys [][]byte,\n\tfilterType wire.FilterType, blockHashes []*chainhash.Hash) ([][]byte, error) {\n\n\tif uint8(filterType) > maxFilterType {\n\t\treturn nil, errors.New(\"unsupported filter type\")\n\t}\n\tkey := filterTypeKeys[filterType]\n\n\tentries := make([][]byte, 0, len(blockHashes))\n\terr := idx.db.View(func(dbTx database.Tx) error {\n\t\tfor _, blockHash := range blockHashes {\n\t\t\tentry, err := dbFetchFilterIdxEntry(dbTx, key, blockHash)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tentries = append(entries, entry)\n\t\t}\n\t\treturn nil\n\t})\n\treturn entries, err\n}\n\n// FilterByBlockHash returns the serialized contents of a block's basic or\n// committed filter.\nfunc (idx *CfIndex) FilterByBlockHash(h *chainhash.Hash,\n\tfilterType wire.FilterType) ([]byte, error) {\n\treturn idx.entryByBlockHash(cfIndexKeys, filterType, h)\n}\n\n// FiltersByBlockHashes returns the serialized contents of a block's basic or\n// committed filter for a set of blocks by hash.\nfunc (idx *CfIndex) FiltersByBlockHashes(blockHashes []*chainhash.Hash,\n\tfilterType wire.FilterType) ([][]byte, error) {\n\treturn idx.entriesByBlockHashes(cfIndexKeys, filterType, blockHashes)\n}\n\n// FilterHeaderByBlockHash returns the serialized contents of a block's basic\n// committed filter header.\nfunc (idx *CfIndex) FilterHeaderByBlockHash(h *chainhash.Hash,\n\tfilterType wire.FilterType) ([]byte, error) {\n\treturn idx.entryByBlockHash(cfHeaderKeys, filterType, h)\n}\n\n// FilterHeadersByBlockHashes returns the serialized contents of a block's\n// basic committed filter header for a set of blocks by hash.\nfunc (idx *CfIndex) FilterHeadersByBlockHashes(blockHashes []*chainhash.Hash,\n\tfilterType wire.FilterType) ([][]byte, error) {\n\treturn idx.entriesByBlockHashes(cfHeaderKeys, filterType, blockHashes)\n}\n\n// FilterHashByBlockHash returns the serialized contents of a block's basic\n// committed filter hash.\nfunc (idx *CfIndex) FilterHashByBlockHash(h *chainhash.Hash,\n\tfilterType wire.FilterType) ([]byte, error) {\n\treturn idx.entryByBlockHash(cfHashKeys, filterType, h)\n}\n\n// FilterHashesByBlockHashes returns the serialized contents of a block's basic\n// committed filter hash for a set of blocks by hash.\nfunc (idx *CfIndex) FilterHashesByBlockHashes(blockHashes []*chainhash.Hash,\n\tfilterType wire.FilterType) ([][]byte, error) {\n\treturn idx.entriesByBlockHashes(cfHashKeys, filterType, blockHashes)\n}\n\n// NewCfIndex returns a new instance of an indexer that is used to create a\n// mapping of the hashes of all blocks in the blockchain to their respective\n// committed filters.\n//\n// It implements the Indexer interface which plugs into the IndexManager that\n// in turn is used by the blockchain package. This allows the index to be\n// seamlessly maintained along with the chain.\nfunc NewCfIndex(db database.DB, chainParams *chaincfg.Params) *CfIndex {\n\treturn &CfIndex{db: db, chainParams: chainParams}\n}\n\n// DropCfIndex drops the CF index from the provided database if exists.\nfunc DropCfIndex(db database.DB, interrupt <-chan struct{}) error {\n\treturn dropIndex(db, cfIndexParentBucketKey, cfIndexName, interrupt)\n}\n\n// CfIndexInitialized returns true if the cfindex has been created previously.\nfunc CfIndexInitialized(db database.DB) bool {\n\tvar exists bool\n\tdb.View(func(dbTx database.Tx) error {\n\t\tbucket := dbTx.Metadata().Bucket(cfIndexParentBucketKey)\n\t\texists = bucket != nil\n\t\treturn nil\n\t})\n\n\treturn exists\n}\n"
  },
  {
    "path": "blockchain/indexers/common.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage indexers implements optional block chain indexes.\n*/\npackage indexers\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/database\"\n)\n\nvar (\n\t// byteOrder is the preferred byte order used for serializing numeric\n\t// fields for storage in the database.\n\tbyteOrder = binary.LittleEndian\n\n\t// errInterruptRequested indicates that an operation was cancelled due\n\t// to a user-requested interrupt.\n\terrInterruptRequested = errors.New(\"interrupt requested\")\n)\n\n// NeedsInputser provides a generic interface for an indexer to specify the it\n// requires the ability to look up inputs for a transaction.\ntype NeedsInputser interface {\n\tNeedsInputs() bool\n}\n\n// Indexer provides a generic interface for an indexer that is managed by an\n// index manager such as the Manager type provided by this package.\ntype Indexer interface {\n\t// Key returns the key of the index as a byte slice.\n\tKey() []byte\n\n\t// Name returns the human-readable name of the index.\n\tName() string\n\n\t// Create is invoked when the indexer manager determines the index needs\n\t// to be created for the first time.\n\tCreate(dbTx database.Tx) error\n\n\t// Init is invoked when the index manager is first initializing the\n\t// index.  This differs from the Create method in that it is called on\n\t// every load, including the case the index was just created.\n\tInit() error\n\n\t// ConnectBlock is invoked when a new block has been connected to the\n\t// main chain. The set of output spent within a block is also passed in\n\t// so indexers can access the pevious output scripts input spent if\n\t// required.\n\tConnectBlock(database.Tx, *btcutil.Block, []blockchain.SpentTxOut) error\n\n\t// DisconnectBlock is invoked when a block has been disconnected from\n\t// the main chain. The set of outputs scripts that were spent within\n\t// this block is also returned so indexers can clean up the prior index\n\t// state for this block\n\tDisconnectBlock(database.Tx, *btcutil.Block, []blockchain.SpentTxOut) error\n}\n\n// AssertError identifies an error that indicates an internal code consistency\n// issue and should be treated as a critical and unrecoverable error.\ntype AssertError string\n\n// Error returns the assertion error as a huma-readable string and satisfies\n// the error interface.\nfunc (e AssertError) Error() string {\n\treturn \"assertion failed: \" + string(e)\n}\n\n// errDeserialize signifies that a problem was encountered when deserializing\n// data.\ntype errDeserialize string\n\n// Error implements the error interface.\nfunc (e errDeserialize) Error() string {\n\treturn string(e)\n}\n\n// isDeserializeErr returns whether or not the passed error is an errDeserialize\n// error.\nfunc isDeserializeErr(err error) bool {\n\t_, ok := err.(errDeserialize)\n\treturn ok\n}\n\n// internalBucket is an abstraction over a database bucket.  It is used to make\n// the code easier to test since it allows mock objects in the tests to only\n// implement these functions instead of everything a database.Bucket supports.\ntype internalBucket interface {\n\tGet(key []byte) []byte\n\tPut(key []byte, value []byte) error\n\tDelete(key []byte) error\n}\n\n// interruptRequested returns true when the provided channel has been closed.\n// This simplifies early shutdown slightly since the caller can just use an if\n// statement instead of a select.\nfunc interruptRequested(interrupted <-chan struct{}) bool {\n\tselect {\n\tcase <-interrupted:\n\t\treturn true\n\tdefault:\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "blockchain/indexers/log.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage indexers\n\nimport \"github.com/btcsuite/btclog\"\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until either UseLogger or SetLogWriter are called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\n// This should be used in preference to SetLogWriter if the caller is also\n// using btclog.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n"
  },
  {
    "path": "blockchain/indexers/manager.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage indexers\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nvar (\n\t// indexTipsBucketName is the name of the db bucket used to house the\n\t// current tip of each index.\n\tindexTipsBucketName = []byte(\"idxtips\")\n)\n\n// -----------------------------------------------------------------------------\n// The index manager tracks the current tip of each index by using a parent\n// bucket that contains an entry for index.\n//\n// The serialized format for an index tip is:\n//\n//   [<block hash><block height>],...\n//\n//   Field           Type             Size\n//   block hash      chainhash.Hash   chainhash.HashSize\n//   block height    uint32           4 bytes\n// -----------------------------------------------------------------------------\n\n// dbPutIndexerTip uses an existing database transaction to update or add the\n// current tip for the given index to the provided values.\nfunc dbPutIndexerTip(dbTx database.Tx, idxKey []byte, hash *chainhash.Hash, height int32) error {\n\tserialized := make([]byte, chainhash.HashSize+4)\n\tcopy(serialized, hash[:])\n\tbyteOrder.PutUint32(serialized[chainhash.HashSize:], uint32(height))\n\n\tindexesBucket := dbTx.Metadata().Bucket(indexTipsBucketName)\n\treturn indexesBucket.Put(idxKey, serialized)\n}\n\n// dbFetchIndexerTip uses an existing database transaction to retrieve the\n// hash and height of the current tip for the provided index.\nfunc dbFetchIndexerTip(dbTx database.Tx, idxKey []byte) (*chainhash.Hash, int32, error) {\n\tindexesBucket := dbTx.Metadata().Bucket(indexTipsBucketName)\n\tserialized := indexesBucket.Get(idxKey)\n\tif len(serialized) < chainhash.HashSize+4 {\n\t\treturn nil, 0, database.Error{\n\t\t\tErrorCode: database.ErrCorruption,\n\t\t\tDescription: fmt.Sprintf(\"unexpected end of data for \"+\n\t\t\t\t\"index %q tip\", string(idxKey)),\n\t\t}\n\t}\n\n\tvar hash chainhash.Hash\n\tcopy(hash[:], serialized[:chainhash.HashSize])\n\theight := int32(byteOrder.Uint32(serialized[chainhash.HashSize:]))\n\treturn &hash, height, nil\n}\n\n// dbIndexConnectBlock adds all of the index entries associated with the\n// given block using the provided indexer and updates the tip of the indexer\n// accordingly.  An error will be returned if the current tip for the indexer is\n// not the previous block for the passed block.\nfunc dbIndexConnectBlock(dbTx database.Tx, indexer Indexer, block *btcutil.Block,\n\tstxo []blockchain.SpentTxOut) error {\n\n\t// Assert that the block being connected properly connects to the\n\t// current tip of the index.\n\tidxKey := indexer.Key()\n\tcurTipHash, _, err := dbFetchIndexerTip(dbTx, idxKey)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !curTipHash.IsEqual(&block.MsgBlock().Header.PrevBlock) {\n\t\treturn AssertError(fmt.Sprintf(\"dbIndexConnectBlock must be \"+\n\t\t\t\"called with a block that extends the current index \"+\n\t\t\t\"tip (%s, tip %s, block %s)\", indexer.Name(),\n\t\t\tcurTipHash, block.Hash()))\n\t}\n\n\t// Notify the indexer with the connected block so it can index it.\n\tif err := indexer.ConnectBlock(dbTx, block, stxo); err != nil {\n\t\treturn err\n\t}\n\n\t// Update the current index tip.\n\treturn dbPutIndexerTip(dbTx, idxKey, block.Hash(), block.Height())\n}\n\n// dbIndexDisconnectBlock removes all of the index entries associated with the\n// given block using the provided indexer and updates the tip of the indexer\n// accordingly.  An error will be returned if the current tip for the indexer is\n// not the passed block.\nfunc dbIndexDisconnectBlock(dbTx database.Tx, indexer Indexer, block *btcutil.Block,\n\tstxo []blockchain.SpentTxOut) error {\n\n\t// Assert that the block being disconnected is the current tip of the\n\t// index.\n\tidxKey := indexer.Key()\n\tcurTipHash, _, err := dbFetchIndexerTip(dbTx, idxKey)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !curTipHash.IsEqual(block.Hash()) {\n\t\treturn AssertError(fmt.Sprintf(\"dbIndexDisconnectBlock must \"+\n\t\t\t\"be called with the block at the current index tip \"+\n\t\t\t\"(%s, tip %s, block %s)\", indexer.Name(),\n\t\t\tcurTipHash, block.Hash()))\n\t}\n\n\t// Notify the indexer with the disconnected block so it can remove all\n\t// of the appropriate entries.\n\tif err := indexer.DisconnectBlock(dbTx, block, stxo); err != nil {\n\t\treturn err\n\t}\n\n\t// Update the current index tip.\n\tprevHash := &block.MsgBlock().Header.PrevBlock\n\treturn dbPutIndexerTip(dbTx, idxKey, prevHash, block.Height()-1)\n}\n\n// Manager defines an index manager that manages multiple optional indexes and\n// implements the blockchain.IndexManager interface so it can be seamlessly\n// plugged into normal chain processing.\ntype Manager struct {\n\tdb             database.DB\n\tenabledIndexes []Indexer\n}\n\n// Ensure the Manager type implements the blockchain.IndexManager interface.\nvar _ blockchain.IndexManager = (*Manager)(nil)\n\n// indexDropKey returns the key for an index which indicates it is in the\n// process of being dropped.\nfunc indexDropKey(idxKey []byte) []byte {\n\tdropKey := make([]byte, len(idxKey)+1)\n\tdropKey[0] = 'd'\n\tcopy(dropKey[1:], idxKey)\n\treturn dropKey\n}\n\n// maybeFinishDrops determines if each of the enabled indexes are in the middle\n// of being dropped and finishes dropping them when the are.  This is necessary\n// because dropping and index has to be done in several atomic steps rather than\n// one big atomic step due to the massive number of entries.\nfunc (m *Manager) maybeFinishDrops(interrupt <-chan struct{}) error {\n\tindexNeedsDrop := make([]bool, len(m.enabledIndexes))\n\terr := m.db.View(func(dbTx database.Tx) error {\n\t\t// None of the indexes needs to be dropped if the index tips\n\t\t// bucket hasn't been created yet.\n\t\tindexesBucket := dbTx.Metadata().Bucket(indexTipsBucketName)\n\t\tif indexesBucket == nil {\n\t\t\treturn nil\n\t\t}\n\n\t\t// Mark the indexer as requiring a drop if one is already in\n\t\t// progress.\n\t\tfor i, indexer := range m.enabledIndexes {\n\t\t\tdropKey := indexDropKey(indexer.Key())\n\t\t\tif indexesBucket.Get(dropKey) != nil {\n\t\t\t\tindexNeedsDrop[i] = true\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif interruptRequested(interrupt) {\n\t\treturn errInterruptRequested\n\t}\n\n\t// Finish dropping any of the enabled indexes that are already in the\n\t// middle of being dropped.\n\tfor i, indexer := range m.enabledIndexes {\n\t\tif !indexNeedsDrop[i] {\n\t\t\tcontinue\n\t\t}\n\n\t\tlog.Infof(\"Resuming %s drop\", indexer.Name())\n\t\terr := dropIndex(m.db, indexer.Key(), indexer.Name(), interrupt)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// maybeCreateIndexes determines if each of the enabled indexes have already\n// been created and creates them if not.\nfunc (m *Manager) maybeCreateIndexes(dbTx database.Tx) error {\n\tindexesBucket := dbTx.Metadata().Bucket(indexTipsBucketName)\n\tfor _, indexer := range m.enabledIndexes {\n\t\t// Nothing to do if the index tip already exists.\n\t\tidxKey := indexer.Key()\n\t\tif indexesBucket.Get(idxKey) != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\t// The tip for the index does not exist, so create it and\n\t\t// invoke the create callback for the index so it can perform\n\t\t// any one-time initialization it requires.\n\t\tif err := indexer.Create(dbTx); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Set the tip for the index to values which represent an\n\t\t// uninitialized index.\n\t\terr := dbPutIndexerTip(dbTx, idxKey, &chainhash.Hash{}, -1)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Init initializes the enabled indexes.  This is called during chain\n// initialization and primarily consists of catching up all indexes to the\n// current best chain tip.  This is necessary since each index can be disabled\n// and re-enabled at any time and attempting to catch-up indexes at the same\n// time new blocks are being downloaded would lead to an overall longer time to\n// catch up due to the I/O contention.\n//\n// This is part of the blockchain.IndexManager interface.\nfunc (m *Manager) Init(chain *blockchain.BlockChain, interrupt <-chan struct{}) error {\n\t// Nothing to do when no indexes are enabled.\n\tif len(m.enabledIndexes) == 0 {\n\t\treturn nil\n\t}\n\n\tif interruptRequested(interrupt) {\n\t\treturn errInterruptRequested\n\t}\n\n\t// Finish and drops that were previously interrupted.\n\tif err := m.maybeFinishDrops(interrupt); err != nil {\n\t\treturn err\n\t}\n\n\t// Create the initial state for the indexes as needed.\n\terr := m.db.Update(func(dbTx database.Tx) error {\n\t\t// Create the bucket for the current tips as needed.\n\t\tmeta := dbTx.Metadata()\n\t\t_, err := meta.CreateBucketIfNotExists(indexTipsBucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn m.maybeCreateIndexes(dbTx)\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Initialize each of the enabled indexes.\n\tfor _, indexer := range m.enabledIndexes {\n\t\tif err := indexer.Init(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Rollback indexes to the main chain if their tip is an orphaned fork.\n\t// This is fairly unlikely, but it can happen if the chain is\n\t// reorganized while the index is disabled.  This has to be done in\n\t// reverse order because later indexes can depend on earlier ones.\n\tfor i := len(m.enabledIndexes); i > 0; i-- {\n\t\tindexer := m.enabledIndexes[i-1]\n\n\t\t// Fetch the current tip for the index.\n\t\tvar height int32\n\t\tvar hash *chainhash.Hash\n\t\terr := m.db.View(func(dbTx database.Tx) error {\n\t\t\tidxKey := indexer.Key()\n\t\t\thash, height, err = dbFetchIndexerTip(dbTx, idxKey)\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Nothing to do if the index does not have any entries yet.\n\t\tif height == -1 {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Loop until the tip is a block that exists in the main chain.\n\t\tinitialHeight := height\n\t\tfor !chain.MainChainHasBlock(hash) {\n\t\t\t// At this point the index tip is orphaned, so load the\n\t\t\t// orphaned block from the database directly and\n\t\t\t// disconnect it from the index.  The block has to be\n\t\t\t// loaded directly since it is no longer in the main\n\t\t\t// chain and thus the chain.BlockByHash function would\n\t\t\t// error.\n\t\t\tvar block *btcutil.Block\n\t\t\terr := m.db.View(func(dbTx database.Tx) error {\n\t\t\t\tblockBytes, err := dbTx.FetchBlock(hash)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tblock, err = btcutil.NewBlockFromBytes(blockBytes)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tblock.SetHeight(height)\n\t\t\t\treturn err\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// We'll also grab the set of outputs spent by this\n\t\t\t// block so we can remove them from the index.\n\t\t\tspentTxos, err := chain.FetchSpendJournal(block)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// With the block and stxo set for that block retrieved,\n\t\t\t// we can now update the index itself.\n\t\t\terr = m.db.Update(func(dbTx database.Tx) error {\n\t\t\t\t// Remove all of the index entries associated\n\t\t\t\t// with the block and update the indexer tip.\n\t\t\t\terr = dbIndexDisconnectBlock(\n\t\t\t\t\tdbTx, indexer, block, spentTxos,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\t// Update the tip to the previous block.\n\t\t\t\thash = &block.MsgBlock().Header.PrevBlock\n\t\t\t\theight--\n\n\t\t\t\treturn nil\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif interruptRequested(interrupt) {\n\t\t\t\treturn errInterruptRequested\n\t\t\t}\n\t\t}\n\n\t\tif initialHeight != height {\n\t\t\tlog.Infof(\"Removed %d orphaned blocks from %s \"+\n\t\t\t\t\"(heights %d to %d)\", initialHeight-height,\n\t\t\t\tindexer.Name(), height+1, initialHeight)\n\t\t}\n\t}\n\n\t// Fetch the current tip heights for each index along with tracking the\n\t// lowest one so the catchup code only needs to start at the earliest\n\t// block and is able to skip connecting the block for the indexes that\n\t// don't need it.\n\tbestHeight := chain.BestSnapshot().Height\n\tlowestHeight := bestHeight\n\tindexerHeights := make([]int32, len(m.enabledIndexes))\n\terr = m.db.View(func(dbTx database.Tx) error {\n\t\tfor i, indexer := range m.enabledIndexes {\n\t\t\tidxKey := indexer.Key()\n\t\t\thash, height, err := dbFetchIndexerTip(dbTx, idxKey)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tlog.Debugf(\"Current %s tip (height %d, hash %v)\",\n\t\t\t\tindexer.Name(), height, hash)\n\t\t\tindexerHeights[i] = height\n\t\t\tif height < lowestHeight {\n\t\t\t\tlowestHeight = height\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Nothing to index if all of the indexes are caught up.\n\tif lowestHeight == bestHeight {\n\t\treturn nil\n\t}\n\n\t// Create a progress logger for the indexing process below.\n\tprogressLogger := newBlockProgressLogger(\"Indexed\", log)\n\n\t// At this point, one or more indexes are behind the current best chain\n\t// tip and need to be caught up, so log the details and loop through\n\t// each block that needs to be indexed.\n\tlog.Infof(\"Catching up indexes from height %d to %d\", lowestHeight,\n\t\tbestHeight)\n\tfor height := lowestHeight + 1; height <= bestHeight; height++ {\n\t\t// Load the block for the height since it is required to index\n\t\t// it.\n\t\tblock, err := chain.BlockByHeight(height)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif interruptRequested(interrupt) {\n\t\t\treturn errInterruptRequested\n\t\t}\n\n\t\t// Connect the block for all indexes that need it.\n\t\tvar spentTxos []blockchain.SpentTxOut\n\t\tfor i, indexer := range m.enabledIndexes {\n\t\t\t// Skip indexes that don't need to be updated with this\n\t\t\t// block.\n\t\t\tif indexerHeights[i] >= height {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// When the index requires all of the referenced txouts\n\t\t\t// and they haven't been loaded yet, they need to be\n\t\t\t// retrieved from the spend journal.\n\t\t\tif spentTxos == nil && indexNeedsInputs(indexer) {\n\t\t\t\tspentTxos, err = chain.FetchSpendJournal(block)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\n\t\t\terr := m.db.Update(func(dbTx database.Tx) error {\n\t\t\t\treturn dbIndexConnectBlock(\n\t\t\t\t\tdbTx, indexer, block, spentTxos,\n\t\t\t\t)\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tindexerHeights[i] = height\n\t\t}\n\n\t\t// Log indexing progress.\n\t\tprogressLogger.LogBlockHeight(block)\n\n\t\tif interruptRequested(interrupt) {\n\t\t\treturn errInterruptRequested\n\t\t}\n\t}\n\n\tlog.Infof(\"Indexes caught up to height %d\", bestHeight)\n\treturn nil\n}\n\n// indexNeedsInputs returns whether or not the index needs access to the txouts\n// referenced by the transaction inputs being indexed.\nfunc indexNeedsInputs(index Indexer) bool {\n\tif idx, ok := index.(NeedsInputser); ok {\n\t\treturn idx.NeedsInputs()\n\t}\n\n\treturn false\n}\n\n// dbFetchTx looks up the passed transaction hash in the transaction index and\n// loads it from the database.\nfunc dbFetchTx(dbTx database.Tx, hash *chainhash.Hash) (*wire.MsgTx, error) {\n\t// Look up the location of the transaction.\n\tblockRegion, err := dbFetchTxIndexEntry(dbTx, hash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif blockRegion == nil {\n\t\treturn nil, fmt.Errorf(\"transaction %v not found\", hash)\n\t}\n\n\t// Load the raw transaction bytes from the database.\n\ttxBytes, err := dbTx.FetchBlockRegion(blockRegion)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Deserialize the transaction.\n\tvar msgTx wire.MsgTx\n\terr = msgTx.Deserialize(bytes.NewReader(txBytes))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &msgTx, nil\n}\n\n// ConnectBlock must be invoked when a block is extending the main chain.  It\n// keeps track of the state of each index it is managing, performs some sanity\n// checks, and invokes each indexer.\n//\n// This is part of the blockchain.IndexManager interface.\nfunc (m *Manager) ConnectBlock(dbTx database.Tx, block *btcutil.Block,\n\tstxos []blockchain.SpentTxOut) error {\n\n\t// Call each of the currently active optional indexes with the block\n\t// being connected so they can update accordingly.\n\tfor _, index := range m.enabledIndexes {\n\t\terr := dbIndexConnectBlock(dbTx, index, block, stxos)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// DisconnectBlock must be invoked when a block is being disconnected from the\n// end of the main chain.  It keeps track of the state of each index it is\n// managing, performs some sanity checks, and invokes each indexer to remove\n// the index entries associated with the block.\n//\n// This is part of the blockchain.IndexManager interface.\nfunc (m *Manager) DisconnectBlock(dbTx database.Tx, block *btcutil.Block,\n\tstxo []blockchain.SpentTxOut) error {\n\n\t// Call each of the currently active optional indexes with the block\n\t// being disconnected so they can update accordingly.\n\tfor _, index := range m.enabledIndexes {\n\t\terr := dbIndexDisconnectBlock(dbTx, index, block, stxo)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// NewManager returns a new index manager with the provided indexes enabled.\n//\n// The manager returned satisfies the blockchain.IndexManager interface and thus\n// cleanly plugs into the normal blockchain processing path.\nfunc NewManager(db database.DB, enabledIndexes []Indexer) *Manager {\n\treturn &Manager{\n\t\tdb:             db,\n\t\tenabledIndexes: enabledIndexes,\n\t}\n}\n\n// dropIndex drops the passed index from the database.  Since indexes can be\n// massive, it deletes the index in multiple database transactions in order to\n// keep memory usage to reasonable levels.  It also marks the drop in progress\n// so the drop can be resumed if it is stopped before it is done before the\n// index can be used again.\nfunc dropIndex(db database.DB, idxKey []byte, idxName string, interrupt <-chan struct{}) error {\n\t// Nothing to do if the index doesn't already exist.\n\tvar needsDelete bool\n\terr := db.View(func(dbTx database.Tx) error {\n\t\tindexesBucket := dbTx.Metadata().Bucket(indexTipsBucketName)\n\t\tif indexesBucket != nil && indexesBucket.Get(idxKey) != nil {\n\t\t\tneedsDelete = true\n\t\t}\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !needsDelete {\n\t\tlog.Infof(\"Not dropping %s because it does not exist\", idxName)\n\t\treturn nil\n\t}\n\n\t// Mark that the index is in the process of being dropped so that it\n\t// can be resumed on the next start if interrupted before the process is\n\t// complete.\n\tlog.Infof(\"Dropping all %s entries.  This might take a while...\",\n\t\tidxName)\n\terr = db.Update(func(dbTx database.Tx) error {\n\t\tindexesBucket := dbTx.Metadata().Bucket(indexTipsBucketName)\n\t\treturn indexesBucket.Put(indexDropKey(idxKey), idxKey)\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Since the indexes can be so large, attempting to simply delete\n\t// the bucket in a single database transaction would result in massive\n\t// memory usage and likely crash many systems due to ulimits.  In order\n\t// to avoid this, use a cursor to delete a maximum number of entries out\n\t// of the bucket at a time. Recurse buckets depth-first to delete any\n\t// sub-buckets.\n\tconst maxDeletions = 2000000\n\tvar totalDeleted uint64\n\n\t// Recurse through all buckets in the index, cataloging each for\n\t// later deletion.\n\tvar subBuckets [][][]byte\n\tvar subBucketClosure func(database.Tx, []byte, [][]byte) error\n\tsubBucketClosure = func(dbTx database.Tx,\n\t\tsubBucket []byte, tlBucket [][]byte) error {\n\t\t// Get full bucket name and append to subBuckets for later\n\t\t// deletion.\n\t\tvar bucketName [][]byte\n\t\tif (tlBucket == nil) || (len(tlBucket) == 0) {\n\t\t\tbucketName = append(bucketName, subBucket)\n\t\t} else {\n\t\t\tbucketName = append(tlBucket, subBucket)\n\t\t}\n\t\tsubBuckets = append(subBuckets, bucketName)\n\t\t// Recurse sub-buckets to append to subBuckets slice.\n\t\tbucket := dbTx.Metadata()\n\t\tfor _, subBucketName := range bucketName {\n\t\t\tbucket = bucket.Bucket(subBucketName)\n\t\t}\n\t\treturn bucket.ForEachBucket(func(k []byte) error {\n\t\t\treturn subBucketClosure(dbTx, k, bucketName)\n\t\t})\n\t}\n\n\t// Call subBucketClosure with top-level bucket.\n\terr = db.View(func(dbTx database.Tx) error {\n\t\treturn subBucketClosure(dbTx, idxKey, nil)\n\t})\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\t// Iterate through each sub-bucket in reverse, deepest-first, deleting\n\t// all keys inside them and then dropping the buckets themselves.\n\tfor i := range subBuckets {\n\t\tbucketName := subBuckets[len(subBuckets)-1-i]\n\t\t// Delete maxDeletions key/value pairs at a time.\n\t\tfor numDeleted := maxDeletions; numDeleted == maxDeletions; {\n\t\t\tnumDeleted = 0\n\t\t\terr := db.Update(func(dbTx database.Tx) error {\n\t\t\t\tsubBucket := dbTx.Metadata()\n\t\t\t\tfor _, subBucketName := range bucketName {\n\t\t\t\t\tsubBucket = subBucket.Bucket(subBucketName)\n\t\t\t\t}\n\t\t\t\tcursor := subBucket.Cursor()\n\t\t\t\tfor ok := cursor.First(); ok; ok = cursor.Next() &&\n\t\t\t\t\tnumDeleted < maxDeletions {\n\n\t\t\t\t\tif err := cursor.Delete(); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tnumDeleted++\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif numDeleted > 0 {\n\t\t\t\ttotalDeleted += uint64(numDeleted)\n\t\t\t\tlog.Infof(\"Deleted %d keys (%d total) from %s\",\n\t\t\t\t\tnumDeleted, totalDeleted, idxName)\n\t\t\t}\n\t\t}\n\n\t\tif interruptRequested(interrupt) {\n\t\t\treturn errInterruptRequested\n\t\t}\n\n\t\t// Drop the bucket itself.\n\t\terr = db.Update(func(dbTx database.Tx) error {\n\t\t\tbucket := dbTx.Metadata()\n\t\t\tfor j := 0; j < len(bucketName)-1; j++ {\n\t\t\t\tbucket = bucket.Bucket(bucketName[j])\n\t\t\t}\n\t\t\treturn bucket.DeleteBucket(bucketName[len(bucketName)-1])\n\t\t})\n\t}\n\n\t// Call extra index specific deinitialization for the transaction index.\n\tif idxName == txIndexName {\n\t\tif err := dropBlockIDIndex(db); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Remove the index tip, index bucket, and in-progress drop flag now\n\t// that all index entries have been removed.\n\terr = db.Update(func(dbTx database.Tx) error {\n\t\tmeta := dbTx.Metadata()\n\t\tindexesBucket := meta.Bucket(indexTipsBucketName)\n\t\tif err := indexesBucket.Delete(idxKey); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn indexesBucket.Delete(indexDropKey(idxKey))\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tlog.Infof(\"Dropped %s\", idxName)\n\treturn nil\n}\n"
  },
  {
    "path": "blockchain/indexers/txindex.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage indexers\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// txIndexName is the human-readable name for the index.\n\ttxIndexName = \"transaction index\"\n)\n\nvar (\n\t// txIndexKey is the key of the transaction index and the db bucket used\n\t// to house it.\n\ttxIndexKey = []byte(\"txbyhashidx\")\n\n\t// idByHashIndexBucketName is the name of the db bucket used to house\n\t// the block id -> block hash index.\n\tidByHashIndexBucketName = []byte(\"idbyhashidx\")\n\n\t// hashByIDIndexBucketName is the name of the db bucket used to house\n\t// the block hash -> block id index.\n\thashByIDIndexBucketName = []byte(\"hashbyididx\")\n\n\t// errNoBlockIDEntry is an error that indicates a requested entry does\n\t// not exist in the block ID index.\n\terrNoBlockIDEntry = errors.New(\"no entry in the block ID index\")\n)\n\n// -----------------------------------------------------------------------------\n// The transaction index consists of an entry for every transaction in the main\n// chain.  In order to significantly optimize the space requirements a separate\n// index which provides an internal mapping between each block that has been\n// indexed and a unique ID for use within the hash to location mappings.  The ID\n// is simply a sequentially incremented uint32.  This is useful because it is\n// only 4 bytes versus 32 bytes hashes and thus saves a ton of space in the\n// index.\n//\n// There are three buckets used in total.  The first bucket maps the hash of\n// each transaction to the specific block location.  The second bucket maps the\n// hash of each block to the unique ID and the third maps that ID back to the\n// block hash.\n//\n// NOTE: Although it is technically possible for multiple transactions to have\n// the same hash as long as the previous transaction with the same hash is fully\n// spent, this code only stores the most recent one because doing otherwise\n// would add a non-trivial amount of space and overhead for something that will\n// realistically never happen per the probability and even if it did, the old\n// one must be fully spent and so the most likely transaction a caller would\n// want for a given hash is the most recent one anyways.\n//\n// The serialized format for keys and values in the block hash to ID bucket is:\n//   <hash> = <ID>\n//\n//   Field           Type              Size\n//   hash            chainhash.Hash    32 bytes\n//   ID              uint32            4 bytes\n//   -----\n//   Total: 36 bytes\n//\n// The serialized format for keys and values in the ID to block hash bucket is:\n//   <ID> = <hash>\n//\n//   Field           Type              Size\n//   ID              uint32            4 bytes\n//   hash            chainhash.Hash    32 bytes\n//   -----\n//   Total: 36 bytes\n//\n// The serialized format for the keys and values in the tx index bucket is:\n//\n//   <txhash> = <block id><start offset><tx length>\n//\n//   Field           Type              Size\n//   txhash          chainhash.Hash    32 bytes\n//   block id        uint32            4 bytes\n//   start offset    uint32          4 bytes\n//   tx length       uint32          4 bytes\n//   -----\n//   Total: 44 bytes\n// -----------------------------------------------------------------------------\n\n// dbPutBlockIDIndexEntry uses an existing database transaction to update or add\n// the index entries for the hash to id and id to hash mappings for the provided\n// values.\nfunc dbPutBlockIDIndexEntry(dbTx database.Tx, hash *chainhash.Hash, id uint32) error {\n\t// Serialize the height for use in the index entries.\n\tvar serializedID [4]byte\n\tbyteOrder.PutUint32(serializedID[:], id)\n\n\t// Add the block hash to ID mapping to the index.\n\tmeta := dbTx.Metadata()\n\thashIndex := meta.Bucket(idByHashIndexBucketName)\n\tif err := hashIndex.Put(hash[:], serializedID[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Add the block ID to hash mapping to the index.\n\tidIndex := meta.Bucket(hashByIDIndexBucketName)\n\treturn idIndex.Put(serializedID[:], hash[:])\n}\n\n// dbRemoveBlockIDIndexEntry uses an existing database transaction remove index\n// entries from the hash to id and id to hash mappings for the provided hash.\nfunc dbRemoveBlockIDIndexEntry(dbTx database.Tx, hash *chainhash.Hash) error {\n\t// Remove the block hash to ID mapping.\n\tmeta := dbTx.Metadata()\n\thashIndex := meta.Bucket(idByHashIndexBucketName)\n\tserializedID := hashIndex.Get(hash[:])\n\tif serializedID == nil {\n\t\treturn nil\n\t}\n\tif err := hashIndex.Delete(hash[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Remove the block ID to hash mapping.\n\tidIndex := meta.Bucket(hashByIDIndexBucketName)\n\treturn idIndex.Delete(serializedID)\n}\n\n// dbFetchBlockIDByHash uses an existing database transaction to retrieve the\n// block id for the provided hash from the index.\nfunc dbFetchBlockIDByHash(dbTx database.Tx, hash *chainhash.Hash) (uint32, error) {\n\thashIndex := dbTx.Metadata().Bucket(idByHashIndexBucketName)\n\tserializedID := hashIndex.Get(hash[:])\n\tif serializedID == nil {\n\t\treturn 0, errNoBlockIDEntry\n\t}\n\n\treturn byteOrder.Uint32(serializedID), nil\n}\n\n// dbFetchBlockHashBySerializedID uses an existing database transaction to\n// retrieve the hash for the provided serialized block id from the index.\nfunc dbFetchBlockHashBySerializedID(dbTx database.Tx, serializedID []byte) (*chainhash.Hash, error) {\n\tidIndex := dbTx.Metadata().Bucket(hashByIDIndexBucketName)\n\thashBytes := idIndex.Get(serializedID)\n\tif hashBytes == nil {\n\t\treturn nil, errNoBlockIDEntry\n\t}\n\n\tvar hash chainhash.Hash\n\tcopy(hash[:], hashBytes)\n\treturn &hash, nil\n}\n\n// dbFetchBlockHashByID uses an existing database transaction to retrieve the\n// hash for the provided block id from the index.\nfunc dbFetchBlockHashByID(dbTx database.Tx, id uint32) (*chainhash.Hash, error) {\n\tvar serializedID [4]byte\n\tbyteOrder.PutUint32(serializedID[:], id)\n\treturn dbFetchBlockHashBySerializedID(dbTx, serializedID[:])\n}\n\n// putTxIndexEntry serializes the provided values according to the format\n// described about for a transaction index entry.  The target byte slice must\n// be at least large enough to handle the number of bytes defined by the\n// txEntrySize constant or it will panic.\nfunc putTxIndexEntry(target []byte, blockID uint32, txLoc wire.TxLoc) {\n\tbyteOrder.PutUint32(target, blockID)\n\tbyteOrder.PutUint32(target[4:], uint32(txLoc.TxStart))\n\tbyteOrder.PutUint32(target[8:], uint32(txLoc.TxLen))\n}\n\n// dbPutTxIndexEntry uses an existing database transaction to update the\n// transaction index given the provided serialized data that is expected to have\n// been serialized putTxIndexEntry.\nfunc dbPutTxIndexEntry(dbTx database.Tx, txHash *chainhash.Hash, serializedData []byte) error {\n\ttxIndex := dbTx.Metadata().Bucket(txIndexKey)\n\treturn txIndex.Put(txHash[:], serializedData)\n}\n\n// dbFetchTxIndexEntry uses an existing database transaction to fetch the block\n// region for the provided transaction hash from the transaction index.  When\n// there is no entry for the provided hash, nil will be returned for the both\n// the region and the error.\nfunc dbFetchTxIndexEntry(dbTx database.Tx, txHash *chainhash.Hash) (*database.BlockRegion, error) {\n\t// Load the record from the database and return now if it doesn't exist.\n\ttxIndex := dbTx.Metadata().Bucket(txIndexKey)\n\tserializedData := txIndex.Get(txHash[:])\n\tif len(serializedData) == 0 {\n\t\treturn nil, nil\n\t}\n\n\t// Ensure the serialized data has enough bytes to properly deserialize.\n\tif len(serializedData) < 12 {\n\t\treturn nil, database.Error{\n\t\t\tErrorCode: database.ErrCorruption,\n\t\t\tDescription: fmt.Sprintf(\"corrupt transaction index \"+\n\t\t\t\t\"entry for %s\", txHash),\n\t\t}\n\t}\n\n\t// Load the block hash associated with the block ID.\n\thash, err := dbFetchBlockHashBySerializedID(dbTx, serializedData[0:4])\n\tif err != nil {\n\t\treturn nil, database.Error{\n\t\t\tErrorCode: database.ErrCorruption,\n\t\t\tDescription: fmt.Sprintf(\"corrupt transaction index \"+\n\t\t\t\t\"entry for %s: %v\", txHash, err),\n\t\t}\n\t}\n\n\t// Deserialize the final entry.\n\tregion := database.BlockRegion{Hash: &chainhash.Hash{}}\n\tcopy(region.Hash[:], hash[:])\n\tregion.Offset = byteOrder.Uint32(serializedData[4:8])\n\tregion.Len = byteOrder.Uint32(serializedData[8:12])\n\n\treturn &region, nil\n}\n\n// dbAddTxIndexEntries uses an existing database transaction to add a\n// transaction index entry for every transaction in the passed block.\nfunc dbAddTxIndexEntries(dbTx database.Tx, block *btcutil.Block, blockID uint32) error {\n\t// The offset and length of the transactions within the serialized\n\t// block.\n\ttxLocs, err := block.TxLoc()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// As an optimization, allocate a single slice big enough to hold all\n\t// of the serialized transaction index entries for the block and\n\t// serialize them directly into the slice.  Then, pass the appropriate\n\t// subslice to the database to be written.  This approach significantly\n\t// cuts down on the number of required allocations.\n\toffset := 0\n\tserializedValues := make([]byte, len(block.Transactions())*txEntrySize)\n\tfor i, tx := range block.Transactions() {\n\t\tputTxIndexEntry(serializedValues[offset:], blockID, txLocs[i])\n\t\tendOffset := offset + txEntrySize\n\t\terr := dbPutTxIndexEntry(dbTx, tx.Hash(),\n\t\t\tserializedValues[offset:endOffset:endOffset])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\toffset += txEntrySize\n\t}\n\n\treturn nil\n}\n\n// dbRemoveTxIndexEntry uses an existing database transaction to remove the most\n// recent transaction index entry for the given hash.\nfunc dbRemoveTxIndexEntry(dbTx database.Tx, txHash *chainhash.Hash) error {\n\ttxIndex := dbTx.Metadata().Bucket(txIndexKey)\n\tserializedData := txIndex.Get(txHash[:])\n\tif len(serializedData) == 0 {\n\t\treturn fmt.Errorf(\"can't remove non-existent transaction %s \"+\n\t\t\t\"from the transaction index\", txHash)\n\t}\n\n\treturn txIndex.Delete(txHash[:])\n}\n\n// dbRemoveTxIndexEntries uses an existing database transaction to remove the\n// latest transaction entry for every transaction in the passed block.\nfunc dbRemoveTxIndexEntries(dbTx database.Tx, block *btcutil.Block) error {\n\tfor _, tx := range block.Transactions() {\n\t\terr := dbRemoveTxIndexEntry(dbTx, tx.Hash())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// TxIndex implements a transaction by hash index.  That is to say, it supports\n// querying all transactions by their hash.\ntype TxIndex struct {\n\tdb         database.DB\n\tcurBlockID uint32\n}\n\n// Ensure the TxIndex type implements the Indexer interface.\nvar _ Indexer = (*TxIndex)(nil)\n\n// Init initializes the hash-based transaction index.  In particular, it finds\n// the highest used block ID and stores it for later use when connecting or\n// disconnecting blocks.\n//\n// This is part of the Indexer interface.\nfunc (idx *TxIndex) Init() error {\n\t// Find the latest known block id field for the internal block id\n\t// index and initialize it.  This is done because it's a lot more\n\t// efficient to do a single search at initialize time than it is to\n\t// write another value to the database on every update.\n\terr := idx.db.View(func(dbTx database.Tx) error {\n\t\t// Scan forward in large gaps to find a block id that doesn't\n\t\t// exist yet to serve as an upper bound for the binary search\n\t\t// below.\n\t\tvar highestKnown, nextUnknown uint32\n\t\ttestBlockID := uint32(1)\n\t\tincrement := uint32(100000)\n\t\tfor {\n\t\t\t_, err := dbFetchBlockHashByID(dbTx, testBlockID)\n\t\t\tif err != nil {\n\t\t\t\tnextUnknown = testBlockID\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\thighestKnown = testBlockID\n\t\t\ttestBlockID += increment\n\t\t}\n\t\tlog.Tracef(\"Forward scan (highest known %d, next unknown %d)\",\n\t\t\thighestKnown, nextUnknown)\n\n\t\t// No used block IDs due to new database.\n\t\tif nextUnknown == 1 {\n\t\t\treturn nil\n\t\t}\n\n\t\t// Use a binary search to find the final highest used block id.\n\t\t// This will take at most ceil(log_2(increment)) attempts.\n\t\tfor {\n\t\t\ttestBlockID = (highestKnown + nextUnknown) / 2\n\t\t\t_, err := dbFetchBlockHashByID(dbTx, testBlockID)\n\t\t\tif err != nil {\n\t\t\t\tnextUnknown = testBlockID\n\t\t\t} else {\n\t\t\t\thighestKnown = testBlockID\n\t\t\t}\n\t\t\tlog.Tracef(\"Binary scan (highest known %d, next \"+\n\t\t\t\t\"unknown %d)\", highestKnown, nextUnknown)\n\t\t\tif highestKnown+1 == nextUnknown {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tidx.curBlockID = highestKnown\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tlog.Debugf(\"Current internal block ID: %d\", idx.curBlockID)\n\treturn nil\n}\n\n// Key returns the database key to use for the index as a byte slice.\n//\n// This is part of the Indexer interface.\nfunc (idx *TxIndex) Key() []byte {\n\treturn txIndexKey\n}\n\n// Name returns the human-readable name of the index.\n//\n// This is part of the Indexer interface.\nfunc (idx *TxIndex) Name() string {\n\treturn txIndexName\n}\n\n// Create is invoked when the indexer manager determines the index needs\n// to be created for the first time.  It creates the buckets for the hash-based\n// transaction index and the internal block ID indexes.\n//\n// This is part of the Indexer interface.\nfunc (idx *TxIndex) Create(dbTx database.Tx) error {\n\tmeta := dbTx.Metadata()\n\tif _, err := meta.CreateBucket(idByHashIndexBucketName); err != nil {\n\t\treturn err\n\t}\n\tif _, err := meta.CreateBucket(hashByIDIndexBucketName); err != nil {\n\t\treturn err\n\t}\n\t_, err := meta.CreateBucket(txIndexKey)\n\treturn err\n}\n\n// ConnectBlock is invoked by the index manager when a new block has been\n// connected to the main chain.  This indexer adds a hash-to-transaction mapping\n// for every transaction in the passed block.\n//\n// This is part of the Indexer interface.\nfunc (idx *TxIndex) ConnectBlock(dbTx database.Tx, block *btcutil.Block,\n\tstxos []blockchain.SpentTxOut) error {\n\n\t// Increment the internal block ID to use for the block being connected\n\t// and add all of the transactions in the block to the index.\n\tnewBlockID := idx.curBlockID + 1\n\tif err := dbAddTxIndexEntries(dbTx, block, newBlockID); err != nil {\n\t\treturn err\n\t}\n\n\t// Add the new block ID index entry for the block being connected and\n\t// update the current internal block ID accordingly.\n\terr := dbPutBlockIDIndexEntry(dbTx, block.Hash(), newBlockID)\n\tif err != nil {\n\t\treturn err\n\t}\n\tidx.curBlockID = newBlockID\n\treturn nil\n}\n\n// DisconnectBlock is invoked by the index manager when a block has been\n// disconnected from the main chain.  This indexer removes the\n// hash-to-transaction mapping for every transaction in the block.\n//\n// This is part of the Indexer interface.\nfunc (idx *TxIndex) DisconnectBlock(dbTx database.Tx, block *btcutil.Block,\n\tstxos []blockchain.SpentTxOut) error {\n\n\t// Remove all of the transactions in the block from the index.\n\tif err := dbRemoveTxIndexEntries(dbTx, block); err != nil {\n\t\treturn err\n\t}\n\n\t// Remove the block ID index entry for the block being disconnected and\n\t// decrement the current internal block ID to account for it.\n\tif err := dbRemoveBlockIDIndexEntry(dbTx, block.Hash()); err != nil {\n\t\treturn err\n\t}\n\tidx.curBlockID--\n\treturn nil\n}\n\n// TxBlockRegion returns the block region for the provided transaction hash\n// from the transaction index.  The block region can in turn be used to load the\n// raw transaction bytes.  When there is no entry for the provided hash, nil\n// will be returned for the both the entry and the error.\n//\n// This function is safe for concurrent access.\nfunc (idx *TxIndex) TxBlockRegion(hash *chainhash.Hash) (*database.BlockRegion, error) {\n\tvar region *database.BlockRegion\n\terr := idx.db.View(func(dbTx database.Tx) error {\n\t\tvar err error\n\t\tregion, err = dbFetchTxIndexEntry(dbTx, hash)\n\t\treturn err\n\t})\n\treturn region, err\n}\n\n// NewTxIndex returns a new instance of an indexer that is used to create a\n// mapping of the hashes of all transactions in the blockchain to the respective\n// block, location within the block, and size of the transaction.\n//\n// It implements the Indexer interface which plugs into the IndexManager that in\n// turn is used by the blockchain package.  This allows the index to be\n// seamlessly maintained along with the chain.\nfunc NewTxIndex(db database.DB) *TxIndex {\n\treturn &TxIndex{db: db}\n}\n\n// dropBlockIDIndex drops the internal block id index.\nfunc dropBlockIDIndex(db database.DB) error {\n\treturn db.Update(func(dbTx database.Tx) error {\n\t\tmeta := dbTx.Metadata()\n\t\terr := meta.DeleteBucket(idByHashIndexBucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn meta.DeleteBucket(hashByIDIndexBucketName)\n\t})\n}\n\n// DropTxIndex drops the transaction index from the provided database if it\n// exists.  Since the address index relies on it, the address index will also be\n// dropped when it exists.\nfunc DropTxIndex(db database.DB, interrupt <-chan struct{}) error {\n\terr := dropIndex(db, addrIndexKey, addrIndexName, interrupt)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn dropIndex(db, txIndexKey, txIndexName, interrupt)\n}\n\n// TxIndexInitialized returns true if the tx index has been created previously.\nfunc TxIndexInitialized(db database.DB) bool {\n\tvar exists bool\n\tdb.View(func(dbTx database.Tx) error {\n\t\tbucket := dbTx.Metadata().Bucket(txIndexKey)\n\t\texists = bucket != nil\n\t\treturn nil\n\t})\n\n\treturn exists\n}\n"
  },
  {
    "path": "blockchain/interfaces.go",
    "content": "package blockchain\n\nimport (\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// ChainCtx is an interface that abstracts away blockchain parameters.\ntype ChainCtx interface {\n\t// ChainParams returns the chain's configured chaincfg.Params.\n\tChainParams() *chaincfg.Params\n\n\t// BlocksPerRetarget returns the number of blocks before retargeting\n\t// occurs.\n\tBlocksPerRetarget() int32\n\n\t// MinRetargetTimespan returns the minimum amount of time to use in the\n\t// difficulty calculation.\n\tMinRetargetTimespan() int64\n\n\t// MaxRetargetTimespan returns the maximum amount of time to use in the\n\t// difficulty calculation.\n\tMaxRetargetTimespan() int64\n\n\t// VerifyCheckpoint returns whether the passed height and hash match\n\t// the checkpoint data. Not all instances of VerifyCheckpoint will use\n\t// this function for validation.\n\tVerifyCheckpoint(height int32, hash *chainhash.Hash) bool\n\n\t// FindPreviousCheckpoint returns the most recent checkpoint that we\n\t// have validated. Not all instances of FindPreviousCheckpoint will use\n\t// this function for validation.\n\tFindPreviousCheckpoint() (HeaderCtx, error)\n}\n\n// HeaderCtx is an interface that describes information about a block. This is\n// used so that external libraries can provide their own context (the header's\n// parent, bits, etc.) when attempting to contextually validate a header.\ntype HeaderCtx interface {\n\t// Height returns the header's height.\n\tHeight() int32\n\n\t// Bits returns the header's bits.\n\tBits() uint32\n\n\t// Timestamp returns the header's timestamp.\n\tTimestamp() int64\n\n\t// Parent returns the header's parent.\n\tParent() HeaderCtx\n\n\t// RelativeAncestorCtx returns the header's ancestor that is distance\n\t// blocks before it in the chain.\n\tRelativeAncestorCtx(distance int32) HeaderCtx\n}\n"
  },
  {
    "path": "blockchain/internal/testhelper/README.md",
    "content": "testhelper\n==========\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/blockchain/testhelper)\n\nPackage testhelper provides functions that are used internally in the\nbtcd/blockchain and btcd/blockchain/fullblocktests package to test consensus\nvalidation rules.  Mainly provided to avoid dependency cycles internally among\nthe different packages in btcd.\n\n## License\n\nPackage testhelper is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "blockchain/internal/testhelper/common.go",
    "content": "package testhelper\n\nimport (\n\t\"encoding/binary\"\n\t\"math\"\n\t\"runtime\"\n\n\t\"github.com/btcsuite/btcd/blockchain/internal/workmath\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nvar (\n\t// OpTrueScript is simply a public key script that contains the OP_TRUE\n\t// opcode.  It is defined here to reduce garbage creation.\n\tOpTrueScript = []byte{txscript.OP_TRUE}\n\n\t// LowFee is a single satoshi and exists to make the test code more\n\t// readable.\n\tLowFee = btcutil.Amount(1)\n)\n\n// CreateSpendTx creates a transaction that spends from the provided spendable\n// output and includes an additional unique OP_RETURN output to ensure the\n// transaction ends up with a unique hash.  The script is a simple OP_TRUE\n// script which avoids the need to track addresses and signature scripts in the\n// tests.\nfunc CreateSpendTx(spend *SpendableOut, fee btcutil.Amount) *wire.MsgTx {\n\tspendTx := wire.NewMsgTx(1)\n\tspendTx.AddTxIn(&wire.TxIn{\n\t\tPreviousOutPoint: spend.PrevOut,\n\t\tSequence:         wire.MaxTxInSequenceNum,\n\t\tSignatureScript:  nil,\n\t})\n\tspendTx.AddTxOut(wire.NewTxOut(int64(spend.Amount-fee),\n\t\tOpTrueScript))\n\topRetScript, err := UniqueOpReturnScript()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tspendTx.AddTxOut(wire.NewTxOut(0, opRetScript))\n\n\treturn spendTx\n}\n\n// CreateCoinbaseTx returns a coinbase transaction paying an appropriate\n// subsidy based on the passed block height and the block subsidy.  The\n// coinbase signature script conforms to the requirements of version 2 blocks.\nfunc CreateCoinbaseTx(blockHeight int32, blockSubsidy int64) *wire.MsgTx {\n\textraNonce := uint64(0)\n\tcoinbaseScript, err := StandardCoinbaseScript(blockHeight, extraNonce)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\ttx := wire.NewMsgTx(1)\n\ttx.AddTxIn(&wire.TxIn{\n\t\t// Coinbase transactions have no inputs, so previous outpoint is\n\t\t// zero hash and max index.\n\t\tPreviousOutPoint: *wire.NewOutPoint(&chainhash.Hash{},\n\t\t\twire.MaxPrevOutIndex),\n\t\tSequence:        wire.MaxTxInSequenceNum,\n\t\tSignatureScript: coinbaseScript,\n\t})\n\ttx.AddTxOut(&wire.TxOut{\n\t\tValue:    blockSubsidy,\n\t\tPkScript: OpTrueScript,\n\t})\n\treturn tx\n}\n\n// StandardCoinbaseScript returns a standard script suitable for use as the\n// signature script of the coinbase transaction of a new block.  In particular,\n// it starts with the block height that is required by version 2 blocks.\nfunc StandardCoinbaseScript(blockHeight int32, extraNonce uint64) ([]byte, error) {\n\treturn txscript.NewScriptBuilder().AddInt64(int64(blockHeight)).\n\t\tAddInt64(int64(extraNonce)).Script()\n}\n\n// OpReturnScript returns a provably-pruneable OP_RETURN script with the\n// provided data.\nfunc OpReturnScript(data []byte) ([]byte, error) {\n\tbuilder := txscript.NewScriptBuilder()\n\tscript, err := builder.AddOp(txscript.OP_RETURN).AddData(data).Script()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn script, nil\n}\n\n// UniqueOpReturnScript returns a standard provably-pruneable OP_RETURN script\n// with a random uint64 encoded as the data.\nfunc UniqueOpReturnScript() ([]byte, error) {\n\trand, err := wire.RandomUint64()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdata := make([]byte, 8)\n\tbinary.LittleEndian.PutUint64(data[0:8], rand)\n\treturn OpReturnScript(data)\n}\n\n// SpendableOut represents a transaction output that is spendable along with\n// additional metadata such as the block its in and how much it pays.\ntype SpendableOut struct {\n\tPrevOut wire.OutPoint\n\tAmount  btcutil.Amount\n}\n\n// MakeSpendableOutForTx returns a spendable output for the given transaction\n// and transaction output index within the transaction.\nfunc MakeSpendableOutForTx(tx *wire.MsgTx, txOutIndex uint32) SpendableOut {\n\treturn SpendableOut{\n\t\tPrevOut: wire.OutPoint{\n\t\t\tHash:  tx.TxHash(),\n\t\t\tIndex: txOutIndex,\n\t\t},\n\t\tAmount: btcutil.Amount(tx.TxOut[txOutIndex].Value),\n\t}\n}\n\n// MakeSpendableOut returns a spendable output for the given block, transaction\n// index within the block, and transaction output index within the transaction.\nfunc MakeSpendableOut(block *wire.MsgBlock, txIndex, txOutIndex uint32) SpendableOut {\n\treturn MakeSpendableOutForTx(block.Transactions[txIndex], txOutIndex)\n}\n\n// SolveBlock attempts to find a nonce which makes the passed block header hash\n// to a value less than the target difficulty.  When a successful solution is\n// found true is returned and the nonce field of the passed header is updated\n// with the solution.  False is returned if no solution exists.\n//\n// NOTE: This function will never solve blocks with a nonce of 0.  This is done\n// so the 'nextBlock' function can properly detect when a nonce was modified by\n// a munge function.\nfunc SolveBlock(header *wire.BlockHeader) bool {\n\t// sbResult is used by the solver goroutines to send results.\n\ttype sbResult struct {\n\t\tfound bool\n\t\tnonce uint32\n\t}\n\n\t// solver accepts a block header and a nonce range to test. It is\n\t// intended to be run as a goroutine.\n\ttargetDifficulty := workmath.CompactToBig(header.Bits)\n\tquit := make(chan bool)\n\tresults := make(chan sbResult)\n\tsolver := func(hdr wire.BlockHeader, startNonce, stopNonce uint32) {\n\t\t// We need to modify the nonce field of the header, so make sure\n\t\t// we work with a copy of the original header.\n\t\tfor i := startNonce; i >= startNonce && i <= stopNonce; i++ {\n\t\t\tselect {\n\t\t\tcase <-quit:\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\thdr.Nonce = i\n\t\t\t\thash := hdr.BlockHash()\n\t\t\t\tif workmath.HashToBig(&hash).Cmp(\n\t\t\t\t\ttargetDifficulty) <= 0 {\n\n\t\t\t\t\tresults <- sbResult{true, i}\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tresults <- sbResult{false, 0}\n\t}\n\n\tstartNonce := uint32(1)\n\tstopNonce := uint32(math.MaxUint32)\n\tnumCores := uint32(runtime.NumCPU())\n\tnoncesPerCore := (stopNonce - startNonce) / numCores\n\tfor i := uint32(0); i < numCores; i++ {\n\t\trangeStart := startNonce + (noncesPerCore * i)\n\t\trangeStop := startNonce + (noncesPerCore * (i + 1)) - 1\n\t\tif i == numCores-1 {\n\t\t\trangeStop = stopNonce\n\t\t}\n\t\tgo solver(*header, rangeStart, rangeStop)\n\t}\n\tfor i := uint32(0); i < numCores; i++ {\n\t\tresult := <-results\n\t\tif result.found {\n\t\t\tclose(quit)\n\t\t\theader.Nonce = result.nonce\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "blockchain/internal/workmath/README.md",
    "content": "workmath\n==========\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/workmath)\n\nPackage workmath provides utility functions that are related with calculating\nthe work from difficulty bits.  This package was introduced to avoid import\ncycles in btcd.\n\n## License\n\nPackage workmath is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "blockchain/internal/workmath/difficulty.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage workmath\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nvar (\n\t// bigOne is 1 represented as a big.Int.  It is defined here to avoid\n\t// the overhead of creating it multiple times.\n\tbigOne = big.NewInt(1)\n\n\t// oneLsh256 is 1 shifted left 256 bits.  It is defined here to avoid\n\t// the overhead of creating it multiple times.\n\toneLsh256 = new(big.Int).Lsh(bigOne, 256)\n)\n\n// HashToBig converts a chainhash.Hash into a big.Int that can be used to\n// perform math comparisons.\nfunc HashToBig(hash *chainhash.Hash) *big.Int {\n\t// A Hash is in little-endian, but the big package wants the bytes in\n\t// big-endian, so reverse them.\n\tbuf := *hash\n\tblen := len(buf)\n\tfor i := 0; i < blen/2; i++ {\n\t\tbuf[i], buf[blen-1-i] = buf[blen-1-i], buf[i]\n\t}\n\n\treturn new(big.Int).SetBytes(buf[:])\n}\n\n// CompactToBig converts a compact representation of a whole number N to an\n// unsigned 32-bit number.  The representation is similar to IEEE754 floating\n// point numbers.\n//\n// Like IEEE754 floating point, there are three basic components: the sign,\n// the exponent, and the mantissa.  They are broken out as follows:\n//\n// - the most significant 8 bits represent the unsigned base 256 exponent\n// - bit 23 (the 24th bit) represents the sign bit\n// - the least significant 23 bits represent the mantissa\n//\n//\t-------------------------------------------------\n//\t|   Exponent     |    Sign    |    Mantissa     |\n//\t-------------------------------------------------\n//\t| 8 bits [31-24] | 1 bit [23] | 23 bits [22-00] |\n//\t-------------------------------------------------\n//\n// The formula to calculate N is:\n//\n//\tN = (-1^sign) * mantissa * 256^(exponent-3)\n//\n// This compact form is only used in bitcoin to encode unsigned 256-bit numbers\n// which represent difficulty targets, thus there really is not a need for a\n// sign bit, but it is implemented here to stay consistent with bitcoind.\nfunc CompactToBig(compact uint32) *big.Int {\n\t// Extract the mantissa, sign bit, and exponent.\n\tmantissa := compact & 0x007fffff\n\tisNegative := compact&0x00800000 != 0\n\texponent := uint(compact >> 24)\n\n\t// Since the base for the exponent is 256, the exponent can be treated\n\t// as the number of bytes to represent the full 256-bit number.  So,\n\t// treat the exponent as the number of bytes and shift the mantissa\n\t// right or left accordingly.  This is equivalent to:\n\t// N = mantissa * 256^(exponent-3)\n\tvar bn *big.Int\n\tif exponent <= 3 {\n\t\tmantissa >>= 8 * (3 - exponent)\n\t\tbn = big.NewInt(int64(mantissa))\n\t} else {\n\t\tbn = big.NewInt(int64(mantissa))\n\t\tbn.Lsh(bn, 8*(exponent-3))\n\t}\n\n\t// Make it negative if the sign bit is set.\n\tif isNegative {\n\t\tbn = bn.Neg(bn)\n\t}\n\n\treturn bn\n}\n\n// BigToCompact converts a whole number N to a compact representation using\n// an unsigned 32-bit number.  The compact representation only provides 23 bits\n// of precision, so values larger than (2^23 - 1) only encode the most\n// significant digits of the number.  See CompactToBig for details.\nfunc BigToCompact(n *big.Int) uint32 {\n\t// No need to do any work if it's zero.\n\tif n.Sign() == 0 {\n\t\treturn 0\n\t}\n\n\t// Since the base for the exponent is 256, the exponent can be treated\n\t// as the number of bytes.  So, shift the number right or left\n\t// accordingly.  This is equivalent to:\n\t// mantissa = mantissa / 256^(exponent-3)\n\tvar mantissa uint32\n\texponent := uint(len(n.Bytes()))\n\tif exponent <= 3 {\n\t\tmantissa = uint32(n.Bits()[0])\n\t\tmantissa <<= 8 * (3 - exponent)\n\t} else {\n\t\t// Use a copy to avoid modifying the caller's original number.\n\t\ttn := new(big.Int).Set(n)\n\t\tmantissa = uint32(tn.Rsh(tn, 8*(exponent-3)).Bits()[0])\n\t}\n\n\t// When the mantissa already has the sign bit set, the number is too\n\t// large to fit into the available 23-bits, so divide the number by 256\n\t// and increment the exponent accordingly.\n\tif mantissa&0x00800000 != 0 {\n\t\tmantissa >>= 8\n\t\texponent++\n\t}\n\n\t// Pack the exponent, sign bit, and mantissa into an unsigned 32-bit\n\t// int and return it.\n\tcompact := uint32(exponent<<24) | mantissa\n\tif n.Sign() < 0 {\n\t\tcompact |= 0x00800000\n\t}\n\treturn compact\n}\n\n// CalcWork calculates a work value from difficulty bits.  Bitcoin increases\n// the difficulty for generating a block by decreasing the value which the\n// generated hash must be less than.  This difficulty target is stored in each\n// block header using a compact representation as described in the documentation\n// for CompactToBig.  The main chain is selected by choosing the chain that has\n// the most proof of work (highest difficulty).  Since a lower target difficulty\n// value equates to higher actual difficulty, the work value which will be\n// accumulated must be the inverse of the difficulty.  Also, in order to avoid\n// potential division by zero and really small floating point numbers, the\n// result adds 1 to the denominator and multiplies the numerator by 2^256.\nfunc CalcWork(bits uint32) *big.Int {\n\t// Return a work value of zero if the passed difficulty bits represent\n\t// a negative number. Note this should not happen in practice with valid\n\t// blocks, but an invalid block could trigger it.\n\tdifficultyNum := CompactToBig(bits)\n\tif difficultyNum.Sign() <= 0 {\n\t\treturn big.NewInt(0)\n\t}\n\n\t// (1 << 256) / (difficultyNum + 1)\n\tdenominator := new(big.Int).Add(difficultyNum, bigOne)\n\treturn new(big.Int).Div(oneLsh256, denominator)\n}\n"
  },
  {
    "path": "blockchain/internal/workmath/difficulty_test.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage workmath\n\nimport (\n\t\"math/big\"\n\t\"testing\"\n)\n\n// TestBigToCompact ensures BigToCompact converts big integers to the expected\n// compact representation.\nfunc TestBigToCompact(t *testing.T) {\n\ttests := []struct {\n\t\tin  int64\n\t\tout uint32\n\t}{\n\t\t{0, 0},\n\t\t{-1, 25231360},\n\t}\n\n\tfor x, test := range tests {\n\t\tn := big.NewInt(test.in)\n\t\tr := BigToCompact(n)\n\t\tif r != test.out {\n\t\t\tt.Errorf(\"TestBigToCompact test #%d failed: got %d want %d\\n\",\n\t\t\t\tx, r, test.out)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// TestCompactToBig ensures CompactToBig converts numbers using the compact\n// representation to the expected big integers.\nfunc TestCompactToBig(t *testing.T) {\n\ttests := []struct {\n\t\tin  uint32\n\t\tout int64\n\t}{\n\t\t{10000000, 0},\n\t}\n\n\tfor x, test := range tests {\n\t\tn := CompactToBig(test.in)\n\t\twant := big.NewInt(test.out)\n\t\tif n.Cmp(want) != 0 {\n\t\t\tt.Errorf(\"TestCompactToBig test #%d failed: got %d want %d\\n\",\n\t\t\t\tx, n.Int64(), want.Int64())\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// TestCalcWork ensures CalcWork calculates the expected work value from values\n// in compact representation.\nfunc TestCalcWork(t *testing.T) {\n\ttests := []struct {\n\t\tin  uint32\n\t\tout int64\n\t}{\n\t\t{10000000, 0},\n\t}\n\n\tfor x, test := range tests {\n\t\tbits := test.in\n\n\t\tr := CalcWork(bits)\n\t\tif r.Int64() != test.out {\n\t\t\tt.Errorf(\"TestCalcWork test #%d failed: got %v want %d\\n\",\n\t\t\t\tx, r.Int64(), test.out)\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blockchain/log.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"github.com/btcsuite/btclog\"\n)\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until UseLogger is called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n"
  },
  {
    "path": "blockchain/mediantime.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"math\"\n\t\"sort\"\n\t\"sync\"\n\t\"time\"\n)\n\nconst (\n\t// maxAllowedOffsetSeconds is the maximum number of seconds in either\n\t// direction that local clock will be adjusted.  When the median time\n\t// of the network is outside of this range, no offset will be applied.\n\tmaxAllowedOffsetSecs = 70 * 60 // 1 hour 10 minutes\n\n\t// similarTimeSecs is the number of seconds in either direction from the\n\t// local clock that is used to determine that it is likely wrong and\n\t// hence to show a warning.\n\tsimilarTimeSecs = 5 * 60 // 5 minutes\n)\n\nvar (\n\t// maxMedianTimeEntries is the maximum number of entries allowed in the\n\t// median time data.  This is a variable as opposed to a constant so the\n\t// test code can modify it.\n\tmaxMedianTimeEntries = 200\n)\n\n// MedianTimeSource provides a mechanism to add several time samples which are\n// used to determine a median time which is then used as an offset to the local\n// clock.\ntype MedianTimeSource interface {\n\t// AdjustedTime returns the current time adjusted by the median time\n\t// offset as calculated from the time samples added by AddTimeSample.\n\tAdjustedTime() time.Time\n\n\t// AddTimeSample adds a time sample that is used when determining the\n\t// median time of the added samples.\n\tAddTimeSample(id string, timeVal time.Time)\n\n\t// Offset returns the number of seconds to adjust the local clock based\n\t// upon the median of the time samples added by AddTimeData.\n\tOffset() time.Duration\n}\n\n// int64Sorter implements sort.Interface to allow a slice of 64-bit integers to\n// be sorted.\ntype int64Sorter []int64\n\n// Len returns the number of 64-bit integers in the slice.  It is part of the\n// sort.Interface implementation.\nfunc (s int64Sorter) Len() int {\n\treturn len(s)\n}\n\n// Swap swaps the 64-bit integers at the passed indices.  It is part of the\n// sort.Interface implementation.\nfunc (s int64Sorter) Swap(i, j int) {\n\ts[i], s[j] = s[j], s[i]\n}\n\n// Less returns whether the 64-bit integer with index i should sort before the\n// 64-bit integer with index j.  It is part of the sort.Interface\n// implementation.\nfunc (s int64Sorter) Less(i, j int) bool {\n\treturn s[i] < s[j]\n}\n\n// medianTime provides an implementation of the MedianTimeSource interface.\n// It is limited to maxMedianTimeEntries includes the same buggy behavior as\n// the time offset mechanism in Bitcoin Core.  This is necessary because it is\n// used in the consensus code.\ntype medianTime struct {\n\tmtx                sync.Mutex\n\tknownIDs           map[string]struct{}\n\toffsets            []int64\n\toffsetSecs         int64\n\tinvalidTimeChecked bool\n}\n\n// Ensure the medianTime type implements the MedianTimeSource interface.\nvar _ MedianTimeSource = (*medianTime)(nil)\n\n// AdjustedTime returns the current time adjusted by the median time offset as\n// calculated from the time samples added by AddTimeSample.\n//\n// This function is safe for concurrent access and is part of the\n// MedianTimeSource interface implementation.\nfunc (m *medianTime) AdjustedTime() time.Time {\n\tm.mtx.Lock()\n\tdefer m.mtx.Unlock()\n\n\t// Limit the adjusted time to 1 second precision.\n\tnow := time.Unix(time.Now().Unix(), 0)\n\treturn now.Add(time.Duration(m.offsetSecs) * time.Second)\n}\n\n// AddTimeSample adds a time sample that is used when determining the median\n// time of the added samples.\n//\n// This function is safe for concurrent access and is part of the\n// MedianTimeSource interface implementation.\nfunc (m *medianTime) AddTimeSample(sourceID string, timeVal time.Time) {\n\tm.mtx.Lock()\n\tdefer m.mtx.Unlock()\n\n\t// Don't add time data from the same source.\n\tif _, exists := m.knownIDs[sourceID]; exists {\n\t\treturn\n\t}\n\tm.knownIDs[sourceID] = struct{}{}\n\n\t// Truncate the provided offset to seconds and append it to the slice\n\t// of offsets while respecting the maximum number of allowed entries by\n\t// replacing the oldest entry with the new entry once the maximum number\n\t// of entries is reached.\n\tnow := time.Unix(time.Now().Unix(), 0)\n\toffsetSecs := int64(timeVal.Sub(now).Seconds())\n\tnumOffsets := len(m.offsets)\n\tif numOffsets == maxMedianTimeEntries && maxMedianTimeEntries > 0 {\n\t\tm.offsets = m.offsets[1:]\n\t\tnumOffsets--\n\t}\n\tm.offsets = append(m.offsets, offsetSecs)\n\tnumOffsets++\n\n\t// Sort the offsets so the median can be obtained as needed later.\n\tsortedOffsets := make([]int64, numOffsets)\n\tcopy(sortedOffsets, m.offsets)\n\tsort.Sort(int64Sorter(sortedOffsets))\n\n\toffsetDuration := time.Duration(offsetSecs) * time.Second\n\tlog.Debugf(\"Added time sample of %v (total: %v)\", offsetDuration,\n\t\tnumOffsets)\n\n\t// NOTE: The following code intentionally has a bug to mirror the\n\t// buggy behavior in Bitcoin Core since the median time is used in the\n\t// consensus rules.\n\t//\n\t// In particular, the offset is only updated when the number of entries\n\t// is odd, but the max number of entries is 200, an even number.  Thus,\n\t// the offset will never be updated again once the max number of entries\n\t// is reached.\n\n\t// The median offset is only updated when there are enough offsets and\n\t// the number of offsets is odd so the middle value is the true median.\n\t// Thus, there is nothing to do when those conditions are not met.\n\tif numOffsets < 5 || numOffsets&0x01 != 1 {\n\t\treturn\n\t}\n\n\t// At this point the number of offsets in the list is odd, so the\n\t// middle value of the sorted offsets is the median.\n\tmedian := sortedOffsets[numOffsets/2]\n\n\t// Set the new offset when the median offset is within the allowed\n\t// offset range.\n\tif math.Abs(float64(median)) < maxAllowedOffsetSecs {\n\t\tm.offsetSecs = median\n\t} else {\n\t\t// The median offset of all added time data is larger than the\n\t\t// maximum allowed offset, so don't use an offset.  This\n\t\t// effectively limits how far the local clock can be skewed.\n\t\tm.offsetSecs = 0\n\n\t\tif !m.invalidTimeChecked {\n\t\t\tm.invalidTimeChecked = true\n\n\t\t\t// Find if any time samples have a time that is close\n\t\t\t// to the local time.\n\t\t\tvar remoteHasCloseTime bool\n\t\t\tfor _, offset := range sortedOffsets {\n\t\t\t\tif math.Abs(float64(offset)) < similarTimeSecs {\n\t\t\t\t\tremoteHasCloseTime = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Warn if none of the time samples are close.\n\t\t\tif !remoteHasCloseTime {\n\t\t\t\tlog.Warnf(\"Please check your date and time \" +\n\t\t\t\t\t\"are correct!  btcd will not work \" +\n\t\t\t\t\t\"properly with an invalid time\")\n\t\t\t}\n\t\t}\n\t}\n\n\tmedianDuration := time.Duration(m.offsetSecs) * time.Second\n\tlog.Debugf(\"New time offset: %v\", medianDuration)\n}\n\n// Offset returns the number of seconds to adjust the local clock based upon the\n// median of the time samples added by AddTimeData.\n//\n// This function is safe for concurrent access and is part of the\n// MedianTimeSource interface implementation.\nfunc (m *medianTime) Offset() time.Duration {\n\tm.mtx.Lock()\n\tdefer m.mtx.Unlock()\n\n\treturn time.Duration(m.offsetSecs) * time.Second\n}\n\n// NewMedianTime returns a new instance of concurrency-safe implementation of\n// the MedianTimeSource interface.  The returned implementation contains the\n// rules necessary for proper time handling in the chain consensus rules and\n// expects the time samples to be added from the timestamp field of the version\n// message received from remote peers that successfully connect and negotiate.\nfunc NewMedianTime() MedianTimeSource {\n\treturn &medianTime{\n\t\tknownIDs: make(map[string]struct{}),\n\t\toffsets:  make([]int64, 0, maxMedianTimeEntries),\n\t}\n}\n"
  },
  {
    "path": "blockchain/mediantime_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"strconv\"\n\t\"testing\"\n\t\"time\"\n)\n\n// TestMedianTime tests the medianTime implementation.\nfunc TestMedianTime(t *testing.T) {\n\ttests := []struct {\n\t\tin         []int64\n\t\twantOffset int64\n\t\tuseDupID   bool\n\t}{\n\t\t// Not enough samples must result in an offset of 0.\n\t\t{in: []int64{1}, wantOffset: 0},\n\t\t{in: []int64{1, 2}, wantOffset: 0},\n\t\t{in: []int64{1, 2, 3}, wantOffset: 0},\n\t\t{in: []int64{1, 2, 3, 4}, wantOffset: 0},\n\n\t\t// Various number of entries.  The expected offset is only\n\t\t// updated on odd number of elements.\n\t\t{in: []int64{-13, 57, -4, -23, -12}, wantOffset: -12},\n\t\t{in: []int64{55, -13, 61, -52, 39, 55}, wantOffset: 39},\n\t\t{in: []int64{-62, -58, -30, -62, 51, -30, 15}, wantOffset: -30},\n\t\t{in: []int64{29, -47, 39, 54, 42, 41, 8, -33}, wantOffset: 39},\n\t\t{in: []int64{37, 54, 9, -21, -56, -36, 5, -11, -39}, wantOffset: -11},\n\t\t{in: []int64{57, -28, 25, -39, 9, 63, -16, 19, -60, 25}, wantOffset: 9},\n\t\t{in: []int64{-5, -4, -3, -2, -1}, wantOffset: -3, useDupID: true},\n\n\t\t// The offset stops being updated once the max number of entries\n\t\t// has been reached.  This is actually a bug from Bitcoin Core,\n\t\t// but since the time is ultimately used as a part of the\n\t\t// consensus rules, it must be mirrored.\n\t\t{in: []int64{-67, 67, -50, 24, 63, 17, 58, -14, 5, -32, -52}, wantOffset: 17},\n\t\t{in: []int64{-67, 67, -50, 24, 63, 17, 58, -14, 5, -32, -52, 45}, wantOffset: 17},\n\t\t{in: []int64{-67, 67, -50, 24, 63, 17, 58, -14, 5, -32, -52, 45, 4}, wantOffset: 17},\n\n\t\t// Offsets that are too far away from the local time should\n\t\t// be ignored.\n\t\t{in: []int64{-4201, 4202, -4203, 4204, -4205}, wantOffset: 0},\n\n\t\t// Exercise the condition where the median offset is greater\n\t\t// than the max allowed adjustment, but there is at least one\n\t\t// sample that is close enough to the current time to avoid\n\t\t// triggering a warning about an invalid local clock.\n\t\t{in: []int64{4201, 4202, 4203, 4204, -299}, wantOffset: 0},\n\t}\n\n\t// Modify the max number of allowed median time entries for these tests.\n\tmaxMedianTimeEntries = 10\n\tdefer func() { maxMedianTimeEntries = 200 }()\n\n\tfor i, test := range tests {\n\t\tfilter := NewMedianTime()\n\t\tfor j, offset := range test.in {\n\t\t\tid := strconv.Itoa(j)\n\t\t\tnow := time.Unix(time.Now().Unix(), 0)\n\t\t\ttOffset := now.Add(time.Duration(offset) * time.Second)\n\t\t\tfilter.AddTimeSample(id, tOffset)\n\n\t\t\t// Ensure the duplicate IDs are ignored.\n\t\t\tif test.useDupID {\n\t\t\t\t// Modify the offsets to ensure the final median\n\t\t\t\t// would be different if the duplicate is added.\n\t\t\t\ttOffset = tOffset.Add(time.Duration(offset) *\n\t\t\t\t\ttime.Second)\n\t\t\t\tfilter.AddTimeSample(id, tOffset)\n\t\t\t}\n\t\t}\n\n\t\t// Since it is possible that the time.Now call in AddTimeSample\n\t\t// and the time.Now calls here in the tests will be off by one\n\t\t// second, allow a fudge factor to compensate.\n\t\tgotOffset := filter.Offset()\n\t\twantOffset := time.Duration(test.wantOffset) * time.Second\n\t\twantOffset2 := time.Duration(test.wantOffset-1) * time.Second\n\t\tif gotOffset != wantOffset && gotOffset != wantOffset2 {\n\t\t\tt.Errorf(\"Offset #%d: unexpected offset -- got %v, \"+\n\t\t\t\t\"want %v or %v\", i, gotOffset, wantOffset,\n\t\t\t\twantOffset2)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Since it is possible that the time.Now call in AdjustedTime\n\t\t// and the time.Now call here in the tests will be off by one\n\t\t// second, allow a fudge factor to compensate.\n\t\tadjustedTime := filter.AdjustedTime()\n\t\tnow := time.Unix(time.Now().Unix(), 0)\n\t\twantTime := now.Add(filter.Offset())\n\t\twantTime2 := now.Add(filter.Offset() - time.Second)\n\t\tif !adjustedTime.Equal(wantTime) && !adjustedTime.Equal(wantTime2) {\n\t\t\tt.Errorf(\"AdjustedTime #%d: unexpected result -- got %v, \"+\n\t\t\t\t\"want %v or %v\", i, adjustedTime, wantTime,\n\t\t\t\twantTime2)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blockchain/merkle.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n)\n\nconst (\n\t// CoinbaseWitnessDataLen is the required length of the only element within\n\t// the coinbase's witness data if the coinbase transaction contains a\n\t// witness commitment.\n\tCoinbaseWitnessDataLen = 32\n\n\t// CoinbaseWitnessPkScriptLength is the length of the public key script\n\t// containing an OP_RETURN, the WitnessMagicBytes, and the witness\n\t// commitment itself. In order to be a valid candidate for the output\n\t// containing the witness commitment\n\tCoinbaseWitnessPkScriptLength = 38\n)\n\nvar (\n\t// WitnessMagicBytes is the prefix marker within the public key script\n\t// of a coinbase output to indicate that this output holds the witness\n\t// commitment for a block.\n\tWitnessMagicBytes = []byte{\n\t\ttxscript.OP_RETURN,\n\t\ttxscript.OP_DATA_36,\n\t\t0xaa,\n\t\t0x21,\n\t\t0xa9,\n\t\t0xed,\n\t}\n)\n\n// nextPowerOfTwo returns the next highest power of two from a given number if\n// it is not already a power of two.  This is a helper function used during the\n// calculation of a merkle tree.\nfunc nextPowerOfTwo(n int) int {\n\t// Return the number if it's already a power of 2.\n\tif n&(n-1) == 0 {\n\t\treturn n\n\t}\n\n\t// Figure out and return the next power of two.\n\texponent := uint(math.Log2(float64(n))) + 1\n\treturn 1 << exponent // 2^exponent\n}\n\n// HashMerkleBranches takes two hashes, treated as the left and right tree\n// nodes, and returns the hash of their concatenation.  This is a helper\n// function used to aid in the generation of a merkle tree.\nfunc HashMerkleBranches(left, right *chainhash.Hash) chainhash.Hash {\n\t// Concatenate the left and right nodes.\n\tvar hash [chainhash.HashSize * 2]byte\n\tcopy(hash[:chainhash.HashSize], left[:])\n\tcopy(hash[chainhash.HashSize:], right[:])\n\n\treturn chainhash.DoubleHashRaw(func(w io.Writer) error {\n\t\t_, err := w.Write(hash[:])\n\t\treturn err\n\t})\n}\n\n// BuildMerkleTreeStore creates a merkle tree from a slice of transactions,\n// stores it using a linear array, and returns a slice of the backing array.  A\n// linear array was chosen as opposed to an actual tree structure since it uses\n// about half as much memory.  The following describes a merkle tree and how it\n// is stored in a linear array.\n//\n// A merkle tree is a tree in which every non-leaf node is the hash of its\n// children nodes.  A diagram depicting how this works for bitcoin transactions\n// where h(x) is a double sha256 follows:\n//\n//\t         root = h1234 = h(h12 + h34)\n//\t        /                           \\\n//\t  h12 = h(h1 + h2)            h34 = h(h3 + h4)\n//\t   /            \\              /            \\\n//\th1 = h(tx1)  h2 = h(tx2)    h3 = h(tx3)  h4 = h(tx4)\n//\n// The above stored as a linear array is as follows:\n//\n//\t[h1 h2 h3 h4 h12 h34 root]\n//\n// As the above shows, the merkle root is always the last element in the array.\n//\n// The number of inputs is not always a power of two which results in a\n// balanced tree structure as above.  In that case, parent nodes with no\n// children are also zero and parent nodes with only a single left node\n// are calculated by concatenating the left node with itself before hashing.\n// Since this function uses nodes that are pointers to the hashes, empty nodes\n// will be nil.\n//\n// The additional bool parameter indicates if we are generating the merkle tree\n// using witness transaction id's rather than regular transaction id's. This\n// also presents an additional case wherein the wtxid of the coinbase transaction\n// is the zeroHash.\nfunc BuildMerkleTreeStore(transactions []*btcutil.Tx, witness bool) []*chainhash.Hash {\n\t// Calculate how many entries are required to hold the binary merkle\n\t// tree as a linear array and create an array of that size.\n\tnextPoT := nextPowerOfTwo(len(transactions))\n\tarraySize := nextPoT*2 - 1\n\tmerkles := make([]*chainhash.Hash, arraySize)\n\n\t// Create the base transaction hashes and populate the array with them.\n\tfor i, tx := range transactions {\n\t\t// If we're computing a witness merkle root, instead of the\n\t\t// regular txid, we use the modified wtxid which includes a\n\t\t// transaction's witness data within the digest. Additionally,\n\t\t// the coinbase's wtxid is all zeroes.\n\t\tswitch {\n\t\tcase witness && i == 0:\n\t\t\tvar zeroHash chainhash.Hash\n\t\t\tmerkles[i] = &zeroHash\n\t\tcase witness:\n\t\t\twSha := tx.MsgTx().WitnessHash()\n\t\t\tmerkles[i] = &wSha\n\t\tdefault:\n\t\t\tmerkles[i] = tx.Hash()\n\t\t}\n\n\t}\n\n\t// Start the array offset after the last transaction and adjusted to the\n\t// next power of two.\n\toffset := nextPoT\n\tfor i := 0; i < arraySize-1; i += 2 {\n\t\tswitch {\n\t\t// When there is no left child node, the parent is nil too.\n\t\tcase merkles[i] == nil:\n\t\t\tmerkles[offset] = nil\n\n\t\t// When there is no right child, the parent is generated by\n\t\t// hashing the concatenation of the left child with itself.\n\t\tcase merkles[i+1] == nil:\n\t\t\tnewHash := HashMerkleBranches(merkles[i], merkles[i])\n\t\t\tmerkles[offset] = &newHash\n\n\t\t// The normal case sets the parent node to the double sha256\n\t\t// of the concatenation of the left and right children.\n\t\tdefault:\n\t\t\tnewHash := HashMerkleBranches(merkles[i], merkles[i+1])\n\t\t\tmerkles[offset] = &newHash\n\t\t}\n\t\toffset++\n\t}\n\n\treturn merkles\n}\n\n// CalcMerkleRoot computes the merkle root over a set of hashed leaves. The\n// interior nodes are computed opportunistically as the leaves are added to the\n// abstract tree to reduce the total number of allocations. Throughout the\n// computation, this computation only requires storing O(log n) interior\n// nodes.\n//\n// This method differs from BuildMerkleTreeStore in that the interior nodes are\n// discarded instead of being returned along with the root. CalcMerkleRoot is\n// slightly faster than BuildMerkleTreeStore and requires significantly less\n// memory and fewer allocations.\n//\n// A merkle tree is a tree in which every non-leaf node is the hash of its\n// children nodes. A diagram depicting how this works for bitcoin transactions\n// where h(x) is a double sha256 follows:\n//\n//\t         root = h1234 = h(h12 + h34)\n//\t        /                           \\\n//\t  h12 = h(h1 + h2)            h34 = h(h3 + h4)\n//\t   /            \\              /            \\\n//\th1 = h(tx1)  h2 = h(tx2)    h3 = h(tx3)  h4 = h(tx4)\n//\n// The additional bool parameter indicates if we are generating the merkle tree\n// using witness transaction id's rather than regular transaction id's. This\n// also presents an additional case wherein the wtxid of the coinbase transaction\n// is the zeroHash.\nfunc CalcMerkleRoot(transactions []*btcutil.Tx, witness bool) chainhash.Hash {\n\ts := newRollingMerkleTreeStore(uint64(len(transactions)))\n\treturn s.calcMerkleRoot(transactions, witness)\n}\n\n// ExtractWitnessCommitment attempts to locate, and return the witness\n// commitment for a block. The witness commitment is of the form:\n// SHA256(witness root || witness nonce). The function additionally returns a\n// boolean indicating if the witness root was located within any of the txOut's\n// in the passed transaction. The witness commitment is stored as the data push\n// for an OP_RETURN with special magic bytes to aide in location.\nfunc ExtractWitnessCommitment(tx *btcutil.Tx) ([]byte, bool) {\n\t// The witness commitment *must* be located within one of the coinbase\n\t// transaction's outputs.\n\tif !IsCoinBase(tx) {\n\t\treturn nil, false\n\t}\n\n\tmsgTx := tx.MsgTx()\n\tfor i := len(msgTx.TxOut) - 1; i >= 0; i-- {\n\t\t// The public key script that contains the witness commitment\n\t\t// must shared a prefix with the WitnessMagicBytes, and be at\n\t\t// least 38 bytes.\n\t\tpkScript := msgTx.TxOut[i].PkScript\n\t\tif len(pkScript) >= CoinbaseWitnessPkScriptLength &&\n\t\t\tbytes.HasPrefix(pkScript, WitnessMagicBytes) {\n\n\t\t\t// The witness commitment itself is a 32-byte hash\n\t\t\t// directly after the WitnessMagicBytes. The remaining\n\t\t\t// bytes beyond the 38th byte currently have no consensus\n\t\t\t// meaning.\n\t\t\tstart := len(WitnessMagicBytes)\n\t\t\tend := CoinbaseWitnessPkScriptLength\n\t\t\treturn msgTx.TxOut[i].PkScript[start:end], true\n\t\t}\n\t}\n\n\treturn nil, false\n}\n\n// ValidateWitnessCommitment validates the witness commitment (if any) found\n// within the coinbase transaction of the passed block.\nfunc ValidateWitnessCommitment(blk *btcutil.Block) error {\n\t// If the block doesn't have any transactions at all, then we won't be\n\t// able to extract a commitment from the non-existent coinbase\n\t// transaction. So we exit early here.\n\tif len(blk.Transactions()) == 0 {\n\t\tstr := \"cannot validate witness commitment of block without \" +\n\t\t\t\"transactions\"\n\t\treturn ruleError(ErrNoTransactions, str)\n\t}\n\n\tcoinbaseTx := blk.Transactions()[0]\n\tif len(coinbaseTx.MsgTx().TxIn) == 0 {\n\t\treturn ruleError(ErrNoTxInputs, \"transaction has no inputs\")\n\t}\n\n\twitnessCommitment, witnessFound := ExtractWitnessCommitment(coinbaseTx)\n\n\t// If we can't find a witness commitment in any of the coinbase's\n\t// outputs, then the block MUST NOT contain any transactions with\n\t// witness data.\n\tif !witnessFound {\n\t\tfor _, tx := range blk.Transactions() {\n\t\t\tmsgTx := tx.MsgTx()\n\t\t\tif msgTx.HasWitness() {\n\t\t\t\tstr := fmt.Sprintf(\"block contains transaction with witness\" +\n\t\t\t\t\t\" data, yet no witness commitment present\")\n\t\t\t\treturn ruleError(ErrUnexpectedWitness, str)\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\t// At this point the block contains a witness commitment, so the\n\t// coinbase transaction MUST have exactly one witness element within\n\t// its witness data and that element must be exactly\n\t// CoinbaseWitnessDataLen bytes.\n\tcoinbaseWitness := coinbaseTx.MsgTx().TxIn[0].Witness\n\tif len(coinbaseWitness) != 1 {\n\t\tstr := fmt.Sprintf(\"the coinbase transaction has %d items in \"+\n\t\t\t\"its witness stack when only one is allowed\",\n\t\t\tlen(coinbaseWitness))\n\t\treturn ruleError(ErrInvalidWitnessCommitment, str)\n\t}\n\twitnessNonce := coinbaseWitness[0]\n\tif len(witnessNonce) != CoinbaseWitnessDataLen {\n\t\tstr := fmt.Sprintf(\"the coinbase transaction witness nonce \"+\n\t\t\t\"has %d bytes when it must be %d bytes\",\n\t\t\tlen(witnessNonce), CoinbaseWitnessDataLen)\n\t\treturn ruleError(ErrInvalidWitnessCommitment, str)\n\t}\n\n\t// Finally, with the preliminary checks out of the way, we can check if\n\t// the extracted witnessCommitment is equal to:\n\t// SHA256(witnessMerkleRoot || witnessNonce). Where witnessNonce is the\n\t// coinbase transaction's only witness item.\n\twitnessMerkleRoot := CalcMerkleRoot(blk.Transactions(), true)\n\n\tvar witnessPreimage [chainhash.HashSize * 2]byte\n\tcopy(witnessPreimage[:], witnessMerkleRoot[:])\n\tcopy(witnessPreimage[chainhash.HashSize:], witnessNonce)\n\n\tcomputedCommitment := chainhash.DoubleHashB(witnessPreimage[:])\n\tif !bytes.Equal(computedCommitment, witnessCommitment) {\n\t\tstr := fmt.Sprintf(\"witness commitment does not match: \"+\n\t\t\t\"computed %v, coinbase includes %v\", computedCommitment,\n\t\t\twitnessCommitment)\n\t\treturn ruleError(ErrWitnessCommitmentMismatch, str)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "blockchain/merkle_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestMerkle tests the BuildMerkleTreeStore API.\nfunc TestMerkle(t *testing.T) {\n\tblock := btcutil.NewBlock(&Block100000)\n\tcalcMerkleRoot := CalcMerkleRoot(block.Transactions(), false)\n\tmerkleStoreTree := BuildMerkleTreeStore(block.Transactions(), false)\n\tmerkleStoreRoot := merkleStoreTree[len(merkleStoreTree)-1]\n\n\trequire.Equal(t, *merkleStoreRoot, calcMerkleRoot)\n\n\twantMerkle := &Block100000.Header.MerkleRoot\n\tif !wantMerkle.IsEqual(&calcMerkleRoot) {\n\t\tt.Errorf(\"BuildMerkleTreeStore: merkle root mismatch - \"+\n\t\t\t\"got %v, want %v\", calcMerkleRoot, wantMerkle)\n\t}\n}\n\nfunc makeHashes(size int) []*chainhash.Hash {\n\tvar hashes = make([]*chainhash.Hash, size)\n\tfor i := range hashes {\n\t\thashes[i] = new(chainhash.Hash)\n\t}\n\treturn hashes\n}\n\nfunc makeTxs(size int) []*btcutil.Tx {\n\tvar txs = make([]*btcutil.Tx, size)\n\tfor i := range txs {\n\t\ttx := btcutil.NewTx(wire.NewMsgTx(2))\n\t\ttx.Hash()\n\t\ttxs[i] = tx\n\t}\n\treturn txs\n}\n\n// BenchmarkRollingMerkle benches the RollingMerkleTree while varying the number\n// of leaves pushed to the tree.\nfunc BenchmarkRollingMerkle(b *testing.B) {\n\tsizes := []int{\n\t\t1000,\n\t\t2000,\n\t\t4000,\n\t\t8000,\n\t\t16000,\n\t\t32000,\n\t}\n\n\tfor _, size := range sizes {\n\t\ttxs := makeTxs(size)\n\t\tname := fmt.Sprintf(\"%d\", size)\n\t\tb.Run(name, func(b *testing.B) {\n\t\t\tbenchmarkRollingMerkle(b, txs)\n\t\t})\n\t}\n}\n\n// BenchmarkMerkle benches the BuildMerkleTreeStore while varying the number\n// of leaves pushed to the tree.\nfunc BenchmarkMerkle(b *testing.B) {\n\tsizes := []int{\n\t\t1000,\n\t\t2000,\n\t\t4000,\n\t\t8000,\n\t\t16000,\n\t\t32000,\n\t}\n\n\tfor _, size := range sizes {\n\t\ttxs := makeTxs(size)\n\t\tname := fmt.Sprintf(\"%d\", size)\n\t\tb.Run(name, func(b *testing.B) {\n\t\t\tbenchmarkMerkle(b, txs)\n\t\t})\n\t}\n}\n\nfunc benchmarkRollingMerkle(b *testing.B, txs []*btcutil.Tx) {\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tCalcMerkleRoot(txs, false)\n\t}\n}\n\nfunc benchmarkMerkle(b *testing.B, txs []*btcutil.Tx) {\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tBuildMerkleTreeStore(txs, false)\n\t}\n}\n"
  },
  {
    "path": "blockchain/notifications.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n)\n\n// NotificationType represents the type of a notification message.\ntype NotificationType int\n\n// NotificationCallback is used for a caller to provide a callback for\n// notifications about various chain events.\ntype NotificationCallback func(*Notification)\n\n// Constants for the type of a notification message.\nconst (\n\t// NTBlockAccepted indicates the associated block was accepted into\n\t// the block chain.  Note that this does not necessarily mean it was\n\t// added to the main chain.  For that, use NTBlockConnected.\n\tNTBlockAccepted NotificationType = iota\n\n\t// NTBlockConnected indicates the associated block was connected to the\n\t// main chain.\n\tNTBlockConnected\n\n\t// NTBlockDisconnected indicates the associated block was disconnected\n\t// from the main chain.\n\tNTBlockDisconnected\n)\n\n// notificationTypeStrings is a map of notification types back to their constant\n// names for pretty printing.\nvar notificationTypeStrings = map[NotificationType]string{\n\tNTBlockAccepted:     \"NTBlockAccepted\",\n\tNTBlockConnected:    \"NTBlockConnected\",\n\tNTBlockDisconnected: \"NTBlockDisconnected\",\n}\n\n// String returns the NotificationType in human-readable form.\nfunc (n NotificationType) String() string {\n\tif s, ok := notificationTypeStrings[n]; ok {\n\t\treturn s\n\t}\n\treturn fmt.Sprintf(\"Unknown Notification Type (%d)\", int(n))\n}\n\n// Notification defines notification that is sent to the caller via the callback\n// function provided during the call to New and consists of a notification type\n// as well as associated data that depends on the type as follows:\n//   - NTBlockAccepted:     *btcutil.Block\n//   - NTBlockConnected:    *btcutil.Block\n//   - NTBlockDisconnected: *btcutil.Block\ntype Notification struct {\n\tType NotificationType\n\tData interface{}\n}\n\n// Subscribe to block chain notifications. Registers a callback to be executed\n// when various events take place. See the documentation on Notification and\n// NotificationType for details on the types and contents of notifications.\nfunc (b *BlockChain) Subscribe(callback NotificationCallback) {\n\tb.notificationsLock.Lock()\n\tb.notifications = append(b.notifications, callback)\n\tb.notificationsLock.Unlock()\n}\n\n// sendNotification sends a notification with the passed type and data if the\n// caller requested notifications by providing a callback function in the call\n// to New.\nfunc (b *BlockChain) sendNotification(typ NotificationType, data interface{}) {\n\t// Generate and send the notification.\n\tn := Notification{Type: typ, Data: data}\n\tb.notificationsLock.RLock()\n\tfor _, callback := range b.notifications {\n\t\tcallback(&n)\n\t}\n\tb.notificationsLock.RUnlock()\n}\n"
  },
  {
    "path": "blockchain/notifications_test.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg\"\n)\n\n// TestNotifications ensures that notification callbacks are fired on events.\nfunc TestNotifications(t *testing.T) {\n\tblocks, err := loadBlocks(\"blk_0_to_4.dat.bz2\")\n\tif err != nil {\n\t\tt.Fatalf(\"Error loading file: %v\\n\", err)\n\t}\n\n\t// Create a new database and chain instance to run tests against.\n\tchain, teardownFunc, err := chainSetup(\"notifications\",\n\t\t&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to setup chain instance: %v\", err)\n\t}\n\tdefer teardownFunc()\n\n\tnotificationCount := 0\n\tcallback := func(notification *Notification) {\n\t\tif notification.Type == NTBlockAccepted {\n\t\t\tnotificationCount++\n\t\t}\n\t}\n\n\t// Register callback multiple times then assert it is called that many\n\t// times.\n\tconst numSubscribers = 3\n\tfor i := 0; i < numSubscribers; i++ {\n\t\tchain.Subscribe(callback)\n\t}\n\n\t_, _, err = chain.ProcessBlock(blocks[1], BFNone)\n\tif err != nil {\n\t\tt.Fatalf(\"ProcessBlock fail on block 1: %v\\n\", err)\n\t}\n\n\tif notificationCount != numSubscribers {\n\t\tt.Fatalf(\"Expected notification callback to be executed %d \"+\n\t\t\t\"times, found %d\", numSubscribers, notificationCount)\n\t}\n}\n"
  },
  {
    "path": "blockchain/process.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n)\n\n// BehaviorFlags is a bitmask defining tweaks to the normal behavior when\n// performing chain processing and consensus rules checks.\ntype BehaviorFlags uint32\n\nconst (\n\t// BFFastAdd may be set to indicate that several checks can be avoided\n\t// for the block since it is already known to fit into the chain due to\n\t// already proving it correct links into the chain up to a known\n\t// checkpoint.  This is primarily used for headers-first mode.\n\tBFFastAdd BehaviorFlags = 1 << iota\n\n\t// BFNoPoWCheck may be set to indicate the proof of work check which\n\t// ensures a block hashes to a value less than the required target will\n\t// not be performed.\n\tBFNoPoWCheck\n\n\t// BFNone is a convenience value to specifically indicate no flags.\n\tBFNone BehaviorFlags = 0\n)\n\n// blockExists determines whether a block with the given hash exists either in\n// the main chain or any side chains.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) blockExists(hash *chainhash.Hash) (bool, error) {\n\t// Check block index first (could be main chain or side chain blocks).\n\tif b.index.HaveBlock(hash) {\n\t\treturn true, nil\n\t}\n\n\t// Check in the database.\n\tvar exists bool\n\terr := b.db.View(func(dbTx database.Tx) error {\n\t\tvar err error\n\t\texists, err = dbTx.HasBlock(hash)\n\t\tif err != nil || !exists {\n\t\t\treturn err\n\t\t}\n\n\t\t// Ignore side chain blocks in the database.  This is necessary\n\t\t// because there is not currently any record of the associated\n\t\t// block index data such as its block height, so it's not yet\n\t\t// possible to efficiently load the block and do anything useful\n\t\t// with it.\n\t\t//\n\t\t// Ultimately the entire block index should be serialized\n\t\t// instead of only the current main chain so it can be consulted\n\t\t// directly.\n\t\t_, err = dbFetchHeightByHash(dbTx, hash)\n\t\tif isNotInMainChainErr(err) {\n\t\t\texists = false\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t})\n\treturn exists, err\n}\n\n// processOrphans determines if there are any orphans which depend on the passed\n// block hash (they are no longer orphans if true) and potentially accepts them.\n// It repeats the process for the newly accepted blocks (to detect further\n// orphans which may no longer be orphans) until there are no more.\n//\n// The flags do not modify the behavior of this function directly, however they\n// are needed to pass along to maybeAcceptBlock.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) processOrphans(hash *chainhash.Hash, flags BehaviorFlags) error {\n\t// Start with processing at least the passed hash.  Leave a little room\n\t// for additional orphan blocks that need to be processed without\n\t// needing to grow the array in the common case.\n\tprocessHashes := make([]*chainhash.Hash, 0, 10)\n\tprocessHashes = append(processHashes, hash)\n\tfor len(processHashes) > 0 {\n\t\t// Pop the first hash to process from the slice.\n\t\tprocessHash := processHashes[0]\n\t\tprocessHashes[0] = nil // Prevent GC leak.\n\t\tprocessHashes = processHashes[1:]\n\n\t\t// Look up all orphans that are parented by the block we just\n\t\t// accepted.  This will typically only be one, but it could\n\t\t// be multiple if multiple blocks are mined and broadcast\n\t\t// around the same time.  The one with the most proof of work\n\t\t// will eventually win out.  An indexing for loop is\n\t\t// intentionally used over a range here as range does not\n\t\t// reevaluate the slice on each iteration nor does it adjust the\n\t\t// index for the modified slice.\n\t\tfor i := 0; i < len(b.prevOrphans[*processHash]); i++ {\n\t\t\torphan := b.prevOrphans[*processHash][i]\n\t\t\tif orphan == nil {\n\t\t\t\tlog.Warnf(\"Found a nil entry at index %d in the \"+\n\t\t\t\t\t\"orphan dependency list for block %v\", i,\n\t\t\t\t\tprocessHash)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Remove the orphan from the orphan pool.\n\t\t\torphanHash := orphan.block.Hash()\n\t\t\tb.removeOrphanBlock(orphan)\n\t\t\ti--\n\n\t\t\t// Potentially accept the block into the block chain.\n\t\t\t_, err := b.maybeAcceptBlock(orphan.block, flags)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Add this block to the list of blocks to process so\n\t\t\t// any orphan blocks that depend on this block are\n\t\t\t// handled too.\n\t\t\tprocessHashes = append(processHashes, orphanHash)\n\t\t}\n\t}\n\treturn nil\n}\n\n// ProcessBlock is the main workhorse for handling insertion of new blocks into\n// the block chain.  It includes functionality such as rejecting duplicate\n// blocks, ensuring blocks follow all rules, orphan handling, and insertion into\n// the block chain along with best chain selection and reorganization.\n//\n// When no errors occurred during processing, the first return value indicates\n// whether or not the block is on the main chain and the second indicates\n// whether or not the block is an orphan.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) ProcessBlock(block *btcutil.Block, flags BehaviorFlags) (bool, bool, error) {\n\tb.chainLock.Lock()\n\tdefer b.chainLock.Unlock()\n\n\tfastAdd := flags&BFFastAdd == BFFastAdd\n\n\tblockHash := block.Hash()\n\tlog.Tracef(\"Processing block %v\", blockHash)\n\n\t// The block must not already exist in the main chain or side chains.\n\texists, err := b.blockExists(blockHash)\n\tif err != nil {\n\t\treturn false, false, err\n\t}\n\tif exists {\n\t\tstr := fmt.Sprintf(\"already have block %v\", blockHash)\n\t\treturn false, false, ruleError(ErrDuplicateBlock, str)\n\t}\n\n\t// The block must not already exist as an orphan.\n\tif _, exists := b.orphans[*blockHash]; exists {\n\t\tstr := fmt.Sprintf(\"already have block (orphan) %v\", blockHash)\n\t\treturn false, false, ruleError(ErrDuplicateBlock, str)\n\t}\n\n\t// Perform preliminary sanity checks on the block and its transactions.\n\terr = checkBlockSanity(block, b.chainParams.PowLimit, b.timeSource, flags)\n\tif err != nil {\n\t\treturn false, false, err\n\t}\n\n\t// Find the previous checkpoint and perform some additional checks based\n\t// on the checkpoint.  This provides a few nice properties such as\n\t// preventing old side chain blocks before the last checkpoint,\n\t// rejecting easy to mine, but otherwise bogus, blocks that could be\n\t// used to eat memory, and ensuring expected (versus claimed) proof of\n\t// work requirements since the previous checkpoint are met.\n\tblockHeader := &block.MsgBlock().Header\n\tcheckpointNode, err := b.findPreviousCheckpoint()\n\tif err != nil {\n\t\treturn false, false, err\n\t}\n\tif checkpointNode != nil {\n\t\t// Ensure the block timestamp is after the checkpoint timestamp.\n\t\tcheckpointTime := time.Unix(checkpointNode.timestamp, 0)\n\t\tif blockHeader.Timestamp.Before(checkpointTime) {\n\t\t\tstr := fmt.Sprintf(\"block %v has timestamp %v before \"+\n\t\t\t\t\"last checkpoint timestamp %v\", blockHash,\n\t\t\t\tblockHeader.Timestamp, checkpointTime)\n\t\t\treturn false, false, ruleError(ErrCheckpointTimeTooOld, str)\n\t\t}\n\t\tif !fastAdd {\n\t\t\t// Even though the checks prior to now have already ensured the\n\t\t\t// proof of work exceeds the claimed amount, the claimed amount\n\t\t\t// is a field in the block header which could be forged.  This\n\t\t\t// check ensures the proof of work is at least the minimum\n\t\t\t// expected based on elapsed time since the last checkpoint and\n\t\t\t// maximum adjustment allowed by the retarget rules.\n\t\t\tduration := blockHeader.Timestamp.Sub(checkpointTime)\n\t\t\trequiredTarget := CompactToBig(b.calcEasiestDifficulty(\n\t\t\t\tcheckpointNode.bits, duration))\n\t\t\tcurrentTarget := CompactToBig(blockHeader.Bits)\n\t\t\tif currentTarget.Cmp(requiredTarget) > 0 {\n\t\t\t\tstr := fmt.Sprintf(\"block target difficulty of %064x \"+\n\t\t\t\t\t\"is too low when compared to the previous \"+\n\t\t\t\t\t\"checkpoint\", currentTarget)\n\t\t\t\treturn false, false, ruleError(ErrDifficultyTooLow, str)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Handle orphan blocks.\n\tprevHash := &blockHeader.PrevBlock\n\tprevHashExists, err := b.blockExists(prevHash)\n\tif err != nil {\n\t\treturn false, false, err\n\t}\n\tif !prevHashExists {\n\t\tlog.Infof(\"Adding orphan block %v with parent %v\", blockHash, prevHash)\n\t\tb.addOrphanBlock(block)\n\n\t\treturn false, true, nil\n\t}\n\n\t// The block has passed all context independent checks and appears sane\n\t// enough to potentially accept it into the block chain.\n\tisMainChain, err := b.maybeAcceptBlock(block, flags)\n\tif err != nil {\n\t\treturn false, false, err\n\t}\n\n\t// Accept any orphan blocks that depend on this block (they are\n\t// no longer orphans) and repeat for those accepted blocks until\n\t// there are no more.\n\terr = b.processOrphans(blockHash, flags)\n\tif err != nil {\n\t\treturn false, false, err\n\t}\n\n\tlog.Debugf(\"Accepted block %v\", blockHash)\n\n\treturn isMainChain, false, nil\n}\n"
  },
  {
    "path": "blockchain/rolling_merkle.go",
    "content": "package blockchain\n\nimport (\n\t\"math/bits\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// rollingMerkleTreeStore calculates the merkle root by only allocating O(logN)\n// memory where N is the total amount of leaves being included in the tree.\ntype rollingMerkleTreeStore struct {\n\t// roots are where the temporary merkle roots get stored while the\n\t// merkle root is being calculated.\n\troots []chainhash.Hash\n\n\t// numLeaves is the total leaves the store has processed.  numLeaves\n\t// is required for the root calculation algorithm to work.\n\tnumLeaves uint64\n}\n\n// newRollingMerkleTreeStore returns a rollingMerkleTreeStore with the roots\n// allocated based on the passed in size.\n//\n// NOTE: If more elements are added in than the passed in size, there will be\n// additional allocations which in turn hurts performance.\nfunc newRollingMerkleTreeStore(size uint64) rollingMerkleTreeStore {\n\tvar alloc int\n\tif size != 0 {\n\t\talloc = bits.Len64(size - 1)\n\t}\n\treturn rollingMerkleTreeStore{roots: make([]chainhash.Hash, 0, alloc)}\n}\n\n// add adds a single hash to the merkle tree store.  Refer to algorithm 1 \"AddOne\" in\n// the utreexo paper (https://eprint.iacr.org/2019/611.pdf) for the exact algorithm.\nfunc (s *rollingMerkleTreeStore) add(add chainhash.Hash) {\n\t// We can tell where the roots are by looking at the binary representation\n\t// of the numLeaves.  Wherever there's a 1, there's a root.\n\t//\n\t// numLeaves of 8 will be '1000' in binary, so there will be one root at\n\t// row 3. numLeaves of 3 will be '11' in binary, so there's two roots.  One at\n\t// row 0 and one at row 1.  Row 0 is the leaf row.\n\t//\n\t// In this loop below, we're looking for these roots by checking if there's\n\t// a '1', starting from the LSB.  If there is a '1', we'll hash the root being\n\t// added with that root until we hit a '0'.\n\tnewRoot := add\n\tfor h := uint8(0); (s.numLeaves>>h)&1 == 1; h++ {\n\t\t// Pop off the last root.\n\t\tvar root chainhash.Hash\n\t\troot, s.roots = s.roots[len(s.roots)-1], s.roots[:len(s.roots)-1]\n\n\t\t// Calculate the hash of the new root and append it.\n\t\tnewRoot = HashMerkleBranches(&root, &newRoot)\n\t}\n\ts.roots = append(s.roots, newRoot)\n\ts.numLeaves++\n}\n\n// calcMerkleRoot returns the merkle root for the passed in transactions.\nfunc (s *rollingMerkleTreeStore) calcMerkleRoot(adds []*btcutil.Tx, witness bool) chainhash.Hash {\n\tfor i := range adds {\n\t\t// If we're computing a witness merkle root, instead of the\n\t\t// regular txid, we use the modified wtxid which includes a\n\t\t// transaction's witness data within the digest.  Additionally,\n\t\t// the coinbase's wtxid is all zeroes.\n\t\tswitch {\n\t\tcase witness && i == 0:\n\t\t\tvar zeroHash chainhash.Hash\n\t\t\ts.add(zeroHash)\n\t\tcase witness:\n\t\t\ts.add(*adds[i].WitnessHash())\n\t\tdefault:\n\t\t\ts.add(*adds[i].Hash())\n\t\t}\n\t}\n\n\t// If we only have one leaf, then the hash of that tx is the merkle root.\n\tif s.numLeaves == 1 {\n\t\treturn s.roots[0]\n\t}\n\n\t// Add on the last tx again if there's an odd number of txs.\n\tif len(adds) > 0 && len(adds)%2 != 0 {\n\t\tswitch {\n\t\tcase witness:\n\t\t\ts.add(*adds[len(adds)-1].WitnessHash())\n\t\tdefault:\n\t\t\ts.add(*adds[len(adds)-1].Hash())\n\t\t}\n\t}\n\n\t// If we still have more than 1 root after adding on the last tx again,\n\t// we need to do the same for the upper rows.\n\t//\n\t// For example, the below tree has 6 leaves.  For row 1, you'll need to\n\t// hash 'F' with itself to create 'C' so you have something to hash with\n\t// 'B'.  For bigger trees we may need to do the same in rows 2 or 3 as\n\t// well.\n\t//\n\t// row :3         A\n\t//              /   \\\n\t// row :2     B       C\n\t//           / \\     / \\\n\t// row :1   D   E   F   F\n\t//         / \\ / \\ / \\\n\t// row :0  1 2 3 4 5 6\n\tfor len(s.roots) > 1 {\n\t\t// If we have to keep adding the last node in the set, bitshift\n\t\t// the num leaves right by 1.  This effectively moves the row up\n\t\t// for calculation.  We do this until we reach a row where there's\n\t\t// an odd number of leaves.\n\t\t//\n\t\t// row :3         A\n\t\t//              /   \\\n\t\t// row :2     B       C        D\n\t\t//           / \\     / \\     /   \\\n\t\t// row :1   E   F   G   H   I     J\n\t\t//         / \\ / \\ / \\ / \\ / \\   / \\\n\t\t// row :0  1 2 3 4 5 6 7 8 9 10 11 12\n\t\t//\n\t\t// In the above tree, 12 leaves were added and there's an odd amount\n\t\t// of leaves at row 2.  Because of this, we'll bitshift right twice.\n\t\tcurrentLeaves := s.numLeaves\n\t\tfor h := uint8(0); (currentLeaves>>h)&1 == 0; h++ {\n\t\t\ts.numLeaves >>= 1\n\t\t}\n\n\t\t// Add the last root again so that it'll get hashed with itself.\n\t\th := s.roots[len(s.roots)-1]\n\t\ts.add(h)\n\t}\n\n\treturn s.roots[0]\n}\n"
  },
  {
    "path": "blockchain/rolling_merkle_test.go",
    "content": "package blockchain\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestRollingMerkleAdd(t *testing.T) {\n\ttests := []struct {\n\t\tleaves            []chainhash.Hash\n\t\texpectedRoots     []chainhash.Hash\n\t\texpectedNumLeaves uint64\n\t}{\n\t\t// 00  (00 is also a root)\n\t\t{\n\t\t\tleaves: []chainhash.Hash{\n\t\t\t\t{0x00},\n\t\t\t},\n\t\t\texpectedRoots: []chainhash.Hash{\n\t\t\t\t{0x00},\n\t\t\t},\n\t\t\texpectedNumLeaves: 1,\n\t\t},\n\n\t\t// root\n\t\t// |---\\\n\t\t// 00  01\n\t\t{\n\t\t\tleaves: []chainhash.Hash{\n\t\t\t\t{0x00},\n\t\t\t\t{0x01},\n\t\t\t},\n\t\t\texpectedRoots: []chainhash.Hash{\n\t\t\t\tfunc() chainhash.Hash {\n\t\t\t\t\thash, err := chainhash.NewHashFromStr(\n\t\t\t\t\t\t\"c2bf026e62af95cd\" +\n\t\t\t\t\t\t\t\"7b785e2cd5a5f1ec\" +\n\t\t\t\t\t\t\t\"01fafda85886a8eb\" +\n\t\t\t\t\t\t\t\"d34482c0b05dc2c2\")\n\t\t\t\t\trequire.NoError(t, err)\n\t\t\t\t\treturn *hash\n\t\t\t\t}(),\n\t\t\t},\n\t\t\texpectedNumLeaves: 2,\n\t\t},\n\n\t\t// root\n\t\t// |---\\\n\t\t// 00  01  02\n\t\t{\n\t\t\tleaves: []chainhash.Hash{\n\t\t\t\t{0x00},\n\t\t\t\t{0x01},\n\t\t\t\t{0x02},\n\t\t\t},\n\t\t\texpectedRoots: []chainhash.Hash{\n\t\t\t\tfunc() chainhash.Hash {\n\t\t\t\t\thash, err := chainhash.NewHashFromStr(\n\t\t\t\t\t\t\"c2bf026e62af95cd\" +\n\t\t\t\t\t\t\t\"7b785e2cd5a5f1ec\" +\n\t\t\t\t\t\t\t\"01fafda85886a8eb\" +\n\t\t\t\t\t\t\t\"d34482c0b05dc2c2\")\n\t\t\t\t\trequire.NoError(t, err)\n\t\t\t\t\treturn *hash\n\t\t\t\t}(),\n\t\t\t\t{0x02},\n\t\t\t},\n\t\t\texpectedNumLeaves: 3,\n\t\t},\n\n\t\t// root\n\t\t// |-------\\\n\t\t// br      br\n\t\t// |---\\   |---\\\n\t\t// 00  01  02  03\n\t\t{\n\t\t\tleaves: []chainhash.Hash{\n\t\t\t\t{0x00},\n\t\t\t\t{0x01},\n\t\t\t\t{0x02},\n\t\t\t\t{0x03},\n\t\t\t},\n\t\t\texpectedRoots: []chainhash.Hash{\n\t\t\t\tfunc() chainhash.Hash {\n\t\t\t\t\thash, err := chainhash.NewHashFromStr(\n\t\t\t\t\t\t\"270714425ea73eb8\" +\n\t\t\t\t\t\t\t\"5942f0f705788f25\" +\n\t\t\t\t\t\t\t\"1fefa3f533410a3f\" +\n\t\t\t\t\t\t\t\"338de46e641082c4\")\n\t\t\t\t\trequire.NoError(t, err)\n\t\t\t\t\treturn *hash\n\t\t\t\t}(),\n\t\t\t},\n\t\t\texpectedNumLeaves: 4,\n\t\t},\n\n\t\t// root\n\t\t// |-------\\\n\t\t// br      br\n\t\t// |---\\   |---\\\n\t\t// 00  01  02  03  04\n\t\t{\n\t\t\tleaves: []chainhash.Hash{\n\t\t\t\t{0x00},\n\t\t\t\t{0x01},\n\t\t\t\t{0x02},\n\t\t\t\t{0x03},\n\t\t\t\t{0x04},\n\t\t\t},\n\t\t\texpectedRoots: []chainhash.Hash{\n\t\t\t\tfunc() chainhash.Hash {\n\t\t\t\t\thash, err := chainhash.NewHashFromStr(\n\t\t\t\t\t\t\"270714425ea73eb8\" +\n\t\t\t\t\t\t\t\"5942f0f705788f25\" +\n\t\t\t\t\t\t\t\"1fefa3f533410a3f\" +\n\t\t\t\t\t\t\t\"338de46e641082c4\")\n\t\t\t\t\trequire.NoError(t, err)\n\t\t\t\t\treturn *hash\n\t\t\t\t}(),\n\t\t\t\t{0x04},\n\t\t\t},\n\t\t\texpectedNumLeaves: 5,\n\t\t},\n\n\t\t// root\n\t\t// |-------\\\n\t\t// br      br      root\n\t\t// |---\\   |---\\   |---\\\n\t\t// 00  01  02  03  04  05\n\t\t{\n\t\t\tleaves: []chainhash.Hash{\n\t\t\t\t{0x00},\n\t\t\t\t{0x01},\n\t\t\t\t{0x02},\n\t\t\t\t{0x03},\n\t\t\t\t{0x04},\n\t\t\t\t{0x05},\n\t\t\t},\n\t\t\texpectedRoots: []chainhash.Hash{\n\t\t\t\tfunc() chainhash.Hash {\n\t\t\t\t\thash, err := chainhash.NewHashFromStr(\n\t\t\t\t\t\t\"270714425ea73eb8\" +\n\t\t\t\t\t\t\t\"5942f0f705788f25\" +\n\t\t\t\t\t\t\t\"1fefa3f533410a3f\" +\n\t\t\t\t\t\t\t\"338de46e641082c4\")\n\t\t\t\t\trequire.NoError(t, err)\n\t\t\t\t\treturn *hash\n\t\t\t\t}(),\n\t\t\t\tfunc() chainhash.Hash {\n\t\t\t\t\thash, err := chainhash.NewHashFromStr(\n\t\t\t\t\t\t\"e5c2407ba454ffeb\" +\n\t\t\t\t\t\t\t\"28cf0c50c5c293a8\" +\n\t\t\t\t\t\t\t\"4c9a75788f8a8f35\" +\n\t\t\t\t\t\t\t\"ccb974e606280377\")\n\t\t\t\t\trequire.NoError(t, err)\n\t\t\t\t\treturn *hash\n\t\t\t\t}(),\n\t\t\t},\n\t\t\texpectedNumLeaves: 6,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\ts := newRollingMerkleTreeStore(uint64(len(test.leaves)))\n\t\tfor _, leaf := range test.leaves {\n\t\t\ts.add(leaf)\n\t\t}\n\n\t\trequire.Equal(t, s.roots, test.expectedRoots)\n\t\trequire.Equal(t, s.numLeaves, test.expectedNumLeaves)\n\t}\n}\n"
  },
  {
    "path": "blockchain/scriptval.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"runtime\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// txValidateItem holds a transaction along with which input to validate.\ntype txValidateItem struct {\n\ttxInIndex int\n\ttxIn      *wire.TxIn\n\ttx        *btcutil.Tx\n\tsigHashes *txscript.TxSigHashes\n}\n\n// txValidator provides a type which asynchronously validates transaction\n// inputs.  It provides several channels for communication and a processing\n// function that is intended to be in run multiple goroutines.\ntype txValidator struct {\n\tvalidateChan chan *txValidateItem\n\tquitChan     chan struct{}\n\tresultChan   chan error\n\tutxoView     *UtxoViewpoint\n\tflags        txscript.ScriptFlags\n\tsigCache     *txscript.SigCache\n\thashCache    *txscript.HashCache\n}\n\n// sendResult sends the result of a script pair validation on the internal\n// result channel while respecting the quit channel.  This allows orderly\n// shutdown when the validation process is aborted early due to a validation\n// error in one of the other goroutines.\nfunc (v *txValidator) sendResult(result error) {\n\tselect {\n\tcase v.resultChan <- result:\n\tcase <-v.quitChan:\n\t}\n}\n\n// validateHandler consumes items to validate from the internal validate channel\n// and returns the result of the validation on the internal result channel. It\n// must be run as a goroutine.\nfunc (v *txValidator) validateHandler() {\nout:\n\tfor {\n\t\tselect {\n\t\tcase txVI := <-v.validateChan:\n\t\t\t// Ensure the referenced input utxo is available.\n\t\t\ttxIn := txVI.txIn\n\t\t\tutxo := v.utxoView.LookupEntry(txIn.PreviousOutPoint)\n\t\t\tif utxo == nil {\n\t\t\t\tstr := fmt.Sprintf(\"unable to find unspent \"+\n\t\t\t\t\t\"output %v referenced from \"+\n\t\t\t\t\t\"transaction %s:%d\",\n\t\t\t\t\ttxIn.PreviousOutPoint, txVI.tx.Hash(),\n\t\t\t\t\ttxVI.txInIndex)\n\t\t\t\terr := ruleError(ErrMissingTxOut, str)\n\t\t\t\tv.sendResult(err)\n\t\t\t\tbreak out\n\t\t\t}\n\n\t\t\t// Create a new script engine for the script pair.\n\t\t\tsigScript := txIn.SignatureScript\n\t\t\twitness := txIn.Witness\n\t\t\tpkScript := utxo.PkScript()\n\t\t\tinputAmount := utxo.Amount()\n\t\t\tvm, err := txscript.NewEngine(\n\t\t\t\tpkScript, txVI.tx.MsgTx(), txVI.txInIndex,\n\t\t\t\tv.flags, v.sigCache, txVI.sigHashes,\n\t\t\t\tinputAmount, v.utxoView,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tstr := fmt.Sprintf(\"failed to parse input \"+\n\t\t\t\t\t\"%s:%d which references output %v - \"+\n\t\t\t\t\t\"%v (input witness %x, input script \"+\n\t\t\t\t\t\"bytes %x, prev output script bytes %x)\",\n\t\t\t\t\ttxVI.tx.Hash(), txVI.txInIndex,\n\t\t\t\t\ttxIn.PreviousOutPoint, err, witness,\n\t\t\t\t\tsigScript, pkScript)\n\t\t\t\terr := ruleError(ErrScriptMalformed, str)\n\t\t\t\tv.sendResult(err)\n\t\t\t\tbreak out\n\t\t\t}\n\n\t\t\t// Execute the script pair.\n\t\t\tif err := vm.Execute(); err != nil {\n\t\t\t\tstr := fmt.Sprintf(\"failed to validate input \"+\n\t\t\t\t\t\"%s:%d which references output %v - \"+\n\t\t\t\t\t\"%v (input witness %x, input script \"+\n\t\t\t\t\t\"bytes %x, prev output script bytes %x)\",\n\t\t\t\t\ttxVI.tx.Hash(), txVI.txInIndex,\n\t\t\t\t\ttxIn.PreviousOutPoint, err, witness,\n\t\t\t\t\tsigScript, pkScript)\n\t\t\t\terr := ruleError(ErrScriptValidation, str)\n\t\t\t\tv.sendResult(err)\n\t\t\t\tbreak out\n\t\t\t}\n\n\t\t\t// Validation succeeded.\n\t\t\tv.sendResult(nil)\n\n\t\tcase <-v.quitChan:\n\t\t\tbreak out\n\t\t}\n\t}\n}\n\n// Validate validates the scripts for all of the passed transaction inputs using\n// multiple goroutines.\nfunc (v *txValidator) Validate(items []*txValidateItem) error {\n\tif len(items) == 0 {\n\t\treturn nil\n\t}\n\n\t// Limit the number of goroutines to do script validation based on the\n\t// number of processor cores.  This helps ensure the system stays\n\t// reasonably responsive under heavy load.\n\tmaxGoRoutines := runtime.NumCPU() * 3\n\tif maxGoRoutines <= 0 {\n\t\tmaxGoRoutines = 1\n\t}\n\tif maxGoRoutines > len(items) {\n\t\tmaxGoRoutines = len(items)\n\t}\n\n\t// Start up validation handlers that are used to asynchronously\n\t// validate each transaction input.\n\tfor i := 0; i < maxGoRoutines; i++ {\n\t\tgo v.validateHandler()\n\t}\n\n\t// Validate each of the inputs.  The quit channel is closed when any\n\t// errors occur so all processing goroutines exit regardless of which\n\t// input had the validation error.\n\tnumInputs := len(items)\n\tcurrentItem := 0\n\tprocessedItems := 0\n\tfor processedItems < numInputs {\n\t\t// Only send items while there are still items that need to\n\t\t// be processed.  The select statement will never select a nil\n\t\t// channel.\n\t\tvar validateChan chan *txValidateItem\n\t\tvar item *txValidateItem\n\t\tif currentItem < numInputs {\n\t\t\tvalidateChan = v.validateChan\n\t\t\titem = items[currentItem]\n\t\t}\n\n\t\tselect {\n\t\tcase validateChan <- item:\n\t\t\tcurrentItem++\n\n\t\tcase err := <-v.resultChan:\n\t\t\tprocessedItems++\n\t\t\tif err != nil {\n\t\t\t\tclose(v.quitChan)\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\tclose(v.quitChan)\n\treturn nil\n}\n\n// newTxValidator returns a new instance of txValidator to be used for\n// validating transaction scripts asynchronously.\nfunc newTxValidator(utxoView *UtxoViewpoint, flags txscript.ScriptFlags,\n\tsigCache *txscript.SigCache, hashCache *txscript.HashCache) *txValidator {\n\treturn &txValidator{\n\t\tvalidateChan: make(chan *txValidateItem),\n\t\tquitChan:     make(chan struct{}),\n\t\tresultChan:   make(chan error),\n\t\tutxoView:     utxoView,\n\t\tsigCache:     sigCache,\n\t\thashCache:    hashCache,\n\t\tflags:        flags,\n\t}\n}\n\n// ValidateTransactionScripts validates the scripts for the passed transaction\n// using multiple goroutines.\nfunc ValidateTransactionScripts(tx *btcutil.Tx, utxoView *UtxoViewpoint,\n\tflags txscript.ScriptFlags, sigCache *txscript.SigCache,\n\thashCache *txscript.HashCache) error {\n\n\t// First determine if segwit is active according to the scriptFlags. If\n\t// it isn't then we don't need to interact with the HashCache.\n\tsegwitActive := flags&txscript.ScriptVerifyWitness == txscript.ScriptVerifyWitness\n\n\t// If the hashcache doesn't yet has the sighash midstate for this\n\t// transaction, then we'll compute them now so we can re-use them\n\t// amongst all worker validation goroutines.\n\tif segwitActive && tx.MsgTx().HasWitness() &&\n\t\t!hashCache.ContainsHashes(tx.Hash()) {\n\t\thashCache.AddSigHashes(tx.MsgTx(), utxoView)\n\t}\n\n\tvar cachedHashes *txscript.TxSigHashes\n\tif segwitActive && tx.MsgTx().HasWitness() {\n\t\t// The same pointer to the transaction's sighash midstate will\n\t\t// be re-used amongst all validation goroutines. By\n\t\t// pre-computing the sighash here instead of during validation,\n\t\t// we ensure the sighashes\n\t\t// are only computed once.\n\t\tcachedHashes, _ = hashCache.GetSigHashes(tx.Hash())\n\t}\n\n\t// Collect all of the transaction inputs and required information for\n\t// validation.\n\ttxIns := tx.MsgTx().TxIn\n\ttxValItems := make([]*txValidateItem, 0, len(txIns))\n\tfor txInIdx, txIn := range txIns {\n\t\t// Skip coinbases.\n\t\tif txIn.PreviousOutPoint.Index == math.MaxUint32 {\n\t\t\tcontinue\n\t\t}\n\n\t\ttxVI := &txValidateItem{\n\t\t\ttxInIndex: txInIdx,\n\t\t\ttxIn:      txIn,\n\t\t\ttx:        tx,\n\t\t\tsigHashes: cachedHashes,\n\t\t}\n\t\ttxValItems = append(txValItems, txVI)\n\t}\n\n\t// Validate all of the inputs.\n\tvalidator := newTxValidator(utxoView, flags, sigCache, hashCache)\n\treturn validator.Validate(txValItems)\n}\n\n// checkBlockScripts executes and validates the scripts for all transactions in\n// the passed block using multiple goroutines.\nfunc checkBlockScripts(block *btcutil.Block, utxoView *UtxoViewpoint,\n\tscriptFlags txscript.ScriptFlags, sigCache *txscript.SigCache,\n\thashCache *txscript.HashCache) error {\n\n\t// First determine if segwit is active according to the scriptFlags. If\n\t// it isn't then we don't need to interact with the HashCache.\n\tsegwitActive := scriptFlags&txscript.ScriptVerifyWitness == txscript.ScriptVerifyWitness\n\n\t// Collect all of the transaction inputs and required information for\n\t// validation for all transactions in the block into a single slice.\n\tnumInputs := 0\n\tfor _, tx := range block.Transactions() {\n\t\tnumInputs += len(tx.MsgTx().TxIn)\n\t}\n\ttxValItems := make([]*txValidateItem, 0, numInputs)\n\tfor _, tx := range block.Transactions() {\n\t\thash := tx.Hash()\n\n\t\t// If the HashCache is present, and it doesn't yet contain the\n\t\t// partial sighashes for this transaction, then we add the\n\t\t// sighashes for the transaction. This allows us to take\n\t\t// advantage of the potential speed savings due to the new\n\t\t// digest algorithm (BIP0143).\n\t\tif segwitActive && tx.HasWitness() && hashCache != nil &&\n\t\t\t!hashCache.ContainsHashes(hash) {\n\n\t\t\thashCache.AddSigHashes(tx.MsgTx(), utxoView)\n\t\t}\n\n\t\tvar cachedHashes *txscript.TxSigHashes\n\t\tif segwitActive && tx.HasWitness() {\n\t\t\tif hashCache != nil {\n\t\t\t\tcachedHashes, _ = hashCache.GetSigHashes(hash)\n\t\t\t} else {\n\t\t\t\tcachedHashes = txscript.NewTxSigHashes(\n\t\t\t\t\ttx.MsgTx(), utxoView,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tfor txInIdx, txIn := range tx.MsgTx().TxIn {\n\t\t\t// Skip coinbases.\n\t\t\tif txIn.PreviousOutPoint.Index == math.MaxUint32 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttxVI := &txValidateItem{\n\t\t\t\ttxInIndex: txInIdx,\n\t\t\t\ttxIn:      txIn,\n\t\t\t\ttx:        tx,\n\t\t\t\tsigHashes: cachedHashes,\n\t\t\t}\n\t\t\ttxValItems = append(txValItems, txVI)\n\t\t}\n\t}\n\n\t// Validate all of the inputs.\n\tvalidator := newTxValidator(utxoView, scriptFlags, sigCache, hashCache)\n\tstart := time.Now()\n\tif err := validator.Validate(txValItems); err != nil {\n\t\treturn err\n\t}\n\telapsed := time.Since(start)\n\n\tlog.Tracef(\"block %v took %v to verify\", block.Hash(), elapsed)\n\n\t// If the HashCache is present, once we have validated the block, we no\n\t// longer need the cached hashes for these transactions, so we purge\n\t// them from the cache.\n\tif segwitActive && hashCache != nil {\n\t\tfor _, tx := range block.Transactions() {\n\t\t\tif tx.MsgTx().HasWitness() {\n\t\t\t\thashCache.PurgeSigHashes(tx.Hash())\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "blockchain/scriptval_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/txscript\"\n)\n\n// TestCheckBlockScripts ensures that validating the all of the scripts in a\n// known-good block doesn't return an error.\nfunc TestCheckBlockScripts(t *testing.T) {\n\ttestBlockNum := 277647\n\tblockDataFile := fmt.Sprintf(\"%d.dat.bz2\", testBlockNum)\n\tblocks, err := loadBlocks(blockDataFile)\n\tif err != nil {\n\t\tt.Errorf(\"Error loading file: %v\\n\", err)\n\t\treturn\n\t}\n\tif len(blocks) > 1 {\n\t\tt.Errorf(\"The test block file must only have one block in it\")\n\t\treturn\n\t}\n\tif len(blocks) == 0 {\n\t\tt.Errorf(\"The test block file may not be empty\")\n\t\treturn\n\t}\n\n\tstoreDataFile := fmt.Sprintf(\"%d.utxostore.bz2\", testBlockNum)\n\tview, err := loadUtxoView(storeDataFile)\n\tif err != nil {\n\t\tt.Errorf(\"Error loading txstore: %v\\n\", err)\n\t\treturn\n\t}\n\n\tscriptFlags := txscript.ScriptBip16\n\terr = checkBlockScripts(blocks[0], view, scriptFlags, nil, nil)\n\tif err != nil {\n\t\tt.Errorf(\"Transaction script validation failed: %v\\n\", err)\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "blockchain/sizehelper.go",
    "content": "// Copyright (c) 2023 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\npackage blockchain\n\nimport (\n\t\"math\"\n)\n\n// These constants are related to bitcoin.\nconst (\n\t// outpointSize is the size of an outpoint.\n\t//\n\t// This value is calculated by running the following:\n\t//\tunsafe.Sizeof(wire.OutPoint{})\n\toutpointSize = 36\n\n\t// uint64Size is the size of an uint64 allocated in memory.\n\tuint64Size = 8\n\n\t// bucketSize is the size of the bucket in the cache map.  Exact\n\t// calculation is (16 + keysize*8 + valuesize*8) where for the map of:\n\t// map[wire.OutPoint]*UtxoEntry would have a keysize=36 and valuesize=8.\n\t//\n\t// https://github.com/golang/go/issues/34561#issuecomment-536115805\n\tbucketSize = 16 + uint64Size*outpointSize + uint64Size*uint64Size\n\n\t// This value is calculated by running the following on a 64-bit system:\n\t//   unsafe.Sizeof(UtxoEntry{})\n\tbaseEntrySize = 40\n\n\t// pubKeyHashLen is the length of a P2PKH script.\n\tpubKeyHashLen = 25\n\n\t// avgEntrySize is how much each entry we expect it to be.  Since most\n\t// txs are p2pkh, we can assume the entry to be more or less the size\n\t// of a p2pkh tx.  We add on 7 to make it 32 since 64 bit systems will\n\t// align by 8 bytes.\n\tavgEntrySize = baseEntrySize + (pubKeyHashLen + 7)\n)\n\n// The code here is shamelessly taken from the go runtime package.  All the relevant\n// code and variables are copied to here.  These values are only correct for a 64 bit\n// system.\n\nconst (\n\t_MaxSmallSize   = 32768\n\tsmallSizeDiv    = 8\n\tsmallSizeMax    = 1024\n\tlargeSizeDiv    = 128\n\t_NumSizeClasses = 68\n\t_PageShift      = 13\n\t_PageSize       = 1 << _PageShift\n\n\tMaxUintptr = ^uintptr(0)\n\n\t// Maximum number of key/elem pairs a bucket can hold.\n\tbucketCntBits = 3\n\tbucketCnt     = 1 << bucketCntBits\n\n\t// Maximum average load of a bucket that triggers growth is 6.5.\n\t// Represent as loadFactorNum/loadFactorDen, to allow integer math.\n\tloadFactorNum = 13\n\tloadFactorDen = 2\n\n\t// _64bit = 1 on 64-bit systems, 0 on 32-bit systems\n\t_64bit = 1 << (^uintptr(0) >> 63) / 2\n\n\t// PtrSize is the size of a pointer in bytes - unsafe.Sizeof(uintptr(0))\n\t// but as an ideal constant. It is also the size of the machine's native\n\t// word size (that is, 4 on 32-bit systems, 8 on 64-bit).\n\tPtrSize = 4 << (^uintptr(0) >> 63)\n\n\t// heapAddrBits is the number of bits in a heap address that's actually\n\t// available for memory allocation.\n\t//\n\t// NOTE (guggero): For 64-bit systems, we just assume 40 bits of address\n\t// space available, as that seems to be the lowest common denominator.\n\t// See heapAddrBits in runtime/malloc.go of the standard library for\n\t// more details\n\theapAddrBits = 32 + (_64bit * 8)\n\n\t// maxAlloc is the maximum size of an allocation on the heap.\n\t//\n\t// NOTE(guggero): With the somewhat simplified heapAddrBits calculation\n\t// above, this will currently limit the maximum allocation size of the\n\t// UTXO cache to around 300GiB on 64-bit systems. This should be more\n\t// than enough for the foreseeable future, but if we ever need to\n\t// increase it, we should probably use the same calculation as the\n\t// standard library.\n\tmaxAlloc = (1 << heapAddrBits) - (1-_64bit)*1\n)\n\nvar class_to_size = [_NumSizeClasses]uint16{0, 8, 16, 24, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896, 1024, 1152, 1280, 1408, 1536, 1792, 2048, 2304, 2688, 3072, 3200, 3456, 4096, 4864, 5376, 6144, 6528, 6784, 6912, 8192, 9472, 9728, 10240, 10880, 12288, 13568, 14336, 16384, 18432, 19072, 20480, 21760, 24576, 27264, 28672, 32768}\nvar size_to_class8 = [smallSizeMax/smallSizeDiv + 1]uint8{0, 1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}\nvar size_to_class128 = [(_MaxSmallSize-smallSizeMax)/largeSizeDiv + 1]uint8{32, 33, 34, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 48, 48, 48, 49, 49, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67}\n\n// calculateRoughMapSize returns a close enough estimate of the\n// total memory allocated by a map.\n// hint should be the same value as the number you give when\n// making a map with the following syntax: make(map[k]v, hint)\n//\n// bucketsize is (16 + keysize*8 + valuesize*8).  For a map of:\n// map[int64]int64, keysize=8 and valuesize=8.  There are edge cases\n// where the bucket size is different that I can't find the source code\n// for. https://github.com/golang/go/issues/34561#issuecomment-536115805\n//\n// I suspect it's because of alignment and how the compiler handles it but\n// when compared with how much the compiler allocates, it's a couple hundred\n// bytes off.\nfunc calculateRoughMapSize(hint int, bucketSize uintptr) int {\n\t// This code is copied from makemap() in runtime/map.go.\n\t//\n\t// TODO check once in a while to see if this algorithm gets\n\t// changed.\n\tmem, overflow := mulUintptr(uintptr(hint), uintptr(bucketSize))\n\tif overflow || mem > maxAlloc {\n\t\thint = 0\n\t}\n\n\t// Find the size parameter B which will hold the requested # of elements.\n\t// For hint < 0 overLoadFactor returns false since hint < bucketCnt.\n\tB := uint8(0)\n\tfor overLoadFactor(hint, B) {\n\t\tB++\n\t}\n\n\t// This code is copied from makeBucketArray() in runtime/map.go.\n\t//\n\t// TODO check once in a while to see if this algorithm gets\n\t// changed.\n\t//\n\t// For small b, overflow buckets are unlikely.\n\t// Avoid the overhead of the calculation.\n\tbase := bucketShift(B)\n\tnumBuckets := base\n\tif B >= 4 {\n\t\t// Add on the estimated number of overflow buckets\n\t\t// required to insert the median number of elements\n\t\t// used with this value of b.\n\t\tnumBuckets += bucketShift(B - 4)\n\t\tsz := bucketSize * numBuckets\n\t\tup := roundupsize(sz)\n\t\tif up != sz {\n\t\t\tnumBuckets = up / bucketSize\n\t\t}\n\t}\n\ttotal, _ := mulUintptr(bucketSize, numBuckets)\n\n\tif base != numBuckets {\n\t\t// Add 24 for mapextra struct overhead. Refer to\n\t\t// runtime/map.go in the std library for the struct.\n\t\ttotal += 24\n\t}\n\n\t// 48 is the number of bytes needed for the map header in a\n\t// 64 bit system. Refer to hmap in runtime/map.go in the go\n\t// standard library.\n\ttotal += 48\n\treturn int(total)\n}\n\n// calculateMinEntries returns the minimum number of entries that will make the\n// map allocate the given total bytes.  -1 on the returned entry count will\n// make the map allocate half as much total bytes (for returned entry count that's\n// greater than 0).\nfunc calculateMinEntries(totalBytes int, bucketSize int) int {\n\t// 48 is the number of bytes needed for the map header in a\n\t// 64 bit system. Refer to hmap in runtime/map.go in the go\n\t// standard library.\n\ttotalBytes -= 48\n\n\tnumBuckets := totalBytes / bucketSize\n\tB := uint8(math.Log2(float64(numBuckets)))\n\tif B < 4 {\n\t\tswitch B {\n\t\tcase 0:\n\t\t\treturn 0\n\t\tcase 1:\n\t\t\treturn 9\n\t\tcase 2:\n\t\t\treturn 14\n\t\tdefault:\n\t\t\treturn 27\n\t\t}\n\t}\n\n\tB -= 1\n\n\treturn (int(loadFactorNum * (bucketShift(B) / loadFactorDen))) + 1\n}\n\n// mulUintptr returns a * b and whether the multiplication overflowed.\n// On supported platforms this is an intrinsic lowered by the compiler.\nfunc mulUintptr(a, b uintptr) (uintptr, bool) {\n\tif a|b < 1<<(4*PtrSize) || a == 0 {\n\t\treturn a * b, false\n\t}\n\toverflow := b > MaxUintptr/a\n\treturn a * b, overflow\n}\n\n// divRoundUp returns ceil(n / a).\nfunc divRoundUp(n, a uintptr) uintptr {\n\t// a is generally a power of two. This will get inlined and\n\t// the compiler will optimize the division.\n\treturn (n + a - 1) / a\n}\n\n// alignUp rounds n up to a multiple of a. a must be a power of 2.\nfunc alignUp(n, a uintptr) uintptr {\n\treturn (n + a - 1) &^ (a - 1)\n}\n\n// Returns size of the memory block that mallocgc will allocate if you ask for the size.\nfunc roundupsize(size uintptr) uintptr {\n\tif size < _MaxSmallSize {\n\t\tif size <= smallSizeMax-8 {\n\t\t\treturn uintptr(class_to_size[size_to_class8[divRoundUp(size, smallSizeDiv)]])\n\t\t} else {\n\t\t\treturn uintptr(class_to_size[size_to_class128[divRoundUp(size-smallSizeMax, largeSizeDiv)]])\n\t\t}\n\t}\n\tif size+_PageSize < size {\n\t\treturn size\n\t}\n\treturn alignUp(size, _PageSize)\n}\n\n// overLoadFactor reports whether count items placed in 1<<B buckets is over loadFactor.\nfunc overLoadFactor(count int, B uint8) bool {\n\treturn count > bucketCnt && uintptr(count) > loadFactorNum*(bucketShift(B)/loadFactorDen)\n}\n\n// bucketShift returns 1<<b, optimized for code generation.\nfunc bucketShift(b uint8) uintptr {\n\t// Masking the shift amount allows overflow checks to be elided.\n\treturn uintptr(1) << (b & (8*8 - 1))\n}\n"
  },
  {
    "path": "blockchain/sizehelper_test.go",
    "content": "// Copyright (c) 2023 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\npackage blockchain\n\nimport (\n\t\"math\"\n\t\"testing\"\n)\n\n// calculateEntries returns a number of entries that will make the map allocate\n// the given total bytes.  The returned number is always the maximum number of\n// entries that will allocate inside the given parameters.\nfunc calculateEntries(totalBytes int, bucketSize int) int {\n\t// 48 is the number of bytes needed for the map header in a\n\t// 64 bit system. Refer to hmap in runtime/map.go in the go\n\t// standard library.\n\ttotalBytes -= 48\n\n\tnumBuckets := totalBytes / bucketSize\n\tB := uint8(math.Log2(float64(numBuckets)))\n\tif B == 0 {\n\t\t// For 0 buckets, the max is the bucket count.\n\t\treturn bucketCnt\n\t}\n\n\treturn int(loadFactorNum * (bucketShift(B) / loadFactorDen))\n}\n\nfunc TestCalculateEntries(t *testing.T) {\n\tfor i := 0; i < 10_000_000; i++ {\n\t\t// It's not possible to calculate the exact amount of entries since\n\t\t// the map will only allocate for 2^N where N is the amount of buckets.\n\t\t//\n\t\t// So to see if the calculate entries function is working correctly,\n\t\t// we get the rough map size for i entries, then calculate the entries\n\t\t// for that map size.  If the size is the same, the function is correct.\n\t\troughMapSize := calculateRoughMapSize(i, bucketSize)\n\t\tentries := calculateEntries(roughMapSize, bucketSize)\n\t\tgotRoughMapSize := calculateRoughMapSize(entries, bucketSize)\n\n\t\tif roughMapSize != gotRoughMapSize {\n\t\t\tt.Errorf(\"For hint of %d, expected %v, got %v\\n\",\n\t\t\t\ti, roughMapSize, gotRoughMapSize)\n\t\t}\n\n\t\t// Test that the entries returned are the maximum for the given map size.\n\t\t// If we increment the entries by one, we should get a bigger map.\n\t\tgotRoughMapSizeWrong := calculateRoughMapSize(entries+1, bucketSize)\n\t\tif roughMapSize == gotRoughMapSizeWrong {\n\t\t\tt.Errorf(\"For hint %d incremented by 1, expected %v, got %v\\n\",\n\t\t\t\ti, gotRoughMapSizeWrong*2, gotRoughMapSizeWrong)\n\t\t}\n\n\t\tminEntries := calculateMinEntries(roughMapSize, bucketSize)\n\t\tgotMinRoughMapSize := calculateRoughMapSize(minEntries, bucketSize)\n\t\tif roughMapSize != gotMinRoughMapSize {\n\t\t\tt.Errorf(\"For hint of %d, expected %v, got %v\\n\",\n\t\t\t\ti, roughMapSize, gotMinRoughMapSize)\n\t\t}\n\n\t\t// Can only test if they'll be half the size if the entries aren't 0.\n\t\tif minEntries > 0 {\n\t\t\tgotMinRoughMapSizeWrong := calculateRoughMapSize(minEntries-1, bucketSize)\n\t\t\tif gotMinRoughMapSize == gotMinRoughMapSizeWrong {\n\t\t\t\tt.Errorf(\"For hint %d decremented by 1, expected %v, got %v\\n\",\n\t\t\t\t\ti, gotRoughMapSizeWrong/2, gotRoughMapSizeWrong)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blockchain/testdata/reorgtest.hex",
    "content": "File path:  reorgTest/blk_0_to_4.dat\n\nBlock 0:\n   f9beb4d9\n   1d010000\n   \n   01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 \n   00000000 3ba3edfd 7a7b12b2 7ac72c3e 67768f61 7fc81bc3 888a5132 3a9fb8aa \n   4b1e5e4a 29ab5f49 ffff001d 1dac2b7c \n   01\n   \n   01000000 01000000 00000000 00000000 00000000 00000000 00000000 00000000 \n   00000000 00ffffff ff4d04ff ff001d01 04455468 65205469 6d657320 30332f4a \n   616e2f32 30303920 4368616e 63656c6c 6f72206f 6e206272 696e6b20 6f662073 \n   65636f6e 64206261 696c6f75 7420666f 72206261 6e6b73ff ffffff01 00f2052a \n   01000000 43410467 8afdb0fe 55482719 67f1a671 30b7105c d6a828e0 3909a679 \n   62e0ea1f 61deb649 f6bc3f4c ef38c4f3 5504e51e c112de5c 384df7ba 0b8d578a \n   4c702b6b f11d5fac 00000000 \nBlock 1:\n   f9beb4d9\n   d4000000\n   \n   01000000 6fe28c0a b6f1b372 c1a6a246 ae63f74f 931e8365 e15a089c 68d61900 \n   00000000 3bbd67ad e98fbbb7 0718cd80 f9e9acf9 3b5fae91 7bb2b41d 4c3bb82c \n   77725ca5 81ad5f49 ffff001d 44e69904 \n   01\n   \n   01000000 01000000 00000000 00000000 00000000 00000000 00000000 00000000 \n   00000000 00ffffff ff04722f 2e2bffff ffff0100 f2052a01 00000043 41046868 \n   0737c76d abb801cb 2204f57d be4e4579 e4f710cd 67dc1b42 27592c81 e9b5cf02 \n   b5ac9e8b 4c9f49be 5251056b 6a6d011e 4c37f6b6 d17ede6b 55faa235 19e2ac00 \n   000000 \nBlock 2:\n   f9beb4d9\n   95010000\n   \n   01000000 13ca7940 4c11c63e ca906bbd f190b751 2872b857 1b5143ae e8cb5737 \n   00000000 fc07c983 d7391736 0aeda657 29d0d4d3 2533eb84 76ee9d64 aa27538f \n   9b4fc00a d9af5f49 ffff001d 630bea22 \n   02\n   \n   01000000 01000000 00000000 00000000 00000000 00000000 00000000 00000000 \n   00000000 00ffffff ff04eb96 14e5ffff ffff0100 f2052a01 00000043 41046868 \n   0737c76d abb801cb 2204f57d be4e4579 e4f710cd 67dc1b42 27592c81 e9b5cf02 \n   b5ac9e8b 4c9f49be 5251056b 6a6d011e 4c37f6b6 d17ede6b 55faa235 19e2ac00 \n   000000 \n   \n   01000000 0163451d 1002611c 1388d5ba 4ddfdf99 196a86b5 990fb5b0 dc786207 \n   4fdcb8ee d2000000 004a4930 46022100 3dde52c6 5e339f45 7fe1015e 70eed208 \n   872eb71e dd484c07 206b190e cb2ec3f8 02210011 c78dcfd0 3d43fa63 61242a33 \n   6291ba2a 8c1ef5bc d5472126 2468f2bf 8dee4d01 ffffffff 0200ca9a 3b000000 \n   001976a9 14cb2abd e8bccacc 32e893df 3a054b9e f7f227a4 ce88ac00 286bee00 \n   00000019 76a914ee 26c56fc1 d942be8d 7a24b2a1 001dd894 69398088 ac000000 \n   00 \nBlock 3:\n   f9beb4d9\n   96020000\n   \n   01000000 7d338254 0506faab 0d4cf179 45dda023 49db51f9 6233f24c 28002258 \n   00000000 4806fe80 bf85931b 882ea645 77ca5a03 22bb8af2 3f277b20 55f160cd \n   972c8e8b 31b25f49 ffff001d e8f0c653 \n   03\n   \n   01000000 01000000 00000000 00000000 00000000 00000000 00000000 00000000 \n   00000000 00ffffff ff044abd 8159ffff ffff0100 f2052a01 00000043 4104b95c \n   249d84f4 17e3e395 a1274254 28b54067 1cc15881 eb828c17 b722a53f c599e21c \n   a5e56c90 f340988d 3933acc7 6beb832f d64cab07 8ddf3ce7 32923031 d1a8ac00 \n   000000 \n   \n   01000000 01f287b5 e067e1cf 80f7da8a f89917b5 505094db d82412d9 35b665eb \n   bad253d3 77010000 008c4930 46022100 96ee0d02 b35fd61e 4960b44f f396f67e \n   01fe17f9 de4e0c17 b6a963bd ab2b50a6 02210034 920d4daa 7e9f8abe 5675c931 \n   495809f9 0b9c1189 d05fbaf1 dd6696a5 b0d8f301 41046868 0737c76d abb801cb \n   2204f57d be4e4579 e4f710cd 67dc1b42 27592c81 e9b5cf02 b5ac9e8b 4c9f49be \n   5251056b 6a6d011e 4c37f6b6 d17ede6b 55faa235 19e2ffff ffff0100 286bee00 \n   00000019 76a914c5 22664fb0 e55cdc5c 0cea73b4 aad97ec8 34323288 ac000000 \n   00 \n   \n   01000000 01f287b5 e067e1cf 80f7da8a f89917b5 505094db d82412d9 35b665eb \n   bad253d3 77000000 008c4930 46022100 b08b922a c4bde411 1c229f92 9fe6eb6a \n   50161f98 1f4cf47e a9214d35 bf74d380 022100d2 f6640327 e677a1e1 cc474991 \n   b9a48ba5 bd1e0c94 d1c8df49 f7b0193b 7ea4fa01 4104b95c 249d84f4 17e3e395 \n   a1274254 28b54067 1cc15881 eb828c17 b722a53f c599e21c a5e56c90 f340988d \n   3933acc7 6beb832f d64cab07 8ddf3ce7 32923031 d1a8ffff ffff0100 ca9a3b00 \n   00000019 76a914c5 22664fb0 e55cdc5c 0cea73b4 aad97ec8 34323288 ac000000 \n   00 \n\nBlock 4:\n   f9beb4d9\n   73010000\n   \n   01000000 5da36499 06f35e09 9be42a1d 87b6dd42 11bc1400 6c220694 0807eaae \n   00000000 48eeeaed 2d9d8522 e6201173 743823fd 4b87cd8a ca8e6408 ec75ca38 \n   302c2ff0 89b45f49 ffff001d 00530839 \n   02\n   \n   01000000 01000000 00000000 00000000 00000000 00000000 00000000 00000000 \n   00000000 00ffffff ff04d41d 2213ffff ffff0100 f2052a01 00000043 4104678a \n   fdb0fe55 48271967 f1a67130 b7105cd6 a828e039 09a67962 e0ea1f61 deb649f6 \n   bc3f4cef 38c4f355 04e51ec1 12de5c38 4df7ba0b 8d578a4c 702b6bf1 1d5fac00 \n   000000 \n   \n   01000000 0163451d 1002611c 1388d5ba 4ddfdf99 196a86b5 990fb5b0 dc786207 \n   4fdcb8ee d2000000 004a4930 46022100 8c8fd57b 48762135 8d8f3e69 19f33e08 \n   804736ff 83db47aa 248512e2 6df9b8ba 022100b0 c59e5ee7 bfcbfcd1 a4d83da9 \n   55fb260e fda7f42a 25522625 a3d6f2d9 1174a701 ffffffff 0100f205 2a010000 \n   001976a9 14c52266 4fb0e55c dc5c0cea 73b4aad9 7ec83432 3288ac00 000000 \n\nFile path:  reorgTest/blk_3A.dat\nBlock 3A:\n   f9beb4d9\n   96020000\n   \n   01000000 7d338254 0506faab 0d4cf179 45dda023 49db51f9 6233f24c 28002258 \n   00000000 5a15f573 1177a353 bdca7aab 20e16624 dfe90adc 70accadc 68016732 \n   302c20a7 31b25f49 ffff001d 6a901440 \n   03\n   \n   01000000 01000000 00000000 00000000 00000000 00000000 00000000 00000000 \n   00000000 00ffffff ff04ad1b e7d5ffff ffff0100 f2052a01 00000043 4104ed83 \n   704c95d8 29046f1a c2780621 1132102c 34e9ac7f fa1b7111 0658e5b9 d1bdedc4 \n   16f5cefc 1db0625c d0c75de8 192d2b59 2d7e3b00 bcfb4a0e 860d880f d1fcac00 \n   000000 \n   \n   01000000 01f287b5 e067e1cf 80f7da8a f89917b5 505094db d82412d9 35b665eb \n   bad253d3 77010000 008c4930 46022100 96ee0d02 b35fd61e 4960b44f f396f67e \n   01fe17f9 de4e0c17 b6a963bd ab2b50a6 02210034 920d4daa 7e9f8abe 5675c931 \n   495809f9 0b9c1189 d05fbaf1 dd6696a5 b0d8f301 41046868 0737c76d abb801cb \n   2204f57d be4e4579 e4f710cd 67dc1b42 27592c81 e9b5cf02 b5ac9e8b 4c9f49be \n   5251056b 6a6d011e 4c37f6b6 d17ede6b 55faa235 19e2ffff ffff0100 286bee00 \n   00000019 76a914c5 22664fb0 e55cdc5c 0cea73b4 aad97ec8 34323288 ac000000 \n   00 \n   \n   01000000 01f287b5 e067e1cf 80f7da8a f89917b5 505094db d82412d9 35b665eb \n   bad253d3 77000000 008c4930 46022100 9cc67ddd aa6f592a 6b2babd4 d6ff954f \n   25a784cf 4fe4bb13 afb9f49b 08955119 022100a2 d99545b7 94080757 fcf2b563 \n   f2e91287 86332f46 0ec6b90f f085fb28 41a69701 4104b95c 249d84f4 17e3e395 \n   a1274254 28b54067 1cc15881 eb828c17 b722a53f c599e21c a5e56c90 f340988d \n   3933acc7 6beb832f d64cab07 8ddf3ce7 32923031 d1a8ffff ffff0100 ca9a3b00 \n   00000019 76a914ee 26c56fc1 d942be8d 7a24b2a1 001dd894 69398088 ac000000 \n   00 \n\nFile path:  reorgTest/blk_4A.dat\nBlock 4A:\n   f9beb4d9\n   d4000000\n   \n   01000000 aae77468 2205667d 4f413a58 47cc8fe8 9795f1d5 645d5b24 1daf3c92 \n   00000000 361c9cde a09637a0 d0c05c3b 4e7a5d91 9edb184a 0a4c7633 d92e2ddd \n   f04cb854 89b45f49 ffff001d 9e9aa1e8 \n   01\n   \n   01000000 01000000 00000000 00000000 00000000 00000000 00000000 00000000 \n   00000000 00ffffff ff0401b8 f3eaffff ffff0100 f2052a01 00000043 4104678a \n   fdb0fe55 48271967 f1a67130 b7105cd6 a828e039 09a67962 e0ea1f61 deb649f6 \n   bc3f4cef 38c4f355 04e51ec1 12de5c38 4df7ba0b 8d578a4c 702b6bf1 1d5fac00 \n   000000 \n\nFile path:  reorgTest/blk_5A.dat\nBlock 5A:\n   f9beb4d9\n   73010000\n   \n   01000000 ebc7d0de 9c31a71b 7f41d275 2c080ba4 11e1854b d45cb2cf 8c1e4624 \n   00000000 a607774b 79b8eb50 b52a5a32 c1754281 ec67f626 9561df28 57d1fe6a \n   ea82c696 e1b65f49 ffff001d 4a263577 \n   02\n   \n   01000000 01000000 00000000 00000000 00000000 00000000 00000000 00000000 \n   00000000 00ffffff ff049971 0c7dffff ffff0100 f2052a01 00000043 4104678a \n   fdb0fe55 48271967 f1a67130 b7105cd6 a828e039 09a67962 e0ea1f61 deb649f6 \n   bc3f4cef 38c4f355 04e51ec1 12de5c38 4df7ba0b 8d578a4c 702b6bf1 1d5fac00 \n   000000 \n   \n   01000000 0163451d 1002611c 1388d5ba 4ddfdf99 196a86b5 990fb5b0 dc786207 \n   4fdcb8ee d2000000 004a4930 46022100 8c8fd57b 48762135 8d8f3e69 19f33e08 \n   804736ff 83db47aa 248512e2 6df9b8ba 022100b0 c59e5ee7 bfcbfcd1 a4d83da9 \n   55fb260e fda7f42a 25522625 a3d6f2d9 1174a701 ffffffff 0100f205 2a010000 \n   001976a9 14c52266 4fb0e55c dc5c0cea 73b4aad9 7ec83432 3288ac00 000000 \n\n"
  },
  {
    "path": "blockchain/thresholdstate.go",
    "content": "// Copyright (c) 2016-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// ThresholdState define the various threshold states used when voting on\n// consensus changes.\ntype ThresholdState byte\n\n// These constants are used to identify specific threshold states.\nconst (\n\t// ThresholdDefined is the first state for each deployment and is the\n\t// state for the genesis block has by definition for all deployments.\n\tThresholdDefined ThresholdState = iota\n\n\t// ThresholdStarted is the state for a deployment once its start time\n\t// has been reached.\n\tThresholdStarted\n\n\t// ThresholdLockedIn is the state for a deployment during the retarget\n\t// period which is after the ThresholdStarted state period and the\n\t// number of blocks that have voted for the deployment equal or exceed\n\t// the required number of votes for the deployment.\n\tThresholdLockedIn\n\n\t// ThresholdActive is the state for a deployment for all blocks after a\n\t// retarget period in which the deployment was in the ThresholdLockedIn\n\t// state.\n\tThresholdActive\n\n\t// ThresholdFailed is the state for a deployment once its expiration\n\t// time has been reached and it did not reach the ThresholdLockedIn\n\t// state.\n\tThresholdFailed\n\n\t// numThresholdsStates is the maximum number of threshold states used in\n\t// tests.\n\tnumThresholdsStates\n)\n\n// thresholdStateStrings is a map of ThresholdState values back to their\n// constant names for pretty printing.\nvar thresholdStateStrings = map[ThresholdState]string{\n\tThresholdDefined:  \"ThresholdDefined\",\n\tThresholdStarted:  \"ThresholdStarted\",\n\tThresholdLockedIn: \"ThresholdLockedIn\",\n\tThresholdActive:   \"ThresholdActive\",\n\tThresholdFailed:   \"ThresholdFailed\",\n}\n\n// String returns the ThresholdState as a human-readable name.\nfunc (t ThresholdState) String() string {\n\tif s := thresholdStateStrings[t]; s != \"\" {\n\t\treturn s\n\t}\n\treturn fmt.Sprintf(\"Unknown ThresholdState (%d)\", int(t))\n}\n\n// thresholdConditionChecker provides a generic interface that is invoked to\n// determine when a consensus rule change threshold should be changed.\ntype thresholdConditionChecker interface {\n\t// HasStarted returns true if based on the passed block blockNode the\n\t// consensus is eligible for deployment.\n\tHasStarted(*blockNode) bool\n\n\t// HasEnded returns true if the target consensus rule change has\n\t// expired or timed out.\n\tHasEnded(*blockNode) bool\n\n\t// RuleChangeActivationThreshold is the number of blocks for which the\n\t// condition must be true in order to lock in a rule change.\n\tRuleChangeActivationThreshold() uint32\n\n\t// MinerConfirmationWindow is the number of blocks in each threshold\n\t// state retarget window.\n\tMinerConfirmationWindow() uint32\n\n\t// EligibleToActivate returns true if a custom deployment can\n\t// transition from the LockedIn to the Active state. For normal\n\t// deployments, this always returns true. However, some deployments add\n\t// extra rules like a minimum activation height, which can be\n\t// abstracted into a generic arbitrary check at the final state via\n\t// this method.\n\tEligibleToActivate(*blockNode) bool\n\n\t// IsSpeedy returns true if this is to be a \"speedy\" deployment. A\n\t// speedy deployment differs from a regular one in that only after a\n\t// miner block confirmation window can the deployment expire.\n\tIsSpeedy() bool\n\n\t// Condition returns whether or not the rule change activation\n\t// condition has been met.  This typically involves checking whether or\n\t// not the bit associated with the condition is set, but can be more\n\t// complex as needed.\n\tCondition(*blockNode) (bool, error)\n\n\t// ForceActive returns if the deployment should be forced to transition\n\t// to the active state. This is useful on certain testnet, where we\n\t// we'd like for a deployment to always be active.\n\tForceActive(*blockNode) bool\n}\n\n// thresholdStateCache provides a type to cache the threshold states of each\n// threshold window for a set of IDs.\ntype thresholdStateCache struct {\n\tentries map[chainhash.Hash]ThresholdState\n}\n\n// Lookup returns the threshold state associated with the given hash along with\n// a boolean that indicates whether or not it is valid.\nfunc (c *thresholdStateCache) Lookup(hash *chainhash.Hash) (ThresholdState, bool) {\n\tstate, ok := c.entries[*hash]\n\treturn state, ok\n}\n\n// Update updates the cache to contain the provided hash to threshold state\n// mapping.\nfunc (c *thresholdStateCache) Update(hash *chainhash.Hash, state ThresholdState) {\n\tc.entries[*hash] = state\n}\n\n// newThresholdCaches returns a new array of caches to be used when calculating\n// threshold states.\nfunc newThresholdCaches(numCaches uint32) []thresholdStateCache {\n\tcaches := make([]thresholdStateCache, numCaches)\n\tfor i := 0; i < len(caches); i++ {\n\t\tcaches[i] = thresholdStateCache{\n\t\t\tentries: make(map[chainhash.Hash]ThresholdState),\n\t\t}\n\t}\n\treturn caches\n}\n\n// PastMedianTime returns the past median time from the PoV of the passed block\n// header. The past median time is the median time of the 11 blocks prior to\n// the passed block header.\n//\n// NOTE: This is part of the chainfg.BlockClock interface\nfunc (b *BlockChain) PastMedianTime(blockHeader *wire.BlockHeader) (time.Time, error) {\n\tprevHash := blockHeader.PrevBlock\n\tprevNode := b.index.LookupNode(&prevHash)\n\n\t// If we can't find the previous node, then we can't compute the block\n\t// time since it requires us to walk backwards from this node.\n\tif prevNode == nil {\n\t\treturn time.Time{}, fmt.Errorf(\"blockHeader(%v) has no \"+\n\t\t\t\"previous node\", blockHeader.BlockHash())\n\t}\n\n\tblockNode := newBlockNode(blockHeader, prevNode)\n\n\treturn CalcPastMedianTime(blockNode), nil\n}\n\n// thresholdStateTransition given a state, a previous node, and a toeholds\n// checker, this function transitions to the next state as defined by BIP 009.\n// This state transition function is also aware of the \"speedy trial\"\n// modifications made to BIP 0009 as part of the taproot softfork activation.\nfunc thresholdStateTransition(state ThresholdState, prevNode *blockNode,\n\tchecker thresholdConditionChecker,\n\tconfirmationWindow int32) (ThresholdState, error) {\n\n\tswitch state {\n\tcase ThresholdDefined:\n\t\t// The deployment of the rule change fails if it\n\t\t// expires before it is accepted and locked in. However\n\t\t// speed deployments can only transition to failed\n\t\t// after a confirmation window.\n\t\tif !checker.IsSpeedy() && checker.HasEnded(prevNode) {\n\t\t\tlog.Debugf(\"Moving from state=%v, to state=%v\", state,\n\t\t\t\tThresholdFailed)\n\n\t\t\tstate = ThresholdFailed\n\t\t\tbreak\n\t\t}\n\n\t\t// The state for the rule moves to the started state\n\t\t// once its start time has been reached (and it hasn't\n\t\t// already expired per the above).\n\t\tif checker.HasStarted(prevNode) {\n\t\t\tlog.Debugf(\"Moving from state=%v, to state=%v\", state,\n\t\t\t\tThresholdStarted)\n\n\t\t\tstate = ThresholdStarted\n\t\t}\n\n\tcase ThresholdStarted:\n\t\t// The deployment of the rule change fails if it\n\t\t// expires before it is accepted and locked in, but\n\t\t// only if this deployment isn't speedy.\n\t\tif !checker.IsSpeedy() && checker.HasEnded(prevNode) {\n\t\t\tlog.Debugf(\"Moving from state=%v, to state=%v\", state,\n\t\t\t\tThresholdFailed)\n\n\t\t\tstate = ThresholdFailed\n\t\t\tbreak\n\t\t}\n\n\t\t// At this point, the rule change is still being voted\n\t\t// on by the miners, so iterate backwards through the\n\t\t// confirmation window to count all of the votes in it.\n\t\tvar count uint32\n\t\tcountNode := prevNode\n\t\tfor i := int32(0); i < confirmationWindow; i++ {\n\t\t\tcondition, err := checker.Condition(countNode)\n\t\t\tif err != nil {\n\t\t\t\treturn ThresholdFailed, err\n\t\t\t}\n\t\t\tif condition {\n\t\t\t\tcount++\n\t\t\t}\n\n\t\t\t// Get the previous block node.\n\t\t\tcountNode = countNode.parent\n\t\t}\n\n\t\tswitch {\n\t\t// The state is locked in if the number of blocks in the\n\t\t// period that voted for the rule change meets the\n\t\t// activation threshold.\n\t\tcase count >= checker.RuleChangeActivationThreshold():\n\t\t\tlog.Debugf(\"Moving from state=%v, to state=%v\", state,\n\t\t\t\tThresholdLockedIn)\n\n\t\t\tstate = ThresholdLockedIn\n\n\t\t// If this is a speedy deployment, we didn't meet the\n\t\t// threshold above, and the deployment has expired, then\n\t\t// we transition to failed.\n\t\tcase checker.IsSpeedy() && checker.HasEnded(prevNode):\n\t\t\tlog.Debugf(\"Moving from state=%v, to state=%v\", state,\n\t\t\t\tThresholdFailed)\n\n\t\t\tstate = ThresholdFailed\n\n\t\tdefault:\n\t\t\tlog.Tracef(\"Still at state=%v, threshold=%v\", state,\n\t\t\t\tfloat64(count)/float64(checker.RuleChangeActivationThreshold()))\n\t\t}\n\n\tcase ThresholdLockedIn:\n\t\t// At this point, we'll consult the deployment see if a\n\t\t// custom deployment has any other arbitrary conditions\n\t\t// that need to pass before execution. This might be a\n\t\t// minimum activation height or another policy.\n\t\t//\n\t\t// If we aren't eligible to active yet, then we'll just\n\t\t// stay in the locked in position.\n\t\tif !checker.EligibleToActivate(prevNode) {\n\t\t\tlog.Debugf(\"Moving from state=%v, to state=%v\", state,\n\t\t\t\tThresholdLockedIn)\n\n\t\t\tstate = ThresholdLockedIn\n\t\t} else {\n\t\t\tlog.Debugf(\"Moving from state=%v, to state=%v\", state,\n\t\t\t\tThresholdActive)\n\n\t\t\t// The new rule becomes active when its\n\t\t\t// previous state was locked in assuming it's\n\t\t\t// now eligible to activate.\n\t\t\tstate = ThresholdActive\n\t\t}\n\n\t// Nothing to do if the previous state is active or failed since\n\t// they are both terminal states.\n\tcase ThresholdActive:\n\tcase ThresholdFailed:\n\t}\n\n\treturn state, nil\n}\n\n// thresholdState returns the current rule change threshold state for the block\n// AFTER the given node and deployment ID.  The cache is used to ensure the\n// threshold states for previous windows are only calculated once.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) thresholdState(prevNode *blockNode,\n\tchecker thresholdConditionChecker,\n\tcache *thresholdStateCache) (ThresholdState, error) {\n\n\t// If the deployment has a nonzero AlwaysActiveHeight and the next\n\t// block’s height is at or above that threshold, then force the state\n\t// to Active.\n\tif checker.ForceActive(prevNode) {\n\t\treturn ThresholdActive, nil\n\t}\n\n\t// The threshold state for the window that contains the genesis block is\n\t// defined by definition.\n\tconfirmationWindow := int32(checker.MinerConfirmationWindow())\n\tif prevNode == nil || (prevNode.height+1) < confirmationWindow {\n\t\treturn ThresholdDefined, nil\n\t}\n\n\t// Get the ancestor that is the last block of the previous confirmation\n\t// window in order to get its threshold state.  This can be done because\n\t// the state is the same for all blocks within a given window.\n\tprevNode = prevNode.Ancestor(prevNode.height -\n\t\t(prevNode.height+1)%confirmationWindow)\n\n\t// Iterate backwards through each of the previous confirmation windows\n\t// to find the most recently cached threshold state.\n\tvar neededStates []*blockNode\n\tfor prevNode != nil {\n\t\t// Nothing more to do if the state of the block is already\n\t\t// cached.\n\t\tif _, ok := cache.Lookup(&prevNode.hash); ok {\n\t\t\tbreak\n\t\t}\n\n\t\t// The state is simply defined if the start time hasn't been\n\t\t// been reached yet.\n\t\tif !checker.HasStarted(prevNode) {\n\t\t\tcache.Update(&prevNode.hash, ThresholdDefined)\n\t\t\tbreak\n\t\t}\n\n\t\t// Add this node to the list of nodes that need the state\n\t\t// calculated and cached.\n\t\tneededStates = append(neededStates, prevNode)\n\n\t\t// Get the ancestor that is the last block of the previous\n\t\t// confirmation window.\n\t\tprevNode = prevNode.RelativeAncestor(confirmationWindow)\n\t}\n\n\t// Start with the threshold state for the most recent confirmation\n\t// window that has a cached state.\n\tstate := ThresholdDefined\n\tif prevNode != nil {\n\t\tvar ok bool\n\t\tstate, ok = cache.Lookup(&prevNode.hash)\n\t\tif !ok {\n\t\t\treturn ThresholdFailed, AssertError(fmt.Sprintf(\n\t\t\t\t\"thresholdState: cache lookup failed for %v\",\n\t\t\t\tprevNode.hash))\n\t\t}\n\t}\n\n\t// Since each threshold state depends on the state of the previous\n\t// window, iterate starting from the oldest unknown window.\n\tvar err error\n\tfor neededNum := len(neededStates) - 1; neededNum >= 0; neededNum-- {\n\t\tprevNode := neededStates[neededNum]\n\n\t\t// Based on the current state, the previous node, and the\n\t\t// condition checker, transition to the next threshold state.\n\t\tstate, err = thresholdStateTransition(\n\t\t\tstate, prevNode, checker, confirmationWindow,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn state, err\n\t\t}\n\n\t\t// Update the cache to avoid recalculating the state in the\n\t\t// future.\n\t\tcache.Update(&prevNode.hash, state)\n\t}\n\n\treturn state, nil\n}\n\n// ThresholdState returns the current rule change threshold state of the given\n// deployment ID for the block AFTER the end of the current best chain.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) ThresholdState(deploymentID uint32) (ThresholdState, error) {\n\tb.chainLock.Lock()\n\tstate, err := b.deploymentState(b.bestChain.Tip(), deploymentID)\n\tb.chainLock.Unlock()\n\n\treturn state, err\n}\n\n// IsDeploymentActive returns true if the target deploymentID is active, and\n// false otherwise.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) IsDeploymentActive(deploymentID uint32) (bool, error) {\n\tb.chainLock.Lock()\n\tstate, err := b.deploymentState(b.bestChain.Tip(), deploymentID)\n\tb.chainLock.Unlock()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn state == ThresholdActive, nil\n}\n\n// deploymentState returns the current rule change threshold for a given\n// deploymentID. The threshold is evaluated from the point of view of the block\n// node passed in as the first argument to this method.\n//\n// It is important to note that, as the variable name indicates, this function\n// expects the block node prior to the block for which the deployment state is\n// desired.  In other words, the returned deployment state is for the block\n// AFTER the passed node.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) deploymentState(prevNode *blockNode, deploymentID uint32) (ThresholdState, error) {\n\tif deploymentID > uint32(len(b.chainParams.Deployments)) {\n\t\treturn ThresholdFailed, DeploymentError(deploymentID)\n\t}\n\n\tdeployment := &b.chainParams.Deployments[deploymentID]\n\tchecker := deploymentChecker{deployment: deployment, chain: b}\n\tcache := &b.deploymentCaches[deploymentID]\n\n\treturn b.thresholdState(prevNode, checker, cache)\n}\n\n// initThresholdCaches initializes the threshold state caches for each warning\n// bit and defined deployment and provides warnings if the chain is current per\n// the warnUnknownRuleActivations function.\nfunc (b *BlockChain) initThresholdCaches() error {\n\t// Initialize the warning and deployment caches by calculating the\n\t// threshold state for each of them.  This will ensure the caches are\n\t// populated and any states that needed to be recalculated due to\n\t// definition changes is done now.\n\tprevNode := b.bestChain.Tip().parent\n\tfor bit := uint32(0); bit < vbNumBits; bit++ {\n\t\tchecker := bitConditionChecker{bit: bit, chain: b}\n\t\tcache := &b.warningCaches[bit]\n\t\t_, err := b.thresholdState(prevNode, checker, cache)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tfor id := 0; id < len(b.chainParams.Deployments); id++ {\n\t\tdeployment := &b.chainParams.Deployments[id]\n\t\tcache := &b.deploymentCaches[id]\n\t\tchecker := deploymentChecker{deployment: deployment, chain: b}\n\t\t_, err := b.thresholdState(prevNode, checker, cache)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// No warnings about unknown rules until the chain is current.\n\tif b.isCurrent() {\n\t\tbestNode := b.bestChain.Tip()\n\n\t\t// Warn if any unknown new rules are either about to activate or\n\t\t// have already been activated.\n\t\tif err := b.warnUnknownRuleActivations(bestNode); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "blockchain/thresholdstate_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// TestThresholdStateStringer tests the stringized output for the\n// ThresholdState type.\nfunc TestThresholdStateStringer(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tin   ThresholdState\n\t\twant string\n\t}{\n\t\t{ThresholdDefined, \"ThresholdDefined\"},\n\t\t{ThresholdStarted, \"ThresholdStarted\"},\n\t\t{ThresholdLockedIn, \"ThresholdLockedIn\"},\n\t\t{ThresholdActive, \"ThresholdActive\"},\n\t\t{ThresholdFailed, \"ThresholdFailed\"},\n\t\t{0xff, \"Unknown ThresholdState (255)\"},\n\t}\n\n\t// Detect additional threshold states that don't have the stringer added.\n\tif len(tests)-1 != int(numThresholdsStates) {\n\t\tt.Errorf(\"It appears a threshold statewas added without \" +\n\t\t\t\"adding an associated stringer test\")\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.String()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"String #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestThresholdStateCache ensure the threshold state cache works as intended\n// including adding entries, updating existing entries, and flushing.\nfunc TestThresholdStateCache(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname       string\n\t\tnumEntries int\n\t\tstate      ThresholdState\n\t}{\n\t\t{name: \"2 entries defined\", numEntries: 2, state: ThresholdDefined},\n\t\t{name: \"7 entries started\", numEntries: 7, state: ThresholdStarted},\n\t\t{name: \"10 entries active\", numEntries: 10, state: ThresholdActive},\n\t\t{name: \"5 entries locked in\", numEntries: 5, state: ThresholdLockedIn},\n\t\t{name: \"3 entries failed\", numEntries: 3, state: ThresholdFailed},\n\t}\n\nnextTest:\n\tfor _, test := range tests {\n\t\tcache := &newThresholdCaches(1)[0]\n\t\tfor i := 0; i < test.numEntries; i++ {\n\t\t\tvar hash chainhash.Hash\n\t\t\thash[0] = uint8(i + 1)\n\n\t\t\t// Ensure the hash isn't available in the cache already.\n\t\t\t_, ok := cache.Lookup(&hash)\n\t\t\tif ok {\n\t\t\t\tt.Errorf(\"Lookup (%s): has entry for hash %v\",\n\t\t\t\t\ttest.name, hash)\n\t\t\t\tcontinue nextTest\n\t\t\t}\n\n\t\t\t// Ensure hash that was added to the cache reports it's\n\t\t\t// available and the state is the expected value.\n\t\t\tcache.Update(&hash, test.state)\n\t\t\tstate, ok := cache.Lookup(&hash)\n\t\t\tif !ok {\n\t\t\t\tt.Errorf(\"Lookup (%s): missing entry for hash \"+\n\t\t\t\t\t\"%v\", test.name, hash)\n\t\t\t\tcontinue nextTest\n\t\t\t}\n\t\t\tif state != test.state {\n\t\t\t\tt.Errorf(\"Lookup (%s): state mismatch - got \"+\n\t\t\t\t\t\"%v, want %v\", test.name, state,\n\t\t\t\t\ttest.state)\n\t\t\t\tcontinue nextTest\n\t\t\t}\n\n\t\t\t// Ensure adding an existing hash with the same state\n\t\t\t// doesn't break the existing entry.\n\t\t\tcache.Update(&hash, test.state)\n\t\t\tstate, ok = cache.Lookup(&hash)\n\t\t\tif !ok {\n\t\t\t\tt.Errorf(\"Lookup (%s): missing entry after \"+\n\t\t\t\t\t\"second add for hash %v\", test.name,\n\t\t\t\t\thash)\n\t\t\t\tcontinue nextTest\n\t\t\t}\n\t\t\tif state != test.state {\n\t\t\t\tt.Errorf(\"Lookup (%s): state mismatch after \"+\n\t\t\t\t\t\"second add - got %v, want %v\",\n\t\t\t\t\ttest.name, state, test.state)\n\t\t\t\tcontinue nextTest\n\t\t\t}\n\n\t\t\t// Ensure adding an existing hash with a different state\n\t\t\t// updates the existing entry.\n\t\t\tnewState := ThresholdFailed\n\t\t\tif newState == test.state {\n\t\t\t\tnewState = ThresholdStarted\n\t\t\t}\n\t\t\tcache.Update(&hash, newState)\n\t\t\tstate, ok = cache.Lookup(&hash)\n\t\t\tif !ok {\n\t\t\t\tt.Errorf(\"Lookup (%s): missing entry after \"+\n\t\t\t\t\t\"state change for hash %v\", test.name,\n\t\t\t\t\thash)\n\t\t\t\tcontinue nextTest\n\t\t\t}\n\t\t\tif state != newState {\n\t\t\t\tt.Errorf(\"Lookup (%s): state mismatch after \"+\n\t\t\t\t\t\"state change - got %v, want %v\",\n\t\t\t\t\ttest.name, state, newState)\n\t\t\t\tcontinue nextTest\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype customDeploymentChecker struct {\n\tstarted bool\n\tended   bool\n\n\teligible bool\n\n\tisSpeedy bool\n\n\tconditionTrue bool\n\n\tactivationThreshold uint32\n\tminerWindow         uint32\n}\n\nfunc (c customDeploymentChecker) HasStarted(_ *blockNode) bool {\n\treturn c.started\n}\n\nfunc (c customDeploymentChecker) HasEnded(_ *blockNode) bool {\n\treturn c.ended\n}\n\nfunc (c customDeploymentChecker) RuleChangeActivationThreshold() uint32 {\n\treturn c.activationThreshold\n}\n\nfunc (c customDeploymentChecker) MinerConfirmationWindow() uint32 {\n\treturn c.minerWindow\n}\n\nfunc (c customDeploymentChecker) EligibleToActivate(_ *blockNode) bool {\n\treturn c.eligible\n}\n\nfunc (c customDeploymentChecker) IsSpeedy() bool {\n\treturn c.isSpeedy\n}\n\nfunc (c customDeploymentChecker) Condition(_ *blockNode) (bool, error) {\n\treturn c.conditionTrue, nil\n}\n\nfunc (c customDeploymentChecker) ForceActive(_ *blockNode) bool {\n\treturn false\n}\n\n// TestThresholdStateTransition tests that the thresholdStateTransition\n// properly implements the BIP 009 state machine, along with the speedy trial\n// augments.\nfunc TestThresholdStateTransition(t *testing.T) {\n\tt.Parallel()\n\n\t// Prev node always points back to itself, effectively creating an\n\t// infinite chain for the purposes of this test.\n\tprevNode := &blockNode{}\n\tprevNode.parent = prevNode\n\n\twindow := int32(2016)\n\n\ttestCases := []struct {\n\t\tcurrentState ThresholdState\n\t\tnextState    ThresholdState\n\n\t\tchecker thresholdConditionChecker\n\t}{\n\t\t// From defined, we stay there if we haven't started the\n\t\t// window, and the window hasn't ended.\n\t\t{\n\t\t\tcurrentState: ThresholdDefined,\n\t\t\tnextState:    ThresholdDefined,\n\n\t\t\tchecker: &customDeploymentChecker{},\n\t\t},\n\n\t\t// From defined, we go to failed if the window has ended, and\n\t\t// this isn't a speedy trial.\n\t\t{\n\t\t\tcurrentState: ThresholdDefined,\n\t\t\tnextState:    ThresholdFailed,\n\n\t\t\tchecker: &customDeploymentChecker{\n\t\t\t\tended: true,\n\t\t\t},\n\t\t},\n\n\t\t// From defined, even if the window has ended, we go to started\n\t\t// if this isn't a speedy trial.\n\t\t{\n\t\t\tcurrentState: ThresholdDefined,\n\t\t\tnextState:    ThresholdStarted,\n\n\t\t\tchecker: &customDeploymentChecker{\n\t\t\t\tstarted: true,\n\t\t\t},\n\t\t},\n\n\t\t// From started, we go to failed if this isn't speed, and the\n\t\t// deployment has ended.\n\t\t{\n\t\t\tcurrentState: ThresholdStarted,\n\t\t\tnextState:    ThresholdFailed,\n\n\t\t\tchecker: &customDeploymentChecker{\n\t\t\t\tended: true,\n\t\t\t},\n\t\t},\n\n\t\t// From started, we go to locked in if the window passed the\n\t\t// condition.\n\t\t{\n\t\t\tcurrentState: ThresholdStarted,\n\t\t\tnextState:    ThresholdLockedIn,\n\n\t\t\tchecker: &customDeploymentChecker{\n\t\t\t\tstarted:       true,\n\t\t\t\tconditionTrue: true,\n\t\t\t},\n\t\t},\n\n\t\t// From started, we go to failed if this is a speedy trial, and\n\t\t// the condition wasn't met in the window.\n\t\t{\n\t\t\tcurrentState: ThresholdStarted,\n\t\t\tnextState:    ThresholdFailed,\n\n\t\t\tchecker: &customDeploymentChecker{\n\t\t\t\tstarted:             true,\n\t\t\t\tended:               true,\n\t\t\t\tisSpeedy:            true,\n\t\t\t\tconditionTrue:       false,\n\t\t\t\tactivationThreshold: 1815,\n\t\t\t},\n\t\t},\n\n\t\t// From locked in, we go straight to active is this isn't a\n\t\t// speedy trial.\n\t\t{\n\t\t\tcurrentState: ThresholdLockedIn,\n\t\t\tnextState:    ThresholdActive,\n\n\t\t\tchecker: &customDeploymentChecker{\n\t\t\t\teligible: true,\n\t\t\t},\n\t\t},\n\n\t\t// From locked in, we remain in locked in if we're not yet\n\t\t// eligible to activate.\n\t\t{\n\t\t\tcurrentState: ThresholdLockedIn,\n\t\t\tnextState:    ThresholdLockedIn,\n\n\t\t\tchecker: &customDeploymentChecker{},\n\t\t},\n\n\t\t// From active, we always stay here.\n\t\t{\n\t\t\tcurrentState: ThresholdActive,\n\t\t\tnextState:    ThresholdActive,\n\n\t\t\tchecker: &customDeploymentChecker{},\n\t\t},\n\n\t\t// From failed, we always stay here.\n\t\t{\n\t\t\tcurrentState: ThresholdFailed,\n\t\t\tnextState:    ThresholdFailed,\n\n\t\t\tchecker: &customDeploymentChecker{},\n\t\t},\n\t}\n\tfor i, testCase := range testCases {\n\t\tnextState, err := thresholdStateTransition(\n\t\t\ttestCase.currentState, prevNode, testCase.checker,\n\t\t\twindow,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"#%v: unable to transition to next \"+\n\t\t\t\t\"state: %v\", i, err)\n\t\t}\n\n\t\tif nextState != testCase.nextState {\n\t\t\tt.Fatalf(\"#%v: incorrect state transition: \"+\n\t\t\t\t\"expected %v got %v\", i, testCase.nextState,\n\t\t\t\tnextState)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blockchain/timesorter.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\n// timeSorter implements sort.Interface to allow a slice of timestamps to\n// be sorted.\ntype timeSorter []int64\n\n// Len returns the number of timestamps in the slice.  It is part of the\n// sort.Interface implementation.\nfunc (s timeSorter) Len() int {\n\treturn len(s)\n}\n\n// Swap swaps the timestamps at the passed indices.  It is part of the\n// sort.Interface implementation.\nfunc (s timeSorter) Swap(i, j int) {\n\ts[i], s[j] = s[j], s[i]\n}\n\n// Less returns whether the timestamp with index i should sort before the\n// timestamp with index j.  It is part of the sort.Interface implementation.\nfunc (s timeSorter) Less(i, j int) bool {\n\treturn s[i] < s[j]\n}\n"
  },
  {
    "path": "blockchain/timesorter_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"reflect\"\n\t\"sort\"\n\t\"testing\"\n)\n\n// TestTimeSorter tests the timeSorter implementation.\nfunc TestTimeSorter(t *testing.T) {\n\ttests := []struct {\n\t\tin   []int64\n\t\twant []int64\n\t}{\n\t\t{\n\t\t\tin: []int64{\n\t\t\t\t1351228575, // Fri Oct 26 05:16:15 UTC 2012 (Block #205000)\n\t\t\t\t1348310759, // Sat Sep 22 10:45:59 UTC 2012 (Block #200000)\n\t\t\t\t1305758502, // Wed May 18 22:41:42 UTC 2011 (Block #125000)\n\t\t\t\t1347777156, // Sun Sep 16 06:32:36 UTC 2012 (Block #199000)\n\t\t\t\t1349492104, // Sat Oct  6 02:55:04 UTC 2012 (Block #202000)\n\t\t\t},\n\t\t\twant: []int64{\n\t\t\t\t1305758502, // Wed May 18 22:41:42 UTC 2011 (Block #125000)\n\t\t\t\t1347777156, // Sun Sep 16 06:32:36 UTC 2012 (Block #199000)\n\t\t\t\t1348310759, // Sat Sep 22 10:45:59 UTC 2012 (Block #200000)\n\t\t\t\t1349492104, // Sat Oct  6 02:55:04 UTC 2012 (Block #202000)\n\t\t\t\t1351228575, // Fri Oct 26 05:16:15 UTC 2012 (Block #205000)\n\t\t\t},\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\tresult := make([]int64, len(test.in))\n\t\tcopy(result, test.in)\n\t\tsort.Sort(timeSorter(result))\n\t\tif !reflect.DeepEqual(result, test.want) {\n\t\t\tt.Errorf(\"timeSorter #%d got %v want %v\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blockchain/upgrade.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"bytes\"\n\t\"container/list\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// blockHdrOffset defines the offsets into a v1 block index row for the\n\t// block header.\n\t//\n\t// The serialized block index row format is:\n\t//   <blocklocation><blockheader>\n\tblockHdrOffset = 12\n)\n\n// errInterruptRequested indicates that an operation was cancelled due\n// to a user-requested interrupt.\nvar errInterruptRequested = errors.New(\"interrupt requested\")\n\n// interruptRequested returns true when the provided channel has been closed.\n// This simplifies early shutdown slightly since the caller can just use an if\n// statement instead of a select.\nfunc interruptRequested(interrupted <-chan struct{}) bool {\n\tselect {\n\tcase <-interrupted:\n\t\treturn true\n\tdefault:\n\t}\n\n\treturn false\n}\n\n// blockChainContext represents a particular block's placement in the block\n// chain. This is used by the block index migration to track block metadata that\n// will be written to disk.\ntype blockChainContext struct {\n\tparent    *chainhash.Hash\n\tchildren  []*chainhash.Hash\n\theight    int32\n\tmainChain bool\n}\n\n// migrateBlockIndex migrates all block entries from the v1 block index bucket\n// to the v2 bucket. The v1 bucket stores all block entries keyed by block hash,\n// whereas the v2 bucket stores the exact same values, but keyed instead by\n// block height + hash.\nfunc migrateBlockIndex(db database.DB) error {\n\t// Hardcoded bucket names so updates to the global values do not affect\n\t// old upgrades.\n\tv1BucketName := []byte(\"ffldb-blockidx\")\n\tv2BucketName := []byte(\"blockheaderidx\")\n\n\terr := db.Update(func(dbTx database.Tx) error {\n\t\tv1BlockIdxBucket := dbTx.Metadata().Bucket(v1BucketName)\n\t\tif v1BlockIdxBucket == nil {\n\t\t\treturn fmt.Errorf(\"Bucket %s does not exist\", v1BucketName)\n\t\t}\n\n\t\tlog.Info(\"Re-indexing block information in the database. This might take a while...\")\n\n\t\tv2BlockIdxBucket, err :=\n\t\t\tdbTx.Metadata().CreateBucketIfNotExists(v2BucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Get tip of the main chain.\n\t\tserializedData := dbTx.Metadata().Get(chainStateKeyName)\n\t\tstate, err := deserializeBestChainState(serializedData)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttip := &state.hash\n\n\t\t// Scan the old block index bucket and construct a mapping of each block\n\t\t// to parent block and all child blocks.\n\t\tblocksMap, err := readBlockTree(v1BlockIdxBucket)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Use the block graph to calculate the height of each block.\n\t\terr = determineBlockHeights(blocksMap)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Find blocks on the main chain with the block graph and current tip.\n\t\tdetermineMainChainBlocks(blocksMap, tip)\n\n\t\t// Now that we have heights for all blocks, scan the old block index\n\t\t// bucket and insert all rows into the new one.\n\t\treturn v1BlockIdxBucket.ForEach(func(hashBytes, blockRow []byte) error {\n\t\t\tendOffset := blockHdrOffset + blockHdrSize\n\t\t\theaderBytes := blockRow[blockHdrOffset:endOffset:endOffset]\n\n\t\t\tvar hash chainhash.Hash\n\t\t\tcopy(hash[:], hashBytes[0:chainhash.HashSize])\n\t\t\tchainContext := blocksMap[hash]\n\n\t\t\tif chainContext.height == -1 {\n\t\t\t\treturn fmt.Errorf(\"Unable to calculate chain height for \"+\n\t\t\t\t\t\"stored block %s\", hash)\n\t\t\t}\n\n\t\t\t// Mark blocks as valid if they are part of the main chain.\n\t\t\tstatus := statusDataStored\n\t\t\tif chainContext.mainChain {\n\t\t\t\tstatus |= statusValid\n\t\t\t}\n\n\t\t\t// Write header to v2 bucket\n\t\t\tvalue := make([]byte, blockHdrSize+1)\n\t\t\tcopy(value[0:blockHdrSize], headerBytes)\n\t\t\tvalue[blockHdrSize] = byte(status)\n\n\t\t\tkey := blockIndexKey(&hash, uint32(chainContext.height))\n\t\t\terr := v2BlockIdxBucket.Put(key, value)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Delete header from v1 bucket\n\t\t\ttruncatedRow := blockRow[0:blockHdrOffset:blockHdrOffset]\n\t\t\treturn v1BlockIdxBucket.Put(hashBytes, truncatedRow)\n\t\t})\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tlog.Infof(\"Block database migration complete\")\n\treturn nil\n}\n\n// readBlockTree reads the old block index bucket and constructs a mapping of\n// each block to its parent block and all child blocks. This mapping represents\n// the full tree of blocks. This function does not populate the height or\n// mainChain fields of the returned blockChainContext values.\nfunc readBlockTree(v1BlockIdxBucket database.Bucket) (map[chainhash.Hash]*blockChainContext, error) {\n\tblocksMap := make(map[chainhash.Hash]*blockChainContext)\n\terr := v1BlockIdxBucket.ForEach(func(_, blockRow []byte) error {\n\t\tvar header wire.BlockHeader\n\t\tendOffset := blockHdrOffset + blockHdrSize\n\t\theaderBytes := blockRow[blockHdrOffset:endOffset:endOffset]\n\t\terr := header.Deserialize(bytes.NewReader(headerBytes))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tblockHash := header.BlockHash()\n\t\tprevHash := header.PrevBlock\n\n\t\tif blocksMap[blockHash] == nil {\n\t\t\tblocksMap[blockHash] = &blockChainContext{height: -1}\n\t\t}\n\t\tif blocksMap[prevHash] == nil {\n\t\t\tblocksMap[prevHash] = &blockChainContext{height: -1}\n\t\t}\n\n\t\tblocksMap[blockHash].parent = &prevHash\n\t\tblocksMap[prevHash].children =\n\t\t\tappend(blocksMap[prevHash].children, &blockHash)\n\t\treturn nil\n\t})\n\treturn blocksMap, err\n}\n\n// determineBlockHeights takes a map of block hashes to a slice of child hashes\n// and uses it to compute the height for each block. The function assigns a\n// height of 0 to the genesis hash and explores the tree of blocks\n// breadth-first, assigning a height to every block with a path back to the\n// genesis block. This function modifies the height field on the blocksMap\n// entries.\nfunc determineBlockHeights(blocksMap map[chainhash.Hash]*blockChainContext) error {\n\tqueue := list.New()\n\n\t// The genesis block is included in blocksMap as a child of the zero hash\n\t// because that is the value of the PrevBlock field in the genesis header.\n\tpreGenesisContext, exists := blocksMap[zeroHash]\n\tif !exists || len(preGenesisContext.children) == 0 {\n\t\treturn fmt.Errorf(\"Unable to find genesis block\")\n\t}\n\n\tfor _, genesisHash := range preGenesisContext.children {\n\t\tblocksMap[*genesisHash].height = 0\n\t\tqueue.PushBack(genesisHash)\n\t}\n\n\tfor e := queue.Front(); e != nil; e = queue.Front() {\n\t\tqueue.Remove(e)\n\t\thash := e.Value.(*chainhash.Hash)\n\t\theight := blocksMap[*hash].height\n\n\t\t// For each block with this one as a parent, assign it a height and\n\t\t// push to queue for future processing.\n\t\tfor _, childHash := range blocksMap[*hash].children {\n\t\t\tblocksMap[*childHash].height = height + 1\n\t\t\tqueue.PushBack(childHash)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// determineMainChainBlocks traverses the block graph down from the tip to\n// determine which block hashes that are part of the main chain. This function\n// modifies the mainChain field on the blocksMap entries.\nfunc determineMainChainBlocks(blocksMap map[chainhash.Hash]*blockChainContext, tip *chainhash.Hash) {\n\tfor nextHash := tip; *nextHash != zeroHash; nextHash = blocksMap[*nextHash].parent {\n\t\tblocksMap[*nextHash].mainChain = true\n\t}\n}\n\n// deserializeUtxoEntryV0 decodes a utxo entry from the passed serialized byte\n// slice according to the legacy version 0 format into a map of utxos keyed by\n// the output index within the transaction.  The map is necessary because the\n// previous format encoded all unspent outputs for a transaction using a single\n// entry, whereas the new format encodes each unspent output individually.\n//\n// The legacy format is as follows:\n//\n//\t<version><height><header code><unspentness bitmap>[<compressed txouts>,...]\n//\n//\tField                Type     Size\n//\tversion              VLQ      variable\n//\tblock height         VLQ      variable\n//\theader code          VLQ      variable\n//\tunspentness bitmap   []byte   variable\n//\tcompressed txouts\n//\t  compressed amount  VLQ      variable\n//\t  compressed script  []byte   variable\n//\n// The serialized header code format is:\n//\n//\tbit 0 - containing transaction is a coinbase\n//\tbit 1 - output zero is unspent\n//\tbit 2 - output one is unspent\n//\tbits 3-x - number of bytes in unspentness bitmap.  When both bits 1 and 2\n//\t  are unset, it encodes N-1 since there must be at least one unspent\n//\t  output.\n//\n// The rationale for the header code scheme is as follows:\n//   - Transactions which only pay to a single output and a change output are\n//     extremely common, thus an extra byte for the unspentness bitmap can be\n//     avoided for them by encoding those two outputs in the low order bits.\n//   - Given it is encoded as a VLQ which can encode values up to 127 with a\n//     single byte, that leaves 4 bits to represent the number of bytes in the\n//     unspentness bitmap while still only consuming a single byte for the\n//     header code.  In other words, an unspentness bitmap with up to 120\n//     transaction outputs can be encoded with a single-byte header code.\n//     This covers the vast majority of transactions.\n//   - Encoding N-1 bytes when both bits 1 and 2 are unset allows an additional\n//     8 outpoints to be encoded before causing the header code to require an\n//     additional byte.\n//\n// Example 1:\n// From tx in main blockchain:\n// Blk 1, 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098\n//\n//\t  010103320496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52\n//\t  <><><><------------------------------------------------------------------>\n//\t   | | \\--------\\                               |\n//\t   | height     |                      compressed txout 0\n//\tversion    header code\n//\n//\t- version: 1\n//\t- height: 1\n//\t- header code: 0x03 (coinbase, output zero unspent, 0 bytes of unspentness)\n//\t- unspentness: Nothing since it is zero bytes\n//\t- compressed txout 0:\n//\t  - 0x32: VLQ-encoded compressed amount for 5000000000 (50 BTC)\n//\t  - 0x04: special script type pay-to-pubkey\n//\t  - 0x96...52: x-coordinate of the pubkey\n//\n// Example 2:\n// From tx in main blockchain:\n// Blk 113931, 4a16969aa4764dd7507fc1de7f0baa4850a246de90c45e59a3207f9a26b5036f\n//\n//\t  0185f90b0a011200e2ccd6ec7c6e2e581349c77e067385fa8236bf8a800900b8025be1b3efc63b0ad48e7f9f10e87544528d58\n//\t  <><----><><><------------------------------------------><-------------------------------------------->\n//\t   |    |  | \\-------------------\\            |                            |\n//\tversion |  \\--------\\       unspentness       |                    compressed txout 2\n//\t      height     header code          compressed txout 0\n//\n//\t- version: 1\n//\t- height: 113931\n//\t- header code: 0x0a (output zero unspent, 1 byte in unspentness bitmap)\n//\t- unspentness: [0x01] (bit 0 is set, so output 0+2 = 2 is unspent)\n//\t  NOTE: It's +2 since the first two outputs are encoded in the header code\n//\t- compressed txout 0:\n//\t  - 0x12: VLQ-encoded compressed amount for 20000000 (0.2 BTC)\n//\t  - 0x00: special script type pay-to-pubkey-hash\n//\t  - 0xe2...8a: pubkey hash\n//\t- compressed txout 2:\n//\t  - 0x8009: VLQ-encoded compressed amount for 15000000 (0.15 BTC)\n//\t  - 0x00: special script type pay-to-pubkey-hash\n//\t  - 0xb8...58: pubkey hash\n//\n// Example 3:\n// From tx in main blockchain:\n// Blk 338156, 1b02d1c8cfef60a189017b9a420c682cf4a0028175f2f563209e4ff61c8c3620\n//\n//\t  0193d06c100000108ba5b9e763011dd46a006572d820e448e12d2bbb38640bc718e6\n//\t  <><----><><----><-------------------------------------------------->\n//\t   |    |  |   \\-----------------\\            |\n//\tversion |  \\--------\\       unspentness       |\n//\t      height     header code          compressed txout 22\n//\n//\t- version: 1\n//\t- height: 338156\n//\t- header code: 0x10 (2+1 = 3 bytes in unspentness bitmap)\n//\t  NOTE: It's +1 since neither bit 1 nor 2 are set, so N-1 is encoded.\n//\t- unspentness: [0x00 0x00 0x10] (bit 20 is set, so output 20+2 = 22 is unspent)\n//\t  NOTE: It's +2 since the first two outputs are encoded in the header code\n//\t- compressed txout 22:\n//\t  - 0x8ba5b9e763: VLQ-encoded compressed amount for 366875659 (3.66875659 BTC)\n//\t  - 0x01: special script type pay-to-script-hash\n//\t  - 0x1d...e6: script hash\nfunc deserializeUtxoEntryV0(serialized []byte) (map[uint32]*UtxoEntry, error) {\n\t// Deserialize the version.\n\t//\n\t// NOTE: Ignore version since it is no longer used in the new format.\n\t_, bytesRead := deserializeVLQ(serialized)\n\toffset := bytesRead\n\tif offset >= len(serialized) {\n\t\treturn nil, errDeserialize(\"unexpected end of data after version\")\n\t}\n\n\t// Deserialize the block height.\n\tblockHeight, bytesRead := deserializeVLQ(serialized[offset:])\n\toffset += bytesRead\n\tif offset >= len(serialized) {\n\t\treturn nil, errDeserialize(\"unexpected end of data after height\")\n\t}\n\n\t// Deserialize the header code.\n\tcode, bytesRead := deserializeVLQ(serialized[offset:])\n\toffset += bytesRead\n\tif offset >= len(serialized) {\n\t\treturn nil, errDeserialize(\"unexpected end of data after header\")\n\t}\n\n\t// Decode the header code.\n\t//\n\t// Bit 0 indicates whether the containing transaction is a coinbase.\n\t// Bit 1 indicates output 0 is unspent.\n\t// Bit 2 indicates output 1 is unspent.\n\t// Bits 3-x encodes the number of non-zero unspentness bitmap bytes that\n\t// follow.  When both output 0 and 1 are spent, it encodes N-1.\n\tisCoinBase := code&0x01 != 0\n\toutput0Unspent := code&0x02 != 0\n\toutput1Unspent := code&0x04 != 0\n\tnumBitmapBytes := code >> 3\n\tif !output0Unspent && !output1Unspent {\n\t\tnumBitmapBytes++\n\t}\n\n\t// Ensure there are enough bytes left to deserialize the unspentness\n\t// bitmap.\n\tif uint64(len(serialized[offset:])) < numBitmapBytes {\n\t\treturn nil, errDeserialize(\"unexpected end of data for \" +\n\t\t\t\"unspentness bitmap\")\n\t}\n\n\t// Add sparse output for unspent outputs 0 and 1 as needed based on the\n\t// details provided by the header code.\n\tvar outputIndexes []uint32\n\tif output0Unspent {\n\t\toutputIndexes = append(outputIndexes, 0)\n\t}\n\tif output1Unspent {\n\t\toutputIndexes = append(outputIndexes, 1)\n\t}\n\n\t// Decode the unspentness bitmap adding a sparse output for each unspent\n\t// output.\n\tfor i := uint32(0); i < uint32(numBitmapBytes); i++ {\n\t\tunspentBits := serialized[offset]\n\t\tfor j := uint32(0); j < 8; j++ {\n\t\t\tif unspentBits&0x01 != 0 {\n\t\t\t\t// The first 2 outputs are encoded via the\n\t\t\t\t// header code, so adjust the output number\n\t\t\t\t// accordingly.\n\t\t\t\toutputNum := 2 + i*8 + j\n\t\t\t\toutputIndexes = append(outputIndexes, outputNum)\n\t\t\t}\n\t\t\tunspentBits >>= 1\n\t\t}\n\t\toffset++\n\t}\n\n\t// Map to hold all of the converted outputs.\n\tentries := make(map[uint32]*UtxoEntry)\n\n\t// All entries will need to potentially be marked as a coinbase.\n\tvar packedFlags txoFlags\n\tif isCoinBase {\n\t\tpackedFlags |= tfCoinBase\n\t}\n\n\t// Decode and add all of the utxos.\n\tfor i, outputIndex := range outputIndexes {\n\t\t// Decode the next utxo.\n\t\tamount, pkScript, bytesRead, err := decodeCompressedTxOut(\n\t\t\tserialized[offset:])\n\t\tif err != nil {\n\t\t\treturn nil, errDeserialize(fmt.Sprintf(\"unable to \"+\n\t\t\t\t\"decode utxo at index %d: %v\", i, err))\n\t\t}\n\t\toffset += bytesRead\n\n\t\t// Create a new utxo entry with the details deserialized above.\n\t\tentries[outputIndex] = &UtxoEntry{\n\t\t\tamount:      int64(amount),\n\t\t\tpkScript:    pkScript,\n\t\t\tblockHeight: int32(blockHeight),\n\t\t\tpackedFlags: packedFlags,\n\t\t}\n\t}\n\n\treturn entries, nil\n}\n\n// upgradeUtxoSetToV2 migrates the utxo set entries from version 1 to 2 in\n// batches.  It is guaranteed to updated if this returns without failure.\nfunc upgradeUtxoSetToV2(db database.DB, interrupt <-chan struct{}) error {\n\t// Hardcoded bucket names so updates to the global values do not affect\n\t// old upgrades.\n\tvar (\n\t\tv1BucketName = []byte(\"utxoset\")\n\t\tv2BucketName = []byte(\"utxosetv2\")\n\t)\n\n\tlog.Infof(\"Upgrading utxo set to v2.  This will take a while...\")\n\tstart := time.Now()\n\n\t// Create the new utxo set bucket as needed.\n\terr := db.Update(func(dbTx database.Tx) error {\n\t\t_, err := dbTx.Metadata().CreateBucketIfNotExists(v2BucketName)\n\t\treturn err\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// doBatch contains the primary logic for upgrading the utxo set from\n\t// version 1 to 2 in batches.  This is done because the utxo set can be\n\t// huge and thus attempting to migrate in a single database transaction\n\t// would result in massive memory usage and could potentially crash on\n\t// many systems due to ulimits.\n\t//\n\t// It returns the number of utxos processed.\n\tconst maxUtxos = 200000\n\tdoBatch := func(dbTx database.Tx) (uint32, error) {\n\t\tv1Bucket := dbTx.Metadata().Bucket(v1BucketName)\n\t\tv2Bucket := dbTx.Metadata().Bucket(v2BucketName)\n\t\tv1Cursor := v1Bucket.Cursor()\n\n\t\t// Migrate utxos so long as the max number of utxos for this\n\t\t// batch has not been exceeded.\n\t\tvar numUtxos uint32\n\t\tfor ok := v1Cursor.First(); ok && numUtxos < maxUtxos; ok =\n\t\t\tv1Cursor.Next() {\n\n\t\t\t// Old key was the transaction hash.\n\t\t\toldKey := v1Cursor.Key()\n\t\t\tvar txHash chainhash.Hash\n\t\t\tcopy(txHash[:], oldKey)\n\n\t\t\t// Deserialize the old entry which included all utxos\n\t\t\t// for the given transaction.\n\t\t\tutxos, err := deserializeUtxoEntryV0(v1Cursor.Value())\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\n\t\t\t// Add an entry for each utxo into the new bucket using\n\t\t\t// the new format.\n\t\t\tfor txOutIdx, utxo := range utxos {\n\t\t\t\treserialized, err := serializeUtxoEntry(utxo)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\n\t\t\t\tkey := outpointKey(wire.OutPoint{\n\t\t\t\t\tHash:  txHash,\n\t\t\t\t\tIndex: txOutIdx,\n\t\t\t\t})\n\t\t\t\terr = v2Bucket.Put(*key, reserialized)\n\t\t\t\t// NOTE: The key is intentionally not recycled\n\t\t\t\t// here since the database interface contract\n\t\t\t\t// prohibits modifications.  It will be garbage\n\t\t\t\t// collected normally when the database is done\n\t\t\t\t// with it.\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove old entry.\n\t\t\terr = v1Bucket.Delete(oldKey)\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\n\t\t\tnumUtxos += uint32(len(utxos))\n\n\t\t\tif interruptRequested(interrupt) {\n\t\t\t\t// No error here so the database transaction\n\t\t\t\t// is not cancelled and therefore outstanding\n\t\t\t\t// work is written to disk.\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\treturn numUtxos, nil\n\t}\n\n\t// Migrate all entries in batches for the reasons mentioned above.\n\tvar totalUtxos uint64\n\tfor {\n\t\tvar numUtxos uint32\n\t\terr := db.Update(func(dbTx database.Tx) error {\n\t\t\tvar err error\n\t\t\tnumUtxos, err = doBatch(dbTx)\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif interruptRequested(interrupt) {\n\t\t\treturn errInterruptRequested\n\t\t}\n\n\t\tif numUtxos == 0 {\n\t\t\tbreak\n\t\t}\n\n\t\ttotalUtxos += uint64(numUtxos)\n\t\tlog.Infof(\"Migrated %d utxos (%d total)\", numUtxos, totalUtxos)\n\t}\n\n\t// Remove the old bucket and update the utxo set version once it has\n\t// been fully migrated.\n\terr = db.Update(func(dbTx database.Tx) error {\n\t\terr := dbTx.Metadata().DeleteBucket(v1BucketName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn dbPutVersion(dbTx, utxoSetVersionKeyName, 2)\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tseconds := int64(time.Since(start) / time.Second)\n\tlog.Infof(\"Done upgrading utxo set.  Total utxos: %d in %d seconds\",\n\t\ttotalUtxos, seconds)\n\treturn nil\n}\n\n// maybeUpgradeDbBuckets checks the database version of the buckets used by this\n// package and performs any needed upgrades to bring them to the latest version.\n//\n// All buckets used by this package are guaranteed to be the latest version if\n// this function returns without error.\nfunc (b *BlockChain) maybeUpgradeDbBuckets(interrupt <-chan struct{}) error {\n\t// Load or create bucket versions as needed.\n\tvar utxoSetVersion uint32\n\terr := b.db.Update(func(dbTx database.Tx) error {\n\t\t// Load the utxo set version from the database or create it and\n\t\t// initialize it to version 1 if it doesn't exist.\n\t\tvar err error\n\t\tutxoSetVersion, err = dbFetchOrCreateVersion(dbTx,\n\t\t\tutxoSetVersionKeyName, 1)\n\t\treturn err\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Update the utxo set to v2 if needed.\n\tif utxoSetVersion < 2 {\n\t\tif err := upgradeUtxoSetToV2(b.db, interrupt); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "blockchain/upgrade_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n)\n\n// TestDeserializeUtxoEntryV0 ensures deserializing unspent transaction output\n// entries from the legacy version 0 format works as expected.\nfunc TestDeserializeUtxoEntryV0(t *testing.T) {\n\ttests := []struct {\n\t\tname       string\n\t\tentries    map[uint32]*UtxoEntry\n\t\tserialized []byte\n\t}{\n\t\t// From tx in main blockchain:\n\t\t// 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098\n\t\t{\n\t\t\tname: \"Only output 0, coinbase\",\n\t\t\tentries: map[uint32]*UtxoEntry{\n\t\t\t\t0: {\n\t\t\t\t\tamount:      5000000000,\n\t\t\t\t\tpkScript:    hexToBytes(\"410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac\"),\n\t\t\t\t\tblockHeight: 1,\n\t\t\t\t\tpackedFlags: tfCoinBase,\n\t\t\t\t},\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"010103320496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52\"),\n\t\t},\n\t\t// From tx in main blockchain:\n\t\t// 8131ffb0a2c945ecaf9b9063e59558784f9c3a74741ce6ae2a18d0571dac15bb\n\t\t{\n\t\t\tname: \"Only output 1, not coinbase\",\n\t\t\tentries: map[uint32]*UtxoEntry{\n\t\t\t\t1: {\n\t\t\t\t\tamount:      1000000,\n\t\t\t\t\tpkScript:    hexToBytes(\"76a914ee8bd501094a7d5ca318da2506de35e1cb025ddc88ac\"),\n\t\t\t\t\tblockHeight: 100001,\n\t\t\t\t\tpackedFlags: 0,\n\t\t\t\t},\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"01858c21040700ee8bd501094a7d5ca318da2506de35e1cb025ddc\"),\n\t\t},\n\t\t// Adapted from tx in main blockchain:\n\t\t// df3f3f442d9699857f7f49de4ff0b5d0f3448bec31cdc7b5bf6d25f2abd637d5\n\t\t{\n\t\t\tname: \"Only output 2, coinbase\",\n\t\t\tentries: map[uint32]*UtxoEntry{\n\t\t\t\t2: {\n\t\t\t\t\tamount:      100937281,\n\t\t\t\t\tpkScript:    hexToBytes(\"76a914da33f77cee27c2a975ed5124d7e4f7f97513510188ac\"),\n\t\t\t\t\tblockHeight: 99004,\n\t\t\t\t\tpackedFlags: tfCoinBase,\n\t\t\t\t},\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"0185843c010182b095bf4100da33f77cee27c2a975ed5124d7e4f7f975135101\"),\n\t\t},\n\t\t// Adapted from tx in main blockchain:\n\t\t// 4a16969aa4764dd7507fc1de7f0baa4850a246de90c45e59a3207f9a26b5036f\n\t\t{\n\t\t\tname: \"outputs 0 and 2 not coinbase\",\n\t\t\tentries: map[uint32]*UtxoEntry{\n\t\t\t\t0: {\n\t\t\t\t\tamount:      20000000,\n\t\t\t\t\tpkScript:    hexToBytes(\"76a914e2ccd6ec7c6e2e581349c77e067385fa8236bf8a88ac\"),\n\t\t\t\t\tblockHeight: 113931,\n\t\t\t\t\tpackedFlags: 0,\n\t\t\t\t},\n\t\t\t\t2: {\n\t\t\t\t\tamount:      15000000,\n\t\t\t\t\tpkScript:    hexToBytes(\"76a914b8025be1b3efc63b0ad48e7f9f10e87544528d5888ac\"),\n\t\t\t\t\tblockHeight: 113931,\n\t\t\t\t\tpackedFlags: 0,\n\t\t\t\t},\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"0185f90b0a011200e2ccd6ec7c6e2e581349c77e067385fa8236bf8a800900b8025be1b3efc63b0ad48e7f9f10e87544528d58\"),\n\t\t},\n\t\t// Adapted from tx in main blockchain:\n\t\t// 1b02d1c8cfef60a189017b9a420c682cf4a0028175f2f563209e4ff61c8c3620\n\t\t{\n\t\t\tname: \"Only output 22, not coinbase\",\n\t\t\tentries: map[uint32]*UtxoEntry{\n\t\t\t\t22: {\n\t\t\t\t\tamount:      366875659,\n\t\t\t\t\tpkScript:    hexToBytes(\"a9141dd46a006572d820e448e12d2bbb38640bc718e687\"),\n\t\t\t\t\tblockHeight: 338156,\n\t\t\t\t\tpackedFlags: 0,\n\t\t\t\t},\n\t\t\t},\n\t\t\tserialized: hexToBytes(\"0193d06c100000108ba5b9e763011dd46a006572d820e448e12d2bbb38640bc718e6\"),\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\t// Deserialize to map of utxos keyed by the output index.\n\t\tentries, err := deserializeUtxoEntryV0(test.serialized)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"deserializeUtxoEntryV0 #%d (%s) unexpected \"+\n\t\t\t\t\"error: %v\", i, test.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the deserialized entry has the same properties as the\n\t\t// ones in the test entry.\n\t\tif !reflect.DeepEqual(entries, test.entries) {\n\t\t\tt.Errorf(\"deserializeUtxoEntryV0 #%d (%s) unexpected \"+\n\t\t\t\t\"entries: got %v, want %v\", i, test.name,\n\t\t\t\tentries, test.entries)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blockchain/utxocache.go",
    "content": "// Copyright (c) 2023 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"container/list\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// mapSlice is a slice of maps for utxo entries.  The slice of maps are needed to\n// guarantee that the map will only take up N amount of bytes.  As of v1.20, the\n// go runtime will allocate 2^N + few extra buckets, meaning that for large N, we'll\n// allocate a lot of extra memory if the amount of entries goes over the previously\n// allocated buckets.  A slice of maps allows us to have a better control of how much\n// total memory gets allocated by all the maps.\ntype mapSlice struct {\n\t// mtx protects against concurrent access for the map slice.\n\tmtx sync.Mutex\n\n\t// maps are the underlying maps in the slice of maps.\n\tmaps []map[wire.OutPoint]*UtxoEntry\n\n\t// maxEntries is the maximum amount of elements that the map is allocated for.\n\tmaxEntries []int\n\n\t// maxTotalMemoryUsage is the maximum memory usage in bytes that the state\n\t// should contain in normal circumstances.\n\tmaxTotalMemoryUsage uint64\n}\n\n// length returns the length of all the maps in the map slice added together.\n//\n// This function is safe for concurrent access.\nfunc (ms *mapSlice) length() int {\n\tms.mtx.Lock()\n\tdefer ms.mtx.Unlock()\n\n\tvar l int\n\tfor _, m := range ms.maps {\n\t\tl += len(m)\n\t}\n\n\treturn l\n}\n\n// size returns the size of all the maps in the map slice added together.\n//\n// This function is safe for concurrent access.\nfunc (ms *mapSlice) size() int {\n\tms.mtx.Lock()\n\tdefer ms.mtx.Unlock()\n\n\tvar size int\n\tfor _, num := range ms.maxEntries {\n\t\tsize += calculateRoughMapSize(num, bucketSize)\n\t}\n\n\treturn size\n}\n\n// get looks for the outpoint in all the maps in the map slice and returns\n// the entry.  nil and false is returned if the outpoint is not found.\n//\n// This function is safe for concurrent access.\nfunc (ms *mapSlice) get(op wire.OutPoint) (*UtxoEntry, bool) {\n\tms.mtx.Lock()\n\tdefer ms.mtx.Unlock()\n\n\tvar entry *UtxoEntry\n\tvar found bool\n\n\tfor _, m := range ms.maps {\n\t\tentry, found = m[op]\n\t\tif found {\n\t\t\treturn entry, found\n\t\t}\n\t}\n\n\treturn nil, false\n}\n\n// put puts the outpoint and the entry into one of the maps in the map slice.  If the\n// existing maps are all full, it will allocate a new map based on how much memory we\n// have left over.  Leftover memory is calculated as:\n// maxTotalMemoryUsage - (totalEntryMemory + mapSlice.size())\n//\n// This function is safe for concurrent access.\nfunc (ms *mapSlice) put(op wire.OutPoint, entry *UtxoEntry, totalEntryMemory uint64) {\n\tms.mtx.Lock()\n\tdefer ms.mtx.Unlock()\n\n\t// Look for the key in the maps.\n\tfor i := range ms.maxEntries {\n\t\tm := ms.maps[i]\n\t\t_, found := m[op]\n\t\tif found {\n\t\t\t// If the key is found, overwrite it.\n\t\t\tm[op] = entry\n\t\t\treturn // Return as we were successful in adding the entry.\n\t\t}\n\t}\n\n\tfor i, maxNum := range ms.maxEntries {\n\t\tm := ms.maps[i]\n\t\tif len(m) >= maxNum {\n\t\t\t// Don't try to insert if the map already at max since\n\t\t\t// that'll force the map to allocate double the memory it's\n\t\t\t// currently taking up.\n\t\t\tcontinue\n\t\t}\n\n\t\tm[op] = entry\n\t\treturn // Return as we were successful in adding the entry.\n\t}\n\n\t// We only reach this code if we've failed to insert into the map above as\n\t// all the current maps were full.  We thus make a new map and insert into\n\t// it.\n\tm := ms.makeNewMap(totalEntryMemory)\n\tm[op] = entry\n}\n\n// delete attempts to delete the given outpoint in all of the maps. No-op if the\n// outpoint doesn't exist.\n//\n// This function is safe for concurrent access.\nfunc (ms *mapSlice) delete(op wire.OutPoint) {\n\tms.mtx.Lock()\n\tdefer ms.mtx.Unlock()\n\n\tfor i := 0; i < len(ms.maps); i++ {\n\t\tdelete(ms.maps[i], op)\n\t}\n}\n\n// makeNewMap makes and appends the new map into the map slice.\n//\n// This function is NOT safe for concurrent access and must be called with the\n// lock held.\nfunc (ms *mapSlice) makeNewMap(totalEntryMemory uint64) map[wire.OutPoint]*UtxoEntry {\n\t// Get the size of the leftover memory.\n\tmemSize := ms.maxTotalMemoryUsage - totalEntryMemory\n\tfor _, maxNum := range ms.maxEntries {\n\t\tmemSize -= uint64(calculateRoughMapSize(maxNum, bucketSize))\n\t}\n\n\t// Get a new map that's sized to house inside the leftover memory.\n\t// -1 on the returned value will make the map allocate half as much total\n\t// bytes.  This is done to make sure there's still room left for utxo\n\t// entries to take up.\n\tnumMaxElements := calculateMinEntries(int(memSize), bucketSize+avgEntrySize)\n\tnumMaxElements -= 1\n\tms.maxEntries = append(ms.maxEntries, numMaxElements)\n\tms.maps = append(ms.maps, make(map[wire.OutPoint]*UtxoEntry, numMaxElements))\n\n\treturn ms.maps[len(ms.maps)-1]\n}\n\n// deleteMaps deletes all maps except for the first one which should be the biggest.\n//\n// This function is safe for concurrent access.\nfunc (ms *mapSlice) deleteMaps() {\n\tms.mtx.Lock()\n\tdefer ms.mtx.Unlock()\n\n\tsize := ms.maxEntries[0]\n\tms.maxEntries = []int{size}\n\tms.maps = ms.maps[:1]\n}\n\nconst (\n\t// utxoFlushPeriodicInterval is the interval at which a flush is performed\n\t// when the flush mode FlushPeriodic is used.  This is used when the initial\n\t// block download is complete and it's useful to flush periodically in case\n\t// of unforeseen shutdowns.\n\tutxoFlushPeriodicInterval = time.Minute * 5\n)\n\n// FlushMode is used to indicate the different urgency types for a flush.\ntype FlushMode uint8\n\nconst (\n\t// FlushRequired is the flush mode that means a flush must be performed\n\t// regardless of the cache state.  For example right before shutting down.\n\tFlushRequired FlushMode = iota\n\n\t// FlushPeriodic is the flush mode that means a flush can be performed\n\t// when it would be almost needed.  This is used to periodically signal when\n\t// no I/O heavy operations are expected soon, so there is time to flush.\n\tFlushPeriodic\n\n\t// FlushIfNeeded is the flush mode that means a flush must be performed only\n\t// if the cache is exceeding a safety threshold very close to its maximum\n\t// size.  This is used mostly internally in between operations that can\n\t// increase the cache size.\n\tFlushIfNeeded\n)\n\n// utxoCache is a cached utxo view in the chainstate of a BlockChain.\ntype utxoCache struct {\n\tdb database.DB\n\n\t// maxTotalMemoryUsage is the maximum memory usage in bytes that the state\n\t// should contain in normal circumstances.\n\tmaxTotalMemoryUsage uint64\n\n\t// cachedEntries keeps the internal cache of the utxo state.  The tfModified\n\t// flag indicates that the state of the entry (potentially) deviates from the\n\t// state in the database.  Explicit nil values in the map are used to\n\t// indicate that the database does not contain the entry.\n\tcachedEntries    mapSlice\n\ttotalEntryMemory uint64 // Total memory usage in bytes.\n\n\t// Below fields are used to indicate when the last flush happened.\n\tlastFlushHash chainhash.Hash\n\tlastFlushTime time.Time\n}\n\n// newUtxoCache initiates a new utxo cache instance with its memory usage limited\n// to the given maximum.\nfunc newUtxoCache(db database.DB, maxTotalMemoryUsage uint64) *utxoCache {\n\t// While the entry isn't included in the map size, add the average size to the\n\t// bucket size so we get some leftover space for entries to take up.\n\tnumMaxElements := calculateMinEntries(int(maxTotalMemoryUsage), bucketSize+avgEntrySize)\n\tnumMaxElements -= 1\n\n\tlog.Infof(\"Pre-allocating for %d MiB\", maxTotalMemoryUsage/(1024*1024)+1)\n\n\tm := make(map[wire.OutPoint]*UtxoEntry, numMaxElements)\n\n\treturn &utxoCache{\n\t\tdb:                  db,\n\t\tmaxTotalMemoryUsage: maxTotalMemoryUsage,\n\t\tcachedEntries: mapSlice{\n\t\t\tmaps:                []map[wire.OutPoint]*UtxoEntry{m},\n\t\t\tmaxEntries:          []int{numMaxElements},\n\t\t\tmaxTotalMemoryUsage: maxTotalMemoryUsage,\n\t\t},\n\t}\n}\n\n// totalMemoryUsage returns the total memory usage in bytes of the UTXO cache.\nfunc (s *utxoCache) totalMemoryUsage() uint64 {\n\t// Total memory is the map size + the size that the utxo entries are\n\t// taking up.\n\tsize := uint64(s.cachedEntries.size())\n\tsize += s.totalEntryMemory\n\n\treturn size\n}\n\n// fetchEntries returns the UTXO entries for the given outpoints.  The function always\n// returns as many entries as there are outpoints and the returns entries are in the\n// same order as the outpoints.  It returns nil if there is no entry for the outpoint\n// in the UTXO set.\n//\n// The returned entries are NOT safe for concurrent access.\nfunc (s *utxoCache) fetchEntries(outpoints []wire.OutPoint) ([]*UtxoEntry, error) {\n\tentries := make([]*UtxoEntry, len(outpoints))\n\tvar (\n\t\tmissingOps    []wire.OutPoint\n\t\tmissingOpsIdx []int\n\t)\n\tfor i := range outpoints {\n\t\tif entry, ok := s.cachedEntries.get(outpoints[i]); ok {\n\t\t\tentries[i] = entry\n\t\t\tcontinue\n\t\t}\n\n\t\t// At this point, we have missing outpoints.  Allocate them now\n\t\t// so that we never allocate if the cache never misses.\n\t\tif len(missingOps) == 0 {\n\t\t\tmissingOps = make([]wire.OutPoint, 0, len(outpoints))\n\t\t\tmissingOpsIdx = make([]int, 0, len(outpoints))\n\t\t}\n\n\t\tmissingOpsIdx = append(missingOpsIdx, i)\n\t\tmissingOps = append(missingOps, outpoints[i])\n\t}\n\n\t// Return early and don't attempt access the database if we don't have any\n\t// missing outpoints.\n\tif len(missingOps) == 0 {\n\t\treturn entries, nil\n\t}\n\n\t// Fetch the missing outpoints in the cache from the database.\n\tdbEntries := make([]*UtxoEntry, len(missingOps))\n\terr := s.db.View(func(dbTx database.Tx) error {\n\t\tutxoBucket := dbTx.Metadata().Bucket(utxoSetBucketName)\n\n\t\tfor i := range missingOps {\n\t\t\tentry, err := dbFetchUtxoEntry(dbTx, utxoBucket, missingOps[i])\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tdbEntries[i] = entry\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Add each of the entries to the UTXO cache and update their memory\n\t// usage.\n\t//\n\t// NOTE: When the fetched entry is nil, it is still added to the cache\n\t// as a miss; this prevents future lookups to perform the same database\n\t// fetch.\n\tfor i := range dbEntries {\n\t\ts.cachedEntries.put(missingOps[i], dbEntries[i], s.totalEntryMemory)\n\t\ts.totalEntryMemory += dbEntries[i].memoryUsage()\n\t}\n\n\t// Fill in the entries with the ones fetched from the database.\n\tfor i := range missingOpsIdx {\n\t\tentries[missingOpsIdx[i]] = dbEntries[i]\n\t}\n\n\treturn entries, nil\n}\n\n// addTxOut adds the specified output to the cache if it is not provably\n// unspendable.  When the cache already has an entry for the output, it will be\n// overwritten with the given output.  All fields will be updated for existing\n// entries since it's possible it has changed during a reorg.\nfunc (s *utxoCache) addTxOut(outpoint wire.OutPoint, txOut *wire.TxOut, isCoinBase bool,\n\tblockHeight int32) error {\n\n\t// Don't add provably unspendable outputs.\n\tif txscript.IsUnspendable(txOut.PkScript) {\n\t\treturn nil\n\t}\n\n\tentry := new(UtxoEntry)\n\tentry.amount = txOut.Value\n\n\t// Deep copy the script when the script in the entry differs from the one in\n\t// the txout.  This is required since the txout script is a subslice of the\n\t// overall contiguous buffer that the msg tx houses for all scripts within\n\t// the tx.  It is deep copied here since this entry may be added to the utxo\n\t// cache, and we don't want the utxo cache holding the entry to prevent all\n\t// of the other tx scripts from getting garbage collected.\n\tentry.pkScript = make([]byte, len(txOut.PkScript))\n\tcopy(entry.pkScript, txOut.PkScript)\n\n\tentry.blockHeight = blockHeight\n\tentry.packedFlags = tfFresh | tfModified\n\tif isCoinBase {\n\t\tentry.packedFlags |= tfCoinBase\n\t}\n\n\ts.cachedEntries.put(outpoint, entry, s.totalEntryMemory)\n\ts.totalEntryMemory += entry.memoryUsage()\n\n\treturn nil\n}\n\n// addTxOuts adds all outputs in the passed transaction which are not provably\n// unspendable to the view.  When the view already has entries for any of the\n// outputs, they are simply marked unspent.  All fields will be updated for\n// existing entries since it's possible it has changed during a reorg.\nfunc (s *utxoCache) addTxOuts(tx *btcutil.Tx, blockHeight int32) error {\n\t// Loop all of the transaction outputs and add those which are not\n\t// provably unspendable.\n\tisCoinBase := IsCoinBase(tx)\n\tprevOut := wire.OutPoint{Hash: *tx.Hash()}\n\tfor txOutIdx, txOut := range tx.MsgTx().TxOut {\n\t\t// Update existing entries.  All fields are updated because it's\n\t\t// possible (although extremely unlikely) that the existing\n\t\t// entry is being replaced by a different transaction with the\n\t\t// same hash.  This is allowed so long as the previous\n\t\t// transaction is fully spent.\n\t\tprevOut.Index = uint32(txOutIdx)\n\t\terr := s.addTxOut(prevOut, txOut, isCoinBase, blockHeight)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// addTxIn will add the given input to the cache if the previous outpoint the txin\n// is pointing to exists in the utxo set.  The utxo that is being spent by the input\n// will be marked as spent and if the utxo is fresh (meaning that the database on disk\n// never saw it), it will be removed from the cache.\nfunc (s *utxoCache) addTxIn(txIn *wire.TxIn, stxos *[]SpentTxOut) error {\n\t// Ensure the referenced utxo exists in the view.  This should\n\t// never happen unless there is a bug is introduced in the code.\n\tentries, err := s.fetchEntries([]wire.OutPoint{txIn.PreviousOutPoint})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(entries) != 1 || entries[0] == nil {\n\t\treturn AssertError(fmt.Sprintf(\"missing input %v\",\n\t\t\ttxIn.PreviousOutPoint))\n\t}\n\n\t// Only create the stxo details if requested.\n\tentry := entries[0]\n\tif stxos != nil {\n\t\t// Populate the stxo details using the utxo entry.\n\t\tstxo := SpentTxOut{\n\t\t\tAmount:     entry.Amount(),\n\t\t\tPkScript:   entry.PkScript(),\n\t\t\tHeight:     entry.BlockHeight(),\n\t\t\tIsCoinBase: entry.IsCoinBase(),\n\t\t}\n\n\t\t*stxos = append(*stxos, stxo)\n\t}\n\n\t// Mark the entry as spent.\n\tentry.Spend()\n\n\t// If an entry is fresh it indicates that this entry was spent before it could be\n\t// flushed to the database. Because of this, we can just delete it from the map of\n\t// cached entries.\n\tif entry.isFresh() {\n\t\t// If the entry is fresh, we will always have it in the cache.\n\t\ts.cachedEntries.delete(txIn.PreviousOutPoint)\n\t\ts.totalEntryMemory -= entry.memoryUsage()\n\t} else {\n\t\t// Can leave the entry to be garbage collected as the only purpose\n\t\t// of this entry now is so that the entry on disk can be deleted.\n\t\tentry = nil\n\t\ts.totalEntryMemory -= entry.memoryUsage()\n\t}\n\n\treturn nil\n}\n\n// addTxIns will add the given inputs of the tx if it's not a coinbase tx and if\n// the previous output that the input is pointing to exists in the utxo set.  The\n// utxo that is being spent by the input will be marked as spent and if the utxo\n// is fresh (meaning that the database on disk never saw it), it will be removed\n// from the cache.\nfunc (s *utxoCache) addTxIns(tx *btcutil.Tx, stxos *[]SpentTxOut) error {\n\t// Coinbase transactions don't have any inputs to spend.\n\tif IsCoinBase(tx) {\n\t\treturn nil\n\t}\n\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\terr := s.addTxIn(txIn, stxos)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// connectTransaction updates the cache by adding all new utxos created by the\n// passed transaction and marking and/or removing all utxos that the transactions\n// spend as spent.  In addition, when the 'stxos' argument is not nil, it will\n// be updated to append an entry for each spent txout.  An error will be returned\n// if the cache and the database does not contain the required utxos.\nfunc (s *utxoCache) connectTransaction(\n\ttx *btcutil.Tx, blockHeight int32, stxos *[]SpentTxOut) error {\n\n\terr := s.addTxIns(tx, stxos)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Add the transaction's outputs as available utxos.\n\treturn s.addTxOuts(tx, blockHeight)\n}\n\n// connectTransactions updates the cache by adding all new utxos created by all\n// of the transactions in the passed block, marking and/or removing all utxos\n// the transactions spend as spent, and setting the best hash for the view to\n// the passed block.  In addition, when the 'stxos' argument is not nil, it will\n// be updated to append an entry for each spent txout.\nfunc (s *utxoCache) connectTransactions(block *btcutil.Block, stxos *[]SpentTxOut) error {\n\tfor _, tx := range block.Transactions() {\n\t\terr := s.connectTransaction(tx, block.Height(), stxos)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// writeCache writes all the entries that are cached in memory to the database atomically.\nfunc (s *utxoCache) writeCache(dbTx database.Tx, bestState *BestState) error {\n\t// Update commits and flushes the cache to the database.\n\t// NOTE: The database has its own cache which gets atomically written\n\t// to leveldb.\n\tutxoBucket := dbTx.Metadata().Bucket(utxoSetBucketName)\n\tfor i := range s.cachedEntries.maps {\n\t\tfor outpoint, entry := range s.cachedEntries.maps[i] {\n\t\t\tswitch {\n\t\t\t// If the entry is nil or spent, remove the entry from the database\n\t\t\t// and the cache.\n\t\t\tcase entry == nil || entry.IsSpent():\n\t\t\t\terr := dbDeleteUtxoEntry(utxoBucket, outpoint)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t// No need to update the cache if the entry was not modified.\n\t\t\tcase !entry.isModified():\n\t\t\tdefault:\n\t\t\t\t// Entry is fresh and needs to be put into the database.\n\t\t\t\terr := dbPutUtxoEntry(utxoBucket, outpoint, entry)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdelete(s.cachedEntries.maps[i], outpoint)\n\t\t}\n\t}\n\ts.cachedEntries.deleteMaps()\n\ts.totalEntryMemory = 0\n\n\t// When done, store the best state hash in the database to indicate the state\n\t// is consistent until that hash.\n\terr := dbPutUtxoStateConsistency(dbTx, &bestState.Hash)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// The best state is the new last flush hash.\n\ts.lastFlushHash = bestState.Hash\n\ts.lastFlushTime = time.Now()\n\n\treturn nil\n}\n\n// flush flushes the UTXO state to the database if a flush is needed with the given flush mode.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (s *utxoCache) flush(dbTx database.Tx, mode FlushMode, bestState *BestState) error {\n\tvar threshold uint64\n\tswitch mode {\n\tcase FlushRequired:\n\t\tthreshold = 0\n\n\tcase FlushIfNeeded:\n\t\t// If we performed a flush in the current best state, we have nothing to do.\n\t\tif bestState.Hash == s.lastFlushHash {\n\t\t\treturn nil\n\t\t}\n\n\t\tthreshold = s.maxTotalMemoryUsage\n\n\tcase FlushPeriodic:\n\t\t// If the time since the last flush is over the periodic interval,\n\t\t// force a flush.  Otherwise just flush when the cache is full.\n\t\tif time.Since(s.lastFlushTime) > utxoFlushPeriodicInterval {\n\t\t\tthreshold = 0\n\t\t} else {\n\t\t\tthreshold = s.maxTotalMemoryUsage\n\t\t}\n\t}\n\n\tif s.totalMemoryUsage() >= threshold {\n\t\t// Add one to round up the integer division.\n\t\ttotalMiB := s.totalMemoryUsage() / ((1024 * 1024) + 1)\n\t\tlog.Infof(\"Flushing UTXO cache of %d MiB with %d entries to disk. For large sizes, \"+\n\t\t\t\"this can take up to several minutes...\", totalMiB, s.cachedEntries.length())\n\n\t\treturn s.writeCache(dbTx, bestState)\n\t}\n\n\treturn nil\n}\n\n// FlushUtxoCache flushes the UTXO state to the database if a flush is needed with the\n// given flush mode.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) FlushUtxoCache(mode FlushMode) error {\n\tb.chainLock.Lock()\n\tdefer b.chainLock.Unlock()\n\n\treturn b.db.Update(func(dbTx database.Tx) error {\n\t\treturn b.utxoCache.flush(dbTx, mode, b.BestSnapshot())\n\t})\n}\n\n// InitConsistentState checks the consistency status of the utxo state and\n// replays blocks if it lags behind the best state of the blockchain.\n//\n// It needs to be ensured that the chainView passed to this method does not\n// get changed during the execution of this method.\nfunc (b *BlockChain) InitConsistentState(tip *blockNode, interrupt <-chan struct{}) error {\n\ts := b.utxoCache\n\n\t// Load the consistency status from the database.\n\tvar statusBytes []byte\n\ts.db.View(func(dbTx database.Tx) error {\n\t\tstatusBytes = dbFetchUtxoStateConsistency(dbTx)\n\t\treturn nil\n\t})\n\n\t// If no status was found, the database is old and didn't have a cached utxo\n\t// state yet. In that case, we set the status to the best state and write\n\t// this to the database.\n\tif statusBytes == nil {\n\t\terr := s.db.Update(func(dbTx database.Tx) error {\n\t\t\treturn dbPutUtxoStateConsistency(dbTx, &tip.hash)\n\t\t})\n\n\t\t// Set the last flush hash as it's the default value of 0s.\n\t\ts.lastFlushHash = tip.hash\n\t\ts.lastFlushTime = time.Now()\n\n\t\treturn err\n\t}\n\n\tstatusHash, err := chainhash.NewHash(statusBytes)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// If state is consistent, we are done.\n\tif statusHash.IsEqual(&tip.hash) {\n\t\tlog.Debugf(\"UTXO state consistent at (%d:%v)\", tip.height, tip.hash)\n\n\t\t// The last flush hash is set to the default value of all 0s. Set\n\t\t// it to the tip since we checked it's consistent.\n\t\ts.lastFlushHash = tip.hash\n\n\t\t// Set the last flush time as now since we know the state is consistent\n\t\t// at this time.\n\t\ts.lastFlushTime = time.Now()\n\n\t\treturn nil\n\t}\n\n\tlastFlushNode := b.index.LookupNode(statusHash)\n\tlog.Infof(\"Reconstructing UTXO state after an unclean shutdown. The UTXO state is \"+\n\t\t\"consistent at block %s (%d) but the chainstate is at block %s (%d),  This may \"+\n\t\t\"take a long time...\", statusHash.String(), lastFlushNode.height,\n\t\ttip.hash.String(), tip.height)\n\n\t// Even though this should always be true, make sure the fetched hash is in\n\t// the best chain.\n\tfork := b.bestChain.FindFork(lastFlushNode)\n\tif fork == nil {\n\t\treturn AssertError(fmt.Sprintf(\"last utxo consistency status contains \"+\n\t\t\t\"hash that is not in best chain: %v\", statusHash))\n\t}\n\n\t// We never disconnect blocks as they cannot be inconsistent during a reorganization.\n\t// This is because The cache is flushed before the reorganization begins and the utxo\n\t// set at each block disconnect is written atomically to the database.\n\tnode := lastFlushNode\n\n\t// We replay the blocks from the last consistent state up to the best\n\t// state. Iterate forward from the consistent node to the tip of the best\n\t// chain.\n\tattachNodes := list.New()\n\tfor n := tip; n.height >= 0; n = n.parent {\n\t\tif n == fork {\n\t\t\tbreak\n\t\t}\n\t\tattachNodes.PushFront(n)\n\t}\n\n\tfor e := attachNodes.Front(); e != nil; e = e.Next() {\n\t\tnode = e.Value.(*blockNode)\n\n\t\tvar block *btcutil.Block\n\t\terr := s.db.View(func(dbTx database.Tx) error {\n\t\t\tblock, err = dbFetchBlockByNode(dbTx, node)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\terr = b.utxoCache.connectTransactions(block, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Flush the utxo cache if needed.  This will in turn update the\n\t\t// consistent state to this block.\n\t\terr = s.db.Update(func(dbTx database.Tx) error {\n\t\t\treturn s.flush(dbTx, FlushIfNeeded, &BestState{Hash: node.hash, Height: node.height})\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif interruptRequested(interrupt) {\n\t\t\tlog.Warn(\"UTXO state reconstruction interrupted\")\n\n\t\t\treturn errInterruptRequested\n\t\t}\n\t}\n\tlog.Debug(\"UTXO state reconstruction done\")\n\n\t// Set the last flush hash as it's the default value of 0s.\n\ts.lastFlushHash = tip.hash\n\ts.lastFlushTime = time.Now()\n\n\treturn nil\n}\n\n// flushNeededAfterPrune returns true if the utxo cache needs to be flushed after a prune\n// of the block storage.  In the case of an unexpected shutdown, the utxo cache needs\n// to be reconstructed from where the utxo cache was last flushed.  In order for the\n// utxo cache to be reconstructed, we always need to have the blocks since the utxo cache\n// flush last happened.\n//\n// Example: if the last flush hash was at height 100 and one of the deleted blocks was at\n// height 98, this function will return true.\nfunc (b *BlockChain) flushNeededAfterPrune(deletedBlockHashes []chainhash.Hash) (bool, error) {\n\tnode := b.index.LookupNode(&b.utxoCache.lastFlushHash)\n\tif node == nil {\n\t\t// If we couldn't find the node where we last flushed at, have the utxo cache\n\t\t// flush to be safe and that will set the last flush hash again.\n\t\t//\n\t\t// This realistically should never happen as nodes are never deleted from\n\t\t// the block index.  This happening likely means that there's a hardware\n\t\t// error which is something we can't recover from.  The best that we can\n\t\t// do here is to just force a flush and hope that the newly set\n\t\t// lastFlushHash doesn't error.\n\t\treturn true, nil\n\t}\n\n\tlastFlushHeight := node.Height()\n\n\t// Loop through all the block hashes and find out what the highest block height\n\t// among the deleted hashes is.\n\thighestDeletedHeight := int32(-1)\n\tfor _, deletedBlockHash := range deletedBlockHashes {\n\t\tnode := b.index.LookupNode(&deletedBlockHash)\n\t\tif node == nil {\n\t\t\t// If we couldn't find this node, just skip it and try the next\n\t\t\t// deleted hash.  This might be a corruption in the database\n\t\t\t// but there's nothing we can do here to address it except for\n\t\t\t// moving onto the next block.\n\t\t\tcontinue\n\t\t}\n\t\tif node.height > highestDeletedHeight {\n\t\t\thighestDeletedHeight = node.height\n\t\t}\n\t}\n\n\treturn highestDeletedHeight >= lastFlushHeight, nil\n}\n"
  },
  {
    "path": "blockchain/utxocache_test.go",
    "content": "// Copyright (c) 2023 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\npackage blockchain\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/database/ffldb\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nfunc TestMapSlice(t *testing.T) {\n\ttests := []struct {\n\t\tkeys []wire.OutPoint\n\t}{\n\t\t{\n\t\t\tkeys: func() []wire.OutPoint {\n\t\t\t\toutPoints := make([]wire.OutPoint, 1000)\n\t\t\t\tfor i := uint32(0); i < uint32(len(outPoints)); i++ {\n\t\t\t\t\tvar buf [4]byte\n\t\t\t\t\tbinary.BigEndian.PutUint32(buf[:], i)\n\t\t\t\t\thash := sha256.Sum256(buf[:])\n\n\t\t\t\t\top := wire.OutPoint{Hash: hash, Index: i}\n\t\t\t\t\toutPoints[i] = op\n\t\t\t\t}\n\t\t\t\treturn outPoints\n\t\t\t}(),\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tm := make(map[wire.OutPoint]*UtxoEntry)\n\n\t\tmaxSize := calculateRoughMapSize(1000, bucketSize)\n\n\t\tmaxEntriesFirstMap := 500\n\t\tms1 := make(map[wire.OutPoint]*UtxoEntry, maxEntriesFirstMap)\n\t\tms := mapSlice{\n\t\t\tmaps:                []map[wire.OutPoint]*UtxoEntry{ms1},\n\t\t\tmaxEntries:          []int{maxEntriesFirstMap},\n\t\t\tmaxTotalMemoryUsage: uint64(maxSize),\n\t\t}\n\n\t\tfor _, key := range test.keys {\n\t\t\tm[key] = nil\n\t\t\tms.put(key, nil, 0)\n\t\t}\n\n\t\t// Put in the same elements twice to test that the map slice won't hold duplicates.\n\t\tfor _, key := range test.keys {\n\t\t\tm[key] = nil\n\t\t\tms.put(key, nil, 0)\n\t\t}\n\n\t\tif len(m) != ms.length() {\n\t\t\tt.Fatalf(\"expected len of %d, got %d\", len(m), ms.length())\n\t\t}\n\n\t\t// Delete the first element in the first map.\n\t\tms.delete(test.keys[0])\n\t\tdelete(m, test.keys[0])\n\n\t\t// Try to insert the last element in the mapslice again.\n\t\tms.put(test.keys[len(test.keys)-1], &UtxoEntry{}, 0)\n\t\tm[test.keys[len(test.keys)-1]] = &UtxoEntry{}\n\n\t\t// Check that the duplicate didn't make it in.\n\t\tif len(m) != ms.length() {\n\t\t\tt.Fatalf(\"expected len of %d, got %d\", len(m), ms.length())\n\t\t}\n\n\t\tms.put(test.keys[0], &UtxoEntry{}, 0)\n\t\tm[test.keys[0]] = &UtxoEntry{}\n\n\t\tif len(m) != ms.length() {\n\t\t\tt.Fatalf(\"expected len of %d, got %d\", len(m), ms.length())\n\t\t}\n\n\t\tfor _, key := range test.keys {\n\t\t\texpected, found := m[key]\n\t\t\tif !found {\n\t\t\t\tt.Fatalf(\"expected key %s to exist in the go map\", key.String())\n\t\t\t}\n\n\t\t\tgot, found := ms.get(key)\n\t\t\tif !found {\n\t\t\t\tt.Fatalf(\"expected key %s to exist in the map slice\", key.String())\n\t\t\t}\n\n\t\t\tif !reflect.DeepEqual(got, expected) {\n\t\t\t\tt.Fatalf(\"expected value of %v, got %v\", expected, got)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestMapsliceConcurrency just tests that the mapslice won't result in a panic\n// on concurrent access.\nfunc TestMapsliceConcurrency(t *testing.T) {\n\ttests := []struct {\n\t\tkeys []wire.OutPoint\n\t}{\n\t\t{\n\t\t\tkeys: func() []wire.OutPoint {\n\t\t\t\toutPoints := make([]wire.OutPoint, 10000)\n\t\t\t\tfor i := uint32(0); i < uint32(len(outPoints)); i++ {\n\t\t\t\t\tvar buf [4]byte\n\t\t\t\t\tbinary.BigEndian.PutUint32(buf[:], i)\n\t\t\t\t\thash := sha256.Sum256(buf[:])\n\n\t\t\t\t\top := wire.OutPoint{Hash: hash, Index: i}\n\t\t\t\t\toutPoints[i] = op\n\t\t\t\t}\n\t\t\t\treturn outPoints\n\t\t\t}(),\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tmaxSize := calculateRoughMapSize(1000, bucketSize)\n\n\t\tmaxEntriesFirstMap := 500\n\t\tms1 := make(map[wire.OutPoint]*UtxoEntry, maxEntriesFirstMap)\n\t\tms := mapSlice{\n\t\t\tmaps:                []map[wire.OutPoint]*UtxoEntry{ms1},\n\t\t\tmaxEntries:          []int{maxEntriesFirstMap},\n\t\t\tmaxTotalMemoryUsage: uint64(maxSize),\n\t\t}\n\n\t\tvar wg sync.WaitGroup\n\n\t\twg.Add(1)\n\t\tgo func(m *mapSlice, keys []wire.OutPoint) {\n\t\t\tdefer wg.Done()\n\t\t\tfor i := 0; i < 5000; i++ {\n\t\t\t\tm.put(keys[i], nil, 0)\n\t\t\t}\n\t\t}(&ms, test.keys)\n\n\t\twg.Add(1)\n\t\tgo func(m *mapSlice, keys []wire.OutPoint) {\n\t\t\tdefer wg.Done()\n\t\t\tfor i := 5000; i < 10000; i++ {\n\t\t\t\tm.put(keys[i], nil, 0)\n\t\t\t}\n\t\t}(&ms, test.keys)\n\n\t\twg.Add(1)\n\t\tgo func(m *mapSlice) {\n\t\t\tdefer wg.Done()\n\t\t\tfor i := 0; i < 10000; i++ {\n\t\t\t\tm.size()\n\t\t\t}\n\t\t}(&ms)\n\n\t\twg.Add(1)\n\t\tgo func(m *mapSlice) {\n\t\t\tdefer wg.Done()\n\t\t\tfor i := 0; i < 10000; i++ {\n\t\t\t\tm.length()\n\t\t\t}\n\t\t}(&ms)\n\n\t\twg.Add(1)\n\t\tgo func(m *mapSlice, keys []wire.OutPoint) {\n\t\t\tdefer wg.Done()\n\t\t\tfor i := 0; i < 10000; i++ {\n\t\t\t\tm.get(keys[i])\n\t\t\t}\n\t\t}(&ms, test.keys)\n\n\t\twg.Add(1)\n\t\tgo func(m *mapSlice, keys []wire.OutPoint) {\n\t\t\tdefer wg.Done()\n\t\t\tfor i := 0; i < 5000; i++ {\n\t\t\t\tm.delete(keys[i])\n\t\t\t}\n\t\t}(&ms, test.keys)\n\n\t\twg.Wait()\n\t}\n}\n\n// getValidP2PKHScript returns a valid P2PKH script.  Useful as unspendables cannot be\n// added to the cache.\nfunc getValidP2PKHScript() []byte {\n\tvalidP2PKHScript := []byte{\n\t\t// OP_DUP\n\t\t0x76,\n\t\t// OP_HASH160\n\t\t0xa9,\n\t\t// OP_DATA_20\n\t\t0x14,\n\t\t// <20-byte pubkey hash>\n\t\t0xf0, 0x7a, 0xb8, 0xce, 0x72, 0xda, 0x4e, 0x76,\n\t\t0x0b, 0x74, 0x7d, 0x48, 0xd6, 0x65, 0xec, 0x96,\n\t\t0xad, 0xf0, 0x24, 0xf5,\n\t\t// OP_EQUALVERIFY\n\t\t0x88,\n\t\t// OP_CHECKSIG\n\t\t0xac,\n\t}\n\treturn validP2PKHScript\n}\n\n// outpointFromInt generates an outpoint from an int by hashing the int and making\n// the given int the index.\nfunc outpointFromInt(i int) wire.OutPoint {\n\t// Boilerplate to create an outpoint.\n\tvar buf [4]byte\n\tbinary.BigEndian.PutUint32(buf[:], uint32(i))\n\thash := sha256.Sum256(buf[:])\n\treturn wire.OutPoint{Hash: hash, Index: uint32(i)}\n}\n\nfunc TestUtxoCacheEntrySize(t *testing.T) {\n\ttype block struct {\n\t\ttxOuts []*wire.TxOut\n\t\toutOps []wire.OutPoint\n\t\ttxIns  []*wire.TxIn\n\t}\n\ttests := []struct {\n\t\tname         string\n\t\tblocks       []block\n\t\texpectedSize uint64\n\t}{\n\t\t{\n\t\t\tname: \"one entry\",\n\t\t\tblocks: func() []block {\n\t\t\t\treturn []block{\n\t\t\t\t\t{\n\t\t\t\t\t\ttxOuts: []*wire.TxOut{\n\t\t\t\t\t\t\t{Value: 10000, PkScript: getValidP2PKHScript()},\n\t\t\t\t\t\t},\n\t\t\t\t\t\toutOps: []wire.OutPoint{\n\t\t\t\t\t\t\toutpointFromInt(0),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}(),\n\t\t\texpectedSize: pubKeyHashLen + baseEntrySize,\n\t\t},\n\t\t{\n\t\t\tname: \"10 entries, 4 spend\",\n\t\t\tblocks: func() []block {\n\t\t\t\tblocks := make([]block, 0, 10)\n\t\t\t\tfor i := 0; i < 10; i++ {\n\t\t\t\t\top := outpointFromInt(i)\n\n\t\t\t\t\tblock := block{\n\t\t\t\t\t\ttxOuts: []*wire.TxOut{\n\t\t\t\t\t\t\t{Value: 10000, PkScript: getValidP2PKHScript()},\n\t\t\t\t\t\t},\n\t\t\t\t\t\toutOps: []wire.OutPoint{\n\t\t\t\t\t\t\top,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\n\t\t\t\t\t// Spend all outs in blocks less than 4.\n\t\t\t\t\tif i < 4 {\n\t\t\t\t\t\tblock.txIns = []*wire.TxIn{\n\t\t\t\t\t\t\t{PreviousOutPoint: op},\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tblocks = append(blocks, block)\n\t\t\t\t}\n\t\t\t\treturn blocks\n\t\t\t}(),\n\t\t\t// Multiplied by 6 since we'll have 6 entries left.\n\t\t\texpectedSize: (pubKeyHashLen + baseEntrySize) * 6,\n\t\t},\n\t\t{\n\t\t\tname: \"spend everything\",\n\t\t\tblocks: func() []block {\n\t\t\t\tblocks := make([]block, 0, 500)\n\t\t\t\tfor i := 0; i < 500; i++ {\n\t\t\t\t\top := outpointFromInt(i)\n\n\t\t\t\t\tblock := block{\n\t\t\t\t\t\ttxOuts: []*wire.TxOut{\n\t\t\t\t\t\t\t{Value: 1000, PkScript: getValidP2PKHScript()},\n\t\t\t\t\t\t},\n\t\t\t\t\t\toutOps: []wire.OutPoint{\n\t\t\t\t\t\t\top,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\n\t\t\t\t\t// Spend all outs in blocks less than 4.\n\t\t\t\t\tblock.txIns = []*wire.TxIn{\n\t\t\t\t\t\t{PreviousOutPoint: op},\n\t\t\t\t\t}\n\n\t\t\t\t\tblocks = append(blocks, block)\n\t\t\t\t}\n\t\t\t\treturn blocks\n\t\t\t}(),\n\t\t\texpectedSize: 0,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Size is just something big enough so that the mapslice doesn't\n\t\t// run out of memory.\n\t\ts := newUtxoCache(nil, 1*1024*1024)\n\n\t\tfor height, block := range test.blocks {\n\t\t\tfor i, out := range block.txOuts {\n\t\t\t\ts.addTxOut(block.outOps[i], out, true, int32(height))\n\t\t\t}\n\n\t\t\tfor _, in := range block.txIns {\n\t\t\t\ts.addTxIn(in, nil)\n\t\t\t}\n\t\t}\n\n\t\tif s.totalEntryMemory != test.expectedSize {\n\t\t\tt.Errorf(\"Failed test %s. Expected size of %d, got %d\",\n\t\t\t\ttest.name, test.expectedSize, s.totalEntryMemory)\n\t\t}\n\t}\n}\n\n// assertConsistencyState asserts the utxo consistency states of the blockchain.\nfunc assertConsistencyState(chain *BlockChain, hash *chainhash.Hash) error {\n\tvar bytes []byte\n\terr := chain.db.View(func(dbTx database.Tx) (err error) {\n\t\tbytes = dbFetchUtxoStateConsistency(dbTx)\n\t\treturn\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Error fetching utxo state consistency: %v\", err)\n\t}\n\tactualHash, err := chainhash.NewHash(bytes)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !actualHash.IsEqual(hash) {\n\t\treturn fmt.Errorf(\"Unexpected consistency hash: %v instead of %v\",\n\t\t\tactualHash, hash)\n\t}\n\n\treturn nil\n}\n\n// assertNbEntriesOnDisk asserts that the total number of utxo entries on the\n// disk is equal to the given expected number.\nfunc assertNbEntriesOnDisk(chain *BlockChain, expectedNumber int) error {\n\tvar nb int\n\terr := chain.db.View(func(dbTx database.Tx) error {\n\t\tcursor := dbTx.Metadata().Bucket(utxoSetBucketName).Cursor()\n\t\tnb = 0\n\t\tfor b := cursor.First(); b; b = cursor.Next() {\n\t\t\tnb++\n\t\t\t_, err := deserializeUtxoEntry(cursor.Value())\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"Failed to deserialize entry: %v\", err)\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Error fetching utxo entries: %v\", err)\n\t}\n\tif nb != expectedNumber {\n\t\treturn fmt.Errorf(\"Expected %d elements in the UTXO set, but found %d\",\n\t\t\texpectedNumber, nb)\n\t}\n\n\treturn nil\n}\n\n// utxoCacheTestChain creates a test BlockChain to be used for utxo cache tests.\n// It uses the regression test parameters, a coin matutiry of 1 block and sets\n// the cache size limit to 10 MiB.\nfunc utxoCacheTestChain(testName string) (*BlockChain, *chaincfg.Params, func()) {\n\tparams := chaincfg.RegressionNetParams\n\tchain, tearDown, err := chainSetup(testName, &params)\n\tif err != nil {\n\t\tpanic(fmt.Sprintf(\"error loading blockchain with database: %v\", err))\n\t}\n\n\tchain.TstSetCoinbaseMaturity(1)\n\tchain.utxoCache.maxTotalMemoryUsage = 10 * 1024 * 1024\n\tchain.utxoCache.cachedEntries.maxTotalMemoryUsage = chain.utxoCache.maxTotalMemoryUsage\n\n\treturn chain, &params, tearDown\n}\n\nfunc TestUtxoCacheFlush(t *testing.T) {\n\tchain, params, tearDown := utxoCacheTestChain(\"TestUtxoCacheFlush\")\n\tdefer tearDown()\n\tcache := chain.utxoCache\n\ttip := btcutil.NewBlock(params.GenesisBlock)\n\n\t// The chainSetup init triggers the consistency status write.\n\terr := assertConsistencyState(chain, params.GenesisHash)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\terr = assertNbEntriesOnDisk(chain, 0)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// LastFlushHash starts with genesis.\n\tif cache.lastFlushHash != *params.GenesisHash {\n\t\tt.Fatalf(\"lastFlushHash before first flush expected to be \"+\n\t\t\t\"genesis block hash, instead was %v\", cache.lastFlushHash)\n\t}\n\n\t// First, add 10 utxos without flushing.\n\toutPoints := make([]wire.OutPoint, 10)\n\tfor i := range outPoints {\n\t\top := outpointFromInt(i)\n\t\toutPoints[i] = op\n\n\t\t// Add the txout.\n\t\ttxOut := wire.TxOut{Value: 10000, PkScript: getValidP2PKHScript()}\n\t\tcache.addTxOut(op, &txOut, true, int32(i))\n\t}\n\n\tif cache.cachedEntries.length() != len(outPoints) {\n\t\tt.Fatalf(\"Expected 10 entries, has %d instead\", cache.cachedEntries.length())\n\t}\n\n\t// All entries should be fresh and modified.\n\tfor _, m := range cache.cachedEntries.maps {\n\t\tfor outpoint, entry := range m {\n\t\t\tif entry == nil {\n\t\t\t\tt.Fatalf(\"Unexpected nil entry found for %v\", outpoint)\n\t\t\t}\n\t\t\tif !entry.isModified() {\n\t\t\t\tt.Fatal(\"Entry should be marked modified\")\n\t\t\t}\n\t\t\tif !entry.isFresh() {\n\t\t\t\tt.Fatal(\"Entry should be marked fresh\")\n\t\t\t}\n\t\t}\n\t}\n\n\t// Spend the last outpoint and pop it off from the outpoints slice.\n\tvar spendOp wire.OutPoint\n\tspendOp, outPoints = outPoints[len(outPoints)-1], outPoints[:len(outPoints)-1]\n\tcache.addTxIn(&wire.TxIn{PreviousOutPoint: spendOp}, nil)\n\n\tif cache.cachedEntries.length() != len(outPoints) {\n\t\tt.Fatalf(\"Expected %d entries, has %d instead\",\n\t\t\tlen(outPoints), cache.cachedEntries.length())\n\t}\n\n\t// Not flushed yet.\n\terr = assertConsistencyState(chain, params.GenesisHash)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\terr = assertNbEntriesOnDisk(chain, 0)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Flush.\n\terr = chain.db.Update(func(dbTx database.Tx) error {\n\t\treturn cache.flush(dbTx, FlushRequired, chain.stateSnapshot)\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"unexpected error while flushing cache: %v\", err)\n\t}\n\tif cache.cachedEntries.length() != 0 {\n\t\tt.Fatalf(\"Expected 0 entries, has %d instead\", cache.cachedEntries.length())\n\t}\n\n\terr = assertConsistencyState(chain, tip.Hash())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\terr = assertNbEntriesOnDisk(chain, len(outPoints))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Fetch the flushed utxos.\n\tentries, err := cache.fetchEntries(outPoints)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Check that the returned entries are not marked fresh and modified.\n\tfor _, entry := range entries {\n\t\tif entry.isFresh() {\n\t\t\tt.Fatal(\"Entry should not be marked fresh\")\n\t\t}\n\t\tif entry.isModified() {\n\t\t\tt.Fatal(\"Entry should not be marked modified\")\n\t\t}\n\t}\n\n\t// Check that the fetched entries in the cache are not marked fresh and modified.\n\tfor _, m := range cache.cachedEntries.maps {\n\t\tfor outpoint, elem := range m {\n\t\t\tif elem == nil {\n\t\t\t\tt.Fatalf(\"Unexpected nil entry found for %v\", outpoint)\n\t\t\t}\n\t\t\tif elem.isFresh() {\n\t\t\t\tt.Fatal(\"Entry should not be marked fresh\")\n\t\t\t}\n\t\t\tif elem.isModified() {\n\t\t\t\tt.Fatal(\"Entry should not be marked modified\")\n\t\t\t}\n\t\t}\n\t}\n\n\t// Spend 5 utxos.\n\tprevLen := len(outPoints)\n\tfor i := 0; i < 5; i++ {\n\t\tspendOp, outPoints = outPoints[len(outPoints)-1], outPoints[:len(outPoints)-1]\n\t\tcache.addTxIn(&wire.TxIn{PreviousOutPoint: spendOp}, nil)\n\t}\n\n\t// Should still have the entries in cache so they can be flushed to disk.\n\tif cache.cachedEntries.length() != prevLen {\n\t\tt.Fatalf(\"Expected 10 entries, has %d instead\", cache.cachedEntries.length())\n\t}\n\n\t// Flush.\n\terr = chain.db.Update(func(dbTx database.Tx) error {\n\t\treturn cache.flush(dbTx, FlushRequired, chain.stateSnapshot)\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"unexpected error while flushing cache: %v\", err)\n\t}\n\tif cache.cachedEntries.length() != 0 {\n\t\tt.Fatalf(\"Expected 0 entries, has %d instead\", cache.cachedEntries.length())\n\t}\n\n\terr = assertConsistencyState(chain, tip.Hash())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\terr = assertNbEntriesOnDisk(chain, len(outPoints))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Add 5 utxos without flushing and test for periodic flushes.\n\toutPoints1 := make([]wire.OutPoint, 5)\n\tfor i := range outPoints1 {\n\t\t// i + prevLen here to avoid collision since we're just hashing\n\t\t// the int.\n\t\top := outpointFromInt(i + prevLen)\n\t\toutPoints1[i] = op\n\n\t\t// Add the txout.\n\t\ttxOut := wire.TxOut{Value: 10000, PkScript: getValidP2PKHScript()}\n\t\tcache.addTxOut(op, &txOut, true, int32(i+prevLen))\n\t}\n\tif cache.cachedEntries.length() != len(outPoints1) {\n\t\tt.Fatalf(\"Expected %d entries, has %d instead\",\n\t\t\tlen(outPoints1), cache.cachedEntries.length())\n\t}\n\n\t// Attempt to flush with flush periodic.  Shouldn't flush.\n\terr = chain.db.Update(func(dbTx database.Tx) error {\n\t\treturn cache.flush(dbTx, FlushPeriodic, chain.stateSnapshot)\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"unexpected error while flushing cache: %v\", err)\n\t}\n\tif cache.cachedEntries.length() == 0 {\n\t\tt.Fatalf(\"Expected %d entries, has %d instead\",\n\t\t\tlen(outPoints1), cache.cachedEntries.length())\n\t}\n\n\t// Arbitrarily set the last flush time to 6 minutes ago.\n\tcache.lastFlushTime = time.Now().Add(-time.Minute * 6)\n\n\t// Attempt to flush with flush periodic.  Should flush now.\n\terr = chain.db.Update(func(dbTx database.Tx) error {\n\t\treturn cache.flush(dbTx, FlushPeriodic, chain.stateSnapshot)\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"unexpected error while flushing cache: %v\", err)\n\t}\n\tif cache.cachedEntries.length() != 0 {\n\t\tt.Fatalf(\"Expected 0 entries, has %d instead\", cache.cachedEntries.length())\n\t}\n\n\terr = assertConsistencyState(chain, tip.Hash())\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\terr = assertNbEntriesOnDisk(chain, len(outPoints)+len(outPoints1))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n}\n\nfunc TestFlushNeededAfterPrune(t *testing.T) {\n\t// Construct a synthetic block chain with a block index consisting of\n\t// the following structure.\n\t// \tgenesis -> 1 -> 2 -> ... -> 15 -> 16  -> 17  -> 18\n\ttip := tstTip\n\tchain := newFakeChain(&chaincfg.MainNetParams)\n\tchain.utxoCache = newUtxoCache(nil, 0)\n\tbranchNodes := chainedNodes(chain.bestChain.Genesis(), 18)\n\tfor _, node := range branchNodes {\n\t\tchain.index.SetStatusFlags(node, statusValid)\n\t\tchain.index.AddNode(node)\n\t}\n\tchain.bestChain.SetTip(tip(branchNodes))\n\n\ttests := []struct {\n\t\tname          string\n\t\tlastFlushHash chainhash.Hash\n\t\tdelHashes     []chainhash.Hash\n\t\texpected      bool\n\t}{\n\t\t{\n\t\t\tname: \"deleted block up to height 9, last flush hash at block 10\",\n\t\t\tdelHashes: func() []chainhash.Hash {\n\t\t\t\tdelBlockHashes := make([]chainhash.Hash, 0, 9)\n\t\t\t\tfor i := range branchNodes {\n\t\t\t\t\tif branchNodes[i].height < 10 {\n\t\t\t\t\t\tdelBlockHashes = append(delBlockHashes, branchNodes[i].hash)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn delBlockHashes\n\t\t\t}(),\n\t\t\tlastFlushHash: func() chainhash.Hash {\n\t\t\t\t// Just some sanity checking to make sure the height is 10.\n\t\t\t\tif branchNodes[9].height != 10 {\n\t\t\t\t\tpanic(\"was looking for height 10\")\n\t\t\t\t}\n\t\t\t\treturn branchNodes[9].hash\n\t\t\t}(),\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname: \"deleted blocks up to height 10, last flush hash at block 10\",\n\t\t\tdelHashes: func() []chainhash.Hash {\n\t\t\t\tdelBlockHashes := make([]chainhash.Hash, 0, 10)\n\t\t\t\tfor i := range branchNodes {\n\t\t\t\t\tif branchNodes[i].height < 11 {\n\t\t\t\t\t\tdelBlockHashes = append(delBlockHashes, branchNodes[i].hash)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn delBlockHashes\n\t\t\t}(),\n\t\t\tlastFlushHash: func() chainhash.Hash {\n\t\t\t\t// Just some sanity checking to make sure the height is 10.\n\t\t\t\tif branchNodes[9].height != 10 {\n\t\t\t\t\tpanic(\"was looking for height 10\")\n\t\t\t\t}\n\t\t\t\treturn branchNodes[9].hash\n\t\t\t}(),\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname: \"deleted block height 17, last flush hash at block 5\",\n\t\t\tdelHashes: func() []chainhash.Hash {\n\t\t\t\tdelBlockHashes := make([]chainhash.Hash, 1)\n\t\t\t\tdelBlockHashes[0] = branchNodes[16].hash\n\t\t\t\t// Just some sanity checking to make sure the height is 10.\n\t\t\t\tif branchNodes[16].height != 17 {\n\t\t\t\t\tpanic(\"was looking for height 17\")\n\t\t\t\t}\n\t\t\t\treturn delBlockHashes\n\t\t\t}(),\n\t\t\tlastFlushHash: func() chainhash.Hash {\n\t\t\t\t// Just some sanity checking to make sure the height is 10.\n\t\t\t\tif branchNodes[4].height != 5 {\n\t\t\t\t\tpanic(\"was looking for height 5\")\n\t\t\t\t}\n\t\t\t\treturn branchNodes[4].hash\n\t\t\t}(),\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname: \"deleted block height 3, last flush hash at block 4\",\n\t\t\tdelHashes: func() []chainhash.Hash {\n\t\t\t\tdelBlockHashes := make([]chainhash.Hash, 1)\n\t\t\t\tdelBlockHashes[0] = branchNodes[2].hash\n\t\t\t\t// Just some sanity checking to make sure the height is 10.\n\t\t\t\tif branchNodes[2].height != 3 {\n\t\t\t\t\tpanic(\"was looking for height 3\")\n\t\t\t\t}\n\t\t\t\treturn delBlockHashes\n\t\t\t}(),\n\t\t\tlastFlushHash: func() chainhash.Hash {\n\t\t\t\t// Just some sanity checking to make sure the height is 10.\n\t\t\t\tif branchNodes[3].height != 4 {\n\t\t\t\t\tpanic(\"was looking for height 4\")\n\t\t\t\t}\n\t\t\t\treturn branchNodes[3].hash\n\t\t\t}(),\n\t\t\texpected: false,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tchain.utxoCache.lastFlushHash = test.lastFlushHash\n\t\tgot, err := chain.flushNeededAfterPrune(test.delHashes)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif got != test.expected {\n\t\t\tt.Fatalf(\"for test %s, expected need flush to return %v but got %v\",\n\t\t\t\ttest.name, test.expected, got)\n\t\t}\n\t}\n}\n\nfunc TestFlushOnPrune(t *testing.T) {\n\tchain, tearDown, err := chainSetup(\"TestFlushOnPrune\", &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tpanic(fmt.Sprintf(\"error loading blockchain with database: %v\", err))\n\t}\n\tdefer tearDown()\n\n\tchain.utxoCache.maxTotalMemoryUsage = 10 * 1024 * 1024\n\tchain.utxoCache.cachedEntries.maxTotalMemoryUsage = chain.utxoCache.maxTotalMemoryUsage\n\n\t// Set the maxBlockFileSize and the prune target small so that we can trigger a\n\t// prune to happen.\n\tmaxBlockFileSize := uint32(8192)\n\tchain.pruneTarget = uint64(maxBlockFileSize) * 2\n\n\t// Read blocks from the file.\n\tblocks, err := loadBlocks(\"blk_0_to_14131.dat\")\n\tif err != nil {\n\t\tt.Fatalf(\"failed to read block from file. %v\", err)\n\t}\n\n\tsyncBlocks := func() {\n\t\t// Modify block 1 to be a different hash.  This is to artificially\n\t\t// create a stale branch in the chain.\n\t\tstaleMsgBlock := blocks[1].MsgBlock().Copy()\n\t\tstaleMsgBlock.Header.Nonce = 0\n\t\tstaleBlock := btcutil.NewBlock(staleMsgBlock)\n\n\t\t// Add the stale block here to create a chain view like so. The\n\t\t// block will be the main chain at first but become stale as we\n\t\t// keep adding blocks.  BFNoPoWCheck is given as the pow check will\n\t\t// fail.\n\t\t//\n\t\t// (genesis block) -> 1 -> 2 -> 3 -> ...\n\t\t//                \\-> 1a\n\t\t_, _, err = chain.ProcessBlock(staleBlock, BFNoPoWCheck)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tfor i, block := range blocks {\n\t\t\tif i == 0 {\n\t\t\t\t// Skip the genesis block.\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t_, _, err = chain.ProcessBlock(block, BFNone)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to process block %v(%v). %v\",\n\t\t\t\t\tblock.Hash().String(), block.Height(), err)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Sync the chain.\n\tffldb.TstRunWithMaxBlockFileSize(chain.db, maxBlockFileSize, syncBlocks)\n\n\t// Function that errors out if the block that should exist doesn't exist.\n\tshouldExist := func(dbTx database.Tx, blockHash *chainhash.Hash) error {\n\t\tbytes, err := dbTx.FetchBlock(blockHash)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tblock, err := btcutil.NewBlockFromBytes(bytes)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"didn't find block %v. %v\", blockHash, err)\n\t\t}\n\n\t\tif !block.Hash().IsEqual(blockHash) {\n\t\t\treturn fmt.Errorf(\"expected to find block %v but got %v\",\n\t\t\t\tblockHash, block.Hash())\n\t\t}\n\n\t\treturn nil\n\t}\n\n\t// Function that errors out if the block that shouldn't exist exists.\n\tshouldNotExist := func(dbTx database.Tx, blockHash *chainhash.Hash) error {\n\t\tbytes, err := dbTx.FetchBlock(chaincfg.MainNetParams.GenesisHash)\n\t\tif err == nil {\n\t\t\treturn fmt.Errorf(\"expected block %s to be pruned\", blockHash.String())\n\t\t}\n\t\tif len(bytes) != 0 {\n\t\t\treturn fmt.Errorf(\"expected block %s to be pruned but got %v\",\n\t\t\t\tblockHash, bytes)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\t// The below code checks that the correct blocks were pruned.\n\terr = chain.db.View(func(dbTx database.Tx) error {\n\t\texist := false\n\t\tfor _, block := range blocks {\n\t\t\t// Blocks up to the last flush hash should not exist.\n\t\t\t// The utxocache is big enough so that it shouldn't flush\n\t\t\t// on it being full.  It should only flush on prunes.\n\t\t\tif block.Hash().IsEqual(&chain.utxoCache.lastFlushHash) {\n\t\t\t\texist = true\n\t\t\t}\n\n\t\t\tif exist {\n\t\t\t\terr = shouldExist(dbTx, block.Hash())\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terr = shouldNotExist(dbTx, block.Hash())\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n}\n\nfunc TestInitConsistentState(t *testing.T) {\n\t//  Boilerplate for creating a chain.\n\tdbName := \"TestFlushOnPrune\"\n\tchain, tearDown, err := chainSetup(dbName, &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tpanic(fmt.Sprintf(\"error loading blockchain with database: %v\", err))\n\t}\n\tdefer tearDown()\n\tchain.utxoCache.maxTotalMemoryUsage = 10 * 1024 * 1024\n\tchain.utxoCache.cachedEntries.maxTotalMemoryUsage = chain.utxoCache.maxTotalMemoryUsage\n\n\t// Read blocks from the file.\n\tblocks, err := loadBlocks(\"blk_0_to_14131.dat\")\n\tif err != nil {\n\t\tt.Fatalf(\"failed to read block from file. %v\", err)\n\t}\n\n\t// Sync up to height 13,000.  Flush the utxocache at height 11_000.\n\tcacheFlushHeight := 9000\n\tinitialSyncHeight := 12_000\n\tfor i, block := range blocks {\n\t\tif i == 0 {\n\t\t\t// Skip the genesis block.\n\t\t\tcontinue\n\t\t}\n\n\t\tisMainChain, _, err := chain.ProcessBlock(block, BFNone)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif !isMainChain {\n\t\t\tt.Fatalf(\"expected block %s to be on the main chain\", block.Hash())\n\t\t}\n\n\t\tif i == cacheFlushHeight {\n\t\t\terr = chain.FlushUtxoCache(FlushRequired)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t}\n\t\tif i == initialSyncHeight {\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// Sanity check.\n\tif chain.BestSnapshot().Height != int32(initialSyncHeight) {\n\t\tt.Fatalf(\"expected the chain to sync up to height %d\", initialSyncHeight)\n\t}\n\n\t// Close the database without flushing the utxocache.  This leaves the\n\t// chaintip at height 13,000 but the utxocache consistent state at 11,000.\n\terr = chain.db.Close()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tchain.db = nil\n\n\t// Re-open the database and pass the re-opened db to internal structs.\n\tdbPath := filepath.Join(testDbRoot, dbName)\n\tndb, err := database.Open(testDbType, dbPath, blockDataNet)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tchain.db = ndb\n\tchain.utxoCache.db = ndb\n\tchain.index.db = ndb\n\n\t// Sanity check to see that the utxo cache was flushed before the\n\t// current chain tip.\n\tvar statusBytes []byte\n\tndb.View(func(dbTx database.Tx) error {\n\t\tstatusBytes = dbFetchUtxoStateConsistency(dbTx)\n\t\treturn nil\n\t})\n\tstatusHash, err := chainhash.NewHash(statusBytes)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif !statusHash.IsEqual(blocks[cacheFlushHeight].Hash()) {\n\t\tt.Fatalf(\"expected the utxocache to be flushed at \"+\n\t\t\t\"block hash %s but got %s\",\n\t\t\tblocks[cacheFlushHeight].Hash(), statusHash)\n\t}\n\n\t// Call InitConsistentState.  This will make the utxocache catch back\n\t// up to the tip.\n\terr = chain.InitConsistentState(chain.bestChain.tip(), nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Sync the reset of the blocks.\n\tfor i, block := range blocks {\n\t\tif i <= initialSyncHeight {\n\t\t\tcontinue\n\t\t}\n\t\tisMainChain, _, err := chain.ProcessBlock(block, BFNone)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif !isMainChain {\n\t\t\tt.Fatalf(\"expected block %s to be on the main chain\", block.Hash())\n\t\t}\n\t}\n\n\tif chain.BestSnapshot().Height != blocks[len(blocks)-1].Height() {\n\t\tt.Fatalf(\"expected the chain to sync up to height %d\",\n\t\t\tblocks[len(blocks)-1].Height())\n\t}\n}\n"
  },
  {
    "path": "blockchain/utxoviewpoint.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// txoFlags is a bitmask defining additional information and state for a\n// transaction output in a utxo view.\ntype txoFlags uint8\n\nconst (\n\t// tfCoinBase indicates that a txout was contained in a coinbase tx.\n\ttfCoinBase txoFlags = 1 << iota\n\n\t// tfSpent indicates that a txout is spent.\n\ttfSpent\n\n\t// tfModified indicates that a txout has been modified since it was\n\t// loaded.\n\ttfModified\n\n\t// tfFresh indicates that the entry is fresh.  This means that the parent\n\t// view never saw this entry.  Note that tfFresh is a performance\n\t// optimization with which we can erase entries that are fully spent if we\n\t// know we do not need to commit them.  It is always safe to not mark\n\t// tfFresh if that condition is not guaranteed.\n\ttfFresh\n)\n\n// UtxoEntry houses details about an individual transaction output in a utxo\n// view such as whether or not it was contained in a coinbase tx, the height of\n// the block that contains the tx, whether or not it is spent, its public key\n// script, and how much it pays.\ntype UtxoEntry struct {\n\t// NOTE: Additions, deletions, or modifications to the order of the\n\t// definitions in this struct should not be changed without considering\n\t// how it affects alignment on 64-bit platforms.  The current order is\n\t// specifically crafted to result in minimal padding.  There will be a\n\t// lot of these in memory, so a few extra bytes of padding adds up.\n\n\tamount      int64\n\tpkScript    []byte // The public key script for the output.\n\tblockHeight int32  // Height of block containing tx.\n\n\t// packedFlags contains additional info about output such as whether it\n\t// is a coinbase, whether it is spent, and whether it has been modified\n\t// since it was loaded.  This approach is used in order to reduce memory\n\t// usage since there will be a lot of these in memory.\n\tpackedFlags txoFlags\n}\n\n// isModified returns whether or not the output has been modified since it was\n// loaded.\nfunc (entry *UtxoEntry) isModified() bool {\n\treturn entry.packedFlags&tfModified == tfModified\n}\n\n// isFresh returns whether or not it's certain the output has never previously\n// been stored in the database.\nfunc (entry *UtxoEntry) isFresh() bool {\n\treturn entry.packedFlags&tfFresh == tfFresh\n}\n\n// memoryUsage returns the memory usage in bytes of for the utxo entry.\n// It returns 0 for a nil entry.\nfunc (entry *UtxoEntry) memoryUsage() uint64 {\n\tif entry == nil {\n\t\treturn 0\n\t}\n\n\treturn baseEntrySize + uint64(cap(entry.pkScript))\n}\n\n// IsCoinBase returns whether or not the output was contained in a coinbase\n// transaction.\nfunc (entry *UtxoEntry) IsCoinBase() bool {\n\treturn entry.packedFlags&tfCoinBase == tfCoinBase\n}\n\n// BlockHeight returns the height of the block containing the output.\nfunc (entry *UtxoEntry) BlockHeight() int32 {\n\treturn entry.blockHeight\n}\n\n// IsSpent returns whether or not the output has been spent based upon the\n// current state of the unspent transaction output view it was obtained from.\nfunc (entry *UtxoEntry) IsSpent() bool {\n\treturn entry.packedFlags&tfSpent == tfSpent\n}\n\n// Spend marks the output as spent.  Spending an output that is already spent\n// has no effect.\nfunc (entry *UtxoEntry) Spend() {\n\t// Nothing to do if the output is already spent.\n\tif entry.IsSpent() {\n\t\treturn\n\t}\n\n\t// Mark the output as spent and modified.\n\tentry.packedFlags |= tfSpent | tfModified\n}\n\n// Amount returns the amount of the output.\nfunc (entry *UtxoEntry) Amount() int64 {\n\treturn entry.amount\n}\n\n// PkScript returns the public key script for the output.\nfunc (entry *UtxoEntry) PkScript() []byte {\n\treturn entry.pkScript\n}\n\n// Clone returns a shallow copy of the utxo entry.\nfunc (entry *UtxoEntry) Clone() *UtxoEntry {\n\tif entry == nil {\n\t\treturn nil\n\t}\n\n\treturn &UtxoEntry{\n\t\tamount:      entry.amount,\n\t\tpkScript:    entry.pkScript,\n\t\tblockHeight: entry.blockHeight,\n\t\tpackedFlags: entry.packedFlags,\n\t}\n}\n\n// NewUtxoEntry returns a new UtxoEntry built from the arguments.\nfunc NewUtxoEntry(\n\ttxOut *wire.TxOut, blockHeight int32, isCoinbase bool) *UtxoEntry {\n\tvar cbFlag txoFlags\n\tif isCoinbase {\n\t\tcbFlag |= tfCoinBase\n\t}\n\n\treturn &UtxoEntry{\n\t\tamount:      txOut.Value,\n\t\tpkScript:    txOut.PkScript,\n\t\tblockHeight: blockHeight,\n\t\tpackedFlags: cbFlag,\n\t}\n}\n\n// UtxoViewpoint represents a view into the set of unspent transaction outputs\n// from a specific point of view in the chain.  For example, it could be for\n// the end of the main chain, some point in the history of the main chain, or\n// down a side chain.\n//\n// The unspent outputs are needed by other transactions for things such as\n// script validation and double spend prevention.\ntype UtxoViewpoint struct {\n\tentries  map[wire.OutPoint]*UtxoEntry\n\tbestHash chainhash.Hash\n}\n\n// BestHash returns the hash of the best block in the chain the view currently\n// represents.\nfunc (view *UtxoViewpoint) BestHash() *chainhash.Hash {\n\treturn &view.bestHash\n}\n\n// SetBestHash sets the hash of the best block in the chain the view currently\n// represents.\nfunc (view *UtxoViewpoint) SetBestHash(hash *chainhash.Hash) {\n\tview.bestHash = *hash\n}\n\n// LookupEntry returns information about a given transaction output according to\n// the current state of the view.  It will return nil if the passed output does\n// not exist in the view or is otherwise not available such as when it has been\n// disconnected during a reorg.\nfunc (view *UtxoViewpoint) LookupEntry(outpoint wire.OutPoint) *UtxoEntry {\n\treturn view.entries[outpoint]\n}\n\n// FetchPrevOutput fetches the previous output referenced by the passed\n// outpoint. This is identical to the LookupEntry method, but it returns a\n// wire.TxOut instead.\n//\n// NOTE: This is an implementation of the txscript.PrevOutputFetcher interface.\nfunc (view *UtxoViewpoint) FetchPrevOutput(op wire.OutPoint) *wire.TxOut {\n\tprevOut := view.entries[op]\n\tif prevOut == nil {\n\t\treturn nil\n\t}\n\n\treturn &wire.TxOut{\n\t\tValue:    prevOut.amount,\n\t\tPkScript: prevOut.PkScript(),\n\t}\n}\n\n// addTxOut adds the specified output to the view if it is not provably\n// unspendable.  When the view already has an entry for the output, it will be\n// marked unspent.  All fields will be updated for existing entries since it's\n// possible it has changed during a reorg.\nfunc (view *UtxoViewpoint) addTxOut(outpoint wire.OutPoint, txOut *wire.TxOut, isCoinBase bool, blockHeight int32) {\n\t// Don't add provably unspendable outputs.\n\tif txscript.IsUnspendable(txOut.PkScript) {\n\t\treturn\n\t}\n\n\t// Update existing entries.  All fields are updated because it's\n\t// possible (although extremely unlikely) that the existing entry is\n\t// being replaced by a different transaction with the same hash.  This\n\t// is allowed so long as the previous transaction is fully spent.\n\tentry := view.LookupEntry(outpoint)\n\tif entry == nil {\n\t\tentry = new(UtxoEntry)\n\t\tview.entries[outpoint] = entry\n\t}\n\n\tentry.amount = txOut.Value\n\tentry.pkScript = txOut.PkScript\n\tentry.blockHeight = blockHeight\n\tentry.packedFlags = tfFresh | tfModified\n\tif isCoinBase {\n\t\tentry.packedFlags |= tfCoinBase\n\t}\n}\n\n// AddTxOut adds the specified output of the passed transaction to the view if\n// it exists and is not provably unspendable.  When the view already has an\n// entry for the output, it will be marked unspent.  All fields will be updated\n// for existing entries since it's possible it has changed during a reorg.\nfunc (view *UtxoViewpoint) AddTxOut(tx *btcutil.Tx, txOutIdx uint32, blockHeight int32) {\n\t// Can't add an output for an out of bounds index.\n\tif txOutIdx >= uint32(len(tx.MsgTx().TxOut)) {\n\t\treturn\n\t}\n\n\t// Update existing entries.  All fields are updated because it's\n\t// possible (although extremely unlikely) that the existing entry is\n\t// being replaced by a different transaction with the same hash.  This\n\t// is allowed so long as the previous transaction is fully spent.\n\tprevOut := wire.OutPoint{Hash: *tx.Hash(), Index: txOutIdx}\n\ttxOut := tx.MsgTx().TxOut[txOutIdx]\n\tview.addTxOut(prevOut, txOut, IsCoinBase(tx), blockHeight)\n}\n\n// AddTxOuts adds all outputs in the passed transaction which are not provably\n// unspendable to the view.  When the view already has entries for any of the\n// outputs, they are simply marked unspent.  All fields will be updated for\n// existing entries since it's possible it has changed during a reorg.\nfunc (view *UtxoViewpoint) AddTxOuts(tx *btcutil.Tx, blockHeight int32) {\n\t// Loop all of the transaction outputs and add those which are not\n\t// provably unspendable.\n\tisCoinBase := IsCoinBase(tx)\n\tprevOut := wire.OutPoint{Hash: *tx.Hash()}\n\tfor txOutIdx, txOut := range tx.MsgTx().TxOut {\n\t\t// Update existing entries.  All fields are updated because it's\n\t\t// possible (although extremely unlikely) that the existing\n\t\t// entry is being replaced by a different transaction with the\n\t\t// same hash.  This is allowed so long as the previous\n\t\t// transaction is fully spent.\n\t\tprevOut.Index = uint32(txOutIdx)\n\t\tview.addTxOut(prevOut, txOut, isCoinBase, blockHeight)\n\t}\n}\n\n// connectTransaction updates the view by adding all new utxos created by the\n// passed transaction and marking all utxos that the transactions spend as\n// spent.  In addition, when the 'stxos' argument is not nil, it will be updated\n// to append an entry for each spent txout.  An error will be returned if the\n// view does not contain the required utxos.\nfunc (view *UtxoViewpoint) connectTransaction(tx *btcutil.Tx, blockHeight int32, stxos *[]SpentTxOut) error {\n\t// Coinbase transactions don't have any inputs to spend.\n\tif IsCoinBase(tx) {\n\t\t// Add the transaction's outputs as available utxos.\n\t\tview.AddTxOuts(tx, blockHeight)\n\t\treturn nil\n\t}\n\n\t// Spend the referenced utxos by marking them spent in the view and,\n\t// if a slice was provided for the spent txout details, append an entry\n\t// to it.\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\t// Ensure the referenced utxo exists in the view.  This should\n\t\t// never happen unless there is a bug is introduced in the code.\n\t\tentry := view.entries[txIn.PreviousOutPoint]\n\t\tif entry == nil {\n\t\t\treturn AssertError(fmt.Sprintf(\"view missing input %v\",\n\t\t\t\ttxIn.PreviousOutPoint))\n\t\t}\n\n\t\t// Only create the stxo details if requested.\n\t\tif stxos != nil {\n\t\t\t// Populate the stxo details using the utxo entry.\n\t\t\tvar stxo = SpentTxOut{\n\t\t\t\tAmount:     entry.Amount(),\n\t\t\t\tPkScript:   entry.PkScript(),\n\t\t\t\tHeight:     entry.BlockHeight(),\n\t\t\t\tIsCoinBase: entry.IsCoinBase(),\n\t\t\t}\n\t\t\t*stxos = append(*stxos, stxo)\n\t\t}\n\n\t\t// Mark the entry as spent.  This is not done until after the\n\t\t// relevant details have been accessed since spending it might\n\t\t// clear the fields from memory in the future.\n\t\tentry.Spend()\n\t}\n\n\t// Add the transaction's outputs as available utxos.\n\tview.AddTxOuts(tx, blockHeight)\n\treturn nil\n}\n\n// connectTransactions updates the view by adding all new utxos created by all\n// of the transactions in the passed block, marking all utxos the transactions\n// spend as spent, and setting the best hash for the view to the passed block.\n// In addition, when the 'stxos' argument is not nil, it will be updated to\n// append an entry for each spent txout.\nfunc (view *UtxoViewpoint) connectTransactions(block *btcutil.Block, stxos *[]SpentTxOut) error {\n\tfor _, tx := range block.Transactions() {\n\t\terr := view.connectTransaction(tx, block.Height(), stxos)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Update the best hash for view to include this block since all of its\n\t// transactions have been connected.\n\tview.SetBestHash(block.Hash())\n\treturn nil\n}\n\n// fetchEntryByHash attempts to find any available utxo for the given hash by\n// searching the entire set of possible outputs for the given hash.  It checks\n// the view first and then falls back to the database if needed.\nfunc (view *UtxoViewpoint) fetchEntryByHash(db database.DB, hash *chainhash.Hash) (*UtxoEntry, error) {\n\t// First attempt to find a utxo with the provided hash in the view.\n\tprevOut := wire.OutPoint{Hash: *hash}\n\tfor idx := uint32(0); idx < MaxOutputsPerBlock; idx++ {\n\t\tprevOut.Index = idx\n\t\tentry := view.LookupEntry(prevOut)\n\t\tif entry != nil {\n\t\t\treturn entry, nil\n\t\t}\n\t}\n\n\t// Check the database since it doesn't exist in the view.  This will\n\t// often by the case since only specifically referenced utxos are loaded\n\t// into the view.\n\tvar entry *UtxoEntry\n\terr := db.View(func(dbTx database.Tx) error {\n\t\tvar err error\n\t\tentry, err = dbFetchUtxoEntryByHash(dbTx, hash)\n\t\treturn err\n\t})\n\treturn entry, err\n}\n\n// disconnectTransactions updates the view by removing all of the transactions\n// created by the passed block, restoring all utxos the transactions spent by\n// using the provided spent txo information, and setting the best hash for the\n// view to the block before the passed block.\nfunc (view *UtxoViewpoint) disconnectTransactions(db database.DB, block *btcutil.Block, stxos []SpentTxOut) error {\n\t// Sanity check the correct number of stxos are provided.\n\tif len(stxos) != countSpentOutputs(block) {\n\t\treturn AssertError(\"disconnectTransactions called with bad \" +\n\t\t\t\"spent transaction out information\")\n\t}\n\n\t// Loop backwards through all transactions so everything is unspent in\n\t// reverse order.  This is necessary since transactions later in a block\n\t// can spend from previous ones.\n\tstxoIdx := len(stxos) - 1\n\ttransactions := block.Transactions()\n\tfor txIdx := len(transactions) - 1; txIdx > -1; txIdx-- {\n\t\ttx := transactions[txIdx]\n\n\t\t// All entries will need to potentially be marked as a coinbase.\n\t\tvar packedFlags txoFlags\n\t\tisCoinBase := txIdx == 0\n\t\tif isCoinBase {\n\t\t\tpackedFlags |= tfCoinBase\n\t\t}\n\n\t\t// Mark all of the spendable outputs originally created by the\n\t\t// transaction as spent.  It is instructive to note that while\n\t\t// the outputs aren't actually being spent here, rather they no\n\t\t// longer exist, since a pruned utxo set is used, there is no\n\t\t// practical difference between a utxo that does not exist and\n\t\t// one that has been spent.\n\t\t//\n\t\t// When the utxo does not already exist in the view, add an\n\t\t// entry for it and then mark it spent.  This is done because\n\t\t// the code relies on its existence in the view in order to\n\t\t// signal modifications have happened.\n\t\ttxHash := tx.Hash()\n\t\tprevOut := wire.OutPoint{Hash: *txHash}\n\t\tfor txOutIdx, txOut := range tx.MsgTx().TxOut {\n\t\t\tif txscript.IsUnspendable(txOut.PkScript) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tprevOut.Index = uint32(txOutIdx)\n\t\t\tentry := view.entries[prevOut]\n\t\t\tif entry == nil {\n\t\t\t\tentry = &UtxoEntry{\n\t\t\t\t\tamount:      txOut.Value,\n\t\t\t\t\tpkScript:    txOut.PkScript,\n\t\t\t\t\tblockHeight: block.Height(),\n\t\t\t\t\tpackedFlags: packedFlags,\n\t\t\t\t}\n\n\t\t\t\tview.entries[prevOut] = entry\n\t\t\t}\n\n\t\t\tentry.Spend()\n\t\t}\n\n\t\t// Loop backwards through all of the transaction inputs (except\n\t\t// for the coinbase which has no inputs) and unspend the\n\t\t// referenced txos.  This is necessary to match the order of the\n\t\t// spent txout entries.\n\t\tif isCoinBase {\n\t\t\tcontinue\n\t\t}\n\t\tfor txInIdx := len(tx.MsgTx().TxIn) - 1; txInIdx > -1; txInIdx-- {\n\t\t\t// Ensure the spent txout index is decremented to stay\n\t\t\t// in sync with the transaction input.\n\t\t\tstxo := &stxos[stxoIdx]\n\t\t\tstxoIdx--\n\n\t\t\t// When there is not already an entry for the referenced\n\t\t\t// output in the view, it means it was previously spent,\n\t\t\t// so create a new utxo entry in order to resurrect it.\n\t\t\toriginOut := &tx.MsgTx().TxIn[txInIdx].PreviousOutPoint\n\t\t\tentry := view.entries[*originOut]\n\t\t\tif entry == nil {\n\t\t\t\tentry = new(UtxoEntry)\n\t\t\t\tview.entries[*originOut] = entry\n\t\t\t}\n\n\t\t\t// The legacy v1 spend journal format only stored the\n\t\t\t// coinbase flag and height when the output was the last\n\t\t\t// unspent output of the transaction.  As a result, when\n\t\t\t// the information is missing, search for it by scanning\n\t\t\t// all possible outputs of the transaction since it must\n\t\t\t// be in one of them.\n\t\t\t//\n\t\t\t// It should be noted that this is quite inefficient,\n\t\t\t// but it realistically will almost never run since all\n\t\t\t// new entries include the information for all outputs\n\t\t\t// and thus the only way this will be hit is if a long\n\t\t\t// enough reorg happens such that a block with the old\n\t\t\t// spend data is being disconnected.  The probability of\n\t\t\t// that in practice is extremely low to begin with and\n\t\t\t// becomes vanishingly small the more new blocks are\n\t\t\t// connected.  In the case of a fresh database that has\n\t\t\t// only ever run with the new v2 format, this code path\n\t\t\t// will never run.\n\t\t\tif stxo.Height == 0 {\n\t\t\t\tutxo, err := view.fetchEntryByHash(db, txHash)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif utxo == nil {\n\t\t\t\t\treturn AssertError(fmt.Sprintf(\"unable \"+\n\t\t\t\t\t\t\"to resurrect legacy stxo %v\",\n\t\t\t\t\t\t*originOut))\n\t\t\t\t}\n\n\t\t\t\tstxo.Height = utxo.BlockHeight()\n\t\t\t\tstxo.IsCoinBase = utxo.IsCoinBase()\n\t\t\t}\n\n\t\t\t// Restore the utxo using the stxo data from the spend\n\t\t\t// journal and mark it as modified.\n\t\t\tentry.amount = stxo.Amount\n\t\t\tentry.pkScript = stxo.PkScript\n\t\t\tentry.blockHeight = stxo.Height\n\t\t\tentry.packedFlags = tfModified\n\t\t\tif stxo.IsCoinBase {\n\t\t\t\tentry.packedFlags |= tfCoinBase\n\t\t\t}\n\t\t}\n\t}\n\n\t// Update the best hash for view to the previous block since all of the\n\t// transactions for the current block have been disconnected.\n\tview.SetBestHash(&block.MsgBlock().Header.PrevBlock)\n\treturn nil\n}\n\n// RemoveEntry removes the given transaction output from the current state of\n// the view.  It will have no effect if the passed output does not exist in the\n// view.\nfunc (view *UtxoViewpoint) RemoveEntry(outpoint wire.OutPoint) {\n\tdelete(view.entries, outpoint)\n}\n\n// Entries returns the underlying map that stores of all the utxo entries.\nfunc (view *UtxoViewpoint) Entries() map[wire.OutPoint]*UtxoEntry {\n\treturn view.entries\n}\n\n// commit prunes all entries marked modified that are now fully spent and marks\n// all entries as unmodified.\nfunc (view *UtxoViewpoint) commit() {\n\tfor outpoint, entry := range view.entries {\n\t\tif entry == nil || (entry.isModified() && entry.IsSpent()) {\n\t\t\tdelete(view.entries, outpoint)\n\t\t\tcontinue\n\t\t}\n\n\t\tentry.packedFlags ^= tfModified\n\t}\n}\n\n// fetchUtxosFromCache fetches unspent transaction output data about the provided\n// set of outpoints from the point of view of the end of the main chain at the\n// time of the call.  It attempts to fetch them from the cache and whatever entries\n// that were not in the cache will be attempted to be fetched from the database and\n// it'll be cached.\n//\n// Upon completion of this function, the view will contain an entry for each\n// requested outpoint.  Spent outputs, or those which otherwise don't exist,\n// will result in a nil entry in the view.\nfunc (view *UtxoViewpoint) fetchUtxosFromCache(cache *utxoCache, outpoints []wire.OutPoint) error {\n\t// Nothing to do if there are no requested outputs.\n\tif len(outpoints) == 0 {\n\t\treturn nil\n\t}\n\n\t// Load the requested set of unspent transaction outputs from the point\n\t// of view of the end of the main chain.  Any missing entries will be\n\t// fetched from the database and be cached.\n\t//\n\t// NOTE: Missing entries are not considered an error here and instead\n\t// will result in nil entries in the view.  This is intentionally done\n\t// so other code can use the presence of an entry in the store as a way\n\t// to unnecessarily avoid attempting to reload it from the database.\n\tentries, err := cache.fetchEntries(outpoints)\n\tif err != nil {\n\t\treturn err\n\t}\n\tfor i, entry := range entries {\n\t\tview.entries[outpoints[i]] = entry.Clone()\n\t}\n\treturn nil\n}\n\n// fetchUtxos loads the unspent transaction outputs for the provided set of\n// outputs into the view from the database as needed unless they already exist\n// in the view in which case they are ignored.\nfunc (view *UtxoViewpoint) fetchUtxos(cache *utxoCache, outpoints []wire.OutPoint) error {\n\t// Nothing to do if there are no requested outputs.\n\tif len(outpoints) == 0 {\n\t\treturn nil\n\t}\n\n\t// Filter entries that are already in the view.\n\tneeded := make([]wire.OutPoint, 0, len(outpoints))\n\tfor i := range outpoints {\n\t\t// Already loaded into the current view.\n\t\tif _, ok := view.entries[outpoints[i]]; ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tneeded = append(needed, outpoints[i])\n\t}\n\n\t// Request the input utxos from the database.\n\treturn view.fetchUtxosFromCache(cache, needed)\n}\n\n// findInputsToFetch goes through all the blocks and returns all the outpoints of\n// the entries that need to be fetched in order to validate the block.  Outpoints\n// for the entries that are already in the block are not included in the returned\n// outpoints.\nfunc (view *UtxoViewpoint) findInputsToFetch(block *btcutil.Block) []wire.OutPoint {\n\t// Build a map of in-flight transactions because some of the inputs in\n\t// this block could be referencing other transactions earlier in this\n\t// block which are not yet in the chain.\n\ttxInFlight := map[chainhash.Hash]int{}\n\ttransactions := block.Transactions()\n\tfor i, tx := range transactions {\n\t\ttxInFlight[*tx.Hash()] = i\n\t}\n\n\t// Loop through all of the transaction inputs (except for the coinbase\n\t// which has no inputs) collecting them into sets of what is needed and\n\t// what is already known (in-flight).\n\tneeded := make([]wire.OutPoint, 0, len(transactions))\n\tfor i, tx := range transactions[1:] {\n\t\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\t\t// It is acceptable for a transaction input to reference\n\t\t\t// the output of another transaction in this block only\n\t\t\t// if the referenced transaction comes before the\n\t\t\t// current one in this block.  Add the outputs of the\n\t\t\t// referenced transaction as available utxos when this\n\t\t\t// is the case.  Otherwise, the utxo details are still\n\t\t\t// needed.\n\t\t\t//\n\t\t\t// NOTE: The >= is correct here because i is one less\n\t\t\t// than the actual position of the transaction within\n\t\t\t// the block due to skipping the coinbase.\n\t\t\toriginHash := &txIn.PreviousOutPoint.Hash\n\t\t\tif inFlightIndex, ok := txInFlight[*originHash]; ok &&\n\t\t\t\ti >= inFlightIndex {\n\n\t\t\t\toriginTx := transactions[inFlightIndex]\n\t\t\t\tview.AddTxOuts(originTx, block.Height())\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Don't request entries that are already in the view\n\t\t\t// from the database.\n\t\t\tif _, ok := view.entries[txIn.PreviousOutPoint]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tneeded = append(needed, txIn.PreviousOutPoint)\n\t\t}\n\t}\n\n\treturn needed\n}\n\n// fetchInputUtxos loads the unspent transaction outputs for the inputs\n// referenced by the transactions in the given block into the view from the\n// cache as needed.  In particular, referenced entries that are earlier in\n// the block are added to the view and entries that are already in the view\n// are not modified.\nfunc (view *UtxoViewpoint) fetchInputUtxos(cache *utxoCache, block *btcutil.Block) error {\n\treturn view.fetchUtxosFromCache(cache, view.findInputsToFetch(block))\n}\n\n// NewUtxoViewpoint returns a new empty unspent transaction output view.\nfunc NewUtxoViewpoint() *UtxoViewpoint {\n\treturn &UtxoViewpoint{\n\t\tentries: make(map[wire.OutPoint]*UtxoEntry),\n\t}\n}\n\n// FetchUtxoView loads unspent transaction outputs for the inputs referenced by\n// the passed transaction from the point of view of the end of the main chain.\n// It also attempts to fetch the utxos for the outputs of the transaction itself\n// so the returned view can be examined for duplicate transactions.\n//\n// This function is safe for concurrent access however the returned view is NOT.\nfunc (b *BlockChain) FetchUtxoView(tx *btcutil.Tx) (*UtxoViewpoint, error) {\n\t// Create a set of needed outputs based on those referenced by the\n\t// inputs of the passed transaction and the outputs of the transaction\n\t// itself.\n\tneededLen := len(tx.MsgTx().TxOut)\n\tif !IsCoinBase(tx) {\n\t\tneededLen += len(tx.MsgTx().TxIn)\n\t}\n\tneeded := make([]wire.OutPoint, 0, neededLen)\n\tprevOut := wire.OutPoint{Hash: *tx.Hash()}\n\tfor txOutIdx := range tx.MsgTx().TxOut {\n\t\tprevOut.Index = uint32(txOutIdx)\n\t\tneeded = append(needed, prevOut)\n\t}\n\tif !IsCoinBase(tx) {\n\t\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\t\tneeded = append(needed, txIn.PreviousOutPoint)\n\t\t}\n\t}\n\n\t// Request the utxos from the point of view of the end of the main\n\t// chain.\n\tview := NewUtxoViewpoint()\n\tb.chainLock.RLock()\n\terr := view.fetchUtxosFromCache(b.utxoCache, needed)\n\tb.chainLock.RUnlock()\n\treturn view, err\n}\n\n// FetchUtxoEntry loads and returns the requested unspent transaction output\n// from the point of view of the end of the main chain.\n//\n// NOTE: Requesting an output for which there is no data will NOT return an\n// error.  Instead both the entry and the error will be nil.  This is done to\n// allow pruning of spent transaction outputs.  In practice this means the\n// caller must check if the returned entry is nil before invoking methods on it.\n//\n// This function is safe for concurrent access however the returned entry (if\n// any) is NOT.\nfunc (b *BlockChain) FetchUtxoEntry(outpoint wire.OutPoint) (*UtxoEntry, error) {\n\tb.chainLock.RLock()\n\tdefer b.chainLock.RUnlock()\n\n\tentries, err := b.utxoCache.fetchEntries([]wire.OutPoint{outpoint})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn entries[0], nil\n}\n"
  },
  {
    "path": "blockchain/validate.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/big\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// MaxTimeOffsetSeconds is the maximum number of seconds a block time\n\t// is allowed to be ahead of the current time.  This is currently 2\n\t// hours.\n\tMaxTimeOffsetSeconds = 2 * 60 * 60\n\n\t// MinCoinbaseScriptLen is the minimum length a coinbase script can be.\n\tMinCoinbaseScriptLen = 2\n\n\t// MaxCoinbaseScriptLen is the maximum length a coinbase script can be.\n\tMaxCoinbaseScriptLen = 100\n\n\t// medianTimeBlocks is the number of previous blocks which should be\n\t// used to calculate the median time used to validate block timestamps.\n\tmedianTimeBlocks = 11\n\n\t// serializedHeightVersion is the block version which changed block\n\t// coinbases to start with the serialized block height.\n\tserializedHeightVersion = 2\n\n\t// baseSubsidy is the starting subsidy amount for mined blocks.  This\n\t// value is halved every SubsidyHalvingInterval blocks.\n\tbaseSubsidy = 50 * btcutil.SatoshiPerBitcoin\n\n\t// coinbaseHeightAllocSize is the amount of bytes that the\n\t// ScriptBuilder will allocate when validating the coinbase height.\n\tcoinbaseHeightAllocSize = 5\n\n\t// maxTimeWarp is a maximum number of seconds that the timestamp of the first\n\t// block of a difficulty adjustment period is allowed to\n\t// be earlier than the last block of the previous period (BIP94).\n\tmaxTimeWarp = 600 * time.Second\n)\n\nvar (\n\t// zeroHash is the zero value for a chainhash.Hash and is defined as\n\t// a package level variable to avoid the need to create a new instance\n\t// every time a check is needed.\n\tzeroHash chainhash.Hash\n\n\t// block91842Hash is one of the two nodes which violate the rules\n\t// set forth in BIP0030.  It is defined as a package level variable to\n\t// avoid the need to create a new instance every time a check is needed.\n\tblock91842Hash = newHashFromStr(\"00000000000a4d0a398161ffc163c503763b1f4360639393e0e4c8e300e0caec\")\n\n\t// block91880Hash is one of the two nodes which violate the rules\n\t// set forth in BIP0030.  It is defined as a package level variable to\n\t// avoid the need to create a new instance every time a check is needed.\n\tblock91880Hash = newHashFromStr(\"00000000000743f190a18c5577a3c2d2a1f610ae9601ac046a38084ccb7cd721\")\n)\n\n// isNullOutpoint determines whether or not a previous transaction output point\n// is set.\nfunc isNullOutpoint(outpoint *wire.OutPoint) bool {\n\tif outpoint.Index == math.MaxUint32 && outpoint.Hash == zeroHash {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// ShouldHaveSerializedBlockHeight determines if a block should have a\n// serialized block height embedded within the scriptSig of its\n// coinbase transaction. Judgement is based on the block version in the block\n// header. Blocks with version 2 and above satisfy this criteria. See BIP0034\n// for further information.\nfunc ShouldHaveSerializedBlockHeight(header *wire.BlockHeader) bool {\n\treturn header.Version >= serializedHeightVersion\n}\n\n// IsCoinBaseTx determines whether or not a transaction is a coinbase.  A coinbase\n// is a special transaction created by miners that has no inputs.  This is\n// represented in the block chain by a transaction with a single input that has\n// a previous output transaction index set to the maximum value along with a\n// zero hash.\n//\n// This function only differs from IsCoinBase in that it works with a raw wire\n// transaction as opposed to a higher level util transaction.\nfunc IsCoinBaseTx(msgTx *wire.MsgTx) bool {\n\t// A coin base must only have one transaction input.\n\tif len(msgTx.TxIn) != 1 {\n\t\treturn false\n\t}\n\n\t// The previous output of a coin base must have a max value index and\n\t// a zero hash.\n\tprevOut := &msgTx.TxIn[0].PreviousOutPoint\n\tif prevOut.Index != math.MaxUint32 || prevOut.Hash != zeroHash {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// IsCoinBase determines whether or not a transaction is a coinbase.  A coinbase\n// is a special transaction created by miners that has no inputs.  This is\n// represented in the block chain by a transaction with a single input that has\n// a previous output transaction index set to the maximum value along with a\n// zero hash.\n//\n// This function only differs from IsCoinBaseTx in that it works with a higher\n// level util transaction as opposed to a raw wire transaction.\nfunc IsCoinBase(tx *btcutil.Tx) bool {\n\treturn IsCoinBaseTx(tx.MsgTx())\n}\n\n// SequenceLockActive determines if a transaction's sequence locks have been\n// met, meaning that all the inputs of a given transaction have reached a\n// height or time sufficient for their relative lock-time maturity.\nfunc SequenceLockActive(sequenceLock *SequenceLock, blockHeight int32,\n\tmedianTimePast time.Time) bool {\n\n\t// If either the seconds, or height relative-lock time has not yet\n\t// reached, then the transaction is not yet mature according to its\n\t// sequence locks.\n\tif sequenceLock.Seconds >= medianTimePast.Unix() ||\n\t\tsequenceLock.BlockHeight >= blockHeight {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// IsFinalizedTransaction determines whether or not a transaction is finalized.\nfunc IsFinalizedTransaction(tx *btcutil.Tx, blockHeight int32, blockTime time.Time) bool {\n\tmsgTx := tx.MsgTx()\n\n\t// Lock time of zero means the transaction is finalized.\n\tlockTime := msgTx.LockTime\n\tif lockTime == 0 {\n\t\treturn true\n\t}\n\n\t// The lock time field of a transaction is either a block height at\n\t// which the transaction is finalized or a timestamp depending on if the\n\t// value is before the txscript.LockTimeThreshold.  When it is under the\n\t// threshold it is a block height.\n\tblockTimeOrHeight := int64(0)\n\tif lockTime < txscript.LockTimeThreshold {\n\t\tblockTimeOrHeight = int64(blockHeight)\n\t} else {\n\t\tblockTimeOrHeight = blockTime.Unix()\n\t}\n\tif int64(lockTime) < blockTimeOrHeight {\n\t\treturn true\n\t}\n\n\t// At this point, the transaction's lock time hasn't occurred yet, but\n\t// the transaction might still be finalized if the sequence number\n\t// for all transaction inputs is maxed out.\n\tfor _, txIn := range msgTx.TxIn {\n\t\tif txIn.Sequence != math.MaxUint32 {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// isBIP0030Node returns whether or not the passed node represents one of the\n// two blocks that violate the BIP0030 rule which prevents transactions from\n// overwriting old ones.\nfunc isBIP0030Node(node *blockNode) bool {\n\tif node.height == 91842 && node.hash.IsEqual(block91842Hash) {\n\t\treturn true\n\t}\n\n\tif node.height == 91880 && node.hash.IsEqual(block91880Hash) {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// CalcBlockSubsidy returns the subsidy amount a block at the provided height\n// should have. This is mainly used for determining how much the coinbase for\n// newly generated blocks awards as well as validating the coinbase for blocks\n// has the expected value.\n//\n// The subsidy is halved every SubsidyReductionInterval blocks.  Mathematically\n// this is: baseSubsidy / 2^(height/SubsidyReductionInterval)\n//\n// At the target block generation rate for the main network, this is\n// approximately every 4 years.\nfunc CalcBlockSubsidy(height int32, chainParams *chaincfg.Params) int64 {\n\tif chainParams.SubsidyReductionInterval == 0 {\n\t\treturn baseSubsidy\n\t}\n\n\t// Equivalent to: baseSubsidy / 2^(height/subsidyHalvingInterval)\n\treturn baseSubsidy >> uint(height/chainParams.SubsidyReductionInterval)\n}\n\n// CheckTransactionSanity performs some preliminary checks on a transaction to\n// ensure it is sane.  These checks are context free.\nfunc CheckTransactionSanity(tx *btcutil.Tx) error {\n\t// A transaction must have at least one input.\n\tmsgTx := tx.MsgTx()\n\tif len(msgTx.TxIn) == 0 {\n\t\treturn ruleError(ErrNoTxInputs, \"transaction has no inputs\")\n\t}\n\n\t// A transaction must have at least one output.\n\tif len(msgTx.TxOut) == 0 {\n\t\treturn ruleError(ErrNoTxOutputs, \"transaction has no outputs\")\n\t}\n\n\t// A transaction must not exceed the maximum allowed block payload when\n\t// serialized.\n\tserializedTxSize := tx.MsgTx().SerializeSizeStripped()\n\tif serializedTxSize > MaxBlockBaseSize {\n\t\tstr := fmt.Sprintf(\"serialized transaction is too big - got \"+\n\t\t\t\"%d, max %d\", serializedTxSize, MaxBlockBaseSize)\n\t\treturn ruleError(ErrTxTooBig, str)\n\t}\n\n\t// Ensure the transaction amounts are in range.  Each transaction\n\t// output must not be negative or more than the max allowed per\n\t// transaction.  Also, the total of all outputs must abide by the same\n\t// restrictions.  All amounts in a transaction are in a unit value known\n\t// as a satoshi.  One bitcoin is a quantity of satoshi as defined by the\n\t// SatoshiPerBitcoin constant.\n\tvar totalSatoshi int64\n\tfor _, txOut := range msgTx.TxOut {\n\t\tsatoshi := txOut.Value\n\t\tif satoshi < 0 {\n\t\t\tstr := fmt.Sprintf(\"transaction output has negative \"+\n\t\t\t\t\"value of %v\", satoshi)\n\t\t\treturn ruleError(ErrBadTxOutValue, str)\n\t\t}\n\t\tif satoshi > btcutil.MaxSatoshi {\n\t\t\tstr := fmt.Sprintf(\"transaction output value is \"+\n\t\t\t\t\"higher than max allowed value: %v > %v \",\n\t\t\t\tsatoshi, btcutil.MaxSatoshi)\n\t\t\treturn ruleError(ErrBadTxOutValue, str)\n\t\t}\n\n\t\t// Two's complement int64 overflow guarantees that any overflow\n\t\t// is detected and reported.  This is impossible for Bitcoin, but\n\t\t// perhaps possible if an alt increases the total money supply.\n\t\ttotalSatoshi += satoshi\n\t\tif totalSatoshi < 0 {\n\t\t\tstr := fmt.Sprintf(\"total value of all transaction \"+\n\t\t\t\t\"outputs exceeds max allowed value of %v\",\n\t\t\t\tbtcutil.MaxSatoshi)\n\t\t\treturn ruleError(ErrBadTxOutValue, str)\n\t\t}\n\t\tif totalSatoshi > btcutil.MaxSatoshi {\n\t\t\tstr := fmt.Sprintf(\"total value of all transaction \"+\n\t\t\t\t\"outputs is %v which is higher than max \"+\n\t\t\t\t\"allowed value of %v\", totalSatoshi,\n\t\t\t\tbtcutil.MaxSatoshi)\n\t\t\treturn ruleError(ErrBadTxOutValue, str)\n\t\t}\n\t}\n\n\t// Check for duplicate transaction inputs.\n\texistingTxOut := make(map[wire.OutPoint]struct{})\n\tfor _, txIn := range msgTx.TxIn {\n\t\tif _, exists := existingTxOut[txIn.PreviousOutPoint]; exists {\n\t\t\treturn ruleError(ErrDuplicateTxInputs, \"transaction \"+\n\t\t\t\t\"contains duplicate inputs\")\n\t\t}\n\t\texistingTxOut[txIn.PreviousOutPoint] = struct{}{}\n\t}\n\n\t// Coinbase script length must be between min and max length.\n\tif IsCoinBase(tx) {\n\t\tslen := len(msgTx.TxIn[0].SignatureScript)\n\t\tif slen < MinCoinbaseScriptLen || slen > MaxCoinbaseScriptLen {\n\t\t\tstr := fmt.Sprintf(\"coinbase transaction script length \"+\n\t\t\t\t\"of %d is out of range (min: %d, max: %d)\",\n\t\t\t\tslen, MinCoinbaseScriptLen, MaxCoinbaseScriptLen)\n\t\t\treturn ruleError(ErrBadCoinbaseScriptLen, str)\n\t\t}\n\t} else {\n\t\t// Previous transaction outputs referenced by the inputs to this\n\t\t// transaction must not be null.\n\t\tfor _, txIn := range msgTx.TxIn {\n\t\t\tif isNullOutpoint(&txIn.PreviousOutPoint) {\n\t\t\t\treturn ruleError(ErrBadTxInput, \"transaction \"+\n\t\t\t\t\t\"input refers to previous output that \"+\n\t\t\t\t\t\"is null\")\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// checkProofOfWork ensures the block header bits which indicate the target\n// difficulty is in min/max range and that the block hash is less than the\n// target difficulty as claimed.\n//\n// The flags modify the behavior of this function as follows:\n//   - BFNoPoWCheck: The check to ensure the block hash is less than the target\n//     difficulty is not performed.\nfunc checkProofOfWork(header *wire.BlockHeader, powLimit *big.Int, flags BehaviorFlags) error {\n\t// The target difficulty must be larger than zero.\n\ttarget := CompactToBig(header.Bits)\n\tif target.Sign() <= 0 {\n\t\tstr := fmt.Sprintf(\"block target difficulty of %064x is too low\",\n\t\t\ttarget)\n\t\treturn ruleError(ErrUnexpectedDifficulty, str)\n\t}\n\n\t// The target difficulty must be less than the maximum allowed.\n\tif target.Cmp(powLimit) > 0 {\n\t\tstr := fmt.Sprintf(\"block target difficulty of %064x is \"+\n\t\t\t\"higher than max of %064x\", target, powLimit)\n\t\treturn ruleError(ErrUnexpectedDifficulty, str)\n\t}\n\n\t// The block hash must be less than the claimed target unless the flag\n\t// to avoid proof of work checks is set.\n\tif flags&BFNoPoWCheck != BFNoPoWCheck {\n\t\t// The block hash must be less than the claimed target.\n\t\thash := header.BlockHash()\n\t\thashNum := HashToBig(&hash)\n\t\tif hashNum.Cmp(target) > 0 {\n\t\t\tstr := fmt.Sprintf(\"block hash of %064x is higher than \"+\n\t\t\t\t\"expected max of %064x\", hashNum, target)\n\t\t\treturn ruleError(ErrHighHash, str)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// CheckProofOfWork ensures the block header bits which indicate the target\n// difficulty is in min/max range and that the block hash is less than the\n// target difficulty as claimed.\nfunc CheckProofOfWork(block *btcutil.Block, powLimit *big.Int) error {\n\treturn checkProofOfWork(&block.MsgBlock().Header, powLimit, BFNone)\n}\n\n// CountSigOps returns the number of signature operations for all transaction\n// input and output scripts in the provided transaction.  This uses the\n// quicker, but imprecise, signature operation counting mechanism from\n// txscript.\nfunc CountSigOps(tx *btcutil.Tx) int {\n\tmsgTx := tx.MsgTx()\n\n\t// Accumulate the number of signature operations in all transaction\n\t// inputs.\n\ttotalSigOps := 0\n\tfor _, txIn := range msgTx.TxIn {\n\t\tnumSigOps := txscript.GetSigOpCount(txIn.SignatureScript)\n\t\ttotalSigOps += numSigOps\n\t}\n\n\t// Accumulate the number of signature operations in all transaction\n\t// outputs.\n\tfor _, txOut := range msgTx.TxOut {\n\t\tnumSigOps := txscript.GetSigOpCount(txOut.PkScript)\n\t\ttotalSigOps += numSigOps\n\t}\n\n\treturn totalSigOps\n}\n\n// CountP2SHSigOps returns the number of signature operations for all input\n// transactions which are of the pay-to-script-hash type.  This uses the\n// precise, signature operation counting mechanism from the script engine which\n// requires access to the input transaction scripts.\nfunc CountP2SHSigOps(tx *btcutil.Tx, isCoinBaseTx bool, utxoView *UtxoViewpoint) (int, error) {\n\t// Coinbase transactions have no interesting inputs.\n\tif isCoinBaseTx {\n\t\treturn 0, nil\n\t}\n\n\t// Accumulate the number of signature operations in all transaction\n\t// inputs.\n\tmsgTx := tx.MsgTx()\n\ttotalSigOps := 0\n\tfor txInIndex, txIn := range msgTx.TxIn {\n\t\t// Ensure the referenced input transaction is available.\n\t\tutxo := utxoView.LookupEntry(txIn.PreviousOutPoint)\n\t\tif utxo == nil || utxo.IsSpent() {\n\t\t\tstr := fmt.Sprintf(\"output %v referenced from \"+\n\t\t\t\t\"transaction %s:%d either does not exist or \"+\n\t\t\t\t\"has already been spent\", txIn.PreviousOutPoint,\n\t\t\t\ttx.Hash(), txInIndex)\n\t\t\treturn 0, ruleError(ErrMissingTxOut, str)\n\t\t}\n\n\t\t// We're only interested in pay-to-script-hash types, so skip\n\t\t// this input if it's not one.\n\t\tpkScript := utxo.PkScript()\n\t\tif !txscript.IsPayToScriptHash(pkScript) {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Count the precise number of signature operations in the\n\t\t// referenced public key script.\n\t\tsigScript := txIn.SignatureScript\n\t\tnumSigOps := txscript.GetPreciseSigOpCount(sigScript, pkScript,\n\t\t\ttrue)\n\n\t\t// We could potentially overflow the accumulator so check for\n\t\t// overflow.\n\t\tlastSigOps := totalSigOps\n\t\ttotalSigOps += numSigOps\n\t\tif totalSigOps < lastSigOps {\n\t\t\tstr := fmt.Sprintf(\"the public key script from output \"+\n\t\t\t\t\"%v contains too many signature operations - \"+\n\t\t\t\t\"overflow\", txIn.PreviousOutPoint)\n\t\t\treturn 0, ruleError(ErrTooManySigOps, str)\n\t\t}\n\t}\n\n\treturn totalSigOps, nil\n}\n\n// CheckBlockHeaderSanity performs some preliminary checks on a block header to\n// ensure it is sane before continuing with processing.  These checks are\n// context free.\n//\n// The flags do not modify the behavior of this function directly, however they\n// are needed to pass along to checkProofOfWork.\nfunc CheckBlockHeaderSanity(header *wire.BlockHeader, powLimit *big.Int,\n\ttimeSource MedianTimeSource, flags BehaviorFlags) error {\n\n\t// Ensure the proof of work bits in the block header is in min/max range\n\t// and the block hash is less than the target value described by the\n\t// bits.\n\terr := checkProofOfWork(header, powLimit, flags)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// A block timestamp must not have a greater precision than one second.\n\t// This check is necessary because Go time.Time values support\n\t// nanosecond precision whereas the consensus rules only apply to\n\t// seconds and it's much nicer to deal with standard Go time values\n\t// instead of converting to seconds everywhere.\n\tif !header.Timestamp.Equal(time.Unix(header.Timestamp.Unix(), 0)) {\n\t\tstr := fmt.Sprintf(\"block timestamp of %v has a higher \"+\n\t\t\t\"precision than one second\", header.Timestamp)\n\t\treturn ruleError(ErrInvalidTime, str)\n\t}\n\n\t// Ensure the block time is not too far in the future.\n\tmaxTimestamp := timeSource.AdjustedTime().Add(time.Second *\n\t\tMaxTimeOffsetSeconds)\n\tif header.Timestamp.After(maxTimestamp) {\n\t\tstr := fmt.Sprintf(\"block timestamp of %v is too far in the \"+\n\t\t\t\"future\", header.Timestamp)\n\t\treturn ruleError(ErrTimeTooNew, str)\n\t}\n\n\treturn nil\n}\n\n// checkBlockSanity performs some preliminary checks on a block to ensure it is\n// sane before continuing with block processing.  These checks are context free.\n//\n// The flags do not modify the behavior of this function directly, however they\n// are needed to pass along to checkBlockHeaderSanity.\nfunc checkBlockSanity(block *btcutil.Block, powLimit *big.Int, timeSource MedianTimeSource, flags BehaviorFlags) error {\n\tmsgBlock := block.MsgBlock()\n\theader := &msgBlock.Header\n\terr := CheckBlockHeaderSanity(header, powLimit, timeSource, flags)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// A block must have at least one transaction.\n\tnumTx := len(msgBlock.Transactions)\n\tif numTx == 0 {\n\t\treturn ruleError(ErrNoTransactions, \"block does not contain \"+\n\t\t\t\"any transactions\")\n\t}\n\n\t// A block must not have more transactions than the max block payload or\n\t// else it is certainly over the weight limit.\n\tif numTx > MaxBlockBaseSize {\n\t\tstr := fmt.Sprintf(\"block contains too many transactions - \"+\n\t\t\t\"got %d, max %d\", numTx, MaxBlockBaseSize)\n\t\treturn ruleError(ErrBlockTooBig, str)\n\t}\n\n\t// A block must not exceed the maximum allowed block payload when\n\t// serialized.\n\tserializedSize := msgBlock.SerializeSizeStripped()\n\tif serializedSize > MaxBlockBaseSize {\n\t\tstr := fmt.Sprintf(\"serialized block is too big - got %d, \"+\n\t\t\t\"max %d\", serializedSize, MaxBlockBaseSize)\n\t\treturn ruleError(ErrBlockTooBig, str)\n\t}\n\n\t// The first transaction in a block must be a coinbase.\n\ttransactions := block.Transactions()\n\tif !IsCoinBase(transactions[0]) {\n\t\treturn ruleError(ErrFirstTxNotCoinbase, \"first transaction in \"+\n\t\t\t\"block is not a coinbase\")\n\t}\n\n\t// A block must not have more than one coinbase.\n\tfor i, tx := range transactions[1:] {\n\t\tif IsCoinBase(tx) {\n\t\t\tstr := fmt.Sprintf(\"block contains second coinbase at \"+\n\t\t\t\t\"index %d\", i+1)\n\t\t\treturn ruleError(ErrMultipleCoinbases, str)\n\t\t}\n\t}\n\n\t// Do some preliminary checks on each transaction to ensure they are\n\t// sane before continuing.\n\tfor _, tx := range transactions {\n\t\terr := CheckTransactionSanity(tx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Build merkle tree and ensure the calculated merkle root matches the\n\t// entry in the block header.  This also has the effect of caching all\n\t// of the transaction hashes in the block to speed up future hash\n\t// checks.  Bitcoind builds the tree here and checks the merkle root\n\t// after the following checks, but there is no reason not to check the\n\t// merkle root matches here.\n\tcalcMerkleRoot := CalcMerkleRoot(block.Transactions(), false)\n\tif !header.MerkleRoot.IsEqual(&calcMerkleRoot) {\n\t\tstr := fmt.Sprintf(\"block merkle root is invalid - block \"+\n\t\t\t\"header indicates %v, but calculated value is %v\",\n\t\t\theader.MerkleRoot, calcMerkleRoot)\n\t\treturn ruleError(ErrBadMerkleRoot, str)\n\t}\n\n\t// Check for duplicate transactions.  This check will be fairly quick\n\t// since the transaction hashes are already cached due to building the\n\t// merkle tree above.\n\texistingTxHashes := make(map[chainhash.Hash]struct{})\n\tfor _, tx := range transactions {\n\t\thash := tx.Hash()\n\t\tif _, exists := existingTxHashes[*hash]; exists {\n\t\t\tstr := fmt.Sprintf(\"block contains duplicate \"+\n\t\t\t\t\"transaction %v\", hash)\n\t\t\treturn ruleError(ErrDuplicateTx, str)\n\t\t}\n\t\texistingTxHashes[*hash] = struct{}{}\n\t}\n\n\t// The number of signature operations must be less than the maximum\n\t// allowed per block.\n\ttotalSigOps := 0\n\tfor _, tx := range transactions {\n\t\t// We could potentially overflow the accumulator so check for\n\t\t// overflow.\n\t\tlastSigOps := totalSigOps\n\t\ttotalSigOps += (CountSigOps(tx) * WitnessScaleFactor)\n\t\tif totalSigOps < lastSigOps || totalSigOps > MaxBlockSigOpsCost {\n\t\t\tstr := fmt.Sprintf(\"block contains too many signature \"+\n\t\t\t\t\"operations - got %v, max %v\", totalSigOps,\n\t\t\t\tMaxBlockSigOpsCost)\n\t\t\treturn ruleError(ErrTooManySigOps, str)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// CheckBlockSanity performs some preliminary checks on a block to ensure it is\n// sane before continuing with block processing.  These checks are context free.\nfunc CheckBlockSanity(block *btcutil.Block, powLimit *big.Int, timeSource MedianTimeSource) error {\n\treturn checkBlockSanity(block, powLimit, timeSource, BFNone)\n}\n\n// ExtractCoinbaseHeight attempts to extract the height of the block from the\n// scriptSig of a coinbase transaction.  Coinbase heights are only present in\n// blocks of version 2 or later.  This was added as part of BIP0034.\nfunc ExtractCoinbaseHeight(coinbaseTx *btcutil.Tx) (int32, error) {\n\tsigScript := coinbaseTx.MsgTx().TxIn[0].SignatureScript\n\tif len(sigScript) < 1 {\n\t\tstr := \"the coinbase signature script for blocks of \" +\n\t\t\t\"version %d or greater must start with the \" +\n\t\t\t\"length of the serialized block height\"\n\t\tstr = fmt.Sprintf(str, serializedHeightVersion)\n\t\treturn 0, ruleError(ErrMissingCoinbaseHeight, str)\n\t}\n\n\t// Detect the case when the block height is a small integer encoded with\n\t// as single byte.\n\topcode := int(sigScript[0])\n\tif opcode == txscript.OP_0 {\n\t\treturn 0, nil\n\t}\n\tif opcode >= txscript.OP_1 && opcode <= txscript.OP_16 {\n\t\treturn int32(opcode - (txscript.OP_1 - 1)), nil\n\t}\n\n\t// Otherwise, the opcode is the length of the following bytes which\n\t// encode in the block height.\n\tserializedLen := int(sigScript[0])\n\tif len(sigScript[1:]) < serializedLen {\n\t\tstr := \"the coinbase signature script for blocks of \" +\n\t\t\t\"version %d or greater must start with the \" +\n\t\t\t\"serialized block height\"\n\t\tstr = fmt.Sprintf(str, serializedLen)\n\t\treturn 0, ruleError(ErrMissingCoinbaseHeight, str)\n\t}\n\n\t// We use 4 bytes here since it saves us allocations. We use a stack\n\t// allocation rather than a heap allocation here.\n\tvar serializedHeightBytes [4]byte\n\tcopy(serializedHeightBytes[:], sigScript[1:serializedLen+1])\n\n\tserializedHeight := int32(\n\t\tbinary.LittleEndian.Uint32(serializedHeightBytes[:]),\n\t)\n\n\tif err := compareScript(serializedHeight, sigScript); err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn serializedHeight, nil\n}\n\n// CheckSerializedHeight checks if the signature script in the passed\n// transaction starts with the serialized block height of wantHeight.\nfunc CheckSerializedHeight(coinbaseTx *btcutil.Tx, wantHeight int32) error {\n\tserializedHeight, err := ExtractCoinbaseHeight(coinbaseTx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif serializedHeight != wantHeight {\n\t\tstr := fmt.Sprintf(\"the coinbase signature script serialized \"+\n\t\t\t\"block height is %d when %d was expected\",\n\t\t\tserializedHeight, wantHeight)\n\t\treturn ruleError(ErrBadCoinbaseHeight, str)\n\t}\n\treturn nil\n}\n\nfunc compareScript(height int32, script []byte) error {\n\tscriptBuilder := txscript.NewScriptBuilder(\n\t\ttxscript.WithScriptAllocSize(coinbaseHeightAllocSize),\n\t)\n\tscriptHeight, err := scriptBuilder.AddInt64(\n\t\tint64(height),\n\t).Script()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !bytes.HasPrefix(script, scriptHeight) {\n\t\tstr := fmt.Sprintf(\"the coinbase signature script does not \"+\n\t\t\t\"minimally encode the height %d\", height)\n\t\treturn ruleError(ErrBadCoinbaseHeight, str)\n\t}\n\n\treturn nil\n}\n\n// CheckBlockHeaderContext performs several validation checks on the block header\n// which depend on its position within the block chain.\n//\n// The flags modify the behavior of this function as follows:\n//   - BFFastAdd: All checks except those involving comparing the header against\n//     the checkpoints are not performed.\n//\n// The skipCheckpoint boolean is used so that libraries can skip the checkpoint\n// sanity checks.\n//\n// This function MUST be called with the chain state lock held (for writes).\n// NOTE: Ignore the above lock requirement if this function is not passed a\n// *Blockchain instance as the ChainCtx argument.\nfunc CheckBlockHeaderContext(header *wire.BlockHeader, prevNode HeaderCtx,\n\tflags BehaviorFlags, c ChainCtx, skipCheckpoint bool) error {\n\n\t// The height of this block is one more than the referenced previous\n\t// block.\n\tblockHeight := prevNode.Height() + 1\n\n\tparams := c.ChainParams()\n\n\tfastAdd := flags&BFFastAdd == BFFastAdd\n\tif !fastAdd {\n\t\t// Ensure the difficulty specified in the block header matches\n\t\t// the calculated difficulty based on the previous block and\n\t\t// difficulty retarget rules.\n\t\texpectedDifficulty, err := calcNextRequiredDifficulty(\n\t\t\tprevNode, header.Timestamp, c,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tblockDifficulty := header.Bits\n\t\tif blockDifficulty != expectedDifficulty {\n\t\t\tstr := \"block difficulty of %d is not the expected value of %d\"\n\t\t\tstr = fmt.Sprintf(str, blockDifficulty, expectedDifficulty)\n\t\t\treturn ruleError(ErrUnexpectedDifficulty, str)\n\t\t}\n\n\t\t// Ensure the timestamp for the block header is after the\n\t\t// median time of the last several blocks (medianTimeBlocks).\n\t\tmedianTime := CalcPastMedianTime(prevNode)\n\t\tif !header.Timestamp.After(medianTime) {\n\t\t\tstr := \"block timestamp of %v is not after expected %v\"\n\t\t\tstr = fmt.Sprintf(str, header.Timestamp, medianTime)\n\t\t\treturn ruleError(ErrTimeTooOld, str)\n\t\t}\n\n\t\t// Testnet4 only: Check timestamp against prev for\n\t\t// difficulty-adjustment blocks to prevent timewarp attacks.\n\t\tif params.EnforceBIP94 {\n\t\t\terr := assertNoTimeWarp(\n\t\t\t\tblockHeight, c.BlocksPerRetarget(),\n\t\t\t\theader.Timestamp,\n\t\t\t\ttime.Unix(prevNode.Timestamp(), 0),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\t// Reject outdated block versions once a majority of the network\n\t// has upgraded.  These were originally voted on by BIP0034,\n\t// BIP0065, and BIP0066.\n\tif header.Version < 2 && blockHeight >= params.BIP0034Height ||\n\t\theader.Version < 3 && blockHeight >= params.BIP0066Height ||\n\t\theader.Version < 4 && blockHeight >= params.BIP0065Height {\n\n\t\tstr := \"new blocks with version %d are no longer valid\"\n\t\tstr = fmt.Sprintf(str, header.Version)\n\t\treturn ruleError(ErrBlockVersionTooOld, str)\n\t}\n\n\tif skipCheckpoint {\n\t\t// If the caller wants us to skip the checkpoint checks, we'll\n\t\t// return early.\n\t\treturn nil\n\t}\n\n\t// Ensure chain matches up to predetermined checkpoints.\n\tblockHash := header.BlockHash()\n\tif !c.VerifyCheckpoint(blockHeight, &blockHash) {\n\t\tstr := fmt.Sprintf(\"block at height %d does not match \"+\n\t\t\t\"checkpoint hash\", blockHeight)\n\t\treturn ruleError(ErrBadCheckpoint, str)\n\t}\n\n\t// Find the previous checkpoint and prevent blocks which fork the main\n\t// chain before it.  This prevents storage of new, otherwise valid,\n\t// blocks which build off of old blocks that are likely at a much easier\n\t// difficulty and therefore could be used to waste cache and disk space.\n\tcheckpointNode, err := c.FindPreviousCheckpoint()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif checkpointNode != nil && blockHeight < checkpointNode.Height() {\n\t\tstr := fmt.Sprintf(\"block at height %d forks the main chain \"+\n\t\t\t\"before the previous checkpoint at height %d\",\n\t\t\tblockHeight, checkpointNode.Height())\n\t\treturn ruleError(ErrForkTooOld, str)\n\t}\n\n\treturn nil\n}\n\n// assertNoTimeWarp checks the timestamp of the block against the previous\n// block's timestamp for the first block of each difficulty adjustment interval\n// to prevent timewarp attacks. This is defined in BIP-0094.\nfunc assertNoTimeWarp(blockHeight, blocksPerReTarget int32, headerTimestamp,\n\tprevBlockTimestamp time.Time) error {\n\n\t// If this isn't the first block of the difficulty adjustment interval,\n\t// then we can exit early.\n\tif blockHeight%blocksPerReTarget != 0 {\n\t\treturn nil\n\t}\n\n\t// Check timestamp for the first block of each difficulty adjustment\n\t// interval, except the genesis block.\n\tif headerTimestamp.Before(prevBlockTimestamp.Add(-maxTimeWarp)) {\n\t\tstr := \"block's timestamp %v is too early on diff adjustment \" +\n\t\t\t\"block %v\"\n\t\tstr = fmt.Sprintf(str, headerTimestamp, prevBlockTimestamp)\n\t\treturn ruleError(ErrTimewarpAttack, str)\n\t}\n\n\treturn nil\n}\n\n// checkBlockContext performs several validation checks on the block which depend\n// on its position within the block chain.\n//\n// The flags modify the behavior of this function as follows:\n//   - BFFastAdd: The transaction are not checked to see if they are finalized\n//     and the somewhat expensive BIP0034 validation is not performed.\n//\n// The flags are also passed to checkBlockHeaderContext.  See its documentation\n// for how the flags modify its behavior.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) checkBlockContext(block *btcutil.Block, prevNode *blockNode, flags BehaviorFlags) error {\n\t// Perform all block header related validation checks.\n\theader := &block.MsgBlock().Header\n\terr := CheckBlockHeaderContext(header, prevNode, flags, b, false)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfastAdd := flags&BFFastAdd == BFFastAdd\n\tif !fastAdd {\n\t\t// Obtain the latest state of the deployed CSV soft-fork in\n\t\t// order to properly guard the new validation behavior based on\n\t\t// the current BIP 9 version bits state.\n\t\tcsvState, err := b.deploymentState(prevNode, chaincfg.DeploymentCSV)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Once the CSV soft-fork is fully active, we'll switch to\n\t\t// using the current median time past of the past block's\n\t\t// timestamps for all lock-time based checks.\n\t\tblockTime := header.Timestamp\n\t\tif csvState == ThresholdActive {\n\t\t\tblockTime = CalcPastMedianTime(prevNode)\n\t\t}\n\n\t\t// The height of this block is one more than the referenced\n\t\t// previous block.\n\t\tblockHeight := prevNode.height + 1\n\n\t\t// Ensure all transactions in the block are finalized.\n\t\tfor _, tx := range block.Transactions() {\n\t\t\tif !IsFinalizedTransaction(tx, blockHeight,\n\t\t\t\tblockTime) {\n\n\t\t\t\tstr := fmt.Sprintf(\"block contains unfinalized \"+\n\t\t\t\t\t\"transaction %v\", tx.Hash())\n\t\t\t\treturn ruleError(ErrUnfinalizedTx, str)\n\t\t\t}\n\t\t}\n\n\t\t// Ensure coinbase starts with serialized block heights for\n\t\t// blocks whose version is the serializedHeightVersion or newer\n\t\t// once a majority of the network has upgraded.  This is part of\n\t\t// BIP0034.\n\t\tif ShouldHaveSerializedBlockHeight(header) &&\n\t\t\tblockHeight >= b.chainParams.BIP0034Height {\n\n\t\t\tcoinbaseTx := block.Transactions()[0]\n\t\t\terr := CheckSerializedHeight(coinbaseTx, blockHeight)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// Query for the Version Bits state for the segwit soft-fork\n\t\t// deployment. If segwit is active, we'll switch over to\n\t\t// enforcing all the new rules.\n\t\tsegwitState, err := b.deploymentState(prevNode,\n\t\t\tchaincfg.DeploymentSegwit)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// If segwit is active, then we'll need to fully validate the\n\t\t// new witness commitment for adherence to the rules.\n\t\tif segwitState == ThresholdActive {\n\t\t\t// Validate the witness commitment (if any) within the\n\t\t\t// block.  This involves asserting that if the coinbase\n\t\t\t// contains the special commitment output, then this\n\t\t\t// merkle root matches a computed merkle root of all\n\t\t\t// the wtxid's of the transactions within the block. In\n\t\t\t// addition, various other checks against the\n\t\t\t// coinbase's witness stack.\n\t\t\tif err := ValidateWitnessCommitment(block); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Once the witness commitment, witness nonce, and sig\n\t\t\t// op cost have been validated, we can finally assert\n\t\t\t// that the block's weight doesn't exceed the current\n\t\t\t// consensus parameter.\n\t\t\tblockWeight := GetBlockWeight(block)\n\t\t\tif blockWeight > MaxBlockWeight {\n\t\t\t\tstr := fmt.Sprintf(\"block's weight metric is \"+\n\t\t\t\t\t\"too high - got %v, max %v\",\n\t\t\t\t\tblockWeight, MaxBlockWeight)\n\t\t\t\treturn ruleError(ErrBlockWeightTooHigh, str)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// checkBIP0030 ensures blocks do not contain duplicate transactions which\n// 'overwrite' older transactions that are not fully spent.  This prevents an\n// attack where a coinbase and all of its dependent transactions could be\n// duplicated to effectively revert the overwritten transactions to a single\n// confirmation thereby making them vulnerable to a double spend.\n//\n// For more details, see\n// https://github.com/bitcoin/bips/blob/master/bip-0030.mediawiki and\n// http://r6.ca/blog/20120206T005236Z.html.\n//\n// This function MUST be called with the chain state lock held (for reads).\nfunc (b *BlockChain) checkBIP0030(node *blockNode, block *btcutil.Block, view *UtxoViewpoint) error {\n\t// Fetch utxos for all of the transaction outputs in this block.\n\t// Typically, there will not be any utxos for any of the outputs.\n\tfetch := make([]wire.OutPoint, 0, len(block.Transactions()))\n\tfor _, tx := range block.Transactions() {\n\t\tprevOut := wire.OutPoint{Hash: *tx.Hash()}\n\t\tfor txOutIdx := range tx.MsgTx().TxOut {\n\t\t\tprevOut.Index = uint32(txOutIdx)\n\t\t\tfetch = append(fetch, prevOut)\n\t\t}\n\t}\n\terr := view.fetchUtxos(b.utxoCache, fetch)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Duplicate transactions are only allowed if the previous transaction\n\t// is fully spent.\n\tfor _, outpoint := range fetch {\n\t\tutxo := view.LookupEntry(outpoint)\n\t\tif utxo != nil && !utxo.IsSpent() {\n\t\t\tstr := fmt.Sprintf(\"tried to overwrite transaction %v \"+\n\t\t\t\t\"at block height %d that is not fully spent\",\n\t\t\t\toutpoint.Hash, utxo.BlockHeight())\n\t\t\treturn ruleError(ErrOverwriteTx, str)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// CheckTransactionInputs performs a series of checks on the inputs to a\n// transaction to ensure they are valid.  An example of some of the checks\n// include verifying all inputs exist, ensuring the coinbase seasoning\n// requirements are met, detecting double spends, validating all values and fees\n// are in the legal range and the total output amount doesn't exceed the input\n// amount, and verifying the signatures to prove the spender was the owner of\n// the bitcoins and therefore allowed to spend them.  As it checks the inputs,\n// it also calculates the total fees for the transaction and returns that value.\n//\n// NOTE: The transaction MUST have already been sanity checked with the\n// CheckTransactionSanity function prior to calling this function.\nfunc CheckTransactionInputs(tx *btcutil.Tx, txHeight int32, utxoView *UtxoViewpoint, chainParams *chaincfg.Params) (int64, error) {\n\t// Coinbase transactions have no inputs.\n\tif IsCoinBase(tx) {\n\t\treturn 0, nil\n\t}\n\n\tvar totalSatoshiIn int64\n\tfor txInIndex, txIn := range tx.MsgTx().TxIn {\n\t\t// Ensure the referenced input transaction is available.\n\t\tutxo := utxoView.LookupEntry(txIn.PreviousOutPoint)\n\t\tif utxo == nil || utxo.IsSpent() {\n\t\t\tstr := fmt.Sprintf(\"output %v referenced from \"+\n\t\t\t\t\"transaction %s:%d either does not exist or \"+\n\t\t\t\t\"has already been spent\", txIn.PreviousOutPoint,\n\t\t\t\ttx.Hash(), txInIndex)\n\t\t\treturn 0, ruleError(ErrMissingTxOut, str)\n\t\t}\n\n\t\t// Ensure the transaction is not spending coins which have not\n\t\t// yet reached the required coinbase maturity.\n\t\tif utxo.IsCoinBase() {\n\t\t\toriginHeight := utxo.BlockHeight()\n\t\t\tblocksSincePrev := txHeight - originHeight\n\t\t\tcoinbaseMaturity := int32(chainParams.CoinbaseMaturity)\n\t\t\tif blocksSincePrev < coinbaseMaturity {\n\t\t\t\tstr := fmt.Sprintf(\"tried to spend coinbase \"+\n\t\t\t\t\t\"transaction output %v from height %v \"+\n\t\t\t\t\t\"at height %v before required maturity \"+\n\t\t\t\t\t\"of %v blocks\", txIn.PreviousOutPoint,\n\t\t\t\t\toriginHeight, txHeight,\n\t\t\t\t\tcoinbaseMaturity)\n\t\t\t\treturn 0, ruleError(ErrImmatureSpend, str)\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the transaction amounts are in range.  Each of the\n\t\t// output values of the input transactions must not be negative\n\t\t// or more than the max allowed per transaction.  All amounts in\n\t\t// a transaction are in a unit value known as a satoshi.  One\n\t\t// bitcoin is a quantity of satoshi as defined by the\n\t\t// SatoshiPerBitcoin constant.\n\t\toriginTxSatoshi := utxo.Amount()\n\t\tif originTxSatoshi < 0 {\n\t\t\tstr := fmt.Sprintf(\"transaction output has negative \"+\n\t\t\t\t\"value of %v\", btcutil.Amount(originTxSatoshi))\n\t\t\treturn 0, ruleError(ErrBadTxOutValue, str)\n\t\t}\n\t\tif originTxSatoshi > btcutil.MaxSatoshi {\n\t\t\tstr := fmt.Sprintf(\"transaction output value is \"+\n\t\t\t\t\"higher than max allowed value: %v > %v \",\n\t\t\t\tbtcutil.Amount(originTxSatoshi),\n\t\t\t\tbtcutil.MaxSatoshi)\n\t\t\treturn 0, ruleError(ErrBadTxOutValue, str)\n\t\t}\n\n\t\t// The total of all outputs must not be more than the max\n\t\t// allowed per transaction.  Also, we could potentially overflow\n\t\t// the accumulator so check for overflow.\n\t\tlastSatoshiIn := totalSatoshiIn\n\t\ttotalSatoshiIn += originTxSatoshi\n\t\tif totalSatoshiIn < lastSatoshiIn ||\n\t\t\ttotalSatoshiIn > btcutil.MaxSatoshi {\n\t\t\tstr := fmt.Sprintf(\"total value of all transaction \"+\n\t\t\t\t\"inputs is %v which is higher than max \"+\n\t\t\t\t\"allowed value of %v\", totalSatoshiIn,\n\t\t\t\tbtcutil.MaxSatoshi)\n\t\t\treturn 0, ruleError(ErrBadTxOutValue, str)\n\t\t}\n\t}\n\n\t// Calculate the total output amount for this transaction.  It is safe\n\t// to ignore overflow and out of range errors here because those error\n\t// conditions would have already been caught by checkTransactionSanity.\n\tvar totalSatoshiOut int64\n\tfor _, txOut := range tx.MsgTx().TxOut {\n\t\ttotalSatoshiOut += txOut.Value\n\t}\n\n\t// Ensure the transaction does not spend more than its inputs.\n\tif totalSatoshiIn < totalSatoshiOut {\n\t\tstr := fmt.Sprintf(\"total value of all transaction inputs for \"+\n\t\t\t\"transaction %v is %v which is less than the amount \"+\n\t\t\t\"spent of %v\", tx.Hash(), totalSatoshiIn, totalSatoshiOut)\n\t\treturn 0, ruleError(ErrSpendTooHigh, str)\n\t}\n\n\t// NOTE: bitcoind checks if the transaction fees are < 0 here, but that\n\t// is an impossible condition because of the check above that ensures\n\t// the inputs are >= the outputs.\n\ttxFeeInSatoshi := totalSatoshiIn - totalSatoshiOut\n\treturn txFeeInSatoshi, nil\n}\n\n// checkConnectBlock performs several checks to confirm connecting the passed\n// block to the chain represented by the passed view does not violate any rules.\n// In addition, the passed view is updated to spend all of the referenced\n// outputs and add all of the new utxos created by block.  Thus, the view will\n// represent the state of the chain as if the block were actually connected and\n// consequently the best hash for the view is also updated to passed block.\n//\n// An example of some of the checks performed are ensuring connecting the block\n// would not cause any duplicate transaction hashes for old transactions that\n// aren't already fully spent, double spends, exceeding the maximum allowed\n// signature operations per block, invalid values in relation to the expected\n// block subsidy, or fail transaction script validation.\n//\n// The CheckConnectBlockTemplate function makes use of this function to perform\n// the bulk of its work.  The only difference is this function accepts a node\n// which may or may not require reorganization to connect it to the main chain\n// whereas CheckConnectBlockTemplate creates a new node which specifically\n// connects to the end of the current main chain and then calls this function\n// with that node.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) checkConnectBlock(node *blockNode, block *btcutil.Block, view *UtxoViewpoint, stxos *[]SpentTxOut) error {\n\t// If the side chain blocks end up in the database, a call to\n\t// CheckBlockSanity should be done here in case a previous version\n\t// allowed a block that is no longer valid.  However, since the\n\t// implementation only currently uses memory for the side chain blocks,\n\t// it isn't currently necessary.\n\n\t// The coinbase for the Genesis block is not spendable, so just return\n\t// an error now.\n\tif node.hash.IsEqual(b.chainParams.GenesisHash) {\n\t\tstr := \"the coinbase for the genesis block is not spendable\"\n\t\treturn ruleError(ErrMissingTxOut, str)\n\t}\n\n\t// Ensure the view is for the node being checked.\n\tparentHash := &block.MsgBlock().Header.PrevBlock\n\tif !view.BestHash().IsEqual(parentHash) {\n\t\treturn AssertError(fmt.Sprintf(\"inconsistent view when \"+\n\t\t\t\"checking block connection: best hash is %v instead \"+\n\t\t\t\"of expected %v\", view.BestHash(), parentHash))\n\t}\n\n\t// BIP0030 added a rule to prevent blocks which contain duplicate\n\t// transactions that 'overwrite' older transactions which are not fully\n\t// spent.  See the documentation for checkBIP0030 for more details.\n\t//\n\t// There are two blocks in the chain which violate this rule, so the\n\t// check must be skipped for those blocks.  The isBIP0030Node function\n\t// is used to determine if this block is one of the two blocks that must\n\t// be skipped.\n\t//\n\t// In addition, as of BIP0034, duplicate coinbases are no longer\n\t// possible due to its requirement for including the block height in the\n\t// coinbase and thus it is no longer possible to create transactions\n\t// that 'overwrite' older ones.  Therefore, only enforce the rule if\n\t// BIP0034 is not yet active.  This is a useful optimization because the\n\t// BIP0030 check is expensive since it involves a ton of cache misses in\n\t// the utxoset.\n\tif !isBIP0030Node(node) && (node.height < b.chainParams.BIP0034Height) {\n\t\terr := b.checkBIP0030(node, block, view)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Load all of the utxos referenced by the inputs for all transactions\n\t// in the block don't already exist in the utxo view from the cache.\n\t//\n\t// These utxo entries are needed for verification of things such as\n\t// transaction inputs, counting pay-to-script-hashes, and scripts.\n\terr := view.fetchInputUtxos(b.utxoCache, block)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// BIP0016 describes a pay-to-script-hash type that is considered a\n\t// \"standard\" type.  The rules for this BIP only apply to transactions\n\t// after the timestamp defined by txscript.Bip16Activation.  See\n\t// https://en.bitcoin.it/wiki/BIP_0016 for more details.\n\tenforceBIP0016 := node.timestamp >= txscript.Bip16Activation.Unix()\n\n\t// Query for the Version Bits state for the segwit soft-fork\n\t// deployment. If segwit is active, we'll switch over to enforcing all\n\t// the new rules.\n\tsegwitState, err := b.deploymentState(node.parent, chaincfg.DeploymentSegwit)\n\tif err != nil {\n\t\treturn err\n\t}\n\tenforceSegWit := segwitState == ThresholdActive\n\n\t// The number of signature operations must be less than the maximum\n\t// allowed per block.  Note that the preliminary sanity checks on a\n\t// block also include a check similar to this one, but this check\n\t// expands the count to include a precise count of pay-to-script-hash\n\t// signature operations in each of the input transaction public key\n\t// scripts.\n\ttransactions := block.Transactions()\n\ttotalSigOpCost := 0\n\tfor i, tx := range transactions {\n\t\t// Since the first (and only the first) transaction has\n\t\t// already been verified to be a coinbase transaction,\n\t\t// use i == 0 as an optimization for the flag to\n\t\t// countP2SHSigOps for whether or not the transaction is\n\t\t// a coinbase transaction rather than having to do a\n\t\t// full coinbase check again.\n\t\tsigOpCost, err := GetSigOpCost(tx, i == 0, view, enforceBIP0016,\n\t\t\tenforceSegWit)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Check for overflow or going over the limits.  We have to do\n\t\t// this on every loop iteration to avoid overflow.\n\t\tlastSigOpCost := totalSigOpCost\n\t\ttotalSigOpCost += sigOpCost\n\t\tif totalSigOpCost < lastSigOpCost || totalSigOpCost > MaxBlockSigOpsCost {\n\t\t\tstr := fmt.Sprintf(\"block contains too many \"+\n\t\t\t\t\"signature operations - got %v, max %v\",\n\t\t\t\ttotalSigOpCost, MaxBlockSigOpsCost)\n\t\t\treturn ruleError(ErrTooManySigOps, str)\n\t\t}\n\t}\n\n\t// Perform several checks on the inputs for each transaction.  Also\n\t// accumulate the total fees.  This could technically be combined with\n\t// the loop above instead of running another loop over the transactions,\n\t// but by separating it we can avoid running the more expensive (though\n\t// still relatively cheap as compared to running the scripts) checks\n\t// against all the inputs when the signature operations are out of\n\t// bounds.\n\tvar totalFees int64\n\tfor _, tx := range transactions {\n\t\ttxFee, err := CheckTransactionInputs(tx, node.height, view,\n\t\t\tb.chainParams)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Sum the total fees and ensure we don't overflow the\n\t\t// accumulator.\n\t\tlastTotalFees := totalFees\n\t\ttotalFees += txFee\n\t\tif totalFees < lastTotalFees {\n\t\t\treturn ruleError(ErrBadFees, \"total fees for block \"+\n\t\t\t\t\"overflows accumulator\")\n\t\t}\n\n\t\t// Add all of the outputs for this transaction which are not\n\t\t// provably unspendable as available utxos.  Also, the passed\n\t\t// spent txos slice is updated to contain an entry for each\n\t\t// spent txout in the order each transaction spends them.\n\t\terr = view.connectTransaction(tx, node.height, stxos)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// The total output values of the coinbase transaction must not exceed\n\t// the expected subsidy value plus total transaction fees gained from\n\t// mining the block.  It is safe to ignore overflow and out of range\n\t// errors here because those error conditions would have already been\n\t// caught by checkTransactionSanity.\n\tvar totalSatoshiOut int64\n\tfor _, txOut := range transactions[0].MsgTx().TxOut {\n\t\ttotalSatoshiOut += txOut.Value\n\t}\n\texpectedSatoshiOut := CalcBlockSubsidy(node.height, b.chainParams) +\n\t\ttotalFees\n\tif totalSatoshiOut > expectedSatoshiOut {\n\t\tstr := fmt.Sprintf(\"coinbase transaction for block pays %v \"+\n\t\t\t\"which is more than expected value of %v\",\n\t\t\ttotalSatoshiOut, expectedSatoshiOut)\n\t\treturn ruleError(ErrBadCoinbaseValue, str)\n\t}\n\n\t// Don't run scripts if this node is before the latest known good\n\t// checkpoint since the validity is verified via the checkpoints (all\n\t// transactions are included in the merkle root hash and any changes\n\t// will therefore be detected by the next checkpoint).  This is a huge\n\t// optimization because running the scripts is the most time consuming\n\t// portion of block handling.\n\tcheckpoint := b.LatestCheckpoint()\n\trunScripts := true\n\tif checkpoint != nil && node.height <= checkpoint.Height {\n\t\trunScripts = false\n\t}\n\n\t// Blocks created after the BIP0016 activation time need to have the\n\t// pay-to-script-hash checks enabled.\n\tvar scriptFlags txscript.ScriptFlags\n\tif enforceBIP0016 {\n\t\tscriptFlags |= txscript.ScriptBip16\n\t}\n\n\t// Enforce DER signatures for block versions 3+ once the historical\n\t// activation threshold has been reached.  This is part of BIP0066.\n\tblockHeader := &block.MsgBlock().Header\n\tif blockHeader.Version >= 3 && node.height >= b.chainParams.BIP0066Height {\n\t\tscriptFlags |= txscript.ScriptVerifyDERSignatures\n\t}\n\n\t// Enforce CHECKLOCKTIMEVERIFY for block versions 4+ once the historical\n\t// activation threshold has been reached.  This is part of BIP0065.\n\tif blockHeader.Version >= 4 && node.height >= b.chainParams.BIP0065Height {\n\t\tscriptFlags |= txscript.ScriptVerifyCheckLockTimeVerify\n\t}\n\n\t// Enforce CHECKSEQUENCEVERIFY during all block validation checks once\n\t// the soft-fork deployment is fully active.\n\tcsvState, err := b.deploymentState(node.parent, chaincfg.DeploymentCSV)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif csvState == ThresholdActive {\n\t\t// If the CSV soft-fork is now active, then modify the\n\t\t// scriptFlags to ensure that the CSV op code is properly\n\t\t// validated during the script checks below.\n\t\tscriptFlags |= txscript.ScriptVerifyCheckSequenceVerify\n\n\t\t// We obtain the MTP of the *previous* block in order to\n\t\t// determine if transactions in the current block are final.\n\t\tmedianTime := CalcPastMedianTime(node.parent)\n\n\t\t// Additionally, if the CSV soft-fork package is now active,\n\t\t// then we also enforce the relative sequence number based\n\t\t// lock-times within the inputs of all transactions in this\n\t\t// candidate block.\n\t\tfor _, tx := range block.Transactions() {\n\t\t\t// A transaction can only be included within a block\n\t\t\t// once the sequence locks of *all* its inputs are\n\t\t\t// active.\n\t\t\tsequenceLock, err := b.calcSequenceLock(node, tx, view,\n\t\t\t\tfalse)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif !SequenceLockActive(sequenceLock, node.height,\n\t\t\t\tmedianTime) {\n\t\t\t\tstr := fmt.Sprintf(\"block contains \" +\n\t\t\t\t\t\"transaction whose input sequence \" +\n\t\t\t\t\t\"locks are not met\")\n\t\t\t\treturn ruleError(ErrUnfinalizedTx, str)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Enforce the segwit soft-fork package once the soft-fork has shifted\n\t// into the \"active\" version bits state.\n\tif enforceSegWit {\n\t\tscriptFlags |= txscript.ScriptVerifyWitness\n\t\tscriptFlags |= txscript.ScriptStrictMultiSig\n\t}\n\n\t// Before we execute the main scripts, we'll also check to see if\n\t// taproot is active or not.\n\ttaprootState, err := b.deploymentState(\n\t\tnode.parent, chaincfg.DeploymentTaproot,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif taprootState == ThresholdActive {\n\t\tscriptFlags |= txscript.ScriptVerifyTaproot\n\t}\n\n\t// Now that the inexpensive checks are done and have passed, verify the\n\t// transactions are actually allowed to spend the coins by running the\n\t// expensive ECDSA signature check scripts.  Doing this last helps\n\t// prevent CPU exhaustion attacks.\n\tif runScripts {\n\t\terr := checkBlockScripts(block, view, scriptFlags, b.sigCache,\n\t\t\tb.hashCache)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Update the best hash for view to include this block since all of its\n\t// transactions have been connected.\n\tview.SetBestHash(&node.hash)\n\n\treturn nil\n}\n\n// CheckConnectBlockTemplate fully validates that connecting the passed block to\n// the main chain does not violate any consensus rules, aside from the proof of\n// work requirement. The block must connect to the current tip of the main chain.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) CheckConnectBlockTemplate(block *btcutil.Block) error {\n\tb.chainLock.Lock()\n\tdefer b.chainLock.Unlock()\n\n\t// Skip the proof of work check as this is just a block template.\n\tflags := BFNoPoWCheck\n\n\t// This only checks whether the block can be connected to the tip of the\n\t// current chain.\n\ttip := b.bestChain.Tip()\n\theader := block.MsgBlock().Header\n\tif tip.hash != header.PrevBlock {\n\t\tstr := fmt.Sprintf(\"previous block must be the current chain tip %v, \"+\n\t\t\t\"instead got %v\", tip.hash, header.PrevBlock)\n\t\treturn ruleError(ErrPrevBlockNotBest, str)\n\t}\n\n\terr := checkBlockSanity(block, b.chainParams.PowLimit, b.timeSource, flags)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = b.checkBlockContext(block, tip, flags)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Leave the spent txouts entry nil in the state since the information\n\t// is not needed and thus extra work can be avoided.\n\tview := NewUtxoViewpoint()\n\tview.SetBestHash(&tip.hash)\n\tnewNode := newBlockNode(&header, tip)\n\treturn b.checkConnectBlock(newNode, block, view, nil)\n}\n\n// ChainParams returns the Blockchain's configured chaincfg.Params.\n//\n// NOTE: Part of the ChainCtx interface.\nfunc (b *BlockChain) ChainParams() *chaincfg.Params {\n\treturn b.chainParams\n}\n\n// BlocksPerRetarget returns the number of blocks before retargeting occurs.\n//\n// NOTE: Part of the ChainCtx interface.\nfunc (b *BlockChain) BlocksPerRetarget() int32 {\n\treturn b.blocksPerRetarget\n}\n\n// MinRetargetTimespan returns the minimum amount of time to use in the\n// difficulty calculation.\n//\n// NOTE: Part of the ChainCtx interface.\nfunc (b *BlockChain) MinRetargetTimespan() int64 {\n\treturn b.minRetargetTimespan\n}\n\n// MaxRetargetTimespan returns the maximum amount of time to use in the\n// difficulty calculation.\n//\n// NOTE: Part of the ChainCtx interface.\nfunc (b *BlockChain) MaxRetargetTimespan() int64 {\n\treturn b.maxRetargetTimespan\n}\n\n// VerifyCheckpoint checks that the height and hash match the stored\n// checkpoints.\n//\n// NOTE: Part of the ChainCtx interface.\nfunc (b *BlockChain) VerifyCheckpoint(height int32,\n\thash *chainhash.Hash) bool {\n\n\treturn b.verifyCheckpoint(height, hash)\n}\n\n// FindPreviousCheckpoint finds the checkpoint we've encountered during\n// validation.\n//\n// NOTE: Part of the ChainCtx interface.\nfunc (b *BlockChain) FindPreviousCheckpoint() (HeaderCtx, error) {\n\tcheckpoint, err := b.findPreviousCheckpoint()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif checkpoint == nil {\n\t\t// This check is necessary because if we just return the nil\n\t\t// blockNode as a HeaderCtx, a caller performing a nil-check\n\t\t// will fail. This is a quirk of go where a nil value stored in\n\t\t// an interface is different from the actual nil interface.\n\t\treturn nil, nil\n\t}\n\n\treturn checkpoint, err\n}\n\n// A compile-time assertion to ensure BlockChain implements the ChainCtx\n// interface.\nvar _ ChainCtx = (*BlockChain)(nil)\n"
  },
  {
    "path": "blockchain/validate_rapid_test.go",
    "content": "package blockchain\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/require\"\n\t\"pgregory.net/rapid\"\n)\n\n// TestAssertNoTimeWarpProperties uses property-based testing to verify that\n// the assertNoTimeWarp function correctly implements the BIP-94 rule. This\n// helps catch edge cases that might be missed with regular unit tests.\nfunc TestAssertNoTimeWarpProperties(t *testing.T) {\n\tt.Parallel()\n\n\t// Define constant for blocks per retarget (similar to Bitcoin's 2016).\n\tconst blocksPerRetarget = 2016\n\n\t// Rapid test that only the retarget blocks are checked.\n\tt.Run(\"only_checks_retarget_blocks\", rapid.MakeCheck(func(t *rapid.T) {\n\t\t// Generate block height that is not a retarget block.\n\t\theight := rapid.Int32Range(\n\t\t\t1, 1000000,\n\t\t).Filter(func(h int32) bool {\n\t\t\treturn h%blocksPerRetarget != 0\n\t\t}).Draw(t, \"height\")\n\n\t\t// Even with an \"extreme\" time warp, the function should return\n\t\t// nil because it only applies the check to retarget blocks.\n\t\t// Define headerTime as the Unix epoch start.\n\t\theaderTime := time.Unix(0, 0)\n\n\t\t// Define prevBlockTime as the current time (creating an\n\t\t// extreme gap).\n\t\tprevBlockTime := time.Now()\n\n\t\terr := assertNoTimeWarp(\n\t\t\theight, blocksPerRetarget, headerTime, prevBlockTime,\n\t\t)\n\t\trequire.NoError(\n\t\t\tt, err, \"expected nil error for non-retarget block \"+\n\t\t\t\t\"but got: %v.\", err,\n\t\t)\n\t}))\n\n\t// Rapid test that retarget blocks with acceptable timestamps pass\n\t// validation.\n\tt.Run(\"valid_timestamps_pass\", rapid.MakeCheck(func(t *rapid.T) {\n\t\t// Generate block height that is a retarget block\n\t\theight := rapid.Int32Range(blocksPerRetarget, 1000000).\n\t\t\tFilter(func(h int32) bool {\n\t\t\t\treturn h%blocksPerRetarget == 0\n\t\t\t}).Draw(t, \"height\")\n\n\t\t// Generate a previous block timestamp.\n\t\tprevTimeUnix := rapid.Int64Range(\n\t\t\t1000000, 2000000000,\n\t\t).Draw(t, \"prev_time\")\n\t\tprevBlockTime := time.Unix(prevTimeUnix, 0)\n\n\t\t// Generate a header timestamp that is not more than\n\t\t// maxTimeWarp earlier than the previous block timestamp.\n\t\tminValidHeaderTime := prevBlockTime.Add(\n\t\t\t-maxTimeWarp,\n\t\t).Add(time.Second)\n\n\t\t// Generate any valid header time between the minimum valid\n\t\t// time and prevBlockTime to ensure it passes the time warp\n\t\t// check.\n\t\tminTimeUnix := minValidHeaderTime.Unix()\n\t\tmaxTimeUnix := prevBlockTime.Unix()\n\n\t\t// Ensure min is always less than max.\n\t\tif minTimeUnix >= maxTimeUnix {\n\t\t\t// If a valid range cannot be generated, use the\n\t\t\t// previous block time which is guaranteed to pass the\n\t\t\t// test.\n\t\t\theaderTime := prevBlockTime\n\t\t\terr := assertNoTimeWarp(\n\t\t\t\theight, blocksPerRetarget, headerTime, prevBlockTime,\n\t\t\t)\n\t\t\trequire.NoError(t, err, \"expected valid timestamps to \"+\n\t\t\t\t\"pass but got: %v.\")\n\t\t\treturn\n\t\t}\n\n\t\theaderTimeUnix := rapid.Int64Range(\n\t\t\tminTimeUnix, maxTimeUnix,\n\t\t).Draw(t, \"header_time_unix\")\n\t\theaderTime := time.Unix(headerTimeUnix, 0)\n\n\t\terr := assertNoTimeWarp(\n\t\t\theight, blocksPerRetarget, headerTime, prevBlockTime,\n\t\t)\n\t\trequire.NoError(t, err, \"expected valid timestamps to pass but \"+\n\t\t\t\"got: %v.\")\n\t}))\n\n\t// Rapid test that retarget blocks with invalid timestamps fail\n\tt.Run(\"invalid_timestamps_fail\", rapid.MakeCheck(func(t *rapid.T) {\n\t\t// validation.\n\t\t// Generate block height that is a retarget block.\n\t\theight := rapid.Int32Range(blocksPerRetarget, 1000000).\n\t\t\tFilter(func(h int32) bool {\n\t\t\t\treturn h%blocksPerRetarget == 0\n\t\t\t}).Draw(t, \"height\")\n\n\t\t// Generate a previous block timestamp.\n\t\tprevTimeUnix := rapid.Int64Range(\n\t\t\t1000000, 2000000000,\n\t\t).Draw(t, \"prev_time\")\n\t\tprevBlockTime := time.Unix(prevTimeUnix, 0)\n\n\t\t// Invalid header timestamp: more than maxTimeWarp earlier than\n\t\t// prevBlockTime Ensure we generate a time that is definitely\n\t\t// beyond the maxTimeWarp (which is 600 seconds) by using at\n\t\t// least 601 seconds.\n\t\tinvalidDelta := time.Duration(\n\t\t\t-rapid.Int64Range(601, 86400).Draw(t, \"invalid_delta\"),\n\t\t) * time.Second\n\t\theaderTime := prevBlockTime.Add(invalidDelta)\n\n\t\terr := assertNoTimeWarp(\n\t\t\theight, blocksPerRetarget, headerTime, prevBlockTime,\n\t\t)\n\t\trequire.Error(t, err, \"expected error for time-warped header but got nil.\")\n\n\t\t// Verify the correct error type is returned.\n\t\trequire.IsType(\n\t\t\tt, RuleError{}, err, \"expected RuleError but got: %T.\", err,\n\t\t)\n\n\t\t// Verify it's the expected ErrTimewarpAttack error.\n\t\truleErr, ok := err.(RuleError)\n\t\trequire.True(t, ok, \"expected RuleError but got: %T.\", err)\n\t\trequire.Equal(\n\t\t\tt, ErrTimewarpAttack, ruleErr.ErrorCode, \"expected \"+\n\t\t\t\t\"ErrTimewarpAttack but got: %v.\", ruleErr.ErrorCode,\n\t\t)\n\t}))\n\n\t// Test the edge case right at the boundary of maxTimeWarp.\n\tt.Run(\"boundary_timestamps\", rapid.MakeCheck(func(t *rapid.T) {\n\t\t// Generate block height that is a retarget block.\n\t\theight := rapid.Int32Range(blocksPerRetarget, 1000000).\n\t\t\tFilter(func(h int32) bool {\n\t\t\t\treturn h%blocksPerRetarget == 0\n\t\t\t}).Draw(t, \"height\")\n\n\t\t// Generate a previous block timestamp with enough padding\n\t\t// to avoid time.Time precision issues.\n\t\tprevTimeUnix := rapid.Int64Range(\n\t\t\t1000000, 2000000000,\n\t\t).Draw(t, \"prev_time\")\n\t\tprevBlockTime := time.Unix(prevTimeUnix, 0)\n\n\t\t// Test exact boundary: headerTime is exactly maxTimeWarp earlier.\n\t\theaderTime := prevBlockTime.Add(-maxTimeWarp)\n\n\t\t// Check the actual implementation (looking at\n\t\t// validate.go:797-798) The comparison is\n\t\t// \"headerTimestamp.Before(prevBlockTimestamp.Add(-maxTimeWarp))\"\n\t\t// This means at exact boundary (headerTime ==\n\t\t// prevBlockTime.Add(-maxTimeWarp)) it should NOT fail, since\n\t\t// Before() is strict < not <=.\n\t\terr := assertNoTimeWarp(\n\t\t\theight, blocksPerRetarget, headerTime, prevBlockTime,\n\t\t)\n\t\trequire.NoError(\n\t\t\tt, err, \"expected no error at exact boundary but \"+\n\t\t\t\t\"got: %v.\",\n\t\t)\n\n\t\t// Test 1 nanosecond BEYOND the boundary (which should fail).\n\t\theaderTime = prevBlockTime.Add(-maxTimeWarp).Add(\n\t\t\t-time.Nanosecond,\n\t\t)\n\n\t\t// This should fail as it is just beyond the maxTimeWarp limit.\n\t\terr = assertNoTimeWarp(\n\t\t\theight, blocksPerRetarget, headerTime, prevBlockTime,\n\t\t)\n\t\trequire.Error(\n\t\t\tt, err, \"expected error just beyond boundary but \"+\n\t\t\t\t\"got nil.\",\n\t\t)\n\t}))\n}\n\n// TestAssertNoTimeWarpInvariants uses property-based testing to verify the\n// invariants of the assertNoTimeWarp function regardless of inputs.\nfunc TestAssertNoTimeWarpInvariants(t *testing.T) {\n\tt.Parallel()\n\n\t// Invariant: The function should never panic regardless of input.\n\tt.Run(\"never_panics\", rapid.MakeCheck(func(t *rapid.T) {\n\t\t// Generate any possible inputs\n\t\theight := rapid.Int32().Draw(t, \"height\")\n\t\tblocksPerRetarget := rapid.Int32Range(\n\t\t\t1, 10000,\n\t\t).Draw(t, \"blocks_per_retarget\")\n\t\theaderTimeUnix := rapid.Int64().Draw(t, \"header_time\")\n\t\tprevTimeUnix := rapid.Int64().Draw(t, \"prev_time\")\n\n\t\theaderTime := time.Unix(headerTimeUnix, 0)\n\t\tprevBlockTime := time.Unix(prevTimeUnix, 0)\n\n\t\t// The function should never panic regardless of input\n\t\t_ = assertNoTimeWarp(\n\t\t\theight, blocksPerRetarget, headerTime, prevBlockTime,\n\t\t)\n\t}))\n\n\t// Invariant: For non-retarget blocks, the function always returns nil.\n\t// nolint:lll.\n\tt.Run(\"non_retarget_blocks_return_nil\", rapid.MakeCheck(func(t *rapid.T) {\n\t\t// Generate height and blocksPerRetarget such that height is\n\t\t// not a multiple of blocksPerRetarget.\n\t\tblocksPerRetarget := rapid.Int32Range(2, 10000).Draw(\n\t\t\tt, \"blocks_per_retarget\",\n\t\t)\n\n\t\t// Ensure height is not a multiple of blocksPerRetarget.\n\t\tremainders := rapid.Int32Range(1, blocksPerRetarget-1).Draw(\n\t\t\tt, \"remainder\",\n\t\t)\n\t\theight := rapid.Int32Range(0, 1000000).Draw(\n\t\t\tt, \"base\",\n\t\t)*blocksPerRetarget + remainders\n\n\t\t// Generate any timestamps, even invalid ones.\n\t\theaderTime := time.Unix(rapid.Int64().Draw(t, \"header_time\"), 0)\n\t\tprevBlockTime := time.Unix(\n\t\t\trapid.Int64().Draw(t, \"prev_time\"), 0,\n\t\t)\n\n\t\t// For non-retarget blocks, should always return nil.\n\t\terr := assertNoTimeWarp(\n\t\t\theight, blocksPerRetarget, headerTime, prevBlockTime,\n\t\t)\n\t\trequire.NoError(\n\t\t\tt, err, \"expected nil for non-retarget block \"+\n\t\t\t\t\"(height=%d, blocks_per_retarget=%d) but \"+\n\t\t\t\t\"got: %v.\", height, blocksPerRetarget, err,\n\t\t)\n\t}))\n}\n\n// TestAssertNoTimeWarpSecurity tests the security properties of the\n// assertNoTimeWarp function. This verifies that the function properly prevents\n// \"time warp\" attacks where miners might attempt to manipulate timestamps for\n// difficulty adjustment blocks.\nfunc TestAssertNoTimeWarpSecurity(t *testing.T) {\n\tt.Parallel()\n\n\tconst blocksPerRetarget = 2016\n\n\t// Test that all difficulty adjustment blocks are protected from timewarp.\n\tt.Run(\"all_retarget_blocks_protected\", rapid.MakeCheck(func(t *rapid.T) { //nolint:lll\n\t\t// Generate any retarget block height (multiples of\n\t\t// blocksPerRetarget).\n\t\tmultiplier := rapid.Int32Range(1, 1000).Draw(t, \"multiplier\")\n\t\theight := multiplier * blocksPerRetarget\n\n\t\t// Generate a reasonable previous block timestamp.\n\t\tprevTimeUnix := rapid.Int64Range(\n\t\t\t1000000, 2000000000,\n\t\t).Draw(t, \"prev_time\")\n\t\tprevBlockTime := time.Unix(prevTimeUnix, 0)\n\n\t\t// Generate a test header timestamp that's significantly before\n\t\t// the previous timestamp This should always be rejected for\n\t\t// retarget blocks.\n\t\ttimeDiff := rapid.Int64Range(\n\t\t\tint64(maxTimeWarp+time.Second),\n\t\t\tint64(maxTimeWarp+time.Hour*24*7),\n\t\t).Draw(t, \"warp_amount\")\n\t\tinvalidDelta := time.Duration(-timeDiff)\n\t\theaderTime := prevBlockTime.Add(invalidDelta)\n\n\t\t// This should always fail with ErrTimewarpAttack for any retarget block.\n\t\terr := assertNoTimeWarp(\n\t\t\theight, blocksPerRetarget, headerTime, prevBlockTime,\n\t\t)\n\t\trequire.Error(\n\t\t\tt, err, \"security vulnerability: Time warp attack not \"+\n\t\t\t\t\"detected for height %d.\", height,\n\t\t)\n\n\t\t// Verify it's the expected error type.\n\t\truleErr, ok := err.(RuleError)\n\t\trequire.True(t, ok, \"expected RuleError but got: %T.\", err)\n\t\trequire.Equal(\n\t\t\tt, ErrTimewarpAttack, ruleErr.ErrorCode,\n\t\t\t\"expected ErrTimewarpAttack but got: %v.\",\n\t\t\truleErr.ErrorCode,\n\t\t)\n\t}))\n\n\t// Test that non-adjustment blocks are not subject to the same check.\n\t// nolint:lll.\n\tt.Run(\"non_retarget_blocks_not_affected\", rapid.MakeCheck(func(t *rapid.T) {\n\t\t// Generate any non-retarget block height.\n\t\tbaseHeight := rapid.Int32Range(0, 1000).Draw(\n\t\t\tt, \"base_height\",\n\t\t) * blocksPerRetarget\n\t\toffset := rapid.Int32Range(1, blocksPerRetarget-1).Draw(\n\t\t\tt, \"offset\",\n\t\t)\n\t\theight := baseHeight + offset\n\n\t\t// Generate a reasonable previous block timestamp.\n\t\tprevTimeUnix := rapid.Int64Range(1000000, 2000000000).Draw(\n\t\t\tt, \"prev_time\",\n\t\t)\n\t\tprevBlockTime := time.Unix(prevTimeUnix, 0)\n\n\t\t// Generate a test header timestamp that's significantly before\n\t\t// the previous timestamp. Even though this would be rejected\n\t\t// for retarget blocks, it shouldn't matter here.\n\t\ttimeDiff := rapid.Int64Range(\n\t\t\tint64(maxTimeWarp+time.Second),\n\t\t\tint64(maxTimeWarp+time.Hour*24*7),\n\t\t).Draw(t, \"warp_amount\")\n\t\tinvalidDelta := time.Duration(-timeDiff)\n\t\theaderTime := prevBlockTime.Add(invalidDelta)\n\n\t\t// This should NOT fail for non-retarget blocks, even with\n\t\t// extreme timewarp.\n\t\terr := assertNoTimeWarp(\n\t\t\theight, blocksPerRetarget, headerTime, prevBlockTime,\n\t\t)\n\t\trequire.NoError(\n\t\t\tt, err, \"non-retarget blocks should not be affected \"+\n\t\t\t\t\"by time warp check, but got: %v.\", err,\n\t\t)\n\t}))\n}\n"
  },
  {
    "path": "blockchain/validate_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"math\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TestSequenceLocksActive tests the SequenceLockActive function to ensure it\n// works as expected in all possible combinations/scenarios.\nfunc TestSequenceLocksActive(t *testing.T) {\n\tseqLock := func(h int32, s int64) *SequenceLock {\n\t\treturn &SequenceLock{\n\t\t\tSeconds:     s,\n\t\t\tBlockHeight: h,\n\t\t}\n\t}\n\n\ttests := []struct {\n\t\tseqLock     *SequenceLock\n\t\tblockHeight int32\n\t\tmtp         time.Time\n\n\t\twant bool\n\t}{\n\t\t// Block based sequence lock with equal block height.\n\t\t{seqLock: seqLock(1000, -1), blockHeight: 1001, mtp: time.Unix(9, 0), want: true},\n\n\t\t// Time based sequence lock with mtp past the absolute time.\n\t\t{seqLock: seqLock(-1, 30), blockHeight: 2, mtp: time.Unix(31, 0), want: true},\n\n\t\t// Block based sequence lock with current height below seq lock block height.\n\t\t{seqLock: seqLock(1000, -1), blockHeight: 90, mtp: time.Unix(9, 0), want: false},\n\n\t\t// Time based sequence lock with current time before lock time.\n\t\t{seqLock: seqLock(-1, 30), blockHeight: 2, mtp: time.Unix(29, 0), want: false},\n\n\t\t// Block based sequence lock at the same height, so shouldn't yet be active.\n\t\t{seqLock: seqLock(1000, -1), blockHeight: 1000, mtp: time.Unix(9, 0), want: false},\n\n\t\t// Time based sequence lock with current time equal to lock time, so shouldn't yet be active.\n\t\t{seqLock: seqLock(-1, 30), blockHeight: 2, mtp: time.Unix(30, 0), want: false},\n\t}\n\n\tt.Logf(\"Running %d sequence locks tests\", len(tests))\n\tfor i, test := range tests {\n\t\tgot := SequenceLockActive(test.seqLock,\n\t\t\ttest.blockHeight, test.mtp)\n\t\tif got != test.want {\n\t\t\tt.Fatalf(\"SequenceLockActive #%d got %v want %v\", i,\n\t\t\t\tgot, test.want)\n\t\t}\n\t}\n}\n\n// TestCheckConnectBlockTemplate tests the CheckConnectBlockTemplate function to\n// ensure it fails.\nfunc TestCheckConnectBlockTemplate(t *testing.T) {\n\t// Create a new database and chain instance to run tests against.\n\tchain, teardownFunc, err := chainSetup(\"checkconnectblocktemplate\",\n\t\t&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to setup chain instance: %v\", err)\n\t\treturn\n\t}\n\tdefer teardownFunc()\n\n\t// Since we're not dealing with the real block chain, set the coinbase\n\t// maturity to 1.\n\tchain.TstSetCoinbaseMaturity(1)\n\n\t// Load up blocks such that there is a side chain.\n\t// (genesis block) -> 1 -> 2 -> 3 -> 4\n\t//                          \\-> 3a\n\ttestFiles := []string{\n\t\t\"blk_0_to_4.dat.bz2\",\n\t\t\"blk_3A.dat.bz2\",\n\t}\n\n\tvar blocks []*btcutil.Block\n\tfor _, file := range testFiles {\n\t\tblockTmp, err := loadBlocks(file)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error loading file: %v\\n\", err)\n\t\t}\n\t\tblocks = append(blocks, blockTmp...)\n\t}\n\n\tfor i := 1; i <= 3; i++ {\n\t\tisMainChain, _, err := chain.ProcessBlock(blocks[i], BFNone)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"CheckConnectBlockTemplate: Received unexpected error \"+\n\t\t\t\t\"processing block %d: %v\", i, err)\n\t\t}\n\t\tif !isMainChain {\n\t\t\tt.Fatalf(\"CheckConnectBlockTemplate: Expected block %d to connect \"+\n\t\t\t\t\"to main chain\", i)\n\t\t}\n\t}\n\n\t// Block 3 should fail to connect since it's already inserted.\n\terr = chain.CheckConnectBlockTemplate(blocks[3])\n\tif err == nil {\n\t\tt.Fatal(\"CheckConnectBlockTemplate: Did not received expected error \" +\n\t\t\t\"on block 3\")\n\t}\n\n\t// Block 4 should connect successfully to tip of chain.\n\terr = chain.CheckConnectBlockTemplate(blocks[4])\n\tif err != nil {\n\t\tt.Fatalf(\"CheckConnectBlockTemplate: Received unexpected error on \"+\n\t\t\t\"block 4: %v\", err)\n\t}\n\n\t// Block 3a should fail to connect since does not build on chain tip.\n\terr = chain.CheckConnectBlockTemplate(blocks[5])\n\tif err == nil {\n\t\tt.Fatal(\"CheckConnectBlockTemplate: Did not received expected error \" +\n\t\t\t\"on block 3a\")\n\t}\n\n\t// Block 4 should connect even if proof of work is invalid.\n\tinvalidPowBlock := *blocks[4].MsgBlock()\n\tinvalidPowBlock.Header.Nonce++\n\terr = chain.CheckConnectBlockTemplate(btcutil.NewBlock(&invalidPowBlock))\n\tif err != nil {\n\t\tt.Fatalf(\"CheckConnectBlockTemplate: Received unexpected error on \"+\n\t\t\t\"block 4 with bad nonce: %v\", err)\n\t}\n\n\t// Invalid block building on chain tip should fail to connect.\n\tinvalidBlock := *blocks[4].MsgBlock()\n\tinvalidBlock.Header.Bits--\n\terr = chain.CheckConnectBlockTemplate(btcutil.NewBlock(&invalidBlock))\n\tif err == nil {\n\t\tt.Fatal(\"CheckConnectBlockTemplate: Did not received expected error \" +\n\t\t\t\"on block 4 with invalid difficulty bits\")\n\t}\n}\n\n// TestCheckBlockSanity tests the CheckBlockSanity function to ensure it works\n// as expected.\nfunc TestCheckBlockSanity(t *testing.T) {\n\tpowLimit := chaincfg.MainNetParams.PowLimit\n\tblock := btcutil.NewBlock(&Block100000)\n\ttimeSource := NewMedianTime()\n\terr := CheckBlockSanity(block, powLimit, timeSource)\n\tif err != nil {\n\t\tt.Errorf(\"CheckBlockSanity: %v\", err)\n\t}\n\n\t// Ensure a block that has a timestamp with a precision higher than one\n\t// second fails.\n\ttimestamp := block.MsgBlock().Header.Timestamp\n\tblock.MsgBlock().Header.Timestamp = timestamp.Add(time.Nanosecond)\n\terr = CheckBlockSanity(block, powLimit, timeSource)\n\tif err == nil {\n\t\tt.Errorf(\"CheckBlockSanity: error is nil when it shouldn't be\")\n\t}\n}\n\n// TestCheckSerializedHeight tests the CheckSerializedHeight function with\n// various serialized heights and also does negative tests to ensure errors\n// and handled properly.\nfunc TestCheckSerializedHeight(t *testing.T) {\n\t// Create an empty coinbase template to be used in the tests below.\n\tcoinbaseOutpoint := wire.NewOutPoint(&chainhash.Hash{}, math.MaxUint32)\n\tcoinbaseTx := wire.NewMsgTx(1)\n\tcoinbaseTx.AddTxIn(wire.NewTxIn(coinbaseOutpoint, nil, nil))\n\n\t// Expected rule errors.\n\tmissingHeightError := RuleError{\n\t\tErrorCode: ErrMissingCoinbaseHeight,\n\t}\n\tbadHeightError := RuleError{\n\t\tErrorCode: ErrBadCoinbaseHeight,\n\t}\n\n\ttests := []struct {\n\t\tsigScript  []byte // Serialized data\n\t\twantHeight int32  // Expected height\n\t\terr        error  // Expected error type\n\t}{\n\t\t// No serialized height length.\n\t\t{[]byte{}, 0, missingHeightError},\n\t\t// Serialized height length with no height bytes.\n\t\t{[]byte{0x02}, 0, missingHeightError},\n\t\t// Serialized height length with too few height bytes.\n\t\t{[]byte{0x02, 0x4a}, 0, missingHeightError},\n\t\t// Serialized height that needs 2 bytes to encode.\n\t\t{[]byte{0x02, 0x4a, 0x52}, 21066, nil},\n\t\t// Serialized height that needs 2 bytes to encode, but backwards\n\t\t// endianness.\n\t\t{[]byte{0x02, 0x4a, 0x52}, 19026, badHeightError},\n\t\t// Serialized height that needs 3 bytes to encode.\n\t\t{[]byte{0x03, 0x40, 0x0d, 0x03}, 200000, nil},\n\t\t// Serialized height that needs 3 bytes to encode, but backwards\n\t\t// endianness.\n\t\t{[]byte{0x03, 0x40, 0x0d, 0x03}, 1074594560, badHeightError},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tmsgTx := coinbaseTx.Copy()\n\t\tmsgTx.TxIn[0].SignatureScript = test.sigScript\n\t\ttx := btcutil.NewTx(msgTx)\n\n\t\terr := CheckSerializedHeight(tx, test.wantHeight)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"CheckSerializedHeight #%d wrong error type \"+\n\t\t\t\t\"got: %v <%T>, want: %T\", i, err, err, test.err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif rerr, ok := err.(RuleError); ok {\n\t\t\ttrerr := test.err.(RuleError)\n\t\t\tif rerr.ErrorCode != trerr.ErrorCode {\n\t\t\t\tt.Errorf(\"CheckSerializedHeight #%d wrong \"+\n\t\t\t\t\t\"error code got: %v, want: %v\", i,\n\t\t\t\t\trerr.ErrorCode, trerr.ErrorCode)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Block100000 defines block 100,000 of the block chain.  It is used to\n// test Block operations.\nvar Block100000 = wire.MsgBlock{\n\tHeader: wire.BlockHeader{\n\t\tVersion: 1,\n\t\tPrevBlock: chainhash.Hash([32]byte{ // Make go vet happy.\n\t\t\t0x50, 0x12, 0x01, 0x19, 0x17, 0x2a, 0x61, 0x04,\n\t\t\t0x21, 0xa6, 0xc3, 0x01, 0x1d, 0xd3, 0x30, 0xd9,\n\t\t\t0xdf, 0x07, 0xb6, 0x36, 0x16, 0xc2, 0xcc, 0x1f,\n\t\t\t0x1c, 0xd0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t}), // 000000000002d01c1fccc21636b607dfd930d31d01c3a62104612a1719011250\n\t\tMerkleRoot: chainhash.Hash([32]byte{ // Make go vet happy.\n\t\t\t0x66, 0x57, 0xa9, 0x25, 0x2a, 0xac, 0xd5, 0xc0,\n\t\t\t0xb2, 0x94, 0x09, 0x96, 0xec, 0xff, 0x95, 0x22,\n\t\t\t0x28, 0xc3, 0x06, 0x7c, 0xc3, 0x8d, 0x48, 0x85,\n\t\t\t0xef, 0xb5, 0xa4, 0xac, 0x42, 0x47, 0xe9, 0xf3,\n\t\t}), // f3e94742aca4b5ef85488dc37c06c3282295ffec960994b2c0d5ac2a25a95766\n\t\tTimestamp: time.Unix(1293623863, 0), // 2010-12-29 11:57:43 +0000 UTC\n\t\tBits:      0x1b04864c,               // 453281356\n\t\tNonce:     0x10572b0f,               // 274148111\n\t},\n\tTransactions: []*wire.MsgTx{\n\t\t{\n\t\t\tVersion: 1,\n\t\t\tTxIn: []*wire.TxIn{\n\t\t\t\t{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\t\t\tIndex: 0xffffffff,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: []byte{\n\t\t\t\t\t\t0x04, 0x4c, 0x86, 0x04, 0x1b, 0x02, 0x06, 0x02,\n\t\t\t\t\t},\n\t\t\t\t\tSequence: 0xffffffff,\n\t\t\t\t},\n\t\t\t},\n\t\t\tTxOut: []*wire.TxOut{\n\t\t\t\t{\n\t\t\t\t\tValue: 0x12a05f200, // 5000000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x41, // OP_DATA_65\n\t\t\t\t\t\t0x04, 0x1b, 0x0e, 0x8c, 0x25, 0x67, 0xc1, 0x25,\n\t\t\t\t\t\t0x36, 0xaa, 0x13, 0x35, 0x7b, 0x79, 0xa0, 0x73,\n\t\t\t\t\t\t0xdc, 0x44, 0x44, 0xac, 0xb8, 0x3c, 0x4e, 0xc7,\n\t\t\t\t\t\t0xa0, 0xe2, 0xf9, 0x9d, 0xd7, 0x45, 0x75, 0x16,\n\t\t\t\t\t\t0xc5, 0x81, 0x72, 0x42, 0xda, 0x79, 0x69, 0x24,\n\t\t\t\t\t\t0xca, 0x4e, 0x99, 0x94, 0x7d, 0x08, 0x7f, 0xed,\n\t\t\t\t\t\t0xf9, 0xce, 0x46, 0x7c, 0xb9, 0xf7, 0xc6, 0x28,\n\t\t\t\t\t\t0x70, 0x78, 0xf8, 0x01, 0xdf, 0x27, 0x6f, 0xdf,\n\t\t\t\t\t\t0x84, // 65-byte signature\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tLockTime: 0,\n\t\t},\n\t\t{\n\t\t\tVersion: 1,\n\t\t\tTxIn: []*wire.TxIn{\n\t\t\t\t{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash: chainhash.Hash([32]byte{ // Make go vet happy.\n\t\t\t\t\t\t\t0x03, 0x2e, 0x38, 0xe9, 0xc0, 0xa8, 0x4c, 0x60,\n\t\t\t\t\t\t\t0x46, 0xd6, 0x87, 0xd1, 0x05, 0x56, 0xdc, 0xac,\n\t\t\t\t\t\t\t0xc4, 0x1d, 0x27, 0x5e, 0xc5, 0x5f, 0xc0, 0x07,\n\t\t\t\t\t\t\t0x79, 0xac, 0x88, 0xfd, 0xf3, 0x57, 0xa1, 0x87,\n\t\t\t\t\t\t}), // 87a157f3fd88ac7907c05fc55e271dc4acdc5605d187d646604ca8c0e9382e03\n\t\t\t\t\t\tIndex: 0,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: []byte{\n\t\t\t\t\t\t0x49, // OP_DATA_73\n\t\t\t\t\t\t0x30, 0x46, 0x02, 0x21, 0x00, 0xc3, 0x52, 0xd3,\n\t\t\t\t\t\t0xdd, 0x99, 0x3a, 0x98, 0x1b, 0xeb, 0xa4, 0xa6,\n\t\t\t\t\t\t0x3a, 0xd1, 0x5c, 0x20, 0x92, 0x75, 0xca, 0x94,\n\t\t\t\t\t\t0x70, 0xab, 0xfc, 0xd5, 0x7d, 0xa9, 0x3b, 0x58,\n\t\t\t\t\t\t0xe4, 0xeb, 0x5d, 0xce, 0x82, 0x02, 0x21, 0x00,\n\t\t\t\t\t\t0x84, 0x07, 0x92, 0xbc, 0x1f, 0x45, 0x60, 0x62,\n\t\t\t\t\t\t0x81, 0x9f, 0x15, 0xd3, 0x3e, 0xe7, 0x05, 0x5c,\n\t\t\t\t\t\t0xf7, 0xb5, 0xee, 0x1a, 0xf1, 0xeb, 0xcc, 0x60,\n\t\t\t\t\t\t0x28, 0xd9, 0xcd, 0xb1, 0xc3, 0xaf, 0x77, 0x48,\n\t\t\t\t\t\t0x01, // 73-byte signature\n\t\t\t\t\t\t0x41, // OP_DATA_65\n\t\t\t\t\t\t0x04, 0xf4, 0x6d, 0xb5, 0xe9, 0xd6, 0x1a, 0x9d,\n\t\t\t\t\t\t0xc2, 0x7b, 0x8d, 0x64, 0xad, 0x23, 0xe7, 0x38,\n\t\t\t\t\t\t0x3a, 0x4e, 0x6c, 0xa1, 0x64, 0x59, 0x3c, 0x25,\n\t\t\t\t\t\t0x27, 0xc0, 0x38, 0xc0, 0x85, 0x7e, 0xb6, 0x7e,\n\t\t\t\t\t\t0xe8, 0xe8, 0x25, 0xdc, 0xa6, 0x50, 0x46, 0xb8,\n\t\t\t\t\t\t0x2c, 0x93, 0x31, 0x58, 0x6c, 0x82, 0xe0, 0xfd,\n\t\t\t\t\t\t0x1f, 0x63, 0x3f, 0x25, 0xf8, 0x7c, 0x16, 0x1b,\n\t\t\t\t\t\t0xc6, 0xf8, 0xa6, 0x30, 0x12, 0x1d, 0xf2, 0xb3,\n\t\t\t\t\t\t0xd3, // 65-byte pubkey\n\t\t\t\t\t},\n\t\t\t\t\tSequence: 0xffffffff,\n\t\t\t\t},\n\t\t\t},\n\t\t\tTxOut: []*wire.TxOut{\n\t\t\t\t{\n\t\t\t\t\tValue: 0x2123e300, // 556000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x76, // OP_DUP\n\t\t\t\t\t\t0xa9, // OP_HASH160\n\t\t\t\t\t\t0x14, // OP_DATA_20\n\t\t\t\t\t\t0xc3, 0x98, 0xef, 0xa9, 0xc3, 0x92, 0xba, 0x60,\n\t\t\t\t\t\t0x13, 0xc5, 0xe0, 0x4e, 0xe7, 0x29, 0x75, 0x5e,\n\t\t\t\t\t\t0xf7, 0xf5, 0x8b, 0x32,\n\t\t\t\t\t\t0x88, // OP_EQUALVERIFY\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tValue: 0x108e20f00, // 4444000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x76, // OP_DUP\n\t\t\t\t\t\t0xa9, // OP_HASH160\n\t\t\t\t\t\t0x14, // OP_DATA_20\n\t\t\t\t\t\t0x94, 0x8c, 0x76, 0x5a, 0x69, 0x14, 0xd4, 0x3f,\n\t\t\t\t\t\t0x2a, 0x7a, 0xc1, 0x77, 0xda, 0x2c, 0x2f, 0x6b,\n\t\t\t\t\t\t0x52, 0xde, 0x3d, 0x7c,\n\t\t\t\t\t\t0x88, // OP_EQUALVERIFY\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tLockTime: 0,\n\t\t},\n\t\t{\n\t\t\tVersion: 1,\n\t\t\tTxIn: []*wire.TxIn{\n\t\t\t\t{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash: chainhash.Hash([32]byte{ // Make go vet happy.\n\t\t\t\t\t\t\t0xc3, 0x3e, 0xbf, 0xf2, 0xa7, 0x09, 0xf1, 0x3d,\n\t\t\t\t\t\t\t0x9f, 0x9a, 0x75, 0x69, 0xab, 0x16, 0xa3, 0x27,\n\t\t\t\t\t\t\t0x86, 0xaf, 0x7d, 0x7e, 0x2d, 0xe0, 0x92, 0x65,\n\t\t\t\t\t\t\t0xe4, 0x1c, 0x61, 0xd0, 0x78, 0x29, 0x4e, 0xcf,\n\t\t\t\t\t\t}), // cf4e2978d0611ce46592e02d7e7daf8627a316ab69759a9f3df109a7f2bf3ec3\n\t\t\t\t\t\tIndex: 1,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: []byte{\n\t\t\t\t\t\t0x47, // OP_DATA_71\n\t\t\t\t\t\t0x30, 0x44, 0x02, 0x20, 0x03, 0x2d, 0x30, 0xdf,\n\t\t\t\t\t\t0x5e, 0xe6, 0xf5, 0x7f, 0xa4, 0x6c, 0xdd, 0xb5,\n\t\t\t\t\t\t0xeb, 0x8d, 0x0d, 0x9f, 0xe8, 0xde, 0x6b, 0x34,\n\t\t\t\t\t\t0x2d, 0x27, 0x94, 0x2a, 0xe9, 0x0a, 0x32, 0x31,\n\t\t\t\t\t\t0xe0, 0xba, 0x33, 0x3e, 0x02, 0x20, 0x3d, 0xee,\n\t\t\t\t\t\t0xe8, 0x06, 0x0f, 0xdc, 0x70, 0x23, 0x0a, 0x7f,\n\t\t\t\t\t\t0x5b, 0x4a, 0xd7, 0xd7, 0xbc, 0x3e, 0x62, 0x8c,\n\t\t\t\t\t\t0xbe, 0x21, 0x9a, 0x88, 0x6b, 0x84, 0x26, 0x9e,\n\t\t\t\t\t\t0xae, 0xb8, 0x1e, 0x26, 0xb4, 0xfe, 0x01,\n\t\t\t\t\t\t0x41, // OP_DATA_65\n\t\t\t\t\t\t0x04, 0xae, 0x31, 0xc3, 0x1b, 0xf9, 0x12, 0x78,\n\t\t\t\t\t\t0xd9, 0x9b, 0x83, 0x77, 0xa3, 0x5b, 0xbc, 0xe5,\n\t\t\t\t\t\t0xb2, 0x7d, 0x9f, 0xff, 0x15, 0x45, 0x68, 0x39,\n\t\t\t\t\t\t0xe9, 0x19, 0x45, 0x3f, 0xc7, 0xb3, 0xf7, 0x21,\n\t\t\t\t\t\t0xf0, 0xba, 0x40, 0x3f, 0xf9, 0x6c, 0x9d, 0xee,\n\t\t\t\t\t\t0xb6, 0x80, 0xe5, 0xfd, 0x34, 0x1c, 0x0f, 0xc3,\n\t\t\t\t\t\t0xa7, 0xb9, 0x0d, 0xa4, 0x63, 0x1e, 0xe3, 0x95,\n\t\t\t\t\t\t0x60, 0x63, 0x9d, 0xb4, 0x62, 0xe9, 0xcb, 0x85,\n\t\t\t\t\t\t0x0f, // 65-byte pubkey\n\t\t\t\t\t},\n\t\t\t\t\tSequence: 0xffffffff,\n\t\t\t\t},\n\t\t\t},\n\t\t\tTxOut: []*wire.TxOut{\n\t\t\t\t{\n\t\t\t\t\tValue: 0xf4240, // 1000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x76, // OP_DUP\n\t\t\t\t\t\t0xa9, // OP_HASH160\n\t\t\t\t\t\t0x14, // OP_DATA_20\n\t\t\t\t\t\t0xb0, 0xdc, 0xbf, 0x97, 0xea, 0xbf, 0x44, 0x04,\n\t\t\t\t\t\t0xe3, 0x1d, 0x95, 0x24, 0x77, 0xce, 0x82, 0x2d,\n\t\t\t\t\t\t0xad, 0xbe, 0x7e, 0x10,\n\t\t\t\t\t\t0x88, // OP_EQUALVERIFY\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tValue: 0x11d260c0, // 299000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x76, // OP_DUP\n\t\t\t\t\t\t0xa9, // OP_HASH160\n\t\t\t\t\t\t0x14, // OP_DATA_20\n\t\t\t\t\t\t0x6b, 0x12, 0x81, 0xee, 0xc2, 0x5a, 0xb4, 0xe1,\n\t\t\t\t\t\t0xe0, 0x79, 0x3f, 0xf4, 0xe0, 0x8a, 0xb1, 0xab,\n\t\t\t\t\t\t0xb3, 0x40, 0x9c, 0xd9,\n\t\t\t\t\t\t0x88, // OP_EQUALVERIFY\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tLockTime: 0,\n\t\t},\n\t\t{\n\t\t\tVersion: 1,\n\t\t\tTxIn: []*wire.TxIn{\n\t\t\t\t{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash: chainhash.Hash([32]byte{ // Make go vet happy.\n\t\t\t\t\t\t\t0x0b, 0x60, 0x72, 0xb3, 0x86, 0xd4, 0xa7, 0x73,\n\t\t\t\t\t\t\t0x23, 0x52, 0x37, 0xf6, 0x4c, 0x11, 0x26, 0xac,\n\t\t\t\t\t\t\t0x3b, 0x24, 0x0c, 0x84, 0xb9, 0x17, 0xa3, 0x90,\n\t\t\t\t\t\t\t0x9b, 0xa1, 0xc4, 0x3d, 0xed, 0x5f, 0x51, 0xf4,\n\t\t\t\t\t\t}), // f4515fed3dc4a19b90a317b9840c243bac26114cf637522373a7d486b372600b\n\t\t\t\t\t\tIndex: 0,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: []byte{\n\t\t\t\t\t\t0x49, // OP_DATA_73\n\t\t\t\t\t\t0x30, 0x46, 0x02, 0x21, 0x00, 0xbb, 0x1a, 0xd2,\n\t\t\t\t\t\t0x6d, 0xf9, 0x30, 0xa5, 0x1c, 0xce, 0x11, 0x0c,\n\t\t\t\t\t\t0xf4, 0x4f, 0x7a, 0x48, 0xc3, 0xc5, 0x61, 0xfd,\n\t\t\t\t\t\t0x97, 0x75, 0x00, 0xb1, 0xae, 0x5d, 0x6b, 0x6f,\n\t\t\t\t\t\t0xd1, 0x3d, 0x0b, 0x3f, 0x4a, 0x02, 0x21, 0x00,\n\t\t\t\t\t\t0xc5, 0xb4, 0x29, 0x51, 0xac, 0xed, 0xff, 0x14,\n\t\t\t\t\t\t0xab, 0xba, 0x27, 0x36, 0xfd, 0x57, 0x4b, 0xdb,\n\t\t\t\t\t\t0x46, 0x5f, 0x3e, 0x6f, 0x8d, 0xa1, 0x2e, 0x2c,\n\t\t\t\t\t\t0x53, 0x03, 0x95, 0x4a, 0xca, 0x7f, 0x78, 0xf3,\n\t\t\t\t\t\t0x01, // 73-byte signature\n\t\t\t\t\t\t0x41, // OP_DATA_65\n\t\t\t\t\t\t0x04, 0xa7, 0x13, 0x5b, 0xfe, 0x82, 0x4c, 0x97,\n\t\t\t\t\t\t0xec, 0xc0, 0x1e, 0xc7, 0xd7, 0xe3, 0x36, 0x18,\n\t\t\t\t\t\t0x5c, 0x81, 0xe2, 0xaa, 0x2c, 0x41, 0xab, 0x17,\n\t\t\t\t\t\t0x54, 0x07, 0xc0, 0x94, 0x84, 0xce, 0x96, 0x94,\n\t\t\t\t\t\t0xb4, 0x49, 0x53, 0xfc, 0xb7, 0x51, 0x20, 0x65,\n\t\t\t\t\t\t0x64, 0xa9, 0xc2, 0x4d, 0xd0, 0x94, 0xd4, 0x2f,\n\t\t\t\t\t\t0xdb, 0xfd, 0xd5, 0xaa, 0xd3, 0xe0, 0x63, 0xce,\n\t\t\t\t\t\t0x6a, 0xf4, 0xcf, 0xaa, 0xea, 0x4e, 0xa1, 0x4f,\n\t\t\t\t\t\t0xbb, // 65-byte pubkey\n\t\t\t\t\t},\n\t\t\t\t\tSequence: 0xffffffff,\n\t\t\t\t},\n\t\t\t},\n\t\t\tTxOut: []*wire.TxOut{\n\t\t\t\t{\n\t\t\t\t\tValue: 0xf4240, // 1000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x76, // OP_DUP\n\t\t\t\t\t\t0xa9, // OP_HASH160\n\t\t\t\t\t\t0x14, // OP_DATA_20\n\t\t\t\t\t\t0x39, 0xaa, 0x3d, 0x56, 0x9e, 0x06, 0xa1, 0xd7,\n\t\t\t\t\t\t0x92, 0x6d, 0xc4, 0xbe, 0x11, 0x93, 0xc9, 0x9b,\n\t\t\t\t\t\t0xf2, 0xeb, 0x9e, 0xe0,\n\t\t\t\t\t\t0x88, // OP_EQUALVERIFY\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tLockTime: 0,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "blockchain/versionbits.go",
    "content": "// Copyright (c) 2016-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"github.com/btcsuite/btcd/chaincfg\"\n)\n\nconst (\n\t// vbLegacyBlockVersion is the highest legacy block version before the\n\t// version bits scheme became active.\n\tvbLegacyBlockVersion = 4\n\n\t// vbTopBits defines the bits to set in the version to signal that the\n\t// version bits scheme is being used.\n\tvbTopBits = 0x20000000\n\n\t// vbTopMask is the bitmask to use to determine whether or not the\n\t// version bits scheme is in use.\n\tvbTopMask = 0xe0000000\n\n\t// vbNumBits is the total number of bits available for use with the\n\t// version bits scheme.\n\tvbNumBits = 29\n)\n\n// bitConditionChecker provides a thresholdConditionChecker which can be used to\n// test whether or not a specific bit is set when it's not supposed to be\n// according to the expected version based on the known deployments and the\n// current state of the chain.  This is useful for detecting and warning about\n// unknown rule activations.\ntype bitConditionChecker struct {\n\tbit   uint32\n\tchain *BlockChain\n}\n\n// Ensure the bitConditionChecker type implements the thresholdConditionChecker\n// interface.\nvar _ thresholdConditionChecker = bitConditionChecker{}\n\n// HasStarted returns true if based on the passed block blockNode the consensus\n// is eligible for deployment.\n//\n// Since this implementation checks for unknown rules, it returns true so\n// is always treated as active.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c bitConditionChecker) HasStarted(_ *blockNode) bool {\n\treturn true\n}\n\n// HasStarted returns true if based on the passed block blockNode the consensus\n// is eligible for deployment.\n//\n// Since this implementation checks for unknown rules, it returns false so the\n// rule is always treated as active.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c bitConditionChecker) HasEnded(_ *blockNode) bool {\n\treturn false\n}\n\n// RuleChangeActivationThreshold is the number of blocks for which the condition\n// must be true in order to lock in a rule change.\n//\n// This implementation returns the value defined by the chain params the checker\n// is associated with.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c bitConditionChecker) RuleChangeActivationThreshold() uint32 {\n\treturn c.chain.chainParams.RuleChangeActivationThreshold\n}\n\n// MinerConfirmationWindow is the number of blocks in each threshold state\n// retarget window.\n//\n// This implementation returns the value defined by the chain params the checker\n// is associated with.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c bitConditionChecker) MinerConfirmationWindow() uint32 {\n\treturn c.chain.chainParams.MinerConfirmationWindow\n}\n\n// Condition returns true when the specific bit associated with the checker is\n// set and it's not supposed to be according to the expected version based on\n// the known deployments and the current state of the chain.\n//\n// This function MUST be called with the chain state lock held (for writes).\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c bitConditionChecker) Condition(node *blockNode) (bool, error) {\n\tconditionMask := uint32(1) << c.bit\n\tversion := uint32(node.version)\n\tif version&vbTopMask != vbTopBits {\n\t\treturn false, nil\n\t}\n\tif version&conditionMask == 0 {\n\t\treturn false, nil\n\t}\n\n\texpectedVersion, err := c.chain.calcNextBlockVersion(node.parent)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn uint32(expectedVersion)&conditionMask == 0, nil\n}\n\n// EligibleToActivate returns true if a custom deployment can transition from\n// the LockedIn to the Active state. For normal deployments, this always\n// returns true. However, some deployments add extra rules like a minimum\n// activation height, which can be abstracted into a generic arbitrary check at\n// the final state via this method.\n//\n// This implementation always returns true, as it's used to warn about other\n// unknown deployments.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c bitConditionChecker) EligibleToActivate(blkNode *blockNode) bool {\n\treturn true\n}\n\n// IsSpeedy returns true if this is to be a \"speedy\" deployment. A speedy\n// deployment differs from a regular one in that only after a miner block\n// confirmation window can the deployment expire.\n//\n// This implementation returns false, as we want to always be warned if\n// something is about to activate.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c bitConditionChecker) IsSpeedy() bool {\n\treturn false\n}\n\n// ForceActive returns if the deployment should be forced to transition to the\n// active state. This is useful on certain testnet, where we we'd like for a\n// deployment to always be active.\nfunc (c bitConditionChecker) ForceActive(node *blockNode) bool {\n\treturn false\n}\n\n// deploymentChecker provides a thresholdConditionChecker which can be used to\n// test a specific deployment rule.  This is required for properly detecting\n// and activating consensus rule changes.\ntype deploymentChecker struct {\n\tdeployment *chaincfg.ConsensusDeployment\n\tchain      *BlockChain\n}\n\n// Ensure the deploymentChecker type implements the thresholdConditionChecker\n// interface.\nvar _ thresholdConditionChecker = deploymentChecker{}\n\n// HasEnded returns true if the target consensus rule change has expired\n// or timed out (at the next window).\n//\n// This implementation returns the value defined by the specific deployment the\n// checker is associated with.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c deploymentChecker) HasStarted(blkNode *blockNode) bool {\n\t// Can't fail as we make sure to set the clock above when we\n\t// instantiate *BlockChain.\n\theader := blkNode.Header()\n\tstarted, _ := c.deployment.DeploymentStarter.HasStarted(&header)\n\n\treturn started\n}\n\n// HasEnded returns true if the target consensus rule change has expired\n// or timed out.\n//\n// This implementation returns the value defined by the specific deployment the\n// checker is associated with.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c deploymentChecker) HasEnded(blkNode *blockNode) bool {\n\t// Can't fail as we make sure to set the clock above when we\n\t// instantiate *BlockChain.\n\theader := blkNode.Header()\n\tended, _ := c.deployment.DeploymentEnder.HasEnded(&header)\n\n\treturn ended\n}\n\n// RuleChangeActivationThreshold is the number of blocks for which the condition\n// must be true in order to lock in a rule change.\n//\n// This implementation returns the value defined by the chain params the checker\n// is associated with.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c deploymentChecker) RuleChangeActivationThreshold() uint32 {\n\t// Some deployments like taproot used a custom activation threshold\n\t// that overrides the network level threshold.\n\tif c.deployment.CustomActivationThreshold != 0 {\n\t\treturn c.deployment.CustomActivationThreshold\n\t}\n\n\treturn c.chain.chainParams.RuleChangeActivationThreshold\n}\n\n// MinerConfirmationWindow is the number of blocks in each threshold state\n// retarget window.\n//\n// This implementation returns the value defined by the chain params the checker\n// is associated with.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c deploymentChecker) MinerConfirmationWindow() uint32 {\n\treturn c.chain.chainParams.MinerConfirmationWindow\n}\n\n// EligibleToActivate returns true if a custom deployment can transition from\n// the LockedIn to the Active state. In addition to the traditional minimum\n// activation height (MinActivationHeight), an optional AlwaysActiveHeight can\n// force the deployment to be active after a specified height.\nfunc (c deploymentChecker) EligibleToActivate(blkNode *blockNode) bool {\n\t// No activation height, so it's always ready to go.\n\tif c.deployment.MinActivationHeight == 0 {\n\t\treturn true\n\t}\n\n\t// If the _next_ block (as this is the prior block to the one being\n\t// connected is the min height or beyond, then this can activate.\n\treturn uint32(blkNode.height)+1 >= c.deployment.MinActivationHeight\n}\n\n// IsSpeedy returns true if this is to be a \"speedy\" deployment. A speedy\n// deployment differs from a regular one in that only after a miner block\n// confirmation window can the deployment expire.  This implementation returns\n// true if a min activation height is set.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c deploymentChecker) IsSpeedy() bool {\n\treturn (c.deployment.MinActivationHeight != 0 ||\n\t\tc.deployment.CustomActivationThreshold != 0)\n}\n\n// Condition returns true when the specific bit defined by the deployment\n// associated with the checker is set.\n//\n// This is part of the thresholdConditionChecker interface implementation.\nfunc (c deploymentChecker) Condition(node *blockNode) (bool, error) {\n\tconditionMask := uint32(1) << c.deployment.BitNumber\n\tversion := uint32(node.version)\n\treturn (version&vbTopMask == vbTopBits) && (version&conditionMask != 0),\n\t\tnil\n}\n\n// ForceActive returns if the deployment should be forced to transition to the\n// active state. This is useful on certain testnet, where we we'd like for a\n// deployment to always be active.\nfunc (c deploymentChecker) ForceActive(node *blockNode) bool {\n\tif node == nil {\n\t\treturn false\n\t}\n\n\t// If the deployment has a nonzero AlwaysActiveHeight and the next\n\t// block’s height is at or above that threshold, then force the state\n\t// to Active.\n\teffectiveHeight := c.deployment.EffectiveAlwaysActiveHeight()\n\tif uint32(node.height)+1 >= effectiveHeight {\n\t\tlog.Debugf(\"Force activating deployment: next block \"+\n\t\t\t\"height %d >= EffectiveAlwaysActiveHeight %d\",\n\t\t\tuint32(node.height)+1, effectiveHeight)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// calcNextBlockVersion calculates the expected version of the block after the\n// passed previous block node based on the state of started and locked in\n// rule change deployments.\n//\n// This function differs from the exported CalcNextBlockVersion in that the\n// exported version uses the current best chain as the previous block node\n// while this function accepts any block node.\n//\n// This function MUST be called with the chain state lock held (for writes).\nfunc (b *BlockChain) calcNextBlockVersion(prevNode *blockNode) (int32, error) {\n\t// Set the appropriate bits for each actively defined rule deployment\n\t// that is either in the process of being voted on, or locked in for the\n\t// activation at the next threshold window change.\n\texpectedVersion := uint32(vbTopBits)\n\tfor id := 0; id < len(b.chainParams.Deployments); id++ {\n\t\tdeployment := &b.chainParams.Deployments[id]\n\t\tcache := &b.deploymentCaches[id]\n\t\tchecker := deploymentChecker{deployment: deployment, chain: b}\n\t\tstate, err := b.thresholdState(prevNode, checker, cache)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tif state == ThresholdStarted || state == ThresholdLockedIn {\n\t\t\texpectedVersion |= uint32(1) << deployment.BitNumber\n\t\t}\n\t}\n\treturn int32(expectedVersion), nil\n}\n\n// CalcNextBlockVersion calculates the expected version of the block after the\n// end of the current best chain based on the state of started and locked in\n// rule change deployments.\n//\n// This function is safe for concurrent access.\nfunc (b *BlockChain) CalcNextBlockVersion() (int32, error) {\n\tb.chainLock.Lock()\n\tversion, err := b.calcNextBlockVersion(b.bestChain.Tip())\n\tb.chainLock.Unlock()\n\treturn version, err\n}\n\n// warnUnknownRuleActivations displays a warning when any unknown new rules are\n// either about to activate or have been activated.  This will only happen once\n// when new rules have been activated and every block for those about to be\n// activated.\n//\n// This function MUST be called with the chain state lock held (for writes)\nfunc (b *BlockChain) warnUnknownRuleActivations(node *blockNode) error {\n\t// Warn if any unknown new rules are either about to activate or have\n\t// already been activated.\n\tfor bit := uint32(0); bit < vbNumBits; bit++ {\n\t\tchecker := bitConditionChecker{bit: bit, chain: b}\n\t\tcache := &b.warningCaches[bit]\n\t\tstate, err := b.thresholdState(node.parent, checker, cache)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tswitch state {\n\t\tcase ThresholdActive:\n\t\t\tif !b.unknownRulesWarned {\n\t\t\t\tlog.Warnf(\"Unknown new rules activated (bit %d)\",\n\t\t\t\t\tbit)\n\t\t\t\tb.unknownRulesWarned = true\n\t\t\t}\n\n\t\tcase ThresholdLockedIn:\n\t\t\twindow := int32(checker.MinerConfirmationWindow())\n\t\t\tactivationHeight := window - (node.height % window)\n\t\t\tlog.Warnf(\"Unknown new rules are about to activate in \"+\n\t\t\t\t\"%d blocks (bit %d)\", activationHeight, bit)\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "blockchain/weight.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage blockchain\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// MaxBlockWeight defines the maximum block weight, where \"block\n\t// weight\" is interpreted as defined in BIP0141. A block's weight is\n\t// calculated as the sum of the of bytes in the existing transactions\n\t// and header, plus the weight of each byte within a transaction. The\n\t// weight of a \"base\" byte is 4, while the weight of a witness byte is\n\t// 1. As a result, for a block to be valid, the BlockWeight MUST be\n\t// less than, or equal to MaxBlockWeight.\n\tMaxBlockWeight = 4000000\n\n\t// MaxBlockBaseSize is the maximum number of bytes within a block\n\t// which can be allocated to non-witness data.\n\tMaxBlockBaseSize = 1000000\n\n\t// MaxBlockSigOpsCost is the maximum number of signature operations\n\t// allowed for a block. It is calculated via a weighted algorithm which\n\t// weights segregated witness sig ops lower than regular sig ops.\n\tMaxBlockSigOpsCost = 80000\n\n\t// WitnessScaleFactor determines the level of \"discount\" witness data\n\t// receives compared to \"base\" data. A scale factor of 4, denotes that\n\t// witness data is 1/4 as cheap as regular non-witness data.\n\tWitnessScaleFactor = 4\n\n\t// MinTxOutputWeight is the minimum possible weight for a transaction\n\t// output.\n\tMinTxOutputWeight = WitnessScaleFactor * wire.MinTxOutPayload\n\n\t// MaxOutputsPerBlock is the maximum number of transaction outputs there\n\t// can be in a block of max weight size.\n\tMaxOutputsPerBlock = MaxBlockWeight / MinTxOutputWeight\n)\n\n// GetBlockWeight computes the value of the weight metric for a given block.\n// Currently the weight metric is simply the sum of the block's serialized size\n// without any witness data scaled proportionally by the WitnessScaleFactor,\n// and the block's serialized size including any witness data.\nfunc GetBlockWeight(blk *btcutil.Block) int64 {\n\tmsgBlock := blk.MsgBlock()\n\n\tbaseSize := msgBlock.SerializeSizeStripped()\n\ttotalSize := msgBlock.SerializeSize()\n\n\t// (baseSize * 3) + totalSize\n\treturn int64((baseSize * (WitnessScaleFactor - 1)) + totalSize)\n}\n\n// GetTransactionWeight computes the value of the weight metric for a given\n// transaction. Currently the weight metric is simply the sum of the\n// transactions's serialized size without any witness data scaled\n// proportionally by the WitnessScaleFactor, and the transaction's serialized\n// size including any witness data.\nfunc GetTransactionWeight(tx *btcutil.Tx) int64 {\n\tmsgTx := tx.MsgTx()\n\n\tbaseSize := msgTx.SerializeSizeStripped()\n\ttotalSize := msgTx.SerializeSize()\n\n\t// (baseSize * 3) + totalSize\n\treturn int64((baseSize * (WitnessScaleFactor - 1)) + totalSize)\n}\n\n// GetSigOpCost returns the unified sig op cost for the passed transaction\n// respecting current active soft-forks which modified sig op cost counting.\n// The unified sig op cost for a transaction is computed as the sum of: the\n// legacy sig op count scaled according to the WitnessScaleFactor, the sig op\n// count for all p2sh inputs scaled by the WitnessScaleFactor, and finally the\n// unscaled sig op count for any inputs spending witness programs.\nfunc GetSigOpCost(tx *btcutil.Tx, isCoinBaseTx bool, utxoView *UtxoViewpoint, bip16, segWit bool) (int, error) {\n\tnumSigOps := CountSigOps(tx) * WitnessScaleFactor\n\tif bip16 {\n\t\tnumP2SHSigOps, err := CountP2SHSigOps(tx, isCoinBaseTx, utxoView)\n\t\tif err != nil {\n\t\t\treturn 0, nil\n\t\t}\n\t\tnumSigOps += (numP2SHSigOps * WitnessScaleFactor)\n\t}\n\n\tif segWit && !isCoinBaseTx {\n\t\tmsgTx := tx.MsgTx()\n\t\tfor txInIndex, txIn := range msgTx.TxIn {\n\t\t\t// Ensure the referenced output is available and hasn't\n\t\t\t// already been spent.\n\t\t\tutxo := utxoView.LookupEntry(txIn.PreviousOutPoint)\n\t\t\tif utxo == nil || utxo.IsSpent() {\n\t\t\t\tstr := fmt.Sprintf(\"output %v referenced from \"+\n\t\t\t\t\t\"transaction %s:%d either does not \"+\n\t\t\t\t\t\"exist or has already been spent\",\n\t\t\t\t\ttxIn.PreviousOutPoint, tx.Hash(),\n\t\t\t\t\ttxInIndex)\n\t\t\t\treturn 0, ruleError(ErrMissingTxOut, str)\n\t\t\t}\n\n\t\t\twitness := txIn.Witness\n\t\t\tsigScript := txIn.SignatureScript\n\t\t\tpkScript := utxo.PkScript()\n\t\t\tnumSigOps += txscript.GetWitnessSigOpCount(sigScript, pkScript, witness)\n\t\t}\n\n\t}\n\n\treturn numSigOps, nil\n}\n"
  },
  {
    "path": "btcd.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t_ \"net/http/pprof\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"runtime/debug\"\n\t\"runtime/pprof\"\n\t\"runtime/trace\"\n\n\t\"github.com/btcsuite/btcd/blockchain/indexers\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/limits\"\n\t\"github.com/btcsuite/btcd/ossec\"\n)\n\nconst (\n\t// blockDbNamePrefix is the prefix for the block database name.  The\n\t// database type is appended to this value to form the full block\n\t// database name.\n\tblockDbNamePrefix = \"blocks\"\n)\n\nvar (\n\tcfg *config\n)\n\n// winServiceMain is only invoked on Windows.  It detects when btcd is running\n// as a service and reacts accordingly.\nvar winServiceMain func() (bool, error)\n\n// btcdMain is the real main function for btcd.  It is necessary to work around\n// the fact that deferred functions do not run when os.Exit() is called.  The\n// optional serverChan parameter is mainly used by the service code to be\n// notified with the server once it is setup so it can gracefully stop it when\n// requested from the service control manager.\nfunc btcdMain(serverChan chan<- *server) error {\n\t// Load configuration and parse command line.  This function also\n\t// initializes logging and configures it accordingly.\n\ttcfg, _, err := loadConfig()\n\tif err != nil {\n\t\treturn err\n\t}\n\tcfg = tcfg\n\tdefer func() {\n\t\tif logRotator != nil {\n\t\t\tlogRotator.Close()\n\t\t}\n\t}()\n\n\t// Get a channel that will be closed when a shutdown signal has been\n\t// triggered either from an OS signal such as SIGINT (Ctrl+C) or from\n\t// another subsystem such as the RPC server.\n\tinterrupt := interruptListener()\n\tdefer btcdLog.Info(\"Shutdown complete\")\n\n\t// Show version at startup.\n\tbtcdLog.Infof(\"Version %s\", version())\n\n\t// Enable http profiling server if requested.\n\tif cfg.Profile != \"\" {\n\t\tgo func() {\n\t\t\tlistenAddr := net.JoinHostPort(\"\", cfg.Profile)\n\t\t\tbtcdLog.Infof(\"Profile server listening on %s\", listenAddr)\n\t\t\tprofileRedirect := http.RedirectHandler(\"/debug/pprof\",\n\t\t\t\thttp.StatusSeeOther)\n\t\t\thttp.Handle(\"/\", profileRedirect)\n\t\t\tbtcdLog.Errorf(\"%v\", http.ListenAndServe(listenAddr, nil))\n\t\t}()\n\t}\n\n\t// Write cpu profile if requested.\n\tif cfg.CPUProfile != \"\" {\n\t\tf, err := os.Create(cfg.CPUProfile)\n\t\tif err != nil {\n\t\t\tbtcdLog.Errorf(\"Unable to create cpu profile: %v\", err)\n\t\t\treturn err\n\t\t}\n\t\tpprof.StartCPUProfile(f)\n\t\tdefer f.Close()\n\t\tdefer pprof.StopCPUProfile()\n\t}\n\n\t// Write mem profile if requested.\n\tif cfg.MemoryProfile != \"\" {\n\t\tf, err := os.Create(cfg.MemoryProfile)\n\t\tif err != nil {\n\t\t\tbtcdLog.Errorf(\"Unable to create memory profile: %v\", err)\n\t\t\treturn err\n\t\t}\n\t\tdefer f.Close()\n\t\tdefer pprof.WriteHeapProfile(f)\n\t\tdefer runtime.GC()\n\t}\n\n\t// Write execution trace if requested.\n\tif cfg.TraceProfile != \"\" {\n\t\tf, err := os.Create(cfg.TraceProfile)\n\t\tif err != nil {\n\t\t\tbtcdLog.Errorf(\"Unable to create execution trace: %v\", err)\n\t\t\treturn err\n\t\t}\n\t\ttrace.Start(f)\n\t\tdefer f.Close()\n\t\tdefer trace.Stop()\n\t}\n\n\t// Perform upgrades to btcd as new versions require it.\n\tif err := doUpgrades(); err != nil {\n\t\tbtcdLog.Errorf(\"%v\", err)\n\t\treturn err\n\t}\n\n\t// Return now if an interrupt signal was triggered.\n\tif interruptRequested(interrupt) {\n\t\treturn nil\n\t}\n\n\t// Load the block database.\n\tdb, err := loadBlockDB()\n\tif err != nil {\n\t\tbtcdLog.Errorf(\"%v\", err)\n\t\treturn err\n\t}\n\tdefer func() {\n\t\t// Ensure the database is sync'd and closed on shutdown.\n\t\tbtcdLog.Infof(\"Gracefully shutting down the database...\")\n\t\tdb.Close()\n\t}()\n\n\t// Return now if an interrupt signal was triggered.\n\tif interruptRequested(interrupt) {\n\t\treturn nil\n\t}\n\n\t// Drop indexes and exit if requested.\n\t//\n\t// NOTE: The order is important here because dropping the tx index also\n\t// drops the address index since it relies on it.\n\tif cfg.DropAddrIndex {\n\t\tif err := indexers.DropAddrIndex(db, interrupt); err != nil {\n\t\t\tbtcdLog.Errorf(\"%v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t}\n\tif cfg.DropTxIndex {\n\t\tif err := indexers.DropTxIndex(db, interrupt); err != nil {\n\t\t\tbtcdLog.Errorf(\"%v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t}\n\tif cfg.DropCfIndex {\n\t\tif err := indexers.DropCfIndex(db, interrupt); err != nil {\n\t\t\tbtcdLog.Errorf(\"%v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\treturn nil\n\t}\n\n\t// Check if the database had previously been pruned.  If it had been, it's\n\t// not possible to newly generate the tx index and addr index.\n\tvar beenPruned bool\n\tdb.View(func(dbTx database.Tx) error {\n\t\tbeenPruned, err = dbTx.BeenPruned()\n\t\treturn err\n\t})\n\tif err != nil {\n\t\tbtcdLog.Errorf(\"%v\", err)\n\t\treturn err\n\t}\n\tif beenPruned && cfg.Prune == 0 {\n\t\terr = fmt.Errorf(\"--prune cannot be disabled as the node has been \"+\n\t\t\t\"previously pruned. You must delete the files in the datadir: \\\"%s\\\" \"+\n\t\t\t\"and sync from the beginning to disable pruning\", cfg.DataDir)\n\t\tbtcdLog.Errorf(\"%v\", err)\n\t\treturn err\n\t}\n\tif beenPruned && cfg.TxIndex {\n\t\terr = fmt.Errorf(\"--txindex cannot be enabled as the node has been \"+\n\t\t\t\"previously pruned. You must delete the files in the datadir: \\\"%s\\\" \"+\n\t\t\t\"and sync from the beginning to enable the desired index\", cfg.DataDir)\n\t\tbtcdLog.Errorf(\"%v\", err)\n\t\treturn err\n\t}\n\tif beenPruned && cfg.AddrIndex {\n\t\terr = fmt.Errorf(\"--addrindex cannot be enabled as the node has been \"+\n\t\t\t\"previously pruned. You must delete the files in the datadir: \\\"%s\\\" \"+\n\t\t\t\"and sync from the beginning to enable the desired index\", cfg.DataDir)\n\t\tbtcdLog.Errorf(\"%v\", err)\n\t\treturn err\n\t}\n\t// If we've previously been pruned and the cfindex isn't present, it means that the\n\t// user wants to enable the cfindex after the node has already synced up and been\n\t// pruned.\n\tif beenPruned && !indexers.CfIndexInitialized(db) && !cfg.NoCFilters {\n\t\terr = fmt.Errorf(\"compact filters cannot be enabled as the node has been \"+\n\t\t\t\"previously pruned. You must delete the files in the datadir: \\\"%s\\\" \"+\n\t\t\t\"and sync from the beginning to enable the desired index. You may \"+\n\t\t\t\"use the --nocfilters flag to start the node up without the compact \"+\n\t\t\t\"filters\", cfg.DataDir)\n\t\tbtcdLog.Errorf(\"%v\", err)\n\t\treturn err\n\t}\n\t// If the user wants to disable the cfindex and is pruned or has enabled pruning, force\n\t// the user to either drop the cfindex manually or restart the node without the --nocfilters\n\t// flag.\n\tif (beenPruned || cfg.Prune != 0) && indexers.CfIndexInitialized(db) && cfg.NoCFilters {\n\t\terr = fmt.Errorf(\"--nocfilters flag was given but the compact filters have \" +\n\t\t\t\"previously been enabled on this node and the index data currently \" +\n\t\t\t\"exists in the database. The node has also been previously pruned and \" +\n\t\t\t\"the database would be left in an inconsistent state if the compact \" +\n\t\t\t\"filters don't get indexed now. To disable compact filters, please drop the \" +\n\t\t\t\"index completely with the --dropcfindex flag and restart the node. \" +\n\t\t\t\"To keep the compact filters, restart the node without the --nocfilters \" +\n\t\t\t\"flag\")\n\t\tbtcdLog.Errorf(\"%v\", err)\n\t\treturn err\n\t}\n\n\t// Enforce removal of txindex and addrindex if user requested pruning.\n\t// This is to require explicit action from the user before removing\n\t// indexes that won't be useful when block files are pruned.\n\t//\n\t// NOTE: The order is important here because dropping the tx index also\n\t// drops the address index since it relies on it.  We explicitly make the\n\t// user drop both indexes if --addrindex was enabled previously.\n\tif cfg.Prune != 0 && indexers.AddrIndexInitialized(db) {\n\t\terr = fmt.Errorf(\"--prune flag may not be given when the address index \" +\n\t\t\t\"has been initialized. Please drop the address index with the \" +\n\t\t\t\"--dropaddrindex flag before enabling pruning\")\n\t\tbtcdLog.Errorf(\"%v\", err)\n\t\treturn err\n\t}\n\tif cfg.Prune != 0 && indexers.TxIndexInitialized(db) {\n\t\terr = fmt.Errorf(\"--prune flag may not be given when the transaction index \" +\n\t\t\t\"has been initialized. Please drop the transaction index with the \" +\n\t\t\t\"--droptxindex flag before enabling pruning\")\n\t\tbtcdLog.Errorf(\"%v\", err)\n\t\treturn err\n\t}\n\n\t// The config file is already created if it did not exist and the log\n\t// file has already been opened by now so we only need to allow\n\t// creating rpc cert and key files if they don't exist.\n\tunveilx(cfg.RPCKey, \"rwc\")\n\tunveilx(cfg.RPCCert, \"rwc\")\n\tunveilx(cfg.DataDir, \"rwc\")\n\n\t// drop unveil and tty\n\tpledgex(\"stdio rpath wpath cpath flock dns inet\")\n\n\t// Create server and start it.\n\tserver, err := newServer(cfg.Listeners, cfg.AgentBlacklist,\n\t\tcfg.AgentWhitelist, db, activeNetParams.Params, interrupt)\n\tif err != nil {\n\t\t// TODO: this logging could do with some beautifying.\n\t\tbtcdLog.Errorf(\"Unable to start server on %v: %v\",\n\t\t\tcfg.Listeners, err)\n\t\treturn err\n\t}\n\tdefer func() {\n\t\tbtcdLog.Infof(\"Gracefully shutting down the server...\")\n\t\tserver.Stop()\n\t\tserver.WaitForShutdown()\n\t\tsrvrLog.Infof(\"Server shutdown complete\")\n\t}()\n\tserver.Start()\n\tif serverChan != nil {\n\t\tserverChan <- server\n\t}\n\n\t// Wait until the interrupt signal is received from an OS signal or\n\t// shutdown is requested through one of the subsystems such as the RPC\n\t// server.\n\t<-interrupt\n\treturn nil\n}\n\n// removeRegressionDB removes the existing regression test database if running\n// in regression test mode and it already exists.\nfunc removeRegressionDB(dbPath string) error {\n\t// Don't do anything if not in regression test mode.\n\tif !cfg.RegressionTest {\n\t\treturn nil\n\t}\n\n\t// Remove the old regression test database if it already exists.\n\tfi, err := os.Stat(dbPath)\n\tif err == nil {\n\t\tbtcdLog.Infof(\"Removing regression test database from '%s'\", dbPath)\n\t\tif fi.IsDir() {\n\t\t\terr := os.RemoveAll(dbPath)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\terr := os.Remove(dbPath)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// dbPath returns the path to the block database given a database type.\nfunc blockDbPath(dbType string) string {\n\t// The database name is based on the database type.\n\tdbName := blockDbNamePrefix + \"_\" + dbType\n\tif dbType == \"sqlite\" {\n\t\tdbName = dbName + \".db\"\n\t}\n\tdbPath := filepath.Join(cfg.DataDir, dbName)\n\treturn dbPath\n}\n\n// warnMultipleDBs shows a warning if multiple block database types are detected.\n// This is not a situation most users want.  It is handy for development however\n// to support multiple side-by-side databases.\nfunc warnMultipleDBs() {\n\t// This is intentionally not using the known db types which depend\n\t// on the database types compiled into the binary since we want to\n\t// detect legacy db types as well.\n\tdbTypes := []string{\"ffldb\", \"leveldb\", \"sqlite\"}\n\tduplicateDbPaths := make([]string, 0, len(dbTypes)-1)\n\tfor _, dbType := range dbTypes {\n\t\tif dbType == cfg.DbType {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Store db path as a duplicate db if it exists.\n\t\tdbPath := blockDbPath(dbType)\n\t\tif fileExists(dbPath) {\n\t\t\tduplicateDbPaths = append(duplicateDbPaths, dbPath)\n\t\t}\n\t}\n\n\t// Warn if there are extra databases.\n\tif len(duplicateDbPaths) > 0 {\n\t\tselectedDbPath := blockDbPath(cfg.DbType)\n\t\tbtcdLog.Warnf(\"WARNING: There are multiple block chain databases \"+\n\t\t\t\"using different database types.\\nYou probably don't \"+\n\t\t\t\"want to waste disk space by having more than one.\\n\"+\n\t\t\t\"Your current database is located at [%v].\\nThe \"+\n\t\t\t\"additional database is located at %v\", selectedDbPath,\n\t\t\tduplicateDbPaths)\n\t}\n}\n\n// loadBlockDB loads (or creates when needed) the block database taking into\n// account the selected database backend and returns a handle to it.  It also\n// contains additional logic such warning the user if there are multiple\n// databases which consume space on the file system and ensuring the regression\n// test database is clean when in regression test mode.\nfunc loadBlockDB() (database.DB, error) {\n\t// The memdb backend does not have a file path associated with it, so\n\t// handle it uniquely.  We also don't want to worry about the multiple\n\t// database type warnings when running with the memory database.\n\tif cfg.DbType == \"memdb\" {\n\t\tbtcdLog.Infof(\"Creating block database in memory.\")\n\t\tdb, err := database.Create(cfg.DbType)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn db, nil\n\t}\n\n\twarnMultipleDBs()\n\n\t// The database name is based on the database type.\n\tdbPath := blockDbPath(cfg.DbType)\n\n\t// The regression test is special in that it needs a clean database for\n\t// each run, so remove it now if it already exists.\n\tremoveRegressionDB(dbPath)\n\n\tbtcdLog.Infof(\"Loading block database from '%s'\", dbPath)\n\tdb, err := database.Open(cfg.DbType, dbPath, activeNetParams.Net)\n\tif err != nil {\n\t\t// Return the error if it's not because the database doesn't\n\t\t// exist.\n\t\tif dbErr, ok := err.(database.Error); !ok || dbErr.ErrorCode !=\n\t\t\tdatabase.ErrDbDoesNotExist {\n\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Create the db if it does not exist.\n\t\terr = os.MkdirAll(cfg.DataDir, 0700)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdb, err = database.Create(cfg.DbType, dbPath, activeNetParams.Net)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tbtcdLog.Info(\"Block database loaded\")\n\treturn db, nil\n}\n\nfunc unveilx(path string, perms string) {\n\terr := ossec.Unveil(path, perms)\n\tif err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"unveil failed: %v\\n\", err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc pledgex(promises string) {\n\terr := ossec.PledgePromises(promises)\n\tif err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"pledge failed: %v\\n\", err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc init() {\n\tpledgex(\"unveil stdio id rpath wpath cpath flock dns inet tty\")\n}\n\nfunc main() {\n\t// If GOGC is not explicitly set, override GC percent.\n\tif os.Getenv(\"GOGC\") == \"\" {\n\t\t// Block and transaction processing can cause bursty allocations.  This\n\t\t// limits the garbage collector from excessively overallocating during\n\t\t// bursts.  This value was arrived at with the help of profiling live\n\t\t// usage.\n\t\tdebug.SetGCPercent(10)\n\t}\n\n\t// Up some limits.\n\tif err := limits.SetLimits(); err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"failed to set limits: %v\\n\", err)\n\t\tos.Exit(1)\n\t}\n\n\t// Call serviceMain on Windows to handle running as a service.  When\n\t// the return isService flag is true, exit now since we ran as a\n\t// service.  Otherwise, just fall through to normal operation.\n\tif runtime.GOOS == \"windows\" {\n\t\tisService, err := winServiceMain()\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t\tos.Exit(1)\n\t\t}\n\t\tif isService {\n\t\t\tos.Exit(0)\n\t\t}\n\t}\n\n\t// Work around defer not working after os.Exit()\n\tif err := btcdMain(nil); err != nil {\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "btcec/README.md",
    "content": "btcec\n=====\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://pkg.go.dev/github.com/btcsuite/btcd/btcec/v2?status.png)](https://pkg.go.dev/github.com/btcsuite/btcd/btcec/v2)\n\nPackage btcec implements elliptic curve cryptography needed for working with\nBitcoin (secp256k1 only for now). It is designed so that it may be used with the\nstandard crypto/ecdsa packages provided with go.  A comprehensive suite of test\nis provided to ensure proper functionality.  Package btcec was originally based\non work from ThePiachu which is licensed under the same terms as Go, but it has\nsignificantly diverged since then.  The btcsuite developers original is licensed\nunder the liberal ISC license.\n\nAlthough this package was primarily written for btcd, it has intentionally been\ndesigned so it can be used as a standalone package for any projects needing to\nuse secp256k1 elliptic curve cryptography.\n\n## Installation and Updating\n\n```bash\n$ go install -u -v github.com/btcsuite/btcd/btcec/v2\n```\n\n## Examples\n\n* [Sign Message](https://pkg.go.dev/github.com/btcsuite/btcd/btcec/v2#example-package--SignMessage)  \n  Demonstrates signing a message with a secp256k1 private key that is first\n  parsed form raw bytes and serializing the generated signature.\n\n* [Verify Signature](https://pkg.go.dev/github.com/btcsuite/btcd/btcec/v2#example-package--VerifySignature)  \n  Demonstrates verifying a secp256k1 signature against a public key that is\n  first parsed from raw bytes.  The signature is also parsed from raw bytes.\n\n## License\n\nPackage btcec is licensed under the [copyfree](http://copyfree.org) ISC License\nexcept for btcec.go and btcec_test.go which is under the same license as Go.\n\n"
  },
  {
    "path": "btcec/bench_test.go",
    "content": "// Copyright 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcec\n\nimport (\n\t\"encoding/hex\"\n\t\"math/big\"\n\t\"testing\"\n\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// setHex decodes the passed big-endian hex string into the internal field value\n// representation.  Only the first 32-bytes are used.\n//\n// This is NOT constant time.\n//\n// The field value is returned to support chaining.  This enables syntax like:\n// f := new(FieldVal).SetHex(\"0abc\").Add(1) so that f = 0x0abc + 1\nfunc setHex(hexString string) *FieldVal {\n\tif len(hexString)%2 != 0 {\n\t\thexString = \"0\" + hexString\n\t}\n\tbytes, _ := hex.DecodeString(hexString)\n\n\tvar f FieldVal\n\tf.SetByteSlice(bytes)\n\n\treturn &f\n}\n\n// hexToFieldVal converts the passed hex string into a FieldVal and will panic\n// if there is an error.  This is only provided for the hard-coded constants so\n// errors in the source code can be detected. It will only (and must only) be\n// called with hard-coded values.\nfunc hexToFieldVal(s string) *FieldVal {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\tvar f FieldVal\n\tif overflow := f.SetByteSlice(b); overflow {\n\t\tpanic(\"hex in source file overflows mod P: \" + s)\n\t}\n\treturn &f\n}\n\n// fromHex converts the passed hex string into a big integer pointer and will\n// panic is there is an error.  This is only provided for the hard-coded\n// constants so errors in the source code can bet detected. It will only (and\n// must only) be called for initialization purposes.\nfunc fromHex(s string) *big.Int {\n\tif s == \"\" {\n\t\treturn big.NewInt(0)\n\t}\n\tr, ok := new(big.Int).SetString(s, 16)\n\tif !ok {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn r\n}\n\n// jacobianPointFromHex decodes the passed big-endian hex strings into a\n// Jacobian point with its internal fields set to the resulting values.  Only\n// the first 32-bytes are used.\nfunc jacobianPointFromHex(x, y, z string) JacobianPoint {\n\tvar p JacobianPoint\n\tp.X = *setHex(x)\n\tp.Y = *setHex(y)\n\tp.Z = *setHex(z)\n\n\treturn p\n}\n\n// BenchmarkAddNonConst benchmarks the secp256k1 curve AddNonConst function with\n// Z values of 1 so that the associated optimizations are used.\nfunc BenchmarkAddJacobian(b *testing.B) {\n\tp1 := jacobianPointFromHex(\n\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\"1\",\n\t)\n\tp2 := jacobianPointFromHex(\n\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\"1\",\n\t)\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tvar result JacobianPoint\n\tfor i := 0; i < b.N; i++ {\n\t\tsecp.AddNonConst(&p1, &p2, &result)\n\t}\n}\n\n// BenchmarkAddNonConstNotZOne benchmarks the secp256k1 curve AddNonConst\n// function with Z values other than one so the optimizations associated with\n// Z=1 aren't used.\nfunc BenchmarkAddJacobianNotZOne(b *testing.B) {\n\tx1 := setHex(\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\")\n\ty1 := setHex(\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\")\n\tz1 := setHex(\"2\")\n\tx2 := setHex(\"91abba6a34b7481d922a4bd6a04899d5a686f6cf6da4e66a0cb427fb25c04bd4\")\n\ty2 := setHex(\"03fede65e30b4e7576a2abefc963ddbf9fdccbf791b77c29beadefe49951f7d1\")\n\tz2 := setHex(\"3\")\n\tp1 := MakeJacobianPoint(x1, y1, z1)\n\tp2 := MakeJacobianPoint(x2, y2, z2)\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tvar result JacobianPoint\n\tfor i := 0; i < b.N; i++ {\n\t\tAddNonConst(&p1, &p2, &result)\n\t}\n}\n\n// BenchmarkScalarBaseMult benchmarks the secp256k1 curve ScalarBaseMult\n// function.\nfunc BenchmarkScalarBaseMult(b *testing.B) {\n\tk := fromHex(\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\")\n\tcurve := S256()\n\tfor i := 0; i < b.N; i++ {\n\t\tcurve.ScalarBaseMult(k.Bytes())\n\t}\n}\n\n// BenchmarkScalarBaseMultLarge benchmarks the secp256k1 curve ScalarBaseMult\n// function with abnormally large k values.\nfunc BenchmarkScalarBaseMultLarge(b *testing.B) {\n\tk := fromHex(\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c005751111111011111110\")\n\tcurve := S256()\n\tfor i := 0; i < b.N; i++ {\n\t\tcurve.ScalarBaseMult(k.Bytes())\n\t}\n}\n\n// BenchmarkScalarMult benchmarks the secp256k1 curve ScalarMult function.\nfunc BenchmarkScalarMult(b *testing.B) {\n\tx := fromHex(\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\")\n\ty := fromHex(\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\")\n\tk := fromHex(\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\")\n\tcurve := S256()\n\tfor i := 0; i < b.N; i++ {\n\t\tcurve.ScalarMult(x, y, k.Bytes())\n\t}\n}\n\n// hexToModNScalar converts the passed hex string into a ModNScalar and will\n// panic if there is an error.  This is only provided for the hard-coded\n// constants so errors in the source code can be detected. It will only (and\n// must only) be called with hard-coded values.\nfunc hexToModNScalar(s string) *ModNScalar {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\tvar scalar ModNScalar\n\tif overflow := scalar.SetByteSlice(b); overflow {\n\t\tpanic(\"hex in source file overflows mod N scalar: \" + s)\n\t}\n\treturn &scalar\n}\n\n// BenchmarkFieldNormalize benchmarks how long it takes the internal field\n// to perform normalization (which includes modular reduction).\nfunc BenchmarkFieldNormalize(b *testing.B) {\n\t// The normalize function is constant time so default value is fine.\n\tvar f FieldVal\n\tfor i := 0; i < b.N; i++ {\n\t\tf.Normalize()\n\t}\n}\n\n// BenchmarkParseCompressedPubKey benchmarks how long it takes to decompress and\n// validate a compressed public key from a byte array.\nfunc BenchmarkParseCompressedPubKey(b *testing.B) {\n\trawPk, _ := hex.DecodeString(\"0234f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\")\n\n\tvar (\n\t\tpk  *PublicKey\n\t\terr error\n\t)\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tpk, err = ParsePubKey(rawPk)\n\t}\n\t_ = pk\n\t_ = err\n}\n"
  },
  {
    "path": "btcec/btcec.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Copyright 2011 ThePiachu. All rights reserved.\n// Copyright 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcec\n\n// References:\n//   [SECG]: Recommended Elliptic Curve Domain Parameters\n//     http://www.secg.org/sec2-v2.pdf\n//\n//   [GECC]: Guide to Elliptic Curve Cryptography (Hankerson, Menezes, Vanstone)\n\n// This package operates, internally, on Jacobian coordinates. For a given\n// (x, y) position on the curve, the Jacobian coordinates are (x1, y1, z1)\n// where x = x1/z1² and y = y1/z1³. The greatest speedups come when the whole\n// calculation can be performed within the transform (as in ScalarMult and\n// ScalarBaseMult). But even for Add and Double, it's faster to apply and\n// reverse the transform than to operate in affine coordinates.\n\nimport (\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// KoblitzCurve provides an implementation for secp256k1 that fits the ECC\n// Curve interface from crypto/elliptic.\ntype KoblitzCurve = secp.KoblitzCurve\n\n// S256 returns a Curve which implements secp256k1.\nfunc S256() *KoblitzCurve {\n\treturn secp.S256()\n}\n\n// CurveParams contains the parameters for the secp256k1 curve.\ntype CurveParams = secp.CurveParams\n\n// Params returns the secp256k1 curve parameters for convenience.\nfunc Params() *CurveParams {\n\treturn secp.Params()\n}\n\n// Generator returns the public key at the Generator Point.\nfunc Generator() *PublicKey {\n\tvar (\n\t\tresult JacobianPoint\n\t\tk      secp.ModNScalar\n\t)\n\n\tk.SetInt(1)\n\tScalarBaseMultNonConst(&k, &result)\n\n\tresult.ToAffine()\n\n\treturn NewPublicKey(&result.X, &result.Y)\n}\n"
  },
  {
    "path": "btcec/btcec_test.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Copyright 2011 ThePiachu. All rights reserved.\n// Copyright 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcec\n\nimport (\n\t\"crypto/rand\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"testing\"\n)\n\n// isJacobianOnS256Curve returns boolean if the point (x,y,z) is on the\n// secp256k1 curve.\nfunc isJacobianOnS256Curve(point *JacobianPoint) bool {\n\t// Elliptic curve equation for secp256k1 is: y^2 = x^3 + 7\n\t// In Jacobian coordinates, Y = y/z^3 and X = x/z^2\n\t// Thus:\n\t// (y/z^3)^2 = (x/z^2)^3 + 7\n\t// y^2/z^6 = x^3/z^6 + 7\n\t// y^2 = x^3 + 7*z^6\n\tvar y2, z2, x3, result FieldVal\n\ty2.SquareVal(&point.Y).Normalize()\n\tz2.SquareVal(&point.Z)\n\tx3.SquareVal(&point.X).Mul(&point.X)\n\tresult.SquareVal(&z2).Mul(&z2).MulInt(7).Add(&x3).Normalize()\n\treturn y2.Equals(&result)\n}\n\n// TestAddJacobian tests addition of points projected in Jacobian coordinates.\nfunc TestAddJacobian(t *testing.T) {\n\ttests := []struct {\n\t\tx1, y1, z1 string // Coordinates (in hex) of first point to add\n\t\tx2, y2, z2 string // Coordinates (in hex) of second point to add\n\t\tx3, y3, z3 string // Coordinates (in hex) of expected point\n\t}{\n\t\t// Addition with a point at infinity (left hand side).\n\t\t// ∞ + P = P\n\t\t{\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\",\n\t\t\t\"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d\",\n\t\t\t\"1\",\n\t\t\t\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\",\n\t\t\t\"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d\",\n\t\t\t\"1\",\n\t\t},\n\t\t// Addition with a point at infinity (right hand side).\n\t\t// P + ∞ = P\n\t\t{\n\t\t\t\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\",\n\t\t\t\"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d\",\n\t\t\t\"1\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\",\n\t\t\t\"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d\",\n\t\t\t\"1\",\n\t\t},\n\t\t// Addition with z1=z2=1 different x values.\n\t\t{\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\t\"1\",\n\t\t\t\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\",\n\t\t\t\"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d\",\n\t\t\t\"1\",\n\t\t\t\"0cfbc7da1e569b334460788faae0286e68b3af7379d5504efc25e4dba16e46a6\",\n\t\t\t\"e205f79361bbe0346b037b4010985dbf4f9e1e955e7d0d14aca876bfa79aad87\",\n\t\t\t\"44a5646b446e3877a648d6d381370d9ef55a83b666ebce9df1b1d7d65b817b2f\",\n\t\t},\n\t\t// Addition with z1=z2=1 same x opposite y.\n\t\t// P(x, y, z) + P(x, -y, z) = infinity\n\t\t{\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\t\"1\",\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"f48e156428cf0276dc092da5856e182288d7569f97934a56fe44be60f0d359fd\",\n\t\t\t\"1\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t},\n\t\t// Addition with z1=z2=1 same point.\n\t\t// P(x, y, z) + P(x, y, z) = 2P\n\t\t{\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\t\"1\",\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\t\"1\",\n\t\t\t\"ec9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee64f87c50c27\",\n\t\t\t\"b082b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd0755c8f2a\",\n\t\t\t\"16e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c1e594464\",\n\t\t},\n\n\t\t// Addition with z1=z2 (!=1) different x values.\n\t\t{\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\",\n\t\t\t\"2\",\n\t\t\t\"5d2fe112c21891d440f65a98473cb626111f8a234d2cd82f22172e369f002147\",\n\t\t\t\"98e3386a0a622a35c4561ffb32308d8e1c6758e10ebb1b4ebd3d04b4eb0ecbe8\",\n\t\t\t\"2\",\n\t\t\t\"cfbc7da1e569b334460788faae0286e68b3af7379d5504efc25e4dba16e46a60\",\n\t\t\t\"817de4d86ef80d1ac0ded00426176fd3e787a5579f43452b2a1db021e6ac3778\",\n\t\t\t\"129591ad11b8e1de99235b4e04dc367bd56a0ed99baf3a77c6c75f5a6e05f08d\",\n\t\t},\n\t\t// Addition with z1=z2 (!=1) same x opposite y.\n\t\t// P(x, y, z) + P(x, -y, z) = infinity\n\t\t{\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\",\n\t\t\t\"2\",\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"a470ab21467813b6e0496d2c2b70c11446bab4fcbc9a52b7f225f30e869aea9f\",\n\t\t\t\"2\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t},\n\t\t// Addition with z1=z2 (!=1) same point.\n\t\t// P(x, y, z) + P(x, y, z) = 2P\n\t\t{\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\",\n\t\t\t\"2\",\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\",\n\t\t\t\"2\",\n\t\t\t\"9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac\",\n\t\t\t\"2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988\",\n\t\t\t\"6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11\",\n\t\t},\n\n\t\t// Addition with z1!=z2 and z2=1 different x values.\n\t\t{\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\",\n\t\t\t\"2\",\n\t\t\t\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\",\n\t\t\t\"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d\",\n\t\t\t\"1\",\n\t\t\t\"3ef1f68795a6ccd1181e23eab80a1b9a2cebdcde755413bf097936eb5b91b4f3\",\n\t\t\t\"0bef26c377c068d606f6802130bb7e9f3c3d2abcfa1a295950ed81133561cb04\",\n\t\t\t\"252b235a2371c3bd3246b69c09b86cf7aad41db3375e74ef8d8ebeb4dc0be11a\",\n\t\t},\n\t\t// Addition with z1!=z2 and z2=1 same x opposite y.\n\t\t// P(x, y, z) + P(x, -y, z) = infinity\n\t\t{\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\",\n\t\t\t\"2\",\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"f48e156428cf0276dc092da5856e182288d7569f97934a56fe44be60f0d359fd\",\n\t\t\t\"1\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t},\n\t\t// Addition with z1!=z2 and z2=1 same point.\n\t\t// P(x, y, z) + P(x, y, z) = 2P\n\t\t{\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\",\n\t\t\t\"2\",\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\t\"1\",\n\t\t\t\"9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac\",\n\t\t\t\"2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988\",\n\t\t\t\"6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11\",\n\t\t},\n\n\t\t// Addition with z1!=z2 and z2!=1 different x values.\n\t\t// P(x, y, z) + P(x, y, z) = 2P\n\t\t{\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\",\n\t\t\t\"2\",\n\t\t\t\"91abba6a34b7481d922a4bd6a04899d5a686f6cf6da4e66a0cb427fb25c04bd4\",\n\t\t\t\"03fede65e30b4e7576a2abefc963ddbf9fdccbf791b77c29beadefe49951f7d1\",\n\t\t\t\"3\",\n\t\t\t\"3f07081927fd3f6dadd4476614c89a09eba7f57c1c6c3b01fa2d64eac1eef31e\",\n\t\t\t\"949166e04ebc7fd95a9d77e5dfd88d1492ecffd189792e3944eb2b765e09e031\",\n\t\t\t\"eb8cba81bcffa4f44d75427506737e1f045f21e6d6f65543ee0e1d163540c931\",\n\t\t}, // Addition with z1!=z2 and z2!=1 same x opposite y.\n\t\t// P(x, y, z) + P(x, -y, z) = infinity\n\t\t{\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\",\n\t\t\t\"2\",\n\t\t\t\"dcc3768780c74a0325e2851edad0dc8a566fa61a9e7fc4a34d13dcb509f99bc7\",\n\t\t\t\"cafc41904dd5428934f7d075129c8ba46eb622d4fc88d72cd1401452664add18\",\n\t\t\t\"3\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t},\n\t\t// Addition with z1!=z2 and z2!=1 same point.\n\t\t// P(x, y, z) + P(x, y, z) = 2P\n\t\t{\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\",\n\t\t\t\"2\",\n\t\t\t\"dcc3768780c74a0325e2851edad0dc8a566fa61a9e7fc4a34d13dcb509f99bc7\",\n\t\t\t\"3503be6fb22abd76cb082f8aed63745b9149dd2b037728d32ebfebac99b51f17\",\n\t\t\t\"3\",\n\t\t\t\"9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac\",\n\t\t\t\"2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988\",\n\t\t\t\"6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Convert hex to Jacobian points.\n\t\tp1 := jacobianPointFromHex(test.x1, test.y1, test.z1)\n\t\tp2 := jacobianPointFromHex(test.x2, test.y2, test.z2)\n\t\twant := jacobianPointFromHex(test.x3, test.y3, test.z3)\n\n\t\t// Ensure the test data is using points that are actually on\n\t\t// the curve (or the point at infinity).\n\t\tif !p1.Z.IsZero() && !isJacobianOnS256Curve(&p1) {\n\t\t\tt.Errorf(\"#%d first point is not on the curve -- \"+\n\t\t\t\t\"invalid test data\", i)\n\t\t\tcontinue\n\t\t}\n\t\tif !p2.Z.IsZero() && !isJacobianOnS256Curve(&p2) {\n\t\t\tt.Errorf(\"#%d second point is not on the curve -- \"+\n\t\t\t\t\"invalid test data\", i)\n\t\t\tcontinue\n\t\t}\n\t\tif !want.Z.IsZero() && !isJacobianOnS256Curve(&want) {\n\t\t\tt.Errorf(\"#%d expected point is not on the curve -- \"+\n\t\t\t\t\"invalid test data\", i)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Add the two points.\n\t\tvar r JacobianPoint\n\t\tAddNonConst(&p1, &p2, &r)\n\n\t\t// Ensure result matches expected.\n\t\tif !r.X.Equals(&want.X) || !r.Y.Equals(&want.Y) || !r.Z.Equals(&want.Z) {\n\t\t\tt.Errorf(\"#%d wrong result\\ngot: (%v, %v, %v)\\n\"+\n\t\t\t\t\"want: (%v, %v, %v)\", i, r.X, r.Y, r.Z, want.X, want.Y, want.Z)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestAddAffine tests addition of points in affine coordinates.\nfunc TestAddAffine(t *testing.T) {\n\ttests := []struct {\n\t\tx1, y1 string // Coordinates (in hex) of first point to add\n\t\tx2, y2 string // Coordinates (in hex) of second point to add\n\t\tx3, y3 string // Coordinates (in hex) of expected point\n\t}{\n\t\t// Addition with a point at infinity (left hand side).\n\t\t// ∞ + P = P\n\t\t{\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\",\n\t\t\t\"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d\",\n\t\t\t\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\",\n\t\t\t\"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d\",\n\t\t},\n\t\t// Addition with a point at infinity (right hand side).\n\t\t// P + ∞ = P\n\t\t{\n\t\t\t\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\",\n\t\t\t\"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\",\n\t\t\t\"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d\",\n\t\t},\n\n\t\t// Addition with different x values.\n\t\t{\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\t\"d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575\",\n\t\t\t\"131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d\",\n\t\t\t\"fd5b88c21d3143518d522cd2796f3d726793c88b3e05636bc829448e053fed69\",\n\t\t\t\"21cf4f6a5be5ff6380234c50424a970b1f7e718f5eb58f68198c108d642a137f\",\n\t\t},\n\t\t// Addition with same x opposite y.\n\t\t// P(x, y) + P(x, -y) = infinity\n\t\t{\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"f48e156428cf0276dc092da5856e182288d7569f97934a56fe44be60f0d359fd\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t},\n\t\t// Addition with same point.\n\t\t// P(x, y) + P(x, y) = 2P\n\t\t{\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\t\"59477d88ae64a104dbb8d31ec4ce2d91b2fe50fa628fb6a064e22582196b365b\",\n\t\t\t\"938dc8c0f13d1e75c987cb1a220501bd614b0d3dd9eb5c639847e1240216e3b6\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Convert hex to field values.\n\t\tx1, y1 := fromHex(test.x1), fromHex(test.y1)\n\t\tx2, y2 := fromHex(test.x2), fromHex(test.y2)\n\t\tx3, y3 := fromHex(test.x3), fromHex(test.y3)\n\n\t\t// Ensure the test data is using points that are actually on\n\t\t// the curve (or the point at infinity).\n\t\tif !(x1.Sign() == 0 && y1.Sign() == 0) && !S256().IsOnCurve(x1, y1) {\n\t\t\tt.Errorf(\"#%d first point is not on the curve -- \"+\n\t\t\t\t\"invalid test data\", i)\n\t\t\tcontinue\n\t\t}\n\t\tif !(x2.Sign() == 0 && y2.Sign() == 0) && !S256().IsOnCurve(x2, y2) {\n\t\t\tt.Errorf(\"#%d second point is not on the curve -- \"+\n\t\t\t\t\"invalid test data\", i)\n\t\t\tcontinue\n\t\t}\n\t\tif !(x3.Sign() == 0 && y3.Sign() == 0) && !S256().IsOnCurve(x3, y3) {\n\t\t\tt.Errorf(\"#%d expected point is not on the curve -- \"+\n\t\t\t\t\"invalid test data\", i)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Add the two points.\n\t\trx, ry := S256().Add(x1, y1, x2, y2)\n\n\t\t// Ensure result matches expected.\n\t\tif rx.Cmp(x3) != 00 || ry.Cmp(y3) != 0 {\n\t\t\tt.Errorf(\"#%d wrong result\\ngot: (%x, %x)\\n\"+\n\t\t\t\t\"want: (%x, %x)\", i, rx, ry, x3, y3)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// isStrictlyEqual returns whether or not the two Jacobian points are strictly\n// equal for use in the tests.  Recall that several Jacobian points can be\n// equal in affine coordinates, while not having the same coordinates in\n// projective space, so the two points not being equal doesn't necessarily mean\n// they aren't actually the same affine point.\nfunc isStrictlyEqual(p, other *JacobianPoint) bool {\n\treturn p.X.Equals(&other.X) && p.Y.Equals(&other.Y) && p.Z.Equals(&other.Z)\n}\n\n// TestDoubleJacobian tests doubling of points projected in Jacobian\n// coordinates.\nfunc TestDoubleJacobian(t *testing.T) {\n\ttests := []struct {\n\t\tx1, y1, z1 string // Coordinates (in hex) of point to double\n\t\tx3, y3, z3 string // Coordinates (in hex) of expected point\n\t}{\n\t\t// Doubling a point at infinity is still infinity.\n\t\t{\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t},\n\t\t// Doubling with z1=1.\n\t\t{\n\t\t\t\"34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6\",\n\t\t\t\"0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232\",\n\t\t\t\"1\",\n\t\t\t\"ec9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee64f87c50c27\",\n\t\t\t\"b082b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd0755c8f2a\",\n\t\t\t\"16e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c1e594464\",\n\t\t},\n\t\t// Doubling with z1!=1.\n\t\t{\n\t\t\t\"d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718\",\n\t\t\t\"5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190\",\n\t\t\t\"2\",\n\t\t\t\"9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac\",\n\t\t\t\"2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988\",\n\t\t\t\"6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11\",\n\t\t},\n\t\t// From btcd issue #709.\n\t\t{\n\t\t\t\"201e3f75715136d2f93c4f4598f91826f94ca01f4233a5bd35de9708859ca50d\",\n\t\t\t\"bdf18566445e7562c6ada68aef02d498d7301503de5b18c6aef6e2b1722412e1\",\n\t\t\t\"0000000000000000000000000000000000000000000000000000000000000001\",\n\t\t\t\"4a5e0559863ebb4e9ed85f5c4fa76003d05d9a7626616e614a1f738621e3c220\",\n\t\t\t\"00000000000000000000000000000000000000000000000000000001b1388778\",\n\t\t\t\"7be30acc88bceac58d5b4d15de05a931ae602a07bcb6318d5dedc563e4482993\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Convert hex to field values.\n\t\tp1 := jacobianPointFromHex(test.x1, test.y1, test.z1)\n\t\twant := jacobianPointFromHex(test.x3, test.y3, test.z3)\n\n\t\t// Ensure the test data is using points that are actually on\n\t\t// the curve (or the point at infinity).\n\t\tif !p1.Z.IsZero() && !isJacobianOnS256Curve(&p1) {\n\t\t\tt.Errorf(\"#%d first point is not on the curve -- \"+\n\t\t\t\t\"invalid test data\", i)\n\t\t\tcontinue\n\t\t}\n\t\tif !want.Z.IsZero() && !isJacobianOnS256Curve(&want) {\n\t\t\tt.Errorf(\"#%d expected point is not on the curve -- \"+\n\t\t\t\t\"invalid test data\", i)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Double the point.\n\t\tvar result JacobianPoint\n\t\tDoubleNonConst(&p1, &result)\n\n\t\t// Ensure result matches expected.\n\t\tif !isStrictlyEqual(&result, &want) {\n\t\t\tt.Errorf(\"#%d wrong result\\ngot: (%v, %v, %v)\\n\"+\n\t\t\t\t\"want: (%v, %v, %v)\", i, result.X, result.Y, result.Z,\n\t\t\t\twant.X, want.Y, want.Z)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestDoubleAffine tests doubling of points in affine coordinates.\nfunc TestDoubleAffine(t *testing.T) {\n\ttests := []struct {\n\t\tx1, y1 string // Coordinates (in hex) of point to double\n\t\tx3, y3 string // Coordinates (in hex) of expected point\n\t}{\n\t\t// Doubling a point at infinity is still infinity.\n\t\t// 2*∞ = ∞ (point at infinity)\n\n\t\t{\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t\t\"0\",\n\t\t},\n\n\t\t// Random points.\n\t\t{\n\t\t\t\"e41387ffd8baaeeb43c2faa44e141b19790e8ac1f7ff43d480dc132230536f86\",\n\t\t\t\"1b88191d430f559896149c86cbcb703193105e3cf3213c0c3556399836a2b899\",\n\t\t\t\"88da47a089d333371bd798c548ef7caae76e737c1980b452d367b3cfe3082c19\",\n\t\t\t\"3b6f659b09a362821dfcfefdbfbc2e59b935ba081b6c249eb147b3c2100b1bc1\",\n\t\t},\n\t\t{\n\t\t\t\"b3589b5d984f03ef7c80aeae444f919374799edf18d375cab10489a3009cff0c\",\n\t\t\t\"c26cf343875b3630e15bccc61202815b5d8f1fd11308934a584a5babe69db36a\",\n\t\t\t\"e193860172998751e527bb12563855602a227fc1f612523394da53b746bb2fb1\",\n\t\t\t\"2bfcf13d2f5ab8bb5c611fab5ebbed3dc2f057062b39a335224c22f090c04789\",\n\t\t},\n\t\t{\n\t\t\t\"2b31a40fbebe3440d43ac28dba23eee71c62762c3fe3dbd88b4ab82dc6a82340\",\n\t\t\t\"9ba7deb02f5c010e217607fd49d58db78ec273371ea828b49891ce2fd74959a1\",\n\t\t\t\"2c8d5ef0d343b1a1a48aa336078eadda8481cb048d9305dc4fdf7ee5f65973a2\",\n\t\t\t\"bb4914ac729e26d3cd8f8dc8f702f3f4bb7e0e9c5ae43335f6e94c2de6c3dc95\",\n\t\t},\n\t\t{\n\t\t\t\"61c64b760b51981fab54716d5078ab7dffc93730b1d1823477e27c51f6904c7a\",\n\t\t\t\"ef6eb16ea1a36af69d7f66524c75a3a5e84c13be8fbc2e811e0563c5405e49bd\",\n\t\t\t\"5f0dcdd2595f5ad83318a0f9da481039e36f135005420393e72dfca985b482f4\",\n\t\t\t\"a01c849b0837065c1cb481b0932c441f49d1cab1b4b9f355c35173d93f110ae0\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Convert hex to field values.\n\t\tx1, y1 := fromHex(test.x1), fromHex(test.y1)\n\t\tx3, y3 := fromHex(test.x3), fromHex(test.y3)\n\n\t\t// Ensure the test data is using points that are actually on\n\t\t// the curve (or the point at infinity).\n\t\tif !(x1.Sign() == 0 && y1.Sign() == 0) && !S256().IsOnCurve(x1, y1) {\n\t\t\tt.Errorf(\"#%d first point is not on the curve -- \"+\n\t\t\t\t\"invalid test data\", i)\n\t\t\tcontinue\n\t\t}\n\t\tif !(x3.Sign() == 0 && y3.Sign() == 0) && !S256().IsOnCurve(x3, y3) {\n\t\t\tt.Errorf(\"#%d expected point is not on the curve -- \"+\n\t\t\t\t\"invalid test data\", i)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Double the point.\n\t\trx, ry := S256().Double(x1, y1)\n\n\t\t// Ensure result matches expected.\n\t\tif rx.Cmp(x3) != 00 || ry.Cmp(y3) != 0 {\n\t\t\tt.Errorf(\"#%d wrong result\\ngot: (%x, %x)\\n\"+\n\t\t\t\t\"want: (%x, %x)\", i, rx, ry, x3, y3)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc TestOnCurve(t *testing.T) {\n\ts256 := S256()\n\tif !s256.IsOnCurve(s256.Params().Gx, s256.Params().Gy) {\n\t\tt.Errorf(\"FAIL S256\")\n\t}\n}\n\ntype baseMultTest struct {\n\tk    string\n\tx, y string\n}\n\n// TODO: add more test vectors\nvar s256BaseMultTests = []baseMultTest{\n\t{\n\t\t\"AA5E28D6A97A2479A65527F7290311A3624D4CC0FA1578598EE3C2613BF99522\",\n\t\t\"34F9460F0E4F08393D192B3C5133A6BA099AA0AD9FD54EBCCFACDFA239FF49C6\",\n\t\t\"B71EA9BD730FD8923F6D25A7A91E7DD7728A960686CB5A901BB419E0F2CA232\",\n\t},\n\t{\n\t\t\"7E2B897B8CEBC6361663AD410835639826D590F393D90A9538881735256DFAE3\",\n\t\t\"D74BF844B0862475103D96A611CF2D898447E288D34B360BC885CB8CE7C00575\",\n\t\t\"131C670D414C4546B88AC3FF664611B1C38CEB1C21D76369D7A7A0969D61D97D\",\n\t},\n\t{\n\t\t\"6461E6DF0FE7DFD05329F41BF771B86578143D4DD1F7866FB4CA7E97C5FA945D\",\n\t\t\"E8AECC370AEDD953483719A116711963CE201AC3EB21D3F3257BB48668C6A72F\",\n\t\t\"C25CAF2F0EBA1DDB2F0F3F47866299EF907867B7D27E95B3873BF98397B24EE1\",\n\t},\n\t{\n\t\t\"376A3A2CDCD12581EFFF13EE4AD44C4044B8A0524C42422A7E1E181E4DEECCEC\",\n\t\t\"14890E61FCD4B0BD92E5B36C81372CA6FED471EF3AA60A3E415EE4FE987DABA1\",\n\t\t\"297B858D9F752AB42D3BCA67EE0EB6DCD1C2B7B0DBE23397E66ADC272263F982\",\n\t},\n\t{\n\t\t\"1B22644A7BE026548810C378D0B2994EEFA6D2B9881803CB02CEFF865287D1B9\",\n\t\t\"F73C65EAD01C5126F28F442D087689BFA08E12763E0CEC1D35B01751FD735ED3\",\n\t\t\"F449A8376906482A84ED01479BD18882B919C140D638307F0C0934BA12590BDE\",\n\t},\n}\n\n// TODO: test different curves as well?\nfunc TestBaseMult(t *testing.T) {\n\ts256 := S256()\n\tfor i, e := range s256BaseMultTests {\n\t\tk, ok := new(big.Int).SetString(e.k, 16)\n\t\tif !ok {\n\t\t\tt.Errorf(\"%d: bad value for k: %s\", i, e.k)\n\t\t}\n\t\tx, y := s256.ScalarBaseMult(k.Bytes())\n\t\tif fmt.Sprintf(\"%X\", x) != e.x || fmt.Sprintf(\"%X\", y) != e.y {\n\t\t\tt.Errorf(\"%d: bad output for k=%s: got (%X, %X), want (%s, %s)\", i, e.k, x, y, e.x, e.y)\n\t\t}\n\t\tif testing.Short() && i > 5 {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc TestBaseMultVerify(t *testing.T) {\n\ts256 := S256()\n\tfor bytes := 1; bytes < 40; bytes++ {\n\t\tfor i := 0; i < 30; i++ {\n\t\t\tdata := make([]byte, bytes)\n\t\t\t_, err := rand.Read(data)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to read random data for %d\", i)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tx, y := s256.ScalarBaseMult(data)\n\t\t\txWant, yWant := s256.ScalarMult(s256.Gx, s256.Gy, data)\n\t\t\tif x.Cmp(xWant) != 0 || y.Cmp(yWant) != 0 {\n\t\t\t\tt.Errorf(\"%d: bad output for %X: got (%X, %X), want (%X, %X)\", i, data, x, y, xWant, yWant)\n\t\t\t}\n\t\t\tif testing.Short() && i > 2 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestScalarMult(t *testing.T) {\n\ttests := []struct {\n\t\tx  string\n\t\ty  string\n\t\tk  string\n\t\trx string\n\t\try string\n\t}{\n\t\t// base mult, essentially.\n\t\t{\n\t\t\t\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\n\t\t\t\"483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n\t\t\t\"18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725\",\n\t\t\t\"50863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352\",\n\t\t\t\"2cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6\",\n\t\t},\n\t\t// From btcd issue #709.\n\t\t{\n\t\t\t\"000000000000000000000000000000000000000000000000000000000000002c\",\n\t\t\t\"420e7a99bba18a9d3952597510fd2b6728cfeafc21a4e73951091d4d8ddbe94e\",\n\t\t\t\"a2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba219b51835b55cc30ebfe2f6599bc56f58\",\n\t\t\t\"a2112dcdfbcd10ae1133a358de7b82db68e0a3eb4b492cc8268d1e7118c98788\",\n\t\t\t\"27fc7463b7bb3c5f98ecf2c84a6272bb1681ed553d92c69f2dfe25a9f9fd3836\",\n\t\t},\n\t}\n\n\ts256 := S256()\n\tfor i, test := range tests {\n\t\tx, _ := new(big.Int).SetString(test.x, 16)\n\t\ty, _ := new(big.Int).SetString(test.y, 16)\n\t\tk, _ := new(big.Int).SetString(test.k, 16)\n\t\txWant, _ := new(big.Int).SetString(test.rx, 16)\n\t\tyWant, _ := new(big.Int).SetString(test.ry, 16)\n\t\txGot, yGot := s256.ScalarMult(x, y, k.Bytes())\n\t\tif xGot.Cmp(xWant) != 0 || yGot.Cmp(yWant) != 0 {\n\t\t\tt.Fatalf(\"%d: bad output: got (%X, %X), want (%X, %X)\", i, xGot, yGot, xWant, yWant)\n\t\t}\n\t}\n}\n\nfunc TestScalarMultRand(t *testing.T) {\n\t// Strategy for this test:\n\t// Get a random exponent from the generator point at first\n\t// This creates a new point which is used in the next iteration\n\t// Use another random exponent on the new point.\n\t// We use BaseMult to verify by multiplying the previous exponent\n\t// and the new random exponent together (mod N)\n\ts256 := S256()\n\tx, y := s256.Gx, s256.Gy\n\texponent := big.NewInt(1)\n\tfor i := 0; i < 1024; i++ {\n\t\tdata := make([]byte, 32)\n\t\t_, err := rand.Read(data)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to read random data at %d\", i)\n\t\t}\n\t\tx, y = s256.ScalarMult(x, y, data)\n\t\texponent.Mul(exponent, new(big.Int).SetBytes(data))\n\t\txWant, yWant := s256.ScalarBaseMult(exponent.Bytes())\n\t\tif x.Cmp(xWant) != 0 || y.Cmp(yWant) != 0 {\n\t\t\tt.Fatalf(\"%d: bad output for %X: got (%X, %X), want (%X, %X)\", i, data, x, y, xWant, yWant)\n\t\t}\n\t}\n}\n\nvar (\n\t// Next 6 constants are from Hal Finney's bitcointalk.org post:\n\t// https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565\n\t// May he rest in peace.\n\t//\n\t// They have also been independently derived from the code in the\n\t// EndomorphismVectors function in genstatics.go.\n\tendomorphismLambda = fromHex(\"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72\")\n\tendomorphismBeta   = hexToFieldVal(\"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee\")\n\tendomorphismA1     = fromHex(\"3086d221a7d46bcde86c90e49284eb15\")\n\tendomorphismB1     = fromHex(\"-e4437ed6010e88286f547fa90abfe4c3\")\n\tendomorphismA2     = fromHex(\"114ca50f7a8e2f3f657c1108d9d44cfd8\")\n\tendomorphismB2     = fromHex(\"3086d221a7d46bcde86c90e49284eb15\")\n)\n\n// splitK returns a balanced length-two representation of k and their signs.\n// This is algorithm 3.74 from [GECC].\n//\n// One thing of note about this algorithm is that no matter what c1 and c2 are,\n// the final equation of k = k1 + k2 * lambda (mod n) will hold.  This is\n// provable mathematically due to how a1/b1/a2/b2 are computed.\n//\n// c1 and c2 are chosen to minimize the max(k1,k2).\nfunc splitK(k []byte) ([]byte, []byte, int, int) {\n\t// All math here is done with big.Int, which is slow.\n\t// At some point, it might be useful to write something similar to\n\t// FieldVal but for N instead of P as the prime field if this ends up\n\t// being a bottleneck.\n\tbigIntK := new(big.Int)\n\tc1, c2 := new(big.Int), new(big.Int)\n\ttmp1, tmp2 := new(big.Int), new(big.Int)\n\tk1, k2 := new(big.Int), new(big.Int)\n\n\tbigIntK.SetBytes(k)\n\t// c1 = round(b2 * k / n) from step 4.\n\t// Rounding isn't really necessary and costs too much, hence skipped\n\tc1.Mul(endomorphismB2, bigIntK)\n\tc1.Div(c1, Params().N)\n\t// c2 = round(b1 * k / n) from step 4 (sign reversed to optimize one step)\n\t// Rounding isn't really necessary and costs too much, hence skipped\n\tc2.Mul(endomorphismB1, bigIntK)\n\tc2.Div(c2, Params().N)\n\t// k1 = k - c1 * a1 - c2 * a2 from step 5 (note c2's sign is reversed)\n\ttmp1.Mul(c1, endomorphismA1)\n\ttmp2.Mul(c2, endomorphismA2)\n\tk1.Sub(bigIntK, tmp1)\n\tk1.Add(k1, tmp2)\n\t// k2 = - c1 * b1 - c2 * b2 from step 5 (note c2's sign is reversed)\n\ttmp1.Mul(c1, endomorphismB1)\n\ttmp2.Mul(c2, endomorphismB2)\n\tk2.Sub(tmp2, tmp1)\n\n\t// Note Bytes() throws out the sign of k1 and k2. This matters\n\t// since k1 and/or k2 can be negative. Hence, we pass that\n\t// back separately.\n\treturn k1.Bytes(), k2.Bytes(), k1.Sign(), k2.Sign()\n}\n\nfunc TestSplitK(t *testing.T) {\n\ttests := []struct {\n\t\tk      string\n\t\tk1, k2 string\n\t\ts1, s2 int\n\t}{\n\t\t{\n\t\t\t\"6df2b5d30854069ccdec40ae022f5c948936324a4e9ebed8eb82cfd5a6b6d766\",\n\t\t\t\"00000000000000000000000000000000b776e53fb55f6b006a270d42d64ec2b1\",\n\t\t\t\"00000000000000000000000000000000d6cc32c857f1174b604eefc544f0c7f7\",\n\t\t\t-1, -1,\n\t\t},\n\t\t{\n\t\t\t\"6ca00a8f10632170accc1b3baf2a118fa5725f41473f8959f34b8f860c47d88d\",\n\t\t\t\"0000000000000000000000000000000007b21976c1795723c1bfbfa511e95b84\",\n\t\t\t\"00000000000000000000000000000000d8d2d5f9d20fc64fd2cf9bda09a5bf90\",\n\t\t\t1, -1,\n\t\t},\n\t\t{\n\t\t\t\"b2eda8ab31b259032d39cbc2a234af17fcee89c863a8917b2740b67568166289\",\n\t\t\t\"00000000000000000000000000000000507d930fecda7414fc4a523b95ef3c8c\",\n\t\t\t\"00000000000000000000000000000000f65ffb179df189675338c6185cb839be\",\n\t\t\t-1, -1,\n\t\t},\n\t\t{\n\t\t\t\"f6f00e44f179936f2befc7442721b0633f6bafdf7161c167ffc6f7751980e3a0\",\n\t\t\t\"0000000000000000000000000000000008d0264f10bcdcd97da3faa38f85308d\",\n\t\t\t\"0000000000000000000000000000000065fed1506eb6605a899a54e155665f79\",\n\t\t\t-1, -1,\n\t\t},\n\t\t{\n\t\t\t\"8679085ab081dc92cdd23091ce3ee998f6b320e419c3475fae6b5b7d3081996e\",\n\t\t\t\"0000000000000000000000000000000089fbf24fbaa5c3c137b4f1cedc51d975\",\n\t\t\t\"00000000000000000000000000000000d38aa615bd6754d6f4d51ccdaf529fea\",\n\t\t\t-1, -1,\n\t\t},\n\t\t{\n\t\t\t\"6b1247bb7931dfcae5b5603c8b5ae22ce94d670138c51872225beae6bba8cdb3\",\n\t\t\t\"000000000000000000000000000000008acc2a521b21b17cfb002c83be62f55d\",\n\t\t\t\"0000000000000000000000000000000035f0eff4d7430950ecb2d94193dedc79\",\n\t\t\t-1, -1,\n\t\t},\n\t\t{\n\t\t\t\"a2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba219b51835b55cc30ebfe2f6599bc56f58\",\n\t\t\t\"0000000000000000000000000000000045c53aa1bb56fcd68c011e2dad6758e4\",\n\t\t\t\"00000000000000000000000000000000a2e79d200f27f2360fba57619936159b\",\n\t\t\t-1, -1,\n\t\t},\n\t}\n\n\ts256 := S256()\n\tfor i, test := range tests {\n\t\tk, ok := new(big.Int).SetString(test.k, 16)\n\t\tif !ok {\n\t\t\tt.Errorf(\"%d: bad value for k: %s\", i, test.k)\n\t\t}\n\t\tk1, k2, k1Sign, k2Sign := splitK(k.Bytes())\n\t\tk1str := fmt.Sprintf(\"%064x\", k1)\n\t\tif test.k1 != k1str {\n\t\t\tt.Errorf(\"%d: bad k1: got %v, want %v\", i, k1str, test.k1)\n\t\t}\n\t\tk2str := fmt.Sprintf(\"%064x\", k2)\n\t\tif test.k2 != k2str {\n\t\t\tt.Errorf(\"%d: bad k2: got %v, want %v\", i, k2str, test.k2)\n\t\t}\n\t\tif test.s1 != k1Sign {\n\t\t\tt.Errorf(\"%d: bad k1 sign: got %d, want %d\", i, k1Sign, test.s1)\n\t\t}\n\t\tif test.s2 != k2Sign {\n\t\t\tt.Errorf(\"%d: bad k2 sign: got %d, want %d\", i, k2Sign, test.s2)\n\t\t}\n\t\tk1Int := new(big.Int).SetBytes(k1)\n\t\tk1SignInt := new(big.Int).SetInt64(int64(k1Sign))\n\t\tk1Int.Mul(k1Int, k1SignInt)\n\t\tk2Int := new(big.Int).SetBytes(k2)\n\t\tk2SignInt := new(big.Int).SetInt64(int64(k2Sign))\n\t\tk2Int.Mul(k2Int, k2SignInt)\n\t\tgotK := new(big.Int).Mul(k2Int, endomorphismLambda)\n\t\tgotK.Add(k1Int, gotK)\n\t\tgotK.Mod(gotK, s256.N)\n\t\tif k.Cmp(gotK) != 0 {\n\t\t\tt.Errorf(\"%d: bad k: got %X, want %X\", i, gotK.Bytes(), k.Bytes())\n\t\t}\n\t}\n}\n\nfunc TestSplitKRand(t *testing.T) {\n\ts256 := S256()\n\tfor i := 0; i < 1024; i++ {\n\t\tbytesK := make([]byte, 32)\n\t\t_, err := rand.Read(bytesK)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to read random data at %d\", i)\n\t\t}\n\t\tk := new(big.Int).SetBytes(bytesK)\n\t\tk1, k2, k1Sign, k2Sign := splitK(bytesK)\n\t\tk1Int := new(big.Int).SetBytes(k1)\n\t\tk1SignInt := new(big.Int).SetInt64(int64(k1Sign))\n\t\tk1Int.Mul(k1Int, k1SignInt)\n\t\tk2Int := new(big.Int).SetBytes(k2)\n\t\tk2SignInt := new(big.Int).SetInt64(int64(k2Sign))\n\t\tk2Int.Mul(k2Int, k2SignInt)\n\t\tgotK := new(big.Int).Mul(k2Int, endomorphismLambda)\n\t\tgotK.Add(k1Int, gotK)\n\t\tgotK.Mod(gotK, s256.N)\n\t\tif k.Cmp(gotK) != 0 {\n\t\t\tt.Errorf(\"%d: bad k: got %X, want %X\", i, gotK.Bytes(), k.Bytes())\n\t\t}\n\t}\n}\n\n// Test this curve's usage with the ecdsa package.\n\nfunc testKeyGeneration(t *testing.T, c *KoblitzCurve, tag string) {\n\tpriv, err := NewPrivateKey()\n\tif err != nil {\n\t\tt.Errorf(\"%s: error: %s\", tag, err)\n\t\treturn\n\t}\n\tpub := priv.PubKey()\n\tif !c.IsOnCurve(pub.X(), pub.Y()) {\n\t\tt.Errorf(\"%s: public key invalid: %s\", tag, err)\n\t}\n}\n\nfunc TestKeyGeneration(t *testing.T) {\n\ttestKeyGeneration(t, S256(), \"S256\")\n}\n\n// checkNAFEncoding returns an error if the provided positive and negative\n// portions of an overall NAF encoding do not adhere to the requirements or they\n// do not sum back to the provided original value.\nfunc checkNAFEncoding(pos, neg []byte, origValue *big.Int) error {\n\t// NAF must not have a leading zero byte and the number of negative\n\t// bytes must not exceed the positive portion.\n\tif len(pos) > 0 && pos[0] == 0 {\n\t\treturn fmt.Errorf(\"positive has leading zero -- got %x\", pos)\n\t}\n\tif len(neg) > len(pos) {\n\t\treturn fmt.Errorf(\"negative has len %d > pos len %d\", len(neg),\n\t\t\tlen(pos))\n\t}\n\n\t// Ensure the result doesn't have any adjacent non-zero digits.\n\tgotPos := new(big.Int).SetBytes(pos)\n\tgotNeg := new(big.Int).SetBytes(neg)\n\tposOrNeg := new(big.Int).Or(gotPos, gotNeg)\n\tprevBit := posOrNeg.Bit(0)\n\tfor bit := 1; bit < posOrNeg.BitLen(); bit++ {\n\t\tthisBit := posOrNeg.Bit(bit)\n\t\tif prevBit == 1 && thisBit == 1 {\n\t\t\treturn fmt.Errorf(\"adjacent non-zero digits found at bit pos %d\",\n\t\t\t\tbit-1)\n\t\t}\n\t\tprevBit = thisBit\n\t}\n\n\t// Ensure the resulting positive and negative portions of the overall\n\t// NAF representation sum back to the original value.\n\tgotValue := new(big.Int).Sub(gotPos, gotNeg)\n\tif origValue.Cmp(gotValue) != 0 {\n\t\treturn fmt.Errorf(\"pos-neg is not original value: got %x, want %x\",\n\t\t\tgotValue, origValue)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "btcec/ciphering.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcec\n\nimport (\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// GenerateSharedSecret generates a shared secret based on a private key and a\n// public key using Diffie-Hellman key exchange (ECDH) (RFC 4753).\n// RFC5903 Section 9 states we should only return x.\nfunc GenerateSharedSecret(privkey *PrivateKey, pubkey *PublicKey) []byte {\n\treturn secp.GenerateSharedSecret(privkey, pubkey)\n}\n"
  },
  {
    "path": "btcec/ciphering_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcec\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n)\n\nfunc TestGenerateSharedSecret(t *testing.T) {\n\tprivKey1, err := NewPrivateKey()\n\tif err != nil {\n\t\tt.Errorf(\"private key generation error: %s\", err)\n\t\treturn\n\t}\n\tprivKey2, err := NewPrivateKey()\n\tif err != nil {\n\t\tt.Errorf(\"private key generation error: %s\", err)\n\t\treturn\n\t}\n\n\tsecret1 := GenerateSharedSecret(privKey1, privKey2.PubKey())\n\tsecret2 := GenerateSharedSecret(privKey2, privKey1.PubKey())\n\n\tif !bytes.Equal(secret1, secret2) {\n\t\tt.Errorf(\"ECDH failed, secrets mismatch - first: %x, second: %x\",\n\t\t\tsecret1, secret2)\n\t}\n}\n"
  },
  {
    "path": "btcec/curve.go",
    "content": "// Copyright (c) 2015-2021 The btcsuite developers\n// Copyright (c) 2015-2021 The Decred developers\n\npackage btcec\n\nimport (\n\t\"fmt\"\n\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// JacobianPoint is an element of the group formed by the secp256k1 curve in\n// Jacobian projective coordinates and thus represents a point on the curve.\ntype JacobianPoint = secp.JacobianPoint\n\n// infinityPoint is the jacobian representation of the point at infinity.\nvar infinityPoint JacobianPoint\n\n// MakeJacobianPoint returns a Jacobian point with the provided X, Y, and Z\n// coordinates.\nfunc MakeJacobianPoint(x, y, z *FieldVal) JacobianPoint {\n\treturn secp.MakeJacobianPoint(x, y, z)\n}\n\n// AddNonConst adds the passed Jacobian points together and stores the result\n// in the provided result param in *non-constant* time.\nfunc AddNonConst(p1, p2, result *JacobianPoint) {\n\tsecp.AddNonConst(p1, p2, result)\n}\n\n// DecompressY attempts to calculate the Y coordinate for the given X\n// coordinate such that the result pair is a point on the secp256k1 curve. It\n// adjusts Y based on the desired oddness and returns whether or not it was\n// successful since not all X coordinates are valid.\n//\n// The magnitude of the provided X coordinate field val must be a max of 8 for\n// a correct result. The resulting Y field val will have a max magnitude of 2.\nfunc DecompressY(x *FieldVal, odd bool, resultY *FieldVal) bool {\n\treturn secp.DecompressY(x, odd, resultY)\n}\n\n// DoubleNonConst doubles the passed Jacobian point and stores the result in\n// the provided result parameter in *non-constant* time.\n//\n// NOTE: The point must be normalized for this function to return the correct\n// result. The resulting point will be normalized.\nfunc DoubleNonConst(p, result *JacobianPoint) {\n\tsecp.DoubleNonConst(p, result)\n}\n\n// ScalarBaseMultNonConst multiplies k*G where G is the base point of the group\n// and k is a big endian integer. The result is stored in Jacobian coordinates\n// (x1, y1, z1).\n//\n// NOTE: The resulting point will be normalized.\nfunc ScalarBaseMultNonConst(k *ModNScalar, result *JacobianPoint) {\n\tsecp.ScalarBaseMultNonConst(k, result)\n}\n\n// ScalarMultNonConst multiplies k*P where k is a big endian integer modulo the\n// curve order and P is a point in Jacobian projective coordinates and stores\n// the result in the provided Jacobian point.\n//\n// NOTE: The point must be normalized for this function to return the correct\n// result. The resulting point will be normalized.\nfunc ScalarMultNonConst(k *ModNScalar, point, result *JacobianPoint) {\n\tsecp.ScalarMultNonConst(k, point, result)\n}\n\n// ParseJacobian parses a byte slice point as a secp.Publickey and returns the\n// pubkey as a JacobianPoint. If the nonce is a zero slice, the infinityPoint\n// is returned.\nfunc ParseJacobian(point []byte) (JacobianPoint, error) {\n\tvar result JacobianPoint\n\n\tif len(point) != 33 {\n\t\tstr := fmt.Sprintf(\"invalid nonce: invalid length: %v\",\n\t\t\tlen(point))\n\t\treturn JacobianPoint{}, makeError(secp.ErrPubKeyInvalidLen, str)\n\t}\n\n\tif point[0] == 0x00 {\n\t\treturn infinityPoint, nil\n\t}\n\n\tnoncePk, err := secp.ParsePubKey(point)\n\tif err != nil {\n\t\treturn JacobianPoint{}, err\n\t}\n\tnoncePk.AsJacobian(&result)\n\n\treturn result, nil\n}\n\n// JacobianToByteSlice converts the passed JacobianPoint to a Pubkey\n// and serializes that to a byte slice. If the JacobianPoint is the infinity\n// point, a zero slice is returned.\nfunc JacobianToByteSlice(point JacobianPoint) []byte {\n\tif point.X == infinityPoint.X && point.Y == infinityPoint.Y {\n\t\treturn make([]byte, 33)\n\t}\n\n\tpoint.ToAffine()\n\n\treturn NewPublicKey(\n\t\t&point.X, &point.Y,\n\t).SerializeCompressed()\n}\n\n// GeneratorJacobian sets the passed JacobianPoint to the Generator Point.\nfunc GeneratorJacobian(jacobian *JacobianPoint) {\n\tvar k ModNScalar\n\tk.SetInt(1)\n\tScalarBaseMultNonConst(&k, jacobian)\n}\n"
  },
  {
    "path": "btcec/doc.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage btcec implements support for the elliptic curves needed for bitcoin.\n\nBitcoin uses elliptic curve cryptography using koblitz curves\n(specifically secp256k1) for cryptographic functions.  See\nhttp://www.secg.org/collateral/sec2_final.pdf for details on the\nstandard.\n\nThis package provides the data structures and functions implementing the\ncrypto/elliptic Curve interface in order to permit using these curves\nwith the standard crypto/ecdsa package provided with go. Helper\nfunctionality is provided to parse signatures and public keys from\nstandard formats.  It was designed for use with btcd, but should be\ngeneral enough for other uses of elliptic curve crypto.  It was originally based\non some initial work by ThePiachu, but has significantly diverged since then.\n*/\npackage btcec\n"
  },
  {
    "path": "btcec/ecdsa/bench_test.go",
    "content": "// Copyright 2013-2016 The btcsuite developers\n// Copyright (c) 2015-2021 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ecdsa\n\nimport (\n\t\"encoding/hex\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// hexToBytes converts the passed hex string into bytes and will panic if there\n// is an error.  This is only provided for the hard-coded constants so errors in\n// the source code can be detected. It will only (and must only) be called with\n// hard-coded values.\nfunc hexToBytes(s string) []byte {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn b\n}\n\n// hexToModNScalar converts the passed hex string into a ModNScalar and will\n// panic if there is an error.  This is only provided for the hard-coded\n// constants so errors in the source code can be detected. It will only (and\n// must only) be called with hard-coded values.\nfunc hexToModNScalar(s string) *btcec.ModNScalar {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\tvar scalar btcec.ModNScalar\n\tif overflow := scalar.SetByteSlice(b); overflow {\n\t\tpanic(\"hex in source file overflows mod N scalar: \" + s)\n\t}\n\treturn &scalar\n}\n\n// hexToFieldVal converts the passed hex string into a FieldVal and will panic\n// if there is an error.  This is only provided for the hard-coded constants so\n// errors in the source code can be detected. It will only (and must only) be\n// called with hard-coded values.\nfunc hexToFieldVal(s string) *btcec.FieldVal {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\tvar f btcec.FieldVal\n\tif overflow := f.SetByteSlice(b); overflow {\n\t\tpanic(\"hex in source file overflows mod P: \" + s)\n\t}\n\treturn &f\n}\n\n// fromHex converts the passed hex string into a big integer pointer and will\n// panic is there is an error.  This is only provided for the hard-coded\n// constants so errors in the source code can bet detected. It will only (and\n// must only) be called for initialization purposes.\nfunc fromHex(s string) *big.Int {\n\tif s == \"\" {\n\t\treturn big.NewInt(0)\n\t}\n\tr, ok := new(big.Int).SetString(s, 16)\n\tif !ok {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn r\n}\n\n// BenchmarkSigVerify benchmarks how long it takes the secp256k1 curve to\n// verify signatures.\nfunc BenchmarkSigVerify(b *testing.B) {\n\tb.StopTimer()\n\t// Randomly generated keypair.\n\t// Private key: 9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d\n\tpubKey := btcec.NewPublicKey(\n\t\thexToFieldVal(\"d2e670a19c6d753d1a6d8b20bd045df8a08fb162cf508956c31268c6d81ffdab\"),\n\t\thexToFieldVal(\"ab65528eefbb8057aa85d597258a3fbd481a24633bc9b47a9aa045c91371de52\"),\n\t)\n\n\t// Double sha256 of []byte{0x01, 0x02, 0x03, 0x04}\n\tmsgHash := fromHex(\"8de472e2399610baaa7f84840547cd409434e31f5d3bd71e4d947f283874f9c0\")\n\tsig := NewSignature(\n\t\thexToModNScalar(\"fef45d2892953aa5bbcdb057b5e98b208f1617a7498af7eb765574e29b5d9c2c\"),\n\t\thexToModNScalar(\"d47563f52aac6b04b55de236b7c515eb9311757db01e02cff079c3ca6efb063f\"),\n\t)\n\n\tif !sig.Verify(msgHash.Bytes(), pubKey) {\n\t\tb.Errorf(\"Signature failed to verify\")\n\t\treturn\n\t}\n\tb.StartTimer()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tsig.Verify(msgHash.Bytes(), pubKey)\n\t}\n}\n\n// BenchmarkSign benchmarks how long it takes to sign a message.\nfunc BenchmarkSign(b *testing.B) {\n\t// Randomly generated keypair.\n\td := hexToModNScalar(\"9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d\")\n\tprivKey := secp256k1.NewPrivateKey(d)\n\n\t// blake256 of []byte{0x01, 0x02, 0x03, 0x04}.\n\tmsgHash := hexToBytes(\"c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7\")\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tSign(privKey, msgHash)\n\t}\n}\n\n// BenchmarkSigSerialize benchmarks how long it takes to serialize a typical\n// signature with the strict DER encoding.\nfunc BenchmarkSigSerialize(b *testing.B) {\n\t// Randomly generated keypair.\n\t// Private key: 9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d\n\t// Signature for double sha256 of []byte{0x01, 0x02, 0x03, 0x04}.\n\tsig := NewSignature(\n\t\thexToModNScalar(\"fef45d2892953aa5bbcdb057b5e98b208f1617a7498af7eb765574e29b5d9c2c\"),\n\t\thexToModNScalar(\"d47563f52aac6b04b55de236b7c515eb9311757db01e02cff079c3ca6efb063f\"),\n\t)\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tsig.Serialize()\n\t}\n}\n\n// BenchmarkNonceRFC6979 benchmarks how long it takes to generate a\n// deterministic nonce according to RFC6979.\nfunc BenchmarkNonceRFC6979(b *testing.B) {\n\t// Randomly generated keypair.\n\t// Private key: 9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d\n\t// X: d2e670a19c6d753d1a6d8b20bd045df8a08fb162cf508956c31268c6d81ffdab\n\t// Y: ab65528eefbb8057aa85d597258a3fbd481a24633bc9b47a9aa045c91371de52\n\tprivKeyStr := \"9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d\"\n\tprivKey := hexToBytes(privKeyStr)\n\n\t// BLAKE-256 of []byte{0x01, 0x02, 0x03, 0x04}.\n\tmsgHash := hexToBytes(\"c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7\")\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tvar noElideNonce *secp256k1.ModNScalar\n\tfor i := 0; i < b.N; i++ {\n\t\tnoElideNonce = secp256k1.NonceRFC6979(privKey, msgHash, nil, nil, 0)\n\t}\n\t_ = noElideNonce\n}\n\n// BenchmarkSignCompact benchmarks how long it takes to produce a compact\n// signature for a message.\nfunc BenchmarkSignCompact(b *testing.B) {\n\td := hexToModNScalar(\"9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d\")\n\tprivKey := secp256k1.NewPrivateKey(d)\n\n\t// blake256 of []byte{0x01, 0x02, 0x03, 0x04}.\n\tmsgHash := hexToBytes(\"c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7\")\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = SignCompact(privKey, msgHash, true)\n\t}\n}\n\n// BenchmarkSignCompact benchmarks how long it takes to recover a public key\n// given a compact signature and message.\nfunc BenchmarkRecoverCompact(b *testing.B) {\n\t// Private key: 9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d\n\twantPubKey := secp256k1.NewPublicKey(\n\t\thexToFieldVal(\"d2e670a19c6d753d1a6d8b20bd045df8a08fb162cf508956c31268c6d81ffdab\"),\n\t\thexToFieldVal(\"ab65528eefbb8057aa85d597258a3fbd481a24633bc9b47a9aa045c91371de52\"),\n\t)\n\n\tcompactSig := hexToBytes(\"205978b7896bc71676ba2e459882a8f52e1299449596c4f\" +\n\t\t\"93c59bf1fbfa2f9d3b76ecd0c99406f61a6de2bb5a8937c061c176ecf381d0231e0d\" +\n\t\t\"af73b922c8952c7\")\n\n\t// blake256 of []byte{0x01, 0x02, 0x03, 0x04}.\n\tmsgHash := hexToBytes(\"c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7\")\n\n\t// Ensure a valid compact signature is being benchmarked.\n\tpubKey, wasCompressed, err := RecoverCompact(compactSig, msgHash)\n\tif err != nil {\n\t\tb.Fatalf(\"unexpected err: %v\", err)\n\t}\n\tif !wasCompressed {\n\t\tb.Fatal(\"recover claims uncompressed pubkey\")\n\t}\n\tif !pubKey.IsEqual(wantPubKey) {\n\t\tb.Fatal(\"recover returned unexpected pubkey\")\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\t_, _, _ = RecoverCompact(compactSig, msgHash)\n\t}\n}\n"
  },
  {
    "path": "btcec/ecdsa/error.go",
    "content": "// Copyright (c) 2013-2021 The btcsuite developers\n// Copyright (c) 2015-2021 The Decred developers\n\npackage ecdsa\n\nimport (\n\tsecp_ecdsa \"github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa\"\n)\n\n// ErrorKind identifies a kind of error.  It has full support for\n// errors.Is and errors.As, so the caller can directly check against\n// an error kind when determining the reason for an error.\ntype ErrorKind = secp_ecdsa.ErrorKind\n\n// Error identifies an error related to an ECDSA signature. It has full\n// support for errors.Is and errors.As, so the caller can ascertain the\n// specific reason for the error by checking the underlying error.\ntype Error = secp_ecdsa.ErrorKind\n"
  },
  {
    "path": "btcec/ecdsa/example_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ecdsa_test\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/ecdsa\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// This example demonstrates signing a message with a secp256k1 private key that\n// is first parsed form raw bytes and serializing the generated signature.\nfunc Example_signMessage() {\n\t// Decode a hex-encoded private key.\n\tpkBytes, err := hex.DecodeString(\"22a47fa09a223f2aa079edf85a7c2d4f87\" +\n\t\t\"20ee63e502ee2869afab7de234b80c\")\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tprivKey, pubKey := btcec.PrivKeyFromBytes(pkBytes)\n\n\t// Sign a message using the private key.\n\tmessage := \"test message\"\n\tmessageHash := chainhash.DoubleHashB([]byte(message))\n\tsignature := ecdsa.Sign(privKey, messageHash)\n\n\t// Serialize and display the signature.\n\tfmt.Printf(\"Serialized Signature: %x\\n\", signature.Serialize())\n\n\t// Verify the signature for the message using the public key.\n\tverified := signature.Verify(messageHash, pubKey)\n\tfmt.Printf(\"Signature Verified? %v\\n\", verified)\n\n\t// Output:\n\t// Serialized Signature: 304402201008e236fa8cd0f25df4482dddbb622e8a8b26ef0ba731719458de3ccd93805b022032f8ebe514ba5f672466eba334639282616bb3c2f0ab09998037513d1f9e3d6d\n\t// Signature Verified? true\n}\n\n// This example demonstrates verifying a secp256k1 signature against a public\n// key that is first parsed from raw bytes.  The signature is also parsed from\n// raw bytes.\nfunc Example_verifySignature() {\n\t// Decode hex-encoded serialized public key.\n\tpubKeyBytes, err := hex.DecodeString(\"02a673638cb9587cb68ea08dbef685c\" +\n\t\t\"6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5\")\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tpubKey, err := btcec.ParsePubKey(pubKeyBytes)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Decode hex-encoded serialized signature.\n\tsigBytes, err := hex.DecodeString(\"30450220090ebfb3690a0ff115bb1b38b\" +\n\t\t\"8b323a667b7653454f1bccb06d4bbdca42c2079022100ec95778b51e707\" +\n\t\t\"1cb1205f8bde9af6592fc978b0452dafe599481c46d6b2e479\")\n\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tsignature, err := ecdsa.ParseSignature(sigBytes)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Verify the signature for the message using the public key.\n\tmessage := \"test message\"\n\tmessageHash := chainhash.DoubleHashB([]byte(message))\n\tverified := signature.Verify(messageHash, pubKey)\n\tfmt.Println(\"Signature Verified?\", verified)\n\n\t// Output:\n\t// Signature Verified? true\n}\n"
  },
  {
    "path": "btcec/ecdsa/signature.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2021 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ecdsa\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\tsecp_ecdsa \"github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa\"\n)\n\n// Errors returned by canonicalPadding.\nvar (\n\terrNegativeValue          = errors.New(\"value may be interpreted as negative\")\n\terrExcessivelyPaddedValue = errors.New(\"value is excessively padded\")\n)\n\n// Signature is a type representing an ecdsa signature.\ntype Signature = secp_ecdsa.Signature\n\n// NewSignature instantiates a new signature given some r and s values.\nfunc NewSignature(r, s *btcec.ModNScalar) *Signature {\n\treturn secp_ecdsa.NewSignature(r, s)\n}\n\nvar (\n\t// Used in RFC6979 implementation when testing the nonce for correctness\n\tone = big.NewInt(1)\n\n\t// oneInitializer is used to fill a byte slice with byte 0x01.  It is provided\n\t// here to avoid the need to create it multiple times.\n\toneInitializer = []byte{0x01}\n)\n\nconst (\n\t// MinSigLen is the minimum length of a DER encoded signature and is when both R\n\t// and S are 1 byte each.\n\t// 0x30 + <1-byte> + 0x02 + 0x01 + <byte> + 0x2 + 0x01 + <byte>\n\tMinSigLen = 8\n\n\t// MaxSigLen is the maximum length of a DER encoded signature and is\n\t// when both R and S are 33 bytes each.  It is 33 bytes because a\n\t// 256-bit integer requires 32 bytes and an additional leading null byte\n\t// might be required if the high bit is set in the value.\n\t//\n\t// 0x30 + <1-byte> + 0x02 + 0x21 + <33 bytes> + 0x2 + 0x21 + <33 bytes>\n\tMaxSigLen = 72\n)\n\n// canonicalPadding checks whether a big-endian encoded integer could\n// possibly be misinterpreted as a negative number (even though OpenSSL\n// treats all numbers as unsigned), or if there is any unnecessary\n// leading zero padding.\nfunc canonicalPadding(b []byte) error {\n\tswitch {\n\tcase b[0]&0x80 == 0x80:\n\t\treturn errNegativeValue\n\tcase len(b) > 1 && b[0] == 0x00 && b[1]&0x80 != 0x80:\n\t\treturn errExcessivelyPaddedValue\n\tdefault:\n\t\treturn nil\n\t}\n}\n\nfunc parseSig(sigStr []byte, der bool) (*Signature, error) {\n\t// Originally this code used encoding/asn1 in order to parse the\n\t// signature, but a number of problems were found with this approach.\n\t// Despite the fact that signatures are stored as DER, the difference\n\t// between go's idea of a bignum (and that they have sign) doesn't agree\n\t// with the openssl one (where they do not). The above is true as of\n\t// Go 1.1. In the end it was simpler to rewrite the code to explicitly\n\t// understand the format which is this:\n\t// 0x30 <length of whole message> <0x02> <length of R> <R> 0x2\n\t// <length of S> <S>.\n\n\t// The signature must adhere to the minimum and maximum allowed length.\n\ttotalSigLen := len(sigStr)\n\tif totalSigLen < MinSigLen {\n\t\treturn nil, errors.New(\"malformed signature: too short\")\n\t}\n\tif der && totalSigLen > MaxSigLen {\n\t\treturn nil, errors.New(\"malformed signature: too long\")\n\t}\n\n\t// 0x30\n\tindex := 0\n\tif sigStr[index] != 0x30 {\n\t\treturn nil, errors.New(\"malformed signature: no header magic\")\n\t}\n\tindex++\n\t// length of remaining message\n\tsiglen := sigStr[index]\n\tindex++\n\n\t// siglen should be less than the entire message and greater than\n\t// the minimal message size.\n\tif int(siglen+2) > len(sigStr) || int(siglen+2) < MinSigLen {\n\t\treturn nil, errors.New(\"malformed signature: bad length\")\n\t}\n\t// trim the slice we're working on so we only look at what matters.\n\tsigStr = sigStr[:siglen+2]\n\n\t// 0x02\n\tif sigStr[index] != 0x02 {\n\t\treturn nil,\n\t\t\terrors.New(\"malformed signature: no 1st int marker\")\n\t}\n\tindex++\n\n\t// Length of signature R.\n\trLen := int(sigStr[index])\n\t// must be positive, must be able to fit in another 0x2, <len> <s>\n\t// hence the -3. We assume that the length must be at least one byte.\n\tindex++\n\tif rLen <= 0 || rLen > len(sigStr)-index-3 {\n\t\treturn nil, errors.New(\"malformed signature: bogus R length\")\n\t}\n\n\t// Then R itself.\n\trBytes := sigStr[index : index+rLen]\n\tif der {\n\t\tswitch err := canonicalPadding(rBytes); err {\n\t\tcase errNegativeValue:\n\t\t\treturn nil, errors.New(\"signature R is negative\")\n\t\tcase errExcessivelyPaddedValue:\n\t\t\treturn nil, errors.New(\"signature R is excessively padded\")\n\t\t}\n\t}\n\n\t// Strip leading zeroes from R.\n\tfor len(rBytes) > 0 && rBytes[0] == 0x00 {\n\t\trBytes = rBytes[1:]\n\t}\n\n\t// R must be in the range [1, N-1].  Notice the check for the maximum number\n\t// of bytes is required because SetByteSlice truncates as noted in its\n\t// comment so it could otherwise fail to detect the overflow.\n\tvar r btcec.ModNScalar\n\tif len(rBytes) > 32 {\n\t\tstr := \"invalid signature: R is larger than 256 bits\"\n\t\treturn nil, errors.New(str)\n\t}\n\tif overflow := r.SetByteSlice(rBytes); overflow {\n\t\tstr := \"invalid signature: R >= group order\"\n\t\treturn nil, errors.New(str)\n\t}\n\tif r.IsZero() {\n\t\tstr := \"invalid signature: R is 0\"\n\t\treturn nil, errors.New(str)\n\t}\n\tindex += rLen\n\t// 0x02. length already checked in previous if.\n\tif sigStr[index] != 0x02 {\n\t\treturn nil, errors.New(\"malformed signature: no 2nd int marker\")\n\t}\n\tindex++\n\n\t// Length of signature S.\n\tsLen := int(sigStr[index])\n\tindex++\n\t// S should be the rest of the string.\n\tif sLen <= 0 || sLen > len(sigStr)-index {\n\t\treturn nil, errors.New(\"malformed signature: bogus S length\")\n\t}\n\n\t// Then S itself.\n\tsBytes := sigStr[index : index+sLen]\n\tif der {\n\t\tswitch err := canonicalPadding(sBytes); err {\n\t\tcase errNegativeValue:\n\t\t\treturn nil, errors.New(\"signature S is negative\")\n\t\tcase errExcessivelyPaddedValue:\n\t\t\treturn nil, errors.New(\"signature S is excessively padded\")\n\t\t}\n\t}\n\n\t// Strip leading zeroes from S.\n\tfor len(sBytes) > 0 && sBytes[0] == 0x00 {\n\t\tsBytes = sBytes[1:]\n\t}\n\n\t// S must be in the range [1, N-1].  Notice the check for the maximum number\n\t// of bytes is required because SetByteSlice truncates as noted in its\n\t// comment so it could otherwise fail to detect the overflow.\n\tvar s btcec.ModNScalar\n\tif len(sBytes) > 32 {\n\t\tstr := \"invalid signature: S is larger than 256 bits\"\n\t\treturn nil, errors.New(str)\n\t}\n\tif overflow := s.SetByteSlice(sBytes); overflow {\n\t\tstr := \"invalid signature: S >= group order\"\n\t\treturn nil, errors.New(str)\n\t}\n\tif s.IsZero() {\n\t\tstr := \"invalid signature: S is 0\"\n\t\treturn nil, errors.New(str)\n\t}\n\tindex += sLen\n\n\t// sanity check length parsing\n\tif index != len(sigStr) {\n\t\treturn nil, fmt.Errorf(\"malformed signature: bad final length %v != %v\",\n\t\t\tindex, len(sigStr))\n\t}\n\n\treturn NewSignature(&r, &s), nil\n}\n\n// ParseSignature parses a signature in BER format for the curve type `curve'\n// into a Signature type, performing some basic sanity checks.  If parsing\n// according to the more strict DER format is needed, use ParseDERSignature.\nfunc ParseSignature(sigStr []byte) (*Signature, error) {\n\treturn parseSig(sigStr, false)\n}\n\n// ParseDERSignature parses a signature in DER format for the curve type\n// `curve` into a Signature type.  If parsing according to the less strict\n// BER format is needed, use ParseSignature.\nfunc ParseDERSignature(sigStr []byte) (*Signature, error) {\n\treturn parseSig(sigStr, true)\n}\n\n// SignCompact produces a compact signature of the data in hash with the given\n// private key on the given koblitz curve. The isCompressed  parameter should\n// be used to detail if the given signature should reference a compressed\n// public key or not. If successful the bytes of the compact signature will be\n// returned in the format:\n// <(byte of 27+public key solution)+4 if compressed >< padded bytes for signature R><padded bytes for signature S>\n// where the R and S parameters are padde up to the bitlengh of the curve.\nfunc SignCompact(key *btcec.PrivateKey, hash []byte,\n\tisCompressedKey bool) []byte {\n\n\treturn secp_ecdsa.SignCompact(key, hash, isCompressedKey)\n}\n\n// RecoverCompact verifies the compact signature \"signature\" of \"hash\" for the\n// Koblitz curve in \"curve\". If the signature matches then the recovered public\n// key will be returned as well as a boolean if the original key was compressed\n// or not, else an error will be returned.\nfunc RecoverCompact(signature, hash []byte) (*btcec.PublicKey, bool, error) {\n\treturn secp_ecdsa.RecoverCompact(signature, hash)\n}\n\n// Sign generates an ECDSA signature over the secp256k1 curve for the provided\n// hash (which should be the result of hashing a larger message) using the\n// given private key. The produced signature is deterministic (same message and\n// same key yield the same signature) and canonical in accordance with RFC6979\n// and BIP0062.\nfunc Sign(key *btcec.PrivateKey, hash []byte) *Signature {\n\treturn secp_ecdsa.Sign(key, hash)\n}\n"
  },
  {
    "path": "btcec/ecdsa/signature_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2021 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ecdsa\n\nimport (\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n)\n\ntype signatureTest struct {\n\tname    string\n\tsig     []byte\n\tder     bool\n\tisValid bool\n}\n\n// decodeHex decodes the passed hex string and returns the resulting bytes.  It\n// panics if an error occurs.  This is only used in the tests as a helper since\n// the only way it can fail is if there is an error in the test source code.\nfunc decodeHex(hexStr string) []byte {\n\tb, err := hex.DecodeString(hexStr)\n\tif err != nil {\n\t\tpanic(\"invalid hex string in test source: err \" + err.Error() +\n\t\t\t\", hex: \" + hexStr)\n\t}\n\n\treturn b\n}\n\nvar signatureTests = []signatureTest{\n\t// signatures from bitcoin blockchain tx\n\t// 0437cd7f8525ceed2324359c2d0ba26006d92d85\n\t{\n\t\tname: \"valid signature.\",\n\t\tsig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: true,\n\t},\n\t{\n\t\tname:    \"empty.\",\n\t\tsig:     []byte{},\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"bad magic.\",\n\t\tsig: []byte{0x31, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"bad 1st int marker magic.\",\n\t\tsig: []byte{0x30, 0x44, 0x03, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"bad 2nd int marker.\",\n\t\tsig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x03, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"short len\",\n\t\tsig: []byte{0x30, 0x43, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname:    \"invalid message length\",\n\t\tsig:     []byte{0x30, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00},\n\t\tder:     false,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"long len\",\n\t\tsig: []byte{0x30, 0x45, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"long X\",\n\t\tsig: []byte{0x30, 0x44, 0x02, 0x42, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"long Y\",\n\t\tsig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x21, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"short Y\",\n\t\tsig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x19, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"trailing crap.\",\n\t\tsig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09, 0x01,\n\t\t},\n\t\tder: true,\n\n\t\t// This test is now passing (used to be failing) because there\n\t\t// are signatures in the blockchain that have trailing zero\n\t\t// bytes before the hashtype. So ParseSignature was fixed to\n\t\t// permit buffers with trailing nonsense after the actual\n\t\t// signature.\n\t\tisValid: true,\n\t},\n\t{\n\t\tname: \"X == N \",\n\t\tsig: []byte{0x30, 0x44, 0x02, 0x20, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48,\n\t\t\t0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41,\n\t\t\t0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"X == N \",\n\t\tsig: []byte{0x30, 0x44, 0x02, 0x20, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48,\n\t\t\t0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41,\n\t\t\t0x42, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     false,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"Y == N\",\n\t\tsig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B,\n\t\t\t0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"Y > N\",\n\t\tsig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B,\n\t\t\t0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x42,\n\t\t},\n\t\tder:     false,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"0 len X.\",\n\t\tsig: []byte{0x30, 0x24, 0x02, 0x00, 0x02, 0x20, 0x18, 0x15,\n\t\t\t0x22, 0xec, 0x8e, 0xca, 0x07, 0xde, 0x48, 0x60, 0xa4,\n\t\t\t0xac, 0xdd, 0x12, 0x90, 0x9d, 0x83, 0x1c, 0xc5, 0x6c,\n\t\t\t0xbb, 0xac, 0x46, 0x22, 0x08, 0x22, 0x21, 0xa8, 0x76,\n\t\t\t0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"0 len Y.\",\n\t\tsig: []byte{0x30, 0x24, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x00,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"extra R padding.\",\n\t\tsig: []byte{0x30, 0x45, 0x02, 0x21, 0x00, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"extra S padding.\",\n\t\tsig: []byte{0x30, 0x45, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x21, 0x00, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n\t// Standard checks (in BER format, without checking for 'canonical' DER\n\t// signatures) don't test for negative numbers here because there isn't\n\t// a way that is the same between openssl and go that will mark a number\n\t// as negative. The Go ASN.1 parser marks numbers as negative when\n\t// openssl does not (it doesn't handle negative numbers that I can tell\n\t// at all. When not parsing DER signatures, which is done by by bitcoind\n\t// when accepting transactions into its mempool, we otherwise only check\n\t// for the coordinates being zero.\n\t{\n\t\tname: \"X == 0\",\n\t\tsig: []byte{0x30, 0x25, 0x02, 0x01, 0x00, 0x02, 0x20, 0x18,\n\t\t\t0x15, 0x22, 0xec, 0x8e, 0xca, 0x07, 0xde, 0x48, 0x60,\n\t\t\t0xa4, 0xac, 0xdd, 0x12, 0x90, 0x9d, 0x83, 0x1c, 0xc5,\n\t\t\t0x6c, 0xbb, 0xac, 0x46, 0x22, 0x08, 0x22, 0x21, 0xa8,\n\t\t\t0x76, 0x8d, 0x1d, 0x09,\n\t\t},\n\t\tder:     false,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"Y == 0.\",\n\t\tsig: []byte{0x30, 0x25, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x01, 0x00,\n\t\t},\n\t\tder:     false,\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"Long signature.\",\n\t\tsig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,\n\t\t\t0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,\n\t\t\t0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,\n\t\t\t0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,\n\t\t\t0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,\n\t\t\t0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,\n\t\t\t0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09, 0x91,\n\t\t\t0x17, 0x90, 0xda, 0x42, 0xca, 0xaf, 0x19, 0x7d, 0xb4,\n\t\t},\n\t\tder:     true,\n\t\tisValid: false,\n\t},\n}\n\nfunc TestSignatures(t *testing.T) {\n\tfor _, test := range signatureTests {\n\t\tvar err error\n\t\tif test.der {\n\t\t\t_, err = ParseDERSignature(test.sig)\n\t\t} else {\n\t\t\t_, err = ParseSignature(test.sig)\n\t\t}\n\t\tif err != nil {\n\t\t\tif test.isValid {\n\t\t\t\tt.Errorf(\"%s signature failed when shouldn't %v\",\n\t\t\t\t\ttest.name, err)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif !test.isValid {\n\t\t\tt.Errorf(\"%s counted as valid when it should fail\",\n\t\t\t\ttest.name)\n\t\t}\n\t}\n}\n\n// TestSignatureSerialize ensures that serializing signatures works as expected.\nfunc TestSignatureSerialize(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tecsig    *Signature\n\t\texpected []byte\n\t}{\n\t\t// signature from bitcoin blockchain tx\n\t\t// 0437cd7f8525ceed2324359c2d0ba26006d92d85\n\t\t{\n\t\t\t\"valid 1 - r and s most significant bits are zero\",\n\t\t\tNewSignature(\n\t\t\t\thexToModNScalar(\"4e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd41\"),\n\t\t\t\thexToModNScalar(\"181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d09\"),\n\t\t\t),\n\t\t\t[]byte{\n\t\t\t\t0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,\n\t\t\t\t0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3,\n\t\t\t\t0xa1, 0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32,\n\t\t\t\t0xe9, 0xd6, 0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab,\n\t\t\t\t0x5f, 0xb8, 0xcd, 0x41, 0x02, 0x20, 0x18, 0x15,\n\t\t\t\t0x22, 0xec, 0x8e, 0xca, 0x07, 0xde, 0x48, 0x60,\n\t\t\t\t0xa4, 0xac, 0xdd, 0x12, 0x90, 0x9d, 0x83, 0x1c,\n\t\t\t\t0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22, 0x08, 0x22,\n\t\t\t\t0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,\n\t\t\t},\n\t\t},\n\t\t// signature from bitcoin blockchain tx\n\t\t// cb00f8a0573b18faa8c4f467b049f5d202bf1101d9ef2633bc611be70376a4b4\n\t\t{\n\t\t\t\"valid 2 - r most significant bit is one\",\n\t\t\tNewSignature(\n\t\t\t\thexToModNScalar(\"0082235e21a2300022738dabb8e1bbd9d19cfb1e7ab8c30a23b0afbb8d178abcf3\"),\n\t\t\t\thexToModNScalar(\"24bf68e256c534ddfaf966bf908deb944305596f7bdcc38d69acad7f9c868724\"),\n\t\t\t),\n\t\t\t[]byte{\n\t\t\t\t0x30, 0x44, 0x02, 0x20, 0x00, 0x82, 0x23, 0x5e,\n\t\t\t\t0x21, 0xa2, 0x30, 0x00, 0x22, 0x73, 0x8d, 0xab,\n\t\t\t\t0xb8, 0xe1, 0xbb, 0xd9, 0xd1, 0x9c, 0xfb, 0x1e,\n\t\t\t\t0x7a, 0xb8, 0xc3, 0x0a, 0x23, 0xb0, 0xaf, 0xbb,\n\t\t\t\t0x8d, 0x17, 0x8a, 0xbc, 0x02, 0x20, 0x24, 0xbf,\n\t\t\t\t0x68, 0xe2, 0x56, 0xc5, 0x34, 0xdd, 0xfa, 0xf9,\n\t\t\t\t0x66, 0xbf, 0x90, 0x8d, 0xeb, 0x94, 0x43, 0x05,\n\t\t\t\t0x59, 0x6f, 0x7b, 0xdc, 0xc3, 0x8d, 0x69, 0xac,\n\t\t\t\t0xad, 0x7f, 0x9c, 0x86, 0x87, 0x24,\n\t\t\t},\n\t\t},\n\t\t// signature from bitcoin blockchain tx\n\t\t// fda204502a3345e08afd6af27377c052e77f1fefeaeb31bdd45f1e1237ca5470\n\t\t{\n\t\t\t\"valid 3 - s most significant bit is one\",\n\t\t\tNewSignature(\n\t\t\t\thexToModNScalar(\"1cadddc2838598fee7dc35a12b340c6bde8b389f7bfd19a1252a17c4b5ed2d71\"),\n\t\t\t\thexToModNScalar(\"c1a251bbecb14b058a8bd77f65de87e51c47e95904f4c0e9d52eddc21c1415ac\"),\n\t\t\t),\n\t\t\t[]byte{\n\t\t\t\t0x30, 0x44, 0x2, 0x20, 0x1c, 0xad, 0xdd, 0xc2,\n\t\t\t\t0x83, 0x85, 0x98, 0xfe, 0xe7, 0xdc, 0x35, 0xa1,\n\t\t\t\t0x2b, 0x34, 0xc, 0x6b, 0xde, 0x8b, 0x38, 0x9f,\n\t\t\t\t0x7b, 0xfd, 0x19, 0xa1, 0x25, 0x2a, 0x17, 0xc4,\n\t\t\t\t0xb5, 0xed, 0x2d, 0x71, 0x2, 0x20, 0x3e, 0x5d,\n\t\t\t\t0xae, 0x44, 0x13, 0x4e, 0xb4, 0xfa, 0x75, 0x74,\n\t\t\t\t0x28, 0x80, 0x9a, 0x21, 0x78, 0x19, 0x9e, 0x66,\n\t\t\t\t0xf3, 0x8d, 0xaa, 0x53, 0xdf, 0x51, 0xea, 0xa3,\n\t\t\t\t0x80, 0xca, 0xb4, 0x22, 0x2b, 0x95,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"valid 4 - s is bigger than half order\",\n\t\t\tNewSignature(\n\t\t\t\thexToModNScalar(\"a196ed0e7ebcbe7b63fe1d8eecbdbde03a67ceba4fc8f6482bdcb9606a911404\"),\n\t\t\t\thexToModNScalar(\"971729c7fa944b465b35250c6570a2f31acbb14b13d1565fab7330dcb2b3dfb1\"),\n\t\t\t),\n\t\t\t[]byte{\n\t\t\t\t0x30, 0x45, 0x02, 0x21, 0x00, 0xa1, 0x96, 0xed,\n\t\t\t\t0xe, 0x7e, 0xbc, 0xbe, 0x7b, 0x63, 0xfe, 0x1d,\n\t\t\t\t0x8e, 0xec, 0xbd, 0xbd, 0xe0, 0x3a, 0x67, 0xce,\n\t\t\t\t0xba, 0x4f, 0xc8, 0xf6, 0x48, 0x2b, 0xdc, 0xb9,\n\t\t\t\t0x60, 0x6a, 0x91, 0x14, 0x04, 0x02, 0x20, 0x68,\n\t\t\t\t0xe8, 0xd6, 0x38, 0x05, 0x6b, 0xb4, 0xb9, 0xa4,\n\t\t\t\t0xca, 0xda, 0xf3, 0x9a, 0x8f, 0x5d, 0x0b, 0x9f,\n\t\t\t\t0xe3, 0x2b, 0x9b, 0x9b, 0x77, 0x49, 0xdc, 0x14,\n\t\t\t\t0x5f, 0x2d, 0xb0, 0x1d, 0x82, 0x61, 0x90,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"zero signature\",\n\t\t\tNewSignature(&btcec.ModNScalar{}, &btcec.ModNScalar{}),\n\t\t\t[]byte{0x30, 0x06, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00},\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\tresult := test.ecsig.Serialize()\n\t\tif !bytes.Equal(result, test.expected) {\n\t\t\tt.Errorf(\"Serialize #%d (%s) unexpected result:\\n\"+\n\t\t\t\t\"got:  %x\\nwant: %x\", i, test.name, result,\n\t\t\t\ttest.expected)\n\t\t}\n\t}\n}\n\nfunc testSignCompact(t *testing.T, tag string, curve *btcec.KoblitzCurve,\n\tdata []byte, isCompressed bool) {\n\tpriv, _ := btcec.NewPrivateKey()\n\n\thashed := []byte(\"testing\")\n\tsig := SignCompact(priv, hashed, isCompressed)\n\n\tpk, wasCompressed, err := RecoverCompact(sig, hashed)\n\tif err != nil {\n\t\tt.Errorf(\"%s: error recovering: %s\", tag, err)\n\t\treturn\n\t}\n\tif pk.X().Cmp(priv.PubKey().X()) != 0 || pk.Y().Cmp(priv.PubKey().Y()) != 0 {\n\t\tt.Errorf(\"%s: recovered pubkey doesn't match original \"+\n\t\t\t\"(%v,%v) vs (%v,%v) \", tag, pk.X(), pk.Y(),\n\t\t\tpriv.PubKey().X(), priv.PubKey().Y())\n\t\treturn\n\t}\n\tif wasCompressed != isCompressed {\n\t\tt.Errorf(\"%s: recovered pubkey doesn't match compressed state \"+\n\t\t\t\"(%v vs %v)\", tag, isCompressed, wasCompressed)\n\t\treturn\n\t}\n\n\t// If we change the compressed bit we should get the same key back,\n\t// but the compressed flag should be reversed.\n\tif isCompressed {\n\t\tsig[0] -= 4\n\t} else {\n\t\tsig[0] += 4\n\t}\n\n\tpk, wasCompressed, err = RecoverCompact(sig, hashed)\n\tif err != nil {\n\t\tt.Errorf(\"%s: error recovering (2): %s\", tag, err)\n\t\treturn\n\t}\n\tif pk.X().Cmp(priv.PubKey().X()) != 0 || pk.Y().Cmp(priv.PubKey().Y()) != 0 {\n\t\tt.Errorf(\"%s: recovered pubkey (2) doesn't match original \"+\n\t\t\t\"(%v,%v) vs (%v,%v) \", tag, pk.X(), pk.Y(),\n\t\t\tpriv.PubKey().X(), priv.PubKey().Y())\n\t\treturn\n\t}\n\tif wasCompressed == isCompressed {\n\t\tt.Errorf(\"%s: recovered pubkey doesn't match reversed \"+\n\t\t\t\"compressed state (%v vs %v)\", tag, isCompressed,\n\t\t\twasCompressed)\n\t\treturn\n\t}\n}\n\nfunc TestSignCompact(t *testing.T) {\n\tfor i := 0; i < 256; i++ {\n\t\tname := fmt.Sprintf(\"test %d\", i)\n\t\tdata := make([]byte, 32)\n\t\t_, err := rand.Read(data)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"failed to read random data for %s\", name)\n\t\t\tcontinue\n\t\t}\n\t\tcompressed := i%2 != 0\n\t\ttestSignCompact(t, name, btcec.S256(), data, compressed)\n\t}\n}\n\n// recoveryTests assert basic tests for public key recovery from signatures.\n// The cases are borrowed from github.com/fjl/btcec-issue.\nvar recoveryTests = []struct {\n\tmsg string\n\tsig string\n\tpub string\n\terr error\n}{\n\t{\n\t\t// Valid curve point recovered.\n\t\tmsg: \"ce0677bb30baa8cf067c88db9811f4333d131bf8bcf12fe7065d211dce971008\",\n\t\tsig: \"0190f27b8b488db00b00606796d2987f6a5f59ae62ea05effe84fef5b8b0e549984a691139ad57a3f0b906637673aa2f63d1f55cb1a69199d4009eea23ceaddc93\",\n\t\tpub: \"04E32DF42865E97135ACFB65F3BAE71BDC86F4D49150AD6A440B6F15878109880A0A2B2667F7E725CEEA70C673093BF67663E0312623C8E091B13CF2C0F11EF652\",\n\t},\n\t{\n\t\t// Invalid curve point recovered.\n\t\tmsg: \"00c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c\",\n\t\tsig: \"0100b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f00b940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549\",\n\t\terr: fmt.Errorf(\"signature is not for a valid curve point\"),\n\t},\n\t{\n\t\t// Point at infinity recovered\n\t\tmsg: \"6b8d2c81b11b2d699528dde488dbdf2f94293d0d33c32e347f255fa4a6c1f0a9\",\n\t\tsig: \"0079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817986b8d2c81b11b2d699528dde488dbdf2f94293d0d33c32e347f255fa4a6c1f0a9\",\n\t\terr: fmt.Errorf(\"recovered pubkey is the point at infinity\"),\n\t},\n\t{\n\t\t// Low R and S values.\n\t\tmsg: \"ba09edc1275a285fb27bfe82c4eea240a907a0dbaf9e55764b8f318c37d5974f\",\n\t\tsig: \"00000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000004\",\n\t\tpub: \"04A7640409AA2083FDAD38B2D8DE1263B2251799591D840653FB02DBBA503D7745FCB83D80E08A1E02896BE691EA6AFFB8A35939A646F1FC79052A744B1C82EDC3\",\n\t},\n\t{\n\t\t// Zero R value\n\t\t//\n\t\t// Test case contributed by Ethereum Swarm: GH-1651\n\t\tmsg: \"3060d2c77c1e192d62ad712fb400e04e6f779914a6876328ff3b213fa85d2012\",\n\t\tsig: \"65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037a3\",\n\t\terr: fmt.Errorf(\"invalid compact signature recovery code\"),\n\t},\n\t{\n\t\t// Zero R value\n\t\t//\n\t\t// Test case contributed by Ethereum Swarm: GH-1651\n\t\tmsg: \"2bcebac60d8a78e520ae81c2ad586792df495ed429bd730dcd897b301932d054\",\n\t\tsig: \"060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c\",\n\t\terr: fmt.Errorf(\"signature R is 0\"),\n\t},\n\t{\n\t\t// R = N (curve order of secp256k1)\n\t\tmsg: \"2bcebac60d8a78e520ae81c2ad586792df495ed429bd730dcd897b301932d054\",\n\t\tsig: \"65fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414100000000000000000000000000000000000000000000000000000000000037a3\",\n\t\terr: fmt.Errorf(\"invalid compact signature recovery code\"),\n\t},\n\t{\n\t\t// Zero S value\n\t\tmsg: \"ce0677bb30baa8cf067c88db9811f4333d131bf8bcf12fe7065d211dce971008\",\n\t\tsig: \"0190f27b8b488db00b00606796d2987f6a5f59ae62ea05effe84fef5b8b0e549980000000000000000000000000000000000000000000000000000000000000000\",\n\t\terr: fmt.Errorf(\"signature S is 0\"),\n\t},\n\t{\n\t\t// S = N (curve order of secp256k1)\n\t\tmsg: \"ce0677bb30baa8cf067c88db9811f4333d131bf8bcf12fe7065d211dce971008\",\n\t\tsig: \"0190f27b8b488db00b00606796d2987f6a5f59ae62ea05effe84fef5b8b0e54998fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\",\n\t\terr: fmt.Errorf(\"signature S is >= curve order\"),\n\t},\n}\n\nfunc TestRecoverCompact(t *testing.T) {\n\tfor i, test := range recoveryTests {\n\t\tmsg := decodeHex(test.msg)\n\t\tsig := decodeHex(test.sig)\n\n\t\t// Magic DER constant.\n\t\tsig[0] += 27\n\n\t\tpub, _, err := RecoverCompact(sig, msg)\n\n\t\t// Verify that returned error matches as expected.\n\t\tif !reflect.DeepEqual(test.err, err) {\n\t\t\tt.Errorf(\"unexpected error returned from pubkey \"+\n\t\t\t\t\"recovery #%d: wanted %v, got %v\",\n\t\t\t\ti, test.err, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// If check succeeded because a proper error was returned, we\n\t\t// ignore the returned pubkey.\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Otherwise, ensure the correct public key was recovered.\n\t\texPub, _ := btcec.ParsePubKey(decodeHex(test.pub))\n\t\tif !exPub.IsEqual(pub) {\n\t\t\tt.Errorf(\"unexpected recovered public key #%d: \"+\n\t\t\t\t\"want %v, got %v\", i, exPub, pub)\n\t\t}\n\t}\n}\n\nfunc TestRFC6979(t *testing.T) {\n\t// Test vectors matching Trezor and CoreBitcoin implementations.\n\t// - https://github.com/trezor/trezor-crypto/blob/9fea8f8ab377dc514e40c6fd1f7c89a74c1d8dc6/tests.c#L432-L453\n\t// - https://github.com/oleganza/CoreBitcoin/blob/e93dd71207861b5bf044415db5fa72405e7d8fbc/CoreBitcoin/BTCKey%2BTests.m#L23-L49\n\ttests := []struct {\n\t\tkey       string\n\t\tmsg       string\n\t\tnonce     string\n\t\tsignature string\n\t}{\n\t\t{\n\t\t\t\"cca9fbcc1b41e5a95d369eaa6ddcff73b61a4efaa279cfc6567e8daa39cbaf50\",\n\t\t\t\"sample\",\n\t\t\t\"2df40ca70e639d89528a6b670d9d48d9165fdc0febc0974056bdce192b8e16a3\",\n\t\t\t\"3045022100af340daf02cc15c8d5d08d7735dfe6b98a474ed373bdb5fbecf7571be52b384202205009fb27f37034a9b24b707b7c6b79ca23ddef9e25f7282e8a797efe53a8f124\",\n\t\t},\n\t\t{\n\t\t\t// This signature hits the case when S is higher than halforder.\n\t\t\t// If S is not canonicalized (lowered by halforder), this test will fail.\n\t\t\t\"0000000000000000000000000000000000000000000000000000000000000001\",\n\t\t\t\"Satoshi Nakamoto\",\n\t\t\t\"8f8a276c19f4149656b280621e358cce24f5f52542772691ee69063b74f15d15\",\n\t\t\t\"3045022100934b1ea10a4b3c1757e2b0c017d0b6143ce3c9a7e6a4a49860d7a6ab210ee3d802202442ce9d2b916064108014783e923ec36b49743e2ffa1c4496f01a512aafd9e5\",\n\t\t},\n\t\t{\n\t\t\t\"fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140\",\n\t\t\t\"Satoshi Nakamoto\",\n\t\t\t\"33a19b60e25fb6f4435af53a3d42d493644827367e6453928554f43e49aa6f90\",\n\t\t\t\"3045022100fd567d121db66e382991534ada77a6bd3106f0a1098c231e47993447cd6af2d002206b39cd0eb1bc8603e159ef5c20a5c8ad685a45b06ce9bebed3f153d10d93bed5\",\n\t\t},\n\t\t{\n\t\t\t\"f8b8af8ce3c7cca5e300d33939540c10d45ce001b8f252bfbc57ba0342904181\",\n\t\t\t\"Alan Turing\",\n\t\t\t\"525a82b70e67874398067543fd84c83d30c175fdc45fdeee082fe13b1d7cfdf1\",\n\t\t\t\"304402207063ae83e7f62bbb171798131b4a0564b956930092b33b07b395615d9ec7e15c022058dfcc1e00a35e1572f366ffe34ba0fc47db1e7189759b9fb233c5b05ab388ea\",\n\t\t},\n\t\t{\n\t\t\t\"0000000000000000000000000000000000000000000000000000000000000001\",\n\t\t\t\"All those moments will be lost in time, like tears in rain. Time to die...\",\n\t\t\t\"38aa22d72376b4dbc472e06c3ba403ee0a394da63fc58d88686c611aba98d6b3\",\n\t\t\t\"30450221008600dbd41e348fe5c9465ab92d23e3db8b98b873beecd930736488696438cb6b0220547fe64427496db33bf66019dacbf0039c04199abb0122918601db38a72cfc21\",\n\t\t},\n\t\t{\n\t\t\t\"e91671c46231f833a6406ccbea0e3e392c76c167bac1cb013f6f1013980455c2\",\n\t\t\t\"There is a computer disease that anybody who works with computers knows about. It's a very serious disease and it interferes completely with the work. The trouble with computers is that you 'play' with them!\",\n\t\t\t\"1f4b84c23a86a221d233f2521be018d9318639d5b8bbd6374a8a59232d16ad3d\",\n\t\t\t\"3045022100b552edd27580141f3b2a5463048cb7cd3e047b97c9f98076c32dbdf85a68718b0220279fa72dd19bfae05577e06c7c0c1900c371fcd5893f7e1d56a37d30174671f6\",\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\tprivKey, _ := btcec.PrivKeyFromBytes(decodeHex(test.key))\n\t\thash := sha256.Sum256([]byte(test.msg))\n\n\t\t// Ensure deterministically generated nonce is the expected value.\n\t\tgotNonce := btcec.NonceRFC6979(privKey.Serialize(), hash[:], nil, nil, 0).Bytes()\n\t\twantNonce := decodeHex(test.nonce)\n\t\tif !bytes.Equal(gotNonce[:], wantNonce) {\n\t\t\tt.Errorf(\"NonceRFC6979 #%d (%s): Nonce is incorrect: \"+\n\t\t\t\t\"%x (expected %x)\", i, test.msg, gotNonce,\n\t\t\t\twantNonce)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure deterministically generated signature is the expected value.\n\t\tgotSig := Sign(privKey, hash[:])\n\n\t\tgotSigBytes := gotSig.Serialize()\n\t\twantSigBytes := decodeHex(test.signature)\n\t\tif !bytes.Equal(gotSigBytes, wantSigBytes) {\n\t\t\tt.Errorf(\"Sign #%d (%s): mismatched signature: %x \"+\n\t\t\t\t\"(expected %x)\", i, test.msg, gotSigBytes,\n\t\t\t\twantSigBytes)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc TestSignatureIsEqual(t *testing.T) {\n\tsig1 := NewSignature(\n\t\thexToModNScalar(\"0082235e21a2300022738dabb8e1bbd9d19cfb1e7ab8c30a23b0afbb8d178abcf3\"),\n\t\thexToModNScalar(\"24bf68e256c534ddfaf966bf908deb944305596f7bdcc38d69acad7f9c868724\"),\n\t)\n\tsig2 := NewSignature(\n\t\thexToModNScalar(\"4e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd41\"),\n\t\thexToModNScalar(\"181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d09\"),\n\t)\n\n\tif !sig1.IsEqual(sig1) {\n\t\tt.Fatalf(\"value of IsEqual is incorrect, %v is \"+\n\t\t\t\"equal to %v\", sig1, sig1)\n\t}\n\n\tif sig1.IsEqual(sig2) {\n\t\tt.Fatalf(\"value of IsEqual is incorrect, %v is not \"+\n\t\t\t\"equal to %v\", sig1, sig2)\n\t}\n}\n\nfunc testSignAndVerify(t *testing.T, c *btcec.KoblitzCurve, tag string) {\n\tpriv, _ := btcec.NewPrivateKey()\n\tpub := priv.PubKey()\n\n\thashed := []byte(\"testing\")\n\tsig := Sign(priv, hashed)\n\n\tif !sig.Verify(hashed, pub) {\n\t\tt.Errorf(\"%s: Verify failed\", tag)\n\t}\n\n\thashed[0] ^= 0xff\n\tif sig.Verify(hashed, pub) {\n\t\tt.Errorf(\"%s: Verify always works!\", tag)\n\t}\n}\n\nfunc TestSignAndVerify(t *testing.T) {\n\ttestSignAndVerify(t, btcec.S256(), \"S256\")\n}\n\nfunc TestPrivKeys(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tkey  []byte\n\t}{\n\t\t{\n\t\t\tname: \"check curve\",\n\t\t\tkey: []byte{\n\t\t\t\t0xea, 0xf0, 0x2c, 0xa3, 0x48, 0xc5, 0x24, 0xe6,\n\t\t\t\t0x39, 0x26, 0x55, 0xba, 0x4d, 0x29, 0x60, 0x3c,\n\t\t\t\t0xd1, 0xa7, 0x34, 0x7d, 0x9d, 0x65, 0xcf, 0xe9,\n\t\t\t\t0x3c, 0xe1, 0xeb, 0xff, 0xdc, 0xa2, 0x26, 0x94,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tpriv, pub := btcec.PrivKeyFromBytes(test.key)\n\n\t\t_, err := btcec.ParsePubKey(pub.SerializeUncompressed())\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%s privkey: %v\", test.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\thash := []byte{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9}\n\t\tsig := Sign(priv, hash)\n\n\t\tif !sig.Verify(hash, pub) {\n\t\t\tt.Errorf(\"%s could not verify: %v\", test.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tserializedKey := priv.Serialize()\n\t\tif !bytes.Equal(serializedKey, test.key) {\n\t\t\tt.Errorf(\"%s unexpected serialized bytes - got: %x, \"+\n\t\t\t\t\"want: %x\", test.name, serializedKey, test.key)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcec/ellswift/ellswift.go",
    "content": "package ellswift\n\nimport (\n\t\"crypto/rand\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nvar (\n\t// c is sqrt(-3) (mod p)\n\tc btcec.FieldVal\n\n\tcBytes = [32]byte{\n\t\t0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf,\n\t\t0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c,\n\t\t0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4,\n\t\t0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x52,\n\t}\n\n\tellswiftTag = []byte(\"bip324_ellswift_xonly_ecdh\")\n\n\t// ErrPointNotOnCurve is returned when we're unable to find a point on the\n\t// curve.\n\tErrPointNotOnCurve = fmt.Errorf(\"point does not exist on secp256k1 curve\")\n)\n\nfunc init() {\n\tc.SetByteSlice(cBytes[:])\n}\n\n// XSwiftEC() takes two field elements (u, t) and gives us an x-coordinate that\n// is on the secp256k1 curve. This is used to take an ElligatorSwift-encoded\n// public key (u, t) and return the point on the curve it maps to. This\n// function returns an error if there is no valid x-coordinate.\n//\n// TODO: Rewrite these to avoid new(btcec.FieldVal).Add(...) usage?\n// NOTE: u, t MUST be normalized. The result x is normalized.\nfunc XSwiftEC(u, t *btcec.FieldVal) (*btcec.FieldVal, error) {\n\t// 1. Let u' = u if u != 0, else = 1\n\tif u.IsZero() {\n\t\tu.SetInt(1)\n\t}\n\n\t// 2. Let t' = t if t != 0, else 1\n\tif t.IsZero() {\n\t\tt.SetInt(1)\n\t}\n\n\t// 3. Let t'' = t' if g(u') != -(t'^2); t'' = 2t' otherwise\n\t// g(x) = x^3 + ax + b, a = 0, b = 7\n\n\t// Calculate g(u').\n\tgu := new(btcec.FieldVal).SquareVal(u).Mul(u).AddInt(7).Normalize()\n\n\t// Calculate the right-hand side of the equation (-t'^2)\n\trhs := new(btcec.FieldVal).SquareVal(t).Negate(1).Normalize()\n\n\tif gu.Equals(rhs) {\n\t\t// t'' = 2t'\n\t\tt = t.Add(t)\n\t}\n\n\t// 4. X = (u'^3 + b - t''^2) / (2t'')\n\ttSquared := new(btcec.FieldVal).SquareVal(t).Negate(1)\n\txNum := new(btcec.FieldVal).SquareVal(u).Mul(u).AddInt(7).Add(tSquared)\n\txDenom := new(btcec.FieldVal).Add2(t, t).Inverse()\n\tx := xNum.Mul(xDenom)\n\n\t// 5. Y = (X+t'') / (u' * c)\n\tyNum := new(btcec.FieldVal).Add2(x, t)\n\tyDenom := new(btcec.FieldVal).Mul2(u, &c).Inverse()\n\ty := yNum.Mul(yDenom)\n\n\t// 6. Return the first x in (u'+4Y^2, -X/2Y - u'/2, X/2Y - u'/2) for which\n\t//    x^3 + b is square.\n\n\t// 6a. Calculate u' +4Y^2 and determine if x^3+7 is square.\n\tySqr := new(btcec.FieldVal).Add(y).Mul(y)\n\tquadYSqr := new(btcec.FieldVal).Add(ySqr).MulInt(4)\n\tfirstX := new(btcec.FieldVal).Add(u).Add(quadYSqr)\n\n\t// Determine if firstX is on the curve.\n\tif isXOnCurve(firstX) {\n\t\treturn firstX.Normalize(), nil\n\t}\n\n\t// 6b. Calculate -X/2Y - u'/2 and determine if x^3 + 7 is square\n\tdoubleYInv := new(btcec.FieldVal).Add(y).Add(y).Inverse()\n\txDivDoubleYInv := new(btcec.FieldVal).Add(x).Mul(doubleYInv)\n\tnegXDivDoubleYInv := new(btcec.FieldVal).Add(xDivDoubleYInv).Negate(1)\n\tinvTwo := new(btcec.FieldVal).AddInt(2).Inverse()\n\tnegUDivTwo := new(btcec.FieldVal).Add(u).Mul(invTwo).Negate(1)\n\tsecondX := new(btcec.FieldVal).Add(negXDivDoubleYInv).Add(negUDivTwo)\n\n\t// Determine if secondX is on the curve.\n\tif isXOnCurve(secondX) {\n\t\treturn secondX.Normalize(), nil\n\t}\n\n\t// 6c. Calculate X/2Y -u'/2 and determine if x^3 + 7 is square\n\tthirdX := new(btcec.FieldVal).Add(xDivDoubleYInv).Add(negUDivTwo)\n\n\t// Determine if thirdX is on the curve.\n\tif isXOnCurve(thirdX) {\n\t\treturn thirdX.Normalize(), nil\n\t}\n\n\t// Should have found a square above.\n\treturn nil, fmt.Errorf(\"no calculated x-values were square\")\n}\n\n// isXOnCurve returns true if there is a corresponding y-value for the passed\n// x-coordinate.\nfunc isXOnCurve(x *btcec.FieldVal) bool {\n\ty := new(btcec.FieldVal).Add(x).Square().Mul(x).AddInt(7)\n\treturn new(btcec.FieldVal).SquareRootVal(y)\n}\n\n// XSwiftECInv takes two field elements (u, x) (where x is on the curve) and\n// returns a field element t. This is used to take a random field element u and\n// a point on the curve and return a field element t where (u, t) forms the\n// ElligatorSwift encoding.\n//\n// TODO: Rewrite these to avoid new(btcec.FieldVal).Add(...) usage?\n// NOTE: u, x MUST be normalized. The result `t` is normalized.\nfunc XSwiftECInv(u, x *btcec.FieldVal, caseNum int) *btcec.FieldVal {\n\tv := new(btcec.FieldVal)\n\ts := new(btcec.FieldVal)\n\ttwoInv := new(btcec.FieldVal).AddInt(2).Inverse()\n\n\tif caseNum&2 == 0 {\n\t\t// If lift_x(-x-u) succeeds, return None\n\t\t_, found := liftX(new(btcec.FieldVal).Add(x).Add(u).Negate(2))\n\t\tif found {\n\t\t\treturn nil\n\t\t}\n\n\t\t// Let v = x\n\t\tv.Add(x)\n\n\t\t// Let s = -(u^3+7)/(u^2 + uv + v^2)\n\t\tuSqr := new(btcec.FieldVal).Add(u).Square()\n\t\tvSqr := new(btcec.FieldVal).Add(v).Square()\n\t\tsDenom := new(btcec.FieldVal).Add(u).Mul(v).Add(uSqr).Add(vSqr)\n\t\tsNum := new(btcec.FieldVal).Add(uSqr).Mul(u).AddInt(7)\n\n\t\ts = sDenom.Inverse().Mul(sNum).Negate(1)\n\t} else {\n\t\t// Let s = x - u\n\t\tnegU := new(btcec.FieldVal).Add(u).Negate(1)\n\t\ts.Add(x).Add(negU).Normalize()\n\n\t\t// If s = 0, return None\n\t\tif s.IsZero() {\n\t\t\treturn nil\n\t\t}\n\n\t\t// Let r be the square root of -s(4(u^3 + 7) + 3u^2s)\n\t\tuSqr := new(btcec.FieldVal).Add(u).Square()\n\t\tlhs := new(btcec.FieldVal).Add(uSqr).Mul(u).AddInt(7).MulInt(4)\n\t\trhs := new(btcec.FieldVal).Add(uSqr).MulInt(3).Mul(s)\n\n\t\t// Add the two terms together and multiply by -s.\n\t\tlhs.Add(rhs).Normalize().Mul(s).Negate(1)\n\n\t\tr := new(btcec.FieldVal)\n\t\tif !r.SquareRootVal(lhs) {\n\t\t\t// If no square root was found, return None.\n\t\t\treturn nil\n\t\t}\n\n\t\tif caseNum&1 == 1 && r.Normalize().IsZero() {\n\t\t\t// If case & 1 = 1 and r = 0, return None.\n\t\t\treturn nil\n\t\t}\n\n\t\t// Let v = (r/s - u)/2\n\t\tsInv := new(btcec.FieldVal).Add(s).Inverse()\n\t\tuNeg := new(btcec.FieldVal).Add(u).Negate(1)\n\n\t\tv.Add(r).Mul(sInv).Add(uNeg).Mul(twoInv)\n\t}\n\n\tw := new(btcec.FieldVal)\n\n\tif !w.SquareRootVal(s) {\n\t\t// If no square root was found, return None.\n\t\treturn nil\n\t}\n\n\tswitch caseNum & 5 {\n\tcase 0:\n\t\t// If case & 5 = 0, return -w(u(1-c)/2 + v)\n\t\toneMinusC := new(btcec.FieldVal).Add(&c).Negate(1).AddInt(1)\n\t\tt := new(btcec.FieldVal).Add(u).Mul(oneMinusC).Mul(twoInv).Add(v).\n\t\t\tMul(w).Negate(1).Normalize()\n\n\t\treturn t\n\n\tcase 1:\n\t\t// If case & 5 = 1, return w(u(1+c)/2 + v)\n\t\tonePlusC := new(btcec.FieldVal).Add(&c).AddInt(1)\n\t\tt := new(btcec.FieldVal).Add(u).Mul(onePlusC).Mul(twoInv).Add(v).\n\t\t\tMul(w).Normalize()\n\n\t\treturn t\n\n\tcase 4:\n\t\t// If case & 5 = 4, return w(u(1-c)/2 + v)\n\t\toneMinusC := new(btcec.FieldVal).Add(&c).Negate(1).AddInt(1)\n\t\tt := new(btcec.FieldVal).Add(u).Mul(oneMinusC).Mul(twoInv).Add(v).\n\t\t\tMul(w).Normalize()\n\n\t\treturn t\n\n\tcase 5:\n\t\t// If case & 5 = 5, return -w(u(1+c)/2 + v)\n\t\tonePlusC := new(btcec.FieldVal).Add(&c).AddInt(1)\n\t\tt := new(btcec.FieldVal).Add(u).Mul(onePlusC).Mul(twoInv).Add(v).\n\t\t\tMul(w).Negate(1).Normalize()\n\n\t\treturn t\n\t}\n\n\tpanic(\"should not reach here\")\n}\n\n// XElligatorSwift takes the x-coordinate of a point on secp256k1 and generates\n// ElligatorSwift encoding of that point composed of two field elements (u, t).\n// NOTE: x MUST be normalized. The return values u, t are normalized.\nfunc XElligatorSwift(x *btcec.FieldVal) (*btcec.FieldVal, *btcec.FieldVal,\n\terror) {\n\n\t// We'll choose a random `u` value and a random case so that we can\n\t// generate a `t` value.\n\tfor {\n\t\t// Choose random u value.\n\t\tvar randUBytes [32]byte\n\t\t_, err := rand.Read(randUBytes[:])\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\tu := new(btcec.FieldVal)\n\t\toverflow := u.SetBytes(&randUBytes)\n\t\tif overflow == 1 {\n\t\t\tu.Normalize()\n\t\t}\n\n\t\t// Choose a random case in the interval [0, 7]\n\t\tvar randCaseByte [1]byte\n\t\t_, err = rand.Read(randCaseByte[:])\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\tcaseNum := randCaseByte[0] & 7\n\n\t\t// Find t, if none is found, continue with the loop.\n\t\tt := XSwiftECInv(u, x, int(caseNum))\n\t\tif t != nil {\n\t\t\treturn u, t, nil\n\t\t}\n\t}\n}\n\n// EllswiftCreate generates a random private key and returns that along with\n// the ElligatorSwift encoding of its corresponding public key.\nfunc EllswiftCreate() (*btcec.PrivateKey, [64]byte, error) {\n\tvar randPrivKeyBytes [32]byte\n\n\t// Generate a random private key\n\t_, err := rand.Read(randPrivKeyBytes[:])\n\tif err != nil {\n\t\treturn nil, [64]byte{}, err\n\t}\n\n\tprivKey, _ := btcec.PrivKeyFromBytes(randPrivKeyBytes[:])\n\n\t// Fetch the x-coordinate of the public key.\n\tx := getXCoord(privKey)\n\n\t// Get the ElligatorSwift encoding of the public key.\n\tu, t, err := XElligatorSwift(x)\n\tif err != nil {\n\t\treturn nil, [64]byte{}, err\n\t}\n\n\tuBytes := u.Bytes()\n\ttBytes := t.Bytes()\n\n\t// ellswift_pub = bytes(u) || bytes(t), its encoding as 64 bytes\n\tvar ellswiftPub [64]byte\n\tcopy(ellswiftPub[0:32], (*uBytes)[:])\n\tcopy(ellswiftPub[32:64], (*tBytes)[:])\n\n\t// Return (priv, ellswift_pub)\n\treturn privKey, ellswiftPub, nil\n}\n\n// EllswiftECDHXOnly takes the ElligatorSwift-encoded public key of a\n// counter-party and performs ECDH with our private key.\nfunc EllswiftECDHXOnly(ellswiftTheirs [64]byte, privKey *btcec.PrivateKey) (\n\t[32]byte, error) {\n\n\t// Let u = int(ellswift_theirs[:32]) mod p.\n\t// Let t = int(ellswift_theirs[32:]) mod p.\n\tuBytesTheirs := ellswiftTheirs[0:32]\n\ttBytesTheirs := ellswiftTheirs[32:64]\n\n\tvar uTheirs btcec.FieldVal\n\toverflow := uTheirs.SetByteSlice(uBytesTheirs[:])\n\tif overflow {\n\t\tuTheirs.Normalize()\n\t}\n\n\tvar tTheirs btcec.FieldVal\n\toverflow = tTheirs.SetByteSlice(tBytesTheirs[:])\n\tif overflow {\n\t\ttTheirs.Normalize()\n\t}\n\n\t// Calculate bytes(x(priv⋅lift_x(XSwiftEC(u, t))))\n\txTheirs, err := XSwiftEC(&uTheirs, &tTheirs)\n\tif err != nil {\n\t\treturn [32]byte{}, err\n\t}\n\n\tpubKey, found := liftX(xTheirs)\n\tif !found {\n\t\treturn [32]byte{}, ErrPointNotOnCurve\n\t}\n\n\tvar pubJacobian btcec.JacobianPoint\n\tpubKey.AsJacobian(&pubJacobian)\n\n\tvar sharedPoint btcec.JacobianPoint\n\tbtcec.ScalarMultNonConst(&privKey.Key, &pubJacobian, &sharedPoint)\n\tsharedPoint.ToAffine()\n\n\treturn *sharedPoint.X.Bytes(), nil\n}\n\n// getXCoord fetches the corresponding public key's x-coordinate given a\n// private key.\nfunc getXCoord(privKey *btcec.PrivateKey) *btcec.FieldVal {\n\tvar result btcec.JacobianPoint\n\tbtcec.ScalarBaseMultNonConst(&privKey.Key, &result)\n\tresult.ToAffine()\n\treturn &result.X\n}\n\n// liftX returns the point P with x-coordinate `x` and even y-coordinate. If a\n// point exists on the curve, it returns true and false otherwise.\n// TODO: Use quadratic residue formula instead (see: BIP340)?\nfunc liftX(x *btcec.FieldVal) (*btcec.PublicKey, bool) {\n\tySqr := new(btcec.FieldVal).Add(x).Square().Mul(x).AddInt(7)\n\n\ty := new(btcec.FieldVal)\n\tif !y.SquareRootVal(ySqr) {\n\t\t// If we've reached here, the point does not exist on the curve.\n\t\treturn nil, false\n\t}\n\n\tif !y.Normalize().IsOdd() {\n\t\treturn btcec.NewPublicKey(x, y), true\n\t}\n\n\t// Negate y if it's odd.\n\tif !y.Negate(1).Normalize().IsOdd() {\n\t\treturn btcec.NewPublicKey(x, y), true\n\t}\n\n\treturn nil, false\n}\n\n// V2Ecdh performs x-only ecdh and returns a shared secret composed of a tagged\n// hash which itself is composed of two ElligatorSwift-encoded public keys and\n// the x-only ecdh point.\nfunc V2Ecdh(priv *btcec.PrivateKey, ellswiftTheirs, ellswiftOurs [64]byte,\n\tinitiating bool) (*chainhash.Hash, error) {\n\n\tecdhPoint, err := EllswiftECDHXOnly(ellswiftTheirs, priv)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif initiating {\n\t\t// Initiating, place our public key encoding first.\n\t\tvar msg []byte\n\t\tmsg = append(msg, ellswiftOurs[:]...)\n\t\tmsg = append(msg, ellswiftTheirs[:]...)\n\t\tmsg = append(msg, ecdhPoint[:]...)\n\t\treturn chainhash.TaggedHash(ellswiftTag, msg), nil\n\t}\n\n\tmsg := make([]byte, 0, 64+64+32)\n\tmsg = append(msg, ellswiftTheirs[:]...)\n\tmsg = append(msg, ellswiftOurs[:]...)\n\tmsg = append(msg, ecdhPoint[:]...)\n\treturn chainhash.TaggedHash(ellswiftTag, msg), nil\n}\n"
  },
  {
    "path": "btcec/ellswift/ellswift_test.go",
    "content": "package ellswift\n\nimport (\n\t\"encoding/hex\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n)\n\n// setHex decodes the passed big-endian hex string into the internal field value\n// representation.  Only the first 32-bytes are used.\n//\n// This is NOT constant time.\n//\n// The field value is returned to support chaining.  This enables syntax like:\n// f := new(FieldVal).SetHex(\"0abc\").Add(1) so that f = 0x0abc + 1\nfunc setHex(hexString string) *btcec.FieldVal {\n\tif len(hexString)%2 != 0 {\n\t\thexString = \"0\" + hexString\n\t}\n\tbytes, _ := hex.DecodeString(hexString)\n\n\tvar f btcec.FieldVal\n\tf.SetByteSlice(bytes)\n\n\treturn &f\n}\n\n// TestXSwiftECVectors checks the BIP324 test vectors for the XSwiftEC function.\nfunc TestXSwiftECVectors(t *testing.T) {\n\ttests := []struct {\n\t\tellswift  string\n\t\texpectedX string\n\t}{\n\t\t{\n\t\t\tellswift:  \"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"edd1fd3e327ce90cc7a3542614289aee9682003e9cf7dcc9cf2ca9743be5aa0c\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"000000000000000000000000000000000000000000000000000000000000000001d3475bf7655b0fb2d852921035b2ef607f49069b97454e6795251062741771\",\n\t\t\texpectedX: \"b5da00b73cd6560520e7c364086e7cd23a34bf60d0e707be9fc34d4cd5fdfa2c\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"000000000000000000000000000000000000000000000000000000000000000082277c4a71f9d22e66ece523f8fa08741a7c0912c66a69ce68514bfd3515b49f\",\n\t\t\texpectedX: \"f482f2e241753ad0fb89150d8491dc1e34ff0b8acfbb442cfe999e2e5e6fd1d2\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"00000000000000000000000000000000000000000000000000000000000000008421cc930e77c9f514b6915c3dbe2a94c6d8f690b5b739864ba6789fb8a55dd0\",\n\t\t\texpectedX: \"9f59c40275f5085a006f05dae77eb98c6fd0db1ab4a72ac47eae90a4fc9e57e0\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"0000000000000000000000000000000000000000000000000000000000000000bde70df51939b94c9c24979fa7dd04ebd9b3572da7802290438af2a681895441\",\n\t\t\texpectedX: \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9fffffd6b\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"0000000000000000000000000000000000000000000000000000000000000000d19c182d2759cd99824228d94799f8c6557c38a1c0d6779b9d4b729c6f1ccc42\",\n\t\t\texpectedX: \"70720db7e238d04121f5b1afd8cc5ad9d18944c6bdc94881f502b7a3af3aecff\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"edd1fd3e327ce90cc7a3542614289aee9682003e9cf7dcc9cf2ca9743be5aa0c\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff2664bbd5\",\n\t\t\texpectedX: \"50873db31badcc71890e4f67753a65757f97aaa7dd5f1e82b753ace32219064b\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7028de7d\",\n\t\t\texpectedX: \"1eea9cc59cfcf2fa151ac6c274eea4110feb4f7b68c5965732e9992e976ef68e\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcbcfb7e7\",\n\t\t\texpectedX: \"12303941aedc208880735b1f1795c8e55be520ea93e103357b5d2adb7ed59b8e\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffff3113ad9\",\n\t\t\texpectedX: \"7eed6b70e7b0767c7d7feac04e57aa2a12fef5e0f48f878fcbb88b3b6b5e0783\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"0a2d2ba93507f1df233770c2a797962cc61f6d15da14ecd47d8d27ae1cd5f8530000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"532167c11200b08c0e84a354e74dcc40f8b25f4fe686e30869526366278a0688\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"0a2d2ba93507f1df233770c2a797962cc61f6d15da14ecd47d8d27ae1cd5f853fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"532167c11200b08c0e84a354e74dcc40f8b25f4fe686e30869526366278a0688\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"0ffde9ca81d751e9cdaffc1a50779245320b28996dbaf32f822f20117c22fbd6c74d99efceaa550f1ad1c0f43f46e7ff1ee3bd0162b7bf55f2965da9c3450646\",\n\t\t\texpectedX: \"74e880b3ffd18fe3cddf7902522551ddf97fa4a35a3cfda8197f947081a57b8f\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"0ffde9ca81d751e9cdaffc1a50779245320b28996dbaf32f822f20117c22fbd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffff156ca896\",\n\t\t\texpectedX: \"377b643fce2271f64e5c8101566107c1be4980745091783804f654781ac9217c\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"123658444f32be8f02ea2034afa7ef4bbe8adc918ceb49b12773b625f490b368ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8dc5fe11\",\n\t\t\texpectedX: \"ed16d65cf3a9538fcb2c139f1ecbc143ee14827120cbc2659e667256800b8142\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"146f92464d15d36e35382bd3ca5b0f976c95cb08acdcf2d5b3570617990839d7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff3145e93b\",\n\t\t\texpectedX: \"0d5cd840427f941f65193079ab8e2e83024ef2ee7ca558d88879ffd879fb6657\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"15fdf5cf09c90759add2272d574d2bb5fe1429f9f3c14c65e3194bf61b82aa73ffffffffffffffffffffffffffffffffffffffffffffffffffffffff04cfd906\",\n\t\t\texpectedX: \"16d0e43946aec93f62d57eb8cde68951af136cf4b307938dd1447411e07bffe1\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"1f67edf779a8a649d6def60035f2fa22d022dd359079a1a144073d84f19b92d50000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"025661f9aba9d15c3118456bbe980e3e1b8ba2e047c737a4eb48a040bb566f6c\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"1f67edf779a8a649d6def60035f2fa22d022dd359079a1a144073d84f19b92d5fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"025661f9aba9d15c3118456bbe980e3e1b8ba2e047c737a4eb48a040bb566f6c\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"1fe1e5ef3fceb5c135ab7741333ce5a6e80d68167653f6b2b24bcbcfaaaff507fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"98bec3b2a351fa96cfd191c1778351931b9e9ba9ad1149f6d9eadca80981b801\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"4056a34a210eec7892e8820675c860099f857b26aad85470ee6d3cf1304a9dcf375e70374271f20b13c9986ed7d3c17799698cfc435dbed3a9f34b38c823c2b4\",\n\t\t\texpectedX: \"868aac2003b29dbcad1a3e803855e078a89d16543ac64392d122417298cec76e\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"4197ec3723c654cfdd32ab075506648b2ff5070362d01a4fff14b336b78f963fffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3ab1e95\",\n\t\t\texpectedX: \"ba5a6314502a8952b8f456e085928105f665377a8ce27726a5b0eb7ec1ac0286\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"47eb3e208fedcdf8234c9421e9cd9a7ae873bfbdbc393723d1ba1e1e6a8e6b24ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7cd12cb1\",\n\t\t\texpectedX: \"d192d52007e541c9807006ed0468df77fd214af0a795fe119359666fdcf08f7c\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"5eb9696a2336fe2c3c666b02c755db4c0cfd62825c7b589a7b7bb442e141c1d693413f0052d49e64abec6d5831d66c43612830a17df1fe4383db896468100221\",\n\t\t\texpectedX: \"ef6e1da6d6c7627e80f7a7234cb08a022c1ee1cf29e4d0f9642ae924cef9eb38\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"7bf96b7b6da15d3476a2b195934b690a3a3de3e8ab8474856863b0de3af90b0e0000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"50851dfc9f418c314a437295b24feeea27af3d0cd2308348fda6e21c463e46ff\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"7bf96b7b6da15d3476a2b195934b690a3a3de3e8ab8474856863b0de3af90b0efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"50851dfc9f418c314a437295b24feeea27af3d0cd2308348fda6e21c463e46ff\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"851b1ca94549371c4f1f7187321d39bf51c6b7fb61f7cbf027c9da62021b7a65fc54c96837fb22b362eda63ec52ec83d81bedd160c11b22d965d9f4a6d64d251\",\n\t\t\texpectedX: \"3e731051e12d33237eb324f2aa5b16bb868eb49a1aa1fadc19b6e8761b5a5f7b\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"943c2f775108b737fe65a9531e19f2fc2a197f5603e3a2881d1d83e4008f91250000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"311c61f0ab2f32b7b1f0223fa72f0a78752b8146e46107f8876dd9c4f92b2942\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"943c2f775108b737fe65a9531e19f2fc2a197f5603e3a2881d1d83e4008f9125fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"311c61f0ab2f32b7b1f0223fa72f0a78752b8146e46107f8876dd9c4f92b2942\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"a0f18492183e61e8063e573606591421b06bc3513631578a73a39c1c3306239f2f32904f0d2a33ecca8a5451705bb537d3bf44e071226025cdbfd249fe0f7ad6\",\n\t\t\texpectedX: \"97a09cf1a2eae7c494df3c6f8a9445bfb8c09d60832f9b0b9d5eabe25fbd14b9\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"a1ed0a0bd79d8a23cfe4ec5fef5ba5cccfd844e4ff5cb4b0f2e71627341f1c5b17c499249e0ac08d5d11ea1c2c8ca7001616559a7994eadec9ca10fb4b8516dc\",\n\t\t\texpectedX: \"65a89640744192cdac64b2d21ddf989cdac7500725b645bef8e2200ae39691f2\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ba94594a432721aa3580b84c161d0d134bc354b690404d7cd4ec57c16d3fbe98ffffffffffffffffffffffffffffffffffffffffffffffffffffffffea507dd7\",\n\t\t\texpectedX: \"5e0d76564aae92cb347e01a62afd389a9aa401c76c8dd227543dc9cd0efe685a\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"bcaf7219f2f6fbf55fe5e062dce0e48c18f68103f10b8198e974c184750e1be3932016cbf69c4471bd1f656c6a107f1973de4af7086db897277060e25677f19a\",\n\t\t\texpectedX: \"2d97f96cac882dfe73dc44db6ce0f1d31d6241358dd5d74eb3d3b50003d24c2b\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"bcaf7219f2f6fbf55fe5e062dce0e48c18f68103f10b8198e974c184750e1be3ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6507d09a\",\n\t\t\texpectedX: \"e7008afe6e8cbd5055df120bd748757c686dadb41cce75e4addcc5e02ec02b44\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"c5981bae27fd84401c72a155e5707fbb811b2b620645d1028ea270cbe0ee225d4b62aa4dca6506c1acdbecc0552569b4b21436a5692e25d90d3bc2eb7ce24078\",\n\t\t\texpectedX: \"948b40e7181713bc018ec1702d3d054d15746c59a7020730dd13ecf985a010d7\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"c894ce48bfec433014b931a6ad4226d7dbd8eaa7b6e3faa8d0ef94052bcf8cff336eeb3919e2b4efb746c7f71bbca7e9383230fbbc48ffafe77e8bcc69542471\",\n\t\t\texpectedX: \"f1c91acdc2525330f9b53158434a4d43a1c547cff29f15506f5da4eb4fe8fa5a\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"cbb0deab125754f1fdb2038b0434ed9cb3fb53ab735391129994a535d925f6730000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"872d81ed8831d9998b67cb7105243edbf86c10edfebb786c110b02d07b2e67cd\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"d917b786dac35670c330c9c5ae5971dfb495c8ae523ed97ee2420117b171f41effffffffffffffffffffffffffffffffffffffffffffffffffffffff2001f6f6\",\n\t\t\texpectedX: \"e45b71e110b831f2bdad8651994526e58393fde4328b1ec04d59897142584691\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"e28bd8f5929b467eb70e04332374ffb7e7180218ad16eaa46b7161aa679eb4260000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"66b8c980a75c72e598d383a35a62879f844242ad1e73ff12edaa59f4e58632b5\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"e28bd8f5929b467eb70e04332374ffb7e7180218ad16eaa46b7161aa679eb426fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"66b8c980a75c72e598d383a35a62879f844242ad1e73ff12edaa59f4e58632b5\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"e7ee5814c1706bf8a89396a9b032bc014c2cac9c121127dbf6c99278f8bb53d1dfd04dbcda8e352466b6fcd5f2dea3e17d5e133115886eda20db8a12b54de71b\",\n\t\t\texpectedX: \"e842c6e3529b234270a5e97744edc34a04d7ba94e44b6d2523c9cf0195730a50\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"f292e46825f9225ad23dc057c1d91c4f57fcb1386f29ef10481cb1d22518593fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7011c989\",\n\t\t\texpectedX: \"3cea2c53b8b0170166ac7da67194694adacc84d56389225e330134dab85a4d55\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"edd1fd3e327ce90cc7a3542614289aee9682003e9cf7dcc9cf2ca9743be5aa0c\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f01d3475bf7655b0fb2d852921035b2ef607f49069b97454e6795251062741771\",\n\t\t\texpectedX: \"b5da00b73cd6560520e7c364086e7cd23a34bf60d0e707be9fc34d4cd5fdfa2c\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f4218f20ae6c646b363db68605822fb14264ca8d2587fdd6fbc750d587e76a7ee\",\n\t\t\texpectedX: \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9fffffd6b\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f82277c4a71f9d22e66ece523f8fa08741a7c0912c66a69ce68514bfd3515b49f\",\n\t\t\texpectedX: \"f482f2e241753ad0fb89150d8491dc1e34ff0b8acfbb442cfe999e2e5e6fd1d2\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f8421cc930e77c9f514b6915c3dbe2a94c6d8f690b5b739864ba6789fb8a55dd0\",\n\t\t\texpectedX: \"9f59c40275f5085a006f05dae77eb98c6fd0db1ab4a72ac47eae90a4fc9e57e0\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fd19c182d2759cd99824228d94799f8c6557c38a1c0d6779b9d4b729c6f1ccc42\",\n\t\t\texpectedX: \"70720db7e238d04121f5b1afd8cc5ad9d18944c6bdc94881f502b7a3af3aecff\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"edd1fd3e327ce90cc7a3542614289aee9682003e9cf7dcc9cf2ca9743be5aa0c\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fffffffffffffffffffffffffffffffffffffffffffffffffffffffff2664bbd5\",\n\t\t\texpectedX: \"50873db31badcc71890e4f67753a65757f97aaa7dd5f1e82b753ace32219064b\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7028de7d\",\n\t\t\texpectedX: \"1eea9cc59cfcf2fa151ac6c274eea4110feb4f7b68c5965732e9992e976ef68e\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffcbcfb7e7\",\n\t\t\texpectedX: \"12303941aedc208880735b1f1795c8e55be520ea93e103357b5d2adb7ed59b8e\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3113ad9\",\n\t\t\texpectedX: \"7eed6b70e7b0767c7d7feac04e57aa2a12fef5e0f48f878fcbb88b3b6b5e0783\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff13cea4a70000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"649984435b62b4a25d40c6133e8d9ab8c53d4b059ee8a154a3be0fcf4e892edb\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff13cea4a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"649984435b62b4a25d40c6133e8d9ab8c53d4b059ee8a154a3be0fcf4e892edb\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff15028c590063f64d5a7f1c14915cd61eac886ab295bebd91992504cf77edb028bdd6267f\",\n\t\t\texpectedX: \"3fde5713f8282eead7d39d4201f44a7c85a5ac8a0681f35e54085c6b69543374\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff2715de860000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"3524f77fa3a6eb4389c3cb5d27f1f91462086429cd6c0cb0df43ea8f1e7b3fb4\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff2715de86fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"3524f77fa3a6eb4389c3cb5d27f1f91462086429cd6c0cb0df43ea8f1e7b3fb4\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff2c2c5709e7156c417717f2feab147141ec3da19fb759575cc6e37b2ea5ac9309f26f0f66\",\n\t\t\texpectedX: \"d2469ab3e04acbb21c65a1809f39caafe7a77c13d10f9dd38f391c01dc499c52\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff3a08cc1efffffffffffffffffffffffffffffffffffffffffffffffffffffffff760e9f0\",\n\t\t\texpectedX: \"38e2a5ce6a93e795e16d2c398bc99f0369202ce21e8f09d56777b40fc512bccc\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff3e91257d932016cbf69c4471bd1f656c6a107f1973de4af7086db897277060e25677f19a\",\n\t\t\texpectedX: \"864b3dc902c376709c10a93ad4bbe29fce0012f3dc8672c6286bba28d7d6d6fc\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff795d6c1c322cadf599dbb86481522b3cc55f15a67932db2afa0111d9ed6981bcd124bf44\",\n\t\t\texpectedX: \"766dfe4a700d9bee288b903ad58870e3d4fe2f0ef780bcac5c823f320d9a9bef\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e426f0392389078c12b1a89e9542f0593bc96b6bfde8224f8654ef5d5cda935a3582194\",\n\t\t\texpectedX: \"faec7bc1987b63233fbc5f956edbf37d54404e7461c58ab8631bc68e451a0478\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff91192139ffffffffffffffffffffffffffffffffffffffffffffffffffffffff45f0f1eb\",\n\t\t\texpectedX: \"ec29a50bae138dbf7d8e24825006bb5fc1a2cc1243ba335bc6116fb9e498ec1f\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff98eb9ab76e84499c483b3bf06214abfe065dddf43b8601de596d63b9e45a166a580541fe\",\n\t\t\texpectedX: \"1e0ff2dee9b09b136292a9e910f0d6ac3e552a644bba39e64e9dd3e3bbd3d4d4\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b77b7f2c74d99efceaa550f1ad1c0f43f46e7ff1ee3bd0162b7bf55f2965da9c3450646\",\n\t\t\texpectedX: \"8b7dd5c3edba9ee97b70eff438f22dca9849c8254a2f3345a0a572ffeaae0928\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b77b7f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffff156ca896\",\n\t\t\texpectedX: \"0881950c8f51d6b9a6387465d5f12609ef1bb25412a08a74cb2dfb200c74bfbf\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2f5cd838816c16c4fe8a1661d606fdb13cf9af04b979a2e159a09409ebc8645d58fde02\",\n\t\t\texpectedX: \"2f083207b9fd9b550063c31cd62b8746bd543bdc5bbf10e3a35563e927f440c8\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffb13f75c00000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"4f51e0be078e0cddab2742156adba7e7a148e73157072fd618cd60942b146bd0\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffb13f75c0fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"4f51e0be078e0cddab2742156adba7e7a148e73157072fd618cd60942b146bd0\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7bc1f8d0000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\texpectedX: \"16c2ccb54352ff4bd794f6efd613c72197ab7082da5b563bdf9cb3edaafe74c2\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7bc1f8dfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\texpectedX: \"16c2ccb54352ff4bd794f6efd613c72197ab7082da5b563bdf9cb3edaafe74c2\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffef64d162750546ce42b0431361e52d4f5242d8f24f33e6b1f99b591647cbc808f462af51\",\n\t\t\texpectedX: \"d41244d11ca4f65240687759f95ca9efbab767ededb38fd18c36e18cd3b6f6a9\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0e5be52372dd6e894b2a326fc3605a6e8f3c69c710bf27d630dfe2004988b78eb6eab36\",\n\t\t\texpectedX: \"64bf84dd5e03670fdb24c0f5d3c2c365736f51db6c92d95010716ad2d36134c8\",\n\t\t},\n\t\t{\n\t\t\tellswift:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffefbb982fffffffffffffffffffffffffffffffffffffffffffffffffffffffff6d6db1f\",\n\t\t\texpectedX: \"1c92ccdfcf4ac550c28db57cff0c8515cb26936c786584a70114008d6c33a34b\",\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// The test.ellswift variable is 128-bytes long and is composed of two\n\t\t// 64-byte hexadecimal strings. The first 64-byte hex string is the u\n\t\t// value and the other is the t-value.\n\t\tuVal := setHex(test.ellswift[0:64]).Normalize()\n\t\ttVal := setHex(test.ellswift[64:128]).Normalize()\n\n\t\txVal := setHex(test.expectedX)\n\n\t\txCoord, err := XSwiftEC(uVal, tVal)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"received err with XSwiftEC: %v\", err)\n\t\t}\n\n\t\tif !xCoord.Equals(xVal) {\n\t\t\tt.Fatalf(\"encoding not equal to x\")\n\t\t}\n\t}\n}\n\n// TestXSwiftECInvVectors tests that the inverse of the ElligatorSwift encoding\n// XSwiftECInv works as expected. In other words, given a u-value and an\n// x-value, that the correct t-value is returned. Each test case has a cases\n// array that determines which t-value should be returned for each\n// corresponding case.\nfunc TestXSwiftECInvVectors(t *testing.T) {\n\ttests := []struct {\n\t\tu     string\n\t\tx     string\n\t\tcases []string\n\t}{\n\t\t{\n\t\t\tu: \"05ff6bdad900fc3261bc7fe34e2fb0f569f06e091ae437d3a52e9da0cbfb9590\",\n\t\t\tx: \"80cdf63774ec7022c89a5a8558e373a279170285e0ab27412dbce510bdfe23fc\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"45654798ece071ba79286d04f7f3eb1c3f1d17dd883610f2ad2efd82a287466b\",\n\t\t\t\t\"0aeaa886f6b76c7158452418cbf5033adc5747e9e9b5d3b2303db96936528557\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"ba9ab867131f8e4586d792fb080c14e3c0e2e82277c9ef0d52d1027c5d78b5c4\",\n\t\t\t\t\"f51557790948938ea7badbe7340afcc523a8b816164a2c4dcfc24695c9ad76d8\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"1737a85f4c8d146cec96e3ffdca76d9903dcf3bd53061868d478c78c63c2aa9e\",\n\t\t\tx: \"39e48dd150d2f429be088dfd5b61882e7e8407483702ae9a5ab35927b15f85ea\",\n\t\t\tcases: []string{\n\t\t\t\t\"1be8cc0b04be0c681d0c6a68f733f82c6c896e0c8a262fcd392918e303a7abf4\",\n\t\t\t\t\"605b5814bf9b8cb066667c9e5480d22dc5b6c92f14b4af3ee0a9eb83b03685e3\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"e41733f4fb41f397e2f3959708cc07d3937691f375d9d032c6d6e71bfc58503b\",\n\t\t\t\t\"9fa4a7eb4064734f99998361ab7f2dd23a4936d0eb4b50c11f56147b4fc9764c\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"1aaa1ccebf9c724191033df366b36f691c4d902c228033ff4516d122b2564f68\",\n\t\t\tx: \"c75541259d3ba98f207eaa30c69634d187d0b6da594e719e420f4898638fc5b0\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"2323a1d079b0fd72fc8bb62ec34230a815cb0596c2bfac998bd6b84260f5dc26\",\n\t\t\tx: \"239342dfb675500a34a196310b8d87d54f49dcac9da50c1743ceab41a7b249ff\",\n\t\t\tcases: []string{\n\t\t\t\t\"f63580b8aa49c4846de56e39e1b3e73f171e881eba8c66f614e67e5c975dfc07\",\n\t\t\t\t\"b6307b332e699f1cf77841d90af25365404deb7fed5edb3090db49e642a156b6\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"09ca7f4755b63b7b921a91c61e4c18c0e8e177e145739909eb1981a268a20028\",\n\t\t\t\t\"49cf84ccd19660e30887be26f50dac9abfb2148012a124cf6f24b618bd5ea579\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"2dc90e640cb646ae9164c0b5a9ef0169febe34dc4437d6e46acb0e27e219d1e8\",\n\t\t\tx: \"d236f19bf349b9516e9b3f4a5610fe960141cb23bbc8291b9534f1d71de62a47\",\n\t\t\tcases: []string{\n\t\t\t\t\"e69df7d9c026c36600ebdf588072675847c0c431c8eb730682533e964b6252c9\",\n\t\t\t\t\"4f18bbdf7c2d6c5f818c18802fa35cd069eaa79fff74e4fc837c80d93fece2f8\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"196208263fd93c99ff1420a77f8d98a7b83f3bce37148cf97dacc168b49da966\",\n\t\t\t\t\"b0e7442083d293a07e73e77fd05ca32f96155860008b1b037c837f25c0131937\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"3edd7b3980e2f2f34d1409a207069f881fda5f96f08027ac4465b63dc278d672\",\n\t\t\tx: \"053a98de4a27b1961155822b3a3121f03b2a14458bd80eb4a560c4c7a85c149c\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"b3dae4b7dcf858e4c6968057cef2b156465431526538199cf52dc1b2d62fda30\",\n\t\t\t\t\"4aa77dd55d6b6d3cfa10cc9d0fe42f79232e4575661049ae36779c1d0c666d88\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"4c251b482307a71b39697fa8310d4ea9b9abcead9ac7e6630ad23e4c29d021ff\",\n\t\t\t\t\"b558822aa29492c305ef3362f01bd086dcd1ba8a99efb651c98863e1f3998ea7\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"4295737efcb1da6fb1d96b9ca7dcd1e320024b37a736c4948b62598173069f70\",\n\t\t\tx: \"fa7ffe4f25f88362831c087afe2e8a9b0713e2cac1ddca6a383205a266f14307\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"587c1a0cee91939e7f784d23b963004a3bf44f5d4e32a0081995ba20b0fca59e\",\n\t\t\tx: \"2ea988530715e8d10363907ff25124524d471ba2454d5ce3be3f04194dfd3a3c\",\n\t\t\tcases: []string{\n\t\t\t\t\"cfd5a094aa0b9b8891b76c6ab9438f66aa1c095a65f9f70135e8171292245e74\",\n\t\t\t\t\"a89057d7c6563f0d6efa19ae84412b8a7b47e791a191ecdfdf2af84fd97bc339\",\n\t\t\t\t\"475d0ae9ef46920df07b34117be5a0817de1023e3cc32689e9be145b406b0aef\",\n\t\t\t\t\"a0759178ad80232454f827ef05ea3e72ad8d75418e6d4cc1cd4f5306c5e7c453\",\n\t\t\t\t\"302a5f6b55f464776e48939546bc709955e3f6a59a0608feca17e8ec6ddb9dbb\",\n\t\t\t\t\"576fa82839a9c0f29105e6517bbed47584b8186e5e6e132020d507af268438f6\",\n\t\t\t\t\"b8a2f51610b96df20f84cbee841a5f7e821efdc1c33cd9761641eba3bf94f140\",\n\t\t\t\t\"5f8a6e87527fdcdbab07d810fa15c18d52728abe7192b33e32b0acf83a1837dc\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"5fa88b3365a635cbbcee003cce9ef51dd1a310de277e441abccdb7be1e4ba249\",\n\t\t\tx: \"79461ff62bfcbcac4249ba84dd040f2cec3c63f725204dc7f464c16bf0ff3170\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"6bb700e1f4d7e236e8d193ff4a76c1b3bcd4e2b25acac3d51c8dac653fe909a0\",\n\t\t\t\t\"f4c73410633da7f63a4f1d55aec6dd32c4c6d89ee74075edb5515ed90da9e683\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"9448ff1e0b281dc9172e6c00b5893e4c432b1d4da5353c2ae3725399c016f28f\",\n\t\t\t\t\"0b38cbef9cc25809c5b0e2aa513922cd3b39276118bf8a124aaea125f25615ac\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"6fb31c7531f03130b42b155b952779efbb46087dd9807d241a48eac63c3d96d6\",\n\t\t\tx: \"56f81be753e8d4ae4940ea6f46f6ec9fda66a6f96cc95f506cb2b57490e94260\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"59059774795bdb7a837fbe1140a5fa59984f48af8df95d57dd6d1c05437dcec1\",\n\t\t\t\t\"22a644db79376ad4e7b3a009e58b3f13137c54fdf911122cc93667c47077d784\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"a6fa688b86a424857c8041eebf5a05a667b0b7507206a2a82292e3f9bc822d6e\",\n\t\t\t\t\"dd59bb2486c8952b184c5ff61a74c0ecec83ab0206eeedd336c9983a8f8824ab\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"704cd226e71cb6826a590e80dac90f2d2f5830f0fdf135a3eae3965bff25ff12\",\n\t\t\tx: \"138e0afa68936ee670bd2b8db53aedbb7bea2a8597388b24d0518edd22ad66ec\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"725e914792cb8c8949e7e1168b7cdd8a8094c91c6ec2202ccd53a6a18771edeb\",\n\t\t\tx: \"8da16eb86d347376b6181ee9748322757f6b36e3913ddfd332ac595d788e0e44\",\n\t\t\tcases: []string{\n\t\t\t\t\"dd357786b9f6873330391aa5625809654e43116e82a5a5d82ffd1d6624101fc4\",\n\t\t\t\t\"a0b7efca01814594c59c9aae8e49700186ca5d95e88bcc80399044d9c2d8613d\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"22ca8879460978cccfc6e55a9da7f69ab1bcee917d5a5a27d002e298dbefdc6b\",\n\t\t\t\t\"5f481035fe7eba6b3a63655171b68ffe7935a26a1774337fc66fbb253d279af2\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"78fe6b717f2ea4a32708d79c151bf503a5312a18c0963437e865cc6ed3f6ae97\",\n\t\t\tx: \"8701948e80d15b5cd8f72863eae40afc5aced5e73f69cbc8179a33902c094d98\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"7c37bb9c5061dc07413f11acd5a34006e64c5c457fdb9a438f217255a961f50d\",\n\t\t\tx: \"5c1a76b44568eb59d6789a7442d9ed7cdc6226b7752b4ff8eaf8e1a95736e507\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"b94d30cd7dbff60b64620c17ca0fafaa40b3d1f52d077a60a2e0cafd145086c2\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"46b2cf32824009f49b9df3e835f05055bf4c2e0ad2f8859f5d1f3501ebaf756d\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"82388888967f82a6b444438a7d44838e13c0d478b9ca060da95a41fb94303de6\",\n\t\t\tx: \"29e9654170628fec8b4972898b113cf98807f4609274f4f3140d0674157c90a0\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"91298f5770af7a27f0a47188d24c3b7bf98ab2990d84b0b898507e3c561d6472\",\n\t\t\tx: \"144f4ccbd9a74698a88cbf6fd00ad886d339d29ea19448f2c572cac0a07d5562\",\n\t\t\tcases: []string{\n\t\t\t\t\"e6a0ffa3807f09dadbe71e0f4be4725f2832e76cad8dc1d943ce839375eff248\",\n\t\t\t\t\"837b8e68d4917544764ad0903cb11f8615d2823cefbb06d89049dbabc69befda\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"195f005c7f80f6252418e1f0b41b8da0d7cd189352723e26bc317c6b8a1009e7\",\n\t\t\t\t\"7c8471972b6e8abb89b52f6fc34ee079ea2d7dc31044f9276fb6245339640c55\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"b682f3d03bbb5dee4f54b5ebfba931b4f52f6a191e5c2f483c73c66e9ace97e1\",\n\t\t\tx: \"904717bf0bc0cb7873fcdc38aa97f19e3a62630972acff92b24cc6dda197cb96\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"c17ec69e665f0fb0dbab48d9c2f94d12ec8a9d7eacb58084833091801eb0b80b\",\n\t\t\tx: \"147756e66d96e31c426d3cc85ed0c4cfbef6341dd8b285585aa574ea0204b55e\",\n\t\t\tcases: []string{\n\t\t\t\t\"6f4aea431a0043bdd03134d6d9159119ce034b88c32e50e8e36c4ee45eac7ae9\",\n\t\t\t\t\"fd5be16d4ffa2690126c67c3ef7cb9d29b74d397c78b06b3605fda34dc9696a6\",\n\t\t\t\t\"5e9c60792a2f000e45c6250f296f875e174efc0e9703e628706103a9dd2d82c7\",\n\t\t\t\t\"\",\n\t\t\t\t\"90b515bce5ffbc422fcecb2926ea6ee631fcb4773cd1af171c93b11aa1538146\",\n\t\t\t\t\"02a41e92b005d96fed93983c1083462d648b2c683874f94c9fa025ca23696589\",\n\t\t\t\t\"a1639f86d5d0fff1ba39daf0d69078a1e8b103f168fc19d78f9efc5522d27968\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"c25172fc3f29b6fc4a1155b8575233155486b27464b74b8b260b499a3f53cb14\",\n\t\t\tx: \"1ea9cbdb35cf6e0329aa31b0bb0a702a65123ed008655a93b7dcd5280e52e1ab\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"7422edc7843136af0053bb8854448a8299994f9ddcefd3a9a92d45462c59298a\",\n\t\t\t\t\"78c7774a266f8b97ea23d05d064f033c77319f923f6b78bce4e20bf05fa5398d\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"8bdd12387bcec950ffac4477abbb757d6666b06223102c5656d2bab8d3a6d2a5\",\n\t\t\t\t\"873888b5d990746815dc2fa2f9b0fcc388ce606dc09487431b1df40ea05ac2a2\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"cab6626f832a4b1280ba7add2fc5322ff011caededf7ff4db6735d5026dc0367\",\n\t\t\tx: \"2b2bef0852c6f7c95d72ac99a23802b875029cd573b248d1f1b3fc8033788eb6\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"d8621b4ffc85b9ed56e99d8dd1dd24aedcecb14763b861a17112dc771a104fd2\",\n\t\t\tx: \"812cabe972a22aa67c7da0c94d8a936296eb9949d70c37cb2b2487574cb3ce58\",\n\t\t\tcases: []string{\n\t\t\t\t\"fbc5febc6fdbc9ae3eb88a93b982196e8b6275a6d5a73c17387e000c711bd0e3\",\n\t\t\t\t\"8724c96bd4e5527f2dd195a51c468d2d211ba2fac7cbe0b4b3434253409fb42d\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"043a014390243651c147756c467de691749d8a592a58c3e8c781fff28ee42b4c\",\n\t\t\t\t\"78db36942b1aad80d22e6a5ae3b972d2dee45d0538341f4b4cbcbdabbf604802\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"da463164c6f4bf7129ee5f0ec00f65a675a8adf1bd931b39b64806afdcda9a22\",\n\t\t\tx: \"25b9ce9b390b408ed611a0f13ff09a598a57520e426ce4c649b7f94f2325620d\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"dafc971e4a3a7b6dcfb42a08d9692d82ad9e7838523fcbda1d4827e14481ae2d\",\n\t\t\tx: \"250368e1b5c58492304bd5f72696d27d526187c7adc03425e2b7d81dbb7e4e02\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"370c28f1be665efacde6aa436bf86fe21e6e314c1e53dd040e6c73a46b4c8c49\",\n\t\t\t\t\"cd8acee98ffe56531a84d7eb3e48fa4034206ce825ace907d0edf0eaeb5e9ca2\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"c8f3d70e4199a105321955bc9407901de191ceb3e1ac22fbf1938c5a94b36fe6\",\n\t\t\t\t\"327531167001a9ace57b2814c1b705bfcbdf9317da5316f82f120f1414a15f8d\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"e0294c8bc1a36b4166ee92bfa70a5c34976fa9829405efea8f9cd54dcb29b99e\",\n\t\t\tx: \"ae9690d13b8d20a0fbbf37bed8474f67a04e142f56efd78770a76b359165d8a1\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"dcd45d935613916af167b029058ba3a700d37150b9df34728cb05412c16d4182\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"232ba26ca9ec6e950e984fd6fa745c58ff2c8eaf4620cb8d734fabec3e92baad\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"e148441cd7b92b8b0e4fa3bd68712cfd0d709ad198cace611493c10e97f5394e\",\n\t\t\tx: \"164a639794d74c53afc4d3294e79cdb3cd25f99f6df45c000f758aba54d699c0\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"e4b00ec97aadcca97644d3b0c8a931b14ce7bcf7bc8779546d6e35aa5937381c\",\n\t\t\tx: \"94e9588d41647b3fcc772dc8d83c67ce3be003538517c834103d2cd49d62ef4d\",\n\t\t\tcases: []string{\n\t\t\t\t\"c88d25f41407376bb2c03a7fffeb3ec7811cc43491a0c3aac0378cdc78357bee\",\n\t\t\t\t\"51c02636ce00c2345ecd89adb6089fe4d5e18ac924e3145e6669501cd37a00d4\",\n\t\t\t\t\"205b3512db40521cb200952e67b46f67e09e7839e0de44004138329ebd9138c5\",\n\t\t\t\t\"58aab390ab6fb55c1d1b80897a207ce94a78fa5b4aa61a33398bcae9adb20d3e\",\n\t\t\t\t\"3772da0bebf8c8944d3fc5800014c1387ee33bcb6e5f3c553fc8732287ca8041\",\n\t\t\t\t\"ae3fd9c931ff3dcba132765249f7601b2a1e7536db1ceba19996afe22c85fb5b\",\n\t\t\t\t\"dfa4caed24bfade34dff6ad1984b90981f6187c61f21bbffbec7cd60426ec36a\",\n\t\t\t\t\"a7554c6f54904aa3e2e47f7685df8316b58705a4b559e5ccc6743515524deef1\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"e5bbb9ef360d0a501618f0067d36dceb75f5be9a620232aa9fd5139d0863fde5\",\n\t\t\tx: \"e5bbb9ef360d0a501618f0067d36dceb75f5be9a620232aa9fd5139d0863fde5\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"e6bcb5c3d63467d490bfa54fbbc6092a7248c25e11b248dc2964a6e15edb1457\",\n\t\t\tx: \"19434a3c29cb982b6f405ab04439f6d58db73da1ee4db723d69b591da124e7d8\",\n\t\t\tcases: []string{\n\t\t\t\t\"67119877832ab8f459a821656d8261f544a553b89ae4f25c52a97134b70f3426\",\n\t\t\t\t\"ffee02f5e649c07f0560eff1867ec7b32d0e595e9b1c0ea6e2a4fc70c97cd71f\",\n\t\t\t\t\"b5e0c189eb5b4bacd025b7444d74178be8d5246cfa4a9a207964a057ee969992\",\n\t\t\t\t\"5746e4591bf7f4c3044609ea372e908603975d279fdef8349f0b08d32f07619d\",\n\t\t\t\t\"98ee67887cd5470ba657de9a927d9e0abb5aac47651b0da3ad568eca48f0c809\",\n\t\t\t\t\"0011fd0a19b63f80fa9f100e7981384cd2f1a6a164e3f1591d5b038e36832510\",\n\t\t\t\t\"4a1f3e7614a4b4532fda48bbb28be874172adb9305b565df869b5fa71169629d\",\n\t\t\t\t\"a8b91ba6e4080b3cfbb9f615c8d16f79fc68a2d8602107cb60f4f72bd0f89a92\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"f28fba64af766845eb2f4302456e2b9f8d80affe57e7aae42738d7cddb1c2ce6\",\n\t\t\tx: \"f28fba64af766845eb2f4302456e2b9f8d80affe57e7aae42738d7cddb1c2ce6\",\n\t\t\tcases: []string{\n\t\t\t\t\"4f867ad8bb3d840409d26b67307e62100153273f72fa4b7484becfa14ebe7408\",\n\t\t\t\t\"5bbc4f59e452cc5f22a99144b10ce8989a89a995ec3cea1c91ae10e8f721bb5d\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"b079852744c27bfbf62d9498cf819deffeacd8c08d05b48b7b41305db1418827\",\n\t\t\t\t\"a443b0a61bad33a0dd566ebb4ef317676576566a13c315e36e51ef1608de40d2\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"f455605bc85bf48e3a908c31023faf98381504c6c6d3aeb9ede55f8dd528924d\",\n\t\t\tx: \"d31fbcd5cdb798f6c00db6692f8fe8967fa9c79dd10958f4a194f01374905e99\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"0c00c5715b56fe632d814ad8a77f8e66628ea47a6116834f8c1218f3a03cbd50\",\n\t\t\t\t\"df88e44fac84fa52df4d59f48819f18f6a8cd4151d162afaf773166f57c7ff46\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"f3ff3a8ea4a9019cd27eb527588071999d715b859ee97cb073ede70b5fc33edf\",\n\t\t\t\t\"20771bb0537b05ad20b2a60b77e60e7095732beae2e9d505088ce98fa837fce9\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"f58cd4d9830bad322699035e8246007d4be27e19b6f53621317b4f309b3daa9d\",\n\t\t\tx: \"78ec2b3dc0948de560148bbc7c6dc9633ad5df70a5a5750cbed721804f082a3b\",\n\t\t\tcases: []string{\n\t\t\t\t\"6c4c580b76c7594043569f9dae16dc2801c16a1fbe12860881b75f8ef929bce5\",\n\t\t\t\t\"94231355e7385c5f25ca436aa64191471aea4393d6e86ab7a35fe2afacaefd0d\",\n\t\t\t\t\"dff2a1951ada6db574df834048149da3397a75b829abf58c7e69db1b41ac0989\",\n\t\t\t\t\"a52b66d3c907035548028bf804711bf422aba95f1a666fc86f4648e05f29caae\",\n\t\t\t\t\"93b3a7f48938a6bfbca9606251e923d7fe3e95e041ed79f77e48a07006d63f4a\",\n\t\t\t\t\"6bdcecaa18c7a3a0da35bc9559be6eb8e515bc6c291795485ca01d4f5350ff22\",\n\t\t\t\t\"200d5e6ae525924a8b207cbfb7eb625cc6858a47d6540a73819624e3be53f2a6\",\n\t\t\t\t\"5ad4992c36f8fcaab7fd7407fb8ee40bdd5456a0e599903790b9b71ea0d63181\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tu: \"fd7d912a40f182a3588800d69ebfb5048766da206fd7ebc8d2436c81cbef6421\",\n\t\t\tx: \"8d37c862054debe731694536ff46b273ec122b35a9bf1445ac3c4ff9f262c952\",\n\t\t\tcases: []string{\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t\t\"\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tuVal := setHex(test.u).Normalize()\n\t\txVal := setHex(test.x).Normalize()\n\n\t\t// Loop through each individual case in the list of cases and ensure\n\t\t// that the correct t-value is calculated.\n\t\tfor caseNum, expTString := range test.cases {\n\t\t\ttVal := XSwiftECInv(uVal, xVal, caseNum)\n\n\t\t\tif tVal == nil {\n\t\t\t\tif expTString != \"\" {\n\t\t\t\t\tt.Fatalf(\"t value different than expected\")\n\t\t\t\t}\n\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\texpectedT := setHex(expTString)\n\n\t\t\tif !tVal.Equals(expectedT) {\n\t\t\t\tt.Fatalf(\"t value different than expected\")\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcec/error.go",
    "content": "// Copyright (c) 2013-2021 The btcsuite developers\n// Copyright (c) 2015-2021 The Decred developers\n\npackage btcec\n\nimport (\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// Error identifies an error related to public key cryptography using a\n// sec256k1 curve. It has full support for errors.Is and errors.As, so the\n// caller can ascertain the specific reason for the error by checking the\n// underlying error.\ntype Error = secp.Error\n\n// ErrorKind identifies a kind of error. It has full support for errors.Is and\n// errors.As, so the caller can directly check against an error kind when\n// determining the reason for an error.\ntype ErrorKind = secp.ErrorKind\n\n// makeError creates an secp.Error given a set of arguments.\nfunc makeError(kind ErrorKind, desc string) Error {\n\treturn Error{Err: kind, Description: desc}\n}\n"
  },
  {
    "path": "btcec/field.go",
    "content": "package btcec\n\nimport secp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n\n// FieldVal implements optimized fixed-precision arithmetic over the secp256k1\n// finite field. This means all arithmetic is performed modulo\n// '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'.\n//\n// WARNING: Since it is so important for the field arithmetic to be extremely\n// fast for high performance crypto, this type does not perform any validation\n// of documented preconditions where it ordinarily would. As a result, it is\n// IMPERATIVE for callers to understand some key concepts that are described\n// below and ensure the methods are called with the necessary preconditions\n// that each method is documented with. For example, some methods only give the\n// correct result if the field value is normalized and others require the field\n// values involved to have a maximum magnitude and THERE ARE NO EXPLICIT CHECKS\n// TO ENSURE THOSE PRECONDITIONS ARE SATISFIED. This does, unfortunately, make\n// the type more difficult to use correctly and while I typically prefer to\n// ensure all state and input is valid for most code, this is a bit of an\n// exception because those extra checks really add up in what ends up being\n// critical hot paths.\n//\n// The first key concept when working with this type is normalization. In order\n// to avoid the need to propagate a ton of carries, the internal representation\n// provides additional overflow bits for each word of the overall 256-bit\n// value.  This means that there are multiple internal representations for the\n// same value and, as a result, any methods that rely on comparison of the\n// value, such as equality and oddness determination, require the caller to\n// provide a normalized value.\n//\n// The second key concept when working with this type is magnitude. As\n// previously mentioned, the internal representation provides additional\n// overflow bits which means that the more math operations that are performed\n// on the field value between normalizations, the more those overflow bits\n// accumulate. The magnitude is effectively that maximum possible number of\n// those overflow bits that could possibly be required as a result of a given\n// operation. Since there are only a limited number of overflow bits available,\n// this implies that the max possible magnitude MUST be tracked by the caller\n// and the caller MUST normalize the field value if a given operation would\n// cause the magnitude of the result to exceed the max allowed value.\n//\n// IMPORTANT: The max allowed magnitude of a field value is 64.\ntype FieldVal = secp.FieldVal\n"
  },
  {
    "path": "btcec/field_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Copyright (c) 2013-2016 Dave Collins\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcec\n\nimport (\n\t\"math/rand\"\n\n\t\"encoding/hex\"\n\t\"testing\"\n)\n\n// TestIsZero ensures that checking if a field IsZero works as expected.\nfunc TestIsZero(t *testing.T) {\n\tf := new(FieldVal)\n\tif !f.IsZero() {\n\t\tt.Errorf(\"new field value is not zero - got %v (rawints %x)\", f,\n\t\t\tf.String())\n\t}\n\n\tf.SetInt(1)\n\tif f.IsZero() {\n\t\tt.Errorf(\"field claims it's zero when it's not - got %v \"+\n\t\t\t\"(raw rawints %x)\", f, f.String())\n\t}\n\n\tf.Zero()\n\tif !f.IsZero() {\n\t\tt.Errorf(\"field claims it's not zero when it is - got %v \"+\n\t\t\t\"(raw rawints %x)\", f, f.String())\n\t}\n}\n\n// TestStringer ensures the stringer returns the appropriate hex string.\nfunc TestStringer(t *testing.T) {\n\ttests := []struct {\n\t\tin       string\n\t\texpected string\n\t}{\n\t\t{\"0\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"1\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"a\", \"000000000000000000000000000000000000000000000000000000000000000a\"},\n\t\t{\"b\", \"000000000000000000000000000000000000000000000000000000000000000b\"},\n\t\t{\"c\", \"000000000000000000000000000000000000000000000000000000000000000c\"},\n\t\t{\"d\", \"000000000000000000000000000000000000000000000000000000000000000d\"},\n\t\t{\"e\", \"000000000000000000000000000000000000000000000000000000000000000e\"},\n\t\t{\"f\", \"000000000000000000000000000000000000000000000000000000000000000f\"},\n\t\t{\"f0\", \"00000000000000000000000000000000000000000000000000000000000000f0\"},\n\t\t// 2^26-1\n\t\t{\n\t\t\t\"3ffffff\",\n\t\t\t\"0000000000000000000000000000000000000000000000000000000003ffffff\",\n\t\t},\n\t\t// 2^32-1\n\t\t{\n\t\t\t\"ffffffff\",\n\t\t\t\"00000000000000000000000000000000000000000000000000000000ffffffff\",\n\t\t},\n\t\t// 2^64-1\n\t\t{\n\t\t\t\"ffffffffffffffff\",\n\t\t\t\"000000000000000000000000000000000000000000000000ffffffffffffffff\",\n\t\t},\n\t\t// 2^96-1\n\t\t{\n\t\t\t\"ffffffffffffffffffffffff\",\n\t\t\t\"0000000000000000000000000000000000000000ffffffffffffffffffffffff\",\n\t\t},\n\t\t// 2^128-1\n\t\t{\n\t\t\t\"ffffffffffffffffffffffffffffffff\",\n\t\t\t\"00000000000000000000000000000000ffffffffffffffffffffffffffffffff\",\n\t\t},\n\t\t// 2^160-1\n\t\t{\n\t\t\t\"ffffffffffffffffffffffffffffffffffffffff\",\n\t\t\t\"000000000000000000000000ffffffffffffffffffffffffffffffffffffffff\",\n\t\t},\n\t\t// 2^192-1\n\t\t{\n\t\t\t\"ffffffffffffffffffffffffffffffffffffffffffffffff\",\n\t\t\t\"0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff\",\n\t\t},\n\t\t// 2^224-1\n\t\t{\n\t\t\t\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\",\n\t\t\t\"00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\",\n\t\t},\n\t\t// 2^256-4294968273 (the btcec prime, so should result in 0)\n\t\t{\n\t\t\t\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\t\t\"0000000000000000000000000000000000000000000000000000000000000000\",\n\t\t},\n\t\t// 2^256-4294968274 (the secp256k1 prime+1, so should result in 1)\n\t\t{\n\t\t\t\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30\",\n\t\t\t\"0000000000000000000000000000000000000000000000000000000000000001\",\n\t\t},\n\n\t\t// Invalid hex\n\t\t{\"g\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"1h\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"i1\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tf := setHex(test.in)\n\t\tresult := f.String()\n\t\tif result != test.expected {\n\t\t\tt.Errorf(\"FieldVal.String #%d wrong result\\ngot: %v\\n\"+\n\t\t\t\t\"want: %v\", i, result, test.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestNormalize ensures that normalizing the internal field words works as\n// expected.\nfunc TestNormalize(t *testing.T) {\n\ttests := []struct {\n\t\traw        [10]uint32 // Intentionally denormalized value\n\t\tnormalized [10]uint32 // Normalized form of the raw value\n\t}{\n\t\t{\n\t\t\t[10]uint32{0x00000005, 0, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x00000005, 0, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^26\n\t\t{\n\t\t\t[10]uint32{0x04000000, 0x0, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x00000000, 0x1, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^26 + 1\n\t\t{\n\t\t\t[10]uint32{0x04000001, 0x0, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x00000001, 0x1, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^32 - 1\n\t\t{\n\t\t\t[10]uint32{0xffffffff, 0x00, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x03ffffff, 0x3f, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^32\n\t\t{\n\t\t\t[10]uint32{0x04000000, 0x3f, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x00000000, 0x40, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^32 + 1\n\t\t{\n\t\t\t[10]uint32{0x04000001, 0x3f, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x00000001, 0x40, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^64 - 1\n\t\t{\n\t\t\t[10]uint32{0xffffffff, 0xffffffc0, 0xfc0, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x03ffffff, 0x03ffffff, 0xfff, 0, 0, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^64\n\t\t{\n\t\t\t[10]uint32{0x04000000, 0x03ffffff, 0x0fff, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x00000000, 0x00000000, 0x1000, 0, 0, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^64 + 1\n\t\t{\n\t\t\t[10]uint32{0x04000001, 0x03ffffff, 0x0fff, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x00000001, 0x00000000, 0x1000, 0, 0, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^96 - 1\n\t\t{\n\t\t\t[10]uint32{0xffffffff, 0xffffffc0, 0xffffffc0, 0x3ffc0, 0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x03ffffff, 0x03ffffff, 0x03ffffff, 0x3ffff, 0, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^96\n\t\t{\n\t\t\t[10]uint32{0x04000000, 0x03ffffff, 0x03ffffff, 0x3ffff, 0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x00000000, 0x00000000, 0x00000000, 0x40000, 0, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^128 - 1\n\t\t{\n\t\t\t[10]uint32{0xffffffff, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffc0, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0xffffff, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^128\n\t\t{\n\t\t\t[10]uint32{0x04000000, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x0ffffff, 0, 0, 0, 0, 0},\n\t\t\t[10]uint32{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1000000, 0, 0, 0, 0, 0},\n\t\t},\n\t\t// 2^256 - 4294968273 (secp256k1 prime)\n\t\t{\n\t\t\t[10]uint32{0xfffffc2f, 0xffffff80, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0x3fffc0},\n\t\t\t[10]uint32{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000},\n\t\t},\n\t\t// Prime larger than P where both first and second words are larger\n\t\t// than P's first and second words\n\t\t{\n\t\t\t[10]uint32{0xfffffc30, 0xffffff86, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0x3fffc0},\n\t\t\t[10]uint32{0x00000001, 0x00000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000},\n\t\t},\n\t\t// Prime larger than P where only the second word is larger\n\t\t// than P's second words.\n\t\t{\n\t\t\t[10]uint32{0xfffffc2a, 0xffffff87, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0x3fffc0},\n\t\t\t[10]uint32{0x03fffffb, 0x00000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000},\n\t\t},\n\t\t// 2^256 - 1\n\t\t{\n\t\t\t[10]uint32{0xffffffff, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0xffffffc0, 0x3fffc0},\n\t\t\t[10]uint32{0x000003d0, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000},\n\t\t},\n\t\t// Prime with field representation such that the initial\n\t\t// reduction does not result in a carry to bit 256.\n\t\t//\n\t\t// 2^256 - 4294968273 (secp256k1 prime)\n\t\t{\n\t\t\t[10]uint32{0x03fffc2f, 0x03ffffbf, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x003fffff},\n\t\t\t[10]uint32{0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},\n\t\t},\n\t\t// Prime larger than P that reduces to a value which is still\n\t\t// larger than P when it has a magnitude of 1 due to its first\n\t\t// word and does not result in a carry to bit 256.\n\t\t//\n\t\t// 2^256 - 4294968272 (secp256k1 prime + 1)\n\t\t{\n\t\t\t[10]uint32{0x03fffc30, 0x03ffffbf, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x003fffff},\n\t\t\t[10]uint32{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},\n\t\t},\n\t\t// Prime larger than P that reduces to a value which is still\n\t\t// larger than P when it has a magnitude of 1 due to its second\n\t\t// word and does not result in a carry to bit 256.\n\t\t//\n\t\t// 2^256 - 4227859409 (secp256k1 prime + 0x4000000)\n\t\t{\n\t\t\t[10]uint32{0x03fffc2f, 0x03ffffc0, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x003fffff},\n\t\t\t[10]uint32{0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},\n\t\t},\n\t\t// Prime larger than P that reduces to a value which is still\n\t\t// larger than P when it has a magnitude of 1 due to a carry to\n\t\t// bit 256, but would not be without the carry.  These values\n\t\t// come from the fact that P is 2^256 - 4294968273 and 977 is\n\t\t// the low order word in the internal field representation.\n\t\t//\n\t\t// 2^256 * 5 - ((4294968273 - (977+1)) * 4)\n\t\t{\n\t\t\t[10]uint32{0x03ffffff, 0x03fffeff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x0013fffff},\n\t\t\t[10]uint32{0x00001314, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000000},\n\t\t},\n\t\t// Prime larger than P that reduces to a value which is still\n\t\t// larger than P when it has a magnitude of 1 due to both a\n\t\t// carry to bit 256 and the first word.\n\t\t{\n\t\t\t[10]uint32{0x03fffc30, 0x03ffffbf, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x07ffffff, 0x003fffff},\n\t\t\t[10]uint32{0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001},\n\t\t},\n\t\t// Prime larger than P that reduces to a value which is still\n\t\t// larger than P when it has a magnitude of 1 due to both a\n\t\t// carry to bit 256 and the second word.\n\t\t//\n\t\t{\n\t\t\t[10]uint32{0x03fffc2f, 0x03ffffc0, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x3ffffff, 0x07ffffff, 0x003fffff},\n\t\t\t[10]uint32{0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000, 0x00000000, 0x00000001},\n\t\t},\n\t\t// Prime larger than P that reduces to a value which is still\n\t\t// larger than P when it has a magnitude of 1 due to a carry to\n\t\t// bit 256 and the first and second words.\n\t\t//\n\t\t{\n\t\t\t[10]uint32{0x03fffc30, 0x03ffffc0, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff, 0x07ffffff, 0x003fffff},\n\t\t\t[10]uint32{0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor range tests {\n\t\t// TODO(roasbeef): can't access internal state\n\t\t/*f := new(FieldVal)\n\t\tf.n = test.raw\n\t\tf.Normalize()\n\t\tif !reflect.DeepEqual(f.n, test.normalized) {\n\t\t\tt.Errorf(\"FieldVal.Normalize #%d wrong result\\n\"+\n\t\t\t\t\"got: %x\\nwant: %x\", i, f.n, test.normalized)\n\t\t\tcontinue\n\t\t}*/\n\t}\n}\n\n// TestIsOdd ensures that checking if a field value IsOdd works as expected.\nfunc TestIsOdd(t *testing.T) {\n\ttests := []struct {\n\t\tin       string // hex encoded value\n\t\texpected bool   // expected oddness\n\t}{\n\t\t{\"0\", false},\n\t\t{\"1\", true},\n\t\t{\"2\", false},\n\t\t// 2^32 - 1\n\t\t{\"ffffffff\", true},\n\t\t// 2^64 - 2\n\t\t{\"fffffffffffffffe\", false},\n\t\t// secp256k1 prime\n\t\t{\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\", true},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tf := setHex(test.in)\n\t\tresult := f.IsOdd()\n\t\tif result != test.expected {\n\t\t\tt.Errorf(\"FieldVal.IsOdd #%d wrong result\\n\"+\n\t\t\t\t\"got: %v\\nwant: %v\", i, result, test.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestEquals ensures that checking two field values for equality via Equals\n// works as expected.\nfunc TestEquals(t *testing.T) {\n\ttests := []struct {\n\t\tin1      string // hex encoded value\n\t\tin2      string // hex encoded value\n\t\texpected bool   // expected equality\n\t}{\n\t\t{\"0\", \"0\", true},\n\t\t{\"0\", \"1\", false},\n\t\t{\"1\", \"0\", false},\n\t\t// 2^32 - 1 == 2^32 - 1?\n\t\t{\"ffffffff\", \"ffffffff\", true},\n\t\t// 2^64 - 1 == 2^64 - 2?\n\t\t{\"ffffffffffffffff\", \"fffffffffffffffe\", false},\n\t\t// 0 == prime (mod prime)?\n\t\t{\"0\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\", true},\n\t\t// 1 == prime+1 (mod prime)?\n\t\t{\"1\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30\", true},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tf := setHex(test.in1).Normalize()\n\t\tf2 := setHex(test.in2).Normalize()\n\t\tresult := f.Equals(f2)\n\t\tif result != test.expected {\n\t\t\tt.Errorf(\"FieldVal.Equals #%d wrong result\\n\"+\n\t\t\t\t\"got: %v\\nwant: %v\", i, result, test.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestNegate ensures that negating field values via Negate works as expected.\nfunc TestNegate(t *testing.T) {\n\ttests := []struct {\n\t\tin       string // hex encoded value\n\t\texpected string // expected hex encoded value\n\t}{\n\t\t// secp256k1 prime (aka 0)\n\t\t{\"0\", \"0\"},\n\t\t{\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\", \"0\"},\n\t\t{\"0\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\"},\n\t\t// secp256k1 prime-1\n\t\t{\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\", \"1\"},\n\t\t{\"1\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\"},\n\t\t// secp256k1 prime-2\n\t\t{\"2\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d\"},\n\t\t{\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d\", \"2\"},\n\t\t// Random sampling\n\t\t{\n\t\t\t\"b3d9aac9c5e43910b4385b53c7e78c21d4cd5f8e683c633aed04c233efc2e120\",\n\t\t\t\"4c2655363a1bc6ef4bc7a4ac381873de2b32a07197c39cc512fb3dcb103d1b0f\",\n\t\t},\n\t\t{\n\t\t\t\"f8a85984fee5a12a7c8dd08830d83423c937d77c379e4a958e447a25f407733f\",\n\t\t\t\"757a67b011a5ed583722f77cf27cbdc36c82883c861b56a71bb85d90bf888f0\",\n\t\t},\n\t\t{\n\t\t\t\"45ee6142a7fda884211e93352ed6cb2807800e419533be723a9548823ece8312\",\n\t\t\t\"ba119ebd5802577bdee16ccad12934d7f87ff1be6acc418dc56ab77cc131791d\",\n\t\t},\n\t\t{\n\t\t\t\"53c2a668f07e411a2e473e1c3b6dcb495dec1227af27673761d44afe5b43d22b\",\n\t\t\t\"ac3d59970f81bee5d1b8c1e3c49234b6a213edd850d898c89e2bb500a4bc2a04\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tf := setHex(test.in).Normalize()\n\t\texpected := setHex(test.expected).Normalize()\n\t\tresult := f.Negate(1).Normalize()\n\t\tif !result.Equals(expected) {\n\t\t\tt.Errorf(\"FieldVal.Negate #%d wrong result\\n\"+\n\t\t\t\t\"got: %v\\nwant: %v\", i, result, expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestFieldAddInt ensures that adding an integer to field values via AddInt\n// works as expected.\nfunc TestFieldAddInt(t *testing.T) {\n\ttests := []struct {\n\t\tname     string // test description\n\t\tin1      string // hex encoded value\n\t\tin2      uint16 // unsigned integer to add to the value above\n\t\texpected string // expected hex encoded value\n\t}{{\n\t\tname:     \"zero + one\",\n\t\tin1:      \"0\",\n\t\tin2:      1,\n\t\texpected: \"1\",\n\t}, {\n\t\tname:     \"one + zero\",\n\t\tin1:      \"1\",\n\t\tin2:      0,\n\t\texpected: \"1\",\n\t}, {\n\t\tname:     \"one + one\",\n\t\tin1:      \"1\",\n\t\tin2:      1,\n\t\texpected: \"2\",\n\t}, {\n\t\tname:     \"secp256k1 prime-1 + 1\",\n\t\tin1:      \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\",\n\t\tin2:      1,\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"secp256k1 prime + 1\",\n\t\tin1:      \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\tin2:      1,\n\t\texpected: \"1\",\n\t}, {\n\t\tname:     \"random sampling #1\",\n\t\tin1:      \"ff95ad9315aff04ab4af0ce673620c7145dc85d03bab5ba4b09ca2c4dec2d6c1\",\n\t\tin2:      0x10f,\n\t\texpected: \"ff95ad9315aff04ab4af0ce673620c7145dc85d03bab5ba4b09ca2c4dec2d7d0\",\n\t}, {\n\t\tname:     \"random sampling #2\",\n\t\tin1:      \"44bdae6b772e7987941f1ba314e6a5b7804a4c12c00961b57d20f41deea9cecf\",\n\t\tin2:      0x3196,\n\t\texpected: \"44bdae6b772e7987941f1ba314e6a5b7804a4c12c00961b57d20f41deeaa0065\",\n\t}, {\n\t\tname:     \"random sampling #3\",\n\t\tin1:      \"88c3ecae67b591935fb1f6a9499c35315ffad766adca665c50b55f7105122c9c\",\n\t\tin2:      0x966f,\n\t\texpected: \"88c3ecae67b591935fb1f6a9499c35315ffad766adca665c50b55f710512c30b\",\n\t}, {\n\t\tname:     \"random sampling #4\",\n\t\tin1:      \"8523e9edf360ca32a95aae4e57fcde5a542b471d08a974d94ea0ee09a015e2a6\",\n\t\tin2:      0xc54,\n\t\texpected: \"8523e9edf360ca32a95aae4e57fcde5a542b471d08a974d94ea0ee09a015eefa\",\n\t}}\n\n\tfor _, test := range tests {\n\t\tf := setHex(test.in1).Normalize()\n\t\texpected := setHex(test.expected).Normalize()\n\t\tresult := f.AddInt(test.in2).Normalize()\n\t\tif !result.Equals(expected) {\n\t\t\tt.Errorf(\"%s: wrong result -- got: %v -- want: %v\", test.name,\n\t\t\t\tresult, expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestFieldAdd ensures that adding two field values together via Add and Add2\n// works as expected.\nfunc TestFieldAdd(t *testing.T) {\n\ttests := []struct {\n\t\tname     string // test description\n\t\tin1      string // first hex encoded value\n\t\tin2      string // second hex encoded value to add\n\t\texpected string // expected hex encoded value\n\t}{{\n\t\tname:     \"zero + one\",\n\t\tin1:      \"0\",\n\t\tin2:      \"1\",\n\t\texpected: \"1\",\n\t}, {\n\t\tname:     \"one + zero\",\n\t\tin1:      \"1\",\n\t\tin2:      \"0\",\n\t\texpected: \"1\",\n\t}, {\n\t\tname:     \"secp256k1 prime-1 + 1\",\n\t\tin1:      \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\",\n\t\tin2:      \"1\",\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"secp256k1 prime + 1\",\n\t\tin1:      \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\tin2:      \"1\",\n\t\texpected: \"1\",\n\t}, {\n\t\tname:     \"random sampling #1\",\n\t\tin1:      \"2b2012f975404e5065b4292fb8bed0a5d315eacf24c74d8b27e73bcc5430edcc\",\n\t\tin2:      \"2c3cefa4e4753e8aeec6ac4c12d99da4d78accefda3b7885d4c6bab46c86db92\",\n\t\texpected: \"575d029e59b58cdb547ad57bcb986e4aaaa0b7beff02c610fcadf680c0b7c95e\",\n\t}, {\n\t\tname:     \"random sampling #2\",\n\t\tin1:      \"8131e8722fe59bb189692b96c9f38de92885730f1dd39ab025daffb94c97f79c\",\n\t\tin2:      \"ff5454b765f0aab5f0977dcc629becc84cabeb9def48e79c6aadb2622c490fa9\",\n\t\texpected: \"80863d2995d646677a00a9632c8f7ab175315ead0d1c824c9088b21c78e10b16\",\n\t}, {\n\t\tname:     \"random sampling #3\",\n\t\tin1:      \"c7c95e93d0892b2b2cdd77e80eb646ea61be7a30ac7e097e9f843af73fad5c22\",\n\t\tin2:      \"3afe6f91a74dfc1c7f15c34907ee981656c37236d946767dd53ccad9190e437c\",\n\t\texpected: \"2c7ce2577d72747abf33b3116a4df00b881ec6785c47ffc74c105d158bba36f\",\n\t}, {\n\t\tname:     \"random sampling #4\",\n\t\tin1:      \"fd1c26f6a23381e5d785ba889494ec059369b888ad8431cd67d8c934b580dbe1\",\n\t\tin2:      \"a475aa5a31dcca90ef5b53c097d9133d6b7117474b41e7877bb199590fc0489c\",\n\t\texpected: \"a191d150d4104c76c6e10e492c6dff42fedacfcff8c61954e38a628ec541284e\",\n\t}, {\n\t\tname:     \"random sampling #5\",\n\t\tin1:      \"ad82b8d1cc136e23e9fd77fe2c7db1fe5a2ecbfcbde59ab3529758334f862d28\",\n\t\tin2:      \"4d6a4e95d6d61f4f46b528bebe152d408fd741157a28f415639347a84f6f574b\",\n\t\texpected: \"faed0767a2e98d7330b2a0bcea92df3eea060d12380e8ec8b62a9fdb9ef58473\",\n\t}, {\n\t\tname:     \"random sampling #6\",\n\t\tin1:      \"f3f43a2540054a86e1df98547ec1c0e157b193e5350fb4a3c3ea214b228ac5e7\",\n\t\tin2:      \"25706572592690ea3ddc951a1b48b504a4c83dc253756e1b96d56fdfb3199522\",\n\t\texpected: \"19649f97992bdb711fbc2d6e9a0a75e5fc79d1a7888522bf5abf912bd5a45eda\",\n\t}, {\n\t\tname:     \"random sampling #7\",\n\t\tin1:      \"6915bb94eef13ff1bb9b2633d997e13b9b1157c713363cc0e891416d6734f5b8\",\n\t\tin2:      \"11f90d6ac6fe1c4e8900b1c85fb575c251ec31b9bc34b35ada0aea1c21eded22\",\n\t\texpected: \"7b0ec8ffb5ef5c40449bd7fc394d56fdecfd8980cf6af01bc29c2b898922e2da\",\n\t}, {\n\t\tname:     \"random sampling #8\",\n\t\tin1:      \"48b0c9eae622eed9335b747968544eb3e75cb2dc8128388f948aa30f88cabde4\",\n\t\tin2:      \"0989882b52f85f9d524a3a3061a0e01f46d597839d2ba637320f4b9510c8d2d5\",\n\t\texpected: \"523a5216391b4e7685a5aea9c9f52ed32e324a601e53dec6c699eea4999390b9\",\n\t}}\n\n\tfor _, test := range tests {\n\t\t// Parse test hex.\n\t\tf1 := setHex(test.in1).Normalize()\n\t\tf2 := setHex(test.in2).Normalize()\n\t\texpected := setHex(test.expected).Normalize()\n\n\t\t// Ensure adding the two values with the result going to another\n\t\t// variable produces the expected result.\n\t\tresult := new(FieldVal).Add2(f1, f2).Normalize()\n\t\tif !result.Equals(expected) {\n\t\t\tt.Errorf(\"%s: unexpected result\\ngot: %v\\nwant: %v\", test.name,\n\t\t\t\tresult, expected)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure adding the value to an existing field value produces the\n\t\t// expected result.\n\t\tf1.Add(f2).Normalize()\n\t\tif !f1.Equals(expected) {\n\t\t\tt.Errorf(\"%s: unexpected result\\ngot: %v\\nwant: %v\", test.name,\n\t\t\t\tf1, expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestFieldMulInt ensures that multiplying an integer to field values via\n// MulInt works as expected.\nfunc TestFieldMulInt(t *testing.T) {\n\ttests := []struct {\n\t\tname     string // test description\n\t\tin1      string // hex encoded value\n\t\tin2      uint8  // unsigned integer to multiply with value above\n\t\texpected string // expected hex encoded value\n\t}{{\n\t\tname:     \"zero * zero\",\n\t\tin1:      \"0\",\n\t\tin2:      0,\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"one * zero\",\n\t\tin1:      \"1\",\n\t\tin2:      0,\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"zero * one\",\n\t\tin1:      \"0\",\n\t\tin2:      1,\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"one * one\",\n\t\tin1:      \"1\",\n\t\tin2:      1,\n\t\texpected: \"1\",\n\t}, {\n\t\tname:     \"secp256k1 prime-1 * 2\",\n\t\tin1:      \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\",\n\t\tin2:      2,\n\t\texpected: \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d\",\n\t}, {\n\t\tname:     \"secp256k1 prime * 3\",\n\t\tin1:      \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\tin2:      3,\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"secp256k1 prime-1 * 8\",\n\t\tin1:      \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\",\n\t\tin2:      8,\n\t\texpected: \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc27\",\n\t}, {\n\t\t// Random samples for first value.  The second value is limited\n\t\t// to 8 since that is the maximum int used in the elliptic curve\n\t\t// calculations.\n\t\tname:     \"random sampling #1\",\n\t\tin1:      \"b75674dc9180d306c692163ac5e089f7cef166af99645c0c23568ab6d967288a\",\n\t\tin2:      6,\n\t\texpected: \"4c06bd2b6904f228a76c8560a3433bced9a8681d985a2848d407404d186b0280\",\n\t}, {\n\t\tname:     \"random sampling #2\",\n\t\tin1:      \"54873298ac2b5ba8591c125ae54931f5ea72040aee07b208d6135476fb5b9c0e\",\n\t\tin2:      3,\n\t\texpected: \"fd9597ca048212f90b543710afdb95e1bf560c20ca17161a8239fd64f212d42a\",\n\t}, {\n\t\tname:     \"random sampling #3\",\n\t\tin1:      \"7c30fbd363a74c17e1198f56b090b59bbb6c8755a74927a6cba7a54843506401\",\n\t\tin2:      5,\n\t\texpected: \"6cf4eb20f2447c77657fccb172d38c0aa91ea4ac446dc641fa463a6b5091fba7\",\n\t}, {\n\t\tname:     \"random sampling #3\",\n\t\tin1:      \"fb4529be3e027a3d1587d8a500b72f2d312e3577340ef5175f96d113be4c2ceb\",\n\t\tin2:      8,\n\t\texpected: \"da294df1f013d1e8ac3ec52805b979698971abb9a077a8bafcb688a4f261820f\",\n\t}}\n\n\tfor _, test := range tests {\n\t\tf := setHex(test.in1).Normalize()\n\t\texpected := setHex(test.expected).Normalize()\n\t\tresult := f.MulInt(test.in2).Normalize()\n\t\tif !result.Equals(expected) {\n\t\t\tt.Errorf(\"%s: wrong result -- got: %v -- want: %v\", test.name,\n\t\t\t\tresult, expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestFieldMul ensures that multiplying two field values via Mul and Mul2 works\n// as expected.\nfunc TestFieldMul(t *testing.T) {\n\ttests := []struct {\n\t\tname     string // test description\n\t\tin1      string // first hex encoded value\n\t\tin2      string // second hex encoded value to multiply with\n\t\texpected string // expected hex encoded value\n\t}{{\n\t\tname:     \"zero * zero\",\n\t\tin1:      \"0\",\n\t\tin2:      \"0\",\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"one * zero\",\n\t\tin1:      \"1\",\n\t\tin2:      \"0\",\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"zero * one\",\n\t\tin1:      \"0\",\n\t\tin2:      \"1\",\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"one * one\",\n\t\tin1:      \"1\",\n\t\tin2:      \"1\",\n\t\texpected: \"1\",\n\t}, {\n\t\tname:     \"slightly over prime\",\n\t\tin1:      \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1ffff\",\n\t\tin2:      \"1000\",\n\t\texpected: \"1ffff3d1\",\n\t}, {\n\t\tname:     \"secp256k1 prime-1 * 2\",\n\t\tin1:      \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\",\n\t\tin2:      \"2\",\n\t\texpected: \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d\",\n\t}, {\n\t\tname:     \"secp256k1 prime * 3\",\n\t\tin1:      \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\tin2:      \"3\",\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"secp256k1 prime * 3\",\n\t\tin1:      \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\",\n\t\tin2:      \"8\",\n\t\texpected: \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc27\",\n\t}, {\n\t\tname:     \"random sampling #1\",\n\t\tin1:      \"cfb81753d5ef499a98ecc04c62cb7768c2e4f1740032946db1c12e405248137e\",\n\t\tin2:      \"58f355ad27b4d75fb7db0442452e732c436c1f7c5a7c4e214fa9cc031426a7d3\",\n\t\texpected: \"1018cd2d7c2535235b71e18db9cd98027386328d2fa6a14b36ec663c4c87282b\",\n\t}, {\n\t\tname:     \"random sampling #2\",\n\t\tin1:      \"26e9d61d1cdf3920e9928e85fa3df3e7556ef9ab1d14ec56d8b4fc8ed37235bf\",\n\t\tin2:      \"2dfc4bbe537afee979c644f8c97b31e58be5296d6dbc460091eae630c98511cf\",\n\t\texpected: \"da85f48da2dc371e223a1ae63bd30b7e7ee45ae9b189ac43ff357e9ef8cf107a\",\n\t}, {\n\t\tname:     \"random sampling #3\",\n\t\tin1:      \"5db64ed5afb71646c8b231585d5b2bf7e628590154e0854c4c29920b999ff351\",\n\t\tin2:      \"279cfae5eea5d09ade8e6a7409182f9de40981bc31c84c3d3dfe1d933f152e9a\",\n\t\texpected: \"2c78fbae91792dd0b157abe3054920049b1879a7cc9d98cfda927d83be411b37\",\n\t}, {\n\t\tname:     \"random sampling #4\",\n\t\tin1:      \"b66dfc1f96820b07d2bdbd559c19319a3a73c97ceb7b3d662f4fe75ecb6819e6\",\n\t\tin2:      \"bf774aba43e3e49eb63a6e18037d1118152568f1a3ac4ec8b89aeb6ff8008ae1\",\n\t\texpected: \"c4f016558ca8e950c21c3f7fc15f640293a979c7b01754ee7f8b3340d4902ebb\",\n\t}}\n\n\tfor _, test := range tests {\n\t\tf1 := setHex(test.in1).Normalize()\n\t\tf2 := setHex(test.in2).Normalize()\n\t\texpected := setHex(test.expected).Normalize()\n\n\t\t// Ensure multiplying the two values with the result going to another\n\t\t// variable produces the expected result.\n\t\tresult := new(FieldVal).Mul2(f1, f2).Normalize()\n\t\tif !result.Equals(expected) {\n\t\t\tt.Errorf(\"%s: unexpected result\\ngot: %v\\nwant: %v\", test.name,\n\t\t\t\tresult, expected)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure multiplying the value to an existing field value produces the\n\t\t// expected result.\n\t\tf1.Mul(f2).Normalize()\n\t\tif !f1.Equals(expected) {\n\t\t\tt.Errorf(\"%s: unexpected result\\ngot: %v\\nwant: %v\", test.name,\n\t\t\t\tf1, expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestFieldSquare ensures that squaring field values via Square and SqualVal\n// works as expected.\nfunc TestFieldSquare(t *testing.T) {\n\ttests := []struct {\n\t\tname     string // test description\n\t\tin       string // hex encoded value\n\t\texpected string // expected hex encoded value\n\t}{{\n\t\tname:     \"zero\",\n\t\tin:       \"0\",\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"secp256k1 prime (direct val in with 0 out)\",\n\t\tin:       \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\texpected: \"0\",\n\t}, {\n\t\tname:     \"secp256k1 prime (0 in with direct val out)\",\n\t\tin:       \"0\",\n\t\texpected: \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t}, {\n\t\tname:     \"secp256k1 prime - 1\",\n\t\tin:       \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\",\n\t\texpected: \"1\",\n\t}, {\n\t\tname:     \"secp256k1 prime - 2\",\n\t\tin:       \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d\",\n\t\texpected: \"4\",\n\t}, {\n\t\tname:     \"random sampling #1\",\n\t\tin:       \"b0ba920360ea8436a216128047aab9766d8faf468895eb5090fc8241ec758896\",\n\t\texpected: \"133896b0b69fda8ce9f648b9a3af38f345290c9eea3cbd35bafcadf7c34653d3\",\n\t}, {\n\t\tname:     \"random sampling #2\",\n\t\tin:       \"c55d0d730b1d0285a1599995938b042a756e6e8857d390165ffab480af61cbd5\",\n\t\texpected: \"cd81758b3f5877cbe7e5b0a10cebfa73bcbf0957ca6453e63ee8954ab7780bee\",\n\t}, {\n\t\tname:     \"random sampling #3\",\n\t\tin:       \"e89c1f9a70d93651a1ba4bca5b78658f00de65a66014a25544d3365b0ab82324\",\n\t\texpected: \"39ffc7a43e5dbef78fd5d0354fb82c6d34f5a08735e34df29da14665b43aa1f\",\n\t}, {\n\t\tname:     \"random sampling #4\",\n\t\tin:       \"7dc26186079d22bcbe1614aa20ae627e62d72f9be7ad1e99cac0feb438956f05\",\n\t\texpected: \"bf86bcfc4edb3d81f916853adfda80c07c57745b008b60f560b1912f95bce8ae\",\n\t}}\n\n\tfor _, test := range tests {\n\t\tf := setHex(test.in).Normalize()\n\t\texpected := setHex(test.expected).Normalize()\n\n\t\t// Ensure squaring the value with the result going to another variable\n\t\t// produces the expected result.\n\t\tresult := new(FieldVal).SquareVal(f).Normalize()\n\t\tif !result.Equals(expected) {\n\t\t\tt.Errorf(\"%s: unexpected result\\ngot: %v\\nwant: %v\", test.name,\n\t\t\t\tresult, expected)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure self squaring an existing field value produces the expected\n\t\t// result.\n\t\tf.Square().Normalize()\n\t\tif !f.Equals(expected) {\n\t\t\tt.Errorf(\"%s: unexpected result\\ngot: %v\\nwant: %v\", test.name,\n\t\t\t\tf, expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestInverse ensures that finding the multiplicative inverse via Inverse works\n// as expected.\nfunc TestInverse(t *testing.T) {\n\ttests := []struct {\n\t\tin       string // hex encoded value\n\t\texpected string // expected hex encoded value\n\t}{\n\t\t// secp256k1 prime (aka 0)\n\t\t{\"0\", \"0\"},\n\t\t{\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\", \"0\"},\n\t\t{\"0\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\"},\n\t\t// secp256k1 prime-1\n\t\t{\n\t\t\t\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\",\n\t\t\t\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\",\n\t\t},\n\t\t// secp256k1 prime-2\n\t\t{\n\t\t\t\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d\",\n\t\t\t\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffe17\",\n\t\t},\n\t\t// Random sampling\n\t\t{\n\t\t\t\"16fb970147a9acc73654d4be233cc48b875ce20a2122d24f073d29bd28805aca\",\n\t\t\t\"987aeb257b063df0c6d1334051c47092b6d8766c4bf10c463786d93f5bc54354\",\n\t\t},\n\t\t{\n\t\t\t\"69d1323ce9f1f7b3bd3c7320b0d6311408e30281e273e39a0d8c7ee1c8257919\",\n\t\t\t\"49340981fa9b8d3dad72de470b34f547ed9179c3953797d0943af67806f4bb6\",\n\t\t},\n\t\t{\n\t\t\t\"e0debf988ae098ecda07d0b57713e97c6d213db19753e8c95aa12a2fc1cc5272\",\n\t\t\t\"64f58077b68af5b656b413ea366863f7b2819f8d27375d9c4d9804135ca220c2\",\n\t\t},\n\t\t{\n\t\t\t\"dcd394f91f74c2ba16aad74a22bb0ed47fe857774b8f2d6c09e28bfb14642878\",\n\t\t\t\"fb848ec64d0be572a63c38fe83df5e7f3d032f60bf8c969ef67d36bf4ada22a9\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tf := setHex(test.in).Normalize()\n\t\texpected := setHex(test.expected).Normalize()\n\t\tresult := f.Inverse().Normalize()\n\t\tif !result.Equals(expected) {\n\t\t\tt.Errorf(\"FieldVal.Inverse #%d wrong result\\n\"+\n\t\t\t\t\"got: %v\\nwant: %v\", i, result, expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// randFieldVal returns a field value created from a random value generated by\n// the passed rng.\nfunc randFieldVal(t *testing.T, rng *rand.Rand) *FieldVal {\n\tt.Helper()\n\n\tvar buf [32]byte\n\tif _, err := rng.Read(buf[:]); err != nil {\n\t\tt.Fatalf(\"failed to read random: %v\", err)\n\t}\n\n\t// Create and return both a big integer and a field value.\n\tvar fv FieldVal\n\tfv.SetBytes(&buf)\n\treturn &fv\n}\n\n// TestFieldSquareRoot ensures that calculating the square root of field values\n// via SquareRootVal works as expected for edge cases.\nfunc TestFieldSquareRoot(t *testing.T) {\n\ttests := []struct {\n\t\tname  string // test description\n\t\tin    string // hex encoded value\n\t\tvalid bool   // whether or not the value has a square root\n\t\twant  string // expected hex encoded value\n\t}{{\n\t\tname:  \"secp256k1 prime (as 0 in and out)\",\n\t\tin:    \"0\",\n\t\tvalid: true,\n\t\twant:  \"0\",\n\t}, {\n\t\tname:  \"secp256k1 prime (direct val with 0 out)\",\n\t\tin:    \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t\tvalid: true,\n\t\twant:  \"0\",\n\t}, {\n\t\tname:  \"secp256k1 prime (as 0 in direct val out)\",\n\t\tin:    \"0\",\n\t\tvalid: true,\n\t\twant:  \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\",\n\t}, {\n\t\tname:  \"secp256k1 prime-1\",\n\t\tin:    \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e\",\n\t\tvalid: false,\n\t\twant:  \"0000000000000000000000000000000000000000000000000000000000000001\",\n\t}, {\n\t\tname:  \"secp256k1 prime-2\",\n\t\tin:    \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2d\",\n\t\tvalid: false,\n\t\twant:  \"210c790573632359b1edb4302c117d8a132654692c3feeb7de3a86ac3f3b53f7\",\n\t}, {\n\t\tname:  \"(secp256k1 prime-2)^2\",\n\t\tin:    \"0000000000000000000000000000000000000000000000000000000000000004\",\n\t\tvalid: true,\n\t\twant:  \"0000000000000000000000000000000000000000000000000000000000000002\",\n\t}, {\n\t\tname:  \"value 1\",\n\t\tin:    \"0000000000000000000000000000000000000000000000000000000000000001\",\n\t\tvalid: true,\n\t\twant:  \"0000000000000000000000000000000000000000000000000000000000000001\",\n\t}, {\n\t\tname:  \"value 2\",\n\t\tin:    \"0000000000000000000000000000000000000000000000000000000000000002\",\n\t\tvalid: true,\n\t\twant:  \"210c790573632359b1edb4302c117d8a132654692c3feeb7de3a86ac3f3b53f7\",\n\t}, {\n\t\tname:  \"random sampling 1\",\n\t\tin:    \"16fb970147a9acc73654d4be233cc48b875ce20a2122d24f073d29bd28805aca\",\n\t\tvalid: false,\n\t\twant:  \"6a27dcfca440cf7930a967be533b9620e397f122787c53958aaa7da7ad3d89a4\",\n\t}, {\n\t\tname:  \"square of random sampling 1\",\n\t\tin:    \"f4a8c3738ace0a1c3abf77737ae737f07687b5e24c07a643398298bd96893a18\",\n\t\tvalid: true,\n\t\twant:  \"e90468feb8565338c9ab2b41dcc33b7478a31df5dedd2db0f8c2d641d77fa165\",\n\t}, {\n\t\tname:  \"random sampling 2\",\n\t\tin:    \"69d1323ce9f1f7b3bd3c7320b0d6311408e30281e273e39a0d8c7ee1c8257919\",\n\t\tvalid: true,\n\t\twant:  \"61f4a7348274a52d75dfe176b8e3aaff61c1c833b6678260ba73def0fb2ad148\",\n\t}, {\n\t\tname:  \"random sampling 3\",\n\t\tin:    \"e0debf988ae098ecda07d0b57713e97c6d213db19753e8c95aa12a2fc1cc5272\",\n\t\tvalid: false,\n\t\twant:  \"6e1cc9c311d33d901670135244f994b1ea39501f38002269b34ce231750cfbac\",\n\t}, {\n\t\tname:  \"random sampling 4\",\n\t\tin:    \"dcd394f91f74c2ba16aad74a22bb0ed47fe857774b8f2d6c09e28bfb14642878\",\n\t\tvalid: true,\n\t\twant:  \"72b22fe6f173f8bcb21898806142ed4c05428601256eafce5d36c1b08fb82bab\",\n\t}}\n\n\tfor _, test := range tests {\n\t\tinput := setHex(test.in).Normalize()\n\t\twant := setHex(test.want).Normalize()\n\n\t\t// Calculate the square root and ensure the validity flag matches the\n\t\t// expected value.\n\t\tvar result FieldVal\n\t\tisValid := result.SquareRootVal(input)\n\t\tif isValid != test.valid {\n\t\t\tt.Errorf(\"%s: mismatched validity -- got %v, want %v\", test.name,\n\t\t\t\tisValid, test.valid)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the calculated result matches the expected value.\n\t\tresult.Normalize()\n\t\tif !result.Equals(want) {\n\t\t\tt.Errorf(\"%s: d wrong result\\ngot: %v\\nwant: %v\", test.name, result,\n\t\t\t\twant)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// hexToBytes converts the passed hex string into bytes and will panic if there\n// is an error.  This is only provided for the hard-coded constants so errors in\n// the source code can be detected. It will only (and must only) be called with\n// hard-coded values.\nfunc hexToBytes(s string) []byte {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn b\n}\n"
  },
  {
    "path": "btcec/fuzz_test.go",
    "content": "//go:build gofuzz || go1.18\n\n// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2022 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcec\n\nimport (\n\t\"encoding/hex\"\n\t\"testing\"\n)\n\nfunc FuzzParsePubKey(f *testing.F) {\n\t// 1. Seeds from pubkey tests.\n\tfor _, test := range pubKeyTests {\n\t\tif test.isValid {\n\t\t\tf.Add(test.key)\n\t\t}\n\t}\n\n\t// 2. Seeds from recovery tests.\n\tvar recoveryTestPubKeys = []string{\n\t\t\"04E32DF42865E97135ACFB65F3BAE71BDC86F4D49150AD6A440B6F15878109880A0A2B2667F7E725CEEA70C673093BF67663E0312623C8E091B13CF2C0F11EF652\",\n\t\t\"04A7640409AA2083FDAD38B2D8DE1263B2251799591D840653FB02DBBA503D7745FCB83D80E08A1E02896BE691EA6AFFB8A35939A646F1FC79052A744B1C82EDC3\",\n\t}\n\tfor _, pubKey := range recoveryTestPubKeys {\n\t\tseed, err := hex.DecodeString(pubKey)\n\t\tif err != nil {\n\t\t\tf.Fatal(err)\n\t\t}\n\t\tf.Add(seed)\n\t}\n\n\t// Now run the fuzzer.\n\tf.Fuzz(func(t *testing.T, input []byte) {\n\t\tkey, err := ParsePubKey(input)\n\t\tif key == nil && err == nil {\n\t\t\tpanic(\"key==nil && err==nil\")\n\t\t}\n\t\tif key != nil && err != nil {\n\t\t\tpanic(\"key!=nil yet err!=nil\")\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "btcec/go.mod",
    "content": "module github.com/btcsuite/btcd/btcec/v2\n\ngo 1.22\n\nrequire (\n\tgithub.com/btcsuite/btcd/chaincfg/chainhash v1.0.1\n\tgithub.com/davecgh/go-spew v1.1.1\n\tgithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1\n\tgithub.com/stretchr/testify v1.8.0\n)\n\nrequire (\n\tgithub.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "btcec/go.sum",
    "content": "github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=\ngithub.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=\ngithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=\ngithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "btcec/modnscalar.go",
    "content": "// Copyright (c) 2013-2021 The btcsuite developers\n// Copyright (c) 2015-2021 The Decred developers\n\npackage btcec\n\nimport (\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// ModNScalar implements optimized 256-bit constant-time fixed-precision\n// arithmetic over the secp256k1 group order. This means all arithmetic is\n// performed modulo:\n//\n//\t0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\n//\n// It only implements the arithmetic needed for elliptic curve operations,\n// however, the operations that are not implemented can typically be worked\n// around if absolutely needed.  For example, subtraction can be performed by\n// adding the negation.\n//\n// Should it be absolutely necessary, conversion to the standard library\n// math/big.Int can be accomplished by using the Bytes method, slicing the\n// resulting fixed-size array, and feeding it to big.Int.SetBytes.  However,\n// that should typically be avoided when possible as conversion to big.Ints\n// requires allocations, is not constant time, and is slower when working modulo\n// the group order.\ntype ModNScalar = secp.ModNScalar\n\n// NonceRFC6979 generates a nonce deterministically according to RFC 6979 using\n// HMAC-SHA256 for the hashing function.  It takes a 32-byte hash as an input\n// and returns a 32-byte nonce to be used for deterministic signing.  The extra\n// and version arguments are optional, but allow additional data to be added to\n// the input of the HMAC.  When provided, the extra data must be 32-bytes and\n// version must be 16 bytes or they will be ignored.\n//\n// Finally, the extraIterations parameter provides a method to produce a stream\n// of deterministic nonces to ensure the signing code is able to produce a nonce\n// that results in a valid signature in the extremely unlikely event the\n// original nonce produced results in an invalid signature (e.g. R == 0).\n// Signing code should start with 0 and increment it if necessary.\nfunc NonceRFC6979(privKey []byte, hash []byte, extra []byte, version []byte,\n\textraIterations uint32) *ModNScalar {\n\n\treturn secp.NonceRFC6979(privKey, hash, extra, version, extraIterations)\n}\n"
  },
  {
    "path": "btcec/privkey.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcec\n\nimport (\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// PrivateKey wraps an ecdsa.PrivateKey as a convenience mainly for signing\n// things with the private key without having to directly import the ecdsa\n// package.\ntype PrivateKey = secp.PrivateKey\n\n// PrivKeyFromBytes returns a private and public key for `curve' based on the\n// private key passed as an argument as a byte slice.\nfunc PrivKeyFromBytes(pk []byte) (*PrivateKey, *PublicKey) {\n\tprivKey := secp.PrivKeyFromBytes(pk)\n\n\treturn privKey, privKey.PubKey()\n}\n\n// NewPrivateKey is a wrapper for ecdsa.GenerateKey that returns a PrivateKey\n// instead of the normal ecdsa.PrivateKey.\nfunc NewPrivateKey() (*PrivateKey, error) {\n\treturn secp.GeneratePrivateKey()\n}\n\n// PrivKeyFromScalar instantiates a new private key from a scalar encoded as a\n// big integer.\nfunc PrivKeyFromScalar(key *ModNScalar) *PrivateKey {\n\treturn &PrivateKey{Key: *key}\n}\n\n// PrivKeyBytesLen defines the length in bytes of a serialized private key.\nconst PrivKeyBytesLen = 32\n"
  },
  {
    "path": "btcec/pubkey.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcec\n\nimport (\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// These constants define the lengths of serialized public keys.\nconst (\n\t// PubKeyBytesLenCompressed is the bytes length of a serialized compressed\n\t// public key.\n\tPubKeyBytesLenCompressed = 33\n)\n\nconst (\n\tpubkeyCompressed   byte = 0x2 // y_bit + x coord\n\tpubkeyUncompressed byte = 0x4 // x coord + y coord\n\tpubkeyHybrid       byte = 0x6 // y_bit + x coord + y coord\n)\n\n// IsCompressedPubKey returns true the passed serialized public key has\n// been encoded in compressed format, and false otherwise.\nfunc IsCompressedPubKey(pubKey []byte) bool {\n\t// The public key is only compressed if it is the correct length and\n\t// the format (first byte) is one of the compressed pubkey values.\n\treturn len(pubKey) == PubKeyBytesLenCompressed &&\n\t\t(pubKey[0]&^byte(0x1) == pubkeyCompressed)\n}\n\n// ParsePubKey parses a public key for a koblitz curve from a bytestring into a\n// ecdsa.Publickey, verifying that it is valid. It supports compressed,\n// uncompressed and hybrid signature formats.\nfunc ParsePubKey(pubKeyStr []byte) (*PublicKey, error) {\n\treturn secp.ParsePubKey(pubKeyStr)\n}\n\n// PublicKey is an ecdsa.PublicKey with additional functions to\n// serialize in uncompressed, compressed, and hybrid formats.\ntype PublicKey = secp.PublicKey\n\n// NewPublicKey instantiates a new public key with the given x and y\n// coordinates.\n//\n// It should be noted that, unlike ParsePubKey, since this accepts arbitrary x\n// and y coordinates, it allows creation of public keys that are not valid\n// points on the secp256k1 curve.  The IsOnCurve method of the returned instance\n// can be used to determine validity.\nfunc NewPublicKey(x, y *FieldVal) *PublicKey {\n\treturn secp.NewPublicKey(x, y)\n}\n\n// SerializedKey is a type for representing a public key in its compressed\n// serialized form.\n//\n// NOTE: This type is useful when using public keys as keys in maps.\ntype SerializedKey [PubKeyBytesLenCompressed]byte\n\n// ToPubKey returns the public key parsed from the serialized key.\nfunc (s SerializedKey) ToPubKey() (*PublicKey, error) {\n\treturn ParsePubKey(s[:])\n}\n\n// SchnorrSerialized returns the Schnorr serialized, x-only 32-byte\n// representation of the serialized key.\nfunc (s SerializedKey) SchnorrSerialized() [32]byte {\n\tvar serializedSchnorr [32]byte\n\tcopy(serializedSchnorr[:], s[1:])\n\treturn serializedSchnorr\n}\n\n// CopyBytes returns a copy of the underlying array as a byte slice.\nfunc (s SerializedKey) CopyBytes() []byte {\n\tc := make([]byte, PubKeyBytesLenCompressed)\n\tcopy(c, s[:])\n\n\treturn c\n}\n\n// ToSerialized serializes a public key into its compressed form.\nfunc ToSerialized(pubKey *PublicKey) SerializedKey {\n\tvar serialized SerializedKey\n\tcopy(serialized[:], pubKey.SerializeCompressed())\n\n\treturn serialized\n}\n"
  },
  {
    "path": "btcec/pubkey_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcec\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\ntype pubKeyTest struct {\n\tname    string\n\tkey     []byte\n\tformat  byte\n\tisValid bool\n}\n\nvar pubKeyTests = []pubKeyTest{\n\t// pubkey from bitcoin blockchain tx\n\t// 0437cd7f8525ceed2324359c2d0ba26006d92d85\n\t{\n\t\tname: \"uncompressed ok\",\n\t\tkey: []byte{0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a,\n\t\t\t0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e,\n\t\t\t0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca,\n\t\t\t0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0,\n\t\t\t0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64,\n\t\t\t0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9,\n\t\t\t0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56,\n\t\t\t0xb4, 0x12, 0xa3,\n\t\t},\n\t\tisValid: true,\n\t\tformat:  pubkeyUncompressed,\n\t},\n\t{\n\t\tname: \"uncompressed x changed\",\n\t\tkey: []byte{0x04, 0x15, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a,\n\t\t\t0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e,\n\t\t\t0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca,\n\t\t\t0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0,\n\t\t\t0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64,\n\t\t\t0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9,\n\t\t\t0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56,\n\t\t\t0xb4, 0x12, 0xa3,\n\t\t},\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"uncompressed y changed\",\n\t\tkey: []byte{0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a,\n\t\t\t0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e,\n\t\t\t0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca,\n\t\t\t0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0,\n\t\t\t0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64,\n\t\t\t0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9,\n\t\t\t0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56,\n\t\t\t0xb4, 0x12, 0xa4,\n\t\t},\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"uncompressed claims compressed\",\n\t\tkey: []byte{0x03, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a,\n\t\t\t0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e,\n\t\t\t0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca,\n\t\t\t0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0,\n\t\t\t0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64,\n\t\t\t0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9,\n\t\t\t0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56,\n\t\t\t0xb4, 0x12, 0xa3,\n\t\t},\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"uncompressed as hybrid ok\",\n\t\tkey: []byte{0x07, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a,\n\t\t\t0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e,\n\t\t\t0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca,\n\t\t\t0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0,\n\t\t\t0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64,\n\t\t\t0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9,\n\t\t\t0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56,\n\t\t\t0xb4, 0x12, 0xa3,\n\t\t},\n\t\tisValid: true,\n\t\tformat:  pubkeyHybrid,\n\t},\n\t{\n\t\tname: \"uncompressed as hybrid wrong\",\n\t\tkey: []byte{0x06, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a,\n\t\t\t0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e,\n\t\t\t0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca,\n\t\t\t0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0,\n\t\t\t0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64,\n\t\t\t0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9,\n\t\t\t0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56,\n\t\t\t0xb4, 0x12, 0xa3,\n\t\t},\n\t\tisValid: false,\n\t},\n\t// from tx 0b09c51c51ff762f00fb26217269d2a18e77a4fa87d69b3c363ab4df16543f20\n\t{\n\t\tname: \"compressed ok (ybit = 0)\",\n\t\tkey: []byte{0x02, 0xce, 0x0b, 0x14, 0xfb, 0x84, 0x2b, 0x1b,\n\t\t\t0xa5, 0x49, 0xfd, 0xd6, 0x75, 0xc9, 0x80, 0x75, 0xf1,\n\t\t\t0x2e, 0x9c, 0x51, 0x0f, 0x8e, 0xf5, 0x2b, 0xd0, 0x21,\n\t\t\t0xa9, 0xa1, 0xf4, 0x80, 0x9d, 0x3b, 0x4d,\n\t\t},\n\t\tisValid: true,\n\t\tformat:  pubkeyCompressed,\n\t},\n\t// from tx fdeb8e72524e8dab0da507ddbaf5f88fe4a933eb10a66bc4745bb0aa11ea393c\n\t{\n\t\tname: \"compressed ok (ybit = 1)\",\n\t\tkey: []byte{0x03, 0x26, 0x89, 0xc7, 0xc2, 0xda, 0xb1, 0x33,\n\t\t\t0x09, 0xfb, 0x14, 0x3e, 0x0e, 0x8f, 0xe3, 0x96, 0x34,\n\t\t\t0x25, 0x21, 0x88, 0x7e, 0x97, 0x66, 0x90, 0xb6, 0xb4,\n\t\t\t0x7f, 0x5b, 0x2a, 0x4b, 0x7d, 0x44, 0x8e,\n\t\t},\n\t\tisValid: true,\n\t\tformat:  pubkeyCompressed,\n\t},\n\t{\n\t\tname: \"compressed claims uncompressed (ybit = 0)\",\n\t\tkey: []byte{0x04, 0xce, 0x0b, 0x14, 0xfb, 0x84, 0x2b, 0x1b,\n\t\t\t0xa5, 0x49, 0xfd, 0xd6, 0x75, 0xc9, 0x80, 0x75, 0xf1,\n\t\t\t0x2e, 0x9c, 0x51, 0x0f, 0x8e, 0xf5, 0x2b, 0xd0, 0x21,\n\t\t\t0xa9, 0xa1, 0xf4, 0x80, 0x9d, 0x3b, 0x4d,\n\t\t},\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"compressed claims uncompressed (ybit = 1)\",\n\t\tkey: []byte{0x05, 0x26, 0x89, 0xc7, 0xc2, 0xda, 0xb1, 0x33,\n\t\t\t0x09, 0xfb, 0x14, 0x3e, 0x0e, 0x8f, 0xe3, 0x96, 0x34,\n\t\t\t0x25, 0x21, 0x88, 0x7e, 0x97, 0x66, 0x90, 0xb6, 0xb4,\n\t\t\t0x7f, 0x5b, 0x2a, 0x4b, 0x7d, 0x44, 0x8e,\n\t\t},\n\t\tisValid: false,\n\t},\n\t{\n\t\tname:    \"wrong length)\",\n\t\tkey:     []byte{0x05},\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"X == P\",\n\t\tkey: []byte{0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x2F, 0xb2, 0xe0,\n\t\t\t0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64,\n\t\t\t0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9,\n\t\t\t0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56,\n\t\t\t0xb4, 0x12, 0xa3,\n\t\t},\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"X > P\",\n\t\tkey: []byte{0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFD, 0x2F, 0xb2, 0xe0,\n\t\t\t0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64,\n\t\t\t0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9,\n\t\t\t0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56,\n\t\t\t0xb4, 0x12, 0xa3,\n\t\t},\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"Y == P\",\n\t\tkey: []byte{0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a,\n\t\t\t0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e,\n\t\t\t0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca,\n\t\t\t0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF,\n\t\t\t0xFF, 0xFC, 0x2F,\n\t\t},\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"Y > P\",\n\t\tkey: []byte{0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a,\n\t\t\t0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e,\n\t\t\t0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca,\n\t\t\t0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n\t\t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF,\n\t\t\t0xFF, 0xFD, 0x2F,\n\t\t},\n\t\tisValid: false,\n\t},\n\t{\n\t\tname: \"hybrid\",\n\t\tkey: []byte{0x06, 0x79, 0xbe, 0x66, 0x7e, 0xf9, 0xdc, 0xbb,\n\t\t\t0xac, 0x55, 0xa0, 0x62, 0x95, 0xce, 0x87, 0x0b, 0x07,\n\t\t\t0x02, 0x9b, 0xfc, 0xdb, 0x2d, 0xce, 0x28, 0xd9, 0x59,\n\t\t\t0xf2, 0x81, 0x5b, 0x16, 0xf8, 0x17, 0x98, 0x48, 0x3a,\n\t\t\t0xda, 0x77, 0x26, 0xa3, 0xc4, 0x65, 0x5d, 0xa4, 0xfb,\n\t\t\t0xfc, 0x0e, 0x11, 0x08, 0xa8, 0xfd, 0x17, 0xb4, 0x48,\n\t\t\t0xa6, 0x85, 0x54, 0x19, 0x9c, 0x47, 0xd0, 0x8f, 0xfb,\n\t\t\t0x10, 0xd4, 0xb8,\n\t\t},\n\t\tformat:  pubkeyHybrid,\n\t\tisValid: true,\n\t},\n}\n\nfunc TestPubKeys(t *testing.T) {\n\tfor _, test := range pubKeyTests {\n\t\tpk, err := ParsePubKey(test.key)\n\t\tif err != nil {\n\t\t\tif test.isValid {\n\t\t\t\tt.Errorf(\"%s pubkey failed when shouldn't %v\",\n\t\t\t\t\ttest.name, err)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif !test.isValid {\n\t\t\tt.Errorf(\"%s counted as valid when it should fail\",\n\t\t\t\ttest.name)\n\t\t\tcontinue\n\t\t}\n\t\tvar pkStr []byte\n\t\tswitch test.format {\n\t\tcase pubkeyUncompressed:\n\t\t\tpkStr = pk.SerializeUncompressed()\n\t\tcase pubkeyCompressed:\n\t\t\tpkStr = pk.SerializeCompressed()\n\t\tcase pubkeyHybrid:\n\t\t\tpkStr = test.key\n\t\t}\n\t\tif !bytes.Equal(test.key, pkStr) {\n\t\t\tt.Errorf(\"%s pubkey: serialized keys do not match.\",\n\t\t\t\ttest.name)\n\t\t\tspew.Dump(test.key)\n\t\t\tspew.Dump(pkStr)\n\t\t}\n\t}\n}\n\nfunc TestPublicKeyIsEqual(t *testing.T) {\n\tpubKey1, err := ParsePubKey(\n\t\t[]byte{0x03, 0x26, 0x89, 0xc7, 0xc2, 0xda, 0xb1, 0x33,\n\t\t\t0x09, 0xfb, 0x14, 0x3e, 0x0e, 0x8f, 0xe3, 0x96, 0x34,\n\t\t\t0x25, 0x21, 0x88, 0x7e, 0x97, 0x66, 0x90, 0xb6, 0xb4,\n\t\t\t0x7f, 0x5b, 0x2a, 0x4b, 0x7d, 0x44, 0x8e,\n\t\t},\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to parse raw bytes for pubKey1: %v\", err)\n\t}\n\n\tpubKey2, err := ParsePubKey(\n\t\t[]byte{0x02, 0xce, 0x0b, 0x14, 0xfb, 0x84, 0x2b, 0x1b,\n\t\t\t0xa5, 0x49, 0xfd, 0xd6, 0x75, 0xc9, 0x80, 0x75, 0xf1,\n\t\t\t0x2e, 0x9c, 0x51, 0x0f, 0x8e, 0xf5, 0x2b, 0xd0, 0x21,\n\t\t\t0xa9, 0xa1, 0xf4, 0x80, 0x9d, 0x3b, 0x4d,\n\t\t},\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to parse raw bytes for pubKey2: %v\", err)\n\t}\n\n\tif !pubKey1.IsEqual(pubKey1) {\n\t\tt.Fatalf(\"value of IsEqual is incorrect, %v is \"+\n\t\t\t\"equal to %v\", pubKey1, pubKey1)\n\t}\n\n\tif pubKey1.IsEqual(pubKey2) {\n\t\tt.Fatalf(\"value of IsEqual is incorrect, %v is not \"+\n\t\t\t\"equal to %v\", pubKey1, pubKey2)\n\t}\n}\n\nfunc TestIsCompressed(t *testing.T) {\n\tfor _, test := range pubKeyTests {\n\t\tisCompressed := IsCompressedPubKey(test.key)\n\t\twantCompressed := (test.format == pubkeyCompressed)\n\t\tif isCompressed != wantCompressed {\n\t\t\tt.Fatalf(\"%s (%x) pubkey: unexpected compressed result, \"+\n\t\t\t\t\"got %v, want %v\", test.name, test.key,\n\t\t\t\tisCompressed, wantCompressed)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcec/schnorr/bench_test.go",
    "content": "// Copyright 2013-2016 The btcsuite developers\n// Copyright (c) 2015-2021 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage schnorr\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// hexToBytes converts the passed hex string into bytes and will panic if there\n// is an error.  This is only provided for the hard-coded constants so errors in\n// the source code can be detected. It will only (and must only) be called with\n// hard-coded values.\nfunc hexToBytes(s string) []byte {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn b\n}\n\n// hexToModNScalar converts the passed hex string into a ModNScalar and will\n// panic if there is an error.  This is only provided for the hard-coded\n// constants so errors in the source code can be detected. It will only (and\n// must only) be called with hard-coded values.\nfunc hexToModNScalar(s string) *btcec.ModNScalar {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\tvar scalar btcec.ModNScalar\n\tif overflow := scalar.SetByteSlice(b); overflow {\n\t\tpanic(\"hex in source file overflows mod N scalar: \" + s)\n\t}\n\treturn &scalar\n}\n\n// hexToFieldVal converts the passed hex string into a FieldVal and will panic\n// if there is an error.  This is only provided for the hard-coded constants so\n// errors in the source code can be detected. It will only (and must only) be\n// called with hard-coded values.\nfunc hexToFieldVal(s string) *btcec.FieldVal {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\tvar f btcec.FieldVal\n\tif overflow := f.SetByteSlice(b); overflow {\n\t\tpanic(\"hex in source file overflows mod P: \" + s)\n\t}\n\treturn &f\n}\n\n// fromHex converts the passed hex string into a big integer pointer and will\n// panic is there is an error.  This is only provided for the hard-coded\n// constants so errors in the source code can bet detected. It will only (and\n// must only) be called for initialization purposes.\nfunc fromHex(s string) *big.Int {\n\tif s == \"\" {\n\t\treturn big.NewInt(0)\n\t}\n\tr, ok := new(big.Int).SetString(s, 16)\n\tif !ok {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn r\n}\n\nvar testOk bool\n\n// BenchmarkSigVerify benchmarks how long it takes the secp256k1 curve to\n// verify signatures.\nfunc BenchmarkSigVerify(b *testing.B) {\n\t// Randomly generated keypair.\n\td := hexToModNScalar(\"9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d\")\n\n\tprivKey := secp256k1.NewPrivateKey(d)\n\tpubKey := privKey.PubKey()\n\n\t// Double sha256 of []byte{0x01, 0x02, 0x03, 0x04}\n\tmsgHash := sha256.Sum256([]byte(\"benchmark\"))\n\tsig, err := Sign(privKey, msgHash[:])\n\tif err != nil {\n\t\tb.Fatalf(\"unable to sign: %v\", err)\n\t}\n\n\tif !sig.Verify(msgHash[:], pubKey) {\n\t\tb.Errorf(\"Signature failed to verify\")\n\t\treturn\n\t}\n\n\tvar ok bool\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tok = sig.Verify(msgHash[:], pubKey)\n\t}\n\n\ttestOk = ok\n}\n\n// Used to ensure the compiler doesn't optimize away the benchmark.\nvar (\n\ttestSig *Signature\n\ttestErr error\n)\n\n// BenchmarkSign benchmarks how long it takes to sign a message.\nfunc BenchmarkSign(b *testing.B) {\n\t// Randomly generated keypair.\n\td := hexToModNScalar(\"9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d\")\n\tprivKey := secp256k1.NewPrivateKey(d)\n\n\t// blake256 of []byte{0x01, 0x02, 0x03, 0x04}.\n\tmsgHash := hexToBytes(\"c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7\")\n\n\tvar auxBytes [32]byte\n\tcopy(auxBytes[:], msgHash)\n\tauxBytes[0] ^= 1\n\n\tvar (\n\t\tsig *Signature\n\t\terr error\n\t)\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tsig, err = Sign(\n\t\t\tprivKey, msgHash, CustomNonce(auxBytes), FastSign(),\n\t\t)\n\t}\n\n\ttestSig = sig\n\ttestErr = err\n}\n\n// BenchmarkSignRfc6979 benchmarks how long it takes to sign a message.\nfunc BenchmarkSignRfc6979(b *testing.B) {\n\t// Randomly generated keypair.\n\td := hexToModNScalar(\"9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d\")\n\tprivKey := secp256k1.NewPrivateKey(d)\n\n\t// blake256 of []byte{0x01, 0x02, 0x03, 0x04}.\n\tmsgHash := hexToBytes(\"c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7\")\n\n\tvar (\n\t\tsig *Signature\n\t\terr error\n\t)\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tsig, err = Sign(privKey, msgHash, FastSign())\n\t}\n\n\ttestSig = sig\n\ttestErr = err\n}\n"
  },
  {
    "path": "btcec/schnorr/error.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2021 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage schnorr\n\nimport (\n\tecdsa_schnorr \"github.com/decred/dcrd/dcrec/secp256k1/v4/schnorr\"\n)\n\n// ErrorKind identifies a kind of error.  It has full support for errors.Is\n// and errors.As, so the caller can directly check against an error kind\n// when determining the reason for an error.\ntype ErrorKind = ecdsa_schnorr.ErrorKind\n\n// Error identifies an error related to a schnorr signature. It has full\n// support for errors.Is and errors.As, so the caller can ascertain the\n// specific reason for the error by checking the underlying error.\ntype Error = ecdsa_schnorr.Error\n\n// signatureError creates an Error given a set of arguments.\nfunc signatureError(kind ErrorKind, desc string) Error {\n\treturn Error{Err: kind, Description: desc}\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/bench_test.go",
    "content": "// Copyright 2013-2022 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage musig2\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n)\n\nvar (\n\ttestPrivBytes = hexToModNScalar(\"9e0699c91ca1e3b7e3c9ba71eb71c89890872be97576010fe593fbf3fd57e66d\")\n\n\ttestMsg = hexToBytes(\"c301ba9de5d6053caad9f5eb46523f007702add2c62fa39de03146a36b8026b7\")\n)\n\nfunc hexToBytes(s string) []byte {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn b\n}\n\nfunc hexToModNScalar(s string) *btcec.ModNScalar {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\tvar scalar btcec.ModNScalar\n\tif overflow := scalar.SetByteSlice(b); overflow {\n\t\tpanic(\"hex in source file overflows mod N scalar: \" + s)\n\t}\n\treturn &scalar\n}\n\nfunc genSigner(t *testing.B) signer {\n\tprivKey, err := btcec.NewPrivateKey()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to gen priv key: %v\", err)\n\t}\n\n\tpubKey := privKey.PubKey()\n\n\tnonces, err := GenNonces(WithPublicKey(pubKey))\n\tif err != nil {\n\t\tt.Fatalf(\"unable to gen nonces: %v\", err)\n\t}\n\n\treturn signer{\n\t\tprivKey: privKey,\n\t\tpubKey:  pubKey,\n\t\tnonces:  nonces,\n\t}\n}\n\nvar (\n\ttestSig *PartialSignature\n\ttestErr error\n)\n\n// BenchmarkPartialSign benchmarks how long it takes to generate a partial\n// signature factoring in if the keys are sorted and also if we're in fast sign\n// mode.\nfunc BenchmarkPartialSign(b *testing.B) {\n\tfor _, numSigners := range []int{10, 100} {\n\t\tfor _, fastSign := range []bool{true, false} {\n\t\t\tfor _, sortKeys := range []bool{true, false} {\n\t\t\t\tname := fmt.Sprintf(\"num_signers=%v/fast_sign=%v/sort=%v\",\n\t\t\t\t\tnumSigners, fastSign, sortKeys)\n\n\t\t\t\tsigners := make(signerSet, numSigners)\n\t\t\t\tfor i := 0; i < numSigners; i++ {\n\t\t\t\t\tsigners[i] = genSigner(b)\n\t\t\t\t}\n\n\t\t\t\tcombinedNonce, err := AggregateNonces(signers.pubNonces())\n\t\t\t\tif err != nil {\n\t\t\t\t\tb.Fatalf(\"unable to generate combined nonce: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tvar sig *PartialSignature\n\n\t\t\t\tvar msg [32]byte\n\t\t\t\tcopy(msg[:], testMsg[:])\n\n\t\t\t\tkeys := signers.keys()\n\n\t\t\t\tb.Run(name, func(b *testing.B) {\n\t\t\t\t\tvar signOpts []SignOption\n\t\t\t\t\tif fastSign {\n\t\t\t\t\t\tsignOpts = append(signOpts, WithFastSign())\n\t\t\t\t\t}\n\t\t\t\t\tif sortKeys {\n\t\t\t\t\t\tsignOpts = append(signOpts, WithSortedKeys())\n\t\t\t\t\t}\n\n\t\t\t\t\tb.ResetTimer()\n\t\t\t\t\tb.ReportAllocs()\n\n\t\t\t\t\tfor i := 0; i < b.N; i++ {\n\t\t\t\t\t\tsig, err = Sign(\n\t\t\t\t\t\t\tsigners[0].nonces.SecNonce, signers[0].privKey,\n\t\t\t\t\t\t\tcombinedNonce, keys, msg, signOpts...,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tb.Fatalf(\"unable to generate sig: %v\", err)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttestSig = sig\n\t\t\t\t\ttestErr = err\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TODO(roasbeef): add impact of sorting ^\n\nvar sigOk bool\n\n// BenchmarkPartialVerify benchmarks how long it takes to verify a partial\n// signature.\nfunc BenchmarkPartialVerify(b *testing.B) {\n\tfor _, numSigners := range []int{10, 100} {\n\t\tfor _, sortKeys := range []bool{true, false} {\n\t\t\tname := fmt.Sprintf(\"sort_keys=%v/num_signers=%v\",\n\t\t\t\tsortKeys, numSigners)\n\n\t\t\tsigners := make(signerSet, numSigners)\n\t\t\tfor i := 0; i < numSigners; i++ {\n\t\t\t\tsigners[i] = genSigner(b)\n\t\t\t}\n\n\t\t\tcombinedNonce, err := AggregateNonces(\n\t\t\t\tsigners.pubNonces(),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tb.Fatalf(\"unable to generate combined \"+\n\t\t\t\t\t\"nonce: %v\", err)\n\t\t\t}\n\n\t\t\tvar sig *PartialSignature\n\n\t\t\tvar msg [32]byte\n\t\t\tcopy(msg[:], testMsg[:])\n\n\t\t\tb.ReportAllocs()\n\t\t\tb.ResetTimer()\n\n\t\t\tsig, err = Sign(\n\t\t\t\tsigners[0].nonces.SecNonce, signers[0].privKey,\n\t\t\t\tcombinedNonce, signers.keys(), msg,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tb.Fatalf(\"unable to generate sig: %v\", err)\n\t\t\t}\n\n\t\t\tkeys := signers.keys()\n\t\t\tpubKey := signers[0].pubKey\n\n\t\t\tb.Run(name, func(b *testing.B) {\n\t\t\t\tvar signOpts []SignOption\n\t\t\t\tif sortKeys {\n\t\t\t\t\tsignOpts = append(\n\t\t\t\t\t\tsignOpts, WithSortedKeys(),\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tb.ResetTimer()\n\t\t\t\tb.ReportAllocs()\n\n\t\t\t\tvar ok bool\n\t\t\t\tfor i := 0; i < b.N; i++ {\n\t\t\t\t\tok = sig.Verify(\n\t\t\t\t\t\tsigners[0].nonces.PubNonce, combinedNonce,\n\t\t\t\t\t\tkeys, pubKey, msg, signOpts...,\n\t\t\t\t\t)\n\t\t\t\t\tif !ok {\n\t\t\t\t\t\tb.Fatalf(\"generated invalid sig!\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsigOk = ok\n\t\t\t})\n\n\t\t}\n\t}\n}\n\nvar finalSchnorrSig *schnorr.Signature\n\n// BenchmarkCombineSigs benchmarks how long it takes to combine a set amount of\n// signatures.\nfunc BenchmarkCombineSigs(b *testing.B) {\n\n\tfor _, numSigners := range []int{10, 100} {\n\t\tsigners := make(signerSet, numSigners)\n\t\tfor i := 0; i < numSigners; i++ {\n\t\t\tsigners[i] = genSigner(b)\n\t\t}\n\n\t\tcombinedNonce, err := AggregateNonces(signers.pubNonces())\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unable to generate combined nonce: %v\", err)\n\t\t}\n\n\t\tvar msg [32]byte\n\t\tcopy(msg[:], testMsg[:])\n\n\t\tvar finalNonce *btcec.PublicKey\n\t\tfor i := range signers {\n\t\t\tsigner := signers[i]\n\t\t\tpartialSig, err := Sign(\n\t\t\t\tsigner.nonces.SecNonce, signer.privKey,\n\t\t\t\tcombinedNonce, signers.keys(), msg,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tb.Fatalf(\"unable to generate partial sig: %v\",\n\t\t\t\t\terr)\n\t\t\t}\n\n\t\t\tsigners[i].partialSig = partialSig\n\n\t\t\tif finalNonce == nil {\n\t\t\t\tfinalNonce = partialSig.R\n\t\t\t}\n\t\t}\n\n\t\tsigs := signers.partialSigs()\n\n\t\tname := fmt.Sprintf(\"num_signers=%v\", numSigners)\n\t\tb.Run(name, func(b *testing.B) {\n\t\t\tb.ResetTimer()\n\t\t\tb.ReportAllocs()\n\n\t\t\tfinalSig := CombineSigs(finalNonce, sigs)\n\n\t\t\tfinalSchnorrSig = finalSig\n\t\t})\n\t}\n}\n\nvar testNonce [PubNonceSize]byte\n\n// BenchmarkAggregateNonces benchmarks how long it takes to combine nonces.\nfunc BenchmarkAggregateNonces(b *testing.B) {\n\tfor _, numSigners := range []int{10, 100} {\n\t\tsigners := make(signerSet, numSigners)\n\t\tfor i := 0; i < numSigners; i++ {\n\t\t\tsigners[i] = genSigner(b)\n\t\t}\n\n\t\tnonces := signers.pubNonces()\n\n\t\tname := fmt.Sprintf(\"num_signers=%v\", numSigners)\n\t\tb.Run(name, func(b *testing.B) {\n\t\t\tb.ResetTimer()\n\t\t\tb.ReportAllocs()\n\n\t\t\tpubNonce, err := AggregateNonces(nonces)\n\t\t\tif err != nil {\n\t\t\t\tb.Fatalf(\"unable to generate nonces: %v\", err)\n\t\t\t}\n\n\t\t\ttestNonce = pubNonce\n\t\t})\n\t}\n}\n\nvar testKey *btcec.PublicKey\n\n// BenchmarkAggregateKeys benchmarks how long it takes to aggregate public\n// keys.\nfunc BenchmarkAggregateKeys(b *testing.B) {\n\tfor _, numSigners := range []int{10, 100} {\n\t\tfor _, sortKeys := range []bool{true, false} {\n\t\t\tsigners := make(signerSet, numSigners)\n\t\t\tfor i := 0; i < numSigners; i++ {\n\t\t\t\tsigners[i] = genSigner(b)\n\t\t\t}\n\n\t\t\tsignerKeys := signers.keys()\n\n\t\t\tname := fmt.Sprintf(\"num_signers=%v/sort_keys=%v\",\n\t\t\t\tnumSigners, sortKeys)\n\n\t\t\tuniqueKeyIndex := secondUniqueKeyIndex(signerKeys, false)\n\n\t\t\tb.Run(name, func(b *testing.B) {\n\t\t\t\tb.ResetTimer()\n\t\t\t\tb.ReportAllocs()\n\n\t\t\t\taggKey, _, _, _ := AggregateKeys(\n\t\t\t\t\tsignerKeys, sortKeys,\n\t\t\t\t\tWithUniqueKeyIndex(uniqueKeyIndex),\n\t\t\t\t)\n\n\t\t\t\ttestKey = aggKey.FinalKey\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/context.go",
    "content": "// Copyright (c) 2013-2022 The btcsuite developers\n\npackage musig2\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n)\n\nvar (\n\t// ErrSignersNotSpecified is returned when a caller attempts to create\n\t// a context without specifying either the total number of signers, or\n\t// the complete set of singers.\n\tErrSignersNotSpecified = fmt.Errorf(\"total number of signers or all \" +\n\t\t\"signers must be known\")\n\n\t// ErrSignerNotInKeySet is returned when a the private key for a signer\n\t// isn't included in the set of signing public keys.\n\tErrSignerNotInKeySet = fmt.Errorf(\"signing key is not found in key\" +\n\t\t\" set\")\n\n\t// ErrAlredyHaveAllNonces is called when RegisterPubNonce is called too\n\t// many times for a given signing session.\n\tErrAlredyHaveAllNonces = fmt.Errorf(\"already have all nonces\")\n\n\t// ErrNotEnoughSigners is returned when a caller attempts to create a\n\t// session from a context, but before all the required signers are\n\t// known.\n\tErrNotEnoughSigners = fmt.Errorf(\"not enough signers\")\n\n\t// ErrAlredyHaveAllNonces is returned when a caller attempts to\n\t// register a signer, once we already have the total set of known\n\t// signers.\n\tErrAlreadyHaveAllSigners = fmt.Errorf(\"all signers registered\")\n\n\t// ErrAlredyHaveAllSigs is called when CombineSig is called too many\n\t// times for a given signing session.\n\tErrAlredyHaveAllSigs = fmt.Errorf(\"already have all sigs\")\n\n\t// ErrSigningContextReuse is returned if a user attempts to sign using\n\t// the same signing context more than once.\n\tErrSigningContextReuse = fmt.Errorf(\"nonce already used\")\n\n\t// ErrFinalSigInvalid is returned when the combined signature turns out\n\t// to be invalid.\n\tErrFinalSigInvalid = fmt.Errorf(\"final signature is invalid\")\n\n\t// ErrCombinedNonceUnavailable is returned when a caller attempts to\n\t// sign a partial signature, without first having collected all the\n\t// required combined nonces.\n\tErrCombinedNonceUnavailable = fmt.Errorf(\"missing combined nonce\")\n\n\t// ErrTaprootInternalKeyUnavailable is returned when a user attempts to\n\t// obtain the\n\tErrTaprootInternalKeyUnavailable = fmt.Errorf(\"taproot tweak not used\")\n\n\t// ErrNotEnoughSigners is returned if a caller attempts to obtain an\n\t// early nonce when it wasn't specified\n\tErrNoEarlyNonce = fmt.Errorf(\"no early nonce available\")\n\n\t// ErrCombinedNonceAfterPubNonces is returned if RegisterCombinedNonce\n\t// is called after public nonces have already been registered.\n\tErrCombinedNonceAfterPubNonces = fmt.Errorf(\"can't register combined \" +\n\t\t\"nonce after public nonces\")\n)\n\n// Context is a managed signing context for musig2. It takes care of things\n// like securely generating secret nonces, aggregating keys and nonces, etc.\ntype Context struct {\n\t// signingKey is the key we'll use for signing.\n\tsigningKey *btcec.PrivateKey\n\n\t// pubKey is our even-y coordinate public  key.\n\tpubKey *btcec.PublicKey\n\n\t// combinedKey is the aggregated public key.\n\tcombinedKey *AggregateKey\n\n\t// uniqueKeyIndex is the index of the second unique key in the keySet.\n\t// This is used to speed up signing and verification computations.\n\tuniqueKeyIndex int\n\n\t// keysHash is the hash of all the keys as defined in musig2.\n\tkeysHash []byte\n\n\t// opts is the set of options for the context.\n\topts *contextOptions\n\n\t// shouldSort keeps track of if the public keys should be sorted before\n\t// any operations.\n\tshouldSort bool\n\n\t// sessionNonce will be populated if the earlyNonce option is true.\n\t// After the first session is created, this nonce will be blanked out.\n\tsessionNonce *Nonces\n}\n\n// ContextOption is a functional option argument that allows callers to modify\n// the musig2 signing is done within a context.\ntype ContextOption func(*contextOptions)\n\n// contextOptions houses the set of functional options that can be used to\n// musig2 signing protocol.\ntype contextOptions struct {\n\t// tweaks is the set of optinoal tweaks to apply to the combined public\n\t// key.\n\ttweaks []KeyTweakDesc\n\n\t// taprootTweak specifies the taproot tweak. If specified, then we'll\n\t// use this as the script root for the BIP 341 taproot (x-only) tweak.\n\t// Normally we'd just apply the raw 32 byte tweak, but for taproot, we\n\t// first need to compute the aggregated key before tweaking, and then\n\t// use it as the internal key. This is required as the taproot tweak\n\t// also commits to the public key, which in this case is the aggregated\n\t// key before the tweak.\n\ttaprootTweak []byte\n\n\t// bip86Tweak if true, then the weak will just be\n\t// h_tapTweak(internalKey) as there is no true script root.\n\tbip86Tweak bool\n\n\t// keySet is the complete set of signers for this context.\n\tkeySet []*btcec.PublicKey\n\n\t// numSigners is the total number of signers that will eventually be a\n\t// part of the context.\n\tnumSigners int\n\n\t// earlyNonce determines if a nonce should be generated during context\n\t// creation, to be automatically passed to the created session.\n\tearlyNonce bool\n}\n\n// defaultContextOptions returns the default context options.\nfunc defaultContextOptions() *contextOptions {\n\treturn &contextOptions{}\n}\n\n// WithTweakedContext specifies that within the context, the aggregated public\n// key should be tweaked with the specified tweaks.\nfunc WithTweakedContext(tweaks ...KeyTweakDesc) ContextOption {\n\treturn func(o *contextOptions) {\n\t\to.tweaks = tweaks\n\t}\n}\n\n// WithTaprootTweakCtx specifies that within this context, the final key should\n// use the taproot tweak as defined in BIP 341: outputKey = internalKey +\n// h_tapTweak(internalKey || scriptRoot). In this case, the aggreaged key\n// before the tweak will be used as the internal key.\nfunc WithTaprootTweakCtx(scriptRoot []byte) ContextOption {\n\treturn func(o *contextOptions) {\n\t\to.taprootTweak = scriptRoot\n\t}\n}\n\n// WithBip86TweakCtx specifies that within this context, the final key should\n// use the taproot tweak as defined in BIP 341, with the BIP 86 modification:\n// outputKey = internalKey + h_tapTweak(internalKey)*G. In this case, the\n// aggreaged key before the tweak will be used as the internal key.\nfunc WithBip86TweakCtx() ContextOption {\n\treturn func(o *contextOptions) {\n\t\to.bip86Tweak = true\n\t}\n}\n\n// WithKnownSigners is an optional parameter that should be used if a session\n// can be created as soon as all the singers are known.\nfunc WithKnownSigners(signers []*btcec.PublicKey) ContextOption {\n\treturn func(o *contextOptions) {\n\t\to.keySet = signers\n\t\to.numSigners = len(signers)\n\t}\n}\n\n// WithNumSigners is a functional option used to specify that a context should\n// be created without knowing all the signers. Instead the total number of\n// signers is specified to ensure that a session can only be created once all\n// the signers are known.\n//\n// NOTE: Either WithKnownSigners or WithNumSigners MUST be specified.\nfunc WithNumSigners(n int) ContextOption {\n\treturn func(o *contextOptions) {\n\t\to.numSigners = n\n\t}\n}\n\n// WithEarlyNonceGen allow a caller to specify that a nonce should be generated\n// early, before the session is created. This should be used in protocols that\n// require some partial nonce exchange before all the signers are known.\n//\n// NOTE: This option must only be specified with the WithNumSigners option.\nfunc WithEarlyNonceGen() ContextOption {\n\treturn func(o *contextOptions) {\n\t\to.earlyNonce = true\n\t}\n}\n\n// NewContext creates a new signing context with the passed singing key and set\n// of public keys for each of the other signers.\n//\n// NOTE: This struct should be used over the raw Sign API whenever possible.\nfunc NewContext(signingKey *btcec.PrivateKey, shouldSort bool,\n\tctxOpts ...ContextOption) (*Context, error) {\n\n\t// First, parse the set of optional context options.\n\topts := defaultContextOptions()\n\tfor _, option := range ctxOpts {\n\t\toption(opts)\n\t}\n\n\tpubKey := signingKey.PubKey()\n\n\tctx := &Context{\n\t\tsigningKey: signingKey,\n\t\tpubKey:     pubKey,\n\t\topts:       opts,\n\t\tshouldSort: shouldSort,\n\t}\n\n\tswitch {\n\n\t// We know all the signers, so we can compute the aggregated key, along\n\t// with all the other intermediate state we need to do signing and\n\t// verification.\n\tcase opts.keySet != nil:\n\t\tif err := ctx.combineSignerKeys(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t// The total signers are known, so we add ourselves, and skip key\n\t// aggregation.\n\tcase opts.numSigners != 0:\n\t\t// Otherwise, we'll add ourselves as the only known signer, and\n\t\t// await further calls to RegisterSigner before a session can\n\t\t// be created.\n\t\topts.keySet = make([]*btcec.PublicKey, 0, opts.numSigners)\n\t\topts.keySet = append(opts.keySet, pubKey)\n\n\tdefault:\n\t\treturn nil, ErrSignersNotSpecified\n\t}\n\n\t// If early nonce generation is specified, then we'll generate the\n\t// nonce now to pass in to the session once all the callers are known.\n\tif opts.earlyNonce {\n\t\tvar err error\n\t\tctx.sessionNonce, err = GenNonces(\n\t\t\tWithPublicKey(ctx.pubKey),\n\t\t\tWithNonceSecretKeyAux(signingKey),\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn ctx, nil\n}\n\n// combineSignerKeys is used to compute the aggregated signer key once all the\n// signers are known.\nfunc (c *Context) combineSignerKeys() error {\n\t// As a sanity check, make sure the signing key is actually\n\t// amongst the sit of signers.\n\tvar keyFound bool\n\tfor _, key := range c.opts.keySet {\n\t\tif key.IsEqual(c.pubKey) {\n\t\t\tkeyFound = true\n\t\t\tbreak\n\t\t}\n\t}\n\tif !keyFound {\n\t\treturn ErrSignerNotInKeySet\n\t}\n\n\t// Now that we know that we're actually a signer, we'll\n\t// generate the key hash finger print and second unique key\n\t// index so we can speed up signing later.\n\tc.keysHash = keyHashFingerprint(c.opts.keySet, c.shouldSort)\n\tc.uniqueKeyIndex = secondUniqueKeyIndex(\n\t\tc.opts.keySet, c.shouldSort,\n\t)\n\n\tkeyAggOpts := []KeyAggOption{\n\t\tWithKeysHash(c.keysHash),\n\t\tWithUniqueKeyIndex(c.uniqueKeyIndex),\n\t}\n\tswitch {\n\tcase c.opts.bip86Tweak:\n\t\tkeyAggOpts = append(\n\t\t\tkeyAggOpts, WithBIP86KeyTweak(),\n\t\t)\n\tcase c.opts.taprootTweak != nil:\n\t\tkeyAggOpts = append(\n\t\t\tkeyAggOpts, WithTaprootKeyTweak(c.opts.taprootTweak),\n\t\t)\n\tcase len(c.opts.tweaks) != 0:\n\t\tkeyAggOpts = append(keyAggOpts, WithKeyTweaks(c.opts.tweaks...))\n\t}\n\n\t// Next, we'll use this information to compute the aggregated\n\t// public key that'll be used for signing in practice.\n\tvar err error\n\tc.combinedKey, _, _, err = AggregateKeys(\n\t\tc.opts.keySet, c.shouldSort, keyAggOpts...,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// EarlySessionNonce returns the early session nonce, if available.\nfunc (c *Context) EarlySessionNonce() (*Nonces, error) {\n\tif c.sessionNonce == nil {\n\t\treturn nil, ErrNoEarlyNonce\n\t}\n\n\treturn c.sessionNonce, nil\n}\n\n// RegisterSigner allows a caller to register a signer after the context has\n// been created. This will be used in scenarios where the total number of\n// signers is known, but nonce exchange needs to happen before all the signers\n// are known.\n//\n// A bool is returned which indicates if all the signers have been registered.\n//\n// NOTE: If the set of keys are not to be sorted during signing, then the\n// ordering each key is registered with MUST match the desired ordering.\nfunc (c *Context) RegisterSigner(pub *btcec.PublicKey) (bool, error) {\n\thaveAllSigners := len(c.opts.keySet) == c.opts.numSigners\n\tif haveAllSigners {\n\t\treturn false, ErrAlreadyHaveAllSigners\n\t}\n\n\tc.opts.keySet = append(c.opts.keySet, pub)\n\n\t// If we have the expected number of signers at this point, then we can\n\t// generate the aggregated key and other necessary information.\n\thaveAllSigners = len(c.opts.keySet) == c.opts.numSigners\n\tif haveAllSigners {\n\t\tif err := c.combineSignerKeys(); err != nil {\n\t\t\treturn false, err\n\t\t}\n\t}\n\n\treturn haveAllSigners, nil\n}\n\n// NumRegisteredSigners returns the total number of registered signers.\nfunc (c *Context) NumRegisteredSigners() int {\n\treturn len(c.opts.keySet)\n}\n\n// CombinedKey returns the combined public key that will be used to generate\n// multi-signatures  against.\nfunc (c *Context) CombinedKey() (*btcec.PublicKey, error) {\n\t// If the caller hasn't registered all the signers at this point, then\n\t// the combined key won't be available.\n\tif c.combinedKey == nil {\n\t\treturn nil, ErrNotEnoughSigners\n\t}\n\n\treturn c.combinedKey.FinalKey, nil\n}\n\n// PubKey returns the public key of the signer of this session.\nfunc (c *Context) PubKey() btcec.PublicKey {\n\treturn *c.pubKey\n}\n\n// SigningKeys returns the set of keys used for signing.\nfunc (c *Context) SigningKeys() []*btcec.PublicKey {\n\tkeys := make([]*btcec.PublicKey, len(c.opts.keySet))\n\tcopy(keys, c.opts.keySet)\n\n\treturn keys\n}\n\n// TaprootInternalKey returns the internal taproot key, which is the aggregated\n// key _before_ the tweak is applied. If a taproot tweak was specified, then\n// CombinedKey() will return the fully tweaked output key, with this method\n// returning the internal key. If a taproot tweak wasn't specified, then this\n// method will return an error.\nfunc (c *Context) TaprootInternalKey() (*btcec.PublicKey, error) {\n\t// If the caller hasn't registered all the signers at this point, then\n\t// the combined key won't be available.\n\tif c.combinedKey == nil {\n\t\treturn nil, ErrNotEnoughSigners\n\t}\n\n\tif c.opts.taprootTweak == nil && !c.opts.bip86Tweak {\n\t\treturn nil, ErrTaprootInternalKeyUnavailable\n\t}\n\n\treturn c.combinedKey.PreTweakedKey, nil\n}\n\n// SessionOption is a functional option argument that allows callers to modify\n// the musig2 signing is done within a session.\ntype SessionOption func(*sessionOptions)\n\n// sessionOptions houses the set of functional options that can be used to\n// modify the musig2 signing protocol.\ntype sessionOptions struct {\n\texternalNonce *Nonces\n}\n\n// defaultSessionOptions returns the default session options.\nfunc defaultSessionOptions() *sessionOptions {\n\treturn &sessionOptions{}\n}\n\n// WithPreGeneratedNonce allows a caller to start a session using a nonce\n// they've generated themselves. This may be useful in protocols where all the\n// signer keys may not be known before nonce exchange needs to occur.\nfunc WithPreGeneratedNonce(nonce *Nonces) SessionOption {\n\treturn func(o *sessionOptions) {\n\t\to.externalNonce = nonce\n\t}\n}\n\n// Session represents a musig2 signing session. A new instance should be\n// created each time a multi-signature is needed. The session struct handles\n// nonces management, incremental partial sig vitrifaction, as well as final\n// signature combination. Errors are returned when unsafe behavior such as\n// nonce re-use is attempted.\n//\n// NOTE: This struct should be used over the raw Sign API whenever possible.\ntype Session struct {\n\topts *sessionOptions\n\n\tctx *Context\n\n\tlocalNonces *Nonces\n\n\tpubNonces [][PubNonceSize]byte\n\n\tcombinedNonce *[PubNonceSize]byte\n\n\tmsg [32]byte\n\n\tourSig *PartialSignature\n\tsigs   []*PartialSignature\n\n\tfinalSig *schnorr.Signature\n}\n\n// NewSession creates a new musig2 signing session.\nfunc (c *Context) NewSession(options ...SessionOption) (*Session, error) {\n\topts := defaultSessionOptions()\n\tfor _, opt := range options {\n\t\topt(opts)\n\t}\n\n\t// At this point we verify that we know of all the signers, as\n\t// otherwise we can't proceed with the session. This check is intended\n\t// to catch misuse of the API wherein a caller forgets to register the\n\t// remaining signers if they're doing nonce generation ahead of time.\n\tif len(c.opts.keySet) != c.opts.numSigners {\n\t\treturn nil, ErrNotEnoughSigners\n\t}\n\n\t// If an early nonce was specified, then we'll automatically add the\n\t// corresponding session option for the caller.\n\tvar localNonces *Nonces\n\tif c.sessionNonce != nil {\n\t\t// Apply the early nonce to the session, and also blank out the\n\t\t// session nonce on the context to ensure it isn't ever re-used\n\t\t// for another session.\n\t\tlocalNonces = c.sessionNonce\n\t\tc.sessionNonce = nil\n\t} else if opts.externalNonce != nil {\n\t\t// Otherwise if there's a custom nonce passed in via the\n\t\t// session options, then use that instead.\n\t\tlocalNonces = opts.externalNonce\n\t}\n\n\t// Now that we know we have enough signers, we'll either use the caller\n\t// specified nonce, or generate a fresh set.\n\tvar err error\n\tif localNonces == nil {\n\t\t// At this point we need to generate a fresh nonce. We'll pass\n\t\t// in some auxiliary information to strengthen the nonce\n\t\t// generated.\n\t\tlocalNonces, err = GenNonces(\n\t\t\tWithPublicKey(c.pubKey),\n\t\t\tWithNonceSecretKeyAux(c.signingKey),\n\t\t\tWithNonceCombinedKeyAux(c.combinedKey.FinalKey),\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\ts := &Session{\n\t\topts:        opts,\n\t\tctx:         c,\n\t\tlocalNonces: localNonces,\n\t\tpubNonces:   make([][PubNonceSize]byte, 0, c.opts.numSigners),\n\t\tsigs:        make([]*PartialSignature, 0, c.opts.numSigners),\n\t}\n\n\ts.pubNonces = append(s.pubNonces, localNonces.PubNonce)\n\n\treturn s, nil\n}\n\n// PublicNonce returns the public nonce for a signer. This should be sent to\n// other parties before signing begins, so they can compute the aggregated\n// public nonce.\nfunc (s *Session) PublicNonce() [PubNonceSize]byte {\n\treturn s.localNonces.PubNonce\n}\n\n// NumRegisteredNonces returns the total number of nonces that have been\n// registered so far.\nfunc (s *Session) NumRegisteredNonces() int {\n\treturn len(s.pubNonces)\n}\n\n// RegisterPubNonce should be called for each public nonce from the set of\n// signers. This method returns true once all the public nonces have been\n// accounted for.\nfunc (s *Session) RegisterPubNonce(nonce [PubNonceSize]byte) (bool, error) {\n\t// If we already have all the nonces, then this method was called too\n\t// many times.\n\thaveAllNonces := len(s.pubNonces) == s.ctx.opts.numSigners\n\tif haveAllNonces || s.combinedNonce != nil {\n\t\treturn false, ErrAlredyHaveAllNonces\n\t}\n\n\t// Add this nonce and check again if we already have tall the nonces we\n\t// need.\n\ts.pubNonces = append(s.pubNonces, nonce)\n\thaveAllNonces = len(s.pubNonces) == s.ctx.opts.numSigners\n\n\t// If we have all the nonces, then we can go ahead and combine them\n\t// now.\n\tif haveAllNonces {\n\t\tcombinedNonce, err := AggregateNonces(s.pubNonces)\n\t\tif err != nil {\n\t\t\treturn false, err\n\t\t}\n\n\t\ts.combinedNonce = &combinedNonce\n\t}\n\n\treturn haveAllNonces, nil\n}\n\n// CombinedNonce returns the combined public nonce for the signing session.\n// This will be available after either:\n//   - All individual nonces have been registered via RegisterPubNonce, or\n//   - A combined nonce has been registered via RegisterCombinedNonce\n//\n// If the combined nonce is not yet available, this method returns an error.\nfunc (s *Session) CombinedNonce() ([PubNonceSize]byte, error) {\n\tif s.combinedNonce == nil {\n\t\treturn [PubNonceSize]byte{}, ErrCombinedNonceUnavailable\n\t}\n\n\treturn *s.combinedNonce, nil\n}\n\n// RegisterCombinedNonce allows a caller to directly register a combined nonce\n// that was generated externally. This is useful in coordinator-based\n// protocols where the coordinator aggregates all nonces and distributes the\n// combined nonce to participants, rather than each participant aggregating\n// nonces themselves.\nfunc (s *Session) RegisterCombinedNonce(\n\tcombinedNonce [PubNonceSize]byte) error {\n\n\t// If we already have a combined nonce, then this method was called too\n\t// many times.\n\tif s.combinedNonce != nil {\n\t\treturn ErrAlredyHaveAllNonces\n\t}\n\n\t// We also don't allow this method to be called if we already registered\n\t// some public nonces.\n\tif len(s.pubNonces) > 1 {\n\t\treturn ErrCombinedNonceAfterPubNonces\n\t}\n\n\t// We'll now try to parse the combined nonce into it's two points to\n\t// ensure it's valid.\n\t_, err := btcec.ParsePubKey(combinedNonce[:33])\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid combined nonce: %w\", err)\n\t}\n\t_, err = btcec.ParsePubKey(combinedNonce[33:])\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid combined nonce: %w\", err)\n\t}\n\n\t// Otherwise, we'll just set the combined nonce directly.\n\ts.combinedNonce = &combinedNonce\n\n\treturn nil\n}\n\n// Sign generates a partial signature for the target message, using the target\n// context. If this method is called more than once per context, then an error\n// is returned, as that means a nonce was re-used.\nfunc (s *Session) Sign(msg [32]byte,\n\tsignOpts ...SignOption) (*PartialSignature, error) {\n\n\tswitch {\n\t// If no local nonce is present, then this means we already signed, so\n\t// we'll return an error to prevent nonce re-use.\n\tcase s.localNonces == nil:\n\t\treturn nil, ErrSigningContextReuse\n\n\t// We also need to make sure we have the combined nonce, otherwise this\n\t// function was called too early.\n\tcase s.combinedNonce == nil:\n\t\treturn nil, ErrCombinedNonceUnavailable\n\t}\n\n\tswitch {\n\tcase s.ctx.opts.bip86Tweak:\n\t\tsignOpts = append(\n\t\t\tsignOpts, WithBip86SignTweak(),\n\t\t)\n\tcase s.ctx.opts.taprootTweak != nil:\n\t\tsignOpts = append(\n\t\t\tsignOpts, WithTaprootSignTweak(s.ctx.opts.taprootTweak),\n\t\t)\n\tcase len(s.ctx.opts.tweaks) != 0:\n\t\tsignOpts = append(signOpts, WithTweaks(s.ctx.opts.tweaks...))\n\t}\n\n\tpartialSig, err := Sign(\n\t\ts.localNonces.SecNonce, s.ctx.signingKey, *s.combinedNonce,\n\t\ts.ctx.opts.keySet, msg, signOpts...,\n\t)\n\n\t// Now that we've generated our signature, we'll make sure to blank out\n\t// our signing nonce.\n\ts.localNonces = nil\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ts.msg = msg\n\n\ts.ourSig = partialSig\n\ts.sigs = append(s.sigs, partialSig)\n\n\treturn partialSig, nil\n}\n\n// CombineSig buffers a partial signature received from a signing party. The\n// method returns true once all the signatures are available, and can be\n// combined into the final signature.\nfunc (s *Session) CombineSig(sig *PartialSignature) (bool, error) {\n\t// First check if we already have all the signatures we need. We\n\t// already accumulated our own signature when we generated the sig.\n\thaveAllSigs := len(s.sigs) == len(s.ctx.opts.keySet)\n\tif haveAllSigs {\n\t\treturn false, ErrAlredyHaveAllSigs\n\t}\n\n\t// TODO(roasbeef): incremental check for invalid sig, or just detect at\n\t// the very end?\n\n\t// Accumulate this sig, and check again if we have all the sigs we\n\t// need.\n\ts.sigs = append(s.sigs, sig)\n\thaveAllSigs = len(s.sigs) == len(s.ctx.opts.keySet)\n\n\t// If we have all the signatures, then we can combine them all into the\n\t// final signature.\n\tif haveAllSigs {\n\t\tvar combineOpts []CombineOption\n\t\tswitch {\n\t\tcase s.ctx.opts.bip86Tweak:\n\t\t\tcombineOpts = append(\n\t\t\t\tcombineOpts, WithBip86TweakedCombine(\n\t\t\t\t\ts.msg, s.ctx.opts.keySet,\n\t\t\t\t\ts.ctx.shouldSort,\n\t\t\t\t),\n\t\t\t)\n\t\tcase s.ctx.opts.taprootTweak != nil:\n\t\t\tcombineOpts = append(\n\t\t\t\tcombineOpts, WithTaprootTweakedCombine(\n\t\t\t\t\ts.msg, s.ctx.opts.keySet,\n\t\t\t\t\ts.ctx.opts.taprootTweak, s.ctx.shouldSort,\n\t\t\t\t),\n\t\t\t)\n\t\tcase len(s.ctx.opts.tweaks) != 0:\n\t\t\tcombineOpts = append(\n\t\t\t\tcombineOpts, WithTweakedCombine(\n\t\t\t\t\ts.msg, s.ctx.opts.keySet,\n\t\t\t\t\ts.ctx.opts.tweaks, s.ctx.shouldSort,\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\n\t\tfinalSig := CombineSigs(s.ourSig.R, s.sigs, combineOpts...)\n\n\t\t// We'll also verify the signature at this point to ensure it's\n\t\t// valid.\n\t\t//\n\t\t// TODO(roasbef): allow skipping?\n\t\tif !finalSig.Verify(s.msg[:], s.ctx.combinedKey.FinalKey) {\n\t\t\treturn false, ErrFinalSigInvalid\n\t\t}\n\n\t\ts.finalSig = finalSig\n\t}\n\n\treturn haveAllSigs, nil\n}\n\n// FinalSig returns the final combined multi-signature, if present.\nfunc (s *Session) FinalSig() *schnorr.Signature {\n\treturn s.finalSig\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/data/key_agg_vectors.json",
    "content": "{\n    \"pubkeys\": [\n        \"02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9\",\n        \"03DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659\",\n        \"023590A94E768F8E1815C2F24B4D80A8E3149316C3518CE7B7AD338368D038CA66\",\n        \"020000000000000000000000000000000000000000000000000000000000000005\",\n        \"02FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC30\",\n        \"04F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9\",\n        \"03935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9\"\n    ],\n    \"tweaks\": [\n        \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\",\n        \"252E4BD67410A76CDF933D30EAA1608214037F1B105A013ECCD3C5C184A6110B\"\n    ],\n    \"valid_test_cases\": [\n        {\n            \"key_indices\": [0, 1, 2],\n            \"expected\": \"90539EEDE565F5D054F32CC0C220126889ED1E5D193BAF15AEF344FE59D4610C\"\n        },\n        {\n            \"key_indices\": [2, 1, 0],\n            \"expected\": \"6204DE8B083426DC6EAF9502D27024D53FC826BF7D2012148A0575435DF54B2B\"\n        },\n        {\n            \"key_indices\": [0, 0, 0],\n            \"expected\": \"B436E3BAD62B8CD409969A224731C193D051162D8C5AE8B109306127DA3AA935\"\n        },\n        {\n            \"key_indices\": [0, 0, 1, 1],\n            \"expected\": \"69BC22BFA5D106306E48A20679DE1D7389386124D07571D0D872686028C26A3E\"\n        }\n    ],\n    \"error_test_cases\": [\n        {\n            \"key_indices\": [0, 3],\n            \"tweak_indices\": [],\n            \"is_xonly\": [],\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": 1,\n                \"contrib\": \"pubkey\"\n            },\n            \"comment\": \"Invalid public key\"\n        },\n        {\n            \"key_indices\": [0, 4],\n            \"tweak_indices\": [],\n            \"is_xonly\": [],\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": 1,\n                \"contrib\": \"pubkey\"\n            },\n            \"comment\": \"Public key exceeds field size\"\n        },\n        {\n            \"key_indices\": [5, 0],\n            \"tweak_indices\": [],\n            \"is_xonly\": [],\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": 0,\n                \"contrib\": \"pubkey\"\n            },\n            \"comment\": \"First byte of public key is not 2 or 3\"\n        },\n        {\n            \"key_indices\": [0, 1],\n            \"tweak_indices\": [0],\n            \"is_xonly\": [true],\n            \"error\": {\n                \"type\": \"value\",\n                \"message\": \"The tweak must be less than n.\"\n            },\n            \"comment\": \"Tweak is out of range\"\n        },\n        {\n            \"key_indices\": [6],\n            \"tweak_indices\": [1],\n            \"is_xonly\": [false],\n            \"error\": {\n                \"type\": \"value\",\n                \"message\": \"The result of tweaking cannot be infinity.\"\n            },\n            \"comment\": \"Intermediate tweaking result is point at infinity\"\n        }\n    ]\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/data/key_sort_vectors.json",
    "content": "{\n    \"pubkeys\": [\n        \"02DD308AFEC5777E13121FA72B9CC1B7CC0139715309B086C960E18FD969774EB8\",\n        \"02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9\",\n        \"03DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659\",\n        \"023590A94E768F8E1815C2F24B4D80A8E3149316C3518CE7B7AD338368D038CA66\",\n        \"02DD308AFEC5777E13121FA72B9CC1B7CC0139715309B086C960E18FD969774EB8\"\n    ],\n    \"sorted_pubkeys\": [\n        \"023590A94E768F8E1815C2F24B4D80A8E3149316C3518CE7B7AD338368D038CA66\",\n        \"02DD308AFEC5777E13121FA72B9CC1B7CC0139715309B086C960E18FD969774EB8\",\n        \"02DD308AFEC5777E13121FA72B9CC1B7CC0139715309B086C960E18FD969774EB8\",\n        \"02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9\",\n        \"03DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659\"\n    ]\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/data/nonce_agg_vectors.json",
    "content": "{\n    \"pnonces\": [\n        \"020151C80F435648DF67A22B749CD798CE54E0321D034B92B709B567D60A42E66603BA47FBC1834437B3212E89A84D8425E7BF12E0245D98262268EBDCB385D50641\",\n        \"03FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A60248C264CDD57D3C24D79990B0F865674EB62A0F9018277A95011B41BFC193B833\",\n        \"020151C80F435648DF67A22B749CD798CE54E0321D034B92B709B567D60A42E6660279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798\",\n        \"03FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A60379BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798\",\n        \"04FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A60248C264CDD57D3C24D79990B0F865674EB62A0F9018277A95011B41BFC193B833\",\n        \"03FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A60248C264CDD57D3C24D79990B0F865674EB62A0F9018277A95011B41BFC193B831\",\n        \"03FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A602FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC30\"\n    ],\n    \"valid_test_cases\": [\n        {\n            \"pnonce_indices\": [0, 1],\n            \"expected\": \"035FE1873B4F2967F52FEA4A06AD5A8ECCBE9D0FD73068012C894E2E87CCB5804B024725377345BDE0E9C33AF3C43C0A29A9249F2F2956FA8CFEB55C8573D0262DC8\"\n        },\n        {\n            \"pnonce_indices\": [2, 3],\n            \"expected\": \"035FE1873B4F2967F52FEA4A06AD5A8ECCBE9D0FD73068012C894E2E87CCB5804B000000000000000000000000000000000000000000000000000000000000000000\",\n            \"comment\": \"Sum of second points encoded in the nonces is point at infinity which is serialized as 33 zero bytes\"\n        }\n    ],\n    \"error_test_cases\": [\n        {\n            \"pnonce_indices\": [0, 4],\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": 1,\n                \"contrib\": \"pubnonce\"\n            },\n            \"comment\": \"Public nonce from signer 1 is invalid due wrong tag, 0x04, in the first half\",\n            \"btcec_err\": \"invalid public key: unsupported format: 4\"\n        },\n        {\n            \"pnonce_indices\": [5, 1],\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": 0,\n                \"contrib\": \"pubnonce\"\n            },\n            \"comment\": \"Public nonce from signer 0 is invalid because the second half does not correspond to an X coordinate\",\n            \"btcec_err\": \"invalid public key: x coordinate 48c264cdd57d3c24d79990b0f865674eb62a0f9018277a95011b41bfc193b831 is not on the secp256k1 curve\"\n        },\n        {\n            \"pnonce_indices\": [6, 1],\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": 0,\n                \"contrib\": \"pubnonce\"\n            },\n            \"comment\": \"Public nonce from signer 0 is invalid because second half exceeds field size\",\n            \"btcec_err\": \"invalid public key: x >= field prime\"\n        }\n    ]\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/data/nonce_gen_vectors.json",
    "content": "{\n    \"test_cases\": [\n        {\n            \"rand_\": \"0000000000000000000000000000000000000000000000000000000000000000\",\n            \"sk\": \"0202020202020202020202020202020202020202020202020202020202020202\",\n            \"pk\": \"024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766\",\n            \"aggpk\": \"0707070707070707070707070707070707070707070707070707070707070707\",\n            \"msg\": \"0101010101010101010101010101010101010101010101010101010101010101\",\n            \"extra_in\": \"0808080808080808080808080808080808080808080808080808080808080808\",\n            \"expected\": \"227243DCB40EF2A13A981DB188FA433717B506BDFA14B1AE47D5DC027C9C3B9EF2370B2AD206E724243215137C86365699361126991E6FEC816845F837BDDAC3024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766\"\n        },\n        {\n            \"rand_\": \"0000000000000000000000000000000000000000000000000000000000000000\",\n            \"sk\": \"0202020202020202020202020202020202020202020202020202020202020202\",\n            \"pk\": \"024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766\",\n            \"aggpk\": \"0707070707070707070707070707070707070707070707070707070707070707\",\n            \"msg\": \"\",\n            \"extra_in\": \"0808080808080808080808080808080808080808080808080808080808080808\",\n            \"expected\": \"CD0F47FE471D6788FF3243F47345EA0A179AEF69476BE8348322EF39C2723318870C2065AFB52DEDF02BF4FDBF6D2F442E608692F50C2374C08FFFE57042A61C024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766\"\n        },\n        {\n            \"rand_\": \"0000000000000000000000000000000000000000000000000000000000000000\",\n            \"sk\": \"0202020202020202020202020202020202020202020202020202020202020202\",\n            \"pk\": \"024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766\",\n            \"aggpk\": \"0707070707070707070707070707070707070707070707070707070707070707\",\n            \"msg\": \"2626262626262626262626262626262626262626262626262626262626262626262626262626\",\n            \"extra_in\": \"0808080808080808080808080808080808080808080808080808080808080808\",\n            \"expected\": \"011F8BC60EF061DEEF4D72A0A87200D9994B3F0CD9867910085C38D5366E3E6B9FF03BC0124E56B24069E91EC3F162378983F194E8BD0ED89BE3059649EAE262024D4B6CD1361032CA9BD2AEB9D900AA4D45D9EAD80AC9423374C451A7254D0766\"\n        },\n        {\n            \"rand_\": \"0000000000000000000000000000000000000000000000000000000000000000\",\n            \"sk\": null,\n            \"pk\": \"02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9\",\n            \"aggpk\": null,\n            \"msg\": null,\n            \"extra_in\": null,\n            \"expected\": \"890E83616A3BC4640AB9B6374F21C81FF89CDDDBAFAA7475AE2A102A92E3EDB29FD7E874E23342813A60D9646948242646B7951CA046B4B36D7D6078506D3C9402F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9\"\n        }\n    ]\n}"
  },
  {
    "path": "btcec/schnorr/musig2/data/sig_agg_vectors.json",
    "content": "{\n    \"pubkeys\": [\n        \"03935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9\",\n        \"02D2DC6F5DF7C56ACF38C7FA0AE7A759AE30E19B37359DFDE015872324C7EF6E05\",\n        \"03C7FB101D97FF930ACD0C6760852EF64E69083DE0B06AC6335724754BB4B0522C\",\n        \"02352433B21E7E05D3B452B81CAE566E06D2E003ECE16D1074AABA4289E0E3D581\"\n    ],\n    \"pnonces\": [\n        \"036E5EE6E28824029FEA3E8A9DDD2C8483F5AF98F7177C3AF3CB6F47CAF8D94AE902DBA67E4A1F3680826172DA15AFB1A8CA85C7C5CC88900905C8DC8C328511B53E\",\n        \"03E4F798DA48A76EEC1C9CC5AB7A880FFBA201A5F064E627EC9CB0031D1D58FC5103E06180315C5A522B7EC7C08B69DCD721C313C940819296D0A7AB8E8795AC1F00\",\n        \"02C0068FD25523A31578B8077F24F78F5BD5F2422AFF47C1FADA0F36B3CEB6C7D202098A55D1736AA5FCC21CF0729CCE852575C06C081125144763C2C4C4A05C09B6\",\n        \"031F5C87DCFBFCF330DEE4311D85E8F1DEA01D87A6F1C14CDFC7E4F1D8C441CFA40277BF176E9F747C34F81B0D9F072B1B404A86F402C2D86CF9EA9E9C69876EA3B9\",\n        \"023F7042046E0397822C4144A17F8B63D78748696A46C3B9F0A901D296EC3406C302022B0B464292CF9751D699F10980AC764E6F671EFCA15069BBE62B0D1C62522A\",\n        \"02D97DDA5988461DF58C5897444F116A7C74E5711BF77A9446E27806563F3B6C47020CBAD9C363A7737F99FA06B6BE093CEAFF5397316C5AC46915C43767AE867C00\"\n    ],\n    \"tweaks\": [\n        \"B511DA492182A91B0FFB9A98020D55F260AE86D7ECBD0399C7383D59A5F2AF7C\",\n        \"A815FE049EE3C5AAB66310477FBC8BCCCAC2F3395F59F921C364ACD78A2F48DC\",\n        \"75448A87274B056468B977BE06EB1E9F657577B7320B0A3376EA51FD420D18A8\"\n    ],\n    \"psigs\": [\n        \"B15D2CD3C3D22B04DAE438CE653F6B4ECF042F42CFDED7C41B64AAF9B4AF53FB\",\n        \"6193D6AC61B354E9105BBDC8937A3454A6D705B6D57322A5A472A02CE99FCB64\",\n        \"9A87D3B79EC67228CB97878B76049B15DBD05B8158D17B5B9114D3C226887505\",\n        \"66F82EA90923689B855D36C6B7E032FB9970301481B99E01CDB4D6AC7C347A15\",\n        \"4F5AEE41510848A6447DCD1BBC78457EF69024944C87F40250D3EF2C25D33EFE\",\n        \"DDEF427BBB847CC027BEFF4EDB01038148917832253EBC355FC33F4A8E2FCCE4\",\n        \"97B890A26C981DA8102D3BC294159D171D72810FDF7C6A691DEF02F0F7AF3FDC\",\n        \"53FA9E08BA5243CBCB0D797C5EE83BC6728E539EB76C2D0BF0F971EE4E909971\",\n        \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\"\n    ],\n    \"msg\": \"599C67EA410D005B9DA90817CF03ED3B1C868E4DA4EDF00A5880B0082C237869\",\n    \"valid_test_cases\": [\n        {\n            \"aggnonce\": \"0341432722C5CD0268D829C702CF0D1CBCE57033EED201FD335191385227C3210C03D377F2D258B64AADC0E16F26462323D701D286046A2EA93365656AFD9875982B\",\n            \"nonce_indices\": [\n                0,\n                1\n            ],\n            \"key_indices\": [\n                0,\n                1\n            ],\n            \"tweak_indices\": [],\n            \"is_xonly\": [],\n            \"psig_indices\": [\n                0,\n                1\n            ],\n            \"expected\": \"041DA22223CE65C92C9A0D6C2CAC828AAF1EEE56304FEC371DDF91EBB2B9EF0912F1038025857FEDEB3FF696F8B99FA4BB2C5812F6095A2E0004EC99CE18DE1E\"\n        },\n        {\n            \"aggnonce\": \"0224AFD36C902084058B51B5D36676BBA4DC97C775873768E58822F87FE437D792028CB15929099EEE2F5DAE404CD39357591BA32E9AF4E162B8D3E7CB5EFE31CB20\",\n            \"nonce_indices\": [\n                0,\n                2\n            ],\n            \"key_indices\": [\n                0,\n                2\n            ],\n            \"tweak_indices\": [],\n            \"is_xonly\": [],\n            \"psig_indices\": [\n                2,\n                3\n            ],\n            \"expected\": \"1069B67EC3D2F3C7C08291ACCB17A9C9B8F2819A52EB5DF8726E17E7D6B52E9F01800260A7E9DAC450F4BE522DE4CE12BA91AEAF2B4279219EF74BE1D286ADD9\"\n        },\n        {\n            \"aggnonce\": \"0208C5C438C710F4F96A61E9FF3C37758814B8C3AE12BFEA0ED2C87FF6954FF186020B1816EA104B4FCA2D304D733E0E19CEAD51303FF6420BFD222335CAA402916D\",\n            \"nonce_indices\": [\n                0,\n                3\n            ],\n            \"key_indices\": [\n                0,\n                2\n            ],\n            \"tweak_indices\": [\n                0\n            ],\n            \"is_xonly\": [\n                false\n            ],\n            \"psig_indices\": [\n                4,\n                5\n            ],\n            \"expected\": \"5C558E1DCADE86DA0B2F02626A512E30A22CF5255CAEA7EE32C38E9A71A0E9148BA6C0E6EC7683B64220F0298696F1B878CD47B107B81F7188812D593971E0CC\"\n        },\n        {\n            \"aggnonce\": \"02B5AD07AFCD99B6D92CB433FBD2A28FDEB98EAE2EB09B6014EF0F8197CD58403302E8616910F9293CF692C49F351DB86B25E352901F0E237BAFDA11F1C1CEF29FFD\",\n            \"nonce_indices\": [\n                0,\n                4\n            ],\n            \"key_indices\": [\n                0,\n                3\n            ],\n            \"tweak_indices\": [\n                0,\n                1,\n                2\n            ],\n            \"is_xonly\": [\n                true,\n                false,\n                true\n            ],\n            \"psig_indices\": [\n                6,\n                7\n            ],\n            \"expected\": \"839B08820B681DBA8DAF4CC7B104E8F2638F9388F8D7A555DC17B6E6971D7426CE07BF6AB01F1DB50E4E33719295F4094572B79868E440FB3DEFD3FAC1DB589E\"\n        }\n    ],\n    \"error_test_cases\": [\n        {\n            \"aggnonce\": \"02B5AD07AFCD99B6D92CB433FBD2A28FDEB98EAE2EB09B6014EF0F8197CD58403302E8616910F9293CF692C49F351DB86B25E352901F0E237BAFDA11F1C1CEF29FFD\",\n            \"nonce_indices\": [\n                0,\n                4\n            ],\n            \"key_indices\": [\n                0,\n                3\n            ],\n            \"tweak_indices\": [\n                0,\n                1,\n                2\n            ],\n            \"is_xonly\": [\n                true,\n                false,\n                true\n            ],\n            \"psig_indices\": [\n                7,\n                8\n            ],\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": 1\n            },\n            \"comment\": \"Partial signature is invalid because it exceeds group size\"\n        }\n    ]\n}"
  },
  {
    "path": "btcec/schnorr/musig2/data/sign_verify_vectors.json",
    "content": "{\n    \"sk\": \"7FB9E0E687ADA1EEBF7ECFE2F21E73EBDB51A7D450948DFE8D76D7F2D1007671\",\n    \"pubkeys\": [\n        \"03935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9\",\n        \"02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9\",\n        \"02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA661\",\n        \"020000000000000000000000000000000000000000000000000000000000000007\"\n    ],\n    \"secnonces\": [\n        \"508B81A611F100A6B2B6B29656590898AF488BCF2E1F55CF22E5CFB84421FE61FA27FD49B1D50085B481285E1CA205D55C82CC1B31FF5CD54A489829355901F703935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9\",\n        \"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9\"\n    ],\n    \"pnonces\": [\n        \"0337C87821AFD50A8644D820A8F3E02E499C931865C2360FB43D0A0D20DAFE07EA0287BF891D2A6DEAEBADC909352AA9405D1428C15F4B75F04DAE642A95C2548480\",\n        \"0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798\",\n        \"032DE2662628C90B03F5E720284EB52FF7D71F4284F627B68A853D78C78E1FFE9303E4C5524E83FFE1493B9077CF1CA6BEB2090C93D930321071AD40B2F44E599046\",\n        \"0237C87821AFD50A8644D820A8F3E02E499C931865C2360FB43D0A0D20DAFE07EA0387BF891D2A6DEAEBADC909352AA9405D1428C15F4B75F04DAE642A95C2548480\",\n        \"020000000000000000000000000000000000000000000000000000000000000009\"\n    ],\n    \"aggnonces\": [\n        \"028465FCF0BBDBCF443AABCCE533D42B4B5A10966AC09A49655E8C42DAAB8FCD61037496A3CC86926D452CAFCFD55D25972CA1675D549310DE296BFF42F72EEEA8C9\",\n        \"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n        \"048465FCF0BBDBCF443AABCCE533D42B4B5A10966AC09A49655E8C42DAAB8FCD61037496A3CC86926D452CAFCFD55D25972CA1675D549310DE296BFF42F72EEEA8C9\",\n        \"028465FCF0BBDBCF443AABCCE533D42B4B5A10966AC09A49655E8C42DAAB8FCD61020000000000000000000000000000000000000000000000000000000000000009\",\n        \"028465FCF0BBDBCF443AABCCE533D42B4B5A10966AC09A49655E8C42DAAB8FCD6102FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC30\"\n    ],\n    \"msgs\": [\n        \"F95466D086770E689964664219266FE5ED215C92AE20BAB5C9D79ADDDDF3C0CF\",\n        \"\",\n        \"2626262626262626262626262626262626262626262626262626262626262626262626262626\"\n    ],\n    \"valid_test_cases\": [\n        {\n            \"key_indices\": [0, 1, 2],\n            \"nonce_indices\": [0, 1, 2],\n            \"aggnonce_index\": 0,\n            \"msg_index\": 0,\n            \"signer_index\": 0,\n            \"expected\": \"012ABBCB52B3016AC03AD82395A1A415C48B93DEF78718E62A7A90052FE224FB\"\n        },\n        {\n            \"key_indices\": [1, 0, 2],\n            \"nonce_indices\": [1, 0, 2],\n            \"aggnonce_index\": 0,\n            \"msg_index\": 0,\n            \"signer_index\": 1,\n            \"expected\": \"9FF2F7AAA856150CC8819254218D3ADEEB0535269051897724F9DB3789513A52\"\n        },\n        {\n            \"key_indices\": [1, 2, 0],\n            \"nonce_indices\": [1, 2, 0],\n            \"aggnonce_index\": 0,\n            \"msg_index\": 0,\n            \"signer_index\": 2,\n            \"expected\": \"FA23C359F6FAC4E7796BB93BC9F0532A95468C539BA20FF86D7C76ED92227900\"\n        },\n        {\n            \"key_indices\": [0, 1],\n            \"nonce_indices\": [0, 3],\n            \"aggnonce_index\": 1,\n            \"msg_index\": 0,\n            \"signer_index\": 0,\n            \"expected\": \"AE386064B26105404798F75DE2EB9AF5EDA5387B064B83D049CB7C5E08879531\",\n            \"comment\": \"Both halves of aggregate nonce correspond to point at infinity\"\n        }\n    ],\n    \"sign_error_test_cases\": [\n        {\n            \"key_indices\": [1, 2],\n            \"aggnonce_index\": 0,\n            \"msg_index\": 0,\n            \"secnonce_index\": 0,\n            \"error\": {\n                \"type\": \"value\",\n                \"message\": \"The signer's pubkey must be included in the list of pubkeys.\"\n            },\n            \"comment\": \"The signers pubkey is not in the list of pubkeys\"\n        },\n        {\n            \"key_indices\": [1, 0, 3],\n            \"aggnonce_index\": 0,\n            \"msg_index\": 0,\n            \"secnonce_index\": 0,\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": 2,\n                \"contrib\": \"pubkey\"\n            },\n            \"comment\": \"Signer 2 provided an invalid public key\"\n        },\n        {\n            \"key_indices\": [1, 2, 0],\n            \"aggnonce_index\": 2,\n            \"msg_index\": 0,\n            \"secnonce_index\": 0,\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": null,\n                \"contrib\": \"aggnonce\"\n            },\n            \"comment\": \"Aggregate nonce is invalid due wrong tag, 0x04, in the first half\"\n        },\n        {\n            \"key_indices\": [1, 2, 0],\n            \"aggnonce_index\": 3,\n            \"msg_index\": 0,\n            \"secnonce_index\": 0,\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": null,\n                \"contrib\": \"aggnonce\"\n            },\n            \"comment\": \"Aggregate nonce is invalid because the second half does not correspond to an X coordinate\"\n        },\n        {\n            \"key_indices\": [1, 2, 0],\n            \"aggnonce_index\": 4,\n            \"msg_index\": 0,\n            \"secnonce_index\": 0,\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": null,\n                \"contrib\": \"aggnonce\"\n            },\n            \"comment\": \"Aggregate nonce is invalid because second half exceeds field size\"\n        },\n        {\n            \"key_indices\": [0, 1, 2],\n            \"aggnonce_index\": 0,\n            \"msg_index\": 0,\n            \"signer_index\": 0,\n            \"secnonce_index\": 1,\n            \"error\": {\n                \"type\": \"value\",\n                \"message\": \"first secnonce value is out of range.\"\n            },\n            \"comment\": \"Secnonce is invalid which may indicate nonce reuse\"\n        }\n    ],\n    \"verify_fail_test_cases\": [\n        {\n            \"sig\": \"97AC833ADCB1AFA42EBF9E0725616F3C9A0D5B614F6FE283CEAAA37A8FFAF406\",\n            \"key_indices\": [0, 1, 2],\n            \"nonce_indices\": [0, 1, 2],\n            \"msg_index\": 0,\n            \"signer_index\": 0,\n            \"comment\": \"Wrong signature (which is equal to the negation of valid signature)\"\n        },\n        {\n            \"sig\": \"68537CC5234E505BD14061F8DA9E90C220A181855FD8BDB7F127BB12403B4D3B\",\n            \"key_indices\": [0, 1, 2],\n            \"nonce_indices\": [0, 1, 2],\n            \"msg_index\": 0,\n            \"signer_index\": 1,\n            \"comment\": \"Wrong signer\"\n        },\n        {\n            \"sig\": \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\",\n            \"key_indices\": [0, 1, 2],\n            \"nonce_indices\": [0, 1, 2],\n            \"msg_index\": 0,\n            \"signer_index\": 0,\n            \"comment\": \"Signature exceeds group size\"\n        }\n    ],\n    \"verify_error_test_cases\": [\n        {\n            \"sig\": \"68537CC5234E505BD14061F8DA9E90C220A181855FD8BDB7F127BB12403B4D3B\",\n            \"key_indices\": [0, 1, 2],\n            \"nonce_indices\": [4, 1, 2],\n            \"msg_index\": 0,\n            \"signer_index\": 0,\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": 0,\n                \"contrib\": \"pubnonce\"\n            },\n            \"comment\": \"Invalid pubnonce\"\n        },\n        {\n            \"sig\": \"68537CC5234E505BD14061F8DA9E90C220A181855FD8BDB7F127BB12403B4D3B\",\n            \"key_indices\": [3, 1, 2],\n            \"nonce_indices\": [0, 1, 2],\n            \"msg_index\": 0,\n            \"signer_index\": 0,\n            \"error\": {\n                \"type\": \"invalid_contribution\",\n                \"signer\": 0,\n                \"contrib\": \"pubkey\"\n            },\n            \"comment\": \"Invalid pubkey\"\n        }\n    ]\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/data/tweak_vectors.json",
    "content": "{\n    \"sk\": \"7FB9E0E687ADA1EEBF7ECFE2F21E73EBDB51A7D450948DFE8D76D7F2D1007671\",\n    \"pubkeys\": [\n        \"03935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9\",\n        \"02F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9\",\n        \"02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659\"\n    ],\n    \"secnonce\": \"508B81A611F100A6B2B6B29656590898AF488BCF2E1F55CF22E5CFB84421FE61FA27FD49B1D50085B481285E1CA205D55C82CC1B31FF5CD54A489829355901F703935F972DA013F80AE011890FA89B67A27B7BE6CCB24D3274D18B2D4067F261A9\",\n    \"pnonces\": [\n        \"0337C87821AFD50A8644D820A8F3E02E499C931865C2360FB43D0A0D20DAFE07EA0287BF891D2A6DEAEBADC909352AA9405D1428C15F4B75F04DAE642A95C2548480\",\n        \"0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798\",\n        \"032DE2662628C90B03F5E720284EB52FF7D71F4284F627B68A853D78C78E1FFE9303E4C5524E83FFE1493B9077CF1CA6BEB2090C93D930321071AD40B2F44E599046\"\n    ],\n    \"aggnonce\": \"028465FCF0BBDBCF443AABCCE533D42B4B5A10966AC09A49655E8C42DAAB8FCD61037496A3CC86926D452CAFCFD55D25972CA1675D549310DE296BFF42F72EEEA8C9\",\n    \"tweaks\": [\n        \"E8F791FF9225A2AF0102AFFF4A9A723D9612A682A25EBE79802B263CDFCD83BB\",\n        \"AE2EA797CC0FE72AC5B97B97F3C6957D7E4199A167A58EB08BCAFFDA70AC0455\",\n        \"F52ECBC565B3D8BEA2DFD5B75A4F457E54369809322E4120831626F290FA87E0\",\n        \"1969AD73CC177FA0B4FCED6DF1F7BF9907E665FDE9BA196A74FED0A3CF5AEF9D\",\n        \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\"\n    ],\n    \"msg\": \"F95466D086770E689964664219266FE5ED215C92AE20BAB5C9D79ADDDDF3C0CF\",\n    \"valid_test_cases\": [\n        {\n            \"key_indices\": [1, 2, 0],\n            \"nonce_indices\": [1, 2, 0],\n            \"tweak_indices\": [0],\n            \"is_xonly\": [true],\n            \"signer_index\": 2,\n            \"expected\": \"E28A5C66E61E178C2BA19DB77B6CF9F7E2F0F56C17918CD13135E60CC848FE91\",\n            \"comment\": \"A single x-only tweak\"\n        },\n        {\n            \"key_indices\": [1, 2, 0],\n            \"nonce_indices\": [1, 2, 0],\n            \"tweak_indices\": [0],\n            \"is_xonly\": [false],\n            \"signer_index\": 2,\n            \"expected\": \"38B0767798252F21BF5702C48028B095428320F73A4B14DB1E25DE58543D2D2D\",\n            \"comment\": \"A single plain tweak\"\n        },\n        {\n            \"key_indices\": [1, 2, 0],\n            \"nonce_indices\": [1, 2, 0],\n            \"tweak_indices\": [0, 1],\n            \"is_xonly\": [false, true],\n            \"signer_index\": 2,\n            \"expected\": \"408A0A21C4A0F5DACAF9646AD6EB6FECD7F7A11F03ED1F48DFFF2185BC2C2408\",\n            \"comment\": \"A plain tweak followed by an x-only tweak\"\n        },\n        {\n            \"key_indices\": [1, 2, 0],\n            \"nonce_indices\": [1, 2, 0],\n            \"tweak_indices\": [0, 1, 2, 3],\n            \"is_xonly\": [false, false, true, true],\n            \"signer_index\": 2,\n            \"expected\": \"45ABD206E61E3DF2EC9E264A6FEC8292141A633C28586388235541F9ADE75435\",\n            \"comment\": \"Four tweaks: plain, plain, x-only, x-only.\"\n        },\n        {\n            \"key_indices\": [1, 2, 0],\n            \"nonce_indices\": [1, 2, 0],\n            \"tweak_indices\": [0, 1, 2, 3],\n            \"is_xonly\": [true, false, true, false],\n            \"signer_index\": 2,\n            \"expected\": \"B255FDCAC27B40C7CE7848E2D3B7BF5EA0ED756DA81565AC804CCCA3E1D5D239\",\n            \"comment\": \"Four tweaks: x-only, plain, x-only, plain. If an implementation prohibits applying plain tweaks after x-only tweaks, it can skip this test vector or return an error.\"\n        }\n    ],\n    \"error_test_cases\": [\n        {\n            \"key_indices\": [1, 2, 0],\n            \"nonce_indices\": [1, 2, 0],\n            \"tweak_indices\": [4],\n            \"is_xonly\": [false],\n            \"signer_index\": 2,\n            \"error\": {\n                \"type\": \"value\",\n                \"message\": \"The tweak must be less than n.\"\n            },\n            \"comment\": \"Tweak is invalid because it exceeds group size\"\n        }\n    ]\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/keys.go",
    "content": "// Copyright 2013-2022 The btcsuite developers\n\npackage musig2\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"sort\"\n\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nvar (\n\t// KeyAggTagList is the tagged hash tag used to compute the hash of the\n\t// list of sorted public keys.\n\tKeyAggTagList = []byte(\"KeyAgg list\")\n\n\t// KeyAggTagCoeff is the tagged hash tag used to compute the key\n\t// aggregation coefficient for each key.\n\tKeyAggTagCoeff = []byte(\"KeyAgg coefficient\")\n\n\t// ErrTweakedKeyIsInfinity is returned if while tweaking a key, we end\n\t// up with the point at infinity.\n\tErrTweakedKeyIsInfinity = fmt.Errorf(\"tweaked key is infinity point\")\n\n\t// ErrTweakedKeyOverflows is returned if a tweaking key is larger than\n\t// 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141.\n\tErrTweakedKeyOverflows = fmt.Errorf(\"tweaked key is too large\")\n)\n\n// sortableKeys defines a type of slice of public keys that implements the sort\n// interface for BIP 340 keys.\ntype sortableKeys []*btcec.PublicKey\n\n// Less reports whether the element with index i must sort before the element\n// with index j.\nfunc (s sortableKeys) Less(i, j int) bool {\n\t// TODO(roasbeef): more efficient way to compare...\n\tkeyIBytes := s[i].SerializeCompressed()\n\tkeyJBytes := s[j].SerializeCompressed()\n\n\treturn bytes.Compare(keyIBytes, keyJBytes) == -1\n}\n\n// Swap swaps the elements with indexes i and j.\nfunc (s sortableKeys) Swap(i, j int) {\n\ts[i], s[j] = s[j], s[i]\n}\n\n// Len is the number of elements in the collection.\nfunc (s sortableKeys) Len() int {\n\treturn len(s)\n}\n\n// sortKeys takes a set of public keys and returns a new slice that is a copy\n// of the keys sorted in lexicographical order bytes on the x-only pubkey\n// serialization.\nfunc sortKeys(keys []*btcec.PublicKey) []*btcec.PublicKey {\n\tkeySet := sortableKeys(keys)\n\tif sort.IsSorted(keySet) {\n\t\treturn keys\n\t}\n\n\tsort.Sort(keySet)\n\treturn keySet\n}\n\n// keyHashFingerprint computes the tagged hash of the series of (sorted) public\n// keys passed as input. This is used to compute the aggregation coefficient\n// for each key. The final computation is:\n//   - H(tag=KeyAgg list, pk1 || pk2..)\nfunc keyHashFingerprint(keys []*btcec.PublicKey, sort bool) []byte {\n\tif sort {\n\t\tkeys = sortKeys(keys)\n\t}\n\n\t// We'll create a single buffer and slice into that so the bytes buffer\n\t// doesn't continually need to grow the underlying buffer.\n\tkeyAggBuf := make([]byte, 33*len(keys))\n\tkeyBytes := bytes.NewBuffer(keyAggBuf[0:0])\n\tfor _, key := range keys {\n\t\tkeyBytes.Write(key.SerializeCompressed())\n\t}\n\n\th := chainhash.TaggedHash(KeyAggTagList, keyBytes.Bytes())\n\treturn h[:]\n}\n\n// keyBytesEqual returns true if two keys are the same based on the compressed\n// serialization of each key.\nfunc keyBytesEqual(a, b *btcec.PublicKey) bool {\n\treturn bytes.Equal(a.SerializeCompressed(), b.SerializeCompressed())\n}\n\n// aggregationCoefficient computes the key aggregation coefficient for the\n// specified target key. The coefficient is computed as:\n//   - H(tag=KeyAgg coefficient, keyHashFingerprint(pks) || pk)\nfunc aggregationCoefficient(keySet []*btcec.PublicKey,\n\ttargetKey *btcec.PublicKey, keysHash []byte,\n\tsecondKeyIdx int) *btcec.ModNScalar {\n\n\tvar mu btcec.ModNScalar\n\n\t// If this is the second key, then this coefficient is just one.\n\tif secondKeyIdx != -1 && keyBytesEqual(keySet[secondKeyIdx], targetKey) {\n\t\treturn mu.SetInt(1)\n\t}\n\n\t// Otherwise, we'll compute the full finger print hash for this given\n\t// key and then use that to compute the coefficient tagged hash:\n\t//  * H(tag=KeyAgg coefficient, keyHashFingerprint(pks, pk) || pk)\n\tvar coefficientBytes [65]byte\n\tcopy(coefficientBytes[:], keysHash[:])\n\tcopy(coefficientBytes[32:], targetKey.SerializeCompressed())\n\n\tmuHash := chainhash.TaggedHash(KeyAggTagCoeff, coefficientBytes[:])\n\n\tmu.SetByteSlice(muHash[:])\n\n\treturn &mu\n}\n\n// secondUniqueKeyIndex returns the index of the second unique key. If all keys\n// are the same, then a value of -1 is returned.\nfunc secondUniqueKeyIndex(keySet []*btcec.PublicKey, sort bool) int {\n\tif sort {\n\t\tkeySet = sortKeys(keySet)\n\t}\n\n\t// Find the first key that isn't the same as the very first key (second\n\t// unique key).\n\tfor i := range keySet {\n\t\tif !keyBytesEqual(keySet[i], keySet[0]) {\n\t\t\treturn i\n\t\t}\n\t}\n\n\t// A value of negative one is used to indicate that all the keys in the\n\t// sign set are actually equal, which in practice actually makes musig2\n\t// useless, but we need a value to distinguish this case.\n\treturn -1\n}\n\n// KeyTweakDesc describes a tweak to be applied to the aggregated public key\n// generation and signing process. The IsXOnly specifies if the target key\n// should be converted to an x-only public key before tweaking.\ntype KeyTweakDesc struct {\n\t// Tweak is the 32-byte value that will modify the public key.\n\tTweak [32]byte\n\n\t// IsXOnly if true, then the public key will be mapped to an x-only key\n\t// before the tweaking operation is applied.\n\tIsXOnly bool\n}\n\n// KeyAggOption is a functional option argument that allows callers to specify\n// more or less information that has been pre-computed to the main routine.\ntype KeyAggOption func(*keyAggOption)\n\n// keyAggOption houses the set of functional options that modify key\n// aggregation.\ntype keyAggOption struct {\n\t// keyHash is the output of keyHashFingerprint for a given set of keys.\n\tkeyHash []byte\n\n\t// uniqueKeyIndex is the pre-computed index of the second unique key.\n\tuniqueKeyIndex *int\n\n\t// tweaks specifies a series of tweaks to be applied to the aggregated\n\t// public key.\n\ttweaks []KeyTweakDesc\n\n\t// taprootTweak controls if the tweaks above should be applied in a BIP\n\t// 340 style.\n\ttaprootTweak bool\n\n\t// bip86Tweak specifies that the taproot tweak should be done in a BIP\n\t// 86 style, where we don't expect an actual tweak and instead just\n\t// commit to the public key itself.\n\tbip86Tweak bool\n}\n\n// WithKeysHash allows key aggregation to be optimize, by allowing the caller\n// to specify the hash of all the keys.\nfunc WithKeysHash(keyHash []byte) KeyAggOption {\n\treturn func(o *keyAggOption) {\n\t\to.keyHash = keyHash\n\t}\n}\n\n// WithUniqueKeyIndex allows the caller to specify the index of the second\n// unique key.\nfunc WithUniqueKeyIndex(idx int) KeyAggOption {\n\treturn func(o *keyAggOption) {\n\t\ti := idx\n\t\to.uniqueKeyIndex = &i\n\t}\n}\n\n// WithKeyTweaks allows a caller to specify a series of 32-byte tweaks that\n// should be applied to the final aggregated public key.\nfunc WithKeyTweaks(tweaks ...KeyTweakDesc) KeyAggOption {\n\treturn func(o *keyAggOption) {\n\t\to.tweaks = tweaks\n\t}\n}\n\n// WithTaprootKeyTweak specifies that within this context, the final key should\n// use the taproot tweak as defined in BIP 341: outputKey = internalKey +\n// h_tapTweak(internalKey || scriptRoot). In this case, the aggregated key\n// before the tweak will be used as the internal key.\n//\n// This option should be used instead of WithKeyTweaks when the aggregated key\n// is intended to be used as a taproot output key that commits to a script\n// root.\nfunc WithTaprootKeyTweak(scriptRoot []byte) KeyAggOption {\n\treturn func(o *keyAggOption) {\n\t\tvar tweak [32]byte\n\t\tcopy(tweak[:], scriptRoot[:])\n\n\t\to.tweaks = []KeyTweakDesc{\n\t\t\t{\n\t\t\t\tTweak:   tweak,\n\t\t\t\tIsXOnly: true,\n\t\t\t},\n\t\t}\n\t\to.taprootTweak = true\n\t}\n}\n\n// WithBIP86KeyTweak specifies that then during key aggregation, the BIP 86\n// tweak which just commits to the hash of the serialized public key should be\n// used. This option should be used when signing with a key that was derived\n// using BIP 86.\nfunc WithBIP86KeyTweak() KeyAggOption {\n\treturn func(o *keyAggOption) {\n\t\to.tweaks = []KeyTweakDesc{\n\t\t\t{\n\t\t\t\tIsXOnly: true,\n\t\t\t},\n\t\t}\n\t\to.taprootTweak = true\n\t\to.bip86Tweak = true\n\t}\n}\n\n// defaultKeyAggOptions returns the set of default arguments for key\n// aggregation.\nfunc defaultKeyAggOptions() *keyAggOption {\n\treturn &keyAggOption{}\n}\n\n// hasEvenY returns true if the affine representation of the passed jacobian\n// point has an even y coordinate.\n//\n// TODO(roasbeef): double check, can just check the y coord even not jacobian?\nfunc hasEvenY(pJ btcec.JacobianPoint) bool {\n\tpJ.ToAffine()\n\tp := btcec.NewPublicKey(&pJ.X, &pJ.Y)\n\tkeyBytes := p.SerializeCompressed()\n\treturn keyBytes[0] == secp.PubKeyFormatCompressedEven\n}\n\n// tweakKey applies a tweaks to the passed public key using the specified\n// tweak. The parityAcc and tweakAcc are returned (in that order) which\n// includes the accumulate ration of the parity factor and the tweak multiplied\n// by the parity factor. The xOnly bool specifies if this is to be an x-only\n// tweak or not.\nfunc tweakKey(keyJ btcec.JacobianPoint, parityAcc btcec.ModNScalar, tweak [32]byte,\n\ttweakAcc btcec.ModNScalar,\n\txOnly bool) (btcec.JacobianPoint, btcec.ModNScalar, btcec.ModNScalar, error) {\n\n\t// First we'll compute the new parity factor for this key. If the key has\n\t// an odd y coordinate (not even), then we'll need to negate it (multiply\n\t// by -1 mod n, in this case).\n\tvar parityFactor btcec.ModNScalar\n\tif xOnly && !hasEvenY(keyJ) {\n\t\tparityFactor.SetInt(1).Negate()\n\t} else {\n\t\tparityFactor.SetInt(1)\n\t}\n\n\t// Next, map the tweak into a mod n integer so we can use it for\n\t// manipulations below.\n\ttweakInt := new(btcec.ModNScalar)\n\toverflows := tweakInt.SetBytes(&tweak)\n\tif overflows == 1 {\n\t\treturn keyJ, parityAcc, tweakAcc, ErrTweakedKeyOverflows\n\t}\n\n\t// Next, we'll compute: Q_i = g*Q + t*G, where g is our parityFactor and t\n\t// is the tweakInt above. We'll space things out a bit to make it easier to\n\t// follow.\n\t//\n\t// First compute t*G:\n\tvar tweakedGenerator btcec.JacobianPoint\n\tbtcec.ScalarBaseMultNonConst(tweakInt, &tweakedGenerator)\n\n\t// Next compute g*Q:\n\tbtcec.ScalarMultNonConst(&parityFactor, &keyJ, &keyJ)\n\n\t// Finally add both of them together to get our final\n\t// tweaked point.\n\tbtcec.AddNonConst(&tweakedGenerator, &keyJ, &keyJ)\n\n\t// As a sanity check, make sure that we didn't just end up with the\n\t// point at infinity.\n\tif keyJ == infinityPoint {\n\t\treturn keyJ, parityAcc, tweakAcc, ErrTweakedKeyIsInfinity\n\t}\n\n\t// As a final wrap up step, we'll accumulate the parity\n\t// factor and also this tweak into the final set of accumulators.\n\tparityAcc.Mul(&parityFactor)\n\ttweakAcc.Mul(&parityFactor).Add(tweakInt)\n\n\treturn keyJ, parityAcc, tweakAcc, nil\n}\n\n// AggregateKey is a final aggregated key along with a possible version of the\n// key without any tweaks applied.\ntype AggregateKey struct {\n\t// FinalKey is the final aggregated key which may include one or more\n\t// tweaks applied to it.\n\tFinalKey *btcec.PublicKey\n\n\t// PreTweakedKey is the aggregated *before* any tweaks have been\n\t// applied.  This should be used as the internal key in taproot\n\t// contexts.\n\tPreTweakedKey *btcec.PublicKey\n}\n\n// AggregateKeys takes a list of possibly unsorted keys and returns a single\n// aggregated key as specified by the musig2 key aggregation algorithm. A nil\n// value can be passed for keyHash, which causes this function to re-derive it.\n// In addition to the combined public key, the parity accumulator and the tweak\n// accumulator are returned as well.\nfunc AggregateKeys(keys []*btcec.PublicKey, sort bool,\n\tkeyOpts ...KeyAggOption) (\n\t*AggregateKey, *btcec.ModNScalar, *btcec.ModNScalar, error) {\n\n\t// First, parse the set of optional signing options.\n\topts := defaultKeyAggOptions()\n\tfor _, option := range keyOpts {\n\t\toption(opts)\n\t}\n\n\t// Sort the set of public key so we know we're working with them in\n\t// sorted order for all the routines below.\n\tif sort {\n\t\tkeys = sortKeys(keys)\n\t}\n\n\t// The caller may provide the hash of all the keys as an optimization\n\t// during signing, as it already needs to be computed.\n\tif opts.keyHash == nil {\n\t\topts.keyHash = keyHashFingerprint(keys, sort)\n\t}\n\n\t// A caller may also specify the unique key index themselves so we\n\t// don't need to re-compute it.\n\tif opts.uniqueKeyIndex == nil {\n\t\tidx := secondUniqueKeyIndex(keys, sort)\n\t\topts.uniqueKeyIndex = &idx\n\t}\n\n\t// For each key, we'll compute the intermediate blinded key: a_i*P_i,\n\t// where a_i is the aggregation coefficient for that key, and P_i is\n\t// the key itself, then accumulate that (addition) into the main final\n\t// key: P = P_1 + P_2 ... P_N.\n\tvar finalKeyJ btcec.JacobianPoint\n\tfor _, key := range keys {\n\t\t// Port the key over to Jacobian coordinates as we need it in\n\t\t// this format for the routines below.\n\t\tvar keyJ btcec.JacobianPoint\n\t\tkey.AsJacobian(&keyJ)\n\n\t\t// Compute the aggregation coefficient for the key, then\n\t\t// multiply it by the key itself: P_i' = a_i*P_i.\n\t\tvar tweakedKeyJ btcec.JacobianPoint\n\t\ta := aggregationCoefficient(\n\t\t\tkeys, key, opts.keyHash, *opts.uniqueKeyIndex,\n\t\t)\n\t\tbtcec.ScalarMultNonConst(a, &keyJ, &tweakedKeyJ)\n\n\t\t// Finally accumulate this into the final key in an incremental\n\t\t// fashion.\n\t\tbtcec.AddNonConst(&finalKeyJ, &tweakedKeyJ, &finalKeyJ)\n\t}\n\n\t// We'll copy over the key at this point, since this represents the\n\t// aggregated key before any tweaks have been applied. This'll be used\n\t// as the internal key for script path proofs.\n\tfinalKeyJ.ToAffine()\n\tcombinedKey := btcec.NewPublicKey(&finalKeyJ.X, &finalKeyJ.Y)\n\n\t// At this point, if this is a taproot tweak, then we'll modify the\n\t// base tweak value to use the BIP 341 tweak value.\n\tif opts.taprootTweak {\n\t\t// Emulate the same behavior as txscript.ComputeTaprootOutputKey\n\t\t// which only operates on the x-only public key.\n\t\tkey, _ := schnorr.ParsePubKey(schnorr.SerializePubKey(\n\t\t\tcombinedKey,\n\t\t))\n\n\t\t// We only use the actual tweak bytes if we're not committing\n\t\t// to a BIP-0086 key only spend output. Otherwise, we just\n\t\t// commit to the internal key and an empty byte slice as the\n\t\t// root hash.\n\t\ttweakBytes := []byte{}\n\t\tif !opts.bip86Tweak {\n\t\t\ttweakBytes = opts.tweaks[0].Tweak[:]\n\t\t}\n\n\t\t// Compute the taproot key tagged hash of:\n\t\t// h_tapTweak(internalKey || scriptRoot). We only do this for\n\t\t// the first one, as you can only specify a single tweak when\n\t\t// using the taproot mode with this API.\n\t\ttapTweakHash := chainhash.TaggedHash(\n\t\t\tchainhash.TagTapTweak, schnorr.SerializePubKey(key),\n\t\t\ttweakBytes,\n\t\t)\n\t\topts.tweaks[0].Tweak = *tapTweakHash\n\t}\n\n\tvar (\n\t\terr       error\n\t\ttweakAcc  btcec.ModNScalar\n\t\tparityAcc btcec.ModNScalar\n\t)\n\tparityAcc.SetInt(1)\n\n\t// In this case we have a set of tweaks, so we'll incrementally apply\n\t// each one, until we have our final tweaked key, and the related\n\t// accumulators.\n\tfor i := 1; i <= len(opts.tweaks); i++ {\n\t\tfinalKeyJ, parityAcc, tweakAcc, err = tweakKey(\n\t\t\tfinalKeyJ, parityAcc, opts.tweaks[i-1].Tweak, tweakAcc,\n\t\t\topts.tweaks[i-1].IsXOnly,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, nil, nil, err\n\t\t}\n\t}\n\n\tfinalKeyJ.ToAffine()\n\tfinalKey := btcec.NewPublicKey(&finalKeyJ.X, &finalKeyJ.Y)\n\n\treturn &AggregateKey{\n\t\tPreTweakedKey: combinedKey,\n\t\tFinalKey:      finalKey,\n\t}, &parityAcc, &tweakAcc, nil\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/keys_test.go",
    "content": "// Copyright 2013-2022 The btcsuite developers\n\npackage musig2\n\nimport (\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nconst (\n\tkeySortTestVectorFileName = \"key_sort_vectors.json\"\n\n\tkeyAggTestVectorFileName = \"key_agg_vectors.json\"\n\n\tkeyTweakTestVectorFileName = \"tweak_vectors.json\"\n)\n\ntype keySortTestVector struct {\n\tPubKeys []string `json:\"pubkeys\"`\n\n\tSortedKeys []string `json:\"sorted_pubkeys\"`\n}\n\n// TestMusig2KeySort tests that keys are properly sorted according to the\n// musig2 test vectors.\nfunc TestMusig2KeySort(t *testing.T) {\n\tt.Parallel()\n\n\ttestVectorPath := path.Join(\n\t\ttestVectorBaseDir, keySortTestVectorFileName,\n\t)\n\ttestVectorBytes, err := os.ReadFile(testVectorPath)\n\trequire.NoError(t, err)\n\n\tvar testCase keySortTestVector\n\trequire.NoError(t, json.Unmarshal(testVectorBytes, &testCase))\n\n\tkeys := make([]*btcec.PublicKey, len(testCase.PubKeys))\n\tfor i, keyStr := range testCase.PubKeys {\n\t\tpubKey, err := btcec.ParsePubKey(mustParseHex(keyStr))\n\t\trequire.NoError(t, err)\n\n\t\tkeys[i] = pubKey\n\t}\n\n\tsortedKeys := sortKeys(keys)\n\n\texpectedKeys := make([]*btcec.PublicKey, len(testCase.PubKeys))\n\tfor i, keyStr := range testCase.SortedKeys {\n\t\tpubKey, err := btcec.ParsePubKey(mustParseHex(keyStr))\n\t\trequire.NoError(t, err)\n\n\t\texpectedKeys[i] = pubKey\n\t}\n\n\trequire.Equal(t, sortedKeys, expectedKeys)\n}\n\ntype keyAggValidTest struct {\n\tIndices  []int  `json:\"key_indices\"`\n\tExpected string `json:\"expected\"`\n}\n\ntype keyAggError struct {\n\tType     string `json:\"type\"`\n\tSigner   int    `json:\"signer\"`\n\tContring string `json:\"contrib\"`\n}\n\ntype keyAggInvalidTest struct {\n\tIndices []int `json:\"key_indices\"`\n\n\tTweakIndices []int `json:\"tweak_indices\"`\n\n\tIsXOnly []bool `json:\"is_xonly\"`\n\n\tComment string `json:\"comment\"`\n}\n\ntype keyAggTestVectors struct {\n\tPubKeys []string `json:\"pubkeys\"`\n\n\tTweaks []string `json:\"tweaks\"`\n\n\tValidCases []keyAggValidTest `json:\"valid_test_cases\"`\n\n\tInvalidCases []keyAggInvalidTest `json:\"error_test_cases\"`\n}\n\nfunc keysFromIndices(t *testing.T, indices []int,\n\tpubKeys []string) ([]*btcec.PublicKey, error) {\n\n\tt.Helper()\n\n\tinputKeys := make([]*btcec.PublicKey, len(indices))\n\tfor i, keyIdx := range indices {\n\t\tvar err error\n\t\tinputKeys[i], err = btcec.ParsePubKey(\n\t\t\tmustParseHex(pubKeys[keyIdx]),\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn inputKeys, nil\n}\n\nfunc tweaksFromIndices(t *testing.T, indices []int,\n\ttweaks []string, isXonly []bool) []KeyTweakDesc {\n\n\tt.Helper()\n\n\ttestTweaks := make([]KeyTweakDesc, len(indices))\n\tfor i, idx := range indices {\n\t\tvar rawTweak [32]byte\n\t\tcopy(rawTweak[:], mustParseHex(tweaks[idx]))\n\n\t\ttestTweaks[i] = KeyTweakDesc{\n\t\t\tTweak:   rawTweak,\n\t\t\tIsXOnly: isXonly[i],\n\t\t}\n\t}\n\n\treturn testTweaks\n}\n\n// TestMuSig2KeyAggTestVectors tests that this implementation of musig2 key\n// aggregation lines up with the secp256k1-zkp test vectors.\nfunc TestMuSig2KeyAggTestVectors(t *testing.T) {\n\tt.Parallel()\n\n\ttestVectorPath := path.Join(\n\t\ttestVectorBaseDir, keyAggTestVectorFileName,\n\t)\n\ttestVectorBytes, err := os.ReadFile(testVectorPath)\n\trequire.NoError(t, err)\n\n\tvar testCases keyAggTestVectors\n\trequire.NoError(t, json.Unmarshal(testVectorBytes, &testCases))\n\n\ttweaks := make([][]byte, len(testCases.Tweaks))\n\tfor i := range testCases.Tweaks {\n\t\ttweaks[i] = mustParseHex(testCases.Tweaks[i])\n\t}\n\n\tfor i, testCase := range testCases.ValidCases {\n\t\ttestCase := testCase\n\n\t\t// Assemble the set of keys we'll pass in based on their key\n\t\t// index. We don't use sorting to ensure we send the keys in\n\t\t// the exact same order as the test vectors do.\n\t\tinputKeys, err := keysFromIndices(\n\t\t\tt, testCase.Indices, testCases.PubKeys,\n\t\t)\n\t\trequire.NoError(t, err)\n\n\t\tt.Run(fmt.Sprintf(\"test_case=%v\", i), func(t *testing.T) {\n\t\t\tuniqueKeyIndex := secondUniqueKeyIndex(inputKeys, false)\n\t\t\topts := []KeyAggOption{WithUniqueKeyIndex(uniqueKeyIndex)}\n\n\t\t\tcombinedKey, _, _, err := AggregateKeys(\n\t\t\t\tinputKeys, false, opts...,\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\trequire.Equal(\n\t\t\t\tt, schnorr.SerializePubKey(combinedKey.FinalKey),\n\t\t\t\tmustParseHex(testCase.Expected),\n\t\t\t)\n\t\t})\n\t}\n\n\tfor _, testCase := range testCases.InvalidCases {\n\t\ttestCase := testCase\n\n\t\ttestName := fmt.Sprintf(\"invalid_%v\",\n\t\t\tstrings.ToLower(testCase.Comment))\n\t\tt.Run(testName, func(t *testing.T) {\n\t\t\t// For each test, we'll extract the set of input keys\n\t\t\t// as well as the tweaks since this set of cases also\n\t\t\t// exercises error cases related to the set of tweaks.\n\t\t\tinputKeys, err := keysFromIndices(\n\t\t\t\tt, testCase.Indices, testCases.PubKeys,\n\t\t\t)\n\n\t\t\t// In this set of test cases, we should only get this\n\t\t\t// for the very first vector.\n\t\t\tif err != nil {\n\t\t\t\tswitch testCase.Comment {\n\t\t\t\tcase \"Invalid public key\":\n\t\t\t\t\trequire.ErrorIs(\n\t\t\t\t\t\tt, err,\n\t\t\t\t\t\tsecp.ErrPubKeyNotOnCurve,\n\t\t\t\t\t)\n\n\t\t\t\tcase \"Public key exceeds field size\":\n\t\t\t\t\trequire.ErrorIs(\n\t\t\t\t\t\tt, err, secp.ErrPubKeyXTooBig,\n\t\t\t\t\t)\n\n\t\t\t\tcase \"First byte of public key is not 2 or 3\":\n\t\t\t\t\trequire.ErrorIs(\n\t\t\t\t\t\tt, err,\n\t\t\t\t\t\tsecp.ErrPubKeyInvalidFormat,\n\t\t\t\t\t)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt.Fatalf(\"uncaught err: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar tweaks []KeyTweakDesc\n\t\t\tif len(testCase.TweakIndices) != 0 {\n\t\t\t\ttweaks = tweaksFromIndices(\n\t\t\t\t\tt, testCase.TweakIndices, testCases.Tweaks,\n\t\t\t\t\ttestCase.IsXOnly,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tuniqueKeyIndex := secondUniqueKeyIndex(inputKeys, false)\n\t\t\topts := []KeyAggOption{\n\t\t\t\tWithUniqueKeyIndex(uniqueKeyIndex),\n\t\t\t}\n\n\t\t\tif len(tweaks) != 0 {\n\t\t\t\topts = append(opts, WithKeyTweaks(tweaks...))\n\t\t\t}\n\n\t\t\t_, _, _, err = AggregateKeys(\n\t\t\t\tinputKeys, false, opts...,\n\t\t\t)\n\t\t\trequire.Error(t, err)\n\n\t\t\tswitch testCase.Comment {\n\t\t\tcase \"Tweak is out of range\":\n\t\t\t\trequire.ErrorIs(t, err, ErrTweakedKeyOverflows)\n\n\t\t\tcase \"Intermediate tweaking result is point at infinity\":\n\n\t\t\t\trequire.ErrorIs(t, err, ErrTweakedKeyIsInfinity)\n\n\t\t\tdefault:\n\t\t\t\tt.Fatalf(\"uncaught err: %v\", err)\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype keyTweakInvalidTest struct {\n\tIndices []int `json:\"key_indices\"`\n\n\tNonceIndices []int `json:\"nonce_indices\"`\n\n\tTweakIndices []int `json:\"tweak_indices\"`\n\n\tIsXOnly []bool `json:\"is_only\"`\n\n\tSignerIndex int `json:\"signer_index\"`\n\n\tComment string `json:\"comment\"`\n}\n\ntype keyTweakValidTest struct {\n\tIndices []int `json:\"key_indices\"`\n\n\tNonceIndices []int `json:\"nonce_indices\"`\n\n\tTweakIndices []int `json:\"tweak_indices\"`\n\n\tIsXOnly []bool `json:\"is_xonly\"`\n\n\tSignerIndex int `json:\"signer_index\"`\n\n\tExpected string `json:\"expected\"`\n\n\tComment string `json:\"comment\"`\n}\n\ntype keyTweakVector struct {\n\tPrivKey string `json:\"sk\"`\n\n\tPubKeys []string `json:\"pubkeys\"`\n\n\tPrivNonce string `json:\"secnonce\"`\n\n\tPubNonces []string `json:\"pnonces\"`\n\n\tAggNnoce string `json:\"aggnonce\"`\n\n\tTweaks []string `json:\"tweaks\"`\n\n\tMsg string `json:\"msg\"`\n\n\tValidCases []keyTweakValidTest `json:\"valid_test_cases\"`\n\n\tInvalidCases []keyTweakInvalidTest `json:\"error_test_cases\"`\n}\n\nfunc pubNoncesFromIndices(t *testing.T, nonceIndices []int, pubNonces []string) [][PubNonceSize]byte {\n\n\tnonces := make([][PubNonceSize]byte, len(nonceIndices))\n\n\tfor i, idx := range nonceIndices {\n\t\tvar pubNonce [PubNonceSize]byte\n\t\tcopy(pubNonce[:], mustParseHex(pubNonces[idx]))\n\n\t\tnonces[i] = pubNonce\n\t}\n\n\treturn nonces\n}\n\n// TestMuSig2TweakTestVectors tests that we properly handle the various edge\n// cases related to tweaking public keys.\nfunc TestMuSig2TweakTestVectors(t *testing.T) {\n\tt.Parallel()\n\n\ttestVectorPath := path.Join(\n\t\ttestVectorBaseDir, keyTweakTestVectorFileName,\n\t)\n\ttestVectorBytes, err := os.ReadFile(testVectorPath)\n\trequire.NoError(t, err)\n\n\tvar testCases keyTweakVector\n\trequire.NoError(t, json.Unmarshal(testVectorBytes, &testCases))\n\n\tprivKey, _ := btcec.PrivKeyFromBytes(mustParseHex(testCases.PrivKey))\n\n\tvar msg [32]byte\n\tcopy(msg[:], mustParseHex(testCases.Msg))\n\n\tvar secNonce [SecNonceSize]byte\n\tcopy(secNonce[:], mustParseHex(testCases.PrivNonce))\n\n\tfor _, testCase := range testCases.ValidCases {\n\t\ttestCase := testCase\n\n\t\ttestName := fmt.Sprintf(\"valid_%v\",\n\t\t\tstrings.ToLower(testCase.Comment))\n\t\tt.Run(testName, func(t *testing.T) {\n\t\t\tpubKeys, err := keysFromIndices(\n\t\t\t\tt, testCase.Indices, testCases.PubKeys,\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tvar tweaks []KeyTweakDesc\n\t\t\tif len(testCase.TweakIndices) != 0 {\n\t\t\t\ttweaks = tweaksFromIndices(\n\t\t\t\t\tt, testCase.TweakIndices,\n\t\t\t\t\ttestCases.Tweaks, testCase.IsXOnly,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tpubNonces := pubNoncesFromIndices(\n\t\t\t\tt, testCase.NonceIndices, testCases.PubNonces,\n\t\t\t)\n\n\t\t\tcombinedNonce, err := AggregateNonces(pubNonces)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tvar opts []SignOption\n\t\t\tif len(tweaks) != 0 {\n\t\t\t\topts = append(opts, WithTweaks(tweaks...))\n\t\t\t}\n\n\t\t\tpartialSig, err := Sign(\n\t\t\t\tsecNonce, privKey, combinedNonce, pubKeys,\n\t\t\t\tmsg, opts...,\n\t\t\t)\n\n\t\t\tvar partialSigBytes [32]byte\n\t\t\tpartialSig.S.PutBytesUnchecked(partialSigBytes[:])\n\n\t\t\trequire.Equal(\n\t\t\t\tt, hex.EncodeToString(partialSigBytes[:]),\n\t\t\t\thex.EncodeToString(mustParseHex(testCase.Expected)),\n\t\t\t)\n\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/musig2_test.go",
    "content": "// Copyright 2013-2022 The btcsuite developers\n\npackage musig2\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n)\n\nconst (\n\ttestVectorBaseDir = \"data\"\n)\n\nfunc mustParseHex(str string) []byte {\n\tb, err := hex.DecodeString(str)\n\tif err != nil {\n\t\tpanic(fmt.Errorf(\"unable to parse hex: %v\", err))\n\t}\n\n\treturn b\n}\n\ntype signer struct {\n\tprivKey *btcec.PrivateKey\n\tpubKey  *btcec.PublicKey\n\n\tnonces *Nonces\n\n\tpartialSig *PartialSignature\n}\n\ntype signerSet []signer\n\nfunc (s signerSet) keys() []*btcec.PublicKey {\n\tkeys := make([]*btcec.PublicKey, len(s))\n\tfor i := 0; i < len(s); i++ {\n\t\tkeys[i] = s[i].pubKey\n\t}\n\n\treturn keys\n}\n\nfunc (s signerSet) partialSigs() []*PartialSignature {\n\tsigs := make([]*PartialSignature, len(s))\n\tfor i := 0; i < len(s); i++ {\n\t\tsigs[i] = s[i].partialSig\n\t}\n\n\treturn sigs\n}\n\nfunc (s signerSet) pubNonces() [][PubNonceSize]byte {\n\tnonces := make([][PubNonceSize]byte, len(s))\n\tfor i := 0; i < len(s); i++ {\n\t\tnonces[i] = s[i].nonces.PubNonce\n\t}\n\n\treturn nonces\n}\n\nfunc (s signerSet) combinedKey() *btcec.PublicKey {\n\tuniqueKeyIndex := secondUniqueKeyIndex(s.keys(), false)\n\tkey, _, _, _ := AggregateKeys(\n\t\ts.keys(), false, WithUniqueKeyIndex(uniqueKeyIndex),\n\t)\n\treturn key.FinalKey\n}\n\n// testMultiPartySign executes a multi-party signing context w/ 100 signers.\nfunc testMultiPartySign(t *testing.T, taprootTweak []byte,\n\ttweaks ...KeyTweakDesc) {\n\n\tconst numSigners = 100\n\n\t// First generate the set of signers along with their public keys.\n\tsignerKeys := make([]*btcec.PrivateKey, numSigners)\n\tsignSet := make([]*btcec.PublicKey, numSigners)\n\tfor i := 0; i < numSigners; i++ {\n\t\tprivKey, err := btcec.NewPrivateKey()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to gen priv key: %v\", err)\n\t\t}\n\n\t\tpubKey := privKey.PubKey()\n\n\t\tsignerKeys[i] = privKey\n\t\tsignSet[i] = pubKey\n\t}\n\n\tvar combinedKey *btcec.PublicKey\n\n\tvar ctxOpts []ContextOption\n\tswitch {\n\tcase len(taprootTweak) == 0:\n\t\tctxOpts = append(ctxOpts, WithBip86TweakCtx())\n\tcase taprootTweak != nil:\n\t\tctxOpts = append(ctxOpts, WithTaprootTweakCtx(taprootTweak))\n\tcase len(tweaks) != 0:\n\t\tctxOpts = append(ctxOpts, WithTweakedContext(tweaks...))\n\t}\n\n\tctxOpts = append(ctxOpts, WithKnownSigners(signSet))\n\n\t// Now that we have all the signers, we'll make a new context, then\n\t// generate a new session for each of them(which handles nonce\n\t// generation).\n\tsigners := make([]*Session, numSigners)\n\tfor i, signerKey := range signerKeys {\n\t\tsignCtx, err := NewContext(\n\t\t\tsignerKey, false, ctxOpts...,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to generate context: %v\", err)\n\t\t}\n\n\t\tif combinedKey == nil {\n\t\t\tcombinedKey, err = signCtx.CombinedKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"combined key not available: %v\", err)\n\t\t\t}\n\t\t}\n\n\t\tsession, err := signCtx.NewSession()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to generate new session: %v\", err)\n\t\t}\n\t\tsigners[i] = session\n\t}\n\n\t// Next, in the pre-signing phase, we'll send all the nonces to each\n\t// signer.\n\tvar wg sync.WaitGroup\n\tfor i, signCtx := range signers {\n\t\tsignCtx := signCtx\n\n\t\twg.Add(1)\n\t\tgo func(idx int, signer *Session) {\n\t\t\tdefer wg.Done()\n\n\t\t\tfor j, otherCtx := range signers {\n\t\t\t\tif idx == j {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tnonce := otherCtx.PublicNonce()\n\t\t\t\thaveAll, err := signer.RegisterPubNonce(nonce)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"unable to add public nonce\")\n\t\t\t\t}\n\n\t\t\t\tif j == len(signers)-1 && !haveAll {\n\t\t\t\t\tt.Fatalf(\"all public nonces should have been detected\")\n\t\t\t\t}\n\t\t\t}\n\t\t}(i, signCtx)\n\t}\n\n\twg.Wait()\n\n\tmsg := sha256.Sum256([]byte(\"let's get taprooty\"))\n\n\t// In the final step, we'll use the first signer as our combiner, and\n\t// generate a signature for each signer, and then accumulate that with\n\t// the combiner.\n\tcombiner := signers[0]\n\tfor i := range signers {\n\t\tsigner := signers[i]\n\t\tpartialSig, err := signer.Sign(msg)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to generate partial sig: %v\", err)\n\t\t}\n\n\t\t// We don't need to combine the signature for the very first\n\t\t// signer, as it already has that partial signature.\n\t\tif i != 0 {\n\t\t\thaveAll, err := combiner.CombineSig(partialSig)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unable to combine sigs: %v\", err)\n\t\t\t}\n\n\t\t\tif i == len(signers)-1 && !haveAll {\n\t\t\t\tt.Fatalf(\"final sig wasn't reconstructed\")\n\t\t\t}\n\t\t}\n\t}\n\n\t// Finally we'll combined all the nonces, and ensure that it validates\n\t// as a single schnorr signature.\n\tfinalSig := combiner.FinalSig()\n\tif !finalSig.Verify(msg[:], combinedKey) {\n\t\tt.Fatalf(\"final sig is invalid!\")\n\t}\n\n\t// Verify that if we try to sign again with any of the existing\n\t// signers, then we'll get an error as the nonces have already been\n\t// used.\n\tfor _, signer := range signers {\n\t\t_, err := signer.Sign(msg)\n\t\tif err != ErrSigningContextReuse {\n\t\t\tt.Fatalf(\"expected to get signing context reuse\")\n\t\t}\n\t}\n}\n\n// TestMuSigMultiParty tests that for a given set of 100 signers, we're able to\n// properly generate valid sub signatures, which ultimately can be combined\n// into a single valid signature.\nfunc TestMuSigMultiParty(t *testing.T) {\n\tt.Parallel()\n\n\ttestTweak := [32]byte{\n\t\t0xE8, 0xF7, 0x91, 0xFF, 0x92, 0x25, 0xA2, 0xAF,\n\t\t0x01, 0x02, 0xAF, 0xFF, 0x4A, 0x9A, 0x72, 0x3D,\n\t\t0x96, 0x12, 0xA6, 0x82, 0xA2, 0x5E, 0xBE, 0x79,\n\t\t0x80, 0x2B, 0x26, 0x3C, 0xDF, 0xCD, 0x83, 0xBB,\n\t}\n\n\tt.Run(\"no_tweak\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\ttestMultiPartySign(t, nil)\n\t})\n\n\tt.Run(\"tweaked\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\ttestMultiPartySign(t, nil, KeyTweakDesc{\n\t\t\tTweak: testTweak,\n\t\t})\n\t})\n\n\tt.Run(\"tweaked_x_only\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\ttestMultiPartySign(t, nil, KeyTweakDesc{\n\t\t\tTweak:   testTweak,\n\t\t\tIsXOnly: true,\n\t\t})\n\t})\n\n\tt.Run(\"taproot_tweaked_x_only\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\ttestMultiPartySign(t, testTweak[:])\n\t})\n\n\tt.Run(\"taproot_bip_86\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\ttestMultiPartySign(t, []byte{})\n\t})\n}\n\n// TestMuSigEarlyNonce tests that for protocols where nonces need to be\n// exchanged before all signers are known, the context API works as expected.\nfunc TestMuSigEarlyNonce(t *testing.T) {\n\tt.Parallel()\n\n\tprivKey1, err := btcec.NewPrivateKey()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to gen priv key: %v\", err)\n\t}\n\tprivKey2, err := btcec.NewPrivateKey()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to gen priv key: %v\", err)\n\t}\n\n\t// If we try to make a context, with just the private key and sorting\n\t// value, we should get an error.\n\t_, err = NewContext(privKey1, true)\n\tif !errors.Is(err, ErrSignersNotSpecified) {\n\t\tt.Fatalf(\"unexpected ctx error: %v\", err)\n\t}\n\n\tsigners := []*btcec.PublicKey{privKey1.PubKey(), privKey2.PubKey()}\n\tnumSigners := len(signers)\n\n\tctx1, err := NewContext(\n\t\tprivKey1, true, WithNumSigners(numSigners), WithEarlyNonceGen(),\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to make ctx: %v\", err)\n\t}\n\tpubKey1 := ctx1.PubKey()\n\n\tctx2, err := NewContext(\n\t\tprivKey2, true, WithKnownSigners(signers), WithEarlyNonceGen(),\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to make ctx: %v\", err)\n\t}\n\tpubKey2 := ctx2.PubKey()\n\n\t// At this point, the combined key shouldn't be available for signer 1,\n\t// but should be for signer 2, as they know about all signers.\n\tif _, err := ctx1.CombinedKey(); !errors.Is(err, ErrNotEnoughSigners) {\n\t\tt.Fatalf(\"unepxected error: %v\", err)\n\t}\n\t_, err = ctx2.CombinedKey()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get combined key: %v\", err)\n\t}\n\n\t// The early nonces _should_ be available at this point.\n\tnonce1, err := ctx1.EarlySessionNonce()\n\tif err != nil {\n\t\tt.Fatalf(\"session nonce not available: %v\", err)\n\t}\n\tnonce2, err := ctx2.EarlySessionNonce()\n\tif err != nil {\n\t\tt.Fatalf(\"session nonce not available: %v\", err)\n\t}\n\n\t// The number of registered signers should still be 1 for both parties.\n\tif ctx1.NumRegisteredSigners() != 1 {\n\t\tt.Fatalf(\"expected 1 signer, instead have: %v\",\n\t\t\tctx1.NumRegisteredSigners())\n\t}\n\tif ctx2.NumRegisteredSigners() != 2 {\n\t\tt.Fatalf(\"expected 2 signers, instead have: %v\",\n\t\t\tctx2.NumRegisteredSigners())\n\t}\n\n\t// If we try to make a session, we should get an error since we dn't\n\t// have all the signers yet.\n\tif _, err := ctx1.NewSession(); !errors.Is(err, ErrNotEnoughSigners) {\n\t\tt.Fatalf(\"unexpected session key error: %v\", err)\n\t}\n\n\t// The combined key should also be unavailable as well.\n\tif _, err := ctx1.CombinedKey(); !errors.Is(err, ErrNotEnoughSigners) {\n\t\tt.Fatalf(\"unexpected combined key error: %v\", err)\n\t}\n\n\t// We'll now register the other signer for party 1.\n\tdone, err := ctx1.RegisterSigner(&pubKey2)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to register signer: %v\", err)\n\t}\n\tif !done {\n\t\tt.Fatalf(\"signer 1 doesn't have all keys\")\n\t}\n\n\t// If we try to register the signer again, we should get an error.\n\t_, err = ctx2.RegisterSigner(&pubKey1)\n\tif !errors.Is(err, ErrAlreadyHaveAllSigners) {\n\t\tt.Fatalf(\"should not be able to register too many signers\")\n\t}\n\n\t// We should be able to create the session at this point.\n\tsession1, err := ctx1.NewSession()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create new session: %v\", err)\n\t}\n\tsession2, err := ctx2.NewSession()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create new session: %v\", err)\n\t}\n\n\tmsg := sha256.Sum256([]byte(\"let's get taprooty, LN style\"))\n\n\t// If we try to sign before we have the combined nonce, we should get\n\t// an error.\n\t_, err = session1.Sign(msg)\n\tif !errors.Is(err, ErrCombinedNonceUnavailable) {\n\t\tt.Fatalf(\"unable to gen sig: %v\", err)\n\t}\n\n\t// Now we can exchange nonces to continue with the rest of the signing\n\t// process as normal.\n\tdone, err = session1.RegisterPubNonce(nonce2.PubNonce)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to register nonce: %v\", err)\n\t}\n\tif !done {\n\t\tt.Fatalf(\"signer 1 doesn't have all nonces\")\n\t}\n\tdone, err = session2.RegisterPubNonce(nonce1.PubNonce)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to register nonce: %v\", err)\n\t}\n\tif !done {\n\t\tt.Fatalf(\"signer 2 doesn't have all nonces\")\n\t}\n\n\t// Registering the nonce again should error out.\n\t_, err = session2.RegisterPubNonce(nonce1.PubNonce)\n\tif !errors.Is(err, ErrAlredyHaveAllNonces) {\n\t\tt.Fatalf(\"shouldn't be able to register nonces twice\")\n\t}\n\n\t// Sign the message and combine the two partial sigs into one.\n\t_, err = session1.Sign(msg)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to gen sig: %v\", err)\n\t}\n\tsig2, err := session2.Sign(msg)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to gen sig: %v\", err)\n\t}\n\tdone, err = session1.CombineSig(sig2)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to combine sig: %v\", err)\n\t}\n\tif !done {\n\t\tt.Fatalf(\"all sigs should be known now: %v\", err)\n\t}\n\n\t// If we try to combine another sig, then we should get an error.\n\t_, err = session1.CombineSig(sig2)\n\tif !errors.Is(err, ErrAlredyHaveAllSigs) {\n\t\tt.Fatalf(\"shouldn't be able to combine again\")\n\t}\n\n\t// Finally, verify that the final signature is valid.\n\tcombinedKey, err := ctx1.CombinedKey()\n\tif err != nil {\n\t\tt.Fatalf(\"unexpected combined key error: %v\", err)\n\t}\n\tfinalSig := session1.FinalSig()\n\tif !finalSig.Verify(msg[:], combinedKey) {\n\t\tt.Fatalf(\"final sig is invalid!\")\n\t}\n}\n\ntype memsetRandReader struct {\n\ti int\n}\n\nfunc (mr *memsetRandReader) Read(buf []byte) (n int, err error) {\n\tfor i := range buf {\n\t\tbuf[i] = byte(mr.i)\n\t}\n\treturn len(buf), nil\n}\n\n// TestSigningWithAggregatedNonce tests the aggregated nonce signing flow where\n// nonces are aggregated externally and provided to participants via\n// RegisterCombinedNonce, rather than each participant aggregating nonces\n// themselves via RegisterPubNonce.\nfunc TestSigningWithAggregatedNonce(t *testing.T) {\n\tt.Run(\"basic flow\", func(t *testing.T) {\n\t\tconst numSigners = 5\n\n\t\t// Generate signers.\n\t\tsignerKeys := make([]*btcec.PrivateKey, numSigners)\n\t\tsignSet := make([]*btcec.PublicKey, numSigners)\n\t\tfor i := 0; i < numSigners; i++ {\n\t\t\tprivKey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unable to gen priv key: %v\", err)\n\t\t\t}\n\t\t\tsignerKeys[i] = privKey\n\t\t\tsignSet[i] = privKey.PubKey()\n\t\t}\n\n\t\t// Each signer creates a context and session.\n\t\tsessions := make([]*Session, numSigners)\n\t\tfor i, signerKey := range signerKeys {\n\t\t\tsignCtx, err := NewContext(\n\t\t\t\tsignerKey, false, WithKnownSigners(signSet),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unable to generate context: %v\", err)\n\t\t\t}\n\n\t\t\tsession, err := signCtx.NewSession()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unable to generate new session: %v\", err)\n\t\t\t}\n\t\t\tsessions[i] = session\n\t\t}\n\n\t\t// Phase 1: Collect all public nonces.\n\t\tpubNonces := make([][PubNonceSize]byte, numSigners)\n\t\tfor i, session := range sessions {\n\t\t\tpubNonces[i] = session.PublicNonce()\n\t\t}\n\n\t\t// Phase 2: Aggregate nonces externally.\n\t\tcombinedNonce, err := AggregateNonces(pubNonces)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to aggregate nonces: %v\", err)\n\t\t}\n\n\t\t// Phase 3: Participants register combined nonce and sign.\n\t\tmsg := sha256.Sum256([]byte(\"aggregated nonce signing\"))\n\n\t\tpartialSigs := make([]*PartialSignature, numSigners)\n\t\tfor i, session := range sessions {\n\t\t\terr = session.RegisterCombinedNonce(combinedNonce)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"signer %d unable to register combined nonce: %v\",\n\t\t\t\t\ti, err)\n\t\t\t}\n\t\t\tsig, err := session.Sign(msg)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"signer %d unable to sign: %v\", i, err)\n\t\t\t}\n\t\t\tpartialSigs[i] = sig\n\t\t}\n\n\t\t// Phase 4: Combine all partial signatures.\n\t\tfinalSig := CombineSigs(partialSigs[0].R, partialSigs)\n\n\t\t// Verify the final signature.\n\t\tcombinedKey, _, _, err := AggregateKeys(signSet, false)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to aggregate keys: %v\", err)\n\t\t}\n\n\t\tif !finalSig.Verify(msg[:], combinedKey.FinalKey) {\n\t\t\tt.Fatalf(\"final signature is invalid\")\n\t\t}\n\t})\n\n\tt.Run(\"error: register combined nonce twice\", func(t *testing.T) {\n\t\tprivKey, _ := btcec.NewPrivateKey()\n\t\tprivKey2, _ := btcec.NewPrivateKey()\n\t\tsignSet := []*btcec.PublicKey{privKey.PubKey(), privKey2.PubKey()}\n\n\t\tsignCtx, _ := NewContext(privKey, false, WithKnownSigners(signSet))\n\t\tsession, _ := signCtx.NewSession()\n\n\t\tfakeCombinedNonce := getValidNonce(t)\n\n\t\t// First call should succeed.\n\t\terr := session.RegisterCombinedNonce(fakeCombinedNonce)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"first RegisterCombinedNonce failed: %v\", err)\n\t\t}\n\n\t\t// Second call should fail.\n\t\terr = session.RegisterCombinedNonce(fakeCombinedNonce)\n\t\tif err != ErrAlredyHaveAllNonces {\n\t\t\tt.Fatalf(\"expected ErrAlredyHaveAllNonces, got: %v\", err)\n\t\t}\n\t})\n\n\tt.Run(\"error: register combined nonce after register pub nonce\",\n\t\tfunc(t *testing.T) {\n\n\t\t\tprivKey, _ := btcec.NewPrivateKey()\n\t\t\tprivKey2, _ := btcec.NewPrivateKey()\n\t\t\tprivKey3, _ := btcec.NewPrivateKey()\n\t\t\tsignSet := []*btcec.PublicKey{\n\t\t\t\tprivKey.PubKey(),\n\t\t\t\tprivKey2.PubKey(),\n\t\t\t\tprivKey3.PubKey(),\n\t\t\t}\n\n\t\t\tsignCtx, _ := NewContext(privKey, false, WithKnownSigners(signSet))\n\t\t\tsession, _ := signCtx.NewSession()\n\n\t\t\tsignCtx2, _ := NewContext(privKey2, false, WithKnownSigners(signSet))\n\t\t\tsession2, _ := signCtx2.NewSession()\n\n\t\t\t// Register one public nonce first.\n\t\t\t_, err := session.RegisterPubNonce(session2.PublicNonce())\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"RegisterPubNonce failed: %v\", err)\n\t\t\t}\n\n\t\t\t// Now try to register a combined nonce - this should fail.\n\t\t\tfakeCombinedNonce := [PubNonceSize]byte{}\n\t\t\terr = session.RegisterCombinedNonce(fakeCombinedNonce)\n\t\t\tif err == nil {\n\t\t\t\tt.Fatalf(\"expected error when calling RegisterCombinedNonce \" +\n\t\t\t\t\t\"after RegisterPubNonce\")\n\t\t\t}\n\t\t})\n\n\tt.Run(\"error: register pub nonce after register combined nonce\",\n\t\tfunc(t *testing.T) {\n\n\t\t\tconst numSigners = 3\n\n\t\t\tsignerKeys := make([]*btcec.PrivateKey, numSigners)\n\t\t\tsignSet := make([]*btcec.PublicKey, numSigners)\n\t\t\tfor i := 0; i < numSigners; i++ {\n\t\t\t\tprivKey, _ := btcec.NewPrivateKey()\n\t\t\t\tsignerKeys[i] = privKey\n\t\t\t\tsignSet[i] = privKey.PubKey()\n\t\t\t}\n\n\t\t\tsessions := make([]*Session, numSigners)\n\t\t\tfor i, signerKey := range signerKeys {\n\t\t\t\tsignCtx, _ := NewContext(signerKey, false, WithKnownSigners(signSet))\n\t\t\t\tsession, _ := signCtx.NewSession()\n\t\t\t\tsessions[i] = session\n\t\t\t}\n\n\t\t\tpubNonces := make([][PubNonceSize]byte, numSigners)\n\t\t\tfor i, session := range sessions {\n\t\t\t\tpubNonces[i] = session.PublicNonce()\n\t\t\t}\n\n\t\t\tcombinedNonce, _ := AggregateNonces(pubNonces)\n\n\t\t\t// Register the combined nonce first.\n\t\t\terr := sessions[0].RegisterCombinedNonce(combinedNonce)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"RegisterCombinedNonce failed: %v\", err)\n\t\t\t}\n\n\t\t\t// Now try to register individual nonces - this should fail.\n\t\t\t_, err = sessions[0].RegisterPubNonce(pubNonces[1])\n\t\t\tif err == nil {\n\t\t\t\tt.Fatalf(\"expected error when calling RegisterPubNonce \" +\n\t\t\t\t\t\"after RegisterCombinedNonce\")\n\t\t\t}\n\t\t})\n\n\tt.Run(\"nonce reuse prevention\", func(t *testing.T) {\n\t\tprivKey, _ := btcec.NewPrivateKey()\n\t\tprivKey2, _ := btcec.NewPrivateKey()\n\t\tsignSet := []*btcec.PublicKey{privKey.PubKey(), privKey2.PubKey()}\n\n\t\tsignCtx, _ := NewContext(privKey, false, WithKnownSigners(signSet))\n\t\tsession, _ := signCtx.NewSession()\n\n\t\tfakeCombinedNonce := getValidNonce(t)\n\t\tsession.RegisterCombinedNonce(fakeCombinedNonce)\n\n\t\tmsg := sha256.Sum256([]byte(\"nonce reuse test\"))\n\n\t\t// First sign should succeed.\n\t\t_, err := session.Sign(msg)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"first sign failed: %v\", err)\n\t\t}\n\n\t\t// Second sign should fail due to nonce reuse.\n\t\t_, err = session.Sign(msg)\n\t\tif err != ErrSigningContextReuse {\n\t\t\tt.Fatalf(\"expected nonce reuse error, got: %v\", err)\n\t\t}\n\t})\n\n\tt.Run(\"incorrect combined nonce produces invalid sig\", func(t *testing.T) {\n\t\tconst numSigners = 3\n\n\t\tsignerKeys := make([]*btcec.PrivateKey, numSigners)\n\t\tsignSet := make([]*btcec.PublicKey, numSigners)\n\t\tfor i := 0; i < numSigners; i++ {\n\t\t\tprivKey, _ := btcec.NewPrivateKey()\n\t\t\tsignerKeys[i] = privKey\n\t\t\tsignSet[i] = privKey.PubKey()\n\t\t}\n\n\t\tsessions := make([]*Session, numSigners)\n\t\tfor i, signerKey := range signerKeys {\n\t\t\tsignCtx, _ := NewContext(signerKey, false, WithKnownSigners(signSet))\n\t\t\tsession, _ := signCtx.NewSession()\n\t\t\tsessions[i] = session\n\t\t}\n\n\t\tpubNonces := make([][PubNonceSize]byte, numSigners)\n\t\tfor i, session := range sessions {\n\t\t\tpubNonces[i] = session.PublicNonce()\n\t\t}\n\n\t\t// Create INCORRECT combined nonce using only a subset.\n\t\twrongNonces := pubNonces[:2]\n\t\tincorrectCombinedNonce, _ := AggregateNonces(wrongNonces)\n\n\t\tmsg := sha256.Sum256([]byte(\"incorrect nonce test\"))\n\n\t\tpartialSigs := make([]*PartialSignature, numSigners)\n\t\tfor i, session := range sessions {\n\t\t\tsession.RegisterCombinedNonce(incorrectCombinedNonce)\n\t\t\tsig, _ := session.Sign(msg)\n\t\t\tpartialSigs[i] = sig\n\t\t}\n\n\t\tfinalSig := CombineSigs(partialSigs[0].R, partialSigs)\n\t\tcombinedKey, _, _, _ := AggregateKeys(signSet, false)\n\n\t\t// Final signature should be INVALID.\n\t\tif finalSig.Verify(msg[:], combinedKey.FinalKey) {\n\t\t\tt.Fatalf(\"final signature should be invalid with incorrect nonce\")\n\t\t}\n\t})\n\n\tt.Run(\"mixed registration methods\", func(t *testing.T) {\n\t\tconst numSigners = 4\n\n\t\tsignerKeys := make([]*btcec.PrivateKey, numSigners)\n\t\tsignSet := make([]*btcec.PublicKey, numSigners)\n\t\tfor i := 0; i < numSigners; i++ {\n\t\t\tprivKey, _ := btcec.NewPrivateKey()\n\t\t\tsignerKeys[i] = privKey\n\t\t\tsignSet[i] = privKey.PubKey()\n\t\t}\n\n\t\tsessions := make([]*Session, numSigners)\n\t\tfor i, signerKey := range signerKeys {\n\t\t\tsignCtx, _ := NewContext(signerKey, false, WithKnownSigners(signSet))\n\t\t\tsession, _ := signCtx.NewSession()\n\t\t\tsessions[i] = session\n\t\t}\n\n\t\tpubNonces := make([][PubNonceSize]byte, numSigners)\n\t\tfor i, session := range sessions {\n\t\t\tpubNonces[i] = session.PublicNonce()\n\t\t}\n\n\t\tcombinedNonce, _ := AggregateNonces(pubNonces)\n\t\tmsg := sha256.Sum256([]byte(\"mixed registration test\"))\n\n\t\t// Half use RegisterCombinedNonce.\n\t\tfor i := 0; i < numSigners/2; i++ {\n\t\t\tsessions[i].RegisterCombinedNonce(combinedNonce)\n\t\t}\n\n\t\t// Other half use RegisterPubNonce.\n\t\tfor i := numSigners / 2; i < numSigners; i++ {\n\t\t\tfor j, nonce := range pubNonces {\n\t\t\t\tif i == j {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tsessions[i].RegisterPubNonce(nonce)\n\t\t\t}\n\t\t}\n\n\t\t// All should be able to sign.\n\t\tpartialSigs := make([]*PartialSignature, numSigners)\n\t\tfor i, session := range sessions {\n\t\t\tsig, err := session.Sign(msg)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"signer %d unable to sign: %v\", i, err)\n\t\t\t}\n\t\t\tpartialSigs[i] = sig\n\t\t}\n\n\t\tfinalSig := CombineSigs(partialSigs[0].R, partialSigs)\n\t\tcombinedKey, _, _, _ := AggregateKeys(signSet, false)\n\n\t\tif !finalSig.Verify(msg[:], combinedKey.FinalKey) {\n\t\t\tt.Fatalf(\"final signature is invalid\")\n\t\t}\n\t})\n\n\tt.Run(\"get combined nonce after RegisterCombinedNonce\", func(t *testing.T) {\n\t\tprivKey, _ := btcec.NewPrivateKey()\n\t\tprivKey2, _ := btcec.NewPrivateKey()\n\t\tsignSet := []*btcec.PublicKey{privKey.PubKey(), privKey2.PubKey()}\n\n\t\tsignCtx, _ := NewContext(privKey, false, WithKnownSigners(signSet))\n\t\tsession, _ := signCtx.NewSession()\n\n\t\t// Should fail before registering combined nonce.\n\t\t_, err := session.CombinedNonce()\n\t\tif err != ErrCombinedNonceUnavailable {\n\t\t\tt.Fatalf(\"expected ErrCombinedNonceUnavailable, got: %v\", err)\n\t\t}\n\n\t\t// Register combined nonce.\n\t\texpectedNonce := getValidNonce(t)\n\t\terr = session.RegisterCombinedNonce(expectedNonce)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"RegisterCombinedNonce failed: %v\", err)\n\t\t}\n\n\t\t// Should succeed after registering.\n\t\tgotNonce, err := session.CombinedNonce()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"CombinedNonce failed: %v\", err)\n\t\t}\n\n\t\tif gotNonce != expectedNonce {\n\t\t\tt.Fatalf(\"expected nonce %x, got %x\", expectedNonce, gotNonce)\n\t\t}\n\t})\n\n\tt.Run(\"get combined nonce after RegisterPubNonce\", func(t *testing.T) {\n\t\tconst numSigners = 3\n\n\t\tsignerKeys := make([]*btcec.PrivateKey, numSigners)\n\t\tsignSet := make([]*btcec.PublicKey, numSigners)\n\t\tfor i := 0; i < numSigners; i++ {\n\t\t\tprivKey, _ := btcec.NewPrivateKey()\n\t\t\tsignerKeys[i] = privKey\n\t\t\tsignSet[i] = privKey.PubKey()\n\t\t}\n\n\t\tsessions := make([]*Session, numSigners)\n\t\tfor i, signerKey := range signerKeys {\n\t\t\tsignCtx, _ := NewContext(signerKey, false, WithKnownSigners(signSet))\n\t\t\tsession, _ := signCtx.NewSession()\n\t\t\tsessions[i] = session\n\t\t}\n\n\t\tpubNonces := make([][PubNonceSize]byte, numSigners)\n\t\tfor i, session := range sessions {\n\t\t\tpubNonces[i] = session.PublicNonce()\n\t\t}\n\n\t\t// Should fail before all nonces are registered.\n\t\t_, err := sessions[0].CombinedNonce()\n\t\tif err != ErrCombinedNonceUnavailable {\n\t\t\tt.Fatalf(\"expected ErrCombinedNonceUnavailable before all nonces, got: %v\", err)\n\t\t}\n\n\t\t// Register all nonces via RegisterPubNonce.\n\t\tfor i := 1; i < numSigners; i++ {\n\t\t\tsessions[0].RegisterPubNonce(pubNonces[i])\n\t\t}\n\n\t\t// Should succeed after all nonces are registered.\n\t\tgotNonce, err := sessions[0].CombinedNonce()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"CombinedNonce failed: %v\", err)\n\t\t}\n\n\t\t// Verify it matches what AggregateNonces produces.\n\t\texpectedNonce, _ := AggregateNonces(pubNonces)\n\t\tif gotNonce != expectedNonce {\n\t\t\tt.Fatalf(\"combined nonce mismatch: expected %x, got %x\",\n\t\t\t\texpectedNonce[:8], gotNonce[:8])\n\t\t}\n\t})\n}\n\nfunc getValidNonce(t *testing.T) [PubNonceSize]byte {\n\tt.Helper()\n\n\tvar nonce [PubNonceSize]byte\n\n\tprivKey, err := btcec.NewPrivateKey()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to gen priv key: %v\", err)\n\t}\n\tcopy(nonce[:33], privKey.PubKey().SerializeCompressed())\n\tcopy(nonce[33:], privKey.PubKey().SerializeCompressed())\n\n\treturn nonce\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/nonces.go",
    "content": "// Copyright 2013-2022 The btcsuite developers\n\npackage musig2\n\nimport (\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nconst (\n\t// PubNonceSize is the size of the public nonces. Each public nonce is\n\t// serialized the full compressed encoding, which uses 32 bytes for each\n\t// nonce.\n\tPubNonceSize = 66\n\n\t// SecNonceSize is the size of the secret nonces for musig2. The secret\n\t// nonces are the corresponding private keys to the public nonce points.\n\tSecNonceSize = 97\n)\n\nvar (\n\t// NonceAuxTag is the tag used to optionally mix in the secret key with\n\t// the set of aux randomness.\n\tNonceAuxTag = []byte(\"MuSig/aux\")\n\n\t// NonceGenTag is used to generate the value (from a set of required an\n\t// optional field) that will be used as the part of the secret nonce.\n\tNonceGenTag = []byte(\"MuSig/nonce\")\n\n\tbyteOrder = binary.BigEndian\n\n\t// ErrPubkeyInvalid is returned when the pubkey of the WithPublicKey\n\t// option is not passed or of invalid length.\n\tErrPubkeyInvalid = errors.New(\"nonce generation requires a valid pubkey\")\n)\n\n// zeroSecNonce is a secret nonce that's all zeroes. This is used to check that\n// we're not attempting to re-use a nonce, and also protect callers from it.\nvar zeroSecNonce [SecNonceSize]byte\n\n// Nonces holds the public and secret nonces required for musig2.\n//\n// TODO(roasbeef): methods on this to help w/ parsing, etc?\ntype Nonces struct {\n\t// PubNonce holds the two 33-byte compressed encoded points that serve\n\t// as the public set of nonces.\n\tPubNonce [PubNonceSize]byte\n\n\t// SecNonce holds the two 32-byte scalar values that are the private\n\t// keys to the two public nonces.\n\tSecNonce [SecNonceSize]byte\n}\n\n// secNonceToPubNonce takes our two secrete nonces, and produces their two\n// corresponding EC points, serialized in compressed format.\nfunc secNonceToPubNonce(secNonce [SecNonceSize]byte) [PubNonceSize]byte {\n\tvar k1Mod, k2Mod btcec.ModNScalar\n\tk1Mod.SetByteSlice(secNonce[:btcec.PrivKeyBytesLen])\n\tk2Mod.SetByteSlice(secNonce[btcec.PrivKeyBytesLen:])\n\n\tvar r1, r2 btcec.JacobianPoint\n\tbtcec.ScalarBaseMultNonConst(&k1Mod, &r1)\n\tbtcec.ScalarBaseMultNonConst(&k2Mod, &r2)\n\n\t// Next, we'll convert the key in jacobian format to a normal public\n\t// key expressed in affine coordinates.\n\tr1.ToAffine()\n\tr2.ToAffine()\n\tr1Pub := btcec.NewPublicKey(&r1.X, &r1.Y)\n\tr2Pub := btcec.NewPublicKey(&r2.X, &r2.Y)\n\n\tvar pubNonce [PubNonceSize]byte\n\n\t// The public nonces are serialized as: R1 || R2, where both keys are\n\t// serialized in compressed format.\n\tcopy(pubNonce[:], r1Pub.SerializeCompressed())\n\tcopy(\n\t\tpubNonce[btcec.PubKeyBytesLenCompressed:],\n\t\tr2Pub.SerializeCompressed(),\n\t)\n\n\treturn pubNonce\n}\n\n// NonceGenOption is a function option that allows callers to modify how nonce\n// generation happens.\ntype NonceGenOption func(*nonceGenOpts)\n\n// nonceGenOpts is the set of options that control how nonce generation\n// happens.\ntype nonceGenOpts struct {\n\t// randReader is what we'll use to generate a set of random bytes. If\n\t// unspecified, then the normal crypto/rand rand.Read method will be\n\t// used in place.\n\trandReader io.Reader\n\n\t// publicKey is the mandatory public key that will be mixed into the nonce\n\t// generation.\n\tpublicKey []byte\n\n\t// secretKey is an optional argument that's used to further augment the\n\t// generated nonce by xor'ing it with this secret key.\n\tsecretKey []byte\n\n\t// combinedKey is an optional argument that if specified, will be\n\t// combined along with the nonce generation.\n\tcombinedKey []byte\n\n\t// msg is an optional argument that will be mixed into the nonce\n\t// derivation algorithm.\n\tmsg []byte\n\n\t// auxInput is an optional argument that will be mixed into the nonce\n\t// derivation algorithm.\n\tauxInput []byte\n}\n\n// cryptoRandAdapter is an adapter struct that allows us to pass in the package\n// level Read function from crypto/rand into a context that accepts an\n// io.Reader.\ntype cryptoRandAdapter struct {\n}\n\n// Read implements the io.Reader interface for the crypto/rand package.  By\n// default, we always use the crypto/rand reader, but the caller is able to\n// specify their own generation, which can be useful for deterministic tests.\nfunc (c *cryptoRandAdapter) Read(p []byte) (n int, err error) {\n\treturn rand.Read(p)\n}\n\n// defaultNonceGenOpts returns the default set of nonce generation options.\nfunc defaultNonceGenOpts() *nonceGenOpts {\n\treturn &nonceGenOpts{\n\t\trandReader: &cryptoRandAdapter{},\n\t}\n}\n\n// WithCustomRand allows a caller to use a custom random number generator in\n// place for crypto/rand. This should only really be used to generate\n// deterministic tests.\nfunc WithCustomRand(r io.Reader) NonceGenOption {\n\treturn func(o *nonceGenOpts) {\n\t\to.randReader = r\n\t}\n}\n\n// WithPublicKey is the mandatory public key that will be mixed into the nonce\n// generation.\nfunc WithPublicKey(pubKey *btcec.PublicKey) NonceGenOption {\n\treturn func(o *nonceGenOpts) {\n\t\to.publicKey = pubKey.SerializeCompressed()\n\t}\n}\n\n// WithNonceSecretKeyAux allows a caller to optionally specify a secret key\n// that should be used to augment the randomness used to generate the nonces.\nfunc WithNonceSecretKeyAux(secKey *btcec.PrivateKey) NonceGenOption {\n\treturn func(o *nonceGenOpts) {\n\t\to.secretKey = secKey.Serialize()\n\t}\n}\n\n// WithNonceCombinedKeyAux allows a caller to optionally specify the combined\n// key used in this signing session to further augment the randomness used to\n// generate nonces.\nfunc WithNonceCombinedKeyAux(combinedKey *btcec.PublicKey) NonceGenOption {\n\treturn func(o *nonceGenOpts) {\n\t\to.combinedKey = schnorr.SerializePubKey(combinedKey)\n\t}\n}\n\n// WithNonceMessageAux allows a caller to optionally specify a message to be\n// mixed into the randomness generated to create the nonce.\nfunc WithNonceMessageAux(msg [32]byte) NonceGenOption {\n\treturn func(o *nonceGenOpts) {\n\t\to.msg = msg[:]\n\t}\n}\n\n// WithNonceAuxInput is a set of auxiliary randomness, similar to BIP 340 that\n// can be used to further augment the nonce generation process.\nfunc WithNonceAuxInput(aux []byte) NonceGenOption {\n\treturn func(o *nonceGenOpts) {\n\t\to.auxInput = aux\n\t}\n}\n\n// withCustomOptions allows a caller to pass a complete set of custom\n// nonceGenOpts, without needing to create custom and checked structs such as\n// *btcec.PrivateKey. This is mainly used to match the testcases provided by\n// the MuSig2 BIP.\nfunc withCustomOptions(customOpts nonceGenOpts) NonceGenOption {\n\treturn func(o *nonceGenOpts) {\n\t\to.randReader = customOpts.randReader\n\t\to.secretKey = customOpts.secretKey\n\t\to.combinedKey = customOpts.combinedKey\n\t\to.auxInput = customOpts.auxInput\n\t\to.msg = customOpts.msg\n\t\to.publicKey = customOpts.publicKey\n\t}\n}\n\n// lengthWriter is a function closure that allows a caller to control how the\n// length prefix of a byte slice is written.\n//\n// TODO(roasbeef): use type params once we bump repo version\ntype lengthWriter func(w io.Writer, b []byte) error\n\n// uint8Writer is an implementation of lengthWriter that writes the length of\n// the byte slice using 1 byte.\nfunc uint8Writer(w io.Writer, b []byte) error {\n\treturn binary.Write(w, byteOrder, uint8(len(b)))\n}\n\n// uint32Writer is an implementation of lengthWriter that writes the length of\n// the byte slice using 4 bytes.\nfunc uint32Writer(w io.Writer, b []byte) error {\n\treturn binary.Write(w, byteOrder, uint32(len(b)))\n}\n\n// uint32Writer is an implementation of lengthWriter that writes the length of\n// the byte slice using 8 bytes.\nfunc uint64Writer(w io.Writer, b []byte) error {\n\treturn binary.Write(w, byteOrder, uint64(len(b)))\n}\n\n// writeBytesPrefix is used to write out: len(b) || b, to the passed io.Writer.\n// The lengthWriter function closure is used to allow the caller to specify the\n// precise byte packing of the length.\nfunc writeBytesPrefix(w io.Writer, b []byte, lenWriter lengthWriter) error {\n\t// Write out the length of the byte first, followed by the set of bytes\n\t// itself.\n\tif err := lenWriter(w, b); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := w.Write(b); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// genNonceAuxBytes writes out the full byte string used to derive a secret\n// nonce based on some initial randomness as well as the series of optional\n// fields. The byte string used for derivation is:\n//   - tagged_hash(\"MuSig/nonce\", rand || len(pk) || pk ||\n//     len(aggpk) || aggpk || m_prefixed || len(in) || in || i).\n//\n// where i is the ith secret nonce being generated and m_prefixed is:\n//   - bytes(1, 0) if the message is blank\n//   - bytes(1, 1) || bytes(8, len(m)) || m if the message is present.\nfunc genNonceAuxBytes(rand []byte, pubkey []byte, i int,\n\topts *nonceGenOpts) (*chainhash.Hash, error) {\n\n\tvar w bytes.Buffer\n\n\t// First, write out the randomness generated in the prior step.\n\tif _, err := w.Write(rand); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Next, we'll write out: len(pk) || pk\n\terr := writeBytesPrefix(&w, pubkey, uint8Writer)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Next, we'll write out: len(aggpk) || aggpk.\n\terr = writeBytesPrefix(&w, opts.combinedKey, uint8Writer)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tswitch {\n\t// If the message isn't present, then we'll just write out a single\n\t// uint8 of a zero byte: m_prefixed = bytes(1, 0).\n\tcase opts.msg == nil:\n\t\tif _, err := w.Write([]byte{0x00}); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t// Otherwise, we'll write a single byte of 0x01 with a 1 byte length\n\t// prefix, followed by the message itself with an 8 byte length prefix:\n\t// m_prefixed = bytes(1, 1) || bytes(8, len(m)) || m.\n\tcase len(opts.msg) == 0:\n\t\tfallthrough\n\tdefault:\n\t\tif _, err := w.Write([]byte{0x01}); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\terr = writeBytesPrefix(&w, opts.msg, uint64Writer)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Finally we'll write out the auxiliary input.\n\terr = writeBytesPrefix(&w, opts.auxInput, uint32Writer)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Next we'll write out the interaction/index number which will\n\t// uniquely generate two nonces given the rest of the possibly static\n\t// parameters.\n\tif err := binary.Write(&w, byteOrder, uint8(i)); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// With the message buffer complete, we'll now derive the tagged hash\n\t// using our set of params.\n\treturn chainhash.TaggedHash(NonceGenTag, w.Bytes()), nil\n}\n\n// GenNonces generates the secret nonces, as well as the public nonces which\n// correspond to an EC point generated using the secret nonce as a private key.\nfunc GenNonces(options ...NonceGenOption) (*Nonces, error) {\n\topts := defaultNonceGenOpts()\n\tfor _, opt := range options {\n\t\topt(opts)\n\t}\n\n\t// We require the pubkey option.\n\tif opts.publicKey == nil || len(opts.publicKey) != 33 {\n\t\treturn nil, ErrPubkeyInvalid\n\t}\n\n\t// First, we'll start out by generating 32 random bytes drawn from our\n\t// CSPRNG.\n\tvar randBytes [32]byte\n\tif _, err := opts.randReader.Read(randBytes[:]); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// If the options contain a secret key, we XOR it with with the tagged\n\t// random bytes.\n\tif len(opts.secretKey) == 32 {\n\t\ttaggedHash := chainhash.TaggedHash(NonceAuxTag, randBytes[:])\n\n\t\tfor i := 0; i < chainhash.HashSize; i++ {\n\t\t\trandBytes[i] = opts.secretKey[i] ^ taggedHash[i]\n\t\t}\n\t}\n\n\t// Using our randomness, pubkey and the set of optional params, generate our\n\t// two secret nonces: k1 and k2.\n\tk1, err := genNonceAuxBytes(randBytes[:], opts.publicKey, 0, opts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tk2, err := genNonceAuxBytes(randBytes[:], opts.publicKey, 1, opts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar k1Mod, k2Mod btcec.ModNScalar\n\tk1Mod.SetBytes((*[32]byte)(k1))\n\tk2Mod.SetBytes((*[32]byte)(k2))\n\n\t// The secret nonces are serialized as the concatenation of the two 32\n\t// byte secret nonce values and the pubkey.\n\tvar nonces Nonces\n\tk1Mod.PutBytesUnchecked(nonces.SecNonce[:])\n\tk2Mod.PutBytesUnchecked(nonces.SecNonce[btcec.PrivKeyBytesLen:])\n\tcopy(nonces.SecNonce[btcec.PrivKeyBytesLen*2:], opts.publicKey)\n\n\t// Next, we'll generate R_1 = k_1*G and R_2 = k_2*G. Along the way we\n\t// need to map our nonce values into mod n scalars so we can work with\n\t// the btcec API.\n\tnonces.PubNonce = secNonceToPubNonce(nonces.SecNonce)\n\n\treturn &nonces, nil\n}\n\n// AggregateNonces aggregates the set of a pair of public nonces for each party\n// into a single aggregated nonces to be used for multi-signing.\nfunc AggregateNonces(pubNonces [][PubNonceSize]byte) ([PubNonceSize]byte, error) {\n\t// combineNonces is a helper function that aggregates (adds) up a\n\t// series of nonces encoded in compressed format. It uses a slicing\n\t// function to extra 33 bytes at a time from the packed 2x public\n\t// nonces.\n\ttype nonceSlicer func([PubNonceSize]byte) []byte\n\tcombineNonces := func(slicer nonceSlicer) (btcec.JacobianPoint, error) {\n\t\t// Convert the set of nonces into jacobian coordinates we can\n\t\t// use to accumulate them all into each other.\n\t\tpubNonceJs := make([]*btcec.JacobianPoint, len(pubNonces))\n\t\tfor i, pubNonceBytes := range pubNonces {\n\t\t\t// Using the slicer, extract just the bytes we need to\n\t\t\t// decode.\n\t\t\tvar nonceJ btcec.JacobianPoint\n\n\t\t\tnonceJ, err := btcec.ParseJacobian(slicer(pubNonceBytes))\n\t\t\tif err != nil {\n\t\t\t\treturn btcec.JacobianPoint{}, err\n\t\t\t}\n\n\t\t\tpubNonceJs[i] = &nonceJ\n\t\t}\n\n\t\t// Now that we have the set of complete nonces, we'll aggregate\n\t\t// them: R = R_i + R_i+1 + ... + R_i+n.\n\t\tvar aggregateNonce btcec.JacobianPoint\n\t\tfor _, pubNonceJ := range pubNonceJs {\n\t\t\tbtcec.AddNonConst(\n\t\t\t\t&aggregateNonce, pubNonceJ, &aggregateNonce,\n\t\t\t)\n\t\t}\n\n\t\taggregateNonce.ToAffine()\n\t\treturn aggregateNonce, nil\n\t}\n\n\t// The final nonce public nonce is actually two nonces, one that\n\t// aggregate the first nonce of all the parties, and the other that\n\t// aggregates the second nonce of all the parties.\n\tvar finalNonce [PubNonceSize]byte\n\tcombinedNonce1, err := combineNonces(func(n [PubNonceSize]byte) []byte {\n\t\treturn n[:btcec.PubKeyBytesLenCompressed]\n\t})\n\tif err != nil {\n\t\treturn finalNonce, err\n\t}\n\n\tcombinedNonce2, err := combineNonces(func(n [PubNonceSize]byte) []byte {\n\t\treturn n[btcec.PubKeyBytesLenCompressed:]\n\t})\n\tif err != nil {\n\t\treturn finalNonce, err\n\t}\n\n\tcopy(finalNonce[:], btcec.JacobianToByteSlice(combinedNonce1))\n\tcopy(\n\t\tfinalNonce[btcec.PubKeyBytesLenCompressed:],\n\t\tbtcec.JacobianToByteSlice(combinedNonce2),\n\t)\n\n\treturn finalNonce, nil\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/nonces_test.go",
    "content": "// Copyright 2013-2022 The btcsuite developers\n\npackage musig2\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\ntype nonceGenTestCase struct {\n\tRand    string  `json:\"rand_\"`\n\tSk      string  `json:\"sk\"`\n\tAggPk   string  `json:\"aggpk\"`\n\tMsg     *string `json:\"msg\"`\n\tExtraIn string  `json:\"extra_in\"`\n\tPk      string  `json:\"pk\"`\n\n\tExpected string `json:\"expected\"`\n}\n\ntype nonceGenTestCases struct {\n\tTestCases []nonceGenTestCase `json:\"test_cases\"`\n}\n\nconst (\n\tnonceGenTestVectorsFileName = \"nonce_gen_vectors.json\"\n\tnonceAggTestVectorsFileName = \"nonce_agg_vectors.json\"\n)\n\n// TestMusig2NonceGenTestVectors tests the nonce generation function with the\n// testvectors defined in the Musig2 BIP.\nfunc TestMusig2NonceGenTestVectors(t *testing.T) {\n\tt.Parallel()\n\n\ttestVectorPath := path.Join(\n\t\ttestVectorBaseDir, nonceGenTestVectorsFileName,\n\t)\n\ttestVectorBytes, err := os.ReadFile(testVectorPath)\n\trequire.NoError(t, err)\n\n\tvar testCases nonceGenTestCases\n\trequire.NoError(t, json.Unmarshal(testVectorBytes, &testCases))\n\n\tfor i, testCase := range testCases.TestCases {\n\t\ttestCase := testCase\n\n\t\tcustomOpts := nonceGenOpts{\n\t\t\trandReader:  &memsetRandReader{i: 0},\n\t\t\tsecretKey:   mustParseHex(testCase.Sk),\n\t\t\tcombinedKey: mustParseHex(testCase.AggPk),\n\t\t\tauxInput:    mustParseHex(testCase.ExtraIn),\n\t\t\tpublicKey:   mustParseHex(testCase.Pk),\n\t\t}\n\t\tif testCase.Msg != nil {\n\t\t\tcustomOpts.msg = mustParseHex(*testCase.Msg)\n\t\t}\n\n\t\tt.Run(fmt.Sprintf(\"test_case=%v\", i), func(t *testing.T) {\n\t\t\tnonce, err := GenNonces(withCustomOptions(customOpts))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"err gen nonce aux bytes %v\", err)\n\t\t\t}\n\n\t\t\texpectedBytes, _ := hex.DecodeString(testCase.Expected)\n\t\t\tif !bytes.Equal(nonce.SecNonce[:], expectedBytes) {\n\n\t\t\t\tt.Fatalf(\"nonces don't match: expected %x, got %x\",\n\t\t\t\t\texpectedBytes, nonce.SecNonce[:])\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype nonceAggError struct {\n\tType    string `json:\"type\"`\n\tSigner  int    `json:\"signer\"`\n\tContrib string `json:\"contrib\"`\n}\n\ntype nonceAggValidCase struct {\n\tIndices []int `json:\"pnonce_indices\"`\n\n\tExpected string `json:\"expected\"`\n\n\tComment string `json:\"comment\"`\n}\n\ntype nonceAggInvalidCase struct {\n\tIndices []int `json:\"pnonce_indices\"`\n\n\tError nonceAggError `json:\"error\"`\n\n\tComment string `json:\"comment\"`\n\n\tExpectedErr string `json:\"btcec_err\"`\n}\n\ntype nonceAggTestCases struct {\n\tNonces []string `json:\"pnonces\"`\n\n\tValidCases []nonceAggValidCase `json:\"valid_test_cases\"`\n\n\tInvalidCases []nonceAggInvalidCase `json:\"error_test_cases\"`\n}\n\n// TestMusig2AggregateNoncesTestVectors tests that the musig2 implementation\n// passes the nonce aggregation test vectors for musig2 1.0.\nfunc TestMusig2AggregateNoncesTestVectors(t *testing.T) {\n\tt.Parallel()\n\n\ttestVectorPath := path.Join(\n\t\ttestVectorBaseDir, nonceAggTestVectorsFileName,\n\t)\n\ttestVectorBytes, err := os.ReadFile(testVectorPath)\n\trequire.NoError(t, err)\n\n\tvar testCases nonceAggTestCases\n\trequire.NoError(t, json.Unmarshal(testVectorBytes, &testCases))\n\n\tnonces := make([][PubNonceSize]byte, len(testCases.Nonces))\n\tfor i := range testCases.Nonces {\n\t\tvar nonce [PubNonceSize]byte\n\t\tcopy(nonce[:], mustParseHex(testCases.Nonces[i]))\n\n\t\tnonces[i] = nonce\n\t}\n\n\tfor i, testCase := range testCases.ValidCases {\n\t\ttestCase := testCase\n\n\t\tvar testNonces [][PubNonceSize]byte\n\t\tfor _, idx := range testCase.Indices {\n\t\t\ttestNonces = append(testNonces, nonces[idx])\n\t\t}\n\n\t\tt.Run(fmt.Sprintf(\"valid_case=%v\", i), func(t *testing.T) {\n\t\t\taggregatedNonce, err := AggregateNonces(testNonces)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tvar expectedNonce [PubNonceSize]byte\n\t\t\tcopy(expectedNonce[:], mustParseHex(testCase.Expected))\n\n\t\t\trequire.Equal(t, aggregatedNonce[:], expectedNonce[:])\n\t\t})\n\t}\n\n\tfor i, testCase := range testCases.InvalidCases {\n\t\tvar testNonces [][PubNonceSize]byte\n\t\tfor _, idx := range testCase.Indices {\n\t\t\ttestNonces = append(testNonces, nonces[idx])\n\t\t}\n\n\t\tt.Run(fmt.Sprintf(\"invalid_case=%v\", i), func(t *testing.T) {\n\t\t\t_, err := AggregateNonces(testNonces)\n\t\t\trequire.True(t, err != nil)\n\t\t\trequire.Equal(t, testCase.ExpectedErr, err.Error())\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/sign.go",
    "content": "// Copyright 2013-2022 The btcsuite developers\n\npackage musig2\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nvar (\n\t// NonceBlindTag is that tag used to construct the value b, which\n\t// blinds the second public nonce of each party.\n\tNonceBlindTag = []byte(\"MuSig/noncecoef\")\n\n\t// ChallengeHashTag is the tag used to construct the challenge hash\n\tChallengeHashTag = []byte(\"BIP0340/challenge\")\n\n\t// ErrNoncePointAtInfinity is returned if during signing, the fully\n\t// combined public nonce is the point at infinity.\n\tErrNoncePointAtInfinity = fmt.Errorf(\"signing nonce is the infinity \" +\n\t\t\"point\")\n\n\t// ErrPrivKeyZero is returned when the private key for signing is\n\t// actually zero.\n\tErrPrivKeyZero = fmt.Errorf(\"priv key is zero\")\n\n\t// ErrPartialSigInvalid is returned when a partial is found to be\n\t// invalid.\n\tErrPartialSigInvalid = fmt.Errorf(\"partial signature is invalid\")\n\n\t// ErrSecretNonceZero is returned when a secret nonce is passed in a\n\t// zero.\n\tErrSecretNonceZero = fmt.Errorf(\"secret nonce is blank\")\n\n\t// ErrSecNoncePubkey is returned when the signing key does not match the\n\t// sec nonce pubkey\n\tErrSecNoncePubkey = fmt.Errorf(\"public key does not match secnonce\")\n\n\t// ErrPubkeyNotIncluded is returned when the signers pubkey is not included\n\t// in the list of pubkeys.\n\tErrPubkeyNotIncluded = fmt.Errorf(\"signer's pubkey must be included\" +\n\t\t\" in the list of pubkeys\")\n)\n\n// infinityPoint is the jacobian representation of the point at infinity.\nvar infinityPoint btcec.JacobianPoint\n\n// PartialSignature reprints a partial (s-only) musig2 multi-signature. This\n// isn't a valid schnorr signature by itself, as it needs to be aggregated\n// along with the other partial signatures to be completed.\ntype PartialSignature struct {\n\tS *btcec.ModNScalar\n\n\tR *btcec.PublicKey\n}\n\n// NewPartialSignature returns a new instances of the partial sig struct.\nfunc NewPartialSignature(s *btcec.ModNScalar,\n\tr *btcec.PublicKey) PartialSignature {\n\n\treturn PartialSignature{\n\t\tS: s,\n\t\tR: r,\n\t}\n}\n\n// Encode writes a serialized version of the partial signature to the passed\n// io.Writer\nfunc (p *PartialSignature) Encode(w io.Writer) error {\n\tvar sBytes [32]byte\n\tp.S.PutBytes(&sBytes)\n\n\tif _, err := w.Write(sBytes[:]); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Decode attempts to parse a serialized PartialSignature stored in the passed\n// io reader.\nfunc (p *PartialSignature) Decode(r io.Reader) error {\n\tp.S = new(btcec.ModNScalar)\n\n\tvar sBytes [32]byte\n\tif _, err := io.ReadFull(r, sBytes[:]); err != nil {\n\t\treturn nil\n\t}\n\n\toverflows := p.S.SetBytes(&sBytes)\n\tif overflows == 1 {\n\t\treturn ErrPartialSigInvalid\n\t}\n\n\treturn nil\n}\n\n// SignOption is a functional option argument that allows callers to modify the\n// way we generate musig2 schnorr signatures.\ntype SignOption func(*signOptions)\n\n// signOptions houses the set of functional options that can be used to modify\n// the method used to generate the musig2 partial signature.\ntype signOptions struct {\n\t// fastSign determines if we'll skip the check at the end of the\n\t// routine where we attempt to verify the produced signature.\n\tfastSign bool\n\n\t// sortKeys determines if the set of keys should be sorted before doing\n\t// key aggregation.\n\tsortKeys bool\n\n\t// tweaks specifies a series of tweaks to be applied to the aggregated\n\t// public key, which also partially carries over into the signing\n\t// process.\n\ttweaks []KeyTweakDesc\n\n\t// taprootTweak specifies a taproot specific tweak.  of the tweaks\n\t// specified above. Normally we'd just apply the raw 32 byte tweak, but\n\t// for taproot, we first need to compute the aggregated key before\n\t// tweaking, and then use it as the internal key. This is required as\n\t// the taproot tweak also commits to the public key, which in this case\n\t// is the aggregated key before the tweak.\n\ttaprootTweak []byte\n\n\t// bip86Tweak specifies that the taproot tweak should be done in a BIP\n\t// 86 style, where we don't expect an actual tweak and instead just\n\t// commit to the public key itself.\n\tbip86Tweak bool\n}\n\n// defaultSignOptions returns the default set of signing operations.\nfunc defaultSignOptions() *signOptions {\n\treturn &signOptions{}\n}\n\n// WithFastSign forces signing to skip the extra verification step at the end.\n// Performance sensitive applications may opt to use this option to speed up\n// the signing operation.\nfunc WithFastSign() SignOption {\n\treturn func(o *signOptions) {\n\t\to.fastSign = true\n\t}\n}\n\n// WithSortedKeys determines if the set of signing public keys are to be sorted\n// or not before doing key aggregation.\nfunc WithSortedKeys() SignOption {\n\treturn func(o *signOptions) {\n\t\to.sortKeys = true\n\t}\n}\n\n// WithTweaks determines if the aggregated public key used should apply a\n// series of tweaks before key aggregation.\nfunc WithTweaks(tweaks ...KeyTweakDesc) SignOption {\n\treturn func(o *signOptions) {\n\t\to.tweaks = tweaks\n\t}\n}\n\n// WithTaprootSignTweak allows a caller to specify a tweak that should be used\n// in a bip 340 manner when signing. This differs from WithTweaks as the tweak\n// will be assumed to always be x-only and the intermediate aggregate key\n// before tweaking will be used to generate part of the tweak (as the taproot\n// tweak also commits to the internal key).\n//\n// This option should be used in the taproot context to create a valid\n// signature for the keypath spend for taproot, when the output key is actually\n// committing to a script path, or some other data.\nfunc WithTaprootSignTweak(scriptRoot []byte) SignOption {\n\treturn func(o *signOptions) {\n\t\to.taprootTweak = scriptRoot\n\t}\n}\n\n// WithBip86SignTweak allows a caller to specify a tweak that should be used in\n// a bip 340 manner when signing, factoring in BIP 86 as well. This differs\n// from WithTaprootSignTweak as no true script root will be committed to,\n// instead we just commit to the internal key.\n//\n// This option should be used in the taproot context to create a valid\n// signature for the keypath spend for taproot, when the output key was\n// generated using BIP 86.\nfunc WithBip86SignTweak() SignOption {\n\treturn func(o *signOptions) {\n\t\to.bip86Tweak = true\n\t}\n}\n\n// computeSigningNonce calculates the final nonce used for signing. This will\n// be the R value used in the final signature.\nfunc computeSigningNonce(combinedNonce [PubNonceSize]byte,\n\tcombinedKey *btcec.PublicKey, msg [32]byte) (\n\t*btcec.JacobianPoint, *btcec.ModNScalar, error) {\n\n\t// Next we'll compute the value b, that blinds our second public\n\t// nonce:\n\t//  * b = h(tag=NonceBlindTag, combinedNonce || combinedKey || m).\n\tvar (\n\t\tnonceMsgBuf  bytes.Buffer\n\t\tnonceBlinder btcec.ModNScalar\n\t)\n\tnonceMsgBuf.Write(combinedNonce[:])\n\tnonceMsgBuf.Write(schnorr.SerializePubKey(combinedKey))\n\tnonceMsgBuf.Write(msg[:])\n\tnonceBlindHash := chainhash.TaggedHash(\n\t\tNonceBlindTag, nonceMsgBuf.Bytes(),\n\t)\n\tnonceBlinder.SetByteSlice(nonceBlindHash[:])\n\n\t// Next, we'll parse the public nonces into R1 and R2.\n\tr1J, err := btcec.ParseJacobian(\n\t\tcombinedNonce[:btcec.PubKeyBytesLenCompressed],\n\t)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tr2J, err := btcec.ParseJacobian(\n\t\tcombinedNonce[btcec.PubKeyBytesLenCompressed:],\n\t)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// With our nonce blinding value, we'll now combine both the public\n\t// nonces, using the blinding factor to tweak the second nonce:\n\t//  * R = R_1 + b*R_2\n\tvar nonce btcec.JacobianPoint\n\tbtcec.ScalarMultNonConst(&nonceBlinder, &r2J, &r2J)\n\tbtcec.AddNonConst(&r1J, &r2J, &nonce)\n\n\t// If the combined nonce is the point at infinity, we'll use the\n\t// generator point instead.\n\tif nonce == infinityPoint {\n\t\tG := btcec.Generator()\n\t\tG.AsJacobian(&nonce)\n\t}\n\n\treturn &nonce, &nonceBlinder, nil\n}\n\n// Sign generates a musig2 partial signature given the passed key set, secret\n// nonce, public nonce, and private keys. This method returns an error if the\n// generated nonces are either too large, or end up mapping to the point at\n// infinity.\nfunc Sign(secNonce [SecNonceSize]byte, privKey *btcec.PrivateKey,\n\tcombinedNonce [PubNonceSize]byte, pubKeys []*btcec.PublicKey,\n\tmsg [32]byte, signOpts ...SignOption) (*PartialSignature, error) {\n\n\t// First, parse the set of optional signing options.\n\topts := defaultSignOptions()\n\tfor _, option := range signOpts {\n\t\toption(opts)\n\t}\n\n\t// Check that our signing key belongs to the secNonce\n\tif !bytes.Equal(secNonce[btcec.PrivKeyBytesLen*2:],\n\t\tprivKey.PubKey().SerializeCompressed()) {\n\n\t\treturn nil, ErrSecNoncePubkey\n\t}\n\n\t// Check that the key set contains the public key to our private key.\n\tvar containsPrivKey bool\n\tfor _, pk := range pubKeys {\n\t\tif privKey.PubKey().IsEqual(pk) {\n\t\t\tcontainsPrivKey = true\n\t\t}\n\t}\n\n\tif !containsPrivKey {\n\t\treturn nil, ErrPubkeyNotIncluded\n\t}\n\n\t// Compute the hash of all the keys here as we'll need it do aggregate\n\t// the keys and also at the final step of signing.\n\tkeysHash := keyHashFingerprint(pubKeys, opts.sortKeys)\n\tuniqueKeyIndex := secondUniqueKeyIndex(pubKeys, opts.sortKeys)\n\n\tkeyAggOpts := []KeyAggOption{\n\t\tWithKeysHash(keysHash), WithUniqueKeyIndex(uniqueKeyIndex),\n\t}\n\tswitch {\n\tcase opts.bip86Tweak:\n\t\tkeyAggOpts = append(\n\t\t\tkeyAggOpts, WithBIP86KeyTweak(),\n\t\t)\n\tcase opts.taprootTweak != nil:\n\t\tkeyAggOpts = append(\n\t\t\tkeyAggOpts, WithTaprootKeyTweak(opts.taprootTweak),\n\t\t)\n\tcase len(opts.tweaks) != 0:\n\t\tkeyAggOpts = append(keyAggOpts, WithKeyTweaks(opts.tweaks...))\n\t}\n\n\t// Next we'll construct the aggregated public key based on the set of\n\t// signers.\n\tcombinedKey, parityAcc, _, err := AggregateKeys(\n\t\tpubKeys, opts.sortKeys, keyAggOpts...,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// We'll now combine both the public nonces, using the blinding factor\n\t// to tweak the second nonce:\n\t//  * R = R_1 + b*R_2\n\tnonce, nonceBlinder, err := computeSigningNonce(\n\t\tcombinedNonce, combinedKey.FinalKey, msg,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Next we'll parse out our two secret nonces, which we'll be using in\n\t// the core signing process below.\n\tvar k1, k2 btcec.ModNScalar\n\tk1.SetByteSlice(secNonce[:btcec.PrivKeyBytesLen])\n\tk2.SetByteSlice(secNonce[btcec.PrivKeyBytesLen:])\n\n\tif k1.IsZero() || k2.IsZero() {\n\t\treturn nil, ErrSecretNonceZero\n\t}\n\n\tnonce.ToAffine()\n\n\tnonceKey := btcec.NewPublicKey(&nonce.X, &nonce.Y)\n\n\t// If the nonce R has an odd y coordinate, then we'll negate both our\n\t// secret nonces.\n\tif nonce.Y.IsOdd() {\n\t\tk1.Negate()\n\t\tk2.Negate()\n\t}\n\n\tprivKeyScalar := privKey.Key\n\tif privKeyScalar.IsZero() {\n\t\treturn nil, ErrPrivKeyZero\n\t}\n\n\tpubKey := privKey.PubKey()\n\tcombinedKeyYIsOdd := func() bool {\n\t\tcombinedKeyBytes := combinedKey.FinalKey.SerializeCompressed()\n\t\treturn combinedKeyBytes[0] == secp.PubKeyFormatCompressedOdd\n\t}()\n\n\t// Next we'll compute the two parity factors for Q, the combined key.\n\t// If the key is odd, then we'll negate it.\n\tparityCombinedKey := new(btcec.ModNScalar).SetInt(1)\n\tif combinedKeyYIsOdd {\n\t\tparityCombinedKey.Negate()\n\t}\n\n\t// Before we sign below, we'll multiply by our various parity factors\n\t// to ensure that the signing key is properly negated (if necessary):\n\t//  * d = g⋅gacc⋅d'\n\tprivKeyScalar.Mul(parityCombinedKey).Mul(parityAcc)\n\n\t// Next we'll create the challenge hash that commits to the combined\n\t// nonce, combined public key and also the message:\n\t// * e = H(tag=ChallengeHashTag, R || Q || m) mod n\n\tvar challengeMsg bytes.Buffer\n\tchallengeMsg.Write(schnorr.SerializePubKey(nonceKey))\n\tchallengeMsg.Write(schnorr.SerializePubKey(combinedKey.FinalKey))\n\tchallengeMsg.Write(msg[:])\n\tchallengeBytes := chainhash.TaggedHash(\n\t\tChallengeHashTag, challengeMsg.Bytes(),\n\t)\n\tvar e btcec.ModNScalar\n\te.SetByteSlice(challengeBytes[:])\n\n\t// Next, we'll compute a, our aggregation coefficient for the key that\n\t// we're signing with.\n\ta := aggregationCoefficient(pubKeys, pubKey, keysHash, uniqueKeyIndex)\n\n\t// With mu constructed, we can finally generate our partial signature\n\t// as: s = (k1_1 + b*k_2 + e*a*d) mod n.\n\ts := new(btcec.ModNScalar)\n\ts.Add(&k1).Add(k2.Mul(nonceBlinder)).Add(e.Mul(a).Mul(&privKeyScalar))\n\n\tsig := NewPartialSignature(s, nonceKey)\n\n\t// If we're not in fast sign mode, then we'll also validate our partial\n\t// signature.\n\tif !opts.fastSign {\n\t\tpubNonce := secNonceToPubNonce(secNonce)\n\t\tsigValid := sig.Verify(\n\t\t\tpubNonce, combinedNonce, pubKeys, pubKey, msg,\n\t\t\tsignOpts...,\n\t\t)\n\t\tif !sigValid {\n\t\t\treturn nil, fmt.Errorf(\"sig is invalid!\")\n\t\t}\n\t}\n\n\treturn &sig, nil\n}\n\n// Verify implements partial signature verification given the public nonce for\n// the signer, aggregate nonce, signer set and finally the message being\n// signed.\nfunc (p *PartialSignature) Verify(pubNonce [PubNonceSize]byte,\n\tcombinedNonce [PubNonceSize]byte, keySet []*btcec.PublicKey,\n\tsigningKey *btcec.PublicKey, msg [32]byte, signOpts ...SignOption) bool {\n\n\tpubKey := signingKey.SerializeCompressed()\n\n\treturn verifyPartialSig(\n\t\tp, pubNonce, combinedNonce, keySet, pubKey, msg, signOpts...,\n\t) == nil\n}\n\n// verifyPartialSig attempts to verify a partial schnorr signature given the\n// necessary parameters. This is the internal version of Verify that returns\n// detailed errors.  signed.\nfunc verifyPartialSig(partialSig *PartialSignature, pubNonce [PubNonceSize]byte,\n\tcombinedNonce [PubNonceSize]byte, keySet []*btcec.PublicKey,\n\tpubKey []byte, msg [32]byte, signOpts ...SignOption) error {\n\n\topts := defaultSignOptions()\n\tfor _, option := range signOpts {\n\t\toption(opts)\n\t}\n\n\t// First we'll map the internal partial signature back into something\n\t// we can manipulate.\n\ts := partialSig.S\n\n\t// Next we'll parse out the two public nonces into something we can\n\t// use.\n\t//\n\t// Compute the hash of all the keys here as we'll need it do aggregate\n\t// the keys and also at the final step of verification.\n\tkeysHash := keyHashFingerprint(keySet, opts.sortKeys)\n\tuniqueKeyIndex := secondUniqueKeyIndex(keySet, opts.sortKeys)\n\n\tkeyAggOpts := []KeyAggOption{\n\t\tWithKeysHash(keysHash), WithUniqueKeyIndex(uniqueKeyIndex),\n\t}\n\tswitch {\n\tcase opts.bip86Tweak:\n\t\tkeyAggOpts = append(\n\t\t\tkeyAggOpts, WithBIP86KeyTweak(),\n\t\t)\n\tcase opts.taprootTweak != nil:\n\t\tkeyAggOpts = append(\n\t\t\tkeyAggOpts, WithTaprootKeyTweak(opts.taprootTweak),\n\t\t)\n\tcase len(opts.tweaks) != 0:\n\t\tkeyAggOpts = append(keyAggOpts, WithKeyTweaks(opts.tweaks...))\n\t}\n\n\t// Next we'll construct the aggregated public key based on the set of\n\t// signers.\n\tcombinedKey, parityAcc, _, err := AggregateKeys(\n\t\tkeySet, opts.sortKeys, keyAggOpts...,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Next we'll compute the value b, that blinds our second public\n\t// nonce:\n\t//  * b = h(tag=NonceBlindTag, combinedNonce || combinedKey || m).\n\tvar (\n\t\tnonceMsgBuf  bytes.Buffer\n\t\tnonceBlinder btcec.ModNScalar\n\t)\n\tnonceMsgBuf.Write(combinedNonce[:])\n\tnonceMsgBuf.Write(schnorr.SerializePubKey(combinedKey.FinalKey))\n\tnonceMsgBuf.Write(msg[:])\n\tnonceBlindHash := chainhash.TaggedHash(NonceBlindTag, nonceMsgBuf.Bytes())\n\tnonceBlinder.SetByteSlice(nonceBlindHash[:])\n\n\tr1J, err := btcec.ParseJacobian(\n\t\tcombinedNonce[:btcec.PubKeyBytesLenCompressed],\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\tr2J, err := btcec.ParseJacobian(\n\t\tcombinedNonce[btcec.PubKeyBytesLenCompressed:],\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// With our nonce blinding value, we'll now combine both the public\n\t// nonces, using the blinding factor to tweak the second nonce:\n\t//  * R = R_1 + b*R_2\n\tvar nonce btcec.JacobianPoint\n\tbtcec.ScalarMultNonConst(&nonceBlinder, &r2J, &r2J)\n\tbtcec.AddNonConst(&r1J, &r2J, &nonce)\n\n\t// Next, we'll parse out the set of public nonces this signer used to\n\t// generate the signature.\n\tpubNonce1J, err := btcec.ParseJacobian(\n\t\tpubNonce[:btcec.PubKeyBytesLenCompressed],\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\tpubNonce2J, err := btcec.ParseJacobian(\n\t\tpubNonce[btcec.PubKeyBytesLenCompressed:],\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// If the nonce is the infinity point we set it to the Generator.\n\tif nonce == infinityPoint {\n\t\tbtcec.GeneratorJacobian(&nonce)\n\t} else {\n\t\tnonce.ToAffine()\n\t}\n\n\t// We'll perform a similar aggregation and blinding operator as we did\n\t// above for the combined nonces: R' = R_1' + b*R_2'.\n\tvar pubNonceJ btcec.JacobianPoint\n\n\tbtcec.ScalarMultNonConst(&nonceBlinder, &pubNonce2J, &pubNonce2J)\n\tbtcec.AddNonConst(&pubNonce1J, &pubNonce2J, &pubNonceJ)\n\n\tpubNonceJ.ToAffine()\n\n\t// If the combined nonce used in the challenge hash has an odd y\n\t// coordinate, then we'll negate our final public nonce.\n\tif nonce.Y.IsOdd() {\n\t\tpubNonceJ.Y.Negate(1)\n\t\tpubNonceJ.Y.Normalize()\n\t}\n\n\t// Next we'll create the challenge hash that commits to the combined\n\t// nonce, combined public key and also the message:\n\t//  * e = H(tag=ChallengeHashTag, R || Q || m) mod n\n\tvar challengeMsg bytes.Buffer\n\tchallengeMsg.Write(schnorr.SerializePubKey(btcec.NewPublicKey(\n\t\t&nonce.X, &nonce.Y,\n\t)))\n\tchallengeMsg.Write(schnorr.SerializePubKey(combinedKey.FinalKey))\n\tchallengeMsg.Write(msg[:])\n\tchallengeBytes := chainhash.TaggedHash(\n\t\tChallengeHashTag, challengeMsg.Bytes(),\n\t)\n\tvar e btcec.ModNScalar\n\te.SetByteSlice(challengeBytes[:])\n\n\tsigningKey, err := btcec.ParsePubKey(pubKey)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Next, we'll compute a, our aggregation coefficient for the key that\n\t// we're signing with.\n\ta := aggregationCoefficient(keySet, signingKey, keysHash, uniqueKeyIndex)\n\n\t// If the combined key has an odd y coordinate, then we'll negate\n\t// parity factor for the signing key.\n\tparityCombinedKey := new(btcec.ModNScalar).SetInt(1)\n\tcombinedKeyBytes := combinedKey.FinalKey.SerializeCompressed()\n\tif combinedKeyBytes[0] == secp.PubKeyFormatCompressedOdd {\n\t\tparityCombinedKey.Negate()\n\t}\n\n\t// Next, we'll construct the final parity factor by multiplying the\n\t// sign key parity factor with the accumulated parity factor for all\n\t// the keys.\n\tfinalParityFactor := parityCombinedKey.Mul(parityAcc)\n\n\tvar signKeyJ btcec.JacobianPoint\n\tsigningKey.AsJacobian(&signKeyJ)\n\n\t// In the final set, we'll check that: s*G == R' + e*a*g*P.\n\tvar sG, rP btcec.JacobianPoint\n\tbtcec.ScalarBaseMultNonConst(s, &sG)\n\tbtcec.ScalarMultNonConst(e.Mul(a).Mul(finalParityFactor), &signKeyJ, &rP)\n\tbtcec.AddNonConst(&rP, &pubNonceJ, &rP)\n\n\tsG.ToAffine()\n\trP.ToAffine()\n\n\tif sG != rP {\n\t\treturn ErrPartialSigInvalid\n\t}\n\n\treturn nil\n}\n\n// CombineOption is a functional option argument that allows callers to modify the\n// way we combine musig2 schnorr signatures.\ntype CombineOption func(*combineOptions)\n\n// combineOptions houses the set of functional options that can be used to\n// modify the method used to combine the musig2 partial signatures.\ntype combineOptions struct {\n\tmsg [32]byte\n\n\tcombinedKey *btcec.PublicKey\n\n\ttweakAcc *btcec.ModNScalar\n}\n\n// defaultCombineOptions returns the default set of signing operations.\nfunc defaultCombineOptions() *combineOptions {\n\treturn &combineOptions{}\n}\n\n// WithTweakedCombine is a functional option that allows callers to specify\n// that the signature was produced using a tweaked aggregated public key. In\n// order to properly aggregate the partial signatures, the caller must specify\n// enough information to reconstruct the challenge, and also the final\n// accumulated tweak value.\nfunc WithTweakedCombine(msg [32]byte, keys []*btcec.PublicKey,\n\ttweaks []KeyTweakDesc, sort bool) CombineOption {\n\n\treturn func(o *combineOptions) {\n\t\tcombinedKey, _, tweakAcc, _ := AggregateKeys(\n\t\t\tkeys, sort, WithKeyTweaks(tweaks...),\n\t\t)\n\n\t\to.msg = msg\n\t\to.combinedKey = combinedKey.FinalKey\n\t\to.tweakAcc = tweakAcc\n\t}\n}\n\n// WithTaprootTweakedCombine is similar to the WithTweakedCombine option, but\n// assumes a BIP 341 context where the final tweaked key is to be used as the\n// output key, where the internal key is the aggregated key pre-tweak.\n//\n// This option should be used over WithTweakedCombine when attempting to\n// aggregate signatures for a top-level taproot keyspend, where the output key\n// commits to a script root.\nfunc WithTaprootTweakedCombine(msg [32]byte, keys []*btcec.PublicKey,\n\tscriptRoot []byte, sort bool) CombineOption {\n\n\treturn func(o *combineOptions) {\n\t\tcombinedKey, _, tweakAcc, _ := AggregateKeys(\n\t\t\tkeys, sort, WithTaprootKeyTweak(scriptRoot),\n\t\t)\n\n\t\to.msg = msg\n\t\to.combinedKey = combinedKey.FinalKey\n\t\to.tweakAcc = tweakAcc\n\t}\n}\n\n// WithBip86TweakedCombine is similar to the WithTaprootTweakedCombine option,\n// but assumes a BIP 341 + BIP 86 context where the final tweaked key is to be\n// used as the output key, where the internal key is the aggregated key\n// pre-tweak.\n//\n// This option should be used over WithTaprootTweakedCombine when attempting to\n// aggregate signatures for a top-level taproot keyspend, where the output key\n// was generated using BIP 86.\nfunc WithBip86TweakedCombine(msg [32]byte, keys []*btcec.PublicKey,\n\tsort bool) CombineOption {\n\n\treturn func(o *combineOptions) {\n\t\tcombinedKey, _, tweakAcc, _ := AggregateKeys(\n\t\t\tkeys, sort, WithBIP86KeyTweak(),\n\t\t)\n\n\t\to.msg = msg\n\t\to.combinedKey = combinedKey.FinalKey\n\t\to.tweakAcc = tweakAcc\n\t}\n}\n\n// CombineSigs combines the set of public keys given the final aggregated\n// nonce, and the series of partial signatures for each nonce.\nfunc CombineSigs(combinedNonce *btcec.PublicKey,\n\tpartialSigs []*PartialSignature,\n\tcombineOpts ...CombineOption) *schnorr.Signature {\n\n\t// First, parse the set of optional combine options.\n\topts := defaultCombineOptions()\n\tfor _, option := range combineOpts {\n\t\toption(opts)\n\t}\n\n\t// If signer keys and tweaks are specified, then we need to carry out\n\t// some intermediate steps before we can combine the signature.\n\tvar tweakProduct *btcec.ModNScalar\n\tif opts.combinedKey != nil && opts.tweakAcc != nil {\n\t\t// Next, we'll construct the parity factor of the combined key,\n\t\t// negating it if the combined key has an even y coordinate.\n\t\tparityFactor := new(btcec.ModNScalar).SetInt(1)\n\t\tcombinedKeyBytes := opts.combinedKey.SerializeCompressed()\n\t\tif combinedKeyBytes[0] == secp.PubKeyFormatCompressedOdd {\n\t\t\tparityFactor.Negate()\n\t\t}\n\n\t\t// Next we'll reconstruct e the challenge has based on the\n\t\t// nonce and combined public key.\n\t\t//  * e = H(tag=ChallengeHashTag, R || Q || m) mod n\n\t\tvar challengeMsg bytes.Buffer\n\t\tchallengeMsg.Write(schnorr.SerializePubKey(combinedNonce))\n\t\tchallengeMsg.Write(schnorr.SerializePubKey(opts.combinedKey))\n\t\tchallengeMsg.Write(opts.msg[:])\n\t\tchallengeBytes := chainhash.TaggedHash(\n\t\t\tChallengeHashTag, challengeMsg.Bytes(),\n\t\t)\n\t\tvar e btcec.ModNScalar\n\t\te.SetByteSlice(challengeBytes[:])\n\n\t\ttweakProduct = new(btcec.ModNScalar).Set(&e)\n\t\ttweakProduct.Mul(opts.tweakAcc).Mul(parityFactor)\n\t}\n\n\t// Finally, the tweak factor also needs to be re-computed as well.\n\tvar combinedSig btcec.ModNScalar\n\tfor _, partialSig := range partialSigs {\n\t\tcombinedSig.Add(partialSig.S)\n\t}\n\n\t// If the tweak product was set above, then we'll need to add the value\n\t// at the very end in order to produce a valid signature under the\n\t// final tweaked key.\n\tif tweakProduct != nil {\n\t\tcombinedSig.Add(tweakProduct)\n\t}\n\n\t// TODO(roasbeef): less verbose way to get the x coord...\n\tvar nonceJ btcec.JacobianPoint\n\tcombinedNonce.AsJacobian(&nonceJ)\n\tnonceJ.ToAffine()\n\n\treturn schnorr.NewSignature(&nonceJ.X, &combinedSig)\n}\n"
  },
  {
    "path": "btcec/schnorr/musig2/sign_test.go",
    "content": "// Copyright 2013-2022 The btcsuite developers\n\npackage musig2\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nconst (\n\tsignVerifyTestVectorFileName = \"sign_verify_vectors.json\"\n\n\tsigCombineTestVectorFileName = \"sig_agg_vectors.json\"\n)\n\ntype signVerifyValidCase struct {\n\tIndices []int `json:\"key_indices\"`\n\n\tNonceIndices []int `json:\"nonce_indices\"`\n\n\tAggNonceIndex int `json:\"aggnonce_index\"`\n\n\tMsgIndex int `json:\"msg_index\"`\n\n\tSignerIndex int `json:\"signer_index\"`\n\n\tExpected string `json:\"expected\"`\n}\n\ntype signErrorCase struct {\n\tIndices []int `json:\"key_indices\"`\n\n\tAggNonceIndex int `json:\"aggnonce_index\"`\n\n\tMsgIndex int `json:\"msg_index\"`\n\n\tSecNonceIndex int `json:\"secnonce_index\"`\n\n\tComment string `json:\"comment\"`\n}\n\ntype verifyFailCase struct {\n\tSig string `json:\"sig\"`\n\n\tIndices []int `json:\"key_indices\"`\n\n\tNonceIndices []int `json:\"nonce_indices\"`\n\n\tMsgIndex int `json:\"msg_index\"`\n\n\tSignerIndex int `json:\"signer_index\"`\n\n\tComment string `json:\"comment\"`\n}\n\ntype verifyErrorCase struct {\n\tSig string `json:\"sig\"`\n\n\tIndices []int `json:\"key_indices\"`\n\n\tNonceIndices []int `json:\"nonce_indices\"`\n\n\tMsgIndex int `json:\"msg_index\"`\n\n\tSignerIndex int `json:\"signer_index\"`\n\n\tComment string `json:\"comment\"`\n}\n\ntype signVerifyTestVectors struct {\n\tPrivKey string `json:\"sk\"`\n\n\tPubKeys []string `json:\"pubkeys\"`\n\n\tPrivNonces []string `json:\"secnonces\"`\n\n\tPubNonces []string `json:\"pnonces\"`\n\n\tAggNonces []string `json:\"aggnonces\"`\n\n\tMsgs []string `json:\"msgs\"`\n\n\tValidCases []signVerifyValidCase `json:\"valid_test_cases\"`\n\n\tSignErrorCases []signErrorCase `json:\"sign_error_test_cases\"`\n\n\tVerifyFailCases []verifyFailCase `json:\"verify_fail_test_cases\"`\n\n\tVerifyErrorCases []verifyErrorCase `json:\"verify_error_test_cases\"`\n}\n\n// TestMusig2SignVerify tests that we pass the musig2 verification tests.\nfunc TestMusig2SignVerify(t *testing.T) {\n\tt.Parallel()\n\n\ttestVectorPath := path.Join(\n\t\ttestVectorBaseDir, signVerifyTestVectorFileName,\n\t)\n\ttestVectorBytes, err := os.ReadFile(testVectorPath)\n\trequire.NoError(t, err)\n\n\tvar testCases signVerifyTestVectors\n\trequire.NoError(t, json.Unmarshal(testVectorBytes, &testCases))\n\n\tprivKey, _ := btcec.PrivKeyFromBytes(mustParseHex(testCases.PrivKey))\n\n\tfor i, testCase := range testCases.ValidCases {\n\t\ttestCase := testCase\n\n\t\ttestName := fmt.Sprintf(\"valid_case_%v\", i)\n\t\tt.Run(testName, func(t *testing.T) {\n\t\t\tpubKeys, err := keysFromIndices(\n\t\t\t\tt, testCase.Indices, testCases.PubKeys,\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tpubNonces := pubNoncesFromIndices(\n\t\t\t\tt, testCase.NonceIndices, testCases.PubNonces,\n\t\t\t)\n\n\t\t\tcombinedNonce, err := AggregateNonces(pubNonces)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tvar msg [32]byte\n\t\t\tcopy(msg[:], mustParseHex(testCases.Msgs[testCase.MsgIndex]))\n\n\t\t\tvar secNonce [SecNonceSize]byte\n\t\t\tcopy(secNonce[:], mustParseHex(testCases.PrivNonces[0]))\n\n\t\t\tpartialSig, err := Sign(\n\t\t\t\tsecNonce, privKey, combinedNonce, pubKeys,\n\t\t\t\tmsg,\n\t\t\t)\n\n\t\t\tvar partialSigBytes [32]byte\n\t\t\tpartialSig.S.PutBytesUnchecked(partialSigBytes[:])\n\n\t\t\trequire.Equal(\n\t\t\t\tt, hex.EncodeToString(partialSigBytes[:]),\n\t\t\t\thex.EncodeToString(mustParseHex(testCase.Expected)),\n\t\t\t)\n\t\t})\n\t}\n\n\tfor _, testCase := range testCases.SignErrorCases {\n\t\ttestCase := testCase\n\n\t\ttestName := fmt.Sprintf(\"invalid_case_%v\",\n\t\t\tstrings.ToLower(testCase.Comment))\n\n\t\tt.Run(testName, func(t *testing.T) {\n\t\t\tpubKeys, err := keysFromIndices(\n\t\t\t\tt, testCase.Indices, testCases.PubKeys,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\trequire.ErrorIs(t, err, secp.ErrPubKeyNotOnCurve)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar aggNonce [PubNonceSize]byte\n\t\t\tcopy(\n\t\t\t\taggNonce[:],\n\t\t\t\tmustParseHex(\n\t\t\t\t\ttestCases.AggNonces[testCase.AggNonceIndex],\n\t\t\t\t),\n\t\t\t)\n\n\t\t\tvar msg [32]byte\n\t\t\tcopy(msg[:], mustParseHex(testCases.Msgs[testCase.MsgIndex]))\n\n\t\t\tvar secNonce [SecNonceSize]byte\n\t\t\tcopy(\n\t\t\t\tsecNonce[:],\n\t\t\t\tmustParseHex(\n\t\t\t\t\ttestCases.PrivNonces[testCase.SecNonceIndex],\n\t\t\t\t),\n\t\t\t)\n\n\t\t\t_, err = Sign(\n\t\t\t\tsecNonce, privKey, aggNonce, pubKeys,\n\t\t\t\tmsg,\n\t\t\t)\n\t\t\trequire.Error(t, err)\n\t\t})\n\t}\n\n\tfor _, testCase := range testCases.VerifyFailCases {\n\t\ttestCase := testCase\n\n\t\ttestName := fmt.Sprintf(\"verify_fail_%v\",\n\t\t\tstrings.ToLower(testCase.Comment))\n\t\tt.Run(testName, func(t *testing.T) {\n\t\t\tpubKeys, err := keysFromIndices(\n\t\t\t\tt, testCase.Indices, testCases.PubKeys,\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tpubNonces := pubNoncesFromIndices(\n\t\t\t\tt, testCase.NonceIndices, testCases.PubNonces,\n\t\t\t)\n\n\t\t\tcombinedNonce, err := AggregateNonces(pubNonces)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tvar msg [32]byte\n\t\t\tcopy(\n\t\t\t\tmsg[:],\n\t\t\t\tmustParseHex(testCases.Msgs[testCase.MsgIndex]),\n\t\t\t)\n\n\t\t\tvar secNonce [SecNonceSize]byte\n\t\t\tcopy(secNonce[:], mustParseHex(testCases.PrivNonces[0]))\n\n\t\t\tsignerNonce := secNonceToPubNonce(secNonce)\n\n\t\t\tvar partialSig PartialSignature\n\t\t\terr = partialSig.Decode(\n\t\t\t\tbytes.NewReader(mustParseHex(testCase.Sig)),\n\t\t\t)\n\t\t\tif err != nil && strings.Contains(testCase.Comment, \"group size\") {\n\t\t\t\trequire.ErrorIs(t, err, ErrPartialSigInvalid)\n\t\t\t}\n\n\t\t\terr = verifyPartialSig(\n\t\t\t\t&partialSig, signerNonce, combinedNonce,\n\t\t\t\tpubKeys, privKey.PubKey().SerializeCompressed(),\n\t\t\t\tmsg,\n\t\t\t)\n\t\t\trequire.Error(t, err)\n\t\t})\n\t}\n\n\tfor _, testCase := range testCases.VerifyErrorCases {\n\t\ttestCase := testCase\n\n\t\ttestName := fmt.Sprintf(\"verify_error_%v\",\n\t\t\tstrings.ToLower(testCase.Comment))\n\t\tt.Run(testName, func(t *testing.T) {\n\t\t\tswitch testCase.Comment {\n\t\t\tcase \"Invalid pubnonce\":\n\t\t\t\tpubNonces := pubNoncesFromIndices(\n\t\t\t\t\tt, testCase.NonceIndices, testCases.PubNonces,\n\t\t\t\t)\n\t\t\t\t_, err := AggregateNonces(pubNonces)\n\t\t\t\trequire.ErrorIs(t, err, secp.ErrPubKeyNotOnCurve)\n\n\t\t\tcase \"Invalid pubkey\":\n\t\t\t\t_, err := keysFromIndices(\n\t\t\t\t\tt, testCase.Indices, testCases.PubKeys,\n\t\t\t\t)\n\t\t\t\trequire.ErrorIs(t, err, secp.ErrPubKeyNotOnCurve)\n\n\t\t\tdefault:\n\t\t\t\tt.Fatalf(\"unhandled case: %v\", testCase.Comment)\n\t\t\t}\n\t\t})\n\t}\n\n}\n\ntype sigCombineValidCase struct {\n\tAggNonce string `json:\"aggnonce\"`\n\n\tNonceIndices []int `json:\"nonce_indices\"`\n\n\tIndices []int `json:\"key_indices\"`\n\n\tTweakIndices []int `json:\"tweak_indices\"`\n\n\tIsXOnly []bool `json:\"is_xonly\"`\n\n\tPSigIndices []int `json:\"psig_indices\"`\n\n\tExpected string `json:\"expected\"`\n}\n\ntype sigCombineTestVectors struct {\n\tPubKeys []string `json:\"pubkeys\"`\n\n\tPubNonces []string `json:\"pnonces\"`\n\n\tTweaks []string `json:\"tweaks\"`\n\n\tPsigs []string `json:\"psigs\"`\n\n\tMsg string `json:\"msg\"`\n\n\tValidCases []sigCombineValidCase `json:\"valid_test_cases\"`\n}\n\nfunc pSigsFromIndices(t *testing.T, sigs []string, indices []int) []*PartialSignature {\n\tpSigs := make([]*PartialSignature, len(indices))\n\tfor i, idx := range indices {\n\t\tvar pSig PartialSignature\n\t\terr := pSig.Decode(bytes.NewReader(mustParseHex(sigs[idx])))\n\t\trequire.NoError(t, err)\n\n\t\tpSigs[i] = &pSig\n\t}\n\n\treturn pSigs\n}\n\n// TestMusig2SignCombine tests that we pass the musig2 sig combination tests.\nfunc TestMusig2SignCombine(t *testing.T) {\n\tt.Parallel()\n\n\ttestVectorPath := path.Join(\n\t\ttestVectorBaseDir, sigCombineTestVectorFileName,\n\t)\n\ttestVectorBytes, err := os.ReadFile(testVectorPath)\n\trequire.NoError(t, err)\n\n\tvar testCases sigCombineTestVectors\n\trequire.NoError(t, json.Unmarshal(testVectorBytes, &testCases))\n\n\tvar msg [32]byte\n\tcopy(msg[:], mustParseHex(testCases.Msg))\n\n\tfor i, testCase := range testCases.ValidCases {\n\t\ttestCase := testCase\n\n\t\ttestName := fmt.Sprintf(\"valid_case_%v\", i)\n\t\tt.Run(testName, func(t *testing.T) {\n\t\t\tpubKeys, err := keysFromIndices(\n\t\t\t\tt, testCase.Indices, testCases.PubKeys,\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tpubNonces := pubNoncesFromIndices(\n\t\t\t\tt, testCase.NonceIndices, testCases.PubNonces,\n\t\t\t)\n\n\t\t\tpartialSigs := pSigsFromIndices(\n\t\t\t\tt, testCases.Psigs, testCase.PSigIndices,\n\t\t\t)\n\n\t\t\tvar (\n\t\t\t\tcombineOpts []CombineOption\n\t\t\t\tkeyOpts     []KeyAggOption\n\t\t\t)\n\t\t\tif len(testCase.TweakIndices) > 0 {\n\t\t\t\ttweaks := tweaksFromIndices(\n\t\t\t\t\tt, testCase.TweakIndices,\n\t\t\t\t\ttestCases.Tweaks, testCase.IsXOnly,\n\t\t\t\t)\n\n\t\t\t\tcombineOpts = append(combineOpts, WithTweakedCombine(\n\t\t\t\t\tmsg, pubKeys, tweaks, false,\n\t\t\t\t))\n\n\t\t\t\tkeyOpts = append(keyOpts, WithKeyTweaks(tweaks...))\n\t\t\t}\n\n\t\t\tcombinedKey, _, _, err := AggregateKeys(\n\t\t\t\tpubKeys, false, keyOpts...,\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tcombinedNonce, err := AggregateNonces(pubNonces)\n\t\t\trequire.NoError(t, err)\n\n\t\t\tfinalNonceJ, _, err := computeSigningNonce(\n\t\t\t\tcombinedNonce, combinedKey.FinalKey, msg,\n\t\t\t)\n\n\t\t\tfinalNonceJ.ToAffine()\n\t\t\tfinalNonce := btcec.NewPublicKey(\n\t\t\t\t&finalNonceJ.X, &finalNonceJ.Y,\n\t\t\t)\n\n\t\t\tcombinedSig := CombineSigs(\n\t\t\t\tfinalNonce, partialSigs, combineOpts...,\n\t\t\t)\n\t\t\trequire.Equal(t,\n\t\t\t\tstrings.ToLower(testCase.Expected),\n\t\t\t\thex.EncodeToString(combinedSig.Serialize()),\n\t\t\t)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "btcec/schnorr/pubkey.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2021 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage schnorr\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// These constants define the lengths of serialized public keys.\nconst (\n\tPubKeyBytesLen = 32\n)\n\n// ParsePubKey parses a public key for a koblitz curve from a bytestring into a\n// btcec.Publickey, verifying that it is valid. It only supports public keys in\n// the BIP-340 32-byte format.\nfunc ParsePubKey(pubKeyStr []byte) (*btcec.PublicKey, error) {\n\tif pubKeyStr == nil {\n\t\terr := fmt.Errorf(\"nil pubkey byte string\")\n\t\treturn nil, err\n\t}\n\tif len(pubKeyStr) != PubKeyBytesLen {\n\t\terr := fmt.Errorf(\"bad pubkey byte string size (want %v, have %v)\",\n\t\t\tPubKeyBytesLen, len(pubKeyStr))\n\t\treturn nil, err\n\t}\n\n\t// We'll manually prepend the compressed byte so we can re-use the\n\t// existing pubkey parsing routine of the main btcec package.\n\tvar keyCompressed [btcec.PubKeyBytesLenCompressed]byte\n\tkeyCompressed[0] = secp.PubKeyFormatCompressedEven\n\tcopy(keyCompressed[1:], pubKeyStr)\n\n\treturn btcec.ParsePubKey(keyCompressed[:])\n}\n\n// SerializePubKey serializes a public key as specified by BIP 340. Public keys\n// in this format are 32 bytes in length, and are assumed to have an even y\n// coordinate.\nfunc SerializePubKey(pub *btcec.PublicKey) []byte {\n\tpBytes := pub.SerializeCompressed()\n\treturn pBytes[1:]\n}\n"
  },
  {
    "path": "btcec/schnorr/signature.go",
    "content": "// Copyright (c) 2013-2022 The btcsuite developers\n\npackage schnorr\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n\tecdsa_schnorr \"github.com/decred/dcrd/dcrec/secp256k1/v4/schnorr\"\n)\n\nconst (\n\t// SignatureSize is the size of an encoded Schnorr signature.\n\tSignatureSize = 64\n\n\t// scalarSize is the size of an encoded big endian scalar.\n\tscalarSize = 32\n)\n\nvar (\n\t// rfc6979ExtraDataV0 is the extra data to feed to RFC6979 when\n\t// generating the deterministic nonce for the BIP-340 scheme.  This\n\t// ensures the same nonce is not generated for the same message and key\n\t// as for other signing algorithms such as ECDSA.\n\t//\n\t// It is equal to SHA-256([]byte(\"BIP-340\")).\n\trfc6979ExtraDataV0 = [32]uint8{\n\t\t0xa3, 0xeb, 0x4c, 0x18, 0x2f, 0xae, 0x7e, 0xf4,\n\t\t0xe8, 0x10, 0xc6, 0xee, 0x13, 0xb0, 0xe9, 0x26,\n\t\t0x68, 0x6d, 0x71, 0xe8, 0x7f, 0x39, 0x4f, 0x79,\n\t\t0x9c, 0x00, 0xa5, 0x21, 0x03, 0xcb, 0x4e, 0x17,\n\t}\n)\n\n// Signature is a type representing a Schnorr signature.\ntype Signature struct {\n\tr btcec.FieldVal\n\ts btcec.ModNScalar\n}\n\n// NewSignature instantiates a new signature given some r and s values.\nfunc NewSignature(r *btcec.FieldVal, s *btcec.ModNScalar) *Signature {\n\tvar sig Signature\n\tsig.r.Set(r).Normalize()\n\tsig.s.Set(s)\n\treturn &sig\n}\n\n// Serialize returns the Schnorr signature in the more strict format.\n//\n// The signatures are encoded as\n//\n//\tsig[0:32]  x coordinate of the point R, encoded as a big-endian uint256\n//\tsig[32:64] s, encoded also as big-endian uint256\nfunc (sig Signature) Serialize() []byte {\n\t// Total length of returned signature is the length of r and s.\n\tvar b [SignatureSize]byte\n\tsig.r.PutBytesUnchecked(b[0:32])\n\tsig.s.PutBytesUnchecked(b[32:64])\n\treturn b[:]\n}\n\n// ParseSignature parses a signature according to the BIP-340 specification and\n// enforces the following additional restrictions specific to secp256k1:\n//\n// - The r component must be in the valid range for secp256k1 field elements\n// - The s component must be in the valid range for secp256k1 scalars\nfunc ParseSignature(sig []byte) (*Signature, error) {\n\t// The signature must be the correct length.\n\tsigLen := len(sig)\n\tif sigLen < SignatureSize {\n\t\tstr := fmt.Sprintf(\"malformed signature: too short: %d < %d\", sigLen,\n\t\t\tSignatureSize)\n\t\treturn nil, signatureError(ecdsa_schnorr.ErrSigTooShort, str)\n\t}\n\tif sigLen > SignatureSize {\n\t\tstr := fmt.Sprintf(\"malformed signature: too long: %d > %d\", sigLen,\n\t\t\tSignatureSize)\n\t\treturn nil, signatureError(ecdsa_schnorr.ErrSigTooLong, str)\n\t}\n\n\t// The signature is validly encoded at this point, however, enforce\n\t// additional restrictions to ensure r is in the range [0, p-1], and s is in\n\t// the range [0, n-1] since valid Schnorr signatures are required to be in\n\t// that range per spec.\n\tvar r btcec.FieldVal\n\tif overflow := r.SetByteSlice(sig[0:32]); overflow {\n\t\tstr := \"invalid signature: r >= field prime\"\n\t\treturn nil, signatureError(ecdsa_schnorr.ErrSigRTooBig, str)\n\t}\n\tvar s btcec.ModNScalar\n\ts.SetByteSlice(sig[32:64])\n\n\t// Return the signature.\n\treturn NewSignature(&r, &s), nil\n}\n\n// IsEqual compares this Signature instance to the one passed, returning true\n// if both Signatures are equivalent. A signature is equivalent to another, if\n// they both have the same scalar value for R and S.\nfunc (sig Signature) IsEqual(otherSig *Signature) bool {\n\treturn sig.r.Equals(&otherSig.r) && sig.s.Equals(&otherSig.s)\n}\n\n// schnorrVerify attempt to verify the signature for the provided hash and\n// secp256k1 public key and either returns nil if successful or a specific error\n// indicating why it failed if not successful.\n//\n// This differs from the exported Verify method in that it returns a specific\n// error to support better testing while the exported method simply returns a\n// bool indicating success or failure.\nfunc schnorrVerify(sig *Signature, hash []byte, pubKeyBytes []byte) error {\n\t// The algorithm for producing a BIP-340 signature is described in\n\t// README.md and is reproduced here for reference:\n\t//\n\t// 1. Fail if m is not 32 bytes\n\t// 2. P = lift_x(int(pk)).\n\t// 3. r = int(sig[0:32]); fail is r >= p.\n\t// 4. s = int(sig[32:64]); fail if s >= n.\n\t// 5. e = int(tagged_hash(\"BIP0340/challenge\", bytes(r) || bytes(P) || M)) mod n.\n\t// 6. R = s*G - e*P\n\t// 7. Fail if is_infinite(R)\n\t// 8. Fail if not hash_even_y(R)\n\t// 9. Fail is x(R) != r.\n\t// 10. Return success iff failure did not occur before reaching this point.\n\n\t// Step 1.\n\t//\n\t// Fail if m is not 32 bytes\n\tif len(hash) != scalarSize {\n\t\tstr := fmt.Sprintf(\"wrong size for message (got %v, want %v)\",\n\t\t\tlen(hash), scalarSize)\n\t\treturn signatureError(ecdsa_schnorr.ErrInvalidHashLen, str)\n\t}\n\n\t// Step 2.\n\t//\n\t// P = lift_x(int(pk))\n\t//\n\t// Fail if P is not a point on the curve\n\tpubKey, err := ParsePubKey(pubKeyBytes)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !pubKey.IsOnCurve() {\n\t\tstr := \"pubkey point is not on curve\"\n\t\treturn signatureError(ecdsa_schnorr.ErrPubKeyNotOnCurve, str)\n\t}\n\n\t// Step 3.\n\t//\n\t// Fail if r >= p\n\t//\n\t// Note this is already handled by the fact r is a field element.\n\n\t// Step 4.\n\t//\n\t// Fail if s >= n\n\t//\n\t// Note this is already handled by the fact s is a mod n scalar.\n\n\t// Step 5.\n\t//\n\t// e = int(tagged_hash(\"BIP0340/challenge\", bytes(r) || bytes(P) || M)) mod n.\n\tvar rBytes [32]byte\n\tsig.r.PutBytesUnchecked(rBytes[:])\n\tpBytes := SerializePubKey(pubKey)\n\n\tcommitment := chainhash.TaggedHash(\n\t\tchainhash.TagBIP0340Challenge, rBytes[:], pBytes, hash,\n\t)\n\n\tvar e btcec.ModNScalar\n\te.SetBytes((*[32]byte)(commitment))\n\n\t// Negate e here so we can use AddNonConst below to subtract the s*G\n\t// point from e*P.\n\te.Negate()\n\n\t// Step 6.\n\t//\n\t// R = s*G - e*P\n\tvar P, R, sG, eP btcec.JacobianPoint\n\tpubKey.AsJacobian(&P)\n\tbtcec.ScalarBaseMultNonConst(&sig.s, &sG)\n\tbtcec.ScalarMultNonConst(&e, &P, &eP)\n\tbtcec.AddNonConst(&sG, &eP, &R)\n\n\t// Step 7.\n\t//\n\t// Fail if R is the point at infinity\n\tif (R.X.IsZero() && R.Y.IsZero()) || R.Z.IsZero() {\n\t\tstr := \"calculated R point is the point at infinity\"\n\t\treturn signatureError(ecdsa_schnorr.ErrSigRNotOnCurve, str)\n\t}\n\n\t// Step 8.\n\t//\n\t// Fail if R.y is odd\n\t//\n\t// Note that R must be in affine coordinates for this check.\n\tR.ToAffine()\n\tif R.Y.IsOdd() {\n\t\tstr := \"calculated R y-value is odd\"\n\t\treturn signatureError(ecdsa_schnorr.ErrSigRYIsOdd, str)\n\t}\n\n\t// Step 9.\n\t//\n\t// Verified if R.x == r\n\t//\n\t// Note that R must be in affine coordinates for this check.\n\tif !sig.r.Equals(&R.X) {\n\t\tstr := \"calculated R point was not given R\"\n\t\treturn signatureError(ecdsa_schnorr.ErrUnequalRValues, str)\n\t}\n\n\t// Step 10.\n\t//\n\t// Return success iff failure did not occur before reaching this point.\n\treturn nil\n}\n\n// Verify returns whether or not the signature is valid for the provided hash\n// and secp256k1 public key.\nfunc (sig *Signature) Verify(hash []byte, pubKey *btcec.PublicKey) bool {\n\tpubkeyBytes := SerializePubKey(pubKey)\n\treturn schnorrVerify(sig, hash, pubkeyBytes) == nil\n}\n\n// zeroArray zeroes the memory of a scalar array.\nfunc zeroArray(a *[scalarSize]byte) {\n\tfor i := 0; i < scalarSize; i++ {\n\t\ta[i] = 0x00\n\t}\n}\n\n// schnorrSign generates a BIP-340 signature over the secp256k1 curve for the\n// provided hash (which should be the result of hashing a larger message) using\n// the given nonce and private key.  The produced signature is deterministic\n// (same message, nonce, and key yield the same signature) and canonical.\n//\n// WARNING: The hash MUST be 32 bytes and both the nonce and private keys must\n// NOT be 0.  Since this is an internal use function, these preconditions MUST\n// be satisfied by the caller.\nfunc schnorrSign(privKey, nonce *btcec.ModNScalar, pubKey *btcec.PublicKey, hash []byte,\n\topts *signOptions) (*Signature, error) {\n\n\t// The algorithm for producing a BIP-340 signature is described in\n\t// README.md and is reproduced here for reference:\n\t//\n\t// G = curve generator\n\t// n = curve order\n\t// d = private key\n\t// m = message\n\t// a = input randomness\n\t// r, s = signature\n\t//\n\t// 1. d' = int(d)\n\t// 2. Fail if m is not 32 bytes\n\t// 3. Fail if d = 0 or d >= n\n\t// 4. P = d'*G\n\t// 5. Negate d if P.y is odd\n\t// 6. t = bytes(d) xor tagged_hash(\"BIP0340/aux\", t || bytes(P) || m)\n\t// 7. rand = tagged_hash(\"BIP0340/nonce\", a)\n\t// 8. k' = int(rand) mod n\n\t// 9. Fail if k' = 0\n\t// 10. R = 'k*G\n\t// 11. Negate k if R.y id odd\n\t// 12. e = tagged_hash(\"BIP0340/challenge\", bytes(R) || bytes(P) || m) mod n\n\t// 13. sig = bytes(R) || bytes((k + e*d)) mod n\n\t// 14. If Verify(bytes(P), m, sig) fails, abort.\n\t// 15. return sig.\n\t//\n\t// Note that the set of functional options passed in may modify the\n\t// above algorithm. Namely if CustomNonce is used, then steps 6-8 are\n\t// replaced with a process that generates the nonce using rfc6979. If\n\t// FastSign is passed, then we skip set 14.\n\n\t// NOTE: Steps 1-9 are performed by the caller.\n\n\t//\n\t// Step 10.\n\t//\n\t// R = kG\n\tvar R btcec.JacobianPoint\n\tk := *nonce\n\tbtcec.ScalarBaseMultNonConst(&k, &R)\n\n\t// Step 11.\n\t//\n\t// Negate nonce k if R.y is odd (R.y is the y coordinate of the point R)\n\t//\n\t// Note that R must be in affine coordinates for this check.\n\tR.ToAffine()\n\tif R.Y.IsOdd() {\n\t\tk.Negate()\n\t}\n\n\t// Step 12.\n\t//\n\t// e = tagged_hash(\"BIP0340/challenge\", bytes(R) || bytes(P) || m) mod n\n\tpBytes := SerializePubKey(pubKey)\n\tcommitment := chainhash.TaggedHash(\n\t\tchainhash.TagBIP0340Challenge, R.X.Bytes()[:], pBytes, hash,\n\t)\n\n\tvar e btcec.ModNScalar\n\tif overflow := e.SetBytes((*[32]byte)(commitment)); overflow != 0 {\n\t\tk.Zero()\n\t\tstr := \"hash of (r || P || m) too big\"\n\t\treturn nil, signatureError(ecdsa_schnorr.ErrSchnorrHashValue, str)\n\t}\n\n\t// Step 13.\n\t//\n\t// s = k + e*d mod n\n\ts := new(btcec.ModNScalar).Mul2(&e, privKey).Add(&k)\n\tk.Zero()\n\n\tsig := NewSignature(&R.X, s)\n\n\t// Step 14.\n\t//\n\t// If Verify(bytes(P), m, sig) fails, abort.\n\tif !opts.fastSign {\n\t\tif err := schnorrVerify(sig, hash, pBytes); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Step 15.\n\t//\n\t// Return (r, s)\n\treturn sig, nil\n}\n\n// SignOption is a functional option argument that allows callers to modify the\n// way we generate BIP-340 schnorr signatures.\ntype SignOption func(*signOptions)\n\n// signOptions houses the set of functional options that can be used to modify\n// the method used to generate the BIP-340 signature.\ntype signOptions struct {\n\t// fastSign determines if we'll skip the check at the end of the routine\n\t// where we attempt to verify the produced signature.\n\tfastSign bool\n\n\t// authNonce allows the user to pass in their own nonce information, which\n\t// is useful for schemes like mu-sig.\n\tauthNonce *[32]byte\n}\n\n// defaultSignOptions returns the default set of signing operations.\nfunc defaultSignOptions() *signOptions {\n\treturn &signOptions{}\n}\n\n// FastSign forces signing to skip the extra verification step at the end.\n// Performance sensitive applications may opt to use this option to speed up the\n// signing operation.\nfunc FastSign() SignOption {\n\treturn func(o *signOptions) {\n\t\to.fastSign = true\n\t}\n}\n\n// CustomNonce allows users to pass in a custom set of auxData that's used as\n// input randomness to generate the nonce used during signing. Users may want\n// to specify this custom value when using multi-signatures schemes such as\n// Mu-Sig2. If this option isn't set, then rfc6979 will be used to generate the\n// nonce material.\nfunc CustomNonce(auxData [32]byte) SignOption {\n\treturn func(o *signOptions) {\n\t\to.authNonce = &auxData\n\t}\n}\n\n// Sign generates an BIP-340 signature over the secp256k1 curve for the\n// provided hash (which should be the result of hashing a larger message) using\n// the given private key.  The produced signature is deterministic (same\n// message and same key yield the same signature) and canonical.\n//\n// Note that the current signing implementation has a few remaining variable\n// time aspects which make use of the private key and the generated nonce,\n// which can expose the signer to constant time attacks.  As a result, this\n// function should not be used in situations where there is the possibility of\n// someone having EM field/cache/etc access.\nfunc Sign(privKey *btcec.PrivateKey, hash []byte,\n\tsignOpts ...SignOption) (*Signature, error) {\n\n\t// First, parse the set of optional signing options.\n\topts := defaultSignOptions()\n\tfor _, option := range signOpts {\n\t\toption(opts)\n\t}\n\n\t// The algorithm for producing a BIP-340 signature is described in\n\t// README.md and is reproduced here for reference:\n\t//\n\t// G = curve generator\n\t// n = curve order\n\t// d = private key\n\t// m = message\n\t// a = input randomness\n\t// r, s = signature\n\t//\n\t// 1. d' = int(d)\n\t// 2. Fail if m is not 32 bytes\n\t// 3. Fail if d = 0 or d >= n\n\t// 4. P = d'*G\n\t// 5. Negate d if P.y is odd\n\t// 6. t = bytes(d) xor tagged_hash(\"BIP0340/aux\", t || bytes(P) || m)\n\t// 7. rand = tagged_hash(\"BIP0340/nonce\", a)\n\t// 8. k' = int(rand) mod n\n\t// 9. Fail if k' = 0\n\t// 10. R = 'k*G\n\t// 11. Negate k if R.y id odd\n\t// 12. e = tagged_hash(\"BIP0340/challenge\", bytes(R) || bytes(P) || mod) mod n\n\t// 13. sig = bytes(R) || bytes((k + e*d)) mod n\n\t// 14. If Verify(bytes(P), m, sig) fails, abort.\n\t// 15. return sig.\n\t//\n\t// Note that the set of functional options passed in may modify the\n\t// above algorithm. Namely if CustomNonce is used, then steps 6-8 are\n\t// replaced with a process that generates the nonce using rfc6979. If\n\t// FastSign is passed, then we skip set 14.\n\n\t// Step 1.\n\t//\n\t// d' = int(d)\n\tvar privKeyScalar btcec.ModNScalar\n\tprivKeyScalar.Set(&privKey.Key)\n\n\t// Step 2.\n\t//\n\t// Fail if m is not 32 bytes\n\tif len(hash) != scalarSize {\n\t\tstr := fmt.Sprintf(\"wrong size for message hash (got %v, want %v)\",\n\t\t\tlen(hash), scalarSize)\n\t\treturn nil, signatureError(ecdsa_schnorr.ErrInvalidHashLen, str)\n\t}\n\n\t// Step 3.\n\t//\n\t// Fail if d = 0 or d >= n\n\tif privKeyScalar.IsZero() {\n\t\tstr := \"private key is zero\"\n\t\treturn nil, signatureError(ecdsa_schnorr.ErrPrivateKeyIsZero, str)\n\t}\n\n\t// Step 4.\n\t//\n\t// P = 'd*G\n\tpub := privKey.PubKey()\n\n\t// Step 5.\n\t//\n\t// Negate d if P.y is odd.\n\tpubKeyBytes := pub.SerializeCompressed()\n\tif pubKeyBytes[0] == secp.PubKeyFormatCompressedOdd {\n\t\tprivKeyScalar.Negate()\n\t}\n\n\t// At this point, we check to see if a CustomNonce has been passed in,\n\t// and if so, then we'll deviate from the main routine here by\n\t// generating the nonce value as specified by BIP-0340.\n\tif opts.authNonce != nil {\n\t\t// Step 6.\n\t\t//\n\t\t// t = bytes(d) xor tagged_hash(\"BIP0340/aux\", a)\n\t\tprivBytes := privKeyScalar.Bytes()\n\t\tt := chainhash.TaggedHash(\n\t\t\tchainhash.TagBIP0340Aux, (*opts.authNonce)[:],\n\t\t)\n\t\tfor i := 0; i < len(t); i++ {\n\t\t\tt[i] ^= privBytes[i]\n\t\t}\n\n\t\t// Step 7.\n\t\t//\n\t\t// rand = tagged_hash(\"BIP0340/nonce\", t || bytes(P) || m)\n\t\t//\n\t\t// We snip off the first byte of the serialized pubkey, as we\n\t\t// only need the x coordinate and not the market byte.\n\t\trand := chainhash.TaggedHash(\n\t\t\tchainhash.TagBIP0340Nonce, t[:], pubKeyBytes[1:], hash,\n\t\t)\n\n\t\t// Step 8.\n\t\t//\n\t\t// k'= int(rand) mod n\n\t\tvar kPrime btcec.ModNScalar\n\t\tkPrime.SetBytes((*[32]byte)(rand))\n\n\t\t// Step 9.\n\t\t//\n\t\t// Fail if k' = 0\n\t\tif kPrime.IsZero() {\n\t\t\tstr := fmt.Sprintf(\"generated nonce is zero\")\n\t\t\treturn nil, signatureError(ecdsa_schnorr.ErrSchnorrHashValue, str)\n\t\t}\n\n\t\tsig, err := schnorrSign(&privKeyScalar, &kPrime, pub, hash, opts)\n\t\tkPrime.Zero()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\treturn sig, nil\n\t}\n\n\tvar privKeyBytes [scalarSize]byte\n\tprivKeyScalar.PutBytes(&privKeyBytes)\n\tdefer zeroArray(&privKeyBytes)\n\tfor iteration := uint32(0); ; iteration++ {\n\t\t// Step 6-9.\n\t\t//\n\t\t// Use RFC6979 to generate a deterministic nonce k in [1, n-1]\n\t\t// parameterized by the private key, message being signed, extra data\n\t\t// that identifies the scheme, and an iteration count\n\t\tk := btcec.NonceRFC6979(\n\t\t\tprivKeyBytes[:], hash, rfc6979ExtraDataV0[:], nil, iteration,\n\t\t)\n\n\t\t// Steps 10-15.\n\t\tsig, err := schnorrSign(&privKeyScalar, k, pub, hash, opts)\n\t\tk.Zero()\n\t\tif err != nil {\n\t\t\t// Try again with a new nonce.\n\t\t\tcontinue\n\t\t}\n\n\t\treturn sig, nil\n\t}\n}\n"
  },
  {
    "path": "btcec/schnorr/signature_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2021 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage schnorr\n\nimport (\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"strings\"\n\t\"testing\"\n\t\"testing/quick\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/davecgh/go-spew/spew\"\n\tsecp_ecdsa \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n\tecdsa_schnorr \"github.com/decred/dcrd/dcrec/secp256k1/v4/schnorr\"\n)\n\ntype bip340Test struct {\n\tsecretKey    string\n\tpublicKey    string\n\tauxRand      string\n\tmessage      string\n\tsignature    string\n\tverifyResult bool\n\tvalidPubKey  bool\n\texpectErr    error\n\trfc6979      bool\n}\n\nvar bip340TestVectors = []bip340Test{\n\t{\n\t\tsecretKey:    \"0000000000000000000000000000000000000000000000000000000000000003\",\n\t\tpublicKey:    \"F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9\",\n\t\tauxRand:      \"0000000000000000000000000000000000000000000000000000000000000000\",\n\t\tmessage:      \"0000000000000000000000000000000000000000000000000000000000000000\",\n\t\tsignature:    \"04E7F9037658A92AFEB4F25BAE5339E3DDCA81A353493827D26F16D92308E49E2A25E92208678A2DF86970DA91B03A8AF8815A8A60498B358DAF560B347AA557\",\n\t\tverifyResult: true,\n\t\tvalidPubKey:  true,\n\t\trfc6979:      true,\n\t},\n\t{\n\t\tsecretKey:    \"0000000000000000000000000000000000000000000000000000000000000003\",\n\t\tpublicKey:    \"F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9\",\n\t\tauxRand:      \"0000000000000000000000000000000000000000000000000000000000000000\",\n\t\tmessage:      \"0000000000000000000000000000000000000000000000000000000000000000\",\n\t\tsignature:    \"E907831F80848D1069A5371B402410364BDF1C5F8307B0084C55F1CE2DCA821525F66A4A85EA8B71E482A74F382D2CE5EBEEE8FDB2172F477DF4900D310536C0\",\n\t\tverifyResult: true,\n\t\tvalidPubKey:  true,\n\t},\n\t{\n\t\tsecretKey:    \"B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA56A784D9045190CFEF\",\n\t\tpublicKey:    \"DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659\",\n\t\tauxRand:      \"0000000000000000000000000000000000000000000000000000000000000001\",\n\t\tmessage:      \"243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89\",\n\t\tsignature:    \"6896BD60EEAE296DB48A229FF71DFE071BDE413E6D43F917DC8DCF8C78DE33418906D11AC976ABCCB20B091292BFF4EA897EFCB639EA871CFA95F6DE339E4B0A\",\n\t\tverifyResult: true,\n\t\tvalidPubKey:  true,\n\t},\n\t{\n\t\tsecretKey:    \"C90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B14E5C9\",\n\t\tpublicKey:    \"DD308AFEC5777E13121FA72B9CC1B7CC0139715309B086C960E18FD969774EB8\",\n\t\tauxRand:      \"C87AA53824B4D7AE2EB035A2B5BBBCCC080E76CDC6D1692C4B0B62D798E6D906\",\n\t\tmessage:      \"7E2D58D8B3BCDF1ABADEC7829054F90DDA9805AAB56C77333024B9D0A508B75C\",\n\t\tsignature:    \"5831AAEED7B44BB74E5EAB94BA9D4294C49BCF2A60728D8B4C200F50DD313C1BAB745879A5AD954A72C45A91C3A51D3C7ADEA98D82F8481E0E1E03674A6F3FB7\",\n\t\tverifyResult: true,\n\t\tvalidPubKey:  true,\n\t},\n\t{\n\t\tsecretKey:    \"0B432B2677937381AEF05BB02A66ECD012773062CF3FA2549E44F58ED2401710\",\n\t\tpublicKey:    \"25D1DFF95105F5253C4022F628A996AD3A0D95FBF21D468A1B33F8C160D8F517\",\n\t\tauxRand:      \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\",\n\t\tmessage:      \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\",\n\t\tsignature:    \"7EB0509757E246F19449885651611CB965ECC1A187DD51B64FDA1EDC9637D5EC97582B9CB13DB3933705B32BA982AF5AF25FD78881EBB32771FC5922EFC66EA3\",\n\t\tverifyResult: true,\n\t\tvalidPubKey:  true,\n\t},\n\t{\n\t\tpublicKey:    \"D69C3509BB99E412E68B0FE8544E72837DFA30746D8BE2AA65975F29D22DC7B9\",\n\t\tmessage:      \"4DF3C3F68FCC83B27E9D42C90431A72499F17875C81A599B566C9889B9696703\",\n\t\tsignature:    \"00000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C6376AFB1548AF603B3EB45C9F8207DEE1060CB71C04E80F593060B07D28308D7F4\",\n\t\tverifyResult: true,\n\t\tvalidPubKey:  true,\n\t},\n\t{\n\t\tpublicKey:    \"EEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34\",\n\t\tmessage:      \"243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89\",\n\t\tsignature:    \"6CFF5C3BA86C69EA4B7376F31A9BCB4F74C1976089B2D9963DA2E5543E17776969E89B4C5564D00349106B8497785DD7D1D713A8AE82B32FA79D5F7FC407D39B\",\n\t\tverifyResult: false,\n\t\tvalidPubKey:  false,\n\t\texpectErr:    secp_ecdsa.ErrPubKeyNotOnCurve,\n\t},\n\t{\n\t\tpublicKey:    \"DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659\",\n\t\tmessage:      \"243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89\",\n\t\tsignature:    \"FFF97BD5755EEEA420453A14355235D382F6472F8568A18B2F057A14602975563CC27944640AC607CD107AE10923D9EF7A73C643E166BE5EBEAFA34B1AC553E2\",\n\t\tverifyResult: false,\n\t\tvalidPubKey:  true,\n\t\texpectErr:    ecdsa_schnorr.ErrSigRYIsOdd,\n\t},\n\t{\n\t\tpublicKey:    \"DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659\",\n\t\tmessage:      \"243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89\",\n\t\tsignature:    \"1FA62E331EDBC21C394792D2AB1100A7B432B013DF3F6FF4F99FCB33E0E1515F28890B3EDB6E7189B630448B515CE4F8622A954CFE545735AAEA5134FCCDB2BD\",\n\t\tverifyResult: false,\n\t\tvalidPubKey:  true,\n\t\texpectErr:    ecdsa_schnorr.ErrSigRYIsOdd,\n\t},\n\t{\n\t\tpublicKey:    \"DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659\",\n\t\tmessage:      \"243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89\",\n\t\tsignature:    \"6CFF5C3BA86C69EA4B7376F31A9BCB4F74C1976089B2D9963DA2E5543E177769961764B3AA9B2FFCB6EF947B6887A226E8D7C93E00C5ED0C1834FF0D0C2E6DA6\",\n\t\tverifyResult: false,\n\t\tvalidPubKey:  true,\n\t\texpectErr:    ecdsa_schnorr.ErrUnequalRValues,\n\t},\n\t{\n\t\tpublicKey:    \"DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659\",\n\t\tmessage:      \"243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89\",\n\t\tsignature:    \"0000000000000000000000000000000000000000000000000000000000000000123DDA8328AF9C23A94C1FEECFD123BA4FB73476F0D594DCB65C6425BD186051\",\n\t\tverifyResult: false,\n\t\tvalidPubKey:  true,\n\t\texpectErr:    ecdsa_schnorr.ErrSigRNotOnCurve,\n\t},\n\t{\n\t\tpublicKey:    \"DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659\",\n\t\tmessage:      \"243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89\",\n\t\tsignature:    \"00000000000000000000000000000000000000000000000000000000000000017615FBAF5AE28864013C099742DEADB4DBA87F11AC6754F93780D5A1837CF197\",\n\t\tverifyResult: false,\n\t\tvalidPubKey:  true,\n\t\texpectErr:    ecdsa_schnorr.ErrSigRNotOnCurve,\n\t},\n\t{\n\t\tpublicKey:    \"DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659\",\n\t\tmessage:      \"243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89\",\n\t\tsignature:    \"4A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1D69E89B4C5564D00349106B8497785DD7D1D713A8AE82B32FA79D5F7FC407D39B\",\n\t\tverifyResult: false,\n\t\tvalidPubKey:  true,\n\t\texpectErr:    ecdsa_schnorr.ErrUnequalRValues,\n\t},\n\t{\n\t\tpublicKey:    \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC30\",\n\t\tmessage:      \"243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89\",\n\t\tsignature:    \"6CFF5C3BA86C69EA4B7376F31A9BCB4F74C1976089B2D9963DA2E5543E17776969E89B4C5564D00349106B8497785DD7D1D713A8AE82B32FA79D5F7FC407D39B\",\n\t\tverifyResult: false,\n\t\tvalidPubKey:  false,\n\t\texpectErr:    secp_ecdsa.ErrPubKeyXTooBig,\n\t},\n}\n\n// decodeHex decodes the passed hex string and returns the resulting bytes.  It\n// panics if an error occurs.  This is only used in the tests as a helper since\n// the only way it can fail is if there is an error in the test source code.\nfunc decodeHex(hexStr string) []byte {\n\tb, err := hex.DecodeString(hexStr)\n\tif err != nil {\n\t\tpanic(\"invalid hex string in test source: err \" + err.Error() +\n\t\t\t\", hex: \" + hexStr)\n\t}\n\n\treturn b\n}\n\nfunc TestSchnorrSign(t *testing.T) {\n\tt.Parallel()\n\n\tfor i, test := range bip340TestVectors {\n\t\tif len(test.secretKey) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\td := decodeHex(test.secretKey)\n\t\tprivKey, _ := btcec.PrivKeyFromBytes(d)\n\n\t\tvar auxBytes [32]byte\n\t\taux := decodeHex(test.auxRand)\n\t\tcopy(auxBytes[:], aux)\n\n\t\tmsg := decodeHex(test.message)\n\n\t\tvar signOpts []SignOption\n\t\tif !test.rfc6979 {\n\t\t\tsignOpts = []SignOption{CustomNonce(auxBytes)}\n\t\t}\n\n\t\tsig, err := Sign(privKey, msg, signOpts...)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"test #%v: sig generation failed: %v\", i, err)\n\t\t}\n\n\t\tif strings.ToUpper(hex.EncodeToString(sig.Serialize())) != test.signature {\n\t\t\tt.Fatalf(\"test #%v: got signature %x : \"+\n\t\t\t\t\"want %s\", i, sig.Serialize(), test.signature)\n\t\t}\n\n\t\tpubKeyBytes := decodeHex(test.publicKey)\n\t\terr = schnorrVerify(sig, msg, pubKeyBytes)\n\t\tif err != nil {\n\t\t\tt.Fail()\n\t\t}\n\n\t\tverify := err == nil\n\t\tif test.verifyResult != verify {\n\t\t\tt.Fatalf(\"test #%v: verification mismatch: \"+\n\t\t\t\t\"expected %v, got %v\", i, test.verifyResult, verify)\n\t\t}\n\t}\n}\n\nfunc TestSchnorrVerify(t *testing.T) {\n\tt.Parallel()\n\n\tfor i, test := range bip340TestVectors {\n\n\t\tpubKeyBytes := decodeHex(test.publicKey)\n\n\t\t_, err := ParsePubKey(pubKeyBytes)\n\t\tswitch {\n\t\tcase !test.validPubKey && err != nil:\n\t\t\tif !errors.Is(err, test.expectErr) {\n\t\t\t\tt.Fatalf(\"test #%v: pubkey validation should \"+\n\t\t\t\t\t\"have failed, expected %v, got %v\", i,\n\t\t\t\t\ttest.expectErr, err)\n\t\t\t}\n\n\t\t\tcontinue\n\n\t\tcase err != nil:\n\t\t\tt.Fatalf(\"test #%v: unable to parse pubkey: %v\", i, err)\n\t\t}\n\n\t\tmsg := decodeHex(test.message)\n\n\t\tsig, err := ParseSignature(decodeHex(test.signature))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to parse sig: %v\", err)\n\t\t}\n\n\t\terr = schnorrVerify(sig, msg, pubKeyBytes)\n\t\tif err != nil && test.verifyResult {\n\t\t\tt.Fatalf(\"test #%v: verification shouldn't have failed: %v\", i, err)\n\t\t}\n\n\t\tverify := err == nil\n\t\tif test.verifyResult != verify {\n\t\t\tt.Fatalf(\"test #%v: verification mismatch: expected \"+\n\t\t\t\t\"%v, got %v\", i, test.verifyResult, verify)\n\t\t}\n\n\t\tif !test.verifyResult && test.expectErr != nil {\n\t\t\tif !errors.Is(err, test.expectErr) {\n\t\t\t\tt.Fatalf(\"test #%v: expect error %v : got %v\", i, test.expectErr, err)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestSchnorrSignNoMutate tests that generating a schnorr signature doesn't\n// modify/mutate the underlying private key.\nfunc TestSchnorrSignNoMutate(t *testing.T) {\n\tt.Parallel()\n\n\t// Assert that given a random private key and message, we can generate\n\t// a signature from that w/o modifying the underlying private key.\n\tf := func(privBytes, msg [32]byte) bool {\n\t\tprivBytesCopy := privBytes\n\t\tprivKey, _ := btcec.PrivKeyFromBytes(privBytesCopy[:])\n\n\t\t// Generate a signature for private key with our message.\n\t\t_, err := Sign(privKey, msg[:])\n\t\tif err != nil {\n\t\t\tt.Logf(\"unable to gen sig: %v\", err)\n\t\t\treturn false\n\t\t}\n\n\t\t// We should be able to re-derive the private key from raw\n\t\t// bytes and have that match up again.\n\t\tprivKeyCopy, _ := btcec.PrivKeyFromBytes(privBytes[:])\n\t\tif *privKey != *privKeyCopy {\n\t\t\tt.Logf(\"private doesn't match: expected %v, got %v\",\n\t\t\t\tspew.Sdump(privKeyCopy), spew.Sdump(privKey))\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}\n\n\tif err := quick.Check(f, nil); err != nil {\n\t\tt.Fatalf(\"private key modified: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "btcjson/CONTRIBUTORS",
    "content": "# This is the list of people who have contributed code to the repository.\n#\n# Names should be added to this file only after verifying that the individual\n# or the individual's organization has agreed to the LICENSE.\n#\n# Names should be added to this file like so:\n# Name <email address>\n\nJohn C. Vernaleo <jcv@conformal.com>\nDave Collins <davec@conformal.com>\nOwain G. Ainsworth <oga@conformal.com>\nDavid Hill <dhill@conformal.com>\nJosh Rickmar <jrick@conformal.com>\nAndreas Metsälä <andreas.metsala@gmail.com>\nFrancis Lam <flam@alum.mit.edu>\nGeert-Johan Riemer <geertjohan.riemer@gmail.com>\n"
  },
  {
    "path": "btcjson/README.md",
    "content": "btcjson\n=======\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/btcjson)\n\nPackage btcjson implements concrete types for marshalling to and from the\nbitcoin JSON-RPC API.  A comprehensive suite of tests is provided to ensure\nproper functionality.\n\nAlthough this package was primarily written for the btcsuite, it has\nintentionally been designed so it can be used as a standalone package for any\nprojects needing to marshal to and from bitcoin JSON-RPC requests and responses.\n\nNote that although it's possible to use this package directly to implement an\nRPC client, it is not recommended since it is only intended as an infrastructure\npackage.  Instead, RPC clients should use the\n[btcrpcclient](https://github.com/btcsuite/btcrpcclient) package which provides\na full blown RPC client with many features such as automatic connection\nmanagement, websocket support, automatic notification re-registration on\nreconnect, and conversion from the raw underlying RPC types (strings, floats,\nints, etc) to higher-level types with many nice and useful properties.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/btcjson\n```\n\n## Examples\n\n* [Marshal Command](https://pkg.go.dev/github.com/btcsuite/btcd/btcjson#example-MarshalCmd)  \n  Demonstrates how to create and marshal a command into a JSON-RPC request.\n\n* [Unmarshal Command](https://pkg.go.dev/github.com/btcsuite/btcd/btcjson#example-UnmarshalCmd)  \n  Demonstrates how to unmarshal a JSON-RPC request and then unmarshal the\n  concrete request into a concrete command.\n\n* [Marshal Response](https://pkg.go.dev/github.com/btcsuite/btcd/btcjson#example-MarshalResponse)  \n  Demonstrates how to marshal a JSON-RPC response.\n\n* [Unmarshal Response](https://pkg.go.dev/github.com/btcsuite/btcd/btcjson#example-package--UnmarshalResponse)  \n  Demonstrates how to unmarshal a JSON-RPC response and then unmarshal the\n  result field in the response to a concrete type.\n\n## GPG Verification Key\n\nAll official release tags are signed by Conformal so users can ensure the code\nhas not been tampered with and is coming from the btcsuite developers.  To\nverify the signature perform the following:\n\n- Download the public key from the Conformal website at\n  https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt\n\n- Import the public key into your GPG keyring:\n  ```bash\n  gpg --import GIT-GPG-KEY-conformal.txt\n  ```\n\n- Verify the release tag with the following command where `TAG_NAME` is a\n  placeholder for the specific tag:\n  ```bash\n  git tag -v TAG_NAME\n  ```\n\n## License\n\nPackage btcjson is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "btcjson/btcdextcmds.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Copyright (c) 2015-2016 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// NOTE: This file is intended to house the RPC commands that are supported by\n// a chain server with btcd extensions.\n\npackage btcjson\n\n// NodeSubCmd defines the type used in the addnode JSON-RPC command for the\n// sub command field.\ntype NodeSubCmd string\n\nconst (\n\t// NConnect indicates the specified host that should be connected to.\n\tNConnect NodeSubCmd = \"connect\"\n\n\t// NRemove indicates the specified peer that should be removed as a\n\t// persistent peer.\n\tNRemove NodeSubCmd = \"remove\"\n\n\t// NDisconnect indicates the specified peer should be disconnected.\n\tNDisconnect NodeSubCmd = \"disconnect\"\n)\n\n// NodeCmd defines the dropnode JSON-RPC command.\ntype NodeCmd struct {\n\tSubCmd        NodeSubCmd `jsonrpcusage:\"\\\"connect|remove|disconnect\\\"\"`\n\tTarget        string\n\tConnectSubCmd *string `jsonrpcusage:\"\\\"perm|temp\\\"\"`\n}\n\n// NewNodeCmd returns a new instance which can be used to issue a `node`\n// JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewNodeCmd(subCmd NodeSubCmd, target string, connectSubCmd *string) *NodeCmd {\n\treturn &NodeCmd{\n\t\tSubCmd:        subCmd,\n\t\tTarget:        target,\n\t\tConnectSubCmd: connectSubCmd,\n\t}\n}\n\n// DebugLevelCmd defines the debuglevel JSON-RPC command.  This command is not a\n// standard Bitcoin command.  It is an extension for btcd.\ntype DebugLevelCmd struct {\n\tLevelSpec string\n}\n\n// NewDebugLevelCmd returns a new DebugLevelCmd which can be used to issue a\n// debuglevel JSON-RPC command.  This command is not a standard Bitcoin command.\n// It is an extension for btcd.\nfunc NewDebugLevelCmd(levelSpec string) *DebugLevelCmd {\n\treturn &DebugLevelCmd{\n\t\tLevelSpec: levelSpec,\n\t}\n}\n\n// GenerateToAddressCmd defines the generatetoaddress JSON-RPC command.\ntype GenerateToAddressCmd struct {\n\tNumBlocks int64\n\tAddress   string\n\tMaxTries  *int64 `jsonrpcdefault:\"1000000\"`\n}\n\n// NewGenerateToAddressCmd returns a new instance which can be used to issue a\n// generatetoaddress JSON-RPC command.\nfunc NewGenerateToAddressCmd(numBlocks int64, address string, maxTries *int64) *GenerateToAddressCmd {\n\treturn &GenerateToAddressCmd{\n\t\tNumBlocks: numBlocks,\n\t\tAddress:   address,\n\t\tMaxTries:  maxTries,\n\t}\n}\n\n// GenerateCmd defines the generate JSON-RPC command.\ntype GenerateCmd struct {\n\tNumBlocks uint32\n}\n\n// NewGenerateCmd returns a new instance which can be used to issue a generate\n// JSON-RPC command.\nfunc NewGenerateCmd(numBlocks uint32) *GenerateCmd {\n\treturn &GenerateCmd{\n\t\tNumBlocks: numBlocks,\n\t}\n}\n\n// GetBestBlockCmd defines the getbestblock JSON-RPC command.\ntype GetBestBlockCmd struct{}\n\n// NewGetBestBlockCmd returns a new instance which can be used to issue a\n// getbestblock JSON-RPC command.\nfunc NewGetBestBlockCmd() *GetBestBlockCmd {\n\treturn &GetBestBlockCmd{}\n}\n\n// GetCurrentNetCmd defines the getcurrentnet JSON-RPC command.\ntype GetCurrentNetCmd struct{}\n\n// NewGetCurrentNetCmd returns a new instance which can be used to issue a\n// getcurrentnet JSON-RPC command.\nfunc NewGetCurrentNetCmd() *GetCurrentNetCmd {\n\treturn &GetCurrentNetCmd{}\n}\n\n// GetHeadersCmd defines the getheaders JSON-RPC command.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrd/dcrjson.\ntype GetHeadersCmd struct {\n\tBlockLocators []string `json:\"blocklocators\"`\n\tHashStop      string   `json:\"hashstop\"`\n}\n\n// NewGetHeadersCmd returns a new instance which can be used to issue a\n// getheaders JSON-RPC command.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrd/dcrjson.\nfunc NewGetHeadersCmd(blockLocators []string, hashStop string) *GetHeadersCmd {\n\treturn &GetHeadersCmd{\n\t\tBlockLocators: blockLocators,\n\t\tHashStop:      hashStop,\n\t}\n}\n\n// VersionCmd defines the version JSON-RPC command.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrd/dcrjson.\ntype VersionCmd struct{}\n\n// NewVersionCmd returns a new instance which can be used to issue a JSON-RPC\n// version command.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrd/dcrjson.\nfunc NewVersionCmd() *VersionCmd { return new(VersionCmd) }\n\nfunc init() {\n\t// No special flags for commands in this file.\n\tflags := UsageFlag(0)\n\n\tMustRegisterCmd(\"debuglevel\", (*DebugLevelCmd)(nil), flags)\n\tMustRegisterCmd(\"node\", (*NodeCmd)(nil), flags)\n\tMustRegisterCmd(\"generate\", (*GenerateCmd)(nil), flags)\n\tMustRegisterCmd(\"generatetoaddress\", (*GenerateToAddressCmd)(nil), flags)\n\tMustRegisterCmd(\"getbestblock\", (*GetBestBlockCmd)(nil), flags)\n\tMustRegisterCmd(\"getcurrentnet\", (*GetCurrentNetCmd)(nil), flags)\n\tMustRegisterCmd(\"getheaders\", (*GetHeadersCmd)(nil), flags)\n\tMustRegisterCmd(\"version\", (*VersionCmd)(nil), flags)\n}\n"
  },
  {
    "path": "btcjson/btcdextcmds_test.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Copyright (c) 2015-2016 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestBtcdExtCmds tests all of the btcd extended commands marshal and unmarshal\n// into valid results include handling of optional fields being omitted in the\n// marshalled command, while optional fields with defaults have the default\n// assigned on unmarshalled commands.\nfunc TestBtcdExtCmds(t *testing.T) {\n\tt.Parallel()\n\n\ttestID := int(1)\n\ttests := []struct {\n\t\tname         string\n\t\tnewCmd       func() (interface{}, error)\n\t\tstaticCmd    func() interface{}\n\t\tmarshalled   string\n\t\tunmarshalled interface{}\n\t}{\n\t\t{\n\t\t\tname: \"debuglevel\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"debuglevel\", \"trace\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewDebugLevelCmd(\"trace\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"debuglevel\",\"params\":[\"trace\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.DebugLevelCmd{\n\t\t\t\tLevelSpec: \"trace\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"node\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"node\", btcjson.NRemove, \"1.1.1.1\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewNodeCmd(\"remove\", \"1.1.1.1\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"node\",\"params\":[\"remove\",\"1.1.1.1\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.NodeCmd{\n\t\t\t\tSubCmd: btcjson.NRemove,\n\t\t\t\tTarget: \"1.1.1.1\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"node\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"node\", btcjson.NDisconnect, \"1.1.1.1\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewNodeCmd(\"disconnect\", \"1.1.1.1\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"node\",\"params\":[\"disconnect\",\"1.1.1.1\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.NodeCmd{\n\t\t\t\tSubCmd: btcjson.NDisconnect,\n\t\t\t\tTarget: \"1.1.1.1\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"node\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"node\", btcjson.NConnect, \"1.1.1.1\", \"perm\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewNodeCmd(\"connect\", \"1.1.1.1\", btcjson.String(\"perm\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"node\",\"params\":[\"connect\",\"1.1.1.1\",\"perm\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.NodeCmd{\n\t\t\t\tSubCmd:        btcjson.NConnect,\n\t\t\t\tTarget:        \"1.1.1.1\",\n\t\t\t\tConnectSubCmd: btcjson.String(\"perm\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"node\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"node\", btcjson.NConnect, \"1.1.1.1\", \"temp\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewNodeCmd(\"connect\", \"1.1.1.1\", btcjson.String(\"temp\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"node\",\"params\":[\"connect\",\"1.1.1.1\",\"temp\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.NodeCmd{\n\t\t\t\tSubCmd:        btcjson.NConnect,\n\t\t\t\tTarget:        \"1.1.1.1\",\n\t\t\t\tConnectSubCmd: btcjson.String(\"temp\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"generate\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"generate\", 1)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGenerateCmd(1)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"generate\",\"params\":[1],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GenerateCmd{\n\t\t\t\tNumBlocks: 1,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"generatetoaddress\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"generatetoaddress\", 1, \"1Address\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGenerateToAddressCmd(1, \"1Address\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"generatetoaddress\",\"params\":[1,\"1Address\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GenerateToAddressCmd{\n\t\t\t\tNumBlocks: 1,\n\t\t\t\tAddress:   \"1Address\",\n\t\t\t\tMaxTries: func() *int64 {\n\t\t\t\t\tvar i int64 = 1000000\n\t\t\t\t\treturn &i\n\t\t\t\t}(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getbestblock\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getbestblock\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBestBlockCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getbestblock\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBestBlockCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getcurrentnet\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getcurrentnet\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetCurrentNetCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getcurrentnet\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetCurrentNetCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getheaders\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getheaders\", []string{}, \"\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetHeadersCmd(\n\t\t\t\t\t[]string{},\n\t\t\t\t\t\"\",\n\t\t\t\t)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getheaders\",\"params\":[[],\"\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetHeadersCmd{\n\t\t\t\tBlockLocators: []string{},\n\t\t\t\tHashStop:      \"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getheaders - with arguments\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getheaders\", []string{\"000000000000000001f1739002418e2f9a84c47a4fd2a0eb7a787a6b7dc12f16\", \"0000000000000000026f4b7f56eef057b32167eb5ad9ff62006f1807b7336d10\"}, \"000000000000000000ba33b33e1fad70b69e234fc24414dd47113bff38f523f7\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetHeadersCmd(\n\t\t\t\t\t[]string{\n\t\t\t\t\t\t\"000000000000000001f1739002418e2f9a84c47a4fd2a0eb7a787a6b7dc12f16\",\n\t\t\t\t\t\t\"0000000000000000026f4b7f56eef057b32167eb5ad9ff62006f1807b7336d10\",\n\t\t\t\t\t},\n\t\t\t\t\t\"000000000000000000ba33b33e1fad70b69e234fc24414dd47113bff38f523f7\",\n\t\t\t\t)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getheaders\",\"params\":[[\"000000000000000001f1739002418e2f9a84c47a4fd2a0eb7a787a6b7dc12f16\",\"0000000000000000026f4b7f56eef057b32167eb5ad9ff62006f1807b7336d10\"],\"000000000000000000ba33b33e1fad70b69e234fc24414dd47113bff38f523f7\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetHeadersCmd{\n\t\t\t\tBlockLocators: []string{\n\t\t\t\t\t\"000000000000000001f1739002418e2f9a84c47a4fd2a0eb7a787a6b7dc12f16\",\n\t\t\t\t\t\"0000000000000000026f4b7f56eef057b32167eb5ad9ff62006f1807b7336d10\",\n\t\t\t\t},\n\t\t\t\tHashStop: \"000000000000000000ba33b33e1fad70b69e234fc24414dd47113bff38f523f7\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"version\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"version\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewVersionCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"version\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.VersionCmd{},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Marshal the command as created by the new static command\n\t\t// creation function.\n\t\tmarshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd())\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the command is created without error via the generic\n\t\t// new command creation function.\n\t\tcmd, err := test.newCmd()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected NewCmd error: %v \",\n\t\t\t\ti, test.name, err)\n\t\t}\n\n\t\t// Marshal the command as created by the generic new command\n\t\t// creation function.\n\t\tmarshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar request btcjson.Request\n\t\tif err := json.Unmarshal(marshalled, &request); err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error while \"+\n\t\t\t\t\"unmarshalling JSON-RPC request: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tcmd, err = btcjson.UnmarshalCmd(&request)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"UnmarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(cmd, test.unmarshalled) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected unmarshalled command \"+\n\t\t\t\t\"- got %s, want %s\", i, test.name,\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\", cmd),\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\\n\", test.unmarshalled))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/btcdextresults.go",
    "content": "// Copyright (c) 2016-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\n// VersionResult models objects included in the version response.  In the actual\n// result, these objects are keyed by the program or API name.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrd/dcrjson.\ntype VersionResult struct {\n\tVersionString string `json:\"versionstring\"`\n\tMajor         uint32 `json:\"major\"`\n\tMinor         uint32 `json:\"minor\"`\n\tPatch         uint32 `json:\"patch\"`\n\tPrerelease    string `json:\"prerelease\"`\n\tBuildMetadata string `json:\"buildmetadata\"`\n}\n"
  },
  {
    "path": "btcjson/btcdextresults_test.go",
    "content": "// Copyright (c) 2016-2017 The btcsuite developers\n// Copyright (c) 2015-2016 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestBtcdExtCustomResults ensures any results that have custom marshalling\n// work as intended.\n// and unmarshal code of results are as expected.\nfunc TestBtcdExtCustomResults(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tresult   interface{}\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname: \"versionresult\",\n\t\t\tresult: &btcjson.VersionResult{\n\t\t\t\tVersionString: \"1.0.0\",\n\t\t\t\tMajor:         1,\n\t\t\t\tMinor:         0,\n\t\t\t\tPatch:         0,\n\t\t\t\tPrerelease:    \"pr\",\n\t\t\t\tBuildMetadata: \"bm\",\n\t\t\t},\n\t\t\texpected: `{\"versionstring\":\"1.0.0\",\"major\":1,\"minor\":0,\"patch\":0,\"prerelease\":\"pr\",\"buildmetadata\":\"bm\"}`,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tmarshalled, err := json.Marshal(test.result)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif string(marshalled) != test.expected {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marhsalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/btcwalletextcmds.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// NOTE: This file is intended to house the RPC commands that are supported by\n// a wallet server with btcwallet extensions.\n\npackage btcjson\n\n// CreateNewAccountCmd defines the createnewaccount JSON-RPC command.\ntype CreateNewAccountCmd struct {\n\tAccount string\n}\n\n// NewCreateNewAccountCmd returns a new instance which can be used to issue a\n// createnewaccount JSON-RPC command.\nfunc NewCreateNewAccountCmd(account string) *CreateNewAccountCmd {\n\treturn &CreateNewAccountCmd{\n\t\tAccount: account,\n\t}\n}\n\n// DumpWalletCmd defines the dumpwallet JSON-RPC command.\ntype DumpWalletCmd struct {\n\tFilename string\n}\n\n// NewDumpWalletCmd returns a new instance which can be used to issue a\n// dumpwallet JSON-RPC command.\nfunc NewDumpWalletCmd(filename string) *DumpWalletCmd {\n\treturn &DumpWalletCmd{\n\t\tFilename: filename,\n\t}\n}\n\n// ImportAddressCmd defines the importaddress JSON-RPC command.\ntype ImportAddressCmd struct {\n\tAddress string\n\tAccount string\n\tRescan  *bool `jsonrpcdefault:\"true\"`\n}\n\n// NewImportAddressCmd returns a new instance which can be used to issue an\n// importaddress JSON-RPC command.\nfunc NewImportAddressCmd(address string, account string, rescan *bool) *ImportAddressCmd {\n\treturn &ImportAddressCmd{\n\t\tAddress: address,\n\t\tAccount: account,\n\t\tRescan:  rescan,\n\t}\n}\n\n// ImportPubKeyCmd defines the importpubkey JSON-RPC command.\ntype ImportPubKeyCmd struct {\n\tPubKey string\n\tRescan *bool `jsonrpcdefault:\"true\"`\n}\n\n// NewImportPubKeyCmd returns a new instance which can be used to issue an\n// importpubkey JSON-RPC command.\nfunc NewImportPubKeyCmd(pubKey string, rescan *bool) *ImportPubKeyCmd {\n\treturn &ImportPubKeyCmd{\n\t\tPubKey: pubKey,\n\t\tRescan: rescan,\n\t}\n}\n\n// ImportWalletCmd defines the importwallet JSON-RPC command.\ntype ImportWalletCmd struct {\n\tFilename string\n}\n\n// NewImportWalletCmd returns a new instance which can be used to issue a\n// importwallet JSON-RPC command.\nfunc NewImportWalletCmd(filename string) *ImportWalletCmd {\n\treturn &ImportWalletCmd{\n\t\tFilename: filename,\n\t}\n}\n\n// RenameAccountCmd defines the renameaccount JSON-RPC command.\ntype RenameAccountCmd struct {\n\tOldAccount string\n\tNewAccount string\n}\n\n// NewRenameAccountCmd returns a new instance which can be used to issue a\n// renameaccount JSON-RPC command.\nfunc NewRenameAccountCmd(oldAccount, newAccount string) *RenameAccountCmd {\n\treturn &RenameAccountCmd{\n\t\tOldAccount: oldAccount,\n\t\tNewAccount: newAccount,\n\t}\n}\n\nfunc init() {\n\t// The commands in this file are only usable with a wallet server.\n\tflags := UFWalletOnly\n\n\tMustRegisterCmd(\"createnewaccount\", (*CreateNewAccountCmd)(nil), flags)\n\tMustRegisterCmd(\"dumpwallet\", (*DumpWalletCmd)(nil), flags)\n\tMustRegisterCmd(\"importaddress\", (*ImportAddressCmd)(nil), flags)\n\tMustRegisterCmd(\"importpubkey\", (*ImportPubKeyCmd)(nil), flags)\n\tMustRegisterCmd(\"importwallet\", (*ImportWalletCmd)(nil), flags)\n\tMustRegisterCmd(\"renameaccount\", (*RenameAccountCmd)(nil), flags)\n}\n"
  },
  {
    "path": "btcjson/btcwalletextcmds_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestBtcWalletExtCmds tests all of the btcwallet extended commands marshal and\n// unmarshal into valid results include handling of optional fields being\n// omitted in the marshalled command, while optional fields with defaults have\n// the default assigned on unmarshalled commands.\nfunc TestBtcWalletExtCmds(t *testing.T) {\n\tt.Parallel()\n\n\ttestID := int(1)\n\ttests := []struct {\n\t\tname         string\n\t\tnewCmd       func() (interface{}, error)\n\t\tstaticCmd    func() interface{}\n\t\tmarshalled   string\n\t\tunmarshalled interface{}\n\t}{\n\t\t{\n\t\t\tname: \"createnewaccount\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"createnewaccount\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewCreateNewAccountCmd(\"acct\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"createnewaccount\",\"params\":[\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.CreateNewAccountCmd{\n\t\t\t\tAccount: \"acct\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"dumpwallet\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"dumpwallet\", \"filename\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewDumpWalletCmd(\"filename\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"dumpwallet\",\"params\":[\"filename\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.DumpWalletCmd{\n\t\t\t\tFilename: \"filename\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importaddress\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"importaddress\", \"1Address\", \"\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewImportAddressCmd(\"1Address\", \"\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importaddress\",\"params\":[\"1Address\",\"\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportAddressCmd{\n\t\t\t\tAddress: \"1Address\",\n\t\t\t\tRescan:  btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importaddress optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"importaddress\", \"1Address\", \"acct\", false)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewImportAddressCmd(\"1Address\", \"acct\", btcjson.Bool(false))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importaddress\",\"params\":[\"1Address\",\"acct\",false],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportAddressCmd{\n\t\t\t\tAddress: \"1Address\",\n\t\t\t\tAccount: \"acct\",\n\t\t\t\tRescan:  btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importpubkey\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"importpubkey\", \"031234\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewImportPubKeyCmd(\"031234\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importpubkey\",\"params\":[\"031234\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportPubKeyCmd{\n\t\t\t\tPubKey: \"031234\",\n\t\t\t\tRescan: btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importpubkey optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"importpubkey\", \"031234\", false)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewImportPubKeyCmd(\"031234\", btcjson.Bool(false))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importpubkey\",\"params\":[\"031234\",false],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportPubKeyCmd{\n\t\t\t\tPubKey: \"031234\",\n\t\t\t\tRescan: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importwallet\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"importwallet\", \"filename\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewImportWalletCmd(\"filename\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importwallet\",\"params\":[\"filename\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportWalletCmd{\n\t\t\t\tFilename: \"filename\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"renameaccount\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"renameaccount\", \"oldacct\", \"newacct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewRenameAccountCmd(\"oldacct\", \"newacct\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"renameaccount\",\"params\":[\"oldacct\",\"newacct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.RenameAccountCmd{\n\t\t\t\tOldAccount: \"oldacct\",\n\t\t\t\tNewAccount: \"newacct\",\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Marshal the command as created by the new static command\n\t\t// creation function.\n\t\tmarshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd())\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the command is created without error via the generic\n\t\t// new command creation function.\n\t\tcmd, err := test.newCmd()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected NewCmd error: %v \",\n\t\t\t\ti, test.name, err)\n\t\t}\n\n\t\t// Marshal the command as created by the generic new command\n\t\t// creation function.\n\t\tmarshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar request btcjson.Request\n\t\tif err := json.Unmarshal(marshalled, &request); err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error while \"+\n\t\t\t\t\"unmarshalling JSON-RPC request: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tcmd, err = btcjson.UnmarshalCmd(&request)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"UnmarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(cmd, test.unmarshalled) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected unmarshalled command \"+\n\t\t\t\t\"- got %s, want %s\", i, test.name,\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\", cmd),\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\\n\", test.unmarshalled))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/chainsvrcmds.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// NOTE: This file is intended to house the RPC commands that are supported by\n// a chain server.\n\npackage btcjson\n\nimport (\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// BTCPerkvB is the units used to represent Bitcoin transaction fees.\n// This unit represents the fee in BTC for a transaction size of 1 kB.\ntype BTCPerkvB = float64\n\n// AddNodeSubCmd defines the type used in the addnode JSON-RPC command for the\n// sub command field.\ntype AddNodeSubCmd string\n\nconst (\n\t// ANAdd indicates the specified host should be added as a persistent\n\t// peer.\n\tANAdd AddNodeSubCmd = \"add\"\n\n\t// ANRemove indicates the specified peer should be removed.\n\tANRemove AddNodeSubCmd = \"remove\"\n\n\t// ANOneTry indicates the specified host should try to connect once,\n\t// but it should not be made persistent.\n\tANOneTry AddNodeSubCmd = \"onetry\"\n)\n\n// AddNodeCmd defines the addnode JSON-RPC command.\ntype AddNodeCmd struct {\n\tAddr   string\n\tSubCmd AddNodeSubCmd `jsonrpcusage:\"\\\"add|remove|onetry\\\"\"`\n}\n\n// NewAddNodeCmd returns a new instance which can be used to issue an addnode\n// JSON-RPC command.\nfunc NewAddNodeCmd(addr string, subCmd AddNodeSubCmd) *AddNodeCmd {\n\treturn &AddNodeCmd{\n\t\tAddr:   addr,\n\t\tSubCmd: subCmd,\n\t}\n}\n\n// TransactionInput represents the inputs to a transaction.  Specifically a\n// transaction hash and output number pair.\ntype TransactionInput struct {\n\tTxid string `json:\"txid\"`\n\tVout uint32 `json:\"vout\"`\n}\n\n// CreateRawTransactionCmd defines the createrawtransaction JSON-RPC command.\ntype CreateRawTransactionCmd struct {\n\tInputs   []TransactionInput\n\tAmounts  map[string]float64 `jsonrpcusage:\"{\\\"address\\\":amount,...}\"` // In BTC\n\tLockTime *int64\n}\n\n// NewCreateRawTransactionCmd returns a new instance which can be used to issue\n// a createrawtransaction JSON-RPC command.\n//\n// Amounts are in BTC. Passing in nil and the empty slice as inputs is equivalent,\n// both gets interpreted as the empty slice.\nfunc NewCreateRawTransactionCmd(inputs []TransactionInput, amounts map[string]float64,\n\tlockTime *int64) *CreateRawTransactionCmd {\n\t// to make sure we're serializing this to the empty list and not null, we\n\t// explicitly initialize the list\n\tif inputs == nil {\n\t\tinputs = []TransactionInput{}\n\t}\n\treturn &CreateRawTransactionCmd{\n\t\tInputs:   inputs,\n\t\tAmounts:  amounts,\n\t\tLockTime: lockTime,\n\t}\n}\n\n// DecodeRawTransactionCmd defines the decoderawtransaction JSON-RPC command.\ntype DecodeRawTransactionCmd struct {\n\tHexTx string\n}\n\n// NewDecodeRawTransactionCmd returns a new instance which can be used to issue\n// a decoderawtransaction JSON-RPC command.\nfunc NewDecodeRawTransactionCmd(hexTx string) *DecodeRawTransactionCmd {\n\treturn &DecodeRawTransactionCmd{\n\t\tHexTx: hexTx,\n\t}\n}\n\n// DecodeScriptCmd defines the decodescript JSON-RPC command.\ntype DecodeScriptCmd struct {\n\tHexScript string\n}\n\n// NewDecodeScriptCmd returns a new instance which can be used to issue a\n// decodescript JSON-RPC command.\nfunc NewDecodeScriptCmd(hexScript string) *DecodeScriptCmd {\n\treturn &DecodeScriptCmd{\n\t\tHexScript: hexScript,\n\t}\n}\n\n// DeriveAddressesCmd defines the deriveaddresses JSON-RPC command.\ntype DeriveAddressesCmd struct {\n\tDescriptor string\n\tRange      *DescriptorRange\n}\n\n// NewDeriveAddressesCmd returns a new instance which can be used to issue a\n// deriveaddresses JSON-RPC command.\nfunc NewDeriveAddressesCmd(descriptor string, descriptorRange *DescriptorRange) *DeriveAddressesCmd {\n\treturn &DeriveAddressesCmd{\n\t\tDescriptor: descriptor,\n\t\tRange:      descriptorRange,\n\t}\n}\n\n// ChangeType defines the different output types to use for the change address\n// of a transaction built by the node.\ntype ChangeType string\n\nvar (\n\t// ChangeTypeLegacy indicates a P2PKH change address type.\n\tChangeTypeLegacy ChangeType = \"legacy\"\n\t// ChangeTypeP2SHSegWit indicates a P2WPKH-in-P2SH change address type.\n\tChangeTypeP2SHSegWit ChangeType = \"p2sh-segwit\"\n\t// ChangeTypeBech32 indicates a P2WPKH change address type.\n\tChangeTypeBech32 ChangeType = \"bech32\"\n)\n\n// FundRawTransactionOpts are the different options that can be passed to rawtransaction\ntype FundRawTransactionOpts struct {\n\tChangeAddress          *string               `json:\"changeAddress,omitempty\"`\n\tChangePosition         *int                  `json:\"changePosition,omitempty\"`\n\tChangeType             *ChangeType           `json:\"change_type,omitempty\"`\n\tIncludeWatching        *bool                 `json:\"includeWatching,omitempty\"`\n\tLockUnspents           *bool                 `json:\"lockUnspents,omitempty\"`\n\tFeeRate                *BTCPerkvB            `json:\"feeRate,omitempty\"` // BTC/kB\n\tSubtractFeeFromOutputs []int                 `json:\"subtractFeeFromOutputs,omitempty\"`\n\tReplaceable            *bool                 `json:\"replaceable,omitempty\"`\n\tConfTarget             *int                  `json:\"conf_target,omitempty\"`\n\tEstimateMode           *EstimateSmartFeeMode `json:\"estimate_mode,omitempty\"`\n\tIncludeUnsafe          *bool                 `json:\"include_unsafe,omitempty\"`\n}\n\n// FundRawTransactionCmd defines the fundrawtransaction JSON-RPC command\ntype FundRawTransactionCmd struct {\n\tHexTx     string\n\tOptions   FundRawTransactionOpts\n\tIsWitness *bool\n}\n\n// NewFundRawTransactionCmd returns a new instance which can be used to issue\n// a fundrawtransaction JSON-RPC command\nfunc NewFundRawTransactionCmd(serializedTx []byte, opts FundRawTransactionOpts, isWitness *bool) *FundRawTransactionCmd {\n\treturn &FundRawTransactionCmd{\n\t\tHexTx:     hex.EncodeToString(serializedTx),\n\t\tOptions:   opts,\n\t\tIsWitness: isWitness,\n\t}\n}\n\n// GetAddedNodeInfoCmd defines the getaddednodeinfo JSON-RPC command.\ntype GetAddedNodeInfoCmd struct {\n\tDNS  bool\n\tNode *string\n}\n\n// NewGetAddedNodeInfoCmd returns a new instance which can be used to issue a\n// getaddednodeinfo JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetAddedNodeInfoCmd(dns bool, node *string) *GetAddedNodeInfoCmd {\n\treturn &GetAddedNodeInfoCmd{\n\t\tDNS:  dns,\n\t\tNode: node,\n\t}\n}\n\n// GetBestBlockHashCmd defines the getbestblockhash JSON-RPC command.\ntype GetBestBlockHashCmd struct{}\n\n// NewGetBestBlockHashCmd returns a new instance which can be used to issue a\n// getbestblockhash JSON-RPC command.\nfunc NewGetBestBlockHashCmd() *GetBestBlockHashCmd {\n\treturn &GetBestBlockHashCmd{}\n}\n\n// GetBlockCmd defines the getblock JSON-RPC command.\ntype GetBlockCmd struct {\n\tHash      string\n\tVerbosity *int `jsonrpcdefault:\"1\"`\n}\n\n// NewGetBlockCmd returns a new instance which can be used to issue a getblock\n// JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetBlockCmd(hash string, verbosity *int) *GetBlockCmd {\n\treturn &GetBlockCmd{\n\t\tHash:      hash,\n\t\tVerbosity: verbosity,\n\t}\n}\n\n// GetBlockChainInfoCmd defines the getblockchaininfo JSON-RPC command.\ntype GetBlockChainInfoCmd struct{}\n\n// NewGetBlockChainInfoCmd returns a new instance which can be used to issue a\n// getblockchaininfo JSON-RPC command.\nfunc NewGetBlockChainInfoCmd() *GetBlockChainInfoCmd {\n\treturn &GetBlockChainInfoCmd{}\n}\n\n// GetBlockCountCmd defines the getblockcount JSON-RPC command.\ntype GetBlockCountCmd struct{}\n\n// NewGetBlockCountCmd returns a new instance which can be used to issue a\n// getblockcount JSON-RPC command.\nfunc NewGetBlockCountCmd() *GetBlockCountCmd {\n\treturn &GetBlockCountCmd{}\n}\n\n// FilterTypeName defines the type used in the getblockfilter JSON-RPC command for the\n// filter type field.\ntype FilterTypeName string\n\nconst (\n\t// FilterTypeBasic is the basic filter type defined in BIP0158.\n\tFilterTypeBasic FilterTypeName = \"basic\"\n)\n\n// GetBlockFilterCmd defines the getblockfilter JSON-RPC command.\ntype GetBlockFilterCmd struct {\n\tBlockHash  string          // The hash of the block\n\tFilterType *FilterTypeName // The type name of the filter, default=basic\n}\n\n// NewGetBlockFilterCmd returns a new instance which can be used to issue a\n// getblockfilter JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetBlockFilterCmd(blockHash string, filterType *FilterTypeName) *GetBlockFilterCmd {\n\treturn &GetBlockFilterCmd{\n\t\tBlockHash:  blockHash,\n\t\tFilterType: filterType,\n\t}\n}\n\n// GetBlockHashCmd defines the getblockhash JSON-RPC command.\ntype GetBlockHashCmd struct {\n\tIndex int64\n}\n\n// NewGetBlockHashCmd returns a new instance which can be used to issue a\n// getblockhash JSON-RPC command.\nfunc NewGetBlockHashCmd(index int64) *GetBlockHashCmd {\n\treturn &GetBlockHashCmd{\n\t\tIndex: index,\n\t}\n}\n\n// GetBlockHeaderCmd defines the getblockheader JSON-RPC command.\ntype GetBlockHeaderCmd struct {\n\tHash    string\n\tVerbose *bool `jsonrpcdefault:\"true\"`\n}\n\n// NewGetBlockHeaderCmd returns a new instance which can be used to issue a\n// getblockheader JSON-RPC command.\nfunc NewGetBlockHeaderCmd(hash string, verbose *bool) *GetBlockHeaderCmd {\n\treturn &GetBlockHeaderCmd{\n\t\tHash:    hash,\n\t\tVerbose: verbose,\n\t}\n}\n\n// HashOrHeight defines a type that can be used as hash_or_height value in JSON-RPC commands.\ntype HashOrHeight struct {\n\tValue interface{}\n}\n\n// MarshalJSON implements the json.Marshaler interface\nfunc (h HashOrHeight) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(h.Value)\n}\n\n// UnmarshalJSON implements the json.Unmarshaler interface\nfunc (h *HashOrHeight) UnmarshalJSON(data []byte) error {\n\tvar unmarshalled interface{}\n\tif err := json.Unmarshal(data, &unmarshalled); err != nil {\n\t\treturn err\n\t}\n\n\tswitch v := unmarshalled.(type) {\n\tcase float64:\n\t\th.Value = int(v)\n\tcase string:\n\t\th.Value = v\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid hash_or_height value: %v\", unmarshalled)\n\t}\n\n\treturn nil\n}\n\n// GetBlockStatsCmd defines the getblockstats JSON-RPC command.\ntype GetBlockStatsCmd struct {\n\tHashOrHeight HashOrHeight\n\tStats        *[]string\n}\n\n// NewGetBlockStatsCmd returns a new instance which can be used to issue a\n// getblockstats JSON-RPC command. Either height or hash must be specified.\nfunc NewGetBlockStatsCmd(hashOrHeight HashOrHeight, stats *[]string) *GetBlockStatsCmd {\n\treturn &GetBlockStatsCmd{\n\t\tHashOrHeight: hashOrHeight,\n\t\tStats:        stats,\n\t}\n}\n\n// TemplateRequest is a request object as defined in BIP22\n// (https://en.bitcoin.it/wiki/BIP_0022), it is optionally provided as an\n// pointer argument to GetBlockTemplateCmd.\ntype TemplateRequest struct {\n\tMode         string   `json:\"mode,omitempty\"`\n\tCapabilities []string `json:\"capabilities,omitempty\"`\n\n\t// Optional long polling.\n\tLongPollID string `json:\"longpollid,omitempty\"`\n\n\t// Optional template tweaking.  SigOpLimit and SizeLimit can be int64\n\t// or bool.\n\tSigOpLimit interface{} `json:\"sigoplimit,omitempty\"`\n\tSizeLimit  interface{} `json:\"sizelimit,omitempty\"`\n\tMaxVersion uint32      `json:\"maxversion,omitempty\"`\n\n\t// Basic pool extension from BIP 0023.\n\tTarget string `json:\"target,omitempty\"`\n\n\t// Block proposal from BIP 0023.  Data is only provided when Mode is\n\t// \"proposal\".\n\tData   string `json:\"data,omitempty\"`\n\tWorkID string `json:\"workid,omitempty\"`\n\n\t// list of supported softfork deployments, by name\n\t// Ref: https://en.bitcoin.it/wiki/BIP_0009#getblocktemplate_changes.\n\tRules []string `json:\"rules,omitempty\"`\n}\n\n// convertTemplateRequestField potentially converts the provided value as\n// needed.\nfunc convertTemplateRequestField(fieldName string, iface interface{}) (interface{}, error) {\n\tswitch val := iface.(type) {\n\tcase nil:\n\t\treturn nil, nil\n\tcase bool:\n\t\treturn val, nil\n\tcase float64:\n\t\tif val == float64(int64(val)) {\n\t\t\treturn int64(val), nil\n\t\t}\n\t}\n\n\tstr := fmt.Sprintf(\"the %s field must be unspecified, a boolean, or \"+\n\t\t\"a 64-bit integer\", fieldName)\n\treturn nil, makeError(ErrInvalidType, str)\n}\n\n// UnmarshalJSON provides a custom Unmarshal method for TemplateRequest.  This\n// is necessary because the SigOpLimit and SizeLimit fields can only be specific\n// types.\nfunc (t *TemplateRequest) UnmarshalJSON(data []byte) error {\n\ttype templateRequest TemplateRequest\n\n\trequest := (*templateRequest)(t)\n\tif err := json.Unmarshal(data, &request); err != nil {\n\t\treturn err\n\t}\n\n\t// The SigOpLimit field can only be nil, bool, or int64.\n\tval, err := convertTemplateRequestField(\"sigoplimit\", request.SigOpLimit)\n\tif err != nil {\n\t\treturn err\n\t}\n\trequest.SigOpLimit = val\n\n\t// The SizeLimit field can only be nil, bool, or int64.\n\tval, err = convertTemplateRequestField(\"sizelimit\", request.SizeLimit)\n\tif err != nil {\n\t\treturn err\n\t}\n\trequest.SizeLimit = val\n\n\treturn nil\n}\n\n// GetBlockTemplateCmd defines the getblocktemplate JSON-RPC command.\ntype GetBlockTemplateCmd struct {\n\tRequest *TemplateRequest\n}\n\n// NewGetBlockTemplateCmd returns a new instance which can be used to issue a\n// getblocktemplate JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetBlockTemplateCmd(request *TemplateRequest) *GetBlockTemplateCmd {\n\treturn &GetBlockTemplateCmd{\n\t\tRequest: request,\n\t}\n}\n\n// GetCFilterCmd defines the getcfilter JSON-RPC command.\ntype GetCFilterCmd struct {\n\tHash       string\n\tFilterType wire.FilterType\n}\n\n// NewGetCFilterCmd returns a new instance which can be used to issue a\n// getcfilter JSON-RPC command.\nfunc NewGetCFilterCmd(hash string, filterType wire.FilterType) *GetCFilterCmd {\n\treturn &GetCFilterCmd{\n\t\tHash:       hash,\n\t\tFilterType: filterType,\n\t}\n}\n\n// GetCFilterHeaderCmd defines the getcfilterheader JSON-RPC command.\ntype GetCFilterHeaderCmd struct {\n\tHash       string\n\tFilterType wire.FilterType\n}\n\n// NewGetCFilterHeaderCmd returns a new instance which can be used to issue a\n// getcfilterheader JSON-RPC command.\nfunc NewGetCFilterHeaderCmd(hash string,\n\tfilterType wire.FilterType) *GetCFilterHeaderCmd {\n\treturn &GetCFilterHeaderCmd{\n\t\tHash:       hash,\n\t\tFilterType: filterType,\n\t}\n}\n\n// GetChainTipsCmd defines the getchaintips JSON-RPC command.\ntype GetChainTipsCmd struct{}\n\n// NewGetChainTipsCmd returns a new instance which can be used to issue a\n// getchaintips JSON-RPC command.\nfunc NewGetChainTipsCmd() *GetChainTipsCmd {\n\treturn &GetChainTipsCmd{}\n}\n\n// GetChainTxStatsCmd defines the getchaintxstats JSON-RPC command.\ntype GetChainTxStatsCmd struct {\n\tNBlocks   *int32\n\tBlockHash *string\n}\n\n// NewGetChainTxStatsCmd returns a new instance which can be used to issue a\n// getchaintxstats JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetChainTxStatsCmd(nBlocks *int32, blockHash *string) *GetChainTxStatsCmd {\n\treturn &GetChainTxStatsCmd{\n\t\tNBlocks:   nBlocks,\n\t\tBlockHash: blockHash,\n\t}\n}\n\n// GetConnectionCountCmd defines the getconnectioncount JSON-RPC command.\ntype GetConnectionCountCmd struct{}\n\n// NewGetConnectionCountCmd returns a new instance which can be used to issue a\n// getconnectioncount JSON-RPC command.\nfunc NewGetConnectionCountCmd() *GetConnectionCountCmd {\n\treturn &GetConnectionCountCmd{}\n}\n\n// GetDescriptorInfoCmd defines the getdescriptorinfo JSON-RPC command.\ntype GetDescriptorInfoCmd struct {\n\tDescriptor string\n}\n\n// NewGetDescriptorInfoCmd returns a new instance which can be used to issue a\n// getdescriptorinfo JSON-RPC command.\nfunc NewGetDescriptorInfoCmd(descriptor string) *GetDescriptorInfoCmd {\n\treturn &GetDescriptorInfoCmd{\n\t\tDescriptor: descriptor,\n\t}\n}\n\n// GetDifficultyCmd defines the getdifficulty JSON-RPC command.\ntype GetDifficultyCmd struct{}\n\n// NewGetDifficultyCmd returns a new instance which can be used to issue a\n// getdifficulty JSON-RPC command.\nfunc NewGetDifficultyCmd() *GetDifficultyCmd {\n\treturn &GetDifficultyCmd{}\n}\n\n// GetGenerateCmd defines the getgenerate JSON-RPC command.\ntype GetGenerateCmd struct{}\n\n// NewGetGenerateCmd returns a new instance which can be used to issue a\n// getgenerate JSON-RPC command.\nfunc NewGetGenerateCmd() *GetGenerateCmd {\n\treturn &GetGenerateCmd{}\n}\n\n// GetHashesPerSecCmd defines the gethashespersec JSON-RPC command.\ntype GetHashesPerSecCmd struct{}\n\n// NewGetHashesPerSecCmd returns a new instance which can be used to issue a\n// gethashespersec JSON-RPC command.\nfunc NewGetHashesPerSecCmd() *GetHashesPerSecCmd {\n\treturn &GetHashesPerSecCmd{}\n}\n\n// GetInfoCmd defines the getinfo JSON-RPC command.\ntype GetInfoCmd struct{}\n\n// NewGetInfoCmd returns a new instance which can be used to issue a\n// getinfo JSON-RPC command.\nfunc NewGetInfoCmd() *GetInfoCmd {\n\treturn &GetInfoCmd{}\n}\n\n// GetMempoolEntryCmd defines the getmempoolentry JSON-RPC command.\ntype GetMempoolEntryCmd struct {\n\tTxID string\n}\n\n// NewGetMempoolEntryCmd returns a new instance which can be used to issue a\n// getmempoolentry JSON-RPC command.\nfunc NewGetMempoolEntryCmd(txHash string) *GetMempoolEntryCmd {\n\treturn &GetMempoolEntryCmd{\n\t\tTxID: txHash,\n\t}\n}\n\n// GetMempoolInfoCmd defines the getmempoolinfo JSON-RPC command.\ntype GetMempoolInfoCmd struct{}\n\n// NewGetMempoolInfoCmd returns a new instance which can be used to issue a\n// getmempool JSON-RPC command.\nfunc NewGetMempoolInfoCmd() *GetMempoolInfoCmd {\n\treturn &GetMempoolInfoCmd{}\n}\n\n// GetMiningInfoCmd defines the getmininginfo JSON-RPC command.\ntype GetMiningInfoCmd struct{}\n\n// NewGetMiningInfoCmd returns a new instance which can be used to issue a\n// getmininginfo JSON-RPC command.\nfunc NewGetMiningInfoCmd() *GetMiningInfoCmd {\n\treturn &GetMiningInfoCmd{}\n}\n\n// GetNetworkInfoCmd defines the getnetworkinfo JSON-RPC command.\ntype GetNetworkInfoCmd struct{}\n\n// NewGetNetworkInfoCmd returns a new instance which can be used to issue a\n// getnetworkinfo JSON-RPC command.\nfunc NewGetNetworkInfoCmd() *GetNetworkInfoCmd {\n\treturn &GetNetworkInfoCmd{}\n}\n\n// GetNetTotalsCmd defines the getnettotals JSON-RPC command.\ntype GetNetTotalsCmd struct{}\n\n// NewGetNetTotalsCmd returns a new instance which can be used to issue a\n// getnettotals JSON-RPC command.\nfunc NewGetNetTotalsCmd() *GetNetTotalsCmd {\n\treturn &GetNetTotalsCmd{}\n}\n\n// GetNetworkHashPSCmd defines the getnetworkhashps JSON-RPC command.\ntype GetNetworkHashPSCmd struct {\n\tBlocks *int `jsonrpcdefault:\"120\"`\n\tHeight *int `jsonrpcdefault:\"-1\"`\n}\n\n// NewGetNetworkHashPSCmd returns a new instance which can be used to issue a\n// getnetworkhashps JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetNetworkHashPSCmd(numBlocks, height *int) *GetNetworkHashPSCmd {\n\treturn &GetNetworkHashPSCmd{\n\t\tBlocks: numBlocks,\n\t\tHeight: height,\n\t}\n}\n\n// GetNodeAddressesCmd defines the getnodeaddresses JSON-RPC command.\ntype GetNodeAddressesCmd struct {\n\tCount *int32 `jsonrpcdefault:\"1\"`\n}\n\n// NewGetNodeAddressesCmd returns a new instance which can be used to issue a\n// getnodeaddresses JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetNodeAddressesCmd(count *int32) *GetNodeAddressesCmd {\n\treturn &GetNodeAddressesCmd{\n\t\tCount: count,\n\t}\n}\n\n// GetPeerInfoCmd defines the getpeerinfo JSON-RPC command.\ntype GetPeerInfoCmd struct{}\n\n// NewGetPeerInfoCmd returns a new instance which can be used to issue a getpeer\n// JSON-RPC command.\nfunc NewGetPeerInfoCmd() *GetPeerInfoCmd {\n\treturn &GetPeerInfoCmd{}\n}\n\n// GetRawMempoolCmd defines the getmempool JSON-RPC command.\ntype GetRawMempoolCmd struct {\n\tVerbose *bool `jsonrpcdefault:\"false\"`\n}\n\n// NewGetRawMempoolCmd returns a new instance which can be used to issue a\n// getrawmempool JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetRawMempoolCmd(verbose *bool) *GetRawMempoolCmd {\n\treturn &GetRawMempoolCmd{\n\t\tVerbose: verbose,\n\t}\n}\n\n// GetRawTransactionCmd defines the getrawtransaction JSON-RPC command.\n//\n// NOTE: This field is an int versus a bool to remain compatible with Bitcoin\n// Core even though it really should be a bool.\ntype GetRawTransactionCmd struct {\n\tTxid    string\n\tVerbose *int `jsonrpcdefault:\"0\"`\n}\n\n// NewGetRawTransactionCmd returns a new instance which can be used to issue a\n// getrawtransaction JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetRawTransactionCmd(txHash string, verbose *int) *GetRawTransactionCmd {\n\treturn &GetRawTransactionCmd{\n\t\tTxid:    txHash,\n\t\tVerbose: verbose,\n\t}\n}\n\n// GetTxOutCmd defines the gettxout JSON-RPC command.\ntype GetTxOutCmd struct {\n\tTxid           string\n\tVout           uint32\n\tIncludeMempool *bool `jsonrpcdefault:\"true\"`\n}\n\n// NewGetTxOutCmd returns a new instance which can be used to issue a gettxout\n// JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetTxOutCmd(txHash string, vout uint32, includeMempool *bool) *GetTxOutCmd {\n\treturn &GetTxOutCmd{\n\t\tTxid:           txHash,\n\t\tVout:           vout,\n\t\tIncludeMempool: includeMempool,\n\t}\n}\n\n// GetTxOutProofCmd defines the gettxoutproof JSON-RPC command.\ntype GetTxOutProofCmd struct {\n\tTxIDs     []string\n\tBlockHash *string\n}\n\n// NewGetTxOutProofCmd returns a new instance which can be used to issue a\n// gettxoutproof JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetTxOutProofCmd(txIDs []string, blockHash *string) *GetTxOutProofCmd {\n\treturn &GetTxOutProofCmd{\n\t\tTxIDs:     txIDs,\n\t\tBlockHash: blockHash,\n\t}\n}\n\n// GetTxOutSetInfoCmd defines the gettxoutsetinfo JSON-RPC command.\ntype GetTxOutSetInfoCmd struct{}\n\n// NewGetTxOutSetInfoCmd returns a new instance which can be used to issue a\n// gettxoutsetinfo JSON-RPC command.\nfunc NewGetTxOutSetInfoCmd() *GetTxOutSetInfoCmd {\n\treturn &GetTxOutSetInfoCmd{}\n}\n\n// GetWorkCmd defines the getwork JSON-RPC command.\ntype GetWorkCmd struct {\n\tData *string\n}\n\n// NewGetWorkCmd returns a new instance which can be used to issue a getwork\n// JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetWorkCmd(data *string) *GetWorkCmd {\n\treturn &GetWorkCmd{\n\t\tData: data,\n\t}\n}\n\n// HelpCmd defines the help JSON-RPC command.\ntype HelpCmd struct {\n\tCommand *string\n}\n\n// NewHelpCmd returns a new instance which can be used to issue a help JSON-RPC\n// command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewHelpCmd(command *string) *HelpCmd {\n\treturn &HelpCmd{\n\t\tCommand: command,\n\t}\n}\n\n// InvalidateBlockCmd defines the invalidateblock JSON-RPC command.\ntype InvalidateBlockCmd struct {\n\tBlockHash string\n}\n\n// NewInvalidateBlockCmd returns a new instance which can be used to issue a\n// invalidateblock JSON-RPC command.\nfunc NewInvalidateBlockCmd(blockHash string) *InvalidateBlockCmd {\n\treturn &InvalidateBlockCmd{\n\t\tBlockHash: blockHash,\n\t}\n}\n\n// PingCmd defines the ping JSON-RPC command.\ntype PingCmd struct{}\n\n// NewPingCmd returns a new instance which can be used to issue a ping JSON-RPC\n// command.\nfunc NewPingCmd() *PingCmd {\n\treturn &PingCmd{}\n}\n\n// PreciousBlockCmd defines the preciousblock JSON-RPC command.\ntype PreciousBlockCmd struct {\n\tBlockHash string\n}\n\n// NewPreciousBlockCmd returns a new instance which can be used to issue a\n// preciousblock JSON-RPC command.\nfunc NewPreciousBlockCmd(blockHash string) *PreciousBlockCmd {\n\treturn &PreciousBlockCmd{\n\t\tBlockHash: blockHash,\n\t}\n}\n\n// ReconsiderBlockCmd defines the reconsiderblock JSON-RPC command.\ntype ReconsiderBlockCmd struct {\n\tBlockHash string\n}\n\n// NewReconsiderBlockCmd returns a new instance which can be used to issue a\n// reconsiderblock JSON-RPC command.\nfunc NewReconsiderBlockCmd(blockHash string) *ReconsiderBlockCmd {\n\treturn &ReconsiderBlockCmd{\n\t\tBlockHash: blockHash,\n\t}\n}\n\n// SearchRawTransactionsCmd defines the searchrawtransactions JSON-RPC command.\ntype SearchRawTransactionsCmd struct {\n\tAddress     string\n\tVerbose     *int  `jsonrpcdefault:\"1\"`\n\tSkip        *int  `jsonrpcdefault:\"0\"`\n\tCount       *int  `jsonrpcdefault:\"100\"`\n\tVinExtra    *int  `jsonrpcdefault:\"0\"`\n\tReverse     *bool `jsonrpcdefault:\"false\"`\n\tFilterAddrs *[]string\n}\n\n// NewSearchRawTransactionsCmd returns a new instance which can be used to issue a\n// sendrawtransaction JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewSearchRawTransactionsCmd(address string, verbose, skip, count *int, vinExtra *int, reverse *bool, filterAddrs *[]string) *SearchRawTransactionsCmd {\n\treturn &SearchRawTransactionsCmd{\n\t\tAddress:     address,\n\t\tVerbose:     verbose,\n\t\tSkip:        skip,\n\t\tCount:       count,\n\t\tVinExtra:    vinExtra,\n\t\tReverse:     reverse,\n\t\tFilterAddrs: filterAddrs,\n\t}\n}\n\n// AllowHighFeesOrMaxFeeRate defines a type that can either be the legacy\n// allowhighfees boolean field or the new maxfeerate float64 field.\ntype AllowHighFeesOrMaxFeeRate struct {\n\tValue interface{}\n}\n\n// String returns the string representation of this struct, used for printing\n// the marshaled default value in the help text.\nfunc (a AllowHighFeesOrMaxFeeRate) String() string {\n\tb, _ := a.MarshalJSON()\n\treturn string(b)\n}\n\n// MarshalJSON implements the json.Marshaler interface\nfunc (a AllowHighFeesOrMaxFeeRate) MarshalJSON() ([]byte, error) {\n\t// The default value is false which only works with the legacy versions.\n\tif a.Value == nil ||\n\t\t(reflect.ValueOf(a.Value).Kind() == reflect.Ptr &&\n\t\t\treflect.ValueOf(a.Value).IsNil()) {\n\n\t\treturn json.Marshal(false)\n\t}\n\n\treturn json.Marshal(a.Value)\n}\n\n// UnmarshalJSON implements the json.Unmarshaler interface\nfunc (a *AllowHighFeesOrMaxFeeRate) UnmarshalJSON(data []byte) error {\n\tif len(data) == 0 {\n\t\treturn nil\n\t}\n\n\tvar unmarshalled interface{}\n\tif err := json.Unmarshal(data, &unmarshalled); err != nil {\n\t\treturn err\n\t}\n\n\tswitch v := unmarshalled.(type) {\n\tcase bool:\n\t\ta.Value = Bool(v)\n\tcase float64:\n\t\ta.Value = Float64(v)\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid allowhighfees or maxfeerate value: \"+\n\t\t\t\"%v\", unmarshalled)\n\t}\n\n\treturn nil\n}\n\n// SendRawTransactionCmd defines the sendrawtransaction JSON-RPC command.\ntype SendRawTransactionCmd struct {\n\tHexTx      string\n\tFeeSetting *AllowHighFeesOrMaxFeeRate `jsonrpcdefault:\"false\"`\n}\n\n// NewSendRawTransactionCmd returns a new instance which can be used to issue a\n// sendrawtransaction JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewSendRawTransactionCmd(hexTx string, allowHighFees *bool) *SendRawTransactionCmd {\n\treturn &SendRawTransactionCmd{\n\t\tHexTx: hexTx,\n\t\tFeeSetting: &AllowHighFeesOrMaxFeeRate{\n\t\t\tValue: allowHighFees,\n\t\t},\n\t}\n}\n\n// NewSendRawTransactionCmd returns a new instance which can be used to issue a\n// sendrawtransaction JSON-RPC command to a bitcoind node.\n// maxFeeRate is the maximum fee rate for the transaction in BTC/kvB.\n//\n// A 0 maxFeeRate indicates that a maximum fee rate won't be enforced.\nfunc NewBitcoindSendRawTransactionCmd(hexTx string, maxFeeRate BTCPerkvB) *SendRawTransactionCmd {\n\treturn &SendRawTransactionCmd{\n\t\tHexTx: hexTx,\n\t\tFeeSetting: &AllowHighFeesOrMaxFeeRate{\n\t\t\tValue: &maxFeeRate,\n\t\t},\n\t}\n}\n\n// SetGenerateCmd defines the setgenerate JSON-RPC command.\ntype SetGenerateCmd struct {\n\tGenerate     bool\n\tGenProcLimit *int `jsonrpcdefault:\"-1\"`\n}\n\n// NewSetGenerateCmd returns a new instance which can be used to issue a\n// setgenerate JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewSetGenerateCmd(generate bool, genProcLimit *int) *SetGenerateCmd {\n\treturn &SetGenerateCmd{\n\t\tGenerate:     generate,\n\t\tGenProcLimit: genProcLimit,\n\t}\n}\n\n// SignMessageWithPrivKeyCmd defines the signmessagewithprivkey JSON-RPC command.\ntype SignMessageWithPrivKeyCmd struct {\n\tPrivKey string // base 58 Wallet Import format private key\n\tMessage string // Message to sign\n}\n\n// NewSignMessageWithPrivKey returns a new instance which can be used to issue a\n// signmessagewithprivkey JSON-RPC command.\n//\n// The first parameter is a private key in base 58 Wallet Import format.\n// The second parameter is the message to sign.\nfunc NewSignMessageWithPrivKey(privKey, message string) *SignMessageWithPrivKeyCmd {\n\treturn &SignMessageWithPrivKeyCmd{\n\t\tPrivKey: privKey,\n\t\tMessage: message,\n\t}\n}\n\n// StopCmd defines the stop JSON-RPC command.\ntype StopCmd struct{}\n\n// NewStopCmd returns a new instance which can be used to issue a stop JSON-RPC\n// command.\nfunc NewStopCmd() *StopCmd {\n\treturn &StopCmd{}\n}\n\n// SubmitBlockOptions represents the optional options struct provided with a\n// SubmitBlockCmd command.\ntype SubmitBlockOptions struct {\n\t// must be provided if server provided a workid with template.\n\tWorkID string `json:\"workid,omitempty\"`\n}\n\n// SubmitBlockCmd defines the submitblock JSON-RPC command.\ntype SubmitBlockCmd struct {\n\tHexBlock string\n\tOptions  *SubmitBlockOptions\n}\n\n// NewSubmitBlockCmd returns a new instance which can be used to issue a\n// submitblock JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewSubmitBlockCmd(hexBlock string, options *SubmitBlockOptions) *SubmitBlockCmd {\n\treturn &SubmitBlockCmd{\n\t\tHexBlock: hexBlock,\n\t\tOptions:  options,\n\t}\n}\n\n// UptimeCmd defines the uptime JSON-RPC command.\ntype UptimeCmd struct{}\n\n// NewUptimeCmd returns a new instance which can be used to issue an uptime JSON-RPC command.\nfunc NewUptimeCmd() *UptimeCmd {\n\treturn &UptimeCmd{}\n}\n\n// ValidateAddressCmd defines the validateaddress JSON-RPC command.\ntype ValidateAddressCmd struct {\n\tAddress string\n}\n\n// NewValidateAddressCmd returns a new instance which can be used to issue a\n// validateaddress JSON-RPC command.\nfunc NewValidateAddressCmd(address string) *ValidateAddressCmd {\n\treturn &ValidateAddressCmd{\n\t\tAddress: address,\n\t}\n}\n\n// VerifyChainCmd defines the verifychain JSON-RPC command.\ntype VerifyChainCmd struct {\n\tCheckLevel *int32 `jsonrpcdefault:\"3\"`\n\tCheckDepth *int32 `jsonrpcdefault:\"288\"` // 0 = all\n}\n\n// NewVerifyChainCmd returns a new instance which can be used to issue a\n// verifychain JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewVerifyChainCmd(checkLevel, checkDepth *int32) *VerifyChainCmd {\n\treturn &VerifyChainCmd{\n\t\tCheckLevel: checkLevel,\n\t\tCheckDepth: checkDepth,\n\t}\n}\n\n// VerifyMessageCmd defines the verifymessage JSON-RPC command.\ntype VerifyMessageCmd struct {\n\tAddress   string\n\tSignature string\n\tMessage   string\n}\n\n// NewVerifyMessageCmd returns a new instance which can be used to issue a\n// verifymessage JSON-RPC command.\nfunc NewVerifyMessageCmd(address, signature, message string) *VerifyMessageCmd {\n\treturn &VerifyMessageCmd{\n\t\tAddress:   address,\n\t\tSignature: signature,\n\t\tMessage:   message,\n\t}\n}\n\n// VerifyTxOutProofCmd defines the verifytxoutproof JSON-RPC command.\ntype VerifyTxOutProofCmd struct {\n\tProof string\n}\n\n// NewVerifyTxOutProofCmd returns a new instance which can be used to issue a\n// verifytxoutproof JSON-RPC command.\nfunc NewVerifyTxOutProofCmd(proof string) *VerifyTxOutProofCmd {\n\treturn &VerifyTxOutProofCmd{\n\t\tProof: proof,\n\t}\n}\n\n// TestMempoolAcceptCmd defines the testmempoolaccept JSON-RPC command.\ntype TestMempoolAcceptCmd struct {\n\t// An array of hex strings of raw transactions.\n\tRawTxns []string\n\n\t// Reject transactions whose fee rate is higher than the specified\n\t// value, expressed in BTC/kvB, optional, default=\"0.10\".\n\tMaxFeeRate BTCPerkvB `json:\"omitempty\"`\n}\n\n// NewTestMempoolAcceptCmd returns a new instance which can be used to issue a\n// testmempoolaccept JSON-RPC command.\nfunc NewTestMempoolAcceptCmd(rawTxns []string,\n\tmaxFeeRate BTCPerkvB) *TestMempoolAcceptCmd {\n\n\treturn &TestMempoolAcceptCmd{\n\t\tRawTxns:    rawTxns,\n\t\tMaxFeeRate: maxFeeRate,\n\t}\n}\n\n// GetTxSpendingPrevOutCmd defines the gettxspendingprevout JSON-RPC command.\ntype GetTxSpendingPrevOutCmd struct {\n\t// Outputs is a list of transaction outputs to query.\n\tOutputs []*GetTxSpendingPrevOutCmdOutput\n}\n\n// GetTxSpendingPrevOutCmdOutput defines the output to query for the\n// gettxspendingprevout JSON-RPC command.\ntype GetTxSpendingPrevOutCmdOutput struct {\n\tTxid string `json:\"txid\"`\n\tVout uint32 `json:\"vout\"`\n}\n\n// NewGetTxSpendingPrevOutCmd returns a new instance which can be used to issue\n// a gettxspendingprevout JSON-RPC command.\nfunc NewGetTxSpendingPrevOutCmd(\n\toutpoints []wire.OutPoint) *GetTxSpendingPrevOutCmd {\n\n\toutputs := make([]*GetTxSpendingPrevOutCmdOutput, 0, len(outpoints))\n\n\tfor _, op := range outpoints {\n\t\toutputs = append(outputs, &GetTxSpendingPrevOutCmdOutput{\n\t\t\tTxid: op.Hash.String(),\n\t\t\tVout: op.Index,\n\t\t})\n\t}\n\n\treturn &GetTxSpendingPrevOutCmd{\n\t\tOutputs: outputs,\n\t}\n}\n\nfunc init() {\n\t// No special flags for commands in this file.\n\tflags := UsageFlag(0)\n\n\tMustRegisterCmd(\"addnode\", (*AddNodeCmd)(nil), flags)\n\tMustRegisterCmd(\"createrawtransaction\", (*CreateRawTransactionCmd)(nil), flags)\n\tMustRegisterCmd(\"decoderawtransaction\", (*DecodeRawTransactionCmd)(nil), flags)\n\tMustRegisterCmd(\"decodescript\", (*DecodeScriptCmd)(nil), flags)\n\tMustRegisterCmd(\"deriveaddresses\", (*DeriveAddressesCmd)(nil), flags)\n\tMustRegisterCmd(\"fundrawtransaction\", (*FundRawTransactionCmd)(nil), flags)\n\tMustRegisterCmd(\"getaddednodeinfo\", (*GetAddedNodeInfoCmd)(nil), flags)\n\tMustRegisterCmd(\"getbestblockhash\", (*GetBestBlockHashCmd)(nil), flags)\n\tMustRegisterCmd(\"getblock\", (*GetBlockCmd)(nil), flags)\n\tMustRegisterCmd(\"getblockchaininfo\", (*GetBlockChainInfoCmd)(nil), flags)\n\tMustRegisterCmd(\"getblockcount\", (*GetBlockCountCmd)(nil), flags)\n\tMustRegisterCmd(\"getblockfilter\", (*GetBlockFilterCmd)(nil), flags)\n\tMustRegisterCmd(\"getblockhash\", (*GetBlockHashCmd)(nil), flags)\n\tMustRegisterCmd(\"getblockheader\", (*GetBlockHeaderCmd)(nil), flags)\n\tMustRegisterCmd(\"getblockstats\", (*GetBlockStatsCmd)(nil), flags)\n\tMustRegisterCmd(\"getblocktemplate\", (*GetBlockTemplateCmd)(nil), flags)\n\tMustRegisterCmd(\"getcfilter\", (*GetCFilterCmd)(nil), flags)\n\tMustRegisterCmd(\"getcfilterheader\", (*GetCFilterHeaderCmd)(nil), flags)\n\tMustRegisterCmd(\"getchaintips\", (*GetChainTipsCmd)(nil), flags)\n\tMustRegisterCmd(\"getchaintxstats\", (*GetChainTxStatsCmd)(nil), flags)\n\tMustRegisterCmd(\"getconnectioncount\", (*GetConnectionCountCmd)(nil), flags)\n\tMustRegisterCmd(\"getdescriptorinfo\", (*GetDescriptorInfoCmd)(nil), flags)\n\tMustRegisterCmd(\"getdifficulty\", (*GetDifficultyCmd)(nil), flags)\n\tMustRegisterCmd(\"getgenerate\", (*GetGenerateCmd)(nil), flags)\n\tMustRegisterCmd(\"gethashespersec\", (*GetHashesPerSecCmd)(nil), flags)\n\tMustRegisterCmd(\"getinfo\", (*GetInfoCmd)(nil), flags)\n\tMustRegisterCmd(\"getmempoolentry\", (*GetMempoolEntryCmd)(nil), flags)\n\tMustRegisterCmd(\"getmempoolinfo\", (*GetMempoolInfoCmd)(nil), flags)\n\tMustRegisterCmd(\"getmininginfo\", (*GetMiningInfoCmd)(nil), flags)\n\tMustRegisterCmd(\"getnetworkinfo\", (*GetNetworkInfoCmd)(nil), flags)\n\tMustRegisterCmd(\"getnettotals\", (*GetNetTotalsCmd)(nil), flags)\n\tMustRegisterCmd(\"getnetworkhashps\", (*GetNetworkHashPSCmd)(nil), flags)\n\tMustRegisterCmd(\"getnodeaddresses\", (*GetNodeAddressesCmd)(nil), flags)\n\tMustRegisterCmd(\"getpeerinfo\", (*GetPeerInfoCmd)(nil), flags)\n\tMustRegisterCmd(\"getrawmempool\", (*GetRawMempoolCmd)(nil), flags)\n\tMustRegisterCmd(\"getrawtransaction\", (*GetRawTransactionCmd)(nil), flags)\n\tMustRegisterCmd(\"gettxout\", (*GetTxOutCmd)(nil), flags)\n\tMustRegisterCmd(\"gettxoutproof\", (*GetTxOutProofCmd)(nil), flags)\n\tMustRegisterCmd(\"gettxoutsetinfo\", (*GetTxOutSetInfoCmd)(nil), flags)\n\tMustRegisterCmd(\"getwork\", (*GetWorkCmd)(nil), flags)\n\tMustRegisterCmd(\"help\", (*HelpCmd)(nil), flags)\n\tMustRegisterCmd(\"invalidateblock\", (*InvalidateBlockCmd)(nil), flags)\n\tMustRegisterCmd(\"ping\", (*PingCmd)(nil), flags)\n\tMustRegisterCmd(\"preciousblock\", (*PreciousBlockCmd)(nil), flags)\n\tMustRegisterCmd(\"reconsiderblock\", (*ReconsiderBlockCmd)(nil), flags)\n\tMustRegisterCmd(\"searchrawtransactions\", (*SearchRawTransactionsCmd)(nil), flags)\n\tMustRegisterCmd(\"sendrawtransaction\", (*SendRawTransactionCmd)(nil), flags)\n\tMustRegisterCmd(\"submitpackage\", (*JsonSubmitPackageCmd)(nil), flags)\n\tMustRegisterCmd(\"setgenerate\", (*SetGenerateCmd)(nil), flags)\n\tMustRegisterCmd(\"signmessagewithprivkey\", (*SignMessageWithPrivKeyCmd)(nil), flags)\n\tMustRegisterCmd(\"stop\", (*StopCmd)(nil), flags)\n\tMustRegisterCmd(\"submitblock\", (*SubmitBlockCmd)(nil), flags)\n\tMustRegisterCmd(\"uptime\", (*UptimeCmd)(nil), flags)\n\tMustRegisterCmd(\"validateaddress\", (*ValidateAddressCmd)(nil), flags)\n\tMustRegisterCmd(\"verifychain\", (*VerifyChainCmd)(nil), flags)\n\tMustRegisterCmd(\"verifymessage\", (*VerifyMessageCmd)(nil), flags)\n\tMustRegisterCmd(\"verifytxoutproof\", (*VerifyTxOutProofCmd)(nil), flags)\n\tMustRegisterCmd(\"testmempoolaccept\", (*TestMempoolAcceptCmd)(nil), flags)\n\tMustRegisterCmd(\"gettxspendingprevout\", (*GetTxSpendingPrevOutCmd)(nil), flags)\n}\n"
  },
  {
    "path": "btcjson/chainsvrcmds_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TestChainSvrCmds tests all of the chain server commands marshal and unmarshal\n// into valid results include handling of optional fields being omitted in the\n// marshalled command, while optional fields with defaults have the default\n// assigned on unmarshalled commands.\nfunc TestChainSvrCmds(t *testing.T) {\n\tt.Parallel()\n\n\ttestID := int(1)\n\ttests := []struct {\n\t\tname         string\n\t\tnewCmd       func() (interface{}, error)\n\t\tstaticCmd    func() interface{}\n\t\tmarshalled   string\n\t\tunmarshalled interface{}\n\t}{\n\t\t{\n\t\t\tname: \"addnode\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"addnode\", \"127.0.0.1\", btcjson.ANRemove)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewAddNodeCmd(\"127.0.0.1\", btcjson.ANRemove)\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"addnode\",\"params\":[\"127.0.0.1\",\"remove\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.AddNodeCmd{Addr: \"127.0.0.1\", SubCmd: btcjson.ANRemove},\n\t\t},\n\t\t{\n\t\t\tname: \"createrawtransaction\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"createrawtransaction\", `[{\"txid\":\"123\",\"vout\":1}]`,\n\t\t\t\t\t`{\"456\":0.0123}`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttxInputs := []btcjson.TransactionInput{\n\t\t\t\t\t{Txid: \"123\", Vout: 1},\n\t\t\t\t}\n\t\t\t\tamounts := map[string]float64{\"456\": .0123}\n\t\t\t\treturn btcjson.NewCreateRawTransactionCmd(txInputs, amounts, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"createrawtransaction\",\"params\":[[{\"txid\":\"123\",\"vout\":1}],{\"456\":0.0123}],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.CreateRawTransactionCmd{\n\t\t\t\tInputs:  []btcjson.TransactionInput{{Txid: \"123\", Vout: 1}},\n\t\t\t\tAmounts: map[string]float64{\"456\": .0123},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"createrawtransaction - no inputs\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"createrawtransaction\", `[]`, `{\"456\":0.0123}`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tamounts := map[string]float64{\"456\": .0123}\n\t\t\t\treturn btcjson.NewCreateRawTransactionCmd(nil, amounts, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"createrawtransaction\",\"params\":[[],{\"456\":0.0123}],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.CreateRawTransactionCmd{\n\t\t\t\tInputs:  []btcjson.TransactionInput{},\n\t\t\t\tAmounts: map[string]float64{\"456\": .0123},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"createrawtransaction optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"createrawtransaction\", `[{\"txid\":\"123\",\"vout\":1}]`,\n\t\t\t\t\t`{\"456\":0.0123}`, int64(12312333333))\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttxInputs := []btcjson.TransactionInput{\n\t\t\t\t\t{Txid: \"123\", Vout: 1},\n\t\t\t\t}\n\t\t\t\tamounts := map[string]float64{\"456\": .0123}\n\t\t\t\treturn btcjson.NewCreateRawTransactionCmd(txInputs, amounts, btcjson.Int64(12312333333))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"createrawtransaction\",\"params\":[[{\"txid\":\"123\",\"vout\":1}],{\"456\":0.0123},12312333333],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.CreateRawTransactionCmd{\n\t\t\t\tInputs:   []btcjson.TransactionInput{{Txid: \"123\", Vout: 1}},\n\t\t\t\tAmounts:  map[string]float64{\"456\": .0123},\n\t\t\t\tLockTime: btcjson.Int64(12312333333),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"fundrawtransaction - empty opts\",\n\t\t\tnewCmd: func() (i interface{}, e error) {\n\t\t\t\treturn btcjson.NewCmd(\"fundrawtransaction\", \"deadbeef\", \"{}\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tdeadbeef, err := hex.DecodeString(\"deadbeef\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewFundRawTransactionCmd(deadbeef, btcjson.FundRawTransactionOpts{}, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"fundrawtransaction\",\"params\":[\"deadbeef\",{}],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.FundRawTransactionCmd{\n\t\t\t\tHexTx:     \"deadbeef\",\n\t\t\t\tOptions:   btcjson.FundRawTransactionOpts{},\n\t\t\t\tIsWitness: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"fundrawtransaction - full opts\",\n\t\t\tnewCmd: func() (i interface{}, e error) {\n\t\t\t\treturn btcjson.NewCmd(\"fundrawtransaction\", \"deadbeef\", `{\"changeAddress\":\"bcrt1qeeuctq9wutlcl5zatge7rjgx0k45228cxez655\",\"changePosition\":1,\"change_type\":\"legacy\",\"includeWatching\":true,\"lockUnspents\":true,\"feeRate\":0.7,\"subtractFeeFromOutputs\":[0],\"replaceable\":true,\"conf_target\":8,\"estimate_mode\":\"ECONOMICAL\"}`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tdeadbeef, err := hex.DecodeString(\"deadbeef\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\t\t\t\tchangeAddress := \"bcrt1qeeuctq9wutlcl5zatge7rjgx0k45228cxez655\"\n\t\t\t\tchange := 1\n\t\t\t\tchangeType := btcjson.ChangeTypeLegacy\n\t\t\t\twatching := true\n\t\t\t\tlockUnspents := true\n\t\t\t\tfeeRate := 0.7\n\t\t\t\treplaceable := true\n\t\t\t\tconfTarget := 8\n\n\t\t\t\treturn btcjson.NewFundRawTransactionCmd(deadbeef, btcjson.FundRawTransactionOpts{\n\t\t\t\t\tChangeAddress:          &changeAddress,\n\t\t\t\t\tChangePosition:         &change,\n\t\t\t\t\tChangeType:             &changeType,\n\t\t\t\t\tIncludeWatching:        &watching,\n\t\t\t\t\tLockUnspents:           &lockUnspents,\n\t\t\t\t\tFeeRate:                &feeRate,\n\t\t\t\t\tSubtractFeeFromOutputs: []int{0},\n\t\t\t\t\tReplaceable:            &replaceable,\n\t\t\t\t\tConfTarget:             &confTarget,\n\t\t\t\t\tEstimateMode:           &btcjson.EstimateModeEconomical,\n\t\t\t\t}, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"fundrawtransaction\",\"params\":[\"deadbeef\",{\"changeAddress\":\"bcrt1qeeuctq9wutlcl5zatge7rjgx0k45228cxez655\",\"changePosition\":1,\"change_type\":\"legacy\",\"includeWatching\":true,\"lockUnspents\":true,\"feeRate\":0.7,\"subtractFeeFromOutputs\":[0],\"replaceable\":true,\"conf_target\":8,\"estimate_mode\":\"ECONOMICAL\"}],\"id\":1}`,\n\t\t\tunmarshalled: func() interface{} {\n\t\t\t\tchangeAddress := \"bcrt1qeeuctq9wutlcl5zatge7rjgx0k45228cxez655\"\n\t\t\t\tchange := 1\n\t\t\t\tchangeType := btcjson.ChangeTypeLegacy\n\t\t\t\twatching := true\n\t\t\t\tlockUnspents := true\n\t\t\t\tfeeRate := 0.7\n\t\t\t\treplaceable := true\n\t\t\t\tconfTarget := 8\n\t\t\t\treturn &btcjson.FundRawTransactionCmd{\n\t\t\t\t\tHexTx: \"deadbeef\",\n\t\t\t\t\tOptions: btcjson.FundRawTransactionOpts{\n\t\t\t\t\t\tChangeAddress:          &changeAddress,\n\t\t\t\t\t\tChangePosition:         &change,\n\t\t\t\t\t\tChangeType:             &changeType,\n\t\t\t\t\t\tIncludeWatching:        &watching,\n\t\t\t\t\t\tLockUnspents:           &lockUnspents,\n\t\t\t\t\t\tFeeRate:                &feeRate,\n\t\t\t\t\t\tSubtractFeeFromOutputs: []int{0},\n\t\t\t\t\t\tReplaceable:            &replaceable,\n\t\t\t\t\t\tConfTarget:             &confTarget,\n\t\t\t\t\t\tEstimateMode:           &btcjson.EstimateModeEconomical,\n\t\t\t\t\t},\n\t\t\t\t\tIsWitness: nil,\n\t\t\t\t}\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tname: \"fundrawtransaction - iswitness\",\n\t\t\tnewCmd: func() (i interface{}, e error) {\n\t\t\t\treturn btcjson.NewCmd(\"fundrawtransaction\", \"deadbeef\", \"{}\", true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tdeadbeef, err := hex.DecodeString(\"deadbeef\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\t\t\t\tt := true\n\t\t\t\treturn btcjson.NewFundRawTransactionCmd(deadbeef, btcjson.FundRawTransactionOpts{}, &t)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"fundrawtransaction\",\"params\":[\"deadbeef\",{},true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.FundRawTransactionCmd{\n\t\t\t\tHexTx:   \"deadbeef\",\n\t\t\t\tOptions: btcjson.FundRawTransactionOpts{},\n\t\t\t\tIsWitness: func() *bool {\n\t\t\t\t\tt := true\n\t\t\t\t\treturn &t\n\t\t\t\t}(),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"decoderawtransaction\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"decoderawtransaction\", \"123\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewDecodeRawTransactionCmd(\"123\")\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"decoderawtransaction\",\"params\":[\"123\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.DecodeRawTransactionCmd{HexTx: \"123\"},\n\t\t},\n\t\t{\n\t\t\tname: \"decodescript\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"decodescript\", \"00\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewDecodeScriptCmd(\"00\")\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"decodescript\",\"params\":[\"00\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.DecodeScriptCmd{HexScript: \"00\"},\n\t\t},\n\t\t{\n\t\t\tname: \"deriveaddresses no range\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"deriveaddresses\", \"00\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewDeriveAddressesCmd(\"00\", nil)\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"deriveaddresses\",\"params\":[\"00\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.DeriveAddressesCmd{Descriptor: \"00\"},\n\t\t},\n\t\t{\n\t\t\tname: \"deriveaddresses int range\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"deriveaddresses\", \"00\", btcjson.DescriptorRange{Value: 2})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewDeriveAddressesCmd(\n\t\t\t\t\t\"00\", &btcjson.DescriptorRange{Value: 2})\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"deriveaddresses\",\"params\":[\"00\",2],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.DeriveAddressesCmd{\n\t\t\t\tDescriptor: \"00\",\n\t\t\t\tRange:      &btcjson.DescriptorRange{Value: 2},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"deriveaddresses slice range\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"deriveaddresses\", \"00\",\n\t\t\t\t\tbtcjson.DescriptorRange{Value: []int{0, 2}},\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewDeriveAddressesCmd(\n\t\t\t\t\t\"00\", &btcjson.DescriptorRange{Value: []int{0, 2}})\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"deriveaddresses\",\"params\":[\"00\",[0,2]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.DeriveAddressesCmd{\n\t\t\t\tDescriptor: \"00\",\n\t\t\t\tRange:      &btcjson.DescriptorRange{Value: []int{0, 2}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getaddednodeinfo\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getaddednodeinfo\", true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetAddedNodeInfoCmd(true, nil)\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getaddednodeinfo\",\"params\":[true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetAddedNodeInfoCmd{DNS: true, Node: nil},\n\t\t},\n\t\t{\n\t\t\tname: \"getaddednodeinfo optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getaddednodeinfo\", true, \"127.0.0.1\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetAddedNodeInfoCmd(true, btcjson.String(\"127.0.0.1\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getaddednodeinfo\",\"params\":[true,\"127.0.0.1\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetAddedNodeInfoCmd{\n\t\t\t\tDNS:  true,\n\t\t\t\tNode: btcjson.String(\"127.0.0.1\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getbestblockhash\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getbestblockhash\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBestBlockHashCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getbestblockhash\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBestBlockHashCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getblock\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblock\", \"123\", btcjson.Int(0))\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockCmd(\"123\", btcjson.Int(0))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblock\",\"params\":[\"123\",0],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockCmd{\n\t\t\t\tHash:      \"123\",\n\t\t\t\tVerbosity: btcjson.Int(0),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getblock default verbosity\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblock\", \"123\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockCmd(\"123\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblock\",\"params\":[\"123\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockCmd{\n\t\t\t\tHash:      \"123\",\n\t\t\t\tVerbosity: btcjson.Int(1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getblock required optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblock\", \"123\", btcjson.Int(1))\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockCmd(\"123\", btcjson.Int(1))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblock\",\"params\":[\"123\",1],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockCmd{\n\t\t\t\tHash:      \"123\",\n\t\t\t\tVerbosity: btcjson.Int(1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getblock required optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblock\", \"123\", btcjson.Int(2))\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockCmd(\"123\", btcjson.Int(2))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblock\",\"params\":[\"123\",2],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockCmd{\n\t\t\t\tHash:      \"123\",\n\t\t\t\tVerbosity: btcjson.Int(2),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getblockchaininfo\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblockchaininfo\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockChainInfoCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getblockchaininfo\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockChainInfoCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getblockcount\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblockcount\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockCountCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getblockcount\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockCountCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getblockfilter\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblockfilter\", \"0000afaf\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockFilterCmd(\"0000afaf\", nil)\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getblockfilter\",\"params\":[\"0000afaf\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockFilterCmd{\"0000afaf\", nil},\n\t\t},\n\t\t{\n\t\t\tname: \"getblockfilter optional filtertype\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblockfilter\", \"0000afaf\", \"basic\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockFilterCmd(\"0000afaf\", btcjson.NewFilterTypeName(btcjson.FilterTypeBasic))\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getblockfilter\",\"params\":[\"0000afaf\",\"basic\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockFilterCmd{\"0000afaf\", btcjson.NewFilterTypeName(btcjson.FilterTypeBasic)},\n\t\t},\n\t\t{\n\t\t\tname: \"getblockhash\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblockhash\", 123)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockHashCmd(123)\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getblockhash\",\"params\":[123],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockHashCmd{Index: 123},\n\t\t},\n\t\t{\n\t\t\tname: \"getblockheader\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblockheader\", \"123\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockHeaderCmd(\"123\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblockheader\",\"params\":[\"123\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockHeaderCmd{\n\t\t\t\tHash:    \"123\",\n\t\t\t\tVerbose: btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getblockstats height\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblockstats\", btcjson.HashOrHeight{Value: 123})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockStatsCmd(btcjson.HashOrHeight{Value: 123}, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblockstats\",\"params\":[123],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockStatsCmd{\n\t\t\t\tHashOrHeight: btcjson.HashOrHeight{Value: 123},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getblockstats hash\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblockstats\", btcjson.HashOrHeight{Value: \"deadbeef\"})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockStatsCmd(btcjson.HashOrHeight{Value: \"deadbeef\"}, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblockstats\",\"params\":[\"deadbeef\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockStatsCmd{\n\t\t\t\tHashOrHeight: btcjson.HashOrHeight{Value: \"deadbeef\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getblockstats height optional stats\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblockstats\", btcjson.HashOrHeight{Value: 123}, []string{\"avgfee\", \"maxfee\"})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockStatsCmd(btcjson.HashOrHeight{Value: 123}, &[]string{\"avgfee\", \"maxfee\"})\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblockstats\",\"params\":[123,[\"avgfee\",\"maxfee\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockStatsCmd{\n\t\t\t\tHashOrHeight: btcjson.HashOrHeight{Value: 123},\n\t\t\t\tStats:        &[]string{\"avgfee\", \"maxfee\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getblockstats hash optional stats\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblockstats\", btcjson.HashOrHeight{Value: \"deadbeef\"}, []string{\"avgfee\", \"maxfee\"})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockStatsCmd(btcjson.HashOrHeight{Value: \"deadbeef\"}, &[]string{\"avgfee\", \"maxfee\"})\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblockstats\",\"params\":[\"deadbeef\",[\"avgfee\",\"maxfee\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockStatsCmd{\n\t\t\t\tHashOrHeight: btcjson.HashOrHeight{Value: \"deadbeef\"},\n\t\t\t\tStats:        &[]string{\"avgfee\", \"maxfee\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getblocktemplate\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblocktemplate\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBlockTemplateCmd(nil)\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getblocktemplate\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockTemplateCmd{Request: nil},\n\t\t},\n\t\t{\n\t\t\tname: \"getblocktemplate optional - template request\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblocktemplate\", `{\"mode\":\"template\",\"capabilities\":[\"longpoll\",\"coinbasetxn\"]}`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttemplate := btcjson.TemplateRequest{\n\t\t\t\t\tMode:         \"template\",\n\t\t\t\t\tCapabilities: []string{\"longpoll\", \"coinbasetxn\"},\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewGetBlockTemplateCmd(&template)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblocktemplate\",\"params\":[{\"mode\":\"template\",\"capabilities\":[\"longpoll\",\"coinbasetxn\"]}],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockTemplateCmd{\n\t\t\t\tRequest: &btcjson.TemplateRequest{\n\t\t\t\t\tMode:         \"template\",\n\t\t\t\t\tCapabilities: []string{\"longpoll\", \"coinbasetxn\"},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getblocktemplate optional - template request with tweaks\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblocktemplate\", `{\"mode\":\"template\",\"capabilities\":[\"longpoll\",\"coinbasetxn\"],\"sigoplimit\":500,\"sizelimit\":100000000,\"maxversion\":2}`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttemplate := btcjson.TemplateRequest{\n\t\t\t\t\tMode:         \"template\",\n\t\t\t\t\tCapabilities: []string{\"longpoll\", \"coinbasetxn\"},\n\t\t\t\t\tSigOpLimit:   500,\n\t\t\t\t\tSizeLimit:    100000000,\n\t\t\t\t\tMaxVersion:   2,\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewGetBlockTemplateCmd(&template)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblocktemplate\",\"params\":[{\"mode\":\"template\",\"capabilities\":[\"longpoll\",\"coinbasetxn\"],\"sigoplimit\":500,\"sizelimit\":100000000,\"maxversion\":2}],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockTemplateCmd{\n\t\t\t\tRequest: &btcjson.TemplateRequest{\n\t\t\t\t\tMode:         \"template\",\n\t\t\t\t\tCapabilities: []string{\"longpoll\", \"coinbasetxn\"},\n\t\t\t\t\tSigOpLimit:   int64(500),\n\t\t\t\t\tSizeLimit:    int64(100000000),\n\t\t\t\t\tMaxVersion:   2,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getblocktemplate optional - template request with tweaks 2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getblocktemplate\", `{\"mode\":\"template\",\"capabilities\":[\"longpoll\",\"coinbasetxn\"],\"sigoplimit\":true,\"sizelimit\":100000000,\"maxversion\":2}`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttemplate := btcjson.TemplateRequest{\n\t\t\t\t\tMode:         \"template\",\n\t\t\t\t\tCapabilities: []string{\"longpoll\", \"coinbasetxn\"},\n\t\t\t\t\tSigOpLimit:   true,\n\t\t\t\t\tSizeLimit:    100000000,\n\t\t\t\t\tMaxVersion:   2,\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewGetBlockTemplateCmd(&template)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getblocktemplate\",\"params\":[{\"mode\":\"template\",\"capabilities\":[\"longpoll\",\"coinbasetxn\"],\"sigoplimit\":true,\"sizelimit\":100000000,\"maxversion\":2}],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBlockTemplateCmd{\n\t\t\t\tRequest: &btcjson.TemplateRequest{\n\t\t\t\t\tMode:         \"template\",\n\t\t\t\t\tCapabilities: []string{\"longpoll\", \"coinbasetxn\"},\n\t\t\t\t\tSigOpLimit:   true,\n\t\t\t\t\tSizeLimit:    int64(100000000),\n\t\t\t\t\tMaxVersion:   2,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getcfilter\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getcfilter\", \"123\",\n\t\t\t\t\twire.GCSFilterRegular)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetCFilterCmd(\"123\",\n\t\t\t\t\twire.GCSFilterRegular)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getcfilter\",\"params\":[\"123\",0],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetCFilterCmd{\n\t\t\t\tHash:       \"123\",\n\t\t\t\tFilterType: wire.GCSFilterRegular,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getcfilterheader\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getcfilterheader\", \"123\",\n\t\t\t\t\twire.GCSFilterRegular)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetCFilterHeaderCmd(\"123\",\n\t\t\t\t\twire.GCSFilterRegular)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getcfilterheader\",\"params\":[\"123\",0],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetCFilterHeaderCmd{\n\t\t\t\tHash:       \"123\",\n\t\t\t\tFilterType: wire.GCSFilterRegular,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getchaintips\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getchaintips\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetChainTipsCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getchaintips\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetChainTipsCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getchaintxstats\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getchaintxstats\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetChainTxStatsCmd(nil, nil)\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getchaintxstats\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetChainTxStatsCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getchaintxstats optional nblocks\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getchaintxstats\", btcjson.Int32(1000))\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetChainTxStatsCmd(btcjson.Int32(1000), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getchaintxstats\",\"params\":[1000],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetChainTxStatsCmd{\n\t\t\t\tNBlocks: btcjson.Int32(1000),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getchaintxstats optional nblocks and blockhash\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getchaintxstats\", btcjson.Int32(1000), btcjson.String(\"0000afaf\"))\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetChainTxStatsCmd(btcjson.Int32(1000), btcjson.String(\"0000afaf\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getchaintxstats\",\"params\":[1000,\"0000afaf\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetChainTxStatsCmd{\n\t\t\t\tNBlocks:   btcjson.Int32(1000),\n\t\t\t\tBlockHash: btcjson.String(\"0000afaf\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getconnectioncount\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getconnectioncount\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetConnectionCountCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getconnectioncount\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetConnectionCountCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getdifficulty\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getdifficulty\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetDifficultyCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getdifficulty\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetDifficultyCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getgenerate\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getgenerate\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetGenerateCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getgenerate\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetGenerateCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"gethashespersec\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"gethashespersec\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetHashesPerSecCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"gethashespersec\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetHashesPerSecCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getinfo\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getinfo\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetInfoCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getinfo\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetInfoCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getmempoolentry\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getmempoolentry\", \"txhash\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetMempoolEntryCmd(\"txhash\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getmempoolentry\",\"params\":[\"txhash\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetMempoolEntryCmd{\n\t\t\t\tTxID: \"txhash\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getmempoolinfo\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getmempoolinfo\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetMempoolInfoCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getmempoolinfo\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetMempoolInfoCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getmininginfo\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getmininginfo\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetMiningInfoCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getmininginfo\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetMiningInfoCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getnetworkinfo\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getnetworkinfo\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetNetworkInfoCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getnetworkinfo\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetNetworkInfoCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getnettotals\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getnettotals\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetNetTotalsCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getnettotals\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetNetTotalsCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getnetworkhashps\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getnetworkhashps\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetNetworkHashPSCmd(nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getnetworkhashps\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetNetworkHashPSCmd{\n\t\t\t\tBlocks: btcjson.Int(120),\n\t\t\t\tHeight: btcjson.Int(-1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getnetworkhashps optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getnetworkhashps\", 200)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetNetworkHashPSCmd(btcjson.Int(200), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getnetworkhashps\",\"params\":[200],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetNetworkHashPSCmd{\n\t\t\t\tBlocks: btcjson.Int(200),\n\t\t\t\tHeight: btcjson.Int(-1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getnetworkhashps optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getnetworkhashps\", 200, 123)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetNetworkHashPSCmd(btcjson.Int(200), btcjson.Int(123))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getnetworkhashps\",\"params\":[200,123],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetNetworkHashPSCmd{\n\t\t\t\tBlocks: btcjson.Int(200),\n\t\t\t\tHeight: btcjson.Int(123),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getnodeaddresses\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getnodeaddresses\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetNodeAddressesCmd(nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getnodeaddresses\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetNodeAddressesCmd{\n\t\t\t\tCount: btcjson.Int32(1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getnodeaddresses optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getnodeaddresses\", 10)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetNodeAddressesCmd(btcjson.Int32(10))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getnodeaddresses\",\"params\":[10],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetNodeAddressesCmd{\n\t\t\t\tCount: btcjson.Int32(10),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getpeerinfo\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getpeerinfo\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetPeerInfoCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getpeerinfo\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetPeerInfoCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getrawmempool\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getrawmempool\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetRawMempoolCmd(nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getrawmempool\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetRawMempoolCmd{\n\t\t\t\tVerbose: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getrawmempool optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getrawmempool\", false)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetRawMempoolCmd(btcjson.Bool(false))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getrawmempool\",\"params\":[false],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetRawMempoolCmd{\n\t\t\t\tVerbose: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getrawtransaction\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getrawtransaction\", \"123\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetRawTransactionCmd(\"123\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getrawtransaction\",\"params\":[\"123\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetRawTransactionCmd{\n\t\t\t\tTxid:    \"123\",\n\t\t\t\tVerbose: btcjson.Int(0),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getrawtransaction optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getrawtransaction\", \"123\", 1)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetRawTransactionCmd(\"123\", btcjson.Int(1))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getrawtransaction\",\"params\":[\"123\",1],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetRawTransactionCmd{\n\t\t\t\tTxid:    \"123\",\n\t\t\t\tVerbose: btcjson.Int(1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"gettxout\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"gettxout\", \"123\", 1)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetTxOutCmd(\"123\", 1, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"gettxout\",\"params\":[\"123\",1],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetTxOutCmd{\n\t\t\t\tTxid:           \"123\",\n\t\t\t\tVout:           1,\n\t\t\t\tIncludeMempool: btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"gettxout optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"gettxout\", \"123\", 1, true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetTxOutCmd(\"123\", 1, btcjson.Bool(true))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"gettxout\",\"params\":[\"123\",1,true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetTxOutCmd{\n\t\t\t\tTxid:           \"123\",\n\t\t\t\tVout:           1,\n\t\t\t\tIncludeMempool: btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"gettxoutproof\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"gettxoutproof\", []string{\"123\", \"456\"})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetTxOutProofCmd([]string{\"123\", \"456\"}, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"gettxoutproof\",\"params\":[[\"123\",\"456\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetTxOutProofCmd{\n\t\t\t\tTxIDs: []string{\"123\", \"456\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"gettxoutproof optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"gettxoutproof\", []string{\"123\", \"456\"},\n\t\t\t\t\tbtcjson.String(\"000000000000034a7dedef4a161fa058a2d67a173a90155f3a2fe6fc132e0ebf\"))\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetTxOutProofCmd([]string{\"123\", \"456\"},\n\t\t\t\t\tbtcjson.String(\"000000000000034a7dedef4a161fa058a2d67a173a90155f3a2fe6fc132e0ebf\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"gettxoutproof\",\"params\":[[\"123\",\"456\"],` +\n\t\t\t\t`\"000000000000034a7dedef4a161fa058a2d67a173a90155f3a2fe6fc132e0ebf\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetTxOutProofCmd{\n\t\t\t\tTxIDs:     []string{\"123\", \"456\"},\n\t\t\t\tBlockHash: btcjson.String(\"000000000000034a7dedef4a161fa058a2d67a173a90155f3a2fe6fc132e0ebf\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"gettxoutsetinfo\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"gettxoutsetinfo\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetTxOutSetInfoCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"gettxoutsetinfo\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetTxOutSetInfoCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getwork\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getwork\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetWorkCmd(nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getwork\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetWorkCmd{\n\t\t\t\tData: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getwork optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getwork\", \"00112233\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetWorkCmd(btcjson.String(\"00112233\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getwork\",\"params\":[\"00112233\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetWorkCmd{\n\t\t\t\tData: btcjson.String(\"00112233\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"help\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"help\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewHelpCmd(nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"help\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.HelpCmd{\n\t\t\t\tCommand: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"help optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"help\", \"getblock\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewHelpCmd(btcjson.String(\"getblock\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"help\",\"params\":[\"getblock\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.HelpCmd{\n\t\t\t\tCommand: btcjson.String(\"getblock\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"invalidateblock\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"invalidateblock\", \"123\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewInvalidateBlockCmd(\"123\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"invalidateblock\",\"params\":[\"123\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.InvalidateBlockCmd{\n\t\t\t\tBlockHash: \"123\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"ping\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"ping\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewPingCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"ping\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.PingCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"preciousblock\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"preciousblock\", \"0123\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewPreciousBlockCmd(\"0123\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"preciousblock\",\"params\":[\"0123\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.PreciousBlockCmd{\n\t\t\t\tBlockHash: \"0123\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"reconsiderblock\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"reconsiderblock\", \"123\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewReconsiderBlockCmd(\"123\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"reconsiderblock\",\"params\":[\"123\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ReconsiderBlockCmd{\n\t\t\t\tBlockHash: \"123\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"searchrawtransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"searchrawtransactions\", \"1Address\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSearchRawTransactionsCmd(\"1Address\", nil, nil, nil, nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"searchrawtransactions\",\"params\":[\"1Address\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SearchRawTransactionsCmd{\n\t\t\t\tAddress:     \"1Address\",\n\t\t\t\tVerbose:     btcjson.Int(1),\n\t\t\t\tSkip:        btcjson.Int(0),\n\t\t\t\tCount:       btcjson.Int(100),\n\t\t\t\tVinExtra:    btcjson.Int(0),\n\t\t\t\tReverse:     btcjson.Bool(false),\n\t\t\t\tFilterAddrs: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"searchrawtransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"searchrawtransactions\", \"1Address\", 0)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSearchRawTransactionsCmd(\"1Address\",\n\t\t\t\t\tbtcjson.Int(0), nil, nil, nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"searchrawtransactions\",\"params\":[\"1Address\",0],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SearchRawTransactionsCmd{\n\t\t\t\tAddress:     \"1Address\",\n\t\t\t\tVerbose:     btcjson.Int(0),\n\t\t\t\tSkip:        btcjson.Int(0),\n\t\t\t\tCount:       btcjson.Int(100),\n\t\t\t\tVinExtra:    btcjson.Int(0),\n\t\t\t\tReverse:     btcjson.Bool(false),\n\t\t\t\tFilterAddrs: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"searchrawtransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"searchrawtransactions\", \"1Address\", 0, 5)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSearchRawTransactionsCmd(\"1Address\",\n\t\t\t\t\tbtcjson.Int(0), btcjson.Int(5), nil, nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"searchrawtransactions\",\"params\":[\"1Address\",0,5],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SearchRawTransactionsCmd{\n\t\t\t\tAddress:     \"1Address\",\n\t\t\t\tVerbose:     btcjson.Int(0),\n\t\t\t\tSkip:        btcjson.Int(5),\n\t\t\t\tCount:       btcjson.Int(100),\n\t\t\t\tVinExtra:    btcjson.Int(0),\n\t\t\t\tReverse:     btcjson.Bool(false),\n\t\t\t\tFilterAddrs: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"searchrawtransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"searchrawtransactions\", \"1Address\", 0, 5, 10)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSearchRawTransactionsCmd(\"1Address\",\n\t\t\t\t\tbtcjson.Int(0), btcjson.Int(5), btcjson.Int(10), nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"searchrawtransactions\",\"params\":[\"1Address\",0,5,10],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SearchRawTransactionsCmd{\n\t\t\t\tAddress:     \"1Address\",\n\t\t\t\tVerbose:     btcjson.Int(0),\n\t\t\t\tSkip:        btcjson.Int(5),\n\t\t\t\tCount:       btcjson.Int(10),\n\t\t\t\tVinExtra:    btcjson.Int(0),\n\t\t\t\tReverse:     btcjson.Bool(false),\n\t\t\t\tFilterAddrs: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"searchrawtransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"searchrawtransactions\", \"1Address\", 0, 5, 10, 1)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSearchRawTransactionsCmd(\"1Address\",\n\t\t\t\t\tbtcjson.Int(0), btcjson.Int(5), btcjson.Int(10), btcjson.Int(1), nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"searchrawtransactions\",\"params\":[\"1Address\",0,5,10,1],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SearchRawTransactionsCmd{\n\t\t\t\tAddress:     \"1Address\",\n\t\t\t\tVerbose:     btcjson.Int(0),\n\t\t\t\tSkip:        btcjson.Int(5),\n\t\t\t\tCount:       btcjson.Int(10),\n\t\t\t\tVinExtra:    btcjson.Int(1),\n\t\t\t\tReverse:     btcjson.Bool(false),\n\t\t\t\tFilterAddrs: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"searchrawtransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"searchrawtransactions\", \"1Address\", 0, 5, 10, 1, true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSearchRawTransactionsCmd(\"1Address\",\n\t\t\t\t\tbtcjson.Int(0), btcjson.Int(5), btcjson.Int(10), btcjson.Int(1), btcjson.Bool(true), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"searchrawtransactions\",\"params\":[\"1Address\",0,5,10,1,true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SearchRawTransactionsCmd{\n\t\t\t\tAddress:     \"1Address\",\n\t\t\t\tVerbose:     btcjson.Int(0),\n\t\t\t\tSkip:        btcjson.Int(5),\n\t\t\t\tCount:       btcjson.Int(10),\n\t\t\t\tVinExtra:    btcjson.Int(1),\n\t\t\t\tReverse:     btcjson.Bool(true),\n\t\t\t\tFilterAddrs: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"searchrawtransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"searchrawtransactions\", \"1Address\", 0, 5, 10, 1, true, []string{\"1Address\"})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSearchRawTransactionsCmd(\"1Address\",\n\t\t\t\t\tbtcjson.Int(0), btcjson.Int(5), btcjson.Int(10), btcjson.Int(1), btcjson.Bool(true), &[]string{\"1Address\"})\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"searchrawtransactions\",\"params\":[\"1Address\",0,5,10,1,true,[\"1Address\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SearchRawTransactionsCmd{\n\t\t\t\tAddress:     \"1Address\",\n\t\t\t\tVerbose:     btcjson.Int(0),\n\t\t\t\tSkip:        btcjson.Int(5),\n\t\t\t\tCount:       btcjson.Int(10),\n\t\t\t\tVinExtra:    btcjson.Int(1),\n\t\t\t\tReverse:     btcjson.Bool(true),\n\t\t\t\tFilterAddrs: &[]string{\"1Address\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"searchrawtransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"searchrawtransactions\", \"1Address\", 0, 5, 10, \"null\", true, []string{\"1Address\"})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSearchRawTransactionsCmd(\"1Address\",\n\t\t\t\t\tbtcjson.Int(0), btcjson.Int(5), btcjson.Int(10), nil, btcjson.Bool(true), &[]string{\"1Address\"})\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"searchrawtransactions\",\"params\":[\"1Address\",0,5,10,null,true,[\"1Address\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SearchRawTransactionsCmd{\n\t\t\t\tAddress:     \"1Address\",\n\t\t\t\tVerbose:     btcjson.Int(0),\n\t\t\t\tSkip:        btcjson.Int(5),\n\t\t\t\tCount:       btcjson.Int(10),\n\t\t\t\tVinExtra:    nil,\n\t\t\t\tReverse:     btcjson.Bool(true),\n\t\t\t\tFilterAddrs: &[]string{\"1Address\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendrawtransaction\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendrawtransaction\", \"1122\", &btcjson.AllowHighFeesOrMaxFeeRate{})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSendRawTransactionCmd(\"1122\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendrawtransaction\",\"params\":[\"1122\",false],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendRawTransactionCmd{\n\t\t\t\tHexTx: \"1122\",\n\t\t\t\tFeeSetting: &btcjson.AllowHighFeesOrMaxFeeRate{\n\t\t\t\t\tValue: btcjson.Bool(false),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendrawtransaction optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendrawtransaction\", \"1122\", &btcjson.AllowHighFeesOrMaxFeeRate{Value: btcjson.Bool(false)})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSendRawTransactionCmd(\"1122\", btcjson.Bool(false))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendrawtransaction\",\"params\":[\"1122\",false],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendRawTransactionCmd{\n\t\t\t\tHexTx: \"1122\",\n\t\t\t\tFeeSetting: &btcjson.AllowHighFeesOrMaxFeeRate{\n\t\t\t\t\tValue: btcjson.Bool(false),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendrawtransaction optional, bitcoind >= 0.19.0\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendrawtransaction\", \"1122\", &btcjson.AllowHighFeesOrMaxFeeRate{Value: btcjson.Float64(0.1234)})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewBitcoindSendRawTransactionCmd(\"1122\", 0.1234)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendrawtransaction\",\"params\":[\"1122\",0.1234],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendRawTransactionCmd{\n\t\t\t\tHexTx: \"1122\",\n\t\t\t\tFeeSetting: &btcjson.AllowHighFeesOrMaxFeeRate{\n\t\t\t\t\tValue: btcjson.Float64(0.1234),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"setgenerate\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"setgenerate\", true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSetGenerateCmd(true, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"setgenerate\",\"params\":[true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SetGenerateCmd{\n\t\t\t\tGenerate:     true,\n\t\t\t\tGenProcLimit: btcjson.Int(-1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"setgenerate optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"setgenerate\", true, 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSetGenerateCmd(true, btcjson.Int(6))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"setgenerate\",\"params\":[true,6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SetGenerateCmd{\n\t\t\t\tGenerate:     true,\n\t\t\t\tGenProcLimit: btcjson.Int(6),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"signmessagewithprivkey\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"signmessagewithprivkey\", \"5Hue\", \"Hey\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSignMessageWithPrivKey(\"5Hue\", \"Hey\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"signmessagewithprivkey\",\"params\":[\"5Hue\",\"Hey\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SignMessageWithPrivKeyCmd{\n\t\t\t\tPrivKey: \"5Hue\",\n\t\t\t\tMessage: \"Hey\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"stop\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"stop\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewStopCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"stop\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.StopCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"submitblock\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"submitblock\", \"112233\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSubmitBlockCmd(\"112233\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"submitblock\",\"params\":[\"112233\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SubmitBlockCmd{\n\t\t\t\tHexBlock: \"112233\",\n\t\t\t\tOptions:  nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"submitblock optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"submitblock\", \"112233\", `{\"workid\":\"12345\"}`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\toptions := btcjson.SubmitBlockOptions{\n\t\t\t\t\tWorkID: \"12345\",\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewSubmitBlockCmd(\"112233\", &options)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"submitblock\",\"params\":[\"112233\",{\"workid\":\"12345\"}],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SubmitBlockCmd{\n\t\t\t\tHexBlock: \"112233\",\n\t\t\t\tOptions: &btcjson.SubmitBlockOptions{\n\t\t\t\t\tWorkID: \"12345\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"uptime\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"uptime\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewUptimeCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"uptime\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.UptimeCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"validateaddress\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"validateaddress\", \"1Address\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewValidateAddressCmd(\"1Address\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"validateaddress\",\"params\":[\"1Address\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ValidateAddressCmd{\n\t\t\t\tAddress: \"1Address\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"verifychain\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"verifychain\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewVerifyChainCmd(nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"verifychain\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.VerifyChainCmd{\n\t\t\t\tCheckLevel: btcjson.Int32(3),\n\t\t\t\tCheckDepth: btcjson.Int32(288),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"verifychain optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"verifychain\", 2)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewVerifyChainCmd(btcjson.Int32(2), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"verifychain\",\"params\":[2],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.VerifyChainCmd{\n\t\t\t\tCheckLevel: btcjson.Int32(2),\n\t\t\t\tCheckDepth: btcjson.Int32(288),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"verifychain optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"verifychain\", 2, 500)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewVerifyChainCmd(btcjson.Int32(2), btcjson.Int32(500))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"verifychain\",\"params\":[2,500],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.VerifyChainCmd{\n\t\t\t\tCheckLevel: btcjson.Int32(2),\n\t\t\t\tCheckDepth: btcjson.Int32(500),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"verifymessage\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"verifymessage\", \"1Address\", \"301234\", \"test\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewVerifyMessageCmd(\"1Address\", \"301234\", \"test\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"verifymessage\",\"params\":[\"1Address\",\"301234\",\"test\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.VerifyMessageCmd{\n\t\t\t\tAddress:   \"1Address\",\n\t\t\t\tSignature: \"301234\",\n\t\t\t\tMessage:   \"test\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"verifytxoutproof\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"verifytxoutproof\", \"test\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewVerifyTxOutProofCmd(\"test\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"verifytxoutproof\",\"params\":[\"test\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.VerifyTxOutProofCmd{\n\t\t\t\tProof: \"test\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getdescriptorinfo\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getdescriptorinfo\", \"123\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetDescriptorInfoCmd(\"123\")\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getdescriptorinfo\",\"params\":[\"123\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetDescriptorInfoCmd{Descriptor: \"123\"},\n\t\t},\n\t\t{\n\t\t\tname: \"getzmqnotifications\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getzmqnotifications\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetZmqNotificationsCmd()\n\t\t\t},\n\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getzmqnotifications\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetZmqNotificationsCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"testmempoolaccept\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"testmempoolaccept\", []string{\"rawhex\"}, 0.1)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewTestMempoolAcceptCmd([]string{\"rawhex\"}, 0.1)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"testmempoolaccept\",\"params\":[[\"rawhex\"],0.1],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.TestMempoolAcceptCmd{\n\t\t\t\tRawTxns:    []string{\"rawhex\"},\n\t\t\t\tMaxFeeRate: 0.1,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"testmempoolaccept with maxfeerate\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"testmempoolaccept\", []string{\"rawhex\"}, 0.01)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewTestMempoolAcceptCmd([]string{\"rawhex\"}, 0.01)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"testmempoolaccept\",\"params\":[[\"rawhex\"],0.01],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.TestMempoolAcceptCmd{\n\t\t\t\tRawTxns:    []string{\"rawhex\"},\n\t\t\t\tMaxFeeRate: 0.01,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"gettxspendingprevout\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"gettxspendingprevout\",\n\t\t\t\t\t[]*btcjson.GetTxSpendingPrevOutCmdOutput{\n\t\t\t\t\t\t{Txid: \"0000000000000000000000000000000000000000000000000000000000000001\", Vout: 0},\n\t\t\t\t\t})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\toutputs := []wire.OutPoint{\n\t\t\t\t\t{Hash: chainhash.Hash{1}, Index: 0},\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewGetTxSpendingPrevOutCmd(outputs)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"gettxspendingprevout\",\"params\":[[{\"txid\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"vout\":0}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetTxSpendingPrevOutCmd{\n\t\t\t\tOutputs: []*btcjson.GetTxSpendingPrevOutCmdOutput{{\n\t\t\t\t\tTxid: \"0000000000000000000000000000000000000000000000000000000000000001\",\n\t\t\t\t\tVout: 0,\n\t\t\t\t}},\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Marshal the command as created by the new static command\n\t\t// creation function.\n\t\tmarshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd())\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tt.Errorf(\"\\n%s\\n%s\", marshalled, test.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the command is created without error via the generic\n\t\t// new command creation function.\n\t\tcmd, err := test.newCmd()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected NewCmd error: %v \",\n\t\t\t\ti, test.name, err)\n\t\t}\n\n\t\t// Marshal the command as created by the generic new command\n\t\t// creation function.\n\t\tmarshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar request btcjson.Request\n\t\tif err := json.Unmarshal(marshalled, &request); err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error while \"+\n\t\t\t\t\"unmarshalling JSON-RPC request: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tcmd, err = btcjson.UnmarshalCmd(&request)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"UnmarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(cmd, test.unmarshalled) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected unmarshalled command \"+\n\t\t\t\t\"- got %s, want %s\", i, test.name,\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\", cmd),\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\\n\", test.unmarshalled))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestChainSvrCmdErrors ensures any errors that occur in the command during\n// custom mashal and unmarshal are as expected.\nfunc TestChainSvrCmdErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname       string\n\t\tresult     interface{}\n\t\tmarshalled string\n\t\terr        error\n\t}{\n\t\t{\n\t\t\tname:       \"template request with invalid type\",\n\t\t\tresult:     &btcjson.TemplateRequest{},\n\t\t\tmarshalled: `{\"mode\":1}`,\n\t\t\terr:        &json.UnmarshalTypeError{},\n\t\t},\n\t\t{\n\t\t\tname:       \"invalid template request sigoplimit field\",\n\t\t\tresult:     &btcjson.TemplateRequest{},\n\t\t\tmarshalled: `{\"sigoplimit\":\"invalid\"}`,\n\t\t\terr:        btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname:       \"invalid template request sizelimit field\",\n\t\t\tresult:     &btcjson.TemplateRequest{},\n\t\t\tmarshalled: `{\"sizelimit\":\"invalid\"}`,\n\t\t\terr:        btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\terr := json.Unmarshal([]byte(test.marshalled), &test.result)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Test #%d (%s) wrong error - got %T (%v), \"+\n\t\t\t\t\"want %T\", i, test.name, err, err, test.err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif terr, ok := test.err.(btcjson.Error); ok {\n\t\t\tgotErrorCode := err.(btcjson.Error).ErrorCode\n\t\t\tif gotErrorCode != terr.ErrorCode {\n\t\t\t\tt.Errorf(\"Test #%d (%s) mismatched error code \"+\n\t\t\t\t\t\"- got %v (%v), want %v\", i, test.name,\n\t\t\t\t\tgotErrorCode, terr, terr.ErrorCode)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/chainsvrresults.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// GetBlockHeaderVerboseResult models the data from the getblockheader command when\n// the verbose flag is set.  When the verbose flag is not set, getblockheader\n// returns a hex-encoded string.\ntype GetBlockHeaderVerboseResult struct {\n\tHash          string  `json:\"hash\"`\n\tConfirmations int64   `json:\"confirmations\"`\n\tHeight        int32   `json:\"height\"`\n\tVersion       int32   `json:\"version\"`\n\tVersionHex    string  `json:\"versionHex\"`\n\tMerkleRoot    string  `json:\"merkleroot\"`\n\tTime          int64   `json:\"time\"`\n\tNonce         uint64  `json:\"nonce\"`\n\tBits          string  `json:\"bits\"`\n\tDifficulty    float64 `json:\"difficulty\"`\n\tPreviousHash  string  `json:\"previousblockhash,omitempty\"`\n\tNextHash      string  `json:\"nextblockhash,omitempty\"`\n}\n\n// GetBlockStatsResult models the data from the getblockstats command.\ntype GetBlockStatsResult struct {\n\tAverageFee         int64   `json:\"avgfee\"`\n\tAverageFeeRate     int64   `json:\"avgfeerate\"`\n\tAverageTxSize      int64   `json:\"avgtxsize\"`\n\tFeeratePercentiles []int64 `json:\"feerate_percentiles\"`\n\tHash               string  `json:\"blockhash\"`\n\tHeight             int64   `json:\"height\"`\n\tIns                int64   `json:\"ins\"`\n\tMaxFee             int64   `json:\"maxfee\"`\n\tMaxFeeRate         int64   `json:\"maxfeerate\"`\n\tMaxTxSize          int64   `json:\"maxtxsize\"`\n\tMedianFee          int64   `json:\"medianfee\"`\n\tMedianTime         int64   `json:\"mediantime\"`\n\tMedianTxSize       int64   `json:\"mediantxsize\"`\n\tMinFee             int64   `json:\"minfee\"`\n\tMinFeeRate         int64   `json:\"minfeerate\"`\n\tMinTxSize          int64   `json:\"mintxsize\"`\n\tOuts               int64   `json:\"outs\"`\n\tSegWitTotalSize    int64   `json:\"swtotal_size\"`\n\tSegWitTotalWeight  int64   `json:\"swtotal_weight\"`\n\tSegWitTxs          int64   `json:\"swtxs\"`\n\tSubsidy            int64   `json:\"subsidy\"`\n\tTime               int64   `json:\"time\"`\n\tTotalOut           int64   `json:\"total_out\"`\n\tTotalSize          int64   `json:\"total_size\"`\n\tTotalWeight        int64   `json:\"total_weight\"`\n\tTxs                int64   `json:\"txs\"`\n\tUTXOIncrease       int64   `json:\"utxo_increase\"`\n\tUTXOSizeIncrease   int64   `json:\"utxo_size_inc\"`\n}\n\n// GetBlockVerboseResult models the data from the getblock command when the\n// verbose flag is set to 1.  When the verbose flag is set to 0, getblock returns a\n// hex-encoded string. When the verbose flag is set to 1, getblock returns an object\n// whose tx field is an array of transaction hashes. When the verbose flag is set to 2,\n// getblock returns an object whose tx field is an array of raw transactions.\n// Use GetBlockVerboseTxResult to unmarshal data received from passing verbose=2 to getblock.\ntype GetBlockVerboseResult struct {\n\tHash          string        `json:\"hash\"`\n\tConfirmations int64         `json:\"confirmations\"`\n\tStrippedSize  int32         `json:\"strippedsize\"`\n\tSize          int32         `json:\"size\"`\n\tWeight        int32         `json:\"weight\"`\n\tHeight        int64         `json:\"height\"`\n\tVersion       int32         `json:\"version\"`\n\tVersionHex    string        `json:\"versionHex\"`\n\tMerkleRoot    string        `json:\"merkleroot\"`\n\tTx            []string      `json:\"tx,omitempty\"`\n\tRawTx         []TxRawResult `json:\"rawtx,omitempty\"` // Note: this field is always empty when verbose != 2.\n\tTime          int64         `json:\"time\"`\n\tNonce         uint32        `json:\"nonce\"`\n\tBits          string        `json:\"bits\"`\n\tDifficulty    float64       `json:\"difficulty\"`\n\tPreviousHash  string        `json:\"previousblockhash\"`\n\tNextHash      string        `json:\"nextblockhash,omitempty\"`\n}\n\n// GetBlockVerboseTxResult models the data from the getblock command when the\n// verbose flag is set to 2.  When the verbose flag is set to 0, getblock returns a\n// hex-encoded string. When the verbose flag is set to 1, getblock returns an object\n// whose tx field is an array of transaction hashes. When the verbose flag is set to 2,\n// getblock returns an object whose tx field is an array of raw transactions.\n// Use GetBlockVerboseResult to unmarshal data received from passing verbose=1 to getblock.\ntype GetBlockVerboseTxResult struct {\n\tHash          string        `json:\"hash\"`\n\tConfirmations int64         `json:\"confirmations\"`\n\tStrippedSize  int32         `json:\"strippedsize\"`\n\tSize          int32         `json:\"size\"`\n\tWeight        int32         `json:\"weight\"`\n\tHeight        int64         `json:\"height\"`\n\tVersion       int32         `json:\"version\"`\n\tVersionHex    string        `json:\"versionHex\"`\n\tMerkleRoot    string        `json:\"merkleroot\"`\n\tTx            []TxRawResult `json:\"tx,omitempty\"`\n\tRawTx         []TxRawResult `json:\"rawtx,omitempty\"` // Deprecated: removed in Bitcoin Core\n\tTime          int64         `json:\"time\"`\n\tNonce         uint32        `json:\"nonce\"`\n\tBits          string        `json:\"bits\"`\n\tDifficulty    float64       `json:\"difficulty\"`\n\tPreviousHash  string        `json:\"previousblockhash\"`\n\tNextHash      string        `json:\"nextblockhash,omitempty\"`\n}\n\n// GetChainTipsResult models the data from the getchaintips command.\ntype GetChainTipsResult struct {\n\tHeight    int32  `json:\"height\"`\n\tHash      string `json:\"hash\"`\n\tBranchLen int32  `json:\"branchlen\"`\n\tStatus    string `json:\"status\"`\n}\n\n// GetChainTxStatsResult models the data from the getchaintxstats command.\ntype GetChainTxStatsResult struct {\n\tTime                   int64   `json:\"time\"`\n\tTxCount                int64   `json:\"txcount\"`\n\tWindowFinalBlockHash   string  `json:\"window_final_block_hash\"`\n\tWindowFinalBlockHeight int32   `json:\"window_final_block_height\"`\n\tWindowBlockCount       int32   `json:\"window_block_count\"`\n\tWindowTxCount          int32   `json:\"window_tx_count\"`\n\tWindowInterval         int32   `json:\"window_interval\"`\n\tTxRate                 float64 `json:\"txrate\"`\n}\n\n// CreateMultiSigResult models the data returned from the createmultisig\n// command.\ntype CreateMultiSigResult struct {\n\tAddress      string `json:\"address\"`\n\tRedeemScript string `json:\"redeemScript\"`\n}\n\n// DecodeScriptResult models the data returned from the decodescript command.\ntype DecodeScriptResult struct {\n\tAsm       string   `json:\"asm\"`\n\tReqSigs   int32    `json:\"reqSigs,omitempty\"` // Deprecated: removed in Bitcoin Core\n\tType      string   `json:\"type\"`\n\tAddress   string   `json:\"address,omitempty\"`\n\tAddresses []string `json:\"addresses,omitempty\"` // Deprecated: removed in Bitcoin Core\n\tP2sh      string   `json:\"p2sh,omitempty\"`\n}\n\n// GetAddedNodeInfoResultAddr models the data of the addresses portion of the\n// getaddednodeinfo command.\ntype GetAddedNodeInfoResultAddr struct {\n\tAddress   string `json:\"address\"`\n\tConnected string `json:\"connected\"`\n}\n\n// GetAddedNodeInfoResult models the data from the getaddednodeinfo command.\ntype GetAddedNodeInfoResult struct {\n\tAddedNode string                        `json:\"addednode\"`\n\tConnected *bool                         `json:\"connected,omitempty\"`\n\tAddresses *[]GetAddedNodeInfoResultAddr `json:\"addresses,omitempty\"`\n}\n\n// SoftForkDescription describes the current state of a soft-fork which was\n// deployed using a super-majority block signalling.\ntype SoftForkDescription struct {\n\tID      string `json:\"id\"`\n\tVersion uint32 `json:\"version\"`\n\tReject  struct {\n\t\tStatus bool `json:\"status\"`\n\t} `json:\"reject\"`\n}\n\n// Bip9SoftForkDescription describes the current state of a defined BIP0009\n// version bits soft-fork.\ntype Bip9SoftForkDescription struct {\n\tStatus              string `json:\"status\"`\n\tBit                 uint8  `json:\"bit\"`\n\tStartTime1          int64  `json:\"startTime\"`\n\tStartTime2          int64  `json:\"start_time\"`\n\tTimeout             int64  `json:\"timeout\"`\n\tSince               int32  `json:\"since\"`\n\tMinActivationHeight int32  `json:\"min_activation_height\"`\n}\n\n// StartTime returns the starting time of the softfork as a Unix epoch.\nfunc (d *Bip9SoftForkDescription) StartTime() int64 {\n\tif d.StartTime1 != 0 {\n\t\treturn d.StartTime1\n\t}\n\treturn d.StartTime2\n}\n\n// SoftForks describes the current softforks enabled by the backend. Softforks\n// activated through BIP9 are grouped together separate from any other softforks\n// with different activation types.\ntype SoftForks struct {\n\tSoftForks     []*SoftForkDescription              `json:\"softforks\"`\n\tBip9SoftForks map[string]*Bip9SoftForkDescription `json:\"bip9_softforks\"`\n}\n\n// UnifiedSoftForks describes a softforks in a general manner, irrespective of\n// its activation type. This was a format introduced by bitcoind v0.19.0\ntype UnifiedSoftFork struct {\n\tType                    string                   `json:\"type\"`\n\tBIP9SoftForkDescription *Bip9SoftForkDescription `json:\"bip9\"`\n\tHeight                  int32                    `json:\"height\"`\n\tActive                  bool                     `json:\"active\"`\n}\n\n// UnifiedSoftForks describes the current softforks enabled the by the backend\n// in a unified manner, i.e, softforks with different activation types are\n// grouped together. This was a format introduced by bitcoind v0.19.0\ntype UnifiedSoftForks struct {\n\tSoftForks map[string]*UnifiedSoftFork `json:\"softforks\"`\n}\n\n// GetBlockChainInfoResult models the data returned from the getblockchaininfo\n// command.\ntype GetBlockChainInfoResult struct {\n\tChain                string  `json:\"chain\"`\n\tBlocks               int32   `json:\"blocks\"`\n\tHeaders              int32   `json:\"headers\"`\n\tBestBlockHash        string  `json:\"bestblockhash\"`\n\tDifficulty           float64 `json:\"difficulty\"`\n\tMedianTime           int64   `json:\"mediantime\"`\n\tVerificationProgress float64 `json:\"verificationprogress,omitempty\"`\n\tInitialBlockDownload bool    `json:\"initialblockdownload,omitempty\"`\n\tPruned               bool    `json:\"pruned\"`\n\tPruneHeight          int32   `json:\"pruneheight,omitempty\"`\n\tChainWork            string  `json:\"chainwork,omitempty\"`\n\tSizeOnDisk           int64   `json:\"size_on_disk,omitempty\"`\n\t*SoftForks\n\t*UnifiedSoftForks\n}\n\n// GetBlockFilterResult models the data returned from the getblockfilter\n// command.\ntype GetBlockFilterResult struct {\n\tFilter string `json:\"filter\"` // the hex-encoded filter data\n\tHeader string `json:\"header\"` // the hex-encoded filter header\n}\n\n// GetBlockTemplateResultTx models the transactions field of the\n// getblocktemplate command.\ntype GetBlockTemplateResultTx struct {\n\tData    string  `json:\"data\"`\n\tHash    string  `json:\"hash\"`\n\tTxID    string  `json:\"txid\"`\n\tDepends []int64 `json:\"depends\"`\n\tFee     int64   `json:\"fee\"`\n\tSigOps  int64   `json:\"sigops\"`\n\tWeight  int64   `json:\"weight\"`\n}\n\n// GetBlockTemplateResultAux models the coinbaseaux field of the\n// getblocktemplate command.\ntype GetBlockTemplateResultAux struct {\n\tFlags string `json:\"flags\"`\n}\n\n// GetBlockTemplateResult models the data returned from the getblocktemplate\n// command.\ntype GetBlockTemplateResult struct {\n\t// Base fields from BIP 0022.  CoinbaseAux is optional.  One of\n\t// CoinbaseTxn or CoinbaseValue must be specified, but not both.\n\tBits          string                     `json:\"bits\"`\n\tCurTime       int64                      `json:\"curtime\"`\n\tHeight        int64                      `json:\"height\"`\n\tPreviousHash  string                     `json:\"previousblockhash\"`\n\tSigOpLimit    int64                      `json:\"sigoplimit,omitempty\"`\n\tSizeLimit     int64                      `json:\"sizelimit,omitempty\"`\n\tWeightLimit   int64                      `json:\"weightlimit,omitempty\"`\n\tTransactions  []GetBlockTemplateResultTx `json:\"transactions\"`\n\tVersion       int32                      `json:\"version\"`\n\tCoinbaseAux   *GetBlockTemplateResultAux `json:\"coinbaseaux,omitempty\"`\n\tCoinbaseTxn   *GetBlockTemplateResultTx  `json:\"coinbasetxn,omitempty\"`\n\tCoinbaseValue *int64                     `json:\"coinbasevalue,omitempty\"`\n\tWorkID        string                     `json:\"workid,omitempty\"`\n\n\t// Witness commitment defined in BIP 0141.\n\tDefaultWitnessCommitment string `json:\"default_witness_commitment,omitempty\"`\n\n\t// Optional long polling from BIP 0022.\n\tLongPollID  string `json:\"longpollid,omitempty\"`\n\tLongPollURI string `json:\"longpolluri,omitempty\"`\n\tSubmitOld   *bool  `json:\"submitold,omitempty\"`\n\n\t// Basic pool extension from BIP 0023.\n\tTarget  string `json:\"target,omitempty\"`\n\tExpires int64  `json:\"expires,omitempty\"`\n\n\t// Mutations from BIP 0023.\n\tMaxTime    int64    `json:\"maxtime,omitempty\"`\n\tMinTime    int64    `json:\"mintime,omitempty\"`\n\tMutable    []string `json:\"mutable,omitempty\"`\n\tNonceRange string   `json:\"noncerange,omitempty\"`\n\n\t// Block proposal from BIP 0023.\n\tCapabilities []string `json:\"capabilities,omitempty\"`\n\tRejectReason string   `json:\"reject-reason,omitempty\"`\n}\n\n// GetMempoolEntryResult models the data returned from the getmempoolentry's\n// fee field\n\ntype MempoolFees struct {\n\tBase       float64 `json:\"base\"`\n\tModified   float64 `json:\"modified\"`\n\tAncestor   float64 `json:\"ancestor\"`\n\tDescendant float64 `json:\"descendant\"`\n}\n\n// GetMempoolEntryResult models the data returned from the getmempoolentry\n// command.\ntype GetMempoolEntryResult struct {\n\tVSize           int32       `json:\"vsize\"`\n\tSize            int32       `json:\"size\"`\n\tWeight          int64       `json:\"weight\"`\n\tFee             float64     `json:\"fee\"`\n\tModifiedFee     float64     `json:\"modifiedfee\"`\n\tTime            int64       `json:\"time\"`\n\tHeight          int64       `json:\"height\"`\n\tDescendantCount int64       `json:\"descendantcount\"`\n\tDescendantSize  int64       `json:\"descendantsize\"`\n\tDescendantFees  float64     `json:\"descendantfees\"`\n\tAncestorCount   int64       `json:\"ancestorcount\"`\n\tAncestorSize    int64       `json:\"ancestorsize\"`\n\tAncestorFees    float64     `json:\"ancestorfees\"`\n\tWTxId           string      `json:\"wtxid\"`\n\tFees            MempoolFees `json:\"fees\"`\n\tDepends         []string    `json:\"depends\"`\n}\n\n// GetMempoolInfoResult models the data returned from the getmempoolinfo\n// command.\ntype GetMempoolInfoResult struct {\n\tSize  int64 `json:\"size\"`\n\tBytes int64 `json:\"bytes\"`\n}\n\n// NetworksResult models the networks data from the getnetworkinfo command.\ntype NetworksResult struct {\n\tName                      string `json:\"name\"`\n\tLimited                   bool   `json:\"limited\"`\n\tReachable                 bool   `json:\"reachable\"`\n\tProxy                     string `json:\"proxy\"`\n\tProxyRandomizeCredentials bool   `json:\"proxy_randomize_credentials\"`\n}\n\n// LocalAddressesResult models the localaddresses data from the getnetworkinfo\n// command.\ntype LocalAddressesResult struct {\n\tAddress string `json:\"address\"`\n\tPort    uint16 `json:\"port\"`\n\tScore   int32  `json:\"score\"`\n}\n\n// StringOrArray defines a type that can be used as type that is either a single\n// string value or a string array in JSON-RPC commands, depending on the version\n// of the chain backend.\ntype StringOrArray []string\n\n// MarshalJSON implements the json.Marshaler interface.\nfunc (h StringOrArray) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(h)\n}\n\n// UnmarshalJSON implements the json.Unmarshaler interface.\nfunc (h *StringOrArray) UnmarshalJSON(data []byte) error {\n\tvar unmarshalled interface{}\n\tif err := json.Unmarshal(data, &unmarshalled); err != nil {\n\t\treturn err\n\t}\n\n\tswitch v := unmarshalled.(type) {\n\tcase string:\n\t\t*h = []string{v}\n\n\tcase []interface{}:\n\t\ts := make([]string, len(v))\n\t\tfor i, e := range v {\n\t\t\tstr, ok := e.(string)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"invalid string_or_array \"+\n\t\t\t\t\t\"value: %v\", unmarshalled)\n\t\t\t}\n\n\t\t\ts[i] = str\n\t\t}\n\n\t\t*h = s\n\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid string_or_array value: %v\",\n\t\t\tunmarshalled)\n\t}\n\n\treturn nil\n}\n\n// GetNetworkInfoResult models the data returned from the getnetworkinfo\n// command.\ntype GetNetworkInfoResult struct {\n\tVersion         int32                  `json:\"version\"`\n\tSubVersion      string                 `json:\"subversion\"`\n\tProtocolVersion int32                  `json:\"protocolversion\"`\n\tLocalServices   string                 `json:\"localservices\"`\n\tLocalRelay      bool                   `json:\"localrelay\"`\n\tTimeOffset      int64                  `json:\"timeoffset\"`\n\tConnections     int32                  `json:\"connections\"`\n\tConnectionsIn   int32                  `json:\"connections_in\"`\n\tConnectionsOut  int32                  `json:\"connections_out\"`\n\tNetworkActive   bool                   `json:\"networkactive\"`\n\tNetworks        []NetworksResult       `json:\"networks\"`\n\tRelayFee        float64                `json:\"relayfee\"`\n\tIncrementalFee  float64                `json:\"incrementalfee\"`\n\tLocalAddresses  []LocalAddressesResult `json:\"localaddresses\"`\n\tWarnings        StringOrArray          `json:\"warnings\"`\n}\n\n// GetNodeAddressesResult models the data returned from the getnodeaddresses\n// command.\ntype GetNodeAddressesResult struct {\n\t// Timestamp in seconds since epoch (Jan 1 1970 GMT) keeping track of when the node was last seen\n\tTime     int64  `json:\"time\"`\n\tServices uint64 `json:\"services\"` // The services offered\n\tAddress  string `json:\"address\"`  // The address of the node\n\tPort     uint16 `json:\"port\"`     // The port of the node\n}\n\n// GetPeerInfoResult models the data returned from the getpeerinfo command.\ntype GetPeerInfoResult struct {\n\tID             int32   `json:\"id\"`\n\tAddr           string  `json:\"addr\"`\n\tAddrLocal      string  `json:\"addrlocal,omitempty\"`\n\tServices       string  `json:\"services\"`\n\tRelayTxes      bool    `json:\"relaytxes\"`\n\tLastSend       int64   `json:\"lastsend\"`\n\tLastRecv       int64   `json:\"lastrecv\"`\n\tBytesSent      uint64  `json:\"bytessent\"`\n\tBytesRecv      uint64  `json:\"bytesrecv\"`\n\tConnTime       int64   `json:\"conntime\"`\n\tTimeOffset     int64   `json:\"timeoffset\"`\n\tPingTime       float64 `json:\"pingtime\"`\n\tPingWait       float64 `json:\"pingwait,omitempty\"`\n\tVersion        uint32  `json:\"version\"`\n\tSubVer         string  `json:\"subver\"`\n\tInbound        bool    `json:\"inbound\"`\n\tStartingHeight int32   `json:\"startingheight\"`\n\tCurrentHeight  int32   `json:\"currentheight,omitempty\"`\n\tBanScore       int32   `json:\"banscore\"`\n\tFeeFilter      int64   `json:\"feefilter\"`\n\tSyncNode       bool    `json:\"syncnode\"`\n\tV2Connection   bool    `json:\"v2_connection\"`\n}\n\n// GetRawMempoolVerboseResult models the data returned from the getrawmempool\n// command when the verbose flag is set.  When the verbose flag is not set,\n// getrawmempool returns an array of transaction hashes.\ntype GetRawMempoolVerboseResult struct {\n\tSize             int32    `json:\"size\"`\n\tVsize            int32    `json:\"vsize\"`\n\tWeight           int32    `json:\"weight\"`\n\tFee              float64  `json:\"fee\"`\n\tTime             int64    `json:\"time\"`\n\tHeight           int64    `json:\"height\"`\n\tStartingPriority float64  `json:\"startingpriority\"`\n\tCurrentPriority  float64  `json:\"currentpriority\"`\n\tDepends          []string `json:\"depends\"`\n}\n\n// ScriptPubKeyResult models the scriptPubKey data of a tx script.  It is\n// defined separately since it is used by multiple commands.\ntype ScriptPubKeyResult struct {\n\tAsm       string   `json:\"asm\"`\n\tHex       string   `json:\"hex,omitempty\"`\n\tReqSigs   int32    `json:\"reqSigs,omitempty\"` // Deprecated: removed in Bitcoin Core\n\tType      string   `json:\"type\"`\n\tAddress   string   `json:\"address,omitempty\"`\n\tAddresses []string `json:\"addresses,omitempty\"` // Deprecated: removed in Bitcoin Core\n}\n\n// GetTxOutResult models the data from the gettxout command.\ntype GetTxOutResult struct {\n\tBestBlock     string             `json:\"bestblock\"`\n\tConfirmations int64              `json:\"confirmations\"`\n\tValue         float64            `json:\"value\"`\n\tScriptPubKey  ScriptPubKeyResult `json:\"scriptPubKey\"`\n\tCoinbase      bool               `json:\"coinbase\"`\n}\n\n// GetTxOutSetInfoResult models the data from the gettxoutsetinfo command.\ntype GetTxOutSetInfoResult struct {\n\tHeight         int64          `json:\"height\"`\n\tBestBlock      chainhash.Hash `json:\"bestblock\"`\n\tTransactions   int64          `json:\"transactions\"`\n\tTxOuts         int64          `json:\"txouts\"`\n\tBogoSize       int64          `json:\"bogosize\"`\n\tHashSerialized chainhash.Hash `json:\"hash_serialized_2\"`\n\tDiskSize       int64          `json:\"disk_size\"`\n\tTotalAmount    btcutil.Amount `json:\"total_amount\"`\n}\n\n// UnmarshalJSON unmarshals the result of the gettxoutsetinfo JSON-RPC call\nfunc (g *GetTxOutSetInfoResult) UnmarshalJSON(data []byte) error {\n\t// Step 1: Create type aliases of the original struct.\n\ttype Alias GetTxOutSetInfoResult\n\n\t// Step 2: Create an anonymous struct with raw replacements for the special\n\t// fields.\n\taux := &struct {\n\t\tBestBlock      string  `json:\"bestblock\"`\n\t\tHashSerialized string  `json:\"hash_serialized_2\"`\n\t\tTotalAmount    float64 `json:\"total_amount\"`\n\t\t*Alias\n\t}{\n\t\tAlias: (*Alias)(g),\n\t}\n\n\t// Step 3: Unmarshal the data into the anonymous struct.\n\tif err := json.Unmarshal(data, &aux); err != nil {\n\t\treturn err\n\t}\n\n\t// Step 4: Convert the raw fields to the desired types\n\tblockHash, err := chainhash.NewHashFromStr(aux.BestBlock)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tg.BestBlock = *blockHash\n\n\tserializedHash, err := chainhash.NewHashFromStr(aux.HashSerialized)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tg.HashSerialized = *serializedHash\n\n\tamount, err := btcutil.NewAmount(aux.TotalAmount)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tg.TotalAmount = amount\n\n\treturn nil\n}\n\n// GetNetTotalsResult models the data returned from the getnettotals command.\ntype GetNetTotalsResult struct {\n\tTotalBytesRecv uint64 `json:\"totalbytesrecv\"`\n\tTotalBytesSent uint64 `json:\"totalbytessent\"`\n\tTimeMillis     int64  `json:\"timemillis\"`\n}\n\n// ScriptSig models a signature script.  It is defined separately since it only\n// applies to non-coinbase.  Therefore the field in the Vin structure needs\n// to be a pointer.\ntype ScriptSig struct {\n\tAsm string `json:\"asm\"`\n\tHex string `json:\"hex\"`\n}\n\n// Vin models parts of the tx data.  It is defined separately since\n// getrawtransaction, decoderawtransaction, and searchrawtransaction use the\n// same structure.\ntype Vin struct {\n\tCoinbase  string     `json:\"coinbase\"`\n\tTxid      string     `json:\"txid\"`\n\tVout      uint32     `json:\"vout\"`\n\tScriptSig *ScriptSig `json:\"scriptSig\"`\n\tSequence  uint32     `json:\"sequence\"`\n\tWitness   []string   `json:\"txinwitness\"`\n}\n\n// IsCoinBase returns a bool to show if a Vin is a Coinbase one or not.\nfunc (v *Vin) IsCoinBase() bool {\n\treturn len(v.Coinbase) > 0\n}\n\n// HasWitness returns a bool to show if a Vin has any witness data associated\n// with it or not.\nfunc (v *Vin) HasWitness() bool {\n\treturn len(v.Witness) > 0\n}\n\n// MarshalJSON provides a custom Marshal method for Vin.\nfunc (v *Vin) MarshalJSON() ([]byte, error) {\n\tif v.IsCoinBase() {\n\t\tcoinbaseStruct := struct {\n\t\t\tCoinbase string   `json:\"coinbase\"`\n\t\t\tSequence uint32   `json:\"sequence\"`\n\t\t\tWitness  []string `json:\"witness,omitempty\"`\n\t\t}{\n\t\t\tCoinbase: v.Coinbase,\n\t\t\tSequence: v.Sequence,\n\t\t\tWitness:  v.Witness,\n\t\t}\n\t\treturn json.Marshal(coinbaseStruct)\n\t}\n\n\tif v.HasWitness() {\n\t\ttxStruct := struct {\n\t\t\tTxid      string     `json:\"txid\"`\n\t\t\tVout      uint32     `json:\"vout\"`\n\t\t\tScriptSig *ScriptSig `json:\"scriptSig\"`\n\t\t\tWitness   []string   `json:\"txinwitness\"`\n\t\t\tSequence  uint32     `json:\"sequence\"`\n\t\t}{\n\t\t\tTxid:      v.Txid,\n\t\t\tVout:      v.Vout,\n\t\t\tScriptSig: v.ScriptSig,\n\t\t\tWitness:   v.Witness,\n\t\t\tSequence:  v.Sequence,\n\t\t}\n\t\treturn json.Marshal(txStruct)\n\t}\n\n\ttxStruct := struct {\n\t\tTxid      string     `json:\"txid\"`\n\t\tVout      uint32     `json:\"vout\"`\n\t\tScriptSig *ScriptSig `json:\"scriptSig\"`\n\t\tSequence  uint32     `json:\"sequence\"`\n\t}{\n\t\tTxid:      v.Txid,\n\t\tVout:      v.Vout,\n\t\tScriptSig: v.ScriptSig,\n\t\tSequence:  v.Sequence,\n\t}\n\treturn json.Marshal(txStruct)\n}\n\n// PrevOut represents previous output for an input Vin.\ntype PrevOut struct {\n\tAddresses []string `json:\"addresses,omitempty\"`\n\tValue     float64  `json:\"value\"`\n}\n\n// VinPrevOut is like Vin except it includes PrevOut.  It is used by searchrawtransaction\ntype VinPrevOut struct {\n\tCoinbase  string     `json:\"coinbase\"`\n\tTxid      string     `json:\"txid\"`\n\tVout      uint32     `json:\"vout\"`\n\tScriptSig *ScriptSig `json:\"scriptSig\"`\n\tWitness   []string   `json:\"txinwitness\"`\n\tPrevOut   *PrevOut   `json:\"prevOut\"`\n\tSequence  uint32     `json:\"sequence\"`\n}\n\n// IsCoinBase returns a bool to show if a Vin is a Coinbase one or not.\nfunc (v *VinPrevOut) IsCoinBase() bool {\n\treturn len(v.Coinbase) > 0\n}\n\n// HasWitness returns a bool to show if a Vin has any witness data associated\n// with it or not.\nfunc (v *VinPrevOut) HasWitness() bool {\n\treturn len(v.Witness) > 0\n}\n\n// MarshalJSON provides a custom Marshal method for VinPrevOut.\nfunc (v *VinPrevOut) MarshalJSON() ([]byte, error) {\n\tif v.IsCoinBase() {\n\t\tcoinbaseStruct := struct {\n\t\t\tCoinbase string `json:\"coinbase\"`\n\t\t\tSequence uint32 `json:\"sequence\"`\n\t\t}{\n\t\t\tCoinbase: v.Coinbase,\n\t\t\tSequence: v.Sequence,\n\t\t}\n\t\treturn json.Marshal(coinbaseStruct)\n\t}\n\n\tif v.HasWitness() {\n\t\ttxStruct := struct {\n\t\t\tTxid      string     `json:\"txid\"`\n\t\t\tVout      uint32     `json:\"vout\"`\n\t\t\tScriptSig *ScriptSig `json:\"scriptSig\"`\n\t\t\tWitness   []string   `json:\"txinwitness\"`\n\t\t\tPrevOut   *PrevOut   `json:\"prevOut,omitempty\"`\n\t\t\tSequence  uint32     `json:\"sequence\"`\n\t\t}{\n\t\t\tTxid:      v.Txid,\n\t\t\tVout:      v.Vout,\n\t\t\tScriptSig: v.ScriptSig,\n\t\t\tWitness:   v.Witness,\n\t\t\tPrevOut:   v.PrevOut,\n\t\t\tSequence:  v.Sequence,\n\t\t}\n\t\treturn json.Marshal(txStruct)\n\t}\n\n\ttxStruct := struct {\n\t\tTxid      string     `json:\"txid\"`\n\t\tVout      uint32     `json:\"vout\"`\n\t\tScriptSig *ScriptSig `json:\"scriptSig\"`\n\t\tPrevOut   *PrevOut   `json:\"prevOut,omitempty\"`\n\t\tSequence  uint32     `json:\"sequence\"`\n\t}{\n\t\tTxid:      v.Txid,\n\t\tVout:      v.Vout,\n\t\tScriptSig: v.ScriptSig,\n\t\tPrevOut:   v.PrevOut,\n\t\tSequence:  v.Sequence,\n\t}\n\treturn json.Marshal(txStruct)\n}\n\n// Vout models parts of the tx data.  It is defined separately since both\n// getrawtransaction and decoderawtransaction use the same structure.\ntype Vout struct {\n\tValue        float64            `json:\"value\"`\n\tN            uint32             `json:\"n\"`\n\tScriptPubKey ScriptPubKeyResult `json:\"scriptPubKey\"`\n}\n\n// GetMiningInfoResult models the data from the getmininginfo command.\ntype GetMiningInfoResult struct {\n\tBlocks             int64   `json:\"blocks\"`\n\tCurrentBlockSize   uint64  `json:\"currentblocksize\"`\n\tCurrentBlockWeight uint64  `json:\"currentblockweight\"`\n\tCurrentBlockTx     uint64  `json:\"currentblocktx\"`\n\tDifficulty         float64 `json:\"difficulty\"`\n\tErrors             string  `json:\"errors\"`\n\tGenerate           bool    `json:\"generate\"`\n\tGenProcLimit       int32   `json:\"genproclimit\"`\n\tHashesPerSec       float64 `json:\"hashespersec\"`\n\tNetworkHashPS      float64 `json:\"networkhashps\"`\n\tPooledTx           uint64  `json:\"pooledtx\"`\n\tTestNet            bool    `json:\"testnet\"`\n}\n\n// GetWorkResult models the data from the getwork command.\ntype GetWorkResult struct {\n\tData     string `json:\"data\"`\n\tHash1    string `json:\"hash1\"`\n\tMidstate string `json:\"midstate\"`\n\tTarget   string `json:\"target\"`\n}\n\n// InfoChainResult models the data returned by the chain server getinfo command.\ntype InfoChainResult struct {\n\tVersion         int32   `json:\"version\"`\n\tProtocolVersion int32   `json:\"protocolversion\"`\n\tBlocks          int32   `json:\"blocks\"`\n\tTimeOffset      int64   `json:\"timeoffset\"`\n\tConnections     int32   `json:\"connections\"`\n\tProxy           string  `json:\"proxy\"`\n\tDifficulty      float64 `json:\"difficulty\"`\n\tTestNet         bool    `json:\"testnet\"`\n\tRelayFee        float64 `json:\"relayfee\"`\n\tErrors          string  `json:\"errors\"`\n}\n\n// TxRawResult models the data from the getrawtransaction command.\ntype TxRawResult struct {\n\tHex           string `json:\"hex\"`\n\tTxid          string `json:\"txid\"`\n\tHash          string `json:\"hash,omitempty\"`\n\tSize          int32  `json:\"size,omitempty\"`\n\tVsize         int32  `json:\"vsize,omitempty\"`\n\tWeight        int32  `json:\"weight,omitempty\"`\n\tVersion       uint32 `json:\"version\"`\n\tLockTime      uint32 `json:\"locktime\"`\n\tVin           []Vin  `json:\"vin\"`\n\tVout          []Vout `json:\"vout\"`\n\tBlockHash     string `json:\"blockhash,omitempty\"`\n\tConfirmations uint64 `json:\"confirmations,omitempty\"`\n\tTime          int64  `json:\"time,omitempty\"`\n\tBlocktime     int64  `json:\"blocktime,omitempty\"`\n}\n\n// SearchRawTransactionsResult models the data from the searchrawtransaction\n// command.\ntype SearchRawTransactionsResult struct {\n\tHex           string       `json:\"hex,omitempty\"`\n\tTxid          string       `json:\"txid\"`\n\tHash          string       `json:\"hash\"`\n\tSize          string       `json:\"size\"`\n\tVsize         string       `json:\"vsize\"`\n\tWeight        string       `json:\"weight\"`\n\tVersion       int32        `json:\"version\"`\n\tLockTime      uint32       `json:\"locktime\"`\n\tVin           []VinPrevOut `json:\"vin\"`\n\tVout          []Vout       `json:\"vout\"`\n\tBlockHash     string       `json:\"blockhash,omitempty\"`\n\tConfirmations uint64       `json:\"confirmations,omitempty\"`\n\tTime          int64        `json:\"time,omitempty\"`\n\tBlocktime     int64        `json:\"blocktime,omitempty\"`\n}\n\n// TxRawDecodeResult models the data from the decoderawtransaction command.\ntype TxRawDecodeResult struct {\n\tTxid     string `json:\"txid\"`\n\tVersion  int32  `json:\"version\"`\n\tLocktime uint32 `json:\"locktime\"`\n\tVin      []Vin  `json:\"vin\"`\n\tVout     []Vout `json:\"vout\"`\n}\n\n// ValidateAddressChainResult models the data returned by the chain server\n// validateaddress command.\n//\n// Compared to the Bitcoin Core version, this struct lacks the scriptPubKey\n// field since it requires wallet access, which is outside the scope of btcd.\n// Ref: https://bitcoincore.org/en/doc/0.20.0/rpc/util/validateaddress/\ntype ValidateAddressChainResult struct {\n\tIsValid        bool    `json:\"isvalid\"`\n\tAddress        string  `json:\"address,omitempty\"`\n\tIsScript       *bool   `json:\"isscript,omitempty\"`\n\tIsWitness      *bool   `json:\"iswitness,omitempty\"`\n\tWitnessVersion *int32  `json:\"witness_version,omitempty\"`\n\tWitnessProgram *string `json:\"witness_program,omitempty\"`\n}\n\n// EstimateSmartFeeResult models the data returned buy the chain server\n// estimatesmartfee command\ntype EstimateSmartFeeResult struct {\n\tFeeRate *float64 `json:\"feerate,omitempty\"`\n\tErrors  []string `json:\"errors,omitempty\"`\n\tBlocks  int64    `json:\"blocks\"`\n}\n\nvar _ json.Unmarshaler = &FundRawTransactionResult{}\n\ntype rawFundRawTransactionResult struct {\n\tTransaction    string  `json:\"hex\"`\n\tFee            float64 `json:\"fee\"`\n\tChangePosition int     `json:\"changepos\"`\n}\n\n// FundRawTransactionResult is the result of the fundrawtransaction JSON-RPC call\ntype FundRawTransactionResult struct {\n\tTransaction    *wire.MsgTx\n\tFee            btcutil.Amount\n\tChangePosition int // the position of the added change output, or -1\n}\n\n// UnmarshalJSON unmarshals the result of the fundrawtransaction JSON-RPC call\nfunc (f *FundRawTransactionResult) UnmarshalJSON(data []byte) error {\n\tvar rawRes rawFundRawTransactionResult\n\tif err := json.Unmarshal(data, &rawRes); err != nil {\n\t\treturn err\n\t}\n\n\ttxBytes, err := hex.DecodeString(rawRes.Transaction)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar msgTx wire.MsgTx\n\twitnessErr := msgTx.Deserialize(bytes.NewReader(txBytes))\n\tif witnessErr != nil {\n\t\tlegacyErr := msgTx.DeserializeNoWitness(bytes.NewReader(txBytes))\n\t\tif legacyErr != nil {\n\t\t\treturn legacyErr\n\t\t}\n\t}\n\n\tfee, err := btcutil.NewAmount(rawRes.Fee)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tf.Transaction = &msgTx\n\tf.Fee = fee\n\tf.ChangePosition = rawRes.ChangePosition\n\treturn nil\n}\n\n// GetDescriptorInfoResult models the data from the getdescriptorinfo command.\ntype GetDescriptorInfoResult struct {\n\tDescriptor     string `json:\"descriptor\"`     // descriptor in canonical form, without private keys\n\tChecksum       string `json:\"checksum\"`       // checksum for the input descriptor\n\tIsRange        bool   `json:\"isrange\"`        // whether the descriptor is ranged\n\tIsSolvable     bool   `json:\"issolvable\"`     // whether the descriptor is solvable\n\tHasPrivateKeys bool   `json:\"hasprivatekeys\"` // whether the descriptor has at least one private key\n}\n\n// DeriveAddressesResult models the data from the deriveaddresses command.\ntype DeriveAddressesResult []string\n\n// LoadWalletResult models the data from the loadwallet command\ntype LoadWalletResult struct {\n\tName    string `json:\"name\"`\n\tWarning string `json:\"warning\"`\n}\n\n// DumpWalletResult models the data from the dumpwallet command\ntype DumpWalletResult struct {\n\tFilename string `json:\"filename\"`\n}\n\n// TestMempoolAcceptResult models the data from the testmempoolaccept command.\n// The result of the mempool acceptance test for each raw transaction in the\n// input array. Returns results for each transaction in the same order they\n// were passed in. Transactions that cannot be fully validated due to failures\n// in other transactions will not contain an 'allowed' result.\ntype TestMempoolAcceptResult struct {\n\t// Txid is the transaction hash in hex.\n\tTxid string `json:\"txid\"`\n\n\t// Wtxid is the transaction witness hash in hex.\n\tWtxid string `json:\"wtxid\"`\n\n\t// PackageError is the package validation error, if any (only possible\n\t// if rawtxs had more than 1 transaction).\n\tPackageError string `json:\"package-error\"`\n\n\t// Allowed specifies whether this tx would be accepted to the mempool\n\t// and pass client-specified maxfeerate. If not present, the tx was not\n\t// fully validated due to a failure in another tx in the list.\n\tAllowed bool `json:\"allowed,omitempty\"`\n\n\t// Vsize is the virtual transaction size as defined in BIP 141. This is\n\t// different from actual serialized size for witness transactions as\n\t// witness data is discounted (only present when 'allowed' is true)\n\tVsize int32 `json:\"vsize,omitempty\"`\n\n\t// Fees specifies the transaction fees (only present if 'allowed' is\n\t// true).\n\tFees *TestMempoolAcceptFees `json:\"fees,omitempty\"`\n\n\t// RejectReason is the rejection string (only present when 'allowed' is\n\t// false).\n\tRejectReason string `json:\"reject-reason,omitempty\"`\n}\n\n// TestMempoolAcceptFees models the `fees` section from the testmempoolaccept\n// command.\ntype TestMempoolAcceptFees struct {\n\t// Base is the transaction fee in BTC.\n\tBase float64 `json:\"base\"`\n\n\t// EffectiveFeeRate specifies the effective feerate in BTC per KvB. May\n\t// differ from the base feerate if, for example, there are modified\n\t// fees from prioritisetransaction or a package feerate was used.\n\t//\n\t// NOTE: this field only exists in bitcoind v25.0 and above.\n\tEffectiveFeeRate float64 `json:\"effective-feerate\"`\n\n\t// EffectiveIncludes specifies transactions whose fees and vsizes are\n\t// included in effective-feerate. Each item is a transaction wtxid in\n\t// hex.\n\t//\n\t// NOTE: this field only exists in bitcoind v25.0 and above.\n\tEffectiveIncludes []string `json:\"effective-includes\"`\n}\n\n// GetTxSpendingPrevOutResult defines a single item returned from the\n// gettxspendingprevout command.\ntype GetTxSpendingPrevOutResult struct {\n\t// Txid is the transaction id of the checked output.\n\tTxid string `json:\"txid\"`\n\n\t// Vout is the vout value of the checked output.\n\tVout uint32 `json:\"vout\"`\n\n\t// SpendingTxid is the transaction id of the mempool transaction\n\t// spending this output (omitted if unspent).\n\tSpendingTxid string `json:\"spendingtxid,omitempty\"`\n}\n"
  },
  {
    "path": "btcjson/chainsvrresults_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"encoding/json\"\n\t\"net/url\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestChainSvrCustomResults ensures any results that have custom marshalling\n// work as intended.\n// and unmarshal code of results are as expected.\nfunc TestChainSvrCustomResults(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tresult   interface{}\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname: \"custom vin marshal with coinbase\",\n\t\t\tresult: &btcjson.Vin{\n\t\t\t\tCoinbase: \"021234\",\n\t\t\t\tSequence: 4294967295,\n\t\t\t},\n\t\t\texpected: `{\"coinbase\":\"021234\",\"sequence\":4294967295}`,\n\t\t},\n\t\t{\n\t\t\tname: \"custom vin marshal without coinbase\",\n\t\t\tresult: &btcjson.Vin{\n\t\t\t\tTxid: \"123\",\n\t\t\t\tVout: 1,\n\t\t\t\tScriptSig: &btcjson.ScriptSig{\n\t\t\t\t\tAsm: \"0\",\n\t\t\t\t\tHex: \"00\",\n\t\t\t\t},\n\t\t\t\tSequence: 4294967295,\n\t\t\t},\n\t\t\texpected: `{\"txid\":\"123\",\"vout\":1,\"scriptSig\":{\"asm\":\"0\",\"hex\":\"00\"},\"sequence\":4294967295}`,\n\t\t},\n\t\t{\n\t\t\tname: \"custom vinprevout marshal with coinbase\",\n\t\t\tresult: &btcjson.VinPrevOut{\n\t\t\t\tCoinbase: \"021234\",\n\t\t\t\tSequence: 4294967295,\n\t\t\t},\n\t\t\texpected: `{\"coinbase\":\"021234\",\"sequence\":4294967295}`,\n\t\t},\n\t\t{\n\t\t\tname: \"custom vinprevout marshal without coinbase\",\n\t\t\tresult: &btcjson.VinPrevOut{\n\t\t\t\tTxid: \"123\",\n\t\t\t\tVout: 1,\n\t\t\t\tScriptSig: &btcjson.ScriptSig{\n\t\t\t\t\tAsm: \"0\",\n\t\t\t\t\tHex: \"00\",\n\t\t\t\t},\n\t\t\t\tPrevOut: &btcjson.PrevOut{\n\t\t\t\t\tAddresses: []string{\"addr1\"},\n\t\t\t\t\tValue:     0,\n\t\t\t\t},\n\t\t\t\tSequence: 4294967295,\n\t\t\t},\n\t\t\texpected: `{\"txid\":\"123\",\"vout\":1,\"scriptSig\":{\"asm\":\"0\",\"hex\":\"00\"},\"prevOut\":{\"addresses\":[\"addr1\"],\"value\":0},\"sequence\":4294967295}`,\n\t\t},\n\t\t{\n\t\t\tname: \"zmq notification\",\n\t\t\tresult: &btcjson.GetZmqNotificationResult{{\n\t\t\t\tType: \"pubrawblock\",\n\t\t\t\tAddress: func() *url.URL {\n\t\t\t\t\tu, err := url.Parse(\"tcp://127.0.0.1:1238\")\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tpanic(err)\n\t\t\t\t\t}\n\t\t\t\t\treturn u\n\t\t\t\t}(),\n\t\t\t\tHighWaterMark: 1337,\n\t\t\t}},\n\t\t\texpected: `[{\"address\":\"tcp://127.0.0.1:1238\",\"hwm\":1337,\"type\":\"pubrawblock\"}]`,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tmarshalled, err := json.Marshal(test.result)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif string(marshalled) != test.expected {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marhsalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestGetTxOutSetInfoResult ensures that custom unmarshalling of\n// GetTxOutSetInfoResult works as intended.\nfunc TestGetTxOutSetInfoResult(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname   string\n\t\tresult string\n\t\twant   btcjson.GetTxOutSetInfoResult\n\t}{\n\t\t{\n\t\t\tname:   \"GetTxOutSetInfoResult - not scanning\",\n\t\t\tresult: `{\"height\":123,\"bestblock\":\"000000000000005f94116250e2407310463c0a7cf950f1af9ebe935b1c0687ab\",\"transactions\":1,\"txouts\":1,\"bogosize\":1,\"hash_serialized_2\":\"9a0a561203ff052182993bc5d0cb2c620880bfafdbd80331f65fd9546c3e5c3e\",\"disk_size\":1,\"total_amount\":0.2}`,\n\t\t\twant: btcjson.GetTxOutSetInfoResult{\n\t\t\t\tHeight: 123,\n\t\t\t\tBestBlock: func() chainhash.Hash {\n\t\t\t\t\th, err := chainhash.NewHashFromStr(\"000000000000005f94116250e2407310463c0a7cf950f1af9ebe935b1c0687ab\")\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tpanic(err)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn *h\n\t\t\t\t}(),\n\t\t\t\tTransactions: 1,\n\t\t\t\tTxOuts:       1,\n\t\t\t\tBogoSize:     1,\n\t\t\t\tHashSerialized: func() chainhash.Hash {\n\t\t\t\t\th, err := chainhash.NewHashFromStr(\"9a0a561203ff052182993bc5d0cb2c620880bfafdbd80331f65fd9546c3e5c3e\")\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tpanic(err)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn *h\n\t\t\t\t}(),\n\t\t\t\tDiskSize: 1,\n\t\t\t\tTotalAmount: func() btcutil.Amount {\n\t\t\t\t\ta, err := btcutil.NewAmount(0.2)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tpanic(err)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn a\n\t\t\t\t}(),\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tvar out btcjson.GetTxOutSetInfoResult\n\t\terr := json.Unmarshal([]byte(test.result), &out)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(out, test.want) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected unmarshalled data - \"+\n\t\t\t\t\"got %v, want %v\", i, test.name, spew.Sdump(out),\n\t\t\t\tspew.Sdump(test.want))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestChainSvrMiningInfoResults ensures GetMiningInfoResults are unmarshalled correctly\nfunc TestChainSvrMiningInfoResults(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tresult   string\n\t\texpected btcjson.GetMiningInfoResult\n\t}{\n\t\t{\n\t\t\tname:   \"mining info with integer networkhashps\",\n\t\t\tresult: `{\"networkhashps\": 89790618491361}`,\n\t\t\texpected: btcjson.GetMiningInfoResult{\n\t\t\t\tNetworkHashPS: 89790618491361,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:   \"mining info with scientific notation networkhashps\",\n\t\t\tresult: `{\"networkhashps\": 8.9790618491361e+13}`,\n\t\t\texpected: btcjson.GetMiningInfoResult{\n\t\t\t\tNetworkHashPS: 89790618491361,\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tvar miningInfoResult btcjson.GetMiningInfoResult\n\t\terr := json.Unmarshal([]byte(test.result), &miningInfoResult)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif miningInfoResult != test.expected {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marhsalled data - \"+\n\t\t\t\t\"got %+v, want %+v\", i, test.name, miningInfoResult,\n\t\t\t\ttest.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestGetNetworkInfoWarnings tests that we can use both a single string value\n// and an array of string values for the warnings field in GetNetworkInfoResult.\nfunc TestGetNetworkInfoWarnings(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tresult   string\n\t\texpected btcjson.GetNetworkInfoResult\n\t}{\n\t\t{\n\t\t\tname:   \"network info with single warning\",\n\t\t\tresult: `{\"warnings\": \"this is a warning\"}`,\n\t\t\texpected: btcjson.GetNetworkInfoResult{\n\t\t\t\tWarnings: btcjson.StringOrArray{\n\t\t\t\t\t\"this is a warning\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:   \"network info with array of warnings\",\n\t\t\tresult: `{\"warnings\": [\"a\", \"or\", \"b\"]}`,\n\t\t\texpected: btcjson.GetNetworkInfoResult{\n\t\t\t\tWarnings: btcjson.StringOrArray{\n\t\t\t\t\t\"a\", \"or\", \"b\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tvar infoResult btcjson.GetNetworkInfoResult\n\t\terr := json.Unmarshal([]byte(test.result), &infoResult)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(infoResult, test.expected) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marhsalled data - \"+\n\t\t\t\t\"got %+v, want %+v\", i, test.name, infoResult,\n\t\t\t\ttest.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/chainsvrwscmds.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// NOTE: This file is intended to house the RPC commands that are supported by\n// a chain server, but are only available via websockets.\n\npackage btcjson\n\n// AuthenticateCmd defines the authenticate JSON-RPC command.\ntype AuthenticateCmd struct {\n\tUsername   string\n\tPassphrase string\n}\n\n// NewAuthenticateCmd returns a new instance which can be used to issue an\n// authenticate JSON-RPC command.\nfunc NewAuthenticateCmd(username, passphrase string) *AuthenticateCmd {\n\treturn &AuthenticateCmd{\n\t\tUsername:   username,\n\t\tPassphrase: passphrase,\n\t}\n}\n\n// NotifyBlocksCmd defines the notifyblocks JSON-RPC command.\ntype NotifyBlocksCmd struct{}\n\n// NewNotifyBlocksCmd returns a new instance which can be used to issue a\n// notifyblocks JSON-RPC command.\nfunc NewNotifyBlocksCmd() *NotifyBlocksCmd {\n\treturn &NotifyBlocksCmd{}\n}\n\n// StopNotifyBlocksCmd defines the stopnotifyblocks JSON-RPC command.\ntype StopNotifyBlocksCmd struct{}\n\n// NewStopNotifyBlocksCmd returns a new instance which can be used to issue a\n// stopnotifyblocks JSON-RPC command.\nfunc NewStopNotifyBlocksCmd() *StopNotifyBlocksCmd {\n\treturn &StopNotifyBlocksCmd{}\n}\n\n// NotifyNewTransactionsCmd defines the notifynewtransactions JSON-RPC command.\ntype NotifyNewTransactionsCmd struct {\n\tVerbose *bool `jsonrpcdefault:\"false\"`\n}\n\n// NewNotifyNewTransactionsCmd returns a new instance which can be used to issue\n// a notifynewtransactions JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewNotifyNewTransactionsCmd(verbose *bool) *NotifyNewTransactionsCmd {\n\treturn &NotifyNewTransactionsCmd{\n\t\tVerbose: verbose,\n\t}\n}\n\n// SessionCmd defines the session JSON-RPC command.\ntype SessionCmd struct{}\n\n// NewSessionCmd returns a new instance which can be used to issue a session\n// JSON-RPC command.\nfunc NewSessionCmd() *SessionCmd {\n\treturn &SessionCmd{}\n}\n\n// StopNotifyNewTransactionsCmd defines the stopnotifynewtransactions JSON-RPC command.\ntype StopNotifyNewTransactionsCmd struct{}\n\n// NewStopNotifyNewTransactionsCmd returns a new instance which can be used to issue\n// a stopnotifynewtransactions JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewStopNotifyNewTransactionsCmd() *StopNotifyNewTransactionsCmd {\n\treturn &StopNotifyNewTransactionsCmd{}\n}\n\n// NotifyReceivedCmd defines the notifyreceived JSON-RPC command.\n//\n// Deprecated: Use LoadTxFilterCmd instead.\ntype NotifyReceivedCmd struct {\n\tAddresses []string\n}\n\n// NewNotifyReceivedCmd returns a new instance which can be used to issue a\n// notifyreceived JSON-RPC command.\n//\n// Deprecated: Use NewLoadTxFilterCmd instead.\nfunc NewNotifyReceivedCmd(addresses []string) *NotifyReceivedCmd {\n\treturn &NotifyReceivedCmd{\n\t\tAddresses: addresses,\n\t}\n}\n\n// OutPoint describes a transaction outpoint that will be marshalled to and\n// from JSON.\ntype OutPoint struct {\n\tHash  string `json:\"hash\"`\n\tIndex uint32 `json:\"index\"`\n}\n\n// LoadTxFilterCmd defines the loadtxfilter request parameters to load or\n// reload a transaction filter.\n//\n// NOTE: This is a btcd extension ported from github.com/decred/dcrd/dcrjson\n// and requires a websocket connection.\ntype LoadTxFilterCmd struct {\n\tReload    bool\n\tAddresses []string\n\tOutPoints []OutPoint\n}\n\n// NewLoadTxFilterCmd returns a new instance which can be used to issue a\n// loadtxfilter JSON-RPC command.\n//\n// NOTE: This is a btcd extension ported from github.com/decred/dcrd/dcrjson\n// and requires a websocket connection.\nfunc NewLoadTxFilterCmd(reload bool, addresses []string, outPoints []OutPoint) *LoadTxFilterCmd {\n\treturn &LoadTxFilterCmd{\n\t\tReload:    reload,\n\t\tAddresses: addresses,\n\t\tOutPoints: outPoints,\n\t}\n}\n\n// NotifySpentCmd defines the notifyspent JSON-RPC command.\n//\n// Deprecated: Use LoadTxFilterCmd instead.\ntype NotifySpentCmd struct {\n\tOutPoints []OutPoint\n}\n\n// NewNotifySpentCmd returns a new instance which can be used to issue a\n// notifyspent JSON-RPC command.\n//\n// Deprecated: Use NewLoadTxFilterCmd instead.\nfunc NewNotifySpentCmd(outPoints []OutPoint) *NotifySpentCmd {\n\treturn &NotifySpentCmd{\n\t\tOutPoints: outPoints,\n\t}\n}\n\n// StopNotifyReceivedCmd defines the stopnotifyreceived JSON-RPC command.\n//\n// Deprecated: Use LoadTxFilterCmd instead.\ntype StopNotifyReceivedCmd struct {\n\tAddresses []string\n}\n\n// NewStopNotifyReceivedCmd returns a new instance which can be used to issue a\n// stopnotifyreceived JSON-RPC command.\n//\n// Deprecated: Use NewLoadTxFilterCmd instead.\nfunc NewStopNotifyReceivedCmd(addresses []string) *StopNotifyReceivedCmd {\n\treturn &StopNotifyReceivedCmd{\n\t\tAddresses: addresses,\n\t}\n}\n\n// StopNotifySpentCmd defines the stopnotifyspent JSON-RPC command.\n//\n// Deprecated: Use LoadTxFilterCmd instead.\ntype StopNotifySpentCmd struct {\n\tOutPoints []OutPoint\n}\n\n// NewStopNotifySpentCmd returns a new instance which can be used to issue a\n// stopnotifyspent JSON-RPC command.\n//\n// Deprecated: Use NewLoadTxFilterCmd instead.\nfunc NewStopNotifySpentCmd(outPoints []OutPoint) *StopNotifySpentCmd {\n\treturn &StopNotifySpentCmd{\n\t\tOutPoints: outPoints,\n\t}\n}\n\n// RescanCmd defines the rescan JSON-RPC command.\n//\n// Deprecated: Use RescanBlocksCmd instead.\ntype RescanCmd struct {\n\tBeginBlock string\n\tAddresses  []string\n\tOutPoints  []OutPoint\n\tEndBlock   *string\n}\n\n// NewRescanCmd returns a new instance which can be used to issue a rescan\n// JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\n//\n// Deprecated: Use NewRescanBlocksCmd instead.\nfunc NewRescanCmd(beginBlock string, addresses []string, outPoints []OutPoint, endBlock *string) *RescanCmd {\n\treturn &RescanCmd{\n\t\tBeginBlock: beginBlock,\n\t\tAddresses:  addresses,\n\t\tOutPoints:  outPoints,\n\t\tEndBlock:   endBlock,\n\t}\n}\n\n// RescanBlocksCmd defines the rescan JSON-RPC command.\n//\n// NOTE: This is a btcd extension ported from github.com/decred/dcrd/dcrjson\n// and requires a websocket connection.\ntype RescanBlocksCmd struct {\n\t// Block hashes as a string array.\n\tBlockHashes []string\n}\n\n// NewRescanBlocksCmd returns a new instance which can be used to issue a rescan\n// JSON-RPC command.\n//\n// NOTE: This is a btcd extension ported from github.com/decred/dcrd/dcrjson\n// and requires a websocket connection.\nfunc NewRescanBlocksCmd(blockHashes []string) *RescanBlocksCmd {\n\treturn &RescanBlocksCmd{BlockHashes: blockHashes}\n}\n\nfunc init() {\n\t// The commands in this file are only usable by websockets.\n\tflags := UFWebsocketOnly\n\n\tMustRegisterCmd(\"authenticate\", (*AuthenticateCmd)(nil), flags)\n\tMustRegisterCmd(\"loadtxfilter\", (*LoadTxFilterCmd)(nil), flags)\n\tMustRegisterCmd(\"notifyblocks\", (*NotifyBlocksCmd)(nil), flags)\n\tMustRegisterCmd(\"notifynewtransactions\", (*NotifyNewTransactionsCmd)(nil), flags)\n\tMustRegisterCmd(\"notifyreceived\", (*NotifyReceivedCmd)(nil), flags)\n\tMustRegisterCmd(\"notifyspent\", (*NotifySpentCmd)(nil), flags)\n\tMustRegisterCmd(\"session\", (*SessionCmd)(nil), flags)\n\tMustRegisterCmd(\"stopnotifyblocks\", (*StopNotifyBlocksCmd)(nil), flags)\n\tMustRegisterCmd(\"stopnotifynewtransactions\", (*StopNotifyNewTransactionsCmd)(nil), flags)\n\tMustRegisterCmd(\"stopnotifyspent\", (*StopNotifySpentCmd)(nil), flags)\n\tMustRegisterCmd(\"stopnotifyreceived\", (*StopNotifyReceivedCmd)(nil), flags)\n\tMustRegisterCmd(\"rescan\", (*RescanCmd)(nil), flags)\n\tMustRegisterCmd(\"rescanblocks\", (*RescanBlocksCmd)(nil), flags)\n}\n"
  },
  {
    "path": "btcjson/chainsvrwscmds_test.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestChainSvrWsCmds tests all of the chain server websocket-specific commands\n// marshal and unmarshal into valid results include handling of optional fields\n// being omitted in the marshalled command, while optional fields with defaults\n// have the default assigned on unmarshalled commands.\nfunc TestChainSvrWsCmds(t *testing.T) {\n\tt.Parallel()\n\n\ttestID := int(1)\n\ttests := []struct {\n\t\tname         string\n\t\tnewCmd       func() (interface{}, error)\n\t\tstaticCmd    func() interface{}\n\t\tmarshalled   string\n\t\tunmarshalled interface{}\n\t}{\n\t\t{\n\t\t\tname: \"authenticate\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"authenticate\", \"user\", \"pass\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewAuthenticateCmd(\"user\", \"pass\")\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"authenticate\",\"params\":[\"user\",\"pass\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.AuthenticateCmd{Username: \"user\", Passphrase: \"pass\"},\n\t\t},\n\t\t{\n\t\t\tname: \"notifyblocks\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"notifyblocks\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewNotifyBlocksCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"notifyblocks\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.NotifyBlocksCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"stopnotifyblocks\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"stopnotifyblocks\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewStopNotifyBlocksCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"stopnotifyblocks\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.StopNotifyBlocksCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"notifynewtransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"notifynewtransactions\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewNotifyNewTransactionsCmd(nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"notifynewtransactions\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.NotifyNewTransactionsCmd{\n\t\t\t\tVerbose: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"notifynewtransactions optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"notifynewtransactions\", true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewNotifyNewTransactionsCmd(btcjson.Bool(true))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"notifynewtransactions\",\"params\":[true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.NotifyNewTransactionsCmd{\n\t\t\t\tVerbose: btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"stopnotifynewtransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"stopnotifynewtransactions\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewStopNotifyNewTransactionsCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"stopnotifynewtransactions\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.StopNotifyNewTransactionsCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"notifyreceived\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"notifyreceived\", []string{\"1Address\"})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewNotifyReceivedCmd([]string{\"1Address\"})\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"notifyreceived\",\"params\":[[\"1Address\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.NotifyReceivedCmd{\n\t\t\t\tAddresses: []string{\"1Address\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"stopnotifyreceived\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"stopnotifyreceived\", []string{\"1Address\"})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewStopNotifyReceivedCmd([]string{\"1Address\"})\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"stopnotifyreceived\",\"params\":[[\"1Address\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.StopNotifyReceivedCmd{\n\t\t\t\tAddresses: []string{\"1Address\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"notifyspent\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"notifyspent\", `[{\"hash\":\"123\",\"index\":0}]`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tops := []btcjson.OutPoint{{Hash: \"123\", Index: 0}}\n\t\t\t\treturn btcjson.NewNotifySpentCmd(ops)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"notifyspent\",\"params\":[[{\"hash\":\"123\",\"index\":0}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.NotifySpentCmd{\n\t\t\t\tOutPoints: []btcjson.OutPoint{{Hash: \"123\", Index: 0}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"stopnotifyspent\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"stopnotifyspent\", `[{\"hash\":\"123\",\"index\":0}]`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tops := []btcjson.OutPoint{{Hash: \"123\", Index: 0}}\n\t\t\t\treturn btcjson.NewStopNotifySpentCmd(ops)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"stopnotifyspent\",\"params\":[[{\"hash\":\"123\",\"index\":0}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.StopNotifySpentCmd{\n\t\t\t\tOutPoints: []btcjson.OutPoint{{Hash: \"123\", Index: 0}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"rescan\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"rescan\", \"123\", `[\"1Address\"]`, `[{\"hash\":\"0000000000000000000000000000000000000000000000000000000000000123\",\"index\":0}]`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\taddrs := []string{\"1Address\"}\n\t\t\t\tops := []btcjson.OutPoint{{\n\t\t\t\t\tHash:  \"0000000000000000000000000000000000000000000000000000000000000123\",\n\t\t\t\t\tIndex: 0,\n\t\t\t\t}}\n\t\t\t\treturn btcjson.NewRescanCmd(\"123\", addrs, ops, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"rescan\",\"params\":[\"123\",[\"1Address\"],[{\"hash\":\"0000000000000000000000000000000000000000000000000000000000000123\",\"index\":0}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.RescanCmd{\n\t\t\t\tBeginBlock: \"123\",\n\t\t\t\tAddresses:  []string{\"1Address\"},\n\t\t\t\tOutPoints:  []btcjson.OutPoint{{Hash: \"0000000000000000000000000000000000000000000000000000000000000123\", Index: 0}},\n\t\t\t\tEndBlock:   nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"rescan optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"rescan\", \"123\", `[\"1Address\"]`, `[{\"hash\":\"123\",\"index\":0}]`, \"456\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\taddrs := []string{\"1Address\"}\n\t\t\t\tops := []btcjson.OutPoint{{Hash: \"123\", Index: 0}}\n\t\t\t\treturn btcjson.NewRescanCmd(\"123\", addrs, ops, btcjson.String(\"456\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"rescan\",\"params\":[\"123\",[\"1Address\"],[{\"hash\":\"123\",\"index\":0}],\"456\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.RescanCmd{\n\t\t\t\tBeginBlock: \"123\",\n\t\t\t\tAddresses:  []string{\"1Address\"},\n\t\t\t\tOutPoints:  []btcjson.OutPoint{{Hash: \"123\", Index: 0}},\n\t\t\t\tEndBlock:   btcjson.String(\"456\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"loadtxfilter\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"loadtxfilter\", false, `[\"1Address\"]`, `[{\"hash\":\"0000000000000000000000000000000000000000000000000000000000000123\",\"index\":0}]`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\taddrs := []string{\"1Address\"}\n\t\t\t\tops := []btcjson.OutPoint{{\n\t\t\t\t\tHash:  \"0000000000000000000000000000000000000000000000000000000000000123\",\n\t\t\t\t\tIndex: 0,\n\t\t\t\t}}\n\t\t\t\treturn btcjson.NewLoadTxFilterCmd(false, addrs, ops)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"loadtxfilter\",\"params\":[false,[\"1Address\"],[{\"hash\":\"0000000000000000000000000000000000000000000000000000000000000123\",\"index\":0}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.LoadTxFilterCmd{\n\t\t\t\tReload:    false,\n\t\t\t\tAddresses: []string{\"1Address\"},\n\t\t\t\tOutPoints: []btcjson.OutPoint{{Hash: \"0000000000000000000000000000000000000000000000000000000000000123\", Index: 0}},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"rescanblocks\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"rescanblocks\", `[\"0000000000000000000000000000000000000000000000000000000000000123\"]`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tblockhashes := []string{\"0000000000000000000000000000000000000000000000000000000000000123\"}\n\t\t\t\treturn btcjson.NewRescanBlocksCmd(blockhashes)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"rescanblocks\",\"params\":[[\"0000000000000000000000000000000000000000000000000000000000000123\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.RescanBlocksCmd{\n\t\t\t\tBlockHashes: []string{\"0000000000000000000000000000000000000000000000000000000000000123\"},\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Marshal the command as created by the new static command\n\t\t// creation function.\n\t\tmarshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd())\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the command is created without error via the generic\n\t\t// new command creation function.\n\t\tcmd, err := test.newCmd()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected NewCmd error: %v \",\n\t\t\t\ti, test.name, err)\n\t\t}\n\n\t\t// Marshal the command as created by the generic new command\n\t\t// creation function.\n\t\tmarshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar request btcjson.Request\n\t\tif err := json.Unmarshal(marshalled, &request); err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error while \"+\n\t\t\t\t\"unmarshalling JSON-RPC request: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tcmd, err = btcjson.UnmarshalCmd(&request)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"UnmarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(cmd, test.unmarshalled) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected unmarshalled command \"+\n\t\t\t\t\"- got %s, want %s\", i, test.name,\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\", cmd),\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\\n\", test.unmarshalled))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/chainsvrwsntfns.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// NOTE: This file is intended to house the RPC websocket notifications that are\n// supported by a chain server.\n\npackage btcjson\n\nconst (\n\t// BlockConnectedNtfnMethod is the legacy, deprecated method used for\n\t// notifications from the chain server that a block has been connected.\n\t//\n\t// Deprecated: Use FilteredBlockConnectedNtfnMethod instead.\n\tBlockConnectedNtfnMethod = \"blockconnected\"\n\n\t// BlockDisconnectedNtfnMethod is the legacy, deprecated method used for\n\t// notifications from the chain server that a block has been\n\t// disconnected.\n\t//\n\t// Deprecated: Use FilteredBlockDisconnectedNtfnMethod instead.\n\tBlockDisconnectedNtfnMethod = \"blockdisconnected\"\n\n\t// FilteredBlockConnectedNtfnMethod is the new method used for\n\t// notifications from the chain server that a block has been connected.\n\tFilteredBlockConnectedNtfnMethod = \"filteredblockconnected\"\n\n\t// FilteredBlockDisconnectedNtfnMethod is the new method used for\n\t// notifications from the chain server that a block has been\n\t// disconnected.\n\tFilteredBlockDisconnectedNtfnMethod = \"filteredblockdisconnected\"\n\n\t// RecvTxNtfnMethod is the legacy, deprecated method used for\n\t// notifications from the chain server that a transaction which pays to\n\t// a registered address has been processed.\n\t//\n\t// Deprecated: Use RelevantTxAcceptedNtfnMethod and\n\t// FilteredBlockConnectedNtfnMethod instead.\n\tRecvTxNtfnMethod = \"recvtx\"\n\n\t// RedeemingTxNtfnMethod is the legacy, deprecated method used for\n\t// notifications from the chain server that a transaction which spends a\n\t// registered outpoint has been processed.\n\t//\n\t// Deprecated: Use RelevantTxAcceptedNtfnMethod and\n\t// FilteredBlockConnectedNtfnMethod instead.\n\tRedeemingTxNtfnMethod = \"redeemingtx\"\n\n\t// RescanFinishedNtfnMethod is the legacy, deprecated method used for\n\t// notifications from the chain server that a legacy, deprecated rescan\n\t// operation has finished.\n\t//\n\t// Deprecated: Not used with rescanblocks command.\n\tRescanFinishedNtfnMethod = \"rescanfinished\"\n\n\t// RescanProgressNtfnMethod is the legacy, deprecated method used for\n\t// notifications from the chain server that a legacy, deprecated rescan\n\t// operation this is underway has made progress.\n\t//\n\t// Deprecated: Not used with rescanblocks command.\n\tRescanProgressNtfnMethod = \"rescanprogress\"\n\n\t// TxAcceptedNtfnMethod is the method used for notifications from the\n\t// chain server that a transaction has been accepted into the mempool.\n\tTxAcceptedNtfnMethod = \"txaccepted\"\n\n\t// TxAcceptedVerboseNtfnMethod is the method used for notifications from\n\t// the chain server that a transaction has been accepted into the\n\t// mempool.  This differs from TxAcceptedNtfnMethod in that it provides\n\t// more details in the notification.\n\tTxAcceptedVerboseNtfnMethod = \"txacceptedverbose\"\n\n\t// RelevantTxAcceptedNtfnMethod is the new method used for notifications\n\t// from the chain server that inform a client that a transaction that\n\t// matches the loaded filter was accepted by the mempool.\n\tRelevantTxAcceptedNtfnMethod = \"relevanttxaccepted\"\n)\n\n// BlockConnectedNtfn defines the blockconnected JSON-RPC notification.\n//\n// Deprecated: Use FilteredBlockConnectedNtfn instead.\ntype BlockConnectedNtfn struct {\n\tHash   string\n\tHeight int32\n\tTime   int64\n}\n\n// NewBlockConnectedNtfn returns a new instance which can be used to issue a\n// blockconnected JSON-RPC notification.\n//\n// Deprecated: Use NewFilteredBlockConnectedNtfn instead.\nfunc NewBlockConnectedNtfn(hash string, height int32, time int64) *BlockConnectedNtfn {\n\treturn &BlockConnectedNtfn{\n\t\tHash:   hash,\n\t\tHeight: height,\n\t\tTime:   time,\n\t}\n}\n\n// BlockDisconnectedNtfn defines the blockdisconnected JSON-RPC notification.\n//\n// Deprecated: Use FilteredBlockDisconnectedNtfn instead.\ntype BlockDisconnectedNtfn struct {\n\tHash   string\n\tHeight int32\n\tTime   int64\n}\n\n// NewBlockDisconnectedNtfn returns a new instance which can be used to issue a\n// blockdisconnected JSON-RPC notification.\n//\n// Deprecated: Use NewFilteredBlockDisconnectedNtfn instead.\nfunc NewBlockDisconnectedNtfn(hash string, height int32, time int64) *BlockDisconnectedNtfn {\n\treturn &BlockDisconnectedNtfn{\n\t\tHash:   hash,\n\t\tHeight: height,\n\t\tTime:   time,\n\t}\n}\n\n// FilteredBlockConnectedNtfn defines the filteredblockconnected JSON-RPC\n// notification.\ntype FilteredBlockConnectedNtfn struct {\n\tHeight        int32\n\tHeader        string\n\tSubscribedTxs []string\n}\n\n// NewFilteredBlockConnectedNtfn returns a new instance which can be used to\n// issue a filteredblockconnected JSON-RPC notification.\nfunc NewFilteredBlockConnectedNtfn(height int32, header string, subscribedTxs []string) *FilteredBlockConnectedNtfn {\n\treturn &FilteredBlockConnectedNtfn{\n\t\tHeight:        height,\n\t\tHeader:        header,\n\t\tSubscribedTxs: subscribedTxs,\n\t}\n}\n\n// FilteredBlockDisconnectedNtfn defines the filteredblockdisconnected JSON-RPC\n// notification.\ntype FilteredBlockDisconnectedNtfn struct {\n\tHeight int32\n\tHeader string\n}\n\n// NewFilteredBlockDisconnectedNtfn returns a new instance which can be used to\n// issue a filteredblockdisconnected JSON-RPC notification.\nfunc NewFilteredBlockDisconnectedNtfn(height int32, header string) *FilteredBlockDisconnectedNtfn {\n\treturn &FilteredBlockDisconnectedNtfn{\n\t\tHeight: height,\n\t\tHeader: header,\n\t}\n}\n\n// BlockDetails describes details of a tx in a block.\ntype BlockDetails struct {\n\tHeight int32  `json:\"height\"`\n\tHash   string `json:\"hash\"`\n\tIndex  int    `json:\"index\"`\n\tTime   int64  `json:\"time\"`\n}\n\n// RecvTxNtfn defines the recvtx JSON-RPC notification.\n//\n// Deprecated: Use RelevantTxAcceptedNtfn and FilteredBlockConnectedNtfn\n// instead.\ntype RecvTxNtfn struct {\n\tHexTx string\n\tBlock *BlockDetails\n}\n\n// NewRecvTxNtfn returns a new instance which can be used to issue a recvtx\n// JSON-RPC notification.\n//\n// Deprecated: Use NewRelevantTxAcceptedNtfn and\n// NewFilteredBlockConnectedNtfn instead.\nfunc NewRecvTxNtfn(hexTx string, block *BlockDetails) *RecvTxNtfn {\n\treturn &RecvTxNtfn{\n\t\tHexTx: hexTx,\n\t\tBlock: block,\n\t}\n}\n\n// RedeemingTxNtfn defines the redeemingtx JSON-RPC notification.\n//\n// Deprecated: Use RelevantTxAcceptedNtfn and FilteredBlockConnectedNtfn\n// instead.\ntype RedeemingTxNtfn struct {\n\tHexTx string\n\tBlock *BlockDetails\n}\n\n// NewRedeemingTxNtfn returns a new instance which can be used to issue a\n// redeemingtx JSON-RPC notification.\n//\n// Deprecated: Use NewRelevantTxAcceptedNtfn and\n// NewFilteredBlockConnectedNtfn instead.\nfunc NewRedeemingTxNtfn(hexTx string, block *BlockDetails) *RedeemingTxNtfn {\n\treturn &RedeemingTxNtfn{\n\t\tHexTx: hexTx,\n\t\tBlock: block,\n\t}\n}\n\n// RescanFinishedNtfn defines the rescanfinished JSON-RPC notification.\n//\n// Deprecated: Not used with rescanblocks command.\ntype RescanFinishedNtfn struct {\n\tHash   string\n\tHeight int32\n\tTime   int64\n}\n\n// NewRescanFinishedNtfn returns a new instance which can be used to issue a\n// rescanfinished JSON-RPC notification.\n//\n// Deprecated: Not used with rescanblocks command.\nfunc NewRescanFinishedNtfn(hash string, height int32, time int64) *RescanFinishedNtfn {\n\treturn &RescanFinishedNtfn{\n\t\tHash:   hash,\n\t\tHeight: height,\n\t\tTime:   time,\n\t}\n}\n\n// RescanProgressNtfn defines the rescanprogress JSON-RPC notification.\n//\n// Deprecated: Not used with rescanblocks command.\ntype RescanProgressNtfn struct {\n\tHash   string\n\tHeight int32\n\tTime   int64\n}\n\n// NewRescanProgressNtfn returns a new instance which can be used to issue a\n// rescanprogress JSON-RPC notification.\n//\n// Deprecated: Not used with rescanblocks command.\nfunc NewRescanProgressNtfn(hash string, height int32, time int64) *RescanProgressNtfn {\n\treturn &RescanProgressNtfn{\n\t\tHash:   hash,\n\t\tHeight: height,\n\t\tTime:   time,\n\t}\n}\n\n// TxAcceptedNtfn defines the txaccepted JSON-RPC notification.\ntype TxAcceptedNtfn struct {\n\tTxID   string\n\tAmount float64\n}\n\n// NewTxAcceptedNtfn returns a new instance which can be used to issue a\n// txaccepted JSON-RPC notification.\nfunc NewTxAcceptedNtfn(txHash string, amount float64) *TxAcceptedNtfn {\n\treturn &TxAcceptedNtfn{\n\t\tTxID:   txHash,\n\t\tAmount: amount,\n\t}\n}\n\n// TxAcceptedVerboseNtfn defines the txacceptedverbose JSON-RPC notification.\ntype TxAcceptedVerboseNtfn struct {\n\tRawTx TxRawResult\n}\n\n// NewTxAcceptedVerboseNtfn returns a new instance which can be used to issue a\n// txacceptedverbose JSON-RPC notification.\nfunc NewTxAcceptedVerboseNtfn(rawTx TxRawResult) *TxAcceptedVerboseNtfn {\n\treturn &TxAcceptedVerboseNtfn{\n\t\tRawTx: rawTx,\n\t}\n}\n\n// RelevantTxAcceptedNtfn defines the parameters to the relevanttxaccepted\n// JSON-RPC notification.\ntype RelevantTxAcceptedNtfn struct {\n\tTransaction string `json:\"transaction\"`\n}\n\n// NewRelevantTxAcceptedNtfn returns a new instance which can be used to issue a\n// relevantxaccepted JSON-RPC notification.\nfunc NewRelevantTxAcceptedNtfn(txHex string) *RelevantTxAcceptedNtfn {\n\treturn &RelevantTxAcceptedNtfn{Transaction: txHex}\n}\n\nfunc init() {\n\t// The commands in this file are only usable by websockets and are\n\t// notifications.\n\tflags := UFWebsocketOnly | UFNotification\n\n\tMustRegisterCmd(BlockConnectedNtfnMethod, (*BlockConnectedNtfn)(nil), flags)\n\tMustRegisterCmd(BlockDisconnectedNtfnMethod, (*BlockDisconnectedNtfn)(nil), flags)\n\tMustRegisterCmd(FilteredBlockConnectedNtfnMethod, (*FilteredBlockConnectedNtfn)(nil), flags)\n\tMustRegisterCmd(FilteredBlockDisconnectedNtfnMethod, (*FilteredBlockDisconnectedNtfn)(nil), flags)\n\tMustRegisterCmd(RecvTxNtfnMethod, (*RecvTxNtfn)(nil), flags)\n\tMustRegisterCmd(RedeemingTxNtfnMethod, (*RedeemingTxNtfn)(nil), flags)\n\tMustRegisterCmd(RescanFinishedNtfnMethod, (*RescanFinishedNtfn)(nil), flags)\n\tMustRegisterCmd(RescanProgressNtfnMethod, (*RescanProgressNtfn)(nil), flags)\n\tMustRegisterCmd(TxAcceptedNtfnMethod, (*TxAcceptedNtfn)(nil), flags)\n\tMustRegisterCmd(TxAcceptedVerboseNtfnMethod, (*TxAcceptedVerboseNtfn)(nil), flags)\n\tMustRegisterCmd(RelevantTxAcceptedNtfnMethod, (*RelevantTxAcceptedNtfn)(nil), flags)\n}\n"
  },
  {
    "path": "btcjson/chainsvrwsntfns_test.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestChainSvrWsNtfns tests all of the chain server websocket-specific\n// notifications marshal and unmarshal into valid results include handling of\n// optional fields being omitted in the marshalled command, while optional\n// fields with defaults have the default assigned on unmarshalled commands.\nfunc TestChainSvrWsNtfns(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname         string\n\t\tnewNtfn      func() (interface{}, error)\n\t\tstaticNtfn   func() interface{}\n\t\tmarshalled   string\n\t\tunmarshalled interface{}\n\t}{\n\t\t{\n\t\t\tname: \"blockconnected\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"blockconnected\", \"123\", 100000, 123456789)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\treturn btcjson.NewBlockConnectedNtfn(\"123\", 100000, 123456789)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"blockconnected\",\"params\":[\"123\",100000,123456789],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.BlockConnectedNtfn{\n\t\t\t\tHash:   \"123\",\n\t\t\t\tHeight: 100000,\n\t\t\t\tTime:   123456789,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"blockdisconnected\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"blockdisconnected\", \"123\", 100000, 123456789)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\treturn btcjson.NewBlockDisconnectedNtfn(\"123\", 100000, 123456789)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"blockdisconnected\",\"params\":[\"123\",100000,123456789],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.BlockDisconnectedNtfn{\n\t\t\t\tHash:   \"123\",\n\t\t\t\tHeight: 100000,\n\t\t\t\tTime:   123456789,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"filteredblockconnected\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"filteredblockconnected\", 100000, \"header\", []string{\"tx0\", \"tx1\"})\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\treturn btcjson.NewFilteredBlockConnectedNtfn(100000, \"header\", []string{\"tx0\", \"tx1\"})\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"filteredblockconnected\",\"params\":[100000,\"header\",[\"tx0\",\"tx1\"]],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.FilteredBlockConnectedNtfn{\n\t\t\t\tHeight:        100000,\n\t\t\t\tHeader:        \"header\",\n\t\t\t\tSubscribedTxs: []string{\"tx0\", \"tx1\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"filteredblockdisconnected\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"filteredblockdisconnected\", 100000, \"header\")\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\treturn btcjson.NewFilteredBlockDisconnectedNtfn(100000, \"header\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"filteredblockdisconnected\",\"params\":[100000,\"header\"],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.FilteredBlockDisconnectedNtfn{\n\t\t\t\tHeight: 100000,\n\t\t\t\tHeader: \"header\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"recvtx\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"recvtx\", \"001122\", `{\"height\":100000,\"hash\":\"123\",\"index\":0,\"time\":12345678}`)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\tblockDetails := btcjson.BlockDetails{\n\t\t\t\t\tHeight: 100000,\n\t\t\t\t\tHash:   \"123\",\n\t\t\t\t\tIndex:  0,\n\t\t\t\t\tTime:   12345678,\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewRecvTxNtfn(\"001122\", &blockDetails)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"recvtx\",\"params\":[\"001122\",{\"height\":100000,\"hash\":\"123\",\"index\":0,\"time\":12345678}],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.RecvTxNtfn{\n\t\t\t\tHexTx: \"001122\",\n\t\t\t\tBlock: &btcjson.BlockDetails{\n\t\t\t\t\tHeight: 100000,\n\t\t\t\t\tHash:   \"123\",\n\t\t\t\t\tIndex:  0,\n\t\t\t\t\tTime:   12345678,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"redeemingtx\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"redeemingtx\", \"001122\", `{\"height\":100000,\"hash\":\"123\",\"index\":0,\"time\":12345678}`)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\tblockDetails := btcjson.BlockDetails{\n\t\t\t\t\tHeight: 100000,\n\t\t\t\t\tHash:   \"123\",\n\t\t\t\t\tIndex:  0,\n\t\t\t\t\tTime:   12345678,\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewRedeemingTxNtfn(\"001122\", &blockDetails)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"redeemingtx\",\"params\":[\"001122\",{\"height\":100000,\"hash\":\"123\",\"index\":0,\"time\":12345678}],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.RedeemingTxNtfn{\n\t\t\t\tHexTx: \"001122\",\n\t\t\t\tBlock: &btcjson.BlockDetails{\n\t\t\t\t\tHeight: 100000,\n\t\t\t\t\tHash:   \"123\",\n\t\t\t\t\tIndex:  0,\n\t\t\t\t\tTime:   12345678,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"rescanfinished\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"rescanfinished\", \"123\", 100000, 12345678)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\treturn btcjson.NewRescanFinishedNtfn(\"123\", 100000, 12345678)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"rescanfinished\",\"params\":[\"123\",100000,12345678],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.RescanFinishedNtfn{\n\t\t\t\tHash:   \"123\",\n\t\t\t\tHeight: 100000,\n\t\t\t\tTime:   12345678,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"rescanprogress\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"rescanprogress\", \"123\", 100000, 12345678)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\treturn btcjson.NewRescanProgressNtfn(\"123\", 100000, 12345678)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"rescanprogress\",\"params\":[\"123\",100000,12345678],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.RescanProgressNtfn{\n\t\t\t\tHash:   \"123\",\n\t\t\t\tHeight: 100000,\n\t\t\t\tTime:   12345678,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"txaccepted\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"txaccepted\", \"123\", 1.5)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\treturn btcjson.NewTxAcceptedNtfn(\"123\", 1.5)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"txaccepted\",\"params\":[\"123\",1.5],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.TxAcceptedNtfn{\n\t\t\t\tTxID:   \"123\",\n\t\t\t\tAmount: 1.5,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"txacceptedverbose\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"txacceptedverbose\", `{\"hex\":\"001122\",\"txid\":\"123\",\"version\":1,\"locktime\":4294967295,\"vin\":null,\"vout\":null,\"confirmations\":0}`)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\ttxResult := btcjson.TxRawResult{\n\t\t\t\t\tHex:           \"001122\",\n\t\t\t\t\tTxid:          \"123\",\n\t\t\t\t\tVersion:       1,\n\t\t\t\t\tLockTime:      4294967295,\n\t\t\t\t\tVin:           nil,\n\t\t\t\t\tVout:          nil,\n\t\t\t\t\tConfirmations: 0,\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewTxAcceptedVerboseNtfn(txResult)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"txacceptedverbose\",\"params\":[{\"hex\":\"001122\",\"txid\":\"123\",\"version\":1,\"locktime\":4294967295,\"vin\":null,\"vout\":null}],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.TxAcceptedVerboseNtfn{\n\t\t\t\tRawTx: btcjson.TxRawResult{\n\t\t\t\t\tHex:           \"001122\",\n\t\t\t\t\tTxid:          \"123\",\n\t\t\t\t\tVersion:       1,\n\t\t\t\t\tLockTime:      4294967295,\n\t\t\t\t\tVin:           nil,\n\t\t\t\t\tVout:          nil,\n\t\t\t\t\tConfirmations: 0,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"relevanttxaccepted\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"relevanttxaccepted\", \"001122\")\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\treturn btcjson.NewRelevantTxAcceptedNtfn(\"001122\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"relevanttxaccepted\",\"params\":[\"001122\"],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.RelevantTxAcceptedNtfn{\n\t\t\t\tTransaction: \"001122\",\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Marshal the notification as created by the new static\n\t\t// creation function.  The ID is nil for notifications.\n\t\tmarshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, test.staticNtfn())\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the notification is created without error via the\n\t\t// generic new notification creation function.\n\t\tcmd, err := test.newNtfn()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected NewCmd error: %v \",\n\t\t\t\ti, test.name, err)\n\t\t}\n\n\t\t// Marshal the notification as created by the generic new\n\t\t// notification creation function.    The ID is nil for\n\t\t// notifications.\n\t\tmarshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, nil, cmd)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar request btcjson.Request\n\t\tif err := json.Unmarshal(marshalled, &request); err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error while \"+\n\t\t\t\t\"unmarshalling JSON-RPC request: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tcmd, err = btcjson.UnmarshalCmd(&request)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"UnmarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(cmd, test.unmarshalled) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected unmarshalled command \"+\n\t\t\t\t\"- got %s, want %s\", i, test.name,\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\", cmd),\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\\n\", test.unmarshalled))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/chainsvrwsresults.go",
    "content": "// Copyright (c) 2015-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\n// SessionResult models the data from the session command.\ntype SessionResult struct {\n\tSessionID uint64 `json:\"sessionid\"`\n}\n\n// RescannedBlock contains the hash and all discovered transactions of a single\n// rescanned block.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrd/dcrjson.\ntype RescannedBlock struct {\n\tHash         string   `json:\"hash\"`\n\tTransactions []string `json:\"transactions\"`\n}\n"
  },
  {
    "path": "btcjson/chainsvrwsresults_test.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Copyright (c) 2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestChainSvrWsResults ensures any results that have custom marshalling\n// work as intended.\nfunc TestChainSvrWsResults(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tresult   interface{}\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname: \"RescannedBlock\",\n\t\t\tresult: &btcjson.RescannedBlock{\n\t\t\t\tHash:         \"blockhash\",\n\t\t\t\tTransactions: []string{\"serializedtx\"},\n\t\t\t},\n\t\t\texpected: `{\"hash\":\"blockhash\",\"transactions\":[\"serializedtx\"]}`,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tmarshalled, err := json.Marshal(test.result)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif string(marshalled) != test.expected {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marhsalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/cmdinfo.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n)\n\n// CmdMethod returns the method for the passed command.  The provided command\n// type must be a registered type.  All commands provided by this package are\n// registered by default.\nfunc CmdMethod(cmd interface{}) (string, error) {\n\t// Look up the cmd type and error out if not registered.\n\trt := reflect.TypeOf(cmd)\n\tregisterLock.RLock()\n\tmethod, ok := concreteTypeToMethod[rt]\n\tregisterLock.RUnlock()\n\tif !ok {\n\t\tstr := fmt.Sprintf(\"%q is not registered\", method)\n\t\treturn \"\", makeError(ErrUnregisteredMethod, str)\n\t}\n\n\treturn method, nil\n}\n\n// MethodUsageFlags returns the usage flags for the passed command method.  The\n// provided method must be associated with a registered type.  All commands\n// provided by this package are registered by default.\nfunc MethodUsageFlags(method string) (UsageFlag, error) {\n\t// Look up details about the provided method and error out if not\n\t// registered.\n\tregisterLock.RLock()\n\tinfo, ok := methodToInfo[method]\n\tregisterLock.RUnlock()\n\tif !ok {\n\t\tstr := fmt.Sprintf(\"%q is not registered\", method)\n\t\treturn 0, makeError(ErrUnregisteredMethod, str)\n\t}\n\n\treturn info.flags, nil\n}\n\n// subStructUsage returns a string for use in the one-line usage for the given\n// sub struct.  Note that this is specifically for fields which consist of\n// structs (or an array/slice of structs) as opposed to the top-level command\n// struct.\n//\n// Any fields that include a jsonrpcusage struct tag will use that instead of\n// being automatically generated.\nfunc subStructUsage(structType reflect.Type) string {\n\tnumFields := structType.NumField()\n\tfieldUsages := make([]string, 0, numFields)\n\tfor i := 0; i < structType.NumField(); i++ {\n\t\trtf := structType.Field(i)\n\n\t\t// When the field has a jsonrpcusage struct tag specified use\n\t\t// that instead of automatically generating it.\n\t\tif tag := rtf.Tag.Get(\"jsonrpcusage\"); tag != \"\" {\n\t\t\tfieldUsages = append(fieldUsages, tag)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Create the name/value entry for the field while considering\n\t\t// the type of the field.  Not all possible types are covered\n\t\t// here and when one of the types not specifically covered is\n\t\t// encountered, the field name is simply reused for the value.\n\t\tfieldName := strings.ToLower(rtf.Name)\n\t\tfieldValue := fieldName\n\t\tfieldKind := rtf.Type.Kind()\n\t\tswitch {\n\t\tcase isNumeric(fieldKind):\n\t\t\tif fieldKind == reflect.Float32 || fieldKind == reflect.Float64 {\n\t\t\t\tfieldValue = \"n.nnn\"\n\t\t\t} else {\n\t\t\t\tfieldValue = \"n\"\n\t\t\t}\n\t\tcase fieldKind == reflect.String:\n\t\t\tfieldValue = `\"value\"`\n\n\t\tcase fieldKind == reflect.Struct:\n\t\t\tfieldValue = subStructUsage(rtf.Type)\n\n\t\tcase fieldKind == reflect.Array || fieldKind == reflect.Slice:\n\t\t\tfieldValue = subArrayUsage(rtf.Type, fieldName)\n\t\t}\n\n\t\tusage := fmt.Sprintf(\"%q:%s\", fieldName, fieldValue)\n\t\tfieldUsages = append(fieldUsages, usage)\n\t}\n\n\treturn fmt.Sprintf(\"{%s}\", strings.Join(fieldUsages, \",\"))\n}\n\n// subArrayUsage returns a string for use in the one-line usage for the given\n// array or slice.  It also contains logic to convert plural field names to\n// singular so the generated usage string reads better.\nfunc subArrayUsage(arrayType reflect.Type, fieldName string) string {\n\t// Convert plural field names to singular.  Only works for English.\n\tsingularFieldName := fieldName\n\tif strings.HasSuffix(fieldName, \"ies\") {\n\t\tsingularFieldName = strings.TrimSuffix(fieldName, \"ies\")\n\t\tsingularFieldName = singularFieldName + \"y\"\n\t} else if strings.HasSuffix(fieldName, \"es\") {\n\t\tsingularFieldName = strings.TrimSuffix(fieldName, \"es\")\n\t} else if strings.HasSuffix(fieldName, \"s\") {\n\t\tsingularFieldName = strings.TrimSuffix(fieldName, \"s\")\n\t}\n\n\telemType := arrayType.Elem()\n\tswitch elemType.Kind() {\n\tcase reflect.String:\n\t\treturn fmt.Sprintf(\"[%q,...]\", singularFieldName)\n\n\tcase reflect.Struct:\n\t\treturn fmt.Sprintf(\"[%s,...]\", subStructUsage(elemType))\n\t}\n\n\t// Fall back to simply showing the field name in array syntax.\n\treturn fmt.Sprintf(`[%s,...]`, singularFieldName)\n}\n\n// fieldUsage returns a string for use in the one-line usage for the struct\n// field of a command.\n//\n// Any fields that include a jsonrpcusage struct tag will use that instead of\n// being automatically generated.\nfunc fieldUsage(structField reflect.StructField, defaultVal *reflect.Value) string {\n\t// When the field has a jsonrpcusage struct tag specified use that\n\t// instead of automatically generating it.\n\tif tag := structField.Tag.Get(\"jsonrpcusage\"); tag != \"\" {\n\t\treturn tag\n\t}\n\n\t// Indirect the pointer if needed.\n\tfieldType := structField.Type\n\tif fieldType.Kind() == reflect.Ptr {\n\t\tfieldType = fieldType.Elem()\n\t}\n\n\t// When there is a default value, it must also be a pointer due to the\n\t// rules enforced by RegisterCmd.\n\tif defaultVal != nil {\n\t\tindirect := defaultVal.Elem()\n\t\tdefaultVal = &indirect\n\t}\n\n\t// Handle certain types uniquely to provide nicer usage.\n\tfieldName := strings.ToLower(structField.Name)\n\tswitch fieldType.Kind() {\n\tcase reflect.String:\n\t\tif defaultVal != nil {\n\t\t\treturn fmt.Sprintf(\"%s=%q\", fieldName,\n\t\t\t\tdefaultVal.Interface())\n\t\t}\n\n\t\treturn fmt.Sprintf(\"%q\", fieldName)\n\n\tcase reflect.Array, reflect.Slice:\n\t\treturn subArrayUsage(fieldType, fieldName)\n\n\tcase reflect.Struct:\n\t\treturn subStructUsage(fieldType)\n\t}\n\n\t// Simply return the field name when none of the above special cases\n\t// apply.\n\tif defaultVal != nil {\n\t\treturn fmt.Sprintf(\"%s=%v\", fieldName, defaultVal.Interface())\n\t}\n\treturn fieldName\n}\n\n// methodUsageText returns a one-line usage string for the provided command and\n// method info.  This is the main work horse for the exported MethodUsageText\n// function.\nfunc methodUsageText(rtp reflect.Type, defaults map[int]reflect.Value, method string) string {\n\t// Generate the individual usage for each field in the command.  Several\n\t// simplifying assumptions are made here because the RegisterCmd\n\t// function has already rigorously enforced the layout.\n\trt := rtp.Elem()\n\tnumFields := rt.NumField()\n\treqFieldUsages := make([]string, 0, numFields)\n\toptFieldUsages := make([]string, 0, numFields)\n\tfor i := 0; i < numFields; i++ {\n\t\trtf := rt.Field(i)\n\t\tvar isOptional bool\n\t\tif kind := rtf.Type.Kind(); kind == reflect.Ptr {\n\t\t\tisOptional = true\n\t\t}\n\n\t\tvar defaultVal *reflect.Value\n\t\tif defVal, ok := defaults[i]; ok {\n\t\t\tdefaultVal = &defVal\n\t\t}\n\n\t\t// Add human-readable usage to the appropriate slice that is\n\t\t// later used to generate the one-line usage.\n\t\tusage := fieldUsage(rtf, defaultVal)\n\t\tif isOptional {\n\t\t\toptFieldUsages = append(optFieldUsages, usage)\n\t\t} else {\n\t\t\treqFieldUsages = append(reqFieldUsages, usage)\n\t\t}\n\t}\n\n\t// Generate and return the one-line usage string.\n\tusageStr := method\n\tif len(reqFieldUsages) > 0 {\n\t\tusageStr += \" \" + strings.Join(reqFieldUsages, \" \")\n\t}\n\tif len(optFieldUsages) > 0 {\n\t\tusageStr += fmt.Sprintf(\" (%s)\", strings.Join(optFieldUsages, \" \"))\n\t}\n\treturn usageStr\n}\n\n// MethodUsageText returns a one-line usage string for the provided method.  The\n// provided method must be associated with a registered type.  All commands\n// provided by this package are registered by default.\nfunc MethodUsageText(method string) (string, error) {\n\t// Look up details about the provided method and error out if not\n\t// registered.\n\tregisterLock.RLock()\n\trtp, ok := methodToConcreteType[method]\n\tinfo := methodToInfo[method]\n\tregisterLock.RUnlock()\n\tif !ok {\n\t\tstr := fmt.Sprintf(\"%q is not registered\", method)\n\t\treturn \"\", makeError(ErrUnregisteredMethod, str)\n\t}\n\n\t// When the usage for this method has already been generated, simply\n\t// return it.\n\tif info.usage != \"\" {\n\t\treturn info.usage, nil\n\t}\n\n\t// Generate and store the usage string for future calls and return it.\n\tusage := methodUsageText(rtp, info.defaults, method)\n\tregisterLock.Lock()\n\tinfo.usage = usage\n\tmethodToInfo[method] = info\n\tregisterLock.Unlock()\n\treturn usage, nil\n}\n"
  },
  {
    "path": "btcjson/cmdinfo_test.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestCmdMethod tests the CmdMethod function to ensure it returns the expected\n// methods and errors.\nfunc TestCmdMethod(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname   string\n\t\tcmd    interface{}\n\t\tmethod string\n\t\terr    error\n\t}{\n\t\t{\n\t\t\tname: \"unregistered type\",\n\t\t\tcmd:  (*int)(nil),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},\n\t\t},\n\t\t{\n\t\t\tname:   \"nil pointer of registered type\",\n\t\t\tcmd:    (*btcjson.GetBlockCmd)(nil),\n\t\t\tmethod: \"getblock\",\n\t\t},\n\t\t{\n\t\t\tname:   \"nil instance of registered type\",\n\t\t\tcmd:    &btcjson.GetBlockCountCmd{},\n\t\t\tmethod: \"getblockcount\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tmethod, err := btcjson.CmdMethod(test.cmd)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Test #%d (%s) wrong error - got %T (%[3]v), \"+\n\t\t\t\t\"want %T\", i, test.name, err, test.err)\n\t\t\tcontinue\n\t\t}\n\t\tif err != nil {\n\t\t\tgotErrorCode := err.(btcjson.Error).ErrorCode\n\t\t\tif gotErrorCode != test.err.(btcjson.Error).ErrorCode {\n\t\t\t\tt.Errorf(\"Test #%d (%s) mismatched error code \"+\n\t\t\t\t\t\"- got %v (%v), want %v\", i, test.name,\n\t\t\t\t\tgotErrorCode, err,\n\t\t\t\t\ttest.err.(btcjson.Error).ErrorCode)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure method matches the expected value.\n\t\tif method != test.method {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched method - got %v, \"+\n\t\t\t\t\"want %v\", i, test.name, method, test.method)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMethodUsageFlags tests the MethodUsage function ensure it returns the\n// expected flags and errors.\nfunc TestMethodUsageFlags(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname   string\n\t\tmethod string\n\t\terr    error\n\t\tflags  btcjson.UsageFlag\n\t}{\n\t\t{\n\t\t\tname:   \"unregistered type\",\n\t\t\tmethod: \"bogusmethod\",\n\t\t\terr:    btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},\n\t\t},\n\t\t{\n\t\t\tname:   \"getblock\",\n\t\t\tmethod: \"getblock\",\n\t\t\tflags:  0,\n\t\t},\n\t\t{\n\t\t\tname:   \"walletpassphrase\",\n\t\t\tmethod: \"walletpassphrase\",\n\t\t\tflags:  btcjson.UFWalletOnly,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tflags, err := btcjson.MethodUsageFlags(test.method)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Test #%d (%s) wrong error - got %T (%[3]v), \"+\n\t\t\t\t\"want %T\", i, test.name, err, test.err)\n\t\t\tcontinue\n\t\t}\n\t\tif err != nil {\n\t\t\tgotErrorCode := err.(btcjson.Error).ErrorCode\n\t\t\tif gotErrorCode != test.err.(btcjson.Error).ErrorCode {\n\t\t\t\tt.Errorf(\"Test #%d (%s) mismatched error code \"+\n\t\t\t\t\t\"- got %v (%v), want %v\", i, test.name,\n\t\t\t\t\tgotErrorCode, err,\n\t\t\t\t\ttest.err.(btcjson.Error).ErrorCode)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure flags match the expected value.\n\t\tif flags != test.flags {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched flags - got %v, \"+\n\t\t\t\t\"want %v\", i, test.name, flags, test.flags)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMethodUsageText tests the MethodUsageText function ensure it returns the\n// expected text.\nfunc TestMethodUsageText(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tmethod   string\n\t\terr      error\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname:   \"unregistered type\",\n\t\t\tmethod: \"bogusmethod\",\n\t\t\terr:    btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},\n\t\t},\n\t\t{\n\t\t\tname:     \"getblockcount\",\n\t\t\tmethod:   \"getblockcount\",\n\t\t\texpected: \"getblockcount\",\n\t\t},\n\t\t{\n\t\t\tname:     \"getblock\",\n\t\t\tmethod:   \"getblock\",\n\t\t\texpected: `getblock \"hash\" (verbosity=1)`,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tusage, err := btcjson.MethodUsageText(test.method)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Test #%d (%s) wrong error - got %T (%[3]v), \"+\n\t\t\t\t\"want %T\", i, test.name, err, test.err)\n\t\t\tcontinue\n\t\t}\n\t\tif err != nil {\n\t\t\tgotErrorCode := err.(btcjson.Error).ErrorCode\n\t\t\tif gotErrorCode != test.err.(btcjson.Error).ErrorCode {\n\t\t\t\tt.Errorf(\"Test #%d (%s) mismatched error code \"+\n\t\t\t\t\t\"- got %v (%v), want %v\", i, test.name,\n\t\t\t\t\tgotErrorCode, err,\n\t\t\t\t\ttest.err.(btcjson.Error).ErrorCode)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure usage matches the expected value.\n\t\tif usage != test.expected {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched usage - got %v, \"+\n\t\t\t\t\"want %v\", i, test.name, usage, test.expected)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Get the usage again to exercise caching.\n\t\tusage, err = btcjson.MethodUsageText(test.method)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure usage still matches the expected value.\n\t\tif usage != test.expected {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched usage - got %v, \"+\n\t\t\t\t\"want %v\", i, test.name, usage, test.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestFieldUsage tests the internal fieldUsage function ensure it returns the\n// expected text.\nfunc TestFieldUsage(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tfield    reflect.StructField\n\t\tdefValue *reflect.Value\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname: \"jsonrpcusage tag override\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest int `jsonrpcusage:\"testvalue\"`\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: \"testvalue\",\n\t\t},\n\t\t{\n\t\t\tname: \"generic interface\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest interface{}\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `test`,\n\t\t},\n\t\t{\n\t\t\tname: \"string without default value\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest string\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `\"test\"`,\n\t\t},\n\t\t{\n\t\t\tname: \"string with default value\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest string\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: func() *reflect.Value {\n\t\t\t\tvalue := \"default\"\n\t\t\t\trv := reflect.ValueOf(&value)\n\t\t\t\treturn &rv\n\t\t\t}(),\n\t\t\texpected: `test=\"default\"`,\n\t\t},\n\t\t{\n\t\t\tname: \"array of strings\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest []string\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `[\"test\",...]`,\n\t\t},\n\t\t{\n\t\t\tname: \"array of strings with plural field name 1\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s struct {\n\t\t\t\t\tKeys []string\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `[\"key\",...]`,\n\t\t},\n\t\t{\n\t\t\tname: \"array of strings with plural field name 2\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s struct {\n\t\t\t\t\tAddresses []string\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `[\"address\",...]`,\n\t\t},\n\t\t{\n\t\t\tname: \"array of strings with plural field name 3\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s struct {\n\t\t\t\t\tCapabilities []string\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `[\"capability\",...]`,\n\t\t},\n\t\t{\n\t\t\tname: \"array of structs\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tTxid string\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tCapabilities []s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `[{\"txid\":\"value\"},...]`,\n\t\t},\n\t\t{\n\t\t\tname: \"array of ints\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest []int\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `[test,...]`,\n\t\t},\n\t\t{\n\t\t\tname: \"sub struct with jsonrpcusage tag override\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tTest string `jsonrpcusage:\"testusage\"`\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `{testusage}`,\n\t\t},\n\t\t{\n\t\t\tname: \"sub struct with string\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tTxid string\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `{\"txid\":\"value\"}`,\n\t\t},\n\t\t{\n\t\t\tname: \"sub struct with int\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tVout int\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `{\"vout\":n}`,\n\t\t},\n\t\t{\n\t\t\tname: \"sub struct with float\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tAmount float64\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `{\"amount\":n.nnn}`,\n\t\t},\n\t\t{\n\t\t\tname: \"sub struct with sub struct\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s3 struct {\n\t\t\t\t\tAmount float64\n\t\t\t\t}\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tTemplate s3\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `{\"template\":{\"amount\":n.nnn}}`,\n\t\t},\n\t\t{\n\t\t\tname: \"sub struct with slice\",\n\t\t\tfield: func() reflect.StructField {\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tCapabilities []string\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tTest s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil)).Elem().Field(0)\n\t\t\t}(),\n\t\t\tdefValue: nil,\n\t\t\texpected: `{\"capabilities\":[\"capability\",...]}`,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Ensure usage matches the expected value.\n\t\tusage := btcjson.TstFieldUsage(test.field, test.defValue)\n\t\tif usage != test.expected {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched usage - got %v, \"+\n\t\t\t\t\"want %v\", i, test.name, usage, test.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/cmdparse.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// makeParams creates a slice of interface values for the given struct.\nfunc makeParams(rt reflect.Type, rv reflect.Value) []interface{} {\n\tnumFields := rt.NumField()\n\tparams := make([]interface{}, 0, numFields)\n\tlastParam := -1\n\tfor i := 0; i < numFields; i++ {\n\t\trtf := rt.Field(i)\n\t\trvf := rv.Field(i)\n\t\tparams = append(params, rvf.Interface())\n\t\tif rtf.Type.Kind() == reflect.Ptr {\n\t\t\tif rvf.IsNil() {\n\t\t\t\t// Omit optional null params unless a non-null param follows\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tlastParam = i\n\t}\n\treturn params[:lastParam+1]\n}\n\n// MarshalCmd marshals the passed command to a JSON-RPC request byte slice that\n// is suitable for transmission to an RPC server.  The provided command type\n// must be a registered type.  All commands provided by this package are\n// registered by default.\nfunc MarshalCmd(rpcVersion RPCVersion, id interface{}, cmd interface{}) ([]byte, error) {\n\t// Look up the cmd type and error out if not registered.\n\trt := reflect.TypeOf(cmd)\n\tregisterLock.RLock()\n\tmethod, ok := concreteTypeToMethod[rt]\n\tregisterLock.RUnlock()\n\tif !ok {\n\t\tstr := fmt.Sprintf(\"%q is not registered\", method)\n\t\treturn nil, makeError(ErrUnregisteredMethod, str)\n\t}\n\n\t// The provided command must not be nil.\n\trv := reflect.ValueOf(cmd)\n\tif rv.IsNil() {\n\t\tstr := \"the specified command is nil\"\n\t\treturn nil, makeError(ErrInvalidType, str)\n\t}\n\n\t// Create a slice of interface values in the order of the struct fields\n\t// while respecting pointer fields as optional params and only adding\n\t// them if they are non-nil.\n\tparams := makeParams(rt.Elem(), rv.Elem())\n\n\t// Generate and marshal the final JSON-RPC request.\n\trawCmd, err := NewRequest(rpcVersion, id, method, params)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn json.Marshal(rawCmd)\n}\n\n// checkNumParams ensures the supplied number of params is at least the minimum\n// required number for the command and less than the maximum allowed.\nfunc checkNumParams(numParams int, info *methodInfo) error {\n\tif numParams < info.numReqParams || numParams > info.maxParams {\n\t\tif info.numReqParams == info.maxParams {\n\t\t\tstr := fmt.Sprintf(\"wrong number of params (expected \"+\n\t\t\t\t\"%d, received %d)\", info.numReqParams,\n\t\t\t\tnumParams)\n\t\t\treturn makeError(ErrNumParams, str)\n\t\t}\n\n\t\tstr := fmt.Sprintf(\"wrong number of params (expected \"+\n\t\t\t\"between %d and %d, received %d)\", info.numReqParams,\n\t\t\tinfo.maxParams, numParams)\n\t\treturn makeError(ErrNumParams, str)\n\t}\n\n\treturn nil\n}\n\n// populateDefaults populates default values into any remaining optional struct\n// fields that did not have parameters explicitly provided.  The caller should\n// have previously checked that the number of parameters being passed is at\n// least the required number of parameters to avoid unnecessary work in this\n// function, but since required fields never have default values, it will work\n// properly even without the check.\nfunc populateDefaults(numParams int, info *methodInfo, rv reflect.Value) {\n\t// When there are no more parameters left in the supplied parameters,\n\t// any remaining struct fields must be optional.  Thus, populate them\n\t// with their associated default value as needed.\n\tfor i := numParams; i < info.maxParams; i++ {\n\t\trvf := rv.Field(i)\n\t\tif defaultVal, ok := info.defaults[i]; ok {\n\t\t\trvf.Set(defaultVal)\n\t\t}\n\t}\n}\n\n// UnmarshalCmd unmarshals a JSON-RPC request into a suitable concrete command\n// so long as the method type contained within the marshalled request is\n// registered.\nfunc UnmarshalCmd(r *Request) (interface{}, error) {\n\tregisterLock.RLock()\n\trtp, ok := methodToConcreteType[r.Method]\n\tinfo := methodToInfo[r.Method]\n\tregisterLock.RUnlock()\n\tif !ok {\n\t\tstr := fmt.Sprintf(\"%q is not registered\", r.Method)\n\t\treturn nil, makeError(ErrUnregisteredMethod, str)\n\t}\n\trt := rtp.Elem()\n\trvp := reflect.New(rt)\n\trv := rvp.Elem()\n\n\t// Ensure the number of parameters are correct.\n\tnumParams := len(r.Params)\n\tif err := checkNumParams(numParams, &info); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Loop through each of the struct fields and unmarshal the associated\n\t// parameter into them.\n\tfor i := 0; i < numParams; i++ {\n\t\trvf := rv.Field(i)\n\t\t// Unmarshal the parameter into the struct field.\n\t\tconcreteVal := rvf.Addr().Interface()\n\t\tif err := json.Unmarshal(r.Params[i], &concreteVal); err != nil {\n\t\t\t// The most common error is the wrong type, so\n\t\t\t// explicitly detect that error and make it nicer.\n\t\t\tfieldName := strings.ToLower(rt.Field(i).Name)\n\t\t\tif jerr, ok := err.(*json.UnmarshalTypeError); ok {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' must \"+\n\t\t\t\t\t\"be type %v (got %v)\", i+1, fieldName,\n\t\t\t\t\tjerr.Type, jerr.Value)\n\t\t\t\treturn nil, makeError(ErrInvalidType, str)\n\t\t\t}\n\n\t\t\t// Fallback to showing the underlying error.\n\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' failed to \"+\n\t\t\t\t\"unmarshal: %v\", i+1, fieldName, err)\n\t\t\treturn nil, makeError(ErrInvalidType, str)\n\t\t}\n\t}\n\n\t// When there are less supplied parameters than the total number of\n\t// params, any remaining struct fields must be optional.  Thus, populate\n\t// them with their associated default value as needed.\n\tif numParams < info.maxParams {\n\t\tpopulateDefaults(numParams, &info, rv)\n\t}\n\n\treturn rvp.Interface(), nil\n}\n\n// isNumeric returns whether the passed reflect kind is a signed or unsigned\n// integer of any magnitude or a float of any magnitude.\nfunc isNumeric(kind reflect.Kind) bool {\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,\n\t\treflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,\n\t\treflect.Uint64, reflect.Float32, reflect.Float64:\n\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// typesMaybeCompatible returns whether the source type can possibly be\n// assigned to the destination type.  This is intended as a relatively quick\n// check to weed out obviously invalid conversions.\nfunc typesMaybeCompatible(dest reflect.Type, src reflect.Type) bool {\n\t// The same types are obviously compatible.\n\tif dest == src {\n\t\treturn true\n\t}\n\n\t// When both types are numeric, they are potentially compatible.\n\tsrcKind := src.Kind()\n\tdestKind := dest.Kind()\n\tif isNumeric(destKind) && isNumeric(srcKind) {\n\t\treturn true\n\t}\n\n\tif srcKind == reflect.String {\n\t\t// Strings can potentially be converted to numeric types.\n\t\tif isNumeric(destKind) {\n\t\t\treturn true\n\t\t}\n\n\t\tswitch destKind {\n\t\t// Strings can potentially be converted to bools by\n\t\t// strconv.ParseBool.\n\t\tcase reflect.Bool:\n\t\t\treturn true\n\n\t\t// Strings can be converted to any other type which has as\n\t\t// underlying type of string.\n\t\tcase reflect.String:\n\t\t\treturn true\n\n\t\t// Strings can potentially be converted to arrays, slice,\n\t\t// structs, and maps via json.Unmarshal.\n\t\tcase reflect.Array, reflect.Slice, reflect.Struct, reflect.Map:\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// baseType returns the type of the argument after indirecting through all\n// pointers along with how many indirections were necessary.\nfunc baseType(arg reflect.Type) (reflect.Type, int) {\n\tvar numIndirects int\n\tfor arg.Kind() == reflect.Ptr {\n\t\targ = arg.Elem()\n\t\tnumIndirects++\n\t}\n\treturn arg, numIndirects\n}\n\n// assignField is the main workhorse for the NewCmd function which handles\n// assigning the provided source value to the destination field.  It supports\n// direct type assignments, indirection, conversion of numeric types, and\n// unmarshalling of strings into arrays, slices, structs, and maps via\n// json.Unmarshal.\nfunc assignField(paramNum int, fieldName string, dest reflect.Value, src reflect.Value) error {\n\t// Just error now when the types have no chance of being compatible.\n\tdestBaseType, destIndirects := baseType(dest.Type())\n\tsrcBaseType, srcIndirects := baseType(src.Type())\n\tif !typesMaybeCompatible(destBaseType, srcBaseType) {\n\t\tstr := fmt.Sprintf(\"parameter #%d '%s' must be type %v (got \"+\n\t\t\t\"%v)\", paramNum, fieldName, destBaseType, srcBaseType)\n\t\treturn makeError(ErrInvalidType, str)\n\t}\n\n\t// Check if it's possible to simply set the dest to the provided source.\n\t// This is the case when the base types are the same or they are both\n\t// pointers that can be indirected to be the same without needing to\n\t// create pointers for the destination field.\n\tif destBaseType == srcBaseType && srcIndirects >= destIndirects {\n\t\tfor i := 0; i < srcIndirects-destIndirects; i++ {\n\t\t\tsrc = src.Elem()\n\t\t}\n\t\tdest.Set(src)\n\t\treturn nil\n\t}\n\n\t// Optional variables can be set null using \"null\" string\n\tif destIndirects > 0 && src.String() == \"null\" {\n\t\treturn nil\n\t}\n\n\t// When the destination has more indirects than the source, the extra\n\t// pointers have to be created.  Only create enough pointers to reach\n\t// the same level of indirection as the source so the dest can simply be\n\t// set to the provided source when the types are the same.\n\tdestIndirectsRemaining := destIndirects\n\tif destIndirects > srcIndirects {\n\t\tindirectDiff := destIndirects - srcIndirects\n\t\tfor i := 0; i < indirectDiff; i++ {\n\t\t\tdest.Set(reflect.New(dest.Type().Elem()))\n\t\t\tdest = dest.Elem()\n\t\t\tdestIndirectsRemaining--\n\t\t}\n\t}\n\n\tif destBaseType == srcBaseType {\n\t\tdest.Set(src)\n\t\treturn nil\n\t}\n\n\t// Make any remaining pointers needed to get to the base dest type since\n\t// the above direct assign was not possible and conversions are done\n\t// against the base types.\n\tfor i := 0; i < destIndirectsRemaining; i++ {\n\t\tdest.Set(reflect.New(dest.Type().Elem()))\n\t\tdest = dest.Elem()\n\t}\n\n\t// Indirect through to the base source value.\n\tfor src.Kind() == reflect.Ptr {\n\t\tsrc = src.Elem()\n\t}\n\n\t// Perform supported type conversions.\n\tswitch src.Kind() {\n\t// Source value is a signed integer of various magnitude.\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,\n\t\treflect.Int64:\n\n\t\tswitch dest.Kind() {\n\t\t// Destination is a signed integer of various magnitude.\n\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,\n\t\t\treflect.Int64:\n\n\t\t\tsrcInt := src.Int()\n\t\t\tif dest.OverflowInt(srcInt) {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' \"+\n\t\t\t\t\t\"overflows destination type %v\",\n\t\t\t\t\tparamNum, fieldName, destBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\n\t\t\tdest.SetInt(srcInt)\n\n\t\t// Destination is an unsigned integer of various magnitude.\n\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,\n\t\t\treflect.Uint64:\n\n\t\t\tsrcInt := src.Int()\n\t\t\tif srcInt < 0 || dest.OverflowUint(uint64(srcInt)) {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' \"+\n\t\t\t\t\t\"overflows destination type %v\",\n\t\t\t\t\tparamNum, fieldName, destBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tdest.SetUint(uint64(srcInt))\n\n\t\tdefault:\n\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' must be type \"+\n\t\t\t\t\"%v (got %v)\", paramNum, fieldName, destBaseType,\n\t\t\t\tsrcBaseType)\n\t\t\treturn makeError(ErrInvalidType, str)\n\t\t}\n\n\t// Source value is an unsigned integer of various magnitude.\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,\n\t\treflect.Uint64:\n\n\t\tswitch dest.Kind() {\n\t\t// Destination is a signed integer of various magnitude.\n\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,\n\t\t\treflect.Int64:\n\n\t\t\tsrcUint := src.Uint()\n\t\t\tif srcUint > uint64(1<<63)-1 {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' \"+\n\t\t\t\t\t\"overflows destination type %v\",\n\t\t\t\t\tparamNum, fieldName, destBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tif dest.OverflowInt(int64(srcUint)) {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' \"+\n\t\t\t\t\t\"overflows destination type %v\",\n\t\t\t\t\tparamNum, fieldName, destBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tdest.SetInt(int64(srcUint))\n\n\t\t// Destination is an unsigned integer of various magnitude.\n\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,\n\t\t\treflect.Uint64:\n\n\t\t\tsrcUint := src.Uint()\n\t\t\tif dest.OverflowUint(srcUint) {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' \"+\n\t\t\t\t\t\"overflows destination type %v\",\n\t\t\t\t\tparamNum, fieldName, destBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tdest.SetUint(srcUint)\n\n\t\tdefault:\n\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' must be type \"+\n\t\t\t\t\"%v (got %v)\", paramNum, fieldName, destBaseType,\n\t\t\t\tsrcBaseType)\n\t\t\treturn makeError(ErrInvalidType, str)\n\t\t}\n\n\t// Source value is a float.\n\tcase reflect.Float32, reflect.Float64:\n\t\tdestKind := dest.Kind()\n\t\tif destKind != reflect.Float32 && destKind != reflect.Float64 {\n\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' must be type \"+\n\t\t\t\t\"%v (got %v)\", paramNum, fieldName, destBaseType,\n\t\t\t\tsrcBaseType)\n\t\t\treturn makeError(ErrInvalidType, str)\n\t\t}\n\n\t\tsrcFloat := src.Float()\n\t\tif dest.OverflowFloat(srcFloat) {\n\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' overflows \"+\n\t\t\t\t\"destination type %v\", paramNum, fieldName,\n\t\t\t\tdestBaseType)\n\t\t\treturn makeError(ErrInvalidType, str)\n\t\t}\n\t\tdest.SetFloat(srcFloat)\n\n\t// Source value is a string.\n\tcase reflect.String:\n\t\tswitch dest.Kind() {\n\t\t// String -> bool\n\t\tcase reflect.Bool:\n\t\t\tb, err := strconv.ParseBool(src.String())\n\t\t\tif err != nil {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' must \"+\n\t\t\t\t\t\"parse to a %v\", paramNum, fieldName,\n\t\t\t\t\tdestBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tdest.SetBool(b)\n\n\t\t// String -> signed integer of varying size.\n\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,\n\t\t\treflect.Int64:\n\n\t\t\tsrcInt, err := strconv.ParseInt(src.String(), 0, 0)\n\t\t\tif err != nil {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' must \"+\n\t\t\t\t\t\"parse to a %v\", paramNum, fieldName,\n\t\t\t\t\tdestBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tif dest.OverflowInt(srcInt) {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' \"+\n\t\t\t\t\t\"overflows destination type %v\",\n\t\t\t\t\tparamNum, fieldName, destBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tdest.SetInt(srcInt)\n\n\t\t// String -> unsigned integer of varying size.\n\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16,\n\t\t\treflect.Uint32, reflect.Uint64:\n\n\t\t\tsrcUint, err := strconv.ParseUint(src.String(), 0, 0)\n\t\t\tif err != nil {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' must \"+\n\t\t\t\t\t\"parse to a %v\", paramNum, fieldName,\n\t\t\t\t\tdestBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tif dest.OverflowUint(srcUint) {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' \"+\n\t\t\t\t\t\"overflows destination type %v\",\n\t\t\t\t\tparamNum, fieldName, destBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tdest.SetUint(srcUint)\n\n\t\t// String -> float of varying size.\n\t\tcase reflect.Float32, reflect.Float64:\n\t\t\tsrcFloat, err := strconv.ParseFloat(src.String(), 64)\n\t\t\tif err != nil {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' must \"+\n\t\t\t\t\t\"parse to a %v\", paramNum, fieldName,\n\t\t\t\t\tdestBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tif dest.OverflowFloat(srcFloat) {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' \"+\n\t\t\t\t\t\"overflows destination type %v\",\n\t\t\t\t\tparamNum, fieldName, destBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tdest.SetFloat(srcFloat)\n\n\t\t// String -> string (typecast).\n\t\tcase reflect.String:\n\t\t\tdest.SetString(src.String())\n\n\t\t// String -> arrays, slices, structs, and maps via\n\t\t// json.Unmarshal.\n\t\tcase reflect.Array, reflect.Slice, reflect.Struct, reflect.Map:\n\t\t\tconcreteVal := dest.Addr().Interface()\n\t\t\terr := json.Unmarshal([]byte(src.String()), &concreteVal)\n\t\t\tif err != nil {\n\t\t\t\tstr := fmt.Sprintf(\"parameter #%d '%s' must \"+\n\t\t\t\t\t\"be valid JSON which unsmarshals to a %v\",\n\t\t\t\t\tparamNum, fieldName, destBaseType)\n\t\t\t\treturn makeError(ErrInvalidType, str)\n\t\t\t}\n\t\t\tdest.Set(reflect.ValueOf(concreteVal).Elem())\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// NewCmd provides a generic mechanism to create a new command that can marshal\n// to a JSON-RPC request while respecting the requirements of the provided\n// method.  The method must have been registered with the package already along\n// with its type definition.  All methods associated with the commands exported\n// by this package are already registered by default.\n//\n// The arguments are most efficient when they are the exact same type as the\n// underlying field in the command struct associated with the method,\n// however this function also will perform a variety of conversions to make it\n// more flexible.  This allows, for example, command line args which are strings\n// to be passed unaltered.  In particular, the following conversions are\n// supported:\n//\n//   - Conversion between any size signed or unsigned integer so long as the\n//     value does not overflow the destination type\n//   - Conversion between float32 and float64 so long as the value does not\n//     overflow the destination type\n//   - Conversion from string to boolean for everything strconv.ParseBool\n//     recognizes\n//   - Conversion from string to any size integer for everything\n//     strconv.ParseInt and strconv.ParseUint recognizes\n//   - Conversion from string to any size float for everything\n//     strconv.ParseFloat recognizes\n//   - Conversion from string to arrays, slices, structs, and maps by treating\n//     the string as marshalled JSON and calling json.Unmarshal into the\n//     destination field\nfunc NewCmd(method string, args ...interface{}) (interface{}, error) {\n\t// Look up details about the provided method.  Any methods that aren't\n\t// registered are an error.\n\tregisterLock.RLock()\n\trtp, ok := methodToConcreteType[method]\n\tinfo := methodToInfo[method]\n\tregisterLock.RUnlock()\n\tif !ok {\n\t\tstr := fmt.Sprintf(\"%q is not registered\", method)\n\t\treturn nil, makeError(ErrUnregisteredMethod, str)\n\t}\n\n\t// Ensure the number of parameters are correct.\n\tnumParams := len(args)\n\tif err := checkNumParams(numParams, &info); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Create the appropriate command type for the method.  Since all types\n\t// are enforced to be a pointer to a struct at registration time, it's\n\t// safe to indirect to the struct now.\n\trvp := reflect.New(rtp.Elem())\n\trv := rvp.Elem()\n\trt := rtp.Elem()\n\n\t// Loop through each of the struct fields and assign the associated\n\t// parameter into them after checking its type validity.\n\tfor i := 0; i < numParams; i++ {\n\t\t// Attempt to assign each of the arguments to the according\n\t\t// struct field.\n\t\trvf := rv.Field(i)\n\t\tfieldName := strings.ToLower(rt.Field(i).Name)\n\t\terr := assignField(i+1, fieldName, rvf, reflect.ValueOf(args[i]))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn rvp.Interface(), nil\n}\n"
  },
  {
    "path": "btcjson/cmdparse_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"encoding/json\"\n\t\"math\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestAssignField tests the assignField function handles supported combinations\n// properly.\nfunc TestAssignField(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tdest     interface{}\n\t\tsrc      interface{}\n\t\texpected interface{}\n\t}{\n\t\t{\n\t\t\tname:     \"same types\",\n\t\t\tdest:     int8(0),\n\t\t\tsrc:      int8(100),\n\t\t\texpected: int8(100),\n\t\t},\n\t\t{\n\t\t\tname: \"same types - more source pointers\",\n\t\t\tdest: int8(0),\n\t\t\tsrc: func() interface{} {\n\t\t\t\ti := int8(100)\n\t\t\t\treturn &i\n\t\t\t}(),\n\t\t\texpected: int8(100),\n\t\t},\n\t\t{\n\t\t\tname: \"same types - more dest pointers\",\n\t\t\tdest: func() interface{} {\n\t\t\t\ti := int8(0)\n\t\t\t\treturn &i\n\t\t\t}(),\n\t\t\tsrc:      int8(100),\n\t\t\texpected: int8(100),\n\t\t},\n\t\t{\n\t\t\tname: \"convertible types - more source pointers\",\n\t\t\tdest: int16(0),\n\t\t\tsrc: func() interface{} {\n\t\t\t\ti := int8(100)\n\t\t\t\treturn &i\n\t\t\t}(),\n\t\t\texpected: int16(100),\n\t\t},\n\t\t{\n\t\t\tname: \"convertible types - both pointers\",\n\t\t\tdest: func() interface{} {\n\t\t\t\ti := int8(0)\n\t\t\t\treturn &i\n\t\t\t}(),\n\t\t\tsrc: func() interface{} {\n\t\t\t\ti := int16(100)\n\t\t\t\treturn &i\n\t\t\t}(),\n\t\t\texpected: int8(100),\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - int16 -> int8\",\n\t\t\tdest:     int8(0),\n\t\t\tsrc:      int16(100),\n\t\t\texpected: int8(100),\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - int16 -> uint8\",\n\t\t\tdest:     uint8(0),\n\t\t\tsrc:      int16(100),\n\t\t\texpected: uint8(100),\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - uint16 -> int8\",\n\t\t\tdest:     int8(0),\n\t\t\tsrc:      uint16(100),\n\t\t\texpected: int8(100),\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - uint16 -> uint8\",\n\t\t\tdest:     uint8(0),\n\t\t\tsrc:      uint16(100),\n\t\t\texpected: uint8(100),\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - float32 -> float64\",\n\t\t\tdest:     float64(0),\n\t\t\tsrc:      float32(1.5),\n\t\t\texpected: float64(1.5),\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - float64 -> float32\",\n\t\t\tdest:     float32(0),\n\t\t\tsrc:      float64(1.5),\n\t\t\texpected: float32(1.5),\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - string -> bool\",\n\t\t\tdest:     false,\n\t\t\tsrc:      \"true\",\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - string -> int8\",\n\t\t\tdest:     int8(0),\n\t\t\tsrc:      \"100\",\n\t\t\texpected: int8(100),\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - string -> uint8\",\n\t\t\tdest:     uint8(0),\n\t\t\tsrc:      \"100\",\n\t\t\texpected: uint8(100),\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - string -> float32\",\n\t\t\tdest:     float32(0),\n\t\t\tsrc:      \"1.5\",\n\t\t\texpected: float32(1.5),\n\t\t},\n\t\t{\n\t\t\tname: \"convertible types - typecase string -> string\",\n\t\t\tdest: \"\",\n\t\t\tsrc: func() interface{} {\n\t\t\t\ttype foo string\n\t\t\t\treturn foo(\"foo\")\n\t\t\t}(),\n\t\t\texpected: \"foo\",\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - string -> array\",\n\t\t\tdest:     [2]string{},\n\t\t\tsrc:      `[\"test\",\"test2\"]`,\n\t\t\texpected: [2]string{\"test\", \"test2\"},\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - string -> slice\",\n\t\t\tdest:     []string{},\n\t\t\tsrc:      `[\"test\",\"test2\"]`,\n\t\t\texpected: []string{\"test\", \"test2\"},\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - string -> struct\",\n\t\t\tdest:     struct{ A int }{},\n\t\t\tsrc:      `{\"A\":100}`,\n\t\t\texpected: struct{ A int }{100},\n\t\t},\n\t\t{\n\t\t\tname:     \"convertible types - string -> map\",\n\t\t\tdest:     map[string]float64{},\n\t\t\tsrc:      `{\"1Address\":1.5}`,\n\t\t\texpected: map[string]float64{\"1Address\": 1.5},\n\t\t},\n\t\t{\n\t\t\tname:     `null optional field - \"null\" -> *int32`,\n\t\t\tdest:     btcjson.Int32(0),\n\t\t\tsrc:      \"null\",\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tname:     `null optional field - \"null\" -> *string`,\n\t\t\tdest:     btcjson.String(\"\"),\n\t\t\tsrc:      \"null\",\n\t\t\texpected: nil,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tdst := reflect.New(reflect.TypeOf(test.dest)).Elem()\n\t\tsrc := reflect.ValueOf(test.src)\n\t\terr := btcjson.TstAssignField(1, \"testField\", dst, src)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check case where null string is used on optional field\n\t\tif dst.Kind() == reflect.Ptr && test.src == \"null\" {\n\t\t\tif !dst.IsNil() {\n\t\t\t\tt.Errorf(\"Test #%d (%s) unexpected value - got %v, \"+\n\t\t\t\t\t\"want nil\", i, test.name, dst.Interface())\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Inidirect through to the base types to ensure their values\n\t\t// are the same.\n\t\tfor dst.Kind() == reflect.Ptr {\n\t\t\tdst = dst.Elem()\n\t\t}\n\t\tif !reflect.DeepEqual(dst.Interface(), test.expected) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected value - got %v, \"+\n\t\t\t\t\"want %v\", i, test.name, dst.Interface(),\n\t\t\t\ttest.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestAssignFieldErrors tests the assignField function error paths.\nfunc TestAssignFieldErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname string\n\t\tdest interface{}\n\t\tsrc  interface{}\n\t\terr  btcjson.Error\n\t}{\n\t\t{\n\t\t\tname: \"general incompatible int -> string\",\n\t\t\tdest: \"\\x00\",\n\t\t\tsrc:  int(0),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"overflow source int -> dest int\",\n\t\t\tdest: int8(0),\n\t\t\tsrc:  int(128),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"overflow source int -> dest uint\",\n\t\t\tdest: uint8(0),\n\t\t\tsrc:  int(256),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"int -> float\",\n\t\t\tdest: float32(0),\n\t\t\tsrc:  int(256),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"overflow source uint64 -> dest int64\",\n\t\t\tdest: int64(0),\n\t\t\tsrc:  uint64(1 << 63),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"overflow source uint -> dest int\",\n\t\t\tdest: int8(0),\n\t\t\tsrc:  uint(128),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"overflow source uint -> dest uint\",\n\t\t\tdest: uint8(0),\n\t\t\tsrc:  uint(256),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"uint -> float\",\n\t\t\tdest: float32(0),\n\t\t\tsrc:  uint(256),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"float -> int\",\n\t\t\tdest: int(0),\n\t\t\tsrc:  float32(1.0),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"overflow float64 -> float32\",\n\t\t\tdest: float32(0),\n\t\t\tsrc:  float64(math.MaxFloat64),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid string -> bool\",\n\t\t\tdest: true,\n\t\t\tsrc:  \"foo\",\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid string -> int\",\n\t\t\tdest: int8(0),\n\t\t\tsrc:  \"foo\",\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"overflow string -> int\",\n\t\t\tdest: int8(0),\n\t\t\tsrc:  \"128\",\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid string -> uint\",\n\t\t\tdest: uint8(0),\n\t\t\tsrc:  \"foo\",\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"overflow string -> uint\",\n\t\t\tdest: uint8(0),\n\t\t\tsrc:  \"256\",\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid string -> float\",\n\t\t\tdest: float32(0),\n\t\t\tsrc:  \"foo\",\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"overflow string -> float\",\n\t\t\tdest: float32(0),\n\t\t\tsrc:  \"1.7976931348623157e+308\",\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid string -> array\",\n\t\t\tdest: [3]int{},\n\t\t\tsrc:  \"foo\",\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid string -> slice\",\n\t\t\tdest: []int{},\n\t\t\tsrc:  \"foo\",\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid string -> struct\",\n\t\t\tdest: struct{ A int }{},\n\t\t\tsrc:  \"foo\",\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid string -> map\",\n\t\t\tdest: map[string]int{},\n\t\t\tsrc:  \"foo\",\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tdst := reflect.New(reflect.TypeOf(test.dest)).Elem()\n\t\tsrc := reflect.ValueOf(test.src)\n\t\terr := btcjson.TstAssignField(1, \"testField\", dst, src)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Test #%d (%s) wrong error - got %T (%[3]v), \"+\n\t\t\t\t\"want %T\", i, test.name, err, test.err)\n\t\t\tcontinue\n\t\t}\n\t\tgotErrorCode := err.(btcjson.Error).ErrorCode\n\t\tif gotErrorCode != test.err.ErrorCode {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched error code - got \"+\n\t\t\t\t\"%v (%v), want %v\", i, test.name, gotErrorCode,\n\t\t\t\terr, test.err.ErrorCode)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestNewCmdErrors ensures the error paths of NewCmd behave as expected.\nfunc TestNewCmdErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname   string\n\t\tmethod string\n\t\targs   []interface{}\n\t\terr    btcjson.Error\n\t}{\n\t\t{\n\t\t\tname:   \"unregistered command\",\n\t\t\tmethod: \"boguscommand\",\n\t\t\targs:   []interface{}{},\n\t\t\terr:    btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},\n\t\t},\n\t\t{\n\t\t\tname:   \"too few parameters to command with required + optional\",\n\t\t\tmethod: \"getblock\",\n\t\t\targs:   []interface{}{},\n\t\t\terr:    btcjson.Error{ErrorCode: btcjson.ErrNumParams},\n\t\t},\n\t\t{\n\t\t\tname:   \"too many parameters to command with no optional\",\n\t\t\tmethod: \"getblockcount\",\n\t\t\targs:   []interface{}{\"123\"},\n\t\t\terr:    btcjson.Error{ErrorCode: btcjson.ErrNumParams},\n\t\t},\n\t\t{\n\t\t\tname:   \"incorrect parameter type\",\n\t\t\tmethod: \"getblock\",\n\t\t\targs:   []interface{}{1},\n\t\t\terr:    btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t_, err := btcjson.NewCmd(test.method, test.args...)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Test #%d (%s) wrong error - got %T (%v), \"+\n\t\t\t\t\"want %T\", i, test.name, err, err, test.err)\n\t\t\tcontinue\n\t\t}\n\t\tgotErrorCode := err.(btcjson.Error).ErrorCode\n\t\tif gotErrorCode != test.err.ErrorCode {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched error code - got \"+\n\t\t\t\t\"%v (%v), want %v\", i, test.name, gotErrorCode,\n\t\t\t\terr, test.err.ErrorCode)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMarshalCmd tests the MarshalCmd function.\nfunc TestMarshalCmd(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tid       interface{}\n\t\tcmd      interface{}\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname:     \"include all parameters\",\n\t\t\tid:       1,\n\t\t\tcmd:      btcjson.NewGetNetworkHashPSCmd(btcjson.Int(100), btcjson.Int(2000)),\n\t\t\texpected: `{\"jsonrpc\":\"1.0\",\"method\":\"getnetworkhashps\",\"params\":[100,2000],\"id\":1}`,\n\t\t},\n\t\t{\n\t\t\tname:     \"include padding null parameter\",\n\t\t\tid:       1,\n\t\t\tcmd:      btcjson.NewGetNetworkHashPSCmd(nil, btcjson.Int(2000)),\n\t\t\texpected: `{\"jsonrpc\":\"1.0\",\"method\":\"getnetworkhashps\",\"params\":[null,2000],\"id\":1}`,\n\t\t},\n\t\t{\n\t\t\tname:     \"omit single unnecessary null parameter\",\n\t\t\tid:       1,\n\t\t\tcmd:      btcjson.NewGetNetworkHashPSCmd(btcjson.Int(100), nil),\n\t\t\texpected: `{\"jsonrpc\":\"1.0\",\"method\":\"getnetworkhashps\",\"params\":[100],\"id\":1}`,\n\t\t},\n\t\t{\n\t\t\tname:     \"omit unnecessary null parameters\",\n\t\t\tid:       1,\n\t\t\tcmd:      btcjson.NewGetNetworkHashPSCmd(nil, nil),\n\t\t\texpected: `{\"jsonrpc\":\"1.0\",\"method\":\"getnetworkhashps\",\"params\":[],\"id\":1}`,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tbytes, err := btcjson.MarshalCmd(btcjson.RpcVersion1, test.id, test.cmd)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) wrong error - got %T (%v)\",\n\t\t\t\ti, test.name, err, err)\n\t\t\tcontinue\n\t\t}\n\t\tmarshalled := string(bytes)\n\t\tif marshalled != test.expected {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched marshall result - got \"+\n\t\t\t\t\"%v, want %v\", i, test.name, marshalled, test.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMarshalCmdErrors  tests the error paths of the MarshalCmd function.\nfunc TestMarshalCmdErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname string\n\t\tid   interface{}\n\t\tcmd  interface{}\n\t\terr  btcjson.Error\n\t}{\n\t\t{\n\t\t\tname: \"unregistered type\",\n\t\t\tid:   1,\n\t\t\tcmd:  (*int)(nil),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},\n\t\t},\n\t\t{\n\t\t\tname: \"nil instance of registered type\",\n\t\t\tid:   1,\n\t\t\tcmd:  (*btcjson.GetBlockCmd)(nil),\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"nil instance of registered type\",\n\t\t\tid:   []int{0, 1},\n\t\t\tcmd:  &btcjson.GetBlockCountCmd{},\n\t\t\terr:  btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t_, err := btcjson.MarshalCmd(btcjson.RpcVersion1, test.id, test.cmd)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Test #%d (%s) wrong error - got %T (%v), \"+\n\t\t\t\t\"want %T\", i, test.name, err, err, test.err)\n\t\t\tcontinue\n\t\t}\n\t\tgotErrorCode := err.(btcjson.Error).ErrorCode\n\t\tif gotErrorCode != test.err.ErrorCode {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched error code - got \"+\n\t\t\t\t\"%v (%v), want %v\", i, test.name, gotErrorCode,\n\t\t\t\terr, test.err.ErrorCode)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestUnmarshalCmdErrors  tests the error paths of the UnmarshalCmd function.\nfunc TestUnmarshalCmdErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname    string\n\t\trequest btcjson.Request\n\t\terr     btcjson.Error\n\t}{\n\t\t{\n\t\t\tname: \"unregistered type\",\n\t\t\trequest: btcjson.Request{\n\t\t\t\tJsonrpc: btcjson.RpcVersion1,\n\t\t\t\tMethod:  \"bogusmethod\",\n\t\t\t\tParams:  nil,\n\t\t\t\tID:      nil,\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},\n\t\t},\n\t\t{\n\t\t\tname: \"incorrect number of params\",\n\t\t\trequest: btcjson.Request{\n\t\t\t\tJsonrpc: btcjson.RpcVersion1,\n\t\t\t\tMethod:  \"getblockcount\",\n\t\t\t\tParams:  []json.RawMessage{[]byte(`\"bogusparam\"`)},\n\t\t\t\tID:      nil,\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrNumParams},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid type for a parameter\",\n\t\t\trequest: btcjson.Request{\n\t\t\t\tJsonrpc: btcjson.RpcVersion1,\n\t\t\t\tMethod:  \"getblock\",\n\t\t\t\tParams:  []json.RawMessage{[]byte(\"1\")},\n\t\t\t\tID:      nil,\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid JSON for a parameter\",\n\t\t\trequest: btcjson.Request{\n\t\t\t\tJsonrpc: btcjson.RpcVersion1,\n\t\t\t\tMethod:  \"getblock\",\n\t\t\t\tParams:  []json.RawMessage{[]byte(`\"1`)},\n\t\t\t\tID:      nil,\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t_, err := btcjson.UnmarshalCmd(&test.request)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Test #%d (%s) wrong error - got %T (%v), \"+\n\t\t\t\t\"want %T\", i, test.name, err, err, test.err)\n\t\t\tcontinue\n\t\t}\n\t\tgotErrorCode := err.(btcjson.Error).ErrorCode\n\t\tif gotErrorCode != test.err.ErrorCode {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched error code - got \"+\n\t\t\t\t\"%v (%v), want %v\", i, test.name, gotErrorCode,\n\t\t\t\terr, test.err.ErrorCode)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/doc.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage btcjson provides primitives for working with the bitcoin JSON-RPC API.\n\n# Overview\n\nWhen communicating via the JSON-RPC protocol, all of the commands need to be\nmarshalled to and from the wire in the appropriate format.  This package\nprovides data structures and primitives to ease this process.\n\nIn addition, it also provides some additional features such as custom command\nregistration, command categorization, and reflection-based help generation.\n\n# JSON-RPC Protocol Overview\n\nThis information is not necessary in order to use this package, but it does\nprovide some intuition into what the marshalling and unmarshalling that is\ndiscussed below is doing under the hood.\n\nAs defined by the JSON-RPC spec, there are effectively two forms of messages on\nthe wire:\n\n  - Request Objects\n    {\"jsonrpc\":\"1.0\",\"id\":\"SOMEID\",\"method\":\"SOMEMETHOD\",\"params\":[SOMEPARAMS]}\n    NOTE: Notifications are the same format except the id field is null.\n\n  - Response Objects\n    {\"result\":SOMETHING,\"error\":null,\"id\":\"SOMEID\"}\n    {\"result\":null,\"error\":{\"code\":SOMEINT,\"message\":SOMESTRING},\"id\":\"SOMEID\"}\n\nFor requests, the params field can vary in what it contains depending on the\nmethod (a.k.a. command) being sent.  Each parameter can be as simple as an int\nor a complex structure containing many nested fields.  The id field is used to\nidentify a request and will be included in the associated response.\n\nWhen working with asynchronous transports, such as websockets, spontaneous\nnotifications are also possible.  As indicated, they are the same as a request\nobject, except they have the id field set to null.  Therefore, servers will\nignore requests with the id field set to null, while clients can choose to\nconsume or ignore them.\n\nUnfortunately, the original Bitcoin JSON-RPC API (and hence anything compatible\nwith it) doesn't always follow the spec and will sometimes return an error\nstring in the result field with a null error for certain commands.  However,\nfor the most part, the error field will be set as described on failure.\n\n# Marshalling and Unmarshalling\n\nBased upon the discussion above, it should be easy to see how the types of this\npackage map into the required parts of the protocol\n\n  - Request Objects (type Request)\n    1. Commands (type <Foo>Cmd)\n    2. Notifications (type <Foo>Ntfn)\n  - Response Objects (type Response)\n    1. Result (type <Foo>Result)\n\nTo simplify the marshalling of the requests and responses, the MarshalCmd and\nMarshalResponse functions are provided.  They return the raw bytes ready to be\nsent across the wire.\n\nUnmarshalling a received Request object is a two step process:\n 1. Unmarshal the raw bytes into a Request struct instance via json.Unmarshal\n 2. Use UnmarshalCmd on the Result field of the unmarshalled Request to create\n    a concrete command or notification instance with all struct fields set\n    accordingly\n\nThis approach is used since it provides the caller with access to the additional\nfields in the request that are not part of the command such as the ID.\n\nUnmarshalling a received Response object is also a two step process:\n 1. Unmarhsal the raw bytes into a Response struct instance via json.Unmarshal\n 2. Depending on the ID, unmarshal the Result field of the unmarshalled\n    Response to create a concrete type instance\n\nAs above, this approach is used since it provides the caller with access to the\nfields in the response such as the ID and Error.\n\n# Command Creation\n\nThis package provides two approaches for creating a new command.  This first,\nand preferred, method is to use one of the New<Foo>Cmd functions.  This allows\nstatic compile-time checking to help ensure the parameters stay in sync with\nthe struct definitions.\n\nThe second approach is the NewCmd function which takes a method (command) name\nand variable arguments.  The function includes full checking to ensure the\nparameters are accurate according to provided method, however these checks are,\nobviously, run-time which means any mistakes won't be found until the code is\nactually executed.  However, it is quite useful for user-supplied commands\nthat are intentionally dynamic.\n\n# Custom Command Registration\n\nThe command handling of this package is built around the concept of registered\ncommands.  This is true for the wide variety of commands already provided by the\npackage, but it also means caller can easily provide custom commands with all\nof the same functionality as the built-in commands.  Use the RegisterCmd\nfunction for this purpose.\n\nA list of all registered methods can be obtained with the RegisteredCmdMethods\nfunction.\n\n# Command Inspection\n\nAll registered commands are registered with flags that identify information such\nas whether the command applies to a chain server, wallet server, or is a\nnotification along with the method name to use.  These flags can be obtained\nwith the MethodUsageFlags flags, and the method can be obtained with the\nCmdMethod function.\n\n# Help Generation\n\nTo facilitate providing consistent help to users of the RPC server, this package\nexposes the GenerateHelp and function which uses reflection on registered\ncommands or notifications, as well as the provided expected result types, to\ngenerate the final help text.\n\nIn addition, the MethodUsageText function is provided to generate consistent\none-line usage for registered commands and notifications using reflection.\n\n# Errors\n\nThere are 2 distinct type of errors supported by this package:\n\n  - General errors related to marshalling or unmarshalling or improper use of\n    the package (type Error)\n  - RPC errors which are intended to be returned across the wire as a part of\n    the JSON-RPC response (type RPCError)\n\nThe first category of errors (type Error) typically indicates a programmer error\nand can be avoided by properly using the API.  Errors of this type will be\nreturned from the various functions available in this package.  They identify\nissues such as unsupported field types, attempts to register malformed commands,\nand attempting to create a new command with an improper number of parameters.\nThe specific reason for the error can be detected by type asserting it to a\n*btcjson.Error and accessing the ErrorCode field.\n\nThe second category of errors (type RPCError), on the other hand, are useful for\nreturning errors to RPC clients.  Consequently, they are used in the previously\ndescribed Response type.\n*/\npackage btcjson\n"
  },
  {
    "path": "btcjson/error.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\nimport (\n\t\"fmt\"\n)\n\n// ErrorCode identifies a kind of error.  These error codes are NOT used for\n// JSON-RPC response errors.\ntype ErrorCode int\n\n// These constants are used to identify a specific RuleError.\nconst (\n\t// ErrDuplicateMethod indicates a command with the specified method\n\t// already exists.\n\tErrDuplicateMethod ErrorCode = iota\n\n\t// ErrInvalidUsageFlags indicates one or more unrecognized flag bits\n\t// were specified.\n\tErrInvalidUsageFlags\n\n\t// ErrInvalidType indicates a type was passed that is not the required\n\t// type.\n\tErrInvalidType\n\n\t// ErrEmbeddedType indicates the provided command struct contains an\n\t// embedded type which is not not supported.\n\tErrEmbeddedType\n\n\t// ErrUnexportedField indicates the provided command struct contains an\n\t// unexported field which is not supported.\n\tErrUnexportedField\n\n\t// ErrUnsupportedFieldType indicates the type of a field in the provided\n\t// command struct is not one of the supported types.\n\tErrUnsupportedFieldType\n\n\t// ErrNonOptionalField indicates a non-optional field was specified\n\t// after an optional field.\n\tErrNonOptionalField\n\n\t// ErrNonOptionalDefault indicates a 'jsonrpcdefault' struct tag was\n\t// specified for a non-optional field.\n\tErrNonOptionalDefault\n\n\t// ErrMismatchedDefault indicates a 'jsonrpcdefault' struct tag contains\n\t// a value that doesn't match the type of the field.\n\tErrMismatchedDefault\n\n\t// ErrUnregisteredMethod indicates a method was specified that has not\n\t// been registered.\n\tErrUnregisteredMethod\n\n\t// ErrMissingDescription indicates a description required to generate\n\t// help is missing.\n\tErrMissingDescription\n\n\t// ErrNumParams inidcates the number of params supplied do not\n\t// match the requirements of the associated command.\n\tErrNumParams\n\n\t// numErrorCodes is the maximum error code number used in tests.\n\tnumErrorCodes\n)\n\n// Map of ErrorCode values back to their constant names for pretty printing.\nvar errorCodeStrings = map[ErrorCode]string{\n\tErrDuplicateMethod:      \"ErrDuplicateMethod\",\n\tErrInvalidUsageFlags:    \"ErrInvalidUsageFlags\",\n\tErrInvalidType:          \"ErrInvalidType\",\n\tErrEmbeddedType:         \"ErrEmbeddedType\",\n\tErrUnexportedField:      \"ErrUnexportedField\",\n\tErrUnsupportedFieldType: \"ErrUnsupportedFieldType\",\n\tErrNonOptionalField:     \"ErrNonOptionalField\",\n\tErrNonOptionalDefault:   \"ErrNonOptionalDefault\",\n\tErrMismatchedDefault:    \"ErrMismatchedDefault\",\n\tErrUnregisteredMethod:   \"ErrUnregisteredMethod\",\n\tErrMissingDescription:   \"ErrMissingDescription\",\n\tErrNumParams:            \"ErrNumParams\",\n}\n\n// String returns the ErrorCode as a human-readable name.\nfunc (e ErrorCode) String() string {\n\tif s := errorCodeStrings[e]; s != \"\" {\n\t\treturn s\n\t}\n\treturn fmt.Sprintf(\"Unknown ErrorCode (%d)\", int(e))\n}\n\n// Error identifies a general error.  This differs from an RPCError in that this\n// error typically is used more by the consumers of the package as opposed to\n// RPCErrors which are intended to be returned to the client across the wire via\n// a JSON-RPC Response.  The caller can use type assertions to determine the\n// specific error and access the ErrorCode field.\ntype Error struct {\n\tErrorCode   ErrorCode // Describes the kind of error\n\tDescription string    // Human readable description of the issue\n}\n\n// Error satisfies the error interface and prints human-readable errors.\nfunc (e Error) Error() string {\n\treturn e.Description\n}\n\n// makeError creates an Error given a set of arguments.\nfunc makeError(c ErrorCode, desc string) Error {\n\treturn Error{ErrorCode: c, Description: desc}\n}\n"
  },
  {
    "path": "btcjson/error_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestErrorCodeStringer tests the stringized output for the ErrorCode type.\nfunc TestErrorCodeStringer(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tin   btcjson.ErrorCode\n\t\twant string\n\t}{\n\t\t{btcjson.ErrDuplicateMethod, \"ErrDuplicateMethod\"},\n\t\t{btcjson.ErrInvalidUsageFlags, \"ErrInvalidUsageFlags\"},\n\t\t{btcjson.ErrInvalidType, \"ErrInvalidType\"},\n\t\t{btcjson.ErrEmbeddedType, \"ErrEmbeddedType\"},\n\t\t{btcjson.ErrUnexportedField, \"ErrUnexportedField\"},\n\t\t{btcjson.ErrUnsupportedFieldType, \"ErrUnsupportedFieldType\"},\n\t\t{btcjson.ErrNonOptionalField, \"ErrNonOptionalField\"},\n\t\t{btcjson.ErrNonOptionalDefault, \"ErrNonOptionalDefault\"},\n\t\t{btcjson.ErrMismatchedDefault, \"ErrMismatchedDefault\"},\n\t\t{btcjson.ErrUnregisteredMethod, \"ErrUnregisteredMethod\"},\n\t\t{btcjson.ErrNumParams, \"ErrNumParams\"},\n\t\t{btcjson.ErrMissingDescription, \"ErrMissingDescription\"},\n\t\t{0xffff, \"Unknown ErrorCode (65535)\"},\n\t}\n\n\t// Detect additional error codes that don't have the stringer added.\n\tif len(tests)-1 != int(btcjson.TstNumErrorCodes) {\n\t\tt.Errorf(\"It appears an error code was added without adding an \" +\n\t\t\t\"associated stringer test\")\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.String()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"String #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestError tests the error output for the Error type.\nfunc TestError(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tin   btcjson.Error\n\t\twant string\n\t}{\n\t\t{\n\t\t\tbtcjson.Error{Description: \"some error\"},\n\t\t\t\"some error\",\n\t\t},\n\t\t{\n\t\t\tbtcjson.Error{Description: \"human-readable error\"},\n\t\t\t\"human-readable error\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.Error()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"Error #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/example_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// This example demonstrates how to create and marshal a command into a JSON-RPC\n// request.\nfunc ExampleMarshalCmd() {\n\t// Create a new getblock command.  Notice the nil parameter indicates\n\t// to use the default parameter for that fields.  This is a common\n\t// pattern used in all of the New<Foo>Cmd functions in this package for\n\t// optional fields.  Also, notice the call to btcjson.Bool which is a\n\t// convenience function for creating a pointer out of a primitive for\n\t// optional parameters.\n\tblockHash := \"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\"\n\tgbCmd := btcjson.NewGetBlockCmd(blockHash, btcjson.Int(0))\n\n\t// Marshal the command to the format suitable for sending to the RPC\n\t// server.  Typically the client would increment the id here which is\n\t// request so the response can be identified.\n\tid := 1\n\tmarshalledBytes, err := btcjson.MarshalCmd(btcjson.RpcVersion1, id, gbCmd)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Display the marshalled command.  Ordinarily this would be sent across\n\t// the wire to the RPC server, but for this example, just display it.\n\tfmt.Printf(\"%s\\n\", marshalledBytes)\n\n\t// Output:\n\t// {\"jsonrpc\":\"1.0\",\"method\":\"getblock\",\"params\":[\"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\",0],\"id\":1}\n}\n\n// This example demonstrates how to unmarshal a JSON-RPC request and then\n// unmarshal the concrete request into a concrete command.\nfunc ExampleUnmarshalCmd() {\n\t// Ordinarily this would be read from the wire, but for this example,\n\t// it is hard coded here for clarity.\n\tdata := []byte(`{\"jsonrpc\":\"1.0\",\"method\":\"getblock\",\"params\":[\"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\",0],\"id\":1}`)\n\n\t// Unmarshal the raw bytes from the wire into a JSON-RPC request.\n\tvar request btcjson.Request\n\tif err := json.Unmarshal(data, &request); err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Typically there isn't any need to examine the request fields directly\n\t// like this as the caller already knows what response to expect based\n\t// on the command it sent.  However, this is done here to demonstrate\n\t// why the unmarshal process is two steps.\n\tif request.ID == nil {\n\t\tfmt.Println(\"Unexpected notification\")\n\t\treturn\n\t}\n\tif request.Method != \"getblock\" {\n\t\tfmt.Println(\"Unexpected method\")\n\t\treturn\n\t}\n\n\t// Unmarshal the request into a concrete command.\n\tcmd, err := btcjson.UnmarshalCmd(&request)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Type assert the command to the appropriate type.\n\tgbCmd, ok := cmd.(*btcjson.GetBlockCmd)\n\tif !ok {\n\t\tfmt.Printf(\"Incorrect command type: %T\\n\", cmd)\n\t\treturn\n\t}\n\n\t// Display the fields in the concrete command.\n\tfmt.Println(\"Hash:\", gbCmd.Hash)\n\tfmt.Println(\"Verbosity:\", *gbCmd.Verbosity)\n\n\t// Output:\n\t// Hash: 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\n\t// Verbosity: 0\n}\n\n// This example demonstrates how to marshal a JSON-RPC response.\nfunc ExampleMarshalResponse() {\n\t// Marshal a new JSON-RPC response.  For example, this is a response\n\t// to a getblockheight request.\n\tmarshalledBytes, err := btcjson.MarshalResponse(btcjson.RpcVersion1, 1, 350001, nil)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Display the marshalled response.  Ordinarily this would be sent\n\t// across the wire to the RPC client, but for this example, just display\n\t// it.\n\tfmt.Printf(\"%s\\n\", marshalledBytes)\n\n\t// Output:\n\t// {\"jsonrpc\":\"1.0\",\"result\":350001,\"error\":null,\"id\":1}\n}\n\n// This example demonstrates how to unmarshal a JSON-RPC response and then\n// unmarshal the result field in the response to a concrete type.\nfunc Example_unmarshalResponse() {\n\t// Ordinarily this would be read from the wire, but for this example,\n\t// it is hard coded here for clarity.  This is an example response to a\n\t// getblockheight request.\n\tdata := []byte(`{\"jsonrpc\":\"1.0\",\"result\":350001,\"error\":null,\"id\":1}`)\n\n\t// Unmarshal the raw bytes from the wire into a JSON-RPC response.\n\tvar response btcjson.Response\n\tif err := json.Unmarshal(data, &response); err != nil {\n\t\tfmt.Println(\"Malformed JSON-RPC response:\", err)\n\t\treturn\n\t}\n\n\t// Check the response for an error from the server.  For example, the\n\t// server might return an error if an invalid/unknown block hash is\n\t// requested.\n\tif response.Error != nil {\n\t\tfmt.Println(response.Error)\n\t\treturn\n\t}\n\n\t// Unmarshal the result into the expected type for the response.\n\tvar blockHeight int32\n\tif err := json.Unmarshal(response.Result, &blockHeight); err != nil {\n\t\tfmt.Printf(\"Unexpected result type: %T\\n\", response.Result)\n\t\treturn\n\t}\n\tfmt.Println(\"Block height:\", blockHeight)\n\n\t// Output:\n\t// Block height: 350001\n}\n"
  },
  {
    "path": "btcjson/export_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\n// TstHighestUsageFlagBit makes the internal highestUsageFlagBit parameter\n// available to the test package.\nvar TstHighestUsageFlagBit = highestUsageFlagBit\n\n// TstNumErrorCodes makes the internal numErrorCodes parameter available to the\n// test package.\nvar TstNumErrorCodes = numErrorCodes\n\n// TstAssignField makes the internal assignField function available to the test\n// package.\nvar TstAssignField = assignField\n\n// TstFieldUsage makes the internal fieldUsage function available to the test\n// package.\nvar TstFieldUsage = fieldUsage\n\n// TstReflectTypeToJSONType makes the internal reflectTypeToJSONType function\n// available to the test package.\nvar TstReflectTypeToJSONType = reflectTypeToJSONType\n\n// TstResultStructHelp makes the internal resultStructHelp function available to\n// the test package.\nvar TstResultStructHelp = resultStructHelp\n\n// TstReflectTypeToJSONExample makes the internal reflectTypeToJSONExample\n// function available to the test package.\nvar TstReflectTypeToJSONExample = reflectTypeToJSONExample\n\n// TstResultTypeHelp makes the internal resultTypeHelp function available to the\n// test package.\nvar TstResultTypeHelp = resultTypeHelp\n\n// TstArgHelp makes the internal argHelp function available to the test package.\nvar TstArgHelp = argHelp\n\n// TestMethodHelp makes the internal methodHelp function available to the test\n// package.\nvar TestMethodHelp = methodHelp\n\n// TstIsValidResultType makes the internal isValidResultType function available\n// to the test package.\nvar TstIsValidResultType = isValidResultType\n"
  },
  {
    "path": "btcjson/help.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\t\"text/tabwriter\"\n)\n\n// baseHelpDescs house the various help labels, types, and example values used\n// when generating help.  The per-command synopsis, field descriptions,\n// conditions, and result descriptions are to be provided by the caller.\nvar baseHelpDescs = map[string]string{\n\t// Misc help labels and output.\n\t\"help-arguments\":      \"Arguments\",\n\t\"help-arguments-none\": \"None\",\n\t\"help-result\":         \"Result\",\n\t\"help-result-nothing\": \"Nothing\",\n\t\"help-default\":        \"default\",\n\t\"help-optional\":       \"optional\",\n\t\"help-required\":       \"required\",\n\n\t// JSON types.\n\t\"json-type-numeric\": \"numeric\",\n\t\"json-type-string\":  \"string\",\n\t\"json-type-bool\":    \"boolean\",\n\t\"json-type-array\":   \"array of \",\n\t\"json-type-object\":  \"object\",\n\t\"json-type-value\":   \"value\",\n\n\t// JSON examples.\n\t\"json-example-string\":   \"value\",\n\t\"json-example-bool\":     \"true|false\",\n\t\"json-example-map-data\": \"data\",\n\t\"json-example-unknown\":  \"unknown\",\n}\n\n// descLookupFunc is a function which is used to lookup a description given\n// a key.\ntype descLookupFunc func(string) string\n\n// reflectTypeToJSONType returns a string that represents the JSON type\n// associated with the provided Go type.\nfunc reflectTypeToJSONType(xT descLookupFunc, rt reflect.Type) string {\n\tkind := rt.Kind()\n\tif isNumeric(kind) {\n\t\treturn xT(\"json-type-numeric\")\n\t}\n\n\tswitch kind {\n\tcase reflect.String:\n\t\treturn xT(\"json-type-string\")\n\n\tcase reflect.Bool:\n\t\treturn xT(\"json-type-bool\")\n\n\tcase reflect.Array, reflect.Slice:\n\t\treturn xT(\"json-type-array\") + reflectTypeToJSONType(xT,\n\t\t\trt.Elem())\n\n\tcase reflect.Struct:\n\t\treturn xT(\"json-type-object\")\n\n\tcase reflect.Map:\n\t\treturn xT(\"json-type-object\")\n\t}\n\n\treturn xT(\"json-type-value\")\n}\n\n// resultStructHelp returns a slice of strings containing the result help output\n// for a struct.  Each line makes use of tabs to separate the relevant pieces so\n// a tabwriter can be used later to line everything up.  The descriptions are\n// pulled from the active help descriptions map based on the lowercase version\n// of the provided reflect type and json name (or the lowercase version of the\n// field name if no json tag was specified).\nfunc resultStructHelp(xT descLookupFunc, rt reflect.Type, indentLevel int) []string {\n\tindent := strings.Repeat(\" \", indentLevel)\n\ttypeName := strings.ToLower(rt.Name())\n\n\t// Generate the help for each of the fields in the result struct.\n\tnumField := rt.NumField()\n\tresults := make([]string, 0, numField)\n\tfor i := 0; i < numField; i++ {\n\t\trtf := rt.Field(i)\n\n\t\t// The field name to display is the json name when it's\n\t\t// available, otherwise use the lowercase field name.\n\t\tvar fieldName string\n\t\tif tag := rtf.Tag.Get(\"json\"); tag != \"\" {\n\t\t\tfieldName = strings.Split(tag, \",\")[0]\n\t\t} else {\n\t\t\tfieldName = strings.ToLower(rtf.Name)\n\t\t}\n\n\t\t// Deference pointer if needed.\n\t\trtfType := rtf.Type\n\t\tif rtfType.Kind() == reflect.Ptr {\n\t\t\trtfType = rtf.Type.Elem()\n\t\t}\n\n\t\t// Generate the JSON example for the result type of this struct\n\t\t// field.  When it is a complex type, examine the type and\n\t\t// adjust the opening bracket and brace combination accordingly.\n\t\tfieldType := reflectTypeToJSONType(xT, rtfType)\n\t\tfieldDescKey := typeName + \"-\" + fieldName\n\t\tfieldExamples, isComplex := reflectTypeToJSONExample(xT,\n\t\t\trtfType, indentLevel, fieldDescKey)\n\t\tif isComplex {\n\t\t\tvar brace string\n\t\t\tkind := rtfType.Kind()\n\t\t\tif kind == reflect.Array || kind == reflect.Slice {\n\t\t\t\tbrace = \"[{\"\n\t\t\t} else {\n\t\t\t\tbrace = \"{\"\n\t\t\t}\n\t\t\tresult := fmt.Sprintf(\"%s\\\"%s\\\": %s\\t(%s)\\t%s\", indent,\n\t\t\t\tfieldName, brace, fieldType, xT(fieldDescKey))\n\t\t\tresults = append(results, result)\n\t\t\tresults = append(results, fieldExamples...)\n\t\t} else {\n\t\t\tresult := fmt.Sprintf(\"%s\\\"%s\\\": %s,\\t(%s)\\t%s\", indent,\n\t\t\t\tfieldName, fieldExamples[0], fieldType,\n\t\t\t\txT(fieldDescKey))\n\t\t\tresults = append(results, result)\n\t\t}\n\t}\n\n\treturn results\n}\n\n// reflectTypeToJSONExample generates example usage in the format used by the\n// help output.  It handles arrays, slices and structs recursively.  The output\n// is returned as a slice of lines so the final help can be nicely aligned via\n// a tab writer.  A bool is also returned which specifies whether or not the\n// type results in a complex JSON object since they need to be handled\n// differently.\nfunc reflectTypeToJSONExample(xT descLookupFunc, rt reflect.Type, indentLevel int, fieldDescKey string) ([]string, bool) {\n\t// Indirect pointer if needed.\n\tif rt.Kind() == reflect.Ptr {\n\t\trt = rt.Elem()\n\t}\n\tkind := rt.Kind()\n\tif isNumeric(kind) {\n\t\tif kind == reflect.Float32 || kind == reflect.Float64 {\n\t\t\treturn []string{\"n.nnn\"}, false\n\t\t}\n\n\t\treturn []string{\"n\"}, false\n\t}\n\n\tswitch kind {\n\tcase reflect.String:\n\t\treturn []string{`\"` + xT(\"json-example-string\") + `\"`}, false\n\n\tcase reflect.Bool:\n\t\treturn []string{xT(\"json-example-bool\")}, false\n\n\tcase reflect.Struct:\n\t\tindent := strings.Repeat(\" \", indentLevel)\n\t\tresults := resultStructHelp(xT, rt, indentLevel+1)\n\n\t\t// An opening brace is needed for the first indent level.  For\n\t\t// all others, it will be included as a part of the previous\n\t\t// field.\n\t\tif indentLevel == 0 {\n\t\t\tnewResults := make([]string, len(results)+1)\n\t\t\tnewResults[0] = \"{\"\n\t\t\tcopy(newResults[1:], results)\n\t\t\tresults = newResults\n\t\t}\n\n\t\t// The closing brace has a comma after it except for the first\n\t\t// indent level.  The final tabs are necessary so the tab writer\n\t\t// lines things up properly.\n\t\tclosingBrace := indent + \"}\"\n\t\tif indentLevel > 0 {\n\t\t\tclosingBrace += \",\"\n\t\t}\n\t\tresults = append(results, closingBrace+\"\\t\\t\")\n\t\treturn results, true\n\n\tcase reflect.Array, reflect.Slice:\n\t\tresults, isComplex := reflectTypeToJSONExample(xT, rt.Elem(),\n\t\t\tindentLevel, fieldDescKey)\n\n\t\t// When the result is complex, it is because this is an array of\n\t\t// objects.\n\t\tif isComplex {\n\t\t\t// When this is at indent level zero, there is no\n\t\t\t// previous field to house the opening array bracket, so\n\t\t\t// replace the opening object brace with the array\n\t\t\t// syntax.  Also, replace the final closing object brace\n\t\t\t// with the variadiac array closing syntax.\n\t\t\tindent := strings.Repeat(\" \", indentLevel)\n\t\t\tif indentLevel == 0 {\n\t\t\t\tresults[0] = indent + \"[{\"\n\t\t\t\tresults[len(results)-1] = indent + \"},...]\"\n\t\t\t\treturn results, true\n\t\t\t}\n\n\t\t\t// At this point, the indent level is greater than 0, so\n\t\t\t// the opening array bracket and object brace are\n\t\t\t// already a part of the previous field.  However, the\n\t\t\t// closing entry is a simple object brace, so replace it\n\t\t\t// with the variadiac array closing syntax.  The final\n\t\t\t// tabs are necessary so the tab writer lines things up\n\t\t\t// properly.\n\t\t\tresults[len(results)-1] = indent + \"},...],\\t\\t\"\n\t\t\treturn results, true\n\t\t}\n\n\t\t// It's an array of primitives, so return the formatted text\n\t\t// accordingly.\n\t\treturn []string{fmt.Sprintf(\"[%s,...]\", results[0])}, false\n\n\tcase reflect.Map:\n\t\tindent := strings.Repeat(\" \", indentLevel)\n\t\tresults := make([]string, 0, 3)\n\n\t\t// An opening brace is needed for the first indent level.  For\n\t\t// all others, it will be included as a part of the previous\n\t\t// field.\n\t\tif indentLevel == 0 {\n\t\t\tresults = append(results, indent+\"{\")\n\t\t}\n\n\t\t// Maps are a bit special in that they need to have the key,\n\t\t// value, and description of the object entry specifically\n\t\t// called out.\n\t\tinnerIndent := strings.Repeat(\" \", indentLevel+1)\n\t\tresult := fmt.Sprintf(\"%s%q: %s, (%s) %s\", innerIndent,\n\t\t\txT(fieldDescKey+\"--key\"), xT(fieldDescKey+\"--value\"),\n\t\t\treflectTypeToJSONType(xT, rt), xT(fieldDescKey+\"--desc\"))\n\t\tresults = append(results, result)\n\t\tresults = append(results, innerIndent+\"...\")\n\n\t\tresults = append(results, indent+\"}\")\n\t\treturn results, true\n\t}\n\n\treturn []string{xT(\"json-example-unknown\")}, false\n}\n\n// resultTypeHelp generates and returns formatted help for the provided result\n// type.\nfunc resultTypeHelp(xT descLookupFunc, rt reflect.Type, fieldDescKey string) string {\n\t// Generate the JSON example for the result type.\n\tresults, isComplex := reflectTypeToJSONExample(xT, rt, 0, fieldDescKey)\n\n\t// When this is a primitive type, add the associated JSON type and\n\t// result description into the final string, format it accordingly,\n\t// and return it.\n\tif !isComplex {\n\t\treturn fmt.Sprintf(\"%s (%s) %s\", results[0],\n\t\t\treflectTypeToJSONType(xT, rt), xT(fieldDescKey))\n\t}\n\n\t// At this point, this is a complex type that already has the JSON types\n\t// and descriptions in the results.  Thus, use a tab writer to nicely\n\t// align the help text.\n\tvar formatted bytes.Buffer\n\tw := new(tabwriter.Writer)\n\tw.Init(&formatted, 0, 4, 1, ' ', 0)\n\tfor i, text := range results {\n\t\tif i == len(results)-1 {\n\t\t\tfmt.Fprintf(w, text)\n\t\t} else {\n\t\t\tfmt.Fprintln(w, text)\n\t\t}\n\t}\n\tw.Flush()\n\treturn formatted.String()\n}\n\n// argTypeHelp returns the type of provided command argument as a string in the\n// format used by the help output.  In particular, it includes the JSON type\n// (boolean, numeric, string, array, object) along with optional and the default\n// value if applicable.\nfunc argTypeHelp(xT descLookupFunc, structField reflect.StructField, defaultVal *reflect.Value) string {\n\t// Indirect the pointer if needed and track if it's an optional field.\n\tfieldType := structField.Type\n\tvar isOptional bool\n\tif fieldType.Kind() == reflect.Ptr {\n\t\tfieldType = fieldType.Elem()\n\t\tisOptional = true\n\t}\n\n\t// When there is a default value, it must also be a pointer due to the\n\t// rules enforced by RegisterCmd.\n\tif defaultVal != nil {\n\t\tindirect := defaultVal.Elem()\n\t\tdefaultVal = &indirect\n\t}\n\n\t// Convert the field type to a JSON type.\n\tdetails := make([]string, 0, 3)\n\tdetails = append(details, reflectTypeToJSONType(xT, fieldType))\n\n\t// Add optional and default value to the details if needed.\n\tif isOptional {\n\t\tdetails = append(details, xT(\"help-optional\"))\n\n\t\t// Add the default value if there is one.  This is only checked\n\t\t// when the field is optional since a non-optional field can't\n\t\t// have a default value.\n\t\tif defaultVal != nil {\n\t\t\tval := defaultVal.Interface()\n\t\t\tif defaultVal.Kind() == reflect.String {\n\t\t\t\tval = fmt.Sprintf(`\"%s\"`, val)\n\t\t\t}\n\t\t\tstr := fmt.Sprintf(\"%s=%v\", xT(\"help-default\"), val)\n\t\t\tdetails = append(details, str)\n\t\t}\n\t} else {\n\t\tdetails = append(details, xT(\"help-required\"))\n\t}\n\n\treturn strings.Join(details, \", \")\n}\n\n// argHelp generates and returns formatted help for the provided command.\nfunc argHelp(xT descLookupFunc, rtp reflect.Type, defaults map[int]reflect.Value, method string) string {\n\t// Return now if the command has no arguments.\n\trt := rtp.Elem()\n\tnumFields := rt.NumField()\n\tif numFields == 0 {\n\t\treturn \"\"\n\t}\n\n\t// Generate the help for each argument in the command.  Several\n\t// simplifying assumptions are made here because the RegisterCmd\n\t// function has already rigorously enforced the layout.\n\targs := make([]string, 0, numFields)\n\tfor i := 0; i < numFields; i++ {\n\t\trtf := rt.Field(i)\n\t\tvar defaultVal *reflect.Value\n\t\tif defVal, ok := defaults[i]; ok {\n\t\t\tdefaultVal = &defVal\n\t\t}\n\n\t\tfieldName := strings.ToLower(rtf.Name)\n\t\thelpText := fmt.Sprintf(\"%d.\\t%s\\t(%s)\\t%s\", i+1, fieldName,\n\t\t\targTypeHelp(xT, rtf, defaultVal),\n\t\t\txT(method+\"-\"+fieldName))\n\t\targs = append(args, helpText)\n\n\t\t// For types which require a JSON object, or an array of JSON\n\t\t// objects, generate the full syntax for the argument.\n\t\tfieldType := rtf.Type\n\t\tif fieldType.Kind() == reflect.Ptr {\n\t\t\tfieldType = fieldType.Elem()\n\t\t}\n\t\tkind := fieldType.Kind()\n\t\tswitch kind {\n\t\tcase reflect.Struct:\n\t\t\tfieldDescKey := fmt.Sprintf(\"%s-%s\", method, fieldName)\n\t\t\tresultText := resultTypeHelp(xT, fieldType, fieldDescKey)\n\t\t\targs = append(args, resultText)\n\n\t\tcase reflect.Map:\n\t\t\tfieldDescKey := fmt.Sprintf(\"%s-%s\", method, fieldName)\n\t\t\tresultText := resultTypeHelp(xT, fieldType, fieldDescKey)\n\t\t\targs = append(args, resultText)\n\n\t\tcase reflect.Array, reflect.Slice:\n\t\t\tfieldDescKey := fmt.Sprintf(\"%s-%s\", method, fieldName)\n\t\t\tif rtf.Type.Elem().Kind() == reflect.Struct {\n\t\t\t\tresultText := resultTypeHelp(xT, fieldType,\n\t\t\t\t\tfieldDescKey)\n\t\t\t\targs = append(args, resultText)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add argument names, types, and descriptions if there are any.  Use a\n\t// tab writer to nicely align the help text.\n\tvar formatted bytes.Buffer\n\tw := new(tabwriter.Writer)\n\tw.Init(&formatted, 0, 4, 1, ' ', 0)\n\tfor _, text := range args {\n\t\tfmt.Fprintln(w, text)\n\t}\n\tw.Flush()\n\treturn formatted.String()\n}\n\n// methodHelp generates and returns the help output for the provided command\n// and method info.  This is the main work horse for the exported MethodHelp\n// function.\nfunc methodHelp(xT descLookupFunc, rtp reflect.Type, defaults map[int]reflect.Value, method string, resultTypes []interface{}) string {\n\t// Start off with the method usage and help synopsis.\n\thelp := fmt.Sprintf(\"%s\\n\\n%s\\n\", methodUsageText(rtp, defaults, method),\n\t\txT(method+\"--synopsis\"))\n\n\t// Generate the help for each argument in the command.\n\tif argText := argHelp(xT, rtp, defaults, method); argText != \"\" {\n\t\thelp += fmt.Sprintf(\"\\n%s:\\n%s\", xT(\"help-arguments\"),\n\t\t\targText)\n\t} else {\n\t\thelp += fmt.Sprintf(\"\\n%s:\\n%s\\n\", xT(\"help-arguments\"),\n\t\t\txT(\"help-arguments-none\"))\n\t}\n\n\t// Generate the help text for each result type.\n\tresultTexts := make([]string, 0, len(resultTypes))\n\tfor i := range resultTypes {\n\t\trtp := reflect.TypeOf(resultTypes[i])\n\t\tfieldDescKey := fmt.Sprintf(\"%s--result%d\", method, i)\n\t\tif resultTypes[i] == nil {\n\t\t\tresultText := xT(\"help-result-nothing\")\n\t\t\tresultTexts = append(resultTexts, resultText)\n\t\t\tcontinue\n\t\t}\n\n\t\tresultText := resultTypeHelp(xT, rtp.Elem(), fieldDescKey)\n\t\tresultTexts = append(resultTexts, resultText)\n\t}\n\n\t// Add result types and descriptions.  When there is more than one\n\t// result type, also add the condition which triggers it.\n\tif len(resultTexts) > 1 {\n\t\tfor i, resultText := range resultTexts {\n\t\t\tcondKey := fmt.Sprintf(\"%s--condition%d\", method, i)\n\t\t\thelp += fmt.Sprintf(\"\\n%s (%s):\\n%s\\n\",\n\t\t\t\txT(\"help-result\"), xT(condKey), resultText)\n\t\t}\n\t} else if len(resultTexts) > 0 {\n\t\thelp += fmt.Sprintf(\"\\n%s:\\n%s\\n\", xT(\"help-result\"),\n\t\t\tresultTexts[0])\n\t} else {\n\t\thelp += fmt.Sprintf(\"\\n%s:\\n%s\\n\", xT(\"help-result\"),\n\t\t\txT(\"help-result-nothing\"))\n\t}\n\treturn help\n}\n\n// isValidResultType returns whether the passed reflect kind is one of the\n// acceptable types for results.\nfunc isValidResultType(kind reflect.Kind) bool {\n\tif isNumeric(kind) {\n\t\treturn true\n\t}\n\n\tswitch kind {\n\tcase reflect.String, reflect.Struct, reflect.Array, reflect.Slice,\n\t\treflect.Bool, reflect.Map:\n\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// GenerateHelp generates and returns help output for the provided method and\n// result types given a map to provide the appropriate keys for the method\n// synopsis, field descriptions, conditions, and result descriptions.  The\n// method must be associated with a registered type.  All commands provided by\n// this package are registered by default.\n//\n// The resultTypes must be pointer-to-types which represent the specific types\n// of values the command returns.  For example, if the command only returns a\n// boolean value, there should only be a single entry of (*bool)(nil).  Note\n// that each type must be a single pointer to the type.  Therefore, it is\n// recommended to simply pass a nil pointer cast to the appropriate type as\n// previously shown.\n//\n// The provided descriptions map must contain all of the keys or an error will\n// be returned which includes the missing key, or the final missing key when\n// there is more than one key missing.  The generated help in the case of such\n// an error will use the key in place of the description.\n//\n// The following outlines the required keys:\n//\n//\t\"<method>--synopsis\"             Synopsis for the command\n//\t\"<method>-<lowerfieldname>\"      Description for each command argument\n//\t\"<typename>-<lowerfieldname>\"    Description for each object field\n//\t\"<method>--condition<#>\"         Description for each result condition\n//\t\"<method>--result<#>\"            Description for each primitive result num\n//\n// Notice that the \"special\" keys synopsis, condition<#>, and result<#> are\n// preceded by a double dash to ensure they don't conflict with field names.\n//\n// The condition keys are only required when there is more than on result type,\n// and the result key for a given result type is only required if it's not an\n// object.\n//\n// For example, consider the 'help' command itself.  There are two possible\n// returns depending on the provided parameters.  So, the help would be\n// generated by calling the function as follows:\n//\n//\tGenerateHelp(\"help\", descs, (*string)(nil), (*string)(nil)).\n//\n// The following keys would then be required in the provided descriptions map:\n//\n//\t\"help--synopsis\":   \"Returns a list of all commands or help for ....\"\n//\t\"help-command\":     \"The command to retrieve help for\",\n//\t\"help--condition0\": \"no command provided\"\n//\t\"help--condition1\": \"command specified\"\n//\t\"help--result0\":    \"List of commands\"\n//\t\"help--result1\":    \"Help for specified command\"\nfunc GenerateHelp(method string, descs map[string]string, resultTypes ...interface{}) (string, error) {\n\t// Look up details about the provided method and error out if not\n\t// registered.\n\tregisterLock.RLock()\n\trtp, ok := methodToConcreteType[method]\n\tinfo := methodToInfo[method]\n\tregisterLock.RUnlock()\n\tif !ok {\n\t\tstr := fmt.Sprintf(\"%q is not registered\", method)\n\t\treturn \"\", makeError(ErrUnregisteredMethod, str)\n\t}\n\n\t// Validate each result type is a pointer to a supported type (or nil).\n\tfor i, resultType := range resultTypes {\n\t\tif resultType == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\trtp := reflect.TypeOf(resultType)\n\t\tif rtp.Kind() != reflect.Ptr {\n\t\t\tstr := fmt.Sprintf(\"result #%d (%v) is not a pointer\",\n\t\t\t\ti, rtp.Kind())\n\t\t\treturn \"\", makeError(ErrInvalidType, str)\n\t\t}\n\n\t\telemKind := rtp.Elem().Kind()\n\t\tif !isValidResultType(elemKind) {\n\t\t\tstr := fmt.Sprintf(\"result #%d (%v) is not an allowed \"+\n\t\t\t\t\"type\", i, elemKind)\n\t\t\treturn \"\", makeError(ErrInvalidType, str)\n\t\t}\n\t}\n\n\t// Create a closure for the description lookup function which falls back\n\t// to the base help descriptions map for unrecognized keys and tracks\n\t// and missing keys.\n\tvar missingKey string\n\txT := func(key string) string {\n\t\tif desc, ok := descs[key]; ok {\n\t\t\treturn desc\n\t\t}\n\t\tif desc, ok := baseHelpDescs[key]; ok {\n\t\t\treturn desc\n\t\t}\n\n\t\tmissingKey = key\n\t\treturn key\n\t}\n\n\t// Generate and return the help for the method.\n\thelp := methodHelp(xT, rtp, info.defaults, method, resultTypes)\n\tif missingKey != \"\" {\n\t\treturn help, makeError(ErrMissingDescription, missingKey)\n\t}\n\treturn help, nil\n}\n"
  },
  {
    "path": "btcjson/help_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestHelpReflectInternals ensures the various help functions which deal with\n// reflect types work as expected for various Go types.\nfunc TestHelpReflectInternals(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname        string\n\t\treflectType reflect.Type\n\t\tindentLevel int\n\t\tkey         string\n\t\texamples    []string\n\t\tisComplex   bool\n\t\thelp        string\n\t\tisInvalid   bool\n\t}{\n\t\t{\n\t\t\tname:        \"int\",\n\t\t\treflectType: reflect.TypeOf(int(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n\"},\n\t\t\thelp:        \"n (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"*int\",\n\t\t\treflectType: reflect.TypeOf((*int)(nil)),\n\t\t\tkey:         \"json-type-value\",\n\t\t\texamples:    []string{\"n\"},\n\t\t\thelp:        \"n (json-type-value) fdk\",\n\t\t\tisInvalid:   true,\n\t\t},\n\t\t{\n\t\t\tname:        \"int8\",\n\t\t\treflectType: reflect.TypeOf(int8(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n\"},\n\t\t\thelp:        \"n (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"int16\",\n\t\t\treflectType: reflect.TypeOf(int16(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n\"},\n\t\t\thelp:        \"n (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"int32\",\n\t\t\treflectType: reflect.TypeOf(int32(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n\"},\n\t\t\thelp:        \"n (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"int64\",\n\t\t\treflectType: reflect.TypeOf(int64(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n\"},\n\t\t\thelp:        \"n (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"uint\",\n\t\t\treflectType: reflect.TypeOf(uint(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n\"},\n\t\t\thelp:        \"n (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"uint8\",\n\t\t\treflectType: reflect.TypeOf(uint8(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n\"},\n\t\t\thelp:        \"n (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"uint16\",\n\t\t\treflectType: reflect.TypeOf(uint16(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n\"},\n\t\t\thelp:        \"n (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"uint32\",\n\t\t\treflectType: reflect.TypeOf(uint32(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n\"},\n\t\t\thelp:        \"n (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"uint64\",\n\t\t\treflectType: reflect.TypeOf(uint64(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n\"},\n\t\t\thelp:        \"n (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"float32\",\n\t\t\treflectType: reflect.TypeOf(float32(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n.nnn\"},\n\t\t\thelp:        \"n.nnn (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"float64\",\n\t\t\treflectType: reflect.TypeOf(float64(0)),\n\t\t\tkey:         \"json-type-numeric\",\n\t\t\texamples:    []string{\"n.nnn\"},\n\t\t\thelp:        \"n.nnn (json-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"string\",\n\t\t\treflectType: reflect.TypeOf(\"\"),\n\t\t\tkey:         \"json-type-string\",\n\t\t\texamples:    []string{`\"json-example-string\"`},\n\t\t\thelp:        \"\\\"json-example-string\\\" (json-type-string) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"bool\",\n\t\t\treflectType: reflect.TypeOf(true),\n\t\t\tkey:         \"json-type-bool\",\n\t\t\texamples:    []string{\"json-example-bool\"},\n\t\t\thelp:        \"json-example-bool (json-type-bool) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"array of int\",\n\t\t\treflectType: reflect.TypeOf([1]int{0}),\n\t\t\tkey:         \"json-type-arrayjson-type-numeric\",\n\t\t\texamples:    []string{\"[n,...]\"},\n\t\t\thelp:        \"[n,...] (json-type-arrayjson-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"slice of int\",\n\t\t\treflectType: reflect.TypeOf([]int{0}),\n\t\t\tkey:         \"json-type-arrayjson-type-numeric\",\n\t\t\texamples:    []string{\"[n,...]\"},\n\t\t\thelp:        \"[n,...] (json-type-arrayjson-type-numeric) fdk\",\n\t\t},\n\t\t{\n\t\t\tname:        \"struct\",\n\t\t\treflectType: reflect.TypeOf(struct{}{}),\n\t\t\tkey:         \"json-type-object\",\n\t\t\texamples:    []string{\"{\", \"}\\t\\t\"},\n\t\t\tisComplex:   true,\n\t\t\thelp:        \"{\\n} \",\n\t\t},\n\t\t{\n\t\t\tname:        \"struct indent level 1\",\n\t\t\treflectType: reflect.TypeOf(struct{ field int }{}),\n\t\t\tindentLevel: 1,\n\t\t\tkey:         \"json-type-object\",\n\t\t\texamples: []string{\n\t\t\t\t\"  \\\"field\\\": n,\\t(json-type-numeric)\\t-field\",\n\t\t\t\t\" },\\t\\t\",\n\t\t\t},\n\t\t\thelp: \"{\\n\" +\n\t\t\t\t\" \\\"field\\\": n, (json-type-numeric) -field\\n\" +\n\t\t\t\t\"}            \",\n\t\t\tisComplex: true,\n\t\t},\n\t\t{\n\t\t\tname: \"array of struct indent level 0\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tfield int\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf([]s{})\n\t\t\t}(),\n\t\t\tkey: \"json-type-arrayjson-type-object\",\n\t\t\texamples: []string{\n\t\t\t\t\"[{\",\n\t\t\t\t\" \\\"field\\\": n,\\t(json-type-numeric)\\ts-field\",\n\t\t\t\t\"},...]\",\n\t\t\t},\n\t\t\thelp: \"[{\\n\" +\n\t\t\t\t\" \\\"field\\\": n, (json-type-numeric) s-field\\n\" +\n\t\t\t\t\"},...]\",\n\t\t\tisComplex: true,\n\t\t},\n\t\t{\n\t\t\tname: \"array of struct indent level 1\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tfield int\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf([]s{})\n\t\t\t}(),\n\t\t\tindentLevel: 1,\n\t\t\tkey:         \"json-type-arrayjson-type-object\",\n\t\t\texamples: []string{\n\t\t\t\t\"  \\\"field\\\": n,\\t(json-type-numeric)\\ts-field\",\n\t\t\t\t\" },...],\\t\\t\",\n\t\t\t},\n\t\t\thelp: \"[{\\n\" +\n\t\t\t\t\" \\\"field\\\": n, (json-type-numeric) s-field\\n\" +\n\t\t\t\t\"},...]\",\n\t\t\tisComplex: true,\n\t\t},\n\t\t{\n\t\t\tname:        \"map\",\n\t\t\treflectType: reflect.TypeOf(map[string]string{}),\n\t\t\tkey:         \"json-type-object\",\n\t\t\texamples: []string{\"{\",\n\t\t\t\t\" \\\"fdk--key\\\": fdk--value, (json-type-object) fdk--desc\",\n\t\t\t\t\" ...\", \"}\",\n\t\t\t},\n\t\t\thelp: \"{\\n\" +\n\t\t\t\t\" \\\"fdk--key\\\": fdk--value, (json-type-object) fdk--desc\\n\" +\n\t\t\t\t\" ...\\n\" +\n\t\t\t\t\"}\",\n\t\t\tisComplex: true,\n\t\t},\n\t\t{\n\t\t\tname:        \"complex\",\n\t\t\treflectType: reflect.TypeOf(complex64(0)),\n\t\t\tkey:         \"json-type-value\",\n\t\t\texamples:    []string{\"json-example-unknown\"},\n\t\t\thelp:        \"json-example-unknown (json-type-value) fdk\",\n\t\t\tisInvalid:   true,\n\t\t},\n\t}\n\n\txT := func(key string) string {\n\t\treturn key\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Ensure the description key is the expected value.\n\t\tkey := btcjson.TstReflectTypeToJSONType(xT, test.reflectType)\n\t\tif key != test.key {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected key - got: %v, \"+\n\t\t\t\t\"want: %v\", i, test.name, key, test.key)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the generated example is as expected.\n\t\texamples, isComplex := btcjson.TstReflectTypeToJSONExample(xT,\n\t\t\ttest.reflectType, test.indentLevel, \"fdk\")\n\t\tif isComplex != test.isComplex {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected isComplex - got: %v, \"+\n\t\t\t\t\"want: %v\", i, test.name, isComplex,\n\t\t\t\ttest.isComplex)\n\t\t\tcontinue\n\t\t}\n\t\tif len(examples) != len(test.examples) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected result length - \"+\n\t\t\t\t\"got: %v, want: %v\", i, test.name, len(examples),\n\t\t\t\tlen(test.examples))\n\t\t\tcontinue\n\t\t}\n\t\tfor j, example := range examples {\n\t\t\tif example != test.examples[j] {\n\t\t\t\tt.Errorf(\"Test #%d (%s) example #%d unexpected \"+\n\t\t\t\t\t\"example - got: %v, want: %v\", i,\n\t\t\t\t\ttest.name, j, example, test.examples[j])\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the generated result type help is as expected.\n\t\thelpText := btcjson.TstResultTypeHelp(xT, test.reflectType, \"fdk\")\n\t\tif helpText != test.help {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected result help - \"+\n\t\t\t\t\"got: %v, want: %v\", i, test.name, helpText,\n\t\t\t\ttest.help)\n\t\t\tcontinue\n\t\t}\n\n\t\tisValid := btcjson.TstIsValidResultType(test.reflectType.Kind())\n\t\tif isValid != !test.isInvalid {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected result type validity \"+\n\t\t\t\t\"- got: %v\", i, test.name, isValid)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestResultStructHelp ensures the expected help text format is returned for\n// various Go struct types.\nfunc TestResultStructHelp(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname        string\n\t\treflectType reflect.Type\n\t\texpected    []string\n\t}{\n\t\t{\n\t\t\tname: \"empty struct\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct{}\n\t\t\t\treturn reflect.TypeOf(s{})\n\t\t\t}(),\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"struct with primitive field\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tfield int\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf(s{})\n\t\t\t}(),\n\t\t\texpected: []string{\n\t\t\t\t\"\\\"field\\\": n,\\t(json-type-numeric)\\ts-field\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"struct with primitive field and json tag\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tField int `json:\"f\"`\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf(s{})\n\t\t\t}(),\n\t\t\texpected: []string{\n\t\t\t\t\"\\\"f\\\": n,\\t(json-type-numeric)\\ts-f\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"struct with array of primitive field\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tfield []int\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf(s{})\n\t\t\t}(),\n\t\t\texpected: []string{\n\t\t\t\t\"\\\"field\\\": [n,...],\\t(json-type-arrayjson-type-numeric)\\ts-field\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"struct with sub-struct field\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tsubField int\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tfield s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf(s{})\n\t\t\t}(),\n\t\t\texpected: []string{\n\t\t\t\t\"\\\"field\\\": {\\t(json-type-object)\\ts-field\",\n\t\t\t\t\"{\",\n\t\t\t\t\" \\\"subfield\\\": n,\\t(json-type-numeric)\\ts2-subfield\",\n\t\t\t\t\"}\\t\\t\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"struct with sub-struct field pointer\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tsubField int\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tfield *s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf(s{})\n\t\t\t}(),\n\t\t\texpected: []string{\n\t\t\t\t\"\\\"field\\\": {\\t(json-type-object)\\ts-field\",\n\t\t\t\t\"{\",\n\t\t\t\t\" \\\"subfield\\\": n,\\t(json-type-numeric)\\ts2-subfield\",\n\t\t\t\t\"}\\t\\t\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"struct with array of structs field\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tsubField int\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tfield []s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf(s{})\n\t\t\t}(),\n\t\t\texpected: []string{\n\t\t\t\t\"\\\"field\\\": [{\\t(json-type-arrayjson-type-object)\\ts-field\",\n\t\t\t\t\"[{\",\n\t\t\t\t\" \\\"subfield\\\": n,\\t(json-type-numeric)\\ts2-subfield\",\n\t\t\t\t\"},...]\",\n\t\t\t},\n\t\t},\n\t}\n\n\txT := func(key string) string {\n\t\treturn key\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresults := btcjson.TstResultStructHelp(xT, test.reflectType, 0)\n\t\tif len(results) != len(test.expected) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected result length - \"+\n\t\t\t\t\"got: %v, want: %v\", i, test.name, len(results),\n\t\t\t\tlen(test.expected))\n\t\t\tcontinue\n\t\t}\n\t\tfor j, result := range results {\n\t\t\tif result != test.expected[j] {\n\t\t\t\tt.Errorf(\"Test #%d (%s) result #%d unexpected \"+\n\t\t\t\t\t\"result - got: %v, want: %v\", i,\n\t\t\t\t\ttest.name, j, result, test.expected[j])\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestHelpArgInternals ensures the various help functions which deal with\n// arguments work as expected for various argument types.\nfunc TestHelpArgInternals(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname        string\n\t\tmethod      string\n\t\treflectType reflect.Type\n\t\tdefaults    map[int]reflect.Value\n\t\thelp        string\n\t}{\n\t\t{\n\t\t\tname:   \"command with no args\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct{}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\tdefaults: nil,\n\t\t\thelp:     \"\",\n\t\t},\n\t\t{\n\t\t\tname:   \"command with one required arg\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tField int\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\tdefaults: nil,\n\t\t\thelp:     \"1. field (json-type-numeric, help-required) test-field\\n\",\n\t\t},\n\t\t{\n\t\t\tname:   \"command with one optional arg, no default\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tOptional *int\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\tdefaults: nil,\n\t\t\thelp:     \"1. optional (json-type-numeric, help-optional) test-optional\\n\",\n\t\t},\n\t\t{\n\t\t\tname:   \"command with one optional arg with default\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tOptional *string\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\tdefaults: func() map[int]reflect.Value {\n\t\t\t\tdefVal := \"test\"\n\t\t\t\treturn map[int]reflect.Value{\n\t\t\t\t\t0: reflect.ValueOf(&defVal),\n\t\t\t\t}\n\t\t\t}(),\n\t\t\thelp: \"1. optional (json-type-string, help-optional, help-default=\\\"test\\\") test-optional\\n\",\n\t\t},\n\t\t{\n\t\t\tname:   \"command with struct field\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tF int8\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tField s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\tdefaults: nil,\n\t\t\thelp: \"1. field (json-type-object, help-required) test-field\\n\" +\n\t\t\t\t\"{\\n\" +\n\t\t\t\t\" \\\"f\\\": n, (json-type-numeric) s2-f\\n\" +\n\t\t\t\t\"}        \\n\",\n\t\t},\n\t\t{\n\t\t\tname:   \"command with map field\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tField map[string]float64\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\tdefaults: nil,\n\t\t\thelp: \"1. field (json-type-object, help-required) test-field\\n\" +\n\t\t\t\t\"{\\n\" +\n\t\t\t\t\" \\\"test-field--key\\\": test-field--value, (json-type-object) test-field--desc\\n\" +\n\t\t\t\t\" ...\\n\" +\n\t\t\t\t\"}\\n\",\n\t\t},\n\t\t{\n\t\t\tname:   \"command with slice of primitives field\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tField []int64\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\tdefaults: nil,\n\t\t\thelp:     \"1. field (json-type-arrayjson-type-numeric, help-required) test-field\\n\",\n\t\t},\n\t\t{\n\t\t\tname:   \"command with slice of structs field\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s2 struct {\n\t\t\t\t\tF int64\n\t\t\t\t}\n\t\t\t\ttype s struct {\n\t\t\t\t\tField []s2\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\tdefaults: nil,\n\t\t\thelp: \"1. field (json-type-arrayjson-type-object, help-required) test-field\\n\" +\n\t\t\t\t\"[{\\n\" +\n\t\t\t\t\" \\\"f\\\": n, (json-type-numeric) s2-f\\n\" +\n\t\t\t\t\"},...]\\n\",\n\t\t},\n\t}\n\n\txT := func(key string) string {\n\t\treturn key\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\thelp := btcjson.TstArgHelp(xT, test.reflectType, test.defaults,\n\t\t\ttest.method)\n\t\tif help != test.help {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected help - got:\\n%v\\n\"+\n\t\t\t\t\"want:\\n%v\", i, test.name, help, test.help)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMethodHelp ensures the method help function works as expected for various\n// command structs.\nfunc TestMethodHelp(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname        string\n\t\tmethod      string\n\t\treflectType reflect.Type\n\t\tdefaults    map[int]reflect.Value\n\t\tresultTypes []interface{}\n\t\thelp        string\n\t}{\n\t\t{\n\t\t\tname:   \"command with no args or results\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct{}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\thelp: \"test\\n\\ntest--synopsis\\n\\n\" +\n\t\t\t\t\"help-arguments:\\nhelp-arguments-none\\n\\n\" +\n\t\t\t\t\"help-result:\\nhelp-result-nothing\\n\",\n\t\t},\n\t\t{\n\t\t\tname:   \"command with no args and one primitive result\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct{}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\tresultTypes: []interface{}{(*int64)(nil)},\n\t\t\thelp: \"test\\n\\ntest--synopsis\\n\\n\" +\n\t\t\t\t\"help-arguments:\\nhelp-arguments-none\\n\\n\" +\n\t\t\t\t\"help-result:\\nn (json-type-numeric) test--result0\\n\",\n\t\t},\n\t\t{\n\t\t\tname:   \"command with no args and two results\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct{}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\tresultTypes: []interface{}{(*int64)(nil), nil},\n\t\t\thelp: \"test\\n\\ntest--synopsis\\n\\n\" +\n\t\t\t\t\"help-arguments:\\nhelp-arguments-none\\n\\n\" +\n\t\t\t\t\"help-result (test--condition0):\\nn (json-type-numeric) test--result0\\n\\n\" +\n\t\t\t\t\"help-result (test--condition1):\\nhelp-result-nothing\\n\",\n\t\t},\n\t\t{\n\t\t\tname:   \"command with primitive arg and no results\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tField bool\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\thelp: \"test field\\n\\ntest--synopsis\\n\\n\" +\n\t\t\t\t\"help-arguments:\\n1. field (json-type-bool, help-required) test-field\\n\\n\" +\n\t\t\t\t\"help-result:\\nhelp-result-nothing\\n\",\n\t\t},\n\t\t{\n\t\t\tname:   \"command with primitive optional and no results\",\n\t\t\tmethod: \"test\",\n\t\t\treflectType: func() reflect.Type {\n\t\t\t\ttype s struct {\n\t\t\t\t\tField *bool\n\t\t\t\t}\n\t\t\t\treturn reflect.TypeOf((*s)(nil))\n\t\t\t}(),\n\t\t\thelp: \"test (field)\\n\\ntest--synopsis\\n\\n\" +\n\t\t\t\t\"help-arguments:\\n1. field (json-type-bool, help-optional) test-field\\n\\n\" +\n\t\t\t\t\"help-result:\\nhelp-result-nothing\\n\",\n\t\t},\n\t}\n\n\txT := func(key string) string {\n\t\treturn key\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\thelp := btcjson.TestMethodHelp(xT, test.reflectType,\n\t\t\ttest.defaults, test.method, test.resultTypes)\n\t\tif help != test.help {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected help - got:\\n%v\\n\"+\n\t\t\t\t\"want:\\n%v\", i, test.name, help, test.help)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestGenerateHelpErrors ensures the GenerateHelp function returns the expected\n// errors.\nfunc TestGenerateHelpErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname        string\n\t\tmethod      string\n\t\tresultTypes []interface{}\n\t\terr         btcjson.Error\n\t}{\n\t\t{\n\t\t\tname:   \"unregistered command\",\n\t\t\tmethod: \"boguscommand\",\n\t\t\terr:    btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},\n\t\t},\n\t\t{\n\t\t\tname:        \"non-pointer result type\",\n\t\t\tmethod:      \"help\",\n\t\t\tresultTypes: []interface{}{0},\n\t\t\terr:         btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname:        \"invalid result type\",\n\t\t\tmethod:      \"help\",\n\t\t\tresultTypes: []interface{}{(*complex64)(nil)},\n\t\t\terr:         btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname:        \"missing description\",\n\t\t\tmethod:      \"help\",\n\t\t\tresultTypes: []interface{}{(*string)(nil), nil},\n\t\t\terr:         btcjson.Error{ErrorCode: btcjson.ErrMissingDescription},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t_, err := btcjson.GenerateHelp(test.method, nil,\n\t\t\ttest.resultTypes...)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Test #%d (%s) wrong error - got %T (%v), \"+\n\t\t\t\t\"want %T\", i, test.name, err, err, test.err)\n\t\t\tcontinue\n\t\t}\n\t\tgotErrorCode := err.(btcjson.Error).ErrorCode\n\t\tif gotErrorCode != test.err.ErrorCode {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched error code - got \"+\n\t\t\t\t\"%v (%v), want %v\", i, test.name, gotErrorCode,\n\t\t\t\terr, test.err.ErrorCode)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestGenerateHelp performs a very basic test to ensure GenerateHelp is working\n// as expected.  The internal are testd much more thoroughly in other tests, so\n// there is no need to add more tests here.\nfunc TestGenerateHelp(t *testing.T) {\n\tt.Parallel()\n\n\tdescs := map[string]string{\n\t\t\"help--synopsis\": \"test\",\n\t\t\"help-command\":   \"test\",\n\t}\n\thelp, err := btcjson.GenerateHelp(\"help\", descs)\n\tif err != nil {\n\t\tt.Fatalf(\"GenerateHelp: unexpected error: %v\", err)\n\t}\n\twantHelp := \"help (\\\"command\\\")\\n\\n\" +\n\t\t\"test\\n\\nArguments:\\n1. command (string, optional) test\\n\\n\" +\n\t\t\"Result:\\nNothing\\n\"\n\tif help != wantHelp {\n\t\tt.Fatalf(\"GenerateHelp: unexpected help - got\\n%v\\nwant\\n%v\",\n\t\t\thelp, wantHelp)\n\t}\n}\n"
  },
  {
    "path": "btcjson/helpers.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\n// Bool is a helper routine that allocates a new bool value to store v and\n// returns a pointer to it.  This is useful when assigning optional parameters.\nfunc Bool(v bool) *bool {\n\tp := new(bool)\n\t*p = v\n\treturn p\n}\n\n// Int is a helper routine that allocates a new int value to store v and\n// returns a pointer to it.  This is useful when assigning optional parameters.\nfunc Int(v int) *int {\n\tp := new(int)\n\t*p = v\n\treturn p\n}\n\n// Uint is a helper routine that allocates a new uint value to store v and\n// returns a pointer to it.  This is useful when assigning optional parameters.\nfunc Uint(v uint) *uint {\n\tp := new(uint)\n\t*p = v\n\treturn p\n}\n\n// Int32 is a helper routine that allocates a new int32 value to store v and\n// returns a pointer to it.  This is useful when assigning optional parameters.\nfunc Int32(v int32) *int32 {\n\tp := new(int32)\n\t*p = v\n\treturn p\n}\n\n// Uint32 is a helper routine that allocates a new uint32 value to store v and\n// returns a pointer to it.  This is useful when assigning optional parameters.\nfunc Uint32(v uint32) *uint32 {\n\tp := new(uint32)\n\t*p = v\n\treturn p\n}\n\n// Int64 is a helper routine that allocates a new int64 value to store v and\n// returns a pointer to it.  This is useful when assigning optional parameters.\nfunc Int64(v int64) *int64 {\n\tp := new(int64)\n\t*p = v\n\treturn p\n}\n\n// Uint64 is a helper routine that allocates a new uint64 value to store v and\n// returns a pointer to it.  This is useful when assigning optional parameters.\nfunc Uint64(v uint64) *uint64 {\n\tp := new(uint64)\n\t*p = v\n\treturn p\n}\n\n// Float64 is a helper routine that allocates a new float64 value to store v and\n// returns a pointer to it.  This is useful when assigning optional parameters.\nfunc Float64(v float64) *float64 {\n\tp := new(float64)\n\t*p = v\n\treturn p\n}\n\n// String is a helper routine that allocates a new string value to store v and\n// returns a pointer to it.  This is useful when assigning optional parameters.\nfunc String(v string) *string {\n\tp := new(string)\n\t*p = v\n\treturn p\n}\n\n// NewFilterTypeName is a helper routine that allocates a new FilterTypeName value to store v and\n// returns a pointer to it.  This is useful when assigning optional parameters.\nfunc NewFilterTypeName(v FilterTypeName) *FilterTypeName {\n\tp := new(FilterTypeName)\n\t*p = v\n\treturn p\n}\n"
  },
  {
    "path": "btcjson/helpers_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestHelpers tests the various helper functions which create pointers to\n// primitive types.\nfunc TestHelpers(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tf        func() interface{}\n\t\texpected interface{}\n\t}{\n\t\t{\n\t\t\tname: \"bool\",\n\t\t\tf: func() interface{} {\n\t\t\t\treturn btcjson.Bool(true)\n\t\t\t},\n\t\t\texpected: func() interface{} {\n\t\t\t\tval := true\n\t\t\t\treturn &val\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tname: \"int\",\n\t\t\tf: func() interface{} {\n\t\t\t\treturn btcjson.Int(5)\n\t\t\t},\n\t\t\texpected: func() interface{} {\n\t\t\t\tval := int(5)\n\t\t\t\treturn &val\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tname: \"uint\",\n\t\t\tf: func() interface{} {\n\t\t\t\treturn btcjson.Uint(5)\n\t\t\t},\n\t\t\texpected: func() interface{} {\n\t\t\t\tval := uint(5)\n\t\t\t\treturn &val\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tname: \"int32\",\n\t\t\tf: func() interface{} {\n\t\t\t\treturn btcjson.Int32(5)\n\t\t\t},\n\t\t\texpected: func() interface{} {\n\t\t\t\tval := int32(5)\n\t\t\t\treturn &val\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tname: \"uint32\",\n\t\t\tf: func() interface{} {\n\t\t\t\treturn btcjson.Uint32(5)\n\t\t\t},\n\t\t\texpected: func() interface{} {\n\t\t\t\tval := uint32(5)\n\t\t\t\treturn &val\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tname: \"int64\",\n\t\t\tf: func() interface{} {\n\t\t\t\treturn btcjson.Int64(5)\n\t\t\t},\n\t\t\texpected: func() interface{} {\n\t\t\t\tval := int64(5)\n\t\t\t\treturn &val\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tname: \"uint64\",\n\t\t\tf: func() interface{} {\n\t\t\t\treturn btcjson.Uint64(5)\n\t\t\t},\n\t\t\texpected: func() interface{} {\n\t\t\t\tval := uint64(5)\n\t\t\t\treturn &val\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tname: \"string\",\n\t\t\tf: func() interface{} {\n\t\t\t\treturn btcjson.String(\"abc\")\n\t\t\t},\n\t\t\texpected: func() interface{} {\n\t\t\t\tval := \"abc\"\n\t\t\t\treturn &val\n\t\t\t}(),\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.f()\n\t\tif !reflect.DeepEqual(result, test.expected) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected value - got %v, \"+\n\t\t\t\t\"want %v\", i, test.name, result, test.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/jsonrpc.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n)\n\n// RPCVersion is a type to indicate RPC versions.\ntype RPCVersion string\n\nconst (\n\t// version 1 of rpc\n\tRpcVersion1 RPCVersion = RPCVersion(\"1.0\")\n\t// version 2 of rpc\n\tRpcVersion2 RPCVersion = RPCVersion(\"2.0\")\n)\n\nvar validRpcVersions = []RPCVersion{RpcVersion1, RpcVersion2}\n\n// check if the rpc version is a valid version\nfunc (r RPCVersion) IsValid() bool {\n\tfor _, version := range validRpcVersions {\n\t\tif version == r {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// cast rpc version to a string\nfunc (r RPCVersion) String() string {\n\treturn string(r)\n}\n\n// RPCErrorCode represents an error code to be used as a part of an RPCError\n// which is in turn used in a JSON-RPC Response object.\n//\n// A specific type is used to help ensure the wrong errors aren't used.\ntype RPCErrorCode int\n\n// RPCError represents an error that is used as a part of a JSON-RPC Response\n// object.\ntype RPCError struct {\n\tCode    RPCErrorCode `json:\"code,omitempty\"`\n\tMessage string       `json:\"message,omitempty\"`\n}\n\n// Guarantee RPCError satisfies the builtin error interface.\nvar _, _ error = RPCError{}, (*RPCError)(nil)\n\n// Error returns a string describing the RPC error.  This satisfies the\n// builtin error interface.\nfunc (e RPCError) Error() string {\n\treturn fmt.Sprintf(\"%d: %s\", e.Code, e.Message)\n}\n\n// NewRPCError constructs and returns a new JSON-RPC error that is suitable\n// for use in a JSON-RPC Response object.\nfunc NewRPCError(code RPCErrorCode, message string) *RPCError {\n\treturn &RPCError{\n\t\tCode:    code,\n\t\tMessage: message,\n\t}\n}\n\n// IsValidIDType checks that the ID field (which can go in any of the JSON-RPC\n// requests, responses, or notifications) is valid.  JSON-RPC 1.0 allows any\n// valid JSON type.  JSON-RPC 2.0 (which bitcoind follows for some parts) only\n// allows string, number, or null, so this function restricts the allowed types\n// to that list.  This function is only provided in case the caller is manually\n// marshalling for some reason.    The functions which accept an ID in this\n// package already call this function to ensure the provided id is valid.\nfunc IsValidIDType(id interface{}) bool {\n\tswitch id.(type) {\n\tcase int, int8, int16, int32, int64,\n\t\tuint, uint8, uint16, uint32, uint64,\n\t\tfloat32, float64,\n\t\tstring,\n\t\tnil:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// Request is a type for raw JSON-RPC 1.0 requests.  The Method field identifies\n// the specific command type which in turns leads to different parameters.\n// Callers typically will not use this directly since this package provides a\n// statically typed command infrastructure which handles creation of these\n// requests, however this struct it being exported in case the caller wants to\n// construct raw requests for some reason.\ntype Request struct {\n\tJsonrpc RPCVersion        `json:\"jsonrpc\"`\n\tMethod  string            `json:\"method\"`\n\tParams  []json.RawMessage `json:\"params\"`\n\tID      interface{}       `json:\"id\"`\n}\n\n// UnmarshalJSON is a custom unmarshal func for the Request struct. The param\n// field defaults to an empty json.RawMessage array it is omitted by the request\n// or nil if the supplied value is invalid.\nfunc (request *Request) UnmarshalJSON(b []byte) error {\n\t// Step 1: Create a type alias of the original struct.\n\ttype Alias Request\n\n\t// Step 2: Create an anonymous struct with raw replacements for the special\n\t// fields.\n\taux := &struct {\n\t\tJsonrpc string        `json:\"jsonrpc\"`\n\t\tParams  []interface{} `json:\"params\"`\n\t\t*Alias\n\t}{\n\t\tAlias: (*Alias)(request),\n\t}\n\n\t// Step 3: Unmarshal the data into the anonymous struct.\n\terr := json.Unmarshal(b, &aux)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Step 4: Convert the raw fields to the desired types\n\n\tversion := RPCVersion(aux.Jsonrpc)\n\tif version.IsValid() {\n\t\trequest.Jsonrpc = version\n\t}\n\n\trawParams := make([]json.RawMessage, 0)\n\n\tfor _, param := range aux.Params {\n\t\tmarshalledParam, err := json.Marshal(param)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\trawMessage := json.RawMessage(marshalledParam)\n\t\trawParams = append(rawParams, rawMessage)\n\t}\n\n\trequest.Params = rawParams\n\n\treturn nil\n}\n\n// NewRequest returns a new JSON-RPC request object given the provided rpc\n// version, id, method, and parameters.  The parameters are marshalled into a\n// json.RawMessage for the Params field of the returned request object. This\n// function is only provided in case the caller wants to construct raw requests\n// for some reason. Typically callers will instead want to create a registered\n// concrete command type with the NewCmd or New<Foo>Cmd functions and call the\n// MarshalCmd function with that command to generate the marshalled JSON-RPC\n// request.\nfunc NewRequest(rpcVersion RPCVersion, id interface{}, method string, params []interface{}) (*Request, error) {\n\t// default to JSON-RPC 1.0 if RPC type is not specified\n\tif rpcVersion == \"\" {\n\t\trpcVersion = RpcVersion1\n\t}\n\tif !rpcVersion.IsValid() {\n\t\tstr := fmt.Sprintf(\"rpcversion '%s' is invalid\", rpcVersion)\n\t\treturn nil, makeError(ErrInvalidType, str)\n\t}\n\n\tif !IsValidIDType(id) {\n\t\tstr := fmt.Sprintf(\"the id of type '%T' is invalid\", id)\n\t\treturn nil, makeError(ErrInvalidType, str)\n\t}\n\n\trawParams := make([]json.RawMessage, 0, len(params))\n\tfor _, param := range params {\n\t\tmarshalledParam, err := json.Marshal(param)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\trawMessage := json.RawMessage(marshalledParam)\n\t\trawParams = append(rawParams, rawMessage)\n\t}\n\n\treturn &Request{\n\t\tJsonrpc: rpcVersion,\n\t\tID:      id,\n\t\tMethod:  method,\n\t\tParams:  rawParams,\n\t}, nil\n}\n\n// Response is the general form of a JSON-RPC response.  The type of the\n// Result field varies from one command to the next, so it is implemented as an\n// interface.  The ID field has to be a pointer to allow for a nil value when\n// empty.\ntype Response struct {\n\tJsonrpc RPCVersion      `json:\"jsonrpc\"`\n\tResult  json.RawMessage `json:\"result\"`\n\tError   *RPCError       `json:\"error\"`\n\tID      *interface{}    `json:\"id\"`\n}\n\n// NewResponse returns a new JSON-RPC response object given the provided rpc\n// version, id, marshalled result, and RPC error.  This function is only\n// provided in case the caller wants to construct raw responses for some reason.\n// Typically callers will instead want to create the fully marshalled JSON-RPC\n// response to send over the wire with the MarshalResponse function.\nfunc NewResponse(rpcVersion RPCVersion, id interface{}, marshalledResult []byte, rpcErr *RPCError) (*Response, error) {\n\tif !rpcVersion.IsValid() {\n\t\tstr := fmt.Sprintf(\"rpcversion '%s' is invalid\", rpcVersion)\n\t\treturn nil, makeError(ErrInvalidType, str)\n\t}\n\n\tif !IsValidIDType(id) {\n\t\tstr := fmt.Sprintf(\"the id of type '%T' is invalid\", id)\n\t\treturn nil, makeError(ErrInvalidType, str)\n\t}\n\n\tpid := &id\n\treturn &Response{\n\t\tJsonrpc: rpcVersion,\n\t\tResult:  marshalledResult,\n\t\tError:   rpcErr,\n\t\tID:      pid,\n\t}, nil\n}\n\n// MarshalResponse marshals the passed rpc version, id, result, and RPCError to\n// a JSON-RPC response byte slice that is suitable for transmission to a\n// JSON-RPC client.\nfunc MarshalResponse(rpcVersion RPCVersion, id interface{}, result interface{}, rpcErr *RPCError) ([]byte, error) {\n\tif !rpcVersion.IsValid() {\n\t\tstr := fmt.Sprintf(\"rpcversion '%s' is invalid\", rpcVersion)\n\t\treturn nil, makeError(ErrInvalidType, str)\n\t}\n\n\tmarshalledResult, err := json.Marshal(result)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresponse, err := NewResponse(rpcVersion, id, marshalledResult, rpcErr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn json.Marshal(&response)\n}\n"
  },
  {
    "path": "btcjson/jsonrpc_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"encoding/json\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestIsValidIDType ensures the IsValidIDType function behaves as expected.\nfunc TestIsValidIDType(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname    string\n\t\tid      interface{}\n\t\tisValid bool\n\t}{\n\t\t{\"int\", int(1), true},\n\t\t{\"int8\", int8(1), true},\n\t\t{\"int16\", int16(1), true},\n\t\t{\"int32\", int32(1), true},\n\t\t{\"int64\", int64(1), true},\n\t\t{\"uint\", uint(1), true},\n\t\t{\"uint8\", uint8(1), true},\n\t\t{\"uint16\", uint16(1), true},\n\t\t{\"uint32\", uint32(1), true},\n\t\t{\"uint64\", uint64(1), true},\n\t\t{\"string\", \"1\", true},\n\t\t{\"nil\", nil, true},\n\t\t{\"float32\", float32(1), true},\n\t\t{\"float64\", float64(1), true},\n\t\t{\"bool\", true, false},\n\t\t{\"chan int\", make(chan int), false},\n\t\t{\"complex64\", complex64(1), false},\n\t\t{\"complex128\", complex128(1), false},\n\t\t{\"func\", func() {}, false},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tif btcjson.IsValidIDType(test.id) != test.isValid {\n\t\t\tt.Errorf(\"Test #%d (%s) valid mismatch - got %v, \"+\n\t\t\t\t\"want %v\", i, test.name, !test.isValid,\n\t\t\t\ttest.isValid)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMarshalResponse ensures the MarshalResponse function works as expected.\nfunc TestMarshalResponse(t *testing.T) {\n\tt.Parallel()\n\n\ttestID := 1\n\ttests := []struct {\n\t\tname     string\n\t\tresult   interface{}\n\t\tjsonErr  *btcjson.RPCError\n\t\texpected []byte\n\t}{\n\t\t{\n\t\t\tname:     \"ordinary bool result with no error\",\n\t\t\tresult:   true,\n\t\t\tjsonErr:  nil,\n\t\t\texpected: []byte(`{\"jsonrpc\":\"1.0\",\"result\":true,\"error\":null,\"id\":1}`),\n\t\t},\n\t\t{\n\t\t\tname:   \"result with error\",\n\t\t\tresult: nil,\n\t\t\tjsonErr: func() *btcjson.RPCError {\n\t\t\t\treturn btcjson.NewRPCError(btcjson.ErrRPCBlockNotFound, \"123 not found\")\n\t\t\t}(),\n\t\t\texpected: []byte(`{\"jsonrpc\":\"1.0\",\"result\":null,\"error\":{\"code\":-5,\"message\":\"123 not found\"},\"id\":1}`),\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t_, _ = i, test\n\t\tmarshalled, err := btcjson.MarshalResponse(btcjson.RpcVersion1, testID, test.result, test.jsonErr)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(marshalled, test.expected) {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched result - got %s, \"+\n\t\t\t\t\"want %s\", i, test.name, marshalled,\n\t\t\t\ttest.expected)\n\t\t}\n\t}\n}\n\n// TestMiscErrors tests a few error conditions not covered elsewhere.\nfunc TestMiscErrors(t *testing.T) {\n\tt.Parallel()\n\n\t// Force an error in NewRequest by giving it a parameter type that is\n\t// not supported.\n\t_, err := btcjson.NewRequest(btcjson.RpcVersion1, nil, \"test\", []interface{}{make(chan int)})\n\tif err == nil {\n\t\tt.Error(\"NewRequest: did not receive error\")\n\t\treturn\n\t}\n\n\t// Force an error in MarshalResponse by giving it an id type that is not\n\t// supported.\n\twantErr := btcjson.Error{ErrorCode: btcjson.ErrInvalidType}\n\t_, err = btcjson.MarshalResponse(btcjson.RpcVersion1, make(chan int), nil, nil)\n\tif jerr, ok := err.(btcjson.Error); !ok || jerr.ErrorCode != wantErr.ErrorCode {\n\t\tt.Errorf(\"MarshalResult: did not receive expected error - got \"+\n\t\t\t\"%v (%[1]T), want %v (%[2]T)\", err, wantErr)\n\t\treturn\n\t}\n\n\t// Force an error in MarshalResponse by giving it a result type that\n\t// can't be marshalled.\n\t_, err = btcjson.MarshalResponse(btcjson.RpcVersion1, 1, make(chan int), nil)\n\tif _, ok := err.(*json.UnsupportedTypeError); !ok {\n\t\twantErr := &json.UnsupportedTypeError{}\n\t\tt.Errorf(\"MarshalResult: did not receive expected error - got \"+\n\t\t\t\"%v (%[1]T), want %T\", err, wantErr)\n\t\treturn\n\t}\n}\n\n// TestRPCError tests the error output for the RPCError type.\nfunc TestRPCError(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tin   *btcjson.RPCError\n\t\twant string\n\t}{\n\t\t{\n\t\t\tbtcjson.ErrRPCInvalidRequest,\n\t\t\t\"-32600: Invalid request\",\n\t\t},\n\t\t{\n\t\t\tbtcjson.ErrRPCMethodNotFound,\n\t\t\t\"-32601: Method not found\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.Error()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"Error #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/jsonrpcerr.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\n// Standard JSON-RPC 2.0 errors.\nvar (\n\tErrRPCInvalidRequest = &RPCError{\n\t\tCode:    -32600,\n\t\tMessage: \"Invalid request\",\n\t}\n\tErrRPCMethodNotFound = &RPCError{\n\t\tCode:    -32601,\n\t\tMessage: \"Method not found\",\n\t}\n\tErrRPCInvalidParams = &RPCError{\n\t\tCode:    -32602,\n\t\tMessage: \"Invalid parameters\",\n\t}\n\tErrRPCInternal = &RPCError{\n\t\tCode:    -32603,\n\t\tMessage: \"Internal error\",\n\t}\n\tErrRPCParse = &RPCError{\n\t\tCode:    -32700,\n\t\tMessage: \"Parse error\",\n\t}\n)\n\n// General application defined JSON errors.\nconst (\n\t// ErrRPCMisc indicates an exception thrown during command handling.\n\tErrRPCMisc RPCErrorCode = -1\n\n\t// ErrRPCForbiddenBySafeMode indicates that server is in safe mode, and\n\t// command is not allowed in safe mode.\n\tErrRPCForbiddenBySafeMode RPCErrorCode = -2\n\n\t// ErrRPCType indicates that an unexpected type was passed as parameter.\n\tErrRPCType RPCErrorCode = -3\n\n\t// ErrRPCInvalidAddressOrKey indicates an invalid address or key.\n\tErrRPCInvalidAddressOrKey RPCErrorCode = -5\n\n\t// ErrRPCOutOfMemory indicates that the server ran out of memory during\n\t// operation.\n\tErrRPCOutOfMemory RPCErrorCode = -7\n\n\t// ErrRPCInvalidParameter indicates an invalid, missing, or duplicate\n\t// parameter.\n\tErrRPCInvalidParameter RPCErrorCode = -8\n\n\t// ErrRPCDatabase indicates a database error.\n\tErrRPCDatabase RPCErrorCode = -20\n\n\t// ErrRPCDeserialization indicates an error parsing or validating structure\n\t// in raw format.\n\tErrRPCDeserialization RPCErrorCode = -22\n\n\t// ErrRPCVerify indicates a general error during transaction or block\n\t// submission.\n\tErrRPCVerify RPCErrorCode = -25\n\n\t// ErrRPCVerifyRejected indicates that transaction or block was rejected by\n\t// network rules.\n\tErrRPCVerifyRejected RPCErrorCode = -26\n\n\t// ErrRPCVerifyAlreadyInChain indicates that submitted transaction is\n\t// already in chain.\n\tErrRPCVerifyAlreadyInChain RPCErrorCode = -27\n\n\t// ErrRPCInWarmup indicates that client is still warming up.\n\tErrRPCInWarmup RPCErrorCode = -28\n\n\t// ErrRPCInWarmup indicates that the RPC error is deprecated.\n\tErrRPCMethodDeprecated RPCErrorCode = -32\n)\n\n// Peer-to-peer client errors.\nconst (\n\t// ErrRPCClientNotConnected indicates that Bitcoin is not connected.\n\tErrRPCClientNotConnected RPCErrorCode = -9\n\n\t// ErrRPCClientInInitialDownload indicates that client is still downloading\n\t// initial blocks.\n\tErrRPCClientInInitialDownload RPCErrorCode = -10\n\n\t// ErrRPCClientNodeAlreadyAdded indicates that node is already added.\n\tErrRPCClientNodeAlreadyAdded RPCErrorCode = -23\n\n\t// ErrRPCClientNodeNotAdded indicates that node has not been added before.\n\tErrRPCClientNodeNotAdded RPCErrorCode = -24\n\n\t// ErrRPCClientNodeNotConnected indicates that node to disconnect was not\n\t// found in connected nodes.\n\tErrRPCClientNodeNotConnected RPCErrorCode = -29\n\n\t// ErrRPCClientInvalidIPOrSubnet indicates an invalid IP/Subnet.\n\tErrRPCClientInvalidIPOrSubnet RPCErrorCode = -30\n\n\t// ErrRPCClientP2PDisabled indicates that no valid connection manager\n\t// instance was found.\n\tErrRPCClientP2PDisabled RPCErrorCode = -31\n)\n\n// Chain errors\nconst (\n\t// ErrRPCClientMempoolDisabled indicates that no mempool instance was\n\t// found.\n\tErrRPCClientMempoolDisabled RPCErrorCode = -33\n)\n\n// Wallet JSON errors\nconst (\n\t// ErrRPCWallet indicates an unspecified problem with wallet, for\n\t// example, key not found, etc.\n\tErrRPCWallet RPCErrorCode = -4\n\n\t// ErrRPCWalletInvalidAddressType indicates an invalid address type.\n\tErrRPCWalletInvalidAddressType RPCErrorCode = -5\n\n\t// ErrRPCWalletInsufficientFunds indicates that there are not enough\n\t// funds in wallet or account.\n\tErrRPCWalletInsufficientFunds RPCErrorCode = -6\n\n\t// ErrRPCWalletInvalidAccountName indicates an invalid label name.\n\tErrRPCWalletInvalidAccountName RPCErrorCode = -11\n\n\t// ErrRPCWalletKeypoolRanOut indicates that the keypool ran out, and that\n\t// keypoolrefill must be called first.\n\tErrRPCWalletKeypoolRanOut RPCErrorCode = -12\n\n\t// ErrRPCWalletUnlockNeeded indicates that the wallet passphrase must be\n\t// entered first with the walletpassphrase RPC.\n\tErrRPCWalletUnlockNeeded RPCErrorCode = -13\n\n\t// ErrRPCWalletPassphraseIncorrect indicates that the wallet passphrase\n\t// that was entered was incorrect.\n\tErrRPCWalletPassphraseIncorrect RPCErrorCode = -14\n\n\t// ErrRPCWalletWrongEncState indicates that a command was given in wrong\n\t// wallet encryption state, for example, encrypting an encrypted wallet.\n\tErrRPCWalletWrongEncState RPCErrorCode = -15\n\n\t// ErrRPCWalletEncryptionFailed indicates a failure to encrypt the wallet.\n\tErrRPCWalletEncryptionFailed RPCErrorCode = -16\n\n\t// ErrRPCWalletAlreadyUnlocked indicates an attempt to unlock a wallet\n\t// that was already unlocked.\n\tErrRPCWalletAlreadyUnlocked RPCErrorCode = -17\n\n\t// ErrRPCWalletNotFound indicates that an invalid wallet was specified,\n\t// which does not exist. It can also indicate an attempt to unload a\n\t// wallet that was not previously loaded.\n\t//\n\t// Not to be confused with ErrRPCNoWallet, which is specific to btcd.\n\tErrRPCWalletNotFound RPCErrorCode = -18\n\n\t// ErrRPCWalletNotSpecified indicates that no wallet was specified, for\n\t// example, when there are multiple wallets loaded.\n\tErrRPCWalletNotSpecified RPCErrorCode = -19\n)\n\n// Specific Errors related to commands.  These are the ones a user of the RPC\n// server are most likely to see.  Generally, the codes should match one of the\n// more general errors above.\nconst (\n\tErrRPCBlockNotFound     RPCErrorCode = -5\n\tErrRPCBlockCount        RPCErrorCode = -5\n\tErrRPCBestBlockHash     RPCErrorCode = -5\n\tErrRPCDifficulty        RPCErrorCode = -5\n\tErrRPCOutOfRange        RPCErrorCode = -1\n\tErrRPCNoTxInfo          RPCErrorCode = -5\n\tErrRPCNoCFIndex         RPCErrorCode = -5\n\tErrRPCNoNewestBlockInfo RPCErrorCode = -5\n\tErrRPCInvalidTxVout     RPCErrorCode = -5\n\tErrRPCRawTxString       RPCErrorCode = -32602\n\tErrRPCDecodeHexString   RPCErrorCode = -22\n\tErrRPCTxError           RPCErrorCode = -25\n\tErrRPCTxRejected        RPCErrorCode = -26\n\tErrRPCTxAlreadyInChain  RPCErrorCode = -27\n)\n\n// Errors that are specific to btcd.\nconst (\n\tErrRPCNoWallet      RPCErrorCode = -1\n\tErrRPCUnimplemented RPCErrorCode = -1\n)\n"
  },
  {
    "path": "btcjson/register.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n)\n\n// UsageFlag define flags that specify additional properties about the\n// circumstances under which a command can be used.\ntype UsageFlag uint32\n\nconst (\n\t// UFWalletOnly indicates that the command can only be used with an RPC\n\t// server that supports wallet commands.\n\tUFWalletOnly UsageFlag = 1 << iota\n\n\t// UFWebsocketOnly indicates that the command can only be used when\n\t// communicating with an RPC server over websockets.  This typically\n\t// applies to notifications and notification registration functions\n\t// since neiher makes since when using a single-shot HTTP-POST request.\n\tUFWebsocketOnly\n\n\t// UFNotification indicates that the command is actually a notification.\n\t// This means when it is marshalled, the ID must be nil.\n\tUFNotification\n\n\t// highestUsageFlagBit is the maximum usage flag bit and is used in the\n\t// stringer and tests to ensure all of the above constants have been\n\t// tested.\n\thighestUsageFlagBit\n)\n\n// Map of UsageFlag values back to their constant names for pretty printing.\nvar usageFlagStrings = map[UsageFlag]string{\n\tUFWalletOnly:    \"UFWalletOnly\",\n\tUFWebsocketOnly: \"UFWebsocketOnly\",\n\tUFNotification:  \"UFNotification\",\n}\n\n// String returns the UsageFlag in human-readable form.\nfunc (fl UsageFlag) String() string {\n\t// No flags are set.\n\tif fl == 0 {\n\t\treturn \"0x0\"\n\t}\n\n\t// Add individual bit flags.\n\ts := \"\"\n\tfor flag := UFWalletOnly; flag < highestUsageFlagBit; flag <<= 1 {\n\t\tif fl&flag == flag {\n\t\t\ts += usageFlagStrings[flag] + \"|\"\n\t\t\tfl -= flag\n\t\t}\n\t}\n\n\t// Add remaining value as raw hex.\n\ts = strings.TrimRight(s, \"|\")\n\tif fl != 0 {\n\t\ts += \"|0x\" + strconv.FormatUint(uint64(fl), 16)\n\t}\n\ts = strings.TrimLeft(s, \"|\")\n\treturn s\n}\n\n// methodInfo keeps track of information about each registered method such as\n// the parameter information.\ntype methodInfo struct {\n\tmaxParams    int\n\tnumReqParams int\n\tnumOptParams int\n\tdefaults     map[int]reflect.Value\n\tflags        UsageFlag\n\tusage        string\n}\n\nvar (\n\t// These fields are used to map the registered types to method names.\n\tregisterLock         sync.RWMutex\n\tmethodToConcreteType = make(map[string]reflect.Type)\n\tmethodToInfo         = make(map[string]methodInfo)\n\tconcreteTypeToMethod = make(map[reflect.Type]string)\n)\n\n// baseKindString returns the base kind for a given reflect.Type after\n// indirecting through all pointers.\nfunc baseKindString(rt reflect.Type) string {\n\tnumIndirects := 0\n\tfor rt.Kind() == reflect.Ptr {\n\t\tnumIndirects++\n\t\trt = rt.Elem()\n\t}\n\n\treturn fmt.Sprintf(\"%s%s\", strings.Repeat(\"*\", numIndirects), rt.Kind())\n}\n\n// isAcceptableKind returns whether or not the passed field type is a supported\n// type.  It is called after the first pointer indirection, so further pointers\n// are not supported.\nfunc isAcceptableKind(kind reflect.Kind) bool {\n\tswitch kind {\n\tcase reflect.Chan:\n\t\tfallthrough\n\tcase reflect.Complex64:\n\t\tfallthrough\n\tcase reflect.Complex128:\n\t\tfallthrough\n\tcase reflect.Func:\n\t\tfallthrough\n\tcase reflect.Ptr:\n\t\tfallthrough\n\tcase reflect.Interface:\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// RegisterCmd registers a new command that will automatically marshal to and\n// from JSON-RPC with full type checking and positional parameter support.  It\n// also accepts usage flags which identify the circumstances under which the\n// command can be used.\n//\n// This package automatically registers all of the exported commands by default\n// using this function, however it is also exported so callers can easily\n// register custom types.\n//\n// The type format is very strict since it needs to be able to automatically\n// marshal to and from JSON-RPC 1.0.  The following enumerates the requirements:\n//\n//   - The provided command must be a single pointer to a struct\n//   - All fields must be exported\n//   - The order of the positional parameters in the marshalled JSON will be in\n//     the same order as declared in the struct definition\n//   - Struct embedding is not supported\n//   - Struct fields may NOT be channels, functions, complex, or interface\n//   - A field in the provided struct with a pointer is treated as optional\n//   - Multiple indirections (i.e **int) are not supported\n//   - Once the first optional field (pointer) is encountered, the remaining\n//     fields must also be optional fields (pointers) as required by positional\n//     params\n//   - A field that has a 'jsonrpcdefault' struct tag must be an optional field\n//     (pointer)\n//\n// NOTE: This function only needs to be able to examine the structure of the\n// passed struct, so it does not need to be an actual instance.  Therefore, it\n// is recommended to simply pass a nil pointer cast to the appropriate type.\n// For example, (*FooCmd)(nil).\nfunc RegisterCmd(method string, cmd interface{}, flags UsageFlag) error {\n\tregisterLock.Lock()\n\tdefer registerLock.Unlock()\n\n\tif _, ok := methodToConcreteType[method]; ok {\n\t\tstr := fmt.Sprintf(\"method %q is already registered\", method)\n\t\treturn makeError(ErrDuplicateMethod, str)\n\t}\n\n\t// Ensure that no unrecognized flag bits were specified.\n\tif ^(highestUsageFlagBit-1)&flags != 0 {\n\t\tstr := fmt.Sprintf(\"invalid usage flags specified for method \"+\n\t\t\t\"%s: %v\", method, flags)\n\t\treturn makeError(ErrInvalidUsageFlags, str)\n\t}\n\n\trtp := reflect.TypeOf(cmd)\n\tif rtp.Kind() != reflect.Ptr {\n\t\tstr := fmt.Sprintf(\"type must be *struct not '%s (%s)'\", rtp,\n\t\t\trtp.Kind())\n\t\treturn makeError(ErrInvalidType, str)\n\t}\n\trt := rtp.Elem()\n\tif rt.Kind() != reflect.Struct {\n\t\tstr := fmt.Sprintf(\"type must be *struct not '%s (*%s)'\",\n\t\t\trtp, rt.Kind())\n\t\treturn makeError(ErrInvalidType, str)\n\t}\n\n\t// Enumerate the struct fields to validate them and gather parameter\n\t// information.\n\tnumFields := rt.NumField()\n\tnumOptFields := 0\n\tdefaults := make(map[int]reflect.Value)\n\tfor i := 0; i < numFields; i++ {\n\t\trtf := rt.Field(i)\n\t\tif rtf.Anonymous {\n\t\t\tstr := fmt.Sprintf(\"embedded fields are not supported \"+\n\t\t\t\t\"(field name: %q)\", rtf.Name)\n\t\t\treturn makeError(ErrEmbeddedType, str)\n\t\t}\n\t\tif rtf.PkgPath != \"\" {\n\t\t\tstr := fmt.Sprintf(\"unexported fields are not supported \"+\n\t\t\t\t\"(field name: %q)\", rtf.Name)\n\t\t\treturn makeError(ErrUnexportedField, str)\n\t\t}\n\n\t\t// Disallow types that can't be JSON encoded.  Also, determine\n\t\t// if the field is optional based on it being a pointer.\n\t\tvar isOptional bool\n\t\tswitch kind := rtf.Type.Kind(); kind {\n\t\tcase reflect.Ptr:\n\t\t\tisOptional = true\n\t\t\tkind = rtf.Type.Elem().Kind()\n\t\t\tfallthrough\n\t\tdefault:\n\t\t\tif !isAcceptableKind(kind) {\n\t\t\t\tstr := fmt.Sprintf(\"unsupported field type \"+\n\t\t\t\t\t\"'%s (%s)' (field name %q)\", rtf.Type,\n\t\t\t\t\tbaseKindString(rtf.Type), rtf.Name)\n\t\t\t\treturn makeError(ErrUnsupportedFieldType, str)\n\t\t\t}\n\t\t}\n\n\t\t// Count the optional fields and ensure all fields after the\n\t\t// first optional field are also optional.\n\t\tif isOptional {\n\t\t\tnumOptFields++\n\t\t} else {\n\t\t\tif numOptFields > 0 {\n\t\t\t\tstr := fmt.Sprintf(\"all fields after the first \"+\n\t\t\t\t\t\"optional field must also be optional \"+\n\t\t\t\t\t\"(field name %q)\", rtf.Name)\n\t\t\t\treturn makeError(ErrNonOptionalField, str)\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the default value can be unsmarshalled into the type\n\t\t// and that defaults are only specified for optional fields.\n\t\tif tag := rtf.Tag.Get(\"jsonrpcdefault\"); tag != \"\" {\n\t\t\tif !isOptional {\n\t\t\t\tstr := fmt.Sprintf(\"required fields must not \"+\n\t\t\t\t\t\"have a default specified (field name \"+\n\t\t\t\t\t\"%q)\", rtf.Name)\n\t\t\t\treturn makeError(ErrNonOptionalDefault, str)\n\t\t\t}\n\n\t\t\trvf := reflect.New(rtf.Type.Elem())\n\t\t\terr := json.Unmarshal([]byte(tag), rvf.Interface())\n\t\t\tif err != nil {\n\t\t\t\tstr := fmt.Sprintf(\"default value of %q is \"+\n\t\t\t\t\t\"the wrong type (field name %q)\", tag,\n\t\t\t\t\trtf.Name)\n\t\t\t\treturn makeError(ErrMismatchedDefault, str)\n\t\t\t}\n\t\t\tdefaults[i] = rvf\n\t\t}\n\t}\n\n\t// Update the registration maps.\n\tmethodToConcreteType[method] = rtp\n\tmethodToInfo[method] = methodInfo{\n\t\tmaxParams:    numFields,\n\t\tnumReqParams: numFields - numOptFields,\n\t\tnumOptParams: numOptFields,\n\t\tdefaults:     defaults,\n\t\tflags:        flags,\n\t}\n\tconcreteTypeToMethod[rtp] = method\n\treturn nil\n}\n\n// MustRegisterCmd performs the same function as RegisterCmd except it panics\n// if there is an error.  This should only be called from package init\n// functions.\nfunc MustRegisterCmd(method string, cmd interface{}, flags UsageFlag) {\n\tif err := RegisterCmd(method, cmd, flags); err != nil {\n\t\tpanic(fmt.Sprintf(\"failed to register type %q: %v\\n\", method,\n\t\t\terr))\n\t}\n}\n\n// RegisteredCmdMethods returns a sorted list of methods for all registered\n// commands.\nfunc RegisteredCmdMethods() []string {\n\tregisterLock.Lock()\n\tdefer registerLock.Unlock()\n\n\tmethods := make([]string, 0, len(methodToInfo))\n\tfor k := range methodToInfo {\n\t\tmethods = append(methods, k)\n\t}\n\n\tsort.Strings(methods)\n\treturn methods\n}\n"
  },
  {
    "path": "btcjson/register_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"reflect\"\n\t\"sort\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestUsageFlagStringer tests the stringized output for the UsageFlag type.\nfunc TestUsageFlagStringer(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tin   btcjson.UsageFlag\n\t\twant string\n\t}{\n\t\t{0, \"0x0\"},\n\t\t{btcjson.UFWalletOnly, \"UFWalletOnly\"},\n\t\t{btcjson.UFWebsocketOnly, \"UFWebsocketOnly\"},\n\t\t{btcjson.UFNotification, \"UFNotification\"},\n\t\t{btcjson.UFWalletOnly | btcjson.UFWebsocketOnly,\n\t\t\t\"UFWalletOnly|UFWebsocketOnly\"},\n\t\t{btcjson.UFWalletOnly | btcjson.UFWebsocketOnly | (1 << 31),\n\t\t\t\"UFWalletOnly|UFWebsocketOnly|0x80000000\"},\n\t}\n\n\t// Detect additional usage flags that don't have the stringer added.\n\tnumUsageFlags := 0\n\thighestUsageFlagBit := btcjson.TstHighestUsageFlagBit\n\tfor highestUsageFlagBit > 1 {\n\t\tnumUsageFlags++\n\t\thighestUsageFlagBit >>= 1\n\t}\n\tif len(tests)-3 != numUsageFlags {\n\t\tt.Errorf(\"It appears a usage flag was added without adding \" +\n\t\t\t\"an associated stringer test\")\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.String()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"String #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestRegisterCmdErrors ensures the RegisterCmd function returns the expected\n// error when provided with invalid types.\nfunc TestRegisterCmdErrors(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname    string\n\t\tmethod  string\n\t\tcmdFunc func() interface{}\n\t\tflags   btcjson.UsageFlag\n\t\terr     btcjson.Error\n\t}{\n\t\t{\n\t\t\tname:   \"duplicate method\",\n\t\t\tmethod: \"getblock\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\treturn struct{}{}\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrDuplicateMethod},\n\t\t},\n\t\t{\n\t\t\tname:   \"invalid usage flags\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\treturn 0\n\t\t\t},\n\t\t\tflags: btcjson.TstHighestUsageFlagBit,\n\t\t\terr:   btcjson.Error{ErrorCode: btcjson.ErrInvalidUsageFlags},\n\t\t},\n\t\t{\n\t\t\tname:   \"invalid type\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\treturn 0\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname:   \"invalid type 2\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\treturn &[]string{}\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrInvalidType},\n\t\t},\n\t\t{\n\t\t\tname:   \"embedded field\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\ttype test struct{ int }\n\t\t\t\treturn (*test)(nil)\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrEmbeddedType},\n\t\t},\n\t\t{\n\t\t\tname:   \"unexported field\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\ttype test struct{ a int }\n\t\t\t\treturn (*test)(nil)\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrUnexportedField},\n\t\t},\n\t\t{\n\t\t\tname:   \"unsupported field type 1\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\ttype test struct{ A **int }\n\t\t\t\treturn (*test)(nil)\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrUnsupportedFieldType},\n\t\t},\n\t\t{\n\t\t\tname:   \"unsupported field type 2\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\ttype test struct{ A chan int }\n\t\t\t\treturn (*test)(nil)\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrUnsupportedFieldType},\n\t\t},\n\t\t{\n\t\t\tname:   \"unsupported field type 3\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\ttype test struct{ A complex64 }\n\t\t\t\treturn (*test)(nil)\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrUnsupportedFieldType},\n\t\t},\n\t\t{\n\t\t\tname:   \"unsupported field type 4\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\ttype test struct{ A complex128 }\n\t\t\t\treturn (*test)(nil)\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrUnsupportedFieldType},\n\t\t},\n\t\t{\n\t\t\tname:   \"unsupported field type 5\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\ttype test struct{ A func() }\n\t\t\t\treturn (*test)(nil)\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrUnsupportedFieldType},\n\t\t},\n\t\t{\n\t\t\tname:   \"unsupported field type 6\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\ttype test struct{ A interface{} }\n\t\t\t\treturn (*test)(nil)\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrUnsupportedFieldType},\n\t\t},\n\t\t{\n\t\t\tname:   \"required after optional\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\ttype test struct {\n\t\t\t\t\tA *int\n\t\t\t\t\tB int\n\t\t\t\t}\n\t\t\t\treturn (*test)(nil)\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrNonOptionalField},\n\t\t},\n\t\t{\n\t\t\tname:   \"non-optional with default\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\ttype test struct {\n\t\t\t\t\tA int `jsonrpcdefault:\"1\"`\n\t\t\t\t}\n\t\t\t\treturn (*test)(nil)\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrNonOptionalDefault},\n\t\t},\n\t\t{\n\t\t\tname:   \"mismatched default\",\n\t\t\tmethod: \"registertestcmd\",\n\t\t\tcmdFunc: func() interface{} {\n\t\t\t\ttype test struct {\n\t\t\t\t\tA *int `jsonrpcdefault:\"1.7\"`\n\t\t\t\t}\n\t\t\t\treturn (*test)(nil)\n\t\t\t},\n\t\t\terr: btcjson.Error{ErrorCode: btcjson.ErrMismatchedDefault},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\terr := btcjson.RegisterCmd(test.method, test.cmdFunc(),\n\t\t\ttest.flags)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Test #%d (%s) wrong error - got %T, \"+\n\t\t\t\t\"want %T\", i, test.name, err, test.err)\n\t\t\tcontinue\n\t\t}\n\t\tgotErrorCode := err.(btcjson.Error).ErrorCode\n\t\tif gotErrorCode != test.err.ErrorCode {\n\t\t\tt.Errorf(\"Test #%d (%s) mismatched error code - got \"+\n\t\t\t\t\"%v, want %v\", i, test.name, gotErrorCode,\n\t\t\t\ttest.err.ErrorCode)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMustRegisterCmdPanic ensures the MustRegisterCmd function panics when\n// used to register an invalid type.\nfunc TestMustRegisterCmdPanic(t *testing.T) {\n\tt.Parallel()\n\n\t// Setup a defer to catch the expected panic to ensure it actually\n\t// panicked.\n\tdefer func() {\n\t\tif err := recover(); err == nil {\n\t\t\tt.Error(\"MustRegisterCmd did not panic as expected\")\n\t\t}\n\t}()\n\n\t// Intentionally try to register an invalid type to force a panic.\n\tbtcjson.MustRegisterCmd(\"panicme\", 0, 0)\n}\n\n// TestRegisteredCmdMethods tests the RegisteredCmdMethods function ensure it\n// works as expected.\nfunc TestRegisteredCmdMethods(t *testing.T) {\n\tt.Parallel()\n\n\t// Ensure the registered methods are returned.\n\tmethods := btcjson.RegisteredCmdMethods()\n\tif len(methods) == 0 {\n\t\tt.Fatal(\"RegisteredCmdMethods: no methods\")\n\t}\n\n\t// Ensure the returned methods are sorted.\n\tsortedMethods := make([]string, len(methods))\n\tcopy(sortedMethods, methods)\n\tsort.Strings(sortedMethods)\n\tif !reflect.DeepEqual(sortedMethods, methods) {\n\t\tt.Fatal(\"RegisteredCmdMethods: methods are not sorted\")\n\t}\n}\n"
  },
  {
    "path": "btcjson/submitpackage.go",
    "content": "package btcjson\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// JsonSubmitPackageCmd models the request payload for Bitcoin Core’s\n// experimental `submitpackage` RPC (v26+). It submits a related group of\n// transactions (a package) to the node's mempool for validation and acceptance.\n//\n// Package Requirements:\n//   - Topology: Must be a \"child-with-unconfirmed-parents\" package: exactly one\n//     child transaction (last in the list) and all of its unconfirmed parent\n//     transactions. Parents cannot depend on each other within the package.\n//   - Order: Transactions MUST be topologically sorted (parents before child).\n//   - Content: No duplicate transactions. No conflicting transactions (spending\n//     the same input) within the package.\n//   - Limits: Subject to node limits on package size (e.g., max 25 txs) and\n//     total weight (e.g., max 404000 weight units).\n//\n// Validation & Acceptance:\n//   - Individual First: Each transaction is first validated individually\n//     against mempool policy (including minimum relay fee `minrelaytxfee`).\n//   - Package Logic: Transactions failing individual checks (often due to low\n//     fee rate) are then evaluated using package logic.\n//   - Package Feerate: The total fee of non-mempool transactions divided by\n//     their total virtual size. This can overcome the dynamic mempool minimum\n//     fee rate (acting like CPFP), but cannot overcome the static\n//     `minrelaytxfee`. Any transaction below `minrelaytxfee` will cause\n//     rejection.\n//   - Deduplication: Transactions already in the mempool (by txid) are ignored\n//     during submission, preventing rejection and double-counting fees. See\n//     the `other-wtxid` field in the result if a different witness version\n//     exists.\n//   - Package RBF: Limited Replace-By-Fee logic applies. See the\n//     `replaced-transactions` field in the result.\n//\n// This RPC is experimental. Refer to Bitcoin Core's `doc/policy/packages.md`\n// for details. Successful submission does not guarantee network propagation.\n//\n// Reference: https://bitcoincore.org/en/doc/29.0.0/rpc/rawtransactions/submitpackage/\ntype JsonSubmitPackageCmd struct {\n\t// RawTxs holds the hex-encoded raw transactions forming the package.\n\t// MUST be topologically sorted (parents first, child last) and\n\t// represent a valid \"child-with-unconfirmed-parents\" structure.\n\tRawTxs []string `jsonrpc:\"package\"`\n\n\t// MaxFeeRate (Optional, BTC/kvB): If set, rejects package transactions\n\t// exceeding this fee rate. Rates > 1 BTC/kvB are always rejected. If\n\t// nil, Core's RPC default (e.g., 0.10 BTC/kvB) applies. Set to 0 for no\n\t// limit (up to 1 BTC/kvB).\n\tMaxFeeRate *float64 `jsonrpc:\"maxfeerate,omitempty\"`\n\n\t// MaxBurnAmount (Optional, BTC): If set, rejects packages where the\n\t// total value of provably unspendable outputs (e.g., OP_RETURN) exceeds\n\t// this amount. If nil, Core's RPC default (0.00 BTC) applies.\n\tMaxBurnAmount *float64 `jsonrpc:\"maxburnamount,omitempty\"`\n}\n\n// JsonSubmitPackageFees models the \"fees\" sub-object in a `submitpackage`\n// response. Values are in BTC. May be omitted if fee info is not applicable.\ntype JsonSubmitPackageFees struct {\n\t// Base is the absolute fee of this specific transaction (in BTC).\n\tBase float64 `json:\"base\"`\n\n\t// EffectiveFeeRate (Optional, BTC/kvB): The transaction's effective\n\t// feerate, potentially considering package context or\n\t// `prioritisetransaction`.\n\tEffectiveFeeRate *float64 `json:\"effective-feerate,omitempty\"`\n\n\t// EffectiveIncludes (Optional): wtxids contributing to\n\t// `effective-feerate`.\n\tEffectiveIncludes []string `json:\"effective-includes,omitempty\"`\n}\n\n// JsonSubmitPackageTxResult represents the processing result for a single\n// transaction within the package, keyed by its wtxid in the response map.\ntype JsonSubmitPackageTxResult struct {\n\t// TxID is the transaction hash (txid) in hex.\n\tTxID string `json:\"txid\"`\n\n\t// OtherWtxid (Optional): Set if a conflicting tx with the same txid but\n\t// different witness was already in the mempool (submitted tx was\n\t// ignored). Relates to deduplication.\n\tOtherWtxid *string `json:\"other-wtxid,omitempty\"`\n\n\t// VSize is the virtual size in vbytes. Note: Optional in RPC; defaults\n\t// to 0 if missing.\n\tVSize int64 `json:\"vsize\"`\n\n\t// Fees contains fee information. Note: Optional in RPC; defaults to\n\t// empty struct if missing.\n\tFees JsonSubmitPackageFees `json:\"fees\"`\n\n\t// Error (Optional): String describing rejection reason, if any. Can\n\t// result from individual checks (e.g., below `minrelaytxfee`) or\n\t// package validation failures.\n\tError *string `json:\"error,omitempty\"`\n}\n\n// JsonSubmitPackageResult mirrors the JSON object returned by `submitpackage`.\ntype JsonSubmitPackageResult struct {\n\t// PackageMsg is a summary message (\"success\" or other status).\n\tPackageMsg string `json:\"package_msg\"`\n\n\t// TxResults maps each submitted transaction's wtxid to its result.\n\tTxResults map[string]JsonSubmitPackageTxResult `json:\"tx-results\"`\n\n\t// ReplacedTransactions (Optional): txids of transactions evicted via\n\t// Package RBF.\n\tReplacedTransactions []string `json:\"replaced-transactions,omitempty\"`\n}\n\n// NewJsonSubmitPackageCmd constructs a JsonSubmitPackageCmd.\n//\n// Parameters:\n//   - rawTxs: Slice of hex-encoded txs (topologically sorted\n//     child-with-parents).\n//   - maxFeeRateBtcKvB: Optional max fee rate (BTC/kvB). Nil uses RPC default.\n//   - maxBurnAmountBtc: Optional max burn amount (BTC). Nil uses RPC default.\nfunc NewJsonSubmitPackageCmd(rawTxs []string,\n\tmaxFeeRateBtcKvB, maxBurnAmountBtc *float64) *JsonSubmitPackageCmd {\n\n\treturn &JsonSubmitPackageCmd{\n\t\tRawTxs:        rawTxs,\n\t\tMaxFeeRate:    maxFeeRateBtcKvB,\n\t\tMaxBurnAmount: maxBurnAmountBtc,\n\t}\n}\n\n// SubmitPackageResult mirrors JsonSubmitPackageResult with higher-level types.\ntype SubmitPackageResult struct {\n\t// PackageMsg is a summary message (\"success\" or other status).\n\tPackageMsg string\n\n\t// TxResults maps each submitted transaction's wtxid to its result.\n\tTxResults map[string]SubmitPackageTxResult\n\n\t// ReplacedTransactions (Optional): txids of transactions evicted via\n\t// Package RBF.\n\tReplacedTransactions []chainhash.Hash\n}\n\n// SubmitPackageTxResult mirrors (a subset of) JsonSubmitPackageTxResult with\n// higher-level types.\ntype SubmitPackageTxResult struct {\n\t// TxID is the transaction hash (txid) in hex.\n\tTxID chainhash.Hash\n\n\t// OtherWtxid (Optional): Set if a conflicting tx with the same txid but\n\t// different witness was already in the mempool (submitted tx was\n\t// ignored). Relates to deduplication.\n\tOtherWtxid *chainhash.Hash\n\n\t// Error (Optional): String describing rejection reason, if any. Can\n\t// result from individual checks (e.g., below `minrelaytxfee`) or\n\t// package validation failures.\n\tError *string\n}\n\n// UnmarshalJSON unmarshals the JsonSubmitPackageResult from the JSON response\n// to the higher-level SubmitPackageResult type. If the function succeeds, the\n// receiver is overwritten with the unmarshalled result.\nfunc (s *SubmitPackageResult) UnmarshalJSON(data []byte) error {\n\tvar src JsonSubmitPackageResult\n\tif err := json.Unmarshal(data, &src); err != nil {\n\t\treturn err\n\t}\n\n\tdst := SubmitPackageResult{\n\t\tPackageMsg: src.PackageMsg,\n\t\tTxResults:  make(map[string]SubmitPackageTxResult),\n\t}\n\n\t// Translate TxResults.\n\tif len(src.TxResults) > 0 {\n\n\t\tfor wtxid, srcTxRes := range src.TxResults {\n\t\t\tvar dstTxRes SubmitPackageTxResult\n\n\t\t\t// Translate TxID.\n\t\t\ttxID, err := chainhash.NewHashFromStr(srcTxRes.TxID)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to parse txid '%s' \"+\n\t\t\t\t\t\"for wtxid '%s': %w\", srcTxRes.TxID,\n\t\t\t\t\twtxid, err)\n\t\t\t}\n\n\t\t\tdstTxRes.TxID = *txID\n\n\t\t\t// Translate Error (direct copy).\n\t\t\tdstTxRes.Error = srcTxRes.Error\n\n\t\t\t// Translate OtherWtxid.\n\t\t\tif srcTxRes.OtherWtxid != nil &&\n\t\t\t\t*srcTxRes.OtherWtxid != \"\" {\n\n\t\t\t\totherWtxidHash, err := chainhash.NewHashFromStr(\n\t\t\t\t\t*srcTxRes.OtherWtxid,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"failed to parse \"+\n\t\t\t\t\t\t\"other_wtxid '%s' for wtxid \"+\n\t\t\t\t\t\t\"'%s': %w\",\n\t\t\t\t\t\t*srcTxRes.OtherWtxid, wtxid,\n\t\t\t\t\t\terr)\n\t\t\t\t}\n\n\t\t\t\tdstTxRes.OtherWtxid = otherWtxidHash\n\t\t\t}\n\n\t\t\tdst.TxResults[wtxid] = dstTxRes\n\t\t}\n\t}\n\n\t// Translate ReplacedTransactions.\n\tif len(src.ReplacedTransactions) > 0 {\n\t\tdst.ReplacedTransactions = make(\n\t\t\t[]chainhash.Hash, 0, len(src.ReplacedTransactions),\n\t\t)\n\n\t\tfor _, txidStr := range src.ReplacedTransactions {\n\t\t\thash, err := chainhash.NewHashFromStr(txidStr)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to parse \"+\n\t\t\t\t\t\"replaced_transaction txid '%s': %w\",\n\t\t\t\t\ttxidStr, err)\n\t\t\t}\n\n\t\t\tdst.ReplacedTransactions = append(\n\t\t\t\tdst.ReplacedTransactions, *hash,\n\t\t\t)\n\t\t}\n\t}\n\n\t// Overwrite the receiver with the translated result.\n\t*s = dst\n\n\treturn nil\n}\n"
  },
  {
    "path": "btcjson/submitpackage_test.go",
    "content": "// Copyright (c) 2025 The btcsuite developers.\n// Use of this source code is governed by an ISC license that can be found in\n// the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestSubmitPackageCmd tests all of the submit package commands marshal and\n// unmarshal into valid results include handling of optional fields being\n// omitted in the marshalled command, while optional fields with defaults have\n// the default assigned on unmarshalled commands.\nfunc TestSubmitPackageCmd(t *testing.T) {\n\tt.Parallel()\n\n\tconst testID = 1\n\ttests := []struct {\n\t\tname         string\n\t\tnewCmd       func() (interface{}, error)\n\t\tstaticCmd    func() interface{}\n\t\tmarshalled   string\n\t\tunmarshalled interface{}\n\t}{\n\t\t{\n\t\t\tname: \"submitpackage minimal\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"submitpackage\",\n\t\t\t\t\t[]string{\"hex1\", \"hex2\"},\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewJsonSubmitPackageCmd(\n\t\t\t\t\t[]string{\"hex1\", \"hex2\"}, nil, nil,\n\t\t\t\t)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"submitpackage\",\"params\":[[\"hex1\",\"hex2\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.JsonSubmitPackageCmd{\n\t\t\t\tRawTxs:        []string{\"hex1\", \"hex2\"},\n\t\t\t\tMaxFeeRate:    nil,\n\t\t\t\tMaxBurnAmount: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"submitpackage with maxfeerate\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"submitpackage\",\n\t\t\t\t\t[]string{\"hex1\", \"hex2\"}, 0.1,\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tmaxFeeRate := 0.1\n\t\t\t\treturn btcjson.NewJsonSubmitPackageCmd(\n\t\t\t\t\t[]string{\"hex1\", \"hex2\"},\n\t\t\t\t\t&maxFeeRate, nil,\n\t\t\t\t)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"submitpackage\",\"params\":[[\"hex1\",\"hex2\"],0.1],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.JsonSubmitPackageCmd{\n\t\t\t\tRawTxs:        []string{\"hex1\", \"hex2\"},\n\t\t\t\tMaxFeeRate:    btcjson.Float64(0.1),\n\t\t\t\tMaxBurnAmount: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"submitpackage with all optional params\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"submitpackage\",\n\t\t\t\t\t[]string{\"hex1\", \"hex2\", \"hex3\"},\n\t\t\t\t\t0.25, 0.001,\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tmaxFeeRate := 0.25\n\t\t\t\tmaxBurnAmount := 0.001\n\t\t\t\treturn btcjson.NewJsonSubmitPackageCmd(\n\t\t\t\t\t[]string{\"hex1\", \"hex2\", \"hex3\"},\n\t\t\t\t\t&maxFeeRate, &maxBurnAmount,\n\t\t\t\t)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"submitpackage\",\"params\":[[\"hex1\",\"hex2\",\"hex3\"],0.25,0.001],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.JsonSubmitPackageCmd{\n\t\t\t\tRawTxs:        []string{\"hex1\", \"hex2\", \"hex3\"},\n\t\t\t\tMaxFeeRate:    btcjson.Float64(0.25),\n\t\t\t\tMaxBurnAmount: btcjson.Float64(0.001),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"submitpackage single tx\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"submitpackage\",\n\t\t\t\t\t[]string{\"hex1\"},\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewJsonSubmitPackageCmd(\n\t\t\t\t\t[]string{\"hex1\"}, nil, nil,\n\t\t\t\t)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"submitpackage\",\"params\":[[\"hex1\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.JsonSubmitPackageCmd{\n\t\t\t\tRawTxs:        []string{\"hex1\"},\n\t\t\t\tMaxFeeRate:    nil,\n\t\t\t\tMaxBurnAmount: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"submitpackage with zero maxfeerate\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"submitpackage\",\n\t\t\t\t\t[]string{\"hex1\", \"hex2\"},\n\t\t\t\t\t0.0,\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tmaxFeeRate := 0.0\n\t\t\t\treturn btcjson.NewJsonSubmitPackageCmd(\n\t\t\t\t\t[]string{\"hex1\", \"hex2\"},\n\t\t\t\t\t&maxFeeRate, nil,\n\t\t\t\t)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"submitpackage\",\"params\":[[\"hex1\",\"hex2\"],0],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.JsonSubmitPackageCmd{\n\t\t\t\tRawTxs:        []string{\"hex1\", \"hex2\"},\n\t\t\t\tMaxFeeRate:    btcjson.Float64(0.0),\n\t\t\t\tMaxBurnAmount: nil,\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Marshal the command as created by the new static command\n\t\t// creation function.\n\t\tmarshalled, err := btcjson.MarshalCmd(\n\t\t\tbtcjson.RpcVersion1, testID, test.staticCmd(),\n\t\t)\n\t\trequire.NoError(\n\t\t\tt, err, \"MarshalCmd #%d (%s) unexpected in test\", i,\n\t\t\ttest.name,\n\t\t)\n\n\t\trequire.Equal(\n\t\t\tt, test.marshalled, string(marshalled),\n\t\t\t\"Test #%d (%s) unexpected marshalled data\",\n\t\t\ti, test.name,\n\t\t)\n\n\t\t// Ensure the command is created without error via the generic\n\t\t// new command creation function.\n\t\tcmd, err := test.newCmd()\n\t\trequire.NoError(\n\t\t\tt, err, \"NewCmd #%d (%s) unexpected error in test\",\n\t\t\ti, test.name,\n\t\t)\n\n\t\t// Marshal the command as created by the generic new command\n\t\t// creation function.\n\t\tmarshalled, err = btcjson.MarshalCmd(\n\t\t\tbtcjson.RpcVersion1, testID, cmd,\n\t\t)\n\t\trequire.NoError(\n\t\t\tt, err, \"MarshalCmd #%d (%s) unexpected in test\", i,\n\t\t\ttest.name,\n\t\t)\n\n\t\t// Ensure the marshalled data matches the expected value.\n\t\trequire.Equal(\n\t\t\tt, test.marshalled, string(marshalled),\n\t\t\t\"Test #%d (%s) unexpected marshalled data\",\n\t\t\ti, test.name,\n\t\t)\n\n\t\tvar request btcjson.Request\n\t\terr = json.Unmarshal(marshalled, &request)\n\t\trequire.NoError(\n\t\t\tt, err,\n\t\t\t\"UnmarshalCmd #%d (%s) unexpected error in test\", i,\n\t\t\ttest.name,\n\t\t)\n\n\t\tcmd, err = btcjson.UnmarshalCmd(&request)\n\t\trequire.NoError(\n\t\t\tt, err,\n\t\t\t\"UnmarshalCmd #%d (%s) unexpected error in test\", i,\n\t\t\ttest.name,\n\t\t)\n\n\t\trequire.Equal(\n\t\t\tt, test.unmarshalled, cmd,\n\t\t\t\"Test #%d (%s) unexpected unmarshalled command\",\n\t\t\ti, test.name,\n\t\t)\n\t}\n}\n\n// TestSubmitPackageResultUnmarshalJSON tests the UnmarshalJSON method of\n// SubmitPackageResult to ensure it properly converts from JSON format to the\n// higher-level Go types.\nfunc TestSubmitPackageResultUnmarshalJSON(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tjson     string\n\t\texpected btcjson.SubmitPackageResult\n\t\twantErr  bool\n\t}{\n\t\t{\n\t\t\tname: \"successful package\",\n\t\t\tjson: `{\n\t\t\t\t\"package_msg\": \"success\",\n\t\t\t\t\"tx-results\": {\n\t\t\t\t\t\"wtxid1\": {\n\t\t\t\t\t\t\"txid\": \"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\t\t\t\t\"vsize\": 150,\n\t\t\t\t\t\t\"fees\": {\n\t\t\t\t\t\t\t\"base\": 0.00001000,\n\t\t\t\t\t\t\t\"effective-feerate\": 0.00010000,\n\t\t\t\t\t\t\t\"effective-includes\": [\"wtxid1\", \"wtxid2\"]\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"wtxid2\": {\n\t\t\t\t\t\t\"txid\": \"fedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321\",\n\t\t\t\t\t\t\"vsize\": 200,\n\t\t\t\t\t\t\"fees\": {\n\t\t\t\t\t\t\t\"base\": 0.00002000\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"replaced-transactions\": [\"abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890\"]\n\t\t\t}`,\n\t\t\texpected: btcjson.SubmitPackageResult{\n\t\t\t\tPackageMsg: \"success\",\n\t\t\t\tTxResults: map[string]btcjson.SubmitPackageTxResult{\n\t\t\t\t\t\"wtxid1\": {\n\t\t\t\t\t\tTxID: *mustParseHash(\"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\"),\n\t\t\t\t\t},\n\t\t\t\t\t\"wtxid2\": {\n\t\t\t\t\t\tTxID: *mustParseHash(\"fedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tReplacedTransactions: []chainhash.Hash{\n\t\t\t\t\t*mustParseHash(\"abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890\"),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"package with errors\",\n\t\t\tjson: `{\n\t\t\t\t\"package_msg\": \"transaction failed\",\n\t\t\t\t\"tx-results\": {\n\t\t\t\t\t\"wtxid1\": {\n\t\t\t\t\t\t\"txid\": \"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\t\t\t\t\"vsize\": 150,\n\t\t\t\t\t\t\"fees\": {\n\t\t\t\t\t\t\t\"base\": 0.00001000\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"error\": \"insufficient fee\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}`,\n\t\t\texpected: btcjson.SubmitPackageResult{\n\t\t\t\tPackageMsg: \"transaction failed\",\n\t\t\t\tTxResults: map[string]btcjson.SubmitPackageTxResult{\n\t\t\t\t\t\"wtxid1\": {\n\t\t\t\t\t\tTxID:  *mustParseHash(\"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\"),\n\t\t\t\t\t\tError: btcjson.String(\"insufficient fee\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"package with other-wtxid\",\n\t\t\tjson: `{\n\t\t\t\t\"package_msg\": \"already in mempool\",\n\t\t\t\t\"tx-results\": {\n\t\t\t\t\t\"wtxid1\": {\n\t\t\t\t\t\t\"txid\": \"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\t\t\t\t\"other-wtxid\": \"fedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321\",\n\t\t\t\t\t\t\"vsize\": 150,\n\t\t\t\t\t\t\"fees\": {\n\t\t\t\t\t\t\t\"base\": 0.00001000\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}`,\n\t\t\texpected: btcjson.SubmitPackageResult{\n\t\t\t\tPackageMsg: \"already in mempool\",\n\t\t\t\tTxResults: map[string]btcjson.SubmitPackageTxResult{\n\t\t\t\t\t\"wtxid1\": {\n\t\t\t\t\t\tTxID:       *mustParseHash(\"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\"),\n\t\t\t\t\t\tOtherWtxid: mustParseHash(\"fedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"minimal response\",\n\t\t\tjson: `{\n\t\t\t\t\"package_msg\": \"success\",\n\t\t\t\t\"tx-results\": {}\n\t\t\t}`,\n\t\t\texpected: btcjson.SubmitPackageResult{\n\t\t\t\tPackageMsg:           \"success\",\n\t\t\t\tTxResults:            map[string]btcjson.SubmitPackageTxResult{},\n\t\t\t\tReplacedTransactions: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"invalid txid\",\n\t\t\tjson: `{\n\t\t\t\t\"package_msg\": \"success\",\n\t\t\t\t\"tx-results\": {\n\t\t\t\t\t\"wtxid1\": {\n\t\t\t\t\t\t\"txid\": \"invalid-txid\",\n\t\t\t\t\t\t\"vsize\": 150,\n\t\t\t\t\t\t\"fees\": {\n\t\t\t\t\t\t\t\"base\": 0.00001000\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}`,\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid replaced transaction\",\n\t\t\tjson: `{\n\t\t\t\t\"package_msg\": \"success\",\n\t\t\t\t\"tx-results\": {},\n\t\t\t\t\"replaced-transactions\": [\"not-a-valid-hash\"]\n\t\t\t}`,\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid other-wtxid\",\n\t\t\tjson: `{\n\t\t\t\t\"package_msg\": \"success\",\n\t\t\t\t\"tx-results\": {\n\t\t\t\t\t\"wtxid1\": {\n\t\t\t\t\t\t\"txid\": \"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\t\t\t\t\"other-wtxid\": \"invalid-wtxid\",\n\t\t\t\t\t\t\"vsize\": 150,\n\t\t\t\t\t\t\"fees\": {\n\t\t\t\t\t\t\t\"base\": 0.00001000\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}`,\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"empty other-wtxid\",\n\t\t\tjson: `{\n\t\t\t\t\"package_msg\": \"success\",\n\t\t\t\t\"tx-results\": {\n\t\t\t\t\t\"wtxid1\": {\n\t\t\t\t\t\t\"txid\": \"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\",\n\t\t\t\t\t\t\"other-wtxid\": \"\",\n\t\t\t\t\t\t\"vsize\": 150,\n\t\t\t\t\t\t\"fees\": {\n\t\t\t\t\t\t\t\"base\": 0.00001000\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}`,\n\t\t\texpected: btcjson.SubmitPackageResult{\n\t\t\t\tPackageMsg: \"success\",\n\t\t\t\tTxResults: map[string]btcjson.SubmitPackageTxResult{\n\t\t\t\t\t\"wtxid1\": {\n\t\t\t\t\t\tTxID:       *mustParseHash(\"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\"),\n\t\t\t\t\t\tOtherWtxid: nil,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tvar result btcjson.SubmitPackageResult\n\t\t\terr := result.UnmarshalJSON([]byte(test.json))\n\n\t\t\tif test.wantErr {\n\t\t\t\trequire.Error(\n\t\t\t\t\tt, err, \"expected error for test: %s\",\n\t\t\t\t\ttest.name,\n\t\t\t\t)\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\trequire.NoError(\n\t\t\t\tt, err, \"unexpected error for test: %s\",\n\t\t\t\ttest.name,\n\t\t\t)\n\n\t\t\trequire.Equal(\n\t\t\t\tt, test.expected.PackageMsg, result.PackageMsg,\n\t\t\t\t\"unexpected PackageMsg for test: %s\", test.name,\n\t\t\t)\n\t\t})\n\t}\n}\n\n// mustParseHash parses a hash string and panics on error.\n// This is a helper for tests only.\nfunc mustParseHash(s string) *chainhash.Hash {\n\thash, err := chainhash.NewHashFromStr(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn hash\n}\n"
  },
  {
    "path": "btcjson/walletsvrcmds.go",
    "content": "// Copyright (c) 2014-2020 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// NOTE: This file is intended to house the RPC commands that are supported by\n// a wallet server.\n\npackage btcjson\n\nimport (\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n)\n\n// AddMultisigAddressCmd defines the addmutisigaddress JSON-RPC command.\ntype AddMultisigAddressCmd struct {\n\tNRequired int\n\tKeys      []string\n\tAccount   *string\n}\n\n// NewAddMultisigAddressCmd returns a new instance which can be used to issue a\n// addmultisigaddress JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewAddMultisigAddressCmd(nRequired int, keys []string, account *string) *AddMultisigAddressCmd {\n\treturn &AddMultisigAddressCmd{\n\t\tNRequired: nRequired,\n\t\tKeys:      keys,\n\t\tAccount:   account,\n\t}\n}\n\n// AddWitnessAddressCmd defines the addwitnessaddress JSON-RPC command.\ntype AddWitnessAddressCmd struct {\n\tAddress string\n}\n\n// NewAddWitnessAddressCmd returns a new instance which can be used to issue a\n// addwitnessaddress JSON-RPC command.\nfunc NewAddWitnessAddressCmd(address string) *AddWitnessAddressCmd {\n\treturn &AddWitnessAddressCmd{\n\t\tAddress: address,\n\t}\n}\n\n// CreateMultisigCmd defines the createmultisig JSON-RPC command.\ntype CreateMultisigCmd struct {\n\tNRequired int\n\tKeys      []string\n}\n\n// NewCreateMultisigCmd returns a new instance which can be used to issue a\n// createmultisig JSON-RPC command.\nfunc NewCreateMultisigCmd(nRequired int, keys []string) *CreateMultisigCmd {\n\treturn &CreateMultisigCmd{\n\t\tNRequired: nRequired,\n\t\tKeys:      keys,\n\t}\n}\n\n// CreateWalletCmd defines the createwallet JSON-RPC command.\ntype CreateWalletCmd struct {\n\tWalletName         string\n\tDisablePrivateKeys *bool   `jsonrpcdefault:\"false\"`\n\tBlank              *bool   `jsonrpcdefault:\"false\"`\n\tPassphrase         *string `jsonrpcdefault:\"\\\"\\\"\"`\n\tAvoidReuse         *bool   `jsonrpcdefault:\"false\"`\n}\n\n// NewCreateWalletCmd returns a new instance which can be used to issue a\n// createwallet JSON-RPC command.\nfunc NewCreateWalletCmd(walletName string, disablePrivateKeys *bool,\n\tblank *bool, passphrase *string, avoidReuse *bool) *CreateWalletCmd {\n\treturn &CreateWalletCmd{\n\t\tWalletName:         walletName,\n\t\tDisablePrivateKeys: disablePrivateKeys,\n\t\tBlank:              blank,\n\t\tPassphrase:         passphrase,\n\t\tAvoidReuse:         avoidReuse,\n\t}\n}\n\n// DumpPrivKeyCmd defines the dumpprivkey JSON-RPC command.\ntype DumpPrivKeyCmd struct {\n\tAddress string\n}\n\n// NewDumpPrivKeyCmd returns a new instance which can be used to issue a\n// dumpprivkey JSON-RPC command.\nfunc NewDumpPrivKeyCmd(address string) *DumpPrivKeyCmd {\n\treturn &DumpPrivKeyCmd{\n\t\tAddress: address,\n\t}\n}\n\n// EncryptWalletCmd defines the encryptwallet JSON-RPC command.\ntype EncryptWalletCmd struct {\n\tPassphrase string\n}\n\n// NewEncryptWalletCmd returns a new instance which can be used to issue a\n// encryptwallet JSON-RPC command.\nfunc NewEncryptWalletCmd(passphrase string) *EncryptWalletCmd {\n\treturn &EncryptWalletCmd{\n\t\tPassphrase: passphrase,\n\t}\n}\n\n// EstimateSmartFeeMode defines the different fee estimation modes available\n// for the estimatesmartfee JSON-RPC command.\ntype EstimateSmartFeeMode string\n\nvar (\n\tEstimateModeUnset        EstimateSmartFeeMode = \"UNSET\"\n\tEstimateModeEconomical   EstimateSmartFeeMode = \"ECONOMICAL\"\n\tEstimateModeConservative EstimateSmartFeeMode = \"CONSERVATIVE\"\n)\n\n// EstimateSmartFeeCmd defines the estimatesmartfee JSON-RPC command.\ntype EstimateSmartFeeCmd struct {\n\tConfTarget   int64\n\tEstimateMode *EstimateSmartFeeMode `jsonrpcdefault:\"\\\"CONSERVATIVE\\\"\"`\n}\n\n// NewEstimateSmartFeeCmd returns a new instance which can be used to issue a\n// estimatesmartfee JSON-RPC command.\nfunc NewEstimateSmartFeeCmd(confTarget int64, mode *EstimateSmartFeeMode) *EstimateSmartFeeCmd {\n\treturn &EstimateSmartFeeCmd{\n\t\tConfTarget: confTarget, EstimateMode: mode,\n\t}\n}\n\n// EstimateFeeCmd defines the estimatefee JSON-RPC command.\ntype EstimateFeeCmd struct {\n\tNumBlocks int64\n}\n\n// NewEstimateFeeCmd returns a new instance which can be used to issue a\n// estimatefee JSON-RPC command.\nfunc NewEstimateFeeCmd(numBlocks int64) *EstimateFeeCmd {\n\treturn &EstimateFeeCmd{\n\t\tNumBlocks: numBlocks,\n\t}\n}\n\n// EstimatePriorityCmd defines the estimatepriority JSON-RPC command.\ntype EstimatePriorityCmd struct {\n\tNumBlocks int64\n}\n\n// NewEstimatePriorityCmd returns a new instance which can be used to issue a\n// estimatepriority JSON-RPC command.\nfunc NewEstimatePriorityCmd(numBlocks int64) *EstimatePriorityCmd {\n\treturn &EstimatePriorityCmd{\n\t\tNumBlocks: numBlocks,\n\t}\n}\n\n// GetAccountCmd defines the getaccount JSON-RPC command.\ntype GetAccountCmd struct {\n\tAddress string\n}\n\n// NewGetAccountCmd returns a new instance which can be used to issue a\n// getaccount JSON-RPC command.\nfunc NewGetAccountCmd(address string) *GetAccountCmd {\n\treturn &GetAccountCmd{\n\t\tAddress: address,\n\t}\n}\n\n// GetAccountAddressCmd defines the getaccountaddress JSON-RPC command.\ntype GetAccountAddressCmd struct {\n\tAccount string\n}\n\n// NewGetAccountAddressCmd returns a new instance which can be used to issue a\n// getaccountaddress JSON-RPC command.\nfunc NewGetAccountAddressCmd(account string) *GetAccountAddressCmd {\n\treturn &GetAccountAddressCmd{\n\t\tAccount: account,\n\t}\n}\n\n// GetAddressesByAccountCmd defines the getaddressesbyaccount JSON-RPC command.\ntype GetAddressesByAccountCmd struct {\n\tAccount string\n}\n\n// NewGetAddressesByAccountCmd returns a new instance which can be used to issue\n// a getaddressesbyaccount JSON-RPC command.\nfunc NewGetAddressesByAccountCmd(account string) *GetAddressesByAccountCmd {\n\treturn &GetAddressesByAccountCmd{\n\t\tAccount: account,\n\t}\n}\n\n// GetAddressInfoCmd defines the getaddressinfo JSON-RPC command.\ntype GetAddressInfoCmd struct {\n\tAddress string\n}\n\n// NewGetAddressInfoCmd returns a new instance which can be used to issue a\n// getaddressinfo JSON-RPC command.\nfunc NewGetAddressInfoCmd(address string) *GetAddressInfoCmd {\n\treturn &GetAddressInfoCmd{\n\t\tAddress: address,\n\t}\n}\n\n// GetBalanceCmd defines the getbalance JSON-RPC command.\ntype GetBalanceCmd struct {\n\tAccount *string\n\tMinConf *int `jsonrpcdefault:\"1\"`\n}\n\n// NewGetBalanceCmd returns a new instance which can be used to issue a\n// getbalance JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetBalanceCmd(account *string, minConf *int) *GetBalanceCmd {\n\treturn &GetBalanceCmd{\n\t\tAccount: account,\n\t\tMinConf: minConf,\n\t}\n}\n\n// GetBalancesCmd defines the getbalances JSON-RPC command.\ntype GetBalancesCmd struct{}\n\n// NewGetBalancesCmd returns a new instance which can be used to issue a\n// getbalances JSON-RPC command.\nfunc NewGetBalancesCmd() *GetBalancesCmd {\n\treturn &GetBalancesCmd{}\n}\n\n// GetNewAddressCmd defines the getnewaddress JSON-RPC command.\ntype GetNewAddressCmd struct {\n\tAccount     *string\n\tAddressType *string\n}\n\n// NewGetNewAddressCmd returns a new instance which can be used to issue a\n// getnewaddress JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetNewAddressCmd(account, addrType *string) *GetNewAddressCmd {\n\treturn &GetNewAddressCmd{\n\t\tAccount:     account,\n\t\tAddressType: addrType,\n\t}\n}\n\n// GetRawChangeAddressCmd defines the getrawchangeaddress JSON-RPC command.\ntype GetRawChangeAddressCmd struct {\n\tAccount     *string\n\tAddressType *string\n}\n\n// NewGetRawChangeAddressCmd returns a new instance which can be used to issue a\n// getrawchangeaddress JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetRawChangeAddressCmd(account, addrType *string) *GetRawChangeAddressCmd {\n\treturn &GetRawChangeAddressCmd{\n\t\tAccount:     account,\n\t\tAddressType: addrType,\n\t}\n}\n\n// GetReceivedByAccountCmd defines the getreceivedbyaccount JSON-RPC command.\ntype GetReceivedByAccountCmd struct {\n\tAccount string\n\tMinConf *int `jsonrpcdefault:\"1\"`\n}\n\n// NewGetReceivedByAccountCmd returns a new instance which can be used to issue\n// a getreceivedbyaccount JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetReceivedByAccountCmd(account string, minConf *int) *GetReceivedByAccountCmd {\n\treturn &GetReceivedByAccountCmd{\n\t\tAccount: account,\n\t\tMinConf: minConf,\n\t}\n}\n\n// GetReceivedByAddressCmd defines the getreceivedbyaddress JSON-RPC command.\ntype GetReceivedByAddressCmd struct {\n\tAddress string\n\tMinConf *int `jsonrpcdefault:\"1\"`\n}\n\n// NewGetReceivedByAddressCmd returns a new instance which can be used to issue\n// a getreceivedbyaddress JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetReceivedByAddressCmd(address string, minConf *int) *GetReceivedByAddressCmd {\n\treturn &GetReceivedByAddressCmd{\n\t\tAddress: address,\n\t\tMinConf: minConf,\n\t}\n}\n\n// GetTransactionCmd defines the gettransaction JSON-RPC command.\ntype GetTransactionCmd struct {\n\tTxid             string\n\tIncludeWatchOnly *bool `jsonrpcdefault:\"false\"`\n}\n\n// NewGetTransactionCmd returns a new instance which can be used to issue a\n// gettransaction JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetTransactionCmd(txHash string, includeWatchOnly *bool) *GetTransactionCmd {\n\treturn &GetTransactionCmd{\n\t\tTxid:             txHash,\n\t\tIncludeWatchOnly: includeWatchOnly,\n\t}\n}\n\n// GetWalletInfoCmd defines the getwalletinfo JSON-RPC command.\ntype GetWalletInfoCmd struct{}\n\n// NewGetWalletInfoCmd returns a new instance which can be used to issue a\n// getwalletinfo JSON-RPC command.\nfunc NewGetWalletInfoCmd() *GetWalletInfoCmd {\n\treturn &GetWalletInfoCmd{}\n}\n\n// BackupWalletCmd defines the backupwallet JSON-RPC command\ntype BackupWalletCmd struct {\n\tDestination string\n}\n\n// NewBackupWalletCmd returns a new instance which can be used to issue a\n// backupwallet JSON-RPC command\nfunc NewBackupWalletCmd(destination string) *BackupWalletCmd {\n\treturn &BackupWalletCmd{Destination: destination}\n}\n\n// UnloadWalletCmd defines the unloadwallet JSON-RPC command\ntype UnloadWalletCmd struct {\n\tWalletName *string\n}\n\n// NewUnloadWalletCmd returns a new instance which can be used to issue a\n// unloadwallet JSON-RPC command.\nfunc NewUnloadWalletCmd(walletName *string) *UnloadWalletCmd {\n\treturn &UnloadWalletCmd{WalletName: walletName}\n}\n\n// LoadWalletCmd defines the loadwallet JSON-RPC command\ntype LoadWalletCmd struct {\n\tWalletName string\n}\n\n// NewLoadWalletCmd returns a new instance which can be used to issue a\n// loadwallet JSON-RPC command\nfunc NewLoadWalletCmd(walletName string) *LoadWalletCmd {\n\treturn &LoadWalletCmd{WalletName: walletName}\n}\n\n// ImportPrivKeyCmd defines the importprivkey JSON-RPC command.\ntype ImportPrivKeyCmd struct {\n\tPrivKey string\n\tLabel   *string\n\tRescan  *bool `jsonrpcdefault:\"true\"`\n}\n\n// NewImportPrivKeyCmd returns a new instance which can be used to issue a\n// importprivkey JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewImportPrivKeyCmd(privKey string, label *string, rescan *bool) *ImportPrivKeyCmd {\n\treturn &ImportPrivKeyCmd{\n\t\tPrivKey: privKey,\n\t\tLabel:   label,\n\t\tRescan:  rescan,\n\t}\n}\n\n// KeyPoolRefillCmd defines the keypoolrefill JSON-RPC command.\ntype KeyPoolRefillCmd struct {\n\tNewSize *uint `jsonrpcdefault:\"100\"`\n}\n\n// NewKeyPoolRefillCmd returns a new instance which can be used to issue a\n// keypoolrefill JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewKeyPoolRefillCmd(newSize *uint) *KeyPoolRefillCmd {\n\treturn &KeyPoolRefillCmd{\n\t\tNewSize: newSize,\n\t}\n}\n\n// ListAccountsCmd defines the listaccounts JSON-RPC command.\ntype ListAccountsCmd struct {\n\tMinConf *int `jsonrpcdefault:\"1\"`\n}\n\n// NewListAccountsCmd returns a new instance which can be used to issue a\n// listaccounts JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewListAccountsCmd(minConf *int) *ListAccountsCmd {\n\treturn &ListAccountsCmd{\n\t\tMinConf: minConf,\n\t}\n}\n\n// ListAddressGroupingsCmd defines the listaddressgroupings JSON-RPC command.\ntype ListAddressGroupingsCmd struct{}\n\n// NewListAddressGroupingsCmd returns a new instance which can be used to issue\n// a listaddressgroupoings JSON-RPC command.\nfunc NewListAddressGroupingsCmd() *ListAddressGroupingsCmd {\n\treturn &ListAddressGroupingsCmd{}\n}\n\n// ListLockUnspentCmd defines the listlockunspent JSON-RPC command.\ntype ListLockUnspentCmd struct{}\n\n// NewListLockUnspentCmd returns a new instance which can be used to issue a\n// listlockunspent JSON-RPC command.\nfunc NewListLockUnspentCmd() *ListLockUnspentCmd {\n\treturn &ListLockUnspentCmd{}\n}\n\n// ListReceivedByAccountCmd defines the listreceivedbyaccount JSON-RPC command.\ntype ListReceivedByAccountCmd struct {\n\tMinConf          *int  `jsonrpcdefault:\"1\"`\n\tIncludeEmpty     *bool `jsonrpcdefault:\"false\"`\n\tIncludeWatchOnly *bool `jsonrpcdefault:\"false\"`\n}\n\n// NewListReceivedByAccountCmd returns a new instance which can be used to issue\n// a listreceivedbyaccount JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewListReceivedByAccountCmd(minConf *int, includeEmpty, includeWatchOnly *bool) *ListReceivedByAccountCmd {\n\treturn &ListReceivedByAccountCmd{\n\t\tMinConf:          minConf,\n\t\tIncludeEmpty:     includeEmpty,\n\t\tIncludeWatchOnly: includeWatchOnly,\n\t}\n}\n\n// ListReceivedByAddressCmd defines the listreceivedbyaddress JSON-RPC command.\ntype ListReceivedByAddressCmd struct {\n\tMinConf          *int  `jsonrpcdefault:\"1\"`\n\tIncludeEmpty     *bool `jsonrpcdefault:\"false\"`\n\tIncludeWatchOnly *bool `jsonrpcdefault:\"false\"`\n}\n\n// NewListReceivedByAddressCmd returns a new instance which can be used to issue\n// a listreceivedbyaddress JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewListReceivedByAddressCmd(minConf *int, includeEmpty, includeWatchOnly *bool) *ListReceivedByAddressCmd {\n\treturn &ListReceivedByAddressCmd{\n\t\tMinConf:          minConf,\n\t\tIncludeEmpty:     includeEmpty,\n\t\tIncludeWatchOnly: includeWatchOnly,\n\t}\n}\n\n// ListSinceBlockCmd defines the listsinceblock JSON-RPC command.\ntype ListSinceBlockCmd struct {\n\tBlockHash           *string\n\tTargetConfirmations *int  `jsonrpcdefault:\"1\"`\n\tIncludeWatchOnly    *bool `jsonrpcdefault:\"false\"`\n}\n\n// NewListSinceBlockCmd returns a new instance which can be used to issue a\n// listsinceblock JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewListSinceBlockCmd(blockHash *string, targetConfirms *int, includeWatchOnly *bool) *ListSinceBlockCmd {\n\treturn &ListSinceBlockCmd{\n\t\tBlockHash:           blockHash,\n\t\tTargetConfirmations: targetConfirms,\n\t\tIncludeWatchOnly:    includeWatchOnly,\n\t}\n}\n\n// ListTransactionsCmd defines the listtransactions JSON-RPC command.\ntype ListTransactionsCmd struct {\n\tAccount          *string\n\tCount            *int  `jsonrpcdefault:\"10\"`\n\tFrom             *int  `jsonrpcdefault:\"0\"`\n\tIncludeWatchOnly *bool `jsonrpcdefault:\"false\"`\n}\n\n// NewListTransactionsCmd returns a new instance which can be used to issue a\n// listtransactions JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewListTransactionsCmd(account *string, count, from *int, includeWatchOnly *bool) *ListTransactionsCmd {\n\treturn &ListTransactionsCmd{\n\t\tAccount:          account,\n\t\tCount:            count,\n\t\tFrom:             from,\n\t\tIncludeWatchOnly: includeWatchOnly,\n\t}\n}\n\n// ListUnspentCmd defines the listunspent JSON-RPC command.\ntype ListUnspentCmd struct {\n\tMinConf   *int `jsonrpcdefault:\"1\"`\n\tMaxConf   *int `jsonrpcdefault:\"9999999\"`\n\tAddresses *[]string\n}\n\n// NewListUnspentCmd returns a new instance which can be used to issue a\n// listunspent JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewListUnspentCmd(minConf, maxConf *int, addresses *[]string) *ListUnspentCmd {\n\treturn &ListUnspentCmd{\n\t\tMinConf:   minConf,\n\t\tMaxConf:   maxConf,\n\t\tAddresses: addresses,\n\t}\n}\n\n// LockUnspentCmd defines the lockunspent JSON-RPC command.\ntype LockUnspentCmd struct {\n\tUnlock       bool\n\tTransactions []TransactionInput\n}\n\n// NewLockUnspentCmd returns a new instance which can be used to issue a\n// lockunspent JSON-RPC command.\nfunc NewLockUnspentCmd(unlock bool, transactions []TransactionInput) *LockUnspentCmd {\n\treturn &LockUnspentCmd{\n\t\tUnlock:       unlock,\n\t\tTransactions: transactions,\n\t}\n}\n\n// MoveCmd defines the move JSON-RPC command.\ntype MoveCmd struct {\n\tFromAccount string\n\tToAccount   string\n\tAmount      float64 // In BTC\n\tMinConf     *int    `jsonrpcdefault:\"1\"`\n\tComment     *string\n}\n\n// NewMoveCmd returns a new instance which can be used to issue a move JSON-RPC\n// command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewMoveCmd(fromAccount, toAccount string, amount float64, minConf *int, comment *string) *MoveCmd {\n\treturn &MoveCmd{\n\t\tFromAccount: fromAccount,\n\t\tToAccount:   toAccount,\n\t\tAmount:      amount,\n\t\tMinConf:     minConf,\n\t\tComment:     comment,\n\t}\n}\n\n// SendFromCmd defines the sendfrom JSON-RPC command.\ntype SendFromCmd struct {\n\tFromAccount string\n\tToAddress   string\n\tAmount      float64 // In BTC\n\tMinConf     *int    `jsonrpcdefault:\"1\"`\n\tComment     *string\n\tCommentTo   *string\n}\n\n// NewSendFromCmd returns a new instance which can be used to issue a sendfrom\n// JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewSendFromCmd(fromAccount, toAddress string, amount float64, minConf *int, comment, commentTo *string) *SendFromCmd {\n\treturn &SendFromCmd{\n\t\tFromAccount: fromAccount,\n\t\tToAddress:   toAddress,\n\t\tAmount:      amount,\n\t\tMinConf:     minConf,\n\t\tComment:     comment,\n\t\tCommentTo:   commentTo,\n\t}\n}\n\n// SendManyCmd defines the sendmany JSON-RPC command.\ntype SendManyCmd struct {\n\tFromAccount string\n\tAmounts     map[string]float64 `jsonrpcusage:\"{\\\"address\\\":amount,...}\"` // In BTC\n\tMinConf     *int               `jsonrpcdefault:\"1\"`\n\tComment     *string\n}\n\n// NewSendManyCmd returns a new instance which can be used to issue a sendmany\n// JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewSendManyCmd(fromAccount string, amounts map[string]float64, minConf *int, comment *string) *SendManyCmd {\n\treturn &SendManyCmd{\n\t\tFromAccount: fromAccount,\n\t\tAmounts:     amounts,\n\t\tMinConf:     minConf,\n\t\tComment:     comment,\n\t}\n}\n\n// SendToAddressCmd defines the sendtoaddress JSON-RPC command.\ntype SendToAddressCmd struct {\n\tAddress   string\n\tAmount    float64\n\tComment   *string\n\tCommentTo *string\n}\n\n// NewSendToAddressCmd returns a new instance which can be used to issue a\n// sendtoaddress JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewSendToAddressCmd(address string, amount float64, comment, commentTo *string) *SendToAddressCmd {\n\treturn &SendToAddressCmd{\n\t\tAddress:   address,\n\t\tAmount:    amount,\n\t\tComment:   comment,\n\t\tCommentTo: commentTo,\n\t}\n}\n\n// SetAccountCmd defines the setaccount JSON-RPC command.\ntype SetAccountCmd struct {\n\tAddress string\n\tAccount string\n}\n\n// NewSetAccountCmd returns a new instance which can be used to issue a\n// setaccount JSON-RPC command.\nfunc NewSetAccountCmd(address, account string) *SetAccountCmd {\n\treturn &SetAccountCmd{\n\t\tAddress: address,\n\t\tAccount: account,\n\t}\n}\n\n// SetTxFeeCmd defines the settxfee JSON-RPC command.\ntype SetTxFeeCmd struct {\n\tAmount float64 // In BTC\n}\n\n// NewSetTxFeeCmd returns a new instance which can be used to issue a settxfee\n// JSON-RPC command.\nfunc NewSetTxFeeCmd(amount float64) *SetTxFeeCmd {\n\treturn &SetTxFeeCmd{\n\t\tAmount: amount,\n\t}\n}\n\n// SignMessageCmd defines the signmessage JSON-RPC command.\ntype SignMessageCmd struct {\n\tAddress string\n\tMessage string\n}\n\n// NewSignMessageCmd returns a new instance which can be used to issue a\n// signmessage JSON-RPC command.\nfunc NewSignMessageCmd(address, message string) *SignMessageCmd {\n\treturn &SignMessageCmd{\n\t\tAddress: address,\n\t\tMessage: message,\n\t}\n}\n\n// RawTxInput models the data needed for raw transaction input that is used in\n// the SignRawTransactionCmd struct.\ntype RawTxInput struct {\n\tTxid         string `json:\"txid\"`\n\tVout         uint32 `json:\"vout\"`\n\tScriptPubKey string `json:\"scriptPubKey\"`\n\tRedeemScript string `json:\"redeemScript\"`\n}\n\n// SignRawTransactionCmd defines the signrawtransaction JSON-RPC command.\ntype SignRawTransactionCmd struct {\n\tRawTx    string\n\tInputs   *[]RawTxInput\n\tPrivKeys *[]string\n\tFlags    *string `jsonrpcdefault:\"\\\"ALL\\\"\"`\n}\n\n// NewSignRawTransactionCmd returns a new instance which can be used to issue a\n// signrawtransaction JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewSignRawTransactionCmd(hexEncodedTx string, inputs *[]RawTxInput, privKeys *[]string, flags *string) *SignRawTransactionCmd {\n\treturn &SignRawTransactionCmd{\n\t\tRawTx:    hexEncodedTx,\n\t\tInputs:   inputs,\n\t\tPrivKeys: privKeys,\n\t\tFlags:    flags,\n\t}\n}\n\n// RawTxWitnessInput models the data needed for raw transaction input that is used in\n// the SignRawTransactionWithWalletCmd struct. The RedeemScript is required for P2SH inputs,\n// the WitnessScript is required for P2WSH or P2SH-P2WSH witness scripts, and the Amount is\n// required for Segwit inputs. Otherwise, those fields can be left blank.\ntype RawTxWitnessInput struct {\n\tTxid          string   `json:\"txid\"`\n\tVout          uint32   `json:\"vout\"`\n\tScriptPubKey  string   `json:\"scriptPubKey\"`\n\tRedeemScript  *string  `json:\"redeemScript,omitempty\"`\n\tWitnessScript *string  `json:\"witnessScript,omitempty\"`\n\tAmount        *float64 `json:\"amount,omitempty\"` // In BTC\n}\n\n// SignRawTransactionWithWalletCmd defines the signrawtransactionwithwallet JSON-RPC command.\ntype SignRawTransactionWithWalletCmd struct {\n\tRawTx       string\n\tInputs      *[]RawTxWitnessInput\n\tSigHashType *string `jsonrpcdefault:\"\\\"ALL\\\"\"`\n}\n\n// NewSignRawTransactionWithWalletCmd returns a new instance which can be used to issue a\n// signrawtransactionwithwallet JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewSignRawTransactionWithWalletCmd(hexEncodedTx string, inputs *[]RawTxWitnessInput, sigHashType *string) *SignRawTransactionWithWalletCmd {\n\treturn &SignRawTransactionWithWalletCmd{\n\t\tRawTx:       hexEncodedTx,\n\t\tInputs:      inputs,\n\t\tSigHashType: sigHashType,\n\t}\n}\n\n// WalletLockCmd defines the walletlock JSON-RPC command.\ntype WalletLockCmd struct{}\n\n// NewWalletLockCmd returns a new instance which can be used to issue a\n// walletlock JSON-RPC command.\nfunc NewWalletLockCmd() *WalletLockCmd {\n\treturn &WalletLockCmd{}\n}\n\n// WalletPassphraseCmd defines the walletpassphrase JSON-RPC command.\ntype WalletPassphraseCmd struct {\n\tPassphrase string\n\tTimeout    int64\n}\n\n// NewWalletPassphraseCmd returns a new instance which can be used to issue a\n// walletpassphrase JSON-RPC command.\nfunc NewWalletPassphraseCmd(passphrase string, timeout int64) *WalletPassphraseCmd {\n\treturn &WalletPassphraseCmd{\n\t\tPassphrase: passphrase,\n\t\tTimeout:    timeout,\n\t}\n}\n\n// WalletPassphraseChangeCmd defines the walletpassphrase JSON-RPC command.\ntype WalletPassphraseChangeCmd struct {\n\tOldPassphrase string\n\tNewPassphrase string\n}\n\n// NewWalletPassphraseChangeCmd returns a new instance which can be used to\n// issue a walletpassphrasechange JSON-RPC command.\nfunc NewWalletPassphraseChangeCmd(oldPassphrase, newPassphrase string) *WalletPassphraseChangeCmd {\n\treturn &WalletPassphraseChangeCmd{\n\t\tOldPassphrase: oldPassphrase,\n\t\tNewPassphrase: newPassphrase,\n\t}\n}\n\n// TimestampOrNow defines a type to represent a timestamp value in seconds,\n// since epoch.\n//\n// The value can either be a integer, or the string \"now\".\n//\n// NOTE: Interpretation of the timestamp value depends upon the specific\n// JSON-RPC command, where it is used.\ntype TimestampOrNow struct {\n\tValue interface{}\n}\n\n// MarshalJSON implements the json.Marshaler interface for TimestampOrNow\nfunc (t TimestampOrNow) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(t.Value)\n}\n\n// UnmarshalJSON implements the json.Unmarshaler interface for TimestampOrNow\nfunc (t *TimestampOrNow) UnmarshalJSON(data []byte) error {\n\tvar unmarshalled interface{}\n\tif err := json.Unmarshal(data, &unmarshalled); err != nil {\n\t\treturn err\n\t}\n\n\tswitch v := unmarshalled.(type) {\n\tcase float64:\n\t\tt.Value = int(v)\n\tcase string:\n\t\tif v != \"now\" {\n\t\t\treturn fmt.Errorf(\"invalid timestamp value: %v\", unmarshalled)\n\t\t}\n\t\tt.Value = v\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid timestamp value: %v\", unmarshalled)\n\t}\n\treturn nil\n}\n\n// ScriptPubKeyAddress represents an address, to be used in conjunction with\n// ScriptPubKey.\ntype ScriptPubKeyAddress struct {\n\tAddress string `json:\"address\"`\n}\n\n// ScriptPubKey represents a script (as a string) or an address\n// (as a ScriptPubKeyAddress).\ntype ScriptPubKey struct {\n\tValue interface{}\n}\n\n// MarshalJSON implements the json.Marshaler interface for ScriptPubKey\nfunc (s ScriptPubKey) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(s.Value)\n}\n\n// UnmarshalJSON implements the json.Unmarshaler interface for ScriptPubKey\nfunc (s *ScriptPubKey) UnmarshalJSON(data []byte) error {\n\tvar unmarshalled interface{}\n\tif err := json.Unmarshal(data, &unmarshalled); err != nil {\n\t\treturn err\n\t}\n\n\tswitch v := unmarshalled.(type) {\n\tcase string:\n\t\ts.Value = v\n\tcase map[string]interface{}:\n\t\ts.Value = ScriptPubKeyAddress{Address: v[\"address\"].(string)}\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid scriptPubKey value: %v\", unmarshalled)\n\t}\n\treturn nil\n}\n\n// DescriptorRange specifies the limits of a ranged Descriptor.\n//\n// Descriptors are typically ranged when specified in the form of generic HD\n// chain paths.\n//\n//\tExample of a ranged descriptor: pkh(tpub.../*)\n//\n// The value can be an int to specify the end of the range, or the range\n// itself, as []int{begin, end}.\ntype DescriptorRange struct {\n\tValue interface{}\n}\n\n// MarshalJSON implements the json.Marshaler interface for DescriptorRange\nfunc (r DescriptorRange) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(r.Value)\n}\n\n// UnmarshalJSON implements the json.Unmarshaler interface for DescriptorRange\nfunc (r *DescriptorRange) UnmarshalJSON(data []byte) error {\n\tvar unmarshalled interface{}\n\tif err := json.Unmarshal(data, &unmarshalled); err != nil {\n\t\treturn err\n\t}\n\n\tswitch v := unmarshalled.(type) {\n\tcase float64:\n\t\tr.Value = int(v)\n\tcase []interface{}:\n\t\tif len(v) != 2 {\n\t\t\treturn fmt.Errorf(\"expected [begin,end] integer range, got: %v\", unmarshalled)\n\t\t}\n\t\tbegin, ok1 := v[0].(float64)\n\t\tend, ok2 := v[1].(float64)\n\t\tif !ok1 || !ok2 {\n\t\t\treturn fmt.Errorf(\"expected both begin and end to be numbers, got: %v\", v)\n\t\t}\n\t\tr.Value = []int{\n\t\t\tint(begin),\n\t\t\tint(end),\n\t\t}\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid descriptor range value: %v\", unmarshalled)\n\t}\n\treturn nil\n}\n\n// ImportMultiRequest defines the request struct to be passed to the\n// ImportMultiCmd, as an array.\ntype ImportMultiRequest struct {\n\t// Descriptor to import, in canonical form. If using Descriptor, do not\n\t// also provide ScriptPubKey, RedeemScript, WitnessScript, PubKeys, or Keys.\n\tDescriptor *string `json:\"desc,omitempty\"`\n\n\t// Script/address to import. Should not be provided if using Descriptor.\n\tScriptPubKey *ScriptPubKey `json:\"scriptPubKey,omitempty\"`\n\n\t// Creation time of the key in seconds since epoch (Jan 1 1970 GMT), or\n\t// the string \"now\" to substitute the current synced blockchain time.\n\t//\n\t// The timestamp of the oldest key will determine how far back blockchain\n\t// rescans need to begin for missing wallet transactions.\n\t//\n\t// Specifying \"now\" bypasses scanning. Useful for keys that are known to\n\t// never have been used.\n\t//\n\t// Specifying 0 scans the entire blockchain.\n\tTimestamp TimestampOrNow `json:\"timestamp\"`\n\n\t// Allowed only if the ScriptPubKey is a P2SH or P2SH-P2WSH\n\t// address/scriptPubKey.\n\tRedeemScript *string `json:\"redeemscript,omitempty\"`\n\n\t// Allowed only if the ScriptPubKey is a P2SH-P2WSH or P2WSH\n\t// address/scriptPubKey.\n\tWitnessScript *string `json:\"witnessscript,omitempty\"`\n\n\t// Array of strings giving pubkeys to import. They must occur in P2PKH or\n\t// P2WPKH scripts. They are not required when the private key is also\n\t// provided (see Keys).\n\tPubKeys *[]string `json:\"pubkeys,omitempty\"`\n\n\t// Array of strings giving private keys to import. The corresponding\n\t// public keys must occur in the output or RedeemScript.\n\tKeys *[]string `json:\"keys,omitempty\"`\n\n\t// If the provided Descriptor is ranged, this specifies the end\n\t// (as an int) or the range (as []int{begin, end}) to import.\n\tRange *DescriptorRange `json:\"range,omitempty\"`\n\n\t// States whether matching outputs should be treated as not incoming\n\t// payments (also known as change).\n\tInternal *bool `json:\"internal,omitempty\"`\n\n\t// States whether matching outputs should be considered watchonly.\n\t//\n\t// If an address/script is imported without all of the private keys\n\t// required to spend from that address, set this field to true.\n\t//\n\t// If all the private keys are provided and the address/script is\n\t// spendable, set this field to false.\n\tWatchOnly *bool `json:\"watchonly,omitempty\"`\n\n\t// Label to assign to the address. Only allowed when Internal is false.\n\tLabel *string `json:\"label,omitempty\"`\n\n\t// States whether imported public keys should be added to the keypool for\n\t// when users request new addresses. Only allowed when wallet private keys\n\t// are disabled.\n\tKeyPool *bool `json:\"keypool,omitempty\"`\n}\n\n// ImportMultiOptions defines the options struct, provided to the\n// ImportMultiCmd as a pointer argument.\ntype ImportMultiOptions struct {\n\tRescan bool `json:\"rescan\"` // Rescan the blockchain after all imports\n}\n\n// ImportMultiCmd defines the importmulti JSON-RPC command.\ntype ImportMultiCmd struct {\n\tRequests []ImportMultiRequest\n\tOptions  *ImportMultiOptions\n}\n\n// NewImportMultiCmd returns a new instance which can be used to issue\n// an importmulti JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional. Passing nil\n// for optional parameters will use the default value.\nfunc NewImportMultiCmd(requests []ImportMultiRequest, options *ImportMultiOptions) *ImportMultiCmd {\n\treturn &ImportMultiCmd{\n\t\tRequests: requests,\n\t\tOptions:  options,\n\t}\n}\n\n// PsbtInput represents an input to include in the PSBT created by the\n// WalletCreateFundedPsbtCmd command.\ntype PsbtInput struct {\n\tTxid     string `json:\"txid\"`\n\tVout     uint32 `json:\"vout\"`\n\tSequence uint32 `json:\"sequence\"`\n}\n\n// PsbtOutput represents an output to include in the PSBT created by the\n// WalletCreateFundedPsbtCmd command.\ntype PsbtOutput map[string]interface{}\n\n// NewPsbtOutput returns a new instance of a PSBT output to use with the\n// WalletCreateFundedPsbtCmd command.\nfunc NewPsbtOutput(address string, amount btcutil.Amount) PsbtOutput {\n\treturn PsbtOutput{address: amount.ToBTC()}\n}\n\n// NewPsbtDataOutput returns a new instance of a PSBT data output to use with\n// the WalletCreateFundedPsbtCmd command.\nfunc NewPsbtDataOutput(data []byte) PsbtOutput {\n\treturn PsbtOutput{\"data\": hex.EncodeToString(data)}\n}\n\n// WalletCreateFundedPsbtOpts represents the optional options struct provided\n// with a WalletCreateFundedPsbtCmd command.\ntype WalletCreateFundedPsbtOpts struct {\n\tChangeAddress          *string     `json:\"changeAddress,omitempty\"`\n\tChangePosition         *int64      `json:\"changePosition,omitempty\"`\n\tChangeType             *ChangeType `json:\"change_type,omitempty\"`\n\tIncludeWatching        *bool       `json:\"includeWatching,omitempty\"`\n\tLockUnspents           *bool       `json:\"lockUnspents,omitempty\"`\n\tFeeRate                *float64    `json:\"feeRate,omitempty\"`\n\tSubtractFeeFromOutputs *[]int64    `json:\"subtractFeeFromOutputs,omitempty\"`\n\tReplaceable            *bool       `json:\"replaceable,omitempty\"`\n\tConfTarget             *int64      `json:\"conf_target,omitempty\"`\n\tEstimateMode           *string     `json:\"estimate_mode,omitempty\"`\n}\n\n// WalletCreateFundedPsbtCmd defines the walletcreatefundedpsbt JSON-RPC command.\ntype WalletCreateFundedPsbtCmd struct {\n\tInputs      []PsbtInput\n\tOutputs     []PsbtOutput\n\tLocktime    *uint32\n\tOptions     *WalletCreateFundedPsbtOpts\n\tBip32Derivs *bool\n}\n\n// NewWalletCreateFundedPsbtCmd returns a new instance which can be used to issue a\n// walletcreatefundedpsbt JSON-RPC command.\nfunc NewWalletCreateFundedPsbtCmd(\n\tinputs []PsbtInput, outputs []PsbtOutput, locktime *uint32,\n\toptions *WalletCreateFundedPsbtOpts, bip32Derivs *bool,\n) *WalletCreateFundedPsbtCmd {\n\treturn &WalletCreateFundedPsbtCmd{\n\t\tInputs:      inputs,\n\t\tOutputs:     outputs,\n\t\tLocktime:    locktime,\n\t\tOptions:     options,\n\t\tBip32Derivs: bip32Derivs,\n\t}\n}\n\n// WalletProcessPsbtCmd defines the walletprocesspsbt JSON-RPC command.\ntype WalletProcessPsbtCmd struct {\n\tPsbt        string\n\tSign        *bool   `jsonrpcdefault:\"true\"`\n\tSighashType *string `jsonrpcdefault:\"\\\"ALL\\\"\"`\n\tBip32Derivs *bool\n}\n\n// NewWalletProcessPsbtCmd returns a new instance which can be used to issue a\n// walletprocesspsbt JSON-RPC command.\nfunc NewWalletProcessPsbtCmd(psbt string, sign *bool, sighashType *string, bip32Derivs *bool) *WalletProcessPsbtCmd {\n\treturn &WalletProcessPsbtCmd{\n\t\tPsbt:        psbt,\n\t\tSign:        sign,\n\t\tSighashType: sighashType,\n\t\tBip32Derivs: bip32Derivs,\n\t}\n}\n\nfunc init() {\n\t// The commands in this file are only usable with a wallet server.\n\tflags := UFWalletOnly\n\n\tMustRegisterCmd(\"addmultisigaddress\", (*AddMultisigAddressCmd)(nil), flags)\n\tMustRegisterCmd(\"addwitnessaddress\", (*AddWitnessAddressCmd)(nil), flags)\n\tMustRegisterCmd(\"backupwallet\", (*BackupWalletCmd)(nil), flags)\n\tMustRegisterCmd(\"createmultisig\", (*CreateMultisigCmd)(nil), flags)\n\tMustRegisterCmd(\"createwallet\", (*CreateWalletCmd)(nil), flags)\n\tMustRegisterCmd(\"dumpprivkey\", (*DumpPrivKeyCmd)(nil), flags)\n\tMustRegisterCmd(\"encryptwallet\", (*EncryptWalletCmd)(nil), flags)\n\tMustRegisterCmd(\"estimatesmartfee\", (*EstimateSmartFeeCmd)(nil), flags)\n\tMustRegisterCmd(\"estimatefee\", (*EstimateFeeCmd)(nil), flags)\n\tMustRegisterCmd(\"estimatepriority\", (*EstimatePriorityCmd)(nil), flags)\n\tMustRegisterCmd(\"getaccount\", (*GetAccountCmd)(nil), flags)\n\tMustRegisterCmd(\"getaccountaddress\", (*GetAccountAddressCmd)(nil), flags)\n\tMustRegisterCmd(\"getaddressesbyaccount\", (*GetAddressesByAccountCmd)(nil), flags)\n\tMustRegisterCmd(\"getaddressinfo\", (*GetAddressInfoCmd)(nil), flags)\n\tMustRegisterCmd(\"getbalance\", (*GetBalanceCmd)(nil), flags)\n\tMustRegisterCmd(\"getbalances\", (*GetBalancesCmd)(nil), flags)\n\tMustRegisterCmd(\"getnewaddress\", (*GetNewAddressCmd)(nil), flags)\n\tMustRegisterCmd(\"getrawchangeaddress\", (*GetRawChangeAddressCmd)(nil), flags)\n\tMustRegisterCmd(\"getreceivedbyaccount\", (*GetReceivedByAccountCmd)(nil), flags)\n\tMustRegisterCmd(\"getreceivedbyaddress\", (*GetReceivedByAddressCmd)(nil), flags)\n\tMustRegisterCmd(\"gettransaction\", (*GetTransactionCmd)(nil), flags)\n\tMustRegisterCmd(\"getwalletinfo\", (*GetWalletInfoCmd)(nil), flags)\n\tMustRegisterCmd(\"importmulti\", (*ImportMultiCmd)(nil), flags)\n\tMustRegisterCmd(\"importprivkey\", (*ImportPrivKeyCmd)(nil), flags)\n\tMustRegisterCmd(\"keypoolrefill\", (*KeyPoolRefillCmd)(nil), flags)\n\tMustRegisterCmd(\"listaccounts\", (*ListAccountsCmd)(nil), flags)\n\tMustRegisterCmd(\"listaddressgroupings\", (*ListAddressGroupingsCmd)(nil), flags)\n\tMustRegisterCmd(\"listlockunspent\", (*ListLockUnspentCmd)(nil), flags)\n\tMustRegisterCmd(\"listreceivedbyaccount\", (*ListReceivedByAccountCmd)(nil), flags)\n\tMustRegisterCmd(\"listreceivedbyaddress\", (*ListReceivedByAddressCmd)(nil), flags)\n\tMustRegisterCmd(\"listsinceblock\", (*ListSinceBlockCmd)(nil), flags)\n\tMustRegisterCmd(\"listtransactions\", (*ListTransactionsCmd)(nil), flags)\n\tMustRegisterCmd(\"listunspent\", (*ListUnspentCmd)(nil), flags)\n\tMustRegisterCmd(\"loadwallet\", (*LoadWalletCmd)(nil), flags)\n\tMustRegisterCmd(\"lockunspent\", (*LockUnspentCmd)(nil), flags)\n\tMustRegisterCmd(\"move\", (*MoveCmd)(nil), flags)\n\tMustRegisterCmd(\"sendfrom\", (*SendFromCmd)(nil), flags)\n\tMustRegisterCmd(\"sendmany\", (*SendManyCmd)(nil), flags)\n\tMustRegisterCmd(\"sendtoaddress\", (*SendToAddressCmd)(nil), flags)\n\tMustRegisterCmd(\"setaccount\", (*SetAccountCmd)(nil), flags)\n\tMustRegisterCmd(\"settxfee\", (*SetTxFeeCmd)(nil), flags)\n\tMustRegisterCmd(\"signmessage\", (*SignMessageCmd)(nil), flags)\n\tMustRegisterCmd(\"signrawtransaction\", (*SignRawTransactionCmd)(nil), flags)\n\tMustRegisterCmd(\"signrawtransactionwithwallet\", (*SignRawTransactionWithWalletCmd)(nil), flags)\n\tMustRegisterCmd(\"unloadwallet\", (*UnloadWalletCmd)(nil), flags)\n\tMustRegisterCmd(\"walletlock\", (*WalletLockCmd)(nil), flags)\n\tMustRegisterCmd(\"walletpassphrase\", (*WalletPassphraseCmd)(nil), flags)\n\tMustRegisterCmd(\"walletpassphrasechange\", (*WalletPassphraseChangeCmd)(nil), flags)\n\tMustRegisterCmd(\"walletcreatefundedpsbt\", (*WalletCreateFundedPsbtCmd)(nil), flags)\n\tMustRegisterCmd(\"walletprocesspsbt\", (*WalletProcessPsbtCmd)(nil), flags)\n}\n"
  },
  {
    "path": "btcjson/walletsvrcmds_test.go",
    "content": "// Copyright (c) 2014-2020 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n)\n\n// TestWalletSvrCmds tests all of the wallet server commands marshal and\n// unmarshal into valid results include handling of optional fields being\n// omitted in the marshalled command, while optional fields with defaults have\n// the default assigned on unmarshalled commands.\nfunc TestWalletSvrCmds(t *testing.T) {\n\tt.Parallel()\n\n\ttestID := int(1)\n\ttests := []struct {\n\t\tname         string\n\t\tnewCmd       func() (interface{}, error)\n\t\tstaticCmd    func() interface{}\n\t\tmarshalled   string\n\t\tunmarshalled interface{}\n\t}{\n\t\t{\n\t\t\tname: \"addmultisigaddress\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"addmultisigaddress\", 2, []string{\"031234\", \"035678\"})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tkeys := []string{\"031234\", \"035678\"}\n\t\t\t\treturn btcjson.NewAddMultisigAddressCmd(2, keys, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"addmultisigaddress\",\"params\":[2,[\"031234\",\"035678\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.AddMultisigAddressCmd{\n\t\t\t\tNRequired: 2,\n\t\t\t\tKeys:      []string{\"031234\", \"035678\"},\n\t\t\t\tAccount:   nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"addmultisigaddress optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"addmultisigaddress\", 2, []string{\"031234\", \"035678\"}, \"test\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tkeys := []string{\"031234\", \"035678\"}\n\t\t\t\treturn btcjson.NewAddMultisigAddressCmd(2, keys, btcjson.String(\"test\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"addmultisigaddress\",\"params\":[2,[\"031234\",\"035678\"],\"test\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.AddMultisigAddressCmd{\n\t\t\t\tNRequired: 2,\n\t\t\t\tKeys:      []string{\"031234\", \"035678\"},\n\t\t\t\tAccount:   btcjson.String(\"test\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"createwallet\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"createwallet\", \"mywallet\", true, true, \"secret\", true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewCreateWalletCmd(\"mywallet\",\n\t\t\t\t\tbtcjson.Bool(true), btcjson.Bool(true),\n\t\t\t\t\tbtcjson.String(\"secret\"), btcjson.Bool(true))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"createwallet\",\"params\":[\"mywallet\",true,true,\"secret\",true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.CreateWalletCmd{\n\t\t\t\tWalletName:         \"mywallet\",\n\t\t\t\tDisablePrivateKeys: btcjson.Bool(true),\n\t\t\t\tBlank:              btcjson.Bool(true),\n\t\t\t\tPassphrase:         btcjson.String(\"secret\"),\n\t\t\t\tAvoidReuse:         btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"createwallet - optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"createwallet\", \"mywallet\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewCreateWalletCmd(\"mywallet\",\n\t\t\t\t\tnil, nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"createwallet\",\"params\":[\"mywallet\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.CreateWalletCmd{\n\t\t\t\tWalletName:         \"mywallet\",\n\t\t\t\tDisablePrivateKeys: btcjson.Bool(false),\n\t\t\t\tBlank:              btcjson.Bool(false),\n\t\t\t\tPassphrase:         btcjson.String(\"\"),\n\t\t\t\tAvoidReuse:         btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"createwallet - optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"createwallet\", \"mywallet\", \"null\", \"null\", \"secret\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewCreateWalletCmd(\"mywallet\",\n\t\t\t\t\tnil, nil, btcjson.String(\"secret\"), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"createwallet\",\"params\":[\"mywallet\",null,null,\"secret\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.CreateWalletCmd{\n\t\t\t\tWalletName:         \"mywallet\",\n\t\t\t\tDisablePrivateKeys: nil,\n\t\t\t\tBlank:              nil,\n\t\t\t\tPassphrase:         btcjson.String(\"secret\"),\n\t\t\t\tAvoidReuse:         btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"addwitnessaddress\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"addwitnessaddress\", \"1address\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewAddWitnessAddressCmd(\"1address\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"addwitnessaddress\",\"params\":[\"1address\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.AddWitnessAddressCmd{\n\t\t\t\tAddress: \"1address\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"backupwallet\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"backupwallet\", \"backup.dat\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewBackupWalletCmd(\"backup.dat\")\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"backupwallet\",\"params\":[\"backup.dat\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.BackupWalletCmd{Destination: \"backup.dat\"},\n\t\t},\n\t\t{\n\t\t\tname: \"loadwallet\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"loadwallet\", \"wallet.dat\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewLoadWalletCmd(\"wallet.dat\")\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"loadwallet\",\"params\":[\"wallet.dat\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.LoadWalletCmd{WalletName: \"wallet.dat\"},\n\t\t},\n\t\t{\n\t\t\tname: \"unloadwallet\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"unloadwallet\", \"default\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewUnloadWalletCmd(btcjson.String(\"default\"))\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"unloadwallet\",\"params\":[\"default\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.UnloadWalletCmd{WalletName: btcjson.String(\"default\")},\n\t\t},\n\t\t{name: \"unloadwallet - nil arg\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"unloadwallet\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewUnloadWalletCmd(nil)\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"unloadwallet\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.UnloadWalletCmd{WalletName: nil},\n\t\t},\n\t\t{\n\t\t\tname: \"createmultisig\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"createmultisig\", 2, []string{\"031234\", \"035678\"})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tkeys := []string{\"031234\", \"035678\"}\n\t\t\t\treturn btcjson.NewCreateMultisigCmd(2, keys)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"createmultisig\",\"params\":[2,[\"031234\",\"035678\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.CreateMultisigCmd{\n\t\t\t\tNRequired: 2,\n\t\t\t\tKeys:      []string{\"031234\", \"035678\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"dumpprivkey\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"dumpprivkey\", \"1Address\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewDumpPrivKeyCmd(\"1Address\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"dumpprivkey\",\"params\":[\"1Address\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.DumpPrivKeyCmd{\n\t\t\t\tAddress: \"1Address\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"encryptwallet\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"encryptwallet\", \"pass\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewEncryptWalletCmd(\"pass\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"encryptwallet\",\"params\":[\"pass\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.EncryptWalletCmd{\n\t\t\t\tPassphrase: \"pass\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"estimatefee\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"estimatefee\", 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewEstimateFeeCmd(6)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"estimatefee\",\"params\":[6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.EstimateFeeCmd{\n\t\t\t\tNumBlocks: 6,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"estimatesmartfee - no mode\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"estimatesmartfee\", 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewEstimateSmartFeeCmd(6, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"estimatesmartfee\",\"params\":[6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.EstimateSmartFeeCmd{\n\t\t\t\tConfTarget:   6,\n\t\t\t\tEstimateMode: &btcjson.EstimateModeConservative,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"estimatesmartfee - economical mode\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"estimatesmartfee\", 6, btcjson.EstimateModeEconomical)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewEstimateSmartFeeCmd(6, &btcjson.EstimateModeEconomical)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"estimatesmartfee\",\"params\":[6,\"ECONOMICAL\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.EstimateSmartFeeCmd{\n\t\t\t\tConfTarget:   6,\n\t\t\t\tEstimateMode: &btcjson.EstimateModeEconomical,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"estimatepriority\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"estimatepriority\", 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewEstimatePriorityCmd(6)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"estimatepriority\",\"params\":[6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.EstimatePriorityCmd{\n\t\t\t\tNumBlocks: 6,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getaccount\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getaccount\", \"1Address\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetAccountCmd(\"1Address\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getaccount\",\"params\":[\"1Address\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetAccountCmd{\n\t\t\t\tAddress: \"1Address\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getaccountaddress\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getaccountaddress\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetAccountAddressCmd(\"acct\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getaccountaddress\",\"params\":[\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetAccountAddressCmd{\n\t\t\t\tAccount: \"acct\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getaddressesbyaccount\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getaddressesbyaccount\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetAddressesByAccountCmd(\"acct\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getaddressesbyaccount\",\"params\":[\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetAddressesByAccountCmd{\n\t\t\t\tAccount: \"acct\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getaddressinfo\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getaddressinfo\", \"1234\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetAddressInfoCmd(\"1234\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getaddressinfo\",\"params\":[\"1234\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetAddressInfoCmd{\n\t\t\t\tAddress: \"1234\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getbalance\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getbalance\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBalanceCmd(nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getbalance\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBalanceCmd{\n\t\t\t\tAccount: nil,\n\t\t\t\tMinConf: btcjson.Int(1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getbalance optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getbalance\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBalanceCmd(btcjson.String(\"acct\"), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getbalance\",\"params\":[\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBalanceCmd{\n\t\t\t\tAccount: btcjson.String(\"acct\"),\n\t\t\t\tMinConf: btcjson.Int(1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getbalance optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getbalance\", \"acct\", 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBalanceCmd(btcjson.String(\"acct\"), btcjson.Int(6))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getbalance\",\"params\":[\"acct\",6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBalanceCmd{\n\t\t\t\tAccount: btcjson.String(\"acct\"),\n\t\t\t\tMinConf: btcjson.Int(6),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getbalances\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getbalances\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetBalancesCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getbalances\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetBalancesCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"getnewaddress\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getnewaddress\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetNewAddressCmd(nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getnewaddress\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetNewAddressCmd{\n\t\t\t\tAccount:     nil,\n\t\t\t\tAddressType: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getnewaddress optional acct\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getnewaddress\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetNewAddressCmd(btcjson.String(\"acct\"), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getnewaddress\",\"params\":[\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetNewAddressCmd{\n\t\t\t\tAccount:     btcjson.String(\"acct\"),\n\t\t\t\tAddressType: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getnewaddress optional acct and type\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getnewaddress\", \"acct\", \"legacy\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetNewAddressCmd(btcjson.String(\"acct\"), btcjson.String(\"legacy\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getnewaddress\",\"params\":[\"acct\",\"legacy\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetNewAddressCmd{\n\t\t\t\tAccount:     btcjson.String(\"acct\"),\n\t\t\t\tAddressType: btcjson.String(\"legacy\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getrawchangeaddress\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getrawchangeaddress\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetRawChangeAddressCmd(nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getrawchangeaddress\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetRawChangeAddressCmd{\n\t\t\t\tAccount:     nil,\n\t\t\t\tAddressType: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getrawchangeaddress optional acct\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getrawchangeaddress\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetRawChangeAddressCmd(btcjson.String(\"acct\"), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getrawchangeaddress\",\"params\":[\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetRawChangeAddressCmd{\n\t\t\t\tAccount:     btcjson.String(\"acct\"),\n\t\t\t\tAddressType: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getrawchangeaddress optional acct and type\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getrawchangeaddress\", \"acct\", \"legacy\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetRawChangeAddressCmd(btcjson.String(\"acct\"), btcjson.String(\"legacy\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getrawchangeaddress\",\"params\":[\"acct\",\"legacy\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetRawChangeAddressCmd{\n\t\t\t\tAccount:     btcjson.String(\"acct\"),\n\t\t\t\tAddressType: btcjson.String(\"legacy\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getreceivedbyaccount\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getreceivedbyaccount\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetReceivedByAccountCmd(\"acct\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getreceivedbyaccount\",\"params\":[\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetReceivedByAccountCmd{\n\t\t\t\tAccount: \"acct\",\n\t\t\t\tMinConf: btcjson.Int(1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getreceivedbyaccount optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getreceivedbyaccount\", \"acct\", 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetReceivedByAccountCmd(\"acct\", btcjson.Int(6))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getreceivedbyaccount\",\"params\":[\"acct\",6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetReceivedByAccountCmd{\n\t\t\t\tAccount: \"acct\",\n\t\t\t\tMinConf: btcjson.Int(6),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getreceivedbyaddress\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getreceivedbyaddress\", \"1Address\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetReceivedByAddressCmd(\"1Address\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getreceivedbyaddress\",\"params\":[\"1Address\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetReceivedByAddressCmd{\n\t\t\t\tAddress: \"1Address\",\n\t\t\t\tMinConf: btcjson.Int(1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getreceivedbyaddress optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getreceivedbyaddress\", \"1Address\", 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetReceivedByAddressCmd(\"1Address\", btcjson.Int(6))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getreceivedbyaddress\",\"params\":[\"1Address\",6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetReceivedByAddressCmd{\n\t\t\t\tAddress: \"1Address\",\n\t\t\t\tMinConf: btcjson.Int(6),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"gettransaction\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"gettransaction\", \"123\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetTransactionCmd(\"123\", nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"gettransaction\",\"params\":[\"123\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetTransactionCmd{\n\t\t\t\tTxid:             \"123\",\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"gettransaction optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"gettransaction\", \"123\", true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetTransactionCmd(\"123\", btcjson.Bool(true))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"gettransaction\",\"params\":[\"123\",true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetTransactionCmd{\n\t\t\t\tTxid:             \"123\",\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getwalletinfo\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getwalletinfo\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetWalletInfoCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"getwalletinfo\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetWalletInfoCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"importprivkey\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"importprivkey\", \"abc\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewImportPrivKeyCmd(\"abc\", nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importprivkey\",\"params\":[\"abc\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportPrivKeyCmd{\n\t\t\t\tPrivKey: \"abc\",\n\t\t\t\tLabel:   nil,\n\t\t\t\tRescan:  btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importprivkey optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"importprivkey\", \"abc\", \"label\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewImportPrivKeyCmd(\"abc\", btcjson.String(\"label\"), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importprivkey\",\"params\":[\"abc\",\"label\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportPrivKeyCmd{\n\t\t\t\tPrivKey: \"abc\",\n\t\t\t\tLabel:   btcjson.String(\"label\"),\n\t\t\t\tRescan:  btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importprivkey optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"importprivkey\", \"abc\", \"label\", false)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewImportPrivKeyCmd(\"abc\", btcjson.String(\"label\"), btcjson.Bool(false))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importprivkey\",\"params\":[\"abc\",\"label\",false],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportPrivKeyCmd{\n\t\t\t\tPrivKey: \"abc\",\n\t\t\t\tLabel:   btcjson.String(\"label\"),\n\t\t\t\tRescan:  btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"keypoolrefill\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"keypoolrefill\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewKeyPoolRefillCmd(nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"keypoolrefill\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.KeyPoolRefillCmd{\n\t\t\t\tNewSize: btcjson.Uint(100),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"keypoolrefill optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"keypoolrefill\", 200)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewKeyPoolRefillCmd(btcjson.Uint(200))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"keypoolrefill\",\"params\":[200],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.KeyPoolRefillCmd{\n\t\t\t\tNewSize: btcjson.Uint(200),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listaccounts\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listaccounts\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListAccountsCmd(nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listaccounts\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListAccountsCmd{\n\t\t\t\tMinConf: btcjson.Int(1),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listaccounts optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listaccounts\", 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListAccountsCmd(btcjson.Int(6))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listaccounts\",\"params\":[6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListAccountsCmd{\n\t\t\t\tMinConf: btcjson.Int(6),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listaddressgroupings\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listaddressgroupings\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListAddressGroupingsCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"listaddressgroupings\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListAddressGroupingsCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"listlockunspent\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listlockunspent\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListLockUnspentCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"listlockunspent\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListLockUnspentCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"listreceivedbyaccount\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listreceivedbyaccount\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListReceivedByAccountCmd(nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listreceivedbyaccount\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListReceivedByAccountCmd{\n\t\t\t\tMinConf:          btcjson.Int(1),\n\t\t\t\tIncludeEmpty:     btcjson.Bool(false),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listreceivedbyaccount optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listreceivedbyaccount\", 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListReceivedByAccountCmd(btcjson.Int(6), nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listreceivedbyaccount\",\"params\":[6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListReceivedByAccountCmd{\n\t\t\t\tMinConf:          btcjson.Int(6),\n\t\t\t\tIncludeEmpty:     btcjson.Bool(false),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listreceivedbyaccount optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listreceivedbyaccount\", 6, true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListReceivedByAccountCmd(btcjson.Int(6), btcjson.Bool(true), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listreceivedbyaccount\",\"params\":[6,true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListReceivedByAccountCmd{\n\t\t\t\tMinConf:          btcjson.Int(6),\n\t\t\t\tIncludeEmpty:     btcjson.Bool(true),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listreceivedbyaccount optional3\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listreceivedbyaccount\", 6, true, false)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListReceivedByAccountCmd(btcjson.Int(6), btcjson.Bool(true), btcjson.Bool(false))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listreceivedbyaccount\",\"params\":[6,true,false],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListReceivedByAccountCmd{\n\t\t\t\tMinConf:          btcjson.Int(6),\n\t\t\t\tIncludeEmpty:     btcjson.Bool(true),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listreceivedbyaddress\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listreceivedbyaddress\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListReceivedByAddressCmd(nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listreceivedbyaddress\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListReceivedByAddressCmd{\n\t\t\t\tMinConf:          btcjson.Int(1),\n\t\t\t\tIncludeEmpty:     btcjson.Bool(false),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listreceivedbyaddress optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listreceivedbyaddress\", 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListReceivedByAddressCmd(btcjson.Int(6), nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listreceivedbyaddress\",\"params\":[6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListReceivedByAddressCmd{\n\t\t\t\tMinConf:          btcjson.Int(6),\n\t\t\t\tIncludeEmpty:     btcjson.Bool(false),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listreceivedbyaddress optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listreceivedbyaddress\", 6, true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListReceivedByAddressCmd(btcjson.Int(6), btcjson.Bool(true), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listreceivedbyaddress\",\"params\":[6,true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListReceivedByAddressCmd{\n\t\t\t\tMinConf:          btcjson.Int(6),\n\t\t\t\tIncludeEmpty:     btcjson.Bool(true),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listreceivedbyaddress optional3\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listreceivedbyaddress\", 6, true, false)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListReceivedByAddressCmd(btcjson.Int(6), btcjson.Bool(true), btcjson.Bool(false))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listreceivedbyaddress\",\"params\":[6,true,false],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListReceivedByAddressCmd{\n\t\t\t\tMinConf:          btcjson.Int(6),\n\t\t\t\tIncludeEmpty:     btcjson.Bool(true),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listsinceblock\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listsinceblock\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListSinceBlockCmd(nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listsinceblock\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListSinceBlockCmd{\n\t\t\t\tBlockHash:           nil,\n\t\t\t\tTargetConfirmations: btcjson.Int(1),\n\t\t\t\tIncludeWatchOnly:    btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listsinceblock optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listsinceblock\", \"123\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListSinceBlockCmd(btcjson.String(\"123\"), nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listsinceblock\",\"params\":[\"123\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListSinceBlockCmd{\n\t\t\t\tBlockHash:           btcjson.String(\"123\"),\n\t\t\t\tTargetConfirmations: btcjson.Int(1),\n\t\t\t\tIncludeWatchOnly:    btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listsinceblock optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listsinceblock\", \"123\", 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListSinceBlockCmd(btcjson.String(\"123\"), btcjson.Int(6), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listsinceblock\",\"params\":[\"123\",6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListSinceBlockCmd{\n\t\t\t\tBlockHash:           btcjson.String(\"123\"),\n\t\t\t\tTargetConfirmations: btcjson.Int(6),\n\t\t\t\tIncludeWatchOnly:    btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listsinceblock optional3\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listsinceblock\", \"123\", 6, true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListSinceBlockCmd(btcjson.String(\"123\"), btcjson.Int(6), btcjson.Bool(true))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listsinceblock\",\"params\":[\"123\",6,true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListSinceBlockCmd{\n\t\t\t\tBlockHash:           btcjson.String(\"123\"),\n\t\t\t\tTargetConfirmations: btcjson.Int(6),\n\t\t\t\tIncludeWatchOnly:    btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listsinceblock pad null\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listsinceblock\", \"null\", 1, false)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListSinceBlockCmd(nil, btcjson.Int(1), btcjson.Bool(false))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listsinceblock\",\"params\":[null,1,false],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListSinceBlockCmd{\n\t\t\t\tBlockHash:           nil,\n\t\t\t\tTargetConfirmations: btcjson.Int(1),\n\t\t\t\tIncludeWatchOnly:    btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listtransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listtransactions\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListTransactionsCmd(nil, nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listtransactions\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListTransactionsCmd{\n\t\t\t\tAccount:          nil,\n\t\t\t\tCount:            btcjson.Int(10),\n\t\t\t\tFrom:             btcjson.Int(0),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listtransactions optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listtransactions\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListTransactionsCmd(btcjson.String(\"acct\"), nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listtransactions\",\"params\":[\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListTransactionsCmd{\n\t\t\t\tAccount:          btcjson.String(\"acct\"),\n\t\t\t\tCount:            btcjson.Int(10),\n\t\t\t\tFrom:             btcjson.Int(0),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listtransactions optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listtransactions\", \"acct\", 20)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListTransactionsCmd(btcjson.String(\"acct\"), btcjson.Int(20), nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listtransactions\",\"params\":[\"acct\",20],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListTransactionsCmd{\n\t\t\t\tAccount:          btcjson.String(\"acct\"),\n\t\t\t\tCount:            btcjson.Int(20),\n\t\t\t\tFrom:             btcjson.Int(0),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listtransactions optional3\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listtransactions\", \"acct\", 20, 1)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListTransactionsCmd(btcjson.String(\"acct\"), btcjson.Int(20),\n\t\t\t\t\tbtcjson.Int(1), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listtransactions\",\"params\":[\"acct\",20,1],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListTransactionsCmd{\n\t\t\t\tAccount:          btcjson.String(\"acct\"),\n\t\t\t\tCount:            btcjson.Int(20),\n\t\t\t\tFrom:             btcjson.Int(1),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listtransactions optional4\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listtransactions\", \"acct\", 20, 1, true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListTransactionsCmd(btcjson.String(\"acct\"), btcjson.Int(20),\n\t\t\t\t\tbtcjson.Int(1), btcjson.Bool(true))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listtransactions\",\"params\":[\"acct\",20,1,true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListTransactionsCmd{\n\t\t\t\tAccount:          btcjson.String(\"acct\"),\n\t\t\t\tCount:            btcjson.Int(20),\n\t\t\t\tFrom:             btcjson.Int(1),\n\t\t\t\tIncludeWatchOnly: btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listunspent\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listunspent\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListUnspentCmd(nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listunspent\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListUnspentCmd{\n\t\t\t\tMinConf:   btcjson.Int(1),\n\t\t\t\tMaxConf:   btcjson.Int(9999999),\n\t\t\t\tAddresses: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listunspent optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listunspent\", 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListUnspentCmd(btcjson.Int(6), nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listunspent\",\"params\":[6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListUnspentCmd{\n\t\t\t\tMinConf:   btcjson.Int(6),\n\t\t\t\tMaxConf:   btcjson.Int(9999999),\n\t\t\t\tAddresses: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listunspent optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listunspent\", 6, 100)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListUnspentCmd(btcjson.Int(6), btcjson.Int(100), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listunspent\",\"params\":[6,100],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListUnspentCmd{\n\t\t\t\tMinConf:   btcjson.Int(6),\n\t\t\t\tMaxConf:   btcjson.Int(100),\n\t\t\t\tAddresses: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listunspent optional3\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listunspent\", 6, 100, []string{\"1Address\", \"1Address2\"})\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListUnspentCmd(btcjson.Int(6), btcjson.Int(100),\n\t\t\t\t\t&[]string{\"1Address\", \"1Address2\"})\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listunspent\",\"params\":[6,100,[\"1Address\",\"1Address2\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListUnspentCmd{\n\t\t\t\tMinConf:   btcjson.Int(6),\n\t\t\t\tMaxConf:   btcjson.Int(100),\n\t\t\t\tAddresses: &[]string{\"1Address\", \"1Address2\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"lockunspent\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"lockunspent\", true, `[{\"txid\":\"123\",\"vout\":1}]`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttxInputs := []btcjson.TransactionInput{\n\t\t\t\t\t{Txid: \"123\", Vout: 1},\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewLockUnspentCmd(true, txInputs)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"lockunspent\",\"params\":[true,[{\"txid\":\"123\",\"vout\":1}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.LockUnspentCmd{\n\t\t\t\tUnlock: true,\n\t\t\t\tTransactions: []btcjson.TransactionInput{\n\t\t\t\t\t{Txid: \"123\", Vout: 1},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"move\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"move\", \"from\", \"to\", 0.5)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewMoveCmd(\"from\", \"to\", 0.5, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"move\",\"params\":[\"from\",\"to\",0.5],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.MoveCmd{\n\t\t\t\tFromAccount: \"from\",\n\t\t\t\tToAccount:   \"to\",\n\t\t\t\tAmount:      0.5,\n\t\t\t\tMinConf:     btcjson.Int(1),\n\t\t\t\tComment:     nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"move optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"move\", \"from\", \"to\", 0.5, 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewMoveCmd(\"from\", \"to\", 0.5, btcjson.Int(6), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"move\",\"params\":[\"from\",\"to\",0.5,6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.MoveCmd{\n\t\t\t\tFromAccount: \"from\",\n\t\t\t\tToAccount:   \"to\",\n\t\t\t\tAmount:      0.5,\n\t\t\t\tMinConf:     btcjson.Int(6),\n\t\t\t\tComment:     nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"move optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"move\", \"from\", \"to\", 0.5, 6, \"comment\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewMoveCmd(\"from\", \"to\", 0.5, btcjson.Int(6), btcjson.String(\"comment\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"move\",\"params\":[\"from\",\"to\",0.5,6,\"comment\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.MoveCmd{\n\t\t\t\tFromAccount: \"from\",\n\t\t\t\tToAccount:   \"to\",\n\t\t\t\tAmount:      0.5,\n\t\t\t\tMinConf:     btcjson.Int(6),\n\t\t\t\tComment:     btcjson.String(\"comment\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendfrom\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendfrom\", \"from\", \"1Address\", 0.5)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSendFromCmd(\"from\", \"1Address\", 0.5, nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendfrom\",\"params\":[\"from\",\"1Address\",0.5],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendFromCmd{\n\t\t\t\tFromAccount: \"from\",\n\t\t\t\tToAddress:   \"1Address\",\n\t\t\t\tAmount:      0.5,\n\t\t\t\tMinConf:     btcjson.Int(1),\n\t\t\t\tComment:     nil,\n\t\t\t\tCommentTo:   nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendfrom optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendfrom\", \"from\", \"1Address\", 0.5, 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSendFromCmd(\"from\", \"1Address\", 0.5, btcjson.Int(6), nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendfrom\",\"params\":[\"from\",\"1Address\",0.5,6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendFromCmd{\n\t\t\t\tFromAccount: \"from\",\n\t\t\t\tToAddress:   \"1Address\",\n\t\t\t\tAmount:      0.5,\n\t\t\t\tMinConf:     btcjson.Int(6),\n\t\t\t\tComment:     nil,\n\t\t\t\tCommentTo:   nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendfrom optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendfrom\", \"from\", \"1Address\", 0.5, 6, \"comment\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSendFromCmd(\"from\", \"1Address\", 0.5, btcjson.Int(6),\n\t\t\t\t\tbtcjson.String(\"comment\"), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendfrom\",\"params\":[\"from\",\"1Address\",0.5,6,\"comment\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendFromCmd{\n\t\t\t\tFromAccount: \"from\",\n\t\t\t\tToAddress:   \"1Address\",\n\t\t\t\tAmount:      0.5,\n\t\t\t\tMinConf:     btcjson.Int(6),\n\t\t\t\tComment:     btcjson.String(\"comment\"),\n\t\t\t\tCommentTo:   nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendfrom optional3\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendfrom\", \"from\", \"1Address\", 0.5, 6, \"comment\", \"commentto\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSendFromCmd(\"from\", \"1Address\", 0.5, btcjson.Int(6),\n\t\t\t\t\tbtcjson.String(\"comment\"), btcjson.String(\"commentto\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendfrom\",\"params\":[\"from\",\"1Address\",0.5,6,\"comment\",\"commentto\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendFromCmd{\n\t\t\t\tFromAccount: \"from\",\n\t\t\t\tToAddress:   \"1Address\",\n\t\t\t\tAmount:      0.5,\n\t\t\t\tMinConf:     btcjson.Int(6),\n\t\t\t\tComment:     btcjson.String(\"comment\"),\n\t\t\t\tCommentTo:   btcjson.String(\"commentto\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendmany\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendmany\", \"from\", `{\"1Address\":0.5}`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tamounts := map[string]float64{\"1Address\": 0.5}\n\t\t\t\treturn btcjson.NewSendManyCmd(\"from\", amounts, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendmany\",\"params\":[\"from\",{\"1Address\":0.5}],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendManyCmd{\n\t\t\t\tFromAccount: \"from\",\n\t\t\t\tAmounts:     map[string]float64{\"1Address\": 0.5},\n\t\t\t\tMinConf:     btcjson.Int(1),\n\t\t\t\tComment:     nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendmany optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendmany\", \"from\", `{\"1Address\":0.5}`, 6)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tamounts := map[string]float64{\"1Address\": 0.5}\n\t\t\t\treturn btcjson.NewSendManyCmd(\"from\", amounts, btcjson.Int(6), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendmany\",\"params\":[\"from\",{\"1Address\":0.5},6],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendManyCmd{\n\t\t\t\tFromAccount: \"from\",\n\t\t\t\tAmounts:     map[string]float64{\"1Address\": 0.5},\n\t\t\t\tMinConf:     btcjson.Int(6),\n\t\t\t\tComment:     nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendmany optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendmany\", \"from\", `{\"1Address\":0.5}`, 6, \"comment\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\tamounts := map[string]float64{\"1Address\": 0.5}\n\t\t\t\treturn btcjson.NewSendManyCmd(\"from\", amounts, btcjson.Int(6), btcjson.String(\"comment\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendmany\",\"params\":[\"from\",{\"1Address\":0.5},6,\"comment\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendManyCmd{\n\t\t\t\tFromAccount: \"from\",\n\t\t\t\tAmounts:     map[string]float64{\"1Address\": 0.5},\n\t\t\t\tMinConf:     btcjson.Int(6),\n\t\t\t\tComment:     btcjson.String(\"comment\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendtoaddress\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendtoaddress\", \"1Address\", 0.5)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSendToAddressCmd(\"1Address\", 0.5, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendtoaddress\",\"params\":[\"1Address\",0.5],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendToAddressCmd{\n\t\t\t\tAddress:   \"1Address\",\n\t\t\t\tAmount:    0.5,\n\t\t\t\tComment:   nil,\n\t\t\t\tCommentTo: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"sendtoaddress optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"sendtoaddress\", \"1Address\", 0.5, \"comment\", \"commentto\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSendToAddressCmd(\"1Address\", 0.5, btcjson.String(\"comment\"),\n\t\t\t\t\tbtcjson.String(\"commentto\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"sendtoaddress\",\"params\":[\"1Address\",0.5,\"comment\",\"commentto\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SendToAddressCmd{\n\t\t\t\tAddress:   \"1Address\",\n\t\t\t\tAmount:    0.5,\n\t\t\t\tComment:   btcjson.String(\"comment\"),\n\t\t\t\tCommentTo: btcjson.String(\"commentto\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"setaccount\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"setaccount\", \"1Address\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSetAccountCmd(\"1Address\", \"acct\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"setaccount\",\"params\":[\"1Address\",\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SetAccountCmd{\n\t\t\t\tAddress: \"1Address\",\n\t\t\t\tAccount: \"acct\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"settxfee\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"settxfee\", 0.0001)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSetTxFeeCmd(0.0001)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"settxfee\",\"params\":[0.0001],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SetTxFeeCmd{\n\t\t\t\tAmount: 0.0001,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"signmessage\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"signmessage\", \"1Address\", \"message\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSignMessageCmd(\"1Address\", \"message\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"signmessage\",\"params\":[\"1Address\",\"message\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SignMessageCmd{\n\t\t\t\tAddress: \"1Address\",\n\t\t\t\tMessage: \"message\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"signrawtransaction\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"signrawtransaction\", \"001122\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSignRawTransactionCmd(\"001122\", nil, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"signrawtransaction\",\"params\":[\"001122\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SignRawTransactionCmd{\n\t\t\t\tRawTx:    \"001122\",\n\t\t\t\tInputs:   nil,\n\t\t\t\tPrivKeys: nil,\n\t\t\t\tFlags:    btcjson.String(\"ALL\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"signrawtransaction optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"signrawtransaction\", \"001122\", `[{\"txid\":\"123\",\"vout\":1,\"scriptPubKey\":\"00\",\"redeemScript\":\"01\"}]`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttxInputs := []btcjson.RawTxInput{\n\t\t\t\t\t{\n\t\t\t\t\t\tTxid:         \"123\",\n\t\t\t\t\t\tVout:         1,\n\t\t\t\t\t\tScriptPubKey: \"00\",\n\t\t\t\t\t\tRedeemScript: \"01\",\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\treturn btcjson.NewSignRawTransactionCmd(\"001122\", &txInputs, nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"signrawtransaction\",\"params\":[\"001122\",[{\"txid\":\"123\",\"vout\":1,\"scriptPubKey\":\"00\",\"redeemScript\":\"01\"}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SignRawTransactionCmd{\n\t\t\t\tRawTx: \"001122\",\n\t\t\t\tInputs: &[]btcjson.RawTxInput{\n\t\t\t\t\t{\n\t\t\t\t\t\tTxid:         \"123\",\n\t\t\t\t\t\tVout:         1,\n\t\t\t\t\t\tScriptPubKey: \"00\",\n\t\t\t\t\t\tRedeemScript: \"01\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tPrivKeys: nil,\n\t\t\t\tFlags:    btcjson.String(\"ALL\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"signrawtransaction optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"signrawtransaction\", \"001122\", `[]`, `[\"abc\"]`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttxInputs := []btcjson.RawTxInput{}\n\t\t\t\tprivKeys := []string{\"abc\"}\n\t\t\t\treturn btcjson.NewSignRawTransactionCmd(\"001122\", &txInputs, &privKeys, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"signrawtransaction\",\"params\":[\"001122\",[],[\"abc\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SignRawTransactionCmd{\n\t\t\t\tRawTx:    \"001122\",\n\t\t\t\tInputs:   &[]btcjson.RawTxInput{},\n\t\t\t\tPrivKeys: &[]string{\"abc\"},\n\t\t\t\tFlags:    btcjson.String(\"ALL\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"signrawtransaction optional3\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"signrawtransaction\", \"001122\", `[]`, `[]`, \"ALL\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttxInputs := []btcjson.RawTxInput{}\n\t\t\t\tprivKeys := []string{}\n\t\t\t\treturn btcjson.NewSignRawTransactionCmd(\"001122\", &txInputs, &privKeys,\n\t\t\t\t\tbtcjson.String(\"ALL\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"signrawtransaction\",\"params\":[\"001122\",[],[],\"ALL\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SignRawTransactionCmd{\n\t\t\t\tRawTx:    \"001122\",\n\t\t\t\tInputs:   &[]btcjson.RawTxInput{},\n\t\t\t\tPrivKeys: &[]string{},\n\t\t\t\tFlags:    btcjson.String(\"ALL\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"signrawtransactionwithwallet\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"signrawtransactionwithwallet\", \"001122\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewSignRawTransactionWithWalletCmd(\"001122\", nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"signrawtransactionwithwallet\",\"params\":[\"001122\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SignRawTransactionWithWalletCmd{\n\t\t\t\tRawTx:       \"001122\",\n\t\t\t\tInputs:      nil,\n\t\t\t\tSigHashType: btcjson.String(\"ALL\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"signrawtransactionwithwallet optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"signrawtransactionwithwallet\", \"001122\", `[{\"txid\":\"123\",\"vout\":1,\"scriptPubKey\":\"00\",\"redeemScript\":\"01\",\"witnessScript\":\"02\",\"amount\":1.5}]`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttxInputs := []btcjson.RawTxWitnessInput{\n\t\t\t\t\t{\n\t\t\t\t\t\tTxid:          \"123\",\n\t\t\t\t\t\tVout:          1,\n\t\t\t\t\t\tScriptPubKey:  \"00\",\n\t\t\t\t\t\tRedeemScript:  btcjson.String(\"01\"),\n\t\t\t\t\t\tWitnessScript: btcjson.String(\"02\"),\n\t\t\t\t\t\tAmount:        btcjson.Float64(1.5),\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\treturn btcjson.NewSignRawTransactionWithWalletCmd(\"001122\", &txInputs, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"signrawtransactionwithwallet\",\"params\":[\"001122\",[{\"txid\":\"123\",\"vout\":1,\"scriptPubKey\":\"00\",\"redeemScript\":\"01\",\"witnessScript\":\"02\",\"amount\":1.5}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SignRawTransactionWithWalletCmd{\n\t\t\t\tRawTx: \"001122\",\n\t\t\t\tInputs: &[]btcjson.RawTxWitnessInput{\n\t\t\t\t\t{\n\t\t\t\t\t\tTxid:          \"123\",\n\t\t\t\t\t\tVout:          1,\n\t\t\t\t\t\tScriptPubKey:  \"00\",\n\t\t\t\t\t\tRedeemScript:  btcjson.String(\"01\"),\n\t\t\t\t\t\tWitnessScript: btcjson.String(\"02\"),\n\t\t\t\t\t\tAmount:        btcjson.Float64(1.5),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSigHashType: btcjson.String(\"ALL\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"signrawtransactionwithwallet optional1 with blank fields in input\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"signrawtransactionwithwallet\", \"001122\", `[{\"txid\":\"123\",\"vout\":1,\"scriptPubKey\":\"00\",\"redeemScript\":\"01\"}]`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttxInputs := []btcjson.RawTxWitnessInput{\n\t\t\t\t\t{\n\t\t\t\t\t\tTxid:         \"123\",\n\t\t\t\t\t\tVout:         1,\n\t\t\t\t\t\tScriptPubKey: \"00\",\n\t\t\t\t\t\tRedeemScript: btcjson.String(\"01\"),\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\treturn btcjson.NewSignRawTransactionWithWalletCmd(\"001122\", &txInputs, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"signrawtransactionwithwallet\",\"params\":[\"001122\",[{\"txid\":\"123\",\"vout\":1,\"scriptPubKey\":\"00\",\"redeemScript\":\"01\"}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SignRawTransactionWithWalletCmd{\n\t\t\t\tRawTx: \"001122\",\n\t\t\t\tInputs: &[]btcjson.RawTxWitnessInput{\n\t\t\t\t\t{\n\t\t\t\t\t\tTxid:         \"123\",\n\t\t\t\t\t\tVout:         1,\n\t\t\t\t\t\tScriptPubKey: \"00\",\n\t\t\t\t\t\tRedeemScript: btcjson.String(\"01\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tSigHashType: btcjson.String(\"ALL\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"signrawtransactionwithwallet optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"signrawtransactionwithwallet\", \"001122\", `[]`, \"ALL\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\ttxInputs := []btcjson.RawTxWitnessInput{}\n\t\t\t\treturn btcjson.NewSignRawTransactionWithWalletCmd(\"001122\", &txInputs, btcjson.String(\"ALL\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"signrawtransactionwithwallet\",\"params\":[\"001122\",[],\"ALL\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.SignRawTransactionWithWalletCmd{\n\t\t\t\tRawTx:       \"001122\",\n\t\t\t\tInputs:      &[]btcjson.RawTxWitnessInput{},\n\t\t\t\tSigHashType: btcjson.String(\"ALL\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"walletlock\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"walletlock\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewWalletLockCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"walletlock\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.WalletLockCmd{},\n\t\t},\n\t\t{\n\t\t\tname: \"walletpassphrase\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"walletpassphrase\", \"pass\", 60)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewWalletPassphraseCmd(\"pass\", 60)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"walletpassphrase\",\"params\":[\"pass\",60],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.WalletPassphraseCmd{\n\t\t\t\tPassphrase: \"pass\",\n\t\t\t\tTimeout:    60,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"walletpassphrasechange\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"walletpassphrasechange\", \"old\", \"new\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewWalletPassphraseChangeCmd(\"old\", \"new\")\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"walletpassphrasechange\",\"params\":[\"old\",\"new\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.WalletPassphraseChangeCmd{\n\t\t\t\tOldPassphrase: \"old\",\n\t\t\t\tNewPassphrase: \"new\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importmulti with descriptor + options\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"importmulti\",\n\t\t\t\t\t// Cannot use a native string, due to special types like timestamp.\n\t\t\t\t\t[]btcjson.ImportMultiRequest{\n\t\t\t\t\t\t{Descriptor: btcjson.String(\"123\"), Timestamp: btcjson.TimestampOrNow{Value: 0}},\n\t\t\t\t\t},\n\t\t\t\t\t`{\"rescan\": true}`,\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\trequests := []btcjson.ImportMultiRequest{\n\t\t\t\t\t{Descriptor: btcjson.String(\"123\"), Timestamp: btcjson.TimestampOrNow{Value: 0}},\n\t\t\t\t}\n\t\t\t\toptions := btcjson.ImportMultiOptions{Rescan: true}\n\t\t\t\treturn btcjson.NewImportMultiCmd(requests, &options)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importmulti\",\"params\":[[{\"desc\":\"123\",\"timestamp\":0}],{\"rescan\":true}],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportMultiCmd{\n\t\t\t\tRequests: []btcjson.ImportMultiRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tDescriptor: btcjson.String(\"123\"),\n\t\t\t\t\t\tTimestamp:  btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tOptions: &btcjson.ImportMultiOptions{Rescan: true},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importmulti with descriptor + no options\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"importmulti\",\n\t\t\t\t\t// Cannot use a native string, due to special types like timestamp.\n\t\t\t\t\t[]btcjson.ImportMultiRequest{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDescriptor: btcjson.String(\"123\"),\n\t\t\t\t\t\t\tTimestamp:  btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\t\tWatchOnly:  btcjson.Bool(false),\n\t\t\t\t\t\t\tInternal:   btcjson.Bool(true),\n\t\t\t\t\t\t\tLabel:      btcjson.String(\"aaa\"),\n\t\t\t\t\t\t\tKeyPool:    btcjson.Bool(false),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\trequests := []btcjson.ImportMultiRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tDescriptor: btcjson.String(\"123\"),\n\t\t\t\t\t\tTimestamp:  btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\tWatchOnly:  btcjson.Bool(false),\n\t\t\t\t\t\tInternal:   btcjson.Bool(true),\n\t\t\t\t\t\tLabel:      btcjson.String(\"aaa\"),\n\t\t\t\t\t\tKeyPool:    btcjson.Bool(false),\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewImportMultiCmd(requests, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importmulti\",\"params\":[[{\"desc\":\"123\",\"timestamp\":0,\"internal\":true,\"watchonly\":false,\"label\":\"aaa\",\"keypool\":false}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportMultiCmd{\n\t\t\t\tRequests: []btcjson.ImportMultiRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tDescriptor: btcjson.String(\"123\"),\n\t\t\t\t\t\tTimestamp:  btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\tWatchOnly:  btcjson.Bool(false),\n\t\t\t\t\t\tInternal:   btcjson.Bool(true),\n\t\t\t\t\t\tLabel:      btcjson.String(\"aaa\"),\n\t\t\t\t\t\tKeyPool:    btcjson.Bool(false),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importmulti with descriptor + string timestamp\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"importmulti\",\n\t\t\t\t\t// Cannot use a native string, due to special types like timestamp.\n\t\t\t\t\t[]btcjson.ImportMultiRequest{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDescriptor: btcjson.String(\"123\"),\n\t\t\t\t\t\t\tTimestamp:  btcjson.TimestampOrNow{Value: \"now\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\trequests := []btcjson.ImportMultiRequest{\n\t\t\t\t\t{Descriptor: btcjson.String(\"123\"), Timestamp: btcjson.TimestampOrNow{Value: \"now\"}},\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewImportMultiCmd(requests, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importmulti\",\"params\":[[{\"desc\":\"123\",\"timestamp\":\"now\"}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportMultiCmd{\n\t\t\t\tRequests: []btcjson.ImportMultiRequest{\n\t\t\t\t\t{Descriptor: btcjson.String(\"123\"), Timestamp: btcjson.TimestampOrNow{Value: \"now\"}},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importmulti with scriptPubKey script\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"importmulti\",\n\t\t\t\t\t// Cannot use a native string, due to special types like timestamp and scriptPubKey\n\t\t\t\t\t[]btcjson.ImportMultiRequest{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tScriptPubKey: &btcjson.ScriptPubKey{Value: \"script\"},\n\t\t\t\t\t\t\tRedeemScript: btcjson.String(\"123\"),\n\t\t\t\t\t\t\tTimestamp:    btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\t\tPubKeys:      &[]string{\"aaa\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\trequests := []btcjson.ImportMultiRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tScriptPubKey: &btcjson.ScriptPubKey{Value: \"script\"},\n\t\t\t\t\t\tRedeemScript: btcjson.String(\"123\"),\n\t\t\t\t\t\tTimestamp:    btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\tPubKeys:      &[]string{\"aaa\"},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewImportMultiCmd(requests, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importmulti\",\"params\":[[{\"scriptPubKey\":\"script\",\"timestamp\":0,\"redeemscript\":\"123\",\"pubkeys\":[\"aaa\"]}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportMultiCmd{\n\t\t\t\tRequests: []btcjson.ImportMultiRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tScriptPubKey: &btcjson.ScriptPubKey{Value: \"script\"},\n\t\t\t\t\t\tRedeemScript: btcjson.String(\"123\"),\n\t\t\t\t\t\tTimestamp:    btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\tPubKeys:      &[]string{\"aaa\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importmulti with scriptPubKey address\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"importmulti\",\n\t\t\t\t\t// Cannot use a native string, due to special types like timestamp and scriptPubKey\n\t\t\t\t\t[]btcjson.ImportMultiRequest{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tScriptPubKey:  &btcjson.ScriptPubKey{Value: btcjson.ScriptPubKeyAddress{Address: \"addr\"}},\n\t\t\t\t\t\t\tWitnessScript: btcjson.String(\"123\"),\n\t\t\t\t\t\t\tTimestamp:     btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\t\tKeys:          &[]string{\"aaa\"},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\trequests := []btcjson.ImportMultiRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tScriptPubKey:  &btcjson.ScriptPubKey{Value: btcjson.ScriptPubKeyAddress{Address: \"addr\"}},\n\t\t\t\t\t\tWitnessScript: btcjson.String(\"123\"),\n\t\t\t\t\t\tTimestamp:     btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\tKeys:          &[]string{\"aaa\"},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewImportMultiCmd(requests, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importmulti\",\"params\":[[{\"scriptPubKey\":{\"address\":\"addr\"},\"timestamp\":0,\"witnessscript\":\"123\",\"keys\":[\"aaa\"]}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportMultiCmd{\n\t\t\t\tRequests: []btcjson.ImportMultiRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tScriptPubKey:  &btcjson.ScriptPubKey{Value: btcjson.ScriptPubKeyAddress{Address: \"addr\"}},\n\t\t\t\t\t\tWitnessScript: btcjson.String(\"123\"),\n\t\t\t\t\t\tTimestamp:     btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\tKeys:          &[]string{\"aaa\"},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importmulti with ranged (int) descriptor\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"importmulti\",\n\t\t\t\t\t// Cannot use a native string, due to special types like timestamp.\n\t\t\t\t\t[]btcjson.ImportMultiRequest{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDescriptor: btcjson.String(\"123\"),\n\t\t\t\t\t\t\tTimestamp:  btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\t\tRange:      &btcjson.DescriptorRange{Value: 7},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\trequests := []btcjson.ImportMultiRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tDescriptor: btcjson.String(\"123\"),\n\t\t\t\t\t\tTimestamp:  btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\tRange:      &btcjson.DescriptorRange{Value: 7},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewImportMultiCmd(requests, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importmulti\",\"params\":[[{\"desc\":\"123\",\"timestamp\":0,\"range\":7}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportMultiCmd{\n\t\t\t\tRequests: []btcjson.ImportMultiRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tDescriptor: btcjson.String(\"123\"),\n\t\t\t\t\t\tTimestamp:  btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\tRange:      &btcjson.DescriptorRange{Value: 7},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"importmulti with ranged (slice) descriptor\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"importmulti\",\n\t\t\t\t\t// Cannot use a native string, due to special types like timestamp.\n\t\t\t\t\t[]btcjson.ImportMultiRequest{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDescriptor: btcjson.String(\"123\"),\n\t\t\t\t\t\t\tTimestamp:  btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\t\tRange:      &btcjson.DescriptorRange{Value: []int{1, 7}},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\trequests := []btcjson.ImportMultiRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tDescriptor: btcjson.String(\"123\"),\n\t\t\t\t\t\tTimestamp:  btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\tRange:      &btcjson.DescriptorRange{Value: []int{1, 7}},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewImportMultiCmd(requests, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"importmulti\",\"params\":[[{\"desc\":\"123\",\"timestamp\":0,\"range\":[1,7]}]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ImportMultiCmd{\n\t\t\t\tRequests: []btcjson.ImportMultiRequest{\n\t\t\t\t\t{\n\t\t\t\t\t\tDescriptor: btcjson.String(\"123\"),\n\t\t\t\t\t\tTimestamp:  btcjson.TimestampOrNow{Value: 0},\n\t\t\t\t\t\tRange:      &btcjson.DescriptorRange{Value: []int{1, 7}},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"walletcreatefundedpsbt\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"walletcreatefundedpsbt\",\n\t\t\t\t\t[]btcjson.PsbtInput{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tTxid:     \"1234\",\n\t\t\t\t\t\t\tVout:     0,\n\t\t\t\t\t\t\tSequence: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[]btcjson.PsbtOutput{\n\t\t\t\t\t\tbtcjson.NewPsbtOutput(\"1234\", btcutil.Amount(1234)),\n\t\t\t\t\t\tbtcjson.NewPsbtDataOutput([]byte{1, 2, 3, 4}),\n\t\t\t\t\t},\n\t\t\t\t\tbtcjson.Uint32(1),\n\t\t\t\t\tbtcjson.WalletCreateFundedPsbtOpts{},\n\t\t\t\t\tbtcjson.Bool(true),\n\t\t\t\t)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewWalletCreateFundedPsbtCmd(\n\t\t\t\t\t[]btcjson.PsbtInput{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tTxid:     \"1234\",\n\t\t\t\t\t\t\tVout:     0,\n\t\t\t\t\t\t\tSequence: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[]btcjson.PsbtOutput{\n\t\t\t\t\t\tbtcjson.NewPsbtOutput(\"1234\", btcutil.Amount(1234)),\n\t\t\t\t\t\tbtcjson.NewPsbtDataOutput([]byte{1, 2, 3, 4}),\n\t\t\t\t\t},\n\t\t\t\t\tbtcjson.Uint32(1),\n\t\t\t\t\t&btcjson.WalletCreateFundedPsbtOpts{},\n\t\t\t\t\tbtcjson.Bool(true),\n\t\t\t\t)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"walletcreatefundedpsbt\",\"params\":[[{\"txid\":\"1234\",\"vout\":0,\"sequence\":0}],[{\"1234\":0.00001234},{\"data\":\"01020304\"}],1,{},true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.WalletCreateFundedPsbtCmd{\n\t\t\t\tInputs: []btcjson.PsbtInput{\n\t\t\t\t\t{\n\t\t\t\t\t\tTxid:     \"1234\",\n\t\t\t\t\t\tVout:     0,\n\t\t\t\t\t\tSequence: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tOutputs: []btcjson.PsbtOutput{\n\t\t\t\t\tbtcjson.NewPsbtOutput(\"1234\", btcutil.Amount(1234)),\n\t\t\t\t\tbtcjson.NewPsbtDataOutput([]byte{1, 2, 3, 4}),\n\t\t\t\t},\n\t\t\t\tLocktime:    btcjson.Uint32(1),\n\t\t\t\tOptions:     &btcjson.WalletCreateFundedPsbtOpts{},\n\t\t\t\tBip32Derivs: btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"walletprocesspsbt\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\n\t\t\t\t\t\"walletprocesspsbt\", \"1234\", btcjson.Bool(true), btcjson.String(\"ALL\"), btcjson.Bool(true))\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewWalletProcessPsbtCmd(\n\t\t\t\t\t\"1234\", btcjson.Bool(true), btcjson.String(\"ALL\"), btcjson.Bool(true))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"walletprocesspsbt\",\"params\":[\"1234\",true,\"ALL\",true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.WalletProcessPsbtCmd{\n\t\t\t\tPsbt:        \"1234\",\n\t\t\t\tSign:        btcjson.Bool(true),\n\t\t\t\tSighashType: btcjson.String(\"ALL\"),\n\t\t\t\tBip32Derivs: btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Marshal the command as created by the new static command\n\t\t// creation function.\n\t\tmarshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd())\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the command is created without error via the generic\n\t\t// new command creation function.\n\t\tcmd, err := test.newCmd()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected NewCmd error: %v \",\n\t\t\t\ti, test.name, err)\n\t\t}\n\n\t\t// Marshal the command as created by the generic new command\n\t\t// creation function.\n\t\tmarshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar request btcjson.Request\n\t\tif err := json.Unmarshal(marshalled, &request); err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error while \"+\n\t\t\t\t\"unmarshalling JSON-RPC request: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tcmd, err = btcjson.UnmarshalCmd(&request)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"UnmarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(cmd, test.unmarshalled) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected unmarshalled command \"+\n\t\t\t\t\"- got %s, want %s\", i, test.name,\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\", cmd),\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\\n\", test.unmarshalled))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/walletsvrresults.go",
    "content": "// Copyright (c) 2014-2020 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/txscript\"\n)\n\n// CreateWalletResult models the result of the createwallet command.\ntype CreateWalletResult struct {\n\tName    string `json:\"name\"`\n\tWarning string `json:\"warning\"`\n}\n\n// embeddedAddressInfo includes all getaddressinfo output fields, excluding\n// metadata and relation to the wallet.\n//\n// It represents the non-metadata/non-wallet fields for GetAddressInfo, as well\n// as the precise fields for an embedded P2SH or P2WSH address.\ntype embeddedAddressInfo struct {\n\tAddress             string                `json:\"address\"`\n\tScriptPubKey        string                `json:\"scriptPubKey\"`\n\tSolvable            bool                  `json:\"solvable\"`\n\tDescriptor          *string               `json:\"desc,omitempty\"`\n\tIsScript            bool                  `json:\"isscript\"`\n\tIsChange            bool                  `json:\"ischange\"`\n\tIsWitness           bool                  `json:\"iswitness\"`\n\tWitnessVersion      int                   `json:\"witness_version,omitempty\"`\n\tWitnessProgram      *string               `json:\"witness_program,omitempty\"`\n\tScriptType          *txscript.ScriptClass `json:\"script,omitempty\"`\n\tHex                 *string               `json:\"hex,omitempty\"`\n\tPubKeys             *[]string             `json:\"pubkeys,omitempty\"`\n\tSignaturesRequired  *int                  `json:\"sigsrequired,omitempty\"`\n\tPubKey              *string               `json:\"pubkey,omitempty\"`\n\tIsCompressed        *bool                 `json:\"iscompressed,omitempty\"`\n\tHDMasterFingerprint *string               `json:\"hdmasterfingerprint,omitempty\"`\n\tLabels              []string              `json:\"labels\"`\n}\n\n// GetAddressInfoResult models the result of the getaddressinfo command. It\n// contains information about a bitcoin address.\n//\n// Reference: https://bitcoincore.org/en/doc/0.20.0/rpc/wallet/getaddressinfo\n//\n// The GetAddressInfoResult has three segments:\n//  1. General information about the address.\n//  2. Metadata (Timestamp, HDKeyPath, HDSeedID) and wallet fields\n//     (IsMine, IsWatchOnly).\n//  3. Information about the embedded address in case of P2SH or P2WSH.\n//     Same structure as (1).\ntype GetAddressInfoResult struct {\n\tembeddedAddressInfo\n\tIsMine      bool                 `json:\"ismine\"`\n\tIsWatchOnly bool                 `json:\"iswatchonly\"`\n\tTimestamp   *int                 `json:\"timestamp,omitempty\"`\n\tHDKeyPath   *string              `json:\"hdkeypath,omitempty\"`\n\tHDSeedID    *string              `json:\"hdseedid,omitempty\"`\n\tEmbedded    *embeddedAddressInfo `json:\"embedded,omitempty\"`\n}\n\n// UnmarshalJSON provides a custom unmarshaller for GetAddressInfoResult.\n// It is adapted to avoid creating a duplicate raw struct for unmarshalling\n// the JSON bytes into.\n//\n// Reference: http://choly.ca/post/go-json-marshalling\nfunc (e *GetAddressInfoResult) UnmarshalJSON(data []byte) error {\n\t// Step 1: Create type aliases of the original struct, including the\n\t// embedded one.\n\ttype Alias GetAddressInfoResult\n\ttype EmbeddedAlias embeddedAddressInfo\n\n\t// Step 2: Create an anonymous struct with raw replacements for the special\n\t// fields.\n\taux := &struct {\n\t\tScriptType *string `json:\"script,omitempty\"`\n\t\tEmbedded   *struct {\n\t\t\tScriptType *string `json:\"script,omitempty\"`\n\t\t\t*EmbeddedAlias\n\t\t} `json:\"embedded,omitempty\"`\n\t\t*Alias\n\t}{\n\t\tAlias: (*Alias)(e),\n\t}\n\n\t// Step 3: Unmarshal the data into the anonymous struct.\n\tif err := json.Unmarshal(data, &aux); err != nil {\n\t\treturn err\n\t}\n\n\t// Step 4: Convert the raw fields to the desired types\n\tvar (\n\t\tsc  *txscript.ScriptClass\n\t\terr error\n\t)\n\n\tif aux.ScriptType != nil {\n\t\tsc, err = txscript.NewScriptClass(*aux.ScriptType)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\te.ScriptType = sc\n\n\tif aux.Embedded != nil {\n\t\tvar (\n\t\t\tembeddedSc *txscript.ScriptClass\n\t\t\terr        error\n\t\t)\n\n\t\tif aux.Embedded.ScriptType != nil {\n\t\t\tembeddedSc, err = txscript.NewScriptClass(*aux.Embedded.ScriptType)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\te.Embedded = (*embeddedAddressInfo)(aux.Embedded.EmbeddedAlias)\n\t\te.Embedded.ScriptType = embeddedSc\n\t}\n\n\treturn nil\n}\n\n// GetTransactionDetailsResult models the details data from the gettransaction command.\n//\n// This models the \"short\" version of the ListTransactionsResult type, which\n// excludes fields common to the transaction.  These common fields are instead\n// part of the GetTransactionResult.\ntype GetTransactionDetailsResult struct {\n\tAccount           string   `json:\"account\"`\n\tAddress           string   `json:\"address,omitempty\"`\n\tAmount            float64  `json:\"amount\"`\n\tCategory          string   `json:\"category\"`\n\tInvolvesWatchOnly bool     `json:\"involveswatchonly,omitempty\"`\n\tFee               *float64 `json:\"fee,omitempty\"`\n\tVout              uint32   `json:\"vout\"`\n}\n\n// GetTransactionResult models the data from the gettransaction command.\ntype GetTransactionResult struct {\n\tAmount          float64                       `json:\"amount\"`\n\tFee             float64                       `json:\"fee,omitempty\"`\n\tConfirmations   int64                         `json:\"confirmations\"`\n\tBlockHash       string                        `json:\"blockhash\"`\n\tBlockIndex      int64                         `json:\"blockindex\"`\n\tBlockTime       int64                         `json:\"blocktime\"`\n\tTxID            string                        `json:\"txid\"`\n\tWalletConflicts []string                      `json:\"walletconflicts\"`\n\tTime            int64                         `json:\"time\"`\n\tTimeReceived    int64                         `json:\"timereceived\"`\n\tDetails         []GetTransactionDetailsResult `json:\"details\"`\n\tHex             string                        `json:\"hex\"`\n}\n\ntype ScanningOrFalse struct {\n\tValue interface{}\n}\n\ntype ScanProgress struct {\n\tDuration int     `json:\"duration\"`\n\tProgress float64 `json:\"progress\"`\n}\n\n// MarshalJSON implements the json.Marshaler interface\nfunc (h ScanningOrFalse) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(h.Value)\n}\n\n// UnmarshalJSON implements the json.Unmarshaler interface\nfunc (h *ScanningOrFalse) UnmarshalJSON(data []byte) error {\n\tvar unmarshalled interface{}\n\tif err := json.Unmarshal(data, &unmarshalled); err != nil {\n\t\treturn err\n\t}\n\n\tswitch v := unmarshalled.(type) {\n\tcase bool:\n\t\th.Value = v\n\tcase map[string]interface{}:\n\t\th.Value = ScanProgress{\n\t\t\tDuration: int(v[\"duration\"].(float64)),\n\t\t\tProgress: v[\"progress\"].(float64),\n\t\t}\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid scanning value: %v\", unmarshalled)\n\t}\n\n\treturn nil\n}\n\n// GetWalletInfoResult models the result of the getwalletinfo command.\ntype GetWalletInfoResult struct {\n\tWalletName            string          `json:\"walletname\"`\n\tWalletVersion         int             `json:\"walletversion\"`\n\tTransactionCount      int             `json:\"txcount\"`\n\tKeyPoolOldest         int             `json:\"keypoololdest\"`\n\tKeyPoolSize           int             `json:\"keypoolsize\"`\n\tKeyPoolSizeHDInternal *int            `json:\"keypoolsize_hd_internal,omitempty\"`\n\tUnlockedUntil         *int            `json:\"unlocked_until,omitempty\"`\n\tPayTransactionFee     float64         `json:\"paytxfee\"`\n\tHDSeedID              *string         `json:\"hdseedid,omitempty\"`\n\tPrivateKeysEnabled    bool            `json:\"private_keys_enabled\"`\n\tAvoidReuse            bool            `json:\"avoid_reuse\"`\n\tScanning              ScanningOrFalse `json:\"scanning\"`\n}\n\n// InfoWalletResult models the data returned by the wallet server getinfo\n// command.\ntype InfoWalletResult struct {\n\tVersion         int32   `json:\"version\"`\n\tProtocolVersion int32   `json:\"protocolversion\"`\n\tWalletVersion   int32   `json:\"walletversion\"`\n\tBalance         float64 `json:\"balance\"`\n\tBlocks          int32   `json:\"blocks\"`\n\tTimeOffset      int64   `json:\"timeoffset\"`\n\tConnections     int32   `json:\"connections\"`\n\tProxy           string  `json:\"proxy\"`\n\tDifficulty      float64 `json:\"difficulty\"`\n\tTestNet         bool    `json:\"testnet\"`\n\tKeypoolOldest   int64   `json:\"keypoololdest\"`\n\tKeypoolSize     int32   `json:\"keypoolsize\"`\n\tUnlockedUntil   int64   `json:\"unlocked_until\"`\n\tPaytxFee        float64 `json:\"paytxfee\"`\n\tRelayFee        float64 `json:\"relayfee\"`\n\tErrors          string  `json:\"errors\"`\n}\n\n// ListTransactionsResult models the data from the listtransactions command.\ntype ListTransactionsResult struct {\n\tAbandoned         bool     `json:\"abandoned\"`\n\tAccount           string   `json:\"account\"`\n\tAddress           string   `json:\"address,omitempty\"`\n\tAmount            float64  `json:\"amount\"`\n\tBIP125Replaceable string   `json:\"bip125-replaceable,omitempty\"`\n\tBlockHash         string   `json:\"blockhash,omitempty\"`\n\tBlockHeight       *int32   `json:\"blockheight,omitempty\"`\n\tBlockIndex        *int64   `json:\"blockindex,omitempty\"`\n\tBlockTime         int64    `json:\"blocktime,omitempty\"`\n\tCategory          string   `json:\"category\"`\n\tConfirmations     int64    `json:\"confirmations\"`\n\tFee               *float64 `json:\"fee,omitempty\"`\n\tGenerated         bool     `json:\"generated,omitempty\"`\n\tInvolvesWatchOnly bool     `json:\"involveswatchonly,omitempty\"`\n\tLabel             *string  `json:\"label,omitempty\"`\n\tTime              int64    `json:\"time\"`\n\tTimeReceived      int64    `json:\"timereceived\"`\n\tTrusted           bool     `json:\"trusted\"`\n\tTxID              string   `json:\"txid\"`\n\tVout              uint32   `json:\"vout\"`\n\tWalletConflicts   []string `json:\"walletconflicts\"`\n\tComment           string   `json:\"comment,omitempty\"`\n\tOtherAccount      string   `json:\"otheraccount,omitempty\"`\n}\n\n// ListReceivedByAccountResult models the data from the listreceivedbyaccount\n// command.\ntype ListReceivedByAccountResult struct {\n\tAccount       string  `json:\"account\"`\n\tAmount        float64 `json:\"amount\"`\n\tConfirmations uint64  `json:\"confirmations\"`\n}\n\n// ListReceivedByAddressResult models the data from the listreceivedbyaddress\n// command.\ntype ListReceivedByAddressResult struct {\n\tAccount           string   `json:\"account\"`\n\tAddress           string   `json:\"address\"`\n\tAmount            float64  `json:\"amount\"`\n\tConfirmations     uint64   `json:\"confirmations\"`\n\tTxIDs             []string `json:\"txids,omitempty\"`\n\tInvolvesWatchonly bool     `json:\"involvesWatchonly,omitempty\"`\n}\n\n// ListSinceBlockResult models the data from the listsinceblock command.\ntype ListSinceBlockResult struct {\n\tTransactions []ListTransactionsResult `json:\"transactions\"`\n\tLastBlock    string                   `json:\"lastblock\"`\n}\n\n// ListUnspentResult models a successful response from the listunspent request.\ntype ListUnspentResult struct {\n\tTxID          string  `json:\"txid\"`\n\tVout          uint32  `json:\"vout\"`\n\tAddress       string  `json:\"address\"`\n\tAccount       string  `json:\"account\"`\n\tScriptPubKey  string  `json:\"scriptPubKey\"`\n\tRedeemScript  string  `json:\"redeemScript,omitempty\"`\n\tAmount        float64 `json:\"amount\"`\n\tConfirmations int64   `json:\"confirmations\"`\n\tSpendable     bool    `json:\"spendable\"`\n}\n\n// SignRawTransactionError models the data that contains script verification\n// errors from the signrawtransaction request.\ntype SignRawTransactionError struct {\n\tTxID      string `json:\"txid\"`\n\tVout      uint32 `json:\"vout\"`\n\tScriptSig string `json:\"scriptSig\"`\n\tSequence  uint32 `json:\"sequence\"`\n\tError     string `json:\"error\"`\n}\n\n// SignRawTransactionResult models the data from the signrawtransaction\n// command.\ntype SignRawTransactionResult struct {\n\tHex      string                    `json:\"hex\"`\n\tComplete bool                      `json:\"complete\"`\n\tErrors   []SignRawTransactionError `json:\"errors,omitempty\"`\n}\n\n// SignRawTransactionWithWalletResult models the data from the\n// signrawtransactionwithwallet command.\ntype SignRawTransactionWithWalletResult struct {\n\tHex      string                    `json:\"hex\"`\n\tComplete bool                      `json:\"complete\"`\n\tErrors   []SignRawTransactionError `json:\"errors,omitempty\"`\n}\n\n// ValidateAddressWalletResult models the data returned by the wallet server\n// validateaddress command.\ntype ValidateAddressWalletResult struct {\n\tIsValid      bool     `json:\"isvalid\"`\n\tAddress      string   `json:\"address,omitempty\"`\n\tIsMine       bool     `json:\"ismine,omitempty\"`\n\tIsWatchOnly  bool     `json:\"iswatchonly,omitempty\"`\n\tIsScript     bool     `json:\"isscript,omitempty\"`\n\tPubKey       string   `json:\"pubkey,omitempty\"`\n\tIsCompressed bool     `json:\"iscompressed,omitempty\"`\n\tAccount      string   `json:\"account,omitempty\"`\n\tAddresses    []string `json:\"addresses,omitempty\"`\n\tHex          string   `json:\"hex,omitempty\"`\n\tScript       string   `json:\"script,omitempty\"`\n\tSigsRequired int32    `json:\"sigsrequired,omitempty\"`\n}\n\n// GetBestBlockResult models the data from the getbestblock command.\ntype GetBestBlockResult struct {\n\tHash   string `json:\"hash\"`\n\tHeight int32  `json:\"height\"`\n}\n\n// BalanceDetailsResult models the details data from the `getbalances` command.\ntype BalanceDetailsResult struct {\n\tTrusted          float64  `json:\"trusted\"`\n\tUntrustedPending float64  `json:\"untrusted_pending\"`\n\tImmature         float64  `json:\"immature\"`\n\tUsed             *float64 `json:\"used\"`\n}\n\n// GetBalancesResult models the data returned from the getbalances command.\ntype GetBalancesResult struct {\n\tMine      BalanceDetailsResult  `json:\"mine\"`\n\tWatchOnly *BalanceDetailsResult `json:\"watchonly\"`\n}\n\n// ImportMultiResults is a slice that models the result of the importmulti command.\n//\n// Each item in the slice contains the execution result corresponding to the input\n// requests of type btcjson.ImportMultiRequest, passed to the ImportMulti[Async]\n// function.\ntype ImportMultiResults []struct {\n\tSuccess  bool      `json:\"success\"`\n\tError    *RPCError `json:\"error,omitempty\"`\n\tWarnings *[]string `json:\"warnings,omitempty\"`\n}\n\n// WalletCreateFundedPsbtResult models the data returned from the\n// walletcreatefundedpsbtresult command.\ntype WalletCreateFundedPsbtResult struct {\n\tPsbt      string  `json:\"psbt\"`\n\tFee       float64 `json:\"fee\"`\n\tChangePos int64   `json:\"changepos\"`\n}\n\n// WalletProcessPsbtResult models the data returned from the\n// walletprocesspsbtresult command.\ntype WalletProcessPsbtResult struct {\n\tPsbt     string `json:\"psbt\"`\n\tComplete bool   `json:\"complete\"`\n}\n"
  },
  {
    "path": "btcjson/walletsvrresults_test.go",
    "content": "// Copyright (c) 2020 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestGetAddressInfoResult ensures that custom unmarshalling of\n// GetAddressInfoResult works as intended.\nfunc TestGetAddressInfoResult(t *testing.T) {\n\tt.Parallel()\n\n\t// arbitrary script class to use in tests\n\tnonStandard, _ := txscript.NewScriptClass(\"nonstandard\")\n\n\ttests := []struct {\n\t\tname    string\n\t\tresult  string\n\t\twant    GetAddressInfoResult\n\t\twantErr error\n\t}{\n\t\t{\n\t\t\tname:   \"GetAddressInfoResult - no ScriptType\",\n\t\t\tresult: `{}`,\n\t\t\twant:   GetAddressInfoResult{},\n\t\t},\n\t\t{\n\t\t\tname:   \"GetAddressInfoResult - ScriptType\",\n\t\t\tresult: `{\"script\":\"nonstandard\",\"address\":\"1abc\"}`,\n\t\t\twant: GetAddressInfoResult{\n\t\t\t\tembeddedAddressInfo: embeddedAddressInfo{\n\t\t\t\t\tAddress:    \"1abc\",\n\t\t\t\t\tScriptType: nonStandard,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:   \"GetAddressInfoResult - embedded ScriptType\",\n\t\t\tresult: `{\"embedded\": {\"script\":\"nonstandard\",\"address\":\"121313\"}}`,\n\t\t\twant: GetAddressInfoResult{\n\t\t\t\tEmbedded: &embeddedAddressInfo{\n\t\t\t\t\tAddress:    \"121313\",\n\t\t\t\t\tScriptType: nonStandard,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"GetAddressInfoResult - invalid ScriptType\",\n\t\t\tresult:  `{\"embedded\": {\"script\":\"foo\",\"address\":\"121313\"}}`,\n\t\t\twantErr: txscript.ErrUnsupportedScriptType,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tvar out GetAddressInfoResult\n\t\terr := json.Unmarshal([]byte(test.result), &out)\n\t\tif err != nil && !errors.Is(err, test.wantErr) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error: %v, want: %v\", i,\n\t\t\t\ttest.name, err, test.wantErr)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(out, test.want) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected unmarshalled data - \"+\n\t\t\t\t\"got %v, want %v\", i, test.name, spew.Sdump(out),\n\t\t\t\tspew.Sdump(test.want))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestGetWalletInfoResult ensures that custom unmarshalling of\n// GetWalletInfoResult works as intended.\nfunc TestGetWalletInfoResult(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname   string\n\t\tresult string\n\t\twant   GetWalletInfoResult\n\t}{\n\t\t{\n\t\t\tname:   \"GetWalletInfoResult - not scanning\",\n\t\t\tresult: `{\"scanning\":false}`,\n\t\t\twant: GetWalletInfoResult{\n\t\t\t\tScanning: ScanningOrFalse{Value: false},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:   \"GetWalletInfoResult - scanning\",\n\t\t\tresult: `{\"scanning\":{\"duration\":10,\"progress\":1.0}}`,\n\t\t\twant: GetWalletInfoResult{\n\t\t\t\tScanning: ScanningOrFalse{\n\t\t\t\t\tValue: ScanProgress{Duration: 10, Progress: 1.0},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tvar out GetWalletInfoResult\n\t\terr := json.Unmarshal([]byte(test.result), &out)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(out, test.want) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected unmarshalled data - \"+\n\t\t\t\t\"got %v, want %v\", i, test.name, spew.Sdump(out),\n\t\t\t\tspew.Sdump(test.want))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/walletsvrwscmds.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson\n\n// NOTE: This file is intended to house the RPC commands that are supported by\n// a wallet server, but are only available via websockets.\n\n// CreateEncryptedWalletCmd defines the createencryptedwallet JSON-RPC command.\ntype CreateEncryptedWalletCmd struct {\n\tPassphrase string\n}\n\n// NewCreateEncryptedWalletCmd returns a new instance which can be used to issue\n// a createencryptedwallet JSON-RPC command.\nfunc NewCreateEncryptedWalletCmd(passphrase string) *CreateEncryptedWalletCmd {\n\treturn &CreateEncryptedWalletCmd{\n\t\tPassphrase: passphrase,\n\t}\n}\n\n// ExportWatchingWalletCmd defines the exportwatchingwallet JSON-RPC command.\ntype ExportWatchingWalletCmd struct {\n\tAccount  *string\n\tDownload *bool `jsonrpcdefault:\"false\"`\n}\n\n// NewExportWatchingWalletCmd returns a new instance which can be used to issue\n// a exportwatchingwallet JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewExportWatchingWalletCmd(account *string, download *bool) *ExportWatchingWalletCmd {\n\treturn &ExportWatchingWalletCmd{\n\t\tAccount:  account,\n\t\tDownload: download,\n\t}\n}\n\n// GetUnconfirmedBalanceCmd defines the getunconfirmedbalance JSON-RPC command.\ntype GetUnconfirmedBalanceCmd struct {\n\tAccount *string\n}\n\n// NewGetUnconfirmedBalanceCmd returns a new instance which can be used to issue\n// a getunconfirmedbalance JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewGetUnconfirmedBalanceCmd(account *string) *GetUnconfirmedBalanceCmd {\n\treturn &GetUnconfirmedBalanceCmd{\n\t\tAccount: account,\n\t}\n}\n\n// ListAddressTransactionsCmd defines the listaddresstransactions JSON-RPC\n// command.\ntype ListAddressTransactionsCmd struct {\n\tAddresses []string\n\tAccount   *string\n}\n\n// NewListAddressTransactionsCmd returns a new instance which can be used to\n// issue a listaddresstransactions JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewListAddressTransactionsCmd(addresses []string, account *string) *ListAddressTransactionsCmd {\n\treturn &ListAddressTransactionsCmd{\n\t\tAddresses: addresses,\n\t\tAccount:   account,\n\t}\n}\n\n// ListAllTransactionsCmd defines the listalltransactions JSON-RPC command.\ntype ListAllTransactionsCmd struct {\n\tAccount *string\n}\n\n// NewListAllTransactionsCmd returns a new instance which can be used to issue a\n// listalltransactions JSON-RPC command.\n//\n// The parameters which are pointers indicate they are optional.  Passing nil\n// for optional parameters will use the default value.\nfunc NewListAllTransactionsCmd(account *string) *ListAllTransactionsCmd {\n\treturn &ListAllTransactionsCmd{\n\t\tAccount: account,\n\t}\n}\n\n// RecoverAddressesCmd defines the recoveraddresses JSON-RPC command.\ntype RecoverAddressesCmd struct {\n\tAccount string\n\tN       int\n}\n\n// NewRecoverAddressesCmd returns a new instance which can be used to issue a\n// recoveraddresses JSON-RPC command.\nfunc NewRecoverAddressesCmd(account string, n int) *RecoverAddressesCmd {\n\treturn &RecoverAddressesCmd{\n\t\tAccount: account,\n\t\tN:       n,\n\t}\n}\n\n// WalletIsLockedCmd defines the walletislocked JSON-RPC command.\ntype WalletIsLockedCmd struct{}\n\n// NewWalletIsLockedCmd returns a new instance which can be used to issue a\n// walletislocked JSON-RPC command.\nfunc NewWalletIsLockedCmd() *WalletIsLockedCmd {\n\treturn &WalletIsLockedCmd{}\n}\n\nfunc init() {\n\t// The commands in this file are only usable with a wallet server via\n\t// websockets.\n\tflags := UFWalletOnly | UFWebsocketOnly\n\n\tMustRegisterCmd(\"createencryptedwallet\", (*CreateEncryptedWalletCmd)(nil), flags)\n\tMustRegisterCmd(\"exportwatchingwallet\", (*ExportWatchingWalletCmd)(nil), flags)\n\tMustRegisterCmd(\"getunconfirmedbalance\", (*GetUnconfirmedBalanceCmd)(nil), flags)\n\tMustRegisterCmd(\"listaddresstransactions\", (*ListAddressTransactionsCmd)(nil), flags)\n\tMustRegisterCmd(\"listalltransactions\", (*ListAllTransactionsCmd)(nil), flags)\n\tMustRegisterCmd(\"recoveraddresses\", (*RecoverAddressesCmd)(nil), flags)\n\tMustRegisterCmd(\"walletislocked\", (*WalletIsLockedCmd)(nil), flags)\n}\n"
  },
  {
    "path": "btcjson/walletsvrwscmds_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestWalletSvrWsCmds tests all of the wallet server websocket-specific\n// commands marshal and unmarshal into valid results include handling of\n// optional fields being omitted in the marshalled command, while optional\n// fields with defaults have the default assigned on unmarshalled commands.\nfunc TestWalletSvrWsCmds(t *testing.T) {\n\tt.Parallel()\n\n\ttestID := int(1)\n\ttests := []struct {\n\t\tname         string\n\t\tnewCmd       func() (interface{}, error)\n\t\tstaticCmd    func() interface{}\n\t\tmarshalled   string\n\t\tunmarshalled interface{}\n\t}{\n\t\t{\n\t\t\tname: \"createencryptedwallet\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"createencryptedwallet\", \"pass\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewCreateEncryptedWalletCmd(\"pass\")\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"createencryptedwallet\",\"params\":[\"pass\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.CreateEncryptedWalletCmd{Passphrase: \"pass\"},\n\t\t},\n\t\t{\n\t\t\tname: \"exportwatchingwallet\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"exportwatchingwallet\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewExportWatchingWalletCmd(nil, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"exportwatchingwallet\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ExportWatchingWalletCmd{\n\t\t\t\tAccount:  nil,\n\t\t\t\tDownload: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"exportwatchingwallet optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"exportwatchingwallet\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewExportWatchingWalletCmd(btcjson.String(\"acct\"), nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"exportwatchingwallet\",\"params\":[\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ExportWatchingWalletCmd{\n\t\t\t\tAccount:  btcjson.String(\"acct\"),\n\t\t\t\tDownload: btcjson.Bool(false),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"exportwatchingwallet optional2\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"exportwatchingwallet\", \"acct\", true)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewExportWatchingWalletCmd(btcjson.String(\"acct\"),\n\t\t\t\t\tbtcjson.Bool(true))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"exportwatchingwallet\",\"params\":[\"acct\",true],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ExportWatchingWalletCmd{\n\t\t\t\tAccount:  btcjson.String(\"acct\"),\n\t\t\t\tDownload: btcjson.Bool(true),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getunconfirmedbalance\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getunconfirmedbalance\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetUnconfirmedBalanceCmd(nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getunconfirmedbalance\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetUnconfirmedBalanceCmd{\n\t\t\t\tAccount: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"getunconfirmedbalance optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"getunconfirmedbalance\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewGetUnconfirmedBalanceCmd(btcjson.String(\"acct\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"getunconfirmedbalance\",\"params\":[\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.GetUnconfirmedBalanceCmd{\n\t\t\t\tAccount: btcjson.String(\"acct\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listaddresstransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listaddresstransactions\", `[\"1Address\"]`)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListAddressTransactionsCmd([]string{\"1Address\"}, nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listaddresstransactions\",\"params\":[[\"1Address\"]],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListAddressTransactionsCmd{\n\t\t\t\tAddresses: []string{\"1Address\"},\n\t\t\t\tAccount:   nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listaddresstransactions optional1\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listaddresstransactions\", `[\"1Address\"]`, \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListAddressTransactionsCmd([]string{\"1Address\"},\n\t\t\t\t\tbtcjson.String(\"acct\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listaddresstransactions\",\"params\":[[\"1Address\"],\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListAddressTransactionsCmd{\n\t\t\t\tAddresses: []string{\"1Address\"},\n\t\t\t\tAccount:   btcjson.String(\"acct\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listalltransactions\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listalltransactions\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListAllTransactionsCmd(nil)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listalltransactions\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListAllTransactionsCmd{\n\t\t\t\tAccount: nil,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"listalltransactions optional\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"listalltransactions\", \"acct\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewListAllTransactionsCmd(btcjson.String(\"acct\"))\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"listalltransactions\",\"params\":[\"acct\"],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.ListAllTransactionsCmd{\n\t\t\t\tAccount: btcjson.String(\"acct\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"recoveraddresses\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"recoveraddresses\", \"acct\", 10)\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewRecoverAddressesCmd(\"acct\", 10)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"recoveraddresses\",\"params\":[\"acct\",10],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.RecoverAddressesCmd{\n\t\t\t\tAccount: \"acct\",\n\t\t\t\tN:       10,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"walletislocked\",\n\t\t\tnewCmd: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"walletislocked\")\n\t\t\t},\n\t\t\tstaticCmd: func() interface{} {\n\t\t\t\treturn btcjson.NewWalletIsLockedCmd()\n\t\t\t},\n\t\t\tmarshalled:   `{\"jsonrpc\":\"1.0\",\"method\":\"walletislocked\",\"params\":[],\"id\":1}`,\n\t\t\tunmarshalled: &btcjson.WalletIsLockedCmd{},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Marshal the command as created by the new static command\n\t\t// creation function.\n\t\tmarshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, testID, test.staticCmd())\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the command is created without error via the generic\n\t\t// new command creation function.\n\t\tcmd, err := test.newCmd()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected NewCmd error: %v \",\n\t\t\t\ti, test.name, err)\n\t\t}\n\n\t\t// Marshal the command as created by the generic new command\n\t\t// creation function.\n\t\tmarshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, testID, cmd)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar request btcjson.Request\n\t\tif err := json.Unmarshal(marshalled, &request); err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error while \"+\n\t\t\t\t\"unmarshalling JSON-RPC request: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tcmd, err = btcjson.UnmarshalCmd(&request)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"UnmarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(cmd, test.unmarshalled) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected unmarshalled command \"+\n\t\t\t\t\"- got %s, want %s\", i, test.name,\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\", cmd),\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\\n\", test.unmarshalled))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/walletsvrwsntfns.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// NOTE: This file is intended to house the RPC websocket notifications that are\n// supported by a wallet server.\n\npackage btcjson\n\nconst (\n\t// AccountBalanceNtfnMethod is the method used for account balance\n\t// notifications.\n\tAccountBalanceNtfnMethod = \"accountbalance\"\n\n\t// BtcdConnectedNtfnMethod is the method used for notifications when\n\t// a wallet server is connected to a chain server.\n\tBtcdConnectedNtfnMethod = \"btcdconnected\"\n\n\t// WalletLockStateNtfnMethod is the method used to notify the lock state\n\t// of a wallet has changed.\n\tWalletLockStateNtfnMethod = \"walletlockstate\"\n\n\t// NewTxNtfnMethod is the method used to notify that a wallet server has\n\t// added a new transaction to the transaction store.\n\tNewTxNtfnMethod = \"newtx\"\n)\n\n// AccountBalanceNtfn defines the accountbalance JSON-RPC notification.\ntype AccountBalanceNtfn struct {\n\tAccount   string\n\tBalance   float64 // In BTC\n\tConfirmed bool    // Whether Balance is confirmed or unconfirmed.\n}\n\n// NewAccountBalanceNtfn returns a new instance which can be used to issue an\n// accountbalance JSON-RPC notification.\nfunc NewAccountBalanceNtfn(account string, balance float64, confirmed bool) *AccountBalanceNtfn {\n\treturn &AccountBalanceNtfn{\n\t\tAccount:   account,\n\t\tBalance:   balance,\n\t\tConfirmed: confirmed,\n\t}\n}\n\n// BtcdConnectedNtfn defines the btcdconnected JSON-RPC notification.\ntype BtcdConnectedNtfn struct {\n\tConnected bool\n}\n\n// NewBtcdConnectedNtfn returns a new instance which can be used to issue a\n// btcdconnected JSON-RPC notification.\nfunc NewBtcdConnectedNtfn(connected bool) *BtcdConnectedNtfn {\n\treturn &BtcdConnectedNtfn{\n\t\tConnected: connected,\n\t}\n}\n\n// WalletLockStateNtfn defines the walletlockstate JSON-RPC notification.\ntype WalletLockStateNtfn struct {\n\tLocked bool\n}\n\n// NewWalletLockStateNtfn returns a new instance which can be used to issue a\n// walletlockstate JSON-RPC notification.\nfunc NewWalletLockStateNtfn(locked bool) *WalletLockStateNtfn {\n\treturn &WalletLockStateNtfn{\n\t\tLocked: locked,\n\t}\n}\n\n// NewTxNtfn defines the newtx JSON-RPC notification.\ntype NewTxNtfn struct {\n\tAccount string\n\tDetails ListTransactionsResult\n}\n\n// NewNewTxNtfn returns a new instance which can be used to issue a newtx\n// JSON-RPC notification.\nfunc NewNewTxNtfn(account string, details ListTransactionsResult) *NewTxNtfn {\n\treturn &NewTxNtfn{\n\t\tAccount: account,\n\t\tDetails: details,\n\t}\n}\n\nfunc init() {\n\t// The commands in this file are only usable with a wallet server via\n\t// websockets and are notifications.\n\tflags := UFWalletOnly | UFWebsocketOnly | UFNotification\n\n\tMustRegisterCmd(AccountBalanceNtfnMethod, (*AccountBalanceNtfn)(nil), flags)\n\tMustRegisterCmd(BtcdConnectedNtfnMethod, (*BtcdConnectedNtfn)(nil), flags)\n\tMustRegisterCmd(WalletLockStateNtfnMethod, (*WalletLockStateNtfn)(nil), flags)\n\tMustRegisterCmd(NewTxNtfnMethod, (*NewTxNtfn)(nil), flags)\n}\n"
  },
  {
    "path": "btcjson/walletsvrwsntfns_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcjson_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// TestWalletSvrWsNtfns tests all of the chain server websocket-specific\n// notifications marshal and unmarshal into valid results include handling of\n// optional fields being omitted in the marshalled command, while optional\n// fields with defaults have the default assigned on unmarshalled commands.\nfunc TestWalletSvrWsNtfns(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname         string\n\t\tnewNtfn      func() (interface{}, error)\n\t\tstaticNtfn   func() interface{}\n\t\tmarshalled   string\n\t\tunmarshalled interface{}\n\t}{\n\t\t{\n\t\t\tname: \"accountbalance\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"accountbalance\", \"acct\", 1.25, true)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\treturn btcjson.NewAccountBalanceNtfn(\"acct\", 1.25, true)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"accountbalance\",\"params\":[\"acct\",1.25,true],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.AccountBalanceNtfn{\n\t\t\t\tAccount:   \"acct\",\n\t\t\t\tBalance:   1.25,\n\t\t\t\tConfirmed: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"btcdconnected\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"btcdconnected\", true)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\treturn btcjson.NewBtcdConnectedNtfn(true)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"btcdconnected\",\"params\":[true],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.BtcdConnectedNtfn{\n\t\t\t\tConnected: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"walletlockstate\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"walletlockstate\", true)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\treturn btcjson.NewWalletLockStateNtfn(true)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"walletlockstate\",\"params\":[true],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.WalletLockStateNtfn{\n\t\t\t\tLocked: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"newtx\",\n\t\t\tnewNtfn: func() (interface{}, error) {\n\t\t\t\treturn btcjson.NewCmd(\"newtx\", \"acct\", `{\"account\":\"acct\",\"address\":\"1Address\",\"category\":\"send\",\"amount\":1.5,\"bip125-replaceable\":\"unknown\",\"fee\":0.0001,\"confirmations\":1,\"trusted\":true,\"txid\":\"456\",\"walletconflicts\":[],\"time\":12345678,\"timereceived\":12345876,\"vout\":789,\"otheraccount\":\"otheracct\"}`)\n\t\t\t},\n\t\t\tstaticNtfn: func() interface{} {\n\t\t\t\tresult := btcjson.ListTransactionsResult{\n\t\t\t\t\tAbandoned:         false,\n\t\t\t\t\tAccount:           \"acct\",\n\t\t\t\t\tAddress:           \"1Address\",\n\t\t\t\t\tBIP125Replaceable: \"unknown\",\n\t\t\t\t\tCategory:          \"send\",\n\t\t\t\t\tAmount:            1.5,\n\t\t\t\t\tFee:               btcjson.Float64(0.0001),\n\t\t\t\t\tConfirmations:     1,\n\t\t\t\t\tTxID:              \"456\",\n\t\t\t\t\tWalletConflicts:   []string{},\n\t\t\t\t\tTime:              12345678,\n\t\t\t\t\tTimeReceived:      12345876,\n\t\t\t\t\tTrusted:           true,\n\t\t\t\t\tVout:              789,\n\t\t\t\t\tOtherAccount:      \"otheracct\",\n\t\t\t\t}\n\t\t\t\treturn btcjson.NewNewTxNtfn(\"acct\", result)\n\t\t\t},\n\t\t\tmarshalled: `{\"jsonrpc\":\"1.0\",\"method\":\"newtx\",\"params\":[\"acct\",{\"abandoned\":false,\"account\":\"acct\",\"address\":\"1Address\",\"amount\":1.5,\"bip125-replaceable\":\"unknown\",\"category\":\"send\",\"confirmations\":1,\"fee\":0.0001,\"time\":12345678,\"timereceived\":12345876,\"trusted\":true,\"txid\":\"456\",\"vout\":789,\"walletconflicts\":[],\"otheraccount\":\"otheracct\"}],\"id\":null}`,\n\t\t\tunmarshalled: &btcjson.NewTxNtfn{\n\t\t\t\tAccount: \"acct\",\n\t\t\t\tDetails: btcjson.ListTransactionsResult{\n\t\t\t\t\tAbandoned:         false,\n\t\t\t\t\tAccount:           \"acct\",\n\t\t\t\t\tAddress:           \"1Address\",\n\t\t\t\t\tBIP125Replaceable: \"unknown\",\n\t\t\t\t\tCategory:          \"send\",\n\t\t\t\t\tAmount:            1.5,\n\t\t\t\t\tFee:               btcjson.Float64(0.0001),\n\t\t\t\t\tConfirmations:     1,\n\t\t\t\t\tTxID:              \"456\",\n\t\t\t\t\tWalletConflicts:   []string{},\n\t\t\t\t\tTime:              12345678,\n\t\t\t\t\tTimeReceived:      12345876,\n\t\t\t\t\tTrusted:           true,\n\t\t\t\t\tVout:              789,\n\t\t\t\t\tOtherAccount:      \"otheracct\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Marshal the notification as created by the new static\n\t\t// creation function.  The ID is nil for notifications.\n\t\tmarshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, test.staticNtfn())\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the notification is created without error via the\n\t\t// generic new notification creation function.\n\t\tcmd, err := test.newNtfn()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected NewCmd error: %v \",\n\t\t\t\ti, test.name, err)\n\t\t}\n\n\t\t// Marshal the notification as created by the generic new\n\t\t// notification creation function.    The ID is nil for\n\t\t// notifications.\n\t\tmarshalled, err = btcjson.MarshalCmd(btcjson.RpcVersion1, nil, cmd)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"MarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(marshalled, []byte(test.marshalled)) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected marshalled data - \"+\n\t\t\t\t\"got %s, want %s\", i, test.name, marshalled,\n\t\t\t\ttest.marshalled)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar request btcjson.Request\n\t\tif err := json.Unmarshal(marshalled, &request); err != nil {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected error while \"+\n\t\t\t\t\"unmarshalling JSON-RPC request: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tcmd, err = btcjson.UnmarshalCmd(&request)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"UnmarshalCmd #%d (%s) unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(cmd, test.unmarshalled) {\n\t\t\tt.Errorf(\"Test #%d (%s) unexpected unmarshalled command \"+\n\t\t\t\t\"- got %s, want %s\", i, test.name,\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\", cmd),\n\t\t\t\tfmt.Sprintf(\"(%T) %+[1]v\\n\", test.unmarshalled))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcjson/zmqsvrcmds.go",
    "content": "package btcjson\n\n// GetZmqNotificationsCmd defines the getzmqnotifications JSON-RPC command.\ntype GetZmqNotificationsCmd struct{}\n\n// NewGetZmqNotificationsCmd returns a new instance which can be used to issue a\n// getzmqnotifications JSON-RPC command.\nfunc NewGetZmqNotificationsCmd() *GetZmqNotificationsCmd {\n\treturn &GetZmqNotificationsCmd{}\n}\n\nfunc init() {\n\tflags := UsageFlag(0)\n\n\tMustRegisterCmd(\"getzmqnotifications\", (*GetZmqNotificationsCmd)(nil), flags)\n}\n"
  },
  {
    "path": "btcjson/zmqsvrresults.go",
    "content": "package btcjson\n\nimport (\n\t\"encoding/json\"\n\t\"net/url\"\n)\n\n// GetZmqNotificationResult models the data returned from the getzmqnotifications command.\ntype GetZmqNotificationResult []struct {\n\tType          string   // Type of notification\n\tAddress       *url.URL // Address of the publisher\n\tHighWaterMark int      // Outbound message high water mark\n}\n\nfunc (z *GetZmqNotificationResult) MarshalJSON() ([]byte, error) {\n\tvar out []map[string]interface{}\n\tfor _, notif := range *z {\n\t\tout = append(out,\n\t\t\tmap[string]interface{}{\n\t\t\t\t\"type\":    notif.Type,\n\t\t\t\t\"address\": notif.Address.String(),\n\t\t\t\t\"hwm\":     notif.HighWaterMark,\n\t\t\t})\n\t}\n\treturn json.Marshal(out)\n}\n\n// UnmarshalJSON satisfies the json.Unmarshaller interface\nfunc (z *GetZmqNotificationResult) UnmarshalJSON(bytes []byte) error {\n\ttype basicNotification struct {\n\t\tType    string\n\t\tAddress string\n\t\tHwm     int\n\t}\n\n\tvar basics []basicNotification\n\tif err := json.Unmarshal(bytes, &basics); err != nil {\n\t\treturn err\n\t}\n\n\tvar notifications GetZmqNotificationResult\n\tfor _, basic := range basics {\n\n\t\taddress, err := url.Parse(basic.Address)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tnotifications = append(notifications, struct {\n\t\t\tType          string\n\t\t\tAddress       *url.URL\n\t\t\tHighWaterMark int\n\t\t}{\n\t\t\tType:          basic.Type,\n\t\t\tAddress:       address,\n\t\t\tHighWaterMark: basic.Hwm,\n\t\t})\n\t}\n\n\t*z = notifications\n\n\treturn nil\n}\n"
  },
  {
    "path": "btcutil/LICENSE",
    "content": "ISC License\n\nCopyright (c) 2013-2017 The btcsuite developers\nCopyright (c) 2016-2017 The Lightning Network Developers\n\nPermission to use, copy, modify, and distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n"
  },
  {
    "path": "btcutil/README.md",
    "content": "btcutil\n=======\n\n[![Build Status](https://github.com/btcsuite/btcd/btcutil/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/btcutil/actions)\n[![ISC License](https://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://godoc.org/github.com/btcsuite/btcd/btcutil)\n\nPackage btcutil provides bitcoin-specific convenience functions and types.\nA comprehensive suite of tests is provided to ensure proper functionality.  See\n`test_coverage.txt` for the gocov coverage report.  Alternatively, if you are\nrunning a POSIX OS, you can run the `cov_report.sh` script for a real-time\nreport.\n\nThis package was developed for btcd, an alternative full-node implementation of\nbitcoin which is under active development by Conformal.  Although it was\nprimarily written for btcd, this package has intentionally been designed so it\ncan be used as a standalone package for any projects needing the functionality\nprovided.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/btcutil\n```\n\n## GPG Verification Key\n\nAll official release tags are signed by Conformal so users can ensure the code\nhas not been tampered with and is coming from the btcsuite developers.  To\nverify the signature perform the following:\n\n- Download the public key from the Conformal website at\n  https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt\n\n- Import the public key into your GPG keyring:\n  ```bash\n  gpg --import GIT-GPG-KEY-conformal.txt\n  ```\n\n- Verify the release tag with the following command where `TAG_NAME` is a\n  placeholder for the specific tag:\n  ```bash\n  git tag -v TAG_NAME\n  ```\n\n## License\n\nPackage btcutil is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "btcutil/address.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcutil/base58\"\n\t\"github.com/btcsuite/btcd/btcutil/bech32\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"golang.org/x/crypto/ripemd160\"\n)\n\n// UnsupportedWitnessVerError describes an error where a segwit address being\n// decoded has an unsupported witness version.\ntype UnsupportedWitnessVerError byte\n\nfunc (e UnsupportedWitnessVerError) Error() string {\n\treturn fmt.Sprintf(\"unsupported witness version: %#x\", byte(e))\n}\n\n// UnsupportedWitnessProgLenError describes an error where a segwit address\n// being decoded has an unsupported witness program length.\ntype UnsupportedWitnessProgLenError int\n\nfunc (e UnsupportedWitnessProgLenError) Error() string {\n\treturn fmt.Sprintf(\"unsupported witness program length: %d\", int(e))\n}\n\nvar (\n\t// ErrChecksumMismatch describes an error where decoding failed due\n\t// to a bad checksum.\n\tErrChecksumMismatch = errors.New(\"checksum mismatch\")\n\n\t// ErrUnknownAddressType describes an error where an address can not\n\t// decoded as a specific address type due to the string encoding\n\t// beginning with an identifier byte unknown to any standard or\n\t// registered (via chaincfg.Register) network.\n\tErrUnknownAddressType = errors.New(\"unknown address type\")\n\n\t// ErrAddressCollision describes an error where an address can not\n\t// be uniquely determined as either a pay-to-pubkey-hash or\n\t// pay-to-script-hash address since the leading identifier is used for\n\t// describing both address kinds, but for different networks.  Rather\n\t// than assuming or defaulting to one or the other, this error is\n\t// returned and the caller must decide how to decode the address.\n\tErrAddressCollision = errors.New(\"address collision\")\n)\n\n// encodeAddress returns a human-readable payment address given a ripemd160 hash\n// and netID which encodes the bitcoin network and address type.  It is used\n// in both pay-to-pubkey-hash (P2PKH) and pay-to-script-hash (P2SH) address\n// encoding.\nfunc encodeAddress(hash160 []byte, netID byte) string {\n\t// Format is 1 byte for a network and address class (i.e. P2PKH vs\n\t// P2SH), 20 bytes for a RIPEMD160 hash, and 4 bytes of checksum.\n\treturn base58.CheckEncode(hash160[:ripemd160.Size], netID)\n}\n\n// encodeSegWitAddress creates a bech32 (or bech32m for SegWit v1) encoded\n// address string representation from witness version and witness program.\nfunc encodeSegWitAddress(hrp string, witnessVersion byte, witnessProgram []byte) (string, error) {\n\t// Group the address bytes into 5 bit groups, as this is what is used to\n\t// encode each character in the address string.\n\tconverted, err := bech32.ConvertBits(witnessProgram, 8, 5, true)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Concatenate the witness version and program, and encode the resulting\n\t// bytes using bech32 encoding.\n\tcombined := make([]byte, len(converted)+1)\n\tcombined[0] = witnessVersion\n\tcopy(combined[1:], converted)\n\n\tvar bech string\n\tswitch witnessVersion {\n\tcase 0:\n\t\tbech, err = bech32.Encode(hrp, combined)\n\n\tcase 1:\n\t\tbech, err = bech32.EncodeM(hrp, combined)\n\n\tdefault:\n\t\treturn \"\", fmt.Errorf(\"unsupported witness version %d\",\n\t\t\twitnessVersion)\n\t}\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Check validity by decoding the created address.\n\tversion, program, err := decodeSegWitAddress(bech)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"invalid segwit address: %v\", err)\n\t}\n\n\tif version != witnessVersion || !bytes.Equal(program, witnessProgram) {\n\t\treturn \"\", fmt.Errorf(\"invalid segwit address\")\n\t}\n\n\treturn bech, nil\n}\n\n// Address is an interface type for any type of destination a transaction\n// output may spend to.  This includes pay-to-pubkey (P2PK), pay-to-pubkey-hash\n// (P2PKH), and pay-to-script-hash (P2SH).  Address is designed to be generic\n// enough that other kinds of addresses may be added in the future without\n// changing the decoding and encoding API.\ntype Address interface {\n\t// String returns the string encoding of the transaction output\n\t// destination.\n\t//\n\t// Please note that String differs subtly from EncodeAddress: String\n\t// will return the value as a string without any conversion, while\n\t// EncodeAddress may convert destination types (for example,\n\t// converting pubkeys to P2PKH addresses) before encoding as a\n\t// payment address string.\n\tString() string\n\n\t// EncodeAddress returns the string encoding of the payment address\n\t// associated with the Address value.  See the comment on String\n\t// for how this method differs from String.\n\tEncodeAddress() string\n\n\t// ScriptAddress returns the raw bytes of the address to be used\n\t// when inserting the address into a txout's script.\n\tScriptAddress() []byte\n\n\t// IsForNet returns whether or not the address is associated with the\n\t// passed bitcoin network.\n\tIsForNet(*chaincfg.Params) bool\n}\n\n// DecodeAddress decodes the string encoding of an address and returns\n// the Address if addr is a valid encoding for a known address type.\n//\n// The bitcoin network the address is associated with is extracted if possible.\n// When the address does not encode the network, such as in the case of a raw\n// public key, the address will be associated with the passed defaultNet.\nfunc DecodeAddress(addr string, defaultNet *chaincfg.Params) (Address, error) {\n\t// Bech32 encoded segwit addresses start with a human-readable part\n\t// (hrp) followed by '1'. For Bitcoin mainnet the hrp is \"bc\", and for\n\t// testnet it is \"tb\". If the address string has a prefix that matches\n\t// one of the prefixes for the known networks, we try to decode it as\n\t// a segwit address.\n\toneIndex := strings.LastIndexByte(addr, '1')\n\tif oneIndex > 1 {\n\t\tprefix := addr[:oneIndex+1]\n\t\tif chaincfg.IsBech32SegwitPrefix(prefix) {\n\t\t\twitnessVer, witnessProg, err := decodeSegWitAddress(addr)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\t// We currently only support P2WPKH and P2WSH, which is\n\t\t\t// witness version 0 and P2TR which is witness version\n\t\t\t// 1.\n\t\t\tif witnessVer != 0 && witnessVer != 1 {\n\t\t\t\treturn nil, UnsupportedWitnessVerError(witnessVer)\n\t\t\t}\n\n\t\t\t// The HRP is everything before the found '1'.\n\t\t\thrp := prefix[:len(prefix)-1]\n\n\t\t\tswitch len(witnessProg) {\n\t\t\tcase 20:\n\t\t\t\treturn newAddressWitnessPubKeyHash(hrp, witnessProg)\n\t\t\tcase 32:\n\t\t\t\tif witnessVer == 1 {\n\t\t\t\t\treturn newAddressTaproot(hrp, witnessProg)\n\t\t\t\t}\n\n\t\t\t\treturn newAddressWitnessScriptHash(hrp, witnessProg)\n\t\t\tdefault:\n\t\t\t\treturn nil, UnsupportedWitnessProgLenError(len(witnessProg))\n\t\t\t}\n\t\t}\n\t}\n\n\t// Serialized public keys are either 65 bytes (130 hex chars) if\n\t// uncompressed/hybrid or 33 bytes (66 hex chars) if compressed.\n\tif len(addr) == 130 || len(addr) == 66 {\n\t\tserializedPubKey, err := hex.DecodeString(addr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewAddressPubKey(serializedPubKey, defaultNet)\n\t}\n\n\t// Switch on decoded length to determine the type.\n\tdecoded, netID, err := base58.CheckDecode(addr)\n\tif err != nil {\n\t\tif err == base58.ErrChecksum {\n\t\t\treturn nil, ErrChecksumMismatch\n\t\t}\n\t\treturn nil, errors.New(\"decoded address is of unknown format\")\n\t}\n\tswitch len(decoded) {\n\tcase ripemd160.Size: // P2PKH or P2SH\n\t\tisP2PKH := netID == defaultNet.PubKeyHashAddrID\n\t\tisP2SH := netID == defaultNet.ScriptHashAddrID\n\t\tswitch hash160 := decoded; {\n\t\tcase isP2PKH && isP2SH:\n\t\t\treturn nil, ErrAddressCollision\n\t\tcase isP2PKH:\n\t\t\treturn newAddressPubKeyHash(hash160, netID)\n\t\tcase isP2SH:\n\t\t\treturn newAddressScriptHashFromHash(hash160, netID)\n\t\tdefault:\n\t\t\treturn nil, ErrUnknownAddressType\n\t\t}\n\n\tdefault:\n\t\treturn nil, errors.New(\"decoded address is of unknown size\")\n\t}\n}\n\n// decodeSegWitAddress parses a bech32 encoded segwit address string and\n// returns the witness version and witness program byte representation.\nfunc decodeSegWitAddress(address string) (byte, []byte, error) {\n\t// Decode the bech32 encoded address.\n\t_, data, bech32version, err := bech32.DecodeGeneric(address)\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\n\t// The first byte of the decoded address is the witness version, it must\n\t// exist.\n\tif len(data) < 1 {\n\t\treturn 0, nil, fmt.Errorf(\"no witness version\")\n\t}\n\n\t// ...and be <= 16.\n\tversion := data[0]\n\tif version > 16 {\n\t\treturn 0, nil, fmt.Errorf(\"invalid witness version: %v\", version)\n\t}\n\n\t// The remaining characters of the address returned are grouped into\n\t// words of 5 bits. In order to restore the original witness program\n\t// bytes, we'll need to regroup into 8 bit words.\n\tregrouped, err := bech32.ConvertBits(data[1:], 5, 8, false)\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\n\t// The regrouped data must be between 2 and 40 bytes.\n\tif len(regrouped) < 2 || len(regrouped) > 40 {\n\t\treturn 0, nil, fmt.Errorf(\"invalid data length\")\n\t}\n\n\t// For witness version 0, address MUST be exactly 20 or 32 bytes.\n\tif version == 0 && len(regrouped) != 20 && len(regrouped) != 32 {\n\t\treturn 0, nil, fmt.Errorf(\"invalid data length for witness \"+\n\t\t\t\"version 0: %v\", len(regrouped))\n\t}\n\n\t// For witness version 0, the bech32 encoding must be used.\n\tif version == 0 && bech32version != bech32.Version0 {\n\t\treturn 0, nil, fmt.Errorf(\"invalid checksum expected bech32 \" +\n\t\t\t\"encoding for address with witness version 0\")\n\t}\n\n\t// For witness version 1, the bech32m encoding must be used.\n\tif version == 1 && bech32version != bech32.VersionM {\n\t\treturn 0, nil, fmt.Errorf(\"invalid checksum expected bech32m \" +\n\t\t\t\"encoding for address with witness version 1\")\n\t}\n\n\treturn version, regrouped, nil\n}\n\n// AddressPubKeyHash is an Address for a pay-to-pubkey-hash (P2PKH)\n// transaction.\ntype AddressPubKeyHash struct {\n\thash  [ripemd160.Size]byte\n\tnetID byte\n}\n\n// NewAddressPubKeyHash returns a new AddressPubKeyHash.  pkHash mustbe 20\n// bytes.\nfunc NewAddressPubKeyHash(pkHash []byte, net *chaincfg.Params) (*AddressPubKeyHash, error) {\n\treturn newAddressPubKeyHash(pkHash, net.PubKeyHashAddrID)\n}\n\n// newAddressPubKeyHash is the internal API to create a pubkey hash address\n// with a known leading identifier byte for a network, rather than looking\n// it up through its parameters.  This is useful when creating a new address\n// structure from a string encoding where the identifier byte is already\n// known.\nfunc newAddressPubKeyHash(pkHash []byte, netID byte) (*AddressPubKeyHash, error) {\n\t// Check for a valid pubkey hash length.\n\tif len(pkHash) != ripemd160.Size {\n\t\treturn nil, errors.New(\"pkHash must be 20 bytes\")\n\t}\n\n\taddr := &AddressPubKeyHash{netID: netID}\n\tcopy(addr.hash[:], pkHash)\n\treturn addr, nil\n}\n\n// EncodeAddress returns the string encoding of a pay-to-pubkey-hash\n// address.  Part of the Address interface.\nfunc (a *AddressPubKeyHash) EncodeAddress() string {\n\treturn encodeAddress(a.hash[:], a.netID)\n}\n\n// ScriptAddress returns the bytes to be included in a txout script to pay\n// to a pubkey hash.  Part of the Address interface.\nfunc (a *AddressPubKeyHash) ScriptAddress() []byte {\n\treturn a.hash[:]\n}\n\n// IsForNet returns whether or not the pay-to-pubkey-hash address is associated\n// with the passed bitcoin network.\nfunc (a *AddressPubKeyHash) IsForNet(net *chaincfg.Params) bool {\n\treturn a.netID == net.PubKeyHashAddrID\n}\n\n// String returns a human-readable string for the pay-to-pubkey-hash address.\n// This is equivalent to calling EncodeAddress, but is provided so the type can\n// be used as a fmt.Stringer.\nfunc (a *AddressPubKeyHash) String() string {\n\treturn a.EncodeAddress()\n}\n\n// Hash160 returns the underlying array of the pubkey hash.  This can be useful\n// when an array is more appropriate than a slice (for example, when used as map\n// keys).\nfunc (a *AddressPubKeyHash) Hash160() *[ripemd160.Size]byte {\n\treturn &a.hash\n}\n\n// AddressScriptHash is an Address for a pay-to-script-hash (P2SH)\n// transaction.\ntype AddressScriptHash struct {\n\thash  [ripemd160.Size]byte\n\tnetID byte\n}\n\n// NewAddressScriptHash returns a new AddressScriptHash.\nfunc NewAddressScriptHash(serializedScript []byte, net *chaincfg.Params) (*AddressScriptHash, error) {\n\tscriptHash := Hash160(serializedScript)\n\treturn newAddressScriptHashFromHash(scriptHash, net.ScriptHashAddrID)\n}\n\n// NewAddressScriptHashFromHash returns a new AddressScriptHash.  scriptHash\n// must be 20 bytes.\nfunc NewAddressScriptHashFromHash(scriptHash []byte, net *chaincfg.Params) (*AddressScriptHash, error) {\n\treturn newAddressScriptHashFromHash(scriptHash, net.ScriptHashAddrID)\n}\n\n// newAddressScriptHashFromHash is the internal API to create a script hash\n// address with a known leading identifier byte for a network, rather than\n// looking it up through its parameters.  This is useful when creating a new\n// address structure from a string encoding where the identifier byte is already\n// known.\nfunc newAddressScriptHashFromHash(scriptHash []byte, netID byte) (*AddressScriptHash, error) {\n\t// Check for a valid script hash length.\n\tif len(scriptHash) != ripemd160.Size {\n\t\treturn nil, errors.New(\"scriptHash must be 20 bytes\")\n\t}\n\n\taddr := &AddressScriptHash{netID: netID}\n\tcopy(addr.hash[:], scriptHash)\n\treturn addr, nil\n}\n\n// EncodeAddress returns the string encoding of a pay-to-script-hash\n// address.  Part of the Address interface.\nfunc (a *AddressScriptHash) EncodeAddress() string {\n\treturn encodeAddress(a.hash[:], a.netID)\n}\n\n// ScriptAddress returns the bytes to be included in a txout script to pay\n// to a script hash.  Part of the Address interface.\nfunc (a *AddressScriptHash) ScriptAddress() []byte {\n\treturn a.hash[:]\n}\n\n// IsForNet returns whether or not the pay-to-script-hash address is associated\n// with the passed bitcoin network.\nfunc (a *AddressScriptHash) IsForNet(net *chaincfg.Params) bool {\n\treturn a.netID == net.ScriptHashAddrID\n}\n\n// String returns a human-readable string for the pay-to-script-hash address.\n// This is equivalent to calling EncodeAddress, but is provided so the type can\n// be used as a fmt.Stringer.\nfunc (a *AddressScriptHash) String() string {\n\treturn a.EncodeAddress()\n}\n\n// Hash160 returns the underlying array of the script hash.  This can be useful\n// when an array is more appropriate than a slice (for example, when used as map\n// keys).\nfunc (a *AddressScriptHash) Hash160() *[ripemd160.Size]byte {\n\treturn &a.hash\n}\n\n// PubKeyFormat describes what format to use for a pay-to-pubkey address.\ntype PubKeyFormat int\n\nconst (\n\t// PKFUncompressed indicates the pay-to-pubkey address format is an\n\t// uncompressed public key.\n\tPKFUncompressed PubKeyFormat = iota\n\n\t// PKFCompressed indicates the pay-to-pubkey address format is a\n\t// compressed public key.\n\tPKFCompressed\n)\n\n// AddressPubKey is an Address for a pay-to-pubkey transaction.\ntype AddressPubKey struct {\n\tpubKeyFormat PubKeyFormat\n\tpubKey       *btcec.PublicKey\n\tpubKeyHashID byte\n}\n\n// NewAddressPubKey returns a new AddressPubKey which represents a pay-to-pubkey\n// address.  The serializedPubKey parameter must be a valid pubkey and can be\n// uncompressed, compressed, or hybrid.\nfunc NewAddressPubKey(serializedPubKey []byte, net *chaincfg.Params) (*AddressPubKey, error) {\n\tpubKey, err := btcec.ParsePubKey(serializedPubKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Set the format of the pubkey.  This probably should be returned\n\t// from btcec, but do it here to avoid API churn.  We already know the\n\t// pubkey is valid since it parsed above, so it's safe to simply examine\n\t// the leading byte to get the format.\n\tpkFormat := PKFUncompressed\n\tswitch serializedPubKey[0] {\n\tcase 0x02, 0x03:\n\t\tpkFormat = PKFCompressed\n\t}\n\n\treturn &AddressPubKey{\n\t\tpubKeyFormat: pkFormat,\n\t\tpubKey:       pubKey,\n\t\tpubKeyHashID: net.PubKeyHashAddrID,\n\t}, nil\n}\n\n// serialize returns the serialization of the public key according to the\n// format associated with the address.\nfunc (a *AddressPubKey) serialize() []byte {\n\tswitch a.pubKeyFormat {\n\tdefault:\n\t\tfallthrough\n\tcase PKFUncompressed:\n\t\treturn a.pubKey.SerializeUncompressed()\n\n\tcase PKFCompressed:\n\t\treturn a.pubKey.SerializeCompressed()\n\t}\n}\n\n// EncodeAddress returns the string encoding of the public key as a\n// pay-to-pubkey-hash.  Note that the public key format (uncompressed,\n// compressed, etc) will change the resulting address.  This is expected since\n// pay-to-pubkey-hash is a hash of the serialized public key which obviously\n// differs with the format.  At the time of this writing, most Bitcoin addresses\n// are pay-to-pubkey-hash constructed from the uncompressed public key.\n//\n// Part of the Address interface.\nfunc (a *AddressPubKey) EncodeAddress() string {\n\treturn encodeAddress(Hash160(a.serialize()), a.pubKeyHashID)\n}\n\n// ScriptAddress returns the bytes to be included in a txout script to pay\n// to a public key.  Setting the public key format will affect the output of\n// this function accordingly.  Part of the Address interface.\nfunc (a *AddressPubKey) ScriptAddress() []byte {\n\treturn a.serialize()\n}\n\n// IsForNet returns whether or not the pay-to-pubkey address is associated\n// with the passed bitcoin network.\nfunc (a *AddressPubKey) IsForNet(net *chaincfg.Params) bool {\n\treturn a.pubKeyHashID == net.PubKeyHashAddrID\n}\n\n// String returns the hex-encoded human-readable string for the pay-to-pubkey\n// address.  This is not the same as calling EncodeAddress.\nfunc (a *AddressPubKey) String() string {\n\treturn hex.EncodeToString(a.serialize())\n}\n\n// Format returns the format (uncompressed, compressed, etc) of the\n// pay-to-pubkey address.\nfunc (a *AddressPubKey) Format() PubKeyFormat {\n\treturn a.pubKeyFormat\n}\n\n// SetFormat sets the format (uncompressed, compressed, etc) of the\n// pay-to-pubkey address.\nfunc (a *AddressPubKey) SetFormat(pkFormat PubKeyFormat) {\n\ta.pubKeyFormat = pkFormat\n}\n\n// AddressPubKeyHash returns the pay-to-pubkey address converted to a\n// pay-to-pubkey-hash address.  Note that the public key format (uncompressed,\n// compressed, etc) will change the resulting address.  This is expected since\n// pay-to-pubkey-hash is a hash of the serialized public key which obviously\n// differs with the format.  At the time of this writing, most Bitcoin addresses\n// are pay-to-pubkey-hash constructed from the uncompressed public key.\nfunc (a *AddressPubKey) AddressPubKeyHash() *AddressPubKeyHash {\n\taddr := &AddressPubKeyHash{netID: a.pubKeyHashID}\n\tcopy(addr.hash[:], Hash160(a.serialize()))\n\treturn addr\n}\n\n// PubKey returns the underlying public key for the address.\nfunc (a *AddressPubKey) PubKey() *btcec.PublicKey {\n\treturn a.pubKey\n}\n\n// AddressSegWit is the base address type for all SegWit addresses.\ntype AddressSegWit struct {\n\thrp            string\n\twitnessVersion byte\n\twitnessProgram []byte\n}\n\n// EncodeAddress returns the bech32 (or bech32m for SegWit v1) string encoding\n// of an AddressSegWit.\n//\n// NOTE: This method is part of the Address interface.\nfunc (a *AddressSegWit) EncodeAddress() string {\n\tstr, err := encodeSegWitAddress(\n\t\ta.hrp, a.witnessVersion, a.witnessProgram[:],\n\t)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\treturn str\n}\n\n// ScriptAddress returns the witness program for this address.\n//\n// NOTE: This method is part of the Address interface.\nfunc (a *AddressSegWit) ScriptAddress() []byte {\n\treturn a.witnessProgram[:]\n}\n\n// IsForNet returns whether the AddressSegWit is associated with the passed\n// bitcoin network.\n//\n// NOTE: This method is part of the Address interface.\nfunc (a *AddressSegWit) IsForNet(net *chaincfg.Params) bool {\n\treturn a.hrp == net.Bech32HRPSegwit\n}\n\n// String returns a human-readable string for the AddressWitnessPubKeyHash.\n// This is equivalent to calling EncodeAddress, but is provided so the type\n// can be used as a fmt.Stringer.\n//\n// NOTE: This method is part of the Address interface.\nfunc (a *AddressSegWit) String() string {\n\treturn a.EncodeAddress()\n}\n\n// Hrp returns the human-readable part of the bech32 (or bech32m for SegWit v1)\n// encoded AddressSegWit.\nfunc (a *AddressSegWit) Hrp() string {\n\treturn a.hrp\n}\n\n// WitnessVersion returns the witness version of the AddressSegWit.\nfunc (a *AddressSegWit) WitnessVersion() byte {\n\treturn a.witnessVersion\n}\n\n// WitnessProgram returns the witness program of the AddressSegWit.\nfunc (a *AddressSegWit) WitnessProgram() []byte {\n\treturn a.witnessProgram[:]\n}\n\n// AddressWitnessPubKeyHash is an Address for a pay-to-witness-pubkey-hash\n// (P2WPKH) output. See BIP 173 for further details regarding native segregated\n// witness address encoding:\n// https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki\ntype AddressWitnessPubKeyHash struct {\n\tAddressSegWit\n}\n\n// NewAddressWitnessPubKeyHash returns a new AddressWitnessPubKeyHash.\nfunc NewAddressWitnessPubKeyHash(witnessProg []byte,\n\tnet *chaincfg.Params) (*AddressWitnessPubKeyHash, error) {\n\n\treturn newAddressWitnessPubKeyHash(net.Bech32HRPSegwit, witnessProg)\n}\n\n// newAddressWitnessPubKeyHash is an internal helper function to create an\n// AddressWitnessPubKeyHash with a known human-readable part, rather than\n// looking it up through its parameters.\nfunc newAddressWitnessPubKeyHash(hrp string,\n\twitnessProg []byte) (*AddressWitnessPubKeyHash, error) {\n\n\t// Check for valid program length for witness version 0, which is 20\n\t// for P2WPKH.\n\tif len(witnessProg) != 20 {\n\t\treturn nil, errors.New(\"witness program must be 20 \" +\n\t\t\t\"bytes for p2wpkh\")\n\t}\n\n\taddr := &AddressWitnessPubKeyHash{\n\t\tAddressSegWit{\n\t\t\thrp:            strings.ToLower(hrp),\n\t\t\twitnessVersion: 0x00,\n\t\t\twitnessProgram: witnessProg,\n\t\t},\n\t}\n\n\treturn addr, nil\n}\n\n// Hash160 returns the witness program of the AddressWitnessPubKeyHash as a\n// byte array.\nfunc (a *AddressWitnessPubKeyHash) Hash160() *[20]byte {\n\tvar pubKeyHashWitnessProgram [20]byte\n\tcopy(pubKeyHashWitnessProgram[:], a.witnessProgram)\n\treturn &pubKeyHashWitnessProgram\n}\n\n// AddressWitnessScriptHash is an Address for a pay-to-witness-script-hash\n// (P2WSH) output. See BIP 173 for further details regarding native segregated\n// witness address encoding:\n// https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki\ntype AddressWitnessScriptHash struct {\n\tAddressSegWit\n}\n\n// NewAddressWitnessScriptHash returns a new AddressWitnessPubKeyHash.\nfunc NewAddressWitnessScriptHash(witnessProg []byte,\n\tnet *chaincfg.Params) (*AddressWitnessScriptHash, error) {\n\n\treturn newAddressWitnessScriptHash(net.Bech32HRPSegwit, witnessProg)\n}\n\n// newAddressWitnessScriptHash is an internal helper function to create an\n// AddressWitnessScriptHash with a known human-readable part, rather than\n// looking it up through its parameters.\nfunc newAddressWitnessScriptHash(hrp string,\n\twitnessProg []byte) (*AddressWitnessScriptHash, error) {\n\n\t// Check for valid program length for witness version 0, which is 32\n\t// for P2WSH.\n\tif len(witnessProg) != 32 {\n\t\treturn nil, errors.New(\"witness program must be 32 \" +\n\t\t\t\"bytes for p2wsh\")\n\t}\n\n\taddr := &AddressWitnessScriptHash{\n\t\tAddressSegWit{\n\t\t\thrp:            strings.ToLower(hrp),\n\t\t\twitnessVersion: 0x00,\n\t\t\twitnessProgram: witnessProg,\n\t\t},\n\t}\n\n\treturn addr, nil\n}\n\n// AddressTaproot is an Address for a pay-to-taproot (P2TR) output. See BIP 341\n// for further details.\ntype AddressTaproot struct {\n\tAddressSegWit\n}\n\n// NewAddressTaproot returns a new AddressTaproot.\nfunc NewAddressTaproot(witnessProg []byte,\n\tnet *chaincfg.Params) (*AddressTaproot, error) {\n\n\treturn newAddressTaproot(net.Bech32HRPSegwit, witnessProg)\n}\n\n// newAddressTaproot is an internal helper function to create an\n// AddressTaproot with a known human-readable part, rather than\n// looking it up through its parameters.\nfunc newAddressTaproot(hrp string,\n\twitnessProg []byte) (*AddressTaproot, error) {\n\n\t// Check for valid program length for witness version 1, which is 32\n\t// for P2TR.\n\tif len(witnessProg) != 32 {\n\t\treturn nil, errors.New(\"witness program must be 32 bytes for \" +\n\t\t\t\"p2tr\")\n\t}\n\n\taddr := &AddressTaproot{\n\t\tAddressSegWit{\n\t\t\thrp:            strings.ToLower(hrp),\n\t\t\twitnessVersion: 0x01,\n\t\t\twitnessProgram: witnessProg,\n\t\t},\n\t}\n\n\treturn addr, nil\n}\n"
  },
  {
    "path": "btcutil/address_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"golang.org/x/crypto/ripemd160\"\n)\n\ntype CustomParamStruct struct {\n\tNet              wire.BitcoinNet\n\tPubKeyHashAddrID byte\n\tScriptHashAddrID byte\n\tBech32HRPSegwit  string\n}\n\nvar CustomParams = CustomParamStruct{\n\tNet:              0xdbb6c0fb, // litecoin mainnet HD version bytes\n\tPubKeyHashAddrID: 0x30,       // starts with L\n\tScriptHashAddrID: 0x32,       // starts with M\n\tBech32HRPSegwit:  \"ltc\",      // starts with ltc\n}\n\n// We use this function to be able to test functionality in DecodeAddress for\n// defaultNet addresses\nfunc applyCustomParams(params chaincfg.Params, customParams CustomParamStruct) chaincfg.Params {\n\tparams.Net = customParams.Net\n\tparams.PubKeyHashAddrID = customParams.PubKeyHashAddrID\n\tparams.ScriptHashAddrID = customParams.ScriptHashAddrID\n\tparams.Bech32HRPSegwit = customParams.Bech32HRPSegwit\n\treturn params\n}\n\nvar customParams = applyCustomParams(chaincfg.MainNetParams, CustomParams)\n\nfunc TestAddresses(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\taddr    string\n\t\tencoded string\n\t\tvalid   bool\n\t\tresult  btcutil.Address\n\t\tf       func() (btcutil.Address, error)\n\t\tnet     *chaincfg.Params\n\t}{\n\t\t// Positive P2PKH tests.\n\t\t{\n\t\t\tname:    \"mainnet p2pkh\",\n\t\t\taddr:    \"1MirQ9bwyQcGVJPwKUgapu5ouK2E2Ey4gX\",\n\t\t\tencoded: \"1MirQ9bwyQcGVJPwKUgapu5ouK2E2Ey4gX\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressPubKeyHash(\n\t\t\t\t[ripemd160.Size]byte{\n\t\t\t\t\t0xe3, 0x4c, 0xce, 0x70, 0xc8, 0x63, 0x73, 0x27, 0x3e, 0xfc,\n\t\t\t\t\t0xc5, 0x4c, 0xe7, 0xd2, 0xa4, 0x91, 0xbb, 0x4a, 0x0e, 0x84},\n\t\t\t\tchaincfg.MainNetParams.PubKeyHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tpkHash := []byte{\n\t\t\t\t\t0xe3, 0x4c, 0xce, 0x70, 0xc8, 0x63, 0x73, 0x27, 0x3e, 0xfc,\n\t\t\t\t\t0xc5, 0x4c, 0xe7, 0xd2, 0xa4, 0x91, 0xbb, 0x4a, 0x0e, 0x84}\n\t\t\t\treturn btcutil.NewAddressPubKeyHash(pkHash, &chaincfg.MainNetParams)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:    \"mainnet p2pkh 2\",\n\t\t\taddr:    \"12MzCDwodF9G1e7jfwLXfR164RNtx4BRVG\",\n\t\t\tencoded: \"12MzCDwodF9G1e7jfwLXfR164RNtx4BRVG\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressPubKeyHash(\n\t\t\t\t[ripemd160.Size]byte{\n\t\t\t\t\t0x0e, 0xf0, 0x30, 0x10, 0x7f, 0xd2, 0x6e, 0x0b, 0x6b, 0xf4,\n\t\t\t\t\t0x05, 0x12, 0xbc, 0xa2, 0xce, 0xb1, 0xdd, 0x80, 0xad, 0xaa},\n\t\t\t\tchaincfg.MainNetParams.PubKeyHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tpkHash := []byte{\n\t\t\t\t\t0x0e, 0xf0, 0x30, 0x10, 0x7f, 0xd2, 0x6e, 0x0b, 0x6b, 0xf4,\n\t\t\t\t\t0x05, 0x12, 0xbc, 0xa2, 0xce, 0xb1, 0xdd, 0x80, 0xad, 0xaa}\n\t\t\t\treturn btcutil.NewAddressPubKeyHash(pkHash, &chaincfg.MainNetParams)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:    \"litecoin mainnet p2pkh\",\n\t\t\taddr:    \"LM2WMpR1Rp6j3Sa59cMXMs1SPzj9eXpGc1\",\n\t\t\tencoded: \"LM2WMpR1Rp6j3Sa59cMXMs1SPzj9eXpGc1\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressPubKeyHash(\n\t\t\t\t[ripemd160.Size]byte{\n\t\t\t\t\t0x13, 0xc6, 0x0d, 0x8e, 0x68, 0xd7, 0x34, 0x9f, 0x5b, 0x4c,\n\t\t\t\t\t0xa3, 0x62, 0xc3, 0x95, 0x4b, 0x15, 0x04, 0x50, 0x61, 0xb1},\n\t\t\t\tCustomParams.PubKeyHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tpkHash := []byte{\n\t\t\t\t\t0x13, 0xc6, 0x0d, 0x8e, 0x68, 0xd7, 0x34, 0x9f, 0x5b, 0x4c,\n\t\t\t\t\t0xa3, 0x62, 0xc3, 0x95, 0x4b, 0x15, 0x04, 0x50, 0x61, 0xb1}\n\t\t\t\treturn btcutil.NewAddressPubKeyHash(pkHash, &customParams)\n\t\t\t},\n\t\t\tnet: &customParams,\n\t\t},\n\t\t{\n\t\t\tname:    \"testnet p2pkh\",\n\t\t\taddr:    \"mrX9vMRYLfVy1BnZbc5gZjuyaqH3ZW2ZHz\",\n\t\t\tencoded: \"mrX9vMRYLfVy1BnZbc5gZjuyaqH3ZW2ZHz\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressPubKeyHash(\n\t\t\t\t[ripemd160.Size]byte{\n\t\t\t\t\t0x78, 0xb3, 0x16, 0xa0, 0x86, 0x47, 0xd5, 0xb7, 0x72, 0x83,\n\t\t\t\t\t0xe5, 0x12, 0xd3, 0x60, 0x3f, 0x1f, 0x1c, 0x8d, 0xe6, 0x8f},\n\t\t\t\tchaincfg.TestNet3Params.PubKeyHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tpkHash := []byte{\n\t\t\t\t\t0x78, 0xb3, 0x16, 0xa0, 0x86, 0x47, 0xd5, 0xb7, 0x72, 0x83,\n\t\t\t\t\t0xe5, 0x12, 0xd3, 0x60, 0x3f, 0x1f, 0x1c, 0x8d, 0xe6, 0x8f}\n\t\t\t\treturn btcutil.NewAddressPubKeyHash(pkHash, &chaincfg.TestNet3Params)\n\t\t\t},\n\t\t\tnet: &chaincfg.TestNet3Params,\n\t\t},\n\n\t\t// Negative P2PKH tests.\n\t\t{\n\t\t\tname:  \"p2pkh wrong hash length\",\n\t\t\taddr:  \"\",\n\t\t\tvalid: false,\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tpkHash := []byte{\n\t\t\t\t\t0x00, 0x0e, 0xf0, 0x30, 0x10, 0x7f, 0xd2, 0x6e, 0x0b, 0x6b,\n\t\t\t\t\t0xf4, 0x05, 0x12, 0xbc, 0xa2, 0xce, 0xb1, 0xdd, 0x80, 0xad,\n\t\t\t\t\t0xaa}\n\t\t\t\treturn btcutil.NewAddressPubKeyHash(pkHash, &chaincfg.MainNetParams)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"p2pkh bad checksum\",\n\t\t\taddr:  \"1MirQ9bwyQcGVJPwKUgapu5ouK2E2Ey4gY\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\n\t\t// Positive P2SH tests.\n\t\t{\n\t\t\t// Taken from transactions:\n\t\t\t// output: 3c9018e8d5615c306d72397f8f5eef44308c98fb576a88e030c25456b4f3a7ac\n\t\t\t// input:  837dea37ddc8b1e3ce646f1a656e79bbd8cc7f558ac56a169626d649ebe2a3ba.\n\t\t\tname:    \"mainnet p2sh\",\n\t\t\taddr:    \"3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC\",\n\t\t\tencoded: \"3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressScriptHash(\n\t\t\t\t[ripemd160.Size]byte{\n\t\t\t\t\t0xf8, 0x15, 0xb0, 0x36, 0xd9, 0xbb, 0xbc, 0xe5, 0xe9, 0xf2,\n\t\t\t\t\t0xa0, 0x0a, 0xbd, 0x1b, 0xf3, 0xdc, 0x91, 0xe9, 0x55, 0x10},\n\t\t\t\tchaincfg.MainNetParams.ScriptHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tscript := []byte{\n\t\t\t\t\t0x52, 0x41, 0x04, 0x91, 0xbb, 0xa2, 0x51, 0x09, 0x12, 0xa5,\n\t\t\t\t\t0xbd, 0x37, 0xda, 0x1f, 0xb5, 0xb1, 0x67, 0x30, 0x10, 0xe4,\n\t\t\t\t\t0x3d, 0x2c, 0x6d, 0x81, 0x2c, 0x51, 0x4e, 0x91, 0xbf, 0xa9,\n\t\t\t\t\t0xf2, 0xeb, 0x12, 0x9e, 0x1c, 0x18, 0x33, 0x29, 0xdb, 0x55,\n\t\t\t\t\t0xbd, 0x86, 0x8e, 0x20, 0x9a, 0xac, 0x2f, 0xbc, 0x02, 0xcb,\n\t\t\t\t\t0x33, 0xd9, 0x8f, 0xe7, 0x4b, 0xf2, 0x3f, 0x0c, 0x23, 0x5d,\n\t\t\t\t\t0x61, 0x26, 0xb1, 0xd8, 0x33, 0x4f, 0x86, 0x41, 0x04, 0x86,\n\t\t\t\t\t0x5c, 0x40, 0x29, 0x3a, 0x68, 0x0c, 0xb9, 0xc0, 0x20, 0xe7,\n\t\t\t\t\t0xb1, 0xe1, 0x06, 0xd8, 0xc1, 0x91, 0x6d, 0x3c, 0xef, 0x99,\n\t\t\t\t\t0xaa, 0x43, 0x1a, 0x56, 0xd2, 0x53, 0xe6, 0x92, 0x56, 0xda,\n\t\t\t\t\t0xc0, 0x9e, 0xf1, 0x22, 0xb1, 0xa9, 0x86, 0x81, 0x8a, 0x7c,\n\t\t\t\t\t0xb6, 0x24, 0x53, 0x2f, 0x06, 0x2c, 0x1d, 0x1f, 0x87, 0x22,\n\t\t\t\t\t0x08, 0x48, 0x61, 0xc5, 0xc3, 0x29, 0x1c, 0xcf, 0xfe, 0xf4,\n\t\t\t\t\t0xec, 0x68, 0x74, 0x41, 0x04, 0x8d, 0x24, 0x55, 0xd2, 0x40,\n\t\t\t\t\t0x3e, 0x08, 0x70, 0x8f, 0xc1, 0xf5, 0x56, 0x00, 0x2f, 0x1b,\n\t\t\t\t\t0x6c, 0xd8, 0x3f, 0x99, 0x2d, 0x08, 0x50, 0x97, 0xf9, 0x97,\n\t\t\t\t\t0x4a, 0xb0, 0x8a, 0x28, 0x83, 0x8f, 0x07, 0x89, 0x6f, 0xba,\n\t\t\t\t\t0xb0, 0x8f, 0x39, 0x49, 0x5e, 0x15, 0xfa, 0x6f, 0xad, 0x6e,\n\t\t\t\t\t0xdb, 0xfb, 0x1e, 0x75, 0x4e, 0x35, 0xfa, 0x1c, 0x78, 0x44,\n\t\t\t\t\t0xc4, 0x1f, 0x32, 0x2a, 0x18, 0x63, 0xd4, 0x62, 0x13, 0x53,\n\t\t\t\t\t0xae}\n\t\t\t\treturn btcutil.NewAddressScriptHash(script, &chaincfg.MainNetParams)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:    \"litecoin mainnet P2SH \",\n\t\t\taddr:    \"MVcg9uEvtWuP5N6V48EHfEtbz48qR8TKZ9\",\n\t\t\tencoded: \"MVcg9uEvtWuP5N6V48EHfEtbz48qR8TKZ9\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressScriptHash(\n\t\t\t\t[ripemd160.Size]byte{\n\t\t\t\t\t0xee, 0x34, 0xac, 0x67, 0x6b, 0xda, 0xf6, 0xe3, 0x70, 0xc8,\n\t\t\t\t\t0xc8, 0x20, 0xb9, 0x48, 0xed, 0xfa, 0xd3, 0xa8, 0x73, 0xd8},\n\t\t\t\tCustomParams.ScriptHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tpkHash := []byte{\n\t\t\t\t\t0xEE, 0x34, 0xAC, 0x67, 0x6B, 0xDA, 0xF6, 0xE3, 0x70, 0xC8,\n\t\t\t\t\t0xC8, 0x20, 0xB9, 0x48, 0xED, 0xFA, 0xD3, 0xA8, 0x73, 0xD8}\n\t\t\t\treturn btcutil.NewAddressScriptHashFromHash(pkHash, &customParams)\n\t\t\t},\n\t\t\tnet: &customParams,\n\t\t},\n\t\t{\n\t\t\t// Taken from transactions:\n\t\t\t// output: b0539a45de13b3e0403909b8bd1a555b8cbe45fd4e3f3fda76f3a5f52835c29d\n\t\t\t// input: (not yet redeemed at time test was written)\n\t\t\tname:    \"mainnet p2sh 2\",\n\t\t\taddr:    \"3NukJ6fYZJ5Kk8bPjycAnruZkE5Q7UW7i8\",\n\t\t\tencoded: \"3NukJ6fYZJ5Kk8bPjycAnruZkE5Q7UW7i8\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressScriptHash(\n\t\t\t\t[ripemd160.Size]byte{\n\t\t\t\t\t0xe8, 0xc3, 0x00, 0xc8, 0x79, 0x86, 0xef, 0xa8, 0x4c, 0x37,\n\t\t\t\t\t0xc0, 0x51, 0x99, 0x29, 0x01, 0x9e, 0xf8, 0x6e, 0xb5, 0xb4},\n\t\t\t\tchaincfg.MainNetParams.ScriptHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\thash := []byte{\n\t\t\t\t\t0xe8, 0xc3, 0x00, 0xc8, 0x79, 0x86, 0xef, 0xa8, 0x4c, 0x37,\n\t\t\t\t\t0xc0, 0x51, 0x99, 0x29, 0x01, 0x9e, 0xf8, 0x6e, 0xb5, 0xb4}\n\t\t\t\treturn btcutil.NewAddressScriptHashFromHash(hash, &chaincfg.MainNetParams)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\t// Taken from bitcoind base58_keys_valid.\n\t\t\tname:    \"testnet p2sh\",\n\t\t\taddr:    \"2NBFNJTktNa7GZusGbDbGKRZTxdK9VVez3n\",\n\t\t\tencoded: \"2NBFNJTktNa7GZusGbDbGKRZTxdK9VVez3n\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressScriptHash(\n\t\t\t\t[ripemd160.Size]byte{\n\t\t\t\t\t0xc5, 0x79, 0x34, 0x2c, 0x2c, 0x4c, 0x92, 0x20, 0x20, 0x5e,\n\t\t\t\t\t0x2c, 0xdc, 0x28, 0x56, 0x17, 0x04, 0x0c, 0x92, 0x4a, 0x0a},\n\t\t\t\tchaincfg.TestNet3Params.ScriptHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\thash := []byte{\n\t\t\t\t\t0xc5, 0x79, 0x34, 0x2c, 0x2c, 0x4c, 0x92, 0x20, 0x20, 0x5e,\n\t\t\t\t\t0x2c, 0xdc, 0x28, 0x56, 0x17, 0x04, 0x0c, 0x92, 0x4a, 0x0a}\n\t\t\t\treturn btcutil.NewAddressScriptHashFromHash(hash, &chaincfg.TestNet3Params)\n\t\t\t},\n\t\t\tnet: &chaincfg.TestNet3Params,\n\t\t},\n\n\t\t// Negative P2SH tests.\n\t\t{\n\t\t\tname:  \"p2sh wrong hash length\",\n\t\t\taddr:  \"\",\n\t\t\tvalid: false,\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\thash := []byte{\n\t\t\t\t\t0x00, 0xf8, 0x15, 0xb0, 0x36, 0xd9, 0xbb, 0xbc, 0xe5, 0xe9,\n\t\t\t\t\t0xf2, 0xa0, 0x0a, 0xbd, 0x1b, 0xf3, 0xdc, 0x91, 0xe9, 0x55,\n\t\t\t\t\t0x10}\n\t\t\t\treturn btcutil.NewAddressScriptHashFromHash(hash, &chaincfg.MainNetParams)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\n\t\t// Positive P2PK tests.\n\t\t{\n\t\t\tname:    \"mainnet p2pk compressed (0x02)\",\n\t\t\taddr:    \"02192d74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4\",\n\t\t\tencoded: \"13CG6SJ3yHUXo4Cr2RY4THLLJrNFuG3gUg\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressPubKey(\n\t\t\t\t[]byte{\n\t\t\t\t\t0x02, 0x19, 0x2d, 0x74, 0xd0, 0xcb, 0x94, 0x34, 0x4c, 0x95,\n\t\t\t\t\t0x69, 0xc2, 0xe7, 0x79, 0x01, 0x57, 0x3d, 0x8d, 0x79, 0x03,\n\t\t\t\t\t0xc3, 0xeb, 0xec, 0x3a, 0x95, 0x77, 0x24, 0x89, 0x5d, 0xca,\n\t\t\t\t\t0x52, 0xc6, 0xb4},\n\t\t\t\tbtcutil.PKFCompressed, chaincfg.MainNetParams.PubKeyHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tserializedPubKey := []byte{\n\t\t\t\t\t0x02, 0x19, 0x2d, 0x74, 0xd0, 0xcb, 0x94, 0x34, 0x4c, 0x95,\n\t\t\t\t\t0x69, 0xc2, 0xe7, 0x79, 0x01, 0x57, 0x3d, 0x8d, 0x79, 0x03,\n\t\t\t\t\t0xc3, 0xeb, 0xec, 0x3a, 0x95, 0x77, 0x24, 0x89, 0x5d, 0xca,\n\t\t\t\t\t0x52, 0xc6, 0xb4}\n\t\t\t\treturn btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.MainNetParams)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:    \"mainnet p2pk compressed (0x03)\",\n\t\t\taddr:    \"03b0bd634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e65\",\n\t\t\tencoded: \"15sHANNUBSh6nDp8XkDPmQcW6n3EFwmvE6\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressPubKey(\n\t\t\t\t[]byte{\n\t\t\t\t\t0x03, 0xb0, 0xbd, 0x63, 0x42, 0x34, 0xab, 0xbb, 0x1b, 0xa1,\n\t\t\t\t\t0xe9, 0x86, 0xe8, 0x84, 0x18, 0x5c, 0x61, 0xcf, 0x43, 0xe0,\n\t\t\t\t\t0x01, 0xf9, 0x13, 0x7f, 0x23, 0xc2, 0xc4, 0x09, 0x27, 0x3e,\n\t\t\t\t\t0xb1, 0x6e, 0x65},\n\t\t\t\tbtcutil.PKFCompressed, chaincfg.MainNetParams.PubKeyHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tserializedPubKey := []byte{\n\t\t\t\t\t0x03, 0xb0, 0xbd, 0x63, 0x42, 0x34, 0xab, 0xbb, 0x1b, 0xa1,\n\t\t\t\t\t0xe9, 0x86, 0xe8, 0x84, 0x18, 0x5c, 0x61, 0xcf, 0x43, 0xe0,\n\t\t\t\t\t0x01, 0xf9, 0x13, 0x7f, 0x23, 0xc2, 0xc4, 0x09, 0x27, 0x3e,\n\t\t\t\t\t0xb1, 0x6e, 0x65}\n\t\t\t\treturn btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.MainNetParams)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname: \"mainnet p2pk uncompressed (0x04)\",\n\t\t\taddr: \"0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2\" +\n\t\t\t\t\"e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3\",\n\t\t\tencoded: \"12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressPubKey(\n\t\t\t\t[]byte{\n\t\t\t\t\t0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b,\n\t\t\t\t\t0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38,\n\t\t\t\t\t0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6,\n\t\t\t\t\t0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc,\n\t\t\t\t\t0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b,\n\t\t\t\t\t0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43,\n\t\t\t\t\t0xf6, 0x56, 0xb4, 0x12, 0xa3},\n\t\t\t\tbtcutil.PKFUncompressed, chaincfg.MainNetParams.PubKeyHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tserializedPubKey := []byte{\n\t\t\t\t\t0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b,\n\t\t\t\t\t0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38,\n\t\t\t\t\t0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6,\n\t\t\t\t\t0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc,\n\t\t\t\t\t0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b,\n\t\t\t\t\t0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43,\n\t\t\t\t\t0xf6, 0x56, 0xb4, 0x12, 0xa3}\n\t\t\t\treturn btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.MainNetParams)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:    \"testnet p2pk compressed (0x02)\",\n\t\t\taddr:    \"02192d74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4\",\n\t\t\tencoded: \"mhiDPVP2nJunaAgTjzWSHCYfAqxxrxzjmo\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressPubKey(\n\t\t\t\t[]byte{\n\t\t\t\t\t0x02, 0x19, 0x2d, 0x74, 0xd0, 0xcb, 0x94, 0x34, 0x4c, 0x95,\n\t\t\t\t\t0x69, 0xc2, 0xe7, 0x79, 0x01, 0x57, 0x3d, 0x8d, 0x79, 0x03,\n\t\t\t\t\t0xc3, 0xeb, 0xec, 0x3a, 0x95, 0x77, 0x24, 0x89, 0x5d, 0xca,\n\t\t\t\t\t0x52, 0xc6, 0xb4},\n\t\t\t\tbtcutil.PKFCompressed, chaincfg.TestNet3Params.PubKeyHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tserializedPubKey := []byte{\n\t\t\t\t\t0x02, 0x19, 0x2d, 0x74, 0xd0, 0xcb, 0x94, 0x34, 0x4c, 0x95,\n\t\t\t\t\t0x69, 0xc2, 0xe7, 0x79, 0x01, 0x57, 0x3d, 0x8d, 0x79, 0x03,\n\t\t\t\t\t0xc3, 0xeb, 0xec, 0x3a, 0x95, 0x77, 0x24, 0x89, 0x5d, 0xca,\n\t\t\t\t\t0x52, 0xc6, 0xb4}\n\t\t\t\treturn btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.TestNet3Params)\n\t\t\t},\n\t\t\tnet: &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:    \"testnet p2pk compressed (0x03)\",\n\t\t\taddr:    \"03b0bd634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e65\",\n\t\t\tencoded: \"mkPETRTSzU8MZLHkFKBmbKppxmdw9qT42t\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressPubKey(\n\t\t\t\t[]byte{\n\t\t\t\t\t0x03, 0xb0, 0xbd, 0x63, 0x42, 0x34, 0xab, 0xbb, 0x1b, 0xa1,\n\t\t\t\t\t0xe9, 0x86, 0xe8, 0x84, 0x18, 0x5c, 0x61, 0xcf, 0x43, 0xe0,\n\t\t\t\t\t0x01, 0xf9, 0x13, 0x7f, 0x23, 0xc2, 0xc4, 0x09, 0x27, 0x3e,\n\t\t\t\t\t0xb1, 0x6e, 0x65},\n\t\t\t\tbtcutil.PKFCompressed, chaincfg.TestNet3Params.PubKeyHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tserializedPubKey := []byte{\n\t\t\t\t\t0x03, 0xb0, 0xbd, 0x63, 0x42, 0x34, 0xab, 0xbb, 0x1b, 0xa1,\n\t\t\t\t\t0xe9, 0x86, 0xe8, 0x84, 0x18, 0x5c, 0x61, 0xcf, 0x43, 0xe0,\n\t\t\t\t\t0x01, 0xf9, 0x13, 0x7f, 0x23, 0xc2, 0xc4, 0x09, 0x27, 0x3e,\n\t\t\t\t\t0xb1, 0x6e, 0x65}\n\t\t\t\treturn btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.TestNet3Params)\n\t\t\t},\n\t\t\tnet: &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname: \"testnet p2pk uncompressed (0x04)\",\n\t\t\taddr: \"0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5\" +\n\t\t\t\t\"cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3\",\n\t\t\tencoded: \"mh8YhPYEAYs3E7EVyKtB5xrcfMExkkdEMF\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressPubKey(\n\t\t\t\t[]byte{\n\t\t\t\t\t0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b,\n\t\t\t\t\t0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38,\n\t\t\t\t\t0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6,\n\t\t\t\t\t0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc,\n\t\t\t\t\t0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b,\n\t\t\t\t\t0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43,\n\t\t\t\t\t0xf6, 0x56, 0xb4, 0x12, 0xa3},\n\t\t\t\tbtcutil.PKFUncompressed, chaincfg.TestNet3Params.PubKeyHashAddrID),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tserializedPubKey := []byte{\n\t\t\t\t\t0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a, 0x01, 0x6b,\n\t\t\t\t\t0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e, 0xb6, 0x8a, 0x38,\n\t\t\t\t\t0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca, 0xd7, 0xb1, 0x48, 0xa6,\n\t\t\t\t\t0x90, 0x9a, 0x5c, 0xb2, 0xe0, 0xea, 0xdd, 0xfb, 0x84, 0xcc,\n\t\t\t\t\t0xf9, 0x74, 0x44, 0x64, 0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b,\n\t\t\t\t\t0x8b, 0x64, 0xf9, 0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43,\n\t\t\t\t\t0xf6, 0x56, 0xb4, 0x12, 0xa3}\n\t\t\t\treturn btcutil.NewAddressPubKey(serializedPubKey, &chaincfg.TestNet3Params)\n\t\t\t},\n\t\t\tnet: &chaincfg.TestNet3Params,\n\t\t},\n\t\t// Segwit address tests.\n\t\t{\n\t\t\tname:    \"segwit mainnet p2wpkh v0\",\n\t\t\taddr:    \"BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4\",\n\t\t\tencoded: \"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressWitnessPubKeyHash(\n\t\t\t\t0,\n\t\t\t\t[20]byte{\n\t\t\t\t\t0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94,\n\t\t\t\t\t0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6},\n\t\t\t\tchaincfg.MainNetParams.Bech32HRPSegwit),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tpkHash := []byte{\n\t\t\t\t\t0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94,\n\t\t\t\t\t0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6}\n\t\t\t\treturn btcutil.NewAddressWitnessPubKeyHash(pkHash, &chaincfg.MainNetParams)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:    \"segwit mainnet p2wsh v0\",\n\t\t\taddr:    \"bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3\",\n\t\t\tencoded: \"bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressWitnessScriptHash(\n\t\t\t\t0,\n\t\t\t\t[32]byte{\n\t\t\t\t\t0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68,\n\t\t\t\t\t0x04, 0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13,\n\t\t\t\t\t0x6c, 0x98, 0x56, 0x78, 0xcd, 0x4d, 0x27, 0xa1,\n\t\t\t\t\t0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, 0x62},\n\t\t\t\tchaincfg.MainNetParams.Bech32HRPSegwit),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tscriptHash := []byte{\n\t\t\t\t\t0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68,\n\t\t\t\t\t0x04, 0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13,\n\t\t\t\t\t0x6c, 0x98, 0x56, 0x78, 0xcd, 0x4d, 0x27, 0xa1,\n\t\t\t\t\t0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, 0x62}\n\t\t\t\treturn btcutil.NewAddressWitnessScriptHash(scriptHash, &chaincfg.MainNetParams)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:    \"segwit testnet p2wpkh v0\",\n\t\t\taddr:    \"tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx\",\n\t\t\tencoded: \"tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressWitnessPubKeyHash(\n\t\t\t\t0,\n\t\t\t\t[20]byte{\n\t\t\t\t\t0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94,\n\t\t\t\t\t0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6},\n\t\t\t\tchaincfg.TestNet3Params.Bech32HRPSegwit),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tpkHash := []byte{\n\t\t\t\t\t0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94,\n\t\t\t\t\t0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6}\n\t\t\t\treturn btcutil.NewAddressWitnessPubKeyHash(pkHash, &chaincfg.TestNet3Params)\n\t\t\t},\n\t\t\tnet: &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:    \"segwit testnet p2wsh v0\",\n\t\t\taddr:    \"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7\",\n\t\t\tencoded: \"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressWitnessScriptHash(\n\t\t\t\t0,\n\t\t\t\t[32]byte{\n\t\t\t\t\t0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68,\n\t\t\t\t\t0x04, 0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13,\n\t\t\t\t\t0x6c, 0x98, 0x56, 0x78, 0xcd, 0x4d, 0x27, 0xa1,\n\t\t\t\t\t0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, 0x62},\n\t\t\t\tchaincfg.TestNet3Params.Bech32HRPSegwit),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tscriptHash := []byte{\n\t\t\t\t\t0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68,\n\t\t\t\t\t0x04, 0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13,\n\t\t\t\t\t0x6c, 0x98, 0x56, 0x78, 0xcd, 0x4d, 0x27, 0xa1,\n\t\t\t\t\t0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, 0x62}\n\t\t\t\treturn btcutil.NewAddressWitnessScriptHash(scriptHash, &chaincfg.TestNet3Params)\n\t\t\t},\n\t\t\tnet: &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:    \"segwit testnet p2wsh witness v0\",\n\t\t\taddr:    \"tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy\",\n\t\t\tencoded: \"tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressWitnessScriptHash(\n\t\t\t\t0,\n\t\t\t\t[32]byte{\n\t\t\t\t\t0x00, 0x00, 0x00, 0xc4, 0xa5, 0xca, 0xd4, 0x62,\n\t\t\t\t\t0x21, 0xb2, 0xa1, 0x87, 0x90, 0x5e, 0x52, 0x66,\n\t\t\t\t\t0x36, 0x2b, 0x99, 0xd5, 0xe9, 0x1c, 0x6c, 0xe2,\n\t\t\t\t\t0x4d, 0x16, 0x5d, 0xab, 0x93, 0xe8, 0x64, 0x33},\n\t\t\t\tchaincfg.TestNet3Params.Bech32HRPSegwit),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tscriptHash := []byte{\n\t\t\t\t\t0x00, 0x00, 0x00, 0xc4, 0xa5, 0xca, 0xd4, 0x62,\n\t\t\t\t\t0x21, 0xb2, 0xa1, 0x87, 0x90, 0x5e, 0x52, 0x66,\n\t\t\t\t\t0x36, 0x2b, 0x99, 0xd5, 0xe9, 0x1c, 0x6c, 0xe2,\n\t\t\t\t\t0x4d, 0x16, 0x5d, 0xab, 0x93, 0xe8, 0x64, 0x33}\n\t\t\t\treturn btcutil.NewAddressWitnessScriptHash(scriptHash, &chaincfg.TestNet3Params)\n\t\t\t},\n\t\t\tnet: &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:    \"segwit litecoin mainnet p2wpkh v0\",\n\t\t\taddr:    \"LTC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KGMN4N9\",\n\t\t\tencoded: \"ltc1qw508d6qejxtdg4y5r3zarvary0c5xw7kgmn4n9\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressWitnessPubKeyHash(\n\t\t\t\t0,\n\t\t\t\t[20]byte{\n\t\t\t\t\t0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94,\n\t\t\t\t\t0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6},\n\t\t\t\tCustomParams.Bech32HRPSegwit,\n\t\t\t),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tpkHash := []byte{\n\t\t\t\t\t0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94,\n\t\t\t\t\t0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6}\n\t\t\t\treturn btcutil.NewAddressWitnessPubKeyHash(pkHash, &customParams)\n\t\t\t},\n\t\t\tnet: &customParams,\n\t\t},\n\n\t\t// P2TR address tests.\n\t\t{\n\t\t\tname:    \"segwit v1 mainnet p2tr\",\n\t\t\taddr:    \"bc1paardr2nczq0rx5rqpfwnvpzm497zvux64y0f7wjgcs7xuuuh2nnqwr2d5c\",\n\t\t\tencoded: \"bc1paardr2nczq0rx5rqpfwnvpzm497zvux64y0f7wjgcs7xuuuh2nnqwr2d5c\",\n\t\t\tvalid:   true,\n\t\t\tresult: btcutil.TstAddressTaproot(\n\t\t\t\t1, [32]byte{\n\t\t\t\t\t0xef, 0x46, 0xd1, 0xaa, 0x78, 0x10, 0x1e, 0x33,\n\t\t\t\t\t0x50, 0x60, 0x0a, 0x5d, 0x36, 0x04, 0x5b, 0xa9,\n\t\t\t\t\t0x7c, 0x26, 0x70, 0xda, 0xa9, 0x1e, 0x9f, 0x3a,\n\t\t\t\t\t0x48, 0xc4, 0x3c, 0x6e, 0x73, 0x97, 0x54, 0xe6,\n\t\t\t\t}, chaincfg.MainNetParams.Bech32HRPSegwit,\n\t\t\t),\n\t\t\tf: func() (btcutil.Address, error) {\n\t\t\t\tscriptHash := []byte{\n\t\t\t\t\t0xef, 0x46, 0xd1, 0xaa, 0x78, 0x10, 0x1e, 0x33,\n\t\t\t\t\t0x50, 0x60, 0x0a, 0x5d, 0x36, 0x04, 0x5b, 0xa9,\n\t\t\t\t\t0x7c, 0x26, 0x70, 0xda, 0xa9, 0x1e, 0x9f, 0x3a,\n\t\t\t\t\t0x48, 0xc4, 0x3c, 0x6e, 0x73, 0x97, 0x54, 0xe6,\n\t\t\t\t}\n\t\t\t\treturn btcutil.NewAddressTaproot(\n\t\t\t\t\tscriptHash, &chaincfg.MainNetParams,\n\t\t\t\t)\n\t\t\t},\n\t\t\tnet: &chaincfg.MainNetParams,\n\t\t},\n\n\t\t// Invalid bech32m tests. Source:\n\t\t// https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki\n\t\t{\n\t\t\tname:  \"segwit v1 invalid human-readable part\",\n\t\t\taddr:  \"tc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq5zuyut\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v1 mainnet bech32 instead of bech32m\",\n\t\t\taddr:  \"bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqh2y7hd\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v1 testnet bech32 instead of bech32m\",\n\t\t\taddr:  \"tb1z0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqglt7rf\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v1 mainnet bech32 instead of bech32m upper case\",\n\t\t\taddr:  \"BC1S0XLXVLHEMJA6C4DQV22UAPCTQUPFHLXM9H8Z3K2E72Q4K9HCZ7VQ54WELL\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v0 mainnet bech32m instead of bech32\",\n\t\t\taddr:  \"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kemeawh\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v1 testnet bech32 instead of bech32m second test\",\n\t\t\taddr:  \"tb1q0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq24jc47\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v1 mainnet bech32m invalid character in checksum\",\n\t\t\taddr:  \"bc1p38j9r5y49hruaue7wxjce0updqjuyyx0kh56v8s25huc6995vvpql3jow4\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit mainnet witness v17\",\n\t\t\taddr:  \"BC130XLXVLHEMJA6C4DQV22UAPCTQUPFHLXM9H8Z3K2E72Q4K9HCZ7VQ7ZWS8R\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v1 mainnet bech32m invalid program length (1 byte)\",\n\t\t\taddr:  \"bc1pw5dgrnzv\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v1 mainnet bech32m invalid program length (41 bytes)\",\n\t\t\taddr:  \"bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v8n0nx0muaewav253zgeav\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v1 testnet bech32m mixed case\",\n\t\t\taddr:  \"tb1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq47Zagq\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v1 mainnet bech32m zero padding of more than 4 bits\",\n\t\t\taddr:  \"bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v07qwwzcrf\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v1 mainnet bech32m non-zero padding in 8-to-5-conversion\",\n\t\t\taddr:  \"tb1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vpggkg4j\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit v1 mainnet bech32m empty data section\",\n\t\t\taddr:  \"bc1gmk9yu\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\n\t\t// Unsupported witness versions (version 0 and 1 only supported at this point)\n\t\t{\n\t\t\tname:  \"segwit mainnet witness v16\",\n\t\t\taddr:  \"BC1SW50QA3JX3S\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit mainnet witness v2\",\n\t\t\taddr:  \"bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t// Invalid segwit addresses\n\t\t{\n\t\t\tname:  \"segwit invalid hrp\",\n\t\t\taddr:  \"tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit invalid checksum\",\n\t\t\taddr:  \"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit invalid witness version\",\n\t\t\taddr:  \"BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit invalid program length\",\n\t\t\taddr:  \"bc1rw5uspcuh\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit invalid program length\",\n\t\t\taddr:  \"bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit invalid program length for witness version 0 (per BIP141)\",\n\t\t\taddr:  \"BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit mixed case\",\n\t\t\taddr:  \"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit zero padding of more than 4 bits\",\n\t\t\taddr:  \"tb1pw508d6qejxtdg4y5r3zarqfsj6c3\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:  \"segwit non-zero padding in 8-to-5 conversion\",\n\t\t\taddr:  \"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv\",\n\t\t\tvalid: false,\n\t\t\tnet:   &chaincfg.TestNet3Params,\n\t\t},\n\t}\n\n\tif err := chaincfg.Register(&customParams); err != nil {\n\t\tpanic(err)\n\t}\n\n\tfor _, test := range tests {\n\t\t// Decode addr and compare error against valid.\n\t\tdecoded, err := btcutil.DecodeAddress(test.addr, test.net)\n\t\tif (err == nil) != test.valid {\n\t\t\tt.Errorf(\"%v: decoding test failed: %v\", test.name, err)\n\t\t\treturn\n\t\t}\n\n\t\tif err == nil {\n\t\t\t// Ensure the stringer returns the same address as the\n\t\t\t// original.\n\t\t\tif decodedStringer, ok := decoded.(fmt.Stringer); ok {\n\t\t\t\taddr := test.addr\n\n\t\t\t\t// For Segwit addresses the string representation\n\t\t\t\t// will always be lower case, so in that case we\n\t\t\t\t// convert the original to lower case first.\n\t\t\t\tif strings.Contains(test.name, \"segwit\") {\n\t\t\t\t\taddr = strings.ToLower(addr)\n\t\t\t\t}\n\n\t\t\t\tif addr != decodedStringer.String() {\n\t\t\t\t\tt.Errorf(\"%v: String on decoded value does not match expected value: %v != %v\",\n\t\t\t\t\t\ttest.name, test.addr, decodedStringer.String())\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Encode again and compare against the original.\n\t\t\tencoded := decoded.EncodeAddress()\n\t\t\tif test.encoded != encoded {\n\t\t\t\tt.Errorf(\"%v: decoding and encoding produced different addresses: %v != %v\",\n\t\t\t\t\ttest.name, test.encoded, encoded)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Perform type-specific calculations.\n\t\t\tvar saddr []byte\n\t\t\tswitch d := decoded.(type) {\n\t\t\tcase *btcutil.AddressPubKeyHash:\n\t\t\t\tsaddr = btcutil.TstAddressSAddr(encoded)\n\n\t\t\tcase *btcutil.AddressScriptHash:\n\t\t\t\tsaddr = btcutil.TstAddressSAddr(encoded)\n\n\t\t\tcase *btcutil.AddressPubKey:\n\t\t\t\t// Ignore the error here since the script\n\t\t\t\t// address is checked below.\n\t\t\t\tsaddr, _ = hex.DecodeString(d.String())\n\t\t\tcase *btcutil.AddressWitnessPubKeyHash:\n\t\t\t\tsaddr = btcutil.TstAddressSegwitSAddr(encoded)\n\t\t\tcase *btcutil.AddressWitnessScriptHash:\n\t\t\t\tsaddr = btcutil.TstAddressSegwitSAddr(encoded)\n\t\t\tcase *btcutil.AddressTaproot:\n\t\t\t\tsaddr = btcutil.TstAddressTaprootSAddr(encoded)\n\t\t\t}\n\n\t\t\t// Check script address, as well as the Hash160 method for P2PKH and\n\t\t\t// P2SH addresses.\n\t\t\tif !bytes.Equal(saddr, decoded.ScriptAddress()) {\n\t\t\t\tt.Errorf(\"%v: script addresses do not match:\\n%x != \\n%x\",\n\t\t\t\t\ttest.name, saddr, decoded.ScriptAddress())\n\t\t\t\treturn\n\t\t\t}\n\t\t\tswitch a := decoded.(type) {\n\t\t\tcase *btcutil.AddressPubKeyHash:\n\t\t\t\tif h := a.Hash160()[:]; !bytes.Equal(saddr, h) {\n\t\t\t\t\tt.Errorf(\"%v: hashes do not match:\\n%x != \\n%x\",\n\t\t\t\t\t\ttest.name, saddr, h)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\tcase *btcutil.AddressScriptHash:\n\t\t\t\tif h := a.Hash160()[:]; !bytes.Equal(saddr, h) {\n\t\t\t\t\tt.Errorf(\"%v: hashes do not match:\\n%x != \\n%x\",\n\t\t\t\t\t\ttest.name, saddr, h)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\tcase *btcutil.AddressWitnessPubKeyHash:\n\t\t\t\tif hrp := a.Hrp(); test.net.Bech32HRPSegwit != hrp {\n\t\t\t\t\tt.Errorf(\"%v: hrps do not match:\\n%x != \\n%x\",\n\t\t\t\t\t\ttest.name, test.net.Bech32HRPSegwit, hrp)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\texpVer := test.result.(*btcutil.AddressWitnessPubKeyHash).WitnessVersion()\n\t\t\t\tif v := a.WitnessVersion(); v != expVer {\n\t\t\t\t\tt.Errorf(\"%v: witness versions do not match:\\n%x != \\n%x\",\n\t\t\t\t\t\ttest.name, expVer, v)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif p := a.WitnessProgram(); !bytes.Equal(saddr, p) {\n\t\t\t\t\tt.Errorf(\"%v: witness programs do not match:\\n%x != \\n%x\",\n\t\t\t\t\t\ttest.name, saddr, p)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\tcase *btcutil.AddressWitnessScriptHash:\n\t\t\t\tif hrp := a.Hrp(); test.net.Bech32HRPSegwit != hrp {\n\t\t\t\t\tt.Errorf(\"%v: hrps do not match:\\n%x != \\n%x\",\n\t\t\t\t\t\ttest.name, test.net.Bech32HRPSegwit, hrp)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\texpVer := test.result.(*btcutil.AddressWitnessScriptHash).WitnessVersion()\n\t\t\t\tif v := a.WitnessVersion(); v != expVer {\n\t\t\t\t\tt.Errorf(\"%v: witness versions do not match:\\n%x != \\n%x\",\n\t\t\t\t\t\ttest.name, expVer, v)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif p := a.WitnessProgram(); !bytes.Equal(saddr, p) {\n\t\t\t\t\tt.Errorf(\"%v: witness programs do not match:\\n%x != \\n%x\",\n\t\t\t\t\t\ttest.name, saddr, p)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ensure the address is for the expected network.\n\t\t\tif !decoded.IsForNet(test.net) {\n\t\t\t\tt.Errorf(\"%v: calculated network does not match expected\",\n\t\t\t\t\ttest.name)\n\t\t\t\treturn\n\t\t\t}\n\t\t} else {\n\t\t\t// If there is an error, make sure we can print it\n\t\t\t// correctly.\n\t\t\terrStr := err.Error()\n\t\t\tif errStr == \"\" {\n\t\t\t\tt.Errorf(\"%v: error was non-nil but message is\"+\n\t\t\t\t\t\"empty: %v\", test.name, err)\n\t\t\t}\n\t\t}\n\n\t\tif !test.valid {\n\t\t\t// If address is invalid, but a creation function exists,\n\t\t\t// verify that it returns a nil addr and non-nil error.\n\t\t\tif test.f != nil {\n\t\t\t\t_, err := test.f()\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"%v: address is invalid but creating new address succeeded\",\n\t\t\t\t\t\ttest.name)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Valid test, compare address created with f against expected result.\n\t\taddr, err := test.f()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%v: address is valid but creating new address failed with error %v\",\n\t\t\t\ttest.name, err)\n\t\t\treturn\n\t\t}\n\n\t\tif !reflect.DeepEqual(addr, test.result) {\n\t\t\tt.Errorf(\"%v: created address does not match expected result\",\n\t\t\t\ttest.name)\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcutil/amount.go",
    "content": "// Copyright (c) 2013, 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// AmountUnit describes a method of converting an Amount to something\n// other than the base unit of a bitcoin.  The value of the AmountUnit\n// is the exponent component of the decadic multiple to convert from\n// an amount in bitcoin to an amount counted in units.\ntype AmountUnit int\n\n// These constants define various units used when describing a bitcoin\n// monetary amount.\nconst (\n\tAmountMegaBTC  AmountUnit = 6\n\tAmountKiloBTC  AmountUnit = 3\n\tAmountBTC      AmountUnit = 0\n\tAmountMilliBTC AmountUnit = -3\n\tAmountMicroBTC AmountUnit = -6\n\tAmountSatoshi  AmountUnit = -8\n)\n\n// String returns the unit as a string.  For recognized units, the SI\n// prefix is used, or \"Satoshi\" for the base unit.  For all unrecognized\n// units, \"1eN BTC\" is returned, where N is the AmountUnit.\nfunc (u AmountUnit) String() string {\n\tswitch u {\n\tcase AmountMegaBTC:\n\t\treturn \"MBTC\"\n\tcase AmountKiloBTC:\n\t\treturn \"kBTC\"\n\tcase AmountBTC:\n\t\treturn \"BTC\"\n\tcase AmountMilliBTC:\n\t\treturn \"mBTC\"\n\tcase AmountMicroBTC:\n\t\treturn \"μBTC\"\n\tcase AmountSatoshi:\n\t\treturn \"Satoshi\"\n\tdefault:\n\t\treturn \"1e\" + strconv.FormatInt(int64(u), 10) + \" BTC\"\n\t}\n}\n\n// Amount represents the base bitcoin monetary unit (colloquially referred\n// to as a `Satoshi').  A single Amount is equal to 1e-8 of a bitcoin.\ntype Amount int64\n\n// round converts a floating point number, which may or may not be representable\n// as an integer, to the Amount integer type by rounding to the nearest integer.\n// This is performed by adding or subtracting 0.5 depending on the sign, and\n// relying on integer truncation to round the value to the nearest Amount.\nfunc round(f float64) Amount {\n\tif f < 0 {\n\t\treturn Amount(f - 0.5)\n\t}\n\treturn Amount(f + 0.5)\n}\n\n// NewAmount creates an Amount from a floating point value representing\n// some value in bitcoin.  NewAmount errors if f is NaN or +-Infinity, but\n// does not check that the amount is within the total amount of bitcoin\n// producible as f may not refer to an amount at a single moment in time.\n//\n// NewAmount is for specifically for converting BTC to Satoshi.\n// For creating a new Amount with an int64 value which denotes a quantity of Satoshi,\n// do a simple type conversion from type int64 to Amount.\n// See GoDoc for example: http://godoc.org/github.com/btcsuite/btcd/btcutil#example-Amount\nfunc NewAmount(f float64) (Amount, error) {\n\t// The amount is only considered invalid if it cannot be represented\n\t// as an integer type.  This may happen if f is NaN or +-Infinity.\n\tswitch {\n\tcase math.IsNaN(f):\n\t\tfallthrough\n\tcase math.IsInf(f, 1):\n\t\tfallthrough\n\tcase math.IsInf(f, -1):\n\t\treturn 0, errors.New(\"invalid bitcoin amount\")\n\t}\n\n\treturn round(f * SatoshiPerBitcoin), nil\n}\n\n// ToUnit converts a monetary amount counted in bitcoin base units to a\n// floating point value representing an amount of bitcoin.\nfunc (a Amount) ToUnit(u AmountUnit) float64 {\n\treturn float64(a) / math.Pow10(int(u+8))\n}\n\n// ToBTC is the equivalent of calling ToUnit with AmountBTC.\nfunc (a Amount) ToBTC() float64 {\n\treturn a.ToUnit(AmountBTC)\n}\n\n// Format formats a monetary amount counted in bitcoin base units as a\n// string for a given unit.  The conversion will succeed for any unit,\n// however, known units will be formatted with an appended label describing\n// the units with SI notation, or \"Satoshi\" for the base unit.\nfunc (a Amount) Format(u AmountUnit) string {\n\tunits := \" \" + u.String()\n\tformatted := strconv.FormatFloat(a.ToUnit(u), 'f', -int(u+8), 64)\n\n\t// When formatting full BTC, add trailing zeroes for numbers\n\t// with decimal point to ease reading of sat amount.\n\tif u == AmountBTC {\n\t\tif strings.Contains(formatted, \".\") {\n\t\t\treturn fmt.Sprintf(\"%.8f%s\", a.ToUnit(u), units)\n\t\t}\n\t}\n\treturn formatted + units\n}\n\n// String is the equivalent of calling Format with AmountBTC.\nfunc (a Amount) String() string {\n\treturn a.Format(AmountBTC)\n}\n\n// MulF64 multiplies an Amount by a floating point value.  While this is not\n// an operation that must typically be done by a full node or wallet, it is\n// useful for services that build on top of bitcoin (for example, calculating\n// a fee by multiplying by a percentage).\nfunc (a Amount) MulF64(f float64) Amount {\n\treturn round(float64(a) * f)\n}\n"
  },
  {
    "path": "btcutil/amount_test.go",
    "content": "// Copyright (c) 2013, 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil_test\n\nimport (\n\t\"math\"\n\t\"testing\"\n\n\t. \"github.com/btcsuite/btcd/btcutil\"\n)\n\nfunc TestAmountCreation(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tamount   float64\n\t\tvalid    bool\n\t\texpected Amount\n\t}{\n\t\t// Positive tests.\n\t\t{\n\t\t\tname:     \"zero\",\n\t\t\tamount:   0,\n\t\t\tvalid:    true,\n\t\t\texpected: 0,\n\t\t},\n\t\t{\n\t\t\tname:     \"max producible\",\n\t\t\tamount:   21e6,\n\t\t\tvalid:    true,\n\t\t\texpected: MaxSatoshi,\n\t\t},\n\t\t{\n\t\t\tname:     \"min producible\",\n\t\t\tamount:   -21e6,\n\t\t\tvalid:    true,\n\t\t\texpected: -MaxSatoshi,\n\t\t},\n\t\t{\n\t\t\tname:     \"exceeds max producible\",\n\t\t\tamount:   21e6 + 1e-8,\n\t\t\tvalid:    true,\n\t\t\texpected: MaxSatoshi + 1,\n\t\t},\n\t\t{\n\t\t\tname:     \"exceeds min producible\",\n\t\t\tamount:   -21e6 - 1e-8,\n\t\t\tvalid:    true,\n\t\t\texpected: -MaxSatoshi - 1,\n\t\t},\n\t\t{\n\t\t\tname:     \"one hundred\",\n\t\t\tamount:   100,\n\t\t\tvalid:    true,\n\t\t\texpected: 100 * SatoshiPerBitcoin,\n\t\t},\n\t\t{\n\t\t\tname:     \"fraction\",\n\t\t\tamount:   0.01234567,\n\t\t\tvalid:    true,\n\t\t\texpected: 1234567,\n\t\t},\n\t\t{\n\t\t\tname:     \"rounding up\",\n\t\t\tamount:   54.999999999999943157,\n\t\t\tvalid:    true,\n\t\t\texpected: 55 * SatoshiPerBitcoin,\n\t\t},\n\t\t{\n\t\t\tname:     \"rounding down\",\n\t\t\tamount:   55.000000000000056843,\n\t\t\tvalid:    true,\n\t\t\texpected: 55 * SatoshiPerBitcoin,\n\t\t},\n\n\t\t// Negative tests.\n\t\t{\n\t\t\tname:   \"not-a-number\",\n\t\t\tamount: math.NaN(),\n\t\t\tvalid:  false,\n\t\t},\n\t\t{\n\t\t\tname:   \"-infinity\",\n\t\t\tamount: math.Inf(-1),\n\t\t\tvalid:  false,\n\t\t},\n\t\t{\n\t\t\tname:   \"+infinity\",\n\t\t\tamount: math.Inf(1),\n\t\t\tvalid:  false,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\ta, err := NewAmount(test.amount)\n\t\tswitch {\n\t\tcase test.valid && err != nil:\n\t\t\tt.Errorf(\"%v: Positive test Amount creation failed with: %v\", test.name, err)\n\t\t\tcontinue\n\t\tcase !test.valid && err == nil:\n\t\t\tt.Errorf(\"%v: Negative test Amount creation succeeded (value %v) when should fail\", test.name, a)\n\t\t\tcontinue\n\t\t}\n\n\t\tif a != test.expected {\n\t\t\tt.Errorf(\"%v: Created amount %v does not match expected %v\", test.name, a, test.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc TestAmountUnitConversions(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tamount    Amount\n\t\tunit      AmountUnit\n\t\tconverted float64\n\t\ts         string\n\t}{\n\t\t{\n\t\t\tname:      \"MBTC\",\n\t\t\tamount:    MaxSatoshi,\n\t\t\tunit:      AmountMegaBTC,\n\t\t\tconverted: 21,\n\t\t\ts:         \"21 MBTC\",\n\t\t},\n\t\t{\n\t\t\tname:      \"kBTC\",\n\t\t\tamount:    44433322211100,\n\t\t\tunit:      AmountKiloBTC,\n\t\t\tconverted: 444.33322211100,\n\t\t\ts:         \"444.333222111 kBTC\",\n\t\t},\n\t\t{\n\t\t\tname:      \"BTC\",\n\t\t\tamount:    44433322211100,\n\t\t\tunit:      AmountBTC,\n\t\t\tconverted: 444333.222111,\n\t\t\ts:         \"444333.22211100 BTC\",\n\t\t},\n\t\t{\n\t\t\tname:      \"a thousand satoshi as BTC\",\n\t\t\tamount:    1000,\n\t\t\tunit:      AmountBTC,\n\t\t\tconverted: 0.00001,\n\t\t\ts:         \"0.00001000 BTC\",\n\t\t},\n\t\t{\n\t\t\tname:      \"a single satoshi as BTC\",\n\t\t\tamount:    1,\n\t\t\tunit:      AmountBTC,\n\t\t\tconverted: 0.00000001,\n\t\t\ts:         \"0.00000001 BTC\",\n\t\t},\n\t\t{\n\t\t\tname:      \"amount with trailing zero but no decimals\",\n\t\t\tamount:    1000000000,\n\t\t\tunit:      AmountBTC,\n\t\t\tconverted: 10,\n\t\t\ts:         \"10 BTC\",\n\t\t},\n\t\t{\n\t\t\tname:      \"mBTC\",\n\t\t\tamount:    44433322211100,\n\t\t\tunit:      AmountMilliBTC,\n\t\t\tconverted: 444333222.11100,\n\t\t\ts:         \"444333222.111 mBTC\",\n\t\t},\n\t\t{\n\n\t\t\tname:      \"μBTC\",\n\t\t\tamount:    44433322211100,\n\t\t\tunit:      AmountMicroBTC,\n\t\t\tconverted: 444333222111.00,\n\t\t\ts:         \"444333222111 μBTC\",\n\t\t},\n\t\t{\n\n\t\t\tname:      \"satoshi\",\n\t\t\tamount:    44433322211100,\n\t\t\tunit:      AmountSatoshi,\n\t\t\tconverted: 44433322211100,\n\t\t\ts:         \"44433322211100 Satoshi\",\n\t\t},\n\t\t{\n\n\t\t\tname:      \"non-standard unit\",\n\t\t\tamount:    44433322211100,\n\t\t\tunit:      AmountUnit(-1),\n\t\t\tconverted: 4443332.2211100,\n\t\t\ts:         \"4443332.22111 1e-1 BTC\",\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tf := test.amount.ToUnit(test.unit)\n\t\tif f != test.converted {\n\t\t\tt.Errorf(\"%v: converted value %v does not match expected %v\", test.name, f, test.converted)\n\t\t\tcontinue\n\t\t}\n\n\t\ts := test.amount.Format(test.unit)\n\t\tif s != test.s {\n\t\t\tt.Errorf(\"%v: format '%v' does not match expected '%v'\", test.name, s, test.s)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Verify that Amount.ToBTC works as advertised.\n\t\tf1 := test.amount.ToUnit(AmountBTC)\n\t\tf2 := test.amount.ToBTC()\n\t\tif f1 != f2 {\n\t\t\tt.Errorf(\"%v: ToBTC does not match ToUnit(AmountBTC): %v != %v\", test.name, f1, f2)\n\t\t}\n\n\t\t// Verify that Amount.String works as advertised.\n\t\ts1 := test.amount.Format(AmountBTC)\n\t\ts2 := test.amount.String()\n\t\tif s1 != s2 {\n\t\t\tt.Errorf(\"%v: String does not match Format(AmountBitcoin): %v != %v\", test.name, s1, s2)\n\t\t}\n\t}\n}\n\nfunc TestAmountMulF64(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tamt  Amount\n\t\tmul  float64\n\t\tres  Amount\n\t}{\n\t\t{\n\t\t\tname: \"Multiply 0.1 BTC by 2\",\n\t\t\tamt:  100e5, // 0.1 BTC\n\t\t\tmul:  2,\n\t\t\tres:  200e5, // 0.2 BTC\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply 0.2 BTC by 0.02\",\n\t\t\tamt:  200e5, // 0.2 BTC\n\t\t\tmul:  1.02,\n\t\t\tres:  204e5, // 0.204 BTC\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply 0.1 BTC by -2\",\n\t\t\tamt:  100e5, // 0.1 BTC\n\t\t\tmul:  -2,\n\t\t\tres:  -200e5, // -0.2 BTC\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply 0.2 BTC by -0.02\",\n\t\t\tamt:  200e5, // 0.2 BTC\n\t\t\tmul:  -1.02,\n\t\t\tres:  -204e5, // -0.204 BTC\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply -0.1 BTC by 2\",\n\t\t\tamt:  -100e5, // -0.1 BTC\n\t\t\tmul:  2,\n\t\t\tres:  -200e5, // -0.2 BTC\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply -0.2 BTC by 0.02\",\n\t\t\tamt:  -200e5, // -0.2 BTC\n\t\t\tmul:  1.02,\n\t\t\tres:  -204e5, // -0.204 BTC\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply -0.1 BTC by -2\",\n\t\t\tamt:  -100e5, // -0.1 BTC\n\t\t\tmul:  -2,\n\t\t\tres:  200e5, // 0.2 BTC\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply -0.2 BTC by -0.02\",\n\t\t\tamt:  -200e5, // -0.2 BTC\n\t\t\tmul:  -1.02,\n\t\t\tres:  204e5, // 0.204 BTC\n\t\t},\n\t\t{\n\t\t\tname: \"Round down\",\n\t\t\tamt:  49, // 49 Satoshis\n\t\t\tmul:  0.01,\n\t\t\tres:  0,\n\t\t},\n\t\t{\n\t\t\tname: \"Round up\",\n\t\t\tamt:  50, // 50 Satoshis\n\t\t\tmul:  0.01,\n\t\t\tres:  1, // 1 Satoshi\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply by 0.\",\n\t\t\tamt:  1e8, // 1 BTC\n\t\t\tmul:  0,\n\t\t\tres:  0, // 0 BTC\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply 1 by 0.5.\",\n\t\t\tamt:  1, // 1 Satoshi\n\t\t\tmul:  0.5,\n\t\t\tres:  1, // 1 Satoshi\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply 100 by 66%.\",\n\t\t\tamt:  100, // 100 Satoshis\n\t\t\tmul:  0.66,\n\t\t\tres:  66, // 66 Satoshis\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply 100 by 66.6%.\",\n\t\t\tamt:  100, // 100 Satoshis\n\t\t\tmul:  0.666,\n\t\t\tres:  67, // 67 Satoshis\n\t\t},\n\t\t{\n\t\t\tname: \"Multiply 100 by 2/3.\",\n\t\t\tamt:  100, // 100 Satoshis\n\t\t\tmul:  2.0 / 3,\n\t\t\tres:  67, // 67 Satoshis\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\ta := test.amt.MulF64(test.mul)\n\t\tif a != test.res {\n\t\t\tt.Errorf(\"%v: expected %v got %v\", test.name, test.res, a)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcutil/appdata.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\t\"unicode\"\n)\n\n// appDataDir returns an operating system specific directory to be used for\n// storing application data for an application.  See AppDataDir for more\n// details.  This unexported version takes an operating system argument\n// primarily to enable the testing package to properly test the function by\n// forcing an operating system that is not the currently one.\nfunc appDataDir(goos, appName string, roaming bool) string {\n\tif appName == \"\" || appName == \".\" {\n\t\treturn \".\"\n\t}\n\n\t// The caller really shouldn't prepend the appName with a period, but\n\t// if they do, handle it gracefully by trimming it.\n\tappName = strings.TrimPrefix(appName, \".\")\n\tappNameUpper := string(unicode.ToUpper(rune(appName[0]))) + appName[1:]\n\tappNameLower := string(unicode.ToLower(rune(appName[0]))) + appName[1:]\n\n\t// Get the OS specific home directory via the Go standard lib.\n\tvar homeDir string\n\tusr, err := user.Current()\n\tif err == nil {\n\t\thomeDir = usr.HomeDir\n\t}\n\n\t// Fall back to standard HOME environment variable that works\n\t// for most POSIX OSes if the directory from the Go standard\n\t// lib failed.\n\tif err != nil || homeDir == \"\" {\n\t\thomeDir = os.Getenv(\"HOME\")\n\t}\n\n\tswitch goos {\n\t// Attempt to use the LOCALAPPDATA or APPDATA environment variable on\n\t// Windows.\n\tcase \"windows\":\n\t\t// Windows XP and before didn't have a LOCALAPPDATA, so fallback\n\t\t// to regular APPDATA when LOCALAPPDATA is not set.\n\t\tappData := os.Getenv(\"LOCALAPPDATA\")\n\t\tif roaming || appData == \"\" {\n\t\t\tappData = os.Getenv(\"APPDATA\")\n\t\t}\n\n\t\tif appData != \"\" {\n\t\t\treturn filepath.Join(appData, appNameUpper)\n\t\t}\n\n\tcase \"darwin\":\n\t\tif homeDir != \"\" {\n\t\t\treturn filepath.Join(homeDir, \"Library\",\n\t\t\t\t\"Application Support\", appNameUpper)\n\t\t}\n\n\tcase \"plan9\":\n\t\tif homeDir != \"\" {\n\t\t\treturn filepath.Join(homeDir, appNameLower)\n\t\t}\n\n\tdefault:\n\t\tif homeDir != \"\" {\n\t\t\treturn filepath.Join(homeDir, \".\"+appNameLower)\n\t\t}\n\t}\n\n\t// Fall back to the current directory if all else fails.\n\treturn \".\"\n}\n\n// AppDataDir returns an operating system specific directory to be used for\n// storing application data for an application.\n//\n// The appName parameter is the name of the application the data directory is\n// being requested for.  This function will prepend a period to the appName for\n// POSIX style operating systems since that is standard practice.  An empty\n// appName or one with a single dot is treated as requesting the current\n// directory so only \".\" will be returned.  Further, the first character\n// of appName will be made lowercase for POSIX style operating systems and\n// uppercase for Mac and Windows since that is standard practice.\n//\n// The roaming parameter only applies to Windows where it specifies the roaming\n// application data profile (%APPDATA%) should be used instead of the local one\n// (%LOCALAPPDATA%) that is used by default.\n//\n// Example results:\n//\n//\tdir := AppDataDir(\"myapp\", false)\n//\t POSIX (Linux/BSD): ~/.myapp\n//\t Mac OS: $HOME/Library/Application Support/Myapp\n//\t Windows: %LOCALAPPDATA%\\Myapp\n//\t Plan 9: $home/myapp\nfunc AppDataDir(appName string, roaming bool) string {\n\treturn appDataDir(runtime.GOOS, appName, roaming)\n}\n"
  },
  {
    "path": "btcutil/appdata_test.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil_test\n\nimport (\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"testing\"\n\t\"unicode\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n)\n\n// TestAppDataDir tests the API for AppDataDir to ensure it gives expected\n// results for various operating systems.\nfunc TestAppDataDir(t *testing.T) {\n\t// App name plus upper and lowercase variants.\n\tappName := \"myapp\"\n\tappNameUpper := string(unicode.ToUpper(rune(appName[0]))) + appName[1:]\n\tappNameLower := string(unicode.ToLower(rune(appName[0]))) + appName[1:]\n\n\t// When we're on Windows, set the expected local and roaming directories\n\t// per the environment vars.  When we aren't on Windows, the function\n\t// should return the current directory when forced to provide the\n\t// Windows path since the environment variables won't exist.\n\twinLocal := \".\"\n\twinRoaming := \".\"\n\tif runtime.GOOS == \"windows\" {\n\t\tlocalAppData := os.Getenv(\"LOCALAPPDATA\")\n\t\troamingAppData := os.Getenv(\"APPDATA\")\n\t\tif localAppData == \"\" {\n\t\t\tlocalAppData = roamingAppData\n\t\t}\n\t\twinLocal = filepath.Join(localAppData, appNameUpper)\n\t\twinRoaming = filepath.Join(roamingAppData, appNameUpper)\n\t}\n\n\t// Get the home directory to use for testing expected results.\n\tvar homeDir string\n\tusr, err := user.Current()\n\tif err != nil {\n\t\tt.Errorf(\"user.Current: %v\", err)\n\t\treturn\n\t}\n\thomeDir = usr.HomeDir\n\n\t// Mac app data directory.\n\tmacAppData := filepath.Join(homeDir, \"Library\", \"Application Support\")\n\n\ttests := []struct {\n\t\tgoos    string\n\t\tappName string\n\t\troaming bool\n\t\twant    string\n\t}{\n\t\t// Various combinations of application name casing, leading\n\t\t// period, operating system, and roaming flags.\n\t\t{\"windows\", appNameLower, false, winLocal},\n\t\t{\"windows\", appNameUpper, false, winLocal},\n\t\t{\"windows\", \".\" + appNameLower, false, winLocal},\n\t\t{\"windows\", \".\" + appNameUpper, false, winLocal},\n\t\t{\"windows\", appNameLower, true, winRoaming},\n\t\t{\"windows\", appNameUpper, true, winRoaming},\n\t\t{\"windows\", \".\" + appNameLower, true, winRoaming},\n\t\t{\"windows\", \".\" + appNameUpper, true, winRoaming},\n\t\t{\"linux\", appNameLower, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"linux\", appNameUpper, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"linux\", \".\" + appNameLower, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"linux\", \".\" + appNameUpper, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"darwin\", appNameLower, false, filepath.Join(macAppData, appNameUpper)},\n\t\t{\"darwin\", appNameUpper, false, filepath.Join(macAppData, appNameUpper)},\n\t\t{\"darwin\", \".\" + appNameLower, false, filepath.Join(macAppData, appNameUpper)},\n\t\t{\"darwin\", \".\" + appNameUpper, false, filepath.Join(macAppData, appNameUpper)},\n\t\t{\"openbsd\", appNameLower, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"openbsd\", appNameUpper, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"openbsd\", \".\" + appNameLower, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"openbsd\", \".\" + appNameUpper, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"freebsd\", appNameLower, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"freebsd\", appNameUpper, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"freebsd\", \".\" + appNameLower, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"freebsd\", \".\" + appNameUpper, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"netbsd\", appNameLower, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"netbsd\", appNameUpper, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"netbsd\", \".\" + appNameLower, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"netbsd\", \".\" + appNameUpper, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"plan9\", appNameLower, false, filepath.Join(homeDir, appNameLower)},\n\t\t{\"plan9\", appNameUpper, false, filepath.Join(homeDir, appNameLower)},\n\t\t{\"plan9\", \".\" + appNameLower, false, filepath.Join(homeDir, appNameLower)},\n\t\t{\"plan9\", \".\" + appNameUpper, false, filepath.Join(homeDir, appNameLower)},\n\t\t{\"unrecognized\", appNameLower, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"unrecognized\", appNameUpper, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"unrecognized\", \".\" + appNameLower, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\t\t{\"unrecognized\", \".\" + appNameUpper, false, filepath.Join(homeDir, \".\"+appNameLower)},\n\n\t\t// No application name provided, so expect current directory.\n\t\t{\"windows\", \"\", false, \".\"},\n\t\t{\"windows\", \"\", true, \".\"},\n\t\t{\"linux\", \"\", false, \".\"},\n\t\t{\"darwin\", \"\", false, \".\"},\n\t\t{\"openbsd\", \"\", false, \".\"},\n\t\t{\"freebsd\", \"\", false, \".\"},\n\t\t{\"netbsd\", \"\", false, \".\"},\n\t\t{\"plan9\", \"\", false, \".\"},\n\t\t{\"unrecognized\", \"\", false, \".\"},\n\n\t\t// Single dot provided for application name, so expect current\n\t\t// directory.\n\t\t{\"windows\", \".\", false, \".\"},\n\t\t{\"windows\", \".\", true, \".\"},\n\t\t{\"linux\", \".\", false, \".\"},\n\t\t{\"darwin\", \".\", false, \".\"},\n\t\t{\"openbsd\", \".\", false, \".\"},\n\t\t{\"freebsd\", \".\", false, \".\"},\n\t\t{\"netbsd\", \".\", false, \".\"},\n\t\t{\"plan9\", \".\", false, \".\"},\n\t\t{\"unrecognized\", \".\", false, \".\"},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tret := btcutil.TstAppDataDir(test.goos, test.appName, test.roaming)\n\t\tif ret != test.want {\n\t\t\tt.Errorf(\"appDataDir #%d (%s) does not match - \"+\n\t\t\t\t\"expected got %s, want %s\", i, test.goos, ret,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcutil/base58/README.md",
    "content": "base58\n==========\n\n[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/btcutil/base58)\n\nPackage base58 provides an API for encoding and decoding to and from the\nmodified base58 encoding.  It also provides an API to do Base58Check encoding,\nas described [here](https://en.bitcoin.it/wiki/Base58Check_encoding).\n\nA comprehensive suite of tests is provided to ensure proper functionality.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/btcutil/base58\n```\n\n## Examples\n\n* [Decode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/base58#example-Decode)  \n  Demonstrates how to decode modified base58 encoded data.\n* [Encode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/base58#example-Encode)  \n  Demonstrates how to encode data using the modified base58 encoding scheme.\n* [CheckDecode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/base58#example-CheckDecode)  \n  Demonstrates how to decode Base58Check encoded data.\n* [CheckEncode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/base58#example-CheckEncode)  \n  Demonstrates how to encode data using the Base58Check encoding scheme.\n\n## License\n\nPackage base58 is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "btcutil/base58/alphabet.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// AUTOGENERATED by genalphabet.go; do not edit.\n\npackage base58\n\nconst (\n\t// alphabet is the modified base58 alphabet used by Bitcoin.\n\talphabet = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"\n\n\talphabetIdx0 = '1'\n)\n\nvar b58 = [256]byte{\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 0, 1, 2, 3, 4, 5, 6,\n\t7, 8, 255, 255, 255, 255, 255, 255,\n\t255, 9, 10, 11, 12, 13, 14, 15,\n\t16, 255, 17, 18, 19, 20, 21, 255,\n\t22, 23, 24, 25, 26, 27, 28, 29,\n\t30, 31, 32, 255, 255, 255, 255, 255,\n\t255, 33, 34, 35, 36, 37, 38, 39,\n\t40, 41, 42, 43, 255, 44, 45, 46,\n\t47, 48, 49, 50, 51, 52, 53, 54,\n\t55, 56, 57, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n}\n"
  },
  {
    "path": "btcutil/base58/base58.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage base58\n\nimport (\n\t\"math/big\"\n)\n\n//go:generate go run genalphabet.go\n\nvar bigRadix = [...]*big.Int{\n\tbig.NewInt(0),\n\tbig.NewInt(58),\n\tbig.NewInt(58 * 58),\n\tbig.NewInt(58 * 58 * 58),\n\tbig.NewInt(58 * 58 * 58 * 58),\n\tbig.NewInt(58 * 58 * 58 * 58 * 58),\n\tbig.NewInt(58 * 58 * 58 * 58 * 58 * 58),\n\tbig.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58),\n\tbig.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58 * 58),\n\tbig.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58 * 58 * 58),\n\tbigRadix10,\n}\n\nvar bigRadix10 = big.NewInt(58 * 58 * 58 * 58 * 58 * 58 * 58 * 58 * 58 * 58) // 58^10\n\n// Decode decodes a modified base58 string to a byte slice.\nfunc Decode(b string) []byte {\n\tanswer := big.NewInt(0)\n\tscratch := new(big.Int)\n\n\t// Calculating with big.Int is slow for each iteration.\n\t//    x += b58[b[i]] * j\n\t//    j *= 58\n\t//\n\t// Instead we can try to do as much calculations on int64.\n\t// We can represent a 10 digit base58 number using an int64.\n\t//\n\t// Hence we'll try to convert 10, base58 digits at a time.\n\t// The rough idea is to calculate `t`, such that:\n\t//\n\t//   t := b58[b[i+9]] * 58^9 ... + b58[b[i+1]] * 58^1 + b58[b[i]] * 58^0\n\t//   x *= 58^10\n\t//   x += t\n\t//\n\t// Of course, in addition, we'll need to handle boundary condition when `b` is not multiple of 58^10.\n\t// In that case we'll use the bigRadix[n] lookup for the appropriate power.\n\tfor t := b; len(t) > 0; {\n\t\tn := len(t)\n\t\tif n > 10 {\n\t\t\tn = 10\n\t\t}\n\n\t\ttotal := uint64(0)\n\t\tfor _, v := range t[:n] {\n\t\t\tif v > 255 {\n\t\t\t\treturn []byte(\"\")\n\t\t\t}\n\n\t\t\ttmp := b58[v]\n\t\t\tif tmp == 255 {\n\t\t\t\treturn []byte(\"\")\n\t\t\t}\n\t\t\ttotal = total*58 + uint64(tmp)\n\t\t}\n\n\t\tanswer.Mul(answer, bigRadix[n])\n\t\tscratch.SetUint64(total)\n\t\tanswer.Add(answer, scratch)\n\n\t\tt = t[n:]\n\t}\n\n\ttmpval := answer.Bytes()\n\n\tvar numZeros int\n\tfor numZeros = 0; numZeros < len(b); numZeros++ {\n\t\tif b[numZeros] != alphabetIdx0 {\n\t\t\tbreak\n\t\t}\n\t}\n\tflen := numZeros + len(tmpval)\n\tval := make([]byte, flen)\n\tcopy(val[numZeros:], tmpval)\n\n\treturn val\n}\n\n// Encode encodes a byte slice to a modified base58 string.\nfunc Encode(b []byte) string {\n\tx := new(big.Int)\n\tx.SetBytes(b)\n\n\t// maximum length of output is log58(2^(8*len(b))) == len(b) * 8 / log(58)\n\tmaxlen := int(float64(len(b))*1.365658237309761) + 1\n\tanswer := make([]byte, 0, maxlen)\n\tmod := new(big.Int)\n\tfor x.Sign() > 0 {\n\t\t// Calculating with big.Int is slow for each iteration.\n\t\t//    x, mod = x / 58, x % 58\n\t\t//\n\t\t// Instead we can try to do as much calculations on int64.\n\t\t//    x, mod = x / 58^10, x % 58^10\n\t\t//\n\t\t// Which will give us mod, which is 10 digit base58 number.\n\t\t// We'll loop that 10 times to convert to the answer.\n\n\t\tx.DivMod(x, bigRadix10, mod)\n\t\tif x.Sign() == 0 {\n\t\t\t// When x = 0, we need to ensure we don't add any extra zeros.\n\t\t\tm := mod.Int64()\n\t\t\tfor m > 0 {\n\t\t\t\tanswer = append(answer, alphabet[m%58])\n\t\t\t\tm /= 58\n\t\t\t}\n\t\t} else {\n\t\t\tm := mod.Int64()\n\t\t\tfor i := 0; i < 10; i++ {\n\t\t\t\tanswer = append(answer, alphabet[m%58])\n\t\t\t\tm /= 58\n\t\t\t}\n\t\t}\n\t}\n\n\t// leading zero bytes\n\tfor _, i := range b {\n\t\tif i != 0 {\n\t\t\tbreak\n\t\t}\n\t\tanswer = append(answer, alphabetIdx0)\n\t}\n\n\t// reverse\n\talen := len(answer)\n\tfor i := 0; i < alen/2; i++ {\n\t\tanswer[i], answer[alen-1-i] = answer[alen-1-i], answer[i]\n\t}\n\n\treturn string(answer)\n}\n"
  },
  {
    "path": "btcutil/base58/base58_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage base58_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil/base58\"\n)\n\nvar stringTests = []struct {\n\tin  string\n\tout string\n}{\n\t{\"\", \"\"},\n\t{\" \", \"Z\"},\n\t{\"-\", \"n\"},\n\t{\"0\", \"q\"},\n\t{\"1\", \"r\"},\n\t{\"-1\", \"4SU\"},\n\t{\"11\", \"4k8\"},\n\t{\"abc\", \"ZiCa\"},\n\t{\"1234598760\", \"3mJr7AoUXx2Wqd\"},\n\t{\"abcdefghijklmnopqrstuvwxyz\", \"3yxU3u1igY8WkgtjK92fbJQCd4BZiiT1v25f\"},\n\t{\"00000000000000000000000000000000000000000000000000000000000000\", \"3sN2THZeE9Eh9eYrwkvZqNstbHGvrxSAM7gXUXvyFQP8XvQLUqNCS27icwUeDT7ckHm4FUHM2mTVh1vbLmk7y\"},\n}\n\nvar invalidStringTests = []struct {\n\tin  string\n\tout string\n}{\n\t{\"0\", \"\"},\n\t{\"O\", \"\"},\n\t{\"I\", \"\"},\n\t{\"l\", \"\"},\n\t{\"3mJr0\", \"\"},\n\t{\"O3yxU\", \"\"},\n\t{\"3sNI\", \"\"},\n\t{\"4kl8\", \"\"},\n\t{\"0OIl\", \"\"},\n\t{\"!@#$%^&*()-_=+~`\", \"\"},\n\t{\"abcd\\xd80\", \"\"},\n\t{\"abcd\\U000020BF\", \"\"},\n}\n\nvar hexTests = []struct {\n\tin  string\n\tout string\n}{\n\t{\"\", \"\"},\n\t{\"61\", \"2g\"},\n\t{\"626262\", \"a3gV\"},\n\t{\"636363\", \"aPEr\"},\n\t{\"73696d706c792061206c6f6e6720737472696e67\", \"2cFupjhnEsSn59qHXstmK2ffpLv2\"},\n\t{\"00eb15231dfceb60925886b67d065299925915aeb172c06647\", \"1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L\"},\n\t{\"516b6fcd0f\", \"ABnLTmg\"},\n\t{\"bf4f89001e670274dd\", \"3SEo3LWLoPntC\"},\n\t{\"572e4794\", \"3EFU7m\"},\n\t{\"ecac89cad93923c02321\", \"EJDM8drfXA6uyA\"},\n\t{\"10c8511e\", \"Rt5zm\"},\n\t{\"00000000000000000000\", \"1111111111\"},\n\t{\"000111d38e5fc9071ffcd20b4a763cc9ae4f252bb4e48fd66a835e252ada93ff480d6dd43dc62a641155a5\", \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"},\n\t{\"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\", \"1cWB5HCBdLjAuqGGReWE3R3CguuwSjw6RHn39s2yuDRTS5NsBgNiFpWgAnEx6VQi8csexkgYw3mdYrMHr8x9i7aEwP8kZ7vccXWqKDvGv3u1GxFKPuAkn8JCPPGDMf3vMMnbzm6Nh9zh1gcNsMvH3ZNLmP5fSG6DGbbi2tuwMWPthr4boWwCxf7ewSgNQeacyozhKDDQQ1qL5fQFUW52QKUZDZ5fw3KXNQJMcNTcaB723LchjeKun7MuGW5qyCBZYzA1KjofN1gYBV3NqyhQJ3Ns746GNuf9N2pQPmHz4xpnSrrfCvy6TVVz5d4PdrjeshsWQwpZsZGzvbdAdN8MKV5QsBDY\"},\n}\n\nfunc TestBase58(t *testing.T) {\n\t// Encode tests\n\tfor x, test := range stringTests {\n\t\ttmp := []byte(test.in)\n\t\tif res := base58.Encode(tmp); res != test.out {\n\t\t\tt.Errorf(\"Encode test #%d failed: got: %s want: %s\",\n\t\t\t\tx, res, test.out)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// Decode tests\n\tfor x, test := range hexTests {\n\t\tb, err := hex.DecodeString(test.in)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"hex.DecodeString failed failed #%d: got: %s\", x, test.in)\n\t\t\tcontinue\n\t\t}\n\t\tif res := base58.Decode(test.out); !bytes.Equal(res, b) {\n\t\t\tt.Errorf(\"Decode test #%d failed: got: %q want: %q\",\n\t\t\t\tx, res, test.in)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// Decode with invalid input\n\tfor x, test := range invalidStringTests {\n\t\tif res := base58.Decode(test.in); string(res) != test.out {\n\t\t\tt.Errorf(\"Decode invalidString test #%d failed: got: %q want: %q\",\n\t\t\t\tx, res, test.out)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcutil/base58/base58bench_test.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage base58_test\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil/base58\"\n)\n\nvar (\n\traw5k       = bytes.Repeat([]byte{0xff}, 5000)\n\traw100k     = bytes.Repeat([]byte{0xff}, 100*1000)\n\tencoded5k   = base58.Encode(raw5k)\n\tencoded100k = base58.Encode(raw100k)\n)\n\nfunc BenchmarkBase58Encode_5K(b *testing.B) {\n\tb.SetBytes(int64(len(raw5k)))\n\tfor i := 0; i < b.N; i++ {\n\t\tbase58.Encode(raw5k)\n\t}\n}\n\nfunc BenchmarkBase58Encode_100K(b *testing.B) {\n\tb.SetBytes(int64(len(raw100k)))\n\tfor i := 0; i < b.N; i++ {\n\t\tbase58.Encode(raw100k)\n\t}\n}\n\nfunc BenchmarkBase58Decode_5K(b *testing.B) {\n\tb.SetBytes(int64(len(encoded5k)))\n\tfor i := 0; i < b.N; i++ {\n\t\tbase58.Decode(encoded5k)\n\t}\n}\n\nfunc BenchmarkBase58Decode_100K(b *testing.B) {\n\tb.SetBytes(int64(len(encoded100k)))\n\tfor i := 0; i < b.N; i++ {\n\t\tbase58.Decode(encoded100k)\n\t}\n}\n"
  },
  {
    "path": "btcutil/base58/base58check.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage base58\n\nimport (\n\t\"crypto/sha256\"\n\t\"errors\"\n)\n\n// ErrChecksum indicates that the checksum of a check-encoded string does not verify against\n// the checksum.\nvar ErrChecksum = errors.New(\"checksum error\")\n\n// ErrInvalidFormat indicates that the check-encoded string has an invalid format.\nvar ErrInvalidFormat = errors.New(\"invalid format: version and/or checksum bytes missing\")\n\n// checksum: first four bytes of sha256^2\nfunc checksum(input []byte) (cksum [4]byte) {\n\th := sha256.Sum256(input)\n\th2 := sha256.Sum256(h[:])\n\tcopy(cksum[:], h2[:4])\n\treturn\n}\n\n// CheckEncode prepends a version byte and appends a four byte checksum.\nfunc CheckEncode(input []byte, version byte) string {\n\tb := make([]byte, 0, 1+len(input)+4)\n\tb = append(b, version)\n\tb = append(b, input...)\n\tcksum := checksum(b)\n\tb = append(b, cksum[:]...)\n\treturn Encode(b)\n}\n\n// CheckDecode decodes a string that was encoded with CheckEncode and verifies the checksum.\nfunc CheckDecode(input string) (result []byte, version byte, err error) {\n\tdecoded := Decode(input)\n\tif len(decoded) < 5 {\n\t\treturn nil, 0, ErrInvalidFormat\n\t}\n\tversion = decoded[0]\n\tvar cksum [4]byte\n\tcopy(cksum[:], decoded[len(decoded)-4:])\n\tif checksum(decoded[:len(decoded)-4]) != cksum {\n\t\treturn nil, 0, ErrChecksum\n\t}\n\tpayload := decoded[1 : len(decoded)-4]\n\tresult = append(result, payload...)\n\treturn\n}\n"
  },
  {
    "path": "btcutil/base58/base58check_test.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage base58_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil/base58\"\n)\n\nvar checkEncodingStringTests = []struct {\n\tversion byte\n\tin      string\n\tout     string\n}{\n\t{20, \"\", \"3MNQE1X\"},\n\t{20, \" \", \"B2Kr6dBE\"},\n\t{20, \"-\", \"B3jv1Aft\"},\n\t{20, \"0\", \"B482yuaX\"},\n\t{20, \"1\", \"B4CmeGAC\"},\n\t{20, \"-1\", \"mM7eUf6kB\"},\n\t{20, \"11\", \"mP7BMTDVH\"},\n\t{20, \"abc\", \"4QiVtDjUdeq\"},\n\t{20, \"1234598760\", \"ZmNb8uQn5zvnUohNCEPP\"},\n\t{20, \"abcdefghijklmnopqrstuvwxyz\", \"K2RYDcKfupxwXdWhSAxQPCeiULntKm63UXyx5MvEH2\"},\n\t{20, \"00000000000000000000000000000000000000000000000000000000000000\", \"bi1EWXwJay2udZVxLJozuTb8Meg4W9c6xnmJaRDjg6pri5MBAxb9XwrpQXbtnqEoRV5U2pixnFfwyXC8tRAVC8XxnjK\"},\n}\n\nfunc TestBase58Check(t *testing.T) {\n\tfor x, test := range checkEncodingStringTests {\n\t\t// test encoding\n\t\tif res := base58.CheckEncode([]byte(test.in), test.version); res != test.out {\n\t\t\tt.Errorf(\"CheckEncode test #%d failed: got %s, want: %s\", x, res, test.out)\n\t\t}\n\n\t\t// test decoding\n\t\tres, version, err := base58.CheckDecode(test.out)\n\t\tswitch {\n\t\tcase err != nil:\n\t\t\tt.Errorf(\"CheckDecode test #%d failed with err: %v\", x, err)\n\n\t\tcase version != test.version:\n\t\t\tt.Errorf(\"CheckDecode test #%d failed: got version: %d want: %d\", x, version, test.version)\n\n\t\tcase string(res) != test.in:\n\t\t\tt.Errorf(\"CheckDecode test #%d failed: got: %s want: %s\", x, res, test.in)\n\t\t}\n\t}\n\n\t// test the two decoding failure cases\n\t// case 1: checksum error\n\t_, _, err := base58.CheckDecode(\"3MNQE1Y\")\n\tif err != base58.ErrChecksum {\n\t\tt.Error(\"Checkdecode test failed, expected ErrChecksum\")\n\t}\n\t// case 2: invalid formats (string lengths below 5 mean the version byte and/or the checksum\n\t// bytes are missing).\n\ttestString := \"\"\n\tfor len := 0; len < 4; len++ {\n\t\ttestString += \"x\"\n\t\t_, _, err = base58.CheckDecode(testString)\n\t\tif err != base58.ErrInvalidFormat {\n\t\t\tt.Error(\"Checkdecode test failed, expected ErrInvalidFormat\")\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "btcutil/base58/cov_report.sh",
    "content": "#!/bin/sh\n\n# This script uses the standard Go test coverage tools to generate a test coverage report.\n\n# Run tests with coverage enabled and generate coverage profile.\ngo test -cover -coverprofile=coverage.txt ./...\n\n# Display function-level coverage statistics.\ngo tool cover -func=coverage.txt\n"
  },
  {
    "path": "btcutil/base58/doc.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage base58 provides an API for working with modified base58 and Base58Check\nencodings.\n\n# Modified Base58 Encoding\n\nStandard base58 encoding is similar to standard base64 encoding except, as the\nname implies, it uses a 58 character alphabet which results in an alphanumeric\nstring and allows some characters which are problematic for humans to be\nexcluded.  Due to this, there can be various base58 alphabets.\n\nThe modified base58 alphabet used by Bitcoin, and hence this package, omits the\n0, O, I, and l characters that look the same in many fonts and are therefore\nhard to humans to distinguish.\n\n# Base58Check Encoding Scheme\n\nThe Base58Check encoding scheme is primarily used for Bitcoin addresses at the\ntime of this writing, however it can be used to generically encode arbitrary\nbyte arrays into human-readable strings along with a version byte that can be\nused to differentiate the same payload.  For Bitcoin addresses, the extra\nversion is used to differentiate the network of otherwise identical public keys\nwhich helps prevent using an address intended for one network on another.\n*/\npackage base58\n"
  },
  {
    "path": "btcutil/base58/example_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage base58_test\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcutil/base58\"\n)\n\n// This example demonstrates how to decode modified base58 encoded data.\nfunc ExampleDecode() {\n\t// Decode example modified base58 encoded data.\n\tencoded := \"25JnwSn7XKfNQ\"\n\tdecoded := base58.Decode(encoded)\n\n\t// Show the decoded data.\n\tfmt.Println(\"Decoded Data:\", string(decoded))\n\n\t// Output:\n\t// Decoded Data: Test data\n}\n\n// This example demonstrates how to encode data using the modified base58\n// encoding scheme.\nfunc ExampleEncode() {\n\t// Encode example data with the modified base58 encoding scheme.\n\tdata := []byte(\"Test data\")\n\tencoded := base58.Encode(data)\n\n\t// Show the encoded data.\n\tfmt.Println(\"Encoded Data:\", encoded)\n\n\t// Output:\n\t// Encoded Data: 25JnwSn7XKfNQ\n}\n\n// This example demonstrates how to decode Base58Check encoded data.\nfunc ExampleCheckDecode() {\n\t// Decode an example Base58Check encoded data.\n\tencoded := \"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa\"\n\tdecoded, version, err := base58.CheckDecode(encoded)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Show the decoded data.\n\tfmt.Printf(\"Decoded data: %x\\n\", decoded)\n\tfmt.Println(\"Version Byte:\", version)\n\n\t// Output:\n\t// Decoded data: 62e907b15cbf27d5425399ebf6f0fb50ebb88f18\n\t// Version Byte: 0\n}\n\n// This example demonstrates how to encode data using the Base58Check encoding\n// scheme.\nfunc ExampleCheckEncode() {\n\t// Encode example data with the Base58Check encoding scheme.\n\tdata := []byte(\"Test data\")\n\tencoded := base58.CheckEncode(data, 0)\n\n\t// Show the encoded data.\n\tfmt.Println(\"Encoded Data:\", encoded)\n\n\t// Output:\n\t// Encoded Data: 182iP79GRURMp7oMHDU\n}\n"
  },
  {
    "path": "btcutil/base58/genalphabet.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n//go:build ignore\n// +build ignore\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"strconv\"\n)\n\nvar (\n\tstart = []byte(`// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// AUTOGENERATED by genalphabet.go; do not edit.\n\npackage base58\n\nconst (\n\t// alphabet is the modified base58 alphabet used by Bitcoin.\n\talphabet = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"\n\n\talphabetIdx0 = '1'\n)\n\nvar b58 = [256]byte{`)\n\n\tend = []byte(`}`)\n\n\talphabet = []byte(\"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\")\n\ttab      = []byte(\"\\t\")\n\tinvalid  = []byte(\"255\")\n\tcomma    = []byte(\",\")\n\tspace    = []byte(\" \")\n\tnl       = []byte(\"\\n\")\n)\n\nfunc write(w io.Writer, b []byte) {\n\t_, err := w.Write(b)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\nfunc main() {\n\tfi, err := os.Create(\"alphabet.go\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer fi.Close()\n\n\twrite(fi, start)\n\twrite(fi, nl)\n\tfor i := byte(0); i < 32; i++ {\n\t\twrite(fi, tab)\n\t\tfor j := byte(0); j < 8; j++ {\n\t\t\tidx := bytes.IndexByte(alphabet, i*8+j)\n\t\t\tif idx == -1 {\n\t\t\t\twrite(fi, invalid)\n\t\t\t} else {\n\t\t\t\twrite(fi, strconv.AppendInt(nil, int64(idx), 10))\n\t\t\t}\n\t\t\twrite(fi, comma)\n\t\t\tif j != 7 {\n\t\t\t\twrite(fi, space)\n\t\t\t}\n\t\t}\n\t\twrite(fi, nl)\n\t}\n\twrite(fi, end)\n\twrite(fi, nl)\n}\n"
  },
  {
    "path": "btcutil/bech32/README.md",
    "content": "bech32\n==========\n\n[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://godoc.org/github.com/btcsuite/btcd/btcutil/bech32?status.png)](http://godoc.org/github.com/btcsuite/btcd/btcutil/bech32)\n\nPackage bech32 provides a Go implementation of the bech32 format specified in\n[BIP 173](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki).\n\nTest vectors from BIP 173 are added to ensure compatibility with the BIP.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/btcutil/bech32\n```\n\n## Examples\n\n* [Bech32 decode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/bech32#example-Bech32Decode)\n  Demonstrates how to decode a bech32 encoded string.\n* [Bech32 encode Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/bech32#example-BechEncode)\n  Demonstrates how to encode data into a bech32 string.\n\n## License\n\nPackage bech32 is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "btcutil/bech32/bech32.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Copyright (c) 2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bech32\n\nimport (\n\t\"strings\"\n)\n\n// charset is the set of characters used in the data section of bech32 strings.\n// Note that this is ordered, such that for a given charset[i], i is the binary\n// value of the character.\nconst charset = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\"\n\n// gen encodes the generator polynomial for the bech32 BCH checksum.\nvar gen = []int{0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3}\n\n// toBytes converts each character in the string 'chars' to the value of the\n// index of the corresponding character in 'charset'.\nfunc toBytes(chars string) ([]byte, error) {\n\tdecoded := make([]byte, 0, len(chars))\n\tfor i := 0; i < len(chars); i++ {\n\t\tindex := strings.IndexByte(charset, chars[i])\n\t\tif index < 0 {\n\t\t\treturn nil, ErrNonCharsetChar(chars[i])\n\t\t}\n\t\tdecoded = append(decoded, byte(index))\n\t}\n\treturn decoded, nil\n}\n\n// bech32Polymod calculates the BCH checksum for a given hrp, values and\n// checksum data. Checksum is optional, and if nil a 0 checksum is assumed.\n//\n// Values and checksum (if provided) MUST be encoded as 5 bits per element (base\n// 32), otherwise the results are undefined.\n//\n// For more details on the polymod calculation, please refer to BIP 173.\nfunc bech32Polymod(hrp string, values, checksum []byte) int {\n\tchk := 1\n\n\t// Account for the high bits of the HRP in the checksum.\n\tfor i := 0; i < len(hrp); i++ {\n\t\tb := chk >> 25\n\t\thiBits := int(hrp[i]) >> 5\n\t\tchk = (chk&0x1ffffff)<<5 ^ hiBits\n\t\tfor i := 0; i < 5; i++ {\n\t\t\tif (b>>uint(i))&1 == 1 {\n\t\t\t\tchk ^= gen[i]\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for the separator (0) between high and low bits of the HRP.\n\t// x^0 == x, so we eliminate the redundant xor used in the other rounds.\n\tb := chk >> 25\n\tchk = (chk & 0x1ffffff) << 5\n\tfor i := 0; i < 5; i++ {\n\t\tif (b>>uint(i))&1 == 1 {\n\t\t\tchk ^= gen[i]\n\t\t}\n\t}\n\n\t// Account for the low bits of the HRP.\n\tfor i := 0; i < len(hrp); i++ {\n\t\tb := chk >> 25\n\t\tloBits := int(hrp[i]) & 31\n\t\tchk = (chk&0x1ffffff)<<5 ^ loBits\n\t\tfor i := 0; i < 5; i++ {\n\t\t\tif (b>>uint(i))&1 == 1 {\n\t\t\t\tchk ^= gen[i]\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for the values.\n\tfor _, v := range values {\n\t\tb := chk >> 25\n\t\tchk = (chk&0x1ffffff)<<5 ^ int(v)\n\t\tfor i := 0; i < 5; i++ {\n\t\t\tif (b>>uint(i))&1 == 1 {\n\t\t\t\tchk ^= gen[i]\n\t\t\t}\n\t\t}\n\t}\n\n\tif checksum == nil {\n\t\t// A nil checksum is used during encoding, so assume all bytes are zero.\n\t\t// x^0 == x, so we eliminate the redundant xor used in the other rounds.\n\t\tfor v := 0; v < 6; v++ {\n\t\t\tb := chk >> 25\n\t\t\tchk = (chk & 0x1ffffff) << 5\n\t\t\tfor i := 0; i < 5; i++ {\n\t\t\t\tif (b>>uint(i))&1 == 1 {\n\t\t\t\t\tchk ^= gen[i]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Checksum is provided during decoding, so use it.\n\t\tfor _, v := range checksum {\n\t\t\tb := chk >> 25\n\t\t\tchk = (chk&0x1ffffff)<<5 ^ int(v)\n\t\t\tfor i := 0; i < 5; i++ {\n\t\t\t\tif (b>>uint(i))&1 == 1 {\n\t\t\t\t\tchk ^= gen[i]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chk\n}\n\n// writeBech32Checksum calculates the checksum data expected for a string that\n// will have the given hrp and payload data and writes it to the provided string\n// builder.\n//\n// The payload data MUST be encoded as a base 32 (5 bits per element) byte slice\n// and the hrp MUST only use the allowed character set (ascii chars between 33\n// and 126), otherwise the results are undefined.\n//\n// For more details on the checksum calculation, please refer to BIP 173.\nfunc writeBech32Checksum(hrp string, data []byte, bldr *strings.Builder,\n\tversion Version) {\n\n\tbech32Const := int(VersionToConsts[version])\n\tpolymod := bech32Polymod(hrp, data, nil) ^ bech32Const\n\tfor i := 0; i < 6; i++ {\n\t\tb := byte((polymod >> uint(5*(5-i))) & 31)\n\n\t\t// This can't fail, given we explicitly cap the previous b byte by the\n\t\t// first 31 bits.\n\t\tc := charset[b]\n\t\tbldr.WriteByte(c)\n\t}\n}\n\n// bech32VerifyChecksum verifies whether the bech32 string specified by the\n// provided hrp and payload data (encoded as 5 bits per element byte slice) has\n// the correct checksum suffix. The version of bech32 used (bech32 OG, or\n// bech32m) is also returned to allow the caller to perform proper address\n// validation (segwitv0 should use bech32, v1+ should use bech32m).\n//\n// Data MUST have more than 6 elements, otherwise this function panics.\n//\n// For more details on the checksum verification, please refer to BIP 173.\nfunc bech32VerifyChecksum(hrp string, data []byte) (Version, bool) {\n\tchecksum := data[len(data)-6:]\n\tvalues := data[:len(data)-6]\n\tpolymod := bech32Polymod(hrp, values, checksum)\n\n\t// Before BIP-350, we'd always check this against a static constant of\n\t// 1 to know if the checksum was computed properly. As we want to\n\t// generically support decoding for bech32m as well as bech32, we'll\n\t// look up the returned value and compare it to the set of defined\n\t// constants.\n\tbech32Version, ok := ConstsToVersion[ChecksumConst(polymod)]\n\tif ok {\n\t\treturn bech32Version, true\n\t}\n\n\treturn VersionUnknown, false\n}\n\n// DecodeNoLimitWithVersion is a bech32 checksum version aware arbitrary string\n// length decoder. This function will return the version of the decoded\n// checksum constant so higher level validation can be performed to ensure the\n// correct version of bech32 was used when encoding.\n//\n// Note that the returned data is 5-bit (base32) encoded and the human-readable\n// part will be lowercase.\nfunc DecodeNoLimitWithVersion(bech string) (string, []byte, Version, error) {\n\t// The minimum allowed size of a bech32 string is 8 characters, since it\n\t// needs a non-empty HRP, a separator, and a 6 character checksum.\n\tif len(bech) < 8 {\n\t\treturn \"\", nil, VersionUnknown, ErrInvalidLength(len(bech))\n\t}\n\n\t// Only\tASCII characters between 33 and 126 are allowed.\n\tvar hasLower, hasUpper bool\n\tfor i := 0; i < len(bech); i++ {\n\t\tif bech[i] < 33 || bech[i] > 126 {\n\t\t\treturn \"\", nil, VersionUnknown, ErrInvalidCharacter(bech[i])\n\t\t}\n\n\t\t// The characters must be either all lowercase or all uppercase. Testing\n\t\t// directly with ascii codes is safe here, given the previous test.\n\t\thasLower = hasLower || (bech[i] >= 97 && bech[i] <= 122)\n\t\thasUpper = hasUpper || (bech[i] >= 65 && bech[i] <= 90)\n\t\tif hasLower && hasUpper {\n\t\t\treturn \"\", nil, VersionUnknown, ErrMixedCase{}\n\t\t}\n\t}\n\n\t// Bech32 standard uses only the lowercase for of strings for checksum\n\t// calculation.\n\tif hasUpper {\n\t\tbech = strings.ToLower(bech)\n\t}\n\n\t// The string is invalid if the last '1' is non-existent, it is the\n\t// first character of the string (no human-readable part) or one of the\n\t// last 6 characters of the string (since checksum cannot contain '1').\n\tone := strings.LastIndexByte(bech, '1')\n\tif one < 1 || one+7 > len(bech) {\n\t\treturn \"\", nil, VersionUnknown, ErrInvalidSeparatorIndex(one)\n\t}\n\n\t// The human-readable part is everything before the last '1'.\n\thrp := bech[:one]\n\tdata := bech[one+1:]\n\n\t// Each character corresponds to the byte with value of the index in\n\t// 'charset'.\n\tdecoded, err := toBytes(data)\n\tif err != nil {\n\t\treturn \"\", nil, VersionUnknown, err\n\t}\n\n\t// Verify if the checksum (stored inside decoded[:]) is valid, given the\n\t// previously decoded hrp.\n\tbech32Version, ok := bech32VerifyChecksum(hrp, decoded)\n\tif !ok {\n\t\t// Invalid checksum. Calculate what it should have been, so that the\n\t\t// error contains this information.\n\n\t\t// Extract the payload bytes and actual checksum in the string.\n\t\tactual := bech[len(bech)-6:]\n\t\tpayload := decoded[:len(decoded)-6]\n\n\t\t// Calculate the expected checksum, given the hrp and payload\n\t\t// data. We'll actually compute _both_ possibly valid checksum\n\t\t// to further aide in debugging.\n\t\tvar expectedBldr strings.Builder\n\t\texpectedBldr.Grow(6)\n\t\twriteBech32Checksum(hrp, payload, &expectedBldr, Version0)\n\t\texpectedVersion0 := expectedBldr.String()\n\n\t\tvar b strings.Builder\n\t\tb.Grow(6)\n\t\twriteBech32Checksum(hrp, payload, &expectedBldr, VersionM)\n\t\texpectedVersionM := expectedBldr.String()\n\n\t\terr = ErrInvalidChecksum{\n\t\t\tExpected:  expectedVersion0,\n\t\t\tExpectedM: expectedVersionM,\n\t\t\tActual:    actual,\n\t\t}\n\t\treturn \"\", nil, VersionUnknown, err\n\t}\n\n\t// We exclude the last 6 bytes, which is the checksum.\n\treturn hrp, decoded[:len(decoded)-6], bech32Version, nil\n}\n\n// DecodeNoLimit decodes a bech32 encoded string, returning the human-readable\n// part and the data part excluding the checksum.  This function does NOT\n// validate against the BIP-173 maximum length allowed for bech32 strings and\n// is meant for use in custom applications (such as lightning network payment\n// requests), NOT on-chain addresses.\n//\n// Note that the returned data is 5-bit (base32) encoded and the human-readable\n// part will be lowercase.\nfunc DecodeNoLimit(bech string) (string, []byte, error) {\n\thrp, data, _, err := DecodeNoLimitWithVersion(bech)\n\treturn hrp, data, err\n}\n\n// Decode decodes a bech32 encoded string, returning the human-readable part and\n// the data part excluding the checksum.\n//\n// Note that the returned data is 5-bit (base32) encoded and the human-readable\n// part will be lowercase.\nfunc Decode(bech string) (string, []byte, error) {\n\t// The maximum allowed length for a bech32 string is 90.\n\tif len(bech) > 90 {\n\t\treturn \"\", nil, ErrInvalidLength(len(bech))\n\t}\n\n\thrp, data, _, err := DecodeNoLimitWithVersion(bech)\n\treturn hrp, data, err\n}\n\n// DecodeGeneric is identical to the existing Decode method, but will also\n// return bech32 version that matches the decoded checksum. This method should\n// be used when decoding segwit addresses, as it enables additional\n// verification to ensure the proper checksum is used.\nfunc DecodeGeneric(bech string) (string, []byte, Version, error) {\n\t// The maximum allowed length for a bech32 string is 90.\n\tif len(bech) > 90 {\n\t\treturn \"\", nil, VersionUnknown, ErrInvalidLength(len(bech))\n\t}\n\n\treturn DecodeNoLimitWithVersion(bech)\n}\n\n// encodeGeneric is the base bech32 encoding function that is aware of the\n// existence of the checksum versions. This method is private, as the Encode\n// and EncodeM methods are intended to be used instead.\nfunc encodeGeneric(hrp string, data []byte,\n\tversion Version) (string, error) {\n\n\t// The resulting bech32 string is the concatenation of the lowercase\n\t// hrp, the separator 1, data and the 6-byte checksum.\n\thrp = strings.ToLower(hrp)\n\tvar bldr strings.Builder\n\tbldr.Grow(len(hrp) + 1 + len(data) + 6)\n\tbldr.WriteString(hrp)\n\tbldr.WriteString(\"1\")\n\n\t// Write the data part, using the bech32 charset.\n\tfor _, b := range data {\n\t\tif int(b) >= len(charset) {\n\t\t\treturn \"\", ErrInvalidDataByte(b)\n\t\t}\n\t\tbldr.WriteByte(charset[b])\n\t}\n\n\t// Calculate and write the checksum of the data.\n\twriteBech32Checksum(hrp, data, &bldr, version)\n\n\treturn bldr.String(), nil\n}\n\n// Encode encodes a byte slice into a bech32 string with the given\n// human-readable part (HRP).  The HRP will be converted to lowercase if needed\n// since mixed cased encodings are not permitted and lowercase is used for\n// checksum purposes.  Note that the bytes must each encode 5 bits (base32).\nfunc Encode(hrp string, data []byte) (string, error) {\n\treturn encodeGeneric(hrp, data, Version0)\n}\n\n// EncodeM is the exactly same as the Encode method, but it uses the new\n// bech32m constant instead of the original one. It should be used whenever one\n// attempts to encode a segwit address of v1 and beyond.\nfunc EncodeM(hrp string, data []byte) (string, error) {\n\treturn encodeGeneric(hrp, data, VersionM)\n}\n\n// ConvertBits converts a byte slice where each byte is encoding fromBits bits,\n// to a byte slice where each byte is encoding toBits bits.\nfunc ConvertBits(data []byte, fromBits, toBits uint8, pad bool) ([]byte, error) {\n\tif fromBits < 1 || fromBits > 8 || toBits < 1 || toBits > 8 {\n\t\treturn nil, ErrInvalidBitGroups{}\n\t}\n\n\t// Determine the maximum size the resulting array can have after base\n\t// conversion, so that we can size it a single time. This might be off\n\t// by a byte depending on whether padding is used or not and if the input\n\t// data is a multiple of both fromBits and toBits, but we ignore that and\n\t// just size it to the maximum possible.\n\tmaxSize := len(data)*int(fromBits)/int(toBits) + 1\n\n\t// The final bytes, each byte encoding toBits bits.\n\tregrouped := make([]byte, 0, maxSize)\n\n\t// Keep track of the next byte we create and how many bits we have\n\t// added to it out of the toBits goal.\n\tnextByte := byte(0)\n\tfilledBits := uint8(0)\n\n\tfor _, b := range data {\n\n\t\t// Discard unused bits.\n\t\tb <<= 8 - fromBits\n\n\t\t// How many bits remaining to extract from the input data.\n\t\tremFromBits := fromBits\n\t\tfor remFromBits > 0 {\n\t\t\t// How many bits remaining to be added to the next byte.\n\t\t\tremToBits := toBits - filledBits\n\n\t\t\t// The number of bytes to next extract is the minimum of\n\t\t\t// remFromBits and remToBits.\n\t\t\ttoExtract := remFromBits\n\t\t\tif remToBits < toExtract {\n\t\t\t\ttoExtract = remToBits\n\t\t\t}\n\n\t\t\t// Add the next bits to nextByte, shifting the already\n\t\t\t// added bits to the left.\n\t\t\tnextByte = (nextByte << toExtract) | (b >> (8 - toExtract))\n\n\t\t\t// Discard the bits we just extracted and get ready for\n\t\t\t// next iteration.\n\t\t\tb <<= toExtract\n\t\t\tremFromBits -= toExtract\n\t\t\tfilledBits += toExtract\n\n\t\t\t// If the nextByte is completely filled, we add it to\n\t\t\t// our regrouped bytes and start on the next byte.\n\t\t\tif filledBits == toBits {\n\t\t\t\tregrouped = append(regrouped, nextByte)\n\t\t\t\tfilledBits = 0\n\t\t\t\tnextByte = 0\n\t\t\t}\n\t\t}\n\t}\n\n\t// We pad any unfinished group if specified.\n\tif pad && filledBits > 0 {\n\t\tnextByte <<= toBits - filledBits\n\t\tregrouped = append(regrouped, nextByte)\n\t\tfilledBits = 0\n\t\tnextByte = 0\n\t}\n\n\t// Any incomplete group must be <= 4 bits, and all zeroes.\n\tif filledBits > 0 && (filledBits > 4 || nextByte != 0) {\n\t\treturn nil, ErrInvalidIncompleteGroup{}\n\t}\n\n\treturn regrouped, nil\n}\n\n// EncodeFromBase256 converts a base256-encoded byte slice into a base32-encoded\n// byte slice and then encodes it into a bech32 string with the given\n// human-readable part (HRP).  The HRP will be converted to lowercase if needed\n// since mixed cased encodings are not permitted and lowercase is used for\n// checksum purposes.\nfunc EncodeFromBase256(hrp string, data []byte) (string, error) {\n\tconverted, err := ConvertBits(data, 8, 5, true)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn Encode(hrp, converted)\n}\n\n// DecodeToBase256 decodes a bech32-encoded string into its associated\n// human-readable part (HRP) and base32-encoded data, converts that data to a\n// base256-encoded byte slice and returns it along with the lowercase HRP.\nfunc DecodeToBase256(bech string) (string, []byte, error) {\n\thrp, data, err := Decode(bech)\n\tif err != nil {\n\t\treturn \"\", nil, err\n\t}\n\tconverted, err := ConvertBits(data, 5, 8, false)\n\tif err != nil {\n\t\treturn \"\", nil, err\n\t}\n\treturn hrp, converted, nil\n}\n"
  },
  {
    "path": "btcutil/bech32/bech32_test.go",
    "content": "// Copyright (c) 2017-2020 The btcsuite developers\n// Copyright (c) 2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bech32\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n)\n\n// TestBech32 tests whether decoding and re-encoding the valid BIP-173 test\n// vectors works and if decoding invalid test vectors fails for the correct\n// reason.\nfunc TestBech32(t *testing.T) {\n\ttests := []struct {\n\t\tstr           string\n\t\texpectedError error\n\t}{\n\t\t{\"A12UEL5L\", nil},\n\t\t{\"a12uel5l\", nil},\n\t\t{\"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs\", nil},\n\t\t{\"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw\", nil},\n\t\t{\"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j\", nil},\n\t\t{\"split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w\", nil},\n\t\t{\"split1checkupstagehandshakeupstreamerranterredcaperred2y9e2w\", ErrInvalidChecksum{\"2y9e3w\", \"2y9e3wlc445v\", \"2y9e2w\"}}, // invalid checksum\n\t\t{\"s lit1checkupstagehandshakeupstreamerranterredcaperredp8hs2p\", ErrInvalidCharacter(' ')},                               // invalid character (space) in hrp\n\t\t{\"spl\\x7Ft1checkupstagehandshakeupstreamerranterredcaperred2y9e3w\", ErrInvalidCharacter(127)},                            // invalid character (DEL) in hrp\n\t\t{\"split1cheo2y9e2w\", ErrNonCharsetChar('o')},                                                                             // invalid character (o) in data part\n\t\t{\"split1a2y9w\", ErrInvalidSeparatorIndex(5)},                                                                             // too short data part\n\t\t{\"1checkupstagehandshakeupstreamerranterredcaperred2y9e3w\", ErrInvalidSeparatorIndex(0)},                                 // empty hrp\n\t\t{\"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j\", ErrInvalidLength(91)},    // too long\n\n\t\t// Additional test vectors used in bitcoin core\n\t\t{\" 1nwldj5\", ErrInvalidCharacter(' ')},\n\t\t{\"\\x7f\" + \"1axkwrx\", ErrInvalidCharacter(0x7f)},\n\t\t{\"\\x801eym55h\", ErrInvalidCharacter(0x80)},\n\t\t{\"an84characterslonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1569pvx\", ErrInvalidLength(91)},\n\t\t{\"pzry9x0s0muk\", ErrInvalidSeparatorIndex(-1)},\n\t\t{\"1pzry9x0s0muk\", ErrInvalidSeparatorIndex(0)},\n\t\t{\"x1b4n0q5v\", ErrNonCharsetChar(98)},\n\t\t{\"li1dgmt3\", ErrInvalidSeparatorIndex(2)},\n\t\t{\"de1lg7wt\\xff\", ErrInvalidCharacter(0xff)},\n\t\t{\"A1G7SGD8\", ErrInvalidChecksum{\"2uel5l\", \"2uel5llqfn3a\", \"g7sgd8\"}},\n\t\t{\"10a06t8\", ErrInvalidLength(7)},\n\t\t{\"1qzzfhee\", ErrInvalidSeparatorIndex(0)},\n\t\t{\"a12UEL5L\", ErrMixedCase{}},\n\t\t{\"A12uEL5L\", ErrMixedCase{}},\n\t}\n\n\tfor i, test := range tests {\n\t\tstr := test.str\n\t\thrp, decoded, err := Decode(str)\n\t\tif test.expectedError != err {\n\t\t\tt.Errorf(\"%d: expected decoding error %v \"+\n\t\t\t\t\"instead got %v\", i, test.expectedError, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err != nil {\n\t\t\t// End test case here if a decoding error was expected.\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check that it encodes to the same string\n\t\tencoded, err := Encode(hrp, decoded)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"encoding failed: %v\", err)\n\t\t}\n\n\t\tif encoded != strings.ToLower(str) {\n\t\t\tt.Errorf(\"expected data to encode to %v, but got %v\",\n\t\t\t\tstr, encoded)\n\t\t}\n\n\t\t// Flip a bit in the string an make sure it is caught.\n\t\tpos := strings.LastIndexAny(str, \"1\")\n\t\tflipped := str[:pos+1] + string((str[pos+1] ^ 1)) + str[pos+2:]\n\t\t_, _, err = Decode(flipped)\n\t\tif err == nil {\n\t\t\tt.Error(\"expected decoding to fail\")\n\t\t}\n\t}\n}\n\n// TestBech32M tests that the following set of strings, based on the test\n// vectors in BIP-350 are either valid or invalid using the new bech32m\n// checksum algo. Some of these strings are similar to the set of above test\n// vectors, but end up with different checksums.\nfunc TestBech32M(t *testing.T) {\n\ttests := []struct {\n\t\tstr           string\n\t\texpectedError error\n\t}{\n\t\t{\"A1LQFN3A\", nil},\n\t\t{\"a1lqfn3a\", nil},\n\t\t{\"an83characterlonghumanreadablepartthatcontainsthetheexcludedcharactersbioandnumber11sg7hg6\", nil},\n\t\t{\"abcdef1l7aum6echk45nj3s0wdvt2fg8x9yrzpqzd3ryx\", nil},\n\t\t{\"11llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllludsr8\", nil},\n\t\t{\"split1checkupstagehandshakeupstreamerranterredcaperredlc445v\", nil},\n\t\t{\"?1v759aa\", nil},\n\n\t\t// Additional test vectors used in bitcoin core\n\t\t{\"\\x201xj0phk\", ErrInvalidCharacter('\\x20')},\n\t\t{\"\\x7f1g6xzxy\", ErrInvalidCharacter('\\x7f')},\n\t\t{\"\\x801vctc34\", ErrInvalidCharacter('\\x80')},\n\t\t{\"an84characterslonghumanreadablepartthatcontainsthetheexcludedcharactersbioandnumber11d6pts4\", ErrInvalidLength(91)},\n\t\t{\"qyrz8wqd2c9m\", ErrInvalidSeparatorIndex(-1)},\n\t\t{\"1qyrz8wqd2c9m\", ErrInvalidSeparatorIndex(0)},\n\t\t{\"y1b0jsk6g\", ErrNonCharsetChar(98)},\n\t\t{\"lt1igcx5c0\", ErrNonCharsetChar(105)},\n\t\t{\"in1muywd\", ErrInvalidSeparatorIndex(2)},\n\t\t{\"mm1crxm3i\", ErrNonCharsetChar(105)},\n\t\t{\"au1s5cgom\", ErrNonCharsetChar(111)},\n\t\t{\"M1VUXWEZ\", ErrInvalidChecksum{\"mzl49c\", \"mzl49cw70eq6\", \"vuxwez\"}},\n\t\t{\"16plkw9\", ErrInvalidLength(7)},\n\t\t{\"1p2gdwpf\", ErrInvalidSeparatorIndex(0)},\n\n\t\t{\" 1nwldj5\", ErrInvalidCharacter(' ')},\n\t\t{\"\\x7f\" + \"1axkwrx\", ErrInvalidCharacter(0x7f)},\n\t\t{\"\\x801eym55h\", ErrInvalidCharacter(0x80)},\n\t}\n\n\tfor i, test := range tests {\n\t\tstr := test.str\n\t\thrp, decoded, err := Decode(str)\n\t\tif test.expectedError != err {\n\t\t\tt.Errorf(\"%d: (%v) expected decoding error %v \"+\n\t\t\t\t\"instead got %v\", i, str, test.expectedError,\n\t\t\t\terr)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err != nil {\n\t\t\t// End test case here if a decoding error was expected.\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check that it encodes to the same string, using bech32 m.\n\t\tencoded, err := EncodeM(hrp, decoded)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"encoding failed: %v\", err)\n\t\t}\n\n\t\tif encoded != strings.ToLower(str) {\n\t\t\tt.Errorf(\"expected data to encode to %v, but got %v\",\n\t\t\t\tstr, encoded)\n\t\t}\n\n\t\t// Flip a bit in the string an make sure it is caught.\n\t\tpos := strings.LastIndexAny(str, \"1\")\n\t\tflipped := str[:pos+1] + string((str[pos+1] ^ 1)) + str[pos+2:]\n\t\t_, _, err = Decode(flipped)\n\t\tif err == nil {\n\t\t\tt.Error(\"expected decoding to fail\")\n\t\t}\n\t}\n}\n\n// TestBech32DecodeGeneric tests that given a bech32 string, or a bech32m\n// string, the proper checksum version is returned so that callers can perform\n// segwit addr validation.\nfunc TestBech32DecodeGeneric(t *testing.T) {\n\ttests := []struct {\n\t\tstr     string\n\t\tversion Version\n\t}{\n\t\t{\"A1LQFN3A\", VersionM},\n\t\t{\"a1lqfn3a\", VersionM},\n\t\t{\"an83characterlonghumanreadablepartthatcontainsthetheexcludedcharactersbioandnumber11sg7hg6\", VersionM},\n\t\t{\"abcdef1l7aum6echk45nj3s0wdvt2fg8x9yrzpqzd3ryx\", VersionM},\n\t\t{\"11llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllludsr8\", VersionM},\n\t\t{\"split1checkupstagehandshakeupstreamerranterredcaperredlc445v\", VersionM},\n\t\t{\"?1v759aa\", VersionM},\n\n\t\t{\"A12UEL5L\", Version0},\n\t\t{\"a12uel5l\", Version0},\n\t\t{\"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs\", Version0},\n\t\t{\"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw\", Version0},\n\t\t{\"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j\", Version0},\n\t\t{\"split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w\", Version0},\n\n\t\t{\"BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4\", Version0},\n\t\t{\"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7\", Version0},\n\t\t{\"bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y\", VersionM},\n\t\t{\"BC1SW50QGDZ25J\", VersionM},\n\t\t{\"bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs\", VersionM},\n\t\t{\"tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy\", Version0},\n\t\t{\"tb1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesf3hn0c\", VersionM},\n\t\t{\"bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0\", VersionM},\n\t}\n\tfor i, test := range tests {\n\t\t_, _, version, err := DecodeGeneric(test.str)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%d: (%v) unexpected error during \"+\n\t\t\t\t\"decoding: %v\", i, test.str, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif version != test.version {\n\t\t\tt.Errorf(\"(%v): invalid version: expected %v, got %v\",\n\t\t\t\ttest.str, test.version, version)\n\t\t}\n\t}\n}\n\n// TestMixedCaseEncode ensures mixed case HRPs are converted to lowercase as\n// expected when encoding and that decoding the produced encoding when converted\n// to all uppercase produces the lowercase HRP and original data.\nfunc TestMixedCaseEncode(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\thrp     string\n\t\tdata    string\n\t\tencoded string\n\t}{{\n\t\tname:    \"all uppercase HRP with no data\",\n\t\thrp:     \"A\",\n\t\tdata:    \"\",\n\t\tencoded: \"a12uel5l\",\n\t}, {\n\t\tname:    \"all uppercase HRP with data\",\n\t\thrp:     \"UPPERCASE\",\n\t\tdata:    \"787878\",\n\t\tencoded: \"uppercase10pu8sss7kmp\",\n\t}, {\n\t\tname:    \"mixed case HRP even offsets uppercase\",\n\t\thrp:     \"AbCdEf\",\n\t\tdata:    \"00443214c74254b635cf84653a56d7c675be77df\",\n\t\tencoded: \"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw\",\n\t}, {\n\t\tname:    \"mixed case HRP odd offsets uppercase \",\n\t\thrp:     \"aBcDeF\",\n\t\tdata:    \"00443214c74254b635cf84653a56d7c675be77df\",\n\t\tencoded: \"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw\",\n\t}, {\n\t\tname:    \"all lowercase HRP\",\n\t\thrp:     \"abcdef\",\n\t\tdata:    \"00443214c74254b635cf84653a56d7c675be77df\",\n\t\tencoded: \"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw\",\n\t}}\n\n\tfor _, test := range tests {\n\t\t// Convert the text hex to bytes, convert those bytes from base256 to\n\t\t// base32, then ensure the encoded result with the HRP provided in the\n\t\t// test data is as expected.\n\t\tdata, err := hex.DecodeString(test.data)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%q: invalid hex %q: %v\", test.name, test.data, err)\n\t\t\tcontinue\n\t\t}\n\t\tconvertedData, err := ConvertBits(data, 8, 5, true)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%q: unexpected convert bits error: %v\", test.name,\n\t\t\t\terr)\n\t\t\tcontinue\n\t\t}\n\t\tgotEncoded, err := Encode(test.hrp, convertedData)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%q: unexpected encode error: %v\", test.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif gotEncoded != test.encoded {\n\t\t\tt.Errorf(\"%q: mismatched encoding -- got %q, want %q\", test.name,\n\t\t\t\tgotEncoded, test.encoded)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the decoding the expected lowercase encoding converted to all\n\t\t// uppercase produces the lowercase HRP and original data.\n\t\tgotHRP, gotData, err := Decode(strings.ToUpper(test.encoded))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%q: unexpected decode error: %v\", test.name, err)\n\t\t\tcontinue\n\t\t}\n\t\twantHRP := strings.ToLower(test.hrp)\n\t\tif gotHRP != wantHRP {\n\t\t\tt.Errorf(\"%q: mismatched decoded HRP -- got %q, want %q\", test.name,\n\t\t\t\tgotHRP, wantHRP)\n\t\t\tcontinue\n\t\t}\n\t\tconvertedGotData, err := ConvertBits(gotData, 5, 8, false)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%q: unexpected convert bits error: %v\", test.name,\n\t\t\t\terr)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(convertedGotData, data) {\n\t\t\tt.Errorf(\"%q: mismatched data -- got %x, want %x\", test.name,\n\t\t\t\tconvertedGotData, data)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestCanDecodeUnlimitedBech32 tests whether decoding a large bech32 string works\n// when using the DecodeNoLimit version\nfunc TestCanDecodeUnlimitedBech32(t *testing.T) {\n\tinput := \"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq5kx0yd\"\n\n\t// Sanity check that an input of this length errors on regular Decode()\n\t_, _, err := Decode(input)\n\tif err == nil {\n\t\tt.Fatalf(\"Test vector not appropriate\")\n\t}\n\n\t// Try and decode it.\n\thrp, data, err := DecodeNoLimit(input)\n\tif err != nil {\n\t\tt.Fatalf(\"Expected decoding of large string to work. Got error: %v\", err)\n\t}\n\n\t// Verify data for correctness.\n\tif hrp != \"1\" {\n\t\tt.Fatalf(\"Unexpected hrp: %v\", hrp)\n\t}\n\tdecodedHex := fmt.Sprintf(\"%x\", data)\n\texpected := \"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000\"\n\tif decodedHex != expected {\n\t\tt.Fatalf(\"Unexpected decoded data: %s\", decodedHex)\n\t}\n}\n\n// TestBech32Base256 ensures decoding and encoding various bech32, HRPs, and\n// data produces the expected results when using EncodeFromBase256 and\n// DecodeToBase256.  It includes tests for proper handling of case\n// manipulations.\nfunc TestBech32Base256(t *testing.T) {\n\ttests := []struct {\n\t\tname    string // test name\n\t\tencoded string // bech32 string to decode\n\t\thrp     string // expected human-readable part\n\t\tdata    string // expected hex-encoded data\n\t\terr     error  // expected error\n\t}{{\n\t\tname:    \"all uppercase, no data\",\n\t\tencoded: \"A12UEL5L\",\n\t\thrp:     \"a\",\n\t\tdata:    \"\",\n\t}, {\n\t\tname:    \"long hrp with separator and excluded chars, no data\",\n\t\tencoded: \"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs\",\n\t\thrp:     \"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio\",\n\t\tdata:    \"\",\n\t}, {\n\t\tname:    \"6 char hrp with data with leading zero\",\n\t\tencoded: \"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw\",\n\t\thrp:     \"abcdef\",\n\t\tdata:    \"00443214c74254b635cf84653a56d7c675be77df\",\n\t}, {\n\t\tname:    \"hrp same as separator and max length encoded string\",\n\t\tencoded: \"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j\",\n\t\thrp:     \"1\",\n\t\tdata:    \"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n\t}, {\n\t\tname:    \"5 char hrp with data chosen to produce human-readable data part\",\n\t\tencoded: \"split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w\",\n\t\thrp:     \"split\",\n\t\tdata:    \"c5f38b70305f519bf66d85fb6cf03058f3dde463ecd7918f2dc743918f2d\",\n\t}, {\n\t\tname:    \"same as previous but with checksum invalidated\",\n\t\tencoded: \"split1checkupstagehandshakeupstreamerranterredcaperred2y9e2w\",\n\t\terr:     ErrInvalidChecksum{\"2y9e3w\", \"2y9e3wlc445v\", \"2y9e2w\"},\n\t}, {\n\t\tname:    \"hrp with invalid character (space)\",\n\t\tencoded: \"s lit1checkupstagehandshakeupstreamerranterredcaperredp8hs2p\",\n\t\terr:     ErrInvalidCharacter(' '),\n\t}, {\n\t\tname:    \"hrp with invalid character (DEL)\",\n\t\tencoded: \"spl\\x7ft1checkupstagehandshakeupstreamerranterredcaperred2y9e3w\",\n\t\terr:     ErrInvalidCharacter(127),\n\t}, {\n\t\tname:    \"data part with invalid character (o)\",\n\t\tencoded: \"split1cheo2y9e2w\",\n\t\terr:     ErrNonCharsetChar('o'),\n\t}, {\n\t\tname:    \"data part too short\",\n\t\tencoded: \"split1a2y9w\",\n\t\terr:     ErrInvalidSeparatorIndex(5),\n\t}, {\n\t\tname:    \"empty hrp\",\n\t\tencoded: \"1checkupstagehandshakeupstreamerranterredcaperred2y9e3w\",\n\t\terr:     ErrInvalidSeparatorIndex(0),\n\t}, {\n\t\tname:    \"no separator\",\n\t\tencoded: \"pzry9x0s0muk\",\n\t\terr:     ErrInvalidSeparatorIndex(-1),\n\t}, {\n\t\tname:    \"too long by one char\",\n\t\tencoded: \"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j\",\n\t\terr:     ErrInvalidLength(91),\n\t}, {\n\t\tname:    \"invalid due to mixed case in hrp\",\n\t\tencoded: \"aBcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw\",\n\t\terr:     ErrMixedCase{},\n\t}, {\n\t\tname:    \"invalid due to mixed case in data part\",\n\t\tencoded: \"abcdef1Qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw\",\n\t\terr:     ErrMixedCase{},\n\t}}\n\n\tfor _, test := range tests {\n\t\t// Ensure the decode either produces an error or not as expected.\n\t\tstr := test.encoded\n\t\tgotHRP, gotData, err := DecodeToBase256(str)\n\t\tif test.err != err {\n\t\t\tt.Errorf(\"%q: unexpected decode error -- got %v, want %v\",\n\t\t\t\ttest.name, err, test.err)\n\t\t\tcontinue\n\t\t}\n\t\tif err != nil {\n\t\t\t// End test case here if a decoding error was expected.\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the expected HRP and original data are as expected.\n\t\tif gotHRP != test.hrp {\n\t\t\tt.Errorf(\"%q: mismatched decoded HRP -- got %q, want %q\", test.name,\n\t\t\t\tgotHRP, test.hrp)\n\t\t\tcontinue\n\t\t}\n\t\tdata, err := hex.DecodeString(test.data)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%q: invalid hex %q: %v\", test.name, test.data, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(gotData, data) {\n\t\t\tt.Errorf(\"%q: mismatched data -- got %x, want %x\", test.name,\n\t\t\t\tgotData, data)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Encode the same data with the HRP converted to all uppercase and\n\t\t// ensure the result is the lowercase version of the original encoded\n\t\t// bech32 string.\n\t\tgotEncoded, err := EncodeFromBase256(strings.ToUpper(test.hrp), data)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%q: unexpected uppercase HRP encode error: %v\", test.name,\n\t\t\t\terr)\n\t\t}\n\t\twantEncoded := strings.ToLower(str)\n\t\tif gotEncoded != wantEncoded {\n\t\t\tt.Errorf(\"%q: mismatched encoding -- got %q, want %q\", test.name,\n\t\t\t\tgotEncoded, wantEncoded)\n\t\t}\n\n\t\t// Encode the same data with the HRP converted to all lowercase and\n\t\t// ensure the result is the lowercase version of the original encoded\n\t\t// bech32 string.\n\t\tgotEncoded, err = EncodeFromBase256(strings.ToLower(test.hrp), data)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%q: unexpected lowercase HRP encode error: %v\", test.name,\n\t\t\t\terr)\n\t\t}\n\t\tif gotEncoded != wantEncoded {\n\t\t\tt.Errorf(\"%q: mismatched encoding -- got %q, want %q\", test.name,\n\t\t\t\tgotEncoded, wantEncoded)\n\t\t}\n\n\t\t// Encode the same data with the HRP converted to mixed upper and\n\t\t// lowercase and ensure the result is the lowercase version of the\n\t\t// original encoded bech32 string.\n\t\tvar mixedHRPBuilder strings.Builder\n\t\tfor i, r := range test.hrp {\n\t\t\tif i%2 == 0 {\n\t\t\t\tmixedHRPBuilder.WriteString(strings.ToUpper(string(r)))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmixedHRPBuilder.WriteRune(r)\n\t\t}\n\t\tgotEncoded, err = EncodeFromBase256(mixedHRPBuilder.String(), data)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%q: unexpected lowercase HRP encode error: %v\", test.name,\n\t\t\t\terr)\n\t\t}\n\t\tif gotEncoded != wantEncoded {\n\t\t\tt.Errorf(\"%q: mismatched encoding -- got %q, want %q\", test.name,\n\t\t\t\tgotEncoded, wantEncoded)\n\t\t}\n\n\t\t// Ensure a bit flip in the string is caught.\n\t\tpos := strings.LastIndexAny(test.encoded, \"1\")\n\t\tflipped := str[:pos+1] + string((str[pos+1] ^ 1)) + str[pos+2:]\n\t\t_, _, err = DecodeToBase256(flipped)\n\t\tif err == nil {\n\t\t\tt.Error(\"expected decoding to fail\")\n\t\t}\n\t}\n}\n\n// BenchmarkEncodeDecodeCycle performs a benchmark for a full encode/decode\n// cycle of a bech32 string. It also  reports the allocation count, which we\n// expect to be 2 for a fully optimized cycle.\nfunc BenchmarkEncodeDecodeCycle(b *testing.B) {\n\t// Use a fixed, 49-byte raw data for testing.\n\tinputData, err := hex.DecodeString(\"cbe6365ddbcda9a9915422c3f091c13f8c7b2f263b8d34067bd12c274408473fa764871c9dd51b1bb34873b3473b633ed1\")\n\tif err != nil {\n\t\tb.Fatalf(\"failed to initialize input data: %v\", err)\n\t}\n\n\t// Convert this into a 79-byte, base 32 byte slice.\n\tbase32Input, err := ConvertBits(inputData, 8, 5, true)\n\tif err != nil {\n\t\tb.Fatalf(\"failed to convert input to 32 bits-per-element: %v\", err)\n\t}\n\n\t// Use a fixed hrp for the tests. This should generate an encoded bech32\n\t// string of size 90 (the maximum allowed by BIP-173).\n\thrp := \"bc\"\n\n\t// Begin the benchmark. Given that we test one roundtrip per iteration\n\t// (that is, one Encode() and one Decode() operation), we expect at most\n\t// 2 allocations per reported test op.\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tstr, err := Encode(hrp, base32Input)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"failed to encode input: %v\", err)\n\t\t}\n\n\t\t_, _, err = Decode(str)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"failed to decode string: %v\", err)\n\t\t}\n\t}\n}\n\n// TestConvertBits tests whether base conversion works using TestConvertBits().\nfunc TestConvertBits(t *testing.T) {\n\ttests := []struct {\n\t\tinput    string\n\t\toutput   string\n\t\tfromBits uint8\n\t\ttoBits   uint8\n\t\tpad      bool\n\t}{\n\t\t// Trivial empty conversions.\n\t\t{\"\", \"\", 8, 5, false},\n\t\t{\"\", \"\", 8, 5, true},\n\t\t{\"\", \"\", 5, 8, false},\n\t\t{\"\", \"\", 5, 8, true},\n\n\t\t// Conversions of 0 value with/without padding.\n\t\t{\"00\", \"00\", 8, 5, false},\n\t\t{\"00\", \"0000\", 8, 5, true},\n\t\t{\"0000\", \"00\", 5, 8, false},\n\t\t{\"0000\", \"0000\", 5, 8, true},\n\n\t\t// Testing when conversion ends exactly at the byte edge. This makes\n\t\t// both padded and unpadded versions the same.\n\t\t{\"0000000000\", \"0000000000000000\", 8, 5, false},\n\t\t{\"0000000000\", \"0000000000000000\", 8, 5, true},\n\t\t{\"0000000000000000\", \"0000000000\", 5, 8, false},\n\t\t{\"0000000000000000\", \"0000000000\", 5, 8, true},\n\n\t\t// Conversions of full byte sequences.\n\t\t{\"ffffff\", \"1f1f1f1f1e\", 8, 5, true},\n\t\t{\"1f1f1f1f1e\", \"ffffff\", 5, 8, false},\n\t\t{\"1f1f1f1f1e\", \"ffffff00\", 5, 8, true},\n\n\t\t// Sample random conversions.\n\t\t{\"c9ca\", \"190705\", 8, 5, false},\n\t\t{\"c9ca\", \"19070500\", 8, 5, true},\n\t\t{\"19070500\", \"c9ca\", 5, 8, false},\n\t\t{\"19070500\", \"c9ca00\", 5, 8, true},\n\n\t\t// Test cases tested on TestConvertBitsFailures with their corresponding\n\t\t// fixes.\n\t\t{\"ff\", \"1f1c\", 8, 5, true},\n\t\t{\"1f1c10\", \"ff20\", 5, 8, true},\n\n\t\t// Large conversions.\n\t\t{\n\t\t\t\"cbe6365ddbcda9a9915422c3f091c13f8c7b2f263b8d34067bd12c274408473fa764871c9dd51b1bb34873b3473b633ed1\",\n\t\t\t\"190f13030c170e1b1916141a13040a14040b011f01040e01071e0607160b1906070e06130801131b1a0416020e110008081c1f1a0e19040703120e1d0a06181b160d0407070c1a07070d11131d1408\",\n\t\t\t8, 5, true,\n\t\t},\n\t\t{\n\t\t\t\"190f13030c170e1b1916141a13040a14040b011f01040e01071e0607160b1906070e06130801131b1a0416020e110008081c1f1a0e19040703120e1d0a06181b160d0407070c1a07070d11131d1408\",\n\t\t\t\"cbe6365ddbcda9a9915422c3f091c13f8c7b2f263b8d34067bd12c274408473fa764871c9dd51b1bb34873b3473b633ed100\",\n\t\t\t5, 8, true,\n\t\t},\n\t}\n\n\tfor i, tc := range tests {\n\t\tinput, err := hex.DecodeString(tc.input)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"invalid test input data: %v\", err)\n\t\t}\n\n\t\texpected, err := hex.DecodeString(tc.output)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"invalid test output data: %v\", err)\n\t\t}\n\n\t\tactual, err := ConvertBits(input, tc.fromBits, tc.toBits, tc.pad)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"test case %d failed: %v\", i, err)\n\t\t}\n\n\t\tif !bytes.Equal(actual, expected) {\n\t\t\tt.Fatalf(\"test case %d has wrong output; expected=%x actual=%x\",\n\t\t\t\ti, expected, actual)\n\t\t}\n\t}\n}\n\n// TestConvertBitsFailures tests for the expected conversion failures of\n// ConvertBits().\nfunc TestConvertBitsFailures(t *testing.T) {\n\ttests := []struct {\n\t\tinput    string\n\t\tfromBits uint8\n\t\ttoBits   uint8\n\t\tpad      bool\n\t\terr      error\n\t}{\n\t\t// Not enough output bytes when not using padding.\n\t\t{\"ff\", 8, 5, false, ErrInvalidIncompleteGroup{}},\n\t\t{\"1f1c10\", 5, 8, false, ErrInvalidIncompleteGroup{}},\n\n\t\t// Unsupported bit conversions.\n\t\t{\"\", 0, 5, false, ErrInvalidBitGroups{}},\n\t\t{\"\", 10, 5, false, ErrInvalidBitGroups{}},\n\t\t{\"\", 5, 0, false, ErrInvalidBitGroups{}},\n\t\t{\"\", 5, 10, false, ErrInvalidBitGroups{}},\n\t}\n\n\tfor i, tc := range tests {\n\t\tinput, err := hex.DecodeString(tc.input)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"invalid test input data: %v\", err)\n\t\t}\n\n\t\t_, err = ConvertBits(input, tc.fromBits, tc.toBits, tc.pad)\n\t\tif err != tc.err {\n\t\t\tt.Fatalf(\"test case %d failure: expected '%v' got '%v'\", i,\n\t\t\t\ttc.err, err)\n\t\t}\n\t}\n\n}\n\n// BenchmarkConvertBitsDown benchmarks the speed and memory allocation behavior\n// of ConvertBits when converting from a higher base into a lower base (e.g. 8\n// => 5).\n//\n// Only a single allocation is expected, which is used for the output array.\nfunc BenchmarkConvertBitsDown(b *testing.B) {\n\t// Use a fixed, 49-byte raw data for testing.\n\tinputData, err := hex.DecodeString(\"cbe6365ddbcda9a9915422c3f091c13f8c7b2f263b8d34067bd12c274408473fa764871c9dd51b1bb34873b3473b633ed1\")\n\tif err != nil {\n\t\tb.Fatalf(\"failed to initialize input data: %v\", err)\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\t_, err := ConvertBits(inputData, 8, 5, true)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"error converting bits: %v\", err)\n\t\t}\n\t}\n}\n\n// BenchmarkConvertBitsUp benchmarks the speed and memory allocation behavior\n// of ConvertBits when converting from a lower base into a higher base (e.g. 5\n// => 8).\n//\n// Only a single allocation is expected, which is used for the output array.\nfunc BenchmarkConvertBitsUp(b *testing.B) {\n\t// Use a fixed, 79-byte raw data for testing.\n\tinputData, err := hex.DecodeString(\"190f13030c170e1b1916141a13040a14040b011f01040e01071e0607160b1906070e06130801131b1a0416020e110008081c1f1a0e19040703120e1d0a06181b160d0407070c1a07070d11131d1408\")\n\tif err != nil {\n\t\tb.Fatalf(\"failed to initialize input data: %v\", err)\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\t_, err := ConvertBits(inputData, 8, 5, true)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"error converting bits: %v\", err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcutil/bech32/doc.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage bech32 provides a Go implementation of the bech32 format specified in\nBIP 173.\n\nBech32 strings consist of a human-readable part (hrp), followed by the\nseparator 1, then a checksummed data part encoded using the 32 characters\n\"qpzry9x8gf2tvdw0s3jn54khce6mua7l\".\n\nMore info: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki\n*/\npackage bech32\n"
  },
  {
    "path": "btcutil/bech32/error.go",
    "content": "// Copyright (c) 2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bech32\n\nimport (\n\t\"fmt\"\n)\n\n// ErrMixedCase is returned when the bech32 string has both lower and uppercase\n// characters.\ntype ErrMixedCase struct{}\n\nfunc (e ErrMixedCase) Error() string {\n\treturn \"string not all lowercase or all uppercase\"\n}\n\n// ErrInvalidBitGroups is returned when conversion is attempted between byte\n// slices using bit-per-element of unsupported value.\ntype ErrInvalidBitGroups struct{}\n\nfunc (e ErrInvalidBitGroups) Error() string {\n\treturn \"only bit groups between 1 and 8 allowed\"\n}\n\n// ErrInvalidIncompleteGroup is returned when then byte slice used as input has\n// data of wrong length.\ntype ErrInvalidIncompleteGroup struct{}\n\nfunc (e ErrInvalidIncompleteGroup) Error() string {\n\treturn \"invalid incomplete group\"\n}\n\n// ErrInvalidLength is returned when the bech32 string has an invalid length\n// given the BIP-173 defined restrictions.\ntype ErrInvalidLength int\n\nfunc (e ErrInvalidLength) Error() string {\n\treturn fmt.Sprintf(\"invalid bech32 string length %d\", int(e))\n}\n\n// ErrInvalidCharacter is returned when the bech32 string has a character\n// outside the range of the supported charset.\ntype ErrInvalidCharacter rune\n\nfunc (e ErrInvalidCharacter) Error() string {\n\treturn fmt.Sprintf(\"invalid character in string: '%c'\", rune(e))\n}\n\n// ErrInvalidSeparatorIndex is returned when the separator character '1' is\n// in an invalid position in the bech32 string.\ntype ErrInvalidSeparatorIndex int\n\nfunc (e ErrInvalidSeparatorIndex) Error() string {\n\treturn fmt.Sprintf(\"invalid separator index %d\", int(e))\n}\n\n// ErrNonCharsetChar is returned when a character outside of the specific\n// bech32 charset is used in the string.\ntype ErrNonCharsetChar rune\n\nfunc (e ErrNonCharsetChar) Error() string {\n\treturn fmt.Sprintf(\"invalid character not part of charset: %v\", int(e))\n}\n\n// ErrInvalidChecksum is returned when the extracted checksum of the string\n// is different than what was expected. Both the original version, as well as\n// the new bech32m checksum may be specified.\ntype ErrInvalidChecksum struct {\n\tExpected  string\n\tExpectedM string\n\tActual    string\n}\n\nfunc (e ErrInvalidChecksum) Error() string {\n\treturn fmt.Sprintf(\"invalid checksum (expected (bech32=%v, \"+\n\t\t\"bech32m=%v), got %v)\", e.Expected, e.ExpectedM, e.Actual)\n}\n\n// ErrInvalidDataByte is returned when a byte outside the range required for\n// conversion into a string was found.\ntype ErrInvalidDataByte byte\n\nfunc (e ErrInvalidDataByte) Error() string {\n\treturn fmt.Sprintf(\"invalid data byte: %v\", byte(e))\n}\n"
  },
  {
    "path": "btcutil/bech32/example_test.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bech32_test\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcutil/bech32\"\n)\n\n// This example demonstrates how to decode a bech32 encoded string.\nfunc ExampleDecode() {\n\tencoded := \"bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx\"\n\thrp, decoded, err := bech32.Decode(encoded)\n\tif err != nil {\n\t\tfmt.Println(\"Error:\", err)\n\t}\n\n\t// Show the decoded data.\n\tfmt.Println(\"Decoded human-readable part:\", hrp)\n\tfmt.Println(\"Decoded Data:\", hex.EncodeToString(decoded))\n\n\t// Output:\n\t// Decoded human-readable part: bc\n\t// Decoded Data: 010e140f070d1a001912060b0d081504140311021d030c1d03040f1814060e1e160e140f070d1a001912060b0d081504140311021d030c1d03040f1814060e1e16\n}\n\n// This example demonstrates how to encode data into a bech32 string.\nfunc ExampleEncode() {\n\tdata := []byte(\"Test data\")\n\t// Convert test data to base32:\n\tconv, err := bech32.ConvertBits(data, 8, 5, true)\n\tif err != nil {\n\t\tfmt.Println(\"Error:\", err)\n\t}\n\tencoded, err := bech32.Encode(\"customHrp!11111q\", conv)\n\tif err != nil {\n\t\tfmt.Println(\"Error:\", err)\n\t}\n\n\t// Show the encoded data.\n\tfmt.Println(\"Encoded Data:\", encoded)\n\n\t// Output:\n\t// Encoded Data: customhrp!11111q123jhxapqv3shgcgkxpuhe\n}\n"
  },
  {
    "path": "btcutil/bech32/version.go",
    "content": "package bech32\n\n// ChecksumConst is a type that represents the currently defined bech32\n// checksum constants.\ntype ChecksumConst int\n\nconst (\n\t// Version0Const is the original constant used in the checksum\n\t// verification for bech32.\n\tVersion0Const ChecksumConst = 1\n\n\t// VersionMConst is the new constant used for bech32m checksum\n\t// verification.\n\tVersionMConst ChecksumConst = 0x2bc830a3\n)\n\n// Version defines the current set of bech32 versions.\ntype Version uint8\n\nconst (\n\t// Version0 defines the original bech version.\n\tVersion0 Version = iota\n\n\t// VersionM is the new bech32 version defined in BIP-350, also known as\n\t// bech32m.\n\tVersionM\n\n\t// VersionUnknown denotes an unknown bech version.\n\tVersionUnknown\n)\n\n// VersionToConsts maps bech32 versions to the checksum constant to be used\n// when encoding, and asserting a particular version when decoding.\nvar VersionToConsts = map[Version]ChecksumConst{\n\tVersion0: Version0Const,\n\tVersionM: VersionMConst,\n}\n\n// ConstsToVersion maps a bech32 constant to the version it's associated with.\nvar ConstsToVersion = map[ChecksumConst]Version{\n\tVersion0Const: Version0,\n\tVersionMConst: VersionM,\n}\n"
  },
  {
    "path": "btcutil/bench_test.go",
    "content": "package btcutil_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nvar (\n\tbencHash *chainhash.Hash\n)\n\n// BenchmarkTxHash benchmarks the performance of calculating the hash of a\n// transaction.\nfunc BenchmarkTxHash(b *testing.B) {\n\t// Make a new block from the test block, we'll then call the Bytes\n\t// function to cache the serialized block. Afterwards we all\n\t// Transactions to populate the serialization cache.\n\ttestBlock := btcutil.NewBlock(&Block100000)\n\t_, _ = testBlock.Bytes()\n\n\t// The second transaction in the block has no witness data. The first\n\t// does however.\n\ttestTx := testBlock.Transactions()[1]\n\ttestTx2 := testBlock.Transactions()[0]\n\n\t// Run a benchmark for the portion that needs to strip the non-witness\n\t// data from the transaction.\n\tb.Run(\"tx_hash_has_witness\", func(b *testing.B) {\n\t\tb.ResetTimer()\n\t\tb.ReportAllocs()\n\n\t\tvar txHash *chainhash.Hash\n\t\tfor i := 0; i < b.N; i++ {\n\t\t\ttxHash = testTx2.Hash()\n\t\t}\n\n\t\tbencHash = txHash\n\t})\n\n\t// Next, run it for the portion that can just hash the bytes directly.\n\tb.Run(\"tx_hash_no_witness\", func(b *testing.B) {\n\t\tb.ResetTimer()\n\t\tb.ReportAllocs()\n\n\t\tvar txHash *chainhash.Hash\n\t\tfor i := 0; i < b.N; i++ {\n\t\t\ttxHash = testTx.Hash()\n\t\t}\n\n\t\tbencHash = txHash\n\t})\n\n}\n\n// BenchmarkTxWitnessHash benchmarks the performance of calculating the hash of\n// a transaction.\nfunc BenchmarkTxWitnessHash(b *testing.B) {\n\t// Make a new block from the test block, we'll then call the Bytes\n\t// function to cache the serialized block. Afterwards we all\n\t// Transactions to populate the serialization cache.\n\ttestBlock := btcutil.NewBlock(&Block100000)\n\t_, _ = testBlock.Bytes()\n\n\t// The first transaction in the block has been modified to have witness\n\t// data.\n\ttestTx := testBlock.Transactions()[0]\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\n\tvar txHash *chainhash.Hash\n\tfor i := 0; i < b.N; i++ {\n\t\ttxHash = testTx.WitnessHash()\n\t}\n\n\tbencHash = txHash\n\n}\n"
  },
  {
    "path": "btcutil/block.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// OutOfRangeError describes an error due to accessing an element that is out\n// of range.\ntype OutOfRangeError string\n\n// BlockHeightUnknown is the value returned for a block height that is unknown.\n// This is typically because the block has not been inserted into the main chain\n// yet.\nconst BlockHeightUnknown = int32(-1)\n\n// Error satisfies the error interface and prints human-readable errors.\nfunc (e OutOfRangeError) Error() string {\n\treturn string(e)\n}\n\n// Block defines a bitcoin block that provides easier and more efficient\n// manipulation of raw blocks.  It also memoizes hashes for the block and its\n// transactions on their first access so subsequent accesses don't have to\n// repeat the relatively expensive hashing operations.\ntype Block struct {\n\tmsgBlock                 *wire.MsgBlock  // Underlying MsgBlock\n\tserializedBlock          []byte          // Serialized bytes for the block\n\tserializedBlockNoWitness []byte          // Serialized bytes for block w/o witness data\n\tblockHash                *chainhash.Hash // Cached block hash\n\tblockHeight              int32           // Height in the main block chain\n\ttransactions             []*Tx           // Transactions\n\ttxnsGenerated            bool            // ALL wrapped transactions generated\n}\n\n// MsgBlock returns the underlying wire.MsgBlock for the Block.\nfunc (b *Block) MsgBlock() *wire.MsgBlock {\n\t// Return the cached block.\n\treturn b.msgBlock\n}\n\n// Bytes returns the serialized bytes for the Block.  This is equivalent to\n// calling Serialize on the underlying wire.MsgBlock, however it caches the\n// result so subsequent calls are more efficient.\nfunc (b *Block) Bytes() ([]byte, error) {\n\t// Return the cached serialized bytes if it has already been generated.\n\tif len(b.serializedBlock) != 0 {\n\t\treturn b.serializedBlock, nil\n\t}\n\n\t// Serialize the MsgBlock.\n\tw := bytes.NewBuffer(make([]byte, 0, b.msgBlock.SerializeSize()))\n\terr := b.msgBlock.Serialize(w)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tserializedBlock := w.Bytes()\n\n\t// Cache the serialized bytes and return them.\n\tb.serializedBlock = serializedBlock\n\treturn serializedBlock, nil\n}\n\n// BytesNoWitness returns the serialized bytes for the block with transactions\n// encoded without any witness data.\nfunc (b *Block) BytesNoWitness() ([]byte, error) {\n\t// Return the cached serialized bytes if it has already been generated.\n\tif len(b.serializedBlockNoWitness) != 0 {\n\t\treturn b.serializedBlockNoWitness, nil\n\t}\n\n\t// Serialize the MsgBlock.\n\tvar w bytes.Buffer\n\terr := b.msgBlock.SerializeNoWitness(&w)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tserializedBlock := w.Bytes()\n\n\t// Cache the serialized bytes and return them.\n\tb.serializedBlockNoWitness = serializedBlock\n\treturn serializedBlock, nil\n}\n\n// Hash returns the block identifier hash for the Block.  This is equivalent to\n// calling BlockHash on the underlying wire.MsgBlock, however it caches the\n// result so subsequent calls are more efficient.\nfunc (b *Block) Hash() *chainhash.Hash {\n\t// Return the cached block hash if it has already been generated.\n\tif b.blockHash != nil {\n\t\treturn b.blockHash\n\t}\n\n\t// Cache the block hash and return it.\n\thash := b.msgBlock.BlockHash()\n\tb.blockHash = &hash\n\treturn &hash\n}\n\n// Tx returns a wrapped transaction (btcutil.Tx) for the transaction at the\n// specified index in the Block.  The supplied index is 0 based.  That is to\n// say, the first transaction in the block is txNum 0.  This is nearly\n// equivalent to accessing the raw transaction (wire.MsgTx) from the\n// underlying wire.MsgBlock, however the wrapped transaction has some helpful\n// properties such as caching the hash so subsequent calls are more efficient.\nfunc (b *Block) Tx(txNum int) (*Tx, error) {\n\t// Ensure the requested transaction is in range.\n\tnumTx := uint64(len(b.msgBlock.Transactions))\n\tif txNum < 0 || uint64(txNum) >= numTx {\n\t\tstr := fmt.Sprintf(\"transaction index %d is out of range - max %d\",\n\t\t\ttxNum, numTx-1)\n\t\treturn nil, OutOfRangeError(str)\n\t}\n\n\t// Generate slice to hold all of the wrapped transactions if needed.\n\tif len(b.transactions) == 0 {\n\t\tb.transactions = make([]*Tx, numTx)\n\t}\n\n\t// Return the wrapped transaction if it has already been generated.\n\tif b.transactions[txNum] != nil {\n\t\treturn b.transactions[txNum], nil\n\t}\n\n\t// Generate and cache the wrapped transaction and return it.\n\tnewTx := NewTx(b.msgBlock.Transactions[txNum])\n\tnewTx.SetIndex(txNum)\n\tb.transactions[txNum] = newTx\n\treturn newTx, nil\n}\n\n// Transactions returns a slice of wrapped transactions (btcutil.Tx) for all\n// transactions in the Block.  This is nearly equivalent to accessing the raw\n// transactions (wire.MsgTx) in the underlying wire.MsgBlock, however it\n// instead provides easy access to wrapped versions (btcutil.Tx) of them.\nfunc (b *Block) Transactions() []*Tx {\n\t// Return transactions if they have ALL already been generated.  This\n\t// flag is necessary because the wrapped transactions are lazily\n\t// generated in a sparse fashion.\n\tif b.txnsGenerated {\n\t\treturn b.transactions\n\t}\n\n\t// Generate slice to hold all of the wrapped transactions if needed.\n\tif len(b.transactions) == 0 {\n\t\tb.transactions = make([]*Tx, len(b.msgBlock.Transactions))\n\t}\n\n\t// Offset of each tx.  80 accounts for the block header size.\n\toffset := 80 + wire.VarIntSerializeSize(\n\t\tuint64(len(b.msgBlock.Transactions)),\n\t)\n\n\t// Generate and cache the wrapped transactions for all that haven't\n\t// already been done.\n\tfor i, tx := range b.transactions {\n\t\tif tx == nil {\n\t\t\tnewTx := NewTx(b.msgBlock.Transactions[i])\n\t\t\tnewTx.SetIndex(i)\n\n\t\t\tsize := b.msgBlock.Transactions[i].SerializeSize()\n\n\t\t\t// The block may not always have the serializedBlock.\n\t\t\tif len(b.serializedBlock) > 0 {\n\t\t\t\t// This allows for the reuse of the already\n\t\t\t\t// serialized tx.\n\t\t\t\tnewTx.setBytes(\n\t\t\t\t\tb.serializedBlock[offset : offset+size],\n\t\t\t\t)\n\n\t\t\t\t// Increment offset for this block.\n\t\t\t\toffset += size\n\t\t\t}\n\n\t\t\tb.transactions[i] = newTx\n\t\t}\n\t}\n\n\tb.txnsGenerated = true\n\treturn b.transactions\n}\n\n// TxHash returns the hash for the requested transaction number in the Block.\n// The supplied index is 0 based.  That is to say, the first transaction in the\n// block is txNum 0.  This is equivalent to calling TxHash on the underlying\n// wire.MsgTx, however it caches the result so subsequent calls are more\n// efficient.\nfunc (b *Block) TxHash(txNum int) (*chainhash.Hash, error) {\n\t// Attempt to get a wrapped transaction for the specified index.  It\n\t// will be created lazily if needed or simply return the cached version\n\t// if it has already been generated.\n\ttx, err := b.Tx(txNum)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Defer to the wrapped transaction which will return the cached hash if\n\t// it has already been generated.\n\treturn tx.Hash(), nil\n}\n\n// TxLoc returns the offsets and lengths of each transaction in a raw block.\n// It is used to allow fast indexing into transactions within the raw byte\n// stream.\nfunc (b *Block) TxLoc() ([]wire.TxLoc, error) {\n\trawMsg, err := b.Bytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trbuf := bytes.NewBuffer(rawMsg)\n\n\tvar mblock wire.MsgBlock\n\ttxLocs, err := mblock.DeserializeTxLoc(rbuf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn txLocs, err\n}\n\n// Height returns the saved height of the block in the block chain.  This value\n// will be BlockHeightUnknown if it hasn't already explicitly been set.\nfunc (b *Block) Height() int32 {\n\treturn b.blockHeight\n}\n\n// SetHeight sets the height of the block in the block chain.\nfunc (b *Block) SetHeight(height int32) {\n\tb.blockHeight = height\n}\n\n// NewBlock returns a new instance of a bitcoin block given an underlying\n// wire.MsgBlock.  See Block.\nfunc NewBlock(msgBlock *wire.MsgBlock) *Block {\n\treturn &Block{\n\t\tmsgBlock:    msgBlock,\n\t\tblockHeight: BlockHeightUnknown,\n\t}\n}\n\n// NewBlockFromBytes returns a new instance of a bitcoin block given the\n// serialized bytes.  See Block.\nfunc NewBlockFromBytes(serializedBlock []byte) (*Block, error) {\n\tbr := bytes.NewReader(serializedBlock)\n\tb, err := NewBlockFromReader(br)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tb.serializedBlock = serializedBlock\n\n\t// This initializes []btcutil.Tx to have the serialized raw\n\t// transactions cached.  Helps speed up things like generating the\n\t// txhash.\n\tb.Transactions()\n\n\treturn b, nil\n}\n\n// NewBlockFromReader returns a new instance of a bitcoin block given a\n// Reader to deserialize the block.  See Block.\nfunc NewBlockFromReader(r io.Reader) (*Block, error) {\n\t// Deserialize the bytes into a MsgBlock.\n\tvar msgBlock wire.MsgBlock\n\terr := msgBlock.Deserialize(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tb := Block{\n\t\tmsgBlock:    &msgBlock,\n\t\tblockHeight: BlockHeightUnknown,\n\t}\n\treturn &b, nil\n}\n\n// NewBlockFromBlockAndBytes returns a new instance of a bitcoin block given\n// an underlying wire.MsgBlock and the serialized bytes for it.  See Block.\nfunc NewBlockFromBlockAndBytes(msgBlock *wire.MsgBlock,\n\tserializedBlock []byte) *Block {\n\n\tb := &Block{\n\t\tmsgBlock:        msgBlock,\n\t\tserializedBlock: serializedBlock,\n\t\tblockHeight:     BlockHeightUnknown,\n\t}\n\n\t// This initializes []btcutil.Tx to have the serialized raw\n\t// transactions cached.  Helps speed up things like generating the\n\t// txhash.\n\tb.Transactions()\n\n\treturn b\n}\n"
  },
  {
    "path": "btcutil/block_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil_test\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestBlock tests the API for Block.\nfunc TestBlock(t *testing.T) {\n\tb := btcutil.NewBlock(&Block100000)\n\n\t// Ensure we get the same data back out.\n\tif msgBlock := b.MsgBlock(); !reflect.DeepEqual(msgBlock, &Block100000) {\n\t\tt.Errorf(\"MsgBlock: mismatched MsgBlock - got %v, want %v\",\n\t\t\tspew.Sdump(msgBlock), spew.Sdump(&Block100000))\n\t}\n\n\t// Ensure block height set and get work properly.\n\twantHeight := int32(100000)\n\tb.SetHeight(wantHeight)\n\tif gotHeight := b.Height(); gotHeight != wantHeight {\n\t\tt.Errorf(\"Height: mismatched height - got %v, want %v\",\n\t\t\tgotHeight, wantHeight)\n\t}\n\n\t// Hash for block 100,000.\n\twantHashStr := \"3ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506\"\n\twantHash, err := chainhash.NewHashFromStr(wantHashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Request the hash multiple times to test generation and caching.\n\tfor i := 0; i < 2; i++ {\n\t\thash := b.Hash()\n\t\tif !hash.IsEqual(wantHash) {\n\t\t\tt.Errorf(\"Hash #%d mismatched hash - got %v, want %v\",\n\t\t\t\ti, hash, wantHash)\n\t\t}\n\t}\n\n\t// Hashes for the transactions in Block100000.\n\twantTxHashes := []string{\n\t\t\"8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87\",\n\t\t\"fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4\",\n\t\t\"6359f0868171b1d194cbee1af2f16ea598ae8fad666d9b012c8ed2b79a236ec4\",\n\t\t\"e9a66845e05d5abc0ad04ec80f774a7e585c6e8db975962d069a522137b80c1d\",\n\t}\n\n\t// Create a new block to nuke all cached data.\n\tb = btcutil.NewBlock(&Block100000)\n\n\t// Request hash for all transactions one at a time via Tx.\n\tfor i, txHash := range wantTxHashes {\n\t\twantHash, err := chainhash.NewHashFromStr(txHash)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t\t}\n\n\t\t// Request the hash multiple times to test generation and\n\t\t// caching.\n\t\tfor j := 0; j < 2; j++ {\n\t\t\ttx, err := b.Tx(i)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Tx #%d: %v\", i, err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\thash := tx.Hash()\n\t\t\tif !hash.IsEqual(wantHash) {\n\t\t\t\tt.Errorf(\"Hash #%d mismatched hash - got %v, \"+\n\t\t\t\t\t\"want %v\", j, hash, wantHash)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n\n\t// Create a new block to nuke all cached data.\n\tb = btcutil.NewBlock(&Block100000)\n\n\t// Request slice of all transactions multiple times to test generation\n\t// and caching.\n\tfor i := 0; i < 2; i++ {\n\t\ttransactions := b.Transactions()\n\n\t\t// Ensure we get the expected number of transactions.\n\t\tif len(transactions) != len(wantTxHashes) {\n\t\t\tt.Errorf(\"Transactions #%d mismatched number of \"+\n\t\t\t\t\"transactions - got %d, want %d\", i,\n\t\t\t\tlen(transactions), len(wantTxHashes))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure all of the hashes match.\n\t\tfor j, tx := range transactions {\n\t\t\twantHash, err := chainhash.NewHashFromStr(wantTxHashes[j])\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t\t\t}\n\n\t\t\thash := tx.Hash()\n\t\t\tif !hash.IsEqual(wantHash) {\n\t\t\t\tt.Errorf(\"Transactions #%d mismatched hashes \"+\n\t\t\t\t\t\"- got %v, want %v\", j, hash, wantHash)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n\n\t// Serialize the test block.\n\tvar block100000Buf bytes.Buffer\n\terr = Block100000.Serialize(&block100000Buf)\n\tif err != nil {\n\t\tt.Errorf(\"Serialize: %v\", err)\n\t}\n\tblock100000Bytes := block100000Buf.Bytes()\n\n\t// Request serialized bytes multiple times to test generation and\n\t// caching.\n\tfor i := 0; i < 2; i++ {\n\t\tserializedBytes, err := b.Bytes()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Bytes: %v\", err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(serializedBytes, block100000Bytes) {\n\t\t\tt.Errorf(\"Bytes #%d wrong bytes - got %v, want %v\", i,\n\t\t\t\tspew.Sdump(serializedBytes),\n\t\t\t\tspew.Sdump(block100000Bytes))\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// Transaction offsets and length for the transaction in Block100000.\n\twantTxLocs := []wire.TxLoc{\n\t\t{TxStart: 81, TxLen: 144},\n\t\t{TxStart: 225, TxLen: 259},\n\t\t{TxStart: 484, TxLen: 257},\n\t\t{TxStart: 741, TxLen: 225},\n\t}\n\n\t// Ensure the transaction location information is accurate.\n\ttxLocs, err := b.TxLoc()\n\tif err != nil {\n\t\tt.Errorf(\"TxLoc: %v\", err)\n\t\treturn\n\t}\n\tif !reflect.DeepEqual(txLocs, wantTxLocs) {\n\t\tt.Errorf(\"TxLoc: mismatched transaction location information \"+\n\t\t\t\"- got %v, want %v\", spew.Sdump(txLocs),\n\t\t\tspew.Sdump(wantTxLocs))\n\t}\n}\n\n// TestNewBlockFromBytes tests creation of a Block from serialized bytes.\nfunc TestNewBlockFromBytes(t *testing.T) {\n\t// Serialize the test block.\n\tvar block100000Buf bytes.Buffer\n\terr := Block100000.Serialize(&block100000Buf)\n\tif err != nil {\n\t\tt.Errorf(\"Serialize: %v\", err)\n\t}\n\tblock100000Bytes := block100000Buf.Bytes()\n\n\t// Create a new block from the serialized bytes.\n\tb, err := btcutil.NewBlockFromBytes(block100000Bytes)\n\tif err != nil {\n\t\tt.Errorf(\"NewBlockFromBytes: %v\", err)\n\t\treturn\n\t}\n\n\t// Ensure we get the same data back out.\n\tserializedBytes, err := b.Bytes()\n\tif err != nil {\n\t\tt.Errorf(\"Bytes: %v\", err)\n\t\treturn\n\t}\n\tif !bytes.Equal(serializedBytes, block100000Bytes) {\n\t\tt.Errorf(\"Bytes: wrong bytes - got %v, want %v\",\n\t\t\tspew.Sdump(serializedBytes),\n\t\t\tspew.Sdump(block100000Bytes))\n\t}\n\n\t// Ensure the generated MsgBlock is correct.\n\tif msgBlock := b.MsgBlock(); !reflect.DeepEqual(msgBlock, &Block100000) {\n\t\tt.Errorf(\"MsgBlock: mismatched MsgBlock - got %v, want %v\",\n\t\t\tspew.Sdump(msgBlock), spew.Sdump(&Block100000))\n\t}\n}\n\n// TestNewBlockFromBlockAndBytes tests creation of a Block from a MsgBlock and\n// raw bytes.\nfunc TestNewBlockFromBlockAndBytes(t *testing.T) {\n\t// Serialize the test block.\n\tvar block100000Buf bytes.Buffer\n\terr := Block100000.Serialize(&block100000Buf)\n\tif err != nil {\n\t\tt.Errorf(\"Serialize: %v\", err)\n\t}\n\tblock100000Bytes := block100000Buf.Bytes()\n\n\t// Create a new block from the serialized bytes.\n\tb := btcutil.NewBlockFromBlockAndBytes(&Block100000, block100000Bytes)\n\n\t// Ensure we get the same data back out.\n\tserializedBytes, err := b.Bytes()\n\tif err != nil {\n\t\tt.Errorf(\"Bytes: %v\", err)\n\t\treturn\n\t}\n\tif !bytes.Equal(serializedBytes, block100000Bytes) {\n\t\tt.Errorf(\"Bytes: wrong bytes - got %v, want %v\",\n\t\t\tspew.Sdump(serializedBytes),\n\t\t\tspew.Sdump(block100000Bytes))\n\t}\n\tif msgBlock := b.MsgBlock(); !reflect.DeepEqual(msgBlock, &Block100000) {\n\t\tt.Errorf(\"MsgBlock: mismatched MsgBlock - got %v, want %v\",\n\t\t\tspew.Sdump(msgBlock), spew.Sdump(&Block100000))\n\t}\n}\n\n// TestBlockErrors tests the error paths for the Block API.\nfunc TestBlockErrors(t *testing.T) {\n\t// Ensure out of range errors are as expected.\n\twantErr := \"transaction index -1 is out of range - max 3\"\n\ttestErr := btcutil.OutOfRangeError(wantErr)\n\tif testErr.Error() != wantErr {\n\t\tt.Errorf(\"OutOfRangeError: wrong error - got %v, want %v\",\n\t\t\ttestErr.Error(), wantErr)\n\t}\n\n\t// Serialize the test block.\n\tvar block100000Buf bytes.Buffer\n\terr := Block100000.Serialize(&block100000Buf)\n\tif err != nil {\n\t\tt.Errorf(\"Serialize: %v\", err)\n\t}\n\tblock100000Bytes := block100000Buf.Bytes()\n\n\t// Create a new block from the serialized bytes.\n\tb, err := btcutil.NewBlockFromBytes(block100000Bytes)\n\tif err != nil {\n\t\tt.Errorf(\"NewBlockFromBytes: %v\", err)\n\t\treturn\n\t}\n\n\t// Truncate the block byte buffer to force errors.\n\tshortBytes := block100000Bytes[:80]\n\t_, err = btcutil.NewBlockFromBytes(shortBytes)\n\tif err != io.EOF {\n\t\tt.Errorf(\"NewBlockFromBytes: did not get expected error - \"+\n\t\t\t\"got %v, want %v\", err, io.EOF)\n\t}\n\n\t// Ensure TxHash returns expected error on invalid indices.\n\t_, err = b.TxHash(-1)\n\tif _, ok := err.(btcutil.OutOfRangeError); !ok {\n\t\tt.Errorf(\"TxHash: wrong error - got: %v <%T>, \"+\n\t\t\t\"want: <%T>\", err, err, btcutil.OutOfRangeError(\"\"))\n\t}\n\t_, err = b.TxHash(len(Block100000.Transactions))\n\tif _, ok := err.(btcutil.OutOfRangeError); !ok {\n\t\tt.Errorf(\"TxHash: wrong error - got: %v <%T>, \"+\n\t\t\t\"want: <%T>\", err, err, btcutil.OutOfRangeError(\"\"))\n\t}\n\n\t// Ensure Tx returns expected error on invalid indices.\n\t_, err = b.Tx(-1)\n\tif _, ok := err.(btcutil.OutOfRangeError); !ok {\n\t\tt.Errorf(\"Tx: wrong error - got: %v <%T>, \"+\n\t\t\t\"want: <%T>\", err, err, btcutil.OutOfRangeError(\"\"))\n\t}\n\t_, err = b.Tx(len(Block100000.Transactions))\n\tif _, ok := err.(btcutil.OutOfRangeError); !ok {\n\t\tt.Errorf(\"Tx: wrong error - got: %v <%T>, \"+\n\t\t\t\"want: <%T>\", err, err, btcutil.OutOfRangeError(\"\"))\n\t}\n\n\t// Ensure TxLoc returns expected error with short byte buffer.\n\t// This makes use of the test package only function, SetBlockBytes, to\n\t// inject a short byte buffer.\n\tb.SetBlockBytes(shortBytes)\n\t_, err = b.TxLoc()\n\tif err != io.EOF {\n\t\tt.Errorf(\"TxLoc: did not get expected error - \"+\n\t\t\t\"got %v, want %v\", err, io.EOF)\n\t}\n}\n\n// Block100000 defines block 100,000 of the block chain.  It is used to\n// test Block operations.\nvar Block100000 = wire.MsgBlock{\n\tHeader: wire.BlockHeader{\n\t\tVersion: 1,\n\t\tPrevBlock: chainhash.Hash([32]byte{ // Make go vet happy.\n\t\t\t0x50, 0x12, 0x01, 0x19, 0x17, 0x2a, 0x61, 0x04,\n\t\t\t0x21, 0xa6, 0xc3, 0x01, 0x1d, 0xd3, 0x30, 0xd9,\n\t\t\t0xdf, 0x07, 0xb6, 0x36, 0x16, 0xc2, 0xcc, 0x1f,\n\t\t\t0x1c, 0xd0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t}), // 000000000002d01c1fccc21636b607dfd930d31d01c3a62104612a1719011250\n\t\tMerkleRoot: chainhash.Hash([32]byte{ // Make go vet happy.\n\t\t\t0x66, 0x57, 0xa9, 0x25, 0x2a, 0xac, 0xd5, 0xc0,\n\t\t\t0xb2, 0x94, 0x09, 0x96, 0xec, 0xff, 0x95, 0x22,\n\t\t\t0x28, 0xc3, 0x06, 0x7c, 0xc3, 0x8d, 0x48, 0x85,\n\t\t\t0xef, 0xb5, 0xa4, 0xac, 0x42, 0x47, 0xe9, 0xf3,\n\t\t}), // f3e94742aca4b5ef85488dc37c06c3282295ffec960994b2c0d5ac2a25a95766\n\t\tTimestamp: time.Unix(1293623863, 0), // 2010-12-29 11:57:43 +0000 UTC\n\t\tBits:      0x1b04864c,               // 453281356\n\t\tNonce:     0x10572b0f,               // 274148111\n\t},\n\tTransactions: []*wire.MsgTx{\n\t\t{\n\t\t\tVersion: 1,\n\t\t\tTxIn: []*wire.TxIn{\n\t\t\t\t{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\t\t\tIndex: 0xffffffff,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: []byte{\n\t\t\t\t\t\t0x04, 0x4c, 0x86, 0x04, 0x1b, 0x02, 0x06, 0x02,\n\t\t\t\t\t},\n\t\t\t\t\tSequence: 0xffffffff,\n\t\t\t\t\tWitness: [][]byte{\n\t\t\t\t\t\t{0x04, 0x31},\n\t\t\t\t\t\t{0x01, 0x43},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tTxOut: []*wire.TxOut{\n\t\t\t\t{\n\t\t\t\t\tValue: 0x12a05f200, // 5000000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x41, // OP_DATA_65\n\t\t\t\t\t\t0x04, 0x1b, 0x0e, 0x8c, 0x25, 0x67, 0xc1, 0x25,\n\t\t\t\t\t\t0x36, 0xaa, 0x13, 0x35, 0x7b, 0x79, 0xa0, 0x73,\n\t\t\t\t\t\t0xdc, 0x44, 0x44, 0xac, 0xb8, 0x3c, 0x4e, 0xc7,\n\t\t\t\t\t\t0xa0, 0xe2, 0xf9, 0x9d, 0xd7, 0x45, 0x75, 0x16,\n\t\t\t\t\t\t0xc5, 0x81, 0x72, 0x42, 0xda, 0x79, 0x69, 0x24,\n\t\t\t\t\t\t0xca, 0x4e, 0x99, 0x94, 0x7d, 0x08, 0x7f, 0xed,\n\t\t\t\t\t\t0xf9, 0xce, 0x46, 0x7c, 0xb9, 0xf7, 0xc6, 0x28,\n\t\t\t\t\t\t0x70, 0x78, 0xf8, 0x01, 0xdf, 0x27, 0x6f, 0xdf,\n\t\t\t\t\t\t0x84, // 65-byte signature\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tLockTime: 0,\n\t\t},\n\t\t{\n\t\t\tVersion: 1,\n\t\t\tTxIn: []*wire.TxIn{\n\t\t\t\t{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash: chainhash.Hash([32]byte{ // Make go vet happy.\n\t\t\t\t\t\t\t0x03, 0x2e, 0x38, 0xe9, 0xc0, 0xa8, 0x4c, 0x60,\n\t\t\t\t\t\t\t0x46, 0xd6, 0x87, 0xd1, 0x05, 0x56, 0xdc, 0xac,\n\t\t\t\t\t\t\t0xc4, 0x1d, 0x27, 0x5e, 0xc5, 0x5f, 0xc0, 0x07,\n\t\t\t\t\t\t\t0x79, 0xac, 0x88, 0xfd, 0xf3, 0x57, 0xa1, 0x87,\n\t\t\t\t\t\t}), // 87a157f3fd88ac7907c05fc55e271dc4acdc5605d187d646604ca8c0e9382e03\n\t\t\t\t\t\tIndex: 0,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: []byte{\n\t\t\t\t\t\t0x49, // OP_DATA_73\n\t\t\t\t\t\t0x30, 0x46, 0x02, 0x21, 0x00, 0xc3, 0x52, 0xd3,\n\t\t\t\t\t\t0xdd, 0x99, 0x3a, 0x98, 0x1b, 0xeb, 0xa4, 0xa6,\n\t\t\t\t\t\t0x3a, 0xd1, 0x5c, 0x20, 0x92, 0x75, 0xca, 0x94,\n\t\t\t\t\t\t0x70, 0xab, 0xfc, 0xd5, 0x7d, 0xa9, 0x3b, 0x58,\n\t\t\t\t\t\t0xe4, 0xeb, 0x5d, 0xce, 0x82, 0x02, 0x21, 0x00,\n\t\t\t\t\t\t0x84, 0x07, 0x92, 0xbc, 0x1f, 0x45, 0x60, 0x62,\n\t\t\t\t\t\t0x81, 0x9f, 0x15, 0xd3, 0x3e, 0xe7, 0x05, 0x5c,\n\t\t\t\t\t\t0xf7, 0xb5, 0xee, 0x1a, 0xf1, 0xeb, 0xcc, 0x60,\n\t\t\t\t\t\t0x28, 0xd9, 0xcd, 0xb1, 0xc3, 0xaf, 0x77, 0x48,\n\t\t\t\t\t\t0x01, // 73-byte signature\n\t\t\t\t\t\t0x41, // OP_DATA_65\n\t\t\t\t\t\t0x04, 0xf4, 0x6d, 0xb5, 0xe9, 0xd6, 0x1a, 0x9d,\n\t\t\t\t\t\t0xc2, 0x7b, 0x8d, 0x64, 0xad, 0x23, 0xe7, 0x38,\n\t\t\t\t\t\t0x3a, 0x4e, 0x6c, 0xa1, 0x64, 0x59, 0x3c, 0x25,\n\t\t\t\t\t\t0x27, 0xc0, 0x38, 0xc0, 0x85, 0x7e, 0xb6, 0x7e,\n\t\t\t\t\t\t0xe8, 0xe8, 0x25, 0xdc, 0xa6, 0x50, 0x46, 0xb8,\n\t\t\t\t\t\t0x2c, 0x93, 0x31, 0x58, 0x6c, 0x82, 0xe0, 0xfd,\n\t\t\t\t\t\t0x1f, 0x63, 0x3f, 0x25, 0xf8, 0x7c, 0x16, 0x1b,\n\t\t\t\t\t\t0xc6, 0xf8, 0xa6, 0x30, 0x12, 0x1d, 0xf2, 0xb3,\n\t\t\t\t\t\t0xd3, // 65-byte pubkey\n\t\t\t\t\t},\n\t\t\t\t\tSequence: 0xffffffff,\n\t\t\t\t},\n\t\t\t},\n\t\t\tTxOut: []*wire.TxOut{\n\t\t\t\t{\n\t\t\t\t\tValue: 0x2123e300, // 556000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x76, // OP_DUP\n\t\t\t\t\t\t0xa9, // OP_HASH160\n\t\t\t\t\t\t0x14, // OP_DATA_20\n\t\t\t\t\t\t0xc3, 0x98, 0xef, 0xa9, 0xc3, 0x92, 0xba, 0x60,\n\t\t\t\t\t\t0x13, 0xc5, 0xe0, 0x4e, 0xe7, 0x29, 0x75, 0x5e,\n\t\t\t\t\t\t0xf7, 0xf5, 0x8b, 0x32,\n\t\t\t\t\t\t0x88, // OP_EQUALVERIFY\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tValue: 0x108e20f00, // 4444000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x76, // OP_DUP\n\t\t\t\t\t\t0xa9, // OP_HASH160\n\t\t\t\t\t\t0x14, // OP_DATA_20\n\t\t\t\t\t\t0x94, 0x8c, 0x76, 0x5a, 0x69, 0x14, 0xd4, 0x3f,\n\t\t\t\t\t\t0x2a, 0x7a, 0xc1, 0x77, 0xda, 0x2c, 0x2f, 0x6b,\n\t\t\t\t\t\t0x52, 0xde, 0x3d, 0x7c,\n\t\t\t\t\t\t0x88, // OP_EQUALVERIFY\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tLockTime: 0,\n\t\t},\n\t\t{\n\t\t\tVersion: 1,\n\t\t\tTxIn: []*wire.TxIn{\n\t\t\t\t{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash: chainhash.Hash([32]byte{ // Make go vet happy.\n\t\t\t\t\t\t\t0xc3, 0x3e, 0xbf, 0xf2, 0xa7, 0x09, 0xf1, 0x3d,\n\t\t\t\t\t\t\t0x9f, 0x9a, 0x75, 0x69, 0xab, 0x16, 0xa3, 0x27,\n\t\t\t\t\t\t\t0x86, 0xaf, 0x7d, 0x7e, 0x2d, 0xe0, 0x92, 0x65,\n\t\t\t\t\t\t\t0xe4, 0x1c, 0x61, 0xd0, 0x78, 0x29, 0x4e, 0xcf,\n\t\t\t\t\t\t}), // cf4e2978d0611ce46592e02d7e7daf8627a316ab69759a9f3df109a7f2bf3ec3\n\t\t\t\t\t\tIndex: 1,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: []byte{\n\t\t\t\t\t\t0x47, // OP_DATA_71\n\t\t\t\t\t\t0x30, 0x44, 0x02, 0x20, 0x03, 0x2d, 0x30, 0xdf,\n\t\t\t\t\t\t0x5e, 0xe6, 0xf5, 0x7f, 0xa4, 0x6c, 0xdd, 0xb5,\n\t\t\t\t\t\t0xeb, 0x8d, 0x0d, 0x9f, 0xe8, 0xde, 0x6b, 0x34,\n\t\t\t\t\t\t0x2d, 0x27, 0x94, 0x2a, 0xe9, 0x0a, 0x32, 0x31,\n\t\t\t\t\t\t0xe0, 0xba, 0x33, 0x3e, 0x02, 0x20, 0x3d, 0xee,\n\t\t\t\t\t\t0xe8, 0x06, 0x0f, 0xdc, 0x70, 0x23, 0x0a, 0x7f,\n\t\t\t\t\t\t0x5b, 0x4a, 0xd7, 0xd7, 0xbc, 0x3e, 0x62, 0x8c,\n\t\t\t\t\t\t0xbe, 0x21, 0x9a, 0x88, 0x6b, 0x84, 0x26, 0x9e,\n\t\t\t\t\t\t0xae, 0xb8, 0x1e, 0x26, 0xb4, 0xfe, 0x01,\n\t\t\t\t\t\t0x41, // OP_DATA_65\n\t\t\t\t\t\t0x04, 0xae, 0x31, 0xc3, 0x1b, 0xf9, 0x12, 0x78,\n\t\t\t\t\t\t0xd9, 0x9b, 0x83, 0x77, 0xa3, 0x5b, 0xbc, 0xe5,\n\t\t\t\t\t\t0xb2, 0x7d, 0x9f, 0xff, 0x15, 0x45, 0x68, 0x39,\n\t\t\t\t\t\t0xe9, 0x19, 0x45, 0x3f, 0xc7, 0xb3, 0xf7, 0x21,\n\t\t\t\t\t\t0xf0, 0xba, 0x40, 0x3f, 0xf9, 0x6c, 0x9d, 0xee,\n\t\t\t\t\t\t0xb6, 0x80, 0xe5, 0xfd, 0x34, 0x1c, 0x0f, 0xc3,\n\t\t\t\t\t\t0xa7, 0xb9, 0x0d, 0xa4, 0x63, 0x1e, 0xe3, 0x95,\n\t\t\t\t\t\t0x60, 0x63, 0x9d, 0xb4, 0x62, 0xe9, 0xcb, 0x85,\n\t\t\t\t\t\t0x0f, // 65-byte pubkey\n\t\t\t\t\t},\n\t\t\t\t\tSequence: 0xffffffff,\n\t\t\t\t},\n\t\t\t},\n\t\t\tTxOut: []*wire.TxOut{\n\t\t\t\t{\n\t\t\t\t\tValue: 0xf4240, // 1000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x76, // OP_DUP\n\t\t\t\t\t\t0xa9, // OP_HASH160\n\t\t\t\t\t\t0x14, // OP_DATA_20\n\t\t\t\t\t\t0xb0, 0xdc, 0xbf, 0x97, 0xea, 0xbf, 0x44, 0x04,\n\t\t\t\t\t\t0xe3, 0x1d, 0x95, 0x24, 0x77, 0xce, 0x82, 0x2d,\n\t\t\t\t\t\t0xad, 0xbe, 0x7e, 0x10,\n\t\t\t\t\t\t0x88, // OP_EQUALVERIFY\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tValue: 0x11d260c0, // 299000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x76, // OP_DUP\n\t\t\t\t\t\t0xa9, // OP_HASH160\n\t\t\t\t\t\t0x14, // OP_DATA_20\n\t\t\t\t\t\t0x6b, 0x12, 0x81, 0xee, 0xc2, 0x5a, 0xb4, 0xe1,\n\t\t\t\t\t\t0xe0, 0x79, 0x3f, 0xf4, 0xe0, 0x8a, 0xb1, 0xab,\n\t\t\t\t\t\t0xb3, 0x40, 0x9c, 0xd9,\n\t\t\t\t\t\t0x88, // OP_EQUALVERIFY\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tLockTime: 0,\n\t\t},\n\t\t{\n\t\t\tVersion: 1,\n\t\t\tTxIn: []*wire.TxIn{\n\t\t\t\t{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash: chainhash.Hash([32]byte{ // Make go vet happy.\n\t\t\t\t\t\t\t0x0b, 0x60, 0x72, 0xb3, 0x86, 0xd4, 0xa7, 0x73,\n\t\t\t\t\t\t\t0x23, 0x52, 0x37, 0xf6, 0x4c, 0x11, 0x26, 0xac,\n\t\t\t\t\t\t\t0x3b, 0x24, 0x0c, 0x84, 0xb9, 0x17, 0xa3, 0x90,\n\t\t\t\t\t\t\t0x9b, 0xa1, 0xc4, 0x3d, 0xed, 0x5f, 0x51, 0xf4,\n\t\t\t\t\t\t}), // f4515fed3dc4a19b90a317b9840c243bac26114cf637522373a7d486b372600b\n\t\t\t\t\t\tIndex: 0,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: []byte{\n\t\t\t\t\t\t0x49, // OP_DATA_73\n\t\t\t\t\t\t0x30, 0x46, 0x02, 0x21, 0x00, 0xbb, 0x1a, 0xd2,\n\t\t\t\t\t\t0x6d, 0xf9, 0x30, 0xa5, 0x1c, 0xce, 0x11, 0x0c,\n\t\t\t\t\t\t0xf4, 0x4f, 0x7a, 0x48, 0xc3, 0xc5, 0x61, 0xfd,\n\t\t\t\t\t\t0x97, 0x75, 0x00, 0xb1, 0xae, 0x5d, 0x6b, 0x6f,\n\t\t\t\t\t\t0xd1, 0x3d, 0x0b, 0x3f, 0x4a, 0x02, 0x21, 0x00,\n\t\t\t\t\t\t0xc5, 0xb4, 0x29, 0x51, 0xac, 0xed, 0xff, 0x14,\n\t\t\t\t\t\t0xab, 0xba, 0x27, 0x36, 0xfd, 0x57, 0x4b, 0xdb,\n\t\t\t\t\t\t0x46, 0x5f, 0x3e, 0x6f, 0x8d, 0xa1, 0x2e, 0x2c,\n\t\t\t\t\t\t0x53, 0x03, 0x95, 0x4a, 0xca, 0x7f, 0x78, 0xf3,\n\t\t\t\t\t\t0x01, // 73-byte signature\n\t\t\t\t\t\t0x41, // OP_DATA_65\n\t\t\t\t\t\t0x04, 0xa7, 0x13, 0x5b, 0xfe, 0x82, 0x4c, 0x97,\n\t\t\t\t\t\t0xec, 0xc0, 0x1e, 0xc7, 0xd7, 0xe3, 0x36, 0x18,\n\t\t\t\t\t\t0x5c, 0x81, 0xe2, 0xaa, 0x2c, 0x41, 0xab, 0x17,\n\t\t\t\t\t\t0x54, 0x07, 0xc0, 0x94, 0x84, 0xce, 0x96, 0x94,\n\t\t\t\t\t\t0xb4, 0x49, 0x53, 0xfc, 0xb7, 0x51, 0x20, 0x65,\n\t\t\t\t\t\t0x64, 0xa9, 0xc2, 0x4d, 0xd0, 0x94, 0xd4, 0x2f,\n\t\t\t\t\t\t0xdb, 0xfd, 0xd5, 0xaa, 0xd3, 0xe0, 0x63, 0xce,\n\t\t\t\t\t\t0x6a, 0xf4, 0xcf, 0xaa, 0xea, 0x4e, 0xa1, 0x4f,\n\t\t\t\t\t\t0xbb, // 65-byte pubkey\n\t\t\t\t\t},\n\t\t\t\t\tSequence: 0xffffffff,\n\t\t\t\t},\n\t\t\t},\n\t\t\tTxOut: []*wire.TxOut{\n\t\t\t\t{\n\t\t\t\t\tValue: 0xf4240, // 1000000\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x76, // OP_DUP\n\t\t\t\t\t\t0xa9, // OP_HASH160\n\t\t\t\t\t\t0x14, // OP_DATA_20\n\t\t\t\t\t\t0x39, 0xaa, 0x3d, 0x56, 0x9e, 0x06, 0xa1, 0xd7,\n\t\t\t\t\t\t0x92, 0x6d, 0xc4, 0xbe, 0x11, 0x93, 0xc9, 0x9b,\n\t\t\t\t\t\t0xf2, 0xeb, 0x9e, 0xe0,\n\t\t\t\t\t\t0x88, // OP_EQUALVERIFY\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tLockTime: 0,\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "btcutil/bloom/README.md",
    "content": "bloom\n=====\n\n[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](http://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/btcutil/bloom)\n\nPackage bloom provides an API for dealing with bitcoin-specific bloom filters.\n\nA comprehensive suite of tests is provided to ensure proper functionality.  See\n`test_coverage.txt` for the gocov coverage report.  Alternatively, if you are\nrunning a POSIX OS, you can run the `cov_report.sh` script for a real-time\nreport.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/btcutil/bloom\n```\n\n## Examples\n\n* [NewFilter Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/bloom#example-NewFilter)  \n  Demonstrates how to create a new bloom filter, add a transaction hash to it,\n  and check if the filter matches the transaction.\n\n## License\n\nPackage bloom is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "btcutil/bloom/cov_report.sh",
    "content": "#!/bin/sh\n\n# This script uses the standard Go test coverage tools to generate a test coverage report.\n\n# Run tests with coverage enabled and generate coverage profile.\ngo test -cover -coverprofile=coverage.txt ./...\n\n# Display function-level coverage statistics.\ngo tool cover -func=coverage.txt\n"
  },
  {
    "path": "btcutil/bloom/example_test.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bloom_test\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil/bloom\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// This example demonstrates how to create a new bloom filter, add a transaction\n// hash to it, and check if the filter matches the transaction.\nfunc ExampleNewFilter() {\n\trand.Seed(time.Now().UnixNano())\n\ttweak := rand.Uint32()\n\n\t// Create a new bloom filter intended to hold 10 elements with a 0.01%\n\t// false positive rate and does not include any automatic update\n\t// functionality when transactions are matched.\n\tfilter := bloom.NewFilter(10, tweak, 0.0001, wire.BloomUpdateNone)\n\n\t// Create a transaction hash and add it to the filter.  This particular\n\t// transaction is the first transaction in block 310,000 of the main\n\t// bitcoin block chain.\n\ttxHashStr := \"fd611c56ca0d378cdcd16244b45c2ba9588da3adac367c4ef43e808b280b8a45\"\n\ttxHash, err := chainhash.NewHashFromStr(txHashStr)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfilter.AddHash(txHash)\n\n\t// Show that the filter matches.\n\tmatches := filter.Matches(txHash[:])\n\tfmt.Println(\"Filter Matches?:\", matches)\n\n\t// Output:\n\t// Filter Matches?: true\n}\n"
  },
  {
    "path": "btcutil/bloom/filter.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bloom\n\nimport (\n\t\"encoding/binary\"\n\t\"math\"\n\t\"sync\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// ln2Squared is simply the square of the natural log of 2.\nconst ln2Squared = math.Ln2 * math.Ln2\n\n// minUint32 is a convenience function to return the minimum value of the two\n// passed uint32 values.\nfunc minUint32(a, b uint32) uint32 {\n\tif a < b {\n\t\treturn a\n\t}\n\treturn b\n}\n\n// Filter defines a bitcoin bloom filter that provides easy manipulation of raw\n// filter data.\ntype Filter struct {\n\tmtx           sync.Mutex\n\tmsgFilterLoad *wire.MsgFilterLoad\n}\n\n// NewFilter creates a new bloom filter instance, mainly to be used by SPV\n// clients.  The tweak parameter is a random value added to the seed value.\n// The false positive rate is the probability of a false positive where 1.0 is\n// \"match everything\" and zero is unachievable.  Thus, providing any false\n// positive rates less than 0 or greater than 1 will be adjusted to the valid\n// range.\n//\n// For more information on what values to use for both elements and fprate,\n// see https://en.wikipedia.org/wiki/Bloom_filter.\nfunc NewFilter(elements, tweak uint32, fprate float64, flags wire.BloomUpdateType) *Filter {\n\t// Massage the false positive rate to sane values.\n\tif fprate > 1.0 {\n\t\tfprate = 1.0\n\t}\n\tif fprate < 1e-9 {\n\t\tfprate = 1e-9\n\t}\n\n\t// Calculate the size of the filter in bytes for the given number of\n\t// elements and false positive rate.\n\t//\n\t// Equivalent to m = -(n*ln(p) / ln(2)^2), where m is in bits.\n\t// Then clamp it to the maximum filter size and convert to bytes.\n\tdataLen := uint32(-1 * float64(elements) * math.Log(fprate) / ln2Squared)\n\tdataLen = minUint32(dataLen, wire.MaxFilterLoadFilterSize*8) / 8\n\n\t// Calculate the number of hash functions based on the size of the\n\t// filter calculated above and the number of elements.\n\t//\n\t// Equivalent to k = (m/n) * ln(2)\n\t// Then clamp it to the maximum allowed hash funcs.\n\thashFuncs := uint32(float64(dataLen*8) / float64(elements) * math.Ln2)\n\thashFuncs = minUint32(hashFuncs, wire.MaxFilterLoadHashFuncs)\n\n\tdata := make([]byte, dataLen)\n\tmsg := wire.NewMsgFilterLoad(data, hashFuncs, tweak, flags)\n\n\treturn &Filter{\n\t\tmsgFilterLoad: msg,\n\t}\n}\n\n// normalize adjusts filter parameters for consistency.\nfunc (bf *Filter) normalize() {\n\tif bf.msgFilterLoad != nil && len(bf.msgFilterLoad.Filter) == 0 {\n\t\tbf.msgFilterLoad.HashFuncs = 0\n\t}\n}\n\n// LoadFilter creates a new Filter instance with the given underlying\n// wire.MsgFilterLoad.\nfunc LoadFilter(filter *wire.MsgFilterLoad) *Filter {\n\tbf := &Filter{\n\t\tmsgFilterLoad: filter,\n\t}\n\tbf.normalize()\n\treturn bf\n}\n\n// IsLoaded returns true if a filter is loaded, otherwise false.\n//\n// This function is safe for concurrent access.\nfunc (bf *Filter) IsLoaded() bool {\n\tbf.mtx.Lock()\n\tloaded := bf.msgFilterLoad != nil\n\tbf.mtx.Unlock()\n\treturn loaded\n}\n\n// Reload loads a new filter replacing any existing filter.\n//\n// This function is safe for concurrent access.\nfunc (bf *Filter) Reload(filter *wire.MsgFilterLoad) {\n\tbf.mtx.Lock()\n\tbf.msgFilterLoad = filter\n\tbf.normalize()\n\tbf.mtx.Unlock()\n}\n\n// Unload unloads the bloom filter.\n//\n// This function is safe for concurrent access.\nfunc (bf *Filter) Unload() {\n\tbf.mtx.Lock()\n\tbf.msgFilterLoad = nil\n\tbf.mtx.Unlock()\n}\n\n// hash returns the bit offset in the bloom filter which corresponds to the\n// passed data for the given independent hash function number.\nfunc (bf *Filter) hash(hashNum uint32, data []byte) uint32 {\n\t// bitcoind: 0xfba4c795 chosen as it guarantees a reasonable bit\n\t// difference between hashNum values.\n\t//\n\t// Note that << 3 is equivalent to multiplying by 8, but is faster.\n\t// Thus the returned hash is brought into range of the number of bits\n\t// the filter has and returned.\n\tmm := MurmurHash3(hashNum*0xfba4c795+bf.msgFilterLoad.Tweak, data)\n\treturn mm % (uint32(len(bf.msgFilterLoad.Filter)) << 3)\n}\n\n// matches returns true if the bloom filter might contain the passed data and\n// false if it definitely does not.\n//\n// This function MUST be called with the filter lock held.\nfunc (bf *Filter) matches(data []byte) bool {\n\tif bf.msgFilterLoad == nil {\n\t\treturn false\n\t}\n\n\t// The bloom filter does not contain the data if any of the bit offsets\n\t// which result from hashing the data using each independent hash\n\t// function are not set.  The shifts and masks below are a faster\n\t// equivalent of:\n\t//   arrayIndex := idx / 8     (idx >> 3)\n\t//   bitOffset := idx % 8      (idx & 7)\n\t///  if filter[arrayIndex] & 1<<bitOffset == 0 { ... }\n\tfor i := uint32(0); i < bf.msgFilterLoad.HashFuncs; i++ {\n\t\tidx := bf.hash(i, data)\n\t\tif bf.msgFilterLoad.Filter[idx>>3]&(1<<(idx&7)) == 0 {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn bf.msgFilterLoad.HashFuncs > 0\n}\n\n// Matches returns true if the bloom filter might contain the passed data and\n// false if it definitely does not.\n//\n// This function is safe for concurrent access.\nfunc (bf *Filter) Matches(data []byte) bool {\n\tbf.mtx.Lock()\n\tmatch := bf.matches(data)\n\tbf.mtx.Unlock()\n\treturn match\n}\n\n// matchesOutPoint returns true if the bloom filter might contain the passed\n// outpoint and false if it definitely does not.\n//\n// This function MUST be called with the filter lock held.\nfunc (bf *Filter) matchesOutPoint(outpoint *wire.OutPoint) bool {\n\t// Serialize\n\tvar buf [chainhash.HashSize + 4]byte\n\tcopy(buf[:], outpoint.Hash[:])\n\tbinary.LittleEndian.PutUint32(buf[chainhash.HashSize:], outpoint.Index)\n\n\treturn bf.matches(buf[:])\n}\n\n// MatchesOutPoint returns true if the bloom filter might contain the passed\n// outpoint and false if it definitely does not.\n//\n// This function is safe for concurrent access.\nfunc (bf *Filter) MatchesOutPoint(outpoint *wire.OutPoint) bool {\n\tbf.mtx.Lock()\n\tmatch := bf.matchesOutPoint(outpoint)\n\tbf.mtx.Unlock()\n\treturn match\n}\n\n// add adds the passed byte slice to the bloom filter.\n//\n// This function MUST be called with the filter lock held.\nfunc (bf *Filter) add(data []byte) {\n\tif bf.msgFilterLoad == nil {\n\t\treturn\n\t}\n\n\t// Adding data to a bloom filter consists of setting all of the bit\n\t// offsets which result from hashing the data using each independent\n\t// hash function.  The shifts and masks below are a faster equivalent\n\t// of:\n\t//   arrayIndex := idx / 8    (idx >> 3)\n\t//   bitOffset := idx % 8     (idx & 7)\n\t///  filter[arrayIndex] |= 1<<bitOffset\n\tfor i := uint32(0); i < bf.msgFilterLoad.HashFuncs; i++ {\n\t\tidx := bf.hash(i, data)\n\t\tbf.msgFilterLoad.Filter[idx>>3] |= (1 << (7 & idx))\n\t}\n}\n\n// Add adds the passed byte slice to the bloom filter.\n//\n// This function is safe for concurrent access.\nfunc (bf *Filter) Add(data []byte) {\n\tbf.mtx.Lock()\n\tbf.add(data)\n\tbf.mtx.Unlock()\n}\n\n// AddHash adds the passed chainhash.Hash to the Filter.\n//\n// This function is safe for concurrent access.\nfunc (bf *Filter) AddHash(hash *chainhash.Hash) {\n\tbf.mtx.Lock()\n\tbf.add(hash[:])\n\tbf.mtx.Unlock()\n}\n\n// addOutPoint adds the passed transaction outpoint to the bloom filter.\n//\n// This function MUST be called with the filter lock held.\nfunc (bf *Filter) addOutPoint(outpoint *wire.OutPoint) {\n\t// Serialize\n\tvar buf [chainhash.HashSize + 4]byte\n\tcopy(buf[:], outpoint.Hash[:])\n\tbinary.LittleEndian.PutUint32(buf[chainhash.HashSize:], outpoint.Index)\n\n\tbf.add(buf[:])\n}\n\n// AddOutPoint adds the passed transaction outpoint to the bloom filter.\n//\n// This function is safe for concurrent access.\nfunc (bf *Filter) AddOutPoint(outpoint *wire.OutPoint) {\n\tbf.mtx.Lock()\n\tbf.addOutPoint(outpoint)\n\tbf.mtx.Unlock()\n}\n\n// maybeAddOutpoint potentially adds the passed outpoint to the bloom filter\n// depending on the bloom update flags and the type of the passed public key\n// script.\n//\n// This function MUST be called with the filter lock held.\nfunc (bf *Filter) maybeAddOutpoint(pkScript []byte, outHash *chainhash.Hash, outIdx uint32) {\n\tswitch bf.msgFilterLoad.Flags {\n\tcase wire.BloomUpdateAll:\n\t\toutpoint := wire.NewOutPoint(outHash, outIdx)\n\t\tbf.addOutPoint(outpoint)\n\tcase wire.BloomUpdateP2PubkeyOnly:\n\t\tclass := txscript.GetScriptClass(pkScript)\n\t\tif class == txscript.PubKeyTy || class == txscript.MultiSigTy {\n\t\t\toutpoint := wire.NewOutPoint(outHash, outIdx)\n\t\t\tbf.addOutPoint(outpoint)\n\t\t}\n\t}\n}\n\n// matchTxAndUpdate returns true if the bloom filter matches data within the\n// passed transaction, otherwise false is returned.  If the filter does match\n// the passed transaction, it will also update the filter depending on the bloom\n// update flags set via the loaded filter if needed.\n//\n// This function MUST be called with the filter lock held.\nfunc (bf *Filter) matchTxAndUpdate(tx *btcutil.Tx) bool {\n\t// Check if the filter matches the hash of the transaction.\n\t// This is useful for finding transactions when they appear in a block.\n\tmatched := bf.matches(tx.Hash()[:])\n\n\t// Check if the filter matches any data elements in the public key\n\t// scripts of any of the outputs.  When it does, add the outpoint that\n\t// matched so transactions which spend from the matched transaction are\n\t// also included in the filter.  This removes the burden of updating the\n\t// filter for this scenario from the client.  It is also more efficient\n\t// on the network since it avoids the need for another filteradd message\n\t// from the client and avoids some potential races that could otherwise\n\t// occur.\n\tfor i, txOut := range tx.MsgTx().TxOut {\n\t\tpushedData, err := txscript.PushedData(txOut.PkScript)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, data := range pushedData {\n\t\t\tif !bf.matches(data) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tmatched = true\n\t\t\tbf.maybeAddOutpoint(txOut.PkScript, tx.Hash(), uint32(i))\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// Nothing more to do if a match has already been made.\n\tif matched {\n\t\treturn true\n\t}\n\n\t// At this point, the transaction and none of the data elements in the\n\t// public key scripts of its outputs matched.\n\n\t// Check if the filter matches any outpoints this transaction spends or\n\t// any data elements in the signature scripts of any of the inputs.\n\tfor _, txin := range tx.MsgTx().TxIn {\n\t\tif bf.matchesOutPoint(&txin.PreviousOutPoint) {\n\t\t\treturn true\n\t\t}\n\n\t\tpushedData, err := txscript.PushedData(txin.SignatureScript)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, data := range pushedData {\n\t\t\tif bf.matches(data) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n\n// MatchTxAndUpdate returns true if the bloom filter matches data within the\n// passed transaction, otherwise false is returned.  If the filter does match\n// the passed transaction, it will also update the filter depending on the bloom\n// update flags set via the loaded filter if needed.\n//\n// This function is safe for concurrent access.\nfunc (bf *Filter) MatchTxAndUpdate(tx *btcutil.Tx) bool {\n\tbf.mtx.Lock()\n\tmatch := bf.matchTxAndUpdate(tx)\n\tbf.mtx.Unlock()\n\treturn match\n}\n\n// MsgFilterLoad returns the underlying wire.MsgFilterLoad for the bloom\n// filter.\n//\n// This function is safe for concurrent access.\nfunc (bf *Filter) MsgFilterLoad() *wire.MsgFilterLoad {\n\tbf.mtx.Lock()\n\tmsg := bf.msgFilterLoad\n\tbf.mtx.Unlock()\n\treturn msg\n}\n"
  },
  {
    "path": "btcutil/bloom/filter_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bloom_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/btcutil/bloom\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TestFilterLarge ensures a maximum sized filter can be created.\nfunc TestFilterLarge(t *testing.T) {\n\tf := bloom.NewFilter(100000000, 0, 0.01, wire.BloomUpdateNone)\n\tif len(f.MsgFilterLoad().Filter) > wire.MaxFilterLoadFilterSize {\n\t\tt.Errorf(\"TestFilterLarge test failed: %d > %d\",\n\t\t\tlen(f.MsgFilterLoad().Filter), wire.MaxFilterLoadFilterSize)\n\t}\n}\n\n// TestFilterLoad ensures loading and unloading of a filter pass.\nfunc TestFilterLoad(t *testing.T) {\n\t// Test various filter configurations\n\ttests := []struct {\n\t\tname      string\n\t\tfilter    *wire.MsgFilterLoad\n\t\twantMatch bool\n\t}{\n\t\t{\n\t\t\t\"normal filter\",\n\t\t\t&wire.MsgFilterLoad{\n\t\t\t\tFilter:    []byte{0x00},\n\t\t\t\tHashFuncs: 1,\n\t\t\t},\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"empty filter with funcs\",\n\t\t\t&wire.MsgFilterLoad{\n\t\t\t\tFilter:    []byte{},\n\t\t\t\tHashFuncs: 1,\n\t\t\t},\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"minimal filter\",\n\t\t\t&wire.MsgFilterLoad{},\n\t\t\tfalse,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tf := bloom.LoadFilter(test.filter)\n\t\tif !f.IsLoaded() {\n\t\t\tt.Errorf(\"%s: IsLoaded test failed: \"+\n\t\t\t\t\"want true got false\", test.name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif f.Matches([]byte(\"test\")) != test.wantMatch {\n\t\t\tt.Errorf(\"%s: unexpected match result\", test.name)\n\t\t}\n\n\t\tf.Unload()\n\t\tif f.IsLoaded() {\n\t\t\tt.Errorf(\"%s: IsLoaded after Unload failed: \"+\n\t\t\t\t\"want false got true\", test.name)\n\t\t}\n\t}\n}\n\n// TestFilterInsert ensures inserting data into the filter causes that data\n// to be matched and the resulting serialized MsgFilterLoad is the expected\n// value.\nfunc TestFilterInsert(t *testing.T) {\n\tvar tests = []struct {\n\t\thex    string\n\t\tinsert bool\n\t}{\n\t\t{\"99108ad8ed9bb6274d3980bab5a85c048f0950c8\", true},\n\t\t{\"19108ad8ed9bb6274d3980bab5a85c048f0950c8\", false},\n\t\t{\"b5a2c786d9ef4658287ced5914b37a1b4aa32eee\", true},\n\t\t{\"b9300670b4c5366e95b2699e8b18bc75e5f729c5\", true},\n\t}\n\n\tf := bloom.NewFilter(3, 0, 0.01, wire.BloomUpdateAll)\n\n\tfor i, test := range tests {\n\t\tdata, err := hex.DecodeString(test.hex)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"TestFilterInsert DecodeString failed: %v\\n\", err)\n\t\t\treturn\n\t\t}\n\t\tif test.insert {\n\t\t\tf.Add(data)\n\t\t}\n\n\t\tresult := f.Matches(data)\n\t\tif test.insert != result {\n\t\t\tt.Errorf(\"TestFilterInsert Matches test #%d failure: got %v want %v\\n\",\n\t\t\t\ti, result, test.insert)\n\t\t\treturn\n\t\t}\n\t}\n\n\twant, err := hex.DecodeString(\"03614e9b050000000000000001\")\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsert DecodeString failed: %v\\n\", err)\n\t\treturn\n\t}\n\n\tgot := bytes.NewBuffer(nil)\n\terr = f.MsgFilterLoad().BtcEncode(got, wire.ProtocolVersion, wire.LatestEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsert BtcDecode failed: %v\\n\", err)\n\t\treturn\n\t}\n\n\tif !bytes.Equal(got.Bytes(), want) {\n\t\tt.Errorf(\"TestFilterInsert failure: got %v want %v\\n\",\n\t\t\tgot.Bytes(), want)\n\t\treturn\n\t}\n}\n\n// TestFilterFPRange checks that new filters made with out of range\n// false positive targets result in either max or min false positive rates.\nfunc TestFilterFPRange(t *testing.T) {\n\ttests := []struct {\n\t\tname   string\n\t\thash   string\n\t\twant   string\n\t\tfilter *bloom.Filter\n\t}{\n\t\t{\n\t\t\tname:   \"fprates > 1 should be clipped at 1\",\n\t\t\thash:   \"02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041\",\n\t\t\twant:   \"00000000000000000001\",\n\t\t\tfilter: bloom.NewFilter(1, 0, 20.9999999769, wire.BloomUpdateAll),\n\t\t},\n\t\t{\n\t\t\tname:   \"fprates less than 1e-9 should be clipped at min\",\n\t\t\thash:   \"02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041\",\n\t\t\twant:   \"0566d97a91a91b0000000000000001\",\n\t\t\tfilter: bloom.NewFilter(1, 0, 0, wire.BloomUpdateAll),\n\t\t},\n\t\t{\n\t\t\tname:   \"negative fprates should be clipped at min\",\n\t\t\thash:   \"02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041\",\n\t\t\twant:   \"0566d97a91a91b0000000000000001\",\n\t\t\tfilter: bloom.NewFilter(1, 0, -1, wire.BloomUpdateAll),\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Convert test input to appropriate types.\n\t\thash, err := chainhash.NewHashFromStr(test.hash)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"NewHashFromStr unexpected error: %v\", err)\n\t\t\tcontinue\n\t\t}\n\t\twant, err := hex.DecodeString(test.want)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"DecodeString unexpected error: %v\\n\", err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Add the test hash to the bloom filter and ensure the\n\t\t// filter serializes to the expected bytes.\n\t\tf := test.filter\n\t\tf.AddHash(hash)\n\t\tgot := bytes.NewBuffer(nil)\n\t\terr = f.MsgFilterLoad().BtcEncode(got, wire.ProtocolVersion, wire.LatestEncoding)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode unexpected error: %v\\n\", err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(got.Bytes(), want) {\n\t\t\tt.Errorf(\"serialized filter mismatch: got %x want %x\\n\",\n\t\t\t\tgot.Bytes(), want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestFilterInsert ensures inserting data into the filter with a tweak causes\n// that data to be matched and the resulting serialized MsgFilterLoad is the\n// expected value.\nfunc TestFilterInsertWithTweak(t *testing.T) {\n\tvar tests = []struct {\n\t\thex    string\n\t\tinsert bool\n\t}{\n\t\t{\"99108ad8ed9bb6274d3980bab5a85c048f0950c8\", true},\n\t\t{\"19108ad8ed9bb6274d3980bab5a85c048f0950c8\", false},\n\t\t{\"b5a2c786d9ef4658287ced5914b37a1b4aa32eee\", true},\n\t\t{\"b9300670b4c5366e95b2699e8b18bc75e5f729c5\", true},\n\t}\n\n\tf := bloom.NewFilter(3, 2147483649, 0.01, wire.BloomUpdateAll)\n\n\tfor i, test := range tests {\n\t\tdata, err := hex.DecodeString(test.hex)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"TestFilterInsertWithTweak DecodeString failed: %v\\n\", err)\n\t\t\treturn\n\t\t}\n\t\tif test.insert {\n\t\t\tf.Add(data)\n\t\t}\n\n\t\tresult := f.Matches(data)\n\t\tif test.insert != result {\n\t\t\tt.Errorf(\"TestFilterInsertWithTweak Matches test #%d failure: got %v want %v\\n\",\n\t\t\t\ti, result, test.insert)\n\t\t\treturn\n\t\t}\n\t}\n\n\twant, err := hex.DecodeString(\"03ce4299050000000100008001\")\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertWithTweak DecodeString failed: %v\\n\", err)\n\t\treturn\n\t}\n\tgot := bytes.NewBuffer(nil)\n\terr = f.MsgFilterLoad().BtcEncode(got, wire.ProtocolVersion, wire.LatestEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertWithTweak BtcDecode failed: %v\\n\", err)\n\t\treturn\n\t}\n\n\tif !bytes.Equal(got.Bytes(), want) {\n\t\tt.Errorf(\"TestFilterInsertWithTweak failure: got %v want %v\\n\",\n\t\t\tgot.Bytes(), want)\n\t\treturn\n\t}\n}\n\n// TestFilterInsertKey ensures inserting public keys and addresses works as\n// expected.\nfunc TestFilterInsertKey(t *testing.T) {\n\tsecret := \"5Kg1gnAjaLfKiwhhPpGS3QfRg2m6awQvaj98JCZBZQ5SuS2F15C\"\n\n\twif, err := btcutil.DecodeWIF(secret)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertKey DecodeWIF failed: %v\", err)\n\t\treturn\n\t}\n\n\tf := bloom.NewFilter(2, 0, 0.001, wire.BloomUpdateAll)\n\tf.Add(wif.SerializePubKey())\n\tf.Add(btcutil.Hash160(wif.SerializePubKey()))\n\n\twant, err := hex.DecodeString(\"038fc16b080000000000000001\")\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertWithTweak DecodeString failed: %v\\n\", err)\n\t\treturn\n\t}\n\tgot := bytes.NewBuffer(nil)\n\terr = f.MsgFilterLoad().BtcEncode(got, wire.ProtocolVersion, wire.LatestEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertWithTweak BtcDecode failed: %v\\n\", err)\n\t\treturn\n\t}\n\n\tif !bytes.Equal(got.Bytes(), want) {\n\t\tt.Errorf(\"TestFilterInsertWithTweak failure: got %v want %v\\n\",\n\t\t\tgot.Bytes(), want)\n\t\treturn\n\t}\n}\n\nfunc TestFilterBloomMatch(t *testing.T) {\n\tstr := \"01000000010b26e9b7735eb6aabdf358bab62f9816a21ba9ebdb719d5299e\" +\n\t\t\"88607d722c190000000008b4830450220070aca44506c5cef3a16ed519d7\" +\n\t\t\"c3c39f8aab192c4e1c90d065f37b8a4af6141022100a8e160b856c2d43d2\" +\n\t\t\"7d8fba71e5aef6405b8643ac4cb7cb3c462aced7f14711a0141046d11fee\" +\n\t\t\"51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95c9a40ac5e\" +\n\t\t\"eef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe76036c33\" +\n\t\t\"9ffffffff021bff3d11000000001976a91404943fdd508053c75000106d3\" +\n\t\t\"bc6e2754dbcff1988ac2f15de00000000001976a914a266436d296554760\" +\n\t\t\"8b9e15d9032a7b9d64fa43188ac00000000\"\n\tstrBytes, err := hex.DecodeString(str)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch DecodeString failure: %v\", err)\n\t\treturn\n\t}\n\ttx, err := btcutil.NewTxFromBytes(strBytes)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch NewTxFromBytes failure: %v\", err)\n\t\treturn\n\t}\n\tspendingTxBytes := []byte{0x01, 0x00, 0x00, 0x00, 0x01, 0x6b, 0xff, 0x7f,\n\t\t0xcd, 0x4f, 0x85, 0x65, 0xef, 0x40, 0x6d, 0xd5, 0xd6,\n\t\t0x3d, 0x4f, 0xf9, 0x4f, 0x31, 0x8f, 0xe8, 0x20, 0x27,\n\t\t0xfd, 0x4d, 0xc4, 0x51, 0xb0, 0x44, 0x74, 0x01, 0x9f,\n\t\t0x74, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x49, 0x30,\n\t\t0x46, 0x02, 0x21, 0x00, 0xda, 0x0d, 0xc6, 0xae, 0xce,\n\t\t0xfe, 0x1e, 0x06, 0xef, 0xdf, 0x05, 0x77, 0x37, 0x57,\n\t\t0xde, 0xb1, 0x68, 0x82, 0x09, 0x30, 0xe3, 0xb0, 0xd0,\n\t\t0x3f, 0x46, 0xf5, 0xfc, 0xf1, 0x50, 0xbf, 0x99, 0x0c,\n\t\t0x02, 0x21, 0x00, 0xd2, 0x5b, 0x5c, 0x87, 0x04, 0x00,\n\t\t0x76, 0xe4, 0xf2, 0x53, 0xf8, 0x26, 0x2e, 0x76, 0x3e,\n\t\t0x2d, 0xd5, 0x1e, 0x7f, 0xf0, 0xbe, 0x15, 0x77, 0x27,\n\t\t0xc4, 0xbc, 0x42, 0x80, 0x7f, 0x17, 0xbd, 0x39, 0x01,\n\t\t0x41, 0x04, 0xe6, 0xc2, 0x6e, 0xf6, 0x7d, 0xc6, 0x10,\n\t\t0xd2, 0xcd, 0x19, 0x24, 0x84, 0x78, 0x9a, 0x6c, 0xf9,\n\t\t0xae, 0xa9, 0x93, 0x0b, 0x94, 0x4b, 0x7e, 0x2d, 0xb5,\n\t\t0x34, 0x2b, 0x9d, 0x9e, 0x5b, 0x9f, 0xf7, 0x9a, 0xff,\n\t\t0x9a, 0x2e, 0xe1, 0x97, 0x8d, 0xd7, 0xfd, 0x01, 0xdf,\n\t\t0xc5, 0x22, 0xee, 0x02, 0x28, 0x3d, 0x3b, 0x06, 0xa9,\n\t\t0xd0, 0x3a, 0xcf, 0x80, 0x96, 0x96, 0x8d, 0x7d, 0xbb,\n\t\t0x0f, 0x91, 0x78, 0xff, 0xff, 0xff, 0xff, 0x02, 0x8b,\n\t\t0xa7, 0x94, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76,\n\t\t0xa9, 0x14, 0xba, 0xde, 0xec, 0xfd, 0xef, 0x05, 0x07,\n\t\t0x24, 0x7f, 0xc8, 0xf7, 0x42, 0x41, 0xd7, 0x3b, 0xc0,\n\t\t0x39, 0x97, 0x2d, 0x7b, 0x88, 0xac, 0x40, 0x94, 0xa8,\n\t\t0x02, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76, 0xa9, 0x14,\n\t\t0xc1, 0x09, 0x32, 0x48, 0x3f, 0xec, 0x93, 0xed, 0x51,\n\t\t0xf5, 0xfe, 0x95, 0xe7, 0x25, 0x59, 0xf2, 0xcc, 0x70,\n\t\t0x43, 0xf9, 0x88, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00}\n\n\tspendingTx, err := btcutil.NewTxFromBytes(spendingTxBytes)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch NewTxFromBytes failure: %v\", err)\n\t\treturn\n\t}\n\n\tf := bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\tinputStr := \"b4749f017444b051c44dfd2720e88f314ff94f3dd6d56d40ef65854fcd7fff6b\"\n\thash, err := chainhash.NewHashFromStr(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch NewHashFromStr failed: %v\\n\", err)\n\t\treturn\n\t}\n\tf.AddHash(hash)\n\tif !f.MatchTxAndUpdate(tx) {\n\t\tt.Errorf(\"TestFilterBloomMatch didn't match hash %s\", inputStr)\n\t}\n\n\tf = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\tinputStr = \"6bff7fcd4f8565ef406dd5d63d4ff94f318fe82027fd4dc451b04474019f74b4\"\n\thashBytes, err := hex.DecodeString(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch DecodeString failed: %v\\n\", err)\n\t\treturn\n\t}\n\tf.Add(hashBytes)\n\tif !f.MatchTxAndUpdate(tx) {\n\t\tt.Errorf(\"TestFilterBloomMatch didn't match hash %s\", inputStr)\n\t}\n\n\tf = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\tinputStr = \"30450220070aca44506c5cef3a16ed519d7c3c39f8aab192c4e1c90d065\" +\n\t\t\"f37b8a4af6141022100a8e160b856c2d43d27d8fba71e5aef6405b8643\" +\n\t\t\"ac4cb7cb3c462aced7f14711a01\"\n\thashBytes, err = hex.DecodeString(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch DecodeString failed: %v\\n\", err)\n\t\treturn\n\t}\n\tf.Add(hashBytes)\n\tif !f.MatchTxAndUpdate(tx) {\n\t\tt.Errorf(\"TestFilterBloomMatch didn't match input signature %s\", inputStr)\n\t}\n\n\tf = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\tinputStr = \"046d11fee51b0e60666d5049a9101a72741df480b96ee26488a4d3466b95\" +\n\t\t\"c9a40ac5eeef87e10a5cd336c19a84565f80fa6c547957b7700ff4dfbdefe\" +\n\t\t\"76036c339\"\n\thashBytes, err = hex.DecodeString(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch DecodeString failed: %v\\n\", err)\n\t\treturn\n\t}\n\tf.Add(hashBytes)\n\tif !f.MatchTxAndUpdate(tx) {\n\t\tt.Errorf(\"TestFilterBloomMatch didn't match input pubkey %s\", inputStr)\n\t}\n\n\tf = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\tinputStr = \"04943fdd508053c75000106d3bc6e2754dbcff19\"\n\thashBytes, err = hex.DecodeString(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch DecodeString failed: %v\\n\", err)\n\t\treturn\n\t}\n\tf.Add(hashBytes)\n\tif !f.MatchTxAndUpdate(tx) {\n\t\tt.Errorf(\"TestFilterBloomMatch didn't match output address %s\", inputStr)\n\t}\n\tif !f.MatchTxAndUpdate(spendingTx) {\n\t\tt.Errorf(\"TestFilterBloomMatch spendingTx didn't match output address %s\", inputStr)\n\t}\n\n\tf = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\tinputStr = \"a266436d2965547608b9e15d9032a7b9d64fa431\"\n\thashBytes, err = hex.DecodeString(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch DecodeString failed: %v\\n\", err)\n\t\treturn\n\t}\n\tf.Add(hashBytes)\n\tif !f.MatchTxAndUpdate(tx) {\n\t\tt.Errorf(\"TestFilterBloomMatch didn't match output address %s\", inputStr)\n\t}\n\n\tf = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\tinputStr = \"90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b\"\n\thash, err = chainhash.NewHashFromStr(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch NewHashFromStr failed: %v\\n\", err)\n\t\treturn\n\t}\n\toutpoint := wire.NewOutPoint(hash, 0)\n\tf.AddOutPoint(outpoint)\n\tif !f.MatchTxAndUpdate(tx) {\n\t\tt.Errorf(\"TestFilterBloomMatch didn't match outpoint %s\", inputStr)\n\t}\n\n\tf = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\tinputStr = \"00000009e784f32f62ef849763d4f45b98e07ba658647343b915ff832b110436\"\n\thash, err = chainhash.NewHashFromStr(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch NewHashFromStr failed: %v\\n\", err)\n\t\treturn\n\t}\n\tf.AddHash(hash)\n\tif f.MatchTxAndUpdate(tx) {\n\t\tt.Errorf(\"TestFilterBloomMatch matched hash %s\", inputStr)\n\t}\n\n\tf = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\tinputStr = \"0000006d2965547608b9e15d9032a7b9d64fa431\"\n\thashBytes, err = hex.DecodeString(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch DecodeString failed: %v\\n\", err)\n\t\treturn\n\t}\n\tf.Add(hashBytes)\n\tif f.MatchTxAndUpdate(tx) {\n\t\tt.Errorf(\"TestFilterBloomMatch matched address %s\", inputStr)\n\t}\n\n\tf = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\tinputStr = \"90c122d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b\"\n\thash, err = chainhash.NewHashFromStr(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch NewHashFromStr failed: %v\\n\", err)\n\t\treturn\n\t}\n\toutpoint = wire.NewOutPoint(hash, 1)\n\tf.AddOutPoint(outpoint)\n\tif f.MatchTxAndUpdate(tx) {\n\t\tt.Errorf(\"TestFilterBloomMatch matched outpoint %s\", inputStr)\n\t}\n\n\tf = bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\tinputStr = \"000000d70786e899529d71dbeba91ba216982fb6ba58f3bdaab65e73b7e9260b\"\n\thash, err = chainhash.NewHashFromStr(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterBloomMatch NewHashFromStr failed: %v\\n\", err)\n\t\treturn\n\t}\n\toutpoint = wire.NewOutPoint(hash, 0)\n\tf.AddOutPoint(outpoint)\n\tif f.MatchTxAndUpdate(tx) {\n\t\tt.Errorf(\"TestFilterBloomMatch matched outpoint %s\", inputStr)\n\t}\n}\n\nfunc TestFilterInsertUpdateNone(t *testing.T) {\n\tf := bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateNone)\n\n\t// Add the generation pubkey\n\tinputStr := \"04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c\" +\n\t\t\"876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a\" +\n\t\t\"2252247d97a46a91\"\n\tinputBytes, err := hex.DecodeString(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertUpdateNone DecodeString failed: %v\", err)\n\t\treturn\n\t}\n\tf.Add(inputBytes)\n\n\t// Add the output address for the 4th transaction\n\tinputStr = \"b6efd80d99179f4f4ff6f4dd0a007d018c385d21\"\n\tinputBytes, err = hex.DecodeString(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertUpdateNone DecodeString failed: %v\", err)\n\t\treturn\n\t}\n\tf.Add(inputBytes)\n\n\tinputStr = \"147caa76786596590baa4e98f5d9f48b86c7765e489f7a6ff3360fe5c674360b\"\n\thash, err := chainhash.NewHashFromStr(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertUpdateNone NewHashFromStr failed: %v\", err)\n\t\treturn\n\t}\n\toutpoint := wire.NewOutPoint(hash, 0)\n\n\tif f.MatchesOutPoint(outpoint) {\n\t\tt.Errorf(\"TestFilterInsertUpdateNone matched outpoint %s\", inputStr)\n\t\treturn\n\t}\n\n\tinputStr = \"02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041\"\n\thash, err = chainhash.NewHashFromStr(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertUpdateNone NewHashFromStr failed: %v\", err)\n\t\treturn\n\t}\n\toutpoint = wire.NewOutPoint(hash, 0)\n\n\tif f.MatchesOutPoint(outpoint) {\n\t\tt.Errorf(\"TestFilterInsertUpdateNone matched outpoint %s\", inputStr)\n\t\treturn\n\t}\n}\n\nfunc TestFilterInsertP2PubKeyOnly(t *testing.T) {\n\tblockStr := \"0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc\" +\n\t\t\"880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367\" +\n\t\t\"117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010\" +\n\t\t\"00000000000000000000000000000000000000000000000000000000000\" +\n\t\t\"0000ffffffff07044c86041b0136ffffffff0100f2052a0100000043410\" +\n\t\t\"4eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2\" +\n\t\t\"c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a22522\" +\n\t\t\"47d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255\" +\n\t\t\"120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356\" +\n\t\t\"e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062e\" +\n\t\t\"a10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa\" +\n\t\t\"608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ec\" +\n\t\t\"bba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141\" +\n\t\t\"b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac0000000001000000\" +\n\t\t\"03fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26a\" +\n\t\t\"f16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23\" +\n\t\t\"b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6\" +\n\t\t\"b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e\" +\n\t\t\"29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245b\" +\n\t\t\"d69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585\" +\n\t\t\"caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e7\" +\n\t\t\"5429df397b5af83000000004948304502202bdb79c596a9ffc24e96f438\" +\n\t\t\"6199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b72\" +\n\t\t\"4fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffff\" +\n\t\t\"ff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cb\" +\n\t\t\"cb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9cecc\" +\n\t\t\"d328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f11\" +\n\t\t\"87779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff010071\" +\n\t\t\"4460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8\" +\n\t\t\"d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397\" +\n\t\t\"cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3\" +\n\t\t\"e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e4022100\" +\n\t\t\"8581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7\" +\n\t\t\"c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf64852\" +\n\t\t\"61c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d\" +\n\t\t\"3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f2\" +\n\t\t\"48e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124\" +\n\t\t\"c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e93\" +\n\t\t\"0220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346\" +\n\t\t\"669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6\" +\n\t\t\"485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270e\" +\n\t\t\"fb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051\" +\n\t\t\"fd372bb7a537232946e0a46f53636b4dafdaa4000000008c49304602210\" +\n\t\t\"0c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de\" +\n\t\t\"35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46f\" +\n\t\t\"c37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0\" +\n\t\t\"f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f\" +\n\t\t\"4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f8\" +\n\t\t\"94aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493\" +\n\t\t\"046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8a\" +\n\t\t\"a788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415\" +\n\t\t\"588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb\" +\n\t\t\"7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018\" +\n\t\t\"ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8\" +\n\t\t\"040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188a\" +\n\t\t\"c000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758d\" +\n\t\t\"f616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34\" +\n\t\t\"fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243\" +\n\t\t\"bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec\" +\n\t\t\"20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442\" +\n\t\t\"e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632\" +\n\t\t\"d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10\" +\n\t\t\"eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a91\" +\n\t\t\"4a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000\" +\n\t\t\"000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850\" +\n\t\t\"927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec\" +\n\t\t\"2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a25\" +\n\t\t\"7b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e5\" +\n\t\t\"21fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455f\" +\n\t\t\"e30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098\" +\n\t\t\"544bffffffff0240420f00000000001976a9144676d1b820d63ec272f19\" +\n\t\t\"00d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00\" +\n\t\t\"d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc91750\" +\n\t\t\"1ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f10000\" +\n\t\t\"00008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e\" +\n\t\t\"280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba80\" +\n\t\t\"7892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b\" +\n\t\t\"5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c4\" +\n\t\t\"7d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41e\" +\n\t\t\"d70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d0\" +\n\t\t\"68000000008b4830450221008513ad65187b903aed1102d1d0c47688127\" +\n\t\t\"658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de6603\" +\n\t\t\"5fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50b\" +\n\t\t\"e1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b0682\" +\n\t\t\"0edca9ef982c35fda2d255afba340068c5035552368bc7200c1488fffff\" +\n\t\t\"fff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e40\" +\n\t\t\"0f8699eb4888ac00000000\"\n\tblockBytes, err := hex.DecodeString(blockStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertP2PubKeyOnly DecodeString failed: %v\", err)\n\t\treturn\n\t}\n\tblock, err := btcutil.NewBlockFromBytes(blockBytes)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertP2PubKeyOnly NewBlockFromBytes failed: %v\", err)\n\t\treturn\n\t}\n\n\tf := bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateP2PubkeyOnly)\n\n\t// Generation pubkey\n\tinputStr := \"04eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c\" +\n\t\t\"876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a\" +\n\t\t\"2252247d97a46a91\"\n\tinputBytes, err := hex.DecodeString(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertP2PubKeyOnly DecodeString failed: %v\", err)\n\t\treturn\n\t}\n\tf.Add(inputBytes)\n\n\t// Output address of 4th transaction\n\tinputStr = \"b6efd80d99179f4f4ff6f4dd0a007d018c385d21\"\n\tinputBytes, err = hex.DecodeString(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestFilterInsertP2PubKeyOnly DecodeString failed: %v\", err)\n\t\treturn\n\t}\n\tf.Add(inputBytes)\n\n\t// Ignore return value -- this is just used to update the filter.\n\t_, _ = bloom.NewMerkleBlock(block, f)\n\n\t// We should match the generation pubkey\n\tinputStr = \"147caa76786596590baa4e98f5d9f48b86c7765e489f7a6ff3360fe5c674360b\"\n\thash, err := chainhash.NewHashFromStr(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestMerkleBlockP2PubKeyOnly NewHashFromStr failed: %v\", err)\n\t\treturn\n\t}\n\toutpoint := wire.NewOutPoint(hash, 0)\n\tif !f.MatchesOutPoint(outpoint) {\n\t\tt.Errorf(\"TestMerkleBlockP2PubKeyOnly didn't match the generation \"+\n\t\t\t\"outpoint %s\", inputStr)\n\t\treturn\n\t}\n\n\t// We should not match the 4th transaction, which is not p2pk\n\tinputStr = \"02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041\"\n\thash, err = chainhash.NewHashFromStr(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestMerkleBlockP2PubKeyOnly NewHashFromStr failed: %v\", err)\n\t\treturn\n\t}\n\toutpoint = wire.NewOutPoint(hash, 0)\n\tif f.MatchesOutPoint(outpoint) {\n\t\tt.Errorf(\"TestMerkleBlockP2PubKeyOnly matched outpoint %s\", inputStr)\n\t\treturn\n\t}\n}\n\nfunc TestFilterReload(t *testing.T) {\n\tf := bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\n\tbFilter := bloom.LoadFilter(f.MsgFilterLoad())\n\tif bFilter.MsgFilterLoad() == nil {\n\t\tt.Errorf(\"TestFilterReload LoadFilter test failed\")\n\t\treturn\n\t}\n\n\treloadTests := []struct {\n\t\tname   string\n\t\tfilter *wire.MsgFilterLoad\n\t}{\n\t\t{\n\t\t\tname:   \"nil filter\",\n\t\t\tfilter: nil,\n\t\t},\n\t\t{\n\t\t\tname: \"empty filter\",\n\t\t\tfilter: &wire.MsgFilterLoad{\n\t\t\t\tFilter:    []byte{},\n\t\t\t\tHashFuncs: 3,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"normal filter\",\n\t\t\tfilter: &wire.MsgFilterLoad{\n\t\t\t\tFilter:    []byte{0x00},\n\t\t\t\tHashFuncs: 1,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range reloadTests {\n\t\tbFilter.Reload(test.filter)\n\t\tif test.filter == nil {\n\t\t\tif bFilter.MsgFilterLoad() != nil {\n\t\t\t\tt.Errorf(\"%s: Reload test failed - \"+\n\t\t\t\t\t\"expected nil\", test.name)\n\t\t\t}\n\t\t} else {\n\t\t\tbFilter.Add([]byte(\"test data\"))\n\t\t\tif bFilter.Matches([]byte(\"test data\")) &&\n\t\t\t\tlen(test.filter.Filter) == 0 {\n\n\t\t\t\tt.Errorf(\"%s: empty filter should \"+\n\t\t\t\t\t\"not match\", test.name)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcutil/bloom/merkleblock.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bloom\n\nimport (\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// merkleBlock is used to house intermediate information needed to generate a\n// wire.MsgMerkleBlock according to a filter.\ntype merkleBlock struct {\n\tnumTx       uint32\n\tallHashes   []*chainhash.Hash\n\tfinalHashes []*chainhash.Hash\n\tmatchedBits []byte\n\tbits        []byte\n}\n\n// calcTreeWidth calculates and returns the number of nodes (width) or a\n// merkle tree at the given depth-first height.\nfunc (m *merkleBlock) calcTreeWidth(height uint32) uint32 {\n\treturn (m.numTx + (1 << height) - 1) >> height\n}\n\n// calcHash returns the hash for a sub-tree given a depth-first height and\n// node position.\nfunc (m *merkleBlock) calcHash(height, pos uint32) *chainhash.Hash {\n\tif height == 0 {\n\t\treturn m.allHashes[pos]\n\t}\n\n\tvar right *chainhash.Hash\n\tleft := m.calcHash(height-1, pos*2)\n\tif pos*2+1 < m.calcTreeWidth(height-1) {\n\t\tright = m.calcHash(height-1, pos*2+1)\n\t} else {\n\t\tright = left\n\t}\n\tres := blockchain.HashMerkleBranches(left, right)\n\treturn &res\n}\n\n// traverseAndBuild builds a partial merkle tree using a recursive depth-first\n// approach.  As it calculates the hashes, it also saves whether or not each\n// node is a parent node and a list of final hashes to be included in the\n// merkle block.\nfunc (m *merkleBlock) traverseAndBuild(height, pos uint32) {\n\t// Determine whether this node is a parent of a matched node.\n\tvar isParent byte\n\tfor i := pos << height; i < (pos+1)<<height && i < m.numTx; i++ {\n\t\tisParent |= m.matchedBits[i]\n\t}\n\tm.bits = append(m.bits, isParent)\n\n\t// When the node is a leaf node or not a parent of a matched node,\n\t// append the hash to the list that will be part of the final merkle\n\t// block.\n\tif height == 0 || isParent == 0x00 {\n\t\tm.finalHashes = append(m.finalHashes, m.calcHash(height, pos))\n\t\treturn\n\t}\n\n\t// At this point, the node is an internal node and it is the parent of\n\t// of an included leaf node.\n\n\t// Descend into the left child and process its sub-tree.\n\tm.traverseAndBuild(height-1, pos*2)\n\n\t// Descend into the right child and process its sub-tree if\n\t// there is one.\n\tif pos*2+1 < m.calcTreeWidth(height-1) {\n\t\tm.traverseAndBuild(height-1, pos*2+1)\n\t}\n}\n\n// NewMerkleBlock returns a new *wire.MsgMerkleBlock and an array of the matched\n// transaction index numbers based on the passed block and filter.\nfunc NewMerkleBlock(block *btcutil.Block, filter *Filter) (*wire.MsgMerkleBlock, []uint32) {\n\tnumTx := uint32(len(block.Transactions()))\n\tmBlock := merkleBlock{\n\t\tnumTx:       numTx,\n\t\tallHashes:   make([]*chainhash.Hash, 0, numTx),\n\t\tmatchedBits: make([]byte, 0, numTx),\n\t}\n\n\t// Find and keep track of any transactions that match the filter.\n\tvar matchedIndices []uint32\n\tfor txIndex, tx := range block.Transactions() {\n\t\tif filter.MatchTxAndUpdate(tx) {\n\t\t\tmBlock.matchedBits = append(mBlock.matchedBits, 0x01)\n\t\t\tmatchedIndices = append(matchedIndices, uint32(txIndex))\n\t\t} else {\n\t\t\tmBlock.matchedBits = append(mBlock.matchedBits, 0x00)\n\t\t}\n\t\tmBlock.allHashes = append(mBlock.allHashes, tx.Hash())\n\t}\n\n\t// Calculate the number of merkle branches (height) in the tree.\n\theight := uint32(0)\n\tfor mBlock.calcTreeWidth(height) > 1 {\n\t\theight++\n\t}\n\n\t// Build the depth-first partial merkle tree.\n\tmBlock.traverseAndBuild(height, 0)\n\n\t// Create and return the merkle block.\n\tmsgMerkleBlock := wire.MsgMerkleBlock{\n\t\tHeader:       block.MsgBlock().Header,\n\t\tTransactions: mBlock.numTx,\n\t\tHashes:       make([]*chainhash.Hash, 0, len(mBlock.finalHashes)),\n\t\tFlags:        make([]byte, (len(mBlock.bits)+7)/8),\n\t}\n\tfor _, hash := range mBlock.finalHashes {\n\t\t_ = msgMerkleBlock.AddTxHash(hash)\n\t}\n\tfor i := uint32(0); i < uint32(len(mBlock.bits)); i++ {\n\t\tmsgMerkleBlock.Flags[i/8] |= mBlock.bits[i] << (i % 8)\n\t}\n\treturn &msgMerkleBlock, matchedIndices\n}\n"
  },
  {
    "path": "btcutil/bloom/merkleblock_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bloom_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/btcutil/bloom\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nfunc TestMerkleBlock3(t *testing.T) {\n\tblockStr := \"0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b\" +\n\t\t\"4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdc\" +\n\t\t\"c96b2c3ff60abe184f196367291b4d4c86041b8fa45d630101000000010\" +\n\t\t\"00000000000000000000000000000000000000000000000000000000000\" +\n\t\t\"0000ffffffff08044c86041b020a02ffffffff0100f2052a01000000434\" +\n\t\t\"104ecd3229b0571c3be876feaac0442a9f13c5a572742927af1dc623353\" +\n\t\t\"ecf8c202225f64868137a18cdd85cbbb4c74fbccfd4f49639cf1bdc94a5\" +\n\t\t\"672bb15ad5d4cac00000000\"\n\tblockBytes, err := hex.DecodeString(blockStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestMerkleBlock3 DecodeString failed: %v\", err)\n\t\treturn\n\t}\n\tblk, err := btcutil.NewBlockFromBytes(blockBytes)\n\tif err != nil {\n\t\tt.Errorf(\"TestMerkleBlock3 NewBlockFromBytes failed: %v\", err)\n\t\treturn\n\t}\n\n\tf := bloom.NewFilter(10, 0, 0.000001, wire.BloomUpdateAll)\n\n\tinputStr := \"63194f18be0af63f2c6bc9dc0f777cbefed3d9415c4af83f3ee3a3d669c00cb5\"\n\thash, err := chainhash.NewHashFromStr(inputStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestMerkleBlock3 NewHashFromStr failed: %v\", err)\n\t\treturn\n\t}\n\n\tf.AddHash(hash)\n\n\tmBlock, _ := bloom.NewMerkleBlock(blk, f)\n\n\twantStr := \"0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4\" +\n\t\t\"b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc\" +\n\t\t\"96b2c3ff60abe184f196367291b4d4c86041b8fa45d630100000001b50c\" +\n\t\t\"c069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196\" +\n\t\t\"30101\"\n\twant, err := hex.DecodeString(wantStr)\n\tif err != nil {\n\t\tt.Errorf(\"TestMerkleBlock3 DecodeString failed: %v\", err)\n\t\treturn\n\t}\n\n\tgot := bytes.NewBuffer(nil)\n\terr = mBlock.BtcEncode(got, wire.ProtocolVersion, wire.LatestEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"TestMerkleBlock3 BtcEncode failed: %v\", err)\n\t\treturn\n\t}\n\n\tif !bytes.Equal(want, got.Bytes()) {\n\t\tt.Errorf(\"TestMerkleBlock3 failed merkle block comparison: \"+\n\t\t\t\"got %v want %v\", got.Bytes(), want)\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "btcutil/bloom/murmurhash3.go",
    "content": "// Copyright (c) 2013, 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bloom\n\nimport (\n\t\"encoding/binary\"\n)\n\n// The following constants are used by the MurmurHash3 algorithm.\nconst (\n\tmurmurC1 = 0xcc9e2d51\n\tmurmurC2 = 0x1b873593\n\tmurmurR1 = 15\n\tmurmurR2 = 13\n\tmurmurM  = 5\n\tmurmurN  = 0xe6546b64\n)\n\n// MurmurHash3 implements a non-cryptographic hash function using the\n// MurmurHash3 algorithm.  This implementation yields a 32-bit hash value which\n// is suitable for general hash-based lookups.  The seed can be used to\n// effectively randomize the hash function.  This makes it ideal for use in\n// bloom filters which need multiple independent hash functions.\nfunc MurmurHash3(seed uint32, data []byte) uint32 {\n\tdataLen := uint32(len(data))\n\thash := seed\n\tk := uint32(0)\n\tnumBlocks := dataLen / 4\n\n\t// Calculate the hash in 4-byte chunks.\n\tfor i := uint32(0); i < numBlocks; i++ {\n\t\tk = binary.LittleEndian.Uint32(data[i*4:])\n\t\tk *= murmurC1\n\t\tk = (k << murmurR1) | (k >> (32 - murmurR1))\n\t\tk *= murmurC2\n\n\t\thash ^= k\n\t\thash = (hash << murmurR2) | (hash >> (32 - murmurR2))\n\t\thash = hash*murmurM + murmurN\n\t}\n\n\t// Handle remaining bytes.\n\ttailIdx := numBlocks * 4\n\tk = 0\n\n\tswitch dataLen & 3 {\n\tcase 3:\n\t\tk ^= uint32(data[tailIdx+2]) << 16\n\t\tfallthrough\n\tcase 2:\n\t\tk ^= uint32(data[tailIdx+1]) << 8\n\t\tfallthrough\n\tcase 1:\n\t\tk ^= uint32(data[tailIdx])\n\t\tk *= murmurC1\n\t\tk = (k << murmurR1) | (k >> (32 - murmurR1))\n\t\tk *= murmurC2\n\t\thash ^= k\n\t}\n\n\t// Finalization.\n\thash ^= dataLen\n\thash ^= hash >> 16\n\thash *= 0x85ebca6b\n\thash ^= hash >> 13\n\thash *= 0xc2b2ae35\n\thash ^= hash >> 16\n\n\treturn hash\n}\n"
  },
  {
    "path": "btcutil/bloom/murmurhash3_test.go",
    "content": "// Copyright (c) 2013, 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bloom_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil/bloom\"\n)\n\n// TestMurmurHash3 ensure the MurmurHash3 function produces the correct hash\n// when given various seeds and data.\nfunc TestMurmurHash3(t *testing.T) {\n\tvar tests = []struct {\n\t\tseed uint32\n\t\tdata []byte\n\t\tout  uint32\n\t}{\n\t\t{0x00000000, []byte{}, 0x00000000},\n\t\t{0xfba4c795, []byte{}, 0x6a396f08},\n\t\t{0xffffffff, []byte{}, 0x81f16f39},\n\t\t{0x00000000, []byte{0x00}, 0x514e28b7},\n\t\t{0xfba4c795, []byte{0x00}, 0xea3f0b17},\n\t\t{0x00000000, []byte{0xff}, 0xfd6cf10d},\n\t\t{0x00000000, []byte{0x00, 0x11}, 0x16c6b7ab},\n\t\t{0x00000000, []byte{0x00, 0x11, 0x22}, 0x8eb51c3d},\n\t\t{0x00000000, []byte{0x00, 0x11, 0x22, 0x33}, 0xb4471bf8},\n\t\t{0x00000000, []byte{0x00, 0x11, 0x22, 0x33, 0x44}, 0xe2301fa8},\n\t\t{0x00000000, []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55}, 0xfc2e4a15},\n\t\t{0x00000000, []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66}, 0xb074502c},\n\t\t{0x00000000, []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77}, 0x8034d2a0},\n\t\t{0x00000000, []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}, 0xb4698def},\n\t}\n\n\tfor i, test := range tests {\n\t\tresult := bloom.MurmurHash3(test.seed, test.data)\n\t\tif result != test.out {\n\t\t\tt.Errorf(\"MurmurHash3 test #%d failed: got %v want %v\\n\",\n\t\t\t\ti, result, test.out)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcutil/bloom/test_coverage.txt",
    "content": "\ngithub.com/conformal/btcutil/bloom/murmurhash3.go\t MurmurHash3\t\t\t 100.00% (31/31)\ngithub.com/conformal/btcutil/bloom/merkleblock.go\t NewMerkleBlock\t\t\t 100.00% (19/19)\ngithub.com/conformal/btcutil/bloom/merkleblock.go\t merkleBlock.traverseAndBuild\t 100.00% (10/10)\ngithub.com/conformal/btcutil/bloom/merkleblock.go\t merkleBlock.calcHash\t\t 100.00% (8/8)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.maybeAddOutpoint\t 100.00% (7/7)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.addOutPoint\t\t 100.00% (4/4)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.IsLoaded\t\t 100.00% (4/4)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.MsgFilterLoad\t\t 100.00% (4/4)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.matchesOutPoint\t\t 100.00% (4/4)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.MatchesOutPoint\t\t 100.00% (4/4)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.MatchTxAndUpdate\t 100.00% (4/4)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.Matches\t\t\t 100.00% (4/4)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.Add\t\t\t 100.00% (3/3)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.Reload\t\t\t 100.00% (3/3)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.Unload\t\t\t 100.00% (3/3)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.AddShaHash\t\t 100.00% (3/3)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.AddOutPoint\t\t 100.00% (3/3)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t minUint32\t\t\t 100.00% (3/3)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.hash\t\t\t 100.00% (2/2)\ngithub.com/conformal/btcutil/bloom/merkleblock.go\t merkleBlock.calcTreeWidth\t 100.00% (1/1)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t LoadFilter\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.matchTxAndUpdate\t 91.30% (21/23)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.matches\t\t\t 85.71% (6/7)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t NewFilter\t\t\t 81.82% (9/11)\ngithub.com/conformal/btcutil/bloom/filter.go\t\t Filter.add\t\t\t 80.00% (4/5)\ngithub.com/conformal/btcutil/bloom\t\t\t ----------------------------\t 96.49% (165/171)\n\n"
  },
  {
    "path": "btcutil/certgen.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"bytes\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t_ \"crypto/sha512\" // Needed for RegisterHash in init\n\t\"crypto/x509\"\n\t\"crypto/x509/pkix\"\n\t\"encoding/pem\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"net\"\n\t\"os\"\n\t\"time\"\n)\n\n// NewTLSCertPair returns a new PEM-encoded x.509 certificate pair\n// based on a 521-bit ECDSA private key.  The machine's local interface\n// addresses and all variants of IPv4 and IPv6 localhost are included as\n// valid IP addresses.\nfunc NewTLSCertPair(organization string, validUntil time.Time, extraHosts []string) (cert, key []byte, err error) {\n\tnow := time.Now()\n\tif validUntil.Before(now) {\n\t\treturn nil, nil, errors.New(\"validUntil would create an already-expired certificate\")\n\t}\n\n\tpriv, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// end of ASN.1 time\n\tendOfTime := time.Date(2049, 12, 31, 23, 59, 59, 0, time.UTC)\n\tif validUntil.After(endOfTime) {\n\t\tvalidUntil = endOfTime\n\t}\n\n\tserialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)\n\tserialNumber, err := rand.Int(rand.Reader, serialNumberLimit)\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to generate serial number: %s\", err)\n\t}\n\n\thost, err := os.Hostname()\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tipAddresses := []net.IP{net.ParseIP(\"127.0.0.1\"), net.ParseIP(\"::1\")}\n\tdnsNames := []string{host}\n\tif host != \"localhost\" {\n\t\tdnsNames = append(dnsNames, \"localhost\")\n\t}\n\n\taddIP := func(ipAddr net.IP) {\n\t\tfor _, ip := range ipAddresses {\n\t\t\tif ip.Equal(ipAddr) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tipAddresses = append(ipAddresses, ipAddr)\n\t}\n\taddHost := func(host string) {\n\t\tfor _, dnsName := range dnsNames {\n\t\t\tif host == dnsName {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tdnsNames = append(dnsNames, host)\n\t}\n\n\taddrs, err := interfaceAddrs()\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tfor _, a := range addrs {\n\t\tipAddr, _, err := net.ParseCIDR(a.String())\n\t\tif err == nil {\n\t\t\taddIP(ipAddr)\n\t\t}\n\t}\n\n\tfor _, hostStr := range extraHosts {\n\t\thost, _, err := net.SplitHostPort(hostStr)\n\t\tif err != nil {\n\t\t\thost = hostStr\n\t\t}\n\t\tif ip := net.ParseIP(host); ip != nil {\n\t\t\taddIP(ip)\n\t\t} else {\n\t\t\taddHost(host)\n\t\t}\n\t}\n\n\ttemplate := x509.Certificate{\n\t\tSerialNumber: serialNumber,\n\t\tSubject: pkix.Name{\n\t\t\tOrganization: []string{organization},\n\t\t\tCommonName:   host,\n\t\t},\n\t\tNotBefore: now.Add(-time.Hour * 24),\n\t\tNotAfter:  validUntil,\n\n\t\tKeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature |\n\t\t\tx509.KeyUsageCertSign,\n\t\tIsCA:                  true, // so can sign self.\n\t\tBasicConstraintsValid: true,\n\n\t\tDNSNames:    dnsNames,\n\t\tIPAddresses: ipAddresses,\n\t}\n\n\tderBytes, err := x509.CreateCertificate(rand.Reader, &template,\n\t\t&template, &priv.PublicKey, priv)\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to create certificate: %v\", err)\n\t}\n\n\tcertBuf := &bytes.Buffer{}\n\terr = pem.Encode(certBuf, &pem.Block{Type: \"CERTIFICATE\", Bytes: derBytes})\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to encode certificate: %v\", err)\n\t}\n\n\tkeybytes, err := x509.MarshalECPrivateKey(priv)\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to marshal private key: %v\", err)\n\t}\n\n\tkeyBuf := &bytes.Buffer{}\n\terr = pem.Encode(keyBuf, &pem.Block{Type: \"EC PRIVATE KEY\", Bytes: keybytes})\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to encode private key: %v\", err)\n\t}\n\n\treturn certBuf.Bytes(), keyBuf.Bytes(), nil\n}\n"
  },
  {
    "path": "btcutil/certgen_test.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil_test\n\nimport (\n\t\"crypto/x509\"\n\t\"encoding/pem\"\n\t\"net\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t//\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestNewTLSCertPair ensures the NewTLSCertPair function works as expected.\nfunc TestNewTLSCertPair(t *testing.T) {\n\t// Certs don't support sub-second precision, so truncate it now to\n\t// ensure the checks later don't fail due to nanosecond precision\n\t// differences.\n\tvalidUntil := time.Unix(time.Now().Add(10*365*24*time.Hour).Unix(), 0)\n\torg := \"test autogenerated cert\"\n\textraHosts := []string{\"testtlscert.bogus\", \"localhost\", \"127.0.0.1\"}\n\tcert, key, err := btcutil.NewTLSCertPair(org, validUntil, extraHosts)\n\tif err != nil {\n\t\tt.Fatalf(\"failed with unexpected error: %v\", err)\n\t}\n\n\t// Ensure the PEM-encoded cert that is returned can be decoded.\n\tpemCert, _ := pem.Decode(cert)\n\tif pemCert == nil {\n\t\tt.Fatalf(\"pem.Decode was unable to decode the certificate\")\n\t}\n\n\t// Ensure the PEM-encoded key that is returned can be decoded.\n\tpemKey, _ := pem.Decode(key)\n\tif pemCert == nil {\n\t\tt.Fatalf(\"pem.Decode was unable to decode the key\")\n\t}\n\n\t// Ensure the DER-encoded key bytes can be successfully parsed.\n\t_, err = x509.ParseECPrivateKey(pemKey.Bytes)\n\tif err != nil {\n\t\tt.Fatalf(\"failed with unexpected error: %v\", err)\n\t}\n\n\t// Ensure the DER-encoded cert bytes can be successfully into an X.509\n\t// certificate.\n\tx509Cert, err := x509.ParseCertificate(pemCert.Bytes)\n\tif err != nil {\n\t\tt.Fatalf(\"failed with unexpected error: %v\", err)\n\t}\n\n\t// Ensure the specified organization is correct.\n\tx509Orgs := x509Cert.Subject.Organization\n\tif len(x509Orgs) == 0 || x509Orgs[0] != org {\n\t\tx509Org := \"<no organization>\"\n\t\tif len(x509Orgs) > 0 {\n\t\t\tx509Org = x509Orgs[0]\n\t\t}\n\t\tt.Fatalf(\"generated cert organization field mismatch, got \"+\n\t\t\t\"'%v', want '%v'\", x509Org, org)\n\t}\n\n\t// Ensure the specified valid until value is correct.\n\tif !x509Cert.NotAfter.Equal(validUntil) {\n\t\tt.Fatalf(\"generated cert valid until field mismatch, got %v, \"+\n\t\t\t\"want %v\", x509Cert.NotAfter, validUntil)\n\t}\n\n\t// Ensure the specified extra hosts are present.\n\tfor _, host := range extraHosts {\n\t\tif err := x509Cert.VerifyHostname(host); err != nil {\n\t\t\tt.Fatalf(\"failed to verify extra host '%s'\", host)\n\t\t}\n\t}\n\n\t// Ensure that the Common Name is also the first SAN DNS name.\n\tcn := x509Cert.Subject.CommonName\n\tsan0 := x509Cert.DNSNames[0]\n\tif cn != san0 {\n\t\tt.Errorf(\"common name %s does not match first SAN %s\", cn, san0)\n\t}\n\n\t// Ensure there are no duplicate hosts or IPs.\n\thostCounts := make(map[string]int)\n\tfor _, host := range x509Cert.DNSNames {\n\t\thostCounts[host]++\n\t}\n\tipCounts := make(map[string]int)\n\tfor _, ip := range x509Cert.IPAddresses {\n\t\tipCounts[string(ip)]++\n\t}\n\tfor host, count := range hostCounts {\n\t\tif count != 1 {\n\t\t\tt.Errorf(\"host %s appears %d times in certificate\", host, count)\n\t\t}\n\t}\n\tfor ipStr, count := range ipCounts {\n\t\tif count != 1 {\n\t\t\tt.Errorf(\"ip %s appears %d times in certificate\", net.IP(ipStr), count)\n\t\t}\n\t}\n\n\t// Ensure the cert can be use for the intended purposes.\n\tif !x509Cert.IsCA {\n\t\tt.Fatal(\"generated cert is not a certificate authority\")\n\t}\n\tif x509Cert.KeyUsage&x509.KeyUsageKeyEncipherment == 0 {\n\t\tt.Fatal(\"generated cert can't be used for key encipherment\")\n\t}\n\tif x509Cert.KeyUsage&x509.KeyUsageDigitalSignature == 0 {\n\t\tt.Fatal(\"generated cert can't be used for digital signatures\")\n\t}\n\tif x509Cert.KeyUsage&x509.KeyUsageCertSign == 0 {\n\t\tt.Fatal(\"generated cert can't be used for signing other certs\")\n\t}\n\tif !x509Cert.BasicConstraintsValid {\n\t\tt.Fatal(\"generated cert does not have valid basic constraints\")\n\t}\n}\n"
  },
  {
    "path": "btcutil/coinset/README.md",
    "content": "coinset\n=======\n\n[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](http://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/btcutil/coinset)\n\nPackage coinset provides bitcoin-specific convenience functions for selecting\nfrom and managing sets of unspent transaction outpoints (UTXOs).\n\nA comprehensive suite of tests is provided to ensure proper functionality.  See\n`test_coverage.txt` for the gocov coverage report.  Alternatively, if you are\nrunning a POSIX OS, you can run the `cov_report.sh` script for a real-time\nreport.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/btcutil/coinset\n```\n\n## Usage\n\nEach unspent transaction outpoint is represented by the Coin interface.  An\nexample of a concrete type that implements Coin is coinset.SimpleCoin.\n\nThe typical use case for this library is for creating raw bitcoin transactions\ngiven a set of Coins that may be spent by the user, for example as below:\n\n```Go\nvar unspentCoins = []coinset.Coin{ ... }\n```\n\nWhen the user needs to spend a certain amount, they will need to select a\nsubset of these coins which contain at least that value.  CoinSelector is\nan interface that represents types that implement coin selection algos,\nsubject to various criteria.  There are a few examples of CoinSelector's:\n\n- MinIndexCoinSelector\n\n- MinNumberCoinSelector\n\n- MaxValueAgeCoinSelector\n\n- MinPriorityCoinSelector\n\nFor example, if the user wishes to maximize the probability that their\ntransaction is mined quickly, they could use the MaxValueAgeCoinSelector to\nselect high priority coins, then also attach a relatively high fee.\n\n```Go\nselector := &coinset.MaxValueAgeCoinSelector{\n    MaxInputs: 10,\n    MinAmountChange: 10000,\n}\nselectedCoins, err := selector.CoinSelect(targetAmount + bigFee, unspentCoins)\nif err != nil {\n\treturn err\n}\nmsgTx := coinset.NewMsgTxWithInputCoins(selectedCoins)\n...\n\n```\n\nThe user can then create the msgTx.TxOut's as required, then sign the\ntransaction and transmit it to the network.\n\n## License\n\nPackage coinset is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "btcutil/coinset/coins.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage coinset\n\nimport (\n\t\"container/list\"\n\t\"errors\"\n\t\"sort\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// Coin represents a spendable transaction outpoint\ntype Coin interface {\n\tHash() *chainhash.Hash\n\tIndex() uint32\n\tValue() btcutil.Amount\n\tPkScript() []byte\n\tNumConfs() int64\n\tValueAge() int64\n}\n\n// Coins represents a set of Coins\ntype Coins interface {\n\tCoins() []Coin\n}\n\n// CoinSet is a utility struct for the modifications of a set of\n// Coins that implements the Coins interface.  To create a CoinSet,\n// you must call NewCoinSet with nil for an empty set or a slice of\n// coins as the initial contents.\n//\n// It is important to note that the all the Coins being added or removed\n// from a CoinSet must have a constant ValueAge() during the use of\n// the CoinSet, otherwise the cached values will be incorrect.\ntype CoinSet struct {\n\tcoinList      *list.List\n\ttotalValue    btcutil.Amount\n\ttotalValueAge int64\n}\n\n// Ensure that CoinSet is a Coins\nvar _ Coins = NewCoinSet(nil)\n\n// NewCoinSet creates a CoinSet containing the coins provided.\n// To create an empty CoinSet, you may pass null as the coins input parameter.\nfunc NewCoinSet(coins []Coin) *CoinSet {\n\tnewCoinSet := &CoinSet{\n\t\tcoinList:      list.New(),\n\t\ttotalValue:    0,\n\t\ttotalValueAge: 0,\n\t}\n\tfor _, coin := range coins {\n\t\tnewCoinSet.PushCoin(coin)\n\t}\n\treturn newCoinSet\n}\n\n// Coins returns a new slice of the coins contained in the set.\nfunc (cs *CoinSet) Coins() []Coin {\n\tcoins := make([]Coin, cs.coinList.Len())\n\tfor i, e := 0, cs.coinList.Front(); e != nil; i, e = i+1, e.Next() {\n\t\tcoins[i] = e.Value.(Coin)\n\t}\n\treturn coins\n}\n\n// TotalValue returns the total value of the coins in the set.\nfunc (cs *CoinSet) TotalValue() (value btcutil.Amount) {\n\treturn cs.totalValue\n}\n\n// TotalValueAge returns the total value * number of confirmations\n// of the coins in the set.\nfunc (cs *CoinSet) TotalValueAge() (valueAge int64) {\n\treturn cs.totalValueAge\n}\n\n// Num returns the number of coins in the set\nfunc (cs *CoinSet) Num() int {\n\treturn cs.coinList.Len()\n}\n\n// PushCoin adds a coin to the end of the list and updates\n// the cached value amounts.\nfunc (cs *CoinSet) PushCoin(c Coin) {\n\tcs.coinList.PushBack(c)\n\tcs.totalValue += c.Value()\n\tcs.totalValueAge += c.ValueAge()\n}\n\n// PopCoin removes the last coin on the list and returns it.\nfunc (cs *CoinSet) PopCoin() Coin {\n\tback := cs.coinList.Back()\n\tif back == nil {\n\t\treturn nil\n\t}\n\treturn cs.removeElement(back)\n}\n\n// ShiftCoin removes the first coin on the list and returns it.\nfunc (cs *CoinSet) ShiftCoin() Coin {\n\tfront := cs.coinList.Front()\n\tif front == nil {\n\t\treturn nil\n\t}\n\treturn cs.removeElement(front)\n}\n\n// removeElement updates the cached value amounts in the CoinSet,\n// removes the element from the list, then returns the Coin that\n// was removed to the caller.\nfunc (cs *CoinSet) removeElement(e *list.Element) Coin {\n\tc := e.Value.(Coin)\n\tcs.coinList.Remove(e)\n\tcs.totalValue -= c.Value()\n\tcs.totalValueAge -= c.ValueAge()\n\treturn c\n}\n\n// NewMsgTxWithInputCoins takes the coins in the CoinSet and makes them\n// the inputs to a new wire.MsgTx which is returned.\nfunc NewMsgTxWithInputCoins(txVersion int32, inputCoins Coins) *wire.MsgTx {\n\tmsgTx := wire.NewMsgTx(txVersion)\n\tcoins := inputCoins.Coins()\n\tmsgTx.TxIn = make([]*wire.TxIn, len(coins))\n\tfor i, coin := range coins {\n\t\tmsgTx.TxIn[i] = &wire.TxIn{\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash:  *coin.Hash(),\n\t\t\t\tIndex: coin.Index(),\n\t\t\t},\n\t\t\tSignatureScript: nil,\n\t\t\tSequence:        wire.MaxTxInSequenceNum,\n\t\t}\n\t}\n\treturn msgTx\n}\n\nvar (\n\t// ErrCoinsNoSelectionAvailable is returned when a CoinSelector believes there is no\n\t// possible combination of coins which can meet the requirements provided to the selector.\n\tErrCoinsNoSelectionAvailable = errors.New(\"no coin selection possible\")\n)\n\n// satisfiesTargetValue checks that the totalValue is either exactly the targetValue\n// or is greater than the targetValue by at least the minChange amount.\nfunc satisfiesTargetValue(targetValue, minChange, totalValue btcutil.Amount) bool {\n\treturn (totalValue == targetValue || totalValue >= targetValue+minChange)\n}\n\n// CoinSelector is an interface that wraps the CoinSelect method.\n//\n// CoinSelect will attempt to select a subset of the coins which has at\n// least the targetValue amount.  CoinSelect is not guaranteed to return a\n// selection of coins even if the total value of coins given is greater\n// than the target value.\n//\n// The exact choice of coins in the subset will be implementation specific.\n//\n// It is important to note that the Coins being used as inputs need to have\n// a constant ValueAge() during the execution of CoinSelect.\ntype CoinSelector interface {\n\tCoinSelect(targetValue btcutil.Amount, coins []Coin) (Coins, error)\n}\n\n// MinIndexCoinSelector is a CoinSelector that attempts to construct a\n// selection of coins whose total value is at least targetValue and prefers\n// any number of lower indexes (as in the ordered array) over higher ones.\ntype MinIndexCoinSelector struct {\n\tMaxInputs       int\n\tMinChangeAmount btcutil.Amount\n}\n\n// CoinSelect will attempt to select coins using the algorithm described\n// in the MinIndexCoinSelector struct.\nfunc (s MinIndexCoinSelector) CoinSelect(targetValue btcutil.Amount, coins []Coin) (Coins, error) {\n\tcs := NewCoinSet(nil)\n\tfor n := 0; n < len(coins) && n < s.MaxInputs; n++ {\n\t\tcs.PushCoin(coins[n])\n\t\tif satisfiesTargetValue(targetValue, s.MinChangeAmount, cs.TotalValue()) {\n\t\t\treturn cs, nil\n\t\t}\n\t}\n\treturn nil, ErrCoinsNoSelectionAvailable\n}\n\n// MinNumberCoinSelector is a CoinSelector that attempts to construct\n// a selection of coins whose total value is at least targetValue\n// that uses as few of the inputs as possible.\ntype MinNumberCoinSelector struct {\n\tMaxInputs       int\n\tMinChangeAmount btcutil.Amount\n}\n\n// CoinSelect will attempt to select coins using the algorithm described\n// in the MinNumberCoinSelector struct.\nfunc (s MinNumberCoinSelector) CoinSelect(targetValue btcutil.Amount, coins []Coin) (Coins, error) {\n\tsortedCoins := make([]Coin, 0, len(coins))\n\tsortedCoins = append(sortedCoins, coins...)\n\tsort.Sort(sort.Reverse(byAmount(sortedCoins)))\n\n\treturn MinIndexCoinSelector(s).CoinSelect(targetValue, sortedCoins)\n}\n\n// MaxValueAgeCoinSelector is a CoinSelector that attempts to construct\n// a selection of coins whose total value is at least targetValue\n// that has as much input value-age as possible.\n//\n// This would be useful in the case where you want to maximize\n// likelihood of the inclusion of your transaction in the next mined\n// block.\ntype MaxValueAgeCoinSelector struct {\n\tMaxInputs       int\n\tMinChangeAmount btcutil.Amount\n}\n\n// CoinSelect will attempt to select coins using the algorithm described\n// in the MaxValueAgeCoinSelector struct.\nfunc (s MaxValueAgeCoinSelector) CoinSelect(targetValue btcutil.Amount, coins []Coin) (Coins, error) {\n\tsortedCoins := make([]Coin, 0, len(coins))\n\tsortedCoins = append(sortedCoins, coins...)\n\tsort.Sort(sort.Reverse(byValueAge(sortedCoins)))\n\n\treturn MinIndexCoinSelector(s).CoinSelect(targetValue, sortedCoins)\n}\n\n// MinPriorityCoinSelector is a CoinSelector that attempts to construct\n// a selection of coins whose total value is at least targetValue and\n// whose average value-age per input is greater than MinAvgValueAgePerInput.\n// If there is change, it must exceed MinChangeAmount to be a valid selection.\n//\n// When possible, MinPriorityCoinSelector will attempt to reduce the average\n// input priority over the threshold, but no guarantees will be made as to\n// minimality of the selection.  The selection below is almost certainly\n// suboptimal.\ntype MinPriorityCoinSelector struct {\n\tMaxInputs              int\n\tMinChangeAmount        btcutil.Amount\n\tMinAvgValueAgePerInput int64\n}\n\n// CoinSelect will attempt to select coins using the algorithm described\n// in the MinPriorityCoinSelector struct.\nfunc (s MinPriorityCoinSelector) CoinSelect(targetValue btcutil.Amount, coins []Coin) (Coins, error) {\n\tpossibleCoins := make([]Coin, 0, len(coins))\n\tpossibleCoins = append(possibleCoins, coins...)\n\n\tsort.Sort(byValueAge(possibleCoins))\n\n\t// find the first coin with sufficient valueAge\n\tcutoffIndex := -1\n\tfor i := 0; i < len(possibleCoins); i++ {\n\t\tif possibleCoins[i].ValueAge() >= s.MinAvgValueAgePerInput {\n\t\t\tcutoffIndex = i\n\t\t\tbreak\n\t\t}\n\t}\n\tif cutoffIndex < 0 {\n\t\treturn nil, ErrCoinsNoSelectionAvailable\n\t}\n\n\t// create sets of input coins that will obey minimum average valueAge\n\tfor i := cutoffIndex; i < len(possibleCoins); i++ {\n\t\tpossibleHighCoins := possibleCoins[cutoffIndex : i+1]\n\n\t\t// choose a set of high-enough valueAge coins\n\t\thighSelect, err := (&MinNumberCoinSelector{\n\t\t\tMaxInputs:       s.MaxInputs,\n\t\t\tMinChangeAmount: s.MinChangeAmount,\n\t\t}).CoinSelect(targetValue, possibleHighCoins)\n\n\t\tif err != nil {\n\t\t\t// attempt to add available low priority to make a solution\n\n\t\t\tfor numLow := 1; numLow <= cutoffIndex && numLow+(i-cutoffIndex) <= s.MaxInputs; numLow++ {\n\t\t\t\tallHigh := NewCoinSet(possibleCoins[cutoffIndex : i+1])\n\t\t\t\tnewTargetValue := targetValue - allHigh.TotalValue()\n\t\t\t\tnewMaxInputs := allHigh.Num() + numLow\n\t\t\t\tif newMaxInputs > numLow {\n\t\t\t\t\tnewMaxInputs = numLow\n\t\t\t\t}\n\t\t\t\tnewMinAvgValueAge := ((s.MinAvgValueAgePerInput * int64(allHigh.Num()+numLow)) - allHigh.TotalValueAge()) / int64(numLow)\n\n\t\t\t\t// find the minimum priority that can be added to set\n\t\t\t\tlowSelect, err := (&MinPriorityCoinSelector{\n\t\t\t\t\tMaxInputs:              newMaxInputs,\n\t\t\t\t\tMinChangeAmount:        s.MinChangeAmount,\n\t\t\t\t\tMinAvgValueAgePerInput: newMinAvgValueAge,\n\t\t\t\t}).CoinSelect(newTargetValue, possibleCoins[0:cutoffIndex])\n\n\t\t\t\tif err != nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tfor _, coin := range lowSelect.Coins() {\n\t\t\t\t\tallHigh.PushCoin(coin)\n\t\t\t\t}\n\n\t\t\t\treturn allHigh, nil\n\t\t\t}\n\t\t\t// oh well, couldn't fix, try to add more high priority to the set.\n\t\t} else {\n\t\t\textendedCoins := NewCoinSet(highSelect.Coins())\n\n\t\t\t// attempt to lower priority towards target with lowest ones first\n\t\t\tfor n := 0; n < cutoffIndex; n++ {\n\t\t\t\tif extendedCoins.Num() >= s.MaxInputs {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif possibleCoins[n].ValueAge() == 0 {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\textendedCoins.PushCoin(possibleCoins[n])\n\t\t\t\tif extendedCoins.TotalValueAge()/int64(extendedCoins.Num()) < s.MinAvgValueAgePerInput {\n\t\t\t\t\textendedCoins.PopCoin()\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn extendedCoins, nil\n\t\t}\n\t}\n\n\treturn nil, ErrCoinsNoSelectionAvailable\n}\n\ntype byValueAge []Coin\n\nfunc (a byValueAge) Len() int           { return len(a) }\nfunc (a byValueAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }\nfunc (a byValueAge) Less(i, j int) bool { return a[i].ValueAge() < a[j].ValueAge() }\n\ntype byAmount []Coin\n\nfunc (a byAmount) Len() int           { return len(a) }\nfunc (a byAmount) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }\nfunc (a byAmount) Less(i, j int) bool { return a[i].Value() < a[j].Value() }\n\n// SimpleCoin defines a concrete instance of Coin that is backed by a\n// btcutil.Tx, a specific outpoint index, and the number of confirmations\n// that transaction has had.\ntype SimpleCoin struct {\n\tTx         *btcutil.Tx\n\tTxIndex    uint32\n\tTxNumConfs int64\n}\n\n// Ensure that SimpleCoin is a Coin\nvar _ Coin = &SimpleCoin{}\n\n// Hash returns the hash value of the transaction on which the Coin is an output\nfunc (c *SimpleCoin) Hash() *chainhash.Hash {\n\treturn c.Tx.Hash()\n}\n\n// Index returns the index of the output on the transaction which the Coin represents\nfunc (c *SimpleCoin) Index() uint32 {\n\treturn c.TxIndex\n}\n\n// txOut returns the TxOut of the transaction the Coin represents\nfunc (c *SimpleCoin) txOut() *wire.TxOut {\n\treturn c.Tx.MsgTx().TxOut[c.TxIndex]\n}\n\n// Value returns the value of the Coin\nfunc (c *SimpleCoin) Value() btcutil.Amount {\n\treturn btcutil.Amount(c.txOut().Value)\n}\n\n// PkScript returns the outpoint script of the Coin.\n//\n// This can be used to determine what type of script the Coin uses\n// and extract standard addresses if possible using\n// txscript.ExtractPkScriptAddrs for example.\nfunc (c *SimpleCoin) PkScript() []byte {\n\treturn c.txOut().PkScript\n}\n\n// NumConfs returns the number of confirmations that the transaction the Coin references\n// has had.\nfunc (c *SimpleCoin) NumConfs() int64 {\n\treturn c.TxNumConfs\n}\n\n// ValueAge returns the product of the value and the number of confirmations.  This is\n// used as an input to calculate the priority of the transaction.\nfunc (c *SimpleCoin) ValueAge() int64 {\n\treturn c.TxNumConfs * int64(c.Value())\n}\n"
  },
  {
    "path": "btcutil/coinset/coins_test.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage coinset_test\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/btcutil/coinset\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\ntype TestCoin struct {\n\tTxHash     *chainhash.Hash\n\tTxIndex    uint32\n\tTxValue    btcutil.Amount\n\tTxNumConfs int64\n}\n\nfunc (c *TestCoin) Hash() *chainhash.Hash { return c.TxHash }\nfunc (c *TestCoin) Index() uint32         { return c.TxIndex }\nfunc (c *TestCoin) Value() btcutil.Amount { return c.TxValue }\nfunc (c *TestCoin) PkScript() []byte      { return nil }\nfunc (c *TestCoin) NumConfs() int64       { return c.TxNumConfs }\nfunc (c *TestCoin) ValueAge() int64       { return int64(c.TxValue) * c.TxNumConfs }\n\nfunc NewCoin(index int64, value btcutil.Amount, numConfs int64) coinset.Coin {\n\th := sha256.New()\n\t_, _ = h.Write([]byte(fmt.Sprintf(\"%d\", index)))\n\thash, _ := chainhash.NewHash(h.Sum(nil))\n\tc := &TestCoin{\n\t\tTxHash:     hash,\n\t\tTxIndex:    0,\n\t\tTxValue:    value,\n\t\tTxNumConfs: numConfs,\n\t}\n\treturn coinset.Coin(c)\n}\n\ntype coinSelectTest struct {\n\tselector      coinset.CoinSelector\n\tinputCoins    []coinset.Coin\n\ttargetValue   btcutil.Amount\n\texpectedCoins []coinset.Coin\n\texpectedError error\n}\n\nfunc testCoinSelector(tests []coinSelectTest, t *testing.T) {\n\tfor testIndex, test := range tests {\n\t\tcs, err := test.selector.CoinSelect(test.targetValue, test.inputCoins)\n\t\tif err != test.expectedError {\n\t\t\tt.Errorf(\"[%d] expected a different error: got=%v, expected=%v\", testIndex, err, test.expectedError)\n\t\t\tcontinue\n\t\t}\n\t\tif test.expectedCoins != nil {\n\t\t\tif cs == nil {\n\t\t\t\tt.Errorf(\"[%d] expected non-nil coinset\", testIndex)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tcoins := cs.Coins()\n\t\t\tif len(coins) != len(test.expectedCoins) {\n\t\t\t\tt.Errorf(\"[%d] expected different number of coins: got=%d, expected=%d\", testIndex, len(coins), len(test.expectedCoins))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor n := 0; n < len(test.expectedCoins); n++ {\n\t\t\t\tif coins[n] != test.expectedCoins[n] {\n\t\t\t\t\tt.Errorf(\"[%d] expected different coins at coin index %d: got=%#v, expected=%#v\", testIndex, n, coins[n], test.expectedCoins[n])\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\tcoinSet := coinset.NewCoinSet(coins)\n\t\t\tif coinSet.TotalValue() < test.targetValue {\n\t\t\t\tt.Errorf(\"[%d] targetValue not satistifed\", testIndex)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n\nvar coins = []coinset.Coin{\n\tNewCoin(1, 100000000, 1),\n\tNewCoin(2, 10000000, 20),\n\tNewCoin(3, 50000000, 0),\n\tNewCoin(4, 25000000, 6),\n}\n\nfunc TestCoinSet(t *testing.T) {\n\tcs := coinset.NewCoinSet(nil)\n\tif cs.PopCoin() != nil {\n\t\tt.Error(\"Expected popCoin of empty to be nil\")\n\t}\n\tif cs.ShiftCoin() != nil {\n\t\tt.Error(\"Expected shiftCoin of empty to be nil\")\n\t}\n\n\tcs.PushCoin(coins[0])\n\tcs.PushCoin(coins[1])\n\tcs.PushCoin(coins[2])\n\tif cs.PopCoin() != coins[2] {\n\t\tt.Error(\"Expected third coin\")\n\t}\n\tif cs.ShiftCoin() != coins[0] {\n\t\tt.Error(\"Expected first coin\")\n\t}\n\n\tmtx := coinset.NewMsgTxWithInputCoins(wire.TxVersion, cs)\n\tif len(mtx.TxIn) != 1 {\n\t\tt.Errorf(\"Expected only 1 TxIn, got %d\", len(mtx.TxIn))\n\t}\n\top := mtx.TxIn[0].PreviousOutPoint\n\tif !op.Hash.IsEqual(coins[1].Hash()) || op.Index != coins[1].Index() {\n\t\tt.Errorf(\"Expected the second coin to be added as input to mtx\")\n\t}\n}\n\nvar minIndexSelectors = []coinset.MinIndexCoinSelector{\n\t{MaxInputs: 10, MinChangeAmount: 10000},\n\t{MaxInputs: 2, MinChangeAmount: 10000},\n}\n\nvar minIndexTests = []coinSelectTest{\n\t{minIndexSelectors[0], coins, coins[0].Value() - minIndexSelectors[0].MinChangeAmount, []coinset.Coin{coins[0]}, nil},\n\t{minIndexSelectors[0], coins, coins[0].Value() - minIndexSelectors[0].MinChangeAmount + 1, []coinset.Coin{coins[0], coins[1]}, nil},\n\t{minIndexSelectors[0], coins, 100000000, []coinset.Coin{coins[0]}, nil},\n\t{minIndexSelectors[0], coins, 110000000, []coinset.Coin{coins[0], coins[1]}, nil},\n\t{minIndexSelectors[0], coins, 140000000, []coinset.Coin{coins[0], coins[1], coins[2]}, nil},\n\t{minIndexSelectors[0], coins, 200000000, nil, coinset.ErrCoinsNoSelectionAvailable},\n\t{minIndexSelectors[1], coins, 10000000, []coinset.Coin{coins[0]}, nil},\n\t{minIndexSelectors[1], coins, 110000000, []coinset.Coin{coins[0], coins[1]}, nil},\n\t{minIndexSelectors[1], coins, 140000000, nil, coinset.ErrCoinsNoSelectionAvailable},\n}\n\nfunc TestMinIndexSelector(t *testing.T) {\n\ttestCoinSelector(minIndexTests, t)\n}\n\nvar minNumberSelectors = []coinset.MinNumberCoinSelector{\n\t{MaxInputs: 10, MinChangeAmount: 10000},\n\t{MaxInputs: 2, MinChangeAmount: 10000},\n}\n\nvar minNumberTests = []coinSelectTest{\n\t{minNumberSelectors[0], coins, coins[0].Value() - minNumberSelectors[0].MinChangeAmount, []coinset.Coin{coins[0]}, nil},\n\t{minNumberSelectors[0], coins, coins[0].Value() - minNumberSelectors[0].MinChangeAmount + 1, []coinset.Coin{coins[0], coins[2]}, nil},\n\t{minNumberSelectors[0], coins, 100000000, []coinset.Coin{coins[0]}, nil},\n\t{minNumberSelectors[0], coins, 110000000, []coinset.Coin{coins[0], coins[2]}, nil},\n\t{minNumberSelectors[0], coins, 160000000, []coinset.Coin{coins[0], coins[2], coins[3]}, nil},\n\t{minNumberSelectors[0], coins, 184990000, []coinset.Coin{coins[0], coins[2], coins[3], coins[1]}, nil},\n\t{minNumberSelectors[0], coins, 184990001, nil, coinset.ErrCoinsNoSelectionAvailable},\n\t{minNumberSelectors[0], coins, 200000000, nil, coinset.ErrCoinsNoSelectionAvailable},\n\t{minNumberSelectors[1], coins, 10000000, []coinset.Coin{coins[0]}, nil},\n\t{minNumberSelectors[1], coins, 110000000, []coinset.Coin{coins[0], coins[2]}, nil},\n\t{minNumberSelectors[1], coins, 140000000, []coinset.Coin{coins[0], coins[2]}, nil},\n}\n\nfunc TestMinNumberSelector(t *testing.T) {\n\ttestCoinSelector(minNumberTests, t)\n}\n\nvar maxValueAgeSelectors = []coinset.MaxValueAgeCoinSelector{\n\t{MaxInputs: 10, MinChangeAmount: 10000},\n\t{MaxInputs: 2, MinChangeAmount: 10000},\n}\n\nvar maxValueAgeTests = []coinSelectTest{\n\t{maxValueAgeSelectors[0], coins, 100000, []coinset.Coin{coins[1]}, nil},\n\t{maxValueAgeSelectors[0], coins, 10000000, []coinset.Coin{coins[1]}, nil},\n\t{maxValueAgeSelectors[0], coins, 10000001, []coinset.Coin{coins[1], coins[3]}, nil},\n\t{maxValueAgeSelectors[0], coins, 35000000, []coinset.Coin{coins[1], coins[3]}, nil},\n\t{maxValueAgeSelectors[0], coins, 135000000, []coinset.Coin{coins[1], coins[3], coins[0]}, nil},\n\t{maxValueAgeSelectors[0], coins, 185000000, []coinset.Coin{coins[1], coins[3], coins[0], coins[2]}, nil},\n\t{maxValueAgeSelectors[0], coins, 200000000, nil, coinset.ErrCoinsNoSelectionAvailable},\n\t{maxValueAgeSelectors[1], coins, 40000000, nil, coinset.ErrCoinsNoSelectionAvailable},\n\t{maxValueAgeSelectors[1], coins, 35000000, []coinset.Coin{coins[1], coins[3]}, nil},\n\t{maxValueAgeSelectors[1], coins, 34990001, nil, coinset.ErrCoinsNoSelectionAvailable},\n}\n\nfunc TestMaxValueAgeSelector(t *testing.T) {\n\ttestCoinSelector(maxValueAgeTests, t)\n}\n\nvar minPrioritySelectors = []coinset.MinPriorityCoinSelector{\n\t{MaxInputs: 10, MinChangeAmount: 10000, MinAvgValueAgePerInput: 100000000},\n\t{MaxInputs: 02, MinChangeAmount: 10000, MinAvgValueAgePerInput: 200000000},\n\t{MaxInputs: 02, MinChangeAmount: 10000, MinAvgValueAgePerInput: 150000000},\n\t{MaxInputs: 03, MinChangeAmount: 10000, MinAvgValueAgePerInput: 150000000},\n\t{MaxInputs: 10, MinChangeAmount: 10000, MinAvgValueAgePerInput: 1000000000},\n\t{MaxInputs: 10, MinChangeAmount: 10000, MinAvgValueAgePerInput: 175000000},\n\t{MaxInputs: 02, MinChangeAmount: 10000, MinAvgValueAgePerInput: 125000000},\n}\n\nvar connectedCoins = []coinset.Coin{coins[0], coins[1], coins[3]}\n\nvar minPriorityTests = []coinSelectTest{\n\t{minPrioritySelectors[0], connectedCoins, 100000000, []coinset.Coin{coins[0]}, nil},\n\t{minPrioritySelectors[0], connectedCoins, 125000000, []coinset.Coin{coins[0], coins[3]}, nil},\n\t{minPrioritySelectors[0], connectedCoins, 135000000, []coinset.Coin{coins[0], coins[3], coins[1]}, nil},\n\t{minPrioritySelectors[0], connectedCoins, 140000000, nil, coinset.ErrCoinsNoSelectionAvailable},\n\t{minPrioritySelectors[1], connectedCoins, 100000000, nil, coinset.ErrCoinsNoSelectionAvailable},\n\t{minPrioritySelectors[1], connectedCoins, 10000000, []coinset.Coin{coins[1]}, nil},\n\t{minPrioritySelectors[1], connectedCoins, 100000000, nil, coinset.ErrCoinsNoSelectionAvailable},\n\t{minPrioritySelectors[2], connectedCoins, 11000000, []coinset.Coin{coins[3]}, nil},\n\t{minPrioritySelectors[2], connectedCoins, 25000001, []coinset.Coin{coins[3], coins[1]}, nil},\n\t{minPrioritySelectors[3], connectedCoins, 25000001, []coinset.Coin{coins[3], coins[1], coins[0]}, nil},\n\t{minPrioritySelectors[3], connectedCoins, 100000000, []coinset.Coin{coins[3], coins[1], coins[0]}, nil},\n\t{minPrioritySelectors[3], []coinset.Coin{coins[1], coins[2]}, 10000000, []coinset.Coin{coins[1]}, nil},\n\t{minPrioritySelectors[4], connectedCoins, 1, nil, coinset.ErrCoinsNoSelectionAvailable},\n\t{minPrioritySelectors[5], connectedCoins, 20000000, []coinset.Coin{coins[1], coins[3]}, nil},\n\t{minPrioritySelectors[6], connectedCoins, 25000000, []coinset.Coin{coins[3], coins[0]}, nil},\n}\n\nfunc TestMinPrioritySelector(t *testing.T) {\n\ttestCoinSelector(minPriorityTests, t)\n}\n\nvar (\n\t// should be two outpoints, with 1st one having 0.035BTC value.\n\ttestSimpleCoinNumConfs            = int64(1)\n\ttestSimpleCoinTxHash              = \"9b5965c86de51d5dc824e179a05cf232db78c80ae86ca9d7cb2a655b5e19c1e2\"\n\ttestSimpleCoinTxHex               = \"0100000001a214a110f79e4abe073865ea5b3745c6e82c913bad44be70652804a5e4003b0a010000008c493046022100edd18a69664efa57264be207100c203e6cade1888cbb88a0ad748548256bb2f0022100f1027dc2e6c7f248d78af1dd90027b5b7d8ec563bb62aa85d4e74d6376f3868c0141048f3757b65ed301abd1b0e8942d1ab5b50594d3314cff0299f300c696376a0a9bf72e74710a8af7a5372d4af4bb519e2701a094ef48c8e48e3b65b28502452dceffffffff02e0673500000000001976a914686dd149a79b4a559d561fbc396d3e3c6628b98d88ace86ef102000000001976a914ac3f995655e81b875b38b64351d6f896ddbfc68588ac00000000\"\n\ttestSimpleCoinTxValue0            = btcutil.Amount(3500000)\n\ttestSimpleCoinTxValueAge0         = int64(testSimpleCoinTxValue0) * testSimpleCoinNumConfs\n\ttestSimpleCoinTxPkScript0Hex      = \"76a914686dd149a79b4a559d561fbc396d3e3c6628b98d88ac\"\n\ttestSimpleCoinTxPkScript0Bytes, _ = hex.DecodeString(testSimpleCoinTxPkScript0Hex)\n\ttestSimpleCoinTxBytes, _          = hex.DecodeString(testSimpleCoinTxHex)\n\ttestSimpleCoinTx, _               = btcutil.NewTxFromBytes(testSimpleCoinTxBytes)\n\ttestSimpleCoin                    = &coinset.SimpleCoin{\n\t\tTx:         testSimpleCoinTx,\n\t\tTxIndex:    0,\n\t\tTxNumConfs: testSimpleCoinNumConfs,\n\t}\n)\n\nfunc TestSimpleCoin(t *testing.T) {\n\tif testSimpleCoin.Hash().String() != testSimpleCoinTxHash {\n\t\tt.Error(\"Different value for tx hash than expected\")\n\t}\n\tif testSimpleCoin.Index() != 0 {\n\t\tt.Error(\"Different value for index of outpoint than expected\")\n\t}\n\tif testSimpleCoin.Value() != testSimpleCoinTxValue0 {\n\t\tt.Error(\"Different value of coin value than expected\")\n\t}\n\tif !bytes.Equal(testSimpleCoin.PkScript(), testSimpleCoinTxPkScript0Bytes) {\n\t\tt.Error(\"Different value of coin pkScript than expected\")\n\t}\n\tif testSimpleCoin.NumConfs() != 1 {\n\t\tt.Error(\"Different value of num confs than expected\")\n\t}\n\tif testSimpleCoin.ValueAge() != testSimpleCoinTxValueAge0 {\n\t\tt.Error(\"Different value of coin value * age than expected\")\n\t}\n}\n"
  },
  {
    "path": "btcutil/coinset/cov_report.sh",
    "content": "#!/bin/sh\n\n# This script uses the standard Go test coverage tools to generate a test coverage report.\n# Run tests with coverage enabled and generate coverage profile.\ngo test -cover -coverprofile=coverage.txt ./...\n\n# Display function-level coverage statistics.\ngo tool cover -func=coverage.txt\n"
  },
  {
    "path": "btcutil/coinset/test_coverage.txt",
    "content": "\ngithub.com/conformal/btcutil/coinset/coins.go\t MinPriorityCoinSelector.CoinSelect\t 100.00% (39/39)\ngithub.com/conformal/btcutil/coinset/coins.go\t NewMsgTxWithInputCoins\t\t\t 100.00% (6/6)\ngithub.com/conformal/btcutil/coinset/coins.go\t MinIndexCoinSelector.CoinSelect\t 100.00% (6/6)\ngithub.com/conformal/btcutil/coinset/coins.go\t CoinSet.removeElement\t\t\t 100.00% (5/5)\ngithub.com/conformal/btcutil/coinset/coins.go\t NewCoinSet\t\t\t\t 100.00% (4/4)\ngithub.com/conformal/btcutil/coinset/coins.go\t CoinSet.Coins\t\t\t\t 100.00% (4/4)\ngithub.com/conformal/btcutil/coinset/coins.go\t CoinSet.PopCoin\t\t\t 100.00% (4/4)\ngithub.com/conformal/btcutil/coinset/coins.go\t CoinSet.ShiftCoin\t\t\t 100.00% (4/4)\ngithub.com/conformal/btcutil/coinset/coins.go\t MinNumberCoinSelector.CoinSelect\t 100.00% (4/4)\ngithub.com/conformal/btcutil/coinset/coins.go\t MaxValueAgeCoinSelector.CoinSelect\t 100.00% (4/4)\ngithub.com/conformal/btcutil/coinset/coins.go\t CoinSet.PushCoin\t\t\t 100.00% (3/3)\ngithub.com/conformal/btcutil/coinset/coins.go\t CoinSet.TotalValueAge\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t SimpleCoin.NumConfs\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t SimpleCoin.ValueAge\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t CoinSet.TotalValue\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t byValueAge.Len\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t byValueAge.Swap\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t byValueAge.Less\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t byAmount.Len\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t byAmount.Swap\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t byAmount.Less\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t SimpleCoin.Hash\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t SimpleCoin.Index\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t SimpleCoin.txOut\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t SimpleCoin.Value\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t SimpleCoin.PkScript\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t CoinSet.Num\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset/coins.go\t satisfiesTargetValue\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/coinset\t\t ----------------------------------\t 100.00% (100/100)\n\n"
  },
  {
    "path": "btcutil/const.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nconst (\n\t// SatoshiPerBitcent is the number of satoshi in one bitcoin cent.\n\tSatoshiPerBitcent = 1e6\n\n\t// SatoshiPerBitcoin is the number of satoshi in one bitcoin (1 BTC).\n\tSatoshiPerBitcoin = 1e8\n\n\t// MaxSatoshi is the maximum transaction amount allowed in satoshi.\n\tMaxSatoshi = 21e6 * SatoshiPerBitcoin\n)\n"
  },
  {
    "path": "btcutil/cov_report.sh",
    "content": "#!/bin/sh\n\n# This script uses the standard Go test coverage tools to generate a test coverage report.\n\n# Run tests with coverage enabled and generate coverage profile.\ngo test -cover -coverprofile=coverage.txt ./...\n\n# Display function-level coverage statistics.\ngo tool cover -func=coverage.txt\n"
  },
  {
    "path": "btcutil/doc.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage btcutil provides bitcoin-specific convenience functions and types.\n\n# Block Overview\n\nA Block defines a bitcoin block that provides easier and more efficient\nmanipulation of raw wire protocol blocks.  It also memoizes hashes for the\nblock and its transactions on their first access so subsequent accesses don't\nhave to repeat the relatively expensive hashing operations.\n\n# Tx Overview\n\nA Tx defines a bitcoin transaction that provides more efficient manipulation of\nraw wire protocol transactions.  It memoizes the hash for the transaction on its\nfirst access so subsequent accesses don't have to repeat the relatively\nexpensive hashing operations.\n\n# Address Overview\n\nThe Address interface provides an abstraction for a Bitcoin address.  While the\nmost common type is a pay-to-pubkey-hash, Bitcoin already supports others and\nmay well support more in the future.  This package currently provides\nimplementations for the pay-to-pubkey, pay-to-pubkey-hash, and\npay-to-script-hash address types.\n\nTo decode/encode an address:\n\n\t// NOTE: The default network is only used for address types which do not\n\t// already contain that information.  At this time, that is only\n\t// pay-to-pubkey addresses.\n\taddrString := \"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962\" +\n\t\t\"e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d57\" +\n\t\t\"8a4c702b6bf11d5f\"\n\tdefaultNet := &chaincfg.MainNetParams\n\taddr, err := btcutil.DecodeAddress(addrString, defaultNet)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Println(addr.EncodeAddress())\n*/\npackage btcutil\n"
  },
  {
    "path": "btcutil/example_test.go",
    "content": "package btcutil_test\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n)\n\nfunc ExampleAmount() {\n\n\ta := btcutil.Amount(0)\n\tfmt.Println(\"Zero Satoshi:\", a)\n\n\ta = btcutil.Amount(1e8)\n\tfmt.Println(\"100,000,000 Satoshis:\", a)\n\n\ta = btcutil.Amount(1e5)\n\tfmt.Println(\"100,000 Satoshis:\", a)\n\t// Output:\n\t// Zero Satoshi: 0 BTC\n\t// 100,000,000 Satoshis: 1 BTC\n\t// 100,000 Satoshis: 0.00100000 BTC\n}\n\nfunc ExampleNewAmount() {\n\tamountOne, err := btcutil.NewAmount(1)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Println(amountOne) //Output 1\n\n\tamountFraction, err := btcutil.NewAmount(0.01234567)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Println(amountFraction) //Output 2\n\n\tamountZero, err := btcutil.NewAmount(0)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Println(amountZero) //Output 3\n\n\tamountNaN, err := btcutil.NewAmount(math.NaN())\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Println(amountNaN) //Output 4\n\n\t// Output: 1 BTC\n\t// 0.01234567 BTC\n\t// 0 BTC\n\t// invalid bitcoin amount\n}\n\nfunc ExampleAmount_unitConversions() {\n\tamount := btcutil.Amount(44433322211100)\n\n\tfmt.Println(\"Satoshi to kBTC:\", amount.Format(btcutil.AmountKiloBTC))\n\tfmt.Println(\"Satoshi to BTC:\", amount)\n\tfmt.Println(\"Satoshi to MilliBTC:\", amount.Format(btcutil.AmountMilliBTC))\n\tfmt.Println(\"Satoshi to MicroBTC:\", amount.Format(btcutil.AmountMicroBTC))\n\tfmt.Println(\"Satoshi to Satoshi:\", amount.Format(btcutil.AmountSatoshi))\n\n\t// Output:\n\t// Satoshi to kBTC: 444.333222111 kBTC\n\t// Satoshi to BTC: 444333.22211100 BTC\n\t// Satoshi to MilliBTC: 444333222.111 mBTC\n\t// Satoshi to MicroBTC: 444333222111 μBTC\n\t// Satoshi to Satoshi: 44433322211100 Satoshi\n}\n"
  },
  {
    "path": "btcutil/gcs/README.md",
    "content": "gcs\n==========\n\n[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)]\n(https://travis-ci.org/btcsuite/btcutil) [![ISC License]\n(http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://godoc.org/github.com/btcsuite/btcd/btcutil/gcs?status.png)]\n(http://godoc.org/github.com/btcsuite/btcd/btcutil/gcs)\n\nPackage gcs provides an API for building and using a Golomb-coded set filter\nsimilar to that described [here](http://giovanni.bajo.it/post/47119962313/golomb-coded-sets-smaller-than-bloom-filters).\n\nA comprehensive suite of tests is provided to ensure proper functionality.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/btcutil/gcs\n```\n\n## License\n\nPackage gcs is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "btcutil/gcs/builder/builder.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Copyright (c) 2017 The Lightning Network Developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage builder\n\nimport (\n\t\"crypto/rand\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\n\t\"github.com/btcsuite/btcd/btcutil/gcs\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// DefaultP is the default collision probability (2^-19)\n\tDefaultP = 19\n\n\t// DefaultM is the default value used for the hash range.\n\tDefaultM uint64 = 784931\n)\n\n// GCSBuilder is a utility class that makes building GCS filters convenient.\ntype GCSBuilder struct {\n\tp uint8\n\n\tm uint64\n\n\tkey [gcs.KeySize]byte\n\n\t// data is a set of entries represented as strings. This is done to\n\t// deduplicate items as they are added.\n\tdata map[string]struct{}\n\terr  error\n}\n\n// RandomKey is a utility function that returns a cryptographically random\n// [gcs.KeySize]byte usable as a key for a GCS filter.\nfunc RandomKey() ([gcs.KeySize]byte, error) {\n\tvar key [gcs.KeySize]byte\n\n\t// Read a byte slice from rand.Reader.\n\trandKey := make([]byte, gcs.KeySize)\n\t_, err := rand.Read(randKey)\n\n\t// This shouldn't happen unless the user is on a system that doesn't\n\t// have a system CSPRNG. OK to panic in this case.\n\tif err != nil {\n\t\treturn key, err\n\t}\n\n\t// Copy the byte slice to a [gcs.KeySize]byte array and return it.\n\tcopy(key[:], randKey)\n\treturn key, nil\n}\n\n// DeriveKey is a utility function that derives a key from a chainhash.Hash by\n// truncating the bytes of the hash to the appropriate key size.\nfunc DeriveKey(keyHash *chainhash.Hash) [gcs.KeySize]byte {\n\tvar key [gcs.KeySize]byte\n\tcopy(key[:], keyHash.CloneBytes())\n\treturn key\n}\n\n// Key retrieves the key with which the builder will build a filter. This is\n// useful if the builder is created with a random initial key.\nfunc (b *GCSBuilder) Key() ([gcs.KeySize]byte, error) {\n\t// Do nothing if the builder's errored out.\n\tif b.err != nil {\n\t\treturn [gcs.KeySize]byte{}, b.err\n\t}\n\n\treturn b.key, nil\n}\n\n// SetKey sets the key with which the builder will build a filter to the passed\n// [gcs.KeySize]byte.\nfunc (b *GCSBuilder) SetKey(key [gcs.KeySize]byte) *GCSBuilder {\n\t// Do nothing if the builder's already errored out.\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\tcopy(b.key[:], key[:])\n\treturn b\n}\n\n// SetKeyFromHash sets the key with which the builder will build a filter to a\n// key derived from the passed chainhash.Hash using DeriveKey().\nfunc (b *GCSBuilder) SetKeyFromHash(keyHash *chainhash.Hash) *GCSBuilder {\n\t// Do nothing if the builder's already errored out.\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\treturn b.SetKey(DeriveKey(keyHash))\n}\n\n// SetP sets the filter's probability after calling Builder().\nfunc (b *GCSBuilder) SetP(p uint8) *GCSBuilder {\n\t// Do nothing if the builder's already errored out.\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\t// Basic sanity check.\n\tif p > 32 {\n\t\tb.err = gcs.ErrPTooBig\n\t\treturn b\n\t}\n\n\tb.p = p\n\treturn b\n}\n\n// SetM sets the filter's modulous value after calling Builder().\nfunc (b *GCSBuilder) SetM(m uint64) *GCSBuilder {\n\t// Do nothing if the builder's already errored out.\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\t// Basic sanity check.\n\tif m > uint64(math.MaxUint32) {\n\t\tb.err = gcs.ErrPTooBig\n\t\treturn b\n\t}\n\n\tb.m = m\n\treturn b\n}\n\n// Preallocate sets the estimated filter size after calling Builder() to reduce\n// the probability of memory reallocations. If the builder has already had data\n// added to it, Preallocate has no effect.\nfunc (b *GCSBuilder) Preallocate(n uint32) *GCSBuilder {\n\t// Do nothing if the builder's already errored out.\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\tif b.data == nil {\n\t\tb.data = make(map[string]struct{}, n)\n\t}\n\n\treturn b\n}\n\n// AddEntry adds a []byte to the list of entries to be included in the GCS\n// filter when it's built.\nfunc (b *GCSBuilder) AddEntry(data []byte) *GCSBuilder {\n\t// Do nothing if the builder's already errored out.\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\tb.data[string(data)] = struct{}{}\n\treturn b\n}\n\n// AddEntries adds all the []byte entries in a [][]byte to the list of entries\n// to be included in the GCS filter when it's built.\nfunc (b *GCSBuilder) AddEntries(data [][]byte) *GCSBuilder {\n\t// Do nothing if the builder's already errored out.\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\tfor _, entry := range data {\n\t\tb.AddEntry(entry)\n\t}\n\treturn b\n}\n\n// AddHash adds a chainhash.Hash to the list of entries to be included in the\n// GCS filter when it's built.\nfunc (b *GCSBuilder) AddHash(hash *chainhash.Hash) *GCSBuilder {\n\t// Do nothing if the builder's already errored out.\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\treturn b.AddEntry(hash.CloneBytes())\n}\n\n// AddWitness adds each item of the passed filter stack to the filter, and then\n// adds each item as a script.\nfunc (b *GCSBuilder) AddWitness(witness wire.TxWitness) *GCSBuilder {\n\t// Do nothing if the builder's already errored out.\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\treturn b.AddEntries(witness)\n}\n\n// Build returns a function which builds a GCS filter with the given parameters\n// and data.\nfunc (b *GCSBuilder) Build() (*gcs.Filter, error) {\n\t// Do nothing if the builder's already errored out.\n\tif b.err != nil {\n\t\treturn nil, b.err\n\t}\n\n\t// We'll ensure that all the parameters we need to actually build the\n\t// filter properly are set.\n\tif b.p == 0 {\n\t\treturn nil, fmt.Errorf(\"p value is not set, cannot build\")\n\t}\n\tif b.m == 0 {\n\t\treturn nil, fmt.Errorf(\"m value is not set, cannot build\")\n\t}\n\n\tdataSlice := make([][]byte, 0, len(b.data))\n\tfor item := range b.data {\n\t\tdataSlice = append(dataSlice, []byte(item))\n\t}\n\n\treturn gcs.BuildGCSFilter(b.p, b.m, b.key, dataSlice)\n}\n\n// WithKeyPNM creates a GCSBuilder with specified key and the passed\n// probability, modulus and estimated filter size.\nfunc WithKeyPNM(key [gcs.KeySize]byte, p uint8, n uint32, m uint64) *GCSBuilder {\n\tb := GCSBuilder{}\n\treturn b.SetKey(key).SetP(p).SetM(m).Preallocate(n)\n}\n\n// WithKeyPM creates a GCSBuilder with specified key and the passed\n// probability.  Estimated filter size is set to zero, which means more\n// reallocations are done when building the filter.\nfunc WithKeyPM(key [gcs.KeySize]byte, p uint8, m uint64) *GCSBuilder {\n\treturn WithKeyPNM(key, p, 0, m)\n}\n\n// WithKey creates a GCSBuilder with specified key. Probability is set to 19\n// (2^-19 collision probability). Estimated filter size is set to zero, which\n// means more reallocations are done when building the filter.\nfunc WithKey(key [gcs.KeySize]byte) *GCSBuilder {\n\treturn WithKeyPNM(key, DefaultP, 0, DefaultM)\n}\n\n// WithKeyHashPNM creates a GCSBuilder with key derived from the specified\n// chainhash.Hash and the passed probability and estimated filter size.\nfunc WithKeyHashPNM(keyHash *chainhash.Hash, p uint8, n uint32,\n\tm uint64) *GCSBuilder {\n\n\treturn WithKeyPNM(DeriveKey(keyHash), p, n, m)\n}\n\n// WithKeyHashPM creates a GCSBuilder with key derived from the specified\n// chainhash.Hash and the passed probability. Estimated filter size is set to\n// zero, which means more reallocations are done when building the filter.\nfunc WithKeyHashPM(keyHash *chainhash.Hash, p uint8, m uint64) *GCSBuilder {\n\treturn WithKeyHashPNM(keyHash, p, 0, m)\n}\n\n// WithKeyHash creates a GCSBuilder with key derived from the specified\n// chainhash.Hash. Probability is set to 20 (2^-20 collision probability).\n// Estimated filter size is set to zero, which means more reallocations are\n// done when building the filter.\nfunc WithKeyHash(keyHash *chainhash.Hash) *GCSBuilder {\n\treturn WithKeyHashPNM(keyHash, DefaultP, 0, DefaultM)\n}\n\n// WithRandomKeyPNM creates a GCSBuilder with a cryptographically random key and\n// the passed probability and estimated filter size.\nfunc WithRandomKeyPNM(p uint8, n uint32, m uint64) *GCSBuilder {\n\tkey, err := RandomKey()\n\tif err != nil {\n\t\tb := GCSBuilder{err: err}\n\t\treturn &b\n\t}\n\treturn WithKeyPNM(key, p, n, m)\n}\n\n// WithRandomKeyPM creates a GCSBuilder with a cryptographically random key and\n// the passed probability. Estimated filter size is set to zero, which means\n// more reallocations are done when building the filter.\nfunc WithRandomKeyPM(p uint8, m uint64) *GCSBuilder {\n\treturn WithRandomKeyPNM(p, 0, m)\n}\n\n// WithRandomKey creates a GCSBuilder with a cryptographically random key.\n// Probability is set to 20 (2^-20 collision probability). Estimated filter\n// size is set to zero, which means more reallocations are done when\n// building the filter.\nfunc WithRandomKey() *GCSBuilder {\n\treturn WithRandomKeyPNM(DefaultP, 0, DefaultM)\n}\n\n// BuildBasicFilter builds a basic GCS filter from a block. A basic GCS filter\n// will contain all the previous output scripts spent by inputs within a block,\n// as well as the data pushes within all the outputs created within a block.\nfunc BuildBasicFilter(block *wire.MsgBlock, prevOutScripts [][]byte) (*gcs.Filter, error) {\n\tblockHash := block.BlockHash()\n\tb := WithKeyHash(&blockHash)\n\n\t// If the filter had an issue with the specified key, then we force it\n\t// to bubble up here by calling the Key() function.\n\t_, err := b.Key()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// In order to build a basic filter, we'll range over the entire block,\n\t// adding each whole script itself.\n\tfor _, tx := range block.Transactions {\n\t\t// For each output in a transaction, we'll add each of the\n\t\t// individual data pushes within the script.\n\t\tfor _, txOut := range tx.TxOut {\n\t\t\tif len(txOut.PkScript) == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// In order to allow the filters to later be committed\n\t\t\t// to within an OP_RETURN output, we ignore all\n\t\t\t// OP_RETURNs to avoid a circular dependency.\n\t\t\tif txOut.PkScript[0] == txscript.OP_RETURN {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tb.AddEntry(txOut.PkScript)\n\t\t}\n\t}\n\n\t// In the second pass, we'll also add all the prevOutScripts\n\t// individually as elements.\n\tfor _, prevScript := range prevOutScripts {\n\t\tif len(prevScript) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tb.AddEntry(prevScript)\n\t}\n\n\treturn b.Build()\n}\n\n// GetFilterHash returns the double-SHA256 of the filter.\nfunc GetFilterHash(filter *gcs.Filter) (chainhash.Hash, error) {\n\tfilterData, err := filter.NBytes()\n\tif err != nil {\n\t\treturn chainhash.Hash{}, err\n\t}\n\n\treturn chainhash.DoubleHashRaw(func(w io.Writer) error {\n\t\t_, err := w.Write(filterData)\n\t\treturn err\n\t}), nil\n}\n\n// MakeHeaderForFilter makes a filter chain header for a filter, given the\n// filter and the previous filter chain header.\nfunc MakeHeaderForFilter(filter *gcs.Filter, prevHeader chainhash.Hash) (chainhash.Hash, error) {\n\tfilterTip := make([]byte, 2*chainhash.HashSize)\n\tfilterHash, err := GetFilterHash(filter)\n\tif err != nil {\n\t\treturn chainhash.Hash{}, err\n\t}\n\n\t// In the buffer we created above we'll compute hash || prevHash as an\n\t// intermediate value.\n\tcopy(filterTip, filterHash[:])\n\tcopy(filterTip[chainhash.HashSize:], prevHeader[:])\n\n\t// The final filter hash is the double-sha256 of the hash computed\n\t// above.\n\treturn chainhash.DoubleHashRaw(func(w io.Writer) error {\n\t\t_, err := w.Write(filterTip)\n\t\treturn err\n\t}), nil\n}\n"
  },
  {
    "path": "btcutil/gcs/builder/builder_test.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Copyright (c) 2017 The Lightning Network Developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage builder_test\n\nimport (\n\t\"encoding/hex\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/btcutil/gcs\"\n\t\"github.com/btcsuite/btcd/btcutil/gcs/builder\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nvar (\n\t// List of values for building a filter\n\tcontents = [][]byte{\n\t\t[]byte(\"Alex\"),\n\t\t[]byte(\"Bob\"),\n\t\t[]byte(\"Charlie\"),\n\t\t[]byte(\"Dick\"),\n\t\t[]byte(\"Ed\"),\n\t\t[]byte(\"Frank\"),\n\t\t[]byte(\"George\"),\n\t\t[]byte(\"Harry\"),\n\t\t[]byte(\"Ilya\"),\n\t\t[]byte(\"John\"),\n\t\t[]byte(\"Kevin\"),\n\t\t[]byte(\"Larry\"),\n\t\t[]byte(\"Michael\"),\n\t\t[]byte(\"Nate\"),\n\t\t[]byte(\"Owen\"),\n\t\t[]byte(\"Paul\"),\n\t\t[]byte(\"Quentin\"),\n\t}\n\n\ttestKey = [16]byte{0x4c, 0xb1, 0xab, 0x12, 0x57, 0x62, 0x1e, 0x41,\n\t\t0x3b, 0x8b, 0x0e, 0x26, 0x64, 0x8d, 0x4a, 0x15}\n\n\ttestHash = \"000000000000000000496d7ff9bd2c96154a8d64260e8b3b411e625712abb14c\"\n\n\ttestAddr = \"3Nxwenay9Z8Lc9JBiywExpnEFiLp6Afp8v\"\n\n\twitness = [][]byte{\n\t\t{0x4c, 0xb1, 0xab, 0x12, 0x57, 0x62, 0x1e, 0x41,\n\t\t\t0x3b, 0x8b, 0x0e, 0x26, 0x64, 0x8d, 0x4a, 0x15,\n\t\t\t0x3b, 0x8b, 0x0e, 0x26, 0x64, 0x8d, 0x4a, 0x15,\n\t\t\t0x3b, 0x8b, 0x0e, 0x26, 0x64, 0x8d, 0x4a, 0x15},\n\n\t\t{0xdd, 0xa3, 0x5a, 0x14, 0x88, 0xfb, 0x97, 0xb6,\n\t\t\t0xeb, 0x3f, 0xe6, 0xe9, 0xef, 0x2a, 0x25, 0x81,\n\t\t\t0x4e, 0x39, 0x6f, 0xb5, 0xdc, 0x29, 0x5f, 0xe9,\n\t\t\t0x94, 0xb9, 0x67, 0x89, 0xb2, 0x1a, 0x03, 0x98,\n\t\t\t0x94, 0xb9, 0x67, 0x89, 0xb2, 0x1a, 0x03, 0x98,\n\t\t\t0x94, 0xb9, 0x67, 0x89, 0xb2, 0x1a, 0x03, 0x98},\n\t}\n)\n\n// TestUseBlockHash tests using a block hash as a filter key.\nfunc TestUseBlockHash(t *testing.T) {\n\t// Block hash #448710, pretty high difficulty.\n\thash, err := chainhash.NewHashFromStr(testHash)\n\tif err != nil {\n\t\tt.Fatalf(\"Hash from string failed: %s\", err.Error())\n\t}\n\n\t// wire.OutPoint\n\toutPoint := wire.OutPoint{\n\t\tHash:  *hash,\n\t\tIndex: 4321,\n\t}\n\n\t// btcutil.Address\n\taddr, err := btcutil.DecodeAddress(testAddr, &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Address decode failed: %s\", err.Error())\n\t}\n\taddrBytes, err := txscript.NewScriptBuilder().\n\t\tAddOp(txscript.OP_HASH160).AddData(addr.ScriptAddress()).\n\t\tAddOp(txscript.OP_EQUAL).Script()\n\tif err != nil {\n\t\tt.Fatalf(\"Address script build failed: %s\", err.Error())\n\t}\n\n\t// Create a GCSBuilder with a key hash and check that the key is derived\n\t// correctly, then test it.\n\tb := builder.WithKeyHash(hash)\n\tkey, err := b.Key()\n\tif err != nil {\n\t\tt.Fatalf(\"Builder instantiation with key hash failed: %s\",\n\t\t\terr.Error())\n\t}\n\tif key != testKey {\n\t\tt.Fatalf(\"Key not derived correctly from key hash:\\n%s\\n%s\",\n\t\t\thex.EncodeToString(key[:]),\n\t\t\thex.EncodeToString(testKey[:]))\n\t}\n\tBuilderTest(b, hash, builder.DefaultP, outPoint, addrBytes, witness, t)\n\n\t// Create a GCSBuilder with a key hash and non-default P and test it.\n\tb = builder.WithKeyHashPM(hash, 30, 90)\n\tBuilderTest(b, hash, 30, outPoint, addrBytes, witness, t)\n\n\t// Create a GCSBuilder with a random key, set the key from a hash\n\t// manually, check that the key is correct, and test it.\n\tb = builder.WithRandomKey()\n\tb.SetKeyFromHash(hash)\n\tkey, err = b.Key()\n\tif err != nil {\n\t\tt.Fatalf(\"Builder instantiation with known key failed: %s\",\n\t\t\terr.Error())\n\t}\n\tif key != testKey {\n\t\tt.Fatalf(\"Key not copied correctly from known key:\\n%s\\n%s\",\n\t\t\thex.EncodeToString(key[:]),\n\t\t\thex.EncodeToString(testKey[:]))\n\t}\n\tBuilderTest(b, hash, builder.DefaultP, outPoint, addrBytes, witness, t)\n\n\t// Create a GCSBuilder with a random key and test it.\n\tb = builder.WithRandomKey()\n\tkey1, err := b.Key()\n\tif err != nil {\n\t\tt.Fatalf(\"Builder instantiation with random key failed: %s\",\n\t\t\terr.Error())\n\t}\n\tt.Logf(\"Random Key 1: %s\", hex.EncodeToString(key1[:]))\n\tBuilderTest(b, hash, builder.DefaultP, outPoint, addrBytes, witness, t)\n\n\t// Create a GCSBuilder with a random key and non-default P and test it.\n\tb = builder.WithRandomKeyPM(30, 90)\n\tkey2, err := b.Key()\n\tif err != nil {\n\t\tt.Fatalf(\"Builder instantiation with random key failed: %s\",\n\t\t\terr.Error())\n\t}\n\tt.Logf(\"Random Key 2: %s\", hex.EncodeToString(key2[:]))\n\tif key2 == key1 {\n\t\tt.Fatalf(\"Random keys are the same!\")\n\t}\n\tBuilderTest(b, hash, 30, outPoint, addrBytes, witness, t)\n\n\t// Create a GCSBuilder with a known key and test it.\n\tb = builder.WithKey(testKey)\n\tkey, err = b.Key()\n\tif err != nil {\n\t\tt.Fatalf(\"Builder instantiation with known key failed: %s\",\n\t\t\terr.Error())\n\t}\n\tif key != testKey {\n\t\tt.Fatalf(\"Key not copied correctly from known key:\\n%s\\n%s\",\n\t\t\thex.EncodeToString(key[:]),\n\t\t\thex.EncodeToString(testKey[:]))\n\t}\n\tBuilderTest(b, hash, builder.DefaultP, outPoint, addrBytes, witness, t)\n\n\t// Create a GCSBuilder with a known key and non-default P and test it.\n\tb = builder.WithKeyPM(testKey, 30, 90)\n\tkey, err = b.Key()\n\tif err != nil {\n\t\tt.Fatalf(\"Builder instantiation with known key failed: %s\",\n\t\t\terr.Error())\n\t}\n\tif key != testKey {\n\t\tt.Fatalf(\"Key not copied correctly from known key:\\n%s\\n%s\",\n\t\t\thex.EncodeToString(key[:]),\n\t\t\thex.EncodeToString(testKey[:]))\n\t}\n\tBuilderTest(b, hash, 30, outPoint, addrBytes, witness, t)\n\n\t// Create a GCSBuilder with a known key and too-high P and ensure error\n\t// works throughout all functions that use it.\n\tb = builder.WithRandomKeyPM(33, 99).SetKeyFromHash(hash).SetKey(testKey)\n\tb.SetP(30).AddEntry(hash.CloneBytes()).AddEntries(contents).\n\t\tAddHash(hash).AddEntry(addrBytes)\n\t_, err = b.Key()\n\tif err != gcs.ErrPTooBig {\n\t\tt.Fatalf(\"No error on P too big!\")\n\t}\n\t_, err = b.Build()\n\tif err != gcs.ErrPTooBig {\n\t\tt.Fatalf(\"No error on P too big!\")\n\t}\n}\n\nfunc BuilderTest(b *builder.GCSBuilder, hash *chainhash.Hash, p uint8,\n\toutPoint wire.OutPoint, addrBytes []byte, witness wire.TxWitness,\n\tt *testing.T) {\n\n\tkey, err := b.Key()\n\tif err != nil {\n\t\tt.Fatalf(\"Builder instantiation with key hash failed: %s\",\n\t\t\terr.Error())\n\t}\n\n\t// Build a filter and test matches.\n\tb.AddEntries(contents)\n\tf, err := b.Build()\n\tif err != nil {\n\t\tt.Fatalf(\"Filter build failed: %s\", err.Error())\n\t}\n\tif f.P() != p {\n\t\tt.Fatalf(\"Filter built with wrong probability\")\n\t}\n\tmatch, err := f.Match(key, []byte(\"Nate\"))\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match failed: %s\", err)\n\t}\n\tif !match {\n\t\tt.Fatal(\"Filter didn't match when it should have!\")\n\t}\n\tmatch, err = f.Match(key, []byte(\"weks\"))\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match failed: %s\", err)\n\t}\n\tif match {\n\t\tt.Logf(\"False positive match, should be 1 in 2**%d!\",\n\t\t\tbuilder.DefaultP)\n\t}\n\n\t// Add a hash, build a filter, and test matches\n\tb.AddHash(hash)\n\tf, err = b.Build()\n\tif err != nil {\n\t\tt.Fatalf(\"Filter build failed: %s\", err.Error())\n\t}\n\tmatch, err = f.Match(key, hash.CloneBytes())\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match failed: %s\", err)\n\t}\n\tif !match {\n\t\tt.Fatal(\"Filter didn't match when it should have!\")\n\t}\n\n\t// Add a script, build a filter, and test matches\n\tb.AddEntry(addrBytes)\n\tf, err = b.Build()\n\tif err != nil {\n\t\tt.Fatalf(\"Filter build failed: %s\", err.Error())\n\t}\n\tmatch, err = f.MatchAny(key, [][]byte{addrBytes})\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match any failed: %s\", err)\n\t}\n\tif !match {\n\t\tt.Fatal(\"Filter didn't match when it should have!\")\n\t}\n\n\t// Add a routine witness stack, build a filter, and test that it\n\t// matches.\n\tb.AddWitness(witness)\n\tf, err = b.Build()\n\tif err != nil {\n\t\tt.Fatalf(\"Filter build failed: %s\", err.Error())\n\t}\n\tmatch, err = f.MatchAny(key, witness)\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match any failed: %s\", err)\n\t}\n\tif !match {\n\t\tt.Fatal(\"Filter didn't match when it should have!\")\n\t}\n\n\t// Check that adding duplicate items does not increase filter size.\n\toriginalSize := f.N()\n\tb.AddEntry(addrBytes)\n\tb.AddWitness(witness)\n\tf, err = b.Build()\n\tif err != nil {\n\t\tt.Fatalf(\"Filter build failed: %s\", err.Error())\n\t}\n\tif f.N() != originalSize {\n\t\tt.Fatal(\"Filter size increased with duplicate items\")\n\t}\n}\n"
  },
  {
    "path": "btcutil/gcs/doc.go",
    "content": "// Copyright (c) 2016-2017 The btcsuite developers\n// Copyright (c) 2016-2017 The Lightning Network Developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage gcs provides an API for building and using a Golomb-coded set filter.\n\n# Golomb-Coded Set\n\nA Golomb-coded set is a probabilistic data structure used similarly to a Bloom\nfilter. A filter uses constant-size overhead plus on average n+2 bits per\nitem added to the filter, where 2^-n is the desired false positive (collision)\nprobability.\n\n# GCS use in Bitcoin\n\nGCS filters are a proposed mechanism for storing and transmitting per-block\nfilters in Bitcoin. The usage is intended to be the inverse of Bloom filters:\na full node would send an SPV node the GCS filter for a block, which the SPV\nnode would check against its list of relevant items. The suggested collision\nprobability for Bitcoin use is 2^-20.\n*/\npackage gcs\n"
  },
  {
    "path": "btcutil/gcs/gcs.go",
    "content": "// Copyright (c) 2016-2017 The btcsuite developers\n// Copyright (c) 2016-2017 The Lightning Network Developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage gcs\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"sort\"\n\n\t\"github.com/aead/siphash\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/kkdai/bstream\"\n)\n\n// Inspired by https://github.com/rasky/gcs\n\nvar (\n\t// ErrNTooBig signifies that the filter can't handle N items.\n\tErrNTooBig = fmt.Errorf(\"N is too big to fit in uint32\")\n\n\t// ErrPTooBig signifies that the filter can't handle `1/2**P`\n\t// collision probability.\n\tErrPTooBig = fmt.Errorf(\"P is too big to fit in uint32\")\n)\n\nconst (\n\t// KeySize is the size of the byte array required for key material for\n\t// the SipHash keyed hash function.\n\tKeySize = 16\n\n\t// varIntProtoVer is the protocol version to use for serializing N as a\n\t// VarInt.\n\tvarIntProtoVer uint32 = 0\n)\n\n// fastReduction calculates a mapping that's more ore less equivalent to: x mod\n// N. However, instead of using a mod operation, which using a non-power of two\n// will lead to slowness on many processors due to unnecessary division, we\n// instead use a \"multiply-and-shift\" trick which eliminates all divisions,\n// described in:\n// https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/\n//\n//\tv * N  >> log_2(N)\n//\n// In our case, using 64-bit integers, log_2 is 64. As most processors don't\n// support 128-bit arithmetic natively, we'll be super portable and unfold the\n// operation into several operations with 64-bit arithmetic. As inputs, we the\n// number to reduce, and our modulus N divided into its high 32-bits and lower\n// 32-bits.\nfunc fastReduction(v, nHi, nLo uint64) uint64 {\n\t// First, we'll spit the item we need to reduce into its higher and\n\t// lower bits.\n\tvhi := v >> 32\n\tvlo := uint64(uint32(v))\n\n\t// Then, we distribute multiplication over each part.\n\tvnphi := vhi * nHi\n\tvnpmid := vhi * nLo\n\tnpvmid := nHi * vlo\n\tvnplo := vlo * nLo\n\n\t// We calculate the carry bit.\n\tcarry := (uint64(uint32(vnpmid)) + uint64(uint32(npvmid)) +\n\t\t(vnplo >> 32)) >> 32\n\n\t// Last, we add the high bits, the middle bits, and the carry.\n\tv = vnphi + (vnpmid >> 32) + (npvmid >> 32) + carry\n\n\treturn v\n}\n\n// Filter describes an immutable filter that can be built from a set of data\n// elements, serialized, deserialized, and queried in a thread-safe manner. The\n// serialized form is compressed as a Golomb Coded Set (GCS), but does not\n// include N or P to allow the user to encode the metadata separately if\n// necessary. The hash function used is SipHash, a keyed function; the key used\n// in building the filter is required in order to match filter values and is\n// not included in the serialized form.\ntype Filter struct {\n\tn         uint32\n\tp         uint8\n\tmodulusNP uint64\n\n\tfilterData []byte\n}\n\n// BuildGCSFilter builds a new GCS filter with the collision probability of\n// `1/(2**P)`, key `key`, and including every `[]byte` in `data` as a member of\n// the set.\nfunc BuildGCSFilter(P uint8, M uint64, key [KeySize]byte, data [][]byte) (*Filter, error) { // nolint:gocritic\n\t// Some initial parameter checks: make sure we have data from which to\n\t// build the filter, and make sure our parameters will fit the hash\n\t// function we're using.\n\tif uint64(len(data)) >= (1 << 32) {\n\t\treturn nil, ErrNTooBig\n\t}\n\tif P > 32 {\n\t\treturn nil, ErrPTooBig\n\t}\n\n\t// Create the filter object and insert metadata.\n\tf := Filter{\n\t\tn: uint32(len(data)),\n\t\tp: P,\n\t}\n\n\t// First we'll compute the value of m, which is the modulus we use\n\t// within our finite field. We want to compute: mScalar * 2^P. We use\n\t// math.Round in order to round the value up, rather than down.\n\tf.modulusNP = uint64(f.n) * M\n\n\t// Shortcut if the filter is empty.\n\tif f.n == 0 {\n\t\treturn &f, nil\n\t}\n\n\t// Build the filter.\n\tvalues := make([]uint64, 0, len(data))\n\tb := bstream.NewBStreamWriter(0)\n\n\t// Insert the hash (fast-ranged over a space of N*P) of each data\n\t// element into a slice and sort the slice. This can be greatly\n\t// optimized with native 128-bit multiplication, but we're going to be\n\t// fully portable for now.\n\t//\n\t// First, we cache the high and low bits of modulusNP for the\n\t// multiplication of 2 64-bit integers into a 128-bit integer.\n\tnphi := f.modulusNP >> 32\n\tnplo := uint64(uint32(f.modulusNP))\n\tfor _, d := range data {\n\t\t// For each datum, we assign the initial hash to a uint64.\n\t\tv := siphash.Sum64(d, &key)\n\n\t\tv = fastReduction(v, nphi, nplo)\n\t\tvalues = append(values, v)\n\t}\n\tsort.Slice(values, func(i, j int) bool { return values[i] < values[j] })\n\n\t// Write the sorted list of values into the filter bitstream,\n\t// compressing it using Golomb coding.\n\tvar value, lastValue, remainder uint64\n\tfor _, v := range values {\n\t\t// Calculate the difference between this value and the last,\n\t\t// modulo P.\n\t\tremainder = (v - lastValue) & ((uint64(1) << f.p) - 1)\n\n\t\t// Calculate the difference between this value and the last,\n\t\t// divided by P.\n\t\tvalue = (v - lastValue - remainder) >> f.p\n\t\tlastValue = v\n\n\t\t// Write the P multiple into the bitstream in unary; the\n\t\t// average should be around 1 (2 bits - 0b10).\n\t\tfor value > 0 {\n\t\t\tb.WriteBit(true)\n\t\t\tvalue--\n\t\t}\n\t\tb.WriteBit(false)\n\n\t\t// Write the remainder as a big-endian integer with enough bits\n\t\t// to represent the appropriate collision probability.\n\t\tb.WriteBits(remainder, int(f.p))\n\t}\n\n\t// Copy the bitstream into the filter object and return the object.\n\tf.filterData = b.Bytes()\n\n\treturn &f, nil\n}\n\n// FromBytes deserializes a GCS filter from a known N, P, and serialized filter\n// as returned by Bytes().\nfunc FromBytes(N uint32, P uint8, M uint64, d []byte) (*Filter, error) { // nolint:gocritic\n\t// Basic sanity check.\n\tif P > 32 {\n\t\treturn nil, ErrPTooBig\n\t}\n\n\t// Create the filter object and insert metadata.\n\tf := &Filter{\n\t\tn: N,\n\t\tp: P,\n\t}\n\n\t// First we'll compute the value of m, which is the modulus we use\n\t// within our finite field. We want to compute: mScalar * 2^P. We use\n\t// math.Round in order to round the value up, rather than down.\n\tf.modulusNP = uint64(f.n) * M\n\n\t// Copy the filter.\n\tf.filterData = make([]byte, len(d))\n\tcopy(f.filterData, d)\n\n\treturn f, nil\n}\n\n// FromNBytes deserializes a GCS filter from a known P, and serialized N and\n// filter as returned by NBytes().\nfunc FromNBytes(P uint8, M uint64, d []byte) (*Filter, error) { // nolint:gocritic\n\tbuffer := bytes.NewBuffer(d)\n\tN, err := wire.ReadVarInt(buffer, varIntProtoVer)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif N >= (1 << 32) {\n\t\treturn nil, ErrNTooBig\n\t}\n\treturn FromBytes(uint32(N), P, M, buffer.Bytes())\n}\n\n// Bytes returns the serialized format of the GCS filter, which does not\n// include N or P (returned by separate methods) or the key used by SipHash.\nfunc (f *Filter) Bytes() ([]byte, error) {\n\tfilterData := make([]byte, len(f.filterData))\n\tcopy(filterData, f.filterData)\n\treturn filterData, nil\n}\n\n// NBytes returns the serialized format of the GCS filter with N, which does\n// not include P (returned by a separate method) or the key used by SipHash.\nfunc (f *Filter) NBytes() ([]byte, error) {\n\tvar buffer bytes.Buffer\n\tbuffer.Grow(wire.VarIntSerializeSize(uint64(f.n)) + len(f.filterData))\n\n\terr := wire.WriteVarInt(&buffer, varIntProtoVer, uint64(f.n))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t_, err = buffer.Write(f.filterData)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buffer.Bytes(), nil\n}\n\n// PBytes returns the serialized format of the GCS filter with P, which does\n// not include N (returned by a separate method) or the key used by SipHash.\nfunc (f *Filter) PBytes() ([]byte, error) {\n\tfilterData := make([]byte, len(f.filterData)+1)\n\tfilterData[0] = f.p\n\tcopy(filterData[1:], f.filterData)\n\treturn filterData, nil\n}\n\n// NPBytes returns the serialized format of the GCS filter with N and P, which\n// does not include the key used by SipHash.\nfunc (f *Filter) NPBytes() ([]byte, error) {\n\tvar buffer bytes.Buffer\n\tbuffer.Grow(wire.VarIntSerializeSize(uint64(f.n)) + 1 + len(f.filterData))\n\n\terr := wire.WriteVarInt(&buffer, varIntProtoVer, uint64(f.n))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = buffer.WriteByte(f.p)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t_, err = buffer.Write(f.filterData)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buffer.Bytes(), nil\n}\n\n// P returns the filter's collision probability as a negative power of 2 (that\n// is, a collision probability of `1/2**20` is represented as 20).\nfunc (f *Filter) P() uint8 {\n\treturn f.p\n}\n\n// N returns the size of the data set used to build the filter.\nfunc (f *Filter) N() uint32 {\n\treturn f.n\n}\n\n// Match checks whether a []byte value is likely (within collision probability)\n// to be a member of the set represented by the filter.\nfunc (f *Filter) Match(key [KeySize]byte, data []byte) (bool, error) {\n\t// Create a filter bitstream.\n\tfilterData, err := f.Bytes()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tb := bstream.NewBStreamReader(filterData)\n\n\t// We take the high and low bits of modulusNP for the multiplication\n\t// of 2 64-bit integers into a 128-bit integer.\n\tnphi := f.modulusNP >> 32\n\tnplo := uint64(uint32(f.modulusNP))\n\n\t// Then we hash our search term with the same parameters as the filter.\n\tterm := siphash.Sum64(data, &key)\n\tterm = fastReduction(term, nphi, nplo)\n\n\t// Go through the search filter and look for the desired value.\n\tvar value uint64\n\tfor i := uint32(0); i < f.N(); i++ {\n\t\t// Read the difference between previous and new value from\n\t\t// bitstream.\n\t\tdelta, err := f.readFullUint64(b)\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\treturn false, nil\n\t\t\t}\n\t\t\treturn false, err\n\t\t}\n\n\t\t// Add the delta to the previous value.\n\t\tvalue += delta\n\t\tswitch {\n\n\t\t// The current value matches our query term, success.\n\t\tcase value == term:\n\t\t\treturn true, nil\n\n\t\t// The current value is greater than our query term, thus no\n\t\t// future decoded value can match because the values\n\t\t// monotonically increase.\n\t\tcase value > term:\n\t\t\treturn false, nil\n\t\t}\n\t}\n\n\t// All values were decoded and none produced a successful match. This\n\t// indicates that the items in the filter were all smaller than our\n\t// target.\n\treturn false, nil\n}\n\n// MatchAny returns checks whether any []byte value is likely (within collision\n// probability) to be a member of the set represented by the filter faster than\n// calling Match() for each value individually.\nfunc (f *Filter) MatchAny(key [KeySize]byte, data [][]byte) (bool, error) {\n\t// TODO(conner): add real heuristics to query optimization\n\tswitch {\n\n\tcase len(data) >= int(f.N()/2):\n\t\treturn f.HashMatchAny(key, data)\n\n\tdefault:\n\t\treturn f.ZipMatchAny(key, data)\n\t}\n}\n\n// ZipMatchAny returns checks whether any []byte value is likely (within\n// collision probability) to be a member of the set represented by the filter\n// faster than calling Match() for each value individually.\n//\n// NOTE: This method should outperform HashMatchAny when the number of query\n// entries is smaller than the number of filter entries.\nfunc (f *Filter) ZipMatchAny(key [KeySize]byte, data [][]byte) (bool, error) {\n\t// Basic anity check.\n\tif len(data) == 0 {\n\t\treturn false, nil\n\t}\n\n\t// Create a filter bitstream.\n\tfilterData, err := f.Bytes()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tb := bstream.NewBStreamReader(filterData)\n\n\t// Create an uncompressed filter of the search values.\n\tvalues := make([]uint64, 0, len(data))\n\n\t// First, we cache the high and low bits of modulusNP for the\n\t// multiplication of 2 64-bit integers into a 128-bit integer.\n\tnphi := f.modulusNP >> 32\n\tnplo := uint64(uint32(f.modulusNP))\n\tfor _, d := range data {\n\t\t// For each datum, we assign the initial hash to a uint64.\n\t\tv := siphash.Sum64(d, &key)\n\n\t\t// We'll then reduce the value down to the range of our\n\t\t// modulus.\n\t\tv = fastReduction(v, nphi, nplo)\n\t\tvalues = append(values, v)\n\t}\n\tsort.Slice(values, func(i, j int) bool { return values[i] < values[j] })\n\n\tquerySize := len(values)\n\n\t// Zip down the filters, comparing values until we either run out of\n\t// values to compare in one of the filters or we reach a matching\n\t// value.\n\tvar (\n\t\tvalue      uint64\n\t\tqueryIndex int\n\t)\nout:\n\tfor i := uint32(0); i < f.N(); i++ {\n\t\t// Advance filter we're searching or return false if we're at\n\t\t// the end because nothing matched.\n\t\tdelta, err := f.readFullUint64(b)\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\treturn false, nil\n\t\t\t}\n\t\t\treturn false, err\n\t\t}\n\t\tvalue += delta\n\n\t\tfor {\n\t\t\tswitch {\n\n\t\t\t// All query items have been exhausted and we haven't\n\t\t\t// had a match, therefore there are no matches.\n\t\t\tcase queryIndex == querySize:\n\t\t\t\treturn false, nil\n\n\t\t\t// The current item in the query matches the decoded\n\t\t\t// value, success.\n\t\t\tcase values[queryIndex] == value:\n\t\t\t\treturn true, nil\n\n\t\t\t// The current item in the query is greater than the\n\t\t\t// current decoded value, continue to decode the next\n\t\t\t// delta and try again.\n\t\t\tcase values[queryIndex] > value:\n\t\t\t\tcontinue out\n\t\t\t}\n\n\t\t\tqueryIndex++\n\t\t}\n\t}\n\n\t// All items in the filter were decoded and none produced a successful\n\t// match.\n\treturn false, nil\n}\n\n// HashMatchAny returns checks whether any []byte value is likely (within\n// collision probability) to be a member of the set represented by the filter\n// faster than calling Match() for each value individually.\n//\n// NOTE: This method should outperform MatchAny if the number of query entries\n// approaches the number of filter entries, len(data) >= f.N().\nfunc (f *Filter) HashMatchAny(key [KeySize]byte, data [][]byte) (bool, error) {\n\t// Basic sanity check.\n\tif len(data) == 0 {\n\t\treturn false, nil\n\t}\n\n\t// Create a filter bitstream.\n\tfilterData, err := f.Bytes()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tb := bstream.NewBStreamReader(filterData)\n\n\tvar (\n\t\tvalues    = make(map[uint32]struct{}, f.N())\n\t\tlastValue uint64\n\t)\n\n\t// First, decompress the filter and construct an index of the keys\n\t// contained within the filter. Index construction terminates after all\n\t// values have been read from the bitstream.\n\tfor {\n\t\t// Read the next diff value from the filter, add it to the\n\t\t// last value, and set the new value in the index.\n\t\tvalue, err := f.readFullUint64(b)\n\t\tif err == nil {\n\t\t\tlastValue += value\n\t\t\tvalues[uint32(lastValue)] = struct{}{}\n\t\t\tcontinue\n\t\t} else if err == io.EOF {\n\t\t\tbreak\n\t\t}\n\n\t\treturn false, err\n\t}\n\n\t// We cache the high and low bits of modulusNP for the multiplication of\n\t// 2 64-bit integers into a 128-bit integer.\n\tnphi := f.modulusNP >> 32\n\tnplo := uint64(uint32(f.modulusNP))\n\n\t// Finally, run through the provided data items, querying the index to\n\t// determine if the filter contains any elements of interest.\n\tfor _, d := range data {\n\t\t// For each datum, we assign the initial hash to\n\t\t// a uint64.\n\t\tv := siphash.Sum64(d, &key)\n\n\t\t// We'll then reduce the value down to the range\n\t\t// of our modulus.\n\t\tv = fastReduction(v, nphi, nplo)\n\n\t\tif _, ok := values[uint32(v)]; !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\treturn true, nil\n\t}\n\n\treturn false, nil\n}\n\n// readFullUint64 reads a value represented by the sum of a unary multiple of\n// the filter's P modulus (`2**P`) and a big-endian P-bit remainder.\nfunc (f *Filter) readFullUint64(b *bstream.BStream) (uint64, error) {\n\tvar quotient uint64\n\n\t// Count the 1s until we reach a 0.\n\tc, err := b.ReadBit()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tfor c {\n\t\tquotient++\n\t\tc, err = b.ReadBit()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\n\t// Read P bits.\n\tremainder, err := b.ReadBits(int(f.p))\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Add the multiple and the remainder.\n\tv := (quotient << f.p) + remainder\n\treturn v, nil\n}\n"
  },
  {
    "path": "btcutil/gcs/gcs_test.go",
    "content": "// Copyright (c) 2016-2017 The btcsuite developers\n// Copyright (c) 2016-2017 The Lightning Network Developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage gcs_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"math/rand\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil/gcs\"\n)\n\nvar (\n\t// No need to allocate an err variable in every test\n\terr error\n\n\t// Collision probability for the tests (1/2**19)\n\tP = uint8(19)\n\n\t// Modulus value for the tests.\n\tM uint64 = 784931\n\n\t// Filters are conserved between tests but we must define with an\n\t// interface which functions we're testing because the gcsFilter type\n\t// isn't exported\n\tfilter, filter2, filter3 *gcs.Filter\n\n\t// We need to use the same key for building and querying the filters\n\tkey [gcs.KeySize]byte\n\n\t// List of values for building a filter\n\tcontents = [][]byte{\n\t\t[]byte(\"Alex\"),\n\t\t[]byte(\"Bob\"),\n\t\t[]byte(\"Charlie\"),\n\t\t[]byte(\"Dick\"),\n\t\t[]byte(\"Ed\"),\n\t\t[]byte(\"Frank\"),\n\t\t[]byte(\"George\"),\n\t\t[]byte(\"Harry\"),\n\t\t[]byte(\"Ilya\"),\n\t\t[]byte(\"John\"),\n\t\t[]byte(\"Kevin\"),\n\t\t[]byte(\"Larry\"),\n\t\t[]byte(\"Michael\"),\n\t\t[]byte(\"Nate\"),\n\t\t[]byte(\"Owen\"),\n\t\t[]byte(\"Paul\"),\n\t\t[]byte(\"Quentin\"),\n\t}\n\n\t// List of values for querying a filter using MatchAny()\n\tcontents2 = [][]byte{\n\t\t[]byte(\"Alice\"),\n\t\t[]byte(\"Betty\"),\n\t\t[]byte(\"Charmaine\"),\n\t\t[]byte(\"Donna\"),\n\t\t[]byte(\"Edith\"),\n\t\t[]byte(\"Faina\"),\n\t\t[]byte(\"Georgia\"),\n\t\t[]byte(\"Hannah\"),\n\t\t[]byte(\"Ilsbeth\"),\n\t\t[]byte(\"Jennifer\"),\n\t\t[]byte(\"Kayla\"),\n\t\t[]byte(\"Lena\"),\n\t\t[]byte(\"Michelle\"),\n\t\t[]byte(\"Natalie\"),\n\t\t[]byte(\"Ophelia\"),\n\t\t[]byte(\"Peggy\"),\n\t\t[]byte(\"Queenie\"),\n\t}\n)\n\n// TestGCSFilterBuild builds a test filter with a randomized key. For Bitcoin\n// use, deterministic filter generation is desired. Therefore, a key that's\n// derived deterministically would be required.\nfunc TestGCSFilterBuild(t *testing.T) {\n\tfor i := 0; i < gcs.KeySize; i += 4 {\n\t\tbinary.BigEndian.PutUint32(key[i:], rand.Uint32())\n\t}\n\tfilter, err = gcs.BuildGCSFilter(P, M, key, contents)\n\tif err != nil {\n\t\tt.Fatalf(\"Filter build failed: %s\", err.Error())\n\t}\n}\n\n// TestGCSMatchZeroHash ensures that Match and MatchAny properly match an item\n// if it's hash after the reduction is zero. This is accomplished by brute\n// forcing a specific target whose hash is zero given a certain (P, M, key,\n// len(elements)) combination. In this case, P and M are the default, key was\n// chosen randomly, and len(elements) is 13. The target 4-byte value of 16060032\n// is the first such 32-bit value, thus we use the number 0-11 as the other\n// elements in the filter since we know they won't collide. We test both the\n// positive and negative cases, when the zero hash item is in the filter and\n// when it is excluded. In the negative case, the 32-bit value of 12 is added to\n// the filter instead of the target.\nfunc TestGCSMatchZeroHash(t *testing.T) {\n\tt.Run(\"include zero\", func(t *testing.T) {\n\t\ttestGCSMatchZeroHash(t, true)\n\t})\n\tt.Run(\"exclude zero\", func(t *testing.T) {\n\t\ttestGCSMatchZeroHash(t, false)\n\t})\n}\n\nfunc testGCSMatchZeroHash(t *testing.T, includeZeroHash bool) {\n\tkey := [gcs.KeySize]byte{\n\t\t0x25, 0x28, 0x0d, 0x25, 0x26, 0xe1, 0xd3, 0xc7,\n\t\t0xa5, 0x71, 0x85, 0x34, 0x92, 0xa5, 0x7e, 0x68,\n\t}\n\n\t// Construct the target data to match, whose hash is zero after applying\n\t// the reduction with the parameters in the test.\n\ttarget := make([]byte, 4)\n\tbinary.BigEndian.PutUint32(target, 16060032)\n\n\t// Construct the set of 13 items including the target, using the 32-bit\n\t// values of 0 through 11 as the first 12 items. We known none of these\n\t// hash to zero since the brute force ended well beyond them.\n\telements := make([][]byte, 0, 13)\n\tfor i := 0; i < 12; i++ {\n\t\tdata := make([]byte, 4)\n\t\tbinary.BigEndian.PutUint32(data, uint32(i))\n\t\telements = append(elements, data)\n\t}\n\n\t// If the filter should include the zero hash element, add the target\n\t// which we know hashes to zero. Otherwise add 32-bit value of 12 which\n\t// we know does not hash to zero.\n\tif includeZeroHash {\n\t\telements = append(elements, target)\n\t} else {\n\t\tdata := make([]byte, 4)\n\t\tbinary.BigEndian.PutUint32(data, 12)\n\t\telements = append(elements, data)\n\t}\n\n\tfilter, err := gcs.BuildGCSFilter(P, M, key, elements)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to build filter: %v\", err)\n\t}\n\n\tmatch, err := filter.Match(key, target)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to match: %v\", err)\n\t}\n\n\t// We should only get a match iff the target was included.\n\tif match != includeZeroHash {\n\t\tt.Fatalf(\"expected match from Match: %t, got %t\",\n\t\t\tincludeZeroHash, match)\n\t}\n\n\tmatch, err = filter.MatchAny(key, [][]byte{target})\n\tif err != nil {\n\t\tt.Fatalf(\"unable to match any: %v\", err)\n\t}\n\n\t// We should only get a match iff the target was included.\n\tif match != includeZeroHash {\n\t\tt.Fatalf(\"expected match from MatchAny: %t, got %t\",\n\t\t\tincludeZeroHash, match)\n\t}\n}\n\n// TestGCSFilterCopy deserializes and serializes a filter to create a copy.\nfunc TestGCSFilterCopy(t *testing.T) {\n\tserialized2, err := filter.Bytes()\n\tif err != nil {\n\t\tt.Fatalf(\"Filter Bytes() failed: %v\", err)\n\t}\n\tfilter2, err = gcs.FromBytes(filter.N(), P, M, serialized2)\n\tif err != nil {\n\t\tt.Fatalf(\"Filter copy failed: %s\", err.Error())\n\t}\n\tserialized3, err := filter.NBytes()\n\tif err != nil {\n\t\tt.Fatalf(\"Filter NBytes() failed: %v\", err)\n\t}\n\tfilter3, err = gcs.FromNBytes(filter.P(), M, serialized3)\n\tif err != nil {\n\t\tt.Fatalf(\"Filter copy failed: %s\", err.Error())\n\t}\n}\n\n// TestGCSFilterMetadata checks that the filter metadata is built and copied\n// correctly.\nfunc TestGCSFilterMetadata(t *testing.T) {\n\tif filter.P() != P {\n\t\tt.Fatal(\"P not correctly stored in filter metadata\")\n\t}\n\tif filter.N() != uint32(len(contents)) {\n\t\tt.Fatal(\"N not correctly stored in filter metadata\")\n\t}\n\tif filter.P() != filter2.P() {\n\t\tt.Fatal(\"P doesn't match between copied filters\")\n\t}\n\tif filter.P() != filter3.P() {\n\t\tt.Fatal(\"P doesn't match between copied filters\")\n\t}\n\tif filter.N() != filter2.N() {\n\t\tt.Fatal(\"N doesn't match between copied filters\")\n\t}\n\tif filter.N() != filter3.N() {\n\t\tt.Fatal(\"N doesn't match between copied filters\")\n\t}\n\tserialized, err := filter.Bytes()\n\tif err != nil {\n\t\tt.Fatalf(\"Filter Bytes() failed: %v\", err)\n\t}\n\tserialized2, err := filter2.Bytes()\n\tif err != nil {\n\t\tt.Fatalf(\"Filter Bytes() failed: %v\", err)\n\t}\n\tif !bytes.Equal(serialized, serialized2) {\n\t\tt.Fatal(\"Bytes don't match between copied filters\")\n\t}\n\tserialized3, err := filter3.Bytes()\n\tif err != nil {\n\t\tt.Fatalf(\"Filter Bytes() failed: %v\", err)\n\t}\n\tif !bytes.Equal(serialized, serialized3) {\n\t\tt.Fatal(\"Bytes don't match between copied filters\")\n\t}\n\tserialized4, err := filter3.Bytes()\n\tif err != nil {\n\t\tt.Fatalf(\"Filter Bytes() failed: %v\", err)\n\t}\n\tif !bytes.Equal(serialized, serialized4) {\n\t\tt.Fatal(\"Bytes don't match between copied filters\")\n\t}\n}\n\n// TestGCSFilterMatch checks that both the built and copied filters match\n// correctly, logging any false positives without failing on them.\nfunc TestGCSFilterMatch(t *testing.T) {\n\tmatch, err := filter.Match(key, []byte(\"Nate\"))\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match failed: %s\", err.Error())\n\t}\n\tif !match {\n\t\tt.Fatal(\"Filter didn't match when it should have!\")\n\t}\n\tmatch, err = filter2.Match(key, []byte(\"Nate\"))\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match failed: %s\", err.Error())\n\t}\n\tif !match {\n\t\tt.Fatal(\"Filter didn't match when it should have!\")\n\t}\n\tmatch, err = filter.Match(key, []byte(\"Quentin\"))\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match failed: %s\", err.Error())\n\t}\n\tif !match {\n\t\tt.Fatal(\"Filter didn't match when it should have!\")\n\t}\n\tmatch, err = filter2.Match(key, []byte(\"Quentin\"))\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match failed: %s\", err.Error())\n\t}\n\tif !match {\n\t\tt.Fatal(\"Filter didn't match when it should have!\")\n\t}\n\tmatch, err = filter.Match(key, []byte(\"Nates\"))\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match failed: %s\", err.Error())\n\t}\n\tif match {\n\t\tt.Logf(\"False positive match, should be 1 in 2**%d!\", P)\n\t}\n\tmatch, err = filter2.Match(key, []byte(\"Nates\"))\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match failed: %s\", err.Error())\n\t}\n\tif match {\n\t\tt.Logf(\"False positive match, should be 1 in 2**%d!\", P)\n\t}\n\tmatch, err = filter.Match(key, []byte(\"Quentins\"))\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match failed: %s\", err.Error())\n\t}\n\tif match {\n\t\tt.Logf(\"False positive match, should be 1 in 2**%d!\", P)\n\t}\n\tmatch, err = filter2.Match(key, []byte(\"Quentins\"))\n\tif err != nil {\n\t\tt.Fatalf(\"Filter match failed: %s\", err.Error())\n\t}\n\tif match {\n\t\tt.Logf(\"False positive match, should be 1 in 2**%d!\", P)\n\t}\n}\n\n// AnyMatcher is the function signature of our matching algorithms.\ntype AnyMatcher func(key [gcs.KeySize]byte, data [][]byte) (bool, error)\n\n// TestGCSFilterMatchAnySuite checks that all of our matching algorithms\n// properly match a list correctly when using built or copied filters, logging\n// any false positives without failing on them.\nfunc TestGCSFilterMatchAnySuite(t *testing.T) {\n\tfuncs := []struct {\n\t\tname     string\n\t\tmatchAny func(*gcs.Filter) AnyMatcher\n\t}{\n\t\t{\n\t\t\t\"default\",\n\t\t\tfunc(f *gcs.Filter) AnyMatcher {\n\t\t\t\treturn f.MatchAny\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"hash\",\n\t\t\tfunc(f *gcs.Filter) AnyMatcher {\n\t\t\t\treturn f.HashMatchAny\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"zip\",\n\t\t\tfunc(f *gcs.Filter) AnyMatcher {\n\t\t\t\treturn f.ZipMatchAny\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range funcs {\n\t\ttest := test\n\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tcontentsCopy := make([][]byte, len(contents2))\n\t\t\tcopy(contentsCopy, contents2)\n\n\t\t\tmatch, err := test.matchAny(filter)(key, contentsCopy)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Filter match any failed: %s\", err.Error())\n\t\t\t}\n\t\t\tif match {\n\t\t\t\tt.Logf(\"False positive match, should be 1 in 2**%d!\", P)\n\t\t\t}\n\t\t\tmatch, err = test.matchAny(filter2)(key, contentsCopy)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Filter match any failed: %s\", err.Error())\n\t\t\t}\n\t\t\tif match {\n\t\t\t\tt.Logf(\"False positive match, should be 1 in 2**%d!\", P)\n\t\t\t}\n\t\t\tcontentsCopy = append(contentsCopy, []byte(\"Nate\"))\n\t\t\tmatch, err = test.matchAny(filter)(key, contentsCopy)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Filter match any failed: %s\", err.Error())\n\t\t\t}\n\t\t\tif !match {\n\t\t\t\tt.Fatal(\"Filter didn't match any when it should have!\")\n\t\t\t}\n\t\t\tmatch, err = test.matchAny(filter2)(key, contentsCopy)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Filter match any failed: %s\", err.Error())\n\t\t\t}\n\t\t\tif !match {\n\t\t\t\tt.Fatal(\"Filter didn't match any when it should have!\")\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "btcutil/gcs/gcsbench_test.go",
    "content": "// Copyright (c) 2016-2017 The btcsuite developers\n// Copyright (c) 2016-2017 The Lightning Network Developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage gcs_test\n\nimport (\n\t\"encoding/binary\"\n\t\"math/rand\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil/gcs\"\n)\n\nfunc genRandFilterElements(numElements uint) ([][]byte, error) {\n\ttestContents := make([][]byte, numElements)\n\tfor i := range testContents {\n\t\trandElem := make([]byte, 32)\n\t\tif _, err := rand.Read(randElem); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttestContents[i] = randElem\n\t}\n\n\treturn testContents, nil\n}\n\nvar (\n\tgeneratedFilter *gcs.Filter\n)\n\n// BenchmarkGCSFilterBuild benchmarks building a filter.\nfunc BenchmarkGCSFilterBuild50000(b *testing.B) {\n\tvar testKey [gcs.KeySize]byte\n\tfor i := 0; i < gcs.KeySize; i += 4 {\n\t\tbinary.BigEndian.PutUint32(testKey[i:], rand.Uint32())\n\t}\n\n\trandFilterElems, genErr := genRandFilterElements(50000)\n\tif err != nil {\n\t\tb.Fatalf(\"unable to generate random item: %v\", genErr)\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\n\tvar localFilter *gcs.Filter\n\tfor i := 0; i < b.N; i++ {\n\t\tlocalFilter, err = gcs.BuildGCSFilter(\n\t\t\tP, M, key, randFilterElems,\n\t\t)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unable to generate filter: %v\", err)\n\t\t}\n\t}\n\tgeneratedFilter = localFilter\n}\n\n// BenchmarkGCSFilterBuild benchmarks building a filter.\nfunc BenchmarkGCSFilterBuild100000(b *testing.B) {\n\tvar testKey [gcs.KeySize]byte\n\tfor i := 0; i < gcs.KeySize; i += 4 {\n\t\tbinary.BigEndian.PutUint32(testKey[i:], rand.Uint32())\n\t}\n\n\trandFilterElems, genErr := genRandFilterElements(100000)\n\tif err != nil {\n\t\tb.Fatalf(\"unable to generate random item: %v\", genErr)\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\n\tvar localFilter *gcs.Filter\n\tfor i := 0; i < b.N; i++ {\n\t\tlocalFilter, err = gcs.BuildGCSFilter(\n\t\t\tP, M, key, randFilterElems,\n\t\t)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unable to generate filter: %v\", err)\n\t\t}\n\t}\n\tgeneratedFilter = localFilter\n}\n\nvar (\n\tmatch bool\n)\n\n// BenchmarkGCSFilterMatch benchmarks querying a filter for a single value.\nfunc BenchmarkGCSFilterMatch(b *testing.B) {\n\tfilter, err := gcs.BuildGCSFilter(P, M, key, contents)\n\tif err != nil {\n\t\tb.Fatalf(\"Failed to build filter\")\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\n\tvar localMatch bool\n\tfor i := 0; i < b.N; i++ {\n\t\t_, err = filter.Match(key, []byte(\"Nate\"))\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unable to match filter: %v\", err)\n\t\t}\n\n\t\tlocalMatch, err = filter.Match(key, []byte(\"Nates\"))\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unable to match filter: %v\", err)\n\t\t}\n\t}\n\tmatch = localMatch\n}\n\nvar (\n\trandElems100, _      = genRandFilterElements(100)\n\trandElems1000, _     = genRandFilterElements(1000)\n\trandElems10000, _    = genRandFilterElements(10000)\n\trandElems100000, _   = genRandFilterElements(100000)\n\trandElems1000000, _  = genRandFilterElements(1000000)\n\trandElems10000000, _ = genRandFilterElements(10000000)\n\n\tfilterElems1000, _  = genRandFilterElements(1000)\n\tfilter1000, _       = gcs.BuildGCSFilter(P, M, key, filterElems1000)\n\tfilterElems5000, _  = genRandFilterElements(5000)\n\tfilter5000, _       = gcs.BuildGCSFilter(P, M, key, filterElems5000)\n\tfilterElems10000, _ = genRandFilterElements(10000)\n\tfilter10000, _      = gcs.BuildGCSFilter(P, M, key, filterElems10000)\n)\n\n// matchAnyBenchmarks contains combinations of random filters and queries used\n// to measure performance of various MatchAny implementations.\nvar matchAnyBenchmarks = []struct {\n\tname   string\n\tquery  [][]byte\n\tfilter *gcs.Filter\n}{\n\t{\"q100-f1K\", randElems100, filter1000},\n\t{\"q1K-f1K\", randElems1000, filter1000},\n\t{\"q10K-f1K\", randElems10000, filter1000},\n\t{\"q100K-f1K\", randElems100000, filter1000},\n\t{\"q1M-f1K\", randElems1000000, filter1000},\n\t{\"q10M-f1K\", randElems10000000, filter1000},\n\n\t{\"q100-f5K\", randElems100, filter5000},\n\t{\"q1K-f5K\", randElems1000, filter5000},\n\t{\"q10K-f5K\", randElems10000, filter5000},\n\t{\"q100K-f5K\", randElems100000, filter5000},\n\t{\"q1M-f5K\", randElems1000000, filter5000},\n\t{\"q10M-f5K\", randElems10000000, filter5000},\n\n\t{\"q100-f10K\", randElems100, filter10000},\n\t{\"q1K-f10K\", randElems1000, filter10000},\n\t{\"q10K-f10K\", randElems10000, filter10000},\n\t{\"q100K-f10K\", randElems100000, filter10000},\n\t{\"q1M-f10K\", randElems1000000, filter10000},\n\t{\"q10M-f10K\", randElems10000000, filter10000},\n}\n\n// BenchmarkGCSFilterZipMatchAny benchmarks the sort-and-zip MatchAny impl.\nfunc BenchmarkGCSFilterZipMatchAny(b *testing.B) {\n\tfor _, test := range matchAnyBenchmarks {\n\t\ttest := test\n\n\t\tb.Run(test.name, func(b *testing.B) {\n\t\t\tb.ReportAllocs()\n\n\t\t\tvar (\n\t\t\t\tlocalMatch bool\n\t\t\t\terr        error\n\t\t\t)\n\n\t\t\tfor i := 0; i < b.N; i++ {\n\t\t\t\tlocalMatch, err = test.filter.ZipMatchAny(\n\t\t\t\t\tkey, test.query,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tb.Fatalf(\"unable to match filter: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tmatch = localMatch\n\t\t})\n\t}\n}\n\n// BenchmarkGCSFilterHashMatchAny benchmarks the hash-join MatchAny impl.\nfunc BenchmarkGCSFilterHashMatchAny(b *testing.B) {\n\tfor _, test := range matchAnyBenchmarks {\n\t\ttest := test\n\n\t\tb.Run(test.name, func(b *testing.B) {\n\t\t\tb.ReportAllocs()\n\n\t\t\tvar (\n\t\t\t\tlocalMatch bool\n\t\t\t\terr        error\n\t\t\t)\n\n\t\t\tfor i := 0; i < b.N; i++ {\n\t\t\t\tlocalMatch, err = test.filter.HashMatchAny(\n\t\t\t\t\tkey, test.query,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tb.Fatalf(\"unable to match filter: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tmatch = localMatch\n\t\t})\n\t}\n}\n\n// BenchmarkGCSFilterMatchAny benchmarks the hybrid MatchAny impl.\nfunc BenchmarkGCSFilterMatchAny(b *testing.B) {\n\tfor _, test := range matchAnyBenchmarks {\n\t\ttest := test\n\n\t\tb.Run(test.name, func(b *testing.B) {\n\t\t\tb.ReportAllocs()\n\n\t\t\tvar (\n\t\t\t\tlocalMatch bool\n\t\t\t\terr        error\n\t\t\t)\n\n\t\t\tfor i := 0; i < b.N; i++ {\n\t\t\t\tlocalMatch, err = test.filter.MatchAny(\n\t\t\t\t\tkey, test.query,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tb.Fatalf(\"unable to match filter: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tmatch = localMatch\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "btcutil/go.mod",
    "content": "module github.com/btcsuite/btcd/btcutil\n\ngo 1.22\n\nrequire (\n\tgithub.com/aead/siphash v1.0.1\n\tgithub.com/btcsuite/btcd v0.24.2\n\tgithub.com/btcsuite/btcd/btcec/v2 v2.1.3\n\tgithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0\n\tgithub.com/davecgh/go-spew v1.1.1\n\tgithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1\n\tgithub.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23\n\tgolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9\n)\n\nrequire (\n\tgithub.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect\n\tgithub.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect\n\tgolang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed // indirect\n)\n"
  },
  {
    "path": "btcutil/go.sum",
    "content": "github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg=\ngithub.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=\ngithub.com/btcsuite/btcd v0.24.2 h1:aLmxPguqxza+4ag8R1I2nnJjSu2iFn/kqtHTIImswcY=\ngithub.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg=\ngithub.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE=\ngithub.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=\ngithub.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=\ngithub.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=\ngithub.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=\ngithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=\ngithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=\ngithub.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=\ngithub.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE=\ngithub.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=\ngithub.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed h1:J22ig1FUekjjkmZUM7pTKixYm8DvrYsvrBZdunYeIuQ=\ngolang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "btcutil/hash160.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"crypto/sha256\"\n\t\"hash\"\n\n\t\"golang.org/x/crypto/ripemd160\"\n)\n\n// Calculate the hash of hasher over buf.\nfunc calcHash(buf []byte, hasher hash.Hash) []byte {\n\t_, _ = hasher.Write(buf)\n\treturn hasher.Sum(nil)\n}\n\n// Hash160 calculates the hash ripemd160(sha256(b)).\nfunc Hash160(buf []byte) []byte {\n\treturn calcHash(calcHash(buf, sha256.New()), ripemd160.New())\n}\n"
  },
  {
    "path": "btcutil/hdkeychain/README.md",
    "content": "hdkeychain\n==========\n\n[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](http://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/btcutil/hdkeychain)\n\nPackage hdkeychain provides an API for bitcoin hierarchical deterministic\nextended keys (BIP0032).\n\nA comprehensive suite of tests is provided to ensure proper functionality.  See\n`test_coverage.txt` for the gocov coverage report.  Alternatively, if you are\nrunning a POSIX OS, you can run the `cov_report.sh` script for a real-time\nreport.\n\n## Feature Overview\n\n- Full BIP0032 implementation\n- Single type for private and public extended keys\n- Convenient cryptographically secure seed generation\n- Simple creation of master nodes\n- Support for multi-layer derivation\n- Easy serialization and deserialization for both private and public extended\n  keys\n- Support for custom networks by registering them with chaincfg\n- Obtaining the underlying EC pubkeys, EC privkeys, and associated bitcoin\n  addresses ties in seamlessly with existing btcec and btcutil types which\n  provide powerful tools for working with them to do things like sign\n  transactions and generate payment scripts\n- Uses the btcec package which is highly optimized for secp256k1\n- Code examples including:\n  - Generating a cryptographically secure random seed and deriving a\n    master node from it\n  - Default HD wallet layout as described by BIP0032\n  - Audits use case as described by BIP0032\n- Comprehensive test coverage including the BIP0032 test vectors\n- Benchmarks\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/btcutil/hdkeychain\n```\n\n## Examples\n\n* [NewMaster Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/hdkeychain#example-NewMaster)  \n  Demonstrates how to generate a cryptographically random seed then use it to\n  create a new master node (extended key).\n* [Default Wallet Layout Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/hdkeychain#example-package--DefaultWalletLayout)  \n  Demonstrates the default hierarchical deterministic wallet layout as described\n  in BIP0032.\n* [Audits Use Case Example](http://godoc.org/github.com/btcsuite/btcd/btcutil/hdkeychain#example-package--Audits)  \n  Demonstrates the audits use case in BIP0032.\n\n## License\n\nPackage hdkeychain is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "btcutil/hdkeychain/bench_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage hdkeychain_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil/hdkeychain\"\n)\n\n// bip0032MasterPriv1 is the master private extended key from the first set of\n// test vectors in BIP0032.\nconst bip0032MasterPriv1 = \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbP\" +\n\t\"y6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\"\n\n// BenchmarkDeriveHardened benchmarks how long it takes to derive a hardened\n// child from a master private extended key.\nfunc BenchmarkDeriveHardened(b *testing.B) {\n\tb.StopTimer()\n\tmasterKey, err := hdkeychain.NewKeyFromString(bip0032MasterPriv1)\n\tif err != nil {\n\t\tb.Errorf(\"Failed to decode master seed: %v\", err)\n\t}\n\tb.StartTimer()\n\n\tfor i := 0; i < b.N; i++ {\n\t\t_, _ = masterKey.Derive(hdkeychain.HardenedKeyStart)\n\t}\n}\n\n// BenchmarkDeriveNormal benchmarks how long it takes to derive a normal\n// (non-hardened) child from a master private extended key.\nfunc BenchmarkDeriveNormal(b *testing.B) {\n\tb.StopTimer()\n\tmasterKey, err := hdkeychain.NewKeyFromString(bip0032MasterPriv1)\n\tif err != nil {\n\t\tb.Errorf(\"Failed to decode master seed: %v\", err)\n\t}\n\tb.StartTimer()\n\n\tfor i := 0; i < b.N; i++ {\n\t\t_, _ = masterKey.Derive(0)\n\t}\n}\n\n// BenchmarkPrivToPub benchmarks how long it takes to convert a private extended\n// key to a public extended key.\nfunc BenchmarkPrivToPub(b *testing.B) {\n\tb.StopTimer()\n\tmasterKey, err := hdkeychain.NewKeyFromString(bip0032MasterPriv1)\n\tif err != nil {\n\t\tb.Errorf(\"Failed to decode master seed: %v\", err)\n\t}\n\tb.StartTimer()\n\n\tfor i := 0; i < b.N; i++ {\n\t\t_, _ = masterKey.Neuter()\n\t}\n}\n\n// BenchmarkDeserialize benchmarks how long it takes to deserialize a private\n// extended key.\nfunc BenchmarkDeserialize(b *testing.B) {\n\tfor i := 0; i < b.N; i++ {\n\t\t_, _ = hdkeychain.NewKeyFromString(bip0032MasterPriv1)\n\t}\n}\n\n// BenchmarkSerialize benchmarks how long it takes to serialize a private\n// extended key.\nfunc BenchmarkSerialize(b *testing.B) {\n\tb.StopTimer()\n\tmasterKey, err := hdkeychain.NewKeyFromString(bip0032MasterPriv1)\n\tif err != nil {\n\t\tb.Errorf(\"Failed to decode master seed: %v\", err)\n\t}\n\tb.StartTimer()\n\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = masterKey.String()\n\t}\n}\n"
  },
  {
    "path": "btcutil/hdkeychain/cov_report.sh",
    "content": "#!/bin/sh\n\n# This script uses the standard Go test coverage tools to generate a test coverage report.\n\n# Run tests with coverage enabled and generate coverage profile.\ngo test -cover -coverprofile=coverage.txt ./...\n\n# Display function-level coverage statistics.\ngo tool cover -func=coverage.txt\n"
  },
  {
    "path": "btcutil/hdkeychain/doc.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage hdkeychain provides an API for bitcoin hierarchical deterministic\nextended keys (BIP0032).\n\n# Overview\n\nThe ability to implement hierarchical deterministic wallets depends on the\nability to create and derive hierarchical deterministic extended keys.\n\nAt a high level, this package provides support for those hierarchical\ndeterministic extended keys by providing an ExtendedKey type and supporting\nfunctions.  Each extended key can either be a private or public extended key\nwhich itself is capable of deriving a child extended key.\n\n# Determining the Extended Key Type\n\nWhether an extended key is a private or public extended key can be determined\nwith the IsPrivate function.\n\n# Transaction Signing Keys and Payment Addresses\n\nIn order to create and sign transactions, or provide others with addresses to\nsend funds to, the underlying key and address material must be accessible.  This\npackage provides the ECPubKey, ECPrivKey, and Address functions for this\npurpose.\n\n# The Master Node\n\nAs previously mentioned, the extended keys are hierarchical meaning they are\nused to form a tree.  The root of that tree is called the master node and this\npackage provides the NewMaster function to create it from a cryptographically\nrandom seed.  The GenerateSeed function is provided as a convenient way to\ncreate a random seed for use with the NewMaster function.\n\n# Deriving Children\n\nOnce you have created a tree root (or have deserialized an extended key as\ndiscussed later), the child extended keys can be derived by using the Derive\nfunction.  The Derive function supports deriving both normal (non-hardened) and\nhardened child extended keys.  In order to derive a hardened extended key, use\nthe HardenedKeyStart constant + the hardened key number as the index to the\nDerive function.  This provides the ability to cascade the keys into a tree and\nhence generate the hierarchical deterministic key chains.\n\n# Normal vs Hardened Derived Extended Keys\n\nA private extended key can be used to derive both hardened and non-hardened\n(normal) child private and public extended keys.  A public extended key can only\nbe used to derive non-hardened child public extended keys.  As enumerated in\nBIP0032 \"knowledge of the extended public key plus any non-hardened private key\ndescending from it is equivalent to knowing the extended private key (and thus\nevery private and public key descending from it).  This means that extended\npublic keys must be treated more carefully than regular public keys. It is also\nthe reason for the existence of hardened keys, and why they are used for the\naccount level in the tree. This way, a leak of an account-specific (or below)\nprivate key never risks compromising the master or other accounts.\"\n\n# Neutering a Private Extended Key\n\nA private extended key can be converted to a new instance of the corresponding\npublic extended key with the Neuter function.  The original extended key is not\nmodified.  A public extended key is still capable of deriving non-hardened child\npublic extended keys.\n\n# Serializing and Deserializing Extended Keys\n\nExtended keys are serialized and deserialized with the String and\nNewKeyFromString functions.  The serialized key is a Base58-encoded string which\nlooks like the following:\n\n\tpublic key:   xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw\n\tprivate key:  xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7\n\n# Network\n\nExtended keys are much like normal Bitcoin addresses in that they have version\nbytes which tie them to a specific network.  The SetNet and IsForNet functions\nare provided to set and determinine which network an extended key is associated\nwith.\n*/\npackage hdkeychain\n"
  },
  {
    "path": "btcutil/hdkeychain/example_test.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage hdkeychain_test\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcutil/hdkeychain\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n)\n\n// This example demonstrates how to generate a cryptographically random seed\n// then use it to create a new master node (extended key).\nfunc ExampleNewMaster() {\n\t// Generate a random seed at the recommended length.\n\tseed, err := hdkeychain.GenerateSeed(hdkeychain.RecommendedSeedLen)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Generate a new master node using the seed.\n\tkey, err := hdkeychain.NewMaster(seed, &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Show that the generated master node extended key is private.\n\tfmt.Println(\"Private Extended Key?:\", key.IsPrivate())\n\n\t// Output:\n\t// Private Extended Key?: true\n}\n\n// This example demonstrates the default hierarchical deterministic wallet\n// layout as described in BIP0032.\nfunc Example_defaultWalletLayout() {\n\t// The default wallet layout described in BIP0032 is:\n\t//\n\t// Each account is composed of two keypair chains: an internal and an\n\t// external one. The external keychain is used to generate new public\n\t// addresses, while the internal keychain is used for all other\n\t// operations (change addresses, generation addresses, ..., anything\n\t// that doesn't need to be communicated).\n\t//\n\t//   * m/iH/0/k\n\t//     corresponds to the k'th keypair of the external chain of account\n\t//     number i of the HDW derived from master m.\n\t//   * m/iH/1/k\n\t//     corresponds to the k'th keypair of the internal chain of account\n\t//     number i of the HDW derived from master m.\n\n\t// Ordinarily this would either be read from some encrypted source\n\t// and be decrypted or generated as the NewMaster example shows, but\n\t// for the purposes of this example, the private extended key for the\n\t// master node is being hard coded here.\n\tmaster := \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jP\" +\n\t\t\"PqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\"\n\n\t// Start by getting an extended key instance for the master node.\n\t// This gives the path:\n\t//   m\n\tmasterKey, err := hdkeychain.NewKeyFromString(master)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Derive the extended key for account 0.  This gives the path:\n\t//   m/0H\n\tacct0, err := masterKey.Derive(hdkeychain.HardenedKeyStart + 0)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Derive the extended key for the account 0 external chain.  This\n\t// gives the path:\n\t//   m/0H/0\n\tacct0Ext, err := acct0.Derive(0)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Derive the extended key for the account 0 internal chain.  This gives\n\t// the path:\n\t//   m/0H/1\n\tacct0Int, err := acct0.Derive(1)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// At this point, acct0Ext and acct0Int are ready to derive the keys for\n\t// the external and internal wallet chains.\n\n\t// Derive the 10th extended key for the account 0 external chain.  This\n\t// gives the path:\n\t//   m/0H/0/10\n\tacct0Ext10, err := acct0Ext.Derive(10)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Derive the 1st extended key for the account 0 internal chain.  This\n\t// gives the path:\n\t//   m/0H/1/0\n\tacct0Int0, err := acct0Int.Derive(0)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Get and show the address associated with the extended keys for the\n\t// main bitcoin\tnetwork.\n\tacct0ExtAddr, err := acct0Ext10.Address(&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tacct0IntAddr, err := acct0Int0.Address(&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Println(\"Account 0 External Address 10:\", acct0ExtAddr)\n\tfmt.Println(\"Account 0 Internal Address 0:\", acct0IntAddr)\n\n\t// Output:\n\t// Account 0 External Address 10: 1HVccubUT8iKTapMJ5AnNA4sLRN27xzQ4F\n\t// Account 0 Internal Address 0: 1J5rebbkQaunJTUoNVREDbeB49DqMNFFXk\n}\n\n// This example demonstrates the audits use case in BIP0032.\nfunc Example_audits() {\n\t// The audits use case described in BIP0032 is:\n\t//\n\t// In case an auditor needs full access to the list of incoming and\n\t// outgoing payments, one can share all account public extended keys.\n\t// This will allow the auditor to see all transactions from and to the\n\t// wallet, in all accounts, but not a single secret key.\n\t//\n\t//   * N(m/*)\n\t//   corresponds to the neutered master extended key (also called\n\t//   the master public extended key)\n\n\t// Ordinarily this would either be read from some encrypted source\n\t// and be decrypted or generated as the NewMaster example shows, but\n\t// for the purposes of this example, the private extended key for the\n\t// master node is being hard coded here.\n\tmaster := \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jP\" +\n\t\t\"PqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\"\n\n\t// Start by getting an extended key instance for the master node.\n\t// This gives the path:\n\t//   m\n\tmasterKey, err := hdkeychain.NewKeyFromString(master)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Neuter the master key to generate a master public extended key.  This\n\t// gives the path:\n\t//   N(m/*)\n\tmasterPubKey, err := masterKey.Neuter()\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Share the master public extended key with the auditor.\n\tfmt.Println(\"Audit key N(m/*):\", masterPubKey)\n\n\t// Output:\n\t// Audit key N(m/*): xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\n}\n"
  },
  {
    "path": "btcutil/hdkeychain/extendedkey.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage hdkeychain\n\n// References:\n//   [BIP32]: BIP0032 - Hierarchical Deterministic Wallets\n//   https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\n\nimport (\n\t\"bytes\"\n\t\"crypto/hmac\"\n\t\"crypto/rand\"\n\t\"crypto/sha512\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/btcutil/base58\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nconst (\n\t// RecommendedSeedLen is the recommended length in bytes for a seed\n\t// to a master node.\n\tRecommendedSeedLen = 32 // 256 bits\n\n\t// HardenedKeyStart is the index at which a hardened key starts.  Each\n\t// extended key has 2^31 normal child keys and 2^31 hardened child keys.\n\t// Thus the range for normal child keys is [0, 2^31 - 1] and the range\n\t// for hardened child keys is [2^31, 2^32 - 1].\n\tHardenedKeyStart = 0x80000000 // 2^31\n\n\t// MinSeedBytes is the minimum number of bytes allowed for a seed to\n\t// a master node.\n\tMinSeedBytes = 16 // 128 bits\n\n\t// MaxSeedBytes is the maximum number of bytes allowed for a seed to\n\t// a master node.\n\tMaxSeedBytes = 64 // 512 bits\n\n\t// serializedKeyLen is the length of a serialized public or private\n\t// extended key.  It consists of 4 bytes version, 1 byte depth, 4 bytes\n\t// fingerprint, 4 bytes child number, 32 bytes chain code, and 33 bytes\n\t// public/private key data.\n\tserializedKeyLen = 4 + 1 + 4 + 4 + 32 + 33 // 78 bytes\n\n\t// maxUint8 is the max positive integer which can be serialized in a uint8\n\tmaxUint8 = 1<<8 - 1\n)\n\nvar (\n\t// ErrDeriveHardFromPublic describes an error in which the caller\n\t// attempted to derive a hardened extended key from a public key.\n\tErrDeriveHardFromPublic = errors.New(\"cannot derive a hardened key \" +\n\t\t\"from a public key\")\n\n\t// ErrDeriveBeyondMaxDepth describes an error in which the caller\n\t// has attempted to derive more than 255 keys from a root key.\n\tErrDeriveBeyondMaxDepth = errors.New(\"cannot derive a key with more than \" +\n\t\t\"255 indices in its path\")\n\n\t// ErrNotPrivExtKey describes an error in which the caller attempted\n\t// to extract a private key from a public extended key.\n\tErrNotPrivExtKey = errors.New(\"unable to create private keys from a \" +\n\t\t\"public extended key\")\n\n\t// ErrInvalidChild describes an error in which the child at a specific\n\t// index is invalid due to the derived key falling outside of the valid\n\t// range for secp256k1 private keys.  This error indicates the caller\n\t// should simply ignore the invalid child extended key at this index and\n\t// increment to the next index.\n\tErrInvalidChild = errors.New(\"the extended key at this index is invalid\")\n\n\t// ErrUnusableSeed describes an error in which the provided seed is not\n\t// usable due to the derived key falling outside of the valid range for\n\t// secp256k1 private keys.  This error indicates the caller must choose\n\t// another seed.\n\tErrUnusableSeed = errors.New(\"unusable seed\")\n\n\t// ErrInvalidSeedLen describes an error in which the provided seed or\n\t// seed length is not in the allowed range.\n\tErrInvalidSeedLen = fmt.Errorf(\"seed length must be between %d and %d \"+\n\t\t\"bits\", MinSeedBytes*8, MaxSeedBytes*8)\n\n\t// ErrBadChecksum describes an error in which the checksum encoded with\n\t// a serialized extended key does not match the calculated value.\n\tErrBadChecksum = errors.New(\"bad extended key checksum\")\n\n\t// ErrInvalidKeyLen describes an error in which the provided serialized\n\t// key is not the expected length.\n\tErrInvalidKeyLen = errors.New(\"the provided serialized extended key \" +\n\t\t\"length is invalid\")\n)\n\n// masterKey is the master key used along with a random seed used to generate\n// the master node in the hierarchical tree.\nvar masterKey = []byte(\"Bitcoin seed\")\n\n// ExtendedKey houses all the information needed to support a hierarchical\n// deterministic extended key.  See the package overview documentation for\n// more details on how to use extended keys.\ntype ExtendedKey struct {\n\tkey       []byte // This will be the pubkey for extended pub keys\n\tpubKey    []byte // This will only be set for extended priv keys\n\tchainCode []byte\n\tdepth     uint8\n\tparentFP  []byte\n\tchildNum  uint32\n\tversion   []byte\n\tisPrivate bool\n}\n\n// NewExtendedKey returns a new instance of an extended key with the given\n// fields.  No error checking is performed here as it's only intended to be a\n// convenience method used to create a populated struct. This function should\n// only be used by applications that need to create custom ExtendedKeys. All\n// other applications should just use NewMaster, Derive, or Neuter.\nfunc NewExtendedKey(version, key, chainCode, parentFP []byte, depth uint8,\n\tchildNum uint32, isPrivate bool) *ExtendedKey {\n\n\t// NOTE: The pubKey field is intentionally left nil so it is only\n\t// computed and memoized as required.\n\treturn &ExtendedKey{\n\t\tkey:       key,\n\t\tchainCode: chainCode,\n\t\tdepth:     depth,\n\t\tparentFP:  parentFP,\n\t\tchildNum:  childNum,\n\t\tversion:   version,\n\t\tisPrivate: isPrivate,\n\t}\n}\n\n// pubKeyBytes returns bytes for the serialized compressed public key associated\n// with this extended key in an efficient manner including memoization as\n// necessary.\n//\n// When the extended key is already a public key, the key is simply returned as\n// is since it's already in the correct form.  However, when the extended key is\n// a private key, the public key will be calculated and memoized so future\n// accesses can simply return the cached result.\nfunc (k *ExtendedKey) pubKeyBytes() []byte {\n\t// Just return the key if it's already an extended public key.\n\tif !k.isPrivate {\n\t\treturn k.key\n\t}\n\n\t// This is a private extended key, so calculate and memoize the public\n\t// key if needed.\n\tif len(k.pubKey) == 0 {\n\t\t_, pubKey := btcec.PrivKeyFromBytes(k.key)\n\t\tk.pubKey = pubKey.SerializeCompressed()\n\t}\n\n\treturn k.pubKey\n}\n\n// IsPrivate returns whether or not the extended key is a private extended key.\n//\n// A private extended key can be used to derive both hardened and non-hardened\n// child private and public extended keys.  A public extended key can only be\n// used to derive non-hardened child public extended keys.\nfunc (k *ExtendedKey) IsPrivate() bool {\n\treturn k.isPrivate\n}\n\n// Depth returns the current derivation level with respect to the root.\n//\n// The root key has depth zero, and the field has a maximum of 255 due to\n// how depth is serialized.\nfunc (k *ExtendedKey) Depth() uint8 {\n\treturn k.depth\n}\n\n// Version returns the extended key's hardened derivation version. This can be\n// used to identify the extended key's type.\nfunc (k *ExtendedKey) Version() []byte {\n\treturn k.version\n}\n\n// ParentFingerprint returns a fingerprint of the parent extended key from which\n// this one was derived.\nfunc (k *ExtendedKey) ParentFingerprint() uint32 {\n\treturn binary.BigEndian.Uint32(k.parentFP)\n}\n\n// ChainCode returns the chain code part of this extended key.\n//\n// It is identical for both public and private extended keys.\nfunc (k *ExtendedKey) ChainCode() []byte {\n\treturn append([]byte{}, k.chainCode...)\n}\n\n// Derive returns a derived child extended key at the given index.\n//\n// IMPORTANT: if you were previously using the Child method, this method is incompatible.\n// The Child method had a BIP-32 standard compatibility issue.  You have to check whether\n// any hardened derivations in your derivation path are affected by this issue, via the\n// IsAffectedByIssue172 method and migrate the wallet if so.  This method does conform\n// to the standard.  If you need the old behavior, use DeriveNonStandard.\n//\n// When this extended key is a private extended key (as determined by the IsPrivate\n// function), a private extended key will be derived.  Otherwise, the derived\n// extended key will be also be a public extended key.\n//\n// When the index is greater to or equal than the HardenedKeyStart constant, the\n// derived extended key will be a hardened extended key.  It is only possible to\n// derive a hardened extended key from a private extended key.  Consequently,\n// this function will return ErrDeriveHardFromPublic if a hardened child\n// extended key is requested from a public extended key.\n//\n// A hardened extended key is useful since, as previously mentioned, it requires\n// a parent private extended key to derive.  In other words, normal child\n// extended public keys can be derived from a parent public extended key (no\n// knowledge of the parent private key) whereas hardened extended keys may not\n// be.\n//\n// NOTE: There is an extremely small chance (< 1 in 2^127) the specific child\n// index does not derive to a usable child.  The ErrInvalidChild error will be\n// returned if this should occur, and the caller is expected to ignore the\n// invalid child and simply increment to the next index.\nfunc (k *ExtendedKey) Derive(i uint32) (*ExtendedKey, error) {\n\t// Prevent derivation of children beyond the max allowed depth.\n\tif k.depth == maxUint8 {\n\t\treturn nil, ErrDeriveBeyondMaxDepth\n\t}\n\n\t// There are four scenarios that could happen here:\n\t// 1) Private extended key -> Hardened child private extended key\n\t// 2) Private extended key -> Non-hardened child private extended key\n\t// 3) Public extended key -> Non-hardened child public extended key\n\t// 4) Public extended key -> Hardened child public extended key (INVALID!)\n\n\t// Case #4 is invalid, so error out early.\n\t// A hardened child extended key may not be created from a public\n\t// extended key.\n\tisChildHardened := i >= HardenedKeyStart\n\tif !k.isPrivate && isChildHardened {\n\t\treturn nil, ErrDeriveHardFromPublic\n\t}\n\n\t// The data used to derive the child key depends on whether or not the\n\t// child is hardened per [BIP32].\n\t//\n\t// For hardened children:\n\t//   0x00 || ser256(parentKey) || ser32(i)\n\t//\n\t// For normal children:\n\t//   serP(parentPubKey) || ser32(i)\n\tkeyLen := 33\n\tdata := make([]byte, keyLen+4)\n\tif isChildHardened {\n\t\t// Case #1.\n\t\t// When the child is a hardened child, the key is known to be a\n\t\t// private key due to the above early return.  Pad it with a\n\t\t// leading zero as required by [BIP32] for deriving the child.\n\t\t// Additionally, right align it if it's shorter than 32 bytes.\n\t\toffset := 33 - len(k.key)\n\t\tcopy(data[offset:], k.key)\n\t} else {\n\t\t// Case #2 or #3.\n\t\t// This is either a public or private extended key, but in\n\t\t// either case, the data which is used to derive the child key\n\t\t// starts with the secp256k1 compressed public key bytes.\n\t\tcopy(data, k.pubKeyBytes())\n\t}\n\tbinary.BigEndian.PutUint32(data[keyLen:], i)\n\n\t// Take the HMAC-SHA512 of the current key's chain code and the derived\n\t// data:\n\t//   I = HMAC-SHA512(Key = chainCode, Data = data)\n\thmac512 := hmac.New(sha512.New, k.chainCode)\n\t_, _ = hmac512.Write(data)\n\tilr := hmac512.Sum(nil)\n\n\t// Split \"I\" into two 32-byte sequences Il and Ir where:\n\t//   Il = intermediate key used to derive the child\n\t//   Ir = child chain code\n\til := ilr[:len(ilr)/2]\n\tchildChainCode := ilr[len(ilr)/2:]\n\n\t// Both derived public or private keys rely on treating the left 32-byte\n\t// sequence calculated above (Il) as a 256-bit integer that must be\n\t// within the valid range for a secp256k1 private key.  There is a small\n\t// chance (< 1 in 2^127) this condition will not hold, and in that case,\n\t// a child extended key can't be created for this index and the caller\n\t// should simply increment to the next index.\n\tvar ilNum btcec.ModNScalar\n\tif overflow := ilNum.SetByteSlice(il); overflow {\n\t\treturn nil, ErrInvalidChild\n\t}\n\n\t// The algorithm used to derive the child key depends on whether or not\n\t// a private or public child is being derived.\n\t//\n\t// For private children:\n\t//   childKey = parse256(Il) + parentKey\n\t//\n\t// For public children:\n\t//   childKey = serP(point(parse256(Il)) + parentKey)\n\tvar isPrivate bool\n\tvar childKey []byte\n\tif k.isPrivate {\n\t\t// Case #1 or #2.\n\t\t// Add the parent private key to the intermediate private key to\n\t\t// derive the final child key.\n\t\t//\n\t\t// childKey = parse256(Il) + parenKey\n\t\tvar keyNum btcec.ModNScalar\n\t\tif overflow := keyNum.SetByteSlice(k.key); overflow {\n\t\t\treturn nil, ErrInvalidChild\n\t\t}\n\n\t\tchildKeyBytes := ilNum.Add(&keyNum).Bytes()\n\t\tchildKey = childKeyBytes[:]\n\n\t\t// Strip leading zeroes from childKey, to match the expectation\n\t\t// as the old big.Int usage in this area of the codebase.\n\t\tfor len(childKey) > 0 && childKey[0] == 0x00 {\n\t\t\tchildKey = childKey[1:]\n\t\t}\n\n\t\tisPrivate = true\n\t} else {\n\t\t// Case #3.\n\t\t// Calculate the corresponding intermediate public key for thek\n\t\t// intermediate private key: ilJ = ilScalar*G\n\t\tvar (\n\t\t\tilScalar btcec.ModNScalar\n\t\t\tilJ      btcec.JacobianPoint\n\t\t)\n\t\tif overflow := ilScalar.SetByteSlice(il); overflow {\n\t\t\treturn nil, ErrInvalidChild\n\t\t}\n\t\tbtcec.ScalarBaseMultNonConst(&ilScalar, &ilJ)\n\n\t\tif (ilJ.X.IsZero() && ilJ.Y.IsZero()) || ilJ.Z.IsZero() {\n\t\t\treturn nil, ErrInvalidChild\n\t\t}\n\n\t\t// Convert the serialized compressed parent public key into X\n\t\t// and Y coordinates so it can be added to the intermediate\n\t\t// public key.\n\t\tpubKey, err := btcec.ParsePubKey(k.key)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Convert the public key to jacobian coordinates, as that's\n\t\t// what our main add/double methods use.\n\t\tvar pubKeyJ btcec.JacobianPoint\n\t\tpubKey.AsJacobian(&pubKeyJ)\n\n\t\t// Add the intermediate public key to the parent public key to\n\t\t// derive the final child key.\n\t\t//\n\t\t// childKey = serP(point(parse256(Il)) + parentKey)\n\t\tvar childKeyPubJ btcec.JacobianPoint\n\t\tbtcec.AddNonConst(&ilJ, &pubKeyJ, &childKeyPubJ)\n\n\t\t// Convert the new child public key back to affine coordinates\n\t\t// so we can serialize it in compressed format.\n\t\tchildKeyPubJ.ToAffine()\n\t\tchildKeyPub := btcec.NewPublicKey(\n\t\t\t&childKeyPubJ.X, &childKeyPubJ.Y,\n\t\t)\n\n\t\tchildKey = childKeyPub.SerializeCompressed()\n\t}\n\n\t// The fingerprint of the parent for the derived child is the first 4\n\t// bytes of the RIPEMD160(SHA256(parentPubKey)).\n\tparentFP := btcutil.Hash160(k.pubKeyBytes())[:4]\n\treturn NewExtendedKey(k.version, childKey, childChainCode, parentFP,\n\t\tk.depth+1, i, isPrivate), nil\n}\n\n// Returns true if this key was affected by the BIP-32 issue in the Child\n// method (since renamed to DeriveNonStandard).\nfunc (k *ExtendedKey) IsAffectedByIssue172() bool {\n\treturn len(k.key) < 32\n}\n\n// Deprecated: This is a non-standard derivation that is affected by issue #172.\n// 1-of-256 hardened derivations will be wrong.  See note in the Derive method\n// and IsAffectedByIssue172.\nfunc (k *ExtendedKey) DeriveNonStandard(i uint32) (*ExtendedKey, error) {\n\tif k.depth == maxUint8 {\n\t\treturn nil, ErrDeriveBeyondMaxDepth\n\t}\n\n\tisChildHardened := i >= HardenedKeyStart\n\tif !k.isPrivate && isChildHardened {\n\t\treturn nil, ErrDeriveHardFromPublic\n\t}\n\n\tkeyLen := 33\n\tdata := make([]byte, keyLen+4)\n\tif isChildHardened {\n\t\tcopy(data[1:], k.key)\n\t} else {\n\t\tcopy(data, k.pubKeyBytes())\n\t}\n\tbinary.BigEndian.PutUint32(data[keyLen:], i)\n\n\thmac512 := hmac.New(sha512.New, k.chainCode)\n\t_, _ = hmac512.Write(data)\n\tilr := hmac512.Sum(nil)\n\n\til := ilr[:len(ilr)/2]\n\tchildChainCode := ilr[len(ilr)/2:]\n\n\tilNum := new(big.Int).SetBytes(il)\n\tif ilNum.Cmp(btcec.S256().N) >= 0 || ilNum.Sign() == 0 {\n\t\treturn nil, ErrInvalidChild\n\t}\n\n\tvar isPrivate bool\n\tvar childKey []byte\n\tif k.isPrivate {\n\t\tkeyNum := new(big.Int).SetBytes(k.key)\n\t\tilNum.Add(ilNum, keyNum)\n\t\tilNum.Mod(ilNum, btcec.S256().N)\n\t\tchildKey = ilNum.Bytes()\n\t\tisPrivate = true\n\t} else {\n\t\tvar (\n\t\t\tilScalar btcec.ModNScalar\n\t\t\tilJ      btcec.JacobianPoint\n\t\t)\n\t\tif overflow := ilScalar.SetByteSlice(il); overflow {\n\t\t\treturn nil, ErrInvalidChild\n\t\t}\n\t\tbtcec.ScalarBaseMultNonConst(&ilScalar, &ilJ)\n\n\t\tif (ilJ.X.IsZero() && ilJ.Y.IsZero()) || ilJ.Z.IsZero() {\n\t\t\treturn nil, ErrInvalidChild\n\t\t}\n\n\t\tpubKey, err := btcec.ParsePubKey(k.key)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvar pubKeyJ btcec.JacobianPoint\n\t\tpubKey.AsJacobian(&pubKeyJ)\n\n\t\tvar childKeyPubJ btcec.JacobianPoint\n\t\tbtcec.AddNonConst(&ilJ, &pubKeyJ, &childKeyPubJ)\n\n\t\tchildKeyPubJ.ToAffine()\n\t\tchildKeyPub := btcec.NewPublicKey(\n\t\t\t&childKeyPubJ.X, &childKeyPubJ.Y,\n\t\t)\n\n\t\tchildKey = childKeyPub.SerializeCompressed()\n\t}\n\n\tparentFP := btcutil.Hash160(k.pubKeyBytes())[:4]\n\treturn NewExtendedKey(k.version, childKey, childChainCode, parentFP,\n\t\tk.depth+1, i, isPrivate), nil\n}\n\n// ChildIndex returns the index at which the child extended key was derived.\n//\n// Extended keys with ChildNum value between 0 and 2^31-1 are normal child\n// keys, and those with a value between 2^31 and 2^32-1 are hardened keys.\nfunc (k *ExtendedKey) ChildIndex() uint32 {\n\treturn k.childNum\n}\n\n// Neuter returns a new extended public key from this extended private key.  The\n// same extended key will be returned unaltered if it is already an extended\n// public key.\n//\n// As the name implies, an extended public key does not have access to the\n// private key, so it is not capable of signing transactions or deriving\n// child extended private keys.  However, it is capable of deriving further\n// child extended public keys.\nfunc (k *ExtendedKey) Neuter() (*ExtendedKey, error) {\n\t// Already an extended public key.\n\tif !k.isPrivate {\n\t\treturn k, nil\n\t}\n\n\t// Get the associated public extended key version bytes.\n\tversion, err := chaincfg.HDPrivateKeyToPublicKeyID(k.version)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Convert it to an extended public key.  The key for the new extended\n\t// key will simply be the pubkey of the current extended private key.\n\t//\n\t// This is the function N((k,c)) -> (K, c) from [BIP32].\n\treturn NewExtendedKey(version, k.pubKeyBytes(), k.chainCode, k.parentFP,\n\t\tk.depth, k.childNum, false), nil\n}\n\n// CloneWithVersion returns a new extended key cloned from this extended key,\n// but using the provided HD version bytes. The version must be a private HD\n// key ID for an extended private key, and a public HD key ID for an extended\n// public key.\n//\n// This method creates a new copy and therefore does not mutate the original\n// extended key instance.\n//\n// Unlike Neuter(), this does NOT convert an extended private key to an\n// extended public key. It is particularly useful for converting between\n// standard BIP0032 extended keys (serializable to xprv/xpub) and keys based\n// on the SLIP132 standard (serializable to yprv/ypub, zprv/zpub, etc.).\n//\n// References:\n//\n//\t[SLIP132]: SLIP-0132 - Registered HD version bytes for BIP-0032\n//\thttps://github.com/satoshilabs/slips/blob/master/slip-0132.md\nfunc (k *ExtendedKey) CloneWithVersion(version []byte) (*ExtendedKey, error) {\n\tif len(version) != 4 {\n\t\t// TODO: The semantically correct error to return here is\n\t\t//  ErrInvalidHDKeyID (introduced in btcsuite/btcd#1617). Update the\n\t\t//  error type once available in a stable btcd / chaincfg release.\n\t\treturn nil, chaincfg.ErrUnknownHDKeyID\n\t}\n\n\t// Initialize a new extended key instance with the same fields as the\n\t// current extended private/public key and the provided HD version bytes.\n\treturn NewExtendedKey(version, k.key, k.chainCode, k.parentFP,\n\t\tk.depth, k.childNum, k.isPrivate), nil\n}\n\n// ECPubKey converts the extended key to a btcec public key and returns it.\nfunc (k *ExtendedKey) ECPubKey() (*btcec.PublicKey, error) {\n\treturn btcec.ParsePubKey(k.pubKeyBytes())\n}\n\n// ECPrivKey converts the extended key to a btcec private key and returns it.\n// As you might imagine this is only possible if the extended key is a private\n// extended key (as determined by the IsPrivate function).  The ErrNotPrivExtKey\n// error will be returned if this function is called on a public extended key.\nfunc (k *ExtendedKey) ECPrivKey() (*btcec.PrivateKey, error) {\n\tif !k.isPrivate {\n\t\treturn nil, ErrNotPrivExtKey\n\t}\n\n\tprivKey, _ := btcec.PrivKeyFromBytes(k.key)\n\treturn privKey, nil\n}\n\n// Address converts the extended key to a standard bitcoin pay-to-pubkey-hash\n// address for the passed network.\nfunc (k *ExtendedKey) Address(net *chaincfg.Params) (*btcutil.AddressPubKeyHash, error) {\n\tpkHash := btcutil.Hash160(k.pubKeyBytes())\n\treturn btcutil.NewAddressPubKeyHash(pkHash, net)\n}\n\n// paddedAppend appends the src byte slice to dst, returning the new slice.\n// If the length of the source is smaller than the passed size, leading zero\n// bytes are appended to the dst slice before appending src.\nfunc paddedAppend(size uint, dst, src []byte) []byte {\n\tfor i := 0; i < int(size)-len(src); i++ {\n\t\tdst = append(dst, 0)\n\t}\n\treturn append(dst, src...)\n}\n\n// String returns the extended key as a human-readable base58-encoded string.\nfunc (k *ExtendedKey) String() string {\n\tif len(k.key) == 0 {\n\t\treturn \"zeroed extended key\"\n\t}\n\n\tvar childNumBytes [4]byte\n\tbinary.BigEndian.PutUint32(childNumBytes[:], k.childNum)\n\n\t// The serialized format is:\n\t//   version (4) || depth (1) || parent fingerprint (4)) ||\n\t//   child num (4) || chain code (32) || key data (33) || checksum (4)\n\tserializedBytes := make([]byte, 0, serializedKeyLen+4)\n\tserializedBytes = append(serializedBytes, k.version...)\n\tserializedBytes = append(serializedBytes, k.depth)\n\tserializedBytes = append(serializedBytes, k.parentFP...)\n\tserializedBytes = append(serializedBytes, childNumBytes[:]...)\n\tserializedBytes = append(serializedBytes, k.chainCode...)\n\tif k.isPrivate {\n\t\tserializedBytes = append(serializedBytes, 0x00)\n\t\tserializedBytes = paddedAppend(32, serializedBytes, k.key)\n\t} else {\n\t\tserializedBytes = append(serializedBytes, k.pubKeyBytes()...)\n\t}\n\n\tcheckSum := chainhash.DoubleHashB(serializedBytes)[:4]\n\tserializedBytes = append(serializedBytes, checkSum...)\n\treturn base58.Encode(serializedBytes)\n}\n\n// IsForNet returns whether or not the extended key is associated with the\n// passed bitcoin network.\nfunc (k *ExtendedKey) IsForNet(net *chaincfg.Params) bool {\n\treturn bytes.Equal(k.version, net.HDPrivateKeyID[:]) ||\n\t\tbytes.Equal(k.version, net.HDPublicKeyID[:])\n}\n\n// SetNet associates the extended key, and any child keys yet to be derived from\n// it, with the passed network.\nfunc (k *ExtendedKey) SetNet(net *chaincfg.Params) {\n\tif k.isPrivate {\n\t\tk.version = net.HDPrivateKeyID[:]\n\t} else {\n\t\tk.version = net.HDPublicKeyID[:]\n\t}\n}\n\n// zero sets all bytes in the passed slice to zero.  This is used to\n// explicitly clear private key material from memory.\nfunc zero(b []byte) {\n\tlenb := len(b)\n\tfor i := 0; i < lenb; i++ {\n\t\tb[i] = 0\n\t}\n}\n\n// Zero manually clears all fields and bytes in the extended key.  This can be\n// used to explicitly clear key material from memory for enhanced security\n// against memory scraping.  This function only clears this particular key and\n// not any children that have already been derived.\nfunc (k *ExtendedKey) Zero() {\n\tzero(k.key)\n\tzero(k.pubKey)\n\tzero(k.chainCode)\n\tzero(k.parentFP)\n\tk.version = nil\n\tk.key = nil\n\tk.depth = 0\n\tk.childNum = 0\n\tk.isPrivate = false\n}\n\n// NewMaster creates a new master node for use in creating a hierarchical\n// deterministic key chain.  The seed must be between 128 and 512 bits and\n// should be generated by a cryptographically secure random generation source.\n//\n// NOTE: There is an extremely small chance (< 1 in 2^127) the provided seed\n// will derive to an unusable secret key.  The ErrUnusable error will be\n// returned if this should occur, so the caller must check for it and generate a\n// new seed accordingly.\nfunc NewMaster(seed []byte, net *chaincfg.Params) (*ExtendedKey, error) {\n\t// Per [BIP32], the seed must be in range [MinSeedBytes, MaxSeedBytes].\n\tif len(seed) < MinSeedBytes || len(seed) > MaxSeedBytes {\n\t\treturn nil, ErrInvalidSeedLen\n\t}\n\n\t// First take the HMAC-SHA512 of the master key and the seed data:\n\t//   I = HMAC-SHA512(Key = \"Bitcoin seed\", Data = S)\n\thmac512 := hmac.New(sha512.New, masterKey)\n\t_, _ = hmac512.Write(seed)\n\tlr := hmac512.Sum(nil)\n\n\t// Split \"I\" into two 32-byte sequences Il and Ir where:\n\t//   Il = master secret key\n\t//   Ir = master chain code\n\tsecretKey := lr[:len(lr)/2]\n\tchainCode := lr[len(lr)/2:]\n\n\t// Ensure the key in usable.\n\tsecretKeyNum := new(big.Int).SetBytes(secretKey)\n\tif secretKeyNum.Cmp(btcec.S256().N) >= 0 || secretKeyNum.Sign() == 0 {\n\t\treturn nil, ErrUnusableSeed\n\t}\n\n\tparentFP := []byte{0x00, 0x00, 0x00, 0x00}\n\treturn NewExtendedKey(net.HDPrivateKeyID[:], secretKey, chainCode,\n\t\tparentFP, 0, 0, true), nil\n}\n\n// NewKeyFromString returns a new extended key instance from a base58-encoded\n// extended key.\nfunc NewKeyFromString(key string) (*ExtendedKey, error) {\n\t// The base58-decoded extended key must consist of a serialized payload\n\t// plus an additional 4 bytes for the checksum.\n\tdecoded := base58.Decode(key)\n\tif len(decoded) != serializedKeyLen+4 {\n\t\treturn nil, ErrInvalidKeyLen\n\t}\n\n\t// The serialized format is:\n\t//   version (4) || depth (1) || parent fingerprint (4)) ||\n\t//   child num (4) || chain code (32) || key data (33) || checksum (4)\n\n\t// Split the payload and checksum up and ensure the checksum matches.\n\tpayload := decoded[:len(decoded)-4]\n\tcheckSum := decoded[len(decoded)-4:]\n\texpectedCheckSum := chainhash.DoubleHashB(payload)[:4]\n\tif !bytes.Equal(checkSum, expectedCheckSum) {\n\t\treturn nil, ErrBadChecksum\n\t}\n\n\t// Deserialize each of the payload fields.\n\tversion := payload[:4]\n\tdepth := payload[4:5][0]\n\tparentFP := payload[5:9]\n\tchildNum := binary.BigEndian.Uint32(payload[9:13])\n\tchainCode := payload[13:45]\n\tkeyData := payload[45:78]\n\n\t// The key data is a private key if it starts with 0x00.  Serialized\n\t// compressed pubkeys either start with 0x02 or 0x03.\n\tisPrivate := keyData[0] == 0x00\n\tif isPrivate {\n\t\t// Ensure the private key is valid.  It must be within the range\n\t\t// of the order of the secp256k1 curve and not be 0.\n\t\tkeyData = keyData[1:]\n\t\tkeyNum := new(big.Int).SetBytes(keyData)\n\t\tif keyNum.Cmp(btcec.S256().N) >= 0 || keyNum.Sign() == 0 {\n\t\t\treturn nil, ErrUnusableSeed\n\t\t}\n\t} else {\n\t\t// Ensure the public key parses correctly and is actually on the\n\t\t// secp256k1 curve.\n\t\t_, err := btcec.ParsePubKey(keyData)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn NewExtendedKey(version, keyData, chainCode, parentFP, depth,\n\t\tchildNum, isPrivate), nil\n}\n\n// GenerateSeed returns a cryptographically secure random seed that can be used\n// as the input for the NewMaster function to generate a new master node.\n//\n// The length is in bytes and it must be between 16 and 64 (128 to 512 bits).\n// The recommended length is 32 (256 bits) as defined by the RecommendedSeedLen\n// constant.\nfunc GenerateSeed(length uint8) ([]byte, error) {\n\t// Per [BIP32], the seed must be in range [MinSeedBytes, MaxSeedBytes].\n\tif length < MinSeedBytes || length > MaxSeedBytes {\n\t\treturn nil, ErrInvalidSeedLen\n\t}\n\n\tbuf := make([]byte, length)\n\t_, err := rand.Read(buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buf, nil\n}\n"
  },
  {
    "path": "btcutil/hdkeychain/extendedkey_test.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage hdkeychain\n\n// References:\n//   [BIP32]: BIP0032 - Hierarchical Deterministic Wallets\n//   https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"math\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\tsecp_ecdsa \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// TestBIP0032Vectors tests the vectors provided by [BIP32] to ensure the\n// derivation works as intended.\nfunc TestBIP0032Vectors(t *testing.T) {\n\t// The master seeds for each of the two test vectors in [BIP32].\n\ttestVec1MasterHex := \"000102030405060708090a0b0c0d0e0f\"\n\ttestVec2MasterHex := \"fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542\"\n\ttestVec3MasterHex := \"4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be\"\n\thkStart := uint32(0x80000000)\n\n\ttests := []struct {\n\t\tname     string\n\t\tmaster   string\n\t\tpath     []uint32\n\t\twantPub  string\n\t\twantPriv string\n\t\tnet      *chaincfg.Params\n\t}{\n\t\t// Test vector 1\n\t\t{\n\t\t\tname:     \"test vector 1 chain m\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{},\n\t\t\twantPub:  \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n\t\t\twantPriv: \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0H\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{hkStart},\n\t\t\twantPub:  \"xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw\",\n\t\t\twantPriv: \"xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0H/1\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{hkStart, 1},\n\t\t\twantPub:  \"xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ\",\n\t\t\twantPriv: \"xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0H/1/2H\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{hkStart, 1, hkStart + 2},\n\t\t\twantPub:  \"xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5\",\n\t\t\twantPriv: \"xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0H/1/2H/2\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{hkStart, 1, hkStart + 2, 2},\n\t\t\twantPub:  \"xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV\",\n\t\t\twantPriv: \"xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0H/1/2H/2/1000000000\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{hkStart, 1, hkStart + 2, 2, 1000000000},\n\t\t\twantPub:  \"xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy\",\n\t\t\twantPriv: \"xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\n\t\t// Test vector 2\n\t\t{\n\t\t\tname:     \"test vector 2 chain m\",\n\t\t\tmaster:   testVec2MasterHex,\n\t\t\tpath:     []uint32{},\n\t\t\twantPub:  \"xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB\",\n\t\t\twantPriv: \"xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 2 chain m/0\",\n\t\t\tmaster:   testVec2MasterHex,\n\t\t\tpath:     []uint32{0},\n\t\t\twantPub:  \"xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH\",\n\t\t\twantPriv: \"xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 2 chain m/0/2147483647H\",\n\t\t\tmaster:   testVec2MasterHex,\n\t\t\tpath:     []uint32{0, hkStart + 2147483647},\n\t\t\twantPub:  \"xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a\",\n\t\t\twantPriv: \"xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 2 chain m/0/2147483647H/1\",\n\t\t\tmaster:   testVec2MasterHex,\n\t\t\tpath:     []uint32{0, hkStart + 2147483647, 1},\n\t\t\twantPub:  \"xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon\",\n\t\t\twantPriv: \"xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 2 chain m/0/2147483647H/1/2147483646H\",\n\t\t\tmaster:   testVec2MasterHex,\n\t\t\tpath:     []uint32{0, hkStart + 2147483647, 1, hkStart + 2147483646},\n\t\t\twantPub:  \"xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL\",\n\t\t\twantPriv: \"xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 2 chain m/0/2147483647H/1/2147483646H/2\",\n\t\t\tmaster:   testVec2MasterHex,\n\t\t\tpath:     []uint32{0, hkStart + 2147483647, 1, hkStart + 2147483646, 2},\n\t\t\twantPub:  \"xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt\",\n\t\t\twantPriv: \"xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\n\t\t// Test vector 3\n\t\t{\n\t\t\tname:     \"test vector 3 chain m\",\n\t\t\tmaster:   testVec3MasterHex,\n\t\t\tpath:     []uint32{},\n\t\t\twantPub:  \"xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13\",\n\t\t\twantPriv: \"xprv9s21ZrQH143K25QhxbucbDDuQ4naNntJRi4KUfWT7xo4EKsHt2QJDu7KXp1A3u7Bi1j8ph3EGsZ9Xvz9dGuVrtHHs7pXeTzjuxBrCmmhgC6\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 3 chain m/0H\",\n\t\t\tmaster:   testVec3MasterHex,\n\t\t\tpath:     []uint32{hkStart},\n\t\t\twantPub:  \"xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y\",\n\t\t\twantPriv: \"xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L\",\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t},\n\n\t\t// Test vector 1 - Testnet\n\t\t{\n\t\t\tname:     \"test vector 1 chain m - testnet\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{},\n\t\t\twantPub:  \"tpubD6NzVbkrYhZ4XgiXtGrdW5XDAPFCL9h7we1vwNCpn8tGbBcgfVYjXyhWo4E1xkh56hjod1RhGjxbaTLV3X4FyWuejifB9jusQ46QzG87VKp\",\n\t\t\twantPriv: \"tprv8ZgxMBicQKsPeDgjzdC36fs6bMjGApWDNLR9erAXMs5skhMv36j9MV5ecvfavji5khqjWaWSFhN3YcCUUdiKH6isR4Pwy3U5y5egddBr16m\",\n\t\t\tnet:      &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0H - testnet\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{hkStart},\n\t\t\twantPub:  \"tpubD8eQVK4Kdxg3gHrF62jGP7dKVCoYiEB8dFSpuTawkL5YxTus5j5pf83vaKnii4bc6v2NVEy81P2gYrJczYne3QNNwMTS53p5uzDyHvnw2jm\",\n\t\t\twantPriv: \"tprv8bxNLu25VazNnppTCP4fyhyCvBHcYtzE3wr3cwYeL4HA7yf6TLGEUdS4QC1vLT63TkjRssqJe4CvGNEC8DzW5AoPUw56D1Ayg6HY4oy8QZ9\",\n\t\t\tnet:      &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0H/1 - testnet\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{hkStart, 1},\n\t\t\twantPub:  \"tpubDApXh6cD2fZ7WjtgpHd8yrWyYaneiFuRZa7fVjMkgxsmC1QzoXW8cgx9zQFJ81Jx4deRGfRE7yXA9A3STsxXj4CKEZJHYgpMYikkas9DBTP\",\n\t\t\twantPriv: \"tprv8e8VYgZxtHsSdGrtvdxYaSrryZGiYviWzGWtDDKTGh5NMXAEB8gYSCLHpFCywNs5uqV7ghRjimALQJkRFZnUrLHpzi2pGkwqLtbubgWuQ8q\",\n\t\t\tnet:      &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0H/1/2H - testnet\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{hkStart, 1, hkStart + 2},\n\t\t\twantPub:  \"tpubDDRojdS4jYQXNugn4t2WLrZ7mjfAyoVQu7MLk4eurqFCbrc7cHLZX8W5YRS8ZskGR9k9t3PqVv68bVBjAyW4nWM9pTGRddt3GQftg6MVQsm\",\n\t\t\twantPriv: \"tprv8gjmbDPpbAirVSezBEMuwSu1Ci9EpUJWKokZTYccSZSomNMLytWyLdtDNHRbucNaRJWWHANf9AzEdWVAqahfyRjVMKbNRhBmxAM8EJr7R15\",\n\t\t\tnet:      &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0H/1/2H/2 - testnet\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{hkStart, 1, hkStart + 2, 2},\n\t\t\twantPub:  \"tpubDFfCa4Z1v25WTPAVm9EbEMiRrYwucPocLbEe12BPBGooxxEUg42vihy1DkRWyftztTsL23snYezF9uXjGGwGW6pQjEpcTpmsH6ajpf4CVPn\",\n\t\t\twantPriv: \"tprv8iyAReWmmePqZv8hsVZzpx4KHXRyT4chmHdriW95m11R8Tyi3fDLYDM93bq4NGn1V6eCu5cE3zSQ6hPd31F2ApKXkZgTyn1V78pHjkq1V2v\",\n\t\t\tnet:      &chaincfg.TestNet3Params,\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0H/1/2H/2/1000000000 - testnet\",\n\t\t\tmaster:   testVec1MasterHex,\n\t\t\tpath:     []uint32{hkStart, 1, hkStart + 2, 2, 1000000000},\n\t\t\twantPub:  \"tpubDHNy3kAG39ThyiwwsgoKY4iRenXDRtce8qdCFJZXPMCJg5dsCUHayp84raLTpvyiNA9sXPob5rgqkKvkN8S7MMyXbnEhGJMW64Cf4vFAoaF\",\n\t\t\twantPriv: \"tprv8kgvuL81tmn36Fv9z38j8f4K5m1HGZRjZY2QxnXDy5PuqbP6a5TzoKWCgTcGHBu66W3TgSbAu2yX6sPza5FkHmy564Sh6gmCPUNeUt4yj2x\",\n\t\t\tnet:      &chaincfg.TestNet3Params,\n\t\t},\n\t}\n\ntests:\n\tfor i, test := range tests {\n\t\tmasterSeed, err := hex.DecodeString(test.master)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"DecodeString #%d (%s): unexpected error: %v\",\n\t\t\t\ti, test.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\textKey, err := NewMaster(masterSeed, test.net)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"NewMaster #%d (%s): unexpected error when \"+\n\t\t\t\t\"creating new master key: %v\", i, test.name,\n\t\t\t\terr)\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, childNum := range test.path {\n\t\t\tvar err error\n\t\t\textKey, err = extKey.Derive(childNum)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"err: %v\", err)\n\t\t\t\tcontinue tests\n\t\t\t}\n\t\t}\n\n\t\tif extKey.Depth() != uint8(len(test.path)) {\n\t\t\tt.Errorf(\"Depth of key %d should match fixture path: %v\",\n\t\t\t\textKey.Depth(), len(test.path))\n\t\t\tcontinue\n\t\t}\n\n\t\tprivStr := extKey.String()\n\t\tif privStr != test.wantPriv {\n\t\t\tt.Errorf(\"Serialize #%d (%s): mismatched serialized \"+\n\t\t\t\t\"private extended key -- got: %s, want: %s\", i,\n\t\t\t\ttest.name, privStr, test.wantPriv)\n\t\t\tcontinue\n\t\t}\n\n\t\tpubKey, err := extKey.Neuter()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Neuter #%d (%s): unexpected error: %v \", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Neutering a second time should have no effect.\n\t\tpubKey, err = pubKey.Neuter()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Neuter #%d (%s): unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\treturn\n\t\t}\n\n\t\tpubStr := pubKey.String()\n\t\tif pubStr != test.wantPub {\n\t\t\tt.Errorf(\"Neuter #%d (%s): mismatched serialized \"+\n\t\t\t\t\"public extended key -- got: %s, want: %s\", i,\n\t\t\t\ttest.name, pubStr, test.wantPub)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestPrivateDerivation tests several vectors which derive private keys from\n// other private keys works as intended.\nfunc TestPrivateDerivation(t *testing.T) {\n\t// The private extended keys for test vectors in [BIP32].\n\ttestVec1MasterPrivKey := \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\"\n\ttestVec2MasterPrivKey := \"xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U\"\n\n\ttests := []struct {\n\t\tname     string\n\t\tmaster   string\n\t\tpath     []uint32\n\t\twantPriv string\n\t}{\n\t\t// Test vector 1\n\t\t{\n\t\t\tname:     \"test vector 1 chain m\",\n\t\t\tmaster:   testVec1MasterPrivKey,\n\t\t\tpath:     []uint32{},\n\t\t\twantPriv: \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\",\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0\",\n\t\t\tmaster:   testVec1MasterPrivKey,\n\t\t\tpath:     []uint32{0},\n\t\t\twantPriv: \"xprv9uHRZZhbkedL37eZEnyrNsQPFZYRAvjy5rt6M1nbEkLSo378x1CQQLo2xxBvREwiK6kqf7GRNvsNEchwibzXaV6i5GcsgyjBeRguXhKsi4R\",\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0/1\",\n\t\t\tmaster:   testVec1MasterPrivKey,\n\t\t\tpath:     []uint32{0, 1},\n\t\t\twantPriv: \"xprv9ww7sMFLzJMzy7bV1qs7nGBxgKYrgcm3HcJvGb4yvNhT9vxXC7eX7WVULzCfxucFEn2TsVvJw25hH9d4mchywguGQCZvRgsiRaTY1HCqN8G\",\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0/1/2\",\n\t\t\tmaster:   testVec1MasterPrivKey,\n\t\t\tpath:     []uint32{0, 1, 2},\n\t\t\twantPriv: \"xprv9xrdP7iD2L1YZCgR9AecDgpDMZSTzP5KCfUykGXgjBxLgp1VFHsEeL3conzGAkbc1MigG1o8YqmfEA2jtkPdf4vwMaGJC2YSDbBTPAjfRUi\",\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0/1/2/2\",\n\t\t\tmaster:   testVec1MasterPrivKey,\n\t\t\tpath:     []uint32{0, 1, 2, 2},\n\t\t\twantPriv: \"xprvA2J8Hq4eiP7xCEBP7gzRJGJnd9CHTkEU6eTNMrZ6YR7H5boik8daFtDZxmJDfdMSKHwroCfAfsBKWWidRfBQjpegy6kzXSkQGGoMdWKz5Xh\",\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 1 chain m/0/1/2/2/1000000000\",\n\t\t\tmaster:   testVec1MasterPrivKey,\n\t\t\tpath:     []uint32{0, 1, 2, 2, 1000000000},\n\t\t\twantPriv: \"xprvA3XhazxncJqJsQcG85Gg61qwPQKiobAnWjuPpjKhExprZjfse6nErRwTMwGe6uGWXPSykZSTiYb2TXAm7Qhwj8KgRd2XaD21Styu6h6AwFz\",\n\t\t},\n\n\t\t// Test vector 2\n\t\t{\n\t\t\tname:     \"test vector 2 chain m\",\n\t\t\tmaster:   testVec2MasterPrivKey,\n\t\t\tpath:     []uint32{},\n\t\t\twantPriv: \"xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U\",\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 2 chain m/0\",\n\t\t\tmaster:   testVec2MasterPrivKey,\n\t\t\tpath:     []uint32{0},\n\t\t\twantPriv: \"xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt\",\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 2 chain m/0/2147483647\",\n\t\t\tmaster:   testVec2MasterPrivKey,\n\t\t\tpath:     []uint32{0, 2147483647},\n\t\t\twantPriv: \"xprv9wSp6B7cXJWXZRpDbxkFg3ry2fuSyUfvboJ5Yi6YNw7i1bXmq9QwQ7EwMpeG4cK2pnMqEx1cLYD7cSGSCtruGSXC6ZSVDHugMsZgbuY62m6\",\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 2 chain m/0/2147483647/1\",\n\t\t\tmaster:   testVec2MasterPrivKey,\n\t\t\tpath:     []uint32{0, 2147483647, 1},\n\t\t\twantPriv: \"xprv9ysS5br6UbWCRCJcggvpUNMyhVWgD7NypY9gsVTMYmuRtZg8izyYC5Ey4T931WgWbfJwRDwfVFqV3b29gqHDbuEpGcbzf16pdomk54NXkSm\",\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 2 chain m/0/2147483647/1/2147483646\",\n\t\t\tmaster:   testVec2MasterPrivKey,\n\t\t\tpath:     []uint32{0, 2147483647, 1, 2147483646},\n\t\t\twantPriv: \"xprvA2LfeWWwRCxh4iqigcDMnUf2E3nVUFkntc93nmUYBtb9rpSPYWa8MY3x9ZHSLZkg4G84UefrDruVK3FhMLSJsGtBx883iddHNuH1LNpRrEp\",\n\t\t},\n\t\t{\n\t\t\tname:     \"test vector 2 chain m/0/2147483647/1/2147483646/2\",\n\t\t\tmaster:   testVec2MasterPrivKey,\n\t\t\tpath:     []uint32{0, 2147483647, 1, 2147483646, 2},\n\t\t\twantPriv: \"xprvA48ALo8BDjcRET68R5RsPzF3H7WeyYYtHcyUeLRGBPHXu6CJSGjwW7dWoeUWTEzT7LG3qk6Eg6x2ZoqD8gtyEFZecpAyvchksfLyg3Zbqam\",\n\t\t},\n\n\t\t// Custom tests to trigger specific conditions.\n\t\t{\n\t\t\t// Seed 000000000000000000000000000000da.\n\t\t\tname:     \"Derived privkey with zero high byte m/0\",\n\t\t\tmaster:   \"xprv9s21ZrQH143K4FR6rNeqEK4EBhRgLjWLWhA3pw8iqgAKk82ypz58PXbrzU19opYcxw8JDJQF4id55PwTsN1Zv8Xt6SKvbr2KNU5y8jN8djz\",\n\t\t\tpath:     []uint32{0},\n\t\t\twantPriv: \"xprv9uC5JqtViMmgcAMUxcsBCBFA7oYCNs4bozPbyvLfddjHou4rMiGEHipz94xNaPb1e4f18TRoPXfiXx4C3cDAcADqxCSRSSWLvMBRWPctSN9\",\n\t\t},\n\t}\n\ntests:\n\tfor i, test := range tests {\n\t\textKey, err := NewKeyFromString(test.master)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"NewKeyFromString #%d (%s): unexpected error \"+\n\t\t\t\t\"creating extended key: %v\", i, test.name,\n\t\t\t\terr)\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, childNum := range test.path {\n\t\t\tvar err error\n\t\t\textKey, err = extKey.Derive(childNum)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"err: %v\", err)\n\t\t\t\tcontinue tests\n\t\t\t}\n\t\t}\n\n\t\tprivStr := extKey.String()\n\t\tif privStr != test.wantPriv {\n\t\t\tt.Errorf(\"Derive #%d (%s): mismatched serialized \"+\n\t\t\t\t\"private extended key -- got: %s, want: %s\", i,\n\t\t\t\ttest.name, privStr, test.wantPriv)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestPublicDerivation tests several vectors which derive public keys from\n// other public keys works as intended.\nfunc TestPublicDerivation(t *testing.T) {\n\t// The public extended keys for test vectors in [BIP32].\n\ttestVec1MasterPubKey := \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\"\n\ttestVec2MasterPubKey := \"xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB\"\n\n\ttests := []struct {\n\t\tname    string\n\t\tmaster  string\n\t\tpath    []uint32\n\t\twantPub string\n\t}{\n\t\t// Test vector 1\n\t\t{\n\t\t\tname:    \"test vector 1 chain m\",\n\t\t\tmaster:  testVec1MasterPubKey,\n\t\t\tpath:    []uint32{},\n\t\t\twantPub: \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test vector 1 chain m/0\",\n\t\t\tmaster:  testVec1MasterPubKey,\n\t\t\tpath:    []uint32{0},\n\t\t\twantPub: \"xpub68Gmy5EVb2BdFbj2LpWrk1M7obNuaPTpT5oh9QCCo5sRfqSHVYWex97WpDZzszdzHzxXDAzPLVSwybe4uPYkSk4G3gnrPqqkV9RyNzAcNJ1\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test vector 1 chain m/0/1\",\n\t\t\tmaster:  testVec1MasterPubKey,\n\t\t\tpath:    []uint32{0, 1},\n\t\t\twantPub: \"xpub6AvUGrnEpfvJBbfx7sQ89Q8hEMPM65UteqEX4yUbUiES2jHfjexmfJoxCGSwFMZiPBaKQT1RiKWrKfuDV4vpgVs4Xn8PpPTR2i79rwHd4Zr\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test vector 1 chain m/0/1/2\",\n\t\t\tmaster:  testVec1MasterPubKey,\n\t\t\tpath:    []uint32{0, 1, 2},\n\t\t\twantPub: \"xpub6BqyndF6rhZqmgktFCBcapkwubGxPqoAZtQaYewJHXVKZcLdnqBVC8N6f6FSHWUghjuTLeubWyQWfJdk2G3tGgvgj3qngo4vLTnnSjAZckv\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test vector 1 chain m/0/1/2/2\",\n\t\t\tmaster:  testVec1MasterPubKey,\n\t\t\tpath:    []uint32{0, 1, 2, 2},\n\t\t\twantPub: \"xpub6FHUhLbYYkgFQiFrDiXRfQFXBB2msCxKTsNyAExi6keFxQ8sHfwpogY3p3s1ePSpUqLNYks5T6a3JqpCGszt4kxbyq7tUoFP5c8KWyiDtPp\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test vector 1 chain m/0/1/2/2/1000000000\",\n\t\t\tmaster:  testVec1MasterPubKey,\n\t\t\tpath:    []uint32{0, 1, 2, 2, 1000000000},\n\t\t\twantPub: \"xpub6GX3zWVgSgPc5tgjE6ogT9nfwSADD3tdsxpzd7jJoJMqSY12Be6VQEFwDCp6wAQoZsH2iq5nNocHEaVDxBcobPrkZCjYW3QUmoDYzMFBDu9\",\n\t\t},\n\n\t\t// Test vector 2\n\t\t{\n\t\t\tname:    \"test vector 2 chain m\",\n\t\t\tmaster:  testVec2MasterPubKey,\n\t\t\tpath:    []uint32{},\n\t\t\twantPub: \"xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test vector 2 chain m/0\",\n\t\t\tmaster:  testVec2MasterPubKey,\n\t\t\tpath:    []uint32{0},\n\t\t\twantPub: \"xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test vector 2 chain m/0/2147483647\",\n\t\t\tmaster:  testVec2MasterPubKey,\n\t\t\tpath:    []uint32{0, 2147483647},\n\t\t\twantPub: \"xpub6ASAVgeWMg4pmutghzHG3BohahjwNwPmy2DgM6W9wGegtPrvNgjBwuZRD7hSDFhYfunq8vDgwG4ah1gVzZysgp3UsKz7VNjCnSUJJ5T4fdD\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test vector 2 chain m/0/2147483647/1\",\n\t\t\tmaster:  testVec2MasterPubKey,\n\t\t\tpath:    []uint32{0, 2147483647, 1},\n\t\t\twantPub: \"xpub6CrnV7NzJy4VdgP5niTpqWJiFXMAca6qBm5Hfsry77SQmN1HGYHnjsZSujoHzdxf7ZNK5UVrmDXFPiEW2ecwHGWMFGUxPC9ARipss9rXd4b\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test vector 2 chain m/0/2147483647/1/2147483646\",\n\t\t\tmaster:  testVec2MasterPubKey,\n\t\t\tpath:    []uint32{0, 2147483647, 1, 2147483646},\n\t\t\twantPub: \"xpub6FL2423qFaWzHCvBndkN9cbkn5cysiUeFq4eb9t9kE88jcmY63tNuLNRzpHPdAM4dUpLhZ7aUm2cJ5zF7KYonf4jAPfRqTMTRBNkQL3Tfta\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test vector 2 chain m/0/2147483647/1/2147483646/2\",\n\t\t\tmaster:  testVec2MasterPubKey,\n\t\t\tpath:    []uint32{0, 2147483647, 1, 2147483646, 2},\n\t\t\twantPub: \"xpub6H7WkJf547AiSwAbX6xsm8Bmq9M9P1Gjequ5SipsjipWmtXSyp4C3uwzewedGEgAMsDy4jEvNTWtxLyqqHY9C12gaBmgUdk2CGmwachwnWK\",\n\t\t},\n\t}\n\ntests:\n\tfor i, test := range tests {\n\t\textKey, err := NewKeyFromString(test.master)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"NewKeyFromString #%d (%s): unexpected error \"+\n\t\t\t\t\"creating extended key: %v\", i, test.name,\n\t\t\t\terr)\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, childNum := range test.path {\n\t\t\tvar err error\n\t\t\textKey, err = extKey.Derive(childNum)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"err: %v\", err)\n\t\t\t\tcontinue tests\n\t\t\t}\n\t\t}\n\n\t\tpubStr := extKey.String()\n\t\tif pubStr != test.wantPub {\n\t\t\tt.Errorf(\"Derive #%d (%s): mismatched serialized \"+\n\t\t\t\t\"public extended key -- got: %s, want: %s\", i,\n\t\t\t\ttest.name, pubStr, test.wantPub)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestGenerateSeed ensures the GenerateSeed function works as intended.\nfunc TestGenerateSeed(t *testing.T) {\n\twantErr := errors.New(\"seed length must be between 128 and 512 bits\")\n\n\ttests := []struct {\n\t\tname   string\n\t\tlength uint8\n\t\terr    error\n\t}{\n\t\t// Test various valid lengths.\n\t\t{name: \"16 bytes\", length: 16},\n\t\t{name: \"17 bytes\", length: 17},\n\t\t{name: \"20 bytes\", length: 20},\n\t\t{name: \"32 bytes\", length: 32},\n\t\t{name: \"64 bytes\", length: 64},\n\n\t\t// Test invalid lengths.\n\t\t{name: \"15 bytes\", length: 15, err: wantErr},\n\t\t{name: \"65 bytes\", length: 65, err: wantErr},\n\t}\n\n\tfor i, test := range tests {\n\t\tseed, err := GenerateSeed(test.length)\n\t\tif !reflect.DeepEqual(err, test.err) {\n\t\t\tt.Errorf(\"GenerateSeed #%d (%s): unexpected error -- \"+\n\t\t\t\t\"want %v, got %v\", i, test.name, test.err, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif test.err == nil && len(seed) != int(test.length) {\n\t\t\tt.Errorf(\"GenerateSeed #%d (%s): length mismatch -- \"+\n\t\t\t\t\"got %d, want %d\", i, test.name, len(seed),\n\t\t\t\ttest.length)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestExtendedKeyAPI ensures the API on the ExtendedKey type works as intended.\nfunc TestExtendedKeyAPI(t *testing.T) {\n\ttests := []struct {\n\t\tname       string\n\t\textKey     string\n\t\tisPrivate  bool\n\t\tparentFP   uint32\n\t\tchainCode  []byte\n\t\tchildNum   uint32\n\t\tprivKey    string\n\t\tprivKeyErr error\n\t\tpubKey     string\n\t\taddress    string\n\t}{\n\t\t{\n\t\t\tname:      \"test vector 1 master node private\",\n\t\t\textKey:    \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\",\n\t\t\tisPrivate: true,\n\t\t\tparentFP:  0,\n\t\t\tchainCode: []byte{135, 61, 255, 129, 192, 47, 82, 86, 35, 253, 31, 229, 22, 126, 172, 58, 85, 160, 73, 222, 61, 49, 75, 180, 46, 226, 39, 255, 237, 55, 213, 8},\n\t\t\tchildNum:  0,\n\t\t\tprivKey:   \"e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35\",\n\t\t\tpubKey:    \"0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2\",\n\t\t\taddress:   \"15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma\",\n\t\t},\n\t\t{\n\t\t\tname:       \"test vector 1 chain m/0H/1/2H public\",\n\t\t\textKey:     \"xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5\",\n\t\t\tisPrivate:  false,\n\t\t\tparentFP:   3203769081,\n\t\t\tchainCode:  []byte{4, 70, 107, 156, 200, 225, 97, 233, 102, 64, 156, 165, 41, 134, 197, 132, 240, 126, 157, 200, 31, 115, 93, 182, 131, 195, 255, 110, 199, 177, 80, 63},\n\t\t\tchildNum:   2147483650,\n\t\t\tprivKeyErr: ErrNotPrivExtKey,\n\t\t\tpubKey:     \"0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2\",\n\t\t\taddress:    \"1NjxqbA9aZWnh17q1UW3rB4EPu79wDXj7x\",\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\tkey, err := NewKeyFromString(test.extKey)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"NewKeyFromString #%d (%s): unexpected \"+\n\t\t\t\t\"error: %v\", i, test.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif key.IsPrivate() != test.isPrivate {\n\t\t\tt.Errorf(\"IsPrivate #%d (%s): mismatched key type -- \"+\n\t\t\t\t\"want private %v, got private %v\", i, test.name,\n\t\t\t\ttest.isPrivate, key.IsPrivate())\n\t\t\tcontinue\n\t\t}\n\n\t\tparentFP := key.ParentFingerprint()\n\t\tif parentFP != test.parentFP {\n\t\t\tt.Errorf(\"ParentFingerprint #%d (%s): mismatched \"+\n\t\t\t\t\"parent fingerprint -- want %d, got %d\", i,\n\t\t\t\ttest.name, test.parentFP, parentFP)\n\t\t\tcontinue\n\t\t}\n\n\t\tchainCode := key.ChainCode()\n\t\tif !bytes.Equal(chainCode, test.chainCode) {\n\t\t\tt.Errorf(\"ChainCode #%d (%s): want %v, got %v\", i,\n\t\t\t\ttest.name, test.chainCode, chainCode)\n\t\t\tcontinue\n\t\t}\n\n\t\tchildIndex := key.ChildIndex()\n\t\tif childIndex != test.childNum {\n\t\t\tt.Errorf(\"ChildIndex #%d (%s): want %d, got %d\", i,\n\t\t\t\ttest.name, test.childNum, childIndex)\n\t\t\tcontinue\n\t\t}\n\n\t\tserializedKey := key.String()\n\t\tif serializedKey != test.extKey {\n\t\t\tt.Errorf(\"String #%d (%s): mismatched serialized key \"+\n\t\t\t\t\"-- want %s, got %s\", i, test.name, test.extKey,\n\t\t\t\tserializedKey)\n\t\t\tcontinue\n\t\t}\n\n\t\tprivKey, err := key.ECPrivKey()\n\t\tif !reflect.DeepEqual(err, test.privKeyErr) {\n\t\t\tt.Errorf(\"ECPrivKey #%d (%s): mismatched error: want \"+\n\t\t\t\t\"%v, got %v\", i, test.name, test.privKeyErr, err)\n\t\t\tcontinue\n\t\t}\n\t\tif test.privKeyErr == nil {\n\t\t\tprivKeyStr := hex.EncodeToString(privKey.Serialize())\n\t\t\tif privKeyStr != test.privKey {\n\t\t\t\tt.Errorf(\"ECPrivKey #%d (%s): mismatched \"+\n\t\t\t\t\t\"private key -- want %s, got %s\", i,\n\t\t\t\t\ttest.name, test.privKey, privKeyStr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tpubKey, err := key.ECPubKey()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"ECPubKey #%d (%s): unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tpubKeyStr := hex.EncodeToString(pubKey.SerializeCompressed())\n\t\tif pubKeyStr != test.pubKey {\n\t\t\tt.Errorf(\"ECPubKey #%d (%s): mismatched public key -- \"+\n\t\t\t\t\"want %s, got %s\", i, test.name, test.pubKey,\n\t\t\t\tpubKeyStr)\n\t\t\tcontinue\n\t\t}\n\n\t\taddr, err := key.Address(&chaincfg.MainNetParams)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Address #%d (%s): unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif addr.EncodeAddress() != test.address {\n\t\t\tt.Errorf(\"Address #%d (%s): mismatched address -- want \"+\n\t\t\t\t\"%s, got %s\", i, test.name, test.address,\n\t\t\t\taddr.EncodeAddress())\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestNet ensures the network related APIs work as intended.\nfunc TestNet(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tkey       string\n\t\torigNet   *chaincfg.Params\n\t\tnewNet    *chaincfg.Params\n\t\tnewPriv   string\n\t\tnewPub    string\n\t\tisPrivate bool\n\t}{\n\t\t// Private extended keys.\n\t\t{\n\t\t\tname:      \"mainnet -> simnet\",\n\t\t\tkey:       \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\",\n\t\t\torigNet:   &chaincfg.MainNetParams,\n\t\t\tnewNet:    &chaincfg.SimNetParams,\n\t\t\tnewPriv:   \"sprv8Erh3X3hFeKunvVdAGQQtambRPapECWiTDtvsTGdyrhzhbYgnSZajRRWbihzvq4AM4ivm6uso31VfKaukwJJUs3GYihXP8ebhMb3F2AHu3P\",\n\t\t\tnewPub:    \"spub4Tr3T2ab61tD1Qa6GHwRFiiKyRRJdfEZpSpXfqgFYCEyaPsqKysqHDjzSzMJSiUEGbcsG3w2SLMoTqn44B8x6u3MLRRkYfACTUBnHK79THk\",\n\t\t\tisPrivate: true,\n\t\t},\n\t\t{\n\t\t\tname:      \"simnet -> mainnet\",\n\t\t\tkey:       \"sprv8Erh3X3hFeKunvVdAGQQtambRPapECWiTDtvsTGdyrhzhbYgnSZajRRWbihzvq4AM4ivm6uso31VfKaukwJJUs3GYihXP8ebhMb3F2AHu3P\",\n\t\t\torigNet:   &chaincfg.SimNetParams,\n\t\t\tnewNet:    &chaincfg.MainNetParams,\n\t\t\tnewPriv:   \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\",\n\t\t\tnewPub:    \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n\t\t\tisPrivate: true,\n\t\t},\n\t\t{\n\t\t\tname:      \"mainnet -> regtest\",\n\t\t\tkey:       \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\",\n\t\t\torigNet:   &chaincfg.MainNetParams,\n\t\t\tnewNet:    &chaincfg.RegressionNetParams,\n\t\t\tnewPriv:   \"tprv8ZgxMBicQKsPeDgjzdC36fs6bMjGApWDNLR9erAXMs5skhMv36j9MV5ecvfavji5khqjWaWSFhN3YcCUUdiKH6isR4Pwy3U5y5egddBr16m\",\n\t\t\tnewPub:    \"tpubD6NzVbkrYhZ4XgiXtGrdW5XDAPFCL9h7we1vwNCpn8tGbBcgfVYjXyhWo4E1xkh56hjod1RhGjxbaTLV3X4FyWuejifB9jusQ46QzG87VKp\",\n\t\t\tisPrivate: true,\n\t\t},\n\t\t{\n\t\t\tname:      \"regtest -> mainnet\",\n\t\t\tkey:       \"tprv8ZgxMBicQKsPeDgjzdC36fs6bMjGApWDNLR9erAXMs5skhMv36j9MV5ecvfavji5khqjWaWSFhN3YcCUUdiKH6isR4Pwy3U5y5egddBr16m\",\n\t\t\torigNet:   &chaincfg.RegressionNetParams,\n\t\t\tnewNet:    &chaincfg.MainNetParams,\n\t\t\tnewPriv:   \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\",\n\t\t\tnewPub:    \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n\t\t\tisPrivate: true,\n\t\t},\n\n\t\t// Public extended keys.\n\t\t{\n\t\t\tname:      \"mainnet -> simnet\",\n\t\t\tkey:       \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n\t\t\torigNet:   &chaincfg.MainNetParams,\n\t\t\tnewNet:    &chaincfg.SimNetParams,\n\t\t\tnewPub:    \"spub4Tr3T2ab61tD1Qa6GHwRFiiKyRRJdfEZpSpXfqgFYCEyaPsqKysqHDjzSzMJSiUEGbcsG3w2SLMoTqn44B8x6u3MLRRkYfACTUBnHK79THk\",\n\t\t\tisPrivate: false,\n\t\t},\n\t\t{\n\t\t\tname:      \"simnet -> mainnet\",\n\t\t\tkey:       \"spub4Tr3T2ab61tD1Qa6GHwRFiiKyRRJdfEZpSpXfqgFYCEyaPsqKysqHDjzSzMJSiUEGbcsG3w2SLMoTqn44B8x6u3MLRRkYfACTUBnHK79THk\",\n\t\t\torigNet:   &chaincfg.SimNetParams,\n\t\t\tnewNet:    &chaincfg.MainNetParams,\n\t\t\tnewPub:    \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n\t\t\tisPrivate: false,\n\t\t},\n\t\t{\n\t\t\tname:      \"mainnet -> regtest\",\n\t\t\tkey:       \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n\t\t\torigNet:   &chaincfg.MainNetParams,\n\t\t\tnewNet:    &chaincfg.RegressionNetParams,\n\t\t\tnewPub:    \"tpubD6NzVbkrYhZ4XgiXtGrdW5XDAPFCL9h7we1vwNCpn8tGbBcgfVYjXyhWo4E1xkh56hjod1RhGjxbaTLV3X4FyWuejifB9jusQ46QzG87VKp\",\n\t\t\tisPrivate: false,\n\t\t},\n\t\t{\n\t\t\tname:      \"regtest -> mainnet\",\n\t\t\tkey:       \"tpubD6NzVbkrYhZ4XgiXtGrdW5XDAPFCL9h7we1vwNCpn8tGbBcgfVYjXyhWo4E1xkh56hjod1RhGjxbaTLV3X4FyWuejifB9jusQ46QzG87VKp\",\n\t\t\torigNet:   &chaincfg.RegressionNetParams,\n\t\t\tnewNet:    &chaincfg.MainNetParams,\n\t\t\tnewPub:    \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n\t\t\tisPrivate: false,\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\textKey, err := NewKeyFromString(test.key)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"NewKeyFromString #%d (%s): unexpected error \"+\n\t\t\t\t\"creating extended key: %v\", i, test.name,\n\t\t\t\terr)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !extKey.IsForNet(test.origNet) {\n\t\t\tt.Errorf(\"IsForNet #%d (%s): key is not for expected \"+\n\t\t\t\t\"network %v\", i, test.name, test.origNet.Name)\n\t\t\tcontinue\n\t\t}\n\n\t\textKey.SetNet(test.newNet)\n\t\tif !extKey.IsForNet(test.newNet) {\n\t\t\tt.Errorf(\"SetNet/IsForNet #%d (%s): key is not for \"+\n\t\t\t\t\"expected network %v\", i, test.name,\n\t\t\t\ttest.newNet.Name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif test.isPrivate {\n\t\t\tprivStr := extKey.String()\n\t\t\tif privStr != test.newPriv {\n\t\t\t\tt.Errorf(\"Serialize #%d (%s): mismatched serialized \"+\n\t\t\t\t\t\"private extended key -- got: %s, want: %s\", i,\n\t\t\t\t\ttest.name, privStr, test.newPriv)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\textKey, err = extKey.Neuter()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Neuter #%d (%s): unexpected error: %v \", i,\n\t\t\t\t\ttest.name, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tpubStr := extKey.String()\n\t\tif pubStr != test.newPub {\n\t\t\tt.Errorf(\"Neuter #%d (%s): mismatched serialized \"+\n\t\t\t\t\"public extended key -- got: %s, want: %s\", i,\n\t\t\t\ttest.name, pubStr, test.newPub)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestErrors performs some negative tests for various invalid cases to ensure\n// the errors are handled properly.\nfunc TestErrors(t *testing.T) {\n\t// Should get an error when seed has too few bytes.\n\tnet := &chaincfg.MainNetParams\n\t_, err := NewMaster(bytes.Repeat([]byte{0x00}, 15), net)\n\tif err != ErrInvalidSeedLen {\n\t\tt.Fatalf(\"NewMaster: mismatched error -- got: %v, want: %v\",\n\t\t\terr, ErrInvalidSeedLen)\n\t}\n\n\t// Should get an error when seed has too many bytes.\n\t_, err = NewMaster(bytes.Repeat([]byte{0x00}, 65), net)\n\tif err != ErrInvalidSeedLen {\n\t\tt.Fatalf(\"NewMaster: mismatched error -- got: %v, want: %v\",\n\t\t\terr, ErrInvalidSeedLen)\n\t}\n\n\t// Generate a new key and neuter it to a public extended key.\n\tseed, err := GenerateSeed(RecommendedSeedLen)\n\tif err != nil {\n\t\tt.Fatalf(\"GenerateSeed: unexpected error: %v\", err)\n\t}\n\textKey, err := NewMaster(seed, net)\n\tif err != nil {\n\t\tt.Fatalf(\"NewMaster: unexpected error: %v\", err)\n\t}\n\tpubKey, err := extKey.Neuter()\n\tif err != nil {\n\t\tt.Fatalf(\"Neuter: unexpected error: %v\", err)\n\t}\n\n\t// Deriving a hardened child extended key should fail from a public key.\n\t_, err = pubKey.Derive(HardenedKeyStart)\n\tif err != ErrDeriveHardFromPublic {\n\t\tt.Fatalf(\"Derive: mismatched error -- got: %v, want: %v\",\n\t\t\terr, ErrDeriveHardFromPublic)\n\t}\n\n\t// NewKeyFromString failure tests.\n\ttests := []struct {\n\t\tname      string\n\t\tkey       string\n\t\terr       error\n\t\tneuter    bool\n\t\tneuterErr error\n\t}{\n\t\t{\n\t\t\tname: \"invalid key length\",\n\t\t\tkey:  \"xpub1234\",\n\t\t\terr:  ErrInvalidKeyLen,\n\t\t},\n\t\t{\n\t\t\tname: \"bad checksum\",\n\t\t\tkey:  \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EBygr15\",\n\t\t\terr:  ErrBadChecksum,\n\t\t},\n\t\t{\n\t\t\tname: \"pubkey not on curve\",\n\t\t\tkey:  \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ1hr9Rwbk95YadvBkQXxzHBSngB8ndpW6QH7zhhsXZ2jHyZqPjk\",\n\t\t\terr:  secp_ecdsa.ErrPubKeyNotOnCurve,\n\t\t},\n\t\t{\n\t\t\tname:      \"unsupported version\",\n\t\t\tkey:       \"xbad4LfUL9eKmA66w2GJdVMqhvDmYGJpTGjWRAtjHqoUY17sGaymoMV9Cm3ocn9Ud6Hh2vLFVC7KSKCRVVrqc6dsEdsTjRV1WUmkK85YEUujAPX\",\n\t\t\terr:       nil,\n\t\t\tneuter:    true,\n\t\t\tneuterErr: chaincfg.ErrUnknownHDKeyID,\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\textKey, err := NewKeyFromString(test.key)\n\t\tif !errors.Is(err, test.err) {\n\t\t\tt.Errorf(\"NewKeyFromString #%d (%s): mismatched error \"+\n\t\t\t\t\"-- got: %v, want: %v\", i, test.name, err,\n\t\t\t\ttest.err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif test.neuter {\n\t\t\t_, err := extKey.Neuter()\n\t\t\tif !errors.Is(err, test.neuterErr) {\n\t\t\t\tt.Errorf(\"Neuter #%d (%s): mismatched error \"+\n\t\t\t\t\t\"-- got: %v, want: %v\", i, test.name,\n\t\t\t\t\terr, test.neuterErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestZero ensures that zeroing an extended key works as intended.\nfunc TestZero(t *testing.T) {\n\ttests := []struct {\n\t\tname   string\n\t\tmaster string\n\t\textKey string\n\t\tnet    *chaincfg.Params\n\t}{\n\t\t// Test vector 1\n\t\t{\n\t\t\tname:   \"test vector 1 chain m\",\n\t\t\tmaster: \"000102030405060708090a0b0c0d0e0f\",\n\t\t\textKey: \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\",\n\t\t\tnet:    &chaincfg.MainNetParams,\n\t\t},\n\n\t\t// Test vector 2\n\t\t{\n\t\t\tname:   \"test vector 2 chain m\",\n\t\t\tmaster: \"fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542\",\n\t\t\textKey: \"xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U\",\n\t\t\tnet:    &chaincfg.MainNetParams,\n\t\t},\n\t}\n\n\t// Use a closure to test that a key is zeroed since the tests create\n\t// keys in different ways and need to test the same things multiple\n\t// times.\n\ttestZeroed := func(i int, testName string, key *ExtendedKey) bool {\n\t\t// Zeroing a key should result in it no longer being private\n\t\tif key.IsPrivate() {\n\t\t\tt.Errorf(\"IsPrivate #%d (%s): mismatched key type -- \"+\n\t\t\t\t\"want private %v, got private %v\", i, testName,\n\t\t\t\tfalse, key.IsPrivate())\n\t\t\treturn false\n\t\t}\n\n\t\tparentFP := key.ParentFingerprint()\n\t\tif parentFP != 0 {\n\t\t\tt.Errorf(\"ParentFingerprint #%d (%s): mismatched \"+\n\t\t\t\t\"parent fingerprint -- want %d, got %d\", i,\n\t\t\t\ttestName, 0, parentFP)\n\t\t\treturn false\n\t\t}\n\n\t\twantKey := \"zeroed extended key\"\n\t\tserializedKey := key.String()\n\t\tif serializedKey != wantKey {\n\t\t\tt.Errorf(\"String #%d (%s): mismatched serialized key \"+\n\t\t\t\t\"-- want %s, got %s\", i, testName, wantKey,\n\t\t\t\tserializedKey)\n\t\t\treturn false\n\t\t}\n\n\t\twantErr := ErrNotPrivExtKey\n\t\t_, err := key.ECPrivKey()\n\t\tif !reflect.DeepEqual(err, wantErr) {\n\t\t\tt.Errorf(\"ECPrivKey #%d (%s): mismatched error: want \"+\n\t\t\t\t\"%v, got %v\", i, testName, wantErr, err)\n\t\t\treturn false\n\t\t}\n\n\t\twantErr = secp_ecdsa.ErrPubKeyInvalidLen\n\t\t_, err = key.ECPubKey()\n\t\tif !errors.Is(err, wantErr) {\n\t\t\tt.Errorf(\"ECPubKey #%d (%s): mismatched error: want \"+\n\t\t\t\t\"%v, got %v\", i, testName, wantErr, err)\n\t\t\treturn false\n\t\t}\n\n\t\twantAddr := \"1HT7xU2Ngenf7D4yocz2SAcnNLW7rK8d4E\"\n\t\taddr, err := key.Address(&chaincfg.MainNetParams)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Address #%d (%s): unexpected error: %v\", i,\n\t\t\t\ttestName, err)\n\t\t\treturn false\n\t\t}\n\t\tif addr.EncodeAddress() != wantAddr {\n\t\t\tt.Errorf(\"Address #%d (%s): mismatched address -- want \"+\n\t\t\t\t\"%s, got %s\", i, testName, wantAddr,\n\t\t\t\taddr.EncodeAddress())\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}\n\n\tfor i, test := range tests {\n\t\t// Create new key from seed and get the neutered version.\n\t\tmasterSeed, err := hex.DecodeString(test.master)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"DecodeString #%d (%s): unexpected error: %v\",\n\t\t\t\ti, test.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tkey, err := NewMaster(masterSeed, test.net)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"NewMaster #%d (%s): unexpected error when \"+\n\t\t\t\t\"creating new master key: %v\", i, test.name,\n\t\t\t\terr)\n\t\t\tcontinue\n\t\t}\n\t\tneuteredKey, err := key.Neuter()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Neuter #%d (%s): unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure both non-neutered and neutered keys are zeroed\n\t\t// properly.\n\t\tkey.Zero()\n\t\tif !testZeroed(i, test.name+\" from seed not neutered\", key) {\n\t\t\tcontinue\n\t\t}\n\t\tneuteredKey.Zero()\n\t\tif !testZeroed(i, test.name+\" from seed neutered\", key) {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Deserialize key and get the neutered version.\n\t\tkey, err = NewKeyFromString(test.extKey)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"NewKeyFromString #%d (%s): unexpected \"+\n\t\t\t\t\"error: %v\", i, test.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tneuteredKey, err = key.Neuter()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Neuter #%d (%s): unexpected error: %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure both non-neutered and neutered keys are zeroed\n\t\t// properly.\n\t\tkey.Zero()\n\t\tif !testZeroed(i, test.name+\" deserialized not neutered\", key) {\n\t\t\tcontinue\n\t\t}\n\t\tneuteredKey.Zero()\n\t\tif !testZeroed(i, test.name+\" deserialized neutered\", key) {\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMaximumDepth ensures that attempting to retrieve a child key when already\n// at the maximum depth is not allowed.  The serialization of a BIP32 key uses\n// uint8 to encode the depth.  This implicitly bounds the depth of the tree to\n// 255 derivations.  Here we test that an error is returned after 'max uint8'.\nfunc TestMaximumDepth(t *testing.T) {\n\tnet := &chaincfg.MainNetParams\n\textKey, err := NewMaster([]byte(`abcd1234abcd1234abcd1234abcd1234`), net)\n\tif err != nil {\n\t\tt.Fatalf(\"NewMaster: unexpected error: %v\", err)\n\t}\n\n\tfor i := uint8(0); i < math.MaxUint8; i++ {\n\t\tif extKey.Depth() != i {\n\t\t\tt.Fatalf(\"extendedkey depth %d should match expected value %d\",\n\t\t\t\textKey.Depth(), i)\n\t\t}\n\t\tnewKey, err := extKey.Derive(1)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Derive: unexpected error: %v\", err)\n\t\t}\n\t\textKey = newKey\n\t}\n\n\tnoKey, err := extKey.Derive(1)\n\tif err != ErrDeriveBeyondMaxDepth {\n\t\tt.Fatalf(\"Derive: mismatched error: want %v, got %v\",\n\t\t\tErrDeriveBeyondMaxDepth, err)\n\t}\n\tif noKey != nil {\n\t\tt.Fatal(\"Derive: deriving 256th key should not succeed\")\n\t}\n}\n\n// TestCloneWithVersion ensures proper conversion between standard and SLIP132\n// extended keys.\n//\n// The following tool was used for generating the tests:\n//\n//\thttps://jlopp.github.io/xpub-converter\nfunc TestCloneWithVersion(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\tkey     string\n\t\tversion []byte\n\t\twant    string\n\t\twantErr error\n\t}{\n\t\t{\n\t\t\tname:    \"test xpub to zpub\",\n\t\t\tkey:     \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n\t\t\tversion: []byte{0x04, 0xb2, 0x47, 0x46},\n\t\t\twant:    \"zpub6jftahH18ngZxUuv6oSniLNrBCSSE1B4EEU59bwTCEt8x6aS6b2mdfLxbS4QS53g85SWWP6wexqeer516433gYpZQoJie2tcMYdJ1SYYYAL\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test zpub to xpub\",\n\t\t\tkey:     \"zpub6jftahH18ngZxUuv6oSniLNrBCSSE1B4EEU59bwTCEt8x6aS6b2mdfLxbS4QS53g85SWWP6wexqeer516433gYpZQoJie2tcMYdJ1SYYYAL\",\n\t\t\tversion: []byte{0x04, 0x88, 0xb2, 0x1e},\n\t\t\twant:    \"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test xprv to zprv\",\n\t\t\tkey:     \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\",\n\t\t\tversion: []byte{0x04, 0xb2, 0x43, 0x0c},\n\t\t\twant:    \"zprvAWgYBBk7JR8GjzqSzmunMCS7dAbwpYTCs1YUMDXqduMA5JFHZ3iX5s2UkAR6vBdcCYYa1S5o1fVLrKsrnpCQ4WpUd6aVUWP1bS2Yy5DoaKv\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test zprv to xprv\",\n\t\t\tkey:     \"zprvAWgYBBk7JR8GjzqSzmunMCS7dAbwpYTCs1YUMDXqduMA5JFHZ3iX5s2UkAR6vBdcCYYa1S5o1fVLrKsrnpCQ4WpUd6aVUWP1bS2Yy5DoaKv\",\n\t\t\tversion: []byte{0x04, 0x88, 0xad, 0xe4},\n\t\t\twant:    \"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi\",\n\t\t},\n\t\t{\n\t\t\tname:    \"test invalid key id\",\n\t\t\tkey:     \"zprvAWgYBBk7JR8GjzqSzmunMCS7dAbwpYTCs1YUMDXqduMA5JFHZ3iX5s2UkAR6vBdcCYYa1S5o1fVLrKsrnpCQ4WpUd6aVUWP1bS2Yy5DoaKv\",\n\t\t\tversion: []byte{0x4B, 0x1D},\n\t\t\twantErr: chaincfg.ErrUnknownHDKeyID,\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\textKey, err := NewKeyFromString(test.key)\n\t\tif err != nil {\n\t\t\tpanic(err) // This is never expected to fail.\n\t\t}\n\n\t\tgot, err := extKey.CloneWithVersion(test.version)\n\t\tif !reflect.DeepEqual(err, test.wantErr) {\n\t\t\tt.Errorf(\"CloneWithVersion #%d (%s): unexpected error -- \"+\n\t\t\t\t\"want %v, got %v\", i, test.name, test.wantErr, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif test.wantErr == nil {\n\t\t\tif k := got.String(); k != test.want {\n\t\t\t\tt.Errorf(\"CloneWithVersion #%d (%s): \"+\n\t\t\t\t\t\"got %s, want %s\", i, test.name, k, test.want)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestLeadingZero ensures that deriving children from keys with a leading zero byte is done according\n// to the BIP-32 standard and that the legacy method generates a backwards-compatible result.\nfunc TestLeadingZero(t *testing.T) {\n\t// The 400th seed results in a m/0' public key with a leading zero, allowing us to test\n\t// the desired behavior.\n\tii := 399\n\tseed := make([]byte, 32)\n\tbinary.BigEndian.PutUint32(seed[28:], uint32(ii))\n\tmasterKey, err := NewMaster(seed, &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"hdkeychain.NewMaster failed: %v\", err)\n\t}\n\tchild0, err := masterKey.Derive(0 + HardenedKeyStart)\n\tif err != nil {\n\t\tt.Fatalf(\"masterKey.Derive failed: %v\", err)\n\t}\n\tif !child0.IsAffectedByIssue172() {\n\t\tt.Fatal(\"expected child0 to be affected by issue 172\")\n\t}\n\tchild1, err := child0.Derive(0 + HardenedKeyStart)\n\tif err != nil {\n\t\tt.Fatalf(\"child0.Derive failed: %v\", err)\n\t}\n\tif child1.IsAffectedByIssue172() {\n\t\tt.Fatal(\"did not expect child1 to be affected by issue 172\")\n\t}\n\n\tchild1nonstandard, err := child0.DeriveNonStandard(0 + HardenedKeyStart)\n\tif err != nil {\n\t\tt.Fatalf(\"child0.DeriveNonStandard failed: %v\", err)\n\t}\n\n\t// This is the correct result based on BIP32\n\tif hex.EncodeToString(child1.key) != \"a9b6b30a5b90b56ed48728c73af1d8a7ef1e9cc372ec21afcc1d9bdf269b0988\" {\n\t\tt.Error(\"incorrect standard BIP32 derivation\")\n\t}\n\n\tif hex.EncodeToString(child1nonstandard.key) != \"ea46d8f58eb863a2d371a938396af8b0babe85c01920f59a8044412e70e837ee\" {\n\t\tt.Error(\"incorrect btcutil backwards compatible BIP32-like derivation\")\n\t}\n\n\tif !child0.IsAffectedByIssue172() {\n\t\tt.Error(\"child 0 should be affected by issue 172\")\n\t}\n\n\tif child1.IsAffectedByIssue172() {\n\t\tt.Error(\"child 1 should not be affected by issue 172\")\n\t}\n}\n"
  },
  {
    "path": "btcutil/hdkeychain/test_coverage.txt",
    "content": "\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.String\t\t 100.00% (18/18)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.Zero\t\t 100.00% (9/9)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.pubKeyBytes\t 100.00% (7/7)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.Neuter\t\t 100.00% (6/6)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.ECPrivKey\t\t 100.00% (4/4)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t zero\t\t\t\t 100.00% (3/3)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.SetNet\t\t 100.00% (3/3)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.Address\t\t 100.00% (2/2)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t newExtendedKey\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.IsPrivate\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.ParentFingerprint\t 100.00% (1/1)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.ECPubKey\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.IsForNet\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t NewKeyFromString\t\t 95.83% (23/24)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t ExtendedKey.Child\t\t 91.67% (33/36)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t NewMaster\t\t\t 91.67% (11/12)\ngithub.com/conformal/btcutil/hdkeychain/extendedkey.go\t GenerateSeed\t\t\t 85.71% (6/7)\ngithub.com/conformal/btcutil/hdkeychain\t\t\t -----------------------------\t 95.59% (130/136)\n\n"
  },
  {
    "path": "btcutil/internal_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nThis test file is part of the btcutil package rather than than the\nbtcutil_test package so it can bridge access to the internals to properly test\ncases which are either not possible or can't reliably be tested via the public\ninterface. The functions are only exported while the tests are being run.\n*/\n\npackage btcutil\n\nimport (\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcutil/base58\"\n\t\"github.com/btcsuite/btcd/btcutil/bech32\"\n\t\"golang.org/x/crypto/ripemd160\"\n)\n\n// SetBlockBytes sets the internal serialized block byte buffer to the passed\n// buffer.  It is used to inject errors and is only available to the test\n// package.\nfunc (b *Block) SetBlockBytes(buf []byte) {\n\tb.serializedBlock = buf\n}\n\n// TstAppDataDir makes the internal appDataDir function available to the test\n// package.\nfunc TstAppDataDir(goos, appName string, roaming bool) string {\n\treturn appDataDir(goos, appName, roaming)\n}\n\n// TstAddressPubKeyHash makes an AddressPubKeyHash, setting the\n// unexported fields with the parameters hash and netID.\nfunc TstAddressPubKeyHash(hash [ripemd160.Size]byte,\n\tnetID byte) *AddressPubKeyHash {\n\n\treturn &AddressPubKeyHash{\n\t\thash:  hash,\n\t\tnetID: netID,\n\t}\n}\n\n// TstAddressScriptHash makes an AddressScriptHash, setting the\n// unexported fields with the parameters hash and netID.\nfunc TstAddressScriptHash(hash [ripemd160.Size]byte,\n\tnetID byte) *AddressScriptHash {\n\n\treturn &AddressScriptHash{\n\t\thash:  hash,\n\t\tnetID: netID,\n\t}\n}\n\n// TstAddressWitnessPubKeyHash creates an AddressWitnessPubKeyHash, initiating\n// the fields as given.\nfunc TstAddressWitnessPubKeyHash(version byte, program [20]byte,\n\thrp string) *AddressWitnessPubKeyHash {\n\n\treturn &AddressWitnessPubKeyHash{\n\t\tAddressSegWit{\n\t\t\thrp:            hrp,\n\t\t\twitnessVersion: version,\n\t\t\twitnessProgram: program[:],\n\t\t},\n\t}\n}\n\n// TstAddressWitnessScriptHash creates an AddressWitnessScriptHash, initiating\n// the fields as given.\nfunc TstAddressWitnessScriptHash(version byte, program [32]byte,\n\thrp string) *AddressWitnessScriptHash {\n\n\treturn &AddressWitnessScriptHash{\n\t\tAddressSegWit{\n\t\t\thrp:            hrp,\n\t\t\twitnessVersion: version,\n\t\t\twitnessProgram: program[:],\n\t\t},\n\t}\n}\n\n// TstAddressTaproot creates an AddressTaproot, initiating the fields as given.\nfunc TstAddressTaproot(version byte, program [32]byte,\n\thrp string) *AddressTaproot {\n\n\treturn &AddressTaproot{\n\t\tAddressSegWit{\n\t\t\thrp:            hrp,\n\t\t\twitnessVersion: version,\n\t\t\twitnessProgram: program[:],\n\t\t},\n\t}\n}\n\n// TstAddressPubKey makes an AddressPubKey, setting the unexported fields with\n// the parameters.\nfunc TstAddressPubKey(serializedPubKey []byte, pubKeyFormat PubKeyFormat,\n\tnetID byte) *AddressPubKey {\n\n\tpubKey, _ := btcec.ParsePubKey(serializedPubKey)\n\treturn &AddressPubKey{\n\t\tpubKeyFormat: pubKeyFormat,\n\t\tpubKey:       pubKey,\n\t\tpubKeyHashID: netID,\n\t}\n}\n\n// TstAddressSAddr returns the expected script address bytes for\n// P2PKH and P2SH bitcoin addresses.\nfunc TstAddressSAddr(addr string) []byte {\n\tdecoded := base58.Decode(addr)\n\treturn decoded[1 : 1+ripemd160.Size]\n}\n\n// TstAddressSegwitSAddr returns the expected witness program bytes for\n// bech32 encoded P2WPKH and P2WSH bitcoin addresses.\nfunc TstAddressSegwitSAddr(addr string) []byte {\n\t_, data, err := bech32.Decode(addr)\n\tif err != nil {\n\t\treturn []byte{}\n\t}\n\n\t// First byte is version, rest is base 32 encoded data.\n\tdata, err = bech32.ConvertBits(data[1:], 5, 8, false)\n\tif err != nil {\n\t\treturn []byte{}\n\t}\n\treturn data\n}\n\n// TstAddressTaprootSAddr returns the expected witness program bytes for a\n// bech32m encoded P2TR bitcoin address.\nfunc TstAddressTaprootSAddr(addr string) []byte {\n\t_, data, err := bech32.Decode(addr)\n\tif err != nil {\n\t\treturn []byte{}\n\t}\n\n\t// First byte is version, rest is base 32 encoded data.\n\tdata, err = bech32.ConvertBits(data[1:], 5, 8, false)\n\tif err != nil {\n\t\treturn []byte{}\n\t}\n\treturn data\n}\n"
  },
  {
    "path": "btcutil/net.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n//go:build !appengine\n// +build !appengine\n\npackage btcutil\n\nimport (\n\t\"net\"\n)\n\n// interfaceAddrs returns a list of the system's network interface addresses.\n// It is wrapped here so that we can substitute it for other functions when\n// building for systems that do not allow access to net.InterfaceAddrs().\nfunc interfaceAddrs() ([]net.Addr, error) {\n\treturn net.InterfaceAddrs()\n}\n"
  },
  {
    "path": "btcutil/net_noop.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n//go:build appengine\n// +build appengine\n\npackage btcutil\n\nimport (\n\t\"net\"\n)\n\n// interfaceAddrs returns a list of the system's network interface addresses.\n// It is wrapped here so that we can substitute it for a no-op function that\n// returns an empty slice of net.Addr when building for systems that do not\n// allow access to net.InterfaceAddrs().\nfunc interfaceAddrs() ([]net.Addr, error) {\n\treturn []net.Addr{}, nil\n}\n"
  },
  {
    "path": "btcutil/psbt/bip32.go",
    "content": "package psbt\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\n\t\"github.com/btcsuite/btcd/btcutil/base58\"\n\t\"github.com/btcsuite/btcd/btcutil/hdkeychain\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nconst (\n\t// uint32Size is the size of a uint32 in bytes.\n\tuint32Size = 4\n)\n\n// Bip32Derivation encapsulates the data for the input and output\n// Bip32Derivation key-value fields.\n//\n// TODO(roasbeef): use hdkeychain here instead?\ntype Bip32Derivation struct {\n\t// PubKey is the raw pubkey serialized in compressed format.\n\tPubKey []byte\n\n\t// MasterKeyFingerprint is the fingerprint of the master pubkey.\n\tMasterKeyFingerprint uint32\n\n\t// Bip32Path is the BIP 32 path with child index as a distinct integer.\n\tBip32Path []uint32\n}\n\n// checkValid ensures that the PubKey in the Bip32Derivation struct is valid.\nfunc (pb *Bip32Derivation) checkValid() bool {\n\treturn validatePubkey(pb.PubKey)\n}\n\n// Bip32Sorter implements sort.Interface for the Bip32Derivation struct.\ntype Bip32Sorter []*Bip32Derivation\n\nfunc (s Bip32Sorter) Len() int { return len(s) }\n\nfunc (s Bip32Sorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] }\n\nfunc (s Bip32Sorter) Less(i, j int) bool {\n\treturn bytes.Compare(s[i].PubKey, s[j].PubKey) < 0\n}\n\n// ReadBip32Derivation deserializes a byte slice containing chunks of 4 byte\n// little endian encodings of uint32 values, the first of which is the\n// MasterKeyFingerprint and the remainder of which are the derivation path.\nfunc ReadBip32Derivation(path []byte) (uint32, []uint32, error) {\n\t// BIP-0174 defines the derivation path being encoded as\n\t//   \"<32-bit uint> <32-bit uint>*\"\n\t// with the asterisk meaning 0 to n times. Which in turn means that an\n\t// empty path is valid, only the key fingerprint is mandatory.\n\tif len(path) < uint32Size || len(path)%uint32Size != 0 {\n\t\treturn 0, nil, ErrInvalidPsbtFormat\n\t}\n\n\tmasterKeyInt := binary.LittleEndian.Uint32(path[:uint32Size])\n\n\tvar paths []uint32\n\tfor i := uint32Size; i < len(path); i += uint32Size {\n\t\tpaths = append(paths, binary.LittleEndian.Uint32(\n\t\t\tpath[i:i+uint32Size],\n\t\t))\n\t}\n\n\treturn masterKeyInt, paths, nil\n}\n\n// SerializeBIP32Derivation takes a master key fingerprint as defined in BIP32,\n// along with a path specified as a list of uint32 values, and returns a\n// bytestring specifying the derivation in the format required by BIP174: //\n// master key fingerprint (4) || child index (4) || child index (4) || ....\nfunc SerializeBIP32Derivation(masterKeyFingerprint uint32,\n\tbip32Path []uint32) []byte {\n\n\tvar masterKeyBytes [uint32Size]byte\n\tbinary.LittleEndian.PutUint32(masterKeyBytes[:], masterKeyFingerprint)\n\n\tderivationPath := make([]byte, 0, uint32Size+uint32Size*len(bip32Path))\n\tderivationPath = append(derivationPath, masterKeyBytes[:]...)\n\tfor _, path := range bip32Path {\n\t\tvar pathBytes [uint32Size]byte\n\t\tbinary.LittleEndian.PutUint32(pathBytes[:], path)\n\t\tderivationPath = append(derivationPath, pathBytes[:]...)\n\t}\n\n\treturn derivationPath\n}\n\n// XPub is a struct that encapsulates an extended public key, as defined in\n// BIP-0032.\ntype XPub struct {\n\t// ExtendedKey is the serialized extended public key as defined in\n\t// BIP-0032.\n\tExtendedKey []byte\n\n\t// MasterFingerprint is the fingerprint of the master pubkey.\n\tMasterKeyFingerprint uint32\n\n\t// Bip32Path is the derivation path of the key, with hardened elements\n\t// having the 0x80000000 offset added, as defined in BIP-0032. The\n\t// number of path elements must match the depth provided in the extended\n\t// public key.\n\tBip32Path []uint32\n}\n\n// ReadXPub deserializes a byte slice containing an extended public key and a\n// BIP-0032 derivation path.\nfunc ReadXPub(keyData []byte, path []byte) (*XPub, error) {\n\txPub, err := DecodeExtendedKey(keyData)\n\tif err != nil {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\tnumPathElements := xPub.Depth()\n\n\t// The path also contains the master key fingerprint,\n\texpectedSize := int(uint32Size * (numPathElements + 1))\n\tif len(path) != expectedSize {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\n\tmasterKeyFingerprint, bip32Path, err := ReadBip32Derivation(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &XPub{\n\t\tExtendedKey:          keyData,\n\t\tMasterKeyFingerprint: masterKeyFingerprint,\n\t\tBip32Path:            bip32Path,\n\t}, nil\n}\n\n// EncodeExtendedKey serializes an extended key to a byte slice, without the\n// checksum.\nfunc EncodeExtendedKey(key *hdkeychain.ExtendedKey) []byte {\n\tserializedKey := key.String()\n\tdecodedKey := base58.Decode(serializedKey)\n\treturn decodedKey[:len(decodedKey)-uint32Size]\n}\n\n// DecodeExtendedKey deserializes an extended key from a byte slice that does\n// not contain the checksum.\nfunc DecodeExtendedKey(encodedKey []byte) (*hdkeychain.ExtendedKey, error) {\n\tcheckSum := chainhash.DoubleHashB(encodedKey)[:uint32Size]\n\tserializedBytes := append(encodedKey, checkSum...)\n\txPub, err := hdkeychain.NewKeyFromString(base58.Encode(serializedBytes))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn xPub, nil\n}\n"
  },
  {
    "path": "btcutil/psbt/bip32_test.go",
    "content": "package psbt\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestReadBip32Derivation tests the ReadBip32Derivation function to ensure\n// it correctly deserializes the BIP32 derivation path and master key\n// fingerprint from a byte slice.\nfunc TestReadBip32Derivation(t *testing.T) {\n\ttests := []struct {\n\t\tname              string\n\t\tpath              []byte\n\t\texpectFingerprint uint32\n\t\texpectPath        []uint32\n\t\texpectErr         error\n\t}{\n\t\t{\n\t\t\tname: \"valid path with multiple derivations\",\n\t\t\tpath: []byte{\n\t\t\t\t0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n\t\t\t\t0x03, 0x00, 0x00, 0x00},\n\t\t\texpectFingerprint: 1,\n\t\t\texpectPath:        []uint32{2, 3},\n\t\t},\n\t\t{\n\t\t\tname: \"valid path with single derivation\",\n\t\t\tpath: []byte{\n\t\t\t\t0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n\t\t\t},\n\t\t\texpectFingerprint: 1,\n\t\t\texpectPath:        []uint32{2},\n\t\t},\n\t\t{\n\t\t\tname: \"valid path with no derivations\",\n\t\t\tpath: []byte{\n\t\t\t\t0x01, 0x00, 0x00, 0x00,\n\t\t\t},\n\t\t\texpectFingerprint: 1,\n\t\t\texpectPath:        nil,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid path length\",\n\t\t\tpath: []byte{\n\t\t\t\t0x01, 0x00, 0x00,\n\t\t\t},\n\t\t\texpectErr: ErrInvalidPsbtFormat,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid path length not multiple of 4\",\n\t\t\tpath: []byte{\n\t\t\t\t0x01, 0x00, 0x00, 0x00, 0x02,\n\t\t\t},\n\t\t\texpectErr: ErrInvalidPsbtFormat,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tfp, path, err := ReadBip32Derivation(tt.path)\n\t\t\tif tt.expectErr != nil {\n\t\t\t\trequire.ErrorIs(t, err, tt.expectErr)\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, tt.expectFingerprint, fp)\n\t\t\trequire.Equal(t, tt.expectPath, path)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "btcutil/psbt/creator.go",
    "content": "// Copyright (c) 2018 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage psbt\n\nimport (\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// MinTxVersion is the lowest transaction version that we'll permit.\nconst MinTxVersion = 1\n\n// New on provision of an input and output 'skeleton' for the transaction, a\n// new partially populated PBST packet. The populated packet will include the\n// unsigned transaction, and the set of known inputs and outputs contained\n// within the unsigned transaction.  The values of nLockTime, nSequence (per\n// input) and transaction version (must be 1 of 2) must be specified here. Note\n// that the default nSequence value is wire.MaxTxInSequenceNum.  Referencing\n// the PSBT BIP, this function serves the roles of the Creator.\nfunc New(inputs []*wire.OutPoint,\n\toutputs []*wire.TxOut, version int32, nLockTime uint32,\n\tnSequences []uint32) (*Packet, error) {\n\n\t// Create the new struct; the input and output lists will be empty, the\n\t// unsignedTx object must be constructed and serialized, and that\n\t// serialization should be entered as the only entry for the\n\t// globalKVPairs list.\n\t//\n\t// Ensure that the version of the transaction is greater then our\n\t// minimum allowed transaction version. There must be one sequence\n\t// number per input.\n\tif version < MinTxVersion || len(nSequences) != len(inputs) {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\n\tunsignedTx := wire.NewMsgTx(version)\n\tunsignedTx.LockTime = nLockTime\n\tfor i, in := range inputs {\n\t\tunsignedTx.AddTxIn(&wire.TxIn{\n\t\t\tPreviousOutPoint: *in,\n\t\t\tSequence:         nSequences[i],\n\t\t})\n\t}\n\tfor _, out := range outputs {\n\t\tunsignedTx.AddTxOut(out)\n\t}\n\n\t// The input and output lists are empty, but there is a list of those\n\t// two lists, and each one must be of length matching the unsigned\n\t// transaction; the unknown list can be nil.\n\tpInputs := make([]PInput, len(unsignedTx.TxIn))\n\tpOutputs := make([]POutput, len(unsignedTx.TxOut))\n\n\t// This new Psbt is \"raw\" and contains no key-value fields, so sanity\n\t// checking with c.Cpsbt.SanityCheck() is not required.\n\treturn &Packet{\n\t\tUnsignedTx: unsignedTx,\n\t\tInputs:     pInputs,\n\t\tOutputs:    pOutputs,\n\t\tUnknowns:   nil,\n\t}, nil\n}\n"
  },
  {
    "path": "btcutil/psbt/extractor.go",
    "content": "// Copyright (c) 2018 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage psbt\n\n// The Extractor requires provision of a single PSBT\n// in which all necessary signatures are encoded, and\n// uses it to construct a fully valid network serialized\n// transaction.\n\nimport (\n\t\"bytes\"\n\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// Extract takes a finalized psbt.Packet and outputs a finalized transaction\n// instance. Note that if the PSBT is in-complete, then an error\n// ErrIncompletePSBT will be returned. As the extracted transaction has been\n// fully finalized, it will be ready for network broadcast once returned.\nfunc Extract(p *Packet) (*wire.MsgTx, error) {\n\t// If the packet isn't complete, then we'll return an error as it\n\t// doesn't have all the required witness data.\n\tif !p.IsComplete() {\n\t\treturn nil, ErrIncompletePSBT\n\t}\n\n\t// First, we'll make a copy of the underlying unsigned transaction (the\n\t// initial template) so we don't mutate it during our activates below.\n\tfinalTx := p.UnsignedTx.Copy()\n\n\t// For each input, we'll now populate any relevant witness and\n\t// sigScript data.\n\tfor i, tin := range finalTx.TxIn {\n\t\t// We'll grab the corresponding internal packet input which\n\t\t// matches this materialized transaction input and emplace that\n\t\t// final sigScript (if present).\n\t\tpInput := p.Inputs[i]\n\t\tif pInput.FinalScriptSig != nil {\n\t\t\ttin.SignatureScript = pInput.FinalScriptSig\n\t\t}\n\n\t\t// Similarly, if there's a final witness, then we'll also need\n\t\t// to extract that as well, parsing the lower-level transaction\n\t\t// encoding.\n\t\tif pInput.FinalScriptWitness != nil {\n\t\t\t// In order to set the witness, need to re-deserialize\n\t\t\t// the field as encoded within the PSBT packet.  For\n\t\t\t// each input, the witness is encoded as a stack with\n\t\t\t// one or more items.\n\t\t\twitnessReader := bytes.NewReader(\n\t\t\t\tpInput.FinalScriptWitness,\n\t\t\t)\n\n\t\t\t// First we extract the number of witness elements\n\t\t\t// encoded in the above witnessReader.\n\t\t\twitCount, err := wire.ReadVarInt(witnessReader, 0)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\t// Now that we know how many inputs we'll need, we'll\n\t\t\t// construct a packing slice, then read out each input\n\t\t\t// (with a varint prefix) from the witnessReader.\n\t\t\ttin.Witness = make(wire.TxWitness, witCount)\n\t\t\tfor j := uint64(0); j < witCount; j++ {\n\t\t\t\twit, err := wire.ReadVarBytes(\n\t\t\t\t\twitnessReader, 0,\n\t\t\t\t\ttxscript.MaxScriptSize, \"witness\",\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\ttin.Witness[j] = wit\n\t\t\t}\n\t\t}\n\t}\n\n\treturn finalTx, nil\n}\n"
  },
  {
    "path": "btcutil/psbt/finalizer.go",
    "content": "// Copyright (c) 2018 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage psbt\n\n// The Finalizer requires provision of a single PSBT input\n// in which all necessary signatures are encoded, and\n// uses it to construct valid final sigScript and scriptWitness\n// fields.\n// NOTE that p2sh (legacy) and p2wsh currently support only\n// multisig and no other custom script.\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// isFinalized considers this input finalized if it contains at least one of\n// the FinalScriptSig or FinalScriptWitness are filled (which only occurs in a\n// successful call to Finalize*).\nfunc isFinalized(p *Packet, inIndex int) bool {\n\tinput := p.Inputs[inIndex]\n\treturn input.FinalScriptSig != nil || input.FinalScriptWitness != nil\n}\n\n// isFinalizableWitnessInput returns true if the target input is a witness UTXO\n// that can be finalized.\nfunc isFinalizableWitnessInput(pInput *PInput) bool {\n\tpkScript := pInput.WitnessUtxo.PkScript\n\n\tswitch {\n\t// If this is a native witness output, then we require both\n\t// the witness script, but not a redeem script.\n\tcase txscript.IsWitnessProgram(pkScript):\n\t\tswitch {\n\t\tcase txscript.IsPayToWitnessScriptHash(pkScript):\n\t\t\tif pInput.WitnessScript == nil ||\n\t\t\t\tpInput.RedeemScript != nil {\n\n\t\t\t\treturn false\n\t\t\t}\n\n\t\tcase txscript.IsPayToTaproot(pkScript):\n\t\t\tif pInput.TaprootKeySpendSig == nil &&\n\t\t\t\tpInput.TaprootScriptSpendSig == nil {\n\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\t// For each of the script spend signatures we need a\n\t\t\t// corresponding tap script leaf with the control block.\n\t\t\tfor _, sig := range pInput.TaprootScriptSpendSig {\n\t\t\t\t_, err := FindLeafScript(pInput, sig.LeafHash)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// A P2WKH output on the other hand doesn't need\n\t\t\t// neither a witnessScript or redeemScript.\n\t\t\tif pInput.WitnessScript != nil ||\n\t\t\t\tpInput.RedeemScript != nil {\n\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t// For nested P2SH inputs, we verify that a witness script is known.\n\tcase txscript.IsPayToScriptHash(pkScript):\n\t\tif pInput.RedeemScript == nil {\n\t\t\treturn false\n\t\t}\n\n\t\t// If this is a nested P2SH input, then it must also have a\n\t\t// witness script, while we don't need one for P2WKH.\n\t\tif txscript.IsPayToWitnessScriptHash(pInput.RedeemScript) {\n\t\t\tif pInput.WitnessScript == nil {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else if txscript.IsPayToWitnessPubKeyHash(pInput.RedeemScript) {\n\t\t\tif pInput.WitnessScript != nil {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\t// unrecognized type\n\t\t\treturn false\n\t\t}\n\n\t// If this isn't a nested P2SH output or a native witness output, then\n\t// we can't finalize this input as we don't understand it.\n\tdefault:\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// isFinalizableLegacyInput returns true of the passed input a legacy input\n// (non-witness) that can be finalized.\nfunc isFinalizableLegacyInput(p *Packet, pInput *PInput, inIndex int) bool {\n\t// If the input has a witness, then it's invalid.\n\tif pInput.WitnessScript != nil {\n\t\treturn false\n\t}\n\n\t// Otherwise, we'll verify that we only have a RedeemScript if the prev\n\t// output script is P2SH.\n\toutIndex := p.UnsignedTx.TxIn[inIndex].PreviousOutPoint.Index\n\tif txscript.IsPayToScriptHash(pInput.NonWitnessUtxo.TxOut[outIndex].PkScript) {\n\t\tif pInput.RedeemScript == nil {\n\t\t\treturn false\n\t\t}\n\t} else {\n\t\tif pInput.RedeemScript != nil {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// isFinalizable checks whether the structure of the entry for the input of the\n// psbt.Packet at index inIndex contains sufficient information to finalize\n// this input.\nfunc isFinalizable(p *Packet, inIndex int) bool {\n\tpInput := p.Inputs[inIndex]\n\n\t// The input cannot be finalized without any signatures.\n\tif pInput.PartialSigs == nil && pInput.TaprootKeySpendSig == nil &&\n\t\tpInput.TaprootScriptSpendSig == nil {\n\n\t\treturn false\n\t}\n\n\t// For an input to be finalized, we'll one of two possible top-level\n\t// UTXOs present. Each UTXO type has a distinct set of requirements to\n\t// be considered finalized.\n\tswitch {\n\n\t// A witness input must be either native P2WSH or nested P2SH with all\n\t// relevant sigScript or witness data populated.\n\tcase pInput.WitnessUtxo != nil:\n\t\tif !isFinalizableWitnessInput(&pInput) {\n\t\t\treturn false\n\t\t}\n\n\tcase pInput.NonWitnessUtxo != nil:\n\t\tif !isFinalizableLegacyInput(p, &pInput, inIndex) {\n\t\t\treturn false\n\t\t}\n\n\t// If neither a known UTXO type isn't present at all, then we'll\n\t// return false as we need one of them.\n\tdefault:\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// MaybeFinalize attempts to finalize the input at index inIndex in the PSBT p,\n// returning true with no error if it succeeds, OR if the input has already\n// been finalized.\nfunc MaybeFinalize(p *Packet, inIndex int) (bool, error) {\n\tif isFinalized(p, inIndex) {\n\t\treturn true, nil\n\t}\n\n\tif !isFinalizable(p, inIndex) {\n\t\treturn false, ErrNotFinalizable\n\t}\n\n\tif err := Finalize(p, inIndex); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn true, nil\n}\n\n// MaybeFinalizeAll attempts to finalize all inputs of the psbt.Packet that are\n// not already finalized, and returns an error if it fails to do so.\nfunc MaybeFinalizeAll(p *Packet) error {\n\tfor i := range p.UnsignedTx.TxIn {\n\t\tsuccess, err := MaybeFinalize(p, i)\n\t\tif err != nil || !success {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Finalize assumes that the provided psbt.Packet struct has all partial\n// signatures and redeem scripts/witness scripts already prepared for the\n// specified input, and so removes all temporary data and replaces them with\n// completed sigScript and witness fields, which are stored in key-types 07 and\n// 08. The witness/non-witness utxo fields in the inputs (key-types 00 and 01)\n// are left intact as they may be needed for validation (?).  If there is any\n// invalid or incomplete data, an error is returned.\nfunc Finalize(p *Packet, inIndex int) error {\n\tpInput := p.Inputs[inIndex]\n\n\t// Depending on the UTXO type, we either attempt to finalize it as a\n\t// witness or legacy UTXO.\n\tswitch {\n\tcase pInput.WitnessUtxo != nil:\n\t\tpkScript := pInput.WitnessUtxo.PkScript\n\n\t\tswitch {\n\t\tcase txscript.IsPayToTaproot(pkScript):\n\t\t\tif err := finalizeTaprootInput(p, inIndex); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\tif err := finalizeWitnessInput(p, inIndex); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\tcase pInput.NonWitnessUtxo != nil:\n\t\tif err := finalizeNonWitnessInput(p, inIndex); err != nil {\n\t\t\treturn err\n\t\t}\n\n\tdefault:\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\n\t// Before returning we sanity check the PSBT to ensure we don't extract\n\t// an invalid transaction or produce an invalid intermediate state.\n\tif err := p.SanityCheck(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// checkFinalScriptSigWitness checks whether a given input in the psbt.Packet\n// struct already has the fields 07 (FinalInScriptSig) or 08 (FinalInWitness).\n// If so, it returns true. It does not modify the Psbt.\nfunc checkFinalScriptSigWitness(p *Packet, inIndex int) bool {\n\tpInput := p.Inputs[inIndex]\n\n\tif pInput.FinalScriptSig != nil {\n\t\treturn true\n\t}\n\n\tif pInput.FinalScriptWitness != nil {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// finalizeNonWitnessInput attempts to create a PsbtInFinalScriptSig field for\n// the input at index inIndex, and removes all other fields except for the UTXO\n// field, for an input of type non-witness, or returns an error.\nfunc finalizeNonWitnessInput(p *Packet, inIndex int) error {\n\t// If this input has already been finalized, then we'll return an error\n\t// as we can't proceed.\n\tif checkFinalScriptSigWitness(p, inIndex) {\n\t\treturn ErrInputAlreadyFinalized\n\t}\n\n\t// Our goal here is to construct a sigScript given the pubkey,\n\t// signature (keytype 02), of which there might be multiple, and the\n\t// redeem script field (keytype 04) if present (note, it is not present\n\t// for p2pkh type inputs).\n\tvar sigScript []byte\n\n\tpInput := p.Inputs[inIndex]\n\tcontainsRedeemScript := pInput.RedeemScript != nil\n\n\tvar (\n\t\tpubKeys [][]byte\n\t\tsigs    [][]byte\n\t)\n\tfor _, ps := range pInput.PartialSigs {\n\t\tpubKeys = append(pubKeys, ps.PubKey)\n\n\t\tsigOK := checkSigHashFlags(ps.Signature, &pInput)\n\t\tif !sigOK {\n\t\t\treturn ErrInvalidSigHashFlags\n\t\t}\n\n\t\tsigs = append(sigs, ps.Signature)\n\t}\n\n\t// We have failed to identify at least 1 (sig, pub) pair in the PSBT,\n\t// which indicates it was not ready to be finalized. As a result, we\n\t// can't proceed.\n\tif len(sigs) < 1 || len(pubKeys) < 1 {\n\t\treturn ErrNotFinalizable\n\t}\n\n\t// If this input doesn't need a redeem script (P2PKH), then we'll\n\t// construct a simple sigScript that's just the signature then the\n\t// pubkey (OP_CHECKSIG).\n\tvar err error\n\tif !containsRedeemScript {\n\t\t// At this point, we should only have a single signature and\n\t\t// pubkey.\n\t\tif len(sigs) != 1 || len(pubKeys) != 1 {\n\t\t\treturn ErrNotFinalizable\n\t\t}\n\n\t\t// In this case, our sigScript is just: <sig> <pubkey>.\n\t\tbuilder := txscript.NewScriptBuilder()\n\t\tbuilder.AddData(sigs[0]).AddData(pubKeys[0])\n\t\tsigScript, err = builder.Script()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\t// This is assumed p2sh multisig Given redeemScript and pubKeys\n\t\t// we can decide in what order signatures must be appended.\n\t\torderedSigs, err := extractKeyOrderFromScript(\n\t\t\tpInput.RedeemScript, pubKeys, sigs,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// At this point, we assume that this is a mult-sig input, so\n\t\t// we construct our sigScript which looks something like this\n\t\t// (mind the extra element for the extra multi-sig pop):\n\t\t//  * <nil> <sigs...> <redeemScript>\n\t\t//\n\t\t// TODO(waxwing): the below is specific to the multisig case.\n\t\tbuilder := txscript.NewScriptBuilder()\n\t\tbuilder.AddOp(txscript.OP_FALSE)\n\t\tfor _, os := range orderedSigs {\n\t\t\tbuilder.AddData(os)\n\t\t}\n\t\tbuilder.AddData(pInput.RedeemScript)\n\t\tsigScript, err = builder.Script()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// At this point, a sigScript has been constructed.  Remove all fields\n\t// other than non-witness utxo (00) and finaliscriptsig (07)\n\tnewInput := NewPsbtInput(pInput.NonWitnessUtxo, nil)\n\tnewInput.FinalScriptSig = sigScript\n\n\t// Overwrite the entry in the input list at the correct index. Note\n\t// that this removes all the other entries in the list for this input\n\t// index.\n\tp.Inputs[inIndex] = *newInput\n\n\treturn nil\n}\n\n// finalizeWitnessInput attempts to create PsbtInFinalScriptSig field and\n// PsbtInFinalScriptWitness field for input at index inIndex, and removes all\n// other fields except for the utxo field, for an input of type witness, or\n// returns an error.\nfunc finalizeWitnessInput(p *Packet, inIndex int) error {\n\t// If this input has already been finalized, then we'll return an error\n\t// as we can't proceed.\n\tif checkFinalScriptSigWitness(p, inIndex) {\n\t\treturn ErrInputAlreadyFinalized\n\t}\n\n\t// Depending on the actual output type, we'll either populate a\n\t// serializedWitness or a witness as well asa sigScript.\n\tvar (\n\t\tsigScript         []byte\n\t\tserializedWitness []byte\n\t)\n\n\tpInput := p.Inputs[inIndex]\n\n\t// First we'll validate and collect the pubkey+sig pairs from the set\n\t// of partial signatures.\n\tvar (\n\t\tpubKeys [][]byte\n\t\tsigs    [][]byte\n\t)\n\tfor _, ps := range pInput.PartialSigs {\n\t\tpubKeys = append(pubKeys, ps.PubKey)\n\n\t\tsigOK := checkSigHashFlags(ps.Signature, &pInput)\n\t\tif !sigOK {\n\t\t\treturn ErrInvalidSigHashFlags\n\n\t\t}\n\n\t\tsigs = append(sigs, ps.Signature)\n\t}\n\n\t// If at this point, we don't have any pubkey+sig pairs, then we bail\n\t// as we can't proceed.\n\tif len(sigs) == 0 || len(pubKeys) == 0 {\n\t\treturn ErrNotFinalizable\n\t}\n\n\tcontainsRedeemScript := pInput.RedeemScript != nil\n\tcontainsWitnessScript := pInput.WitnessScript != nil\n\n\t// If there's no redeem script, then we assume that this is native\n\t// segwit input.\n\tvar err error\n\tif !containsRedeemScript {\n\t\t// If we have only a sigley pubkey+sig pair, and no witness\n\t\t// script, then we assume this is a P2WKH input.\n\t\tif len(pubKeys) == 1 && len(sigs) == 1 &&\n\t\t\t!containsWitnessScript {\n\n\t\t\tserializedWitness, err = writePKHWitness(\n\t\t\t\tsigs[0], pubKeys[0],\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\t// Otherwise, we must have a witnessScript field, so\n\t\t\t// we'll generate a valid multi-sig witness.\n\t\t\t//\n\t\t\t// NOTE: We tacitly assume multisig.\n\t\t\t//\n\t\t\t// TODO(roasbeef): need to add custom finalize for\n\t\t\t// non-multisig P2WSH outputs (HTLCs, delay outputs,\n\t\t\t// etc).\n\t\t\tif !containsWitnessScript {\n\t\t\t\treturn ErrNotFinalizable\n\t\t\t}\n\n\t\t\tserializedWitness, err = getMultisigScriptWitness(\n\t\t\t\tpInput.WitnessScript, pubKeys, sigs,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Otherwise, we assume that this is a p2wsh multi-sig output,\n\t\t// which is nested in a p2sh, or a p2wkh nested in a p2sh.\n\t\t//\n\t\t// In this case, we'll take the redeem script (the witness\n\t\t// program in this case), and push it on the stack within the\n\t\t// sigScript.\n\t\tbuilder := txscript.NewScriptBuilder()\n\t\tbuilder.AddData(pInput.RedeemScript)\n\t\tsigScript, err = builder.Script()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// If don't have a witness script, then we assume this is a\n\t\t// nested p2wkh output.\n\t\tif !containsWitnessScript {\n\t\t\t// Assumed p2sh-p2wkh Here the witness is just (sig,\n\t\t\t// pub) as for p2pkh case\n\t\t\tif len(sigs) != 1 || len(pubKeys) != 1 {\n\t\t\t\treturn ErrNotFinalizable\n\t\t\t}\n\n\t\t\tserializedWitness, err = writePKHWitness(\n\t\t\t\tsigs[0], pubKeys[0],\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t} else {\n\t\t\t// Otherwise, we assume that this is a p2wsh multi-sig,\n\t\t\t// so we generate the proper witness.\n\t\t\tserializedWitness, err = getMultisigScriptWitness(\n\t\t\t\tpInput.WitnessScript, pubKeys, sigs,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\t// At this point, a witness has been constructed, and a sigScript (if\n\t// nested; else it's []). Remove all fields other than witness utxo\n\t// (01) and finalscriptsig (07), finalscriptwitness (08).\n\tnewInput := NewPsbtInput(nil, pInput.WitnessUtxo)\n\tif len(sigScript) > 0 {\n\t\tnewInput.FinalScriptSig = sigScript\n\t}\n\n\tnewInput.FinalScriptWitness = serializedWitness\n\n\t// Finally, we overwrite the entry in the input list at the correct\n\t// index.\n\tp.Inputs[inIndex] = *newInput\n\treturn nil\n}\n\n// finalizeTaprootInput attempts to create PsbtInFinalScriptWitness field for\n// input at index inIndex, and removes all other fields except for the utxo\n// field, for an input of type p2tr, or returns an error.\nfunc finalizeTaprootInput(p *Packet, inIndex int) error {\n\t// If this input has already been finalized, then we'll return an error\n\t// as we can't proceed.\n\tif checkFinalScriptSigWitness(p, inIndex) {\n\t\treturn ErrInputAlreadyFinalized\n\t}\n\n\t// Any p2tr input will only have a witness script, no sig script.\n\tvar (\n\t\tserializedWitness []byte\n\t\terr               error\n\t\tpInput            = &p.Inputs[inIndex]\n\t)\n\n\t// What spend path did we take?\n\tswitch {\n\t// Key spend path.\n\tcase len(pInput.TaprootKeySpendSig) > 0:\n\t\tsig := pInput.TaprootKeySpendSig\n\n\t\t// Make sure TaprootKeySpendSig is equal to size of signature,\n\t\t// if not, we assume that sighash flag was appended to the\n\t\t// signature.\n\t\tif len(pInput.TaprootKeySpendSig) == schnorr.SignatureSize {\n\t\t\t// Append to the signature if flag is not equal to the\n\t\t\t// default sighash (that can be omitted).\n\t\t\tif pInput.SighashType != txscript.SigHashDefault {\n\t\t\t\tsigHashType := byte(pInput.SighashType)\n\t\t\t\tsig = append(sig, sigHashType)\n\t\t\t}\n\t\t}\n\t\tserializedWitness, err = writeWitness(sig)\n\n\t// Script spend path.\n\tcase len(pInput.TaprootScriptSpendSig) > 0:\n\t\tvar witnessStack wire.TxWitness\n\n\t\t// If there are multiple script spend signatures, we assume they\n\t\t// are from multiple signing participants for the same leaf\n\t\t// script that uses OP_CHECKSIGADD for multi-sig. Signing\n\t\t// multiple possible execution paths at the same time is\n\t\t// currently not supported by this library.\n\t\ttargetLeafHash := pInput.TaprootScriptSpendSig[0].LeafHash\n\t\tleafScript, err := FindLeafScript(pInput, targetLeafHash)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"control block for script spend \" +\n\t\t\t\t\"signature not found\")\n\t\t}\n\n\t\t// The witness stack will contain all signatures, followed by\n\t\t// the script itself and then the control block.\n\t\tfor idx, scriptSpendSig := range pInput.TaprootScriptSpendSig {\n\t\t\t// Make sure that if there are indeed multiple\n\t\t\t// signatures, they all reference the same leaf hash.\n\t\t\tif !bytes.Equal(scriptSpendSig.LeafHash, targetLeafHash) {\n\t\t\t\treturn fmt.Errorf(\"script spend signature %d \"+\n\t\t\t\t\t\"references different target leaf \"+\n\t\t\t\t\t\"hash than first signature; only one \"+\n\t\t\t\t\t\"script path is supported\", idx)\n\t\t\t}\n\n\t\t\tsig := append([]byte{}, scriptSpendSig.Signature...)\n\t\t\tif scriptSpendSig.SigHash != txscript.SigHashDefault {\n\t\t\t\tsig = append(sig, byte(scriptSpendSig.SigHash))\n\t\t\t}\n\t\t\twitnessStack = append(witnessStack, sig)\n\t\t}\n\n\t\t// Complete the witness stack with the executed script and the\n\t\t// serialized control block.\n\t\twitnessStack = append(witnessStack, leafScript.Script)\n\t\twitnessStack = append(witnessStack, leafScript.ControlBlock)\n\n\t\tserializedWitness, err = writeWitness(witnessStack...)\n\n\tdefault:\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// At this point, a witness has been constructed. Remove all fields\n\t// other than witness utxo (01) and finalscriptsig (07),\n\t// finalscriptwitness (08).\n\tnewInput := NewPsbtInput(nil, pInput.WitnessUtxo)\n\tnewInput.FinalScriptWitness = serializedWitness\n\n\t// Finally, we overwrite the entry in the input list at the correct\n\t// index.\n\tp.Inputs[inIndex] = *newInput\n\treturn nil\n}\n"
  },
  {
    "path": "btcutil/psbt/go.mod",
    "content": "module github.com/btcsuite/btcd/btcutil/psbt\n\ngo 1.22\n\nrequire (\n\tgithub.com/btcsuite/btcd v0.24.2\n\tgithub.com/btcsuite/btcd/btcec/v2 v2.3.4\n\tgithub.com/btcsuite/btcd/btcutil v1.1.5\n\tgithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0\n\tgithub.com/davecgh/go-spew v1.1.1\n\tgithub.com/stretchr/testify v1.8.4\n)\n\nrequire (\n\tgithub.com/btcsuite/btclog v1.0.0 // indirect\n\tgithub.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect\n\tgithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgolang.org/x/crypto v0.33.0 // indirect\n\tgolang.org/x/sys v0.30.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "btcutil/psbt/go.sum",
    "content": "github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=\ngithub.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=\ngithub.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M=\ngithub.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A=\ngithub.com/btcsuite/btcd v0.24.2 h1:aLmxPguqxza+4ag8R1I2nnJjSu2iFn/kqtHTIImswcY=\ngithub.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg=\ngithub.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA=\ngithub.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=\ngithub.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ=\ngithub.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=\ngithub.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A=\ngithub.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE=\ngithub.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8=\ngithub.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=\ngithub.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=\ngithub.com/btcsuite/btclog v1.0.0 h1:sEkpKJMmfGiyZjADwEIgB1NSwMyfdD1FB8v6+w1T0Ns=\ngithub.com/btcsuite/btclog v1.0.0/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ=\ngithub.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=\ngithub.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=\ngithub.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=\ngithub.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I=\ngithub.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=\ngithub.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=\ngithub.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=\ngithub.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=\ngithub.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=\ngithub.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=\ngithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=\ngithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=\ngithub.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=\ngithub.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=\ngithub.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=\ngolang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=\ngolang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=\ngolang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=\ngolang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "btcutil/psbt/partial_input.go",
    "content": "package psbt\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"io\"\n\t\"sort\"\n\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// PInput is a struct encapsulating all the data that can be attached to any\n// specific input of the PSBT.\ntype PInput struct {\n\tNonWitnessUtxo         *wire.MsgTx\n\tWitnessUtxo            *wire.TxOut\n\tPartialSigs            []*PartialSig\n\tSighashType            txscript.SigHashType\n\tRedeemScript           []byte\n\tWitnessScript          []byte\n\tBip32Derivation        []*Bip32Derivation\n\tFinalScriptSig         []byte\n\tFinalScriptWitness     []byte\n\tTaprootKeySpendSig     []byte\n\tTaprootScriptSpendSig  []*TaprootScriptSpendSig\n\tTaprootLeafScript      []*TaprootTapLeafScript\n\tTaprootBip32Derivation []*TaprootBip32Derivation\n\tTaprootInternalKey     []byte\n\tTaprootMerkleRoot      []byte\n\tUnknowns               []*Unknown\n}\n\n// NewPsbtInput creates an instance of PsbtInput given either a nonWitnessUtxo\n// or a witnessUtxo.\n//\n// NOTE: Only one of the two arguments should be specified, with the other\n// being `nil`; otherwise the created PsbtInput object will fail IsSane()\n// checks and will not be usable.\nfunc NewPsbtInput(nonWitnessUtxo *wire.MsgTx, witnessUtxo *wire.TxOut) *PInput {\n\treturn &PInput{\n\t\tNonWitnessUtxo:     nonWitnessUtxo,\n\t\tWitnessUtxo:        witnessUtxo,\n\t\tPartialSigs:        []*PartialSig{},\n\t\tSighashType:        0,\n\t\tRedeemScript:       nil,\n\t\tWitnessScript:      nil,\n\t\tBip32Derivation:    []*Bip32Derivation{},\n\t\tFinalScriptSig:     nil,\n\t\tFinalScriptWitness: nil,\n\t\tUnknowns:           nil,\n\t}\n}\n\n// IsSane returns true only if there are no conflicting values in the Psbt\n// PInput. For segwit v0 no checks are currently implemented.\nfunc (pi *PInput) IsSane() bool {\n\t// TODO(guggero): Implement sanity checks for segwit v1. For segwit v0\n\t// it is unsafe to only rely on the witness UTXO so we don't check that\n\t// only one is set anymore.\n\t// See https://github.com/bitcoin/bitcoin/pull/19215.\n\n\treturn true\n}\n\n// deserialize attempts to deserialize a new PInput from the passed io.Reader.\nfunc (pi *PInput) deserialize(r io.Reader) error {\n\tfor {\n\t\tkeyCode, keyData, err := getKey(r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif keyCode == -1 {\n\t\t\t// Reached separator byte, this section is done.\n\t\t\tbreak\n\t\t}\n\t\tvalue, err := wire.ReadVarBytes(\n\t\t\tr, 0, MaxPsbtValueLength, \"PSBT value\",\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tswitch InputType(keyCode) {\n\n\t\tcase NonWitnessUtxoType:\n\t\t\tif pi.NonWitnessUtxo != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\t\t\ttx := wire.NewMsgTx(2)\n\n\t\t\terr := tx.Deserialize(bytes.NewReader(value))\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tpi.NonWitnessUtxo = tx\n\n\t\tcase WitnessUtxoType:\n\t\t\tif pi.WitnessUtxo != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\t\t\ttxout, err := readTxOut(value)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tpi.WitnessUtxo = txout\n\n\t\tcase PartialSigType:\n\t\t\tnewPartialSig := PartialSig{\n\t\t\t\tPubKey:    keyData,\n\t\t\t\tSignature: value,\n\t\t\t}\n\n\t\t\tif !newPartialSig.checkValid() {\n\t\t\t\treturn ErrInvalidPsbtFormat\n\t\t\t}\n\n\t\t\t// Duplicate keys are not allowed.\n\t\t\tfor _, x := range pi.PartialSigs {\n\t\t\t\tif bytes.Equal(x.PubKey, newPartialSig.PubKey) {\n\t\t\t\t\treturn ErrDuplicateKey\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpi.PartialSigs = append(pi.PartialSigs, &newPartialSig)\n\n\t\tcase SighashType:\n\t\t\tif pi.SighashType != 0 {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\t// Bounds check on value here since the sighash type\n\t\t\t// must be a 32-bit unsigned integer.\n\t\t\tif len(value) != 4 {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tsighashType := txscript.SigHashType(\n\t\t\t\tbinary.LittleEndian.Uint32(value),\n\t\t\t)\n\t\t\tpi.SighashType = sighashType\n\n\t\tcase RedeemScriptInputType:\n\t\t\tif pi.RedeemScript != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\t\t\tpi.RedeemScript = value\n\n\t\tcase WitnessScriptInputType:\n\t\t\tif pi.WitnessScript != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\t\t\tpi.WitnessScript = value\n\n\t\tcase Bip32DerivationInputType:\n\t\t\tif !validatePubkey(keyData) {\n\t\t\t\treturn ErrInvalidPsbtFormat\n\t\t\t}\n\t\t\tmaster, derivationPath, err := ReadBip32Derivation(\n\t\t\t\tvalue,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Duplicate keys are not allowed\n\t\t\tfor _, x := range pi.Bip32Derivation {\n\t\t\t\tif bytes.Equal(x.PubKey, keyData) {\n\t\t\t\t\treturn ErrDuplicateKey\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpi.Bip32Derivation = append(\n\t\t\t\tpi.Bip32Derivation,\n\t\t\t\t&Bip32Derivation{\n\t\t\t\t\tPubKey:               keyData,\n\t\t\t\t\tMasterKeyFingerprint: master,\n\t\t\t\t\tBip32Path:            derivationPath,\n\t\t\t\t},\n\t\t\t)\n\n\t\tcase FinalScriptSigType:\n\t\t\tif pi.FinalScriptSig != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tpi.FinalScriptSig = value\n\n\t\tcase FinalScriptWitnessType:\n\t\t\tif pi.FinalScriptWitness != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tpi.FinalScriptWitness = value\n\n\t\tcase TaprootKeySpendSignatureType:\n\t\t\tif pi.TaprootKeySpendSig != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\t// The signature can either be 64 or 65 bytes.\n\t\t\tswitch {\n\t\t\tcase len(value) == schnorrSigMinLength:\n\t\t\t\tif !validateSchnorrSignature(value) {\n\t\t\t\t\treturn ErrInvalidKeyData\n\t\t\t\t}\n\n\t\t\tcase len(value) == schnorrSigMaxLength:\n\t\t\t\tif !validateSchnorrSignature(\n\t\t\t\t\tvalue[0:schnorrSigMinLength],\n\t\t\t\t) {\n\t\t\t\t\treturn ErrInvalidKeyData\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tpi.TaprootKeySpendSig = value\n\n\t\tcase TaprootScriptSpendSignatureType:\n\t\t\t// The key data for the script spend signature is:\n\t\t\t//   <xonlypubkey> <leafhash>\n\t\t\tif len(keyData) != 32*2 {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tnewPartialSig := TaprootScriptSpendSig{\n\t\t\t\tXOnlyPubKey: keyData[:32],\n\t\t\t\tLeafHash:    keyData[32:],\n\t\t\t}\n\n\t\t\t// The signature can either be 64 or 65 bytes.\n\t\t\tswitch {\n\t\t\tcase len(value) == schnorrSigMinLength:\n\t\t\t\tnewPartialSig.Signature = value\n\t\t\t\tnewPartialSig.SigHash = txscript.SigHashDefault\n\n\t\t\tcase len(value) == schnorrSigMaxLength:\n\t\t\t\tnewPartialSig.Signature = value[0:schnorrSigMinLength]\n\t\t\t\tnewPartialSig.SigHash = txscript.SigHashType(\n\t\t\t\t\tvalue[schnorrSigMinLength],\n\t\t\t\t)\n\n\t\t\tdefault:\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tif !newPartialSig.checkValid() {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\t// Duplicate keys are not allowed.\n\t\t\tfor _, x := range pi.TaprootScriptSpendSig {\n\t\t\t\tif x.EqualKey(&newPartialSig) {\n\t\t\t\t\treturn ErrDuplicateKey\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpi.TaprootScriptSpendSig = append(\n\t\t\t\tpi.TaprootScriptSpendSig, &newPartialSig,\n\t\t\t)\n\n\t\tcase TaprootLeafScriptType:\n\t\t\tif len(value) < 1 {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tnewLeafScript := TaprootTapLeafScript{\n\t\t\t\tControlBlock: keyData,\n\t\t\t\tScript:       value[:len(value)-1],\n\t\t\t\tLeafVersion: txscript.TapscriptLeafVersion(\n\t\t\t\t\tvalue[len(value)-1],\n\t\t\t\t),\n\t\t\t}\n\n\t\t\tif !newLeafScript.checkValid() {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\t// Duplicate keys are not allowed.\n\t\t\tfor _, x := range pi.TaprootLeafScript {\n\t\t\t\tif bytes.Equal(\n\t\t\t\t\tx.ControlBlock,\n\t\t\t\t\tnewLeafScript.ControlBlock,\n\t\t\t\t) {\n\t\t\t\t\treturn ErrDuplicateKey\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpi.TaprootLeafScript = append(\n\t\t\t\tpi.TaprootLeafScript, &newLeafScript,\n\t\t\t)\n\n\t\tcase TaprootBip32DerivationInputType:\n\t\t\tif !validateXOnlyPubkey(keyData) {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\ttaprootDerivation, err := ReadTaprootBip32Derivation(\n\t\t\t\tkeyData, value,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Duplicate keys are not allowed.\n\t\t\tfor _, x := range pi.TaprootBip32Derivation {\n\t\t\t\tif bytes.Equal(x.XOnlyPubKey, keyData) {\n\t\t\t\t\treturn ErrDuplicateKey\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpi.TaprootBip32Derivation = append(\n\t\t\t\tpi.TaprootBip32Derivation, taprootDerivation,\n\t\t\t)\n\n\t\tcase TaprootInternalKeyInputType:\n\t\t\tif pi.TaprootInternalKey != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tif !validateXOnlyPubkey(value) {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tpi.TaprootInternalKey = value\n\n\t\tcase TaprootMerkleRootType:\n\t\t\tif pi.TaprootMerkleRoot != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tpi.TaprootMerkleRoot = value\n\n\t\tdefault:\n\t\t\t// A fall through case for any proprietary types.\n\t\t\tkeyCodeAndData := append(\n\t\t\t\t[]byte{byte(keyCode)}, keyData...,\n\t\t\t)\n\t\t\tnewUnknown := &Unknown{\n\t\t\t\tKey:   keyCodeAndData,\n\t\t\t\tValue: value,\n\t\t\t}\n\n\t\t\t// Duplicate key+keyData are not allowed.\n\t\t\tfor _, x := range pi.Unknowns {\n\t\t\t\tif bytes.Equal(x.Key, newUnknown.Key) &&\n\t\t\t\t\tbytes.Equal(x.Value, newUnknown.Value) {\n\n\t\t\t\t\treturn ErrDuplicateKey\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpi.Unknowns = append(pi.Unknowns, newUnknown)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// serialize attempts to serialize the target PInput into the passed io.Writer.\nfunc (pi *PInput) serialize(w io.Writer) error {\n\tif !pi.IsSane() {\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\n\tif pi.NonWitnessUtxo != nil {\n\t\tvar buf bytes.Buffer\n\t\terr := pi.NonWitnessUtxo.Serialize(&buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\terr = serializeKVPairWithType(\n\t\t\tw, uint8(NonWitnessUtxoType), nil, buf.Bytes(),\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif pi.WitnessUtxo != nil {\n\t\tvar buf bytes.Buffer\n\t\terr := wire.WriteTxOut(&buf, 0, 0, pi.WitnessUtxo)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\terr = serializeKVPairWithType(\n\t\t\tw, uint8(WitnessUtxoType), nil, buf.Bytes(),\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif pi.FinalScriptSig == nil && pi.FinalScriptWitness == nil {\n\t\tsort.Sort(PartialSigSorter(pi.PartialSigs))\n\t\tfor _, ps := range pi.PartialSigs {\n\t\t\terr := serializeKVPairWithType(\n\t\t\t\tw, uint8(PartialSigType), ps.PubKey,\n\t\t\t\tps.Signature,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif pi.SighashType != 0 {\n\t\t\tvar shtBytes [4]byte\n\t\t\tbinary.LittleEndian.PutUint32(\n\t\t\t\tshtBytes[:], uint32(pi.SighashType),\n\t\t\t)\n\n\t\t\terr := serializeKVPairWithType(\n\t\t\t\tw, uint8(SighashType), nil, shtBytes[:],\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif pi.RedeemScript != nil {\n\t\t\terr := serializeKVPairWithType(\n\t\t\t\tw, uint8(RedeemScriptInputType), nil,\n\t\t\t\tpi.RedeemScript,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif pi.WitnessScript != nil {\n\t\t\terr := serializeKVPairWithType(\n\t\t\t\tw, uint8(WitnessScriptInputType), nil,\n\t\t\t\tpi.WitnessScript,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tsort.Sort(Bip32Sorter(pi.Bip32Derivation))\n\t\tfor _, kd := range pi.Bip32Derivation {\n\t\t\terr := serializeKVPairWithType(\n\t\t\t\tw,\n\t\t\t\tuint8(Bip32DerivationInputType), kd.PubKey,\n\t\t\t\tSerializeBIP32Derivation(\n\t\t\t\t\tkd.MasterKeyFingerprint, kd.Bip32Path,\n\t\t\t\t),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif pi.TaprootKeySpendSig != nil {\n\t\t\terr := serializeKVPairWithType(\n\t\t\t\tw, uint8(TaprootKeySpendSignatureType), nil,\n\t\t\t\tpi.TaprootKeySpendSig,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tsort.Slice(pi.TaprootScriptSpendSig, func(i, j int) bool {\n\t\t\treturn pi.TaprootScriptSpendSig[i].SortBefore(\n\t\t\t\tpi.TaprootScriptSpendSig[j],\n\t\t\t)\n\t\t})\n\t\tfor _, scriptSpend := range pi.TaprootScriptSpendSig {\n\t\t\tkeyData := append([]byte{}, scriptSpend.XOnlyPubKey...)\n\t\t\tkeyData = append(keyData, scriptSpend.LeafHash...)\n\t\t\tvalue := append([]byte{}, scriptSpend.Signature...)\n\t\t\tif scriptSpend.SigHash != txscript.SigHashDefault {\n\t\t\t\tvalue = append(value, byte(scriptSpend.SigHash))\n\t\t\t}\n\t\t\terr := serializeKVPairWithType(\n\t\t\t\tw, uint8(TaprootScriptSpendSignatureType),\n\t\t\t\tkeyData, value,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tsort.Slice(pi.TaprootLeafScript, func(i, j int) bool {\n\t\t\treturn pi.TaprootLeafScript[i].SortBefore(\n\t\t\t\tpi.TaprootLeafScript[j],\n\t\t\t)\n\t\t})\n\t\tfor _, leafScript := range pi.TaprootLeafScript {\n\t\t\tvalue := append([]byte{}, leafScript.Script...)\n\t\t\tvalue = append(value, byte(leafScript.LeafVersion))\n\t\t\terr := serializeKVPairWithType(\n\t\t\t\tw, uint8(TaprootLeafScriptType),\n\t\t\t\tleafScript.ControlBlock, value,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tsort.Slice(pi.TaprootBip32Derivation, func(i, j int) bool {\n\t\t\treturn pi.TaprootBip32Derivation[i].SortBefore(\n\t\t\t\tpi.TaprootBip32Derivation[j],\n\t\t\t)\n\t\t})\n\t\tfor _, derivation := range pi.TaprootBip32Derivation {\n\t\t\tvalue, err := SerializeTaprootBip32Derivation(\n\t\t\t\tderivation,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\terr = serializeKVPairWithType(\n\t\t\t\tw, uint8(TaprootBip32DerivationInputType),\n\t\t\t\tderivation.XOnlyPubKey, value,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif pi.TaprootInternalKey != nil {\n\t\t\terr := serializeKVPairWithType(\n\t\t\t\tw, uint8(TaprootInternalKeyInputType), nil,\n\t\t\t\tpi.TaprootInternalKey,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif pi.TaprootMerkleRoot != nil {\n\t\t\terr := serializeKVPairWithType(\n\t\t\t\tw, uint8(TaprootMerkleRootType), nil,\n\t\t\t\tpi.TaprootMerkleRoot,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\tif pi.FinalScriptSig != nil {\n\t\terr := serializeKVPairWithType(\n\t\t\tw, uint8(FinalScriptSigType), nil, pi.FinalScriptSig,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif pi.FinalScriptWitness != nil {\n\t\terr := serializeKVPairWithType(\n\t\t\tw, uint8(FinalScriptWitnessType), nil, pi.FinalScriptWitness,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Unknown is a special case; we don't have a key type, only a key and\n\t// a value field.\n\tfor _, kv := range pi.Unknowns {\n\t\terr := serializeKVpair(w, kv.Key, kv.Value)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "btcutil/psbt/partial_output.go",
    "content": "package psbt\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"sort\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// POutput is a struct encapsulating all the data that can be attached\n// to any specific output of the PSBT.\ntype POutput struct {\n\tRedeemScript           []byte\n\tWitnessScript          []byte\n\tBip32Derivation        []*Bip32Derivation\n\tTaprootInternalKey     []byte\n\tTaprootTapTree         []byte\n\tTaprootBip32Derivation []*TaprootBip32Derivation\n\tUnknowns               []*Unknown\n}\n\n// NewPsbtOutput creates an instance of PsbtOutput; the three parameters\n// redeemScript, witnessScript and Bip32Derivation are all allowed to be\n// `nil`.\nfunc NewPsbtOutput(redeemScript []byte, witnessScript []byte,\n\tbip32Derivation []*Bip32Derivation) *POutput {\n\treturn &POutput{\n\t\tRedeemScript:    redeemScript,\n\t\tWitnessScript:   witnessScript,\n\t\tBip32Derivation: bip32Derivation,\n\t}\n}\n\n// deserialize attempts to recode a new POutput from the passed io.Reader.\nfunc (po *POutput) deserialize(r io.Reader) error {\n\tfor {\n\t\tkeyCode, keyData, err := getKey(r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif keyCode == -1 {\n\t\t\t// Reached separator byte, this section is done.\n\t\t\tbreak\n\t\t}\n\n\t\tvalue, err := wire.ReadVarBytes(\n\t\t\tr, 0, MaxPsbtValueLength, \"PSBT value\",\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tswitch OutputType(keyCode) {\n\n\t\tcase RedeemScriptOutputType:\n\t\t\tif po.RedeemScript != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\t\t\tpo.RedeemScript = value\n\n\t\tcase WitnessScriptOutputType:\n\t\t\tif po.WitnessScript != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\t\t\tpo.WitnessScript = value\n\n\t\tcase Bip32DerivationOutputType:\n\t\t\tif !validatePubkey(keyData) {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\t\t\tmaster, derivationPath, err := ReadBip32Derivation(\n\t\t\t\tvalue,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Duplicate keys are not allowed.\n\t\t\tfor _, x := range po.Bip32Derivation {\n\t\t\t\tif bytes.Equal(x.PubKey, keyData) {\n\t\t\t\t\treturn ErrDuplicateKey\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpo.Bip32Derivation = append(po.Bip32Derivation,\n\t\t\t\t&Bip32Derivation{\n\t\t\t\t\tPubKey:               keyData,\n\t\t\t\t\tMasterKeyFingerprint: master,\n\t\t\t\t\tBip32Path:            derivationPath,\n\t\t\t\t},\n\t\t\t)\n\n\t\tcase TaprootInternalKeyOutputType:\n\t\t\tif po.TaprootInternalKey != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tif !validateXOnlyPubkey(value) {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tpo.TaprootInternalKey = value\n\n\t\tcase TaprootTapTreeType:\n\t\t\tif po.TaprootTapTree != nil {\n\t\t\t\treturn ErrDuplicateKey\n\t\t\t}\n\t\t\tif keyData != nil {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\tpo.TaprootTapTree = value\n\n\t\tcase TaprootBip32DerivationOutputType:\n\t\t\tif !validateXOnlyPubkey(keyData) {\n\t\t\t\treturn ErrInvalidKeyData\n\t\t\t}\n\n\t\t\ttaprootDerivation, err := ReadTaprootBip32Derivation(\n\t\t\t\tkeyData, value,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Duplicate keys are not allowed.\n\t\t\tfor _, x := range po.TaprootBip32Derivation {\n\t\t\t\tif bytes.Equal(x.XOnlyPubKey, keyData) {\n\t\t\t\t\treturn ErrDuplicateKey\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpo.TaprootBip32Derivation = append(\n\t\t\t\tpo.TaprootBip32Derivation, taprootDerivation,\n\t\t\t)\n\n\t\tdefault:\n\t\t\t// A fall through case for any proprietary types.\n\t\t\tkeyCodeAndData := append(\n\t\t\t\t[]byte{byte(keyCode)}, keyData...,\n\t\t\t)\n\t\t\tnewUnknown := &Unknown{\n\t\t\t\tKey:   keyCodeAndData,\n\t\t\t\tValue: value,\n\t\t\t}\n\n\t\t\t// Duplicate key+keyData are not allowed.\n\t\t\tfor _, x := range po.Unknowns {\n\t\t\t\tif bytes.Equal(x.Key, newUnknown.Key) &&\n\t\t\t\t\tbytes.Equal(x.Value, newUnknown.Value) {\n\n\t\t\t\t\treturn ErrDuplicateKey\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpo.Unknowns = append(po.Unknowns, newUnknown)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// serialize attempts to write out the target POutput into the passed\n// io.Writer.\nfunc (po *POutput) serialize(w io.Writer) error {\n\tif po.RedeemScript != nil {\n\t\terr := serializeKVPairWithType(\n\t\t\tw, uint8(RedeemScriptOutputType), nil, po.RedeemScript,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif po.WitnessScript != nil {\n\t\terr := serializeKVPairWithType(\n\t\t\tw, uint8(WitnessScriptOutputType), nil, po.WitnessScript,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tsort.Sort(Bip32Sorter(po.Bip32Derivation))\n\tfor _, kd := range po.Bip32Derivation {\n\t\terr := serializeKVPairWithType(w,\n\t\t\tuint8(Bip32DerivationOutputType),\n\t\t\tkd.PubKey,\n\t\t\tSerializeBIP32Derivation(\n\t\t\t\tkd.MasterKeyFingerprint,\n\t\t\t\tkd.Bip32Path,\n\t\t\t),\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif po.TaprootInternalKey != nil {\n\t\terr := serializeKVPairWithType(\n\t\t\tw, uint8(TaprootInternalKeyOutputType), nil,\n\t\t\tpo.TaprootInternalKey,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif po.TaprootTapTree != nil {\n\t\terr := serializeKVPairWithType(\n\t\t\tw, uint8(TaprootTapTreeType), nil,\n\t\t\tpo.TaprootTapTree,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tsort.Slice(po.TaprootBip32Derivation, func(i, j int) bool {\n\t\treturn po.TaprootBip32Derivation[i].SortBefore(\n\t\t\tpo.TaprootBip32Derivation[j],\n\t\t)\n\t})\n\tfor _, derivation := range po.TaprootBip32Derivation {\n\t\tvalue, err := SerializeTaprootBip32Derivation(\n\t\t\tderivation,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = serializeKVPairWithType(\n\t\t\tw, uint8(TaprootBip32DerivationOutputType),\n\t\t\tderivation.XOnlyPubKey, value,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Unknown is a special case; we don't have a key type, only a key and\n\t// a value field\n\tfor _, kv := range po.Unknowns {\n\t\terr := serializeKVpair(w, kv.Key, kv.Value)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "btcutil/psbt/partialsig.go",
    "content": "package psbt\n\nimport (\n\t\"bytes\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/ecdsa\"\n)\n\n// PartialSig encapsulate a (BTC public key, ECDSA signature)\n// pair, note that the fields are stored as byte slices, not\n// btcec.PublicKey or btcec.Signature (because manipulations will\n// be with the former not the latter, here); compliance with consensus\n// serialization is enforced with .checkValid()\ntype PartialSig struct {\n\tPubKey    []byte\n\tSignature []byte\n}\n\n// PartialSigSorter implements sort.Interface for PartialSig.\ntype PartialSigSorter []*PartialSig\n\nfunc (s PartialSigSorter) Len() int { return len(s) }\n\nfunc (s PartialSigSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] }\n\nfunc (s PartialSigSorter) Less(i, j int) bool {\n\treturn bytes.Compare(s[i].PubKey, s[j].PubKey) < 0\n}\n\n// validatePubkey checks if pubKey is *any* valid pubKey serialization in a\n// Bitcoin context (compressed/uncomp. OK).\nfunc validatePubkey(pubKey []byte) bool {\n\t_, err := btcec.ParsePubKey(pubKey)\n\treturn err == nil\n}\n\n// validateSignature checks that the passed byte slice is a valid DER-encoded\n// ECDSA signature, including the sighash flag.  It does *not* of course\n// validate the signature against any message or public key.\nfunc validateSignature(sig []byte) bool {\n\t_, err := ecdsa.ParseDERSignature(sig)\n\treturn err == nil\n}\n\n// checkValid checks that both the pubkey and sig are valid. See the methods\n// (PartialSig, validatePubkey, validateSignature) for more details.\nfunc (ps *PartialSig) checkValid() bool {\n\treturn validatePubkey(ps.PubKey) && validateSignature(ps.Signature)\n}\n"
  },
  {
    "path": "btcutil/psbt/psbt.go",
    "content": "// Copyright (c) 2018 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// Package psbt is an implementation of Partially Signed Bitcoin\n// Transactions (PSBT). The format is defined in BIP 174:\n// https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki\npackage psbt\n\nimport (\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// psbtMagicLength is the length of the magic bytes used to signal the start of\n// a serialized PSBT packet.\nconst psbtMagicLength = 5\n\nvar (\n\t// psbtMagic is the separator.\n\tpsbtMagic = [psbtMagicLength]byte{0x70,\n\t\t0x73, 0x62, 0x74, 0xff, // = \"psbt\" + 0xff sep\n\t}\n)\n\n// MaxPsbtValueLength is the size of the largest transaction serialization\n// that could be passed in a NonWitnessUtxo field. This is definitely\n// less than 4M.\nconst MaxPsbtValueLength = 4000000\n\n// MaxPsbtKeyLength is the length of the largest key that we'll successfully\n// deserialize from the wire. Anything more will return ErrInvalidKeyData.\nconst MaxPsbtKeyLength = 10000\n\n// MaxPsbtKeyValue is the maximum value of a key type in a PSBT. This maximum\n// isn't specified by the BIP but used by bitcoind in various places to limit\n// the number of items processed. So we use it to validate the key type in order\n// to have a consistent behavior.\nconst MaxPsbtKeyValue = 0x02000000\n\nvar (\n\n\t// ErrInvalidPsbtFormat is a generic error for any situation in which a\n\t// provided Psbt serialization does not conform to the rules of BIP174.\n\tErrInvalidPsbtFormat = errors.New(\"Invalid PSBT serialization format\")\n\n\t// ErrDuplicateKey indicates that a passed Psbt serialization is invalid\n\t// due to having the same key repeated in the same key-value pair.\n\tErrDuplicateKey = errors.New(\"Invalid Psbt due to duplicate key\")\n\n\t// ErrInvalidKeyData indicates that a key-value pair in the PSBT\n\t// serialization contains data in the key which is not valid.\n\tErrInvalidKeyData = errors.New(\"Invalid key data\")\n\n\t// ErrInvalidMagicBytes indicates that a passed Psbt serialization is\n\t// invalid due to having incorrect magic bytes.\n\tErrInvalidMagicBytes = errors.New(\"Invalid Psbt due to incorrect \" +\n\t\t\"magic bytes\")\n\n\t// ErrInvalidRawTxSigned indicates that the raw serialized transaction\n\t// in the global section of the passed Psbt serialization is invalid\n\t// because it contains scriptSigs/witnesses (i.e. is fully or partially\n\t// signed), which is not allowed by BIP174.\n\tErrInvalidRawTxSigned = errors.New(\"Invalid Psbt, raw transaction \" +\n\t\t\"must be unsigned.\")\n\n\t// ErrInvalidPrevOutNonWitnessTransaction indicates that the transaction\n\t// hash (i.e. SHA256^2) of the fully serialized previous transaction\n\t// provided in the NonWitnessUtxo key-value field doesn't match the\n\t// prevout hash in the UnsignedTx field in the PSBT itself.\n\tErrInvalidPrevOutNonWitnessTransaction = errors.New(\"Prevout hash \" +\n\t\t\"does not match the provided non-witness utxo serialization\")\n\n\t// ErrInvalidSignatureForInput indicates that the signature the user is\n\t// trying to append to the PSBT is invalid, either because it does\n\t// not correspond to the previous transaction hash, or redeem script,\n\t// or witness script.\n\t// NOTE this does not include ECDSA signature checking.\n\tErrInvalidSignatureForInput = errors.New(\"Signature does not \" +\n\t\t\"correspond to this input\")\n\n\t// ErrInputAlreadyFinalized indicates that the PSBT passed to a\n\t// Finalizer already contains the finalized scriptSig or witness.\n\tErrInputAlreadyFinalized = errors.New(\"Cannot finalize PSBT, \" +\n\t\t\"finalized scriptSig or scriptWitnes already exists\")\n\n\t// ErrIncompletePSBT indicates that the Extractor object\n\t// was unable to successfully extract the passed Psbt struct because\n\t// it is not complete\n\tErrIncompletePSBT = errors.New(\"PSBT cannot be extracted as it is \" +\n\t\t\"incomplete\")\n\n\t// ErrNotFinalizable indicates that the PSBT struct does not have\n\t// sufficient data (e.g. signatures) for finalization\n\tErrNotFinalizable = errors.New(\"PSBT is not finalizable\")\n\n\t// ErrInvalidSigHashFlags indicates that a signature added to the PSBT\n\t// uses Sighash flags that are not in accordance with the requirement\n\t// according to the entry in PsbtInSighashType, or otherwise not the\n\t// default value (SIGHASH_ALL)\n\tErrInvalidSigHashFlags = errors.New(\"Invalid Sighash Flags\")\n\n\t// ErrUnsupportedScriptType indicates that the redeem script or\n\t// script witness given is not supported by this codebase, or is\n\t// otherwise not valid.\n\tErrUnsupportedScriptType = errors.New(\"Unsupported script type\")\n)\n\n// Unknown is a struct encapsulating a key-value pair for which the key type is\n// unknown by this package; these fields are allowed in both the 'Global' and\n// the 'Input' section of a PSBT.\ntype Unknown struct {\n\tKey   []byte\n\tValue []byte\n}\n\n// Packet is the actual psbt representation. It is a set of 1 + N + M\n// key-value pair lists, 1 global, defining the unsigned transaction structure\n// with N inputs and M outputs.  These key-value pairs can contain scripts,\n// signatures, key derivations and other transaction-defining data.\ntype Packet struct {\n\t// UnsignedTx is the decoded unsigned transaction for this PSBT.\n\tUnsignedTx *wire.MsgTx // Deserialization of unsigned tx\n\n\t// Inputs contains all the information needed to properly sign this\n\t// target input within the above transaction.\n\tInputs []PInput\n\n\t// Outputs contains all information required to spend any outputs\n\t// produced by this PSBT.\n\tOutputs []POutput\n\n\t// XPubs is a list of extended public keys that can be used to derive\n\t// public keys used in the inputs and outputs of this transaction. It\n\t// should be the public key at the highest hardened derivation index so\n\t// that the unhardened child keys used in the transaction can be\n\t// derived.\n\tXPubs []XPub\n\n\t// Unknowns are the set of custom types (global only) within this PSBT.\n\tUnknowns []*Unknown\n}\n\n// validateUnsignedTx returns true if the transaction is unsigned.  Note that\n// more basic sanity requirements, such as the presence of inputs and outputs,\n// is implicitly checked in the call to MsgTx.Deserialize().\nfunc validateUnsignedTX(tx *wire.MsgTx) bool {\n\tfor _, tin := range tx.TxIn {\n\t\tif len(tin.SignatureScript) != 0 || len(tin.Witness) != 0 {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// NewFromUnsignedTx creates a new Psbt struct, without any signatures (i.e.\n// only the global section is non-empty) using the passed unsigned transaction.\nfunc NewFromUnsignedTx(tx *wire.MsgTx) (*Packet, error) {\n\tif !validateUnsignedTX(tx) {\n\t\treturn nil, ErrInvalidRawTxSigned\n\t}\n\n\tinSlice := make([]PInput, len(tx.TxIn))\n\toutSlice := make([]POutput, len(tx.TxOut))\n\txPubSlice := make([]XPub, 0)\n\tunknownSlice := make([]*Unknown, 0)\n\n\treturn &Packet{\n\t\tUnsignedTx: tx,\n\t\tInputs:     inSlice,\n\t\tOutputs:    outSlice,\n\t\tXPubs:      xPubSlice,\n\t\tUnknowns:   unknownSlice,\n\t}, nil\n}\n\n// NewFromRawBytes returns a new instance of a Packet struct created by reading\n// from a byte slice. If the format is invalid, an error is returned. If the\n// argument b64 is true, the passed byte slice is decoded from base64 encoding\n// before processing.\n//\n// NOTE: To create a Packet from one's own data, rather than reading in a\n// serialization from a counterparty, one should use a psbt.New.\nfunc NewFromRawBytes(r io.Reader, b64 bool) (*Packet, error) {\n\t// If the PSBT is encoded in bas64, then we'll create a new wrapper\n\t// reader that'll allow us to incrementally decode the contents of the\n\t// io.Reader.\n\tif b64 {\n\t\tbased64EncodedReader := r\n\t\tr = base64.NewDecoder(base64.StdEncoding, based64EncodedReader)\n\t}\n\n\t// The Packet struct does not store the fixed magic bytes, but they\n\t// must be present or the serialization must be explicitly rejected.\n\tvar magic [5]byte\n\tif _, err := io.ReadFull(r, magic[:]); err != nil {\n\t\treturn nil, err\n\t}\n\tif magic != psbtMagic {\n\t\treturn nil, ErrInvalidMagicBytes\n\t}\n\n\t// Next we parse the GLOBAL section.  There is currently only 1 known\n\t// key type, UnsignedTx.  We insist this exists first; unknowns are\n\t// allowed, but only after.\n\tkeyCode, keyData, err := getKey(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif GlobalType(keyCode) != UnsignedTxType || keyData != nil {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\n\t// Now that we've verified the global type is present, we'll decode it\n\t// into a proper unsigned transaction, and validate it.\n\tvalue, err := wire.ReadVarBytes(\n\t\tr, 0, MaxPsbtValueLength, \"PSBT value\",\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmsgTx := wire.NewMsgTx(2)\n\n\t// BIP-0174 states: \"The transaction must be in the old serialization\n\t// format (without witnesses).\"\n\terr = msgTx.DeserializeNoWitness(bytes.NewReader(value))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif !validateUnsignedTX(msgTx) {\n\t\treturn nil, ErrInvalidRawTxSigned\n\t}\n\n\t// Next we parse any unknowns that may be present, making sure that we\n\t// break at the separator.\n\tvar (\n\t\txPubSlice    []XPub\n\t\tunknownSlice []*Unknown\n\t)\n\tfor {\n\t\tkeyint, keydata, err := getKey(r)\n\t\tif err != nil {\n\t\t\treturn nil, ErrInvalidPsbtFormat\n\t\t}\n\t\tif keyint == -1 {\n\t\t\tbreak\n\t\t}\n\n\t\tvalue, err := wire.ReadVarBytes(\n\t\t\tr, 0, MaxPsbtValueLength, \"PSBT value\",\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tswitch GlobalType(keyint) {\n\t\tcase XPubType:\n\t\t\txPub, err := ReadXPub(keydata, value)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\t// Duplicate keys are not allowed\n\t\t\tfor _, x := range xPubSlice {\n\t\t\t\tif bytes.Equal(x.ExtendedKey, keyData) {\n\t\t\t\t\treturn nil, ErrDuplicateKey\n\t\t\t\t}\n\t\t\t}\n\n\t\t\txPubSlice = append(xPubSlice, *xPub)\n\n\t\tdefault:\n\t\t\tkeyintanddata := []byte{byte(keyint)}\n\t\t\tkeyintanddata = append(keyintanddata, keydata...)\n\n\t\t\tnewUnknown := &Unknown{\n\t\t\t\tKey:   keyintanddata,\n\t\t\t\tValue: value,\n\t\t\t}\n\t\t\tunknownSlice = append(unknownSlice, newUnknown)\n\t\t}\n\t}\n\n\t// Next we parse the INPUT section.\n\tinSlice := make([]PInput, len(msgTx.TxIn))\n\tfor i := range msgTx.TxIn {\n\t\tinput := PInput{}\n\t\terr = input.deserialize(r)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tinSlice[i] = input\n\t}\n\n\t// Next we parse the OUTPUT section.\n\toutSlice := make([]POutput, len(msgTx.TxOut))\n\tfor i := range msgTx.TxOut {\n\t\toutput := POutput{}\n\t\terr = output.deserialize(r)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\toutSlice[i] = output\n\t}\n\n\t// Populate the new Packet object.\n\tnewPsbt := Packet{\n\t\tUnsignedTx: msgTx,\n\t\tInputs:     inSlice,\n\t\tOutputs:    outSlice,\n\t\tXPubs:      xPubSlice,\n\t\tUnknowns:   unknownSlice,\n\t}\n\n\t// Extended sanity checking is applied here to make sure the\n\t// externally-passed Packet follows all the rules.\n\tif err = newPsbt.SanityCheck(); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &newPsbt, nil\n}\n\n// Serialize creates a binary serialization of the referenced Packet struct\n// with lexicographical ordering (by key) of the subsections.\nfunc (p *Packet) Serialize(w io.Writer) error {\n\t// First we write out the precise set of magic bytes that identify a\n\t// valid PSBT transaction.\n\tif _, err := w.Write(psbtMagic[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Next we prep to write out the unsigned transaction by first\n\t// serializing it into an intermediate buffer.\n\tserializedTx := bytes.NewBuffer(\n\t\tmake([]byte, 0, p.UnsignedTx.SerializeSize()),\n\t)\n\tif err := p.UnsignedTx.SerializeNoWitness(serializedTx); err != nil {\n\t\treturn err\n\t}\n\n\t// Now that we have the serialized transaction, we'll write it out to\n\t// the proper global type.\n\terr := serializeKVPairWithType(\n\t\tw, uint8(UnsignedTxType), nil, serializedTx.Bytes(),\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Serialize the global xPubs.\n\tfor _, xPub := range p.XPubs {\n\t\tpathBytes := SerializeBIP32Derivation(\n\t\t\txPub.MasterKeyFingerprint, xPub.Bip32Path,\n\t\t)\n\t\terr := serializeKVPairWithType(\n\t\t\tw, uint8(XPubType), xPub.ExtendedKey, pathBytes,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Unknown is a special case; we don't have a key type, only a key and\n\t// a value field\n\tfor _, kv := range p.Unknowns {\n\t\terr := serializeKVpair(w, kv.Key, kv.Value)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// With that our global section is done, so we'll write out the\n\t// separator.\n\tseparator := []byte{0x00}\n\tif _, err := w.Write(separator); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, pInput := range p.Inputs {\n\t\terr := pInput.serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif _, err := w.Write(separator); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, pOutput := range p.Outputs {\n\t\terr := pOutput.serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif _, err := w.Write(separator); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// B64Encode returns the base64 encoding of the serialization of\n// the current PSBT, or an error if the encoding fails.\nfunc (p *Packet) B64Encode() (string, error) {\n\tvar b bytes.Buffer\n\tif err := p.Serialize(&b); err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn base64.StdEncoding.EncodeToString(b.Bytes()), nil\n}\n\n// IsComplete returns true only if all of the inputs are\n// finalized; this is particularly important in that it decides\n// whether the final extraction to a network serialized signed\n// transaction will be possible.\nfunc (p *Packet) IsComplete() bool {\n\tfor i := 0; i < len(p.UnsignedTx.TxIn); i++ {\n\t\tif !isFinalized(p, i) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// SanityCheck checks conditions on a PSBT to ensure that it obeys the\n// rules of BIP174, and returns true if so, false if not.\nfunc (p *Packet) SanityCheck() error {\n\tif !validateUnsignedTX(p.UnsignedTx) {\n\t\treturn ErrInvalidRawTxSigned\n\t}\n\n\tfor _, tin := range p.Inputs {\n\t\tif !tin.IsSane() {\n\t\t\treturn ErrInvalidPsbtFormat\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// GetTxFee returns the transaction fee.  An error is returned if a transaction\n// input does not contain any UTXO information.\nfunc (p *Packet) GetTxFee() (btcutil.Amount, error) {\n\tsumInputs, err := SumUtxoInputValues(p)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar sumOutputs int64\n\tfor _, txOut := range p.UnsignedTx.TxOut {\n\t\tsumOutputs += txOut.Value\n\t}\n\n\tfee := sumInputs - sumOutputs\n\treturn btcutil.Amount(fee), nil\n}\n"
  },
  {
    "path": "btcutil/psbt/psbt_test.go",
    "content": "// Copyright (c) 2018 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage psbt\n\nimport (\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"math\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/davecgh/go-spew/spew\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// Test vectors from:\n// // https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki#test-vectors\n\n// createPsbtFromSignedTx is a utility function to create a PSBT from an\n// already-signed transaction, so we can test reconstructing, signing and\n// extracting it. Returned are: an unsigned transaction serialization, a list\n// of scriptSigs, one per input, and a list of witnesses, one per input.\nfunc createPsbtFromSignedTx(serializedSignedTx []byte) (\n\t*Packet, [][]byte, []wire.TxWitness, error) {\n\n\ttx := wire.NewMsgTx(2)\n\terr := tx.Deserialize(bytes.NewReader(serializedSignedTx))\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\tscriptSigs := make([][]byte, 0, len(tx.TxIn))\n\twitnesses := make([]wire.TxWitness, 0, len(tx.TxIn))\n\ttx2 := tx.Copy()\n\n\t// Blank out signature info in inputs\n\tfor i, tin := range tx2.TxIn {\n\t\ttin.SignatureScript = nil\n\t\tscriptSigs = append(scriptSigs, tx.TxIn[i].SignatureScript)\n\t\ttin.Witness = nil\n\t\twitnesses = append(witnesses, tx.TxIn[i].Witness)\n\n\t}\n\n\t// Outputs always contain: (value, scriptPubkey) so don't need\n\t// amending.  Now tx2 is tx with all signing data stripped out\n\tunsignedPsbt, err := NewFromUnsignedTx(tx2)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\treturn unsignedPsbt, scriptSigs, witnesses, nil\n}\n\n// These are all valid PSBTs encoded as hex. The items with a comment are taken\n// from the BIP174 test vectors:\n// https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki#test-vectors\nvar validPsbtHex = map[int]string{\n\t// Case: PSBT with one P2PKH input. Outputs are empty.\n\t0: \"70736274ff0100750200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf60000000000feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e1300000100fda5010100000000010289a3c71eab4d20e0371bbba4cc698fa295c9463afa2e397f8533ccb62f9567e50100000017160014be18d152a9b012039daf3da7de4f53349eecb985ffffffff86f8aa43a71dff1448893a530a7237ef6b4608bbb2dd2d0171e63aec6a4890b40100000017160014fe3e9ef1a745e974d902c4355943abcb34bd5353ffffffff0200c2eb0b000000001976a91485cff1097fd9e008bb34af709c62197b38978a4888ac72fef84e2c00000017a914339725ba21efd62ac753a9bcd067d6c7a6a39d05870247304402202712be22e0270f394f568311dc7ca9a68970b8025fdd3b240229f07f8a5f3a240220018b38d7dcd314e734c9276bd6fb40f673325bc4baa144c800d2f2f02db2765c012103d2e15674941bad4a996372cb87e1856d3652606d98562fe39c5e9e7e413f210502483045022100d12b852d85dcd961d2f5f4ab660654df6eedcc794c0c33ce5cc309ffb5fce58d022067338a8e0e1725c197fb1a88af59f51e44e4255b20167c8684031c05d1f2592a01210223b72beef0965d10be0778efecd61fcac6f79a4ea169393380734464f84f2ab300000000000000\",\n\t// Case: PSBT with one P2PKH input and one P2SH-P2WPKH input. First\n\t// input is signed and finalized. Outputs are empty.\n\t1: \"70736274ff0100a00200000002ab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be40000000000feffffffab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be40100000000feffffff02603bea0b000000001976a914768a40bbd740cbe81d988e71de2a4d5c71396b1d88ac8e240000000000001976a9146f4620b553fa095e721b9ee0efe9fa039cca459788ac000000000001076a47304402204759661797c01b036b25928948686218347d89864b719e1f7fcf57d1e511658702205309eabf56aa4d8891ffd111fdf1336f3a29da866d7f8486d75546ceedaf93190121035cdc61fc7ba971c0b501a646a2a83b102cb43881217ca682dc86e2d73fa882920001012000e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787010416001485d13537f2e265405a34dbafa9e3dda01fb82308000000\",\n\t// Case: PSBT with one P2PKH input which has a non-final scriptSig and\n\t// has a sighash type specified. Outputs are empty.\n\t2: \"70736274ff0100750200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf60000000000feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e1300000100fda5010100000000010289a3c71eab4d20e0371bbba4cc698fa295c9463afa2e397f8533ccb62f9567e50100000017160014be18d152a9b012039daf3da7de4f53349eecb985ffffffff86f8aa43a71dff1448893a530a7237ef6b4608bbb2dd2d0171e63aec6a4890b40100000017160014fe3e9ef1a745e974d902c4355943abcb34bd5353ffffffff0200c2eb0b000000001976a91485cff1097fd9e008bb34af709c62197b38978a4888ac72fef84e2c00000017a914339725ba21efd62ac753a9bcd067d6c7a6a39d05870247304402202712be22e0270f394f568311dc7ca9a68970b8025fdd3b240229f07f8a5f3a240220018b38d7dcd314e734c9276bd6fb40f673325bc4baa144c800d2f2f02db2765c012103d2e15674941bad4a996372cb87e1856d3652606d98562fe39c5e9e7e413f210502483045022100d12b852d85dcd961d2f5f4ab660654df6eedcc794c0c33ce5cc309ffb5fce58d022067338a8e0e1725c197fb1a88af59f51e44e4255b20167c8684031c05d1f2592a01210223b72beef0965d10be0778efecd61fcac6f79a4ea169393380734464f84f2ab30000000001030401000000000000\",\n\t// Case: PSBT with one P2PKH input and one P2SH-P2WPKH input both with\n\t// non-final scriptSigs. P2SH-P2WPKH input's redeemScript is available.\n\t// Outputs filled.\n\t3: \"70736274ff0100a00200000002ab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be40000000000feffffffab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be40100000000feffffff02603bea0b000000001976a914768a40bbd740cbe81d988e71de2a4d5c71396b1d88ac8e240000000000001976a9146f4620b553fa095e721b9ee0efe9fa039cca459788ac00000000000100df0200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf6000000006a473044022070b2245123e6bf474d60c5b50c043d4c691a5d2435f09a34a7662a9dc251790a022001329ca9dacf280bdf30740ec0390422422c81cb45839457aeb76fc12edd95b3012102657d118d3357b8e0f4c2cd46db7b39f6d9c38d9a70abcb9b2de5dc8dbfe4ce31feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e13000001012000e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787010416001485d13537f2e265405a34dbafa9e3dda01fb8230800220202ead596687ca806043edc3de116cdf29d5e9257c196cd055cf698c8d02bf24e9910b4a6ba670000008000000080020000800022020394f62be9df19952c5587768aeb7698061ad2c4a25c894f47d8c162b4d7213d0510b4a6ba6700000080010000800200008000\",\n\t// Case: PSBT with one P2SH-P2WSH input of a 2-of-2 multisig,\n\t// redeemScript, witnessScript, and keypaths are available. Contains one\n\t// signature.\n\t4: \"70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000\",\n\t5: \"70736274ff01003f0200000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff010000000000000000036a010000000000000a0f0102030405060708090f0102030405060708090a0b0c0d0e0f0000\",\n\t6: \"70736274ff01003f0200000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff010000000000000000036a010000000000002206030d097466b7f59162ac4d90bf65f2a31a8bad82fcd22e98138dcf279401939bd104ffffffff0a0f0102030405060708090f0102030405060708090a0b0c0d0e0f0000\",\n\t7: \"70736274ff01002001000000000100000000000000000d6a0b68656c6c6f20776f726c64000000000000\",\n\t// Case: PSBT with one P2WSH input of a 2-of-2 multisig. witnessScript,\n\t// keypaths, and global xpubs are available. Contains no signatures.\n\t// Outputs filled.\n\t8: \"70736274ff01005202000000019dfc6628c26c5899fe1bd3dc338665bfd55d7ada10f6220973df2d386dec12760100000000ffffffff01f03dcd1d000000001600147b3a00bfdc14d27795c2b74901d09da6ef133579000000004f01043587cf02da3fd0088000000097048b1ad0445b1ec8275517727c87b4e4ebc18a203ffa0f94c01566bd38e9000351b743887ee1d40dc32a6043724f2d6459b3b5a4d73daec8fbae0472f3bc43e20cd90c6a4fae000080000000804f01043587cf02da3fd00880000001b90452427139cd78c2cff2444be353cd58605e3e513285e528b407fae3f6173503d30a5e97c8adbc557dac2ad9a7e39c1722ebac69e668b6f2667cc1d671c83cab0cd90c6a4fae000080010000800001012b0065cd1d000000002200202c5486126c4978079a814e13715d65f36459e4d6ccaded266d0508645bafa6320105475221029da12cdb5b235692b91536afefe5c91c3ab9473d8e43b533836ab456299c88712103372b34234ed7cf9c1fea5d05d441557927be9542b162eb02e1ab2ce80224c00b52ae2206029da12cdb5b235692b91536afefe5c91c3ab9473d8e43b533836ab456299c887110d90c6a4fae0000800000008000000000220603372b34234ed7cf9c1fea5d05d441557927be9542b162eb02e1ab2ce80224c00b10d90c6a4fae0000800100008000000000002202039eff1f547a1d5f92dfa2ba7af6ac971a4bd03ba4a734b03156a256b8ad3a1ef910ede45cc500000080000000800100008000\",\n\t// Case: PSBT with `PSBT_GLOBAL_XPUB`.\n\t9: \"70736274ff01009d0100000002710ea76ab45c5cb6438e607e59cc037626981805ae9e0dfd9089012abb0be5350100000000ffffffff190994d6a8b3c8c82ccbcfb2fba4106aa06639b872a8d447465c0d42588d6d670000000000ffffffff0200e1f505000000001976a914b6bc2c0ee5655a843d79afedd0ccc3f7dd64340988ac605af405000000001600141188ef8e4ce0449eaac8fb141cbf5a1176e6a088000000004f010488b21e039e530cac800000003dbc8a5c9769f031b17e77fea1518603221a18fd18f2b9a54c6c8c1ac75cbc3502f230584b155d1c7f1cd45120a653c48d650b431b67c5b2c13f27d7142037c1691027569c503100008000000080000000800001011f00e1f5050000000016001433b982f91b28f160c920b4ab95e58ce50dda3a4a220203309680f33c7de38ea6a47cd4ecd66f1f5a49747c6ffb8808ed09039243e3ad5c47304402202d704ced830c56a909344bd742b6852dccd103e963bae92d38e75254d2bb424502202d86c437195df46c0ceda084f2a291c3da2d64070f76bf9b90b195e7ef28f77201220603309680f33c7de38ea6a47cd4ecd66f1f5a49747c6ffb8808ed09039243e3ad5c1827569c5031000080000000800000008000000000010000000001011f00e1f50500000000160014388fb944307eb77ef45197d0b0b245e079f011de220202c777161f73d0b7c72b9ee7bde650293d13f095bc7656ad1f525da5fd2e10b11047304402204cb1fb5f869c942e0e26100576125439179ae88dca8a9dc3ba08f7953988faa60220521f49ca791c27d70e273c9b14616985909361e25be274ea200d7e08827e514d01220602c777161f73d0b7c72b9ee7bde650293d13f095bc7656ad1f525da5fd2e10b1101827569c5031000080000000800000008000000000000000000000220202d20ca502ee289686d21815bd43a80637b0698e1fbcdbe4caed445f6c1a0a90ef1827569c50310000800000008000000080000000000400000000\",\n}\n\n// These are additional valid PSBTs encoded as base64. The items with a comment\n// are taken from the BIP174 test vectors:\n// https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki#test-vectors\nvar validPsbtBase64 = map[int]string{\n\t// PSBT with one P2PKH input. Outputs are empty.\n\t0: \"cHNidP8BAHUCAAAAASaBcTce3/KF6Tet7qSze3gADAVmy7OtZGQXE8pCFxv2AAAAAAD+////AtPf9QUAAAAAGXapFNDFmQPFusKGh2DpD9UhpGZap2UgiKwA4fUFAAAAABepFDVF5uM7gyxHBQ8k0+65PJwDlIvHh7MuEwAAAQD9pQEBAAAAAAECiaPHHqtNIOA3G7ukzGmPopXJRjr6Ljl/hTPMti+VZ+UBAAAAFxYAFL4Y0VKpsBIDna89p95PUzSe7LmF/////4b4qkOnHf8USIk6UwpyN+9rRgi7st0tAXHmOuxqSJC0AQAAABcWABT+Pp7xp0XpdNkCxDVZQ6vLNL1TU/////8CAMLrCwAAAAAZdqkUhc/xCX/Z4Ai7NK9wnGIZeziXikiIrHL++E4sAAAAF6kUM5cluiHv1irHU6m80GfWx6ajnQWHAkcwRAIgJxK+IuAnDzlPVoMR3HyppolwuAJf3TskAinwf4pfOiQCIAGLONfc0xTnNMkna9b7QPZzMlvEuqFEyADS8vAtsnZcASED0uFWdJQbrUqZY3LLh+GFbTZSYG2YVi/jnF6efkE/IQUCSDBFAiEA0SuFLYXc2WHS9fSrZgZU327tzHlMDDPOXMMJ/7X85Y0CIGczio4OFyXBl/saiK9Z9R5E5CVbIBZ8hoQDHAXR8lkqASECI7cr7vCWXRC+B3jv7NYfysb3mk6haTkzgHNEZPhPKrMAAAAAIQ12pWrO2RXSUT3NhMLDeLLoqlzWMrW3HKLyrFsOOmSb2wIBAiENnBLP3ATHRYTXh6w9I3chMsGFJLx6so3sQhm4/FtCX3ABAQAAAA==\",\n\t1: \"cHNidP8BAFICAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////AUjmBSoBAAAAFgAUdo4e60z0IIZgM/gKzv8PlyB0SWkAAAAAAAEBKwDyBSoBAAAAIlEgWiws9bUs8x+DrS6Npj/wMYPs2PYJx1EK6KSOA5EKB1chFv40kGTJjW4qhT+jybEr2LMEoZwZXGDvp+4jkwRtP6IyGQB3Ky2nVgAAgAEAAIAAAACAAQAAAAAAAAABFyD+NJBkyY1uKoU/o8mxK9izBKGcGVxg76fuI5MEbT+iMgAiAgNrdyptt02HU8mKgnlY3mx4qzMSEJ830+AwRIQkLs5z2Bh3Ky2nVAAAgAEAAIAAAACAAAAAAAAAAAAA\",\n\t2: \"cHNidP8BAFICAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////AUjmBSoBAAAAFgAUdo4e60z0IIZgM/gKzv8PlyB0SWkAAAAAAAEBKwDyBSoBAAAAIlEgWiws9bUs8x+DrS6Npj/wMYPs2PYJx1EK6KSOA5EKB1cBE0C7U+yRe62dkGrxuocYHEi4as5aritTYFpyXKdGJWMUdvxvW67a9PLuD0d/NvWPOXDVuCc7fkl7l68uPxJcl680IRb+NJBkyY1uKoU/o8mxK9izBKGcGVxg76fuI5MEbT+iMhkAdystp1YAAIABAACAAAAAgAEAAAAAAAAAARcg/jSQZMmNbiqFP6PJsSvYswShnBlcYO+n7iOTBG0/ojIAIgIDa3cqbbdNh1PJioJ5WN5seKszEhCfN9PgMESEJC7Oc9gYdystp1QAAIABAACAAAAAgAAAAAAAAAAAAA==\",\n\t3: \"cHNidP8BAF4CAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////AUjmBSoBAAAAIlEgg2mORYxmZOFZXXXaJZfeHiLul9eY5wbEwKS1qYI810MAAAAAAAEBKwDyBSoBAAAAIlEgWiws9bUs8x+DrS6Npj/wMYPs2PYJx1EK6KSOA5EKB1chFv40kGTJjW4qhT+jybEr2LMEoZwZXGDvp+4jkwRtP6IyGQB3Ky2nVgAAgAEAAIAAAACAAQAAAAAAAAABFyD+NJBkyY1uKoU/o8mxK9izBKGcGVxg76fuI5MEbT+iMgABBSARJNp67JLM0GyVRWJkf0N7E4uVchqEvivyJ2u92rPmcSEHESTaeuySzNBslUViZH9DexOLlXIahL4r8idrvdqz5nEZAHcrLadWAACAAQAAgAAAAIAAAAAABQAAAAA=\",\n\t4: \"cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgg2mORYxmZOFZXXXaJZfeHiLul9eY5wbEwKS1qYI810MAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJiFcFQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wG99YgWelJehpKJnVp2YdtpgEBr/OONSm5uTnOf5GulwEV8uSQr3zEXE94UR82BXzlxaXFYyWin7RN/CA/NW4fgjICyxOsaCSN6AaqajZZzzwD62gh0JyBFKToaP696GW7bSrMBCFcFQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wJfG5v6l/3FP9XJEmZkIEOQG6YqhD1v35fZ4S8HQqabOIyBDILC/FvARtT6nvmFZJKp/J+XSmtIOoRVdhIZ2w7rRsqzAYhXBUJKbdMGgSVS3i0tgNel6XgeKWg8o7JbVR7/ums6AOsDNlw4V9T/AyC+VD9Vg/6kZt2FyvgFzaKiZE68HT0ALCRFfLkkK98xFxPeFEfNgV85cWlxWMlop+0TfwgPzVuH4IyD6D3o87zsdDAps59JuF62gsuXJLRnvrUi0GFnLikUcqazAIRYssTrGgkjegGqmo2Wc88A+toIdCcgRSk6Gj+vehlu20jkBzZcOFfU/wMgvlQ/VYP+pGbdhcr4Bc2iomROvB09ACwl3Ky2nVgAAgAEAAIACAACAAAAAAAAAAAAhFkMgsL8W8BG1Pqe+YVkkqn8n5dKa0g6hFV2EhnbDutGyOQERXy5JCvfMRcT3hRHzYFfOXFpcVjJaKftE38ID81bh+HcrLadWAACAAQAAgAEAAIAAAAAAAAAAACEWUJKbdMGgSVS3i0tgNel6XgeKWg8o7JbVR7/ums6AOsAFAHxGHl0hFvoPejzvOx0MCmzn0m4XraCy5cktGe+tSLQYWcuKRRypOQFvfWIFnpSXoaSiZ1admHbaYBAa/zjjUpubk5zn+RrpcHcrLadWAACAAQAAgAMAAIAAAAAAAAAAAAEXIFCSm3TBoElUt4tLYDXpel4HiloPKOyW1Ue/7prOgDrAARgg8DYuL3Wm9CClvePrIh2WrmcgzyX4GJDJWx13WstRXmUAAQUgESTaeuySzNBslUViZH9DexOLlXIahL4r8idrvdqz5nEhBxEk2nrskszQbJVFYmR/Q3sTi5VyGoS+K/Ina73as+ZxGQB3Ky2nVgAAgAEAAIAAAACAAAAAAAUAAAAA\",\n\t5: \"cHNidP8BAF4CAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////AUjmBSoBAAAAIlEgCoy9yG3hzhwPnK6yLW33ztNoP+Qj4F0eQCqHk0HW9vUAAAAAAAEBKwDyBSoBAAAAIlEgWiws9bUs8x+DrS6Npj/wMYPs2PYJx1EK6KSOA5EKB1chFv40kGTJjW4qhT+jybEr2LMEoZwZXGDvp+4jkwRtP6IyGQB3Ky2nVgAAgAEAAIAAAACAAQAAAAAAAAABFyD+NJBkyY1uKoU/o8mxK9izBKGcGVxg76fuI5MEbT+iMgABBSBQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wAEGbwLAIiBzblcpAP4SUliaIUPI88efcaBBLSNTr3VelwHHgmlKAqwCwCIgYxxfO1gyuPvev7GXBM7rMjwh9A96JPQ9aO8MwmsSWWmsAcAiIET6pJoDON5IjI3//s37bzKfOAvVZu8gyN9tgT6rHEJzrCEHRPqkmgM43kiMjf/+zftvMp84C9Vm7yDI322BPqscQnM5AfBreYuSoQ7ZqdC7/Trxc6U7FhfaOkFZygCCFs2Fay4Odystp1YAAIABAACAAQAAgAAAAAADAAAAIQdQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wAUAfEYeXSEHYxxfO1gyuPvev7GXBM7rMjwh9A96JPQ9aO8MwmsSWWk5ARis5AmIl4Xg6nDO67jhyokqenjq7eDy4pbPQ1lhqPTKdystp1YAAIABAACAAgAAgAAAAAADAAAAIQdzblcpAP4SUliaIUPI88efcaBBLSNTr3VelwHHgmlKAjkBKaW0kVCQFi11mv0/4Pk/ozJgVtC0CIy5M8rngmy42Cx3Ky2nVgAAgAEAAIADAACAAAAAAAMAAAAA\",\n\t6: \"cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgg2mORYxmZOFZXXXaJZfeHiLul9eY5wbEwKS1qYI810MAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJBFCyxOsaCSN6AaqajZZzzwD62gh0JyBFKToaP696GW7bSzZcOFfU/wMgvlQ/VYP+pGbdhcr4Bc2iomROvB09ACwlAv4GNl1fW/+tTi6BX+0wfxOD17xhudlvrVkeR4Cr1/T1eJVHU404z2G8na4LJnHmu0/A5Wgge/NLMLGXdfmk9eUEUQyCwvxbwEbU+p75hWSSqfyfl0prSDqEVXYSGdsO60bIRXy5JCvfMRcT3hRHzYFfOXFpcVjJaKftE38ID81bh+EDh8atvq/omsjbyGDNxncHUKKt2jYD5H5mI2KvvR7+4Y7sfKlKfdowV8AzjTsKDzcB+iPhCi+KPbvZAQ8MpEYEaQRT6D3o87zsdDAps59JuF62gsuXJLRnvrUi0GFnLikUcqW99YgWelJehpKJnVp2YdtpgEBr/OONSm5uTnOf5GulwQOwfA3kgZGHIM0IoVCMyZwirAx8NpKJT7kWq+luMkgNNi2BUkPjNE+APmJmJuX4hX6o28S3uNpPS2szzeBwXV/ZiFcFQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wG99YgWelJehpKJnVp2YdtpgEBr/OONSm5uTnOf5GulwEV8uSQr3zEXE94UR82BXzlxaXFYyWin7RN/CA/NW4fgjICyxOsaCSN6AaqajZZzzwD62gh0JyBFKToaP696GW7bSrMBCFcFQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wJfG5v6l/3FP9XJEmZkIEOQG6YqhD1v35fZ4S8HQqabOIyBDILC/FvARtT6nvmFZJKp/J+XSmtIOoRVdhIZ2w7rRsqzAYhXBUJKbdMGgSVS3i0tgNel6XgeKWg8o7JbVR7/ums6AOsDNlw4V9T/AyC+VD9Vg/6kZt2FyvgFzaKiZE68HT0ALCRFfLkkK98xFxPeFEfNgV85cWlxWMlop+0TfwgPzVuH4IyD6D3o87zsdDAps59JuF62gsuXJLRnvrUi0GFnLikUcqazAIRYssTrGgkjegGqmo2Wc88A+toIdCcgRSk6Gj+vehlu20jkBzZcOFfU/wMgvlQ/VYP+pGbdhcr4Bc2iomROvB09ACwl3Ky2nVgAAgAEAAIACAACAAAAAAAAAAAAhFkMgsL8W8BG1Pqe+YVkkqn8n5dKa0g6hFV2EhnbDutGyOQERXy5JCvfMRcT3hRHzYFfOXFpcVjJaKftE38ID81bh+HcrLadWAACAAQAAgAEAAIAAAAAAAAAAACEWUJKbdMGgSVS3i0tgNel6XgeKWg8o7JbVR7/ums6AOsAFAHxGHl0hFvoPejzvOx0MCmzn0m4XraCy5cktGe+tSLQYWcuKRRypOQFvfWIFnpSXoaSiZ1admHbaYBAa/zjjUpubk5zn+RrpcHcrLadWAACAAQAAgAMAAIAAAAAAAAAAAAEXIFCSm3TBoElUt4tLYDXpel4HiloPKOyW1Ue/7prOgDrAARgg8DYuL3Wm9CClvePrIh2WrmcgzyX4GJDJWx13WstRXmUAAQUgESTaeuySzNBslUViZH9DexOLlXIahL4r8idrvdqz5nEhBxEk2nrskszQbJVFYmR/Q3sTi5VyGoS+K/Ina73as+ZxGQB3Ky2nVgAAgAEAAIAAAACAAAAAAAUAAAAA\",\n\t// Case: PSBT with one P2WSH input of a 2-of-2 multisig. witnessScript,\n\t// keypaths, and global xpubs are available. Contains no signatures.\n\t// Outputs filled.\n\t7: \"cHNidP8BAFICAAAAAZ38ZijCbFiZ/hvT3DOGZb/VXXraEPYiCXPfLTht7BJ2AQAAAAD/////AfA9zR0AAAAAFgAUezoAv9wU0neVwrdJAdCdpu8TNXkAAAAATwEENYfPAto/0AiAAAAAlwSLGtBEWx7IJ1UXcnyHtOTrwYogP/oPlMAVZr046QADUbdDiH7h1A3DKmBDck8tZFmztaTXPa7I+64EcvO8Q+IM2QxqT64AAIAAAACATwEENYfPAto/0AiAAAABuQRSQnE5zXjCz/JES+NTzVhgXj5RMoXlKLQH+uP2FzUD0wpel8itvFV9rCrZp+OcFyLrrGnmaLbyZnzB1nHIPKsM2QxqT64AAIABAACAAAEBKwBlzR0AAAAAIgAgLFSGEmxJeAeagU4TcV1l82RZ5NbMre0mbQUIZFuvpjIBBUdSIQKdoSzbWyNWkrkVNq/v5ckcOrlHPY5DtTODarRWKZyIcSEDNys0I07Xz5wf6l0F1EFVeSe+lUKxYusC4ass6AIkwAtSriIGAp2hLNtbI1aSuRU2r+/lyRw6uUc9jkO1M4NqtFYpnIhxENkMak+uAACAAAAAgAAAAAAiBgM3KzQjTtfPnB/qXQXUQVV5J76VQrFi6wLhqyzoAiTACxDZDGpPrgAAgAEAAIAAAAAAACICA57/H1R6HV+S36K6evaslxpL0DukpzSwMVaiVritOh75EO3kXMUAAACAAAAAgAEAAIAA\",\n\t// Case: PSBT with `PSBT_GLOBAL_XPUB`.\n\t8: \"cHNidP8BAJ0BAAAAAnEOp2q0XFy2Q45gflnMA3YmmBgFrp4N/ZCJASq7C+U1AQAAAAD/////GQmU1qizyMgsy8+y+6QQaqBmObhyqNRHRlwNQliNbWcAAAAAAP////8CAOH1BQAAAAAZdqkUtrwsDuVlWoQ9ea/t0MzD991kNAmIrGBa9AUAAAAAFgAUEYjvjkzgRJ6qyPsUHL9aEXbmoIgAAAAATwEEiLIeA55TDKyAAAAAPbyKXJdp8DGxfnf+oVGGAyIaGP0Y8rmlTGyMGsdcvDUC8jBYSxVdHH8c1FEgplPEjWULQxtnxbLBPyfXFCA3wWkQJ1acUDEAAIAAAACAAAAAgAABAR8A4fUFAAAAABYAFDO5gvkbKPFgySC0q5XljOUN2jpKIgIDMJaA8zx9446mpHzU7NZvH1pJdHxv+4gI7QkDkkPjrVxHMEQCIC1wTO2DDFapCTRL10K2hS3M0QPpY7rpLTjnUlTSu0JFAiAthsQ3GV30bAztoITyopHD2i1kBw92v5uQsZXn7yj3cgEiBgMwloDzPH3jjqakfNTs1m8fWkl0fG/7iAjtCQOSQ+OtXBgnVpxQMQAAgAAAAIAAAACAAAAAAAEAAAAAAQEfAOH1BQAAAAAWABQ4j7lEMH63fvRRl9CwskXgefAR3iICAsd3Fh9z0LfHK57nveZQKT0T8JW8dlatH1Jdpf0uELEQRzBEAiBMsftfhpyULg4mEAV2ElQ5F5rojcqKncO6CPeVOYj6pgIgUh9JynkcJ9cOJzybFGFphZCTYeJb4nTqIA1+CIJ+UU0BIgYCx3cWH3PQt8crnue95lApPRPwlbx2Vq0fUl2l/S4QsRAYJ1acUDEAAIAAAACAAAAAgAAAAAAAAAAAAAAiAgLSDKUC7iiWhtIYFb1DqAY3sGmOH7zb5MrtRF9sGgqQ7xgnVpxQMQAAgAAAAIAAAACAAAAAAAQAAAAA\",\n}\n\n// These are all invalid PSBTs for the indicated reasons.\nvar invalidPsbtHex = map[int]string{\n\t// wire format, not PSBT format\n\t0: \"0200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf6000000006a473044022070b2245123e6bf474d60c5b50c043d4c691a5d2435f09a34a7662a9dc251790a022001329ca9dacf280bdf30740ec0390422422c81cb45839457aeb76fc12edd95b3012102657d118d3357b8e0f4c2cd46db7b39f6d9c38d9a70abcb9b2de5dc8dbfe4ce31feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e1300\",\n\t// missing outputs\n\t1: \"70736274ff0100750200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf60000000000feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e1300000100fda5010100000000010289a3c71eab4d20e0371bbba4cc698fa295c9463afa2e397f8533ccb62f9567e50100000017160014be18d152a9b012039daf3da7de4f53349eecb985ffffffff86f8aa43a71dff1448893a530a7237ef6b4608bbb2dd2d0171e63aec6a4890b40100000017160014fe3e9ef1a745e974d902c4355943abcb34bd5353ffffffff0200c2eb0b000000001976a91485cff1097fd9e008bb34af709c62197b38978a4888ac72fef84e2c00000017a914339725ba21efd62ac753a9bcd067d6c7a6a39d05870247304402202712be22e0270f394f568311dc7ca9a68970b8025fdd3b240229f07f8a5f3a240220018b38d7dcd314e734c9276bd6fb40f673325bc4baa144c800d2f2f02db2765c012103d2e15674941bad4a996372cb87e1856d3652606d98562fe39c5e9e7e413f210502483045022100d12b852d85dcd961d2f5f4ab660654df6eedcc794c0c33ce5cc309ffb5fce58d022067338a8e0e1725c197fb1a88af59f51e44e4255b20167c8684031c05d1f2592a01210223b72beef0965d10be0778efecd61fcac6f79a4ea169393380734464f84f2ab30000000000\",\n\t// Filled in scriptSig in unsigned tx\n\t2: \"70736274ff0100fd0a010200000002ab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be4000000006a47304402204759661797c01b036b25928948686218347d89864b719e1f7fcf57d1e511658702205309eabf56aa4d8891ffd111fdf1336f3a29da866d7f8486d75546ceedaf93190121035cdc61fc7ba971c0b501a646a2a83b102cb43881217ca682dc86e2d73fa88292feffffffab0949a08c5af7c49b8212f417e2f15ab3f5c33dcf153821a8139f877a5b7be40100000000feffffff02603bea0b000000001976a914768a40bbd740cbe81d988e71de2a4d5c71396b1d88ac8e240000000000001976a9146f4620b553fa095e721b9ee0efe9fa039cca459788ac00000000000001012000e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787010416001485d13537f2e265405a34dbafa9e3dda01fb82308000000\",\n\t// No unsigned tx\n\t3: \"70736274ff000100fda5010100000000010289a3c71eab4d20e0371bbba4cc698fa295c9463afa2e397f8533ccb62f9567e50100000017160014be18d152a9b012039daf3da7de4f53349eecb985ffffffff86f8aa43a71dff1448893a530a7237ef6b4608bbb2dd2d0171e63aec6a4890b40100000017160014fe3e9ef1a745e974d902c4355943abcb34bd5353ffffffff0200c2eb0b000000001976a91485cff1097fd9e008bb34af709c62197b38978a4888ac72fef84e2c00000017a914339725ba21efd62ac753a9bcd067d6c7a6a39d05870247304402202712be22e0270f394f568311dc7ca9a68970b8025fdd3b240229f07f8a5f3a240220018b38d7dcd314e734c9276bd6fb40f673325bc4baa144c800d2f2f02db2765c012103d2e15674941bad4a996372cb87e1856d3652606d98562fe39c5e9e7e413f210502483045022100d12b852d85dcd961d2f5f4ab660654df6eedcc794c0c33ce5cc309ffb5fce58d022067338a8e0e1725c197fb1a88af59f51e44e4255b20167c8684031c05d1f2592a01210223b72beef0965d10be0778efecd61fcac6f79a4ea169393380734464f84f2ab30000000000\",\n\t// Duplicate keys in an input\n\t4: \"70736274ff0100750200000001268171371edff285e937adeea4b37b78000c0566cbb3ad64641713ca42171bf60000000000feffffff02d3dff505000000001976a914d0c59903c5bac2868760e90fd521a4665aa7652088ac00e1f5050000000017a9143545e6e33b832c47050f24d3eeb93c9c03948bc787b32e1300000100fda5010100000000010289a3c71eab4d20e0371bbba4cc698fa295c9463afa2e397f8533ccb62f9567e50100000017160014be18d152a9b012039daf3da7de4f53349eecb985ffffffff86f8aa43a71dff1448893a530a7237ef6b4608bbb2dd2d0171e63aec6a4890b40100000017160014fe3e9ef1a745e974d902c4355943abcb34bd5353ffffffff0200c2eb0b000000001976a91485cff1097fd9e008bb34af709c62197b38978a4888ac72fef84e2c00000017a914339725ba21efd62ac753a9bcd067d6c7a6a39d05870247304402202712be22e0270f394f568311dc7ca9a68970b8025fdd3b240229f07f8a5f3a240220018b38d7dcd314e734c9276bd6fb40f673325bc4baa144c800d2f2f02db2765c012103d2e15674941bad4a996372cb87e1856d3652606d98562fe39c5e9e7e413f210502483045022100d12b852d85dcd961d2f5f4ab660654df6eedcc794c0c33ce5cc309ffb5fce58d022067338a8e0e1725c197fb1a88af59f51e44e4255b20167c8684031c05d1f2592a01210223b72beef0965d10be0778efecd61fcac6f79a4ea169393380734464f84f2ab30000000001003f0200000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff010000000000000000036a010000000000000000\",\n\t// Invalid global transaction typed key\n\t5: \"70736274ff020001550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000\",\n\t// Invalid input witness utxo typed key\n\t6: \"70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac000000000002010020955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000\",\n\t// Invalid pubkey length for input partial signature typed key\n\t7: \"70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87210203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd46304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000\",\n\t// Invalid redeemscript typed key\n\t8: \"70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a01020400220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000\",\n\t// Invalid witness script typed key\n\t9: \"70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d568102050047522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000\",\n\t// Invalid bip32 typed key\n\t10: \"70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae210603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd10b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000\",\n\t// Invalid non-witness utxo typed key\n\t11: \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f0000000000020000bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000107da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870107232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b20289030108da0400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000\",\n\t// Invalid final scriptsig typed key\n\t12: \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000020700da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870107232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b20289030108da0400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000\",\n\t// Invalid final script witness typed key\n\t13: \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000107da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870107232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903020800da0400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000\",\n\t// Invalid pubkey in output BIP32 derivation paths typed key\n\t14: \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000107da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870107232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b20289030108da0400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00210203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca58710d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000\",\n\t// Invalid input sighash type typed key\n\t15: \"70736274ff0100730200000001301ae986e516a1ec8ac5b4bc6573d32f83b465e23ad76167d68b38e730b4dbdb0000000000ffffffff02747b01000000000017a91403aa17ae882b5d0d54b25d63104e4ffece7b9ea2876043993b0000000017a914b921b1ba6f722e4bfa83b6557a3139986a42ec8387000000000001011f00ca9a3b00000000160014d2d94b64ae08587eefc8eeb187c601e939f9037c0203000100000000010016001462e9e982fff34dd8239610316b090cd2a3b747cb000100220020876bad832f1d168015ed41232a9ea65a1815d9ef13c0ef8759f64b5b2b278a65010125512103b7ce23a01c5b4bf00a642537cdfabb315b668332867478ef51309d2bd57f8a8751ae00\",\n\t// Invalid output redeemscript typed key\n\t16: \"70736274ff0100730200000001301ae986e516a1ec8ac5b4bc6573d32f83b465e23ad76167d68b38e730b4dbdb0000000000ffffffff02747b01000000000017a91403aa17ae882b5d0d54b25d63104e4ffece7b9ea2876043993b0000000017a914b921b1ba6f722e4bfa83b6557a3139986a42ec8387000000000001011f00ca9a3b00000000160014d2d94b64ae08587eefc8eeb187c601e939f9037c0002000016001462e9e982fff34dd8239610316b090cd2a3b747cb000100220020876bad832f1d168015ed41232a9ea65a1815d9ef13c0ef8759f64b5b2b278a65010125512103b7ce23a01c5b4bf00a642537cdfabb315b668332867478ef51309d2bd57f8a8751ae00\",\n\t// Invalid output witnessScript typed key\n\t17: \"70736274ff0100730200000001301ae986e516a1ec8ac5b4bc6573d32f83b465e23ad76167d68b38e730b4dbdb0000000000ffffffff02747b01000000000017a91403aa17ae882b5d0d54b25d63104e4ffece7b9ea2876043993b0000000017a914b921b1ba6f722e4bfa83b6557a3139986a42ec8387000000000001011f00ca9a3b00000000160014d2d94b64ae08587eefc8eeb187c601e939f9037c00010016001462e9e982fff34dd8239610316b090cd2a3b747cb000100220020876bad832f1d168015ed41232a9ea65a1815d9ef13c0ef8759f64b5b2b278a6521010025512103b7ce23a01c5b4bf00a642537cdfabb315b668332867478ef51309d2bd57f8a8751ae00\",\n\t// Additional cases outside the existing test vectors.\n\t// Invalid duplicate PartialSig\n\t18: \"70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a01220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd10b4a6ba670000008000000080050000800000\",\n\t// Invalid duplicate BIP32 derivation (different derivs, same key)\n\t19: \"70736274ff0100550200000001279a2323a5dfb51fc45f220fa58b0fc13e1e3342792a85d7e36cd6333b5cbc390000000000ffffffff01a05aea0b000000001976a914ffe9c0061097cc3b636f2cb0460fa4fc427d2b4588ac0000000000010120955eea0b0000000017a9146345200f68d189e1adc0df1c4d16ea8f14c0dbeb87220203b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4646304302200424b58effaaa694e1559ea5c93bbfd4a89064224055cdf070b6771469442d07021f5c8eb0fea6516d60b8acb33ad64ede60e8785bfb3aa94b99bdf86151db9a9a010104220020771fd18ad459666dd49f3d564e3dbc42f4c84774e360ada16816a8ed488d5681010547522103b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd462103de55d1e1dac805e3f8a58c1fbf9b94c02f3dbaafe127fefca4995f26f82083bd52ae220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba67000000800000008004000080220603b1341ccba7683b6af4f1238cd6e97e7167d569fac47f1e48d47541844355bd4610b4a6ba670000008000000080050000800000\",\n\t// Invalid var int for key type\n\t20: \"70736274ff01001c000000000002000000000000000000000000736210ff01000001010010ff70ff01001c00000000000000000000000000000000000000000000\",\n}\n\n// All following PSBTs are Taproot specific invalid packets taken from\n// https://github.com/bitcoin/bitcoin/pull/22558.\nvar invalidPsbtBase64 = map[int]string{\n\t// Invalid input internal key length.\n\t0: \"cHNidP8BAHECAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Anh8AQAAAAAAFgAUg6fjS9mf8DpJYu+KGhAbspVGHs5gawQqAQAAABYAFHrDad8bIOAz1hFmI5V7CsSfPFLoAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXARchAv40kGTJjW4qhT+jybEr2LMEoZwZXGDvp+4jkwRtP6IyAAAA\",\n\t// Invalid input key spend schnorr signature.\n\t1: \"cHNidP8BAHECAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Anh8AQAAAAAAFgAUg6fjS9mf8DpJYu+KGhAbspVGHs5gawQqAQAAABYAFHrDad8bIOAz1hFmI5V7CsSfPFLoAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXARM/Fzuz02wHSvtxb+xjB6BpouRQuZXzyCeFlFq43w4kJg3NcDsMvzTeOZGEqUgawrNYbbZgHwJqd/fkk4SBvDR1AAAA\",\n\t// Invalid input key spend signature length.\n\t2: \"cHNidP8BAHECAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Anh8AQAAAAAAFgAUg6fjS9mf8DpJYu+KGhAbspVGHs5gawQqAQAAABYAFHrDad8bIOAz1hFmI5V7CsSfPFLoAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXARNCFzuz02wHSvtxb+xjB6BpouRQuZXzyCeFlFq43w4kJg3NcDsMvzTeOZGEqUgawrNYbbZgHwJqd/fkk4SBvDR1FwGqAAAA\",\n\t// Invalid input x-only pubkey in key.\n\t3: \"cHNidP8BAHECAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Anh8AQAAAAAAFgAUg6fjS9mf8DpJYu+KGhAbspVGHs5gawQqAQAAABYAFHrDad8bIOAz1hFmI5V7CsSfPFLoAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXIhYC/jSQZMmNbiqFP6PJsSvYswShnBlcYO+n7iOTBG0/ojIZAHcrLadWAACAAQAAgAAAAIABAAAAAAAAAAAAAA==\",\n\t// Invalid output internal key length.\n\t4: \"cHNidP8BAH0CAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Aoh7AQAAAAAAFgAUI4KHHH6EIaAAk/dU2RKB5nWHS59gawQqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXAAABBSEC/jSQZMmNbiqFP6PJsSvYswShnBlcYO+n7iOTBG0/ojIA\",\n\t// Invalid output BIP32 derivation x-only pubkey in key.\n\t5: \"cHNidP8BAH0CAAAAASd0Srq/MCf+DWzyOpbu4u+xiO9SMBlUWFiD5ptmJLJCAAAAAAD/////Aoh7AQAAAAAAFgAUI4KHHH6EIaAAk/dU2RKB5nWHS59gawQqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXAAAAAAABASsA8gUqAQAAACJRIFosLPW1LPMfg60ujaY/8DGD7Nj2CcdRCuikjgORCgdXAAAiBwL+NJBkyY1uKoU/o8mxK9izBKGcGVxg76fuI5MEbT+iMhkAdystp1YAAIABAACAAAAAgAEAAAAAAAAAAA==\",\n\t// Invalid input script spend signature key length.\n\t6: \"cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJCFAIssTrGgkjegGqmo2Wc88A+toIdCcgRSk6Gj+vehlu20s2XDhX1P8DIL5UP1WD/qRm3YXK+AXNoqJkTrwdPQAsJQIl1aqNznMxonsD886NgvjLMC1mxbpOh6LtGBXJrLKej/3BsQXZkljKyzGjh+RK4pXjjcZzncQiFx6lm9JvNQ8sAAA==\",\n\t// Invalid input script spend signature length.\n\t7: \"cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJBFCyxOsaCSN6AaqajZZzzwD62gh0JyBFKToaP696GW7bSzZcOFfU/wMgvlQ/VYP+pGbdhcr4Bc2iomROvB09ACwlCiXVqo3OczGiewPzzo2C+MswLWbFuk6Hou0YFcmssp6P/cGxBdmSWMrLMaOH5ErileONxnOdxCIXHqWb0m81DywEBAAA=\",\n\t// Invalid encoding of base64 stream.\n\t8: \"cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJBFCyxOsaCSN6AaqajZZzzwD62gh0JyBFKToaP696GW7bSzZcOFfU/wMgvlQ/VYP+pGbdhcr4Bc2iomROvB09ACwk5iXVqo3OczGiewPzzo2C+MswLWbFuk6Hou0YFcmssp6P/cGxBdmSWMrLMaOH5ErileONxnOdxCIXHqWb0m81DywAA\",\n\t// Invalid input leaf script type control block.\n\t9: \"cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJjFcFQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wG99YgWelJehpKJnVp2YdtpgEBr/OONSm5uTnOf5GulwEV8uSQr3zEXE94UR82BXzlxaXFYyWin7RN/CA/NW4fgAIyAssTrGgkjegGqmo2Wc88A+toIdCcgRSk6Gj+vehlu20qzAAAA=\",\n\t// Invalid input leaf script type control block.\n\t10: \"cHNidP8BAF4CAAAAAZvUh2UjC/mnLmYgAflyVW5U8Mb5f+tWvLVgDYF/aZUmAQAAAAD/////AUjmBSoBAAAAIlEgAw2k/OT32yjCyylRYx4ANxOFZZf+ljiCy1AOaBEsymMAAAAAAAEBKwDyBSoBAAAAIlEgwiR++/2SrEf29AuNQtFpF1oZ+p+hDkol1/NetN2FtpJhFcFQkpt0waBJVLeLS2A16XpeB4paDyjsltVHv+6azoA6wG99YgWelJehpKJnVp2YdtpgEBr/OONSm5uTnOf5GulwEV8uSQr3zEXE94UR82BXzlxaXFYyWin7RN/CA/NW4SMgLLE6xoJI3oBqpqNlnPPAPraCHQnIEUpOho/r3oZbttKswAAA\",\n}\n\n// This tests that valid PSBT serializations can be parsed\n// into Psbt structs.\nfunc TestReadValidPsbtAndReserialize(t *testing.T) {\n\tfor key, v := range validPsbtHex {\n\t\tpsbtBytes, err := hex.DecodeString(v)\n\t\trequire.NoErrorf(t, err, \"%d: hex decode\", key)\n\n\t\ttestPsbt, err := NewFromRawBytes(\n\t\t\tbytes.NewReader(psbtBytes), false,\n\t\t)\n\t\trequire.NoErrorf(t, err, \"%d: parse\", key)\n\n\t\tt.Logf(\"Successfully parsed test %d, got transaction: %v\",\n\t\t\tkey, spew.Sdump(testPsbt.UnsignedTx))\n\n\t\tvar b bytes.Buffer\n\t\terr = testPsbt.Serialize(&b)\n\t\trequire.NoErrorf(t, err, \"%d: serialize\", key)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Unable to serialize created Psbt: %v\", err)\n\t\t}\n\n\t\trequire.Equal(t, psbtBytes, b.Bytes(), \"%d: serialized\", key)\n\t}\n\n\tfor key, v := range validPsbtBase64 {\n\t\ttestPsbt, err := NewFromRawBytes(\n\t\t\tstrings.NewReader(v), true,\n\t\t)\n\t\trequire.NoErrorf(t, err, \"%d: parse\", key)\n\n\t\tt.Logf(\"Successfully parsed test %d, got transaction: %v\",\n\t\t\tkey, spew.Sdump(testPsbt.UnsignedTx))\n\n\t\tvar b bytes.Buffer\n\t\terr = testPsbt.Serialize(&b)\n\t\trequire.NoErrorf(t, err, \"%d: serialize\", key)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Unable to serialize created Psbt: %v\", err)\n\t\t}\n\n\t\tbase64Packet := base64.StdEncoding.EncodeToString(b.Bytes())\n\t\trequire.Equal(t, v, base64Packet, \"%d: serialized\", key)\n\t}\n}\n\nfunc TestReadInvalidPsbt(t *testing.T) {\n\tfor key, v := range invalidPsbtHex {\n\t\tpsbtBytes, err := hex.DecodeString(v)\n\t\trequire.NoErrorf(t, err, \"%d: hex decode\", key)\n\n\t\t_, err = NewFromRawBytes(bytes.NewReader(psbtBytes), false)\n\t\trequire.Errorf(t, err, \"%d: new from raw bytes\", key)\n\n\t\tt.Logf(\"Correctly got error: %v\", err)\n\t}\n\n\tfor key, v := range invalidPsbtBase64 {\n\t\t_, err := NewFromRawBytes(strings.NewReader(v), true)\n\t\trequire.Errorf(t, err, \"%d: new from raw bytes\", key)\n\n\t\tt.Logf(\"Correctly got error: %v\", err)\n\t}\n}\n\nfunc TestSanityCheck(t *testing.T) {\n\t// TODO(guggero): Remove when checks for segwit v1 are implemented.\n\tt.Skip(\"Skipping PSBT sanity checks for segwit v0.\")\n\n\t// Test strategy:\n\t// 1. Create an invalid PSBT from a serialization\n\t// Then ensure that the sanity check fails.\n\t// 2. Create a valid PSBT from a serialization\n\t// Then create an updater, add a witness utxo to a non-witness\n\t// utxo.\n\t// Then ensure that the sanity check fails.\n\t// Then add a witnessScript field to a non-witness utxo.\n\t// Then ensure that the sanity check fails.\n\n\t// index 1 contains a psbt with two inputs, first non-witness,\n\t// second witness.\n\tpsbtraw1, err := hex.DecodeString(validPsbtHex[1])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tpsbt1, err := NewFromRawBytes(bytes.NewReader(psbtraw1), false)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create Psbt struct: %v\", err)\n\t}\n\n\t// Add a non-witness utxo field to input2 using raw insertion function,\n\t// so that it becomes invalid, then NewUpdater should fail.\n\tnonWitnessUtxoRaw, err := hex.DecodeString(\n\t\tCUTestHexData[\"NonWitnessUtxo\"],\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tnonWitnessUtxo := wire.NewMsgTx(2)\n\terr = nonWitnessUtxo.Deserialize(bytes.NewReader(nonWitnessUtxoRaw))\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to deserialize: %v\", err)\n\t}\n\tinputs1 := &psbt1.Inputs[1]\n\tinputs1.NonWitnessUtxo = nonWitnessUtxo\n\n\t// The PSBT is now in an inconsistent state; Updater creation should\n\t// fail.\n\tupdater, err := NewUpdater(psbt1)\n\tif err == nil {\n\t\tt.Fatalf(\"Failed to identify invalid PSBT state ( \" +\n\t\t\t\"witness, non-witness fields)\")\n\t}\n\n\t// Overwrite back with the correct psbt\n\tpsbtraw1, err = hex.DecodeString(validPsbtHex[1])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tpsbt1, err = NewFromRawBytes(bytes.NewReader(psbtraw1), false)\n\tupdater, err = NewUpdater(psbt1)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create Updater: %v\", err)\n\t}\n\n\t// Create a fake non-witness utxo field to overlap with\n\t// the existing witness input at index 1.\n\ttx := wire.NewMsgTx(2)\n\terr = tx.Deserialize(bytes.NewReader(nonWitnessUtxoRaw))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\terr = updater.AddInNonWitnessUtxo(tx, 1)\n\tif err == nil {\n\t\tt.Fatalf(\"Incorrectly accepted Psbt with conflicting witness \" +\n\t\t\t\"and non-witness utxo entries in the same input.\")\n\t}\n\n\t// Now we try again; this time we try to add a witnessScript\n\t// key-value pair to an input which is non-witness, which should\n\t// also be rejected.\n\tpsbt2, err := NewFromRawBytes(\n\t\tbytes.NewReader(psbtraw1), false,\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create Psbt struct: %v\", err)\n\t}\n\tupdater2, err := NewUpdater(psbt2)\n\tif err != nil {\n\t\tt.Fatalf(\"Got error creating  updater2: %v\", err)\n\t}\n\twitnessScript, err := hex.DecodeString(\n\t\tCUTestHexData[\"Input2WitnessScript\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\terr = updater2.AddInWitnessScript(witnessScript, 0)\n\tif err == nil {\n\t\tt.Fatalf(\"Incorrectly accepted adding witness script field \" +\n\t\t\t\"to non-witness utxo\")\n\t}\n}\n\n// Data for creation and updating tests\n// ===============================================================================\nvar CUTestHexData = map[string]string{\n\t\"scriptPubkey1\":  \"0014d85c2b71d0060b09c9886aeb815e50991dda124d\",\n\t\"scriptPubkey2\":  \"001400aea9a2e5f0f876a588df5546e8742d1d87008f\",\n\t\"txid1\":          \"75ddabb27b8845f5247975c8a5ba7c6f336c4570708ebe230caf6db5217ae858\",\n\t\"txid2\":          \"1dea7cd05979072a3578cab271c02244ea8a090bbb46aa680a65ecd027048d83\",\n\t\"COPsbtHex\":      \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000000000000000000\",\n\t\"NonWitnessUtxo\": \"0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000\",\n\t\"WitnessUtxo\":    \"00c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e887\",\n\t// After adding witnessutxo and nonwitness utxo to inputs:\n\t\"UOPsbtHex\":           \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e887000000\",\n\t\"Input1RedeemScript\":  \"5221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae\",\n\t\"Input2RedeemScript\":  \"00208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903\",\n\t\"Input2WitnessScript\": \"522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae\",\n\t// After adding redeemscripts and witness scripts to inputs:\n\t\"UOPsbtHex2\": \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88701042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae000000\",\n\t// After adding bip32 derivations to inputs and outputs:\n\t\"UOPsbtHex3\": \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88701042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000\",\n\t//After adding sighash types to inputs\n\t\"UOPsbtHex4\": \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000010304010000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870103040100000001042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000\",\n}\n\n// Just one example sanity check of B64 construction; after sighash appending above\nvar CUTestB64Data = map[string]string{\n\t\"UOPsbtB644\": \"cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAABAwQBAAAAAQRHUiEClYO/Oa4KYJdHrRma3dY0+mEIVZ1sXNObTCGD8auW4H8hAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXUq4iBgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfxDZDGpPAAAAgAAAAIAAAACAIgYC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtcQ2QxqTwAAAIAAAACAAQAAgAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohwEDBAEAAAABBCIAIIwjUxc3Q7WV37Sge3K6jkLjeX2nTof+fZ10l+OyAokDAQVHUiEDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwhAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zUq4iBgI63ZBPPW3PWd25BrDe4jUpt/+57VDl6GFRkmhgIh8OcxDZDGpPAAAAgAAAAIADAACAIgYDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwQ2QxqTwAAAIAAAACAAgAAgAAiAgOppMN/WZbTqiXbrGtXCvBlA5RJKUJGCzVHU+2e7KWHcRDZDGpPAAAAgAAAAIAEAACAACICAn9jmXV9Lv9VoTatAsaEsYOLZVbl8bazQoKpS2tQBRCWENkMak8AAACAAAAAgAUAAIAA\",\n}\n\nvar CUTestAmountData = map[string]int64{\n\t\"amount1\": 149990000,\n\t\"amount2\": 100000000,\n\t\"amount3\": 200000000,\n}\n\nvar CUTestIndexData = map[string]uint32{\n\t\"index1\": 0,\n\t\"index2\": 1,\n}\n\nvar CUMasterKeyFingerPrint = \"d90c6a4f\"\n\nvar CUTestPathData = map[string][]uint32{\n\t\"dpath1\": {0 + 0x80000000, 0 + 0x80000000, 0 + 0x80000000},\n\t\"dpath2\": {0 + 0x80000000, 0 + 0x80000000, 1 + 0x80000000},\n\t\"dpath3\": {0 + 0x80000000, 0 + 0x80000000, 2 + 0x80000000},\n\t\"dpath4\": {0 + 0x80000000, 0 + 0x80000000, 3 + 0x80000000},\n\t\"dpath5\": {0 + 0x80000000, 0 + 0x80000000, 4 + 0x80000000},\n\t\"dpath6\": {0 + 0x80000000, 0 + 0x80000000, 5 + 0x80000000},\n}\n\nvar CUTestPubkeyData = map[string]string{\n\t\"pub1\": \"029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f\",\n\t\"pub2\": \"02dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d7\",\n\t\"pub3\": \"03089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc\",\n\t\"pub4\": \"023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e73\",\n\t\"pub5\": \"03a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca58771\",\n\t\"pub6\": \"027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b50051096\",\n}\n\n// ===============================================================================\n\nfunc TestPsbtCreator(t *testing.T) {\n\tspkOut1, err := hex.DecodeString(CUTestHexData[\"scriptPubkey1\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Error: %v\", err)\n\t}\n\tspkOut2, err := hex.DecodeString(CUTestHexData[\"scriptPubkey2\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Error: %v\", err)\n\t}\n\tout1 := wire.NewTxOut(CUTestAmountData[\"amount1\"], spkOut1)\n\tout2 := wire.NewTxOut(CUTestAmountData[\"amount2\"], spkOut2)\n\toutputs := []*wire.TxOut{out1, out2}\n\thash1, err := chainhash.NewHashFromStr(CUTestHexData[\"txid1\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Error: %v\", err)\n\t}\n\tprevOut1 := wire.NewOutPoint(hash1, uint32(0))\n\thash2, err := chainhash.NewHashFromStr(CUTestHexData[\"txid2\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Error: %v\", err)\n\t}\n\tprevOut2 := wire.NewOutPoint(hash2, uint32(1))\n\tinputs := []*wire.OutPoint{prevOut1, prevOut2}\n\n\t// Check creation fails with invalid sequences:\n\tnSequences := []uint32{wire.MaxTxInSequenceNum}\n\t_, err = New(inputs, outputs, int32(3), uint32(0), nSequences)\n\tif err == nil {\n\t\tt.Fatalf(\"Did not error when creating transaction with \" +\n\t\t\t\"invalid nSequences\")\n\t}\n\tnSequences = append(nSequences, wire.MaxTxInSequenceNum)\n\n\t// Check creation fails with invalid version\n\t_, err = New(inputs, outputs, int32(0), uint32(0), nSequences)\n\tif err == nil {\n\t\tt.Fatalf(\"Did not error when creating transaction with \" +\n\t\t\t\"invalid version (3)\")\n\t}\n\n\t// Use valid data to create:\n\tcPsbt, err := New(inputs, outputs, int32(2), uint32(0), nSequences)\n\tvar b bytes.Buffer\n\terr = cPsbt.Serialize(&b)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to serialize created Psbt: %v\", err)\n\t}\n\tif CUTestHexData[\"COPsbtHex\"] != hex.EncodeToString(b.Bytes()) {\n\t\tt.Fatalf(\"Failed to create expected psbt, instead got: %v\",\n\t\t\thex.EncodeToString(b.Bytes()))\n\t}\n\n\t// Now simulate passing the created PSBT to an Updater\n\tupdater, err := NewUpdater(cPsbt)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create Updater object\")\n\t}\n\ttx := wire.NewMsgTx(2)\n\tnonWitnessUtxoHex, err := hex.DecodeString(\n\t\tCUTestHexData[\"NonWitnessUtxo\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\terr = tx.Deserialize(bytes.NewReader(nonWitnessUtxoHex))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\twitnessUtxoHex, err := hex.DecodeString(\n\t\tCUTestHexData[\"WitnessUtxo\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\ttxout := wire.TxOut{Value: CUTestAmountData[\"amount3\"],\n\t\tPkScript: witnessUtxoHex[9:]}\n\terr = updater.AddInNonWitnessUtxo(tx, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to add NonWitness Utxo to inputs: %v\", err)\n\t}\n\terr = updater.AddInWitnessUtxo(&txout, 1)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to add Witness Utxo to inputs: %v\", err)\n\t}\n\n\tb.Reset()\n\n\terr = updater.Upsbt.Serialize(&b)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to serialize updated Psbt: %v\", err)\n\t}\n\tif CUTestHexData[\"UOPsbtHex\"] != hex.EncodeToString(b.Bytes()) {\n\t\tt.Fatal(\"Failed to create valid updated PSBT after utxos\")\n\t}\n\tinput1RedeemScript, err := hex.DecodeString(CUTestHexData[\"Input1RedeemScript\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\terr = updater.AddInRedeemScript(input1RedeemScript, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to add redeem script: %v\", err)\n\t}\n\tinput2RedeemScript, err := hex.DecodeString(CUTestHexData[\"Input2RedeemScript\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\terr = updater.AddInRedeemScript(input2RedeemScript, 1)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to add redeem script: %v\", err)\n\t}\n\tinput2WitnessScript, err := hex.DecodeString(CUTestHexData[\"Input2WitnessScript\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\terr = updater.AddInWitnessScript(input2WitnessScript, 1)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to add witness script: %v\", err)\n\t}\n\n\tb.Reset()\n\terr = updater.Upsbt.Serialize(&b)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to serialize updated Psbt: %v\", err)\n\t}\n\tif CUTestHexData[\"UOPsbtHex2\"] != hex.EncodeToString(b.Bytes()) {\n\t\tt.Fatal(\"Failed to create valid updated PSBT after redeem scripts\")\n\t}\n\tmasterKey, err := hex.DecodeString(CUMasterKeyFingerPrint)\n\tmasterKeyInt := binary.LittleEndian.Uint32(masterKey)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tinput1Path1 := CUTestPathData[\"dpath1\"]\n\tinput1Path2 := CUTestPathData[\"dpath2\"]\n\tinput1Key1, err := hex.DecodeString(CUTestPubkeyData[\"pub1\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tinput1Key2, err := hex.DecodeString(CUTestPubkeyData[\"pub2\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\terr = updater.AddInBip32Derivation(masterKeyInt, input1Path1, input1Key1, 0)\n\tif err != nil {\n\t\tt.Fatal(\"Failed to add first key derivation for input 1\")\n\t}\n\terr = updater.AddInBip32Derivation(masterKeyInt, input1Path2, input1Key2, 0)\n\tif err != nil {\n\t\tt.Fatal(\"Failed to add second key derivation for input 1\")\n\t}\n\tinput2Path1 := CUTestPathData[\"dpath3\"]\n\tinput2Path2 := CUTestPathData[\"dpath4\"]\n\tinput2Key1, err := hex.DecodeString(CUTestPubkeyData[\"pub3\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tinput2Key2, err := hex.DecodeString(CUTestPubkeyData[\"pub4\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\n\t// check invalid pubkeys are not accepted\n\tborkedInput2Key1 := append([]byte{0xff}, input2Key1...)\n\terr = updater.AddInBip32Derivation(masterKeyInt, input2Path1,\n\t\tborkedInput2Key1, 1)\n\tif err == nil {\n\t\tt.Fatalf(\"Expected invalid pubkey, got: %v\", err)\n\t}\n\n\terr = updater.AddInBip32Derivation(masterKeyInt, input2Path1, input2Key1, 1)\n\tif err != nil {\n\t\tt.Fatal(\"Failed to add first key derivation for input 2\")\n\t}\n\terr = updater.AddInBip32Derivation(masterKeyInt, input2Path2, input2Key2, 1)\n\tif err != nil {\n\t\tt.Fatal(\"Failed to add second key derivation for input 2\")\n\t}\n\toutput1Key1, err := hex.DecodeString(CUTestPubkeyData[\"pub5\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\toutput1Path := CUTestPathData[\"dpath5\"]\n\n\t// check invalid pubkeys are not accepted\n\tborkedOutput1Key1 := append([]byte{0xab}, output1Key1[:13]...)\n\terr = updater.AddOutBip32Derivation(masterKeyInt, output1Path,\n\t\tborkedOutput1Key1, 0)\n\tif err == nil {\n\t\tt.Fatalf(\"Expected invalid pubkey, got: %v\", err)\n\t}\n\n\terr = updater.AddOutBip32Derivation(masterKeyInt, output1Path, output1Key1, 0)\n\tif err != nil {\n\t\tt.Fatal(\"Failed to add key to first output\")\n\t}\n\toutput2Key1, err := hex.DecodeString(CUTestPubkeyData[\"pub6\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\toutput2Path := CUTestPathData[\"dpath6\"]\n\terr = updater.AddOutBip32Derivation(masterKeyInt, output2Path, output2Key1, 1)\n\tif err != nil {\n\t\tt.Fatal(\"Failed to add key to second output\")\n\t}\n\n\tb.Reset()\n\terr = updater.Upsbt.Serialize(&b)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to serialize updated Psbt: %v\", err)\n\t}\n\tif CUTestHexData[\"UOPsbtHex3\"] != hex.EncodeToString(b.Bytes()) {\n\t\tt.Fatal(\"Failed to create valid updated PSBT after BIP32 derivations\")\n\t}\n\terr = updater.AddInSighashType(txscript.SigHashType(1), 0)\n\tif err != nil {\n\t\tt.Fatal(\"Failed to add sighash type to first input\")\n\t}\n\terr = updater.AddInSighashType(txscript.SigHashType(1), 1)\n\tif err != nil {\n\t\tt.Fatal(\"Failed to add sighash type to second input\")\n\t}\n\n\tb.Reset()\n\terr = updater.Upsbt.Serialize(&b)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to serialize updated Psbt: %v\", err)\n\t}\n\tif CUTestHexData[\"UOPsbtHex4\"] != hex.EncodeToString(b.Bytes()) {\n\t\tt.Fatal(\"Failed to create valid updated PSBT after sighash types\")\n\t}\n\tb644, err := updater.Upsbt.B64Encode()\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to B64Encode updated Psbt: %v\", err)\n\t}\n\tif b644 != CUTestB64Data[\"UOPsbtB644\"] {\n\t\tt.Fatalf(\"Failed to base64 encode updated PSBT after sighash \"+\n\t\t\t\"types: %v\", b644)\n\t}\n}\n\n// Signing test data taken from\n// https://github.com/achow101/bitcoin/blob/020628e3a4e88e36647eaf92bac4b3552796ac6a/test/functional/data/rpc_psbt.json\nvar signerPsbtData = map[string]string{\n\t\"signer1Privkey1\": \"cP53pDbR5WtAD8dYAW9hhTjuvvTVaEiQBdrz9XPrgLBeRFiyCbQr\",\n\t\"signer1Privkey2\": \"cR6SXDoyfQrcp4piaiHE97Rsgta9mNhGTen9XeonVgwsh4iSgw6d\",\n\t\"signer1PsbtB64\":  \"cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAABBEdSIQKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfyEC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtdSriIGApWDvzmuCmCXR60Zmt3WNPphCFWdbFzTm0whg/GrluB/ENkMak8AAACAAAAAgAAAAIAiBgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU21xDZDGpPAAAAgAAAAIABAACAAQMEAQAAAAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohwEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQMBBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSriIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAAQMEAQAAAAAiAgOppMN/WZbTqiXbrGtXCvBlA5RJKUJGCzVHU+2e7KWHcRDZDGpPAAAAgAAAAIAEAACAACICAn9jmXV9Lv9VoTatAsaEsYOLZVbl8bazQoKpS2tQBRCWENkMak8AAACAAAAAgAUAAIAA\",\n\t\"signer1Result\":   \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000002202029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01010304010000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e887220203089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f010103040100000001042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000\",\n\t\"signer2Privkey1\": \"cT7J9YpCwY3AVRFSjN6ukeEeWY6mhpbJPxRaDaP5QTdygQRxP9Au\",\n\t\"signer2Privkey2\": \"cNBc3SWUip9PPm1GjRoLEJT6T41iNzCYtD7qro84FMnM5zEqeJsE\",\n\t\"signer2Psbt\":     \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f000000800000008001000080010304010000000001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88701042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f0000008000000080020000800103040100000000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000\",\n\t\"signer2Result\":   \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000220202dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d7483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01010304010000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8872202023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e73473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d2010103040100000001042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000\",\n}\n\nfunc TestPsbtSigner(t *testing.T) {\n\tpsbt1, err := NewFromRawBytes(\n\t\tbytes.NewReader([]byte(signerPsbtData[\"signer1PsbtB64\"])),\n\t\ttrue,\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to parse PSBT: %v\", err)\n\t}\n\tpsbtUpdater1 := Updater{\n\t\tUpsbt: psbt1,\n\t}\n\tsig1, err := hex.DecodeString(\"3044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01\")\n\tpub1, err := hex.DecodeString(\"029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f\")\n\tres, err := psbtUpdater1.Sign(0, sig1, pub1, nil, nil)\n\tif err != nil || res != 0 {\n\t\tt.Fatalf(\"Error from adding signatures: %v %v\", err, res)\n\t}\n\tsig2, err := hex.DecodeString(\"3044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01\")\n\tpub2, err := hex.DecodeString(\"03089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc\")\n\tres, err = psbtUpdater1.Sign(1, sig2, pub2, nil, nil)\n\tif err != nil || res != 0 {\n\t\tt.Fatalf(\"Error from adding signatures: %v %v\", err, res)\n\t}\n\tsigner1Result, err := hex.DecodeString(signerPsbtData[\"signer1Result\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\n\tvar b bytes.Buffer\n\terr = psbtUpdater1.Upsbt.Serialize(&b)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to serialize updated Psbt: %v\", err)\n\t}\n\tif !bytes.Equal(b.Bytes(), signer1Result) {\n\t\tt.Fatalf(\"Failed to add signatures correctly\")\n\t}\n}\n\n// Finalizer-extractor test\n\nvar finalizerPsbtData = map[string]string{\n\t\"finalizeb64\": \"cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgf0cwRAIgdAGK1BgAl7hzMjwAFXILNoTMgSOJEEjn282bVa1nnJkCIHPTabdA4+tT3O+jOCPIBwUUylWn3ZVE8VfBZ5EyYRGMASICAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXSDBFAiEA9hA4swjcHahlo0hSdG8BV3KTQgjG0kRUOTzZm98iF3cCIAVuZ1pnWm0KArhbFOXikHTYolqbV2C+ooFvZhkQoAbqAQEDBAEAAAABBEdSIQKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfyEC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtdSriIGApWDvzmuCmCXR60Zmt3WNPphCFWdbFzTm0whg/GrluB/ENkMak8AAACAAAAAgAAAAIAiBgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU21xDZDGpPAAAAgAAAAIABAACAAAEBIADC6wsAAAAAF6kUt/X69A49QKWkWbHbNTXyty+pIeiHIgIDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtxHMEQCIGLrelVhB6fHP0WsSrWh3d9vcHX7EnWWmn84Pv/3hLyyAiAMBdu3Rw2/LwhVfdNWxzJcHtMJE+mWzThAlF2xIijaXwEiAgI63ZBPPW3PWd25BrDe4jUpt/+57VDl6GFRkmhgIh8Oc0cwRAIgZfRbpZmLWaJ//hp77QFq8fH5DVSzqo90UKpfVqJRA70CIH9yRwOtHtuWaAsoS1bU/8uI9/t1nqu+CKow8puFE4PSAQEDBAEAAAABBCIAIIwjUxc3Q7WV37Sge3K6jkLjeX2nTof+fZ10l+OyAokDAQVHUiEDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwhAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zUq4iBgI63ZBPPW3PWd25BrDe4jUpt/+57VDl6GFRkmhgIh8OcxDZDGpPAAAAgAAAAIADAACAIgYDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwQ2QxqTwAAAIAAAACAAgAAgAAiAgOppMN/WZbTqiXbrGtXCvBlA5RJKUJGCzVHU+2e7KWHcRDZDGpPAAAAgAAAAIAEAACAACICAn9jmXV9Lv9VoTatAsaEsYOLZVbl8bazQoKpS2tQBRCWENkMak8AAACAAAAAgAUAAIAA\",\n\t\"finalize\":    \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000002202029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01220202dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d7483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01010304010000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f0000008000000080010000800001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e887220203089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f012202023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e73473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d2010103040100000001042200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903010547522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae2206023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7310d90c6a4f000000800000008003000080220603089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc10d90c6a4f00000080000000800200008000220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000\",\n\t\"resultb64\":   \"cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAABB9oARzBEAiB0AYrUGACXuHMyPAAVcgs2hMyBI4kQSOfbzZtVrWecmQIgc9Npt0Dj61Pc76M4I8gHBRTKVafdlUTxV8FnkTJhEYwBSDBFAiEA9hA4swjcHahlo0hSdG8BV3KTQgjG0kRUOTzZm98iF3cCIAVuZ1pnWm0KArhbFOXikHTYolqbV2C+ooFvZhkQoAbqAUdSIQKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfyEC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtdSrgABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohwEHIyIAIIwjUxc3Q7WV37Sge3K6jkLjeX2nTof+fZ10l+OyAokDAQjaBABHMEQCIGLrelVhB6fHP0WsSrWh3d9vcHX7EnWWmn84Pv/3hLyyAiAMBdu3Rw2/LwhVfdNWxzJcHtMJE+mWzThAlF2xIijaXwFHMEQCIGX0W6WZi1mif/4ae+0BavHx+Q1Us6qPdFCqX1aiUQO9AiB/ckcDrR7blmgLKEtW1P/LiPf7dZ6rvgiqMPKbhROD0gFHUiEDCJ3BDHrG21T5EymvYXMz2ziM6tDCMfcjN50bmQMLAtwhAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zUq4AIgIDqaTDf1mW06ol26xrVwrwZQOUSSlCRgs1R1Ptnuylh3EQ2QxqTwAAAIAAAACABAAAgAAiAgJ/Y5l1fS7/VaE2rQLGhLGDi2VW5fG2s0KCqUtrUAUQlhDZDGpPAAAAgAAAAIAFAACAAA==\",\n\t\"result\":      \"70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000107da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae0001012000c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e8870107232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b20289030108da0400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00220203a9a4c37f5996d3aa25dbac6b570af0650394492942460b354753ed9eeca5877110d90c6a4f000000800000008004000080002202027f6399757d2eff55a136ad02c684b1838b6556e5f1b6b34282a94b6b5005109610d90c6a4f00000080000000800500008000\",\n\t\"network\":     \"0200000000010258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7500000000da00473044022074018ad4180097b873323c0015720b3684cc8123891048e7dbcd9b55ad679c99022073d369b740e3eb53dcefa33823c8070514ca55a7dd9544f157c167913261118c01483045022100f61038b308dc1da865a34852746f015772934208c6d24454393cd99bdf2217770220056e675a675a6d0a02b85b14e5e29074d8a25a9b5760bea2816f661910a006ea01475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752aeffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d01000000232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00000000\",\n\t\"twoOfThree\":  \"70736274ff01005e01000000019a5fdb3c36f2168ea34a031857863c63bb776fd8a8a9149efd7341dfaf81c9970000000000ffffffff01e013a8040000000022002001c3a65ccfa5b39e31e6bafa504446200b9c88c58b4f21eb7e18412aff154e3f000000000001012bc817a80400000000220020114c9ab91ea00eb3e81a7aa4d0d8f1bc6bd8761f8f00dbccb38060dc2b9fdd5522020242ecd19afda551d58f496c17e3f51df4488089df4caafac3285ed3b9c590f6a847304402207c6ab50f421c59621323460aaf0f731a1b90ca76eddc635aed40e4d2fc86f97e02201b3f8fe931f1f94fde249e2b5b4dbfaff2f9df66dd97c6b518ffa746a4390bd1012202039f0acfe5a292aafc5331f18f6360a3cc53d645ebf0cc7f0509630b22b5d9f547473044022075329343e01033ebe5a22ea6eecf6361feca58752716bdc2260d7f449360a0810220299740ed32f694acc5f99d80c988bb270a030f63947f775382daf4669b272da0010103040100000001056952210242ecd19afda551d58f496c17e3f51df4488089df4caafac3285ed3b9c590f6a821035a654524d301dd0265c2370225a6837298b8ca2099085568cc61a8491287b63921039f0acfe5a292aafc5331f18f6360a3cc53d645ebf0cc7f0509630b22b5d9f54753ae22060242ecd19afda551d58f496c17e3f51df4488089df4caafac3285ed3b9c590f6a818d5f7375b2c000080000000800000008000000000010000002206035a654524d301dd0265c2370225a6837298b8ca2099085568cc61a8491287b63918e2314cf32c000080000000800000008000000000010000002206039f0acfe5a292aafc5331f18f6360a3cc53d645ebf0cc7f0509630b22b5d9f54718e524a1ce2c000080000000800000008000000000010000000000\",\n}\n\nfunc TestFinalize2of3(t *testing.T) {\n\tb, err := hex.DecodeString(finalizerPsbtData[\"twoOfThree\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Error decoding hex: %v\", err)\n\t}\n\tp, err := NewFromRawBytes(bytes.NewReader(b), false)\n\tif err != nil {\n\t\tt.Fatalf(\"Error parsing PSBT: %v\", err)\n\t}\n\tif p.IsComplete() {\n\t\tt.Fatalf(\"Psbt is complete\")\n\t}\n\terr = MaybeFinalizeAll(p)\n\tif err != nil {\n\t\tt.Fatalf(\"Error in MaybeFinalizeAll: %v\", err)\n\t}\n\tif !p.IsComplete() {\n\t\tt.Fatalf(\"Psbt is not complete\")\n\t}\n}\n\nfunc TestPsbtExtractor(t *testing.T) {\n\trawToFinalize, err := base64.StdEncoding.DecodeString(\n\t\tfinalizerPsbtData[\"finalizeb64\"],\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"Error decoding b64: %v\", err)\n\t}\n\n\tpsbt1, err := NewFromRawBytes(\n\t\tbytes.NewReader(rawToFinalize), false,\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to parse PSBT: %v\", err)\n\t}\n\n\tfor i := range psbt1.Inputs {\n\t\terr = Finalize(psbt1, i)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error from finalizing PSBT: %v\", err)\n\t\t}\n\t}\n\n\tfinalizer1Result, err := base64.StdEncoding.DecodeString(\n\t\tfinalizerPsbtData[\"resultb64\"],\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode b64: %v\", err)\n\t}\n\tfinalToNetworkExpected, err := hex.DecodeString(finalizerPsbtData[\"network\"])\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\ttx, err := Extract(psbt1)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to extract: %v\", err)\n\t}\n\tvar resultToNetwork bytes.Buffer\n\tif err := tx.Serialize(&resultToNetwork); err != nil {\n\t\tt.Fatalf(\"unable to serialize: %v\", err)\n\t}\n\n\tvar b bytes.Buffer\n\terr = psbt1.Serialize(&b)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to serialize updated Psbt: %v\", err)\n\t}\n\tif !bytes.Equal(b.Bytes(), finalizer1Result) {\n\t\tt.Fatalf(\"Failed to finalize transaction: expected %x, \"+\n\t\t\t\"got %x\", finalizer1Result, b.Bytes())\n\t}\n\tif !bytes.Equal(finalToNetworkExpected, resultToNetwork.Bytes()) {\n\t\tt.Fatalf(\"Failed to network serialize transaction: %x\", b.Bytes())\n\t}\n}\n\nfunc TestFinalizerAddSigHashFlags(t *testing.T) {\n\tvar signedPsbtData = map[string]string{\n\t\t\"Default\":            \"70736274ff01005e0200000001f1aabce974f1b242b36913f4f8a9f138a8042914dddc4117a578813a4dc32ee10000000000ffffffff017b0a0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012b430b0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1011340e80246ac1955def419572514e50e4be47f56ccd51beae41ec80ad30cb77ed59ebca3c38dd8506e1b7c28fafa4bdf7d821464be1ee152416bdaf2c056fb4fb3290117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000\",\n\t\t\"All\":                \"70736274ff01005e020000000193e988e9eebfe51c0f362741aaab1e0699175c83cfd8087c4a06e24e3b80bc220000000000ffffffff019b0d0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012b630e0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad101030401000000011340ee0a03b010e515e38553d4d96c65a9d6092d06756c47c16c5674c3bde6ad0c151f6d4074601f3c2967f12c3b624b4013591e65458a8b5f80b96a613132cee3bb0117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000\",\n\t\t\"None\":               \"70736274ff01005e02000000013cfe0f5fd1b9a73230b003d336b5e4d7abf3452f6a5c4f266c434648a161eb170000000000ffffffff01d30c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012b9b0d0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad10103040200000001134032573ce8ee8a9afac2008bcb45ce7f96ac95ee7ffad26d10388c97fb87f76f77dc414224ca98b01cbec361488ac29d11e018be412d2725be85dfe5c3fd3b6b4c0117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000\",\n\t\t\"Single\":             \"70736274ff01005e02000000013173659bb6be7474b8d00efd3b38f2a225f5591bd4edd873170a1e0ff0ef15990000000000ffffffff01630e0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012b2b0f0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad101030403000000011340251ce90a8b36cd90bf430f9522772b09bd3ef90039e53cddc5bda6abb61f1c11db6505683d0b7778d4444549ae71df5012edb859251abca13bd819fa6ac9d6ac0117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000\",\n\t\t\"AllAnyOneCanPay\":    \"70736274ff01005e020000000130ac25ec34af987b9e0518ff05cd491bd2d339660a4bfeea49a580c9233fbd9d0000000000ffffffff010b0c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012bd30c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad101030481000000011340e86b7ea8d6fc2cbd99b1091c25a2a37b333b5d82ea559579553cf7ba08c0fe3bead26c458f4917a6e069a3712c15f0999adb243603c783133676c1a09cc574b20117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000\",\n\t\t\"NoneAnyOneCanPay\":   \"70736274ff01005e02000000015499da1d93851a8add52fcab05acab60eaaf16571e0015f678b68775937d11200000000000ffffffff01430b0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012b0b0c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1010304820000000113402d42b46429b739786020e52b69b969468aa69ca40af390ba13441c8e6dc9e53f679c2bd2ff0ef912f48922cd64f4a7bfe7e492e5ecc8603b63e0ea772385faab0117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000\",\n\t\t\"SingleAnyOneCanPay\": \"70736274ff01005e02000000011bbe693ee5b3d75a5c8ad190e151c81e5b1ff1090982ea712c375e7d4a6069ce0100000000ffffffff012b0f0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1000000000001012bf30f0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1010304830000000113408e018d0ae9cd730f7eae428a456e920b4ded67c9a7500a82ba25dd23f98418c1f060680daa4352b262fdffab691a4a67fc603352c1d21ace7cc6d83490facde70117206b1a4876464d6bfc6a7c106dd4c5a0f08af94b45a8200e47e02a7dc6148fd7b00000\",\n\t}\n\n\tvar expectedTx = map[string]string{\n\t\t\"Default\":            \"02000000000101f1aabce974f1b242b36913f4f8a9f138a8042914dddc4117a578813a4dc32ee10000000000ffffffff017b0a0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad10140e80246ac1955def419572514e50e4be47f56ccd51beae41ec80ad30cb77ed59ebca3c38dd8506e1b7c28fafa4bdf7d821464be1ee152416bdaf2c056fb4fb32900000000\",\n\t\t\"All\":                \"0200000000010193e988e9eebfe51c0f362741aaab1e0699175c83cfd8087c4a06e24e3b80bc220000000000ffffffff019b0d0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad10141ee0a03b010e515e38553d4d96c65a9d6092d06756c47c16c5674c3bde6ad0c151f6d4074601f3c2967f12c3b624b4013591e65458a8b5f80b96a613132cee3bb0100000000\",\n\t\t\"None\":               \"020000000001013cfe0f5fd1b9a73230b003d336b5e4d7abf3452f6a5c4f266c434648a161eb170000000000ffffffff01d30c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad1014132573ce8ee8a9afac2008bcb45ce7f96ac95ee7ffad26d10388c97fb87f76f77dc414224ca98b01cbec361488ac29d11e018be412d2725be85dfe5c3fd3b6b4c0200000000\",\n\t\t\"Single\":             \"020000000001013173659bb6be7474b8d00efd3b38f2a225f5591bd4edd873170a1e0ff0ef15990000000000ffffffff01630e0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad10141251ce90a8b36cd90bf430f9522772b09bd3ef90039e53cddc5bda6abb61f1c11db6505683d0b7778d4444549ae71df5012edb859251abca13bd819fa6ac9d6ac0300000000\",\n\t\t\"AllAnyOneCanPay\":    \"0200000000010130ac25ec34af987b9e0518ff05cd491bd2d339660a4bfeea49a580c9233fbd9d0000000000ffffffff010b0c0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad10141e86b7ea8d6fc2cbd99b1091c25a2a37b333b5d82ea559579553cf7ba08c0fe3bead26c458f4917a6e069a3712c15f0999adb243603c783133676c1a09cc574b28100000000\",\n\t\t\"NoneAnyOneCanPay\":   \"020000000001015499da1d93851a8add52fcab05acab60eaaf16571e0015f678b68775937d11200000000000ffffffff01430b0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad101412d42b46429b739786020e52b69b969468aa69ca40af390ba13441c8e6dc9e53f679c2bd2ff0ef912f48922cd64f4a7bfe7e492e5ecc8603b63e0ea772385faab8200000000\",\n\t\t\"SingleAnyOneCanPay\": \"020000000001011bbe693ee5b3d75a5c8ad190e151c81e5b1ff1090982ea712c375e7d4a6069ce0100000000ffffffff012b0f0000000000002251209c1f4b7970d790c99b7265b53adec03551708fd7d67db78359f9c472fe642ad101418e018d0ae9cd730f7eae428a456e920b4ded67c9a7500a82ba25dd23f98418c1f060680daa4352b262fdffab691a4a67fc603352c1d21ace7cc6d83490facde78300000000\",\n\t}\n\n\tfor key, signedPsbtStr := range signedPsbtData {\n\t\tsignedPsbtBytes, err := hex.DecodeString(signedPsbtStr)\n\t\trequire.NoErrorf(t, err, \"Failed to decode signed psbt string\")\n\n\t\tsignedPsbt, err := NewFromRawBytes(bytes.NewReader(signedPsbtBytes), false)\n\t\trequire.NoErrorf(t, err, \"Failed to parse psbt\")\n\n\t\t// There is only one input in each psbt.\n\t\terr = Finalize(signedPsbt, 0)\n\t\trequire.NoErrorf(t, err, \"Failed to finalize\")\n\n\t\ttx, err := Extract(signedPsbt)\n\t\trequire.NoErrorf(t, err, \"Failed to extract\")\n\n\t\tvar b bytes.Buffer\n\t\terr = tx.Serialize(&b)\n\t\trequire.NoErrorf(t, err, \"Failed to serialize tx into buffer\")\n\n\t\texpectedTxBytes, err := hex.DecodeString(expectedTx[key])\n\t\trequire.NoErrorf(t, err, \"Unable to decode expected tx\")\n\t\trequire.Equal(t, expectedTxBytes, b.Bytes())\n\t}\n\n}\n\nfunc TestImportFromCore1(t *testing.T) {\n\t// This example #1 was created manually using Bitcoin Core 0.17 regtest.\n\t// It contains two inputs, one p2wkh and one p2pkh (non-witness).\n\t// We take the created PSBT as input, then add the fields for each input\n\t// separately, then finalize and extract, and compare with the network\n\t// serialized tx output from Core.\n\timported := \"cHNidP8BAJwCAAAAAjaoF6eKeGsPiDQxxqqhFDfHWjBtZzRqmaZmvyCVWZ5JAQAAAAD/////RhypNiFfnQSMNpo0SGsgIvDOyMQFAYEHZXD5jp4kCrUAAAAAAP////8CgCcSjAAAAAAXqRQFWy8ScSkkhlGMwfOnx15YwRzApofwX5MDAAAAABepFAt4TyLfGnL9QY6GLYHbpSQj+QclhwAAAAAAAAAAAA==\"\n\tpsbt1, err := NewFromRawBytes(bytes.NewReader([]byte(imported)), true)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to parse PSBT: %v\", err)\n\t}\n\n\t// update with the first input's utxo (witness) and the second input's utxo\n\t// (non-witness)\n\tfundingTxInput1Hex := \"02000000014f2cbac7d7691fafca30313097d79be9e78aa6670752fcb1fc15508e77586efb000000004847304402201b5568d7cab977ae0892840b779d84e36d62e42fd93b95e648aaebeacd2577d602201d2ebda2b0cddfa0c1a71d3cbcb602e7c9c860a41ed8b4d18d40c92ccbe92aed01feffffff028c636f91000000001600147447b6d7e6193499565779c8eb5184fcfdfee6ef00879303000000001600149e88f2828a074ebf64af23c2168d1816258311d72d010000\"\n\tfundingTxInput2Hex := \"020000000001012f03f70c673d83d65da0e8d0db3867b3e7d7bfbd34fd6be65892042e57576eb00000000000feffffff028027128c000000001976a91485780899b61a5506f342bd67a2f635181f50c8b788acb8032c040000000017a914e2e3d32d42d6f043cab39708a6073301df5039db8702473044022047ae396fd8aba8f67482ad16e315fe680db585c1ac6422ffb18dacd9cf5bac350220321176fd6157ef51d9eae9230b0b5bd7dd29bb6247a879189e6aaa8091f3020201210368081f7ff37dfadbed407eba17b232f959e41e6ac78741192c805ebf80d487852f010000\"\n\tfundingTxInput1Bytes, err := hex.DecodeString(fundingTxInput1Hex)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\ttxFund1 := wire.NewMsgTx(2)\n\terr = txFund1.Deserialize(bytes.NewReader(fundingTxInput1Bytes))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\t// First input is witness, take correct output:\n\ttxFund1Out := txFund1.TxOut[1]\n\n\tfundingTxInput2Bytes, err := hex.DecodeString(fundingTxInput2Hex)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\ttxFund2 := wire.NewMsgTx(2)\n\terr = txFund2.Deserialize(bytes.NewReader(fundingTxInput2Bytes))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\tpsbtupdater1 := Updater{Upsbt: psbt1}\n\tpsbtupdater1.AddInWitnessUtxo(txFund1Out, 0)\n\terr = psbtupdater1.AddInNonWitnessUtxo(txFund2, 1)\n\tif err != nil {\n\t\tt.Fatalf(\"Error inserting non-witness utxo: %v\", err)\n\t}\n\n\t// Signing was done with Core; we manually insert the relevant input\n\t// entries here.\n\tsig1Hex := \"304402200da03ac9890f5d724c42c83c2a62844c08425a274f1a5bca50dcde4126eb20dd02205278897b65cb8e390a0868c9582133c7157b2ad3e81c1c70d8fbd65f51a5658b01\"\n\tsig1, err := hex.DecodeString(sig1Hex)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tpub1Hex := \"024d6b24f372dd4551277c8df4ecc0655101e11c22894c8e05a3468409c865a72c\"\n\tpub1, err := hex.DecodeString(pub1Hex)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\n\t// Check that invalid pubkeys are not accepted.\n\tpubInvalid := append(pub1, 0x00)\n\n\tres, err := psbtupdater1.Sign(0, sig1, pubInvalid, nil, nil)\n\tif err == nil {\n\t\tt.Fatalf(\"Incorrectly accepted invalid pubkey: %v\",\n\t\t\tpubInvalid)\n\t}\n\n\tres, err = psbtupdater1.Sign(0, sig1, pub1, nil, nil)\n\tif err != nil || res != 0 {\n\t\tt.Fatalf(\"Error from adding signatures: %v %v\", err, res)\n\t}\n\n\tsig2Hex := \"3044022014eb9c4858f71c9f280bc68402aa742a5187f54c56c8eb07c902eb1eb5804e5502203d66656de8386b9b044346d5605f5ae2b200328fb30476f6ac993fc0dbb0455901\"\n\tsig2, err := hex.DecodeString(sig2Hex)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tpub2Hex := \"03b4c79acdf4e7d978bef4019c421e4c6c67044ed49d27322dc90e808d8080e862\"\n\tpub2, err := hex.DecodeString(pub2Hex)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\n\t// ===============================================================\n\t// Before adding the signature, we'll make a new PSBT with\n\t// modifications to the input data and check it fails sanity checks.\n\n\t// First an invalid tx:\n\tpsbtBorkedInput2, _ := NewFromRawBytes(bytes.NewReader([]byte(imported)), true)\n\tborkedUpdater, err := NewUpdater(psbtBorkedInput2)\n\tif err != nil {\n\t\tt.Fatalf(\"NewUpdater failed while trying to create borked \"+\n\t\t\t\"version: %v\", err)\n\t}\n\tborkedUpdater.AddInWitnessUtxo(txFund1Out, 0)\n\n\tres, err = borkedUpdater.Sign(0, sig2, pub2, nil, nil)\n\tif err != ErrInvalidSignatureForInput {\n\t\tt.Fatalf(\"AddPartialSig succeeded, but should have failed \"+\n\t\t\t\"due to mismatch between pubkey and prevOut; err was: %v\", err)\n\t}\n\n\t// Next, a valid tx serialization, but not the right one\n\twrongTxBytes, err := hex.DecodeString(\"020000000001012d1d7b17356d0ad8232a5817d2d2fa5cd97d803c0ed03e013e97b65f4f1e5e7501000000171600147848cfb25bb163c7c63732615980a25eddbadc7bfeffffff022a8227630000000017a91472128ae6b6a1b74e499bedb5efb1cb09c9a6713287107240000000000017a91485f81cb970d854e2513ebf5c5b5d09e4509f4af3870247304402201c09aa8bcd18753ef01d8712a55eea5a0f69b6c4cc2944ac942264ff0662c91402201fc1390bf8b0023dd12ae78d7ec181124e106de57bc8f00812ae92bd024d3045012103ba077fc011aa59393bfe17cf491b3a02a9c4d39df122b2148322da0ec23508f459430800\")\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\twrongTx := wire.NewMsgTx(2)\n\terr = wrongTx.Deserialize(bytes.NewReader(wrongTxBytes))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\tpsbtBorkedInput2.Inputs[1] = *NewPsbtInput(wrongTx, nil)\n\tres, err = borkedUpdater.Sign(1, sig2, pub2, nil, nil)\n\tif err != ErrInvalidSignatureForInput {\n\t\tt.Fatalf(\"Error should have been invalid sig for input, was: %v\", err)\n\t}\n\t// ======================================================\n\n\tres, err = psbtupdater1.Sign(1, sig2, pub2, nil, nil)\n\tif err != nil || res != 0 {\n\t\tt.Fatalf(\"Failed to add signature to second input: %v %v\", err, res)\n\t}\n\n\t// Neither input (p2pkh and p2wkh) require redeem script nor witness script,\n\t// so there are no more fields to add; we are ready to finalize.\n\terr = Finalize(psbt1, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to finalize the first input, %v\", err)\n\t}\n\tif psbt1.IsComplete() {\n\t\tt.Fatalf(\"PSBT was complete but has not been fully finalized\")\n\t}\n\terr = Finalize(psbt1, 1)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to finalize second input, %v\", err)\n\t}\n\n\ttx, err := Extract(psbt1)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to extract tx: %v\", err)\n\t}\n\tvar networkSerializedTx bytes.Buffer\n\tif err := tx.Serialize(&networkSerializedTx); err != nil {\n\t\tt.Fatalf(\"unable to encode tx: %v\", err)\n\t}\n\n\texpectedTx := \"0200000000010236a817a78a786b0f883431c6aaa11437c75a306d67346a99a666bf2095599e490100000000ffffffff461ca936215f9d048c369a34486b2022f0cec8c4050181076570f98e9e240ab5000000006a473044022014eb9c4858f71c9f280bc68402aa742a5187f54c56c8eb07c902eb1eb5804e5502203d66656de8386b9b044346d5605f5ae2b200328fb30476f6ac993fc0dbb04559012103b4c79acdf4e7d978bef4019c421e4c6c67044ed49d27322dc90e808d8080e862ffffffff028027128c0000000017a914055b2f1271292486518cc1f3a7c75e58c11cc0a687f05f93030000000017a9140b784f22df1a72fd418e862d81dba52423f90725870247304402200da03ac9890f5d724c42c83c2a62844c08425a274f1a5bca50dcde4126eb20dd02205278897b65cb8e390a0868c9582133c7157b2ad3e81c1c70d8fbd65f51a5658b0121024d6b24f372dd4551277c8df4ecc0655101e11c22894c8e05a3468409c865a72c0000000000\"\n\texpectedTxBytes, err := hex.DecodeString(expectedTx)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tif !bytes.Equal(expectedTxBytes, networkSerializedTx.Bytes()) {\n\t\tt.Fatalf(\"The produced network transaction did not match the expected: %x \\n %x \\n\",\n\t\t\tnetworkSerializedTx.Bytes(), expectedTxBytes)\n\t}\n\n}\n\nfunc TestImportFromCore2(t *testing.T) {\n\t// This example #2 was created manually using Bitcoin Core 0.17 regtest.\n\t// It contains two inputs, one p2sh-p2wkh and one fake utxo.\n\t// The PSBT has been created with walletcreatepsbt and then partial-signed\n\t// on the real input with walletprocessbst in Core.\n\t// We first check that the updating here, using the Core created signature,\n\t// redeem script and signature for the p2sh-p2wkh input, creates the\n\t// same partial-signed intermediate transaction as Core did after\n\t// walletprocesspsbt.\n\t// We then attach a fake\n\t// input of type p2sh-p2wsh, attach its witnessUtxo, redeemscript and\n\t// witnessscript fields, and then finalize the whole transaction. Unlike\n\t// the previous example, we cannot here compare with a Core produced\n\t// network serialized final transaction, because of the fake input.\n\timported := \"cHNidP8BAJsCAAAAAkxTQ+rig5QNnUS5nMc+Pccow4IcOJeQRcNNw+7p5ZA5AQAAAAD/////qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoNAAAAAP////8CAIYOcAAAAAAWABQ1l7nn13RubTwqRQU2BnVV5WlXBWAxMbUAAAAAF6kUkiuXUjfWFgTp6nl/gf9+8zIWR6KHAAAAAAAAAAAA\"\n\tpsbt1, err := NewFromRawBytes(bytes.NewReader([]byte(imported)), true)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to parse PSBT: %v\", err)\n\t}\n\n\t// update with the first input's utxo, taken from its funding\n\t// transaction\n\tfundingTxInput1Hex := \"02000000017b260536a3c17aee49c41a9b36fdf01a418e0c04df06fbabcb0d4f590b95d175000000006a473044022074a5a13159b6c12d77881c9501aa5c18616fb76c1809fc4d55f18a2e63159a6702200d1aa72be6056a41808898d24da93c0c0192cad65b7c2cc86e00b3e0fbbd57f601210212cc429d61fde565d0c2271a3e4fdb063cb49ae2257fa71460be753ceb56d175feffffff02bc060d8f0000000017a9140b56c31b5dc5a5a22c45a7850e707ad602d94a3087008352840000000017a9149f3679d67a9a486238764f618a93b82a7d999103879a000000\"\n\tfundingTxInput1Bytes, err := hex.DecodeString(fundingTxInput1Hex)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\ttxFund1 := wire.NewMsgTx(2)\n\terr = txFund1.Deserialize(bytes.NewReader(fundingTxInput1Bytes))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\t// First input is witness, take correct output:\n\ttxFund1Out := txFund1.TxOut[1]\n\n\tpsbtupdater1 := Updater{Upsbt: psbt1}\n\tpsbtupdater1.AddInWitnessUtxo(txFund1Out, 0)\n\n\t// This input is p2sh-p2wkh, so it requires a redeemscript but not\n\t// a witness script. The redeemscript is the witness program.\n\tredeemScript, err := hex.DecodeString(\"00147aed39420a8b7ab98a83791327ccb70819d1fbe2\")\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tpsbtupdater1.AddInRedeemScript(redeemScript, 0)\n\n\t// Signing for the first input was done with Core; we manually insert the\n\t// relevant input entries here.\n\tsig1Hex := \"30440220546d182d00e45ef659c329dce6197dc19e0abc795e2c9279873f5a887998b273022044143113fc3475d04fc8d5113e0bbcb42d80514a9f1a2247e9b2a7878e20d44901\"\n\tsig1, err := hex.DecodeString(sig1Hex)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tpub1Hex := \"02bb3ce35af26f4c826eab3e5fc263ef56871b26686a8a995599b7ee6576613104\"\n\tpub1, err := hex.DecodeString(pub1Hex)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\n\tres, err := psbtupdater1.Sign(0, sig1, pub1, nil, nil)\n\tif err != nil || res != 0 {\n\t\tt.Fatalf(\"Unable to add partial signature: %v %v\", err, res)\n\t}\n\n\t// Since this input is now finalizable, we do so:\n\terr = Finalize(psbt1, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to finalize the first input: %v\", err)\n\t}\n\tif psbt1.IsComplete() {\n\t\tt.Fatalf(\"PSBT was complete but has not been fully finalized\")\n\t}\n\n\t// Core also adds the OutRedeemScript field for the output it knows about.\n\t// Note that usually we would not of course re-create, but rather start\n\t// from the half-signed version; so this is needed only for a sanity check\n\t// that we can recreate the half-signed.\n\toutput2RedeemScript, err := hex.DecodeString(\"0014e0846bd17848ab40ca1f56b655c6fa31667880cc\")\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tpsbtupdater1.AddOutRedeemScript(output2RedeemScript, 1)\n\t// The main function of the test is to compare the thus-generated\n\t// partially (not completely) signed transaction with that generated and\n\t// encoded by Core.\n\texpectedPsbtPartialB64 := \"cHNidP8BAJsCAAAAAkxTQ+rig5QNnUS5nMc+Pccow4IcOJeQRcNNw+7p5ZA5AQAAAAD/////qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoNAAAAAP////8CAIYOcAAAAAAWABQ1l7nn13RubTwqRQU2BnVV5WlXBWAxMbUAAAAAF6kUkiuXUjfWFgTp6nl/gf9+8zIWR6KHAAAAAAABASAAg1KEAAAAABepFJ82edZ6mkhiOHZPYYqTuCp9mZEDhwEHFxYAFHrtOUIKi3q5ioN5EyfMtwgZ0fviAQhrAkcwRAIgVG0YLQDkXvZZwync5hl9wZ4KvHleLJJ5hz9aiHmYsnMCIEQUMRP8NHXQT8jVET4LvLQtgFFKnxoiR+myp4eOINRJASECuzzjWvJvTIJuqz5fwmPvVocbJmhqiplVmbfuZXZhMQQAAAABABYAFOCEa9F4SKtAyh9WtlXG+jFmeIDMAA==\"\n\tgeneratedPsbtPartialB64, err := psbt1.B64Encode()\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to B64Encode Psbt: %v\", err)\n\t}\n\tif expectedPsbtPartialB64 != generatedPsbtPartialB64 {\n\t\tt.Fatalf(\"Partial did not match expected: %v\", generatedPsbtPartialB64)\n\t}\n\n\t// We now simulate adding the signing data for the second (fake) input,\n\t// and check that we can finalize and extract. This input is p2sh-p2wsh.\n\t// the second input is fake, we're going to make it witness type,\n\t// so create a TxOut struct that fits\n\tfakeTxOutSerialized, err := hex.DecodeString(\"00c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e887\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to decode hex: %v\", err)\n\t}\n\tfakevalSerialized := binary.LittleEndian.Uint64(fakeTxOutSerialized[:8])\n\tfakeScriptPubKey := fakeTxOutSerialized[9:]\n\ttxFund2Out := wire.NewTxOut(int64(fakevalSerialized), fakeScriptPubKey)\n\tpsbt2, err := NewFromRawBytes(bytes.NewReader([]byte(expectedPsbtPartialB64)), true)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to load partial PSBT: %v\", err)\n\t}\n\tpsbtupdater2, err := NewUpdater(psbt2)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create updater: %v\", err)\n\t}\n\tpsbtupdater2.AddInWitnessUtxo(txFund2Out, 1)\n\t// Add redeemScript, which is the witnessscript/program:\n\tredeemScript, err = hex.DecodeString(\"00208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to decode hex: %v\", err)\n\t}\n\terr = psbtupdater2.AddInRedeemScript(redeemScript, 1)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to add redeemscript to second input: %v\", err)\n\t}\n\t// Add witnessScript, which here is multisig:\n\twitnessScript, err := hex.DecodeString(\"522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to decode hex: %v\", err)\n\t}\n\t// To test multisig checks, add a nonsense version of the multisig script\n\twitnessScriptNonsense, err := hex.DecodeString(\"52ffff\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to decode hex: %v\", err)\n\t}\n\terr = psbtupdater2.AddInWitnessScript(witnessScript, 1)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to add witnessscript to second input: %v\", err)\n\t}\n\t// Construct the two partial signatures to be added\n\tsig21, err := hex.DecodeString(\"3044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to decode hex: %v\", err)\n\t}\n\tpub21, err := hex.DecodeString(\"03089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to decode hex: %v\", err)\n\t}\n\tsig22, err := hex.DecodeString(\"3044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d201\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to decode hex: %v\", err)\n\t}\n\tpub22, err := hex.DecodeString(\"023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e73\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to decode hex: %v\", err)\n\t}\n\tres, err = psbtupdater2.Sign(1, sig21, pub21, nil, nil)\n\n\t// Check that the finalization procedure fails here due to not\n\t// meeting the multisig policy\n\tsuccess, err := MaybeFinalize(psbt2, 1)\n\tif success {\n\t\tt.Fatalf(\"Incorrectly succeeded in finalizing without sigs\")\n\t}\n\tif err != ErrUnsupportedScriptType {\n\t\tt.Fatalf(\"Got unexpected error type: %v\", err)\n\t}\n\n\tres, err = psbtupdater2.Sign(1, sig22, pub22, nil, nil)\n\n\t// Check that the finalization procedure also fails with a nonsense\n\t// script\n\terr = psbtupdater2.AddInWitnessScript(witnessScriptNonsense, 1)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to add witnessscript to second input: %v\", err)\n\t}\n\tsuccess, err = MaybeFinalize(psbt2, 1)\n\tif success {\n\t\tt.Fatalf(\"Incorrectly succeeded in finalizing with invalid msigscript\")\n\t}\n\tif err != ErrUnsupportedScriptType {\n\t\tt.Fatalf(\"Got unexpected error type: %v\", err)\n\t}\n\n\t// Restore the correct witnessScript to complete correctly\n\terr = psbtupdater2.AddInWitnessScript(witnessScript, 1)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to add witnessscript to second input: %v\", err)\n\t}\n\n\tsuccess, err = MaybeFinalize(psbt2, 1)\n\tif !success {\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to finalize second input: %v\", err)\n\t\t} else {\n\t\t\tt.Fatalf(\"Input was not finalizable\")\n\t\t}\n\t}\n\n\t// Add a (fake) witnessOut descriptor field to one of the outputs,\n\t// for coverage purposes (we aren't currently using this field)\n\tpsbtupdater2.AddOutWitnessScript([]byte{0xff, 0xff, 0xff}, 0)\n\n\t// Sanity check; we should not have lost the additional output entry\n\t// provided by Core initially\n\tuoutput1 := psbtupdater2.Upsbt.Outputs[1]\n\tif uoutput1.RedeemScript == nil {\n\t\tt.Fatalf(\"PSBT should contain outredeemscript entry, but it does not.\")\n\t}\n\t// Nor should we have lost our fake witnessscript output entry\n\tuoutput2 := psbtupdater2.Upsbt.Outputs[0]\n\tif uoutput2.WitnessScript == nil {\n\t\tt.Fatalf(\"PSBT should contain outwitnessscript but it does not.\")\n\t}\n\tvar tx bytes.Buffer\n\tnetworkSerializedTx, err := Extract(psbt2)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to extract tx: %v\", err)\n\t}\n\tif err := networkSerializedTx.Serialize(&tx); err != nil {\n\t\tt.Fatalf(\"unable to encode tx: %v\", err)\n\t}\n\texpectedSerializedTx, err := hex.DecodeString(\"020000000001024c5343eae283940d9d44b99cc73e3dc728c3821c38979045c34dc3eee9e5903901000000171600147aed39420a8b7ab98a83791327ccb70819d1fbe2ffffffffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0d000000232200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903ffffffff0200860e70000000001600143597b9e7d7746e6d3c2a450536067555e5695705603131b50000000017a914922b975237d61604e9ea797f81ff7ef3321647a287024730440220546d182d00e45ef659c329dce6197dc19e0abc795e2c9279873f5a887998b273022044143113fc3475d04fc8d5113e0bbcb42d80514a9f1a2247e9b2a7878e20d449012102bb3ce35af26f4c826eab3e5fc263ef56871b26686a8a995599b7ee65766131040400473044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01473044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d20147522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae00000000\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to decode hex: %v\", err)\n\t}\n\tif !bytes.Equal(expectedSerializedTx, tx.Bytes()) {\n\t\tt.Fatalf(\"Failed to create correct network serialized \"+\n\t\t\t\"transaction: expected %x, got %x\",\n\t\t\texpectedSerializedTx, tx.Bytes())\n\t}\n}\n\nfunc TestMaybeFinalizeAll(t *testing.T) {\n\t// The following data is from a 3rd transaction from Core,\n\t// using 3 inputs, all p2wkh.\n\timported := \"cHNidP8BAKQCAAAAAzJyXH13IqBFvvZ7y1VSgUgkMvMoPgP5CfFNqsjQexKQAQAAAAD/////fMdLydu5bsoiHN9cFSaBL0Qnq2KLSKx0RA4b938CAgQAAAAAAP/////yKNgfsDAHr/zFz8R9k8EFI26allfg9DdE8Gzj6tGlegEAAAAA/////wHw9E0OAAAAABYAFDnPCRduiEWmmSc1j30SJ8k9u7PHAAAAAAAAAAAA\"\n\tpsbt1, err := NewFromRawBytes(bytes.NewReader([]byte(imported)), true)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to parse PSBT: %v\", err)\n\t}\n\n\t// update with the first input's utxo, taken from its funding\n\t// transaction\n\tfundingTxInput1, err := hex.DecodeString(\"020000000001017b260536a3c17aee49c41a9b36fdf01a418e0c04df06fbabcb0d4f590b95d1750100000017160014af82cd4409241b1de892726324bd780e3b5cd8aafeffffff02a85f9800000000001600149d21f8b306ddfd4dd035080689e88b4c3471e3cc801d2c0400000000160014d97ccd3dfb60820d7d33d862371ca5a73039bd560247304402201a1d2fdb5a7190b7fa59907769f0fc9c91fd3b34f6424acf5868a8ac21ec287102200a59b9d076ecf98c88f2196ed2be0aafff4966ead754041182fff5f92115a783012103604ffd31dc71db2e32c20f09eafe6353cd7515d3648aff829bb4879b553e30629a000000\")\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tfundingTxInput2, err := hex.DecodeString(\"020000000001019c27b886e420fcadb077706b0933efa8bb53e3a250c3ec45cfdba5e05e233f360100000000feffffff0200b4c404000000001600140853f50c7d2d5d2af326a75efdbc83b62551e89afce31c0d000000001600142d6936c082c35607ec3bdb334a932d928150b75802473044022000d962f5e5e6425f9de21da7ac65b4fd8af8f6bfbd33c7ba022827c73866b477022034c59935c1ea10b5ba335d93f55a200c2588ec6058b8c7aedd10d5cbc4654f99012102c30e9f0cd98f6a805464d6b8a326b5679b6c3262934341855ee0436eaedfd2869a000000\")\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\tfundingTxInput3, err := hex.DecodeString(\"02000000012bf4331bb95df4eadb14f7a28db3fecdc5e87f08c29c2332b66338dd606699f60000000048473044022075ed43f508528da47673550a785702e9a93eca84a11faea91c4e9c66fcab3c9e022054a37610bd40b12263a5933188f062b718e007f290cecde2b6e41da3e1ebbddf01feffffff020c99a8240100000016001483bd916985726094d6d1c5b969722da580b5966a804a5d05000000001600140a2ee13a6696d75006af5e8a026ea49316087dae9a000000\")\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to decode hex: %v\", err)\n\t}\n\n\tpsbtupdater1 := Updater{Upsbt: psbt1}\n\ttx := wire.NewMsgTx(2)\n\terr = tx.Deserialize(bytes.NewReader(fundingTxInput1))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\ttxFund1Out := tx.TxOut[1]\n\tpsbtupdater1.AddInWitnessUtxo(txFund1Out, 0)\n\n\ttx = wire.NewMsgTx(2)\n\terr = tx.Deserialize(bytes.NewReader(fundingTxInput2))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\ttxFund2Out := tx.TxOut[0]\n\tpsbtupdater1.AddInWitnessUtxo(txFund2Out, 1)\n\n\ttx = wire.NewMsgTx(2)\n\terr = tx.Deserialize(bytes.NewReader(fundingTxInput3))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\ttxFund3Out := tx.TxOut[1]\n\tpsbtupdater1.AddInWitnessUtxo(txFund3Out, 2)\n\n\t// To be ready for finalization, we need to have  partial signature\n\t// fields for each input\n\tsig1, _ := hex.DecodeString(\"30440220027605ee8015970baf02a72652967a543e1b29a6882d799738ed1baee508822702203818a2f1b9770c46a473f47ad7ae90bcc129a5d047f00fae354c80197a7cf50601\")\n\tpub1, _ := hex.DecodeString(\"03235fc1f9dc8bbf6fa3df35dfeb0dd486f2d488f139579885eb684510f004f6c1\")\n\tsig2, _ := hex.DecodeString(\"304402206f5aea4621696610de48736b95a89b1d3a434a4e536d9aae65e039c477cf4c7202203b27a18b0f63be7d3bbf5be1bc2306a7ec8c2da12c2820ff07b73c7f3f1d4d7301\")\n\tpub2, _ := hex.DecodeString(\"022011b496f0603a268b55a781c7be0c3849f605f09cb2e917ed44288b8144a752\")\n\tsig3, _ := hex.DecodeString(\"3044022036dbc6f8f85a856e7803cbbcf0a97b7a74806fc592e92d7c06826f911610b98e0220111d43c4b20f756581791334d9c5cbb1a9c07558f28404cabf01c782897ad50501\")\n\tpub3, _ := hex.DecodeString(\"0381772a80c69e275e20d7f014555b13031e9cacf1c54a44a67ab2bc7eba64f227\")\n\tres, err := psbtupdater1.Sign(0, sig1, pub1, nil, nil)\n\tif err != nil || res != 0 {\n\t\tt.Fatalf(\"Failed to add partial signature for input 0: %v %v\", err, res)\n\t}\n\tres, err = psbtupdater1.Sign(1, sig2, pub2, nil, nil)\n\tif err != nil || res != 0 {\n\t\tt.Fatalf(\"Failed to add partial signature for input 1: %v %v\", err, res)\n\t}\n\n\t// Not ready for finalize all, check it fails:\n\terr = MaybeFinalizeAll(psbt1)\n\tif err != ErrNotFinalizable {\n\t\tt.Fatalf(\"Expected finalization failure, got: %v\", err)\n\t}\n\n\tres, err = psbtupdater1.Sign(2, sig3, pub3, nil, nil)\n\n\t// Since this input is now finalizable and is p2wkh only, we can do\n\t// all at once:\n\terr = MaybeFinalizeAll(psbt1)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to finalize PSBT: %v\", err)\n\t}\n\tif !psbt1.IsComplete() {\n\t\tt.Fatalf(\"PSBT was finalized but not marked complete\")\n\t}\n\n}\n\nfunc TestFromUnsigned(t *testing.T) {\n\tserTx, err := hex.DecodeString(\"0000000001e165f072311e71825b47a4797221d7ae56d4b40b7707c540049aee43302448a40000000000feffffff0212f1126a0000000017a9143e836801b2b15aa193449d815c62d6c4b6227c898780778e060000000017a914ba4bdb0b07d67bc60f59c1f4fe541705652549748700000000\")\n\tif err != nil {\n\t\tt.Fatalf(\"Error: %v\", err)\n\t}\n\ttx := wire.NewMsgTx(2)\n\terr = tx.Deserialize(bytes.NewReader(serTx))\n\tif err != nil {\n\t\tt.Fatalf(\"Error: %v\", err)\n\t}\n\tpsbt1, err := NewFromUnsignedTx(tx)\n\tif err != nil {\n\t\tt.Fatalf(\"Error: %v\", err)\n\t}\n\tencoded, err := psbt1.B64Encode()\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to B64Encode Psbt: %v\", err)\n\t}\n\n\t// Compare with output of Core:\n\tfromCoreB64 := \"cHNidP8BAHMAAAAAAeFl8HIxHnGCW0ekeXIh165W1LQLdwfFQASa7kMwJEikAAAAAAD+////AhLxEmoAAAAAF6kUPoNoAbKxWqGTRJ2BXGLWxLYifImHgHeOBgAAAAAXqRS6S9sLB9Z7xg9ZwfT+VBcFZSVJdIcAAAAAAAAAAA==\"\n\tif encoded != fromCoreB64 {\n\t\tt.Fatalf(\"Got incorrect b64: %v\", encoded)\n\t}\n\t_, err = NewFromRawBytes(bytes.NewReader([]byte(fromCoreB64)), true)\n\tif err != nil {\n\t\tt.Fatalf(\"Error: %v\", err)\n\t}\n}\n\nfunc TestNonWitnessToWitness(t *testing.T) {\n\t// We'll start with a PSBT produced by Core for which\n\t// the first input is signed and we'll provided the signatures for\n\t// the other three inputs; they are p2sh-p2wkh, p2wkh and legacy\n\t// respectively.\n\t// In each case we'll *first* attach the NonWitnessUtxo field,\n\t// and then call sign; in the first two but not the third case, the\n\t// NonWitnessUtxo will automatically be replaced with the WitnessUtxo.\n\t// Finally we'll check that the fully finalized PSBT produced matches\n\t// the one produced by Core for the same keys.\n\n\tpsbt1B64 := \"cHNidP8BAM4CAAAABHtBMXY+SX95xidmWJP67CTQ02FPUpbNhIxNplAdlvk+AQAAAAD/////G2mt4bX7+sVi1jdbuBa5Q/xsJdgzFCgdHHSZq3ewK6YAAAAAAP/////NrbZb7GzfAg4kOqFWAIbXabq4cAvtVGv+eecIIv1KggEAAAAA/////73s9ifprgErlaONH1rgpNs3l6+t+mz2XGTHsTVWCem/AQAAAAD/////AfAmclMAAAAAF6kUQwsEC5nzbdY5meON2ZQ2thmeFgOHAAAAAAABASAAZc0dAAAAABepFPAv3VTMu5+4WN+/HIji6kG9RpzKhwEHFxYAFLN3PqXSyIHWKqm4ah5m9erc/3OoAQhrAkcwRAIgH7kzGO2iskfCvX0dgkDuzfqJ7tAu7KUZOeykTkJ1SYkCIBv4QRZK1hLz45D0gs+Lz93OE4s37lkPVE+SlXZtazWEASEC3jaf19MMferBn0Bn5lxXJGOqoqmfSvnHclQvB5gJ3nEAAAAAAQAWABTB+Qcq6iqdSvvc6959kd7XHrhYFgA=\"\n\tnwutxo1ser, _ := hex.DecodeString(\"02000000017f7baa6b7377541c4aca372d2dce8e1098ba44aa8379b7ea87644ef27e08ec240000000048473044022072e3b94c33cb5128518cd3903cc0ca19e8c234ac6d462e01ae2bb1da7768ed7d0220167d7ad89f6e1bbb3b866ae6fc2f67b5e7d51eb4f33f7bfe3f4b2673856b815001feffffff0200c2eb0b0000000017a9142dd25c78db2e2e09376eab9cb342e1b03005abe487e4ab953e0000000017a914120b8ca3fb4c7f852e30d4e3714fb64027a0b4c38721020000\")\n\tnwutxo2ser, _ := hex.DecodeString(\"0200000001f51b0bb5d945dd5532448a4d3fb88134d0bd90493813515f9c2ddb1fa15b9ba60000000048473044022047d83caf88d398245c006374bfa9f27ae968f5f51d640cacd5a214ed2cba397a02204519b26035496855f574a72b73bdcfa46d53995faf64c8f0ab394b628cc5383901feffffff020ccb9f3800000000160014e13544a3c718faa6c5ad7089a6660383c12b072700a3e11100000000160014a5439b477c116b79bd4c7c5131f3e58d54f27bb721020000\")\n\tnwutxo3ser, _ := hex.DecodeString(\"0200000001eb452f0fc9a8c39edb79f7174763f3cb25dc56db455926e411719a115ef16509000000004847304402205aa80cc615eb4b3f6e89696db4eadd192581a6c46f5c09807d3d98ece1d77355022025007e58c1992a1e5d877ee324bfe0a65db26d29f80941cfa277ac3efbcad2a701feffffff02bce9a9320000000017a9141590e852ac66eb8798afeb2a5ed67c568a2d6561870084d717000000001976a914a57ea05eacf94900d5fb92bccd273cfdb90af36f88ac21020000\")\n\n\tnwutxo1 := wire.NewMsgTx(2)\n\terr := nwutxo1.Deserialize(bytes.NewReader(nwutxo1ser))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\tnwutxo2 := wire.NewMsgTx(2)\n\terr = nwutxo2.Deserialize(bytes.NewReader(nwutxo2ser))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\tnwutxo3 := wire.NewMsgTx(2)\n\terr = nwutxo3.Deserialize(bytes.NewReader(nwutxo3ser))\n\tif err != nil {\n\t\tt.Fatalf(\"Error deserializing transaction: %v\", err)\n\t}\n\n\t// import the PSBT\n\tpsbt1, err := NewFromRawBytes(bytes.NewReader([]byte(psbt1B64)), true)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create PSBT: %v\", err)\n\t}\n\n\t// check that we recognize the finality of the first input\n\tif !isFinalized(psbt1, 0) {\n\t\tt.Fatalf(\"First input incorrectly read as not finalized.\")\n\t}\n\n\t// Add NonWitnessUtxo fields for each of the other three inputs\n\tu := Updater{Upsbt: psbt1}\n\tu.AddInNonWitnessUtxo(nwutxo1, 1)\n\tu.AddInNonWitnessUtxo(nwutxo2, 2)\n\tu.AddInNonWitnessUtxo(nwutxo3, 3)\n\n\t// Signatures for each of those inputs were created with Core:\n\tsig1, _ := hex.DecodeString(\"304402205676877e6162ce40a49ee5a74443cdc1e7915637c42da7b872c2ec2298fd371b02203c1d4a05b1e2a7a588d9ec9b8d4892d2cd59bebe0e777483477a0ec692ebbe6d01\")\n\tpub1, _ := hex.DecodeString(\"02534f23cb88a048b649672967263bd7570312d5d31d066fa7b303970010a77b2b\")\n\tredeemScript1, _ := hex.DecodeString(\"00142412be29368c0260cb841eecd9b59d7e01174aa1\")\n\n\tsig2, _ := hex.DecodeString(\"3044022065d0a349709b8d8043cfd644cf6c196c1f601a22e1b3fdfbf8c0cc2a80fe2f1702207c87d36b666a8862e81ec5df288707f517d2f35ea1548feb82019de2c8de90f701\")\n\tpub2, _ := hex.DecodeString(\"0257d88eaf1e79b72ea0a33ae89b57dae95ea68499bdc6770257e010ab899f0abb\")\n\n\tsig3, _ := hex.DecodeString(\"30440220290abcaacbd759c4f989762a9ee3468a9231788aab8f50bf65955d8597d8dd3602204d7e394f4419dc5392c6edba6945837458dd750a030ac67a746231903a8eb7db01\")\n\tpub3, _ := hex.DecodeString(\"0388025f50bb51c0469421ed13381f22f9d46a070ec2837e055c49c5876f0d0968\")\n\n\t// Add the signatures and any scripts needed to the inputs\n\tres, err := u.Sign(1, sig1, pub1, redeemScript1, nil)\n\tif res != 0 || err != nil {\n\t\tt.Fatalf(\"Failed to sign at index %v res %v err %v\", 1, res, err)\n\t}\n\tres, err = u.Sign(2, sig2, pub2, nil, nil)\n\tif res != 0 || err != nil {\n\t\tt.Fatalf(\"Failed to sign at index %v res %v err %v\", 2, res, err)\n\t}\n\tres, err = u.Sign(3, sig3, pub3, nil, nil)\n\tif res != 0 || err != nil {\n\t\tt.Fatalf(\"Failed to sign at index %v res %v err %v\", 3, res, err)\n\t}\n\n\t// Attempt to finalize the rest of the transaction\n\t_, err = MaybeFinalize(psbt1, 1)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to finalize input 1 %v\", err)\n\t}\n\t_, err = MaybeFinalize(psbt1, 2)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to finalize input 2 %v\", err)\n\t}\n\t_, err = MaybeFinalize(psbt1, 3)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to finalize input 3 %v\", err)\n\t}\n\n\t// Finally we can check whether both the B64 encoding of the PSBT,\n\t// and the final network serialized signed transaction, that we generated\n\t// with Core using the 2 wallets, matches what this code produces:\n\texpectedFinalizedPsbt := \"cHNidP8BAM4CAAAABHtBMXY+SX95xidmWJP67CTQ02FPUpbNhIxNplAdlvk+AQAAAAD/////G2mt4bX7+sVi1jdbuBa5Q/xsJdgzFCgdHHSZq3ewK6YAAAAAAP/////NrbZb7GzfAg4kOqFWAIbXabq4cAvtVGv+eecIIv1KggEAAAAA/////73s9ifprgErlaONH1rgpNs3l6+t+mz2XGTHsTVWCem/AQAAAAD/////AfAmclMAAAAAF6kUQwsEC5nzbdY5meON2ZQ2thmeFgOHAAAAAAABASAAZc0dAAAAABepFPAv3VTMu5+4WN+/HIji6kG9RpzKhwEHFxYAFLN3PqXSyIHWKqm4ah5m9erc/3OoAQhrAkcwRAIgH7kzGO2iskfCvX0dgkDuzfqJ7tAu7KUZOeykTkJ1SYkCIBv4QRZK1hLz45D0gs+Lz93OE4s37lkPVE+SlXZtazWEASEC3jaf19MMferBn0Bn5lxXJGOqoqmfSvnHclQvB5gJ3nEAAQEgAMLrCwAAAAAXqRQt0lx42y4uCTduq5yzQuGwMAWr5IcBBxcWABQkEr4pNowCYMuEHuzZtZ1+ARdKoQEIawJHMEQCIFZ2h35hYs5ApJ7lp0RDzcHnkVY3xC2nuHLC7CKY/TcbAiA8HUoFseKnpYjZ7JuNSJLSzVm+vg53dINHeg7Gkuu+bQEhAlNPI8uIoEi2SWcpZyY711cDEtXTHQZvp7MDlwAQp3srAAEBHwCj4REAAAAAFgAUpUObR3wRa3m9THxRMfPljVTye7cBCGsCRzBEAiBl0KNJcJuNgEPP1kTPbBlsH2AaIuGz/fv4wMwqgP4vFwIgfIfTa2ZqiGLoHsXfKIcH9RfS816hVI/rggGd4sjekPcBIQJX2I6vHnm3LqCjOuibV9rpXqaEmb3GdwJX4BCriZ8KuwABAL0CAAAAAetFLw/JqMOe23n3F0dj88sl3FbbRVkm5BFxmhFe8WUJAAAAAEhHMEQCIFqoDMYV60s/bolpbbTq3RklgabEb1wJgH09mOzh13NVAiAlAH5YwZkqHl2HfuMkv+CmXbJtKfgJQc+id6w++8rSpwH+////ArzpqTIAAAAAF6kUFZDoUqxm64eYr+sqXtZ8VootZWGHAITXFwAAAAAZdqkUpX6gXqz5SQDV+5K8zSc8/bkK82+IrCECAAABB2pHMEQCICkKvKrL11nE+Yl2Kp7jRoqSMXiKq49Qv2WVXYWX2N02AiBNfjlPRBncU5LG7bppRYN0WN11CgMKxnp0YjGQOo632wEhA4gCX1C7UcBGlCHtEzgfIvnUagcOwoN+BVxJxYdvDQloAAEAFgAUwfkHKuoqnUr73OvefZHe1x64WBYA\"\n\tcalculatedPsbt, err := u.Upsbt.B64Encode()\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to base64 encode\")\n\t}\n\tif expectedFinalizedPsbt != calculatedPsbt {\n\t\tt.Fatalf(\"Failed to generate correct PSBT\")\n\t}\n\n\texpectedNetworkSer, _ := hex.DecodeString(\"020000000001047b4131763e497f79c627665893faec24d0d3614f5296cd848c4da6501d96f93e0100000017160014b3773ea5d2c881d62aa9b86a1e66f5eadcff73a8ffffffff1b69ade1b5fbfac562d6375bb816b943fc6c25d83314281d1c7499ab77b02ba600000000171600142412be29368c0260cb841eecd9b59d7e01174aa1ffffffffcdadb65bec6cdf020e243aa1560086d769bab8700bed546bfe79e70822fd4a820100000000ffffffffbdecf627e9ae012b95a38d1f5ae0a4db3797afadfa6cf65c64c7b1355609e9bf010000006a4730440220290abcaacbd759c4f989762a9ee3468a9231788aab8f50bf65955d8597d8dd3602204d7e394f4419dc5392c6edba6945837458dd750a030ac67a746231903a8eb7db01210388025f50bb51c0469421ed13381f22f9d46a070ec2837e055c49c5876f0d0968ffffffff01f02672530000000017a914430b040b99f36dd63999e38dd99436b6199e1603870247304402201fb93318eda2b247c2bd7d1d8240eecdfa89eed02eeca51939eca44e4275498902201bf841164ad612f3e390f482cf8bcfddce138b37ee590f544f9295766d6b3584012102de369fd7d30c7deac19f4067e65c572463aaa2a99f4af9c772542f079809de710247304402205676877e6162ce40a49ee5a74443cdc1e7915637c42da7b872c2ec2298fd371b02203c1d4a05b1e2a7a588d9ec9b8d4892d2cd59bebe0e777483477a0ec692ebbe6d012102534f23cb88a048b649672967263bd7570312d5d31d066fa7b303970010a77b2b02473044022065d0a349709b8d8043cfd644cf6c196c1f601a22e1b3fdfbf8c0cc2a80fe2f1702207c87d36b666a8862e81ec5df288707f517d2f35ea1548feb82019de2c8de90f701210257d88eaf1e79b72ea0a33ae89b57dae95ea68499bdc6770257e010ab899f0abb0000000000\")\n\ttx, err := Extract(psbt1)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to extract: %v\", err)\n\t}\n\tvar b bytes.Buffer\n\tif err := tx.Serialize(&b); err != nil {\n\t\tt.Fatalf(\"unable to encode tx: %v\", err)\n\t}\n\tif !bytes.Equal(expectedNetworkSer, b.Bytes()) {\n\t\tt.Fatalf(\"Expected serialized transaction was not produced: %x\", b.Bytes())\n\t}\n}\n\n// TestPSBTNumberOfHashesOverflow tests the case where the number of hashes\n// in the PSBT exceeds the maximum allowed value. This is a regression test\n// for a bug that was fixed in the PSBT library.\nfunc TestPSBTNumberOfHashesOverflow(t *testing.T) {\n\t// This hex string represents a PSBT with an invalid number of hashes. The\n\t// PSBT library should return an error when trying to parse this PSBT.\n\t//\n\t// TODO(ffranr): Is there a more minimal PSBT example?\n\thexString := \"70736274ff01007374ff01030100000000002f0000002e2873007374\" +\n\t\t\"ff01070100000000000000000000000000000000000000060680050000736274f\" +\n\t\t\"f01000a0000000060c70006060000736274ff01000a0000010000010024070100\" +\n\t\t\"00000000000000000000000000000000000006060000736274ff01000a0000000\" +\n\t\t\"000010024c760002a707362c760000b0500000000000000060605000073626274\" +\n\t\t\"ff01000a000000000001002421212121212121212121212121212121212121212\" +\n\t\t\"12121212121212121212121212121212107010000000000000000000000000000\" +\n\t\t\"000000000006060000736274ff01000a000eff000001000a0a040404040404040\" +\n\t\t\"400\"\n\n\t// Convert hex string to byte slice\n\tbuffer, err := hex.DecodeString(hexString)\n\trequire.NoError(t, err)\n\n\t// Attempt to parse the PSBT.\n\tpsbt, err := NewFromRawBytes(bytes.NewBuffer(buffer), false)\n\trequire.Nil(t, psbt)\n\trequire.ErrorIs(t, err, ErrInvalidPsbtFormat)\n}\n\n// TestMinTaprootBip32DerivationByteSize tests the\n// minTaprootBip32DerivationByteSize function to ensure it correctly calculates\n// the minimum byte size of the Taproot BIP32 derivation path.\nfunc TestMinTaprootBip32DerivationByteSize(t *testing.T) {\n\ttests := []struct {\n\t\tlabel        string\n\t\tnumHashes    uint64\n\t\texpectedSize uint64\n\t\texpectErr    bool\n\t}{\n\t\t{\n\t\t\tlabel:        \"only compact size + fingerprint\",\n\t\t\tnumHashes:    0,\n\t\t\texpectedSize: 5,\n\t\t\texpectErr:    false,\n\t\t},\n\t\t{\n\t\t\tlabel:        \"numHashes == 1, therefore: 1 * 32 + 5\",\n\t\t\tnumHashes:    1,\n\t\t\texpectedSize: 37,\n\t\t\texpectErr:    false,\n\t\t},\n\t\t{\n\t\t\tlabel:        \"numHashes == 2, therefore: 2 * 32 + 5\",\n\t\t\tnumHashes:    2,\n\t\t\texpectedSize: 69,\n\t\t\texpectErr:    false,\n\t\t},\n\t\t{\n\t\t\tlabel:        \"overflow expected\",\n\t\t\tnumHashes:    math.MaxUint64,\n\t\t\texpectedSize: 0,\n\t\t\texpectErr:    true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tactualSize, err := minTaprootBip32DerivationByteSize(tt.numHashes)\n\n\t\tif (err != nil) != tt.expectErr {\n\t\t\tt.Errorf(\n\t\t\t\t\"%s (numHashes=%d, unexpected_error=%v)\", tt.label,\n\t\t\t\ttt.numHashes, err,\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err == nil && actualSize != tt.expectedSize {\n\t\t\tt.Errorf(\"%s (numHashes=%d, actualSize=%d, expectedSize=%d)\",\n\t\t\t\ttt.label, tt.numHashes, actualSize, tt.expectedSize,\n\t\t\t)\n\t\t}\n\t}\n}\n\n// TestEmptyInputSerialization tests the special serialization case for a wire\n// transaction that has no inputs.\nfunc TestEmptyInputSerialization(t *testing.T) {\n\t// Create and serialize a new, empty PSBT. The wire package will assume\n\t// it's a non-witness transaction, as there are no inputs.\n\tpsbt, err := New(nil, nil, 2, 0, nil)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create empty PSBT: %v\", err)\n\t}\n\tvar buf bytes.Buffer\n\terr = psbt.Serialize(&buf)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to serialize empty PSBT: %v\", err)\n\t}\n\n\t// Try to deserialize the empty transaction again. The wire package will\n\t// assume it's a witness transaction because of the special case where\n\t// there are no inputs. This assumption is wrong and the first attempt\n\t// will fail. But a workaround should try again to deserialize the TX\n\t// with the non-witness format.\n\tpsbt2, err := NewFromRawBytes(&buf, false)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to deserialize empty PSBT: %v\", err)\n\t}\n\tif len(psbt2.UnsignedTx.TxIn) > 0 || len(psbt2.UnsignedTx.TxOut) > 0 {\n\t\tt.Fatalf(\"deserialized transaction not empty\")\n\t}\n}\n\n// TestWitnessForNonWitnessUtxo makes sure that a packet that only has a non-\n// witness UTXO set can still be signed correctly by adding witness data. This\n// is to make sure that PSBTs following the CVE-2020-14199 bugfix are not\n// rejected. See https://github.com/bitcoin/bitcoin/pull/19215.\nfunc TestWitnessForNonWitnessUtxo(t *testing.T) {\n\t// Our witness UTXO is index 1 of this raw transaction from the test\n\t// vectors.\n\tprevTxRaw, _ := hex.DecodeString(\"0200000000010158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88702483045022100a22edcc6e5bc511af4cc4ae0de0fcd75c7e04d8c1c3a8aa9d820ed4b967384ec02200642963597b9b1bc22c75e9f3e117284a962188bf5e8a74c895089046a20ad770121035509a48eb623e10aace8bfd0212fdb8a8e5af3c94b0b133b95e114cab89e4f7965000000\")\n\tprevTx := wire.NewMsgTx(2)\n\terr := prevTx.Deserialize(bytes.NewReader(prevTxRaw))\n\tif err != nil {\n\t\tt.Fatalf(\"failed to deserialize previous TX: %v\", err)\n\t}\n\n\t// First create a packet that contains one input and one output.\n\toutPkScript, _ := hex.DecodeString(CUTestHexData[\"scriptPubkey1\"])\n\tpacket := &Packet{\n\t\tUnsignedTx: &wire.MsgTx{\n\t\t\tVersion:  2,\n\t\t\tLockTime: 0,\n\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\tHash:  prevTx.TxHash(),\n\t\t\t\t\tIndex: 1,\n\t\t\t\t},\n\t\t\t}},\n\t\t\tTxOut: []*wire.TxOut{{\n\t\t\t\tPkScript: outPkScript,\n\t\t\t\tValue:    1.9 * btcutil.SatoshiPerBitcoin,\n\t\t\t}},\n\t\t},\n\t\tInputs:  []PInput{{}},\n\t\tOutputs: []POutput{{}},\n\t}\n\n\t// Create an updater for the packet. This also performs a sanity check.\n\tupdater, err := NewUpdater(packet)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to sanity check raw packet: %v\", err)\n\t}\n\n\t// Now add our witness UTXO to the input. But because hardware wallets\n\t// that are patched against CVE-2020-14199 require the full non-witness\n\t// UTXO to be set for all inputs, we do what Core does and add the full\n\t// transaction in the NonWitnessUtxo instead of just the outpoint in\n\t// WitnessUtxo.\n\terr = updater.AddInNonWitnessUtxo(prevTx, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to update non-witness UTXO: %v\", err)\n\t}\n\n\t// Then add the redeem scripts and witness scripts.\n\tredeemScript, _ := hex.DecodeString(CUTestHexData[\"Input2RedeemScript\"])\n\terr = updater.AddInRedeemScript(redeemScript, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to update redeem script: %v\", err)\n\t}\n\twitnessScript, _ := hex.DecodeString(CUTestHexData[\"Input2WitnessScript\"])\n\terr = updater.AddInWitnessScript(witnessScript, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to update redeem script: %v\", err)\n\t}\n\n\t// Add the first of the two partial signatures.\n\tsig1, _ := hex.DecodeString(\"3044022062eb7a556107a7c73f45ac4ab5a1dddf6f7075fb1275969a7f383efff784bcb202200c05dbb7470dbf2f08557dd356c7325c1ed30913e996cd3840945db12228da5f01\")\n\tpub1, _ := hex.DecodeString(\"03089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc\")\n\tres, err := updater.Sign(0, sig1, pub1, nil, nil)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to sign with pubkey 1: %v\", err)\n\t}\n\tif res != SignSuccesful {\n\t\tt.Fatalf(\"signing was not successful, got result %v\", res)\n\t}\n\n\t// Check that the finalization procedure fails here due to not\n\t// meeting the multisig policy\n\tsuccess, err := MaybeFinalize(packet, 0)\n\tif success {\n\t\tt.Fatalf(\"Incorrectly succeeded in finalizing without sigs\")\n\t}\n\tif err != ErrUnsupportedScriptType {\n\t\tt.Fatalf(\"Got unexpected error type: %v\", err)\n\t}\n\n\t// Add the second partial signature.\n\tsig2, _ := hex.DecodeString(\"3044022065f45ba5998b59a27ffe1a7bed016af1f1f90d54b3aa8f7450aa5f56a25103bd02207f724703ad1edb96680b284b56d4ffcb88f7fb759eabbe08aa30f29b851383d201\")\n\tpub2, _ := hex.DecodeString(\"023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e73\")\n\tres, err = updater.Sign(0, sig2, pub2, nil, nil)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to sign with pubkey 2: %v\", err)\n\t}\n\tif res != SignSuccesful {\n\t\tt.Fatalf(\"signing was not successful, got result %v\", res)\n\t}\n\n\t// Finally make sure we can finalize the packet and extract the raw TX.\n\terr = MaybeFinalizeAll(packet)\n\tif err != nil {\n\t\tt.Fatalf(\"error finalizing PSBT: %v\", err)\n\t}\n\t_, err = Extract(packet)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to extract funding TX: %v\", err)\n\t}\n}\n\n// TestUnknowns tests that we can parse and serialize unknown fields on all\n// three levels (global, input, output).\nfunc TestUnknowns(t *testing.T) {\n\tpacketWithUnknowns := \"cHNidP8BAIkCAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgUAAAAAAAAAIlEg5i9uUYF8DDqT/1fKz8jKT2g/Gj68P6EjLW6dHbImdM0FAAAAAAAAACJRIHS02KqR/607mTrLCABOVF3rLxVDtOLvAw3JLcL5JIgwAAAAAAFwAQEBcQZ0YXJvcnQAIgYCkGaT9mOyWvyoiwSCb1xgFhRie+Y3nTSmO0QQrAe0q7AYAAAAAPkDAIABAACA2wAAgAAAAAAAAAAAIRaQZpP2Y7Ja/KiLBIJvXGAWFGJ75jedNKY7RBCsB7SrsBkAAAAAAPkDAIABAACA2wAAgAAAAAAAAAAAARcgkGaT9mOyWvyoiwSCb1xgFhRie+Y3nTSmO0QQrAe0q7ABGCBlB87S1Bq/Niu8SdW9U1se7WsumF+1gYZ/00f/WkWGAgFwZX/rKpmW4Iz1ScSX2U2SIv8LN5kLvMWGeI7scXdPH/1uAAAAATanCvuEYVDT4vBfORd+71iC7GijIfGKofjwnXI56U3TAhYyvDW2pIk+islXsY45l27xfgJwWWK+CmkFs+cUptDlAXEIAAAAAAAAA+gBciJRIIBtIlu09Y4lcMgdHz3QhfSVV69iKin6cPxH2JFLTO1jAXMIAAAAAAAAAAABdCECtg44XjZucowo0SQp2YJa0esIwS9Bc1N8CpcddTkDdrQBdSB+nQzzBbHVbtIB0AoMIZvFEQpGG1hdp3D+8eYIu37oUgF2GAAAAAD5AwCAAQAAgNsAAIAAAAAAAQAAAAF3GQAAAAAA+QMAgAEAAIDbAACAAAAAAAEAAAABef2sAgABAAFWQzv2kOxwflKCXy51yDJbmfD7pZRVI1+f2k4j5aRkVX0AAAAACWl0ZXN0YnV4eCJzb21lIG1ldGFkYXRhIGZvciB0aGUgaXRlc3QgYXNzZXRzAAAAAAACAQADAQoG/QIgAf0CHABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/QGxSgAB5CgfrndtXUxNHYy61v8ZFC7EVnez4uBSIuSsEug67DIAAAAAAAATfv////////////////////////////////////////+//QFjAAEAAVZDO/aQ7HB+UoJfLnXIMluZ8PullFUjX5/aTiPlpGRVfQAAAAAJaXRlc3RidXh4InNvbWUgbWV0YWRhdGEgZm9yIHRoZSBpdGVzdCBhc3NldHMAAAAAAAIBAAMD/RN+Bq0BqwBldkseYyHTOjpT8WRNj+s5WMuADtDMKW09wG38rhEwM2oAAAAANqcK+4RhUNPi8F85F37vWILsaKMh8Yqh+PCdcjnpTdMCTr1IzgTZHOvZY2+EhzZF1w+HDMMZ2VZ5jDtyuViKWXIBQgFA0KHA0Di7lgqweVLU71eNWoOE759Ec6yFtcw6zVD45yUl8z58/GNb2+xbh/Ou5jfpDAkd4I4wXlafTu3dplTsqAcoHxlrrWtdUR74IMEFKrV3ECvdKAQfH98pZoSlmT1/jQUAAAAAAAATiAgCAAAJIQJhfW7AFTIwW95KKmZWOlJPDjl6ZUyk8uTE4AVS21a0wAgCAAAJIQIWMrw1tqSJPorJV7GOOZdu8X4CcFlivgppBbPnFKbQ5QF6AQEAIgICJzY1cX8foM/D3nXJDsULt45A8PTSWG42lK0rBOqOJrYYAAAAAPkDAIABAACA2wAAgAAAAAACAAAAAQUgJzY1cX8foM/D3nXJDsULt45A8PTSWG42lK0rBOqOJrYhByc2NXF/H6DPw951yQ7FC7eOQPD00lhuNpStKwTqjia2GQAAAAAA+QMAgAEAAIDbAACAAAAAAAIAAAABcAEBAXEBAAFyCAAAAAAAAAAAAXMhAy38VNCuGaPv8LhP6aLaKPFgZC+c5VBOwjrnKR2ReQRCAXQYAAAAAPkDAIABAACA2wAAgAAAAAADAAAAAXUZAAAAAAD5AwCAAQAAgNsAAIAAAAAAAwAAAAF2/WEBAAEAAVZDO/aQ7HB+UoJfLnXIMluZ8PullFUjX5/aTiPlpGRVfQAAAAAJaXRlc3RidXh4InNvbWUgbWV0YWRhdGEgZm9yIHRoZSBpdGVzdCBhc3NldHMAAAAAAAIBAAMBBQatAasAZX/rKpmW4Iz1ScSX2U2SIv8LN5kLvMWGeI7scXdPH/1uAAAAATanCvuEYVDT4vBfORd+71iC7GijIfGKofjwnXI56U3TAhYyvDW2pIk+islXsY45l27xfgJwWWK+CmkFs+cUptDlAUIBQIcR8GQWP8a+XpOIE2KfA844YQQoKuLX18B/Q47cO1MQYzA6SJdDQ3InMTjRxR9STCe5CxnPW9ufpX50GBaV9YIHKHkuFWwwWI5ZxJiPIInqUjmAvRpa9Gi8E4NAW0EtPMAnAAAAAAAAAAoIAgAACSEC5i9uUYF8DDqT/1fKz8jKT2g/Gj68P6EjLW6dHbImdM0AAXABAAFxAQABcggAAAAAAAAAAQFzIQIQiynNQqsCXWFOpFav8EY3PtUvCL3HdwPj0w4MMI1PowF2/aoCAAEAAVZDO/aQ7HB+UoJfLnXIMluZ8PullFUjX5/aTiPlpGRVfQAAAAAJaXRlc3RidXh4InNvbWUgbWV0YWRhdGEgZm9yIHRoZSBpdGVzdCBhc3NldHMAAAAAAAIBAAMBBQb9Ah4B/QIaAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL9Aa9KAAEhQAiYnrNk28uUgoU7xUnxAxecle1lVSSbHyT0Xdo8FgAAAAAAAAAF/////////////////////////////////////////3/9AWEAAQABVkM79pDscH5Sgl8udcgyW5nw+6WUVSNfn9pOI+WkZFV9AAAAAAlpdGVzdGJ1eHgic29tZSBtZXRhZGF0YSBmb3IgdGhlIGl0ZXN0IGFzc2V0cwAAAAAAAgEAAwEFBq0BqwBlf+sqmZbgjPVJxJfZTZIi/ws3mQu8xYZ4juxxd08f/W4AAAABNqcK+4RhUNPi8F85F37vWILsaKMh8Yqh+PCdcjnpTdMCFjK8NbakiT6KyVexjjmXbvF+AnBZYr4KaQWz5xSm0OUBQgFAhxHwZBY/xr5ek4gTYp8DzjhhBCgq4tfXwH9Djtw7UxBjMDpIl0NDcicxONHFH1JMJ7kLGc9b25+lfnQYFpX1ggcoeS4VbDBYjlnEmI8giepSOYC9Glr0aLwTg0BbQS08wCcAAAAAAAAACggCAAAJIQLmL25RgXwMOpP/V8rPyMpPaD8aPrw/oSMtbp0dsiZ0zQgCAAAJIQJ0tNiqkf+tO5k6ywgATlRd6y8VQ7Ti7wMNyS3C+SSIMAA=\"\n\n\tpacket, err := NewFromRawBytes(\n\t\tstrings.NewReader(packetWithUnknowns), true,\n\t)\n\trequire.NoError(t, err)\n\n\trequire.Len(t, packet.Unknowns, 2)\n\n\trequire.Len(t, packet.Inputs, 1)\n\trequire.Len(t, packet.Inputs[0].Unknowns, 10)\n\n\trequire.Len(t, packet.Outputs, 2)\n\trequire.Len(t, packet.Outputs[0].Unknowns, 7)\n\n\t// Convert it to base64 again to make sure the fields are also\n\t// serialized.\n\tencoded, err := packet.B64Encode()\n\trequire.NoError(t, err)\n\trequire.Equal(t, packetWithUnknowns, encoded)\n}\n"
  },
  {
    "path": "btcutil/psbt/signer.go",
    "content": "// Copyright (c) 2018 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage psbt\n\n// signer encapsulates the role 'Signer' as specified in BIP174; it controls\n// the insertion of signatures; the Sign() function will attempt to insert\n// signatures using Updater.addPartialSignature, after first ensuring the Psbt\n// is in the correct state.\n\nimport (\n\t\"github.com/btcsuite/btcd/txscript\"\n)\n\n// SignOutcome is a enum-like value that expresses the outcome of a call to the\n// Sign method.\ntype SignOutcome int\n\nconst (\n\t// SignSuccesful indicates that the partial signature was successfully\n\t// attached.\n\tSignSuccesful = 0\n\n\t// SignFinalized  indicates that this input is already finalized, so the\n\t// provided signature was *not* attached\n\tSignFinalized = 1\n\n\t// SignInvalid indicates that the provided signature data was not valid.\n\t// In this case an error will also be returned.\n\tSignInvalid = -1\n)\n\n// Sign allows the caller to sign a PSBT at a particular input; they\n// must provide a signature and a pubkey, both as byte slices; they can also\n// optionally provide both witnessScript and/or redeemScript, otherwise these\n// arguments must be set as nil (and in that case, they must already be present\n// in the PSBT if required for signing to succeed).\n//\n// This serves as a wrapper around Updater.addPartialSignature; it ensures that\n// the redeemScript and witnessScript are updated as needed (note that the\n// Updater is allowed to add redeemScripts and witnessScripts independently,\n// before signing), and ensures that the right form of utxo field\n// (NonWitnessUtxo or WitnessUtxo) is included in the input so that signature\n// insertion (and then finalization) can take place.\nfunc (u *Updater) Sign(inIndex int, sig []byte, pubKey []byte,\n\tredeemScript []byte, witnessScript []byte) (SignOutcome, error) {\n\n\tif isFinalized(u.Upsbt, inIndex) {\n\t\treturn SignFinalized, nil\n\t}\n\n\t// Add the witnessScript to the PSBT in preparation.  If it already\n\t// exists, it will be overwritten.\n\tif witnessScript != nil {\n\t\terr := u.AddInWitnessScript(witnessScript, inIndex)\n\t\tif err != nil {\n\t\t\treturn SignInvalid, err\n\t\t}\n\t}\n\n\t// Add the redeemScript to the PSBT in preparation.  If it already\n\t// exists, it will be overwritten.\n\tif redeemScript != nil {\n\t\terr := u.AddInRedeemScript(redeemScript, inIndex)\n\t\tif err != nil {\n\t\t\treturn SignInvalid, err\n\t\t}\n\t}\n\n\t// At this point, the PSBT must have the requisite witnessScript or\n\t// redeemScript fields for signing to succeed.\n\t//\n\t// Case 1: if witnessScript is present, it must be of type witness;\n\t// if not, signature insertion will of course fail.\n\tpInput := u.Upsbt.Inputs[inIndex]\n\tswitch {\n\tcase pInput.WitnessScript != nil:\n\t\tif pInput.WitnessUtxo == nil {\n\t\t\terr := nonWitnessToWitness(u.Upsbt, inIndex)\n\t\t\tif err != nil {\n\t\t\t\treturn SignInvalid, err\n\t\t\t}\n\t\t}\n\n\t\terr := u.addPartialSignature(inIndex, sig, pubKey)\n\t\tif err != nil {\n\t\t\treturn SignInvalid, err\n\t\t}\n\n\t// Case 2: no witness script, only redeem script; can be legacy p2sh or\n\t// p2sh-wrapped p2wkh.\n\tcase pInput.RedeemScript != nil:\n\t\t// We only need to decide if the input is witness, and we don't\n\t\t// rely on the witnessutxo/nonwitnessutxo in the PSBT, instead\n\t\t// we check the redeemScript content.\n\t\tif txscript.IsWitnessProgram(redeemScript) {\n\t\t\tif pInput.WitnessUtxo == nil {\n\t\t\t\terr := nonWitnessToWitness(u.Upsbt, inIndex)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn SignInvalid, err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If it is not a valid witness program, we here assume that\n\t\t// the provided WitnessUtxo/NonWitnessUtxo field was correct.\n\t\terr := u.addPartialSignature(inIndex, sig, pubKey)\n\t\tif err != nil {\n\t\t\treturn SignInvalid, err\n\t\t}\n\n\t// Case 3: Neither provided only works for native p2wkh, or non-segwit\n\t// non-p2sh. To check if it's segwit, check the scriptPubKey of the\n\t// output.\n\tdefault:\n\t\tif pInput.WitnessUtxo == nil {\n\t\t\ttxIn := u.Upsbt.UnsignedTx.TxIn[inIndex]\n\t\t\toutIndex := txIn.PreviousOutPoint.Index\n\t\t\tscript := pInput.NonWitnessUtxo.TxOut[outIndex].PkScript\n\n\t\t\tif txscript.IsWitnessProgram(script) {\n\t\t\t\terr := nonWitnessToWitness(u.Upsbt, inIndex)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn SignInvalid, err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\terr := u.addPartialSignature(inIndex, sig, pubKey)\n\t\tif err != nil {\n\t\t\treturn SignInvalid, err\n\t\t}\n\t}\n\n\treturn SignSuccesful, nil\n}\n\n// nonWitnessToWitness extracts the TxOut from the existing NonWitnessUtxo\n// field in the given PSBT input and sets it as type witness by replacing the\n// NonWitnessUtxo field with a WitnessUtxo field. See\n// https://github.com/bitcoin/bitcoin/pull/14197.\nfunc nonWitnessToWitness(p *Packet, inIndex int) error {\n\toutIndex := p.UnsignedTx.TxIn[inIndex].PreviousOutPoint.Index\n\ttxout := p.Inputs[inIndex].NonWitnessUtxo.TxOut[outIndex]\n\n\t// TODO(guggero): For segwit v1, we'll want to remove the NonWitnessUtxo\n\t// from the packet. For segwit v0 it is unsafe to only rely on the\n\t// witness UTXO. See https://github.com/bitcoin/bitcoin/pull/19215.\n\t// p.Inputs[inIndex].NonWitnessUtxo = nil\n\n\tu := Updater{\n\t\tUpsbt: p,\n\t}\n\n\treturn u.AddInWitnessUtxo(txout, inIndex)\n}\n"
  },
  {
    "path": "btcutil/psbt/sort.go",
    "content": "package psbt\n\nimport (\n\t\"bytes\"\n\t\"sort\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// InPlaceSort modifies the passed packet's wire TX inputs and outputs to be\n// sorted based on BIP 69. The sorting happens in a way that the packet's\n// partial inputs and outputs are also modified to match the sorted TxIn and\n// TxOuts of the wire transaction.\n//\n// WARNING: This function must NOT be called with packages that already contain\n// (partial) witness data since it will mutate the transaction if it's not\n// already sorted. This can cause issues if you mutate a tx in a block, for\n// example, which would invalidate the block. It could also cause cached hashes,\n// such as in a btcutil.Tx to become invalidated.\n//\n// The function should only be used if the caller is creating the transaction or\n// is otherwise 100% positive mutating will not cause adverse affects due to\n// other dependencies.\nfunc InPlaceSort(packet *Packet) error {\n\t// To make sure we don't run into any nil pointers or array index\n\t// violations during sorting, do a very basic sanity check first.\n\terr := VerifyInputOutputLen(packet, false, false)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tsort.Sort(&sortableInputs{p: packet})\n\tsort.Sort(&sortableOutputs{p: packet})\n\n\treturn nil\n}\n\n// sortableInputs is a simple wrapper around a packet that implements the\n// sort.Interface for sorting the wire and partial inputs of a packet.\ntype sortableInputs struct {\n\tp *Packet\n}\n\n// sortableOutputs is a simple wrapper around a packet that implements the\n// sort.Interface for sorting the wire and partial outputs of a packet.\ntype sortableOutputs struct {\n\tp *Packet\n}\n\n// For sortableInputs and sortableOutputs, three functions are needed to make\n// them sortable with sort.Sort() -- Len, Less, and Swap.\n// Len and Swap are trivial. Less is BIP 69 specific.\nfunc (s *sortableInputs) Len() int { return len(s.p.UnsignedTx.TxIn) }\nfunc (s sortableOutputs) Len() int { return len(s.p.UnsignedTx.TxOut) }\n\n// Swap swaps two inputs.\nfunc (s *sortableInputs) Swap(i, j int) {\n\ttx := s.p.UnsignedTx\n\ttx.TxIn[i], tx.TxIn[j] = tx.TxIn[j], tx.TxIn[i]\n\ts.p.Inputs[i], s.p.Inputs[j] = s.p.Inputs[j], s.p.Inputs[i]\n}\n\n// Swap swaps two outputs.\nfunc (s *sortableOutputs) Swap(i, j int) {\n\ttx := s.p.UnsignedTx\n\ttx.TxOut[i], tx.TxOut[j] = tx.TxOut[j], tx.TxOut[i]\n\ts.p.Outputs[i], s.p.Outputs[j] = s.p.Outputs[j], s.p.Outputs[i]\n}\n\n// Less is the input comparison function. First sort based on input hash\n// (reversed / rpc-style), then index.\nfunc (s *sortableInputs) Less(i, j int) bool {\n\tins := s.p.UnsignedTx.TxIn\n\n\t// Input hashes are the same, so compare the index.\n\tihash := ins[i].PreviousOutPoint.Hash\n\tjhash := ins[j].PreviousOutPoint.Hash\n\tif ihash == jhash {\n\t\treturn ins[i].PreviousOutPoint.Index <\n\t\t\tins[j].PreviousOutPoint.Index\n\t}\n\n\t// At this point, the hashes are not equal, so reverse them to\n\t// big-endian and return the result of the comparison.\n\tconst hashSize = chainhash.HashSize\n\tfor b := 0; b < hashSize/2; b++ {\n\t\tihash[b], ihash[hashSize-1-b] = ihash[hashSize-1-b], ihash[b]\n\t\tjhash[b], jhash[hashSize-1-b] = jhash[hashSize-1-b], jhash[b]\n\t}\n\treturn bytes.Compare(ihash[:], jhash[:]) == -1\n}\n\n// Less is the output comparison function. First sort based on amount (smallest\n// first), then PkScript.\nfunc (s *sortableOutputs) Less(i, j int) bool {\n\touts := s.p.UnsignedTx.TxOut\n\n\tif outs[i].Value == outs[j].Value {\n\t\treturn bytes.Compare(outs[i].PkScript, outs[j].PkScript) < 0\n\t}\n\treturn outs[i].Value < outs[j].Value\n}\n"
  },
  {
    "path": "btcutil/psbt/sort_test.go",
    "content": "package psbt\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nfunc TestInPlaceSort(t *testing.T) {\n\ttestCases := []struct {\n\t\tname          string\n\t\tpacket        *Packet\n\t\texpectedTxIn  []*wire.TxIn\n\t\texpectedTxOut []*wire.TxOut\n\t\texpectedPIn   []PInput\n\t\texpectedPOut  []POutput\n\t\texpectErr     bool\n\t}{{\n\t\tname:      \"packet nil\",\n\t\tpacket:    nil,\n\t\texpectErr: true,\n\t}, {\n\t\tname:      \"no inputs or outputs\",\n\t\tpacket:    &Packet{UnsignedTx: &wire.MsgTx{}},\n\t\texpectErr: false,\n\t}, {\n\t\tname: \"inputs only\",\n\t\tpacket: &Packet{\n\t\t\tUnsignedTx: &wire.MsgTx{\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash:  chainhash.Hash{99, 88},\n\t\t\t\t\t\tIndex: 7,\n\t\t\t\t\t},\n\t\t\t\t}, {\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash:  chainhash.Hash{77, 88},\n\t\t\t\t\t\tIndex: 12,\n\t\t\t\t\t},\n\t\t\t\t}, {\n\t\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\t\tHash:  chainhash.Hash{77, 88},\n\t\t\t\t\t\tIndex: 7,\n\t\t\t\t\t},\n\t\t\t\t}},\n\t\t\t},\n\t\t\t// Abuse the SighashType as an index to make sure the\n\t\t\t// partial inputs are also sorted together with the wire\n\t\t\t// inputs.\n\t\t\tInputs: []PInput{{\n\t\t\t\tSighashType: 0,\n\t\t\t}, {\n\t\t\t\tSighashType: 1,\n\t\t\t}, {\n\t\t\t\tSighashType: 2,\n\t\t\t}},\n\t\t},\n\t\texpectedTxIn: []*wire.TxIn{{\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash:  chainhash.Hash{77, 88},\n\t\t\t\tIndex: 7,\n\t\t\t},\n\t\t}, {\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash:  chainhash.Hash{77, 88},\n\t\t\t\tIndex: 12,\n\t\t\t},\n\t\t}, {\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash:  chainhash.Hash{99, 88},\n\t\t\t\tIndex: 7,\n\t\t\t},\n\t\t}},\n\t\texpectedPIn: []PInput{{\n\t\t\tSighashType: 2,\n\t\t}, {\n\t\t\tSighashType: 1,\n\t\t}, {\n\t\t\tSighashType: 0,\n\t\t}},\n\t\texpectErr: false,\n\t}, {\n\t\tname: \"outputs only\",\n\t\tpacket: &Packet{\n\t\t\tUnsignedTx: &wire.MsgTx{\n\t\t\t\tTxOut: []*wire.TxOut{{\n\t\t\t\t\tPkScript: []byte{99, 88},\n\t\t\t\t\tValue:    7,\n\t\t\t\t}, {\n\t\t\t\t\tPkScript: []byte{77, 88},\n\t\t\t\t\tValue:    12,\n\t\t\t\t}, {\n\t\t\t\t\tPkScript: []byte{77, 88},\n\t\t\t\t\tValue:    7,\n\t\t\t\t}},\n\t\t\t},\n\t\t\t// Abuse the RedeemScript as an index to make sure the\n\t\t\t// partial inputs are also sorted together with the wire\n\t\t\t// inputs.\n\t\t\tOutputs: []POutput{{\n\t\t\t\tRedeemScript: []byte{0},\n\t\t\t}, {\n\t\t\t\tRedeemScript: []byte{1},\n\t\t\t}, {\n\t\t\t\tRedeemScript: []byte{2},\n\t\t\t}},\n\t\t},\n\t\texpectedTxOut: []*wire.TxOut{{\n\t\t\tPkScript: []byte{77, 88},\n\t\t\tValue:    7,\n\t\t}, {\n\t\t\tPkScript: []byte{99, 88},\n\t\t\tValue:    7,\n\t\t}, {\n\t\t\tPkScript: []byte{77, 88},\n\t\t\tValue:    12,\n\t\t}},\n\t\texpectedPOut: []POutput{{\n\t\t\tRedeemScript: []byte{2},\n\t\t}, {\n\t\t\tRedeemScript: []byte{0},\n\t\t}, {\n\t\t\tRedeemScript: []byte{1},\n\t\t}},\n\t\texpectErr: false,\n\t}}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tp := tc.packet\n\t\t\terr := InPlaceSort(p)\n\t\t\tif (tc.expectErr && err == nil) ||\n\t\t\t\t(!tc.expectErr && err != nil) {\n\n\t\t\t\tt.Fatalf(\"got error '%v' but wanted it to be \"+\n\t\t\t\t\t\"nil: %v\", err, tc.expectErr)\n\t\t\t}\n\n\t\t\t// Don't continue on this special test case.\n\t\t\tif p == nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttx := p.UnsignedTx\n\t\t\tif !reflect.DeepEqual(tx.TxIn, tc.expectedTxIn) {\n\t\t\t\tt.Fatalf(\"unexpected txin, got %#v wanted %#v\",\n\t\t\t\t\ttx.TxIn, tc.expectedTxIn)\n\t\t\t}\n\t\t\tif !reflect.DeepEqual(tx.TxOut, tc.expectedTxOut) {\n\t\t\t\tt.Fatalf(\"unexpected txout, got %#v wanted %#v\",\n\t\t\t\t\ttx.TxOut, tc.expectedTxOut)\n\t\t\t}\n\n\t\t\tif !reflect.DeepEqual(p.Inputs, tc.expectedPIn) {\n\t\t\t\tt.Fatalf(\"unexpected pin, got %#v wanted %#v\",\n\t\t\t\t\tp.Inputs, tc.expectedPIn)\n\t\t\t}\n\t\t\tif !reflect.DeepEqual(p.Outputs, tc.expectedPOut) {\n\t\t\t\tt.Fatalf(\"unexpected pout, got %#v wanted %#v\",\n\t\t\t\t\tp.Inputs, tc.expectedPOut)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "btcutil/psbt/taproot.go",
    "content": "package psbt\n\nimport (\n\t\"bytes\"\n\t\"math\"\n\t\"math/bits\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// schnorrSigMinLength is the minimum length of a Schnorr signature\n\t// which is 64 bytes.\n\tschnorrSigMinLength = schnorr.SignatureSize\n\n\t// schnorrSigMaxLength is the maximum length of a Schnorr signature\n\t// which is 64 bytes plus one byte for the appended sighash flag.\n\tschnorrSigMaxLength = schnorrSigMinLength + 1\n)\n\n// TaprootScriptSpendSig encapsulates an individual Schnorr signature for a\n// given public key and leaf hash.\ntype TaprootScriptSpendSig struct {\n\tXOnlyPubKey []byte\n\tLeafHash    []byte\n\tSignature   []byte\n\tSigHash     txscript.SigHashType\n}\n\n// checkValid checks that both the pubkey and the signature are valid.\nfunc (s *TaprootScriptSpendSig) checkValid() bool {\n\treturn validateXOnlyPubkey(s.XOnlyPubKey) &&\n\t\tvalidateSchnorrSignature(s.Signature)\n}\n\n// EqualKey returns true if this script spend signature's key data is the same\n// as the given script spend signature.\nfunc (s *TaprootScriptSpendSig) EqualKey(other *TaprootScriptSpendSig) bool {\n\treturn bytes.Equal(s.XOnlyPubKey, other.XOnlyPubKey) &&\n\t\tbytes.Equal(s.LeafHash, other.LeafHash)\n}\n\n// SortBefore returns true if this script spend signature's key is\n// lexicographically smaller than the given other script spend signature's key\n// and should come first when being sorted.\nfunc (s *TaprootScriptSpendSig) SortBefore(other *TaprootScriptSpendSig) bool {\n\treturn bytes.Compare(s.XOnlyPubKey, other.XOnlyPubKey) < 0 &&\n\t\tbytes.Compare(s.LeafHash, other.LeafHash) < 0\n}\n\n// TaprootTapLeafScript represents a single taproot leaf script that is\n// identified by its control block.\ntype TaprootTapLeafScript struct {\n\tControlBlock []byte\n\tScript       []byte\n\tLeafVersion  txscript.TapscriptLeafVersion\n}\n\n// checkValid checks that the control block is valid.\nfunc (s *TaprootTapLeafScript) checkValid() bool {\n\treturn validateControlBlock(s.ControlBlock)\n}\n\n// SortBefore returns true if this leaf script's key is lexicographically\n// smaller than the given other leaf script's key and should come first when\n// being sorted.\nfunc (s *TaprootTapLeafScript) SortBefore(other *TaprootTapLeafScript) bool {\n\treturn bytes.Compare(s.ControlBlock, other.ControlBlock) < 0\n}\n\n// TaprootBip32Derivation encapsulates the data for the input and output\n// taproot specific BIP-32 derivation key-value fields.\ntype TaprootBip32Derivation struct {\n\t// XOnlyPubKey is the raw public key serialized in the x-only BIP-340\n\t// format.\n\tXOnlyPubKey []byte\n\n\t// LeafHashes is a list of leaf hashes that the given public key is\n\t// involved in.\n\tLeafHashes [][]byte\n\n\t// MasterKeyFingerprint is the fingerprint of the master pubkey.\n\tMasterKeyFingerprint uint32\n\n\t// Bip32Path is the BIP 32 path with child index as a distinct integer.\n\tBip32Path []uint32\n}\n\n// SortBefore returns true if this derivation info's key is lexicographically\n// smaller than the given other derivation info's key and should come first when\n// being sorted.\nfunc (s *TaprootBip32Derivation) SortBefore(other *TaprootBip32Derivation) bool {\n\treturn bytes.Compare(s.XOnlyPubKey, other.XOnlyPubKey) < 0\n}\n\n// minTaprootBip32DerivationByteSize returns the minimum number of bytes\n// required to encode a Taproot BIP32 derivation field, given the number of\n// leaf hashes.\n//\n// NOTE: This function does not account for the size of the BIP32 child indexes,\n// as we are only computing the minimum size (which occurs when the path is\n// empty). The bits package is used to safely detect and handle overflows.\nfunc minTaprootBip32DerivationByteSize(numHashes uint64) (uint64, error) {\n\t// The Taproot BIP32 derivation field is encoded as:\n\t//   [compact size uint: number of leaf hashes]\n\t//   [N × 32 bytes: leaf hashes]\n\t//   [4 bytes: master key fingerprint]\n\t//   [M × 4 bytes: BIP32 child indexes]\n\t//\n\t// To compute the minimum size given the number of hashes only, we assume:\n\t// - N = numHashes (provided)\n\t// - M = 0 (no child indexes)\n\t//\n\t// So the base byte size is:\n\t//   1 (leaf hash count) + (N × 32) + 4 (fingerprint)\n\t//\n\t// First, we calculate the total number of bytes for the leaf hashes.\n\tmulCarry, totalHashesBytes := bits.Mul64(numHashes, 32)\n\tif mulCarry != 0 {\n\t\treturn 0, ErrInvalidPsbtFormat\n\t}\n\n\t// Since we're computing the minimum possible size, we add a constant that\n\t// accounts for the fixed size fields:\n\t// * 1 byte for the compact size leaf hash count (assumes numHashes < 0xfd)\n\t// * 4 bytes for the master key fingerprint\n\t// Total: 5 bytes.\n\t// All other fields (e.g., BIP32 path) are assumed absent for minimum size\n\t// calculation.\n\tresult, addCarry := bits.Add64(5, totalHashesBytes, 0)\n\tif addCarry != 0 {\n\t\treturn 0, ErrInvalidPsbtFormat\n\t}\n\n\treturn result, nil\n}\n\n// ReadTaprootBip32Derivation deserializes a byte slice containing the Taproot\n// BIP32 derivation info that consists of a list of leaf hashes as well as the\n// normal BIP32 derivation info.\nfunc ReadTaprootBip32Derivation(xOnlyPubKey,\n\tvalue []byte) (*TaprootBip32Derivation, error) {\n\n\t// This function allocates additional memory while parsing the serialized\n\t// data. To prevent potential out-of-memory (OOM) issues, we must validate\n\t// the length of the value slice before proceeding.\n\tif len(value) > MaxPsbtValueLength {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\n\t// The taproot key BIP 32 derivation path is defined as:\n\t//   <hashes len> <leaf hash>* <4 byte fingerprint> <32-bit uint>*\n\t// So we get at least 5 bytes for the length and the 4 byte fingerprint.\n\tif len(value) < 5 {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\n\t// The first element is the number of hashes that will follow.\n\treader := bytes.NewReader(value)\n\tnumHashes, err := wire.ReadVarInt(reader, 0)\n\tif err != nil {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\n\t// As a safety/sanity check, verify that the hash count fits in a `uint32`.\n\t// This isn’t mandated by BIP‑371, but it prevents overflow and limits\n\t// derivations to about 137 GiB of data.\n\tif numHashes > math.MaxUint32 {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\n\t// Given the number of hashes, we can calculate the minimum byte size\n\t// of the taproot BIP32 derivation.\n\tminByteSize, err := minTaprootBip32DerivationByteSize(numHashes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Ensure that value is at least the minimum size.\n\tif uint64(len(value)) < minByteSize {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\n\tderivation := TaprootBip32Derivation{\n\t\tXOnlyPubKey: xOnlyPubKey,\n\t\tLeafHashes:  make([][]byte, int(numHashes)),\n\t}\n\n\tfor i := 0; i < int(numHashes); i++ {\n\t\tderivation.LeafHashes[i] = make([]byte, 32)\n\t\tn, err := reader.Read(derivation.LeafHashes[i])\n\t\tif err != nil || n != 32 {\n\t\t\treturn nil, ErrInvalidPsbtFormat\n\t\t}\n\t}\n\n\t// Extract the remaining bytes from the reader (we don't actually know\n\t// how many bytes we read due to the compact size integer at the\n\t// beginning).\n\tvar leftoverBuf bytes.Buffer\n\t_, err = reader.WriteTo(&leftoverBuf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Read the BIP32 derivation info.\n\tfingerprint, path, err := ReadBip32Derivation(leftoverBuf.Bytes())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tderivation.MasterKeyFingerprint = fingerprint\n\tderivation.Bip32Path = path\n\n\treturn &derivation, nil\n}\n\n// SerializeTaprootBip32Derivation serializes a TaprootBip32Derivation to its\n// raw byte representation.\nfunc SerializeTaprootBip32Derivation(d *TaprootBip32Derivation) ([]byte,\n\terror) {\n\n\tvar buf bytes.Buffer\n\n\t// The taproot key BIP 32 derivation path is defined as:\n\t//   <hashes len> <leaf hash>* <4 byte fingerprint> <32-bit uint>*\n\terr := wire.WriteVarInt(&buf, 0, uint64(len(d.LeafHashes)))\n\tif err != nil {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\n\tfor _, hash := range d.LeafHashes {\n\t\tn, err := buf.Write(hash)\n\t\tif err != nil || n != 32 {\n\t\t\treturn nil, ErrInvalidPsbtFormat\n\t\t}\n\t}\n\n\t_, err = buf.Write(SerializeBIP32Derivation(\n\t\td.MasterKeyFingerprint, d.Bip32Path,\n\t))\n\tif err != nil {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\n\treturn buf.Bytes(), nil\n}\n\n// validateXOnlyPubkey checks if pubKey is *any* valid pubKey serialization in a\n// BIP-340 context (x-only serialization).\nfunc validateXOnlyPubkey(pubKey []byte) bool {\n\t_, err := schnorr.ParsePubKey(pubKey)\n\treturn err == nil\n}\n\n// validateSchnorrSignature checks that the passed byte slice is a valid Schnorr\n// signature, _NOT_ including the sighash flag. It does *not* of course\n// validate the signature against any message or public key.\nfunc validateSchnorrSignature(sig []byte) bool {\n\t_, err := schnorr.ParseSignature(sig)\n\treturn err == nil\n}\n\n// validateControlBlock checks that the passed byte slice is a valid control\n// block as it would appear in a BIP-341 witness stack as the last element.\nfunc validateControlBlock(controlBlock []byte) bool {\n\t_, err := txscript.ParseControlBlock(controlBlock)\n\treturn err == nil\n}\n"
  },
  {
    "path": "btcutil/psbt/types.go",
    "content": "package psbt\n\n// GlobalType is the set of types that are used at the global scope level\n// within the PSBT.\ntype GlobalType uint8\n\nconst (\n\t// UnsignedTxType is the global scope key that houses the unsigned\n\t// transaction of the PSBT. The value is a transaction in network\n\t// serialization. The scriptSigs and witnesses for each input must be\n\t// empty. The transaction must be in the old serialization format\n\t// (without witnesses). A PSBT must have a transaction, otherwise it is\n\t// invalid.\n\tUnsignedTxType GlobalType = 0\n\n\t// XPubType houses a global xPub for the entire PSBT packet.\n\t//\n\t// The key ({0x01}|{xpub}) is the 78 byte serialized extended public key\n\t// as defined by BIP-0032. Extended public keys are those that can be\n\t// used to derive public keys used in the inputs and outputs of this\n\t// transaction. It should be the public key at the highest hardened\n\t// derivation index so that the unhardened child keys used in the\n\t// transaction can be derived.\n\t//\n\t// The value is the master key fingerprint as defined by BIP-0032\n\t// concatenated with the derivation path of the public key. The\n\t// derivation path is represented as 32-bit little endian unsigned\n\t// integer indexes concatenated with each other. The number of 32-bit\n\t// unsigned integer indexes must match the depth provided in the\n\t// extended public key.\n\tXPubType GlobalType = 1\n\n\t// VersionType houses the global version number of this PSBT. There is\n\t// no key (only contains the byte type), then the value if omitted, is\n\t// assumed to be zero.\n\tVersionType GlobalType = 0xFB\n\n\t// ProprietaryGlobalType is used to house any proper chary global-scope\n\t// keys within the PSBT.\n\t//\n\t// The key is ({0xFC}|<prefix>|{subtype}|{key data}) a variable length\n\t// identifier prefix, followed by a subtype, followed by the key data\n\t// itself.\n\t//\n\t// The value is any data as defined by the proprietary type user.\n\tProprietaryGlobalType = 0xFC\n)\n\n// InputType is the set of types that are defined for each input included\n// within the PSBT.\ntype InputType uint32\n\nconst (\n\t// NonWitnessUtxoType has no key ({0x00}) and houses the transaction in\n\t// network serialization format the current input spends from. This\n\t// should only be present for inputs which spend non-segwit outputs.\n\t// However, if it is unknown whether an input spends a segwit output,\n\t// this type should be used. The entire input transaction is needed in\n\t// order to be able to verify the values of the input (pre-segwit they\n\t// aren't in the signature digest).\n\tNonWitnessUtxoType InputType = 0\n\n\t// WitnessUtxoType has no key ({0x01}), and houses the entire\n\t// transaction output in network serialization which the current input\n\t// spends from.  This should only be present for inputs which spend\n\t// segwit outputs, including P2SH embedded ones (value || script).\n\tWitnessUtxoType InputType = 1\n\n\t// PartialSigType is used to include a partial signature with key\n\t// ({0x02}|{public key}).\n\t//\n\t// The value is the signature as would be pushed to the stack from a\n\t// scriptSig or witness..\n\tPartialSigType InputType = 2\n\n\t// SighashType is an empty key ({0x03}).\n\t//\n\t// The value contains the 32-bit unsigned integer specifying the\n\t// sighash type to be used for this input. Signatures for this input\n\t// must use the sighash type, finalizers must fail to finalize inputs\n\t// which have signatures that do not match the specified sighash type.\n\t// Signers who cannot produce signatures with the sighash type must not\n\t// provide a signature.\n\tSighashType InputType = 3\n\n\t// RedeemScriptInputType is an empty key ({0x40}).\n\t//\n\t// The value is the redeem script of the input if present.\n\tRedeemScriptInputType InputType = 4\n\n\t// WitnessScriptInputType is an empty key ({0x05}).\n\t//\n\t// The value is the witness script of this input, if it has one.\n\tWitnessScriptInputType InputType = 5\n\n\t// Bip32DerivationInputType is a type that carries the pubkey along\n\t// with the key ({0x06}|{public key}).\n\t//\n\t// The value is master key fingerprint as defined by BIP 32\n\t// concatenated with the derivation path of the public key. The\n\t// derivation path is represented as 32 bit unsigned integer indexes\n\t// concatenated with each other. Public keys are those that will be\n\t// needed to sign this input.\n\tBip32DerivationInputType InputType = 6\n\n\t// FinalScriptSigType is an empty key ({0x07}).\n\t//\n\t// The value contains a fully constructed scriptSig with signatures and\n\t// any other scripts necessary for the input to pass validation.\n\tFinalScriptSigType InputType = 7\n\n\t// FinalScriptWitnessType is an empty key ({0x08}). The value is a\n\t// fully constructed scriptWitness with signatures and any other\n\t// scripts necessary for the input to pass validation.\n\tFinalScriptWitnessType InputType = 8\n\n\t// TaprootKeySpendSignatureType is an empty key ({0x13}). The value is\n\t// a 64-byte Schnorr signature or a 65-byte Schnorr signature with the\n\t// one byte sighash type appended to it.\n\tTaprootKeySpendSignatureType InputType = 0x13\n\n\t// TaprootScriptSpendSignatureType is a type that carries the\n\t// x-only pubkey and leaf hash along with the key\n\t// ({0x14}|{xonlypubkey}|{leafhash}).\n\t//\n\t// The value is a 64-byte Schnorr signature or a 65-byte Schnorr\n\t// signature with the one byte sighash type appended to it.\n\tTaprootScriptSpendSignatureType InputType = 0x14\n\n\t// TaprootLeafScriptType is a type that carries the control block along\n\t// with the key ({0x15}|{control block}).\n\t//\n\t// The value is a script followed by a one byte unsigned integer that\n\t// represents the leaf version.\n\tTaprootLeafScriptType InputType = 0x15\n\n\t// TaprootBip32DerivationInputType is a type that carries the x-only\n\t// pubkey along with the key ({0x16}|{xonlypubkey}).\n\t//\n\t// The value is a compact integer denoting the number of hashes,\n\t// followed by said number of 32-byte leaf hashes. The rest of the value\n\t// is then identical to the Bip32DerivationInputType value.\n\tTaprootBip32DerivationInputType InputType = 0x16\n\n\t// TaprootInternalKeyInputType is an empty key ({0x17}). The value is\n\t// an x-only pubkey denoting the internal public key used for\n\t// constructing a taproot key.\n\tTaprootInternalKeyInputType InputType = 0x17\n\n\t// TaprootMerkleRootType is an empty key ({0x18}). The value is a\n\t// 32-byte hash denoting the root hash of a merkle tree of scripts.\n\tTaprootMerkleRootType InputType = 0x18\n\n\t// ProprietaryInputType is a custom type for use by devs.\n\t//\n\t// The key ({0xFC}|<prefix>|{subtype}|{key data}), is a Variable length\n\t// identifier prefix, followed by a subtype, followed by the key data\n\t// itself.\n\t//\n\t// The value is any value data as defined by the proprietary type user.\n\tProprietaryInputType InputType = 0xFC\n)\n\n// OutputType is the set of types defined per output within the PSBT.\ntype OutputType uint32\n\nconst (\n\t// RedeemScriptOutputType is an empty key ({0x00}>\n\t//\n\t// The value is the redeemScript for this output if it has one.\n\tRedeemScriptOutputType OutputType = 0\n\n\t// WitnessScriptOutputType is an empty key ({0x01}).\n\t//\n\t// The value is the witness script of this input, if it has one.\n\tWitnessScriptOutputType OutputType = 1\n\n\t// Bip32DerivationOutputType is used to communicate derivation information\n\t// needed to spend this output. The key is ({0x02}|{public key}).\n\t//\n\t// The value is master key fingerprint concatenated with the derivation\n\t// path of the public key. The derivation path is represented as 32-bit\n\t// little endian unsigned integer indexes concatenated with each other.\n\t// Public keys are those needed to spend this output.\n\tBip32DerivationOutputType OutputType = 2\n\n\t// TaprootInternalKeyOutputType is an empty key ({0x05}). The value is\n\t// an x-only pubkey denoting the internal public key used for\n\t// constructing a taproot key.\n\tTaprootInternalKeyOutputType OutputType = 5\n\n\t// TaprootTapTreeType is an empty key ({0x06}). The value is a\n\t// serialized taproot tree.\n\tTaprootTapTreeType OutputType = 6\n\n\t// TaprootBip32DerivationOutputType is a type that carries the x-only\n\t// pubkey along with the key ({0x07}|{xonlypubkey}).\n\t//\n\t// The value is a compact integer denoting the number of hashes,\n\t// followed by said number of 32-byte leaf hashes. The rest of the value\n\t// is then identical to the Bip32DerivationInputType value.\n\tTaprootBip32DerivationOutputType OutputType = 7\n)\n"
  },
  {
    "path": "btcutil/psbt/updater.go",
    "content": "// Copyright (c) 2018 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage psbt\n\n// The Updater requires provision of a single PSBT and is able to add data to\n// both input and output sections.  It can be called repeatedly to add more\n// data.  It also allows addition of signatures via the addPartialSignature\n// function; this is called internally to the package in the Sign() function of\n// Updater, located in signer.go\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha256\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// Updater encapsulates the role 'Updater' as specified in BIP174; it accepts\n// Psbt structs and has methods to add fields to the inputs and outputs.\ntype Updater struct {\n\tUpsbt *Packet\n}\n\n// NewUpdater returns a new instance of Updater, if the passed Psbt struct is\n// in a valid form, else an error.\nfunc NewUpdater(p *Packet) (*Updater, error) {\n\tif err := p.SanityCheck(); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &Updater{Upsbt: p}, nil\n\n}\n\n// AddInNonWitnessUtxo adds the utxo information for an input which is\n// non-witness. This requires provision of a full transaction (which is the\n// source of the corresponding prevOut), and the input index. If addition of\n// this key-value pair to the Psbt fails, an error is returned.\nfunc (u *Updater) AddInNonWitnessUtxo(tx *wire.MsgTx, inIndex int) error {\n\tif inIndex > len(u.Upsbt.Inputs)-1 {\n\t\treturn ErrInvalidPrevOutNonWitnessTransaction\n\t}\n\n\tu.Upsbt.Inputs[inIndex].NonWitnessUtxo = tx\n\n\tif err := u.Upsbt.SanityCheck(); err != nil {\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\n\treturn nil\n}\n\n// AddInWitnessUtxo adds the utxo information for an input which is witness.\n// This requires provision of a full transaction *output* (which is the source\n// of the corresponding prevOut); not the full transaction because BIP143 means\n// the output information is sufficient, and the input index. If addition of\n// this key-value pair to the Psbt fails, an error is returned.\nfunc (u *Updater) AddInWitnessUtxo(txout *wire.TxOut, inIndex int) error {\n\tif inIndex > len(u.Upsbt.Inputs)-1 {\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\n\tu.Upsbt.Inputs[inIndex].WitnessUtxo = txout\n\n\tif err := u.Upsbt.SanityCheck(); err != nil {\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\n\treturn nil\n}\n\n// addPartialSignature allows the Updater role to insert fields of type partial\n// signature into a Psbt, consisting of both the pubkey (as keydata) and the\n// ECDSA signature (as value).  Note that the Signer role is encapsulated in\n// this function; signatures are only allowed to be added that follow the\n// sanity-check on signing rules explained in the BIP under `Signer`; if the\n// rules are not satisfied, an ErrInvalidSignatureForInput is returned.\n//\n// NOTE: This function does *not* validate the ECDSA signature itself.\nfunc (u *Updater) addPartialSignature(inIndex int, sig []byte,\n\tpubkey []byte) error {\n\n\tpartialSig := PartialSig{\n\t\tPubKey: pubkey, Signature: sig,\n\t}\n\n\t// First validate the passed (sig, pub).\n\tif !partialSig.checkValid() {\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\n\tpInput := u.Upsbt.Inputs[inIndex]\n\n\t// First check; don't add duplicates.\n\tfor _, x := range pInput.PartialSigs {\n\t\tif bytes.Equal(x.PubKey, partialSig.PubKey) {\n\t\t\treturn ErrDuplicateKey\n\t\t}\n\t}\n\n\t// Attaching signature without utxo field is not allowed.\n\tif pInput.WitnessUtxo == nil && pInput.NonWitnessUtxo == nil {\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\n\t// Next, we perform a series of additional sanity checks.\n\tif pInput.NonWitnessUtxo != nil {\n\t\tif len(u.Upsbt.UnsignedTx.TxIn) < inIndex+1 {\n\t\t\treturn ErrInvalidPrevOutNonWitnessTransaction\n\t\t}\n\n\t\tif pInput.NonWitnessUtxo.TxHash() !=\n\t\t\tu.Upsbt.UnsignedTx.TxIn[inIndex].PreviousOutPoint.Hash {\n\t\t\treturn ErrInvalidSignatureForInput\n\t\t}\n\n\t\t// To validate that the redeem script matches, we must pull out\n\t\t// the scriptPubKey of the corresponding output and compare\n\t\t// that with the P2SH scriptPubKey that is generated by\n\t\t// redeemScript.\n\t\tif pInput.RedeemScript != nil {\n\t\t\toutIndex := u.Upsbt.UnsignedTx.TxIn[inIndex].PreviousOutPoint.Index\n\t\t\tscriptPubKey := pInput.NonWitnessUtxo.TxOut[outIndex].PkScript\n\t\t\tscriptHash := btcutil.Hash160(pInput.RedeemScript)\n\n\t\t\tscriptHashScript, err := txscript.NewScriptBuilder().\n\t\t\t\tAddOp(txscript.OP_HASH160).\n\t\t\t\tAddData(scriptHash).\n\t\t\t\tAddOp(txscript.OP_EQUAL).\n\t\t\t\tScript()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif !bytes.Equal(scriptHashScript, scriptPubKey) {\n\t\t\t\treturn ErrInvalidSignatureForInput\n\t\t\t}\n\t\t}\n\n\t}\n\n\t// It could be that we set both the non-witness and witness UTXO fields\n\t// in case it's from a wallet that patched the CVE-2020-14199\n\t// vulnerability. We detect whether the input being spent is actually a\n\t// witness input and then copy it over to the witness UTXO field in the\n\t// signer. Run the witness checks as well, even if we might already have\n\t// checked the script hash. But that should be a negligible performance\n\t// penalty.\n\tif pInput.WitnessUtxo != nil {\n\t\tscriptPubKey := pInput.WitnessUtxo.PkScript\n\n\t\tvar script []byte\n\t\tif pInput.RedeemScript != nil {\n\t\t\tscriptHash := btcutil.Hash160(pInput.RedeemScript)\n\t\t\tscriptHashScript, err := txscript.NewScriptBuilder().\n\t\t\t\tAddOp(txscript.OP_HASH160).\n\t\t\t\tAddData(scriptHash).\n\t\t\t\tAddOp(txscript.OP_EQUAL).\n\t\t\t\tScript()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif !bytes.Equal(scriptHashScript, scriptPubKey) {\n\t\t\t\treturn ErrInvalidSignatureForInput\n\t\t\t}\n\n\t\t\tscript = pInput.RedeemScript\n\t\t} else {\n\t\t\tscript = scriptPubKey\n\t\t}\n\n\t\t// If a witnessScript field is present, this is a P2WSH,\n\t\t// whether nested or not (that is handled by the assignment to\n\t\t// `script` above); in that case, sanity check that `script` is\n\t\t// the p2wsh of witnessScript. Contrariwise, if no\n\t\t// witnessScript field is present, this will be signed as\n\t\t// p2wkh.\n\t\tif pInput.WitnessScript != nil {\n\t\t\twitnessScriptHash := sha256.Sum256(pInput.WitnessScript)\n\t\t\twitnessScriptHashScript, err := txscript.NewScriptBuilder().\n\t\t\t\tAddOp(txscript.OP_0).\n\t\t\t\tAddData(witnessScriptHash[:]).\n\t\t\t\tScript()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif !bytes.Equal(script, witnessScriptHashScript[:]) {\n\t\t\t\treturn ErrInvalidSignatureForInput\n\t\t\t}\n\t\t} else {\n\t\t\t// Otherwise, this is a p2wkh input.\n\t\t\tpubkeyHash := btcutil.Hash160(pubkey)\n\t\t\tpubkeyHashScript, err := txscript.NewScriptBuilder().\n\t\t\t\tAddOp(txscript.OP_0).\n\t\t\t\tAddData(pubkeyHash).\n\t\t\t\tScript()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Validate that we're able to properly reconstruct the\n\t\t\t// witness program.\n\t\t\tif !bytes.Equal(pubkeyHashScript, script) {\n\t\t\t\treturn ErrInvalidSignatureForInput\n\t\t\t}\n\t\t}\n\t}\n\n\tu.Upsbt.Inputs[inIndex].PartialSigs = append(\n\t\tu.Upsbt.Inputs[inIndex].PartialSigs, &partialSig,\n\t)\n\n\tif err := u.Upsbt.SanityCheck(); err != nil {\n\t\treturn err\n\t}\n\n\t// Addition of a non-duplicate-key partial signature cannot violate\n\t// sanity-check rules.\n\treturn nil\n}\n\n// AddInSighashType adds the sighash type information for an input.  The\n// sighash type is passed as a 32 bit unsigned integer, along with the index\n// for the input. An error is returned if addition of this key-value pair to\n// the Psbt fails.\nfunc (u *Updater) AddInSighashType(sighashType txscript.SigHashType,\n\tinIndex int) error {\n\n\tu.Upsbt.Inputs[inIndex].SighashType = sighashType\n\n\tif err := u.Upsbt.SanityCheck(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// AddInRedeemScript adds the redeem script information for an input.  The\n// redeem script is passed serialized, as a byte slice, along with the index of\n// the input. An error is returned if addition of this key-value pair to the\n// Psbt fails.\nfunc (u *Updater) AddInRedeemScript(redeemScript []byte,\n\tinIndex int) error {\n\n\tu.Upsbt.Inputs[inIndex].RedeemScript = redeemScript\n\n\tif err := u.Upsbt.SanityCheck(); err != nil {\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\n\treturn nil\n}\n\n// AddInWitnessScript adds the witness script information for an input.  The\n// witness script is passed serialized, as a byte slice, along with the index\n// of the input. An error is returned if addition of this key-value pair to the\n// Psbt fails.\nfunc (u *Updater) AddInWitnessScript(witnessScript []byte,\n\tinIndex int) error {\n\n\tu.Upsbt.Inputs[inIndex].WitnessScript = witnessScript\n\n\tif err := u.Upsbt.SanityCheck(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// AddInBip32Derivation takes a master key fingerprint as defined in BIP32, a\n// BIP32 path as a slice of uint32 values, and a serialized pubkey as a byte\n// slice, along with the integer index of the input, and inserts this data into\n// that input.\n//\n// NOTE: This can be called multiple times for the same input.  An error is\n// returned if addition of this key-value pair to the Psbt fails.\nfunc (u *Updater) AddInBip32Derivation(masterKeyFingerprint uint32,\n\tbip32Path []uint32, pubKeyData []byte, inIndex int) error {\n\n\tbip32Derivation := Bip32Derivation{\n\t\tPubKey:               pubKeyData,\n\t\tMasterKeyFingerprint: masterKeyFingerprint,\n\t\tBip32Path:            bip32Path,\n\t}\n\n\tif !bip32Derivation.checkValid() {\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\n\t// Don't allow duplicate keys\n\tfor _, x := range u.Upsbt.Inputs[inIndex].Bip32Derivation {\n\t\tif bytes.Equal(x.PubKey, bip32Derivation.PubKey) {\n\t\t\treturn ErrDuplicateKey\n\t\t}\n\t}\n\n\tu.Upsbt.Inputs[inIndex].Bip32Derivation = append(\n\t\tu.Upsbt.Inputs[inIndex].Bip32Derivation, &bip32Derivation,\n\t)\n\n\tif err := u.Upsbt.SanityCheck(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// AddOutBip32Derivation takes a master key fingerprint as defined in BIP32, a\n// BIP32 path as a slice of uint32 values, and a serialized pubkey as a byte\n// slice, along with the integer index of the output, and inserts this data\n// into that output.\n//\n// NOTE: That this can be called multiple times for the same output.  An error\n// is returned if addition of this key-value pair to the Psbt fails.\nfunc (u *Updater) AddOutBip32Derivation(masterKeyFingerprint uint32,\n\tbip32Path []uint32, pubKeyData []byte, outIndex int) error {\n\n\tbip32Derivation := Bip32Derivation{\n\t\tPubKey:               pubKeyData,\n\t\tMasterKeyFingerprint: masterKeyFingerprint,\n\t\tBip32Path:            bip32Path,\n\t}\n\n\tif !bip32Derivation.checkValid() {\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\n\t// Don't allow duplicate keys\n\tfor _, x := range u.Upsbt.Outputs[outIndex].Bip32Derivation {\n\t\tif bytes.Equal(x.PubKey, bip32Derivation.PubKey) {\n\t\t\treturn ErrDuplicateKey\n\t\t}\n\t}\n\n\tu.Upsbt.Outputs[outIndex].Bip32Derivation = append(\n\t\tu.Upsbt.Outputs[outIndex].Bip32Derivation, &bip32Derivation,\n\t)\n\n\tif err := u.Upsbt.SanityCheck(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// AddOutRedeemScript takes a redeem script as a byte slice and appends it to\n// the output at index outIndex.\nfunc (u *Updater) AddOutRedeemScript(redeemScript []byte,\n\toutIndex int) error {\n\n\tu.Upsbt.Outputs[outIndex].RedeemScript = redeemScript\n\n\tif err := u.Upsbt.SanityCheck(); err != nil {\n\t\treturn ErrInvalidPsbtFormat\n\t}\n\n\treturn nil\n}\n\n// AddOutWitnessScript takes a witness script as a byte slice and appends it to\n// the output at index outIndex.\nfunc (u *Updater) AddOutWitnessScript(witnessScript []byte,\n\toutIndex int) error {\n\n\tu.Upsbt.Outputs[outIndex].WitnessScript = witnessScript\n\n\tif err := u.Upsbt.SanityCheck(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "btcutil/psbt/utils.go",
    "content": "// Copyright (c) 2018 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage psbt\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"sort\"\n\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// WriteTxWitness is a utility function due to non-exported witness\n// serialization (writeTxWitness encodes the bitcoin protocol encoding for a\n// transaction input's witness into w).\nfunc WriteTxWitness(w io.Writer, wit [][]byte) error {\n\tif err := wire.WriteVarInt(w, 0, uint64(len(wit))); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, item := range wit {\n\t\terr := wire.WriteVarBytes(w, 0, item)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// writePKHWitness writes a witness for a p2wkh spending input\nfunc writePKHWitness(sig []byte, pub []byte) ([]byte, error) {\n\treturn writeWitness(sig, pub)\n}\n\n// writeWitness serializes a witness stack from the given items.\nfunc writeWitness(stackElements ...[]byte) ([]byte, error) {\n\tvar (\n\t\tbuf          bytes.Buffer\n\t\twitnessItems = append([][]byte{}, stackElements...)\n\t)\n\n\tif err := WriteTxWitness(&buf, witnessItems); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buf.Bytes(), nil\n}\n\n// checkIsMultisigScript is a utility function to check whether a given\n// redeemscript fits the standard multisig template used in all P2SH based\n// multisig, given a set of pubkeys for redemption.\nfunc checkIsMultiSigScript(pubKeys [][]byte, sigs [][]byte,\n\tscript []byte) bool {\n\n\t// First insist that the script type is multisig.\n\tif txscript.GetScriptClass(script) != txscript.MultiSigTy {\n\t\treturn false\n\t}\n\n\t// Inspect the script to ensure that the number of sigs and pubkeys is\n\t// correct\n\t_, numSigs, err := txscript.CalcMultiSigStats(script)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\t// If the number of sigs provided, doesn't match the number of required\n\t// pubkeys, then we can't proceed as we're not yet final.\n\tif numSigs != len(pubKeys) || numSigs != len(sigs) {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// extractKeyOrderFromScript is a utility function to extract an ordered list\n// of signatures, given a serialized script (redeemscript or witness script), a\n// list of pubkeys and the signatures corresponding to those pubkeys. This\n// function is used to ensure that the signatures will be embedded in the final\n// scriptSig or scriptWitness in the correct order.\nfunc extractKeyOrderFromScript(script []byte, expectedPubkeys [][]byte,\n\tsigs [][]byte) ([][]byte, error) {\n\n\t// If this isn't a proper finalized multi-sig script, then we can't\n\t// proceed.\n\tif !checkIsMultiSigScript(expectedPubkeys, sigs, script) {\n\t\treturn nil, ErrUnsupportedScriptType\n\t}\n\n\t// Arrange the pubkeys and sigs into a slice of format:\n\t//   * [[pub,sig], [pub,sig],..]\n\ttype sigWithPub struct {\n\t\tpubKey []byte\n\t\tsig    []byte\n\t}\n\tvar pubsSigs []sigWithPub\n\tfor i, pub := range expectedPubkeys {\n\t\tpubsSigs = append(pubsSigs, sigWithPub{\n\t\t\tpubKey: pub,\n\t\t\tsig:    sigs[i],\n\t\t})\n\t}\n\n\t// Now that we have the set of (pubkey, sig) pairs, we'll construct a\n\t// position map that we can use to swap the order in the slice above to\n\t// match how things are laid out in the script.\n\ttype positionEntry struct {\n\t\tindex int\n\t\tvalue sigWithPub\n\t}\n\tvar positionMap []positionEntry\n\n\t// For each pubkey in our pubsSigs slice, we'll now construct a proper\n\t// positionMap entry, based on _where_ in the script the pubkey first\n\t// appears.\n\tfor _, p := range pubsSigs {\n\t\tpos := bytes.Index(script, p.pubKey)\n\t\tif pos < 0 {\n\t\t\treturn nil, errors.New(\"script does not contain pubkeys\")\n\t\t}\n\n\t\tpositionMap = append(positionMap, positionEntry{\n\t\t\tindex: pos,\n\t\t\tvalue: p,\n\t\t})\n\t}\n\n\t// Now that we have the position map full populated, we'll use the\n\t// index data to properly sort the entries in the map based on where\n\t// they appear in the script.\n\tsort.Slice(positionMap, func(i, j int) bool {\n\t\treturn positionMap[i].index < positionMap[j].index\n\t})\n\n\t// Finally, we can simply iterate through the position map in order to\n\t// extract the proper signature ordering.\n\tsortedSigs := make([][]byte, 0, len(positionMap))\n\tfor _, x := range positionMap {\n\t\tsortedSigs = append(sortedSigs, x.value.sig)\n\t}\n\n\treturn sortedSigs, nil\n}\n\n// getMultisigScriptWitness creates a full psbt serialized Witness field for\n// the transaction, given the public keys and signatures to be appended. This\n// function will only accept witnessScripts of the type M of N multisig. This\n// is used for both p2wsh and nested p2wsh multisig cases.\nfunc getMultisigScriptWitness(witnessScript []byte, pubKeys [][]byte,\n\tsigs [][]byte) ([]byte, error) {\n\n\t// First using the script as a guide, we'll properly order the sigs\n\t// according to how their corresponding pubkeys appear in the\n\t// witnessScript.\n\torderedSigs, err := extractKeyOrderFromScript(\n\t\twitnessScript, pubKeys, sigs,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Now that we know the proper order, we'll append each of the\n\t// signatures into a new witness stack, then top it off with the\n\t// witness script at the end, prepending the nil as we need the extra\n\t// pop..\n\twitnessElements := make(wire.TxWitness, 0, len(sigs)+2)\n\twitnessElements = append(witnessElements, nil)\n\tfor _, os := range orderedSigs {\n\t\twitnessElements = append(witnessElements, os)\n\t}\n\twitnessElements = append(witnessElements, witnessScript)\n\n\t// Now that we have the full witness stack, we'll serialize it in the\n\t// expected format, and return the final bytes.\n\tvar buf bytes.Buffer\n\tif err = WriteTxWitness(&buf, witnessElements); err != nil {\n\t\treturn nil, err\n\t}\n\treturn buf.Bytes(), nil\n}\n\n// checkSigHashFlags compares the sighash flag byte on a signature with the\n// value expected according to any PsbtInSighashType field in this section of\n// the PSBT, and returns true if they match, false otherwise.\n// If no SighashType field exists, it is assumed to be SIGHASH_ALL.\n//\n// TODO(waxwing): sighash type not restricted to one byte in future?\nfunc checkSigHashFlags(sig []byte, input *PInput) bool {\n\texpectedSighashType := txscript.SigHashAll\n\tif input.SighashType != 0 {\n\t\texpectedSighashType = input.SighashType\n\t}\n\n\treturn expectedSighashType == txscript.SigHashType(sig[len(sig)-1])\n}\n\n// serializeKVpair writes out a kv pair using a varbyte prefix for each.\nfunc serializeKVpair(w io.Writer, key []byte, value []byte) error {\n\tif err := wire.WriteVarBytes(w, 0, key); err != nil {\n\t\treturn err\n\t}\n\n\treturn wire.WriteVarBytes(w, 0, value)\n}\n\n// serializeKVPairWithType writes out to the passed writer a type coupled with\n// a key.\nfunc serializeKVPairWithType(w io.Writer, kt uint8, keydata []byte,\n\tvalue []byte) error {\n\n\t// If the key has no data, then we write a blank slice.\n\tif keydata == nil {\n\t\tkeydata = []byte{}\n\t}\n\n\t// The final key to be written is: {type} || {keyData}\n\tserializedKey := append([]byte{kt}, keydata...)\n\treturn serializeKVpair(w, serializedKey, value)\n}\n\n// getKey retrieves a single key - both the key type and the keydata (if\n// present) from the stream and returns the key type as an integer, or -1 if\n// the key was of zero length. This integer is used to indicate the presence\n// of a separator byte which indicates the end of a given key-value pair list,\n// and the keydata as a byte slice or nil if none is present.\nfunc getKey(r io.Reader) (int, []byte, error) {\n\n\t// For the key, we read the varint separately, instead of using the\n\t// available ReadVarBytes, because we have a specific treatment of 0x00\n\t// here:\n\tcount, err := wire.ReadVarInt(r, 0)\n\tif err != nil {\n\t\treturn -1, nil, ErrInvalidPsbtFormat\n\t}\n\tif count == 0 {\n\t\t// A separator indicates end of key-value pair list.\n\t\treturn -1, nil, nil\n\t}\n\n\t// Check that we don't attempt to decode a dangerously large key.\n\tif count > MaxPsbtKeyLength {\n\t\treturn -1, nil, ErrInvalidKeyData\n\t}\n\n\t// Next, we ready out the designated number of bytes, which may include\n\t// a type, key, and optional data.\n\tkeyTypeReader := io.LimitReader(r, int64(count))\n\tkeyType, err := wire.ReadVarInt(keyTypeReader, 0)\n\tif err != nil {\n\t\treturn -1, nil, ErrInvalidPsbtFormat\n\t}\n\n\t// The maximum value of a compact size int is capped in bitcoind, do the\n\t// same here to mimic the behavior.\n\tif keyType > MaxPsbtKeyValue {\n\t\treturn -1, nil, ErrInvalidPsbtFormat\n\t}\n\n\tkeyData, err := io.ReadAll(keyTypeReader)\n\tif err != nil {\n\t\treturn -1, nil, ErrInvalidPsbtFormat\n\t}\n\n\t// Note that the second return value will usually be empty, since most\n\t// keys contain no more than the key type byte.\n\tif len(keyData) == 0 {\n\t\treturn int(keyType), nil, nil\n\t}\n\n\t// Otherwise, we return the key, along with any data that it may\n\t// contain.\n\treturn int(keyType), keyData, nil\n}\n\n// readTxOut is a limited version of wire.ReadTxOut, because the latter is not\n// exported.\nfunc readTxOut(txout []byte) (*wire.TxOut, error) {\n\tif len(txout) < 10 {\n\t\treturn nil, ErrInvalidPsbtFormat\n\t}\n\n\tvalueSer := binary.LittleEndian.Uint64(txout[:8])\n\tscriptPubKey := txout[9:]\n\n\treturn wire.NewTxOut(int64(valueSer), scriptPubKey), nil\n}\n\n// SumUtxoInputValues tries to extract the sum of all inputs specified in the\n// UTXO fields of the PSBT. An error is returned if an input is specified that\n// does not contain any UTXO information.\nfunc SumUtxoInputValues(packet *Packet) (int64, error) {\n\t// We take the TX ins of the unsigned TX as the truth for how many\n\t// inputs there should be, as the fields in the extra data part of the\n\t// PSBT can be empty.\n\tif len(packet.UnsignedTx.TxIn) != len(packet.Inputs) {\n\t\treturn 0, fmt.Errorf(\"TX input length doesn't match PSBT \" +\n\t\t\t\"input length\")\n\t}\n\n\tinputSum := int64(0)\n\tfor idx, in := range packet.Inputs {\n\t\tswitch {\n\t\tcase in.WitnessUtxo != nil:\n\t\t\t// Witness UTXOs only need to reference the TxOut.\n\t\t\tinputSum += in.WitnessUtxo.Value\n\n\t\tcase in.NonWitnessUtxo != nil:\n\t\t\t// Non-witness UTXOs reference to the whole transaction\n\t\t\t// the UTXO resides in.\n\t\t\tutxOuts := in.NonWitnessUtxo.TxOut\n\t\t\ttxIn := packet.UnsignedTx.TxIn[idx]\n\n\t\t\t// Check that utxOuts actually has enough space to\n\t\t\t// contain the previous outpoint's index.\n\t\t\topIdx := txIn.PreviousOutPoint.Index\n\t\t\tif opIdx >= uint32(len(utxOuts)) {\n\t\t\t\treturn 0, fmt.Errorf(\"input %d has malformed \"+\n\t\t\t\t\t\"TxOut field\", idx)\n\t\t\t}\n\n\t\t\tinputSum += utxOuts[txIn.PreviousOutPoint.Index].Value\n\n\t\tdefault:\n\t\t\treturn 0, fmt.Errorf(\"input %d has no UTXO information\",\n\t\t\t\tidx)\n\t\t}\n\t}\n\treturn inputSum, nil\n}\n\n// TxOutsEqual returns true if two transaction outputs are equal.\nfunc TxOutsEqual(out1, out2 *wire.TxOut) bool {\n\tif out1 == nil || out2 == nil {\n\t\treturn out1 == out2\n\t}\n\treturn out1.Value == out2.Value &&\n\t\tbytes.Equal(out1.PkScript, out2.PkScript)\n}\n\n// VerifyOutputsEqual verifies that the two slices of transaction outputs are\n// deep equal to each other. We do the length check and manual loop to provide\n// better error messages to the user than just returning \"not equal\".\nfunc VerifyOutputsEqual(outs1, outs2 []*wire.TxOut) error {\n\tif len(outs1) != len(outs2) {\n\t\treturn fmt.Errorf(\"number of outputs are different\")\n\t}\n\tfor idx, out := range outs1 {\n\t\t// There is a byte slice in the output so we can't use the\n\t\t// equality operator.\n\t\tif !TxOutsEqual(out, outs2[idx]) {\n\t\t\treturn fmt.Errorf(\"output %d is different\", idx)\n\t\t}\n\t}\n\treturn nil\n}\n\n// VerifyInputPrevOutpointsEqual verifies that the previous outpoints of the\n// two slices of transaction inputs are deep equal to each other. We do the\n// length check and manual loop to provide better error messages to the user\n// than just returning \"not equal\".\nfunc VerifyInputPrevOutpointsEqual(ins1, ins2 []*wire.TxIn) error {\n\tif len(ins1) != len(ins2) {\n\t\treturn fmt.Errorf(\"number of inputs are different\")\n\t}\n\tfor idx, in := range ins1 {\n\t\tif in.PreviousOutPoint != ins2[idx].PreviousOutPoint {\n\t\t\treturn fmt.Errorf(\"previous outpoint of input %d is \"+\n\t\t\t\t\"different\", idx)\n\t\t}\n\t}\n\treturn nil\n}\n\n// VerifyInputOutputLen makes sure a packet is non-nil, contains a non-nil wire\n// transaction and that the wire input/output lengths match the partial input/\n// output lengths. A caller also can specify if they expect any inputs and/or\n// outputs to be contained in the packet.\nfunc VerifyInputOutputLen(packet *Packet, needInputs, needOutputs bool) error {\n\tif packet == nil || packet.UnsignedTx == nil {\n\t\treturn fmt.Errorf(\"PSBT packet cannot be nil\")\n\t}\n\n\tif len(packet.UnsignedTx.TxIn) != len(packet.Inputs) {\n\t\treturn fmt.Errorf(\"invalid PSBT, wire inputs don't match \" +\n\t\t\t\"partial inputs\")\n\t}\n\tif len(packet.UnsignedTx.TxOut) != len(packet.Outputs) {\n\t\treturn fmt.Errorf(\"invalid PSBT, wire outputs don't match \" +\n\t\t\t\"partial outputs\")\n\t}\n\n\tif needInputs && len(packet.UnsignedTx.TxIn) == 0 {\n\t\treturn fmt.Errorf(\"PSBT packet must contain at least one \" +\n\t\t\t\"input\")\n\t}\n\tif needOutputs && len(packet.UnsignedTx.TxOut) == 0 {\n\t\treturn fmt.Errorf(\"PSBT packet must contain at least one \" +\n\t\t\t\"output\")\n\t}\n\n\treturn nil\n}\n\n// InputsReadyToSign makes sure that all input data have the previous output\n// specified meaning that either nonwitness UTXO or the witness UTXO data is\n// specified in the psbt package. This check is necessary because of 2 reasons.\n// The sighash calculation is now different for witnessV0 and witnessV1 inputs\n// this means we need to check the previous output pkScript for the specific\n// type and the second reason is that the sighash calculation for taproot inputs\n// include the previous output pkscripts.\nfunc InputsReadyToSign(packet *Packet) error {\n\terr := VerifyInputOutputLen(packet, true, true)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor i := range packet.UnsignedTx.TxIn {\n\t\tinput := packet.Inputs[i]\n\t\tif input.NonWitnessUtxo == nil && input.WitnessUtxo == nil {\n\t\t\treturn fmt.Errorf(\"invalid PSBT, input with index %d \"+\n\t\t\t\t\"missing utxo information\", i)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// NewFromSignedTx is a utility function to create a packet from an\n// already-signed transaction. Returned are: an unsigned transaction\n// serialization, a list of scriptSigs, one per input, and a list of witnesses,\n// one per input.\nfunc NewFromSignedTx(tx *wire.MsgTx) (*Packet, [][]byte,\n\t[]wire.TxWitness, error) {\n\n\tscriptSigs := make([][]byte, 0, len(tx.TxIn))\n\twitnesses := make([]wire.TxWitness, 0, len(tx.TxIn))\n\ttx2 := tx.Copy()\n\n\t// Blank out signature info in inputs\n\tfor i, tin := range tx2.TxIn {\n\t\ttin.SignatureScript = nil\n\t\tscriptSigs = append(scriptSigs, tx.TxIn[i].SignatureScript)\n\t\ttin.Witness = nil\n\t\twitnesses = append(witnesses, tx.TxIn[i].Witness)\n\t}\n\n\t// Outputs always contain: (value, scriptPubkey) so don't need\n\t// amending.  Now tx2 is tx with all signing data stripped out\n\tunsignedPsbt, err := NewFromUnsignedTx(tx2)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\treturn unsignedPsbt, scriptSigs, witnesses, nil\n}\n\n// FindLeafScript attempts to locate the leaf script of a given target Tap Leaf\n// hash in the list of leaf scripts of the given input.\nfunc FindLeafScript(pInput *PInput,\n\ttargetLeafHash []byte) (*TaprootTapLeafScript, error) {\n\n\tfor _, leaf := range pInput.TaprootLeafScript {\n\t\tleafHash := txscript.TapLeaf{\n\t\t\tLeafVersion: leaf.LeafVersion,\n\t\t\tScript:      leaf.Script,\n\t\t}.TapHash()\n\n\t\tif bytes.Equal(targetLeafHash, leafHash[:]) {\n\t\t\treturn leaf, nil\n\t\t}\n\t}\n\n\treturn nil, fmt.Errorf(\"leaf script for target leaf hash %x not \"+\n\t\t\"found in input\", targetLeafHash)\n}\n"
  },
  {
    "path": "btcutil/psbt/utils_test.go",
    "content": "package psbt\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nfunc TestSumUtxoInputValues(t *testing.T) {\n\t// Expect sum to fail for packet with non-matching txIn and PInputs.\n\ttx := wire.NewMsgTx(2)\n\tbadPacket, err := NewFromUnsignedTx(tx)\n\tif err != nil {\n\t\tt.Fatalf(\"could not create packet from TX: %v\", err)\n\t}\n\tbadPacket.Inputs = append(badPacket.Inputs, PInput{})\n\n\t_, err = SumUtxoInputValues(badPacket)\n\tif err == nil {\n\t\tt.Fatalf(\"expected sum of bad packet to fail\")\n\t}\n\n\t// Expect sum to fail if any inputs don't have UTXO information added.\n\top := []*wire.OutPoint{{}, {}}\n\tnoUtxoInfoPacket, err := New(op, nil, 2, 0, []uint32{0, 0})\n\tif err != nil {\n\t\tt.Fatalf(\"could not create new packet: %v\", err)\n\t}\n\n\t_, err = SumUtxoInputValues(noUtxoInfoPacket)\n\tif err == nil {\n\t\tt.Fatalf(\"expected sum of missing UTXO info to fail\")\n\t}\n\n\t// Create a packet that is OK and contains both witness and non-witness\n\t// UTXO information.\n\tokPacket, err := New(op, nil, 2, 0, []uint32{0, 0})\n\tif err != nil {\n\t\tt.Fatalf(\"could not create new packet: %v\", err)\n\t}\n\tokPacket.Inputs[0].WitnessUtxo = &wire.TxOut{Value: 1234}\n\tokPacket.Inputs[1].NonWitnessUtxo = &wire.MsgTx{\n\t\tTxOut: []*wire.TxOut{{Value: 6543}},\n\t}\n\n\tsum, err := SumUtxoInputValues(okPacket)\n\tif err != nil {\n\t\tt.Fatalf(\"could not sum input: %v\", err)\n\t}\n\tif sum != (1234 + 6543) {\n\t\tt.Fatalf(\"unexpected sum, got %d wanted %d\", sum, 1234+6543)\n\t}\n\n\t// Create a malformed packet where NonWitnessUtxo.TxOut does not\n\t// contain the index specified by the PreviousOutPoint in the\n\t// packet's Unsigned.TxIn field.\n\tbadOp := []*wire.OutPoint{{}, {Index: 500}}\n\tmalformedPacket, err := New(badOp, nil, 2, 0, []uint32{0, 0})\n\tif err != nil {\n\t\tt.Fatalf(\"could not create malformed packet: %v\", err)\n\t}\n\tmalformedPacket.Inputs[0].WitnessUtxo = &wire.TxOut{Value: 1234}\n\tmalformedPacket.Inputs[1].NonWitnessUtxo = &wire.MsgTx{\n\t\tTxOut: []*wire.TxOut{{Value: 6543}},\n\t}\n\n\t_, err = SumUtxoInputValues(malformedPacket)\n\tif err == nil {\n\t\tt.Fatalf(\"expected sum of malformed packet to fail\")\n\t}\n}\n\nfunc TestTxOutsEqual(t *testing.T) {\n\ttestCases := []struct {\n\t\tname        string\n\t\tout1        *wire.TxOut\n\t\tout2        *wire.TxOut\n\t\texpectEqual bool\n\t}{{\n\t\tname:        \"both nil\",\n\t\tout1:        nil,\n\t\tout2:        nil,\n\t\texpectEqual: true,\n\t}, {\n\t\tname:        \"one nil\",\n\t\tout1:        nil,\n\t\tout2:        &wire.TxOut{},\n\t\texpectEqual: false,\n\t}, {\n\t\tname:        \"both empty\",\n\t\tout1:        &wire.TxOut{},\n\t\tout2:        &wire.TxOut{},\n\t\texpectEqual: true,\n\t}, {\n\t\tname: \"one pk script set\",\n\t\tout1: &wire.TxOut{},\n\t\tout2: &wire.TxOut{\n\t\t\tPkScript: []byte(\"foo\"),\n\t\t},\n\t\texpectEqual: false,\n\t}, {\n\t\tname: \"both fully set\",\n\t\tout1: &wire.TxOut{\n\t\t\tValue:    1234,\n\t\t\tPkScript: []byte(\"bar\"),\n\t\t},\n\t\tout2: &wire.TxOut{\n\t\t\tValue:    1234,\n\t\t\tPkScript: []byte(\"bar\"),\n\t\t},\n\t\texpectEqual: true,\n\t}}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tresult := TxOutsEqual(tc.out1, tc.out2)\n\t\t\tif result != tc.expectEqual {\n\t\t\t\tt.Fatalf(\"unexpected result, got %v wanted %v\",\n\t\t\t\t\tresult, tc.expectEqual)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestVerifyOutputsEqual(t *testing.T) {\n\ttestCases := []struct {\n\t\tname      string\n\t\touts1     []*wire.TxOut\n\t\touts2     []*wire.TxOut\n\t\texpectErr bool\n\t}{{\n\t\tname:      \"both nil\",\n\t\touts1:     nil,\n\t\touts2:     nil,\n\t\texpectErr: false,\n\t}, {\n\t\tname:      \"one nil\",\n\t\touts1:     nil,\n\t\touts2:     []*wire.TxOut{{}},\n\t\texpectErr: true,\n\t}, {\n\t\tname:      \"both empty\",\n\t\touts1:     []*wire.TxOut{{}},\n\t\touts2:     []*wire.TxOut{{}},\n\t\texpectErr: false,\n\t}, {\n\t\tname:  \"one pk script set\",\n\t\touts1: []*wire.TxOut{{}},\n\t\touts2: []*wire.TxOut{{\n\t\t\tPkScript: []byte(\"foo\"),\n\t\t}},\n\t\texpectErr: true,\n\t}, {\n\t\tname: \"both fully set\",\n\t\touts1: []*wire.TxOut{{\n\t\t\tValue:    1234,\n\t\t\tPkScript: []byte(\"bar\"),\n\t\t}, {}},\n\t\touts2: []*wire.TxOut{{\n\t\t\tValue:    1234,\n\t\t\tPkScript: []byte(\"bar\"),\n\t\t}, {}},\n\t\texpectErr: false,\n\t}}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\terr := VerifyOutputsEqual(tc.outs1, tc.outs2)\n\t\t\tif (tc.expectErr && err == nil) ||\n\t\t\t\t(!tc.expectErr && err != nil) {\n\n\t\t\t\tt.Fatalf(\"got error '%v' but wanted it to be \"+\n\t\t\t\t\t\"nil: %v\", err, tc.expectErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestVerifyInputPrevOutpointsEqual(t *testing.T) {\n\ttestCases := []struct {\n\t\tname      string\n\t\tins1      []*wire.TxIn\n\t\tins2      []*wire.TxIn\n\t\texpectErr bool\n\t}{{\n\t\tname:      \"both nil\",\n\t\tins1:      nil,\n\t\tins2:      nil,\n\t\texpectErr: false,\n\t}, {\n\t\tname:      \"one nil\",\n\t\tins1:      nil,\n\t\tins2:      []*wire.TxIn{{}},\n\t\texpectErr: true,\n\t}, {\n\t\tname:      \"both empty\",\n\t\tins1:      []*wire.TxIn{{}},\n\t\tins2:      []*wire.TxIn{{}},\n\t\texpectErr: false,\n\t}, {\n\t\tname: \"one previous output set\",\n\t\tins1: []*wire.TxIn{{}},\n\t\tins2: []*wire.TxIn{{\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash:  chainhash.Hash{11, 22, 33},\n\t\t\t\tIndex: 7,\n\t\t\t},\n\t\t}},\n\t\texpectErr: true,\n\t}, {\n\t\tname: \"both fully set\",\n\t\tins1: []*wire.TxIn{{\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash:  chainhash.Hash{11, 22, 33},\n\t\t\t\tIndex: 7,\n\t\t\t},\n\t\t}, {}},\n\t\tins2: []*wire.TxIn{{\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash:  chainhash.Hash{11, 22, 33},\n\t\t\t\tIndex: 7,\n\t\t\t},\n\t\t}, {}},\n\t\texpectErr: false,\n\t}}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\terr := VerifyInputPrevOutpointsEqual(tc.ins1, tc.ins2)\n\t\t\tif (tc.expectErr && err == nil) ||\n\t\t\t\t(!tc.expectErr && err != nil) {\n\n\t\t\t\tt.Fatalf(\"got error '%v' but wanted it to be \"+\n\t\t\t\t\t\"nil: %v\", err, tc.expectErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestVerifyInputOutputLen(t *testing.T) {\n\ttestCases := []struct {\n\t\tname        string\n\t\tpacket      *Packet\n\t\tneedInputs  bool\n\t\tneedOutputs bool\n\t\texpectErr   bool\n\t}{{\n\t\tname:      \"packet nil\",\n\t\tpacket:    nil,\n\t\texpectErr: true,\n\t}, {\n\t\tname:      \"wire tx nil\",\n\t\tpacket:    &Packet{},\n\t\texpectErr: true,\n\t}, {\n\t\tname: \"both empty don't need outputs\",\n\t\tpacket: &Packet{\n\t\t\tUnsignedTx: &wire.MsgTx{},\n\t\t},\n\t\texpectErr: false,\n\t}, {\n\t\tname: \"both empty but need outputs\",\n\t\tpacket: &Packet{\n\t\t\tUnsignedTx: &wire.MsgTx{},\n\t\t},\n\t\tneedOutputs: true,\n\t\texpectErr:   true,\n\t}, {\n\t\tname: \"both empty but need inputs\",\n\t\tpacket: &Packet{\n\t\t\tUnsignedTx: &wire.MsgTx{},\n\t\t},\n\t\tneedInputs: true,\n\t\texpectErr:  true,\n\t}, {\n\t\tname: \"input len mismatch\",\n\t\tpacket: &Packet{\n\t\t\tUnsignedTx: &wire.MsgTx{\n\t\t\t\tTxIn: []*wire.TxIn{{}},\n\t\t\t},\n\t\t},\n\t\tneedInputs: true,\n\t\texpectErr:  true,\n\t}, {\n\t\tname: \"output len mismatch\",\n\t\tpacket: &Packet{\n\t\t\tUnsignedTx: &wire.MsgTx{\n\t\t\t\tTxOut: []*wire.TxOut{{}},\n\t\t\t},\n\t\t},\n\t\tneedOutputs: true,\n\t\texpectErr:   true,\n\t}, {\n\t\tname: \"all fully set\",\n\t\tpacket: &Packet{\n\t\t\tUnsignedTx: &wire.MsgTx{\n\t\t\t\tTxIn:  []*wire.TxIn{{}},\n\t\t\t\tTxOut: []*wire.TxOut{{}},\n\t\t\t},\n\t\t\tInputs:  []PInput{{}},\n\t\t\tOutputs: []POutput{{}},\n\t\t},\n\t\tneedInputs:  true,\n\t\tneedOutputs: true,\n\t\texpectErr:   false,\n\t}}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\terr := VerifyInputOutputLen(\n\t\t\t\ttc.packet, tc.needInputs, tc.needOutputs,\n\t\t\t)\n\t\t\tif (tc.expectErr && err == nil) ||\n\t\t\t\t(!tc.expectErr && err != nil) {\n\n\t\t\t\tt.Fatalf(\"got error '%v' but wanted it to be \"+\n\t\t\t\t\t\"nil: %v\", err, tc.expectErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNewFromSignedTx(t *testing.T) {\n\torig := &wire.MsgTx{\n\t\tTxIn: []*wire.TxIn{{\n\t\t\tPreviousOutPoint: wire.OutPoint{},\n\t\t\tSignatureScript:  []byte(\"script\"),\n\t\t\tWitness:          [][]byte{[]byte(\"witness\")},\n\t\t\tSequence:         1234,\n\t\t}},\n\t\tTxOut: []*wire.TxOut{{\n\t\t\tPkScript: []byte{77, 88},\n\t\t\tValue:    99,\n\t\t}},\n\t}\n\n\tpacket, scripts, witnesses, err := NewFromSignedTx(orig)\n\tif err != nil {\n\t\tt.Fatalf(\"could not create packet from signed TX: %v\", err)\n\t}\n\n\ttx := packet.UnsignedTx\n\texpectedTxIn := []*wire.TxIn{{\n\t\tPreviousOutPoint: wire.OutPoint{},\n\t\tSequence:         1234,\n\t}}\n\tif !reflect.DeepEqual(tx.TxIn, expectedTxIn) {\n\t\tt.Fatalf(\"unexpected txin, got %#v wanted %#v\",\n\t\t\ttx.TxIn, expectedTxIn)\n\t}\n\tif !reflect.DeepEqual(tx.TxOut, orig.TxOut) {\n\t\tt.Fatalf(\"unexpected txout, got %#v wanted %#v\",\n\t\t\ttx.TxOut, orig.TxOut)\n\t}\n\tif len(scripts) != 1 || !bytes.Equal(scripts[0], []byte(\"script\")) {\n\t\tt.Fatalf(\"script not extracted correctly\")\n\t}\n\tif len(witnesses) != 1 ||\n\t\t!bytes.Equal(witnesses[0][0], []byte(\"witness\")) {\n\n\t\tt.Fatalf(\"witness not extracted correctly\")\n\t}\n}\n"
  },
  {
    "path": "btcutil/tx.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TxIndexUnknown is the value returned for a transaction index that is unknown.\n// This is typically because the transaction has not been inserted into a block\n// yet.\nconst TxIndexUnknown = -1\n\n// Tx defines a bitcoin transaction that provides easier and more efficient\n// manipulation of raw transactions.  It also memoizes the hash for the\n// transaction on its first access so subsequent accesses don't have to repeat\n// the relatively expensive hashing operations.\ntype Tx struct {\n\tmsgTx         *wire.MsgTx     // Underlying MsgTx\n\ttxHash        *chainhash.Hash // Cached transaction hash\n\ttxHashWitness *chainhash.Hash // Cached transaction witness hash\n\ttxHasWitness  *bool           // If the transaction has witness data\n\ttxIndex       int             // Position within a block or TxIndexUnknown\n\trawBytes      []byte          // Raw bytes for the tx in the raw block.\n}\n\n// MsgTx returns the underlying wire.MsgTx for the transaction.\nfunc (t *Tx) MsgTx() *wire.MsgTx {\n\t// Return the cached transaction.\n\treturn t.msgTx\n}\n\n// Hash returns the hash of the transaction.  This is equivalent to calling\n// TxHash on the underlying wire.MsgTx, however it caches the result so\n// subsequent calls are more efficient.  If the Tx has the raw bytes of the tx\n// cached, it will use that and skip serialization.\nfunc (t *Tx) Hash() *chainhash.Hash {\n\t// Return the cached hash if it has already been generated.\n\tif t.txHash != nil {\n\t\treturn t.txHash\n\t}\n\n\t// If the rawBytes aren't available, call msgtx.TxHash.\n\tif t.rawBytes == nil {\n\t\thash := t.msgTx.TxHash()\n\t\tt.txHash = &hash\n\t\treturn &hash\n\t}\n\n\t// If we have the raw bytes, then don't call msgTx.TxHash as that has\n\t// the overhead of serialization. Instead, we can take the existing\n\t// serialized bytes and hash them to speed things up.\n\tvar hash chainhash.Hash\n\tif t.HasWitness() {\n\t\t// If the raw bytes contain the witness, we must strip it out\n\t\t// before calculating the hash.\n\t\tbaseSize := t.msgTx.SerializeSizeStripped()\n\t\tnonWitnessBytes := make([]byte, 0, baseSize)\n\n\t\t// Append the version bytes.\n\t\toffset := 4\n\t\tnonWitnessBytes = append(\n\t\t\tnonWitnessBytes, t.rawBytes[:offset]...,\n\t\t)\n\n\t\t// Append the input and output bytes.  -8 to account for the\n\t\t// version bytes and the locktime bytes.\n\t\t//\n\t\t// Skip the 2 bytes for the witness encoding.\n\t\toffset += 2\n\t\tnonWitnessBytes = append(\n\t\t\tnonWitnessBytes,\n\t\t\tt.rawBytes[offset:offset+baseSize-8]...,\n\t\t)\n\n\t\t// Append the last 4 bytes which are the locktime bytes.\n\t\tnonWitnessBytes = append(\n\t\t\tnonWitnessBytes, t.rawBytes[len(t.rawBytes)-4:]...,\n\t\t)\n\n\t\t// We purposely call doublehashh here instead of doublehashraw\n\t\t// as we don't have the serialization overhead and avoiding the\n\t\t// 1 alloc is better in this case.\n\t\thash = chainhash.DoubleHashRaw(func(w io.Writer) error {\n\t\t\t_, err := w.Write(nonWitnessBytes)\n\t\t\treturn err\n\t\t})\n\t} else {\n\t\t// If the raw bytes don't have the witness, we can use it\n\t\t// directly.\n\t\t//\n\t\t// We purposely call doublehashh here instead of doublehashraw\n\t\t// as we don't have the serialization overhead and avoiding the\n\t\t// 1 alloc is better in this case.\n\t\thash = chainhash.DoubleHashRaw(func(w io.Writer) error {\n\t\t\t_, err := w.Write(t.rawBytes)\n\t\t\treturn err\n\t\t})\n\t}\n\n\tt.txHash = &hash\n\treturn &hash\n}\n\n// WitnessHash returns the witness hash (wtxid) of the transaction.  This is\n// equivalent to calling WitnessHash on the underlying wire.MsgTx, however it\n// caches the result so subsequent calls are more efficient.  If the Tx has the\n// raw bytes of the tx cached, it will use that and skip serialization.\nfunc (t *Tx) WitnessHash() *chainhash.Hash {\n\t// Return the cached hash if it has already been generated.\n\tif t.txHashWitness != nil {\n\t\treturn t.txHashWitness\n\t}\n\n\t// Cache the hash and return it.\n\tvar hash chainhash.Hash\n\tif len(t.rawBytes) > 0 {\n\t\thash = chainhash.DoubleHashH(t.rawBytes)\n\t} else {\n\t\thash = t.msgTx.WitnessHash()\n\t}\n\n\tt.txHashWitness = &hash\n\treturn &hash\n}\n\n// HasWitness returns false if none of the inputs within the transaction\n// contain witness data, true false otherwise. This equivalent to calling\n// HasWitness on the underlying wire.MsgTx, however it caches the result so\n// subsequent calls are more efficient.\nfunc (t *Tx) HasWitness() bool {\n\tif t.txHasWitness != nil {\n\t\treturn *t.txHasWitness\n\t}\n\n\thasWitness := t.msgTx.HasWitness()\n\tt.txHasWitness = &hasWitness\n\treturn hasWitness\n}\n\n// Index returns the saved index of the transaction within a block.  This value\n// will be TxIndexUnknown if it hasn't already explicitly been set.\nfunc (t *Tx) Index() int {\n\treturn t.txIndex\n}\n\n// SetIndex sets the index of the transaction in within a block.\nfunc (t *Tx) SetIndex(index int) {\n\tt.txIndex = index\n}\n\n// NewTx returns a new instance of a bitcoin transaction given an underlying\n// wire.MsgTx.  See Tx.\nfunc NewTx(msgTx *wire.MsgTx) *Tx {\n\treturn &Tx{\n\t\tmsgTx:   msgTx,\n\t\ttxIndex: TxIndexUnknown,\n\t}\n}\n\n// setBytes sets the raw bytes of the tx.\nfunc (t *Tx) setBytes(bytes []byte) {\n\tt.rawBytes = bytes\n}\n\n// NewTxFromBytes returns a new instance of a bitcoin transaction given the\n// serialized bytes.  See Tx.\nfunc NewTxFromBytes(serializedTx []byte) (*Tx, error) {\n\tbr := bytes.NewReader(serializedTx)\n\treturn NewTxFromReader(br)\n}\n\n// NewTxFromReader returns a new instance of a bitcoin transaction given a\n// Reader to deserialize the transaction.  See Tx.\nfunc NewTxFromReader(r io.Reader) (*Tx, error) {\n\t// Deserialize the bytes into a MsgTx.\n\tvar msgTx wire.MsgTx\n\terr := msgTx.Deserialize(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tt := Tx{\n\t\tmsgTx:   &msgTx,\n\t\ttxIndex: TxIndexUnknown,\n\t}\n\treturn &t, nil\n}\n"
  },
  {
    "path": "btcutil/tx_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil_test\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestTx tests the API for Tx.\nfunc TestTx(t *testing.T) {\n\ttestTx := Block100000.Transactions[0]\n\ttx := btcutil.NewTx(testTx)\n\n\t// Ensure we get the same data back out.\n\tif msgTx := tx.MsgTx(); !reflect.DeepEqual(msgTx, testTx) {\n\t\tt.Errorf(\"MsgTx: mismatched MsgTx - got %v, want %v\",\n\t\t\tspew.Sdump(msgTx), spew.Sdump(testTx))\n\t}\n\n\t// Ensure transaction index set and get work properly.\n\twantIndex := 0\n\ttx.SetIndex(0)\n\tif gotIndex := tx.Index(); gotIndex != wantIndex {\n\t\tt.Errorf(\"Index: mismatched index - got %v, want %v\",\n\t\t\tgotIndex, wantIndex)\n\t}\n\n\t// Hash for block 100,000 transaction 0.\n\twantHashStr := \"8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87\"\n\twantHash, err := chainhash.NewHashFromStr(wantHashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Request the hash multiple times to test generation and caching.\n\tfor i := 0; i < 2; i++ {\n\t\thash := tx.Hash()\n\t\tif !hash.IsEqual(wantHash) {\n\t\t\tt.Errorf(\"Hash #%d mismatched hash - got %v, want %v\", i,\n\t\t\t\thash, wantHash)\n\t\t}\n\t}\n}\n\n// TestNewTxFromBytes tests creation of a Tx from serialized bytes.\nfunc TestNewTxFromBytes(t *testing.T) {\n\t// Serialize the test transaction.\n\ttestTx := Block100000.Transactions[0]\n\tvar testTxBuf bytes.Buffer\n\terr := testTx.Serialize(&testTxBuf)\n\tif err != nil {\n\t\tt.Errorf(\"Serialize: %v\", err)\n\t}\n\ttestTxBytes := testTxBuf.Bytes()\n\n\t// Create a new transaction from the serialized bytes.\n\ttx, err := btcutil.NewTxFromBytes(testTxBytes)\n\tif err != nil {\n\t\tt.Errorf(\"NewTxFromBytes: %v\", err)\n\t\treturn\n\t}\n\n\t// Ensure the generated MsgTx is correct.\n\tif msgTx := tx.MsgTx(); !reflect.DeepEqual(msgTx, testTx) {\n\t\tt.Errorf(\"MsgTx: mismatched MsgTx - got %v, want %v\",\n\t\t\tspew.Sdump(msgTx), spew.Sdump(testTx))\n\t}\n}\n\n// TestTxErrors tests the error paths for the Tx API.\nfunc TestTxErrors(t *testing.T) {\n\t// Serialize the test transaction.\n\ttestTx := Block100000.Transactions[0]\n\tvar testTxBuf bytes.Buffer\n\terr := testTx.Serialize(&testTxBuf)\n\tif err != nil {\n\t\tt.Errorf(\"Serialize: %v\", err)\n\t}\n\ttestTxBytes := testTxBuf.Bytes()\n\n\t// Truncate the transaction byte buffer to force errors.\n\tshortBytes := testTxBytes[:4]\n\t_, err = btcutil.NewTxFromBytes(shortBytes)\n\tif err != io.EOF {\n\t\tt.Errorf(\"NewTxFromBytes: did not get expected error - \"+\n\t\t\t\"got %v, want %v\", err, io.EOF)\n\t}\n}\n\n// TestTxHasWitness tests the HasWitness() method.\nfunc TestTxHasWitness(t *testing.T) {\n\tmsgTx := Block100000.Transactions[0] // contains witness data\n\ttx := btcutil.NewTx(msgTx)\n\n\ttx.WitnessHash() // Populate the witness hash cache\n\ttx.HasWitness()  // Should not fail (see btcsuite/btcd#1543)\n\n\tif !tx.HasWitness() {\n\t\tt.Errorf(\"HasWitness: got false, want true\")\n\t}\n\n\tfor _, msgTxWithoutWitness := range Block100000.Transactions[1:] {\n\t\ttxWithoutWitness := btcutil.NewTx(msgTxWithoutWitness)\n\t\tif txWithoutWitness.HasWitness() {\n\t\t\tt.Errorf(\"HasWitness: got false, want true\")\n\t\t}\n\t}\n}\n\n// TestTxWitnessHash tests the WitnessHash() method.\nfunc TestTxWitnessHash(t *testing.T) {\n\tmsgTx := Block100000.Transactions[0] // contains witness data\n\ttx := btcutil.NewTx(msgTx)\n\n\tif tx.WitnessHash().IsEqual(tx.Hash()) {\n\t\tt.Errorf(\"WitnessHash: witness hash and tx id must NOT be same - \"+\n\t\t\t\"got %v, want %v\", tx.WitnessHash(), tx.Hash())\n\t}\n\n\tfor _, msgTxWithoutWitness := range Block100000.Transactions[1:] {\n\t\ttxWithoutWitness := btcutil.NewTx(msgTxWithoutWitness)\n\t\tif !txWithoutWitness.WitnessHash().IsEqual(txWithoutWitness.Hash()) {\n\t\t\tt.Errorf(\"WitnessHash: witness hash and tx id must be same - \"+\n\t\t\t\t\"got %v, want %v\", txWithoutWitness.WitnessHash(), txWithoutWitness.Hash())\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcutil/txsort/README.md",
    "content": "txsort\n======\n\n[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](http://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcd/btcutil/txsort)\n\nPackage txsort provides the transaction sorting according to [BIP 69](https://github.com/bitcoin/bips/blob/master/bip-0069.mediawiki).\n\nBIP 69 defines a standard lexicographical sort order of transaction inputs and\noutputs.  This is useful to standardize transactions for faster multi-party\nagreement as well as preventing information leaks in a single-party use case.\n\nThe BIP goes into more detail, but for a quick and simplistic overview, the\norder for inputs is defined as first sorting on the previous output hash and\nthen on the index as a tie breaker.  The order for outputs is defined as first\nsorting on the amount and then on the raw public key script bytes as a tie\nbreaker.\n\nA comprehensive suite of tests is provided to ensure proper functionality.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/btcutil/txsort\n```\n\n## License\n\nPackage txsort is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "btcutil/txsort/doc.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage txsort provides the transaction sorting according to BIP 69.\n\n# Overview\n\nBIP 69 defines a standard lexicographical sort order of transaction inputs and\noutputs.  This is useful to standardize transactions for faster multi-party\nagreement as well as preventing information leaks in a single-party use case.\n\nThe BIP goes into more detail, but for a quick and simplistic overview, the\norder for inputs is defined as first sorting on the previous output hash and\nthen on the index as a tie breaker.  The order for outputs is defined as first\nsorting on the amount and then on the raw public key script bytes as a tie\nbreaker.\n*/\npackage txsort\n"
  },
  {
    "path": "btcutil/txsort/testdata/bip69-1.hex",
    "content": "0100000011aad553bb1650007e9982a8ac79d227cd8c831e1573b11f25573a37664e5f3e64000000006a47304402205438cedd30ee828b0938a863e08d810526123746c1f4abee5b7bc2312373450c02207f26914f4275f8f0040ab3375bacc8c5d610c095db8ed0785de5dc57456591a601210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffc26f3eb7932f7acddc5ddd26602b77e7516079b03090a16e2c2f5485d1fde028000000006b483045022100f81d98c1de9bb61063a5e6671d191b400fda3a07d886e663799760393405439d0220234303c9af4bad3d665f00277fe70cdd26cd56679f114a40d9107249d29c979401210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff456a9e597129f5df2e11b842833fc19a94c563f57449281d3cd01249a830a1f0000000006a47304402202310b00924794ef68a8f09564fd0bb128838c66bc45d1a3f95c5cab52680f166022039fc99138c29f6c434012b14aca651b1c02d97324d6bd9dd0ffced0782c7e3bd01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff571fb3e02278217852dd5d299947e2b7354a639adc32ec1fa7b82cfb5dec530e000000006b483045022100d276251f1f4479d8521269ec8b1b45c6f0e779fcf1658ec627689fa8a55a9ca50220212a1e307e6182479818c543e1b47d62e4fc3ce6cc7fc78183c7071d245839df01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff5d8de50362ff33d3526ac3602e9ee25c1a349def086a7fc1d9941aaeb9e91d38010000006b4830450221008768eeb1240451c127b88d89047dd387d13357ce5496726fc7813edc6acd55ac022015187451c3fb66629af38fdb061dfb39899244b15c45e4a7ccc31064a059730d01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff60ad3408b89ea19caf3abd5e74e7a084344987c64b1563af52242e9d2a8320f3000000006b4830450221009be4261ec050ebf33fa3d47248c7086e4c247cafbb100ea7cee4aa81cd1383f5022008a70d6402b153560096c849d7da6fe61c771a60e41ff457aac30673ceceafee01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffe9b483a8ac4129780c88d1babe41e89dc10a26dedbf14f80a28474e9a11104de010000006b4830450221009bc40eee321b39b5dc26883f79cd1f5a226fc6eed9e79e21d828f4c23190c57e022078182fd6086e265589105023d9efa4cba83f38c674a499481bd54eee196b033f01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffe28db9462d3004e21e765e03a45ecb147f136a20ba8bca78ba60ebfc8e2f8b3b000000006a47304402200fb572b7c6916515452e370c2b6f97fcae54abe0793d804a5a53e419983fae1602205191984b6928bf4a1e25b00e5b5569a0ce1ecb82db2dea75fe4378673b53b9e801210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff7a1ef65ff1b7b7740c662ab6c9735ace4a16279c23a1db5709ed652918ffff54010000006a47304402206bc218a925f7280d615c8ea4f0131a9f26e7fc64cff6eeeb44edb88aba14f1910220779d5d67231bc2d2d93c3c5ab74dcd193dd3d04023e58709ad7ffbf95161be6201210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff850cecf958468ca7ffa6a490afe13b8c271b1326b0ddc1fdfdf9f3c7e365fdba000000006a473044022047df98cc26bd2bfdc5b2b97c27aead78a214810ff023e721339292d5ce50823d02205fe99dc5f667908974dae40cc7a9475af7fa6671ba44f64a00fcd01fa12ab523012102ca46fa75454650afba1784bc7b079d687e808634411e4beff1f70e44596308a1ffffffff8640e312040e476cf6727c60ca3f4a3ad51623500aacdda96e7728dbdd99e8a5000000006a47304402205566aa84d3d84226d5ab93e6f253b57b3ef37eb09bb73441dae35de86271352a02206ee0b7f800f73695a2073a2967c9ad99e19f6ddf18ce877adf822e408ba9291e01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff91c1889c5c24b93b56e643121f7a05a34c10c5495c450504c7b5afcb37e11d7a000000006b483045022100df61d45bbaa4571cdd6c5c822cba458cdc55285cdf7ba9cd5bb9fc18096deb9102201caf8c771204df7fd7c920c4489da7bc3a60e1d23c1a97e237c63afe53250b4a01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff2470947216eb81ea0eeeb4fe19362ec05767db01c3aa3006bb499e8b6d6eaa26010000006a473044022031501a0b2846b8822a32b9947b058d89d32fc758e009fc2130c2e5effc925af70220574ef3c9e350cef726c75114f0701fd8b188c6ec5f84adce0ed5c393828a5ae001210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff0abcd77d65cc14363f8262898335f184d6da5ad060ff9e40bf201741022c2b40010000006b483045022100a6ac110802b699f9a2bff0eea252d32e3d572b19214d49d8bb7405efa2af28f1022033b7563eb595f6d7ed7ec01734e17b505214fe0851352ed9c3c8120d53268e9a01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffa43bebbebf07452a893a95bfea1d5db338d23579be172fe803dce02eeb7c037d010000006b483045022100ebc77ed0f11d15fe630fe533dc350c2ddc1c81cfeb81d5a27d0587163f58a28c02200983b2a32a1014bab633bfc9258083ac282b79566b6b3fa45c1e6758610444f401210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffb102113fa46ce949616d9cda00f6b10231336b3928eaaac6bfe42d1bf3561d6c010000006a473044022010f8731929a55c1c49610722e965635529ed895b2292d781b183d465799906b20220098359adcbc669cd4b294cc129b110fe035d2f76517248f4b7129f3bf793d07f01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffffb861fab2cde188499758346be46b5fbec635addfc4e7b0c8a07c0a908f2b11b4000000006a47304402207328142bb02ef5d6496a210300f4aea71f67683b842fa3df32cae6c88b49a9bb022020f56ddff5042260cfda2c9f39b7dec858cc2f4a76a987cd2dc25945b04e15fe01210391064d5b2d1c70f264969046fcff853a7e2bfde5d121d38dc5ebd7bc37c2b210ffffffff027064d817000000001976a9144a5fba237213a062f6f57978f796390bdcf8d01588ac00902f50090000001976a9145be32612930b8323add2212a4ec03c1562084f8488ac00000000"
  },
  {
    "path": "btcutil/txsort/testdata/bip69-2.hex",
    "content": "010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00000000"
  },
  {
    "path": "btcutil/txsort/testdata/bip69-3.hex",
    "content": "0100000001d992e5a888a86d4c7a6a69167a4728ee69497509740fc5f456a24528c340219a000000008b483045022100f0519bdc9282ff476da1323b8ef7ffe33f495c1a8d52cc522b437022d83f6a230220159b61d197fbae01b4a66622a23bc3f1def65d5fa24efd5c26fa872f3a246b8e014104839f9023296a1fabb133140128ca2709f6818c7d099491690bd8ac0fd55279def6a2ceb6ab7b5e4a71889b6e739f09509565eec789e86886f6f936fa42097adeffffffff02000fe208010000001976a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac00e32321000000001976a9140c34f4e29ab5a615d5ea28d4817f12b137d62ed588ac00000000"
  },
  {
    "path": "btcutil/txsort/testdata/bip69-4.hex",
    "content": "01000000059daf0abe7a92618546a9dbcfd65869b6178c66ec21ccfda878c1175979cfd9ef000000004a493046022100c2f7f25be5de6ce88ac3c1a519514379e91f39b31ddff279a3db0b1a229b708b022100b29efbdbd9837cc6a6c7318aa4900ed7e4d65662c34d1622a2035a3a5534a99a01ffffffffd516330ebdf075948da56db13d22632a4fb941122df2884397dda45d451acefb0000000048473044022051243debe6d4f2b433bee0cee78c5c4073ead0e3bde54296dbed6176e128659c022044417bfe16f44eb7b6eb0cdf077b9ce972a332e15395c09ca5e4f602958d266101ffffffffe1f5aa33961227b3c344e57179417ce01b7ccd421117fe2336289b70489883f900000000484730440220593252bb992ce3c85baf28d6e3aa32065816271d2c822398fe7ee28a856bc943022066d429dd5025d3c86fd8fd8a58e183a844bd94aa312cefe00388f57c85b0ca3201ffffffffe207e83718129505e6a7484831442f668164ae659fddb82e9e5421a081fb90d50000000049483045022067cf27eb733e5bcae412a586b25a74417c237161a084167c2a0b439abfebdcb2022100efcc6baa6824b4c5205aa967e0b76d31abf89e738d4b6b014e788c9a8cccaf0c01ffffffffe23b8d9d80a9e9d977fab3c94dbe37befee63822443c3ec5ae5a713ede66c3940000000049483045022020f2eb35036666b1debe0d1d2e77a36d5d9c4e96c1dba23f5100f193dbf524790221008ce79bc1321fb4357c6daee818038d41544749127751726e46b2b320c8b565a201ffffffff0200ba1dd2050000001976a914366a27645806e817a6cd40bc869bdad92fe5509188ac40420f00000000001976a914ee8bd501094a7d5ca318da2506de35e1cb025ddc88ac00000000"
  },
  {
    "path": "btcutil/txsort/testdata/bip69-5.hex",
    "content": "01000000011f636d0003f673b3aeea4971daef16b8eed784cf6e8019a5ae7da4985fbb06e5000000008a47304402205103941e2b11e746dfa817888d422f6e7f4d16dbbfb8ffa61d15ffb924a84b8802202fe861b0f23f17139d15a3374bfc6c7196d371f3d1a324e31cc0aadbba87e53c0141049e7e1b251a7e26cae9ee7553b278ef58ef3c28b4b20134d51b747d9b18b0a19b94b66cef320e2549dec0ea3d725cb4c742f368928b1fb74b4603e24a1e262c80ffffffff0240420f00000000001976a914bcfa0e27218a7c97257b351b03a9eac95c25a23988ac40420f00000000001976a9140c6a68f20bafc678164d171ee4f077adfa9b091688ac00000000"
  },
  {
    "path": "btcutil/txsort/txsort.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// Provides functions for sorting tx inputs and outputs according to BIP 69\n// (https://github.com/bitcoin/bips/blob/master/bip-0069.mediawiki)\n\npackage txsort\n\nimport (\n\t\"bytes\"\n\t\"sort\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// InPlaceSort modifies the passed transaction inputs and outputs to be sorted\n// based on BIP 69.\n//\n// WARNING: This function must NOT be called with published transactions since\n// it will mutate the transaction if it's not already sorted.  This can cause\n// issues if you mutate a tx in a block, for example, which would invalidate the\n// block.  It could also cause cached hashes, such as in a btcutil.Tx to become\n// invalidated.\n//\n// The function should only be used if the caller is creating the transaction or\n// is otherwise 100% positive mutating will not cause adverse affects due to\n// other dependencies.\nfunc InPlaceSort(tx *wire.MsgTx) {\n\tsort.Sort(sortableInputSlice(tx.TxIn))\n\tsort.Sort(sortableOutputSlice(tx.TxOut))\n}\n\n// Sort returns a new transaction with the inputs and outputs sorted based on\n// BIP 69.  The passed transaction is not modified and the new transaction\n// might have a different hash if any sorting was done.\nfunc Sort(tx *wire.MsgTx) *wire.MsgTx {\n\ttxCopy := tx.Copy()\n\tsort.Sort(sortableInputSlice(txCopy.TxIn))\n\tsort.Sort(sortableOutputSlice(txCopy.TxOut))\n\treturn txCopy\n}\n\n// IsSorted checks whether tx has inputs and outputs sorted according to BIP\n// 69.\nfunc IsSorted(tx *wire.MsgTx) bool {\n\tif !sort.IsSorted(sortableInputSlice(tx.TxIn)) {\n\t\treturn false\n\t}\n\tif !sort.IsSorted(sortableOutputSlice(tx.TxOut)) {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype sortableInputSlice []*wire.TxIn\ntype sortableOutputSlice []*wire.TxOut\n\n// For SortableInputSlice and SortableOutputSlice, three functions are needed\n// to make it sortable with sort.Sort() -- Len, Less, and Swap\n// Len and Swap are trivial.  Less is BIP 69 specific.\nfunc (s sortableInputSlice) Len() int       { return len(s) }\nfunc (s sortableOutputSlice) Len() int      { return len(s) }\nfunc (s sortableOutputSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }\nfunc (s sortableInputSlice) Swap(i, j int)  { s[i], s[j] = s[j], s[i] }\n\n// Input comparison function.\n// First sort based on input hash (reversed / rpc-style), then index.\nfunc (s sortableInputSlice) Less(i, j int) bool {\n\t// Input hashes are the same, so compare the index.\n\tihash := s[i].PreviousOutPoint.Hash\n\tjhash := s[j].PreviousOutPoint.Hash\n\tif ihash == jhash {\n\t\treturn s[i].PreviousOutPoint.Index < s[j].PreviousOutPoint.Index\n\t}\n\n\t// At this point, the hashes are not equal, so reverse them to\n\t// big-endian and return the result of the comparison.\n\tconst hashSize = chainhash.HashSize\n\tfor b := 0; b < hashSize/2; b++ {\n\t\tihash[b], ihash[hashSize-1-b] = ihash[hashSize-1-b], ihash[b]\n\t\tjhash[b], jhash[hashSize-1-b] = jhash[hashSize-1-b], jhash[b]\n\t}\n\treturn bytes.Compare(ihash[:], jhash[:]) == -1\n}\n\n// Output comparison function.\n// First sort based on amount (smallest first), then PkScript.\nfunc (s sortableOutputSlice) Less(i, j int) bool {\n\tif s[i].Value == s[j].Value {\n\t\treturn bytes.Compare(s[i].PkScript, s[j].PkScript) < 0\n\t}\n\treturn s[i].Value < s[j].Value\n}\n"
  },
  {
    "path": "btcutil/txsort/txsort_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txsort_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil/txsort\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TestSort ensures the transaction sorting works according to the BIP.\nfunc TestSort(t *testing.T) {\n\ttests := []struct {\n\t\tname         string\n\t\thexFile      string\n\t\tisSorted     bool\n\t\tunsortedHash string\n\t\tsortedHash   string\n\t}{\n\t\t{\n\t\t\tname:         \"first test case from BIP 69 - sorts inputs only, based on hash\",\n\t\t\thexFile:      \"bip69-1.hex\",\n\t\t\tisSorted:     false,\n\t\t\tunsortedHash: \"0a6a357e2f7796444e02638749d9611c008b253fb55f5dc88b739b230ed0c4c3\",\n\t\t\tsortedHash:   \"839503cb611a3e3734bd521c608f881be2293ff77b7384057ab994c794fce623\",\n\t\t},\n\t\t{\n\t\t\tname:         \"second test case from BIP 69 - already sorted\",\n\t\t\thexFile:      \"bip69-2.hex\",\n\t\t\tisSorted:     true,\n\t\t\tunsortedHash: \"28204cad1d7fc1d199e8ef4fa22f182de6258a3eaafe1bbe56ebdcacd3069a5f\",\n\t\t\tsortedHash:   \"28204cad1d7fc1d199e8ef4fa22f182de6258a3eaafe1bbe56ebdcacd3069a5f\",\n\t\t},\n\t\t{\n\t\t\tname:         \"block 100001 tx[1] - sorts outputs only, based on amount\",\n\t\t\thexFile:      \"bip69-3.hex\",\n\t\t\tisSorted:     false,\n\t\t\tunsortedHash: \"fbde5d03b027d2b9ba4cf5d4fecab9a99864df2637b25ea4cbcb1796ff6550ca\",\n\t\t\tsortedHash:   \"0a8c246c55f6b82f094d211f4f57167bf2ea4898741d218b09bdb2536fd8d13f\",\n\t\t},\n\t\t{\n\t\t\tname:         \"block 100001 tx[2] - sorts both inputs and outputs\",\n\t\t\thexFile:      \"bip69-4.hex\",\n\t\t\tisSorted:     false,\n\t\t\tunsortedHash: \"8131ffb0a2c945ecaf9b9063e59558784f9c3a74741ce6ae2a18d0571dac15bb\",\n\t\t\tsortedHash:   \"a3196553b928b0b6154b002fa9a1ce875adabc486fedaaaf4c17430fd4486329\",\n\t\t},\n\t\t{\n\t\t\tname:         \"block 100998 tx[6] - sorts outputs only, based on output script\",\n\t\t\thexFile:      \"bip69-5.hex\",\n\t\t\tisSorted:     false,\n\t\t\tunsortedHash: \"ff85e8fc92e71bbc217e3ea9a3bacb86b435e52b6df0b089d67302c293a2b81d\",\n\t\t\tsortedHash:   \"9a6c24746de024f77cac9b2138694f11101d1c66289261224ca52a25155a7c94\",\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Load and deserialize the test transaction.\n\t\tfilePath := filepath.Join(\"testdata\", test.hexFile)\n\t\ttxHexBytes, err := os.ReadFile(filePath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"ReadFile (%s): failed to read test file: %v\",\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\t\ttxBytes, err := hex.DecodeString(string(txHexBytes))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"DecodeString (%s): failed to decode tx: %v\",\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tvar tx wire.MsgTx\n\t\terr = tx.Deserialize(bytes.NewReader(txBytes))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Deserialize (%s): unexpected error %v\",\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the sort order of the original transaction matches the\n\t\t// expected value.\n\t\tif got := txsort.IsSorted(&tx); got != test.isSorted {\n\t\t\tt.Errorf(\"IsSorted (%s): sort does not match \"+\n\t\t\t\t\"expected - got %v, want %v\", test.name, got,\n\t\t\t\ttest.isSorted)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Sort the transaction and ensure the resulting hash is the\n\t\t// expected value.\n\t\tsortedTx := txsort.Sort(&tx)\n\t\tif got := sortedTx.TxHash().String(); got != test.sortedHash {\n\t\t\tt.Errorf(\"Sort (%s): sorted hash does not match \"+\n\t\t\t\t\"expected - got %v, want %v\", test.name, got,\n\t\t\t\ttest.sortedHash)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the original transaction is not modified.\n\t\tif got := tx.TxHash().String(); got != test.unsortedHash {\n\t\t\tt.Errorf(\"Sort (%s): unsorted hash does not match \"+\n\t\t\t\t\"expected - got %v, want %v\", test.name, got,\n\t\t\t\ttest.unsortedHash)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Now sort the transaction using the mutable version and ensure\n\t\t// the resulting hash is the expected value.\n\t\ttxsort.InPlaceSort(&tx)\n\t\tif got := tx.TxHash().String(); got != test.sortedHash {\n\t\t\tt.Errorf(\"SortMutate (%s): sorted hash does not match \"+\n\t\t\t\t\"expected - got %v, want %v\", test.name, got,\n\t\t\t\ttest.sortedHash)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "btcutil/wif.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcutil/base58\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// ErrMalformedPrivateKey describes an error where a WIF-encoded private\n// key cannot be decoded due to being improperly formatted.  This may occur\n// if the byte length is incorrect or an unexpected magic number was\n// encountered.\nvar ErrMalformedPrivateKey = errors.New(\"malformed private key\")\n\n// compressMagic is the magic byte used to identify a WIF encoding for\n// an address created from a compressed serialized public key.\nconst compressMagic byte = 0x01\n\n// WIF contains the individual components described by the Wallet Import Format\n// (WIF).  A WIF string is typically used to represent a private key and its\n// associated address in a way that  may be easily copied and imported into or\n// exported from wallet software.  WIF strings may be decoded into this\n// structure by calling DecodeWIF or created with a user-provided private key\n// by calling NewWIF.\ntype WIF struct {\n\t// PrivKey is the private key being imported or exported.\n\tPrivKey *btcec.PrivateKey\n\n\t// CompressPubKey specifies whether the address controlled by the\n\t// imported or exported private key was created by hashing a\n\t// compressed (33-byte) serialized public key, rather than an\n\t// uncompressed (65-byte) one.\n\tCompressPubKey bool\n\n\t// netID is the bitcoin network identifier byte used when\n\t// WIF encoding the private key.\n\tnetID byte\n}\n\n// NewWIF creates a new WIF structure to export an address and its private key\n// as a string encoded in the Wallet Import Format.  The compress argument\n// specifies whether the address intended to be imported or exported was created\n// by serializing the public key compressed rather than uncompressed.\nfunc NewWIF(privKey *btcec.PrivateKey, net *chaincfg.Params, compress bool) (*WIF, error) {\n\tif net == nil {\n\t\treturn nil, errors.New(\"no network\")\n\t}\n\treturn &WIF{privKey, compress, net.PrivateKeyID}, nil\n}\n\n// IsForNet returns whether or not the decoded WIF structure is associated\n// with the passed bitcoin network.\nfunc (w *WIF) IsForNet(net *chaincfg.Params) bool {\n\treturn w.netID == net.PrivateKeyID\n}\n\n// DecodeWIF creates a new WIF structure by decoding the string encoding of\n// the import format.\n//\n// The WIF string must be a base58-encoded string of the following byte\n// sequence:\n//\n//   - 1 byte to identify the network, must be 0x80 for mainnet or 0xef for\n//     either testnet3 or the regression test network\n//   - 32 bytes of a binary-encoded, big-endian, zero-padded private key\n//   - Optional 1 byte (equal to 0x01) if the address being imported or exported\n//     was created by taking the RIPEMD160 after SHA256 hash of a serialized\n//     compressed (33-byte) public key\n//   - 4 bytes of checksum, must equal the first four bytes of the double SHA256\n//     of every byte before the checksum in this sequence\n//\n// If the base58-decoded byte sequence does not match this, DecodeWIF will\n// return a non-nil error.  ErrMalformedPrivateKey is returned when the WIF\n// is of an impossible length or the expected compressed pubkey magic number\n// does not equal the expected value of 0x01.  ErrChecksumMismatch is returned\n// if the expected WIF checksum does not match the calculated checksum.\nfunc DecodeWIF(wif string) (*WIF, error) {\n\tdecoded := base58.Decode(wif)\n\tdecodedLen := len(decoded)\n\tvar compress bool\n\n\t// Length of base58 decoded WIF must be 32 bytes + an optional 1 byte\n\t// (0x01) if compressed, plus 1 byte for netID + 4 bytes of checksum.\n\tswitch decodedLen {\n\tcase 1 + btcec.PrivKeyBytesLen + 1 + 4:\n\t\tif decoded[33] != compressMagic {\n\t\t\treturn nil, ErrMalformedPrivateKey\n\t\t}\n\t\tcompress = true\n\tcase 1 + btcec.PrivKeyBytesLen + 4:\n\t\tcompress = false\n\tdefault:\n\t\treturn nil, ErrMalformedPrivateKey\n\t}\n\n\t// Checksum is first four bytes of double SHA256 of the identifier byte\n\t// and privKey.  Verify this matches the final 4 bytes of the decoded\n\t// private key.\n\tvar tosum []byte\n\tif compress {\n\t\ttosum = decoded[:1+btcec.PrivKeyBytesLen+1]\n\t} else {\n\t\ttosum = decoded[:1+btcec.PrivKeyBytesLen]\n\t}\n\tcksum := chainhash.DoubleHashB(tosum)[:4]\n\tif !bytes.Equal(cksum, decoded[decodedLen-4:]) {\n\t\treturn nil, ErrChecksumMismatch\n\t}\n\n\tnetID := decoded[0]\n\tprivKeyBytes := decoded[1 : 1+btcec.PrivKeyBytesLen]\n\tprivKey, _ := btcec.PrivKeyFromBytes(privKeyBytes)\n\treturn &WIF{privKey, compress, netID}, nil\n}\n\n// String creates the Wallet Import Format string encoding of a WIF structure.\n// See DecodeWIF for a detailed breakdown of the format and requirements of\n// a valid WIF string.\nfunc (w *WIF) String() string {\n\t// Precalculate size.  Maximum number of bytes before base58 encoding\n\t// is one byte for the network, 32 bytes of private key, possibly one\n\t// extra byte if the pubkey is to be compressed, and finally four\n\t// bytes of checksum.\n\tencodeLen := 1 + btcec.PrivKeyBytesLen + 4\n\tif w.CompressPubKey {\n\t\tencodeLen++\n\t}\n\n\ta := make([]byte, 0, encodeLen)\n\ta = append(a, w.netID)\n\ta = append(a, w.PrivKey.Serialize()...)\n\tif w.CompressPubKey {\n\t\ta = append(a, compressMagic)\n\t}\n\tcksum := chainhash.DoubleHashB(a)[:4]\n\ta = append(a, cksum...)\n\treturn base58.Encode(a)\n}\n\n// SerializePubKey serializes the associated public key of the imported or\n// exported private key in either a compressed or uncompressed format.  The\n// serialization format chosen depends on the value of w.CompressPubKey.\nfunc (w *WIF) SerializePubKey() []byte {\n\tpk := w.PrivKey.PubKey()\n\tif w.CompressPubKey {\n\t\treturn pk.SerializeCompressed()\n\t}\n\treturn pk.SerializeUncompressed()\n}\n"
  },
  {
    "path": "btcutil/wif_test.go",
    "content": "// Copyright (c) 2013 - 2020 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t. \"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n)\n\nfunc TestEncodeDecodeWIF(t *testing.T) {\n\tvalidEncodeCases := []struct {\n\t\tprivateKey []byte           // input\n\t\tnet        *chaincfg.Params // input\n\t\tcompress   bool             // input\n\t\twif        string           // output\n\t\tpublicKey  []byte           // output\n\t\tname       string           // name of subtest\n\t}{\n\t\t{\n\t\t\tprivateKey: []byte{\n\t\t\t\t0x0c, 0x28, 0xfc, 0xa3, 0x86, 0xc7, 0xa2, 0x27,\n\t\t\t\t0x60, 0x0b, 0x2f, 0xe5, 0x0b, 0x7c, 0xae, 0x11,\n\t\t\t\t0xec, 0x86, 0xd3, 0xbf, 0x1f, 0xbe, 0x47, 0x1b,\n\t\t\t\t0xe8, 0x98, 0x27, 0xe1, 0x9d, 0x72, 0xaa, 0x1d},\n\t\t\tnet:      &chaincfg.MainNetParams,\n\t\t\tcompress: false,\n\t\t\twif:      \"5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ\",\n\t\t\tpublicKey: []byte{\n\t\t\t\t0x04, 0xd0, 0xde, 0x0a, 0xae, 0xae, 0xfa, 0xd0,\n\t\t\t\t0x2b, 0x8b, 0xdc, 0x8a, 0x01, 0xa1, 0xb8, 0xb1,\n\t\t\t\t0x1c, 0x69, 0x6b, 0xd3, 0xd6, 0x6a, 0x2c, 0x5f,\n\t\t\t\t0x10, 0x78, 0x0d, 0x95, 0xb7, 0xdf, 0x42, 0x64,\n\t\t\t\t0x5c, 0xd8, 0x52, 0x28, 0xa6, 0xfb, 0x29, 0x94,\n\t\t\t\t0x0e, 0x85, 0x8e, 0x7e, 0x55, 0x84, 0x2a, 0xe2,\n\t\t\t\t0xbd, 0x11, 0x5d, 0x1e, 0xd7, 0xcc, 0x0e, 0x82,\n\t\t\t\t0xd9, 0x34, 0xe9, 0x29, 0xc9, 0x76, 0x48, 0xcb,\n\t\t\t\t0x0a},\n\t\t\tname: \"encodeValidUncompressedMainNetWif\",\n\t\t},\n\t\t{\n\t\t\tprivateKey: []byte{\n\t\t\t\t0xdd, 0xa3, 0x5a, 0x14, 0x88, 0xfb, 0x97, 0xb6,\n\t\t\t\t0xeb, 0x3f, 0xe6, 0xe9, 0xef, 0x2a, 0x25, 0x81,\n\t\t\t\t0x4e, 0x39, 0x6f, 0xb5, 0xdc, 0x29, 0x5f, 0xe9,\n\t\t\t\t0x94, 0xb9, 0x67, 0x89, 0xb2, 0x1a, 0x03, 0x98},\n\t\t\tnet:      &chaincfg.TestNet3Params,\n\t\t\tcompress: true,\n\t\t\twif:      \"cV1Y7ARUr9Yx7BR55nTdnR7ZXNJphZtCCMBTEZBJe1hXt2kB684q\",\n\t\t\tpublicKey: []byte{\n\t\t\t\t0x02, 0xee, 0xc2, 0x54, 0x06, 0x61, 0xb0, 0xc3,\n\t\t\t\t0x9d, 0x27, 0x15, 0x70, 0x74, 0x24, 0x13, 0xbd,\n\t\t\t\t0x02, 0x93, 0x2d, 0xd0, 0x09, 0x34, 0x93, 0xfd,\n\t\t\t\t0x0b, 0xec, 0xed, 0x0b, 0x7f, 0x93, 0xad, 0xde,\n\t\t\t\t0xc4},\n\t\t\tname: \"encodeValidCompressedTestNet3Wif\",\n\t\t},\n\t}\n\n\tfor _, validCase := range validEncodeCases {\n\t\tvalidCase := validCase\n\n\t\tt.Run(validCase.name, func(t *testing.T) {\n\t\t\tpriv, _ := btcec.PrivKeyFromBytes(validCase.privateKey)\n\t\t\twif, err := NewWIF(priv, validCase.net, validCase.compress)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"NewWIF failed: expected no error, got '%v'\", err)\n\t\t\t}\n\n\t\t\tif !wif.IsForNet(validCase.net) {\n\t\t\t\tt.Fatal(\"IsForNet failed: got 'false', want 'true'\")\n\t\t\t}\n\n\t\t\tif gotPubKey := wif.SerializePubKey(); !bytes.Equal(gotPubKey, validCase.publicKey) {\n\t\t\t\tt.Fatalf(\"SerializePubKey failed: got '%s', want '%s'\",\n\t\t\t\t\thex.EncodeToString(gotPubKey), hex.EncodeToString(validCase.publicKey))\n\t\t\t}\n\n\t\t\t// Test that encoding the WIF structure matches the expected string.\n\t\t\tgot := wif.String()\n\t\t\tif got != validCase.wif {\n\t\t\t\tt.Fatalf(\"NewWIF failed: want '%s', got '%s'\",\n\t\t\t\t\tvalidCase.wif, got)\n\t\t\t}\n\n\t\t\t// Test that decoding the expected string results in the original WIF\n\t\t\t// structure.\n\t\t\tdecodedWif, err := DecodeWIF(got)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"DecodeWIF failed: expected no error, got '%v'\", err)\n\t\t\t}\n\t\t\tif decodedWifString := decodedWif.String(); decodedWifString != validCase.wif {\n\t\t\t\tt.Fatalf(\"NewWIF failed: want '%v', got '%v'\", validCase.wif, decodedWifString)\n\t\t\t}\n\t\t})\n\t}\n\n\tinvalidDecodeCases := []struct {\n\t\tname string\n\t\twif  string\n\t\terr  error\n\t}{\n\t\t{\n\t\t\tname: \"decodeInvalidLengthWif\",\n\t\t\twif:  \"deadbeef\",\n\t\t\terr:  ErrMalformedPrivateKey,\n\t\t},\n\t\t{\n\t\t\tname: \"decodeInvalidCompressMagicWif\",\n\t\t\twif:  \"KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sfZr2ym\",\n\t\t\terr:  ErrMalformedPrivateKey,\n\t\t},\n\t\t{\n\t\t\tname: \"decodeInvalidChecksumWif\",\n\t\t\twif:  \"5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTj\",\n\t\t\terr:  ErrChecksumMismatch,\n\t\t},\n\t}\n\n\tfor _, invalidCase := range invalidDecodeCases {\n\t\tinvalidCase := invalidCase\n\n\t\tt.Run(invalidCase.name, func(t *testing.T) {\n\t\t\tdecodedWif, err := DecodeWIF(invalidCase.wif)\n\t\t\tif decodedWif != nil {\n\t\t\t\tt.Fatalf(\"DecodeWIF: unexpectedly succeeded - got '%v', want '%v'\",\n\t\t\t\t\tdecodedWif, nil)\n\t\t\t}\n\t\t\tif err != invalidCase.err {\n\t\t\t\tt.Fatalf(\"DecodeWIF: expected error '%v', got '%v'\",\n\t\t\t\t\tinvalidCase.err, err)\n\t\t\t}\n\t\t})\n\t}\n\n\tt.Run(\"encodeInvalidNetworkWif\", func(t *testing.T) {\n\t\tprivateKey := []byte{\n\t\t\t0x0c, 0x28, 0xfc, 0xa3, 0x86, 0xc7, 0xa2, 0x27,\n\t\t\t0x60, 0x0b, 0x2f, 0xe5, 0x0b, 0x7c, 0xae, 0x11,\n\t\t\t0xec, 0x86, 0xd3, 0xbf, 0x1f, 0xbe, 0x47, 0x1b,\n\t\t\t0xe8, 0x98, 0x27, 0xe1, 0x9d, 0x72, 0xaa, 0x1d}\n\t\tpriv, _ := btcec.PrivKeyFromBytes(privateKey)\n\n\t\twif, err := NewWIF(priv, nil, true)\n\n\t\tif wif != nil {\n\t\t\tt.Fatalf(\"NewWIF: unexpectedly succeeded - got '%v', want '%v'\",\n\t\t\t\twif, nil)\n\t\t}\n\t\tif err == nil || err.Error() != \"no network\" {\n\t\t\tt.Fatalf(\"NewWIF: expected error 'no network', got '%v'\", err)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "chaincfg/README.md",
    "content": "chaincfg\n========\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/chaincfg)\n\nPackage chaincfg defines chain configuration parameters for the three standard\nBitcoin networks and provides the ability for callers to define their own custom\nBitcoin networks.\n\nAlthough this package was primarily written for btcd, it has intentionally been\ndesigned so it can be used as a standalone package for any projects needing to\nuse parameters for the standard Bitcoin networks or for projects needing to\ndefine their own network.\n\n## Sample Use\n\n```Go\npackage main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"log\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n)\n\nvar testnet = flag.Bool(\"testnet\", false, \"operate on the testnet Bitcoin network\")\n\n// By default (without -testnet), use mainnet.\nvar chainParams = &chaincfg.MainNetParams\n\nfunc main() {\n\tflag.Parse()\n\n\t// Modify active network parameters if operating on testnet.\n\tif *testnet {\n\t\tchainParams = &chaincfg.TestNet3Params\n\t}\n\n\t// later...\n\n\t// Create and print new payment address, specific to the active network.\n\tpubKeyHash := make([]byte, 20)\n\taddr, err := btcutil.NewAddressPubKeyHash(pubKeyHash, chainParams)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println(addr)\n}\n```\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/chaincfg\n```\n\n## GPG Verification Key\n\nAll official release tags are signed by Conformal so users can ensure the code\nhas not been tampered with and is coming from the btcsuite developers.  To\nverify the signature perform the following:\n\n- Download the public key from the Conformal website at\n  https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt\n\n- Import the public key into your GPG keyring:\n  ```bash\n  gpg --import GIT-GPG-KEY-conformal.txt\n  ```\n\n- Verify the release tag with the following command where `TAG_NAME` is a\n  placeholder for the specific tag:\n  ```bash\n  git tag -v TAG_NAME\n  ```\n\n## License\n\nPackage chaincfg is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "chaincfg/chainhash/README.md",
    "content": "chainhash\n=========\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/chaincfg/chainhash)\n=======\n\nchainhash provides a generic hash type and associated functions that allows the\nspecific hash algorithm to be abstracted.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/chaincfg/chainhash\n```\n\n## GPG Verification Key\n\nAll official release tags are signed by Conformal so users can ensure the code\nhas not been tampered with and is coming from the btcsuite developers.  To\nverify the signature perform the following:\n\n- Download the public key from the Conformal website at\n  https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt\n\n- Import the public key into your GPG keyring:\n  ```bash\n  gpg --import GIT-GPG-KEY-conformal.txt\n  ```\n\n- Verify the release tag with the following command where `TAG_NAME` is a\n  placeholder for the specific tag:\n  ```bash\n  git tag -v TAG_NAME\n  ```\n\n## License\n\nPackage chainhash is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "chaincfg/chainhash/doc.go",
    "content": "// Package chainhash provides abstracted hash functionality.\n//\n// This package provides a generic hash type and associated functions that\n// allows the specific hash algorithm to be abstracted.\npackage chainhash\n"
  },
  {
    "path": "chaincfg/chainhash/go.mod",
    "content": "module github.com/btcsuite/btcd/chaincfg/chainhash\n\ngo 1.22\n"
  },
  {
    "path": "chaincfg/chainhash/hash.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Copyright (c) 2015 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage chainhash\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n)\n\n// HashSize of array used to store hashes.  See Hash.\nconst HashSize = 32\n\n// MaxHashStringSize is the maximum length of a Hash hash string.\nconst MaxHashStringSize = HashSize * 2\n\nvar (\n\t// TagBIP0340Challenge is the BIP-0340 tag for challenges.\n\tTagBIP0340Challenge = []byte(\"BIP0340/challenge\")\n\n\t// TagBIP0340Aux is the BIP-0340 tag for aux data.\n\tTagBIP0340Aux = []byte(\"BIP0340/aux\")\n\n\t// TagBIP0340Nonce is the BIP-0340 tag for nonces.\n\tTagBIP0340Nonce = []byte(\"BIP0340/nonce\")\n\n\t// TagTapSighash is the tag used by BIP 341 to generate the sighash\n\t// flags.\n\tTagTapSighash = []byte(\"TapSighash\")\n\n\t// TagTagTapLeaf is the message tag prefix used to compute the hash\n\t// digest of a tapscript leaf.\n\tTagTapLeaf = []byte(\"TapLeaf\")\n\n\t// TagTapBranch is the message tag prefix used to compute the\n\t// hash digest of two tap leaves into a taproot branch node.\n\tTagTapBranch = []byte(\"TapBranch\")\n\n\t// TagTapTweak is the message tag prefix used to compute the hash tweak\n\t// used to enable a public key to commit to the taproot branch root\n\t// for the witness program.\n\tTagTapTweak = []byte(\"TapTweak\")\n\n\t// precomputedTags is a map containing the SHA-256 hash of the BIP-0340\n\t// tags.\n\tprecomputedTags = map[string]Hash{\n\t\tstring(TagBIP0340Challenge): sha256.Sum256(TagBIP0340Challenge),\n\t\tstring(TagBIP0340Aux):       sha256.Sum256(TagBIP0340Aux),\n\t\tstring(TagBIP0340Nonce):     sha256.Sum256(TagBIP0340Nonce),\n\t\tstring(TagTapSighash):       sha256.Sum256(TagTapSighash),\n\t\tstring(TagTapLeaf):          sha256.Sum256(TagTapLeaf),\n\t\tstring(TagTapBranch):        sha256.Sum256(TagTapBranch),\n\t\tstring(TagTapTweak):         sha256.Sum256(TagTapTweak),\n\t}\n)\n\n// ErrHashStrSize describes an error that indicates the caller specified a hash\n// string that has too many characters.\nvar ErrHashStrSize = fmt.Errorf(\"max hash string length is %v bytes\", MaxHashStringSize)\n\n// Hash is used in several of the bitcoin messages and common structures.  It\n// typically represents the double sha256 of data.\ntype Hash [HashSize]byte\n\n// String returns the Hash as the hexadecimal string of the byte-reversed\n// hash.\nfunc (hash Hash) String() string {\n\tfor i := 0; i < HashSize/2; i++ {\n\t\thash[i], hash[HashSize-1-i] = hash[HashSize-1-i], hash[i]\n\t}\n\treturn hex.EncodeToString(hash[:])\n}\n\n// CloneBytes returns a copy of the bytes which represent the hash as a byte\n// slice.\n//\n// NOTE: It is generally cheaper to just slice the hash directly thereby reusing\n// the same bytes rather than calling this method.\nfunc (hash *Hash) CloneBytes() []byte {\n\tnewHash := make([]byte, HashSize)\n\tcopy(newHash, hash[:])\n\n\treturn newHash\n}\n\n// SetBytes sets the bytes which represent the hash.  An error is returned if\n// the number of bytes passed in is not HashSize.\nfunc (hash *Hash) SetBytes(newHash []byte) error {\n\tnhlen := len(newHash)\n\tif nhlen != HashSize {\n\t\treturn fmt.Errorf(\"invalid hash length of %v, want %v\", nhlen,\n\t\t\tHashSize)\n\t}\n\tcopy(hash[:], newHash)\n\n\treturn nil\n}\n\n// IsEqual returns true if target is the same as hash.\nfunc (hash *Hash) IsEqual(target *Hash) bool {\n\tif hash == nil && target == nil {\n\t\treturn true\n\t}\n\tif hash == nil || target == nil {\n\t\treturn false\n\t}\n\treturn *hash == *target\n}\n\n// MarshalJSON serialises the hash as a JSON appropriate string value.\nfunc (hash Hash) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(hash.String())\n}\n\n// UnmarshalJSON parses the hash with JSON appropriate string value.\nfunc (hash *Hash) UnmarshalJSON(input []byte) error {\n\t// If the first byte indicates an array, the hash could have been marshalled\n\t// using the legacy method and e.g. persisted.\n\tif len(input) > 0 && input[0] == '[' {\n\t\treturn decodeLegacy(hash, input)\n\t}\n\n\tvar sh string\n\terr := json.Unmarshal(input, &sh)\n\tif err != nil {\n\t\treturn err\n\t}\n\tnewHash, err := NewHashFromStr(sh)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn hash.SetBytes(newHash[:])\n}\n\n// NewHash returns a new Hash from a byte slice.  An error is returned if\n// the number of bytes passed in is not HashSize.\nfunc NewHash(newHash []byte) (*Hash, error) {\n\tvar sh Hash\n\terr := sh.SetBytes(newHash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &sh, err\n}\n\n// TaggedHash implements the tagged hash scheme described in BIP-340. We use\n// sha-256 to bind a message hash to a specific context using a tag:\n// sha256(sha256(tag) || sha256(tag) || msg).\nfunc TaggedHash(tag []byte, msgs ...[]byte) *Hash {\n\t// Check to see if we've already pre-computed the hash of the tag. If\n\t// so then this'll save us an extra sha256 hash.\n\tshaTag, ok := precomputedTags[string(tag)]\n\tif !ok {\n\t\tshaTag = sha256.Sum256(tag)\n\t}\n\n\t// h = sha256(sha256(tag) || sha256(tag) || msg)\n\th := sha256.New()\n\th.Write(shaTag[:])\n\th.Write(shaTag[:])\n\n\tfor _, msg := range msgs {\n\t\th.Write(msg)\n\t}\n\n\ttaggedHash := h.Sum(nil)\n\n\t// The function can't error out since the above hash is guaranteed to\n\t// be 32 bytes.\n\thash, _ := NewHash(taggedHash)\n\n\treturn hash\n}\n\n// NewHashFromStr creates a Hash from a hash string.  The string should be\n// the hexadecimal string of a byte-reversed hash, but any missing characters\n// result in zero padding at the end of the Hash.\nfunc NewHashFromStr(hash string) (*Hash, error) {\n\tret := new(Hash)\n\terr := Decode(ret, hash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn ret, nil\n}\n\n// Decode decodes the byte-reversed hexadecimal string encoding of a Hash to a\n// destination.\nfunc Decode(dst *Hash, src string) error {\n\t// Return error if hash string is too long.\n\tif len(src) > MaxHashStringSize {\n\t\treturn ErrHashStrSize\n\t}\n\n\t// Hex decoder expects the hash to be a multiple of two.  When not, pad\n\t// with a leading zero.\n\tvar srcBytes []byte\n\tif len(src)%2 == 0 {\n\t\tsrcBytes = []byte(src)\n\t} else {\n\t\tsrcBytes = make([]byte, 1+len(src))\n\t\tsrcBytes[0] = '0'\n\t\tcopy(srcBytes[1:], src)\n\t}\n\n\t// Hex decode the source bytes to a temporary destination.\n\tvar reversedHash Hash\n\t_, err := hex.Decode(reversedHash[HashSize-hex.DecodedLen(len(srcBytes)):], srcBytes)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Reverse copy from the temporary hash to destination.  Because the\n\t// temporary was zeroed, the written result will be correctly padded.\n\tfor i, b := range reversedHash[:HashSize/2] {\n\t\tdst[i], dst[HashSize-1-i] = reversedHash[HashSize-1-i], b\n\t}\n\n\treturn nil\n}\n\n// decodeLegacy decodes an Hash that has been encoded with the legacy method\n// (i.e. represented as a bytes array) to a destination.\nfunc decodeLegacy(dst *Hash, src []byte) error {\n\tvar hashBytes []byte\n\terr := json.Unmarshal(src, &hashBytes)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(hashBytes) != HashSize {\n\t\treturn ErrHashStrSize\n\t}\n\treturn dst.SetBytes(hashBytes)\n}\n"
  },
  {
    "path": "chaincfg/chainhash/hash_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage chainhash\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"testing\"\n)\n\n// mainNetGenesisHash is the hash of the first block in the block chain for the\n// main network (genesis block).\nvar mainNetGenesisHash = Hash([HashSize]byte{ // Make go vet happy.\n\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,\n})\n\n// TestHash tests the Hash API.\nfunc TestHash(t *testing.T) {\n\t// Hash of block 234439.\n\tblockHashStr := \"14a0810ac680a3eb3f82edc878cea25ec41d6b790744e5daeef\"\n\tblockHash, err := NewHashFromStr(blockHashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Hash of block 234440 as byte slice.\n\tbuf := []byte{\n\t\t0x79, 0xa6, 0x1a, 0xdb, 0xc6, 0xe5, 0xa2, 0xe1,\n\t\t0x39, 0xd2, 0x71, 0x3a, 0x54, 0x6e, 0xc7, 0xc8,\n\t\t0x75, 0x63, 0x2e, 0x75, 0xf1, 0xdf, 0x9c, 0x3f,\n\t\t0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t}\n\n\thash, err := NewHash(buf)\n\tif err != nil {\n\t\tt.Errorf(\"NewHash: unexpected error %v\", err)\n\t}\n\n\t// Ensure proper size.\n\tif len(hash) != HashSize {\n\t\tt.Errorf(\"NewHash: hash length mismatch - got: %v, want: %v\",\n\t\t\tlen(hash), HashSize)\n\t}\n\n\t// Ensure contents match.\n\tif !bytes.Equal(hash[:], buf) {\n\t\tt.Errorf(\"NewHash: hash contents mismatch - got: %v, want: %v\",\n\t\t\thash[:], buf)\n\t}\n\n\t// Ensure contents of hash of block 234440 don't match 234439.\n\tif hash.IsEqual(blockHash) {\n\t\tt.Errorf(\"IsEqual: hash contents should not match - got: %v, want: %v\",\n\t\t\thash, blockHash)\n\t}\n\n\t// Set hash from byte slice and ensure contents match.\n\terr = hash.SetBytes(blockHash.CloneBytes())\n\tif err != nil {\n\t\tt.Errorf(\"SetBytes: %v\", err)\n\t}\n\tif !hash.IsEqual(blockHash) {\n\t\tt.Errorf(\"IsEqual: hash contents mismatch - got: %v, want: %v\",\n\t\t\thash, blockHash)\n\t}\n\n\t// Ensure nil hashes are handled properly.\n\tif !(*Hash)(nil).IsEqual(nil) {\n\t\tt.Error(\"IsEqual: nil hashes should match\")\n\t}\n\tif hash.IsEqual(nil) {\n\t\tt.Error(\"IsEqual: non-nil hash matches nil hash\")\n\t}\n\n\t// Invalid size for SetBytes.\n\terr = hash.SetBytes([]byte{0x00})\n\tif err == nil {\n\t\tt.Errorf(\"SetBytes: failed to received expected err - got: nil\")\n\t}\n\n\t// Invalid size for NewHash.\n\tinvalidHash := make([]byte, HashSize+1)\n\t_, err = NewHash(invalidHash)\n\tif err == nil {\n\t\tt.Errorf(\"NewHash: failed to received expected err - got: nil\")\n\t}\n}\n\n// TestHashString  tests the stringized output for hashes.\nfunc TestHashString(t *testing.T) {\n\t// Block 100000 hash.\n\twantStr := \"000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506\"\n\thash := Hash([HashSize]byte{ // Make go vet happy.\n\t\t0x06, 0xe5, 0x33, 0xfd, 0x1a, 0xda, 0x86, 0x39,\n\t\t0x1f, 0x3f, 0x6c, 0x34, 0x32, 0x04, 0xb0, 0xd2,\n\t\t0x78, 0xd4, 0xaa, 0xec, 0x1c, 0x0b, 0x20, 0xaa,\n\t\t0x27, 0xba, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t})\n\n\thashStr := hash.String()\n\tif hashStr != wantStr {\n\t\tt.Errorf(\"String: wrong hash string - got %v, want %v\",\n\t\t\thashStr, wantStr)\n\t}\n}\n\n// TestNewHashFromStr executes tests against the NewHashFromStr function.\nfunc TestNewHashFromStr(t *testing.T) {\n\ttests := []struct {\n\t\tin   string\n\t\twant Hash\n\t\terr  error\n\t}{\n\t\t// Genesis hash.\n\t\t{\n\t\t\t\"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\",\n\t\t\tmainNetGenesisHash,\n\t\t\tnil,\n\t\t},\n\n\t\t// Genesis hash with stripped leading zeros.\n\t\t{\n\t\t\t\"19d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\",\n\t\t\tmainNetGenesisHash,\n\t\t\tnil,\n\t\t},\n\n\t\t// Empty string.\n\t\t{\n\t\t\t\"\",\n\t\t\tHash{},\n\t\t\tnil,\n\t\t},\n\n\t\t// Single digit hash.\n\t\t{\n\t\t\t\"1\",\n\t\t\tHash([HashSize]byte{ // Make go vet happy.\n\t\t\t\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t}),\n\t\t\tnil,\n\t\t},\n\n\t\t// Block 203707 with stripped leading zeros.\n\t\t{\n\t\t\t\"3264bc2ac36a60840790ba1d475d01367e7c723da941069e9dc\",\n\t\t\tHash([HashSize]byte{ // Make go vet happy.\n\t\t\t\t0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7,\n\t\t\t\t0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b,\n\t\t\t\t0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b,\n\t\t\t\t0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t}),\n\t\t\tnil,\n\t\t},\n\n\t\t// Hash string that is too long.\n\t\t{\n\t\t\t\"01234567890123456789012345678901234567890123456789012345678912345\",\n\t\t\tHash{},\n\t\t\tErrHashStrSize,\n\t\t},\n\n\t\t// Hash string that is contains non-hex chars.\n\t\t{\n\t\t\t\"abcdefg\",\n\t\t\tHash{},\n\t\t\thex.InvalidByteError('g'),\n\t\t},\n\t}\n\n\tunexpectedErrStr := \"NewHashFromStr #%d failed to detect expected error - got: %v want: %v\"\n\tunexpectedResultStr := \"NewHashFromStr #%d got: %v want: %v\"\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult, err := NewHashFromStr(test.in)\n\t\tif err != test.err {\n\t\t\tt.Errorf(unexpectedErrStr, i, err, test.err)\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\t// Got expected error. Move on to the next test.\n\t\t\tcontinue\n\t\t}\n\t\tif !test.want.IsEqual(result) {\n\t\t\tt.Errorf(unexpectedResultStr, i, result, &test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestHashJsonMarshal tests json marshal and unmarshal.\nfunc TestHashJsonMarshal(t *testing.T) {\n\thashStr := \"000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506\"\n\tlegacyHashStr := []byte(\"[6,229,51,253,26,218,134,57,31,63,108,52,50,4,176,210,120,212,170,236,28,11,32,170,39,186,3,0,0,0,0,0]\")\n\n\thash, err := NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr error:%v, hashStr:%s\", err, hashStr)\n\t}\n\n\thashBytes, err := json.Marshal(hash)\n\tif err != nil {\n\t\tt.Errorf(\"Marshal json error:%v, hash:%v\", err, hashBytes)\n\t}\n\n\tvar newHash Hash\n\terr = json.Unmarshal(hashBytes, &newHash)\n\tif err != nil {\n\t\tt.Errorf(\"Unmarshal json error:%v, hash:%v\", err, hashBytes)\n\t}\n\n\tif !hash.IsEqual(&newHash) {\n\t\tt.Errorf(\"String: wrong hash string - got %v, want %v\", newHash.String(), hashStr)\n\t}\n\n\terr = newHash.UnmarshalJSON(legacyHashStr)\n\tif err != nil {\n\t\tt.Errorf(\"Unmarshal legacy json error:%v, hash:%v\", err, legacyHashStr)\n\t}\n\n\tif !hash.IsEqual(&newHash) {\n\t\tt.Errorf(\"String: wrong hash string - got %v, want %v\", newHash.String(), hashStr)\n\t}\n}\n"
  },
  {
    "path": "chaincfg/chainhash/hashfuncs.go",
    "content": "// Copyright (c) 2015 The Decred developers\n// Copyright (c) 2016-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage chainhash\n\nimport (\n\t\"crypto/sha256\"\n\t\"io\"\n)\n\n// HashB calculates hash(b) and returns the resulting bytes.\nfunc HashB(b []byte) []byte {\n\thash := sha256.Sum256(b)\n\treturn hash[:]\n}\n\n// HashH calculates hash(b) and returns the resulting bytes as a Hash.\nfunc HashH(b []byte) Hash {\n\treturn Hash(sha256.Sum256(b))\n}\n\n// DoubleHashB calculates hash(hash(b)) and returns the resulting bytes.\nfunc DoubleHashB(b []byte) []byte {\n\tfirst := sha256.Sum256(b)\n\tsecond := sha256.Sum256(first[:])\n\treturn second[:]\n}\n\n// DoubleHashH calculates hash(hash(b)) and returns the resulting bytes as a\n// Hash.\nfunc DoubleHashH(b []byte) Hash {\n\tfirst := sha256.Sum256(b)\n\treturn Hash(sha256.Sum256(first[:]))\n}\n\n// DoubleHashRaw calculates hash(hash(w)) where w is the resulting bytes from\n// the given serialize function and returns the resulting bytes as a Hash.\nfunc DoubleHashRaw(serialize func(w io.Writer) error) Hash {\n\t// Encode the transaction into the hash.  Ignore the error returns\n\t// since the only way the encode could fail is being out of memory\n\t// or due to nil pointers, both of which would cause a run-time panic.\n\th := sha256.New()\n\t_ = serialize(h)\n\n\t// This buf is here because Sum() will append the result to the passed\n\t// in byte slice.  Pre-allocating here saves an allocation on the second\n\t// hash as we can reuse it.  This allocation also does not escape to the\n\t// heap, saving an allocation.\n\tbuf := make([]byte, 0, HashSize)\n\tfirst := h.Sum(buf)\n\th.Reset()\n\th.Write(first)\n\tres := h.Sum(buf)\n\treturn *(*Hash)(res)\n}\n"
  },
  {
    "path": "chaincfg/chainhash/hashfuncs_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage chainhash\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"testing\"\n)\n\n// TestHashFuncs ensures the hash functions which perform hash(b) work as\n// expected.\nfunc TestHashFuncs(t *testing.T) {\n\ttests := []struct {\n\t\tout string\n\t\tin  string\n\t}{\n\t\t{\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\", \"\"},\n\t\t{\"ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb\", \"a\"},\n\t\t{\"fb8e20fc2e4c3f248c60c39bd652f3c1347298bb977b8b4d5903b85055620603\", \"ab\"},\n\t\t{\"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad\", \"abc\"},\n\t\t{\"88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589\", \"abcd\"},\n\t\t{\"36bbe50ed96841d10443bcb670d6554f0a34b761be67ec9c4a8ad2c0c44ca42c\", \"abcde\"},\n\t\t{\"bef57ec7f53a6d40beb640a780a639c83bc29ac8a9816f1fc6c5c6dcd93c4721\", \"abcdef\"},\n\t\t{\"7d1a54127b222502f5b79b5fb0803061152a44f92b37e23c6527baf665d4da9a\", \"abcdefg\"},\n\t\t{\"9c56cc51b374c3ba189210d5b6d4bf57790d351c96c47c02190ecf1e430635ab\", \"abcdefgh\"},\n\t\t{\"19cc02f26df43cc571bc9ed7b0c4d29224a3ec229529221725ef76d021c8326f\", \"abcdefghi\"},\n\t\t{\"72399361da6a7754fec986dca5b7cbaf1c810a28ded4abaf56b2106d06cb78b0\", \"abcdefghij\"},\n\t\t{\"a144061c271f152da4d151034508fed1c138b8c976339de229c3bb6d4bbb4fce\", \"Discard medicine more than two years old.\"},\n\t\t{\"6dae5caa713a10ad04b46028bf6dad68837c581616a1589a265a11288d4bb5c4\", \"He who has a shady past knows that nice guys finish last.\"},\n\t\t{\"ae7a702a9509039ddbf29f0765e70d0001177914b86459284dab8b348c2dce3f\", \"I wouldn't marry him with a ten foot pole.\"},\n\t\t{\"6748450b01c568586715291dfa3ee018da07d36bb7ea6f180c1af6270215c64f\", \"Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave\"},\n\t\t{\"14b82014ad2b11f661b5ae6a99b75105c2ffac278cd071cd6c05832793635774\", \"The days of the digital watch are numbered.  -Tom Stoppard\"},\n\t\t{\"7102cfd76e2e324889eece5d6c41921b1e142a4ac5a2692be78803097f6a48d8\", \"Nepal premier won't resign.\"},\n\t\t{\"23b1018cd81db1d67983c5f7417c44da9deb582459e378d7a068552ea649dc9f\", \"For every action there is an equal and opposite government program.\"},\n\t\t{\"8001f190dfb527261c4cfcab70c98e8097a7a1922129bc4096950e57c7999a5a\", \"His money is twice tainted: 'taint yours and 'taint mine.\"},\n\t\t{\"8c87deb65505c3993eb24b7a150c4155e82eee6960cf0c3a8114ff736d69cad5\", \"There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977\"},\n\t\t{\"bfb0a67a19cdec3646498b2e0f751bddc41bba4b7f30081b0b932aad214d16d7\", \"It's a tiny change to the code and not completely disgusting. - Bob Manchek\"},\n\t\t{\"7f9a0b9bf56332e19f5a0ec1ad9c1425a153da1c624868fda44561d6b74daf36\", \"size:  a.out:  bad magic\"},\n\t\t{\"b13f81b8aad9e3666879af19886140904f7f429ef083286195982a7588858cfc\", \"The major problem is with sendmail.  -Mark Horton\"},\n\t\t{\"b26c38d61519e894480c70c8374ea35aa0ad05b2ae3d6674eec5f52a69305ed4\", \"Give me a rock, paper and scissors and I will move the world.  CCFestoon\"},\n\t\t{\"049d5e26d4f10222cd841a119e38bd8d2e0d1129728688449575d4ff42b842c1\", \"If the enemy is within range, then so are you.\"},\n\t\t{\"0e116838e3cc1c1a14cd045397e29b4d087aa11b0853fc69ec82e90330d60949\", \"It's well we cannot hear the screams/That we create in others' dreams.\"},\n\t\t{\"4f7d8eb5bcf11de2a56b971021a444aa4eafd6ecd0f307b5109e4e776cd0fe46\", \"You remind me of a TV show, but that's all right: I watch it anyway.\"},\n\t\t{\"61c0cc4c4bd8406d5120b3fb4ebc31ce87667c162f29468b3c779675a85aebce\", \"C is as portable as Stonehedge!!\"},\n\t\t{\"1fb2eb3688093c4a3f80cd87a5547e2ce940a4f923243a79a2a1e242220693ac\", \"Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley\"},\n\t\t{\"395585ce30617b62c80b93e8208ce866d4edc811a177fdb4b82d3911d8696423\", \"The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule\"},\n\t\t{\"4f9b189a13d030838269dce846b16a1ce9ce81fe63e65de2f636863336a98fe6\", \"How can you write a big system without C++?  -Paul Glick\"},\n\t}\n\n\t// Ensure the hash function which returns a byte slice returns the\n\t// expected result.\n\tfor _, test := range tests {\n\t\th := fmt.Sprintf(\"%x\", HashB([]byte(test.in)))\n\t\tif h != test.out {\n\t\t\tt.Errorf(\"HashB(%q) = %s, want %s\", test.in, h, test.out)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// Ensure the hash function which returns a Hash returns the expected\n\t// result.\n\tfor _, test := range tests {\n\t\thash := HashH([]byte(test.in))\n\t\th := fmt.Sprintf(\"%x\", hash[:])\n\t\tif h != test.out {\n\t\t\tt.Errorf(\"HashH(%q) = %s, want %s\", test.in, h, test.out)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestDoubleHashFuncs ensures the hash functions which perform hash(hash(b))\n// work as expected.\nfunc TestDoubleHashFuncs(t *testing.T) {\n\ttests := []struct {\n\t\tout string\n\t\tin  string\n\t}{\n\t\t{\"5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456\", \"\"},\n\t\t{\"bf5d3affb73efd2ec6c36ad3112dd933efed63c4e1cbffcfa88e2759c144f2d8\", \"a\"},\n\t\t{\"a1ff8f1856b5e24e32e3882edd4a021f48f28a8b21854b77fdef25a97601aace\", \"ab\"},\n\t\t{\"4f8b42c22dd3729b519ba6f68d2da7cc5b2d606d05daed5ad5128cc03e6c6358\", \"abc\"},\n\t\t{\"7e9c158ecd919fa439a7a214c9fc58b85c3177fb1613bdae41ee695060e11bc6\", \"abcd\"},\n\t\t{\"1d72b6eb7ba8b9709c790b33b40d8c46211958e13cf85dbcda0ed201a99f2fb9\", \"abcde\"},\n\t\t{\"ce65d4756128f0035cba4d8d7fae4e9fa93cf7fdf12c0f83ee4a0e84064bef8a\", \"abcdef\"},\n\t\t{\"dad6b965ad86b880ceb6993f98ebeeb242de39f6b87a458c6510b5a15ff7bbf1\", \"abcdefg\"},\n\t\t{\"b9b12e7125f73fda20b8c4161fb9b4b146c34cf88595a1e0503ca2cf44c86bc4\", \"abcdefgh\"},\n\t\t{\"546db09160636e98405fbec8464a84b6464b32514db259e235eae0445346ffb7\", \"abcdefghi\"},\n\t\t{\"27635cf23fdf8a10f4cb2c52ade13038c38718c6d7ca716bfe726111a57ad201\", \"abcdefghij\"},\n\t\t{\"ae0d8e0e7c0336f0c3a72cefa4f24b625a6a460417a921d066058a0b81e23429\", \"Discard medicine more than two years old.\"},\n\t\t{\"eeb56d02cf638f87ea8f11ebd5b0201afcece984d87be458578d3cfb51978f1b\", \"He who has a shady past knows that nice guys finish last.\"},\n\t\t{\"dc640bf529608a381ea7065ecbcd0443b95f6e4c008de6e134aff1d36bd4b9d8\", \"I wouldn't marry him with a ten foot pole.\"},\n\t\t{\"42e54375e60535eb07fc15c6350e10f2c22526f84db1d6f6bba925e154486f33\", \"Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave\"},\n\t\t{\"4ed6aa9b88c84afbf928710b03714de69e2ad967c6a78586069adcb4c470d150\", \"The days of the digital watch are numbered.  -Tom Stoppard\"},\n\t\t{\"590c24d1877c1919fad12fe01a8796999e9d20cfbf9bc9bc72fa0bd69f0b04dd\", \"Nepal premier won't resign.\"},\n\t\t{\"37d270687ee8ebafcd3c1a32f56e1e1304b3c93f252cb637d57a66d59c475eca\", \"For every action there is an equal and opposite government program.\"},\n\t\t{\"306828fd89278838bb1c544c3032a1fd25ea65c40bba586437568828a5fbe944\", \"His money is twice tainted: 'taint yours and 'taint mine.\"},\n\t\t{\"49965777eac71faf1e2fb0f6b239ba2fae770977940fd827bcbfe15def6ded53\", \"There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977\"},\n\t\t{\"df99ee4e87dd3fb07922dee7735997bbae8f26db20c86137d4219fc4a37b77c3\", \"It's a tiny change to the code and not completely disgusting. - Bob Manchek\"},\n\t\t{\"920667c84a15b5ee3df4620169f5c0ec930cea0c580858e50e68848871ed65b4\", \"size:  a.out:  bad magic\"},\n\t\t{\"5e817fe20848a4a3932db68e90f8d54ec1b09603f0c99fdc051892b776acd462\", \"The major problem is with sendmail.  -Mark Horton\"},\n\t\t{\"6a9d47248ed38852f5f4b2e37e7dfad0ce8d1da86b280feef94ef267e468cff2\", \"Give me a rock, paper and scissors and I will move the world.  CCFestoon\"},\n\t\t{\"2e7aa1b362c94efdbff582a8bd3f7f61c8ce4c25bbde658ef1a7ae1010e2126f\", \"If the enemy is within range, then so are you.\"},\n\t\t{\"e6729d51240b1e1da76d822fd0c55c75e409bcb525674af21acae1f11667c8ca\", \"It's well we cannot hear the screams/That we create in others' dreams.\"},\n\t\t{\"09945e4d2743eb669f85e4097aa1cc39ea680a0b2ae2a65a42a5742b3b809610\", \"You remind me of a TV show, but that's all right: I watch it anyway.\"},\n\t\t{\"1018d8b2870a974887c5174360f0fbaf27958eef15b24522a605c5dae4ae0845\", \"C is as portable as Stonehedge!!\"},\n\t\t{\"97c76b83c6645c78c261dcdc55d44af02d9f1df8057f997fd08c310c903624d5\", \"Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley\"},\n\t\t{\"6bcbf25469e9544c5b5806b24220554fedb6695ba9b1510a76837414f7adb113\", \"The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule\"},\n\t\t{\"1041988b06835481f0845be2a54f4628e1da26145b2de7ad1be3bb643cef9d4f\", \"How can you write a big system without C++?  -Paul Glick\"},\n\t}\n\n\t// Ensure the hash function which returns a byte slice returns the\n\t// expected result.\n\tfor _, test := range tests {\n\t\th := fmt.Sprintf(\"%x\", DoubleHashB([]byte(test.in)))\n\t\tif h != test.out {\n\t\t\tt.Errorf(\"DoubleHashB(%q) = %s, want %s\", test.in, h,\n\t\t\t\ttest.out)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// Ensure the hash function which returns a Hash returns the expected\n\t// result.\n\tfor _, test := range tests {\n\t\thash := DoubleHashH([]byte(test.in))\n\t\th := fmt.Sprintf(\"%x\", hash[:])\n\t\tif h != test.out {\n\t\t\tt.Errorf(\"DoubleHashH(%q) = %s, want %s\", test.in, h,\n\t\t\t\ttest.out)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// Ensure the hash function which accepts a hash.Hash returns the expected\n\t// result when given a hash.Hash that is of type SHA256.\n\tfor _, test := range tests {\n\t\tserialize := func(w io.Writer) error {\n\t\t\tw.Write([]byte(test.in))\n\t\t\treturn nil\n\t\t}\n\t\thash := DoubleHashRaw(serialize)\n\t\th := fmt.Sprintf(\"%x\", hash[:])\n\t\tif h != test.out {\n\t\t\tt.Errorf(\"DoubleHashRaw(%q) = %s, want %s\", test.in, h,\n\t\t\t\ttest.out)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "chaincfg/deployment_time_frame.go",
    "content": "package chaincfg\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nvar (\n\t// ErrNoBlockClock is returned when an operation fails due to lack of\n\t// synchornization with the current up to date block clock.\n\tErrNoBlockClock = fmt.Errorf(\"no block clock synchronized\")\n)\n\n// BlockClock is an abstraction over the past median time computation. The past\n// median time computation is used in several consensus checks such as CSV, and\n// also BIP 9 version bits. This interface allows callers to abstract away the\n// computation of the past median time from the perspective of a given block\n// header.\ntype BlockClock interface {\n\t// PastMedianTime returns the past median time from the PoV of the\n\t// passed block header. The past median time is the median time of the\n\t// 11 blocks prior to the passed block header.\n\tPastMedianTime(*wire.BlockHeader) (time.Time, error)\n}\n\n// ConsensusDeploymentStarter determines if a given consensus deployment has\n// started. A deployment has started once according to the current \"time\", the\n// deployment is eligible for activation once a perquisite condition has\n// passed.\ntype ConsensusDeploymentStarter interface {\n\t// HasStarted returns true if the consensus deployment has started.\n\tHasStarted(*wire.BlockHeader) (bool, error)\n}\n\n// ClockConsensusDeploymentStarter is a more specialized version of the\n// ConsensusDeploymentStarter that uses a BlockClock in order to determine if a\n// deployment has started or not.\n//\n// NOTE: Any calls to HasStarted will _fail_ with ErrNoBlockClock if they\n// happen before SynchronizeClock is executed.\ntype ClockConsensusDeploymentStarter interface {\n\tConsensusDeploymentStarter\n\n\t// SynchronizeClock synchronizes the target ConsensusDeploymentStarter\n\t// with the current up-to date BlockClock.\n\tSynchronizeClock(clock BlockClock)\n}\n\n// ConsensusDeploymentEnder determines if a given consensus deployment has\n// ended. A deployment has ended once according got eh current \"time\", the\n// deployment is no longer eligible for activation.\ntype ConsensusDeploymentEnder interface {\n\t// HasEnded returns true if the consensus deployment has ended.\n\tHasEnded(*wire.BlockHeader) (bool, error)\n}\n\n// ClockConsensusDeploymentEnder is a more specialized version of the\n// ConsensusDeploymentEnder that uses a BlockClock in order to determine if a\n// deployment has started or not.\n//\n// NOTE: Any calls to HasEnded will _fail_ with ErrNoBlockClock if they\n// happen before SynchronizeClock is executed.\ntype ClockConsensusDeploymentEnder interface {\n\tConsensusDeploymentEnder\n\n\t// SynchronizeClock synchronizes the target ConsensusDeploymentStarter\n\t// with the current up-to date BlockClock.\n\tSynchronizeClock(clock BlockClock)\n}\n\n// MedianTimeDeploymentStarter is a ClockConsensusDeploymentStarter that uses\n// the median time past of a target block node to determine if a deployment has\n// started.\ntype MedianTimeDeploymentStarter struct {\n\tblockClock BlockClock\n\n\tstartTime time.Time\n}\n\n// NewMedianTimeDeploymentStarter returns a new instance of a\n// MedianTimeDeploymentStarter for a given start time. Using a time.Time\n// instance where IsZero() is true, indicates that a deployment should be\n// considered to always have been started.\nfunc NewMedianTimeDeploymentStarter(startTime time.Time) *MedianTimeDeploymentStarter {\n\treturn &MedianTimeDeploymentStarter{\n\t\tstartTime: startTime,\n\t}\n}\n\n// SynchronizeClock synchronizes the target ConsensusDeploymentStarter with the\n// current up-to date BlockClock.\nfunc (m *MedianTimeDeploymentStarter) SynchronizeClock(clock BlockClock) {\n\tm.blockClock = clock\n}\n\n// HasStarted returns true if the consensus deployment has started.\nfunc (m *MedianTimeDeploymentStarter) HasStarted(blkHeader *wire.BlockHeader) (bool, error) {\n\tswitch {\n\t// If we haven't yet been synchronized with a block clock, then we\n\t// can't tell the time, so we'll fail.\n\tcase m.blockClock == nil:\n\t\treturn false, ErrNoBlockClock\n\n\t// If the time is \"zero\", then the deployment has always started.\n\tcase m.startTime.IsZero():\n\t\treturn true, nil\n\t}\n\n\tmedianTime, err := m.blockClock.PastMedianTime(blkHeader)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// We check both after and equal here as after will fail for equivalent\n\t// times, and we want to be inclusive.\n\treturn medianTime.After(m.startTime) || medianTime.Equal(m.startTime), nil\n}\n\n// StartTime returns the raw start time of the deployment.\nfunc (m *MedianTimeDeploymentStarter) StartTime() time.Time {\n\treturn m.startTime\n}\n\n// A compile-time assertion to ensure MedianTimeDeploymentStarter implements\n// the ClockConsensusDeploymentStarter interface.\nvar _ ClockConsensusDeploymentStarter = (*MedianTimeDeploymentStarter)(nil)\n\n// MedianTimeDeploymentEnder is a ClockConsensusDeploymentEnder that uses the\n// median time past of a target block to determine if a deployment has ended.\ntype MedianTimeDeploymentEnder struct {\n\tblockClock BlockClock\n\n\tendTime time.Time\n}\n\n// NewMedianTimeDeploymentEnder returns a new instance of the\n// MedianTimeDeploymentEnder anchored around the passed endTime.  Using a\n// time.Time instance where IsZero() is true, indicates that a deployment\n// should be considered to never end.\nfunc NewMedianTimeDeploymentEnder(endTime time.Time) *MedianTimeDeploymentEnder {\n\treturn &MedianTimeDeploymentEnder{\n\t\tendTime: endTime,\n\t}\n}\n\n// HasEnded returns true if the deployment has ended.\nfunc (m *MedianTimeDeploymentEnder) HasEnded(blkHeader *wire.BlockHeader) (bool, error) {\n\tswitch {\n\t// If we haven't yet been synchronized with a block clock, then we can't tell\n\t// the time, so we'll we haven't yet been synchronized with a block\n\t// clock, then w can't tell the time, so we'll fail.\n\tcase m.blockClock == nil:\n\t\treturn false, ErrNoBlockClock\n\n\t// If the time is \"zero\", then the deployment never ends.\n\tcase m.endTime.IsZero():\n\t\treturn false, nil\n\t}\n\n\tmedianTime, err := m.blockClock.PastMedianTime(blkHeader)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// We check both after and equal here as after will fail for equivalent\n\t// times, and we want to be inclusive.\n\treturn medianTime.After(m.endTime) || medianTime.Equal(m.endTime), nil\n}\n\n// MedianTimeDeploymentEnder returns the raw end time of the deployment.\nfunc (m *MedianTimeDeploymentEnder) EndTime() time.Time {\n\treturn m.endTime\n}\n\n// SynchronizeClock synchronizes the target ConsensusDeploymentEnder with the\n// current up-to date BlockClock.\nfunc (m *MedianTimeDeploymentEnder) SynchronizeClock(clock BlockClock) {\n\tm.blockClock = clock\n}\n\n// A compile-time assertion to ensure MedianTimeDeploymentEnder implements the\n// ClockConsensusDeploymentStarter interface.\nvar _ ClockConsensusDeploymentEnder = (*MedianTimeDeploymentEnder)(nil)\n"
  },
  {
    "path": "chaincfg/doc.go",
    "content": "// Package chaincfg defines chain configuration parameters.\n//\n// In addition to the main Bitcoin network, which is intended for the transfer\n// of monetary value, there also exists two currently active standard networks:\n// regression test and testnet (version 3).  These networks are incompatible\n// with each other (each sharing a different genesis block) and software should\n// handle errors where input intended for one network is used on an application\n// instance running on a different network.\n//\n// For library packages, chaincfg provides the ability to lookup chain\n// parameters and encoding magics when passed a *Params.  Older APIs not updated\n// to the new convention of passing a *Params may lookup the parameters for a\n// wire.BitcoinNet using ParamsForNet, but be aware that this usage is\n// deprecated and will be removed from chaincfg in the future.\n//\n// For main packages, a (typically global) var may be assigned the address of\n// one of the standard Param vars for use as the application's \"active\" network.\n// When a network parameter is needed, it may then be looked up through this\n// variable (either directly, or hidden in a library call).\n//\n//\tpackage main\n//\n//\timport (\n//\t        \"flag\"\n//\t        \"fmt\"\n//\t        \"log\"\n//\n//\t        \"github.com/btcsuite/btcd/btcutil\"\n//\t        \"github.com/btcsuite/btcd/chaincfg\"\n//\t)\n//\n//\tvar testnet = flag.Bool(\"testnet\", false, \"operate on the testnet Bitcoin network\")\n//\n//\t// By default (without -testnet), use mainnet.\n//\tvar chainParams = &chaincfg.MainNetParams\n//\n//\tfunc main() {\n//\t        flag.Parse()\n//\n//\t        // Modify active network parameters if operating on testnet.\n//\t        if *testnet {\n//\t                chainParams = &chaincfg.TestNet3Params\n//\t        }\n//\n//\t        // later...\n//\n//\t        // Create and print new payment address, specific to the active network.\n//\t        pubKeyHash := make([]byte, 20)\n//\t        addr, err := btcutil.NewAddressPubKeyHash(pubKeyHash, chainParams)\n//\t        if err != nil {\n//\t                log.Fatal(err)\n//\t        }\n//\t        fmt.Println(addr)\n//\t}\n//\n// If an application does not use one of the three standard Bitcoin networks,\n// a new Params struct may be created which defines the parameters for the\n// non-standard network.  As a general rule of thumb, all network parameters\n// should be unique to the network, but parameter collisions can still occur\n// (unfortunately, this is the case with regtest and testnet3 sharing magics).\npackage chaincfg\n"
  },
  {
    "path": "chaincfg/genesis.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage chaincfg\n\nimport (\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// genesisCoinbaseTx is the coinbase transaction for the genesis blocks for\n// the main network, regression test network, and test network (version 3).\nvar genesisCoinbaseTx = wire.MsgTx{\n\tVersion: 1,\n\tTxIn: []*wire.TxIn{\n\t\t{\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\tIndex: 0xffffffff,\n\t\t\t},\n\t\t\tSignatureScript: []byte{\n\t\t\t\t0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04, 0x45, /* |.......E| */\n\t\t\t\t0x54, 0x68, 0x65, 0x20, 0x54, 0x69, 0x6d, 0x65, /* |The Time| */\n\t\t\t\t0x73, 0x20, 0x30, 0x33, 0x2f, 0x4a, 0x61, 0x6e, /* |s 03/Jan| */\n\t\t\t\t0x2f, 0x32, 0x30, 0x30, 0x39, 0x20, 0x43, 0x68, /* |/2009 Ch| */\n\t\t\t\t0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x6f, 0x72, /* |ancellor| */\n\t\t\t\t0x20, 0x6f, 0x6e, 0x20, 0x62, 0x72, 0x69, 0x6e, /* | on brin| */\n\t\t\t\t0x6b, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x63, /* |k of sec|*/\n\t\t\t\t0x6f, 0x6e, 0x64, 0x20, 0x62, 0x61, 0x69, 0x6c, /* |ond bail| */\n\t\t\t\t0x6f, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, /* |out for |*/\n\t\t\t\t0x62, 0x61, 0x6e, 0x6b, 0x73, /* |banks| */\n\t\t\t},\n\t\t\tSequence: 0xffffffff,\n\t\t},\n\t},\n\tTxOut: []*wire.TxOut{\n\t\t{\n\t\t\tValue: 0x12a05f200,\n\t\t\tPkScript: []byte{\n\t\t\t\t0x41, 0x04, 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, /* |A.g....U| */\n\t\t\t\t0x48, 0x27, 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, /* |H'.g..q0| */\n\t\t\t\t0xb7, 0x10, 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, /* |..\\..(.9| */\n\t\t\t\t0x09, 0xa6, 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, /* |..yb...a| */\n\t\t\t\t0xde, 0xb6, 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, /* |..I..?L.| */\n\t\t\t\t0x38, 0xc4, 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, /* |8..U....| */\n\t\t\t\t0x12, 0xde, 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, /* |..\\8M...| */\n\t\t\t\t0x8d, 0x57, 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, /* |.W.Lp+k.| */\n\t\t\t\t0x1d, 0x5f, 0xac, /* |._.| */\n\t\t\t},\n\t\t},\n\t},\n\tLockTime: 0,\n}\n\n// genesisHash is the hash of the first block in the block chain for the main\n// network (genesis block).\nvar genesisHash = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,\n})\n\n// genesisMerkleRoot is the hash of the first transaction in the genesis block\n// for the main network.\nvar genesisMerkleRoot = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2,\n\t0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61,\n\t0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32,\n\t0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a,\n})\n\n// genesisBlock defines the genesis block of the block chain which serves as the\n// public transaction ledger for the main network.\nvar genesisBlock = wire.MsgBlock{\n\tHeader: wire.BlockHeader{\n\t\tVersion:    1,\n\t\tPrevBlock:  chainhash.Hash{},         // 0000000000000000000000000000000000000000000000000000000000000000\n\t\tMerkleRoot: genesisMerkleRoot,        // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\n\t\tTimestamp:  time.Unix(0x495fab29, 0), // 2009-01-03 18:15:05 +0000 UTC\n\t\tBits:       0x1d00ffff,               // 486604799 [00000000ffff0000000000000000000000000000000000000000000000000000]\n\t\tNonce:      0x7c2bac1d,               // 2083236893\n\t},\n\tTransactions: []*wire.MsgTx{&genesisCoinbaseTx},\n}\n\n// regTestGenesisHash is the hash of the first block in the block chain for the\n// regression test network (genesis block).\nvar regTestGenesisHash = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t0x06, 0x22, 0x6e, 0x46, 0x11, 0x1a, 0x0b, 0x59,\n\t0xca, 0xaf, 0x12, 0x60, 0x43, 0xeb, 0x5b, 0xbf,\n\t0x28, 0xc3, 0x4f, 0x3a, 0x5e, 0x33, 0x2a, 0x1f,\n\t0xc7, 0xb2, 0xb7, 0x3c, 0xf1, 0x88, 0x91, 0x0f,\n})\n\n// regTestGenesisMerkleRoot is the hash of the first transaction in the genesis\n// block for the regression test network.  It is the same as the merkle root for\n// the main network.\nvar regTestGenesisMerkleRoot = genesisMerkleRoot\n\n// regTestGenesisBlock defines the genesis block of the block chain which serves\n// as the public transaction ledger for the regression test network.\nvar regTestGenesisBlock = wire.MsgBlock{\n\tHeader: wire.BlockHeader{\n\t\tVersion:    1,\n\t\tPrevBlock:  chainhash.Hash{},         // 0000000000000000000000000000000000000000000000000000000000000000\n\t\tMerkleRoot: regTestGenesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\n\t\tTimestamp:  time.Unix(1296688602, 0), // 2011-02-02 23:16:42 +0000 UTC\n\t\tBits:       0x207fffff,               // 545259519 [7fffff0000000000000000000000000000000000000000000000000000000000]\n\t\tNonce:      2,\n\t},\n\tTransactions: []*wire.MsgTx{&genesisCoinbaseTx},\n}\n\n// testNet3GenesisHash is the hash of the first block in the block chain for the\n// test network (version 3).\nvar testNet3GenesisHash = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t0x43, 0x49, 0x7f, 0xd7, 0xf8, 0x26, 0x95, 0x71,\n\t0x08, 0xf4, 0xa3, 0x0f, 0xd9, 0xce, 0xc3, 0xae,\n\t0xba, 0x79, 0x97, 0x20, 0x84, 0xe9, 0x0e, 0xad,\n\t0x01, 0xea, 0x33, 0x09, 0x00, 0x00, 0x00, 0x00,\n})\n\n// testNet3GenesisMerkleRoot is the hash of the first transaction in the genesis\n// block for the test network (version 3).  It is the same as the merkle root\n// for the main network.\nvar testNet3GenesisMerkleRoot = genesisMerkleRoot\n\n// testNet3GenesisBlock defines the genesis block of the block chain which\n// serves as the public transaction ledger for the test network (version 3).\nvar testNet3GenesisBlock = wire.MsgBlock{\n\tHeader: wire.BlockHeader{\n\t\tVersion:    1,\n\t\tPrevBlock:  chainhash.Hash{},          // 0000000000000000000000000000000000000000000000000000000000000000\n\t\tMerkleRoot: testNet3GenesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\n\t\tTimestamp:  time.Unix(1296688602, 0),  // 2011-02-02 23:16:42 +0000 UTC\n\t\tBits:       0x1d00ffff,                // 486604799 [00000000ffff0000000000000000000000000000000000000000000000000000]\n\t\tNonce:      0x18aea41a,                // 414098458\n\t},\n\tTransactions: []*wire.MsgTx{&genesisCoinbaseTx},\n}\n\n// testNet4GenesisTx is the transaction for the genesis blocks for test network (version 4).\nvar testNet4GenesisTx = wire.MsgTx{\n\tVersion: 1,\n\tTxIn: []*wire.TxIn{\n\t\t{\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\tIndex: 0xffffffff,\n\t\t\t},\n\t\t\tSignatureScript: []byte{\n\t\t\t\t// Message: `03/May/2024 000000000000000000001ebd58c244970b3aa9d783bb001011fbe8ea8e98e00e`\n\t\t\t\t0x4, 0xff, 0xff, 0x0, 0x1d, 0x1, 0x4, 0x4c,\n\t\t\t\t0x4c, 0x30, 0x33, 0x2f, 0x4d, 0x61, 0x79, 0x2f,\n\t\t\t\t0x32, 0x30, 0x32, 0x34, 0x20, 0x30, 0x30, 0x30,\n\t\t\t\t0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n\t\t\t\t0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n\t\t\t\t0x30, 0x31, 0x65, 0x62, 0x64, 0x35, 0x38, 0x63,\n\t\t\t\t0x32, 0x34, 0x34, 0x39, 0x37, 0x30, 0x62, 0x33,\n\t\t\t\t0x61, 0x61, 0x39, 0x64, 0x37, 0x38, 0x33, 0x62,\n\t\t\t\t0x62, 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x66,\n\t\t\t\t0x62, 0x65, 0x38, 0x65, 0x61, 0x38, 0x65, 0x39,\n\t\t\t\t0x38, 0x65, 0x30, 0x30, 0x65},\n\t\t\tSequence: 0xffffffff,\n\t\t},\n\t},\n\tTxOut: []*wire.TxOut{\n\t\t{\n\t\t\tValue: 0x12a05f200,\n\t\t\tPkScript: []byte{\n\t\t\t\t0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t\t\t0x0, 0x0, 0xac},\n\t\t},\n\t},\n\tLockTime: 0,\n}\n\n// testNet4GenesisHash is the hash of the first block in the block chain for the\n// test network (version 4).\nvar testNet4GenesisHash = chainhash.Hash([chainhash.HashSize]byte{\n\t0x43, 0xf0, 0x8b, 0xda, 0xb0, 0x50, 0xe3, 0x5b,\n\t0x56, 0x7c, 0x86, 0x4b, 0x91, 0xf4, 0x7f, 0x50,\n\t0xae, 0x72, 0x5a, 0xe2, 0xde, 0x53, 0xbc, 0xfb,\n\t0xba, 0xf2, 0x84, 0xda, 0x00, 0x00, 0x00, 0x00})\n\n// testNet4GenesisMerkleRoot is the hash of the first transaction in the genesis\n// block for the test network (version 4).  It is the same as the merkle root\n// for the main network.\nvar testNet4GenesisMerkleRoot = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t0x4e, 0x7b, 0x2b, 0x91, 0x28, 0xfe, 0x02, 0x91,\n\t0xdb, 0x06, 0x93, 0xaf, 0x2a, 0xe4, 0x18, 0xb7,\n\t0x67, 0xe6, 0x57, 0xcd, 0x40, 0x7e, 0x80, 0xcb,\n\t0x14, 0x34, 0x22, 0x1e, 0xae, 0xa7, 0xa0, 0x7a,\n})\n\n// testNet4GenesisBlock defines the genesis block of the block chain which\n// serves as the public transaction ledger for the test network (version 3).\nvar testNet4GenesisBlock = wire.MsgBlock{\n\tHeader: wire.BlockHeader{\n\t\tVersion:    1,\n\t\tPrevBlock:  chainhash.Hash{},          // 0000000000000000000000000000000000000000000000000000000000000000\n\t\tMerkleRoot: testNet4GenesisMerkleRoot, // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\n\t\tTimestamp:  time.Unix(1714777860, 0),  // 2024-05-03 23:11:00 +0000 UTC\n\t\tBits:       0x1d00ffff,                // 486604799 [00000000ffff0000000000000000000000000000000000000000000000000000]\n\t\tNonce:      0x17780cbb,                // 393743547\n\t},\n\tTransactions: []*wire.MsgTx{&testNet4GenesisTx},\n}\n\n// simNetGenesisHash is the hash of the first block in the block chain for the\n// simulation test network.\nvar simNetGenesisHash = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t0xf6, 0x7a, 0xd7, 0x69, 0x5d, 0x9b, 0x66, 0x2a,\n\t0x72, 0xff, 0x3d, 0x8e, 0xdb, 0xbb, 0x2d, 0xe0,\n\t0xbf, 0xa6, 0x7b, 0x13, 0x97, 0x4b, 0xb9, 0x91,\n\t0x0d, 0x11, 0x6d, 0x5c, 0xbd, 0x86, 0x3e, 0x68,\n})\n\n// simNetGenesisMerkleRoot is the hash of the first transaction in the genesis\n// block for the simulation test network.  It is the same as the merkle root for\n// the main network.\nvar simNetGenesisMerkleRoot = genesisMerkleRoot\n\n// simNetGenesisBlock defines the genesis block of the block chain which serves\n// as the public transaction ledger for the simulation test network.\nvar simNetGenesisBlock = wire.MsgBlock{\n\tHeader: wire.BlockHeader{\n\t\tVersion:    1,\n\t\tPrevBlock:  chainhash.Hash{},         // 0000000000000000000000000000000000000000000000000000000000000000\n\t\tMerkleRoot: simNetGenesisMerkleRoot,  // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\n\t\tTimestamp:  time.Unix(1401292357, 0), // 2014-05-28 15:52:37 +0000 UTC\n\t\tBits:       0x207fffff,               // 545259519 [7fffff0000000000000000000000000000000000000000000000000000000000]\n\t\tNonce:      2,\n\t},\n\tTransactions: []*wire.MsgTx{&genesisCoinbaseTx},\n}\n\n// sigNetGenesisHash is the hash of the first block in the block chain for the\n// signet test network.\nvar sigNetGenesisHash = chainhash.Hash{\n\t0xf6, 0x1e, 0xee, 0x3b, 0x63, 0xa3, 0x80, 0xa4,\n\t0x77, 0xa0, 0x63, 0xaf, 0x32, 0xb2, 0xbb, 0xc9,\n\t0x7c, 0x9f, 0xf9, 0xf0, 0x1f, 0x2c, 0x42, 0x25,\n\t0xe9, 0x73, 0x98, 0x81, 0x08, 0x00, 0x00, 0x00,\n}\n\n// sigNetGenesisMerkleRoot is the hash of the first transaction in the genesis\n// block for the signet test network. It is the same as the merkle root for\n// the main network.\nvar sigNetGenesisMerkleRoot = genesisMerkleRoot\n\n// sigNetGenesisBlock defines the genesis block of the block chain which serves\n// as the public transaction ledger for the signet test network.\nvar sigNetGenesisBlock = wire.MsgBlock{\n\tHeader: wire.BlockHeader{\n\t\tVersion:    1,\n\t\tPrevBlock:  chainhash.Hash{},         // 0000000000000000000000000000000000000000000000000000000000000000\n\t\tMerkleRoot: sigNetGenesisMerkleRoot,  // 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\n\t\tTimestamp:  time.Unix(1598918400, 0), // 2020-09-01 00:00:00 +0000 UTC\n\t\tBits:       0x1e0377ae,               // 503543726 [00000377ae000000000000000000000000000000000000000000000000000000]\n\t\tNonce:      52613770,\n\t},\n\tTransactions: []*wire.MsgTx{&genesisCoinbaseTx},\n}\n"
  },
  {
    "path": "chaincfg/genesis_test.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage chaincfg\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestGenesisBlock tests the genesis block of the main network for validity by\n// checking the encoded bytes and hashes.\nfunc TestGenesisBlock(t *testing.T) {\n\t// Encode the genesis block to raw bytes.\n\tvar buf bytes.Buffer\n\terr := MainNetParams.GenesisBlock.Serialize(&buf)\n\tif err != nil {\n\t\tt.Fatalf(\"TestGenesisBlock: %v\", err)\n\t}\n\n\t// Ensure the encoded block matches the expected bytes.\n\tif !bytes.Equal(buf.Bytes(), genesisBlockBytes) {\n\t\tt.Fatalf(\"TestGenesisBlock: Genesis block does not appear valid - \"+\n\t\t\t\"got %v, want %v\", spew.Sdump(buf.Bytes()),\n\t\t\tspew.Sdump(genesisBlockBytes))\n\t}\n\n\t// Check hash of the block against expected hash.\n\thash := MainNetParams.GenesisBlock.BlockHash()\n\tif !MainNetParams.GenesisHash.IsEqual(&hash) {\n\t\tt.Fatalf(\"TestGenesisBlock: Genesis block hash does not \"+\n\t\t\t\"appear valid - got %v, want %v\", spew.Sdump(hash),\n\t\t\tspew.Sdump(MainNetParams.GenesisHash))\n\t}\n}\n\n// TestRegTestGenesisBlock tests the genesis block of the regression test\n// network for validity by checking the encoded bytes and hashes.\nfunc TestRegTestGenesisBlock(t *testing.T) {\n\t// Encode the genesis block to raw bytes.\n\tvar buf bytes.Buffer\n\terr := RegressionNetParams.GenesisBlock.Serialize(&buf)\n\tif err != nil {\n\t\tt.Fatalf(\"TestRegTestGenesisBlock: %v\", err)\n\t}\n\n\t// Ensure the encoded block matches the expected bytes.\n\tif !bytes.Equal(buf.Bytes(), regTestGenesisBlockBytes) {\n\t\tt.Fatalf(\"TestRegTestGenesisBlock: Genesis block does not \"+\n\t\t\t\"appear valid - got %v, want %v\",\n\t\t\tspew.Sdump(buf.Bytes()),\n\t\t\tspew.Sdump(regTestGenesisBlockBytes))\n\t}\n\n\t// Check hash of the block against expected hash.\n\thash := RegressionNetParams.GenesisBlock.BlockHash()\n\tif !RegressionNetParams.GenesisHash.IsEqual(&hash) {\n\t\tt.Fatalf(\"TestRegTestGenesisBlock: Genesis block hash does \"+\n\t\t\t\"not appear valid - got %v, want %v\", spew.Sdump(hash),\n\t\t\tspew.Sdump(RegressionNetParams.GenesisHash))\n\t}\n}\n\n// TestTestNet3GenesisBlock tests the genesis block of the test network (version\n// 3) for validity by checking the encoded bytes and hashes.\nfunc TestTestNet3GenesisBlock(t *testing.T) {\n\t// Encode the genesis block to raw bytes.\n\tvar buf bytes.Buffer\n\terr := TestNet3Params.GenesisBlock.Serialize(&buf)\n\tif err != nil {\n\t\tt.Fatalf(\"TestTestNet3GenesisBlock: %v\", err)\n\t}\n\n\t// Ensure the encoded block matches the expected bytes.\n\tif !bytes.Equal(buf.Bytes(), testNet3GenesisBlockBytes) {\n\t\tt.Fatalf(\"TestTestNet3GenesisBlock: Genesis block does not \"+\n\t\t\t\"appear valid - got %v, want %v\",\n\t\t\tspew.Sdump(buf.Bytes()),\n\t\t\tspew.Sdump(testNet3GenesisBlockBytes))\n\t}\n\n\t// Check hash of the block against expected hash.\n\thash := TestNet3Params.GenesisBlock.BlockHash()\n\tif !TestNet3Params.GenesisHash.IsEqual(&hash) {\n\t\tt.Fatalf(\"TestTestNet3GenesisBlock: Genesis block hash does \"+\n\t\t\t\"not appear valid - got %v, want %v\", spew.Sdump(hash),\n\t\t\tspew.Sdump(TestNet3Params.GenesisHash))\n\t}\n}\n\n// TestTestNet4GenesisBlock tests the genesis block of the test network (version\n// 4) for validity by checking the encoded bytes and hashes.\nfunc TestTestNet4GenesisBlock(t *testing.T) {\n\t// Encode the genesis block to raw bytes.\n\tvar buf bytes.Buffer\n\terr := TestNet4Params.GenesisBlock.Serialize(&buf)\n\trequire.NoError(t, err)\n\n\t// Ensure the encoded block matches the expected bytes.\n\tif !bytes.Equal(buf.Bytes(), testNet4GenesisBlockBytes) {\n\t\tt.Fatalf(\"TestTestNet4GenesisBlock: Genesis block does not \"+\n\t\t\t\"appear valid - got %v, want %v\",\n\t\t\tspew.Sdump(buf.Bytes()),\n\t\t\tspew.Sdump(testNet4GenesisBlockBytes))\n\t}\n\n\t// Check hash of the block against expected hash.\n\thash := TestNet4Params.GenesisBlock.BlockHash()\n\tif !TestNet4Params.GenesisHash.IsEqual(&hash) {\n\t\tt.Fatalf(\"TestTestNet4GenesisBlock: Genesis block hash does \"+\n\t\t\t\"not appear valid - got %v, want %v\", spew.Sdump(hash),\n\t\t\tspew.Sdump(TestNet4Params.GenesisHash))\n\t}\n\texpectedHash := \"00000000da84f2bafbbc53dee25a72ae507ff4914b867c565be3\" +\n\t\t\"50b0da8bf043\"\n\trequire.Equal(t, expectedHash, hash.String())\n}\n\n// TestSimNetGenesisBlock tests the genesis block of the simulation test network\n// for validity by checking the encoded bytes and hashes.\nfunc TestSimNetGenesisBlock(t *testing.T) {\n\t// Encode the genesis block to raw bytes.\n\tvar buf bytes.Buffer\n\terr := SimNetParams.GenesisBlock.Serialize(&buf)\n\tif err != nil {\n\t\tt.Fatalf(\"TestSimNetGenesisBlock: %v\", err)\n\t}\n\n\t// Ensure the encoded block matches the expected bytes.\n\tif !bytes.Equal(buf.Bytes(), simNetGenesisBlockBytes) {\n\t\tt.Fatalf(\"TestSimNetGenesisBlock: Genesis block does not \"+\n\t\t\t\"appear valid - got %v, want %v\",\n\t\t\tspew.Sdump(buf.Bytes()),\n\t\t\tspew.Sdump(simNetGenesisBlockBytes))\n\t}\n\n\t// Check hash of the block against expected hash.\n\thash := SimNetParams.GenesisBlock.BlockHash()\n\tif !SimNetParams.GenesisHash.IsEqual(&hash) {\n\t\tt.Fatalf(\"TestSimNetGenesisBlock: Genesis block hash does \"+\n\t\t\t\"not appear valid - got %v, want %v\", spew.Sdump(hash),\n\t\t\tspew.Sdump(SimNetParams.GenesisHash))\n\t}\n}\n\n// TestSigNetGenesisBlock tests the genesis block of the signet test network for\n// validity by checking the encoded bytes and hashes.\nfunc TestSigNetGenesisBlock(t *testing.T) {\n\t// Encode the genesis block to raw bytes.\n\tvar buf bytes.Buffer\n\terr := SigNetParams.GenesisBlock.Serialize(&buf)\n\tif err != nil {\n\t\tt.Fatalf(\"TestSigNetGenesisBlock: %v\", err)\n\t}\n\n\t// Ensure the encoded block matches the expected bytes.\n\tif !bytes.Equal(buf.Bytes(), sigNetGenesisBlockBytes) {\n\t\tt.Fatalf(\"TestSigNetGenesisBlock: Genesis block does not \"+\n\t\t\t\"appear valid - got %v, want %v\",\n\t\t\tspew.Sdump(buf.Bytes()),\n\t\t\tspew.Sdump(sigNetGenesisBlockBytes))\n\t}\n\n\t// Check hash of the block against expected hash.\n\thash := SigNetParams.GenesisBlock.BlockHash()\n\tif !SigNetParams.GenesisHash.IsEqual(&hash) {\n\t\tt.Fatalf(\"TestSigNetGenesisBlock: Genesis block hash does \"+\n\t\t\t\"not appear valid - got %v, want %v\", spew.Sdump(hash),\n\t\t\tspew.Sdump(SigNetParams.GenesisHash))\n\t}\n}\n\n// genesisBlockBytes are the wire encoded bytes for the genesis block of the\n// main network as of protocol version 60002.\nvar genesisBlockBytes = []byte{\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x3b, 0xa3, 0xed, 0xfd, /* |....;...| */\n\t0x7a, 0x7b, 0x12, 0xb2, 0x7a, 0xc7, 0x2c, 0x3e, /* |z{..z.,>| */\n\t0x67, 0x76, 0x8f, 0x61, 0x7f, 0xc8, 0x1b, 0xc3, /* |gv.a....| */\n\t0x88, 0x8a, 0x51, 0x32, 0x3a, 0x9f, 0xb8, 0xaa, /* |..Q2:...| */\n\t0x4b, 0x1e, 0x5e, 0x4a, 0x29, 0xab, 0x5f, 0x49, /* |K.^J)._I| */\n\t0xff, 0xff, 0x00, 0x1d, 0x1d, 0xac, 0x2b, 0x7c, /* |......+|| */\n\t0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, /* |........| */\n\t0xff, 0xff, 0x4d, 0x04, 0xff, 0xff, 0x00, 0x1d, /* |..M.....| */\n\t0x01, 0x04, 0x45, 0x54, 0x68, 0x65, 0x20, 0x54, /* |..EThe T| */\n\t0x69, 0x6d, 0x65, 0x73, 0x20, 0x30, 0x33, 0x2f, /* |imes 03/| */\n\t0x4a, 0x61, 0x6e, 0x2f, 0x32, 0x30, 0x30, 0x39, /* |Jan/2009| */\n\t0x20, 0x43, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x6c, /* | Chancel| */\n\t0x6c, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x20, 0x62, /* |lor on b| */\n\t0x72, 0x69, 0x6e, 0x6b, 0x20, 0x6f, 0x66, 0x20, /* |rink of | */\n\t0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x62, /* |second b| */\n\t0x61, 0x69, 0x6c, 0x6f, 0x75, 0x74, 0x20, 0x66, /* |ailout f| */\n\t0x6f, 0x72, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x73, /* |or banks| */\n\t0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xf2, 0x05, /* |........| */\n\t0x2a, 0x01, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, /* |*....CA.| */\n\t0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, /* |g....UH'| */\n\t0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7, 0x10, /* |.g..q0..| */\n\t0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, /* |\\..(.9..| */\n\t0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde, 0xb6, /* |yb...a..| */\n\t0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, /* |I..?L.8.| */\n\t0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12, 0xde, /* |.U......| */\n\t0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, /* |\\8M....W| */\n\t0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d, 0x5f, /* |.Lp+k.._|*/\n\t0xac, 0x00, 0x00, 0x00, 0x00, /* |.....|    */\n}\n\n// regTestGenesisBlockBytes are the wire encoded bytes for the genesis block of\n// the regression test network as of protocol version 60002.\nvar regTestGenesisBlockBytes = []byte{\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x3b, 0xa3, 0xed, 0xfd, /* |....;...| */\n\t0x7a, 0x7b, 0x12, 0xb2, 0x7a, 0xc7, 0x2c, 0x3e, /* |z{..z.,>| */\n\t0x67, 0x76, 0x8f, 0x61, 0x7f, 0xc8, 0x1b, 0xc3, /* |gv.a....| */\n\t0x88, 0x8a, 0x51, 0x32, 0x3a, 0x9f, 0xb8, 0xaa, /* |..Q2:...| */\n\t0x4b, 0x1e, 0x5e, 0x4a, 0xda, 0xe5, 0x49, 0x4d, /* |K.^J)._I| */\n\t0xff, 0xff, 0x7f, 0x20, 0x02, 0x00, 0x00, 0x00, /* |......+|| */\n\t0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, /* |........| */\n\t0xff, 0xff, 0x4d, 0x04, 0xff, 0xff, 0x00, 0x1d, /* |..M.....| */\n\t0x01, 0x04, 0x45, 0x54, 0x68, 0x65, 0x20, 0x54, /* |..EThe T| */\n\t0x69, 0x6d, 0x65, 0x73, 0x20, 0x30, 0x33, 0x2f, /* |imes 03/| */\n\t0x4a, 0x61, 0x6e, 0x2f, 0x32, 0x30, 0x30, 0x39, /* |Jan/2009| */\n\t0x20, 0x43, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x6c, /* | Chancel| */\n\t0x6c, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x20, 0x62, /* |lor on b| */\n\t0x72, 0x69, 0x6e, 0x6b, 0x20, 0x6f, 0x66, 0x20, /* |rink of | */\n\t0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x62, /* |second b| */\n\t0x61, 0x69, 0x6c, 0x6f, 0x75, 0x74, 0x20, 0x66, /* |ailout f| */\n\t0x6f, 0x72, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x73, /* |or banks| */\n\t0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xf2, 0x05, /* |........| */\n\t0x2a, 0x01, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, /* |*....CA.| */\n\t0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, /* |g....UH'| */\n\t0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7, 0x10, /* |.g..q0..| */\n\t0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, /* |\\..(.9..| */\n\t0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde, 0xb6, /* |yb...a..| */\n\t0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, /* |I..?L.8.| */\n\t0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12, 0xde, /* |.U......| */\n\t0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, /* |\\8M....W| */\n\t0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d, 0x5f, /* |.Lp+k.._|*/\n\t0xac, 0x00, 0x00, 0x00, 0x00, /* |.....|    */\n}\n\n// testNet3GenesisBlockBytes are the wire encoded bytes for the genesis block of\n// the test network (version 3) as of protocol version 60002.\nvar testNet3GenesisBlockBytes = []byte{\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x3b, 0xa3, 0xed, 0xfd, /* |....;...| */\n\t0x7a, 0x7b, 0x12, 0xb2, 0x7a, 0xc7, 0x2c, 0x3e, /* |z{..z.,>| */\n\t0x67, 0x76, 0x8f, 0x61, 0x7f, 0xc8, 0x1b, 0xc3, /* |gv.a....| */\n\t0x88, 0x8a, 0x51, 0x32, 0x3a, 0x9f, 0xb8, 0xaa, /* |..Q2:...| */\n\t0x4b, 0x1e, 0x5e, 0x4a, 0xda, 0xe5, 0x49, 0x4d, /* |K.^J)._I| */\n\t0xff, 0xff, 0x00, 0x1d, 0x1a, 0xa4, 0xae, 0x18, /* |......+|| */\n\t0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, /* |........| */\n\t0xff, 0xff, 0x4d, 0x04, 0xff, 0xff, 0x00, 0x1d, /* |..M.....| */\n\t0x01, 0x04, 0x45, 0x54, 0x68, 0x65, 0x20, 0x54, /* |..EThe T| */\n\t0x69, 0x6d, 0x65, 0x73, 0x20, 0x30, 0x33, 0x2f, /* |imes 03/| */\n\t0x4a, 0x61, 0x6e, 0x2f, 0x32, 0x30, 0x30, 0x39, /* |Jan/2009| */\n\t0x20, 0x43, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x6c, /* | Chancel| */\n\t0x6c, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x20, 0x62, /* |lor on b| */\n\t0x72, 0x69, 0x6e, 0x6b, 0x20, 0x6f, 0x66, 0x20, /* |rink of | */\n\t0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x62, /* |second b| */\n\t0x61, 0x69, 0x6c, 0x6f, 0x75, 0x74, 0x20, 0x66, /* |ailout f| */\n\t0x6f, 0x72, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x73, /* |or banks| */\n\t0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xf2, 0x05, /* |........| */\n\t0x2a, 0x01, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, /* |*....CA.| */\n\t0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, /* |g....UH'| */\n\t0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7, 0x10, /* |.g..q0..| */\n\t0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, /* |\\..(.9..| */\n\t0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde, 0xb6, /* |yb...a..| */\n\t0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, /* |I..?L.8.| */\n\t0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12, 0xde, /* |.U......| */\n\t0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, /* |\\8M....W| */\n\t0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d, 0x5f, /* |.Lp+k.._|*/\n\t0xac, 0x00, 0x00, 0x00, 0x00, /* |.....|    */\n}\n\n// testNet4GenesisBlockBytes are the wire encoded bytes for the genesis block of\n// the test network (version 4)\nvar testNet4GenesisBlockBytes = []byte{\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x4e, 0x7b, 0x2b, 0x91, /* |....N{+.| */\n\t0x28, 0xfe, 0x02, 0x91, 0xdb, 0x06, 0x93, 0xaf, /* |(.......| */\n\t0x2a, 0xe4, 0x18, 0xb7, 0x67, 0xe6, 0x57, 0xcd, /* |*...g.W.| */\n\t0x40, 0x7e, 0x80, 0xcb, 0x14, 0x34, 0x22, 0x1e, /* |@~...4\".| */\n\t0xae, 0xa7, 0xa0, 0x7a, 0x04, 0x6f, 0x35, 0x66, /* |...z.o5f| */\n\t0xff, 0xff, 0x00, 0x1d, 0xbb, 0x0c, 0x78, 0x17, /* |......x.| */\n\t0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, /* |........| */\n\t0xff, 0xff, 0x55, 0x04, 0xff, 0xff, 0x00, 0x1d, /* |..U.....| */\n\t0x01, 0x04, 0x4c, 0x4c, 0x30, 0x33, 0x2f, 0x4d, /* |..LL03/M| */\n\t0x61, 0x79, 0x2f, 0x32, 0x30, 0x32, 0x34, 0x20, /* |ay/2024 | */\n\t0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, /* |00000000| */\n\t0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, /* |00000000| */\n\t0x30, 0x30, 0x30, 0x30, 0x31, 0x65, 0x62, 0x64, /* |00001ebd| */\n\t0x35, 0x38, 0x63, 0x32, 0x34, 0x34, 0x39, 0x37, /* |58c24497| */\n\t0x30, 0x62, 0x33, 0x61, 0x61, 0x39, 0x64, 0x37, /* |0b3aa9d7| */\n\t0x38, 0x33, 0x62, 0x62, 0x30, 0x30, 0x31, 0x30, /* |83bb0010| */\n\t0x31, 0x31, 0x66, 0x62, 0x65, 0x38, 0x65, 0x61, /* |11fbe8ea| */\n\t0x38, 0x65, 0x39, 0x38, 0x65, 0x30, 0x30, 0x65, /* |8e98e00e| */\n\t0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xf2, 0x05, /* |........| */\n\t0x2a, 0x01, 0x00, 0x00, 0x00, 0x23, 0x21, 0x00, /* |*....#!.| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0xac, 0x00, 0x00, 0x00, 0x00, /* |.....   | */\n}\n\n// simNetGenesisBlockBytes are the wire encoded bytes for the genesis block of\n// the simulation test network as of protocol version 70002.\nvar simNetGenesisBlockBytes = []byte{\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x3b, 0xa3, 0xed, 0xfd, /* |....;...| */\n\t0x7a, 0x7b, 0x12, 0xb2, 0x7a, 0xc7, 0x2c, 0x3e, /* |z{..z.,>| */\n\t0x67, 0x76, 0x8f, 0x61, 0x7f, 0xc8, 0x1b, 0xc3, /* |gv.a....| */\n\t0x88, 0x8a, 0x51, 0x32, 0x3a, 0x9f, 0xb8, 0xaa, /* |..Q2:...| */\n\t0x4b, 0x1e, 0x5e, 0x4a, 0x45, 0x06, 0x86, 0x53, /* |K.^J)._I| */\n\t0xff, 0xff, 0x7f, 0x20, 0x02, 0x00, 0x00, 0x00, /* |......+|| */\n\t0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, /* |........| */\n\t0xff, 0xff, 0x4d, 0x04, 0xff, 0xff, 0x00, 0x1d, /* |..M.....| */\n\t0x01, 0x04, 0x45, 0x54, 0x68, 0x65, 0x20, 0x54, /* |..EThe T| */\n\t0x69, 0x6d, 0x65, 0x73, 0x20, 0x30, 0x33, 0x2f, /* |imes 03/| */\n\t0x4a, 0x61, 0x6e, 0x2f, 0x32, 0x30, 0x30, 0x39, /* |Jan/2009| */\n\t0x20, 0x43, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x6c, /* | Chancel| */\n\t0x6c, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x20, 0x62, /* |lor on b| */\n\t0x72, 0x69, 0x6e, 0x6b, 0x20, 0x6f, 0x66, 0x20, /* |rink of | */\n\t0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x62, /* |second b| */\n\t0x61, 0x69, 0x6c, 0x6f, 0x75, 0x74, 0x20, 0x66, /* |ailout f| */\n\t0x6f, 0x72, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x73, /* |or banks| */\n\t0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xf2, 0x05, /* |........| */\n\t0x2a, 0x01, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, /* |*....CA.| */\n\t0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, /* |g....UH'| */\n\t0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7, 0x10, /* |.g..q0..| */\n\t0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, /* |\\..(.9..| */\n\t0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde, 0xb6, /* |yb...a..| */\n\t0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, /* |I..?L.8.| */\n\t0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12, 0xde, /* |.U......| */\n\t0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, /* |\\8M....W| */\n\t0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d, 0x5f, /* |.Lp+k.._|*/\n\t0xac, 0x00, 0x00, 0x00, 0x00, /* |.....|    */\n}\n\n// sigNetGenesisBlockBytes are the wire encoded bytes for the genesis block of\n// the signet test network as of protocol version 70002.\nvar sigNetGenesisBlockBytes = []byte{\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |...@....| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x3b, 0xa3, 0xed, 0xfd, /* |........| */\n\t0x7a, 0x7b, 0x12, 0xb2, 0x7a, 0xc7, 0x2c, 0x3e, /* |....;...| */\n\t0x67, 0x76, 0x8f, 0x61, 0x7f, 0xc8, 0x1b, 0xc3, /* |z{..z.,>| */\n\t0x88, 0x8a, 0x51, 0x32, 0x3a, 0x9f, 0xb8, 0xaa, /* |gv.a....| */\n\t0x4b, 0x1e, 0x5e, 0x4a, 0x00, 0x8f, 0x4d, 0x5f, /* |..Q2:...| */\n\t0xae, 0x77, 0x03, 0x1e, 0x8a, 0xd2, 0x22, 0x03, /* |K.^J..M_| */\n\t0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, /* |.w....\".| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |........| */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, /* |........| */\n\t0xff, 0xff, 0x4d, 0x04, 0xff, 0xff, 0x00, 0x1d, /* |........| */\n\t0x01, 0x04, 0x45, 0x54, 0x68, 0x65, 0x20, 0x54, /* |..M.....| */\n\t0x69, 0x6d, 0x65, 0x73, 0x20, 0x30, 0x33, 0x2f, /* |..EThe T| */\n\t0x4a, 0x61, 0x6e, 0x2f, 0x32, 0x30, 0x30, 0x39, /* |imes 03/| */\n\t0x20, 0x43, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x6c, /* |Jan/2009| */\n\t0x6c, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x20, 0x62, /* | Chancel| */\n\t0x72, 0x69, 0x6e, 0x6b, 0x20, 0x6f, 0x66, 0x20, /* |lor on b| */\n\t0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x62, /* |rink of| */\n\t0x61, 0x69, 0x6c, 0x6f, 0x75, 0x74, 0x20, 0x66, /* |second b| */\n\t0x6f, 0x72, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x73, /* |ailout f| */\n\t0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xf2, 0x05, /* |or banks| */\n\t0x2a, 0x01, 0x00, 0x00, 0x00, 0x43, 0x41, 0x04, /* |........| */\n\t0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, 0x48, 0x27, /* |*....CA.| */\n\t0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, 0xb7, 0x10, /* |g....UH'| */\n\t0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, 0x09, 0xa6, /* |.g..q0..| */\n\t0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, 0xde, 0xb6, /* |\\..(.9..| */\n\t0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, 0x38, 0xc4, /* |yb...a..| */\n\t0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, 0x12, 0xde, /* |I..?L.8.| */\n\t0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, 0x8d, 0x57, /* |.U......| */\n\t0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, 0x1d, 0x5f, /* |\\8M....W| */\n\t0xac, 0x00, 0x00, 0x00, 0x00, /* |.....| */\n}\n"
  },
  {
    "path": "chaincfg/params.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage chaincfg\n\nimport (\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"math\"\n\t\"math/big\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// These variables are the chain proof-of-work limit parameters for each default\n// network.\nvar (\n\t// bigOne is 1 represented as a big.Int.  It is defined here to avoid\n\t// the overhead of creating it multiple times.\n\tbigOne = big.NewInt(1)\n\n\t// mainPowLimit is the highest proof of work value a Bitcoin block can\n\t// have for the main network.  It is the value 2^224 - 1.\n\tmainPowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 224), bigOne)\n\n\t// regressionPowLimit is the highest proof of work value a Bitcoin block\n\t// can have for the regression test network.  It is the value 2^255 - 1.\n\tregressionPowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 255), bigOne)\n\n\t// testNet3PowLimit is the highest proof of work value a Bitcoin block\n\t// can have for the test network (version 3).  It is the value\n\t// 2^224 - 1.\n\ttestNet3PowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 224), bigOne)\n\n\t// simNetPowLimit is the highest proof of work value a Bitcoin block\n\t// can have for the simulation test network.  It is the value 2^255 - 1.\n\tsimNetPowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 255), bigOne)\n\n\t// sigNetPowLimit is the highest proof of work value a bitcoin block can\n\t// have for the signet test network. It is the value 0x0377ae << 216.\n\tsigNetPowLimit = new(big.Int).Lsh(new(big.Int).SetInt64(0x0377ae), 216)\n\n\t// DefaultSignetChallenge is the byte representation of the signet\n\t// challenge for the default (public, Taproot enabled) signet network.\n\t// This is the binary equivalent of the bitcoin script\n\t//  1 03ad5e0edad18cb1f0fc0d28a3d4f1f3e445640337489abb10404f2d1e086be430\n\t//  0359ef5021964fe22d6f8e05b2463c9540ce96883fe3b278760f048f5189f2e6c4 2\n\t//  OP_CHECKMULTISIG\n\tDefaultSignetChallenge, _ = hex.DecodeString(\n\t\t\"512103ad5e0edad18cb1f0fc0d28a3d4f1f3e445640337489abb10404f2d\" +\n\t\t\t\"1e086be430210359ef5021964fe22d6f8e05b2463c9540ce9688\" +\n\t\t\t\"3fe3b278760f048f5189f2e6c452ae\",\n\t)\n\n\t// DefaultSignetDNSSeeds is the list of seed nodes for the default\n\t// (public, Taproot enabled) signet network.\n\tDefaultSignetDNSSeeds = []DNSSeed{\n\t\t{\"seed.signet.bitcoin.sprovoost.nl\", true},\n\t\t{\"178.128.221.177\", false},\n\t\t{\"2a01:7c8:d005:390::5\", false},\n\t\t{\"v7ajjeirttkbnt32wpy3c6w3emwnfr3fkla7hpxcfokr3ysd3kqtzmqd.onion:38333\", false},\n\t}\n)\n\n// Checkpoint identifies a known good point in the block chain.  Using\n// checkpoints allows a few optimizations for old blocks during initial download\n// and also prevents forks from old blocks.\n//\n// Each checkpoint is selected based upon several factors.  See the\n// documentation for blockchain.IsCheckpointCandidate for details on the\n// selection criteria.\ntype Checkpoint struct {\n\tHeight int32\n\tHash   *chainhash.Hash\n}\n\n// EffectiveAlwaysActiveHeight returns the effective activation height for the\n// deployment. If AlwaysActiveHeight is unset (i.e. zero), it returns\n// the maximum uint32 value to indicate that it does not force activation.\nfunc (d *ConsensusDeployment) EffectiveAlwaysActiveHeight() uint32 {\n\tif d.AlwaysActiveHeight == 0 {\n\t\treturn math.MaxUint32\n\t}\n\treturn d.AlwaysActiveHeight\n}\n\n// DNSSeed identifies a DNS seed.\ntype DNSSeed struct {\n\t// Host defines the hostname of the seed.\n\tHost string\n\n\t// HasFiltering defines whether the seed supports filtering\n\t// by service flags (wire.ServiceFlag).\n\tHasFiltering bool\n}\n\n// ConsensusDeployment defines details related to a specific consensus rule\n// change that is voted in.  This is part of BIP0009.\ntype ConsensusDeployment struct {\n\t// BitNumber defines the specific bit number within the block version\n\t// this particular soft-fork deployment refers to.\n\tBitNumber uint8\n\n\t// MinActivationHeight is an optional field that when set (default\n\t// value being zero), modifies the traditional BIP 9 state machine by\n\t// only transitioning from LockedIn to Active once the block height is\n\t// greater than (or equal to) thus specified height.\n\tMinActivationHeight uint32\n\n\t// CustomActivationThreshold if set (non-zero), will _override_ the\n\t// existing RuleChangeActivationThreshold value set at the\n\t// network/chain level. This value divided by the active\n\t// MinerConfirmationWindow denotes the threshold required for\n\t// activation. A value of 1815 block denotes a 90% threshold.\n\tCustomActivationThreshold uint32\n\n\t// AlwaysActiveHeight defines an optional block threshold at which the\n\t// deployment is forced to be active. If unset (0), it defaults to\n\t// math.MaxUint32, meaning the deployment does not force activation.\n\tAlwaysActiveHeight uint32\n\n\t// DeploymentStarter is used to determine if the given\n\t// ConsensusDeployment has started or not.\n\tDeploymentStarter ConsensusDeploymentStarter\n\n\t// DeploymentEnder is used to determine if the given\n\t// ConsensusDeployment has ended or not.\n\tDeploymentEnder ConsensusDeploymentEnder\n}\n\n// Constants that define the deployment offset in the deployments field of the\n// parameters for each deployment.  This is useful to be able to get the details\n// of a specific deployment by name.\nconst (\n\t// DeploymentTestDummy defines the rule change deployment ID for testing\n\t// purposes.\n\tDeploymentTestDummy = iota\n\n\t// DeploymentTestDummyMinActivation defines the rule change deployment\n\t// ID for testing purposes. This differs from the DeploymentTestDummy\n\t// in that it specifies the newer params the taproot fork used for\n\t// activation: a custom threshold and a min activation height.\n\tDeploymentTestDummyMinActivation\n\n\t// DeploymentCSV defines the rule change deployment ID for the CSV\n\t// soft-fork package. The CSV package includes the deployment of BIPS\n\t// 68, 112, and 113.\n\tDeploymentCSV\n\n\t// DeploymentSegwit defines the rule change deployment ID for the\n\t// Segregated Witness (segwit) soft-fork package. The segwit package\n\t// includes the deployment of BIPS 141, 142, 144, 145, 147 and 173.\n\tDeploymentSegwit\n\n\t// DeploymentTaproot defines the rule change deployment ID for the\n\t// Taproot (+Schnorr) soft-fork package. The taproot package includes\n\t// the deployment of BIPS 340, 341 and 342.\n\tDeploymentTaproot\n\n\t// DeploymentTestDummyAlwaysActive is a dummy deployment that is meant\n\t// to always be active.\n\tDeploymentTestDummyAlwaysActive\n\n\t// NOTE: DefinedDeployments must always come last since it is used to\n\t// determine how many defined deployments there currently are.\n\n\t// DefinedDeployments is the number of currently defined deployments.\n\tDefinedDeployments\n)\n\n// Params defines a Bitcoin network by its parameters.  These parameters may be\n// used by Bitcoin applications to differentiate networks as well as addresses\n// and keys for one network from those intended for use on another network.\ntype Params struct {\n\t// Name defines a human-readable identifier for the network.\n\tName string\n\n\t// Net defines the magic bytes used to identify the network.\n\tNet wire.BitcoinNet\n\n\t// DefaultPort defines the default peer-to-peer port for the network.\n\tDefaultPort string\n\n\t// DNSSeeds defines a list of DNS seeds for the network that are used\n\t// as one method to discover peers.\n\tDNSSeeds []DNSSeed\n\n\t// GenesisBlock defines the first block of the chain.\n\tGenesisBlock *wire.MsgBlock\n\n\t// GenesisHash is the starting block hash.\n\tGenesisHash *chainhash.Hash\n\n\t// PowLimit defines the highest allowed proof of work value for a block\n\t// as a uint256.\n\tPowLimit *big.Int\n\n\t// PowLimitBits defines the highest allowed proof of work value for a\n\t// block in compact form.\n\tPowLimitBits uint32\n\n\t// PoWNoRetargeting defines whether the network has difficulty\n\t// retargeting enabled or not. This should only be set to true for\n\t// regtest like networks.\n\tPoWNoRetargeting bool\n\n\t// EnforceBIP94 enforces timewarp attack mitigation and on testnet4\n\t// this also enforces the block storm mitigation.\n\tEnforceBIP94 bool\n\n\t// These fields define the block heights at which the specified softfork\n\t// BIP became active.\n\tBIP0034Height int32\n\tBIP0065Height int32\n\tBIP0066Height int32\n\n\t// CoinbaseMaturity is the number of blocks required before newly mined\n\t// coins (coinbase transactions) can be spent.\n\tCoinbaseMaturity uint16\n\n\t// SubsidyReductionInterval is the interval of blocks before the subsidy\n\t// is reduced.\n\tSubsidyReductionInterval int32\n\n\t// TargetTimespan is the desired amount of time that should elapse\n\t// before the block difficulty requirement is examined to determine how\n\t// it should be changed in order to maintain the desired block\n\t// generation rate.\n\tTargetTimespan time.Duration\n\n\t// TargetTimePerBlock is the desired amount of time to generate each\n\t// block.\n\tTargetTimePerBlock time.Duration\n\n\t// RetargetAdjustmentFactor is the adjustment factor used to limit\n\t// the minimum and maximum amount of adjustment that can occur between\n\t// difficulty retargets.\n\tRetargetAdjustmentFactor int64\n\n\t// ReduceMinDifficulty defines whether the network should reduce the\n\t// minimum required difficulty after a long enough period of time has\n\t// passed without finding a block.  This is really only useful for test\n\t// networks and should not be set on a main network.\n\tReduceMinDifficulty bool\n\n\t// MinDiffReductionTime is the amount of time after which the minimum\n\t// required difficulty should be reduced when a block hasn't been found.\n\t//\n\t// NOTE: This only applies if ReduceMinDifficulty is true.\n\tMinDiffReductionTime time.Duration\n\n\t// GenerateSupported specifies whether or not CPU mining is allowed.\n\tGenerateSupported bool\n\n\t// Checkpoints ordered from oldest to newest.\n\tCheckpoints []Checkpoint\n\n\t// These fields are related to voting on consensus rule changes as\n\t// defined by BIP0009.\n\t//\n\t// RuleChangeActivationThreshold is the number of blocks in a threshold\n\t// state retarget window for which a positive vote for a rule change\n\t// must be cast in order to lock in a rule change. It should typically\n\t// be 95% for the main network and 75% for test networks.\n\t//\n\t// MinerConfirmationWindow is the number of blocks in each threshold\n\t// state retarget window.\n\t//\n\t// Deployments define the specific consensus rule changes to be voted\n\t// on.\n\tRuleChangeActivationThreshold uint32\n\tMinerConfirmationWindow       uint32\n\tDeployments                   [DefinedDeployments]ConsensusDeployment\n\n\t// Mempool parameters\n\tRelayNonStdTxs bool\n\n\t// Human-readable part for Bech32 encoded segwit addresses, as defined\n\t// in BIP 173.\n\tBech32HRPSegwit string\n\n\t// Address encoding magics\n\tPubKeyHashAddrID        byte // First byte of a P2PKH address\n\tScriptHashAddrID        byte // First byte of a P2SH address\n\tPrivateKeyID            byte // First byte of a WIF private key\n\tWitnessPubKeyHashAddrID byte // First byte of a P2WPKH address\n\tWitnessScriptHashAddrID byte // First byte of a P2WSH address\n\n\t// BIP32 hierarchical deterministic extended key magics\n\tHDPrivateKeyID [4]byte\n\tHDPublicKeyID  [4]byte\n\n\t// BIP44 coin type used in the hierarchical deterministic path for\n\t// address generation.\n\tHDCoinType uint32\n}\n\n// MainNetParams defines the network parameters for the main Bitcoin network.\nvar MainNetParams = Params{\n\tName:        \"mainnet\",\n\tNet:         wire.MainNet,\n\tDefaultPort: \"8333\",\n\tDNSSeeds: []DNSSeed{\n\t\t{\"seed.bitcoin.sipa.be\", true},\n\t\t{\"dnsseed.bluematt.me\", true},\n\t\t{\"dnsseed.bitcoin.dashjr.org\", false},\n\t\t{\"seed.bitnodes.io\", false},\n\t\t{\"seed.bitcoin.jonasschnelli.ch\", true},\n\t\t{\"seed.btc.petertodd.net\", true},\n\t\t{\"seed.bitcoin.sprovoost.nl\", true},\n\t\t{\"seed.bitcoin.wiz.biz\", true},\n\t},\n\n\t// Chain parameters\n\tGenesisBlock:             &genesisBlock,\n\tGenesisHash:              &genesisHash,\n\tPowLimit:                 mainPowLimit,\n\tPowLimitBits:             0x1d00ffff,\n\tBIP0034Height:            227931, // 000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8\n\tBIP0065Height:            388381, // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0\n\tBIP0066Height:            363725, // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931\n\tCoinbaseMaturity:         100,\n\tSubsidyReductionInterval: 210000,\n\tTargetTimespan:           time.Hour * 24 * 14, // 14 days\n\tTargetTimePerBlock:       time.Minute * 10,    // 10 minutes\n\tRetargetAdjustmentFactor: 4,                   // 25% less, 400% more\n\tReduceMinDifficulty:      false,\n\tMinDiffReductionTime:     0,\n\tGenerateSupported:        false,\n\n\t// Checkpoints ordered from oldest to newest.\n\tCheckpoints: []Checkpoint{\n\t\t{11111, newHashFromStr(\"0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d\")},\n\t\t{33333, newHashFromStr(\"000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6\")},\n\t\t{74000, newHashFromStr(\"0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20\")},\n\t\t{105000, newHashFromStr(\"00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97\")},\n\t\t{134444, newHashFromStr(\"00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe\")},\n\t\t{168000, newHashFromStr(\"000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763\")},\n\t\t{193000, newHashFromStr(\"000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317\")},\n\t\t{210000, newHashFromStr(\"000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e\")},\n\t\t{216116, newHashFromStr(\"00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e\")},\n\t\t{225430, newHashFromStr(\"00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932\")},\n\t\t{250000, newHashFromStr(\"000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214\")},\n\t\t{267300, newHashFromStr(\"000000000000000a83fbd660e918f218bf37edd92b748ad940483c7c116179ac\")},\n\t\t{279000, newHashFromStr(\"0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40\")},\n\t\t{300255, newHashFromStr(\"0000000000000000162804527c6e9b9f0563a280525f9d08c12041def0a0f3b2\")},\n\t\t{319400, newHashFromStr(\"000000000000000021c6052e9becade189495d1c539aa37c58917305fd15f13b\")},\n\t\t{343185, newHashFromStr(\"0000000000000000072b8bf361d01a6ba7d445dd024203fafc78768ed4368554\")},\n\t\t{352940, newHashFromStr(\"000000000000000010755df42dba556bb72be6a32f3ce0b6941ce4430152c9ff\")},\n\t\t{382320, newHashFromStr(\"00000000000000000a8dc6ed5b133d0eb2fd6af56203e4159789b092defd8ab2\")},\n\t\t{400000, newHashFromStr(\"000000000000000004ec466ce4732fe6f1ed1cddc2ed4b328fff5224276e3f6f\")},\n\t\t{430000, newHashFromStr(\"000000000000000001868b2bb3a285f3cc6b33ea234eb70facf4dcdf22186b87\")},\n\t\t{460000, newHashFromStr(\"000000000000000000ef751bbce8e744ad303c47ece06c8d863e4d417efc258c\")},\n\t\t{490000, newHashFromStr(\"000000000000000000de069137b17b8d5a3dfbd5b145b2dcfb203f15d0c4de90\")},\n\t\t{520000, newHashFromStr(\"0000000000000000000d26984c0229c9f6962dc74db0a6d525f2f1640396f69c\")},\n\t\t{550000, newHashFromStr(\"000000000000000000223b7a2298fb1c6c75fb0efc28a4c56853ff4112ec6bc9\")},\n\t\t{560000, newHashFromStr(\"0000000000000000002c7b276daf6efb2b6aa68e2ce3be67ef925b3264ae7122\")},\n\t\t{563378, newHashFromStr(\"0000000000000000000f1c54590ee18d15ec70e68c8cd4cfbadb1b4f11697eee\")},\n\t\t{597379, newHashFromStr(\"00000000000000000005f8920febd3925f8272a6a71237563d78c2edfdd09ddf\")},\n\t\t{623950, newHashFromStr(\"0000000000000000000f2adce67e49b0b6bdeb9de8b7c3d7e93b21e7fc1e819d\")},\n\t\t{654683, newHashFromStr(\"0000000000000000000b9d2ec5a352ecba0592946514a92f14319dc2b367fc72\")},\n\t\t{691719, newHashFromStr(\"00000000000000000008a89e854d57e5667df88f1cdef6fde2fbca1de5b639ad\")},\n\t\t{724466, newHashFromStr(\"000000000000000000052d314a259755ca65944e68df6b12a067ea8f1f5a7091\")},\n\t\t{751565, newHashFromStr(\"00000000000000000009c97098b5295f7e5f183ac811fb5d1534040adb93cabd\")},\n\t\t{781565, newHashFromStr(\"00000000000000000002b8c04999434c33b8e033f11a977b288f8411766ee61c\")},\n\t\t{800000, newHashFromStr(\"00000000000000000002a7c4c1e48d76c5a37902165a270156b7a8d72728a054\")},\n\t\t{810000, newHashFromStr(\"000000000000000000028028ca82b6aa81ce789e4eb9e0321b74c3cbaf405dd1\")},\n\t},\n\n\t// Consensus rule change deployments.\n\t//\n\t// The miner confirmation window is defined as:\n\t//   target proof of work timespan / target proof of work spacing\n\tRuleChangeActivationThreshold: 1916, // 95% of MinerConfirmationWindow\n\tMinerConfirmationWindow:       2016, //\n\tDeployments: [DefinedDeployments]ConsensusDeployment{\n\t\tDeploymentTestDummy: {\n\t\t\tBitNumber: 28,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Unix(11991456010, 0), // January 1, 2008 UTC\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Unix(1230767999, 0), // December 31, 2008 UTC\n\t\t\t),\n\t\t},\n\t\tDeploymentTestDummyMinActivation: {\n\t\t\tBitNumber:                 22,\n\t\t\tCustomActivationThreshold: 1815,    // Only needs 90% hash rate.\n\t\t\tMinActivationHeight:       10_0000, // Can only activate after height 10k.\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t},\n\t\tDeploymentTestDummyAlwaysActive: {\n\t\t\tBitNumber: 30,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t\tAlwaysActiveHeight: 1,\n\t\t},\n\t\tDeploymentCSV: {\n\t\t\tBitNumber: 0,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Unix(1462060800, 0), // May 1st, 2016\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Unix(1493596800, 0), // May 1st, 2017\n\t\t\t),\n\t\t},\n\t\tDeploymentSegwit: {\n\t\t\tBitNumber: 1,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Unix(1479168000, 0), // November 15, 2016 UTC\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Unix(1510704000, 0), // November 15, 2017 UTC.\n\t\t\t),\n\t\t},\n\t\tDeploymentTaproot: {\n\t\t\tBitNumber: 2,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Unix(1619222400, 0), // April 24th, 2021 UTC.\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Unix(1628640000, 0), // August 11th, 2021 UTC.\n\t\t\t),\n\t\t\tCustomActivationThreshold: 1815, // 90%\n\t\t\tMinActivationHeight:       709_632,\n\t\t},\n\t},\n\n\t// Mempool parameters\n\tRelayNonStdTxs: false,\n\n\t// Human-readable part for Bech32 encoded segwit addresses, as defined in\n\t// BIP 173.\n\tBech32HRPSegwit: \"bc\", // always bc for main net\n\n\t// Address encoding magics\n\tPubKeyHashAddrID:        0x00, // starts with 1\n\tScriptHashAddrID:        0x05, // starts with 3\n\tPrivateKeyID:            0x80, // starts with 5 (uncompressed) or K (compressed)\n\tWitnessPubKeyHashAddrID: 0x06, // starts with p2\n\tWitnessScriptHashAddrID: 0x0A, // starts with 7Xh\n\n\t// BIP32 hierarchical deterministic extended key magics\n\tHDPrivateKeyID: [4]byte{0x04, 0x88, 0xad, 0xe4}, // starts with xprv\n\tHDPublicKeyID:  [4]byte{0x04, 0x88, 0xb2, 0x1e}, // starts with xpub\n\n\t// BIP44 coin type used in the hierarchical deterministic path for\n\t// address generation.\n\tHDCoinType: 0,\n}\n\n// RegressionNetParams defines the network parameters for the regression test\n// Bitcoin network.  Not to be confused with the test Bitcoin network (version\n// 3), this network is sometimes simply called \"testnet\".\nvar RegressionNetParams = Params{\n\tName:        \"regtest\",\n\tNet:         wire.TestNet,\n\tDefaultPort: \"18444\",\n\tDNSSeeds:    []DNSSeed{},\n\n\t// Chain parameters\n\tGenesisBlock:             &regTestGenesisBlock,\n\tGenesisHash:              &regTestGenesisHash,\n\tPowLimit:                 regressionPowLimit,\n\tPowLimitBits:             0x207fffff,\n\tPoWNoRetargeting:         true,\n\tCoinbaseMaturity:         100,\n\tBIP0034Height:            100000000, // Not active - Permit ver 1 blocks\n\tBIP0065Height:            1351,      // Used by regression tests\n\tBIP0066Height:            1251,      // Used by regression tests\n\tSubsidyReductionInterval: 150,\n\tTargetTimespan:           time.Hour * 24 * 14, // 14 days\n\tTargetTimePerBlock:       time.Minute * 10,    // 10 minutes\n\tRetargetAdjustmentFactor: 4,                   // 25% less, 400% more\n\tReduceMinDifficulty:      true,\n\tMinDiffReductionTime:     time.Minute * 20, // TargetTimePerBlock * 2\n\tGenerateSupported:        true,\n\n\t// Checkpoints ordered from oldest to newest.\n\tCheckpoints: nil,\n\n\t// Consensus rule change deployments.\n\t//\n\t// The miner confirmation window is defined as:\n\t//   target proof of work timespan / target proof of work spacing\n\tRuleChangeActivationThreshold: 108, // 75%  of MinerConfirmationWindow\n\tMinerConfirmationWindow:       144,\n\tDeployments: [DefinedDeployments]ConsensusDeployment{\n\t\tDeploymentTestDummy: {\n\t\t\tBitNumber: 28,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t},\n\t\tDeploymentTestDummyMinActivation: {\n\t\t\tBitNumber:                 22,\n\t\t\tCustomActivationThreshold: 72,  // Only needs 50% hash rate.\n\t\t\tMinActivationHeight:       600, // Can only activate after height 600.\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t},\n\t\tDeploymentTestDummyAlwaysActive: {\n\t\t\tBitNumber: 30,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t\tAlwaysActiveHeight: 1,\n\t\t},\n\t\tDeploymentCSV: {\n\t\t\tBitNumber: 0,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t},\n\t\tDeploymentSegwit: {\n\t\t\tBitNumber: 1,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires.\n\t\t\t),\n\t\t},\n\t\tDeploymentTaproot: {\n\t\t\tBitNumber: 2,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires.\n\t\t\t),\n\t\t\tCustomActivationThreshold: 108, // Only needs 75% hash rate.\n\t\t},\n\t},\n\n\t// Mempool parameters\n\tRelayNonStdTxs: true,\n\n\t// Human-readable part for Bech32 encoded segwit addresses, as defined in\n\t// BIP 173.\n\tBech32HRPSegwit: \"bcrt\", // always bcrt for reg test net\n\n\t// Address encoding magics\n\tPubKeyHashAddrID: 0x6f, // starts with m or n\n\tScriptHashAddrID: 0xc4, // starts with 2\n\tPrivateKeyID:     0xef, // starts with 9 (uncompressed) or c (compressed)\n\n\t// BIP32 hierarchical deterministic extended key magics\n\tHDPrivateKeyID: [4]byte{0x04, 0x35, 0x83, 0x94}, // starts with tprv\n\tHDPublicKeyID:  [4]byte{0x04, 0x35, 0x87, 0xcf}, // starts with tpub\n\n\t// BIP44 coin type used in the hierarchical deterministic path for\n\t// address generation.\n\tHDCoinType: 1,\n}\n\n// TestNet3Params defines the network parameters for the test Bitcoin network\n// (version 3).  Not to be confused with the regression test network, this\n// network is sometimes simply called \"testnet\".\nvar TestNet3Params = Params{\n\tName:        \"testnet3\",\n\tNet:         wire.TestNet3,\n\tDefaultPort: \"18333\",\n\tDNSSeeds: []DNSSeed{\n\t\t{\"testnet-seed.bitcoin.jonasschnelli.ch\", true},\n\t\t{\"seed.tbtc.petertodd.net\", true},\n\t\t{\"seed.testnet.bitcoin.sprovoost.nl\", true},\n\t\t{\"testnet-seed.bluematt.me\", false},\n\t},\n\n\t// Chain parameters\n\tGenesisBlock:             &testNet3GenesisBlock,\n\tGenesisHash:              &testNet3GenesisHash,\n\tPowLimit:                 testNet3PowLimit,\n\tPowLimitBits:             0x1d00ffff,\n\tBIP0034Height:            21111,  // 0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8\n\tBIP0065Height:            581885, // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6\n\tBIP0066Height:            330776, // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182\n\tCoinbaseMaturity:         100,\n\tSubsidyReductionInterval: 210000,\n\tTargetTimespan:           time.Hour * 24 * 14, // 14 days\n\tTargetTimePerBlock:       time.Minute * 10,    // 10 minutes\n\tRetargetAdjustmentFactor: 4,                   // 25% less, 400% more\n\tReduceMinDifficulty:      true,\n\tMinDiffReductionTime:     time.Minute * 20, // TargetTimePerBlock * 2\n\tGenerateSupported:        false,\n\n\t// Checkpoints ordered from oldest to newest.\n\tCheckpoints: []Checkpoint{\n\t\t{546, newHashFromStr(\"000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70\")},\n\t\t{100000, newHashFromStr(\"00000000009e2958c15ff9290d571bf9459e93b19765c6801ddeccadbb160a1e\")},\n\t\t{200000, newHashFromStr(\"0000000000287bffd321963ef05feab753ebe274e1d78b2fd4e2bfe9ad3aa6f2\")},\n\t\t{300001, newHashFromStr(\"0000000000004829474748f3d1bc8fcf893c88be255e6d7f571c548aff57abf4\")},\n\t\t{400002, newHashFromStr(\"0000000005e2c73b8ecb82ae2dbc2e8274614ebad7172b53528aba7501f5a089\")},\n\t\t{500011, newHashFromStr(\"00000000000929f63977fbac92ff570a9bd9e7715401ee96f2848f7b07750b02\")},\n\t\t{600002, newHashFromStr(\"000000000001f471389afd6ee94dcace5ccc44adc18e8bff402443f034b07240\")},\n\t\t{700000, newHashFromStr(\"000000000000406178b12a4dea3b27e13b3c4fe4510994fd667d7c1e6a3f4dc1\")},\n\t\t{800010, newHashFromStr(\"000000000017ed35296433190b6829db01e657d80631d43f5983fa403bfdb4c1\")},\n\t\t{900000, newHashFromStr(\"0000000000356f8d8924556e765b7a94aaebc6b5c8685dcfa2b1ee8b41acd89b\")},\n\t\t{1000007, newHashFromStr(\"00000000001ccb893d8a1f25b70ad173ce955e5f50124261bbbc50379a612ddf\")},\n\t\t{1100007, newHashFromStr(\"00000000000abc7b2cd18768ab3dee20857326a818d1946ed6796f42d66dd1e8\")},\n\t\t{1200007, newHashFromStr(\"00000000000004f2dc41845771909db57e04191714ed8c963f7e56713a7b6cea\")},\n\t\t{1300007, newHashFromStr(\"0000000072eab69d54df75107c052b26b0395b44f77578184293bf1bb1dbd9fa\")},\n\t\t{1354312, newHashFromStr(\"0000000000000037a8cd3e06cd5edbfe9dd1dbcc5dacab279376ef7cfc2b4c75\")},\n\t\t{1580000, newHashFromStr(\"00000000000000b7ab6ce61eb6d571003fbe5fe892da4c9b740c49a07542462d\")},\n\t\t{1692000, newHashFromStr(\"000000000000056c49030c174179b52a928c870e6e8a822c75973b7970cfbd01\")},\n\t\t{1864000, newHashFromStr(\"000000000000006433d1efec504c53ca332b64963c425395515b01977bd7b3b0\")},\n\t\t{2010000, newHashFromStr(\"0000000000004ae2f3896ca8ecd41c460a35bf6184e145d91558cece1c688a76\")},\n\t\t{2143398, newHashFromStr(\"00000000000163cfb1f97c4e4098a3692c8053ad9cab5ad9c86b338b5c00b8b7\")},\n\t\t{2344474, newHashFromStr(\"0000000000000004877fa2d36316398528de4f347df2f8a96f76613a298ce060\")},\n\t},\n\n\t// Consensus rule change deployments.\n\t//\n\t// The miner confirmation window is defined as:\n\t//   target proof of work timespan / target proof of work spacing\n\tRuleChangeActivationThreshold: 1512, // 75% of MinerConfirmationWindow\n\tMinerConfirmationWindow:       2016,\n\tDeployments: [DefinedDeployments]ConsensusDeployment{\n\t\tDeploymentTestDummy: {\n\t\t\tBitNumber: 28,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Unix(1199145601, 0), // January 1, 2008 UTC\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Unix(1230767999, 0), // December 31, 2008 UTC\n\t\t\t),\n\t\t},\n\t\tDeploymentTestDummyMinActivation: {\n\t\t\tBitNumber:                 22,\n\t\t\tCustomActivationThreshold: 1815,    // Only needs 90% hash rate.\n\t\t\tMinActivationHeight:       10_0000, // Can only activate after height 10k.\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t},\n\t\tDeploymentTestDummyAlwaysActive: {\n\t\t\tBitNumber: 30,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t\tAlwaysActiveHeight: 1,\n\t\t},\n\t\tDeploymentCSV: {\n\t\t\tBitNumber: 0,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Unix(1456790400, 0), // March 1st, 2016\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Unix(1493596800, 0), // May 1st, 2017\n\t\t\t),\n\t\t},\n\t\tDeploymentSegwit: {\n\t\t\tBitNumber: 1,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Unix(1462060800, 0), // May 1, 2016 UTC\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Unix(1493596800, 0), // May 1, 2017 UTC.\n\t\t\t),\n\t\t},\n\t\tDeploymentTaproot: {\n\t\t\tBitNumber: 2,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Unix(1619222400, 0), // April 24th, 2021 UTC.\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Unix(1628640000, 0), // August 11th, 2021 UTC\n\t\t\t),\n\t\t\tCustomActivationThreshold: 1512, // 75%\n\t\t},\n\t},\n\n\t// Mempool parameters\n\tRelayNonStdTxs: true,\n\n\t// Human-readable part for Bech32 encoded segwit addresses, as defined in\n\t// BIP 173.\n\tBech32HRPSegwit: \"tb\", // always tb for test net\n\n\t// Address encoding magics\n\tPubKeyHashAddrID:        0x6f, // starts with m or n\n\tScriptHashAddrID:        0xc4, // starts with 2\n\tWitnessPubKeyHashAddrID: 0x03, // starts with QW\n\tWitnessScriptHashAddrID: 0x28, // starts with T7n\n\tPrivateKeyID:            0xef, // starts with 9 (uncompressed) or c (compressed)\n\n\t// BIP32 hierarchical deterministic extended key magics\n\tHDPrivateKeyID: [4]byte{0x04, 0x35, 0x83, 0x94}, // starts with tprv\n\tHDPublicKeyID:  [4]byte{0x04, 0x35, 0x87, 0xcf}, // starts with tpub\n\n\t// BIP44 coin type used in the hierarchical deterministic path for\n\t// address generation.\n\tHDCoinType: 1,\n}\n\n// TestNet4Params defines the network parameters for the test Bitcoin network\n// (version 4).\nvar TestNet4Params = Params{\n\tName:        \"testnet4\",\n\tNet:         wire.TestNet4,\n\tDefaultPort: \"48333\",\n\tDNSSeeds: []DNSSeed{\n\t\t{\"seed.testnet4.bitcoin.sprovoost.nl\", true},\n\t\t{\"seed.testnet4.wiz.biz\", true},\n\t},\n\n\t// Chain parameters\n\tGenesisBlock:             &testNet4GenesisBlock,\n\tGenesisHash:              &testNet4GenesisHash,\n\tPowLimit:                 testNet3PowLimit,\n\tPowLimitBits:             0x1d00ffff,\n\tEnforceBIP94:             true,\n\tBIP0034Height:            1,\n\tBIP0065Height:            1,\n\tBIP0066Height:            1,\n\tCoinbaseMaturity:         100,\n\tSubsidyReductionInterval: 210000,\n\tTargetTimespan:           time.Hour * 24 * 14, // 14 days\n\tTargetTimePerBlock:       time.Minute * 10,    // 10 minutes\n\tRetargetAdjustmentFactor: 4,                   // 25% less, 400% more\n\tReduceMinDifficulty:      true,\n\tMinDiffReductionTime:     time.Minute * 20, // TargetTimePerBlock * 2\n\tGenerateSupported:        false,\n\n\t// Checkpoints ordered from oldest to newest.\n\tCheckpoints: []Checkpoint{},\n\n\t// Consensus rule change deployments.\n\t//\n\t// The miner confirmation window is defined as:\n\t//   target proof of work timespan / target proof of work spacing\n\tRuleChangeActivationThreshold: 1512, // 75% of MinerConfirmationWindow\n\tMinerConfirmationWindow:       2016,\n\tDeployments: [DefinedDeployments]ConsensusDeployment{\n\t\tDeploymentTestDummy: {\n\t\t\tBitNumber: 28,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Unix(1199145601, 0), // January 1, 2008 UTC\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Unix(1230767999, 0), // December 31, 2008 UTC\n\t\t\t),\n\t\t},\n\t\tDeploymentTestDummyMinActivation: {\n\t\t\tBitNumber:                 22,\n\t\t\tCustomActivationThreshold: 1815,    // Only needs 90% hash rate.\n\t\t\tMinActivationHeight:       10_0000, // Can only activate after height 10k.\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t},\n\t\tDeploymentTestDummyAlwaysActive: {\n\t\t\tBitNumber: 30,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t\tAlwaysActiveHeight: 1,\n\t\t},\n\t\tDeploymentCSV: {\n\t\t\tBitNumber: 31,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t\tAlwaysActiveHeight: 1,\n\t\t},\n\t\tDeploymentSegwit: {\n\t\t\tBitNumber: 29,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t\tAlwaysActiveHeight: 1,\n\t\t},\n\t\tDeploymentTaproot: {\n\t\t\tBitNumber: 2,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t\tMinActivationHeight: 0,\n\t\t\tAlwaysActiveHeight:  1,\n\t\t},\n\t},\n\n\t// Mempool parameters\n\tRelayNonStdTxs: true,\n\n\t// Human-readable part for Bech32 encoded segwit addresses, as defined in\n\t// BIP 173.\n\tBech32HRPSegwit: \"tb\", // always tb for test net\n\n\t// Address encoding magics\n\tPubKeyHashAddrID:        0x6f, // starts with m or n\n\tScriptHashAddrID:        0xc4, // starts with 2\n\tWitnessPubKeyHashAddrID: 0x03, // starts with QW\n\tWitnessScriptHashAddrID: 0x28, // starts with T7n\n\tPrivateKeyID:            0xef, // starts with 9 (uncompressed) or c (compressed)\n\n\t// BIP32 hierarchical deterministic extended key magics\n\tHDPrivateKeyID: [4]byte{0x04, 0x35, 0x83, 0x94}, // starts with tprv\n\tHDPublicKeyID:  [4]byte{0x04, 0x35, 0x87, 0xcf}, // starts with tpub\n\n\t// BIP44 coin type used in the hierarchical deterministic path for\n\t// address generation.\n\tHDCoinType: 1,\n}\n\n// SimNetParams defines the network parameters for the simulation test Bitcoin\n// network.  This network is similar to the normal test network except it is\n// intended for private use within a group of individuals doing simulation\n// testing.  The functionality is intended to differ in that the only nodes\n// which are specifically specified are used to create the network rather than\n// following normal discovery rules.  This is important as otherwise it would\n// just turn into another public testnet.\nvar SimNetParams = Params{\n\tName:        \"simnet\",\n\tNet:         wire.SimNet,\n\tDefaultPort: \"18555\",\n\tDNSSeeds:    []DNSSeed{}, // NOTE: There must NOT be any seeds.\n\n\t// Chain parameters\n\tGenesisBlock:             &simNetGenesisBlock,\n\tGenesisHash:              &simNetGenesisHash,\n\tPowLimit:                 simNetPowLimit,\n\tPowLimitBits:             0x207fffff,\n\tBIP0034Height:            0, // Always active on simnet\n\tBIP0065Height:            0, // Always active on simnet\n\tBIP0066Height:            0, // Always active on simnet\n\tCoinbaseMaturity:         100,\n\tSubsidyReductionInterval: 210000,\n\tTargetTimespan:           time.Hour * 24 * 14, // 14 days\n\tTargetTimePerBlock:       time.Minute * 10,    // 10 minutes\n\tRetargetAdjustmentFactor: 4,                   // 25% less, 400% more\n\tReduceMinDifficulty:      true,\n\tMinDiffReductionTime:     time.Minute * 20, // TargetTimePerBlock * 2\n\tGenerateSupported:        true,\n\n\t// Checkpoints ordered from oldest to newest.\n\tCheckpoints: nil,\n\n\t// Consensus rule change deployments.\n\t//\n\t// The miner confirmation window is defined as:\n\t//   target proof of work timespan / target proof of work spacing\n\tRuleChangeActivationThreshold: 75, // 75% of MinerConfirmationWindow\n\tMinerConfirmationWindow:       100,\n\tDeployments: [DefinedDeployments]ConsensusDeployment{\n\t\tDeploymentTestDummy: {\n\t\t\tBitNumber: 28,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t},\n\t\tDeploymentTestDummyMinActivation: {\n\t\t\tBitNumber:                 22,\n\t\t\tCustomActivationThreshold: 50,  // Only needs 50% hash rate.\n\t\t\tMinActivationHeight:       600, // Can only activate after height 600.\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t},\n\t\tDeploymentCSV: {\n\t\t\tBitNumber: 0,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t},\n\t\tDeploymentSegwit: {\n\t\t\tBitNumber: 1,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires.\n\t\t\t),\n\t\t},\n\t\tDeploymentTaproot: {\n\t\t\tBitNumber: 2,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires.\n\t\t\t),\n\t\t\tCustomActivationThreshold: 75, // Only needs 75% hash rate.\n\t\t},\n\t\tDeploymentTestDummyAlwaysActive: {\n\t\t\tBitNumber: 29,\n\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t),\n\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\ttime.Time{}, // Never expires\n\t\t\t),\n\t\t\tAlwaysActiveHeight: 1,\n\t\t},\n\t},\n\n\t// Mempool parameters\n\tRelayNonStdTxs: true,\n\n\t// Human-readable part for Bech32 encoded segwit addresses, as defined in\n\t// BIP 173.\n\tBech32HRPSegwit: \"sb\", // always sb for sim net\n\n\t// Address encoding magics\n\tPubKeyHashAddrID:        0x3f, // starts with S\n\tScriptHashAddrID:        0x7b, // starts with s\n\tPrivateKeyID:            0x64, // starts with 4 (uncompressed) or F (compressed)\n\tWitnessPubKeyHashAddrID: 0x19, // starts with Gg\n\tWitnessScriptHashAddrID: 0x28, // starts with ?\n\n\t// BIP32 hierarchical deterministic extended key magics\n\tHDPrivateKeyID: [4]byte{0x04, 0x20, 0xb9, 0x00}, // starts with sprv\n\tHDPublicKeyID:  [4]byte{0x04, 0x20, 0xbd, 0x3a}, // starts with spub\n\n\t// BIP44 coin type used in the hierarchical deterministic path for\n\t// address generation.\n\tHDCoinType: 115, // ASCII for s\n}\n\n// SigNetParams defines the network parameters for the default public signet\n// Bitcoin network. Not to be confused with the regression test network, this\n// network is sometimes simply called \"signet\" or \"taproot signet\".\nvar SigNetParams = CustomSignetParams(\n\tDefaultSignetChallenge, DefaultSignetDNSSeeds,\n)\n\n// CustomSignetParams creates network parameters for a custom signet network\n// from a challenge. The challenge is the binary compiled version of the block\n// challenge script.\nfunc CustomSignetParams(challenge []byte, dnsSeeds []DNSSeed) Params {\n\t// The message start is defined as the first four bytes of the sha256d\n\t// of the challenge script, as a single push (i.e. prefixed with the\n\t// challenge script length).\n\tchallengeLength := byte(len(challenge))\n\thashDouble := chainhash.DoubleHashB(\n\t\tappend([]byte{challengeLength}, challenge...),\n\t)\n\n\t// We use little endian encoding of the hash prefix to be in line with\n\t// the other wire network identities.\n\tnet := binary.LittleEndian.Uint32(hashDouble[0:4])\n\treturn Params{\n\t\tName:        \"signet\",\n\t\tNet:         wire.BitcoinNet(net),\n\t\tDefaultPort: \"38333\",\n\t\tDNSSeeds:    dnsSeeds,\n\n\t\t// Chain parameters\n\t\tGenesisBlock:             &sigNetGenesisBlock,\n\t\tGenesisHash:              &sigNetGenesisHash,\n\t\tPowLimit:                 sigNetPowLimit,\n\t\tPowLimitBits:             0x1e0377ae,\n\t\tBIP0034Height:            1,\n\t\tBIP0065Height:            1,\n\t\tBIP0066Height:            1,\n\t\tCoinbaseMaturity:         100,\n\t\tSubsidyReductionInterval: 210000,\n\t\tTargetTimespan:           time.Hour * 24 * 14, // 14 days\n\t\tTargetTimePerBlock:       time.Minute * 10,    // 10 minutes\n\t\tRetargetAdjustmentFactor: 4,                   // 25% less, 400% more\n\t\tReduceMinDifficulty:      false,\n\t\tMinDiffReductionTime:     time.Minute * 20, // TargetTimePerBlock * 2\n\t\tGenerateSupported:        false,\n\n\t\t// Checkpoints ordered from oldest to newest.\n\t\tCheckpoints: nil,\n\n\t\t// Consensus rule change deployments.\n\t\t//\n\t\t// The miner confirmation window is defined as:\n\t\t//   target proof of work timespan / target proof of work spacing\n\t\tRuleChangeActivationThreshold: 1916, // 95% of 2016\n\t\tMinerConfirmationWindow:       2016,\n\t\tDeployments: [DefinedDeployments]ConsensusDeployment{\n\t\t\tDeploymentTestDummy: {\n\t\t\t\tBitNumber: 28,\n\t\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\t\ttime.Unix(1199145601, 0), // January 1, 2008 UTC\n\t\t\t\t),\n\t\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\t\ttime.Unix(1230767999, 0), // December 31, 2008 UTC\n\t\t\t\t),\n\t\t\t},\n\t\t\tDeploymentTestDummyMinActivation: {\n\t\t\t\tBitNumber:                 22,\n\t\t\t\tCustomActivationThreshold: 1815,    // Only needs 90% hash rate.\n\t\t\t\tMinActivationHeight:       10_0000, // Can only activate after height 10k.\n\t\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t\t),\n\t\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\t\ttime.Time{}, // Never expires\n\t\t\t\t),\n\t\t\t},\n\t\t\tDeploymentTestDummyAlwaysActive: {\n\t\t\t\tBitNumber: 30,\n\t\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t\t),\n\t\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\t\ttime.Time{}, // Never expires\n\t\t\t\t),\n\t\t\t\tAlwaysActiveHeight: 1,\n\t\t\t},\n\t\t\tDeploymentCSV: {\n\t\t\t\tBitNumber: 29,\n\t\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t\t),\n\t\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\t\ttime.Time{}, // Never expires\n\t\t\t\t),\n\t\t\t},\n\t\t\tDeploymentSegwit: {\n\t\t\t\tBitNumber: 29,\n\t\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t\t),\n\t\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\t\ttime.Time{}, // Never expires\n\t\t\t\t),\n\t\t\t},\n\t\t\tDeploymentTaproot: {\n\t\t\t\tBitNumber: 29,\n\t\t\t\tDeploymentStarter: NewMedianTimeDeploymentStarter(\n\t\t\t\t\ttime.Time{}, // Always available for vote\n\t\t\t\t),\n\t\t\t\tDeploymentEnder: NewMedianTimeDeploymentEnder(\n\t\t\t\t\ttime.Time{}, // Never expires\n\t\t\t\t),\n\t\t\t},\n\t\t},\n\n\t\t// Mempool parameters\n\t\tRelayNonStdTxs: false,\n\n\t\t// Human-readable part for Bech32 encoded segwit addresses, as defined in\n\t\t// BIP 173.\n\t\tBech32HRPSegwit: \"tb\", // always tb for test net\n\n\t\t// Address encoding magics\n\t\tPubKeyHashAddrID:        0x6f, // starts with m or n\n\t\tScriptHashAddrID:        0xc4, // starts with 2\n\t\tWitnessPubKeyHashAddrID: 0x03, // starts with QW\n\t\tWitnessScriptHashAddrID: 0x28, // starts with T7n\n\t\tPrivateKeyID:            0xef, // starts with 9 (uncompressed) or c (compressed)\n\n\t\t// BIP32 hierarchical deterministic extended key magics\n\t\tHDPrivateKeyID: [4]byte{0x04, 0x35, 0x83, 0x94}, // starts with tprv\n\t\tHDPublicKeyID:  [4]byte{0x04, 0x35, 0x87, 0xcf}, // starts with tpub\n\n\t\t// BIP44 coin type used in the hierarchical deterministic path for\n\t\t// address generation.\n\t\tHDCoinType: 1,\n\t}\n}\n\nvar (\n\t// ErrDuplicateNet describes an error where the parameters for a Bitcoin\n\t// network could not be set due to the network already being a standard\n\t// network or previously-registered into this package.\n\tErrDuplicateNet = errors.New(\"duplicate Bitcoin network\")\n\n\t// ErrUnknownHDKeyID describes an error where the provided id which\n\t// is intended to identify the network for a hierarchical deterministic\n\t// private extended key is not registered.\n\tErrUnknownHDKeyID = errors.New(\"unknown hd private extended key bytes\")\n\n\t// ErrInvalidHDKeyID describes an error where the provided hierarchical\n\t// deterministic version bytes, or hd key id, is malformed.\n\tErrInvalidHDKeyID = errors.New(\"invalid hd extended key version bytes\")\n)\n\nvar (\n\tregisteredNets       = make(map[wire.BitcoinNet]struct{})\n\tpubKeyHashAddrIDs    = make(map[byte]struct{})\n\tscriptHashAddrIDs    = make(map[byte]struct{})\n\tbech32SegwitPrefixes = make(map[string]struct{})\n\thdPrivToPubKeyIDs    = make(map[[4]byte][]byte)\n)\n\n// String returns the hostname of the DNS seed in human-readable form.\nfunc (d DNSSeed) String() string {\n\treturn d.Host\n}\n\n// Register registers the network parameters for a Bitcoin network.  This may\n// error with ErrDuplicateNet if the network is already registered (either\n// due to a previous Register call, or the network being one of the default\n// networks).\n//\n// Network parameters should be registered into this package by a main package\n// as early as possible.  Then, library packages may lookup networks or network\n// parameters based on inputs and work regardless of the network being standard\n// or not.\nfunc Register(params *Params) error {\n\tif _, ok := registeredNets[params.Net]; ok {\n\t\treturn ErrDuplicateNet\n\t}\n\tregisteredNets[params.Net] = struct{}{}\n\tpubKeyHashAddrIDs[params.PubKeyHashAddrID] = struct{}{}\n\tscriptHashAddrIDs[params.ScriptHashAddrID] = struct{}{}\n\n\terr := RegisterHDKeyID(params.HDPublicKeyID[:], params.HDPrivateKeyID[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// A valid Bech32 encoded segwit address always has as prefix the\n\t// human-readable part for the given net followed by '1'.\n\tbech32SegwitPrefixes[params.Bech32HRPSegwit+\"1\"] = struct{}{}\n\treturn nil\n}\n\n// mustRegister performs the same function as Register except it panics if there\n// is an error.  This should only be called from package init functions.\nfunc mustRegister(params *Params) {\n\tif err := Register(params); err != nil {\n\t\tpanic(\"failed to register network: \" + err.Error())\n\t}\n}\n\n// IsPubKeyHashAddrID returns whether the id is an identifier known to prefix a\n// pay-to-pubkey-hash address on any default or registered network.  This is\n// used when decoding an address string into a specific address type.  It is up\n// to the caller to check both this and IsScriptHashAddrID and decide whether an\n// address is a pubkey hash address, script hash address, neither, or\n// undeterminable (if both return true).\nfunc IsPubKeyHashAddrID(id byte) bool {\n\t_, ok := pubKeyHashAddrIDs[id]\n\treturn ok\n}\n\n// IsScriptHashAddrID returns whether the id is an identifier known to prefix a\n// pay-to-script-hash address on any default or registered network.  This is\n// used when decoding an address string into a specific address type.  It is up\n// to the caller to check both this and IsPubKeyHashAddrID and decide whether an\n// address is a pubkey hash address, script hash address, neither, or\n// undeterminable (if both return true).\nfunc IsScriptHashAddrID(id byte) bool {\n\t_, ok := scriptHashAddrIDs[id]\n\treturn ok\n}\n\n// IsBech32SegwitPrefix returns whether the prefix is a known prefix for segwit\n// addresses on any default or registered network.  This is used when decoding\n// an address string into a specific address type.\nfunc IsBech32SegwitPrefix(prefix string) bool {\n\tprefix = strings.ToLower(prefix)\n\t_, ok := bech32SegwitPrefixes[prefix]\n\treturn ok\n}\n\n// RegisterHDKeyID registers a public and private hierarchical deterministic\n// extended key ID pair.\n//\n// Non-standard HD version bytes, such as the ones documented in SLIP-0132,\n// should be registered using this method for library packages to lookup key\n// IDs (aka HD version bytes). When the provided key IDs are invalid, the\n// ErrInvalidHDKeyID error will be returned.\n//\n// Reference:\n//\n//\tSLIP-0132 : Registered HD version bytes for BIP-0032\n//\thttps://github.com/satoshilabs/slips/blob/master/slip-0132.md\nfunc RegisterHDKeyID(hdPublicKeyID []byte, hdPrivateKeyID []byte) error {\n\tif len(hdPublicKeyID) != 4 || len(hdPrivateKeyID) != 4 {\n\t\treturn ErrInvalidHDKeyID\n\t}\n\n\tvar keyID [4]byte\n\tcopy(keyID[:], hdPrivateKeyID)\n\thdPrivToPubKeyIDs[keyID] = hdPublicKeyID\n\n\treturn nil\n}\n\n// HDPrivateKeyToPublicKeyID accepts a private hierarchical deterministic\n// extended key id and returns the associated public key id.  When the provided\n// id is not registered, the ErrUnknownHDKeyID error will be returned.\nfunc HDPrivateKeyToPublicKeyID(id []byte) ([]byte, error) {\n\tif len(id) != 4 {\n\t\treturn nil, ErrUnknownHDKeyID\n\t}\n\n\tvar key [4]byte\n\tcopy(key[:], id)\n\tpubBytes, ok := hdPrivToPubKeyIDs[key]\n\tif !ok {\n\t\treturn nil, ErrUnknownHDKeyID\n\t}\n\n\treturn pubBytes, nil\n}\n\n// newHashFromStr converts the passed big-endian hex string into a\n// chainhash.Hash.  It only differs from the one available in chainhash in that\n// it panics on an error since it will only (and must only) be called with\n// hard-coded, and therefore known good, hashes.\nfunc newHashFromStr(hexStr string) *chainhash.Hash {\n\thash, err := chainhash.NewHashFromStr(hexStr)\n\tif err != nil {\n\t\t// Ordinarily I don't like panics in library code since it\n\t\t// can take applications down without them having a chance to\n\t\t// recover which is extremely annoying, however an exception is\n\t\t// being made in this case because the only way this can panic\n\t\t// is if there is an error in the hard-coded hashes.  Thus it\n\t\t// will only ever potentially panic on init and therefore is\n\t\t// 100% predictable.\n\t\tpanic(err)\n\t}\n\treturn hash\n}\n\nfunc init() {\n\t// Register all default networks when the package is initialized.\n\tmustRegister(&MainNetParams)\n\tmustRegister(&TestNet3Params)\n\tmustRegister(&TestNet4Params)\n\tmustRegister(&RegressionNetParams)\n\tmustRegister(&SimNetParams)\n}\n"
  },
  {
    "path": "chaincfg/params_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage chaincfg\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestInvalidHashStr ensures the newShaHashFromStr function panics when used to\n// with an invalid hash string.\nfunc TestInvalidHashStr(t *testing.T) {\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Errorf(\"Expected panic for invalid hash, got nil\")\n\t\t}\n\t}()\n\tnewHashFromStr(\"banana\")\n}\n\n// TestMustRegisterPanic ensures the mustRegister function panics when used to\n// register an invalid network.\nfunc TestMustRegisterPanic(t *testing.T) {\n\tt.Parallel()\n\n\t// Setup a defer to catch the expected panic to ensure it actually\n\t// paniced.\n\tdefer func() {\n\t\tif err := recover(); err == nil {\n\t\t\tt.Error(\"mustRegister did not panic as expected\")\n\t\t}\n\t}()\n\n\t// Intentionally try to register duplicate params to force a panic.\n\tmustRegister(&MainNetParams)\n}\n\nfunc TestRegisterHDKeyID(t *testing.T) {\n\tt.Parallel()\n\n\t// Ref: https://github.com/satoshilabs/slips/blob/master/slip-0132.md\n\thdKeyIDZprv := []byte{0x02, 0xaa, 0x7a, 0x99}\n\thdKeyIDZpub := []byte{0x02, 0xaa, 0x7e, 0xd3}\n\n\tif err := RegisterHDKeyID(hdKeyIDZpub, hdKeyIDZprv); err != nil {\n\t\tt.Fatalf(\"RegisterHDKeyID: expected no error, got %v\", err)\n\t}\n\n\tgot, err := HDPrivateKeyToPublicKeyID(hdKeyIDZprv)\n\tif err != nil {\n\t\tt.Fatalf(\"HDPrivateKeyToPublicKeyID: expected no error, got %v\", err)\n\t}\n\n\tif !bytes.Equal(got, hdKeyIDZpub) {\n\t\tt.Fatalf(\"HDPrivateKeyToPublicKeyID: expected result %v, got %v\",\n\t\t\thdKeyIDZpub, got)\n\t}\n}\n\nfunc TestInvalidHDKeyID(t *testing.T) {\n\tt.Parallel()\n\n\tprvValid := []byte{0x02, 0xaa, 0x7a, 0x99}\n\tpubValid := []byte{0x02, 0xaa, 0x7e, 0xd3}\n\tprvInvalid := []byte{0x00}\n\tpubInvalid := []byte{0x00}\n\n\tif err := RegisterHDKeyID(pubInvalid, prvValid); err != ErrInvalidHDKeyID {\n\t\tt.Fatalf(\"RegisterHDKeyID: want err ErrInvalidHDKeyID, got %v\", err)\n\t}\n\n\tif err := RegisterHDKeyID(pubValid, prvInvalid); err != ErrInvalidHDKeyID {\n\t\tt.Fatalf(\"RegisterHDKeyID: want err ErrInvalidHDKeyID, got %v\", err)\n\t}\n\n\tif err := RegisterHDKeyID(pubInvalid, prvInvalid); err != ErrInvalidHDKeyID {\n\t\tt.Fatalf(\"RegisterHDKeyID: want err ErrInvalidHDKeyID, got %v\", err)\n\t}\n\n\t// FIXME: The error type should be changed to ErrInvalidHDKeyID.\n\tif _, err := HDPrivateKeyToPublicKeyID(prvInvalid); err != ErrUnknownHDKeyID {\n\t\tt.Fatalf(\"HDPrivateKeyToPublicKeyID: want err ErrUnknownHDKeyID, got %v\", err)\n\t}\n}\n\nfunc TestSigNetPowLimit(t *testing.T) {\n\tsigNetPowLimitHex, _ := hex.DecodeString(\n\t\t\"00000377ae000000000000000000000000000000000000000000000000000000\",\n\t)\n\tpowLimit := new(big.Int).SetBytes(sigNetPowLimitHex)\n\tif sigNetPowLimit.Cmp(powLimit) != 0 {\n\t\tt.Fatalf(\"Signet PoW limit bits (%s) not equal to big int (%s)\",\n\t\t\tsigNetPowLimit.Text(16), powLimit.Text(16))\n\t}\n\n\tif compactToBig(sigNetGenesisBlock.Header.Bits).Cmp(powLimit) != 0 {\n\t\tt.Fatalf(\"Signet PoW limit header bits (%d) not equal to big \"+\n\t\t\t\"int (%s)\", sigNetGenesisBlock.Header.Bits,\n\t\t\tpowLimit.Text(16))\n\t}\n}\n\n// TestSigNetMagic makes sure that the default signet has the expected bitcoin\n// network magic.\nfunc TestSigNetMagic(t *testing.T) {\n\trequire.Equal(t, wire.SigNet, SigNetParams.Net)\n}\n\n// compactToBig is a copy of the blockchain.CompactToBig function. We copy it\n// here so we don't run into a circular dependency just because of a test.\nfunc compactToBig(compact uint32) *big.Int {\n\t// Extract the mantissa, sign bit, and exponent.\n\tmantissa := compact & 0x007fffff\n\tisNegative := compact&0x00800000 != 0\n\texponent := uint(compact >> 24)\n\n\t// Since the base for the exponent is 256, the exponent can be treated\n\t// as the number of bytes to represent the full 256-bit number.  So,\n\t// treat the exponent as the number of bytes and shift the mantissa\n\t// right or left accordingly.  This is equivalent to:\n\t// N = mantissa * 256^(exponent-3)\n\tvar bn *big.Int\n\tif exponent <= 3 {\n\t\tmantissa >>= 8 * (3 - exponent)\n\t\tbn = big.NewInt(int64(mantissa))\n\t} else {\n\t\tbn = big.NewInt(int64(mantissa))\n\t\tbn.Lsh(bn, 8*(exponent-3))\n\t}\n\n\t// Make it negative if the sign bit is set.\n\tif isNegative {\n\t\tbn = bn.Neg(bn)\n\t}\n\n\treturn bn\n}\n"
  },
  {
    "path": "chaincfg/register_test.go",
    "content": "package chaincfg_test\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n\n\t. \"github.com/btcsuite/btcd/chaincfg\"\n)\n\n// Define some of the required parameters for a user-registered\n// network.  This is necessary to test the registration of and\n// lookup of encoding magics from the network.\nvar mockNetParams = Params{\n\tName:             \"mocknet\",\n\tNet:              1<<32 - 1,\n\tPubKeyHashAddrID: 0x9f,\n\tScriptHashAddrID: 0xf9,\n\tBech32HRPSegwit:  \"tc\",\n\tHDPrivateKeyID:   [4]byte{0x01, 0x02, 0x03, 0x04},\n\tHDPublicKeyID:    [4]byte{0x05, 0x06, 0x07, 0x08},\n}\n\nfunc TestRegister(t *testing.T) {\n\ttype registerTest struct {\n\t\tname   string\n\t\tparams *Params\n\t\terr    error\n\t}\n\ttype magicTest struct {\n\t\tmagic byte\n\t\tvalid bool\n\t}\n\ttype prefixTest struct {\n\t\tprefix string\n\t\tvalid  bool\n\t}\n\ttype hdTest struct {\n\t\tpriv []byte\n\t\twant []byte\n\t\terr  error\n\t}\n\n\ttests := []struct {\n\t\tname           string\n\t\tregister       []registerTest\n\t\tp2pkhMagics    []magicTest\n\t\tp2shMagics     []magicTest\n\t\tsegwitPrefixes []prefixTest\n\t\thdMagics       []hdTest\n\t}{\n\t\t{\n\t\t\tname: \"default networks\",\n\t\t\tregister: []registerTest{\n\t\t\t\t{\n\t\t\t\t\tname:   \"duplicate mainnet\",\n\t\t\t\t\tparams: &MainNetParams,\n\t\t\t\t\terr:    ErrDuplicateNet,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname:   \"duplicate regtest\",\n\t\t\t\t\tparams: &RegressionNetParams,\n\t\t\t\t\terr:    ErrDuplicateNet,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname:   \"duplicate testnet3\",\n\t\t\t\t\tparams: &TestNet3Params,\n\t\t\t\t\terr:    ErrDuplicateNet,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname:   \"duplicate testnet4\",\n\t\t\t\t\tparams: &TestNet4Params,\n\t\t\t\t\terr:    ErrDuplicateNet,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname:   \"duplicate simnet\",\n\t\t\t\t\tparams: &SimNetParams,\n\t\t\t\t\terr:    ErrDuplicateNet,\n\t\t\t\t},\n\t\t\t},\n\t\t\tp2pkhMagics: []magicTest{\n\t\t\t\t{\n\t\t\t\t\tmagic: MainNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet3Params.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet4Params.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: RegressionNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: SimNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: mockNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: 0xFF,\n\t\t\t\t\tvalid: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tp2shMagics: []magicTest{\n\t\t\t\t{\n\t\t\t\t\tmagic: MainNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet3Params.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet4Params.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: RegressionNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: SimNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: mockNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: 0xFF,\n\t\t\t\t\tvalid: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tsegwitPrefixes: []prefixTest{\n\t\t\t\t{\n\t\t\t\t\tprefix: MainNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: TestNet3Params.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: TestNet4Params.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: RegressionNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: SimNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: strings.ToUpper(MainNetParams.Bech32HRPSegwit + \"1\"),\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: mockNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: \"abc1\",\n\t\t\t\t\tvalid:  false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: \"1\",\n\t\t\t\t\tvalid:  false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: MainNetParams.Bech32HRPSegwit,\n\t\t\t\t\tvalid:  false,\n\t\t\t\t},\n\t\t\t},\n\t\t\thdMagics: []hdTest{\n\t\t\t\t{\n\t\t\t\t\tpriv: MainNetParams.HDPrivateKeyID[:],\n\t\t\t\t\twant: MainNetParams.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: TestNet3Params.HDPrivateKeyID[:],\n\t\t\t\t\twant: TestNet3Params.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: TestNet4Params.HDPrivateKeyID[:],\n\t\t\t\t\twant: TestNet4Params.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: RegressionNetParams.HDPrivateKeyID[:],\n\t\t\t\t\twant: RegressionNetParams.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: SimNetParams.HDPrivateKeyID[:],\n\t\t\t\t\twant: SimNetParams.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: mockNetParams.HDPrivateKeyID[:],\n\t\t\t\t\terr:  ErrUnknownHDKeyID,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: []byte{0xff, 0xff, 0xff, 0xff},\n\t\t\t\t\terr:  ErrUnknownHDKeyID,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: []byte{0xff},\n\t\t\t\t\terr:  ErrUnknownHDKeyID,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"register mocknet\",\n\t\t\tregister: []registerTest{\n\t\t\t\t{\n\t\t\t\t\tname:   \"mocknet\",\n\t\t\t\t\tparams: &mockNetParams,\n\t\t\t\t\terr:    nil,\n\t\t\t\t},\n\t\t\t},\n\t\t\tp2pkhMagics: []magicTest{\n\t\t\t\t{\n\t\t\t\t\tmagic: MainNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet3Params.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet4Params.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: RegressionNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: SimNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: mockNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: 0xFF,\n\t\t\t\t\tvalid: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tp2shMagics: []magicTest{\n\t\t\t\t{\n\t\t\t\t\tmagic: MainNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet3Params.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet4Params.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: RegressionNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: SimNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: mockNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: 0xFF,\n\t\t\t\t\tvalid: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tsegwitPrefixes: []prefixTest{\n\t\t\t\t{\n\t\t\t\t\tprefix: MainNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: TestNet3Params.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: TestNet4Params.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: RegressionNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: SimNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: strings.ToUpper(MainNetParams.Bech32HRPSegwit + \"1\"),\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: mockNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: \"abc1\",\n\t\t\t\t\tvalid:  false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: \"1\",\n\t\t\t\t\tvalid:  false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: MainNetParams.Bech32HRPSegwit,\n\t\t\t\t\tvalid:  false,\n\t\t\t\t},\n\t\t\t},\n\t\t\thdMagics: []hdTest{\n\t\t\t\t{\n\t\t\t\t\tpriv: mockNetParams.HDPrivateKeyID[:],\n\t\t\t\t\twant: mockNetParams.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"more duplicates\",\n\t\t\tregister: []registerTest{\n\t\t\t\t{\n\t\t\t\t\tname:   \"duplicate mainnet\",\n\t\t\t\t\tparams: &MainNetParams,\n\t\t\t\t\terr:    ErrDuplicateNet,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname:   \"duplicate regtest\",\n\t\t\t\t\tparams: &RegressionNetParams,\n\t\t\t\t\terr:    ErrDuplicateNet,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname:   \"duplicate testnet3\",\n\t\t\t\t\tparams: &TestNet3Params,\n\t\t\t\t\terr:    ErrDuplicateNet,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname:   \"duplicate testnet4\",\n\t\t\t\t\tparams: &TestNet4Params,\n\t\t\t\t\terr:    ErrDuplicateNet,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname:   \"duplicate simnet\",\n\t\t\t\t\tparams: &SimNetParams,\n\t\t\t\t\terr:    ErrDuplicateNet,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname:   \"duplicate mocknet\",\n\t\t\t\t\tparams: &mockNetParams,\n\t\t\t\t\terr:    ErrDuplicateNet,\n\t\t\t\t},\n\t\t\t},\n\t\t\tp2pkhMagics: []magicTest{\n\t\t\t\t{\n\t\t\t\t\tmagic: MainNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet3Params.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet4Params.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: RegressionNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: SimNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: mockNetParams.PubKeyHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: 0xFF,\n\t\t\t\t\tvalid: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tp2shMagics: []magicTest{\n\t\t\t\t{\n\t\t\t\t\tmagic: MainNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet3Params.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: TestNet4Params.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: RegressionNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: SimNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: mockNetParams.ScriptHashAddrID,\n\t\t\t\t\tvalid: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmagic: 0xFF,\n\t\t\t\t\tvalid: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tsegwitPrefixes: []prefixTest{\n\t\t\t\t{\n\t\t\t\t\tprefix: MainNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: TestNet3Params.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: TestNet4Params.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: RegressionNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: SimNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: strings.ToUpper(MainNetParams.Bech32HRPSegwit + \"1\"),\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: mockNetParams.Bech32HRPSegwit + \"1\",\n\t\t\t\t\tvalid:  true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: \"abc1\",\n\t\t\t\t\tvalid:  false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: \"1\",\n\t\t\t\t\tvalid:  false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tprefix: MainNetParams.Bech32HRPSegwit,\n\t\t\t\t\tvalid:  false,\n\t\t\t\t},\n\t\t\t},\n\t\t\thdMagics: []hdTest{\n\t\t\t\t{\n\t\t\t\t\tpriv: MainNetParams.HDPrivateKeyID[:],\n\t\t\t\t\twant: MainNetParams.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: TestNet3Params.HDPrivateKeyID[:],\n\t\t\t\t\twant: TestNet3Params.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: TestNet4Params.HDPrivateKeyID[:],\n\t\t\t\t\twant: TestNet4Params.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: RegressionNetParams.HDPrivateKeyID[:],\n\t\t\t\t\twant: RegressionNetParams.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: SimNetParams.HDPrivateKeyID[:],\n\t\t\t\t\twant: SimNetParams.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: mockNetParams.HDPrivateKeyID[:],\n\t\t\t\t\twant: mockNetParams.HDPublicKeyID[:],\n\t\t\t\t\terr:  nil,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: []byte{0xff, 0xff, 0xff, 0xff},\n\t\t\t\t\terr:  ErrUnknownHDKeyID,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpriv: []byte{0xff},\n\t\t\t\t\terr:  ErrUnknownHDKeyID,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tfor _, regTest := range test.register {\n\t\t\terr := Register(regTest.params)\n\t\t\tif err != regTest.err {\n\t\t\t\tt.Errorf(\"%s:%s: Registered network with unexpected error: got %v expected %v\",\n\t\t\t\t\ttest.name, regTest.name, err, regTest.err)\n\t\t\t}\n\t\t}\n\t\tfor i, magTest := range test.p2pkhMagics {\n\t\t\tvalid := IsPubKeyHashAddrID(magTest.magic)\n\t\t\tif valid != magTest.valid {\n\t\t\t\tt.Errorf(\"%s: P2PKH magic %d valid mismatch: got %v expected %v\",\n\t\t\t\t\ttest.name, i, valid, magTest.valid)\n\t\t\t}\n\t\t}\n\t\tfor i, magTest := range test.p2shMagics {\n\t\t\tvalid := IsScriptHashAddrID(magTest.magic)\n\t\t\tif valid != magTest.valid {\n\t\t\t\tt.Errorf(\"%s: P2SH magic %d valid mismatch: got %v expected %v\",\n\t\t\t\t\ttest.name, i, valid, magTest.valid)\n\t\t\t}\n\t\t}\n\t\tfor i, prxTest := range test.segwitPrefixes {\n\t\t\tvalid := IsBech32SegwitPrefix(prxTest.prefix)\n\t\t\tif valid != prxTest.valid {\n\t\t\t\tt.Errorf(\"%s: segwit prefix %s (%d) valid mismatch: got %v expected %v\",\n\t\t\t\t\ttest.name, prxTest.prefix, i, valid, prxTest.valid)\n\t\t\t}\n\t\t}\n\t\tfor i, magTest := range test.hdMagics {\n\t\t\tpubKey, err := HDPrivateKeyToPublicKeyID(magTest.priv[:])\n\t\t\tif !reflect.DeepEqual(err, magTest.err) {\n\t\t\t\tt.Errorf(\"%s: HD magic %d mismatched error: got %v expected %v \",\n\t\t\t\t\ttest.name, i, err, magTest.err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif magTest.err == nil && !bytes.Equal(pubKey, magTest.want[:]) {\n\t\t\t\tt.Errorf(\"%s: HD magic %d private and public mismatch: got %v expected %v \",\n\t\t\t\t\ttest.name, i, pubKey, magTest.want[:])\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "cmd/addblock/addblock.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/blockchain/indexers\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/limits\"\n\t\"github.com/btcsuite/btclog\"\n)\n\nconst (\n\t// blockDbNamePrefix is the prefix for the btcd block database.\n\tblockDbNamePrefix = \"blocks\"\n)\n\nvar (\n\tcfg *config\n\tlog btclog.Logger\n)\n\n// loadBlockDB opens the block database and returns a handle to it.\nfunc loadBlockDB() (database.DB, error) {\n\t// The database name is based on the database type.\n\tdbName := blockDbNamePrefix + \"_\" + cfg.DbType\n\tdbPath := filepath.Join(cfg.DataDir, dbName)\n\n\tlog.Infof(\"Loading block database from '%s'\", dbPath)\n\tdb, err := database.Open(cfg.DbType, dbPath, activeNetParams.Net)\n\tif err != nil {\n\t\t// Return the error if it's not because the database doesn't\n\t\t// exist.\n\t\tif dbErr, ok := err.(database.Error); !ok || dbErr.ErrorCode !=\n\t\t\tdatabase.ErrDbDoesNotExist {\n\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Create the db if it does not exist.\n\t\terr = os.MkdirAll(cfg.DataDir, 0700)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdb, err = database.Create(cfg.DbType, dbPath, activeNetParams.Net)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tlog.Info(\"Block database loaded\")\n\treturn db, nil\n}\n\n// realMain is the real main function for the utility.  It is necessary to work\n// around the fact that deferred functions do not run when os.Exit() is called.\nfunc realMain() error {\n\t// Load configuration and parse command line.\n\ttcfg, _, err := loadConfig()\n\tif err != nil {\n\t\treturn err\n\t}\n\tcfg = tcfg\n\n\t// Setup logging.\n\tbackendLogger := btclog.NewBackend(os.Stdout)\n\tdefer os.Stdout.Sync()\n\tlog = backendLogger.Logger(\"MAIN\")\n\tdatabase.UseLogger(backendLogger.Logger(\"BCDB\"))\n\tblockchain.UseLogger(backendLogger.Logger(\"CHAN\"))\n\tindexers.UseLogger(backendLogger.Logger(\"INDX\"))\n\n\t// Load the block database.\n\tdb, err := loadBlockDB()\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to load database: %v\", err)\n\t\treturn err\n\t}\n\tdefer db.Close()\n\n\tfi, err := os.Open(cfg.InFile)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to open file %v: %v\", cfg.InFile, err)\n\t\treturn err\n\t}\n\tdefer fi.Close()\n\n\t// Create a block importer for the database and input file and start it.\n\t// The done channel returned from start will contain an error if\n\t// anything went wrong.\n\timporter, err := newBlockImporter(db, fi)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed create block importer: %v\", err)\n\t\treturn err\n\t}\n\n\t// Perform the import asynchronously.  This allows blocks to be\n\t// processed and read in parallel.  The results channel returned from\n\t// Import contains the statistics about the import including an error\n\t// if something went wrong.\n\tlog.Info(\"Starting import\")\n\tresultsChan := importer.Import()\n\tresults := <-resultsChan\n\tif results.err != nil {\n\t\tlog.Errorf(\"%v\", results.err)\n\t\treturn results.err\n\t}\n\n\tlog.Infof(\"Processed a total of %d blocks (%d imported, %d already \"+\n\t\t\"known)\", results.blocksProcessed, results.blocksImported,\n\t\tresults.blocksProcessed-results.blocksImported)\n\treturn nil\n}\n\nfunc main() {\n\t// up some limits.\n\tif err := limits.SetLimits(); err != nil {\n\t\tos.Exit(1)\n\t}\n\n\t// Work around defer not working after os.Exit()\n\tif err := realMain(); err != nil {\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "cmd/addblock/config.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/database\"\n\t_ \"github.com/btcsuite/btcd/database/ffldb\"\n\t\"github.com/btcsuite/btcd/wire\"\n\tflags \"github.com/jessevdk/go-flags\"\n)\n\nconst (\n\tdefaultDbType   = \"ffldb\"\n\tdefaultDataFile = \"bootstrap.dat\"\n\tdefaultProgress = 10\n)\n\nvar (\n\tbtcdHomeDir     = btcutil.AppDataDir(\"btcd\", false)\n\tdefaultDataDir  = filepath.Join(btcdHomeDir, \"data\")\n\tknownDbTypes    = database.SupportedDrivers()\n\tactiveNetParams = &chaincfg.MainNetParams\n)\n\n// config defines the configuration options for addblock.\n//\n// See loadConfig for details on the configuration load process.\ntype config struct {\n\tAddrIndex      bool   `long:\"addrindex\" description:\"Build a full address-based transaction index which makes the searchrawtransactions RPC available\"`\n\tDataDir        string `short:\"b\" long:\"datadir\" description:\"Location of the btcd data directory\"`\n\tDbType         string `long:\"dbtype\" description:\"Database backend to use for the Block Chain\"`\n\tInFile         string `short:\"i\" long:\"infile\" description:\"File containing the block(s)\"`\n\tProgress       int    `short:\"p\" long:\"progress\" description:\"Show a progress message each time this number of seconds have passed -- Use 0 to disable progress announcements\"`\n\tRegressionTest bool   `long:\"regtest\" description:\"Use the regression test network\"`\n\tSimNet         bool   `long:\"simnet\" description:\"Use the simulation test network\"`\n\tTestNet3       bool   `long:\"testnet\" description:\"Use the test network (version 3)\"`\n\tTestNet4       bool   `long:\"testnet4\" description:\"Use the test network (version 4)\"`\n\tTxIndex        bool   `long:\"txindex\" description:\"Build a full hash-based transaction index which makes all transactions available via the getrawtransaction RPC\"`\n}\n\n// fileExists reports whether the named file or directory exists.\nfunc fileExists(name string) bool {\n\tif _, err := os.Stat(name); err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// validDbType returns whether or not dbType is a supported database type.\nfunc validDbType(dbType string) bool {\n\treturn slices.Contains(knownDbTypes, dbType)\n}\n\n// netName returns the name used when referring to a bitcoin network.  At the\n// time of writing, btcd currently places blocks for testnet version 3 in the\n// data and log directory \"testnet\", which does not match the Name field of the\n// chaincfg parameters.  This function can be used to override this directory name\n// as \"testnet\" when the passed active network matches wire.TestNet3.\n//\n// A proper upgrade to move the data and log directories for this network to\n// \"testnet3\" is planned for the future, at which point this function can be\n// removed and the network parameter's name used instead.\nfunc netName(chainParams *chaincfg.Params) string {\n\tswitch chainParams.Net {\n\tcase wire.TestNet3:\n\t\treturn \"testnet\"\n\tdefault:\n\t\treturn chainParams.Name\n\t}\n}\n\n// loadConfig initializes and parses the config using command line options.\nfunc loadConfig() (*config, []string, error) {\n\t// Default config.\n\tcfg := config{\n\t\tDataDir:  defaultDataDir,\n\t\tDbType:   defaultDbType,\n\t\tInFile:   defaultDataFile,\n\t\tProgress: defaultProgress,\n\t}\n\n\t// Parse command line options.\n\tparser := flags.NewParser(&cfg, flags.Default)\n\tremainingArgs, err := parser.Parse()\n\tif err != nil {\n\t\tif e, ok := err.(*flags.Error); !ok || e.Type != flags.ErrHelp {\n\t\t\tparser.WriteHelp(os.Stderr)\n\t\t}\n\t\treturn nil, nil, err\n\t}\n\n\t// Multiple networks can't be selected simultaneously.\n\tfuncName := \"loadConfig\"\n\tnumNets := 0\n\t// Count number of network flags passed; assign active network params\n\t// while we're at it\n\tif cfg.TestNet3 {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.TestNet3Params\n\t}\n\tif cfg.TestNet4 {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.TestNet4Params\n\t}\n\tif cfg.RegressionTest {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.RegressionNetParams\n\t}\n\tif cfg.SimNet {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.SimNetParams\n\t}\n\tif numNets > 1 {\n\t\tstr := \"%s: The testnet, regtest, and simnet params can't be \" +\n\t\t\t\"used together -- choose one of the three\"\n\t\terr := fmt.Errorf(str, funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tparser.WriteHelp(os.Stderr)\n\t\treturn nil, nil, err\n\t}\n\n\t// Validate database type.\n\tif !validDbType(cfg.DbType) {\n\t\tstr := \"%s: The specified database type [%v] is invalid -- \" +\n\t\t\t\"supported types %v\"\n\t\terr := fmt.Errorf(str, \"loadConfig\", cfg.DbType, knownDbTypes)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tparser.WriteHelp(os.Stderr)\n\t\treturn nil, nil, err\n\t}\n\n\t// Append the network type to the data directory so it is \"namespaced\"\n\t// per network.  In addition to the block database, there are other\n\t// pieces of data that are saved to disk such as address manager state.\n\t// All data is specific to a network, so namespacing the data directory\n\t// means each individual piece of serialized data does not have to\n\t// worry about changing names per network and such.\n\tcfg.DataDir = filepath.Join(cfg.DataDir, netName(activeNetParams))\n\n\t// Ensure the specified block file exists.\n\tif !fileExists(cfg.InFile) {\n\t\tstr := \"%s: The specified block file [%v] does not exist\"\n\t\terr := fmt.Errorf(str, \"loadConfig\", cfg.InFile)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tparser.WriteHelp(os.Stderr)\n\t\treturn nil, nil, err\n\t}\n\n\treturn &cfg, remainingArgs, nil\n}\n"
  },
  {
    "path": "cmd/addblock/import.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/blockchain/indexers\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nvar zeroHash = chainhash.Hash{}\n\n// importResults houses the stats and result as an import operation.\ntype importResults struct {\n\tblocksProcessed int64\n\tblocksImported  int64\n\terr             error\n}\n\n// blockImporter houses information about an ongoing import from a block data\n// file to the block database.\ntype blockImporter struct {\n\tdb                database.DB\n\tchain             *blockchain.BlockChain\n\tr                 io.ReadSeeker\n\tprocessQueue      chan []byte\n\tdoneChan          chan bool\n\terrChan           chan error\n\tquit              chan struct{}\n\twg                sync.WaitGroup\n\tblocksProcessed   int64\n\tblocksImported    int64\n\treceivedLogBlocks int64\n\treceivedLogTx     int64\n\tlastHeight        int64\n\tlastBlockTime     time.Time\n\tlastLogTime       time.Time\n}\n\n// readBlock reads the next block from the input file.\nfunc (bi *blockImporter) readBlock() ([]byte, error) {\n\t// The block file format is:\n\t//  <network> <block length> <serialized block>\n\tvar net uint32\n\terr := binary.Read(bi.r, binary.LittleEndian, &net)\n\tif err != nil {\n\t\tif err != io.EOF {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// No block and no error means there are no more blocks to read.\n\t\treturn nil, nil\n\t}\n\tif net != uint32(activeNetParams.Net) {\n\t\treturn nil, fmt.Errorf(\"network mismatch -- got %x, want %x\",\n\t\t\tnet, uint32(activeNetParams.Net))\n\t}\n\n\t// Read the block length and ensure it is sane.\n\tvar blockLen uint32\n\tif err := binary.Read(bi.r, binary.LittleEndian, &blockLen); err != nil {\n\t\treturn nil, err\n\t}\n\tif blockLen > wire.MaxBlockPayload {\n\t\treturn nil, fmt.Errorf(\"block payload of %d bytes is larger \"+\n\t\t\t\"than the max allowed %d bytes\", blockLen,\n\t\t\twire.MaxBlockPayload)\n\t}\n\n\tserializedBlock := make([]byte, blockLen)\n\tif _, err := io.ReadFull(bi.r, serializedBlock); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn serializedBlock, nil\n}\n\n// processBlock potentially imports the block into the database.  It first\n// deserializes the raw block while checking for errors.  Already known blocks\n// are skipped and orphan blocks are considered errors.  Finally, it runs the\n// block through the chain rules to ensure it follows all rules and matches\n// up to the known checkpoint.  Returns whether the block was imported along\n// with any potential errors.\nfunc (bi *blockImporter) processBlock(serializedBlock []byte) (bool, error) {\n\t// Deserialize the block which includes checks for malformed blocks.\n\tblock, err := btcutil.NewBlockFromBytes(serializedBlock)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// update progress statistics\n\tbi.lastBlockTime = block.MsgBlock().Header.Timestamp\n\tbi.receivedLogTx += int64(len(block.MsgBlock().Transactions))\n\n\t// Skip blocks that already exist.\n\tblockHash := block.Hash()\n\texists, err := bi.chain.HaveBlock(blockHash)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif exists {\n\t\treturn false, nil\n\t}\n\n\t// Don't bother trying to process orphans.\n\tprevHash := &block.MsgBlock().Header.PrevBlock\n\tif !prevHash.IsEqual(&zeroHash) {\n\t\texists, err := bi.chain.HaveBlock(prevHash)\n\t\tif err != nil {\n\t\t\treturn false, err\n\t\t}\n\t\tif !exists {\n\t\t\treturn false, fmt.Errorf(\"import file contains block \"+\n\t\t\t\t\"%v which does not link to the available \"+\n\t\t\t\t\"block chain\", prevHash)\n\t\t}\n\t}\n\n\t// Ensure the blocks follows all of the chain rules and match up to the\n\t// known checkpoints.\n\tisMainChain, isOrphan, err := bi.chain.ProcessBlock(block,\n\t\tblockchain.BFFastAdd)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif !isMainChain {\n\t\treturn false, fmt.Errorf(\"import file contains an block that \"+\n\t\t\t\"does not extend the main chain: %v\", blockHash)\n\t}\n\tif isOrphan {\n\t\treturn false, fmt.Errorf(\"import file contains an orphan \"+\n\t\t\t\"block: %v\", blockHash)\n\t}\n\n\treturn true, nil\n}\n\n// readHandler is the main handler for reading blocks from the import file.\n// This allows block processing to take place in parallel with block reads.\n// It must be run as a goroutine.\nfunc (bi *blockImporter) readHandler() {\nout:\n\tfor {\n\t\t// Read the next block from the file and if anything goes wrong\n\t\t// notify the status handler with the error and bail.\n\t\tserializedBlock, err := bi.readBlock()\n\t\tif err != nil {\n\t\t\tbi.errChan <- fmt.Errorf(\"Error reading from input \"+\n\t\t\t\t\"file: %v\", err.Error())\n\t\t\tbreak out\n\t\t}\n\n\t\t// A nil block with no error means we're done.\n\t\tif serializedBlock == nil {\n\t\t\tbreak out\n\t\t}\n\n\t\t// Send the block or quit if we've been signalled to exit by\n\t\t// the status handler due to an error elsewhere.\n\t\tselect {\n\t\tcase bi.processQueue <- serializedBlock:\n\t\tcase <-bi.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\t// Close the processing channel to signal no more blocks are coming.\n\tclose(bi.processQueue)\n\tbi.wg.Done()\n}\n\n// logProgress logs block progress as an information message.  In order to\n// prevent spam, it limits logging to one message every cfg.Progress seconds\n// with duration and totals included.\nfunc (bi *blockImporter) logProgress() {\n\tbi.receivedLogBlocks++\n\n\tnow := time.Now()\n\tduration := now.Sub(bi.lastLogTime)\n\tif duration < time.Second*time.Duration(cfg.Progress) {\n\t\treturn\n\t}\n\n\t// Truncate the duration to 10s of milliseconds.\n\tdurationMillis := int64(duration / time.Millisecond)\n\ttDuration := 10 * time.Millisecond * time.Duration(durationMillis/10)\n\n\t// Log information about new block height.\n\tblockStr := \"blocks\"\n\tif bi.receivedLogBlocks == 1 {\n\t\tblockStr = \"block\"\n\t}\n\ttxStr := \"transactions\"\n\tif bi.receivedLogTx == 1 {\n\t\ttxStr = \"transaction\"\n\t}\n\tlog.Infof(\"Processed %d %s in the last %s (%d %s, height %d, %s)\",\n\t\tbi.receivedLogBlocks, blockStr, tDuration, bi.receivedLogTx,\n\t\ttxStr, bi.lastHeight, bi.lastBlockTime)\n\n\tbi.receivedLogBlocks = 0\n\tbi.receivedLogTx = 0\n\tbi.lastLogTime = now\n}\n\n// processHandler is the main handler for processing blocks.  This allows block\n// processing to take place in parallel with block reads from the import file.\n// It must be run as a goroutine.\nfunc (bi *blockImporter) processHandler() {\nout:\n\tfor {\n\t\tselect {\n\t\tcase serializedBlock, ok := <-bi.processQueue:\n\t\t\t// We're done when the channel is closed.\n\t\t\tif !ok {\n\t\t\t\tbreak out\n\t\t\t}\n\n\t\t\tbi.blocksProcessed++\n\t\t\tbi.lastHeight++\n\t\t\timported, err := bi.processBlock(serializedBlock)\n\t\t\tif err != nil {\n\t\t\t\tbi.errChan <- err\n\t\t\t\tbreak out\n\t\t\t}\n\n\t\t\tif imported {\n\t\t\t\tbi.blocksImported++\n\t\t\t}\n\n\t\t\tbi.logProgress()\n\n\t\tcase <-bi.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\tbi.wg.Done()\n}\n\n// statusHandler waits for updates from the import operation and notifies\n// the passed doneChan with the results of the import.  It also causes all\n// goroutines to exit if an error is reported from any of them.\nfunc (bi *blockImporter) statusHandler(resultsChan chan *importResults) {\n\tselect {\n\t// An error from either of the goroutines means we're done so signal\n\t// caller with the error and signal all goroutines to quit.\n\tcase err := <-bi.errChan:\n\t\tresultsChan <- &importResults{\n\t\t\tblocksProcessed: bi.blocksProcessed,\n\t\t\tblocksImported:  bi.blocksImported,\n\t\t\terr:             err,\n\t\t}\n\t\tclose(bi.quit)\n\n\t// The import finished normally.\n\tcase <-bi.doneChan:\n\t\tresultsChan <- &importResults{\n\t\t\tblocksProcessed: bi.blocksProcessed,\n\t\t\tblocksImported:  bi.blocksImported,\n\t\t\terr:             nil,\n\t\t}\n\t}\n}\n\n// Import is the core function which handles importing the blocks from the file\n// associated with the block importer to the database.  It returns a channel\n// on which the results will be returned when the operation has completed.\nfunc (bi *blockImporter) Import() chan *importResults {\n\t// Start up the read and process handling goroutines.  This setup allows\n\t// blocks to be read from disk in parallel while being processed.\n\tbi.wg.Add(2)\n\tgo bi.readHandler()\n\tgo bi.processHandler()\n\n\t// Wait for the import to finish in a separate goroutine and signal\n\t// the status handler when done.\n\tgo func() {\n\t\tbi.wg.Wait()\n\n\t\t// Flush the changes made to the blockchain.\n\t\tlog.Info(\"Flushing blockchain caches to the disk...\")\n\t\tif err := bi.chain.FlushUtxoCache(blockchain.FlushRequired); err != nil {\n\t\t\tlog.Errorf(\"Error while flushing the blockchain state: %v\", err)\n\t\t\tbi.errChan <- err\n\t\t\treturn\n\t\t}\n\t\tlog.Info(\"Done flushing blockchain caches to disk\")\n\n\t\tbi.doneChan <- true\n\t}()\n\n\t// Start the status handler and return the result channel that it will\n\t// send the results on when the import is done.\n\tresultChan := make(chan *importResults)\n\tgo bi.statusHandler(resultChan)\n\treturn resultChan\n}\n\n// newBlockImporter returns a new importer for the provided file reader seeker\n// and database.\nfunc newBlockImporter(db database.DB, r io.ReadSeeker) (*blockImporter, error) {\n\t// Create the transaction and address indexes if needed.\n\t//\n\t// CAUTION: the txindex needs to be first in the indexes array because\n\t// the addrindex uses data from the txindex during catchup.  If the\n\t// addrindex is run first, it may not have the transactions from the\n\t// current block indexed.\n\tvar indexes []indexers.Indexer\n\tif cfg.TxIndex || cfg.AddrIndex {\n\t\t// Enable transaction index if address index is enabled since it\n\t\t// requires it.\n\t\tif !cfg.TxIndex {\n\t\t\tlog.Infof(\"Transaction index enabled because it is \" +\n\t\t\t\t\"required by the address index\")\n\t\t\tcfg.TxIndex = true\n\t\t} else {\n\t\t\tlog.Info(\"Transaction index is enabled\")\n\t\t}\n\t\tindexes = append(indexes, indexers.NewTxIndex(db))\n\t}\n\tif cfg.AddrIndex {\n\t\tlog.Info(\"Address index is enabled\")\n\t\tindexes = append(indexes, indexers.NewAddrIndex(db, activeNetParams))\n\t}\n\n\t// Create an index manager if any of the optional indexes are enabled.\n\tvar indexManager blockchain.IndexManager\n\tif len(indexes) > 0 {\n\t\tindexManager = indexers.NewManager(db, indexes)\n\t}\n\n\tchain, err := blockchain.New(&blockchain.Config{\n\t\tDB:           db,\n\t\tChainParams:  activeNetParams,\n\t\tTimeSource:   blockchain.NewMedianTime(),\n\t\tIndexManager: indexManager,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &blockImporter{\n\t\tdb:           db,\n\t\tr:            r,\n\t\tprocessQueue: make(chan []byte, 2),\n\t\tdoneChan:     make(chan bool),\n\t\terrChan:      make(chan error),\n\t\tquit:         make(chan struct{}),\n\t\tchain:        chain,\n\t\tlastLogTime:  time.Now(),\n\t}, nil\n}\n"
  },
  {
    "path": "cmd/btcctl/btcctl.go",
    "content": "package main\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\nconst (\n\tshowHelpMessage = \"Specify -h to show available options\"\n\tlistCmdMessage  = \"Specify -l to list available commands\"\n)\n\n// commandUsage display the usage for a specific command.\nfunc commandUsage(method string) {\n\tusage, err := btcjson.MethodUsageText(method)\n\tif err != nil {\n\t\t// This should never happen since the method was already checked\n\t\t// before calling this function, but be safe.\n\t\tfmt.Fprintln(os.Stderr, \"Failed to obtain command usage:\", err)\n\t\treturn\n\t}\n\n\tfmt.Fprintln(os.Stderr, \"Usage:\")\n\tfmt.Fprintf(os.Stderr, \"  %s\\n\", usage)\n}\n\n// usage displays the general usage when the help flag is not displayed and\n// and an invalid command was specified.  The commandUsage function is used\n// instead when a valid command was specified.\nfunc usage(errorMessage string) {\n\tappName := filepath.Base(os.Args[0])\n\tappName = strings.TrimSuffix(appName, filepath.Ext(appName))\n\tfmt.Fprintln(os.Stderr, errorMessage)\n\tfmt.Fprintln(os.Stderr, \"Usage:\")\n\tfmt.Fprintf(os.Stderr, \"  %s [OPTIONS] <command> <args...>\\n\\n\",\n\t\tappName)\n\tfmt.Fprintln(os.Stderr, showHelpMessage)\n\tfmt.Fprintln(os.Stderr, listCmdMessage)\n}\n\nfunc main() {\n\tcfg, args, err := loadConfig()\n\tif err != nil {\n\t\tfmt.Fprintln(os.Stderr, \"Failed to load config:\", err)\n\t\tos.Exit(1)\n\t}\n\tif len(args) < 1 {\n\t\tusage(\"No command specified\")\n\t\tos.Exit(1)\n\t}\n\n\t// Ensure the specified method identifies a valid registered command and\n\t// is one of the usable types.\n\tmethod := args[0]\n\tusageFlags, err := btcjson.MethodUsageFlags(method)\n\tif err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"Unrecognized command '%s'\\n\", method)\n\t\tfmt.Fprintln(os.Stderr, listCmdMessage)\n\t\tos.Exit(1)\n\t}\n\tif usageFlags&unusableFlags != 0 {\n\t\tfmt.Fprintf(os.Stderr, \"The '%s' command can only be used via \"+\n\t\t\t\"websockets\\n\", method)\n\t\tfmt.Fprintln(os.Stderr, listCmdMessage)\n\t\tos.Exit(1)\n\t}\n\n\t// Convert remaining command line args to a slice of interface values\n\t// to be passed along as parameters to new command creation function.\n\t//\n\t// Since some commands, such as submitblock, can involve data which is\n\t// too large for the Operating System to allow as a normal command line\n\t// parameter, support using '-' as an argument to allow the argument\n\t// to be read from a stdin pipe.\n\tbio := bufio.NewReader(os.Stdin)\n\tparams := make([]interface{}, 0, len(args[1:]))\n\tfor _, arg := range args[1:] {\n\t\tif arg == \"-\" {\n\t\t\tparam, err := bio.ReadString('\\n')\n\t\t\tif err != nil && err != io.EOF {\n\t\t\t\tfmt.Fprintf(os.Stderr, \"Failed to read data \"+\n\t\t\t\t\t\"from stdin: %v\\n\", err)\n\t\t\t\tos.Exit(1)\n\t\t\t}\n\t\t\tif err == io.EOF && len(param) == 0 {\n\t\t\t\tfmt.Fprintln(os.Stderr, \"Not enough lines \"+\n\t\t\t\t\t\"provided on stdin\")\n\t\t\t\tos.Exit(1)\n\t\t\t}\n\t\t\tparam = strings.TrimRight(param, \"\\r\\n\")\n\t\t\tparams = append(params, param)\n\t\t\tcontinue\n\t\t}\n\n\t\tparams = append(params, arg)\n\t}\n\n\t// Attempt to create the appropriate command using the arguments\n\t// provided by the user.\n\tcmd, err := btcjson.NewCmd(method, params...)\n\tif err != nil {\n\t\t// Show the error along with its error code when it's a\n\t\t// btcjson.Error as it reallistcally will always be since the\n\t\t// NewCmd function is only supposed to return errors of that\n\t\t// type.\n\t\tif jerr, ok := err.(btcjson.Error); ok {\n\t\t\tfmt.Fprintf(os.Stderr, \"%s command: %v (code: %s)\\n\",\n\t\t\t\tmethod, err, jerr.ErrorCode)\n\t\t\tcommandUsage(method)\n\t\t\tos.Exit(1)\n\t\t}\n\n\t\t// The error is not a btcjson.Error and this really should not\n\t\t// happen.  Nevertheless, fallback to just showing the error\n\t\t// if it should happen due to a bug in the package.\n\t\tfmt.Fprintf(os.Stderr, \"%s command: %v\\n\", method, err)\n\t\tcommandUsage(method)\n\t\tos.Exit(1)\n\t}\n\n\t// Marshal the command into a JSON-RPC byte slice in preparation for\n\t// sending it to the RPC server.\n\tmarshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, 1, cmd)\n\tif err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tos.Exit(1)\n\t}\n\n\t// Send the JSON-RPC request to the server using the user-specified\n\t// connection configuration.\n\tresult, err := sendPostRequest(marshalledJSON, cfg)\n\tif err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tos.Exit(1)\n\t}\n\n\t// Choose how to display the result based on its type.\n\tstrResult := string(result)\n\tif strings.HasPrefix(strResult, \"{\") || strings.HasPrefix(strResult, \"[\") {\n\t\tvar dst bytes.Buffer\n\t\tif err := json.Indent(&dst, result, \"\", \"  \"); err != nil {\n\t\t\tfmt.Fprintf(os.Stderr, \"Failed to format result: %v\",\n\t\t\t\terr)\n\t\t\tos.Exit(1)\n\t\t}\n\t\tfmt.Println(dst.String())\n\n\t} else if strings.HasPrefix(strResult, `\"`) {\n\t\tvar str string\n\t\tif err := json.Unmarshal(result, &str); err != nil {\n\t\t\tfmt.Fprintf(os.Stderr, \"Failed to unmarshal result: %v\",\n\t\t\t\terr)\n\t\t\tos.Exit(1)\n\t\t}\n\t\tfmt.Println(str)\n\n\t} else if strResult != \"null\" {\n\t\tfmt.Println(strResult)\n\t}\n}\n"
  },
  {
    "path": "cmd/btcctl/config.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\tflags \"github.com/jessevdk/go-flags\"\n)\n\nconst (\n\t// unusableFlags are the command usage flags which this utility are not\n\t// able to use.  In particular it doesn't support websockets and\n\t// consequently notifications.\n\tunusableFlags = btcjson.UFWebsocketOnly | btcjson.UFNotification\n)\n\nvar (\n\tbtcdHomeDir           = btcutil.AppDataDir(\"btcd\", false)\n\tbtcctlHomeDir         = btcutil.AppDataDir(\"btcctl\", false)\n\tbtcwalletHomeDir      = btcutil.AppDataDir(\"btcwallet\", false)\n\tdefaultConfigFile     = filepath.Join(btcctlHomeDir, \"btcctl.conf\")\n\tdefaultRPCServer      = \"localhost\"\n\tdefaultRPCCertFile    = filepath.Join(btcdHomeDir, \"rpc.cert\")\n\tdefaultWalletCertFile = filepath.Join(btcwalletHomeDir, \"rpc.cert\")\n)\n\n// listCommands categorizes and lists all of the usable commands along with\n// their one-line usage.\nfunc listCommands() {\n\tconst (\n\t\tcategoryChain uint8 = iota\n\t\tcategoryWallet\n\t\tnumCategories\n\t)\n\n\t// Get a list of registered commands and categorize and filter them.\n\tcmdMethods := btcjson.RegisteredCmdMethods()\n\tcategorized := make([][]string, numCategories)\n\tfor _, method := range cmdMethods {\n\t\tflags, err := btcjson.MethodUsageFlags(method)\n\t\tif err != nil {\n\t\t\t// This should never happen since the method was just\n\t\t\t// returned from the package, but be safe.\n\t\t\tcontinue\n\t\t}\n\n\t\t// Skip the commands that aren't usable from this utility.\n\t\tif flags&unusableFlags != 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tusage, err := btcjson.MethodUsageText(method)\n\t\tif err != nil {\n\t\t\t// This should never happen since the method was just\n\t\t\t// returned from the package, but be safe.\n\t\t\tcontinue\n\t\t}\n\n\t\t// Categorize the command based on the usage flags.\n\t\tcategory := categoryChain\n\t\tif flags&btcjson.UFWalletOnly != 0 {\n\t\t\tcategory = categoryWallet\n\t\t}\n\t\tcategorized[category] = append(categorized[category], usage)\n\t}\n\n\t// Display the command according to their categories.\n\tcategoryTitles := make([]string, numCategories)\n\tcategoryTitles[categoryChain] = \"Chain Server Commands:\"\n\tcategoryTitles[categoryWallet] = \"Wallet Server Commands (--wallet):\"\n\tfor category := uint8(0); category < numCategories; category++ {\n\t\tfmt.Println(categoryTitles[category])\n\t\tfor _, usage := range categorized[category] {\n\t\t\tfmt.Println(usage)\n\t\t}\n\t\tfmt.Println()\n\t}\n}\n\n// config defines the configuration options for btcctl.\n//\n// See loadConfig for details on the configuration load process.\ntype config struct {\n\tConfigFile     string `short:\"C\" long:\"configfile\" description:\"Path to configuration file\"`\n\tListCommands   bool   `short:\"l\" long:\"listcommands\" description:\"List all of the supported commands and exit\"`\n\tNoTLS          bool   `long:\"notls\" description:\"Disable TLS\"`\n\tProxy          string `long:\"proxy\" description:\"Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)\"`\n\tProxyPass      string `long:\"proxypass\" default-mask:\"-\" description:\"Password for proxy server\"`\n\tProxyUser      string `long:\"proxyuser\" description:\"Username for proxy server\"`\n\tRegressionTest bool   `long:\"regtest\" description:\"Connect to the regression test network\"`\n\tRPCCert        string `short:\"c\" long:\"rpccert\" description:\"RPC server certificate chain for validation\"`\n\tRPCPassword    string `short:\"P\" long:\"rpcpass\" default-mask:\"-\" description:\"RPC password\"`\n\tRPCServer      string `short:\"s\" long:\"rpcserver\" description:\"RPC server to connect to\"`\n\tRPCUser        string `short:\"u\" long:\"rpcuser\" description:\"RPC username\"`\n\tSimNet         bool   `long:\"simnet\" description:\"Connect to the simulation test network\"`\n\tTLSSkipVerify  bool   `long:\"skipverify\" description:\"Do not verify tls certificates (not recommended!)\"`\n\tTestNet3       bool   `long:\"testnet\" description:\"Connect to testnet (version 3)\"`\n\tTestNet4       bool   `long:\"testnet4\" description:\"Connect to testnet (version 4)\"`\n\tSigNet         bool   `long:\"signet\" description:\"Connect to signet\"`\n\tShowVersion    bool   `short:\"V\" long:\"version\" description:\"Display version information and exit\"`\n\tWallet         bool   `long:\"wallet\" description:\"Connect to wallet\"`\n}\n\n// normalizeAddress returns addr with the passed default port appended if\n// there is not already a port specified.\nfunc normalizeAddress(addr string, chain *chaincfg.Params, useWallet bool) (string, error) {\n\t_, _, err := net.SplitHostPort(addr)\n\tif err != nil {\n\t\tvar defaultPort string\n\t\tswitch chain {\n\t\tcase &chaincfg.TestNet3Params:\n\t\t\tif useWallet {\n\t\t\t\tdefaultPort = \"18332\"\n\t\t\t} else {\n\t\t\t\tdefaultPort = \"18334\"\n\t\t\t}\n\t\tcase &chaincfg.TestNet4Params:\n\t\t\tif useWallet {\n\t\t\t\tdefaultPort = \"48332\"\n\t\t\t} else {\n\t\t\t\tdefaultPort = \"48334\"\n\t\t\t}\n\t\tcase &chaincfg.SimNetParams:\n\t\t\tif useWallet {\n\t\t\t\tdefaultPort = \"18554\"\n\t\t\t} else {\n\t\t\t\tdefaultPort = \"18556\"\n\t\t\t}\n\t\tcase &chaincfg.RegressionNetParams:\n\t\t\tif useWallet {\n\t\t\t\t// TODO: add port once regtest is supported in btcwallet\n\t\t\t\tparamErr := fmt.Errorf(\"cannot use -wallet with -regtest, btcwallet not yet compatible with regtest\")\n\t\t\t\treturn \"\", paramErr\n\t\t\t} else {\n\t\t\t\tdefaultPort = \"18334\"\n\t\t\t}\n\t\tcase &chaincfg.SigNetParams:\n\t\t\tif useWallet {\n\t\t\t\tdefaultPort = \"38332\"\n\t\t\t} else {\n\t\t\t\tdefaultPort = \"38334\"\n\t\t\t}\n\t\tdefault:\n\t\t\tif useWallet {\n\t\t\t\tdefaultPort = \"8332\"\n\t\t\t} else {\n\t\t\t\tdefaultPort = \"8334\"\n\t\t\t}\n\t\t}\n\n\t\treturn net.JoinHostPort(addr, defaultPort), nil\n\t}\n\treturn addr, nil\n}\n\n// cleanAndExpandPath expands environment variables and leading ~ in the\n// passed path, cleans the result, and returns it.\nfunc cleanAndExpandPath(path string) string {\n\t// Expand initial ~ to OS specific home directory.\n\tif strings.HasPrefix(path, \"~\") {\n\t\thomeDir := filepath.Dir(btcctlHomeDir)\n\t\tpath = strings.Replace(path, \"~\", homeDir, 1)\n\t}\n\n\t// NOTE: The os.ExpandEnv doesn't work with Windows-style %VARIABLE%,\n\t// but they variables can still be expanded via POSIX-style $VARIABLE.\n\treturn filepath.Clean(os.ExpandEnv(path))\n}\n\n// loadConfig initializes and parses the config using a config file and command\n// line options.\n//\n// The configuration proceeds as follows:\n//  1. Start with a default config with sane settings\n//  2. Pre-parse the command line to check for an alternative config file\n//  3. Load configuration file overwriting defaults with any specified options\n//  4. Parse CLI options and overwrite/add any specified options\n//\n// The above results in functioning properly without any config settings\n// while still allowing the user to override settings with config files and\n// command line options.  Command line options always take precedence.\nfunc loadConfig() (*config, []string, error) {\n\t// Default config.\n\tcfg := config{\n\t\tConfigFile: defaultConfigFile,\n\t\tRPCServer:  defaultRPCServer,\n\t\tRPCCert:    defaultRPCCertFile,\n\t}\n\n\t// Pre-parse the command line options to see if an alternative config\n\t// file, the version flag, or the list commands flag was specified.  Any\n\t// errors aside from the help message error can be ignored here since\n\t// they will be caught by the final parse below.\n\tpreCfg := cfg\n\tpreParser := flags.NewParser(&preCfg, flags.HelpFlag)\n\t_, err := preParser.Parse()\n\tif err != nil {\n\t\tif e, ok := err.(*flags.Error); ok && e.Type == flags.ErrHelp {\n\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\tfmt.Fprintln(os.Stderr, \"\")\n\t\t\tfmt.Fprintln(os.Stderr, \"The special parameter `-` \"+\n\t\t\t\t\"indicates that a parameter should be read \"+\n\t\t\t\t\"from the\\nnext unread line from standard \"+\n\t\t\t\t\"input.\")\n\t\t\treturn nil, nil, err\n\t\t}\n\t}\n\n\t// Show the version and exit if the version flag was specified.\n\tappName := filepath.Base(os.Args[0])\n\tappName = strings.TrimSuffix(appName, filepath.Ext(appName))\n\tusageMessage := fmt.Sprintf(\"Use %s -h to show options\", appName)\n\tif preCfg.ShowVersion {\n\t\tfmt.Println(appName, \"version\", version())\n\t\tos.Exit(0)\n\t}\n\n\t// Show the available commands and exit if the associated flag was\n\t// specified.\n\tif preCfg.ListCommands {\n\t\tlistCommands()\n\t\tos.Exit(0)\n\t}\n\n\tif _, err := os.Stat(preCfg.ConfigFile); os.IsNotExist(err) {\n\t\t// Use config file for RPC server to create default btcctl config\n\t\tvar serverConfigPath string\n\t\tif preCfg.Wallet {\n\t\t\tserverConfigPath = filepath.Join(btcwalletHomeDir, \"btcwallet.conf\")\n\t\t} else {\n\t\t\tserverConfigPath = filepath.Join(btcdHomeDir, \"btcd.conf\")\n\t\t}\n\n\t\terr := createDefaultConfigFile(preCfg.ConfigFile, serverConfigPath)\n\t\tif err != nil {\n\t\t\tfmt.Fprintf(os.Stderr, \"Error creating a default config file: %v\\n\", err)\n\t\t}\n\t}\n\n\t// Load additional config from file.\n\tparser := flags.NewParser(&cfg, flags.Default)\n\terr = flags.NewIniParser(parser).ParseFile(preCfg.ConfigFile)\n\tif err != nil {\n\t\tif _, ok := err.(*os.PathError); !ok {\n\t\t\tfmt.Fprintf(os.Stderr, \"Error parsing config file: %v\\n\",\n\t\t\t\terr)\n\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\treturn nil, nil, err\n\t\t}\n\t}\n\n\t// Parse command line options again to ensure they take precedence.\n\tremainingArgs, err := parser.Parse()\n\tif err != nil {\n\t\tif e, ok := err.(*flags.Error); !ok || e.Type != flags.ErrHelp {\n\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t}\n\t\treturn nil, nil, err\n\t}\n\n\t// default network is mainnet\n\tnetwork := &chaincfg.MainNetParams\n\n\t// Multiple networks can't be selected simultaneously.\n\tnumNets := 0\n\tif cfg.TestNet3 {\n\t\tnumNets++\n\t\tnetwork = &chaincfg.TestNet3Params\n\t}\n\tif cfg.TestNet4 {\n\t\tnumNets++\n\t\tnetwork = &chaincfg.TestNet4Params\n\t}\n\tif cfg.SimNet {\n\t\tnumNets++\n\t\tnetwork = &chaincfg.SimNetParams\n\t}\n\tif cfg.RegressionTest {\n\t\tnumNets++\n\t\tnetwork = &chaincfg.RegressionNetParams\n\t}\n\tif cfg.SigNet {\n\t\tnumNets++\n\t\tnetwork = &chaincfg.SigNetParams\n\t}\n\n\tif numNets > 1 {\n\t\tstr := \"%s: Multiple network params can't be used \" +\n\t\t\t\"together -- choose one\"\n\t\terr := fmt.Errorf(str, \"loadConfig\")\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\treturn nil, nil, err\n\t}\n\n\t// Override the RPC certificate if the --wallet flag was specified and\n\t// the user did not specify one.\n\tif cfg.Wallet && cfg.RPCCert == defaultRPCCertFile {\n\t\tcfg.RPCCert = defaultWalletCertFile\n\t}\n\n\t// Handle environment variable expansion in the RPC certificate path.\n\tcfg.RPCCert = cleanAndExpandPath(cfg.RPCCert)\n\n\t// Add default port to RPC server based on --testnet and --wallet flags\n\t// if needed.\n\tcfg.RPCServer, err = normalizeAddress(cfg.RPCServer, network, cfg.Wallet)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn &cfg, remainingArgs, nil\n}\n\n// createDefaultConfig creates a basic config file at the given destination path.\n// For this it tries to read the config file for the RPC server (either btcd or\n// btcwallet), and extract the RPC user and password from it.\nfunc createDefaultConfigFile(destinationPath, serverConfigPath string) error {\n\t// Read the RPC server config\n\tserverConfigFile, err := os.Open(serverConfigPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer serverConfigFile.Close()\n\tcontent, err := io.ReadAll(serverConfigFile)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Extract the rpcuser\n\trpcUserRegexp := regexp.MustCompile(`(?m)^\\s*rpcuser=([^\\s]+)`)\n\tuserSubmatches := rpcUserRegexp.FindSubmatch(content)\n\tif userSubmatches == nil {\n\t\t// No user found, nothing to do\n\t\treturn nil\n\t}\n\n\t// Extract the rpcpass\n\trpcPassRegexp := regexp.MustCompile(`(?m)^\\s*rpcpass=([^\\s]+)`)\n\tpassSubmatches := rpcPassRegexp.FindSubmatch(content)\n\tif passSubmatches == nil {\n\t\t// No password found, nothing to do\n\t\treturn nil\n\t}\n\n\t// Extract the notls\n\tnoTLSRegexp := regexp.MustCompile(`(?m)^\\s*notls=(0|1)(?:\\s|$)`)\n\tnoTLSSubmatches := noTLSRegexp.FindSubmatch(content)\n\n\t// Create the destination directory if it does not exists\n\terr = os.MkdirAll(filepath.Dir(destinationPath), 0700)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Create the destination file and write the rpcuser and rpcpass to it\n\tdest, err := os.OpenFile(destinationPath,\n\t\tos.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer dest.Close()\n\n\tdestString := fmt.Sprintf(\"rpcuser=%s\\nrpcpass=%s\\n\",\n\t\tstring(userSubmatches[1]), string(passSubmatches[1]))\n\tif noTLSSubmatches != nil {\n\t\tdestString += fmt.Sprintf(\"notls=%s\\n\", noTLSSubmatches[1])\n\t}\n\n\tdest.WriteString(destString)\n\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/btcctl/httpclient.go",
    "content": "package main\n\nimport (\n\t\"bytes\"\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/go-socks/socks\"\n)\n\n// newHTTPClient returns a new HTTP client that is configured according to the\n// proxy and TLS settings in the associated connection configuration.\nfunc newHTTPClient(cfg *config) (*http.Client, error) {\n\t// Configure proxy if needed.\n\tvar dial func(network, addr string) (net.Conn, error)\n\tif cfg.Proxy != \"\" {\n\t\tproxy := &socks.Proxy{\n\t\t\tAddr:     cfg.Proxy,\n\t\t\tUsername: cfg.ProxyUser,\n\t\t\tPassword: cfg.ProxyPass,\n\t\t}\n\t\tdial = func(network, addr string) (net.Conn, error) {\n\t\t\tc, err := proxy.Dial(network, addr)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn c, nil\n\t\t}\n\t}\n\n\t// Configure TLS if needed.\n\tvar tlsConfig *tls.Config\n\tif !cfg.NoTLS && cfg.RPCCert != \"\" {\n\t\tpem, err := os.ReadFile(cfg.RPCCert)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tpool := x509.NewCertPool()\n\t\tpool.AppendCertsFromPEM(pem)\n\t\ttlsConfig = &tls.Config{\n\t\t\tRootCAs:            pool,\n\t\t\tInsecureSkipVerify: cfg.TLSSkipVerify,\n\t\t}\n\t}\n\n\t// Create and return the new HTTP client potentially configured with a\n\t// proxy and TLS.\n\tclient := http.Client{\n\t\tTransport: &http.Transport{\n\t\t\tDial:            dial,\n\t\t\tTLSClientConfig: tlsConfig,\n\t\t},\n\t}\n\treturn &client, nil\n}\n\n// sendPostRequest sends the marshalled JSON-RPC command using HTTP-POST mode\n// to the server described in the passed config struct.  It also attempts to\n// unmarshal the response as a JSON-RPC response and returns either the result\n// field or the error field depending on whether or not there is an error.\nfunc sendPostRequest(marshalledJSON []byte, cfg *config) ([]byte, error) {\n\t// Generate a request to the configured RPC server.\n\tprotocol := \"http\"\n\tif !cfg.NoTLS {\n\t\tprotocol = \"https\"\n\t}\n\turl := protocol + \"://\" + cfg.RPCServer\n\tbodyReader := bytes.NewReader(marshalledJSON)\n\thttpRequest, err := http.NewRequest(\"POST\", url, bodyReader)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\thttpRequest.Close = true\n\thttpRequest.Header.Set(\"Content-Type\", \"application/json\")\n\n\t// Configure basic access authorization.\n\thttpRequest.SetBasicAuth(cfg.RPCUser, cfg.RPCPassword)\n\n\t// Create the new HTTP client that is configured according to the user-\n\t// specified options and submit the request.\n\thttpClient, err := newHTTPClient(cfg)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\thttpResponse, err := httpClient.Do(httpRequest)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Read the raw bytes and close the response.\n\trespBytes, err := io.ReadAll(httpResponse.Body)\n\thttpResponse.Body.Close()\n\tif err != nil {\n\t\terr = fmt.Errorf(\"error reading json reply: %v\", err)\n\t\treturn nil, err\n\t}\n\n\t// Handle unsuccessful HTTP responses\n\tif httpResponse.StatusCode < 200 || httpResponse.StatusCode >= 300 {\n\t\t// Generate a standard error to return if the server body is\n\t\t// empty.  This should not happen very often, but it's better\n\t\t// than showing nothing in case the target server has a poor\n\t\t// implementation.\n\t\tif len(respBytes) == 0 {\n\t\t\treturn nil, fmt.Errorf(\"%d %s\", httpResponse.StatusCode,\n\t\t\t\thttp.StatusText(httpResponse.StatusCode))\n\t\t}\n\t\treturn nil, fmt.Errorf(\"%s\", respBytes)\n\t}\n\n\t// Unmarshal the response.\n\tvar resp btcjson.Response\n\tif err := json.Unmarshal(respBytes, &resp); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif resp.Error != nil {\n\t\treturn nil, resp.Error\n\t}\n\treturn resp.Result, nil\n}\n"
  },
  {
    "path": "cmd/btcctl/version.go",
    "content": "// Copyright (c) 2013 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"strings\"\n)\n\n// semanticAlphabet\nconst semanticAlphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-\"\n\n// These constants define the application version and follow the semantic\n// versioning 2.0.0 spec (http://semver.org/).\nconst (\n\tappMajor uint = 0\n\tappMinor uint = 23\n\tappPatch uint = 1\n\n\t// appPreRelease MUST only contain characters from semanticAlphabet\n\t// per the semantic versioning spec.\n\tappPreRelease = \"beta\"\n)\n\n// appBuild is defined as a variable so it can be overridden during the build\n// process with '-ldflags \"-X main.appBuild foo' if needed.  It MUST only\n// contain characters from semanticAlphabet per the semantic versioning spec.\nvar appBuild string\n\n// version returns the application version as a properly formed string per the\n// semantic versioning 2.0.0 spec (http://semver.org/).\nfunc version() string {\n\t// Start with the major, minor, and patch versions.\n\tversion := fmt.Sprintf(\"%d.%d.%d\", appMajor, appMinor, appPatch)\n\n\t// Append pre-release version if there is one.  The hyphen called for\n\t// by the semantic versioning spec is automatically appended and should\n\t// not be contained in the pre-release string.  The pre-release version\n\t// is not appended if it contains invalid characters.\n\tpreRelease := normalizeVerString(appPreRelease)\n\tif preRelease != \"\" {\n\t\tversion = fmt.Sprintf(\"%s-%s\", version, preRelease)\n\t}\n\n\t// Append build metadata if there is any.  The plus called for\n\t// by the semantic versioning spec is automatically appended and should\n\t// not be contained in the build metadata string.  The build metadata\n\t// string is not appended if it contains invalid characters.\n\tbuild := normalizeVerString(appBuild)\n\tif build != \"\" {\n\t\tversion = fmt.Sprintf(\"%s+%s\", version, build)\n\t}\n\n\treturn version\n}\n\n// normalizeVerString returns the passed string stripped of all characters which\n// are not valid according to the semantic versioning guidelines for pre-release\n// version and build metadata strings.  In particular they MUST only contain\n// characters in semanticAlphabet.\nfunc normalizeVerString(str string) string {\n\tvar result bytes.Buffer\n\tfor _, r := range str {\n\t\tif strings.ContainsRune(semanticAlphabet, r) {\n\t\t\t// Ignoring the error here since it can only fail if\n\t\t\t// the system is out of memory and there are much\n\t\t\t// bigger issues at that point.\n\t\t\t_, _ = result.WriteRune(r)\n\t\t}\n\t}\n\treturn result.String()\n}\n"
  },
  {
    "path": "cmd/findcheckpoint/config.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/database\"\n\t_ \"github.com/btcsuite/btcd/database/ffldb\"\n\t\"github.com/btcsuite/btcd/wire\"\n\tflags \"github.com/jessevdk/go-flags\"\n)\n\nconst (\n\tminCandidates        = 1\n\tmaxCandidates        = 20\n\tdefaultNumCandidates = 5\n\tdefaultDbType        = \"ffldb\"\n)\n\nvar (\n\tbtcdHomeDir     = btcutil.AppDataDir(\"btcd\", false)\n\tdefaultDataDir  = filepath.Join(btcdHomeDir, \"data\")\n\tknownDbTypes    = database.SupportedDrivers()\n\tactiveNetParams = &chaincfg.MainNetParams\n)\n\n// config defines the configuration options for findcheckpoint.\n//\n// See loadConfig for details on the configuration load process.\ntype config struct {\n\tDataDir        string `short:\"b\" long:\"datadir\" description:\"Location of the btcd data directory\"`\n\tDbType         string `long:\"dbtype\" description:\"Database backend to use for the Block Chain\"`\n\tUseGoOutput    bool   `short:\"g\" long:\"gooutput\" description:\"Display the candidates using Go syntax that is ready to insert into the btcchain checkpoint list\"`\n\tNumCandidates  int    `short:\"n\" long:\"numcandidates\" description:\"Max num of checkpoint candidates to show {1-20}\"`\n\tRegressionTest bool   `long:\"regtest\" description:\"Use the regression test network\"`\n\tSimNet         bool   `long:\"simnet\" description:\"Use the simulation test network\"`\n\tTestNet3       bool   `long:\"testnet\" description:\"Use the test network (version 3)\"`\n\tTestNet4       bool   `long:\"testnet4\" description:\"Use the test network (version 4)\"`\n}\n\n// validDbType returns whether or not dbType is a supported database type.\nfunc validDbType(dbType string) bool {\n\treturn slices.Contains(knownDbTypes, dbType)\n}\n\n// netName returns the name used when referring to a bitcoin network.  At the\n// time of writing, btcd currently places blocks for testnet version 3 in the\n// data and log directory \"testnet\", which does not match the Name field of the\n// chaincfg parameters.  This function can be used to override this directory name\n// as \"testnet\" when the passed active network matches wire.TestNet3.\n//\n// A proper upgrade to move the data and log directories for this network to\n// \"testnet3\" is planned for the future, at which point this function can be\n// removed and the network parameter's name used instead.\nfunc netName(chainParams *chaincfg.Params) string {\n\tswitch chainParams.Net {\n\tcase wire.TestNet3:\n\t\treturn \"testnet\"\n\tdefault:\n\t\treturn chainParams.Name\n\t}\n}\n\n// loadConfig initializes and parses the config using command line options.\nfunc loadConfig() (*config, []string, error) {\n\t// Default config.\n\tcfg := config{\n\t\tDataDir:       defaultDataDir,\n\t\tDbType:        defaultDbType,\n\t\tNumCandidates: defaultNumCandidates,\n\t}\n\n\t// Parse command line options.\n\tparser := flags.NewParser(&cfg, flags.Default)\n\tremainingArgs, err := parser.Parse()\n\tif err != nil {\n\t\tif e, ok := err.(*flags.Error); !ok || e.Type != flags.ErrHelp {\n\t\t\tparser.WriteHelp(os.Stderr)\n\t\t}\n\t\treturn nil, nil, err\n\t}\n\n\t// Multiple networks can't be selected simultaneously.\n\tfuncName := \"loadConfig\"\n\tnumNets := 0\n\t// Count number of network flags passed; assign active network params\n\t// while we're at it\n\tif cfg.TestNet3 {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.TestNet3Params\n\t}\n\tif cfg.TestNet4 {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.TestNet4Params\n\t}\n\tif cfg.RegressionTest {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.RegressionNetParams\n\t}\n\tif cfg.SimNet {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.SimNetParams\n\t}\n\tif numNets > 1 {\n\t\tstr := \"%s: The testnet, regtest, and simnet params can't be \" +\n\t\t\t\"used together -- choose one of the three\"\n\t\terr := fmt.Errorf(str, funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tparser.WriteHelp(os.Stderr)\n\t\treturn nil, nil, err\n\t}\n\n\t// Validate database type.\n\tif !validDbType(cfg.DbType) {\n\t\tstr := \"%s: The specified database type [%v] is invalid -- \" +\n\t\t\t\"supported types %v\"\n\t\terr := fmt.Errorf(str, \"loadConfig\", cfg.DbType, knownDbTypes)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tparser.WriteHelp(os.Stderr)\n\t\treturn nil, nil, err\n\t}\n\n\t// Append the network type to the data directory so it is \"namespaced\"\n\t// per network.  In addition to the block database, there are other\n\t// pieces of data that are saved to disk such as address manager state.\n\t// All data is specific to a network, so namespacing the data directory\n\t// means each individual piece of serialized data does not have to\n\t// worry about changing names per network and such.\n\tcfg.DataDir = filepath.Join(cfg.DataDir, netName(activeNetParams))\n\n\t// Validate the number of candidates.\n\tif cfg.NumCandidates < minCandidates || cfg.NumCandidates > maxCandidates {\n\t\tstr := \"%s: The specified number of candidates is out of \" +\n\t\t\t\"range -- parsed [%v]\"\n\t\terr = fmt.Errorf(str, \"loadConfig\", cfg.NumCandidates)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tparser.WriteHelp(os.Stderr)\n\t\treturn nil, nil, err\n\t}\n\n\treturn &cfg, remainingArgs, nil\n}\n"
  },
  {
    "path": "cmd/findcheckpoint/findcheckpoint.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n)\n\nconst blockDbNamePrefix = \"blocks\"\n\nvar (\n\tcfg *config\n)\n\n// loadBlockDB opens the block database and returns a handle to it.\nfunc loadBlockDB() (database.DB, error) {\n\t// The database name is based on the database type.\n\tdbName := blockDbNamePrefix + \"_\" + cfg.DbType\n\tdbPath := filepath.Join(cfg.DataDir, dbName)\n\tfmt.Printf(\"Loading block database from '%s'\\n\", dbPath)\n\tdb, err := database.Open(cfg.DbType, dbPath, activeNetParams.Net)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn db, nil\n}\n\n// findCandidates searches the chain backwards for checkpoint candidates and\n// returns a slice of found candidates, if any.  It also stops searching for\n// candidates at the last checkpoint that is already hard coded into btcchain\n// since there is no point in finding candidates before already existing\n// checkpoints.\nfunc findCandidates(chain *blockchain.BlockChain, latestHash *chainhash.Hash) ([]*chaincfg.Checkpoint, error) {\n\t// Start with the latest block of the main chain.\n\tblock, err := chain.BlockByHash(latestHash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Get the latest known checkpoint.\n\tlatestCheckpoint := chain.LatestCheckpoint()\n\tif latestCheckpoint == nil {\n\t\t// Set the latest checkpoint to the genesis block if there isn't\n\t\t// already one.\n\t\tlatestCheckpoint = &chaincfg.Checkpoint{\n\t\t\tHash:   activeNetParams.GenesisHash,\n\t\t\tHeight: 0,\n\t\t}\n\t}\n\n\t// The latest known block must be at least the last known checkpoint\n\t// plus required checkpoint confirmations.\n\tcheckpointConfirmations := int32(blockchain.CheckpointConfirmations)\n\trequiredHeight := latestCheckpoint.Height + checkpointConfirmations\n\tif block.Height() < requiredHeight {\n\t\treturn nil, fmt.Errorf(\"the block database is only at height \"+\n\t\t\t\"%d which is less than the latest checkpoint height \"+\n\t\t\t\"of %d plus required confirmations of %d\",\n\t\t\tblock.Height(), latestCheckpoint.Height,\n\t\t\tcheckpointConfirmations)\n\t}\n\n\t// For the first checkpoint, the required height is any block after the\n\t// genesis block, so long as the chain has at least the required number\n\t// of confirmations (which is enforced above).\n\tif len(activeNetParams.Checkpoints) == 0 {\n\t\trequiredHeight = 1\n\t}\n\n\t// Indeterminate progress setup.\n\tnumBlocksToTest := block.Height() - requiredHeight\n\tprogressInterval := (numBlocksToTest / 100) + 1 // min 1\n\tfmt.Print(\"Searching for candidates\")\n\tdefer fmt.Println()\n\n\t// Loop backwards through the chain to find checkpoint candidates.\n\tcandidates := make([]*chaincfg.Checkpoint, 0, cfg.NumCandidates)\n\tnumTested := int32(0)\n\tfor len(candidates) < cfg.NumCandidates && block.Height() > requiredHeight {\n\t\t// Display progress.\n\t\tif numTested%progressInterval == 0 {\n\t\t\tfmt.Print(\".\")\n\t\t}\n\n\t\t// Determine if this block is a checkpoint candidate.\n\t\tisCandidate, err := chain.IsCheckpointCandidate(block)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// All checks passed, so this node seems like a reasonable\n\t\t// checkpoint candidate.\n\t\tif isCandidate {\n\t\t\tcheckpoint := chaincfg.Checkpoint{\n\t\t\t\tHeight: block.Height(),\n\t\t\t\tHash:   block.Hash(),\n\t\t\t}\n\t\t\tcandidates = append(candidates, &checkpoint)\n\t\t}\n\n\t\tprevHash := &block.MsgBlock().Header.PrevBlock\n\t\tblock, err = chain.BlockByHash(prevHash)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tnumTested++\n\t}\n\treturn candidates, nil\n}\n\n// showCandidate display a checkpoint candidate using and output format\n// determined by the configuration parameters.  The Go syntax output\n// uses the format the btcchain code expects for checkpoints added to the list.\nfunc showCandidate(candidateNum int, checkpoint *chaincfg.Checkpoint) {\n\tif cfg.UseGoOutput {\n\t\tfmt.Printf(\"Candidate %d -- {%d, newShaHashFromStr(\\\"%v\\\")},\\n\",\n\t\t\tcandidateNum, checkpoint.Height, checkpoint.Hash)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"Candidate %d -- Height: %d, Hash: %v\\n\", candidateNum,\n\t\tcheckpoint.Height, checkpoint.Hash)\n\n}\n\nfunc main() {\n\t// Load configuration and parse command line.\n\ttcfg, _, err := loadConfig()\n\tif err != nil {\n\t\treturn\n\t}\n\tcfg = tcfg\n\n\t// Load the block database.\n\tdb, err := loadBlockDB()\n\tif err != nil {\n\t\tfmt.Fprintln(os.Stderr, \"failed to load database:\", err)\n\t\treturn\n\t}\n\tdefer db.Close()\n\n\t// Setup chain.  Ignore notifications since they aren't needed for this\n\t// util.\n\tchain, err := blockchain.New(&blockchain.Config{\n\t\tDB:          db,\n\t\tChainParams: activeNetParams,\n\t\tTimeSource:  blockchain.NewMedianTime(),\n\t})\n\tif err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"failed to initialize chain: %v\\n\", err)\n\t\treturn\n\t}\n\n\t// Get the latest block hash and height from the database and report\n\t// status.\n\tbest := chain.BestSnapshot()\n\tfmt.Printf(\"Block database loaded with block height %d\\n\", best.Height)\n\n\t// Find checkpoint candidates.\n\tcandidates, err := findCandidates(chain, &best.Hash)\n\tif err != nil {\n\t\tfmt.Fprintln(os.Stderr, \"Unable to identify candidates:\", err)\n\t\treturn\n\t}\n\n\t// No candidates.\n\tif len(candidates) == 0 {\n\t\tfmt.Println(\"No candidates found.\")\n\t\treturn\n\t}\n\n\t// Show the candidates.\n\tfor i, checkpoint := range candidates {\n\t\tshowCandidate(i+1, checkpoint)\n\t}\n}\n"
  },
  {
    "path": "cmd/gencerts/gencerts.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\tflags \"github.com/jessevdk/go-flags\"\n)\n\ntype config struct {\n\tDirectory    string   `short:\"d\" long:\"directory\" description:\"Directory to write certificate pair\"`\n\tForce        bool     `short:\"f\" long:\"force\" description:\"Force overwriting of any old certs and keys\"`\n\tExtraHosts   []string `short:\"H\" long:\"host\" description:\"Additional hosts/IPs to create certificate for\"`\n\tOrganization string   `short:\"o\" long:\"org\" description:\"Organization in certificate\"`\n\tYears        int      `short:\"y\" long:\"years\" description:\"How many years a certificate is valid for\"`\n}\n\nfunc main() {\n\tcfg := config{\n\t\tYears:        10,\n\t\tOrganization: \"gencerts\",\n\t}\n\tparser := flags.NewParser(&cfg, flags.Default)\n\t_, err := parser.Parse()\n\tif err != nil {\n\t\tif e, ok := err.(*flags.Error); !ok || e.Type != flags.ErrHelp {\n\t\t\tparser.WriteHelp(os.Stderr)\n\t\t}\n\t\treturn\n\t}\n\n\tif cfg.Directory == \"\" {\n\t\tvar err error\n\t\tcfg.Directory, err = os.Getwd()\n\t\tif err != nil {\n\t\t\tfmt.Fprintf(os.Stderr, \"no directory specified and cannot get working directory\\n\")\n\t\t\tos.Exit(1)\n\t\t}\n\t}\n\tcfg.Directory = cleanAndExpandPath(cfg.Directory)\n\tcertFile := filepath.Join(cfg.Directory, \"rpc.cert\")\n\tkeyFile := filepath.Join(cfg.Directory, \"rpc.key\")\n\n\tif !cfg.Force {\n\t\tif fileExists(certFile) || fileExists(keyFile) {\n\t\t\tfmt.Fprintf(os.Stderr, \"%v: certificate and/or key files exist; use -f to force\\n\", cfg.Directory)\n\t\t\tos.Exit(1)\n\t\t}\n\t}\n\n\tvalidUntil := time.Now().Add(time.Duration(cfg.Years) * 365 * 24 * time.Hour)\n\tcert, key, err := btcutil.NewTLSCertPair(cfg.Organization, validUntil, cfg.ExtraHosts)\n\tif err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"cannot generate certificate pair: %v\\n\", err)\n\t\tos.Exit(1)\n\t}\n\n\t// Write cert and key files.\n\tif err = os.WriteFile(certFile, cert, 0666); err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"cannot write cert: %v\\n\", err)\n\t\tos.Exit(1)\n\t}\n\tif err = os.WriteFile(keyFile, key, 0600); err != nil {\n\t\tos.Remove(certFile)\n\t\tfmt.Fprintf(os.Stderr, \"cannot write key: %v\\n\", err)\n\t\tos.Exit(1)\n\t}\n}\n\n// cleanAndExpandPath expands environment variables and leading ~ in the\n// passed path, cleans the result, and returns it.\nfunc cleanAndExpandPath(path string) string {\n\t// Expand initial ~ to OS specific home directory.\n\tif strings.HasPrefix(path, \"~\") {\n\t\tappHomeDir := btcutil.AppDataDir(\"gencerts\", false)\n\t\thomeDir := filepath.Dir(appHomeDir)\n\t\tpath = strings.Replace(path, \"~\", homeDir, 1)\n\t}\n\n\t// NOTE: The os.ExpandEnv doesn't work with Windows-style %VARIABLE%,\n\t// but they variables can still be expanded via POSIX-style $VARIABLE.\n\treturn filepath.Clean(os.ExpandEnv(path))\n}\n\n// fileExists reports whether the named file or directory exists.\nfunc fileExists(name string) bool {\n\tif _, err := os.Stat(name); err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "config.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"bufio\"\n\t\"crypto/rand\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"slices\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/connmgr\"\n\t\"github.com/btcsuite/btcd/database\"\n\t_ \"github.com/btcsuite/btcd/database/ffldb\"\n\t\"github.com/btcsuite/btcd/mempool\"\n\t\"github.com/btcsuite/btcd/peer\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/btcsuite/go-socks/socks\"\n\tflags \"github.com/jessevdk/go-flags\"\n)\n\nconst (\n\tdefaultConfigFilename        = \"btcd.conf\"\n\tdefaultDataDirname           = \"data\"\n\tdefaultLogLevel              = \"info\"\n\tdefaultLogDirname            = \"logs\"\n\tdefaultLogFilename           = \"btcd.log\"\n\tdefaultMaxPeers              = 125\n\tdefaultBanDuration           = time.Hour * 24\n\tdefaultBanThreshold          = 100\n\tdefaultConnectTimeout        = time.Second * 30\n\tdefaultMaxRPCClients         = 10\n\tdefaultMaxRPCWebsockets      = 25\n\tdefaultMaxRPCConcurrentReqs  = 20\n\tdefaultDbType                = \"ffldb\"\n\tdefaultFreeTxRelayLimit      = 15.0\n\tdefaultTrickleInterval       = peer.DefaultTrickleInterval\n\tdefaultBlockMinSize          = 0\n\tdefaultBlockMaxSize          = 750000\n\tdefaultBlockMinWeight        = 0\n\tdefaultBlockMaxWeight        = 3000000\n\tblockMaxSizeMin              = 1000\n\tblockMaxSizeMax              = blockchain.MaxBlockBaseSize - 1000\n\tblockMaxWeightMin            = 4000\n\tblockMaxWeightMax            = blockchain.MaxBlockWeight - 4000\n\tdefaultGenerate              = false\n\tdefaultMaxOrphanTransactions = 100\n\tdefaultMaxOrphanTxSize       = 100000\n\tdefaultSigCacheMaxSize       = 100000\n\tdefaultUtxoCacheMaxSizeMiB   = 250\n\tsampleConfigFilename         = \"sample-btcd.conf\"\n\tdefaultTxIndex               = false\n\tdefaultAddrIndex             = false\n\tpruneMinSize                 = 1536\n)\n\nvar (\n\tdefaultHomeDir     = btcutil.AppDataDir(\"btcd\", false)\n\tdefaultConfigFile  = filepath.Join(defaultHomeDir, defaultConfigFilename)\n\tdefaultDataDir     = filepath.Join(defaultHomeDir, defaultDataDirname)\n\tknownDbTypes       = database.SupportedDrivers()\n\tdefaultRPCKeyFile  = filepath.Join(defaultHomeDir, \"rpc.key\")\n\tdefaultRPCCertFile = filepath.Join(defaultHomeDir, \"rpc.cert\")\n\tdefaultLogDir      = filepath.Join(defaultHomeDir, defaultLogDirname)\n)\n\n// runServiceCommand is only set to a real function on Windows.  It is used\n// to parse and execute service commands specified via the -s flag.\nvar runServiceCommand func(string) error\n\n// minUint32 is a helper function to return the minimum of two uint32s.\n// This avoids a math import and the need to cast to floats.\nfunc minUint32(a, b uint32) uint32 {\n\tif a < b {\n\t\treturn a\n\t}\n\treturn b\n}\n\n// config defines the configuration options for btcd.\n//\n// See loadConfig for details on the configuration load process.\ntype config struct {\n\tAddCheckpoints       []string      `long:\"addcheckpoint\" description:\"Add a custom checkpoint.  Format: '<height>:<hash>'\"`\n\tAddPeers             []string      `short:\"a\" long:\"addpeer\" description:\"Add a peer to connect with at startup\"`\n\tAddrIndex            bool          `long:\"addrindex\" description:\"Maintain a full address-based transaction index which makes the searchrawtransactions RPC available\"`\n\tAgentBlacklist       []string      `long:\"agentblacklist\" description:\"A comma separated list of user-agent substrings which will cause btcd to reject any peers whose user-agent contains any of the blacklisted substrings.\"`\n\tAgentWhitelist       []string      `long:\"agentwhitelist\" description:\"A comma separated list of user-agent substrings which will cause btcd to require all peers' user-agents to contain one of the whitelisted substrings. The blacklist is applied before the whitelist, and an empty whitelist will allow all agents that do not fail the blacklist.\"`\n\tBanDuration          time.Duration `long:\"banduration\" description:\"How long to ban misbehaving peers.  Valid time units are {s, m, h}.  Minimum 1 second\"`\n\tBanThreshold         uint32        `long:\"banthreshold\" description:\"Maximum allowed ban score before disconnecting and banning misbehaving peers.\"`\n\tBlockMaxSize         uint32        `long:\"blockmaxsize\" description:\"Maximum block size in bytes to be used when creating a block\"`\n\tBlockMinSize         uint32        `long:\"blockminsize\" description:\"Minimum block size in bytes to be used when creating a block\"`\n\tBlockMaxWeight       uint32        `long:\"blockmaxweight\" description:\"Maximum block weight to be used when creating a block\"`\n\tBlockMinWeight       uint32        `long:\"blockminweight\" description:\"Minimum block weight to be used when creating a block\"`\n\tBlockPrioritySize    uint32        `long:\"blockprioritysize\" description:\"Size in bytes for high-priority/low-fee transactions when creating a block\"`\n\tBlocksOnly           bool          `long:\"blocksonly\" description:\"Do not accept transactions from remote peers.\"`\n\tConfigFile           string        `short:\"C\" long:\"configfile\" description:\"Path to configuration file\"`\n\tConnectPeers         []string      `long:\"connect\" description:\"Connect only to the specified peers at startup\"`\n\tCPUProfile           string        `long:\"cpuprofile\" description:\"Write CPU profile to the specified file\"`\n\tMemoryProfile        string        `long:\"memprofile\" description:\"Write memory profile to the specified file\"`\n\tTraceProfile         string        `long:\"traceprofile\" description:\"Write execution trace to the specified file\"`\n\tDataDir              string        `short:\"b\" long:\"datadir\" description:\"Directory to store data\"`\n\tDbType               string        `long:\"dbtype\" description:\"Database backend to use for the Block Chain\"`\n\tDebugLevel           string        `short:\"d\" long:\"debuglevel\" description:\"Logging level for all subsystems {trace, debug, info, warn, error, critical} -- You may also specify <subsystem>=<level>,<subsystem2>=<level>,... to set the log level for individual subsystems -- Use show to list available subsystems\"`\n\tDropAddrIndex        bool          `long:\"dropaddrindex\" description:\"Deletes the address-based transaction index from the database on start up and then exits.\"`\n\tDropCfIndex          bool          `long:\"dropcfindex\" description:\"Deletes the index used for committed filtering (CF) support from the database on start up and then exits.\"`\n\tDropTxIndex          bool          `long:\"droptxindex\" description:\"Deletes the hash-based transaction index from the database on start up and then exits.\"`\n\tExternalIPs          []string      `long:\"externalip\" description:\"Add an ip to the list of local addresses we claim to listen on to peers\"`\n\tGenerate             bool          `long:\"generate\" description:\"Generate (mine) bitcoins using the CPU\"`\n\tFreeTxRelayLimit     float64       `long:\"limitfreerelay\" description:\"Limit relay of transactions with no transaction fee to the given amount in thousands of bytes per minute\"`\n\tListeners            []string      `long:\"listen\" description:\"Add an interface/port to listen for connections (default all interfaces port: 8333, testnet: 18333)\"`\n\tLogDir               string        `long:\"logdir\" description:\"Directory to log output.\"`\n\tMaxOrphanTxs         int           `long:\"maxorphantx\" description:\"Max number of orphan transactions to keep in memory\"`\n\tMaxPeers             int           `long:\"maxpeers\" description:\"Max number of inbound and outbound peers\"`\n\tMiningAddrs          []string      `long:\"miningaddr\" description:\"Add the specified payment address to the list of addresses to use for generated blocks -- At least one address is required if the generate option is set\"`\n\tMinRelayTxFee        float64       `long:\"minrelaytxfee\" description:\"The minimum transaction fee in BTC/kB to be considered a non-zero fee.\"`\n\tDisableBanning       bool          `long:\"nobanning\" description:\"Disable banning of misbehaving peers\"`\n\tNoCFilters           bool          `long:\"nocfilters\" description:\"Disable committed filtering (CF) support\"`\n\tDisableCheckpoints   bool          `long:\"nocheckpoints\" description:\"Disable built-in checkpoints.  Don't do this unless you know what you're doing.\"`\n\tDisableDNSSeed       bool          `long:\"nodnsseed\" description:\"Disable DNS seeding for peers\"`\n\tDisableListen        bool          `long:\"nolisten\" description:\"Disable listening for incoming connections -- NOTE: Listening is automatically disabled if the --connect or --proxy options are used without also specifying listen interfaces via --listen\"`\n\tNoOnion              bool          `long:\"noonion\" description:\"Disable connecting to tor hidden services\"`\n\tNoPeerBloomFilters   bool          `long:\"nopeerbloomfilters\" description:\"Disable bloom filtering support\"`\n\tNoRelayPriority      bool          `long:\"norelaypriority\" description:\"Do not require free or low-fee transactions to have high priority for relaying\"`\n\tNoWinService         bool          `long:\"nowinservice\" description:\"Do not start as a background service on Windows -- NOTE: This flag only works on the command line, not in the config file\"`\n\tDisableRPC           bool          `long:\"norpc\" description:\"Disable built-in RPC server -- NOTE: The RPC server is disabled by default if no rpcuser/rpcpass or rpclimituser/rpclimitpass is specified\"`\n\tDisableStallHandler  bool          `long:\"nostalldetect\" description:\"Disables the stall handler system for each peer, useful in simnet/regtest integration tests frameworks\"`\n\tDisableTLS           bool          `long:\"notls\" description:\"Disable TLS for the RPC server -- NOTE: This is only allowed if the RPC server is bound to localhost\"`\n\tOnionProxy           string        `long:\"onion\" description:\"Connect to tor hidden services via SOCKS5 proxy (eg. 127.0.0.1:9050)\"`\n\tOnionProxyPass       string        `long:\"onionpass\" default-mask:\"-\" description:\"Password for onion proxy server\"`\n\tOnionProxyUser       string        `long:\"onionuser\" description:\"Username for onion proxy server\"`\n\tProfile              string        `long:\"profile\" description:\"Enable HTTP profiling on given port -- NOTE port must be between 1024 and 65536\"`\n\tProxy                string        `long:\"proxy\" description:\"Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)\"`\n\tProxyPass            string        `long:\"proxypass\" default-mask:\"-\" description:\"Password for proxy server\"`\n\tProxyUser            string        `long:\"proxyuser\" description:\"Username for proxy server\"`\n\tPrune                uint64        `long:\"prune\" description:\"Prune already validated blocks from the database. Must specify a target size in MiB (minimum value of 1536, default value of 0 will disable pruning)\"`\n\tRegressionTest       bool          `long:\"regtest\" description:\"Use the regression test network\"`\n\tRejectNonStd         bool          `long:\"rejectnonstd\" description:\"Reject non-standard transactions regardless of the default settings for the active network.\"`\n\tRejectReplacement    bool          `long:\"rejectreplacement\" description:\"Reject transactions that attempt to replace existing transactions within the mempool through the Replace-By-Fee (RBF) signaling policy.\"`\n\tRelayNonStd          bool          `long:\"relaynonstd\" description:\"Relay non-standard transactions regardless of the default settings for the active network.\"`\n\tRPCCert              string        `long:\"rpccert\" description:\"File containing the certificate file\"`\n\tRPCKey               string        `long:\"rpckey\" description:\"File containing the certificate key\"`\n\tRPCLimitPass         string        `long:\"rpclimitpass\" default-mask:\"-\" description:\"Password for limited RPC connections\"`\n\tRPCLimitUser         string        `long:\"rpclimituser\" description:\"Username for limited RPC connections\"`\n\tRPCListeners         []string      `long:\"rpclisten\" description:\"Add an interface/port to listen for RPC connections (default port: 8334, testnet: 18334)\"`\n\tRPCMaxClients        int           `long:\"rpcmaxclients\" description:\"Max number of RPC clients for standard connections\"`\n\tRPCMaxConcurrentReqs int           `long:\"rpcmaxconcurrentreqs\" description:\"Max number of concurrent RPC requests that may be processed concurrently\"`\n\tRPCMaxWebsockets     int           `long:\"rpcmaxwebsockets\" description:\"Max number of RPC websocket connections\"`\n\tRPCQuirks            bool          `long:\"rpcquirks\" description:\"Mirror some JSON-RPC quirks of Bitcoin Core -- NOTE: Discouraged unless interoperability issues need to be worked around\"`\n\tRPCPass              string        `short:\"P\" long:\"rpcpass\" default-mask:\"-\" description:\"Password for RPC connections\"`\n\tRPCUser              string        `short:\"u\" long:\"rpcuser\" description:\"Username for RPC connections\"`\n\tSigCacheMaxSize      uint          `long:\"sigcachemaxsize\" description:\"The maximum number of entries in the signature verification cache\"`\n\tSimNet               bool          `long:\"simnet\" description:\"Use the simulation test network\"`\n\tSigNet               bool          `long:\"signet\" description:\"Use the signet test network\"`\n\tSigNetChallenge      string        `long:\"signetchallenge\" description:\"Connect to a custom signet network defined by this challenge instead of using the global default signet test network -- Can be specified multiple times\"`\n\tSigNetSeedNode       []string      `long:\"signetseednode\" description:\"Specify a seed node for the signet network instead of using the global default signet network seed nodes\"`\n\tTestNet3             bool          `long:\"testnet\" description:\"Use the test network (version 3)\"`\n\tTestNet4             bool          `long:\"testnet4\" description:\"Use the test network (version 4)\"`\n\tTorIsolation         bool          `long:\"torisolation\" description:\"Enable Tor stream isolation by randomizing user credentials for each connection.\"`\n\tTrickleInterval      time.Duration `long:\"trickleinterval\" description:\"Minimum time between attempts to send new inventory to a connected peer\"`\n\tUtxoCacheMaxSizeMiB  uint          `long:\"utxocachemaxsize\" description:\"The maximum size in MiB of the UTXO cache\"`\n\tTxIndex              bool          `long:\"txindex\" description:\"Maintain a full hash-based transaction index which makes all transactions available via the getrawtransaction RPC\"`\n\tV2Transport          bool          `long:\"v2transport\" description:\"Enable P2P v2 encrypted transport protocol (BIP324) (default: false)\"`\n\tUserAgentComments    []string      `long:\"uacomment\" description:\"Comment to add to the user agent -- See BIP 14 for more information.\"`\n\tUpnp                 bool          `long:\"upnp\" description:\"Use UPnP to map our listening port outside of NAT\"`\n\tShowVersion          bool          `short:\"V\" long:\"version\" description:\"Display version information and exit\"`\n\tWhitelists           []string      `long:\"whitelist\" description:\"Add an IP network or IP that will not be banned. (eg. 192.168.1.0/24 or ::1)\"`\n\tlookup               func(string) ([]net.IP, error)\n\toniondial            func(string, string, time.Duration) (net.Conn, error)\n\tdial                 func(string, string, time.Duration) (net.Conn, error)\n\taddCheckpoints       []chaincfg.Checkpoint\n\tminingAddrs          []btcutil.Address\n\tminRelayTxFee        btcutil.Amount\n\twhitelists           []*net.IPNet\n}\n\n// serviceOptions defines the configuration options for the daemon as a service on\n// Windows.\ntype serviceOptions struct {\n\tServiceCommand string `short:\"s\" long:\"service\" description:\"Service command {install, remove, start, stop}\"`\n}\n\n// cleanAndExpandPath expands environment variables and leading ~ in the\n// passed path, cleans the result, and returns it.\nfunc cleanAndExpandPath(path string) string {\n\t// Expand initial ~ to OS specific home directory.\n\tif strings.HasPrefix(path, \"~\") {\n\t\thomeDir := filepath.Dir(defaultHomeDir)\n\t\tpath = strings.Replace(path, \"~\", homeDir, 1)\n\t}\n\n\t// NOTE: The os.ExpandEnv doesn't work with Windows-style %VARIABLE%,\n\t// but they variables can still be expanded via POSIX-style $VARIABLE.\n\treturn filepath.Clean(os.ExpandEnv(path))\n}\n\n// validLogLevel returns whether or not logLevel is a valid debug log level.\nfunc validLogLevel(logLevel string) bool {\n\tswitch logLevel {\n\tcase \"trace\":\n\t\tfallthrough\n\tcase \"debug\":\n\t\tfallthrough\n\tcase \"info\":\n\t\tfallthrough\n\tcase \"warn\":\n\t\tfallthrough\n\tcase \"error\":\n\t\tfallthrough\n\tcase \"critical\":\n\t\treturn true\n\t}\n\treturn false\n}\n\n// supportedSubsystems returns a sorted slice of the supported subsystems for\n// logging purposes.\nfunc supportedSubsystems() []string {\n\t// Convert the subsystemLoggers map keys to a slice.\n\tsubsystems := make([]string, 0, len(subsystemLoggers))\n\tfor subsysID := range subsystemLoggers {\n\t\tsubsystems = append(subsystems, subsysID)\n\t}\n\n\t// Sort the subsystems for stable display.\n\tsort.Strings(subsystems)\n\treturn subsystems\n}\n\n// parseAndSetDebugLevels attempts to parse the specified debug level and set\n// the levels accordingly.  An appropriate error is returned if anything is\n// invalid.\nfunc parseAndSetDebugLevels(debugLevel string) error {\n\t// When the specified string doesn't have any delimiters, treat it as\n\t// the log level for all subsystems.\n\tif !strings.Contains(debugLevel, \",\") && !strings.Contains(debugLevel, \"=\") {\n\t\t// Validate debug log level.\n\t\tif !validLogLevel(debugLevel) {\n\t\t\tstr := \"The specified debug level [%v] is invalid\"\n\t\t\treturn fmt.Errorf(str, debugLevel)\n\t\t}\n\n\t\t// Change the logging level for all subsystems.\n\t\tsetLogLevels(debugLevel)\n\n\t\treturn nil\n\t}\n\n\t// Split the specified string into subsystem/level pairs while detecting\n\t// issues and update the log levels accordingly.\n\tfor _, logLevelPair := range strings.Split(debugLevel, \",\") {\n\t\tif !strings.Contains(logLevelPair, \"=\") {\n\t\t\tstr := \"The specified debug level contains an invalid \" +\n\t\t\t\t\"subsystem/level pair [%v]\"\n\t\t\treturn fmt.Errorf(str, logLevelPair)\n\t\t}\n\n\t\t// Extract the specified subsystem and log level.\n\t\tfields := strings.Split(logLevelPair, \"=\")\n\t\tsubsysID, logLevel := fields[0], fields[1]\n\n\t\t// Validate subsystem.\n\t\tif _, exists := subsystemLoggers[subsysID]; !exists {\n\t\t\tstr := \"The specified subsystem [%v] is invalid -- \" +\n\t\t\t\t\"supported subsystems %v\"\n\t\t\treturn fmt.Errorf(str, subsysID, supportedSubsystems())\n\t\t}\n\n\t\t// Validate log level.\n\t\tif !validLogLevel(logLevel) {\n\t\t\tstr := \"The specified debug level [%v] is invalid\"\n\t\t\treturn fmt.Errorf(str, logLevel)\n\t\t}\n\n\t\tsetLogLevel(subsysID, logLevel)\n\t}\n\n\treturn nil\n}\n\n// validDbType returns whether or not dbType is a supported database type.\nfunc validDbType(dbType string) bool {\n\treturn slices.Contains(knownDbTypes, dbType)\n}\n\n// removeDuplicateAddresses returns a new slice with all duplicate entries in\n// addrs removed.\nfunc removeDuplicateAddresses(addrs []string) []string {\n\tresult := make([]string, 0, len(addrs))\n\tseen := map[string]struct{}{}\n\tfor _, val := range addrs {\n\t\tif _, ok := seen[val]; !ok {\n\t\t\tresult = append(result, val)\n\t\t\tseen[val] = struct{}{}\n\t\t}\n\t}\n\treturn result\n}\n\n// normalizeAddress returns addr with the passed default port appended if\n// there is not already a port specified.\nfunc normalizeAddress(addr, defaultPort string) string {\n\t_, _, err := net.SplitHostPort(addr)\n\tif err != nil {\n\t\treturn net.JoinHostPort(addr, defaultPort)\n\t}\n\treturn addr\n}\n\n// normalizeAddresses returns a new slice with all the passed peer addresses\n// normalized with the given default port, and all duplicates removed.\nfunc normalizeAddresses(addrs []string, defaultPort string) []string {\n\tfor i, addr := range addrs {\n\t\taddrs[i] = normalizeAddress(addr, defaultPort)\n\t}\n\n\treturn removeDuplicateAddresses(addrs)\n}\n\n// newCheckpointFromStr parses checkpoints in the '<height>:<hash>' format.\nfunc newCheckpointFromStr(checkpoint string) (chaincfg.Checkpoint, error) {\n\tparts := strings.Split(checkpoint, \":\")\n\tif len(parts) != 2 {\n\t\treturn chaincfg.Checkpoint{}, fmt.Errorf(\"unable to parse \"+\n\t\t\t\"checkpoint %q -- use the syntax <height>:<hash>\",\n\t\t\tcheckpoint)\n\t}\n\n\theight, err := strconv.ParseInt(parts[0], 10, 32)\n\tif err != nil {\n\t\treturn chaincfg.Checkpoint{}, fmt.Errorf(\"unable to parse \"+\n\t\t\t\"checkpoint %q due to malformed height\", checkpoint)\n\t}\n\n\tif len(parts[1]) == 0 {\n\t\treturn chaincfg.Checkpoint{}, fmt.Errorf(\"unable to parse \"+\n\t\t\t\"checkpoint %q due to missing hash\", checkpoint)\n\t}\n\thash, err := chainhash.NewHashFromStr(parts[1])\n\tif err != nil {\n\t\treturn chaincfg.Checkpoint{}, fmt.Errorf(\"unable to parse \"+\n\t\t\t\"checkpoint %q due to malformed hash\", checkpoint)\n\t}\n\n\treturn chaincfg.Checkpoint{\n\t\tHeight: int32(height),\n\t\tHash:   hash,\n\t}, nil\n}\n\n// parseCheckpoints checks the checkpoint strings for valid syntax\n// ('<height>:<hash>') and parses them to chaincfg.Checkpoint instances.\nfunc parseCheckpoints(checkpointStrings []string) ([]chaincfg.Checkpoint, error) {\n\tif len(checkpointStrings) == 0 {\n\t\treturn nil, nil\n\t}\n\tcheckpoints := make([]chaincfg.Checkpoint, len(checkpointStrings))\n\tfor i, cpString := range checkpointStrings {\n\t\tcheckpoint, err := newCheckpointFromStr(cpString)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcheckpoints[i] = checkpoint\n\t}\n\treturn checkpoints, nil\n}\n\n// fileExists reports whether the named file or directory exists.\nfunc fileExists(name string) bool {\n\tif _, err := os.Stat(name); err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// newConfigParser returns a new command line flags parser.\nfunc newConfigParser(cfg *config, so *serviceOptions, options flags.Options) *flags.Parser {\n\tparser := flags.NewParser(cfg, options)\n\tif runtime.GOOS == \"windows\" {\n\t\tparser.AddGroup(\"Service Options\", \"Service Options\", so)\n\t}\n\treturn parser\n}\n\n// loadConfig initializes and parses the config using a config file and command\n// line options.\n//\n// The configuration proceeds as follows:\n//  1. Start with a default config with sane settings\n//  2. Pre-parse the command line to check for an alternative config file\n//  3. Load configuration file overwriting defaults with any specified options\n//  4. Parse CLI options and overwrite/add any specified options\n//\n// The above results in btcd functioning properly without any config settings\n// while still allowing the user to override settings with config files and\n// command line options.  Command line options always take precedence.\nfunc loadConfig() (*config, []string, error) {\n\t// Default config.\n\tcfg := config{\n\t\tConfigFile:           defaultConfigFile,\n\t\tDebugLevel:           defaultLogLevel,\n\t\tMaxPeers:             defaultMaxPeers,\n\t\tBanDuration:          defaultBanDuration,\n\t\tBanThreshold:         defaultBanThreshold,\n\t\tRPCMaxClients:        defaultMaxRPCClients,\n\t\tRPCMaxWebsockets:     defaultMaxRPCWebsockets,\n\t\tRPCMaxConcurrentReqs: defaultMaxRPCConcurrentReqs,\n\t\tDataDir:              defaultDataDir,\n\t\tLogDir:               defaultLogDir,\n\t\tDbType:               defaultDbType,\n\t\tRPCKey:               defaultRPCKeyFile,\n\t\tRPCCert:              defaultRPCCertFile,\n\t\tMinRelayTxFee:        mempool.DefaultMinRelayTxFee.ToBTC(),\n\t\tFreeTxRelayLimit:     defaultFreeTxRelayLimit,\n\t\tTrickleInterval:      defaultTrickleInterval,\n\t\tBlockMinSize:         defaultBlockMinSize,\n\t\tBlockMaxSize:         defaultBlockMaxSize,\n\t\tBlockMinWeight:       defaultBlockMinWeight,\n\t\tBlockMaxWeight:       defaultBlockMaxWeight,\n\t\tBlockPrioritySize:    mempool.DefaultBlockPrioritySize,\n\t\tMaxOrphanTxs:         defaultMaxOrphanTransactions,\n\t\tSigCacheMaxSize:      defaultSigCacheMaxSize,\n\t\tUtxoCacheMaxSizeMiB:  defaultUtxoCacheMaxSizeMiB,\n\t\tGenerate:             defaultGenerate,\n\t\tTxIndex:              defaultTxIndex,\n\t\tAddrIndex:            defaultAddrIndex,\n\t\tV2Transport:          false,\n\t}\n\n\t// Service options which are only added on Windows.\n\tserviceOpts := serviceOptions{}\n\n\t// Pre-parse the command line options to see if an alternative config\n\t// file or the version flag was specified.  Any errors aside from the\n\t// help message error can be ignored here since they will be caught by\n\t// the final parse below.\n\tpreCfg := cfg\n\tpreParser := newConfigParser(&preCfg, &serviceOpts, flags.HelpFlag)\n\t_, err := preParser.Parse()\n\tif err != nil {\n\t\tif e, ok := err.(*flags.Error); ok && e.Type == flags.ErrHelp {\n\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\treturn nil, nil, err\n\t\t}\n\t}\n\n\t// Show the version and exit if the version flag was specified.\n\tappName := filepath.Base(os.Args[0])\n\tappName = strings.TrimSuffix(appName, filepath.Ext(appName))\n\tusageMessage := fmt.Sprintf(\"Use %s -h to show usage\", appName)\n\tif preCfg.ShowVersion {\n\t\tfmt.Println(appName, \"version\", version())\n\t\tos.Exit(0)\n\t}\n\n\t// Perform service command and exit if specified.  Invalid service\n\t// commands show an appropriate error.  Only runs on Windows since\n\t// the runServiceCommand function will be nil when not on Windows.\n\tif serviceOpts.ServiceCommand != \"\" && runServiceCommand != nil {\n\t\terr := runServiceCommand(serviceOpts.ServiceCommand)\n\t\tif err != nil {\n\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t}\n\t\tos.Exit(0)\n\t}\n\n\t// Load additional config from file.\n\tvar configFileError error\n\tparser := newConfigParser(&cfg, &serviceOpts, flags.Default)\n\tif !(preCfg.RegressionTest || preCfg.SimNet || preCfg.SigNet) ||\n\t\tpreCfg.ConfigFile != defaultConfigFile {\n\n\t\tif _, err := os.Stat(preCfg.ConfigFile); os.IsNotExist(err) {\n\t\t\terr := createDefaultConfigFile(preCfg.ConfigFile)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Fprintf(os.Stderr, \"Error creating a \"+\n\t\t\t\t\t\"default config file: %v\\n\", err)\n\t\t\t}\n\t\t}\n\n\t\terr := flags.NewIniParser(parser).ParseFile(preCfg.ConfigFile)\n\t\tif err != nil {\n\t\t\tif _, ok := err.(*os.PathError); !ok {\n\t\t\t\tfmt.Fprintf(os.Stderr, \"Error parsing config \"+\n\t\t\t\t\t\"file: %v\\n\", err)\n\t\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tconfigFileError = err\n\t\t}\n\t}\n\n\t// Don't add peers from the config file when in regression test mode.\n\tif preCfg.RegressionTest && len(cfg.AddPeers) > 0 {\n\t\tcfg.AddPeers = nil\n\t}\n\n\t// Parse command line options again to ensure they take precedence.\n\tremainingArgs, err := parser.Parse()\n\tif err != nil {\n\t\tif e, ok := err.(*flags.Error); !ok || e.Type != flags.ErrHelp {\n\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t}\n\t\treturn nil, nil, err\n\t}\n\n\t// Create the home directory if it doesn't already exist.\n\tfuncName := \"loadConfig\"\n\terr = os.MkdirAll(defaultHomeDir, 0700)\n\tif err != nil {\n\t\t// Show a nicer error message if it's because a symlink is\n\t\t// linked to a directory that does not exist (probably because\n\t\t// it's not mounted).\n\t\tif e, ok := err.(*os.PathError); ok && os.IsExist(err) {\n\t\t\tif link, lerr := os.Readlink(e.Path); lerr == nil {\n\t\t\t\tstr := \"is symlink %s -> %s mounted?\"\n\t\t\t\terr = fmt.Errorf(str, e.Path, link)\n\t\t\t}\n\t\t}\n\n\t\tstr := \"%s: Failed to create home directory: %v\"\n\t\terr := fmt.Errorf(str, funcName, err)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\treturn nil, nil, err\n\t}\n\n\t// Multiple networks can't be selected simultaneously.\n\tnumNets := 0\n\t// Count number of network flags passed; assign active network params\n\t// while we're at it\n\tif cfg.TestNet3 {\n\t\tnumNets++\n\t\tactiveNetParams = &testNet3Params\n\t}\n\tif cfg.TestNet4 {\n\t\tnumNets++\n\t\tactiveNetParams = &testNet4Params\n\t}\n\tif cfg.RegressionTest {\n\t\tnumNets++\n\t\tactiveNetParams = &regressionNetParams\n\t}\n\tif cfg.SimNet {\n\t\tnumNets++\n\t\t// Also disable dns seeding on the simulation test network.\n\t\tactiveNetParams = &simNetParams\n\t\tcfg.DisableDNSSeed = true\n\t}\n\tif cfg.SigNet {\n\t\tnumNets++\n\t\tactiveNetParams = &sigNetParams\n\n\t\t// Let the user overwrite the default signet parameters. The\n\t\t// challenge defines the actual signet network to join and the\n\t\t// seed nodes are needed for network discovery.\n\t\tsigNetChallenge := chaincfg.DefaultSignetChallenge\n\t\tsigNetSeeds := chaincfg.DefaultSignetDNSSeeds\n\t\tif cfg.SigNetChallenge != \"\" {\n\t\t\tchallenge, err := hex.DecodeString(cfg.SigNetChallenge)\n\t\t\tif err != nil {\n\t\t\t\tstr := \"%s: Invalid signet challenge, hex \" +\n\t\t\t\t\t\"decode failed: %v\"\n\t\t\t\terr := fmt.Errorf(str, funcName, err)\n\t\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tsigNetChallenge = challenge\n\t\t}\n\n\t\tif len(cfg.SigNetSeedNode) > 0 {\n\t\t\tsigNetSeeds = make(\n\t\t\t\t[]chaincfg.DNSSeed, len(cfg.SigNetSeedNode),\n\t\t\t)\n\t\t\tfor idx, seed := range cfg.SigNetSeedNode {\n\t\t\t\tsigNetSeeds[idx] = chaincfg.DNSSeed{\n\t\t\t\t\tHost:         seed,\n\t\t\t\t\tHasFiltering: false,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tchainParams := chaincfg.CustomSignetParams(\n\t\t\tsigNetChallenge, sigNetSeeds,\n\t\t)\n\t\tactiveNetParams.Params = &chainParams\n\t}\n\tif numNets > 1 {\n\t\tstr := \"%s: The testnet, regtest, segnet, signet and simnet \" +\n\t\t\t\"params can't be used together -- choose one of the \" +\n\t\t\t\"five\"\n\t\terr := fmt.Errorf(str, funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// If mainnet is active, then we won't allow the stall handler to be\n\t// disabled.\n\tif activeNetParams.Params.Net == wire.MainNet && cfg.DisableStallHandler {\n\t\tstr := \"%s: stall handler cannot be disabled on mainnet\"\n\t\terr := fmt.Errorf(str, funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Set the default policy for relaying non-standard transactions\n\t// according to the default of the active network. The set\n\t// configuration value takes precedence over the default value for the\n\t// selected network.\n\trelayNonStd := activeNetParams.RelayNonStdTxs\n\tswitch {\n\tcase cfg.RelayNonStd && cfg.RejectNonStd:\n\t\tstr := \"%s: rejectnonstd and relaynonstd cannot be used \" +\n\t\t\t\"together -- choose only one\"\n\t\terr := fmt.Errorf(str, funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\tcase cfg.RejectNonStd:\n\t\trelayNonStd = false\n\tcase cfg.RelayNonStd:\n\t\trelayNonStd = true\n\t}\n\tcfg.RelayNonStd = relayNonStd\n\n\t// Append the network type to the data directory so it is \"namespaced\"\n\t// per network.  In addition to the block database, there are other\n\t// pieces of data that are saved to disk such as address manager state.\n\t// All data is specific to a network, so namespacing the data directory\n\t// means each individual piece of serialized data does not have to\n\t// worry about changing names per network and such.\n\tcfg.DataDir = cleanAndExpandPath(cfg.DataDir)\n\tcfg.DataDir = filepath.Join(cfg.DataDir, netName(activeNetParams))\n\n\t// Append the network type to the log directory so it is \"namespaced\"\n\t// per network in the same fashion as the data directory.\n\tcfg.LogDir = cleanAndExpandPath(cfg.LogDir)\n\tcfg.LogDir = filepath.Join(cfg.LogDir, netName(activeNetParams))\n\n\t// Special show command to list supported subsystems and exit.\n\tif cfg.DebugLevel == \"show\" {\n\t\tfmt.Println(\"Supported subsystems\", supportedSubsystems())\n\t\tos.Exit(0)\n\t}\n\n\t// Initialize log rotation.  After log rotation has been initialized, the\n\t// logger variables may be used.\n\tinitLogRotator(filepath.Join(cfg.LogDir, defaultLogFilename))\n\n\t// Parse, validate, and set debug log level(s).\n\tif err := parseAndSetDebugLevels(cfg.DebugLevel); err != nil {\n\t\terr := fmt.Errorf(\"%s: %v\", funcName, err.Error())\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Validate database type.\n\tif !validDbType(cfg.DbType) {\n\t\tstr := \"%s: The specified database type [%v] is invalid -- \" +\n\t\t\t\"supported types %v\"\n\t\terr := fmt.Errorf(str, funcName, cfg.DbType, knownDbTypes)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Validate profile port number\n\tif cfg.Profile != \"\" {\n\t\tprofilePort, err := strconv.Atoi(cfg.Profile)\n\t\tif err != nil || profilePort < 1024 || profilePort > 65535 {\n\t\t\tstr := \"%s: The profile port must be between 1024 and 65535\"\n\t\t\terr := fmt.Errorf(str, funcName)\n\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\treturn nil, nil, err\n\t\t}\n\t}\n\n\t// Don't allow ban durations that are too short.\n\tif cfg.BanDuration < time.Second {\n\t\tstr := \"%s: The banduration option may not be less than 1s -- parsed [%v]\"\n\t\terr := fmt.Errorf(str, funcName, cfg.BanDuration)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Validate any given whitelisted IP addresses and networks.\n\tif len(cfg.Whitelists) > 0 {\n\t\tvar ip net.IP\n\t\tcfg.whitelists = make([]*net.IPNet, 0, len(cfg.Whitelists))\n\n\t\tfor _, addr := range cfg.Whitelists {\n\t\t\t_, ipnet, err := net.ParseCIDR(addr)\n\t\t\tif err != nil {\n\t\t\t\tip = net.ParseIP(addr)\n\t\t\t\tif ip == nil {\n\t\t\t\t\tstr := \"%s: The whitelist value of '%s' is invalid\"\n\t\t\t\t\terr = fmt.Errorf(str, funcName, addr)\n\t\t\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\t\t\t\tvar bits int\n\t\t\t\tif ip.To4() == nil {\n\t\t\t\t\t// IPv6\n\t\t\t\t\tbits = 128\n\t\t\t\t} else {\n\t\t\t\t\tbits = 32\n\t\t\t\t}\n\t\t\t\tipnet = &net.IPNet{\n\t\t\t\t\tIP:   ip,\n\t\t\t\t\tMask: net.CIDRMask(bits, bits),\n\t\t\t\t}\n\t\t\t}\n\t\t\tcfg.whitelists = append(cfg.whitelists, ipnet)\n\t\t}\n\t}\n\n\t// --addPeer and --connect do not mix.\n\tif len(cfg.AddPeers) > 0 && len(cfg.ConnectPeers) > 0 {\n\t\tstr := \"%s: the --addpeer and --connect options can not be \" +\n\t\t\t\"mixed\"\n\t\terr := fmt.Errorf(str, funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// --proxy or --connect without --listen disables listening.\n\tif (cfg.Proxy != \"\" || len(cfg.ConnectPeers) > 0) &&\n\t\tlen(cfg.Listeners) == 0 {\n\t\tcfg.DisableListen = true\n\t}\n\n\t// Connect means no DNS seeding.\n\tif len(cfg.ConnectPeers) > 0 {\n\t\tcfg.DisableDNSSeed = true\n\t}\n\n\t// Add the default listener if none were specified. The default\n\t// listener is all addresses on the listen port for the network\n\t// we are to connect to.\n\tif len(cfg.Listeners) == 0 {\n\t\tcfg.Listeners = []string{\n\t\t\tnet.JoinHostPort(\"\", activeNetParams.DefaultPort),\n\t\t}\n\t}\n\n\t// Check to make sure limited and admin users don't have the same username\n\tif cfg.RPCUser == cfg.RPCLimitUser && cfg.RPCUser != \"\" {\n\t\tstr := \"%s: --rpcuser and --rpclimituser must not specify the \" +\n\t\t\t\"same username\"\n\t\terr := fmt.Errorf(str, funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Check to make sure limited and admin users don't have the same password\n\tif cfg.RPCPass == cfg.RPCLimitPass && cfg.RPCPass != \"\" {\n\t\tstr := \"%s: --rpcpass and --rpclimitpass must not specify the \" +\n\t\t\t\"same password\"\n\t\terr := fmt.Errorf(str, funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// The RPC server is disabled if no username or password is provided.\n\tif (cfg.RPCUser == \"\" || cfg.RPCPass == \"\") &&\n\t\t(cfg.RPCLimitUser == \"\" || cfg.RPCLimitPass == \"\") {\n\t\tcfg.DisableRPC = true\n\t}\n\n\tif cfg.DisableRPC {\n\t\tbtcdLog.Infof(\"RPC service is disabled\")\n\t}\n\n\t// Default RPC to listen on localhost only.\n\tif !cfg.DisableRPC && len(cfg.RPCListeners) == 0 {\n\t\taddrs, err := net.LookupHost(\"localhost\")\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t\tcfg.RPCListeners = make([]string, 0, len(addrs))\n\t\tfor _, addr := range addrs {\n\t\t\taddr = net.JoinHostPort(addr, activeNetParams.rpcPort)\n\t\t\tcfg.RPCListeners = append(cfg.RPCListeners, addr)\n\t\t}\n\t}\n\n\tif cfg.RPCMaxConcurrentReqs < 0 {\n\t\tstr := \"%s: The rpcmaxwebsocketconcurrentrequests option may \" +\n\t\t\t\"not be less than 0 -- parsed [%d]\"\n\t\terr := fmt.Errorf(str, funcName, cfg.RPCMaxConcurrentReqs)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Validate the minrelaytxfee.\n\tcfg.minRelayTxFee, err = btcutil.NewAmount(cfg.MinRelayTxFee)\n\tif err != nil {\n\t\tstr := \"%s: invalid minrelaytxfee: %v\"\n\t\terr := fmt.Errorf(str, funcName, err)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Limit the max block size to a sane value.\n\tif cfg.BlockMaxSize < blockMaxSizeMin || cfg.BlockMaxSize >\n\t\tblockMaxSizeMax {\n\n\t\tstr := \"%s: The blockmaxsize option must be in between %d \" +\n\t\t\t\"and %d -- parsed [%d]\"\n\t\terr := fmt.Errorf(str, funcName, blockMaxSizeMin,\n\t\t\tblockMaxSizeMax, cfg.BlockMaxSize)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Limit the max block weight to a sane value.\n\tif cfg.BlockMaxWeight < blockMaxWeightMin ||\n\t\tcfg.BlockMaxWeight > blockMaxWeightMax {\n\n\t\tstr := \"%s: The blockmaxweight option must be in between %d \" +\n\t\t\t\"and %d -- parsed [%d]\"\n\t\terr := fmt.Errorf(str, funcName, blockMaxWeightMin,\n\t\t\tblockMaxWeightMax, cfg.BlockMaxWeight)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Limit the max orphan count to a sane vlue.\n\tif cfg.MaxOrphanTxs < 0 {\n\t\tstr := \"%s: The maxorphantx option may not be less than 0 \" +\n\t\t\t\"-- parsed [%d]\"\n\t\terr := fmt.Errorf(str, funcName, cfg.MaxOrphanTxs)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Limit the block priority and minimum block sizes to max block size.\n\tcfg.BlockPrioritySize = minUint32(cfg.BlockPrioritySize, cfg.BlockMaxSize)\n\tcfg.BlockMinSize = minUint32(cfg.BlockMinSize, cfg.BlockMaxSize)\n\tcfg.BlockMinWeight = minUint32(cfg.BlockMinWeight, cfg.BlockMaxWeight)\n\n\tswitch {\n\t// If the max block size isn't set, but the max weight is, then we'll\n\t// set the limit for the max block size to a safe limit so weight takes\n\t// precedence.\n\tcase cfg.BlockMaxSize == defaultBlockMaxSize &&\n\t\tcfg.BlockMaxWeight != defaultBlockMaxWeight:\n\n\t\tcfg.BlockMaxSize = blockchain.MaxBlockBaseSize - 1000\n\n\t// If the max block weight isn't set, but the block size is, then we'll\n\t// scale the set weight accordingly based on the max block size value.\n\tcase cfg.BlockMaxSize != defaultBlockMaxSize &&\n\t\tcfg.BlockMaxWeight == defaultBlockMaxWeight:\n\n\t\tcfg.BlockMaxWeight = cfg.BlockMaxSize * blockchain.WitnessScaleFactor\n\t}\n\n\t// Look for illegal characters in the user agent comments.\n\tfor _, uaComment := range cfg.UserAgentComments {\n\t\tif strings.ContainsAny(uaComment, \"/:()\") {\n\t\t\terr := fmt.Errorf(\"%s: The following characters must not \"+\n\t\t\t\t\"appear in user agent comments: '/', ':', '(', ')'\",\n\t\t\t\tfuncName)\n\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\treturn nil, nil, err\n\t\t}\n\t}\n\n\t// --txindex and --droptxindex do not mix.\n\tif cfg.TxIndex && cfg.DropTxIndex {\n\t\terr := fmt.Errorf(\"%s: the --txindex and --droptxindex \"+\n\t\t\t\"options may  not be activated at the same time\",\n\t\t\tfuncName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// --addrindex and --dropaddrindex do not mix.\n\tif cfg.AddrIndex && cfg.DropAddrIndex {\n\t\terr := fmt.Errorf(\"%s: the --addrindex and --dropaddrindex \"+\n\t\t\t\"options may not be activated at the same time\",\n\t\t\tfuncName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// --addrindex and --droptxindex do not mix.\n\tif cfg.AddrIndex && cfg.DropTxIndex {\n\t\terr := fmt.Errorf(\"%s: the --addrindex and --droptxindex \"+\n\t\t\t\"options may not be activated at the same time \"+\n\t\t\t\"because the address index relies on the transaction \"+\n\t\t\t\"index\",\n\t\t\tfuncName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Check mining addresses are valid and saved parsed versions.\n\tcfg.miningAddrs = make([]btcutil.Address, 0, len(cfg.MiningAddrs))\n\tfor _, strAddr := range cfg.MiningAddrs {\n\t\taddr, err := btcutil.DecodeAddress(strAddr, activeNetParams.Params)\n\t\tif err != nil {\n\t\t\tstr := \"%s: mining address '%s' failed to decode: %v\"\n\t\t\terr := fmt.Errorf(str, funcName, strAddr, err)\n\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\treturn nil, nil, err\n\t\t}\n\t\tif !addr.IsForNet(activeNetParams.Params) {\n\t\t\tstr := \"%s: mining address '%s' is on the wrong network\"\n\t\t\terr := fmt.Errorf(str, funcName, strAddr)\n\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\treturn nil, nil, err\n\t\t}\n\t\tcfg.miningAddrs = append(cfg.miningAddrs, addr)\n\t}\n\n\t// Ensure there is at least one mining address when the generate flag is\n\t// set.\n\tif cfg.Generate && len(cfg.MiningAddrs) == 0 {\n\t\tstr := \"%s: the generate flag is set, but there are no mining \" +\n\t\t\t\"addresses specified \"\n\t\terr := fmt.Errorf(str, funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Add default port to all listener addresses if needed and remove\n\t// duplicate addresses.\n\tcfg.Listeners = normalizeAddresses(cfg.Listeners,\n\t\tactiveNetParams.DefaultPort)\n\n\t// Add default port to all rpc listener addresses if needed and remove\n\t// duplicate addresses.\n\tcfg.RPCListeners = normalizeAddresses(cfg.RPCListeners,\n\t\tactiveNetParams.rpcPort)\n\n\t// Only allow TLS to be disabled if the RPC is bound to localhost\n\t// addresses.\n\tif !cfg.DisableRPC && cfg.DisableTLS {\n\t\tallowedTLSListeners := map[string]struct{}{\n\t\t\t\"localhost\": {},\n\t\t\t\"127.0.0.1\": {},\n\t\t\t\"::1\":       {},\n\t\t}\n\t\tfor _, addr := range cfg.RPCListeners {\n\t\t\thost, _, err := net.SplitHostPort(addr)\n\t\t\tif err != nil {\n\t\t\t\tstr := \"%s: RPC listen interface '%s' is \" +\n\t\t\t\t\t\"invalid: %v\"\n\t\t\t\terr := fmt.Errorf(str, funcName, addr, err)\n\t\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tif _, ok := allowedTLSListeners[host]; !ok {\n\t\t\t\tstr := \"%s: the --notls option may not be used \" +\n\t\t\t\t\t\"when binding RPC to non localhost \" +\n\t\t\t\t\t\"addresses: %s\"\n\t\t\t\terr := fmt.Errorf(str, funcName, addr)\n\t\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add default port to all added peer addresses if needed and remove\n\t// duplicate addresses.\n\tcfg.AddPeers = normalizeAddresses(cfg.AddPeers,\n\t\tactiveNetParams.DefaultPort)\n\tcfg.ConnectPeers = normalizeAddresses(cfg.ConnectPeers,\n\t\tactiveNetParams.DefaultPort)\n\n\t// --noonion and --onion do not mix.\n\tif cfg.NoOnion && cfg.OnionProxy != \"\" {\n\t\terr := fmt.Errorf(\"%s: the --noonion and --onion options may \"+\n\t\t\t\"not be activated at the same time\", funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Check the checkpoints for syntax errors.\n\tcfg.addCheckpoints, err = parseCheckpoints(cfg.AddCheckpoints)\n\tif err != nil {\n\t\tstr := \"%s: Error parsing checkpoints: %v\"\n\t\terr := fmt.Errorf(str, funcName, err)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Tor stream isolation requires either proxy or onion proxy to be set.\n\tif cfg.TorIsolation && cfg.Proxy == \"\" && cfg.OnionProxy == \"\" {\n\t\tstr := \"%s: Tor stream isolation requires either proxy or \" +\n\t\t\t\"onionproxy to be set\"\n\t\terr := fmt.Errorf(str, funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Setup dial and DNS resolution (lookup) functions depending on the\n\t// specified options.  The default is to use the standard\n\t// net.DialTimeout function as well as the system DNS resolver.  When a\n\t// proxy is specified, the dial function is set to the proxy specific\n\t// dial function and the lookup is set to use tor (unless --noonion is\n\t// specified in which case the system DNS resolver is used).\n\tcfg.dial = net.DialTimeout\n\tcfg.lookup = net.LookupIP\n\tif cfg.Proxy != \"\" {\n\t\t_, _, err := net.SplitHostPort(cfg.Proxy)\n\t\tif err != nil {\n\t\t\tstr := \"%s: Proxy address '%s' is invalid: %v\"\n\t\t\terr := fmt.Errorf(str, funcName, cfg.Proxy, err)\n\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\t// Tor isolation flag means proxy credentials will be overridden\n\t\t// unless there is also an onion proxy configured in which case\n\t\t// that one will be overridden.\n\t\ttorIsolation := false\n\t\tif cfg.TorIsolation && cfg.OnionProxy == \"\" &&\n\t\t\t(cfg.ProxyUser != \"\" || cfg.ProxyPass != \"\") {\n\n\t\t\ttorIsolation = true\n\t\t\tfmt.Fprintln(os.Stderr, \"Tor isolation set -- \"+\n\t\t\t\t\"overriding specified proxy user credentials\")\n\t\t}\n\n\t\tproxy := &socks.Proxy{\n\t\t\tAddr:         cfg.Proxy,\n\t\t\tUsername:     cfg.ProxyUser,\n\t\t\tPassword:     cfg.ProxyPass,\n\t\t\tTorIsolation: torIsolation,\n\t\t}\n\t\tcfg.dial = proxy.DialTimeout\n\n\t\t// Treat the proxy as tor and perform DNS resolution through it\n\t\t// unless the --noonion flag is set or there is an\n\t\t// onion-specific proxy configured.\n\t\tif !cfg.NoOnion && cfg.OnionProxy == \"\" {\n\t\t\tcfg.lookup = func(host string) ([]net.IP, error) {\n\t\t\t\treturn connmgr.TorLookupIP(host, cfg.Proxy)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Setup onion address dial function depending on the specified options.\n\t// The default is to use the same dial function selected above.  However,\n\t// when an onion-specific proxy is specified, the onion address dial\n\t// function is set to use the onion-specific proxy while leaving the\n\t// normal dial function as selected above.  This allows .onion address\n\t// traffic to be routed through a different proxy than normal traffic.\n\tif cfg.OnionProxy != \"\" {\n\t\t_, _, err := net.SplitHostPort(cfg.OnionProxy)\n\t\tif err != nil {\n\t\t\tstr := \"%s: Onion proxy address '%s' is invalid: %v\"\n\t\t\terr := fmt.Errorf(str, funcName, cfg.OnionProxy, err)\n\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\t// Tor isolation flag means onion proxy credentials will be\n\t\t// overridden.\n\t\tif cfg.TorIsolation &&\n\t\t\t(cfg.OnionProxyUser != \"\" || cfg.OnionProxyPass != \"\") {\n\t\t\tfmt.Fprintln(os.Stderr, \"Tor isolation set -- \"+\n\t\t\t\t\"overriding specified onionproxy user \"+\n\t\t\t\t\"credentials \")\n\t\t}\n\n\t\tcfg.oniondial = func(network, addr string, timeout time.Duration) (net.Conn, error) {\n\t\t\tproxy := &socks.Proxy{\n\t\t\t\tAddr:         cfg.OnionProxy,\n\t\t\t\tUsername:     cfg.OnionProxyUser,\n\t\t\t\tPassword:     cfg.OnionProxyPass,\n\t\t\t\tTorIsolation: cfg.TorIsolation,\n\t\t\t}\n\t\t\treturn proxy.DialTimeout(network, addr, timeout)\n\t\t}\n\n\t\t// When configured in bridge mode (both --onion and --proxy are\n\t\t// configured), it means that the proxy configured by --proxy is\n\t\t// not a tor proxy, so override the DNS resolution to use the\n\t\t// onion-specific proxy.\n\t\tif cfg.Proxy != \"\" {\n\t\t\tcfg.lookup = func(host string) ([]net.IP, error) {\n\t\t\t\treturn connmgr.TorLookupIP(host, cfg.OnionProxy)\n\t\t\t}\n\t\t}\n\t} else {\n\t\tcfg.oniondial = cfg.dial\n\t}\n\n\t// Specifying --noonion means the onion address dial function results in\n\t// an error.\n\tif cfg.NoOnion {\n\t\tcfg.oniondial = func(a, b string, t time.Duration) (net.Conn, error) {\n\t\t\treturn nil, errors.New(\"tor has been disabled\")\n\t\t}\n\t}\n\n\tif cfg.Prune != 0 && cfg.Prune < pruneMinSize {\n\t\terr := fmt.Errorf(\"%s: the minimum value for --prune is %d. Got %d\",\n\t\t\tfuncName, pruneMinSize, cfg.Prune)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\tif cfg.Prune != 0 && cfg.TxIndex {\n\t\terr := fmt.Errorf(\"%s: the --prune and --txindex options may \"+\n\t\t\t\"not be activated at the same time\", funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\tif cfg.Prune != 0 && cfg.AddrIndex {\n\t\terr := fmt.Errorf(\"%s: the --prune and --addrindex options may \"+\n\t\t\t\"not be activated at the same time\", funcName)\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tfmt.Fprintln(os.Stderr, usageMessage)\n\t\treturn nil, nil, err\n\t}\n\n\t// Warn about missing config file only after all other configuration is\n\t// done.  This prevents the warning on help messages and invalid\n\t// options.  Note this should go directly before the return.\n\tif configFileError != nil {\n\t\tbtcdLog.Warnf(\"%v\", configFileError)\n\t}\n\n\treturn &cfg, remainingArgs, nil\n}\n\n// createDefaultConfig copies the file sample-btcd.conf to the given destination path,\n// and populates it with some randomly generated RPC username and password.\nfunc createDefaultConfigFile(destinationPath string) error {\n\t// Create the destination directory if it does not exists\n\terr := os.MkdirAll(filepath.Dir(destinationPath), 0700)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// We assume sample config file path is same as binary\n\tpath, err := filepath.Abs(filepath.Dir(os.Args[0]))\n\tif err != nil {\n\t\treturn err\n\t}\n\tsampleConfigPath := filepath.Join(path, sampleConfigFilename)\n\n\t// We generate a random user and password\n\trandomBytes := make([]byte, 20)\n\t_, err = rand.Read(randomBytes)\n\tif err != nil {\n\t\treturn err\n\t}\n\tgeneratedRPCUser := base64.StdEncoding.EncodeToString(randomBytes)\n\n\t_, err = rand.Read(randomBytes)\n\tif err != nil {\n\t\treturn err\n\t}\n\tgeneratedRPCPass := base64.StdEncoding.EncodeToString(randomBytes)\n\n\tsrc, err := os.Open(sampleConfigPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer src.Close()\n\n\tdest, err := os.OpenFile(destinationPath,\n\t\tos.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer dest.Close()\n\n\t// We copy every line from the sample config file to the destination,\n\t// only replacing the two lines for rpcuser and rpcpass\n\treader := bufio.NewReader(src)\n\tfor err != io.EOF {\n\t\tvar line string\n\t\tline, err = reader.ReadString('\\n')\n\t\tif err != nil && err != io.EOF {\n\t\t\treturn err\n\t\t}\n\n\t\tif strings.Contains(line, \"rpcuser=\") {\n\t\t\tline = \"rpcuser=\" + generatedRPCUser + \"\\n\"\n\t\t} else if strings.Contains(line, \"rpcpass=\") {\n\t\t\tline = \"rpcpass=\" + generatedRPCPass + \"\\n\"\n\t\t}\n\n\t\tif _, err := dest.WriteString(line); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// btcdDial connects to the address on the named network using the appropriate\n// dial function depending on the address and configuration options.  For\n// example, .onion addresses will be dialed using the onion specific proxy if\n// one was specified, but will otherwise use the normal dial function (which\n// could itself use a proxy or not).\nfunc btcdDial(addr net.Addr) (net.Conn, error) {\n\tif strings.Contains(addr.String(), \".onion:\") {\n\t\treturn cfg.oniondial(addr.Network(), addr.String(),\n\t\t\tdefaultConnectTimeout)\n\t}\n\treturn cfg.dial(addr.Network(), addr.String(), defaultConnectTimeout)\n}\n\n// btcdLookup resolves the IP of the given host using the correct DNS lookup\n// function depending on the configuration options.  For example, addresses will\n// be resolved using tor when the --proxy flag was specified unless --noonion\n// was also specified in which case the normal system DNS resolver will be used.\n//\n// Any attempt to resolve a tor address (.onion) will return an error since they\n// are not intended to be resolved outside of the tor proxy.\nfunc btcdLookup(host string) ([]net.IP, error) {\n\tif strings.HasSuffix(host, \".onion\") {\n\t\treturn nil, fmt.Errorf(\"attempt to resolve tor address %s\", host)\n\t}\n\n\treturn cfg.lookup(host)\n}\n"
  },
  {
    "path": "config_test.go",
    "content": "package main\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"testing\"\n)\n\nvar (\n\trpcuserRegexp = regexp.MustCompile(\"(?m)^rpcuser=.+$\")\n\trpcpassRegexp = regexp.MustCompile(\"(?m)^rpcpass=.+$\")\n)\n\nfunc TestCreateDefaultConfigFile(t *testing.T) {\n\t// find out where the sample config lives\n\t_, path, _, ok := runtime.Caller(0)\n\tif !ok {\n\t\tt.Fatalf(\"Failed finding config file path\")\n\t}\n\tsampleConfigFile := filepath.Join(filepath.Dir(path), \"sample-btcd.conf\")\n\n\t// Setup a temporary directory\n\ttmpDir := t.TempDir()\n\ttestpath := filepath.Join(tmpDir, \"test.conf\")\n\n\t// copy config file to location of btcd binary\n\tdata, err := os.ReadFile(sampleConfigFile)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed reading sample config file: %v\", err)\n\t}\n\tappPath, err := filepath.Abs(filepath.Dir(os.Args[0]))\n\tif err != nil {\n\t\tt.Fatalf(\"Failed obtaining app path: %v\", err)\n\t}\n\ttmpConfigFile := filepath.Join(appPath, \"sample-btcd.conf\")\n\terr = os.WriteFile(tmpConfigFile, data, 0644)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed copying sample config file: %v\", err)\n\t}\n\n\terr = createDefaultConfigFile(testpath)\n\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create a default config file: %v\", err)\n\t}\n\n\tcontent, err := os.ReadFile(testpath)\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to read generated default config file: %v\", err)\n\t}\n\n\tif !rpcuserRegexp.Match(content) {\n\t\tt.Error(\"Could not find rpcuser in generated default config file.\")\n\t}\n\n\tif !rpcpassRegexp.Match(content) {\n\t\tt.Error(\"Could not find rpcpass in generated default config file.\")\n\t}\n}\n"
  },
  {
    "path": "connmgr/README.md",
    "content": "connmgr\n=======\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/connmgr)\n\nPackage connmgr implements a generic Bitcoin network connection manager.\n\n## Overview\n\nConnection Manager handles all the general connection concerns such as\nmaintaining a set number of outbound connections, sourcing peers, banning,\nlimiting max connections, tor lookup, etc.\n\nThe package provides a generic connection manager which is able to accept\nconnection requests from a source or a set of given addresses, dial them and\nnotify the caller on connections. The main intended use is to initialize a pool\nof active connections and maintain them to remain connected to the P2P network.\n\nIn addition the connection manager provides the following utilities:\n\n- Notifications on connections or disconnections\n- Handle failures and retry new addresses from the source\n- Connect only to specified addresses\n- Permanent connections with increasing backoff retry timers\n- Disconnect or Remove an established connection\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/connmgr\n```\n\n## License\n\nPackage connmgr is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "connmgr/connmanager.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage connmgr\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n)\n\n// maxFailedAttempts is the maximum number of successive failed connection\n// attempts after which network failure is assumed and new connections will\n// be delayed by the configured retry duration.\nconst maxFailedAttempts = 25\n\nvar (\n\t//ErrDialNil is used to indicate that Dial cannot be nil in the configuration.\n\tErrDialNil = errors.New(\"Config: Dial cannot be nil\")\n\n\t// maxRetryDuration is the max duration of time retrying of a persistent\n\t// connection is allowed to grow to.  This is necessary since the retry\n\t// logic uses a backoff mechanism which increases the interval base times\n\t// the number of retries that have been done.\n\tmaxRetryDuration = time.Minute * 5\n\n\t// defaultRetryDuration is the default duration of time for retrying\n\t// persistent connections.\n\tdefaultRetryDuration = time.Second * 5\n\n\t// defaultTargetOutbound is the default number of outbound connections to\n\t// maintain.\n\tdefaultTargetOutbound = uint32(8)\n)\n\n// ConnState represents the state of the requested connection.\ntype ConnState uint8\n\n// ConnState can be either pending, established, disconnected or failed.  When\n// a new connection is requested, it is attempted and categorized as\n// established or failed depending on the connection result.  An established\n// connection which was disconnected is categorized as disconnected.\nconst (\n\tConnPending ConnState = iota\n\tConnFailing\n\tConnCanceled\n\tConnEstablished\n\tConnDisconnected\n)\n\n// ConnReq is the connection request to a network address. If permanent, the\n// connection will be retried on disconnection.\ntype ConnReq struct {\n\t// The following variables must only be used atomically.\n\tid uint64\n\n\tAddr      net.Addr\n\tPermanent bool\n\n\tconn       net.Conn\n\tstate      ConnState\n\tstateMtx   sync.RWMutex\n\tretryCount uint32\n}\n\n// updateState updates the state of the connection request.\nfunc (c *ConnReq) updateState(state ConnState) {\n\tc.stateMtx.Lock()\n\tc.state = state\n\tc.stateMtx.Unlock()\n}\n\n// ID returns a unique identifier for the connection request.\nfunc (c *ConnReq) ID() uint64 {\n\treturn atomic.LoadUint64(&c.id)\n}\n\n// State is the connection state of the requested connection.\nfunc (c *ConnReq) State() ConnState {\n\tc.stateMtx.RLock()\n\tstate := c.state\n\tc.stateMtx.RUnlock()\n\treturn state\n}\n\n// String returns a human-readable string for the connection request.\nfunc (c *ConnReq) String() string {\n\tif c.Addr == nil || c.Addr.String() == \"\" {\n\t\treturn fmt.Sprintf(\"reqid %d\", atomic.LoadUint64(&c.id))\n\t}\n\treturn fmt.Sprintf(\"%s (reqid %d)\", c.Addr, atomic.LoadUint64(&c.id))\n}\n\n// Config holds the configuration options related to the connection manager.\ntype Config struct {\n\t// Listeners defines a slice of listeners for which the connection\n\t// manager will take ownership of and accept connections.  When a\n\t// connection is accepted, the OnAccept handler will be invoked with the\n\t// connection.  Since the connection manager takes ownership of these\n\t// listeners, they will be closed when the connection manager is\n\t// stopped.\n\t//\n\t// This field will not have any effect if the OnAccept field is not\n\t// also specified.  It may be nil if the caller does not wish to listen\n\t// for incoming connections.\n\tListeners []net.Listener\n\n\t// OnAccept is a callback that is fired when an inbound connection is\n\t// accepted.  It is the caller's responsibility to close the connection.\n\t// Failure to close the connection will result in the connection manager\n\t// believing the connection is still active and thus have undesirable\n\t// side effects such as still counting toward maximum connection limits.\n\t//\n\t// This field will not have any effect if the Listeners field is not\n\t// also specified since there couldn't possibly be any accepted\n\t// connections in that case.\n\tOnAccept func(net.Conn)\n\n\t// TargetOutbound is the number of outbound network connections to\n\t// maintain. Defaults to 8.\n\tTargetOutbound uint32\n\n\t// RetryDuration is the duration to wait before retrying connection\n\t// requests. Defaults to 5s.\n\tRetryDuration time.Duration\n\n\t// OnConnection is a callback that is fired when a new outbound\n\t// connection is established.\n\tOnConnection func(*ConnReq, net.Conn)\n\n\t// OnDisconnection is a callback that is fired when an outbound\n\t// connection is disconnected.\n\tOnDisconnection func(*ConnReq)\n\n\t// GetNewAddress is a way to get an address to make a network connection\n\t// to.  If nil, no new connections will be made automatically.\n\tGetNewAddress func() (net.Addr, error)\n\n\t// Dial connects to the address on the named network. It cannot be nil.\n\tDial func(net.Addr) (net.Conn, error)\n}\n\n// registerPending is used to register a pending connection attempt. By\n// registering pending connection attempts we allow callers to cancel pending\n// connection attempts before their successful or in the case they're not\n// longer wanted.\ntype registerPending struct {\n\tc    *ConnReq\n\tdone chan struct{}\n}\n\n// ConnOption is a functional option type for various connection operations.\ntype ConnOption func(*connOptions)\n\n// connOptions holds the options for a connection operation.\ntype connOptions struct {\n\ttriggerReconnect bool\n}\n\n// WithTriggerReconnect is a functional option that forces a reconnect attempt\n// after disconnection, even for non-permanent peers.\nfunc WithTriggerReconnect() ConnOption {\n\treturn func(opts *connOptions) {\n\t\topts.triggerReconnect = true\n\t}\n}\n\n// handleConnected is used to queue a successful connection.\ntype handleConnected struct {\n\tc    *ConnReq\n\tconn net.Conn\n}\n\n// handleDisconnected is used to remove a connection.\ntype handleDisconnected struct {\n\tid               uint64\n\tretry            bool\n\ttriggerReconnect bool\n}\n\n// handleFailed is used to remove a pending connection.\ntype handleFailed struct {\n\tc   *ConnReq\n\terr error\n}\n\n// ConnManager provides a manager to handle network connections.\ntype ConnManager struct {\n\t// The following variables must only be used atomically.\n\tconnReqCount uint64\n\tstart        int32\n\tstop         int32\n\n\tcfg            Config\n\twg             sync.WaitGroup\n\tfailedAttempts uint64\n\trequests       chan interface{}\n\tquit           chan struct{}\n}\n\n// handleFailedConn handles a connection failed due to a disconnect or any\n// other failure. If permanent, it retries the connection after the configured\n// retry duration. Otherwise, if required, it makes a new connection request.\n// After maxFailedConnectionAttempts new connections will be retried after the\n// configured retry duration.\nfunc (cm *ConnManager) handleFailedConn(c *ConnReq, triggerReconnect bool) {\n\tif atomic.LoadInt32(&cm.stop) != 0 {\n\t\treturn\n\t}\n\tif c.Permanent || triggerReconnect {\n\t\tc.retryCount++\n\t\td := time.Duration(c.retryCount) * cm.cfg.RetryDuration\n\t\tif d > maxRetryDuration {\n\t\t\td = maxRetryDuration\n\t\t}\n\t\tlog.Debugf(\"Retrying connection to %v in %v\", c, d)\n\t\ttime.AfterFunc(d, func() {\n\t\t\tcm.Connect(c)\n\t\t})\n\t} else if cm.cfg.GetNewAddress != nil {\n\t\tcm.failedAttempts++\n\t\tif cm.failedAttempts >= maxFailedAttempts {\n\t\t\tlog.Debugf(\"Max failed connection attempts reached: [%d] \"+\n\t\t\t\t\"-- retrying connection in: %v\", maxFailedAttempts,\n\t\t\t\tcm.cfg.RetryDuration)\n\t\t\ttheId := c.id\n\t\t\ttime.AfterFunc(cm.cfg.RetryDuration, func() {\n\t\t\t\tcm.Remove(theId)\n\t\t\t\tcm.NewConnReq()\n\t\t\t})\n\t\t} else {\n\t\t\tgo func(theId uint64) {\n\t\t\t\tcm.Remove(theId)\n\t\t\t\tcm.NewConnReq()\n\t\t\t}(c.id)\n\t\t}\n\t}\n}\n\n// connHandler handles all connection related requests.  It must be run as a\n// goroutine.\n//\n// The connection handler makes sure that we maintain a pool of active outbound\n// connections so that we remain connected to the network.  Connection requests\n// are processed and mapped by their assigned ids.\nfunc (cm *ConnManager) connHandler() {\n\n\tvar (\n\t\t// pending holds all registered conn requests that have yet to\n\t\t// succeed.\n\t\tpending = make(map[uint64]*ConnReq)\n\n\t\t// conns represents the set of all actively connected peers.\n\t\tconns = make(map[uint64]*ConnReq, cm.cfg.TargetOutbound)\n\t)\n\nout:\n\tfor {\n\t\tselect {\n\t\tcase req := <-cm.requests:\n\t\t\tswitch msg := req.(type) {\n\n\t\t\tcase registerPending:\n\t\t\t\tconnReq := msg.c\n\t\t\t\tconnReq.updateState(ConnPending)\n\t\t\t\tpending[msg.c.id] = connReq\n\t\t\t\tclose(msg.done)\n\n\t\t\tcase handleConnected:\n\t\t\t\tconnReq := msg.c\n\n\t\t\t\tif _, ok := pending[connReq.id]; !ok {\n\t\t\t\t\tif msg.conn != nil {\n\t\t\t\t\t\tmsg.conn.Close()\n\t\t\t\t\t}\n\t\t\t\t\tlog.Debugf(\"Ignoring connection for \"+\n\t\t\t\t\t\t\"canceled connreq=%v\", connReq)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconnReq.updateState(ConnEstablished)\n\t\t\t\tconnReq.conn = msg.conn\n\t\t\t\tconns[connReq.id] = connReq\n\t\t\t\tlog.Debugf(\"Connected to %v\", connReq)\n\t\t\t\tconnReq.retryCount = 0\n\t\t\t\tcm.failedAttempts = 0\n\n\t\t\t\tdelete(pending, connReq.id)\n\n\t\t\t\tif cm.cfg.OnConnection != nil {\n\t\t\t\t\tgo cm.cfg.OnConnection(connReq, msg.conn)\n\t\t\t\t}\n\n\t\t\tcase handleDisconnected:\n\t\t\t\tconnReq, ok := conns[msg.id]\n\t\t\t\tif !ok {\n\t\t\t\t\tconnReq, ok = pending[msg.id]\n\t\t\t\t\tif !ok {\n\t\t\t\t\t\tlog.Errorf(\"Unknown connid=%d\",\n\t\t\t\t\t\t\tmsg.id)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\t// Pending connection was found, remove\n\t\t\t\t\t// it from pending map if we should\n\t\t\t\t\t// ignore a later, successful\n\t\t\t\t\t// connection.\n\t\t\t\t\tconnReq.updateState(ConnCanceled)\n\t\t\t\t\tlog.Debugf(\"Canceling: %v\", connReq)\n\t\t\t\t\tdelete(pending, msg.id)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// An existing connection was located, mark as\n\t\t\t\t// disconnected and execute disconnection\n\t\t\t\t// callback.\n\t\t\t\tlog.Debugf(\"Disconnected from %v\", connReq)\n\t\t\t\tdelete(conns, msg.id)\n\n\t\t\t\tif connReq.conn != nil {\n\t\t\t\t\tconnReq.conn.Close()\n\t\t\t\t}\n\n\t\t\t\tif cm.cfg.OnDisconnection != nil {\n\t\t\t\t\tgo cm.cfg.OnDisconnection(connReq)\n\t\t\t\t}\n\n\t\t\t\t// All internal state has been cleaned up, if\n\t\t\t\t// this connection is being removed, we will\n\t\t\t\t// make no further attempts with this request.\n\t\t\t\tif !msg.retry {\n\t\t\t\t\tconnReq.updateState(ConnDisconnected)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// Otherwise, we will attempt a reconnection if\n\t\t\t\t// we do not have enough peers, or if this is a\n\t\t\t\t// persistent peer. The connection request is\n\t\t\t\t// re added to the pending map, so that\n\t\t\t\t// subsequent processing of connections and\n\t\t\t\t// failures do not ignore the request.\n\t\t\t\tif uint32(len(conns)) < cm.cfg.TargetOutbound ||\n\t\t\t\t\tconnReq.Permanent {\n\n\t\t\t\t\tconnReq.updateState(ConnPending)\n\t\t\t\t\tlog.Debugf(\"Reconnecting to %v\",\n\t\t\t\t\t\tconnReq)\n\t\t\t\t\tpending[msg.id] = connReq\n\t\t\t\t\tcm.handleFailedConn(connReq, msg.triggerReconnect)\n\t\t\t\t}\n\n\t\t\tcase handleFailed:\n\t\t\t\tconnReq := msg.c\n\n\t\t\t\tif _, ok := pending[connReq.id]; !ok {\n\t\t\t\t\tlog.Debugf(\"Ignoring connection for \"+\n\t\t\t\t\t\t\"canceled conn req: %v\", connReq)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconnReq.updateState(ConnFailing)\n\t\t\t\tlog.Debugf(\"Failed to connect to %v: %v\",\n\t\t\t\t\tconnReq, msg.err)\n\t\t\t\tcm.handleFailedConn(connReq, false)\n\t\t\t}\n\n\t\tcase <-cm.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\tcm.wg.Done()\n\tlog.Trace(\"Connection handler done\")\n}\n\n// NewConnReq creates a new connection request and connects to the\n// corresponding address.\nfunc (cm *ConnManager) NewConnReq() {\n\tif atomic.LoadInt32(&cm.stop) != 0 {\n\t\treturn\n\t}\n\tif cm.cfg.GetNewAddress == nil {\n\t\treturn\n\t}\n\n\tc := &ConnReq{}\n\tatomic.StoreUint64(&c.id, atomic.AddUint64(&cm.connReqCount, 1))\n\n\t// Submit a request of a pending connection attempt to the connection\n\t// manager. By registering the id before the connection is even\n\t// established, we'll be able to later cancel the connection via the\n\t// Remove method.\n\tdone := make(chan struct{})\n\tselect {\n\tcase cm.requests <- registerPending{c, done}:\n\tcase <-cm.quit:\n\t\treturn\n\t}\n\n\t// Wait for the registration to successfully add the pending conn req to\n\t// the conn manager's internal state.\n\tselect {\n\tcase <-done:\n\tcase <-cm.quit:\n\t\treturn\n\t}\n\n\taddr, err := cm.cfg.GetNewAddress()\n\tif err != nil {\n\t\tselect {\n\t\tcase cm.requests <- handleFailed{c, err}:\n\t\tcase <-cm.quit:\n\t\t}\n\t\treturn\n\t}\n\n\tc.Addr = addr\n\n\tcm.Connect(c)\n}\n\n// Connect assigns an id and dials a connection to the address of the\n// connection request.\nfunc (cm *ConnManager) Connect(c *ConnReq) {\n\tif atomic.LoadInt32(&cm.stop) != 0 {\n\t\treturn\n\t}\n\n\t// During the time we wait for retry there is a chance that\n\t// this connection was already cancelled\n\tif c.State() == ConnCanceled {\n\t\tlog.Debugf(\"Ignoring connect for canceled connreq=%v\", c)\n\t\treturn\n\t}\n\n\tif atomic.LoadUint64(&c.id) == 0 {\n\t\tatomic.StoreUint64(&c.id, atomic.AddUint64(&cm.connReqCount, 1))\n\n\t\t// Submit a request of a pending connection attempt to the\n\t\t// connection manager. By registering the id before the\n\t\t// connection is even established, we'll be able to later\n\t\t// cancel the connection via the Remove method.\n\t\tdone := make(chan struct{})\n\t\tselect {\n\t\tcase cm.requests <- registerPending{c, done}:\n\t\tcase <-cm.quit:\n\t\t\treturn\n\t\t}\n\n\t\t// Wait for the registration to successfully add the pending\n\t\t// conn req to the conn manager's internal state.\n\t\tselect {\n\t\tcase <-done:\n\t\tcase <-cm.quit:\n\t\t\treturn\n\t\t}\n\t}\n\n\tlog.Debugf(\"Attempting to connect to %v\", c)\n\n\tconn, err := cm.cfg.Dial(c.Addr)\n\tif err != nil {\n\t\tselect {\n\t\tcase cm.requests <- handleFailed{c, err}:\n\t\tcase <-cm.quit:\n\t\t}\n\t\treturn\n\t}\n\n\tselect {\n\tcase cm.requests <- handleConnected{c, conn}:\n\tcase <-cm.quit:\n\t}\n}\n\n// Disconnect disconnects the connection corresponding to the given connection\n// id. If permanent, the connection will be retried with an increasing backoff\n// duration. Functional options can be used to modify behavior, such as forcing\n// a reconnect attempt via WithTriggerReconnect.\nfunc (cm *ConnManager) Disconnect(id uint64, options ...ConnOption) {\n\tif atomic.LoadInt32(&cm.stop) != 0 {\n\t\treturn\n\t}\n\topts := connOptions{}\n\tfor _, option := range options {\n\t\toption(&opts)\n\t}\n\n\tselect {\n\tcase cm.requests <- handleDisconnected{\n\t\tid: id, retry: true, triggerReconnect: opts.triggerReconnect,\n\t}:\n\tcase <-cm.quit:\n\t}\n}\n\n// Remove removes the connection corresponding to the given connection id from\n// known connections.\n//\n// NOTE: This method can also be used to cancel a lingering connection attempt\n// that hasn't yet succeeded.\nfunc (cm *ConnManager) Remove(id uint64) {\n\tif atomic.LoadInt32(&cm.stop) != 0 {\n\t\treturn\n\t}\n\n\tselect {\n\tcase cm.requests <- handleDisconnected{id: id, retry: false}:\n\tcase <-cm.quit:\n\t}\n}\n\n// listenHandler accepts incoming connections on a given listener.  It must be\n// run as a goroutine.\nfunc (cm *ConnManager) listenHandler(listener net.Listener) {\n\tlog.Infof(\"Server listening on %s\", listener.Addr())\n\tfor atomic.LoadInt32(&cm.stop) == 0 {\n\t\tconn, err := listener.Accept()\n\t\tif err != nil {\n\t\t\t// Only log the error if not forcibly shutting down.\n\t\t\tif atomic.LoadInt32(&cm.stop) == 0 {\n\t\t\t\tlog.Errorf(\"Can't accept connection: %v\", err)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tgo cm.cfg.OnAccept(conn)\n\t}\n\n\tcm.wg.Done()\n\tlog.Tracef(\"Listener handler done for %s\", listener.Addr())\n}\n\n// Start launches the connection manager and begins connecting to the network.\nfunc (cm *ConnManager) Start() {\n\t// Already started?\n\tif atomic.AddInt32(&cm.start, 1) != 1 {\n\t\treturn\n\t}\n\n\tlog.Trace(\"Connection manager started\")\n\tcm.wg.Add(1)\n\tgo cm.connHandler()\n\n\t// Start all the listeners so long as the caller requested them and\n\t// provided a callback to be invoked when connections are accepted.\n\tif cm.cfg.OnAccept != nil {\n\t\tfor _, listener := range cm.cfg.Listeners {\n\t\t\tcm.wg.Add(1)\n\t\t\tgo cm.listenHandler(listener)\n\t\t}\n\t}\n\n\tfor i := atomic.LoadUint64(&cm.connReqCount); i < uint64(cm.cfg.TargetOutbound); i++ {\n\t\tgo cm.NewConnReq()\n\t}\n}\n\n// Wait blocks until the connection manager halts gracefully.\nfunc (cm *ConnManager) Wait() {\n\tcm.wg.Wait()\n}\n\n// Stop gracefully shuts down the connection manager.\nfunc (cm *ConnManager) Stop() {\n\tif atomic.AddInt32(&cm.stop, 1) != 1 {\n\t\tlog.Warnf(\"Connection manager already stopped\")\n\t\treturn\n\t}\n\n\t// Stop all the listeners.  There will not be any listeners if\n\t// listening is disabled.\n\tfor _, listener := range cm.cfg.Listeners {\n\t\t// Ignore the error since this is shutdown and there is no way\n\t\t// to recover anyways.\n\t\t_ = listener.Close()\n\t}\n\n\tclose(cm.quit)\n\tlog.Trace(\"Connection manager stopped\")\n}\n\n// New returns a new connection manager.\n// Use Start to start connecting to the network.\nfunc New(cfg *Config) (*ConnManager, error) {\n\tif cfg.Dial == nil {\n\t\treturn nil, ErrDialNil\n\t}\n\t// Default to sane values\n\tif cfg.RetryDuration <= 0 {\n\t\tcfg.RetryDuration = defaultRetryDuration\n\t}\n\tif cfg.TargetOutbound == 0 {\n\t\tcfg.TargetOutbound = defaultTargetOutbound\n\t}\n\tcm := ConnManager{\n\t\tcfg:      *cfg, // Copy so caller can't mutate\n\t\trequests: make(chan interface{}),\n\t\tquit:     make(chan struct{}),\n\t}\n\treturn &cm, nil\n}\n"
  },
  {
    "path": "connmgr/connmanager_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage connmgr\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"sync/atomic\"\n\t\"testing\"\n\t\"time\"\n)\n\nfunc init() {\n\t// Override the max retry duration when running tests.\n\tmaxRetryDuration = 2 * time.Millisecond\n}\n\n// mockAddr mocks a network address\ntype mockAddr struct {\n\tnet, address string\n}\n\nfunc (m mockAddr) Network() string { return m.net }\nfunc (m mockAddr) String() string  { return m.address }\n\n// mockConn mocks a network connection by implementing the net.Conn interface.\ntype mockConn struct {\n\tio.Reader\n\tio.Writer\n\tio.Closer\n\n\t// local network, address for the connection.\n\tlnet, laddr string\n\n\t// remote network, address for the connection.\n\trAddr net.Addr\n}\n\n// LocalAddr returns the local address for the connection.\nfunc (c mockConn) LocalAddr() net.Addr {\n\treturn &mockAddr{c.lnet, c.laddr}\n}\n\n// RemoteAddr returns the remote address for the connection.\nfunc (c mockConn) RemoteAddr() net.Addr {\n\treturn &mockAddr{c.rAddr.Network(), c.rAddr.String()}\n}\n\n// Close handles closing the connection.\nfunc (c mockConn) Close() error {\n\treturn nil\n}\n\nfunc (c mockConn) SetDeadline(t time.Time) error      { return nil }\nfunc (c mockConn) SetReadDeadline(t time.Time) error  { return nil }\nfunc (c mockConn) SetWriteDeadline(t time.Time) error { return nil }\n\n// mockDialer mocks the net.Dial interface by returning a mock connection to\n// the given address.\nfunc mockDialer(addr net.Addr) (net.Conn, error) {\n\tr, w := io.Pipe()\n\tc := &mockConn{rAddr: addr}\n\tc.Reader = r\n\tc.Writer = w\n\treturn c, nil\n}\n\n// TestNewConfig tests that new ConnManager config is validated as expected.\nfunc TestNewConfig(t *testing.T) {\n\t_, err := New(&Config{})\n\tif err == nil {\n\t\tt.Fatalf(\"New expected error: 'Dial can't be nil', got nil\")\n\t}\n\t_, err = New(&Config{\n\t\tDial: mockDialer,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New unexpected error: %v\", err)\n\t}\n}\n\n// TestStartStop tests that the connection manager starts and stops as\n// expected.\nfunc TestStartStop(t *testing.T) {\n\tconnected := make(chan *ConnReq)\n\tdisconnected := make(chan *ConnReq)\n\tcmgr, err := New(&Config{\n\t\tTargetOutbound: 1,\n\t\tGetNewAddress: func() (net.Addr, error) {\n\t\t\treturn &net.TCPAddr{\n\t\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\t\tPort: 18555,\n\t\t\t}, nil\n\t\t},\n\t\tDial: mockDialer,\n\t\tOnConnection: func(c *ConnReq, conn net.Conn) {\n\t\t\tconnected <- c\n\t\t},\n\t\tOnDisconnection: func(c *ConnReq) {\n\t\t\tdisconnected <- c\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New error: %v\", err)\n\t}\n\tcmgr.Start()\n\tgotConnReq := <-connected\n\tcmgr.Stop()\n\t// already stopped\n\tcmgr.Stop()\n\t// ignored\n\tcr := &ConnReq{\n\t\tAddr: &net.TCPAddr{\n\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\tPort: 18555,\n\t\t},\n\t\tPermanent: true,\n\t}\n\tcmgr.Connect(cr)\n\tif cr.ID() != 0 {\n\t\tt.Fatalf(\"start/stop: got id: %v, want: 0\", cr.ID())\n\t}\n\tcmgr.Disconnect(gotConnReq.ID())\n\tcmgr.Remove(gotConnReq.ID())\n\tselect {\n\tcase <-disconnected:\n\t\tt.Fatalf(\"start/stop: unexpected disconnection\")\n\tcase <-time.Tick(10 * time.Millisecond):\n\t\tbreak\n\t}\n}\n\n// TestConnectMode tests that the connection manager works in the connect mode.\n//\n// In connect mode, automatic connections are disabled, so we test that\n// requests using Connect are handled and that no other connections are made.\nfunc TestConnectMode(t *testing.T) {\n\tconnected := make(chan *ConnReq)\n\tcmgr, err := New(&Config{\n\t\tTargetOutbound: 2,\n\t\tDial:           mockDialer,\n\t\tOnConnection: func(c *ConnReq, conn net.Conn) {\n\t\t\tconnected <- c\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New error: %v\", err)\n\t}\n\tcr := &ConnReq{\n\t\tAddr: &net.TCPAddr{\n\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\tPort: 18555,\n\t\t},\n\t\tPermanent: true,\n\t}\n\tcmgr.Start()\n\tcmgr.Connect(cr)\n\tgotConnReq := <-connected\n\twantID := cr.ID()\n\tgotID := gotConnReq.ID()\n\tif gotID != wantID {\n\t\tt.Fatalf(\"connect mode: %v - want ID %v, got ID %v\", cr.Addr, wantID, gotID)\n\t}\n\tgotState := cr.State()\n\twantState := ConnEstablished\n\tif gotState != wantState {\n\t\tt.Fatalf(\"connect mode: %v - want state %v, got state %v\", cr.Addr, wantState, gotState)\n\t}\n\tselect {\n\tcase c := <-connected:\n\t\tt.Fatalf(\"connect mode: got unexpected connection - %v\", c.Addr)\n\tcase <-time.After(time.Millisecond):\n\t\tbreak\n\t}\n\tcmgr.Stop()\n}\n\n// TestTargetOutbound tests the target number of outbound connections.\n//\n// We wait until all connections are established, then test they there are the\n// only connections made.\nfunc TestTargetOutbound(t *testing.T) {\n\ttargetOutbound := uint32(10)\n\tconnected := make(chan *ConnReq)\n\tcmgr, err := New(&Config{\n\t\tTargetOutbound: targetOutbound,\n\t\tDial:           mockDialer,\n\t\tGetNewAddress: func() (net.Addr, error) {\n\t\t\treturn &net.TCPAddr{\n\t\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\t\tPort: 18555,\n\t\t\t}, nil\n\t\t},\n\t\tOnConnection: func(c *ConnReq, conn net.Conn) {\n\t\t\tconnected <- c\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New error: %v\", err)\n\t}\n\tcmgr.Start()\n\tfor i := uint32(0); i < targetOutbound; i++ {\n\t\t<-connected\n\t}\n\n\tselect {\n\tcase c := <-connected:\n\t\tt.Fatalf(\"target outbound: got unexpected connection - %v\", c.Addr)\n\tcase <-time.After(time.Millisecond):\n\t\tbreak\n\t}\n\tcmgr.Stop()\n}\n\n// TestRetryPermanent tests that permanent connection requests are retried.\n//\n// We make a permanent connection request using Connect, disconnect it using\n// Disconnect and we wait for it to be connected back.\nfunc TestRetryPermanent(t *testing.T) {\n\tconnected := make(chan *ConnReq)\n\tdisconnected := make(chan *ConnReq)\n\tcmgr, err := New(&Config{\n\t\tRetryDuration:  time.Millisecond,\n\t\tTargetOutbound: 1,\n\t\tDial:           mockDialer,\n\t\tOnConnection: func(c *ConnReq, conn net.Conn) {\n\t\t\tconnected <- c\n\t\t},\n\t\tOnDisconnection: func(c *ConnReq) {\n\t\t\tdisconnected <- c\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New error: %v\", err)\n\t}\n\n\tcr := &ConnReq{\n\t\tAddr: &net.TCPAddr{\n\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\tPort: 18555,\n\t\t},\n\t\tPermanent: true,\n\t}\n\tgo cmgr.Connect(cr)\n\tcmgr.Start()\n\tgotConnReq := <-connected\n\twantID := cr.ID()\n\tgotID := gotConnReq.ID()\n\tif gotID != wantID {\n\t\tt.Fatalf(\"retry: %v - want ID %v, got ID %v\", cr.Addr, wantID, gotID)\n\t}\n\tgotState := cr.State()\n\twantState := ConnEstablished\n\tif gotState != wantState {\n\t\tt.Fatalf(\"retry: %v - want state %v, got state %v\", cr.Addr, wantState, gotState)\n\t}\n\n\tcmgr.Disconnect(cr.ID())\n\tgotConnReq = <-disconnected\n\twantID = cr.ID()\n\tgotID = gotConnReq.ID()\n\tif gotID != wantID {\n\t\tt.Fatalf(\"retry: %v - want ID %v, got ID %v\", cr.Addr, wantID, gotID)\n\t}\n\tgotState = cr.State()\n\twantState = ConnPending\n\tif gotState != wantState {\n\t\tt.Fatalf(\"retry: %v - want state %v, got state %v\", cr.Addr, wantState, gotState)\n\t}\n\n\tgotConnReq = <-connected\n\twantID = cr.ID()\n\tgotID = gotConnReq.ID()\n\tif gotID != wantID {\n\t\tt.Fatalf(\"retry: %v - want ID %v, got ID %v\", cr.Addr, wantID, gotID)\n\t}\n\tgotState = cr.State()\n\twantState = ConnEstablished\n\tif gotState != wantState {\n\t\tt.Fatalf(\"retry: %v - want state %v, got state %v\", cr.Addr, wantState, gotState)\n\t}\n\n\tcmgr.Remove(cr.ID())\n\tgotConnReq = <-disconnected\n\twantID = cr.ID()\n\tgotID = gotConnReq.ID()\n\tif gotID != wantID {\n\t\tt.Fatalf(\"retry: %v - want ID %v, got ID %v\", cr.Addr, wantID, gotID)\n\t}\n\tgotState = cr.State()\n\twantState = ConnDisconnected\n\tif gotState != wantState {\n\t\tt.Fatalf(\"retry: %v - want state %v, got state %v\", cr.Addr, wantState, gotState)\n\t}\n\tcmgr.Stop()\n}\n\n// TestMaxRetryDuration tests the maximum retry duration.\n//\n// We have a timed dialer which initially returns err but after RetryDuration\n// hits maxRetryDuration returns a mock conn.\nfunc TestMaxRetryDuration(t *testing.T) {\n\tnetworkUp := make(chan struct{})\n\ttime.AfterFunc(5*time.Millisecond, func() {\n\t\tclose(networkUp)\n\t})\n\ttimedDialer := func(addr net.Addr) (net.Conn, error) {\n\t\tselect {\n\t\tcase <-networkUp:\n\t\t\treturn mockDialer(addr)\n\t\tdefault:\n\t\t\treturn nil, errors.New(\"network down\")\n\t\t}\n\t}\n\n\tconnected := make(chan *ConnReq)\n\tcmgr, err := New(&Config{\n\t\tRetryDuration:  time.Millisecond,\n\t\tTargetOutbound: 1,\n\t\tDial:           timedDialer,\n\t\tOnConnection: func(c *ConnReq, conn net.Conn) {\n\t\t\tconnected <- c\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New error: %v\", err)\n\t}\n\n\tcr := &ConnReq{\n\t\tAddr: &net.TCPAddr{\n\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\tPort: 18555,\n\t\t},\n\t\tPermanent: true,\n\t}\n\tgo cmgr.Connect(cr)\n\tcmgr.Start()\n\t// retry in 1ms\n\t// retry in 2ms - max retry duration reached\n\t// retry in 2ms - timedDialer returns mockDial\n\tselect {\n\tcase <-connected:\n\tcase <-time.Tick(100 * time.Millisecond):\n\t\tt.Fatalf(\"max retry duration: connection timeout\")\n\t}\n}\n\n// TestNetworkFailure tests that the connection manager handles a network\n// failure gracefully.\nfunc TestNetworkFailure(t *testing.T) {\n\tvar dials uint32\n\terrDialer := func(net net.Addr) (net.Conn, error) {\n\t\tatomic.AddUint32(&dials, 1)\n\t\treturn nil, errors.New(\"network down\")\n\t}\n\tcmgr, err := New(&Config{\n\t\tTargetOutbound: 5,\n\t\tRetryDuration:  5 * time.Millisecond,\n\t\tDial:           errDialer,\n\t\tGetNewAddress: func() (net.Addr, error) {\n\t\t\treturn &net.TCPAddr{\n\t\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\t\tPort: 18555,\n\t\t\t}, nil\n\t\t},\n\t\tOnConnection: func(c *ConnReq, conn net.Conn) {\n\t\t\tt.Fatalf(\"network failure: got unexpected connection - %v\", c.Addr)\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New error: %v\", err)\n\t}\n\tcmgr.Start()\n\ttime.AfterFunc(10*time.Millisecond, cmgr.Stop)\n\tcmgr.Wait()\n\twantMaxDials := uint32(75)\n\tif atomic.LoadUint32(&dials) > wantMaxDials {\n\t\tt.Fatalf(\"network failure: unexpected number of dials - got %v, want < %v\",\n\t\t\tatomic.LoadUint32(&dials), wantMaxDials)\n\t}\n}\n\n// TestStopFailed tests that failed connections are ignored after connmgr is\n// stopped.\n//\n// We have a dailer which sets the stop flag on the conn manager and returns an\n// err so that the handler assumes that the conn manager is stopped and ignores\n// the failure.\nfunc TestStopFailed(t *testing.T) {\n\tdone := make(chan struct{}, 1)\n\twaitDialer := func(addr net.Addr) (net.Conn, error) {\n\t\tdone <- struct{}{}\n\t\ttime.Sleep(time.Millisecond)\n\t\treturn nil, errors.New(\"network down\")\n\t}\n\tcmgr, err := New(&Config{\n\t\tDial: waitDialer,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New error: %v\", err)\n\t}\n\tcmgr.Start()\n\tgo func() {\n\t\t<-done\n\t\tatomic.StoreInt32(&cmgr.stop, 1)\n\t\ttime.Sleep(2 * time.Millisecond)\n\t\tatomic.StoreInt32(&cmgr.stop, 0)\n\t\tcmgr.Stop()\n\t}()\n\tcr := &ConnReq{\n\t\tAddr: &net.TCPAddr{\n\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\tPort: 18555,\n\t\t},\n\t\tPermanent: true,\n\t}\n\tgo cmgr.Connect(cr)\n\tcmgr.Wait()\n}\n\n// TestRemovePendingConnection tests that it's possible to cancel a pending\n// connection, removing its internal state from the ConnMgr.\nfunc TestRemovePendingConnection(t *testing.T) {\n\t// Create a ConnMgr instance with an instance of a dialer that'll never\n\t// succeed.\n\twait := make(chan struct{})\n\tindefiniteDialer := func(addr net.Addr) (net.Conn, error) {\n\t\t<-wait\n\t\treturn nil, fmt.Errorf(\"error\")\n\t}\n\tcmgr, err := New(&Config{\n\t\tDial: indefiniteDialer,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New error: %v\", err)\n\t}\n\tcmgr.Start()\n\n\t// Establish a connection request to a random IP we've chosen.\n\tcr := &ConnReq{\n\t\tAddr: &net.TCPAddr{\n\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\tPort: 18555,\n\t\t},\n\t\tPermanent: true,\n\t}\n\tgo cmgr.Connect(cr)\n\n\ttime.Sleep(10 * time.Millisecond)\n\n\tif cr.State() != ConnPending {\n\t\tt.Fatalf(\"pending request hasn't been registered, status: %v\",\n\t\t\tcr.State())\n\t}\n\n\t// The request launched above will actually never be able to establish\n\t// a connection. So we'll cancel it _before_ it's able to be completed.\n\tcmgr.Remove(cr.ID())\n\n\ttime.Sleep(10 * time.Millisecond)\n\n\t// Now examine the status of the connection request, it should read a\n\t// status of ConnCanceled.\n\tif cr.State() != ConnCanceled {\n\t\tt.Fatalf(\"request wasn't canceled, status is: %v\", cr.State())\n\t}\n\n\tclose(wait)\n\tcmgr.Stop()\n}\n\n// TestCancelIgnoreDelayedConnection tests that a canceled connection request will\n// not execute the on connection callback, even if an outstanding retry\n// succeeds.\nfunc TestCancelIgnoreDelayedConnection(t *testing.T) {\n\tretryTimeout := 10 * time.Millisecond\n\n\t// Setup a dialer that will continue to return an error until the\n\t// connect chan is signaled, the dial attempt immediately after will\n\t// succeed in returning a connection.\n\tconnect := make(chan struct{})\n\tfailingDialer := func(addr net.Addr) (net.Conn, error) {\n\t\tselect {\n\t\tcase <-connect:\n\t\t\treturn mockDialer(addr)\n\t\tdefault:\n\t\t}\n\n\t\treturn nil, fmt.Errorf(\"error\")\n\t}\n\n\tconnected := make(chan *ConnReq)\n\tcmgr, err := New(&Config{\n\t\tDial:          failingDialer,\n\t\tRetryDuration: retryTimeout,\n\t\tOnConnection: func(c *ConnReq, conn net.Conn) {\n\t\t\tconnected <- c\n\t\t},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New error: %v\", err)\n\t}\n\tcmgr.Start()\n\tdefer cmgr.Stop()\n\n\t// Establish a connection request to a random IP we've chosen.\n\tcr := &ConnReq{\n\t\tAddr: &net.TCPAddr{\n\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\tPort: 18555,\n\t\t},\n\t}\n\tcmgr.Connect(cr)\n\n\t// Allow for the first retry timeout to elapse.\n\ttime.Sleep(2 * retryTimeout)\n\n\t// Connection be marked as failed, even after reattempting to\n\t// connect.\n\tif cr.State() != ConnFailing {\n\t\tt.Fatalf(\"failing request should have status failed, status: %v\",\n\t\t\tcr.State())\n\t}\n\n\t// Remove the connection, and then immediately allow the next connection\n\t// to succeed.\n\tcmgr.Remove(cr.ID())\n\tclose(connect)\n\n\t// Allow the connection manager to process the removal.\n\ttime.Sleep(5 * time.Millisecond)\n\n\t// Now examine the status of the connection request, it should read a\n\t// status of canceled.\n\tif cr.State() != ConnCanceled {\n\t\tt.Fatalf(\"request wasn't canceled, status is: %v\", cr.State())\n\t}\n\n\t// Finally, the connection manager should not signal the on-connection\n\t// callback, since we explicitly canceled this request. We give a\n\t// generous window to ensure the connection manager's lienar backoff is\n\t// allowed to properly elapse.\n\tselect {\n\tcase <-connected:\n\t\tt.Fatalf(\"on-connect should not be called for canceled req\")\n\tcase <-time.After(5 * retryTimeout):\n\t}\n\n}\n\n// mockListener implements the net.Listener interface and is used to test\n// code that deals with net.Listeners without having to actually make any real\n// connections.\ntype mockListener struct {\n\tlocalAddr   string\n\tprovideConn chan net.Conn\n}\n\n// Accept returns a mock connection when it receives a signal via the Connect\n// function.\n//\n// This is part of the net.Listener interface.\nfunc (m *mockListener) Accept() (net.Conn, error) {\n\tfor conn := range m.provideConn {\n\t\treturn conn, nil\n\t}\n\treturn nil, errors.New(\"network connection closed\")\n}\n\n// Close closes the mock listener which will cause any blocked Accept\n// operations to be unblocked and return errors.\n//\n// This is part of the net.Listener interface.\nfunc (m *mockListener) Close() error {\n\tclose(m.provideConn)\n\treturn nil\n}\n\n// Addr returns the address the mock listener was configured with.\n//\n// This is part of the net.Listener interface.\nfunc (m *mockListener) Addr() net.Addr {\n\treturn &mockAddr{\"tcp\", m.localAddr}\n}\n\n// Connect fakes a connection to the mock listener from the provided remote\n// address.  It will cause the Accept function to return a mock connection\n// configured with the provided remote address and the local address for the\n// mock listener.\nfunc (m *mockListener) Connect(ip string, port int) {\n\tm.provideConn <- &mockConn{\n\t\tladdr: m.localAddr,\n\t\tlnet:  \"tcp\",\n\t\trAddr: &net.TCPAddr{\n\t\t\tIP:   net.ParseIP(ip),\n\t\t\tPort: port,\n\t\t},\n\t}\n}\n\n// newMockListener returns a new mock listener for the provided local address\n// and port.  No ports are actually opened.\nfunc newMockListener(localAddr string) *mockListener {\n\treturn &mockListener{\n\t\tlocalAddr:   localAddr,\n\t\tprovideConn: make(chan net.Conn),\n\t}\n}\n\n// TestListeners ensures providing listeners to the connection manager along\n// with an accept callback works properly.\nfunc TestListeners(t *testing.T) {\n\t// Setup a connection manager with a couple of mock listeners that\n\t// notify a channel when they receive mock connections.\n\treceivedConns := make(chan net.Conn)\n\tlistener1 := newMockListener(\"127.0.0.1:8333\")\n\tlistener2 := newMockListener(\"127.0.0.1:9333\")\n\tlisteners := []net.Listener{listener1, listener2}\n\tcmgr, err := New(&Config{\n\t\tListeners: listeners,\n\t\tOnAccept: func(conn net.Conn) {\n\t\t\treceivedConns <- conn\n\t\t},\n\t\tDial: mockDialer,\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"New error: %v\", err)\n\t}\n\tcmgr.Start()\n\n\t// Fake a couple of mock connections to each of the listeners.\n\tgo func() {\n\t\tfor i, listener := range listeners {\n\t\t\tl := listener.(*mockListener)\n\t\t\tl.Connect(\"127.0.0.1\", 10000+i*2)\n\t\t\tl.Connect(\"127.0.0.1\", 10000+i*2+1)\n\t\t}\n\t}()\n\n\t// Tally the receive connections to ensure the expected number are\n\t// received.  Also, fail the test after a timeout so it will not hang\n\t// forever should the test not work.\n\texpectedNumConns := len(listeners) * 2\n\tvar numConns int\nout:\n\tfor {\n\t\tselect {\n\t\tcase <-receivedConns:\n\t\t\tnumConns++\n\t\t\tif numConns == expectedNumConns {\n\t\t\t\tbreak out\n\t\t\t}\n\n\t\tcase <-time.After(time.Millisecond * 50):\n\t\t\tt.Fatalf(\"Timeout waiting for %d expected connections\",\n\t\t\t\texpectedNumConns)\n\t\t}\n\t}\n\n\tcmgr.Stop()\n\tcmgr.Wait()\n}\n"
  },
  {
    "path": "connmgr/doc.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage connmgr implements a generic Bitcoin network connection manager.\n\n# Connection Manager Overview\n\nConnection Manager handles all the general connection concerns such as\nmaintaining a set number of outbound connections, sourcing peers, banning,\nlimiting max connections, tor lookup, etc.\n*/\npackage connmgr\n"
  },
  {
    "path": "connmgr/dynamicbanscore.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage connmgr\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"sync\"\n\t\"time\"\n)\n\nconst (\n\t// Halflife defines the time (in seconds) by which the transient part\n\t// of the ban score decays to one half of it's original value.\n\tHalflife = 60\n\n\t// lambda is the decaying constant.\n\tlambda = math.Ln2 / Halflife\n\n\t// Lifetime defines the maximum age of the transient part of the ban\n\t// score to be considered a non-zero score (in seconds).\n\tLifetime = 1800\n\n\t// precomputedLen defines the amount of decay factors (one per second) that\n\t// should be precomputed at initialization.\n\tprecomputedLen = 64\n)\n\n// precomputedFactor stores precomputed exponential decay factors for the first\n// 'precomputedLen' seconds starting from t == 0.\nvar precomputedFactor [precomputedLen]float64\n\n// init precomputes decay factors.\nfunc init() {\n\tfor i := range precomputedFactor {\n\t\tprecomputedFactor[i] = math.Exp(-1.0 * float64(i) * lambda)\n\t}\n}\n\n// decayFactor returns the decay factor at t seconds, using precalculated values\n// if available, or calculating the factor if needed.\nfunc decayFactor(t int64) float64 {\n\tif t < precomputedLen {\n\t\treturn precomputedFactor[t]\n\t}\n\treturn math.Exp(-1.0 * float64(t) * lambda)\n}\n\n// DynamicBanScore provides dynamic ban scores consisting of a persistent and a\n// decaying component. The persistent score could be utilized to create simple\n// additive banning policies similar to those found in other bitcoin node\n// implementations.\n//\n// The decaying score enables the creation of evasive logic which handles\n// misbehaving peers (especially application layer DoS attacks) gracefully\n// by disconnecting and banning peers attempting various kinds of flooding.\n// DynamicBanScore allows these two approaches to be used in tandem.\n//\n// Zero value: Values of type DynamicBanScore are immediately ready for use upon\n// declaration.\ntype DynamicBanScore struct {\n\tlastUnix   int64\n\ttransient  float64\n\tpersistent uint32\n\tmtx        sync.Mutex\n}\n\n// String returns the ban score as a human-readable string.\nfunc (s *DynamicBanScore) String() string {\n\ts.mtx.Lock()\n\tr := fmt.Sprintf(\"persistent %v + transient %v at %v = %v as of now\",\n\t\ts.persistent, s.transient, s.lastUnix, s.int(time.Now()))\n\ts.mtx.Unlock()\n\treturn r\n}\n\n// Int returns the current ban score, the sum of the persistent and decaying\n// scores.\n//\n// This function is safe for concurrent access.\nfunc (s *DynamicBanScore) Int() uint32 {\n\ts.mtx.Lock()\n\tr := s.int(time.Now())\n\ts.mtx.Unlock()\n\treturn r\n}\n\n// Increase increases both the persistent and decaying scores by the values\n// passed as parameters. The resulting score is returned.\n//\n// This function is safe for concurrent access.\nfunc (s *DynamicBanScore) Increase(persistent, transient uint32) uint32 {\n\ts.mtx.Lock()\n\tr := s.increase(persistent, transient, time.Now())\n\ts.mtx.Unlock()\n\treturn r\n}\n\n// Reset set both persistent and decaying scores to zero.\n//\n// This function is safe for concurrent access.\nfunc (s *DynamicBanScore) Reset() {\n\ts.mtx.Lock()\n\ts.persistent = 0\n\ts.transient = 0\n\ts.lastUnix = 0\n\ts.mtx.Unlock()\n}\n\n// int returns the ban score, the sum of the persistent and decaying scores at a\n// given point in time.\n//\n// This function is not safe for concurrent access. It is intended to be used\n// internally and during testing.\nfunc (s *DynamicBanScore) int(t time.Time) uint32 {\n\tdt := t.Unix() - s.lastUnix\n\tif s.transient < 1 || dt < 0 || Lifetime < dt {\n\t\treturn s.persistent\n\t}\n\treturn s.persistent + uint32(s.transient*decayFactor(dt))\n}\n\n// increase increases the persistent, the decaying or both scores by the values\n// passed as parameters. The resulting score is calculated as if the action was\n// carried out at the point time represented by the third parameter. The\n// resulting score is returned.\n//\n// This function is not safe for concurrent access.\nfunc (s *DynamicBanScore) increase(persistent, transient uint32, t time.Time) uint32 {\n\ts.persistent += persistent\n\ttu := t.Unix()\n\tdt := tu - s.lastUnix\n\n\tif transient > 0 {\n\t\tif Lifetime < dt {\n\t\t\ts.transient = 0\n\t\t} else if s.transient > 1 && dt > 0 {\n\t\t\ts.transient *= decayFactor(dt)\n\t\t}\n\t\ts.transient += float64(transient)\n\t\ts.lastUnix = tu\n\t}\n\treturn s.persistent + uint32(s.transient)\n}\n"
  },
  {
    "path": "connmgr/dynamicbanscore_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage connmgr\n\nimport (\n\t\"math\"\n\t\"testing\"\n\t\"time\"\n)\n\n// TestDynamicBanScoreDecay tests the exponential decay implemented in\n// DynamicBanScore.\nfunc TestDynamicBanScoreDecay(t *testing.T) {\n\tvar bs DynamicBanScore\n\tbase := time.Now()\n\n\tr := bs.increase(100, 50, base)\n\tif r != 150 {\n\t\tt.Errorf(\"Unexpected result %d after ban score increase.\", r)\n\t}\n\n\tr = bs.int(base.Add(time.Minute))\n\tif r != 125 {\n\t\tt.Errorf(\"Halflife check failed - %d instead of 125\", r)\n\t}\n\n\tr = bs.int(base.Add(7 * time.Minute))\n\tif r != 100 {\n\t\tt.Errorf(\"Decay after 7m - %d instead of 100\", r)\n\t}\n}\n\n// TestDynamicBanScoreLifetime tests that DynamicBanScore properly yields zero\n// once the maximum age is reached.\nfunc TestDynamicBanScoreLifetime(t *testing.T) {\n\tvar bs DynamicBanScore\n\tbase := time.Now()\n\n\tr := bs.increase(0, math.MaxUint32, base)\n\tr = bs.int(base.Add(Lifetime * time.Second))\n\tif r != 3 { // 3, not 4 due to precision loss and truncating 3.999...\n\t\tt.Errorf(\"Pre max age check with MaxUint32 failed - %d\", r)\n\t}\n\tr = bs.int(base.Add((Lifetime + 1) * time.Second))\n\tif r != 0 {\n\t\tt.Errorf(\"Zero after max age check failed - %d instead of 0\", r)\n\t}\n}\n\n// TestDynamicBanScore tests exported functions of DynamicBanScore. Exponential\n// decay or other time based behavior is tested by other functions.\nfunc TestDynamicBanScoreReset(t *testing.T) {\n\tvar bs DynamicBanScore\n\tif bs.Int() != 0 {\n\t\tt.Errorf(\"Initial state is not zero.\")\n\t}\n\tbs.Increase(100, 0)\n\tr := bs.Int()\n\tif r != 100 {\n\t\tt.Errorf(\"Unexpected result %d after ban score increase.\", r)\n\t}\n\tbs.Reset()\n\tif bs.Int() != 0 {\n\t\tt.Errorf(\"Failed to reset ban score.\")\n\t}\n}\n\n// TestDynamicBanScoreString\nfunc TestDynamicBanScoreString(t *testing.T) {\n\tvar bs DynamicBanScore\n\tbase := time.Now()\n\n\tr := bs.increase(100, 50, base)\n\tif r != 150 {\n\t\tt.Errorf(\"Unexpected result %d after ban score increase.\", r)\n\t}\n\tt.Log(bs.String())\n}\n"
  },
  {
    "path": "connmgr/log.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage connmgr\n\nimport \"github.com/btcsuite/btclog\"\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until either UseLogger or SetLogWriter are called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\n// This should be used in preference to SetLogWriter if the caller is also\n// using btclog.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n"
  },
  {
    "path": "connmgr/seed.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage connmgr\n\nimport (\n\t\"fmt\"\n\tmrand \"math/rand\"\n\t\"net\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// These constants are used by the DNS seed code to pick a random last\n\t// seen time.\n\tsecondsIn3Days int32 = 24 * 60 * 60 * 3\n\tsecondsIn4Days int32 = 24 * 60 * 60 * 4\n)\n\n// OnSeed is the signature of the callback function which is invoked when DNS\n// seeding is successful.\ntype OnSeed func(addrs []*wire.NetAddressV2)\n\n// LookupFunc is the signature of the DNS lookup function.\ntype LookupFunc func(string) ([]net.IP, error)\n\n// SeedFromDNS uses DNS seeding to populate the address manager with peers.\nfunc SeedFromDNS(chainParams *chaincfg.Params, reqServices wire.ServiceFlag,\n\tlookupFn LookupFunc, seedFn OnSeed) {\n\n\tfor _, dnsseed := range chainParams.DNSSeeds {\n\t\tvar host string\n\t\tif !dnsseed.HasFiltering || reqServices == wire.SFNodeNetwork {\n\t\t\thost = dnsseed.Host\n\t\t} else {\n\t\t\thost = fmt.Sprintf(\"x%x.%s\", uint64(reqServices), dnsseed.Host)\n\t\t}\n\n\t\tgo func(host string) {\n\t\t\trandSource := mrand.New(mrand.NewSource(time.Now().UnixNano()))\n\n\t\t\tseedpeers, err := lookupFn(host)\n\t\t\tif err != nil {\n\t\t\t\tlog.Infof(\"DNS discovery failed on seed %s: %v\", host, err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tnumPeers := len(seedpeers)\n\n\t\t\tlog.Infof(\"%d addresses found from DNS seed %s\", numPeers, host)\n\n\t\t\tif numPeers == 0 {\n\t\t\t\treturn\n\t\t\t}\n\t\t\taddresses := make([]*wire.NetAddressV2, len(seedpeers))\n\t\t\t// if this errors then we have *real* problems\n\t\t\tintPort, _ := strconv.Atoi(chainParams.DefaultPort)\n\t\t\tfor i, peer := range seedpeers {\n\t\t\t\taddresses[i] = wire.NetAddressV2FromBytes(\n\t\t\t\t\t// bitcoind seeds with addresses from\n\t\t\t\t\t// a time randomly selected between 3\n\t\t\t\t\t// and 7 days ago.\n\t\t\t\t\ttime.Now().Add(-1*time.Second*time.Duration(secondsIn3Days+\n\t\t\t\t\t\trandSource.Int31n(secondsIn4Days))),\n\t\t\t\t\t0, peer, uint16(intPort))\n\t\t\t}\n\n\t\t\tseedFn(addresses)\n\t\t}(host)\n\t}\n}\n"
  },
  {
    "path": "connmgr/tor.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage connmgr\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"net\"\n)\n\nconst (\n\ttorSucceeded         = 0x00\n\ttorGeneralError      = 0x01\n\ttorNotAllowed        = 0x02\n\ttorNetUnreachable    = 0x03\n\ttorHostUnreachable   = 0x04\n\ttorConnectionRefused = 0x05\n\ttorTTLExpired        = 0x06\n\ttorCmdNotSupported   = 0x07\n\ttorAddrNotSupported  = 0x08\n)\n\nvar (\n\t// ErrTorInvalidAddressResponse indicates an invalid address was\n\t// returned by the Tor DNS resolver.\n\tErrTorInvalidAddressResponse = errors.New(\"invalid address response\")\n\n\t// ErrTorInvalidProxyResponse indicates the Tor proxy returned a\n\t// response in an unexpected format.\n\tErrTorInvalidProxyResponse = errors.New(\"invalid proxy response\")\n\n\t// ErrTorUnrecognizedAuthMethod indicates the authentication method\n\t// provided is not recognized.\n\tErrTorUnrecognizedAuthMethod = errors.New(\"invalid proxy authentication method\")\n\n\ttorStatusErrors = map[byte]error{\n\t\ttorSucceeded:         errors.New(\"tor succeeded\"),\n\t\ttorGeneralError:      errors.New(\"tor general error\"),\n\t\ttorNotAllowed:        errors.New(\"tor not allowed\"),\n\t\ttorNetUnreachable:    errors.New(\"tor network is unreachable\"),\n\t\ttorHostUnreachable:   errors.New(\"tor host is unreachable\"),\n\t\ttorConnectionRefused: errors.New(\"tor connection refused\"),\n\t\ttorTTLExpired:        errors.New(\"tor TTL expired\"),\n\t\ttorCmdNotSupported:   errors.New(\"tor command not supported\"),\n\t\ttorAddrNotSupported:  errors.New(\"tor address type not supported\"),\n\t}\n)\n\n// TorLookupIP uses Tor to resolve DNS via the SOCKS extension they provide for\n// resolution over the Tor network. Tor itself doesn't support ipv6 so this\n// doesn't either.\nfunc TorLookupIP(host, proxy string) ([]net.IP, error) {\n\tconn, err := net.Dial(\"tcp\", proxy)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer conn.Close()\n\n\tbuf := []byte{'\\x05', '\\x01', '\\x00'}\n\t_, err = conn.Write(buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tbuf = make([]byte, 2)\n\t_, err = conn.Read(buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif buf[0] != '\\x05' {\n\t\treturn nil, ErrTorInvalidProxyResponse\n\t}\n\tif buf[1] != '\\x00' {\n\t\treturn nil, ErrTorUnrecognizedAuthMethod\n\t}\n\n\tbuf = make([]byte, 7+len(host))\n\tbuf[0] = 5      // protocol version\n\tbuf[1] = '\\xF0' // Tor Resolve\n\tbuf[2] = 0      // reserved\n\tbuf[3] = 3      // Tor Resolve\n\tbuf[4] = byte(len(host))\n\tcopy(buf[5:], host)\n\tbuf[5+len(host)] = 0 // Port 0\n\n\t_, err = conn.Write(buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tbuf = make([]byte, 4)\n\t_, err = conn.Read(buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif buf[0] != 5 {\n\t\treturn nil, ErrTorInvalidProxyResponse\n\t}\n\tif buf[1] != 0 {\n\t\tif int(buf[1]) >= len(torStatusErrors) {\n\t\t\treturn nil, ErrTorInvalidProxyResponse\n\t\t} else if err := torStatusErrors[buf[1]]; err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, ErrTorInvalidProxyResponse\n\t}\n\tif buf[3] != 1 {\n\t\terr := torStatusErrors[torGeneralError]\n\t\treturn nil, err\n\t}\n\n\tbuf = make([]byte, 4)\n\tbytes, err := conn.Read(buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif bytes != 4 {\n\t\treturn nil, ErrTorInvalidAddressResponse\n\t}\n\n\tr := binary.BigEndian.Uint32(buf)\n\n\taddr := make([]net.IP, 1)\n\taddr[0] = net.IPv4(byte(r>>24), byte(r>>16), byte(r>>8), byte(r))\n\n\treturn addr, nil\n}\n"
  },
  {
    "path": "database/README.md",
    "content": "database\n========\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/database)\n\nPackage database provides a block and metadata storage database.\n\nPlease note that this package is intended to enable btcd to support different\ndatabase backends and is not something that a client can directly access as only\none entity can have the database open at a time (for most database backends),\nand that entity will be btcd.\n\nWhen a client wants programmatic access to the data provided by btcd, they'll\nlikely want to use the [rpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient)\npackage which makes use of the [JSON-RPC API](https://github.com/btcsuite/btcd/tree/master/docs/json_rpc_api.md).\n\nHowever, this package could be extremely useful for any applications requiring\nBitcoin block storage capabilities.\n\nThe default backend, ffldb, has a strong focus on speed, efficiency, and\nrobustness.  It makes use of leveldb for the metadata, flat files for block\nstorage, and strict checksums in key areas to ensure data integrity.\n\n## Feature Overview\n\n- Key/value metadata store\n- Bitcoin block storage\n- Efficient retrieval of block headers and regions (transactions, scripts, etc)\n- Read-only and read-write transactions with both manual and managed modes\n- Nested buckets\n- Iteration support including cursors with seek capability\n- Supports registration of backend databases\n- Comprehensive test coverage\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/database\n```\n\n## Examples\n\n* [Basic Usage Example](https://pkg.go.dev/github.com/btcsuite/btcd/database#example-package--BasicUsage)  \n  Demonstrates creating a new database and using a managed read-write\n  transaction to store and retrieve metadata.\n\n* [Block Storage and Retrieval Example](https://pkg.go.dev/github.com/btcsuite/btcd/database#example-package--BlockStorageAndRetrieval)  \n  Demonstrates creating a new database, using a managed read-write transaction\n  to store a block, and then using a managed read-only transaction to fetch the\n  block.\n\n## License\n\nPackage database is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "database/cmd/dbtool/fetchblock.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n)\n\n// fetchBlockCmd defines the configuration options for the fetchblock command.\ntype fetchBlockCmd struct{}\n\nvar (\n\t// fetchBlockCfg defines the configuration options for the command.\n\tfetchBlockCfg = fetchBlockCmd{}\n)\n\n// Execute is the main entry point for the command.  It's invoked by the parser.\nfunc (cmd *fetchBlockCmd) Execute(args []string) error {\n\t// Setup the global config options and ensure they are valid.\n\tif err := setupGlobalConfig(); err != nil {\n\t\treturn err\n\t}\n\n\tif len(args) < 1 {\n\t\treturn errors.New(\"required block hash parameter not specified\")\n\t}\n\tblockHash, err := chainhash.NewHashFromStr(args[0])\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Load the block database.\n\tdb, err := loadBlockDB()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer db.Close()\n\n\treturn db.View(func(tx database.Tx) error {\n\t\tlog.Infof(\"Fetching block %s\", blockHash)\n\t\tstartTime := time.Now()\n\t\tblockBytes, err := tx.FetchBlock(blockHash)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlog.Infof(\"Loaded block in %v\", time.Since(startTime))\n\t\tlog.Infof(\"Block Hex: %s\", hex.EncodeToString(blockBytes))\n\t\treturn nil\n\t})\n}\n\n// Usage overrides the usage display for the command.\nfunc (cmd *fetchBlockCmd) Usage() string {\n\treturn \"<block-hash>\"\n}\n"
  },
  {
    "path": "database/cmd/dbtool/fetchblockregion.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n)\n\n// blockRegionCmd defines the configuration options for the fetchblockregion\n// command.\ntype blockRegionCmd struct{}\n\nvar (\n\t// blockRegionCfg defines the configuration options for the command.\n\tblockRegionCfg = blockRegionCmd{}\n)\n\n// Execute is the main entry point for the command.  It's invoked by the parser.\nfunc (cmd *blockRegionCmd) Execute(args []string) error {\n\t// Setup the global config options and ensure they are valid.\n\tif err := setupGlobalConfig(); err != nil {\n\t\treturn err\n\t}\n\n\t// Ensure expected arguments.\n\tif len(args) < 1 {\n\t\treturn errors.New(\"required block hash parameter not specified\")\n\t}\n\tif len(args) < 2 {\n\t\treturn errors.New(\"required start offset parameter not \" +\n\t\t\t\"specified\")\n\t}\n\tif len(args) < 3 {\n\t\treturn errors.New(\"required region length parameter not \" +\n\t\t\t\"specified\")\n\t}\n\n\t// Parse arguments.\n\tblockHash, err := chainhash.NewHashFromStr(args[0])\n\tif err != nil {\n\t\treturn err\n\t}\n\tstartOffset, err := strconv.ParseUint(args[1], 10, 32)\n\tif err != nil {\n\t\treturn err\n\t}\n\tregionLen, err := strconv.ParseUint(args[2], 10, 32)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Load the block database.\n\tdb, err := loadBlockDB()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer db.Close()\n\n\treturn db.View(func(tx database.Tx) error {\n\t\tlog.Infof(\"Fetching block region %s<%d:%d>\", blockHash,\n\t\t\tstartOffset, startOffset+regionLen-1)\n\t\tregion := database.BlockRegion{\n\t\t\tHash:   blockHash,\n\t\t\tOffset: uint32(startOffset),\n\t\t\tLen:    uint32(regionLen),\n\t\t}\n\t\tstartTime := time.Now()\n\t\tregionBytes, err := tx.FetchBlockRegion(&region)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlog.Infof(\"Loaded block region in %v\", time.Since(startTime))\n\t\tlog.Infof(\"Double Hash: %s\", chainhash.DoubleHashH(regionBytes))\n\t\tlog.Infof(\"Region Hex: %s\", hex.EncodeToString(regionBytes))\n\t\treturn nil\n\t})\n}\n\n// Usage overrides the usage display for the command.\nfunc (cmd *blockRegionCmd) Usage() string {\n\treturn \"<block-hash> <start-offset> <length-of-region>\"\n}\n"
  },
  {
    "path": "database/cmd/dbtool/globalconfig.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/database\"\n\t_ \"github.com/btcsuite/btcd/database/ffldb\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nvar (\n\tbtcdHomeDir     = btcutil.AppDataDir(\"btcd\", false)\n\tknownDbTypes    = database.SupportedDrivers()\n\tactiveNetParams = &chaincfg.MainNetParams\n\n\t// Default global config.\n\tcfg = &config{\n\t\tDataDir: filepath.Join(btcdHomeDir, \"data\"),\n\t\tDbType:  \"ffldb\",\n\t}\n)\n\n// config defines the global configuration options.\ntype config struct {\n\tDataDir        string `short:\"b\" long:\"datadir\" description:\"Location of the btcd data directory\"`\n\tDbType         string `long:\"dbtype\" description:\"Database backend to use for the Block Chain\"`\n\tRegressionTest bool   `long:\"regtest\" description:\"Use the regression test network\"`\n\tSimNet         bool   `long:\"simnet\" description:\"Use the simulation test network\"`\n\tTestNet3       bool   `long:\"testnet\" description:\"Use the test network\"`\n\tTestNet4       bool   `long:\"testnet4\" description:\"Use the test network (version 4)\"`\n}\n\n// fileExists reports whether the named file or directory exists.\nfunc fileExists(name string) bool {\n\tif _, err := os.Stat(name); err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// validDbType returns whether or not dbType is a supported database type.\nfunc validDbType(dbType string) bool {\n\treturn slices.Contains(knownDbTypes, dbType)\n}\n\n// netName returns the name used when referring to a bitcoin network.  At the\n// time of writing, btcd currently places blocks for testnet version 3 in the\n// data and log directory \"testnet\", which does not match the Name field of the\n// chaincfg parameters.  This function can be used to override this directory name\n// as \"testnet\" when the passed active network matches wire.TestNet3.\n//\n// A proper upgrade to move the data and log directories for this network to\n// \"testnet3\" is planned for the future, at which point this function can be\n// removed and the network parameter's name used instead.\nfunc netName(chainParams *chaincfg.Params) string {\n\tswitch chainParams.Net {\n\tcase wire.TestNet3:\n\t\treturn \"testnet\"\n\tdefault:\n\t\treturn chainParams.Name\n\t}\n}\n\n// setupGlobalConfig examine the global configuration options for any conditions\n// which are invalid as well as performs any addition setup necessary after the\n// initial parse.\nfunc setupGlobalConfig() error {\n\t// Multiple networks can't be selected simultaneously.\n\t// Count number of network flags passed; assign active network params\n\t// while we're at it\n\tnumNets := 0\n\tif cfg.TestNet3 {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.TestNet3Params\n\t}\n\tif cfg.TestNet4 {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.TestNet4Params\n\t}\n\tif cfg.RegressionTest {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.RegressionNetParams\n\t}\n\tif cfg.SimNet {\n\t\tnumNets++\n\t\tactiveNetParams = &chaincfg.SimNetParams\n\t}\n\tif numNets > 1 {\n\t\treturn errors.New(\"The testnet, regtest, and simnet params \" +\n\t\t\t\"can't be used together -- choose one of the three\")\n\t}\n\n\t// Validate database type.\n\tif !validDbType(cfg.DbType) {\n\t\tstr := \"The specified database type [%v] is invalid -- \" +\n\t\t\t\"supported types %v\"\n\t\treturn fmt.Errorf(str, cfg.DbType, knownDbTypes)\n\t}\n\n\t// Append the network type to the data directory so it is \"namespaced\"\n\t// per network.  In addition to the block database, there are other\n\t// pieces of data that are saved to disk such as address manager state.\n\t// All data is specific to a network, so namespacing the data directory\n\t// means each individual piece of serialized data does not have to\n\t// worry about changing names per network and such.\n\tcfg.DataDir = filepath.Join(cfg.DataDir, netName(activeNetParams))\n\n\treturn nil\n}\n"
  },
  {
    "path": "database/cmd/dbtool/insecureimport.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// importCmd defines the configuration options for the insecureimport command.\ntype importCmd struct {\n\tInFile   string `short:\"i\" long:\"infile\" description:\"File containing the block(s)\"`\n\tProgress int    `short:\"p\" long:\"progress\" description:\"Show a progress message each time this number of seconds have passed -- Use 0 to disable progress announcements\"`\n}\n\nvar (\n\t// importCfg defines the configuration options for the command.\n\timportCfg = importCmd{\n\t\tInFile:   \"bootstrap.dat\",\n\t\tProgress: 10,\n\t}\n\n\t// zeroHash is a simply a hash with all zeros.  It is defined here to\n\t// avoid creating it multiple times.\n\tzeroHash = chainhash.Hash{}\n)\n\n// importResults houses the stats and result as an import operation.\ntype importResults struct {\n\tblocksProcessed int64\n\tblocksImported  int64\n\terr             error\n}\n\n// blockImporter houses information about an ongoing import from a block data\n// file to the block database.\ntype blockImporter struct {\n\tdb                database.DB\n\tr                 io.ReadSeeker\n\tprocessQueue      chan []byte\n\tdoneChan          chan bool\n\terrChan           chan error\n\tquit              chan struct{}\n\twg                sync.WaitGroup\n\tblocksProcessed   int64\n\tblocksImported    int64\n\treceivedLogBlocks int64\n\treceivedLogTx     int64\n\tlastHeight        int64\n\tlastBlockTime     time.Time\n\tlastLogTime       time.Time\n}\n\n// readBlock reads the next block from the input file.\nfunc (bi *blockImporter) readBlock() ([]byte, error) {\n\t// The block file format is:\n\t//  <network> <block length> <serialized block>\n\tvar net uint32\n\terr := binary.Read(bi.r, binary.LittleEndian, &net)\n\tif err != nil {\n\t\tif err != io.EOF {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// No block and no error means there are no more blocks to read.\n\t\treturn nil, nil\n\t}\n\tif net != uint32(activeNetParams.Net) {\n\t\treturn nil, fmt.Errorf(\"network mismatch -- got %x, want %x\",\n\t\t\tnet, uint32(activeNetParams.Net))\n\t}\n\n\t// Read the block length and ensure it is sane.\n\tvar blockLen uint32\n\tif err := binary.Read(bi.r, binary.LittleEndian, &blockLen); err != nil {\n\t\treturn nil, err\n\t}\n\tif blockLen > wire.MaxBlockPayload {\n\t\treturn nil, fmt.Errorf(\"block payload of %d bytes is larger \"+\n\t\t\t\"than the max allowed %d bytes\", blockLen,\n\t\t\twire.MaxBlockPayload)\n\t}\n\n\tserializedBlock := make([]byte, blockLen)\n\tif _, err := io.ReadFull(bi.r, serializedBlock); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn serializedBlock, nil\n}\n\n// processBlock potentially imports the block into the database.  It first\n// deserializes the raw block while checking for errors.  Already known blocks\n// are skipped and orphan blocks are considered errors.  Returns whether the\n// block was imported along with any potential errors.\n//\n// NOTE: This is not a safe import as it does not verify chain rules.\nfunc (bi *blockImporter) processBlock(serializedBlock []byte) (bool, error) {\n\t// Deserialize the block which includes checks for malformed blocks.\n\tblock, err := btcutil.NewBlockFromBytes(serializedBlock)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// update progress statistics\n\tbi.lastBlockTime = block.MsgBlock().Header.Timestamp\n\tbi.receivedLogTx += int64(len(block.MsgBlock().Transactions))\n\n\t// Skip blocks that already exist.\n\tvar exists bool\n\terr = bi.db.View(func(tx database.Tx) error {\n\t\texists, err = tx.HasBlock(block.Hash())\n\t\treturn err\n\t})\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif exists {\n\t\treturn false, nil\n\t}\n\n\t// Don't bother trying to process orphans.\n\tprevHash := &block.MsgBlock().Header.PrevBlock\n\tif !prevHash.IsEqual(&zeroHash) {\n\t\tvar exists bool\n\t\terr := bi.db.View(func(tx database.Tx) error {\n\t\t\texists, err = tx.HasBlock(prevHash)\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\treturn false, err\n\t\t}\n\t\tif !exists {\n\t\t\treturn false, fmt.Errorf(\"import file contains block \"+\n\t\t\t\t\"%v which does not link to the available \"+\n\t\t\t\t\"block chain\", prevHash)\n\t\t}\n\t}\n\n\t// Put the blocks into the database with no checking of chain rules.\n\terr = bi.db.Update(func(tx database.Tx) error {\n\t\treturn tx.StoreBlock(block)\n\t})\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn true, nil\n}\n\n// readHandler is the main handler for reading blocks from the import file.\n// This allows block processing to take place in parallel with block reads.\n// It must be run as a goroutine.\nfunc (bi *blockImporter) readHandler() {\nout:\n\tfor {\n\t\t// Read the next block from the file and if anything goes wrong\n\t\t// notify the status handler with the error and bail.\n\t\tserializedBlock, err := bi.readBlock()\n\t\tif err != nil {\n\t\t\tbi.errChan <- fmt.Errorf(\"Error reading from input \"+\n\t\t\t\t\"file: %v\", err.Error())\n\t\t\tbreak out\n\t\t}\n\n\t\t// A nil block with no error means we're done.\n\t\tif serializedBlock == nil {\n\t\t\tbreak out\n\t\t}\n\n\t\t// Send the block or quit if we've been signalled to exit by\n\t\t// the status handler due to an error elsewhere.\n\t\tselect {\n\t\tcase bi.processQueue <- serializedBlock:\n\t\tcase <-bi.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\t// Close the processing channel to signal no more blocks are coming.\n\tclose(bi.processQueue)\n\tbi.wg.Done()\n}\n\n// logProgress logs block progress as an information message.  In order to\n// prevent spam, it limits logging to one message every importCfg.Progress\n// seconds with duration and totals included.\nfunc (bi *blockImporter) logProgress() {\n\tbi.receivedLogBlocks++\n\n\tnow := time.Now()\n\tduration := now.Sub(bi.lastLogTime)\n\tif duration < time.Second*time.Duration(importCfg.Progress) {\n\t\treturn\n\t}\n\n\t// Truncate the duration to 10s of milliseconds.\n\tdurationMillis := int64(duration / time.Millisecond)\n\ttDuration := 10 * time.Millisecond * time.Duration(durationMillis/10)\n\n\t// Log information about new block height.\n\tblockStr := \"blocks\"\n\tif bi.receivedLogBlocks == 1 {\n\t\tblockStr = \"block\"\n\t}\n\ttxStr := \"transactions\"\n\tif bi.receivedLogTx == 1 {\n\t\ttxStr = \"transaction\"\n\t}\n\tlog.Infof(\"Processed %d %s in the last %s (%d %s, height %d, %s)\",\n\t\tbi.receivedLogBlocks, blockStr, tDuration, bi.receivedLogTx,\n\t\ttxStr, bi.lastHeight, bi.lastBlockTime)\n\n\tbi.receivedLogBlocks = 0\n\tbi.receivedLogTx = 0\n\tbi.lastLogTime = now\n}\n\n// processHandler is the main handler for processing blocks.  This allows block\n// processing to take place in parallel with block reads from the import file.\n// It must be run as a goroutine.\nfunc (bi *blockImporter) processHandler() {\nout:\n\tfor {\n\t\tselect {\n\t\tcase serializedBlock, ok := <-bi.processQueue:\n\t\t\t// We're done when the channel is closed.\n\t\t\tif !ok {\n\t\t\t\tbreak out\n\t\t\t}\n\n\t\t\tbi.blocksProcessed++\n\t\t\tbi.lastHeight++\n\t\t\timported, err := bi.processBlock(serializedBlock)\n\t\t\tif err != nil {\n\t\t\t\tbi.errChan <- err\n\t\t\t\tbreak out\n\t\t\t}\n\n\t\t\tif imported {\n\t\t\t\tbi.blocksImported++\n\t\t\t}\n\n\t\t\tbi.logProgress()\n\n\t\tcase <-bi.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\tbi.wg.Done()\n}\n\n// statusHandler waits for updates from the import operation and notifies\n// the passed doneChan with the results of the import.  It also causes all\n// goroutines to exit if an error is reported from any of them.\nfunc (bi *blockImporter) statusHandler(resultsChan chan *importResults) {\n\tselect {\n\t// An error from either of the goroutines means we're done so signal\n\t// caller with the error and signal all goroutines to quit.\n\tcase err := <-bi.errChan:\n\t\tresultsChan <- &importResults{\n\t\t\tblocksProcessed: bi.blocksProcessed,\n\t\t\tblocksImported:  bi.blocksImported,\n\t\t\terr:             err,\n\t\t}\n\t\tclose(bi.quit)\n\n\t// The import finished normally.\n\tcase <-bi.doneChan:\n\t\tresultsChan <- &importResults{\n\t\t\tblocksProcessed: bi.blocksProcessed,\n\t\t\tblocksImported:  bi.blocksImported,\n\t\t\terr:             nil,\n\t\t}\n\t}\n}\n\n// Import is the core function which handles importing the blocks from the file\n// associated with the block importer to the database.  It returns a channel\n// on which the results will be returned when the operation has completed.\nfunc (bi *blockImporter) Import() chan *importResults {\n\t// Start up the read and process handling goroutines.  This setup allows\n\t// blocks to be read from disk in parallel while being processed.\n\tbi.wg.Add(2)\n\tgo bi.readHandler()\n\tgo bi.processHandler()\n\n\t// Wait for the import to finish in a separate goroutine and signal\n\t// the status handler when done.\n\tgo func() {\n\t\tbi.wg.Wait()\n\t\tbi.doneChan <- true\n\t}()\n\n\t// Start the status handler and return the result channel that it will\n\t// send the results on when the import is done.\n\tresultChan := make(chan *importResults)\n\tgo bi.statusHandler(resultChan)\n\treturn resultChan\n}\n\n// newBlockImporter returns a new importer for the provided file reader seeker\n// and database.\nfunc newBlockImporter(db database.DB, r io.ReadSeeker) *blockImporter {\n\treturn &blockImporter{\n\t\tdb:           db,\n\t\tr:            r,\n\t\tprocessQueue: make(chan []byte, 2),\n\t\tdoneChan:     make(chan bool),\n\t\terrChan:      make(chan error),\n\t\tquit:         make(chan struct{}),\n\t\tlastLogTime:  time.Now(),\n\t}\n}\n\n// Execute is the main entry point for the command.  It's invoked by the parser.\nfunc (cmd *importCmd) Execute(args []string) error {\n\t// Setup the global config options and ensure they are valid.\n\tif err := setupGlobalConfig(); err != nil {\n\t\treturn err\n\t}\n\n\t// Ensure the specified block file exists.\n\tif !fileExists(cmd.InFile) {\n\t\tstr := \"The specified block file [%v] does not exist\"\n\t\treturn fmt.Errorf(str, cmd.InFile)\n\t}\n\n\t// Load the block database.\n\tdb, err := loadBlockDB()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer db.Close()\n\n\t// Ensure the database is sync'd and closed on Ctrl+C.\n\taddInterruptHandler(func() {\n\t\tlog.Infof(\"Gracefully shutting down the database...\")\n\t\tdb.Close()\n\t})\n\n\tfi, err := os.Open(importCfg.InFile)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer fi.Close()\n\n\t// Create a block importer for the database and input file and start it.\n\t// The results channel returned from start will contain an error if\n\t// anything went wrong.\n\timporter := newBlockImporter(db, fi)\n\n\t// Perform the import asynchronously and signal the main goroutine when\n\t// done.  This allows blocks to be processed and read in parallel.  The\n\t// results channel returned from Import contains the statistics about\n\t// the import including an error if something went wrong.  This is done\n\t// in a separate goroutine rather than waiting directly so the main\n\t// goroutine can be signaled for shutdown by either completion, error,\n\t// or from the main interrupt handler.  This is necessary since the main\n\t// goroutine must be kept running long enough for the interrupt handler\n\t// goroutine to finish.\n\tgo func() {\n\t\tlog.Info(\"Starting import\")\n\t\tresultsChan := importer.Import()\n\t\tresults := <-resultsChan\n\t\tif results.err != nil {\n\t\t\tdbErr, ok := results.err.(database.Error)\n\t\t\tif !ok || ok && dbErr.ErrorCode != database.ErrDbNotOpen {\n\t\t\t\tshutdownChannel <- results.err\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tlog.Infof(\"Processed a total of %d blocks (%d imported, %d \"+\n\t\t\t\"already known)\", results.blocksProcessed,\n\t\t\tresults.blocksImported,\n\t\t\tresults.blocksProcessed-results.blocksImported)\n\t\tshutdownChannel <- nil\n\t}()\n\n\t// Wait for shutdown signal from either a normal completion or from the\n\t// interrupt handler.\n\terr = <-shutdownChannel\n\treturn err\n}\n"
  },
  {
    "path": "database/cmd/dbtool/loadheaders.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n)\n\n// headersCmd defines the configuration options for the loadheaders command.\ntype headersCmd struct {\n\tBulk bool `long:\"bulk\" description:\"Use bulk loading of headers instead of one at a time\"`\n}\n\nvar (\n\t// headersCfg defines the configuration options for the command.\n\theadersCfg = headersCmd{\n\t\tBulk: false,\n\t}\n)\n\n// Execute is the main entry point for the command.  It's invoked by the parser.\nfunc (cmd *headersCmd) Execute(args []string) error {\n\t// Setup the global config options and ensure they are valid.\n\tif err := setupGlobalConfig(); err != nil {\n\t\treturn err\n\t}\n\n\t// Load the block database.\n\tdb, err := loadBlockDB()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer db.Close()\n\n\t// NOTE: This code will only work for ffldb.  Ideally the package using\n\t// the database would keep a metadata index of its own.\n\tblockIdxName := []byte(\"ffldb-blockidx\")\n\tif !headersCfg.Bulk {\n\t\terr = db.View(func(tx database.Tx) error {\n\t\t\ttotalHdrs := 0\n\t\t\tblockIdxBucket := tx.Metadata().Bucket(blockIdxName)\n\t\t\tblockIdxBucket.ForEach(func(k, v []byte) error {\n\t\t\t\ttotalHdrs++\n\t\t\t\treturn nil\n\t\t\t})\n\t\t\tlog.Infof(\"Loading headers for %d blocks...\", totalHdrs)\n\t\t\tnumLoaded := 0\n\t\t\tstartTime := time.Now()\n\t\t\tblockIdxBucket.ForEach(func(k, v []byte) error {\n\t\t\t\tvar hash chainhash.Hash\n\t\t\t\tcopy(hash[:], k)\n\t\t\t\t_, err := tx.FetchBlockHeader(&hash)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tnumLoaded++\n\t\t\t\treturn nil\n\t\t\t})\n\t\t\tlog.Infof(\"Loaded %d headers in %v\", numLoaded,\n\t\t\t\ttime.Since(startTime))\n\t\t\treturn nil\n\t\t})\n\t\treturn err\n\t}\n\n\t// Bulk load headers.\n\terr = db.View(func(tx database.Tx) error {\n\t\tblockIdxBucket := tx.Metadata().Bucket(blockIdxName)\n\t\thashes := make([]chainhash.Hash, 0, 500000)\n\t\tblockIdxBucket.ForEach(func(k, v []byte) error {\n\t\t\tvar hash chainhash.Hash\n\t\t\tcopy(hash[:], k)\n\t\t\thashes = append(hashes, hash)\n\t\t\treturn nil\n\t\t})\n\n\t\tlog.Infof(\"Loading headers for %d blocks...\", len(hashes))\n\t\tstartTime := time.Now()\n\t\thdrs, err := tx.FetchBlockHeaders(hashes)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlog.Infof(\"Loaded %d headers in %v\", len(hdrs),\n\t\t\ttime.Since(startTime))\n\t\treturn nil\n\t})\n\treturn err\n}\n"
  },
  {
    "path": "database/cmd/dbtool/main.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btclog\"\n\tflags \"github.com/jessevdk/go-flags\"\n)\n\nconst (\n\t// blockDbNamePrefix is the prefix for the btcd block database.\n\tblockDbNamePrefix = \"blocks\"\n)\n\nvar (\n\tlog             btclog.Logger\n\tshutdownChannel = make(chan error)\n)\n\n// loadBlockDB opens the block database and returns a handle to it.\nfunc loadBlockDB() (database.DB, error) {\n\t// The database name is based on the database type.\n\tdbName := blockDbNamePrefix + \"_\" + cfg.DbType\n\tdbPath := filepath.Join(cfg.DataDir, dbName)\n\n\tlog.Infof(\"Loading block database from '%s'\", dbPath)\n\tdb, err := database.Open(cfg.DbType, dbPath, activeNetParams.Net)\n\tif err != nil {\n\t\t// Return the error if it's not because the database doesn't\n\t\t// exist.\n\t\tif dbErr, ok := err.(database.Error); !ok || dbErr.ErrorCode !=\n\t\t\tdatabase.ErrDbDoesNotExist {\n\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Create the db if it does not exist.\n\t\terr = os.MkdirAll(cfg.DataDir, 0700)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdb, err = database.Create(cfg.DbType, dbPath, activeNetParams.Net)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tlog.Info(\"Block database loaded\")\n\treturn db, nil\n}\n\n// realMain is the real main function for the utility.  It is necessary to work\n// around the fact that deferred functions do not run when os.Exit() is called.\nfunc realMain() error {\n\t// Setup logging.\n\tbackendLogger := btclog.NewBackend(os.Stdout)\n\tdefer os.Stdout.Sync()\n\tlog = backendLogger.Logger(\"MAIN\")\n\tdbLog := backendLogger.Logger(\"BCDB\")\n\tdbLog.SetLevel(btclog.LevelDebug)\n\tdatabase.UseLogger(dbLog)\n\n\t// Setup the parser options and commands.\n\tappName := filepath.Base(os.Args[0])\n\tappName = strings.TrimSuffix(appName, filepath.Ext(appName))\n\tparserFlags := flags.Options(flags.HelpFlag | flags.PassDoubleDash)\n\tparser := flags.NewNamedParser(appName, parserFlags)\n\tparser.AddGroup(\"Global Options\", \"\", cfg)\n\tparser.AddCommand(\"insecureimport\",\n\t\t\"Insecurely import bulk block data from bootstrap.dat\",\n\t\t\"Insecurely import bulk block data from bootstrap.dat.  \"+\n\t\t\t\"WARNING: This is NOT secure because it does NOT \"+\n\t\t\t\"verify chain rules.  It is only provided for testing \"+\n\t\t\t\"purposes.\", &importCfg)\n\tparser.AddCommand(\"loadheaders\",\n\t\t\"Time how long to load headers for all blocks in the database\",\n\t\t\"\", &headersCfg)\n\tparser.AddCommand(\"fetchblock\",\n\t\t\"Fetch the specific block hash from the database\", \"\",\n\t\t&fetchBlockCfg)\n\tparser.AddCommand(\"fetchblockregion\",\n\t\t\"Fetch the specified block region from the database\", \"\",\n\t\t&blockRegionCfg)\n\n\t// Parse command line and invoke the Execute function for the specified\n\t// command.\n\tif _, err := parser.Parse(); err != nil {\n\t\tif e, ok := err.(*flags.Error); ok && e.Type == flags.ErrHelp {\n\t\t\tparser.WriteHelp(os.Stderr)\n\t\t} else {\n\t\t\tlog.Error(err)\n\t\t}\n\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc main() {\n\t// Work around defer not working after os.Exit()\n\tif err := realMain(); err != nil {\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "database/cmd/dbtool/signal.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"os\"\n\t\"os/signal\"\n)\n\n// interruptChannel is used to receive SIGINT (Ctrl+C) signals.\nvar interruptChannel chan os.Signal\n\n// addHandlerChannel is used to add an interrupt handler to the list of handlers\n// to be invoked on SIGINT (Ctrl+C) signals.\nvar addHandlerChannel = make(chan func())\n\n// mainInterruptHandler listens for SIGINT (Ctrl+C) signals on the\n// interruptChannel and invokes the registered interruptCallbacks accordingly.\n// It also listens for callback registration.  It must be run as a goroutine.\nfunc mainInterruptHandler() {\n\t// interruptCallbacks is a list of callbacks to invoke when a\n\t// SIGINT (Ctrl+C) is received.\n\tvar interruptCallbacks []func()\n\n\t// isShutdown is a flag which is used to indicate whether or not\n\t// the shutdown signal has already been received and hence any future\n\t// attempts to add a new interrupt handler should invoke them\n\t// immediately.\n\tvar isShutdown bool\n\n\tfor {\n\t\tselect {\n\t\tcase <-interruptChannel:\n\t\t\t// Ignore more than one shutdown signal.\n\t\t\tif isShutdown {\n\t\t\t\tlog.Infof(\"Received SIGINT (Ctrl+C).  \" +\n\t\t\t\t\t\"Already shutting down...\")\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tisShutdown = true\n\t\t\tlog.Infof(\"Received SIGINT (Ctrl+C).  Shutting down...\")\n\n\t\t\t// Run handlers in LIFO order.\n\t\t\tfor i := range interruptCallbacks {\n\t\t\t\tidx := len(interruptCallbacks) - 1 - i\n\t\t\t\tcallback := interruptCallbacks[idx]\n\t\t\t\tcallback()\n\t\t\t}\n\n\t\t\t// Signal the main goroutine to shutdown.\n\t\t\tgo func() {\n\t\t\t\tshutdownChannel <- nil\n\t\t\t}()\n\n\t\tcase handler := <-addHandlerChannel:\n\t\t\t// The shutdown signal has already been received, so\n\t\t\t// just invoke and new handlers immediately.\n\t\t\tif isShutdown {\n\t\t\t\thandler()\n\t\t\t}\n\n\t\t\tinterruptCallbacks = append(interruptCallbacks, handler)\n\t\t}\n\t}\n}\n\n// addInterruptHandler adds a handler to call when a SIGINT (Ctrl+C) is\n// received.\nfunc addInterruptHandler(handler func()) {\n\t// Create the channel and start the main interrupt handler which invokes\n\t// all other callbacks and exits if not already done.\n\tif interruptChannel == nil {\n\t\tinterruptChannel = make(chan os.Signal, 1)\n\t\tsignal.Notify(interruptChannel, os.Interrupt)\n\t\tgo mainInterruptHandler()\n\t}\n\n\taddHandlerChannel <- handler\n}\n"
  },
  {
    "path": "database/doc.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage database provides a block and metadata storage database.\n\n# Overview\n\nAs of Feb 2016, there are over 400,000 blocks in the Bitcoin block chain and\nand over 112 million transactions (which turns out to be over 60GB of data).\nThis package provides a database layer to store and retrieve this data in a\nsimple and efficient manner.\n\nThe default backend, ffldb, has a strong focus on speed, efficiency, and\nrobustness.  It makes use leveldb for the metadata, flat files for block\nstorage, and strict checksums in key areas to ensure data integrity.\n\nA quick overview of the features database provides are as follows:\n\n  - Key/value metadata store\n  - Bitcoin block storage\n  - Efficient retrieval of block headers and regions (transactions, scripts, etc)\n  - Read-only and read-write transactions with both manual and managed modes\n  - Nested buckets\n  - Supports registration of backend databases\n  - Comprehensive test coverage\n\n# Database\n\nThe main entry point is the DB interface.  It exposes functionality for\ntransactional-based access and storage of metadata and block data.  It is\nobtained via the Create and Open functions which take a database type string\nthat identifies the specific database driver (backend) to use as well as\narguments specific to the specified driver.\n\nThe interface provides facilities for obtaining transactions (the Tx interface)\nthat are the basis of all database reads and writes.  Unlike some database\ninterfaces that support reading and writing without transactions, this interface\nrequires transactions even when only reading or writing a single key.\n\nThe Begin function provides an unmanaged transaction while the View and Update\nfunctions provide a managed transaction.  These are described in more detail\nbelow.\n\n# Transactions\n\nThe Tx interface provides facilities for rolling back or committing changes that\ntook place while the transaction was active.  It also provides the root metadata\nbucket under which all keys, values, and nested buckets are stored.  A\ntransaction can either be read-only or read-write and managed or unmanaged.\n\n# Managed versus Unmanaged Transactions\n\nA managed transaction is one where the caller provides a function to execute\nwithin the context of the transaction and the commit or rollback is handled\nautomatically depending on whether or not the provided function returns an\nerror.  Attempting to manually call Rollback or Commit on the managed\ntransaction will result in a panic.\n\nAn unmanaged transaction, on the other hand, requires the caller to manually\ncall Commit or Rollback when they are finished with it.  Leaving transactions\nopen for long periods of time can have several adverse effects, so it is\nrecommended that managed transactions are used instead.\n\n# Buckets\n\nThe Bucket interface provides the ability to manipulate key/value pairs and\nnested buckets as well as iterate through them.\n\nThe Get, Put, and Delete functions work with key/value pairs, while the Bucket,\nCreateBucket, CreateBucketIfNotExists, and DeleteBucket functions work with\nbuckets.  The ForEach function allows the caller to provide a function to be\ncalled with each key/value pair and nested bucket in the current bucket.\n\n# Metadata Bucket\n\nAs discussed above, all of the functions which are used to manipulate key/value\npairs and nested buckets exist on the Bucket interface.  The root metadata\nbucket is the upper-most bucket in which data is stored and is created at the\nsame time as the database.  Use the Metadata function on the Tx interface\nto retrieve it.\n\n# Nested Buckets\n\nThe CreateBucket and CreateBucketIfNotExists functions on the Bucket interface\nprovide the ability to create an arbitrary number of nested buckets.  It is\na good idea to avoid a lot of buckets with little data in them as it could lead\nto poor page utilization depending on the specific driver in use.\n*/\npackage database\n"
  },
  {
    "path": "database/driver.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage database\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btclog\"\n)\n\n// Driver defines a structure for backend drivers to use when they registered\n// themselves as a backend which implements the DB interface.\ntype Driver struct {\n\t// DbType is the identifier used to uniquely identify a specific\n\t// database driver.  There can be only one driver with the same name.\n\tDbType string\n\n\t// Create is the function that will be invoked with all user-specified\n\t// arguments to create the database.  This function must return\n\t// ErrDbExists if the database already exists.\n\tCreate func(args ...interface{}) (DB, error)\n\n\t// Open is the function that will be invoked with all user-specified\n\t// arguments to open the database.  This function must return\n\t// ErrDbDoesNotExist if the database has not already been created.\n\tOpen func(args ...interface{}) (DB, error)\n\n\t// UseLogger uses a specified Logger to output package logging info.\n\tUseLogger func(logger btclog.Logger)\n}\n\n// driverList holds all of the registered database backends.\nvar drivers = make(map[string]*Driver)\n\n// RegisterDriver adds a backend database driver to available interfaces.\n// ErrDbTypeRegistered will be returned if the database type for the driver has\n// already been registered.\nfunc RegisterDriver(driver Driver) error {\n\tif _, exists := drivers[driver.DbType]; exists {\n\t\tstr := fmt.Sprintf(\"driver %q is already registered\",\n\t\t\tdriver.DbType)\n\t\treturn makeError(ErrDbTypeRegistered, str, nil)\n\t}\n\n\tdrivers[driver.DbType] = &driver\n\treturn nil\n}\n\n// SupportedDrivers returns a slice of strings that represent the database\n// drivers that have been registered and are therefore supported.\nfunc SupportedDrivers() []string {\n\tsupportedDBs := make([]string, 0, len(drivers))\n\tfor _, drv := range drivers {\n\t\tsupportedDBs = append(supportedDBs, drv.DbType)\n\t}\n\treturn supportedDBs\n}\n\n// Create initializes and opens a database for the specified type.  The\n// arguments are specific to the database type driver.  See the documentation\n// for the database driver for further details.\n//\n// ErrDbUnknownType will be returned if the database type is not registered.\nfunc Create(dbType string, args ...interface{}) (DB, error) {\n\tdrv, exists := drivers[dbType]\n\tif !exists {\n\t\tstr := fmt.Sprintf(\"driver %q is not registered\", dbType)\n\t\treturn nil, makeError(ErrDbUnknownType, str, nil)\n\t}\n\n\treturn drv.Create(args...)\n}\n\n// Open opens an existing database for the specified type.  The arguments are\n// specific to the database type driver.  See the documentation for the database\n// driver for further details.\n//\n// ErrDbUnknownType will be returned if the database type is not registered.\nfunc Open(dbType string, args ...interface{}) (DB, error) {\n\tdrv, exists := drivers[dbType]\n\tif !exists {\n\t\tstr := fmt.Sprintf(\"driver %q is not registered\", dbType)\n\t\treturn nil, makeError(ErrDbUnknownType, str, nil)\n\t}\n\n\treturn drv.Open(args...)\n}\n"
  },
  {
    "path": "database/driver_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage database_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/database\"\n\t_ \"github.com/btcsuite/btcd/database/ffldb\"\n)\n\nvar (\n\t// ignoreDbTypes are types which should be ignored when running tests\n\t// that iterate all supported DB types.  This allows some tests to add\n\t// bogus drivers for testing purposes while still allowing other tests\n\t// to easily iterate all supported drivers.\n\tignoreDbTypes = map[string]bool{\"createopenfail\": true}\n)\n\n// checkDbError ensures the passed error is a database.Error with an error code\n// that matches the passed  error code.\nfunc checkDbError(t *testing.T, testName string, gotErr error, wantErrCode database.ErrorCode) bool {\n\tdbErr, ok := gotErr.(database.Error)\n\tif !ok {\n\t\tt.Errorf(\"%s: unexpected error type - got %T, want %T\",\n\t\t\ttestName, gotErr, database.Error{})\n\t\treturn false\n\t}\n\tif dbErr.ErrorCode != wantErrCode {\n\t\tt.Errorf(\"%s: unexpected error code - got %s (%s), want %s\",\n\t\t\ttestName, dbErr.ErrorCode, dbErr.Description,\n\t\t\twantErrCode)\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// TestAddDuplicateDriver ensures that adding a duplicate driver does not\n// overwrite an existing one.\nfunc TestAddDuplicateDriver(t *testing.T) {\n\tsupportedDrivers := database.SupportedDrivers()\n\tif len(supportedDrivers) == 0 {\n\t\tt.Errorf(\"no backends to test\")\n\t\treturn\n\t}\n\tdbType := supportedDrivers[0]\n\n\t// bogusCreateDB is a function which acts as a bogus create and open\n\t// driver function and intentionally returns a failure that can be\n\t// detected if the interface allows a duplicate driver to overwrite an\n\t// existing one.\n\tbogusCreateDB := func(args ...interface{}) (database.DB, error) {\n\t\treturn nil, fmt.Errorf(\"duplicate driver allowed for database \"+\n\t\t\t\"type [%v]\", dbType)\n\t}\n\n\t// Create a driver that tries to replace an existing one.  Set its\n\t// create and open functions to a function that causes a test failure if\n\t// they are invoked.\n\tdriver := database.Driver{\n\t\tDbType: dbType,\n\t\tCreate: bogusCreateDB,\n\t\tOpen:   bogusCreateDB,\n\t}\n\ttestName := \"duplicate driver registration\"\n\terr := database.RegisterDriver(driver)\n\tif !checkDbError(t, testName, err, database.ErrDbTypeRegistered) {\n\t\treturn\n\t}\n}\n\n// TestCreateOpenFail ensures that errors which occur while opening or closing\n// a database are handled properly.\nfunc TestCreateOpenFail(t *testing.T) {\n\t// bogusCreateDB is a function which acts as a bogus create and open\n\t// driver function that intentionally returns a failure which can be\n\t// detected.\n\tdbType := \"createopenfail\"\n\topenError := fmt.Errorf(\"failed to create or open database for \"+\n\t\t\"database type [%v]\", dbType)\n\tbogusCreateDB := func(args ...interface{}) (database.DB, error) {\n\t\treturn nil, openError\n\t}\n\n\t// Create and add driver that intentionally fails when created or opened\n\t// to ensure errors on database open and create are handled properly.\n\tdriver := database.Driver{\n\t\tDbType: dbType,\n\t\tCreate: bogusCreateDB,\n\t\tOpen:   bogusCreateDB,\n\t}\n\tdatabase.RegisterDriver(driver)\n\n\t// Ensure creating a database with the new type fails with the expected\n\t// error.\n\t_, err := database.Create(dbType)\n\tif err != openError {\n\t\tt.Errorf(\"expected error not received - got: %v, want %v\", err,\n\t\t\topenError)\n\t\treturn\n\t}\n\n\t// Ensure opening a database with the new type fails with the expected\n\t// error.\n\t_, err = database.Open(dbType)\n\tif err != openError {\n\t\tt.Errorf(\"expected error not received - got: %v, want %v\", err,\n\t\t\topenError)\n\t\treturn\n\t}\n}\n\n// TestCreateOpenUnsupported ensures that attempting to create or open an\n// unsupported database type is handled properly.\nfunc TestCreateOpenUnsupported(t *testing.T) {\n\t// Ensure creating a database with an unsupported type fails with the\n\t// expected error.\n\ttestName := \"create with unsupported database type\"\n\tdbType := \"unsupported\"\n\t_, err := database.Create(dbType)\n\tif !checkDbError(t, testName, err, database.ErrDbUnknownType) {\n\t\treturn\n\t}\n\n\t// Ensure opening a database with the an unsupported type fails with the\n\t// expected error.\n\ttestName = \"open with unsupported database type\"\n\t_, err = database.Open(dbType)\n\tif !checkDbError(t, testName, err, database.ErrDbUnknownType) {\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "database/error.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage database\n\nimport \"fmt\"\n\n// ErrorCode identifies a kind of error.\ntype ErrorCode int\n\n// These constants are used to identify a specific database Error.\nconst (\n\t// **************************************\n\t// Errors related to driver registration.\n\t// **************************************\n\n\t// ErrDbTypeRegistered indicates two different database drivers\n\t// attempt to register with the name database type.\n\tErrDbTypeRegistered ErrorCode = iota\n\n\t// *************************************\n\t// Errors related to database functions.\n\t// *************************************\n\n\t// ErrDbUnknownType indicates there is no driver registered for\n\t// the specified database type.\n\tErrDbUnknownType\n\n\t// ErrDbDoesNotExist indicates open is called for a database that\n\t// does not exist.\n\tErrDbDoesNotExist\n\n\t// ErrDbExists indicates create is called for a database that\n\t// already exists.\n\tErrDbExists\n\n\t// ErrDbNotOpen indicates a database instance is accessed before\n\t// it is opened or after it is closed.\n\tErrDbNotOpen\n\n\t// ErrDbAlreadyOpen indicates open was called on a database that\n\t// is already open.\n\tErrDbAlreadyOpen\n\n\t// ErrInvalid indicates the specified database is not valid.\n\tErrInvalid\n\n\t// ErrCorruption indicates a checksum failure occurred which invariably\n\t// means the database is corrupt.\n\tErrCorruption\n\n\t// ****************************************\n\t// Errors related to database transactions.\n\t// ****************************************\n\n\t// ErrTxClosed indicates an attempt was made to commit or rollback a\n\t// transaction that has already had one of those operations performed.\n\tErrTxClosed\n\n\t// ErrTxNotWritable indicates an operation that requires write access to\n\t// the database was attempted against a read-only transaction.\n\tErrTxNotWritable\n\n\t// **************************************\n\t// Errors related to metadata operations.\n\t// **************************************\n\n\t// ErrBucketNotFound indicates an attempt to access a bucket that has\n\t// not been created yet.\n\tErrBucketNotFound\n\n\t// ErrBucketExists indicates an attempt to create a bucket that already\n\t// exists.\n\tErrBucketExists\n\n\t// ErrBucketNameRequired indicates an attempt to create a bucket with a\n\t// blank name.\n\tErrBucketNameRequired\n\n\t// ErrKeyRequired indicates at attempt to insert a zero-length key.\n\tErrKeyRequired\n\n\t// ErrKeyTooLarge indicates an attmempt to insert a key that is larger\n\t// than the max allowed key size.  The max key size depends on the\n\t// specific backend driver being used.  As a general rule, key sizes\n\t// should be relatively, so this should rarely be an issue.\n\tErrKeyTooLarge\n\n\t// ErrValueTooLarge indicates an attempt to insert a value that is larger\n\t// than max allowed value size.  The max key size depends on the\n\t// specific backend driver being used.\n\tErrValueTooLarge\n\n\t// ErrIncompatibleValue indicates the value in question is invalid for\n\t// the specific requested operation.  For example, trying create or\n\t// delete a bucket with an existing non-bucket key, attempting to create\n\t// or delete a non-bucket key with an existing bucket key, or trying to\n\t// delete a value via a cursor when it points to a nested bucket.\n\tErrIncompatibleValue\n\n\t// ***************************************\n\t// Errors related to block I/O operations.\n\t// ***************************************\n\n\t// ErrBlockNotFound indicates a block with the provided hash does not\n\t// exist in the database.\n\tErrBlockNotFound\n\n\t// ErrBlockExists indicates a block with the provided hash already\n\t// exists in the database.\n\tErrBlockExists\n\n\t// ErrBlockRegionInvalid indicates a region that exceeds the bounds of\n\t// the specified block was requested.  When the hash provided by the\n\t// region does not correspond to an existing block, the error will be\n\t// ErrBlockNotFound instead.\n\tErrBlockRegionInvalid\n\n\t// ***********************************\n\t// Support for driver-specific errors.\n\t// ***********************************\n\n\t// ErrDriverSpecific indicates the Err field is a driver-specific error.\n\t// This provides a mechanism for drivers to plug-in their own custom\n\t// errors for any situations which aren't already covered by the error\n\t// codes provided by this package.\n\tErrDriverSpecific\n\n\t// numErrorCodes is the maximum error code number used in tests.\n\tnumErrorCodes\n)\n\n// Map of ErrorCode values back to their constant names for pretty printing.\nvar errorCodeStrings = map[ErrorCode]string{\n\tErrDbTypeRegistered:   \"ErrDbTypeRegistered\",\n\tErrDbUnknownType:      \"ErrDbUnknownType\",\n\tErrDbDoesNotExist:     \"ErrDbDoesNotExist\",\n\tErrDbExists:           \"ErrDbExists\",\n\tErrDbNotOpen:          \"ErrDbNotOpen\",\n\tErrDbAlreadyOpen:      \"ErrDbAlreadyOpen\",\n\tErrInvalid:            \"ErrInvalid\",\n\tErrCorruption:         \"ErrCorruption\",\n\tErrTxClosed:           \"ErrTxClosed\",\n\tErrTxNotWritable:      \"ErrTxNotWritable\",\n\tErrBucketNotFound:     \"ErrBucketNotFound\",\n\tErrBucketExists:       \"ErrBucketExists\",\n\tErrBucketNameRequired: \"ErrBucketNameRequired\",\n\tErrKeyRequired:        \"ErrKeyRequired\",\n\tErrKeyTooLarge:        \"ErrKeyTooLarge\",\n\tErrValueTooLarge:      \"ErrValueTooLarge\",\n\tErrIncompatibleValue:  \"ErrIncompatibleValue\",\n\tErrBlockNotFound:      \"ErrBlockNotFound\",\n\tErrBlockExists:        \"ErrBlockExists\",\n\tErrBlockRegionInvalid: \"ErrBlockRegionInvalid\",\n\tErrDriverSpecific:     \"ErrDriverSpecific\",\n}\n\n// String returns the ErrorCode as a human-readable name.\nfunc (e ErrorCode) String() string {\n\tif s := errorCodeStrings[e]; s != \"\" {\n\t\treturn s\n\t}\n\treturn fmt.Sprintf(\"Unknown ErrorCode (%d)\", int(e))\n}\n\n// Error provides a single type for errors that can happen during database\n// operation.  It is used to indicate several types of failures including errors\n// with caller requests such as specifying invalid block regions or attempting\n// to access data against closed database transactions, driver errors, errors\n// retrieving data, and errors communicating with database servers.\n//\n// The caller can use type assertions to determine if an error is an Error and\n// access the ErrorCode field to ascertain the specific reason for the failure.\n//\n// The ErrDriverSpecific error code will also have the Err field set with the\n// underlying error.  Depending on the backend driver, the Err field might be\n// set to the underlying error for other error codes as well.\ntype Error struct {\n\tErrorCode   ErrorCode // Describes the kind of error\n\tDescription string    // Human readable description of the issue\n\tErr         error     // Underlying error\n}\n\n// Error satisfies the error interface and prints human-readable errors.\nfunc (e Error) Error() string {\n\tif e.Err != nil {\n\t\treturn e.Description + \": \" + e.Err.Error()\n\t}\n\treturn e.Description\n}\n\n// makeError creates an Error given a set of arguments.  The error code must\n// be one of the error codes provided by this package.\nfunc makeError(c ErrorCode, desc string, err error) Error {\n\treturn Error{ErrorCode: c, Description: desc, Err: err}\n}\n"
  },
  {
    "path": "database/error_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage database_test\n\nimport (\n\t\"errors\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/database\"\n)\n\n// TestErrorCodeStringer tests the stringized output for the ErrorCode type.\nfunc TestErrorCodeStringer(t *testing.T) {\n\ttests := []struct {\n\t\tin   database.ErrorCode\n\t\twant string\n\t}{\n\t\t{database.ErrDbTypeRegistered, \"ErrDbTypeRegistered\"},\n\t\t{database.ErrDbUnknownType, \"ErrDbUnknownType\"},\n\t\t{database.ErrDbDoesNotExist, \"ErrDbDoesNotExist\"},\n\t\t{database.ErrDbExists, \"ErrDbExists\"},\n\t\t{database.ErrDbNotOpen, \"ErrDbNotOpen\"},\n\t\t{database.ErrDbAlreadyOpen, \"ErrDbAlreadyOpen\"},\n\t\t{database.ErrInvalid, \"ErrInvalid\"},\n\t\t{database.ErrCorruption, \"ErrCorruption\"},\n\t\t{database.ErrTxClosed, \"ErrTxClosed\"},\n\t\t{database.ErrTxNotWritable, \"ErrTxNotWritable\"},\n\t\t{database.ErrBucketNotFound, \"ErrBucketNotFound\"},\n\t\t{database.ErrBucketExists, \"ErrBucketExists\"},\n\t\t{database.ErrBucketNameRequired, \"ErrBucketNameRequired\"},\n\t\t{database.ErrKeyRequired, \"ErrKeyRequired\"},\n\t\t{database.ErrKeyTooLarge, \"ErrKeyTooLarge\"},\n\t\t{database.ErrValueTooLarge, \"ErrValueTooLarge\"},\n\t\t{database.ErrIncompatibleValue, \"ErrIncompatibleValue\"},\n\t\t{database.ErrBlockNotFound, \"ErrBlockNotFound\"},\n\t\t{database.ErrBlockExists, \"ErrBlockExists\"},\n\t\t{database.ErrBlockRegionInvalid, \"ErrBlockRegionInvalid\"},\n\t\t{database.ErrDriverSpecific, \"ErrDriverSpecific\"},\n\n\t\t{0xffff, \"Unknown ErrorCode (65535)\"},\n\t}\n\n\t// Detect additional error codes that don't have the stringer added.\n\tif len(tests)-1 != int(database.TstNumErrorCodes) {\n\t\tt.Errorf(\"It appears an error code was added without adding \" +\n\t\t\t\"an associated stringer test\")\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.String()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"String #%d\\ngot: %s\\nwant: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestError tests the error output for the Error type.\nfunc TestError(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tin   database.Error\n\t\twant string\n\t}{\n\t\t{\n\t\t\tdatabase.Error{Description: \"some error\"},\n\t\t\t\"some error\",\n\t\t},\n\t\t{\n\t\t\tdatabase.Error{Description: \"human-readable error\"},\n\t\t\t\"human-readable error\",\n\t\t},\n\t\t{\n\t\t\tdatabase.Error{\n\t\t\t\tErrorCode:   database.ErrDriverSpecific,\n\t\t\t\tDescription: \"some error\",\n\t\t\t\tErr:         errors.New(\"driver-specific error\"),\n\t\t\t},\n\t\t\t\"some error: driver-specific error\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.Error()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"Error #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "database/example_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage database_test\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/database\"\n\t_ \"github.com/btcsuite/btcd/database/ffldb\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// This example demonstrates creating a new database.\nfunc ExampleCreate() {\n\t// This example assumes the ffldb driver is imported.\n\t//\n\t// import (\n\t// \t\"github.com/btcsuite/btcd/database\"\n\t// \t_ \"github.com/btcsuite/btcd/database/ffldb\"\n\t// )\n\n\t// Create a database and schedule it to be closed and removed on exit.\n\t// Typically you wouldn't want to remove the database right away like\n\t// this, nor put it in the temp directory, but it's done here to ensure\n\t// the example cleans up after itself.\n\tdbPath := filepath.Join(os.TempDir(), \"examplecreate\")\n\tdb, err := database.Create(\"ffldb\", dbPath, wire.MainNet)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tdefer os.RemoveAll(dbPath)\n\tdefer db.Close()\n\n\t// Output:\n}\n\n// This example demonstrates creating a new database and using a managed\n// read-write transaction to store and retrieve metadata.\nfunc Example_basicUsage() {\n\t// This example assumes the ffldb driver is imported.\n\t//\n\t// import (\n\t// \t\"github.com/btcsuite/btcd/database\"\n\t// \t_ \"github.com/btcsuite/btcd/database/ffldb\"\n\t// )\n\n\t// Create a database and schedule it to be closed and removed on exit.\n\t// Typically you wouldn't want to remove the database right away like\n\t// this, nor put it in the temp directory, but it's done here to ensure\n\t// the example cleans up after itself.\n\tdbPath := filepath.Join(os.TempDir(), \"exampleusage\")\n\tdb, err := database.Create(\"ffldb\", dbPath, wire.MainNet)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tdefer os.RemoveAll(dbPath)\n\tdefer db.Close()\n\n\t// Use the Update function of the database to perform a managed\n\t// read-write transaction.  The transaction will automatically be rolled\n\t// back if the supplied inner function returns a non-nil error.\n\terr = db.Update(func(tx database.Tx) error {\n\t\t// Store a key/value pair directly in the metadata bucket.\n\t\t// Typically a nested bucket would be used for a given feature,\n\t\t// but this example is using the metadata bucket directly for\n\t\t// simplicity.\n\t\tkey := []byte(\"mykey\")\n\t\tvalue := []byte(\"myvalue\")\n\t\tif err := tx.Metadata().Put(key, value); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Read the key back and ensure it matches.\n\t\tif !bytes.Equal(tx.Metadata().Get(key), value) {\n\t\t\treturn fmt.Errorf(\"unexpected value for key '%s'\", key)\n\t\t}\n\n\t\t// Create a new nested bucket under the metadata bucket.\n\t\tnestedBucketKey := []byte(\"mybucket\")\n\t\tnestedBucket, err := tx.Metadata().CreateBucket(nestedBucketKey)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// The key from above that was set in the metadata bucket does\n\t\t// not exist in this new nested bucket.\n\t\tif nestedBucket.Get(key) != nil {\n\t\t\treturn fmt.Errorf(\"key '%s' is not expected nil\", key)\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Output:\n}\n\n// This example demonstrates creating a new database, using a managed read-write\n// transaction to store a block, and using a managed read-only transaction to\n// fetch the block.\nfunc Example_blockStorageAndRetrieval() {\n\t// This example assumes the ffldb driver is imported.\n\t//\n\t// import (\n\t// \t\"github.com/btcsuite/btcd/database\"\n\t// \t_ \"github.com/btcsuite/btcd/database/ffldb\"\n\t// )\n\n\t// Create a database and schedule it to be closed and removed on exit.\n\t// Typically you wouldn't want to remove the database right away like\n\t// this, nor put it in the temp directory, but it's done here to ensure\n\t// the example cleans up after itself.\n\tdbPath, err := os.MkdirTemp(\"\", \"exampleblkstorage\")\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tdb, err := database.Create(\"ffldb\", dbPath, wire.MainNet)\n\tif err != nil {\n\t\tfmt.Println(\"fail here\")\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tdefer os.RemoveAll(dbPath)\n\tdefer db.Close()\n\n\t// Use the Update function of the database to perform a managed\n\t// read-write transaction and store a genesis block in the database as\n\t// and example.\n\terr = db.Update(func(tx database.Tx) error {\n\t\tgenesisBlock := chaincfg.MainNetParams.GenesisBlock\n\t\treturn tx.StoreBlock(btcutil.NewBlock(genesisBlock))\n\t})\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Use the View function of the database to perform a managed read-only\n\t// transaction and fetch the block stored above.\n\tvar loadedBlockBytes []byte\n\terr = db.Update(func(tx database.Tx) error {\n\t\tgenesisHash := chaincfg.MainNetParams.GenesisHash\n\t\tblockBytes, err := tx.FetchBlock(genesisHash)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// As documented, all data fetched from the database is only\n\t\t// valid during a database transaction in order to support\n\t\t// zero-copy backends.  Thus, make a copy of the data so it\n\t\t// can be used outside of the transaction.\n\t\tloadedBlockBytes = make([]byte, len(blockBytes))\n\t\tcopy(loadedBlockBytes, blockBytes)\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Typically at this point, the block could be deserialized via the\n\t// wire.MsgBlock.Deserialize function or used in its serialized form\n\t// depending on need.  However, for this example, just display the\n\t// number of serialized bytes to show it was loaded as expected.\n\tfmt.Printf(\"Serialized block size: %d bytes\\n\", len(loadedBlockBytes))\n\n\t// Output:\n\t// Serialized block size: 285 bytes\n}\n"
  },
  {
    "path": "database/export_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nThis test file is part of the database package rather than than the\ndatabase_test package so it can bridge access to the internals to properly test\ncases which are either not possible or can't reliably be tested via the public\ninterface.  The functions, constants, and variables are only exported while the\ntests are being run.\n*/\n\npackage database\n\n// TstNumErrorCodes makes the internal numErrorCodes parameter available to the\n// test package.\nconst TstNumErrorCodes = numErrorCodes\n"
  },
  {
    "path": "database/ffldb/README.md",
    "content": "ffldb\n=====\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://pkg.go.dev/github.com/btcsuite/btcd/database/ffldb?status.png)](https://pkg.go.dev/github.com/btcsuite/btcd/database/ffldb)\n=======\n\nPackage ffldb implements a driver for the database package that uses leveldb for\nthe backing metadata and flat files for block storage.\n\nThis driver is the recommended driver for use with btcd.  It makes use leveldb\nfor the metadata, flat files for block storage, and checksums in key areas to\nensure data integrity.\n\nPackage ffldb is licensed under the copyfree ISC license.\n\n## Usage\n\nThis package is a driver to the database package and provides the database type\nof \"ffldb\".  The parameters the Open and Create functions take are the\ndatabase path as a string and the block network.\n\n```Go\ndb, err := database.Open(\"ffldb\", \"path/to/database\", wire.MainNet)\nif err != nil {\n\t// Handle error\n}\n```\n\n```Go\ndb, err := database.Create(\"ffldb\", \"path/to/database\", wire.MainNet)\nif err != nil {\n\t// Handle error\n}\n```\n\n## License\n\nPackage ffldb is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "database/ffldb/bench_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ffldb\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/database\"\n)\n\n// BenchmarkBlockHeader benchmarks how long it takes to load the mainnet genesis\n// block header.\nfunc BenchmarkBlockHeader(b *testing.B) {\n\t// Start by creating a new database and populating it with the mainnet\n\t// genesis block.\n\tdbPath := filepath.Join(os.TempDir(), \"ffldb-benchblkhdr\")\n\t_ = os.RemoveAll(dbPath)\n\tdb, err := database.Create(\"ffldb\", dbPath, blockDataNet)\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\tdefer os.RemoveAll(dbPath)\n\tdefer db.Close()\n\terr = db.Update(func(tx database.Tx) error {\n\t\tblock := btcutil.NewBlock(chaincfg.MainNetParams.GenesisBlock)\n\t\treturn tx.StoreBlock(block)\n\t})\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\terr = db.View(func(tx database.Tx) error {\n\t\tblockHash := chaincfg.MainNetParams.GenesisHash\n\t\tfor i := 0; i < b.N; i++ {\n\t\t\t_, err := tx.FetchBlockHeader(blockHash)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\n\t// Don't benchmark teardown.\n\tb.StopTimer()\n}\n\n// BenchmarkBlockHeader benchmarks how long it takes to load the mainnet genesis\n// block.\nfunc BenchmarkBlock(b *testing.B) {\n\t// Start by creating a new database and populating it with the mainnet\n\t// genesis block.\n\tdbPath := filepath.Join(os.TempDir(), \"ffldb-benchblk\")\n\t_ = os.RemoveAll(dbPath)\n\tdb, err := database.Create(\"ffldb\", dbPath, blockDataNet)\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\tdefer os.RemoveAll(dbPath)\n\tdefer db.Close()\n\terr = db.Update(func(tx database.Tx) error {\n\t\tblock := btcutil.NewBlock(chaincfg.MainNetParams.GenesisBlock)\n\t\treturn tx.StoreBlock(block)\n\t})\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\terr = db.View(func(tx database.Tx) error {\n\t\tblockHash := chaincfg.MainNetParams.GenesisHash\n\t\tfor i := 0; i < b.N; i++ {\n\t\t\t_, err := tx.FetchBlock(blockHash)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\n\t// Don't benchmark teardown.\n\tb.StopTimer()\n}\n"
  },
  {
    "path": "database/ffldb/blockio.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// This file contains the implementation functions for reading, writing, and\n// otherwise working with the flat files that house the actual blocks.\n\npackage ffldb\n\nimport (\n\t\"container/list\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// blockFileExtension is the extension that's used to store the block\n\t// files on the disk.\n\tblockFileExtension = \".fdb\"\n\n\t// The Bitcoin protocol encodes block height as int32, so max number of\n\t// blocks is 2^31.  Max block size per the protocol is 32MiB per block.\n\t// So the theoretical max at the time this comment was written is 64PiB\n\t// (pebibytes).  With files @ 512MiB each, this would require a maximum\n\t// of 134,217,728 files.  Thus, choose 9 digits of precision for the\n\t// filenames.  An additional benefit is 9 digits provides 10^9 files @\n\t// 512MiB each for a total of ~476.84PiB (roughly 7.4 times the current\n\t// theoretical max), so there is room for the max block size to grow in\n\t// the future.\n\tblockFilenameTemplate = \"%09d\" + blockFileExtension\n\n\t// maxOpenFiles is the max number of open files to maintain in the\n\t// open blocks cache.  Note that this does not include the current\n\t// write file, so there will typically be one more than this value open.\n\tmaxOpenFiles = 25\n\n\t// maxBlockFileSize is the maximum size for each file used to store\n\t// blocks.\n\t//\n\t// NOTE: The current code uses uint32 for all offsets, so this value\n\t// must be less than 2^32 (4 GiB).  This is also why it's a typed\n\t// constant.\n\tmaxBlockFileSize uint32 = 512 * 1024 * 1024 // 512 MiB\n\n\t// blockLocSize is the number of bytes the serialized block location\n\t// data that is stored in the block index.\n\t//\n\t// The serialized block location format is:\n\t//\n\t//  [0:4]  Block file (4 bytes)\n\t//  [4:8]  File offset (4 bytes)\n\t//  [8:12] Block length (4 bytes)\n\tblockLocSize = 12\n)\n\nvar (\n\t// castagnoli houses the Catagnoli polynomial used for CRC-32 checksums.\n\tcastagnoli = crc32.MakeTable(crc32.Castagnoli)\n)\n\n// filer is an interface which acts very similar to a *os.File and is typically\n// implemented by it.  It exists so the test code can provide mock files for\n// properly testing corruption and file system issues.\ntype filer interface {\n\tio.Closer\n\tio.WriterAt\n\tio.ReaderAt\n\tTruncate(size int64) error\n\tSync() error\n}\n\n// lockableFile represents a block file on disk that has been opened for either\n// read or read/write access.  It also contains a read-write mutex to support\n// multiple concurrent readers.\ntype lockableFile struct {\n\tsync.RWMutex\n\tfile filer\n}\n\n// writeCursor represents the current file and offset of the block file on disk\n// for performing all writes. It also contains a read-write mutex to support\n// multiple concurrent readers which can reuse the file handle.\ntype writeCursor struct {\n\tsync.RWMutex\n\n\t// curFile is the current block file that will be appended to when\n\t// writing new blocks.\n\tcurFile *lockableFile\n\n\t// curFileNum is the current block file number and is used to allow\n\t// readers to use the same open file handle.\n\tcurFileNum uint32\n\n\t// curOffset is the offset in the current write block file where the\n\t// next new block will be written.\n\tcurOffset uint32\n}\n\n// blockStore houses information used to handle reading and writing blocks (and\n// part of blocks) into flat files with support for multiple concurrent readers.\ntype blockStore struct {\n\t// network is the specific network to use in the flat files for each\n\t// block.\n\tnetwork wire.BitcoinNet\n\n\t// basePath is the base path used for the flat block files and metadata.\n\tbasePath string\n\n\t// maxBlockFileSize is the maximum size for each file used to store\n\t// blocks.  It is defined on the store so the whitebox tests can\n\t// override the value.\n\tmaxBlockFileSize uint32\n\n\t// The following fields are related to the flat files which hold the\n\t// actual blocks.   The number of open files is limited by maxOpenFiles.\n\t//\n\t// obfMutex protects concurrent access to the openBlockFiles map.  It is\n\t// a RWMutex so multiple readers can simultaneously access open files.\n\t//\n\t// openBlockFiles houses the open file handles for existing block files\n\t// which have been opened read-only along with an individual RWMutex.\n\t// This scheme allows multiple concurrent readers to the same file while\n\t// preventing the file from being closed out from under them.\n\t//\n\t// lruMutex protects concurrent access to the least recently used list\n\t// and lookup map.\n\t//\n\t// openBlocksLRU tracks how the open files are referenced by pushing the\n\t// most recently used files to the front of the list thereby trickling\n\t// the least recently used files to end of the list.  When a file needs\n\t// to be closed due to exceeding the max number of allowed open\n\t// files, the one at the end of the list is closed.\n\t//\n\t// fileNumToLRUElem is a mapping between a specific block file number\n\t// and the associated list element on the least recently used list.\n\t//\n\t// Thus, with the combination of these fields, the database supports\n\t// concurrent non-blocking reads across multiple and individual files\n\t// along with intelligently limiting the number of open file handles by\n\t// closing the least recently used files as needed.\n\t//\n\t// NOTE: The locking order used throughout is well-defined and MUST be\n\t// followed.  Failure to do so could lead to deadlocks.  In particular,\n\t// the locking order is as follows:\n\t//   1) obfMutex\n\t//   2) lruMutex\n\t//   3) writeCursor mutex\n\t//   4) specific file mutexes\n\t//\n\t// None of the mutexes are required to be locked at the same time, and\n\t// often aren't.  However, if they are to be locked simultaneously, they\n\t// MUST be locked in the order previously specified.\n\t//\n\t// Due to the high performance and multi-read concurrency requirements,\n\t// write locks should only be held for the minimum time necessary.\n\tobfMutex         sync.RWMutex\n\tlruMutex         sync.Mutex\n\topenBlocksLRU    *list.List // Contains uint32 block file numbers.\n\tfileNumToLRUElem map[uint32]*list.Element\n\topenBlockFiles   map[uint32]*lockableFile\n\n\t// writeCursor houses the state for the current file and location that\n\t// new blocks are written to.\n\twriteCursor *writeCursor\n\n\t// These functions are set to openFile, openWriteFile, and deleteFile by\n\t// default, but are exposed here to allow the whitebox tests to replace\n\t// them when working with mock files.\n\topenFileFunc      func(fileNum uint32) (*lockableFile, error)\n\topenWriteFileFunc func(fileNum uint32) (filer, error)\n\tdeleteFileFunc    func(fileNum uint32) error\n}\n\n// blockLocation identifies a particular block file and location.\ntype blockLocation struct {\n\tblockFileNum uint32\n\tfileOffset   uint32\n\tblockLen     uint32\n}\n\n// deserializeBlockLoc deserializes the passed serialized block location\n// information.  This is data stored into the block index metadata for each\n// block.  The serialized data passed to this function MUST be at least\n// blockLocSize bytes or it will panic.  The error check is avoided here because\n// this information will always be coming from the block index which includes a\n// checksum to detect corruption.  Thus it is safe to use this unchecked here.\nfunc deserializeBlockLoc(serializedLoc []byte) blockLocation {\n\t// The serialized block location format is:\n\t//\n\t//  [0:4]  Block file (4 bytes)\n\t//  [4:8]  File offset (4 bytes)\n\t//  [8:12] Block length (4 bytes)\n\treturn blockLocation{\n\t\tblockFileNum: byteOrder.Uint32(serializedLoc[0:4]),\n\t\tfileOffset:   byteOrder.Uint32(serializedLoc[4:8]),\n\t\tblockLen:     byteOrder.Uint32(serializedLoc[8:12]),\n\t}\n}\n\n// serializeBlockLoc returns the serialization of the passed block location.\n// This is data to be stored into the block index metadata for each block.\nfunc serializeBlockLoc(loc blockLocation) []byte {\n\t// The serialized block location format is:\n\t//\n\t//  [0:4]  Block file (4 bytes)\n\t//  [4:8]  File offset (4 bytes)\n\t//  [8:12] Block length (4 bytes)\n\tvar serializedData [12]byte\n\tbyteOrder.PutUint32(serializedData[0:4], loc.blockFileNum)\n\tbyteOrder.PutUint32(serializedData[4:8], loc.fileOffset)\n\tbyteOrder.PutUint32(serializedData[8:12], loc.blockLen)\n\treturn serializedData[:]\n}\n\n// blockFilePath returns the file path for the provided block file number.\nfunc blockFilePath(dbPath string, fileNum uint32) string {\n\tfileName := fmt.Sprintf(blockFilenameTemplate, fileNum)\n\treturn filepath.Join(dbPath, fileName)\n}\n\n// openWriteFile returns a file handle for the passed flat file number in\n// read/write mode.  The file will be created if needed.  It is typically used\n// for the current file that will have all new data appended.  Unlike openFile,\n// this function does not keep track of the open file and it is not subject to\n// the maxOpenFiles limit.\nfunc (s *blockStore) openWriteFile(fileNum uint32) (filer, error) {\n\t// The current block file needs to be read-write so it is possible to\n\t// append to it.  Also, it shouldn't be part of the least recently used\n\t// file.\n\tfilePath := blockFilePath(s.basePath, fileNum)\n\tfile, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0666)\n\tif err != nil {\n\t\tstr := fmt.Sprintf(\"failed to open file %q: %v\", filePath, err)\n\t\treturn nil, makeDbErr(database.ErrDriverSpecific, str, err)\n\t}\n\n\treturn file, nil\n}\n\n// openFile returns a read-only file handle for the passed flat file number.\n// The function also keeps track of the open files, performs least recently\n// used tracking, and limits the number of open files to maxOpenFiles by closing\n// the least recently used file as needed.\n//\n// This function MUST be called with the overall files mutex (s.obfMutex) locked\n// for WRITES.\nfunc (s *blockStore) openFile(fileNum uint32) (*lockableFile, error) {\n\t// Open the appropriate file as read-only.\n\tfilePath := blockFilePath(s.basePath, fileNum)\n\tfile, err := os.Open(filePath)\n\tif err != nil {\n\t\treturn nil, makeDbErr(database.ErrDriverSpecific, err.Error(),\n\t\t\terr)\n\t}\n\tblockFile := &lockableFile{file: file}\n\n\t// Close the least recently used file if the file exceeds the max\n\t// allowed open files.  This is not done until after the file open in\n\t// case the file fails to open, there is no need to close any files.\n\t//\n\t// A write lock is required on the LRU list here to protect against\n\t// modifications happening as already open files are read from and\n\t// shuffled to the front of the list.\n\t//\n\t// Also, add the file that was just opened to the front of the least\n\t// recently used list to indicate it is the most recently used file and\n\t// therefore should be closed last.\n\ts.lruMutex.Lock()\n\tlruList := s.openBlocksLRU\n\tif lruList.Len() >= maxOpenFiles {\n\t\tlruFileNum := lruList.Remove(lruList.Back()).(uint32)\n\t\ts.closeFile(lruFileNum)\n\t}\n\ts.fileNumToLRUElem[fileNum] = lruList.PushFront(fileNum)\n\ts.lruMutex.Unlock()\n\n\t// Store a reference to it in the open block files map.\n\ts.openBlockFiles[fileNum] = blockFile\n\n\treturn blockFile, nil\n}\n\n// closeFile checks that the file corresponding to the file number is open and\n// if it is, it closes it in a concurrency safe manner and cleans up associated\n// data in the blockstore struct.\nfunc (s *blockStore) closeFile(fileNum uint32) {\n\tblockFile := s.openBlockFiles[fileNum]\n\tif blockFile == nil {\n\t\treturn\n\t}\n\n\t// Close the old file under the write lock for the file in case\n\t// any readers are currently reading from it so it's not closed\n\t// out from under them.\n\tblockFile.Lock()\n\t_ = blockFile.file.Close()\n\tblockFile.Unlock()\n\n\tdelete(s.openBlockFiles, fileNum)\n\tdelete(s.fileNumToLRUElem, fileNum)\n}\n\n// deleteFile removes the block file for the passed flat file number.  The file\n// must already be closed and it is the responsibility of the caller to do any\n// other state cleanup necessary.\nfunc (s *blockStore) deleteFile(fileNum uint32) error {\n\tfilePath := blockFilePath(s.basePath, fileNum)\n\tblockFile := s.openBlockFiles[fileNum]\n\tif blockFile != nil {\n\t\terr := fmt.Errorf(\"attempted to delete open file at %v\", filePath)\n\t\treturn makeDbErr(database.ErrDriverSpecific, err.Error(), err)\n\t}\n\tif err := os.Remove(filePath); err != nil {\n\t\treturn makeDbErr(database.ErrDriverSpecific, err.Error(), err)\n\t}\n\n\treturn nil\n}\n\n// blockFile attempts to return an existing file handle for the passed flat file\n// number if it is already open as well as marking it as most recently used.  It\n// will also open the file when it's not already open subject to the rules\n// described in openFile.\n//\n// NOTE: The returned block file will already have the read lock acquired and\n// the caller MUST call .RUnlock() to release it once it has finished all read\n// operations.  This is necessary because otherwise it would be possible for a\n// separate goroutine to close the file after it is returned from here, but\n// before the caller has acquired a read lock.\nfunc (s *blockStore) blockFile(fileNum uint32) (*lockableFile, error) {\n\t// When the requested block file is open for writes, return it.\n\twc := s.writeCursor\n\twc.RLock()\n\tif fileNum == wc.curFileNum && wc.curFile.file != nil {\n\t\tobf := wc.curFile\n\t\tobf.RLock()\n\t\twc.RUnlock()\n\t\treturn obf, nil\n\t}\n\twc.RUnlock()\n\n\t// Try to return an open file under the overall files read lock.\n\ts.obfMutex.RLock()\n\tif obf, ok := s.openBlockFiles[fileNum]; ok {\n\t\ts.lruMutex.Lock()\n\t\ts.openBlocksLRU.MoveToFront(s.fileNumToLRUElem[fileNum])\n\t\ts.lruMutex.Unlock()\n\n\t\tobf.RLock()\n\t\ts.obfMutex.RUnlock()\n\t\treturn obf, nil\n\t}\n\ts.obfMutex.RUnlock()\n\n\t// Since the file isn't open already, need to check the open block files\n\t// map again under write lock in case multiple readers got here and a\n\t// separate one is already opening the file.\n\ts.obfMutex.Lock()\n\tif obf, ok := s.openBlockFiles[fileNum]; ok {\n\t\tobf.RLock()\n\t\ts.obfMutex.Unlock()\n\t\treturn obf, nil\n\t}\n\n\t// The file isn't open, so open it while potentially closing the least\n\t// recently used one as needed.\n\tobf, err := s.openFileFunc(fileNum)\n\tif err != nil {\n\t\ts.obfMutex.Unlock()\n\t\treturn nil, err\n\t}\n\tobf.RLock()\n\ts.obfMutex.Unlock()\n\treturn obf, nil\n}\n\n// writeData is a helper function for writeBlock which writes the provided data\n// at the current write offset and updates the write cursor accordingly.  The\n// field name parameter is only used when there is an error to provide a nicer\n// error message.\n//\n// The write cursor will be advanced the number of bytes actually written in the\n// event of failure.\n//\n// NOTE: This function MUST be called with the write cursor current file lock\n// held and must only be called during a write transaction so it is effectively\n// locked for writes.  Also, the write cursor current file must NOT be nil.\nfunc (s *blockStore) writeData(data []byte, fieldName string) error {\n\twc := s.writeCursor\n\tn, err := wc.curFile.file.WriteAt(data, int64(wc.curOffset))\n\twc.curOffset += uint32(n)\n\tif err != nil {\n\t\tif errors.Is(err, syscall.ENOSPC) {\n\t\t\tlog.Errorf(\"%v. Cannot save any more blocks \"+\n\t\t\t\t\"due to the disk being full \"+\n\t\t\t\t\"-- exiting\", err)\n\t\t\tos.Exit(1)\n\t\t}\n\t\tstr := fmt.Sprintf(\"failed to write %s to file %d at \"+\n\t\t\t\"offset %d: %v\", fieldName, wc.curFileNum,\n\t\t\twc.curOffset-uint32(n), err)\n\t\treturn makeDbErr(database.ErrDriverSpecific, str, err)\n\t}\n\n\treturn nil\n}\n\n// writeBlock appends the specified raw block bytes to the store's write cursor\n// location and increments it accordingly.  When the block would exceed the max\n// file size for the current flat file, this function will close the current\n// file, create the next file, update the write cursor, and write the block to\n// the new file.\n//\n// The write cursor will also be advanced the number of bytes actually written\n// in the event of failure.\n//\n// Format: <network><block length><serialized block><checksum>\nfunc (s *blockStore) writeBlock(rawBlock []byte) (blockLocation, error) {\n\t// Compute how many bytes will be written.\n\t// 4 bytes each for block network + 4 bytes for block length +\n\t// length of raw block + 4 bytes for checksum.\n\tblockLen := uint32(len(rawBlock))\n\tfullLen := blockLen + 12\n\n\t// Move to the next block file if adding the new block would exceed the\n\t// max allowed size for the current block file.  Also detect overflow\n\t// to be paranoid, even though it isn't possible currently, numbers\n\t// might change in the future to make it possible.\n\t//\n\t// NOTE: The writeCursor.offset field isn't protected by the mutex\n\t// since it's only read/changed during this function which can only be\n\t// called during a write transaction, of which there can be only one at\n\t// a time.\n\twc := s.writeCursor\n\tfinalOffset := wc.curOffset + fullLen\n\tif finalOffset < wc.curOffset || finalOffset > s.maxBlockFileSize {\n\t\t// This is done under the write cursor lock since the curFileNum\n\t\t// field is accessed elsewhere by readers.\n\t\t//\n\t\t// Close the current write file to force a read-only reopen\n\t\t// with LRU tracking.  The close is done under the write lock\n\t\t// for the file to prevent it from being closed out from under\n\t\t// any readers currently reading from it.\n\t\twc.Lock()\n\t\twc.curFile.Lock()\n\t\tif wc.curFile.file != nil {\n\t\t\t_ = wc.curFile.file.Close()\n\t\t\twc.curFile.file = nil\n\t\t}\n\t\twc.curFile.Unlock()\n\n\t\t// Start writes into next file.\n\t\twc.curFileNum++\n\t\twc.curOffset = 0\n\t\twc.Unlock()\n\t}\n\n\t// All writes are done under the write lock for the file to ensure any\n\t// readers are finished and blocked first.\n\twc.curFile.Lock()\n\tdefer wc.curFile.Unlock()\n\n\t// Open the current file if needed.  This will typically only be the\n\t// case when moving to the next file to write to or on initial database\n\t// load.  However, it might also be the case if rollbacks happened after\n\t// file writes started during a transaction commit.\n\tif wc.curFile.file == nil {\n\t\tfile, err := s.openWriteFileFunc(wc.curFileNum)\n\t\tif err != nil {\n\t\t\treturn blockLocation{}, err\n\t\t}\n\t\twc.curFile.file = file\n\t}\n\n\t// Bitcoin network.\n\torigOffset := wc.curOffset\n\thasher := crc32.New(castagnoli)\n\tvar scratch [4]byte\n\tbyteOrder.PutUint32(scratch[:], uint32(s.network))\n\tif err := s.writeData(scratch[:], \"network\"); err != nil {\n\t\treturn blockLocation{}, err\n\t}\n\t_, _ = hasher.Write(scratch[:])\n\n\t// Block length.\n\tbyteOrder.PutUint32(scratch[:], blockLen)\n\tif err := s.writeData(scratch[:], \"block length\"); err != nil {\n\t\treturn blockLocation{}, err\n\t}\n\t_, _ = hasher.Write(scratch[:])\n\n\t// Serialized block.\n\tif err := s.writeData(rawBlock, \"block\"); err != nil {\n\t\treturn blockLocation{}, err\n\t}\n\t_, _ = hasher.Write(rawBlock)\n\n\t// Castagnoli CRC-32 as a checksum of all the previous.\n\tif err := s.writeData(hasher.Sum(nil), \"checksum\"); err != nil {\n\t\treturn blockLocation{}, err\n\t}\n\n\tloc := blockLocation{\n\t\tblockFileNum: wc.curFileNum,\n\t\tfileOffset:   origOffset,\n\t\tblockLen:     fullLen,\n\t}\n\treturn loc, nil\n}\n\n// readBlock reads the specified block record and returns the serialized block.\n// It ensures the integrity of the block data by checking that the serialized\n// network matches the current network associated with the block store and\n// comparing the calculated checksum against the one stored in the flat file.\n// This function also automatically handles all file management such as opening\n// and closing files as necessary to stay within the maximum allowed open files\n// limit.\n//\n// Returns ErrDriverSpecific if the data fails to read for any reason and\n// ErrCorruption if the checksum of the read data doesn't match the checksum\n// read from the file.\n//\n// Format: <network><block length><serialized block><checksum>\nfunc (s *blockStore) readBlock(hash *chainhash.Hash, loc blockLocation) ([]byte, error) {\n\t// Get the referenced block file handle opening the file as needed.  The\n\t// function also handles closing files as needed to avoid going over the\n\t// max allowed open files.\n\tblockFile, err := s.blockFile(loc.blockFileNum)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tserializedData := make([]byte, loc.blockLen)\n\tn, err := blockFile.file.ReadAt(serializedData, int64(loc.fileOffset))\n\tblockFile.RUnlock()\n\tif err != nil {\n\t\tstr := fmt.Sprintf(\"failed to read block %s from file %d, \"+\n\t\t\t\"offset %d: %v\", hash, loc.blockFileNum, loc.fileOffset,\n\t\t\terr)\n\t\treturn nil, makeDbErr(database.ErrDriverSpecific, str, err)\n\t}\n\n\t// Calculate the checksum of the read data and ensure it matches the\n\t// serialized checksum.  This will detect any data corruption in the\n\t// flat file without having to do much more expensive merkle root\n\t// calculations on the loaded block.\n\tserializedChecksum := binary.BigEndian.Uint32(serializedData[n-4:])\n\tcalculatedChecksum := crc32.Checksum(serializedData[:n-4], castagnoli)\n\tif serializedChecksum != calculatedChecksum {\n\t\tstr := fmt.Sprintf(\"block data for block %s checksum \"+\n\t\t\t\"does not match - got %x, want %x\", hash,\n\t\t\tcalculatedChecksum, serializedChecksum)\n\t\treturn nil, makeDbErr(database.ErrCorruption, str, nil)\n\t}\n\n\t// The network associated with the block must match the current active\n\t// network, otherwise somebody probably put the block files for the\n\t// wrong network in the directory.\n\tserializedNet := byteOrder.Uint32(serializedData[:4])\n\tif serializedNet != uint32(s.network) {\n\t\tstr := fmt.Sprintf(\"block data for block %s is for the \"+\n\t\t\t\"wrong network - got %d, want %d\", hash, serializedNet,\n\t\t\tuint32(s.network))\n\t\treturn nil, makeDbErr(database.ErrDriverSpecific, str, nil)\n\t}\n\n\t// The raw block excludes the network, length of the block, and\n\t// checksum.\n\treturn serializedData[8 : n-4], nil\n}\n\n// readBlockRegion reads the specified amount of data at the provided offset for\n// a given block location.  The offset is relative to the start of the\n// serialized block (as opposed to the beginning of the block record).  This\n// function automatically handles all file management such as opening and\n// closing files as necessary to stay within the maximum allowed open files\n// limit.\n//\n// Returns ErrDriverSpecific if the data fails to read for any reason.\nfunc (s *blockStore) readBlockRegion(loc blockLocation, offset, numBytes uint32) ([]byte, error) {\n\t// Get the referenced block file handle opening the file as needed.  The\n\t// function also handles closing files as needed to avoid going over the\n\t// max allowed open files.\n\tblockFile, err := s.blockFile(loc.blockFileNum)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Regions are offsets into the actual block, however the serialized\n\t// data for a block includes an initial 4 bytes for network + 4 bytes\n\t// for block length.  Thus, add 8 bytes to adjust.\n\treadOffset := loc.fileOffset + 8 + offset\n\tserializedData := make([]byte, numBytes)\n\t_, err = blockFile.file.ReadAt(serializedData, int64(readOffset))\n\tblockFile.RUnlock()\n\tif err != nil {\n\t\tstr := fmt.Sprintf(\"failed to read region from block file %d, \"+\n\t\t\t\"offset %d, len %d: %v\", loc.blockFileNum, readOffset,\n\t\t\tnumBytes, err)\n\t\treturn nil, makeDbErr(database.ErrDriverSpecific, str, err)\n\t}\n\n\treturn serializedData, nil\n}\n\n// syncBlocks performs a file system sync on the flat file associated with the\n// store's current write cursor.  It is safe to call even when there is not a\n// current write file in which case it will have no effect.\n//\n// This is used when flushing cached metadata updates to disk to ensure all the\n// block data is fully written before updating the metadata.  This ensures the\n// metadata and block data can be properly reconciled in failure scenarios.\nfunc (s *blockStore) syncBlocks() error {\n\twc := s.writeCursor\n\twc.RLock()\n\tdefer wc.RUnlock()\n\n\t// Nothing to do if there is no current file associated with the write\n\t// cursor.\n\twc.curFile.RLock()\n\tdefer wc.curFile.RUnlock()\n\tif wc.curFile.file == nil {\n\t\treturn nil\n\t}\n\n\t// Sync the file to disk.\n\tif err := wc.curFile.file.Sync(); err != nil {\n\t\tif errors.Is(err, syscall.ENOSPC) {\n\t\t\tlog.Errorf(\"%v. Cannot save any more blocks \"+\n\t\t\t\t\"due to the disk being full \"+\n\t\t\t\t\"-- exiting\", err)\n\t\t\tos.Exit(1)\n\t\t}\n\t\tstr := fmt.Sprintf(\"failed to sync file %d: %v\", wc.curFileNum,\n\t\t\terr)\n\t\treturn makeDbErr(database.ErrDriverSpecific, str, err)\n\t}\n\n\treturn nil\n}\n\n// handleRollback rolls the block files on disk back to the provided file number\n// and offset.  This involves potentially deleting and truncating the files that\n// were partially written.\n//\n// There are effectively two scenarios to consider here:\n//  1. Transient write failures from which recovery is possible\n//  2. More permanent failures such as hard disk death and/or removal\n//\n// In either case, the write cursor will be repositioned to the old block file\n// offset regardless of any other errors that occur while attempting to undo\n// writes.\n//\n// For the first scenario, this will lead to any data which failed to be undone\n// being overwritten and thus behaves as desired as the system continues to run.\n//\n// For the second scenario, the metadata which stores the current write cursor\n// position within the block files will not have been updated yet and thus if\n// the system eventually recovers (perhaps the hard drive is reconnected), it\n// will also lead to any data which failed to be undone being overwritten and\n// thus behaves as desired.\n//\n// Therefore, any errors are simply logged at a warning level rather than being\n// returned since there is nothing more that could be done about it anyways.\nfunc (s *blockStore) handleRollback(oldBlockFileNum, oldBlockOffset uint32) {\n\t// Grab the write cursor mutex since it is modified throughout this\n\t// function.\n\twc := s.writeCursor\n\twc.Lock()\n\tdefer wc.Unlock()\n\n\t// Nothing to do if the rollback point is the same as the current write\n\t// cursor.\n\tif wc.curFileNum == oldBlockFileNum && wc.curOffset == oldBlockOffset {\n\t\treturn\n\t}\n\n\t// Regardless of any failures that happen below, reposition the write\n\t// cursor to the old block file and offset.\n\tdefer func() {\n\t\twc.curFileNum = oldBlockFileNum\n\t\twc.curOffset = oldBlockOffset\n\t}()\n\n\tlog.Debugf(\"ROLLBACK: Rolling back to file %d, offset %d\",\n\t\toldBlockFileNum, oldBlockOffset)\n\n\t// Close the current write file if it needs to be deleted.  Then delete\n\t// all files that are newer than the provided rollback file while\n\t// also moving the write cursor file backwards accordingly.\n\tif wc.curFileNum > oldBlockFileNum {\n\t\twc.curFile.Lock()\n\t\tif wc.curFile.file != nil {\n\t\t\t_ = wc.curFile.file.Close()\n\t\t\twc.curFile.file = nil\n\t\t}\n\t\twc.curFile.Unlock()\n\t}\n\tfor ; wc.curFileNum > oldBlockFileNum; wc.curFileNum-- {\n\t\tif err := s.deleteFileFunc(wc.curFileNum); err != nil {\n\t\t\tlog.Warnf(\"ROLLBACK: Failed to delete block file \"+\n\t\t\t\t\"number %d: %v\", wc.curFileNum, err)\n\t\t\treturn\n\t\t}\n\t}\n\n\t// Open the file for the current write cursor if needed.\n\twc.curFile.Lock()\n\tif wc.curFile.file == nil {\n\t\tobf, err := s.openWriteFileFunc(wc.curFileNum)\n\t\tif err != nil {\n\t\t\twc.curFile.Unlock()\n\t\t\tlog.Warnf(\"ROLLBACK: %v\", err)\n\t\t\treturn\n\t\t}\n\t\twc.curFile.file = obf\n\t}\n\n\t// Truncate the to the provided rollback offset.\n\tif err := wc.curFile.file.Truncate(int64(oldBlockOffset)); err != nil {\n\t\twc.curFile.Unlock()\n\t\tlog.Warnf(\"ROLLBACK: Failed to truncate file %d: %v\",\n\t\t\twc.curFileNum, err)\n\t\treturn\n\t}\n\n\t// Sync the file to disk.\n\terr := wc.curFile.file.Sync()\n\twc.curFile.Unlock()\n\tif err != nil {\n\t\tlog.Warnf(\"ROLLBACK: Failed to sync file %d: %v\",\n\t\t\twc.curFileNum, err)\n\t\treturn\n\t}\n}\n\n// scanBlockFiles searches the database directory for all flat block files to\n// find the first file, last file, and the end of the most recent file.  The\n// position at the last file is considered the current write cursor which is\n// also stored in the metadata.  Thus, it is used to detect unexpected shutdowns\n// in the middle of writes so the block files can be reconciled.\nfunc scanBlockFiles(dbPath string) (int, int, uint32, error) {\n\tfirstFile, lastFile, lastFileLen, err := int(-1), int(-1), uint32(0), error(nil)\n\n\tfiles, err := filepath.Glob(filepath.Join(dbPath, \"*\"+blockFileExtension))\n\tif err != nil {\n\t\treturn 0, 0, 0, err\n\t}\n\tsort.Strings(files)\n\n\t// Return early if there's no block files.\n\tif len(files) == 0 {\n\t\treturn firstFile, lastFile, lastFileLen, nil\n\t}\n\n\t// Grab the first and last file's number.\n\tfirstFile, err = strconv.Atoi(strings.TrimSuffix(filepath.Base(files[0]), blockFileExtension))\n\tif err != nil {\n\t\treturn 0, 0, 0, fmt.Errorf(\"scanBlockFiles error: %v\", err)\n\t}\n\tlastFile, err = strconv.Atoi(strings.TrimSuffix(filepath.Base(files[len(files)-1]), blockFileExtension))\n\tif err != nil {\n\t\treturn 0, 0, 0, fmt.Errorf(\"scanBlockFiles error: %v\", err)\n\t}\n\n\t// Get the last file's length.\n\tfilePath := blockFilePath(dbPath, uint32(lastFile))\n\tst, err := os.Stat(filePath)\n\tif err != nil {\n\t\treturn 0, 0, 0, err\n\t}\n\tlastFileLen = uint32(st.Size())\n\n\tlog.Tracef(\"Scan found latest block file #%d with length %d\", lastFile, lastFileLen)\n\n\treturn firstFile, lastFile, lastFileLen, err\n}\n\n// newBlockStore returns a new block store with the current block file number\n// and offset set and all fields initialized.\nfunc newBlockStore(basePath string, network wire.BitcoinNet) (*blockStore, error) {\n\t// Look for the end of the latest block to file to determine what the\n\t// write cursor position is from the viewpoint of the block files on\n\t// disk.\n\t_, fileNum, fileOff, err := scanBlockFiles(basePath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif fileNum == -1 {\n\t\tfileNum = 0\n\t\tfileOff = 0\n\t}\n\n\tstore := &blockStore{\n\t\tnetwork:          network,\n\t\tbasePath:         basePath,\n\t\tmaxBlockFileSize: maxBlockFileSize,\n\t\topenBlockFiles:   make(map[uint32]*lockableFile),\n\t\topenBlocksLRU:    list.New(),\n\t\tfileNumToLRUElem: make(map[uint32]*list.Element),\n\n\t\twriteCursor: &writeCursor{\n\t\t\tcurFile:    &lockableFile{},\n\t\t\tcurFileNum: uint32(fileNum),\n\t\t\tcurOffset:  fileOff,\n\t\t},\n\t}\n\tstore.openFileFunc = store.openFile\n\tstore.openWriteFileFunc = store.openWriteFile\n\tstore.deleteFileFunc = store.deleteFile\n\treturn store, nil\n}\n"
  },
  {
    "path": "database/ffldb/db.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ffldb\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sort\"\n\t\"sync\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/database/internal/treap\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/syndtr/goleveldb/leveldb\"\n\t\"github.com/syndtr/goleveldb/leveldb/comparer\"\n\tldberrors \"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/filter\"\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nconst (\n\t// metadataDbName is the name used for the metadata database.\n\tmetadataDbName = \"metadata\"\n\n\t// blockHdrSize is the size of a block header.  This is simply the\n\t// constant from wire and is only provided here for convenience since\n\t// wire.MaxBlockHeaderPayload is quite long.\n\tblockHdrSize = wire.MaxBlockHeaderPayload\n\n\t// blockHdrOffset defines the offsets into a block index row for the\n\t// block header.\n\t//\n\t// The serialized block index row format is:\n\t//   <blocklocation><blockheader>\n\tblockHdrOffset = blockLocSize\n)\n\nvar (\n\t// byteOrder is the preferred byte order used through the database and\n\t// block files.  Sometimes big endian will be used to allow ordered byte\n\t// sortable integer values.\n\tbyteOrder = binary.LittleEndian\n\n\t// bucketIndexPrefix is the prefix used for all entries in the bucket\n\t// index.\n\tbucketIndexPrefix = []byte(\"bidx\")\n\n\t// curBucketIDKeyName is the name of the key used to keep track of the\n\t// current bucket ID counter.\n\tcurBucketIDKeyName = []byte(\"bidx-cbid\")\n\n\t// metadataBucketID is the ID of the top-level metadata bucket.\n\t// It is the value 0 encoded as an unsigned big-endian uint32.\n\tmetadataBucketID = [4]byte{}\n\n\t// blockIdxBucketID is the ID of the internal block metadata bucket.\n\t// It is the value 1 encoded as an unsigned big-endian uint32.\n\tblockIdxBucketID = [4]byte{0x00, 0x00, 0x00, 0x01}\n\n\t// blockIdxBucketName is the bucket used internally to track block\n\t// metadata.\n\tblockIdxBucketName = []byte(\"ffldb-blockidx\")\n\n\t// writeLocKeyName is the key used to store the current write file\n\t// location.\n\twriteLocKeyName = []byte(\"ffldb-writeloc\")\n)\n\n// Common error strings.\nconst (\n\t// errDbNotOpenStr is the text to use for the database.ErrDbNotOpen\n\t// error code.\n\terrDbNotOpenStr = \"database is not open\"\n\n\t// errTxClosedStr is the text to use for the database.ErrTxClosed error\n\t// code.\n\terrTxClosedStr = \"database tx is closed\"\n)\n\n// bulkFetchData is allows a block location to be specified along with the\n// index it was requested from.  This in turn allows the bulk data loading\n// functions to sort the data accesses based on the location to improve\n// performance while keeping track of which result the data is for.\ntype bulkFetchData struct {\n\t*blockLocation\n\treplyIndex int\n}\n\n// bulkFetchDataSorter implements sort.Interface to allow a slice of\n// bulkFetchData to be sorted.  In particular it sorts by file and then\n// offset so that reads from files are grouped and linear.\ntype bulkFetchDataSorter []bulkFetchData\n\n// Len returns the number of items in the slice.  It is part of the\n// sort.Interface implementation.\nfunc (s bulkFetchDataSorter) Len() int {\n\treturn len(s)\n}\n\n// Swap swaps the items at the passed indices.  It is part of the\n// sort.Interface implementation.\nfunc (s bulkFetchDataSorter) Swap(i, j int) {\n\ts[i], s[j] = s[j], s[i]\n}\n\n// Less returns whether the item with index i should sort before the item with\n// index j.  It is part of the sort.Interface implementation.\nfunc (s bulkFetchDataSorter) Less(i, j int) bool {\n\tif s[i].blockFileNum < s[j].blockFileNum {\n\t\treturn true\n\t}\n\tif s[i].blockFileNum > s[j].blockFileNum {\n\t\treturn false\n\t}\n\n\treturn s[i].fileOffset < s[j].fileOffset\n}\n\n// makeDbErr creates a database.Error given a set of arguments.\nfunc makeDbErr(c database.ErrorCode, desc string, err error) database.Error {\n\treturn database.Error{ErrorCode: c, Description: desc, Err: err}\n}\n\n// convertErr converts the passed leveldb error into a database error with an\n// equivalent error code  and the passed description.  It also sets the passed\n// error as the underlying error.\nfunc convertErr(desc string, ldbErr error) database.Error {\n\t// Use the driver-specific error code by default.  The code below will\n\t// update this with the converted error if it's recognized.\n\tvar code = database.ErrDriverSpecific\n\n\tswitch {\n\t// Database corruption errors.\n\tcase ldberrors.IsCorrupted(ldbErr):\n\t\tcode = database.ErrCorruption\n\n\t// Database open/create errors.\n\tcase ldbErr == leveldb.ErrClosed:\n\t\tcode = database.ErrDbNotOpen\n\n\t// Transaction errors.\n\tcase ldbErr == leveldb.ErrSnapshotReleased:\n\t\tcode = database.ErrTxClosed\n\tcase ldbErr == leveldb.ErrIterReleased:\n\t\tcode = database.ErrTxClosed\n\t}\n\n\treturn database.Error{ErrorCode: code, Description: desc, Err: ldbErr}\n}\n\n// copySlice returns a copy of the passed slice.  This is mostly used to copy\n// leveldb iterator keys and values since they are only valid until the iterator\n// is moved instead of during the entirety of the transaction.\nfunc copySlice(slice []byte) []byte {\n\tret := make([]byte, len(slice))\n\tcopy(ret, slice)\n\treturn ret\n}\n\n// cursor is an internal type used to represent a cursor over key/value pairs\n// and nested buckets of a bucket and implements the database.Cursor interface.\ntype cursor struct {\n\tbucket      *bucket\n\tdbIter      iterator.Iterator\n\tpendingIter iterator.Iterator\n\tcurrentIter iterator.Iterator\n}\n\n// Enforce cursor implements the database.Cursor interface.\nvar _ database.Cursor = (*cursor)(nil)\n\n// Bucket returns the bucket the cursor was created for.\n//\n// This function is part of the database.Cursor interface implementation.\nfunc (c *cursor) Bucket() database.Bucket {\n\t// Ensure transaction state is valid.\n\tif err := c.bucket.tx.checkClosed(); err != nil {\n\t\treturn nil\n\t}\n\n\treturn c.bucket\n}\n\n// Delete removes the current key/value pair the cursor is at without\n// invalidating the cursor.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrIncompatibleValue if attempted when the cursor points to a nested\n//     bucket\n//   - ErrTxNotWritable if attempted against a read-only transaction\n//   - ErrTxClosed if the transaction has already been closed\n//\n// This function is part of the database.Cursor interface implementation.\nfunc (c *cursor) Delete() error {\n\t// Ensure transaction state is valid.\n\tif err := c.bucket.tx.checkClosed(); err != nil {\n\t\treturn err\n\t}\n\n\t// Error if the cursor is exhausted.\n\tif c.currentIter == nil {\n\t\tstr := \"cursor is exhausted\"\n\t\treturn makeDbErr(database.ErrIncompatibleValue, str, nil)\n\t}\n\n\t// Do not allow buckets to be deleted via the cursor.\n\tkey := c.currentIter.Key()\n\tif bytes.HasPrefix(key, bucketIndexPrefix) {\n\t\tstr := \"buckets may not be deleted from a cursor\"\n\t\treturn makeDbErr(database.ErrIncompatibleValue, str, nil)\n\t}\n\n\tc.bucket.tx.deleteKey(copySlice(key), true)\n\treturn nil\n}\n\n// skipPendingUpdates skips any keys at the current database iterator position\n// that are being updated by the transaction.  The forwards flag indicates the\n// direction the cursor is moving.\nfunc (c *cursor) skipPendingUpdates(forwards bool) {\n\tfor c.dbIter.Valid() {\n\t\tvar skip bool\n\t\tkey := c.dbIter.Key()\n\t\tif c.bucket.tx.pendingRemove.Has(key) {\n\t\t\tskip = true\n\t\t} else if c.bucket.tx.pendingKeys.Has(key) {\n\t\t\tskip = true\n\t\t}\n\t\tif !skip {\n\t\t\tbreak\n\t\t}\n\n\t\tif forwards {\n\t\t\tc.dbIter.Next()\n\t\t} else {\n\t\t\tc.dbIter.Prev()\n\t\t}\n\t}\n}\n\n// chooseIterator first skips any entries in the database iterator that are\n// being updated by the transaction and sets the current iterator to the\n// appropriate iterator depending on their validity and the order they compare\n// in while taking into account the direction flag.  When the cursor is being\n// moved forwards and both iterators are valid, the iterator with the smaller\n// key is chosen and vice versa when the cursor is being moved backwards.\nfunc (c *cursor) chooseIterator(forwards bool) bool {\n\t// Skip any keys at the current database iterator position that are\n\t// being updated by the transaction.\n\tc.skipPendingUpdates(forwards)\n\n\t// When both iterators are exhausted, the cursor is exhausted too.\n\tif !c.dbIter.Valid() && !c.pendingIter.Valid() {\n\t\tc.currentIter = nil\n\t\treturn false\n\t}\n\n\t// Choose the database iterator when the pending keys iterator is\n\t// exhausted.\n\tif !c.pendingIter.Valid() {\n\t\tc.currentIter = c.dbIter\n\t\treturn true\n\t}\n\n\t// Choose the pending keys iterator when the database iterator is\n\t// exhausted.\n\tif !c.dbIter.Valid() {\n\t\tc.currentIter = c.pendingIter\n\t\treturn true\n\t}\n\n\t// Both iterators are valid, so choose the iterator with either the\n\t// smaller or larger key depending on the forwards flag.\n\tcompare := bytes.Compare(c.dbIter.Key(), c.pendingIter.Key())\n\tif (forwards && compare > 0) || (!forwards && compare < 0) {\n\t\tc.currentIter = c.pendingIter\n\t} else {\n\t\tc.currentIter = c.dbIter\n\t}\n\treturn true\n}\n\n// First positions the cursor at the first key/value pair and returns whether or\n// not the pair exists.\n//\n// This function is part of the database.Cursor interface implementation.\nfunc (c *cursor) First() bool {\n\t// Ensure transaction state is valid.\n\tif err := c.bucket.tx.checkClosed(); err != nil {\n\t\treturn false\n\t}\n\n\t// Seek to the first key in both the database and pending iterators and\n\t// choose the iterator that is both valid and has the smaller key.\n\tc.dbIter.First()\n\tc.pendingIter.First()\n\treturn c.chooseIterator(true)\n}\n\n// Last positions the cursor at the last key/value pair and returns whether or\n// not the pair exists.\n//\n// This function is part of the database.Cursor interface implementation.\nfunc (c *cursor) Last() bool {\n\t// Ensure transaction state is valid.\n\tif err := c.bucket.tx.checkClosed(); err != nil {\n\t\treturn false\n\t}\n\n\t// Seek to the last key in both the database and pending iterators and\n\t// choose the iterator that is both valid and has the larger key.\n\tc.dbIter.Last()\n\tc.pendingIter.Last()\n\treturn c.chooseIterator(false)\n}\n\n// Next moves the cursor one key/value pair forward and returns whether or not\n// the pair exists.\n//\n// This function is part of the database.Cursor interface implementation.\nfunc (c *cursor) Next() bool {\n\t// Ensure transaction state is valid.\n\tif err := c.bucket.tx.checkClosed(); err != nil {\n\t\treturn false\n\t}\n\n\t// Nothing to return if cursor is exhausted.\n\tif c.currentIter == nil {\n\t\treturn false\n\t}\n\n\t// Move the current iterator to the next entry and choose the iterator\n\t// that is both valid and has the smaller key.\n\tc.currentIter.Next()\n\treturn c.chooseIterator(true)\n}\n\n// Prev moves the cursor one key/value pair backward and returns whether or not\n// the pair exists.\n//\n// This function is part of the database.Cursor interface implementation.\nfunc (c *cursor) Prev() bool {\n\t// Ensure transaction state is valid.\n\tif err := c.bucket.tx.checkClosed(); err != nil {\n\t\treturn false\n\t}\n\n\t// Nothing to return if cursor is exhausted.\n\tif c.currentIter == nil {\n\t\treturn false\n\t}\n\n\t// Move the current iterator to the previous entry and choose the\n\t// iterator that is both valid and has the larger key.\n\tc.currentIter.Prev()\n\treturn c.chooseIterator(false)\n}\n\n// Seek positions the cursor at the first key/value pair that is greater than or\n// equal to the passed seek key.  Returns false if no suitable key was found.\n//\n// This function is part of the database.Cursor interface implementation.\nfunc (c *cursor) Seek(seek []byte) bool {\n\t// Ensure transaction state is valid.\n\tif err := c.bucket.tx.checkClosed(); err != nil {\n\t\treturn false\n\t}\n\n\t// Seek to the provided key in both the database and pending iterators\n\t// then choose the iterator that is both valid and has the larger key.\n\tseekKey := bucketizedKey(c.bucket.id, seek)\n\tc.dbIter.Seek(seekKey)\n\tc.pendingIter.Seek(seekKey)\n\treturn c.chooseIterator(true)\n}\n\n// rawKey returns the current key the cursor is pointing to without stripping\n// the current bucket prefix or bucket index prefix.\nfunc (c *cursor) rawKey() []byte {\n\t// Nothing to return if cursor is exhausted.\n\tif c.currentIter == nil {\n\t\treturn nil\n\t}\n\n\treturn copySlice(c.currentIter.Key())\n}\n\n// Key returns the current key the cursor is pointing to.\n//\n// This function is part of the database.Cursor interface implementation.\nfunc (c *cursor) Key() []byte {\n\t// Ensure transaction state is valid.\n\tif err := c.bucket.tx.checkClosed(); err != nil {\n\t\treturn nil\n\t}\n\n\t// Nothing to return if cursor is exhausted.\n\tif c.currentIter == nil {\n\t\treturn nil\n\t}\n\n\t// Slice out the actual key name and make a copy since it is no longer\n\t// valid after iterating to the next item.\n\t//\n\t// The key is after the bucket index prefix and parent ID when the\n\t// cursor is pointing to a nested bucket.\n\tkey := c.currentIter.Key()\n\tif bytes.HasPrefix(key, bucketIndexPrefix) {\n\t\tkey = key[len(bucketIndexPrefix)+4:]\n\t\treturn copySlice(key)\n\t}\n\n\t// The key is after the bucket ID when the cursor is pointing to a\n\t// normal entry.\n\tkey = key[len(c.bucket.id):]\n\treturn copySlice(key)\n}\n\n// rawValue returns the current value the cursor is pointing to without\n// stripping without filtering bucket index values.\nfunc (c *cursor) rawValue() []byte {\n\t// Nothing to return if cursor is exhausted.\n\tif c.currentIter == nil {\n\t\treturn nil\n\t}\n\n\treturn copySlice(c.currentIter.Value())\n}\n\n// Value returns the current value the cursor is pointing to.  This will be nil\n// for nested buckets.\n//\n// This function is part of the database.Cursor interface implementation.\nfunc (c *cursor) Value() []byte {\n\t// Ensure transaction state is valid.\n\tif err := c.bucket.tx.checkClosed(); err != nil {\n\t\treturn nil\n\t}\n\n\t// Nothing to return if cursor is exhausted.\n\tif c.currentIter == nil {\n\t\treturn nil\n\t}\n\n\t// Return nil for the value when the cursor is pointing to a nested\n\t// bucket.\n\tif bytes.HasPrefix(c.currentIter.Key(), bucketIndexPrefix) {\n\t\treturn nil\n\t}\n\n\treturn copySlice(c.currentIter.Value())\n}\n\n// cursorType defines the type of cursor to create.\ntype cursorType int\n\n// The following constants define the allowed cursor types.\nconst (\n\t// ctKeys iterates through all of the keys in a given bucket.\n\tctKeys cursorType = iota\n\n\t// ctBuckets iterates through all directly nested buckets in a given\n\t// bucket.\n\tctBuckets\n\n\t// ctFull iterates through both the keys and the directly nested buckets\n\t// in a given bucket.\n\tctFull\n)\n\n// cursorFinalizer is either invoked when a cursor is being garbage collected or\n// called manually to ensure the underlying cursor iterators are released.\nfunc cursorFinalizer(c *cursor) {\n\tc.dbIter.Release()\n\tc.pendingIter.Release()\n}\n\n// newCursor returns a new cursor for the given bucket, bucket ID, and cursor\n// type.\n//\n// NOTE: The caller is responsible for calling the cursorFinalizer function on\n// the returned cursor.\nfunc newCursor(b *bucket, bucketID []byte, cursorTyp cursorType) *cursor {\n\tvar dbIter, pendingIter iterator.Iterator\n\tswitch cursorTyp {\n\tcase ctKeys:\n\t\tkeyRange := util.BytesPrefix(bucketID)\n\t\tdbIter = b.tx.snapshot.NewIterator(keyRange)\n\t\tpendingKeyIter := newLdbTreapIter(b.tx, keyRange)\n\t\tpendingIter = pendingKeyIter\n\n\tcase ctBuckets:\n\t\t// The serialized bucket index key format is:\n\t\t//   <bucketindexprefix><parentbucketid><bucketname>\n\n\t\t// Create an iterator for the both the database and the pending\n\t\t// keys which are prefixed by the bucket index identifier and\n\t\t// the provided bucket ID.\n\t\tprefix := make([]byte, len(bucketIndexPrefix)+4)\n\t\tcopy(prefix, bucketIndexPrefix)\n\t\tcopy(prefix[len(bucketIndexPrefix):], bucketID)\n\t\tbucketRange := util.BytesPrefix(prefix)\n\n\t\tdbIter = b.tx.snapshot.NewIterator(bucketRange)\n\t\tpendingBucketIter := newLdbTreapIter(b.tx, bucketRange)\n\t\tpendingIter = pendingBucketIter\n\n\tcase ctFull:\n\t\tfallthrough\n\tdefault:\n\t\t// The serialized bucket index key format is:\n\t\t//   <bucketindexprefix><parentbucketid><bucketname>\n\t\tprefix := make([]byte, len(bucketIndexPrefix)+4)\n\t\tcopy(prefix, bucketIndexPrefix)\n\t\tcopy(prefix[len(bucketIndexPrefix):], bucketID)\n\t\tbucketRange := util.BytesPrefix(prefix)\n\t\tkeyRange := util.BytesPrefix(bucketID)\n\n\t\t// Since both keys and buckets are needed from the database,\n\t\t// create an individual iterator for each prefix and then create\n\t\t// a merged iterator from them.\n\t\tdbKeyIter := b.tx.snapshot.NewIterator(keyRange)\n\t\tdbBucketIter := b.tx.snapshot.NewIterator(bucketRange)\n\t\titers := []iterator.Iterator{dbKeyIter, dbBucketIter}\n\t\tdbIter = iterator.NewMergedIterator(iters,\n\t\t\tcomparer.DefaultComparer, true)\n\n\t\t// Since both keys and buckets are needed from the pending keys,\n\t\t// create an individual iterator for each prefix and then create\n\t\t// a merged iterator from them.\n\t\tpendingKeyIter := newLdbTreapIter(b.tx, keyRange)\n\t\tpendingBucketIter := newLdbTreapIter(b.tx, bucketRange)\n\t\titers = []iterator.Iterator{pendingKeyIter, pendingBucketIter}\n\t\tpendingIter = iterator.NewMergedIterator(iters,\n\t\t\tcomparer.DefaultComparer, true)\n\t}\n\n\t// Create the cursor using the iterators.\n\treturn &cursor{bucket: b, dbIter: dbIter, pendingIter: pendingIter}\n}\n\n// bucket is an internal type used to represent a collection of key/value pairs\n// and implements the database.Bucket interface.\ntype bucket struct {\n\ttx *transaction\n\tid [4]byte\n}\n\n// Enforce bucket implements the database.Bucket interface.\nvar _ database.Bucket = (*bucket)(nil)\n\n// bucketIndexKey returns the actual key to use for storing and retrieving a\n// child bucket in the bucket index.  This is required because additional\n// information is needed to distinguish nested buckets with the same name.\nfunc bucketIndexKey(parentID [4]byte, key []byte) []byte {\n\t// The serialized bucket index key format is:\n\t//   <bucketindexprefix><parentbucketid><bucketname>\n\tindexKey := make([]byte, len(bucketIndexPrefix)+4+len(key))\n\tcopy(indexKey, bucketIndexPrefix)\n\tcopy(indexKey[len(bucketIndexPrefix):], parentID[:])\n\tcopy(indexKey[len(bucketIndexPrefix)+4:], key)\n\treturn indexKey\n}\n\n// bucketizedKey returns the actual key to use for storing and retrieving a key\n// for the provided bucket ID.  This is required because bucketizing is handled\n// through the use of a unique prefix per bucket.\nfunc bucketizedKey(bucketID [4]byte, key []byte) []byte {\n\t// The serialized block index key format is:\n\t//   <bucketid><key>\n\tbKey := make([]byte, 4+len(key))\n\tcopy(bKey, bucketID[:])\n\tcopy(bKey[4:], key)\n\treturn bKey\n}\n\n// Bucket retrieves a nested bucket with the given key.  Returns nil if\n// the bucket does not exist.\n//\n// This function is part of the database.Bucket interface implementation.\nfunc (b *bucket) Bucket(key []byte) database.Bucket {\n\t// Ensure transaction state is valid.\n\tif err := b.tx.checkClosed(); err != nil {\n\t\treturn nil\n\t}\n\n\t// Attempt to fetch the ID for the child bucket.  The bucket does not\n\t// exist if the bucket index entry does not exist.\n\tchildID := b.tx.fetchKey(bucketIndexKey(b.id, key))\n\tif childID == nil {\n\t\treturn nil\n\t}\n\n\tchildBucket := &bucket{tx: b.tx}\n\tcopy(childBucket.id[:], childID)\n\treturn childBucket\n}\n\n// CreateBucket creates and returns a new nested bucket with the given key.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrBucketExists if the bucket already exists\n//   - ErrBucketNameRequired if the key is empty\n//   - ErrIncompatibleValue if the key is otherwise invalid for the particular\n//     implementation\n//   - ErrTxNotWritable if attempted against a read-only transaction\n//   - ErrTxClosed if the transaction has already been closed\n//\n// This function is part of the database.Bucket interface implementation.\nfunc (b *bucket) CreateBucket(key []byte) (database.Bucket, error) {\n\t// Ensure transaction state is valid.\n\tif err := b.tx.checkClosed(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Ensure the transaction is writable.\n\tif !b.tx.writable {\n\t\tstr := \"create bucket requires a writable database transaction\"\n\t\treturn nil, makeDbErr(database.ErrTxNotWritable, str, nil)\n\t}\n\n\t// Ensure a key was provided.\n\tif len(key) == 0 {\n\t\tstr := \"create bucket requires a key\"\n\t\treturn nil, makeDbErr(database.ErrBucketNameRequired, str, nil)\n\t}\n\n\t// Ensure bucket does not already exist.\n\tbidxKey := bucketIndexKey(b.id, key)\n\tif b.tx.hasKey(bidxKey) {\n\t\tstr := \"bucket already exists\"\n\t\treturn nil, makeDbErr(database.ErrBucketExists, str, nil)\n\t}\n\n\t// Find the appropriate next bucket ID to use for the new bucket.  In\n\t// the case of the special internal block index, keep the fixed ID.\n\tvar childID [4]byte\n\tif b.id == metadataBucketID && bytes.Equal(key, blockIdxBucketName) {\n\t\tchildID = blockIdxBucketID\n\t} else {\n\t\tvar err error\n\t\tchildID, err = b.tx.nextBucketID()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Add the new bucket to the bucket index.\n\tif err := b.tx.putKey(bidxKey, childID[:]); err != nil {\n\t\tstr := fmt.Sprintf(\"failed to create bucket with key %q\", key)\n\t\treturn nil, convertErr(str, err)\n\t}\n\treturn &bucket{tx: b.tx, id: childID}, nil\n}\n\n// CreateBucketIfNotExists creates and returns a new nested bucket with the\n// given key if it does not already exist.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrBucketNameRequired if the key is empty\n//   - ErrIncompatibleValue if the key is otherwise invalid for the particular\n//     implementation\n//   - ErrTxNotWritable if attempted against a read-only transaction\n//   - ErrTxClosed if the transaction has already been closed\n//\n// This function is part of the database.Bucket interface implementation.\nfunc (b *bucket) CreateBucketIfNotExists(key []byte) (database.Bucket, error) {\n\t// Ensure transaction state is valid.\n\tif err := b.tx.checkClosed(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Ensure the transaction is writable.\n\tif !b.tx.writable {\n\t\tstr := \"create bucket requires a writable database transaction\"\n\t\treturn nil, makeDbErr(database.ErrTxNotWritable, str, nil)\n\t}\n\n\t// Return existing bucket if it already exists, otherwise create it.\n\tif bucket := b.Bucket(key); bucket != nil {\n\t\treturn bucket, nil\n\t}\n\treturn b.CreateBucket(key)\n}\n\n// DeleteBucket removes a nested bucket with the given key.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrBucketNotFound if the specified bucket does not exist\n//   - ErrTxNotWritable if attempted against a read-only transaction\n//   - ErrTxClosed if the transaction has already been closed\n//\n// This function is part of the database.Bucket interface implementation.\nfunc (b *bucket) DeleteBucket(key []byte) error {\n\t// Ensure transaction state is valid.\n\tif err := b.tx.checkClosed(); err != nil {\n\t\treturn err\n\t}\n\n\t// Ensure the transaction is writable.\n\tif !b.tx.writable {\n\t\tstr := \"delete bucket requires a writable database transaction\"\n\t\treturn makeDbErr(database.ErrTxNotWritable, str, nil)\n\t}\n\n\t// Attempt to fetch the ID for the child bucket.  The bucket does not\n\t// exist if the bucket index entry does not exist.  In the case of the\n\t// special internal block index, keep the fixed ID.\n\tbidxKey := bucketIndexKey(b.id, key)\n\tchildID := b.tx.fetchKey(bidxKey)\n\tif childID == nil {\n\t\tstr := fmt.Sprintf(\"bucket %q does not exist\", key)\n\t\treturn makeDbErr(database.ErrBucketNotFound, str, nil)\n\t}\n\n\t// Remove all nested buckets and their keys.\n\tchildIDs := [][]byte{childID}\n\tfor len(childIDs) > 0 {\n\t\tchildID = childIDs[len(childIDs)-1]\n\t\tchildIDs = childIDs[:len(childIDs)-1]\n\n\t\t// Delete all keys in the nested bucket.\n\t\tkeyCursor := newCursor(b, childID, ctKeys)\n\t\tfor ok := keyCursor.First(); ok; ok = keyCursor.Next() {\n\t\t\tb.tx.deleteKey(keyCursor.rawKey(), false)\n\t\t}\n\t\tcursorFinalizer(keyCursor)\n\n\t\t// Iterate through all nested buckets.\n\t\tbucketCursor := newCursor(b, childID, ctBuckets)\n\t\tfor ok := bucketCursor.First(); ok; ok = bucketCursor.Next() {\n\t\t\t// Push the id of the nested bucket onto the stack for\n\t\t\t// the next iteration.\n\t\t\tchildID := bucketCursor.rawValue()\n\t\t\tchildIDs = append(childIDs, childID)\n\n\t\t\t// Remove the nested bucket from the bucket index.\n\t\t\tb.tx.deleteKey(bucketCursor.rawKey(), false)\n\t\t}\n\t\tcursorFinalizer(bucketCursor)\n\t}\n\n\t// Remove the nested bucket from the bucket index.  Any buckets nested\n\t// under it were already removed above.\n\tb.tx.deleteKey(bidxKey, true)\n\treturn nil\n}\n\n// Cursor returns a new cursor, allowing for iteration over the bucket's\n// key/value pairs and nested buckets in forward or backward order.\n//\n// You must seek to a position using the First, Last, or Seek functions before\n// calling the Next, Prev, Key, or Value functions.  Failure to do so will\n// result in the same return values as an exhausted cursor, which is false for\n// the Prev and Next functions and nil for Key and Value functions.\n//\n// This function is part of the database.Bucket interface implementation.\nfunc (b *bucket) Cursor() database.Cursor {\n\t// Ensure transaction state is valid.\n\tif err := b.tx.checkClosed(); err != nil {\n\t\treturn &cursor{bucket: b}\n\t}\n\n\t// Create the cursor and setup a runtime finalizer to ensure the\n\t// iterators are released when the cursor is garbage collected.\n\tc := newCursor(b, b.id[:], ctFull)\n\truntime.SetFinalizer(c, cursorFinalizer)\n\treturn c\n}\n\n// ForEach invokes the passed function with every key/value pair in the bucket.\n// This does not include nested buckets or the key/value pairs within those\n// nested buckets.\n//\n// WARNING: It is not safe to mutate data while iterating with this method.\n// Doing so may cause the underlying cursor to be invalidated and return\n// unexpected keys and/or values.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrTxClosed if the transaction has already been closed\n//\n// NOTE: The values returned by this function are only valid during a\n// transaction.  Attempting to access them after a transaction has ended will\n// likely result in an access violation.\n//\n// This function is part of the database.Bucket interface implementation.\nfunc (b *bucket) ForEach(fn func(k, v []byte) error) error {\n\t// Ensure transaction state is valid.\n\tif err := b.tx.checkClosed(); err != nil {\n\t\treturn err\n\t}\n\n\t// Invoke the callback for each cursor item.  Return the error returned\n\t// from the callback when it is non-nil.\n\tc := newCursor(b, b.id[:], ctKeys)\n\tdefer cursorFinalizer(c)\n\tfor ok := c.First(); ok; ok = c.Next() {\n\t\terr := fn(c.Key(), c.Value())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// ForEachBucket invokes the passed function with the key of every nested bucket\n// in the current bucket.  This does not include any nested buckets within those\n// nested buckets.\n//\n// WARNING: It is not safe to mutate data while iterating with this method.\n// Doing so may cause the underlying cursor to be invalidated and return\n// unexpected keys.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrTxClosed if the transaction has already been closed\n//\n// NOTE: The values returned by this function are only valid during a\n// transaction.  Attempting to access them after a transaction has ended will\n// likely result in an access violation.\n//\n// This function is part of the database.Bucket interface implementation.\nfunc (b *bucket) ForEachBucket(fn func(k []byte) error) error {\n\t// Ensure transaction state is valid.\n\tif err := b.tx.checkClosed(); err != nil {\n\t\treturn err\n\t}\n\n\t// Invoke the callback for each cursor item.  Return the error returned\n\t// from the callback when it is non-nil.\n\tc := newCursor(b, b.id[:], ctBuckets)\n\tdefer cursorFinalizer(c)\n\tfor ok := c.First(); ok; ok = c.Next() {\n\t\terr := fn(c.Key())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Writable returns whether or not the bucket is writable.\n//\n// This function is part of the database.Bucket interface implementation.\nfunc (b *bucket) Writable() bool {\n\treturn b.tx.writable\n}\n\n// Put saves the specified key/value pair to the bucket.  Keys that do not\n// already exist are added and keys that already exist are overwritten.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrKeyRequired if the key is empty\n//   - ErrIncompatibleValue if the key is the same as an existing bucket\n//   - ErrTxNotWritable if attempted against a read-only transaction\n//   - ErrTxClosed if the transaction has already been closed\n//\n// This function is part of the database.Bucket interface implementation.\nfunc (b *bucket) Put(key, value []byte) error {\n\t// Ensure transaction state is valid.\n\tif err := b.tx.checkClosed(); err != nil {\n\t\treturn err\n\t}\n\n\t// Ensure the transaction is writable.\n\tif !b.tx.writable {\n\t\tstr := \"setting a key requires a writable database transaction\"\n\t\treturn makeDbErr(database.ErrTxNotWritable, str, nil)\n\t}\n\n\t// Ensure a key was provided.\n\tif len(key) == 0 {\n\t\tstr := \"put requires a key\"\n\t\treturn makeDbErr(database.ErrKeyRequired, str, nil)\n\t}\n\n\treturn b.tx.putKey(bucketizedKey(b.id, key), value)\n}\n\n// Get returns the value for the given key.  Returns nil if the key does not\n// exist in this bucket.  An empty slice is returned for keys that exist but\n// have no value assigned.\n//\n// NOTE: The value returned by this function is only valid during a transaction.\n// Attempting to access it after a transaction has ended results in undefined\n// behavior.  Additionally, the value must NOT be modified by the caller.\n//\n// This function is part of the database.Bucket interface implementation.\nfunc (b *bucket) Get(key []byte) []byte {\n\t// Ensure transaction state is valid.\n\tif err := b.tx.checkClosed(); err != nil {\n\t\treturn nil\n\t}\n\n\t// Nothing to return if there is no key.\n\tif len(key) == 0 {\n\t\treturn nil\n\t}\n\n\treturn b.tx.fetchKey(bucketizedKey(b.id, key))\n}\n\n// Delete removes the specified key from the bucket.  Deleting a key that does\n// not exist does not return an error.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrKeyRequired if the key is empty\n//   - ErrIncompatibleValue if the key is the same as an existing bucket\n//   - ErrTxNotWritable if attempted against a read-only transaction\n//   - ErrTxClosed if the transaction has already been closed\n//\n// This function is part of the database.Bucket interface implementation.\nfunc (b *bucket) Delete(key []byte) error {\n\t// Ensure transaction state is valid.\n\tif err := b.tx.checkClosed(); err != nil {\n\t\treturn err\n\t}\n\n\t// Ensure the transaction is writable.\n\tif !b.tx.writable {\n\t\tstr := \"deleting a value requires a writable database transaction\"\n\t\treturn makeDbErr(database.ErrTxNotWritable, str, nil)\n\t}\n\n\t// Nothing to do if there is no key.\n\tif len(key) == 0 {\n\t\treturn nil\n\t}\n\n\tb.tx.deleteKey(bucketizedKey(b.id, key), true)\n\treturn nil\n}\n\n// pendingBlock houses a block that will be written to disk when the database\n// transaction is committed.\ntype pendingBlock struct {\n\thash  *chainhash.Hash\n\tbytes []byte\n}\n\n// transaction represents a database transaction.  It can either be read-only or\n// read-write and implements the database.Tx interface.  The transaction\n// provides a root bucket against which all read and writes occur.\ntype transaction struct {\n\tmanaged        bool             // Is the transaction managed?\n\tclosed         bool             // Is the transaction closed?\n\twritable       bool             // Is the transaction writable?\n\tdb             *db              // DB instance the tx was created from.\n\tsnapshot       *dbCacheSnapshot // Underlying snapshot for txns.\n\tmetaBucket     *bucket          // The root metadata bucket.\n\tblockIdxBucket *bucket          // The block index bucket.\n\n\t// Blocks that need to be stored on commit.  The pendingBlocks map is\n\t// kept to allow quick lookups of pending data by block hash.\n\tpendingBlocks    map[chainhash.Hash]int\n\tpendingBlockData []pendingBlock\n\n\t// Files that need to be deleted on commit.  These are the files that\n\t// are marked as files to be deleted during pruning.\n\tpendingDelFileNums []uint32\n\n\t// Keys that need to be stored or deleted on commit.\n\tpendingKeys   *treap.Mutable\n\tpendingRemove *treap.Mutable\n\n\t// Active iterators that need to be notified when the pending keys have\n\t// been updated so the cursors can properly handle updates to the\n\t// transaction state.\n\tactiveIterLock sync.RWMutex\n\tactiveIters    []*treap.Iterator\n}\n\n// Enforce transaction implements the database.Tx interface.\nvar _ database.Tx = (*transaction)(nil)\n\n// removeActiveIter removes the passed iterator from the list of active\n// iterators against the pending keys treap.\nfunc (tx *transaction) removeActiveIter(iter *treap.Iterator) {\n\t// An indexing for loop is intentionally used over a range here as range\n\t// does not reevaluate the slice on each iteration nor does it adjust\n\t// the index for the modified slice.\n\ttx.activeIterLock.Lock()\n\tfor i := 0; i < len(tx.activeIters); i++ {\n\t\tif tx.activeIters[i] == iter {\n\t\t\tcopy(tx.activeIters[i:], tx.activeIters[i+1:])\n\t\t\ttx.activeIters[len(tx.activeIters)-1] = nil\n\t\t\ttx.activeIters = tx.activeIters[:len(tx.activeIters)-1]\n\t\t}\n\t}\n\ttx.activeIterLock.Unlock()\n}\n\n// addActiveIter adds the passed iterator to the list of active iterators for\n// the pending keys treap.\nfunc (tx *transaction) addActiveIter(iter *treap.Iterator) {\n\ttx.activeIterLock.Lock()\n\ttx.activeIters = append(tx.activeIters, iter)\n\ttx.activeIterLock.Unlock()\n}\n\n// notifyActiveIters notifies all of the active iterators for the pending keys\n// treap that it has been updated.\nfunc (tx *transaction) notifyActiveIters() {\n\ttx.activeIterLock.RLock()\n\tfor _, iter := range tx.activeIters {\n\t\titer.ForceReseek()\n\t}\n\ttx.activeIterLock.RUnlock()\n}\n\n// checkClosed returns an error if the database or transaction is closed.\nfunc (tx *transaction) checkClosed() error {\n\t// The transaction is no longer valid if it has been closed.\n\tif tx.closed {\n\t\treturn makeDbErr(database.ErrTxClosed, errTxClosedStr, nil)\n\t}\n\n\treturn nil\n}\n\n// hasKey returns whether or not the provided key exists in the database while\n// taking into account the current transaction state.\nfunc (tx *transaction) hasKey(key []byte) bool {\n\t// When the transaction is writable, check the pending transaction\n\t// state first.\n\tif tx.writable {\n\t\tif tx.pendingRemove.Has(key) {\n\t\t\treturn false\n\t\t}\n\t\tif tx.pendingKeys.Has(key) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// Consult the database cache and underlying database.\n\treturn tx.snapshot.Has(key)\n}\n\n// putKey adds the provided key to the list of keys to be updated in the\n// database when the transaction is committed.\n//\n// NOTE: This function must only be called on a writable transaction.  Since it\n// is an internal helper function, it does not check.\nfunc (tx *transaction) putKey(key, value []byte) error {\n\t// Prevent the key from being deleted if it was previously scheduled\n\t// to be deleted on transaction commit.\n\ttx.pendingRemove.Delete(key)\n\n\t// Add the key/value pair to the list to be written on transaction\n\t// commit.\n\ttx.pendingKeys.Put(key, value)\n\ttx.notifyActiveIters()\n\treturn nil\n}\n\n// fetchKey attempts to fetch the provided key from the database cache (and\n// hence underlying database) while taking into account the current transaction\n// state.  Returns nil if the key does not exist.\nfunc (tx *transaction) fetchKey(key []byte) []byte {\n\t// When the transaction is writable, check the pending transaction\n\t// state first.\n\tif tx.writable {\n\t\tif tx.pendingRemove.Has(key) {\n\t\t\treturn nil\n\t\t}\n\t\tif value := tx.pendingKeys.Get(key); value != nil {\n\t\t\treturn value\n\t\t}\n\t}\n\n\t// Consult the database cache and underlying database.\n\treturn tx.snapshot.Get(key)\n}\n\n// deleteKey adds the provided key to the list of keys to be deleted from the\n// database when the transaction is committed.  The notify iterators flag is\n// useful to delay notifying iterators about the changes during bulk deletes.\n//\n// NOTE: This function must only be called on a writable transaction.  Since it\n// is an internal helper function, it does not check.\nfunc (tx *transaction) deleteKey(key []byte, notifyIterators bool) {\n\t// Remove the key from the list of pendings keys to be written on\n\t// transaction commit if needed.\n\ttx.pendingKeys.Delete(key)\n\n\t// Add the key to the list to be deleted on transaction\tcommit.\n\ttx.pendingRemove.Put(key, nil)\n\n\t// Notify the active iterators about the change if the flag is set.\n\tif notifyIterators {\n\t\ttx.notifyActiveIters()\n\t}\n}\n\n// nextBucketID returns the next bucket ID to use for creating a new bucket.\n//\n// NOTE: This function must only be called on a writable transaction.  Since it\n// is an internal helper function, it does not check.\nfunc (tx *transaction) nextBucketID() ([4]byte, error) {\n\t// Load the currently highest used bucket ID.\n\tcurIDBytes := tx.fetchKey(curBucketIDKeyName)\n\tcurBucketNum := binary.BigEndian.Uint32(curIDBytes)\n\n\t// Increment and update the current bucket ID and return it.\n\tvar nextBucketID [4]byte\n\tbinary.BigEndian.PutUint32(nextBucketID[:], curBucketNum+1)\n\tif err := tx.putKey(curBucketIDKeyName, nextBucketID[:]); err != nil {\n\t\treturn [4]byte{}, err\n\t}\n\treturn nextBucketID, nil\n}\n\n// Metadata returns the top-most bucket for all metadata storage.\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) Metadata() database.Bucket {\n\treturn tx.metaBucket\n}\n\n// hasBlock returns whether or not a block with the given hash exists.\nfunc (tx *transaction) hasBlock(hash *chainhash.Hash) bool {\n\t// Return true if the block is pending to be written on commit since\n\t// it exists from the viewpoint of this transaction.\n\tif _, exists := tx.pendingBlocks[*hash]; exists {\n\t\treturn true\n\t}\n\n\treturn tx.hasKey(bucketizedKey(blockIdxBucketID, hash[:]))\n}\n\n// StoreBlock stores the provided block into the database.  There are no checks\n// to ensure the block connects to a previous block, contains double spends, or\n// any additional functionality such as transaction indexing.  It simply stores\n// the block in the database.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrBlockExists when the block hash already exists\n//   - ErrTxNotWritable if attempted against a read-only transaction\n//   - ErrTxClosed if the transaction has already been closed\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) StoreBlock(block *btcutil.Block) error {\n\t// Ensure transaction state is valid.\n\tif err := tx.checkClosed(); err != nil {\n\t\treturn err\n\t}\n\n\t// Ensure the transaction is writable.\n\tif !tx.writable {\n\t\tstr := \"store block requires a writable database transaction\"\n\t\treturn makeDbErr(database.ErrTxNotWritable, str, nil)\n\t}\n\n\t// Reject the block if it already exists.\n\tblockHash := block.Hash()\n\tif tx.hasBlock(blockHash) {\n\t\tstr := fmt.Sprintf(\"block %s already exists\", blockHash)\n\t\treturn makeDbErr(database.ErrBlockExists, str, nil)\n\t}\n\n\tblockBytes, err := block.Bytes()\n\tif err != nil {\n\t\tstr := fmt.Sprintf(\"failed to get serialized bytes for block %s\",\n\t\t\tblockHash)\n\t\treturn makeDbErr(database.ErrDriverSpecific, str, err)\n\t}\n\n\t// Add the block to be stored to the list of pending blocks to store\n\t// when the transaction is committed.  Also, add it to pending blocks\n\t// map so it is easy to determine the block is pending based on the\n\t// block hash.\n\tif tx.pendingBlocks == nil {\n\t\ttx.pendingBlocks = make(map[chainhash.Hash]int)\n\t}\n\ttx.pendingBlocks[*blockHash] = len(tx.pendingBlockData)\n\ttx.pendingBlockData = append(tx.pendingBlockData, pendingBlock{\n\t\thash:  blockHash,\n\t\tbytes: blockBytes,\n\t})\n\tlog.Tracef(\"Added block %s to pending blocks\", blockHash)\n\n\treturn nil\n}\n\n// HasBlock returns whether or not a block with the given hash exists in the\n// database.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrTxClosed if the transaction has already been closed\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) HasBlock(hash *chainhash.Hash) (bool, error) {\n\t// Ensure transaction state is valid.\n\tif err := tx.checkClosed(); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn tx.hasBlock(hash), nil\n}\n\n// HasBlocks returns whether or not the blocks with the provided hashes\n// exist in the database.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrTxClosed if the transaction has already been closed\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) HasBlocks(hashes []chainhash.Hash) ([]bool, error) {\n\t// Ensure transaction state is valid.\n\tif err := tx.checkClosed(); err != nil {\n\t\treturn nil, err\n\t}\n\n\tresults := make([]bool, len(hashes))\n\tfor i := range hashes {\n\t\tresults[i] = tx.hasBlock(&hashes[i])\n\t}\n\n\treturn results, nil\n}\n\n// fetchBlockRow fetches the metadata stored in the block index for the provided\n// hash.  It will return ErrBlockNotFound if there is no entry.\nfunc (tx *transaction) fetchBlockRow(hash *chainhash.Hash) ([]byte, error) {\n\tblockRow := tx.blockIdxBucket.Get(hash[:])\n\tif blockRow == nil {\n\t\tstr := fmt.Sprintf(\"block %s does not exist\", hash)\n\t\treturn nil, makeDbErr(database.ErrBlockNotFound, str, nil)\n\t}\n\n\treturn blockRow, nil\n}\n\n// FetchBlockHeader returns the raw serialized bytes for the block header\n// identified by the given hash.  The raw bytes are in the format returned by\n// Serialize on a wire.BlockHeader.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrBlockNotFound if the requested block hash does not exist\n//   - ErrTxClosed if the transaction has already been closed\n//   - ErrCorruption if the database has somehow become corrupted\n//\n// NOTE: The data returned by this function is only valid during a\n// database transaction.  Attempting to access it after a transaction\n// has ended results in undefined behavior.  This constraint prevents\n// additional data copies and allows support for memory-mapped database\n// implementations.\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) FetchBlockHeader(hash *chainhash.Hash) ([]byte, error) {\n\treturn tx.FetchBlockRegion(&database.BlockRegion{\n\t\tHash:   hash,\n\t\tOffset: 0,\n\t\tLen:    blockHdrSize,\n\t})\n}\n\n// FetchBlockHeaders returns the raw serialized bytes for the block headers\n// identified by the given hashes.  The raw bytes are in the format returned by\n// Serialize on a wire.BlockHeader.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrBlockNotFound if the any of the requested block hashes do not exist\n//   - ErrTxClosed if the transaction has already been closed\n//   - ErrCorruption if the database has somehow become corrupted\n//\n// NOTE: The data returned by this function is only valid during a database\n// transaction.  Attempting to access it after a transaction has ended results\n// in undefined behavior.  This constraint prevents additional data copies and\n// allows support for memory-mapped database implementations.\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) FetchBlockHeaders(hashes []chainhash.Hash) ([][]byte, error) {\n\tregions := make([]database.BlockRegion, len(hashes))\n\tfor i := range hashes {\n\t\tregions[i].Hash = &hashes[i]\n\t\tregions[i].Offset = 0\n\t\tregions[i].Len = blockHdrSize\n\t}\n\treturn tx.FetchBlockRegions(regions)\n}\n\n// FetchBlock returns the raw serialized bytes for the block identified by the\n// given hash.  The raw bytes are in the format returned by Serialize on a\n// wire.MsgBlock.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrBlockNotFound if the requested block hash does not exist\n//   - ErrTxClosed if the transaction has already been closed\n//   - ErrCorruption if the database has somehow become corrupted\n//\n// In addition, returns ErrDriverSpecific if any failures occur when reading the\n// block files.\n//\n// NOTE: The data returned by this function is only valid during a database\n// transaction.  Attempting to access it after a transaction has ended results\n// in undefined behavior.  This constraint prevents additional data copies and\n// allows support for memory-mapped database implementations.\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) FetchBlock(hash *chainhash.Hash) ([]byte, error) {\n\t// Ensure transaction state is valid.\n\tif err := tx.checkClosed(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// When the block is pending to be written on commit return the bytes\n\t// from there.\n\tif idx, exists := tx.pendingBlocks[*hash]; exists {\n\t\treturn tx.pendingBlockData[idx].bytes, nil\n\t}\n\n\t// Lookup the location of the block in the files from the block index.\n\tblockRow, err := tx.fetchBlockRow(hash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlocation := deserializeBlockLoc(blockRow)\n\n\t// Read the block from the appropriate location.  The function also\n\t// performs a checksum over the data to detect data corruption.\n\tblockBytes, err := tx.db.store.readBlock(hash, location)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn blockBytes, nil\n}\n\n// FetchBlocks returns the raw serialized bytes for the blocks identified by the\n// given hashes.  The raw bytes are in the format returned by Serialize on a\n// wire.MsgBlock.\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrBlockNotFound if any of the requested block hashed do not exist\n//   - ErrTxClosed if the transaction has already been closed\n//   - ErrCorruption if the database has somehow become corrupted\n//\n// In addition, returns ErrDriverSpecific if any failures occur when reading the\n// block files.\n//\n// NOTE: The data returned by this function is only valid during a database\n// transaction.  Attempting to access it after a transaction has ended results\n// in undefined behavior.  This constraint prevents additional data copies and\n// allows support for memory-mapped database implementations.\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) FetchBlocks(hashes []chainhash.Hash) ([][]byte, error) {\n\t// Ensure transaction state is valid.\n\tif err := tx.checkClosed(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// NOTE: This could check for the existence of all blocks before loading\n\t// any of them which would be faster in the failure case, however\n\t// callers will not typically be calling this function with invalid\n\t// values, so optimize for the common case.\n\n\t// Load the blocks.\n\tblocks := make([][]byte, len(hashes))\n\tfor i := range hashes {\n\t\tvar err error\n\t\tblocks[i], err = tx.FetchBlock(&hashes[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn blocks, nil\n}\n\n// fetchPendingRegion attempts to fetch the provided region from any block which\n// are pending to be written on commit.  It will return nil for the byte slice\n// when the region references a block which is not pending.  When the region\n// does reference a pending block, it is bounds checked and returns\n// ErrBlockRegionInvalid if invalid.\nfunc (tx *transaction) fetchPendingRegion(region *database.BlockRegion) ([]byte, error) {\n\t// Nothing to do if the block is not pending to be written on commit.\n\tidx, exists := tx.pendingBlocks[*region.Hash]\n\tif !exists {\n\t\treturn nil, nil\n\t}\n\n\t// Ensure the region is within the bounds of the block.\n\tblockBytes := tx.pendingBlockData[idx].bytes\n\tblockLen := uint32(len(blockBytes))\n\tendOffset := region.Offset + region.Len\n\tif endOffset < region.Offset || endOffset > blockLen {\n\t\tstr := fmt.Sprintf(\"block %s region offset %d, length %d \"+\n\t\t\t\"exceeds block length of %d\", region.Hash,\n\t\t\tregion.Offset, region.Len, blockLen)\n\t\treturn nil, makeDbErr(database.ErrBlockRegionInvalid, str, nil)\n\t}\n\n\t// Return the bytes from the pending block.\n\treturn blockBytes[region.Offset:endOffset:endOffset], nil\n}\n\n// FetchBlockRegion returns the raw serialized bytes for the given block region.\n//\n// For example, it is possible to directly extract Bitcoin transactions and/or\n// scripts from a block with this function.  Depending on the backend\n// implementation, this can provide significant savings by avoiding the need to\n// load entire blocks.\n//\n// The raw bytes are in the format returned by Serialize on a wire.MsgBlock and\n// the Offset field in the provided BlockRegion is zero-based and relative to\n// the start of the block (byte 0).\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrBlockNotFound if the requested block hash does not exist\n//   - ErrBlockRegionInvalid if the region exceeds the bounds of the associated\n//     block\n//   - ErrTxClosed if the transaction has already been closed\n//   - ErrCorruption if the database has somehow become corrupted\n//\n// In addition, returns ErrDriverSpecific if any failures occur when reading the\n// block files.\n//\n// NOTE: The data returned by this function is only valid during a database\n// transaction.  Attempting to access it after a transaction has ended results\n// in undefined behavior.  This constraint prevents additional data copies and\n// allows support for memory-mapped database implementations.\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) FetchBlockRegion(region *database.BlockRegion) ([]byte, error) {\n\t// Ensure transaction state is valid.\n\tif err := tx.checkClosed(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// When the block is pending to be written on commit return the bytes\n\t// from there.\n\tif tx.pendingBlocks != nil {\n\t\tregionBytes, err := tx.fetchPendingRegion(region)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif regionBytes != nil {\n\t\t\treturn regionBytes, nil\n\t\t}\n\t}\n\n\t// Lookup the location of the block in the files from the block index.\n\tblockRow, err := tx.fetchBlockRow(region.Hash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlocation := deserializeBlockLoc(blockRow)\n\n\t// Ensure the region is within the bounds of the block.\n\tendOffset := region.Offset + region.Len\n\tif endOffset < region.Offset || endOffset > location.blockLen {\n\t\tstr := fmt.Sprintf(\"block %s region offset %d, length %d \"+\n\t\t\t\"exceeds block length of %d\", region.Hash,\n\t\t\tregion.Offset, region.Len, location.blockLen)\n\t\treturn nil, makeDbErr(database.ErrBlockRegionInvalid, str, nil)\n\n\t}\n\n\t// Read the region from the appropriate disk block file.\n\tregionBytes, err := tx.db.store.readBlockRegion(location, region.Offset,\n\t\tregion.Len)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn regionBytes, nil\n}\n\n// FetchBlockRegions returns the raw serialized bytes for the given block\n// regions.\n//\n// For example, it is possible to directly extract Bitcoin transactions and/or\n// scripts from various blocks with this function.  Depending on the backend\n// implementation, this can provide significant savings by avoiding the need to\n// load entire blocks.\n//\n// The raw bytes are in the format returned by Serialize on a wire.MsgBlock and\n// the Offset fields in the provided BlockRegions are zero-based and relative to\n// the start of the block (byte 0).\n//\n// Returns the following errors as required by the interface contract:\n//   - ErrBlockNotFound if any of the request block hashes do not exist\n//   - ErrBlockRegionInvalid if one or more region exceed the bounds of the\n//     associated block\n//   - ErrTxClosed if the transaction has already been closed\n//   - ErrCorruption if the database has somehow become corrupted\n//\n// In addition, returns ErrDriverSpecific if any failures occur when reading the\n// block files.\n//\n// NOTE: The data returned by this function is only valid during a database\n// transaction.  Attempting to access it after a transaction has ended results\n// in undefined behavior.  This constraint prevents additional data copies and\n// allows support for memory-mapped database implementations.\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) FetchBlockRegions(regions []database.BlockRegion) ([][]byte, error) {\n\t// Ensure transaction state is valid.\n\tif err := tx.checkClosed(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// NOTE: This could check for the existence of all blocks before\n\t// deserializing the locations and building up the fetch list which\n\t// would be faster in the failure case, however callers will not\n\t// typically be calling this function with invalid values, so optimize\n\t// for the common case.\n\n\t// NOTE: A potential optimization here would be to combine adjacent\n\t// regions to reduce the number of reads.\n\n\t// In order to improve efficiency of loading the bulk data, first grab\n\t// the block location for all of the requested block hashes and sort\n\t// the reads by filenum:offset so that all reads are grouped by file\n\t// and linear within each file.  This can result in quite a significant\n\t// performance increase depending on how spread out the requested hashes\n\t// are by reducing the number of file open/closes and random accesses\n\t// needed.  The fetchList is intentionally allocated with a cap because\n\t// some of the regions might be fetched from the pending blocks and\n\t// hence there is no need to fetch those from disk.\n\tblockRegions := make([][]byte, len(regions))\n\tfetchList := make([]bulkFetchData, 0, len(regions))\n\tfor i := range regions {\n\t\tregion := &regions[i]\n\n\t\t// When the block is pending to be written on commit grab the\n\t\t// bytes from there.\n\t\tif tx.pendingBlocks != nil {\n\t\t\tregionBytes, err := tx.fetchPendingRegion(region)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif regionBytes != nil {\n\t\t\t\tblockRegions[i] = regionBytes\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Lookup the location of the block in the files from the block\n\t\t// index.\n\t\tblockRow, err := tx.fetchBlockRow(region.Hash)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tlocation := deserializeBlockLoc(blockRow)\n\n\t\t// Ensure the region is within the bounds of the block.\n\t\tendOffset := region.Offset + region.Len\n\t\tif endOffset < region.Offset || endOffset > location.blockLen {\n\t\t\tstr := fmt.Sprintf(\"block %s region offset %d, length \"+\n\t\t\t\t\"%d exceeds block length of %d\", region.Hash,\n\t\t\t\tregion.Offset, region.Len, location.blockLen)\n\t\t\treturn nil, makeDbErr(database.ErrBlockRegionInvalid, str, nil)\n\t\t}\n\n\t\tfetchList = append(fetchList, bulkFetchData{&location, i})\n\t}\n\tsort.Sort(bulkFetchDataSorter(fetchList))\n\n\t// Read all of the regions in the fetch list and set the results.\n\tfor i := range fetchList {\n\t\tfetchData := &fetchList[i]\n\t\tri := fetchData.replyIndex\n\t\tregion := &regions[ri]\n\t\tlocation := fetchData.blockLocation\n\t\tregionBytes, err := tx.db.store.readBlockRegion(*location,\n\t\t\tregion.Offset, region.Len)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tblockRegions[ri] = regionBytes\n\t}\n\n\treturn blockRegions, nil\n}\n\n// close marks the transaction closed then releases any pending data, the\n// underlying snapshot, the transaction read lock, and the write lock when the\n// transaction is writable.\nfunc (tx *transaction) close() {\n\ttx.closed = true\n\n\t// Clear pending blocks that would have been written on commit.\n\ttx.pendingBlocks = nil\n\ttx.pendingBlockData = nil\n\n\t// Clear pending file deletions.\n\ttx.pendingDelFileNums = nil\n\n\t// Clear pending keys that would have been written or deleted on commit.\n\ttx.pendingKeys = nil\n\ttx.pendingRemove = nil\n\n\t// Release the snapshot.\n\tif tx.snapshot != nil {\n\t\ttx.snapshot.Release()\n\t\ttx.snapshot = nil\n\t}\n\n\ttx.db.closeLock.RUnlock()\n\n\t// Release the writer lock for writable transactions to unblock any\n\t// other write transaction which are possibly waiting.\n\tif tx.writable {\n\t\ttx.db.writeLock.Unlock()\n\t}\n}\n\n// writePendingAndCommit writes pending block data to the flat block files,\n// updates the metadata with their locations as well as the new current write\n// location, and commits the metadata to the memory database cache.  It also\n// properly handles rollback in the case of failures.\n//\n// This function MUST only be called when there is pending data to be written.\nfunc (tx *transaction) writePendingAndCommit() error {\n\t// Loop through all the pending file deletions and delete them.\n\t// We do this first before doing any of the writes as we can't undo\n\t// deletions of files.\n\tfor _, fileNum := range tx.pendingDelFileNums {\n\t\t// Make sure the file is closed before attempting to delete it.\n\t\ttx.db.store.closeFile(fileNum)\n\n\t\terr := tx.db.store.deleteFileFunc(fileNum)\n\t\tif err != nil {\n\t\t\t// Nothing we can do if we fail to delete blocks besides\n\t\t\t// return an error.\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Save the current block store write position for potential rollback.\n\t// These variables are only updated here in this function and there can\n\t// only be one write transaction active at a time, so it's safe to store\n\t// them for potential rollback.\n\twc := tx.db.store.writeCursor\n\twc.RLock()\n\toldBlkFileNum := wc.curFileNum\n\toldBlkOffset := wc.curOffset\n\twc.RUnlock()\n\n\t// rollback is a closure that is used to rollback all writes to the\n\t// block files.\n\trollback := func() {\n\t\t// Rollback any modifications made to the block files if needed.\n\t\ttx.db.store.handleRollback(oldBlkFileNum, oldBlkOffset)\n\t}\n\n\t// Loop through all of the pending blocks to store and write them.\n\tfor _, blockData := range tx.pendingBlockData {\n\t\tlog.Tracef(\"Storing block %s\", blockData.hash)\n\t\tlocation, err := tx.db.store.writeBlock(blockData.bytes)\n\t\tif err != nil {\n\t\t\trollback()\n\t\t\treturn err\n\t\t}\n\n\t\t// Add a record in the block index for the block.  The record\n\t\t// includes the location information needed to locate the block\n\t\t// on the filesystem as well as the block header since they are\n\t\t// so commonly needed.\n\t\tblockRow := serializeBlockLoc(location)\n\t\terr = tx.blockIdxBucket.Put(blockData.hash[:], blockRow)\n\t\tif err != nil {\n\t\t\trollback()\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Update the metadata for the current write file and offset.\n\twriteRow := serializeWriteRow(wc.curFileNum, wc.curOffset)\n\tif err := tx.metaBucket.Put(writeLocKeyName, writeRow); err != nil {\n\t\trollback()\n\t\treturn convertErr(\"failed to store write cursor\", err)\n\t}\n\n\t// Atomically update the database cache.  The cache automatically\n\t// handles flushing to the underlying persistent storage database.\n\treturn tx.db.cache.commitTx(tx)\n}\n\n// PruneBlocks deletes the block files until it reaches the target size\n// (specified in bytes).  Throws an error if the target size is below\n// the maximum size of a single block file.\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) PruneBlocks(targetSize uint64) ([]chainhash.Hash, error) {\n\t// Ensure transaction state is valid.\n\tif err := tx.checkClosed(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Ensure the transaction is writable.\n\tif !tx.writable {\n\t\tstr := \"prune blocks requires a writable database transaction\"\n\t\treturn nil, makeDbErr(database.ErrTxNotWritable, str, nil)\n\t}\n\n\t// Make a local alias for the maxBlockFileSize.\n\tmaxSize := uint64(tx.db.store.maxBlockFileSize)\n\tif targetSize < maxSize {\n\t\treturn nil, fmt.Errorf(\"got target size of %d but it must be greater \"+\n\t\t\t\"than %d, the max size of a single block file\",\n\t\t\ttargetSize, maxSize)\n\t}\n\n\tfirst, last, lastFileSize, err := scanBlockFiles(tx.db.store.basePath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// If we have no files on disk or just a single file on disk, return early.\n\tif first == last {\n\t\treturn nil, nil\n\t}\n\n\t// Last file number minus the first file number gives us the count of files\n\t// on disk minus 1.  We don't want to count the last file since we can't assume\n\t// that it is of max size.\n\tmaxSizeFileCount := last - first\n\n\t// If the total size of block files are under the target, return early and\n\t// don't prune.\n\ttotalSize := uint64(lastFileSize) + (maxSize * uint64(maxSizeFileCount))\n\tif totalSize <= targetSize {\n\t\treturn nil, nil\n\t}\n\n\tlog.Tracef(\"Using %d more bytes than the target of %d MiB. Pruning files...\",\n\t\ttotalSize-targetSize,\n\t\ttargetSize/(1024*1024))\n\n\tdeletedFiles := make(map[uint32]struct{})\n\n\t// We use < not <= so that the last file is never deleted.  There are other checks in place\n\t// but setting it to < here doesn't hurt.\n\tfor i := uint32(first); i < uint32(last); i++ {\n\t\t// Add the block file to be deleted to the list of files pending deletion to\n\t\t// delete when the transaction is committed.\n\t\tif tx.pendingDelFileNums == nil {\n\t\t\ttx.pendingDelFileNums = make([]uint32, 0, 1)\n\t\t}\n\t\ttx.pendingDelFileNums = append(tx.pendingDelFileNums, i)\n\n\t\t// Add the file index to the deleted files map so that we can later\n\t\t// delete the block location index.\n\t\tdeletedFiles[i] = struct{}{}\n\n\t\t// If we're already at or below the target usage, break and don't\n\t\t// try to delete more files.\n\t\ttotalSize -= maxSize\n\t\tif totalSize <= targetSize {\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// Delete the indexed block locations for the files that we've just deleted.\n\tvar deletedBlockHashes []chainhash.Hash\n\tcursor := tx.blockIdxBucket.Cursor()\n\tfor ok := cursor.First(); ok; ok = cursor.Next() {\n\t\tloc := deserializeBlockLoc(cursor.Value())\n\n\t\t_, found := deletedFiles[loc.blockFileNum]\n\t\tif found {\n\t\t\tdeletedBlockHashes = append(deletedBlockHashes, *(*chainhash.Hash)(cursor.Key()))\n\t\t\terr := cursor.Delete()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t}\n\n\tlog.Tracef(\"Finished pruning. Database now at %d bytes\", totalSize)\n\n\treturn deletedBlockHashes, nil\n}\n\n// BeenPruned returns if the block storage has ever been pruned.\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) BeenPruned() (bool, error) {\n\tfirst, last, _, err := scanBlockFiles(tx.db.store.basePath)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// If the database is pruned, then the first .fdb will not be there.\n\t// We also check that there isn't just 1 file on disk or if there are\n\t// no files on disk by checking if first != last.\n\treturn first != 0 && (first != last), nil\n}\n\n// Commit commits all changes that have been made to the root metadata bucket\n// and all of its sub-buckets to the database cache which is periodically synced\n// to persistent storage.  In addition, it commits all new blocks directly to\n// persistent storage bypassing the db cache.  Blocks can be rather large, so\n// this help increase the amount of cache available for the metadata updates and\n// is safe since blocks are immutable.\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) Commit() error {\n\t// Prevent commits on managed transactions.\n\tif tx.managed {\n\t\ttx.close()\n\t\tpanic(\"managed transaction commit not allowed\")\n\t}\n\n\t// Ensure transaction state is valid.\n\tif err := tx.checkClosed(); err != nil {\n\t\treturn err\n\t}\n\n\t// Regardless of whether the commit succeeds, the transaction is closed\n\t// on return.\n\tdefer tx.close()\n\n\t// Ensure the transaction is writable.\n\tif !tx.writable {\n\t\tstr := \"Commit requires a writable database transaction\"\n\t\treturn makeDbErr(database.ErrTxNotWritable, str, nil)\n\t}\n\n\t// Write pending data.  The function will rollback if any errors occur.\n\treturn tx.writePendingAndCommit()\n}\n\n// Rollback undoes all changes that have been made to the root bucket and all of\n// its sub-buckets.\n//\n// This function is part of the database.Tx interface implementation.\nfunc (tx *transaction) Rollback() error {\n\t// Prevent rollbacks on managed transactions.\n\tif tx.managed {\n\t\ttx.close()\n\t\tpanic(\"managed transaction rollback not allowed\")\n\t}\n\n\t// Ensure transaction state is valid.\n\tif err := tx.checkClosed(); err != nil {\n\t\treturn err\n\t}\n\n\ttx.close()\n\treturn nil\n}\n\n// db represents a collection of namespaces which are persisted and implements\n// the database.DB interface.  All database access is performed through\n// transactions which are obtained through the specific Namespace.\ntype db struct {\n\twriteLock sync.Mutex   // Limit to one write transaction at a time.\n\tcloseLock sync.RWMutex // Make database close block while txns active.\n\tclosed    bool         // Is the database closed?\n\tstore     *blockStore  // Handles read/writing blocks to flat files.\n\tcache     *dbCache     // Cache layer which wraps underlying leveldb DB.\n}\n\n// Enforce db implements the database.DB interface.\nvar _ database.DB = (*db)(nil)\n\n// Type returns the database driver type the current database instance was\n// created with.\n//\n// This function is part of the database.DB interface implementation.\nfunc (db *db) Type() string {\n\treturn dbType\n}\n\n// begin is the implementation function for the Begin database method.  See its\n// documentation for more details.\n//\n// This function is only separate because it returns the internal transaction\n// which is used by the managed transaction code while the database method\n// returns the interface.\nfunc (db *db) begin(writable bool) (*transaction, error) {\n\t// Whenever a new writable transaction is started, grab the write lock\n\t// to ensure only a single write transaction can be active at the same\n\t// time.  This lock will not be released until the transaction is\n\t// closed (via Rollback or Commit).\n\tif writable {\n\t\tdb.writeLock.Lock()\n\t}\n\n\t// Whenever a new transaction is started, grab a read lock against the\n\t// database to ensure Close will wait for the transaction to finish.\n\t// This lock will not be released until the transaction is closed (via\n\t// Rollback or Commit).\n\tdb.closeLock.RLock()\n\tif db.closed {\n\t\tdb.closeLock.RUnlock()\n\t\tif writable {\n\t\t\tdb.writeLock.Unlock()\n\t\t}\n\t\treturn nil, makeDbErr(database.ErrDbNotOpen, errDbNotOpenStr,\n\t\t\tnil)\n\t}\n\n\t// Grab a snapshot of the database cache (which in turn also handles the\n\t// underlying database).\n\tsnapshot, err := db.cache.Snapshot()\n\tif err != nil {\n\t\tdb.closeLock.RUnlock()\n\t\tif writable {\n\t\t\tdb.writeLock.Unlock()\n\t\t}\n\n\t\treturn nil, err\n\t}\n\n\t// The metadata and block index buckets are internal-only buckets, so\n\t// they have defined IDs.\n\ttx := &transaction{\n\t\twritable:      writable,\n\t\tdb:            db,\n\t\tsnapshot:      snapshot,\n\t\tpendingKeys:   treap.NewMutable(),\n\t\tpendingRemove: treap.NewMutable(),\n\t}\n\ttx.metaBucket = &bucket{tx: tx, id: metadataBucketID}\n\ttx.blockIdxBucket = &bucket{tx: tx, id: blockIdxBucketID}\n\treturn tx, nil\n}\n\n// Begin starts a transaction which is either read-only or read-write depending\n// on the specified flag.  Multiple read-only transactions can be started\n// simultaneously while only a single read-write transaction can be started at a\n// time.  The call will block when starting a read-write transaction when one is\n// already open.\n//\n// NOTE: The transaction must be closed by calling Rollback or Commit on it when\n// it is no longer needed.  Failure to do so will result in unclaimed memory.\n//\n// This function is part of the database.DB interface implementation.\nfunc (db *db) Begin(writable bool) (database.Tx, error) {\n\treturn db.begin(writable)\n}\n\n// rollbackOnPanic rolls the passed transaction back if the code in the calling\n// function panics.  This is needed since the mutex on a transaction must be\n// released and a panic in called code would prevent that from happening.\n//\n// NOTE: This can only be handled manually for managed transactions since they\n// control the life-cycle of the transaction.  As the documentation on Begin\n// calls out, callers opting to use manual transactions will have to ensure the\n// transaction is rolled back on panic if it desires that functionality as well\n// or the database will fail to close since the read-lock will never be\n// released.\nfunc rollbackOnPanic(tx *transaction) {\n\tif err := recover(); err != nil {\n\t\ttx.managed = false\n\t\t_ = tx.Rollback()\n\t\tpanic(err)\n\t}\n}\n\n// View invokes the passed function in the context of a managed read-only\n// transaction with the root bucket for the namespace.  Any errors returned from\n// the user-supplied function are returned from this function.\n//\n// This function is part of the database.DB interface implementation.\nfunc (db *db) View(fn func(database.Tx) error) error {\n\t// Start a read-only transaction.\n\ttx, err := db.begin(false)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Since the user-provided function might panic, ensure the transaction\n\t// releases all mutexes and resources.  There is no guarantee the caller\n\t// won't use recover and keep going.  Thus, the database must still be\n\t// in a usable state on panics due to caller issues.\n\tdefer rollbackOnPanic(tx)\n\n\ttx.managed = true\n\terr = fn(tx)\n\ttx.managed = false\n\tif err != nil {\n\t\t// The error is ignored here because nothing was written yet\n\t\t// and regardless of a rollback failure, the tx is closed now\n\t\t// anyways.\n\t\t_ = tx.Rollback()\n\t\treturn err\n\t}\n\n\treturn tx.Rollback()\n}\n\n// Update invokes the passed function in the context of a managed read-write\n// transaction with the root bucket for the namespace.  Any errors returned from\n// the user-supplied function will cause the transaction to be rolled back and\n// are returned from this function.  Otherwise, the transaction is committed\n// when the user-supplied function returns a nil error.\n//\n// This function is part of the database.DB interface implementation.\nfunc (db *db) Update(fn func(database.Tx) error) error {\n\t// Start a read-write transaction.\n\ttx, err := db.begin(true)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Since the user-provided function might panic, ensure the transaction\n\t// releases all mutexes and resources.  There is no guarantee the caller\n\t// won't use recover and keep going.  Thus, the database must still be\n\t// in a usable state on panics due to caller issues.\n\tdefer rollbackOnPanic(tx)\n\n\ttx.managed = true\n\terr = fn(tx)\n\ttx.managed = false\n\tif err != nil {\n\t\t// The error is ignored here because nothing was written yet\n\t\t// and regardless of a rollback failure, the tx is closed now\n\t\t// anyways.\n\t\t_ = tx.Rollback()\n\t\treturn err\n\t}\n\n\treturn tx.Commit()\n}\n\n// Close cleanly shuts down the database and syncs all data.  It will block\n// until all database transactions have been finalized (rolled back or\n// committed).\n//\n// This function is part of the database.DB interface implementation.\nfunc (db *db) Close() error {\n\t// Since all transactions have a read lock on this mutex, this will\n\t// cause Close to wait for all readers to complete.\n\tdb.closeLock.Lock()\n\tdefer db.closeLock.Unlock()\n\n\tif db.closed {\n\t\treturn makeDbErr(database.ErrDbNotOpen, errDbNotOpenStr, nil)\n\t}\n\tdb.closed = true\n\n\t// NOTE: Since the above lock waits for all transactions to finish and\n\t// prevents any new ones from being started, it is safe to flush the\n\t// cache and clear all state without the individual locks.\n\n\t// Close the database cache which will flush any existing entries to\n\t// disk and close the underlying leveldb database.  Any error is saved\n\t// and returned at the end after the remaining cleanup since the\n\t// database will be marked closed even if this fails given there is no\n\t// good way for the caller to recover from a failure here anyways.\n\tcloseErr := db.cache.Close()\n\n\t// Close any open flat files that house the blocks.\n\twc := db.store.writeCursor\n\tif wc.curFile.file != nil {\n\t\t_ = wc.curFile.file.Close()\n\t\twc.curFile.file = nil\n\t}\n\tfor _, blockFile := range db.store.openBlockFiles {\n\t\t_ = blockFile.file.Close()\n\t}\n\tdb.store.openBlockFiles = nil\n\tdb.store.openBlocksLRU.Init()\n\tdb.store.fileNumToLRUElem = nil\n\n\treturn closeErr\n}\n\n// fileExists reports whether the named file or directory exists.\nfunc fileExists(name string) bool {\n\tif _, err := os.Stat(name); err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// initDB creates the initial buckets and values used by the package.  This is\n// mainly in a separate function for testing purposes.\nfunc initDB(ldb *leveldb.DB) error {\n\t// The starting block file write cursor location is file num 0, offset\n\t// 0.\n\tbatch := new(leveldb.Batch)\n\tbatch.Put(bucketizedKey(metadataBucketID, writeLocKeyName),\n\t\tserializeWriteRow(0, 0))\n\n\t// Create block index bucket and set the current bucket id.\n\t//\n\t// NOTE: Since buckets are virtualized through the use of prefixes,\n\t// there is no need to store the bucket index data for the metadata\n\t// bucket in the database.  However, the first bucket ID to use does\n\t// need to account for it to ensure there are no key collisions.\n\tbatch.Put(bucketIndexKey(metadataBucketID, blockIdxBucketName),\n\t\tblockIdxBucketID[:])\n\tbatch.Put(curBucketIDKeyName, blockIdxBucketID[:])\n\n\t// Write everything as a single batch.\n\tif err := ldb.Write(batch, nil); err != nil {\n\t\tstr := fmt.Sprintf(\"failed to initialize metadata database: %v\",\n\t\t\terr)\n\t\treturn convertErr(str, err)\n\t}\n\n\treturn nil\n}\n\n// openDB opens the database at the provided path.  database.ErrDbDoesNotExist\n// is returned if the database doesn't exist and the create flag is not set.\nfunc openDB(dbPath string, network wire.BitcoinNet, create bool) (database.DB, error) {\n\t// Error if the database doesn't exist and the create flag is not set.\n\tmetadataDbPath := filepath.Join(dbPath, metadataDbName)\n\tdbExists := fileExists(metadataDbPath)\n\tif !create && !dbExists {\n\t\tstr := fmt.Sprintf(\"database %q does not exist\", metadataDbPath)\n\t\treturn nil, makeDbErr(database.ErrDbDoesNotExist, str, nil)\n\t}\n\n\t// Ensure the full path to the database exists.\n\tif !dbExists {\n\t\t// The error can be ignored here since the call to\n\t\t// leveldb.OpenFile will fail if the directory couldn't be\n\t\t// created.\n\t\t_ = os.MkdirAll(dbPath, 0700)\n\t}\n\n\t// Open the metadata database (will create it if needed).\n\topts := opt.Options{\n\t\tErrorIfExist: create,\n\t\tStrict:       opt.DefaultStrict,\n\t\tCompression:  opt.NoCompression,\n\t\tFilter:       filter.NewBloomFilter(10),\n\t}\n\tldb, err := leveldb.OpenFile(metadataDbPath, &opts)\n\tif err != nil {\n\t\treturn nil, convertErr(err.Error(), err)\n\t}\n\n\t// Create the block store which includes scanning the existing flat\n\t// block files to find what the current write cursor position is\n\t// according to the data that is actually on disk.  Also create the\n\t// database cache which wraps the underlying leveldb database to provide\n\t// write caching.\n\tstore, err := newBlockStore(dbPath, network)\n\tif err != nil {\n\t\treturn nil, convertErr(err.Error(), err)\n\t}\n\tcache := newDbCache(ldb, store, defaultCacheSize, defaultFlushSecs)\n\tpdb := &db{store: store, cache: cache}\n\n\t// Perform any reconciliation needed between the block and metadata as\n\t// well as database initialization, if needed.\n\treturn reconcileDB(pdb, create)\n}\n"
  },
  {
    "path": "database/ffldb/dbcache.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ffldb\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/database/internal/treap\"\n\t\"github.com/syndtr/goleveldb/leveldb\"\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nconst (\n\t// defaultCacheSize is the default size for the database cache.\n\tdefaultCacheSize = 100 * 1024 * 1024 // 100 MB\n\n\t// defaultFlushSecs is the default number of seconds to use as a\n\t// threshold in between database cache flushes when the cache size has\n\t// not been exceeded.\n\tdefaultFlushSecs = 300 // 5 minutes\n\n\t// ldbBatchHeaderSize is the size of a leveldb batch header which\n\t// includes the sequence header and record counter.\n\t//\n\t// ldbRecordIKeySize is the size of the ikey used internally by leveldb\n\t// when appending a record to a batch.\n\t//\n\t// These are used to help preallocate space needed for a batch in one\n\t// allocation instead of letting leveldb itself constantly grow it.\n\t// This results in far less pressure on the GC and consequently helps\n\t// prevent the GC from allocating a lot of extra unneeded space.\n\tldbBatchHeaderSize = 12\n\tldbRecordIKeySize  = 8\n)\n\n// ldbCacheIter wraps a treap iterator to provide the additional functionality\n// needed to satisfy the leveldb iterator.Iterator interface.\ntype ldbCacheIter struct {\n\t*treap.Iterator\n}\n\n// Enforce ldbCacheIterator implements the leveldb iterator.Iterator interface.\nvar _ iterator.Iterator = (*ldbCacheIter)(nil)\n\n// Error is only provided to satisfy the iterator interface as there are no\n// errors for this memory-only structure.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *ldbCacheIter) Error() error {\n\treturn nil\n}\n\n// SetReleaser is only provided to satisfy the iterator interface as there is no\n// need to override it.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *ldbCacheIter) SetReleaser(releaser util.Releaser) {\n}\n\n// Release is only provided to satisfy the iterator interface.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *ldbCacheIter) Release() {\n}\n\n// newLdbCacheIter creates a new treap iterator for the given slice against the\n// pending keys for the passed cache snapshot and returns it wrapped in an\n// ldbCacheIter so it can be used as a leveldb iterator.\nfunc newLdbCacheIter(snap *dbCacheSnapshot, slice *util.Range) *ldbCacheIter {\n\titer := snap.pendingKeys.Iterator(slice.Start, slice.Limit)\n\treturn &ldbCacheIter{Iterator: iter}\n}\n\n// dbCacheIterator defines an iterator over the key/value pairs in the database\n// cache and underlying database.\ntype dbCacheIterator struct {\n\tcacheSnapshot *dbCacheSnapshot\n\tdbIter        iterator.Iterator\n\tcacheIter     iterator.Iterator\n\tcurrentIter   iterator.Iterator\n\treleased      bool\n}\n\n// Enforce dbCacheIterator implements the leveldb iterator.Iterator interface.\nvar _ iterator.Iterator = (*dbCacheIterator)(nil)\n\n// skipPendingUpdates skips any keys at the current database iterator position\n// that are being updated by the cache.  The forwards flag indicates the\n// direction the iterator is moving.\nfunc (iter *dbCacheIterator) skipPendingUpdates(forwards bool) {\n\tfor iter.dbIter.Valid() {\n\t\tvar skip bool\n\t\tkey := iter.dbIter.Key()\n\t\tif iter.cacheSnapshot.pendingRemove.Has(key) {\n\t\t\tskip = true\n\t\t} else if iter.cacheSnapshot.pendingKeys.Has(key) {\n\t\t\tskip = true\n\t\t}\n\t\tif !skip {\n\t\t\tbreak\n\t\t}\n\n\t\tif forwards {\n\t\t\titer.dbIter.Next()\n\t\t} else {\n\t\t\titer.dbIter.Prev()\n\t\t}\n\t}\n}\n\n// chooseIterator first skips any entries in the database iterator that are\n// being updated by the cache and sets the current iterator to the appropriate\n// iterator depending on their validity and the order they compare in while taking\n// into account the direction flag.  When the iterator is being moved forwards\n// and both iterators are valid, the iterator with the smaller key is chosen and\n// vice versa when the iterator is being moved backwards.\nfunc (iter *dbCacheIterator) chooseIterator(forwards bool) bool {\n\t// Skip any keys at the current database iterator position that are\n\t// being updated by the cache.\n\titer.skipPendingUpdates(forwards)\n\n\t// When both iterators are exhausted, the iterator is exhausted too.\n\tif !iter.dbIter.Valid() && !iter.cacheIter.Valid() {\n\t\titer.currentIter = nil\n\t\treturn false\n\t}\n\n\t// Choose the database iterator when the cache iterator is exhausted.\n\tif !iter.cacheIter.Valid() {\n\t\titer.currentIter = iter.dbIter\n\t\treturn true\n\t}\n\n\t// Choose the cache iterator when the database iterator is exhausted.\n\tif !iter.dbIter.Valid() {\n\t\titer.currentIter = iter.cacheIter\n\t\treturn true\n\t}\n\n\t// Both iterators are valid, so choose the iterator with either the\n\t// smaller or larger key depending on the forwards flag.\n\tcompare := bytes.Compare(iter.dbIter.Key(), iter.cacheIter.Key())\n\tif (forwards && compare > 0) || (!forwards && compare < 0) {\n\t\titer.currentIter = iter.cacheIter\n\t} else {\n\t\titer.currentIter = iter.dbIter\n\t}\n\treturn true\n}\n\n// First positions the iterator at the first key/value pair and returns whether\n// or not the pair exists.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *dbCacheIterator) First() bool {\n\t// Seek to the first key in both the database and cache iterators and\n\t// choose the iterator that is both valid and has the smaller key.\n\titer.dbIter.First()\n\titer.cacheIter.First()\n\treturn iter.chooseIterator(true)\n}\n\n// Last positions the iterator at the last key/value pair and returns whether or\n// not the pair exists.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *dbCacheIterator) Last() bool {\n\t// Seek to the last key in both the database and cache iterators and\n\t// choose the iterator that is both valid and has the larger key.\n\titer.dbIter.Last()\n\titer.cacheIter.Last()\n\treturn iter.chooseIterator(false)\n}\n\n// Next moves the iterator one key/value pair forward and returns whether or not\n// the pair exists.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *dbCacheIterator) Next() bool {\n\t// Nothing to return if cursor is exhausted.\n\tif iter.currentIter == nil {\n\t\treturn false\n\t}\n\n\t// Move the current iterator to the next entry and choose the iterator\n\t// that is both valid and has the smaller key.\n\titer.currentIter.Next()\n\treturn iter.chooseIterator(true)\n}\n\n// Prev moves the iterator one key/value pair backward and returns whether or\n// not the pair exists.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *dbCacheIterator) Prev() bool {\n\t// Nothing to return if cursor is exhausted.\n\tif iter.currentIter == nil {\n\t\treturn false\n\t}\n\n\t// Move the current iterator to the previous entry and choose the\n\t// iterator that is both valid and has the larger key.\n\titer.currentIter.Prev()\n\treturn iter.chooseIterator(false)\n}\n\n// Seek positions the iterator at the first key/value pair that is greater than\n// or equal to the passed seek key.  Returns false if no suitable key was found.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *dbCacheIterator) Seek(key []byte) bool {\n\t// Seek to the provided key in both the database and cache iterators\n\t// then choose the iterator that is both valid and has the larger key.\n\titer.dbIter.Seek(key)\n\titer.cacheIter.Seek(key)\n\treturn iter.chooseIterator(true)\n}\n\n// Valid indicates whether the iterator is positioned at a valid key/value pair.\n// It will be considered invalid when the iterator is newly created or exhausted.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *dbCacheIterator) Valid() bool {\n\treturn iter.currentIter != nil\n}\n\n// Key returns the current key the iterator is pointing to.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *dbCacheIterator) Key() []byte {\n\t// Nothing to return if iterator is exhausted.\n\tif iter.currentIter == nil {\n\t\treturn nil\n\t}\n\n\treturn iter.currentIter.Key()\n}\n\n// Value returns the current value the iterator is pointing to.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *dbCacheIterator) Value() []byte {\n\t// Nothing to return if iterator is exhausted.\n\tif iter.currentIter == nil {\n\t\treturn nil\n\t}\n\n\treturn iter.currentIter.Value()\n}\n\n// SetReleaser is only provided to satisfy the iterator interface as there is no\n// need to override it.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *dbCacheIterator) SetReleaser(releaser util.Releaser) {\n}\n\n// Release releases the iterator by removing the underlying treap iterator from\n// the list of active iterators against the pending keys treap.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *dbCacheIterator) Release() {\n\tif !iter.released {\n\t\titer.dbIter.Release()\n\t\titer.cacheIter.Release()\n\t\titer.currentIter = nil\n\t\titer.released = true\n\t}\n}\n\n// Error is only provided to satisfy the iterator interface as there are no\n// errors for this memory-only structure.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *dbCacheIterator) Error() error {\n\treturn nil\n}\n\n// dbCacheSnapshot defines a snapshot of the database cache and underlying\n// database at a particular point in time.\ntype dbCacheSnapshot struct {\n\tdbSnapshot    *leveldb.Snapshot\n\tpendingKeys   *treap.Immutable\n\tpendingRemove *treap.Immutable\n}\n\n// Has returns whether or not the passed key exists.\nfunc (snap *dbCacheSnapshot) Has(key []byte) bool {\n\t// Check the cached entries first.\n\tif snap.pendingRemove.Has(key) {\n\t\treturn false\n\t}\n\tif snap.pendingKeys.Has(key) {\n\t\treturn true\n\t}\n\n\t// Consult the database.\n\thasKey, _ := snap.dbSnapshot.Has(key, nil)\n\treturn hasKey\n}\n\n// Get returns the value for the passed key.  The function will return nil when\n// the key does not exist.\nfunc (snap *dbCacheSnapshot) Get(key []byte) []byte {\n\t// Check the cached entries first.\n\tif snap.pendingRemove.Has(key) {\n\t\treturn nil\n\t}\n\tif value := snap.pendingKeys.Get(key); value != nil {\n\t\treturn value\n\t}\n\n\t// Consult the database.\n\tvalue, err := snap.dbSnapshot.Get(key, nil)\n\tif err != nil {\n\t\treturn nil\n\t}\n\treturn value\n}\n\n// Release releases the snapshot.\nfunc (snap *dbCacheSnapshot) Release() {\n\tsnap.dbSnapshot.Release()\n\tsnap.pendingKeys = nil\n\tsnap.pendingRemove = nil\n}\n\n// NewIterator returns a new iterator for the snapshot.  The newly returned\n// iterator is not pointing to a valid item until a call to one of the methods\n// to position it is made.\n//\n// The slice parameter allows the iterator to be limited to a range of keys.\n// The start key is inclusive and the limit key is exclusive.  Either or both\n// can be nil if the functionality is not desired.\nfunc (snap *dbCacheSnapshot) NewIterator(slice *util.Range) *dbCacheIterator {\n\treturn &dbCacheIterator{\n\t\tdbIter:        snap.dbSnapshot.NewIterator(slice, nil),\n\t\tcacheIter:     newLdbCacheIter(snap, slice),\n\t\tcacheSnapshot: snap,\n\t}\n}\n\n// dbCache provides a database cache layer backed by an underlying database.  It\n// allows a maximum cache size and flush interval to be specified such that the\n// cache is flushed to the database when the cache size exceeds the maximum\n// configured value or it has been longer than the configured interval since the\n// last flush.  This effectively provides transaction batching so that callers\n// can commit transactions at will without incurring large performance hits due\n// to frequent disk syncs.\ntype dbCache struct {\n\t// ldb is the underlying leveldb DB for metadata.\n\tldb *leveldb.DB\n\n\t// store is used to sync blocks to flat files.\n\tstore *blockStore\n\n\t// The following fields are related to flushing the cache to persistent\n\t// storage.  Note that all flushing is performed in an opportunistic\n\t// fashion.  This means that it is only flushed during a transaction or\n\t// when the database cache is closed.\n\t//\n\t// maxSize is the maximum size threshold the cache can grow to before\n\t// it is flushed.\n\t//\n\t// flushInterval is the threshold interval of time that is allowed to\n\t// pass before the cache is flushed.\n\t//\n\t// lastFlush is the time the cache was last flushed.  It is used in\n\t// conjunction with the current time and the flush interval.\n\t//\n\t// NOTE: These flush related fields are protected by the database write\n\t// lock.\n\tmaxSize       uint64\n\tflushInterval time.Duration\n\tlastFlush     time.Time\n\n\t// The following fields hold the keys that need to be stored or deleted\n\t// from the underlying database once the cache is full, enough time has\n\t// passed, or when the database is shutting down.  Note that these are\n\t// stored using immutable treaps to support O(1) MVCC snapshots against\n\t// the cached data.  The cacheLock is used to protect concurrent access\n\t// for cache updates and snapshots.\n\tcacheLock    sync.RWMutex\n\tcachedKeys   *treap.Immutable\n\tcachedRemove *treap.Immutable\n}\n\n// Snapshot returns a snapshot of the database cache and underlying database at\n// a particular point in time.\n//\n// The snapshot must be released after use by calling Release.\nfunc (c *dbCache) Snapshot() (*dbCacheSnapshot, error) {\n\tdbSnapshot, err := c.ldb.GetSnapshot()\n\tif err != nil {\n\t\tstr := \"failed to open transaction\"\n\t\treturn nil, convertErr(str, err)\n\t}\n\n\t// Since the cached keys to be added and removed use an immutable treap,\n\t// a snapshot is simply obtaining the root of the tree under the lock\n\t// which is used to atomically swap the root.\n\tc.cacheLock.RLock()\n\tcacheSnapshot := &dbCacheSnapshot{\n\t\tdbSnapshot:    dbSnapshot,\n\t\tpendingKeys:   c.cachedKeys,\n\t\tpendingRemove: c.cachedRemove,\n\t}\n\tc.cacheLock.RUnlock()\n\treturn cacheSnapshot, nil\n}\n\n// updateDB invokes the passed function in the context of a managed leveldb\n// transaction.  Any errors returned from the user-supplied function will cause\n// the transaction to be rolled back and are returned from this function.\n// Otherwise, the transaction is committed when the user-supplied function\n// returns a nil error.\nfunc (c *dbCache) updateDB(fn func(ldbTx *leveldb.Transaction) error) error {\n\t// Start a leveldb transaction.\n\tldbTx, err := c.ldb.OpenTransaction()\n\tif err != nil {\n\t\treturn convertErr(\"failed to open ldb transaction\", err)\n\t}\n\n\tif err := fn(ldbTx); err != nil {\n\t\tldbTx.Discard()\n\t\treturn err\n\t}\n\n\t// Commit the leveldb transaction and convert any errors as needed.\n\tif err := ldbTx.Commit(); err != nil {\n\t\treturn convertErr(\"failed to commit leveldb transaction\", err)\n\t}\n\treturn nil\n}\n\n// TreapForEacher is an interface which allows iteration of a treap in ascending\n// order using a user-supplied callback for each key/value pair.  It mainly\n// exists so both mutable and immutable treaps can be atomically committed to\n// the database with the same function.\ntype TreapForEacher interface {\n\tForEach(func(k, v []byte) bool)\n}\n\n// commitTreaps atomically commits all of the passed pending add/update/remove\n// updates to the underlying database.\nfunc (c *dbCache) commitTreaps(pendingKeys, pendingRemove TreapForEacher) error {\n\t// Perform all leveldb updates using an atomic transaction.\n\treturn c.updateDB(func(ldbTx *leveldb.Transaction) error {\n\t\tvar innerErr error\n\t\tpendingKeys.ForEach(func(k, v []byte) bool {\n\t\t\tif dbErr := ldbTx.Put(k, v, nil); dbErr != nil {\n\t\t\t\tstr := fmt.Sprintf(\"failed to put key %q to \"+\n\t\t\t\t\t\"ldb transaction\", k)\n\t\t\t\tinnerErr = convertErr(str, dbErr)\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t})\n\t\tif innerErr != nil {\n\t\t\treturn innerErr\n\t\t}\n\n\t\tpendingRemove.ForEach(func(k, v []byte) bool {\n\t\t\tif dbErr := ldbTx.Delete(k, nil); dbErr != nil {\n\t\t\t\tstr := fmt.Sprintf(\"failed to delete \"+\n\t\t\t\t\t\"key %q from ldb transaction\",\n\t\t\t\t\tk)\n\t\t\t\tinnerErr = convertErr(str, dbErr)\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t})\n\t\treturn innerErr\n\t})\n}\n\n// flush flushes the database cache to persistent storage.  This involes syncing\n// the block store and replaying all transactions that have been applied to the\n// cache to the underlying database.\n//\n// This function MUST be called with the database write lock held.\nfunc (c *dbCache) flush() error {\n\tc.lastFlush = time.Now()\n\n\t// Sync the current write file associated with the block store.  This is\n\t// necessary before writing the metadata to prevent the case where the\n\t// metadata contains information about a block which actually hasn't\n\t// been written yet in unexpected shutdown scenarios.\n\tif err := c.store.syncBlocks(); err != nil {\n\t\treturn err\n\t}\n\n\t// Since the cached keys to be added and removed use an immutable treap,\n\t// a snapshot is simply obtaining the root of the tree under the lock\n\t// which is used to atomically swap the root.\n\tc.cacheLock.RLock()\n\tcachedKeys := c.cachedKeys\n\tcachedRemove := c.cachedRemove\n\tc.cacheLock.RUnlock()\n\n\t// Nothing to do if there is no data to flush.\n\tif cachedKeys.Len() == 0 && cachedRemove.Len() == 0 {\n\t\treturn nil\n\t}\n\n\t// Perform all leveldb updates using an atomic transaction.\n\tif err := c.commitTreaps(cachedKeys, cachedRemove); err != nil {\n\t\tif errors.Is(err, syscall.ENOSPC) {\n\t\t\tlog.Errorf(\"%v. Cannot save any more blocks \"+\n\t\t\t\t\"due to the disk being full \"+\n\t\t\t\t\"-- exiting\", err)\n\t\t\tos.Exit(1)\n\t\t}\n\t\treturn err\n\t}\n\n\t// Clear the cache since it has been flushed.\n\tc.cacheLock.Lock()\n\tc.cachedKeys = treap.NewImmutable()\n\tc.cachedRemove = treap.NewImmutable()\n\tc.cacheLock.Unlock()\n\n\treturn nil\n}\n\n// needsFlush returns whether or not the database cache needs to be flushed to\n// persistent storage based on its current size, whether or not adding all of\n// the entries in the passed database transaction would cause it to exceed the\n// configured limit, and how much time has elapsed since the last time the cache\n// was flushed.\n//\n// This function MUST be called with the database write lock held.\nfunc (c *dbCache) needsFlush(tx *transaction) bool {\n\t// A flush is needed when more time has elapsed than the configured\n\t// flush interval.\n\tif time.Since(c.lastFlush) > c.flushInterval {\n\t\treturn true\n\t}\n\n\t// A flush is needed when the size of the database cache exceeds the\n\t// specified max cache size.  The total calculated size is multiplied by\n\t// 1.5 here to account for additional memory consumption that will be\n\t// needed during the flush as well as old nodes in the cache that are\n\t// referenced by the snapshot used by the transaction.\n\tsnap := tx.snapshot\n\ttotalSize := snap.pendingKeys.Size() + snap.pendingRemove.Size()\n\ttotalSize = uint64(float64(totalSize) * 1.5)\n\treturn totalSize > c.maxSize\n}\n\n// commitTx atomically adds all of the pending keys to add and remove into the\n// database cache.  When adding the pending keys would cause the size of the\n// cache to exceed the max cache size, or the time since the last flush exceeds\n// the configured flush interval, the cache will be flushed to the underlying\n// persistent database.\n//\n// This is an atomic operation with respect to the cache in that either all of\n// the pending keys to add and remove in the transaction will be applied or none\n// of them will.\n//\n// The database cache itself might be flushed to the underlying persistent\n// database even if the transaction fails to apply, but it will only be the\n// state of the cache without the transaction applied.\n//\n// This function MUST be called during a database write transaction which in\n// turn implies the database write lock will be held.\nfunc (c *dbCache) commitTx(tx *transaction) error {\n\t// Flush the cache and write the current transaction directly to the\n\t// database if a flush is needed.\n\tif c.needsFlush(tx) {\n\t\tif err := c.flush(); err != nil {\n\t\t\tif errors.Is(err, syscall.ENOSPC) {\n\t\t\t\tlog.Errorf(\"%v. Cannot save any more blocks \"+\n\t\t\t\t\t\"due to the disk being full \"+\n\t\t\t\t\t\"-- exiting\", err)\n\t\t\t\tos.Exit(1)\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\n\t\t// Perform all leveldb updates using an atomic transaction.\n\t\terr := c.commitTreaps(tx.pendingKeys, tx.pendingRemove)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Clear the transaction entries since they have been committed.\n\t\ttx.pendingKeys = nil\n\t\ttx.pendingRemove = nil\n\t\treturn nil\n\t}\n\n\t// At this point a database flush is not needed, so atomically commit\n\t// the transaction to the cache.\n\n\t// Since the cached keys to be added and removed use an immutable treap,\n\t// a snapshot is simply obtaining the root of the tree under the lock\n\t// which is used to atomically swap the root.\n\tc.cacheLock.RLock()\n\tnewCachedKeys := c.cachedKeys\n\tnewCachedRemove := c.cachedRemove\n\tc.cacheLock.RUnlock()\n\n\t// Apply every key to add in the database transaction to the cache.\n\ttx.pendingKeys.ForEach(func(k, v []byte) bool {\n\t\tnewCachedRemove = newCachedRemove.Delete(k)\n\t\tnewCachedKeys = newCachedKeys.Put(k, v)\n\t\treturn true\n\t})\n\ttx.pendingKeys = nil\n\n\t// Apply every key to remove in the database transaction to the cache.\n\ttx.pendingRemove.ForEach(func(k, v []byte) bool {\n\t\tnewCachedKeys = newCachedKeys.Delete(k)\n\t\tnewCachedRemove = newCachedRemove.Put(k, nil)\n\t\treturn true\n\t})\n\ttx.pendingRemove = nil\n\n\t// Atomically replace the immutable treaps which hold the cached keys to\n\t// add and delete.\n\tc.cacheLock.Lock()\n\tc.cachedKeys = newCachedKeys\n\tc.cachedRemove = newCachedRemove\n\tc.cacheLock.Unlock()\n\treturn nil\n}\n\n// Close cleanly shuts down the database cache by syncing all data and closing\n// the underlying leveldb database.\n//\n// This function MUST be called with the database write lock held.\nfunc (c *dbCache) Close() error {\n\t// Flush any outstanding cached entries to disk.\n\tif err := c.flush(); err != nil {\n\t\t// Even if there is an error while flushing, attempt to close\n\t\t// the underlying database.  The error is ignored since it would\n\t\t// mask the flush error.\n\t\t_ = c.ldb.Close()\n\t\treturn err\n\t}\n\n\t// Close the underlying leveldb database.\n\tif err := c.ldb.Close(); err != nil {\n\t\tstr := \"failed to close underlying leveldb database\"\n\t\treturn convertErr(str, err)\n\t}\n\n\treturn nil\n}\n\n// newDbCache returns a new database cache instance backed by the provided\n// leveldb instance.  The cache will be flushed to leveldb when the max size\n// exceeds the provided value or it has been longer than the provided interval\n// since the last flush.\nfunc newDbCache(ldb *leveldb.DB, store *blockStore, maxSize uint64, flushIntervalSecs uint32) *dbCache {\n\treturn &dbCache{\n\t\tldb:           ldb,\n\t\tstore:         store,\n\t\tmaxSize:       maxSize,\n\t\tflushInterval: time.Second * time.Duration(flushIntervalSecs),\n\t\tlastFlush:     time.Now(),\n\t\tcachedKeys:    treap.NewImmutable(),\n\t\tcachedRemove:  treap.NewImmutable(),\n\t}\n}\n"
  },
  {
    "path": "database/ffldb/doc.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage ffldb implements a driver for the database package that uses leveldb\nfor the backing metadata and flat files for block storage.\n\nThis driver is the recommended driver for use with btcd.  It makes use leveldb\nfor the metadata, flat files for block storage, and checksums in key areas to\nensure data integrity.\n\n# Usage\n\nThis package is a driver to the database package and provides the database type\nof \"ffldb\".  The parameters the Open and Create functions take are the\ndatabase path as a string and the block network:\n\n\tdb, err := database.Open(\"ffldb\", \"path/to/database\", wire.MainNet)\n\tif err != nil {\n\t\t// Handle error\n\t}\n\n\tdb, err := database.Create(\"ffldb\", \"path/to/database\", wire.MainNet)\n\tif err != nil {\n\t\t// Handle error\n\t}\n*/\npackage ffldb\n"
  },
  {
    "path": "database/ffldb/driver.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ffldb\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/btcsuite/btclog\"\n)\n\nvar log = btclog.Disabled\n\nconst (\n\tdbType = \"ffldb\"\n)\n\n// parseArgs parses the arguments from the database Open/Create methods.\nfunc parseArgs(funcName string, args ...interface{}) (string, wire.BitcoinNet, error) {\n\tif len(args) != 2 {\n\t\treturn \"\", 0, fmt.Errorf(\"invalid arguments to %s.%s -- \"+\n\t\t\t\"expected database path and block network\", dbType,\n\t\t\tfuncName)\n\t}\n\n\tdbPath, ok := args[0].(string)\n\tif !ok {\n\t\treturn \"\", 0, fmt.Errorf(\"first argument to %s.%s is invalid -- \"+\n\t\t\t\"expected database path string\", dbType, funcName)\n\t}\n\n\tnetwork, ok := args[1].(wire.BitcoinNet)\n\tif !ok {\n\t\treturn \"\", 0, fmt.Errorf(\"second argument to %s.%s is invalid -- \"+\n\t\t\t\"expected block network\", dbType, funcName)\n\t}\n\n\treturn dbPath, network, nil\n}\n\n// openDBDriver is the callback provided during driver registration that opens\n// an existing database for use.\nfunc openDBDriver(args ...interface{}) (database.DB, error) {\n\tdbPath, network, err := parseArgs(\"Open\", args...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn openDB(dbPath, network, false)\n}\n\n// createDBDriver is the callback provided during driver registration that\n// creates, initializes, and opens a database for use.\nfunc createDBDriver(args ...interface{}) (database.DB, error) {\n\tdbPath, network, err := parseArgs(\"Create\", args...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn openDB(dbPath, network, true)\n}\n\n// useLogger is the callback provided during driver registration that sets the\n// current logger to the provided one.\nfunc useLogger(logger btclog.Logger) {\n\tlog = logger\n}\n\nfunc init() {\n\t// Register the driver.\n\tdriver := database.Driver{\n\t\tDbType:    dbType,\n\t\tCreate:    createDBDriver,\n\t\tOpen:      openDBDriver,\n\t\tUseLogger: useLogger,\n\t}\n\tif err := database.RegisterDriver(driver); err != nil {\n\t\tpanic(fmt.Sprintf(\"Failed to register database driver '%s': %v\",\n\t\t\tdbType, err))\n\t}\n}\n"
  },
  {
    "path": "database/ffldb/driver_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ffldb_test\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/database/ffldb\"\n)\n\n// dbType is the database type name for this driver.\nconst dbType = \"ffldb\"\n\n// TestCreateOpenFail ensures that errors related to creating and opening a\n// database are handled properly.\nfunc TestCreateOpenFail(t *testing.T) {\n\tt.Parallel()\n\n\t// Ensure that attempting to open a database that doesn't exist returns\n\t// the expected error.\n\twantErrCode := database.ErrDbDoesNotExist\n\t_, err := database.Open(dbType, \"noexist\", blockDataNet)\n\tif !checkDbError(t, \"Open\", err, wantErrCode) {\n\t\treturn\n\t}\n\n\t// Ensure that attempting to open a database with the wrong number of\n\t// parameters returns the expected error.\n\twantErr := fmt.Errorf(\"invalid arguments to %s.Open -- expected \"+\n\t\t\"database path and block network\", dbType)\n\t_, err = database.Open(dbType, 1, 2, 3)\n\tif err.Error() != wantErr.Error() {\n\t\tt.Errorf(\"Open: did not receive expected error - got %v, \"+\n\t\t\t\"want %v\", err, wantErr)\n\t\treturn\n\t}\n\n\t// Ensure that attempting to open a database with an invalid type for\n\t// the first parameter returns the expected error.\n\twantErr = fmt.Errorf(\"first argument to %s.Open is invalid -- \"+\n\t\t\"expected database path string\", dbType)\n\t_, err = database.Open(dbType, 1, blockDataNet)\n\tif err.Error() != wantErr.Error() {\n\t\tt.Errorf(\"Open: did not receive expected error - got %v, \"+\n\t\t\t\"want %v\", err, wantErr)\n\t\treturn\n\t}\n\n\t// Ensure that attempting to open a database with an invalid type for\n\t// the second parameter returns the expected error.\n\twantErr = fmt.Errorf(\"second argument to %s.Open is invalid -- \"+\n\t\t\"expected block network\", dbType)\n\t_, err = database.Open(dbType, \"noexist\", \"invalid\")\n\tif err.Error() != wantErr.Error() {\n\t\tt.Errorf(\"Open: did not receive expected error - got %v, \"+\n\t\t\t\"want %v\", err, wantErr)\n\t\treturn\n\t}\n\n\t// Ensure that attempting to create a database with the wrong number of\n\t// parameters returns the expected error.\n\twantErr = fmt.Errorf(\"invalid arguments to %s.Create -- expected \"+\n\t\t\"database path and block network\", dbType)\n\t_, err = database.Create(dbType, 1, 2, 3)\n\tif err.Error() != wantErr.Error() {\n\t\tt.Errorf(\"Create: did not receive expected error - got %v, \"+\n\t\t\t\"want %v\", err, wantErr)\n\t\treturn\n\t}\n\n\t// Ensure that attempting to create a database with an invalid type for\n\t// the first parameter returns the expected error.\n\twantErr = fmt.Errorf(\"first argument to %s.Create is invalid -- \"+\n\t\t\"expected database path string\", dbType)\n\t_, err = database.Create(dbType, 1, blockDataNet)\n\tif err.Error() != wantErr.Error() {\n\t\tt.Errorf(\"Create: did not receive expected error - got %v, \"+\n\t\t\t\"want %v\", err, wantErr)\n\t\treturn\n\t}\n\n\t// Ensure that attempting to create a database with an invalid type for\n\t// the second parameter returns the expected error.\n\twantErr = fmt.Errorf(\"second argument to %s.Create is invalid -- \"+\n\t\t\"expected block network\", dbType)\n\t_, err = database.Create(dbType, \"noexist\", \"invalid\")\n\tif err.Error() != wantErr.Error() {\n\t\tt.Errorf(\"Create: did not receive expected error - got %v, \"+\n\t\t\t\"want %v\", err, wantErr)\n\t\treturn\n\t}\n\n\t// Ensure operations against a closed database return the expected\n\t// error.\n\tdbPath := filepath.Join(t.TempDir(), \"ffldb-createfail\")\n\t_ = os.RemoveAll(dbPath)\n\tdb, err := database.Create(dbType, dbPath, blockDataNet)\n\tif err != nil {\n\t\tt.Errorf(\"Create: unexpected error: %v\", err)\n\t\treturn\n\t}\n\tdb.Close()\n\n\twantErrCode = database.ErrDbNotOpen\n\terr = db.View(func(tx database.Tx) error {\n\t\treturn nil\n\t})\n\tif !checkDbError(t, \"View\", err, wantErrCode) {\n\t\treturn\n\t}\n\n\twantErrCode = database.ErrDbNotOpen\n\terr = db.Update(func(tx database.Tx) error {\n\t\treturn nil\n\t})\n\tif !checkDbError(t, \"Update\", err, wantErrCode) {\n\t\treturn\n\t}\n\n\twantErrCode = database.ErrDbNotOpen\n\t_, err = db.Begin(false)\n\tif !checkDbError(t, \"Begin(false)\", err, wantErrCode) {\n\t\treturn\n\t}\n\n\twantErrCode = database.ErrDbNotOpen\n\t_, err = db.Begin(true)\n\tif !checkDbError(t, \"Begin(true)\", err, wantErrCode) {\n\t\treturn\n\t}\n\n\twantErrCode = database.ErrDbNotOpen\n\terr = db.Close()\n\tif !checkDbError(t, \"Close\", err, wantErrCode) {\n\t\treturn\n\t}\n}\n\n// TestPersistence ensures that values stored are still valid after closing and\n// reopening the database.\nfunc TestPersistence(t *testing.T) {\n\tt.Parallel()\n\n\t// Create a new database to run tests against.\n\tdbPath := filepath.Join(t.TempDir(), \"ffldb-persistencetest\")\n\t_ = os.RemoveAll(dbPath)\n\tdb, err := database.Create(dbType, dbPath, blockDataNet)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to create test database (%s) %v\", dbType, err)\n\t\treturn\n\t}\n\tdefer db.Close()\n\n\t// Create a bucket, put some values into it, and store a block so they\n\t// can be tested for existence on re-open.\n\tbucket1Key := []byte(\"bucket1\")\n\tstoreValues := map[string]string{\n\t\t\"b1key1\": \"foo1\",\n\t\t\"b1key2\": \"foo2\",\n\t\t\"b1key3\": \"foo3\",\n\t}\n\tgenesisBlock := btcutil.NewBlock(chaincfg.MainNetParams.GenesisBlock)\n\tgenesisHash := chaincfg.MainNetParams.GenesisHash\n\terr = db.Update(func(tx database.Tx) error {\n\t\tmetadataBucket := tx.Metadata()\n\t\tif metadataBucket == nil {\n\t\t\treturn fmt.Errorf(\"Metadata: unexpected nil bucket\")\n\t\t}\n\n\t\tbucket1, err := metadataBucket.CreateBucket(bucket1Key)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"CreateBucket: unexpected error: %v\",\n\t\t\t\terr)\n\t\t}\n\n\t\tfor k, v := range storeValues {\n\t\t\terr := bucket1.Put([]byte(k), []byte(v))\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"Put: unexpected error: %v\",\n\t\t\t\t\terr)\n\t\t\t}\n\t\t}\n\n\t\tif err := tx.StoreBlock(genesisBlock); err != nil {\n\t\t\treturn fmt.Errorf(\"StoreBlock: unexpected error: %v\",\n\t\t\t\terr)\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tt.Errorf(\"Update: unexpected error: %v\", err)\n\t\treturn\n\t}\n\n\t// Close and reopen the database to ensure the values persist.\n\tdb.Close()\n\tdb, err = database.Open(dbType, dbPath, blockDataNet)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to open test database (%s) %v\", dbType, err)\n\t\treturn\n\t}\n\tdefer db.Close()\n\n\t// Ensure the values previously stored in the 3rd namespace still exist\n\t// and are correct.\n\terr = db.View(func(tx database.Tx) error {\n\t\tmetadataBucket := tx.Metadata()\n\t\tif metadataBucket == nil {\n\t\t\treturn fmt.Errorf(\"Metadata: unexpected nil bucket\")\n\t\t}\n\n\t\tbucket1 := metadataBucket.Bucket(bucket1Key)\n\t\tif bucket1 == nil {\n\t\t\treturn fmt.Errorf(\"Bucket1: unexpected nil bucket\")\n\t\t}\n\n\t\tfor k, v := range storeValues {\n\t\t\tgotVal := bucket1.Get([]byte(k))\n\t\t\tif !reflect.DeepEqual(gotVal, []byte(v)) {\n\t\t\t\treturn fmt.Errorf(\"Get: key '%s' does not \"+\n\t\t\t\t\t\"match expected value - got %s, want %s\",\n\t\t\t\t\tk, gotVal, v)\n\t\t\t}\n\t\t}\n\n\t\tgenesisBlockBytes, _ := genesisBlock.Bytes()\n\t\tgotBytes, err := tx.FetchBlock(genesisHash)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"FetchBlock: unexpected error: %v\",\n\t\t\t\terr)\n\t\t}\n\t\tif !reflect.DeepEqual(gotBytes, genesisBlockBytes) {\n\t\t\treturn fmt.Errorf(\"FetchBlock: stored block mismatch\")\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tt.Errorf(\"View: unexpected error: %v\", err)\n\t\treturn\n\t}\n}\n\n// TestPrune tests that the older .fdb files are deleted with a call to prune.\nfunc TestPrune(t *testing.T) {\n\tt.Parallel()\n\n\t// Create a new database to run tests against.\n\tdbPath := t.TempDir()\n\tdb, err := database.Create(dbType, dbPath, blockDataNet)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to create test database (%s) %v\", dbType, err)\n\t\treturn\n\t}\n\tdefer db.Close()\n\n\tblockFileSize := uint64(2048)\n\n\ttestfn := func(t *testing.T, db database.DB) {\n\t\t// Load the test blocks and save in the test context for use throughout\n\t\t// the tests.\n\t\tblocks, err := loadBlocks(t, blockDataFile, blockDataNet)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"loadBlocks: Unexpected error: %v\", err)\n\t\t\treturn\n\t\t}\n\t\terr = db.Update(func(tx database.Tx) error {\n\t\t\tfor i, block := range blocks {\n\t\t\t\terr := tx.StoreBlock(block)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"StoreBlock #%d: unexpected error: \"+\n\t\t\t\t\t\t\"%v\", i, err)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tblockHashMap := make(map[chainhash.Hash][]byte, len(blocks))\n\t\tfor _, block := range blocks {\n\t\t\tbytes, err := block.Bytes()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tblockHashMap[*block.Hash()] = bytes\n\t\t}\n\n\t\terr = db.Update(func(tx database.Tx) error {\n\t\t\t_, err := tx.PruneBlocks(1024)\n\t\t\tif err == nil {\n\t\t\t\treturn fmt.Errorf(\"Expected an error when attempting to prune\" +\n\t\t\t\t\t\"below the maxFileSize\")\n\t\t\t}\n\n\t\t\t_, err = tx.PruneBlocks(0)\n\t\t\tif err == nil {\n\t\t\t\treturn fmt.Errorf(\"Expected an error when attempting to prune\" +\n\t\t\t\t\t\"below the maxFileSize\")\n\t\t\t}\n\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\terr = db.View(func(tx database.Tx) error {\n\t\t\tpruned, err := tx.BeenPruned()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif pruned {\n\t\t\t\terr = fmt.Errorf(\"The database hasn't been pruned but \" +\n\t\t\t\t\t\"BeenPruned returned true\")\n\t\t\t}\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\t// Open the first block file before the pruning happens in the\n\t\t// code snippet below.  This let's us test that block files are\n\t\t// properly closed before attempting to delete them.\n\t\terr = db.View(func(tx database.Tx) error {\n\t\t\t_, err := tx.FetchBlock(blocks[0].Hash())\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tvar deletedBlocks []chainhash.Hash\n\n\t\t// This should leave 3 files on disk.\n\t\terr = db.Update(func(tx database.Tx) error {\n\t\t\tdeletedBlocks, err = tx.PruneBlocks(blockFileSize * 3)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tpruned, err := tx.BeenPruned()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif pruned {\n\t\t\t\terr = fmt.Errorf(\"The database hasn't been committed yet \" +\n\t\t\t\t\t\"but files were already deleted\")\n\t\t\t}\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\t// The only error we can get is a bad pattern error.  Since we're hardcoding\n\t\t// the pattern, we should not have an error at runtime.\n\t\tfiles, _ := filepath.Glob(filepath.Join(dbPath, \"*.fdb\"))\n\t\tif len(files) != 3 {\n\t\t\tt.Fatalf(\"Expected to find %d files but got %d\",\n\t\t\t\t3, len(files))\n\t\t}\n\n\t\terr = db.View(func(tx database.Tx) error {\n\t\t\tpruned, err := tx.BeenPruned()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif !pruned {\n\t\t\t\terr = fmt.Errorf(\"The database has been pruned but \" +\n\t\t\t\t\t\"BeenPruned returned false\")\n\t\t\t}\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\t// Check that all the blocks that say were deleted are deleted from the\n\t\t// block index bucket as well.\n\t\terr = db.View(func(tx database.Tx) error {\n\t\t\tfor _, deletedBlock := range deletedBlocks {\n\t\t\t\t_, err := tx.FetchBlock(&deletedBlock)\n\t\t\t\tif dbErr, ok := err.(database.Error); !ok ||\n\t\t\t\t\tdbErr.ErrorCode != database.ErrBlockNotFound {\n\n\t\t\t\t\treturn fmt.Errorf(\"Expected ErrBlockNotFound \"+\n\t\t\t\t\t\t\"but got %v\", dbErr)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\t// Check that the not deleted blocks are present.\n\t\tfor _, deletedBlock := range deletedBlocks {\n\t\t\tdelete(blockHashMap, deletedBlock)\n\t\t}\n\t\terr = db.View(func(tx database.Tx) error {\n\t\t\tfor hash, wantBytes := range blockHashMap {\n\t\t\t\tgotBytes, err := tx.FetchBlock(&hash)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif !bytes.Equal(gotBytes, wantBytes) {\n\t\t\t\t\treturn fmt.Errorf(\"got bytes %x, want bytes %x\",\n\t\t\t\t\t\tgotBytes, wantBytes)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}\n\tffldb.TstRunWithMaxBlockFileSize(db, uint32(blockFileSize), func() {\n\t\ttestfn(t, db)\n\t})\n}\n\n// TestInterface performs all interfaces tests for this database driver.\nfunc TestInterface(t *testing.T) {\n\tt.Parallel()\n\n\t// Create a new database to run tests against.\n\tdbPath := filepath.Join(t.TempDir(), \"ffldb-interfacetest\")\n\t_ = os.RemoveAll(dbPath)\n\tdb, err := database.Create(dbType, dbPath, blockDataNet)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to create test database (%s) %v\", dbType, err)\n\t\treturn\n\t}\n\tdefer db.Close()\n\n\t// Ensure the driver type is the expected value.\n\tgotDbType := db.Type()\n\tif gotDbType != dbType {\n\t\tt.Errorf(\"Type: unepxected driver type - got %v, want %v\",\n\t\t\tgotDbType, dbType)\n\t\treturn\n\t}\n\n\t// Run all of the interface tests against the database.\n\n\t// Change the maximum file size to a small value to force multiple flat\n\t// files with the test data set.\n\tffldb.TstRunWithMaxBlockFileSize(db, 2048, func() {\n\t\ttestInterface(t, db)\n\t})\n}\n"
  },
  {
    "path": "database/ffldb/export.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ffldb\n\nimport (\n\t\"github.com/btcsuite/btcd/database\"\n)\n\n// TstRunWithMaxBlockFileSize runs the passed function with the maximum allowed\n// file size for the database set to the provided value.  The value will be set\n// back to the original value upon completion.\n//\n// Callers should only use this for testing.\nfunc TstRunWithMaxBlockFileSize(idb database.DB, size uint32, fn func()) {\n\tffldb := idb.(*db)\n\torigSize := ffldb.store.maxBlockFileSize\n\n\tffldb.store.maxBlockFileSize = size\n\tfn()\n\tffldb.store.maxBlockFileSize = origSize\n}\n"
  },
  {
    "path": "database/ffldb/interface_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// This file intended to be copied into each backend driver directory.  Each\n// driver should have their own driver_test.go file which creates a database and\n// invokes the testInterface function in this file to ensure the driver properly\n// implements the interface.\n//\n// NOTE: When copying this file into the backend driver folder, the package name\n// will need to be changed accordingly.\n\npackage ffldb_test\n\nimport (\n\t\"bytes\"\n\t\"compress/bzip2\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"sync/atomic\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nvar (\n\t// blockDataNet is the expected network in the test block data.\n\tblockDataNet = wire.MainNet\n\n\t// blockDataFile is the path to a file containing the first 256 blocks\n\t// of the block chain.\n\tblockDataFile = filepath.Join(\"..\", \"testdata\", \"blocks1-256.bz2\")\n\n\t// errSubTestFail is used to signal that a sub test returned false.\n\terrSubTestFail = fmt.Errorf(\"sub test failure\")\n)\n\n// loadBlocks loads the blocks contained in the testdata directory and returns\n// a slice of them.\nfunc loadBlocks(t *testing.T, dataFile string, network wire.BitcoinNet) ([]*btcutil.Block, error) {\n\t// Open the file that contains the blocks for reading.\n\tfi, err := os.Open(dataFile)\n\tif err != nil {\n\t\tt.Errorf(\"failed to open file %v, err %v\", dataFile, err)\n\t\treturn nil, err\n\t}\n\tdefer func() {\n\t\tif err := fi.Close(); err != nil {\n\t\t\tt.Errorf(\"failed to close file %v %v\", dataFile,\n\t\t\t\terr)\n\t\t}\n\t}()\n\tdr := bzip2.NewReader(fi)\n\n\t// Set the first block as the genesis block.\n\tblocks := make([]*btcutil.Block, 0, 256)\n\tgenesis := btcutil.NewBlock(chaincfg.MainNetParams.GenesisBlock)\n\tblocks = append(blocks, genesis)\n\n\t// Load the remaining blocks.\n\tfor height := 1; ; height++ {\n\t\tvar net uint32\n\t\terr := binary.Read(dr, binary.LittleEndian, &net)\n\t\tif err == io.EOF {\n\t\t\t// Hit end of file at the expected offset.  No error.\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to load network type for block %d: %v\",\n\t\t\t\theight, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif net != uint32(network) {\n\t\t\tt.Errorf(\"Block doesn't match network: %v expects %v\",\n\t\t\t\tnet, network)\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvar blockLen uint32\n\t\terr = binary.Read(dr, binary.LittleEndian, &blockLen)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to load block size for block %d: %v\",\n\t\t\t\theight, err)\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Read the block.\n\t\tblockBytes := make([]byte, blockLen)\n\t\t_, err = io.ReadFull(dr, blockBytes)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to load block %d: %v\", height, err)\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Deserialize and store the block.\n\t\tblock, err := btcutil.NewBlockFromBytes(blockBytes)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to parse block %v: %v\", height, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tblocks = append(blocks, block)\n\t}\n\n\treturn blocks, nil\n}\n\n// checkDbError ensures the passed error is a database.Error with an error code\n// that matches the passed  error code.\nfunc checkDbError(t *testing.T, testName string, gotErr error, wantErrCode database.ErrorCode) bool {\n\tdbErr, ok := gotErr.(database.Error)\n\tif !ok {\n\t\tt.Errorf(\"%s: unexpected error type - got %T, want %T\",\n\t\t\ttestName, gotErr, database.Error{})\n\t\treturn false\n\t}\n\tif dbErr.ErrorCode != wantErrCode {\n\t\tt.Errorf(\"%s: unexpected error code - got %s (%s), want %s\",\n\t\t\ttestName, dbErr.ErrorCode, dbErr.Description,\n\t\t\twantErrCode)\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// testContext is used to store context information about a running test which\n// is passed into helper functions.\ntype testContext struct {\n\tt           *testing.T\n\tdb          database.DB\n\tbucketDepth int\n\tisWritable  bool\n\tblocks      []*btcutil.Block\n}\n\n// keyPair houses a key/value pair.  It is used over maps so ordering can be\n// maintained.\ntype keyPair struct {\n\tkey   []byte\n\tvalue []byte\n}\n\n// lookupKey is a convenience method to lookup the requested key from the\n// provided keypair slice along with whether or not the key was found.\nfunc lookupKey(key []byte, values []keyPair) ([]byte, bool) {\n\tfor _, item := range values {\n\t\tif bytes.Equal(item.key, key) {\n\t\t\treturn item.value, true\n\t\t}\n\t}\n\n\treturn nil, false\n}\n\n// toGetValues returns a copy of the provided keypairs with all of the nil\n// values set to an empty byte slice.  This is used to ensure that keys set to\n// nil values result in empty byte slices when retrieved instead of nil.\nfunc toGetValues(values []keyPair) []keyPair {\n\tret := make([]keyPair, len(values))\n\tcopy(ret, values)\n\tfor i := range ret {\n\t\tif ret[i].value == nil {\n\t\t\tret[i].value = make([]byte, 0)\n\t\t}\n\t}\n\treturn ret\n}\n\n// rollbackValues returns a copy of the provided keypairs with all values set to\n// nil.  This is used to test that values are properly rolled back.\nfunc rollbackValues(values []keyPair) []keyPair {\n\tret := make([]keyPair, len(values))\n\tcopy(ret, values)\n\tfor i := range ret {\n\t\tret[i].value = nil\n\t}\n\treturn ret\n}\n\n// testCursorKeyPair checks that the provide key and value match the expected\n// keypair at the provided index.  It also ensures the index is in range for the\n// provided slice of expected keypairs.\nfunc testCursorKeyPair(tc *testContext, k, v []byte, index int, values []keyPair) bool {\n\tif index >= len(values) || index < 0 {\n\t\ttc.t.Errorf(\"Cursor: exceeded the expected range of values - \"+\n\t\t\t\"index %d, num values %d\", index, len(values))\n\t\treturn false\n\t}\n\n\tpair := &values[index]\n\tif !bytes.Equal(k, pair.key) {\n\t\ttc.t.Errorf(\"Mismatched cursor key: index %d does not match \"+\n\t\t\t\"the expected key - got %q, want %q\", index, k,\n\t\t\tpair.key)\n\t\treturn false\n\t}\n\tif !bytes.Equal(v, pair.value) {\n\t\ttc.t.Errorf(\"Mismatched cursor value: index %d does not match \"+\n\t\t\t\"the expected value - got %q, want %q\", index, v,\n\t\t\tpair.value)\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// testGetValues checks that all of the provided key/value pairs can be\n// retrieved from the database and the retrieved values match the provided\n// values.\nfunc testGetValues(tc *testContext, bucket database.Bucket, values []keyPair) bool {\n\tfor _, item := range values {\n\t\tgotValue := bucket.Get(item.key)\n\t\tif !reflect.DeepEqual(gotValue, item.value) {\n\t\t\ttc.t.Errorf(\"Get: unexpected value for %q - got %q, \"+\n\t\t\t\t\"want %q\", item.key, gotValue, item.value)\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// testPutValues stores all of the provided key/value pairs in the provided\n// bucket while checking for errors.\nfunc testPutValues(tc *testContext, bucket database.Bucket, values []keyPair) bool {\n\tfor _, item := range values {\n\t\tif err := bucket.Put(item.key, item.value); err != nil {\n\t\t\ttc.t.Errorf(\"Put: unexpected error: %v\", err)\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// testDeleteValues removes all of the provided key/value pairs from the\n// provided bucket.\nfunc testDeleteValues(tc *testContext, bucket database.Bucket, values []keyPair) bool {\n\tfor _, item := range values {\n\t\tif err := bucket.Delete(item.key); err != nil {\n\t\t\ttc.t.Errorf(\"Delete: unexpected error: %v\", err)\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// testCursorInterface ensures the cursor interface is working properly by\n// exercising all of its functions on the passed bucket.\nfunc testCursorInterface(tc *testContext, bucket database.Bucket) bool {\n\t// Ensure a cursor can be obtained for the bucket.\n\tcursor := bucket.Cursor()\n\tif cursor == nil {\n\t\ttc.t.Error(\"Bucket.Cursor: unexpected nil cursor returned\")\n\t\treturn false\n\t}\n\n\t// Ensure the cursor returns the same bucket it was created for.\n\tif cursor.Bucket() != bucket {\n\t\ttc.t.Error(\"Cursor.Bucket: does not match the bucket it was \" +\n\t\t\t\"created for\")\n\t\treturn false\n\t}\n\n\tif tc.isWritable {\n\t\tunsortedValues := []keyPair{\n\t\t\t{[]byte(\"cursor\"), []byte(\"val1\")},\n\t\t\t{[]byte(\"abcd\"), []byte(\"val2\")},\n\t\t\t{[]byte(\"bcd\"), []byte(\"val3\")},\n\t\t\t{[]byte(\"defg\"), nil},\n\t\t}\n\t\tsortedValues := []keyPair{\n\t\t\t{[]byte(\"abcd\"), []byte(\"val2\")},\n\t\t\t{[]byte(\"bcd\"), []byte(\"val3\")},\n\t\t\t{[]byte(\"cursor\"), []byte(\"val1\")},\n\t\t\t{[]byte(\"defg\"), nil},\n\t\t}\n\n\t\t// Store the values to be used in the cursor tests in unsorted\n\t\t// order and ensure they were actually stored.\n\t\tif !testPutValues(tc, bucket, unsortedValues) {\n\t\t\treturn false\n\t\t}\n\t\tif !testGetValues(tc, bucket, toGetValues(unsortedValues)) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure the cursor returns all items in byte-sorted order when\n\t\t// iterating forward.\n\t\tcurIdx := 0\n\t\tfor ok := cursor.First(); ok; ok = cursor.Next() {\n\t\t\tk, v := cursor.Key(), cursor.Value()\n\t\t\tif !testCursorKeyPair(tc, k, v, curIdx, sortedValues) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tcurIdx++\n\t\t}\n\t\tif curIdx != len(unsortedValues) {\n\t\t\ttc.t.Errorf(\"Cursor: expected to iterate %d values, \"+\n\t\t\t\t\"but only iterated %d\", len(unsortedValues),\n\t\t\t\tcurIdx)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure the cursor returns all items in reverse byte-sorted\n\t\t// order when iterating in reverse.\n\t\tcurIdx = len(sortedValues) - 1\n\t\tfor ok := cursor.Last(); ok; ok = cursor.Prev() {\n\t\t\tk, v := cursor.Key(), cursor.Value()\n\t\t\tif !testCursorKeyPair(tc, k, v, curIdx, sortedValues) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tcurIdx--\n\t\t}\n\t\tif curIdx > -1 {\n\t\t\ttc.t.Errorf(\"Reverse cursor: expected to iterate %d \"+\n\t\t\t\t\"values, but only iterated %d\",\n\t\t\t\tlen(sortedValues), len(sortedValues)-(curIdx+1))\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure forward iteration works as expected after seeking.\n\t\tmiddleIdx := (len(sortedValues) - 1) / 2\n\t\tseekKey := sortedValues[middleIdx].key\n\t\tcurIdx = middleIdx\n\t\tfor ok := cursor.Seek(seekKey); ok; ok = cursor.Next() {\n\t\t\tk, v := cursor.Key(), cursor.Value()\n\t\t\tif !testCursorKeyPair(tc, k, v, curIdx, sortedValues) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tcurIdx++\n\t\t}\n\t\tif curIdx != len(sortedValues) {\n\t\t\ttc.t.Errorf(\"Cursor after seek: expected to iterate \"+\n\t\t\t\t\"%d values, but only iterated %d\",\n\t\t\t\tlen(sortedValues)-middleIdx, curIdx-middleIdx)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure reverse iteration works as expected after seeking.\n\t\tcurIdx = middleIdx\n\t\tfor ok := cursor.Seek(seekKey); ok; ok = cursor.Prev() {\n\t\t\tk, v := cursor.Key(), cursor.Value()\n\t\t\tif !testCursorKeyPair(tc, k, v, curIdx, sortedValues) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tcurIdx--\n\t\t}\n\t\tif curIdx > -1 {\n\t\t\ttc.t.Errorf(\"Reverse cursor after seek: expected to \"+\n\t\t\t\t\"iterate %d values, but only iterated %d\",\n\t\t\t\tlen(sortedValues)-middleIdx, middleIdx-curIdx)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure the cursor deletes items properly.\n\t\tif !cursor.First() {\n\t\t\ttc.t.Errorf(\"Cursor.First: no value\")\n\t\t\treturn false\n\t\t}\n\t\tk := cursor.Key()\n\t\tif err := cursor.Delete(); err != nil {\n\t\t\ttc.t.Errorf(\"Cursor.Delete: unexpected error: %v\", err)\n\t\t\treturn false\n\t\t}\n\t\tif val := bucket.Get(k); val != nil {\n\t\t\ttc.t.Errorf(\"Cursor.Delete: value for key %q was not \"+\n\t\t\t\t\"deleted\", k)\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// testNestedBucket reruns the testBucketInterface against a nested bucket along\n// with a counter to only test a couple of level deep.\nfunc testNestedBucket(tc *testContext, testBucket database.Bucket) bool {\n\t// Don't go more than 2 nested levels deep.\n\tif tc.bucketDepth > 1 {\n\t\treturn true\n\t}\n\n\ttc.bucketDepth++\n\tdefer func() {\n\t\ttc.bucketDepth--\n\t}()\n\treturn testBucketInterface(tc, testBucket)\n}\n\n// testBucketInterface ensures the bucket interface is working properly by\n// exercising all of its functions.  This includes the cursor interface for the\n// cursor returned from the bucket.\nfunc testBucketInterface(tc *testContext, bucket database.Bucket) bool {\n\tif bucket.Writable() != tc.isWritable {\n\t\ttc.t.Errorf(\"Bucket writable state does not match.\")\n\t\treturn false\n\t}\n\n\tif tc.isWritable {\n\t\t// keyValues holds the keys and values to use when putting\n\t\t// values into the bucket.\n\t\tkeyValues := []keyPair{\n\t\t\t{[]byte(\"bucketkey1\"), []byte(\"foo1\")},\n\t\t\t{[]byte(\"bucketkey2\"), []byte(\"foo2\")},\n\t\t\t{[]byte(\"bucketkey3\"), []byte(\"foo3\")},\n\t\t\t{[]byte(\"bucketkey4\"), nil},\n\t\t}\n\t\texpectedKeyValues := toGetValues(keyValues)\n\t\tif !testPutValues(tc, bucket, keyValues) {\n\t\t\treturn false\n\t\t}\n\n\t\tif !testGetValues(tc, bucket, expectedKeyValues) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure errors returned from the user-supplied ForEach\n\t\t// function are returned.\n\t\tforEachError := fmt.Errorf(\"example foreach error\")\n\t\terr := bucket.ForEach(func(k, v []byte) error {\n\t\t\treturn forEachError\n\t\t})\n\t\tif err != forEachError {\n\t\t\ttc.t.Errorf(\"ForEach: inner function error not \"+\n\t\t\t\t\"returned - got %v, want %v\", err, forEachError)\n\t\t\treturn false\n\t\t}\n\n\t\t// Iterate all of the keys using ForEach while making sure the\n\t\t// stored values are the expected values.\n\t\tkeysFound := make(map[string]struct{}, len(keyValues))\n\t\terr = bucket.ForEach(func(k, v []byte) error {\n\t\t\twantV, found := lookupKey(k, expectedKeyValues)\n\t\t\tif !found {\n\t\t\t\treturn fmt.Errorf(\"ForEach: key '%s' should \"+\n\t\t\t\t\t\"exist\", k)\n\t\t\t}\n\n\t\t\tif !reflect.DeepEqual(v, wantV) {\n\t\t\t\treturn fmt.Errorf(\"ForEach: value for key '%s' \"+\n\t\t\t\t\t\"does not match - got %s, want %s\", k,\n\t\t\t\t\tv, wantV)\n\t\t\t}\n\n\t\t\tkeysFound[string(k)] = struct{}{}\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure all keys were iterated.\n\t\tfor _, item := range keyValues {\n\t\t\tif _, ok := keysFound[string(item.key)]; !ok {\n\t\t\t\ttc.t.Errorf(\"ForEach: key '%s' was not iterated \"+\n\t\t\t\t\t\"when it should have been\", item.key)\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\t// Delete the keys and ensure they were deleted.\n\t\tif !testDeleteValues(tc, bucket, keyValues) {\n\t\t\treturn false\n\t\t}\n\t\tif !testGetValues(tc, bucket, rollbackValues(keyValues)) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure creating a new bucket works as expected.\n\t\ttestBucketName := []byte(\"testbucket\")\n\t\ttestBucket, err := bucket.CreateBucket(testBucketName)\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"CreateBucket: unexpected error: %v\", err)\n\t\t\treturn false\n\t\t}\n\t\tif !testNestedBucket(tc, testBucket) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure errors returned from the user-supplied ForEachBucket\n\t\t// function are returned.\n\t\terr = bucket.ForEachBucket(func(k []byte) error {\n\t\t\treturn forEachError\n\t\t})\n\t\tif err != forEachError {\n\t\t\ttc.t.Errorf(\"ForEachBucket: inner function error not \"+\n\t\t\t\t\"returned - got %v, want %v\", err, forEachError)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure creating a bucket that already exists fails with the\n\t\t// expected error.\n\t\twantErrCode := database.ErrBucketExists\n\t\t_, err = bucket.CreateBucket(testBucketName)\n\t\tif !checkDbError(tc.t, \"CreateBucket\", err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure CreateBucketIfNotExists returns an existing bucket.\n\t\ttestBucket, err = bucket.CreateBucketIfNotExists(testBucketName)\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"CreateBucketIfNotExists: unexpected \"+\n\t\t\t\t\"error: %v\", err)\n\t\t\treturn false\n\t\t}\n\t\tif !testNestedBucket(tc, testBucket) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure retrieving an existing bucket works as expected.\n\t\ttestBucket = bucket.Bucket(testBucketName)\n\t\tif !testNestedBucket(tc, testBucket) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure deleting a bucket works as intended.\n\t\tif err := bucket.DeleteBucket(testBucketName); err != nil {\n\t\t\ttc.t.Errorf(\"DeleteBucket: unexpected error: %v\", err)\n\t\t\treturn false\n\t\t}\n\t\tif b := bucket.Bucket(testBucketName); b != nil {\n\t\t\ttc.t.Errorf(\"DeleteBucket: bucket '%s' still exists\",\n\t\t\t\ttestBucketName)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure deleting a bucket that doesn't exist returns the\n\t\t// expected error.\n\t\twantErrCode = database.ErrBucketNotFound\n\t\terr = bucket.DeleteBucket(testBucketName)\n\t\tif !checkDbError(tc.t, \"DeleteBucket\", err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure CreateBucketIfNotExists creates a new bucket when\n\t\t// it doesn't already exist.\n\t\ttestBucket, err = bucket.CreateBucketIfNotExists(testBucketName)\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"CreateBucketIfNotExists: unexpected \"+\n\t\t\t\t\"error: %v\", err)\n\t\t\treturn false\n\t\t}\n\t\tif !testNestedBucket(tc, testBucket) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure the cursor interface works as expected.\n\t\tif !testCursorInterface(tc, testBucket) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Delete the test bucket to avoid leaving it around for future\n\t\t// calls.\n\t\tif err := bucket.DeleteBucket(testBucketName); err != nil {\n\t\t\ttc.t.Errorf(\"DeleteBucket: unexpected error: %v\", err)\n\t\t\treturn false\n\t\t}\n\t\tif b := bucket.Bucket(testBucketName); b != nil {\n\t\t\ttc.t.Errorf(\"DeleteBucket: bucket '%s' still exists\",\n\t\t\t\ttestBucketName)\n\t\t\treturn false\n\t\t}\n\t} else {\n\t\t// Put should fail with bucket that is not writable.\n\t\ttestName := \"unwritable tx put\"\n\t\twantErrCode := database.ErrTxNotWritable\n\t\tfailBytes := []byte(\"fail\")\n\t\terr := bucket.Put(failBytes, failBytes)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Delete should fail with bucket that is not writable.\n\t\ttestName = \"unwritable tx delete\"\n\t\terr = bucket.Delete(failBytes)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// CreateBucket should fail with bucket that is not writable.\n\t\ttestName = \"unwritable tx create bucket\"\n\t\t_, err = bucket.CreateBucket(failBytes)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// CreateBucketIfNotExists should fail with bucket that is not\n\t\t// writable.\n\t\ttestName = \"unwritable tx create bucket if not exists\"\n\t\t_, err = bucket.CreateBucketIfNotExists(failBytes)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// DeleteBucket should fail with bucket that is not writable.\n\t\ttestName = \"unwritable tx delete bucket\"\n\t\terr = bucket.DeleteBucket(failBytes)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure the cursor interface works as expected with read-only\n\t\t// buckets.\n\t\tif !testCursorInterface(tc, bucket) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// rollbackOnPanic rolls the passed transaction back if the code in the calling\n// function panics.  This is useful in case the tests unexpectedly panic which\n// would leave any manually created transactions with the database mutex locked\n// thereby leading to a deadlock and masking the real reason for the panic.  It\n// also logs a test error and repanics so the original panic can be traced.\nfunc rollbackOnPanic(t *testing.T, tx database.Tx) {\n\tif err := recover(); err != nil {\n\t\tt.Errorf(\"Unexpected panic: %v\", err)\n\t\t_ = tx.Rollback()\n\t\tpanic(err)\n\t}\n}\n\n// testMetadataManualTxInterface ensures that the manual transactions metadata\n// interface works as expected.\nfunc testMetadataManualTxInterface(tc *testContext) bool {\n\t// populateValues tests that populating values works as expected.\n\t//\n\t// When the writable flag is false, a read-only transaction is created,\n\t// standard bucket tests for read-only transactions are performed, and\n\t// the Commit function is checked to ensure it fails as expected.\n\t//\n\t// Otherwise, a read-write transaction is created, the values are\n\t// written, standard bucket tests for read-write transactions are\n\t// performed, and then the transaction is either committed or rolled\n\t// back depending on the flag.\n\tbucket1Name := []byte(\"bucket1\")\n\tpopulateValues := func(writable, rollback bool, putValues []keyPair) bool {\n\t\ttx, err := tc.db.Begin(writable)\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"Begin: unexpected error %v\", err)\n\t\t\treturn false\n\t\t}\n\t\tdefer rollbackOnPanic(tc.t, tx)\n\n\t\tmetadataBucket := tx.Metadata()\n\t\tif metadataBucket == nil {\n\t\t\ttc.t.Errorf(\"Metadata: unexpected nil bucket\")\n\t\t\t_ = tx.Rollback()\n\t\t\treturn false\n\t\t}\n\n\t\tbucket1 := metadataBucket.Bucket(bucket1Name)\n\t\tif bucket1 == nil {\n\t\t\ttc.t.Errorf(\"Bucket1: unexpected nil bucket\")\n\t\t\treturn false\n\t\t}\n\n\t\ttc.isWritable = writable\n\t\tif !testBucketInterface(tc, bucket1) {\n\t\t\t_ = tx.Rollback()\n\t\t\treturn false\n\t\t}\n\n\t\tif !writable {\n\t\t\t// The transaction is not writable, so it should fail\n\t\t\t// the commit.\n\t\t\ttestName := \"unwritable tx commit\"\n\t\t\twantErrCode := database.ErrTxNotWritable\n\t\t\terr := tx.Commit()\n\t\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\t\t_ = tx.Rollback()\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\tif !testPutValues(tc, bucket1, putValues) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif rollback {\n\t\t\t\t// Rollback the transaction.\n\t\t\t\tif err := tx.Rollback(); err != nil {\n\t\t\t\t\ttc.t.Errorf(\"Rollback: unexpected \"+\n\t\t\t\t\t\t\"error %v\", err)\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// The commit should succeed.\n\t\t\t\tif err := tx.Commit(); err != nil {\n\t\t\t\t\ttc.t.Errorf(\"Commit: unexpected error \"+\n\t\t\t\t\t\t\"%v\", err)\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true\n\t}\n\n\t// checkValues starts a read-only transaction and checks that all of\n\t// the key/value pairs specified in the expectedValues parameter match\n\t// what's in the database.\n\tcheckValues := func(expectedValues []keyPair) bool {\n\t\ttx, err := tc.db.Begin(false)\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"Begin: unexpected error %v\", err)\n\t\t\treturn false\n\t\t}\n\t\tdefer rollbackOnPanic(tc.t, tx)\n\n\t\tmetadataBucket := tx.Metadata()\n\t\tif metadataBucket == nil {\n\t\t\ttc.t.Errorf(\"Metadata: unexpected nil bucket\")\n\t\t\t_ = tx.Rollback()\n\t\t\treturn false\n\t\t}\n\n\t\tbucket1 := metadataBucket.Bucket(bucket1Name)\n\t\tif bucket1 == nil {\n\t\t\ttc.t.Errorf(\"Bucket1: unexpected nil bucket\")\n\t\t\treturn false\n\t\t}\n\n\t\tif !testGetValues(tc, bucket1, expectedValues) {\n\t\t\t_ = tx.Rollback()\n\t\t\treturn false\n\t\t}\n\n\t\t// Rollback the read-only transaction.\n\t\tif err := tx.Rollback(); err != nil {\n\t\t\ttc.t.Errorf(\"Commit: unexpected error %v\", err)\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}\n\n\t// deleteValues starts a read-write transaction and deletes the keys\n\t// in the passed key/value pairs.\n\tdeleteValues := func(values []keyPair) bool {\n\t\ttx, err := tc.db.Begin(true)\n\t\tif err != nil {\n\n\t\t}\n\t\tdefer rollbackOnPanic(tc.t, tx)\n\n\t\tmetadataBucket := tx.Metadata()\n\t\tif metadataBucket == nil {\n\t\t\ttc.t.Errorf(\"Metadata: unexpected nil bucket\")\n\t\t\t_ = tx.Rollback()\n\t\t\treturn false\n\t\t}\n\n\t\tbucket1 := metadataBucket.Bucket(bucket1Name)\n\t\tif bucket1 == nil {\n\t\t\ttc.t.Errorf(\"Bucket1: unexpected nil bucket\")\n\t\t\treturn false\n\t\t}\n\n\t\t// Delete the keys and ensure they were deleted.\n\t\tif !testDeleteValues(tc, bucket1, values) {\n\t\t\t_ = tx.Rollback()\n\t\t\treturn false\n\t\t}\n\t\tif !testGetValues(tc, bucket1, rollbackValues(values)) {\n\t\t\t_ = tx.Rollback()\n\t\t\treturn false\n\t\t}\n\n\t\t// Commit the changes and ensure it was successful.\n\t\tif err := tx.Commit(); err != nil {\n\t\t\ttc.t.Errorf(\"Commit: unexpected error %v\", err)\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}\n\n\t// keyValues holds the keys and values to use when putting values into a\n\t// bucket.\n\tvar keyValues = []keyPair{\n\t\t{[]byte(\"umtxkey1\"), []byte(\"foo1\")},\n\t\t{[]byte(\"umtxkey2\"), []byte(\"foo2\")},\n\t\t{[]byte(\"umtxkey3\"), []byte(\"foo3\")},\n\t\t{[]byte(\"umtxkey4\"), nil},\n\t}\n\n\t// Ensure that attempting populating the values using a read-only\n\t// transaction fails as expected.\n\tif !populateValues(false, true, keyValues) {\n\t\treturn false\n\t}\n\tif !checkValues(rollbackValues(keyValues)) {\n\t\treturn false\n\t}\n\n\t// Ensure that attempting populating the values using a read-write\n\t// transaction and then rolling it back yields the expected values.\n\tif !populateValues(true, true, keyValues) {\n\t\treturn false\n\t}\n\tif !checkValues(rollbackValues(keyValues)) {\n\t\treturn false\n\t}\n\n\t// Ensure that attempting populating the values using a read-write\n\t// transaction and then committing it stores the expected values.\n\tif !populateValues(true, false, keyValues) {\n\t\treturn false\n\t}\n\tif !checkValues(toGetValues(keyValues)) {\n\t\treturn false\n\t}\n\n\t// Clean up the keys.\n\tif !deleteValues(keyValues) {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// testManagedTxPanics ensures calling Rollback of Commit inside a managed\n// transaction panics.\nfunc testManagedTxPanics(tc *testContext) bool {\n\ttestPanic := func(fn func()) (paniced bool) {\n\t\t// Setup a defer to catch the expected panic and update the\n\t\t// return variable.\n\t\tdefer func() {\n\t\t\tif err := recover(); err != nil {\n\t\t\t\tpaniced = true\n\t\t\t}\n\t\t}()\n\n\t\tfn()\n\t\treturn false\n\t}\n\n\t// Ensure calling Commit on a managed read-only transaction panics.\n\tpaniced := testPanic(func() {\n\t\ttc.db.View(func(tx database.Tx) error {\n\t\t\ttx.Commit()\n\t\t\treturn nil\n\t\t})\n\t})\n\tif !paniced {\n\t\ttc.t.Error(\"Commit called inside View did not panic\")\n\t\treturn false\n\t}\n\n\t// Ensure calling Rollback on a managed read-only transaction panics.\n\tpaniced = testPanic(func() {\n\t\ttc.db.View(func(tx database.Tx) error {\n\t\t\ttx.Rollback()\n\t\t\treturn nil\n\t\t})\n\t})\n\tif !paniced {\n\t\ttc.t.Error(\"Rollback called inside View did not panic\")\n\t\treturn false\n\t}\n\n\t// Ensure calling Commit on a managed read-write transaction panics.\n\tpaniced = testPanic(func() {\n\t\ttc.db.Update(func(tx database.Tx) error {\n\t\t\ttx.Commit()\n\t\t\treturn nil\n\t\t})\n\t})\n\tif !paniced {\n\t\ttc.t.Error(\"Commit called inside Update did not panic\")\n\t\treturn false\n\t}\n\n\t// Ensure calling Rollback on a managed read-write transaction panics.\n\tpaniced = testPanic(func() {\n\t\ttc.db.Update(func(tx database.Tx) error {\n\t\t\ttx.Rollback()\n\t\t\treturn nil\n\t\t})\n\t})\n\tif !paniced {\n\t\ttc.t.Error(\"Rollback called inside Update did not panic\")\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// testMetadataTxInterface tests all facets of the managed read/write and\n// manual transaction metadata interfaces as well as the bucket interfaces under\n// them.\nfunc testMetadataTxInterface(tc *testContext) bool {\n\tif !testManagedTxPanics(tc) {\n\t\treturn false\n\t}\n\n\tbucket1Name := []byte(\"bucket1\")\n\terr := tc.db.Update(func(tx database.Tx) error {\n\t\t_, err := tx.Metadata().CreateBucket(bucket1Name)\n\t\treturn err\n\t})\n\tif err != nil {\n\t\ttc.t.Errorf(\"Update: unexpected error creating bucket: %v\", err)\n\t\treturn false\n\t}\n\n\tif !testMetadataManualTxInterface(tc) {\n\t\treturn false\n\t}\n\n\t// keyValues holds the keys and values to use when putting values\n\t// into a bucket.\n\tkeyValues := []keyPair{\n\t\t{[]byte(\"mtxkey1\"), []byte(\"foo1\")},\n\t\t{[]byte(\"mtxkey2\"), []byte(\"foo2\")},\n\t\t{[]byte(\"mtxkey3\"), []byte(\"foo3\")},\n\t\t{[]byte(\"mtxkey4\"), nil},\n\t}\n\n\t// Test the bucket interface via a managed read-only transaction.\n\terr = tc.db.View(func(tx database.Tx) error {\n\t\tmetadataBucket := tx.Metadata()\n\t\tif metadataBucket == nil {\n\t\t\treturn fmt.Errorf(\"Metadata: unexpected nil bucket\")\n\t\t}\n\n\t\tbucket1 := metadataBucket.Bucket(bucket1Name)\n\t\tif bucket1 == nil {\n\t\t\treturn fmt.Errorf(\"Bucket1: unexpected nil bucket\")\n\t\t}\n\n\t\ttc.isWritable = false\n\t\tif !testBucketInterface(tc, bucket1) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\t// Ensure errors returned from the user-supplied View function are\n\t// returned.\n\tviewError := fmt.Errorf(\"example view error\")\n\terr = tc.db.View(func(tx database.Tx) error {\n\t\treturn viewError\n\t})\n\tif err != viewError {\n\t\ttc.t.Errorf(\"View: inner function error not returned - got \"+\n\t\t\t\"%v, want %v\", err, viewError)\n\t\treturn false\n\t}\n\n\t// Test the bucket interface via a managed read-write transaction.\n\t// Also, put a series of values and force a rollback so the following\n\t// code can ensure the values were not stored.\n\tforceRollbackError := fmt.Errorf(\"force rollback\")\n\terr = tc.db.Update(func(tx database.Tx) error {\n\t\tmetadataBucket := tx.Metadata()\n\t\tif metadataBucket == nil {\n\t\t\treturn fmt.Errorf(\"Metadata: unexpected nil bucket\")\n\t\t}\n\n\t\tbucket1 := metadataBucket.Bucket(bucket1Name)\n\t\tif bucket1 == nil {\n\t\t\treturn fmt.Errorf(\"Bucket1: unexpected nil bucket\")\n\t\t}\n\n\t\ttc.isWritable = true\n\t\tif !testBucketInterface(tc, bucket1) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\tif !testPutValues(tc, bucket1, keyValues) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\t// Return an error to force a rollback.\n\t\treturn forceRollbackError\n\t})\n\tif err != forceRollbackError {\n\t\tif err == errSubTestFail {\n\t\t\treturn false\n\t\t}\n\n\t\ttc.t.Errorf(\"Update: inner function error not returned - got \"+\n\t\t\t\"%v, want %v\", err, forceRollbackError)\n\t\treturn false\n\t}\n\n\t// Ensure the values that should not have been stored due to the forced\n\t// rollback above were not actually stored.\n\terr = tc.db.View(func(tx database.Tx) error {\n\t\tmetadataBucket := tx.Metadata()\n\t\tif metadataBucket == nil {\n\t\t\treturn fmt.Errorf(\"Metadata: unexpected nil bucket\")\n\t\t}\n\n\t\tif !testGetValues(tc, metadataBucket, rollbackValues(keyValues)) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\t// Store a series of values via a managed read-write transaction.\n\terr = tc.db.Update(func(tx database.Tx) error {\n\t\tmetadataBucket := tx.Metadata()\n\t\tif metadataBucket == nil {\n\t\t\treturn fmt.Errorf(\"Metadata: unexpected nil bucket\")\n\t\t}\n\n\t\tbucket1 := metadataBucket.Bucket(bucket1Name)\n\t\tif bucket1 == nil {\n\t\t\treturn fmt.Errorf(\"Bucket1: unexpected nil bucket\")\n\t\t}\n\n\t\tif !testPutValues(tc, bucket1, keyValues) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\t// Ensure the values stored above were committed as expected.\n\terr = tc.db.View(func(tx database.Tx) error {\n\t\tmetadataBucket := tx.Metadata()\n\t\tif metadataBucket == nil {\n\t\t\treturn fmt.Errorf(\"Metadata: unexpected nil bucket\")\n\t\t}\n\n\t\tbucket1 := metadataBucket.Bucket(bucket1Name)\n\t\tif bucket1 == nil {\n\t\t\treturn fmt.Errorf(\"Bucket1: unexpected nil bucket\")\n\t\t}\n\n\t\tif !testGetValues(tc, bucket1, toGetValues(keyValues)) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\t// Clean up the values stored above in a managed read-write transaction.\n\terr = tc.db.Update(func(tx database.Tx) error {\n\t\tmetadataBucket := tx.Metadata()\n\t\tif metadataBucket == nil {\n\t\t\treturn fmt.Errorf(\"Metadata: unexpected nil bucket\")\n\t\t}\n\n\t\tbucket1 := metadataBucket.Bucket(bucket1Name)\n\t\tif bucket1 == nil {\n\t\t\treturn fmt.Errorf(\"Bucket1: unexpected nil bucket\")\n\t\t}\n\n\t\tif !testDeleteValues(tc, bucket1, keyValues) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// testFetchBlockIOMissing ensures that all of the block retrieval API functions\n// work as expected when requesting blocks that don't exist.\nfunc testFetchBlockIOMissing(tc *testContext, tx database.Tx) bool {\n\twantErrCode := database.ErrBlockNotFound\n\n\t// ---------------------\n\t// Non-bulk Block IO API\n\t// ---------------------\n\n\t// Test the individual block APIs one block at a time to ensure they\n\t// return the expected error.  Also, build the data needed to test the\n\t// bulk APIs below while looping.\n\tallBlockHashes := make([]chainhash.Hash, len(tc.blocks))\n\tallBlockRegions := make([]database.BlockRegion, len(tc.blocks))\n\tfor i, block := range tc.blocks {\n\t\tblockHash := block.Hash()\n\t\tallBlockHashes[i] = *blockHash\n\n\t\ttxLocs, err := block.TxLoc()\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"block.TxLoc(%d): unexpected error: %v\", i,\n\t\t\t\terr)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure FetchBlock returns expected error.\n\t\ttestName := fmt.Sprintf(\"FetchBlock #%d on missing block\", i)\n\t\t_, err = tx.FetchBlock(blockHash)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure FetchBlockHeader returns expected error.\n\t\ttestName = fmt.Sprintf(\"FetchBlockHeader #%d on missing block\",\n\t\t\ti)\n\t\t_, err = tx.FetchBlockHeader(blockHash)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure the first transaction fetched as a block region from\n\t\t// the database returns the expected error.\n\t\tregion := database.BlockRegion{\n\t\t\tHash:   blockHash,\n\t\t\tOffset: uint32(txLocs[0].TxStart),\n\t\t\tLen:    uint32(txLocs[0].TxLen),\n\t\t}\n\t\tallBlockRegions[i] = region\n\t\t_, err = tx.FetchBlockRegion(&region)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure HasBlock returns false.\n\t\thasBlock, err := tx.HasBlock(blockHash)\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"HasBlock #%d: unexpected err: %v\", i, err)\n\t\t\treturn false\n\t\t}\n\t\tif hasBlock {\n\t\t\ttc.t.Errorf(\"HasBlock #%d: should not have block\", i)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// -----------------\n\t// Bulk Block IO API\n\t// -----------------\n\n\t// Ensure FetchBlocks returns expected error.\n\ttestName := \"FetchBlocks on missing blocks\"\n\t_, err := tx.FetchBlocks(allBlockHashes)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure FetchBlockHeaders returns expected error.\n\ttestName = \"FetchBlockHeaders on missing blocks\"\n\t_, err = tx.FetchBlockHeaders(allBlockHashes)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure FetchBlockRegions returns expected error.\n\ttestName = \"FetchBlockRegions on missing blocks\"\n\t_, err = tx.FetchBlockRegions(allBlockRegions)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure HasBlocks returns false for all blocks.\n\thasBlocks, err := tx.HasBlocks(allBlockHashes)\n\tif err != nil {\n\t\ttc.t.Errorf(\"HasBlocks: unexpected err: %v\", err)\n\t}\n\tfor i, hasBlock := range hasBlocks {\n\t\tif hasBlock {\n\t\t\ttc.t.Errorf(\"HasBlocks #%d: should not have block\", i)\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// testFetchBlockIO ensures all of the block retrieval API functions work as\n// expected for the provide set of blocks.  The blocks must already be stored in\n// the database, or at least stored into the passed transaction.  It also\n// tests several error conditions such as ensuring the expected errors are\n// returned when fetching blocks, headers, and regions that don't exist.\nfunc testFetchBlockIO(tc *testContext, tx database.Tx) bool {\n\t// ---------------------\n\t// Non-bulk Block IO API\n\t// ---------------------\n\n\t// Test the individual block APIs one block at a time.  Also, build the\n\t// data needed to test the bulk APIs below while looping.\n\tallBlockHashes := make([]chainhash.Hash, len(tc.blocks))\n\tallBlockBytes := make([][]byte, len(tc.blocks))\n\tallBlockTxLocs := make([][]wire.TxLoc, len(tc.blocks))\n\tallBlockRegions := make([]database.BlockRegion, len(tc.blocks))\n\tfor i, block := range tc.blocks {\n\t\tblockHash := block.Hash()\n\t\tallBlockHashes[i] = *blockHash\n\n\t\tblockBytes, err := block.Bytes()\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"block.Bytes(%d): unexpected error: %v\", i,\n\t\t\t\terr)\n\t\t\treturn false\n\t\t}\n\t\tallBlockBytes[i] = blockBytes\n\n\t\ttxLocs, err := block.TxLoc()\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"block.TxLoc(%d): unexpected error: %v\", i,\n\t\t\t\terr)\n\t\t\treturn false\n\t\t}\n\t\tallBlockTxLocs[i] = txLocs\n\n\t\t// Ensure the block data fetched from the database matches the\n\t\t// expected bytes.\n\t\tgotBlockBytes, err := tx.FetchBlock(blockHash)\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"FetchBlock(%s): unexpected error: %v\",\n\t\t\t\tblockHash, err)\n\t\t\treturn false\n\t\t}\n\t\tif !bytes.Equal(gotBlockBytes, blockBytes) {\n\t\t\ttc.t.Errorf(\"FetchBlock(%s): bytes mismatch: got %x, \"+\n\t\t\t\t\"want %x\", blockHash, gotBlockBytes, blockBytes)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure the block header fetched from the database matches the\n\t\t// expected bytes.\n\t\twantHeaderBytes := blockBytes[0:wire.MaxBlockHeaderPayload]\n\t\tgotHeaderBytes, err := tx.FetchBlockHeader(blockHash)\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"FetchBlockHeader(%s): unexpected error: %v\",\n\t\t\t\tblockHash, err)\n\t\t\treturn false\n\t\t}\n\t\tif !bytes.Equal(gotHeaderBytes, wantHeaderBytes) {\n\t\t\ttc.t.Errorf(\"FetchBlockHeader(%s): bytes mismatch: \"+\n\t\t\t\t\"got %x, want %x\", blockHash, gotHeaderBytes,\n\t\t\t\twantHeaderBytes)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure the first transaction fetched as a block region from\n\t\t// the database matches the expected bytes.\n\t\tregion := database.BlockRegion{\n\t\t\tHash:   blockHash,\n\t\t\tOffset: uint32(txLocs[0].TxStart),\n\t\t\tLen:    uint32(txLocs[0].TxLen),\n\t\t}\n\t\tallBlockRegions[i] = region\n\t\tendRegionOffset := region.Offset + region.Len\n\t\twantRegionBytes := blockBytes[region.Offset:endRegionOffset]\n\t\tgotRegionBytes, err := tx.FetchBlockRegion(&region)\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"FetchBlockRegion(%s): unexpected error: %v\",\n\t\t\t\tblockHash, err)\n\t\t\treturn false\n\t\t}\n\t\tif !bytes.Equal(gotRegionBytes, wantRegionBytes) {\n\t\t\ttc.t.Errorf(\"FetchBlockRegion(%s): bytes mismatch: \"+\n\t\t\t\t\"got %x, want %x\", blockHash, gotRegionBytes,\n\t\t\t\twantRegionBytes)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure block hash exists as expected.\n\t\thasBlock, err := tx.HasBlock(blockHash)\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"HasBlock(%s): unexpected error: %v\",\n\t\t\t\tblockHash, err)\n\t\t\treturn false\n\t\t}\n\t\tif !hasBlock {\n\t\t\ttc.t.Errorf(\"HasBlock(%s): database claims it doesn't \"+\n\t\t\t\t\"have the block when it should\", blockHash)\n\t\t\treturn false\n\t\t}\n\n\t\t// -----------------------\n\t\t// Invalid blocks/regions.\n\t\t// -----------------------\n\n\t\t// Ensure fetching a block that doesn't exist returns the\n\t\t// expected error.\n\t\tbadBlockHash := &chainhash.Hash{}\n\t\ttestName := fmt.Sprintf(\"FetchBlock(%s) invalid block\",\n\t\t\tbadBlockHash)\n\t\twantErrCode := database.ErrBlockNotFound\n\t\t_, err = tx.FetchBlock(badBlockHash)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure fetching a block header that doesn't exist returns\n\t\t// the expected error.\n\t\ttestName = fmt.Sprintf(\"FetchBlockHeader(%s) invalid block\",\n\t\t\tbadBlockHash)\n\t\t_, err = tx.FetchBlockHeader(badBlockHash)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure fetching a block region in a block that doesn't exist\n\t\t// return the expected error.\n\t\ttestName = fmt.Sprintf(\"FetchBlockRegion(%s) invalid hash\",\n\t\t\tbadBlockHash)\n\t\twantErrCode = database.ErrBlockNotFound\n\t\tregion.Hash = badBlockHash\n\t\tregion.Offset = ^uint32(0)\n\t\t_, err = tx.FetchBlockRegion(&region)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure fetching a block region that is out of bounds returns\n\t\t// the expected error.\n\t\ttestName = fmt.Sprintf(\"FetchBlockRegion(%s) invalid region\",\n\t\t\tblockHash)\n\t\twantErrCode = database.ErrBlockRegionInvalid\n\t\tregion.Hash = blockHash\n\t\tregion.Offset = ^uint32(0)\n\t\t_, err = tx.FetchBlockRegion(&region)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// -----------------\n\t// Bulk Block IO API\n\t// -----------------\n\n\t// Ensure the bulk block data fetched from the database matches the\n\t// expected bytes.\n\tblockData, err := tx.FetchBlocks(allBlockHashes)\n\tif err != nil {\n\t\ttc.t.Errorf(\"FetchBlocks: unexpected error: %v\", err)\n\t\treturn false\n\t}\n\tif len(blockData) != len(allBlockBytes) {\n\t\ttc.t.Errorf(\"FetchBlocks: unexpected number of results - got \"+\n\t\t\t\"%d, want %d\", len(blockData), len(allBlockBytes))\n\t\treturn false\n\t}\n\tfor i := 0; i < len(blockData); i++ {\n\t\tblockHash := allBlockHashes[i]\n\t\twantBlockBytes := allBlockBytes[i]\n\t\tgotBlockBytes := blockData[i]\n\t\tif !bytes.Equal(gotBlockBytes, wantBlockBytes) {\n\t\t\ttc.t.Errorf(\"FetchBlocks(%s): bytes mismatch: got %x, \"+\n\t\t\t\t\"want %x\", blockHash, gotBlockBytes,\n\t\t\t\twantBlockBytes)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// Ensure the bulk block headers fetched from the database match the\n\t// expected bytes.\n\tblockHeaderData, err := tx.FetchBlockHeaders(allBlockHashes)\n\tif err != nil {\n\t\ttc.t.Errorf(\"FetchBlockHeaders: unexpected error: %v\", err)\n\t\treturn false\n\t}\n\tif len(blockHeaderData) != len(allBlockBytes) {\n\t\ttc.t.Errorf(\"FetchBlockHeaders: unexpected number of results \"+\n\t\t\t\"- got %d, want %d\", len(blockHeaderData),\n\t\t\tlen(allBlockBytes))\n\t\treturn false\n\t}\n\tfor i := 0; i < len(blockHeaderData); i++ {\n\t\tblockHash := allBlockHashes[i]\n\t\twantHeaderBytes := allBlockBytes[i][0:wire.MaxBlockHeaderPayload]\n\t\tgotHeaderBytes := blockHeaderData[i]\n\t\tif !bytes.Equal(gotHeaderBytes, wantHeaderBytes) {\n\t\t\ttc.t.Errorf(\"FetchBlockHeaders(%s): bytes mismatch: \"+\n\t\t\t\t\"got %x, want %x\", blockHash, gotHeaderBytes,\n\t\t\t\twantHeaderBytes)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// Ensure the first transaction of every block fetched in bulk block\n\t// regions from the database matches the expected bytes.\n\tallRegionBytes, err := tx.FetchBlockRegions(allBlockRegions)\n\tif err != nil {\n\t\ttc.t.Errorf(\"FetchBlockRegions: unexpected error: %v\", err)\n\t\treturn false\n\n\t}\n\tif len(allRegionBytes) != len(allBlockRegions) {\n\t\ttc.t.Errorf(\"FetchBlockRegions: unexpected number of results \"+\n\t\t\t\"- got %d, want %d\", len(allRegionBytes),\n\t\t\tlen(allBlockRegions))\n\t\treturn false\n\t}\n\tfor i, gotRegionBytes := range allRegionBytes {\n\t\tregion := &allBlockRegions[i]\n\t\tendRegionOffset := region.Offset + region.Len\n\t\twantRegionBytes := blockData[i][region.Offset:endRegionOffset]\n\t\tif !bytes.Equal(gotRegionBytes, wantRegionBytes) {\n\t\t\ttc.t.Errorf(\"FetchBlockRegions(%d): bytes mismatch: \"+\n\t\t\t\t\"got %x, want %x\", i, gotRegionBytes,\n\t\t\t\twantRegionBytes)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// Ensure the bulk determination of whether a set of block hashes are in\n\t// the database returns true for all loaded blocks.\n\thasBlocks, err := tx.HasBlocks(allBlockHashes)\n\tif err != nil {\n\t\ttc.t.Errorf(\"HasBlocks: unexpected error: %v\", err)\n\t\treturn false\n\t}\n\tfor i, hasBlock := range hasBlocks {\n\t\tif !hasBlock {\n\t\t\ttc.t.Errorf(\"HasBlocks(%d): should have block\", i)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// -----------------------\n\t// Invalid blocks/regions.\n\t// -----------------------\n\n\t// Ensure fetching blocks for which one doesn't exist returns the\n\t// expected error.\n\ttestName := \"FetchBlocks invalid hash\"\n\tbadBlockHashes := make([]chainhash.Hash, len(allBlockHashes)+1)\n\tcopy(badBlockHashes, allBlockHashes)\n\tbadBlockHashes[len(badBlockHashes)-1] = chainhash.Hash{}\n\twantErrCode := database.ErrBlockNotFound\n\t_, err = tx.FetchBlocks(badBlockHashes)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure fetching block headers for which one doesn't exist returns the\n\t// expected error.\n\ttestName = \"FetchBlockHeaders invalid hash\"\n\t_, err = tx.FetchBlockHeaders(badBlockHashes)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure fetching block regions for which one of blocks doesn't exist\n\t// returns expected error.\n\ttestName = \"FetchBlockRegions invalid hash\"\n\tbadBlockRegions := make([]database.BlockRegion, len(allBlockRegions)+1)\n\tcopy(badBlockRegions, allBlockRegions)\n\tbadBlockRegions[len(badBlockRegions)-1].Hash = &chainhash.Hash{}\n\twantErrCode = database.ErrBlockNotFound\n\t_, err = tx.FetchBlockRegions(badBlockRegions)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure fetching block regions that are out of bounds returns the\n\t// expected error.\n\ttestName = \"FetchBlockRegions invalid regions\"\n\tbadBlockRegions = badBlockRegions[:len(badBlockRegions)-1]\n\tfor i := range badBlockRegions {\n\t\tbadBlockRegions[i].Offset = ^uint32(0)\n\t}\n\twantErrCode = database.ErrBlockRegionInvalid\n\t_, err = tx.FetchBlockRegions(badBlockRegions)\n\treturn checkDbError(tc.t, testName, err, wantErrCode)\n}\n\n// testBlockIOTxInterface ensures that the block IO interface works as expected\n// for both managed read/write and manual transactions.  This function leaves\n// all of the stored blocks in the database.\nfunc testBlockIOTxInterface(tc *testContext) bool {\n\t// Ensure attempting to store a block with a read-only transaction fails\n\t// with the expected error.\n\terr := tc.db.View(func(tx database.Tx) error {\n\t\twantErrCode := database.ErrTxNotWritable\n\t\tfor i, block := range tc.blocks {\n\t\t\ttestName := fmt.Sprintf(\"StoreBlock(%d) on ro tx\", i)\n\t\t\terr := tx.StoreBlock(block)\n\t\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\t\treturn errSubTestFail\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\t// Populate the database with loaded blocks and ensure all of the data\n\t// fetching APIs work properly on them within the transaction before a\n\t// commit or rollback.  Then, force a rollback so the code below can\n\t// ensure none of the data actually gets stored.\n\tforceRollbackError := fmt.Errorf(\"force rollback\")\n\terr = tc.db.Update(func(tx database.Tx) error {\n\t\t// Store all blocks in the same transaction.\n\t\tfor i, block := range tc.blocks {\n\t\t\terr := tx.StoreBlock(block)\n\t\t\tif err != nil {\n\t\t\t\ttc.t.Errorf(\"StoreBlock #%d: unexpected error: \"+\n\t\t\t\t\t\"%v\", i, err)\n\t\t\t\treturn errSubTestFail\n\t\t\t}\n\t\t}\n\n\t\t// Ensure attempting to store the same block again, before the\n\t\t// transaction has been committed, returns the expected error.\n\t\twantErrCode := database.ErrBlockExists\n\t\tfor i, block := range tc.blocks {\n\t\t\ttestName := fmt.Sprintf(\"duplicate block entry #%d \"+\n\t\t\t\t\"(before commit)\", i)\n\t\t\terr := tx.StoreBlock(block)\n\t\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\t\treturn errSubTestFail\n\t\t\t}\n\t\t}\n\n\t\t// Ensure that all data fetches from the stored blocks before\n\t\t// the transaction has been committed work as expected.\n\t\tif !testFetchBlockIO(tc, tx) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\treturn forceRollbackError\n\t})\n\tif err != forceRollbackError {\n\t\tif err == errSubTestFail {\n\t\t\treturn false\n\t\t}\n\n\t\ttc.t.Errorf(\"Update: inner function error not returned - got \"+\n\t\t\t\"%v, want %v\", err, forceRollbackError)\n\t\treturn false\n\t}\n\n\t// Ensure rollback was successful\n\terr = tc.db.View(func(tx database.Tx) error {\n\t\tif !testFetchBlockIOMissing(tc, tx) {\n\t\t\treturn errSubTestFail\n\t\t}\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\t// Populate the database with loaded blocks and ensure all of the data\n\t// fetching APIs work properly.\n\terr = tc.db.Update(func(tx database.Tx) error {\n\t\t// Store a bunch of blocks in the same transaction.\n\t\tfor i, block := range tc.blocks {\n\t\t\terr := tx.StoreBlock(block)\n\t\t\tif err != nil {\n\t\t\t\ttc.t.Errorf(\"StoreBlock #%d: unexpected error: \"+\n\t\t\t\t\t\"%v\", i, err)\n\t\t\t\treturn errSubTestFail\n\t\t\t}\n\t\t}\n\n\t\t// Ensure attempting to store the same block again while in the\n\t\t// same transaction, but before it has been committed, returns\n\t\t// the expected error.\n\t\tfor i, block := range tc.blocks {\n\t\t\ttestName := fmt.Sprintf(\"duplicate block entry #%d \"+\n\t\t\t\t\"(before commit)\", i)\n\t\t\twantErrCode := database.ErrBlockExists\n\t\t\terr := tx.StoreBlock(block)\n\t\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\t\treturn errSubTestFail\n\t\t\t}\n\t\t}\n\n\t\t// Ensure that all data fetches from the stored blocks before\n\t\t// the transaction has been committed work as expected.\n\t\tif !testFetchBlockIO(tc, tx) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\t// Ensure all data fetch tests work as expected using a managed\n\t// read-only transaction after the data was successfully committed\n\t// above.\n\terr = tc.db.View(func(tx database.Tx) error {\n\t\tif !testFetchBlockIO(tc, tx) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\t// Ensure all data fetch tests work as expected using a managed\n\t// read-write transaction after the data was successfully committed\n\t// above.\n\terr = tc.db.Update(func(tx database.Tx) error {\n\t\tif !testFetchBlockIO(tc, tx) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\t// Ensure attempting to store existing blocks again returns the\n\t\t// expected error.  Note that this is different from the\n\t\t// previous version since this is a new transaction after the\n\t\t// blocks have been committed.\n\t\twantErrCode := database.ErrBlockExists\n\t\tfor i, block := range tc.blocks {\n\t\t\ttestName := fmt.Sprintf(\"duplicate block entry #%d \"+\n\t\t\t\t\"(before commit)\", i)\n\t\t\terr := tx.StoreBlock(block)\n\t\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\t\treturn errSubTestFail\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// testClosedTxInterface ensures that both the metadata and block IO API\n// functions behave as expected when attempted against a closed transaction.\nfunc testClosedTxInterface(tc *testContext, tx database.Tx) bool {\n\twantErrCode := database.ErrTxClosed\n\tbucket := tx.Metadata()\n\tcursor := tx.Metadata().Cursor()\n\tbucketName := []byte(\"closedtxbucket\")\n\tkeyName := []byte(\"closedtxkey\")\n\n\t// ------------\n\t// Metadata API\n\t// ------------\n\n\t// Ensure that attempting to get an existing bucket returns nil when the\n\t// transaction is closed.\n\tif b := bucket.Bucket(bucketName); b != nil {\n\t\ttc.t.Errorf(\"Bucket: did not return nil on closed tx\")\n\t\treturn false\n\t}\n\n\t// Ensure CreateBucket returns expected error.\n\ttestName := \"CreateBucket on closed tx\"\n\t_, err := bucket.CreateBucket(bucketName)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure CreateBucketIfNotExists returns expected error.\n\ttestName = \"CreateBucketIfNotExists on closed tx\"\n\t_, err = bucket.CreateBucketIfNotExists(bucketName)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure Delete returns expected error.\n\ttestName = \"Delete on closed tx\"\n\terr = bucket.Delete(keyName)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure DeleteBucket returns expected error.\n\ttestName = \"DeleteBucket on closed tx\"\n\terr = bucket.DeleteBucket(bucketName)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure ForEach returns expected error.\n\ttestName = \"ForEach on closed tx\"\n\terr = bucket.ForEach(nil)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure ForEachBucket returns expected error.\n\ttestName = \"ForEachBucket on closed tx\"\n\terr = bucket.ForEachBucket(nil)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure Get returns expected error.\n\ttestName = \"Get on closed tx\"\n\tif k := bucket.Get(keyName); k != nil {\n\t\ttc.t.Errorf(\"Get: did not return nil on closed tx\")\n\t\treturn false\n\t}\n\n\t// Ensure Put returns expected error.\n\ttestName = \"Put on closed tx\"\n\terr = bucket.Put(keyName, []byte(\"test\"))\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// -------------------\n\t// Metadata Cursor API\n\t// -------------------\n\n\t// Ensure attempting to get a bucket from a cursor on a closed tx gives\n\t// back nil.\n\tif b := cursor.Bucket(); b != nil {\n\t\ttc.t.Error(\"Cursor.Bucket: returned non-nil on closed tx\")\n\t\treturn false\n\t}\n\n\t// Ensure Cursor.Delete returns expected error.\n\ttestName = \"Cursor.Delete on closed tx\"\n\terr = cursor.Delete()\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure Cursor.First on a closed tx returns false and nil key/value.\n\tif cursor.First() {\n\t\ttc.t.Error(\"Cursor.First: claims ok on closed tx\")\n\t\treturn false\n\t}\n\tif cursor.Key() != nil || cursor.Value() != nil {\n\t\ttc.t.Error(\"Cursor.First: key and/or value are not nil on \" +\n\t\t\t\"closed tx\")\n\t\treturn false\n\t}\n\n\t// Ensure Cursor.Last on a closed tx returns false and nil key/value.\n\tif cursor.Last() {\n\t\ttc.t.Error(\"Cursor.Last: claims ok on closed tx\")\n\t\treturn false\n\t}\n\tif cursor.Key() != nil || cursor.Value() != nil {\n\t\ttc.t.Error(\"Cursor.Last: key and/or value are not nil on \" +\n\t\t\t\"closed tx\")\n\t\treturn false\n\t}\n\n\t// Ensure Cursor.Next on a closed tx returns false and nil key/value.\n\tif cursor.Next() {\n\t\ttc.t.Error(\"Cursor.Next: claims ok on closed tx\")\n\t\treturn false\n\t}\n\tif cursor.Key() != nil || cursor.Value() != nil {\n\t\ttc.t.Error(\"Cursor.Next: key and/or value are not nil on \" +\n\t\t\t\"closed tx\")\n\t\treturn false\n\t}\n\n\t// Ensure Cursor.Prev on a closed tx returns false and nil key/value.\n\tif cursor.Prev() {\n\t\ttc.t.Error(\"Cursor.Prev: claims ok on closed tx\")\n\t\treturn false\n\t}\n\tif cursor.Key() != nil || cursor.Value() != nil {\n\t\ttc.t.Error(\"Cursor.Prev: key and/or value are not nil on \" +\n\t\t\t\"closed tx\")\n\t\treturn false\n\t}\n\n\t// Ensure Cursor.Seek on a closed tx returns false and nil key/value.\n\tif cursor.Seek([]byte{}) {\n\t\ttc.t.Error(\"Cursor.Seek: claims ok on closed tx\")\n\t\treturn false\n\t}\n\tif cursor.Key() != nil || cursor.Value() != nil {\n\t\ttc.t.Error(\"Cursor.Seek: key and/or value are not nil on \" +\n\t\t\t\"closed tx\")\n\t\treturn false\n\t}\n\n\t// ---------------------\n\t// Non-bulk Block IO API\n\t// ---------------------\n\n\t// Test the individual block APIs one block at a time to ensure they\n\t// return the expected error.  Also, build the data needed to test the\n\t// bulk APIs below while looping.\n\tallBlockHashes := make([]chainhash.Hash, len(tc.blocks))\n\tallBlockRegions := make([]database.BlockRegion, len(tc.blocks))\n\tfor i, block := range tc.blocks {\n\t\tblockHash := block.Hash()\n\t\tallBlockHashes[i] = *blockHash\n\n\t\ttxLocs, err := block.TxLoc()\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"block.TxLoc(%d): unexpected error: %v\", i,\n\t\t\t\terr)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure StoreBlock returns expected error.\n\t\ttestName = \"StoreBlock on closed tx\"\n\t\terr = tx.StoreBlock(block)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure FetchBlock returns expected error.\n\t\ttestName = fmt.Sprintf(\"FetchBlock #%d on closed tx\", i)\n\t\t_, err = tx.FetchBlock(blockHash)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure FetchBlockHeader returns expected error.\n\t\ttestName = fmt.Sprintf(\"FetchBlockHeader #%d on closed tx\", i)\n\t\t_, err = tx.FetchBlockHeader(blockHash)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure the first transaction fetched as a block region from\n\t\t// the database returns the expected error.\n\t\tregion := database.BlockRegion{\n\t\t\tHash:   blockHash,\n\t\t\tOffset: uint32(txLocs[0].TxStart),\n\t\t\tLen:    uint32(txLocs[0].TxLen),\n\t\t}\n\t\tallBlockRegions[i] = region\n\t\t_, err = tx.FetchBlockRegion(&region)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure HasBlock returns expected error.\n\t\ttestName = fmt.Sprintf(\"HasBlock #%d on closed tx\", i)\n\t\t_, err = tx.HasBlock(blockHash)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// -----------------\n\t// Bulk Block IO API\n\t// -----------------\n\n\t// Ensure FetchBlocks returns expected error.\n\ttestName = \"FetchBlocks on closed tx\"\n\t_, err = tx.FetchBlocks(allBlockHashes)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure FetchBlockHeaders returns expected error.\n\ttestName = \"FetchBlockHeaders on closed tx\"\n\t_, err = tx.FetchBlockHeaders(allBlockHashes)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure FetchBlockRegions returns expected error.\n\ttestName = \"FetchBlockRegions on closed tx\"\n\t_, err = tx.FetchBlockRegions(allBlockRegions)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// Ensure HasBlocks returns expected error.\n\ttestName = \"HasBlocks on closed tx\"\n\t_, err = tx.HasBlocks(allBlockHashes)\n\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\treturn false\n\t}\n\n\t// ---------------\n\t// Commit/Rollback\n\t// ---------------\n\n\t// Ensure that attempting to rollback or commit a transaction that is\n\t// already closed returns the expected error.\n\terr = tx.Rollback()\n\tif !checkDbError(tc.t, \"closed tx rollback\", err, wantErrCode) {\n\t\treturn false\n\t}\n\terr = tx.Commit()\n\treturn checkDbError(tc.t, \"closed tx commit\", err, wantErrCode)\n}\n\n// testTxClosed ensures that both the metadata and block IO API functions behave\n// as expected when attempted against both read-only and read-write\n// transactions.\nfunc testTxClosed(tc *testContext) bool {\n\tbucketName := []byte(\"closedtxbucket\")\n\tkeyName := []byte(\"closedtxkey\")\n\n\t// Start a transaction, create a bucket and key used for testing, and\n\t// immediately perform a commit on it so it is closed.\n\ttx, err := tc.db.Begin(true)\n\tif err != nil {\n\t\ttc.t.Errorf(\"Begin(true): unexpected error: %v\", err)\n\t\treturn false\n\t}\n\tdefer rollbackOnPanic(tc.t, tx)\n\tif _, err := tx.Metadata().CreateBucket(bucketName); err != nil {\n\t\ttc.t.Errorf(\"CreateBucket: unexpected error: %v\", err)\n\t\treturn false\n\t}\n\tif err := tx.Metadata().Put(keyName, []byte(\"test\")); err != nil {\n\t\ttc.t.Errorf(\"Put: unexpected error: %v\", err)\n\t\treturn false\n\t}\n\tif err := tx.Commit(); err != nil {\n\t\ttc.t.Errorf(\"Commit: unexpected error: %v\", err)\n\t\treturn false\n\t}\n\n\t// Ensure invoking all of the functions on the closed read-write\n\t// transaction behave as expected.\n\tif !testClosedTxInterface(tc, tx) {\n\t\treturn false\n\t}\n\n\t// Repeat the tests with a rolled-back read-only transaction.\n\ttx, err = tc.db.Begin(false)\n\tif err != nil {\n\t\ttc.t.Errorf(\"Begin(false): unexpected error: %v\", err)\n\t\treturn false\n\t}\n\tdefer rollbackOnPanic(tc.t, tx)\n\tif err := tx.Rollback(); err != nil {\n\t\ttc.t.Errorf(\"Rollback: unexpected error: %v\", err)\n\t\treturn false\n\t}\n\n\t// Ensure invoking all of the functions on the closed read-only\n\t// transaction behave as expected.\n\treturn testClosedTxInterface(tc, tx)\n}\n\n// testConcurrecy ensure the database properly supports concurrent readers and\n// only a single writer.  It also ensures views act as snapshots at the time\n// they are acquired.\nfunc testConcurrecy(tc *testContext) bool {\n\t// sleepTime is how long each of the concurrent readers should sleep to\n\t// aid in detection of whether or not the data is actually being read\n\t// concurrently.  It starts with a sane lower bound.\n\tvar sleepTime = time.Millisecond * 250\n\n\t// Determine about how long it takes for a single block read.  When it's\n\t// longer than the default minimum sleep time, adjust the sleep time to\n\t// help prevent durations that are too short which would cause erroneous\n\t// test failures on slower systems.\n\tstartTime := time.Now()\n\terr := tc.db.View(func(tx database.Tx) error {\n\t\t_, err := tx.FetchBlock(tc.blocks[0].Hash())\n\t\treturn err\n\t})\n\tif err != nil {\n\t\ttc.t.Errorf(\"Unexpected error in view: %v\", err)\n\t\treturn false\n\t}\n\telapsed := time.Since(startTime)\n\tif sleepTime < elapsed {\n\t\tsleepTime = elapsed\n\t}\n\ttc.t.Logf(\"Time to load block 0: %v, using sleep time: %v\", elapsed,\n\t\tsleepTime)\n\n\t// reader takes a block number to load and channel to return the result\n\t// of the operation on.  It is used below to launch multiple concurrent\n\t// readers.\n\tnumReaders := len(tc.blocks)\n\tresultChan := make(chan bool, numReaders)\n\treader := func(blockNum int) {\n\t\terr := tc.db.View(func(tx database.Tx) error {\n\t\t\ttime.Sleep(sleepTime)\n\t\t\t_, err := tx.FetchBlock(tc.blocks[blockNum].Hash())\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"Unexpected error in concurrent view: %v\",\n\t\t\t\terr)\n\t\t\tresultChan <- false\n\t\t}\n\t\tresultChan <- true\n\t}\n\n\t// Start up several concurrent readers for the same block and wait for\n\t// the results.\n\tstartTime = time.Now()\n\tfor i := 0; i < numReaders; i++ {\n\t\tgo reader(0)\n\t}\n\tfor i := 0; i < numReaders; i++ {\n\t\tif result := <-resultChan; !result {\n\t\t\treturn false\n\t\t}\n\t}\n\telapsed = time.Since(startTime)\n\ttc.t.Logf(\"%d concurrent reads of same block elapsed: %v\", numReaders,\n\t\telapsed)\n\n\t// Consider it a failure if it took longer than half the time it would\n\t// take with no concurrency.\n\tif elapsed > sleepTime*time.Duration(numReaders/2) {\n\t\ttc.t.Errorf(\"Concurrent views for same block did not appear to \"+\n\t\t\t\"run simultaneously: elapsed %v\", elapsed)\n\t\treturn false\n\t}\n\n\t// Start up several concurrent readers for different blocks and wait for\n\t// the results.\n\tstartTime = time.Now()\n\tfor i := 0; i < numReaders; i++ {\n\t\tgo reader(i)\n\t}\n\tfor i := 0; i < numReaders; i++ {\n\t\tif result := <-resultChan; !result {\n\t\t\treturn false\n\t\t}\n\t}\n\telapsed = time.Since(startTime)\n\ttc.t.Logf(\"%d concurrent reads of different blocks elapsed: %v\",\n\t\tnumReaders, elapsed)\n\n\t// Consider it a failure if it took longer than half the time it would\n\t// take with no concurrency.\n\tif elapsed > sleepTime*time.Duration(numReaders/2) {\n\t\ttc.t.Errorf(\"Concurrent views for different blocks did not \"+\n\t\t\t\"appear to run simultaneously: elapsed %v\", elapsed)\n\t\treturn false\n\t}\n\n\t// Start up a few readers and wait for them to acquire views.  Each\n\t// reader waits for a signal from the writer to be finished to ensure\n\t// that the data written by the writer is not seen by the view since it\n\t// was started before the data was set.\n\tconcurrentKey := []byte(\"notthere\")\n\tconcurrentVal := []byte(\"someval\")\n\tstarted := make(chan struct{})\n\twriteComplete := make(chan struct{})\n\treader = func(blockNum int) {\n\t\terr := tc.db.View(func(tx database.Tx) error {\n\t\t\tstarted <- struct{}{}\n\n\t\t\t// Wait for the writer to complete.\n\t\t\t<-writeComplete\n\n\t\t\t// Since this reader was created before the write took\n\t\t\t// place, the data it added should not be visible.\n\t\t\tval := tx.Metadata().Get(concurrentKey)\n\t\t\tif val != nil {\n\t\t\t\treturn fmt.Errorf(\"%s should not be visible\",\n\t\t\t\t\tconcurrentKey)\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"Unexpected error in concurrent view: %v\",\n\t\t\t\terr)\n\t\t\tresultChan <- false\n\t\t}\n\t\tresultChan <- true\n\t}\n\tfor i := 0; i < numReaders; i++ {\n\t\tgo reader(0)\n\t}\n\tfor i := 0; i < numReaders; i++ {\n\t\t<-started\n\t}\n\n\t// All readers are started and waiting for completion of the writer.\n\t// Set some data the readers are expecting to not find and signal the\n\t// readers the write is done by closing the writeComplete channel.\n\terr = tc.db.Update(func(tx database.Tx) error {\n\t\treturn tx.Metadata().Put(concurrentKey, concurrentVal)\n\t})\n\tif err != nil {\n\t\ttc.t.Errorf(\"Unexpected error in update: %v\", err)\n\t\treturn false\n\t}\n\tclose(writeComplete)\n\n\t// Wait for reader results.\n\tfor i := 0; i < numReaders; i++ {\n\t\tif result := <-resultChan; !result {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// Start a few writers and ensure the total time is at least the\n\t// writeSleepTime * numWriters.  This ensures only one write transaction\n\t// can be active at a time.\n\twriteSleepTime := time.Millisecond * 250\n\twriter := func() {\n\t\terr := tc.db.Update(func(tx database.Tx) error {\n\t\t\ttime.Sleep(writeSleepTime)\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"Unexpected error in concurrent view: %v\",\n\t\t\t\terr)\n\t\t\tresultChan <- false\n\t\t}\n\t\tresultChan <- true\n\t}\n\tnumWriters := 3\n\tstartTime = time.Now()\n\tfor i := 0; i < numWriters; i++ {\n\t\tgo writer()\n\t}\n\tfor i := 0; i < numWriters; i++ {\n\t\tif result := <-resultChan; !result {\n\t\t\treturn false\n\t\t}\n\t}\n\telapsed = time.Since(startTime)\n\ttc.t.Logf(\"%d concurrent writers elapsed using sleep time %v: %v\",\n\t\tnumWriters, writeSleepTime, elapsed)\n\n\t// The total time must have been at least the sum of all sleeps if the\n\t// writes blocked properly.\n\tif elapsed < writeSleepTime*time.Duration(numWriters) {\n\t\ttc.t.Errorf(\"Concurrent writes appeared to run simultaneously: \"+\n\t\t\t\"elapsed %v\", elapsed)\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// testConcurrentClose ensures that closing the database with open transactions\n// blocks until the transactions are finished.\n//\n// The database will be closed upon returning from this function.\nfunc testConcurrentClose(tc *testContext) bool {\n\t// Start up a few readers and wait for them to acquire views.  Each\n\t// reader waits for a signal to complete to ensure the transactions stay\n\t// open until they are explicitly signalled to be closed.\n\tvar activeReaders int32\n\tnumReaders := 3\n\tstarted := make(chan struct{})\n\tfinishReaders := make(chan struct{})\n\tresultChan := make(chan bool, numReaders+1)\n\treader := func() {\n\t\terr := tc.db.View(func(tx database.Tx) error {\n\t\t\tatomic.AddInt32(&activeReaders, 1)\n\t\t\tstarted <- struct{}{}\n\t\t\t<-finishReaders\n\t\t\tatomic.AddInt32(&activeReaders, -1)\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"Unexpected error in concurrent view: %v\",\n\t\t\t\terr)\n\t\t\tresultChan <- false\n\t\t}\n\t\tresultChan <- true\n\t}\n\tfor i := 0; i < numReaders; i++ {\n\t\tgo reader()\n\t}\n\tfor i := 0; i < numReaders; i++ {\n\t\t<-started\n\t}\n\n\t// Close the database in a separate goroutine.  This should block until\n\t// the transactions are finished.  Once the close has taken place, the\n\t// dbClosed channel is closed to signal the main goroutine below.\n\tdbClosed := make(chan struct{})\n\tgo func() {\n\t\tstarted <- struct{}{}\n\t\terr := tc.db.Close()\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"Unexpected error in concurrent view: %v\",\n\t\t\t\terr)\n\t\t\tresultChan <- false\n\t\t}\n\t\tclose(dbClosed)\n\t\tresultChan <- true\n\t}()\n\t<-started\n\n\t// Wait a short period and then signal the reader transactions to\n\t// finish.  When the db closed channel is received, ensure there are no\n\t// active readers open.\n\ttime.AfterFunc(time.Millisecond*250, func() { close(finishReaders) })\n\t<-dbClosed\n\tif nr := atomic.LoadInt32(&activeReaders); nr != 0 {\n\t\ttc.t.Errorf(\"Close did not appear to block with active \"+\n\t\t\t\"readers: %d active\", nr)\n\t\treturn false\n\t}\n\n\t// Wait for all results.\n\tfor i := 0; i < numReaders+1; i++ {\n\t\tif result := <-resultChan; !result {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// testInterface tests performs tests for the various interfaces of the database\n// package which require state in the database for the given database type.\nfunc testInterface(t *testing.T, db database.DB) {\n\t// Create a test context to pass around.\n\tcontext := testContext{t: t, db: db}\n\n\t// Load the test blocks and store in the test context for use throughout\n\t// the tests.\n\tblocks, err := loadBlocks(t, blockDataFile, blockDataNet)\n\tif err != nil {\n\t\tt.Errorf(\"loadBlocks: Unexpected error: %v\", err)\n\t\treturn\n\t}\n\tcontext.blocks = blocks\n\n\t// Test the transaction metadata interface including managed and manual\n\t// transactions as well as buckets.\n\tif !testMetadataTxInterface(&context) {\n\t\treturn\n\t}\n\n\t// Test the transaction block IO interface using managed and manual\n\t// transactions.  This function leaves all of the stored blocks in the\n\t// database since they're used later.\n\tif !testBlockIOTxInterface(&context) {\n\t\treturn\n\t}\n\n\t// Test all of the transaction interface functions against a closed\n\t// transaction work as expected.\n\tif !testTxClosed(&context) {\n\t\treturn\n\t}\n\n\t// Test the database properly supports concurrency.\n\tif !testConcurrecy(&context) {\n\t\treturn\n\t}\n\n\t// Test that closing the database with open transactions blocks until\n\t// the transactions are finished.\n\t//\n\t// The database will be closed upon returning from this function, so it\n\t// must be the last thing called.\n\ttestConcurrentClose(&context)\n}\n"
  },
  {
    "path": "database/ffldb/ldbtreapiter.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ffldb\n\nimport (\n\t\"github.com/btcsuite/btcd/database/internal/treap\"\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\n// ldbTreapIter wraps a treap iterator to provide the additional functionality\n// needed to satisfy the leveldb iterator.Iterator interface.\ntype ldbTreapIter struct {\n\t*treap.Iterator\n\ttx       *transaction\n\treleased bool\n}\n\n// Enforce ldbTreapIter implements the leveldb iterator.Iterator interface.\nvar _ iterator.Iterator = (*ldbTreapIter)(nil)\n\n// Error is only provided to satisfy the iterator interface as there are no\n// errors for this memory-only structure.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *ldbTreapIter) Error() error {\n\treturn nil\n}\n\n// SetReleaser is only provided to satisfy the iterator interface as there is no\n// need to override it.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *ldbTreapIter) SetReleaser(releaser util.Releaser) {\n}\n\n// Release releases the iterator by removing the underlying treap iterator from\n// the list of active iterators against the pending keys treap.\n//\n// This is part of the leveldb iterator.Iterator interface implementation.\nfunc (iter *ldbTreapIter) Release() {\n\tif !iter.released {\n\t\titer.tx.removeActiveIter(iter.Iterator)\n\t\titer.released = true\n\t}\n}\n\n// newLdbTreapIter creates a new treap iterator for the given slice against the\n// pending keys for the passed transaction and returns it wrapped in an\n// ldbTreapIter so it can be used as a leveldb iterator.  It also adds the new\n// iterator to the list of active iterators for the transaction.\nfunc newLdbTreapIter(tx *transaction, slice *util.Range) *ldbTreapIter {\n\titer := tx.pendingKeys.Iterator(slice.Start, slice.Limit)\n\ttx.addActiveIter(iter)\n\treturn &ldbTreapIter{Iterator: iter, tx: tx}\n}\n"
  },
  {
    "path": "database/ffldb/mockfile_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// This file is part of the ffldb package rather than the ffldb_test package as\n// it is part of the whitebox testing.\n\npackage ffldb\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"sync\"\n)\n\n// Errors used for the mock file.\nvar (\n\t// errMockFileClosed is used to indicate a mock file is closed.\n\terrMockFileClosed = errors.New(\"file closed\")\n\n\t// errInvalidOffset is used to indicate an offset that is out of range\n\t// for the file was provided.\n\terrInvalidOffset = errors.New(\"invalid offset\")\n\n\t// errSyncFail is used to indicate simulated sync failure.\n\terrSyncFail = errors.New(\"simulated sync failure\")\n)\n\n// mockFile implements the filer interface and used in order to force failures\n// the database code related to reading and writing from the flat block files.\n// A maxSize of -1 is unlimited.\ntype mockFile struct {\n\tsync.RWMutex\n\tmaxSize      int64\n\tdata         []byte\n\tforceSyncErr bool\n\tclosed       bool\n}\n\n// Close closes the mock file without releasing any data associated with it.\n// This allows it to be \"reopened\" without losing the data.\n//\n// This is part of the filer implementation.\nfunc (f *mockFile) Close() error {\n\tf.Lock()\n\tdefer f.Unlock()\n\n\tif f.closed {\n\t\treturn errMockFileClosed\n\t}\n\tf.closed = true\n\treturn nil\n}\n\n// ReadAt reads len(b) bytes from the mock file starting at byte offset off. It\n// returns the number of bytes read and the error, if any.  ReadAt always\n// returns a non-nil error when n < len(b). At end of file, that error is\n// io.EOF.\n//\n// This is part of the filer implementation.\nfunc (f *mockFile) ReadAt(b []byte, off int64) (int, error) {\n\tf.RLock()\n\tdefer f.RUnlock()\n\n\tif f.closed {\n\t\treturn 0, errMockFileClosed\n\t}\n\tmaxSize := int64(len(f.data))\n\tif f.maxSize > -1 && maxSize > f.maxSize {\n\t\tmaxSize = f.maxSize\n\t}\n\tif off < 0 || off > maxSize {\n\t\treturn 0, errInvalidOffset\n\t}\n\n\t// Limit to the max size field, if set.\n\tnumToRead := int64(len(b))\n\tendOffset := off + numToRead\n\tif endOffset > maxSize {\n\t\tnumToRead = maxSize - off\n\t}\n\n\tcopy(b, f.data[off:off+numToRead])\n\tif numToRead < int64(len(b)) {\n\t\treturn int(numToRead), io.EOF\n\t}\n\treturn int(numToRead), nil\n}\n\n// Truncate changes the size of the mock file.\n//\n// This is part of the filer implementation.\nfunc (f *mockFile) Truncate(size int64) error {\n\tf.Lock()\n\tdefer f.Unlock()\n\n\tif f.closed {\n\t\treturn errMockFileClosed\n\t}\n\tmaxSize := int64(len(f.data))\n\tif f.maxSize > -1 && maxSize > f.maxSize {\n\t\tmaxSize = f.maxSize\n\t}\n\tif size > maxSize {\n\t\treturn errInvalidOffset\n\t}\n\n\tf.data = f.data[:size]\n\treturn nil\n}\n\n// Write writes len(b) bytes to the mock file. It returns the number of bytes\n// written and an error, if any.  Write returns a non-nil error any time\n// n != len(b).\n//\n// This is part of the filer implementation.\nfunc (f *mockFile) WriteAt(b []byte, off int64) (int, error) {\n\tf.Lock()\n\tdefer f.Unlock()\n\n\tif f.closed {\n\t\treturn 0, errMockFileClosed\n\t}\n\tmaxSize := f.maxSize\n\tif maxSize < 0 {\n\t\tmaxSize = 100 * 1024 // 100KiB\n\t}\n\tif off < 0 || off > maxSize {\n\t\treturn 0, errInvalidOffset\n\t}\n\n\t// Limit to the max size field, if set, and grow the slice if needed.\n\tnumToWrite := int64(len(b))\n\tif off+numToWrite > maxSize {\n\t\tnumToWrite = maxSize - off\n\t}\n\tif off+numToWrite > int64(len(f.data)) {\n\t\tnewData := make([]byte, off+numToWrite)\n\t\tcopy(newData, f.data)\n\t\tf.data = newData\n\t}\n\n\tcopy(f.data[off:], b[:numToWrite])\n\tif numToWrite < int64(len(b)) {\n\t\treturn int(numToWrite), io.EOF\n\t}\n\treturn int(numToWrite), nil\n}\n\n// Sync doesn't do anything for mock files.  However, it will return an error if\n// the mock file's forceSyncErr flag is set.\n//\n// This is part of the filer implementation.\nfunc (f *mockFile) Sync() error {\n\tif f.forceSyncErr {\n\t\treturn errSyncFail\n\t}\n\n\treturn nil\n}\n\n// Ensure the mockFile type implements the filer interface.\nvar _ filer = (*mockFile)(nil)\n"
  },
  {
    "path": "database/ffldb/reconcile.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage ffldb\n\nimport (\n\t\"fmt\"\n\t\"hash/crc32\"\n\n\t\"github.com/btcsuite/btcd/database\"\n)\n\n// The serialized write cursor location format is:\n//\n//  [0:4]  Block file (4 bytes)\n//  [4:8]  File offset (4 bytes)\n//  [8:12] Castagnoli CRC-32 checksum (4 bytes)\n\n// serializeWriteRow serialize the current block file and offset where new\n// will be written into a format suitable for storage into the metadata.\nfunc serializeWriteRow(curBlockFileNum, curFileOffset uint32) []byte {\n\tvar serializedRow [12]byte\n\tbyteOrder.PutUint32(serializedRow[0:4], curBlockFileNum)\n\tbyteOrder.PutUint32(serializedRow[4:8], curFileOffset)\n\tchecksum := crc32.Checksum(serializedRow[:8], castagnoli)\n\tbyteOrder.PutUint32(serializedRow[8:12], checksum)\n\treturn serializedRow[:]\n}\n\n// deserializeWriteRow deserializes the write cursor location stored in the\n// metadata.  Returns ErrCorruption if the checksum of the entry doesn't match.\nfunc deserializeWriteRow(writeRow []byte) (uint32, uint32, error) {\n\t// Ensure the checksum matches.  The checksum is at the end.\n\tgotChecksum := crc32.Checksum(writeRow[:8], castagnoli)\n\twantChecksumBytes := writeRow[8:12]\n\twantChecksum := byteOrder.Uint32(wantChecksumBytes)\n\tif gotChecksum != wantChecksum {\n\t\tstr := fmt.Sprintf(\"metadata for write cursor does not match \"+\n\t\t\t\"the expected checksum - got %d, want %d\", gotChecksum,\n\t\t\twantChecksum)\n\t\treturn 0, 0, makeDbErr(database.ErrCorruption, str, nil)\n\t}\n\n\tfileNum := byteOrder.Uint32(writeRow[0:4])\n\tfileOffset := byteOrder.Uint32(writeRow[4:8])\n\treturn fileNum, fileOffset, nil\n}\n\n// reconcileDB reconciles the metadata with the flat block files on disk.  It\n// will also initialize the underlying database if the create flag is set.\nfunc reconcileDB(pdb *db, create bool) (database.DB, error) {\n\t// Perform initial internal bucket and value creation during database\n\t// creation.\n\tif create {\n\t\tif err := initDB(pdb.cache.ldb); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Load the current write cursor position from the metadata.\n\tvar curFileNum, curOffset uint32\n\terr := pdb.View(func(tx database.Tx) error {\n\t\twriteRow := tx.Metadata().Get(writeLocKeyName)\n\t\tif writeRow == nil {\n\t\t\tstr := \"write cursor does not exist\"\n\t\t\treturn makeDbErr(database.ErrCorruption, str, nil)\n\t\t}\n\n\t\tvar err error\n\t\tcurFileNum, curOffset, err = deserializeWriteRow(writeRow)\n\t\treturn err\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// When the write cursor position found by scanning the block files on\n\t// disk is AFTER the position the metadata believes to be true, truncate\n\t// the files on disk to match the metadata.  This can be a fairly common\n\t// occurrence in unclean shutdown scenarios while the block files are in\n\t// the middle of being written.  Since the metadata isn't updated until\n\t// after the block data is written, this is effectively just a rollback\n\t// to the known good point before the unclean shutdown.\n\twc := pdb.store.writeCursor\n\tif wc.curFileNum > curFileNum || (wc.curFileNum == curFileNum &&\n\t\twc.curOffset > curOffset) {\n\n\t\tlog.Info(\"Detected unclean shutdown - Repairing...\")\n\t\tlog.Debugf(\"Metadata claims file %d, offset %d. Block data is \"+\n\t\t\t\"at file %d, offset %d\", curFileNum, curOffset,\n\t\t\twc.curFileNum, wc.curOffset)\n\t\tpdb.store.handleRollback(curFileNum, curOffset)\n\t\tlog.Infof(\"Database sync complete\")\n\t}\n\n\t// When the write cursor position found by scanning the block files on\n\t// disk is BEFORE the position the metadata believes to be true, return\n\t// a corruption error.  Since sync is called after each block is written\n\t// and before the metadata is updated, this should only happen in the\n\t// case of missing, deleted, or truncated block files, which generally\n\t// is not an easily recoverable scenario.  In the future, it might be\n\t// possible to rescan and rebuild the metadata from the block files,\n\t// however, that would need to happen with coordination from a higher\n\t// layer since it could invalidate other metadata.\n\tif wc.curFileNum < curFileNum || (wc.curFileNum == curFileNum &&\n\t\twc.curOffset < curOffset) {\n\n\t\tstr := fmt.Sprintf(\"metadata claims file %d, offset %d, but \"+\n\t\t\t\"block data is at file %d, offset %d\", curFileNum,\n\t\t\tcurOffset, wc.curFileNum, wc.curOffset)\n\t\tlog.Warnf(\"***Database corruption detected***: %v\", str)\n\t\treturn nil, makeDbErr(database.ErrCorruption, str, nil)\n\t}\n\n\treturn pdb, nil\n}\n"
  },
  {
    "path": "database/ffldb/whitebox_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// This file is part of the ffldb package rather than the ffldb_test package as\n// it provides whitebox testing.\n\npackage ffldb\n\nimport (\n\t\"compress/bzip2\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/syndtr/goleveldb/leveldb\"\n\tldberrors \"github.com/syndtr/goleveldb/leveldb/errors\"\n)\n\nvar (\n\t// blockDataNet is the expected network in the test block data.\n\tblockDataNet = wire.MainNet\n\n\t// blockDataFile is the path to a file containing the first 256 blocks\n\t// of the block chain.\n\tblockDataFile = filepath.Join(\"..\", \"testdata\", \"blocks1-256.bz2\")\n\n\t// errSubTestFail is used to signal that a sub test returned false.\n\terrSubTestFail = fmt.Errorf(\"sub test failure\")\n)\n\n// loadBlocks loads the blocks contained in the testdata directory and returns\n// a slice of them.\nfunc loadBlocks(t *testing.T, dataFile string, network wire.BitcoinNet) ([]*btcutil.Block, error) {\n\t// Open the file that contains the blocks for reading.\n\tfi, err := os.Open(dataFile)\n\tif err != nil {\n\t\tt.Errorf(\"failed to open file %v, err %v\", dataFile, err)\n\t\treturn nil, err\n\t}\n\tdefer func() {\n\t\tif err := fi.Close(); err != nil {\n\t\t\tt.Errorf(\"failed to close file %v %v\", dataFile,\n\t\t\t\terr)\n\t\t}\n\t}()\n\tdr := bzip2.NewReader(fi)\n\n\t// Set the first block as the genesis block.\n\tblocks := make([]*btcutil.Block, 0, 256)\n\tgenesis := btcutil.NewBlock(chaincfg.MainNetParams.GenesisBlock)\n\tblocks = append(blocks, genesis)\n\n\t// Load the remaining blocks.\n\tfor height := 1; ; height++ {\n\t\tvar net uint32\n\t\terr := binary.Read(dr, binary.LittleEndian, &net)\n\t\tif err == io.EOF {\n\t\t\t// Hit end of file at the expected offset.  No error.\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to load network type for block %d: %v\",\n\t\t\t\theight, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tif net != uint32(network) {\n\t\t\tt.Errorf(\"Block doesn't match network: %v expects %v\",\n\t\t\t\tnet, network)\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvar blockLen uint32\n\t\terr = binary.Read(dr, binary.LittleEndian, &blockLen)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to load block size for block %d: %v\",\n\t\t\t\theight, err)\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Read the block.\n\t\tblockBytes := make([]byte, blockLen)\n\t\t_, err = io.ReadFull(dr, blockBytes)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to load block %d: %v\", height, err)\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Deserialize and store the block.\n\t\tblock, err := btcutil.NewBlockFromBytes(blockBytes)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to parse block %v: %v\", height, err)\n\t\t\treturn nil, err\n\t\t}\n\t\tblocks = append(blocks, block)\n\t}\n\n\treturn blocks, nil\n}\n\n// checkDbError ensures the passed error is a database.Error with an error code\n// that matches the passed  error code.\nfunc checkDbError(t *testing.T, testName string, gotErr error, wantErrCode database.ErrorCode) bool {\n\tdbErr, ok := gotErr.(database.Error)\n\tif !ok {\n\t\tt.Errorf(\"%s: unexpected error type - got %T, want %T\",\n\t\t\ttestName, gotErr, database.Error{})\n\t\treturn false\n\t}\n\tif dbErr.ErrorCode != wantErrCode {\n\t\tt.Errorf(\"%s: unexpected error code - got %s (%s), want %s\",\n\t\t\ttestName, dbErr.ErrorCode, dbErr.Description,\n\t\t\twantErrCode)\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// testContext is used to store context information about a running test which\n// is passed into helper functions.\ntype testContext struct {\n\tt            *testing.T\n\tdb           database.DB\n\tfiles        map[uint32]*lockableFile\n\tmaxFileSizes map[uint32]int64\n\tblocks       []*btcutil.Block\n}\n\n// TestConvertErr ensures the leveldb error to database error conversion works\n// as expected.\nfunc TestConvertErr(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\terr         error\n\t\twantErrCode database.ErrorCode\n\t}{\n\t\t{&ldberrors.ErrCorrupted{}, database.ErrCorruption},\n\t\t{leveldb.ErrClosed, database.ErrDbNotOpen},\n\t\t{leveldb.ErrSnapshotReleased, database.ErrTxClosed},\n\t\t{leveldb.ErrIterReleased, database.ErrTxClosed},\n\t}\n\n\tfor i, test := range tests {\n\t\tgotErr := convertErr(\"test\", test.err)\n\t\tif gotErr.ErrorCode != test.wantErrCode {\n\t\t\tt.Errorf(\"convertErr #%d unexpected error - got %v, \"+\n\t\t\t\t\"want %v\", i, gotErr.ErrorCode, test.wantErrCode)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestCornerCases ensures several corner cases which can happen when opening\n// a database and/or block files work as expected.\nfunc TestCornerCases(t *testing.T) {\n\tt.Parallel()\n\n\t// Create a file at the database path to force the open below to fail.\n\tdbPath := filepath.Join(t.TempDir(), \"ffldb-errors\")\n\t_ = os.RemoveAll(dbPath)\n\tfi, err := os.Create(dbPath)\n\tif err != nil {\n\t\tt.Errorf(\"os.Create: unexpected error: %v\", err)\n\t\treturn\n\t}\n\tfi.Close()\n\n\t// Ensure creating a new database fails when a file exists where a\n\t// directory is needed.\n\ttestName := \"openDB: fail due to file at target location\"\n\twantErrCode := database.ErrDriverSpecific\n\tidb, err := openDB(dbPath, blockDataNet, true)\n\tif !checkDbError(t, testName, err, wantErrCode) {\n\t\tif err == nil {\n\t\t\tidb.Close()\n\t\t}\n\t\t_ = os.RemoveAll(dbPath)\n\t\treturn\n\t}\n\n\t// Remove the file and create the database to run tests against.  It\n\t// should be successful this time.\n\t_ = os.RemoveAll(dbPath)\n\tidb, err = openDB(dbPath, blockDataNet, true)\n\tif err != nil {\n\t\tt.Errorf(\"openDB: unexpected error: %v\", err)\n\t\treturn\n\t}\n\tdefer os.RemoveAll(dbPath)\n\tdefer idb.Close()\n\n\t// Ensure attempting to write to a file that can't be created returns\n\t// the expected error.\n\ttestName = \"writeBlock: open file failure\"\n\tfilePath := blockFilePath(dbPath, 0)\n\tif err := os.Mkdir(filePath, 0755); err != nil {\n\t\tt.Errorf(\"os.Mkdir: unexpected error: %v\", err)\n\t\treturn\n\t}\n\tstore := idb.(*db).store\n\t_, err = store.writeBlock([]byte{0x00})\n\tif !checkDbError(t, testName, err, database.ErrDriverSpecific) {\n\t\treturn\n\t}\n\t_ = os.RemoveAll(filePath)\n\n\t// Close the underlying leveldb database out from under the database.\n\tldb := idb.(*db).cache.ldb\n\tldb.Close()\n\n\t// Ensure initialization errors in the underlying database work as\n\t// expected.\n\ttestName = \"initDB: reinitialization\"\n\twantErrCode = database.ErrDbNotOpen\n\terr = initDB(ldb)\n\tif !checkDbError(t, testName, err, wantErrCode) {\n\t\treturn\n\t}\n\n\t// Ensure the View handles errors in the underlying leveldb database\n\t// properly.\n\ttestName = \"View: underlying leveldb error\"\n\twantErrCode = database.ErrDbNotOpen\n\terr = idb.View(func(tx database.Tx) error {\n\t\treturn nil\n\t})\n\tif !checkDbError(t, testName, err, wantErrCode) {\n\t\treturn\n\t}\n\n\t// Ensure the Update handles errors in the underlying leveldb database\n\t// properly.\n\ttestName = \"Update: underlying leveldb error\"\n\terr = idb.Update(func(tx database.Tx) error {\n\t\treturn nil\n\t})\n\tif !checkDbError(t, testName, err, wantErrCode) {\n\t\treturn\n\t}\n}\n\n// resetDatabase removes everything from the opened database associated with the\n// test context including all metadata and the mock files.\nfunc resetDatabase(tc *testContext) bool {\n\t// Reset the metadata.\n\terr := tc.db.Update(func(tx database.Tx) error {\n\t\t// Remove all the keys using a cursor while also generating a\n\t\t// list of buckets.  It's not safe to remove keys during ForEach\n\t\t// iteration nor is it safe to remove buckets during cursor\n\t\t// iteration, so this dual approach is needed.\n\t\tvar bucketNames [][]byte\n\t\tcursor := tx.Metadata().Cursor()\n\t\tfor ok := cursor.First(); ok; ok = cursor.Next() {\n\t\t\tif cursor.Value() != nil {\n\t\t\t\tif err := cursor.Delete(); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbucketNames = append(bucketNames, cursor.Key())\n\t\t\t}\n\t\t}\n\n\t\t// Remove the buckets.\n\t\tfor _, k := range bucketNames {\n\t\t\tif err := tx.Metadata().DeleteBucket(k); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t_, err := tx.Metadata().CreateBucket(blockIdxBucketName)\n\t\treturn err\n\t})\n\tif err != nil {\n\t\ttc.t.Errorf(\"Update: unexpected error: %v\", err)\n\t\treturn false\n\t}\n\n\t// Reset the mock files.\n\tstore := tc.db.(*db).store\n\twc := store.writeCursor\n\twc.curFile.Lock()\n\tif wc.curFile.file != nil {\n\t\twc.curFile.file.Close()\n\t\twc.curFile.file = nil\n\t}\n\twc.curFile.Unlock()\n\twc.Lock()\n\twc.curFileNum = 0\n\twc.curOffset = 0\n\twc.Unlock()\n\ttc.files = make(map[uint32]*lockableFile)\n\ttc.maxFileSizes = make(map[uint32]int64)\n\treturn true\n}\n\n// testWriteFailures tests various failures paths when writing to the block\n// files.\nfunc testWriteFailures(tc *testContext) bool {\n\tif !resetDatabase(tc) {\n\t\treturn false\n\t}\n\n\t// Ensure file sync errors during flush return the expected error.\n\tstore := tc.db.(*db).store\n\ttestName := \"flush: file sync failure\"\n\tstore.writeCursor.Lock()\n\toldFile := store.writeCursor.curFile\n\tstore.writeCursor.curFile = &lockableFile{\n\t\tfile: &mockFile{forceSyncErr: true, maxSize: -1},\n\t}\n\tstore.writeCursor.Unlock()\n\terr := tc.db.(*db).cache.flush()\n\tif !checkDbError(tc.t, testName, err, database.ErrDriverSpecific) {\n\t\treturn false\n\t}\n\tstore.writeCursor.Lock()\n\tstore.writeCursor.curFile = oldFile\n\tstore.writeCursor.Unlock()\n\n\t// Force errors in the various error paths when writing data by using\n\t// mock files with a limited max size.\n\tblock0Bytes, _ := tc.blocks[0].Bytes()\n\ttests := []struct {\n\t\tfileNum uint32\n\t\tmaxSize int64\n\t}{\n\t\t// Force an error when writing the network bytes.\n\t\t{fileNum: 0, maxSize: 2},\n\n\t\t// Force an error when writing the block size.\n\t\t{fileNum: 0, maxSize: 6},\n\n\t\t// Force an error when writing the block.\n\t\t{fileNum: 0, maxSize: 17},\n\n\t\t// Force an error when writing the checksum.\n\t\t{fileNum: 0, maxSize: int64(len(block0Bytes)) + 10},\n\n\t\t// Force an error after writing enough blocks for force multiple\n\t\t// files.\n\t\t{fileNum: 15, maxSize: 1},\n\t}\n\n\tfor i, test := range tests {\n\t\tif !resetDatabase(tc) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure storing the specified number of blocks using a mock\n\t\t// file that fails the write fails when the transaction is\n\t\t// committed, not when the block is stored.\n\t\ttc.maxFileSizes = map[uint32]int64{test.fileNum: test.maxSize}\n\t\terr := tc.db.Update(func(tx database.Tx) error {\n\t\t\tfor i, block := range tc.blocks {\n\t\t\t\terr := tx.StoreBlock(block)\n\t\t\t\tif err != nil {\n\t\t\t\t\ttc.t.Errorf(\"StoreBlock (%d): unexpected \"+\n\t\t\t\t\t\t\"error: %v\", i, err)\n\t\t\t\t\treturn errSubTestFail\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nil\n\t\t})\n\t\ttestName := fmt.Sprintf(\"Force update commit failure - test \"+\n\t\t\t\"%d, fileNum %d, maxsize %d\", i, test.fileNum,\n\t\t\ttest.maxSize)\n\t\tif !checkDbError(tc.t, testName, err, database.ErrDriverSpecific) {\n\t\t\ttc.t.Errorf(\"%v\", err)\n\t\t\treturn false\n\t\t}\n\n\t\t// Ensure the commit rollback removed all extra files and data.\n\t\tif len(tc.files) != 1 {\n\t\t\ttc.t.Errorf(\"Update rollback: new not removed - want \"+\n\t\t\t\t\"1 file, got %d\", len(tc.files))\n\t\t\treturn false\n\t\t}\n\t\tif _, ok := tc.files[0]; !ok {\n\t\t\ttc.t.Error(\"Update rollback: file 0 does not exist\")\n\t\t\treturn false\n\t\t}\n\t\tfile := tc.files[0].file.(*mockFile)\n\t\tif len(file.data) != 0 {\n\t\t\ttc.t.Errorf(\"Update rollback: file did not truncate - \"+\n\t\t\t\t\"want len 0, got len %d\", len(file.data))\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// testBlockFileErrors ensures the database returns expected errors with various\n// file-related issues such as closed and missing files.\nfunc testBlockFileErrors(tc *testContext) bool {\n\tif !resetDatabase(tc) {\n\t\treturn false\n\t}\n\n\t// Ensure errors in blockFile and openFile when requesting invalid file\n\t// numbers.\n\tstore := tc.db.(*db).store\n\ttestName := \"blockFile invalid file open\"\n\t_, err := store.blockFile(^uint32(0))\n\tif !checkDbError(tc.t, testName, err, database.ErrDriverSpecific) {\n\t\treturn false\n\t}\n\ttestName = \"openFile invalid file open\"\n\t_, err = store.openFile(^uint32(0))\n\tif !checkDbError(tc.t, testName, err, database.ErrDriverSpecific) {\n\t\treturn false\n\t}\n\n\t// Insert the first block into the mock file.\n\terr = tc.db.Update(func(tx database.Tx) error {\n\t\terr := tx.StoreBlock(tc.blocks[0])\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"StoreBlock: unexpected error: %v\", err)\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"Update: unexpected error: %v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\t// Ensure errors in readBlock and readBlockRegion when requesting a file\n\t// number that doesn't exist.\n\tblock0Hash := tc.blocks[0].Hash()\n\ttestName = \"readBlock invalid file number\"\n\tinvalidLoc := blockLocation{\n\t\tblockFileNum: ^uint32(0),\n\t\tblockLen:     80,\n\t}\n\t_, err = store.readBlock(block0Hash, invalidLoc)\n\tif !checkDbError(tc.t, testName, err, database.ErrDriverSpecific) {\n\t\treturn false\n\t}\n\ttestName = \"readBlockRegion invalid file number\"\n\t_, err = store.readBlockRegion(invalidLoc, 0, 80)\n\tif !checkDbError(tc.t, testName, err, database.ErrDriverSpecific) {\n\t\treturn false\n\t}\n\n\t// Close the block file out from under the database.\n\tstore.writeCursor.curFile.Lock()\n\tstore.writeCursor.curFile.file.Close()\n\tstore.writeCursor.curFile.Unlock()\n\n\t// Ensure failures in FetchBlock and FetchBlockRegion(s) since the\n\t// underlying file they need to read from has been closed.\n\terr = tc.db.View(func(tx database.Tx) error {\n\t\ttestName = \"FetchBlock closed file\"\n\t\twantErrCode := database.ErrDriverSpecific\n\t\t_, err := tx.FetchBlock(block0Hash)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\ttestName = \"FetchBlockRegion closed file\"\n\t\tregions := []database.BlockRegion{\n\t\t\t{\n\t\t\t\tHash:   block0Hash,\n\t\t\t\tLen:    80,\n\t\t\t\tOffset: 0,\n\t\t\t},\n\t\t}\n\t\t_, err = tx.FetchBlockRegion(&regions[0])\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\ttestName = \"FetchBlockRegions closed file\"\n\t\t_, err = tx.FetchBlockRegions(regions)\n\t\tif !checkDbError(tc.t, testName, err, wantErrCode) {\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"View: unexpected error: %v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// testCorruption ensures the database returns expected errors under various\n// corruption scenarios.\nfunc testCorruption(tc *testContext) bool {\n\tif !resetDatabase(tc) {\n\t\treturn false\n\t}\n\n\t// Insert the first block into the mock file.\n\terr := tc.db.Update(func(tx database.Tx) error {\n\t\terr := tx.StoreBlock(tc.blocks[0])\n\t\tif err != nil {\n\t\t\ttc.t.Errorf(\"StoreBlock: unexpected error: %v\", err)\n\t\t\treturn errSubTestFail\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"Update: unexpected error: %v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\t// Ensure corruption is detected by intentionally modifying the bytes\n\t// stored to the mock file and reading the block.\n\tblock0Bytes, _ := tc.blocks[0].Bytes()\n\tblock0Hash := tc.blocks[0].Hash()\n\ttests := []struct {\n\t\toffset      uint32\n\t\tfixChecksum bool\n\t\twantErrCode database.ErrorCode\n\t}{\n\t\t// One of the network bytes.  The checksum needs to be fixed so\n\t\t// the invalid network is detected.\n\t\t{2, true, database.ErrDriverSpecific},\n\n\t\t// The same network byte, but this time don't fix the checksum\n\t\t// to ensure the corruption is detected.\n\t\t{2, false, database.ErrCorruption},\n\n\t\t// One of the block length bytes.\n\t\t{6, false, database.ErrCorruption},\n\n\t\t// Random header byte.\n\t\t{17, false, database.ErrCorruption},\n\n\t\t// Random transaction byte.\n\t\t{90, false, database.ErrCorruption},\n\n\t\t// Random checksum byte.\n\t\t{uint32(len(block0Bytes)) + 10, false, database.ErrCorruption},\n\t}\n\terr = tc.db.View(func(tx database.Tx) error {\n\t\tdata := tc.files[0].file.(*mockFile).data\n\t\tfor i, test := range tests {\n\t\t\t// Corrupt the byte at the offset by a single bit.\n\t\t\tdata[test.offset] ^= 0x10\n\n\t\t\t// Fix the checksum if requested to force other errors.\n\t\t\tfileLen := len(data)\n\t\t\tvar oldChecksumBytes [4]byte\n\t\t\tcopy(oldChecksumBytes[:], data[fileLen-4:])\n\t\t\tif test.fixChecksum {\n\t\t\t\ttoSum := data[:fileLen-4]\n\t\t\t\tcksum := crc32.Checksum(toSum, castagnoli)\n\t\t\t\tbinary.BigEndian.PutUint32(data[fileLen-4:], cksum)\n\t\t\t}\n\n\t\t\ttestName := fmt.Sprintf(\"FetchBlock (test #%d): \"+\n\t\t\t\t\"corruption\", i)\n\t\t\t_, err := tx.FetchBlock(block0Hash)\n\t\t\tif !checkDbError(tc.t, testName, err, test.wantErrCode) {\n\t\t\t\treturn errSubTestFail\n\t\t\t}\n\n\t\t\t// Reset the corrupted data back to the original.\n\t\t\tdata[test.offset] ^= 0x10\n\t\t\tif test.fixChecksum {\n\t\t\t\tcopy(data[fileLen-4:], oldChecksumBytes[:])\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tif err != errSubTestFail {\n\t\t\ttc.t.Errorf(\"View: unexpected error: %v\", err)\n\t\t}\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// TestFailureScenarios ensures several failure scenarios such as database\n// corruption, block file write failures, and rollback failures are handled\n// correctly.\nfunc TestFailureScenarios(t *testing.T) {\n\t// Create a new database to run tests against.\n\tdbPath := filepath.Join(t.TempDir(), \"ffldb-failurescenarios\")\n\t_ = os.RemoveAll(dbPath)\n\tidb, err := database.Create(dbType, dbPath, blockDataNet)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to create test database (%s) %v\", dbType, err)\n\t\treturn\n\t}\n\tdefer idb.Close()\n\n\t// Create a test context to pass around.\n\ttc := &testContext{\n\t\tt:            t,\n\t\tdb:           idb,\n\t\tfiles:        make(map[uint32]*lockableFile),\n\t\tmaxFileSizes: make(map[uint32]int64),\n\t}\n\n\t// Change the maximum file size to a small value to force multiple flat\n\t// files with the test data set and replace the file-related functions\n\t// to make use of mock files in memory.  This allows injection of\n\t// various file-related errors.\n\tstore := idb.(*db).store\n\tstore.maxBlockFileSize = 1024 // 1KiB\n\tstore.openWriteFileFunc = func(fileNum uint32) (filer, error) {\n\t\tif file, ok := tc.files[fileNum]; ok {\n\t\t\t// \"Reopen\" the file.\n\t\t\tfile.Lock()\n\t\t\tmock := file.file.(*mockFile)\n\t\t\tmock.Lock()\n\t\t\tmock.closed = false\n\t\t\tmock.Unlock()\n\t\t\tfile.Unlock()\n\t\t\treturn mock, nil\n\t\t}\n\n\t\t// Limit the max size of the mock file as specified in the test\n\t\t// context.\n\t\tmaxSize := int64(-1)\n\t\tif maxFileSize, ok := tc.maxFileSizes[fileNum]; ok {\n\t\t\tmaxSize = maxFileSize\n\t\t}\n\t\tfile := &mockFile{maxSize: maxSize}\n\t\ttc.files[fileNum] = &lockableFile{file: file}\n\t\treturn file, nil\n\t}\n\tstore.openFileFunc = func(fileNum uint32) (*lockableFile, error) {\n\t\t// Force error when trying to open max file num.\n\t\tif fileNum == ^uint32(0) {\n\t\t\treturn nil, makeDbErr(database.ErrDriverSpecific,\n\t\t\t\t\"test\", nil)\n\t\t}\n\t\tif file, ok := tc.files[fileNum]; ok {\n\t\t\t// \"Reopen\" the file.\n\t\t\tfile.Lock()\n\t\t\tmock := file.file.(*mockFile)\n\t\t\tmock.Lock()\n\t\t\tmock.closed = false\n\t\t\tmock.Unlock()\n\t\t\tfile.Unlock()\n\t\t\treturn file, nil\n\t\t}\n\t\tfile := &lockableFile{file: &mockFile{}}\n\t\ttc.files[fileNum] = file\n\t\treturn file, nil\n\t}\n\tstore.deleteFileFunc = func(fileNum uint32) error {\n\t\tif file, ok := tc.files[fileNum]; ok {\n\t\t\tfile.Lock()\n\t\t\tfile.file.Close()\n\t\t\tfile.Unlock()\n\t\t\tdelete(tc.files, fileNum)\n\t\t\treturn nil\n\t\t}\n\n\t\tstr := fmt.Sprintf(\"file %d does not exist\", fileNum)\n\t\treturn makeDbErr(database.ErrDriverSpecific, str, nil)\n\t}\n\n\t// Load the test blocks and save in the test context for use throughout\n\t// the tests.\n\tblocks, err := loadBlocks(t, blockDataFile, blockDataNet)\n\tif err != nil {\n\t\tt.Errorf(\"loadBlocks: Unexpected error: %v\", err)\n\t\treturn\n\t}\n\ttc.blocks = blocks\n\n\t// Test various failures paths when writing to the block files.\n\tif !testWriteFailures(tc) {\n\t\treturn\n\t}\n\n\t// Test various file-related issues such as closed and missing files.\n\tif !testBlockFileErrors(tc) {\n\t\treturn\n\t}\n\n\t// Test various corruption scenarios.\n\ttestCorruption(tc)\n}\n"
  },
  {
    "path": "database/interface.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// Parts of this interface were inspired heavily by the excellent boltdb project\n// at https://github.com/boltdb/bolt by Ben B. Johnson.\n\npackage database\n\nimport (\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// Cursor represents a cursor over key/value pairs and nested buckets of a\n// bucket.\n//\n// Note that open cursors are not tracked on bucket changes and any\n// modifications to the bucket, with the exception of Cursor.Delete, invalidates\n// the cursor.  After invalidation, the cursor must be repositioned, or the keys\n// and values returned may be unpredictable.\ntype Cursor interface {\n\t// Bucket returns the bucket the cursor was created for.\n\tBucket() Bucket\n\n\t// Delete removes the current key/value pair the cursor is at without\n\t// invalidating the cursor.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrIncompatibleValue if attempted when the cursor points to a\n\t//     nested bucket\n\t//   - ErrTxNotWritable if attempted against a read-only transaction\n\t//   - ErrTxClosed if the transaction has already been closed\n\tDelete() error\n\n\t// First positions the cursor at the first key/value pair and returns\n\t// whether or not the pair exists.\n\tFirst() bool\n\n\t// Last positions the cursor at the last key/value pair and returns\n\t// whether or not the pair exists.\n\tLast() bool\n\n\t// Next moves the cursor one key/value pair forward and returns whether\n\t// or not the pair exists.\n\tNext() bool\n\n\t// Prev moves the cursor one key/value pair backward and returns whether\n\t// or not the pair exists.\n\tPrev() bool\n\n\t// Seek positions the cursor at the first key/value pair that is greater\n\t// than or equal to the passed seek key.  Returns whether or not the\n\t// pair exists.\n\tSeek(seek []byte) bool\n\n\t// Key returns the current key the cursor is pointing to.\n\tKey() []byte\n\n\t// Value returns the current value the cursor is pointing to.  This will\n\t// be nil for nested buckets.\n\tValue() []byte\n}\n\n// Bucket represents a collection of key/value pairs.\ntype Bucket interface {\n\t// Bucket retrieves a nested bucket with the given key.  Returns nil if\n\t// the bucket does not exist.\n\tBucket(key []byte) Bucket\n\n\t// CreateBucket creates and returns a new nested bucket with the given\n\t// key.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrBucketExists if the bucket already exists\n\t//   - ErrBucketNameRequired if the key is empty\n\t//   - ErrIncompatibleValue if the key is otherwise invalid for the\n\t//     particular implementation\n\t//   - ErrTxNotWritable if attempted against a read-only transaction\n\t//   - ErrTxClosed if the transaction has already been closed\n\tCreateBucket(key []byte) (Bucket, error)\n\n\t// CreateBucketIfNotExists creates and returns a new nested bucket with\n\t// the given key if it does not already exist.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrBucketNameRequired if the key is empty\n\t//   - ErrIncompatibleValue if the key is otherwise invalid for the\n\t//     particular implementation\n\t//   - ErrTxNotWritable if attempted against a read-only transaction\n\t//   - ErrTxClosed if the transaction has already been closed\n\tCreateBucketIfNotExists(key []byte) (Bucket, error)\n\n\t// DeleteBucket removes a nested bucket with the given key.  This also\n\t// includes removing all nested buckets and keys under the bucket being\n\t// deleted.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrBucketNotFound if the specified bucket does not exist\n\t//   - ErrTxNotWritable if attempted against a read-only transaction\n\t//   - ErrTxClosed if the transaction has already been closed\n\tDeleteBucket(key []byte) error\n\n\t// ForEach invokes the passed function with every key/value pair in the\n\t// bucket.  This does not include nested buckets or the key/value pairs\n\t// within those nested buckets.\n\t//\n\t// WARNING: It is not safe to mutate data while iterating with this\n\t// method.  Doing so may cause the underlying cursor to be invalidated\n\t// and return unexpected keys and/or values.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//\n\t// NOTE: The slices returned by this function are only valid during a\n\t// transaction.  Attempting to access them after a transaction has ended\n\t// results in undefined behavior.  Additionally, the slices must NOT\n\t// be modified by the caller.  These constraints prevent additional data\n\t// copies and allows support for memory-mapped database implementations.\n\tForEach(func(k, v []byte) error) error\n\n\t// ForEachBucket invokes the passed function with the key of every\n\t// nested bucket in the current bucket.  This does not include any\n\t// nested buckets within those nested buckets.\n\t//\n\t// WARNING: It is not safe to mutate data while iterating with this\n\t// method.  Doing so may cause the underlying cursor to be invalidated\n\t// and return unexpected keys and/or values.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//\n\t// NOTE: The keys returned by this function are only valid during a\n\t// transaction.  Attempting to access them after a transaction has ended\n\t// results in undefined behavior.  This constraint prevents additional\n\t// data copies and allows support for memory-mapped database\n\t// implementations.\n\tForEachBucket(func(k []byte) error) error\n\n\t// Cursor returns a new cursor, allowing for iteration over the bucket's\n\t// key/value pairs and nested buckets in forward or backward order.\n\t//\n\t// You must seek to a position using the First, Last, or Seek functions\n\t// before calling the Next, Prev, Key, or Value functions.  Failure to\n\t// do so will result in the same return values as an exhausted cursor,\n\t// which is false for the Prev and Next functions and nil for Key and\n\t// Value functions.\n\tCursor() Cursor\n\n\t// Writable returns whether or not the bucket is writable.\n\tWritable() bool\n\n\t// Put saves the specified key/value pair to the bucket.  Keys that do\n\t// not already exist are added and keys that already exist are\n\t// overwritten.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrKeyRequired if the key is empty\n\t//   - ErrIncompatibleValue if the key is the same as an existing bucket\n\t//   - ErrTxNotWritable if attempted against a read-only transaction\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//\n\t// NOTE: The slices passed to this function must NOT be modified by the\n\t// caller.  This constraint prevents the requirement for additional data\n\t// copies and allows support for memory-mapped database implementations.\n\tPut(key, value []byte) error\n\n\t// Get returns the value for the given key.  Returns nil if the key does\n\t// not exist in this bucket.  An empty slice is returned for keys that\n\t// exist but have no value assigned.\n\t//\n\t// NOTE: The value returned by this function is only valid during a\n\t// transaction.  Attempting to access it after a transaction has ended\n\t// results in undefined behavior.  Additionally, the value must NOT\n\t// be modified by the caller.  These constraints prevent additional data\n\t// copies and allows support for memory-mapped database implementations.\n\tGet(key []byte) []byte\n\n\t// Delete removes the specified key from the bucket.  Deleting a key\n\t// that does not exist does not return an error.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrKeyRequired if the key is empty\n\t//   - ErrIncompatibleValue if the key is the same as an existing bucket\n\t//   - ErrTxNotWritable if attempted against a read-only transaction\n\t//   - ErrTxClosed if the transaction has already been closed\n\tDelete(key []byte) error\n}\n\n// BlockRegion specifies a particular region of a block identified by the\n// specified hash, given an offset and length.\ntype BlockRegion struct {\n\tHash   *chainhash.Hash\n\tOffset uint32\n\tLen    uint32\n}\n\n// Tx represents a database transaction.  It can either by read-only or\n// read-write.  The transaction provides a metadata bucket against which all\n// read and writes occur.\n//\n// As would be expected with a transaction, no changes will be saved to the\n// database until it has been committed.  The transaction will only provide a\n// view of the database at the time it was created.  Transactions should not be\n// long running operations.\ntype Tx interface {\n\t// Metadata returns the top-most bucket for all metadata storage.\n\tMetadata() Bucket\n\n\t// StoreBlock stores the provided block into the database.  There are no\n\t// checks to ensure the block connects to a previous block, contains\n\t// double spends, or any additional functionality such as transaction\n\t// indexing.  It simply stores the block in the database.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrBlockExists when the block hash already exists\n\t//   - ErrTxNotWritable if attempted against a read-only transaction\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//\n\t// Other errors are possible depending on the implementation.\n\tStoreBlock(block *btcutil.Block) error\n\n\t// HasBlock returns whether or not a block with the given hash exists\n\t// in the database.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//\n\t// Other errors are possible depending on the implementation.\n\tHasBlock(hash *chainhash.Hash) (bool, error)\n\n\t// HasBlocks returns whether or not the blocks with the provided hashes\n\t// exist in the database.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//\n\t// Other errors are possible depending on the implementation.\n\tHasBlocks(hashes []chainhash.Hash) ([]bool, error)\n\n\t// FetchBlockHeader returns the raw serialized bytes for the block\n\t// header identified by the given hash.  The raw bytes are in the format\n\t// returned by Serialize on a wire.BlockHeader.\n\t//\n\t// It is highly recommended to use this function (or FetchBlockHeaders)\n\t// to obtain block headers over the FetchBlockRegion(s) functions since\n\t// it provides the backend drivers the freedom to perform very specific\n\t// optimizations which can result in significant speed advantages when\n\t// working with headers.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrBlockNotFound if the requested block hash does not exist\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//   - ErrCorruption if the database has somehow become corrupted\n\t//\n\t// NOTE: The data returned by this function is only valid during a\n\t// database transaction.  Attempting to access it after a transaction\n\t// has ended results in undefined behavior.  This constraint prevents\n\t// additional data copies and allows support for memory-mapped database\n\t// implementations.\n\tFetchBlockHeader(hash *chainhash.Hash) ([]byte, error)\n\n\t// FetchBlockHeaders returns the raw serialized bytes for the block\n\t// headers identified by the given hashes.  The raw bytes are in the\n\t// format returned by Serialize on a wire.BlockHeader.\n\t//\n\t// It is highly recommended to use this function (or FetchBlockHeader)\n\t// to obtain block headers over the FetchBlockRegion(s) functions since\n\t// it provides the backend drivers the freedom to perform very specific\n\t// optimizations which can result in significant speed advantages when\n\t// working with headers.\n\t//\n\t// Furthermore, depending on the specific implementation, this function\n\t// can be more efficient for bulk loading multiple block headers than\n\t// loading them one-by-one with FetchBlockHeader.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrBlockNotFound if any of the request block hashes do not exist\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//   - ErrCorruption if the database has somehow become corrupted\n\t//\n\t// NOTE: The data returned by this function is only valid during a\n\t// database transaction.  Attempting to access it after a transaction\n\t// has ended results in undefined behavior.  This constraint prevents\n\t// additional data copies and allows support for memory-mapped database\n\t// implementations.\n\tFetchBlockHeaders(hashes []chainhash.Hash) ([][]byte, error)\n\n\t// FetchBlock returns the raw serialized bytes for the block identified\n\t// by the given hash.  The raw bytes are in the format returned by\n\t// Serialize on a wire.MsgBlock.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrBlockNotFound if the requested block hash does not exist\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//   - ErrCorruption if the database has somehow become corrupted\n\t//\n\t// NOTE: The data returned by this function is only valid during a\n\t// database transaction.  Attempting to access it after a transaction\n\t// has ended results in undefined behavior.  This constraint prevents\n\t// additional data copies and allows support for memory-mapped database\n\t// implementations.\n\tFetchBlock(hash *chainhash.Hash) ([]byte, error)\n\n\t// FetchBlocks returns the raw serialized bytes for the blocks\n\t// identified by the given hashes.  The raw bytes are in the format\n\t// returned by Serialize on a wire.MsgBlock.\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrBlockNotFound if the any of the requested block hashes do not\n\t//     exist\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//   - ErrCorruption if the database has somehow become corrupted\n\t//\n\t// NOTE: The data returned by this function is only valid during a\n\t// database transaction.  Attempting to access it after a transaction\n\t// has ended results in undefined behavior.  This constraint prevents\n\t// additional data copies and allows support for memory-mapped database\n\t// implementations.\n\tFetchBlocks(hashes []chainhash.Hash) ([][]byte, error)\n\n\t// FetchBlockRegion returns the raw serialized bytes for the given\n\t// block region.\n\t//\n\t// For example, it is possible to directly extract Bitcoin transactions\n\t// and/or scripts from a block with this function.  Depending on the\n\t// backend implementation, this can provide significant savings by\n\t// avoiding the need to load entire blocks.\n\t//\n\t// The raw bytes are in the format returned by Serialize on a\n\t// wire.MsgBlock and the Offset field in the provided BlockRegion is\n\t// zero-based and relative to the start of the block (byte 0).\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrBlockNotFound if the requested block hash does not exist\n\t//   - ErrBlockRegionInvalid if the region exceeds the bounds of the\n\t//     associated block\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//   - ErrCorruption if the database has somehow become corrupted\n\t//\n\t// NOTE: The data returned by this function is only valid during a\n\t// database transaction.  Attempting to access it after a transaction\n\t// has ended results in undefined behavior.  This constraint prevents\n\t// additional data copies and allows support for memory-mapped database\n\t// implementations.\n\tFetchBlockRegion(region *BlockRegion) ([]byte, error)\n\n\t// FetchBlockRegions returns the raw serialized bytes for the given\n\t// block regions.\n\t//\n\t// For example, it is possible to directly extract Bitcoin transactions\n\t// and/or scripts from various blocks with this function.  Depending on\n\t// the backend implementation, this can provide significant savings by\n\t// avoiding the need to load entire blocks.\n\t//\n\t// The raw bytes are in the format returned by Serialize on a\n\t// wire.MsgBlock and the Offset fields in the provided BlockRegions are\n\t// zero-based and relative to the start of the block (byte 0).\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrBlockNotFound if any of the requested block hashed do not\n\t//     exist\n\t//   - ErrBlockRegionInvalid if one or more region exceed the bounds of\n\t//     the associated block\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//   - ErrCorruption if the database has somehow become corrupted\n\t//\n\t// NOTE: The data returned by this function is only valid during a\n\t// database transaction.  Attempting to access it after a transaction\n\t// has ended results in undefined behavior.  This constraint prevents\n\t// additional data copies and allows support for memory-mapped database\n\t// implementations.\n\tFetchBlockRegions(regions []BlockRegion) ([][]byte, error)\n\n\t// PruneBlocks deletes the block files until it reaches the target size\n\t// (specified in bytes).\n\t//\n\t// The interface contract guarantees at least the following errors will\n\t// be returned (other implementation-specific errors are possible):\n\t//   - ErrTxNotWritable if attempted against a read-only transaction\n\t//   - ErrTxClosed if the transaction has already been closed\n\t//\n\t// NOTE: The data returned by this function is only valid during a\n\t// database transaction.  Attempting to access it after a transaction\n\t// has ended results in undefined behavior.  This constraint prevents\n\t// additional data copies and allows support for memory-mapped database\n\t// implementations.\n\tPruneBlocks(targetSize uint64) ([]chainhash.Hash, error)\n\n\t// BeenPruned returns if the block storage has ever been pruned.\n\t//\n\t// Implementation specific errors are possible.\n\tBeenPruned() (bool, error)\n\n\t// ******************************************************************\n\t// Methods related to both atomic metadata storage and block storage.\n\t// ******************************************************************\n\n\t// Commit commits all changes that have been made to the metadata or\n\t// block storage.  Depending on the backend implementation this could be\n\t// to a cache that is periodically synced to persistent storage or\n\t// directly to persistent storage.  In any case, all transactions which\n\t// are started after the commit finishes will include all changes made\n\t// by this transaction.  Calling this function on a managed transaction\n\t// will result in a panic.\n\tCommit() error\n\n\t// Rollback undoes all changes that have been made to the metadata or\n\t// block storage.  Calling this function on a managed transaction will\n\t// result in a panic.\n\tRollback() error\n}\n\n// DB provides a generic interface that is used to store bitcoin blocks and\n// related metadata.  This interface is intended to be agnostic to the actual\n// mechanism used for backend data storage.  The RegisterDriver function can be\n// used to add a new backend data storage method.\n//\n// This interface is divided into two distinct categories of functionality.\n//\n// The first category is atomic metadata storage with bucket support.  This is\n// accomplished through the use of database transactions.\n//\n// The second category is generic block storage.  This functionality is\n// intentionally separate because the mechanism used for block storage may or\n// may not be the same mechanism used for metadata storage.  For example, it is\n// often more efficient to store the block data as flat files while the metadata\n// is kept in a database.  However, this interface aims to be generic enough to\n// support blocks in the database too, if needed by a particular backend.\ntype DB interface {\n\t// Type returns the database driver type the current database instance\n\t// was created with.\n\tType() string\n\n\t// Begin starts a transaction which is either read-only or read-write\n\t// depending on the specified flag.  Multiple read-only transactions\n\t// can be started simultaneously while only a single read-write\n\t// transaction can be started at a time.  The call will block when\n\t// starting a read-write transaction when one is already open.\n\t//\n\t// NOTE: The transaction must be closed by calling Rollback or Commit on\n\t// it when it is no longer needed.  Failure to do so can result in\n\t// unclaimed memory and/or inablity to close the database due to locks\n\t// depending on the specific database implementation.\n\tBegin(writable bool) (Tx, error)\n\n\t// View invokes the passed function in the context of a managed\n\t// read-only transaction.  Any errors returned from the user-supplied\n\t// function are returned from this function.\n\t//\n\t// Calling Rollback or Commit on the transaction passed to the\n\t// user-supplied function will result in a panic.\n\tView(fn func(tx Tx) error) error\n\n\t// Update invokes the passed function in the context of a managed\n\t// read-write transaction.  Any errors returned from the user-supplied\n\t// function will cause the transaction to be rolled back and are\n\t// returned from this function.  Otherwise, the transaction is committed\n\t// when the user-supplied function returns a nil error.\n\t//\n\t// Calling Rollback or Commit on the transaction passed to the\n\t// user-supplied function will result in a panic.\n\tUpdate(fn func(tx Tx) error) error\n\n\t// Close cleanly shuts down the database and syncs all data.  It will\n\t// block until all database transactions have been finalized (rolled\n\t// back or committed).\n\tClose() error\n}\n"
  },
  {
    "path": "database/internal/treap/README.md",
    "content": "treap\n=====\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://pkg.go.dev/github.com/btcsuite/btcd/database/internal/treap?status.png)](https://pkg.go.dev/github.com/btcsuite/btcd/database/internal/treap)\n\nPackage treap implements a treap data structure that is used to hold ordered\nkey/value pairs using a combination of binary search tree and heap semantics.\nIt is a self-organizing and randomized data structure that doesn't require\ncomplex operations to maintain balance.  Search, insert, and delete\noperations are all O(log n).  Both mutable and immutable variants are provided.\n\nThe mutable variant is typically faster since it is able to simply update the\ntreap when modifications are made.  However, a mutable treap is not safe for\nconcurrent access without careful use of locking by the caller and care must be\ntaken when iterating since it can change out from under the iterator.\n\nThe immutable variant works by creating a new version of the treap for all\nmutations by replacing modified nodes with new nodes that have updated values\nwhile sharing all unmodified nodes with the previous version.  This is extremely\nuseful in concurrent applications since the caller only has to atomically\nreplace the treap pointer with the newly returned version after performing any\nmutations.  All readers can simply use their existing pointer as a snapshot\nsince the treap it points to is immutable.  This effectively provides O(1)\nsnapshot capability with efficient memory usage characteristics since the old\nnodes only remain allocated until there are no longer any references to them.\n\nPackage treap is licensed under the copyfree ISC license.\n\n## Usage\n\nThis package is only used internally in the database code and as such is not\navailable for use outside of it.\n\n## License\n\nPackage treap is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "database/internal/treap/common.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage treap\n\nimport (\n\t\"math/rand\"\n\t\"time\"\n)\n\nconst (\n\t// staticDepth is the size of the static array to use for keeping track\n\t// of the parent stack during treap iteration.  Since a treap has a very\n\t// high probability that the tree height is logarithmic, it is\n\t// exceedingly unlikely that the parent stack will ever exceed this size\n\t// even for extremely large numbers of items.\n\tstaticDepth = 128\n\n\t// nodeFieldsSize is the size the fields of each node takes excluding\n\t// the contents of the key and value.  It assumes 64-bit pointers so\n\t// technically it is smaller on 32-bit platforms, but overestimating the\n\t// size in that case is acceptable since it avoids the need to import\n\t// unsafe.  It consists of 24-bytes for each key and value + 8 bytes for\n\t// each of the priority, left, and right fields (24*2 + 8*3).\n\tnodeFieldsSize = 72\n)\n\nvar (\n\t// emptySlice is used for keys that have no value associated with them\n\t// so callers can distinguish between a key that does not exist and one\n\t// that has no value associated with it.\n\temptySlice = make([]byte, 0)\n)\n\n// treapNode represents a node in the treap.\ntype treapNode struct {\n\tkey      []byte\n\tvalue    []byte\n\tpriority int\n\tleft     *treapNode\n\tright    *treapNode\n}\n\n// nodeSize returns the number of bytes the specified node occupies including\n// the struct fields and the contents of the key and value.\nfunc nodeSize(node *treapNode) uint64 {\n\treturn nodeFieldsSize + uint64(len(node.key)+len(node.value))\n}\n\n// newTreapNode returns a new node from the given key, value, and priority.  The\n// node is not initially linked to any others.\nfunc newTreapNode(key, value []byte, priority int) *treapNode {\n\treturn &treapNode{key: key, value: value, priority: priority}\n}\n\n// parentStack represents a stack of parent treap nodes that are used during\n// iteration.  It consists of a static array for holding the parents and a\n// dynamic overflow slice.  It is extremely unlikely the overflow will ever be\n// hit during normal operation, however, since a treap's height is\n// probabilistic, the overflow case needs to be handled properly.  This approach\n// is used because it is much more efficient for the majority case than\n// dynamically allocating heap space every time the treap is iterated.\ntype parentStack struct {\n\tindex    int\n\titems    [staticDepth]*treapNode\n\toverflow []*treapNode\n}\n\n// Len returns the current number of items in the stack.\nfunc (s *parentStack) Len() int {\n\treturn s.index\n}\n\n// At returns the item n number of items from the top of the stack, where 0 is\n// the topmost item, without removing it.  It returns nil if n exceeds the\n// number of items on the stack.\nfunc (s *parentStack) At(n int) *treapNode {\n\tindex := s.index - n - 1\n\tif index < 0 {\n\t\treturn nil\n\t}\n\n\tif index < staticDepth {\n\t\treturn s.items[index]\n\t}\n\n\treturn s.overflow[index-staticDepth]\n}\n\n// Pop removes the top item from the stack.  It returns nil if the stack is\n// empty.\nfunc (s *parentStack) Pop() *treapNode {\n\tif s.index == 0 {\n\t\treturn nil\n\t}\n\n\ts.index--\n\tif s.index < staticDepth {\n\t\tnode := s.items[s.index]\n\t\ts.items[s.index] = nil\n\t\treturn node\n\t}\n\n\tnode := s.overflow[s.index-staticDepth]\n\ts.overflow[s.index-staticDepth] = nil\n\treturn node\n}\n\n// Push pushes the passed item onto the top of the stack.\nfunc (s *parentStack) Push(node *treapNode) {\n\tif s.index < staticDepth {\n\t\ts.items[s.index] = node\n\t\ts.index++\n\t\treturn\n\t}\n\n\t// This approach is used over append because reslicing the slice to pop\n\t// the item causes the compiler to make unneeded allocations.  Also,\n\t// since the max number of items is related to the tree depth which\n\t// requires expontentially more items to increase, only increase the cap\n\t// one item at a time.  This is more intelligent than the generic append\n\t// expansion algorithm which often doubles the cap.\n\tindex := s.index - staticDepth\n\tif index+1 > cap(s.overflow) {\n\t\toverflow := make([]*treapNode, index+1)\n\t\tcopy(overflow, s.overflow)\n\t\ts.overflow = overflow\n\t}\n\ts.overflow[index] = node\n\ts.index++\n}\n\nfunc init() {\n\trand.Seed(time.Now().UnixNano())\n}\n"
  },
  {
    "path": "database/internal/treap/common_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage treap\n\nimport (\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"math/rand\"\n\t\"reflect\"\n\t\"testing\"\n)\n\n// fromHex converts the passed hex string into a byte slice and will panic if\n// there is an error.  This is only provided for the hard-coded constants so\n// errors in the source code can be detected. It will only (and must only) be\n// called for initialization purposes.\nfunc fromHex(s string) []byte {\n\tr, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn r\n}\n\n// serializeUint32 returns the big-endian encoding of the passed uint32.\nfunc serializeUint32(ui uint32) []byte {\n\tvar ret [4]byte\n\tbinary.BigEndian.PutUint32(ret[:], ui)\n\treturn ret[:]\n}\n\n// TestParentStack ensures the treapParentStack functionality works as intended.\nfunc TestParentStack(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tnumNodes int\n\t}{\n\t\t{numNodes: 1},\n\t\t{numNodes: staticDepth},\n\t\t{numNodes: staticDepth + 1}, // Test dynamic code paths\n\t}\n\ntestLoop:\n\tfor i, test := range tests {\n\t\tnodes := make([]*treapNode, 0, test.numNodes)\n\t\tfor j := 0; j < test.numNodes; j++ {\n\t\t\tvar key [4]byte\n\t\t\tbinary.BigEndian.PutUint32(key[:], uint32(j))\n\t\t\tnode := newTreapNode(key[:], key[:], 0)\n\t\t\tnodes = append(nodes, node)\n\t\t}\n\n\t\t// Push all of the nodes onto the parent stack while testing\n\t\t// various stack properties.\n\t\tstack := &parentStack{}\n\t\tfor j, node := range nodes {\n\t\t\tstack.Push(node)\n\n\t\t\t// Ensure the stack length is the expected value.\n\t\t\tif stack.Len() != j+1 {\n\t\t\t\tt.Errorf(\"Len #%d (%d): unexpected stack \"+\n\t\t\t\t\t\"length - got %d, want %d\", i, j,\n\t\t\t\t\tstack.Len(), j+1)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\n\t\t\t// Ensure the node at each index is the expected one.\n\t\t\tfor k := 0; k <= j; k++ {\n\t\t\t\tatNode := stack.At(j - k)\n\t\t\t\tif !reflect.DeepEqual(atNode, nodes[k]) {\n\t\t\t\t\tt.Errorf(\"At #%d (%d): mismatched node \"+\n\t\t\t\t\t\t\"- got %v, want %v\", i, j-k,\n\t\t\t\t\t\tatNode, nodes[k])\n\t\t\t\t\tcontinue testLoop\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Ensure each popped node is the expected one.\n\t\tfor j := 0; j < len(nodes); j++ {\n\t\t\tnode := stack.Pop()\n\t\t\texpected := nodes[len(nodes)-j-1]\n\t\t\tif !reflect.DeepEqual(node, expected) {\n\t\t\t\tt.Errorf(\"At #%d (%d): mismatched node - \"+\n\t\t\t\t\t\"got %v, want %v\", i, j, node, expected)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the stack is now empty.\n\t\tif stack.Len() != 0 {\n\t\t\tt.Errorf(\"Len #%d: stack is not empty - got %d\", i,\n\t\t\t\tstack.Len())\n\t\t\tcontinue testLoop\n\t\t}\n\n\t\t// Ensure attempting to retrieve a node at an index beyond the\n\t\t// stack's length returns nil.\n\t\tif node := stack.At(2); node != nil {\n\t\t\tt.Errorf(\"At #%d: did not give back nil - got %v\", i,\n\t\t\t\tnode)\n\t\t\tcontinue testLoop\n\t\t}\n\n\t\t// Ensure attempting to pop a node from an empty stack returns\n\t\t// nil.\n\t\tif node := stack.Pop(); node != nil {\n\t\t\tt.Errorf(\"Pop #%d: did not give back nil - got %v\", i,\n\t\t\t\tnode)\n\t\t\tcontinue testLoop\n\t\t}\n\t}\n}\n\nfunc init() {\n\t// Force the same pseudo random numbers for each test run.\n\trand.Seed(0)\n}\n"
  },
  {
    "path": "database/internal/treap/doc.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage treap implements a treap data structure that is used to hold ordered\nkey/value pairs using a combination of binary search tree and heap semantics.\nIt is a self-organizing and randomized data structure that doesn't require\ncomplex operations to to maintain balance.  Search, insert, and delete\noperations are all O(log n).  Both mutable and immutable variants are provided.\n\nThe mutable variant is typically faster since it is able to simply update the\ntreap when modifications are made.  However, a mutable treap is not safe for\nconcurrent access without careful use of locking by the caller and care must be\ntaken when iterating since it can change out from under the iterator.\n\nThe immutable variant works by creating a new version of the treap for all\nmutations by replacing modified nodes with new nodes that have updated values\nwhile sharing all unmodified nodes with the previous version.  This is extremely\nuseful in concurrent applications since the caller only has to atomically\nreplace the treap pointer with the newly returned version after performing any\nmutations.  All readers can simply use their existing pointer as a snapshot\nsince the treap it points to is immutable.  This effectively provides O(1)\nsnapshot capability with efficient memory usage characteristics since the old\nnodes only remain allocated until there are no longer any references to them.\n*/\npackage treap\n"
  },
  {
    "path": "database/internal/treap/immutable.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage treap\n\nimport (\n\t\"bytes\"\n\t\"math/rand\"\n)\n\n// cloneTreapNode returns a shallow copy of the passed node.\nfunc cloneTreapNode(node *treapNode) *treapNode {\n\treturn &treapNode{\n\t\tkey:      node.key,\n\t\tvalue:    node.value,\n\t\tpriority: node.priority,\n\t\tleft:     node.left,\n\t\tright:    node.right,\n\t}\n}\n\n// Immutable represents a treap data structure which is used to hold ordered\n// key/value pairs using a combination of binary search tree and heap semantics.\n// It is a self-organizing and randomized data structure that doesn't require\n// complex operations to maintain balance.  Search, insert, and delete\n// operations are all O(log n).  In addition, it provides O(1) snapshots for\n// multi-version concurrency control (MVCC).\n//\n// All operations which result in modifying the treap return a new version of\n// the treap with only the modified nodes updated.  All unmodified nodes are\n// shared with the previous version.  This is extremely useful in concurrent\n// applications since the caller only has to atomically replace the treap\n// pointer with the newly returned version after performing any mutations.  All\n// readers can simply use their existing pointer as a snapshot since the treap\n// it points to is immutable.  This effectively provides O(1) snapshot\n// capability with efficient memory usage characteristics since the old nodes\n// only remain allocated until there are no longer any references to them.\ntype Immutable struct {\n\troot  *treapNode\n\tcount int\n\n\t// totalSize is the best estimate of the total size of of all data in\n\t// the treap including the keys, values, and node sizes.\n\ttotalSize uint64\n}\n\n// newImmutable returns a new immutable treap given the passed parameters.\nfunc newImmutable(root *treapNode, count int, totalSize uint64) *Immutable {\n\treturn &Immutable{root: root, count: count, totalSize: totalSize}\n}\n\n// Len returns the number of items stored in the treap.\nfunc (t *Immutable) Len() int {\n\treturn t.count\n}\n\n// Size returns a best estimate of the total number of bytes the treap is\n// consuming including all of the fields used to represent the nodes as well as\n// the size of the keys and values.  Shared values are not detected, so the\n// returned size assumes each value is pointing to different memory.\nfunc (t *Immutable) Size() uint64 {\n\treturn t.totalSize\n}\n\n// get returns the treap node that contains the passed key.  It will return nil\n// when the key does not exist.\nfunc (t *Immutable) get(key []byte) *treapNode {\n\tfor node := t.root; node != nil; {\n\t\t// Traverse left or right depending on the result of the\n\t\t// comparison.\n\t\tcompareResult := bytes.Compare(key, node.key)\n\t\tif compareResult < 0 {\n\t\t\tnode = node.left\n\t\t\tcontinue\n\t\t}\n\t\tif compareResult > 0 {\n\t\t\tnode = node.right\n\t\t\tcontinue\n\t\t}\n\n\t\t// The key exists.\n\t\treturn node\n\t}\n\n\t// A nil node was reached which means the key does not exist.\n\treturn nil\n}\n\n// Has returns whether or not the passed key exists.\nfunc (t *Immutable) Has(key []byte) bool {\n\tif node := t.get(key); node != nil {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Get returns the value for the passed key.  The function will return nil when\n// the key does not exist.\nfunc (t *Immutable) Get(key []byte) []byte {\n\tif node := t.get(key); node != nil {\n\t\treturn node.value\n\t}\n\treturn nil\n}\n\n// Put inserts the passed key/value pair.\nfunc (t *Immutable) Put(key, value []byte) *Immutable {\n\t// Use an empty byte slice for the value when none was provided.  This\n\t// ultimately allows key existence to be determined from the value since\n\t// an empty byte slice is distinguishable from nil.\n\tif value == nil {\n\t\tvalue = emptySlice\n\t}\n\n\t// The node is the root of the tree if there isn't already one.\n\tif t.root == nil {\n\t\troot := newTreapNode(key, value, rand.Int())\n\t\treturn newImmutable(root, 1, nodeSize(root))\n\t}\n\n\t// Find the binary tree insertion point and construct a replaced list of\n\t// parents while doing so.  This is done because this is an immutable\n\t// data structure so regardless of where in the treap the new key/value\n\t// pair ends up, all ancestors up to and including the root need to be\n\t// replaced.\n\t//\n\t// When the key matches an entry already in the treap, replace the node\n\t// with a new one that has the new value set and return.\n\tvar parents parentStack\n\tvar compareResult int\n\tfor node := t.root; node != nil; {\n\t\t// Clone the node and link its parent to it if needed.\n\t\tnodeCopy := cloneTreapNode(node)\n\t\tif oldParent := parents.At(0); oldParent != nil {\n\t\t\tif oldParent.left == node {\n\t\t\t\toldParent.left = nodeCopy\n\t\t\t} else {\n\t\t\t\toldParent.right = nodeCopy\n\t\t\t}\n\t\t}\n\t\tparents.Push(nodeCopy)\n\n\t\t// Traverse left or right depending on the result of comparing\n\t\t// the keys.\n\t\tcompareResult = bytes.Compare(key, node.key)\n\t\tif compareResult < 0 {\n\t\t\tnode = node.left\n\t\t\tcontinue\n\t\t}\n\t\tif compareResult > 0 {\n\t\t\tnode = node.right\n\t\t\tcontinue\n\t\t}\n\n\t\t// The key already exists, so update its value.\n\t\tnodeCopy.value = value\n\n\t\t// Return new immutable treap with the replaced node and\n\t\t// ancestors up to and including the root of the tree.\n\t\tnewRoot := parents.At(parents.Len() - 1)\n\t\tnewTotalSize := t.totalSize - uint64(len(node.value)) +\n\t\t\tuint64(len(value))\n\t\treturn newImmutable(newRoot, t.count, newTotalSize)\n\t}\n\n\t// Link the new node into the binary tree in the correct position.\n\tnode := newTreapNode(key, value, rand.Int())\n\tparent := parents.At(0)\n\tif compareResult < 0 {\n\t\tparent.left = node\n\t} else {\n\t\tparent.right = node\n\t}\n\n\t// Perform any rotations needed to maintain the min-heap and replace\n\t// the ancestors up to and including the tree root.\n\tnewRoot := parents.At(parents.Len() - 1)\n\tfor parents.Len() > 0 {\n\t\t// There is nothing left to do when the node's priority is\n\t\t// greater than or equal to its parent's priority.\n\t\tparent = parents.Pop()\n\t\tif node.priority >= parent.priority {\n\t\t\tbreak\n\t\t}\n\n\t\t// Perform a right rotation if the node is on the left side or\n\t\t// a left rotation if the node is on the right side.\n\t\tif parent.left == node {\n\t\t\tnode.right, parent.left = parent, node.right\n\t\t} else {\n\t\t\tnode.left, parent.right = parent, node.left\n\t\t}\n\n\t\t// Either set the new root of the tree when there is no\n\t\t// grandparent or relink the grandparent to the node based on\n\t\t// which side the old parent the node is replacing was on.\n\t\tgrandparent := parents.At(0)\n\t\tif grandparent == nil {\n\t\t\tnewRoot = node\n\t\t} else if grandparent.left == parent {\n\t\t\tgrandparent.left = node\n\t\t} else {\n\t\t\tgrandparent.right = node\n\t\t}\n\t}\n\n\treturn newImmutable(newRoot, t.count+1, t.totalSize+nodeSize(node))\n}\n\n// Delete removes the passed key from the treap and returns the resulting treap\n// if it exists.  The original immutable treap is returned if the key does not\n// exist.\nfunc (t *Immutable) Delete(key []byte) *Immutable {\n\t// Find the node for the key while constructing a list of parents while\n\t// doing so.\n\tvar parents parentStack\n\tvar delNode *treapNode\n\tfor node := t.root; node != nil; {\n\t\tparents.Push(node)\n\n\t\t// Traverse left or right depending on the result of the\n\t\t// comparison.\n\t\tcompareResult := bytes.Compare(key, node.key)\n\t\tif compareResult < 0 {\n\t\t\tnode = node.left\n\t\t\tcontinue\n\t\t}\n\t\tif compareResult > 0 {\n\t\t\tnode = node.right\n\t\t\tcontinue\n\t\t}\n\n\t\t// The key exists.\n\t\tdelNode = node\n\t\tbreak\n\t}\n\n\t// There is nothing to do if the key does not exist.\n\tif delNode == nil {\n\t\treturn t\n\t}\n\n\t// When the only node in the tree is the root node and it is the one\n\t// being deleted, there is nothing else to do besides removing it.\n\tparent := parents.At(1)\n\tif parent == nil && delNode.left == nil && delNode.right == nil {\n\t\treturn newImmutable(nil, 0, 0)\n\t}\n\n\t// Construct a replaced list of parents and the node to delete itself.\n\t// This is done because this is an immutable data structure and\n\t// therefore all ancestors of the node that will be deleted, up to and\n\t// including the root, need to be replaced.\n\tvar newParents parentStack\n\tfor i := parents.Len(); i > 0; i-- {\n\t\tnode := parents.At(i - 1)\n\t\tnodeCopy := cloneTreapNode(node)\n\t\tif oldParent := newParents.At(0); oldParent != nil {\n\t\t\tif oldParent.left == node {\n\t\t\t\toldParent.left = nodeCopy\n\t\t\t} else {\n\t\t\t\toldParent.right = nodeCopy\n\t\t\t}\n\t\t}\n\t\tnewParents.Push(nodeCopy)\n\t}\n\tdelNode = newParents.Pop()\n\tparent = newParents.At(0)\n\n\t// Perform rotations to move the node to delete to a leaf position while\n\t// maintaining the min-heap while replacing the modified children.\n\tvar child *treapNode\n\tnewRoot := newParents.At(newParents.Len() - 1)\n\tfor delNode.left != nil || delNode.right != nil {\n\t\t// Choose the child with the higher priority.\n\t\tvar isLeft bool\n\t\tif delNode.left == nil {\n\t\t\tchild = delNode.right\n\t\t} else if delNode.right == nil {\n\t\t\tchild = delNode.left\n\t\t\tisLeft = true\n\t\t} else if delNode.left.priority >= delNode.right.priority {\n\t\t\tchild = delNode.left\n\t\t\tisLeft = true\n\t\t} else {\n\t\t\tchild = delNode.right\n\t\t}\n\n\t\t// Rotate left or right depending on which side the child node\n\t\t// is on.  This has the effect of moving the node to delete\n\t\t// towards the bottom of the tree while maintaining the\n\t\t// min-heap.\n\t\tchild = cloneTreapNode(child)\n\t\tif isLeft {\n\t\t\tchild.right, delNode.left = delNode, child.right\n\t\t} else {\n\t\t\tchild.left, delNode.right = delNode, child.left\n\t\t}\n\n\t\t// Either set the new root of the tree when there is no\n\t\t// grandparent or relink the grandparent to the node based on\n\t\t// which side the old parent the node is replacing was on.\n\t\t//\n\t\t// Since the node to be deleted was just moved down a level, the\n\t\t// new grandparent is now the current parent and the new parent\n\t\t// is the current child.\n\t\tif parent == nil {\n\t\t\tnewRoot = child\n\t\t} else if parent.left == delNode {\n\t\t\tparent.left = child\n\t\t} else {\n\t\t\tparent.right = child\n\t\t}\n\n\t\t// The parent for the node to delete is now what was previously\n\t\t// its child.\n\t\tparent = child\n\t}\n\n\t// Delete the node, which is now a leaf node, by disconnecting it from\n\t// its parent.\n\tif parent.right == delNode {\n\t\tparent.right = nil\n\t} else {\n\t\tparent.left = nil\n\t}\n\n\treturn newImmutable(newRoot, t.count-1, t.totalSize-nodeSize(delNode))\n}\n\n// ForEach invokes the passed function with every key/value pair in the treap\n// in ascending order.\nfunc (t *Immutable) ForEach(fn func(k, v []byte) bool) {\n\t// Add the root node and all children to the left of it to the list of\n\t// nodes to traverse and loop until they, and all of their child nodes,\n\t// have been traversed.\n\tvar parents parentStack\n\tfor node := t.root; node != nil; node = node.left {\n\t\tparents.Push(node)\n\t}\n\tfor parents.Len() > 0 {\n\t\tnode := parents.Pop()\n\t\tif !fn(node.key, node.value) {\n\t\t\treturn\n\t\t}\n\n\t\t// Extend the nodes to traverse by all children to the left of\n\t\t// the current node's right child.\n\t\tfor node := node.right; node != nil; node = node.left {\n\t\t\tparents.Push(node)\n\t\t}\n\t}\n}\n\n// NewImmutable returns a new empty immutable treap ready for use.  See the\n// documentation for the Immutable structure for more details.\nfunc NewImmutable() *Immutable {\n\treturn &Immutable{}\n}\n"
  },
  {
    "path": "database/internal/treap/immutable_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage treap\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha256\"\n\t\"testing\"\n)\n\n// TestImmutableEmpty ensures calling functions on an empty immutable treap\n// works as expected.\nfunc TestImmutableEmpty(t *testing.T) {\n\tt.Parallel()\n\n\t// Ensure the treap length is the expected value.\n\ttestTreap := NewImmutable()\n\tif gotLen := testTreap.Len(); gotLen != 0 {\n\t\tt.Fatalf(\"Len: unexpected length - got %d, want %d\", gotLen, 0)\n\t}\n\n\t// Ensure the reported size is 0.\n\tif gotSize := testTreap.Size(); gotSize != 0 {\n\t\tt.Fatalf(\"Size: unexpected byte size - got %d, want 0\",\n\t\t\tgotSize)\n\t}\n\n\t// Ensure there are no errors with requesting keys from an empty treap.\n\tkey := serializeUint32(0)\n\tif gotVal := testTreap.Has(key); gotVal {\n\t\tt.Fatalf(\"Has: unexpected result - got %v, want false\", gotVal)\n\t}\n\tif gotVal := testTreap.Get(key); gotVal != nil {\n\t\tt.Fatalf(\"Get: unexpected result - got %x, want nil\", gotVal)\n\t}\n\n\t// Ensure there are no panics when deleting keys from an empty treap.\n\ttestTreap.Delete(key)\n\n\t// Ensure the number of keys iterated by ForEach on an empty treap is\n\t// zero.\n\tvar numIterated int\n\ttestTreap.ForEach(func(k, v []byte) bool {\n\t\tnumIterated++\n\t\treturn true\n\t})\n\tif numIterated != 0 {\n\t\tt.Fatalf(\"ForEach: unexpected iterate count - got %d, want 0\",\n\t\t\tnumIterated)\n\t}\n}\n\n// TestImmutableSequential ensures that putting keys into an immutable treap in\n// sequential order works as expected.\nfunc TestImmutableSequential(t *testing.T) {\n\tt.Parallel()\n\n\t// Insert a bunch of sequential keys while checking several of the treap\n\t// functions work as expected.\n\texpectedSize := uint64(0)\n\tnumItems := 1000\n\ttestTreap := NewImmutable()\n\tfor i := 0; i < numItems; i++ {\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap = testTreap.Put(key, key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != i+1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, i+1)\n\t\t}\n\n\t\t// Ensure the treap has the key.\n\t\tif !testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is not in treap\", i, key)\n\t\t}\n\n\t\t// Get the key from the treap and ensure it is the expected\n\t\t// value.\n\t\tif gotVal := testTreap.Get(key); !bytes.Equal(gotVal, key) {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want %x\",\n\t\t\t\ti, gotVal, key)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize += (nodeFieldsSize + 8)\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n\n\t// Ensure the all keys are iterated by ForEach in order.\n\tvar numIterated int\n\ttestTreap.ForEach(func(k, v []byte) bool {\n\t\twantKey := serializeUint32(uint32(numIterated))\n\n\t\t// Ensure the key is as expected.\n\t\tif !bytes.Equal(k, wantKey) {\n\t\t\tt.Fatalf(\"ForEach #%d: unexpected key - got %x, want %x\",\n\t\t\t\tnumIterated, k, wantKey)\n\t\t}\n\n\t\t// Ensure the value is as expected.\n\t\tif !bytes.Equal(v, wantKey) {\n\t\t\tt.Fatalf(\"ForEach #%d: unexpected value - got %x, want %x\",\n\t\t\t\tnumIterated, v, wantKey)\n\t\t}\n\n\t\tnumIterated++\n\t\treturn true\n\t})\n\n\t// Ensure all items were iterated.\n\tif numIterated != numItems {\n\t\tt.Fatalf(\"ForEach: unexpected iterate count - got %d, want %d\",\n\t\t\tnumIterated, numItems)\n\t}\n\n\t// Delete the keys one-by-one while checking several of the treap\n\t// functions work as expected.\n\tfor i := 0; i < numItems; i++ {\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap = testTreap.Delete(key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != numItems-i-1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, numItems-i-1)\n\t\t}\n\n\t\t// Ensure the treap no longer has the key.\n\t\tif testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is in treap\", i, key)\n\t\t}\n\n\t\t// Get the key that no longer exists from the treap and ensure\n\t\t// it is nil.\n\t\tif gotVal := testTreap.Get(key); gotVal != nil {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want nil\",\n\t\t\t\ti, gotVal)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize -= (nodeFieldsSize + 8)\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n}\n\n// TestImmutableReverseSequential ensures that putting keys into an immutable\n// treap in reverse sequential order works as expected.\nfunc TestImmutableReverseSequential(t *testing.T) {\n\tt.Parallel()\n\n\t// Insert a bunch of sequential keys while checking several of the treap\n\t// functions work as expected.\n\texpectedSize := uint64(0)\n\tnumItems := 1000\n\ttestTreap := NewImmutable()\n\tfor i := 0; i < numItems; i++ {\n\t\tkey := serializeUint32(uint32(numItems - i - 1))\n\t\ttestTreap = testTreap.Put(key, key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != i+1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, i+1)\n\t\t}\n\n\t\t// Ensure the treap has the key.\n\t\tif !testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is not in treap\", i, key)\n\t\t}\n\n\t\t// Get the key from the treap and ensure it is the expected\n\t\t// value.\n\t\tif gotVal := testTreap.Get(key); !bytes.Equal(gotVal, key) {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want %x\",\n\t\t\t\ti, gotVal, key)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize += (nodeFieldsSize + 8)\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n\n\t// Ensure the all keys are iterated by ForEach in order.\n\tvar numIterated int\n\ttestTreap.ForEach(func(k, v []byte) bool {\n\t\twantKey := serializeUint32(uint32(numIterated))\n\n\t\t// Ensure the key is as expected.\n\t\tif !bytes.Equal(k, wantKey) {\n\t\t\tt.Fatalf(\"ForEach #%d: unexpected key - got %x, want %x\",\n\t\t\t\tnumIterated, k, wantKey)\n\t\t}\n\n\t\t// Ensure the value is as expected.\n\t\tif !bytes.Equal(v, wantKey) {\n\t\t\tt.Fatalf(\"ForEach #%d: unexpected value - got %x, want %x\",\n\t\t\t\tnumIterated, v, wantKey)\n\t\t}\n\n\t\tnumIterated++\n\t\treturn true\n\t})\n\n\t// Ensure all items were iterated.\n\tif numIterated != numItems {\n\t\tt.Fatalf(\"ForEach: unexpected iterate count - got %d, want %d\",\n\t\t\tnumIterated, numItems)\n\t}\n\n\t// Delete the keys one-by-one while checking several of the treap\n\t// functions work as expected.\n\tfor i := 0; i < numItems; i++ {\n\t\t// Intentionally use the reverse order they were inserted here.\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap = testTreap.Delete(key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != numItems-i-1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, numItems-i-1)\n\t\t}\n\n\t\t// Ensure the treap no longer has the key.\n\t\tif testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is in treap\", i, key)\n\t\t}\n\n\t\t// Get the key that no longer exists from the treap and ensure\n\t\t// it is nil.\n\t\tif gotVal := testTreap.Get(key); gotVal != nil {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want nil\",\n\t\t\t\ti, gotVal)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize -= (nodeFieldsSize + 8)\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n}\n\n// TestImmutableUnordered ensures that putting keys into an immutable treap in\n// no paritcular order works as expected.\nfunc TestImmutableUnordered(t *testing.T) {\n\tt.Parallel()\n\n\t// Insert a bunch of out-of-order keys while checking several of the\n\t// treap functions work as expected.\n\texpectedSize := uint64(0)\n\tnumItems := 1000\n\ttestTreap := NewImmutable()\n\tfor i := 0; i < numItems; i++ {\n\t\t// Hash the serialized int to generate out-of-order keys.\n\t\thash := sha256.Sum256(serializeUint32(uint32(i)))\n\t\tkey := hash[:]\n\t\ttestTreap = testTreap.Put(key, key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != i+1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, i+1)\n\t\t}\n\n\t\t// Ensure the treap has the key.\n\t\tif !testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is not in treap\", i, key)\n\t\t}\n\n\t\t// Get the key from the treap and ensure it is the expected\n\t\t// value.\n\t\tif gotVal := testTreap.Get(key); !bytes.Equal(gotVal, key) {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want %x\",\n\t\t\t\ti, gotVal, key)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize += nodeFieldsSize + uint64(len(key)+len(key))\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n\n\t// Delete the keys one-by-one while checking several of the treap\n\t// functions work as expected.\n\tfor i := 0; i < numItems; i++ {\n\t\t// Hash the serialized int to generate out-of-order keys.\n\t\thash := sha256.Sum256(serializeUint32(uint32(i)))\n\t\tkey := hash[:]\n\t\ttestTreap = testTreap.Delete(key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != numItems-i-1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, numItems-i-1)\n\t\t}\n\n\t\t// Ensure the treap no longer has the key.\n\t\tif testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is in treap\", i, key)\n\t\t}\n\n\t\t// Get the key that no longer exists from the treap and ensure\n\t\t// it is nil.\n\t\tif gotVal := testTreap.Get(key); gotVal != nil {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want nil\",\n\t\t\t\ti, gotVal)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize -= (nodeFieldsSize + 64)\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n}\n\n// TestImmutableDuplicatePut ensures that putting a duplicate key into an\n// immutable treap works as expected.\nfunc TestImmutableDuplicatePut(t *testing.T) {\n\tt.Parallel()\n\n\texpectedVal := []byte(\"testval\")\n\texpectedSize := uint64(0)\n\tnumItems := 1000\n\ttestTreap := NewImmutable()\n\tfor i := 0; i < numItems; i++ {\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap = testTreap.Put(key, key)\n\t\texpectedSize += nodeFieldsSize + uint64(len(key)+len(key))\n\n\t\t// Put a duplicate key with the expected final value.\n\t\ttestTreap = testTreap.Put(key, expectedVal)\n\n\t\t// Ensure the key still exists and is the new value.\n\t\tif gotVal := testTreap.Has(key); !gotVal {\n\t\t\tt.Fatalf(\"Has: unexpected result - got %v, want true\",\n\t\t\t\tgotVal)\n\t\t}\n\t\tif gotVal := testTreap.Get(key); !bytes.Equal(gotVal, expectedVal) {\n\t\t\tt.Fatalf(\"Get: unexpected result - got %x, want %x\",\n\t\t\t\tgotVal, expectedVal)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize -= uint64(len(key))\n\t\texpectedSize += uint64(len(expectedVal))\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size: unexpected byte size - got %d, want %d\",\n\t\t\t\tgotSize, expectedSize)\n\t\t}\n\t}\n}\n\n// TestImmutableNilValue ensures that putting a nil value into an immutable\n// treap results in a key being added with an empty byte slice.\nfunc TestImmutableNilValue(t *testing.T) {\n\tt.Parallel()\n\n\tkey := serializeUint32(0)\n\n\t// Put the key with a nil value.\n\ttestTreap := NewImmutable()\n\ttestTreap = testTreap.Put(key, nil)\n\n\t// Ensure the key exists and is an empty byte slice.\n\tif gotVal := testTreap.Has(key); !gotVal {\n\t\tt.Fatalf(\"Has: unexpected result - got %v, want true\", gotVal)\n\t}\n\tif gotVal := testTreap.Get(key); gotVal == nil {\n\t\tt.Fatalf(\"Get: unexpected result - got nil, want empty slice\")\n\t}\n\tif gotVal := testTreap.Get(key); len(gotVal) != 0 {\n\t\tt.Fatalf(\"Get: unexpected result - got %x, want empty slice\",\n\t\t\tgotVal)\n\t}\n}\n\n// TestImmutableForEachStopIterator ensures that returning false from the ForEach\n// callback on an immutable treap stops iteration early.\nfunc TestImmutableForEachStopIterator(t *testing.T) {\n\tt.Parallel()\n\n\t// Insert a few keys.\n\tnumItems := 10\n\ttestTreap := NewImmutable()\n\tfor i := 0; i < numItems; i++ {\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap = testTreap.Put(key, key)\n\t}\n\n\t// Ensure ForEach exits early on false return by caller.\n\tvar numIterated int\n\ttestTreap.ForEach(func(k, v []byte) bool {\n\t\tnumIterated++\n\t\treturn numIterated != numItems/2\n\t})\n\tif numIterated != numItems/2 {\n\t\tt.Fatalf(\"ForEach: unexpected iterate count - got %d, want %d\",\n\t\t\tnumIterated, numItems/2)\n\t}\n}\n\n// TestImmutableSnapshot ensures that immutable treaps are actually immutable by\n// keeping a reference to the previous treap, performing a mutation, and then\n// ensuring the referenced treap does not have the mutation applied.\nfunc TestImmutableSnapshot(t *testing.T) {\n\tt.Parallel()\n\n\t// Insert a bunch of sequential keys while checking several of the treap\n\t// functions work as expected.\n\texpectedSize := uint64(0)\n\tnumItems := 1000\n\ttestTreap := NewImmutable()\n\tfor i := 0; i < numItems; i++ {\n\t\ttreapSnap := testTreap\n\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap = testTreap.Put(key, key)\n\n\t\t// Ensure the length of the treap snapshot is the expected\n\t\t// value.\n\t\tif gotLen := treapSnap.Len(); gotLen != i {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, i)\n\t\t}\n\n\t\t// Ensure the treap snapshot does not have the key.\n\t\tif treapSnap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is in treap\", i, key)\n\t\t}\n\n\t\t// Get the key that doesn't exist in the treap snapshot and\n\t\t// ensure it is nil.\n\t\tif gotVal := treapSnap.Get(key); gotVal != nil {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want nil\",\n\t\t\t\ti, gotVal)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\tif gotSize := treapSnap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t\texpectedSize += (nodeFieldsSize + 8)\n\t}\n\n\t// Delete the keys one-by-one while checking several of the treap\n\t// functions work as expected.\n\tfor i := 0; i < numItems; i++ {\n\t\ttreapSnap := testTreap\n\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap = testTreap.Delete(key)\n\n\t\t// Ensure the length of the treap snapshot is the expected\n\t\t// value.\n\t\tif gotLen := treapSnap.Len(); gotLen != numItems-i {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, numItems-i)\n\t\t}\n\n\t\t// Ensure the treap snapshot still has the key.\n\t\tif !treapSnap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is not in treap\", i, key)\n\t\t}\n\n\t\t// Get the key from the treap snapshot and ensure it is still\n\t\t// the expected value.\n\t\tif gotVal := treapSnap.Get(key); !bytes.Equal(gotVal, key) {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want %x\",\n\t\t\t\ti, gotVal, key)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\tif gotSize := treapSnap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t\texpectedSize -= (nodeFieldsSize + 8)\n\t}\n}\n"
  },
  {
    "path": "database/internal/treap/mutable.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage treap\n\nimport (\n\t\"bytes\"\n\t\"math/rand\"\n)\n\n// Mutable represents a treap data structure which is used to hold ordered\n// key/value pairs using a combination of binary search tree and heap semantics.\n// It is a self-organizing and randomized data structure that doesn't require\n// complex operations to maintain balance.  Search, insert, and delete\n// operations are all O(log n).\ntype Mutable struct {\n\troot  *treapNode\n\tcount int\n\n\t// totalSize is the best estimate of the total size of of all data in\n\t// the treap including the keys, values, and node sizes.\n\ttotalSize uint64\n}\n\n// Len returns the number of items stored in the treap.\nfunc (t *Mutable) Len() int {\n\treturn t.count\n}\n\n// Size returns a best estimate of the total number of bytes the treap is\n// consuming including all of the fields used to represent the nodes as well as\n// the size of the keys and values.  Shared values are not detected, so the\n// returned size assumes each value is pointing to different memory.\nfunc (t *Mutable) Size() uint64 {\n\treturn t.totalSize\n}\n\n// get returns the treap node that contains the passed key and its parent.  When\n// the found node is the root of the tree, the parent will be nil.  When the key\n// does not exist, both the node and the parent will be nil.\nfunc (t *Mutable) get(key []byte) (*treapNode, *treapNode) {\n\tvar parent *treapNode\n\tfor node := t.root; node != nil; {\n\t\t// Traverse left or right depending on the result of the\n\t\t// comparison.\n\t\tcompareResult := bytes.Compare(key, node.key)\n\t\tif compareResult < 0 {\n\t\t\tparent = node\n\t\t\tnode = node.left\n\t\t\tcontinue\n\t\t}\n\t\tif compareResult > 0 {\n\t\t\tparent = node\n\t\t\tnode = node.right\n\t\t\tcontinue\n\t\t}\n\n\t\t// The key exists.\n\t\treturn node, parent\n\t}\n\n\t// A nil node was reached which means the key does not exist.\n\treturn nil, nil\n}\n\n// Has returns whether or not the passed key exists.\nfunc (t *Mutable) Has(key []byte) bool {\n\tif node, _ := t.get(key); node != nil {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Get returns the value for the passed key.  The function will return nil when\n// the key does not exist.\nfunc (t *Mutable) Get(key []byte) []byte {\n\tif node, _ := t.get(key); node != nil {\n\t\treturn node.value\n\t}\n\treturn nil\n}\n\n// relinkGrandparent relinks the node into the treap after it has been rotated\n// by changing the passed grandparent's left or right pointer, depending on\n// where the old parent was, to point at the passed node.  Otherwise, when there\n// is no grandparent, it means the node is now the root of the tree, so update\n// it accordingly.\nfunc (t *Mutable) relinkGrandparent(node, parent, grandparent *treapNode) {\n\t// The node is now the root of the tree when there is no grandparent.\n\tif grandparent == nil {\n\t\tt.root = node\n\t\treturn\n\t}\n\n\t// Relink the grandparent's left or right pointer based on which side\n\t// the old parent was.\n\tif grandparent.left == parent {\n\t\tgrandparent.left = node\n\t} else {\n\t\tgrandparent.right = node\n\t}\n}\n\n// Put inserts the passed key/value pair.\nfunc (t *Mutable) Put(key, value []byte) {\n\t// Use an empty byte slice for the value when none was provided.  This\n\t// ultimately allows key existence to be determined from the value since\n\t// an empty byte slice is distinguishable from nil.\n\tif value == nil {\n\t\tvalue = emptySlice\n\t}\n\n\t// The node is the root of the tree if there isn't already one.\n\tif t.root == nil {\n\t\tnode := newTreapNode(key, value, rand.Int())\n\t\tt.count = 1\n\t\tt.totalSize = nodeSize(node)\n\t\tt.root = node\n\t\treturn\n\t}\n\n\t// Find the binary tree insertion point and construct a list of parents\n\t// while doing so.  When the key matches an entry already in the treap,\n\t// just update its value and return.\n\tvar parents parentStack\n\tvar compareResult int\n\tfor node := t.root; node != nil; {\n\t\tparents.Push(node)\n\t\tcompareResult = bytes.Compare(key, node.key)\n\t\tif compareResult < 0 {\n\t\t\tnode = node.left\n\t\t\tcontinue\n\t\t}\n\t\tif compareResult > 0 {\n\t\t\tnode = node.right\n\t\t\tcontinue\n\t\t}\n\n\t\t// The key already exists, so update its value.\n\t\tt.totalSize -= uint64(len(node.value))\n\t\tt.totalSize += uint64(len(value))\n\t\tnode.value = value\n\t\treturn\n\t}\n\n\t// Link the new node into the binary tree in the correct position.\n\tnode := newTreapNode(key, value, rand.Int())\n\tt.count++\n\tt.totalSize += nodeSize(node)\n\tparent := parents.At(0)\n\tif compareResult < 0 {\n\t\tparent.left = node\n\t} else {\n\t\tparent.right = node\n\t}\n\n\t// Perform any rotations needed to maintain the min-heap.\n\tfor parents.Len() > 0 {\n\t\t// There is nothing left to do when the node's priority is\n\t\t// greater than or equal to its parent's priority.\n\t\tparent = parents.Pop()\n\t\tif node.priority >= parent.priority {\n\t\t\tbreak\n\t\t}\n\n\t\t// Perform a right rotation if the node is on the left side or\n\t\t// a left rotation if the node is on the right side.\n\t\tif parent.left == node {\n\t\t\tnode.right, parent.left = parent, node.right\n\t\t} else {\n\t\t\tnode.left, parent.right = parent, node.left\n\t\t}\n\t\tt.relinkGrandparent(node, parent, parents.At(0))\n\t}\n}\n\n// Delete removes the passed key if it exists.\nfunc (t *Mutable) Delete(key []byte) {\n\t// Find the node for the key along with its parent.  There is nothing to\n\t// do if the key does not exist.\n\tnode, parent := t.get(key)\n\tif node == nil {\n\t\treturn\n\t}\n\n\t// When the only node in the tree is the root node and it is the one\n\t// being deleted, there is nothing else to do besides removing it.\n\tif parent == nil && node.left == nil && node.right == nil {\n\t\tt.root = nil\n\t\tt.count = 0\n\t\tt.totalSize = 0\n\t\treturn\n\t}\n\n\t// Perform rotations to move the node to delete to a leaf position while\n\t// maintaining the min-heap.\n\tvar isLeft bool\n\tvar child *treapNode\n\tfor node.left != nil || node.right != nil {\n\t\t// Choose the child with the higher priority.\n\t\tif node.left == nil {\n\t\t\tchild = node.right\n\t\t\tisLeft = false\n\t\t} else if node.right == nil {\n\t\t\tchild = node.left\n\t\t\tisLeft = true\n\t\t} else if node.left.priority >= node.right.priority {\n\t\t\tchild = node.left\n\t\t\tisLeft = true\n\t\t} else {\n\t\t\tchild = node.right\n\t\t\tisLeft = false\n\t\t}\n\n\t\t// Rotate left or right depending on which side the child node\n\t\t// is on.  This has the effect of moving the node to delete\n\t\t// towards the bottom of the tree while maintaining the\n\t\t// min-heap.\n\t\tif isLeft {\n\t\t\tchild.right, node.left = node, child.right\n\t\t} else {\n\t\t\tchild.left, node.right = node, child.left\n\t\t}\n\t\tt.relinkGrandparent(child, node, parent)\n\n\t\t// The parent for the node to delete is now what was previously\n\t\t// its child.\n\t\tparent = child\n\t}\n\n\t// Delete the node, which is now a leaf node, by disconnecting it from\n\t// its parent.\n\tif parent.right == node {\n\t\tparent.right = nil\n\t} else {\n\t\tparent.left = nil\n\t}\n\tt.count--\n\tt.totalSize -= nodeSize(node)\n}\n\n// ForEach invokes the passed function with every key/value pair in the treap\n// in ascending order.\nfunc (t *Mutable) ForEach(fn func(k, v []byte) bool) {\n\t// Add the root node and all children to the left of it to the list of\n\t// nodes to traverse and loop until they, and all of their child nodes,\n\t// have been traversed.\n\tvar parents parentStack\n\tfor node := t.root; node != nil; node = node.left {\n\t\tparents.Push(node)\n\t}\n\tfor parents.Len() > 0 {\n\t\tnode := parents.Pop()\n\t\tif !fn(node.key, node.value) {\n\t\t\treturn\n\t\t}\n\n\t\t// Extend the nodes to traverse by all children to the left of\n\t\t// the current node's right child.\n\t\tfor node := node.right; node != nil; node = node.left {\n\t\t\tparents.Push(node)\n\t\t}\n\t}\n}\n\n// Reset efficiently removes all items in the treap.\nfunc (t *Mutable) Reset() {\n\tt.count = 0\n\tt.totalSize = 0\n\tt.root = nil\n}\n\n// NewMutable returns a new empty mutable treap ready for use.  See the\n// documentation for the Mutable structure for more details.\nfunc NewMutable() *Mutable {\n\treturn &Mutable{}\n}\n"
  },
  {
    "path": "database/internal/treap/mutable_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage treap\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha256\"\n\t\"testing\"\n)\n\n// TestMutableEmpty ensures calling functions on an empty mutable treap works as\n// expected.\nfunc TestMutableEmpty(t *testing.T) {\n\tt.Parallel()\n\n\t// Ensure the treap length is the expected value.\n\ttestTreap := NewMutable()\n\tif gotLen := testTreap.Len(); gotLen != 0 {\n\t\tt.Fatalf(\"Len: unexpected length - got %d, want %d\", gotLen, 0)\n\t}\n\n\t// Ensure the reported size is 0.\n\tif gotSize := testTreap.Size(); gotSize != 0 {\n\t\tt.Fatalf(\"Size: unexpected byte size - got %d, want 0\",\n\t\t\tgotSize)\n\t}\n\n\t// Ensure there are no errors with requesting keys from an empty treap.\n\tkey := serializeUint32(0)\n\tif gotVal := testTreap.Has(key); gotVal {\n\t\tt.Fatalf(\"Has: unexpected result - got %v, want false\", gotVal)\n\t}\n\tif gotVal := testTreap.Get(key); gotVal != nil {\n\t\tt.Fatalf(\"Get: unexpected result - got %x, want nil\", gotVal)\n\t}\n\n\t// Ensure there are no panics when deleting keys from an empty treap.\n\ttestTreap.Delete(key)\n\n\t// Ensure the number of keys iterated by ForEach on an empty treap is\n\t// zero.\n\tvar numIterated int\n\ttestTreap.ForEach(func(k, v []byte) bool {\n\t\tnumIterated++\n\t\treturn true\n\t})\n\tif numIterated != 0 {\n\t\tt.Fatalf(\"ForEach: unexpected iterate count - got %d, want 0\",\n\t\t\tnumIterated)\n\t}\n}\n\n// TestMutableReset ensures that resetting an existing mutable treap works as\n// expected.\nfunc TestMutableReset(t *testing.T) {\n\tt.Parallel()\n\n\t// Insert a few keys.\n\tnumItems := 10\n\ttestTreap := NewMutable()\n\tfor i := 0; i < numItems; i++ {\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap.Put(key, key)\n\t}\n\n\t// Reset it.\n\ttestTreap.Reset()\n\n\t// Ensure the treap length is now 0.\n\tif gotLen := testTreap.Len(); gotLen != 0 {\n\t\tt.Fatalf(\"Len: unexpected length - got %d, want %d\", gotLen, 0)\n\t}\n\n\t// Ensure the reported size is now 0.\n\tif gotSize := testTreap.Size(); gotSize != 0 {\n\t\tt.Fatalf(\"Size: unexpected byte size - got %d, want 0\",\n\t\t\tgotSize)\n\t}\n\n\t// Ensure the treap no longer has any of the keys.\n\tfor i := 0; i < numItems; i++ {\n\t\tkey := serializeUint32(uint32(i))\n\n\t\t// Ensure the treap no longer has the key.\n\t\tif testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is in treap\", i, key)\n\t\t}\n\n\t\t// Get the key that no longer exists from the treap and ensure\n\t\t// it is nil.\n\t\tif gotVal := testTreap.Get(key); gotVal != nil {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want nil\",\n\t\t\t\ti, gotVal)\n\t\t}\n\t}\n\n\t// Ensure the number of keys iterated by ForEach is zero.\n\tvar numIterated int\n\ttestTreap.ForEach(func(k, v []byte) bool {\n\t\tnumIterated++\n\t\treturn true\n\t})\n\tif numIterated != 0 {\n\t\tt.Fatalf(\"ForEach: unexpected iterate count - got %d, want 0\",\n\t\t\tnumIterated)\n\t}\n}\n\n// TestMutableSequential ensures that putting keys into a mutable treap in\n// sequential order works as expected.\nfunc TestMutableSequential(t *testing.T) {\n\tt.Parallel()\n\n\t// Insert a bunch of sequential keys while checking several of the treap\n\t// functions work as expected.\n\texpectedSize := uint64(0)\n\tnumItems := 1000\n\ttestTreap := NewMutable()\n\tfor i := 0; i < numItems; i++ {\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap.Put(key, key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != i+1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, i+1)\n\t\t}\n\n\t\t// Ensure the treap has the key.\n\t\tif !testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is not in treap\", i, key)\n\t\t}\n\n\t\t// Get the key from the treap and ensure it is the expected\n\t\t// value.\n\t\tif gotVal := testTreap.Get(key); !bytes.Equal(gotVal, key) {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want %x\",\n\t\t\t\ti, gotVal, key)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize += (nodeFieldsSize + 8)\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n\n\t// Ensure the all keys are iterated by ForEach in order.\n\tvar numIterated int\n\ttestTreap.ForEach(func(k, v []byte) bool {\n\t\twantKey := serializeUint32(uint32(numIterated))\n\n\t\t// Ensure the key is as expected.\n\t\tif !bytes.Equal(k, wantKey) {\n\t\t\tt.Fatalf(\"ForEach #%d: unexpected key - got %x, want %x\",\n\t\t\t\tnumIterated, k, wantKey)\n\t\t}\n\n\t\t// Ensure the value is as expected.\n\t\tif !bytes.Equal(v, wantKey) {\n\t\t\tt.Fatalf(\"ForEach #%d: unexpected value - got %x, want %x\",\n\t\t\t\tnumIterated, v, wantKey)\n\t\t}\n\n\t\tnumIterated++\n\t\treturn true\n\t})\n\n\t// Ensure all items were iterated.\n\tif numIterated != numItems {\n\t\tt.Fatalf(\"ForEach: unexpected iterate count - got %d, want %d\",\n\t\t\tnumIterated, numItems)\n\t}\n\n\t// Delete the keys one-by-one while checking several of the treap\n\t// functions work as expected.\n\tfor i := 0; i < numItems; i++ {\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap.Delete(key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != numItems-i-1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, numItems-i-1)\n\t\t}\n\n\t\t// Ensure the treap no longer has the key.\n\t\tif testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is in treap\", i, key)\n\t\t}\n\n\t\t// Get the key that no longer exists from the treap and ensure\n\t\t// it is nil.\n\t\tif gotVal := testTreap.Get(key); gotVal != nil {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want nil\",\n\t\t\t\ti, gotVal)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize -= (nodeFieldsSize + 8)\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n}\n\n// TestMutableReverseSequential ensures that putting keys into a mutable treap\n// in reverse sequential order works as expected.\nfunc TestMutableReverseSequential(t *testing.T) {\n\tt.Parallel()\n\n\t// Insert a bunch of sequential keys while checking several of the treap\n\t// functions work as expected.\n\texpectedSize := uint64(0)\n\tnumItems := 1000\n\ttestTreap := NewMutable()\n\tfor i := 0; i < numItems; i++ {\n\t\tkey := serializeUint32(uint32(numItems - i - 1))\n\t\ttestTreap.Put(key, key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != i+1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, i+1)\n\t\t}\n\n\t\t// Ensure the treap has the key.\n\t\tif !testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is not in treap\", i, key)\n\t\t}\n\n\t\t// Get the key from the treap and ensure it is the expected\n\t\t// value.\n\t\tif gotVal := testTreap.Get(key); !bytes.Equal(gotVal, key) {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want %x\",\n\t\t\t\ti, gotVal, key)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize += (nodeFieldsSize + 8)\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n\n\t// Ensure the all keys are iterated by ForEach in order.\n\tvar numIterated int\n\ttestTreap.ForEach(func(k, v []byte) bool {\n\t\twantKey := serializeUint32(uint32(numIterated))\n\n\t\t// Ensure the key is as expected.\n\t\tif !bytes.Equal(k, wantKey) {\n\t\t\tt.Fatalf(\"ForEach #%d: unexpected key - got %x, want %x\",\n\t\t\t\tnumIterated, k, wantKey)\n\t\t}\n\n\t\t// Ensure the value is as expected.\n\t\tif !bytes.Equal(v, wantKey) {\n\t\t\tt.Fatalf(\"ForEach #%d: unexpected value - got %x, want %x\",\n\t\t\t\tnumIterated, v, wantKey)\n\t\t}\n\n\t\tnumIterated++\n\t\treturn true\n\t})\n\n\t// Ensure all items were iterated.\n\tif numIterated != numItems {\n\t\tt.Fatalf(\"ForEach: unexpected iterate count - got %d, want %d\",\n\t\t\tnumIterated, numItems)\n\t}\n\n\t// Delete the keys one-by-one while checking several of the treap\n\t// functions work as expected.\n\tfor i := 0; i < numItems; i++ {\n\t\t// Intentionally use the reverse order they were inserted here.\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap.Delete(key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != numItems-i-1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, numItems-i-1)\n\t\t}\n\n\t\t// Ensure the treap no longer has the key.\n\t\tif testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is in treap\", i, key)\n\t\t}\n\n\t\t// Get the key that no longer exists from the treap and ensure\n\t\t// it is nil.\n\t\tif gotVal := testTreap.Get(key); gotVal != nil {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want nil\",\n\t\t\t\ti, gotVal)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize -= (nodeFieldsSize + 8)\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n}\n\n// TestMutableUnordered ensures that putting keys into a mutable treap in no\n// paritcular order works as expected.\nfunc TestMutableUnordered(t *testing.T) {\n\tt.Parallel()\n\n\t// Insert a bunch of out-of-order keys while checking several of the\n\t// treap functions work as expected.\n\texpectedSize := uint64(0)\n\tnumItems := 1000\n\ttestTreap := NewMutable()\n\tfor i := 0; i < numItems; i++ {\n\t\t// Hash the serialized int to generate out-of-order keys.\n\t\thash := sha256.Sum256(serializeUint32(uint32(i)))\n\t\tkey := hash[:]\n\t\ttestTreap.Put(key, key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != i+1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, i+1)\n\t\t}\n\n\t\t// Ensure the treap has the key.\n\t\tif !testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is not in treap\", i, key)\n\t\t}\n\n\t\t// Get the key from the treap and ensure it is the expected\n\t\t// value.\n\t\tif gotVal := testTreap.Get(key); !bytes.Equal(gotVal, key) {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want %x\",\n\t\t\t\ti, gotVal, key)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize += nodeFieldsSize + uint64(len(key)+len(key))\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n\n\t// Delete the keys one-by-one while checking several of the treap\n\t// functions work as expected.\n\tfor i := 0; i < numItems; i++ {\n\t\t// Hash the serialized int to generate out-of-order keys.\n\t\thash := sha256.Sum256(serializeUint32(uint32(i)))\n\t\tkey := hash[:]\n\t\ttestTreap.Delete(key)\n\n\t\t// Ensure the treap length is the expected value.\n\t\tif gotLen := testTreap.Len(); gotLen != numItems-i-1 {\n\t\t\tt.Fatalf(\"Len #%d: unexpected length - got %d, want %d\",\n\t\t\t\ti, gotLen, numItems-i-1)\n\t\t}\n\n\t\t// Ensure the treap no longer has the key.\n\t\tif testTreap.Has(key) {\n\t\t\tt.Fatalf(\"Has #%d: key %q is in treap\", i, key)\n\t\t}\n\n\t\t// Get the key that no longer exists from the treap and ensure\n\t\t// it is nil.\n\t\tif gotVal := testTreap.Get(key); gotVal != nil {\n\t\t\tt.Fatalf(\"Get #%d: unexpected value - got %x, want nil\",\n\t\t\t\ti, gotVal)\n\t\t}\n\n\t\t// Ensure the expected size is reported.\n\t\texpectedSize -= (nodeFieldsSize + 64)\n\t\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\t\tt.Fatalf(\"Size #%d: unexpected byte size - got %d, \"+\n\t\t\t\t\"want %d\", i, gotSize, expectedSize)\n\t\t}\n\t}\n}\n\n// TestMutableDuplicatePut ensures that putting a duplicate key into a mutable\n// treap updates the existing value.\nfunc TestMutableDuplicatePut(t *testing.T) {\n\tt.Parallel()\n\n\tkey := serializeUint32(0)\n\tval := []byte(\"testval\")\n\n\t// Put the key twice with the second put being the expected final value.\n\ttestTreap := NewMutable()\n\ttestTreap.Put(key, key)\n\ttestTreap.Put(key, val)\n\n\t// Ensure the key still exists and is the new value.\n\tif gotVal := testTreap.Has(key); !gotVal {\n\t\tt.Fatalf(\"Has: unexpected result - got %v, want true\", gotVal)\n\t}\n\tif gotVal := testTreap.Get(key); !bytes.Equal(gotVal, val) {\n\t\tt.Fatalf(\"Get: unexpected result - got %x, want %x\", gotVal, val)\n\t}\n\n\t// Ensure the expected size is reported.\n\texpectedSize := uint64(nodeFieldsSize + len(key) + len(val))\n\tif gotSize := testTreap.Size(); gotSize != expectedSize {\n\t\tt.Fatalf(\"Size: unexpected byte size - got %d, want %d\",\n\t\t\tgotSize, expectedSize)\n\t}\n}\n\n// TestMutableNilValue ensures that putting a nil value into a mutable treap\n// results in a key being added with an empty byte slice.\nfunc TestMutableNilValue(t *testing.T) {\n\tt.Parallel()\n\n\tkey := serializeUint32(0)\n\n\t// Put the key with a nil value.\n\ttestTreap := NewMutable()\n\ttestTreap.Put(key, nil)\n\n\t// Ensure the key exists and is an empty byte slice.\n\tif gotVal := testTreap.Has(key); !gotVal {\n\t\tt.Fatalf(\"Has: unexpected result - got %v, want true\", gotVal)\n\t}\n\tif gotVal := testTreap.Get(key); gotVal == nil {\n\t\tt.Fatalf(\"Get: unexpected result - got nil, want empty slice\")\n\t}\n\tif gotVal := testTreap.Get(key); len(gotVal) != 0 {\n\t\tt.Fatalf(\"Get: unexpected result - got %x, want empty slice\",\n\t\t\tgotVal)\n\t}\n}\n\n// TestMutableForEachStopIterator ensures that returning false from the ForEach\n// callback of a mutable treap stops iteration early.\nfunc TestMutableForEachStopIterator(t *testing.T) {\n\tt.Parallel()\n\n\t// Insert a few keys.\n\tnumItems := 10\n\ttestTreap := NewMutable()\n\tfor i := 0; i < numItems; i++ {\n\t\tkey := serializeUint32(uint32(i))\n\t\ttestTreap.Put(key, key)\n\t}\n\n\t// Ensure ForEach exits early on false return by caller.\n\tvar numIterated int\n\ttestTreap.ForEach(func(k, v []byte) bool {\n\t\tnumIterated++\n\t\treturn numIterated != numItems/2\n\t})\n\tif numIterated != numItems/2 {\n\t\tt.Fatalf(\"ForEach: unexpected iterate count - got %d, want %d\",\n\t\t\tnumIterated, numItems/2)\n\t}\n}\n"
  },
  {
    "path": "database/internal/treap/treapiter.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage treap\n\nimport \"bytes\"\n\n// Iterator represents an iterator for forwards and backwards iteration over\n// the contents of a treap (mutable or immutable).\ntype Iterator struct {\n\tt        *Mutable    // Mutable treap iterator is associated with or nil\n\troot     *treapNode  // Root node of treap iterator is associated with\n\tnode     *treapNode  // The node the iterator is positioned at\n\tparents  parentStack // The stack of parents needed to iterate\n\tisNew    bool        // Whether the iterator has been positioned\n\tseekKey  []byte      // Used to handle dynamic updates for mutable treap\n\tstartKey []byte      // Used to limit the iterator to a range\n\tlimitKey []byte      // Used to limit the iterator to a range\n}\n\n// limitIterator clears the current iterator node if it is outside of the range\n// specified when the iterator was created.  It returns whether the iterator is\n// valid.\nfunc (iter *Iterator) limitIterator() bool {\n\tif iter.node == nil {\n\t\treturn false\n\t}\n\n\tnode := iter.node\n\tif iter.startKey != nil && bytes.Compare(node.key, iter.startKey) < 0 {\n\t\titer.node = nil\n\t\treturn false\n\t}\n\n\tif iter.limitKey != nil && bytes.Compare(node.key, iter.limitKey) >= 0 {\n\t\titer.node = nil\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// seek moves the iterator based on the provided key and flags.\n//\n// When the exact match flag is set, the iterator will either be moved to first\n// key in the treap that exactly matches the provided key, or the one\n// before/after it depending on the greater flag.\n//\n// When the exact match flag is NOT set, the iterator will be moved to the first\n// key in the treap before/after the provided key depending on the greater flag.\n//\n// In all cases, the limits specified when the iterator was created are\n// respected.\nfunc (iter *Iterator) seek(key []byte, exactMatch bool, greater bool) bool {\n\titer.node = nil\n\titer.parents = parentStack{}\n\tvar selectedNodeDepth int\n\tfor node := iter.root; node != nil; {\n\t\titer.parents.Push(node)\n\n\t\t// Traverse left or right depending on the result of the\n\t\t// comparison.  Also, set the iterator to the node depending on\n\t\t// the flags so the iterator is positioned properly when an\n\t\t// exact match isn't found.\n\t\tcompareResult := bytes.Compare(key, node.key)\n\t\tif compareResult < 0 {\n\t\t\tif greater {\n\t\t\t\titer.node = node\n\t\t\t\tselectedNodeDepth = iter.parents.Len() - 1\n\t\t\t}\n\t\t\tnode = node.left\n\t\t\tcontinue\n\t\t}\n\t\tif compareResult > 0 {\n\t\t\tif !greater {\n\t\t\t\titer.node = node\n\t\t\t\tselectedNodeDepth = iter.parents.Len() - 1\n\t\t\t}\n\t\t\tnode = node.right\n\t\t\tcontinue\n\t\t}\n\n\t\t// The key is an exact match.  Set the iterator and return now\n\t\t// when the exact match flag is set.\n\t\tif exactMatch {\n\t\t\titer.node = node\n\t\t\titer.parents.Pop()\n\t\t\treturn iter.limitIterator()\n\t\t}\n\n\t\t// The key is an exact match, but the exact match is not set, so\n\t\t// choose which direction to go based on whether the larger or\n\t\t// smaller key was requested.\n\t\tif greater {\n\t\t\tnode = node.right\n\t\t} else {\n\t\t\tnode = node.left\n\t\t}\n\t}\n\n\t// There was either no exact match or there was an exact match but the\n\t// exact match flag was not set.  In any case, the parent stack might\n\t// need to be adjusted to only include the parents up to the selected\n\t// node.  Also, ensure the selected node's key does not exceed the\n\t// allowed range of the iterator.\n\tfor i := iter.parents.Len(); i > selectedNodeDepth; i-- {\n\t\titer.parents.Pop()\n\t}\n\treturn iter.limitIterator()\n}\n\n// First moves the iterator to the first key/value pair.  When there is only a\n// single key/value pair both First and Last will point to the same pair.\n// Returns false if there are no key/value pairs.\nfunc (iter *Iterator) First() bool {\n\t// Seek the start key if the iterator was created with one.  This will\n\t// result in either an exact match, the first greater key, or an\n\t// exhausted iterator if no such key exists.\n\titer.isNew = false\n\tif iter.startKey != nil {\n\t\treturn iter.seek(iter.startKey, true, true)\n\t}\n\n\t// The smallest key is in the left-most node.\n\titer.parents = parentStack{}\n\tfor node := iter.root; node != nil; node = node.left {\n\t\tif node.left == nil {\n\t\t\titer.node = node\n\t\t\treturn true\n\t\t}\n\t\titer.parents.Push(node)\n\t}\n\treturn false\n}\n\n// Last moves the iterator to the last key/value pair.  When there is only a\n// single key/value pair both First and Last will point to the same pair.\n// Returns false if there are no key/value pairs.\nfunc (iter *Iterator) Last() bool {\n\t// Seek the limit key if the iterator was created with one.  This will\n\t// result in the first key smaller than the limit key, or an exhausted\n\t// iterator if no such key exists.\n\titer.isNew = false\n\tif iter.limitKey != nil {\n\t\treturn iter.seek(iter.limitKey, false, false)\n\t}\n\n\t// The highest key is in the right-most node.\n\titer.parents = parentStack{}\n\tfor node := iter.root; node != nil; node = node.right {\n\t\tif node.right == nil {\n\t\t\titer.node = node\n\t\t\treturn true\n\t\t}\n\t\titer.parents.Push(node)\n\t}\n\treturn false\n}\n\n// Next moves the iterator to the next key/value pair and returns false when the\n// iterator is exhausted.  When invoked on a newly created iterator it will\n// position the iterator at the first item.\nfunc (iter *Iterator) Next() bool {\n\tif iter.isNew {\n\t\treturn iter.First()\n\t}\n\n\tif iter.node == nil {\n\t\treturn false\n\t}\n\n\t// Reseek the previous key without allowing for an exact match if a\n\t// force seek was requested.  This results in the key greater than the\n\t// previous one or an exhausted iterator if there is no such key.\n\tif seekKey := iter.seekKey; seekKey != nil {\n\t\titer.seekKey = nil\n\t\treturn iter.seek(seekKey, false, true)\n\t}\n\n\t// When there is no right node walk the parents until the parent's right\n\t// node is not equal to the previous child.  This will be the next node.\n\tif iter.node.right == nil {\n\t\tparent := iter.parents.Pop()\n\t\tfor parent != nil && parent.right == iter.node {\n\t\t\titer.node = parent\n\t\t\tparent = iter.parents.Pop()\n\t\t}\n\t\titer.node = parent\n\t\treturn iter.limitIterator()\n\t}\n\n\t// There is a right node, so the next node is the left-most node down\n\t// the right sub-tree.\n\titer.parents.Push(iter.node)\n\titer.node = iter.node.right\n\tfor node := iter.node.left; node != nil; node = node.left {\n\t\titer.parents.Push(iter.node)\n\t\titer.node = node\n\t}\n\treturn iter.limitIterator()\n}\n\n// Prev moves the iterator to the previous key/value pair and returns false when\n// the iterator is exhausted.  When invoked on a newly created iterator it will\n// position the iterator at the last item.\nfunc (iter *Iterator) Prev() bool {\n\tif iter.isNew {\n\t\treturn iter.Last()\n\t}\n\n\tif iter.node == nil {\n\t\treturn false\n\t}\n\n\t// Reseek the previous key without allowing for an exact match if a\n\t// force seek was requested.  This results in the key smaller than the\n\t// previous one or an exhausted iterator if there is no such key.\n\tif seekKey := iter.seekKey; seekKey != nil {\n\t\titer.seekKey = nil\n\t\treturn iter.seek(seekKey, false, false)\n\t}\n\n\t// When there is no left node walk the parents until the parent's left\n\t// node is not equal to the previous child.  This will be the previous\n\t// node.\n\tfor iter.node.left == nil {\n\t\tparent := iter.parents.Pop()\n\t\tfor parent != nil && parent.left == iter.node {\n\t\t\titer.node = parent\n\t\t\tparent = iter.parents.Pop()\n\t\t}\n\t\titer.node = parent\n\t\treturn iter.limitIterator()\n\t}\n\n\t// There is a left node, so the previous node is the right-most node\n\t// down the left sub-tree.\n\titer.parents.Push(iter.node)\n\titer.node = iter.node.left\n\tfor node := iter.node.right; node != nil; node = node.right {\n\t\titer.parents.Push(iter.node)\n\t\titer.node = node\n\t}\n\treturn iter.limitIterator()\n}\n\n// Seek moves the iterator to the first key/value pair with a key that is\n// greater than or equal to the given key and returns true if successful.\nfunc (iter *Iterator) Seek(key []byte) bool {\n\titer.isNew = false\n\treturn iter.seek(key, true, true)\n}\n\n// Key returns the key of the current key/value pair or nil when the iterator\n// is exhausted.  The caller should not modify the contents of the returned\n// slice.\nfunc (iter *Iterator) Key() []byte {\n\tif iter.node == nil {\n\t\treturn nil\n\t}\n\treturn iter.node.key\n}\n\n// Value returns the value of the current key/value pair or nil when the\n// iterator is exhausted.  The caller should not modify the contents of the\n// returned slice.\nfunc (iter *Iterator) Value() []byte {\n\tif iter.node == nil {\n\t\treturn nil\n\t}\n\treturn iter.node.value\n}\n\n// Valid indicates whether the iterator is positioned at a valid key/value pair.\n// It will be considered invalid when the iterator is newly created or exhausted.\nfunc (iter *Iterator) Valid() bool {\n\treturn iter.node != nil\n}\n\n// ForceReseek notifies the iterator that the underlying mutable treap has been\n// updated, so the next call to Prev or Next needs to reseek in order to allow\n// the iterator to continue working properly.\n//\n// NOTE: Calling this function when the iterator is associated with an immutable\n// treap has no effect as you would expect.\nfunc (iter *Iterator) ForceReseek() {\n\t// Nothing to do when the iterator is associated with an immutable\n\t// treap.\n\tif iter.t == nil {\n\t\treturn\n\t}\n\n\t// Update the iterator root to the mutable treap root in case it\n\t// changed.\n\titer.root = iter.t.root\n\n\t// Set the seek key to the current node.  This will force the Next/Prev\n\t// functions to reseek, and thus properly reconstruct the iterator, on\n\t// their next call.\n\tif iter.node == nil {\n\t\titer.seekKey = nil\n\t\treturn\n\t}\n\titer.seekKey = iter.node.key\n}\n\n// Iterator returns a new iterator for the mutable treap.  The newly returned\n// iterator is not pointing to a valid item until a call to one of the methods\n// to position it is made.\n//\n// The start key and limit key parameters cause the iterator to be limited to\n// a range of keys.  The start key is inclusive and the limit key is exclusive.\n// Either or both can be nil if the functionality is not desired.\n//\n// WARNING: The ForceSeek method must be called on the returned iterator if\n// the treap is mutated.  Failure to do so will cause the iterator to return\n// unexpected keys and/or values.\n//\n// For example:\n//\n//\titer := t.Iterator(nil, nil)\n//\tfor iter.Next() {\n//\t\tif someCondition {\n//\t\t\tt.Delete(iter.Key())\n//\t\t\titer.ForceReseek()\n//\t\t}\n//\t}\nfunc (t *Mutable) Iterator(startKey, limitKey []byte) *Iterator {\n\titer := &Iterator{\n\t\tt:        t,\n\t\troot:     t.root,\n\t\tisNew:    true,\n\t\tstartKey: startKey,\n\t\tlimitKey: limitKey,\n\t}\n\treturn iter\n}\n\n// Iterator returns a new iterator for the immutable treap.  The newly returned\n// iterator is not pointing to a valid item until a call to one of the methods\n// to position it is made.\n//\n// The start key and limit key parameters cause the iterator to be limited to\n// a range of keys.  The start key is inclusive and the limit key is exclusive.\n// Either or both can be nil if the functionality is not desired.\nfunc (t *Immutable) Iterator(startKey, limitKey []byte) *Iterator {\n\titer := &Iterator{\n\t\troot:     t.root,\n\t\tisNew:    true,\n\t\tstartKey: startKey,\n\t\tlimitKey: limitKey,\n\t}\n\treturn iter\n}\n"
  },
  {
    "path": "database/internal/treap/treapiter_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage treap\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"testing\"\n)\n\n// TestMutableIterator ensures that the general behavior of mutable treap\n// iterators is as expected including tests for first, last, ordered and reverse\n// ordered iteration, limiting the range, seeking, and initially unpositioned.\nfunc TestMutableIterator(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tnumKeys       int\n\t\tstep          int\n\t\tstartKey      []byte\n\t\tlimitKey      []byte\n\t\texpectedFirst []byte\n\t\texpectedLast  []byte\n\t\tseekKey       []byte\n\t\texpectedSeek  []byte\n\t}{\n\t\t// No range limits.  Values are the set (0, 1, 2, ..., 49).\n\t\t// Seek existing value.\n\t\t{\n\t\t\tnumKeys:       50,\n\t\t\tstep:          1,\n\t\t\texpectedFirst: serializeUint32(0),\n\t\t\texpectedLast:  serializeUint32(49),\n\t\t\tseekKey:       serializeUint32(12),\n\t\t\texpectedSeek:  serializeUint32(12),\n\t\t},\n\n\t\t// Limited to range [24, end].  Values are the set\n\t\t// (0, 2, 4, ..., 48).  Seek value that doesn't exist and is\n\t\t// greater than largest existing key.\n\t\t{\n\t\t\tnumKeys:       50,\n\t\t\tstep:          2,\n\t\t\tstartKey:      serializeUint32(24),\n\t\t\texpectedFirst: serializeUint32(24),\n\t\t\texpectedLast:  serializeUint32(48),\n\t\t\tseekKey:       serializeUint32(49),\n\t\t\texpectedSeek:  nil,\n\t\t},\n\n\t\t// Limited to range [start, 25).  Values are the set\n\t\t// (0, 3, 6, ..., 48).  Seek value that doesn't exist but is\n\t\t// before an existing value within the range.\n\t\t{\n\t\t\tnumKeys:       50,\n\t\t\tstep:          3,\n\t\t\tlimitKey:      serializeUint32(25),\n\t\t\texpectedFirst: serializeUint32(0),\n\t\t\texpectedLast:  serializeUint32(24),\n\t\t\tseekKey:       serializeUint32(17),\n\t\t\texpectedSeek:  serializeUint32(18),\n\t\t},\n\n\t\t// Limited to range [10, 21).  Values are the set\n\t\t// (0, 4, ..., 48).  Seek value that exists, but is before the\n\t\t// minimum allowed range.\n\t\t{\n\t\t\tnumKeys:       50,\n\t\t\tstep:          4,\n\t\t\tstartKey:      serializeUint32(10),\n\t\t\tlimitKey:      serializeUint32(21),\n\t\t\texpectedFirst: serializeUint32(12),\n\t\t\texpectedLast:  serializeUint32(20),\n\t\t\tseekKey:       serializeUint32(4),\n\t\t\texpectedSeek:  nil,\n\t\t},\n\n\t\t// Limited by prefix {0,0,0}, range [{0,0,0}, {0,0,1}).\n\t\t// Since it's a bytewise compare,  {0,0,0,...} < {0,0,1}.\n\t\t// Seek existing value within the allowed range.\n\t\t{\n\t\t\tnumKeys:       300,\n\t\t\tstep:          1,\n\t\t\tstartKey:      []byte{0x00, 0x00, 0x00},\n\t\t\tlimitKey:      []byte{0x00, 0x00, 0x01},\n\t\t\texpectedFirst: serializeUint32(0),\n\t\t\texpectedLast:  serializeUint32(255),\n\t\t\tseekKey:       serializeUint32(100),\n\t\t\texpectedSeek:  serializeUint32(100),\n\t\t},\n\t}\n\ntestLoop:\n\tfor i, test := range tests {\n\t\t// Insert a bunch of keys.\n\t\ttestTreap := NewMutable()\n\t\tfor i := 0; i < test.numKeys; i += test.step {\n\t\t\tkey := serializeUint32(uint32(i))\n\t\t\ttestTreap.Put(key, key)\n\t\t}\n\n\t\t// Create new iterator limited by the test params.\n\t\titer := testTreap.Iterator(test.startKey, test.limitKey)\n\n\t\t// Ensure the first item is accurate.\n\t\thasFirst := iter.First()\n\t\tif !hasFirst && test.expectedFirst != nil {\n\t\t\tt.Errorf(\"First #%d: unexpected exhausted iterator\", i)\n\t\t\tcontinue\n\t\t}\n\t\tgotKey := iter.Key()\n\t\tif !bytes.Equal(gotKey, test.expectedFirst) {\n\t\t\tt.Errorf(\"First.Key #%d: unexpected key - got %x, \"+\n\t\t\t\t\"want %x\", i, gotKey, test.expectedFirst)\n\t\t\tcontinue\n\t\t}\n\t\tgotVal := iter.Value()\n\t\tif !bytes.Equal(gotVal, test.expectedFirst) {\n\t\t\tt.Errorf(\"First.Value #%d: unexpected value - got %x, \"+\n\t\t\t\t\"want %x\", i, gotVal, test.expectedFirst)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the iterator gives the expected items in order.\n\t\tcurNum := binary.BigEndian.Uint32(test.expectedFirst)\n\t\tfor iter.Next() {\n\t\t\tcurNum += uint32(test.step)\n\n\t\t\t// Ensure key is as expected.\n\t\t\tgotKey := iter.Key()\n\t\t\texpectedKey := serializeUint32(curNum)\n\t\t\tif !bytes.Equal(gotKey, expectedKey) {\n\t\t\t\tt.Errorf(\"iter.Key #%d (%d): unexpected key - \"+\n\t\t\t\t\t\"got %x, want %x\", i, curNum, gotKey,\n\t\t\t\t\texpectedKey)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\n\t\t\t// Ensure value is as expected.\n\t\t\tgotVal := iter.Value()\n\t\t\tif !bytes.Equal(gotVal, expectedKey) {\n\t\t\t\tt.Errorf(\"iter.Value #%d (%d): unexpected \"+\n\t\t\t\t\t\"value - got %x, want %x\", i, curNum,\n\t\t\t\t\tgotVal, expectedKey)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\t\t}\n\n\t\t// Ensure iterator is exhausted.\n\t\tif iter.Valid() {\n\t\t\tt.Errorf(\"Valid #%d: iterator should be exhausted\", i)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the last item is accurate.\n\t\thasLast := iter.Last()\n\t\tif !hasLast && test.expectedLast != nil {\n\t\t\tt.Errorf(\"Last #%d: unexpected exhausted iterator\", i)\n\t\t\tcontinue\n\t\t}\n\t\tgotKey = iter.Key()\n\t\tif !bytes.Equal(gotKey, test.expectedLast) {\n\t\t\tt.Errorf(\"Last.Key #%d: unexpected key - got %x, \"+\n\t\t\t\t\"want %x\", i, gotKey, test.expectedLast)\n\t\t\tcontinue\n\t\t}\n\t\tgotVal = iter.Value()\n\t\tif !bytes.Equal(gotVal, test.expectedLast) {\n\t\t\tt.Errorf(\"Last.Value #%d: unexpected value - got %x, \"+\n\t\t\t\t\"want %x\", i, gotVal, test.expectedLast)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the iterator gives the expected items in reverse\n\t\t// order.\n\t\tcurNum = binary.BigEndian.Uint32(test.expectedLast)\n\t\tfor iter.Prev() {\n\t\t\tcurNum -= uint32(test.step)\n\n\t\t\t// Ensure key is as expected.\n\t\t\tgotKey := iter.Key()\n\t\t\texpectedKey := serializeUint32(curNum)\n\t\t\tif !bytes.Equal(gotKey, expectedKey) {\n\t\t\t\tt.Errorf(\"iter.Key #%d (%d): unexpected key - \"+\n\t\t\t\t\t\"got %x, want %x\", i, curNum, gotKey,\n\t\t\t\t\texpectedKey)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\n\t\t\t// Ensure value is as expected.\n\t\t\tgotVal := iter.Value()\n\t\t\tif !bytes.Equal(gotVal, expectedKey) {\n\t\t\t\tt.Errorf(\"iter.Value #%d (%d): unexpected \"+\n\t\t\t\t\t\"value - got %x, want %x\", i, curNum,\n\t\t\t\t\tgotVal, expectedKey)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\t\t}\n\n\t\t// Ensure iterator is exhausted.\n\t\tif iter.Valid() {\n\t\t\tt.Errorf(\"Valid #%d: iterator should be exhausted\", i)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Seek to the provided key.\n\t\tseekValid := iter.Seek(test.seekKey)\n\t\tif !seekValid && test.expectedSeek != nil {\n\t\t\tt.Errorf(\"Seek #%d: unexpected exhausted iterator\", i)\n\t\t\tcontinue\n\t\t}\n\t\tgotKey = iter.Key()\n\t\tif !bytes.Equal(gotKey, test.expectedSeek) {\n\t\t\tt.Errorf(\"Seek.Key #%d: unexpected key - got %x, \"+\n\t\t\t\t\"want %x\", i, gotKey, test.expectedSeek)\n\t\t\tcontinue\n\t\t}\n\t\tgotVal = iter.Value()\n\t\tif !bytes.Equal(gotVal, test.expectedSeek) {\n\t\t\tt.Errorf(\"Seek.Value #%d: unexpected value - got %x, \"+\n\t\t\t\t\"want %x\", i, gotVal, test.expectedSeek)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Recreate the iterator and ensure calling Next on it before it\n\t\t// has been positioned gives the first element.\n\t\titer = testTreap.Iterator(test.startKey, test.limitKey)\n\t\thasNext := iter.Next()\n\t\tif !hasNext && test.expectedFirst != nil {\n\t\t\tt.Errorf(\"Next #%d: unexpected exhausted iterator\", i)\n\t\t\tcontinue\n\t\t}\n\t\tgotKey = iter.Key()\n\t\tif !bytes.Equal(gotKey, test.expectedFirst) {\n\t\t\tt.Errorf(\"Next.Key #%d: unexpected key - got %x, \"+\n\t\t\t\t\"want %x\", i, gotKey, test.expectedFirst)\n\t\t\tcontinue\n\t\t}\n\t\tgotVal = iter.Value()\n\t\tif !bytes.Equal(gotVal, test.expectedFirst) {\n\t\t\tt.Errorf(\"Next.Value #%d: unexpected value - got %x, \"+\n\t\t\t\t\"want %x\", i, gotVal, test.expectedFirst)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Recreate the iterator and ensure calling Prev on it before it\n\t\t// has been positioned gives the first element.\n\t\titer = testTreap.Iterator(test.startKey, test.limitKey)\n\t\thasPrev := iter.Prev()\n\t\tif !hasPrev && test.expectedLast != nil {\n\t\t\tt.Errorf(\"Prev #%d: unexpected exhausted iterator\", i)\n\t\t\tcontinue\n\t\t}\n\t\tgotKey = iter.Key()\n\t\tif !bytes.Equal(gotKey, test.expectedLast) {\n\t\t\tt.Errorf(\"Prev.Key #%d: unexpected key - got %x, \"+\n\t\t\t\t\"want %x\", i, gotKey, test.expectedLast)\n\t\t\tcontinue\n\t\t}\n\t\tgotVal = iter.Value()\n\t\tif !bytes.Equal(gotVal, test.expectedLast) {\n\t\t\tt.Errorf(\"Next.Value #%d: unexpected value - got %x, \"+\n\t\t\t\t\"want %x\", i, gotVal, test.expectedLast)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMutableEmptyIterator ensures that the various functions behave as\n// expected when a mutable treap is empty.\nfunc TestMutableEmptyIterator(t *testing.T) {\n\tt.Parallel()\n\n\t// Create iterator against empty treap.\n\ttestTreap := NewMutable()\n\titer := testTreap.Iterator(nil, nil)\n\n\t// Ensure Valid on empty iterator reports it as exhausted.\n\tif iter.Valid() {\n\t\tt.Fatal(\"Valid: iterator should be exhausted\")\n\t}\n\n\t// Ensure First and Last on empty iterator report it as exhausted.\n\tif iter.First() {\n\t\tt.Fatal(\"First: iterator should be exhausted\")\n\t}\n\tif iter.Last() {\n\t\tt.Fatal(\"Last: iterator should be exhausted\")\n\t}\n\n\t// Ensure Next and Prev on empty iterator report it as exhausted.\n\tif iter.Next() {\n\t\tt.Fatal(\"Next: iterator should be exhausted\")\n\t}\n\tif iter.Prev() {\n\t\tt.Fatal(\"Prev: iterator should be exhausted\")\n\t}\n\n\t// Ensure Key and Value on empty iterator are nil.\n\tif gotKey := iter.Key(); gotKey != nil {\n\t\tt.Fatalf(\"Key: should be nil - got %q\", gotKey)\n\t}\n\tif gotVal := iter.Value(); gotVal != nil {\n\t\tt.Fatalf(\"Value: should be nil - got %q\", gotVal)\n\t}\n\n\t// Ensure Next and Prev report exhausted after forcing a reseek on an\n\t// empty iterator.\n\titer.ForceReseek()\n\tif iter.Next() {\n\t\tt.Fatal(\"Next: iterator should be exhausted\")\n\t}\n\titer.ForceReseek()\n\tif iter.Prev() {\n\t\tt.Fatal(\"Prev: iterator should be exhausted\")\n\t}\n}\n\n// TestIteratorUpdates ensures that issuing a call to ForceReseek on an iterator\n// that had the underlying mutable treap updated works as expected.\nfunc TestIteratorUpdates(t *testing.T) {\n\tt.Parallel()\n\n\t// Create a new treap with various values inserted in no particular\n\t// order.  The resulting keys are the set (2, 4, 7, 11, 18, 25).\n\ttestTreap := NewMutable()\n\ttestTreap.Put(serializeUint32(7), nil)\n\ttestTreap.Put(serializeUint32(2), nil)\n\ttestTreap.Put(serializeUint32(18), nil)\n\ttestTreap.Put(serializeUint32(11), nil)\n\ttestTreap.Put(serializeUint32(25), nil)\n\ttestTreap.Put(serializeUint32(4), nil)\n\n\t// Create an iterator against the treap with a range that excludes the\n\t// lowest and highest entries.  The limited set is then (4, 7, 11, 18)\n\titer := testTreap.Iterator(serializeUint32(3), serializeUint32(25))\n\n\t// Delete a key from the middle of the range and notify the iterator to\n\t// force a reseek.\n\ttestTreap.Delete(serializeUint32(11))\n\titer.ForceReseek()\n\n\t// Ensure that calling Next on the iterator after the forced reseek\n\t// gives the expected key.  The limited set of keys at this point is\n\t// (4, 7, 18) and the iterator has not yet been positioned.\n\tif !iter.Next() {\n\t\tt.Fatal(\"ForceReseek.Next: unexpected exhausted iterator\")\n\t}\n\twantKey := serializeUint32(4)\n\tgotKey := iter.Key()\n\tif !bytes.Equal(gotKey, wantKey) {\n\t\tt.Fatalf(\"ForceReseek.Key: unexpected key - got %x, want %x\",\n\t\t\tgotKey, wantKey)\n\t}\n\n\t// Delete the key the iterator is currently position at and notify the\n\t// iterator to force a reseek.\n\ttestTreap.Delete(serializeUint32(4))\n\titer.ForceReseek()\n\n\t// Ensure that calling Next on the iterator after the forced reseek\n\t// gives the expected key.  The limited set of keys at this point is\n\t// (7, 18) and the iterator is positioned at a deleted entry before 7.\n\tif !iter.Next() {\n\t\tt.Fatal(\"ForceReseek.Next: unexpected exhausted iterator\")\n\t}\n\twantKey = serializeUint32(7)\n\tgotKey = iter.Key()\n\tif !bytes.Equal(gotKey, wantKey) {\n\t\tt.Fatalf(\"ForceReseek.Key: unexpected key - got %x, want %x\",\n\t\t\tgotKey, wantKey)\n\t}\n\n\t// Add a key before the current key the iterator is position at and\n\t// notify the iterator to force a reseek.\n\ttestTreap.Put(serializeUint32(4), nil)\n\titer.ForceReseek()\n\n\t// Ensure that calling Prev on the iterator after the forced reseek\n\t// gives the expected key.  The limited set of keys at this point is\n\t// (4, 7, 18) and the iterator is positioned at 7.\n\tif !iter.Prev() {\n\t\tt.Fatal(\"ForceReseek.Prev: unexpected exhausted iterator\")\n\t}\n\twantKey = serializeUint32(4)\n\tgotKey = iter.Key()\n\tif !bytes.Equal(gotKey, wantKey) {\n\t\tt.Fatalf(\"ForceReseek.Key: unexpected key - got %x, want %x\",\n\t\t\tgotKey, wantKey)\n\t}\n\n\t// Delete the next key the iterator would ordinarily move to then notify\n\t// the iterator to force a reseek.\n\ttestTreap.Delete(serializeUint32(7))\n\titer.ForceReseek()\n\n\t// Ensure that calling Next on the iterator after the forced reseek\n\t// gives the expected key.  The limited set of keys at this point is\n\t// (4, 18) and the iterator is positioned at 4.\n\tif !iter.Next() {\n\t\tt.Fatal(\"ForceReseek.Next: unexpected exhausted iterator\")\n\t}\n\twantKey = serializeUint32(18)\n\tgotKey = iter.Key()\n\tif !bytes.Equal(gotKey, wantKey) {\n\t\tt.Fatalf(\"ForceReseek.Key: unexpected key - got %x, want %x\",\n\t\t\tgotKey, wantKey)\n\t}\n}\n\n// TestImmutableIterator ensures that the general behavior of immutable treap\n// iterators is as expected including tests for first, last, ordered and reverse\n// ordered iteration, limiting the range, seeking, and initially unpositioned.\nfunc TestImmutableIterator(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tnumKeys       int\n\t\tstep          int\n\t\tstartKey      []byte\n\t\tlimitKey      []byte\n\t\texpectedFirst []byte\n\t\texpectedLast  []byte\n\t\tseekKey       []byte\n\t\texpectedSeek  []byte\n\t}{\n\t\t// No range limits.  Values are the set (0, 1, 2, ..., 49).\n\t\t// Seek existing value.\n\t\t{\n\t\t\tnumKeys:       50,\n\t\t\tstep:          1,\n\t\t\texpectedFirst: serializeUint32(0),\n\t\t\texpectedLast:  serializeUint32(49),\n\t\t\tseekKey:       serializeUint32(12),\n\t\t\texpectedSeek:  serializeUint32(12),\n\t\t},\n\n\t\t// Limited to range [24, end].  Values are the set\n\t\t// (0, 2, 4, ..., 48).  Seek value that doesn't exist and is\n\t\t// greater than largest existing key.\n\t\t{\n\t\t\tnumKeys:       50,\n\t\t\tstep:          2,\n\t\t\tstartKey:      serializeUint32(24),\n\t\t\texpectedFirst: serializeUint32(24),\n\t\t\texpectedLast:  serializeUint32(48),\n\t\t\tseekKey:       serializeUint32(49),\n\t\t\texpectedSeek:  nil,\n\t\t},\n\n\t\t// Limited to range [start, 25).  Values are the set\n\t\t// (0, 3, 6, ..., 48).  Seek value that doesn't exist but is\n\t\t// before an existing value within the range.\n\t\t{\n\t\t\tnumKeys:       50,\n\t\t\tstep:          3,\n\t\t\tlimitKey:      serializeUint32(25),\n\t\t\texpectedFirst: serializeUint32(0),\n\t\t\texpectedLast:  serializeUint32(24),\n\t\t\tseekKey:       serializeUint32(17),\n\t\t\texpectedSeek:  serializeUint32(18),\n\t\t},\n\n\t\t// Limited to range [10, 21).  Values are the set\n\t\t// (0, 4, ..., 48).  Seek value that exists, but is before the\n\t\t// minimum allowed range.\n\t\t{\n\t\t\tnumKeys:       50,\n\t\t\tstep:          4,\n\t\t\tstartKey:      serializeUint32(10),\n\t\t\tlimitKey:      serializeUint32(21),\n\t\t\texpectedFirst: serializeUint32(12),\n\t\t\texpectedLast:  serializeUint32(20),\n\t\t\tseekKey:       serializeUint32(4),\n\t\t\texpectedSeek:  nil,\n\t\t},\n\n\t\t// Limited by prefix {0,0,0}, range [{0,0,0}, {0,0,1}).\n\t\t// Since it's a bytewise compare,  {0,0,0,...} < {0,0,1}.\n\t\t// Seek existing value within the allowed range.\n\t\t{\n\t\t\tnumKeys:       300,\n\t\t\tstep:          1,\n\t\t\tstartKey:      []byte{0x00, 0x00, 0x00},\n\t\t\tlimitKey:      []byte{0x00, 0x00, 0x01},\n\t\t\texpectedFirst: serializeUint32(0),\n\t\t\texpectedLast:  serializeUint32(255),\n\t\t\tseekKey:       serializeUint32(100),\n\t\t\texpectedSeek:  serializeUint32(100),\n\t\t},\n\t}\n\ntestLoop:\n\tfor i, test := range tests {\n\t\t// Insert a bunch of keys.\n\t\ttestTreap := NewImmutable()\n\t\tfor i := 0; i < test.numKeys; i += test.step {\n\t\t\tkey := serializeUint32(uint32(i))\n\t\t\ttestTreap = testTreap.Put(key, key)\n\t\t}\n\n\t\t// Create new iterator limited by the test params.\n\t\titer := testTreap.Iterator(test.startKey, test.limitKey)\n\n\t\t// Ensure the first item is accurate.\n\t\thasFirst := iter.First()\n\t\tif !hasFirst && test.expectedFirst != nil {\n\t\t\tt.Errorf(\"First #%d: unexpected exhausted iterator\", i)\n\t\t\tcontinue\n\t\t}\n\t\tgotKey := iter.Key()\n\t\tif !bytes.Equal(gotKey, test.expectedFirst) {\n\t\t\tt.Errorf(\"First.Key #%d: unexpected key - got %x, \"+\n\t\t\t\t\"want %x\", i, gotKey, test.expectedFirst)\n\t\t\tcontinue\n\t\t}\n\t\tgotVal := iter.Value()\n\t\tif !bytes.Equal(gotVal, test.expectedFirst) {\n\t\t\tt.Errorf(\"First.Value #%d: unexpected value - got %x, \"+\n\t\t\t\t\"want %x\", i, gotVal, test.expectedFirst)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the iterator gives the expected items in order.\n\t\tcurNum := binary.BigEndian.Uint32(test.expectedFirst)\n\t\tfor iter.Next() {\n\t\t\tcurNum += uint32(test.step)\n\n\t\t\t// Ensure key is as expected.\n\t\t\tgotKey := iter.Key()\n\t\t\texpectedKey := serializeUint32(curNum)\n\t\t\tif !bytes.Equal(gotKey, expectedKey) {\n\t\t\t\tt.Errorf(\"iter.Key #%d (%d): unexpected key - \"+\n\t\t\t\t\t\"got %x, want %x\", i, curNum, gotKey,\n\t\t\t\t\texpectedKey)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\n\t\t\t// Ensure value is as expected.\n\t\t\tgotVal := iter.Value()\n\t\t\tif !bytes.Equal(gotVal, expectedKey) {\n\t\t\t\tt.Errorf(\"iter.Value #%d (%d): unexpected \"+\n\t\t\t\t\t\"value - got %x, want %x\", i, curNum,\n\t\t\t\t\tgotVal, expectedKey)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\t\t}\n\n\t\t// Ensure iterator is exhausted.\n\t\tif iter.Valid() {\n\t\t\tt.Errorf(\"Valid #%d: iterator should be exhausted\", i)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the last item is accurate.\n\t\thasLast := iter.Last()\n\t\tif !hasLast && test.expectedLast != nil {\n\t\t\tt.Errorf(\"Last #%d: unexpected exhausted iterator\", i)\n\t\t\tcontinue\n\t\t}\n\t\tgotKey = iter.Key()\n\t\tif !bytes.Equal(gotKey, test.expectedLast) {\n\t\t\tt.Errorf(\"Last.Key #%d: unexpected key - got %x, \"+\n\t\t\t\t\"want %x\", i, gotKey, test.expectedLast)\n\t\t\tcontinue\n\t\t}\n\t\tgotVal = iter.Value()\n\t\tif !bytes.Equal(gotVal, test.expectedLast) {\n\t\t\tt.Errorf(\"Last.Value #%d: unexpected value - got %x, \"+\n\t\t\t\t\"want %x\", i, gotVal, test.expectedLast)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the iterator gives the expected items in reverse\n\t\t// order.\n\t\tcurNum = binary.BigEndian.Uint32(test.expectedLast)\n\t\tfor iter.Prev() {\n\t\t\tcurNum -= uint32(test.step)\n\n\t\t\t// Ensure key is as expected.\n\t\t\tgotKey := iter.Key()\n\t\t\texpectedKey := serializeUint32(curNum)\n\t\t\tif !bytes.Equal(gotKey, expectedKey) {\n\t\t\t\tt.Errorf(\"iter.Key #%d (%d): unexpected key - \"+\n\t\t\t\t\t\"got %x, want %x\", i, curNum, gotKey,\n\t\t\t\t\texpectedKey)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\n\t\t\t// Ensure value is as expected.\n\t\t\tgotVal := iter.Value()\n\t\t\tif !bytes.Equal(gotVal, expectedKey) {\n\t\t\t\tt.Errorf(\"iter.Value #%d (%d): unexpected \"+\n\t\t\t\t\t\"value - got %x, want %x\", i, curNum,\n\t\t\t\t\tgotVal, expectedKey)\n\t\t\t\tcontinue testLoop\n\t\t\t}\n\t\t}\n\n\t\t// Ensure iterator is exhausted.\n\t\tif iter.Valid() {\n\t\t\tt.Errorf(\"Valid #%d: iterator should be exhausted\", i)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Seek to the provided key.\n\t\tseekValid := iter.Seek(test.seekKey)\n\t\tif !seekValid && test.expectedSeek != nil {\n\t\t\tt.Errorf(\"Seek #%d: unexpected exhausted iterator\", i)\n\t\t\tcontinue\n\t\t}\n\t\tgotKey = iter.Key()\n\t\tif !bytes.Equal(gotKey, test.expectedSeek) {\n\t\t\tt.Errorf(\"Seek.Key #%d: unexpected key - got %x, \"+\n\t\t\t\t\"want %x\", i, gotKey, test.expectedSeek)\n\t\t\tcontinue\n\t\t}\n\t\tgotVal = iter.Value()\n\t\tif !bytes.Equal(gotVal, test.expectedSeek) {\n\t\t\tt.Errorf(\"Seek.Value #%d: unexpected value - got %x, \"+\n\t\t\t\t\"want %x\", i, gotVal, test.expectedSeek)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Recreate the iterator and ensure calling Next on it before it\n\t\t// has been positioned gives the first element.\n\t\titer = testTreap.Iterator(test.startKey, test.limitKey)\n\t\thasNext := iter.Next()\n\t\tif !hasNext && test.expectedFirst != nil {\n\t\t\tt.Errorf(\"Next #%d: unexpected exhausted iterator\", i)\n\t\t\tcontinue\n\t\t}\n\t\tgotKey = iter.Key()\n\t\tif !bytes.Equal(gotKey, test.expectedFirst) {\n\t\t\tt.Errorf(\"Next.Key #%d: unexpected key - got %x, \"+\n\t\t\t\t\"want %x\", i, gotKey, test.expectedFirst)\n\t\t\tcontinue\n\t\t}\n\t\tgotVal = iter.Value()\n\t\tif !bytes.Equal(gotVal, test.expectedFirst) {\n\t\t\tt.Errorf(\"Next.Value #%d: unexpected value - got %x, \"+\n\t\t\t\t\"want %x\", i, gotVal, test.expectedFirst)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Recreate the iterator and ensure calling Prev on it before it\n\t\t// has been positioned gives the first element.\n\t\titer = testTreap.Iterator(test.startKey, test.limitKey)\n\t\thasPrev := iter.Prev()\n\t\tif !hasPrev && test.expectedLast != nil {\n\t\t\tt.Errorf(\"Prev #%d: unexpected exhausted iterator\", i)\n\t\t\tcontinue\n\t\t}\n\t\tgotKey = iter.Key()\n\t\tif !bytes.Equal(gotKey, test.expectedLast) {\n\t\t\tt.Errorf(\"Prev.Key #%d: unexpected key - got %x, \"+\n\t\t\t\t\"want %x\", i, gotKey, test.expectedLast)\n\t\t\tcontinue\n\t\t}\n\t\tgotVal = iter.Value()\n\t\tif !bytes.Equal(gotVal, test.expectedLast) {\n\t\t\tt.Errorf(\"Next.Value #%d: unexpected value - got %x, \"+\n\t\t\t\t\"want %x\", i, gotVal, test.expectedLast)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestImmutableEmptyIterator ensures that the various functions behave as\n// expected when an immutable treap is empty.\nfunc TestImmutableEmptyIterator(t *testing.T) {\n\tt.Parallel()\n\n\t// Create iterator against empty treap.\n\ttestTreap := NewImmutable()\n\titer := testTreap.Iterator(nil, nil)\n\n\t// Ensure Valid on empty iterator reports it as exhausted.\n\tif iter.Valid() {\n\t\tt.Fatal(\"Valid: iterator should be exhausted\")\n\t}\n\n\t// Ensure First and Last on empty iterator report it as exhausted.\n\tif iter.First() {\n\t\tt.Fatal(\"First: iterator should be exhausted\")\n\t}\n\tif iter.Last() {\n\t\tt.Fatal(\"Last: iterator should be exhausted\")\n\t}\n\n\t// Ensure Next and Prev on empty iterator report it as exhausted.\n\tif iter.Next() {\n\t\tt.Fatal(\"Next: iterator should be exhausted\")\n\t}\n\tif iter.Prev() {\n\t\tt.Fatal(\"Prev: iterator should be exhausted\")\n\t}\n\n\t// Ensure Key and Value on empty iterator are nil.\n\tif gotKey := iter.Key(); gotKey != nil {\n\t\tt.Fatalf(\"Key: should be nil - got %q\", gotKey)\n\t}\n\tif gotVal := iter.Value(); gotVal != nil {\n\t\tt.Fatalf(\"Value: should be nil - got %q\", gotVal)\n\t}\n\n\t// Ensure calling ForceReseek on an immutable treap iterator does not\n\t// cause any issues since it only applies to mutable treap iterators.\n\titer.ForceReseek()\n\tif iter.Next() {\n\t\tt.Fatal(\"Next: iterator should be exhausted\")\n\t}\n\titer.ForceReseek()\n\tif iter.Prev() {\n\t\tt.Fatal(\"Prev: iterator should be exhausted\")\n\t}\n}\n"
  },
  {
    "path": "database/log.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage database\n\nimport (\n\t\"github.com/btcsuite/btclog\"\n)\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until UseLogger is called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n\n\t// Update the logger for the registered drivers.\n\tfor _, drv := range drivers {\n\t\tif drv.UseLogger != nil {\n\t\t\tdrv.UseLogger(logger)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "doc.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nbtcd is a full-node bitcoin implementation written in Go.\n\nThe default options are sane for most users.  This means btcd will work 'out of\nthe box' for most users.  However, there are also a wide variety of flags that\ncan be used to control it.\n\nThe following section provides a usage overview which enumerates the flags.  An\ninteresting point to note is that the long form of all of these options\n(except -C) can be specified in a configuration file that is automatically\nparsed when btcd starts up.  By default, the configuration file is located at\n~/.btcd/btcd.conf on POSIX-style operating systems and %LOCALAPPDATA%\\btcd\\btcd.conf\non Windows.  The -C (--configfile) flag, as shown below, can be used to override\nthis location.\n\nUsage:\n\n\tbtcd [OPTIONS]\n\nApplication Options:\n\n\t    --addcheckpoint=        Add a custom checkpoint.  Format:\n\t                            '<height>:<hash>'\n\t-a, --addpeer=              Add a peer to connect with at startup\n\t    --addrindex             Maintain a full address-based transaction index\n\t                            which makes the searchrawtransactions RPC\n\t                            available\n\t    --banduration=          How long to ban misbehaving peers.  Valid time\n\t                            units are {s, m, h}.  Minimum 1 second (default:\n\t                            24h0m0s)\n\t    --banthreshold=         Maximum allowed ban score before disconnecting\n\t                            and banning misbehaving peers. (default: 100)\n\t    --blockmaxsize=         Maximum block size in bytes to be used when\n\t                            creating a block (default: 750000)\n\t    --blockminsize=         Minimum block size in bytes to be used when\n\t                            creating a block\n\t    --blockmaxweight=       Maximum block weight to be used when creating a\n\t                            block (default: 3000000)\n\t    --blockminweight=       Minimum block weight to be used when creating a\n\t                            block\n\t    --blockprioritysize=    Size in bytes for high-priority/low-fee\n\t                            transactions when creating a block (default:\n\t                            50000)\n\t    --blocksonly            Do not accept transactions from remote peers.\n\t-C, --configfile=           Path to configuration file\n\t    --connect=              Connect only to the specified peers at startup\n\t    --cpuprofile=           Write CPU profile to the specified file\n\t-b, --datadir=              Directory to store data\n\t    --dbtype=               Database backend to use for the Block Chain\n\t                            (default: ffldb)\n\t-d, --debuglevel=           Logging level for all subsystems {trace, debug,\n\t                            info, warn, error, critical} -- You may also\n\t                            specify\n\t                            <subsystem>=<level>,<subsystem2>=<level>,... to\n\t                            set the log level for individual subsystems --\n\t                            Use show to list available subsystems (default:\n\t                            info)\n\t    --dropaddrindex         Deletes the address-based transaction index from\n\t                            the database on start up and then exits.\n\t    --dropcfindex           Deletes the index used for committed filtering\n\t                            (CF) support from the database on start up and\n\t                            then exits.\n\t    --droptxindex           Deletes the hash-based transaction index from the\n\t                            database on start up and then exits.\n\t    --externalip=           Add an ip to the list of local addresses we claim\n\t                            to listen on to peers\n\t    --generate              Generate (mine) bitcoins using the CPU\n\t    --limitfreerelay=       Limit relay of transactions with no transaction\n\t                            fee to the given amount in thousands of bytes per\n\t                            minute (default: 15)\n\t    --listen=               Add an interface/port to listen for connections\n\t                            (default all interfaces port: 8333, testnet:\n\t                            18333, signet: 38333)\n\t    --logdir=               Directory to log output\n\t    --maxorphantx=          Max number of orphan transactions to keep in\n\t                            memory (default: 100)\n\t    --maxpeers=             Max number of inbound and outbound peers\n\t                            (default: 125)\n\t    --miningaddr=           Add the specified payment address to the list of\n\t                            addresses to use for generated blocks -- At least\n\t                            one address is required if the generate option is\n\t                            set\n\t    --minrelaytxfee=        The minimum transaction fee in BTC/kB to be\n\t                            considered a non-zero fee. (default: 1e-05)\n\t    --nobanning             Disable banning of misbehaving peers\n\t    --nocfilters            Disable committed filtering (CF) support\n\t    --nocheckpoints         Disable built-in checkpoints.  Don't do this\n\t                            unless you know what you're doing.\n\t    --nodnsseed             Disable DNS seeding for peers\n\t    --nolisten              Disable listening for incoming connections --\n\t                            NOTE: Listening is automatically disabled if the\n\t                            --connect or --proxy options are used without\n\t                            also specifying listen interfaces via --listen\n\t    --noonion               Disable connecting to tor hidden services\n\t    --nopeerbloomfilters    Disable bloom filtering support\n\t    --norelaypriority       Do not require free or low-fee transactions to\n\t                            have high priority for relaying\n\t    --norpc                 Disable built-in RPC server -- NOTE: The RPC\n\t                            server is disabled by default if no\n\t                            rpcuser/rpcpass or rpclimituser/rpclimitpass is\n\t                            specified\n\t    --notls                 Disable TLS for the RPC server -- NOTE: This is\n\t                            only allowed if the RPC server is bound to\n\t                            localhost\n\t    --onion=                Connect to tor hidden services via SOCKS5 proxy\n\t                            (eg. 127.0.0.1:9050)\n\t    --onionpass=            Password for onion proxy server\n\t    --onionuser=            Username for onion proxy server\n\t    --profile=              Enable HTTP profiling on given port -- NOTE port\n\t                            must be between 1024 and 65536\n\t    --proxy=                Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)\n\t    --proxypass=            Password for proxy server\n\t    --proxyuser=            Username for proxy server\n\t    --regtest               Use the regression test network\n\t    --rejectnonstd          Reject non-standard transactions regardless of\n\t                            the default settings for the active network.\n\t    --relaynonstd           Relay non-standard transactions regardless of the\n\t                            default settings for the active network.\n\t    --rpccert=              File containing the certificate file\n\t    --rpckey=               File containing the certificate key\n\t    --rpclimitpass=         Password for limited RPC connections\n\t    --rpclimituser=         Username for limited RPC connections\n\t    --rpclisten=            Add an interface/port to listen for RPC\n\t                            connections (default port: 8334, testnet: 18334)\n\t    --rpcmaxclients=        Max number of RPC clients for standard\n\t                            connections (default: 10)\n\t    --rpcmaxconcurrentreqs= Max number of concurrent RPC requests that may be\n\t                            processed concurrently (default: 20)\n\t    --rpcmaxwebsockets=     Max number of RPC websocket connections (default:\n\t                            25)\n\t    --rpcquirks             Mirror some JSON-RPC quirks of Bitcoin Core --\n\t                            NOTE: Discouraged unless interoperability issues\n\t                            need to be worked around\n\t-P, --rpcpass=              Password for RPC connections\n\t-u, --rpcuser=              Username for RPC connections\n\t    --sigcachemaxsize=      The maximum number of entries in the signature\n\t                            verification cache (default: 100000)\n\t    --simnet                Use the simulation test network\n\t    --testnet               Use the test network\n\t    --torisolation          Enable Tor stream isolation by randomizing user\n\t                            credentials for each connection.\n\t    --trickleinterval=      Minimum time between attempts to send new\n\t                            inventory to a connected peer (default: 10s)\n\t    --txindex               Maintain a full hash-based transaction index\n\t                            which makes all transactions available via the\n\t                            getrawtransaction RPC\n\t    --uacomment=            Comment to add to the user agent -- See BIP 14\n\t                            for more information.\n\t    --upnp                  Use UPnP to map our listening port outside of NAT\n\t-V, --version               Display version information and exit\n\t    --whitelist=            Add an IP network or IP that will not be banned.\n\t                            (eg. 192.168.1.0/24 or ::1)\n\nHelp Options:\n\n\t-h, --help           Show this help message\n*/\npackage main\n"
  },
  {
    "path": "docs/.gitignore",
    "content": "/_build\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the environment for the first two.\nSPHINXOPTS    ?=\nSPHINXBUILD   ?= sphinx-build\nSOURCEDIR     = .\nBUILDDIR      = _build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\n.PHONY: help Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n"
  },
  {
    "path": "docs/code_contribution_guidelines.md",
    "content": "# Code contribution guidelines\r\n\r\nDeveloping cryptocurrencies is an exciting endeavor that touches a wide variety\r\nof areas such as wire protocols, peer-to-peer networking, databases,\r\ncryptography, language interpretation (transaction scripts), RPC, and\r\nwebsockets.  They also represent a radical shift to the current fiscal system\r\nand as a result provide an opportunity to help reshape the entire financial\r\nsystem.  There are few projects that offer this level of diversity and impact\r\nall in one code base.\r\n\r\nHowever, as exciting as it is, one must keep in mind that cryptocurrencies\r\nrepresent real money and introducing bugs and security vulnerabilities can have\r\nfar more dire consequences than in typical projects where having a small bug is\r\nminimal by comparison.  In the world of cryptocurrencies, even the smallest bug\r\nin the wrong area can cost people a significant amount of money.  For this\r\nreason, the btcd suite has a formalized and rigorous development process which\r\nis outlined on this page.\r\n\r\nWe highly encourage code contributions, however it is imperative that you adhere\r\nto the guidelines established on this page.\r\n\r\n## Substantial contributions only\r\n\r\nDue to the prevalence of automated analysis and pull request authoring tools\r\nand online competitions that incentivize creating commits in popular\r\nrepositories, the maintainers of this project are flooded with trivial pull\r\nrequests that only change some typos or other insubstantial content (e.g. the\r\nyear in the license file).\r\nIf you are an honest user that wants to contribute to this project, please\r\nconsider that every pull request takes precious time from the maintainers to\r\nreview and consider the impact of changes. Time that could be spent writing\r\nfeatures or fixing bugs.\r\nIf you really want to contribute, consider reviewing and testing other users'\r\npull requests instead. Or add value to the project by writing unit tests.\r\n\r\n## Minimum Recommended Skillset\r\n\r\nThe following list is a set of core competencies that we recommend you possess\r\nbefore you really start attempting to contribute code to the project.  These are\r\nnot hard requirements as we will gladly accept code contributions as long as\r\nthey follow the guidelines set forth on this page.  That said, if you don't have\r\nthe following basic qualifications you will likely find it quite difficult to\r\ncontribute.\r\n\r\n- A reasonable understanding of bitcoin at a high level (see the\r\n  [Required Reading](#ReqReading) section for the original white paper)\r\n- Experience in some type of C-like language\r\n- An understanding of data structures and their performance implications\r\n- Familiarity with unit testing\r\n- Debugging experience\r\n- Ability to understand not only the area you are making a change in, but also\r\n  the code your change relies on, and the code which relies on your changed code\r\n\r\nBuilding on top of those core competencies, the recommended skill set largely\r\ndepends on the specific areas you are looking to contribute to.  For example,\r\nif you wish to contribute to the cryptography code, you should have a good\r\nunderstanding of the various aspects involved with cryptography such as the\r\nsecurity and performance implications.\r\n\r\n## Required Reading\r\n\r\n- [Effective Go](http://golang.org/doc/effective_go.html) - The entire btcd\r\n  suite follows the guidelines in this document.  For your code to be accepted,\r\n  it must follow the guidelines therein.\r\n- [Original Satoshi Whitepaper](http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Fbitcoin.org%2Fbitcoin.pdf&ei=os3VUuH8G4SlsASV74GoAg&usg=AFQjCNEipPLigou_1MfB7DQjXCNdlylrBg&sig2=FaHDuT5z36GMWDEnybDJLg&bvm=bv.59378465,d.b2I) - This is the white paper that started it all.  Having a solid\r\n  foundation to build on will make the code much more comprehensible.\r\n\r\n## Development Practices\r\n\r\nDevelopers are expected to work in their own trees and submit pull requests when\r\nthey feel their feature or bug fix is ready for integration into the  master\r\nbranch.\r\n\r\n## Share Early, Share Often\r\n\r\nWe firmly believe in the share early, share often approach.  The basic premise\r\nof the approach is to announce your plans **before** you start work, and once\r\nyou have started working, craft your changes into a stream of small and easily\r\nreviewable commits.\r\n\r\nThis approach has several benefits:\r\n\r\n- Announcing your plans to work on a feature **before** you begin work avoids\r\n  duplicate work\r\n- It permits discussions which can help you achieve your goals in a way that is\r\n  consistent with the existing architecture\r\n- It minimizes the chances of you spending time and energy on a change that\r\n  might not fit with the consensus of the community or existing architecture and\r\n  potentially be rejected as a result\r\n- Incremental development helps ensure you are on the right track with regards\r\n  to the rest of the community\r\n- The quicker your changes are merged to master, the less time you will need to\r\n  spend rebasing and otherwise trying to keep up with the main code base\r\n\r\n## Testing\r\n\r\nOne of the major design goals of all core btcd packages is to aim for complete\r\ntest coverage.  This is financial software so bugs and regressions can cost\r\npeople real money.  For this reason every effort must be taken to ensure the\r\ncode is as accurate and bug-free as possible.  Thorough testing is a good way to\r\nhelp achieve that goal.\r\n\r\nUnless a new feature you submit is completely trivial, it will probably be\r\nrejected unless it is also accompanied by adequate test coverage for both\r\npositive and negative conditions.  That is to say, the tests must ensure your\r\ncode works correctly when it is fed correct data as well as incorrect data\r\n(error paths).\r\n\r\nGo provides an excellent test framework that makes writing test code and\r\nchecking coverage statistics straight forward.  For more information about the\r\ntest coverage tools, see the [golang cover blog post](http://blog.golang.org/cover).\r\n\r\nA quick summary of test practices follows:\r\n\r\n- All new code should be accompanied by tests that ensure the code behaves\r\n  correctly when given expected values, and, perhaps even more importantly, that\r\n  it handles errors gracefully\r\n- When you fix a bug, it should be accompanied by tests which exercise the bug\r\n  to both prove it has been resolved and to prevent future regressions\r\n\r\n## Code Documentation and Commenting\r\n\r\n- At a minimum every function must be commented with its intended purpose and\r\n  any assumptions that it makes\r\n  - Function comments must always begin with the name of the function per\r\n    [Effective Go](http://golang.org/doc/effective_go.html)\r\n  - Function comments should be complete sentences since they allow a wide\r\n    variety of automated presentations such as [go.dev](https://go.dev)\r\n  - The general rule of thumb is to look at it as if you were completely\r\n    unfamiliar with the code and ask yourself, would this give me enough\r\n    information to understand what this function does and how I'd probably want\r\n    to use it?\r\n- Exported functions should also include detailed information the caller of the\r\n  function will likely need to know and/or understand:\r\n\r\n**WRONG**\r\n\r\n```Go\r\n// convert a compact uint32 to big.Int\r\nfunc CompactToBig(compact uint32) *big.Int {\r\n```\r\n\r\n**RIGHT**\r\n\r\n```Go\r\n// CompactToBig converts a compact representation of a whole number N to a\r\n// big integer.  The representation is similar to IEEE754 floating point\r\n// numbers.\r\n//\r\n// Like IEEE754 floating point, there are three basic components: the sign,\r\n// the exponent, and the mantissa. They are broken out as follows:\r\n//\r\n//        * the most significant 8 bits represent the unsigned base 256 exponent\r\n//        * bit 23 (the 24th bit) represents the sign bit\r\n//        * the least significant 23 bits represent the mantissa\r\n//\r\n//        -------------------------------------------------\r\n//        |   Exponent     |    Sign    |    Mantissa     |\r\n//        -------------------------------------------------\r\n//        | 8 bits [31-24] | 1 bit [23] | 23 bits [22-00] |\r\n//        -------------------------------------------------\r\n//\r\n// The formula to calculate N is:\r\n//         N = (-1^sign) * mantissa * 256^(exponent-3)\r\n//\r\n// This compact form is only used in bitcoin to encode unsigned 256-bit numbers\r\n// which represent difficulty targets, thus there really is not a need for a\r\n// sign bit, but it is implemented here to stay consistent with bitcoind.\r\nfunc CompactToBig(compact uint32) *big.Int {\r\n```\r\n\r\n- Comments in the body of the code are highly encouraged, but they should\r\n  explain the intention of the code as opposed to just calling out the\r\n  obvious\r\n  \r\n**WRONG**\r\n\r\n```Go\r\n// return err if amt is less than 5460\r\nif amt < 5460 {\r\n  return err\r\n}\r\n```\r\n\r\n**RIGHT**\r\n\r\n```Go\r\n// Treat transactions with amounts less than the amount which is considered dust\r\n// as non-standard.\r\nif amt < 5460 {\r\n  return err\r\n}\r\n```\r\n\r\n**NOTE:** The above should really use a constant as opposed to a magic number,\r\nbut it was left as a magic number to show how much of a difference a good\r\ncomment can make.\r\n\r\n**Please refer to the [code formatting rules\r\ndocument](./code_formatting_rules.md)** to see the list of additional style\r\nrules we enforce.\r\n\r\n\r\n## Model Git Commit Messages\r\n\r\nThis project prefers to keep a clean commit history with well-formed commit\r\nmessages.  This section illustrates a model commit message and provides a bit\r\nof background for it.  This content was originally created by Tim Pope and made\r\navailable on his website, however that website is no longer active, so it is\r\nbeing provided here.\r\n\r\nHere’s a model Git commit message:\r\n\r\n```text\r\nShort (50 chars or less) summary of changes\r\n\r\nMore detailed explanatory text, if necessary.  Wrap it to about 72\r\ncharacters or so.  In some contexts, the first line is treated as the\r\nsubject of an email and the rest of the text as the body.  The blank\r\nline separating the summary from the body is critical (unless you omit\r\nthe body entirely); tools like rebase can get confused if you run the\r\ntwo together.\r\n\r\nWrite your commit message in the present tense: \"Fix bug\" and not \"Fixed\r\nbug.\"  This convention matches up with commit messages generated by\r\ncommands like git merge and git revert.\r\n\r\nFurther paragraphs come after blank lines.\r\n\r\n- Bullet points are okay, too\r\n- Typically a hyphen or asterisk is used for the bullet, preceded by a\r\n  single space, with blank lines in between, but conventions vary here\r\n- Use a hanging indent\r\n```\r\n\r\nPrefix the summary with the subsystem/package when possible. Many other\r\nprojects make use of the code and this makes it easier for them to tell when\r\nsomething they're using has changed. Have a look at [past\r\ncommits](https://github.com/btcsuite/btcd/commits/master) for examples of\r\ncommit messages.\r\n\r\nHere are some of the reasons why wrapping your commit messages to 72 columns is\r\na good thing.\r\n\r\n- git log doesn’t do any special wrapping of the commit messages. With the\r\n  default pager of less -S, this means your paragraphs flow far off the edge\r\n  of the screen, making them difficult to read. On an 80 column terminal, if we\r\n  subtract 4 columns for the indent on the left and 4 more for symmetry on the\r\n  right, we’re left with 72 columns.\r\n- git format-patch --stdout converts a series of commits to a series of emails,\r\n  using the messages for the message body.  Good email netiquette dictates we\r\n  wrap our plain text emails such that there’s room for a few levels of nested\r\n  reply indicators without overflow in an 80 column terminal.\r\n\r\n## Code Approval Process\r\n\r\nThis section describes the code approval process that is used for code\r\ncontributions.  This is how to get your changes into btcd.\r\n\r\n## Code Review\r\n\r\nAll code which is submitted will need to be reviewed before inclusion into the\r\nmaster branch.  This process is performed by the project maintainers and usually\r\nother committers who are interested in the area you are working in as well.\r\n\r\n## Code Review Timeframe\r\n\r\nThe timeframe for a code review will vary greatly depending on factors such as\r\nthe number of other pull requests which need to be reviewed, the size and\r\ncomplexity of the contribution, how well you followed the guidelines presented\r\non this page, and how easy it is for the reviewers to digest your commits.  For\r\nexample, if you make one monolithic commit that makes sweeping changes to things\r\nin multiple subsystems, it will obviously take much longer to review.  You will\r\nalso likely be asked to split the commit into several smaller, and hence more\r\nmanageable, commits.\r\n\r\nKeeping the above in mind, most small changes will be reviewed within a few\r\ndays, while large or far reaching changes may take weeks.  This is a good reason\r\nto stick with the [Share Early, Share Often](#ShareOften) development practice\r\noutlined above.\r\n\r\n## What is the review looking for?\r\n\r\nThe review is mainly ensuring the code follows the [Development Practices](#DevelopmentPractices)\r\nand [Code Contribution Standards](#Standards).  However, there are a few other\r\nchecks which are generally performed as follows:\r\n\r\n- The code is stable and has no stability or security concerns\r\n- The code is properly using existing APIs and generally fits well into the\r\n  overall architecture\r\n- The change is not something which is deemed inappropriate by community\r\n  consensus\r\n\r\n## Rework Code (if needed)\r\n\r\nAfter the code review, the change will be accepted immediately if no issues are\r\nfound.  If there are any concerns or questions, you will be provided with\r\nfeedback along with the next steps needed to get your contribution merged with\r\nmaster.  In certain cases the code reviewer(s) or interested committers may help\r\nyou rework the code, but generally you will simply be given feedback for you to\r\nmake the necessary changes.\r\n\r\nThis process will continue until the code is finally accepted.\r\n\r\n## Acceptance\r\n\r\nOnce your code is accepted, it will be integrated with the master branch.\r\nTypically it will be rebased and fast-forward merged to master as we prefer to\r\nkeep a clean commit history over a tangled weave of merge commits.  However,\r\nregardless of the specific merge method used, the code will be integrated with\r\nthe master branch and the pull request will be closed.\r\n\r\nRejoice as you will now be listed as a [contributor](https://github.com/btcsuite/btcd/graphs/contributors)!\r\n\r\n## Contribution Standards\r\n\r\n## Contribution Checklist\r\n\r\n- [&nbsp;&nbsp;] All changes are Go version 1.22 compliant\r\n- [&nbsp;&nbsp;] The code being submitted is commented according to the\r\n  [Code Documentation and Commenting](#CodeDocumentation) section\r\n- [&nbsp;&nbsp;] For new code: Code is accompanied by tests which exercise both\r\n  the positive and negative (error paths) conditions (if applicable)\r\n- [&nbsp;&nbsp;] For bug fixes: Code is accompanied by new tests which trigger\r\n  the bug being fixed to prevent regressions\r\n- [&nbsp;&nbsp;] Any new logging statements use an appropriate subsystem and\r\n  logging level\r\n- [&nbsp;&nbsp;] Code has been formatted with `go fmt`\r\n- [&nbsp;&nbsp;] Running `go test` does not fail any tests\r\n- [&nbsp;&nbsp;] Running `go vet` does not report any issues\r\n- [&nbsp;&nbsp;] Running [golint](https://github.com/golang/lint) does not\r\n  report any **new** issues that did not already exist\r\n\r\n## Licensing of Contributions\r\n\r\nAll contributions must be licensed with the\r\n[ISC license](https://github.com/btcsuite/btcd/blob/master/LICENSE).  This is\r\nthe same license as all of the code in the btcd suite.\r\n"
  },
  {
    "path": "docs/code_formatting_rules.md",
    "content": "# Code formatting rules\n\n## Why this emphasis on formatting?\n\nCode in general (and Open Source code specifically) is _read_ by developers many\nmore times during its lifecycle than it is modified. With this fact in mind, the\nGolang language was designed for readability (among other goals).\nWhile the enforced formatting of `go fmt` and some best practices already\neliminate many discussions, the resulting code can still look and feel very\ndifferently among different developers.\n\nWe aim to enforce a few additional rules to unify the look and feel of all code\nin `btcd` to help improve the overall readability.\n\n## Spacing\n\nBlocks of code within `btcd` should be segmented into logical stanzas of\noperation. Such spacing makes the code easier to follow at a skim, and reduces\nunnecessary line noise. Coupled with the commenting scheme specified in the\n[contribution guide](./code_contribution_guidelines.md#code-documentation-and-commenting),\nproper spacing allows readers to quickly scan code, extracting semantics quickly.\nFunctions should _not_ just be laid out as a bare contiguous block of code.\n\n**WRONG**\n```go\n\twitness := make([][]byte, 4)\n\twitness[0] = nil\n\tif bytes.Compare(pubA, pubB) == -1 {\n\t\twitness[1] = sigB\n\t\twitness[2] = sigA\n\t} else {\n\t\twitness[1] = sigA\n\t\twitness[2] = sigB\n\t}\n\twitness[3] = witnessScript\n\treturn witness\n```\n**RIGHT**\n```go\n\twitness := make([][]byte, 4)\n\n\t// When spending a p2wsh multi-sig script, rather than an OP_0, we add\n\t// a nil stack element to eat the extra pop.\n\twitness[0] = nil\n\n\t// When initially generating the witnessScript, we sorted the serialized\n\t// public keys in descending order. So we do a quick comparison in order\n\t// to ensure the signatures appear on the Script Virtual Machine stack in\n\t// the correct order.\n\tif bytes.Compare(pubA, pubB) == -1 {\n\t\twitness[1] = sigB\n\t\twitness[2] = sigA\n\t} else {\n\t\twitness[1] = sigA\n\t\twitness[2] = sigB\n\t}\n\n\t// Finally, add the preimage as the last witness element.\n\twitness[3] = witnessScript\n\n\treturn witness\n```\n\nAdditionally, we favor spacing between stanzas within syntax like: switch case\nstatements and select statements.\n\n**WRONG**\n```go\n\tswitch {\n\t\tcase a:\n\t\t\t<code block>\n\t\tcase b:\n\t\t\t<code block>\n\t\tcase c:\n\t\t\t<code block>\n\t\tcase d:\n\t\t\t<code block>\n\t\tdefault:\n\t\t\t<code block>\n\t}\n```\n**RIGHT**\n```go\n\tswitch {\n\t\t// Brief comment detailing instances of this case (repeat below).\n\t\tcase a:\n\t\t\t<code block>\n\n\t\tcase b:\n\t\t\t<code block>\n\n\t\tcase c:\n\t\t\t<code block>\n\n\t\tcase d:\n\t\t\t<code block>\n\n\t\tdefault:\n\t\t\t<code block>\n\t}\n```\n\n## Additional Style Constraints\n\nBefore a PR is submitted, the proposer should ensure that the file passes the\nset of linting scripts run by `make lint`. These include `gofmt`. In addition\nto `gofmt` we've opted to enforce the following style guidelines.\n\n### 80 character line length\n\nALL columns (on a best effort basis) should be wrapped to 80 line columns.\nEditors should be set to treat a **tab as 8 spaces**.\n\n**WRONG**\n```go\nmyKey := \"0214cd678a565041d00e6cf8d62ef8add33b4af4786fb2beb87b366a2e151fcee7\"\n```\n\n**RIGHT**\n```go\nmyKey := \"0214cd678a565041d00e6cf8d62ef8add33b4af4786fb2beb87b366a2e1\" +\n\t\"51fcee7\"\n```\n\n### Wrapping long function calls\n\nWhen wrapping a line that contains a function call as the unwrapped line exceeds\nthe column limit, the close parenthesis should be placed on its own line.\nAdditionally, all arguments should begin in a new line after the open parenthesis.\n\n**WRONG**\n```go\nvalue, err := bar(a,\n\ta, b, c)\n```\n\n**RIGHT**\n```go\nvalue, err := bar(\n\ta, a, b, c,\n)\n```\n\n#### Exception for log and error message formatting\n\n**Note that the above guidelines don't apply to log or error messages.** For\nlog and error messages, committers should attempt to minimize the number of\nlines utilized, while still adhering to the 80-character column limit. For\nexample:\n\n**WRONG**\n```go\nreturn fmt.Errorf(\n\t\"this is a long error message with a couple (%d) place holders\",\n\tlen(things),\n)\n\nlog.Debugf(\n\t\"Something happened here that we need to log: %v\",\n\tlongVariableNameHere,\n)\n```\n\n**RIGHT**\n```go\nreturn fmt.Errorf(\"this is a long error message with a couple (%d) place \"+\n\t\"holders\", len(things))\n\nlog.Debugf(\"Something happened here that we need to log: %v\",\n\tlongVariableNameHere)\n```\n\nThis helps to visually distinguish those formatting statements (where nothing\nof consequence happens except for formatting an error message or writing\nto a log) from actual method or function calls. This compact formatting should\nbe used for calls to formatting functions like `fmt.Errorf`,\n`log.(Trace|Debug|Info|Warn|Error)f` and `fmt.Printf`.\nBut not for statements that are important for the flow or logic of the code,\nlike `require.NoErrorf()`.\n\n#### Exceptions and additional styling for structured logging\n\nWhen making use of structured logging calls (there are any `btclog.Logger` \nmethods ending in `S`), a few different rules and exceptions apply.\n\n1) **Static messages:** Structured log calls take a `context.Context` as a first\nparameter and a _static_ string as the second parameter (the `msg` parameter). \nFormatted strings should ideally not be used for the construction of the `msg` \nparameter. Instead, key-value pairs (or `slog` attributes) should be used to \nprovide additional variables to the log line.\n\n**WRONG**\n```go\nlog.DebugS(ctx, fmt.Sprintf(\"User %d just spent %.8f to open a channel\", userID, 0.0154))\n```\n\n**RIGHT**\n```go\nlog.InfoS(ctx, \"Channel open performed\",\n        slog.Int(\"user_id\", userID),\n        btclog.Fmt(\"amount\", \"%.8f\", 0.00154))\n```\n\n2) **Key-value attributes**: The third parameter in any structured log method is \na variadic list of the `any` type but it is required that these are provided in \nkey-value pairs such that an associated `slog.Attr` variable can be created for \neach key-value pair. The simplest way to specify this is to directly pass in the \nkey-value pairs as raw literals as follows:\n\n```go\nlog.InfoS(ctx, \"Channel open performed\", \"user_id\", userID, \"amount\", 0.00154)\n```\nThis does work, but it becomes easy to make a mistake and accidentally leave out\na value for each key provided leading to a nonsensical log line. To avoid this, \nit is suggested to make use of the various `slog.Attr` helper functions as \nfollows:\n\n```go\nlog.InfoS(ctx, \"Channel open performed\",\n        slog.Int(\"user_id\", userID),\n        btclog.Fmt(\"amount\", \"%.8f\", 0.00154))\n```\n\n3) **Line wrapping**: Structured log lines are an exception to the 80-character\nline wrapping rule. This is so that the key-value pairs can be easily read and\nreasoned about. If it is the case that there is only a single key-value pair\nand the entire log line is still less than 80 characters, it is acceptable to\nhave the key-value pair on the same line as the log message. However, if there\nare multiple key-value pairs, it is suggested to use the one line per key-value\npair format. Due to this suggestion, it is acceptable for any single key-value\npair line to exceed 80 characters for the sake of readability.\n\n**WRONG**\n```go\n// Example 1.\nlog.InfoS(ctx, \"User connected\", \n        \"user_id\", userID)\n\n// Example 2.\nlog.InfoS(ctx, \"Channel open performed\", \"user_id\", userID,\n        btclog.Fmt(\"amount\", \"%.8f\", 0.00154), \"channel_id\", channelID)\n\n// Example 3.\nlog.InfoS(ctx, \"Bytes received\", \n        \"user_id\", userID, \n        btclog.Hex(\"peer_id\", peerID.SerializeCompressed()),\n        btclog.Hex(\"message\", []bytes{\n                0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,\n        })))\n```\n\n**RIGHT**\n```go\n// Example 1.\nlog.InfoS(ctx, \"User connected\", \"user_id\", userID)\n\n// Example 2.\nlog.InfoS(ctx, \"Channel open performed\",\n        slog.Int(\"user_id\", userID),\n        btclog.Fmt(\"amount\", \"%.8f\", 0.00154),\n        slog.String(\"channel_id\", channelID))\n\n// Example 3.\nlog.InfoS(ctx, \"Bytes received\", \n        \"user_id\", userID,\n        btclog.Hex(\"peer_id\", peerID.SerializeCompressed()),\n        btclog.Hex(\"message\", []bytes{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08})))\n```\n\n### Wrapping long function definitions\n\nIf one is forced to wrap lines of function arguments that exceed the \n80-character limit, then indentation must be kept on the following lines. Also,\nlines should not end with an open parenthesis if the function definition isn't\nfinished yet.\n\n**WRONG**\n```go\nfunc foo(a, b, c,\n) (d, error) {\n\nfunc bar(a, b, c) (\n\td, error,\n) {\n\nfunc baz(a, b, c) (\n\td, error) {\n```\n**RIGHT**\n```go\nfunc foo(a, b,\n\tc) (d, error) {\n\nfunc baz(a, b, c) (d,\n\terror) {\n\nfunc longFunctionName(\n\ta, b, c) (d, error) {\n```\n\nIf a function declaration spans multiple lines the body should start with an\nempty line to help visually distinguishing the two elements.\n\n**WRONG**\n```go\nfunc foo(a, b, c,\n\td, e) error {\n\tvar a int\n}\n```\n**RIGHT**\n```go\nfunc foo(a, b, c,\n\td, e) error {\n\n\tvar a int\n}\n```\n\n## Recommended settings for your editor\n\nTo make it easier to follow the rules outlined above, we recommend setting up\nyour editor with at least the following two settings:\n\n1. Set your tabulator width (also called \"tab size\") to **8 spaces**.\n2. Set a ruler or visual guide at 80 character.\n\nNote that the two above settings are automatically applied in editors that\nsupport the `EditorConfig` scheme (for example GoLand, GitHub, GitLab,\nVisualStudio). In addition, specific settings for Visual Studio Code are checked\ninto the code base as well.\n\nOther editors (for example Atom, Notepad++, Vim, Emacs and so on) might install\na plugin to understand the rules in the `.editorconfig` file.\n\nIn Vim, you might want to use `set colorcolumn=80`.\n"
  },
  {
    "path": "docs/conf.py",
    "content": "# Configuration file for the Sphinx documentation builder.\n#\n# This file only contains a selection of the most common options. For a full\n# list see the documentation:\n# https://www.sphinx-doc.org/en/master/usage/configuration.html\n\n# -- Path setup --------------------------------------------------------------\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\n# import os\n# import sys\n# sys.path.insert(0, os.path.abspath('.'))\nimport recommonmark\nfrom recommonmark.transform import AutoStructify\n\n# -- Project information -----------------------------------------------------\n\nproject = 'btcd'\ncopyright = '2020, btcd'\nauthor = 'btcsuite developers'\n\n# The full version, including alpha/beta/rc tags\nrelease = 'beta'\n\nsource_suffix = ['.md']\n\n# The master toctree document.\nmaster_doc = 'index'\n\n# -- General configuration ---------------------------------------------------\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    'sphinx.ext.autodoc',\n    'sphinx.ext.napoleon',\n    'sphinx.ext.mathjax',\n    'sphinx_markdown_tables',\n    'recommonmark',\n]\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path.\nexclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']\n\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = 'sphinx_rtd_theme'\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = ['_static']\n\n# app setup hook\ndef setup(app):\n    app.add_config_value('recommonmark_config', {\n        #'url_resolver': lambda url: github_doc_root + url,\n        'auto_toc_tree_section': 'Contents',\n        'enable_math': False,\n        'enable_inline_math': False,\n        'enable_eval_rst': True,\n        'enable_auto_doc_ref': True,\n    }, True)\n    app.add_transform(AutoStructify)\n"
  },
  {
    "path": "docs/configuration.md",
    "content": "# Configuration\n\nbtcd has a number of [configuration](https://pkg.go.dev/github.com/btcsuite/btcd)\noptions, which can be viewed by running: `$ btcd --help`.\n\n## Peer server listen interface\n\nbtcd allows you to bind to specific interfaces which enables you to setup\nconfigurations with varying levels of complexity.  The listen parameter can be\nspecified on the command line as shown below with the -- prefix or in the\nconfiguration file without the -- prefix (as can all long command line options).\nThe configuration file takes one entry per line.\n\n**NOTE:** The listen flag can be specified multiple times to listen on multiple\ninterfaces as a couple of the examples below illustrate.\n\nCommand Line Examples:\n\n|Flags|Comment|\n|----------|------------|\n|--listen=|all interfaces on default port which is changed by `--testnet` and `--regtest` (**default**)|\n|--listen=0.0.0.0|all IPv4 interfaces on default port which is changed by `--testnet` and `--regtest`|\n|--listen=::|all IPv6 interfaces on default port which is changed by `--testnet` and `--regtest`|\n|--listen=:8333|all interfaces on port 8333|\n|--listen=0.0.0.0:8333|all IPv4 interfaces on port 8333|\n|--listen=[::]:8333|all IPv6 interfaces on port 8333|\n|--listen=127.0.0.1:8333|only IPv4 localhost on port 8333|\n|--listen=[::1]:8333|only IPv6 localhost on port 8333|\n|--listen=:8336|all interfaces on non-standard port 8336|\n|--listen=0.0.0.0:8336|all IPv4 interfaces on non-standard port 8336|\n|--listen=[::]:8336|all IPv6 interfaces on non-standard port 8336|\n|--listen=127.0.0.1:8337 --listen=[::1]:8333|IPv4 localhost on port 8337 and IPv6 localhost on port 8333|\n|--listen=:8333 --listen=:8337|all interfaces on ports 8333 and 8337|\n\nThe following config file would configure btcd to only listen on localhost for both IPv4 and IPv6:\n\n```text\n[Application Options]\n\nlisten=127.0.0.1:8333\nlisten=[::1]:8333\n```\n\nIn addition, if you are starting btcd with TLS and want to make it\navailable via a hostname, then you will need to generate the TLS\ncertificates for that host. For example,\n\n```\ngencerts --host=myhostname.example.com --directory=/home/me/.btcd/\n```\n\n## RPC server listen interface\n\nbtcd allows you to bind the RPC server to specific interfaces which enables you\nto setup configurations with varying levels of complexity.  The `rpclisten`\nparameter can be specified on the command line as shown below with the -- prefix\nor in the configuration file without the -- prefix (as can all long command line\noptions).  The configuration file takes one entry per line.\n\nA few things to note regarding the RPC server:\n\n* The RPC server will **not** be enabled unless the `rpcuser` and `rpcpass`\n  options are specified.\n* When the `rpcuser` and `rpcpass` and/or `rpclimituser` and `rpclimitpass`\n  options are specified, the RPC server will only listen on localhost IPv4 and\n  IPv6 interfaces by default.  You will need to override the RPC listen\n  interfaces to include external interfaces if you want to connect from a remote\n  machine.\n* The RPC server has TLS enabled by default, even for localhost.  You may use\n  the `--notls` option to disable it, but only when all listeners are on\n  localhost interfaces.\n* The `--rpclisten` flag can be specified multiple times to listen on multiple\n  interfaces as a couple of the examples below illustrate.\n* The RPC server is disabled by default when using the `--regtest` and\n  `--simnet` networks.  You can override this by specifying listen interfaces.\n\nCommand Line Examples:\n\n|Flags|Comment|\n|----------|------------|\n|--rpclisten=|all interfaces on default port which is changed by `--testnet`|\n|--rpclisten=0.0.0.0|all IPv4 interfaces on default port which is changed by `--testnet`|\n|--rpclisten=::|all IPv6 interfaces on default port which is changed by `--testnet`|\n|--rpclisten=:8334|all interfaces on port 8334|\n|--rpclisten=0.0.0.0:8334|all IPv4 interfaces on port 8334|\n|--rpclisten=[::]:8334|all IPv6 interfaces on port 8334|\n|--rpclisten=127.0.0.1:8334|only IPv4 localhost on port 8334|\n|--rpclisten=[::1]:8334|only IPv6 localhost on port 8334|\n|--rpclisten=:8336|all interfaces on non-standard port 8336|\n|--rpclisten=0.0.0.0:8336|all IPv4 interfaces on non-standard port 8336|\n|--rpclisten=[::]:8336|all IPv6 interfaces on non-standard port 8336|\n|--rpclisten=127.0.0.1:8337 --listen=[::1]:8334|IPv4 localhost on port 8337 and IPv6 localhost on port 8334|\n|--rpclisten=:8334 --listen=:8337|all interfaces on ports 8334 and 8337|\n\nThe following config file would configure the btcd RPC server to listen to all interfaces on the default port, including external interfaces, for both IPv4 and IPv6:\n\n```text\n[Application Options]\n\nrpclisten=\n```\n\n## Default ports\n\nWhile btcd is highly configurable when it comes to the network configuration,\nthe following is intended to be a quick reference for the default ports used so\nport forwarding can be configured as required.\n\nbtcd provides a `--upnp` flag which can be used to automatically map the bitcoin\npeer-to-peer listening port if your router supports UPnP.  If your router does\nnot support UPnP, or you don't wish to use it, please note that only the bitcoin\npeer-to-peer port should be forwarded unless you specifically want to allow RPC\naccess to your btcd from external sources such as in more advanced network\nconfigurations.\n\n|Name|Port|\n|----|----|\n|Default Bitcoin peer-to-peer port|TCP 8333|\n|Default RPC port|TCP 8334|\n\n## Using bootstrap.dat\n\n### What is bootstrap.dat?\n\nIt is a flat, binary file containing bitcoin blockchain data starting from the\ngenesis block and continuing through a relatively recent block height depending\non the last time it was updated.\n\nSee [this](https://bitcointalk.org/index.php?topic=145386.0) thread on\nbitcointalk for more details.\n\n**NOTE:** Using bootstrap.dat is entirely optional.  Btcd will download the\nblock chain from other peers through the Bitcoin protocol with no extra\nconfiguration needed.\n\n### What are the pros and cons of using bootstrap.dat?\n\nPros:\n\n* Typically accelerates the initial process of bringing up a new node as it\n  downloads from public P2P nodes and generally is able to achieve faster\n  download speeds\n* It is particularly beneficial when bringing up multiple nodes as you only need\n  to download the data once\n\nCons:\n\n* Requires you to setup and configure a torrent client if you don't already have\n  one available\n* Requires roughly twice as much disk space since you'll need the flat file as\n  well as the imported database\n\n### Where do I get bootstrap.dat?\n\nThe bootstrap.dat file is made available via a torrent.  See\n[this](https://bitcointalk.org/index.php?topic=145386.0) thread on bitcointalk\nfor the torrent download details.\n\n### How do I know I can trust the bootstrap.dat I downloaded?\n\nYou don't need to trust the file as the `addblock` utility verifies every block\nusing the same rules that are used when downloading the block chain normally\nthrough the Bitcoin protocol.  Additionally, the chain rules contain hard-coded\ncheckpoints for the known-good block chain at periodic intervals.  This ensures\nthat not only is it a valid chain, but it is the same chain that everyone else\nis using.\n\n### How do I use bootstrap.dat with btcd?\n\nbtcd comes with a separate utility named `addblock` which can be used to import\n`bootstrap.dat`.  This approach is used since the import is a one-time operation\nand we prefer to keep the daemon itself as lightweight as possible.\n\n1. Stop btcd if it is already running.  This is required since addblock needs to\n   access the database used by btcd and it will be locked if btcd is using it.\n2. Note the path to the downloaded bootstrap.dat file.\n3. Run the addblock utility with the `-i` argument pointing to the location of\n   bootstrap.dat:\n\n**Windows:**\n\n```bat\n\"%PROGRAMFILES%\\Btcd Suite\\Btcd\\addblock\" -i C:\\Path\\To\\bootstrap.dat\n```\n\n**Linux/Unix/BSD/POSIX:**\n\n```bash\n$GOPATH/bin/addblock -i /path/to/bootstrap.dat\n```\n"
  },
  {
    "path": "docs/configuring_tor.md",
    "content": "# Configuring TOR\n\nbtcd provides full support for anonymous networking via the\n[Tor Project](https://www.torproject.org/), including [client-only](#Client)\nand [hidden service](#HiddenService) configurations along with\n[stream isolation](#TorStreamIsolation).  In addition, btcd supports a hybrid,\n[bridge mode](#Bridge) which is not anonymous, but allows it to operate as a\nbridge between regular nodes and hidden service nodes without routing the\nregular connections through Tor.\n\nWhile it is easier to only run as a client, it is more beneficial to the Bitcoin\nnetwork to run as both a client and a server so others may connect to you to as\nyou are connecting to them.  We recommend you take the time to setup a Tor\nhidden service for this reason.\n\n## Client-only\n\nConfiguring btcd as a Tor client is straightforward.  The first step is\nobviously to install Tor and ensure it is working. Once that is done, all that\ntypically needs to be done is to specify the `--proxy` flag via the btcd command\nline or in the btcd configuration file.  Typically the Tor proxy address will be\n127.0.0.1:9050 (if using standalone Tor) or 127.0.0.1:9150 (if using the Tor\nBrowser Bundle).  If you have Tor configured to require a username and password,\nyou may specify them with the `--proxyuser` and `--proxypass` flags.\n\nBy default, btcd assumes the proxy specified with `--proxy` is a Tor proxy and\nhence will send all traffic, including DNS resolution requests, via the\nspecified proxy.\n\nNOTE: Specifying the `--proxy` flag disables listening by default since you will\nnot be reachable for inbound connections unless you also configure a Tor\n[hidden service](#HiddenService).\n\n### Command line example\n\n```bash\n./btcd --proxy=127.0.0.1:9050\n```\n\n### Config file example\n\n```text\n[Application Options]\n\nproxy=127.0.0.1:9050\n```\n\n## Client-server via Tor hidden service\n\nThe first step is to configure Tor to provide a hidden service.  Documentation\nfor this can be found on the Tor project website\n[here](https://community.torproject.org/onion-services/setup/).  However,\nthere is no need to install a web server locally as the linked instructions\ndiscuss since btcd will act as the server.\n\nIn short, the instructions linked above entail modifying your `torrc` file to\nadd something similar to the following, restarting Tor, and opening the\n`hostname` file in the `HiddenServiceDir` to obtain your hidden service .onion\naddress.\n\n```text\nHiddenServiceDir /var/tor/btcd\nHiddenServicePort 8333 127.0.0.1:8333\n```\n\nOnce Tor is configured to provide the hidden service and you have obtained your\ngenerated .onion address, configuring btcd as a Tor hidden service requires\nthree flags:\n\n* `--proxy` to identify the Tor (SOCKS 5) proxy to use for outgoing traffic.\n  This is typically 127.0.0.1:9050.\n* `--listen` to enable listening for inbound connections since `--proxy`\n  disables listening by default\n* `--externalip` to set the .onion address that is advertised to other peers\n\n### Command line example\n\n```bash\n./btcd --proxy=127.0.0.1:9050 --listen=127.0.0.1 --externalip=fooanon.onion\n```\n\n### Config file example\n\n```text\n[Application Options]\n\nproxy=127.0.0.1:9050\nlisten=127.0.0.1\nexternalip=fooanon.onion\n```\n\n## Bridge mode (not anonymous)\n\nbtcd provides support for operating as a bridge between regular nodes and hidden\nservice nodes.  In particular this means only traffic which is directed to or\nfrom a .onion address is sent through Tor while other traffic is sent normally.\n_As a result, this mode is **NOT** anonymous._\n\nThis mode works by specifying an onion-specific proxy, which is pointed at Tor,\nby using the `--onion` flag via the btcd command line or in the btcd\nconfiguration file.  If you have Tor configured to require a username and\npassword, you may specify them with the `--onionuser` and `--onionpass` flags.\n\nNOTE: This mode will also work in conjunction with a hidden service which means\nyou could accept inbound connections both via the normal network and to your\nhidden service through the Tor network.  To enable your hidden service in bridge\nmode, you only need to specify your hidden service's .onion address via the\n`--externalip` flag since traffic to and from .onion addresses are already\nrouted via Tor due to the `--onion` flag.\n\n### Command line example\n\n```bash\n./btcd --onion=127.0.0.1:9050 --externalip=fooanon.onion\n```\n\n### Config file example\n\n```text\n[Application Options]\n\nonion=127.0.0.1:9050\nexternalip=fooanon.onion\n```\n\n## Tor stream isolation\n\nTor stream isolation forces Tor to build a new circuit for each connection\nmaking it harder to correlate connections.\n\nbtcd provides support for Tor stream isolation by using the `--torisolation`\nflag.  This option requires --proxy or --onionproxy to be set.\n\n### Command line example\n\n```bash\n./btcd --proxy=127.0.0.1:9050 --torisolation\n```\n\n### Config file example\n\n```text\n[Application Options]\n\nproxy=127.0.0.1:9050\ntorisolation=1\n```\n"
  },
  {
    "path": "docs/contact.md",
    "content": "# Contact\n\n## IRC\n\n* [irc.libera.chat](irc://irc.libera.chat), channel `#btcd`\n\n## Mailing Lists\n\n* [btcd](mailto:btcd+subscribe@opensource.conformal.com): discussion of btcd and its packages.\n* [btcd-commits](mailto:btcd-commits+subscribe@opensource.conformal.com): readonly mail-out of source code changes.\n\n## Issue Tracker\n\nThe [integrated github issue tracker](https://github.com/btcsuite/btcd/issues)\nis used for this project.\n"
  },
  {
    "path": "docs/controlling.md",
    "content": "# Controlling and querying btcd via btcctl\n\nbtcctl is a command line utility that can be used to both control and query btcd\nvia [RPC](http://www.wikipedia.org/wiki/Remote_procedure_call).  btcd does\n**not** enable its RPC server by default;  You must configure at minimum both an\nRPC username and password or both an RPC limited username and password:\n\n* btcd.conf configuration file\n\n```bash\n[Application Options]\nrpcuser=myuser\nrpcpass=SomeDecentp4ssw0rd\nrpclimituser=mylimituser\nrpclimitpass=Limitedp4ssw0rd\n```\n\n* btcctl.conf configuration file\n\n```bash\n[Application Options]\nrpcuser=myuser\nrpcpass=SomeDecentp4ssw0rd\n```\n\nOR\n\n```bash\n[Application Options]\nrpclimituser=mylimituser\nrpclimitpass=Limitedp4ssw0rd\n```\n\nFor a list of available options, run: `$ btcctl --help`\n"
  },
  {
    "path": "docs/developer_resources.md",
    "content": "# Developer Resources\n\n* [Code Contribution Guidelines](https://github.com/btcsuite/btcd/tree/master/docs/code_contribution_guidelines.md)\n\n* [JSON-RPC Reference](https://github.com/btcsuite/btcd/tree/master/docs/json_rpc_api.md)\n  * [RPC Examples](https://github.com/btcsuite/btcd/tree/master/docs/json_rpc_api.md#ExampleCode)\n\n* The btcsuite Bitcoin-related Go Packages:\n  * [btcrpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient) - Implements a\n    robust and easy to use Websocket-enabled Bitcoin JSON-RPC client\n  * [btcjson](https://github.com/btcsuite/btcd/tree/master/btcjson) - Provides an extensive API\n    for the underlying JSON-RPC command and return values\n  * [wire](https://github.com/btcsuite/btcd/tree/master/wire) - Implements the\n    Bitcoin wire protocol\n  * [peer](https://github.com/btcsuite/btcd/tree/master/peer) -\n    Provides a common base for creating and managing Bitcoin network peers.\n  * [blockchain](https://github.com/btcsuite/btcd/tree/master/blockchain) -\n    Implements Bitcoin block handling and chain selection rules\n  * [blockchain/fullblocktests](https://github.com/btcsuite/btcd/tree/master/blockchain/fullblocktests) -\n    Provides a set of block tests for testing the consensus validation rules\n  * [txscript](https://github.com/btcsuite/btcd/tree/master/txscript) -\n    Implements the Bitcoin transaction scripting language\n  * [btcec](https://github.com/btcsuite/btcd/tree/master/btcec) - Implements\n    support for the elliptic curve cryptographic functions needed for the\n    Bitcoin scripts\n  * [database](https://github.com/btcsuite/btcd/tree/master/database) -\n    Provides a database interface for the Bitcoin block chain\n  * [mempool](https://github.com/btcsuite/btcd/tree/master/mempool) -\n    Package mempool provides a policy-enforced pool of unmined bitcoin\n    transactions.\n  * [btcutil](https://github.com/btcsuite/btcd/tree/master/btcutil) - Provides Bitcoin-specific\n    convenience functions and types\n  * [chainhash](https://github.com/btcsuite/btcd/tree/master/chaincfg/chainhash) -\n    Provides a generic hash type and associated functions that allows the\n    specific hash algorithm to be abstracted.\n  * [connmgr](https://github.com/btcsuite/btcd/tree/master/connmgr) -\n    Package connmgr implements a generic Bitcoin network connection manager.\n"
  },
  {
    "path": "docs/index.md",
    "content": "# btcd\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd)\n\nbtcd is an alternative full node bitcoin implementation written in Go (golang).\n\nThis project is currently under active development and is in a Beta state.  It\nis extremely stable and has been in production use since October 2013.\n\nIt properly downloads, validates, and serves the block chain using the exact\nrules (including consensus bugs) for block acceptance as Bitcoin Core.  We have\ntaken great care to avoid btcd causing a fork to the block chain.  It includes a\nfull block validation testing framework which contains all of the 'official'\nblock acceptance tests (and some additional ones) that is run on every pull\nrequest to help ensure it properly follows consensus.  Also, it passes all of\nthe JSON test data in the Bitcoin Core code.\n\nIt also properly relays newly mined blocks, maintains a transaction pool, and\nrelays individual transactions that have not yet made it into a block.  It\nensures all individual transactions admitted to the pool follow the rules\nrequired by the block chain and also includes more strict checks which filter\ntransactions based on miner requirements (\"standard\" transactions).\n\nOne key difference between btcd and Bitcoin Core is that btcd does *NOT* include\nwallet functionality and this was a very intentional design decision.  See the\nblog entry [here](https://web.archive.org/web/20171125143919/https://blog.conformal.com/btcd-not-your-moms-bitcoin-daemon)\nfor more details.  This means you can't actually make or receive payments\ndirectly with btcd.  That functionality is provided by the\n[btcwallet](https://github.com/btcsuite/btcwallet) and\n[Paymetheus](https://github.com/btcsuite/Paymetheus) (Windows-only) projects\nwhich are both under active development.\n\n## Documentation\n\nDocumentation is a work-in-progress. It is available at [btcd.readthedocs.io](https://btcd.readthedocs.io).\n\n## Contents\n\n* [Installation](installation.md)\n* [Update](update.md)\n* [Configuration](configuration.md)\n* [Configuring TOR](configuring_tor.md)\n* [Docker](using_docker.md)\n* [Controlling](controlling.md)\n* [Mining](mining.md)\n* [Wallet](wallet.md)\n* [Developer resources](developer_resources.md)\n* [JSON RPC API](json_rpc_api.md)\n* [Code contribution guidelines](code_contribution_guidelines.md)\n* [Contact](contact.md)\n\n## License\n\nbtcd is licensed under the [copyfree](http://copyfree.org) ISC License.\n\n"
  },
  {
    "path": "docs/installation.md",
    "content": "# Installation\n\nThe first step is to install btcd.  See one of the following sections for\ndetails on how to install on the supported operating systems.\n\n## Requirements\n\n[Go](http://golang.org) 1.22 or newer.\n\n## GPG Verification Key\n\nAll official release tags are signed by Conformal so users can ensure the code\nhas not been tampered with and is coming from the btcsuite developers.  To\nverify the signature perform the following:\n\n* Download the Conformal public key:\n  https://raw.githubusercontent.com/btcsuite/btcd/master/release/GIT-GPG-KEY-conformal.txt\n\n* Import the public key into your GPG keyring:\n\n  ```bash\n  gpg --import GIT-GPG-KEY-conformal.txt\n  ```\n\n* Verify the release tag with the following command where `TAG_NAME` is a\n  placeholder for the specific tag:\n\n  ```bash\n  git tag -v TAG_NAME\n  ```\n\n## Windows Installation\n\n* Install the MSI available at: [btcd windows installer](https://github.com/btcsuite/btcd/releases)\n* Launch btcd from the Start Menu\n\n## Linux/BSD/MacOSX/POSIX Installation\n\n* Install Go according to the [installation instructions](http://golang.org/doc/install)\n* Ensure Go was installed properly and is a supported version:\n\n```bash\ngo version\ngo env GOROOT GOPATH\n```\n\nNOTE: The `GOROOT` and `GOPATH` above must not be the same path.  It is\nrecommended that `GOPATH` is set to a directory in your home directory such as\n`~/goprojects` to avoid write permission issues.  It is also recommended to add\n`$GOPATH/bin` to your `PATH` at this point.\n\n* Run the following commands to obtain btcd, all dependencies, and install it:\n\n```bash\ngit clone https://github.com/btcsuite/btcd $GOPATH/src/github.com/btcsuite/btcd\ncd $GOPATH/src/github.com/btcsuite/btcd\ngo install -v . ./cmd/...\n```\n\n* btcd (and utilities) will now be installed in ```$GOPATH/bin```.  If you did\n  not already add the bin directory to your system path during Go installation,\n  we recommend you do so now.\n\n## Gentoo Linux Installation\n\n* [Install Layman](https://gitlab.com/bitcoin/gentoo) and enable the Bitcoin overlay.\n* Copy or symlink `/var/lib/layman/bitcoin/Documentation/package.keywords/btcd-live` to `/etc/portage/package.keywords/`\n* Install btcd: `$ emerge net-p2p/btcd`\n\n## Startup\n\nTypically btcd will run and start downloading the block chain with no extra\nconfiguration necessary, however, there is an optional method to use a\n`bootstrap.dat` file that may speed up the initial block chain download process.\n\n* [Using bootstrap.dat](https://github.com/btcsuite/btcd/blob/master/docs/configuration.md#using-bootstrapdat)\n"
  },
  {
    "path": "docs/json_rpc_api.md",
    "content": "# JSON RPC API\n\n1. [Overview](#Overview)<br />\n2. [HTTP POST Versus Websockets](#HttpPostVsWebsockets)<br />\n3. [Authentication](#Authentication)<br />\n3.1.  [Overview](#AuthenticationOverview)<br />\n3.2.  [HTTP Basic Access Authentication](#HTTPAuth)<br />\n3.3.  [JSON-RPC Authenticate Command (Websocket-specific)](#JSONAuth)<br />\n4. [Command-line Utility](#CLIUtil)<br />\n5. [Standard Methods](#Methods)<br />\n5.1. [Method Overview](#MethodOverview)<br />\n5.2. [Method Details](#MethodDetails)<br />\n6. [Extension Methods](#ExtensionMethods)<br />\n6.1. [Method Overview](#ExtMethodOverview)<br />\n6.2. [Method Details](#ExtMethodDetails)<br />\n7. [Websocket Extension Methods (Websocket-specific)](#WSExtMethods)<br />\n7.1. [Method Overview](#WSExtMethodOverview)<br />\n7.2. [Method Details](#WSExtMethodDetails)<br />\n8. [Notifications (Websocket-specific)](#Notifications)<br />\n8.1. [Notification Overview](#NotificationOverview)<br />\n8.2. [Notification Details](#NotificationDetails)<br />\n9. [Example Code](#ExampleCode)<br />\n9.1. [Go](#ExampleGoApp)<br />\n9.2. [node.js](#ExampleNodeJsCode)<br />\n\n<a name=\"Overview\" />\n\n### 1. Overview\n\nbtcd provides a [JSON-RPC](http://json-rpc.org/wiki/specification) API that is\nfully compatible with the original bitcoind/bitcoin-qt.  There are a few key\ndifferences between btcd and bitcoind as far as how RPCs are serviced:\n* Unlike bitcoind that has the wallet and chain intermingled in the same process\n  which leads to several issues, btcd intentionally splits the wallet and chain\n  services into independent processes.  See the blog post\n  [here](https://blog.conformal.com/btcd-not-your-moms-bitcoin-daemon/) for\n  further details on why they were separated.  This means that if you are\n  talking directly to btcd, only chain-related RPCs are available.  However both\n  chain-related and wallet-related RPCs are available via\n  [btcwallet](https://github.com/btcsuite/btcwallet).\n* btcd is secure by default which means that the RPC connection is TLS-enabled\n  by default\n* btcd provides access to the API through both\n  [HTTP POST](http://en.wikipedia.org/wiki/POST_%28HTTP%29) requests and\n  [Websockets](http://en.wikipedia.org/wiki/WebSocket)\n\nWebsockets are the preferred transport for btcd RPC and are used by applications\nsuch as [btcwallet](https://github.com/btcsuite/btcwallet) for inter-process\ncommunication with btcd.  The websocket connection endpoint for btcd is\n`wss://your_ip_or_domain:8334/ws`.\n\nIn addition to the [standard API](#Methods), an [extension API](#WSExtMethods)\nhas been developed that is exclusive to clients using Websockets. In its current\nstate, this API attempts to cover features found missing in the standard API\nduring the development of btcwallet.\n\nWhile the [standard API](#Methods) is stable, the\n[Websocket extension API](#WSExtMethods) should be considered a work in\nprogress, incomplete, and susceptible to changes (both additions and removals).\n\nThe original bitcoind/bitcoin-qt JSON-RPC API documentation is available at [https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_Calls_list](https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_Calls_list)\n\n<a name=\"HttpPostVsWebsockets\" />\n\n### 2. HTTP POST Versus Websockets\n\nThe btcd RPC server supports both [HTTP POST](http://en.wikipedia.org/wiki/POST_%28HTTP%29)\nrequests and the preferred [Websockets](http://en.wikipedia.org/wiki/WebSocket).\nAll of the [standard](#Methods) and [extension](#ExtensionMethods) methods\ndescribed in this documentation can be accessed through both.  As the name\nindicates, the [Websocket-specific extension](#WSExtMethods) methods can only be\naccessed when connected via Websockets.\n\nAs mentioned in the [overview](#Overview), the websocket connection endpoint for\nbtcd is `wss://your_ip_or_domain:8334/ws`.\n\nThe most important differences between the two transports as it pertains to the\nJSON-RPC API are:\n\n|   |HTTP POST Requests|Websockets|\n|---|------------------|----------|\n|Allows multiple requests across a single connection|No|Yes|\n|Supports asynchronous notifications|No|Yes|\n|Scales well with large numbers of requests|No|Yes|\n\n<a name=\"Authentication\" />\n\n### 3. Authentication\n\n<a name=\"AuthenticationOverview\" />\n\n**3.1 Authentication Overview**<br />\n\nThe following authentication details are needed before establishing a connection\nto a btcd RPC server:\n\n* **rpcuser** is the full-access username configured for the btcd RPC server\n* **rpcpass** is the full-access password configured for the btcd RPC server\n* **rpclimituser** is the limited username configured for the btcd RPC server\n* **rpclimitpass** is the limited password configured for the btcd RPC server\n* **rpccert** is the PEM-encoded X.509 certificate (public key) that the btcd\n  server is configured with.  It is automatically generated by btcd and placed\n  in the btcd home directory (which is typically `%LOCALAPPDATA%\\Btcd` on\n  Windows and `~/.btcd` on POSIX-like OSes)\n\n**NOTE:** As mentioned above, btcd is secure by default which means the RPC\nserver is not running unless configured with a **rpcuser** and **rpcpass**\nand/or a **rpclimituser** and **rpclimitpass**, and uses TLS authentication for\nall connections.\n\nDepending on which connection transaction you are using, you can choose one of\ntwo, mutually exclusive, methods.\n- [Use HTTP Authorization Header](#HTTPAuth) - HTTP POST requests and Websockets\n- [Use the JSON-RPC \"authenticate\" command](#JSONAuth) - Websockets only\n\n<a name=\"HTTPAuth\" />\n\n**3.2 HTTP Basic Access Authentication**<br />\n\nThe btcd RPC server uses HTTP [basic access authentication](http://en.wikipedia.org/wiki/Basic_access_authentication) with the **rpcuser**\nand **rpcpass** detailed above.  If the supplied credentials are invalid, you\nwill be disconnected immediately upon making the connection.\n\n<a name=\"JSONAuth\" />\n\n**3.3 JSON-RPC Authenticate Command (Websocket-specific)**<br />\n\nWhile the HTTP basic access authentication method is the preferred method, the\nability to set HTTP headers from websockets is not always available.  In that\ncase, you will need to use the [authenticate](#authenticate) JSON-RPC method.\n\nThe [authenticate](#authenticate) command must be the first command sent after\nconnecting to the websocket.  Sending any other commands before authenticating,\nsupplying invalid credentials, or attempting to authenticate again when already\nauthenticated will cause the websocket to be closed immediately.\n\n\n<a name=\"CLIUtil\" />\n\n### 4. Command-line Utility\n\nbtcd comes with a separate utility named `btcctl` which can be used to issue\nthese RPC commands via HTTP POST requests to btcd after configuring it with the\ninformation in the [Authentication](#Authentication) section above.  It can also\nbe used to communicate with any server/daemon/service which provides a JSON-RPC\nAPI compatible with the original bitcoind/bitcoin-qt client.\n\n<a name=\"Methods\" />\n\n### 5. Standard Methods\n\n<a name=\"MethodOverview\" />\n\n**5.1 Method Overview**<br />\n\nThe following is an overview of the RPC methods and their current status.  Click\nthe method name for further details such as parameter and return information.\n\n|#|Method|Safe for limited user?|Description|\n|---|------|----------|-----------|\n|1|[addnode](#addnode)|N|Attempts to add or remove a persistent peer.|\n|2|[createrawtransaction](#createrawtransaction)|Y|Returns a new transaction spending the provided inputs and sending to the provided addresses.|\n|3|[decoderawtransaction](#decoderawtransaction)|Y|Returns a JSON object representing the provided serialized, hex-encoded transaction.|\n|4|[decodescript](#decodescript)|Y|Returns a JSON object with information about the provided hex-encoded script.|\n|5|[getaddednodeinfo](#getaddednodeinfo)|N|Returns information about manually added (persistent) peers.|\n|6|[getbestblockhash](#getbestblockhash)|Y|Returns the hash of the of the best (most recent) block in the longest block chain.|\n|7|[getblock](#getblock)|Y|Returns information about a block given its hash.|\n|8|[getblockcount](#getblockcount)|Y|Returns the number of blocks in the longest block chain.|\n|9|[getblockhash](#getblockhash)|Y|Returns hash of the block in best block chain at the given height.|\n|10|[getblockheader](#getblockheader)|Y|Returns the block header of the block.|\n|11|[getchaintips](#getchaintips)|Y|Returns information about all known tips in the block tree, including the main chain as well as orphaned branches.|\n|12|[getconnectioncount](#getconnectioncount)|N|Returns the number of active connections to other peers.|\n|13|[getdifficulty](#getdifficulty)|Y|Returns the proof-of-work difficulty as a multiple of the minimum difficulty.|\n|14|[getgenerate](#getgenerate)|N|Return if the server is set to generate coins (mine) or not.|\n|15|[gethashespersec](#gethashespersec)|N|Returns a recent hashes per second performance measurement while generating coins (mining).|\n|16|[getinfo](#getinfo)|Y|Returns a JSON object containing various state info.|\n|17|[getmempoolinfo](#getmempoolinfo)|N|Returns a JSON object containing mempool-related information.|\n|18|[getmininginfo](#getmininginfo)|N|Returns a JSON object containing mining-related information.|\n|19|[getnettotals](#getnettotals)|Y|Returns a JSON object containing network traffic statistics.|\n|20|[getnetworkhashps](#getnetworkhashps)|Y|Returns the estimated network hashes per second for the block heights provided by the parameters.|\n|21|[getpeerinfo](#getpeerinfo)|N|Returns information about each connected network peer as an array of json objects.|\n|22|[getrawmempool](#getrawmempool)|Y|Returns an array of hashes for all of the transactions currently in the memory pool.|\n|23|[getrawtransaction](#getrawtransaction)|Y|Returns information about a transaction given its hash.|\n|24|[help](#help)|Y|Returns a list of all commands or help for a specified command.|\n|25|[ping](#ping)|N|Queues a ping to be sent to each connected peer.|\n|26|[sendrawtransaction](#sendrawtransaction)|Y|Submits the serialized, hex-encoded transaction to the local peer and relays it to the network.<br /><font color=\"orange\">btcd does not yet implement the `allowhighfees` parameter, so it has no effect</font>|\n|27|[setgenerate](#setgenerate) |N|Set the server to generate coins (mine) or not.<br/>NOTE: Since btcd does not have the wallet integrated to provide payment addresses, btcd must be configured via the `--miningaddr` option to provide which payment addresses to pay created blocks to for this RPC to function.|\n|28|[stop](#stop)|N|Shutdown btcd.|\n|29|[submitblock](#submitblock)|Y|Attempts to submit a new serialized, hex-encoded block to the network.|\n|30|[validateaddress](#validateaddress)|Y|Verifies the given address is valid.  NOTE: Since btcd does not have a wallet integrated, btcd will only return whether the address is valid or not.|\n|31|[verifychain](#verifychain)|N|Verifies the block chain database.|\n\n<a name=\"MethodDetails\" />\n\n**5.2 Method Details**<br />\n\n<a name=\"addnode\"/>\n\n|   |   |\n|---|---|\n|Method|addnode|\n|Parameters|1. peer (string, required) - ip address and port of the peer to operate on<br />2. command (string, required) - `add` to add a persistent peer, `remove` to remove a persistent peer, or `onetry` to try a single connection to a peer|\n|Description|Attempts to add or remove a persistent peer.|\n|Returns|Nothing|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"createrawtransaction\"/>\n\n|   |   |\n|---|---|\n|Method|createrawtransaction|\n|Parameters|1. transaction inputs (JSON array, required) - json array of json objects<br />`[`<br />&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"txid\": \"hash\", (string, required) the hash of the input transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"vout\": n  (numeric, required) the specific output of the input transaction to redeem`<br />&nbsp;&nbsp;`}, ...`<br />`]`<br />2. addresses and amounts (JSON object, required) - json object with addresses as keys and amounts as values<br />`{`<br />&nbsp;&nbsp;`\"address\": n.nnn (numeric, required) the address to send to as the key and the amount in BTC as the value`<br />&nbsp;&nbsp;`, ...`<br />`}`<br />3. locktime (int64, optional, default=0) - specifies the transaction locktime.  If non-zero, the inputs will also have their locktimes activated. |\n|Description|Returns a new transaction spending the provided inputs and sending to the provided addresses.<br />The transaction inputs are not signed in the created transaction.<br />The `signrawtransaction` RPC command provided by wallet must be used to sign the resulting transaction.|\n|Returns|`\"transaction\" (string) hex-encoded bytes of the serialized transaction`|\n|Example Parameters|1. transaction inputs `[{\"txid\":\"e6da89de7a6b8508ce8f371a3d0535b04b5e108cb1a6e9284602d3bfd357c018\",\"vout\":1}]`<br />2. addresses and amounts `{\"13cgrTP7wgbZYWrY9BZ22BV6p82QXQT3nY\": 0.49213337}`<br />3. locktime `0`|\n|Example Return|`010000000118c057d3bfd3024628e9a6b18c105e4bb035053d1a378fce08856b7ade89dae6010000`<br />`0000ffffffff0199efee02000000001976a9141cb013db35ecccc156fdfd81d03a11c51998f99388`<br />`ac00000000`<br /><font color=\"orange\">**Newlines added for display purposes.  The actual return does not contain newlines.**</font>|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"decoderawtransaction\"/>\n\n|   |   |\n|---|---|\n|Method|decoderawtransaction|\n|Parameters|1. data (string, required) - serialized, hex-encoded transaction|\n|Description|Returns a JSON object representing the provided serialized, hex-encoded transaction.|\n|Returns|`{ (json object)`<br />&nbsp;&nbsp;`\"txid\": \"hash\",  (string) the hash of the transaction`<br />&nbsp;&nbsp;`\"version\": n,  (numeric) the transaction version`<br />&nbsp;&nbsp;`\"locktime\": n,  (numeric) the transaction lock time`<br />&nbsp;&nbsp;`\"vin\": [  (array of json objects) the transaction inputs as json objects`<br />&nbsp;&nbsp;<font color=\"orange\">For coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"coinbase\": \"data\",  (string) the hex-encoded bytes of the signature script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": n,  (numeric) the script sequence number`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;<font color=\"orange\">For non-coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"txid\": \"hash\", (string) the hash of the origin transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"vout\": n, (numeric) the index of the output being redeemed from the origin transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptSig\": { (json object) the signature script used to redeem the origin transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"asm\", (string) disassembly of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"data\",  (string) hex-encoded bytes of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": n,  (numeric) the script sequence number`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}, ...`<br />&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`\"vout\": [  (array of json objects) the transaction outputs as json objects`<br />&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"value\": n, (numeric) the value in BTC`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"n\": n, (numeric) the index of this transaction output`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptPubKey\": { (json object) the public key script used to pay coins`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"asm\",  (string) disassembly of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"data\", (string) hex-encoded bytes of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"reqSigs\": n,  (numeric) the number of required signatures`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"type\": \"scripttype\" (string) the type of the script (e.g. 'pubkeyhash')`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"addresses\": [ (json array of string) the bitcoin addresses associated with this output`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"bitcoinaddress\",  (string) the bitcoin address`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`...`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}, ...`<br />&nbsp;&nbsp;`]`<br />`}`|\n|Example Return|`{`<br />&nbsp;&nbsp;`\"txid\": \"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\",`<br />&nbsp;&nbsp;`\"version\": 1,`<br />&nbsp;&nbsp;`\"locktime\": 0,`<br />&nbsp;&nbsp;`\"vin\": [`<br />&nbsp;&nbsp;<font color=\"orange\">For coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"coinbase\": \"04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6...\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": 4294967295,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;<font color=\"orange\">For non-coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"txid\": \"60ac4b057247b3d0b9a8173de56b5e1be8c1d1da970511c626ef53706c66be04\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"vout\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptSig\": {`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"3046022100cb42f8df44eca83dd0a727988dcde9384953e830b1f8004d57485e2ede1b9c8f0...\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"493046022100cb42f8df44eca83dd0a727988dcde9384953e830b1f8004d57485e2ede1b9c8...\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": 4294967295,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`\"vout\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"value\": 50,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"n\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptPubKey\": {`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4ce...\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4...\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"reqSigs\": 1,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"type\": \"pubkey\"`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"addresses\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;`]`<br />`}`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"decodescript\"/>\n\n|   |   |\n|---|---|\n|Method|decodescript|\n|Parameters|1. script (string, required) - hex-encoded script|\n|Description|Returns a JSON object with information about the provided hex-encoded script.|\n|Returns|`{ (json object)`<br />&nbsp;&nbsp;`\"asm\": \"asm\",  (string) disassembly of the script`<br />&nbsp;&nbsp;`\"reqSigs\": n,  (numeric) the number of required signatures`<br />&nbsp;&nbsp;`\"type\": \"scripttype\",  (string) the type of the script (e.g. 'pubkeyhash')`<br />&nbsp;&nbsp;`\"addresses\": [ (json array of string) the bitcoin addresses associated with this script`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"bitcoinaddress\",  (string) the bitcoin address`<br />&nbsp;&nbsp;&nbsp;&nbsp;`...`<br />&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`\"p2sh\": \"scripthash\",  (string) the script hash for use in pay-to-script-hash transactions`<br />`}`|\n|Example Return|`{`<br />&nbsp;&nbsp;`\"asm\": \"OP_DUP OP_HASH160 b0a4d8a91981106e4ed85165a66748b19f7b7ad4 OP_EQUALVERIFY OP_CHECKSIG\",`<br />&nbsp;&nbsp;`\"reqSigs\": 1,`<br />&nbsp;&nbsp;`\"type\": \"pubkeyhash\",`<br />&nbsp;&nbsp;`\"addresses\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"1H71QVBpzuLTNUh5pewaH3UTLTo2vWgcRJ\"`<br />&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`\"p2sh\": \"359b84ff799f48231990ff0298206f54117b08b6\"`<br />`}`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getaddednodeinfo\"/>\n\n|   |   |\n|---|---|\n|Method|getaddednodeinfo|\n|Parameters|1. dns (boolean, required) - specifies whether the returned data is a JSON object including DNS and connection information, or just a list of added peers<br />2. node (string, optional) - only return information about this specific peer instead of all added peers.|\n|Description|Returns information about manually added (persistent) peers.|\n|Returns (dns=false)|`[\"ip:port\", ...]`|\n|Returns (dns=true)|`[ (json array of objects)`<br />&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"addednode\": \"ip_or_domain\",  (string) the ip address or domain of the added peer`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"connected\": true or false,  (boolean) whether or not the peer is currently connected`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"addresses\": [  (json array or objects) DNS lookup and connection information about the peer`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"address\": \"ip\",  (string) the ip address for this DNS entry`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"connected\": \"inbound/outbound/false\"  (string) the connection 'direction' (if connected)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}, ...`<br />&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`}, ...`<br />`]`|\n|Example Return (dns=false)|`[\"192.168.0.10:8333\", \"mydomain.org:8333\"]`|\n|Example Return (dns=true)|`[`<br />&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"addednode\": \"mydomain.org:8333\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"connected\": true,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"addresses\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"address\": \"1.2.3.4\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"connected\": \"outbound\"`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`},`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"address\": \"5.6.7.8\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"connected\": \"false\"`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`}`<br />`]`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getbestblockhash\"/>\n\n|   |   |\n|---|---|\n|Method|getbestblockhash|\n|Parameters|None|\n|Description|Returns the hash of the of the best (most recent) block in the longest block chain.|\n|Returns|string|\n|Example Return|`0000000000000001f356adc6b29ab42b59f913a396e170f80190dba615bd1e60`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getblock\"/>\n\n|   |   |\n|---|---|\n|Method|getblock|\n|Parameters|1. block hash (string, required) - the hash of the block<br />2. verbosity (int, optional, default=1) - Specifies whether the block data should be returned as a hex-encoded string (0), as parsed data with a slice of TXIDs (1), or as parsed data with parsed transaction data (2).\n|Description|Returns information about a block given its hash.|\n|Returns (verbosity=0)|`\"data\" (string) hex-encoded bytes of the serialized block`|\n|Returns (verbosity=1)|`{ (json object)`<br />&nbsp;&nbsp;`\"hash\": \"blockhash\",  (string) the hash of the block (same as provided)`<br />&nbsp;&nbsp;`\"confirmations\": n,  (numeric) the number of confirmations`<br />&nbsp;&nbsp;`\"strippedsize\", n (numeric) the size of the block without witness data`<br />&nbsp;&nbsp;`\"size\": n,  (numeric) the size of the block`<br />&nbsp;&nbsp;`\"weight\": n, (numeric) value of the weight metric`<br />&nbsp;&nbsp;`\"height\": n,  (numeric) the height of the block in the block chain`<br />&nbsp;&nbsp;`\"version\": n,  (numeric) the block version`<br />&nbsp;&nbsp;`\"merkleroot\": \"hash\",  (string) root hash of the merkle tree`<br />&nbsp;&nbsp;`\"tx\": [ (json array of string) the transaction hashes`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"transactionhash\",  (string) hash of the parent transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;`...`<br />&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`\"time\": n,  (numeric) the block time in seconds since 1 Jan 1970 GMT`<br />&nbsp;&nbsp;`\"nonce\": n,  (numeric) the block nonce`<br />&nbsp;&nbsp;`\"bits\", n,  (numeric) the bits which represent the block difficulty`<br />&nbsp;&nbsp;`difficulty: n.nn,  (numeric) the proof-of-work difficulty as a multiple of the minimum difficulty`<br />&nbsp;&nbsp;`\"previousblockhash\": \"hash\",  (string) the hash of the previous block`<br />&nbsp;&nbsp;`\"nextblockhash\": \"hash\",  (string) the hash of the next block (only if there is one)`<br />`}`|\n|Returns (verbosity=2)|`{ (json object)`<br />&nbsp;&nbsp;`\"hash\": \"blockhash\",  (string) the hash of the block (same as provided)`<br />&nbsp;&nbsp;`\"confirmations\": n,  (numeric) the number of confirmations`<br />&nbsp;&nbsp;`\"strippedsize\", n (numeric) the size of the block without witness data`<br />&nbsp;&nbsp;`\"size\": n,  (numeric) the size of the block`<br />&nbsp;&nbsp;`\"weight\": n, (numeric) value of the weight metric`<br />&nbsp;&nbsp;`\"height\": n,  (numeric) the height of the block in the block chain`<br />&nbsp;&nbsp;`\"version\": n,  (numeric) the block version`<br />&nbsp;&nbsp;`\"merkleroot\": \"hash\",  (string) root hash of the merkle tree`<br />&nbsp;&nbsp;`\"rawtx\": [ (array of json objects) the transactions as json objects`<br />&nbsp;&nbsp;&nbsp;&nbsp;`(see getrawtransaction json object details)`<br />&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`\"time\": n,  (numeric) the block time in seconds since 1 Jan 1970 GMT`<br />&nbsp;&nbsp;`\"nonce\": n,  (numeric) the block nonce`<br />&nbsp;&nbsp;`\"bits\", n,  (numeric) the bits which represent the block difficulty`<br />&nbsp;&nbsp;`difficulty: n.nn,  (numeric) the proof-of-work difficulty as a multiple of the minimum difficulty`<br />&nbsp;&nbsp;`\"previousblockhash\": \"hash\",  (string) the hash of the previous block`<br />&nbsp;&nbsp;`\"nextblockhash\": \"hash\",  (string) the hash of the next block`<br />`}`|\n|Example Return (verbosity=0)|`\"010000000000000000000000000000000000000000000000000000000000000000000000`<br />`3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49`<br />`ffff001d1dac2b7c01010000000100000000000000000000000000000000000000000000`<br />`00000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f`<br />`4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f`<br />`6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104`<br />`678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f`<br />`4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000\"`<br /><font color=\"orange\">**Newlines added for display purposes.  The actual return does not contain newlines.**</font>|\n|Example Return (verbosity=1)|`{`<br />&nbsp;&nbsp;`\"hash\": \"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\",`<br />&nbsp;&nbsp;`\"confirmations\": 277113,`<br />&nbsp;&nbsp;`\"size\": 285,`<br />&nbsp;&nbsp;`\"height\": 0,`<br />&nbsp;&nbsp;`\"version\": 1,`<br />&nbsp;&nbsp;`\"merkleroot\": \"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\",`<br />&nbsp;&nbsp;`\"tx\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\"`<br />&nbsp;&nbsp;`],`<br />&nbsp;&nbsp;`\"time\": 1231006505,`<br />&nbsp;&nbsp;`\"nonce\": 2083236893,`<br />&nbsp;&nbsp;`\"bits\": \"1d00ffff\",`<br />&nbsp;&nbsp;`\"difficulty\": 1,`<br />&nbsp;&nbsp;`\"previousblockhash\": \"0000000000000000000000000000000000000000000000000000000000000000\",`<br />&nbsp;&nbsp;`\"nextblockhash\": \"00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048\"`<br />`}`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getblockcount\"/>\n\n|   |   |\n|---|---|\n|Method|getblockcount|\n|Parameters|None|\n|Description|Returns the number of blocks in the longest block chain.|\n|Returns|numeric|\n|Example Return|`276820`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getblockhash\"/>\n\n|   |   |\n|---|---|\n|Method|getblockhash|\n|Parameters|1. block height (numeric, required)|\n|Description|Returns hash of the block in best block chain at the given height.|\n|Returns|string|\n|Example Return|`000000000000000096579458d1c0f1531fcfc58d57b4fce51eb177d8d10e784d`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getblockheader\"/>\n\n|   |   |\n|---|---|\n|Method|getblockheader|\n|Parameters|1. block hash (string, required) - the hash of the block<br />2. verbose (boolean, optional, default=true) - specifies the block header is returned as a JSON object instead of a hex-encoded string|\n|Description|Returns hex-encoded bytes of the serialized block header.|\n|Returns (verbose=false)|`\"data\" (string) hex-encoded bytes of the serialized block`|\n|Returns (verbose=true)|`{ (json object)`<br />&nbsp;&nbsp;`\"hash\": \"blockhash\", (string) the hash of the block (same as provided)`<br />&nbsp;&nbsp;`\"confirmations\": n,  (numeric) the number of confirmations`<br />&nbsp;&nbsp;`\"height\": n, (numeric) the height of the block in the block chain`<br />&nbsp;&nbsp;`\"version\": n,  (numeric) the block version`<br />&nbsp;&nbsp;`\"merkleroot\": \"hash\",  (string) root hash of the merkle tree`<br />&nbsp;&nbsp;`\"time\": n,  (numeric) the block time in seconds since 1 Jan 1970 GMT`<br />&nbsp;&nbsp;`\"nonce\": n,  (numeric) the block nonce`<br />&nbsp;&nbsp;`\"bits\": n,  (numeric) the bits which represent the block difficulty`<br />&nbsp;&nbsp;`\"difficulty\": n.nn,  (numeric) the proof-of-work difficulty as a multiple of the minimum difficulty`<br />&nbsp;&nbsp;`\"previousblockhash\": \"hash\",  (string) the hash of the previous block`<br />&nbsp;&nbsp;`\"nextblockhash\": \"hash\",  (string) the hash of the next block (only if there is one)`<br />`}`|\n|Example Return (verbose=false)|`\"0200000035ab154183570282ce9afc0b494c9fc6a3cfea05aa8c1add2ecc564900000000`<br />`38ba3d78e4500a5a7570dbe61960398add4410d278b21cd9708e6d9743f374d544fc0552`<br />`27f1001c29c1ea3b\"`<br /><font color=\"orange\">**Newlines added for display purposes.  The actual return does not contain newlines.**</font>|\n|Example Return (verbose=true)|`{`<br />&nbsp;&nbsp;`\"hash\": \"00000000009e2958c15ff9290d571bf9459e93b19765c6801ddeccadbb160a1e\",`<br />&nbsp;&nbsp;`\"confirmations\": 392076,`<br />&nbsp;&nbsp;`\"height\": 100000,`<br />&nbsp;&nbsp;`\"version\": 2,`<br />&nbsp;&nbsp;`\"merkleroot\": \"d574f343976d8e70d91cb278d21044dd8a396019e6db70755a0a50e4783dba38\",`<br />&nbsp;&nbsp;`\"time\": 1376123972,`<br />&nbsp;&nbsp;`\"nonce\": 1005240617,`<br />&nbsp;&nbsp;`\"bits\": \"1c00f127\",`<br />&nbsp;&nbsp;`\"difficulty\": 271.75767393,`<br />&nbsp;&nbsp;`\"previousblockhash\": \"000000004956cc2edd1a8caa05eacfa3c69f4c490bfc9ace820257834115ab35\",`<br />&nbsp;&nbsp;`\"nextblockhash\": \"0000000000629d100db387f37d0f37c51118f250fb0946310a8c37316cbc4028\"`<br />`}`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getchaintips\"/>\n\n|   |   |\n|---|---|\n|Method|getchaintips|\n|Parameters|None|\n|Description|Returns information about all known tips in the block tree, including the main chain as well as orphaned branches|\n|Returns|`(A json object array)`<br />`height`: `(numeric)` The height of the chain tip.<br />`hash`: `(string)` The block hash of the chain tip.<br />`branchlen`: `(numeric)` Returns zero for main chain. Otherwise is the length of branch connecting the tip to the main chain.<br />`status`: `(string)`  Status of the chain. Returns \"active\" for the main chain.`|\n|Example Return|`[\"{\"height\": 1, \"hash\": \"78b945a390c561cf8b9ccf0598be15d7d85c67022bf71083c0b0bd8042fc30d7\", \"branchlen\": 1, \"status\": \"valid-fork\"}, {\"height\": 1, \"hash\": \"584c830a4783c6331e59cb984686cfec14bccc596fe8bbd1660b90cda359b42a\", \"branchlen\": 0, \"status\": \"active\"}\"]`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getconnectioncount\"/>\n\n|   |   |\n|---|---|\n|Method|getconnectioncount|\n|Parameters|None|\n|Description|Returns the number of active connections to other peers|\n|Returns|numeric|\n|Example Return|`8`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getdifficulty\"/>\n\n|   |   |\n|---|---|\n|Method|getdifficulty|\n|Parameters|None|\n|Description|Returns the proof-of-work difficulty as a multiple of the minimum difficulty.|\n|Returns|numeric|\n|Example Return|`1180923195.260000`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getgenerate\"/>\n\n|   |   |\n|---|---|\n|Method|getgenerate|\n|Parameters|None|\n|Description|Return if the server is set to generate coins (mine) or not.|\n|Returns|`false` (boolean)|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"gethashespersec\"/>\n\n|   |   |\n|---|---|\n|Method|gethashespersec|\n|Parameters|None|\n|Description|Returns a recent hashes per second performance measurement while generating coins (mining).|\n|Returns|`0` (numeric)|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getinfo\"/>\n\n|   |   |\n|---|---|\n|Method|getinfo|\n|Parameters|None|\n|Description|Returns a JSON object containing various state info.|\n|Notes|NOTE: Since btcd does NOT contain wallet functionality, wallet-related fields are not returned.  See getinfo in btcwallet for a version which includes that information.|\n|Returns|`{ (json object)`<br />&nbsp;&nbsp;`\"version\": n,  (numeric) the version of the server`<br />&nbsp;&nbsp;`\"protocolversion\": n,  (numeric) the latest supported protocol version`<br />&nbsp;&nbsp;`\"blocks\": n,  (numeric) the number of blocks processed`<br />&nbsp;&nbsp;`\"timeoffset\": n,  (numeric) the time offset`<br />&nbsp;&nbsp;`\"connections\": n,  (numeric) the number of connected peers`<br />&nbsp;&nbsp;`\"proxy\": \"host:port\",  (string) the proxy used by the server`<br />&nbsp;&nbsp;`\"difficulty\": n.nn,  (numeric) the current target difficulty`<br />&nbsp;&nbsp;`\"testnet\": true or false,  (boolean) whether or not server is using testnet`<br />&nbsp;&nbsp;`\"relayfee\": n.nn,  (numeric) the minimum relay fee for non-free transactions in BTC/KB`<br />`}`|\n|Example Return|`{`<br />&nbsp;&nbsp;`\"version\": 70000`<br />&nbsp;&nbsp;`\"protocolversion\": 70001,  `<br />&nbsp;&nbsp;`\"blocks\": 298963,`<br />&nbsp;&nbsp;`\"timeoffset\": 0,`<br />&nbsp;&nbsp;`\"connections\": 17,`<br />&nbsp;&nbsp;`\"proxy\": \"\",`<br />&nbsp;&nbsp;`\"difficulty\": 8000872135.97,`<br />&nbsp;&nbsp;`\"testnet\": false,`<br />&nbsp;&nbsp;`\"relayfee\": 0.00001,`<br />`}`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getmempoolinfo\"/>\n\n|   |   |\n|---|---|\n|Method|getmempoolinfo|\n|Parameters|None|\n|Description|Returns a JSON object containing mempool-related information.|\n|Returns|`{ (json object)`<br />&nbsp;&nbsp;`\"bytes\": n,  (numeric) size in bytes of the mempool`<br />&nbsp;&nbsp;`\"size\": n,  (numeric) number of transactions in the mempool`<br />`}`|\nExample Return|`{`<br />&nbsp;&nbsp;`\"bytes\": 310768,`<br />&nbsp;&nbsp;`\"size\": 157,`<br />`}`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getmininginfo\"/>\n\n|   |   |\n|---|---|\n|Method|getmininginfo|\n|Parameters|None|\n|Description|Returns a JSON object containing mining-related information.|\n|Returns|`{ (json object)`<br />&nbsp;&nbsp;`\"blocks\": n,  (numeric) latest best block`<br />&nbsp;&nbsp;`\"currentblocksize\": n,  (numeric) size of the latest best block`<br />&nbsp;&nbsp;`\"currentblockweight\": n,  (numeric) weight of the latest best block`<br />&nbsp;&nbsp;`\"currentblocktx\": n,  (numeric) number of transactions in the latest best block`<br />&nbsp;&nbsp;`\"difficulty\": n.nn,  (numeric) current target difficulty`<br />&nbsp;&nbsp;`\"errors\": \"errors\",  (string) any current errors`<br />&nbsp;&nbsp;`\"generate\": true or false,  (boolean) whether or not server is set to generate coins`<br />&nbsp;&nbsp;`\"genproclimit\": n,  (numeric) number of processors to use for coin generation (-1 when disabled)`<br />&nbsp;&nbsp;`\"hashespersec\": n,  (numeric) recent hashes per second performance measurement while generating coins`<br />&nbsp;&nbsp;`\"networkhashps\": n,  (numeric) estimated network hashes per second for the most recent blocks`<br />&nbsp;&nbsp;`\"pooledtx\": n,  (numeric) number of transactions in the memory pool`<br />&nbsp;&nbsp;`\"testnet\": true or false,  (boolean) whether or not server is using testnet`<br />`}`|\n|Example Return|`{`<br />&nbsp;&nbsp;`\"blocks\": 236526,`<br />&nbsp;&nbsp;`\"currentblocksize\": 185,`<br />&nbsp;&nbsp;`\"currentblockweight\": 740,`<br />&nbsp;&nbsp;`\"currentblocktx\": 1,`<br />&nbsp;&nbsp;`\"difficulty\": 256,`<br />&nbsp;&nbsp;`\"errors\": \"\",`<br />&nbsp;&nbsp;`\"generate\": false,`<br />&nbsp;&nbsp;`\"genproclimit\": -1,`<br />&nbsp;&nbsp;`\"hashespersec\": 0,`<br />&nbsp;&nbsp;`\"networkhashps\": 33081554756,`<br />&nbsp;&nbsp;`\"pooledtx\": 8,`<br />&nbsp;&nbsp;`\"testnet\": true,`<br />`}`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getnettotals\"/>\n\n|   |   |\n|---|---|\n|Method|getnettotals|\n|Parameters|None|\n|Description|Returns a JSON object containing network traffic statistics.|\n|Returns|`{`<br />&nbsp;&nbsp;`\"totalbytesrecv\": n,  (numeric) total bytes received`<br />&nbsp;&nbsp;`\"totalbytessent\": n,  (numeric) total bytes sent`<br />&nbsp;&nbsp;`\"timemillis\": n  (numeric) number of milliseconds since 1 Jan 1970 GMT`<br />`}`|\n|Example Return|`{`<br />&nbsp;&nbsp;`\"totalbytesrecv\": 1150990,`<br />&nbsp;&nbsp;`\"totalbytessent\": 206739,`<br />&nbsp;&nbsp;`\"timemillis\": 1391626433845`<br />`}`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getnetworkhashps\"/>\n\n|   |   |\n|---|---|\n|Method|getnetworkhashps|\n|Parameters|1. blocks (numeric, optional, default=120) - The number of blocks, or -1 for blocks since last difficulty change<br />2. height (numeric, optional, default=-1) - Perform estimate ending with this height or -1 for current best chain block height|\n|Description|Returns the estimated network hashes per second for the block heights provided by the parameters.|\n|Returns|numeric|\n|Example Return|`6573971939`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getpeerinfo\"/>\n\n|   |   |\n|---|---|\n|Method|getpeerinfo|\n|Parameters|None|\n|Description|Returns data about each connected network peer as an array of json objects.|\n|Returns|`[`<br />&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"addr\": \"host:port\",  (string) the ip address and port of the peer`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"services\": \"00000001\",  (string) the services supported by the peer`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"lastrecv\": n,  (numeric) time the last message was received in seconds since 1 Jan 1970 GMT`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"lastsend\": n,  (numeric) time the last message was sent in seconds since 1 Jan 1970 GMT`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"bytessent\": n,  (numeric) total bytes sent`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"bytesrecv\": n,  (numeric) total bytes received`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"conntime\": n,  (numeric) time the connection was made in seconds since 1 Jan 1970 GMT`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"pingtime\": n,  (numeric) number of microseconds the last ping took`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"pingwait\": n,  (numeric) number of microseconds a queued ping has been waiting for a response`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"version\": n,  (numeric) the protocol version of the peer`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"subver\": \"useragent\",  (string) the user agent of the peer`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"inbound\": true_or_false,  (boolean) whether or not the peer is an inbound connection`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"startingheight\": n,  (numeric) the latest block height the peer knew about when the connection was established`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"currentheight\": n,  (numeric) the latest block height the peer is known to have relayed since connected`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"syncnode\": true_or_false,  (boolean) whether or not the peer is the sync peer`<br />&nbsp;&nbsp;`}, ...`<br />`]`|\n|Example Return|`[`<br />&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"addr\": \"178.172.xxx.xxx:8333\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"services\": \"00000001\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"lastrecv\": 1388183523,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"lastsend\": 1388185470,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"bytessent\": 287592965,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"bytesrecv\": 780340,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"conntime\": 1388182973,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"pingtime\": 405551,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"pingwait\": 183023,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"version\": 70001,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"subver\": \"/btcd:0.4.0/\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"inbound\": false,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"startingheight\": 276921,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"currentheight\": 276955,`<br/>&nbsp;&nbsp;&nbsp;&nbsp;`\"syncnode\": true,`<br />&nbsp;&nbsp;`}`<br />`]`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getrawtransaction\"/>\n\n|   |   |\n|---|---|\n|Method|getrawtransaction|\n|Parameters|1. transaction hash (string, required) - the hash of the transaction<br />2. verbose (int, optional, default=0) - specifies the transaction is returned as a JSON object instead of hex-encoded string|\n|Description|Returns information about a transaction given its hash.|\n|Returns (verbose=0)|`\"data\" (string) hex-encoded bytes of the serialized transaction`|\n|Returns (verbose=1)|`{ (json object)`<br />&nbsp;&nbsp;`\"hex\": \"data\",  (string) hex-encoded transaction`<br />&nbsp;&nbsp;`\"txid\": \"hash\",  (string) the hash of the transaction`<br />&nbsp;&nbsp;`\"version\": n,  (numeric) the transaction version`<br />&nbsp;&nbsp;`\"locktime\": n,  (numeric) the transaction lock time`<br />&nbsp;&nbsp;`\"vin\": [  (array of json objects) the transaction inputs as json objects`<br />&nbsp;&nbsp;<font color=\"orange\">For coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"coinbase\": \"data\",  (string) the hex-encoded bytes of the signature script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": n,  (numeric) the script sequence number`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"txinwitness\": “data\", (string) the witness stack for the input`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;<font color=\"orange\">For non-coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"txid\": \"hash\", (string) the hash of the origin transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"vout\": n, (numeric) the index of the output being redeemed from the origin transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptSig\": { (json object) the signature script used to redeem the origin transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"asm\", (string) disassembly of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"data\",  (string) hex-encoded bytes of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": n,  (numeric) the script sequence number`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"txinwitness\": “data\", (string) the witness stack for the input`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}, ...`<br />&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`\"vout\": [  (array of json objects) the transaction outputs as json objects`<br />&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"value\": n, (numeric) the value in BTC`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"n\": n, (numeric) the index of this transaction output`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptPubKey\": { (json object) the public key script used to pay coins`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"asm\",  (string) disassembly of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"data\", (string) hex-encoded bytes of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"reqSigs\": n,  (numeric) the number of required signatures`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"type\": \"scripttype\" (string) the type of the script (e.g. 'pubkeyhash')`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"addresses\": [ (json array of string) the bitcoin addresses associated with this output`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"bitcoinaddress\",  (string) the bitcoin address`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`...`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}, ...`<br />&nbsp;&nbsp;`]`<br />`}`|\n|Example Return (verbose=0)|`\"010000000104be666c7053ef26c6110597dad1c1e81b5e6be53d17a8b9d0b34772054bac60000000`<br />`008c493046022100cb42f8df44eca83dd0a727988dcde9384953e830b1f8004d57485e2ede1b9c8f`<br />`022100fbce8d84fcf2839127605818ac6c3e7a1531ebc69277c504599289fb1e9058df0141045a33`<br />`76eeb85e494330b03c1791619d53327441002832f4bd618fd9efa9e644d242d5e1145cb9c2f71965`<br />`656e276633d4ff1a6db5e7153a0a9042745178ebe0f5ffffffff0280841e00000000001976a91406`<br />`f1b6703d3f56427bfcfd372f952d50d04b64bd88ac4dd52700000000001976a9146b63f291c295ee`<br />`abd9aee6be193ab2d019e7ea7088ac00000000`<br /><font color=\"orange\">**Newlines added for display purposes.  The actual return does not contain newlines.**</font>|\n|Example Return (verbose=1)|`{`<br />&nbsp;&nbsp;`\"hex\": \"01000000010000000000000000000000000000000000000000000000000000000000000000f...\",`<br />&nbsp;&nbsp;`\"txid\": \"90743aad855880e517270550d2a881627d84db5265142fd1e7fb7add38b08be9\",`<br />&nbsp;&nbsp;`\"version\": 1,`<br />&nbsp;&nbsp;`\"locktime\": 0,`<br />&nbsp;&nbsp;`\"vin\": [`<br />&nbsp;&nbsp;<font color=\"orange\">For coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"coinbase\": \"03708203062f503253482f04066d605108f800080100000ea2122f6f7a636f696e4065757374726174756d2f\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;<font color=\"orange\">For non-coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"txid\": \"60ac4b057247b3d0b9a8173de56b5e1be8c1d1da970511c626ef53706c66be04\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"vout\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptSig\": {`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"3046022100cb42f8df44eca83dd0a727988dcde9384953e830b1f8004d57485e2ede1b9c8f0...\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"493046022100cb42f8df44eca83dd0a727988dcde9384953e830b1f8004d57485e2ede1b9c8...\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": 4294967295,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`\"vout\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"value\": 25.1394,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"n\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptPubKey\": {`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"OP_DUP OP_HASH160 ea132286328cfc819457b9dec386c4b5c84faa5c OP_EQUALVERIFY OP_CHECKSIG\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"76a914ea132286328cfc819457b9dec386c4b5c84faa5c88ac\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"reqSigs\": 1,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"type\": \"pubkeyhash\"`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"addresses\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"1NLg3QJMsMQGM5KEUaEu5ADDmKQSLHwmyh\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;`]`<br />`}`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"help\"/>\n\n|   |   |\n|---|---|\n|Method|help|\n|Parameters|1. command (string, optional) - the command to get help for|\n|Description|Returns a list of all commands or help for a specified command.<br />When no `command` parameter is specified, a list of available commands is returned<br />When `command` is a valid method, the help text for that method is returned.|\n|Returns|string|\n|Example Return|getblockcount<br />Returns a numeric for the number of blocks in the longest block chain.|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"ping\"/>\n\n|   |   |\n|---|---|\n|Method|ping|\n|Parameters|None|\n|Description|Queues a ping to be sent to each connected peer.<br />Ping times are provided by [getpeerinfo](#getpeerinfo) via the `pingtime` and `pingwait` fields.|\n|Returns|Nothing|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"getrawmempool\"/>\n\n|   |   |\n|---|---|\n|Method|getrawmempool|\n|Parameters|1. verbose (boolean, optional, default=false)|\n|Description|Returns an array of hashes for all of the transactions currently in the memory pool.<br />The `verbose` flag specifies that each transaction is returned as a JSON object.|\n|Notes|<font color=\"orange\">Since btcd does not perform any mining, the priority related fields `startingpriority` and `currentpriority` that are available when the `verbose` flag is set are always 0.</font>|\n|Returns (verbose=false)|`[ (json array of string)`<br />&nbsp;&nbsp;`\"transactionhash\", (string) hash of the transaction`<br />&nbsp;&nbsp;`...`<br />`]`|\n|Returns (verbose=true)|`{ (json object)`<br />&nbsp;&nbsp;`\"transactionhash\": { (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"size\": n, (numeric) transaction size in bytes`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"vsize\": n, (numeric) transaction virtual size`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"weight\": n, (numeric) The transaction's weight (between vsize*4-3 and vsize*4)`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"fee\" : n, (numeric) transaction fee in bitcoins`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"time\": n, (numeric) local time transaction entered pool in seconds since 1 Jan 1970 GMT`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"height\": n, (numeric) block height when transaction entered the pool`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"startingpriority\": n, (numeric) priority when transaction entered the pool`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"currentpriority\": n, (numeric) current priority`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"depends\": [ (json array) unconfirmed transactions used as inputs for this transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"transactionhash\", (string) hash of the parent transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`...`<br />&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`}, ...`<br />`}`|\n|Example Return (verbose=false)|`[`<br />&nbsp;&nbsp;`\"3480058a397b6ffcc60f7e3345a61370fded1ca6bef4b58156ed17987f20d4e7\",`<br />&nbsp;&nbsp;`\"cbfe7c056a358c3a1dbced5a22b06d74b8650055d5195c1c2469e6b63a41514a\"`<br />`]`|\n|Example Return (verbose=true)|`{`<br />&nbsp;&nbsp;`\"1697a19cede08694278f19584e8dcc87945f40c6b59a942dd8906f133ad3f9cc\": {`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"size\": 226,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"fee\" : 0.0001,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"time\": 1387992789,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"height\": 276836,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"startingpriority\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"currentpriority\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"depends\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"aa96f672fcc5a1ec6a08a94aa46d6b789799c87bd6542967da25a96b2dee0afb\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />`}`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"setgenerate\"/>\n\n|   |   |\n|---|---|\n|Method|setgenerate|\n|Parameters|1. generate (boolean, required) - `true` to enable generation, `false` to disable it<br />2. genproclimit (numeric, optional) - the number of processors (cores) to limit generation to or `-1` for default|\n|Description|Set the server to generate coins (mine) or not.|\n|Notes|NOTE: Since btcd does not have the wallet integrated to provide payment addresses, btcd must be configured via the `--miningaddr` option to provide which payment addresses to pay created blocks to for this RPC to function.|\n|Returns|Nothing|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"sendrawtransaction\"/>\n\n|   |   |\n|---|---|\n|Method|sendrawtransaction|\n|Parameters|1. signedhex (string, required) serialized, hex-encoded signed transaction<br />2. allowhighfees (boolean, optional, default=false) whether or not to allow insanely high fees|\n|Description|Submits the serialized, hex-encoded transaction to the local peer and relays it to the network.|\n|Notes|<font color=\"orange\">btcd does not yet implement the `allowhighfees` parameter, so it has no effect</font>|\n|Returns|`\"hash\" (string) the hash of the transaction`|\n|Example Return|`\"1697a19cede08694278f19584e8dcc87945f40c6b59a942dd8906f133ad3f9cc\"`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"submitblock\"/>\n\n|   |   |\n|---|---|\n|Method|submitblock|\n|Parameters|1. data (string, required) serialized, hex-encoded block<br />2. params (json object, optional, default=nil) this parameter is currently ignored|\n|Description|Attempts to submit a new serialized, hex-encoded block to the network.|\n|Returns (success)|Success: Nothing<br />Failure: `\"rejected: reason\"` (string)|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"stop\"/>\n\n|   |   |\n|---|---|\n|Method|stop|\n|Parameters|None|\n|Description|Shutdown btcd.|\n|Returns|`\"btcd stopping.\"` (string)|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"validateaddress\"/>\n\n|   |   |\n|---|---|\n|Method|validateaddress|\n|Parameters|1. address (string, required) - bitcoin address|\n|Description|Verify an address is valid.|\n|Returns|`{ (json object)`<br />&nbsp;&nbsp;`\"isvalid\": true or false,  (bool) whether or not the address is valid.`<br />&nbsp;&nbsp;`\"address\": \"bitcoinaddress\", (string) the bitcoin address validated.`<br />}|\n[Return to Overview](#MethodOverview)<br />\n\n***\n<a name=\"verifychain\"/>\n\n|   |   |\n|---|---|\n|Method|verifychain|\n|Parameters|1. checklevel (numeric, optional, default=3) - how in-depth the verification is (0=least amount of checks, higher levels are clamped to the highest supported level)<br />2. numblocks (numeric, optional, default=288) - the number of blocks starting from the end of the chain to verify|\n|Description|Verifies the block chain database.<br />The actual checks performed by the `checklevel` parameter is implementation specific.  For btcd this is:<br />`checklevel=0` - Look up each block and ensure it can be loaded from the database.<br />`checklevel=1` - Perform basic context-free sanity checks on each block.|\n|Notes|<font color=\"orange\">Btcd currently only supports `checklevel` 0 and 1, but the default is still 3 for compatibility.  Per the information in the Parameters section above, higher levels are automatically clamped to the highest supported level, so this means the default is effectively 1 for btcd.</font>|\n|Returns|`true` or `false` (boolean)|\n|Example Return|`true`|\n[Return to Overview](#MethodOverview)<br />\n\n\n<a name=\"ExtensionMethods\" />\n\n### 6. Extension Methods\n\n<a name=\"ExtMethodOverview\" />\n\n**6.1 Method Overview**<br />\n\nThe following is an overview of the RPC methods which are implemented by btcd, but not the original bitcoind client. Click the method name for further details such as parameter and return information.\n\n|#|Method|Safe for limited user?|Description|\n|---|------|----------|-----------|\n|1|[debuglevel](#debuglevel)|N|Dynamically changes the debug logging level.|\n|2|[getbestblock](#getbestblock)|Y|Get block height and hash of best block in the main chain.|None|\n|3|[getcurrentnet](#getcurrentnet)|Y|Get bitcoin network btcd is running on.|None|\n|4|[searchrawtransactions](#searchrawtransactions)|Y|Query for transactions related to a particular address.|None|\n|5|[node](#node)|N|Attempts to add or remove a peer. |None|\n|6|[generate](#generate)|N|When in simnet or regtest mode, generate a set number of blocks. |None|\n|7|[version](#version)|Y|Returns the JSON-RPC API version.|\n|8|[getheaders](#getheaders)|Y|Returns block headers starting with the first known block hash from the request.|\n\n\n<a name=\"ExtMethodDetails\" />\n\n**6.2 Method Details**<br />\n\n<a name=\"debuglevel\"/>\n\n|   |   |\n|---|---|\n|Method|debuglevel|\n|Parameters|1. _levelspec_ (string)|\n|Description|Dynamically changes the debug logging level.<br />The levelspec can either a debug level or of the form `<subsystem>=<level>,<subsystem2>=<level2>,...`<br />The valid debug levels are `trace`, `debug`, `info`, `warn`, `error`, and `critical`.<br />The valid subsystems are `AMGR`, `ADXR`, `BCDB`, `BMGR`, `BTCD`, `CHAN`, `DISC`, `PEER`, `RPCS`, `SCRP`, `SRVR`, and `TXMP`.<br />Additionally, the special keyword `show` can be used to get a list of the available subsystems.|\n|Returns|string|\n|Example Return|`Done.`|\n|Example `show` Return|`Supported subsystems [AMGR ADXR BCDB BMGR BTCD CHAN DISC PEER RPCS SCRP SRVR TXMP]`|\n[Return to Overview](#ExtMethodOverview)<br />\n\n***\n\n<a name=\"getbestblock\"/>\n\n|   |   |\n|---|---|\n|Method|getbestblock|\n|Parameters|None|\n|Description|Get block height and hash of best block in the main chain.|\n|Returns|`{ (json object)`<br />&nbsp;`\"hash\": \"data\",  (string) the hex-encoded bytes of the best block hash`<br />&nbsp;`\"height\": n (numeric) the block height of the best block`<br />`}`|\n[Return to Overview](#ExtMethodOverview)<br />\n\n***\n\n<a name=\"getcurrentnet\"/>\n\n|   |   |\n|---|---|\n|Method|getcurrentnet|\n|Parameters|None|\n|Description|Get bitcoin network btcd is running on.|\n|Returns|numeric|\n|Example Return|`3652501241` (mainnet)<br />`118034699` (testnet3)|\n[Return to Overview](#ExtMethodOverview)<br />\n\n***\n\n<a name=\"searchrawtransactions\"/>\n\n|   |   |\n|---|---|\n|Method|searchrawtransactions|\n|Parameters|1. address (string, required) - bitcoin address <br /> 2. verbose (int, optional, default=true) - specifies the transaction is returned as a JSON object instead of hex-encoded string <br />3. skip (int, optional, default=0) - the number of leading transactions to leave out of the final response <br /> 4. count (int, optional, default=100) - the maximum number of transactions to return <br /> 5. vinextra (int, optional, default=0) - Specify that extra data from previous output will be returned in vin <br /> 6. reverse (boolean, optional, default=false) - Specifies that the transactions should be returned in reverse chronological order|\n|Description|Returns raw data for transactions involving the passed address. Returned transactions are pulled from both the database, and transactions currently in the mempool. Transactions pulled from the mempool will have the `\"confirmations\"` field set to 0. Usage of this RPC requires the optional `--addrindex` flag to be activated, otherwise all responses will simply return with an error stating the address index has not yet been built up. Similarly, until the address index has caught up with the current best height, all requests will return an error response in order to avoid serving stale data.|\n|Returns (verbose=0)|`[ (json array of strings)` <br/>&nbsp;&nbsp; `\"serializedtx\", ... hex-encoded bytes of the serialized transaction` <br/>`]` |\n|Returns (verbose=1)|`[ (array of json objects)` <br/> &nbsp;&nbsp; `{ (json object)`<br />&nbsp;&nbsp;`\"hex\": \"data\",  (string) hex-encoded transaction`<br />&nbsp;&nbsp;`\"txid\": \"hash\",  (string) the hash of the transaction`<br />&nbsp;&nbsp;`\"version\": n,  (numeric) the transaction version`<br />&nbsp;&nbsp;`\"locktime\": n,  (numeric) the transaction lock time`<br />&nbsp;&nbsp;`\"vin\": [  (array of json objects) the transaction inputs as json objects`<br />&nbsp;&nbsp;<font color=\"orange\">For coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"coinbase\": \"data\",  (string) the hex-encoded bytes of the signature script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"txinwitness\": “data\", (string) the witness stack for the input`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": n,  (numeric) the script sequence number`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;<font color=\"orange\">For non-coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"txid\": \"hash\", (string) the hash of the origin transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"vout\": n, (numeric) the index of the output being redeemed from the origin transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptSig\": { (json object) the signature script used to redeem the origin transaction`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"asm\", (string) disassembly of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"data\",  (string) hex-encoded bytes of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"prevOut\": { (json object) Data from the origin transaction output with index vout.`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"addresses\": [\"value\",...], (array of string) previous output addresses`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"value\": n.nnn,             (numeric)         previous output value`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"txinwitness\": “data\", (string) the witness stack for the input`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": n,  (numeric) the script sequence number`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}, ...`<br />&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`\"vout\": [  (array of json objects) the transaction outputs as json objects`<br />&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"value\": n, (numeric) the value in BTC`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"n\": n, (numeric) the index of this transaction output`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptPubKey\": { (json object) the public key script used to pay coins`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"asm\",  (string) disassembly of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"data\", (string) hex-encoded bytes of the script`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"reqSigs\": n,  (numeric) the number of required signatures`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"type\": \"scripttype\" (string) the type of the script (e.g. 'pubkeyhash')`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"addresses\": [ (json array of string) the bitcoin addresses associated with this output`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"address\",  (string) the bitcoin address`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`...`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;`}, ...`<br /> &nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp; `\"blockhash\":\"hash\" Hash of the block the transaction is part of.` <br /> &nbsp;&nbsp; `\"confirmations\":n,  Number of numeric confirmations of block.` <br /> &nbsp;&nbsp;&nbsp;`\"time\":t, Transaction time in seconds since the epoch.` <br /> &nbsp;&nbsp;&nbsp;`\"blocktime\":t, Block time in seconds since the epoch.`<br />`},...`<br/> `]`|\n[Return to Overview](#ExtMethodOverview)<br />\n\n***\n\n<a name=\"node\"/>\n\n|   |   |\n|---|---|\n|Method|node|\n|Parameters|1. command (string, required) - `connect` to add a peer (defaults to temporary), `remove` to remove a persistent peer, or `disconnect` to remove all matching non-persistent peers <br /> 2. peer (string, required) - ip address and port, or ID of the peer to operate on<br /> 3. connection type (string, optional) - `perm` indicates the peer should be added as a permanent peer, `temp` indicates a connection should only be attempted once. |\n|Description|Attempts to add or remove a peer.|\n|Returns|Nothing|\n[Return to Overview](#MethodOverview)<br />\n\n***\n\n<a name=\"generate\"/>\n\n|   |   |\n|---|---|\n|Method|generate|\n|Parameters|1. numblocks (int, required) - The number of blocks to generate |\n|Description|When in simnet or regtest mode, generates `numblocks` blocks. If blocks arrive from elsewhere, they are built upon but don't count toward the number of blocks to generate. Only generated blocks are returned. This RPC call will exit with an error if the server is already CPU mining, and will prevent the server from CPU mining for another command while it runs. |\n|Returns|`[ (json array of strings)` <br/>&nbsp;&nbsp; `\"blockhash\", ... hash of the generated block` <br/>`]` |\n[Return to Overview](#MethodOverview)<br />\n\n***\n\n<a name=\"version\"/>\n\n|   |   |\n|---|---|\n|Method|version|\n|Parameters|None|\n|Description|Returns the version of the JSON-RPC API built into this release of btcd.|\n|Returns|`{ (json object)`<br />&nbsp;&nbsp;`\"btcdjsonrpcapi\": {`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"versionstring\": \"x.y.z\",  (string) the version of the JSON-RPC API`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"major\": x,  (numeric) the major version of the JSON-RPC API`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"minor\": y,  (numeric) the minor version of the JSON-RPC API`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"patch\": z,  (numeric) the patch version of the JSON-RPC API`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"prerelease\": \"\",  (string) prerelease info for the JSON-RPC API`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"buildmetadata\": \"\"  (string) metadata about the server build`<br />&nbsp;&nbsp;`}`<br />`}`|\n|Example Return|`{`<br />&nbsp;&nbsp;`\"btcdjsonrpcapi\": {`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"versionstring\": \"1.0.0\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"major\": 1,  `<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"minor\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"patch\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"prerelease\": \"\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"buildmetadata\": \"\"`<br />&nbsp;&nbsp;`}`<br />`}`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n\n<a name=\"getheaders\"/>\n\n|   |   |\n|---|---|\n|Method|getheaders|\n|Parameters|1. Block Locators (JSON array, required)<br />&nbsp;`[ (json array of strings)`<br />&nbsp;&nbsp;`\"blocklocator\", (string) the known block hash`<br />&nbsp;&nbsp;`...`<br />&nbsp;`]`<br />2. hashstop (string) - last desired block's hash|\n|Description|Returns block headers starting with the first known block hash from the request.|\n|Returns|`[ (json array of strings)`<br />&nbsp;&nbsp;`\"blockheader\",`<br />&nbsp;&nbsp;`...`<br />`]`|\n|Example Return|`[`<br />&nbsp;&nbsp;`\"0000002099417930b2ae09feda10e38b58c0f6bb44b4d60fa33f0e000000000000000000d53...\",`<br />&nbsp;&nbsp;`\"000000203ba25a173bfd24d09e0c76002a910b685ca297bd09a17b020000000000000000702...\"`<br />`]`|\n[Return to Overview](#MethodOverview)<br />\n\n***\n\n<a name=\"WSExtMethods\" />\n\n### 7. Websocket Extension Methods (Websocket-specific)\n\n<a name=\"WSExtMethodOverview\" />\n\n**7.1 Method Overview**<br />\n\nThe following is an overview of the RPC method requests available exclusively to Websocket clients.  All of these RPC methods are available to the limited\nuser.  Click the method name for further details such as parameter and return information.\n\n|#|Method|Description|Notifications|\n|---|------|-----------|-------------|\n|1|[authenticate](#authenticate)|Authenticate the connection against the username and passphrase configured for the RPC server.<br /><font color=\"orange\">NOTE: This is only required if an HTTP Authorization header is not being used.</font>|None|\n|2|[notifyblocks](#notifyblocks)|Send notifications when a block is connected or disconnected from the best chain.|[blockconnected](#blockconnected), [blockdisconnected](#blockdisconnected), [filteredblockconnected](#filteredblockconnected), and [filteredblockdisconnected](#filteredblockdisconnected)|\n|3|[stopnotifyblocks](#stopnotifyblocks)|Cancel registered notifications for whenever a block is connected or disconnected from the main (best) chain. |None|\n|4|[notifyreceived](#notifyreceived)|*DEPRECATED, for similar functionality see [loadtxfilter](#loadtxfilter)*<br />Send notifications when a txout spends to an address.|[recvtx](#recvtx) and [redeemingtx](#redeemingtx)|\n|5|[stopnotifyreceived](#stopnotifyreceived)|*DEPRECATED, for similar functionality see [loadtxfilter](#loadtxfilter)*<br />Cancel registered notifications for when a txout spends to any of the passed addresses.|None|\n|6|[notifyspent](#notifyspent)|*DEPRECATED, for similar functionality see [loadtxfilter](#loadtxfilter)*<br />Send notification when a txout is spent.|[redeemingtx](#redeemingtx)|\n|7|[stopnotifyspent](#stopnotifyspent)|*DEPRECATED, for similar functionality see [loadtxfilter](#loadtxfilter)*<br />Cancel registered spending notifications for each passed outpoint.|None|\n|8|[rescan](#rescan)|*DEPRECATED, for similar functionality see [rescanblocks](#rescanblocks)*<br />Rescan block chain for transactions to addresses and spent transaction outpoints.|[recvtx](#recvtx), [redeemingtx](#redeemingtx), [rescanprogress](#rescanprogress), and [rescanfinished](#rescanfinished) |\n|9|[notifynewtransactions](#notifynewtransactions)|Send notifications for all new transactions as they are accepted into the mempool.|[txaccepted](#txaccepted) or [txacceptedverbose](#txacceptedverbose)|\n|10|[stopnotifynewtransactions](#stopnotifynewtransactions)|Stop sending either a txaccepted or a txacceptedverbose notification when a new transaction is accepted into the mempool.|None|\n|11|[session](#session)|Return details regarding a websocket client's current connection.|None|\n|12|[loadtxfilter](#loadtxfilter)|Load, add to, or reload a websocket client's transaction filter for mempool transactions, new blocks and rescanblocks.|[relevanttxaccepted](#relevanttxaccepted)|\n|13|[rescanblocks](#rescanblocks)|Rescan blocks for transactions matching the loaded transaction filter.|None|\n\n<a name=\"WSExtMethodDetails\" />\n\n**7.2 Method Details**<br />\n\n<a name=\"authenticate\"/>\n\n|   |   |\n|---|---|\n|Method|authenticate|\n|Parameters|1. username (string, required)<br />2. passphrase (string, required)|\n|Description|Authenticate the connection against the username and password configured for the RPC server.<br />  Invoking any other method before authenticating with this command will close the connection.<br /><font color=\"orange\">NOTE: This is only required if an HTTP Authorization header is not being used.</font>|\n|Returns|Success: Nothing<br />Failure: Nothing (websocket disconnected)|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"notifyblocks\"/>\n\n|   |   |\n|---|---|\n|Method|notifyblocks|\n|Notifications|[blockconnected](#blockconnected), [blockdisconnected](#blockdisconnected), [filteredblockconnected](#filteredblockconnected), and [filteredblockdisconnected](#filteredblockdisconnected)|\n|Parameters|None|\n|Description|Request notifications for whenever a block is connected or disconnected from the main (best) chain.<br />NOTE: If a client subscribes to both block and transaction (recvtx and redeemingtx) notifications, the blockconnected notification will be sent after all transaction notifications have been sent.  This allows clients to know when all relevant transactions for a block have been received.|\n|Returns|Nothing|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"stopnotifyblocks\"/>\n\n|   |   |\n|---|---|\n|Method|stopnotifyblocks|\n|Notifications|None|\n|Parameters|None|\n|Description|Cancel sending notifications for whenever a block is connected or disconnected from the main (best) chain.|\n|Returns|Nothing|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"notifyreceived\"/>\n\n|   |   |\n|---|---|\n|Method|notifyreceived|\n|Notifications|[recvtx](#recvtx) and [redeemingtx](#redeemingtx)|\n|Parameters|1. Addresses (JSON array, required)<br />&nbsp;`[ (json array of strings)`<br />&nbsp;&nbsp;`\"bitcoinaddress\", (string) the bitcoin address`<br />&nbsp;&nbsp;`...`<br />&nbsp;`]`|\n|Description|*DEPRECATED, for similar functionality see [loadtxfilter](#loadtxfilter)*<br />Send a recvtx notification when a transaction added to mempool or appears in a newly-attached block contains a txout pkScript sending to any of the passed addresses.  Matching outpoints are automatically registered for redeemingtx notifications.|\n|Returns|Nothing|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"stopnotifyreceived\"/>\n\n|   |   |\n|---|---|\n|Method|stopnotifyreceived|\n|Notifications|None|\n|Parameters|1. Addresses (JSON array, required)<br />&nbsp;`[ (json array of strings)`<br />&nbsp;&nbsp;`\"bitcoinaddress\", (string) the bitcoin address`<br />&nbsp;&nbsp;`...`<br />&nbsp;`]`|\n|Description|*DEPRECATED, for similar functionality see [loadtxfilter](#loadtxfilter)*<br />Cancel registered receive notifications for each passed address.|\n|Returns|Nothing|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"notifyspent\"/>\n\n|   |   |\n|---|---|\n|Method|notifyspent|\n|Notifications|[redeemingtx](#redeemingtx)|\n|Parameters|1. Outpoints (JSON array, required)<br />&nbsp;`[ (JSON array)`<br />&nbsp;&nbsp;`{ (JSON object)`<br />&nbsp;&nbsp;&nbsp;`\"hash\":\"data\", (string) the hex-encoded bytes of the outpoint hash`<br />&nbsp;&nbsp;&nbsp;`\"index\":n (numeric) the txout index of the outpoint`<br />&nbsp;&nbsp;`},`<br />&nbsp;&nbsp;`...`<br />&nbsp;`]`|\n|Description|*DEPRECATED, for similar functionality see [loadtxfilter](#loadtxfilter)*<br />Send a redeemingtx notification when a transaction spending an outpoint appears in mempool (if relayed to this btcd instance) and when such a transaction first appears in a newly-attached block.|\n|Returns|Nothing|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"stopnotifyspent\"/>\n\n|   |   |\n|---|---|\n|Method|stopnotifyspent|\n|Notifications|None|\n|Parameters|1. Outpoints (JSON array, required)<br />&nbsp;`[ (JSON array)`<br />&nbsp;&nbsp;`{ (JSON object)`<br />&nbsp;&nbsp;&nbsp;`\"hash\":\"data\", (string) the hex-encoded bytes of the outpoint hash`<br />&nbsp;&nbsp;&nbsp;`\"index\":n (numeric) the txout index of the outpoint`<br />&nbsp;&nbsp;`},`<br />&nbsp;&nbsp;`...`<br />&nbsp;`]`|\n|Description|*DEPRECATED, for similar functionality see [loadtxfilter](#loadtxfilter)*<br />Cancel registered spending notifications for each passed outpoint.|\n|Returns|Nothing|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"rescan\"/>\n\n|   |   |\n|---|---|\n|Method|rescan|\n|Notifications|[recvtx](#recvtx), [redeemingtx](#redeemingtx), [rescanprogress](#rescanprogress), and [rescanfinished](#rescanfinished)|\n|Parameters|1. BeginBlock (string, required) block hash to begin rescanning from<br />2. Addresses (JSON array, required)<br />&nbsp;`[ (json array of strings)`<br />&nbsp;&nbsp;`\"bitcoinaddress\", (string) the bitcoin address`<br />&nbsp;&nbsp;`...` <br />&nbsp;`]`<br />3. Outpoints (JSON array, required)<br />&nbsp;`[ (JSON array)`<br />&nbsp;&nbsp;`{ (JSON object)`<br />&nbsp;&nbsp;&nbsp;`\"hash\":\"data\", (string) the hex-encoded bytes of the outpoint hash`<br />&nbsp;&nbsp;&nbsp;`\"index\":n (numeric) the txout index of the outpoint`<br />&nbsp;&nbsp;`},`<br />&nbsp;&nbsp;`...`<br />&nbsp;`]`<br />4. EndBlock (string, optional) hash of final block to rescan|\n|Description|*DEPRECATED, for similar functionality see [rescanblocks](#rescanblocks)*<br />Rescan block chain for transactions to addresses, starting at block BeginBlock and ending at EndBlock.  The current known UTXO set for all passed addresses at height BeginBlock should included in the Outpoints argument.  If EndBlock is omitted, the rescan continues through the best block in the main chain.  Additionally, if no EndBlock is provided, the client is automatically registered for transaction notifications for all rescanned addresses and the final UTXO set.  Rescan results are sent as recvtx and redeemingtx notifications.  This call returns once the rescan completes.|\n|Returns|Nothing|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"notifynewtransactions\"/>\n\n|   |   |\n|---|---|\n|Method|notifynewtransactions|\n|Notifications|[txaccepted](#txaccepted) or [txacceptedverbose](#txacceptedverbose)|\n|Parameters|1. verbose (boolean, optional, default=false) - specifies which type of notification to receive.  If verbose is true, then the caller receives [txacceptedverbose](#txacceptedverbose), otherwise the caller receives [txaccepted](#txaccepted)|\n|Description|Send either a [txaccepted](#txaccepted) or a [txacceptedverbose](#txacceptedverbose) notification when a new transaction is accepted into the mempool.|\n|Returns|Nothing|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"stopnotifynewtransactions\"/>\n\n|   |   |\n|---|---|\n|Method|stopnotifynewtransactions|\n|Notifications|None|\n|Parameters|None|\n|Description|Stop sending either a [txaccepted](#txaccepted) or a [txacceptedverbose](#txacceptedverbose) notification when a new transaction is accepted into the mempool.|\n|Returns|Nothing|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"session\"/>\n\n|   |   |\n|---|---|\n|Method|session|\n|Notifications|None|\n|Parameters|None|\n|Description|Return a JSON object with details regarding a websocket client's current connection to the RPC server.  This currently only includes the session ID, a random unsigned 64-bit integer that is created for each newly connected client.  Session IDs may be used to verify that the current connection was not lost and subsequently reestablished.|\n|Returns|`{ (json object)`<br />&nbsp;&nbsp;`\"sessionid\": n  (numeric) the session ID`<br />`}`|\n|Example Return|`{`<br />&nbsp;&nbsp;`\"sessionid\": 67089679842`<br />`}`|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"loadtxfilter\"/>\n\n|   |   |\n|---|---|\n|Method|loadtxfilter|\n|Notifications|[relevanttxaccepted](#relevanttxaccepted)|\n|Parameters|1. Reload (boolean, required) - Load a new filter instead of adding data to an existing one<br />2. Addresses (JSON array, required) - Array of addresses to add to the transaction filter<br />3. Outpoints (JSON array, required) - Array of outpoints to add to the transaction filter|\n|Description|Load, add to, or reload a websocket client's transaction filter for mempool transactions, new blocks and [rescanblocks](#rescanblocks).|\n|Returns|Nothing|\n[Return to Overview](#WSExtMethodOverview)<br />\n\n***\n\n<a name=\"rescanblocks\"/>\n\n|   |   |\n|---|---|\n|Method|rescanblocks|\n|Notifications|None|\n|Parameters|1. Blockhashes (JSON array, required) - List of hashes to rescan.  Each next block must be a child of the previous.|\n|Description|Rescan blocks for transactions matching the loaded transaction filter.|\n|Returns|`[ (JSON array)`<br />&nbsp;&nbsp;`{ (JSON object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"hash\": \"data\", (string) Hash of the matching block.`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"transactions\": [ (JSON array) List of matching transactions, serialized and hex-encoded.`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"serializedtx\" (string) Serialized and hex-encoded transaction.`<br />&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`}`<br />`]`|\n|Example Return|`[`<br />&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"hash\": \"0000002099417930b2ae09feda10e38b58c0f6bb44b4d60fa33f0e000000000000000000d53...\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"transactions\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"493046022100cb42f8df44eca83dd0a727988dcde9384953e830b1f8004d57485e2ede1b9c8...\"`<br />&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`}`<br />`]`|\n\n\n<a name=\"Notifications\" />\n\n### 8. Notifications (Websocket-specific)\n\nbtcd uses standard JSON-RPC notifications to notify clients of changes, rather than requiring clients to poll btcd for updates.  JSON-RPC notifications are a subset of requests, but do not contain an ID.  The notification type is categorized by the `method` field and additional details are sent as a JSON array in the `params` field.\n\n<a name=\"NotificationOverview\" />\n\n**8.1 Notification Overview**<br />\n\nThe following is an overview of the JSON-RPC notifications used for Websocket connections.  Click the method name for further details of the context(s) in which they are sent and their parameters.\n\n|#|Method|Description|Request|\n|---|------|-----------|-------|\n|1|[blockconnected](#blockconnected)|*DEPRECATED, for similar functionality see [filteredblockconnected](#filteredblockconnected)*<br />Block connected to the main chain.|[notifyblocks](#notifyblocks)|\n|2|[blockdisconnected](#blockdisconnected)|*DEPRECATED, for similar functionality see [filteredblockdisconnected](#filteredblockdisconnected)*<br />Block disconnected from the main chain.|[notifyblocks](#notifyblocks)|\n|3|[recvtx](#recvtx)|*DEPRECATED, for similar functionality see [relevanttxaccepted](#relevanttxaccepted) and [filteredblockconnected](#filteredblockconnected)*<br />Processed a transaction output spending to a wallet address.|[notifyreceived](#notifyreceived) and [rescan](#rescan)|\n|4|[redeemingtx](#redeemingtx)|*DEPRECATED, for similar functionality see [relevanttxaccepted](#relevanttxaccepted) and [filteredblockconnected](#filteredblockconnected)*<br />Processed a transaction that spends a registered outpoint.|[notifyspent](#notifyspent) and [rescan](#rescan)|\n|5|[txaccepted](#txaccepted)|Received a new transaction after requesting simple notifications of all new transactions accepted into the mempool.|[notifynewtransactions](#notifynewtransactions)|\n|6|[txacceptedverbose](#txacceptedverbose)|Received a new transaction after requesting verbose notifications of all new transactions accepted into the mempool.|[notifynewtransactions](#notifynewtransactions)|\n|7|[rescanprogress](#rescanprogress)|*DEPRECATED, notifications not used by [rescanblocks](#rescanblocks)*<br />A rescan operation that is underway has made progress.|[rescan](#rescan)|\n|8|[rescanfinished](#rescanfinished)|*DEPRECATED, notifications not used by [rescanblocks](#rescanblocks)*<br />A rescan operation has completed.|[rescan](#rescan)|\n|9|[relevanttxaccepted](#relevanttxaccepted)|A transaction matching the tx filter has been accepted into the mempool.|[loadtxfilter](#loadtxfilter)|\n|10|[filteredblockconnected](#filteredblockconnected)|Block connected to the main chain; contains any transactions that match the client's tx filter.|[notifyblocks](#notifyblocks), [loadtxfilter](#loadtxfilter)|\n|11|[filteredblockdisconnected](#filteredblockdisconnected)|Block disconnected from the main chain.|[notifyblocks](#notifyblocks), [loadtxfilter](#loadtxfilter)|\n\n<a name=\"NotificationDetails\" />\n\n**8.2 Notification Details**<br />\n\n<a name=\"blockconnected\"/>\n\n|   |   |\n|---|---|\n|Method|blockconnected|\n|Request|[notifyblocks](#notifyblocks)|\n|Parameters|1. BlockHash (string) hex-encoded bytes of the attached block hash<br />2. BlockHeight (numeric) height of the attached block<br />3. BlockTime (numeric) unix time of the attached block|\n|Description|*DEPRECATED, for similar functionality see [filteredblockconnected](#filteredblockconnected)*<br />Notifies when a block has been added to the main chain.  Notification is sent to all connected clients.|\n|Example|Example blockconnected notification for mainnet block 280330 (newlines added for readability):<br />`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"blockconnected\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`\"000000000000000004cbdfe387f4df44b914e464ca79838a8ab777b3214dbffd\",`<br />&nbsp;&nbsp;&nbsp;`280330,`<br />&nbsp;&nbsp;&nbsp;`1389636265`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`|\n[Return to Overview](#NotificationOverview)<br />\n\n***\n\n<a name=\"blockdisconnected\"/>\n\n|   |   |\n|---|---|\n|Method|blockdisconnected|\n|Request|[notifyblocks](#notifyblocks)|\n|Parameters|1. BlockHash (string) hex-encoded bytes of the disconnected block hash<br />2. BlockHeight (numeric) height of the disconnected block<br />3. BlockTime (numeric) unix time of the disconnected block|\n|Description|*DEPRECATED, for similar functionality see [filteredblockdisconnected](#filteredblockdisconnected)*<br />Notifies when a block has been removed from the main chain.  Notification is sent to all connected clients.|\n|Example|Example blockdisconnected notification for mainnet block 280330 (newlines added for readability):<br />`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"blockdisconnected\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`\"000000000000000004cbdfe387f4df44b914e464ca79838a8ab777b3214dbffd\",`<br />&nbsp;&nbsp;&nbsp;`280330,`<br />&nbsp;&nbsp;&nbsp;`1389636265`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`|\n[Return to Overview](#NotificationOverview)<br />\n\n***\n\n<a name=\"recvtx\"/>\n\n|   |   |\n|---|---|\n|Method|recvtx|\n|Request|[rescan](#rescan) or [notifyreceived](#notifyreceived)|\n|Parameters|1. Transaction (string) full transaction encoded as a hex string<br />2. Block details (object, optional) details about a block and the index of the transaction within a block, if the transaction is mined|\n|Description|*DEPRECATED, for similar functionality see [relevanttxaccepted](#relevanttxaccepted) and [filteredblockconnected](#filteredblockconnected)*<br />Notifies a client when a transaction is processed that contains at least a single output with a pkScript sending to a requested address.  If multiple outputs send to requested addresses, a single notification is sent.  If a mempool (unmined) transaction is processed, the block details object (second parameter) is excluded.|\n|Example|Example recvtx notification for mainnet transaction 61d3696de4c888730cbe06b0ad8ecb6d72d6108e893895aa9bc067bd7eba3fad when processed by mempool (newlines added for readability):<br />`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"recvtx\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`\"010000000114d9ff358894c486b4ae11c2a8cf7851b1df64c53d2e511278eff17c22fb737300000000...\"`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`<br />The recvtx notification for the same txout, after the transaction was mined into block 276425:<br />`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"recvtx\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`\"010000000114d9ff358894c486b4ae11c2a8cf7851b1df64c53d2e511278eff17c22fb737300000000...\",`<br />&nbsp;&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"height\": 276425,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"hash\": \"000000000000000325474bb799b9e591f965ca4461b72cb7012b808db92bb2fc\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"index\": 684,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"time\": 1387737310`<br />&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`|\n[Return to Overview](#NotificationOverview)<br />\n\n***\n\n<a name=\"redeemingtx\"/>\n\n|   |   |\n|---|---|\n|Method|redeemingtx|\n|Requests|[notifyspent](#notifyspent) and [rescan](#rescan)|\n|Parameters|1. Transaction (string) full transaction encoded as a hex string<br />2. Block details (object, optional) details about a block and the index of the transaction within a block, if the transaction is mined|\n|Description|*DEPRECATED, for similar functionality see [relevanttxaccepted](#relevanttxaccepted) and [filteredblockconnected](#filteredblockconnected)*<br />Notifies a client when an registered outpoint is spent by a transaction accepted to mempool and/or mined into a block.|\n|Example|Example redeemingtx notification for mainnet outpoint 61d3696de4c888730cbe06b0ad8ecb6d72d6108e893895aa9bc067bd7eba3fad:0 after being spent by transaction 4ad0c16ac973ff675dec1f3e5f1273f1c45be2a63554343f21b70240a1e43ece (newlines added for readability):<br />`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"redeemingtx\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`\"0100000003ad3fba7ebd67c09baa9538898e10d6726dcb8eadb006be0c7388c8e46d69d3610000000...\"`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`<br />The redeemingtx notification for the same txout, after the spending transaction was mined into block 279143:<br />`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"recvtx\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`\"0100000003ad3fba7ebd67c09baa9538898e10d6726dcb8eadb006be0c7388c8e46d69d3610000000...\",`<br />&nbsp;&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"height\": 279143,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"hash\": \"00000000000000017188b968a371bab95aa43522665353b646e41865abae02a4\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"index\": 6,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"time\": 1389115004`<br />&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`|\n[Return to Overview](#NotificationOverview)<br />\n\n***\n\n<a name=\"txaccepted\"/>\n\n|   |   |\n|---|---|\n|Method|txaccepted|\n|Request|[notifynewtransactions](#notifynewtransactions)|\n|Parameters|1. TxHash (string) hex-encoded bytes of the transaction hash<br />2. Amount (numeric) sum of the value of all the transaction outpoints|\n|Description|Notifies when a new transaction has been accepted and the client has requested standard transaction details.|\n|Example|Example txaccepted notification for mainnet transaction id \"16c54c9d02fe570b9d41b518c0daefae81cc05c69bbe842058e84c6ed5826261\" (newlines added for readability):<br />`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"txaccepted\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`\"16c54c9d02fe570b9d41b518c0daefae81cc05c69bbe842058e84c6ed5826261\",`<br />&nbsp;&nbsp;&nbsp;`55838384`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`|\n[Return to Overview](#NotificationOverview)<br />\n\n***\n\n<a name=\"txacceptedverbose\"/>\n\n|   |   |\n|---|---|\n|Method|txacceptedverbose|\n|Request|[notifynewtransactions](#notifynewtransactions)|\n|Parameters|1. RawTx (json object) the transaction as a json object (see getrawtransaction json object details)|\n|Description|Notifies when a new transaction has been accepted and the client has requested verbose transaction details.|\n|Example|Example txacceptedverbose notification (newlines added for readability):<br />`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"txacceptedverbose\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"01000000010000000000000000000000000000000000000000000000000000000000000000f...\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"txid\": \"90743aad855880e517270550d2a881627d84db5265142fd1e7fb7add38b08be9\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"version\": 1,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"locktime\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"vin\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;<font color=\"orange\">For coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`{ (json object)`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"coinbase\": \"03708203062f503253482f04066d605108f800080100000ea2122f6f7a636f696e4065757374726174756d2f\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;<font color=\"orange\">For non-coinbase transactions:</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"txid\": \"60ac4b057247b3d0b9a8173de56b5e1be8c1d1da970511c626ef53706c66be04\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"vout\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptSig\": {`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"3046022100cb42f8df44eca83dd0a727988dcde9384953e830b1f8004d57485e2ede1b9c8f0...\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"493046022100cb42f8df44eca83dd0a727988dcde9384953e830b1f8004d57485e2ede1b9c8...\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"sequence\": 4294967295,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;`],`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"vout\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`{`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"value\": 25.1394,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"n\": 0,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"scriptPubKey\": {`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"asm\": \"OP_DUP OP_HASH160 ea132286328cfc819457b9dec386c4b5c84faa5c OP_EQUALVERIFY OP_CHECKSIG\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"hex\": \"76a914ea132286328cfc819457b9dec386c4b5c84faa5c88ac\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"reqSigs\": 1,`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"type\": \"pubkeyhash\"`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"addresses\": [`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\"1NLg3QJMsMQGM5KEUaEu5ADDmKQSLHwmyh\",`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;&nbsp;`}`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`|\n[Return to Overview](#NotificationOverview)<br />\n\n***\n\n<a name=\"rescanprogress\"/>\n\n|   |   |\n|---|---|\n|Method|rescanprogress|\n|Request|[rescan](#rescan)|\n|Parameters|1. Hash (string) hash of the last processed block<br />2. Height (numeric) height of the last processed block<br />3. Time (numeric) UNIX time of the last processed block|\n|Description|*DEPRECATED, notifications not used by [rescanblocks](#rescanblocks)*<br />Notifies a client with the current progress at periodic intervals when a long-running [rescan](#rescan) is underway.|\n|Example|`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"rescanprogress\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`\"0000000000000ea86b49e11843b2ad937ac89ae74a963c7edd36e0147079b89d\",`<br />&nbsp;&nbsp;&nbsp;`127213,`<br />&nbsp;&nbsp;&nbsp;`1306533807`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`|\n[Return to Overview](#NotificationOverview)<br />\n\n***\n\n<a name=\"rescanfinished\"/>\n\n|   |   |\n|---|---|\n|Method|rescanfinished|\n|Request|[rescan](#rescan)|\n|Parameters|1. Hash (string) hash of the last rescanned block<br />2. Height (numeric) height of the last rescanned block<br />3. Time (numeric) UNIX time of the last rescanned block |\n|Description|*DEPRECATED, notifications not used by [rescanblocks](#rescanblocks)*<br />Notifies a client that the [rescan](#rescan) has completed and no further notifications will be sent.|\n|Example|`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"rescanfinished\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`\"0000000000000ea86b49e11843b2ad937ac89ae74a963c7edd36e0147079b89d\",`<br />&nbsp;&nbsp;&nbsp;`127213,`<br />&nbsp;&nbsp;&nbsp;`1306533807`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`|\n[Return to Overview](#NotificationOverview)<br />\n\n***\n\n<a name=\"relevanttxaccepted\"/>\n\n|   |   |\n|---|---|\n|Method|relevanttxaccepted|\n|Request|[loadtxfilter](#loadtxfilter)|\n|Parameters|1. Transaction (string) hex-encoded serialized transaction matching the client's filter loaded ith [loadtxfilter](#loadtxfilter)|\n|Description|Notifies a client that a transaction matching the client's tx filter has been accepted into he mempool.|\n|Example|Example `relevanttxaccepted` notification (newlines added for readability):<br />`{`<br >&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"relevanttxaccepted\",`<br />&nbsp;`\"params\": [`<br >&nbsp;&nbsp;`\"01000000014221abdcca25c8a3b0c044034875dece048c77d567a806f0c2e7e0f5e25a8f100...\"`<br >&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`|\n\n***\n\n<a name=\"filteredblockconnected\"/>\n\n|   |   |\n|---|---|\n|Method|filteredblockconnected|\n|Request|[notifyblocks](#notifyblocks), [loadtxfilter](#loadtxfilter)|\n|Parameters|1. BlockHeight (numeric) height of the attached block<br />2. Header (string) hex-encoded serialized header of the attached block<br />3. Transactions (JSON array) hex-encoded serialized transactions matching the filter for the client connection loaded with [loadtxfilter](#loadtxfilter)|\n|Description|Notifies when a block has been added to the main chain.  Notification is sent to all connected clients.|\n|Example|Example filteredblockconnected notification for mainnet block 280330 (newlines added for readability):<br />`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"filteredblockconnected\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`280330,`<br />&nbsp;&nbsp;&nbsp;`\"0200000052d1e8813f697293e41942aa230e7e4fcc44832d78a1372202000000000000006aa...\",`<br />&nbsp;&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;&nbsp;`\"01000000014221abdcca25c8a3b0c044034875dece048c77d567a806f0c2e7e0f5e25a8f100...\"`<br />&nbsp;&nbsp;&nbsp;`]`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`|\n[Return to Overview](#NotificationOverview)<br />\n\n***\n\n<a name=\"filteredblockdisconnected\"/>\n\n|   |   |\n|---|---|\n|Method|filteredblockdisconnected|\n|Request|[notifyblocks](#notifyblocks), [loadtxfilter](#loadtxfilter)|\n|Parameters|1. BlockHeight (numeric) height of the disconnected block<br />2. Header (string) hex-encoded serialized header of the disconnected block|\n|Description|Notifies when a block has been removed from the main chain.  Notification is sent to all connected clients.|\n|Example|Example blockdisconnected notification for mainnet block 280330 (newlines added for readability):<br />`{`<br />&nbsp;`\"jsonrpc\": \"1.0\",`<br />&nbsp;`\"method\": \"blockdisconnected\",`<br />&nbsp;`\"params\":`<br />&nbsp;&nbsp;`[`<br />&nbsp;&nbsp;&nbsp;`280330,`<br />&nbsp;&nbsp;&nbsp;`\"0200000052d1e8813f697293e41942aa230e7e4fcc44832d78a1372202000000000000006aa...\"`<br />&nbsp;&nbsp;`],`<br />&nbsp;`\"id\": null`<br />`}`|\n[Return to Overview](#NotificationOverview)<br />\n\n\n<a name=\"ExampleCode\" />\n\n### 9. Example Code\n\nThis section provides example code for interacting with the JSON-RPC API in\nvarious languages.\n\n* [Go](#ExampleGoApp)\n* [node.js](#ExampleNodeJsCode)\n\n<a name=\"ExampleGoApp\" />\n\n**9.1 Go**\n\nThis section provides examples of using the RPC interface using Go and the\n[rpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient) package.\n\n* [Using getblockcount to Retrieve the Current Block Height](#ExampleGetBlockCount)\n* [Using getblock to Retrieve the Genesis Block](#ExampleGetBlock)\n* [Using notifyblocks to Receive blockconnected and blockdisconnected Notifications (Websocket-specific)](#ExampleNotifyBlocks)\n\n\n<a name=\"ExampleGetBlockCount\" />\n\n**9.1.1 Using getblockcount to Retrieve the Current Block Height**<br />\n\nThe following is an example Go application which uses the\n[rpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient) package to connect with\na btcd instance via Websockets, issues [getblockcount](#getblockcount) to\nretrieve the current block height, and displays it.\n\n```Go\npackage main\n\nimport (\n\t\"io/ioutil\"\n\t\"log\"\n\t\"path/filepath\"\n\n\t\"github.com/btcsuite/btcd/rpcclient\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n)\n\nfunc main() {\n\t// Load the certificate for the TLS connection which is automatically\n\t// generated by btcd when it starts the RPC server and doesn't already\n\t// have one.\n\tbtcdHomeDir := btcutil.AppDataDir(\"btcd\", false)\n\tcerts, err := os.ReadFile(filepath.Join(btcdHomeDir, \"rpc.cert\"))\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Create a new RPC client using websockets.  Since this example is\n\t// not long-lived, the connection will be closed as soon as the program\n\t// exits.\n\tconnCfg := &rpcclient.ConnConfig{\n\t\tHost:         \"localhost:8334\",\n\t\tEndpoint:     \"ws\",\n\t\tUser:         \"yourrpcuser\",\n\t\tPass:         \"yourrpcpass\",\n\t\tCertificates: certs,\n\t}\n\tclient, err := rpcclient.New(connCfg, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer client.Shutdown()\n\n\t// Query the RPC server for the current block count and display it.\n\tblockCount, err := client.GetBlockCount()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tlog.Printf(\"Block count: %d\", blockCount)\n}\n```\n\nWhich results in:\n\n```bash\n2018/08/27 11:17:27 Block count: 536027\n```\n\n<a name=\"ExampleGetBlock\" />\n\n**9.1.2 Using getblock to Retrieve the Genesis Block**<br />\n\nThe following is an example Go application which uses the\n[rpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient) package to connect with\na btcd instance via Websockets, issues [getblock](#getblock) to retrieve\ninformation about the Genesis block, and display a few details about it.\n\n```Go\npackage main\n\nimport (\n\t\"io/ioutil\"\n\t\"log\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/rpcclient\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n)\n\nfunc main() {\n\t// Load the certificate for the TLS connection which is automatically\n\t// generated by btcd when it starts the RPC server and doesn't already\n\t// have one.\n\tbtcdHomeDir := btcutil.AppDataDir(\"btcd\", false)\n\tcerts, err := os.ReadFile(filepath.Join(btcdHomeDir, \"rpc.cert\"))\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Create a new RPC client using websockets.  Since this example is\n\t// not long-lived, the connection will be closed as soon as the program\n\t// exits.\n\tconnCfg := &rpcclient.ConnConfig{\n\t\tHost:         \"localhost:18334\",\n\t\tEndpoint:     \"ws\",\n\t\tUser:         \"yourrpcuser\",\n\t\tPass:         \"yourrpcpass\",\n\t\tCertificates: certs,\n\t}\n\tclient, err := rpcclient.New(connCfg, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer client.Shutdown()\n\n\t// Query the RPC server for the genesis block using the \"getblock\"\n\t// command with the verbose flag set to true and the verboseTx flag\n\t// set to false.\n\tgenesisHashStr := \"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\"\n\tblockHash, err := chainhash.NewHashFromStr(genesisHashStr)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tblock, err := client.GetBlockVerbose(blockHash)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Display some details about the returned block.\n\tlog.Printf(\"Hash: %v\\n\", block.Hash)\n\tlog.Printf(\"Previous Block: %v\\n\", block.PreviousHash)\n\tlog.Printf(\"Next Block: %v\\n\", block.NextHash)\n\tlog.Printf(\"Merkle root: %v\\n\", block.MerkleRoot)\n\tlog.Printf(\"Timestamp: %v\\n\", time.Unix(block.Time, 0).UTC())\n\tlog.Printf(\"Confirmations: %v\\n\", block.Confirmations)\n\tlog.Printf(\"Difficulty: %f\\n\", block.Difficulty)\n\tlog.Printf(\"Size (in bytes): %v\\n\", block.Size)\n\tlog.Printf(\"Num transactions: %v\\n\", len(block.Tx))\n}\n```\n\nWhich results in:\n\n```bash\nHash: 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\nPrevious Block: 0000000000000000000000000000000000000000000000000000000000000000\nNext Block: 00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048\nMerkle root: 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b\nTimestamp: 2009-01-03 18:15:05 +0000 UTC\nConfirmations: 534323\nDifficulty: 1.000000\nSize (in bytes): 285\nNum transactions: 1\n```\n\n<a name=\"ExampleNotifyBlocks\" />\n\n**9.1.3 Using notifyblocks to Receive blockconnected and blockdisconnected\nNotifications (Websocket-specific)**<br />\n\nThe following is an example Go application which uses the\n[rpcclient](https://github.com/btcsuite/btcd/tree/master/rpcclient) package to connect with\na btcd instance via Websockets and registers for\n[blockconnected](#blockconnected) and [blockdisconnected](#blockdisconnected)\nnotifications with [notifyblocks](#notifyblocks).  It also sets up handlers for\nthe notifications.\n\n```Go\npackage main\n\nimport (\n\t\"io/ioutil\"\n\t\"log\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/rpcclient\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n)\n\nfunc main() {\n\t// Setup handlers for blockconnected and blockdisconnected\n\t// notifications.\n\tntfnHandlers := rpcclient.NotificationHandlers{\n\t\tOnBlockConnected: func(hash *chainhash.Hash, height int32, t time.Time) {\n\t\t\tlog.Printf(\"Block connected: %v (%d) %s\", hash, height, t)\n\t\t},\n\t\tOnBlockDisconnected: func(hash *chainhash.Hash, height int32, t time.Time) {\n\t\t\tlog.Printf(\"Block disconnected: %v (%d) %s\", hash, height, t)\n\t\t},\n\t}\n\n\t// Load the certificate for the TLS connection which is automatically\n\t// generated by btcd when it starts the RPC server and doesn't already\n\t// have one.\n\tbtcdHomeDir := btcutil.AppDataDir(\"btcd\", false)\n\tcerts, err := os.ReadFile(filepath.Join(btcdHomeDir, \"rpc.cert\"))\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Create a new RPC client using websockets.\n\tconnCfg := &rpcclient.ConnConfig{\n\t\tHost:         \"localhost:8334\",\n\t\tEndpoint:     \"ws\",\n\t\tUser:         \"yourrpcuser\",\n\t\tPass:         \"yourrpcpass\",\n\t\tCertificates: certs,\n\t}\n\tclient, err := rpcclient.New(connCfg, &ntfnHandlers)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Register for blockconnected and blockdisconneted notifications.\n\tif err := client.NotifyBlocks(); err != nil {\n\t\tclient.Shutdown()\n\t\tlog.Fatal(err)\n\t}\n\n\t// For this example, gracefully shutdown the client after 10 seconds.\n\t// Ordinarily when to shutdown the client is highly application\n\t// specific.\n\tlog.Println(\"Client shutdown in 10 seconds...\")\n\ttime.AfterFunc(time.Second*10, func() {\n\t\tlog.Println(\"Client shutting down...\")\n\t\tclient.Shutdown()\n\t\tlog.Println(\"Client shutdown complete.\")\n\t})\n\n\t// Wait until the client either shuts down gracefully (or the user\n\t// terminates the process with Ctrl+C).\n\tclient.WaitForShutdown()\n}\n```\n\nExample output:\n\n```\n2018/08/27 10:35:43 Client shutdown in 10 seconds...\n2018/08/27 10:35:44 Block connected: 00000000000000000003321723557df58914658dc6fd963d547292a0a4797454 (534747) 2018-08-02 06:37:52 +0800 CST\n2018/08/27 10:35:47 Block connected: 0000000000000000002e12773b798fc61dffe00ed5c3e89d3c306f8058c51e13 (534748) 2018-08-02 06:39:54 +0800 CST\n2018/08/27 10:35:49 Block connected: 0000000000000000001bb311cd849839ce88499b91a201922f55a1cfafabe267 (534749) 2018-08-02 06:44:22 +0800 CST\n2018/08/27 10:35:50 Block connected: 00000000000000000019d7296c9b5c175369ad337ec44b76bd4728021a09b864 (534750) 2018-08-02 06:55:44 +0800 CST\n2018/08/27 10:35:53 Block connected: 00000000000000000022db98cf47e944ed58ca450c819e8fef8f8c71ca5d9901 (534751) 2018-08-02 06:57:39 +0800 CST\n2018/08/27 10:35:53 Client shutting down...\n2018/08/27 10:35:53 Client shutdown complete.\n```\n\n<a name=\"ExampleNodeJsCode\" />\n\n### 9.2. Example node.js Code\n\n<a name=\"ExampleNotifyBlocks\" />\n\n**9.2.1 Using notifyblocks to be Notified of Block Connects and Disconnects**<br />\n\nThe following is example node.js code which uses [ws](https://github.com/einaros/ws)\n(can be installed with `npm install ws`) to connect with a btcd instance,\nissues [notifyblocks](#notifyblocks) to register for\n[blockconnected](#blockconnected) and [blockdisconnected](#blockdisconnected)\nnotifications, and displays all incoming messages.\n\n```javascript\nvar fs = require('fs');\nvar WebSocket = require('ws');\n\n// Load the certificate for the TLS connection which is automatically\n// generated by btcd when it starts the RPC server and doesn't already\n// have one.\nvar cert = fs.readFileSync('/path/to/btcd/appdata/rpc.cert');\nvar user = \"yourusername\";\nvar password = \"yourpassword\";\n\n\n// Initiate the websocket connection.  The btcd generated certificate acts as\n// its own certificate authority, so it needs to be specified in the 'ca' array\n// for the certificate to properly validate.\nvar ws = new WebSocket('wss://127.0.0.1:8334/ws', {\n  headers: {\n    'Authorization': 'Basic '+new Buffer(user+':'+password).toString('base64')\n  },\n  cert: cert,\n  ca: [cert]\n});\nws.on('open', function() {\n    console.log('CONNECTED');\n    // Send a JSON-RPC command to be notified when blocks are connected and\n    // disconnected from the chain.\n    ws.send('{\"jsonrpc\":\"1.0\",\"id\":\"0\",\"method\":\"notifyblocks\",\"params\":[]}');\n});\nws.on('message', function(data, flags) {\n    console.log(data);\n});\nws.on('error', function(derp) {\n  console.log('ERROR:' + derp);\n})\nws.on('close', function(data) {\n  console.log('DISCONNECTED');\n})\n```\n"
  },
  {
    "path": "docs/make.bat",
    "content": "@ECHO OFF\n\npushd %~dp0\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-build\n)\nset SOURCEDIR=.\nset BUILDDIR=_build\n\nif \"%1\" == \"\" goto help\n\n%SPHINXBUILD% >NUL 2>NUL\nif errorlevel 9009 (\n\techo.\n\techo.The 'sphinx-build' command was not found. Make sure you have Sphinx\n\techo.installed, then set the SPHINXBUILD environment variable to point\n\techo.to the full path of the 'sphinx-build' executable. Alternatively you\n\techo.may add the Sphinx directory to PATH.\n\techo.\n\techo.If you don't have Sphinx installed, grab it from\n\techo.http://sphinx-doc.org/\n\texit /b 1\n)\n\n%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%\ngoto end\n\n:help\n%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%\n\n:end\npopd\n"
  },
  {
    "path": "docs/mining.md",
    "content": "# Mining\n\nbtcd supports the `getblocktemplate` RPC.\nThe limited user cannot access this RPC.\n\n## Add the payment addresses with the `miningaddr` option\n\n```bash\n[Application Options]\nrpcuser=myuser\nrpcpass=SomeDecentp4ssw0rd\nminingaddr=12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX\nminingaddr=1M83ju3EChKYyysmM2FXtLNftbacagd8FR\n```\n\n## Add btcd's RPC TLS certificate to system Certificate Authority list\n\n`cgminer` uses [curl](http://curl.haxx.se/) to fetch data from the RPC server.\nSince curl validates the certificate by default, we must install the `btcd` RPC\ncertificate into the default system Certificate Authority list.\n\n## Ubuntu\n\n1. Copy rpc.cert to /usr/share/ca-certificates: `cp /home/user/.btcd/rpc.cert /usr/share/ca-certificates/btcd.crt`\n2. Add btcd.crt to /etc/ca-certificates.conf: `echo btcd.crt >> /etc/ca-certificates.conf`\n3. Update the CA certificate list: `update-ca-certificates`\n\n## Set your mining software url to use https\n\n`cgminer -o https://127.0.0.1:8334 -u rpcuser -p rpcpassword`\n"
  },
  {
    "path": "docs/requirements.txt",
    "content": "sphinx_markdown_tables\n"
  },
  {
    "path": "docs/table_of_content.md",
    "content": "# Contents\n\n* [Installation](installation.md)\n* [Update](update.md)\n* [Configuration](configuration.md)\n* [Configuring TOR](configuring_tor.md)\n* [Controlling](controlling.md)\n* [Mining](mining.md)\n* [Wallet](wallet.md)\n* [Developer resources](developer_resources.md)\n* [JSON RPC API](json_rpc_api.md)\n* [Code contribution guidelines](code_contribution_guidelines.md)\n* [Contact](contact.md)\n"
  },
  {
    "path": "docs/update.md",
    "content": "# Update\n\n* Run the following commands to update btcd, all dependencies, and install it:\n\n```bash\ncd $GOPATH/src/github.com/btcsuite/btcd\ngit pull && go install -v . ./cmd/...\n```\n"
  },
  {
    "path": "docs/using_docker.md",
    "content": "# Using Docker\n\n- [Using Docker](#using-docker)\n  - [Introduction](#introduction)\n  - [Docker volumes](#docker-volumes)\n  - [Known error messages when starting the btcd container](#known-error-messages-when-starting-the-btcd-container)\n  - [Examples](#examples)\n    - [Preamble](#preamble)\n    - [Full node without RPC port](#full-node-without-rpc-port)\n    - [Full node with RPC port](#full-node-with-rpc-port)\n    - [Full node with RPC port running on TESTNET](#full-node-with-rpc-port-running-on-testnet)\n\n## Introduction\n\nWith Docker you can easily set up *btcd* to run your Bitcoin full node. You can find the official *btcd* Docker images on Docker Hub [btcsuite/btcd](https://hub.docker.com/r/btcsuite/btcd). The Docker source file of this image is located at [Dockerfile](https://github.com/btcsuite/btcd/blob/master/Dockerfile).\n\nThis documentation focuses on running Docker container with *docker-compose.yml* files. These files are better to read and you can use them as a template for your own use. For more information about Docker and Docker compose visit the official [Docker documentation](https://docs.docker.com/).\n\n## Docker volumes\n\n**Special diskspace hint**: The following examples are using a Docker managed volume. The volume is named *btcd-data* This will use a lot of disk space, because it contains the full Bitcoin blockchain. Please make yourself familiar with [Docker volumes](https://docs.docker.com/storage/volumes/).\n\nThe *btcd-data* volume will be reused, if you upgrade your *docker-compose.yml* file. Keep in mind, that it is not automatically removed by Docker, if you delete the btcd container. If you don't need the volume anymore, please delete it manually with the command:\n\n```bash\ndocker volume ls\ndocker volume rm btcd-data\n```\n\nFor binding a local folder to your *btcd* container please read the [Docker documentation](https://docs.docker.com/). The preferred way is to use a Docker managed volume.\n\n## Known error messages when starting the btcd container\n\nWe pass all needed arguments to *btcd* as command line parameters in our *docker-compose.yml* file. It doesn't make sense to create a *btcd.conf* file. This would make things too complicated. Anyhow *btcd* will complain with following log messages when starting. These messages can be ignored:\n\n```bash\nError creating a default config file: open /sample-btcd.conf: no such file or directory\n...\n[WRN] BTCD: open /root/.btcd/btcd.conf: no such file or directory\n```\n\n## Examples\n\n### Preamble\n\nAll following examples uses some defaults:\n\n- container_name: btcd\n  Name of the docker container that is be shown by e.g. ```docker ps -a```\n\n- hostname: btcd **(very important to set a fixed name before first start)**\n  The internal hostname in the docker container. By default, docker is recreating the hostname every time you change the *docker-compose.yml* file. The default hostnames look like *ef00548d4fa5*. This is a problem when using the *btcd* RPC port. The RPC port is using a certificate to validate the hostname. If the hostname changes you need to recreate the certificate. To avoid this, you should set a fixed hostname before the first start. This ensures, that the docker volume is created with a certificate with this hostname.\n\n- restart: unless-stopped\n  Starts the *btcd* container when Docker starts, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker restarts.\n\nTo use the following examples create an empty directory. In this directory create a file named *docker-compose.yml*, copy and paste the example into the *docker-compose.yml* file and run it.\n\n```bash\nmkdir ~/btcd-docker\ncd ~/btcd-docker\ntouch docker-compose.yaml\nnano docker-compose.yaml (use your favourite editor to edit the compose file)\ndocker-compose up (creates and starts a new btcd container)\n```\n\nWith the following commands you can control *docker-compose*:\n\n```docker-compose up -d``` (creates and starts the container in background)\n\n```docker-compose down``` (stops and delete the container. **The docker volume btcd-data will not be deleted**)\n\n```docker-compose stop``` (stops the container)\n\n```docker-compose start``` (starts the container)\n\n```docker ps -a``` (list all running and stopped container)\n\n```docker volume ls``` (lists all docker volumes)\n\n```docker logs btcd``` (shows the log )\n\n```docker-compose help``` (brings up some helpful information)\n\n### Full node without RPC port\n\nLet's start with an easy example. If you just want to create a full node without the need of using the RPC port, you can use the following example. This example will launch *btcd* and exposes only the default p2p port 8333 to the outside world:\n\n```yaml\nversion: \"2\"\n\nservices:\n  btcd:\n    container_name: btcd\n    hostname: btcd\n    build: https://github.com/btcsuite/btcd.git#master\n    restart: unless-stopped\n    volumes:\n      - btcd-data:/root/.btcd\n    ports:\n      - 8333:8333\n\nvolumes:\n  btcd-data:\n```\n\n### Full node with RPC port\n\nTo use the RPC port of *btcd* you need to specify a *username* and a very strong *password*. If you want to connect to the RPC port from the internet, you need to expose port 8334(RPC) as well.\n\n```yaml\nversion: \"2\"\n\nservices:\n  btcd:\n    container_name: btcd\n    hostname: btcd\n    build: https://github.com/btcsuite/btcd.git#master\n    restart: unless-stopped\n    volumes:\n      - btcd-data:/root/.btcd\n    ports:\n      - 8333:8333\n      - 8334:8334\n    command: [\n        \"--rpcuser=[CHOOSE_A_USERNAME]\",\n        \"--rpcpass=[CREATE_A_VERY_HARD_PASSWORD]\"\n    ]\n\nvolumes:\n  btcd-data:\n```\n\n### Full node with RPC port running on TESTNET\n\nTo run a node on testnet, you need to provide the *--testnet* argument. The ports for testnet are 18333 (p2p) and 18334 (RPC):\n\n```yaml\nversion: \"2\"\n\nservices:\n  btcd:\n    container_name: btcd\n    hostname: btcd\n    build: https://github.com/btcsuite/btcd.git#master\n    restart: unless-stopped\n    volumes:\n      - btcd-data:/root/.btcd\n    ports:\n      - 18333:18333\n      - 18334:18334\n    command: [\n        \"--testnet\",\n        \"--rpcuser=[CHOOSE_A_USERNAME]\",\n        \"--rpcpass=[CREATE_A_VERY_HARD_PASSWORD]\"\n    ]\n\nvolumes:\n  btcd-data:\n```\n"
  },
  {
    "path": "docs/wallet.md",
    "content": "# Wallet\n\nbtcd was intentionally developed without an integrated wallet for security\nreasons.  Please see [btcwallet](https://github.com/btcsuite/btcwallet) for more\ninformation.\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/btcsuite/btcd\n\nrequire (\n\tgithub.com/btcsuite/btcd/btcec/v2 v2.3.5\n\tgithub.com/btcsuite/btcd/btcutil v1.1.5\n\tgithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0\n\tgithub.com/btcsuite/btcd/v2transport v1.0.1\n\tgithub.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f\n\tgithub.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd\n\tgithub.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792\n\tgithub.com/btcsuite/winsvc v1.0.0\n\tgithub.com/davecgh/go-spew v1.1.1\n\tgithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1\n\tgithub.com/decred/dcrd/lru v1.0.0\n\tgithub.com/gorilla/websocket v1.5.0\n\tgithub.com/jessevdk/go-flags v1.4.0\n\tgithub.com/jrick/logrotate v1.0.0\n\tgithub.com/stretchr/testify v1.8.4\n\tgithub.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7\n\tgolang.org/x/crypto v0.25.0\n\tgolang.org/x/sys v0.22.0\n\tpgregory.net/rapid v1.2.0\n)\n\nrequire (\n\tgithub.com/aead/siphash v1.0.1 // indirect\n\tgithub.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect\n\tgithub.com/golang/snappy v0.0.4 // indirect\n\tgithub.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/stretchr/objx v0.5.0 // indirect\n\tgolang.org/x/net v0.24.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n\n// The retract statements below fixes an accidental push of the tags of a btcd\n// fork.\nretract (\n\tv0.18.1\n\tv0.18.0\n\tv0.17.1\n\tv0.17.0\n\tv0.16.5\n\tv0.16.4\n\tv0.16.3\n\tv0.16.2\n\tv0.16.1\n\tv0.16.0\n\n\tv0.15.2\n\tv0.15.1\n\tv0.15.0\n\n\tv0.14.7\n\tv0.14.6\n\tv0.14.6\n\tv0.14.5\n\tv0.14.4\n\tv0.14.3\n\tv0.14.2\n\tv0.14.1\n\n\tv0.14.0\n\tv0.13.0-beta2\n\tv0.13.0-beta\n)\n\ngo 1.23.2\n"
  },
  {
    "path": "go.sum",
    "content": "github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg=\ngithub.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=\ngithub.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=\ngithub.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M=\ngithub.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A=\ngithub.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA=\ngithub.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=\ngithub.com/btcsuite/btcd/btcec/v2 v2.3.5 h1:dpAlnAwmT1yIBm3exhT1/8iUSD98RDJM5vqJVQDQLiU=\ngithub.com/btcsuite/btcd/btcec/v2 v2.3.5/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ=\ngithub.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A=\ngithub.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE=\ngithub.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8=\ngithub.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=\ngithub.com/btcsuite/btcd/v2transport v1.0.1 h1:pIyyyBCPwd087K3Wdb/9tIvUubAQdzTJghjPgzTQVsE=\ngithub.com/btcsuite/btcd/v2transport v1.0.1/go.mod h1:N6H0HGSElVVJKntzaYHYVbW71DtWDLMw2yhwVRO3ZOE=\ngithub.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=\ngithub.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=\ngithub.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=\ngithub.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw=\ngithub.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=\ngithub.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=\ngithub.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I=\ngithub.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=\ngithub.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=\ngithub.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc=\ngithub.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=\ngithub.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk=\ngithub.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=\ngithub.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=\ngithub.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=\ngithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=\ngithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=\ngithub.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8=\ngithub.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=\ngithub.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=\ngithub.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI=\ngithub.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=\ngithub.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE=\ngithub.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=\ngithub.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA=\ngithub.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=\ngithub.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=\ngithub.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=\ngithub.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=\ngolang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=\ngolang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=\ngolang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\ngolang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=\ngolang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=\ngolang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=\ngolang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\npgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk=\npgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=\n"
  },
  {
    "path": "integration/README.md",
    "content": "integration\n===========\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n\nThis contains integration tests which make use of the\n[rpctest](https://github.com/btcsuite/btcd/tree/master/integration/rpctest)\npackage to programmatically drive nodes via RPC.\n\n## License\n\nThis code is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "integration/bip0009_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// This file is ignored during the regular tests due to the following build tag.\n//go:build rpctest\n// +build rpctest\n\npackage integration\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/integration/rpctest\"\n)\n\nconst (\n\t// vbLegacyBlockVersion is the highest legacy block version before the\n\t// version bits scheme became active.\n\tvbLegacyBlockVersion = 4\n\n\t// vbTopBits defines the bits to set in the version to signal that the\n\t// version bits scheme is being used.\n\tvbTopBits = 0x20000000\n)\n\n// assertVersionBit gets the passed block hash from the given test harness and\n// ensures its version either has the provided bit set or unset per the set\n// flag.\nfunc assertVersionBit(r *rpctest.Harness, t *testing.T, hash *chainhash.Hash, bit uint8, set bool) {\n\tblock, err := r.Client.GetBlock(hash)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to retrieve block %v: %v\", hash, err)\n\t}\n\tswitch {\n\tcase set && block.Header.Version&(1<<bit) == 0:\n\t\t_, _, line, _ := runtime.Caller(1)\n\t\tt.Fatalf(\"assertion failed at line %d: block %s, version 0x%x \"+\n\t\t\t\"does not have bit %d set\", line, hash,\n\t\t\tblock.Header.Version, bit)\n\tcase !set && block.Header.Version&(1<<bit) != 0:\n\t\t_, _, line, _ := runtime.Caller(1)\n\t\tt.Fatalf(\"assertion failed at line %d: block %s, version 0x%x \"+\n\t\t\t\"has bit %d set\", line, hash, block.Header.Version, bit)\n\t}\n}\n\n// assertChainHeight retrieves the current chain height from the given test\n// harness and ensures it matches the provided expected height.\nfunc assertChainHeight(r *rpctest.Harness, t *testing.T, expectedHeight uint32) {\n\theight, err := r.Client.GetBlockCount()\n\tif err != nil {\n\t\tt.Fatalf(\"failed to retrieve block height: %v\", err)\n\t}\n\tif uint32(height) != expectedHeight {\n\t\t_, _, line, _ := runtime.Caller(1)\n\t\tt.Fatalf(\"assertion failed at line %d: block height of %d \"+\n\t\t\t\"is not the expected %d\", line, height, expectedHeight)\n\t}\n}\n\n// thresholdStateToStatus converts the passed threshold state to the equivalent\n// status string returned in the getblockchaininfo RPC.\nfunc thresholdStateToStatus(state blockchain.ThresholdState) (string, error) {\n\tswitch state {\n\tcase blockchain.ThresholdDefined:\n\t\treturn \"defined\", nil\n\tcase blockchain.ThresholdStarted:\n\t\treturn \"started\", nil\n\tcase blockchain.ThresholdLockedIn:\n\t\treturn \"lockedin\", nil\n\tcase blockchain.ThresholdActive:\n\t\treturn \"active\", nil\n\tcase blockchain.ThresholdFailed:\n\t\treturn \"failed\", nil\n\t}\n\n\treturn \"\", fmt.Errorf(\"unrecognized threshold state: %v\", state)\n}\n\n// assertSoftForkStatus retrieves the current blockchain info from the given\n// test harness and ensures the provided soft fork key is both available and its\n// status is the equivalent of the passed state.\nfunc assertSoftForkStatus(r *rpctest.Harness, t *testing.T, forkKey string, state blockchain.ThresholdState) {\n\t// Convert the expected threshold state into the equivalent\n\t// getblockchaininfo RPC status string.\n\tstatus, err := thresholdStateToStatus(state)\n\tif err != nil {\n\t\t_, _, line, _ := runtime.Caller(1)\n\t\tt.Fatalf(\"assertion failed at line %d: unable to convert \"+\n\t\t\t\"threshold state %v to string\", line, state)\n\t}\n\n\tinfo, err := r.Client.GetBlockChainInfo()\n\tif err != nil {\n\t\tt.Fatalf(\"failed to retrieve chain info: %v\", err)\n\t}\n\n\t// Ensure the key is available.\n\tdesc, ok := info.SoftForks.Bip9SoftForks[forkKey]\n\tif !ok {\n\t\t_, _, line, _ := runtime.Caller(1)\n\t\tt.Fatalf(\"assertion failed at line %d: softfork status for %q \"+\n\t\t\t\"is not in getblockchaininfo results\", line, forkKey)\n\t}\n\n\t// Ensure the status it the expected value.\n\tif desc.Status != status {\n\t\t_, _, line, _ := runtime.Caller(1)\n\t\tt.Fatalf(\"assertion failed at line %d: softfork status for %q \"+\n\t\t\t\"is %v instead of expected %v\", line, forkKey,\n\t\t\tdesc.Status, status)\n\t}\n}\n\n// testBIP0009 ensures the BIP0009 soft fork mechanism follows the state\n// transition rules set forth by the BIP for the provided soft fork key.  It\n// uses the regression test network to signal support and advance through the\n// various threshold states including failure to achieve locked in status.\n//\n// See TestBIP0009 for an overview of what is tested.\n//\n// NOTE: This only differs from the exported version in that it accepts the\n// specific soft fork deployment to test.\nfunc testBIP0009(t *testing.T, forkKey string, deploymentID uint32) {\n\t// Initialize the primary mining node with only the genesis block.\n\tr, err := rpctest.New(&chaincfg.RegressionNetParams, nil, nil, \"\")\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create primary harness: %v\", err)\n\t}\n\tif err := r.SetUp(false, 0); err != nil {\n\t\tt.Fatalf(\"unable to setup test chain: %v\", err)\n\t}\n\tdefer r.TearDown()\n\n\t// If the deployment is meant to be always active, then it should be\n\t// active from the very first block.\n\tif deploymentID == chaincfg.DeploymentTestDummyAlwaysActive {\n\t\tassertChainHeight(r, t, 0)\n\t\tassertSoftForkStatus(r, t, forkKey, blockchain.ThresholdActive)\n\t\treturn\n\t}\n\n\t// *** ThresholdDefined ***\n\t//\n\t// Assert the chain height is the expected value and the soft fork\n\t// status starts out as defined.\n\tassertChainHeight(r, t, 0)\n\tassertSoftForkStatus(r, t, forkKey, blockchain.ThresholdDefined)\n\n\t// *** ThresholdDefined part 2 - 1 block prior to ThresholdStarted ***\n\t//\n\t// Generate enough blocks to reach the height just before the first\n\t// state transition without signalling support since the state should\n\t// move to started once the start time has been reached regardless of\n\t// support signalling.\n\t//\n\t// NOTE: This is two blocks before the confirmation window because the\n\t// getblockchaininfo RPC reports the status for the block AFTER the\n\t// current one.  All of the heights below are thus offset by one to\n\t// compensate.\n\t//\n\t// Assert the chain height is the expected value and soft fork status is\n\t// still defined and did NOT move to started.\n\tconfirmationWindow := r.ActiveNet.MinerConfirmationWindow\n\tfor i := uint32(0); i < confirmationWindow-2; i++ {\n\t\t_, err := r.GenerateAndSubmitBlock(nil, vbLegacyBlockVersion,\n\t\t\ttime.Time{})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to generated block %d: %v\", i, err)\n\t\t}\n\t}\n\tassertChainHeight(r, t, confirmationWindow-2)\n\tassertSoftForkStatus(r, t, forkKey, blockchain.ThresholdDefined)\n\n\t// *** ThresholdStarted ***\n\t//\n\t// Generate another block to reach the next window.\n\t//\n\t// Assert the chain height is the expected value and the soft fork\n\t// status is started.\n\t_, err = r.GenerateAndSubmitBlock(nil, vbLegacyBlockVersion, time.Time{})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to generated block: %v\", err)\n\t}\n\tassertChainHeight(r, t, confirmationWindow-1)\n\tassertSoftForkStatus(r, t, forkKey, blockchain.ThresholdStarted)\n\n\t// *** ThresholdStarted part 2 - Fail to achieve ThresholdLockedIn ***\n\t//\n\t// Generate enough blocks to reach the next window in such a way that\n\t// the number blocks with the version bit set to signal support is 1\n\t// less than required to achieve locked in status.\n\t//\n\t// Assert the chain height is the expected value and the soft fork\n\t// status is still started and did NOT move to locked in.\n\tif deploymentID > uint32(len(r.ActiveNet.Deployments)) {\n\t\tt.Fatalf(\"deployment ID %d does not exist\", deploymentID)\n\t}\n\tdeployment := &r.ActiveNet.Deployments[deploymentID]\n\tactivationThreshold := r.ActiveNet.RuleChangeActivationThreshold\n\tif deployment.CustomActivationThreshold != 0 {\n\t\tactivationThreshold = deployment.CustomActivationThreshold\n\t}\n\tsignalForkVersion := int32(1<<deployment.BitNumber) | vbTopBits\n\tfor i := uint32(0); i < activationThreshold-1; i++ {\n\t\t_, err := r.GenerateAndSubmitBlock(nil, signalForkVersion,\n\t\t\ttime.Time{})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to generated block %d: %v\", i, err)\n\t\t}\n\t}\n\tfor i := uint32(0); i < confirmationWindow-(activationThreshold-1); i++ {\n\t\t_, err := r.GenerateAndSubmitBlock(nil, vbLegacyBlockVersion,\n\t\t\ttime.Time{})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to generated block %d: %v\", i, err)\n\t\t}\n\t}\n\tassertChainHeight(r, t, (confirmationWindow*2)-1)\n\tassertSoftForkStatus(r, t, forkKey, blockchain.ThresholdStarted)\n\n\t// *** ThresholdLockedIn ***\n\t//\n\t// Generate enough blocks to reach the next window in such a way that\n\t// the number blocks with the version bit set to signal support is\n\t// exactly the number required to achieve locked in status.\n\t//\n\t// Assert the chain height is the expected value and the soft fork\n\t// status moved to locked in.\n\tfor i := uint32(0); i < activationThreshold; i++ {\n\t\t_, err := r.GenerateAndSubmitBlock(nil, signalForkVersion,\n\t\t\ttime.Time{})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to generated block %d: %v\", i, err)\n\t\t}\n\t}\n\tfor i := uint32(0); i < confirmationWindow-activationThreshold; i++ {\n\t\t_, err := r.GenerateAndSubmitBlock(nil, vbLegacyBlockVersion,\n\t\t\ttime.Time{})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to generated block %d: %v\", i, err)\n\t\t}\n\t}\n\tassertChainHeight(r, t, (confirmationWindow*3)-1)\n\tassertSoftForkStatus(r, t, forkKey, blockchain.ThresholdLockedIn)\n\n\t// *** ThresholdLockedIn part 2 -- 1 block prior to ThresholdActive ***\n\t//\n\t// Generate enough blocks to reach the height just before the next\n\t// window without continuing to signal support since it is already\n\t// locked in.\n\t//\n\t// Assert the chain height is the expected value and the soft fork\n\t// status is still locked in and did NOT move to active.\n\tfor i := uint32(0); i < confirmationWindow-1; i++ {\n\t\t_, err := r.GenerateAndSubmitBlock(nil, vbLegacyBlockVersion,\n\t\t\ttime.Time{})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to generated block %d: %v\", i, err)\n\t\t}\n\t}\n\tassertChainHeight(r, t, (confirmationWindow*4)-2)\n\tassertSoftForkStatus(r, t, forkKey, blockchain.ThresholdLockedIn)\n\n\t// *** ThresholdActive ***\n\t//\n\t// Generate another block to reach the next window without continuing to\n\t// signal support since it is already locked in.\n\t//\n\t// Assert the chain height is the expected value and the soft fork\n\t// status moved to active.\n\t_, err = r.GenerateAndSubmitBlock(nil, vbLegacyBlockVersion, time.Time{})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to generated block: %v\", err)\n\t}\n\texpectedChainHeight := (confirmationWindow * 4) - 1\n\tassertChainHeight(r, t, expectedChainHeight)\n\n\t// If this isn't a fork that has a min activation height set, then it\n\t// should be active at this point.\n\tif deployment.MinActivationHeight == 0 {\n\t\tassertSoftForkStatus(r, t, forkKey, blockchain.ThresholdActive)\n\t\treturn\n\t}\n\n\t// Otherwise, we'll need to mine additional blocks to pass the min\n\t// activation height and ensure the rule set applies. For regtest the\n\t// deployment can only activate after height 600, and at this point\n\t// we've mined 4*144 blocks, so another confirmation window will put us\n\t// over.\n\tnumBlocksLeft := confirmationWindow\n\tfor i := uint32(0); i < numBlocksLeft; i++ {\n\t\t// Ensure that we're always in the locked in state right up\n\t\t// until after we mine the very last block.\n\t\tif i < numBlocksLeft {\n\t\t\tassertSoftForkStatus(\n\t\t\t\tr, t, forkKey, blockchain.ThresholdLockedIn,\n\t\t\t)\n\t\t}\n\n\t\t_, err := r.GenerateAndSubmitBlock(\n\t\t\tnil, signalForkVersion, time.Time{},\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to generated block %d: %v\", i, err)\n\t\t}\n\t}\n\n\t// At this point, the soft fork should now be shown as active.\n\texpectedChainHeight = (confirmationWindow * 5) - 1\n\tassertChainHeight(r, t, expectedChainHeight)\n\tassertSoftForkStatus(r, t, forkKey, blockchain.ThresholdActive)\n}\n\n// TestBIP0009 ensures the BIP0009 soft fork mechanism follows the state\n// transition rules set forth by the BIP for all soft forks.  It uses the\n// regression test network to signal support and advance through the various\n// threshold states including failure to achieve locked in status.\n//\n// Overview:\n// - Assert the chain height is 0 and the state is ThresholdDefined\n// - Generate 1 fewer blocks than needed to reach the first state transition\n//   - Assert chain height is expected and state is still ThresholdDefined\n//\n// - Generate 1 more block to reach the first state transition\n//   - Assert chain height is expected and state moved to ThresholdStarted\n//   - Generate enough blocks to reach the next state transition window, but only\n//     signal support in 1 fewer than the required number to achieve\n//     ThresholdLockedIn\n//   - Assert chain height is expected and state is still ThresholdStarted\n//   - Generate enough blocks to reach the next state transition window with only\n//     the exact number of blocks required to achieve locked in status signalling\n//     support.\n//   - Assert chain height is expected and state moved to ThresholdLockedIn\n//   - Generate 1 fewer blocks than needed to reach the next state transition\n//   - Assert chain height is expected and state is still ThresholdLockedIn\n//   - Generate 1 more block to reach the next state transition\n//   - Assert chain height is expected and state moved to ThresholdActive\nfunc TestBIP0009(t *testing.T) {\n\tt.Parallel()\n\n\ttestBIP0009(t, \"dummy\", chaincfg.DeploymentTestDummy)\n\ttestBIP0009(t, \"dummy-min-activation\", chaincfg.DeploymentTestDummyMinActivation)\n\ttestBIP0009(t, \"dummy-always-active\", chaincfg.DeploymentTestDummyAlwaysActive)\n\ttestBIP0009(t, \"segwit\", chaincfg.DeploymentSegwit)\n}\n\n// TestBIP0009Mining ensures blocks built via btcd's CPU miner follow the rules\n// set forth by BIP0009 by using the test dummy deployment.\n//\n// Overview:\n// - Generate block 1\n//   - Assert bit is NOT set (ThresholdDefined)\n//\n// - Generate enough blocks to reach first state transition\n//   - Assert bit is NOT set for block prior to state transition\n//   - Assert bit is set for block at state transition (ThresholdStarted)\n//\n// - Generate enough blocks to reach second state transition\n//   - Assert bit is set for block at state transition (ThresholdLockedIn)\n//\n// - Generate enough blocks to reach third state transition\n//   - Assert bit is set for block prior to state transition (ThresholdLockedIn)\n//   - Assert bit is NOT set for block at state transition (ThresholdActive)\nfunc TestBIP0009Mining(t *testing.T) {\n\tt.Parallel()\n\n\t// Initialize the primary mining node with only the genesis block.\n\tr, err := rpctest.New(&chaincfg.SimNetParams, nil, nil, \"\")\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create primary harness: %v\", err)\n\t}\n\tif err := r.SetUp(true, 0); err != nil {\n\t\tt.Fatalf(\"unable to setup test chain: %v\", err)\n\t}\n\tdefer r.TearDown()\n\n\t// Assert the chain only consists of the genesis block.\n\tassertChainHeight(r, t, 0)\n\n\t// *** ThresholdDefined ***\n\t//\n\t// Generate a block that extends the genesis block.  It should not have\n\t// the test dummy bit set in the version since the first window is\n\t// in the defined threshold state.\n\tdeployment := &r.ActiveNet.Deployments[chaincfg.DeploymentTestDummy]\n\ttestDummyBitNum := deployment.BitNumber\n\thashes, err := r.Client.Generate(1)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate blocks: %v\", err)\n\t}\n\tassertChainHeight(r, t, 1)\n\tassertVersionBit(r, t, hashes[0], testDummyBitNum, false)\n\n\t// *** ThresholdStarted ***\n\t//\n\t// Generate enough blocks to reach the first state transition.\n\t//\n\t// The second to last generated block should not have the test bit set\n\t// in the version.\n\t//\n\t// The last generated block should now have the test bit set in the\n\t// version since the btcd mining code will have recognized the test\n\t// dummy deployment as started.\n\tconfirmationWindow := r.ActiveNet.MinerConfirmationWindow\n\tnumNeeded := confirmationWindow - 1\n\thashes, err = r.Client.Generate(numNeeded)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to generated %d blocks: %v\", numNeeded, err)\n\t}\n\tassertChainHeight(r, t, confirmationWindow)\n\tassertVersionBit(r, t, hashes[len(hashes)-2], testDummyBitNum, false)\n\tassertVersionBit(r, t, hashes[len(hashes)-1], testDummyBitNum, true)\n\n\t// *** ThresholdLockedIn ***\n\t//\n\t// Generate enough blocks to reach the next state transition.\n\t//\n\t// The last generated block should still have the test bit set in the\n\t// version since the btcd mining code will have recognized the test\n\t// dummy deployment as locked in.\n\thashes, err = r.Client.Generate(confirmationWindow)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to generated %d blocks: %v\", confirmationWindow,\n\t\t\terr)\n\t}\n\tassertChainHeight(r, t, confirmationWindow*2)\n\tassertVersionBit(r, t, hashes[len(hashes)-1], testDummyBitNum, true)\n\n\t// *** ThresholdActivated ***\n\t//\n\t// Generate enough blocks to reach the next state transition.\n\t//\n\t// The second to last generated block should still have the test bit set\n\t// in the version since it is still locked in.\n\t//\n\t// The last generated block should NOT have the test bit set in the\n\t// version since the btcd mining code will have recognized the test\n\t// dummy deployment as activated and thus there is no longer any need\n\t// to set the bit.\n\thashes, err = r.Client.Generate(confirmationWindow)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to generated %d blocks: %v\", confirmationWindow,\n\t\t\terr)\n\t}\n\tassertChainHeight(r, t, confirmationWindow*3)\n\tassertVersionBit(r, t, hashes[len(hashes)-2], testDummyBitNum, true)\n\tassertVersionBit(r, t, hashes[len(hashes)-1], testDummyBitNum, false)\n}\n"
  },
  {
    "path": "integration/chain_test.go",
    "content": "//go:build rpctest\n// +build rpctest\n\npackage integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/integration/rpctest\"\n\t\"github.com/btcsuite/btcd/rpcclient\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestGetTxSpendingPrevOut checks that `GetTxSpendingPrevOut` behaves as\n// expected.\n// - an error is returned when invalid params are used.\n// - orphan tx is rejected.\n// - fee rate above the max is rejected.\n// - a mixed of both allowed and rejected can be returned in the same response.\nfunc TestGetTxSpendingPrevOut(t *testing.T) {\n\tt.Parallel()\n\n\t// Boilerplate codetestDir to make a pruned node.\n\tbtcdCfg := []string{\"--rejectnonstd\", \"--debuglevel=debug\"}\n\tr, err := rpctest.New(&chaincfg.SimNetParams, nil, btcdCfg, \"\")\n\trequire.NoError(t, err)\n\n\t// Setup the node.\n\trequire.NoError(t, r.SetUp(true, 100))\n\tt.Cleanup(func() {\n\t\trequire.NoError(t, r.TearDown())\n\t})\n\n\t// Create a tx and testing outpoints.\n\ttx := createTxInMempool(t, r)\n\topInMempool := tx.TxIn[0].PreviousOutPoint\n\topNotInMempool := wire.OutPoint{\n\t\tHash:  tx.TxHash(),\n\t\tIndex: 0,\n\t}\n\n\ttestCases := []struct {\n\t\tname           string\n\t\toutpoints      []wire.OutPoint\n\t\texpectedErr    error\n\t\texpectedResult []*btcjson.GetTxSpendingPrevOutResult\n\t}{\n\t\t{\n\t\t\t// When no outpoints are provided, the method should\n\t\t\t// return an error.\n\t\t\tname:           \"empty outpoints\",\n\t\t\texpectedErr:    rpcclient.ErrInvalidParam,\n\t\t\texpectedResult: nil,\n\t\t},\n\t\t{\n\t\t\t// When there are outpoints provided, check the\n\t\t\t// expceted results are returned.\n\t\t\tname: \"outpoints\",\n\t\t\toutpoints: []wire.OutPoint{\n\t\t\t\topInMempool, opNotInMempool,\n\t\t\t},\n\t\t\texpectedErr: nil,\n\t\t\texpectedResult: []*btcjson.GetTxSpendingPrevOutResult{\n\t\t\t\t{\n\t\t\t\t\tTxid:         opInMempool.Hash.String(),\n\t\t\t\t\tVout:         opInMempool.Index,\n\t\t\t\t\tSpendingTxid: tx.TxHash().String(),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tTxid: opNotInMempool.Hash.String(),\n\t\t\t\t\tVout: opNotInMempool.Index,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\trequire := require.New(t)\n\n\t\t\tresults, err := r.Client.GetTxSpendingPrevOut(\n\t\t\t\ttc.outpoints,\n\t\t\t)\n\n\t\t\trequire.ErrorIs(err, tc.expectedErr)\n\t\t\trequire.Len(results, len(tc.expectedResult))\n\n\t\t\t// Check each item is returned as expected.\n\t\t\tfor i, r := range results {\n\t\t\t\te := tc.expectedResult[i]\n\n\t\t\t\trequire.Equal(e.Txid, r.Txid)\n\t\t\t\trequire.Equal(e.Vout, r.Vout)\n\t\t\t\trequire.Equal(e.SpendingTxid, r.SpendingTxid)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// createTxInMempool creates a tx and puts it in the mempool.\nfunc createTxInMempool(t *testing.T, r *rpctest.Harness) *wire.MsgTx {\n\t// Create a fresh output for usage within the test below.\n\tconst outputValue = btcutil.SatoshiPerBitcoin\n\toutputKey, testOutput, testPkScript, err := makeTestOutput(\n\t\tr, t, outputValue,\n\t)\n\trequire.NoError(t, err)\n\n\t// Create a new transaction with a lock-time past the current known\n\t// MTP.\n\ttx := wire.NewMsgTx(1)\n\ttx.AddTxIn(&wire.TxIn{\n\t\tPreviousOutPoint: *testOutput,\n\t})\n\n\t// Fetch a fresh address from the harness, we'll use this address to\n\t// send funds back into the Harness.\n\taddr, err := r.NewAddress()\n\trequire.NoError(t, err)\n\n\taddrScript, err := txscript.PayToAddrScript(addr)\n\trequire.NoError(t, err)\n\n\ttx.AddTxOut(&wire.TxOut{\n\t\tPkScript: addrScript,\n\t\tValue:    outputValue - 1000,\n\t})\n\n\tsigScript, err := txscript.SignatureScript(\n\t\ttx, 0, testPkScript, txscript.SigHashAll, outputKey, true,\n\t)\n\trequire.NoError(t, err)\n\ttx.TxIn[0].SignatureScript = sigScript\n\n\t// Send the tx.\n\t_, err = r.Client.SendRawTransaction(tx, true)\n\trequire.NoError(t, err)\n\n\treturn tx\n}\n"
  },
  {
    "path": "integration/csv_fork_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// This file is ignored during the regular tests due to the following build tag.\n//go:build rpctest\n// +build rpctest\n\npackage integration\n\nimport (\n\t\"bytes\"\n\t\"runtime\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/integration/rpctest\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\tcsvKey = \"csv\"\n)\n\n// makeTestOutput creates an on-chain output paying to a freshly generated\n// p2pkh output with the specified amount.\nfunc makeTestOutput(r *rpctest.Harness, t *testing.T,\n\tamt btcutil.Amount) (*btcec.PrivateKey, *wire.OutPoint, []byte, error) {\n\n\t// Create a fresh key, then send some coins to an address spendable by\n\t// that key.\n\tkey, err := btcec.NewPrivateKey()\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\n\t// Using the key created above, generate a pkScript which it's able to\n\t// spend.\n\ta, err := btcutil.NewAddressPubKey(key.PubKey().SerializeCompressed(), r.ActiveNet)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\tselfAddrScript, err := txscript.PayToAddrScript(a.AddressPubKeyHash())\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\toutput := &wire.TxOut{PkScript: selfAddrScript, Value: 1e8}\n\n\t// Next, create and broadcast a transaction paying to the output.\n\tfundTx, err := r.CreateTransaction([]*wire.TxOut{output}, 10, true)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\ttxHash, err := r.Client.SendRawTransaction(fundTx, true)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\n\t// The transaction created above should be included within the next\n\t// generated block.\n\tblockHash, err := r.Client.Generate(1)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\tassertTxInBlock(r, t, blockHash[0], txHash)\n\n\t// Locate the output index of the coins spendable by the key we\n\t// generated above, this is needed in order to create a proper utxo for\n\t// this output.\n\tvar outputIndex uint32\n\tif bytes.Equal(fundTx.TxOut[0].PkScript, selfAddrScript) {\n\t\toutputIndex = 0\n\t} else {\n\t\toutputIndex = 1\n\t}\n\n\tutxo := &wire.OutPoint{\n\t\tHash:  fundTx.TxHash(),\n\t\tIndex: outputIndex,\n\t}\n\n\treturn key, utxo, selfAddrScript, nil\n}\n\n// TestBIP0113Activation tests for proper adherence of the BIP 113 rule\n// constraint which requires all transaction finality tests to use the MTP of\n// the last 11 blocks, rather than the timestamp of the block which includes\n// them.\n//\n// Overview:\n//\n// - Pre soft-fork:\n//  1. Transactions with non-final lock-times from the PoV of MTP should be\n//     rejected from the mempool.\n//  2. Transactions within non-final MTP based lock-times should be accepted\n//     in valid blocks.\n//\n// - Post soft-fork:\n//  1. Transactions with non-final lock-times from the PoV of MTP should be\n//     rejected from the mempool and when found within otherwise valid blocks.\n//  2. Transactions with final lock-times from the PoV of MTP should be\n//     accepted to the mempool and mined in future block.\nfunc TestBIP0113Activation(t *testing.T) {\n\tt.Parallel()\n\n\tbtcdCfg := []string{\"--rejectnonstd\"}\n\tr, err := rpctest.New(&chaincfg.SimNetParams, nil, btcdCfg, \"\")\n\tif err != nil {\n\t\tt.Fatal(\"unable to create primary harness: \", err)\n\t}\n\tif err := r.SetUp(true, 1); err != nil {\n\t\tt.Fatalf(\"unable to setup test chain: %v\", err)\n\t}\n\tdefer r.TearDown()\n\n\t// Create a fresh output for usage within the test below.\n\tconst outputValue = btcutil.SatoshiPerBitcoin\n\toutputKey, testOutput, testPkScript, err := makeTestOutput(r, t,\n\t\toutputValue)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create test output: %v\", err)\n\t}\n\n\t// Fetch a fresh address from the harness, we'll use this address to\n\t// send funds back into the Harness.\n\taddr, err := r.NewAddress()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate address: %v\", err)\n\t}\n\taddrScript, err := txscript.PayToAddrScript(addr)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate addr script: %v\", err)\n\t}\n\n\t// Now create a transaction with a lock time which is \"final\" according\n\t// to the latest block, but not according to the current median time\n\t// past.\n\ttx := wire.NewMsgTx(1)\n\ttx.AddTxIn(&wire.TxIn{\n\t\tPreviousOutPoint: *testOutput,\n\t})\n\ttx.AddTxOut(&wire.TxOut{\n\t\tPkScript: addrScript,\n\t\tValue:    outputValue - 1000,\n\t})\n\n\t// We set the lock-time of the transaction to just one minute after the\n\t// current MTP of the chain.\n\tchainInfo, err := r.Client.GetBlockChainInfo()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to query for chain info: %v\", err)\n\t}\n\ttx.LockTime = uint32(chainInfo.MedianTime) + 1\n\n\tsigScript, err := txscript.SignatureScript(tx, 0, testPkScript,\n\t\ttxscript.SigHashAll, outputKey, true)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate sig: %v\", err)\n\t}\n\ttx.TxIn[0].SignatureScript = sigScript\n\n\t// This transaction should be rejected from the mempool as using MTP\n\t// for transactions finality is now a policy rule. Additionally, the\n\t// exact error should be the rejection of a non-final transaction.\n\t_, err = r.Client.SendRawTransaction(tx, true)\n\tif err == nil {\n\t\tt.Fatalf(\"transaction accepted, but should be non-final\")\n\t} else if !strings.Contains(err.Error(), \"not finalized\") {\n\t\tt.Fatalf(\"transaction should be rejected due to being \"+\n\t\t\t\"non-final, instead: %v\", err)\n\t}\n\n\t// However, since the block validation consensus rules haven't yet\n\t// activated, a block including the transaction should be accepted.\n\ttxns := []*btcutil.Tx{btcutil.NewTx(tx)}\n\tblock, err := r.GenerateAndSubmitBlock(txns, -1, time.Time{})\n\tif err != nil {\n\t\tt.Fatalf(\"unable to submit block: %v\", err)\n\t}\n\ttxid := tx.TxHash()\n\tassertTxInBlock(r, t, block.Hash(), &txid)\n\n\t// At this point, the block height should be 103: we mined 101 blocks\n\t// to create a single mature output, then an additional block to create\n\t// a new output, and then mined a single block above to include our\n\t// transaction.\n\tassertChainHeight(r, t, 103)\n\n\t// Next, mine enough blocks to ensure that the soft-fork becomes\n\t// activated. Assert that the block version of the second-to-last block\n\t// in the final range is active.\n\n\t// Next, mine ensure blocks to ensure that the soft-fork becomes\n\t// active. We're at height 103 and we need 200 blocks to be mined after\n\t// the genesis target period, so we mine 196 blocks. This'll put us at\n\t// height 299. The getblockchaininfo call checks the state for the\n\t// block AFTER the current height.\n\tnumBlocks := (r.ActiveNet.MinerConfirmationWindow * 2) - 4\n\tif _, err := r.Client.Generate(numBlocks); err != nil {\n\t\tt.Fatalf(\"unable to generate blocks: %v\", err)\n\t}\n\n\tassertChainHeight(r, t, 299)\n\tassertSoftForkStatus(r, t, csvKey, blockchain.ThresholdActive)\n\n\t// The timeLockDeltas slice represents a series of deviations from the\n\t// current MTP which will be used to test border conditions w.r.t\n\t// transaction finality. -1 indicates 1 second prior to the MTP, 0\n\t// indicates the current MTP, and 1 indicates 1 second after the\n\t// current MTP.\n\t//\n\t// This time, all transactions which are final according to the MTP\n\t// *should* be accepted to both the mempool and within a valid block.\n\t// While transactions with lock-times *after* the current MTP should be\n\t// rejected.\n\ttimeLockDeltas := []int64{-1, 0, 1}\n\tfor _, timeLockDelta := range timeLockDeltas {\n\t\tchainInfo, err = r.Client.GetBlockChainInfo()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to query for chain info: %v\", err)\n\t\t}\n\t\tmedianTimePast := chainInfo.MedianTime\n\n\t\t// Create another test output to be spent shortly below.\n\t\toutputKey, testOutput, testPkScript, err = makeTestOutput(r, t,\n\t\t\toutputValue)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to create test output: %v\", err)\n\t\t}\n\n\t\t// Create a new transaction with a lock-time past the current known\n\t\t// MTP.\n\t\ttx = wire.NewMsgTx(1)\n\t\ttx.AddTxIn(&wire.TxIn{\n\t\t\tPreviousOutPoint: *testOutput,\n\t\t})\n\t\ttx.AddTxOut(&wire.TxOut{\n\t\t\tPkScript: addrScript,\n\t\t\tValue:    outputValue - 1000,\n\t\t})\n\t\ttx.LockTime = uint32(medianTimePast + timeLockDelta)\n\t\tsigScript, err = txscript.SignatureScript(tx, 0, testPkScript,\n\t\t\ttxscript.SigHashAll, outputKey, true)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to generate sig: %v\", err)\n\t\t}\n\t\ttx.TxIn[0].SignatureScript = sigScript\n\n\t\t// If the time-lock delta is greater than -1, then the\n\t\t// transaction should be rejected from the mempool and when\n\t\t// included within a block. A time-lock delta of -1 should be\n\t\t// accepted as it has a lock-time of one\n\t\t// second _before_ the current MTP.\n\n\t\t_, err = r.Client.SendRawTransaction(tx, true)\n\t\tif err == nil && timeLockDelta >= 0 {\n\t\t\tt.Fatal(\"transaction was accepted into the mempool \" +\n\t\t\t\t\"but should be rejected!\")\n\t\t} else if err != nil && !strings.Contains(err.Error(), \"not finalized\") {\n\t\t\tt.Fatalf(\"transaction should be rejected from mempool \"+\n\t\t\t\t\"due to being  non-final, instead: %v\", err)\n\t\t}\n\n\t\ttxns = []*btcutil.Tx{btcutil.NewTx(tx)}\n\t\t_, err := r.GenerateAndSubmitBlock(txns, -1, time.Time{})\n\t\tif err == nil && timeLockDelta >= 0 {\n\t\t\tt.Fatal(\"block should be rejected due to non-final \" +\n\t\t\t\t\"txn, but was accepted\")\n\t\t} else if err != nil && !strings.Contains(err.Error(), \"unfinalized\") {\n\t\t\tt.Fatalf(\"block should be rejected due to non-final \"+\n\t\t\t\t\"tx, instead: %v\", err)\n\t\t}\n\t}\n}\n\n// createCSVOutput creates an output paying to a trivially redeemable CSV\n// pkScript with the specified time-lock.\nfunc createCSVOutput(r *rpctest.Harness, t *testing.T,\n\tnumSatoshis btcutil.Amount, timeLock int32,\n\tisSeconds bool) ([]byte, *wire.OutPoint, *wire.MsgTx, error) {\n\n\t// Convert the time-lock to the proper sequence lock based according to\n\t// if the lock is seconds or time based.\n\tsequenceLock := blockchain.LockTimeToSequence(isSeconds,\n\t\tuint32(timeLock))\n\n\t// Our CSV script is simply: <sequenceLock> OP_CSV OP_DROP\n\tb := txscript.NewScriptBuilder().\n\t\tAddInt64(int64(sequenceLock)).\n\t\tAddOp(txscript.OP_CHECKSEQUENCEVERIFY).\n\t\tAddOp(txscript.OP_DROP)\n\tcsvScript, err := b.Script()\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\n\t// Using the script generated above, create a P2SH output which will be\n\t// accepted into the mempool.\n\tp2shAddr, err := btcutil.NewAddressScriptHash(csvScript, r.ActiveNet)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\tp2shScript, err := txscript.PayToAddrScript(p2shAddr)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\toutput := &wire.TxOut{\n\t\tPkScript: p2shScript,\n\t\tValue:    int64(numSatoshis),\n\t}\n\n\t// Finally create a valid transaction which creates the output crafted\n\t// above.\n\ttx, err := r.CreateTransaction([]*wire.TxOut{output}, 10, true)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\n\tvar outputIndex uint32\n\tif !bytes.Equal(tx.TxOut[0].PkScript, p2shScript) {\n\t\toutputIndex = 1\n\t}\n\n\tutxo := &wire.OutPoint{\n\t\tHash:  tx.TxHash(),\n\t\tIndex: outputIndex,\n\t}\n\n\treturn csvScript, utxo, tx, nil\n}\n\n// spendCSVOutput spends an output previously created by the createCSVOutput\n// function. The sigScript is a trivial push of OP_TRUE followed by the\n// redeemScript to pass P2SH evaluation.\nfunc spendCSVOutput(redeemScript []byte, csvUTXO *wire.OutPoint,\n\tsequence uint32, targetOutput *wire.TxOut,\n\ttxVersion int32) (*wire.MsgTx, error) {\n\n\ttx := wire.NewMsgTx(txVersion)\n\ttx.AddTxIn(&wire.TxIn{\n\t\tPreviousOutPoint: *csvUTXO,\n\t\tSequence:         sequence,\n\t})\n\ttx.AddTxOut(targetOutput)\n\n\tb := txscript.NewScriptBuilder().\n\t\tAddOp(txscript.OP_TRUE).\n\t\tAddData(redeemScript)\n\n\tsigScript, err := b.Script()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttx.TxIn[0].SignatureScript = sigScript\n\n\treturn tx, nil\n}\n\n// assertTxInBlock asserts a transaction with the specified txid is found\n// within the block with the passed block hash.\nfunc assertTxInBlock(r *rpctest.Harness, t *testing.T, blockHash *chainhash.Hash,\n\ttxid *chainhash.Hash) {\n\n\tblock, err := r.Client.GetBlock(blockHash)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get block: %v\", err)\n\t}\n\tif len(block.Transactions) < 2 {\n\t\tt.Fatal(\"target transaction was not mined\")\n\t}\n\n\tfor _, txn := range block.Transactions {\n\t\ttxHash := txn.TxHash()\n\t\tif txn.TxHash() == txHash {\n\t\t\treturn\n\t\t}\n\t}\n\n\t_, _, line, _ := runtime.Caller(1)\n\tt.Fatalf(\"assertion failed at line %v: txid %v was not found in \"+\n\t\t\"block %v\", line, txid, blockHash)\n}\n\n// TestBIP0068AndBIP0112Activation tests for the proper adherence to the BIP\n// 112 and BIP 68 rule-set after the activation of the CSV-package soft-fork.\n//\n// Overview:\n// - Pre soft-fork:\n//  1. A transaction spending a CSV output validly should be rejected from the\n//     mempool, but accepted in a valid generated block including the\n//     transaction.\n//\n// - Post soft-fork:\n//  1. See the cases exercised within the table driven tests towards the end\n//     of this test.\nfunc TestBIP0068AndBIP0112Activation(t *testing.T) {\n\tt.Parallel()\n\n\t// We'd like the test proper evaluation and validation of the BIP 68\n\t// (sequence locks) and BIP 112 rule-sets which add input-age based\n\t// relative lock times.\n\n\tbtcdCfg := []string{\"--rejectnonstd\"}\n\tr, err := rpctest.New(&chaincfg.SimNetParams, nil, btcdCfg, \"\")\n\tif err != nil {\n\t\tt.Fatal(\"unable to create primary harness: \", err)\n\t}\n\tif err := r.SetUp(true, 1); err != nil {\n\t\tt.Fatalf(\"unable to setup test chain: %v\", err)\n\t}\n\tdefer r.TearDown()\n\n\tassertSoftForkStatus(r, t, csvKey, blockchain.ThresholdStarted)\n\n\tharnessAddr, err := r.NewAddress()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to obtain harness address: %v\", err)\n\t}\n\tharnessScript, err := txscript.PayToAddrScript(harnessAddr)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate pkScript: %v\", err)\n\t}\n\n\tconst (\n\t\toutputAmt         = btcutil.SatoshiPerBitcoin\n\t\trelativeBlockLock = 10\n\t)\n\n\tsweepOutput := &wire.TxOut{\n\t\tValue:    outputAmt - 5000,\n\t\tPkScript: harnessScript,\n\t}\n\n\t// As the soft-fork hasn't yet activated _any_ transaction version\n\t// which uses the CSV opcode should be accepted. Since at this point,\n\t// CSV doesn't actually exist, it's just a NOP.\n\tfor txVersion := int32(0); txVersion < 3; txVersion++ {\n\t\t// Create a trivially spendable output with a CSV lock-time of\n\t\t// 10 relative blocks.\n\t\tredeemScript, testUTXO, tx, err := createCSVOutput(r, t, outputAmt,\n\t\t\trelativeBlockLock, false)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to create CSV encumbered output: %v\", err)\n\t\t}\n\n\t\t// As the transaction is p2sh it should be accepted into the\n\t\t// mempool and found within the next generated block.\n\t\tif _, err := r.Client.SendRawTransaction(tx, true); err != nil {\n\t\t\tt.Fatalf(\"unable to broadcast tx: %v\", err)\n\t\t}\n\t\tblocks, err := r.Client.Generate(1)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to generate blocks: %v\", err)\n\t\t}\n\t\ttxid := tx.TxHash()\n\t\tassertTxInBlock(r, t, blocks[0], &txid)\n\n\t\t// Generate a custom transaction which spends the CSV output.\n\t\tsequenceNum := blockchain.LockTimeToSequence(false, 10)\n\t\tspendingTx, err := spendCSVOutput(redeemScript, testUTXO,\n\t\t\tsequenceNum, sweepOutput, txVersion)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to spend csv output: %v\", err)\n\t\t}\n\n\t\t// This transaction should be rejected from the mempool since\n\t\t// CSV validation is already mempool policy pre-fork.\n\t\t_, err = r.Client.SendRawTransaction(spendingTx, true)\n\t\tif err == nil {\n\t\t\tt.Fatalf(\"transaction should have been rejected, but was \" +\n\t\t\t\t\"instead accepted\")\n\t\t}\n\n\t\t// However, this transaction should be accepted in a custom\n\t\t// generated block as CSV validation for scripts within blocks\n\t\t// shouldn't yet be active.\n\t\ttxns := []*btcutil.Tx{btcutil.NewTx(spendingTx)}\n\t\tblock, err := r.GenerateAndSubmitBlock(txns, -1, time.Time{})\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to submit block: %v\", err)\n\t\t}\n\t\ttxid = spendingTx.TxHash()\n\t\tassertTxInBlock(r, t, block.Hash(), &txid)\n\t}\n\n\t// At this point, the block height should be 107: we started at height\n\t// 101, then generated 2 blocks in each loop iteration above.\n\tassertChainHeight(r, t, 107)\n\n\t// With the height at 107 we need 200 blocks to be mined after the\n\t// genesis target period, so we mine 192 blocks. This'll put us at\n\t// height 299. The getblockchaininfo call checks the state for the\n\t// block AFTER the current height.\n\tnumBlocks := (r.ActiveNet.MinerConfirmationWindow * 2) - 8\n\tif _, err := r.Client.Generate(numBlocks); err != nil {\n\t\tt.Fatalf(\"unable to generate blocks: %v\", err)\n\t}\n\n\tassertChainHeight(r, t, 299)\n\tassertSoftForkStatus(r, t, csvKey, blockchain.ThresholdActive)\n\n\t// Knowing the number of outputs needed for the tests below, create a\n\t// fresh output for use within each of the test-cases below.\n\tconst relativeTimeLock = 512\n\tconst numTests = 8\n\ttype csvOutput struct {\n\t\tRedeemScript []byte\n\t\tUtxo         *wire.OutPoint\n\t\tTimelock     int32\n\t}\n\tvar spendableInputs [numTests]csvOutput\n\n\t// Create three outputs which have a block-based sequence locks, and\n\t// three outputs which use the above time based sequence lock.\n\tfor i := 0; i < numTests; i++ {\n\t\ttimeLock := relativeTimeLock\n\t\tisSeconds := true\n\t\tif i < 7 {\n\t\t\ttimeLock = relativeBlockLock\n\t\t\tisSeconds = false\n\t\t}\n\n\t\tredeemScript, utxo, tx, err := createCSVOutput(r, t, outputAmt,\n\t\t\tint32(timeLock), isSeconds)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to create CSV output: %v\", err)\n\t\t}\n\n\t\tif _, err := r.Client.SendRawTransaction(tx, true); err != nil {\n\t\t\tt.Fatalf(\"unable to broadcast transaction: %v\", err)\n\t\t}\n\n\t\tspendableInputs[i] = csvOutput{\n\t\t\tRedeemScript: redeemScript,\n\t\t\tUtxo:         utxo,\n\t\t\tTimelock:     int32(timeLock),\n\t\t}\n\t}\n\n\t// Mine a single block including all the transactions generated above.\n\tif _, err := r.Client.Generate(1); err != nil {\n\t\tt.Fatalf(\"unable to generate block: %v\", err)\n\t}\n\n\t// Now mine 10 additional blocks giving the inputs generated above a\n\t// age of 11. Space out each block 10 minutes after the previous block.\n\tprevBlockHash, err := r.Client.GetBestBlockHash()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get prior block hash: %v\", err)\n\t}\n\tprevBlock, err := r.Client.GetBlock(prevBlockHash)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get block: %v\", err)\n\t}\n\tfor i := 0; i < relativeBlockLock; i++ {\n\t\ttimeStamp := prevBlock.Header.Timestamp.Add(time.Minute * 10)\n\t\tb, err := r.GenerateAndSubmitBlock(nil, -1, timeStamp)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to generate block: %v\", err)\n\t\t}\n\n\t\tprevBlock = b.MsgBlock()\n\t}\n\n\t// A helper function to create fully signed transactions in-line during\n\t// the array initialization below.\n\tvar inputIndex uint32\n\tmakeTxCase := func(sequenceNum uint32, txVersion int32) *wire.MsgTx {\n\t\tcsvInput := spendableInputs[inputIndex]\n\n\t\ttx, err := spendCSVOutput(csvInput.RedeemScript, csvInput.Utxo,\n\t\t\tsequenceNum, sweepOutput, txVersion)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to spend CSV output: %v\", err)\n\t\t}\n\n\t\tinputIndex++\n\t\treturn tx\n\t}\n\n\ttests := [numTests]struct {\n\t\ttx     *wire.MsgTx\n\t\taccept bool\n\t}{\n\t\t// A valid transaction with a single input a sequence number\n\t\t// creating a 100 block relative time-lock. This transaction\n\t\t// should be rejected as its version number is 1, and only tx\n\t\t// of version > 2 will trigger the CSV behavior.\n\t\t{\n\t\t\ttx:     makeTxCase(blockchain.LockTimeToSequence(false, 100), 1),\n\t\t\taccept: false,\n\t\t},\n\t\t// A transaction of version 2 spending a single input. The\n\t\t// input has a relative time-lock of 1 block, but the disable\n\t\t// bit it set. The transaction should be rejected as a result.\n\t\t{\n\t\t\ttx: makeTxCase(\n\t\t\t\tblockchain.LockTimeToSequence(false, 1)|wire.SequenceLockTimeDisabled,\n\t\t\t\t2,\n\t\t\t),\n\t\t\taccept: false,\n\t\t},\n\t\t// A v2 transaction with a single input having a 9 block\n\t\t// relative time lock. The referenced input is 11 blocks old,\n\t\t// but the CSV output requires a 10 block relative lock-time.\n\t\t// Therefore, the transaction should be rejected.\n\t\t{\n\t\t\ttx:     makeTxCase(blockchain.LockTimeToSequence(false, 9), 2),\n\t\t\taccept: false,\n\t\t},\n\t\t// A v2 transaction with a single input having a 10 block\n\t\t// relative time lock. The referenced input is 11 blocks old so\n\t\t// the transaction should be accepted.\n\t\t{\n\t\t\ttx:     makeTxCase(blockchain.LockTimeToSequence(false, 10), 2),\n\t\t\taccept: true,\n\t\t},\n\t\t// A v2 transaction with a single input having a 11 block\n\t\t// relative time lock. The input referenced has an input age of\n\t\t// 11 and the CSV op-code requires 10 blocks to have passed, so\n\t\t// this transaction should be accepted.\n\t\t{\n\t\t\ttx:     makeTxCase(blockchain.LockTimeToSequence(false, 11), 2),\n\t\t\taccept: true,\n\t\t},\n\t\t// A v2 transaction whose input has a 1000 blck relative time\n\t\t// lock.  This should be rejected as the input's age is only 11\n\t\t// blocks.\n\t\t{\n\t\t\ttx:     makeTxCase(blockchain.LockTimeToSequence(false, 1000), 2),\n\t\t\taccept: false,\n\t\t},\n\t\t// A v2 transaction with a single input having a 512,000 second\n\t\t// relative time-lock. This transaction should be rejected as 6\n\t\t// days worth of blocks haven't yet been mined. The referenced\n\t\t// input doesn't have sufficient age.\n\t\t{\n\t\t\ttx:     makeTxCase(blockchain.LockTimeToSequence(true, 512000), 2),\n\t\t\taccept: false,\n\t\t},\n\t\t// A v2 transaction whose single input has a 512 second\n\t\t// relative time-lock. This transaction should be accepted as\n\t\t// finalized.\n\t\t{\n\t\t\ttx:     makeTxCase(blockchain.LockTimeToSequence(true, 512), 2),\n\t\t\taccept: true,\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\ttxid, err := r.Client.SendRawTransaction(test.tx, true)\n\t\tswitch {\n\t\t// Test case passes, nothing further to report.\n\t\tcase test.accept && err == nil:\n\n\t\t// Transaction should have been accepted but we have a non-nil\n\t\t// error.\n\t\tcase test.accept && err != nil:\n\t\t\tt.Fatalf(\"test #%d, transaction should be accepted, \"+\n\t\t\t\t\"but was rejected: %v\", i, err)\n\n\t\t// Transaction should have been rejected, but it was accepted.\n\t\tcase !test.accept && err == nil:\n\t\t\tt.Fatalf(\"test #%d, transaction should be rejected, \"+\n\t\t\t\t\"but was accepted\", i)\n\n\t\t// Transaction was rejected as wanted, nothing more to do.\n\t\tcase !test.accept && err != nil:\n\t\t}\n\n\t\t// If the transaction should be rejected, manually mine a block\n\t\t// with the non-final transaction. It should be rejected.\n\t\tif !test.accept {\n\t\t\ttxns := []*btcutil.Tx{btcutil.NewTx(test.tx)}\n\t\t\t_, err := r.GenerateAndSubmitBlock(txns, -1, time.Time{})\n\t\t\tif err == nil {\n\t\t\t\tt.Fatalf(\"test #%d, invalid block accepted\", i)\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\n\t\t// Generate a block, the transaction should be included within\n\t\t// the newly mined block.\n\t\tblockHashes, err := r.Client.Generate(1)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to mine block: %v\", err)\n\t\t}\n\t\tassertTxInBlock(r, t, blockHashes[0], txid)\n\t}\n}\n"
  },
  {
    "path": "integration/getchaintips_test.go",
    "content": "package integration\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/integration/rpctest\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc getBlockFromString(t *testing.T, hexStr string) *btcutil.Block {\n\tt.Helper()\n\n\tserializedBlock, err := hex.DecodeString(hexStr)\n\tif err != nil {\n\t\tt.Fatalf(\"couldn't decode hex string of %s\", hexStr)\n\t}\n\n\tblock, err := btcutil.NewBlockFromBytes(serializedBlock)\n\tif err != nil {\n\t\tt.Fatalf(\"couldn't make a new block from bytes. \"+\n\t\t\t\"Decoded hex string: %s\", hexStr)\n\t}\n\n\treturn block\n}\n\n// compareMultipleChainTips checks that all the expected chain tips are included in got chain tips and\n// verifies that the got chain tip matches the expected chain tip.\nfunc compareMultipleChainTips(t *testing.T, gotChainTips, expectedChainTips []*btcjson.GetChainTipsResult) error {\n\tif len(gotChainTips) != len(expectedChainTips) {\n\t\treturn fmt.Errorf(\"Expected %d chaintips but got %d\", len(expectedChainTips), len(gotChainTips))\n\t}\n\n\tgotChainTipsMap := make(map[string]btcjson.GetChainTipsResult)\n\tfor _, gotChainTip := range gotChainTips {\n\t\tgotChainTipsMap[gotChainTip.Hash] = *gotChainTip\n\t}\n\n\tfor _, expectedChainTip := range expectedChainTips {\n\t\tgotChainTip, found := gotChainTipsMap[expectedChainTip.Hash]\n\t\tif !found {\n\t\t\treturn fmt.Errorf(\"Couldn't find expected chaintip with hash %s\", expectedChainTip.Hash)\n\t\t}\n\n\t\trequire.Equal(t, gotChainTip, *expectedChainTip)\n\t}\n\n\treturn nil\n}\n\nfunc TestGetChainTips(t *testing.T) {\n\t// block1Hex is a block that builds on top of the regtest genesis block.\n\t// Has blockhash of \"36c056247e8c0589f6307995e4e13acf2b2b79cad9ecd5a4eeab2131ed0ecde5\".\n\tblock1Hex := \"0000002006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf18891\" +\n\t\t\"0f71881025ae0d41ce8748b79ac40e5f3197af3bb83a594def7943aff0fce504c638ea6d63f\" +\n\t\t\"fff7f2000000000010200000000010100000000000000000000000000000000000000000000\" +\n\t\t\"00000000000000000000ffffffff025100ffffffff0200f2052a010000001600149b0f9d020\" +\n\t\t\"8b3b425246e16830562a63bf1c701180000000000000000266a24aa21a9ede2f61c3f71d1de\" +\n\t\t\"fd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000\" +\n\t\t\"000000000000000000000000000000000000000000000000000\"\n\n\t// block2Hex is a block that builds on top of block1Hex.\n\t// Has blockhash of \"664b51334782a4ad16e8471b530dcd0027c75b8c25187b41dfc85ecd353295c6\".\n\tblock2Hex := \"00000020e5cd0eed3121abeea4d5ecd9ca792b2bcf3ae1e4957930f689058c7e2456c0\" +\n\t\t\"362a78a11b875d31af2ea493aa5b6b623e0d481f11e69f7147ab974be9da087f3e24696f63f\" +\n\t\t\"fff7f2001000000010200000000010100000000000000000000000000000000000000000000\" +\n\t\t\"00000000000000000000ffffffff025200ffffffff0200f2052a0100000016001470fea1feb\" +\n\t\t\"4969c1f237753ae29c0217c6637835c0000000000000000266a24aa21a9ede2f61c3f71d1de\" +\n\t\t\"fd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000\" +\n\t\t\"000000000000000000000000000000000000000000000000000\"\n\n\t// block3Hex is a block that builds on top of block2Hex.\n\t// Has blockhash of \"17a5c5cb90ecde5a46dd195d434eea46b653e35e4517070eade429db3ac83944\".\n\tblock3Hex := \"00000020c6953235cd5ec8df417b18258c5bc72700cd0d531b47e816ada4824733514b\" +\n\t\t\"66c3ad4d567a36c20df07ea0b7fce1e4b4ee5be3eaf0b946b0ae73f3a74d47f0cf99696f63f\" +\n\t\t\"fff7f2000000000010200000000010100000000000000000000000000000000000000000000\" +\n\t\t\"00000000000000000000ffffffff025300ffffffff0200f2052a010000001600140e835869b\" +\n\t\t\"154f647d11376634b5e8c785e7d21060000000000000000266a24aa21a9ede2f61c3f71d1de\" +\n\t\t\"fd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000\" +\n\t\t\"000000000000000000000000000000000000000000000000000\"\n\n\t// block4Hex is a block that builds on top of block3Hex.\n\t// Has blockhash of \"7b357f3073c4397d6d069a32a09141c32560f3c62233ca138eb5e03c5991f45c\".\n\tblock4Hex := \"000000204439c83adb29e4ad0e0717455ee353b646ea4e435d19dd465adeec90cbc5a5\" +\n\t\t\"17ab639a5dd622e90f5f9feffc1c7c28f47a2caf85c21d7dd52cd223a7164619e37a6a6f63f\" +\n\t\t\"fff7f2004000000010200000000010100000000000000000000000000000000000000000000\" +\n\t\t\"00000000000000000000ffffffff025400ffffffff0200f2052a01000000160014a157c74b4\" +\n\t\t\"42a3e11b45cf5273f8c0c032c5a40ed0000000000000000266a24aa21a9ede2f61c3f71d1de\" +\n\t\t\"fd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000\" +\n\t\t\"000000000000000000000000000000000000000000000000000\"\n\n\t// block2aHex is a block that builds on top of block1Hex.\n\t// Has blockhash of \"5181a4e34cc23ed95c69749dedf4cc7ebd659243bc1683372f8940c8cd8f9b68\".\n\tblock2aHex := \"00000020e5cd0eed3121abeea4d5ecd9ca792b2bcf3ae1e4957930f689058c7e2456c\" +\n\t\t\"036f7d4ebe524260c9b6c2b5e3d105cad0b7ddfaeaa29971363574fc1921a3f2f7ad66b6f63\" +\n\t\t\"ffff7f200100000001020000000001010000000000000000000000000000000000000000000\" +\n\t\t\"000000000000000000000ffffffff025200ffffffff0200f2052a0100000016001466fca22d\" +\n\t\t\"0e4679d119ea1e127c984746a1f7e66c0000000000000000266a24aa21a9ede2f61c3f71d1d\" +\n\t\t\"efd3fa999dfa36953755c690689799962b48bebd836974e8cf9012000000000000000000000\" +\n\t\t\"0000000000000000000000000000000000000000000000000000\"\n\n\t// block3aHex is a block that builds on top of block2aHex.\n\t// Has blockhash of \"0b0216936d1a5c01362256d06a9c9a2b13768fa2f2748549a71008af36dd167f\".\n\tblock3aHex := \"00000020689b8fcdc840892f378316bc439265bd7eccf4ed9d74695cd93ec24ce3a48\" +\n\t\t\"15161a430ce5cae955b1254b753bc95854d942947855d3ae59002de9773b7fe65fdf16b6f63\" +\n\t\t\"ffff7f200100000001020000000001010000000000000000000000000000000000000000000\" +\n\t\t\"000000000000000000000ffffffff025300ffffffff0200f2052a0100000016001471da0afb\" +\n\t\t\"883c228b18af6bd0cabc471aebe8d1750000000000000000266a24aa21a9ede2f61c3f71d1d\" +\n\t\t\"efd3fa999dfa36953755c690689799962b48bebd836974e8cf9012000000000000000000000\" +\n\t\t\"0000000000000000000000000000000000000000000000000000\"\n\n\t// block4aHex is a block that builds on top of block3aHex.\n\t// Has blockhash of \"65a00a026eaa83f6e7a7f4a920faa090f3f9d3565a56df2362db2ab2fa14ccec\".\n\tblock4aHex := \"000000207f16dd36af0810a7498574f2a28f76132b9a9c6ad0562236015c1a6d93160\" +\n\t\t\"20b951fa5ee5072d88d6aef9601999307dbd8d96dad067b80bfe04afe81c7a8c21beb706f63\" +\n\t\t\"ffff7f200000000001020000000001010000000000000000000000000000000000000000000\" +\n\t\t\"000000000000000000000ffffffff025400ffffffff0200f2052a01000000160014fd1f118c\" +\n\t\t\"95a712b8adef11c3cc0643bcb6b709f10000000000000000266a24aa21a9ede2f61c3f71d1d\" +\n\t\t\"efd3fa999dfa36953755c690689799962b48bebd836974e8cf9012000000000000000000000\" +\n\t\t\"0000000000000000000000000000000000000000000000000000\"\n\n\t// block5aHex is a block that builds on top of block4aHex.\n\t// Has blockhash of \"5c8814bc034a4c37fa5ccdc05e09b45a771bd7505d68092f21869a912737ee10\".\n\tblock5aHex := \"00000020eccc14fab22adb6223df565a56d3f9f390a0fa20a9f4a7e7f683aa6e020aa\" +\n\t\t\"0656331bd4fcd3db611de7fbf72ef3dff0b85b244b5a983d5c0270e728214f67f9aaa766f63\" +\n\t\t\"ffff7f200600000001020000000001010000000000000000000000000000000000000000000\" +\n\t\t\"000000000000000000000ffffffff025500ffffffff0200f2052a0100000016001438335896\" +\n\t\t\"ad1d087e3541436a5b293c0d23ad27e60000000000000000266a24aa21a9ede2f61c3f71d1d\" +\n\t\t\"efd3fa999dfa36953755c690689799962b48bebd836974e8cf9012000000000000000000000\" +\n\t\t\"0000000000000000000000000000000000000000000000000000\"\n\n\t// block4bHex is a block that builds on top of block3aHex.\n\t// Has blockhash of \"130458e795cc46f2759195e92737426fb0ada2a07f98434551ffb7500b23c161\".\n\tblock4bHex := \"000000207f16dd36af0810a7498574f2a28f76132b9a9c6ad0562236015c1a6d93160\" +\n\t\t\"20b14f9ce93d0144c383fea72f408b06b268a1523a029b825a1edfa15b367f6db2cfd7d6f63\" +\n\t\t\"ffff7f200200000001020000000001010000000000000000000000000000000000000000000\" +\n\t\t\"000000000000000000000ffffffff025400ffffffff0200f2052a0100000016001405b5ba2d\" +\n\t\t\"1e549c4c84a623de3575948d3ef8a27f0000000000000000266a24aa21a9ede2f61c3f71d1d\" +\n\t\t\"efd3fa999dfa36953755c690689799962b48bebd836974e8cf9012000000000000000000000\" +\n\t\t\"0000000000000000000000000000000000000000000000000000\"\n\n\t// Set up regtest chain.\n\tr, err := rpctest.New(&chaincfg.RegressionNetParams, nil, nil, \"\")\n\tif err != nil {\n\t\tt.Fatal(\"TestGetChainTips fail. Unable to create primary harness: \", err)\n\t}\n\tif err := r.SetUp(true, 0); err != nil {\n\t\tt.Fatalf(\"TestGetChainTips fail. Unable to setup test chain: %v\", err)\n\t}\n\tdefer r.TearDown()\n\n\t// Immediately call getchaintips after setting up regtest.\n\tgotChainTips, err := r.Client.GetChainTips()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\t// We expect a single genesis block.\n\texpectedChainTips := []*btcjson.GetChainTipsResult{\n\t\t{\n\t\t\tHeight:    0,\n\t\t\tHash:      chaincfg.RegressionNetParams.GenesisHash.String(),\n\t\t\tBranchLen: 0,\n\t\t\tStatus:    \"active\",\n\t\t},\n\t}\n\terr = compareMultipleChainTips(t, gotChainTips, expectedChainTips)\n\tif err != nil {\n\t\tt.Fatalf(\"TestGetChainTips fail. Error: %v\", err)\n\t}\n\n\t// Submit 4 blocks.\n\t//\n\t// Our chain view looks like so:\n\t// (genesis block) -> 1 -> 2 -> 3 -> 4\n\tblockStrings := []string{block1Hex, block2Hex, block3Hex, block4Hex}\n\tfor _, blockString := range blockStrings {\n\t\tblock := getBlockFromString(t, blockString)\n\t\terr = r.Client.SubmitBlock(block, nil)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}\n\n\tgotChainTips, err = r.Client.GetChainTips()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\texpectedChainTips = []*btcjson.GetChainTipsResult{\n\t\t{\n\t\t\tHeight:    4,\n\t\t\tHash:      getBlockFromString(t, blockStrings[len(blockStrings)-1]).Hash().String(),\n\t\t\tBranchLen: 0,\n\t\t\tStatus:    \"active\",\n\t\t},\n\t}\n\terr = compareMultipleChainTips(t, gotChainTips, expectedChainTips)\n\tif err != nil {\n\t\tt.Fatalf(\"TestGetChainTips fail. Error: %v\", err)\n\t}\n\n\t// Submit 2 blocks that don't build on top of the current active tip.\n\t//\n\t// Our chain view looks like so:\n\t// (genesis block) -> 1 -> 2  -> 3  -> 4  (active)\n\t//                    \\ -> 2a -> 3a       (valid-fork)\n\tblockStrings = []string{block2aHex, block3aHex}\n\tfor _, blockString := range blockStrings {\n\t\tblock := getBlockFromString(t, blockString)\n\t\terr = r.Client.SubmitBlock(block, nil)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}\n\n\tgotChainTips, err = r.Client.GetChainTips()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\texpectedChainTips = []*btcjson.GetChainTipsResult{\n\t\t{\n\t\t\tHeight:    4,\n\t\t\tHash:      getBlockFromString(t, block4Hex).Hash().String(),\n\t\t\tBranchLen: 0,\n\t\t\tStatus:    \"active\",\n\t\t},\n\t\t{\n\t\t\tHeight:    3,\n\t\t\tHash:      getBlockFromString(t, block3aHex).Hash().String(),\n\t\t\tBranchLen: 2,\n\t\t\tStatus:    \"valid-fork\",\n\t\t},\n\t}\n\terr = compareMultipleChainTips(t, gotChainTips, expectedChainTips)\n\tif err != nil {\n\t\tt.Fatalf(\"TestGetChainTips fail. Error: %v\", err)\n\t}\n\n\t// Submit a single block that don't build on top of the current active tip.\n\t//\n\t// Our chain view looks like so:\n\t// (genesis block) -> 1 -> 2  -> 3  -> 4   (active)\n\t//                    \\ -> 2a -> 3a -> 4a  (valid-fork)\n\tblock := getBlockFromString(t, block4aHex)\n\terr = r.Client.SubmitBlock(block, nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tgotChainTips, err = r.Client.GetChainTips()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\texpectedChainTips = []*btcjson.GetChainTipsResult{\n\t\t{\n\t\t\tHeight:    4,\n\t\t\tHash:      getBlockFromString(t, block4Hex).Hash().String(),\n\t\t\tBranchLen: 0,\n\t\t\tStatus:    \"active\",\n\t\t},\n\t\t{\n\t\t\tHeight:    4,\n\t\t\tHash:      getBlockFromString(t, block4aHex).Hash().String(),\n\t\t\tBranchLen: 3,\n\t\t\tStatus:    \"valid-fork\",\n\t\t},\n\t}\n\terr = compareMultipleChainTips(t, gotChainTips, expectedChainTips)\n\tif err != nil {\n\t\tt.Fatalf(\"TestGetChainTips fail. Error: %v\", err)\n\t}\n\n\t// Submit a single block that changes the active branch to 5a.\n\t//\n\t// Our chain view looks like so:\n\t// (genesis block) -> 1 -> 2  -> 3  -> 4         (valid-fork)\n\t//                    \\ -> 2a -> 3a -> 4a -> 5a  (active)\n\tblock = getBlockFromString(t, block5aHex)\n\terr = r.Client.SubmitBlock(block, nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tgotChainTips, err = r.Client.GetChainTips()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\texpectedChainTips = []*btcjson.GetChainTipsResult{\n\t\t{\n\t\t\tHeight:    4,\n\t\t\tHash:      getBlockFromString(t, block4Hex).Hash().String(),\n\t\t\tBranchLen: 3,\n\t\t\tStatus:    \"valid-fork\",\n\t\t},\n\t\t{\n\t\t\tHeight:    5,\n\t\t\tHash:      getBlockFromString(t, block5aHex).Hash().String(),\n\t\t\tBranchLen: 0,\n\t\t\tStatus:    \"active\",\n\t\t},\n\t}\n\terr = compareMultipleChainTips(t, gotChainTips, expectedChainTips)\n\tif err != nil {\n\t\tt.Fatalf(\"TestGetChainTips fail. Error: %v\", err)\n\t}\n\n\t// Submit a single block that builds on top of 3a.\n\t//\n\t// Our chain view looks like so:\n\t// (genesis block) -> 1 -> 2  -> 3  -> 4         (valid-fork)\n\t//                    \\ -> 2a -> 3a -> 4a -> 5a  (active)\n\t//                                \\ -> 4b        (valid-fork)\n\tblock = getBlockFromString(t, block4bHex)\n\terr = r.Client.SubmitBlock(block, nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tgotChainTips, err = r.Client.GetChainTips()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\texpectedChainTips = []*btcjson.GetChainTipsResult{\n\t\t{\n\t\t\tHeight:    4,\n\t\t\tHash:      getBlockFromString(t, block4Hex).Hash().String(),\n\t\t\tBranchLen: 3,\n\t\t\tStatus:    \"valid-fork\",\n\t\t},\n\t\t{\n\t\t\tHeight:    5,\n\t\t\tHash:      getBlockFromString(t, block5aHex).Hash().String(),\n\t\t\tBranchLen: 0,\n\t\t\tStatus:    \"active\",\n\t\t},\n\t\t{\n\t\t\tHeight:    4,\n\t\t\tHash:      getBlockFromString(t, block4bHex).Hash().String(),\n\t\t\tBranchLen: 1,\n\t\t\tStatus:    \"valid-fork\",\n\t\t},\n\t}\n\n\terr = compareMultipleChainTips(t, gotChainTips, expectedChainTips)\n\tif err != nil {\n\t\tt.Fatalf(\"TestGetChainTips fail. Error: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "integration/invalidate_reconsider_block_test.go",
    "content": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/integration/rpctest\"\n)\n\nfunc TestInvalidateAndReconsiderBlock(t *testing.T) {\n\t// Set up regtest chain.\n\tr, err := rpctest.New(&chaincfg.RegressionNetParams, nil, nil, \"\")\n\tif err != nil {\n\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail.\"+\n\t\t\t\"Unable to create primary harness: %v\", err)\n\t}\n\tif err := r.SetUp(true, 0); err != nil {\n\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. \"+\n\t\t\t\"Unable to setup test chain: %v\", err)\n\t}\n\tdefer r.TearDown()\n\n\t// Generate 4 blocks.\n\t//\n\t// Our chain view looks like so:\n\t// (genesis block) -> 1 -> 2 -> 3 -> 4\n\t_, err = r.Client.Generate(4)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Cache the active tip hash.\n\tblock4ActiveTipHash, err := r.Client.GetBestBlockHash()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Cache block 1 hash as this will be our chaintip after we invalidate block 2.\n\tblock1Hash, err := r.Client.GetBlockHash(1)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Invalidate block 2.\n\t//\n\t// Our chain view looks like so:\n\t// (genesis block) -> 1                 (active)\n\t//                    \\ -> 2 -> 3 -> 4  (invalid)\n\tblock2Hash, err := r.Client.GetBlockHash(2)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\terr = r.Client.InvalidateBlock(block2Hash)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Assert that block 1 is the active chaintip.\n\tbestHash, err := r.Client.GetBestBlockHash()\n\tif *bestHash != *block1Hash {\n\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. Expected the \"+\n\t\t\t\"best block hash to be block 1 with hash %s but got %s\",\n\t\t\tblock1Hash.String(), bestHash.String())\n\t}\n\n\t// Generate 2 blocks.\n\t//\n\t// Our chain view looks like so:\n\t// (genesis block) -> 1 -> 2a -> 3a      (active)\n\t//                    \\ -> 2  -> 3  -> 4 (invalid)\n\t_, err = r.Client.Generate(2)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Cache the active tip hash for the current active tip.\n\tblock3aActiveTipHash, err := r.Client.GetBestBlockHash()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttips, err := r.Client.GetChainTips()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Assert that there are two branches.\n\tif len(tips) != 2 {\n\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. \"+\n\t\t\t\"Expected 2 chaintips but got %d\", len(tips))\n\t}\n\n\tfor _, tip := range tips {\n\t\tif tip.Hash == block4ActiveTipHash.String() &&\n\t\t\ttip.Status != \"invalid\" {\n\t\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. Expected \"+\n\t\t\t\t\"invalidated branch tip of %s to be invalid but got %s\",\n\t\t\t\ttip.Hash, tip.Status)\n\t\t}\n\t}\n\n\t// Reconsider the invalidated block 2.\n\t//\n\t// Our chain view looks like so:\n\t// (genesis block) -> 1 -> 2a -> 3a       (valid-fork)\n\t//                    \\ -> 2  -> 3  -> 4  (active)\n\terr = r.Client.ReconsiderBlock(block2Hash)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttips, err = r.Client.GetChainTips()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\t// Assert that there are two branches.\n\tif len(tips) != 2 {\n\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. \"+\n\t\t\t\"Expected 2 chaintips but got %d\", len(tips))\n\t}\n\n\tvar checkedTips int\n\tfor _, tip := range tips {\n\t\tif tip.Hash == block4ActiveTipHash.String() {\n\t\t\tif tip.Status != \"active\" {\n\t\t\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. Expected \"+\n\t\t\t\t\t\"the reconsidered branch tip of %s to be active but got %s\",\n\t\t\t\t\ttip.Hash, tip.Status)\n\t\t\t}\n\n\t\t\tcheckedTips++\n\t\t}\n\n\t\tif tip.Hash == block3aActiveTipHash.String() {\n\t\t\tif tip.Status != \"valid-fork\" {\n\t\t\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. Expected \"+\n\t\t\t\t\t\"invalidated branch tip of %s to be valid-fork but got %s\",\n\t\t\t\t\ttip.Hash, tip.Status)\n\t\t\t}\n\t\t\tcheckedTips++\n\t\t}\n\t}\n\n\tif checkedTips != 2 {\n\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. \"+\n\t\t\t\"Expected to check %d chaintips, checked %d\", 2, checkedTips)\n\t}\n\n\t// Invalidate block 3a.\n\t//\n\t// Our chain view looks like so:\n\t// (genesis block) -> 1 -> 2a -> 3a       (invalid)\n\t//                    \\ -> 2  -> 3  -> 4  (active)\n\terr = r.Client.InvalidateBlock(block3aActiveTipHash)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttips, err = r.Client.GetChainTips()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Assert that there are two branches.\n\tif len(tips) != 2 {\n\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. \"+\n\t\t\t\"Expected 2 chaintips but got %d\", len(tips))\n\t}\n\n\tcheckedTips = 0\n\tfor _, tip := range tips {\n\t\tif tip.Hash == block4ActiveTipHash.String() {\n\t\t\tif tip.Status != \"active\" {\n\t\t\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. Expected \"+\n\t\t\t\t\t\"an active branch tip of %s but got %s\",\n\t\t\t\t\ttip.Hash, tip.Status)\n\t\t\t}\n\n\t\t\tcheckedTips++\n\t\t}\n\n\t\tif tip.Hash == block3aActiveTipHash.String() {\n\t\t\tif tip.Status != \"invalid\" {\n\t\t\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. Expected \"+\n\t\t\t\t\t\"the invalidated tip of %s to be invalid but got %s\",\n\t\t\t\t\ttip.Hash, tip.Status)\n\t\t\t}\n\t\t\tcheckedTips++\n\t\t}\n\t}\n\n\tif checkedTips != 2 {\n\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. \"+\n\t\t\t\"Expected to check %d chaintips, checked %d\", 2, checkedTips)\n\t}\n\n\t// Reconsider block 3a.\n\t//\n\t// Our chain view looks like so:\n\t// (genesis block) -> 1 -> 2a -> 3a       (valid-fork)\n\t//                    \\ -> 2  -> 3  -> 4  (active)\n\terr = r.Client.ReconsiderBlock(block3aActiveTipHash)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttips, err = r.Client.GetChainTips()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Assert that there are two branches.\n\tif len(tips) != 2 {\n\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. \"+\n\t\t\t\"Expected 2 chaintips but got %d\", len(tips))\n\t}\n\n\tcheckedTips = 0\n\tfor _, tip := range tips {\n\t\tif tip.Hash == block4ActiveTipHash.String() {\n\t\t\tif tip.Status != \"active\" {\n\t\t\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. Expected \"+\n\t\t\t\t\t\"an active branch tip of %s but got %s\",\n\t\t\t\t\ttip.Hash, tip.Status)\n\t\t\t}\n\n\t\t\tcheckedTips++\n\t\t}\n\n\t\tif tip.Hash == block3aActiveTipHash.String() {\n\t\t\tif tip.Status != \"valid-fork\" {\n\t\t\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. Expected \"+\n\t\t\t\t\t\"the reconsidered tip of %s to be a valid-fork but got %s\",\n\t\t\t\t\ttip.Hash, tip.Status)\n\t\t\t}\n\t\t\tcheckedTips++\n\t\t}\n\t}\n\n\tif checkedTips != 2 {\n\t\tt.Fatalf(\"TestInvalidateAndReconsiderBlock fail. \"+\n\t\t\t\"Expected to check %d chaintips, checked %d\", 2, checkedTips)\n\t}\n}\n"
  },
  {
    "path": "integration/log.go",
    "content": "//go:build rpctest\n// +build rpctest\n\npackage integration\n\nimport (\n\t\"os\"\n\n\t\"github.com/btcsuite/btcd/rpcclient\"\n\t\"github.com/btcsuite/btclog\"\n)\n\ntype logWriter struct{}\n\nfunc (logWriter) Write(p []byte) (n int, err error) {\n\tos.Stdout.Write(p)\n\treturn len(p), nil\n}\n\nfunc init() {\n\tbackendLog := btclog.NewBackend(logWriter{})\n\ttestLog := backendLog.Logger(\"ITEST\")\n\ttestLog.SetLevel(btclog.LevelDebug)\n\n\trpcclient.UseLogger(testLog)\n}\n"
  },
  {
    "path": "integration/main.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage integration\n\n// This file only exists to prevent warnings due to no buildable source files\n// when the build tag for enabling the tests is not specified.\n"
  },
  {
    "path": "integration/prune_test.go",
    "content": "// Copyright (c) 2023 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// This file is ignored during the regular tests due to the following build tag.\n//go:build rpctest\n// +build rpctest\n\npackage integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/integration/rpctest\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestPrune(t *testing.T) {\n\tt.Parallel()\n\n\t// Boilerplate code to make a pruned node.\n\tbtcdCfg := []string{\"--prune=1536\"}\n\tr, err := rpctest.New(&chaincfg.SimNetParams, nil, btcdCfg, \"\")\n\trequire.NoError(t, err)\n\n\tif err := r.SetUp(false, 0); err != nil {\n\t\trequire.NoError(t, err)\n\t}\n\tt.Cleanup(func() { r.TearDown() })\n\n\t// Check that the rpc call for block chain info comes back correctly.\n\tchainInfo, err := r.Client.GetBlockChainInfo()\n\trequire.NoError(t, err)\n\n\tif !chainInfo.Pruned {\n\t\tt.Fatalf(\"expected the node to be pruned but the pruned \"+\n\t\t\t\"boolean was %v\", chainInfo.Pruned)\n\t}\n}\n"
  },
  {
    "path": "integration/rawtx_test.go",
    "content": "//go:build rpctest\n// +build rpctest\n\npackage integration\n\nimport (\n\t\"encoding/hex\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/integration/rpctest\"\n\t\"github.com/btcsuite/btcd/rpcclient\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestTestMempoolAccept checks that `TestTestMempoolAccept` behaves as\n// expected. It checks that,\n// - an error is returned when invalid params are used.\n// - orphan tx is rejected.\n// - fee rate above the max is rejected.\n// - a mixed of both allowed and rejected can be returned in the same response.\nfunc TestTestMempoolAccept(t *testing.T) {\n\tt.Parallel()\n\n\t// Boilerplate codetestDir to make a pruned node.\n\tbtcdCfg := []string{\"--rejectnonstd\", \"--debuglevel=debug\"}\n\tr, err := rpctest.New(&chaincfg.SimNetParams, nil, btcdCfg, \"\")\n\trequire.NoError(t, err)\n\n\t// Setup the node.\n\trequire.NoError(t, r.SetUp(true, 100))\n\tt.Cleanup(func() {\n\t\trequire.NoError(t, r.TearDown())\n\t})\n\n\t// Create testing txns.\n\tinvalidTx := decodeHex(t, missingParentsHex)\n\tvalidTx := createTestTx(t, r)\n\n\t// Create testing constants.\n\tconst feeRate = 10\n\n\ttestCases := []struct {\n\t\tname           string\n\t\ttxns           []*wire.MsgTx\n\t\tmaxFeeRate     float64\n\t\texpectedErr    error\n\t\texpectedResult []*btcjson.TestMempoolAcceptResult\n\t}{\n\t\t{\n\t\t\t// When too many txns are provided, the method should\n\t\t\t// return an error.\n\t\t\tname:           \"too many txns\",\n\t\t\ttxns:           make([]*wire.MsgTx, 26),\n\t\t\tmaxFeeRate:     0,\n\t\t\texpectedErr:    rpcclient.ErrInvalidParam,\n\t\t\texpectedResult: nil,\n\t\t},\n\t\t{\n\t\t\t// When no txns are provided, the method should return\n\t\t\t// an error.\n\t\t\tname:           \"empty txns\",\n\t\t\ttxns:           nil,\n\t\t\tmaxFeeRate:     0,\n\t\t\texpectedErr:    rpcclient.ErrInvalidParam,\n\t\t\texpectedResult: nil,\n\t\t},\n\t\t{\n\t\t\t// When a corrupted txn is provided, the method should\n\t\t\t// return an error.\n\t\t\tname:           \"corrupted tx\",\n\t\t\ttxns:           []*wire.MsgTx{{}},\n\t\t\tmaxFeeRate:     0,\n\t\t\texpectedErr:    rpcclient.ErrInvalidParam,\n\t\t\texpectedResult: nil,\n\t\t},\n\t\t{\n\t\t\t// When an orphan tx is provided, the method should\n\t\t\t// return a test mempool accept result which says this\n\t\t\t// tx is not allowed.\n\t\t\tname:       \"orphan tx\",\n\t\t\ttxns:       []*wire.MsgTx{invalidTx},\n\t\t\tmaxFeeRate: 0,\n\t\t\texpectedResult: []*btcjson.TestMempoolAcceptResult{{\n\t\t\t\tTxid:         invalidTx.TxHash().String(),\n\t\t\t\tWtxid:        invalidTx.TxHash().String(),\n\t\t\t\tAllowed:      false,\n\t\t\t\tRejectReason: \"missing-inputs\",\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\t// When a valid tx is provided but it exceeds the max\n\t\t\t// fee rate, the method should return a test mempool\n\t\t\t// accept result which says it's not allowed.\n\t\t\tname:       \"valid tx but exceeds max fee rate\",\n\t\t\ttxns:       []*wire.MsgTx{validTx},\n\t\t\tmaxFeeRate: 1e-5,\n\t\t\texpectedResult: []*btcjson.TestMempoolAcceptResult{{\n\t\t\t\tTxid:         validTx.TxHash().String(),\n\t\t\t\tWtxid:        validTx.TxHash().String(),\n\t\t\t\tAllowed:      false,\n\t\t\t\tRejectReason: \"max-fee-exceeded\",\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\t// When a valid tx is provided and it doesn't exceeds\n\t\t\t// the max fee rate, the method should return a test\n\t\t\t// mempool accept result which says it's allowed.\n\t\t\tname: \"valid tx and sane fee rate\",\n\t\t\ttxns: []*wire.MsgTx{validTx},\n\t\t\texpectedResult: []*btcjson.TestMempoolAcceptResult{{\n\t\t\t\tTxid:    validTx.TxHash().String(),\n\t\t\t\tWtxid:   validTx.TxHash().String(),\n\t\t\t\tAllowed: true,\n\t\t\t\t// TODO(yy): need to calculate the fees, atm\n\t\t\t\t// there's no easy way.\n\t\t\t\t// Fees: &btcjson.TestMempoolAcceptFees{},\n\t\t\t}},\n\t\t},\n\t\t{\n\t\t\t// When multiple txns are provided, the method should\n\t\t\t// return the correct results for each of the txns.\n\t\t\tname: \"multiple txns\",\n\t\t\ttxns: []*wire.MsgTx{invalidTx, validTx},\n\t\t\texpectedResult: []*btcjson.TestMempoolAcceptResult{{\n\t\t\t\tTxid:         invalidTx.TxHash().String(),\n\t\t\t\tWtxid:        invalidTx.TxHash().String(),\n\t\t\t\tAllowed:      false,\n\t\t\t\tRejectReason: \"missing-inputs\",\n\t\t\t}, {\n\t\t\t\tTxid:    validTx.TxHash().String(),\n\t\t\t\tWtxid:   validTx.TxHash().String(),\n\t\t\t\tAllowed: true,\n\t\t\t}},\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\trequire := require.New(t)\n\n\t\t\tresults, err := r.Client.TestMempoolAccept(\n\t\t\t\ttc.txns, tc.maxFeeRate,\n\t\t\t)\n\n\t\t\trequire.ErrorIs(err, tc.expectedErr)\n\t\t\trequire.Len(results, len(tc.expectedResult))\n\n\t\t\t// Check each item is returned as expected.\n\t\t\tfor i, r := range results {\n\t\t\t\texpected := tc.expectedResult[i]\n\n\t\t\t\t// TODO(yy): check all the fields?\n\t\t\t\trequire.Equal(expected.Txid, r.Txid)\n\t\t\t\trequire.Equal(expected.Wtxid, r.Wtxid)\n\t\t\t\trequire.Equal(expected.Allowed, r.Allowed)\n\t\t\t\trequire.Equal(expected.RejectReason,\n\t\t\t\t\tr.RejectReason)\n\t\t\t}\n\t\t})\n\t}\n}\n\nvar (\n\t//nolint:lll\n\tmissingParentsHex = \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff2000000001c75619cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4900000000cff75994dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b07010000003c029216047236f3000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8784d7ee4b\"\n)\n\n// createTestTx creates a `wire.MsgTx` and asserts its creation.\nfunc createTestTx(t *testing.T, h *rpctest.Harness) *wire.MsgTx {\n\taddr, err := h.NewAddress()\n\trequire.NoError(t, err)\n\n\tscript, err := txscript.PayToAddrScript(addr)\n\trequire.NoError(t, err)\n\n\toutput := &wire.TxOut{\n\t\tPkScript: script,\n\t\tValue:    1e6,\n\t}\n\n\ttx, err := h.CreateTransaction([]*wire.TxOut{output}, 10, true)\n\trequire.NoError(t, err)\n\n\treturn tx\n}\n\n// decodeHex takes a tx hexstring and asserts it can be decoded into a\n// `wire.MsgTx`.\nfunc decodeHex(t *testing.T, txHex string) *wire.MsgTx {\n\tserializedTx, err := hex.DecodeString(txHex)\n\trequire.NoError(t, err)\n\n\ttx, err := btcutil.NewTxFromBytes(serializedTx)\n\trequire.NoError(t, err)\n\n\treturn tx.MsgTx()\n}\n"
  },
  {
    "path": "integration/rpcserver_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// This file is ignored during the regular tests due to the following build tag.\n//go:build rpctest\n// +build rpctest\n\npackage integration\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"runtime/debug\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/integration/rpctest\"\n\t\"github.com/btcsuite/btcd/rpcclient\"\n)\n\nfunc testGetBestBlock(r *rpctest.Harness, t *testing.T) {\n\t_, prevbestHeight, err := r.Client.GetBestBlock()\n\tif err != nil {\n\t\tt.Fatalf(\"Call to `getbestblock` failed: %v\", err)\n\t}\n\n\t// Create a new block connecting to the current tip.\n\tgeneratedBlockHashes, err := r.Client.Generate(1)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to generate block: %v\", err)\n\t}\n\n\tbestHash, bestHeight, err := r.Client.GetBestBlock()\n\tif err != nil {\n\t\tt.Fatalf(\"Call to `getbestblock` failed: %v\", err)\n\t}\n\n\t// Hash should be the same as the newly submitted block.\n\tif !bytes.Equal(bestHash[:], generatedBlockHashes[0][:]) {\n\t\tt.Fatalf(\"Block hashes do not match. Returned hash %v, wanted \"+\n\t\t\t\"hash %v\", bestHash, generatedBlockHashes[0][:])\n\t}\n\n\t// Block height should now reflect newest height.\n\tif bestHeight != prevbestHeight+1 {\n\t\tt.Fatalf(\"Block heights do not match. Got %v, wanted %v\",\n\t\t\tbestHeight, prevbestHeight+1)\n\t}\n}\n\nfunc testGetBlockCount(r *rpctest.Harness, t *testing.T) {\n\t// Save the current count.\n\tcurrentCount, err := r.Client.GetBlockCount()\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to get block count: %v\", err)\n\t}\n\n\tif _, err := r.Client.Generate(1); err != nil {\n\t\tt.Fatalf(\"Unable to generate block: %v\", err)\n\t}\n\n\t// Count should have increased by one.\n\tnewCount, err := r.Client.GetBlockCount()\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to get block count: %v\", err)\n\t}\n\tif newCount != currentCount+1 {\n\t\tt.Fatalf(\"Block count incorrect. Got %v should be %v\",\n\t\t\tnewCount, currentCount+1)\n\t}\n}\n\nfunc testGetBlockHash(r *rpctest.Harness, t *testing.T) {\n\t// Create a new block connecting to the current tip.\n\tgeneratedBlockHashes, err := r.Client.Generate(1)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to generate block: %v\", err)\n\t}\n\n\tinfo, err := r.Client.GetInfo()\n\tif err != nil {\n\t\tt.Fatalf(\"call to getinfo cailed: %v\", err)\n\t}\n\n\tblockHash, err := r.Client.GetBlockHash(int64(info.Blocks))\n\tif err != nil {\n\t\tt.Fatalf(\"Call to `getblockhash` failed: %v\", err)\n\t}\n\n\t// Block hashes should match newly created block.\n\tif !bytes.Equal(generatedBlockHashes[0][:], blockHash[:]) {\n\t\tt.Fatalf(\"Block hashes do not match. Returned hash %v, wanted \"+\n\t\t\t\"hash %v\", blockHash, generatedBlockHashes[0][:])\n\t}\n}\n\nfunc testBulkClient(r *rpctest.Harness, t *testing.T) {\n\t// Create a new block connecting to the current tip.\n\tgeneratedBlockHashes, err := r.Client.Generate(20)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to generate block: %v\", err)\n\t}\n\n\tvar futureBlockResults []rpcclient.FutureGetBlockResult\n\tfor _, hash := range generatedBlockHashes {\n\t\tfutureBlockResults = append(futureBlockResults, r.BatchClient.GetBlockAsync(hash))\n\t}\n\n\terr = r.BatchClient.Send()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tisKnownBlockHash := func(blockHash chainhash.Hash) bool {\n\t\tfor _, hash := range generatedBlockHashes {\n\t\t\tif blockHash.IsEqual(hash) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\tfor _, block := range futureBlockResults {\n\t\tmsgBlock, err := block.Receive()\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tblockHash := msgBlock.Header.BlockHash()\n\t\tif !isKnownBlockHash(blockHash) {\n\t\t\tt.Fatalf(\"expected hash %s  to be in generated hash list\", blockHash)\n\t\t}\n\t}\n\n}\n\nfunc calculateHashesPerSecBetweenBlockHeights(r *rpctest.Harness, t *testing.T, startHeight, endHeight int64) float64 {\n\tvar totalWork int64 = 0\n\tvar minTimestamp, maxTimestamp time.Time\n\n\tfor curHeight := startHeight; curHeight <= endHeight; curHeight++ {\n\t\thash, err := r.Client.GetBlockHash(curHeight)\n\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tblockHeader, err := r.Client.GetBlockHeader(hash)\n\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif curHeight == startHeight {\n\t\t\tminTimestamp = blockHeader.Timestamp\n\t\t\tcontinue\n\t\t}\n\n\t\ttotalWork += blockchain.CalcWork(blockHeader.Bits).Int64()\n\n\t\tif curHeight == endHeight {\n\t\t\tmaxTimestamp = blockHeader.Timestamp\n\t\t}\n\t}\n\n\ttimeDiff := maxTimestamp.Sub(minTimestamp).Seconds()\n\n\tif timeDiff == 0 {\n\t\treturn 0\n\t}\n\n\treturn float64(totalWork) / timeDiff\n}\n\nfunc testGetNetworkHashPS(r *rpctest.Harness, t *testing.T) {\n\tnetworkHashPS, err := r.Client.GetNetworkHashPS()\n\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\texpectedNetworkHashPS := calculateHashesPerSecBetweenBlockHeights(r, t, 28, 148)\n\n\tif networkHashPS != expectedNetworkHashPS {\n\t\tt.Fatalf(\"Network hashes per second should be %f but received: %f\", expectedNetworkHashPS, networkHashPS)\n\t}\n}\n\nfunc testGetNetworkHashPS2(r *rpctest.Harness, t *testing.T) {\n\tnetworkHashPS2BlockTests := []struct {\n\t\tblocks              int\n\t\texpectedStartHeight int64\n\t\texpectedEndHeight   int64\n\t}{\n\t\t// Test receiving command for negative blocks\n\t\t{blocks: -200, expectedStartHeight: 0, expectedEndHeight: 148},\n\t\t// Test receiving command for 0 blocks\n\t\t{blocks: 0, expectedStartHeight: 0, expectedEndHeight: 148},\n\t\t// Test receiving command for less than total blocks -> expectedStartHeight = 148 - 100 = 48\n\t\t{blocks: 100, expectedStartHeight: 48, expectedEndHeight: 148},\n\t\t// Test receiving command for exact total blocks -> expectedStartHeight = 148 - 148 = 0\n\t\t{blocks: 148, expectedStartHeight: 0, expectedEndHeight: 148},\n\t\t// Test receiving command for greater than total blocks\n\t\t{blocks: 200, expectedStartHeight: 0, expectedEndHeight: 148},\n\t}\n\n\tfor _, networkHashPS2BlockTest := range networkHashPS2BlockTests {\n\t\tblocks := networkHashPS2BlockTest.blocks\n\t\texpectedStartHeight := networkHashPS2BlockTest.expectedStartHeight\n\t\texpectedEndHeight := networkHashPS2BlockTest.expectedEndHeight\n\n\t\tnetworkHashPS, err := r.Client.GetNetworkHashPS2(blocks)\n\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\texpectedNetworkHashPS := calculateHashesPerSecBetweenBlockHeights(r, t, expectedStartHeight, expectedEndHeight)\n\n\t\tif networkHashPS != expectedNetworkHashPS {\n\t\t\tt.Fatalf(\"Network hashes per second should be %f but received: %f\", expectedNetworkHashPS, networkHashPS)\n\t\t}\n\t}\n}\n\nfunc testGetNetworkHashPS3(r *rpctest.Harness, t *testing.T) {\n\tnetworkHashPS3BlockTests := []struct {\n\t\theight              int\n\t\tblocks              int\n\t\texpectedStartHeight int64\n\t\texpectedEndHeight   int64\n\t}{\n\t\t// Test receiving command for negative height -> expectedEndHeight force to 148\n\t\t// - And negative blocks -> expectedStartHeight = 148 - ((148 % 2016) + 1) =  -1 -> forced to 0\n\t\t{height: -200, blocks: -120, expectedStartHeight: 0, expectedEndHeight: 148},\n\t\t// - And zero blocks -> expectedStartHeight = 148 - ((148 % 2016) + 1) = -1 -> forced to 0\n\t\t{height: -200, blocks: 0, expectedStartHeight: 0, expectedEndHeight: 148},\n\t\t// - And positive blocks less than total blocks -> expectedStartHeight = 148 - 100 = 48\n\t\t{height: -200, blocks: 100, expectedStartHeight: 48, expectedEndHeight: 148},\n\t\t// - And positive blocks equal to total blocks\n\t\t{height: -200, blocks: 148, expectedStartHeight: 0, expectedEndHeight: 148},\n\t\t// - And positive blocks greater than total blocks\n\t\t{height: -200, blocks: 250, expectedStartHeight: 0, expectedEndHeight: 148},\n\n\t\t// Test receiving command for zero height\n\t\t// - Should return 0 similar to expected start height and expected end height both being 0\n\t\t// (blocks is irrelevant to output)\n\t\t{height: 0, blocks: 120, expectedStartHeight: 0, expectedEndHeight: 0},\n\n\t\t// Tests for valid block height -> expectedEndHeight set as height\n\t\t// - And negative blocks -> expectedStartHeight = 148 - ((148 % 2016) + 1) = -1 -> forced to 0\n\t\t{height: 100, blocks: -120, expectedStartHeight: 0, expectedEndHeight: 100},\n\t\t// - And zero blocks -> expectedStartHeight = 148 - ((148 % 2016) + 1) = -1 -> forced to 0\n\t\t{height: 100, blocks: 0, expectedStartHeight: 0, expectedEndHeight: 100},\n\t\t// - And positive blocks less than command blocks -> expectedStartHeight = 100 - 70 = 30\n\t\t{height: 100, blocks: 70, expectedStartHeight: 30, expectedEndHeight: 100},\n\t\t// - And positive blocks equal to command blocks -> expectedStartHeight = 100 - 100 = 0\n\t\t{height: 100, blocks: 100, expectedStartHeight: 0, expectedEndHeight: 100},\n\t\t// - And positive blocks greater than command blocks -> expectedStartHeight = 100 - 200 = -100 -> forced to 0\n\t\t{height: 100, blocks: 200, expectedStartHeight: 0, expectedEndHeight: 100},\n\n\t\t// Test receiving command for height greater than block height\n\t\t// - Should return 0 similar to expected start height and expected end height both being 0\n\t\t// (blocks is irrelevant to output)\n\t\t{height: 200, blocks: 120, expectedStartHeight: 0, expectedEndHeight: 0},\n\t}\n\n\tfor _, networkHashPS3BlockTest := range networkHashPS3BlockTests {\n\t\tblocks := networkHashPS3BlockTest.blocks\n\t\theight := networkHashPS3BlockTest.height\n\t\texpectedStartHeight := networkHashPS3BlockTest.expectedStartHeight\n\t\texpectedEndHeight := networkHashPS3BlockTest.expectedEndHeight\n\n\t\tnetworkHashPS, err := r.Client.GetNetworkHashPS3(blocks, height)\n\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\texpectedNetworkHashPS := calculateHashesPerSecBetweenBlockHeights(r, t, expectedStartHeight, expectedEndHeight)\n\n\t\tif networkHashPS != expectedNetworkHashPS {\n\t\t\tt.Fatalf(\"Network hashes per second should be %f but received: %f\", expectedNetworkHashPS, networkHashPS)\n\t\t}\n\t}\n}\n\nvar rpcTestCases = []rpctest.HarnessTestCase{\n\ttestGetBestBlock,\n\ttestGetBlockCount,\n\ttestGetBlockHash,\n\ttestBulkClient,\n\ttestGetNetworkHashPS,\n\ttestGetNetworkHashPS2,\n\ttestGetNetworkHashPS3,\n}\n\nvar primaryHarness *rpctest.Harness\n\nfunc TestMain(m *testing.M) {\n\tvar err error\n\n\t// In order to properly test scenarios on as if we were on mainnet,\n\t// ensure that non-standard transactions aren't accepted into the\n\t// mempool or relayed.\n\tbtcdCfg := []string{\"--rejectnonstd\"}\n\tprimaryHarness, err = rpctest.New(\n\t\t&chaincfg.SimNetParams, nil, btcdCfg, \"\",\n\t)\n\tif err != nil {\n\t\tfmt.Println(\"unable to create primary harness: \", err)\n\t\tos.Exit(1)\n\t}\n\n\t// Initialize the primary mining node with a chain of length 125,\n\t// providing 25 mature coinbases to allow spending from for testing\n\t// purposes.\n\tif err := primaryHarness.SetUp(true, 25); err != nil {\n\t\tfmt.Println(\"unable to setup test chain: \", err)\n\n\t\t// Even though the harness was not fully setup, it still needs\n\t\t// to be torn down to ensure all resources such as temp\n\t\t// directories are cleaned up.  The error is intentionally\n\t\t// ignored since this is already an error path and nothing else\n\t\t// could be done about it anyways.\n\t\t_ = primaryHarness.TearDown()\n\t\tos.Exit(1)\n\t}\n\n\texitCode := m.Run()\n\n\t// Clean up any active harnesses that are still currently running.This\n\t// includes removing all temporary directories, and shutting down any\n\t// created processes.\n\tif err := rpctest.TearDownAll(); err != nil {\n\t\tfmt.Println(\"unable to tear down all harnesses: \", err)\n\t\tos.Exit(1)\n\t}\n\n\tos.Exit(exitCode)\n}\n\nfunc TestRpcServer(t *testing.T) {\n\tvar currentTestNum int\n\tdefer func() {\n\t\t// If one of the integration tests caused a panic within the main\n\t\t// goroutine, then tear down all the harnesses in order to avoid\n\t\t// any leaked btcd processes.\n\t\tif r := recover(); r != nil {\n\t\t\tfmt.Println(\"recovering from test panic: \", r)\n\t\t\tif err := rpctest.TearDownAll(); err != nil {\n\t\t\t\tfmt.Println(\"unable to tear down all harnesses: \", err)\n\t\t\t}\n\t\t\tt.Fatalf(\"test #%v panicked: %s\", currentTestNum, debug.Stack())\n\t\t}\n\t}()\n\n\tfor _, testCase := range rpcTestCases {\n\t\ttestCase(primaryHarness, t)\n\n\t\tcurrentTestNum++\n\t}\n}\n"
  },
  {
    "path": "integration/rpctest/README.md",
    "content": "rpctest\n=======\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/integration/rpctest)\n\nPackage rpctest provides a btcd-specific RPC testing harness crafting and\nexecuting integration tests by driving a `btcd` instance via the `RPC`\ninterface. Each instance of an active harness comes equipped with a simple\nin-memory HD wallet capable of properly syncing to the generated chain,\ncreating new addresses, and crafting fully signed transactions paying to an\narbitrary set of outputs.\n\nThis package was designed specifically to act as an RPC testing harness for\n`btcd`. However, the constructs presented are general enough to be adapted to\nany project wishing to programmatically drive a `btcd` instance of its\nsystems/integration tests.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/integration/rpctest\n```\n\n## License\n\nPackage rpctest is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n\n"
  },
  {
    "path": "integration/rpctest/blockgen.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpctest\n\nimport (\n\t\"errors\"\n\t\"math\"\n\t\"math/big\"\n\t\"runtime\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/mining\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// solveBlock attempts to find a nonce which makes the passed block header hash\n// to a value less than the target difficulty. When a successful solution is\n// found true is returned and the nonce field of the passed header is updated\n// with the solution. False is returned if no solution exists.\nfunc solveBlock(header *wire.BlockHeader, targetDifficulty *big.Int) bool {\n\t// sbResult is used by the solver goroutines to send results.\n\ttype sbResult struct {\n\t\tfound bool\n\t\tnonce uint32\n\t}\n\n\t// solver accepts a block header and a nonce range to test. It is\n\t// intended to be run as a goroutine.\n\tquit := make(chan bool)\n\tresults := make(chan sbResult)\n\tsolver := func(hdr wire.BlockHeader, startNonce, stopNonce uint32) {\n\t\t// We need to modify the nonce field of the header, so make sure\n\t\t// we work with a copy of the original header.\n\t\tfor i := startNonce; i >= startNonce && i <= stopNonce; i++ {\n\t\t\tselect {\n\t\t\tcase <-quit:\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\thdr.Nonce = i\n\t\t\t\thash := hdr.BlockHash()\n\t\t\t\tif blockchain.HashToBig(&hash).Cmp(targetDifficulty) <= 0 {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase results <- sbResult{true, i}:\n\t\t\t\t\t\treturn\n\t\t\t\t\tcase <-quit:\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tselect {\n\t\tcase results <- sbResult{false, 0}:\n\t\tcase <-quit:\n\t\t\treturn\n\t\t}\n\t}\n\n\tstartNonce := uint32(0)\n\tstopNonce := uint32(math.MaxUint32)\n\tnumCores := uint32(runtime.NumCPU())\n\tnoncesPerCore := (stopNonce - startNonce) / numCores\n\tfor i := uint32(0); i < numCores; i++ {\n\t\trangeStart := startNonce + (noncesPerCore * i)\n\t\trangeStop := startNonce + (noncesPerCore * (i + 1)) - 1\n\t\tif i == numCores-1 {\n\t\t\trangeStop = stopNonce\n\t\t}\n\t\tgo solver(*header, rangeStart, rangeStop)\n\t}\n\tfor i := uint32(0); i < numCores; i++ {\n\t\tresult := <-results\n\t\tif result.found {\n\t\t\tclose(quit)\n\t\t\theader.Nonce = result.nonce\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// standardCoinbaseScript returns a standard script suitable for use as the\n// signature script of the coinbase transaction of a new block. In particular,\n// it starts with the block height that is required by version 2 blocks.\nfunc standardCoinbaseScript(nextBlockHeight int32, extraNonce uint64) ([]byte, error) {\n\treturn txscript.NewScriptBuilder().AddInt64(int64(nextBlockHeight)).\n\t\tAddInt64(int64(extraNonce)).Script()\n}\n\n// createCoinbaseTx returns a coinbase transaction paying an appropriate\n// subsidy based on the passed block height to the provided address.\nfunc createCoinbaseTx(coinbaseScript []byte, nextBlockHeight int32,\n\taddr btcutil.Address, mineTo []wire.TxOut,\n\tnet *chaincfg.Params) (*btcutil.Tx, error) {\n\n\t// Create the script to pay to the provided payment address.\n\tpkScript, err := txscript.PayToAddrScript(addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttx := wire.NewMsgTx(wire.TxVersion)\n\ttx.AddTxIn(&wire.TxIn{\n\t\t// Coinbase transactions have no inputs, so previous outpoint is\n\t\t// zero hash and max index.\n\t\tPreviousOutPoint: *wire.NewOutPoint(&chainhash.Hash{},\n\t\t\twire.MaxPrevOutIndex),\n\t\tSignatureScript: coinbaseScript,\n\t\tSequence:        wire.MaxTxInSequenceNum,\n\t})\n\tif len(mineTo) == 0 {\n\t\ttx.AddTxOut(&wire.TxOut{\n\t\t\tValue:    blockchain.CalcBlockSubsidy(nextBlockHeight, net),\n\t\t\tPkScript: pkScript,\n\t\t})\n\t} else {\n\t\tfor i := range mineTo {\n\t\t\ttx.AddTxOut(&mineTo[i])\n\t\t}\n\t}\n\treturn btcutil.NewTx(tx), nil\n}\n\n// CreateBlock creates a new block building from the previous block with a\n// specified blockversion and timestamp. If the timestamp passed is zero (not\n// initialized), then the timestamp of the previous block will be used plus 1\n// second is used. Passing nil for the previous block results in a block that\n// builds off of the genesis block for the specified chain.\nfunc CreateBlock(prevBlock *btcutil.Block, inclusionTxs []*btcutil.Tx,\n\tblockVersion int32, blockTime time.Time, miningAddr btcutil.Address,\n\tmineTo []wire.TxOut, net *chaincfg.Params) (*btcutil.Block, error) {\n\n\tvar (\n\t\tprevHash      *chainhash.Hash\n\t\tblockHeight   int32\n\t\tprevBlockTime time.Time\n\t)\n\n\t// If the previous block isn't specified, then we'll construct a block\n\t// that builds off of the genesis block for the chain.\n\tif prevBlock == nil {\n\t\tprevHash = net.GenesisHash\n\t\tblockHeight = 1\n\t\tprevBlockTime = net.GenesisBlock.Header.Timestamp.Add(time.Minute)\n\t} else {\n\t\tprevHash = prevBlock.Hash()\n\t\tblockHeight = prevBlock.Height() + 1\n\t\tprevBlockTime = prevBlock.MsgBlock().Header.Timestamp\n\t}\n\n\t// If a target block time was specified, then use that as the header's\n\t// timestamp. Otherwise, add one second to the previous block unless\n\t// it's the genesis block in which case use the current time.\n\tvar ts time.Time\n\tswitch {\n\tcase !blockTime.IsZero():\n\t\tts = blockTime\n\tdefault:\n\t\tts = prevBlockTime.Add(time.Second)\n\t}\n\n\textraNonce := uint64(0)\n\tcoinbaseScript, err := standardCoinbaseScript(blockHeight, extraNonce)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcoinbaseTx, err := createCoinbaseTx(coinbaseScript, blockHeight,\n\t\tminingAddr, mineTo, net)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Create a new block ready to be solved.\n\tblockTxns := []*btcutil.Tx{coinbaseTx}\n\tif inclusionTxs != nil {\n\t\tblockTxns = append(blockTxns, inclusionTxs...)\n\t}\n\n\t// We must add the witness commitment to the coinbase if any\n\t// transactions are segwit.\n\twitnessIncluded := false\n\tfor i := 1; i < len(blockTxns); i++ {\n\t\tif blockTxns[i].MsgTx().HasWitness() {\n\t\t\twitnessIncluded = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif witnessIncluded {\n\t\t_ = mining.AddWitnessCommitment(coinbaseTx, blockTxns)\n\t}\n\n\tmerkleRoot := blockchain.CalcMerkleRoot(blockTxns, false)\n\tvar block wire.MsgBlock\n\tblock.Header = wire.BlockHeader{\n\t\tVersion:    blockVersion,\n\t\tPrevBlock:  *prevHash,\n\t\tMerkleRoot: merkleRoot,\n\t\tTimestamp:  ts,\n\t\tBits:       net.PowLimitBits,\n\t}\n\tfor _, tx := range blockTxns {\n\t\tif err := block.AddTransaction(tx.MsgTx()); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tfound := solveBlock(&block.Header, net.PowLimit)\n\tif !found {\n\t\treturn nil, errors.New(\"Unable to solve block\")\n\t}\n\n\tutilBlock := btcutil.NewBlock(&block)\n\tutilBlock.SetHeight(blockHeight)\n\treturn utilBlock, nil\n}\n"
  },
  {
    "path": "integration/rpctest/btcd.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpctest\n\nimport (\n\t\"fmt\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sync\"\n)\n\nvar (\n\t// compileMtx guards access to the executable path so that the project is\n\t// only compiled once.\n\tcompileMtx sync.Mutex\n\n\t// executablePath is the path to the compiled executable. This is the empty\n\t// string until btcd is compiled. This should not be accessed directly;\n\t// instead use the function btcdExecutablePath().\n\texecutablePath string\n)\n\n// btcdExecutablePath returns a path to the btcd executable to be used by\n// rpctests. To ensure the code tests against the most up-to-date version of\n// btcd, this method compiles btcd the first time it is called. After that, the\n// generated binary is used for subsequent test harnesses. The executable file\n// is not cleaned up, but since it lives at a static path in a temp directory,\n// it is not a big deal.\nfunc btcdExecutablePath() (string, error) {\n\tcompileMtx.Lock()\n\tdefer compileMtx.Unlock()\n\n\t// If btcd has already been compiled, just use that.\n\tif len(executablePath) != 0 {\n\t\treturn executablePath, nil\n\t}\n\n\ttestDir, err := baseDir()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Build btcd and output an executable in a static temp path.\n\toutputPath := filepath.Join(testDir, \"btcd\")\n\tif runtime.GOOS == \"windows\" {\n\t\toutputPath += \".exe\"\n\t}\n\tcmd := exec.Command(\n\t\t\"go\", \"build\", \"-o\", outputPath, \"github.com/btcsuite/btcd\",\n\t)\n\terr = cmd.Run()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"Failed to build btcd: %v\", err)\n\t}\n\n\t// Save executable path so future calls do not recompile.\n\texecutablePath = outputPath\n\treturn executablePath, nil\n}\n"
  },
  {
    "path": "integration/rpctest/doc.go",
    "content": "// Package rpctest provides a btcd-specific RPC testing harness crafting and\n// executing integration tests by driving a `btcd` instance via the `RPC`\n// interface. Each instance of an active harness comes equipped with a simple\n// in-memory HD wallet capable of properly syncing to the generated chain,\n// creating new addresses, and crafting fully signed transactions paying to an\n// arbitrary set of outputs.\n//\n// This package was designed specifically to act as an RPC testing harness for\n// `btcd`. However, the constructs presented are general enough to be adapted to\n// any project wishing to programmatically drive a `btcd` instance of its\n// systems/integration tests.\npackage rpctest\n"
  },
  {
    "path": "integration/rpctest/memwallet.go",
    "content": "// Copyright (c) 2016-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpctest\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"maps\"\n\t\"sync\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/btcutil/hdkeychain\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/rpcclient\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nvar (\n\t// hdSeed is the BIP 32 seed used by the memWallet to initialize it's\n\t// HD root key. This value is hard coded in order to ensure\n\t// deterministic behavior across test runs.\n\thdSeed = [chainhash.HashSize]byte{\n\t\t0x79, 0xa6, 0x1a, 0xdb, 0xc6, 0xe5, 0xa2, 0xe1,\n\t\t0x39, 0xd2, 0x71, 0x3a, 0x54, 0x6e, 0xc7, 0xc8,\n\t\t0x75, 0x63, 0x2e, 0x75, 0xf1, 0xdf, 0x9c, 0x3f,\n\t\t0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t}\n)\n\n// utxo represents an unspent output spendable by the memWallet. The maturity\n// height of the transaction is recorded in order to properly observe the\n// maturity period of direct coinbase outputs.\ntype utxo struct {\n\tpkScript       []byte\n\tvalue          btcutil.Amount\n\tkeyIndex       uint32\n\tmaturityHeight int32\n\tisLocked       bool\n}\n\n// isMature returns true if the target utxo is considered \"mature\" at the\n// passed block height. Otherwise, false is returned.\nfunc (u *utxo) isMature(height int32) bool {\n\treturn height >= u.maturityHeight\n}\n\n// chainUpdate encapsulates an update to the current main chain. This struct is\n// used to sync up the memWallet each time a new block is connected to the main\n// chain.\ntype chainUpdate struct {\n\tblockHeight  int32\n\tfilteredTxns []*btcutil.Tx\n\tisConnect    bool // True if connect, false if disconnect\n}\n\n// undoEntry is functionally the opposite of a chainUpdate. An undoEntry is\n// created for each new block received, then stored in a log in order to\n// properly handle block re-orgs.\ntype undoEntry struct {\n\tutxosDestroyed map[wire.OutPoint]*utxo\n\tutxosCreated   []wire.OutPoint\n}\n\n// memWallet is a simple in-memory wallet whose purpose is to provide basic\n// wallet functionality to the harness. The wallet uses a hard-coded HD key\n// hierarchy which promotes reproducibility between harness test runs.\ntype memWallet struct {\n\tcoinbaseKey  *btcec.PrivateKey\n\tcoinbaseAddr btcutil.Address\n\n\t// hdRoot is the root master private key for the wallet.\n\thdRoot *hdkeychain.ExtendedKey\n\n\t// hdIndex is the next available key index offset from the hdRoot.\n\thdIndex uint32\n\n\t// currentHeight is the latest height the wallet is known to be synced\n\t// to.\n\tcurrentHeight int32\n\n\t// addrs tracks all addresses belonging to the wallet. The addresses\n\t// are indexed by their keypath from the hdRoot.\n\taddrs map[uint32]btcutil.Address\n\n\t// utxos is the set of utxos spendable by the wallet.\n\tutxos map[wire.OutPoint]*utxo\n\n\t// reorgJournal is a map storing an undo entry for each new block\n\t// received. Once a block is disconnected, the undo entry for the\n\t// particular height is evaluated, thereby rewinding the effect of the\n\t// disconnected block on the wallet's set of spendable utxos.\n\treorgJournal map[int32]*undoEntry\n\n\tchainUpdates      []*chainUpdate\n\tchainUpdateSignal chan struct{}\n\tchainMtx          sync.Mutex\n\n\tnet *chaincfg.Params\n\n\trpc *rpcclient.Client\n\n\tsync.RWMutex\n}\n\n// newMemWallet creates and returns a fully initialized instance of the\n// memWallet given a particular blockchain's parameters.\nfunc newMemWallet(net *chaincfg.Params, harnessID uint32) (*memWallet, error) {\n\t// The wallet's final HD seed is: hdSeed || harnessID. This method\n\t// ensures that each harness instance uses a deterministic root seed\n\t// based on its harness ID.\n\tvar harnessHDSeed [chainhash.HashSize + 4]byte\n\tcopy(harnessHDSeed[:], hdSeed[:])\n\tbinary.BigEndian.PutUint32(harnessHDSeed[:chainhash.HashSize], harnessID)\n\n\thdRoot, err := hdkeychain.NewMaster(harnessHDSeed[:], net)\n\tif err != nil {\n\t\treturn nil, nil\n\t}\n\n\t// The first child key from the hd root is reserved as the coinbase\n\t// generation address.\n\tcoinbaseChild, err := hdRoot.Derive(0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcoinbaseKey, err := coinbaseChild.ECPrivKey()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcoinbaseAddr, err := keyToAddr(coinbaseKey, net)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Track the coinbase generation address to ensure we properly track\n\t// newly generated bitcoin we can spend.\n\taddrs := make(map[uint32]btcutil.Address)\n\taddrs[0] = coinbaseAddr\n\n\treturn &memWallet{\n\t\tnet:               net,\n\t\tcoinbaseKey:       coinbaseKey,\n\t\tcoinbaseAddr:      coinbaseAddr,\n\t\thdIndex:           1,\n\t\thdRoot:            hdRoot,\n\t\taddrs:             addrs,\n\t\tutxos:             make(map[wire.OutPoint]*utxo),\n\t\tchainUpdateSignal: make(chan struct{}),\n\t\treorgJournal:      make(map[int32]*undoEntry),\n\t}, nil\n}\n\n// Start launches all goroutines required for the wallet to function properly.\nfunc (m *memWallet) Start() {\n\tgo m.chainSyncer()\n}\n\n// SyncedHeight returns the height the wallet is known to be synced to.\n//\n// This function is safe for concurrent access.\nfunc (m *memWallet) SyncedHeight() int32 {\n\tm.RLock()\n\tdefer m.RUnlock()\n\treturn m.currentHeight\n}\n\n// SetRPCClient saves the passed rpc connection to btcd as the wallet's\n// personal rpc connection.\nfunc (m *memWallet) SetRPCClient(rpcClient *rpcclient.Client) {\n\tm.rpc = rpcClient\n}\n\n// IngestBlock is a call-back which is to be triggered each time a new block is\n// connected to the main chain. It queues the update for the chain syncer,\n// calling the private version in sequential order.\nfunc (m *memWallet) IngestBlock(height int32, header *wire.BlockHeader, filteredTxns []*btcutil.Tx) {\n\t// Append this new chain update to the end of the queue of new chain\n\t// updates.\n\tm.chainMtx.Lock()\n\tm.chainUpdates = append(m.chainUpdates, &chainUpdate{height,\n\t\tfilteredTxns, true})\n\tm.chainMtx.Unlock()\n\n\t// Launch a goroutine to signal the chainSyncer that a new update is\n\t// available. We do this in a new goroutine in order to avoid blocking\n\t// the main loop of the rpc client.\n\tgo func() {\n\t\tm.chainUpdateSignal <- struct{}{}\n\t}()\n}\n\n// ingestBlock updates the wallet's internal utxo state based on the outputs\n// created and destroyed within each block.\nfunc (m *memWallet) ingestBlock(update *chainUpdate) {\n\t// Update the latest synced height, then process each filtered\n\t// transaction in the block creating and destroying utxos within\n\t// the wallet as a result.\n\tm.currentHeight = update.blockHeight\n\tundo := &undoEntry{\n\t\tutxosDestroyed: make(map[wire.OutPoint]*utxo),\n\t}\n\tfor _, tx := range update.filteredTxns {\n\t\tmtx := tx.MsgTx()\n\t\tisCoinbase := blockchain.IsCoinBaseTx(mtx)\n\t\ttxHash := mtx.TxHash()\n\t\tm.evalOutputs(mtx.TxOut, &txHash, isCoinbase, undo)\n\t\tm.evalInputs(mtx.TxIn, undo)\n\t}\n\n\t// Finally, record the undo entry for this block so we can\n\t// properly update our internal state in response to the block\n\t// being re-org'd from the main chain.\n\tm.reorgJournal[update.blockHeight] = undo\n}\n\n// chainSyncer is a goroutine dedicated to processing new blocks in order to\n// keep the wallet's utxo state up to date.\n//\n// NOTE: This MUST be run as a goroutine.\nfunc (m *memWallet) chainSyncer() {\n\tvar update *chainUpdate\n\n\tfor range m.chainUpdateSignal {\n\t\t// A new update is available, so pop the new chain update from\n\t\t// the front of the update queue.\n\t\tm.chainMtx.Lock()\n\t\tupdate = m.chainUpdates[0]\n\t\tm.chainUpdates[0] = nil // Set to nil to prevent GC leak.\n\t\tm.chainUpdates = m.chainUpdates[1:]\n\t\tm.chainMtx.Unlock()\n\n\t\tm.Lock()\n\t\tif update.isConnect {\n\t\t\tm.ingestBlock(update)\n\t\t} else {\n\t\t\tm.unwindBlock(update)\n\t\t}\n\t\tm.Unlock()\n\t}\n}\n\n// evalOutputs evaluates each of the passed outputs, creating a new matching\n// utxo within the wallet if we're able to spend the output.\nfunc (m *memWallet) evalOutputs(outputs []*wire.TxOut, txHash *chainhash.Hash,\n\tisCoinbase bool, undo *undoEntry) {\n\n\tfor i, output := range outputs {\n\t\tpkScript := output.PkScript\n\n\t\t// Scan all the addresses we currently control to see if the\n\t\t// output is paying to us.\n\t\tfor keyIndex, addr := range m.addrs {\n\t\t\tpkHash := addr.ScriptAddress()\n\t\t\tif !bytes.Contains(pkScript, pkHash) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// If this is a coinbase output, then we mark the\n\t\t\t// maturity height at the proper block height in the\n\t\t\t// future.\n\t\t\tvar maturityHeight int32\n\t\t\tif isCoinbase {\n\t\t\t\tmaturityHeight = m.currentHeight + int32(m.net.CoinbaseMaturity)\n\t\t\t}\n\n\t\t\top := wire.OutPoint{Hash: *txHash, Index: uint32(i)}\n\t\t\tm.utxos[op] = &utxo{\n\t\t\t\tvalue:          btcutil.Amount(output.Value),\n\t\t\t\tkeyIndex:       keyIndex,\n\t\t\t\tmaturityHeight: maturityHeight,\n\t\t\t\tpkScript:       pkScript,\n\t\t\t}\n\t\t\tundo.utxosCreated = append(undo.utxosCreated, op)\n\t\t}\n\t}\n}\n\n// evalInputs scans all the passed inputs, destroying any utxos within the\n// wallet which are spent by an input.\nfunc (m *memWallet) evalInputs(inputs []*wire.TxIn, undo *undoEntry) {\n\tfor _, txIn := range inputs {\n\t\top := txIn.PreviousOutPoint\n\t\toldUtxo, ok := m.utxos[op]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tundo.utxosDestroyed[op] = oldUtxo\n\t\tdelete(m.utxos, op)\n\t}\n}\n\n// UnwindBlock is a call-back which is to be executed each time a block is\n// disconnected from the main chain. It queues the update for the chain syncer,\n// calling the private version in sequential order.\nfunc (m *memWallet) UnwindBlock(height int32, header *wire.BlockHeader) {\n\t// Append this new chain update to the end of the queue of new chain\n\t// updates.\n\tm.chainMtx.Lock()\n\tm.chainUpdates = append(m.chainUpdates, &chainUpdate{height,\n\t\tnil, false})\n\tm.chainMtx.Unlock()\n\n\t// Launch a goroutine to signal the chainSyncer that a new update is\n\t// available. We do this in a new goroutine in order to avoid blocking\n\t// the main loop of the rpc client.\n\tgo func() {\n\t\tm.chainUpdateSignal <- struct{}{}\n\t}()\n}\n\n// unwindBlock undoes the effect that a particular block had on the wallet's\n// internal utxo state.\nfunc (m *memWallet) unwindBlock(update *chainUpdate) {\n\tundo := m.reorgJournal[update.blockHeight]\n\n\tfor _, utxo := range undo.utxosCreated {\n\t\tdelete(m.utxos, utxo)\n\t}\n\n\tmaps.Copy(m.utxos, undo.utxosDestroyed)\n\n\tdelete(m.reorgJournal, update.blockHeight)\n}\n\n// newAddress returns a new address from the wallet's hd key chain.  It also\n// loads the address into the RPC client's transaction filter to ensure any\n// transactions that involve it are delivered via the notifications.\nfunc (m *memWallet) newAddress() (btcutil.Address, error) {\n\tindex := m.hdIndex\n\n\tchildKey, err := m.hdRoot.Derive(index)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tprivKey, err := childKey.ECPrivKey()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\taddr, err := keyToAddr(privKey, m.net)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = m.rpc.LoadTxFilter(false, []btcutil.Address{addr}, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tm.addrs[index] = addr\n\n\tm.hdIndex++\n\n\treturn addr, nil\n}\n\n// NewAddress returns a fresh address spendable by the wallet.\n//\n// This function is safe for concurrent access.\nfunc (m *memWallet) NewAddress() (btcutil.Address, error) {\n\tm.Lock()\n\tdefer m.Unlock()\n\n\treturn m.newAddress()\n}\n\n// fundTx attempts to fund a transaction sending amt bitcoin. The coins are\n// selected such that the final amount spent pays enough fees as dictated by the\n// passed fee rate. The passed fee rate should be expressed in\n// satoshis-per-byte. The transaction being funded can optionally include a\n// change output indicated by the change boolean.\n//\n// NOTE: The memWallet's mutex must be held when this function is called.\nfunc (m *memWallet) fundTx(tx *wire.MsgTx, amt btcutil.Amount,\n\tfeeRate btcutil.Amount, change bool) error {\n\n\tconst (\n\t\t// spendSize is the largest number of bytes of a sigScript\n\t\t// which spends a p2pkh output: OP_DATA_73 <sig> OP_DATA_33 <pubkey>\n\t\tspendSize = 1 + 73 + 1 + 33\n\t)\n\n\tvar (\n\t\tamtSelected btcutil.Amount\n\t\ttxSize      int\n\t)\n\n\tfor outPoint, utxo := range m.utxos {\n\t\t// Skip any outputs that are still currently immature or are\n\t\t// currently locked.\n\t\tif !utxo.isMature(m.currentHeight) || utxo.isLocked {\n\t\t\tcontinue\n\t\t}\n\n\t\tamtSelected += utxo.value\n\n\t\t// Add the selected output to the transaction, updating the\n\t\t// current tx size while accounting for the size of the future\n\t\t// sigScript.\n\t\ttx.AddTxIn(wire.NewTxIn(&outPoint, nil, nil))\n\t\ttxSize = tx.SerializeSize() + spendSize*len(tx.TxIn)\n\n\t\t// Calculate the fee required for the txn at this point\n\t\t// observing the specified fee rate. If we don't have enough\n\t\t// coins from he current amount selected to pay the fee, then\n\t\t// continue to grab more coins.\n\t\treqFee := btcutil.Amount(txSize * int(feeRate))\n\t\tif amtSelected-reqFee < amt {\n\t\t\tcontinue\n\t\t}\n\n\t\t// If we have any change left over and we should create a change\n\t\t// output, then add an additional output to the transaction\n\t\t// reserved for it.\n\t\tchangeVal := amtSelected - amt - reqFee\n\t\tif changeVal > 0 && change {\n\t\t\taddr, err := m.newAddress()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tpkScript, err := txscript.PayToAddrScript(addr)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tchangeOutput := &wire.TxOut{\n\t\t\t\tValue:    int64(changeVal),\n\t\t\t\tPkScript: pkScript,\n\t\t\t}\n\t\t\ttx.AddTxOut(changeOutput)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\t// If we've reached this point, then coin selection failed due to an\n\t// insufficient amount of coins.\n\treturn fmt.Errorf(\"not enough funds for coin selection\")\n}\n\n// SendOutputs creates, then sends a transaction paying to the specified output\n// while observing the passed fee rate. The passed fee rate should be expressed\n// in satoshis-per-byte.\nfunc (m *memWallet) SendOutputs(outputs []*wire.TxOut,\n\tfeeRate btcutil.Amount) (*chainhash.Hash, error) {\n\n\ttx, err := m.CreateTransaction(outputs, feeRate, true)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn m.rpc.SendRawTransaction(tx, true)\n}\n\n// SendOutputsWithoutChange creates and sends a transaction that pays to the\n// specified outputs while observing the passed fee rate and ignoring a change\n// output. The passed fee rate should be expressed in sat/b.\nfunc (m *memWallet) SendOutputsWithoutChange(outputs []*wire.TxOut,\n\tfeeRate btcutil.Amount) (*chainhash.Hash, error) {\n\n\ttx, err := m.CreateTransaction(outputs, feeRate, false)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn m.rpc.SendRawTransaction(tx, true)\n}\n\n// CreateTransaction returns a fully signed transaction paying to the specified\n// outputs while observing the desired fee rate. The passed fee rate should be\n// expressed in satoshis-per-byte. The transaction being created can optionally\n// include a change output indicated by the change boolean.\n//\n// This function is safe for concurrent access.\nfunc (m *memWallet) CreateTransaction(outputs []*wire.TxOut,\n\tfeeRate btcutil.Amount, change bool) (*wire.MsgTx, error) {\n\n\tm.Lock()\n\tdefer m.Unlock()\n\n\ttx := wire.NewMsgTx(wire.TxVersion)\n\n\t// Tally up the total amount to be sent in order to perform coin\n\t// selection shortly below.\n\tvar outputAmt btcutil.Amount\n\tfor _, output := range outputs {\n\t\toutputAmt += btcutil.Amount(output.Value)\n\t\ttx.AddTxOut(output)\n\t}\n\n\t// Attempt to fund the transaction with spendable utxos.\n\tif err := m.fundTx(tx, outputAmt, feeRate, change); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Populate all the selected inputs with valid sigScript for spending.\n\t// Along the way record all outputs being spent in order to avoid a\n\t// potential double spend.\n\tspentOutputs := make([]*utxo, 0, len(tx.TxIn))\n\tfor i, txIn := range tx.TxIn {\n\t\toutPoint := txIn.PreviousOutPoint\n\t\tutxo := m.utxos[outPoint]\n\n\t\textendedKey, err := m.hdRoot.Derive(utxo.keyIndex)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tprivKeyOld, err := extendedKey.ECPrivKey()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tprivKey, _ := btcec.PrivKeyFromBytes(privKeyOld.Serialize())\n\n\t\tsigScript, err := txscript.SignatureScript(tx, i, utxo.pkScript,\n\t\t\ttxscript.SigHashAll, privKey, true)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\ttxIn.SignatureScript = sigScript\n\n\t\tspentOutputs = append(spentOutputs, utxo)\n\t}\n\n\t// As these outputs are now being spent by this newly created\n\t// transaction, mark the outputs are \"locked\". This action ensures\n\t// these outputs won't be double spent by any subsequent transactions.\n\t// These locked outputs can be freed via a call to UnlockOutputs.\n\tfor _, utxo := range spentOutputs {\n\t\tutxo.isLocked = true\n\t}\n\n\treturn tx, nil\n}\n\n// UnlockOutputs unlocks any outputs which were previously locked due to\n// being selected to fund a transaction via the CreateTransaction method.\n//\n// This function is safe for concurrent access.\nfunc (m *memWallet) UnlockOutputs(inputs []*wire.TxIn) {\n\tm.Lock()\n\tdefer m.Unlock()\n\n\tfor _, input := range inputs {\n\t\tutxo, ok := m.utxos[input.PreviousOutPoint]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tutxo.isLocked = false\n\t}\n}\n\n// ConfirmedBalance returns the confirmed balance of the wallet.\n//\n// This function is safe for concurrent access.\nfunc (m *memWallet) ConfirmedBalance() btcutil.Amount {\n\tm.RLock()\n\tdefer m.RUnlock()\n\n\tvar balance btcutil.Amount\n\tfor _, utxo := range m.utxos {\n\t\t// Prevent any immature or locked outputs from contributing to\n\t\t// the wallet's total confirmed balance.\n\t\tif !utxo.isMature(m.currentHeight) || utxo.isLocked {\n\t\t\tcontinue\n\t\t}\n\n\t\tbalance += utxo.value\n\t}\n\n\treturn balance\n}\n\n// keyToAddr maps the passed private to corresponding p2pkh address.\nfunc keyToAddr(key *btcec.PrivateKey, net *chaincfg.Params) (btcutil.Address, error) {\n\tserializedKey := key.PubKey().SerializeCompressed()\n\tpubKeyAddr, err := btcutil.NewAddressPubKey(serializedKey, net)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn pubKeyAddr.AddressPubKeyHash(), nil\n}\n"
  },
  {
    "path": "integration/rpctest/node.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpctest\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\trpc \"github.com/btcsuite/btcd/rpcclient\"\n)\n\n// nodeConfig contains all the args, and data required to launch a btcd process\n// and connect the rpc client to it.\ntype nodeConfig struct {\n\trpcUser    string\n\trpcPass    string\n\tlisten     string\n\trpcListen  string\n\trpcConnect string\n\tdataDir    string\n\tlogDir     string\n\tprofile    string\n\tdebugLevel string\n\textra      []string\n\tnodeDir    string\n\n\texe          string\n\tendpoint     string\n\tcertFile     string\n\tkeyFile      string\n\tcertificates []byte\n}\n\n// newConfig returns a newConfig with all default values.\nfunc newConfig(nodeDir, certFile, keyFile string, extra []string,\n\tcustomExePath string) (*nodeConfig, error) {\n\n\tvar btcdPath string\n\tif customExePath != \"\" {\n\t\tbtcdPath = customExePath\n\t} else {\n\t\tvar err error\n\t\tbtcdPath, err = btcdExecutablePath()\n\t\tif err != nil {\n\t\t\tbtcdPath = \"btcd\"\n\t\t}\n\t}\n\n\ta := &nodeConfig{\n\t\tlisten:    \"127.0.0.1:18555\",\n\t\trpcListen: \"127.0.0.1:18556\",\n\t\trpcUser:   \"user\",\n\t\trpcPass:   \"pass\",\n\t\textra:     extra,\n\t\tnodeDir:   nodeDir,\n\t\texe:       btcdPath,\n\t\tendpoint:  \"ws\",\n\t\tcertFile:  certFile,\n\t\tkeyFile:   keyFile,\n\t}\n\tif err := a.setDefaults(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn a, nil\n}\n\n// setDefaults sets the default values of the config. It also creates the\n// temporary data, and log directories which must be cleaned up with a call to\n// cleanup().\nfunc (n *nodeConfig) setDefaults() error {\n\tn.dataDir = filepath.Join(n.nodeDir, \"data\")\n\tn.logDir = filepath.Join(n.nodeDir, \"logs\")\n\tcert, err := os.ReadFile(n.certFile)\n\tif err != nil {\n\t\treturn err\n\t}\n\tn.certificates = cert\n\treturn nil\n}\n\n// arguments returns an array of arguments that be used to launch the btcd\n// process.\nfunc (n *nodeConfig) arguments() []string {\n\targs := []string{}\n\tif n.rpcUser != \"\" {\n\t\t// --rpcuser\n\t\targs = append(args, fmt.Sprintf(\"--rpcuser=%s\", n.rpcUser))\n\t}\n\tif n.rpcPass != \"\" {\n\t\t// --rpcpass\n\t\targs = append(args, fmt.Sprintf(\"--rpcpass=%s\", n.rpcPass))\n\t}\n\tif n.listen != \"\" {\n\t\t// --listen\n\t\targs = append(args, fmt.Sprintf(\"--listen=%s\", n.listen))\n\t}\n\tif n.rpcListen != \"\" {\n\t\t// --rpclisten\n\t\targs = append(args, fmt.Sprintf(\"--rpclisten=%s\", n.rpcListen))\n\t}\n\tif n.rpcConnect != \"\" {\n\t\t// --rpcconnect\n\t\targs = append(args, fmt.Sprintf(\"--rpcconnect=%s\", n.rpcConnect))\n\t}\n\t// --rpccert\n\targs = append(args, fmt.Sprintf(\"--rpccert=%s\", n.certFile))\n\t// --rpckey\n\targs = append(args, fmt.Sprintf(\"--rpckey=%s\", n.keyFile))\n\tif n.dataDir != \"\" {\n\t\t// --datadir\n\t\targs = append(args, fmt.Sprintf(\"--datadir=%s\", n.dataDir))\n\t}\n\tif n.logDir != \"\" {\n\t\t// --logdir\n\t\targs = append(args, fmt.Sprintf(\"--logdir=%s\", n.logDir))\n\t}\n\tif n.profile != \"\" {\n\t\t// --profile\n\t\targs = append(args, fmt.Sprintf(\"--profile=%s\", n.profile))\n\t}\n\tif n.debugLevel != \"\" {\n\t\t// --debuglevel\n\t\targs = append(args, fmt.Sprintf(\"--debuglevel=%s\", n.debugLevel))\n\t}\n\targs = append(args, n.extra...)\n\treturn args\n}\n\n// command returns the exec.Cmd which will be used to start the btcd process.\nfunc (n *nodeConfig) command() *exec.Cmd {\n\treturn exec.Command(n.exe, n.arguments()...)\n}\n\n// rpcConnConfig returns the rpc connection config that can be used to connect\n// to the btcd process that is launched via Start().\nfunc (n *nodeConfig) rpcConnConfig() rpc.ConnConfig {\n\treturn rpc.ConnConfig{\n\t\tHost:                 n.rpcListen,\n\t\tEndpoint:             n.endpoint,\n\t\tUser:                 n.rpcUser,\n\t\tPass:                 n.rpcPass,\n\t\tCertificates:         n.certificates,\n\t\tDisableAutoReconnect: true,\n\t}\n}\n\n// String returns the string representation of this nodeConfig.\nfunc (n *nodeConfig) String() string {\n\treturn n.nodeDir\n}\n\n// node houses the necessary state required to configure, launch, and manage a\n// btcd process.\ntype node struct {\n\tconfig *nodeConfig\n\n\tcmd     *exec.Cmd\n\tpidFile string\n\n\tdataDir string\n}\n\n// newNode creates a new node instance according to the passed config. dataDir\n// will be used to hold a file recording the pid of the launched process, and\n// as the base for the log and data directories for btcd.\nfunc newNode(config *nodeConfig, dataDir string) (*node, error) {\n\treturn &node{\n\t\tconfig:  config,\n\t\tdataDir: dataDir,\n\t\tcmd:     config.command(),\n\t}, nil\n}\n\n// start creates a new btcd process, and writes its pid in a file reserved for\n// recording the pid of the launched process. This file can be used to\n// terminate the process in case of a hang, or panic. In the case of a failing\n// test case, or panic, it is important that the process be stopped via stop(),\n// otherwise, it will persist unless explicitly killed.\nfunc (n *node) start() error {\n\tif err := n.cmd.Start(); err != nil {\n\t\treturn err\n\t}\n\n\tpid, err := os.Create(filepath.Join(n.dataDir, \"btcd.pid\"))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tn.pidFile = pid.Name()\n\tif _, err = fmt.Fprintf(pid, \"%d\\n\", n.cmd.Process.Pid); err != nil {\n\t\treturn err\n\t}\n\n\tif err := pid.Close(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// stop interrupts the running btcd process process, and waits until it exits\n// properly. On windows, interrupt is not supported, so a kill signal is used\n// instead\nfunc (n *node) stop() error {\n\tif n.cmd == nil || n.cmd.Process == nil {\n\t\t// return if not properly initialized\n\t\t// or error starting the process\n\t\treturn nil\n\t}\n\tdefer n.cmd.Wait()\n\tif runtime.GOOS == \"windows\" {\n\t\treturn n.cmd.Process.Signal(os.Kill)\n\t}\n\treturn n.cmd.Process.Signal(os.Interrupt)\n}\n\n// cleanup cleanups process and args files. The file housing the pid of the\n// created process will be deleted, as well as any directories created by the\n// process.\nfunc (n *node) cleanup() error {\n\tif n.pidFile != \"\" {\n\t\tif err := os.Remove(n.pidFile); err != nil {\n\t\t\tlog.Printf(\"unable to remove file %s: %v\", n.pidFile,\n\t\t\t\terr)\n\t\t}\n\t}\n\n\t// Since the node's main data directory is passed in to the node config,\n\t// it isn't our responsibility to clean it up. So we're done after\n\t// removing the pid file.\n\treturn nil\n}\n\n// shutdown terminates the running btcd process, and cleans up all\n// file/directories created by node.\nfunc (n *node) shutdown() error {\n\tif err := n.stop(); err != nil {\n\t\treturn err\n\t}\n\tif err := n.cleanup(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// genCertPair generates a key/cert pair to the paths provided.\nfunc genCertPair(certFile, keyFile string) error {\n\torg := \"rpctest autogenerated cert\"\n\tvalidUntil := time.Now().Add(10 * 365 * 24 * time.Hour)\n\tcert, key, err := btcutil.NewTLSCertPair(org, validUntil, nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Write cert and key files.\n\tif err = os.WriteFile(certFile, cert, 0666); err != nil {\n\t\treturn err\n\t}\n\tif err = os.WriteFile(keyFile, key, 0600); err != nil {\n\t\t_ = os.Remove(certFile)\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "integration/rpctest/rpc_harness.go",
    "content": "// Copyright (c) 2016-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpctest\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/rpcclient\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// These constants define the minimum and maximum p2p and rpc port\n\t// numbers used by a test harness.  The min port is inclusive while the\n\t// max port is exclusive.\n\tminPeerPort = 10000\n\tmaxPeerPort = 35000\n\tminRPCPort  = maxPeerPort\n\tmaxRPCPort  = 60000\n\n\t// BlockVersion is the default block version used when generating\n\t// blocks.\n\tBlockVersion = 4\n\n\t// DefaultMaxConnectionRetries is the default number of times we re-try\n\t// to connect to the node after starting it.\n\tDefaultMaxConnectionRetries = 20\n\n\t// DefaultConnectionRetryTimeout is the default duration we wait between\n\t// two connection attempts.\n\tDefaultConnectionRetryTimeout = 50 * time.Millisecond\n)\n\nvar (\n\t// current number of active test nodes.\n\tnumTestInstances = 0\n\n\t// testInstances is a private package-level slice used to keep track of\n\t// all active test harnesses. This global can be used to perform\n\t// various \"joins\", shutdown several active harnesses after a test,\n\t// etc.\n\ttestInstances = make(map[string]*Harness)\n\n\t// Used to protest concurrent access to above declared variables.\n\tharnessStateMtx sync.RWMutex\n\n\t// ListenAddressGenerator is a function that is used to generate two\n\t// listen addresses (host:port), one for the P2P listener and one for\n\t// the RPC listener. This is exported to allow overwriting of the\n\t// default behavior which isn't very concurrency safe (just selecting\n\t// a random port can produce collisions and therefore flakes).\n\tListenAddressGenerator = generateListeningAddresses\n\n\t// defaultNodePort is the start of the range for listening ports of\n\t// harness nodes. Ports are monotonically increasing starting from this\n\t// number and are determined by the results of nextAvailablePort().\n\tdefaultNodePort uint32 = 8333\n\n\t// ListenerFormat is the format string that is used to generate local\n\t// listener addresses.\n\tListenerFormat = \"127.0.0.1:%d\"\n\n\t// lastPort is the last port determined to be free for use by a new\n\t// node. It should be used atomically.\n\tlastPort uint32 = defaultNodePort\n)\n\n// HarnessTestCase represents a test-case which utilizes an instance of the\n// Harness to exercise functionality.\ntype HarnessTestCase func(r *Harness, t *testing.T)\n\n// Harness fully encapsulates an active btcd process to provide a unified\n// platform for creating rpc driven integration tests involving btcd. The\n// active btcd node will typically be run in simnet mode in order to allow for\n// easy generation of test blockchains.  The active btcd process is fully\n// managed by Harness, which handles the necessary initialization, and teardown\n// of the process along with any temporary directories created as a result.\n// Multiple Harness instances may be run concurrently, in order to allow for\n// testing complex scenarios involving multiple nodes. The harness also\n// includes an in-memory wallet to streamline various classes of tests.\ntype Harness struct {\n\t// ActiveNet is the parameters of the blockchain the Harness belongs\n\t// to.\n\tActiveNet *chaincfg.Params\n\n\t// MaxConnRetries is the maximum number of times we re-try to connect to\n\t// the node after starting it.\n\tMaxConnRetries int\n\n\t// ConnectionRetryTimeout is the duration we wait between two connection\n\t// attempts.\n\tConnectionRetryTimeout time.Duration\n\n\tClient      *rpcclient.Client\n\tBatchClient *rpcclient.Client\n\tnode        *node\n\thandlers    *rpcclient.NotificationHandlers\n\n\twallet *memWallet\n\n\ttestNodeDir string\n\tnodeNum     int\n\n\tsync.Mutex\n}\n\n// New creates and initializes new instance of the rpc test harness.\n// Optionally, websocket handlers and a specified configuration may be passed.\n// In the case that a nil config is passed, a default configuration will be\n// used. If a custom btcd executable is specified, it will be used to start the\n// harness node. Otherwise a new binary is built on demand.\n//\n// NOTE: This function is safe for concurrent access.\nfunc New(activeNet *chaincfg.Params, handlers *rpcclient.NotificationHandlers,\n\textraArgs []string, customExePath string) (*Harness, error) {\n\n\tharnessStateMtx.Lock()\n\tdefer harnessStateMtx.Unlock()\n\n\t// Add a flag for the appropriate network type based on the provided\n\t// chain params.\n\tswitch activeNet.Net {\n\tcase wire.MainNet:\n\t\t// No extra flags since mainnet is the default\n\tcase wire.TestNet3:\n\t\textraArgs = append(extraArgs, \"--testnet\")\n\tcase wire.TestNet:\n\t\textraArgs = append(extraArgs, \"--regtest\")\n\tcase wire.SimNet:\n\t\textraArgs = append(extraArgs, \"--simnet\")\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"rpctest.New must be called with one \" +\n\t\t\t\"of the supported chain networks\")\n\t}\n\n\ttestDir, err := baseDir()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tnodeTestData, err := os.MkdirTemp(testDir, \"rpc-node\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcertFile := filepath.Join(nodeTestData, \"rpc.cert\")\n\tkeyFile := filepath.Join(nodeTestData, \"rpc.key\")\n\tif err := genCertPair(certFile, keyFile); err != nil {\n\t\treturn nil, err\n\t}\n\n\twallet, err := newMemWallet(activeNet, uint32(numTestInstances))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tminingAddr := fmt.Sprintf(\"--miningaddr=%s\", wallet.coinbaseAddr)\n\textraArgs = append(extraArgs, miningAddr)\n\n\tconfig, err := newConfig(\n\t\tnodeTestData, certFile, keyFile, extraArgs, customExePath,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Generate p2p+rpc listening addresses.\n\tconfig.listen, config.rpcListen = ListenAddressGenerator()\n\n\t// Create the testing node bounded to the simnet.\n\tnode, err := newNode(config, nodeTestData)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tnodeNum := numTestInstances\n\tnumTestInstances++\n\n\tif handlers == nil {\n\t\thandlers = &rpcclient.NotificationHandlers{}\n\t}\n\n\t// If a handler for the OnFilteredBlock{Connected,Disconnected} callback\n\t// callback has already been set, then create a wrapper callback which\n\t// executes both the currently registered callback and the mem wallet's\n\t// callback.\n\tif handlers.OnFilteredBlockConnected != nil {\n\t\tobc := handlers.OnFilteredBlockConnected\n\t\thandlers.OnFilteredBlockConnected = func(height int32, header *wire.BlockHeader, filteredTxns []*btcutil.Tx) {\n\t\t\twallet.IngestBlock(height, header, filteredTxns)\n\t\t\tobc(height, header, filteredTxns)\n\t\t}\n\t} else {\n\t\t// Otherwise, we can claim the callback ourselves.\n\t\thandlers.OnFilteredBlockConnected = wallet.IngestBlock\n\t}\n\tif handlers.OnFilteredBlockDisconnected != nil {\n\t\tobd := handlers.OnFilteredBlockDisconnected\n\t\thandlers.OnFilteredBlockDisconnected = func(height int32, header *wire.BlockHeader) {\n\t\t\twallet.UnwindBlock(height, header)\n\t\t\tobd(height, header)\n\t\t}\n\t} else {\n\t\thandlers.OnFilteredBlockDisconnected = wallet.UnwindBlock\n\t}\n\n\th := &Harness{\n\t\thandlers:               handlers,\n\t\tnode:                   node,\n\t\tMaxConnRetries:         DefaultMaxConnectionRetries,\n\t\tConnectionRetryTimeout: DefaultConnectionRetryTimeout,\n\t\ttestNodeDir:            nodeTestData,\n\t\tActiveNet:              activeNet,\n\t\tnodeNum:                nodeNum,\n\t\twallet:                 wallet,\n\t}\n\n\t// Track this newly created test instance within the package level\n\t// global map of all active test instances.\n\ttestInstances[h.testNodeDir] = h\n\n\treturn h, nil\n}\n\n// SetUp initializes the rpc test state. Initialization includes: starting up a\n// simnet node, creating a websockets client and connecting to the started\n// node, and finally: optionally generating and submitting a testchain with a\n// configurable number of mature coinbase outputs coinbase outputs.\n//\n// NOTE: This method and TearDown should always be called from the same\n// goroutine as they are not concurrent safe.\nfunc (h *Harness) SetUp(createTestChain bool, numMatureOutputs uint32) error {\n\t// Start the btcd node itself. This spawns a new process which will be\n\t// managed\n\tif err := h.node.start(); err != nil {\n\t\treturn fmt.Errorf(\"error starting node: %w\", err)\n\t}\n\tif err := h.connectRPCClient(); err != nil {\n\t\treturn fmt.Errorf(\"error connecting RPC client: %w\", err)\n\t}\n\n\th.wallet.Start()\n\n\t// Filter transactions that pay to the coinbase associated with the\n\t// wallet.\n\tfilterAddrs := []btcutil.Address{h.wallet.coinbaseAddr}\n\tif err := h.Client.LoadTxFilter(true, filterAddrs, nil); err != nil {\n\t\treturn err\n\t}\n\n\t// Ensure btcd properly dispatches our registered call-back for each new\n\t// block. Otherwise, the memWallet won't function properly.\n\tif err := h.Client.NotifyBlocks(); err != nil {\n\t\treturn err\n\t}\n\n\t// Create a test chain with the desired number of mature coinbase\n\t// outputs.\n\tif createTestChain && numMatureOutputs != 0 {\n\t\tcoinbaseMaturity := uint32(h.ActiveNet.CoinbaseMaturity)\n\t\tnumToGenerate := coinbaseMaturity + numMatureOutputs\n\t\t_, err := h.Client.Generate(numToGenerate)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Block until the wallet has fully synced up to the tip of the main\n\t// chain.\n\t_, height, err := h.Client.GetBestBlock()\n\tif err != nil {\n\t\treturn err\n\t}\n\tticker := time.NewTicker(time.Millisecond * 100)\n\tfor range ticker.C {\n\t\twalletHeight := h.wallet.SyncedHeight()\n\t\tif walletHeight == height {\n\t\t\tbreak\n\t\t}\n\t}\n\tticker.Stop()\n\n\treturn nil\n}\n\n// tearDown stops the running rpc test instance.  All created processes are\n// killed, and temporary directories removed.\n//\n// This function MUST be called with the harness state mutex held (for writes).\nfunc (h *Harness) tearDown() error {\n\tif h.Client != nil {\n\t\th.Client.Shutdown()\n\t\th.Client.WaitForShutdown()\n\t}\n\n\tif h.BatchClient != nil {\n\t\th.BatchClient.Shutdown()\n\t\th.BatchClient.WaitForShutdown()\n\t}\n\n\tif err := h.node.shutdown(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := os.RemoveAll(h.testNodeDir); err != nil {\n\t\treturn err\n\t}\n\n\tdelete(testInstances, h.testNodeDir)\n\n\treturn nil\n}\n\n// TearDown stops the running rpc test instance. All created processes are\n// killed, and temporary directories removed.\n//\n// NOTE: This method and SetUp should always be called from the same goroutine\n// as they are not concurrent safe.\nfunc (h *Harness) TearDown() error {\n\tharnessStateMtx.Lock()\n\tdefer harnessStateMtx.Unlock()\n\n\treturn h.tearDown()\n}\n\n// connectRPCClient attempts to establish an RPC connection to the created btcd\n// process belonging to this Harness instance. If the initial connection\n// attempt fails, this function will retry h.maxConnRetries times, backing off\n// the time between subsequent attempts. If after h.maxConnRetries attempts,\n// we're not able to establish a connection, this function returns with an\n// error.\nfunc (h *Harness) connectRPCClient() error {\n\tvar client, batchClient *rpcclient.Client\n\tvar err error\n\n\trpcConf := h.node.config.rpcConnConfig()\n\tbatchConf := h.node.config.rpcConnConfig()\n\tbatchConf.HTTPPostMode = true\n\tfor i := 0; i < h.MaxConnRetries; i++ {\n\t\tfail := false\n\t\ttimeout := time.Duration(i) * h.ConnectionRetryTimeout\n\t\tif client == nil {\n\t\t\tclient, err = rpcclient.New(&rpcConf, h.handlers)\n\t\t\tif err != nil {\n\t\t\t\ttime.Sleep(timeout)\n\t\t\t\tfail = true\n\t\t\t}\n\t\t}\n\t\tif batchClient == nil {\n\t\t\tbatchClient, err = rpcclient.NewBatch(&batchConf)\n\t\t\tif err != nil {\n\t\t\t\ttime.Sleep(timeout)\n\t\t\t\tfail = true\n\t\t\t}\n\t\t}\n\t\tif !fail {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif client == nil || batchClient == nil {\n\t\treturn fmt.Errorf(\"connection timeout, tried %d times with \"+\n\t\t\t\"timeout %v, last err: %w\", h.MaxConnRetries,\n\t\t\th.ConnectionRetryTimeout, err)\n\t}\n\n\th.Client = client\n\th.wallet.SetRPCClient(client)\n\th.BatchClient = batchClient\n\treturn nil\n}\n\n// NewAddress returns a fresh address spendable by the Harness' internal\n// wallet.\n//\n// This function is safe for concurrent access.\nfunc (h *Harness) NewAddress() (btcutil.Address, error) {\n\treturn h.wallet.NewAddress()\n}\n\n// ConfirmedBalance returns the confirmed balance of the Harness' internal\n// wallet.\n//\n// This function is safe for concurrent access.\nfunc (h *Harness) ConfirmedBalance() btcutil.Amount {\n\treturn h.wallet.ConfirmedBalance()\n}\n\n// SendOutputs creates, signs, and finally broadcasts a transaction spending\n// the harness' available mature coinbase outputs creating new outputs\n// according to targetOutputs.\n//\n// This function is safe for concurrent access.\nfunc (h *Harness) SendOutputs(targetOutputs []*wire.TxOut,\n\tfeeRate btcutil.Amount) (*chainhash.Hash, error) {\n\n\treturn h.wallet.SendOutputs(targetOutputs, feeRate)\n}\n\n// SendOutputsWithoutChange creates and sends a transaction that pays to the\n// specified outputs while observing the passed fee rate and ignoring a change\n// output. The passed fee rate should be expressed in sat/b.\n//\n// This function is safe for concurrent access.\nfunc (h *Harness) SendOutputsWithoutChange(targetOutputs []*wire.TxOut,\n\tfeeRate btcutil.Amount) (*chainhash.Hash, error) {\n\n\treturn h.wallet.SendOutputsWithoutChange(targetOutputs, feeRate)\n}\n\n// CreateTransaction returns a fully signed transaction paying to the specified\n// outputs while observing the desired fee rate. The passed fee rate should be\n// expressed in satoshis-per-byte. The transaction being created can optionally\n// include a change output indicated by the change boolean. Any unspent outputs\n// selected as inputs for the crafted transaction are marked as unspendable in\n// order to avoid potential double-spends by future calls to this method. If the\n// created transaction is cancelled for any reason then the selected inputs MUST\n// be freed via a call to UnlockOutputs. Otherwise, the locked inputs won't be\n// returned to the pool of spendable outputs.\n//\n// This function is safe for concurrent access.\nfunc (h *Harness) CreateTransaction(targetOutputs []*wire.TxOut,\n\tfeeRate btcutil.Amount, change bool) (*wire.MsgTx, error) {\n\n\treturn h.wallet.CreateTransaction(targetOutputs, feeRate, change)\n}\n\n// UnlockOutputs unlocks any outputs which were previously marked as\n// unspendabe due to being selected to fund a transaction via the\n// CreateTransaction method.\n//\n// This function is safe for concurrent access.\nfunc (h *Harness) UnlockOutputs(inputs []*wire.TxIn) {\n\th.wallet.UnlockOutputs(inputs)\n}\n\n// RPCConfig returns the harnesses current rpc configuration. This allows other\n// potential RPC clients created within tests to connect to a given test\n// harness instance.\nfunc (h *Harness) RPCConfig() rpcclient.ConnConfig {\n\treturn h.node.config.rpcConnConfig()\n}\n\n// P2PAddress returns the harness' P2P listening address. This allows potential\n// peers (such as SPV peers) created within tests to connect to a given test\n// harness instance.\nfunc (h *Harness) P2PAddress() string {\n\treturn h.node.config.listen\n}\n\n// GenerateAndSubmitBlock creates a block whose contents include the passed\n// transactions and submits it to the running simnet node. For generating\n// blocks with only a coinbase tx, callers can simply pass nil instead of\n// transactions to be mined. Additionally, a custom block version can be set by\n// the caller. A blockVersion of -1 indicates that the current default block\n// version should be used. An uninitialized time.Time should be used for the\n// blockTime parameter if one doesn't wish to set a custom time.\n//\n// This function is safe for concurrent access.\nfunc (h *Harness) GenerateAndSubmitBlock(txns []*btcutil.Tx, blockVersion int32,\n\tblockTime time.Time) (*btcutil.Block, error) {\n\treturn h.GenerateAndSubmitBlockWithCustomCoinbaseOutputs(txns,\n\t\tblockVersion, blockTime, []wire.TxOut{})\n}\n\n// GenerateAndSubmitBlockWithCustomCoinbaseOutputs creates a block whose\n// contents include the passed coinbase outputs and transactions and submits\n// it to the running simnet node. For generating blocks with only a coinbase tx,\n// callers can simply pass nil instead of transactions to be mined.\n// Additionally, a custom block version can be set by the caller. A blockVersion\n// of -1 indicates that the current default block version should be used. An\n// uninitialized time.Time should be used for the blockTime parameter if one\n// doesn't wish to set a custom time. The mineTo list of outputs will be added\n// to the coinbase; this is not checked for correctness until the block is\n// submitted; thus, it is the caller's responsibility to ensure that the outputs\n// are correct. If the list is empty, the coinbase reward goes to the wallet\n// managed by the Harness.\n//\n// This function is safe for concurrent access.\nfunc (h *Harness) GenerateAndSubmitBlockWithCustomCoinbaseOutputs(\n\ttxns []*btcutil.Tx, blockVersion int32, blockTime time.Time,\n\tmineTo []wire.TxOut) (*btcutil.Block, error) {\n\n\th.Lock()\n\tdefer h.Unlock()\n\n\tif blockVersion == -1 {\n\t\tblockVersion = BlockVersion\n\t}\n\n\tprevBlockHash, prevBlockHeight, err := h.Client.GetBestBlock()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmBlock, err := h.Client.GetBlock(prevBlockHash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tprevBlock := btcutil.NewBlock(mBlock)\n\tprevBlock.SetHeight(prevBlockHeight)\n\n\t// Create a new block including the specified transactions\n\tnewBlock, err := CreateBlock(prevBlock, txns, blockVersion,\n\t\tblockTime, h.wallet.coinbaseAddr, mineTo, h.ActiveNet)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Submit the block to the simnet node.\n\tif err := h.Client.SubmitBlock(newBlock, nil); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn newBlock, nil\n}\n\n// generateListeningAddresses is a function that returns two listener\n// addresses with unique ports and should be used to overwrite rpctest's\n// default generator which is prone to use colliding ports.\nfunc generateListeningAddresses() (string, string) {\n\treturn fmt.Sprintf(ListenerFormat, NextAvailablePort()),\n\t\tfmt.Sprintf(ListenerFormat, NextAvailablePort())\n}\n\n// NextAvailablePort returns the first port that is available for listening by\n// a new node. It panics if no port is found and the maximum available TCP port\n// is reached.\nfunc NextAvailablePort() int {\n\tport := atomic.AddUint32(&lastPort, 1)\n\tfor port < 65535 {\n\t\t// If there are no errors while attempting to listen on this\n\t\t// port, close the socket and return it as available. While it\n\t\t// could be the case that some other process picks up this port\n\t\t// between the time the socket is closed and it's reopened in\n\t\t// the harness node, in practice in CI servers this seems much\n\t\t// less likely than simply some other process already being\n\t\t// bound at the start of the tests.\n\t\taddr := fmt.Sprintf(ListenerFormat, port)\n\t\tl, err := net.Listen(\"tcp4\", addr)\n\t\tif err == nil {\n\t\t\terr := l.Close()\n\t\t\tif err == nil {\n\t\t\t\treturn int(port)\n\t\t\t}\n\t\t}\n\t\tport = atomic.AddUint32(&lastPort, 1)\n\t}\n\n\t// No ports available? Must be a mistake.\n\tpanic(\"no ports available for listening\")\n}\n\n// NextAvailablePortForProcess returns the first port that is available for\n// listening by a new node, using a lock file to make sure concurrent access for\n// parallel tasks within the same process don't re-use the same port. It panics\n// if no port is found and the maximum available TCP port is reached.\nfunc NextAvailablePortForProcess(pid int) int {\n\tlockFile := filepath.Join(\n\t\tos.TempDir(), fmt.Sprintf(\"rpctest-port-pid-%d.lock\", pid),\n\t)\n\ttimeout := time.After(time.Second)\n\n\tvar (\n\t\tlockFileHandle *os.File\n\t\terr            error\n\t)\n\tfor {\n\t\t// Attempt to acquire the lock file. If it already exists, wait\n\t\t// for a bit and retry.\n\t\tlockFileHandle, err = os.OpenFile(\n\t\t\tlockFile, os.O_CREATE|os.O_EXCL, 0600,\n\t\t)\n\t\tif err == nil {\n\t\t\t// Lock acquired.\n\t\t\tbreak\n\t\t}\n\n\t\t// Wait for a bit and retry.\n\t\tselect {\n\t\tcase <-timeout:\n\t\t\tpanic(\"timeout waiting for lock file\")\n\t\tcase <-time.After(10 * time.Millisecond):\n\t\t}\n\t}\n\n\t// Release the lock file when we're done.\n\tdefer func() {\n\t\t// Always close file first, Windows won't allow us to remove it\n\t\t// otherwise.\n\t\t_ = lockFileHandle.Close()\n\t\terr := os.Remove(lockFile)\n\t\tif err != nil {\n\t\t\tpanic(fmt.Errorf(\"couldn't remove lock file: %w\", err))\n\t\t}\n\t}()\n\n\tportFile := filepath.Join(\n\t\tos.TempDir(), fmt.Sprintf(\"rpctest-port-pid-%d\", pid),\n\t)\n\tport, err := os.ReadFile(portFile)\n\tif err != nil {\n\t\tif !os.IsNotExist(err) {\n\t\t\tpanic(fmt.Errorf(\"error reading port file: %w\", err))\n\t\t}\n\t\tport = []byte(strconv.Itoa(int(defaultNodePort)))\n\t}\n\n\tlastPort, err := strconv.Atoi(string(port))\n\tif err != nil {\n\t\tpanic(fmt.Errorf(\"error parsing port: %w\", err))\n\t}\n\n\t// We take the next one.\n\tlastPort++\n\tfor lastPort < 65535 {\n\t\t// If there are no errors while attempting to listen on this\n\t\t// port, close the socket and return it as available. While it\n\t\t// could be the case that some other process picks up this port\n\t\t// between the time the socket is closed and it's reopened in\n\t\t// the harness node, in practice in CI servers this seems much\n\t\t// less likely than simply some other process already being\n\t\t// bound at the start of the tests.\n\t\taddr := fmt.Sprintf(ListenerFormat, lastPort)\n\t\tl, err := net.Listen(\"tcp4\", addr)\n\t\tif err == nil {\n\t\t\terr := l.Close()\n\t\t\tif err == nil {\n\t\t\t\terr := os.WriteFile(\n\t\t\t\t\tportFile,\n\t\t\t\t\t[]byte(strconv.Itoa(lastPort)), 0600,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tpanic(fmt.Errorf(\"error updating \"+\n\t\t\t\t\t\t\"port file: %w\", err))\n\t\t\t\t}\n\n\t\t\t\treturn lastPort\n\t\t\t}\n\t\t}\n\t\tlastPort++\n\t}\n\n\t// No ports available? Must be a mistake.\n\tpanic(\"no ports available for listening\")\n}\n\n// GenerateProcessUniqueListenerAddresses is a function that returns two\n// listener addresses with unique ports per the given process id and should be\n// used to overwrite rpctest's default generator which is prone to use colliding\n// ports.\nfunc GenerateProcessUniqueListenerAddresses(pid int) (string, string) {\n\tport1 := NextAvailablePortForProcess(pid)\n\tport2 := NextAvailablePortForProcess(pid)\n\treturn fmt.Sprintf(ListenerFormat, port1),\n\t\tfmt.Sprintf(ListenerFormat, port2)\n}\n\n// baseDir is the directory path of the temp directory for all rpctest files.\nfunc baseDir() (string, error) {\n\tdirPath := filepath.Join(os.TempDir(), \"btcd\", \"rpctest\")\n\terr := os.MkdirAll(dirPath, 0755)\n\treturn dirPath, err\n}\n"
  },
  {
    "path": "integration/rpctest/rpc_harness_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// This file is ignored during the regular tests due to the following build tag.\n//go:build rpctest\n// +build rpctest\n\npackage rpctest\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nfunc testSendOutputs(r *Harness, t *testing.T) {\n\tgenSpend := func(amt btcutil.Amount) *chainhash.Hash {\n\t\t// Grab a fresh address from the wallet.\n\t\taddr, err := r.NewAddress()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to get new address: %v\", err)\n\t\t}\n\n\t\t// Next, send amt BTC to this address, spending from one of our mature\n\t\t// coinbase outputs.\n\t\taddrScript, err := txscript.PayToAddrScript(addr)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to generate pkscript to addr: %v\", err)\n\t\t}\n\t\toutput := wire.NewTxOut(int64(amt), addrScript)\n\t\ttxid, err := r.SendOutputs([]*wire.TxOut{output}, 10)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"coinbase spend failed: %v\", err)\n\t\t}\n\t\treturn txid\n\t}\n\n\tassertTxMined := func(txid *chainhash.Hash, blockHash *chainhash.Hash) {\n\t\tblock, err := r.Client.GetBlock(blockHash)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to get block: %v\", err)\n\t\t}\n\n\t\tnumBlockTxns := len(block.Transactions)\n\t\tif numBlockTxns < 2 {\n\t\t\tt.Fatalf(\"crafted transaction wasn't mined, block should have \"+\n\t\t\t\t\"at least %v transactions instead has %v\", 2, numBlockTxns)\n\t\t}\n\n\t\tminedTx := block.Transactions[1]\n\t\ttxHash := minedTx.TxHash()\n\t\tif txHash != *txid {\n\t\t\tt.Fatalf(\"txid's don't match, %v vs %v\", txHash, txid)\n\t\t}\n\t}\n\n\t// First, generate a small spend which will require only a single\n\t// input.\n\ttxid := genSpend(btcutil.Amount(5 * btcutil.SatoshiPerBitcoin))\n\n\t// Generate a single block, the transaction the wallet created should\n\t// be found in this block.\n\tblockHashes, err := r.Client.Generate(1)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate single block: %v\", err)\n\t}\n\tassertTxMined(txid, blockHashes[0])\n\n\t// Next, generate a spend much greater than the block reward. This\n\t// transaction should also have been mined properly.\n\ttxid = genSpend(btcutil.Amount(500 * btcutil.SatoshiPerBitcoin))\n\tblockHashes, err = r.Client.Generate(1)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate single block: %v\", err)\n\t}\n\tassertTxMined(txid, blockHashes[0])\n}\n\nfunc assertConnectedTo(t *testing.T, nodeA *Harness, nodeB *Harness) {\n\tnodeAPeers, err := nodeA.Client.GetPeerInfo()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get nodeA's peer info\")\n\t}\n\n\tnodeAddr := nodeB.node.config.listen\n\taddrFound := false\n\tfor _, peerInfo := range nodeAPeers {\n\t\tif peerInfo.Addr == nodeAddr {\n\t\t\taddrFound = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !addrFound {\n\t\tt.Fatal(\"nodeA not connected to nodeB\")\n\t}\n}\n\nfunc testConnectNode(r *Harness, t *testing.T) {\n\t// Create a fresh test harness.\n\tharness, err := New(&chaincfg.SimNetParams, nil, nil, \"\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err := harness.SetUp(false, 0); err != nil {\n\t\tt.Fatalf(\"unable to complete rpctest setup: %v\", err)\n\t}\n\tdefer harness.TearDown()\n\n\t// Establish a p2p connection from our new local harness to the main\n\t// harness.\n\tif err := ConnectNode(harness, r); err != nil {\n\t\tt.Fatalf(\"unable to connect local to main harness: %v\", err)\n\t}\n\n\t// The main harness should show up in our local harness' peer's list,\n\t// and vice verse.\n\tassertConnectedTo(t, harness, r)\n}\n\nfunc testTearDownAll(t *testing.T) {\n\t// Grab a local copy of the currently active harnesses before\n\t// attempting to tear them all down.\n\tinitialActiveHarnesses := ActiveHarnesses()\n\n\t// Tear down all currently active harnesses.\n\tif err := TearDownAll(); err != nil {\n\t\tt.Fatalf(\"unable to teardown all harnesses: %v\", err)\n\t}\n\n\t// The global testInstances map should now be fully purged with no\n\t// active test harnesses remaining.\n\tif len(ActiveHarnesses()) != 0 {\n\t\tt.Fatalf(\"test harnesses still active after TearDownAll\")\n\t}\n\n\tfor _, harness := range initialActiveHarnesses {\n\t\t// Ensure all test directories have been deleted.\n\t\tif _, err := os.Stat(harness.testNodeDir); err == nil {\n\t\t\tt.Errorf(\"created test datadir was not deleted.\")\n\t\t}\n\t}\n}\n\nfunc testActiveHarnesses(r *Harness, t *testing.T) {\n\tnumInitialHarnesses := len(ActiveHarnesses())\n\n\t// Create a single test harness.\n\tharness1, err := New(&chaincfg.SimNetParams, nil, nil, \"\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer harness1.TearDown()\n\n\t// With the harness created above, a single harness should be detected\n\t// as active.\n\tnumActiveHarnesses := len(ActiveHarnesses())\n\tif !(numActiveHarnesses > numInitialHarnesses) {\n\t\tt.Fatalf(\"ActiveHarnesses not updated, should have an \" +\n\t\t\t\"additional test harness listed.\")\n\t}\n}\n\nfunc testJoinMempools(r *Harness, t *testing.T) {\n\t// Assert main test harness has no transactions in its mempool.\n\tpooledHashes, err := r.Client.GetRawMempool()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to get mempool for main test harness: %v\", err)\n\t}\n\tif len(pooledHashes) != 0 {\n\t\tt.Fatal(\"main test harness mempool not empty\")\n\t}\n\n\t// Create a local test harness with only the genesis block.  The nodes\n\t// will be synced below so the same transaction can be sent to both\n\t// nodes without it being an orphan.\n\tharness, err := New(&chaincfg.SimNetParams, nil, nil, \"\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err := harness.SetUp(false, 0); err != nil {\n\t\tt.Fatalf(\"unable to complete rpctest setup: %v\", err)\n\t}\n\tdefer harness.TearDown()\n\n\tnodeSlice := []*Harness{r, harness}\n\n\t// Both mempools should be considered synced as they are empty.\n\t// Therefore, this should return instantly.\n\tif err := JoinNodes(nodeSlice, Mempools); err != nil {\n\t\tt.Fatalf(\"unable to join node on mempools: %v\", err)\n\t}\n\n\t// Generate a coinbase spend to a new address within the main harness'\n\t// mempool.\n\taddr, err := r.NewAddress()\n\taddrScript, err := txscript.PayToAddrScript(addr)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate pkscript to addr: %v\", err)\n\t}\n\toutput := wire.NewTxOut(5e8, addrScript)\n\ttestTx, err := r.CreateTransaction([]*wire.TxOut{output}, 10, true)\n\tif err != nil {\n\t\tt.Fatalf(\"coinbase spend failed: %v\", err)\n\t}\n\tif _, err := r.Client.SendRawTransaction(testTx, true); err != nil {\n\t\tt.Fatalf(\"send transaction failed: %v\", err)\n\t}\n\n\t// Wait until the transaction shows up to ensure the two mempools are\n\t// not the same.\n\tharnessSynced := make(chan struct{})\n\tgo func() {\n\t\tfor {\n\t\t\tpoolHashes, err := r.Client.GetRawMempool()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to retrieve harness mempool: %v\", err)\n\t\t\t}\n\t\t\tif len(poolHashes) > 0 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\ttime.Sleep(time.Millisecond * 100)\n\t\t}\n\t\tharnessSynced <- struct{}{}\n\t}()\n\tselect {\n\tcase <-harnessSynced:\n\tcase <-time.After(time.Minute):\n\t\tt.Fatalf(\"harness node never received transaction\")\n\t}\n\n\t// This select case should fall through to the default as the goroutine\n\t// should be blocked on the JoinNodes call.\n\tpoolsSynced := make(chan struct{})\n\tgo func() {\n\t\tif err := JoinNodes(nodeSlice, Mempools); err != nil {\n\t\t\tt.Fatalf(\"unable to join node on mempools: %v\", err)\n\t\t}\n\t\tpoolsSynced <- struct{}{}\n\t}()\n\tselect {\n\tcase <-poolsSynced:\n\t\tt.Fatalf(\"mempools detected as synced yet harness has a new tx\")\n\tdefault:\n\t}\n\n\t// Establish an outbound connection from the local harness to the main\n\t// harness and wait for the chains to be synced.\n\tif err := ConnectNode(harness, r); err != nil {\n\t\tt.Fatalf(\"unable to connect harnesses: %v\", err)\n\t}\n\tif err := JoinNodes(nodeSlice, Blocks); err != nil {\n\t\tt.Fatalf(\"unable to join node on blocks: %v\", err)\n\t}\n\n\t// Send the transaction to the local harness which will result in synced\n\t// mempools.\n\tif _, err := harness.Client.SendRawTransaction(testTx, true); err != nil {\n\t\tt.Fatalf(\"send transaction failed: %v\", err)\n\t}\n\n\t// Select once again with a special timeout case after 1 minute. The\n\t// goroutine above should now be blocked on sending into the unbuffered\n\t// channel. The send should immediately succeed. In order to avoid the\n\t// test hanging indefinitely, a 1 minute timeout is in place.\n\tselect {\n\tcase <-poolsSynced:\n\t\t// fall through\n\tcase <-time.After(time.Minute):\n\t\tt.Fatalf(\"mempools never detected as synced\")\n\t}\n}\n\nfunc testJoinBlocks(r *Harness, t *testing.T) {\n\t// Create a second harness with only the genesis block so it is behind\n\t// the main harness.\n\tharness, err := New(&chaincfg.SimNetParams, nil, nil, \"\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err := harness.SetUp(false, 0); err != nil {\n\t\tt.Fatalf(\"unable to complete rpctest setup: %v\", err)\n\t}\n\tdefer harness.TearDown()\n\n\tnodeSlice := []*Harness{r, harness}\n\tblocksSynced := make(chan struct{})\n\tgo func() {\n\t\tif err := JoinNodes(nodeSlice, Blocks); err != nil {\n\t\t\tt.Fatalf(\"unable to join node on blocks: %v\", err)\n\t\t}\n\t\tblocksSynced <- struct{}{}\n\t}()\n\n\t// This select case should fall through to the default as the goroutine\n\t// should be blocked on the JoinNodes calls.\n\tselect {\n\tcase <-blocksSynced:\n\t\tt.Fatalf(\"blocks detected as synced yet local harness is behind\")\n\tdefault:\n\t}\n\n\t// Connect the local harness to the main harness which will sync the\n\t// chains.\n\tif err := ConnectNode(harness, r); err != nil {\n\t\tt.Fatalf(\"unable to connect harnesses: %v\", err)\n\t}\n\n\t// Select once again with a special timeout case after 1 minute. The\n\t// goroutine above should now be blocked on sending into the unbuffered\n\t// channel. The send should immediately succeed. In order to avoid the\n\t// test hanging indefinitely, a 1 minute timeout is in place.\n\tselect {\n\tcase <-blocksSynced:\n\t\t// fall through\n\tcase <-time.After(time.Minute):\n\t\tt.Fatalf(\"blocks never detected as synced\")\n\t}\n}\n\nfunc testGenerateAndSubmitBlock(r *Harness, t *testing.T) {\n\t// Generate a few test spend transactions.\n\taddr, err := r.NewAddress()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate new address: %v\", err)\n\t}\n\tpkScript, err := txscript.PayToAddrScript(addr)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create script: %v\", err)\n\t}\n\toutput := wire.NewTxOut(btcutil.SatoshiPerBitcoin, pkScript)\n\n\tconst numTxns = 5\n\ttxns := make([]*btcutil.Tx, 0, numTxns)\n\tfor i := 0; i < numTxns; i++ {\n\t\ttx, err := r.CreateTransaction([]*wire.TxOut{output}, 10, true)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to create tx: %v\", err)\n\t\t}\n\n\t\ttxns = append(txns, btcutil.NewTx(tx))\n\t}\n\n\t// Now generate a block with the default block version, and a zero'd\n\t// out time.\n\tblock, err := r.GenerateAndSubmitBlock(txns, -1, time.Time{})\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate block: %v\", err)\n\t}\n\n\t// Ensure that all created transactions were included, and that the\n\t// block version was properly set to the default.\n\tnumBlocksTxns := len(block.Transactions())\n\tif numBlocksTxns != numTxns+1 {\n\t\tt.Fatalf(\"block did not include all transactions: \"+\n\t\t\t\"expected %v, got %v\", numTxns+1, numBlocksTxns)\n\t}\n\tblockVersion := block.MsgBlock().Header.Version\n\tif blockVersion != BlockVersion {\n\t\tt.Fatalf(\"block version is not default: expected %v, got %v\",\n\t\t\tBlockVersion, blockVersion)\n\t}\n\n\t// Next generate a block with a \"non-standard\" block version along with\n\t// time stamp a minute after the previous block's timestamp.\n\ttimestamp := block.MsgBlock().Header.Timestamp.Add(time.Minute)\n\ttargetBlockVersion := int32(1337)\n\tblock, err = r.GenerateAndSubmitBlock(nil, targetBlockVersion, timestamp)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate block: %v\", err)\n\t}\n\n\t// Finally ensure that the desired block version and timestamp were set\n\t// properly.\n\theader := block.MsgBlock().Header\n\tblockVersion = header.Version\n\tif blockVersion != targetBlockVersion {\n\t\tt.Fatalf(\"block version mismatch: expected %v, got %v\",\n\t\t\ttargetBlockVersion, blockVersion)\n\t}\n\tif !timestamp.Equal(header.Timestamp) {\n\t\tt.Fatalf(\"header time stamp mismatch: expected %v, got %v\",\n\t\t\ttimestamp, header.Timestamp)\n\t}\n}\n\nfunc testGenerateAndSubmitBlockWithCustomCoinbaseOutputs(r *Harness,\n\tt *testing.T) {\n\t// Generate a few test spend transactions.\n\taddr, err := r.NewAddress()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate new address: %v\", err)\n\t}\n\tpkScript, err := txscript.PayToAddrScript(addr)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create script: %v\", err)\n\t}\n\toutput := wire.NewTxOut(btcutil.SatoshiPerBitcoin, pkScript)\n\n\tconst numTxns = 5\n\ttxns := make([]*btcutil.Tx, 0, numTxns)\n\tfor i := 0; i < numTxns; i++ {\n\t\ttx, err := r.CreateTransaction([]*wire.TxOut{output}, 10, true)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to create tx: %v\", err)\n\t\t}\n\n\t\ttxns = append(txns, btcutil.NewTx(tx))\n\t}\n\n\t// Now generate a block with the default block version, a zero'd out\n\t// time, and a burn output.\n\tblock, err := r.GenerateAndSubmitBlockWithCustomCoinbaseOutputs(txns,\n\t\t-1, time.Time{}, []wire.TxOut{{\n\t\t\tValue:    0,\n\t\t\tPkScript: []byte{},\n\t\t}})\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate block: %v\", err)\n\t}\n\n\t// Ensure that all created transactions were included, and that the\n\t// block version was properly set to the default.\n\tnumBlocksTxns := len(block.Transactions())\n\tif numBlocksTxns != numTxns+1 {\n\t\tt.Fatalf(\"block did not include all transactions: \"+\n\t\t\t\"expected %v, got %v\", numTxns+1, numBlocksTxns)\n\t}\n\tblockVersion := block.MsgBlock().Header.Version\n\tif blockVersion != BlockVersion {\n\t\tt.Fatalf(\"block version is not default: expected %v, got %v\",\n\t\t\tBlockVersion, blockVersion)\n\t}\n\n\t// Next generate a block with a \"non-standard\" block version along with\n\t// time stamp a minute after the previous block's timestamp.\n\ttimestamp := block.MsgBlock().Header.Timestamp.Add(time.Minute)\n\ttargetBlockVersion := int32(1337)\n\tblock, err = r.GenerateAndSubmitBlockWithCustomCoinbaseOutputs(nil,\n\t\ttargetBlockVersion, timestamp, []wire.TxOut{{\n\t\t\tValue:    0,\n\t\t\tPkScript: []byte{},\n\t\t}})\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate block: %v\", err)\n\t}\n\n\t// Finally ensure that the desired block version and timestamp were set\n\t// properly.\n\theader := block.MsgBlock().Header\n\tblockVersion = header.Version\n\tif blockVersion != targetBlockVersion {\n\t\tt.Fatalf(\"block version mismatch: expected %v, got %v\",\n\t\t\ttargetBlockVersion, blockVersion)\n\t}\n\tif !timestamp.Equal(header.Timestamp) {\n\t\tt.Fatalf(\"header time stamp mismatch: expected %v, got %v\",\n\t\t\ttimestamp, header.Timestamp)\n\t}\n}\n\nfunc testMemWalletReorg(r *Harness, t *testing.T) {\n\t// Create a fresh harness, we'll be using the main harness to force a\n\t// re-org on this local harness.\n\tharness, err := New(&chaincfg.SimNetParams, nil, nil, \"\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err := harness.SetUp(true, 5); err != nil {\n\t\tt.Fatalf(\"unable to complete rpctest setup: %v\", err)\n\t}\n\tdefer harness.TearDown()\n\n\t// The internal wallet of this harness should now have 250 BTC.\n\texpectedBalance := btcutil.Amount(250 * btcutil.SatoshiPerBitcoin)\n\twalletBalance := harness.ConfirmedBalance()\n\tif expectedBalance != walletBalance {\n\t\tt.Fatalf(\"wallet balance incorrect: expected %v, got %v\",\n\t\t\texpectedBalance, walletBalance)\n\t}\n\n\t// Now connect this local harness to the main harness then wait for\n\t// their chains to synchronize.\n\tif err := ConnectNode(harness, r); err != nil {\n\t\tt.Fatalf(\"unable to connect harnesses: %v\", err)\n\t}\n\tnodeSlice := []*Harness{r, harness}\n\tif err := JoinNodes(nodeSlice, Blocks); err != nil {\n\t\tt.Fatalf(\"unable to join node on blocks: %v\", err)\n\t}\n\n\t// The original wallet should now have a balance of 0 BTC as its entire\n\t// chain should have been decimated in favor of the main harness'\n\t// chain.\n\texpectedBalance = btcutil.Amount(0)\n\twalletBalance = harness.ConfirmedBalance()\n\tif expectedBalance != walletBalance {\n\t\tt.Fatalf(\"wallet balance incorrect: expected %v, got %v\",\n\t\t\texpectedBalance, walletBalance)\n\t}\n}\n\nfunc testMemWalletLockedOutputs(r *Harness, t *testing.T) {\n\t// Obtain the initial balance of the wallet at this point.\n\tstartingBalance := r.ConfirmedBalance()\n\n\t// First, create a signed transaction spending some outputs.\n\taddr, err := r.NewAddress()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate new address: %v\", err)\n\t}\n\tpkScript, err := txscript.PayToAddrScript(addr)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create script: %v\", err)\n\t}\n\toutputAmt := btcutil.Amount(50 * btcutil.SatoshiPerBitcoin)\n\toutput := wire.NewTxOut(int64(outputAmt), pkScript)\n\ttx, err := r.CreateTransaction([]*wire.TxOut{output}, 10, true)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create transaction: %v\", err)\n\t}\n\n\t// The current wallet balance should now be at least 50 BTC less\n\t// (accounting for fees) than the period balance\n\tcurrentBalance := r.ConfirmedBalance()\n\tif !(currentBalance <= startingBalance-outputAmt) {\n\t\tt.Fatalf(\"spent outputs not locked: previous balance %v, \"+\n\t\t\t\"current balance %v\", startingBalance, currentBalance)\n\t}\n\n\t// Now unlocked all the spent inputs within the unbroadcast signed\n\t// transaction. The current balance should now be exactly that of the\n\t// starting balance.\n\tr.UnlockOutputs(tx.TxIn)\n\tcurrentBalance = r.ConfirmedBalance()\n\tif currentBalance != startingBalance {\n\t\tt.Fatalf(\"current and starting balance should now match: \"+\n\t\t\t\"expected %v, got %v\", startingBalance, currentBalance)\n\t}\n}\n\nvar harnessTestCases = []HarnessTestCase{\n\ttestSendOutputs,\n\ttestConnectNode,\n\ttestActiveHarnesses,\n\ttestJoinBlocks,\n\ttestJoinMempools, // Depends on results of testJoinBlocks\n\ttestGenerateAndSubmitBlock,\n\ttestGenerateAndSubmitBlockWithCustomCoinbaseOutputs,\n\ttestMemWalletReorg,\n\ttestMemWalletLockedOutputs,\n}\n\nvar mainHarness *Harness\n\nconst (\n\tnumMatureOutputs = 25\n)\n\nfunc TestMain(m *testing.M) {\n\tvar err error\n\tmainHarness, err = New(&chaincfg.SimNetParams, nil, nil, \"\")\n\tif err != nil {\n\t\tfmt.Println(\"unable to create main harness: \", err)\n\t\tos.Exit(1)\n\t}\n\n\t// Initialize the main mining node with a chain of length 125,\n\t// providing 25 mature coinbases to allow spending from for testing\n\t// purposes.\n\tif err = mainHarness.SetUp(true, numMatureOutputs); err != nil {\n\t\tfmt.Println(\"unable to setup test chain: \", err)\n\n\t\t// Even though the harness was not fully setup, it still needs\n\t\t// to be torn down to ensure all resources such as temp\n\t\t// directories are cleaned up.  The error is intentionally\n\t\t// ignored since this is already an error path and nothing else\n\t\t// could be done about it anyways.\n\t\t_ = mainHarness.TearDown()\n\t\tos.Exit(1)\n\t}\n\n\texitCode := m.Run()\n\n\t// Clean up any active harnesses that are still currently running.\n\tif len(ActiveHarnesses()) > 0 {\n\t\tif err := TearDownAll(); err != nil {\n\t\t\tfmt.Println(\"unable to tear down chain: \", err)\n\t\t\tos.Exit(1)\n\t\t}\n\t}\n\n\tos.Exit(exitCode)\n}\n\nfunc TestHarness(t *testing.T) {\n\t// We should have (numMatureOutputs * 50 BTC) of mature unspendable\n\t// outputs.\n\texpectedBalance := btcutil.Amount(numMatureOutputs * 50 * btcutil.SatoshiPerBitcoin)\n\tharnessBalance := mainHarness.ConfirmedBalance()\n\tif harnessBalance != expectedBalance {\n\t\tt.Fatalf(\"expected wallet balance of %v instead have %v\",\n\t\t\texpectedBalance, harnessBalance)\n\t}\n\n\t// Current tip should be at a height of numMatureOutputs plus the\n\t// required number of blocks for coinbase maturity.\n\tnodeInfo, err := mainHarness.Client.GetInfo()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to execute getinfo on node: %v\", err)\n\t}\n\texpectedChainHeight := numMatureOutputs + uint32(mainHarness.ActiveNet.CoinbaseMaturity)\n\tif uint32(nodeInfo.Blocks) != expectedChainHeight {\n\t\tt.Errorf(\"Chain height is %v, should be %v\",\n\t\t\tnodeInfo.Blocks, expectedChainHeight)\n\t}\n\n\tfor _, testCase := range harnessTestCases {\n\t\ttestCase(mainHarness, t)\n\t}\n\n\ttestTearDownAll(t)\n}\n"
  },
  {
    "path": "integration/rpctest/utils.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpctest\n\nimport (\n\t\"reflect\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/rpcclient\"\n)\n\n// JoinType is an enum representing a particular type of \"node join\". A node\n// join is a synchronization tool used to wait until a subset of nodes have a\n// consistent state with respect to an attribute.\ntype JoinType uint8\n\nconst (\n\t// Blocks is a JoinType which waits until all nodes share the same\n\t// block height.\n\tBlocks JoinType = iota\n\n\t// Mempools is a JoinType which blocks until all nodes have identical\n\t// mempool.\n\tMempools\n)\n\n// JoinNodes is a synchronization tool used to block until all passed nodes are\n// fully synced with respect to an attribute. This function will block for a\n// period of time, finally returning once all nodes are synced according to the\n// passed JoinType. This function be used to to ensure all active test\n// harnesses are at a consistent state before proceeding to an assertion or\n// check within rpc tests.\nfunc JoinNodes(nodes []*Harness, joinType JoinType) error {\n\tswitch joinType {\n\tcase Blocks:\n\t\treturn syncBlocks(nodes)\n\tcase Mempools:\n\t\treturn syncMempools(nodes)\n\t}\n\treturn nil\n}\n\n// syncMempools blocks until all nodes have identical mempools.\nfunc syncMempools(nodes []*Harness) error {\n\tpoolsMatch := false\n\nretry:\n\tfor !poolsMatch {\n\t\tfirstPool, err := nodes[0].Client.GetRawMempool()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// If all nodes have an identical mempool with respect to the\n\t\t// first node, then we're done. Otherwise, drop back to the top\n\t\t// of the loop and retry after a short wait period.\n\t\tfor _, node := range nodes[1:] {\n\t\t\tnodePool, err := node.Client.GetRawMempool()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif !reflect.DeepEqual(firstPool, nodePool) {\n\t\t\t\ttime.Sleep(time.Millisecond * 100)\n\t\t\t\tcontinue retry\n\t\t\t}\n\t\t}\n\n\t\tpoolsMatch = true\n\t}\n\n\treturn nil\n}\n\n// syncBlocks blocks until all nodes report the same best chain.\nfunc syncBlocks(nodes []*Harness) error {\n\tblocksMatch := false\n\nretry:\n\tfor !blocksMatch {\n\t\tvar prevHash *chainhash.Hash\n\t\tvar prevHeight int32\n\t\tfor _, node := range nodes {\n\t\t\tblockHash, blockHeight, err := node.Client.GetBestBlock()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif prevHash != nil && (*blockHash != *prevHash ||\n\t\t\t\tblockHeight != prevHeight) {\n\n\t\t\t\ttime.Sleep(time.Millisecond * 100)\n\t\t\t\tcontinue retry\n\t\t\t}\n\t\t\tprevHash, prevHeight = blockHash, blockHeight\n\t\t}\n\n\t\tblocksMatch = true\n\t}\n\n\treturn nil\n}\n\n// ConnectNode establishes a new peer-to-peer connection between the \"from\"\n// harness and the \"to\" harness.  The connection made is flagged as persistent,\n// therefore in the case of disconnects, \"from\" will attempt to reestablish a\n// connection to the \"to\" harness.\nfunc ConnectNode(from *Harness, to *Harness) error {\n\tpeerInfo, err := from.Client.GetPeerInfo()\n\tif err != nil {\n\t\treturn err\n\t}\n\tnumPeers := len(peerInfo)\n\n\ttargetAddr := to.node.config.listen\n\tif err := from.Client.AddNode(targetAddr, rpcclient.ANAdd); err != nil {\n\t\treturn err\n\t}\n\n\t// Block until a new connection has been established.\n\tpeerInfo, err = from.Client.GetPeerInfo()\n\tif err != nil {\n\t\treturn err\n\t}\n\tfor len(peerInfo) <= numPeers {\n\t\tpeerInfo, err = from.Client.GetPeerInfo()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// TearDownAll tears down all active test harnesses.\nfunc TearDownAll() error {\n\tharnessStateMtx.Lock()\n\tdefer harnessStateMtx.Unlock()\n\n\tfor _, harness := range testInstances {\n\t\tif err := harness.tearDown(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// ActiveHarnesses returns a slice of all currently active test harnesses. A\n// test harness if considered \"active\" if it has been created, but not yet torn\n// down.\nfunc ActiveHarnesses() []*Harness {\n\tharnessStateMtx.RLock()\n\tdefer harnessStateMtx.RUnlock()\n\n\tactiveNodes := make([]*Harness, 0, len(testInstances))\n\tfor _, harness := range testInstances {\n\t\tactiveNodes = append(activeNodes, harness)\n\t}\n\n\treturn activeNodes\n}\n"
  },
  {
    "path": "limits/limits_plan9.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage limits\n\n// SetLimits is a no-op on Plan 9 due to the lack of process accounting.\nfunc SetLimits() error {\n\treturn nil\n}\n"
  },
  {
    "path": "limits/limits_unix.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n//go:build !windows && !plan9\n// +build !windows,!plan9\n\npackage limits\n\nimport (\n\t\"fmt\"\n\t\"syscall\"\n)\n\nconst (\n\tfileLimitWant = 2048\n\tfileLimitMin  = 1024\n)\n\n// SetLimits raises some process limits to values which allow btcd and\n// associated utilities to run.\nfunc SetLimits() error {\n\tvar rLimit syscall.Rlimit\n\n\terr := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif rLimit.Cur > fileLimitWant {\n\t\treturn nil\n\t}\n\tif rLimit.Max < fileLimitMin {\n\t\terr = fmt.Errorf(\"need at least %v file descriptors\",\n\t\t\tfileLimitMin)\n\t\treturn err\n\t}\n\tif rLimit.Max < fileLimitWant {\n\t\trLimit.Cur = rLimit.Max\n\t} else {\n\t\trLimit.Cur = fileLimitWant\n\t}\n\terr = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)\n\tif err != nil {\n\t\t// try min value\n\t\trLimit.Cur = fileLimitMin\n\t\terr = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "limits/limits_windows.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage limits\n\n// SetLimits is a no-op on Windows since it's not required there.\nfunc SetLimits() error {\n\treturn nil\n}\n"
  },
  {
    "path": "log.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/btcsuite/btcd/addrmgr\"\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/blockchain/indexers\"\n\t\"github.com/btcsuite/btcd/connmgr\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/mempool\"\n\t\"github.com/btcsuite/btcd/mining\"\n\t\"github.com/btcsuite/btcd/mining/cpuminer\"\n\t\"github.com/btcsuite/btcd/netsync\"\n\t\"github.com/btcsuite/btcd/peer\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/v2transport\"\n\n\t\"github.com/btcsuite/btclog\"\n\t\"github.com/jrick/logrotate/rotator\"\n)\n\n// logWriter implements an io.Writer that outputs to both standard output and\n// the write-end pipe of an initialized log rotator.\ntype logWriter struct{}\n\nfunc (logWriter) Write(p []byte) (n int, err error) {\n\tos.Stdout.Write(p)\n\tlogRotator.Write(p)\n\treturn len(p), nil\n}\n\n// Loggers per subsystem.  A single backend logger is created and all subsystem\n// loggers created from it will write to the backend.  When adding new\n// subsystems, add the subsystem logger variable here and to the\n// subsystemLoggers map.\n//\n// Loggers can not be used before the log rotator has been initialized with a\n// log file.  This must be performed early during application startup by calling\n// initLogRotator.\nvar (\n\t// backendLog is the logging backend used to create all subsystem loggers.\n\t// The backend must not be used before the log rotator has been initialized,\n\t// or data races and/or nil pointer dereferences will occur.\n\tbackendLog = btclog.NewBackend(logWriter{})\n\n\t// logRotator is one of the logging outputs.  It should be closed on\n\t// application shutdown.\n\tlogRotator *rotator.Rotator\n\n\tadxrLog = backendLog.Logger(\"ADXR\")\n\tamgrLog = backendLog.Logger(\"AMGR\")\n\tcmgrLog = backendLog.Logger(\"CMGR\")\n\tbcdbLog = backendLog.Logger(\"BCDB\")\n\tbtcdLog = backendLog.Logger(\"BTCD\")\n\tchanLog = backendLog.Logger(\"CHAN\")\n\tdiscLog = backendLog.Logger(\"DISC\")\n\tindxLog = backendLog.Logger(\"INDX\")\n\tminrLog = backendLog.Logger(\"MINR\")\n\tpeerLog = backendLog.Logger(\"PEER\")\n\trpcsLog = backendLog.Logger(\"RPCS\")\n\tscrpLog = backendLog.Logger(\"SCRP\")\n\tsrvrLog = backendLog.Logger(\"SRVR\")\n\tsyncLog = backendLog.Logger(\"SYNC\")\n\ttxmpLog = backendLog.Logger(\"TXMP\")\n\tv2trLog = backendLog.Logger(v2transport.Subsystem)\n)\n\n// Initialize package-global logger variables.\nfunc init() {\n\taddrmgr.UseLogger(amgrLog)\n\tconnmgr.UseLogger(cmgrLog)\n\tdatabase.UseLogger(bcdbLog)\n\tblockchain.UseLogger(chanLog)\n\tindexers.UseLogger(indxLog)\n\tmining.UseLogger(minrLog)\n\tcpuminer.UseLogger(minrLog)\n\tpeer.UseLogger(peerLog)\n\ttxscript.UseLogger(scrpLog)\n\tnetsync.UseLogger(syncLog)\n\tmempool.UseLogger(txmpLog)\n\tv2transport.UseLogger(v2trLog)\n}\n\n// subsystemLoggers maps each subsystem identifier to its associated logger.\nvar subsystemLoggers = map[string]btclog.Logger{\n\t\"ADXR\":                adxrLog,\n\t\"AMGR\":                amgrLog,\n\t\"CMGR\":                cmgrLog,\n\t\"BCDB\":                bcdbLog,\n\t\"BTCD\":                btcdLog,\n\t\"CHAN\":                chanLog,\n\t\"DISC\":                discLog,\n\t\"INDX\":                indxLog,\n\t\"MINR\":                minrLog,\n\t\"PEER\":                peerLog,\n\t\"RPCS\":                rpcsLog,\n\t\"SCRP\":                scrpLog,\n\t\"SRVR\":                srvrLog,\n\t\"SYNC\":                syncLog,\n\t\"TXMP\":                txmpLog,\n\tv2transport.Subsystem: v2trLog,\n}\n\n// initLogRotator initializes the logging rotater to write logs to logFile and\n// create roll files in the same directory.  It must be called before the\n// package-global log rotater variables are used.\nfunc initLogRotator(logFile string) {\n\tlogDir, _ := filepath.Split(logFile)\n\terr := os.MkdirAll(logDir, 0700)\n\tif err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"failed to create log directory: %v\\n\", err)\n\t\tos.Exit(1)\n\t}\n\tr, err := rotator.New(logFile, 10*1024, false, 3)\n\tif err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"failed to create file rotator: %v\\n\", err)\n\t\tos.Exit(1)\n\t}\n\n\tlogRotator = r\n}\n\n// setLogLevel sets the logging level for provided subsystem.  Invalid\n// subsystems are ignored.  Uninitialized subsystems are dynamically created as\n// needed.\nfunc setLogLevel(subsystemID string, logLevel string) {\n\t// Ignore invalid subsystems.\n\tlogger, ok := subsystemLoggers[subsystemID]\n\tif !ok {\n\t\treturn\n\t}\n\n\t// Defaults to info if the log level is invalid.\n\tlevel, _ := btclog.LevelFromString(logLevel)\n\tlogger.SetLevel(level)\n}\n\n// setLogLevels sets the log level for all subsystem loggers to the passed\n// level.  It also dynamically creates the subsystem loggers as needed, so it\n// can be used to initialize the logging system.\nfunc setLogLevels(logLevel string) {\n\t// Configure all sub-systems with the new logging level.  Dynamically\n\t// create loggers as needed.\n\tfor subsystemID := range subsystemLoggers {\n\t\tsetLogLevel(subsystemID, logLevel)\n\t}\n}\n\n// directionString is a helper function that returns a string that represents\n// the direction of a connection (inbound or outbound).\nfunc directionString(inbound bool) string {\n\tif inbound {\n\t\treturn \"inbound\"\n\t}\n\treturn \"outbound\"\n}\n\n// pickNoun returns the singular or plural form of a noun depending\n// on the count n.\nfunc pickNoun(n uint64, singular, plural string) string {\n\tif n == 1 {\n\t\treturn singular\n\t}\n\treturn plural\n}\n"
  },
  {
    "path": "mempool/README.md",
    "content": "mempool\n=======\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/mempool)\n\nPackage mempool provides a policy-enforced pool of unmined bitcoin transactions.\n\nA key responsibility of the bitcoin network is mining user-generated transactions\ninto blocks.  In order to facilitate this, the mining process relies on having a\nreadily-available source of transactions to include in a block that is being\nsolved.\n\nAt a high level, this package satisfies that requirement by providing an\nin-memory pool of fully validated transactions that can also optionally be\nfurther filtered based upon a configurable policy.\n\nOne of the policy configuration options controls whether or not \"standard\"\ntransactions are accepted.  In essence, a \"standard\" transaction is one that\nsatisfies a fairly strict set of requirements that are largely intended to help\nprovide fair use of the system to all users.  It is important to note that what\nis considered a \"standard\" transaction changes over time.  For some insight, at\nthe time of this writing, an example of _some_ of the criteria that are required\nfor a transaction to be considered standard are that it is of the most-recently\nsupported version, finalized, does not exceed a specific size, and only consists\nof specific script forms.\n\nSince this package does not deal with other bitcoin specifics such as network\ncommunication and transaction relay, it returns a list of transactions that were\naccepted which gives the caller a high level of flexibility in how they want to\nproceed.  Typically, this will involve things such as relaying the transactions\nto other peers on the network and notifying the mining process that new\ntransactions are available.\n\nThis package has intentionally been designed so it can be used as a standalone\npackage for any projects needing the ability create an in-memory pool of bitcoin\ntransactions that are not only valid by consensus rules, but also adhere to a\nconfigurable policy.\n\n## Feature Overview\n\nThe following is a quick overview of the major features.  It is not intended to\nbe an exhaustive list.\n\n- Maintain a pool of fully validated transactions\n  - Reject non-fully-spent duplicate transactions\n  - Reject coinbase transactions\n  - Reject double spends (both from the chain and other transactions in pool)\n  - Reject invalid transactions according to the network consensus rules\n  - Full script execution and validation with signature cache support\n  - Individual transaction query support\n- Orphan transaction support (transactions that spend from unknown outputs)\n  - Configurable limits (see transaction acceptance policy)\n  - Automatic addition of orphan transactions that are no longer orphans as new\n    transactions are added to the pool\n  - Individual orphan transaction query support\n- Configurable transaction acceptance policy\n  - Option to accept or reject standard transactions\n  - Option to accept or reject transactions based on priority calculations\n  - Rate limiting of low-fee and free transactions\n  - Non-zero fee threshold\n  - Max signature operations per transaction\n  - Max orphan transaction size\n  - Max number of orphan transactions allowed\n- Additional metadata tracking for each transaction\n  - Timestamp when the transaction was added to the pool\n  - Most recent block height when the transaction was added to the pool\n  - The fee the transaction pays\n  - The starting priority for the transaction\n- Manual control of transaction removal\n  - Recursive removal of all dependent transactions\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/mempool\n```\n\n## License\n\nPackage mempool is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "mempool/doc.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage mempool provides a policy-enforced pool of unmined bitcoin transactions.\n\nA key responsibility of the bitcoin network is mining user-generated transactions\ninto blocks.  In order to facilitate this, the mining process relies on having a\nreadily-available source of transactions to include in a block that is being\nsolved.\n\nAt a high level, this package satisfies that requirement by providing an\nin-memory pool of fully validated transactions that can also optionally be\nfurther filtered based upon a configurable policy.\n\nOne of the policy configuration options controls whether or not \"standard\"\ntransactions are accepted.  In essence, a \"standard\" transaction is one that\nsatisfies a fairly strict set of requirements that are largely intended to help\nprovide fair use of the system to all users.  It is important to note that what\nis considered a \"standard\" transaction changes over time.  For some insight, at\nthe time of this writing, an example of SOME of the criteria that are required\nfor a transaction to be considered standard are that it is of the most-recently\nsupported version, finalized, does not exceed a specific size, and only consists\nof specific script forms.\n\nSince this package does not deal with other bitcoin specifics such as network\ncommunication and transaction relay, it returns a list of transactions that were\naccepted which gives the caller a high level of flexibility in how they want to\nproceed.  Typically, this will involve things such as relaying the transactions\nto other peers on the network and notifying the mining process that new\ntransactions are available.\n\n# Feature Overview\n\nThe following is a quick overview of the major features.  It is not intended to\nbe an exhaustive list.\n\n  - Maintain a pool of fully validated transactions\n    1. Reject non-fully-spent duplicate transactions\n    2. Reject coinbase transactions\n    3. Reject double spends (both from the chain and other transactions in pool)\n    4. Reject invalid transactions according to the network consensus rules\n    5. Full script execution and validation with signature cache support\n    6. Individual transaction query support\n  - Orphan transaction support (transactions that spend from unknown outputs)\n    1. Configurable limits (see transaction acceptance policy)\n    2. Automatic addition of orphan transactions that are no longer orphans as new\n    transactions are added to the pool\n    3. Individual orphan transaction query support\n  - Configurable transaction acceptance policy\n    1. Option to accept or reject standard transactions\n    2. Option to accept or reject transactions based on priority calculations\n    3. Rate limiting of low-fee and free transactions\n    4. Non-zero fee threshold\n    5. Max signature operations per transaction\n    6. Max orphan transaction size\n    7. Max number of orphan transactions allowed\n  - Additional metadata tracking for each transaction\n    1. Timestamp when the transaction was added to the pool\n    2. Most recent block height when the transaction was added to the pool\n    3. The fee the transaction pays\n    4. The starting priority for the transaction\n  - Manual control of transaction removal\n    1. Recursive removal of all dependent transactions\n\n# Errors\n\nErrors returned by this package are either the raw errors provided by underlying\ncalls or of type mempool.RuleError.  Since there are two classes of rules\n(mempool acceptance rules and blockchain (consensus) acceptance rules), the\nmempool.RuleError type contains a single Err field which will, in turn, either\nbe a mempool.TxRuleError or a blockchain.RuleError.  The first indicates a\nviolation of mempool acceptance rules while the latter indicates a violation of\nconsensus acceptance rules.  This allows the caller to easily differentiate\nbetween unexpected errors, such as database errors, versus errors due to rule\nviolations through type assertions.  In addition, callers can programmatically\ndetermine the specific rule violation by type asserting the Err field to one of\nthe aforementioned types and examining their underlying ErrorCode field.\n*/\npackage mempool\n"
  },
  {
    "path": "mempool/error.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mempool\n\nimport (\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// RuleError identifies a rule violation.  It is used to indicate that\n// processing of a transaction failed due to one of the many validation\n// rules.  The caller can use type assertions to determine if a failure was\n// specifically due to a rule violation and use the Err field to access the\n// underlying error, which will be either a TxRuleError or a\n// blockchain.RuleError.\ntype RuleError struct {\n\tErr error\n}\n\n// Error satisfies the error interface and prints human-readable errors.\nfunc (e RuleError) Error() string {\n\tif e.Err == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn e.Err.Error()\n}\n\n// TxRuleError identifies a rule violation.  It is used to indicate that\n// processing of a transaction failed due to one of the many validation\n// rules.  The caller can use type assertions to determine if a failure was\n// specifically due to a rule violation and access the ErrorCode field to\n// ascertain the specific reason for the rule violation.\ntype TxRuleError struct {\n\tRejectCode  wire.RejectCode // The code to send with reject messages\n\tDescription string          // Human readable description of the issue\n}\n\n// Error satisfies the error interface and prints human-readable errors.\nfunc (e TxRuleError) Error() string {\n\treturn e.Description\n}\n\n// txRuleError creates an underlying TxRuleError with the given a set of\n// arguments and returns a RuleError that encapsulates it.\nfunc txRuleError(c wire.RejectCode, desc string) RuleError {\n\treturn RuleError{\n\t\tErr: TxRuleError{RejectCode: c, Description: desc},\n\t}\n}\n\n// chainRuleError returns a RuleError that encapsulates the given\n// blockchain.RuleError.\nfunc chainRuleError(chainErr blockchain.RuleError) RuleError {\n\treturn RuleError{\n\t\tErr: chainErr,\n\t}\n}\n\n// extractRejectCode attempts to return a relevant reject code for a given error\n// by examining the error for known types.  It will return true if a code\n// was successfully extracted.\nfunc extractRejectCode(err error) (wire.RejectCode, bool) {\n\t// Pull the underlying error out of a RuleError.\n\tif rerr, ok := err.(RuleError); ok {\n\t\terr = rerr.Err\n\t}\n\n\tswitch err := err.(type) {\n\tcase blockchain.RuleError:\n\t\t// Convert the chain error to a reject code.\n\t\tvar code wire.RejectCode\n\t\tswitch err.ErrorCode {\n\t\t// Rejected due to duplicate.\n\t\tcase blockchain.ErrDuplicateBlock:\n\t\t\tcode = wire.RejectDuplicate\n\n\t\t// Rejected due to obsolete version.\n\t\tcase blockchain.ErrBlockVersionTooOld:\n\t\t\tcode = wire.RejectObsolete\n\n\t\t// Rejected due to checkpoint.\n\t\tcase blockchain.ErrCheckpointTimeTooOld:\n\t\t\tfallthrough\n\t\tcase blockchain.ErrDifficultyTooLow:\n\t\t\tfallthrough\n\t\tcase blockchain.ErrBadCheckpoint:\n\t\t\tfallthrough\n\t\tcase blockchain.ErrForkTooOld:\n\t\t\tcode = wire.RejectCheckpoint\n\n\t\t// Everything else is due to the block or transaction being invalid.\n\t\tdefault:\n\t\t\tcode = wire.RejectInvalid\n\t\t}\n\n\t\treturn code, true\n\n\tcase TxRuleError:\n\t\treturn err.RejectCode, true\n\n\tcase nil:\n\t\treturn wire.RejectInvalid, false\n\t}\n\n\treturn wire.RejectInvalid, false\n}\n\n// ErrToRejectErr examines the underlying type of the error and returns a reject\n// code and string appropriate to be sent in a wire.MsgReject message.\nfunc ErrToRejectErr(err error) (wire.RejectCode, string) {\n\t// Return the reject code along with the error text if it can be\n\t// extracted from the error.\n\trejectCode, found := extractRejectCode(err)\n\tif found {\n\t\treturn rejectCode, err.Error()\n\t}\n\n\t// Return a generic rejected string if there is no error.  This really\n\t// should not happen unless the code elsewhere is not setting an error\n\t// as it should be, but it's best to be safe and simply return a generic\n\t// string rather than allowing the following code that dereferences the\n\t// err to panic.\n\tif err == nil {\n\t\treturn wire.RejectInvalid, \"rejected\"\n\t}\n\n\t// When the underlying error is not one of the above cases, just return\n\t// wire.RejectInvalid with a generic rejected string plus the error\n\t// text.\n\treturn wire.RejectInvalid, \"rejected: \" + err.Error()\n}\n"
  },
  {
    "path": "mempool/estimatefee.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mempool\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"math/rand\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/mining\"\n)\n\n// TODO incorporate Alex Morcos' modifications to Gavin's initial model\n// https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2014-October/006824.html\n\nconst (\n\t// estimateFeeDepth is the maximum number of blocks before a transaction\n\t// is confirmed that we want to track.\n\testimateFeeDepth = 25\n\n\t// estimateFeeBinSize is the number of txs stored in each bin.\n\testimateFeeBinSize = 100\n\n\t// estimateFeeMaxReplacements is the max number of replacements that\n\t// can be made by the txs found in a given block.\n\testimateFeeMaxReplacements = 10\n\n\t// DefaultEstimateFeeMaxRollback is the default number of rollbacks\n\t// allowed by the fee estimator for orphaned blocks.\n\tDefaultEstimateFeeMaxRollback = 2\n\n\t// DefaultEstimateFeeMinRegisteredBlocks is the default minimum\n\t// number of blocks which must be observed by the fee estimator before\n\t// it will provide fee estimations.\n\tDefaultEstimateFeeMinRegisteredBlocks = 3\n\n\tbytePerKb = 1000\n\n\tbtcPerSatoshi = 1e-8\n)\n\nvar (\n\t// EstimateFeeDatabaseKey is the key that we use to\n\t// store the fee estimator in the database.\n\tEstimateFeeDatabaseKey = []byte(\"estimatefee\")\n)\n\n// SatoshiPerByte is number with units of satoshis per byte.\ntype SatoshiPerByte float64\n\n// BtcPerKilobyte is number with units of bitcoins per kilobyte.\ntype BtcPerKilobyte float64\n\n// ToBtcPerKb returns a float value that represents the given\n// SatoshiPerByte converted to satoshis per kb.\nfunc (rate SatoshiPerByte) ToBtcPerKb() BtcPerKilobyte {\n\t// If our rate is the error value, return that.\n\tif rate == SatoshiPerByte(-1.0) {\n\t\treturn -1.0\n\t}\n\n\treturn BtcPerKilobyte(float64(rate) * bytePerKb * btcPerSatoshi)\n}\n\n// Fee returns the fee for a transaction of a given size for\n// the given fee rate.\nfunc (rate SatoshiPerByte) Fee(size uint32) btcutil.Amount {\n\t// If our rate is the error value, return that.\n\tif rate == SatoshiPerByte(-1) {\n\t\treturn btcutil.Amount(-1)\n\t}\n\n\treturn btcutil.Amount(float64(rate) * float64(size))\n}\n\n// NewSatoshiPerByte creates a SatoshiPerByte from an Amount and a\n// size in bytes.\nfunc NewSatoshiPerByte(fee btcutil.Amount, size uint32) SatoshiPerByte {\n\treturn SatoshiPerByte(float64(fee) / float64(size))\n}\n\n// observedTransaction represents an observed transaction and some\n// additional data required for the fee estimation algorithm.\ntype observedTransaction struct {\n\t// A transaction hash.\n\thash chainhash.Hash\n\n\t// The fee per byte of the transaction in satoshis.\n\tfeeRate SatoshiPerByte\n\n\t// The block height when it was observed.\n\tobserved int32\n\n\t// The height of the block in which it was mined.\n\t// If the transaction has not yet been mined, it is zero.\n\tmined int32\n}\n\nfunc (o *observedTransaction) Serialize(w io.Writer) {\n\tbinary.Write(w, binary.BigEndian, o.hash)\n\tbinary.Write(w, binary.BigEndian, o.feeRate)\n\tbinary.Write(w, binary.BigEndian, o.observed)\n\tbinary.Write(w, binary.BigEndian, o.mined)\n}\n\nfunc deserializeObservedTransaction(r io.Reader) (*observedTransaction, error) {\n\tot := observedTransaction{}\n\n\t// The first 32 bytes should be a hash.\n\tbinary.Read(r, binary.BigEndian, &ot.hash)\n\n\t// The next 8 are SatoshiPerByte\n\tbinary.Read(r, binary.BigEndian, &ot.feeRate)\n\n\t// And next there are two uint32's.\n\tbinary.Read(r, binary.BigEndian, &ot.observed)\n\tbinary.Read(r, binary.BigEndian, &ot.mined)\n\n\treturn &ot, nil\n}\n\n// registeredBlock has the hash of a block and the list of transactions\n// it mined which had been previously observed by the FeeEstimator. It\n// is used if Rollback is called to reverse the effect of registering\n// a block.\ntype registeredBlock struct {\n\thash         chainhash.Hash\n\ttransactions []*observedTransaction\n}\n\nfunc (rb *registeredBlock) serialize(w io.Writer, txs map[*observedTransaction]uint32) {\n\tbinary.Write(w, binary.BigEndian, rb.hash)\n\n\tbinary.Write(w, binary.BigEndian, uint32(len(rb.transactions)))\n\tfor _, o := range rb.transactions {\n\t\tbinary.Write(w, binary.BigEndian, txs[o])\n\t}\n}\n\n// FeeEstimator manages the data necessary to create\n// fee estimations. It is safe for concurrent access.\ntype FeeEstimator struct {\n\tmaxRollback uint32\n\tbinSize     int32\n\n\t// The maximum number of replacements that can be made in a single\n\t// bin per block. Default is estimateFeeMaxReplacements\n\tmaxReplacements int32\n\n\t// The minimum number of blocks that can be registered with the fee\n\t// estimator before it will provide answers.\n\tminRegisteredBlocks uint32\n\n\t// The last known height.\n\tlastKnownHeight int32\n\n\t// The number of blocks that have been registered.\n\tnumBlocksRegistered uint32\n\n\tmtx      sync.RWMutex\n\tobserved map[chainhash.Hash]*observedTransaction\n\tbin      [estimateFeeDepth][]*observedTransaction\n\n\t// The cached estimates.\n\tcached []SatoshiPerByte\n\n\t// Transactions that have been removed from the bins. This allows us to\n\t// revert in case of an orphaned block.\n\tdropped []*registeredBlock\n}\n\n// NewFeeEstimator creates a FeeEstimator for which at most maxRollback blocks\n// can be unregistered and which returns an error unless minRegisteredBlocks\n// have been registered with it.\nfunc NewFeeEstimator(maxRollback, minRegisteredBlocks uint32) *FeeEstimator {\n\treturn &FeeEstimator{\n\t\tmaxRollback:         maxRollback,\n\t\tminRegisteredBlocks: minRegisteredBlocks,\n\t\tlastKnownHeight:     mining.UnminedHeight,\n\t\tbinSize:             estimateFeeBinSize,\n\t\tmaxReplacements:     estimateFeeMaxReplacements,\n\t\tobserved:            make(map[chainhash.Hash]*observedTransaction),\n\t\tdropped:             make([]*registeredBlock, 0, maxRollback),\n\t}\n}\n\n// ObserveTransaction is called when a new transaction is observed in the mempool.\nfunc (ef *FeeEstimator) ObserveTransaction(t *TxDesc) {\n\tef.mtx.Lock()\n\tdefer ef.mtx.Unlock()\n\n\t// If we haven't seen a block yet we don't know when this one arrived,\n\t// so we ignore it.\n\tif ef.lastKnownHeight == mining.UnminedHeight {\n\t\treturn\n\t}\n\n\thash := *t.Tx.Hash()\n\tif _, ok := ef.observed[hash]; !ok {\n\t\tsize := uint32(GetTxVirtualSize(t.Tx))\n\n\t\tef.observed[hash] = &observedTransaction{\n\t\t\thash:     hash,\n\t\t\tfeeRate:  NewSatoshiPerByte(btcutil.Amount(t.Fee), size),\n\t\t\tobserved: t.Height,\n\t\t\tmined:    mining.UnminedHeight,\n\t\t}\n\t}\n}\n\n// RegisterBlock informs the fee estimator of a new block to take into account.\nfunc (ef *FeeEstimator) RegisterBlock(block *btcutil.Block) error {\n\tef.mtx.Lock()\n\tdefer ef.mtx.Unlock()\n\n\t// The previous sorted list is invalid, so delete it.\n\tef.cached = nil\n\n\theight := block.Height()\n\tif height != ef.lastKnownHeight+1 && ef.lastKnownHeight != mining.UnminedHeight {\n\t\treturn fmt.Errorf(\"intermediate block not recorded; current height is %d; new height is %d\",\n\t\t\tef.lastKnownHeight, height)\n\t}\n\n\t// Update the last known height.\n\tef.lastKnownHeight = height\n\tef.numBlocksRegistered++\n\n\t// Randomly order txs in block.\n\ttransactions := make(map[*btcutil.Tx]struct{})\n\tfor _, t := range block.Transactions() {\n\t\ttransactions[t] = struct{}{}\n\t}\n\n\t// Count the number of replacements we make per bin so that we don't\n\t// replace too many.\n\tvar replacementCounts [estimateFeeDepth]int\n\n\t// Keep track of which txs were dropped in case of an orphan block.\n\tdropped := &registeredBlock{\n\t\thash:         *block.Hash(),\n\t\ttransactions: make([]*observedTransaction, 0, 100),\n\t}\n\n\t// Go through the txs in the block.\n\tfor t := range transactions {\n\t\thash := *t.Hash()\n\n\t\t// Have we observed this tx in the mempool?\n\t\to, ok := ef.observed[hash]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Put the observed tx in the oppropriate bin.\n\t\tblocksToConfirm := height - o.observed - 1\n\n\t\t// This shouldn't happen if the fee estimator works correctly,\n\t\t// but return an error if it does.\n\t\tif o.mined != mining.UnminedHeight {\n\t\t\tlog.Error(\"Estimate fee: transaction \", hash.String(), \" has already been mined\")\n\t\t\treturn errors.New(\"Transaction has already been mined\")\n\t\t}\n\n\t\t// This shouldn't happen but check just in case to avoid\n\t\t// an out-of-bounds array index later.\n\t\t//\n\t\t// Also check that blocksToConfirm is not negative as this causes\n\t\t// the node to crash on reorgs.  A tx that was observed at height X\n\t\t// might be included in heights less than X because of chain reorgs.\n\t\t// Refer to github.com/btcsuite/btcd/issues/1660 for more information.\n\t\t//\n\t\t// TODO(kcalvinalvin) a better design that doesn't just skip over the\n\t\t// transaction would result in a more accurate fee estimator.  Properly\n\t\t// implement this later.\n\t\tif blocksToConfirm >= estimateFeeDepth || blocksToConfirm < 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Make sure we do not replace too many transactions per min.\n\t\tif replacementCounts[blocksToConfirm] == int(ef.maxReplacements) {\n\t\t\tcontinue\n\t\t}\n\n\t\to.mined = height\n\n\t\treplacementCounts[blocksToConfirm]++\n\n\t\tbin := ef.bin[blocksToConfirm]\n\n\t\t// Remove a random element and replace it with this new tx.\n\t\tif len(bin) == int(ef.binSize) {\n\t\t\t// Don't drop transactions we have just added from this same block.\n\t\t\tl := int(ef.binSize) - replacementCounts[blocksToConfirm]\n\t\t\tdrop := rand.Intn(l)\n\t\t\tdropped.transactions = append(dropped.transactions, bin[drop])\n\n\t\t\tbin[drop] = bin[l-1]\n\t\t\tbin[l-1] = o\n\t\t} else {\n\t\t\tbin = append(bin, o)\n\t\t}\n\t\tef.bin[blocksToConfirm] = bin\n\t}\n\n\t// Go through the mempool for txs that have been in too long.\n\tfor hash, o := range ef.observed {\n\t\tif o.mined == mining.UnminedHeight && height-o.observed >= estimateFeeDepth {\n\t\t\tdelete(ef.observed, hash)\n\t\t}\n\t}\n\n\t// Add dropped list to history.\n\tif ef.maxRollback == 0 {\n\t\treturn nil\n\t}\n\n\tif uint32(len(ef.dropped)) == ef.maxRollback {\n\t\tef.dropped = append(ef.dropped[1:], dropped)\n\t} else {\n\t\tef.dropped = append(ef.dropped, dropped)\n\t}\n\n\treturn nil\n}\n\n// LastKnownHeight returns the height of the last block which was registered.\nfunc (ef *FeeEstimator) LastKnownHeight() int32 {\n\tef.mtx.Lock()\n\tdefer ef.mtx.Unlock()\n\n\treturn ef.lastKnownHeight\n}\n\n// Rollback unregisters a recently registered block from the FeeEstimator.\n// This can be used to reverse the effect of an orphaned block on the fee\n// estimator. The maximum number of rollbacks allowed is given by\n// maxRollbacks.\n//\n// Note: not everything can be rolled back because some transactions are\n// deleted if they have been observed too long ago. That means the result\n// of Rollback won't always be exactly the same as if the last block had not\n// happened, but it should be close enough.\nfunc (ef *FeeEstimator) Rollback(hash *chainhash.Hash) error {\n\tef.mtx.Lock()\n\tdefer ef.mtx.Unlock()\n\n\t// Find this block in the stack of recent registered blocks.\n\tvar n int\n\tfor n = 1; n <= len(ef.dropped); n++ {\n\t\tif ef.dropped[len(ef.dropped)-n].hash.IsEqual(hash) {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif n > len(ef.dropped) {\n\t\treturn errors.New(\"no such block was recently registered\")\n\t}\n\n\tfor i := 0; i < n; i++ {\n\t\tef.rollback()\n\t}\n\n\treturn nil\n}\n\n// rollback rolls back the effect of the last block in the stack\n// of registered blocks.\nfunc (ef *FeeEstimator) rollback() {\n\t// The previous sorted list is invalid, so delete it.\n\tef.cached = nil\n\n\t// pop the last list of dropped txs from the stack.\n\tlast := len(ef.dropped) - 1\n\tif last == -1 {\n\t\t// Cannot really happen because the exported calling function\n\t\t// only rolls back a block already known to be in the list\n\t\t// of dropped transactions.\n\t\treturn\n\t}\n\n\tdropped := ef.dropped[last]\n\n\t// where we are in each bin as we replace txs?\n\tvar replacementCounters [estimateFeeDepth]int\n\n\t// Go through the txs in the dropped block.\n\tfor _, o := range dropped.transactions {\n\t\t// Which bin was this tx in?\n\t\tblocksToConfirm := o.mined - o.observed - 1\n\n\t\tbin := ef.bin[blocksToConfirm]\n\n\t\tvar counter = replacementCounters[blocksToConfirm]\n\n\t\t// Continue to go through that bin where we left off.\n\t\tfor {\n\t\t\tif counter >= len(bin) {\n\t\t\t\t// Panic, as we have entered an unrecoverable invalid state.\n\t\t\t\tpanic(errors.New(\"illegal state: cannot rollback dropped transaction\"))\n\t\t\t}\n\n\t\t\tprev := bin[counter]\n\n\t\t\tif prev.mined == ef.lastKnownHeight {\n\t\t\t\tprev.mined = mining.UnminedHeight\n\n\t\t\t\tbin[counter] = o\n\n\t\t\t\tcounter++\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tcounter++\n\t\t}\n\n\t\treplacementCounters[blocksToConfirm] = counter\n\t}\n\n\t// Continue going through bins to find other txs to remove\n\t// which did not replace any other when they were entered.\n\tfor i, j := range replacementCounters {\n\t\tfor {\n\t\t\tl := len(ef.bin[i])\n\t\t\tif j >= l {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tprev := ef.bin[i][j]\n\n\t\t\tif prev.mined == ef.lastKnownHeight {\n\t\t\t\tprev.mined = mining.UnminedHeight\n\n\t\t\t\tnewBin := append(ef.bin[i][0:j], ef.bin[i][j+1:l]...)\n\t\t\t\t// TODO This line should prevent an unintentional memory\n\t\t\t\t// leak but it causes a panic when it is uncommented.\n\t\t\t\t// ef.bin[i][j] = nil\n\t\t\t\tef.bin[i] = newBin\n\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tj++\n\t\t}\n\t}\n\n\tef.dropped = ef.dropped[0:last]\n\n\t// The number of blocks the fee estimator has seen is decrimented.\n\tef.numBlocksRegistered--\n\tef.lastKnownHeight--\n}\n\n// estimateFeeSet is a set of txs that can that is sorted\n// by the fee per kb rate.\ntype estimateFeeSet struct {\n\tfeeRate []SatoshiPerByte\n\tbin     [estimateFeeDepth]uint32\n}\n\nfunc (b *estimateFeeSet) Len() int { return len(b.feeRate) }\n\nfunc (b *estimateFeeSet) Less(i, j int) bool {\n\treturn b.feeRate[i] > b.feeRate[j]\n}\n\nfunc (b *estimateFeeSet) Swap(i, j int) {\n\tb.feeRate[i], b.feeRate[j] = b.feeRate[j], b.feeRate[i]\n}\n\n// estimateFee returns the estimated fee for a transaction\n// to confirm in confirmations blocks from now, given\n// the data set we have collected.\nfunc (b *estimateFeeSet) estimateFee(confirmations int) SatoshiPerByte {\n\tif confirmations <= 0 {\n\t\treturn SatoshiPerByte(math.Inf(1))\n\t}\n\n\tif confirmations > estimateFeeDepth {\n\t\treturn 0\n\t}\n\n\t// We don't have any transactions!\n\tif len(b.feeRate) == 0 {\n\t\treturn 0\n\t}\n\n\tvar min, max int = 0, 0\n\tfor i := 0; i < confirmations-1; i++ {\n\t\tmin += int(b.bin[i])\n\t}\n\n\tmax = min + int(b.bin[confirmations-1]) - 1\n\tif max < min {\n\t\tmax = min\n\t}\n\tfeeIndex := (min + max) / 2\n\tif feeIndex >= len(b.feeRate) {\n\t\tfeeIndex = len(b.feeRate) - 1\n\t}\n\n\treturn b.feeRate[feeIndex]\n}\n\n// newEstimateFeeSet creates a temporary data structure that\n// can be used to find all fee estimates.\nfunc (ef *FeeEstimator) newEstimateFeeSet() *estimateFeeSet {\n\tset := &estimateFeeSet{}\n\n\tcapacity := 0\n\tfor i, b := range ef.bin {\n\t\tl := len(b)\n\t\tset.bin[i] = uint32(l)\n\t\tcapacity += l\n\t}\n\n\tset.feeRate = make([]SatoshiPerByte, capacity)\n\n\ti := 0\n\tfor _, b := range ef.bin {\n\t\tfor _, o := range b {\n\t\t\tset.feeRate[i] = o.feeRate\n\t\t\ti++\n\t\t}\n\t}\n\n\tsort.Sort(set)\n\n\treturn set\n}\n\n// estimates returns the set of all fee estimates from 1 to estimateFeeDepth\n// confirmations from now.\nfunc (ef *FeeEstimator) estimates() []SatoshiPerByte {\n\tset := ef.newEstimateFeeSet()\n\n\testimates := make([]SatoshiPerByte, estimateFeeDepth)\n\tfor i := 0; i < estimateFeeDepth; i++ {\n\t\testimates[i] = set.estimateFee(i + 1)\n\t}\n\n\treturn estimates\n}\n\n// EstimateFee estimates the fee per byte to have a tx confirmed a given\n// number of blocks from now.\nfunc (ef *FeeEstimator) EstimateFee(numBlocks uint32) (BtcPerKilobyte, error) {\n\tef.mtx.Lock()\n\tdefer ef.mtx.Unlock()\n\n\t// If the number of registered blocks is below the minimum, return\n\t// an error.\n\tif ef.numBlocksRegistered < ef.minRegisteredBlocks {\n\t\treturn -1, errors.New(\"not enough blocks have been observed\")\n\t}\n\n\tif numBlocks == 0 {\n\t\treturn -1, errors.New(\"cannot confirm transaction in zero blocks\")\n\t}\n\n\tif numBlocks > estimateFeeDepth {\n\t\treturn -1, fmt.Errorf(\n\t\t\t\"can only estimate fees for up to %d blocks from now\",\n\t\t\testimateFeeDepth)\n\t}\n\n\t// If there are no cached results, generate them.\n\tif ef.cached == nil {\n\t\tef.cached = ef.estimates()\n\t}\n\n\treturn ef.cached[int(numBlocks)-1].ToBtcPerKb(), nil\n}\n\n// In case the format for the serialized version of the FeeEstimator changes,\n// we use a version number. If the version number changes, it does not make\n// sense to try to upgrade a previous version to a new version. Instead, just\n// start fee estimation over.\nconst estimateFeeSaveVersion = 1\n\nfunc deserializeRegisteredBlock(r io.Reader, txs map[uint32]*observedTransaction) (*registeredBlock, error) {\n\tvar lenTransactions uint32\n\n\trb := &registeredBlock{}\n\tbinary.Read(r, binary.BigEndian, &rb.hash)\n\tbinary.Read(r, binary.BigEndian, &lenTransactions)\n\n\trb.transactions = make([]*observedTransaction, lenTransactions)\n\n\tfor i := uint32(0); i < lenTransactions; i++ {\n\t\tvar index uint32\n\t\tbinary.Read(r, binary.BigEndian, &index)\n\t\trb.transactions[i] = txs[index]\n\t}\n\n\treturn rb, nil\n}\n\n// FeeEstimatorState represents a saved FeeEstimator that can be\n// restored with data from an earlier session of the program.\ntype FeeEstimatorState []byte\n\n// observedTxSet is a set of txs that can that is sorted\n// by hash. It exists for serialization purposes so that\n// a serialized state always comes out the same.\ntype observedTxSet []*observedTransaction\n\nfunc (q observedTxSet) Len() int { return len(q) }\n\nfunc (q observedTxSet) Less(i, j int) bool {\n\treturn strings.Compare(q[i].hash.String(), q[j].hash.String()) < 0\n}\n\nfunc (q observedTxSet) Swap(i, j int) {\n\tq[i], q[j] = q[j], q[i]\n}\n\n// Save records the current state of the FeeEstimator to a []byte that\n// can be restored later.\nfunc (ef *FeeEstimator) Save() FeeEstimatorState {\n\tef.mtx.Lock()\n\tdefer ef.mtx.Unlock()\n\n\t// TODO figure out what the capacity should be.\n\tw := bytes.NewBuffer(make([]byte, 0))\n\n\tbinary.Write(w, binary.BigEndian, uint32(estimateFeeSaveVersion))\n\n\t// Insert basic parameters.\n\tbinary.Write(w, binary.BigEndian, &ef.maxRollback)\n\tbinary.Write(w, binary.BigEndian, &ef.binSize)\n\tbinary.Write(w, binary.BigEndian, &ef.maxReplacements)\n\tbinary.Write(w, binary.BigEndian, &ef.minRegisteredBlocks)\n\tbinary.Write(w, binary.BigEndian, &ef.lastKnownHeight)\n\tbinary.Write(w, binary.BigEndian, &ef.numBlocksRegistered)\n\n\t// Put all the observed transactions in a sorted list.\n\tvar txCount uint32\n\tots := make([]*observedTransaction, len(ef.observed))\n\tfor hash := range ef.observed {\n\t\tots[txCount] = ef.observed[hash]\n\t\ttxCount++\n\t}\n\n\tsort.Sort(observedTxSet(ots))\n\n\ttxCount = 0\n\tobserved := make(map[*observedTransaction]uint32)\n\tbinary.Write(w, binary.BigEndian, uint32(len(ef.observed)))\n\tfor _, ot := range ots {\n\t\tot.Serialize(w)\n\t\tobserved[ot] = txCount\n\t\ttxCount++\n\t}\n\n\t// Save all the right bins.\n\tfor _, list := range ef.bin {\n\n\t\tbinary.Write(w, binary.BigEndian, uint32(len(list)))\n\n\t\tfor _, o := range list {\n\t\t\tbinary.Write(w, binary.BigEndian, observed[o])\n\t\t}\n\t}\n\n\t// Dropped transactions.\n\tbinary.Write(w, binary.BigEndian, uint32(len(ef.dropped)))\n\tfor _, registered := range ef.dropped {\n\t\tregistered.serialize(w, observed)\n\t}\n\n\t// Commit the tx and return.\n\treturn FeeEstimatorState(w.Bytes())\n}\n\n// RestoreFeeEstimator takes a FeeEstimatorState that was previously\n// returned by Save and restores it to a FeeEstimator\nfunc RestoreFeeEstimator(data FeeEstimatorState) (*FeeEstimator, error) {\n\tr := bytes.NewReader([]byte(data))\n\n\t// Check version\n\tvar version uint32\n\terr := binary.Read(r, binary.BigEndian, &version)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif version != estimateFeeSaveVersion {\n\t\treturn nil, fmt.Errorf(\"Incorrect version: expected %d found %d\", estimateFeeSaveVersion, version)\n\t}\n\n\tef := &FeeEstimator{\n\t\tobserved: make(map[chainhash.Hash]*observedTransaction),\n\t}\n\n\t// Read basic parameters.\n\tbinary.Read(r, binary.BigEndian, &ef.maxRollback)\n\tbinary.Read(r, binary.BigEndian, &ef.binSize)\n\tbinary.Read(r, binary.BigEndian, &ef.maxReplacements)\n\tbinary.Read(r, binary.BigEndian, &ef.minRegisteredBlocks)\n\tbinary.Read(r, binary.BigEndian, &ef.lastKnownHeight)\n\tbinary.Read(r, binary.BigEndian, &ef.numBlocksRegistered)\n\n\t// Read transactions.\n\tvar numObserved uint32\n\tobserved := make(map[uint32]*observedTransaction)\n\tbinary.Read(r, binary.BigEndian, &numObserved)\n\tfor i := uint32(0); i < numObserved; i++ {\n\t\tot, err := deserializeObservedTransaction(r)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tobserved[i] = ot\n\t\tef.observed[ot.hash] = ot\n\t}\n\n\t// Read bins.\n\tfor i := 0; i < estimateFeeDepth; i++ {\n\t\tvar numTransactions uint32\n\t\tbinary.Read(r, binary.BigEndian, &numTransactions)\n\t\tbin := make([]*observedTransaction, numTransactions)\n\t\tfor j := uint32(0); j < numTransactions; j++ {\n\t\t\tvar index uint32\n\t\t\tbinary.Read(r, binary.BigEndian, &index)\n\n\t\t\tvar exists bool\n\t\t\tbin[j], exists = observed[index]\n\t\t\tif !exists {\n\t\t\t\treturn nil, fmt.Errorf(\"Invalid transaction reference %d\", index)\n\t\t\t}\n\t\t}\n\t\tef.bin[i] = bin\n\t}\n\n\t// Read dropped transactions.\n\tvar numDropped uint32\n\tbinary.Read(r, binary.BigEndian, &numDropped)\n\tef.dropped = make([]*registeredBlock, numDropped)\n\tfor i := uint32(0); i < numDropped; i++ {\n\t\tvar err error\n\t\tef.dropped[int(i)], err = deserializeRegisteredBlock(r, observed)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn ef, nil\n}\n"
  },
  {
    "path": "mempool/estimatefee_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mempool\n\nimport (\n\t\"bytes\"\n\t\"math/rand\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/mining\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// newTestFeeEstimator creates a feeEstimator with some different parameters\n// for testing purposes.\nfunc newTestFeeEstimator(binSize, maxReplacements, maxRollback uint32) *FeeEstimator {\n\treturn &FeeEstimator{\n\t\tmaxRollback:         maxRollback,\n\t\tlastKnownHeight:     0,\n\t\tbinSize:             int32(binSize),\n\t\tminRegisteredBlocks: 0,\n\t\tmaxReplacements:     int32(maxReplacements),\n\t\tobserved:            make(map[chainhash.Hash]*observedTransaction),\n\t\tdropped:             make([]*registeredBlock, 0, maxRollback),\n\t}\n}\n\n// lastBlock is a linked list of the block hashes which have been\n// processed by the test FeeEstimator.\ntype lastBlock struct {\n\thash *chainhash.Hash\n\tprev *lastBlock\n}\n\n// estimateFeeTester interacts with the FeeEstimator to keep track\n// of its expected state.\ntype estimateFeeTester struct {\n\tef      *FeeEstimator\n\tt       *testing.T\n\tversion int32\n\theight  int32\n\tlast    *lastBlock\n}\n\nfunc (eft *estimateFeeTester) testTx(fee btcutil.Amount) *TxDesc {\n\teft.version++\n\treturn &TxDesc{\n\t\tTxDesc: mining.TxDesc{\n\t\t\tTx: btcutil.NewTx(&wire.MsgTx{\n\t\t\t\tVersion: eft.version,\n\t\t\t}),\n\t\t\tHeight: eft.height,\n\t\t\tFee:    int64(fee),\n\t\t},\n\t\tStartingPriority: 0,\n\t}\n}\n\nfunc expectedFeePerKilobyte(t *TxDesc) BtcPerKilobyte {\n\tsize := float64(t.TxDesc.Tx.MsgTx().SerializeSize())\n\tfee := float64(t.TxDesc.Fee)\n\n\treturn SatoshiPerByte(fee / size).ToBtcPerKb()\n}\n\nfunc (eft *estimateFeeTester) newBlock(txs []*wire.MsgTx) {\n\teft.height++\n\n\tblock := btcutil.NewBlock(&wire.MsgBlock{\n\t\tTransactions: txs,\n\t})\n\tblock.SetHeight(eft.height)\n\n\teft.last = &lastBlock{block.Hash(), eft.last}\n\n\teft.ef.RegisterBlock(block)\n}\n\nfunc (eft *estimateFeeTester) rollback() {\n\tif eft.last == nil {\n\t\treturn\n\t}\n\n\terr := eft.ef.Rollback(eft.last.hash)\n\n\tif err != nil {\n\t\teft.t.Errorf(\"Could not rollback: %v\", err)\n\t}\n\n\teft.height--\n\teft.last = eft.last.prev\n}\n\n// TestEstimateFee tests basic functionality in the FeeEstimator.\nfunc TestEstimateFee(t *testing.T) {\n\tef := newTestFeeEstimator(5, 3, 1)\n\teft := estimateFeeTester{ef: ef, t: t}\n\n\t// Try with no txs and get zero for all queries.\n\texpected := BtcPerKilobyte(0.0)\n\tfor i := uint32(1); i <= estimateFeeDepth; i++ {\n\t\testimated, _ := ef.EstimateFee(i)\n\n\t\tif estimated != expected {\n\t\t\tt.Errorf(\"Estimate fee error: expected %f when estimator is empty; got %f\", expected, estimated)\n\t\t}\n\t}\n\n\t// Now insert a tx.\n\ttx := eft.testTx(1000000)\n\tef.ObserveTransaction(tx)\n\n\t// Expected should still be zero because this is still in the mempool.\n\texpected = BtcPerKilobyte(0.0)\n\tfor i := uint32(1); i <= estimateFeeDepth; i++ {\n\t\testimated, _ := ef.EstimateFee(i)\n\n\t\tif estimated != expected {\n\t\t\tt.Errorf(\"Estimate fee error: expected %f when estimator has one tx in mempool; got %f\", expected, estimated)\n\t\t}\n\t}\n\n\t// Change minRegisteredBlocks to make sure that works. Error return\n\t// value expected.\n\tef.minRegisteredBlocks = 1\n\texpected = BtcPerKilobyte(-1.0)\n\tfor i := uint32(1); i <= estimateFeeDepth; i++ {\n\t\testimated, _ := ef.EstimateFee(i)\n\n\t\tif estimated != expected {\n\t\t\tt.Errorf(\"Estimate fee error: expected %f before any blocks have been registered; got %f\", expected, estimated)\n\t\t}\n\t}\n\n\t// Record a block with the new tx.\n\teft.newBlock([]*wire.MsgTx{tx.Tx.MsgTx()})\n\texpected = expectedFeePerKilobyte(tx)\n\tfor i := uint32(1); i <= estimateFeeDepth; i++ {\n\t\testimated, _ := ef.EstimateFee(i)\n\n\t\tif estimated != expected {\n\t\t\tt.Errorf(\"Estimate fee error: expected %f when one tx is binned; got %f\", expected, estimated)\n\t\t}\n\t}\n\n\t// Roll back the last block; this was an orphan block.\n\tef.minRegisteredBlocks = 0\n\teft.rollback()\n\texpected = BtcPerKilobyte(0.0)\n\tfor i := uint32(1); i <= estimateFeeDepth; i++ {\n\t\testimated, _ := ef.EstimateFee(i)\n\n\t\tif estimated != expected {\n\t\t\tt.Errorf(\"Estimate fee error: expected %f after rolling back block; got %f\", expected, estimated)\n\t\t}\n\t}\n\n\t// Record an empty block and then a block with the new tx.\n\t// This test was made because of a bug that only appeared when there\n\t// were no transactions in the first bin.\n\teft.newBlock([]*wire.MsgTx{})\n\teft.newBlock([]*wire.MsgTx{tx.Tx.MsgTx()})\n\texpected = expectedFeePerKilobyte(tx)\n\tfor i := uint32(1); i <= estimateFeeDepth; i++ {\n\t\testimated, _ := ef.EstimateFee(i)\n\n\t\tif estimated != expected {\n\t\t\tt.Errorf(\"Estimate fee error: expected %f when one tx is binned; got %f\", expected, estimated)\n\t\t}\n\t}\n\n\t// Create some more transactions.\n\ttxA := eft.testTx(500000)\n\ttxB := eft.testTx(2000000)\n\ttxC := eft.testTx(4000000)\n\tef.ObserveTransaction(txA)\n\tef.ObserveTransaction(txB)\n\tef.ObserveTransaction(txC)\n\n\t// Record 7 empty blocks.\n\tfor i := 0; i < 7; i++ {\n\t\teft.newBlock([]*wire.MsgTx{})\n\t}\n\n\t// Mine the first tx.\n\teft.newBlock([]*wire.MsgTx{txA.Tx.MsgTx()})\n\n\t// Now the estimated amount should depend on the value\n\t// of the argument to estimate fee.\n\tfor i := uint32(1); i <= estimateFeeDepth; i++ {\n\t\testimated, _ := ef.EstimateFee(i)\n\t\tif i > 2 {\n\t\t\texpected = expectedFeePerKilobyte(txA)\n\t\t} else {\n\t\t\texpected = expectedFeePerKilobyte(tx)\n\t\t}\n\t\tif estimated != expected {\n\t\t\tt.Errorf(\"Estimate fee error: expected %f on round %d; got %f\", expected, i, estimated)\n\t\t}\n\t}\n\n\t// Record 5 more empty blocks.\n\tfor i := 0; i < 5; i++ {\n\t\teft.newBlock([]*wire.MsgTx{})\n\t}\n\n\t// Mine the next tx.\n\teft.newBlock([]*wire.MsgTx{txB.Tx.MsgTx()})\n\n\t// Now the estimated amount should depend on the value\n\t// of the argument to estimate fee.\n\tfor i := uint32(1); i <= estimateFeeDepth; i++ {\n\t\testimated, _ := ef.EstimateFee(i)\n\t\tif i <= 2 {\n\t\t\texpected = expectedFeePerKilobyte(txB)\n\t\t} else if i <= 8 {\n\t\t\texpected = expectedFeePerKilobyte(tx)\n\t\t} else {\n\t\t\texpected = expectedFeePerKilobyte(txA)\n\t\t}\n\n\t\tif estimated != expected {\n\t\t\tt.Errorf(\"Estimate fee error: expected %f on round %d; got %f\", expected, i, estimated)\n\t\t}\n\t}\n\n\t// Record 9 more empty blocks.\n\tfor i := 0; i < 10; i++ {\n\t\teft.newBlock([]*wire.MsgTx{})\n\t}\n\n\t// Mine txC.\n\teft.newBlock([]*wire.MsgTx{txC.Tx.MsgTx()})\n\n\t// This should have no effect on the outcome because too\n\t// many blocks have been mined for txC to be recorded.\n\tfor i := uint32(1); i <= estimateFeeDepth; i++ {\n\t\testimated, _ := ef.EstimateFee(i)\n\t\tif i <= 2 {\n\t\t\texpected = expectedFeePerKilobyte(txC)\n\t\t} else if i <= 8 {\n\t\t\texpected = expectedFeePerKilobyte(txB)\n\t\t} else if i <= 8+6 {\n\t\t\texpected = expectedFeePerKilobyte(tx)\n\t\t} else {\n\t\t\texpected = expectedFeePerKilobyte(txA)\n\t\t}\n\n\t\tif estimated != expected {\n\t\t\tt.Errorf(\"Estimate fee error: expected %f on round %d; got %f\", expected, i, estimated)\n\t\t}\n\t}\n}\n\nfunc (eft *estimateFeeTester) estimates() [estimateFeeDepth]BtcPerKilobyte {\n\n\t// Generate estimates\n\tvar estimates [estimateFeeDepth]BtcPerKilobyte\n\tfor i := 0; i < estimateFeeDepth; i++ {\n\t\testimates[i], _ = eft.ef.EstimateFee(uint32(i + 1))\n\t}\n\n\t// Check that all estimated fee results go in descending order.\n\tfor i := 1; i < estimateFeeDepth; i++ {\n\t\tif estimates[i] > estimates[i-1] {\n\t\t\teft.t.Error(\"Estimates not in descending order; got \",\n\t\t\t\testimates[i], \" for estimate \", i, \" and \", estimates[i-1], \" for \", (i - 1))\n\t\t\tpanic(\"invalid state.\")\n\t\t}\n\t}\n\n\treturn estimates\n}\n\nfunc (eft *estimateFeeTester) round(txHistory [][]*TxDesc,\n\testimateHistory [][estimateFeeDepth]BtcPerKilobyte,\n\ttxPerRound, txPerBlock uint32) ([][]*TxDesc, [][estimateFeeDepth]BtcPerKilobyte) {\n\n\t// generate new txs.\n\tvar newTxs []*TxDesc\n\tfor i := uint32(0); i < txPerRound; i++ {\n\t\tnewTx := eft.testTx(btcutil.Amount(rand.Intn(1000000)))\n\t\teft.ef.ObserveTransaction(newTx)\n\t\tnewTxs = append(newTxs, newTx)\n\t}\n\n\t// Generate mempool.\n\tmempool := make(map[*observedTransaction]*TxDesc)\n\tfor _, h := range txHistory {\n\t\tfor _, t := range h {\n\t\t\tif o, exists := eft.ef.observed[*t.Tx.Hash()]; exists && o.mined == mining.UnminedHeight {\n\t\t\t\tmempool[o] = t\n\t\t\t}\n\t\t}\n\t}\n\n\t// generate new block, with no duplicates.\n\ti := uint32(0)\n\tnewBlockList := make([]*wire.MsgTx, 0, txPerBlock)\n\tfor _, t := range mempool {\n\t\tnewBlockList = append(newBlockList, t.TxDesc.Tx.MsgTx())\n\t\ti++\n\n\t\tif i == txPerBlock {\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// Register a new block.\n\teft.newBlock(newBlockList)\n\n\t// return results.\n\testimates := eft.estimates()\n\n\t// Return results\n\treturn append(txHistory, newTxs), append(estimateHistory, estimates)\n}\n\n// TestEstimateFeeRollback tests the rollback function, which undoes the\n// effect of a adding a new block.\nfunc TestEstimateFeeRollback(t *testing.T) {\n\ttxPerRound := uint32(7)\n\ttxPerBlock := uint32(5)\n\tbinSize := uint32(6)\n\tmaxReplacements := uint32(4)\n\tstepsBack := 2\n\trounds := 30\n\n\teft := estimateFeeTester{ef: newTestFeeEstimator(binSize, maxReplacements, uint32(stepsBack)), t: t}\n\tvar txHistory [][]*TxDesc\n\testimateHistory := [][estimateFeeDepth]BtcPerKilobyte{eft.estimates()}\n\n\tfor round := 0; round < rounds; round++ {\n\t\t// Go forward a few rounds.\n\t\tfor step := 0; step <= stepsBack; step++ {\n\t\t\ttxHistory, estimateHistory =\n\t\t\t\teft.round(txHistory, estimateHistory, txPerRound, txPerBlock)\n\t\t}\n\n\t\t// Now go back.\n\t\tfor step := 0; step < stepsBack; step++ {\n\t\t\teft.rollback()\n\n\t\t\t// After rolling back, we should have the same estimated\n\t\t\t// fees as before.\n\t\t\texpected := estimateHistory[len(estimateHistory)-step-2]\n\t\t\testimates := eft.estimates()\n\n\t\t\t// Ensure that these are both the same.\n\t\t\tfor i := 0; i < estimateFeeDepth; i++ {\n\t\t\t\tif expected[i] != estimates[i] {\n\t\t\t\t\tt.Errorf(\"Rollback value mismatch. Expected %f, got %f. \",\n\t\t\t\t\t\texpected[i], estimates[i])\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Erase history.\n\t\ttxHistory = txHistory[0 : len(txHistory)-stepsBack]\n\t\testimateHistory = estimateHistory[0 : len(estimateHistory)-stepsBack]\n\t}\n}\n\nfunc (eft *estimateFeeTester) checkSaveAndRestore(\n\tpreviousEstimates [estimateFeeDepth]BtcPerKilobyte) {\n\n\t// Get the save state.\n\tsave := eft.ef.Save()\n\n\t// Save and restore database.\n\tvar err error\n\teft.ef, err = RestoreFeeEstimator(save)\n\tif err != nil {\n\t\teft.t.Fatalf(\"Could not restore database: %s\", err)\n\t}\n\n\t// Save again and check that it matches the previous one.\n\tredo := eft.ef.Save()\n\tif !bytes.Equal(save, redo) {\n\t\teft.t.Fatalf(\"Restored states do not match: %v %v\", save, redo)\n\t}\n\n\t// Check that the results match.\n\tnewEstimates := eft.estimates()\n\n\tfor i, prev := range previousEstimates {\n\t\tif prev != newEstimates[i] {\n\t\t\teft.t.Error(\"Mismatch in estimate \", i, \" after restore; got \", newEstimates[i], \" but expected \", prev)\n\t\t}\n\t}\n}\n\n// TestSave tests saving and restoring to a []byte.\nfunc TestDatabase(t *testing.T) {\n\n\ttxPerRound := uint32(7)\n\ttxPerBlock := uint32(5)\n\tbinSize := uint32(6)\n\tmaxReplacements := uint32(4)\n\trounds := 8\n\n\teft := estimateFeeTester{ef: newTestFeeEstimator(binSize, maxReplacements, uint32(rounds)+1), t: t}\n\tvar txHistory [][]*TxDesc\n\testimateHistory := [][estimateFeeDepth]BtcPerKilobyte{eft.estimates()}\n\n\tfor round := 0; round < rounds; round++ {\n\t\teft.checkSaveAndRestore(estimateHistory[len(estimateHistory)-1])\n\n\t\t// Go forward one step.\n\t\ttxHistory, estimateHistory =\n\t\t\teft.round(txHistory, estimateHistory, txPerRound, txPerBlock)\n\t}\n\n\t// Reverse the process and try again.\n\tfor round := 1; round <= rounds; round++ {\n\t\teft.rollback()\n\t\teft.checkSaveAndRestore(estimateHistory[len(estimateHistory)-round-1])\n\t}\n}\n"
  },
  {
    "path": "mempool/interface.go",
    "content": "package mempool\n\nimport (\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TxMempool defines an interface that's used by other subsystems to interact\n// with the mempool.\ntype TxMempool interface {\n\t// LastUpdated returns the last time a transaction was added to or\n\t// removed from the source pool.\n\tLastUpdated() time.Time\n\n\t// TxDescs returns a slice of descriptors for all the transactions in\n\t// the pool.\n\tTxDescs() []*TxDesc\n\n\t// RawMempoolVerbose returns all the entries in the mempool as a fully\n\t// populated btcjson result.\n\tRawMempoolVerbose() map[string]*btcjson.GetRawMempoolVerboseResult\n\n\t// Count returns the number of transactions in the main pool. It does\n\t// not include the orphan pool.\n\tCount() int\n\n\t// FetchTransaction returns the requested transaction from the\n\t// transaction pool. This only fetches from the main transaction pool\n\t// and does not include orphans.\n\tFetchTransaction(txHash *chainhash.Hash) (*btcutil.Tx, error)\n\n\t// HaveTransaction returns whether or not the passed transaction\n\t// already exists in the main pool or in the orphan pool.\n\tHaveTransaction(hash *chainhash.Hash) bool\n\n\t// ProcessTransaction is the main workhorse for handling insertion of\n\t// new free-standing transactions into the memory pool. It includes\n\t// functionality such as rejecting duplicate transactions, ensuring\n\t// transactions follow all rules, orphan transaction handling, and\n\t// insertion into the memory pool.\n\t//\n\t// It returns a slice of transactions added to the mempool. When the\n\t// error is nil, the list will include the passed transaction itself\n\t// along with any additional orphan transactions that were added as a\n\t// result of the passed one being accepted.\n\tProcessTransaction(tx *btcutil.Tx, allowOrphan,\n\t\trateLimit bool, tag Tag) ([]*TxDesc, error)\n\n\t// RemoveTransaction removes the passed transaction from the mempool.\n\t// When the removeRedeemers flag is set, any transactions that redeem\n\t// outputs from the removed transaction will also be removed\n\t// recursively from the mempool, as they would otherwise become\n\t// orphans.\n\tRemoveTransaction(tx *btcutil.Tx, removeRedeemers bool)\n\n\t// CheckMempoolAcceptance behaves similarly to bitcoind's\n\t// `testmempoolaccept` RPC method. It will perform a series of checks\n\t// to decide whether this transaction can be accepted to the mempool.\n\t// If not, the specific error is returned and the caller needs to take\n\t// actions based on it.\n\tCheckMempoolAcceptance(tx *btcutil.Tx) (*MempoolAcceptResult, error)\n\n\t// CheckSpend checks whether the passed outpoint is already spent by\n\t// a transaction in the mempool. If that's the case the spending\n\t// transaction will be returned, if not nil will be returned.\n\tCheckSpend(op wire.OutPoint) *btcutil.Tx\n}\n"
  },
  {
    "path": "mempool/log.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mempool\n\nimport (\n\t\"github.com/btcsuite/btclog\"\n)\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until either UseLogger or SetLogWriter are called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\n// This should be used in preference to SetLogWriter if the caller is also\n// using btclog.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n\n// pickNoun returns the singular or plural form of a noun depending\n// on the count n.\nfunc pickNoun(n int, singular, plural string) string {\n\tif n == 1 {\n\t\treturn singular\n\t}\n\treturn plural\n}\n"
  },
  {
    "path": "mempool/mempool.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mempool\n\nimport (\n\t\"container/list\"\n\t\"fmt\"\n\t\"maps\"\n\t\"math\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/blockchain/indexers\"\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/mining\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\nconst (\n\t// DefaultBlockPrioritySize is the default size in bytes for high-\n\t// priority / low-fee transactions.  It is used to help determine which\n\t// are allowed into the mempool and consequently affects their relay and\n\t// inclusion when generating block templates.\n\tDefaultBlockPrioritySize = 50000\n\n\t// orphanTTL is the maximum amount of time an orphan is allowed to\n\t// stay in the orphan pool before it expires and is evicted during the\n\t// next scan.\n\torphanTTL = time.Minute * 15\n\n\t// orphanExpireScanInterval is the minimum amount of time in between\n\t// scans of the orphan pool to evict expired transactions.\n\torphanExpireScanInterval = time.Minute * 5\n\n\t// MaxRBFSequence is the maximum sequence number an input can use to\n\t// signal that the transaction spending it can be replaced using the\n\t// Replace-By-Fee (RBF) policy.\n\tMaxRBFSequence = 0xfffffffd\n\n\t// MaxReplacementEvictions is the maximum number of transactions that\n\t// can be evicted from the mempool when accepting a transaction\n\t// replacement.\n\tMaxReplacementEvictions = 100\n\n\t// Transactions smaller than 65 non-witness bytes are not relayed to\n\t// mitigate CVE-2017-12842.\n\tMinStandardTxNonWitnessSize = 65\n)\n\n// Tag represents an identifier to use for tagging orphan transactions.  The\n// caller may choose any scheme it desires, however it is common to use peer IDs\n// so that orphans can be identified by which peer first relayed them.\ntype Tag uint64\n\n// Config is a descriptor containing the memory pool configuration.\ntype Config struct {\n\t// Policy defines the various mempool configuration options related\n\t// to policy.\n\tPolicy Policy\n\n\t// ChainParams identifies which chain parameters the txpool is\n\t// associated with.\n\tChainParams *chaincfg.Params\n\n\t// FetchUtxoView defines the function to use to fetch unspent\n\t// transaction output information.\n\tFetchUtxoView func(*btcutil.Tx) (*blockchain.UtxoViewpoint, error)\n\n\t// BestHeight defines the function to use to access the block height of\n\t// the current best chain.\n\tBestHeight func() int32\n\n\t// MedianTimePast defines the function to use in order to access the\n\t// median time past calculated from the point-of-view of the current\n\t// chain tip within the best chain.\n\tMedianTimePast func() time.Time\n\n\t// CalcSequenceLock defines the function to use in order to generate\n\t// the current sequence lock for the given transaction using the passed\n\t// utxo view.\n\tCalcSequenceLock func(*btcutil.Tx, *blockchain.UtxoViewpoint) (*blockchain.SequenceLock, error)\n\n\t// IsDeploymentActive returns true if the target deploymentID is\n\t// active, and false otherwise. The mempool uses this function to gauge\n\t// if transactions using new to be soft-forked rules should be allowed\n\t// into the mempool or not.\n\tIsDeploymentActive func(deploymentID uint32) (bool, error)\n\n\t// SigCache defines a signature cache to use.\n\tSigCache *txscript.SigCache\n\n\t// HashCache defines the transaction hash mid-state cache to use.\n\tHashCache *txscript.HashCache\n\n\t// AddrIndex defines the optional address index instance to use for\n\t// indexing the unconfirmed transactions in the memory pool.\n\t// This can be nil if the address index is not enabled.\n\tAddrIndex *indexers.AddrIndex\n\n\t// FeeEstimator provides a feeEstimator. If it is not nil, the mempool\n\t// records all new transactions it observes into the feeEstimator.\n\tFeeEstimator *FeeEstimator\n}\n\n// Policy houses the policy (configuration parameters) which is used to\n// control the mempool.\ntype Policy struct {\n\t// MaxTxVersion is the transaction version that the mempool should\n\t// accept.  All transactions above this version are rejected as\n\t// non-standard.\n\tMaxTxVersion int32\n\n\t// DisableRelayPriority defines whether to relay free or low-fee\n\t// transactions that do not have enough priority to be relayed.\n\tDisableRelayPriority bool\n\n\t// AcceptNonStd defines whether to accept non-standard transactions. If\n\t// true, non-standard transactions will be accepted into the mempool.\n\t// Otherwise, all non-standard transactions will be rejected.\n\tAcceptNonStd bool\n\n\t// FreeTxRelayLimit defines the given amount in thousands of bytes\n\t// per minute that transactions with no fee are rate limited to.\n\tFreeTxRelayLimit float64\n\n\t// MaxOrphanTxs is the maximum number of orphan transactions\n\t// that can be queued.\n\tMaxOrphanTxs int\n\n\t// MaxOrphanTxSize is the maximum size allowed for orphan transactions.\n\t// This helps prevent memory exhaustion attacks from sending a lot of\n\t// of big orphans.\n\tMaxOrphanTxSize int\n\n\t// MaxSigOpCostPerTx is the cumulative maximum cost of all the signature\n\t// operations in a single transaction we will relay or mine.  It is a\n\t// fraction of the max signature operations for a block.\n\tMaxSigOpCostPerTx int\n\n\t// MinRelayTxFee defines the minimum transaction fee in BTC/kB to be\n\t// considered a non-zero fee.\n\tMinRelayTxFee btcutil.Amount\n\n\t// RejectReplacement, if true, rejects accepting replacement\n\t// transactions using the Replace-By-Fee (RBF) signaling policy into\n\t// the mempool.\n\tRejectReplacement bool\n}\n\n// TxDesc is a descriptor containing a transaction in the mempool along with\n// additional metadata.\ntype TxDesc struct {\n\tmining.TxDesc\n\n\t// StartingPriority is the priority of the transaction when it was added\n\t// to the pool.\n\tStartingPriority float64\n}\n\n// orphanTx is normal transaction that references an ancestor transaction\n// that is not yet available.  It also contains additional information related\n// to it such as an expiration time to help prevent caching the orphan forever.\ntype orphanTx struct {\n\ttx         *btcutil.Tx\n\ttag        Tag\n\texpiration time.Time\n}\n\n// TxPool is used as a source of transactions that need to be mined into blocks\n// and relayed to other peers.  It is safe for concurrent access from multiple\n// peers.\ntype TxPool struct {\n\t// The following variables must only be used atomically.\n\tlastUpdated int64 // last time pool was updated\n\n\tmtx           sync.RWMutex\n\tcfg           Config\n\tpool          map[chainhash.Hash]*TxDesc\n\torphans       map[chainhash.Hash]*orphanTx\n\torphansByPrev map[wire.OutPoint]map[chainhash.Hash]*btcutil.Tx\n\toutpoints     map[wire.OutPoint]*btcutil.Tx\n\tpennyTotal    float64 // exponentially decaying total for penny spends.\n\tlastPennyUnix int64   // unix time of last ``penny spend''\n\n\t// nextExpireScan is the time after which the orphan pool will be\n\t// scanned in order to evict orphans.  This is NOT a hard deadline as\n\t// the scan will only run when an orphan is added to the pool as opposed\n\t// to on an unconditional timer.\n\tnextExpireScan time.Time\n}\n\n// Ensure the TxPool type implements the mining.TxSource interface.\nvar _ mining.TxSource = (*TxPool)(nil)\n\n// Ensure the TxPool type implements the TxMemPool interface.\nvar _ TxMempool = (*TxPool)(nil)\n\n// removeOrphan is the internal function which implements the public\n// RemoveOrphan.  See the comment for RemoveOrphan for more details.\n//\n// This function MUST be called with the mempool lock held (for writes).\nfunc (mp *TxPool) removeOrphan(tx *btcutil.Tx, removeRedeemers bool) {\n\t// Nothing to do if passed tx is not an orphan.\n\ttxHash := tx.Hash()\n\totx, exists := mp.orphans[*txHash]\n\tif !exists {\n\t\treturn\n\t}\n\n\t// Remove the reference from the previous orphan index.\n\tfor _, txIn := range otx.tx.MsgTx().TxIn {\n\t\torphans, exists := mp.orphansByPrev[txIn.PreviousOutPoint]\n\t\tif exists {\n\t\t\tdelete(orphans, *txHash)\n\n\t\t\t// Remove the map entry altogether if there are no\n\t\t\t// longer any orphans which depend on it.\n\t\t\tif len(orphans) == 0 {\n\t\t\t\tdelete(mp.orphansByPrev, txIn.PreviousOutPoint)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove any orphans that redeem outputs from this one if requested.\n\tif removeRedeemers {\n\t\tprevOut := wire.OutPoint{Hash: *txHash}\n\t\tfor txOutIdx := range tx.MsgTx().TxOut {\n\t\t\tprevOut.Index = uint32(txOutIdx)\n\t\t\tfor _, orphan := range mp.orphansByPrev[prevOut] {\n\t\t\t\tmp.removeOrphan(orphan, true)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove the transaction from the orphan pool.\n\tdelete(mp.orphans, *txHash)\n}\n\n// RemoveOrphan removes the passed orphan transaction from the orphan pool and\n// previous orphan index.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) RemoveOrphan(tx *btcutil.Tx) {\n\tmp.mtx.Lock()\n\tmp.removeOrphan(tx, false)\n\tmp.mtx.Unlock()\n}\n\n// RemoveOrphansByTag removes all orphan transactions tagged with the provided\n// identifier.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) RemoveOrphansByTag(tag Tag) uint64 {\n\tvar numEvicted uint64\n\tmp.mtx.Lock()\n\tfor _, otx := range mp.orphans {\n\t\tif otx.tag == tag {\n\t\t\tmp.removeOrphan(otx.tx, true)\n\t\t\tnumEvicted++\n\t\t}\n\t}\n\tmp.mtx.Unlock()\n\treturn numEvicted\n}\n\n// limitNumOrphans limits the number of orphan transactions by evicting a random\n// orphan if adding a new one would cause it to overflow the max allowed.\n//\n// This function MUST be called with the mempool lock held (for writes).\nfunc (mp *TxPool) limitNumOrphans() error {\n\t// Scan through the orphan pool and remove any expired orphans when it's\n\t// time.  This is done for efficiency so the scan only happens\n\t// periodically instead of on every orphan added to the pool.\n\tif now := time.Now(); now.After(mp.nextExpireScan) {\n\t\torigNumOrphans := len(mp.orphans)\n\t\tfor _, otx := range mp.orphans {\n\t\t\tif now.After(otx.expiration) {\n\t\t\t\t// Remove redeemers too because the missing\n\t\t\t\t// parents are very unlikely to ever materialize\n\t\t\t\t// since the orphan has already been around more\n\t\t\t\t// than long enough for them to be delivered.\n\t\t\t\tmp.removeOrphan(otx.tx, true)\n\t\t\t}\n\t\t}\n\n\t\t// Set next expiration scan to occur after the scan interval.\n\t\tmp.nextExpireScan = now.Add(orphanExpireScanInterval)\n\n\t\tnumOrphans := len(mp.orphans)\n\t\tif numExpired := origNumOrphans - numOrphans; numExpired > 0 {\n\t\t\tlog.Debugf(\"Expired %d %s (remaining: %d)\", numExpired,\n\t\t\t\tpickNoun(numExpired, \"orphan\", \"orphans\"),\n\t\t\t\tnumOrphans)\n\t\t}\n\t}\n\n\t// Nothing to do if adding another orphan will not cause the pool to\n\t// exceed the limit.\n\tif len(mp.orphans)+1 <= mp.cfg.Policy.MaxOrphanTxs {\n\t\treturn nil\n\t}\n\n\t// Remove a random entry from the map.  For most compilers, Go's\n\t// range statement iterates starting at a random item although\n\t// that is not 100% guaranteed by the spec.  The iteration order\n\t// is not important here because an adversary would have to be\n\t// able to pull off preimage attacks on the hashing function in\n\t// order to target eviction of specific entries anyways.\n\tfor _, otx := range mp.orphans {\n\t\t// Don't remove redeemers in the case of a random eviction since\n\t\t// it is quite possible it might be needed again shortly.\n\t\tmp.removeOrphan(otx.tx, false)\n\t\tbreak\n\t}\n\n\treturn nil\n}\n\n// addOrphan adds an orphan transaction to the orphan pool.\n//\n// This function MUST be called with the mempool lock held (for writes).\nfunc (mp *TxPool) addOrphan(tx *btcutil.Tx, tag Tag) {\n\t// Nothing to do if no orphans are allowed.\n\tif mp.cfg.Policy.MaxOrphanTxs <= 0 {\n\t\treturn\n\t}\n\n\t// Limit the number orphan transactions to prevent memory exhaustion.\n\t// This will periodically remove any expired orphans and evict a random\n\t// orphan if space is still needed.\n\tmp.limitNumOrphans()\n\n\tmp.orphans[*tx.Hash()] = &orphanTx{\n\t\ttx:         tx,\n\t\ttag:        tag,\n\t\texpiration: time.Now().Add(orphanTTL),\n\t}\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tif _, exists := mp.orphansByPrev[txIn.PreviousOutPoint]; !exists {\n\t\t\tmp.orphansByPrev[txIn.PreviousOutPoint] =\n\t\t\t\tmake(map[chainhash.Hash]*btcutil.Tx)\n\t\t}\n\t\tmp.orphansByPrev[txIn.PreviousOutPoint][*tx.Hash()] = tx\n\t}\n\n\tlog.Debugf(\"Stored orphan transaction %v (total: %d)\", tx.Hash(),\n\t\tlen(mp.orphans))\n}\n\n// maybeAddOrphan potentially adds an orphan to the orphan pool.\n//\n// This function MUST be called with the mempool lock held (for writes).\nfunc (mp *TxPool) maybeAddOrphan(tx *btcutil.Tx, tag Tag) error {\n\t// Ignore orphan transactions that are too large.  This helps avoid\n\t// a memory exhaustion attack based on sending a lot of really large\n\t// orphans.  In the case there is a valid transaction larger than this,\n\t// it will ultimtely be rebroadcast after the parent transactions\n\t// have been mined or otherwise received.\n\t//\n\t// Note that the number of orphan transactions in the orphan pool is\n\t// also limited, so this equates to a maximum memory used of\n\t// mp.cfg.Policy.MaxOrphanTxSize * mp.cfg.Policy.MaxOrphanTxs (which is ~5MB\n\t// using the default values at the time this comment was written).\n\tserializedLen := tx.MsgTx().SerializeSize()\n\tif serializedLen > mp.cfg.Policy.MaxOrphanTxSize {\n\t\tstr := fmt.Sprintf(\"orphan transaction size of %d bytes is \"+\n\t\t\t\"larger than max allowed size of %d bytes\",\n\t\t\tserializedLen, mp.cfg.Policy.MaxOrphanTxSize)\n\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t}\n\n\t// Add the orphan if the none of the above disqualified it.\n\tmp.addOrphan(tx, tag)\n\n\treturn nil\n}\n\n// removeOrphanDoubleSpends removes all orphans which spend outputs spent by the\n// passed transaction from the orphan pool.  Removing those orphans then leads\n// to removing all orphans which rely on them, recursively.  This is necessary\n// when a transaction is added to the main pool because it may spend outputs\n// that orphans also spend.\n//\n// This function MUST be called with the mempool lock held (for writes).\nfunc (mp *TxPool) removeOrphanDoubleSpends(tx *btcutil.Tx) {\n\tmsgTx := tx.MsgTx()\n\tfor _, txIn := range msgTx.TxIn {\n\t\tfor _, orphan := range mp.orphansByPrev[txIn.PreviousOutPoint] {\n\t\t\tmp.removeOrphan(orphan, true)\n\t\t}\n\t}\n}\n\n// isTransactionInPool returns whether or not the passed transaction already\n// exists in the main pool.\n//\n// This function MUST be called with the mempool lock held (for reads).\nfunc (mp *TxPool) isTransactionInPool(hash *chainhash.Hash) bool {\n\tif _, exists := mp.pool[*hash]; exists {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// IsTransactionInPool returns whether or not the passed transaction already\n// exists in the main pool.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) IsTransactionInPool(hash *chainhash.Hash) bool {\n\t// Protect concurrent access.\n\tmp.mtx.RLock()\n\tinPool := mp.isTransactionInPool(hash)\n\tmp.mtx.RUnlock()\n\n\treturn inPool\n}\n\n// isOrphanInPool returns whether or not the passed transaction already exists\n// in the orphan pool.\n//\n// This function MUST be called with the mempool lock held (for reads).\nfunc (mp *TxPool) isOrphanInPool(hash *chainhash.Hash) bool {\n\tif _, exists := mp.orphans[*hash]; exists {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// IsOrphanInPool returns whether or not the passed transaction already exists\n// in the orphan pool.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) IsOrphanInPool(hash *chainhash.Hash) bool {\n\t// Protect concurrent access.\n\tmp.mtx.RLock()\n\tinPool := mp.isOrphanInPool(hash)\n\tmp.mtx.RUnlock()\n\n\treturn inPool\n}\n\n// haveTransaction returns whether or not the passed transaction already exists\n// in the main pool or in the orphan pool.\n//\n// This function MUST be called with the mempool lock held (for reads).\nfunc (mp *TxPool) haveTransaction(hash *chainhash.Hash) bool {\n\treturn mp.isTransactionInPool(hash) || mp.isOrphanInPool(hash)\n}\n\n// HaveTransaction returns whether or not the passed transaction already exists\n// in the main pool or in the orphan pool.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) HaveTransaction(hash *chainhash.Hash) bool {\n\t// Protect concurrent access.\n\tmp.mtx.RLock()\n\thaveTx := mp.haveTransaction(hash)\n\tmp.mtx.RUnlock()\n\n\treturn haveTx\n}\n\n// removeTransaction is the internal function which implements the public\n// RemoveTransaction.  See the comment for RemoveTransaction for more details.\n//\n// This function MUST be called with the mempool lock held (for writes).\nfunc (mp *TxPool) removeTransaction(tx *btcutil.Tx, removeRedeemers bool) {\n\ttxHash := tx.Hash()\n\tif removeRedeemers {\n\t\t// Remove any transactions which rely on this one.\n\t\tfor i := uint32(0); i < uint32(len(tx.MsgTx().TxOut)); i++ {\n\t\t\tprevOut := wire.OutPoint{Hash: *txHash, Index: i}\n\t\t\tif txRedeemer, exists := mp.outpoints[prevOut]; exists {\n\t\t\t\tmp.removeTransaction(txRedeemer, true)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove the transaction if needed.\n\tif txDesc, exists := mp.pool[*txHash]; exists {\n\t\t// Remove unconfirmed address index entries associated with the\n\t\t// transaction if enabled.\n\t\tif mp.cfg.AddrIndex != nil {\n\t\t\tmp.cfg.AddrIndex.RemoveUnconfirmedTx(txHash)\n\t\t}\n\n\t\t// Mark the referenced outpoints as unspent by the pool.\n\t\tfor _, txIn := range txDesc.Tx.MsgTx().TxIn {\n\t\t\tdelete(mp.outpoints, txIn.PreviousOutPoint)\n\t\t}\n\t\tdelete(mp.pool, *txHash)\n\t\tatomic.StoreInt64(&mp.lastUpdated, time.Now().Unix())\n\t}\n}\n\n// RemoveTransaction removes the passed transaction from the mempool. When the\n// removeRedeemers flag is set, any transactions that redeem outputs from the\n// removed transaction will also be removed recursively from the mempool, as\n// they would otherwise become orphans.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) RemoveTransaction(tx *btcutil.Tx, removeRedeemers bool) {\n\t// Protect concurrent access.\n\tmp.mtx.Lock()\n\tmp.removeTransaction(tx, removeRedeemers)\n\tmp.mtx.Unlock()\n}\n\n// RemoveDoubleSpends removes all transactions which spend outputs spent by the\n// passed transaction from the memory pool.  Removing those transactions then\n// leads to removing all transactions which rely on them, recursively.  This is\n// necessary when a block is connected to the main chain because the block may\n// contain transactions which were previously unknown to the memory pool.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) RemoveDoubleSpends(tx *btcutil.Tx) {\n\t// Protect concurrent access.\n\tmp.mtx.Lock()\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tif txRedeemer, ok := mp.outpoints[txIn.PreviousOutPoint]; ok {\n\t\t\tif !txRedeemer.Hash().IsEqual(tx.Hash()) {\n\t\t\t\tmp.removeTransaction(txRedeemer, true)\n\t\t\t}\n\t\t}\n\t}\n\tmp.mtx.Unlock()\n}\n\n// addTransaction adds the passed transaction to the memory pool.  It should\n// not be called directly as it doesn't perform any validation.  This is a\n// helper for maybeAcceptTransaction.\n//\n// This function MUST be called with the mempool lock held (for writes).\nfunc (mp *TxPool) addTransaction(utxoView *blockchain.UtxoViewpoint, tx *btcutil.Tx, height int32, fee int64) *TxDesc {\n\t// Add the transaction to the pool and mark the referenced outpoints\n\t// as spent by the pool.\n\ttxD := &TxDesc{\n\t\tTxDesc: mining.TxDesc{\n\t\t\tTx:       tx,\n\t\t\tAdded:    time.Now(),\n\t\t\tHeight:   height,\n\t\t\tFee:      fee,\n\t\t\tFeePerKB: fee * 1000 / GetTxVirtualSize(tx),\n\t\t},\n\t\tStartingPriority: mining.CalcPriority(tx.MsgTx(), utxoView, height),\n\t}\n\n\tmp.pool[*tx.Hash()] = txD\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tmp.outpoints[txIn.PreviousOutPoint] = tx\n\t}\n\tatomic.StoreInt64(&mp.lastUpdated, time.Now().Unix())\n\n\t// Add unconfirmed address index entries associated with the transaction\n\t// if enabled.\n\tif mp.cfg.AddrIndex != nil {\n\t\tmp.cfg.AddrIndex.AddUnconfirmedTx(tx, utxoView)\n\t}\n\n\t// Record this tx for fee estimation if enabled.\n\tif mp.cfg.FeeEstimator != nil {\n\t\tmp.cfg.FeeEstimator.ObserveTransaction(txD)\n\t}\n\n\treturn txD\n}\n\n// checkPoolDoubleSpend checks whether or not the passed transaction is\n// attempting to spend coins already spent by other transactions in the pool.\n// If it does, we'll check whether each of those transactions are signaling for\n// replacement. If just one of them isn't, an error is returned. Otherwise, a\n// boolean is returned signaling that the transaction is a replacement. Note it\n// does not check for double spends against transactions already in the main\n// chain.\n//\n// This function MUST be called with the mempool lock held (for reads).\nfunc (mp *TxPool) checkPoolDoubleSpend(tx *btcutil.Tx) (bool, error) {\n\tvar isReplacement bool\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tconflict, ok := mp.outpoints[txIn.PreviousOutPoint]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Reject the transaction if we don't accept replacement\n\t\t// transactions or if it doesn't signal replacement.\n\t\tif mp.cfg.Policy.RejectReplacement ||\n\t\t\t!mp.signalsReplacement(conflict, nil) {\n\t\t\tstr := fmt.Sprintf(\"output already spent in mempool: \"+\n\t\t\t\t\"output=%v, tx=%v\", txIn.PreviousOutPoint,\n\t\t\t\tconflict.Hash())\n\t\t\treturn false, txRuleError(wire.RejectDuplicate, str)\n\t\t}\n\n\t\tisReplacement = true\n\t}\n\n\treturn isReplacement, nil\n}\n\n// signalsReplacement determines if a transaction is signaling that it can be\n// replaced using the Replace-By-Fee (RBF) policy. This policy specifies two\n// ways a transaction can signal that it is replaceable:\n//\n// Explicit signaling: A transaction is considered to have opted in to allowing\n// replacement of itself if any of its inputs have a sequence number less than\n// 0xfffffffe.\n//\n// Inherited signaling: Transactions that don't explicitly signal replaceability\n// are replaceable under this policy for as long as any one of their ancestors\n// signals replaceability and remains unconfirmed.\n//\n// The cache is optional and serves as an optimization to avoid visiting\n// transactions we've already determined don't signal replacement.\n//\n// This function MUST be called with the mempool lock held (for reads).\nfunc (mp *TxPool) signalsReplacement(tx *btcutil.Tx,\n\tcache map[chainhash.Hash]struct{}) bool {\n\n\t// If a cache was not provided, we'll initialize one now to use for the\n\t// recursive calls.\n\tif cache == nil {\n\t\tcache = make(map[chainhash.Hash]struct{})\n\t}\n\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tif txIn.Sequence <= MaxRBFSequence {\n\t\t\treturn true\n\t\t}\n\n\t\thash := txIn.PreviousOutPoint.Hash\n\t\tunconfirmedAncestor, ok := mp.pool[hash]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\t// If we've already determined the transaction doesn't signal\n\t\t// replacement, we can avoid visiting it again.\n\t\tif _, ok := cache[hash]; ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tif mp.signalsReplacement(unconfirmedAncestor.Tx, cache) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Since the transaction doesn't signal replacement, we'll cache\n\t\t// its result to ensure we don't attempt to determine so again.\n\t\tcache[hash] = struct{}{}\n\t}\n\n\treturn false\n}\n\n// txAncestors returns all of the unconfirmed ancestors of the given\n// transaction. Given transactions A, B, and C where C spends B and B spends A,\n// A and B are considered ancestors of C.\n//\n// The cache is optional and serves as an optimization to avoid visiting\n// transactions we've already determined ancestors of.\n//\n// This function MUST be called with the mempool lock held (for reads).\nfunc (mp *TxPool) txAncestors(tx *btcutil.Tx,\n\tcache map[chainhash.Hash]map[chainhash.Hash]*btcutil.Tx) map[chainhash.Hash]*btcutil.Tx {\n\n\t// If a cache was not provided, we'll initialize one now to use for the\n\t// recursive calls.\n\tif cache == nil {\n\t\tcache = make(map[chainhash.Hash]map[chainhash.Hash]*btcutil.Tx)\n\t}\n\n\tancestors := make(map[chainhash.Hash]*btcutil.Tx)\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tparent, ok := mp.pool[txIn.PreviousOutPoint.Hash]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tancestors[*parent.Tx.Hash()] = parent.Tx\n\n\t\t// Determine if the ancestors of this ancestor have already been\n\t\t// computed. If they haven't, we'll do so now and cache them to\n\t\t// use them later on if necessary.\n\t\tmoreAncestors, ok := cache[*parent.Tx.Hash()]\n\t\tif !ok {\n\t\t\tmoreAncestors = mp.txAncestors(parent.Tx, cache)\n\t\t\tcache[*parent.Tx.Hash()] = moreAncestors\n\t\t}\n\n\t\tmaps.Copy(ancestors, moreAncestors)\n\t}\n\n\treturn ancestors\n}\n\n// txDescendants returns all of the unconfirmed descendants of the given\n// transaction. Given transactions A, B, and C where C spends B and B spends A,\n// B and C are considered descendants of A. A cache can be provided in order to\n// easily retrieve the descendants of transactions we've already determined the\n// descendants of.\n//\n// This function MUST be called with the mempool lock held (for reads).\nfunc (mp *TxPool) txDescendants(tx *btcutil.Tx,\n\tcache map[chainhash.Hash]map[chainhash.Hash]*btcutil.Tx) map[chainhash.Hash]*btcutil.Tx {\n\n\t// If a cache was not provided, we'll initialize one now to use for the\n\t// recursive calls.\n\tif cache == nil {\n\t\tcache = make(map[chainhash.Hash]map[chainhash.Hash]*btcutil.Tx)\n\t}\n\n\t// We'll go through all of the outputs of the transaction to determine\n\t// if they are spent by any other mempool transactions.\n\tdescendants := make(map[chainhash.Hash]*btcutil.Tx)\n\top := wire.OutPoint{Hash: *tx.Hash()}\n\tfor i := range tx.MsgTx().TxOut {\n\t\top.Index = uint32(i)\n\t\tdescendant, ok := mp.outpoints[op]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tdescendants[*descendant.Hash()] = descendant\n\n\t\t// Determine if the descendants of this descendant have already\n\t\t// been computed. If they haven't, we'll do so now and cache\n\t\t// them to use them later on if necessary.\n\t\tmoreDescendants, ok := cache[*descendant.Hash()]\n\t\tif !ok {\n\t\t\tmoreDescendants = mp.txDescendants(descendant, cache)\n\t\t\tcache[*descendant.Hash()] = moreDescendants\n\t\t}\n\n\t\tfor _, moreDescendant := range moreDescendants {\n\t\t\tdescendants[*moreDescendant.Hash()] = moreDescendant\n\t\t}\n\t}\n\n\treturn descendants\n}\n\n// txConflicts returns all of the unconfirmed transactions that would become\n// conflicts if we were to accept the given transaction into the mempool. An\n// unconfirmed conflict is known as a transaction that spends an output already\n// spent by a different transaction within the mempool. Any descendants of these\n// transactions are also considered conflicts as they would no longer exist.\n// These are generally not allowed except for transactions that signal RBF\n// support.\n//\n// This function MUST be called with the mempool lock held (for reads).\nfunc (mp *TxPool) txConflicts(tx *btcutil.Tx) map[chainhash.Hash]*btcutil.Tx {\n\tconflicts := make(map[chainhash.Hash]*btcutil.Tx)\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tconflict, ok := mp.outpoints[txIn.PreviousOutPoint]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tconflicts[*conflict.Hash()] = conflict\n\t\tdescendants := mp.txDescendants(conflict, nil)\n\t\tmaps.Copy(conflicts, descendants)\n\t}\n\treturn conflicts\n}\n\n// CheckSpend checks whether the passed outpoint is already spent by a\n// transaction in the mempool. If that's the case the spending transaction will\n// be returned, if not nil will be returned.\nfunc (mp *TxPool) CheckSpend(op wire.OutPoint) *btcutil.Tx {\n\tmp.mtx.RLock()\n\ttxR := mp.outpoints[op]\n\tmp.mtx.RUnlock()\n\n\treturn txR\n}\n\n// fetchInputUtxos loads utxo details about the input transactions referenced by\n// the passed transaction.  First, it loads the details form the viewpoint of\n// the main chain, then it adjusts them based upon the contents of the\n// transaction pool.\n//\n// This function MUST be called with the mempool lock held (for reads).\nfunc (mp *TxPool) fetchInputUtxos(tx *btcutil.Tx) (*blockchain.UtxoViewpoint, error) {\n\tutxoView, err := mp.cfg.FetchUtxoView(tx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Attempt to populate any missing inputs from the transaction pool.\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tprevOut := &txIn.PreviousOutPoint\n\t\tentry := utxoView.LookupEntry(*prevOut)\n\t\tif entry != nil && !entry.IsSpent() {\n\t\t\tcontinue\n\t\t}\n\n\t\tif poolTxDesc, exists := mp.pool[prevOut.Hash]; exists {\n\t\t\t// AddTxOut ignores out of range index values, so it is\n\t\t\t// safe to call without bounds checking here.\n\t\t\tutxoView.AddTxOut(poolTxDesc.Tx, prevOut.Index,\n\t\t\t\tmining.UnminedHeight)\n\t\t}\n\t}\n\n\treturn utxoView, nil\n}\n\n// FetchTransaction returns the requested transaction from the transaction pool.\n// This only fetches from the main transaction pool and does not include\n// orphans.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) FetchTransaction(txHash *chainhash.Hash) (*btcutil.Tx, error) {\n\t// Protect concurrent access.\n\tmp.mtx.RLock()\n\ttxDesc, exists := mp.pool[*txHash]\n\tmp.mtx.RUnlock()\n\n\tif exists {\n\t\treturn txDesc.Tx, nil\n\t}\n\n\treturn nil, fmt.Errorf(\"transaction is not in the pool\")\n}\n\n// validateReplacement determines whether a transaction is deemed as a valid\n// replacement of all of its conflicts according to the RBF policy. If it is\n// valid, no error is returned. Otherwise, an error is returned indicating what\n// went wrong.\n//\n// This function MUST be called with the mempool lock held (for reads).\nfunc (mp *TxPool) validateReplacement(tx *btcutil.Tx,\n\ttxFee int64) (map[chainhash.Hash]*btcutil.Tx, error) {\n\n\t// First, we'll make sure the set of conflicting transactions doesn't\n\t// exceed the maximum allowed.\n\tconflicts := mp.txConflicts(tx)\n\tif len(conflicts) > MaxReplacementEvictions {\n\t\tstr := fmt.Sprintf(\"%v: replacement transaction evicts more \"+\n\t\t\t\"transactions than permitted: max is %v, evicts %v\",\n\t\t\ttx.Hash(), MaxReplacementEvictions, len(conflicts))\n\t\treturn nil, txRuleError(wire.RejectNonstandard, str)\n\t}\n\n\t// The set of conflicts (transactions we'll replace) and ancestors\n\t// should not overlap, otherwise the replacement would be spending an\n\t// output that no longer exists.\n\tfor ancestorHash := range mp.txAncestors(tx, nil) {\n\t\tif _, ok := conflicts[ancestorHash]; !ok {\n\t\t\tcontinue\n\t\t}\n\t\tstr := fmt.Sprintf(\"%v: replacement transaction spends parent \"+\n\t\t\t\"transaction %v\", tx.Hash(), ancestorHash)\n\t\treturn nil, txRuleError(wire.RejectInvalid, str)\n\t}\n\n\t// The replacement should have a higher fee rate than each of the\n\t// conflicting transactions and a higher absolute fee than the fee sum\n\t// of all the conflicting transactions.\n\t//\n\t// We usually don't want to accept replacements with lower fee rates\n\t// than what they replaced as that would lower the fee rate of the next\n\t// block. Requiring that the fee rate always be increased is also an\n\t// easy-to-reason about way to prevent DoS attacks via replacements.\n\tvar (\n\t\ttxSize           = GetTxVirtualSize(tx)\n\t\ttxFeeRate        = txFee * 1000 / txSize\n\t\tconflictsFee     int64\n\t\tconflictsParents = make(map[chainhash.Hash]struct{})\n\t)\n\tfor hash, conflict := range conflicts {\n\t\tif txFeeRate <= mp.pool[hash].FeePerKB {\n\t\t\tstr := fmt.Sprintf(\"%v: replacement transaction has an \"+\n\t\t\t\t\"insufficient fee rate: needs more than %v, \"+\n\t\t\t\t\"has %v\", tx.Hash(), mp.pool[hash].FeePerKB,\n\t\t\t\ttxFeeRate)\n\t\t\treturn nil, txRuleError(wire.RejectInsufficientFee, str)\n\t\t}\n\n\t\tconflictsFee += mp.pool[hash].Fee\n\n\t\t// We'll track each conflict's parents to ensure the replacement\n\t\t// isn't spending any new unconfirmed inputs.\n\t\tfor _, txIn := range conflict.MsgTx().TxIn {\n\t\t\tconflictsParents[txIn.PreviousOutPoint.Hash] = struct{}{}\n\t\t}\n\t}\n\n\t// It should also have an absolute fee greater than all of the\n\t// transactions it intends to replace and pay for its own bandwidth,\n\t// which is determined by our minimum relay fee.\n\tminFee := calcMinRequiredTxRelayFee(txSize, mp.cfg.Policy.MinRelayTxFee)\n\tif txFee < conflictsFee+minFee {\n\t\tstr := fmt.Sprintf(\"%v: replacement transaction has an \"+\n\t\t\t\"insufficient absolute fee: needs %v, has %v\",\n\t\t\ttx.Hash(), conflictsFee+minFee, txFee)\n\t\treturn nil, txRuleError(wire.RejectInsufficientFee, str)\n\t}\n\n\t// Finally, it should not spend any new unconfirmed outputs, other than\n\t// the ones already included in the parents of the conflicting\n\t// transactions it'll replace.\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tif _, ok := conflictsParents[txIn.PreviousOutPoint.Hash]; ok {\n\t\t\tcontinue\n\t\t}\n\t\t// Confirmed outputs are valid to spend in the replacement.\n\t\tif _, ok := mp.pool[txIn.PreviousOutPoint.Hash]; !ok {\n\t\t\tcontinue\n\t\t}\n\t\tstr := fmt.Sprintf(\"replacement transaction spends new \"+\n\t\t\t\"unconfirmed input %v not found in conflicting \"+\n\t\t\t\"transactions\", txIn.PreviousOutPoint)\n\t\treturn nil, txRuleError(wire.RejectInvalid, str)\n\t}\n\n\treturn conflicts, nil\n}\n\n// maybeAcceptTransaction is the internal function which implements the public\n// MaybeAcceptTransaction.  See the comment for MaybeAcceptTransaction for\n// more details.\n//\n// This function MUST be called with the mempool lock held (for writes).\nfunc (mp *TxPool) maybeAcceptTransaction(tx *btcutil.Tx, isNew, rateLimit,\n\trejectDupOrphans bool) ([]*chainhash.Hash, *TxDesc, error) {\n\n\ttxHash := tx.Hash()\n\n\t// Check for mempool acceptance.\n\tr, err := mp.checkMempoolAcceptance(\n\t\ttx, isNew, rateLimit, rejectDupOrphans,\n\t)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// Exit early if this transaction is missing parents.\n\tif len(r.MissingParents) > 0 {\n\t\treturn r.MissingParents, nil, nil\n\t}\n\n\t// Now that we've deemed the transaction as valid, we can add it to the\n\t// mempool. If it ended up replacing any transactions, we'll remove them\n\t// first.\n\tfor _, conflict := range r.Conflicts {\n\t\tlog.Debugf(\"Replacing transaction %v (fee_rate=%v sat/kb) \"+\n\t\t\t\"with %v (fee_rate=%v sat/kb)\\n\", conflict.Hash(),\n\t\t\tmp.pool[*conflict.Hash()].FeePerKB, tx.Hash(),\n\t\t\tint64(r.TxFee)*1000/r.TxSize)\n\n\t\t// The conflict set should already include the descendants for\n\t\t// each one, so we don't need to remove the redeemers within\n\t\t// this call as they'll be removed eventually.\n\t\tmp.removeTransaction(conflict, false)\n\t}\n\ttxD := mp.addTransaction(r.utxoView, tx, r.bestHeight, int64(r.TxFee))\n\n\tlog.Debugf(\"Accepted transaction %v (pool size: %v)\", txHash,\n\t\tlen(mp.pool))\n\n\treturn nil, txD, nil\n}\n\n// MaybeAcceptTransaction is the main workhorse for handling insertion of new\n// free-standing transactions into a memory pool.  It includes functionality\n// such as rejecting duplicate transactions, ensuring transactions follow all\n// rules, detecting orphan transactions, and insertion into the memory pool.\n//\n// If the transaction is an orphan (missing parent transactions), the\n// transaction is NOT added to the orphan pool, but each unknown referenced\n// parent is returned.  Use ProcessTransaction instead if new orphans should\n// be added to the orphan pool.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) MaybeAcceptTransaction(tx *btcutil.Tx, isNew, rateLimit bool) ([]*chainhash.Hash, *TxDesc, error) {\n\t// Protect concurrent access.\n\tmp.mtx.Lock()\n\thashes, txD, err := mp.maybeAcceptTransaction(tx, isNew, rateLimit, true)\n\tmp.mtx.Unlock()\n\n\treturn hashes, txD, err\n}\n\n// processOrphans is the internal function which implements the public\n// ProcessOrphans.  See the comment for ProcessOrphans for more details.\n//\n// This function MUST be called with the mempool lock held (for writes).\nfunc (mp *TxPool) processOrphans(acceptedTx *btcutil.Tx) []*TxDesc {\n\tvar acceptedTxns []*TxDesc\n\n\t// Start with processing at least the passed transaction.\n\tprocessList := list.New()\n\tprocessList.PushBack(acceptedTx)\n\tfor processList.Len() > 0 {\n\t\t// Pop the transaction to process from the front of the list.\n\t\tfirstElement := processList.Remove(processList.Front())\n\t\tprocessItem := firstElement.(*btcutil.Tx)\n\n\t\tprevOut := wire.OutPoint{Hash: *processItem.Hash()}\n\t\tfor txOutIdx := range processItem.MsgTx().TxOut {\n\t\t\t// Look up all orphans that redeem the output that is\n\t\t\t// now available.  This will typically only be one, but\n\t\t\t// it could be multiple if the orphan pool contains\n\t\t\t// double spends.  While it may seem odd that the orphan\n\t\t\t// pool would allow this since there can only possibly\n\t\t\t// ultimately be a single redeemer, it's important to\n\t\t\t// track it this way to prevent malicious actors from\n\t\t\t// being able to purposely constructing orphans that\n\t\t\t// would otherwise make outputs unspendable.\n\t\t\t//\n\t\t\t// Skip to the next available output if there are none.\n\t\t\tprevOut.Index = uint32(txOutIdx)\n\t\t\torphans, exists := mp.orphansByPrev[prevOut]\n\t\t\tif !exists {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Potentially accept an orphan into the tx pool.\n\t\t\tfor _, tx := range orphans {\n\t\t\t\tmissing, txD, err := mp.maybeAcceptTransaction(\n\t\t\t\t\ttx, true, true, false)\n\t\t\t\tif err != nil {\n\t\t\t\t\t// The orphan is now invalid, so there\n\t\t\t\t\t// is no way any other orphans which\n\t\t\t\t\t// redeem any of its outputs can be\n\t\t\t\t\t// accepted.  Remove them.\n\t\t\t\t\tmp.removeOrphan(tx, true)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\t// Transaction is still an orphan.  Try the next\n\t\t\t\t// orphan which redeems this output.\n\t\t\t\tif len(missing) > 0 {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// Transaction was accepted into the main pool.\n\t\t\t\t//\n\t\t\t\t// Add it to the list of accepted transactions\n\t\t\t\t// that are no longer orphans, remove it from\n\t\t\t\t// the orphan pool, and add it to the list of\n\t\t\t\t// transactions to process so any orphans that\n\t\t\t\t// depend on it are handled too.\n\t\t\t\tacceptedTxns = append(acceptedTxns, txD)\n\t\t\t\tmp.removeOrphan(tx, false)\n\t\t\t\tprocessList.PushBack(tx)\n\n\t\t\t\t// Only one transaction for this outpoint can be\n\t\t\t\t// accepted, so the rest are now double spends\n\t\t\t\t// and are removed later.\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Recursively remove any orphans that also redeem any outputs redeemed\n\t// by the accepted transactions since those are now definitive double\n\t// spends.\n\tmp.removeOrphanDoubleSpends(acceptedTx)\n\tfor _, txD := range acceptedTxns {\n\t\tmp.removeOrphanDoubleSpends(txD.Tx)\n\t}\n\n\treturn acceptedTxns\n}\n\n// ProcessOrphans determines if there are any orphans which depend on the passed\n// transaction hash (it is possible that they are no longer orphans) and\n// potentially accepts them to the memory pool.  It repeats the process for the\n// newly accepted transactions (to detect further orphans which may no longer be\n// orphans) until there are no more.\n//\n// It returns a slice of transactions added to the mempool.  A nil slice means\n// no transactions were moved from the orphan pool to the mempool.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) ProcessOrphans(acceptedTx *btcutil.Tx) []*TxDesc {\n\tmp.mtx.Lock()\n\tacceptedTxns := mp.processOrphans(acceptedTx)\n\tmp.mtx.Unlock()\n\n\treturn acceptedTxns\n}\n\n// ProcessTransaction is the main workhorse for handling insertion of new\n// free-standing transactions into the memory pool.  It includes functionality\n// such as rejecting duplicate transactions, ensuring transactions follow all\n// rules, orphan transaction handling, and insertion into the memory pool.\n//\n// It returns a slice of transactions added to the mempool.  When the\n// error is nil, the list will include the passed transaction itself along\n// with any additional orphan transactions that were added as a result of\n// the passed one being accepted.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) ProcessTransaction(tx *btcutil.Tx, allowOrphan, rateLimit bool, tag Tag) ([]*TxDesc, error) {\n\tlog.Tracef(\"Processing transaction %v\", tx.Hash())\n\n\t// Protect concurrent access.\n\tmp.mtx.Lock()\n\tdefer mp.mtx.Unlock()\n\n\t// Potentially accept the transaction to the memory pool.\n\tmissingParents, txD, err := mp.maybeAcceptTransaction(tx, true, rateLimit,\n\t\ttrue)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif len(missingParents) == 0 {\n\t\t// Accept any orphan transactions that depend on this\n\t\t// transaction (they may no longer be orphans if all inputs\n\t\t// are now available) and repeat for those accepted\n\t\t// transactions until there are no more.\n\t\tnewTxs := mp.processOrphans(tx)\n\t\tacceptedTxs := make([]*TxDesc, len(newTxs)+1)\n\n\t\t// Add the parent transaction first so remote nodes\n\t\t// do not add orphans.\n\t\tacceptedTxs[0] = txD\n\t\tcopy(acceptedTxs[1:], newTxs)\n\n\t\treturn acceptedTxs, nil\n\t}\n\n\t// The transaction is an orphan (has inputs missing).  Reject\n\t// it if the flag to allow orphans is not set.\n\tif !allowOrphan {\n\t\t// Only use the first missing parent transaction in\n\t\t// the error message.\n\t\t//\n\t\t// NOTE: RejectDuplicate is really not an accurate\n\t\t// reject code here, but it matches the reference\n\t\t// implementation and there isn't a better choice due\n\t\t// to the limited number of reject codes.  Missing\n\t\t// inputs is assumed to mean they are already spent\n\t\t// which is not really always the case.\n\t\tstr := fmt.Sprintf(\"orphan transaction %v references \"+\n\t\t\t\"outputs of unknown or fully-spent \"+\n\t\t\t\"transaction %v\", tx.Hash(), missingParents[0])\n\t\treturn nil, txRuleError(wire.RejectDuplicate, str)\n\t}\n\n\t// Potentially add the orphan transaction to the orphan pool.\n\terr = mp.maybeAddOrphan(tx, tag)\n\treturn nil, err\n}\n\n// Count returns the number of transactions in the main pool.  It does not\n// include the orphan pool.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) Count() int {\n\tmp.mtx.RLock()\n\tcount := len(mp.pool)\n\tmp.mtx.RUnlock()\n\n\treturn count\n}\n\n// TxHashes returns a slice of hashes for all the transactions in the memory\n// pool.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) TxHashes() []*chainhash.Hash {\n\tmp.mtx.RLock()\n\thashes := make([]*chainhash.Hash, len(mp.pool))\n\ti := 0\n\tfor hash := range mp.pool {\n\t\thashCopy := hash\n\t\thashes[i] = &hashCopy\n\t\ti++\n\t}\n\tmp.mtx.RUnlock()\n\n\treturn hashes\n}\n\n// TxDescs returns a slice of descriptors for all the transactions in the pool.\n// The descriptors are to be treated as read only.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) TxDescs() []*TxDesc {\n\tmp.mtx.RLock()\n\tdescs := make([]*TxDesc, len(mp.pool))\n\ti := 0\n\tfor _, desc := range mp.pool {\n\t\tdescs[i] = desc\n\t\ti++\n\t}\n\tmp.mtx.RUnlock()\n\n\treturn descs\n}\n\n// MiningDescs returns a slice of mining descriptors for all the transactions\n// in the pool.\n//\n// This is part of the mining.TxSource interface implementation and is safe for\n// concurrent access as required by the interface contract.\nfunc (mp *TxPool) MiningDescs() []*mining.TxDesc {\n\tmp.mtx.RLock()\n\tdescs := make([]*mining.TxDesc, len(mp.pool))\n\ti := 0\n\tfor _, desc := range mp.pool {\n\t\tdescs[i] = &desc.TxDesc\n\t\ti++\n\t}\n\tmp.mtx.RUnlock()\n\n\treturn descs\n}\n\n// RawMempoolVerbose returns all the entries in the mempool as a fully\n// populated btcjson result.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) RawMempoolVerbose() map[string]*btcjson.GetRawMempoolVerboseResult {\n\tmp.mtx.RLock()\n\tdefer mp.mtx.RUnlock()\n\n\tresult := make(map[string]*btcjson.GetRawMempoolVerboseResult,\n\t\tlen(mp.pool))\n\tbestHeight := mp.cfg.BestHeight()\n\n\tfor _, desc := range mp.pool {\n\t\t// Calculate the current priority based on the inputs to\n\t\t// the transaction.  Use zero if one or more of the\n\t\t// input transactions can't be found for some reason.\n\t\ttx := desc.Tx\n\t\tvar currentPriority float64\n\t\tutxos, err := mp.fetchInputUtxos(tx)\n\t\tif err == nil {\n\t\t\tcurrentPriority = mining.CalcPriority(tx.MsgTx(), utxos,\n\t\t\t\tbestHeight+1)\n\t\t}\n\n\t\tmpd := &btcjson.GetRawMempoolVerboseResult{\n\t\t\tSize:             int32(tx.MsgTx().SerializeSize()),\n\t\t\tVsize:            int32(GetTxVirtualSize(tx)),\n\t\t\tWeight:           int32(blockchain.GetTransactionWeight(tx)),\n\t\t\tFee:              btcutil.Amount(desc.Fee).ToBTC(),\n\t\t\tTime:             desc.Added.Unix(),\n\t\t\tHeight:           int64(desc.Height),\n\t\t\tStartingPriority: desc.StartingPriority,\n\t\t\tCurrentPriority:  currentPriority,\n\t\t\tDepends:          make([]string, 0),\n\t\t}\n\t\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\t\thash := &txIn.PreviousOutPoint.Hash\n\t\t\tif mp.haveTransaction(hash) {\n\t\t\t\tmpd.Depends = append(mpd.Depends,\n\t\t\t\t\thash.String())\n\t\t\t}\n\t\t}\n\n\t\tresult[tx.Hash().String()] = mpd\n\t}\n\n\treturn result\n}\n\n// LastUpdated returns the last time a transaction was added to or removed from\n// the main pool.  It does not include the orphan pool.\n//\n// This function is safe for concurrent access.\nfunc (mp *TxPool) LastUpdated() time.Time {\n\treturn time.Unix(atomic.LoadInt64(&mp.lastUpdated), 0)\n}\n\n// MempoolAcceptResult holds the result from mempool acceptance check.\ntype MempoolAcceptResult struct {\n\t// TxFee is the fees paid in satoshi.\n\tTxFee btcutil.Amount\n\n\t// TxSize is the virtual size(vb) of the tx.\n\tTxSize int64\n\n\t// conflicts is a set of transactions whose inputs are spent by this\n\t// transaction(RBF).\n\tConflicts map[chainhash.Hash]*btcutil.Tx\n\n\t// MissingParents is a set of outpoints that are used by this\n\t// transaction which cannot be found. Transaction is an orphan if any\n\t// of the referenced transaction outputs don't exist or are already\n\t// spent.\n\t//\n\t// NOTE: this field is mutually exclusive with other fields. If this\n\t// field is not nil, then other fields must be empty.\n\tMissingParents []*chainhash.Hash\n\n\t// utxoView is a set of the unspent transaction outputs referenced by\n\t// the inputs to this transaction.\n\tutxoView *blockchain.UtxoViewpoint\n\n\t// bestHeight is the best known height by the mempool.\n\tbestHeight int32\n}\n\n// CheckMempoolAcceptance behaves similarly to bitcoind's `testmempoolaccept`\n// RPC method. It will perform a series of checks to decide whether this\n// transaction can be accepted to the mempool. If not, the specific error is\n// returned and the caller needs to take actions based on it.\nfunc (mp *TxPool) CheckMempoolAcceptance(tx *btcutil.Tx) (\n\t*MempoolAcceptResult, error) {\n\n\tmp.mtx.RLock()\n\tdefer mp.mtx.RUnlock()\n\n\t// Call checkMempoolAcceptance with isNew=true and rateLimit=true,\n\t// which has the effect that we always check the fee paid from this tx\n\t// is greater than min relay fee. We also reject this tx if it's\n\t// already an orphan.\n\tresult, err := mp.checkMempoolAcceptance(tx, true, true, true)\n\tif err != nil {\n\t\tlog.Errorf(\"CheckMempoolAcceptance: %v\", err)\n\t\treturn nil, err\n\t}\n\n\tlog.Tracef(\"Tx %v passed mempool acceptance check: %v\", tx.Hash(),\n\t\tspew.Sdump(result))\n\n\treturn result, nil\n}\n\n// checkMempoolAcceptance performs a series of validations on the given\n// transaction. It returns an error when the transaction fails to meet the\n// mempool policy, otherwise a `mempoolAcceptResult` is returned.\nfunc (mp *TxPool) checkMempoolAcceptance(tx *btcutil.Tx,\n\tisNew, rateLimit, rejectDupOrphans bool) (*MempoolAcceptResult, error) {\n\n\ttxHash := tx.Hash()\n\n\t// Check for segwit activeness.\n\tif err := mp.validateSegWitDeployment(tx); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Don't accept the transaction if it already exists in the pool. This\n\t// applies to orphan transactions as well when the reject duplicate\n\t// orphans flag is set. This check is intended to be a quick check to\n\t// weed out duplicates.\n\tif mp.isTransactionInPool(txHash) || (rejectDupOrphans &&\n\t\tmp.isOrphanInPool(txHash)) {\n\n\t\tstr := fmt.Sprintf(\"already have transaction in mempool %v\",\n\t\t\ttxHash)\n\t\treturn nil, txRuleError(wire.RejectDuplicate, str)\n\t}\n\n\t// Disallow transactions under the minimum standardness size.\n\tif tx.MsgTx().SerializeSizeStripped() < MinStandardTxNonWitnessSize {\n\t\tstr := fmt.Sprintf(\"tx %v is too small\", txHash)\n\t\treturn nil, txRuleError(wire.RejectNonstandard, str)\n\t}\n\n\t// Perform preliminary sanity checks on the transaction. This makes use\n\t// of blockchain which contains the invariant rules for what\n\t// transactions are allowed into blocks.\n\terr := blockchain.CheckTransactionSanity(tx)\n\tif err != nil {\n\t\tif cerr, ok := err.(blockchain.RuleError); ok {\n\t\t\treturn nil, chainRuleError(cerr)\n\t\t}\n\n\t\treturn nil, err\n\t}\n\n\t// A standalone transaction must not be a coinbase transaction.\n\tif blockchain.IsCoinBase(tx) {\n\t\tstr := fmt.Sprintf(\"transaction is an individual coinbase %v\",\n\t\t\ttxHash)\n\n\t\treturn nil, txRuleError(wire.RejectInvalid, str)\n\t}\n\n\t// Get the current height of the main chain. A standalone transaction\n\t// will be mined into the next block at best, so its height is at least\n\t// one more than the current height.\n\tbestHeight := mp.cfg.BestHeight()\n\tnextBlockHeight := bestHeight + 1\n\n\tmedianTimePast := mp.cfg.MedianTimePast()\n\n\t// The transaction may not use any of the same outputs as other\n\t// transactions already in the pool as that would ultimately result in\n\t// a double spend, unless those transactions signal for RBF. This check\n\t// is intended to be quick and therefore only detects double spends\n\t// within the transaction pool itself. The transaction could still be\n\t// double spending coins from the main chain at this point. There is a\n\t// more in-depth check that happens later after fetching the referenced\n\t// transaction inputs from the main chain which examines the actual\n\t// spend data and prevents double spends.\n\tisReplacement, err := mp.checkPoolDoubleSpend(tx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Fetch all of the unspent transaction outputs referenced by the\n\t// inputs to this transaction. This function also attempts to fetch the\n\t// transaction itself to be used for detecting a duplicate transaction\n\t// without needing to do a separate lookup.\n\tutxoView, err := mp.fetchInputUtxos(tx)\n\tif err != nil {\n\t\tif cerr, ok := err.(blockchain.RuleError); ok {\n\t\t\treturn nil, chainRuleError(cerr)\n\t\t}\n\n\t\treturn nil, err\n\t}\n\n\t// Don't allow the transaction if it exists in the main chain and is\n\t// already fully spent.\n\tprevOut := wire.OutPoint{Hash: *txHash}\n\tfor txOutIdx := range tx.MsgTx().TxOut {\n\t\tprevOut.Index = uint32(txOutIdx)\n\n\t\tentry := utxoView.LookupEntry(prevOut)\n\t\tif entry != nil && !entry.IsSpent() {\n\t\t\treturn nil, txRuleError(wire.RejectDuplicate,\n\t\t\t\t\"transaction already exists in blockchain\")\n\t\t}\n\n\t\tutxoView.RemoveEntry(prevOut)\n\t}\n\n\t// Transaction is an orphan if any of the referenced transaction\n\t// outputs don't exist or are already spent. Adding orphans to the\n\t// orphan pool is not handled by this function, and the caller should\n\t// use maybeAddOrphan if this behavior is desired.\n\tvar missingParents []*chainhash.Hash\n\tfor outpoint, entry := range utxoView.Entries() {\n\t\tif entry == nil || entry.IsSpent() {\n\t\t\t// Must make a copy of the hash here since the iterator\n\t\t\t// is replaced and taking its address directly would\n\t\t\t// result in all the entries pointing to the same\n\t\t\t// memory location and thus all be the final hash.\n\t\t\thashCopy := outpoint.Hash\n\t\t\tmissingParents = append(missingParents, &hashCopy)\n\t\t}\n\t}\n\n\t// Exit early if this transaction is missing parents.\n\tif len(missingParents) > 0 {\n\t\tlog.Debugf(\"Tx %v is an orphan with missing parents: %v\",\n\t\t\ttxHash, missingParents)\n\n\t\treturn &MempoolAcceptResult{\n\t\t\tMissingParents: missingParents,\n\t\t}, nil\n\t}\n\n\t// Perform several checks on the transaction inputs using the invariant\n\t// rules in blockchain for what transactions are allowed into blocks.\n\t// Also returns the fees associated with the transaction which will be\n\t// used later.\n\t//\n\t// NOTE: this check must be performed before `validateStandardness` to\n\t// make sure a nil entry is not returned from `utxoView.LookupEntry`.\n\ttxFee, err := blockchain.CheckTransactionInputs(\n\t\ttx, nextBlockHeight, utxoView, mp.cfg.ChainParams,\n\t)\n\tif err != nil {\n\t\tif cerr, ok := err.(blockchain.RuleError); ok {\n\t\t\treturn nil, chainRuleError(cerr)\n\t\t}\n\t\treturn nil, err\n\t}\n\n\t// Don't allow non-standard transactions or non-standard inputs if the\n\t// network parameters forbid their acceptance.\n\terr = mp.validateStandardness(\n\t\ttx, nextBlockHeight, medianTimePast, utxoView,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Don't allow the transaction into the mempool unless its sequence\n\t// lock is active, meaning that it'll be allowed into the next block\n\t// with respect to its defined relative lock times.\n\tsequenceLock, err := mp.cfg.CalcSequenceLock(tx, utxoView)\n\tif err != nil {\n\t\tif cerr, ok := err.(blockchain.RuleError); ok {\n\t\t\treturn nil, chainRuleError(cerr)\n\t\t}\n\n\t\treturn nil, err\n\t}\n\n\tif !blockchain.SequenceLockActive(\n\t\tsequenceLock, nextBlockHeight, medianTimePast,\n\t) {\n\n\t\treturn nil, txRuleError(wire.RejectNonstandard,\n\t\t\t\"transaction's sequence locks on inputs not met\")\n\t}\n\n\t// Don't allow transactions with an excessive number of signature\n\t// operations which would result in making it impossible to mine.\n\tif err := mp.validateSigCost(tx, utxoView); err != nil {\n\t\treturn nil, err\n\t}\n\n\ttxSize := GetTxVirtualSize(tx)\n\n\t// Don't allow transactions with fees too low to get into a mined\n\t// block.\n\terr = mp.validateRelayFeeMet(\n\t\ttx, txFee, txSize, utxoView, nextBlockHeight, isNew, rateLimit,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// If the transaction has any conflicts, and we've made it this far,\n\t// then we're processing a potential replacement.\n\tvar conflicts map[chainhash.Hash]*btcutil.Tx\n\tif isReplacement {\n\t\tconflicts, err = mp.validateReplacement(tx, txFee)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Verify crypto signatures for each input and reject the transaction\n\t// if any don't verify.\n\terr = blockchain.ValidateTransactionScripts(tx, utxoView,\n\t\ttxscript.StandardVerifyFlags, mp.cfg.SigCache,\n\t\tmp.cfg.HashCache)\n\tif err != nil {\n\t\tif cerr, ok := err.(blockchain.RuleError); ok {\n\t\t\treturn nil, chainRuleError(cerr)\n\t\t}\n\t\treturn nil, err\n\t}\n\n\tresult := &MempoolAcceptResult{\n\t\tTxFee:      btcutil.Amount(txFee),\n\t\tTxSize:     txSize,\n\t\tConflicts:  conflicts,\n\t\tutxoView:   utxoView,\n\t\tbestHeight: bestHeight,\n\t}\n\n\treturn result, nil\n}\n\n// validateSegWitDeployment checks that when a transaction has witness data,\n// segwit must be active.\nfunc (mp *TxPool) validateSegWitDeployment(tx *btcutil.Tx) error {\n\t// Exit early if this transaction doesn't have witness data.\n\tif !tx.MsgTx().HasWitness() {\n\t\treturn nil\n\t}\n\n\t// If a transaction has witness data, and segwit isn't active yet, then\n\t// we won't accept it into the mempool as it can't be mined yet.\n\tsegwitActive, err := mp.cfg.IsDeploymentActive(\n\t\tchaincfg.DeploymentSegwit,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Exit early if segwit is active.\n\tif segwitActive {\n\t\treturn nil\n\t}\n\n\tsimnetHint := \"\"\n\tif mp.cfg.ChainParams.Net == wire.SimNet {\n\t\tbestHeight := mp.cfg.BestHeight()\n\t\tsimnetHint = fmt.Sprintf(\" (The threshold for segwit \"+\n\t\t\t\"activation is 300 blocks on simnet, current best \"+\n\t\t\t\"height is %d)\", bestHeight)\n\t}\n\tstr := fmt.Sprintf(\"transaction %v has witness data, \"+\n\t\t\"but segwit isn't active yet%s\", tx.Hash(), simnetHint)\n\n\treturn txRuleError(wire.RejectNonstandard, str)\n}\n\n// validateStandardness checks the transaction passes both transaction standard\n// and input standard.\nfunc (mp *TxPool) validateStandardness(tx *btcutil.Tx, nextBlockHeight int32,\n\tmedianTimePast time.Time, utxoView *blockchain.UtxoViewpoint) error {\n\n\t// Exit early if we accept non-standard transactions.\n\t//\n\t// NOTE: if you modify this code to accept non-standard transactions,\n\t// you should add code here to check that the transaction does a\n\t// reasonable number of ECDSA signature verifications.\n\tif mp.cfg.Policy.AcceptNonStd {\n\t\treturn nil\n\t}\n\n\t// Check the transaction standard.\n\terr := CheckTransactionStandard(\n\t\ttx, nextBlockHeight, medianTimePast,\n\t\tmp.cfg.Policy.MinRelayTxFee, mp.cfg.Policy.MaxTxVersion,\n\t)\n\tif err != nil {\n\t\t// Attempt to extract a reject code from the error so it can be\n\t\t// retained. When not possible, fall back to a non standard\n\t\t// error.\n\t\trejectCode, found := extractRejectCode(err)\n\t\tif !found {\n\t\t\trejectCode = wire.RejectNonstandard\n\t\t}\n\t\tstr := fmt.Sprintf(\"transaction %v is not standard: %v\",\n\t\t\ttx.Hash(), err)\n\n\t\treturn txRuleError(rejectCode, str)\n\t}\n\n\t// Check the inputs standard.\n\terr = checkInputsStandard(tx, utxoView)\n\tif err != nil {\n\t\t// Attempt to extract a reject code from the error so it can be\n\t\t// retained. When not possible, fall back to a non-standard\n\t\t// error.\n\t\trejectCode, found := extractRejectCode(err)\n\t\tif !found {\n\t\t\trejectCode = wire.RejectNonstandard\n\t\t}\n\t\tstr := fmt.Sprintf(\"transaction %v has a non-standard \"+\n\t\t\t\"input: %v\", tx.Hash(), err)\n\n\t\treturn txRuleError(rejectCode, str)\n\t}\n\n\treturn nil\n}\n\n// validateSigCost checks the cost to run the signature operations to make sure\n// the number of signatures are sane.\nfunc (mp *TxPool) validateSigCost(tx *btcutil.Tx,\n\tutxoView *blockchain.UtxoViewpoint) error {\n\n\t// Since the coinbase address itself can contain signature operations,\n\t// the maximum allowed signature operations per transaction is less\n\t// than the maximum allowed signature operations per block.\n\t//\n\t// TODO(roasbeef): last bool should be conditional on segwit activation\n\tsigOpCost, err := blockchain.GetSigOpCost(\n\t\ttx, false, utxoView, true, true,\n\t)\n\tif err != nil {\n\t\tif cerr, ok := err.(blockchain.RuleError); ok {\n\t\t\treturn chainRuleError(cerr)\n\t\t}\n\n\t\treturn err\n\t}\n\n\t// Exit early if the sig cost is under limit.\n\tif sigOpCost <= mp.cfg.Policy.MaxSigOpCostPerTx {\n\t\treturn nil\n\t}\n\n\tstr := fmt.Sprintf(\"transaction %v sigop cost is too high: %d > %d\",\n\t\ttx.Hash(), sigOpCost, mp.cfg.Policy.MaxSigOpCostPerTx)\n\n\treturn txRuleError(wire.RejectNonstandard, str)\n}\n\n// validateRelayFeeMet checks that the min relay fee is covered by this\n// transaction.\nfunc (mp *TxPool) validateRelayFeeMet(tx *btcutil.Tx, txFee, txSize int64,\n\tutxoView *blockchain.UtxoViewpoint, nextBlockHeight int32,\n\tisNew, rateLimit bool) error {\n\n\ttxHash := tx.Hash()\n\n\t// Most miners allow a free transaction area in blocks they mine to go\n\t// alongside the area used for high-priority transactions as well as\n\t// transactions with fees. A transaction size of up to 1000 bytes is\n\t// considered safe to go into this section. Further, the minimum fee\n\t// calculated below on its own would encourage several small\n\t// transactions to avoid fees rather than one single larger transaction\n\t// which is more desirable. Therefore, as long as the size of the\n\t// transaction does not exceed 1000 less than the reserved space for\n\t// high-priority transactions, don't require a fee for it.\n\tminFee := calcMinRequiredTxRelayFee(txSize, mp.cfg.Policy.MinRelayTxFee)\n\n\tif txSize >= (DefaultBlockPrioritySize-1000) && txFee < minFee {\n\t\tstr := fmt.Sprintf(\"transaction %v has %d fees which is under \"+\n\t\t\t\"the required amount of %d\", txHash, txFee, minFee)\n\n\t\treturn txRuleError(wire.RejectInsufficientFee, str)\n\t}\n\n\t// Exit early if the min relay fee is met.\n\tif txFee >= minFee {\n\t\treturn nil\n\t}\n\n\t// Exit early if this is neither a new tx or rate limited.\n\tif !isNew && !rateLimit {\n\t\treturn nil\n\t}\n\n\t// Require that free transactions have sufficient priority to be mined\n\t// in the next block. Transactions which are being added back to the\n\t// memory pool from blocks that have been disconnected during a reorg\n\t// are exempted.\n\tif isNew && !mp.cfg.Policy.DisableRelayPriority {\n\t\tcurrentPriority := mining.CalcPriority(\n\t\t\ttx.MsgTx(), utxoView, nextBlockHeight,\n\t\t)\n\t\tif currentPriority <= mining.MinHighPriority {\n\t\t\tstr := fmt.Sprintf(\"transaction %v has insufficient \"+\n\t\t\t\t\"priority (%g <= %g)\", txHash,\n\t\t\t\tcurrentPriority, mining.MinHighPriority)\n\n\t\t\treturn txRuleError(wire.RejectInsufficientFee, str)\n\t\t}\n\t}\n\n\t// We can only end up here when the rateLimit is true. Free-to-relay\n\t// transactions are rate limited here to prevent penny-flooding with\n\t// tiny transactions as a form of attack.\n\tnowUnix := time.Now().Unix()\n\n\t// Decay passed data with an exponentially decaying ~10 minute window -\n\t// matches bitcoind handling.\n\tmp.pennyTotal *= math.Pow(\n\t\t1.0-1.0/600.0, float64(nowUnix-mp.lastPennyUnix),\n\t)\n\tmp.lastPennyUnix = nowUnix\n\n\t// Are we still over the limit?\n\tif mp.pennyTotal >= mp.cfg.Policy.FreeTxRelayLimit*10*1000 {\n\t\tstr := fmt.Sprintf(\"transaction %v has been rejected \"+\n\t\t\t\"by the rate limiter due to low fees\", txHash)\n\n\t\treturn txRuleError(wire.RejectInsufficientFee, str)\n\t}\n\n\toldTotal := mp.pennyTotal\n\tmp.pennyTotal += float64(txSize)\n\tlog.Tracef(\"rate limit: curTotal %v, nextTotal: %v, limit %v\",\n\t\toldTotal, mp.pennyTotal, mp.cfg.Policy.FreeTxRelayLimit*10*1000)\n\n\treturn nil\n}\n\n// New returns a new memory pool for validating and storing standalone\n// transactions until they are mined into a block.\nfunc New(cfg *Config) *TxPool {\n\treturn &TxPool{\n\t\tcfg:            *cfg,\n\t\tpool:           make(map[chainhash.Hash]*TxDesc),\n\t\torphans:        make(map[chainhash.Hash]*orphanTx),\n\t\torphansByPrev:  make(map[wire.OutPoint]map[chainhash.Hash]*btcutil.Tx),\n\t\tnextExpireScan: time.Now().Add(orphanExpireScanInterval),\n\t\toutpoints:      make(map[wire.OutPoint]*btcutil.Tx),\n\t}\n}\n"
  },
  {
    "path": "mempool/mempool_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mempool\n\nimport (\n\t\"encoding/hex\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// fakeChain is used by the pool harness to provide generated test utxos and\n// a current faked chain height to the pool callbacks.  This, in turn, allows\n// transactions to appear as though they are spending completely valid utxos.\ntype fakeChain struct {\n\tsync.RWMutex\n\tutxos          *blockchain.UtxoViewpoint\n\tcurrentHeight  int32\n\tmedianTimePast time.Time\n}\n\n// FetchUtxoView loads utxo details about the inputs referenced by the passed\n// transaction from the point of view of the fake chain.  It also attempts to\n// fetch the utxos for the outputs of the transaction itself so the returned\n// view can be examined for duplicate transactions.\n//\n// This function is safe for concurrent access however the returned view is NOT.\nfunc (s *fakeChain) FetchUtxoView(tx *btcutil.Tx) (*blockchain.UtxoViewpoint, error) {\n\ts.RLock()\n\tdefer s.RUnlock()\n\n\t// All entries are cloned to ensure modifications to the returned view\n\t// do not affect the fake chain's view.\n\n\t// Add an entry for the tx itself to the new view.\n\tviewpoint := blockchain.NewUtxoViewpoint()\n\tprevOut := wire.OutPoint{Hash: *tx.Hash()}\n\tfor txOutIdx := range tx.MsgTx().TxOut {\n\t\tprevOut.Index = uint32(txOutIdx)\n\t\tentry := s.utxos.LookupEntry(prevOut)\n\t\tviewpoint.Entries()[prevOut] = entry.Clone()\n\t}\n\n\t// Add entries for all of the inputs to the tx to the new view.\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tentry := s.utxos.LookupEntry(txIn.PreviousOutPoint)\n\t\tviewpoint.Entries()[txIn.PreviousOutPoint] = entry.Clone()\n\t}\n\n\treturn viewpoint, nil\n}\n\n// BestHeight returns the current height associated with the fake chain\n// instance.\nfunc (s *fakeChain) BestHeight() int32 {\n\ts.RLock()\n\theight := s.currentHeight\n\ts.RUnlock()\n\treturn height\n}\n\n// SetHeight sets the current height associated with the fake chain instance.\nfunc (s *fakeChain) SetHeight(height int32) {\n\ts.Lock()\n\ts.currentHeight = height\n\ts.Unlock()\n}\n\n// MedianTimePast returns the current median time past associated with the fake\n// chain instance.\nfunc (s *fakeChain) MedianTimePast() time.Time {\n\ts.RLock()\n\tmtp := s.medianTimePast\n\ts.RUnlock()\n\treturn mtp\n}\n\n// SetMedianTimePast sets the current median time past associated with the fake\n// chain instance.\nfunc (s *fakeChain) SetMedianTimePast(mtp time.Time) {\n\ts.Lock()\n\ts.medianTimePast = mtp\n\ts.Unlock()\n}\n\n// CalcSequenceLock returns the current sequence lock for the passed\n// transaction associated with the fake chain instance.\nfunc (s *fakeChain) CalcSequenceLock(tx *btcutil.Tx,\n\tview *blockchain.UtxoViewpoint) (*blockchain.SequenceLock, error) {\n\n\treturn &blockchain.SequenceLock{\n\t\tSeconds:     -1,\n\t\tBlockHeight: -1,\n\t}, nil\n}\n\n// spendableOutput is a convenience type that houses a particular utxo and the\n// amount associated with it.\ntype spendableOutput struct {\n\toutPoint wire.OutPoint\n\tamount   btcutil.Amount\n}\n\n// txOutToSpendableOut returns a spendable output given a transaction and index\n// of the output to use.  This is useful as a convenience when creating test\n// transactions.\nfunc txOutToSpendableOut(tx *btcutil.Tx, outputNum uint32) spendableOutput {\n\treturn spendableOutput{\n\t\toutPoint: wire.OutPoint{Hash: *tx.Hash(), Index: outputNum},\n\t\tamount:   btcutil.Amount(tx.MsgTx().TxOut[outputNum].Value),\n\t}\n}\n\n// poolHarness provides a harness that includes functionality for creating and\n// signing transactions as well as a fake chain that provides utxos for use in\n// generating valid transactions.\ntype poolHarness struct {\n\t// signKey is the signing key used for creating transactions throughout\n\t// the tests.\n\t//\n\t// payAddr is the p2sh address for the signing key and is used for the\n\t// payment address throughout the tests.\n\tsignKey     *btcec.PrivateKey\n\tpayAddr     btcutil.Address\n\tpayScript   []byte\n\tchainParams *chaincfg.Params\n\n\tchain  *fakeChain\n\ttxPool *TxPool\n}\n\n// CreateCoinbaseTx returns a coinbase transaction with the requested number of\n// outputs paying an appropriate subsidy based on the passed block height to the\n// address associated with the harness.  It automatically uses a standard\n// signature script that starts with the block height that is required by\n// version 2 blocks.\nfunc (p *poolHarness) CreateCoinbaseTx(blockHeight int32, numOutputs uint32) (*btcutil.Tx, error) {\n\t// Create standard coinbase script.\n\textraNonce := int64(0)\n\tcoinbaseScript, err := txscript.NewScriptBuilder().\n\t\tAddInt64(int64(blockHeight)).AddInt64(extraNonce).Script()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttx := wire.NewMsgTx(wire.TxVersion)\n\ttx.AddTxIn(&wire.TxIn{\n\t\t// Coinbase transactions have no inputs, so previous outpoint is\n\t\t// zero hash and max index.\n\t\tPreviousOutPoint: *wire.NewOutPoint(&chainhash.Hash{},\n\t\t\twire.MaxPrevOutIndex),\n\t\tSignatureScript: coinbaseScript,\n\t\tSequence:        wire.MaxTxInSequenceNum,\n\t})\n\ttotalInput := blockchain.CalcBlockSubsidy(blockHeight, p.chainParams)\n\tamountPerOutput := totalInput / int64(numOutputs)\n\tremainder := totalInput - amountPerOutput*int64(numOutputs)\n\tfor i := uint32(0); i < numOutputs; i++ {\n\t\t// Ensure the final output accounts for any remainder that might\n\t\t// be left from splitting the input amount.\n\t\tamount := amountPerOutput\n\t\tif i == numOutputs-1 {\n\t\t\tamount = amountPerOutput + remainder\n\t\t}\n\t\ttx.AddTxOut(&wire.TxOut{\n\t\t\tPkScript: p.payScript,\n\t\t\tValue:    amount,\n\t\t})\n\t}\n\n\treturn btcutil.NewTx(tx), nil\n}\n\n// CreateSignedTx creates a new signed transaction that consumes the provided\n// inputs and generates the provided number of outputs by evenly splitting the\n// total input amount.  All outputs will be to the payment script associated\n// with the harness and all inputs are assumed to do the same.\nfunc (p *poolHarness) CreateSignedTx(inputs []spendableOutput,\n\tnumOutputs uint32, fee btcutil.Amount,\n\tsignalsReplacement bool) (*btcutil.Tx, error) {\n\n\t// Calculate the total input amount and split it amongst the requested\n\t// number of outputs.\n\tvar totalInput btcutil.Amount\n\tfor _, input := range inputs {\n\t\ttotalInput += input.amount\n\t}\n\ttotalInput -= fee\n\tamountPerOutput := int64(totalInput) / int64(numOutputs)\n\tremainder := int64(totalInput) - amountPerOutput*int64(numOutputs)\n\n\ttx := wire.NewMsgTx(wire.TxVersion)\n\tsequence := wire.MaxTxInSequenceNum\n\tif signalsReplacement {\n\t\tsequence = MaxRBFSequence\n\t}\n\tfor _, input := range inputs {\n\t\ttx.AddTxIn(&wire.TxIn{\n\t\t\tPreviousOutPoint: input.outPoint,\n\t\t\tSignatureScript:  nil,\n\t\t\tSequence:         sequence,\n\t\t})\n\t}\n\tfor i := uint32(0); i < numOutputs; i++ {\n\t\t// Ensure the final output accounts for any remainder that might\n\t\t// be left from splitting the input amount.\n\t\tamount := amountPerOutput\n\t\tif i == numOutputs-1 {\n\t\t\tamount = amountPerOutput + remainder\n\t\t}\n\t\ttx.AddTxOut(&wire.TxOut{\n\t\t\tPkScript: p.payScript,\n\t\t\tValue:    amount,\n\t\t})\n\t}\n\n\t// Sign the new transaction.\n\tfor i := range tx.TxIn {\n\t\tsigScript, err := txscript.SignatureScript(tx, i, p.payScript,\n\t\t\ttxscript.SigHashAll, p.signKey, true)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttx.TxIn[i].SignatureScript = sigScript\n\t}\n\n\treturn btcutil.NewTx(tx), nil\n}\n\n// CreateTxChain creates a chain of zero-fee transactions (each subsequent\n// transaction spends the entire amount from the previous one) with the first\n// one spending the provided outpoint.  Each transaction spends the entire\n// amount of the previous one and as such does not include any fees.\nfunc (p *poolHarness) CreateTxChain(firstOutput spendableOutput, numTxns uint32) ([]*btcutil.Tx, error) {\n\ttxChain := make([]*btcutil.Tx, 0, numTxns)\n\tprevOutPoint := firstOutput.outPoint\n\tspendableAmount := firstOutput.amount\n\tfor i := uint32(0); i < numTxns; i++ {\n\t\t// Create the transaction using the previous transaction output\n\t\t// and paying the full amount to the payment address associated\n\t\t// with the harness.\n\t\ttx := wire.NewMsgTx(wire.TxVersion)\n\t\ttx.AddTxIn(&wire.TxIn{\n\t\t\tPreviousOutPoint: prevOutPoint,\n\t\t\tSignatureScript:  nil,\n\t\t\tSequence:         wire.MaxTxInSequenceNum,\n\t\t})\n\t\ttx.AddTxOut(&wire.TxOut{\n\t\t\tPkScript: p.payScript,\n\t\t\tValue:    int64(spendableAmount),\n\t\t})\n\n\t\t// Sign the new transaction.\n\t\tsigScript, err := txscript.SignatureScript(tx, 0, p.payScript,\n\t\t\ttxscript.SigHashAll, p.signKey, true)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttx.TxIn[0].SignatureScript = sigScript\n\n\t\ttxChain = append(txChain, btcutil.NewTx(tx))\n\n\t\t// Next transaction uses outputs from this one.\n\t\tprevOutPoint = wire.OutPoint{Hash: tx.TxHash(), Index: 0}\n\t}\n\n\treturn txChain, nil\n}\n\n// newPoolHarness returns a new instance of a pool harness initialized with a\n// fake chain and a TxPool bound to it that is configured with a policy suitable\n// for testing.  Also, the fake chain is populated with the returned spendable\n// outputs so the caller can easily create new valid transactions which build\n// off of it.\nfunc newPoolHarness(chainParams *chaincfg.Params) (*poolHarness, []spendableOutput, error) {\n\t// Use a hard coded key pair for deterministic results.\n\tkeyBytes, err := hex.DecodeString(\"700868df1838811ffbdf918fb482c1f7e\" +\n\t\t\"ad62db4b97bd7012c23e726485e577d\")\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tsignKey, signPub := btcec.PrivKeyFromBytes(keyBytes)\n\n\t// Generate associated pay-to-script-hash address and resulting payment\n\t// script.\n\tpubKeyBytes := signPub.SerializeCompressed()\n\tpayPubKeyAddr, err := btcutil.NewAddressPubKey(pubKeyBytes, chainParams)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tpayAddr := payPubKeyAddr.AddressPubKeyHash()\n\tpkScript, err := txscript.PayToAddrScript(payAddr)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// Create a new fake chain and harness bound to it.\n\tchain := &fakeChain{utxos: blockchain.NewUtxoViewpoint()}\n\tharness := poolHarness{\n\t\tsignKey:     signKey,\n\t\tpayAddr:     payAddr,\n\t\tpayScript:   pkScript,\n\t\tchainParams: chainParams,\n\n\t\tchain: chain,\n\t\ttxPool: New(&Config{\n\t\t\tPolicy: Policy{\n\t\t\t\tDisableRelayPriority: true,\n\t\t\t\tFreeTxRelayLimit:     15.0,\n\t\t\t\tMaxOrphanTxs:         5,\n\t\t\t\tMaxOrphanTxSize:      1000,\n\t\t\t\tMaxSigOpCostPerTx:    blockchain.MaxBlockSigOpsCost / 4,\n\t\t\t\tMinRelayTxFee:        1000, // 1 Satoshi per byte\n\t\t\t\tMaxTxVersion:         1,\n\t\t\t},\n\t\t\tChainParams:      chainParams,\n\t\t\tFetchUtxoView:    chain.FetchUtxoView,\n\t\t\tBestHeight:       chain.BestHeight,\n\t\t\tMedianTimePast:   chain.MedianTimePast,\n\t\t\tCalcSequenceLock: chain.CalcSequenceLock,\n\t\t\tSigCache:         nil,\n\t\t\tAddrIndex:        nil,\n\t\t}),\n\t}\n\n\t// Create a single coinbase transaction and add it to the harness\n\t// chain's utxo set and set the harness chain height such that the\n\t// coinbase will mature in the next block.  This ensures the txpool\n\t// accepts transactions which spend immature coinbases that will become\n\t// mature in the next block.\n\tnumOutputs := uint32(1)\n\toutputs := make([]spendableOutput, 0, numOutputs)\n\tcurHeight := harness.chain.BestHeight()\n\tcoinbase, err := harness.CreateCoinbaseTx(curHeight+1, numOutputs)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tharness.chain.utxos.AddTxOuts(coinbase, curHeight+1)\n\tfor i := uint32(0); i < numOutputs; i++ {\n\t\toutputs = append(outputs, txOutToSpendableOut(coinbase, i))\n\t}\n\tharness.chain.SetHeight(int32(chainParams.CoinbaseMaturity) + curHeight)\n\tharness.chain.SetMedianTimePast(time.Now())\n\n\treturn &harness, outputs, nil\n}\n\n// testContext houses a test-related state that is useful to pass to helper\n// functions as a single argument.\ntype testContext struct {\n\tt       *testing.T\n\tharness *poolHarness\n}\n\n// addCoinbaseTx adds a spendable coinbase transaction to the test context's\n// mock chain.\nfunc (ctx *testContext) addCoinbaseTx(numOutputs uint32) *btcutil.Tx {\n\tctx.t.Helper()\n\n\tcoinbaseHeight := ctx.harness.chain.BestHeight() + 1\n\tcoinbase, err := ctx.harness.CreateCoinbaseTx(coinbaseHeight, numOutputs)\n\tif err != nil {\n\t\tctx.t.Fatalf(\"unable to create coinbase: %v\", err)\n\t}\n\n\tctx.harness.chain.utxos.AddTxOuts(coinbase, coinbaseHeight)\n\tmaturity := int32(ctx.harness.chainParams.CoinbaseMaturity)\n\tctx.harness.chain.SetHeight(coinbaseHeight + maturity)\n\tctx.harness.chain.SetMedianTimePast(time.Now())\n\n\treturn coinbase\n}\n\n// addSignedTx creates a transaction that spends the inputs with the given fee.\n// It can be added to the test context's mempool or mock chain based on the\n// confirmed boolean.\nfunc (ctx *testContext) addSignedTx(inputs []spendableOutput,\n\tnumOutputs uint32, fee btcutil.Amount,\n\tsignalsReplacement, confirmed bool) *btcutil.Tx {\n\n\tctx.t.Helper()\n\n\ttx, err := ctx.harness.CreateSignedTx(\n\t\tinputs, numOutputs, fee, signalsReplacement,\n\t)\n\tif err != nil {\n\t\tctx.t.Fatalf(\"unable to create transaction: %v\", err)\n\t}\n\n\tif confirmed {\n\t\tnewHeight := ctx.harness.chain.BestHeight() + 1\n\t\tctx.harness.chain.utxos.AddTxOuts(tx, newHeight)\n\t\tctx.harness.chain.SetHeight(newHeight)\n\t\tctx.harness.chain.SetMedianTimePast(time.Now())\n\t} else {\n\t\tacceptedTxns, err := ctx.harness.txPool.ProcessTransaction(\n\t\t\ttx, true, false, 0,\n\t\t)\n\t\tif err != nil {\n\t\t\tctx.t.Fatalf(\"unable to process transaction: %v\", err)\n\t\t}\n\t\tif len(acceptedTxns) != 1 {\n\t\t\tctx.t.Fatalf(\"expected one accepted transaction, got %d\",\n\t\t\t\tlen(acceptedTxns))\n\t\t}\n\t\ttestPoolMembership(ctx, tx, false, true)\n\t}\n\n\treturn tx\n}\n\n// testPoolMembership tests the transaction pool associated with the provided\n// test context to determine if the passed transaction matches the provided\n// orphan pool and transaction pool status.  It also further determines if it\n// should be reported as available by the HaveTransaction function based upon\n// the two flags and tests that condition as well.\nfunc testPoolMembership(tc *testContext, tx *btcutil.Tx, inOrphanPool, inTxPool bool) {\n\ttc.t.Helper()\n\n\ttxHash := tx.Hash()\n\tgotOrphanPool := tc.harness.txPool.IsOrphanInPool(txHash)\n\tif inOrphanPool != gotOrphanPool {\n\t\ttc.t.Fatalf(\"IsOrphanInPool: want %v, got %v\", inOrphanPool,\n\t\t\tgotOrphanPool)\n\t}\n\n\tgotTxPool := tc.harness.txPool.IsTransactionInPool(txHash)\n\tif inTxPool != gotTxPool {\n\t\ttc.t.Fatalf(\"IsTransactionInPool: want %v, got %v\", inTxPool,\n\t\t\tgotTxPool)\n\t}\n\n\tgotHaveTx := tc.harness.txPool.HaveTransaction(txHash)\n\twantHaveTx := inOrphanPool || inTxPool\n\tif wantHaveTx != gotHaveTx {\n\t\ttc.t.Fatalf(\"HaveTransaction: want %v, got %v\", wantHaveTx,\n\t\t\tgotHaveTx)\n\t}\n}\n\n// TestSimpleOrphanChain ensures that a simple chain of orphans is handled\n// properly.  In particular, it generates a chain of single input, single output\n// transactions and inserts them while skipping the first linking transaction so\n// they are all orphans.  Finally, it adds the linking transaction and ensures\n// the entire orphan chain is moved to the transaction pool.\nfunc TestSimpleOrphanChain(t *testing.T) {\n\tt.Parallel()\n\n\tharness, spendableOuts, err := newPoolHarness(&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t}\n\ttc := &testContext{t, harness}\n\n\t// Create a chain of transactions rooted with the first spendable output\n\t// provided by the harness.\n\tmaxOrphans := uint32(harness.txPool.cfg.Policy.MaxOrphanTxs)\n\tchainedTxns, err := harness.CreateTxChain(spendableOuts[0], maxOrphans+1)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create transaction chain: %v\", err)\n\t}\n\n\t// Ensure the orphans are accepted (only up to the maximum allowed so\n\t// none are evicted).\n\tfor _, tx := range chainedTxns[1 : maxOrphans+1] {\n\t\tacceptedTxns, err := harness.txPool.ProcessTransaction(tx, true,\n\t\t\tfalse, 0)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"ProcessTransaction: failed to accept valid \"+\n\t\t\t\t\"orphan %v\", err)\n\t\t}\n\n\t\t// Ensure no transactions were reported as accepted.\n\t\tif len(acceptedTxns) != 0 {\n\t\t\tt.Fatalf(\"ProcessTransaction: reported %d accepted \"+\n\t\t\t\t\"transactions from what should be an orphan\",\n\t\t\t\tlen(acceptedTxns))\n\t\t}\n\n\t\t// Ensure the transaction is in the orphan pool, is not in the\n\t\t// transaction pool, and is reported as available.\n\t\ttestPoolMembership(tc, tx, true, false)\n\t}\n\n\t// Add the transaction which completes the orphan chain and ensure they\n\t// all get accepted.  Notice the accept orphans flag is also false here\n\t// to ensure it has no bearing on whether or not already existing\n\t// orphans in the pool are linked.\n\tacceptedTxns, err := harness.txPool.ProcessTransaction(chainedTxns[0],\n\t\tfalse, false, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"ProcessTransaction: failed to accept valid \"+\n\t\t\t\"orphan %v\", err)\n\t}\n\tif len(acceptedTxns) != len(chainedTxns) {\n\t\tt.Fatalf(\"ProcessTransaction: reported accepted transactions \"+\n\t\t\t\"length does not match expected -- got %d, want %d\",\n\t\t\tlen(acceptedTxns), len(chainedTxns))\n\t}\n\tfor _, txD := range acceptedTxns {\n\t\t// Ensure the transaction is no longer in the orphan pool, is\n\t\t// now in the transaction pool, and is reported as available.\n\t\ttestPoolMembership(tc, txD.Tx, false, true)\n\t}\n}\n\n// TestOrphanReject ensures that orphans are properly rejected when the allow\n// orphans flag is not set on ProcessTransaction.\nfunc TestOrphanReject(t *testing.T) {\n\tt.Parallel()\n\n\tharness, outputs, err := newPoolHarness(&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t}\n\ttc := &testContext{t, harness}\n\n\t// Create a chain of transactions rooted with the first spendable output\n\t// provided by the harness.\n\tmaxOrphans := uint32(harness.txPool.cfg.Policy.MaxOrphanTxs)\n\tchainedTxns, err := harness.CreateTxChain(outputs[0], maxOrphans+1)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create transaction chain: %v\", err)\n\t}\n\n\t// Ensure orphans are rejected when the allow orphans flag is not set.\n\tfor _, tx := range chainedTxns[1:] {\n\t\tacceptedTxns, err := harness.txPool.ProcessTransaction(tx, false,\n\t\t\tfalse, 0)\n\t\tif err == nil {\n\t\t\tt.Fatalf(\"ProcessTransaction: did not fail on orphan \"+\n\t\t\t\t\"%v when allow orphans flag is false\", tx.Hash())\n\t\t}\n\t\texpectedErr := RuleError{}\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(expectedErr) {\n\t\t\tt.Fatalf(\"ProcessTransaction: wrong error got: <%T> %v, \"+\n\t\t\t\t\"want: <%T>\", err, err, expectedErr)\n\t\t}\n\t\tcode, extracted := extractRejectCode(err)\n\t\tif !extracted {\n\t\t\tt.Fatalf(\"ProcessTransaction: failed to extract reject \"+\n\t\t\t\t\"code from error %q\", err)\n\t\t}\n\t\tif code != wire.RejectDuplicate {\n\t\t\tt.Fatalf(\"ProcessTransaction: unexpected reject code \"+\n\t\t\t\t\"-- got %v, want %v\", code, wire.RejectDuplicate)\n\t\t}\n\n\t\t// Ensure no transactions were reported as accepted.\n\t\tif len(acceptedTxns) != 0 {\n\t\t\tt.Fatalf(\"ProcessTransaction: reported %d accepted \"+\n\t\t\t\t\"transactions from failed orphan attempt\",\n\t\t\t\tlen(acceptedTxns))\n\t\t}\n\n\t\t// Ensure the transaction is not in the orphan pool, not in the\n\t\t// transaction pool, and not reported as available\n\t\ttestPoolMembership(tc, tx, false, false)\n\t}\n}\n\n// TestOrphanEviction ensures that exceeding the maximum number of orphans\n// evicts entries to make room for the new ones.\nfunc TestOrphanEviction(t *testing.T) {\n\tt.Parallel()\n\n\tharness, outputs, err := newPoolHarness(&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t}\n\ttc := &testContext{t, harness}\n\n\t// Create a chain of transactions rooted with the first spendable output\n\t// provided by the harness that is long enough to be able to force\n\t// several orphan evictions.\n\tmaxOrphans := uint32(harness.txPool.cfg.Policy.MaxOrphanTxs)\n\tchainedTxns, err := harness.CreateTxChain(outputs[0], maxOrphans+5)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create transaction chain: %v\", err)\n\t}\n\n\t// Add enough orphans to exceed the max allowed while ensuring they are\n\t// all accepted.  This will cause an eviction.\n\tfor _, tx := range chainedTxns[1:] {\n\t\tacceptedTxns, err := harness.txPool.ProcessTransaction(tx, true,\n\t\t\tfalse, 0)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"ProcessTransaction: failed to accept valid \"+\n\t\t\t\t\"orphan %v\", err)\n\t\t}\n\n\t\t// Ensure no transactions were reported as accepted.\n\t\tif len(acceptedTxns) != 0 {\n\t\t\tt.Fatalf(\"ProcessTransaction: reported %d accepted \"+\n\t\t\t\t\"transactions from what should be an orphan\",\n\t\t\t\tlen(acceptedTxns))\n\t\t}\n\n\t\t// Ensure the transaction is in the orphan pool, is not in the\n\t\t// transaction pool, and is reported as available.\n\t\ttestPoolMembership(tc, tx, true, false)\n\t}\n\n\t// Figure out which transactions were evicted and make sure the number\n\t// evicted matches the expected number.\n\tvar evictedTxns []*btcutil.Tx\n\tfor _, tx := range chainedTxns[1:] {\n\t\tif !harness.txPool.IsOrphanInPool(tx.Hash()) {\n\t\t\tevictedTxns = append(evictedTxns, tx)\n\t\t}\n\t}\n\texpectedEvictions := len(chainedTxns) - 1 - int(maxOrphans)\n\tif len(evictedTxns) != expectedEvictions {\n\t\tt.Fatalf(\"unexpected number of evictions -- got %d, want %d\",\n\t\t\tlen(evictedTxns), expectedEvictions)\n\t}\n\n\t// Ensure none of the evicted transactions ended up in the transaction\n\t// pool.\n\tfor _, tx := range evictedTxns {\n\t\ttestPoolMembership(tc, tx, false, false)\n\t}\n}\n\n// TestBasicOrphanRemoval ensure that orphan removal works as expected when an\n// orphan that doesn't exist is removed  both when there is another orphan that\n// redeems it and when there is not.\nfunc TestBasicOrphanRemoval(t *testing.T) {\n\tt.Parallel()\n\n\tconst maxOrphans = 4\n\tharness, spendableOuts, err := newPoolHarness(&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t}\n\tharness.txPool.cfg.Policy.MaxOrphanTxs = maxOrphans\n\ttc := &testContext{t, harness}\n\n\t// Create a chain of transactions rooted with the first spendable output\n\t// provided by the harness.\n\tchainedTxns, err := harness.CreateTxChain(spendableOuts[0], maxOrphans+1)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create transaction chain: %v\", err)\n\t}\n\n\t// Ensure the orphans are accepted (only up to the maximum allowed so\n\t// none are evicted).\n\tfor _, tx := range chainedTxns[1 : maxOrphans+1] {\n\t\tacceptedTxns, err := harness.txPool.ProcessTransaction(tx, true,\n\t\t\tfalse, 0)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"ProcessTransaction: failed to accept valid \"+\n\t\t\t\t\"orphan %v\", err)\n\t\t}\n\n\t\t// Ensure no transactions were reported as accepted.\n\t\tif len(acceptedTxns) != 0 {\n\t\t\tt.Fatalf(\"ProcessTransaction: reported %d accepted \"+\n\t\t\t\t\"transactions from what should be an orphan\",\n\t\t\t\tlen(acceptedTxns))\n\t\t}\n\n\t\t// Ensure the transaction is in the orphan pool, not in the\n\t\t// transaction pool, and reported as available.\n\t\ttestPoolMembership(tc, tx, true, false)\n\t}\n\n\t// Attempt to remove an orphan that has no redeemers and is not present,\n\t// and ensure the state of all other orphans are unaffected.\n\tnonChainedOrphanTx, err := harness.CreateSignedTx([]spendableOutput{{\n\t\tamount:   btcutil.Amount(5000000000),\n\t\toutPoint: wire.OutPoint{Hash: chainhash.Hash{}, Index: 0},\n\t}}, 1, 0, false)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create signed tx: %v\", err)\n\t}\n\n\tharness.txPool.RemoveOrphan(nonChainedOrphanTx)\n\ttestPoolMembership(tc, nonChainedOrphanTx, false, false)\n\tfor _, tx := range chainedTxns[1 : maxOrphans+1] {\n\t\ttestPoolMembership(tc, tx, true, false)\n\t}\n\n\t// Attempt to remove an orphan that has a existing redeemer but itself\n\t// is not present and ensure the state of all other orphans (including\n\t// the one that redeems it) are unaffected.\n\tharness.txPool.RemoveOrphan(chainedTxns[0])\n\ttestPoolMembership(tc, chainedTxns[0], false, false)\n\tfor _, tx := range chainedTxns[1 : maxOrphans+1] {\n\t\ttestPoolMembership(tc, tx, true, false)\n\t}\n\n\t// Remove each orphan one-by-one and ensure they are removed as\n\t// expected.\n\tfor _, tx := range chainedTxns[1 : maxOrphans+1] {\n\t\tharness.txPool.RemoveOrphan(tx)\n\t\ttestPoolMembership(tc, tx, false, false)\n\t}\n}\n\n// TestOrphanChainRemoval ensure that orphan chains (orphans that spend outputs\n// from other orphans) are removed as expected.\nfunc TestOrphanChainRemoval(t *testing.T) {\n\tt.Parallel()\n\n\tconst maxOrphans = 10\n\tharness, spendableOuts, err := newPoolHarness(&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t}\n\tharness.txPool.cfg.Policy.MaxOrphanTxs = maxOrphans\n\ttc := &testContext{t, harness}\n\n\t// Create a chain of transactions rooted with the first spendable output\n\t// provided by the harness.\n\tchainedTxns, err := harness.CreateTxChain(spendableOuts[0], maxOrphans+1)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create transaction chain: %v\", err)\n\t}\n\n\t// Ensure the orphans are accepted (only up to the maximum allowed so\n\t// none are evicted).\n\tfor _, tx := range chainedTxns[1 : maxOrphans+1] {\n\t\tacceptedTxns, err := harness.txPool.ProcessTransaction(tx, true,\n\t\t\tfalse, 0)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"ProcessTransaction: failed to accept valid \"+\n\t\t\t\t\"orphan %v\", err)\n\t\t}\n\n\t\t// Ensure no transactions were reported as accepted.\n\t\tif len(acceptedTxns) != 0 {\n\t\t\tt.Fatalf(\"ProcessTransaction: reported %d accepted \"+\n\t\t\t\t\"transactions from what should be an orphan\",\n\t\t\t\tlen(acceptedTxns))\n\t\t}\n\n\t\t// Ensure the transaction is in the orphan pool, not in the\n\t\t// transaction pool, and reported as available.\n\t\ttestPoolMembership(tc, tx, true, false)\n\t}\n\n\t// Remove the first orphan that starts the orphan chain without the\n\t// remove redeemer flag set and ensure that only the first orphan was\n\t// removed.\n\tharness.txPool.mtx.Lock()\n\tharness.txPool.removeOrphan(chainedTxns[1], false)\n\tharness.txPool.mtx.Unlock()\n\ttestPoolMembership(tc, chainedTxns[1], false, false)\n\tfor _, tx := range chainedTxns[2 : maxOrphans+1] {\n\t\ttestPoolMembership(tc, tx, true, false)\n\t}\n\n\t// Remove the first remaining orphan that starts the orphan chain with\n\t// the remove redeemer flag set and ensure they are all removed.\n\tharness.txPool.mtx.Lock()\n\tharness.txPool.removeOrphan(chainedTxns[2], true)\n\tharness.txPool.mtx.Unlock()\n\tfor _, tx := range chainedTxns[2 : maxOrphans+1] {\n\t\ttestPoolMembership(tc, tx, false, false)\n\t}\n}\n\n// TestMultiInputOrphanDoubleSpend ensures that orphans that spend from an\n// output that is spend by another transaction entering the pool are removed.\nfunc TestMultiInputOrphanDoubleSpend(t *testing.T) {\n\tt.Parallel()\n\n\tconst maxOrphans = 4\n\tharness, outputs, err := newPoolHarness(&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t}\n\tharness.txPool.cfg.Policy.MaxOrphanTxs = maxOrphans\n\ttc := &testContext{t, harness}\n\n\t// Create a chain of transactions rooted with the first spendable output\n\t// provided by the harness.\n\tchainedTxns, err := harness.CreateTxChain(outputs[0], maxOrphans+1)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create transaction chain: %v\", err)\n\t}\n\n\t// Start by adding the orphan transactions from the generated chain\n\t// except the final one.\n\tfor _, tx := range chainedTxns[1:maxOrphans] {\n\t\tacceptedTxns, err := harness.txPool.ProcessTransaction(tx, true,\n\t\t\tfalse, 0)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"ProcessTransaction: failed to accept valid \"+\n\t\t\t\t\"orphan %v\", err)\n\t\t}\n\t\tif len(acceptedTxns) != 0 {\n\t\t\tt.Fatalf(\"ProcessTransaction: reported %d accepted transactions \"+\n\t\t\t\t\"from what should be an orphan\", len(acceptedTxns))\n\t\t}\n\t\ttestPoolMembership(tc, tx, true, false)\n\t}\n\n\t// Ensure a transaction that contains a double spend of the same output\n\t// as the second orphan that was just added as well as a valid spend\n\t// from that last orphan in the chain generated above (and is not in the\n\t// orphan pool) is accepted to the orphan pool.  This must be allowed\n\t// since it would otherwise be possible for a malicious actor to disrupt\n\t// tx chains.\n\tdoubleSpendTx, err := harness.CreateSignedTx([]spendableOutput{\n\t\ttxOutToSpendableOut(chainedTxns[1], 0),\n\t\ttxOutToSpendableOut(chainedTxns[maxOrphans], 0),\n\t}, 1, 0, false)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create signed tx: %v\", err)\n\t}\n\tacceptedTxns, err := harness.txPool.ProcessTransaction(doubleSpendTx,\n\t\ttrue, false, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"ProcessTransaction: failed to accept valid orphan %v\",\n\t\t\terr)\n\t}\n\tif len(acceptedTxns) != 0 {\n\t\tt.Fatalf(\"ProcessTransaction: reported %d accepted transactions \"+\n\t\t\t\"from what should be an orphan\", len(acceptedTxns))\n\t}\n\ttestPoolMembership(tc, doubleSpendTx, true, false)\n\n\t// Add the transaction which completes the orphan chain and ensure the\n\t// chain gets accepted.  Notice the accept orphans flag is also false\n\t// here to ensure it has no bearing on whether or not already existing\n\t// orphans in the pool are linked.\n\t//\n\t// This will cause the shared output to become a concrete spend which\n\t// will in turn must cause the double spending orphan to be removed.\n\tacceptedTxns, err = harness.txPool.ProcessTransaction(chainedTxns[0],\n\t\tfalse, false, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"ProcessTransaction: failed to accept valid tx %v\", err)\n\t}\n\tif len(acceptedTxns) != maxOrphans {\n\t\tt.Fatalf(\"ProcessTransaction: reported accepted transactions \"+\n\t\t\t\"length does not match expected -- got %d, want %d\",\n\t\t\tlen(acceptedTxns), maxOrphans)\n\t}\n\tfor _, txD := range acceptedTxns {\n\t\t// Ensure the transaction is no longer in the orphan pool, is\n\t\t// in the transaction pool, and is reported as available.\n\t\ttestPoolMembership(tc, txD.Tx, false, true)\n\t}\n\n\t// Ensure the double spending orphan is no longer in the orphan pool and\n\t// was not moved to the transaction pool.\n\ttestPoolMembership(tc, doubleSpendTx, false, false)\n}\n\n// TestCheckSpend tests that CheckSpend returns the expected spends found in\n// the mempool.\nfunc TestCheckSpend(t *testing.T) {\n\tt.Parallel()\n\n\tharness, outputs, err := newPoolHarness(&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t}\n\n\t// The mempool is empty, so none of the spendable outputs should have a\n\t// spend there.\n\tfor _, op := range outputs {\n\t\tspend := harness.txPool.CheckSpend(op.outPoint)\n\t\tif spend != nil {\n\t\t\tt.Fatalf(\"Unexpeced spend found in pool: %v\", spend)\n\t\t}\n\t}\n\n\t// Create a chain of transactions rooted with the first spendable\n\t// output provided by the harness.\n\tconst txChainLength = 5\n\tchainedTxns, err := harness.CreateTxChain(outputs[0], txChainLength)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create transaction chain: %v\", err)\n\t}\n\tfor _, tx := range chainedTxns {\n\t\t_, err := harness.txPool.ProcessTransaction(tx, true,\n\t\t\tfalse, 0)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"ProcessTransaction: failed to accept \"+\n\t\t\t\t\"tx: %v\", err)\n\t\t}\n\t}\n\n\t// The first tx in the chain should be the spend of the spendable\n\t// output.\n\top := outputs[0].outPoint\n\tspend := harness.txPool.CheckSpend(op)\n\tif spend != chainedTxns[0] {\n\t\tt.Fatalf(\"expected %v to be spent by %v, instead \"+\n\t\t\t\"got %v\", op, chainedTxns[0], spend)\n\t}\n\n\t// Now all but the last tx should be spent by the next.\n\tfor i := 0; i < len(chainedTxns)-1; i++ {\n\t\top = wire.OutPoint{\n\t\t\tHash:  *chainedTxns[i].Hash(),\n\t\t\tIndex: 0,\n\t\t}\n\t\texpSpend := chainedTxns[i+1]\n\t\tspend = harness.txPool.CheckSpend(op)\n\t\tif spend != expSpend {\n\t\t\tt.Fatalf(\"expected %v to be spent by %v, instead \"+\n\t\t\t\t\"got %v\", op, expSpend, spend)\n\t\t}\n\t}\n\n\t// The last tx should have no spend.\n\top = wire.OutPoint{\n\t\tHash:  *chainedTxns[txChainLength-1].Hash(),\n\t\tIndex: 0,\n\t}\n\tspend = harness.txPool.CheckSpend(op)\n\tif spend != nil {\n\t\tt.Fatalf(\"Unexpeced spend found in pool: %v\", spend)\n\t}\n}\n\n// TestSignalsReplacement tests that transactions properly signal they can be\n// replaced using RBF.\nfunc TestSignalsReplacement(t *testing.T) {\n\tt.Parallel()\n\n\ttestCases := []struct {\n\t\tname               string\n\t\tsetup              func(ctx *testContext) *btcutil.Tx\n\t\tsignalsReplacement bool\n\t}{\n\t\t{\n\t\t\t// Transactions can signal replacement through\n\t\t\t// inheritance if any of its ancestors does.\n\t\t\tname: \"non-signaling with unconfirmed non-signaling parent\",\n\t\t\tsetup: func(ctx *testContext) *btcutil.Tx {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tparent := ctx.addSignedTx(outs, 1, 0, false, false)\n\n\t\t\t\tparentOut := txOutToSpendableOut(parent, 0)\n\t\t\t\touts = []spendableOutput{parentOut}\n\t\t\t\treturn ctx.addSignedTx(outs, 1, 0, false, false)\n\t\t\t},\n\t\t\tsignalsReplacement: false,\n\t\t},\n\t\t{\n\t\t\t// Transactions can signal replacement through\n\t\t\t// inheritance if any of its ancestors does, but they\n\t\t\t// must be unconfirmed.\n\t\t\tname: \"non-signaling with confirmed signaling parent\",\n\t\t\tsetup: func(ctx *testContext) *btcutil.Tx {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tparent := ctx.addSignedTx(outs, 1, 0, true, true)\n\n\t\t\t\tparentOut := txOutToSpendableOut(parent, 0)\n\t\t\t\touts = []spendableOutput{parentOut}\n\t\t\t\treturn ctx.addSignedTx(outs, 1, 0, false, false)\n\t\t\t},\n\t\t\tsignalsReplacement: false,\n\t\t},\n\t\t{\n\t\t\tname: \"inherited signaling\",\n\t\t\tsetup: func(ctx *testContext) *btcutil.Tx {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// We'll create a chain of transactions\n\t\t\t\t// A -> B -> C where C is the transaction we'll\n\t\t\t\t// be checking for replacement signaling. The\n\t\t\t\t// transaction can signal replacement through\n\t\t\t\t// any of its ancestors as long as they also\n\t\t\t\t// signal replacement.\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\ta := ctx.addSignedTx(outs, 1, 0, true, false)\n\n\t\t\t\taOut := txOutToSpendableOut(a, 0)\n\t\t\t\touts = []spendableOutput{aOut}\n\t\t\t\tb := ctx.addSignedTx(outs, 1, 0, false, false)\n\n\t\t\t\tbOut := txOutToSpendableOut(b, 0)\n\t\t\t\touts = []spendableOutput{bOut}\n\t\t\t\treturn ctx.addSignedTx(outs, 1, 0, false, false)\n\t\t\t},\n\t\t\tsignalsReplacement: true,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit signaling\",\n\t\t\tsetup: func(ctx *testContext) *btcutil.Tx {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\treturn ctx.addSignedTx(outs, 1, 0, true, false)\n\t\t\t},\n\t\t\tsignalsReplacement: true,\n\t\t},\n\t}\n\n\tfor _, testCase := range testCases {\n\t\tsuccess := t.Run(testCase.name, func(t *testing.T) {\n\t\t\t// We'll start each test by creating our mempool\n\t\t\t// harness.\n\t\t\tharness, _, err := newPoolHarness(&chaincfg.MainNetParams)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t\t\t}\n\t\t\tctx := &testContext{t, harness}\n\n\t\t\t// Each test includes a setup method, which will set up\n\t\t\t// its required dependencies. The transaction returned\n\t\t\t// is the one we'll be using to determine if it signals\n\t\t\t// replacement support.\n\t\t\ttx := testCase.setup(ctx)\n\n\t\t\t// Each test should match the expected response.\n\t\t\tsignalsReplacement := ctx.harness.txPool.signalsReplacement(\n\t\t\t\ttx, nil,\n\t\t\t)\n\t\t\tif signalsReplacement && !testCase.signalsReplacement {\n\t\t\t\tctx.t.Fatalf(\"expected transaction %v to not \"+\n\t\t\t\t\t\"signal replacement\", tx.Hash())\n\t\t\t}\n\t\t\tif !signalsReplacement && testCase.signalsReplacement {\n\t\t\t\tctx.t.Fatalf(\"expected transaction %v to \"+\n\t\t\t\t\t\"signal replacement\", tx.Hash())\n\t\t\t}\n\t\t})\n\t\tif !success {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// TestCheckPoolDoubleSpend ensures that the mempool can properly detect\n// unconfirmed double spends in the case of replacement and non-replacement\n// transactions.\nfunc TestCheckPoolDoubleSpend(t *testing.T) {\n\tt.Parallel()\n\n\ttestCases := []struct {\n\t\tname          string\n\t\tsetup         func(ctx *testContext) *btcutil.Tx\n\t\tisReplacement bool\n\t}{\n\t\t{\n\t\t\t// Transactions that don't double spend any inputs,\n\t\t\t// regardless of whether they signal replacement or not,\n\t\t\t// are valid.\n\t\t\tname: \"no double spend\",\n\t\t\tsetup: func(ctx *testContext) *btcutil.Tx {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tparent := ctx.addSignedTx(outs, 1, 0, false, false)\n\n\t\t\t\tparentOut := txOutToSpendableOut(parent, 0)\n\t\t\t\touts = []spendableOutput{parentOut}\n\t\t\t\treturn ctx.addSignedTx(outs, 2, 0, false, false)\n\t\t\t},\n\t\t\tisReplacement: false,\n\t\t},\n\t\t{\n\t\t\t// Transactions that don't signal replacement and double\n\t\t\t// spend inputs are invalid.\n\t\t\tname: \"non-replacement double spend\",\n\t\t\tsetup: func(ctx *testContext) *btcutil.Tx {\n\t\t\t\tcoinbase1 := ctx.addCoinbaseTx(1)\n\t\t\t\tcoinbaseOut1 := txOutToSpendableOut(coinbase1, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut1}\n\t\t\t\tctx.addSignedTx(outs, 1, 0, true, false)\n\n\t\t\t\tcoinbase2 := ctx.addCoinbaseTx(1)\n\t\t\t\tcoinbaseOut2 := txOutToSpendableOut(coinbase2, 0)\n\t\t\t\touts = []spendableOutput{coinbaseOut2}\n\t\t\t\tctx.addSignedTx(outs, 1, 0, false, false)\n\n\t\t\t\t// Create a transaction that spends both\n\t\t\t\t// coinbase outputs that were spent above. This\n\t\t\t\t// should be detected as a double spend as one\n\t\t\t\t// of the transactions doesn't signal\n\t\t\t\t// replacement.\n\t\t\t\touts = []spendableOutput{coinbaseOut1, coinbaseOut2}\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 1, 0, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx\n\t\t\t},\n\t\t\tisReplacement: false,\n\t\t},\n\t\t{\n\t\t\t// Transactions that double spend inputs and signal\n\t\t\t// replacement are invalid if the mempool's policy\n\t\t\t// rejects replacements.\n\t\t\tname: \"reject replacement policy\",\n\t\t\tsetup: func(ctx *testContext) *btcutil.Tx {\n\t\t\t\t// Set the mempool's policy to reject\n\t\t\t\t// replacements. Even if we have a transaction\n\t\t\t\t// that spends inputs that signal replacement,\n\t\t\t\t// it should still be rejected.\n\t\t\t\tctx.harness.txPool.cfg.Policy.RejectReplacement = true\n\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// Create a replaceable parent that spends the\n\t\t\t\t// coinbase output.\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tparent := ctx.addSignedTx(outs, 1, 0, true, false)\n\n\t\t\t\tparentOut := txOutToSpendableOut(parent, 0)\n\t\t\t\touts = []spendableOutput{parentOut}\n\t\t\t\tctx.addSignedTx(outs, 1, 0, false, false)\n\n\t\t\t\t// Create another transaction that spends the\n\t\t\t\t// same coinbase output. Since the original\n\t\t\t\t// spender of this output, all of its spends\n\t\t\t\t// should also be conflicts.\n\t\t\t\touts = []spendableOutput{coinbaseOut}\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 2, 0, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx\n\t\t\t},\n\t\t\tisReplacement: false,\n\t\t},\n\t\t{\n\t\t\t// Transactions that double spend inputs and signal\n\t\t\t// replacement are valid as long as the mempool's policy\n\t\t\t// accepts them.\n\t\t\tname: \"replacement double spend\",\n\t\t\tsetup: func(ctx *testContext) *btcutil.Tx {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// Create a replaceable parent that spends the\n\t\t\t\t// coinbase output.\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tparent := ctx.addSignedTx(outs, 1, 0, true, false)\n\n\t\t\t\tparentOut := txOutToSpendableOut(parent, 0)\n\t\t\t\touts = []spendableOutput{parentOut}\n\t\t\t\tctx.addSignedTx(outs, 1, 0, false, false)\n\n\t\t\t\t// Create another transaction that spends the\n\t\t\t\t// same coinbase output. Since the original\n\t\t\t\t// spender of this output, all of its spends\n\t\t\t\t// should also be conflicts.\n\t\t\t\touts = []spendableOutput{coinbaseOut}\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 2, 0, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx\n\t\t\t},\n\t\t\tisReplacement: true,\n\t\t},\n\t}\n\n\tfor _, testCase := range testCases {\n\t\tsuccess := t.Run(testCase.name, func(t *testing.T) {\n\t\t\t// We'll start each test by creating our mempool\n\t\t\t// harness.\n\t\t\tharness, _, err := newPoolHarness(&chaincfg.MainNetParams)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t\t\t}\n\t\t\tctx := &testContext{t, harness}\n\n\t\t\t// Each test includes a setup method, which will set up\n\t\t\t// its required dependencies. The transaction returned\n\t\t\t// is the one we'll be querying for the expected\n\t\t\t// conflicts.\n\t\t\ttx := testCase.setup(ctx)\n\n\t\t\t// Ensure that the mempool properly detected the double\n\t\t\t// spend unless this is a replacement transaction.\n\t\t\tisReplacement, err :=\n\t\t\t\tctx.harness.txPool.checkPoolDoubleSpend(tx)\n\t\t\tif testCase.isReplacement && err != nil {\n\t\t\t\tt.Fatalf(\"expected no error for replacement \"+\n\t\t\t\t\t\"transaction, got: %v\", err)\n\t\t\t}\n\t\t\tif isReplacement && !testCase.isReplacement {\n\t\t\t\tt.Fatalf(\"expected replacement transaction\")\n\t\t\t}\n\t\t\tif !isReplacement && testCase.isReplacement {\n\t\t\t\tt.Fatalf(\"expected non-replacement transaction\")\n\t\t\t}\n\t\t})\n\t\tif !success {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// TestConflicts ensures that the mempool can properly detect conflicts when\n// processing new incoming transactions.\nfunc TestConflicts(t *testing.T) {\n\tt.Parallel()\n\n\ttestCases := []struct {\n\t\tname string\n\n\t\t// setup sets up the required dependencies for each test. It\n\t\t// returns the transaction we'll check for conflicts and its\n\t\t// expected unique conflicts.\n\t\tsetup func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx)\n\t}{\n\t\t{\n\t\t\t// Create a transaction that would introduce no\n\t\t\t// conflicts in the mempool. This is done by not\n\t\t\t// spending any outputs that are currently being spent\n\t\t\t// within the mempool.\n\t\t\tname: \"no conflicts\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tparent := ctx.addSignedTx(outs, 1, 0, false, false)\n\n\t\t\t\tparentOut := txOutToSpendableOut(parent, 0)\n\t\t\t\touts = []spendableOutput{parentOut}\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 2, 0, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx, nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Create a transaction that would introduce two\n\t\t\t// conflicts in the mempool by spending two outputs\n\t\t\t// which are each already being spent by a different\n\t\t\t// transaction within the mempool.\n\t\t\tname: \"conflicts\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tcoinbase1 := ctx.addCoinbaseTx(1)\n\t\t\t\tcoinbaseOut1 := txOutToSpendableOut(coinbase1, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut1}\n\t\t\t\tconflict1 := ctx.addSignedTx(\n\t\t\t\t\touts, 1, 0, false, false,\n\t\t\t\t)\n\n\t\t\t\tcoinbase2 := ctx.addCoinbaseTx(1)\n\t\t\t\tcoinbaseOut2 := txOutToSpendableOut(coinbase2, 0)\n\t\t\t\touts = []spendableOutput{coinbaseOut2}\n\t\t\t\tconflict2 := ctx.addSignedTx(\n\t\t\t\t\touts, 1, 0, false, false,\n\t\t\t\t)\n\n\t\t\t\t// Create a transaction that spends both\n\t\t\t\t// coinbase outputs that were spent above.\n\t\t\t\touts = []spendableOutput{coinbaseOut1, coinbaseOut2}\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 1, 0, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx, []*btcutil.Tx{conflict1, conflict2}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Create a transaction that would introduce two\n\t\t\t// conflicts in the mempool by spending an output\n\t\t\t// already being spent in the mempool by a different\n\t\t\t// transaction. The second conflict stems from spending\n\t\t\t// the transaction that spends the original spender of\n\t\t\t// the output, i.e., a descendant of the original\n\t\t\t// spender.\n\t\t\tname: \"descendant conflicts\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// Create a replaceable parent that spends the\n\t\t\t\t// coinbase output.\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tparent := ctx.addSignedTx(outs, 1, 0, false, false)\n\n\t\t\t\tparentOut := txOutToSpendableOut(parent, 0)\n\t\t\t\touts = []spendableOutput{parentOut}\n\t\t\t\tchild := ctx.addSignedTx(outs, 1, 0, false, false)\n\n\t\t\t\t// Create another transaction that spends the\n\t\t\t\t// same coinbase output. Since the original\n\t\t\t\t// spender of this output has descendants, they\n\t\t\t\t// should also be conflicts.\n\t\t\t\touts = []spendableOutput{coinbaseOut}\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 2, 0, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx, []*btcutil.Tx{parent, child}\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, testCase := range testCases {\n\t\tsuccess := t.Run(testCase.name, func(t *testing.T) {\n\t\t\t// We'll start each test by creating our mempool\n\t\t\t// harness.\n\t\t\tharness, _, err := newPoolHarness(&chaincfg.MainNetParams)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t\t\t}\n\t\t\tctx := &testContext{t, harness}\n\n\t\t\t// Each test includes a setup method, which will set up\n\t\t\t// its required dependencies. The transaction returned\n\t\t\t// is the one we'll be querying for the expected\n\t\t\t// conflicts.\n\t\t\ttx, conflicts := testCase.setup(ctx)\n\n\t\t\t// Assert the expected conflicts are returned.\n\t\t\ttxConflicts := ctx.harness.txPool.txConflicts(tx)\n\t\t\tif len(txConflicts) != len(conflicts) {\n\t\t\t\tctx.t.Fatalf(\"expected %d conflicts, got %d\",\n\t\t\t\t\tlen(conflicts), len(txConflicts))\n\t\t\t}\n\t\t\tfor _, conflict := range conflicts {\n\t\t\t\tconflictHash := *conflict.Hash()\n\t\t\t\tif _, ok := txConflicts[conflictHash]; !ok {\n\t\t\t\t\tctx.t.Fatalf(\"expected %v to be found \"+\n\t\t\t\t\t\t\"as a conflict\", conflictHash)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\tif !success {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// TestAncestorsDescendants ensures that we can properly retrieve the\n// unconfirmed ancestors and descendants of a transaction.\nfunc TestAncestorsDescendants(t *testing.T) {\n\tt.Parallel()\n\n\t// We'll start the test by initializing our mempool harness.\n\tharness, outputs, err := newPoolHarness(&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t}\n\tctx := &testContext{t, harness}\n\n\t// We'll be creating the following chain of unconfirmed transactions:\n\t//\n\t//       B ----\n\t//     /        \\\n\t//   A            E\n\t//     \\        /\n\t//       C -- D\n\t//\n\t// where B and C spend A, D spends C, and E spends B and D. We set up a\n\t// chain like so to properly detect ancestors and descendants past a\n\t// single parent/child.\n\taInputs := outputs[:1]\n\ta := ctx.addSignedTx(aInputs, 2, 0, false, false)\n\n\tbInputs := []spendableOutput{txOutToSpendableOut(a, 0)}\n\tb := ctx.addSignedTx(bInputs, 1, 0, false, false)\n\n\tcInputs := []spendableOutput{txOutToSpendableOut(a, 1)}\n\tc := ctx.addSignedTx(cInputs, 1, 0, false, false)\n\n\tdInputs := []spendableOutput{txOutToSpendableOut(c, 0)}\n\td := ctx.addSignedTx(dInputs, 1, 0, false, false)\n\n\teInputs := []spendableOutput{\n\t\ttxOutToSpendableOut(b, 0), txOutToSpendableOut(d, 0),\n\t}\n\te := ctx.addSignedTx(eInputs, 1, 0, false, false)\n\n\t// We'll be querying for the ancestors of E. We should expect to see all\n\t// of the transactions that it depends on.\n\texpectedAncestors := map[chainhash.Hash]struct{}{\n\t\t*a.Hash(): {}, *b.Hash(): {},\n\t\t*c.Hash(): {}, *d.Hash(): {},\n\t}\n\tancestors := ctx.harness.txPool.txAncestors(e, nil)\n\tif len(ancestors) != len(expectedAncestors) {\n\t\tctx.t.Fatalf(\"expected %d ancestors, got %d\",\n\t\t\tlen(expectedAncestors), len(ancestors))\n\t}\n\tfor ancestorHash := range ancestors {\n\t\tif _, ok := expectedAncestors[ancestorHash]; !ok {\n\t\t\tctx.t.Fatalf(\"found unexpected ancestor %v\",\n\t\t\t\tancestorHash)\n\t\t}\n\t}\n\n\t// Then, we'll query for the descendants of A. We should expect to see\n\t// all of the transactions that depend on it.\n\texpectedDescendants := map[chainhash.Hash]struct{}{\n\t\t*b.Hash(): {}, *c.Hash(): {},\n\t\t*d.Hash(): {}, *e.Hash(): {},\n\t}\n\tdescendants := ctx.harness.txPool.txDescendants(a, nil)\n\tif len(descendants) != len(expectedDescendants) {\n\t\tctx.t.Fatalf(\"expected %d descendants, got %d\",\n\t\t\tlen(expectedDescendants), len(descendants))\n\t}\n\tfor descendantHash := range descendants {\n\t\tif _, ok := expectedDescendants[descendantHash]; !ok {\n\t\t\tctx.t.Fatalf(\"found unexpected descendant %v\",\n\t\t\t\tdescendantHash)\n\t\t}\n\t}\n}\n\n// TestRBF tests the different cases required for a transaction to properly\n// replace its conflicts given that they all signal replacement.\nfunc TestRBF(t *testing.T) {\n\tt.Parallel()\n\n\tconst defaultFee = btcutil.SatoshiPerBitcoin\n\n\ttestCases := []struct {\n\t\tname  string\n\t\tsetup func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx)\n\t\terr   string\n\t}{\n\t\t{\n\t\t\t// A transaction cannot replace another if it doesn't\n\t\t\t// signal replacement.\n\t\t\tname: \"non-replaceable parent\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// Create a transaction that spends the coinbase\n\t\t\t\t// output and doesn't signal for replacement.\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tctx.addSignedTx(outs, 1, defaultFee, false, false)\n\n\t\t\t\t// Attempting to create another transaction that\n\t\t\t\t// spends the same output should fail since the\n\t\t\t\t// original transaction spending it doesn't\n\t\t\t\t// signal replacement.\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 2, defaultFee, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx, nil\n\t\t\t},\n\t\t\terr: \"already spent in mempool\",\n\t\t},\n\t\t{\n\t\t\t// A transaction cannot replace another if we don't\n\t\t\t// allow accepting replacement transactions.\n\t\t\tname: \"reject replacement policy\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tctx.harness.txPool.cfg.Policy.RejectReplacement = true\n\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// Create a transaction that spends the coinbase\n\t\t\t\t// output and doesn't signal for replacement.\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tctx.addSignedTx(outs, 1, defaultFee, true, false)\n\n\t\t\t\t// Attempting to create another transaction that\n\t\t\t\t// spends the same output should fail since the\n\t\t\t\t// original transaction spending it doesn't\n\t\t\t\t// signal replacement.\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 2, defaultFee, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx, nil\n\t\t\t},\n\t\t\terr: \"already spent in mempool\",\n\t\t},\n\t\t{\n\t\t\t// A transaction cannot replace another if doing so\n\t\t\t// would cause more than 100 transactions being\n\t\t\t// replaced.\n\t\t\tname: \"exceeds maximum conflicts\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tconst numDescendants = 100\n\t\t\t\tcoinbaseOuts := make(\n\t\t\t\t\t[]spendableOutput, numDescendants,\n\t\t\t\t)\n\t\t\t\tfor i := 0; i < numDescendants; i++ {\n\t\t\t\t\ttx := ctx.addCoinbaseTx(1)\n\t\t\t\t\tcoinbaseOuts[i] = txOutToSpendableOut(tx, 0)\n\t\t\t\t}\n\t\t\t\tparent := ctx.addSignedTx(\n\t\t\t\t\tcoinbaseOuts, numDescendants,\n\t\t\t\t\tdefaultFee, true, false,\n\t\t\t\t)\n\n\t\t\t\t// We'll then spend each output of the parent\n\t\t\t\t// transaction with a distinct transaction.\n\t\t\t\tfor i := uint32(0); i < numDescendants; i++ {\n\t\t\t\t\tout := txOutToSpendableOut(parent, i)\n\t\t\t\t\touts := []spendableOutput{out}\n\t\t\t\t\tctx.addSignedTx(\n\t\t\t\t\t\touts, 1, defaultFee, false, false,\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\t// We'll then create a replacement transaction\n\t\t\t\t// by spending one of the coinbase outputs.\n\t\t\t\t// Replacing the original spender of the\n\t\t\t\t// coinbase output would evict the maximum\n\t\t\t\t// number of transactions from the mempool,\n\t\t\t\t// however, so we should reject it.\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\tcoinbaseOuts[:1], 1, defaultFee, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx, nil\n\t\t\t},\n\t\t\terr: \"evicts more transactions than permitted\",\n\t\t},\n\t\t{\n\t\t\t// A transaction cannot replace another if the\n\t\t\t// replacement ends up spending an output that belongs\n\t\t\t// to one of the transactions it replaces.\n\t\t\tname: \"replacement spends parent transaction\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// Create a transaction that spends the coinbase\n\t\t\t\t// output and signals replacement.\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tparent := ctx.addSignedTx(\n\t\t\t\t\touts, 1, defaultFee, true, false,\n\t\t\t\t)\n\n\t\t\t\t// Attempting to create another transaction that\n\t\t\t\t// spends it, but also replaces it, should be\n\t\t\t\t// invalid.\n\t\t\t\tparentOut := txOutToSpendableOut(parent, 0)\n\t\t\t\touts = []spendableOutput{coinbaseOut, parentOut}\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 2, defaultFee, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx, nil\n\t\t\t},\n\t\t\terr: \"spends parent transaction\",\n\t\t},\n\t\t{\n\t\t\t// A transaction cannot replace another if it has a\n\t\t\t// lower fee rate than any of the transactions it\n\t\t\t// intends to replace.\n\t\t\tname: \"insufficient fee rate\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tcoinbase1 := ctx.addCoinbaseTx(1)\n\t\t\t\tcoinbase2 := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// We'll create two transactions that each spend\n\t\t\t\t// one of the coinbase outputs. The first will\n\t\t\t\t// have a higher fee rate than the second.\n\t\t\t\tcoinbaseOut1 := txOutToSpendableOut(coinbase1, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut1}\n\t\t\t\tctx.addSignedTx(outs, 1, defaultFee*2, true, false)\n\n\t\t\t\tcoinbaseOut2 := txOutToSpendableOut(coinbase2, 0)\n\t\t\t\touts = []spendableOutput{coinbaseOut2}\n\t\t\t\tctx.addSignedTx(outs, 1, defaultFee, true, false)\n\n\t\t\t\t// We'll then create the replacement transaction\n\t\t\t\t// by spending the coinbase outputs. It will be\n\t\t\t\t// an invalid one however, since it won't have a\n\t\t\t\t// higher fee rate than the first transaction.\n\t\t\t\touts = []spendableOutput{coinbaseOut1, coinbaseOut2}\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 1, defaultFee*2, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx, nil\n\t\t\t},\n\t\t\terr: \"insufficient fee rate\",\n\t\t},\n\t\t{\n\t\t\t// A transaction cannot replace another if it doesn't\n\t\t\t// have an absolute greater than the transactions its\n\t\t\t// replacing _plus_ the replacement transaction's\n\t\t\t// minimum relay fee.\n\t\t\tname: \"insufficient absolute fee\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// We'll create a transaction with two outputs\n\t\t\t\t// and the default fee.\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tctx.addSignedTx(outs, 2, defaultFee, true, false)\n\n\t\t\t\t// We'll create a replacement transaction with\n\t\t\t\t// one output, which should cause the\n\t\t\t\t// transaction's absolute fee to be lower than\n\t\t\t\t// the above's, so it'll be invalid.\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 1, defaultFee, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx, nil\n\t\t\t},\n\t\t\terr: \"insufficient absolute fee\",\n\t\t},\n\t\t{\n\t\t\t// A transaction cannot replace another if it introduces\n\t\t\t// a new unconfirmed input that was not already in any\n\t\t\t// of the transactions it's directly replacing.\n\t\t\tname: \"spends new unconfirmed input\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tcoinbase1 := ctx.addCoinbaseTx(1)\n\t\t\t\tcoinbase2 := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// We'll create two unconfirmed transactions\n\t\t\t\t// from our coinbase transactions.\n\t\t\t\tcoinbaseOut1 := txOutToSpendableOut(coinbase1, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut1}\n\t\t\t\tctx.addSignedTx(outs, 1, defaultFee, true, false)\n\n\t\t\t\tcoinbaseOut2 := txOutToSpendableOut(coinbase2, 0)\n\t\t\t\touts = []spendableOutput{coinbaseOut2}\n\t\t\t\tnewTx := ctx.addSignedTx(\n\t\t\t\t\touts, 1, defaultFee, false, false,\n\t\t\t\t)\n\n\t\t\t\t// We should not be able to accept a replacement\n\t\t\t\t// transaction that spends an unconfirmed input\n\t\t\t\t// that was not previously included.\n\t\t\t\tnewTxOut := txOutToSpendableOut(newTx, 0)\n\t\t\t\touts = []spendableOutput{coinbaseOut1, newTxOut}\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 1, defaultFee*2, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx, nil\n\t\t\t},\n\t\t\terr: \"spends new unconfirmed input\",\n\t\t},\n\t\t{\n\t\t\t// A transaction can replace another with a higher fee.\n\t\t\tname: \"higher fee\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// Create a transaction that we'll directly\n\t\t\t\t// replace.\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tparent := ctx.addSignedTx(\n\t\t\t\t\touts, 1, defaultFee, true, false,\n\t\t\t\t)\n\n\t\t\t\t// Spend the parent transaction to create a\n\t\t\t\t// descendant that will be indirectly replaced.\n\t\t\t\tparentOut := txOutToSpendableOut(parent, 0)\n\t\t\t\touts = []spendableOutput{parentOut}\n\t\t\t\tchild := ctx.addSignedTx(\n\t\t\t\t\touts, 1, defaultFee, false, false,\n\t\t\t\t)\n\n\t\t\t\t// The replacement transaction should replace\n\t\t\t\t// both transactions above since it has a higher\n\t\t\t\t// fee and doesn't violate any other conditions\n\t\t\t\t// within the RBF policy.\n\t\t\t\touts = []spendableOutput{coinbaseOut}\n\t\t\t\ttx, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\touts, 1, defaultFee*3, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create \"+\n\t\t\t\t\t\t\"transaction: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn tx, []*btcutil.Tx{parent, child}\n\t\t\t},\n\t\t\terr: \"\",\n\t\t},\n\t\t{\n\t\t\t// A transaction that doesn't signal replacement, can\n\t\t\t// be replaced if the parent signals replacement.\n\t\t\tname: \"inherited replacement\",\n\t\t\tsetup: func(ctx *testContext) (*btcutil.Tx, []*btcutil.Tx) {\n\t\t\t\tcoinbase := ctx.addCoinbaseTx(1)\n\n\t\t\t\t// Create an initial parent transaction that\n\t\t\t\t// marks replacement, we won't be replacing\n\t\t\t\t// this directly however.\n\t\t\t\tcoinbaseOut := txOutToSpendableOut(coinbase, 0)\n\t\t\t\touts := []spendableOutput{coinbaseOut}\n\t\t\t\tparent := ctx.addSignedTx(\n\t\t\t\t\touts, 1, defaultFee, true, false,\n\t\t\t\t)\n\n\t\t\t\t// Now create a transaction that spends that\n\t\t\t\t// parent transaction, which is marked as NOT\n\t\t\t\t// being RBF-able.\n\t\t\t\tparentOut := txOutToSpendableOut(parent, 0)\n\t\t\t\tparentOuts := []spendableOutput{parentOut}\n\t\t\t\tchildNoReplace := ctx.addSignedTx(\n\t\t\t\t\tparentOuts, 1, defaultFee, false, false,\n\t\t\t\t)\n\n\t\t\t\t// Now we'll create another transaction that\n\t\t\t\t// replaces the *child* only. This should work\n\t\t\t\t// as the parent has been marked for RBF, even\n\t\t\t\t// though the child hasn't.\n\t\t\t\trespendOuts := []spendableOutput{parentOut}\n\t\t\t\tchildReplace, err := ctx.harness.CreateSignedTx(\n\t\t\t\t\trespendOuts, 1, defaultFee*3, false,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tctx.t.Fatalf(\"unable to create child tx: %v\", err)\n\t\t\t\t}\n\n\t\t\t\treturn childReplace, []*btcutil.Tx{childNoReplace}\n\t\t\t},\n\t\t\terr: \"\",\n\t\t},\n\t}\n\n\tfor _, testCase := range testCases {\n\t\tsuccess := t.Run(testCase.name, func(t *testing.T) {\n\t\t\t// We'll start each test by creating our mempool\n\t\t\t// harness.\n\t\t\tharness, _, err := newPoolHarness(&chaincfg.MainNetParams)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unable to create test pool: %v\", err)\n\t\t\t}\n\n\t\t\t// We'll enable relay priority to ensure we can properly\n\t\t\t// test fees between replacement transactions and the\n\t\t\t// transactions it replaces.\n\t\t\tharness.txPool.cfg.Policy.DisableRelayPriority = false\n\n\t\t\t// Each test includes a setup method, which will set up\n\t\t\t// its required dependencies. The transaction returned\n\t\t\t// is the intended replacement, which should replace the\n\t\t\t// expected list of transactions.\n\t\t\tctx := &testContext{t, harness}\n\t\t\treplacementTx, replacedTxs := testCase.setup(ctx)\n\n\t\t\t// Attempt to process the replacement transaction. If\n\t\t\t// it's not a valid one, we should see the error\n\t\t\t// expected by the test.\n\t\t\t_, err = ctx.harness.txPool.ProcessTransaction(\n\t\t\t\treplacementTx, false, false, 0,\n\t\t\t)\n\t\t\tif testCase.err == \"\" && err != nil {\n\t\t\t\tctx.t.Fatalf(\"expected no error when \"+\n\t\t\t\t\t\"processing replacement transaction, \"+\n\t\t\t\t\t\"got: %v\", err)\n\t\t\t}\n\t\t\tif testCase.err != \"\" && err == nil {\n\t\t\t\tctx.t.Fatalf(\"expected error when processing \"+\n\t\t\t\t\t\"replacement transaction: %v\",\n\t\t\t\t\ttestCase.err)\n\t\t\t}\n\t\t\tif testCase.err != \"\" && err != nil {\n\t\t\t\tif !strings.Contains(err.Error(), testCase.err) {\n\t\t\t\t\tctx.t.Fatalf(\"expected error: %v\\n\"+\n\t\t\t\t\t\t\"got: %v\", testCase.err, err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If the replacement transaction is valid, we'll check\n\t\t\t// that it has been included in the mempool and its\n\t\t\t// conflicts have been removed. Otherwise, the conflicts\n\t\t\t// should remain in the mempool.\n\t\t\tvalid := testCase.err == \"\"\n\t\t\tfor _, tx := range replacedTxs {\n\t\t\t\ttestPoolMembership(ctx, tx, false, !valid)\n\t\t\t}\n\t\t\ttestPoolMembership(ctx, replacementTx, false, valid)\n\t\t})\n\t\tif !success {\n\t\t\tbreak\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "mempool/mocks.go",
    "content": "package mempool\n\nimport (\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/stretchr/testify/mock\"\n)\n\n// MockTxMempool is a mock implementation of the TxMempool interface.\ntype MockTxMempool struct {\n\tmock.Mock\n}\n\n// Ensure the MockTxMempool implements the TxMemPool interface.\nvar _ TxMempool = (*MockTxMempool)(nil)\n\n// LastUpdated returns the last time a transaction was added to or removed from\n// the source pool.\nfunc (m *MockTxMempool) LastUpdated() time.Time {\n\targs := m.Called()\n\treturn args.Get(0).(time.Time)\n}\n\n// TxDescs returns a slice of descriptors for all the transactions in the pool.\nfunc (m *MockTxMempool) TxDescs() []*TxDesc {\n\targs := m.Called()\n\treturn args.Get(0).([]*TxDesc)\n}\n\n// RawMempoolVerbose returns all the entries in the mempool as a fully\n// populated btcjson result.\nfunc (m *MockTxMempool) RawMempoolVerbose() map[string]*btcjson.\n\tGetRawMempoolVerboseResult {\n\n\targs := m.Called()\n\treturn args.Get(0).(map[string]*btcjson.GetRawMempoolVerboseResult)\n}\n\n// Count returns the number of transactions in the main pool. It does not\n// include the orphan pool.\nfunc (m *MockTxMempool) Count() int {\n\targs := m.Called()\n\treturn args.Get(0).(int)\n}\n\n// FetchTransaction returns the requested transaction from the transaction\n// pool. This only fetches from the main transaction pool and does not include\n// orphans.\nfunc (m *MockTxMempool) FetchTransaction(\n\ttxHash *chainhash.Hash) (*btcutil.Tx, error) {\n\n\targs := m.Called(txHash)\n\n\tif args.Get(0) == nil {\n\t\treturn nil, args.Error(1)\n\t}\n\n\treturn args.Get(0).(*btcutil.Tx), args.Error(1)\n}\n\n// HaveTransaction returns whether or not the passed transaction already exists\n// in the main pool or in the orphan pool.\nfunc (m *MockTxMempool) HaveTransaction(hash *chainhash.Hash) bool {\n\targs := m.Called(hash)\n\treturn args.Get(0).(bool)\n}\n\n// ProcessTransaction is the main workhorse for handling insertion of new\n// free-standing transactions into the memory pool. It includes functionality\n// such as rejecting duplicate transactions, ensuring transactions follow all\n// rules, orphan transaction handling, and insertion into the memory pool.\nfunc (m *MockTxMempool) ProcessTransaction(tx *btcutil.Tx, allowOrphan,\n\trateLimit bool, tag Tag) ([]*TxDesc, error) {\n\n\targs := m.Called(tx, allowOrphan, rateLimit, tag)\n\n\tif args.Get(0) == nil {\n\t\treturn nil, args.Error(1)\n\t}\n\n\treturn args.Get(0).([]*TxDesc), args.Error(1)\n}\n\n// RemoveTransaction removes the passed transaction from the mempool.  When the\n// removeRedeemers flag is set, any transactions that redeem outputs from the\n// removed transaction will also be removed recursively from the mempool, as\n// they would otherwise become orphans.\nfunc (m *MockTxMempool) RemoveTransaction(tx *btcutil.Tx,\n\tremoveRedeemers bool) {\n\n\tm.Called(tx, removeRedeemers)\n}\n\n// CheckMempoolAcceptance behaves similarly to bitcoind's `testmempoolaccept`\n// RPC method. It will perform a series of checks to decide whether this\n// transaction can be accepted to the mempool. If not, the specific error is\n// returned and the caller needs to take actions based on it.\nfunc (m *MockTxMempool) CheckMempoolAcceptance(\n\ttx *btcutil.Tx) (*MempoolAcceptResult, error) {\n\n\targs := m.Called(tx)\n\n\tif args.Get(0) == nil {\n\t\treturn nil, args.Error(1)\n\t}\n\n\treturn args.Get(0).(*MempoolAcceptResult), args.Error(1)\n}\n\n// CheckSpend checks whether the passed outpoint is already spent by a\n// transaction in the mempool. If that's the case the spending transaction will\n// be returned, if not nil will be returned.\nfunc (m *MockTxMempool) CheckSpend(op wire.OutPoint) *btcutil.Tx {\n\targs := m.Called(op)\n\n\tif args.Get(0) == nil {\n\t\treturn nil\n\t}\n\n\treturn args.Get(0).(*btcutil.Tx)\n}\n"
  },
  {
    "path": "mempool/policy.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mempool\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// maxStandardP2SHSigOps is the maximum number of signature operations\n\t// that are considered standard in a pay-to-script-hash script.\n\tmaxStandardP2SHSigOps = 15\n\n\t// maxStandardTxCost is the max weight permitted by any transaction\n\t// according to the current default policy.\n\tmaxStandardTxWeight = 400000\n\n\t// maxStandardSigScriptSize is the maximum size allowed for a\n\t// transaction input signature script to be considered standard.  This\n\t// value allows for a 15-of-15 CHECKMULTISIG pay-to-script-hash with\n\t// compressed keys.\n\t//\n\t// The form of the overall script is: OP_0 <15 signatures> OP_PUSHDATA2\n\t// <2 bytes len> [OP_15 <15 pubkeys> OP_15 OP_CHECKMULTISIG]\n\t//\n\t// For the p2sh script portion, each of the 15 compressed pubkeys are\n\t// 33 bytes (plus one for the OP_DATA_33 opcode), and the thus it totals\n\t// to (15*34)+3 = 513 bytes.  Next, each of the 15 signatures is a max\n\t// of 73 bytes (plus one for the OP_DATA_73 opcode).  Also, there is one\n\t// extra byte for the initial extra OP_0 push and 3 bytes for the\n\t// OP_PUSHDATA2 needed to specify the 513 bytes for the script push.\n\t// That brings the total to 1+(15*74)+3+513 = 1627.  This value also\n\t// adds a few extra bytes to provide a little buffer.\n\t// (1 + 15*74 + 3) + (15*34 + 3) + 23 = 1650\n\tmaxStandardSigScriptSize = 1650\n\n\t// DefaultMinRelayTxFee is the minimum fee in satoshi that is required\n\t// for a transaction to be treated as free for relay and mining\n\t// purposes.  It is also used to help determine if a transaction is\n\t// considered dust and as a base for calculating minimum required fees\n\t// for larger transactions.  This value is in Satoshi/1000 bytes.\n\tDefaultMinRelayTxFee = btcutil.Amount(1000)\n\n\t// maxStandardMultiSigKeys is the maximum number of public keys allowed\n\t// in a multi-signature transaction output script for it to be\n\t// considered standard.\n\tmaxStandardMultiSigKeys = 3\n)\n\n// calcMinRequiredTxRelayFee returns the minimum transaction fee required for a\n// transaction with the passed serialized size to be accepted into the memory\n// pool and relayed.\nfunc calcMinRequiredTxRelayFee(serializedSize int64, minRelayTxFee btcutil.Amount) int64 {\n\t// Calculate the minimum fee for a transaction to be allowed into the\n\t// mempool and relayed by scaling the base fee (which is the minimum\n\t// free transaction relay fee).  minRelayTxFee is in Satoshi/kB so\n\t// multiply by serializedSize (which is in bytes) and divide by 1000 to\n\t// get minimum Satoshis.\n\tminFee := (serializedSize * int64(minRelayTxFee)) / 1000\n\n\tif minFee == 0 && minRelayTxFee > 0 {\n\t\tminFee = int64(minRelayTxFee)\n\t}\n\n\t// Set the minimum fee to the maximum possible value if the calculated\n\t// fee is not in the valid range for monetary amounts.\n\tif minFee < 0 || minFee > btcutil.MaxSatoshi {\n\t\tminFee = btcutil.MaxSatoshi\n\t}\n\n\treturn minFee\n}\n\n// checkInputsStandard performs a series of checks on a transaction's inputs\n// to ensure they are \"standard\".  A standard transaction input within the\n// context of this function is one whose referenced public key script is of a\n// standard form and, for pay-to-script-hash, does not have more than\n// maxStandardP2SHSigOps signature operations.  However, it should also be noted\n// that standard inputs also are those which have a clean stack after execution\n// and only contain pushed data in their signature scripts.  This function does\n// not perform those checks because the script engine already does this more\n// accurately and concisely via the txscript.ScriptVerifyCleanStack and\n// txscript.ScriptVerifySigPushOnly flags.\nfunc checkInputsStandard(tx *btcutil.Tx, utxoView *blockchain.UtxoViewpoint) error {\n\t// NOTE: The reference implementation also does a coinbase check here,\n\t// but coinbases have already been rejected prior to calling this\n\t// function so no need to recheck.\n\n\tfor i, txIn := range tx.MsgTx().TxIn {\n\t\t// It is safe to elide existence and index checks here since\n\t\t// they have already been checked prior to calling this\n\t\t// function.\n\t\tentry := utxoView.LookupEntry(txIn.PreviousOutPoint)\n\t\toriginPkScript := entry.PkScript()\n\t\tswitch txscript.GetScriptClass(originPkScript) {\n\t\tcase txscript.ScriptHashTy:\n\t\t\tnumSigOps := txscript.GetPreciseSigOpCount(\n\t\t\t\ttxIn.SignatureScript, originPkScript, true)\n\t\t\tif numSigOps > maxStandardP2SHSigOps {\n\t\t\t\tstr := fmt.Sprintf(\"transaction input #%d has \"+\n\t\t\t\t\t\"%d signature operations which is more \"+\n\t\t\t\t\t\"than the allowed max amount of %d\",\n\t\t\t\t\ti, numSigOps, maxStandardP2SHSigOps)\n\t\t\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t\t\t}\n\n\t\tcase txscript.NonStandardTy:\n\t\t\tstr := fmt.Sprintf(\"transaction input #%d has a \"+\n\t\t\t\t\"non-standard script form\", i)\n\t\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// checkPkScriptStandard performs a series of checks on a transaction output\n// script (public key script) to ensure it is a \"standard\" public key script.\n// A standard public key script is one that is a recognized form, and for\n// multi-signature scripts, only contains from 1 to maxStandardMultiSigKeys\n// public keys.\nfunc checkPkScriptStandard(pkScript []byte, scriptClass txscript.ScriptClass) error {\n\tswitch scriptClass {\n\tcase txscript.MultiSigTy:\n\t\tnumPubKeys, numSigs, err := txscript.CalcMultiSigStats(pkScript)\n\t\tif err != nil {\n\t\t\tstr := fmt.Sprintf(\"multi-signature script parse \"+\n\t\t\t\t\"failure: %v\", err)\n\t\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t\t}\n\n\t\t// A standard multi-signature public key script must contain\n\t\t// from 1 to maxStandardMultiSigKeys public keys.\n\t\tif numPubKeys < 1 {\n\t\t\tstr := \"multi-signature script with no pubkeys\"\n\t\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t\t}\n\t\tif numPubKeys > maxStandardMultiSigKeys {\n\t\t\tstr := fmt.Sprintf(\"multi-signature script with %d \"+\n\t\t\t\t\"public keys which is more than the allowed \"+\n\t\t\t\t\"max of %d\", numPubKeys, maxStandardMultiSigKeys)\n\t\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t\t}\n\n\t\t// A standard multi-signature public key script must have at\n\t\t// least 1 signature and no more signatures than available\n\t\t// public keys.\n\t\tif numSigs < 1 {\n\t\t\treturn txRuleError(wire.RejectNonstandard,\n\t\t\t\t\"multi-signature script with no signatures\")\n\t\t}\n\t\tif numSigs > numPubKeys {\n\t\t\tstr := fmt.Sprintf(\"multi-signature script with %d \"+\n\t\t\t\t\"signatures which is more than the available \"+\n\t\t\t\t\"%d public keys\", numSigs, numPubKeys)\n\t\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t\t}\n\n\tcase txscript.NonStandardTy:\n\t\treturn txRuleError(wire.RejectNonstandard,\n\t\t\t\"non-standard script form\")\n\t}\n\n\treturn nil\n}\n\n// GetDustThreshold calculates the dust limit for a *wire.TxOut by taking the\n// size of a typical spending transaction and multiplying it by 3 to account\n// for the minimum dust relay fee of 3000sat/kvb.\nfunc GetDustThreshold(txOut *wire.TxOut) int64 {\n\t// The total serialized size consists of the output and the associated\n\t// input script to redeem it.  Since there is no input script\n\t// to redeem it yet, use the minimum size of a typical input script.\n\t//\n\t// Pay-to-pubkey-hash bytes breakdown:\n\t//\n\t//  Output to hash (34 bytes):\n\t//   8 value, 1 script len, 25 script [1 OP_DUP, 1 OP_HASH_160,\n\t//   1 OP_DATA_20, 20 hash, 1 OP_EQUALVERIFY, 1 OP_CHECKSIG]\n\t//\n\t//  Input with compressed pubkey (148 bytes):\n\t//   36 prev outpoint, 1 script len, 107 script [1 OP_DATA_72, 72 sig,\n\t//   1 OP_DATA_33, 33 compressed pubkey], 4 sequence\n\t//\n\t//  Input with uncompressed pubkey (180 bytes):\n\t//   36 prev outpoint, 1 script len, 139 script [1 OP_DATA_72, 72 sig,\n\t//   1 OP_DATA_65, 65 compressed pubkey], 4 sequence\n\t//\n\t// Pay-to-pubkey bytes breakdown:\n\t//\n\t//  Output to compressed pubkey (44 bytes):\n\t//   8 value, 1 script len, 35 script [1 OP_DATA_33,\n\t//   33 compressed pubkey, 1 OP_CHECKSIG]\n\t//\n\t//  Output to uncompressed pubkey (76 bytes):\n\t//   8 value, 1 script len, 67 script [1 OP_DATA_65, 65 pubkey,\n\t//   1 OP_CHECKSIG]\n\t//\n\t//  Input (114 bytes):\n\t//   36 prev outpoint, 1 script len, 73 script [1 OP_DATA_72,\n\t//   72 sig], 4 sequence\n\t//\n\t// Pay-to-witness-pubkey-hash bytes breakdown:\n\t//\n\t//  Output to witness key hash (31 bytes);\n\t//   8 value, 1 script len, 22 script [1 OP_0, 1 OP_DATA_20,\n\t//   20 bytes hash160]\n\t//\n\t//  Input (67 bytes as the 107 witness stack is discounted):\n\t//   36 prev outpoint, 1 script len, 0 script (not sigScript), 107\n\t//   witness stack bytes [1 element length, 33 compressed pubkey,\n\t//   element length 72 sig], 4 sequence\n\t//\n\t//\n\t// Theoretically this could examine the script type of the output script\n\t// and use a different size for the typical input script size for\n\t// pay-to-pubkey vs pay-to-pubkey-hash inputs per the above breakdowns,\n\t// but the only combination which is less than the value chosen is\n\t// a pay-to-pubkey script with a compressed pubkey, which is not very\n\t// common.\n\t//\n\t// The most common scripts are pay-to-pubkey-hash, and as per the above\n\t// breakdown, the minimum size of a p2pkh input script is 148 bytes.  So\n\t// that figure is used. If the output being spent is a witness program,\n\t// then we apply the witness discount to the size of the signature.\n\t//\n\t// The segwit analogue to p2pkh is a p2wkh output. This is the smallest\n\t// output possible using the new segwit features. The 107 bytes of\n\t// witness data is discounted by a factor of 4, leading to a computed\n\t// value of 67 bytes of witness data.\n\t//\n\t// Both cases share a 41 byte preamble required to reference the input\n\t// being spent and the sequence number of the input.\n\ttotalSize := txOut.SerializeSize() + 41\n\tif txscript.IsWitnessProgram(txOut.PkScript) {\n\t\ttotalSize += (107 / blockchain.WitnessScaleFactor)\n\t} else {\n\t\ttotalSize += 107\n\t}\n\n\treturn 3 * int64(totalSize)\n}\n\n// IsDust returns whether or not the passed transaction output amount is\n// considered dust or not based on the passed minimum transaction relay fee.\n// Dust is defined in terms of the minimum transaction relay fee.  In\n// particular, if the cost to the network to spend coins is more than 1/3 of the\n// minimum transaction relay fee, it is considered dust.\nfunc IsDust(txOut *wire.TxOut, minRelayTxFee btcutil.Amount) bool {\n\t// Unspendable outputs are considered dust.\n\tif txscript.IsUnspendable(txOut.PkScript) {\n\t\treturn true\n\t}\n\n\t// The output is considered dust if the cost to the network to spend the\n\t// coins is more than 1/3 of the minimum free transaction relay fee.\n\t// minFreeTxRelayFee is in Satoshi/KB, so multiply by 1000 to\n\t// convert to bytes.\n\t//\n\t// Using the typical values for a pay-to-pubkey-hash transaction from\n\t// the breakdown above and the default minimum free transaction relay\n\t// fee of 1000, this equates to values less than 546 satoshi being\n\t// considered dust.\n\t//\n\t// The following is equivalent to (value/totalSize) * (1/3) * 1000\n\t// without needing to do floating point math.\n\treturn txOut.Value*1000/GetDustThreshold(txOut) < int64(minRelayTxFee)\n}\n\n// CheckTransactionStandard performs a series of checks on a transaction to\n// ensure it is a \"standard\" transaction.  A standard transaction is one that\n// conforms to several additional limiting cases over what is considered a\n// \"sane\" transaction such as having a version in the supported range, being\n// finalized, conforming to more stringent size constraints, having scripts\n// of recognized forms, and not containing \"dust\" outputs (those that are\n// so small it costs more to process them than they are worth).\nfunc CheckTransactionStandard(tx *btcutil.Tx, height int32,\n\tmedianTimePast time.Time, minRelayTxFee btcutil.Amount,\n\tmaxTxVersion int32) error {\n\n\t// The transaction must be a currently supported version.\n\tmsgTx := tx.MsgTx()\n\tif msgTx.Version > maxTxVersion || msgTx.Version < 1 {\n\t\tstr := fmt.Sprintf(\"transaction version %d is not in the \"+\n\t\t\t\"valid range of %d-%d\", msgTx.Version, 1,\n\t\t\tmaxTxVersion)\n\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t}\n\n\t// The transaction must be finalized to be standard and therefore\n\t// considered for inclusion in a block.\n\tif !blockchain.IsFinalizedTransaction(tx, height, medianTimePast) {\n\t\treturn txRuleError(wire.RejectNonstandard,\n\t\t\t\"transaction is not finalized\")\n\t}\n\n\t// Since extremely large transactions with a lot of inputs can cost\n\t// almost as much to process as the sender fees, limit the maximum\n\t// size of a transaction.  This also helps mitigate CPU exhaustion\n\t// attacks.\n\ttxWeight := blockchain.GetTransactionWeight(tx)\n\tif txWeight > maxStandardTxWeight {\n\t\tstr := fmt.Sprintf(\"weight of transaction is larger than max \"+\n\t\t\t\"allowed: %v > %v\", txWeight, maxStandardTxWeight)\n\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t}\n\n\tfor i, txIn := range msgTx.TxIn {\n\t\t// Each transaction input signature script must not exceed the\n\t\t// maximum size allowed for a standard transaction.  See\n\t\t// the comment on maxStandardSigScriptSize for more details.\n\t\tsigScriptLen := len(txIn.SignatureScript)\n\t\tif sigScriptLen > maxStandardSigScriptSize {\n\t\t\tstr := fmt.Sprintf(\"transaction input %d: signature \"+\n\t\t\t\t\"script size is larger than max allowed: \"+\n\t\t\t\t\"%d > %d bytes\", i, sigScriptLen,\n\t\t\t\tmaxStandardSigScriptSize)\n\t\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t\t}\n\n\t\t// Each transaction input signature script must only contain\n\t\t// opcodes which push data onto the stack.\n\t\tif !txscript.IsPushOnlyScript(txIn.SignatureScript) {\n\t\t\tstr := fmt.Sprintf(\"transaction input %d: signature \"+\n\t\t\t\t\"script is not push only\", i)\n\t\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t\t}\n\t}\n\n\t// None of the output public key scripts can be a non-standard script or\n\t// be \"dust\" (except when the script is a null data script).\n\tnumNullDataOutputs := 0\n\tfor i, txOut := range msgTx.TxOut {\n\t\tscriptClass := txscript.GetScriptClass(txOut.PkScript)\n\t\terr := checkPkScriptStandard(txOut.PkScript, scriptClass)\n\t\tif err != nil {\n\t\t\t// Attempt to extract a reject code from the error so\n\t\t\t// it can be retained.  When not possible, fall back to\n\t\t\t// a non standard error.\n\t\t\trejectCode := wire.RejectNonstandard\n\t\t\tif rejCode, found := extractRejectCode(err); found {\n\t\t\t\trejectCode = rejCode\n\t\t\t}\n\t\t\tstr := fmt.Sprintf(\"transaction output %d: %v\", i, err)\n\t\t\treturn txRuleError(rejectCode, str)\n\t\t}\n\n\t\t// Accumulate the number of outputs which only carry data.  For\n\t\t// all other script types, ensure the output value is not\n\t\t// \"dust\".\n\t\tif scriptClass == txscript.NullDataTy {\n\t\t\tnumNullDataOutputs++\n\t\t} else if IsDust(txOut, minRelayTxFee) {\n\t\t\tstr := fmt.Sprintf(\"transaction output %d: payment is \"+\n\t\t\t\t\"dust: %v\", i, txOut.Value)\n\t\t\treturn txRuleError(wire.RejectDust, str)\n\t\t}\n\t}\n\n\t// A standard transaction must not have more than one output script that\n\t// only carries data.\n\tif numNullDataOutputs > 1 {\n\t\tstr := \"more than one transaction output in a nulldata script\"\n\t\treturn txRuleError(wire.RejectNonstandard, str)\n\t}\n\n\treturn nil\n}\n\n// GetTxVirtualSize computes the virtual size of a given transaction. A\n// transaction's virtual size is based off its weight, creating a discount for\n// any witness data it contains, proportional to the current\n// blockchain.WitnessScaleFactor value.\nfunc GetTxVirtualSize(tx *btcutil.Tx) int64 {\n\t// vSize := (weight(tx) + 3) / 4\n\t//       := (((baseSize * 3) + totalSize) + 3) / 4\n\t// We add 3 here as a way to compute the ceiling of the prior arithmetic\n\t// to 4. The division by 4 creates a discount for wit witness data.\n\treturn (blockchain.GetTransactionWeight(tx) + (blockchain.WitnessScaleFactor - 1)) /\n\t\tblockchain.WitnessScaleFactor\n}\n"
  },
  {
    "path": "mempool/policy_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mempool\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TestCalcMinRequiredTxRelayFee tests the calcMinRequiredTxRelayFee API.\nfunc TestCalcMinRequiredTxRelayFee(t *testing.T) {\n\ttests := []struct {\n\t\tname     string         // test description.\n\t\tsize     int64          // Transaction size in bytes.\n\t\trelayFee btcutil.Amount // minimum relay transaction fee.\n\t\twant     int64          // Expected fee.\n\t}{\n\t\t{\n\t\t\t// Ensure combination of size and fee that are less than 1000\n\t\t\t// produce a non-zero fee.\n\t\t\t\"250 bytes with relay fee of 3\",\n\t\t\t250,\n\t\t\t3,\n\t\t\t3,\n\t\t},\n\t\t{\n\t\t\t\"100 bytes with default minimum relay fee\",\n\t\t\t100,\n\t\t\tDefaultMinRelayTxFee,\n\t\t\t100,\n\t\t},\n\t\t{\n\t\t\t\"max standard tx size with default minimum relay fee\",\n\t\t\tmaxStandardTxWeight / 4,\n\t\t\tDefaultMinRelayTxFee,\n\t\t\t100000,\n\t\t},\n\t\t{\n\t\t\t\"max standard tx size with max satoshi relay fee\",\n\t\t\tmaxStandardTxWeight / 4,\n\t\t\tbtcutil.MaxSatoshi,\n\t\t\tbtcutil.MaxSatoshi,\n\t\t},\n\t\t{\n\t\t\t\"1500 bytes with 5000 relay fee\",\n\t\t\t1500,\n\t\t\t5000,\n\t\t\t7500,\n\t\t},\n\t\t{\n\t\t\t\"1500 bytes with 3000 relay fee\",\n\t\t\t1500,\n\t\t\t3000,\n\t\t\t4500,\n\t\t},\n\t\t{\n\t\t\t\"782 bytes with 5000 relay fee\",\n\t\t\t782,\n\t\t\t5000,\n\t\t\t3910,\n\t\t},\n\t\t{\n\t\t\t\"782 bytes with 3000 relay fee\",\n\t\t\t782,\n\t\t\t3000,\n\t\t\t2346,\n\t\t},\n\t\t{\n\t\t\t\"782 bytes with 2550 relay fee\",\n\t\t\t782,\n\t\t\t2550,\n\t\t\t1994,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tgot := calcMinRequiredTxRelayFee(test.size, test.relayFee)\n\t\tif got != test.want {\n\t\t\tt.Errorf(\"TestCalcMinRequiredTxRelayFee test '%s' \"+\n\t\t\t\t\"failed: got %v want %v\", test.name, got,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestCheckPkScriptStandard tests the checkPkScriptStandard API.\nfunc TestCheckPkScriptStandard(t *testing.T) {\n\tvar pubKeys [][]byte\n\tfor i := 0; i < 4; i++ {\n\t\tpk, err := btcec.NewPrivateKey()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"TestCheckPkScriptStandard NewPrivateKey failed: %v\",\n\t\t\t\terr)\n\t\t\treturn\n\t\t}\n\t\tpubKeys = append(pubKeys, pk.PubKey().SerializeCompressed())\n\t}\n\n\ttests := []struct {\n\t\tname       string // test description.\n\t\tscript     *txscript.ScriptBuilder\n\t\tisStandard bool\n\t}{\n\t\t{\n\t\t\t\"key1 and key2\",\n\t\t\ttxscript.NewScriptBuilder().AddOp(txscript.OP_2).\n\t\t\t\tAddData(pubKeys[0]).AddData(pubKeys[1]).\n\t\t\t\tAddOp(txscript.OP_2).AddOp(txscript.OP_CHECKMULTISIG),\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"key1 or key2\",\n\t\t\ttxscript.NewScriptBuilder().AddOp(txscript.OP_1).\n\t\t\t\tAddData(pubKeys[0]).AddData(pubKeys[1]).\n\t\t\t\tAddOp(txscript.OP_2).AddOp(txscript.OP_CHECKMULTISIG),\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"escrow\",\n\t\t\ttxscript.NewScriptBuilder().AddOp(txscript.OP_2).\n\t\t\t\tAddData(pubKeys[0]).AddData(pubKeys[1]).\n\t\t\t\tAddData(pubKeys[2]).\n\t\t\t\tAddOp(txscript.OP_3).AddOp(txscript.OP_CHECKMULTISIG),\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"one of four\",\n\t\t\ttxscript.NewScriptBuilder().AddOp(txscript.OP_1).\n\t\t\t\tAddData(pubKeys[0]).AddData(pubKeys[1]).\n\t\t\t\tAddData(pubKeys[2]).AddData(pubKeys[3]).\n\t\t\t\tAddOp(txscript.OP_4).AddOp(txscript.OP_CHECKMULTISIG),\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"malformed1\",\n\t\t\ttxscript.NewScriptBuilder().AddOp(txscript.OP_3).\n\t\t\t\tAddData(pubKeys[0]).AddData(pubKeys[1]).\n\t\t\t\tAddOp(txscript.OP_2).AddOp(txscript.OP_CHECKMULTISIG),\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"malformed2\",\n\t\t\ttxscript.NewScriptBuilder().AddOp(txscript.OP_2).\n\t\t\t\tAddData(pubKeys[0]).AddData(pubKeys[1]).\n\t\t\t\tAddOp(txscript.OP_3).AddOp(txscript.OP_CHECKMULTISIG),\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"malformed3\",\n\t\t\ttxscript.NewScriptBuilder().AddOp(txscript.OP_0).\n\t\t\t\tAddData(pubKeys[0]).AddData(pubKeys[1]).\n\t\t\t\tAddOp(txscript.OP_2).AddOp(txscript.OP_CHECKMULTISIG),\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"malformed4\",\n\t\t\ttxscript.NewScriptBuilder().AddOp(txscript.OP_1).\n\t\t\t\tAddData(pubKeys[0]).AddData(pubKeys[1]).\n\t\t\t\tAddOp(txscript.OP_0).AddOp(txscript.OP_CHECKMULTISIG),\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"malformed5\",\n\t\t\ttxscript.NewScriptBuilder().AddOp(txscript.OP_1).\n\t\t\t\tAddData(pubKeys[0]).AddData(pubKeys[1]).\n\t\t\t\tAddOp(txscript.OP_CHECKMULTISIG),\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"malformed6\",\n\t\t\ttxscript.NewScriptBuilder().AddOp(txscript.OP_1).\n\t\t\t\tAddData(pubKeys[0]).AddData(pubKeys[1]),\n\t\t\tfalse,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tscript, err := test.script.Script()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"TestCheckPkScriptStandard test '%s' \"+\n\t\t\t\t\"failed: %v\", test.name, err)\n\t\t}\n\t\tscriptClass := txscript.GetScriptClass(script)\n\t\tgot := checkPkScriptStandard(script, scriptClass)\n\t\tif (test.isStandard && got != nil) ||\n\t\t\t(!test.isStandard && got == nil) {\n\n\t\t\tt.Fatalf(\"TestCheckPkScriptStandard test '%s' failed\",\n\t\t\t\ttest.name)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// TestDust tests the IsDust API.\nfunc TestDust(t *testing.T) {\n\tpkScript := []byte{0x76, 0xa9, 0x21, 0x03, 0x2f, 0x7e, 0x43,\n\t\t0x0a, 0xa4, 0xc9, 0xd1, 0x59, 0x43, 0x7e, 0x84, 0xb9,\n\t\t0x75, 0xdc, 0x76, 0xd9, 0x00, 0x3b, 0xf0, 0x92, 0x2c,\n\t\t0xf3, 0xaa, 0x45, 0x28, 0x46, 0x4b, 0xab, 0x78, 0x0d,\n\t\t0xba, 0x5e, 0x88, 0xac}\n\n\ttests := []struct {\n\t\tname     string // test description\n\t\ttxOut    wire.TxOut\n\t\trelayFee btcutil.Amount // minimum relay transaction fee.\n\t\tisDust   bool\n\t}{\n\t\t{\n\t\t\t// Any value is allowed with a zero relay fee.\n\t\t\t\"zero value with zero relay fee\",\n\t\t\twire.TxOut{Value: 0, PkScript: pkScript},\n\t\t\t0,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t// Zero value is dust with any relay fee\"\n\t\t\t\"zero value with very small tx fee\",\n\t\t\twire.TxOut{Value: 0, PkScript: pkScript},\n\t\t\t1,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"38 byte public key script with value 584\",\n\t\t\twire.TxOut{Value: 584, PkScript: pkScript},\n\t\t\t1000,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"38 byte public key script with value 585\",\n\t\t\twire.TxOut{Value: 585, PkScript: pkScript},\n\t\t\t1000,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t// Maximum allowed value is never dust.\n\t\t\t\"max satoshi amount is never dust\",\n\t\t\twire.TxOut{Value: btcutil.MaxSatoshi, PkScript: pkScript},\n\t\t\tbtcutil.MaxSatoshi,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t// Maximum int64 value causes overflow.\n\t\t\t\"maximum int64 value\",\n\t\t\twire.TxOut{Value: 1<<63 - 1, PkScript: pkScript},\n\t\t\t1<<63 - 1,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t// Unspendable pkScript due to an invalid public key\n\t\t\t// script.\n\t\t\t\"unspendable pkScript\",\n\t\t\twire.TxOut{Value: 5000, PkScript: []byte{0x01}},\n\t\t\t0, // no relay fee\n\t\t\ttrue,\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tres := IsDust(&test.txOut, test.relayFee)\n\t\tif res != test.isDust {\n\t\t\tt.Fatalf(\"Dust test '%s' failed: want %v got %v\",\n\t\t\t\ttest.name, test.isDust, res)\n\t\t}\n\t}\n}\n\n// TestCheckTransactionStandard tests the CheckTransactionStandard API.\nfunc TestCheckTransactionStandard(t *testing.T) {\n\t// Create some dummy, but otherwise standard, data for transactions.\n\tprevOutHash, err := chainhash.NewHashFromStr(\"01\")\n\tif err != nil {\n\t\tt.Fatalf(\"NewShaHashFromStr: unexpected error: %v\", err)\n\t}\n\tdummyPrevOut := wire.OutPoint{Hash: *prevOutHash, Index: 1}\n\tdummySigScript := bytes.Repeat([]byte{0x00}, 65)\n\tdummyTxIn := wire.TxIn{\n\t\tPreviousOutPoint: dummyPrevOut,\n\t\tSignatureScript:  dummySigScript,\n\t\tSequence:         wire.MaxTxInSequenceNum,\n\t}\n\taddrHash := [20]byte{0x01}\n\taddr, err := btcutil.NewAddressPubKeyHash(addrHash[:],\n\t\t&chaincfg.TestNet3Params)\n\tif err != nil {\n\t\tt.Fatalf(\"NewAddressPubKeyHash: unexpected error: %v\", err)\n\t}\n\tdummyPkScript, err := txscript.PayToAddrScript(addr)\n\tif err != nil {\n\t\tt.Fatalf(\"PayToAddrScript: unexpected error: %v\", err)\n\t}\n\tdummyTxOut := wire.TxOut{\n\t\tValue:    100000000, // 1 BTC\n\t\tPkScript: dummyPkScript,\n\t}\n\n\ttests := []struct {\n\t\tname       string\n\t\ttx         wire.MsgTx\n\t\theight     int32\n\t\tisStandard bool\n\t\tcode       wire.RejectCode\n\t}{\n\t\t{\n\t\t\tname: \"Typical pay-to-pubkey-hash transaction\",\n\t\t\ttx: wire.MsgTx{\n\t\t\t\tVersion:  1,\n\t\t\t\tTxIn:     []*wire.TxIn{&dummyTxIn},\n\t\t\t\tTxOut:    []*wire.TxOut{&dummyTxOut},\n\t\t\t\tLockTime: 0,\n\t\t\t},\n\t\t\theight:     300000,\n\t\t\tisStandard: true,\n\t\t},\n\t\t{\n\t\t\tname: \"Transaction version too high\",\n\t\t\ttx: wire.MsgTx{\n\t\t\t\tVersion:  wire.TxVersion + 1,\n\t\t\t\tTxIn:     []*wire.TxIn{&dummyTxIn},\n\t\t\t\tTxOut:    []*wire.TxOut{&dummyTxOut},\n\t\t\t\tLockTime: 0,\n\t\t\t},\n\t\t\theight:     300000,\n\t\t\tisStandard: false,\n\t\t\tcode:       wire.RejectNonstandard,\n\t\t},\n\t\t{\n\t\t\tname: \"Transaction is not finalized\",\n\t\t\ttx: wire.MsgTx{\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: dummyPrevOut,\n\t\t\t\t\tSignatureScript:  dummySigScript,\n\t\t\t\t\tSequence:         0,\n\t\t\t\t}},\n\t\t\t\tTxOut:    []*wire.TxOut{&dummyTxOut},\n\t\t\t\tLockTime: 300001,\n\t\t\t},\n\t\t\theight:     300000,\n\t\t\tisStandard: false,\n\t\t\tcode:       wire.RejectNonstandard,\n\t\t},\n\t\t{\n\t\t\tname: \"Transaction size is too large\",\n\t\t\ttx: wire.MsgTx{\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn:    []*wire.TxIn{&dummyTxIn},\n\t\t\t\tTxOut: []*wire.TxOut{{\n\t\t\t\t\tValue: 0,\n\t\t\t\t\tPkScript: bytes.Repeat([]byte{0x00},\n\t\t\t\t\t\t(maxStandardTxWeight/4)+1),\n\t\t\t\t}},\n\t\t\t\tLockTime: 0,\n\t\t\t},\n\t\t\theight:     300000,\n\t\t\tisStandard: false,\n\t\t\tcode:       wire.RejectNonstandard,\n\t\t},\n\t\t{\n\t\t\tname: \"Signature script size is too large\",\n\t\t\ttx: wire.MsgTx{\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: dummyPrevOut,\n\t\t\t\t\tSignatureScript: bytes.Repeat([]byte{0x00},\n\t\t\t\t\t\tmaxStandardSigScriptSize+1),\n\t\t\t\t\tSequence: wire.MaxTxInSequenceNum,\n\t\t\t\t}},\n\t\t\t\tTxOut:    []*wire.TxOut{&dummyTxOut},\n\t\t\t\tLockTime: 0,\n\t\t\t},\n\t\t\theight:     300000,\n\t\t\tisStandard: false,\n\t\t\tcode:       wire.RejectNonstandard,\n\t\t},\n\t\t{\n\t\t\tname: \"Signature script that does more than push data\",\n\t\t\ttx: wire.MsgTx{\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn: []*wire.TxIn{{\n\t\t\t\t\tPreviousOutPoint: dummyPrevOut,\n\t\t\t\t\tSignatureScript: []byte{\n\t\t\t\t\t\ttxscript.OP_CHECKSIGVERIFY},\n\t\t\t\t\tSequence: wire.MaxTxInSequenceNum,\n\t\t\t\t}},\n\t\t\t\tTxOut:    []*wire.TxOut{&dummyTxOut},\n\t\t\t\tLockTime: 0,\n\t\t\t},\n\t\t\theight:     300000,\n\t\t\tisStandard: false,\n\t\t\tcode:       wire.RejectNonstandard,\n\t\t},\n\t\t{\n\t\t\tname: \"Valid but non standard public key script\",\n\t\t\ttx: wire.MsgTx{\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn:    []*wire.TxIn{&dummyTxIn},\n\t\t\t\tTxOut: []*wire.TxOut{{\n\t\t\t\t\tValue:    100000000,\n\t\t\t\t\tPkScript: []byte{txscript.OP_TRUE},\n\t\t\t\t}},\n\t\t\t\tLockTime: 0,\n\t\t\t},\n\t\t\theight:     300000,\n\t\t\tisStandard: false,\n\t\t\tcode:       wire.RejectNonstandard,\n\t\t},\n\t\t{\n\t\t\tname: \"More than one nulldata output\",\n\t\t\ttx: wire.MsgTx{\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn:    []*wire.TxIn{&dummyTxIn},\n\t\t\t\tTxOut: []*wire.TxOut{{\n\t\t\t\t\tValue:    0,\n\t\t\t\t\tPkScript: []byte{txscript.OP_RETURN},\n\t\t\t\t}, {\n\t\t\t\t\tValue:    0,\n\t\t\t\t\tPkScript: []byte{txscript.OP_RETURN},\n\t\t\t\t}},\n\t\t\t\tLockTime: 0,\n\t\t\t},\n\t\t\theight:     300000,\n\t\t\tisStandard: false,\n\t\t\tcode:       wire.RejectNonstandard,\n\t\t},\n\t\t{\n\t\t\tname: \"Dust output\",\n\t\t\ttx: wire.MsgTx{\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn:    []*wire.TxIn{&dummyTxIn},\n\t\t\t\tTxOut: []*wire.TxOut{{\n\t\t\t\t\tValue:    0,\n\t\t\t\t\tPkScript: dummyPkScript,\n\t\t\t\t}},\n\t\t\t\tLockTime: 0,\n\t\t\t},\n\t\t\theight:     300000,\n\t\t\tisStandard: false,\n\t\t\tcode:       wire.RejectDust,\n\t\t},\n\t\t{\n\t\t\tname: \"One nulldata output with 0 amount (standard)\",\n\t\t\ttx: wire.MsgTx{\n\t\t\t\tVersion: 1,\n\t\t\t\tTxIn:    []*wire.TxIn{&dummyTxIn},\n\t\t\t\tTxOut: []*wire.TxOut{{\n\t\t\t\t\tValue:    0,\n\t\t\t\t\tPkScript: []byte{txscript.OP_RETURN},\n\t\t\t\t}},\n\t\t\t\tLockTime: 0,\n\t\t\t},\n\t\t\theight:     300000,\n\t\t\tisStandard: true,\n\t\t},\n\t}\n\n\tpastMedianTime := time.Now()\n\tfor _, test := range tests {\n\t\t// Ensure standardness is as expected.\n\t\terr := CheckTransactionStandard(btcutil.NewTx(&test.tx),\n\t\t\ttest.height, pastMedianTime, DefaultMinRelayTxFee, 1)\n\t\tif err == nil && test.isStandard {\n\t\t\t// Test passes since function returned standard for a\n\t\t\t// transaction which is intended to be standard.\n\t\t\tcontinue\n\t\t}\n\t\tif err == nil && !test.isStandard {\n\t\t\tt.Errorf(\"CheckTransactionStandard (%s): standard when \"+\n\t\t\t\t\"it should not be\", test.name)\n\t\t\tcontinue\n\t\t}\n\t\tif err != nil && test.isStandard {\n\t\t\tt.Errorf(\"CheckTransactionStandard (%s): nonstandard \"+\n\t\t\t\t\"when it should not be: %v\", test.name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure error type is a TxRuleError inside of a RuleError.\n\t\trerr, ok := err.(RuleError)\n\t\tif !ok {\n\t\t\tt.Errorf(\"CheckTransactionStandard (%s): unexpected \"+\n\t\t\t\t\"error type - got %T\", test.name, err)\n\t\t\tcontinue\n\t\t}\n\t\ttxrerr, ok := rerr.Err.(TxRuleError)\n\t\tif !ok {\n\t\t\tt.Errorf(\"CheckTransactionStandard (%s): unexpected \"+\n\t\t\t\t\"error type - got %T\", test.name, rerr.Err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the reject code is the expected one.\n\t\tif txrerr.RejectCode != test.code {\n\t\t\tt.Errorf(\"CheckTransactionStandard (%s): unexpected \"+\n\t\t\t\t\"error code - got %v, want %v\", test.name,\n\t\t\t\ttxrerr.RejectCode, test.code)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "mining/README.md",
    "content": "mining\n======\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/mining)\n\n## Overview\n\nThis package is currently a work in progress.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/mining\n```\n\n## License\n\nPackage mining is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "mining/cpuminer/README.md",
    "content": "cpuminer\n========\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/mining/cpuminer)\n=======\n\n## Overview\n\nThis package is currently a work in progress.  It works without issue since it\nis used in several of the integration tests, but the API is not really ready for\npublic consumption as it has simply been refactored out of the main codebase for\nnow.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/mining/cpuminer\n```\n\n## License\n\nPackage cpuminer is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "mining/cpuminer/cpuminer.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage cpuminer\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math/rand\"\n\t\"runtime\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/mining\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// maxNonce is the maximum value a nonce can be in a block header.\n\tmaxNonce = ^uint32(0) // 2^32 - 1\n\n\t// maxExtraNonce is the maximum value an extra nonce used in a coinbase\n\t// transaction can be.\n\tmaxExtraNonce = ^uint64(0) // 2^64 - 1\n\n\t// hpsUpdateSecs is the number of seconds to wait in between each\n\t// update to the hashes per second monitor.\n\thpsUpdateSecs = 10\n\n\t// hashUpdateSec is the number of seconds each worker waits in between\n\t// notifying the speed monitor with how many hashes have been completed\n\t// while they are actively searching for a solution.  This is done to\n\t// reduce the amount of syncs between the workers that must be done to\n\t// keep track of the hashes per second.\n\thashUpdateSecs = 15\n)\n\nvar (\n\t// defaultNumWorkers is the default number of workers to use for mining\n\t// and is based on the number of processor cores.  This helps ensure the\n\t// system stays reasonably responsive under heavy load.\n\tdefaultNumWorkers = uint32(runtime.NumCPU())\n)\n\n// Config is a descriptor containing the cpu miner configuration.\ntype Config struct {\n\t// ChainParams identifies which chain parameters the cpu miner is\n\t// associated with.\n\tChainParams *chaincfg.Params\n\n\t// BlockTemplateGenerator identifies the instance to use in order to\n\t// generate block templates that the miner will attempt to solve.\n\tBlockTemplateGenerator *mining.BlkTmplGenerator\n\n\t// MiningAddrs is a list of payment addresses to use for the generated\n\t// blocks.  Each generated block will randomly choose one of them.\n\tMiningAddrs []btcutil.Address\n\n\t// ProcessBlock defines the function to call with any solved blocks.\n\t// It typically must run the provided block through the same set of\n\t// rules and handling as any other block coming from the network.\n\tProcessBlock func(*btcutil.Block, blockchain.BehaviorFlags) (bool, error)\n\n\t// ConnectedCount defines the function to use to obtain how many other\n\t// peers the server is connected to.  This is used by the automatic\n\t// persistent mining routine to determine whether or it should attempt\n\t// mining.  This is useful because there is no point in mining when not\n\t// connected to any peers since there would no be anyone to send any\n\t// found blocks to.\n\tConnectedCount func() int32\n\n\t// IsCurrent defines the function to use to obtain whether or not the\n\t// block chain is current.  This is used by the automatic persistent\n\t// mining routine to determine whether or it should attempt mining.\n\t// This is useful because there is no point in mining if the chain is\n\t// not current since any solved blocks would be on a side chain and and\n\t// up orphaned anyways.\n\tIsCurrent func() bool\n}\n\n// CPUMiner provides facilities for solving blocks (mining) using the CPU in\n// a concurrency-safe manner.  It consists of two main goroutines -- a speed\n// monitor and a controller for worker goroutines which generate and solve\n// blocks.  The number of goroutines can be set via the SetMaxGoRoutines\n// function, but the default is based on the number of processor cores in the\n// system which is typically sufficient.\ntype CPUMiner struct {\n\tsync.Mutex\n\tg                 *mining.BlkTmplGenerator\n\tcfg               Config\n\tnumWorkers        uint32\n\tstarted           bool\n\tdiscreteMining    bool\n\tsubmitBlockLock   sync.Mutex\n\twg                sync.WaitGroup\n\tworkerWg          sync.WaitGroup\n\tupdateNumWorkers  chan struct{}\n\tqueryHashesPerSec chan float64\n\tupdateHashes      chan uint64\n\tspeedMonitorQuit  chan struct{}\n\tquit              chan struct{}\n}\n\n// speedMonitor handles tracking the number of hashes per second the mining\n// process is performing.  It must be run as a goroutine.\nfunc (m *CPUMiner) speedMonitor() {\n\tlog.Tracef(\"CPU miner speed monitor started\")\n\n\tvar hashesPerSec float64\n\tvar totalHashes uint64\n\tticker := time.NewTicker(time.Second * hpsUpdateSecs)\n\tdefer ticker.Stop()\n\nout:\n\tfor {\n\t\tselect {\n\t\t// Periodic updates from the workers with how many hashes they\n\t\t// have performed.\n\t\tcase numHashes := <-m.updateHashes:\n\t\t\ttotalHashes += numHashes\n\n\t\t// Time to update the hashes per second.\n\t\tcase <-ticker.C:\n\t\t\tcurHashesPerSec := float64(totalHashes) / hpsUpdateSecs\n\t\t\tif hashesPerSec == 0 {\n\t\t\t\thashesPerSec = curHashesPerSec\n\t\t\t}\n\t\t\thashesPerSec = (hashesPerSec + curHashesPerSec) / 2\n\t\t\ttotalHashes = 0\n\t\t\tif hashesPerSec != 0 {\n\t\t\t\tlog.Debugf(\"Hash speed: %6.0f kilohashes/s\",\n\t\t\t\t\thashesPerSec/1000)\n\t\t\t}\n\n\t\t// Request for the number of hashes per second.\n\t\tcase m.queryHashesPerSec <- hashesPerSec:\n\t\t\t// Nothing to do.\n\n\t\tcase <-m.speedMonitorQuit:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\tm.wg.Done()\n\tlog.Tracef(\"CPU miner speed monitor done\")\n}\n\n// submitBlock submits the passed block to network after ensuring it passes all\n// of the consensus validation rules.\nfunc (m *CPUMiner) submitBlock(block *btcutil.Block) bool {\n\tm.submitBlockLock.Lock()\n\tdefer m.submitBlockLock.Unlock()\n\n\t// Ensure the block is not stale since a new block could have shown up\n\t// while the solution was being found.  Typically that condition is\n\t// detected and all work on the stale block is halted to start work on\n\t// a new block, but the check only happens periodically, so it is\n\t// possible a block was found and submitted in between.\n\tmsgBlock := block.MsgBlock()\n\tif !msgBlock.Header.PrevBlock.IsEqual(&m.g.BestSnapshot().Hash) {\n\t\tlog.Debugf(\"Block submitted via CPU miner with previous \"+\n\t\t\t\"block %s is stale\", msgBlock.Header.PrevBlock)\n\t\treturn false\n\t}\n\n\t// Process this block using the same rules as blocks coming from other\n\t// nodes.  This will in turn relay it to the network like normal.\n\tisOrphan, err := m.cfg.ProcessBlock(block, blockchain.BFNone)\n\tif err != nil {\n\t\t// Anything other than a rule violation is an unexpected error,\n\t\t// so log that error as an internal error.\n\t\tif _, ok := err.(blockchain.RuleError); !ok {\n\t\t\tlog.Errorf(\"Unexpected error while processing \"+\n\t\t\t\t\"block submitted via CPU miner: %v\", err)\n\t\t\treturn false\n\t\t}\n\n\t\tlog.Debugf(\"Block submitted via CPU miner rejected: %v\", err)\n\t\treturn false\n\t}\n\tif isOrphan {\n\t\tlog.Debugf(\"Block submitted via CPU miner is an orphan\")\n\t\treturn false\n\t}\n\n\t// The block was accepted.\n\tcoinbaseTx := block.MsgBlock().Transactions[0].TxOut[0]\n\tlog.Infof(\"Block submitted via CPU miner accepted (hash %s, \"+\n\t\t\"amount %v)\", block.Hash(), btcutil.Amount(coinbaseTx.Value))\n\treturn true\n}\n\n// solveBlock attempts to find some combination of a nonce, extra nonce, and\n// current timestamp which makes the passed block hash to a value less than the\n// target difficulty.  The timestamp is updated periodically and the passed\n// block is modified with all tweaks during this process.  This means that\n// when the function returns true, the block is ready for submission.\n//\n// This function will return early with false when conditions that trigger a\n// stale block such as a new block showing up or periodically when there are\n// new transactions and enough time has elapsed without finding a solution.\nfunc (m *CPUMiner) solveBlock(msgBlock *wire.MsgBlock, blockHeight int32,\n\tticker *time.Ticker, quit chan struct{}) bool {\n\n\t// Choose a random extra nonce offset for this block template and\n\t// worker.\n\tenOffset, err := wire.RandomUint64()\n\tif err != nil {\n\t\tlog.Errorf(\"Unexpected error while generating random \"+\n\t\t\t\"extra nonce offset: %v\", err)\n\t\tenOffset = 0\n\t}\n\n\t// Create some convenience variables.\n\theader := &msgBlock.Header\n\ttargetDifficulty := blockchain.CompactToBig(header.Bits)\n\n\t// Initial state.\n\tlastGenerated := time.Now()\n\tlastTxUpdate := m.g.TxSource().LastUpdated()\n\thashesCompleted := uint64(0)\n\n\t// Note that the entire extra nonce range is iterated and the offset is\n\t// added relying on the fact that overflow will wrap around 0 as\n\t// provided by the Go spec.\n\tfor extraNonce := uint64(0); extraNonce < maxExtraNonce; extraNonce++ {\n\t\t// Update the extra nonce in the block template with the\n\t\t// new value by regenerating the coinbase script and\n\t\t// setting the merkle root to the new value.\n\t\tm.g.UpdateExtraNonce(msgBlock, blockHeight, extraNonce+enOffset)\n\n\t\t// Search through the entire nonce range for a solution while\n\t\t// periodically checking for early quit and stale block\n\t\t// conditions along with updates to the speed monitor.\n\t\tfor i := uint32(0); i <= maxNonce; i++ {\n\t\t\tselect {\n\t\t\tcase <-quit:\n\t\t\t\treturn false\n\n\t\t\tcase <-ticker.C:\n\t\t\t\tm.updateHashes <- hashesCompleted\n\t\t\t\thashesCompleted = 0\n\n\t\t\t\t// The current block is stale if the best block\n\t\t\t\t// has changed.\n\t\t\t\tbest := m.g.BestSnapshot()\n\t\t\t\tif !header.PrevBlock.IsEqual(&best.Hash) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\t// The current block is stale if the memory pool\n\t\t\t\t// has been updated since the block template was\n\t\t\t\t// generated and it has been at least one\n\t\t\t\t// minute.\n\t\t\t\tif lastTxUpdate != m.g.TxSource().LastUpdated() &&\n\t\t\t\t\ttime.Now().After(lastGenerated.Add(time.Minute)) {\n\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tm.g.UpdateBlockTime(msgBlock)\n\n\t\t\tdefault:\n\t\t\t\t// Non-blocking select to fall through\n\t\t\t}\n\n\t\t\t// Update the nonce and hash the block header.  Each\n\t\t\t// hash is actually a double sha256 (two hashes), so\n\t\t\t// increment the number of hashes completed for each\n\t\t\t// attempt accordingly.\n\t\t\theader.Nonce = i\n\t\t\thash := header.BlockHash()\n\t\t\thashesCompleted += 2\n\n\t\t\t// The block is solved when the new block hash is less\n\t\t\t// than the target difficulty.  Yay!\n\t\t\tif blockchain.HashToBig(&hash).Cmp(targetDifficulty) <= 0 {\n\t\t\t\tm.updateHashes <- hashesCompleted\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n\n// generateBlocks is a worker that is controlled by the miningWorkerController.\n// It is self contained in that it creates block templates and attempts to solve\n// them while detecting when it is performing stale work and reacting\n// accordingly by generating a new block template.  When a block is solved, it\n// is submitted.\n//\n// It must be run as a goroutine.\nfunc (m *CPUMiner) generateBlocks(quit chan struct{}) {\n\tlog.Tracef(\"Starting generate blocks worker\")\n\n\t// Start a ticker which is used to signal checks for stale work and\n\t// updates to the speed monitor.\n\tticker := time.NewTicker(time.Second * hashUpdateSecs)\n\tdefer ticker.Stop()\nout:\n\tfor {\n\t\t// Quit when the miner is stopped.\n\t\tselect {\n\t\tcase <-quit:\n\t\t\tbreak out\n\t\tdefault:\n\t\t\t// Non-blocking select to fall through\n\t\t}\n\n\t\t// Wait until there is a connection to at least one other peer\n\t\t// since there is no way to relay a found block or receive\n\t\t// transactions to work on when there are no connected peers.\n\t\tif m.cfg.ConnectedCount() == 0 {\n\t\t\ttime.Sleep(time.Second)\n\t\t\tcontinue\n\t\t}\n\n\t\t// No point in searching for a solution before the chain is\n\t\t// synced.  Also, grab the same lock as used for block\n\t\t// submission, since the current block will be changing and\n\t\t// this would otherwise end up building a new block template on\n\t\t// a block that is in the process of becoming stale.\n\t\tm.submitBlockLock.Lock()\n\t\tcurHeight := m.g.BestSnapshot().Height\n\t\tif curHeight != 0 && !m.cfg.IsCurrent() {\n\t\t\tm.submitBlockLock.Unlock()\n\t\t\ttime.Sleep(time.Second)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Choose a payment address at random.\n\t\trand.Seed(time.Now().UnixNano())\n\t\tpayToAddr := m.cfg.MiningAddrs[rand.Intn(len(m.cfg.MiningAddrs))]\n\n\t\t// Create a new block template using the available transactions\n\t\t// in the memory pool as a source of transactions to potentially\n\t\t// include in the block.\n\t\ttemplate, err := m.g.NewBlockTemplate(payToAddr)\n\t\tm.submitBlockLock.Unlock()\n\t\tif err != nil {\n\t\t\terrStr := fmt.Sprintf(\"Failed to create new block \"+\n\t\t\t\t\"template: %v\", err)\n\t\t\tlog.Errorf(errStr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Attempt to solve the block.  The function will exit early\n\t\t// with false when conditions that trigger a stale block, so\n\t\t// a new block template can be generated.  When the return is\n\t\t// true a solution was found, so submit the solved block.\n\t\tif m.solveBlock(template.Block, curHeight+1, ticker, quit) {\n\t\t\tblock := btcutil.NewBlock(template.Block)\n\t\t\tm.submitBlock(block)\n\t\t}\n\t}\n\n\tm.workerWg.Done()\n\tlog.Tracef(\"Generate blocks worker done\")\n}\n\n// miningWorkerController launches the worker goroutines that are used to\n// generate block templates and solve them.  It also provides the ability to\n// dynamically adjust the number of running worker goroutines.\n//\n// It must be run as a goroutine.\nfunc (m *CPUMiner) miningWorkerController() {\n\t// launchWorkers groups common code to launch a specified number of\n\t// workers for generating blocks.\n\tvar runningWorkers []chan struct{}\n\tlaunchWorkers := func(numWorkers uint32) {\n\t\tfor i := uint32(0); i < numWorkers; i++ {\n\t\t\tquit := make(chan struct{})\n\t\t\trunningWorkers = append(runningWorkers, quit)\n\n\t\t\tm.workerWg.Add(1)\n\t\t\tgo m.generateBlocks(quit)\n\t\t}\n\t}\n\n\t// Launch the current number of workers by default.\n\trunningWorkers = make([]chan struct{}, 0, m.numWorkers)\n\tlaunchWorkers(m.numWorkers)\n\nout:\n\tfor {\n\t\tselect {\n\t\t// Update the number of running workers.\n\t\tcase <-m.updateNumWorkers:\n\t\t\t// No change.\n\t\t\tnumRunning := uint32(len(runningWorkers))\n\t\t\tif m.numWorkers == numRunning {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Add new workers.\n\t\t\tif m.numWorkers > numRunning {\n\t\t\t\tlaunchWorkers(m.numWorkers - numRunning)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Signal the most recently created goroutines to exit.\n\t\t\tfor i := numRunning - 1; i >= m.numWorkers; i-- {\n\t\t\t\tclose(runningWorkers[i])\n\t\t\t\trunningWorkers[i] = nil\n\t\t\t\trunningWorkers = runningWorkers[:i]\n\t\t\t}\n\n\t\tcase <-m.quit:\n\t\t\tfor _, quit := range runningWorkers {\n\t\t\t\tclose(quit)\n\t\t\t}\n\t\t\tbreak out\n\t\t}\n\t}\n\n\t// Wait until all workers shut down to stop the speed monitor since\n\t// they rely on being able to send updates to it.\n\tm.workerWg.Wait()\n\tclose(m.speedMonitorQuit)\n\tm.wg.Done()\n}\n\n// Start begins the CPU mining process as well as the speed monitor used to\n// track hashing metrics.  Calling this function when the CPU miner has\n// already been started will have no effect.\n//\n// This function is safe for concurrent access.\nfunc (m *CPUMiner) Start() {\n\tm.Lock()\n\tdefer m.Unlock()\n\n\t// Nothing to do if the miner is already running or if running in\n\t// discrete mode (using GenerateNBlocks).\n\tif m.started || m.discreteMining {\n\t\treturn\n\t}\n\n\tm.quit = make(chan struct{})\n\tm.speedMonitorQuit = make(chan struct{})\n\tm.wg.Add(2)\n\tgo m.speedMonitor()\n\tgo m.miningWorkerController()\n\n\tm.started = true\n\tlog.Infof(\"CPU miner started\")\n}\n\n// Stop gracefully stops the mining process by signalling all workers, and the\n// speed monitor to quit.  Calling this function when the CPU miner has not\n// already been started will have no effect.\n//\n// This function is safe for concurrent access.\nfunc (m *CPUMiner) Stop() {\n\tm.Lock()\n\tdefer m.Unlock()\n\n\t// Nothing to do if the miner is not currently running or if running in\n\t// discrete mode (using GenerateNBlocks).\n\tif !m.started || m.discreteMining {\n\t\treturn\n\t}\n\n\tclose(m.quit)\n\tm.wg.Wait()\n\tm.started = false\n\tlog.Infof(\"CPU miner stopped\")\n}\n\n// IsMining returns whether or not the CPU miner has been started and is\n// therefore currenting mining.\n//\n// This function is safe for concurrent access.\nfunc (m *CPUMiner) IsMining() bool {\n\tm.Lock()\n\tdefer m.Unlock()\n\n\treturn m.started\n}\n\n// HashesPerSecond returns the number of hashes per second the mining process\n// is performing.  0 is returned if the miner is not currently running.\n//\n// This function is safe for concurrent access.\nfunc (m *CPUMiner) HashesPerSecond() float64 {\n\tm.Lock()\n\tdefer m.Unlock()\n\n\t// Nothing to do if the miner is not currently running.\n\tif !m.started {\n\t\treturn 0\n\t}\n\n\treturn <-m.queryHashesPerSec\n}\n\n// SetNumWorkers sets the number of workers to create which solve blocks.  Any\n// negative values will cause a default number of workers to be used which is\n// based on the number of processor cores in the system.  A value of 0 will\n// cause all CPU mining to be stopped.\n//\n// This function is safe for concurrent access.\nfunc (m *CPUMiner) SetNumWorkers(numWorkers int32) {\n\tif numWorkers == 0 {\n\t\tm.Stop()\n\t}\n\n\t// Don't lock until after the first check since Stop does its own\n\t// locking.\n\tm.Lock()\n\tdefer m.Unlock()\n\n\t// Use default if provided value is negative.\n\tif numWorkers < 0 {\n\t\tm.numWorkers = defaultNumWorkers\n\t} else {\n\t\tm.numWorkers = uint32(numWorkers)\n\t}\n\n\t// When the miner is already running, notify the controller about the\n\t// the change.\n\tif m.started {\n\t\tm.updateNumWorkers <- struct{}{}\n\t}\n}\n\n// NumWorkers returns the number of workers which are running to solve blocks.\n//\n// This function is safe for concurrent access.\nfunc (m *CPUMiner) NumWorkers() int32 {\n\tm.Lock()\n\tdefer m.Unlock()\n\n\treturn int32(m.numWorkers)\n}\n\n// GenerateNBlocks generates the requested number of blocks. It is self\n// contained in that it creates block templates and attempts to solve them while\n// detecting when it is performing stale work and reacting accordingly by\n// generating a new block template.  When a block is solved, it is submitted.\n// The function returns a list of the hashes of generated blocks.\nfunc (m *CPUMiner) GenerateNBlocks(n uint32) ([]*chainhash.Hash, error) {\n\tm.Lock()\n\n\t// Respond with an error if server is already mining.\n\tif m.started || m.discreteMining {\n\t\tm.Unlock()\n\t\treturn nil, errors.New(\"Server is already CPU mining. Please call \" +\n\t\t\t\"`setgenerate 0` before calling discrete `generate` commands.\")\n\t}\n\n\tm.started = true\n\tm.discreteMining = true\n\n\tm.speedMonitorQuit = make(chan struct{})\n\tm.wg.Add(1)\n\tgo m.speedMonitor()\n\n\tm.Unlock()\n\n\tlog.Tracef(\"Generating %d blocks\", n)\n\n\ti := uint32(0)\n\tblockHashes := make([]*chainhash.Hash, n)\n\n\t// Start a ticker which is used to signal checks for stale work and\n\t// updates to the speed monitor.\n\tticker := time.NewTicker(time.Second * hashUpdateSecs)\n\tdefer ticker.Stop()\n\n\tfor {\n\t\t// Read updateNumWorkers in case someone tries a `setgenerate` while\n\t\t// we're generating. We can ignore it as the `generate` RPC call only\n\t\t// uses 1 worker.\n\t\tselect {\n\t\tcase <-m.updateNumWorkers:\n\t\tdefault:\n\t\t}\n\n\t\t// Grab the lock used for block submission, since the current block will\n\t\t// be changing and this would otherwise end up building a new block\n\t\t// template on a block that is in the process of becoming stale.\n\t\tm.submitBlockLock.Lock()\n\t\tcurHeight := m.g.BestSnapshot().Height\n\n\t\t// Choose a payment address at random.\n\t\trand.Seed(time.Now().UnixNano())\n\t\tpayToAddr := m.cfg.MiningAddrs[rand.Intn(len(m.cfg.MiningAddrs))]\n\n\t\t// Create a new block template using the available transactions\n\t\t// in the memory pool as a source of transactions to potentially\n\t\t// include in the block.\n\t\ttemplate, err := m.g.NewBlockTemplate(payToAddr)\n\t\tm.submitBlockLock.Unlock()\n\t\tif err != nil {\n\t\t\terrStr := fmt.Sprintf(\"Failed to create new block \"+\n\t\t\t\t\"template: %v\", err)\n\t\t\tlog.Errorf(errStr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Attempt to solve the block.  The function will exit early\n\t\t// with false when conditions that trigger a stale block, so\n\t\t// a new block template can be generated.  When the return is\n\t\t// true a solution was found, so submit the solved block.\n\t\tif m.solveBlock(template.Block, curHeight+1, ticker, nil) {\n\t\t\tblock := btcutil.NewBlock(template.Block)\n\t\t\tm.submitBlock(block)\n\t\t\tblockHashes[i] = block.Hash()\n\t\t\ti++\n\t\t\tif i == n {\n\t\t\t\tlog.Tracef(\"Generated %d blocks\", i)\n\t\t\t\tm.Lock()\n\t\t\t\tclose(m.speedMonitorQuit)\n\t\t\t\tm.wg.Wait()\n\t\t\t\tm.started = false\n\t\t\t\tm.discreteMining = false\n\t\t\t\tm.Unlock()\n\t\t\t\treturn blockHashes, nil\n\t\t\t}\n\t\t}\n\t}\n}\n\n// New returns a new instance of a CPU miner for the provided configuration.\n// Use Start to begin the mining process.  See the documentation for CPUMiner\n// type for more details.\nfunc New(cfg *Config) *CPUMiner {\n\treturn &CPUMiner{\n\t\tg:                 cfg.BlockTemplateGenerator,\n\t\tcfg:               *cfg,\n\t\tnumWorkers:        defaultNumWorkers,\n\t\tupdateNumWorkers:  make(chan struct{}),\n\t\tqueryHashesPerSec: make(chan float64),\n\t\tupdateHashes:      make(chan uint64),\n\t}\n}\n"
  },
  {
    "path": "mining/cpuminer/log.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage cpuminer\n\nimport (\n\t\"github.com/btcsuite/btclog\"\n)\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until UseLogger is called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n"
  },
  {
    "path": "mining/log.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mining\n\nimport (\n\t\"github.com/btcsuite/btclog\"\n)\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until UseLogger is called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n"
  },
  {
    "path": "mining/mining.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mining\n\nimport (\n\t\"bytes\"\n\t\"container/heap\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// MinHighPriority is the minimum priority value that allows a\n\t// transaction to be considered high priority.\n\tMinHighPriority = btcutil.SatoshiPerBitcoin * 144.0 / 250\n\n\t// blockHeaderOverhead is the max number of bytes it takes to serialize\n\t// a block header and max possible transaction count.\n\tblockHeaderOverhead = wire.MaxBlockHeaderPayload + wire.MaxVarIntPayload\n\n\t// CoinbaseFlags is added to the coinbase script of a generated block\n\t// and is used to monitor BIP16 support as well as blocks that are\n\t// generated via btcd.\n\tCoinbaseFlags = \"/P2SH/btcd/\"\n)\n\n// TxDesc is a descriptor about a transaction in a transaction source along with\n// additional metadata.\ntype TxDesc struct {\n\t// Tx is the transaction associated with the entry.\n\tTx *btcutil.Tx\n\n\t// Added is the time when the entry was added to the source pool.\n\tAdded time.Time\n\n\t// Height is the block height when the entry was added to the source\n\t// pool.\n\tHeight int32\n\n\t// Fee is the total fee the transaction associated with the entry pays.\n\tFee int64\n\n\t// FeePerKB is the fee the transaction pays in Satoshi per 1000 bytes.\n\tFeePerKB int64\n}\n\n// TxSource represents a source of transactions to consider for inclusion in\n// new blocks.\n//\n// The interface contract requires that all of these methods are safe for\n// concurrent access with respect to the source.\ntype TxSource interface {\n\t// LastUpdated returns the last time a transaction was added to or\n\t// removed from the source pool.\n\tLastUpdated() time.Time\n\n\t// MiningDescs returns a slice of mining descriptors for all the\n\t// transactions in the source pool.\n\tMiningDescs() []*TxDesc\n\n\t// HaveTransaction returns whether or not the passed transaction hash\n\t// exists in the source pool.\n\tHaveTransaction(hash *chainhash.Hash) bool\n}\n\n// txPrioItem houses a transaction along with extra information that allows the\n// transaction to be prioritized and track dependencies on other transactions\n// which have not been mined into a block yet.\ntype txPrioItem struct {\n\ttx       *btcutil.Tx\n\tfee      int64\n\tpriority float64\n\tfeePerKB int64\n\n\t// dependsOn holds a map of transaction hashes which this one depends\n\t// on.  It will only be set when the transaction references other\n\t// transactions in the source pool and hence must come after them in\n\t// a block.\n\tdependsOn map[chainhash.Hash]struct{}\n}\n\n// txPriorityQueueLessFunc describes a function that can be used as a compare\n// function for a transaction priority queue (txPriorityQueue).\ntype txPriorityQueueLessFunc func(*txPriorityQueue, int, int) bool\n\n// txPriorityQueue implements a priority queue of txPrioItem elements that\n// supports an arbitrary compare function as defined by txPriorityQueueLessFunc.\ntype txPriorityQueue struct {\n\tlessFunc txPriorityQueueLessFunc\n\titems    []*txPrioItem\n}\n\n// Len returns the number of items in the priority queue.  It is part of the\n// heap.Interface implementation.\nfunc (pq *txPriorityQueue) Len() int {\n\treturn len(pq.items)\n}\n\n// Less returns whether the item in the priority queue with index i should sort\n// before the item with index j by deferring to the assigned less function.  It\n// is part of the heap.Interface implementation.\nfunc (pq *txPriorityQueue) Less(i, j int) bool {\n\treturn pq.lessFunc(pq, i, j)\n}\n\n// Swap swaps the items at the passed indices in the priority queue.  It is\n// part of the heap.Interface implementation.\nfunc (pq *txPriorityQueue) Swap(i, j int) {\n\tpq.items[i], pq.items[j] = pq.items[j], pq.items[i]\n}\n\n// Push pushes the passed item onto the priority queue.  It is part of the\n// heap.Interface implementation.\nfunc (pq *txPriorityQueue) Push(x interface{}) {\n\tpq.items = append(pq.items, x.(*txPrioItem))\n}\n\n// Pop removes the highest priority item (according to Less) from the priority\n// queue and returns it.  It is part of the heap.Interface implementation.\nfunc (pq *txPriorityQueue) Pop() interface{} {\n\tn := len(pq.items)\n\titem := pq.items[n-1]\n\tpq.items[n-1] = nil\n\tpq.items = pq.items[0 : n-1]\n\treturn item\n}\n\n// SetLessFunc sets the compare function for the priority queue to the provided\n// function.  It also invokes heap.Init on the priority queue using the new\n// function so it can immediately be used with heap.Push/Pop.\nfunc (pq *txPriorityQueue) SetLessFunc(lessFunc txPriorityQueueLessFunc) {\n\tpq.lessFunc = lessFunc\n\theap.Init(pq)\n}\n\n// txPQByPriority sorts a txPriorityQueue by transaction priority and then fees\n// per kilobyte.\nfunc txPQByPriority(pq *txPriorityQueue, i, j int) bool {\n\t// Using > here so that pop gives the highest priority item as opposed\n\t// to the lowest.  Sort by priority first, then fee.\n\tif pq.items[i].priority == pq.items[j].priority {\n\t\treturn pq.items[i].feePerKB > pq.items[j].feePerKB\n\t}\n\treturn pq.items[i].priority > pq.items[j].priority\n\n}\n\n// txPQByFee sorts a txPriorityQueue by fees per kilobyte and then transaction\n// priority.\nfunc txPQByFee(pq *txPriorityQueue, i, j int) bool {\n\t// Using > here so that pop gives the highest fee item as opposed\n\t// to the lowest.  Sort by fee first, then priority.\n\tif pq.items[i].feePerKB == pq.items[j].feePerKB {\n\t\treturn pq.items[i].priority > pq.items[j].priority\n\t}\n\treturn pq.items[i].feePerKB > pq.items[j].feePerKB\n}\n\n// newTxPriorityQueue returns a new transaction priority queue that reserves the\n// passed amount of space for the elements.  The new priority queue uses either\n// the txPQByPriority or the txPQByFee compare function depending on the\n// sortByFee parameter and is already initialized for use with heap.Push/Pop.\n// The priority queue can grow larger than the reserved space, but extra copies\n// of the underlying array can be avoided by reserving a sane value.\nfunc newTxPriorityQueue(reserve int, sortByFee bool) *txPriorityQueue {\n\tpq := &txPriorityQueue{\n\t\titems: make([]*txPrioItem, 0, reserve),\n\t}\n\tif sortByFee {\n\t\tpq.SetLessFunc(txPQByFee)\n\t} else {\n\t\tpq.SetLessFunc(txPQByPriority)\n\t}\n\treturn pq\n}\n\n// BlockTemplate houses a block that has yet to be solved along with additional\n// details about the fees and the number of signature operations for each\n// transaction in the block.\ntype BlockTemplate struct {\n\t// Block is a block that is ready to be solved by miners.  Thus, it is\n\t// completely valid with the exception of satisfying the proof-of-work\n\t// requirement.\n\tBlock *wire.MsgBlock\n\n\t// Fees contains the amount of fees each transaction in the generated\n\t// template pays in base units.  Since the first transaction is the\n\t// coinbase, the first entry (offset 0) will contain the negative of the\n\t// sum of the fees of all other transactions.\n\tFees []int64\n\n\t// SigOpCosts contains the number of signature operations each\n\t// transaction in the generated template performs.\n\tSigOpCosts []int64\n\n\t// Height is the height at which the block template connects to the main\n\t// chain.\n\tHeight int32\n\n\t// ValidPayAddress indicates whether or not the template coinbase pays\n\t// to an address or is redeemable by anyone.  See the documentation on\n\t// NewBlockTemplate for details on which this can be useful to generate\n\t// templates without a coinbase payment address.\n\tValidPayAddress bool\n\n\t// WitnessCommitment is a commitment to the witness data (if any)\n\t// within the block. This field will only be populted once segregated\n\t// witness has been activated, and the block contains a transaction\n\t// which has witness data.\n\tWitnessCommitment []byte\n}\n\n// mergeUtxoView adds all of the entries in viewB to viewA.  The result is that\n// viewA will contain all of its original entries plus all of the entries\n// in viewB.  It will replace any entries in viewB which also exist in viewA\n// if the entry in viewA is spent.\nfunc mergeUtxoView(viewA *blockchain.UtxoViewpoint, viewB *blockchain.UtxoViewpoint) {\n\tviewAEntries := viewA.Entries()\n\tfor outpoint, entryB := range viewB.Entries() {\n\t\tif entryA, exists := viewAEntries[outpoint]; !exists ||\n\t\t\tentryA == nil || entryA.IsSpent() {\n\n\t\t\tviewAEntries[outpoint] = entryB\n\t\t}\n\t}\n}\n\n// standardCoinbaseScript returns a standard script suitable for use as the\n// signature script of the coinbase transaction of a new block.  In particular,\n// it starts with the block height that is required by version 2 blocks and adds\n// the extra nonce as well as additional coinbase flags.\nfunc standardCoinbaseScript(nextBlockHeight int32, extraNonce uint64) ([]byte, error) {\n\treturn txscript.NewScriptBuilder().AddInt64(int64(nextBlockHeight)).\n\t\tAddInt64(int64(extraNonce)).AddData([]byte(CoinbaseFlags)).\n\t\tScript()\n}\n\n// createCoinbaseTx returns a coinbase transaction paying an appropriate subsidy\n// based on the passed block height to the provided address.  When the address\n// is nil, the coinbase transaction will instead be redeemable by anyone.\n//\n// See the comment for NewBlockTemplate for more information about why the nil\n// address handling is useful.\nfunc createCoinbaseTx(params *chaincfg.Params, coinbaseScript []byte, nextBlockHeight int32, addr btcutil.Address) (*btcutil.Tx, error) {\n\t// Create the script to pay to the provided payment address if one was\n\t// specified.  Otherwise create a script that allows the coinbase to be\n\t// redeemable by anyone.\n\tvar pkScript []byte\n\tif addr != nil {\n\t\tvar err error\n\t\tpkScript, err = txscript.PayToAddrScript(addr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\tvar err error\n\t\tscriptBuilder := txscript.NewScriptBuilder()\n\t\tpkScript, err = scriptBuilder.AddOp(txscript.OP_TRUE).Script()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\ttx := wire.NewMsgTx(wire.TxVersion)\n\ttx.AddTxIn(&wire.TxIn{\n\t\t// Coinbase transactions have no inputs, so previous outpoint is\n\t\t// zero hash and max index.\n\t\tPreviousOutPoint: *wire.NewOutPoint(&chainhash.Hash{},\n\t\t\twire.MaxPrevOutIndex),\n\t\tSignatureScript: coinbaseScript,\n\t\tSequence:        wire.MaxTxInSequenceNum,\n\t})\n\ttx.AddTxOut(&wire.TxOut{\n\t\tValue:    blockchain.CalcBlockSubsidy(nextBlockHeight, params),\n\t\tPkScript: pkScript,\n\t})\n\treturn btcutil.NewTx(tx), nil\n}\n\n// spendTransaction updates the passed view by marking the inputs to the passed\n// transaction as spent.  It also adds all outputs in the passed transaction\n// which are not provably unspendable as available unspent transaction outputs.\nfunc spendTransaction(utxoView *blockchain.UtxoViewpoint, tx *btcutil.Tx, height int32) error {\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tentry := utxoView.LookupEntry(txIn.PreviousOutPoint)\n\t\tif entry != nil {\n\t\t\tentry.Spend()\n\t\t}\n\t}\n\n\tutxoView.AddTxOuts(tx, height)\n\treturn nil\n}\n\n// logSkippedDeps logs any dependencies which are also skipped as a result of\n// skipping a transaction while generating a block template at the trace level.\nfunc logSkippedDeps(tx *btcutil.Tx, deps map[chainhash.Hash]*txPrioItem) {\n\tif deps == nil {\n\t\treturn\n\t}\n\n\tfor _, item := range deps {\n\t\tlog.Tracef(\"Skipping tx %s since it depends on %s\\n\",\n\t\t\titem.tx.Hash(), tx.Hash())\n\t}\n}\n\n// MinimumMedianTime returns the minimum allowed timestamp for a block building\n// on the end of the provided best chain.  In particular, it is one second after\n// the median timestamp of the last several blocks per the chain consensus\n// rules.\nfunc MinimumMedianTime(chainState *blockchain.BestState) time.Time {\n\treturn chainState.MedianTime.Add(time.Second)\n}\n\n// medianAdjustedTime returns the current time adjusted to ensure it is at least\n// one second after the median timestamp of the last several blocks per the\n// chain consensus rules.\nfunc medianAdjustedTime(chainState *blockchain.BestState, timeSource blockchain.MedianTimeSource) time.Time {\n\t// The timestamp for the block must not be before the median timestamp\n\t// of the last several blocks.  Thus, choose the maximum between the\n\t// current time and one second after the past median time.  The current\n\t// timestamp is truncated to a second boundary before comparison since a\n\t// block timestamp does not supported a precision greater than one\n\t// second.\n\tnewTimestamp := timeSource.AdjustedTime()\n\tminTimestamp := MinimumMedianTime(chainState)\n\tif newTimestamp.Before(minTimestamp) {\n\t\tnewTimestamp = minTimestamp\n\t}\n\n\treturn newTimestamp\n}\n\n// BlkTmplGenerator provides a type that can be used to generate block templates\n// based on a given mining policy and source of transactions to choose from.\n// It also houses additional state required in order to ensure the templates\n// are built on top of the current best chain and adhere to the consensus rules.\ntype BlkTmplGenerator struct {\n\tpolicy      *Policy\n\tchainParams *chaincfg.Params\n\ttxSource    TxSource\n\tchain       *blockchain.BlockChain\n\ttimeSource  blockchain.MedianTimeSource\n\tsigCache    *txscript.SigCache\n\thashCache   *txscript.HashCache\n}\n\n// NewBlkTmplGenerator returns a new block template generator for the given\n// policy using transactions from the provided transaction source.\n//\n// The additional state-related fields are required in order to ensure the\n// templates are built on top of the current best chain and adhere to the\n// consensus rules.\nfunc NewBlkTmplGenerator(policy *Policy, params *chaincfg.Params,\n\ttxSource TxSource, chain *blockchain.BlockChain,\n\ttimeSource blockchain.MedianTimeSource,\n\tsigCache *txscript.SigCache,\n\thashCache *txscript.HashCache) *BlkTmplGenerator {\n\n\treturn &BlkTmplGenerator{\n\t\tpolicy:      policy,\n\t\tchainParams: params,\n\t\ttxSource:    txSource,\n\t\tchain:       chain,\n\t\ttimeSource:  timeSource,\n\t\tsigCache:    sigCache,\n\t\thashCache:   hashCache,\n\t}\n}\n\n// NewBlockTemplate returns a new block template that is ready to be solved\n// using the transactions from the passed transaction source pool and a coinbase\n// that either pays to the passed address if it is not nil, or a coinbase that\n// is redeemable by anyone if the passed address is nil.  The nil address\n// functionality is useful since there are cases such as the getblocktemplate\n// RPC where external mining software is responsible for creating their own\n// coinbase which will replace the one generated for the block template.  Thus\n// the need to have configured address can be avoided.\n//\n// The transactions selected and included are prioritized according to several\n// factors.  First, each transaction has a priority calculated based on its\n// value, age of inputs, and size.  Transactions which consist of larger\n// amounts, older inputs, and small sizes have the highest priority.  Second, a\n// fee per kilobyte is calculated for each transaction.  Transactions with a\n// higher fee per kilobyte are preferred.  Finally, the block generation related\n// policy settings are all taken into account.\n//\n// Transactions which only spend outputs from other transactions already in the\n// block chain are immediately added to a priority queue which either\n// prioritizes based on the priority (then fee per kilobyte) or the fee per\n// kilobyte (then priority) depending on whether or not the BlockPrioritySize\n// policy setting allots space for high-priority transactions.  Transactions\n// which spend outputs from other transactions in the source pool are added to a\n// dependency map so they can be added to the priority queue once the\n// transactions they depend on have been included.\n//\n// Once the high-priority area (if configured) has been filled with\n// transactions, or the priority falls below what is considered high-priority,\n// the priority queue is updated to prioritize by fees per kilobyte (then\n// priority).\n//\n// When the fees per kilobyte drop below the TxMinFreeFee policy setting, the\n// transaction will be skipped unless the BlockMinSize policy setting is\n// nonzero, in which case the block will be filled with the low-fee/free\n// transactions until the block size reaches that minimum size.\n//\n// Any transactions which would cause the block to exceed the BlockMaxSize\n// policy setting, exceed the maximum allowed signature operations per block, or\n// otherwise cause the block to be invalid are skipped.\n//\n// Given the above, a block generated by this function is of the following form:\n//\n//\t -----------------------------------  --  --\n//\t|      Coinbase Transaction         |   |   |\n//\t|-----------------------------------|   |   |\n//\t|                                   |   |   | ----- policy.BlockPrioritySize\n//\t|   High-priority Transactions      |   |   |\n//\t|                                   |   |   |\n//\t|-----------------------------------|   | --\n//\t|                                   |   |\n//\t|                                   |   |\n//\t|                                   |   |--- policy.BlockMaxSize\n//\t|  Transactions prioritized by fee  |   |\n//\t|  until <= policy.TxMinFreeFee     |   |\n//\t|                                   |   |\n//\t|                                   |   |\n//\t|                                   |   |\n//\t|-----------------------------------|   |\n//\t|  Low-fee/Non high-priority (free) |   |\n//\t|  transactions (while block size   |   |\n//\t|  <= policy.BlockMinSize)          |   |\n//\t -----------------------------------  --\nfunc (g *BlkTmplGenerator) NewBlockTemplate(payToAddress btcutil.Address) (*BlockTemplate, error) {\n\t// Extend the most recently known best block.\n\tbest := g.chain.BestSnapshot()\n\tnextBlockHeight := best.Height + 1\n\n\t// Create a standard coinbase transaction paying to the provided\n\t// address.  NOTE: The coinbase value will be updated to include the\n\t// fees from the selected transactions later after they have actually\n\t// been selected.  It is created here to detect any errors early\n\t// before potentially doing a lot of work below.  The extra nonce helps\n\t// ensure the transaction is not a duplicate transaction (paying the\n\t// same value to the same public key address would otherwise be an\n\t// identical transaction for block version 1).\n\textraNonce := uint64(0)\n\tcoinbaseScript, err := standardCoinbaseScript(nextBlockHeight, extraNonce)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcoinbaseTx, err := createCoinbaseTx(g.chainParams, coinbaseScript,\n\t\tnextBlockHeight, payToAddress)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcoinbaseSigOpCost := int64(blockchain.CountSigOps(coinbaseTx)) * blockchain.WitnessScaleFactor\n\n\t// Get the current source transactions and create a priority queue to\n\t// hold the transactions which are ready for inclusion into a block\n\t// along with some priority related and fee metadata.  Reserve the same\n\t// number of items that are available for the priority queue.  Also,\n\t// choose the initial sort order for the priority queue based on whether\n\t// or not there is an area allocated for high-priority transactions.\n\tsourceTxns := g.txSource.MiningDescs()\n\tsortedByFee := g.policy.BlockPrioritySize == 0\n\tpriorityQueue := newTxPriorityQueue(len(sourceTxns), sortedByFee)\n\n\t// Create a slice to hold the transactions to be included in the\n\t// generated block with reserved space.  Also create a utxo view to\n\t// house all of the input transactions so multiple lookups can be\n\t// avoided.\n\tblockTxns := make([]*btcutil.Tx, 0, len(sourceTxns))\n\tblockTxns = append(blockTxns, coinbaseTx)\n\tblockUtxos := blockchain.NewUtxoViewpoint()\n\n\t// dependers is used to track transactions which depend on another\n\t// transaction in the source pool.  This, in conjunction with the\n\t// dependsOn map kept with each dependent transaction helps quickly\n\t// determine which dependent transactions are now eligible for inclusion\n\t// in the block once each transaction has been included.\n\tdependers := make(map[chainhash.Hash]map[chainhash.Hash]*txPrioItem)\n\n\t// Create slices to hold the fees and number of signature operations\n\t// for each of the selected transactions and add an entry for the\n\t// coinbase.  This allows the code below to simply append details about\n\t// a transaction as it is selected for inclusion in the final block.\n\t// However, since the total fees aren't known yet, use a dummy value for\n\t// the coinbase fee which will be updated later.\n\ttxFees := make([]int64, 0, len(sourceTxns))\n\ttxSigOpCosts := make([]int64, 0, len(sourceTxns))\n\ttxFees = append(txFees, -1) // Updated once known\n\ttxSigOpCosts = append(txSigOpCosts, coinbaseSigOpCost)\n\n\tlog.Debugf(\"Considering %d transactions for inclusion to new block\",\n\t\tlen(sourceTxns))\n\nmempoolLoop:\n\tfor _, txDesc := range sourceTxns {\n\t\t// A block can't have more than one coinbase or contain\n\t\t// non-finalized transactions.\n\t\ttx := txDesc.Tx\n\t\tif blockchain.IsCoinBase(tx) {\n\t\t\tlog.Tracef(\"Skipping coinbase tx %s\", tx.Hash())\n\t\t\tcontinue\n\t\t}\n\t\tif !blockchain.IsFinalizedTransaction(tx, nextBlockHeight,\n\t\t\tg.timeSource.AdjustedTime()) {\n\n\t\t\tlog.Tracef(\"Skipping non-finalized tx %s\", tx.Hash())\n\t\t\tcontinue\n\t\t}\n\n\t\t// Fetch all of the utxos referenced by this transaction.\n\t\t// NOTE: This intentionally does not fetch inputs from the\n\t\t// mempool since a transaction which depends on other\n\t\t// transactions in the mempool must come after those\n\t\t// dependencies in the final generated block.\n\t\tutxos, err := g.chain.FetchUtxoView(tx)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Unable to fetch utxo view for tx %s: %v\",\n\t\t\t\ttx.Hash(), err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Setup dependencies for any transactions which reference\n\t\t// other transactions in the mempool so they can be properly\n\t\t// ordered below.\n\t\tprioItem := &txPrioItem{tx: tx}\n\t\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\t\toriginHash := &txIn.PreviousOutPoint.Hash\n\t\t\tentry := utxos.LookupEntry(txIn.PreviousOutPoint)\n\t\t\tif entry == nil || entry.IsSpent() {\n\t\t\t\tif !g.txSource.HaveTransaction(originHash) {\n\t\t\t\t\tlog.Tracef(\"Skipping tx %s because it \"+\n\t\t\t\t\t\t\"references unspent output %s \"+\n\t\t\t\t\t\t\"which is not available\",\n\t\t\t\t\t\ttx.Hash(), txIn.PreviousOutPoint)\n\t\t\t\t\tcontinue mempoolLoop\n\t\t\t\t}\n\n\t\t\t\t// The transaction is referencing another\n\t\t\t\t// transaction in the source pool, so setup an\n\t\t\t\t// ordering dependency.\n\t\t\t\tdeps, exists := dependers[*originHash]\n\t\t\t\tif !exists {\n\t\t\t\t\tdeps = make(map[chainhash.Hash]*txPrioItem)\n\t\t\t\t\tdependers[*originHash] = deps\n\t\t\t\t}\n\t\t\t\tdeps[*prioItem.tx.Hash()] = prioItem\n\t\t\t\tif prioItem.dependsOn == nil {\n\t\t\t\t\tprioItem.dependsOn = make(\n\t\t\t\t\t\tmap[chainhash.Hash]struct{})\n\t\t\t\t}\n\t\t\t\tprioItem.dependsOn[*originHash] = struct{}{}\n\n\t\t\t}\n\t\t}\n\n\t\t// Calculate the final transaction priority using the input\n\t\t// value age sum as well as the adjusted transaction size.  The\n\t\t// formula is: sum(inputValue * inputAge) / adjustedTxSize\n\t\tprioItem.priority = CalcPriority(tx.MsgTx(), utxos,\n\t\t\tnextBlockHeight)\n\n\t\t// Calculate the fee in Satoshi/kB.\n\t\tprioItem.feePerKB = txDesc.FeePerKB\n\t\tprioItem.fee = txDesc.Fee\n\n\t\t// Add the transaction to the priority queue to mark it ready\n\t\t// for inclusion in the block unless it has dependencies.\n\t\tif prioItem.dependsOn == nil {\n\t\t\theap.Push(priorityQueue, prioItem)\n\t\t}\n\n\t\t// Merge the referenced outputs from the input transactions to\n\t\t// this transaction into the block utxo view.  This allows the\n\t\t// code below to avoid a second lookup.\n\t\tmergeUtxoView(blockUtxos, utxos)\n\t}\n\n\tlog.Tracef(\"Priority queue len %d, dependers len %d\",\n\t\tpriorityQueue.Len(), len(dependers))\n\n\t// The starting block size is the size of the block header plus the max\n\t// possible transaction count size, plus the size of the coinbase\n\t// transaction.\n\tblockWeight := uint32((blockHeaderOverhead * blockchain.WitnessScaleFactor) +\n\t\tblockchain.GetTransactionWeight(coinbaseTx))\n\tblockSigOpCost := coinbaseSigOpCost\n\ttotalFees := int64(0)\n\n\t// Query the version bits state to see if segwit has been activated, if\n\t// so then this means that we'll include any transactions with witness\n\t// data in the mempool, and also add the witness commitment as an\n\t// OP_RETURN output in the coinbase transaction.\n\tsegwitState, err := g.chain.ThresholdState(chaincfg.DeploymentSegwit)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsegwitActive := segwitState == blockchain.ThresholdActive\n\n\twitnessIncluded := false\n\n\t// Choose which transactions make it into the block.\n\tfor priorityQueue.Len() > 0 {\n\t\t// Grab the highest priority (or highest fee per kilobyte\n\t\t// depending on the sort order) transaction.\n\t\tprioItem := heap.Pop(priorityQueue).(*txPrioItem)\n\t\ttx := prioItem.tx\n\n\t\tswitch {\n\t\t// If segregated witness has not been activated yet, then we\n\t\t// shouldn't include any witness transactions in the block.\n\t\tcase !segwitActive && tx.HasWitness():\n\t\t\tcontinue\n\n\t\t// Otherwise, Keep track of if we've included a transaction\n\t\t// with witness data or not. If so, then we'll need to include\n\t\t// the witness commitment as the last output in the coinbase\n\t\t// transaction.\n\t\tcase segwitActive && !witnessIncluded && tx.HasWitness():\n\t\t\t// If we're about to include a transaction bearing\n\t\t\t// witness data, then we'll also need to include a\n\t\t\t// witness commitment in the coinbase transaction.\n\t\t\t// Therefore, we account for the additional weight\n\t\t\t// within the block with a model coinbase tx with a\n\t\t\t// witness commitment.\n\t\t\tcoinbaseCopy := btcutil.NewTx(coinbaseTx.MsgTx().Copy())\n\t\t\tcoinbaseCopy.MsgTx().TxIn[0].Witness = [][]byte{\n\t\t\t\tbytes.Repeat([]byte(\"a\"),\n\t\t\t\t\tblockchain.CoinbaseWitnessDataLen),\n\t\t\t}\n\t\t\tcoinbaseCopy.MsgTx().AddTxOut(&wire.TxOut{\n\t\t\t\tPkScript: bytes.Repeat([]byte(\"a\"),\n\t\t\t\t\tblockchain.CoinbaseWitnessPkScriptLength),\n\t\t\t})\n\n\t\t\t// In order to accurately account for the weight\n\t\t\t// addition due to this coinbase transaction, we'll add\n\t\t\t// the difference of the transaction before and after\n\t\t\t// the addition of the commitment to the block weight.\n\t\t\tweightDiff := blockchain.GetTransactionWeight(coinbaseCopy) -\n\t\t\t\tblockchain.GetTransactionWeight(coinbaseTx)\n\n\t\t\tblockWeight += uint32(weightDiff)\n\n\t\t\twitnessIncluded = true\n\t\t}\n\n\t\t// Grab any transactions which depend on this one.\n\t\tdeps := dependers[*tx.Hash()]\n\n\t\t// Enforce maximum block size.  Also check for overflow.\n\t\ttxWeight := uint32(blockchain.GetTransactionWeight(tx))\n\t\tblockPlusTxWeight := blockWeight + txWeight\n\t\tif blockPlusTxWeight < blockWeight ||\n\t\t\tblockPlusTxWeight >= g.policy.BlockMaxWeight {\n\n\t\t\tlog.Tracef(\"Skipping tx %s because it would exceed \"+\n\t\t\t\t\"the max block weight\", tx.Hash())\n\t\t\tlogSkippedDeps(tx, deps)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Enforce maximum signature operation cost per block.  Also\n\t\t// check for overflow.\n\t\tsigOpCost, err := blockchain.GetSigOpCost(tx, false,\n\t\t\tblockUtxos, true, segwitActive)\n\t\tif err != nil {\n\t\t\tlog.Tracef(\"Skipping tx %s due to error in \"+\n\t\t\t\t\"GetSigOpCost: %v\", tx.Hash(), err)\n\t\t\tlogSkippedDeps(tx, deps)\n\t\t\tcontinue\n\t\t}\n\t\tif blockSigOpCost+int64(sigOpCost) < blockSigOpCost ||\n\t\t\tblockSigOpCost+int64(sigOpCost) > blockchain.MaxBlockSigOpsCost {\n\t\t\tlog.Tracef(\"Skipping tx %s because it would \"+\n\t\t\t\t\"exceed the maximum sigops per block\", tx.Hash())\n\t\t\tlogSkippedDeps(tx, deps)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Skip free transactions once the block is larger than the\n\t\t// minimum block size.\n\t\tif sortedByFee &&\n\t\t\tprioItem.feePerKB < int64(g.policy.TxMinFreeFee) &&\n\t\t\tblockPlusTxWeight >= g.policy.BlockMinWeight {\n\n\t\t\tlog.Tracef(\"Skipping tx %s with feePerKB %d \"+\n\t\t\t\t\"< TxMinFreeFee %d and block weight %d >= \"+\n\t\t\t\t\"minBlockWeight %d\", tx.Hash(), prioItem.feePerKB,\n\t\t\t\tg.policy.TxMinFreeFee, blockPlusTxWeight,\n\t\t\t\tg.policy.BlockMinWeight)\n\t\t\tlogSkippedDeps(tx, deps)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Prioritize by fee per kilobyte once the block is larger than\n\t\t// the priority size or there are no more high-priority\n\t\t// transactions.\n\t\tif !sortedByFee && (blockPlusTxWeight >= g.policy.BlockPrioritySize ||\n\t\t\tprioItem.priority <= MinHighPriority) {\n\n\t\t\tlog.Tracef(\"Switching to sort by fees per \"+\n\t\t\t\t\"kilobyte blockSize %d >= BlockPrioritySize \"+\n\t\t\t\t\"%d || priority %.2f <= minHighPriority %.2f\",\n\t\t\t\tblockPlusTxWeight, g.policy.BlockPrioritySize,\n\t\t\t\tprioItem.priority, MinHighPriority)\n\n\t\t\tsortedByFee = true\n\t\t\tpriorityQueue.SetLessFunc(txPQByFee)\n\n\t\t\t// Put the transaction back into the priority queue and\n\t\t\t// skip it so it is re-priortized by fees if it won't\n\t\t\t// fit into the high-priority section or the priority\n\t\t\t// is too low.  Otherwise this transaction will be the\n\t\t\t// final one in the high-priority section, so just fall\n\t\t\t// though to the code below so it is added now.\n\t\t\tif blockPlusTxWeight > g.policy.BlockPrioritySize ||\n\t\t\t\tprioItem.priority < MinHighPriority {\n\n\t\t\t\theap.Push(priorityQueue, prioItem)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the transaction inputs pass all of the necessary\n\t\t// preconditions before allowing it to be added to the block.\n\t\t_, err = blockchain.CheckTransactionInputs(tx, nextBlockHeight,\n\t\t\tblockUtxos, g.chainParams)\n\t\tif err != nil {\n\t\t\tlog.Tracef(\"Skipping tx %s due to error in \"+\n\t\t\t\t\"CheckTransactionInputs: %v\", tx.Hash(), err)\n\t\t\tlogSkippedDeps(tx, deps)\n\t\t\tcontinue\n\t\t}\n\t\terr = blockchain.ValidateTransactionScripts(tx, blockUtxos,\n\t\t\ttxscript.StandardVerifyFlags, g.sigCache,\n\t\t\tg.hashCache)\n\t\tif err != nil {\n\t\t\tlog.Tracef(\"Skipping tx %s due to error in \"+\n\t\t\t\t\"ValidateTransactionScripts: %v\", tx.Hash(), err)\n\t\t\tlogSkippedDeps(tx, deps)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Spend the transaction inputs in the block utxo view and add\n\t\t// an entry for it to ensure any transactions which reference\n\t\t// this one have it available as an input and can ensure they\n\t\t// aren't double spending.\n\t\tspendTransaction(blockUtxos, tx, nextBlockHeight)\n\n\t\t// Add the transaction to the block, increment counters, and\n\t\t// save the fees and signature operation counts to the block\n\t\t// template.\n\t\tblockTxns = append(blockTxns, tx)\n\t\tblockWeight += txWeight\n\t\tblockSigOpCost += int64(sigOpCost)\n\t\ttotalFees += prioItem.fee\n\t\ttxFees = append(txFees, prioItem.fee)\n\t\ttxSigOpCosts = append(txSigOpCosts, int64(sigOpCost))\n\n\t\tlog.Tracef(\"Adding tx %s (priority %.2f, feePerKB %.2f)\",\n\t\t\tprioItem.tx.Hash(), prioItem.priority, prioItem.feePerKB)\n\n\t\t// Add transactions which depend on this one (and also do not\n\t\t// have any other unsatisified dependencies) to the priority\n\t\t// queue.\n\t\tfor _, item := range deps {\n\t\t\t// Add the transaction to the priority queue if there\n\t\t\t// are no more dependencies after this one.\n\t\t\tdelete(item.dependsOn, *tx.Hash())\n\t\t\tif len(item.dependsOn) == 0 {\n\t\t\t\theap.Push(priorityQueue, item)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Now that the actual transactions have been selected, update the\n\t// block weight for the real transaction count and coinbase value with\n\t// the total fees accordingly.\n\tblockWeight -= wire.MaxVarIntPayload -\n\t\t(uint32(wire.VarIntSerializeSize(uint64(len(blockTxns)))) *\n\t\t\tblockchain.WitnessScaleFactor)\n\tcoinbaseTx.MsgTx().TxOut[0].Value += totalFees\n\ttxFees[0] = -totalFees\n\n\t// If segwit is active and we included transactions with witness data,\n\t// then we'll need to include a commitment to the witness data in an\n\t// OP_RETURN output within the coinbase transaction.\n\tvar witnessCommitment []byte\n\tif witnessIncluded {\n\t\twitnessCommitment = AddWitnessCommitment(coinbaseTx, blockTxns)\n\t}\n\n\t// Calculate the required difficulty for the block.  The timestamp\n\t// is potentially adjusted to ensure it comes after the median time of\n\t// the last several blocks per the chain consensus rules.\n\tts := medianAdjustedTime(best, g.timeSource)\n\treqDifficulty, err := g.chain.CalcNextRequiredDifficulty(ts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Calculate the next expected block version based on the state of the\n\t// rule change deployments.\n\tnextBlockVersion, err := g.chain.CalcNextBlockVersion()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Create a new block ready to be solved.\n\tvar msgBlock wire.MsgBlock\n\tmsgBlock.Header = wire.BlockHeader{\n\t\tVersion:    nextBlockVersion,\n\t\tPrevBlock:  best.Hash,\n\t\tMerkleRoot: blockchain.CalcMerkleRoot(blockTxns, false),\n\t\tTimestamp:  ts,\n\t\tBits:       reqDifficulty,\n\t}\n\tfor _, tx := range blockTxns {\n\t\tif err := msgBlock.AddTransaction(tx.MsgTx()); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Finally, perform a full check on the created block against the chain\n\t// consensus rules to ensure it properly connects to the current best\n\t// chain with no issues.\n\tblock := btcutil.NewBlock(&msgBlock)\n\tblock.SetHeight(nextBlockHeight)\n\tif err := g.chain.CheckConnectBlockTemplate(block); err != nil {\n\t\treturn nil, err\n\t}\n\n\tlog.Debugf(\"Created new block template (%d transactions, %d in \"+\n\t\t\"fees, %d signature operations cost, %d weight, target difficulty \"+\n\t\t\"%064x)\", len(msgBlock.Transactions), totalFees, blockSigOpCost,\n\t\tblockWeight, blockchain.CompactToBig(msgBlock.Header.Bits))\n\n\treturn &BlockTemplate{\n\t\tBlock:             &msgBlock,\n\t\tFees:              txFees,\n\t\tSigOpCosts:        txSigOpCosts,\n\t\tHeight:            nextBlockHeight,\n\t\tValidPayAddress:   payToAddress != nil,\n\t\tWitnessCommitment: witnessCommitment,\n\t}, nil\n}\n\n// AddWitnessCommitment adds the witness commitment as an OP_RETURN output\n// within the coinbase tx.  The raw commitment is returned.\nfunc AddWitnessCommitment(coinbaseTx *btcutil.Tx,\n\tblockTxns []*btcutil.Tx) []byte {\n\n\t// The witness of the coinbase transaction MUST be exactly 32-bytes\n\t// of all zeroes.\n\tvar witnessNonce [blockchain.CoinbaseWitnessDataLen]byte\n\tcoinbaseTx.MsgTx().TxIn[0].Witness = wire.TxWitness{witnessNonce[:]}\n\n\t// Next, obtain the merkle root of a tree which consists of the\n\t// wtxid of all transactions in the block. The coinbase\n\t// transaction will have a special wtxid of all zeroes.\n\twitnessMerkleRoot := blockchain.CalcMerkleRoot(blockTxns, true)\n\n\t// The preimage to the witness commitment is:\n\t// witnessRoot || coinbaseWitness\n\tvar witnessPreimage [64]byte\n\tcopy(witnessPreimage[:32], witnessMerkleRoot[:])\n\tcopy(witnessPreimage[32:], witnessNonce[:])\n\n\t// The witness commitment itself is the double-sha256 of the\n\t// witness preimage generated above. With the commitment\n\t// generated, the witness script for the output is: OP_RETURN\n\t// OP_DATA_36 {0xaa21a9ed || witnessCommitment}. The leading\n\t// prefix is referred to as the \"witness magic bytes\".\n\twitnessCommitment := chainhash.DoubleHashB(witnessPreimage[:])\n\twitnessScript := append(blockchain.WitnessMagicBytes, witnessCommitment...)\n\n\t// Finally, create the OP_RETURN carrying witness commitment\n\t// output as an additional output within the coinbase.\n\tcommitmentOutput := &wire.TxOut{\n\t\tValue:    0,\n\t\tPkScript: witnessScript,\n\t}\n\tcoinbaseTx.MsgTx().TxOut = append(coinbaseTx.MsgTx().TxOut,\n\t\tcommitmentOutput)\n\n\treturn witnessCommitment\n}\n\n// UpdateBlockTime updates the timestamp in the header of the passed block to\n// the current time while taking into account the median time of the last\n// several blocks to ensure the new time is after that time per the chain\n// consensus rules.  Finally, it will update the target difficulty if needed\n// based on the new time for the test networks since their target difficulty can\n// change based upon time.\nfunc (g *BlkTmplGenerator) UpdateBlockTime(msgBlock *wire.MsgBlock) error {\n\t// The new timestamp is potentially adjusted to ensure it comes after\n\t// the median time of the last several blocks per the chain consensus\n\t// rules.\n\tnewTime := medianAdjustedTime(g.chain.BestSnapshot(), g.timeSource)\n\tmsgBlock.Header.Timestamp = newTime\n\n\t// Recalculate the difficulty if running on a network that requires it.\n\tif g.chainParams.ReduceMinDifficulty {\n\t\tdifficulty, err := g.chain.CalcNextRequiredDifficulty(newTime)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsgBlock.Header.Bits = difficulty\n\t}\n\n\treturn nil\n}\n\n// UpdateExtraNonce updates the extra nonce in the coinbase script of the passed\n// block by regenerating the coinbase script with the passed value and block\n// height.  It also recalculates and updates the new merkle root that results\n// from changing the coinbase script.\nfunc (g *BlkTmplGenerator) UpdateExtraNonce(msgBlock *wire.MsgBlock, blockHeight int32, extraNonce uint64) error {\n\tcoinbaseScript, err := standardCoinbaseScript(blockHeight, extraNonce)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(coinbaseScript) > blockchain.MaxCoinbaseScriptLen {\n\t\treturn fmt.Errorf(\"coinbase transaction script length \"+\n\t\t\t\"of %d is out of range (min: %d, max: %d)\",\n\t\t\tlen(coinbaseScript), blockchain.MinCoinbaseScriptLen,\n\t\t\tblockchain.MaxCoinbaseScriptLen)\n\t}\n\tmsgBlock.Transactions[0].TxIn[0].SignatureScript = coinbaseScript\n\n\t// TODO(davec): A btcutil.Block should use saved in the state to avoid\n\t// recalculating all of the other transaction hashes.\n\t// block.Transactions[0].InvalidateCache()\n\n\t// Recalculate the merkle root with the updated extra nonce.\n\tblock := btcutil.NewBlock(msgBlock)\n\tmerkleRoot := blockchain.CalcMerkleRoot(block.Transactions(), false)\n\tmsgBlock.Header.MerkleRoot = merkleRoot\n\treturn nil\n}\n\n// BestSnapshot returns information about the current best chain block and\n// related state as of the current point in time using the chain instance\n// associated with the block template generator.  The returned state must be\n// treated as immutable since it is shared by all callers.\n//\n// This function is safe for concurrent access.\nfunc (g *BlkTmplGenerator) BestSnapshot() *blockchain.BestState {\n\treturn g.chain.BestSnapshot()\n}\n\n// TxSource returns the associated transaction source.\n//\n// This function is safe for concurrent access.\nfunc (g *BlkTmplGenerator) TxSource() TxSource {\n\treturn g.txSource\n}\n"
  },
  {
    "path": "mining/mining_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mining\n\nimport (\n\t\"container/heap\"\n\t\"math/rand\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n)\n\n// TestTxFeePrioHeap ensures the priority queue for transaction fees and\n// priorities works as expected.\nfunc TestTxFeePrioHeap(t *testing.T) {\n\t// Create some fake priority items that exercise the expected sort\n\t// edge conditions.\n\ttestItems := []*txPrioItem{\n\t\t{feePerKB: 5678, priority: 3},\n\t\t{feePerKB: 5678, priority: 1},\n\t\t{feePerKB: 5678, priority: 1}, // Duplicate fee and prio\n\t\t{feePerKB: 5678, priority: 5},\n\t\t{feePerKB: 5678, priority: 2},\n\t\t{feePerKB: 1234, priority: 3},\n\t\t{feePerKB: 1234, priority: 1},\n\t\t{feePerKB: 1234, priority: 5},\n\t\t{feePerKB: 1234, priority: 5}, // Duplicate fee and prio\n\t\t{feePerKB: 1234, priority: 2},\n\t\t{feePerKB: 10000, priority: 0}, // Higher fee, smaller prio\n\t\t{feePerKB: 0, priority: 10000}, // Higher prio, lower fee\n\t}\n\n\t// Add random data in addition to the edge conditions already manually\n\t// specified.\n\trandSeed := rand.Int63()\n\tdefer func() {\n\t\tif t.Failed() {\n\t\t\tt.Logf(\"Random numbers using seed: %v\", randSeed)\n\t\t}\n\t}()\n\tprng := rand.New(rand.NewSource(randSeed))\n\tfor i := 0; i < 1000; i++ {\n\t\ttestItems = append(testItems, &txPrioItem{\n\t\t\tfeePerKB: int64(prng.Float64() * btcutil.SatoshiPerBitcoin),\n\t\t\tpriority: prng.Float64() * 100,\n\t\t})\n\t}\n\n\t// Test sorting by fee per KB then priority.\n\tvar highest *txPrioItem\n\tpriorityQueue := newTxPriorityQueue(len(testItems), true)\n\tfor i := 0; i < len(testItems); i++ {\n\t\tprioItem := testItems[i]\n\t\tif highest == nil {\n\t\t\thighest = prioItem\n\t\t}\n\t\tif prioItem.feePerKB >= highest.feePerKB &&\n\t\t\tprioItem.priority > highest.priority {\n\n\t\t\thighest = prioItem\n\t\t}\n\t\theap.Push(priorityQueue, prioItem)\n\t}\n\n\tfor i := 0; i < len(testItems); i++ {\n\t\tprioItem := heap.Pop(priorityQueue).(*txPrioItem)\n\t\tif prioItem.feePerKB >= highest.feePerKB &&\n\t\t\tprioItem.priority > highest.priority {\n\n\t\t\tt.Fatalf(\"fee sort: item (fee per KB: %v, \"+\n\t\t\t\t\"priority: %v) higher than than prev \"+\n\t\t\t\t\"(fee per KB: %v, priority %v)\",\n\t\t\t\tprioItem.feePerKB, prioItem.priority,\n\t\t\t\thighest.feePerKB, highest.priority)\n\t\t}\n\t\thighest = prioItem\n\t}\n\n\t// Test sorting by priority then fee per KB.\n\thighest = nil\n\tpriorityQueue = newTxPriorityQueue(len(testItems), false)\n\tfor i := 0; i < len(testItems); i++ {\n\t\tprioItem := testItems[i]\n\t\tif highest == nil {\n\t\t\thighest = prioItem\n\t\t}\n\t\tif prioItem.priority >= highest.priority &&\n\t\t\tprioItem.feePerKB > highest.feePerKB {\n\n\t\t\thighest = prioItem\n\t\t}\n\t\theap.Push(priorityQueue, prioItem)\n\t}\n\n\tfor i := 0; i < len(testItems); i++ {\n\t\tprioItem := heap.Pop(priorityQueue).(*txPrioItem)\n\t\tif prioItem.priority >= highest.priority &&\n\t\t\tprioItem.feePerKB > highest.feePerKB {\n\n\t\t\tt.Fatalf(\"priority sort: item (fee per KB: %v, \"+\n\t\t\t\t\"priority: %v) higher than than prev \"+\n\t\t\t\t\"(fee per KB: %v, priority %v)\",\n\t\t\t\tprioItem.feePerKB, prioItem.priority,\n\t\t\t\thighest.feePerKB, highest.priority)\n\t\t}\n\t\thighest = prioItem\n\t}\n}\n"
  },
  {
    "path": "mining/policy.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mining\n\nimport (\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// UnminedHeight is the height used for the \"block\" height field of the\n\t// contextual transaction information provided in a transaction store\n\t// when it has not yet been mined into a block.\n\tUnminedHeight = 0x7fffffff\n)\n\n// Policy houses the policy (configuration parameters) which is used to control\n// the generation of block templates.  See the documentation for\n// NewBlockTemplate for more details on each of these parameters are used.\ntype Policy struct {\n\t// BlockMinWeight is the minimum block weight to be used when\n\t// generating a block template.\n\tBlockMinWeight uint32\n\n\t// BlockMaxWeight is the maximum block weight to be used when\n\t// generating a block template.\n\tBlockMaxWeight uint32\n\n\t// BlockMinSize is the minimum block size to be used when generating\n\t// a block template.\n\tBlockMinSize uint32\n\n\t// BlockMaxSize is the maximum block size to be used when generating a\n\t// block template.\n\tBlockMaxSize uint32\n\n\t// BlockPrioritySize is the size in bytes for high-priority / low-fee\n\t// transactions to be used when generating a block template.\n\tBlockPrioritySize uint32\n\n\t// TxMinFreeFee is the minimum fee in Satoshi/1000 bytes that is\n\t// required for a transaction to be treated as free for mining purposes\n\t// (block template generation).\n\tTxMinFreeFee btcutil.Amount\n}\n\n// minInt is a helper function to return the minimum of two ints.  This avoids\n// a math import and the need to cast to floats.\nfunc minInt(a, b int) int {\n\tif a < b {\n\t\treturn a\n\t}\n\treturn b\n}\n\n// calcInputValueAge is a helper function used to calculate the input age of\n// a transaction.  The input age for a txin is the number of confirmations\n// since the referenced txout multiplied by its output value.  The total input\n// age is the sum of this value for each txin.  Any inputs to the transaction\n// which are currently in the mempool and hence not mined into a block yet,\n// contribute no additional input age to the transaction.\nfunc calcInputValueAge(tx *wire.MsgTx, utxoView *blockchain.UtxoViewpoint, nextBlockHeight int32) float64 {\n\tvar totalInputAge float64\n\tfor _, txIn := range tx.TxIn {\n\t\t// Don't attempt to accumulate the total input age if the\n\t\t// referenced transaction output doesn't exist.\n\t\tentry := utxoView.LookupEntry(txIn.PreviousOutPoint)\n\t\tif entry != nil && !entry.IsSpent() {\n\t\t\t// Inputs with dependencies currently in the mempool\n\t\t\t// have their block height set to a special constant.\n\t\t\t// Their input age should computed as zero since their\n\t\t\t// parent hasn't made it into a block yet.\n\t\t\tvar inputAge int32\n\t\t\toriginHeight := entry.BlockHeight()\n\t\t\tif originHeight == UnminedHeight {\n\t\t\t\tinputAge = 0\n\t\t\t} else {\n\t\t\t\tinputAge = nextBlockHeight - originHeight\n\t\t\t}\n\n\t\t\t// Sum the input value times age.\n\t\t\tinputValue := entry.Amount()\n\t\t\ttotalInputAge += float64(inputValue * int64(inputAge))\n\t\t}\n\t}\n\n\treturn totalInputAge\n}\n\n// CalcPriority returns a transaction priority given a transaction and the sum\n// of each of its input values multiplied by their age (# of confirmations).\n// Thus, the final formula for the priority is:\n// sum(inputValue * inputAge) / adjustedTxSize\nfunc CalcPriority(tx *wire.MsgTx, utxoView *blockchain.UtxoViewpoint, nextBlockHeight int32) float64 {\n\t// In order to encourage spending multiple old unspent transaction\n\t// outputs thereby reducing the total set, don't count the constant\n\t// overhead for each input as well as enough bytes of the signature\n\t// script to cover a pay-to-script-hash redemption with a compressed\n\t// pubkey.  This makes additional inputs free by boosting the priority\n\t// of the transaction accordingly.  No more incentive is given to avoid\n\t// encouraging gaming future transactions through the use of junk\n\t// outputs.  This is the same logic used in the reference\n\t// implementation.\n\t//\n\t// The constant overhead for a txin is 41 bytes since the previous\n\t// outpoint is 36 bytes + 4 bytes for the sequence + 1 byte the\n\t// signature script length.\n\t//\n\t// A compressed pubkey pay-to-script-hash redemption with a maximum len\n\t// signature is of the form:\n\t// [OP_DATA_73 <73-byte sig> + OP_DATA_35 + {OP_DATA_33\n\t// <33 byte compressed pubkey> + OP_CHECKSIG}]\n\t//\n\t// Thus 1 + 73 + 1 + 1 + 33 + 1 = 110\n\toverhead := 0\n\tfor _, txIn := range tx.TxIn {\n\t\t// Max inputs + size can't possibly overflow here.\n\t\toverhead += 41 + minInt(110, len(txIn.SignatureScript))\n\t}\n\n\tserializedTxSize := tx.SerializeSize()\n\tif overhead >= serializedTxSize {\n\t\treturn 0.0\n\t}\n\n\tinputValueAge := calcInputValueAge(tx, utxoView, nextBlockHeight)\n\treturn inputValueAge / float64(serializedTxSize-overhead)\n}\n"
  },
  {
    "path": "mining/policy_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage mining\n\nimport (\n\t\"encoding/hex\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// newHashFromStr converts the passed big-endian hex string into a\n// chainhash.Hash.  It only differs from the one available in chainhash in that\n// it panics on an error since it will only (and must only) be called with\n// hard-coded, and therefore known good, hashes.\nfunc newHashFromStr(hexStr string) *chainhash.Hash {\n\thash, err := chainhash.NewHashFromStr(hexStr)\n\tif err != nil {\n\t\tpanic(\"invalid hash in source file: \" + hexStr)\n\t}\n\treturn hash\n}\n\n// hexToBytes converts the passed hex string into bytes and will panic if there\n// is an error.  This is only provided for the hard-coded constants so errors in\n// the source code can be detected. It will only (and must only) be called with\n// hard-coded values.\nfunc hexToBytes(s string) []byte {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn b\n}\n\n// newUtxoViewpoint returns a new utxo view populated with outputs of the\n// provided source transactions as if there were available at the respective\n// block height specified in the heights slice.  The length of the source txns\n// and source tx heights must match or it will panic.\nfunc newUtxoViewpoint(sourceTxns []*wire.MsgTx, sourceTxHeights []int32) *blockchain.UtxoViewpoint {\n\tif len(sourceTxns) != len(sourceTxHeights) {\n\t\tpanic(\"each transaction must have its block height specified\")\n\t}\n\n\tview := blockchain.NewUtxoViewpoint()\n\tfor i, tx := range sourceTxns {\n\t\tview.AddTxOuts(btcutil.NewTx(tx), sourceTxHeights[i])\n\t}\n\treturn view\n}\n\n// TestCalcPriority ensures the priority calculations work as intended.\nfunc TestCalcPriority(t *testing.T) {\n\t// commonSourceTx1 is a valid transaction used in the tests below as an\n\t// input to transactions that are having their priority calculated.\n\t//\n\t// From block 7 in main blockchain.\n\t// tx 0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9\n\tcommonSourceTx1 := &wire.MsgTx{\n\t\tVersion: 1,\n\t\tTxIn: []*wire.TxIn{{\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\tIndex: wire.MaxPrevOutIndex,\n\t\t\t},\n\t\t\tSignatureScript: hexToBytes(\"04ffff001d0134\"),\n\t\t\tSequence:        0xffffffff,\n\t\t}},\n\t\tTxOut: []*wire.TxOut{{\n\t\t\tValue: 5000000000,\n\t\t\tPkScript: hexToBytes(\"410411db93e1dcdb8a016b49840f8c5\" +\n\t\t\t\t\"3bc1eb68a382e97b1482ecad7b148a6909a5cb2e0ead\" +\n\t\t\t\t\"dfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8\" +\n\t\t\t\t\"643f656b412a3ac\"),\n\t\t}},\n\t\tLockTime: 0,\n\t}\n\n\t// commonRedeemTx1 is a valid transaction used in the tests below as the\n\t// transaction to calculate the priority for.\n\t//\n\t// It originally came from block 170 in main blockchain.\n\tcommonRedeemTx1 := &wire.MsgTx{\n\t\tVersion: 1,\n\t\tTxIn: []*wire.TxIn{{\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash: *newHashFromStr(\"0437cd7f8525ceed232435\" +\n\t\t\t\t\t\"9c2d0ba26006d92d856a9c20fa0241106ee5\" +\n\t\t\t\t\t\"a597c9\"),\n\t\t\t\tIndex: 0,\n\t\t\t},\n\t\t\tSignatureScript: hexToBytes(\"47304402204e45e16932b8af\" +\n\t\t\t\t\"514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5f\" +\n\t\t\t\t\"b8cd410220181522ec8eca07de4860a4acdd12909d83\" +\n\t\t\t\t\"1cc56cbbac4622082221a8768d1d0901\"),\n\t\t\tSequence: 0xffffffff,\n\t\t}},\n\t\tTxOut: []*wire.TxOut{{\n\t\t\tValue: 1000000000,\n\t\t\tPkScript: hexToBytes(\"4104ae1a62fe09c5f51b13905f07f06\" +\n\t\t\t\t\"b99a2f7159b2225f374cd378d71302fa28414e7aab37\" +\n\t\t\t\t\"397f554a7df5f142c21c1b7303b8a0626f1baded5c72\" +\n\t\t\t\t\"a704f7e6cd84cac\"),\n\t\t}, {\n\t\t\tValue: 4000000000,\n\t\t\tPkScript: hexToBytes(\"410411db93e1dcdb8a016b49840f8c5\" +\n\t\t\t\t\"3bc1eb68a382e97b1482ecad7b148a6909a5cb2e0ead\" +\n\t\t\t\t\"dfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8\" +\n\t\t\t\t\"643f656b412a3ac\"),\n\t\t}},\n\t\tLockTime: 0,\n\t}\n\n\ttests := []struct {\n\t\tname       string                    // test description\n\t\ttx         *wire.MsgTx               // tx to calc priority for\n\t\tutxoView   *blockchain.UtxoViewpoint // inputs to tx\n\t\tnextHeight int32                     // height for priority calc\n\t\twant       float64                   // expected priority\n\t}{\n\t\t{\n\t\t\tname: \"one height 7 input, prio tx height 169\",\n\t\t\ttx:   commonRedeemTx1,\n\t\t\tutxoView: newUtxoViewpoint([]*wire.MsgTx{commonSourceTx1},\n\t\t\t\t[]int32{7}),\n\t\t\tnextHeight: 169,\n\t\t\twant:       5e9,\n\t\t},\n\t\t{\n\t\t\tname: \"one height 100 input, prio tx height 169\",\n\t\t\ttx:   commonRedeemTx1,\n\t\t\tutxoView: newUtxoViewpoint([]*wire.MsgTx{commonSourceTx1},\n\t\t\t\t[]int32{100}),\n\t\t\tnextHeight: 169,\n\t\t\twant:       2129629629.6296296,\n\t\t},\n\t\t{\n\t\t\tname: \"one height 7 input, prio tx height 100000\",\n\t\t\ttx:   commonRedeemTx1,\n\t\t\tutxoView: newUtxoViewpoint([]*wire.MsgTx{commonSourceTx1},\n\t\t\t\t[]int32{7}),\n\t\t\tnextHeight: 100000,\n\t\t\twant:       3086203703703.7036,\n\t\t},\n\t\t{\n\t\t\tname: \"one height 100 input, prio tx height 100000\",\n\t\t\ttx:   commonRedeemTx1,\n\t\t\tutxoView: newUtxoViewpoint([]*wire.MsgTx{commonSourceTx1},\n\t\t\t\t[]int32{100}),\n\t\t\tnextHeight: 100000,\n\t\t\twant:       3083333333333.3335,\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\tgot := CalcPriority(test.tx, test.utxoView, test.nextHeight)\n\t\tif got != test.want {\n\t\t\tt.Errorf(\"CalcPriority #%d (%q): unexpected priority \"+\n\t\t\t\t\"got %v want %v\", i, test.name, got, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "netsync/README.md",
    "content": "netsync\n=======\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/netsync)\n\n## Overview\n\nThis package implements a concurrency safe block syncing protocol. The\nSyncManager communicates with connected peers to perform an initial block\ndownload, keep the chain and unconfirmed transaction pool in sync, and announce\nnew blocks connected to the chain. Currently the sync manager selects a single\nsync peer that it downloads all blocks from until it is up to date with the\nlongest chain the sync peer is aware of.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/netsync\n```\n\n## License\n\nPackage netsync is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "netsync/blocklogger.go",
    "content": "// Copyright (c) 2015-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage netsync\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btclog\"\n)\n\n// blockProgressLogger provides periodic logging for other services in order\n// to show users progress of certain \"actions\" involving some or all current\n// blocks. Ex: syncing to best chain, indexing all blocks, etc.\ntype blockProgressLogger struct {\n\treceivedLogBlocks int64\n\treceivedLogTx     int64\n\tlastBlockLogTime  time.Time\n\n\tsubsystemLogger btclog.Logger\n\tprogressAction  string\n\tsync.Mutex\n}\n\n// newBlockProgressLogger returns a new block progress logger.\n// The progress message is templated as follows:\n//\n//\t{progressAction} {numProcessed} {blocks|block} in the last {timePeriod}\n//\t({numTxs}, height {lastBlockHeight}, {lastBlockTimeStamp})\nfunc newBlockProgressLogger(progressMessage string, logger btclog.Logger) *blockProgressLogger {\n\treturn &blockProgressLogger{\n\t\tlastBlockLogTime: time.Now(),\n\t\tprogressAction:   progressMessage,\n\t\tsubsystemLogger:  logger,\n\t}\n}\n\n// LogBlockHeight logs a new block height as an information message to show\n// progress to the user. In order to prevent spam, it limits logging to one\n// message every 10 seconds with duration and totals included.\nfunc (b *blockProgressLogger) LogBlockHeight(block *btcutil.Block, chain *blockchain.BlockChain) {\n\tb.Lock()\n\tdefer b.Unlock()\n\n\tb.receivedLogBlocks++\n\tb.receivedLogTx += int64(len(block.MsgBlock().Transactions))\n\n\tnow := time.Now()\n\tduration := now.Sub(b.lastBlockLogTime)\n\tif duration < time.Second*10 {\n\t\treturn\n\t}\n\n\t// Truncate the duration to 10s of milliseconds.\n\tdurationMillis := int64(duration / time.Millisecond)\n\ttDuration := 10 * time.Millisecond * time.Duration(durationMillis/10)\n\n\t// Log information about new block height.\n\tblockStr := \"blocks\"\n\tif b.receivedLogBlocks == 1 {\n\t\tblockStr = \"block\"\n\t}\n\ttxStr := \"transactions\"\n\tif b.receivedLogTx == 1 {\n\t\ttxStr = \"transaction\"\n\t}\n\tcacheSizeStr := fmt.Sprintf(\"~%d MiB\", chain.CachedStateSize()/1024/1024)\n\tb.subsystemLogger.Infof(\"%s %d %s in the last %s (%d %s, height %d, %s, %s cache)\",\n\t\tb.progressAction, b.receivedLogBlocks, blockStr, tDuration, b.receivedLogTx,\n\t\ttxStr, block.Height(), block.MsgBlock().Header.Timestamp, cacheSizeStr)\n\n\tb.receivedLogBlocks = 0\n\tb.receivedLogTx = 0\n\tb.lastBlockLogTime = now\n}\n\nfunc (b *blockProgressLogger) SetLastLogTime(time time.Time) {\n\tb.lastBlockLogTime = time\n}\n"
  },
  {
    "path": "netsync/doc.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage netsync implements a concurrency safe block syncing protocol. The\nSyncManager communicates with connected peers to perform an initial block\ndownload, keep the chain and unconfirmed transaction pool in sync, and announce\nnew blocks connected to the chain. Currently the sync manager selects a single\nsync peer that it downloads all blocks from until it is up to date with the\nlongest chain the sync peer is aware of.\n*/\npackage netsync\n"
  },
  {
    "path": "netsync/interface.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage netsync\n\nimport (\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/mempool\"\n\t\"github.com/btcsuite/btcd/peer\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// PeerNotifier exposes methods to notify peers of status changes to\n// transactions, blocks, etc. Currently server (in the main package) implements\n// this interface.\ntype PeerNotifier interface {\n\tAnnounceNewTransactions(newTxs []*mempool.TxDesc)\n\n\tUpdatePeerHeights(latestBlkHash *chainhash.Hash, latestHeight int32, updateSource *peer.Peer)\n\n\tRelayInventory(invVect *wire.InvVect, data interface{})\n\n\tTransactionConfirmed(tx *btcutil.Tx)\n}\n\n// Config is a configuration struct used to initialize a new SyncManager.\ntype Config struct {\n\tPeerNotifier PeerNotifier\n\tChain        *blockchain.BlockChain\n\tTxMemPool    *mempool.TxPool\n\tChainParams  *chaincfg.Params\n\n\tDisableCheckpoints bool\n\tMaxPeers           int\n\n\tFeeEstimator *mempool.FeeEstimator\n}\n"
  },
  {
    "path": "netsync/log.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage netsync\n\nimport \"github.com/btcsuite/btclog\"\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until either UseLogger or SetLogWriter are called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\n// This should be used in preference to SetLogWriter if the caller is also\n// using btclog.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n"
  },
  {
    "path": "netsync/manager.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage netsync\n\nimport (\n\t\"container/list\"\n\t\"math/rand\"\n\t\"net\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/mempool\"\n\tpeerpkg \"github.com/btcsuite/btcd/peer\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// minInFlightBlocks is the minimum number of blocks that should be\n\t// in the request queue for headers-first mode before requesting\n\t// more.\n\tminInFlightBlocks = 10\n\n\t// maxRejectedTxns is the maximum number of rejected transactions\n\t// hashes to store in memory.\n\tmaxRejectedTxns = 1000\n\n\t// maxRequestedBlocks is the maximum number of requested block\n\t// hashes to store in memory.\n\tmaxRequestedBlocks = wire.MaxInvPerMsg\n\n\t// maxRequestedTxns is the maximum number of requested transactions\n\t// hashes to store in memory.\n\tmaxRequestedTxns = wire.MaxInvPerMsg\n\n\t// maxStallDuration is the time after which we will disconnect our\n\t// current sync peer if we haven't made progress.\n\tmaxStallDuration = 3 * time.Minute\n\n\t// stallSampleInterval the interval at which we will check to see if our\n\t// sync has stalled.\n\tstallSampleInterval = 30 * time.Second\n)\n\n// zeroHash is the zero value hash (all zeros).  It is defined as a convenience.\nvar zeroHash chainhash.Hash\n\n// newPeerMsg signifies a newly connected peer to the block handler.\ntype newPeerMsg struct {\n\tpeer *peerpkg.Peer\n}\n\n// blockMsg packages a bitcoin block message and the peer it came from together\n// so the block handler has access to that information.\ntype blockMsg struct {\n\tblock *btcutil.Block\n\tpeer  *peerpkg.Peer\n\treply chan struct{}\n}\n\n// invMsg packages a bitcoin inv message and the peer it came from together\n// so the block handler has access to that information.\ntype invMsg struct {\n\tinv  *wire.MsgInv\n\tpeer *peerpkg.Peer\n}\n\n// headersMsg packages a bitcoin headers message and the peer it came from\n// together so the block handler has access to that information.\ntype headersMsg struct {\n\theaders *wire.MsgHeaders\n\tpeer    *peerpkg.Peer\n}\n\n// notFoundMsg packages a bitcoin notfound message and the peer it came from\n// together so the block handler has access to that information.\ntype notFoundMsg struct {\n\tnotFound *wire.MsgNotFound\n\tpeer     *peerpkg.Peer\n}\n\n// donePeerMsg signifies a newly disconnected peer to the block handler.\ntype donePeerMsg struct {\n\tpeer *peerpkg.Peer\n}\n\n// txMsg packages a bitcoin tx message and the peer it came from together\n// so the block handler has access to that information.\ntype txMsg struct {\n\ttx    *btcutil.Tx\n\tpeer  *peerpkg.Peer\n\treply chan struct{}\n}\n\n// getSyncPeerMsg is a message type to be sent across the message channel for\n// retrieving the current sync peer.\ntype getSyncPeerMsg struct {\n\treply chan int32\n}\n\n// processBlockResponse is a response sent to the reply channel of a\n// processBlockMsg.\ntype processBlockResponse struct {\n\tisOrphan bool\n\terr      error\n}\n\n// processBlockMsg is a message type to be sent across the message channel\n// for requested a block is processed.  Note this call differs from blockMsg\n// above in that blockMsg is intended for blocks that came from peers and have\n// extra handling whereas this message essentially is just a concurrent safe\n// way to call ProcessBlock on the internal block chain instance.\ntype processBlockMsg struct {\n\tblock *btcutil.Block\n\tflags blockchain.BehaviorFlags\n\treply chan processBlockResponse\n}\n\n// isCurrentMsg is a message type to be sent across the message channel for\n// requesting whether or not the sync manager believes it is synced with the\n// currently connected peers.\ntype isCurrentMsg struct {\n\treply chan bool\n}\n\n// pauseMsg is a message type to be sent across the message channel for\n// pausing the sync manager.  This effectively provides the caller with\n// exclusive access over the manager until a receive is performed on the\n// unpause channel.\ntype pauseMsg struct {\n\tunpause <-chan struct{}\n}\n\n// headerNode is used as a node in a list of headers that are linked together\n// between checkpoints.\ntype headerNode struct {\n\theight int32\n\thash   *chainhash.Hash\n}\n\n// peerSyncState stores additional information that the SyncManager tracks\n// about a peer.\ntype peerSyncState struct {\n\tsyncCandidate   bool\n\trequestQueue    []*wire.InvVect\n\trequestedTxns   map[chainhash.Hash]struct{}\n\trequestedBlocks map[chainhash.Hash]struct{}\n}\n\n// limitAdd is a helper function for maps that require a maximum limit by\n// evicting a random value if adding the new value would cause it to\n// overflow the maximum allowed.\nfunc limitAdd(m map[chainhash.Hash]struct{}, hash chainhash.Hash, limit int) {\n\tif len(m)+1 > limit {\n\t\t// Remove a random entry from the map.  For most compilers, Go's\n\t\t// range statement iterates starting at a random item although\n\t\t// that is not 100% guaranteed by the spec.  The iteration order\n\t\t// is not important here because an adversary would have to be\n\t\t// able to pull off preimage attacks on the hashing function in\n\t\t// order to target eviction of specific entries anyways.\n\t\tfor txHash := range m {\n\t\t\tdelete(m, txHash)\n\t\t\tbreak\n\t\t}\n\t}\n\tm[hash] = struct{}{}\n}\n\n// SyncManager is used to communicate block related messages with peers. The\n// SyncManager is started as by executing Start() in a goroutine. Once started,\n// it selects peers to sync from and starts the initial block download. Once the\n// chain is in sync, the SyncManager handles incoming block and header\n// notifications and relays announcements of new blocks to peers.\ntype SyncManager struct {\n\tpeerNotifier   PeerNotifier\n\tstarted        int32\n\tshutdown       int32\n\tchain          *blockchain.BlockChain\n\ttxMemPool      *mempool.TxPool\n\tchainParams    *chaincfg.Params\n\tprogressLogger *blockProgressLogger\n\tmsgChan        chan interface{}\n\twg             sync.WaitGroup\n\tquit           chan struct{}\n\n\t// These fields should only be accessed from the blockHandler thread\n\trejectedTxns     map[chainhash.Hash]struct{}\n\trequestedTxns    map[chainhash.Hash]struct{}\n\trequestedBlocks  map[chainhash.Hash]struct{}\n\tsyncPeer         *peerpkg.Peer\n\tpeerStates       map[*peerpkg.Peer]*peerSyncState\n\tlastProgressTime time.Time\n\n\t// The following fields are used for headers-first mode.\n\theadersFirstMode bool\n\theaderList       *list.List\n\tstartHeader      *list.Element\n\tnextCheckpoint   *chaincfg.Checkpoint\n\n\t// An optional fee estimator.\n\tfeeEstimator *mempool.FeeEstimator\n}\n\n// resetHeaderState sets the headers-first mode state to values appropriate for\n// syncing from a new peer.\nfunc (sm *SyncManager) resetHeaderState(newestHash *chainhash.Hash, newestHeight int32) {\n\tsm.headersFirstMode = false\n\tsm.headerList.Init()\n\tsm.startHeader = nil\n\n\t// When there is a next checkpoint, add an entry for the latest known\n\t// block into the header pool.  This allows the next downloaded header\n\t// to prove it links to the chain properly.\n\tif sm.nextCheckpoint != nil {\n\t\tnode := headerNode{height: newestHeight, hash: newestHash}\n\t\tsm.headerList.PushBack(&node)\n\t}\n}\n\n// findNextHeaderCheckpoint returns the next checkpoint after the passed height.\n// It returns nil when there is not one either because the height is already\n// later than the final checkpoint or some other reason such as disabled\n// checkpoints.\nfunc (sm *SyncManager) findNextHeaderCheckpoint(height int32) *chaincfg.Checkpoint {\n\tcheckpoints := sm.chain.Checkpoints()\n\tif len(checkpoints) == 0 {\n\t\treturn nil\n\t}\n\n\t// There is no next checkpoint if the height is already after the final\n\t// checkpoint.\n\tfinalCheckpoint := &checkpoints[len(checkpoints)-1]\n\tif height >= finalCheckpoint.Height {\n\t\treturn nil\n\t}\n\n\t// Find the next checkpoint.\n\tnextCheckpoint := finalCheckpoint\n\tfor i := len(checkpoints) - 2; i >= 0; i-- {\n\t\tif height >= checkpoints[i].Height {\n\t\t\tbreak\n\t\t}\n\t\tnextCheckpoint = &checkpoints[i]\n\t}\n\treturn nextCheckpoint\n}\n\n// startSync will choose the best peer among the available candidate peers to\n// download/sync the blockchain from.  When syncing is already running, it\n// simply returns.  It also examines the candidates for any which are no longer\n// candidates and removes them as needed.\nfunc (sm *SyncManager) startSync() {\n\t// Return now if we're already syncing.\n\tif sm.syncPeer != nil {\n\t\treturn\n\t}\n\n\t// Once the segwit soft-fork package has activated, we only\n\t// want to sync from peers which are witness enabled to ensure\n\t// that we fully validate all blockchain data.\n\tsegwitActive, err := sm.chain.IsDeploymentActive(chaincfg.DeploymentSegwit)\n\tif err != nil {\n\t\tlog.Errorf(\"Unable to query for segwit soft-fork state: %v\", err)\n\t\treturn\n\t}\n\n\tbest := sm.chain.BestSnapshot()\n\tvar higherPeers, equalPeers []*peerpkg.Peer\n\tfor peer, state := range sm.peerStates {\n\t\tif !state.syncCandidate {\n\t\t\tcontinue\n\t\t}\n\n\t\tif segwitActive && !peer.IsWitnessEnabled() {\n\t\t\tlog.Debugf(\"peer %v not witness enabled, skipping\", peer)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Remove sync candidate peers that are no longer candidates due\n\t\t// to passing their latest known block.  NOTE: The < is\n\t\t// intentional as opposed to <=.  While technically the peer\n\t\t// doesn't have a later block when it's equal, it will likely\n\t\t// have one soon so it is a reasonable choice.  It also allows\n\t\t// the case where both are at 0 such as during regression test.\n\t\tif peer.LastBlock() < best.Height {\n\t\t\tstate.syncCandidate = false\n\t\t\tcontinue\n\t\t}\n\n\t\t// If the peer is at the same height as us, we'll add it a set\n\t\t// of backup peers in case we do not find one with a higher\n\t\t// height. If we are synced up with all of our peers, all of\n\t\t// them will be in this set.\n\t\tif peer.LastBlock() == best.Height {\n\t\t\tequalPeers = append(equalPeers, peer)\n\t\t\tcontinue\n\t\t}\n\n\t\t// This peer has a height greater than our own, we'll consider\n\t\t// it in the set of better peers from which we'll randomly\n\t\t// select.\n\t\thigherPeers = append(higherPeers, peer)\n\t}\n\n\tif sm.chain.IsCurrent() && len(higherPeers) == 0 {\n\t\tlog.Infof(\"Caught up to block %s(%d)\", best.Hash.String(), best.Height)\n\t\treturn\n\t}\n\n\t// Pick randomly from the set of peers greater than our block height,\n\t// falling back to a random peer of the same height if none are greater.\n\t//\n\t// TODO(conner): Use a better algorithm to ranking peers based on\n\t// observed metrics and/or sync in parallel.\n\tvar bestPeer *peerpkg.Peer\n\tswitch {\n\tcase len(higherPeers) > 0:\n\t\tbestPeer = higherPeers[rand.Intn(len(higherPeers))]\n\n\tcase len(equalPeers) > 0:\n\t\tbestPeer = equalPeers[rand.Intn(len(equalPeers))]\n\t}\n\n\t// Start syncing from the best peer if one was selected.\n\tif bestPeer != nil {\n\t\t// Clear the requestedBlocks if the sync peer changes, otherwise\n\t\t// we may ignore blocks we need that the last sync peer failed\n\t\t// to send.\n\t\tsm.requestedBlocks = make(map[chainhash.Hash]struct{})\n\n\t\tlocator, err := sm.chain.LatestBlockLocator()\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to get block locator for the \"+\n\t\t\t\t\"latest block: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tlog.Infof(\"Syncing to block height %d from peer %v\",\n\t\t\tbestPeer.LastBlock(), bestPeer.Addr())\n\n\t\t// When the current height is less than a known checkpoint we\n\t\t// can use block headers to learn about which blocks comprise\n\t\t// the chain up to the checkpoint and perform less validation\n\t\t// for them.  This is possible since each header contains the\n\t\t// hash of the previous header and a merkle root.  Therefore if\n\t\t// we validate all of the received headers link together\n\t\t// properly and the checkpoint hashes match, we can be sure the\n\t\t// hashes for the blocks in between are accurate.  Further, once\n\t\t// the full blocks are downloaded, the merkle root is computed\n\t\t// and compared against the value in the header which proves the\n\t\t// full block hasn't been tampered with.\n\t\t//\n\t\t// Once we have passed the final checkpoint, or checkpoints are\n\t\t// disabled, use standard inv messages learn about the blocks\n\t\t// and fully validate them.  Finally, regression test mode does\n\t\t// not support the headers-first approach so do normal block\n\t\t// downloads when in regression test mode.\n\t\tif sm.nextCheckpoint != nil &&\n\t\t\tbest.Height < sm.nextCheckpoint.Height &&\n\t\t\tsm.chainParams != &chaincfg.RegressionNetParams {\n\n\t\t\tbestPeer.PushGetHeadersMsg(locator, sm.nextCheckpoint.Hash)\n\t\t\tsm.headersFirstMode = true\n\t\t\tlog.Infof(\"Downloading headers for blocks %d to \"+\n\t\t\t\t\"%d from peer %s\", best.Height+1,\n\t\t\t\tsm.nextCheckpoint.Height, bestPeer.Addr())\n\t\t} else {\n\t\t\tbestPeer.PushGetBlocksMsg(locator, &zeroHash)\n\t\t}\n\t\tsm.syncPeer = bestPeer\n\n\t\t// Reset the last progress time now that we have a non-nil\n\t\t// syncPeer to avoid instantly detecting it as stalled in the\n\t\t// event the progress time hasn't been updated recently.\n\t\tsm.lastProgressTime = time.Now()\n\t} else {\n\t\tlog.Warnf(\"No sync peer candidates available\")\n\t}\n}\n\n// isSyncCandidate returns whether or not the peer is a candidate to consider\n// syncing from.\nfunc (sm *SyncManager) isSyncCandidate(peer *peerpkg.Peer) bool {\n\t// Typically a peer is not a candidate for sync if it's not a full node,\n\t// however regression test is special in that the regression tool is\n\t// not a full node and still needs to be considered a sync candidate.\n\tif sm.chainParams == &chaincfg.RegressionNetParams {\n\t\t// The peer is not a candidate if it's not coming from localhost\n\t\t// or the hostname can't be determined for some reason.\n\t\thost, _, err := net.SplitHostPort(peer.Addr())\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\n\t\tif host != \"127.0.0.1\" && host != \"localhost\" {\n\t\t\treturn false\n\t\t}\n\n\t\t// Candidate if all checks passed.\n\t\treturn true\n\t}\n\n\t// If the segwit soft-fork package has activated, then the peer must\n\t// also be upgraded.\n\tsegwitActive, err := sm.chain.IsDeploymentActive(\n\t\tchaincfg.DeploymentSegwit,\n\t)\n\tif err != nil {\n\t\tlog.Errorf(\"Unable to query for segwit soft-fork state: %v\",\n\t\t\terr)\n\t}\n\n\tif segwitActive && !peer.IsWitnessEnabled() {\n\t\treturn false\n\t}\n\n\tvar (\n\t\tnodeServices = peer.Services()\n\t\tfullNode     = nodeServices.HasFlag(wire.SFNodeNetwork)\n\t\tprunedNode   = nodeServices.HasFlag(wire.SFNodeNetworkLimited)\n\t)\n\n\tswitch {\n\tcase fullNode:\n\t\t// Node is a sync candidate if it has all the blocks.\n\n\tcase prunedNode:\n\t\t// Even if the peer is pruned, if they have the node network\n\t\t// limited flag, they are able to serve 2 days worth of blocks\n\t\t// from the current tip. Therefore, check if our chaintip is\n\t\t// within that range.\n\t\tbestHeight := sm.chain.BestSnapshot().Height\n\t\tpeerLastBlock := peer.LastBlock()\n\n\t\t// bestHeight+1 as we need the peer to serve us the next block,\n\t\t// not the one we already have.\n\t\tif bestHeight+1 <=\n\t\t\tpeerLastBlock-wire.NodeNetworkLimitedBlockThreshold {\n\n\t\t\treturn false\n\t\t}\n\n\tdefault:\n\t\t// If the peer isn't an archival node, and it's not signaling\n\t\t// NODE_NETWORK_LIMITED, we can't sync off of this node.\n\t\treturn false\n\t}\n\n\t// Candidate if all checks passed.\n\treturn true\n}\n\n// handleNewPeerMsg deals with new peers that have signalled they may\n// be considered as a sync peer (they have already successfully negotiated).  It\n// also starts syncing if needed.  It is invoked from the syncHandler goroutine.\nfunc (sm *SyncManager) handleNewPeerMsg(peer *peerpkg.Peer) {\n\t// Ignore if in the process of shutting down.\n\tif atomic.LoadInt32(&sm.shutdown) != 0 {\n\t\treturn\n\t}\n\n\tlog.Infof(\"New valid peer %s (%s)\", peer, peer.UserAgent())\n\n\t// Initialize the peer state.\n\tisSyncCandidate := sm.isSyncCandidate(peer)\n\tsm.peerStates[peer] = &peerSyncState{\n\t\tsyncCandidate:   isSyncCandidate,\n\t\trequestedTxns:   make(map[chainhash.Hash]struct{}),\n\t\trequestedBlocks: make(map[chainhash.Hash]struct{}),\n\t}\n\n\t// Start syncing by choosing the best candidate if needed.\n\tif isSyncCandidate && sm.syncPeer == nil {\n\t\tsm.startSync()\n\t}\n}\n\n// handleStallSample will switch to a new sync peer if the current one has\n// stalled. This is detected when by comparing the last progress timestamp with\n// the current time, and disconnecting the peer if we stalled before reaching\n// their highest advertised block.\nfunc (sm *SyncManager) handleStallSample() {\n\tif atomic.LoadInt32(&sm.shutdown) != 0 {\n\t\treturn\n\t}\n\n\t// If we don't have an active sync peer, exit early.\n\tif sm.syncPeer == nil {\n\t\treturn\n\t}\n\n\t// If the stall timeout has not elapsed, exit early.\n\tif time.Since(sm.lastProgressTime) <= maxStallDuration {\n\t\treturn\n\t}\n\n\t// Check to see that the peer's sync state exists.\n\tstate, exists := sm.peerStates[sm.syncPeer]\n\tif !exists {\n\t\treturn\n\t}\n\n\tsm.clearRequestedState(state)\n\n\tdisconnectSyncPeer := sm.shouldDCStalledSyncPeer()\n\tsm.updateSyncPeer(disconnectSyncPeer)\n}\n\n// shouldDCStalledSyncPeer determines whether or not we should disconnect a\n// stalled sync peer. If the peer has stalled and its reported height is greater\n// than our own best height, we will disconnect it. Otherwise, we will keep the\n// peer connected in case we are already at tip.\nfunc (sm *SyncManager) shouldDCStalledSyncPeer() bool {\n\tlastBlock := sm.syncPeer.LastBlock()\n\tstartHeight := sm.syncPeer.StartingHeight()\n\n\tvar peerHeight int32\n\tif lastBlock > startHeight {\n\t\tpeerHeight = lastBlock\n\t} else {\n\t\tpeerHeight = startHeight\n\t}\n\n\t// If we've stalled out yet the sync peer reports having more blocks for\n\t// us we will disconnect them. This allows us at tip to not disconnect\n\t// peers when we are equal or they temporarily lag behind us.\n\tbest := sm.chain.BestSnapshot()\n\treturn peerHeight > best.Height\n}\n\n// handleDonePeerMsg deals with peers that have signalled they are done.  It\n// removes the peer as a candidate for syncing and in the case where it was\n// the current sync peer, attempts to select a new best peer to sync from.  It\n// is invoked from the syncHandler goroutine.\nfunc (sm *SyncManager) handleDonePeerMsg(peer *peerpkg.Peer) {\n\tstate, exists := sm.peerStates[peer]\n\tif !exists {\n\t\tlog.Warnf(\"Received done peer message for unknown peer %s\", peer)\n\t\treturn\n\t}\n\n\t// Remove the peer from the list of candidate peers.\n\tdelete(sm.peerStates, peer)\n\n\tlog.Infof(\"Lost peer %s\", peer)\n\n\tsm.clearRequestedState(state)\n\n\tif peer == sm.syncPeer {\n\t\t// Update the sync peer. The server has already disconnected the\n\t\t// peer before signaling to the sync manager.\n\t\tsm.updateSyncPeer(false)\n\t}\n}\n\n// clearRequestedState wipes all expected transactions and blocks from the sync\n// manager's requested maps that were requested under a peer's sync state, This\n// allows them to be rerequested by a subsequent sync peer.\nfunc (sm *SyncManager) clearRequestedState(state *peerSyncState) {\n\t// Remove requested transactions from the global map so that they will\n\t// be fetched from elsewhere next time we get an inv.\n\tfor txHash := range state.requestedTxns {\n\t\tdelete(sm.requestedTxns, txHash)\n\t}\n\n\t// Remove requested blocks from the global map so that they will be\n\t// fetched from elsewhere next time we get an inv.\n\t// TODO: we could possibly here check which peers have these blocks\n\t// and request them now to speed things up a little.\n\tfor blockHash := range state.requestedBlocks {\n\t\tdelete(sm.requestedBlocks, blockHash)\n\t}\n}\n\n// updateSyncPeer choose a new sync peer to replace the current one. If\n// dcSyncPeer is true, this method will also disconnect the current sync peer.\n// If we are in header first mode, any header state related to prefetching is\n// also reset in preparation for the next sync peer.\nfunc (sm *SyncManager) updateSyncPeer(dcSyncPeer bool) {\n\tlog.Debugf(\"Updating sync peer, no progress for: %v\",\n\t\ttime.Since(sm.lastProgressTime))\n\n\t// First, disconnect the current sync peer if requested.\n\tif dcSyncPeer {\n\t\tsm.syncPeer.Disconnect()\n\t}\n\n\t// Reset any header state before we choose our next active sync peer.\n\tif sm.headersFirstMode {\n\t\tbest := sm.chain.BestSnapshot()\n\t\tsm.resetHeaderState(&best.Hash, best.Height)\n\t}\n\n\tsm.syncPeer = nil\n\tsm.startSync()\n}\n\n// handleTxMsg handles transaction messages from all peers.\nfunc (sm *SyncManager) handleTxMsg(tmsg *txMsg) {\n\tpeer := tmsg.peer\n\tstate, exists := sm.peerStates[peer]\n\tif !exists {\n\t\tlog.Warnf(\"Received tx message from unknown peer %s\", peer)\n\t\treturn\n\t}\n\n\t// NOTE:  BitcoinJ, and possibly other wallets, don't follow the spec of\n\t// sending an inventory message and allowing the remote peer to decide\n\t// whether or not they want to request the transaction via a getdata\n\t// message.  Unfortunately, the reference implementation permits\n\t// unrequested data, so it has allowed wallets that don't follow the\n\t// spec to proliferate.  While this is not ideal, there is no check here\n\t// to disconnect peers for sending unsolicited transactions to provide\n\t// interoperability.\n\ttxHash := tmsg.tx.Hash()\n\n\t// Ignore transactions that we have already rejected.  Do not\n\t// send a reject message here because if the transaction was already\n\t// rejected, the transaction was unsolicited.\n\tif _, exists = sm.rejectedTxns[*txHash]; exists {\n\t\tlog.Debugf(\"Ignoring unsolicited previously rejected \"+\n\t\t\t\"transaction %v from %s\", txHash, peer)\n\t\treturn\n\t}\n\n\t// Process the transaction to include validation, insertion in the\n\t// memory pool, orphan handling, etc.\n\tacceptedTxs, err := sm.txMemPool.ProcessTransaction(tmsg.tx,\n\t\ttrue, true, mempool.Tag(peer.ID()))\n\n\t// Remove transaction from request maps. Either the mempool/chain\n\t// already knows about it and as such we shouldn't have any more\n\t// instances of trying to fetch it, or we failed to insert and thus\n\t// we'll retry next time we get an inv.\n\tdelete(state.requestedTxns, *txHash)\n\tdelete(sm.requestedTxns, *txHash)\n\n\tif err != nil {\n\t\t// Do not request this transaction again until a new block\n\t\t// has been processed.\n\t\tlimitAdd(sm.rejectedTxns, *txHash, maxRejectedTxns)\n\n\t\t// When the error is a rule error, it means the transaction was\n\t\t// simply rejected as opposed to something actually going wrong,\n\t\t// so log it as such.  Otherwise, something really did go wrong,\n\t\t// so log it as an actual error.\n\t\tif _, ok := err.(mempool.RuleError); ok {\n\t\t\tlog.Debugf(\"Rejected transaction %v from %s: %v\",\n\t\t\t\ttxHash, peer, err)\n\t\t} else {\n\t\t\tlog.Errorf(\"Failed to process transaction %v: %v\",\n\t\t\t\ttxHash, err)\n\t\t}\n\n\t\t// Convert the error into an appropriate reject message and\n\t\t// send it.\n\t\tcode, reason := mempool.ErrToRejectErr(err)\n\t\tpeer.PushRejectMsg(wire.CmdTx, code, reason, txHash, false)\n\t\treturn\n\t}\n\n\tsm.peerNotifier.AnnounceNewTransactions(acceptedTxs)\n}\n\n// current returns true if we believe we are synced with our peers, false if we\n// still have blocks to check\nfunc (sm *SyncManager) current() bool {\n\tif !sm.chain.IsCurrent() {\n\t\treturn false\n\t}\n\n\t// if blockChain thinks we are current and we have no syncPeer it\n\t// is probably right.\n\tif sm.syncPeer == nil {\n\t\treturn true\n\t}\n\n\t// No matter what chain thinks, if we are below the block we are syncing\n\t// to we are not current.\n\tif sm.chain.BestSnapshot().Height < sm.syncPeer.LastBlock() {\n\t\treturn false\n\t}\n\treturn true\n}\n\n// handleBlockMsg handles block messages from all peers.\nfunc (sm *SyncManager) handleBlockMsg(bmsg *blockMsg) {\n\tpeer := bmsg.peer\n\tstate, exists := sm.peerStates[peer]\n\tif !exists {\n\t\tlog.Warnf(\"Received block message from unknown peer %s\", peer)\n\t\treturn\n\t}\n\n\t// If we didn't ask for this block then the peer is misbehaving.\n\tblockHash := bmsg.block.Hash()\n\tif _, exists = state.requestedBlocks[*blockHash]; !exists {\n\t\t// The regression test intentionally sends some blocks twice\n\t\t// to test duplicate block insertion fails.  Don't disconnect\n\t\t// the peer or ignore the block when we're in regression test\n\t\t// mode in this case so the chain code is actually fed the\n\t\t// duplicate blocks.\n\t\tif sm.chainParams != &chaincfg.RegressionNetParams {\n\t\t\tlog.Warnf(\"Got unrequested block %v from %s -- \"+\n\t\t\t\t\"disconnecting\", blockHash, peer.Addr())\n\t\t\tpeer.Disconnect()\n\t\t\treturn\n\t\t}\n\t}\n\n\t// When in headers-first mode, if the block matches the hash of the\n\t// first header in the list of headers that are being fetched, it's\n\t// eligible for less validation since the headers have already been\n\t// verified to link together and are valid up to the next checkpoint.\n\t// Also, remove the list entry for all blocks except the checkpoint\n\t// since it is needed to verify the next round of headers links\n\t// properly.\n\tisCheckpointBlock := false\n\tbehaviorFlags := blockchain.BFNone\n\tif sm.headersFirstMode {\n\t\tfirstNodeEl := sm.headerList.Front()\n\t\tif firstNodeEl != nil {\n\t\t\tfirstNode := firstNodeEl.Value.(*headerNode)\n\t\t\tif blockHash.IsEqual(firstNode.hash) {\n\t\t\t\tbehaviorFlags |= blockchain.BFFastAdd\n\t\t\t\tif firstNode.hash.IsEqual(sm.nextCheckpoint.Hash) {\n\t\t\t\t\tisCheckpointBlock = true\n\t\t\t\t} else {\n\t\t\t\t\tsm.headerList.Remove(firstNodeEl)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove block from request maps. Either chain will know about it and\n\t// so we shouldn't have any more instances of trying to fetch it, or we\n\t// will fail the insert and thus we'll retry next time we get an inv.\n\tdelete(state.requestedBlocks, *blockHash)\n\tdelete(sm.requestedBlocks, *blockHash)\n\n\t// Process the block to include validation, best chain selection, orphan\n\t// handling, etc.\n\t_, isOrphan, err := sm.chain.ProcessBlock(bmsg.block, behaviorFlags)\n\tif err != nil {\n\t\t// When the error is a rule error, it means the block was simply\n\t\t// rejected as opposed to something actually going wrong, so log\n\t\t// it as such.  Otherwise, something really did go wrong, so log\n\t\t// it as an actual error.\n\t\tif _, ok := err.(blockchain.RuleError); ok {\n\t\t\tlog.Infof(\"Rejected block %v from %s: %v\", blockHash,\n\t\t\t\tpeer, err)\n\t\t} else {\n\t\t\tlog.Errorf(\"Failed to process block %v: %v\",\n\t\t\t\tblockHash, err)\n\t\t}\n\t\tif dbErr, ok := err.(database.Error); ok && dbErr.ErrorCode ==\n\t\t\tdatabase.ErrCorruption {\n\t\t\tpanic(dbErr)\n\t\t}\n\n\t\t// Convert the error into an appropriate reject message and\n\t\t// send it.\n\t\tcode, reason := mempool.ErrToRejectErr(err)\n\t\tpeer.PushRejectMsg(wire.CmdBlock, code, reason, blockHash, false)\n\t\treturn\n\t}\n\n\t// Meta-data about the new block this peer is reporting. We use this\n\t// below to update this peer's latest block height and the heights of\n\t// other peers based on their last announced block hash. This allows us\n\t// to dynamically update the block heights of peers, avoiding stale\n\t// heights when looking for a new sync peer. Upon acceptance of a block\n\t// or recognition of an orphan, we also use this information to update\n\t// the block heights over other peers who's invs may have been ignored\n\t// if we are actively syncing while the chain is not yet current or\n\t// who may have lost the lock announcement race.\n\tvar heightUpdate int32\n\tvar blkHashUpdate *chainhash.Hash\n\n\t// Request the parents for the orphan block from the peer that sent it.\n\tif isOrphan {\n\t\t// We've just received an orphan block from a peer. In order\n\t\t// to update the height of the peer, we try to extract the\n\t\t// block height from the scriptSig of the coinbase transaction.\n\t\t// Extraction is only attempted if the block's version is\n\t\t// high enough (ver 2+).\n\t\theader := &bmsg.block.MsgBlock().Header\n\t\tif blockchain.ShouldHaveSerializedBlockHeight(header) {\n\t\t\tcoinbaseTx := bmsg.block.Transactions()[0]\n\t\t\tcbHeight, err := blockchain.ExtractCoinbaseHeight(coinbaseTx)\n\t\t\tif err != nil {\n\t\t\t\tlog.Warnf(\"Unable to extract height from \"+\n\t\t\t\t\t\"coinbase tx: %v\", err)\n\t\t\t} else {\n\t\t\t\tlog.Debugf(\"Extracted height of %v from \"+\n\t\t\t\t\t\"orphan block\", cbHeight)\n\t\t\t\theightUpdate = cbHeight\n\t\t\t\tblkHashUpdate = blockHash\n\t\t\t}\n\t\t}\n\n\t\torphanRoot := sm.chain.GetOrphanRoot(blockHash)\n\t\tlocator, err := sm.chain.LatestBlockLocator()\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Failed to get block locator for the \"+\n\t\t\t\t\"latest block: %v\", err)\n\t\t} else {\n\t\t\tpeer.PushGetBlocksMsg(locator, orphanRoot)\n\t\t}\n\t} else {\n\t\tif peer == sm.syncPeer {\n\t\t\tsm.lastProgressTime = time.Now()\n\t\t}\n\n\t\t// When the block is not an orphan, log information about it and\n\t\t// update the chain state.\n\t\tsm.progressLogger.LogBlockHeight(bmsg.block, sm.chain)\n\n\t\t// Update this peer's latest block height, for future\n\t\t// potential sync node candidacy.\n\t\tbest := sm.chain.BestSnapshot()\n\t\theightUpdate = best.Height\n\t\tblkHashUpdate = &best.Hash\n\n\t\t// Clear the rejected transactions.\n\t\tsm.rejectedTxns = make(map[chainhash.Hash]struct{})\n\t}\n\n\t// Update the block height for this peer. But only send a message to\n\t// the server for updating peer heights if this is an orphan or our\n\t// chain is \"current\". This avoids sending a spammy amount of messages\n\t// if we're syncing the chain from scratch.\n\tif blkHashUpdate != nil && heightUpdate != 0 {\n\t\tpeer.UpdateLastBlockHeight(heightUpdate)\n\t\tif isOrphan || sm.current() {\n\t\t\tgo sm.peerNotifier.UpdatePeerHeights(blkHashUpdate, heightUpdate,\n\t\t\t\tpeer)\n\t\t}\n\t}\n\n\t// If we are not in headers first mode, it's a good time to periodically\n\t// flush the blockchain cache because we don't expect new blocks immediately.\n\t// After that, there is nothing more to do.\n\tif !sm.headersFirstMode {\n\t\tif err := sm.chain.FlushUtxoCache(blockchain.FlushPeriodic); err != nil {\n\t\t\tlog.Errorf(\"Error while flushing the blockchain cache: %v\", err)\n\t\t}\n\t\treturn\n\t}\n\n\t// This is headers-first mode, so if the block is not a checkpoint\n\t// request more blocks using the header list when the request queue is\n\t// getting short.\n\tif !isCheckpointBlock {\n\t\tif sm.startHeader != nil &&\n\t\t\tlen(state.requestedBlocks) < minInFlightBlocks {\n\t\t\tsm.fetchHeaderBlocks()\n\t\t}\n\t\treturn\n\t}\n\n\t// This is headers-first mode and the block is a checkpoint.  When\n\t// there is a next checkpoint, get the next round of headers by asking\n\t// for headers starting from the block after this one up to the next\n\t// checkpoint.\n\tprevHeight := sm.nextCheckpoint.Height\n\tprevHash := sm.nextCheckpoint.Hash\n\tsm.nextCheckpoint = sm.findNextHeaderCheckpoint(prevHeight)\n\tif sm.nextCheckpoint != nil {\n\t\tlocator := blockchain.BlockLocator([]*chainhash.Hash{prevHash})\n\t\terr := peer.PushGetHeadersMsg(locator, sm.nextCheckpoint.Hash)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Failed to send getheaders message to \"+\n\t\t\t\t\"peer %s: %v\", peer.Addr(), err)\n\t\t\treturn\n\t\t}\n\t\tlog.Infof(\"Downloading headers for blocks %d to %d from \"+\n\t\t\t\"peer %s\", prevHeight+1, sm.nextCheckpoint.Height,\n\t\t\tsm.syncPeer.Addr())\n\t\treturn\n\t}\n\n\t// This is headers-first mode, the block is a checkpoint, and there are\n\t// no more checkpoints, so switch to normal mode by requesting blocks\n\t// from the block after this one up to the end of the chain (zero hash).\n\tsm.headersFirstMode = false\n\tsm.headerList.Init()\n\tlog.Infof(\"Reached the final checkpoint -- switching to normal mode\")\n\tlocator := blockchain.BlockLocator([]*chainhash.Hash{blockHash})\n\terr = peer.PushGetBlocksMsg(locator, &zeroHash)\n\tif err != nil {\n\t\tlog.Warnf(\"Failed to send getblocks message to peer %s: %v\",\n\t\t\tpeer.Addr(), err)\n\t\treturn\n\t}\n}\n\n// fetchHeaderBlocks creates and sends a request to the syncPeer for the next\n// list of blocks to be downloaded based on the current list of headers.\nfunc (sm *SyncManager) fetchHeaderBlocks() {\n\t// Nothing to do if there is no start header.\n\tif sm.startHeader == nil {\n\t\tlog.Warnf(\"fetchHeaderBlocks called with no start header\")\n\t\treturn\n\t}\n\n\t// Build up a getdata request for the list of blocks the headers\n\t// describe.  The size hint will be limited to wire.MaxInvPerMsg by\n\t// the function, so no need to double check it here.\n\tgdmsg := wire.NewMsgGetDataSizeHint(uint(sm.headerList.Len()))\n\tnumRequested := 0\n\tfor e := sm.startHeader; e != nil; e = e.Next() {\n\t\tnode, ok := e.Value.(*headerNode)\n\t\tif !ok {\n\t\t\tlog.Warn(\"Header list node type is not a headerNode\")\n\t\t\tcontinue\n\t\t}\n\n\t\tiv := wire.NewInvVect(wire.InvTypeBlock, node.hash)\n\t\thaveInv, err := sm.haveInventory(iv)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Unexpected failure when checking for \"+\n\t\t\t\t\"existing inventory during header block \"+\n\t\t\t\t\"fetch: %v\", err)\n\t\t}\n\t\tif !haveInv {\n\t\t\tsyncPeerState := sm.peerStates[sm.syncPeer]\n\n\t\t\tsm.requestedBlocks[*node.hash] = struct{}{}\n\t\t\tsyncPeerState.requestedBlocks[*node.hash] = struct{}{}\n\n\t\t\t// If we're fetching from a witness enabled peer\n\t\t\t// post-fork, then ensure that we receive all the\n\t\t\t// witness data in the blocks.\n\t\t\tif sm.syncPeer.IsWitnessEnabled() {\n\t\t\t\tiv.Type = wire.InvTypeWitnessBlock\n\t\t\t}\n\n\t\t\tgdmsg.AddInvVect(iv)\n\t\t\tnumRequested++\n\t\t}\n\t\tsm.startHeader = e.Next()\n\t\tif numRequested >= wire.MaxInvPerMsg {\n\t\t\tbreak\n\t\t}\n\t}\n\tif len(gdmsg.InvList) > 0 {\n\t\tsm.syncPeer.QueueMessage(gdmsg, nil)\n\t}\n}\n\n// handleHeadersMsg handles block header messages from all peers.  Headers are\n// requested when performing a headers-first sync.\nfunc (sm *SyncManager) handleHeadersMsg(hmsg *headersMsg) {\n\tpeer := hmsg.peer\n\t_, exists := sm.peerStates[peer]\n\tif !exists {\n\t\tlog.Warnf(\"Received headers message from unknown peer %s\", peer)\n\t\treturn\n\t}\n\n\t// The remote peer is misbehaving if we didn't request headers.\n\tmsg := hmsg.headers\n\tnumHeaders := len(msg.Headers)\n\tif !sm.headersFirstMode {\n\t\tlog.Warnf(\"Got %d unrequested headers from %s -- \"+\n\t\t\t\"disconnecting\", numHeaders, peer.Addr())\n\t\tpeer.Disconnect()\n\t\treturn\n\t}\n\n\t// Nothing to do for an empty headers message.\n\tif numHeaders == 0 {\n\t\treturn\n\t}\n\n\t// Process all of the received headers ensuring each one connects to the\n\t// previous and that checkpoints match.\n\treceivedCheckpoint := false\n\tvar finalHash *chainhash.Hash\n\tfor _, blockHeader := range msg.Headers {\n\t\tblockHash := blockHeader.BlockHash()\n\t\tfinalHash = &blockHash\n\n\t\t// Ensure there is a previous header to compare against.\n\t\tprevNodeEl := sm.headerList.Back()\n\t\tif prevNodeEl == nil {\n\t\t\tlog.Warnf(\"Header list does not contain a previous\" +\n\t\t\t\t\"element as expected -- disconnecting peer\")\n\t\t\tpeer.Disconnect()\n\t\t\treturn\n\t\t}\n\n\t\t// Ensure the header properly connects to the previous one and\n\t\t// add it to the list of headers.\n\t\tnode := headerNode{hash: &blockHash}\n\t\tprevNode := prevNodeEl.Value.(*headerNode)\n\t\tif prevNode.hash.IsEqual(&blockHeader.PrevBlock) {\n\t\t\tnode.height = prevNode.height + 1\n\t\t\te := sm.headerList.PushBack(&node)\n\t\t\tif sm.startHeader == nil {\n\t\t\t\tsm.startHeader = e\n\t\t\t}\n\t\t} else {\n\t\t\tlog.Warnf(\"Received block header that does not \"+\n\t\t\t\t\"properly connect to the chain from peer %s \"+\n\t\t\t\t\"-- disconnecting\", peer.Addr())\n\t\t\tpeer.Disconnect()\n\t\t\treturn\n\t\t}\n\n\t\t// Verify the header at the next checkpoint height matches.\n\t\tif node.height == sm.nextCheckpoint.Height {\n\t\t\tif node.hash.IsEqual(sm.nextCheckpoint.Hash) {\n\t\t\t\treceivedCheckpoint = true\n\t\t\t\tlog.Infof(\"Verified downloaded block \"+\n\t\t\t\t\t\"header against checkpoint at height \"+\n\t\t\t\t\t\"%d/hash %s\", node.height, node.hash)\n\t\t\t} else {\n\t\t\t\tlog.Warnf(\"Block header at height %d/hash \"+\n\t\t\t\t\t\"%s from peer %s does NOT match \"+\n\t\t\t\t\t\"expected checkpoint hash of %s -- \"+\n\t\t\t\t\t\"disconnecting\", node.height,\n\t\t\t\t\tnode.hash, peer.Addr(),\n\t\t\t\t\tsm.nextCheckpoint.Hash)\n\t\t\t\tpeer.Disconnect()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// When this header is a checkpoint, switch to fetching the blocks for\n\t// all of the headers since the last checkpoint.\n\tif receivedCheckpoint {\n\t\t// Since the first entry of the list is always the final block\n\t\t// that is already in the database and is only used to ensure\n\t\t// the next header links properly, it must be removed before\n\t\t// fetching the blocks.\n\t\tsm.headerList.Remove(sm.headerList.Front())\n\t\tlog.Infof(\"Received %v block headers: Fetching blocks\",\n\t\t\tsm.headerList.Len())\n\t\tsm.progressLogger.SetLastLogTime(time.Now())\n\t\tsm.fetchHeaderBlocks()\n\t\treturn\n\t}\n\n\t// This header is not a checkpoint, so request the next batch of\n\t// headers starting from the latest known header and ending with the\n\t// next checkpoint.\n\tlocator := blockchain.BlockLocator([]*chainhash.Hash{finalHash})\n\terr := peer.PushGetHeadersMsg(locator, sm.nextCheckpoint.Hash)\n\tif err != nil {\n\t\tlog.Warnf(\"Failed to send getheaders message to \"+\n\t\t\t\"peer %s: %v\", peer.Addr(), err)\n\t\treturn\n\t}\n}\n\n// handleNotFoundMsg handles notfound messages from all peers.\nfunc (sm *SyncManager) handleNotFoundMsg(nfmsg *notFoundMsg) {\n\tpeer := nfmsg.peer\n\tstate, exists := sm.peerStates[peer]\n\tif !exists {\n\t\tlog.Warnf(\"Received notfound message from unknown peer %s\", peer)\n\t\treturn\n\t}\n\tfor _, inv := range nfmsg.notFound.InvList {\n\t\t// verify the hash was actually announced by the peer\n\t\t// before deleting from the global requested maps.\n\t\tswitch inv.Type {\n\t\tcase wire.InvTypeWitnessBlock:\n\t\t\tfallthrough\n\t\tcase wire.InvTypeBlock:\n\t\t\tif _, exists := state.requestedBlocks[inv.Hash]; exists {\n\t\t\t\tdelete(state.requestedBlocks, inv.Hash)\n\t\t\t\tdelete(sm.requestedBlocks, inv.Hash)\n\t\t\t}\n\n\t\tcase wire.InvTypeWitnessTx:\n\t\t\tfallthrough\n\t\tcase wire.InvTypeTx:\n\t\t\tif _, exists := state.requestedTxns[inv.Hash]; exists {\n\t\t\t\tdelete(state.requestedTxns, inv.Hash)\n\t\t\t\tdelete(sm.requestedTxns, inv.Hash)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// haveInventory returns whether or not the inventory represented by the passed\n// inventory vector is known.  This includes checking all of the various places\n// inventory can be when it is in different states such as blocks that are part\n// of the main chain, on a side chain, in the orphan pool, and transactions that\n// are in the memory pool (either the main pool or orphan pool).\nfunc (sm *SyncManager) haveInventory(invVect *wire.InvVect) (bool, error) {\n\tswitch invVect.Type {\n\tcase wire.InvTypeWitnessBlock:\n\t\tfallthrough\n\tcase wire.InvTypeBlock:\n\t\t// Ask chain if the block is known to it in any form (main\n\t\t// chain, side chain, or orphan).\n\t\treturn sm.chain.HaveBlock(&invVect.Hash)\n\n\tcase wire.InvTypeWitnessTx:\n\t\tfallthrough\n\tcase wire.InvTypeTx:\n\t\t// Ask the transaction memory pool if the transaction is known\n\t\t// to it in any form (main pool or orphan).\n\t\tif sm.txMemPool.HaveTransaction(&invVect.Hash) {\n\t\t\treturn true, nil\n\t\t}\n\n\t\t// Check if the transaction exists from the point of view of the\n\t\t// end of the main chain.  Note that this is only a best effort\n\t\t// since it is expensive to check existence of every output and\n\t\t// the only purpose of this check is to avoid downloading\n\t\t// already known transactions.  Only the first two outputs are\n\t\t// checked because the vast majority of transactions consist of\n\t\t// two outputs where one is some form of \"pay-to-somebody-else\"\n\t\t// and the other is a change output.\n\t\tprevOut := wire.OutPoint{Hash: invVect.Hash}\n\t\tfor i := uint32(0); i < 2; i++ {\n\t\t\tprevOut.Index = i\n\t\t\tentry, err := sm.chain.FetchUtxoEntry(prevOut)\n\t\t\tif err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t\tif entry != nil && !entry.IsSpent() {\n\t\t\t\treturn true, nil\n\t\t\t}\n\t\t}\n\n\t\treturn false, nil\n\t}\n\n\t// The requested inventory is an unsupported type, so just claim\n\t// it is known to avoid requesting it.\n\treturn true, nil\n}\n\n// handleInvMsg handles inv messages from all peers.\n// We examine the inventory advertised by the remote peer and act accordingly.\nfunc (sm *SyncManager) handleInvMsg(imsg *invMsg) {\n\tpeer := imsg.peer\n\tstate, exists := sm.peerStates[peer]\n\tif !exists {\n\t\tlog.Warnf(\"Received inv message from unknown peer %s\", peer)\n\t\treturn\n\t}\n\n\t// Attempt to find the final block in the inventory list.  There may\n\t// not be one.\n\tlastBlock := -1\n\tinvVects := imsg.inv.InvList\n\tfor i := len(invVects) - 1; i >= 0; i-- {\n\t\tif invVects[i].Type == wire.InvTypeBlock {\n\t\t\tlastBlock = i\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// If this inv contains a block announcement, and this isn't coming from\n\t// our current sync peer or we're current, then update the last\n\t// announced block for this peer. We'll use this information later to\n\t// update the heights of peers based on blocks we've accepted that they\n\t// previously announced.\n\tif lastBlock != -1 && (peer != sm.syncPeer || sm.current()) {\n\t\tpeer.UpdateLastAnnouncedBlock(&invVects[lastBlock].Hash)\n\t}\n\n\t// Ignore invs from peers that aren't the sync if we are not current.\n\t// Helps prevent fetching a mass of orphans.\n\tif peer != sm.syncPeer && !sm.current() {\n\t\treturn\n\t}\n\n\t// If our chain is current and a peer announces a block we already\n\t// know of, then update their current block height.\n\tif lastBlock != -1 && sm.current() {\n\t\tblkHeight, err := sm.chain.BlockHeightByHash(&invVects[lastBlock].Hash)\n\t\tif err == nil {\n\t\t\tpeer.UpdateLastBlockHeight(blkHeight)\n\t\t}\n\t}\n\n\t// Request the advertised inventory if we don't already have it.  Also,\n\t// request parent blocks of orphans if we receive one we already have.\n\t// Finally, attempt to detect potential stalls due to long side chains\n\t// we already have and request more blocks to prevent them.\n\tfor i, iv := range invVects {\n\t\t// Ignore unsupported inventory types.\n\t\tswitch iv.Type {\n\t\tcase wire.InvTypeBlock:\n\t\tcase wire.InvTypeTx:\n\t\tcase wire.InvTypeWitnessBlock:\n\t\tcase wire.InvTypeWitnessTx:\n\t\tdefault:\n\t\t\tcontinue\n\t\t}\n\n\t\t// Add the inventory to the cache of known inventory\n\t\t// for the peer.\n\t\tpeer.AddKnownInventory(iv)\n\n\t\t// Ignore inventory when we're in headers-first mode.\n\t\tif sm.headersFirstMode {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Request the inventory if we don't already have it.\n\t\thaveInv, err := sm.haveInventory(iv)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Unexpected failure when checking for \"+\n\t\t\t\t\"existing inventory during inv message \"+\n\t\t\t\t\"processing: %v\", err)\n\t\t\tcontinue\n\t\t}\n\t\tif !haveInv {\n\t\t\tif iv.Type == wire.InvTypeTx {\n\t\t\t\t// Skip the transaction if it has already been\n\t\t\t\t// rejected.\n\t\t\t\tif _, exists := sm.rejectedTxns[iv.Hash]; exists {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ignore invs block invs from non-witness enabled\n\t\t\t// peers, as after segwit activation we only want to\n\t\t\t// download from peers that can provide us full witness\n\t\t\t// data for blocks.\n\t\t\tif !peer.IsWitnessEnabled() && iv.Type == wire.InvTypeBlock {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Add it to the request queue.\n\t\t\tstate.requestQueue = append(state.requestQueue, iv)\n\t\t\tcontinue\n\t\t}\n\n\t\tif iv.Type == wire.InvTypeBlock {\n\t\t\t// The block is an orphan block that we already have.\n\t\t\t// When the existing orphan was processed, it requested\n\t\t\t// the missing parent blocks.  When this scenario\n\t\t\t// happens, it means there were more blocks missing\n\t\t\t// than are allowed into a single inventory message.  As\n\t\t\t// a result, once this peer requested the final\n\t\t\t// advertised block, the remote peer noticed and is now\n\t\t\t// resending the orphan block as an available block\n\t\t\t// to signal there are more missing blocks that need to\n\t\t\t// be requested.\n\t\t\tif sm.chain.IsKnownOrphan(&iv.Hash) {\n\t\t\t\t// Request blocks starting at the latest known\n\t\t\t\t// up to the root of the orphan that just came\n\t\t\t\t// in.\n\t\t\t\torphanRoot := sm.chain.GetOrphanRoot(&iv.Hash)\n\t\t\t\tlocator, err := sm.chain.LatestBlockLocator()\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Errorf(\"PEER: Failed to get block \"+\n\t\t\t\t\t\t\"locator for the latest block: \"+\n\t\t\t\t\t\t\"%v\", err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tpeer.PushGetBlocksMsg(locator, orphanRoot)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// We already have the final block advertised by this\n\t\t\t// inventory message, so force a request for more.  This\n\t\t\t// should only happen if we're on a really long side\n\t\t\t// chain.\n\t\t\tif i == lastBlock {\n\t\t\t\t// Request blocks after this one up to the\n\t\t\t\t// final one the remote peer knows about (zero\n\t\t\t\t// stop hash).\n\t\t\t\tlocator := sm.chain.BlockLocatorFromHash(&iv.Hash)\n\t\t\t\tpeer.PushGetBlocksMsg(locator, &zeroHash)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Request as much as possible at once.  Anything that won't fit into\n\t// the request will be requested on the next inv message.\n\tnumRequested := 0\n\tgdmsg := wire.NewMsgGetData()\n\trequestQueue := state.requestQueue\n\tfor len(requestQueue) != 0 {\n\t\tiv := requestQueue[0]\n\t\trequestQueue[0] = nil\n\t\trequestQueue = requestQueue[1:]\n\n\t\tswitch iv.Type {\n\t\tcase wire.InvTypeWitnessBlock:\n\t\t\tfallthrough\n\t\tcase wire.InvTypeBlock:\n\t\t\t// Request the block if there is not already a pending\n\t\t\t// request.\n\t\t\tif _, exists := sm.requestedBlocks[iv.Hash]; !exists {\n\t\t\t\tlimitAdd(sm.requestedBlocks, iv.Hash, maxRequestedBlocks)\n\t\t\t\tlimitAdd(state.requestedBlocks, iv.Hash, maxRequestedBlocks)\n\n\t\t\t\tif peer.IsWitnessEnabled() {\n\t\t\t\t\tiv.Type = wire.InvTypeWitnessBlock\n\t\t\t\t}\n\n\t\t\t\tgdmsg.AddInvVect(iv)\n\t\t\t\tnumRequested++\n\t\t\t}\n\n\t\tcase wire.InvTypeWitnessTx:\n\t\t\tfallthrough\n\t\tcase wire.InvTypeTx:\n\t\t\t// Request the transaction if there is not already a\n\t\t\t// pending request.\n\t\t\tif _, exists := sm.requestedTxns[iv.Hash]; !exists {\n\t\t\t\tlimitAdd(sm.requestedTxns, iv.Hash, maxRequestedTxns)\n\t\t\t\tlimitAdd(state.requestedTxns, iv.Hash, maxRequestedTxns)\n\n\t\t\t\t// If the peer is capable, request the txn\n\t\t\t\t// including all witness data.\n\t\t\t\tif peer.IsWitnessEnabled() {\n\t\t\t\t\tiv.Type = wire.InvTypeWitnessTx\n\t\t\t\t}\n\n\t\t\t\tgdmsg.AddInvVect(iv)\n\t\t\t\tnumRequested++\n\t\t\t}\n\t\t}\n\n\t\tif numRequested >= wire.MaxInvPerMsg {\n\t\t\tbreak\n\t\t}\n\t}\n\tstate.requestQueue = requestQueue\n\tif len(gdmsg.InvList) > 0 {\n\t\tpeer.QueueMessage(gdmsg, nil)\n\t}\n}\n\n// blockHandler is the main handler for the sync manager.  It must be run as a\n// goroutine.  It processes block and inv messages in a separate goroutine\n// from the peer handlers so the block (MsgBlock) messages are handled by a\n// single thread without needing to lock memory data structures.  This is\n// important because the sync manager controls which blocks are needed and how\n// the fetching should proceed.\nfunc (sm *SyncManager) blockHandler() {\n\tstallTicker := time.NewTicker(stallSampleInterval)\n\tdefer stallTicker.Stop()\n\nout:\n\tfor {\n\t\tselect {\n\t\tcase m := <-sm.msgChan:\n\t\t\tswitch msg := m.(type) {\n\t\t\tcase *newPeerMsg:\n\t\t\t\tsm.handleNewPeerMsg(msg.peer)\n\n\t\t\tcase *txMsg:\n\t\t\t\tsm.handleTxMsg(msg)\n\t\t\t\tmsg.reply <- struct{}{}\n\n\t\t\tcase *blockMsg:\n\t\t\t\tsm.handleBlockMsg(msg)\n\t\t\t\tmsg.reply <- struct{}{}\n\n\t\t\tcase *invMsg:\n\t\t\t\tsm.handleInvMsg(msg)\n\n\t\t\tcase *headersMsg:\n\t\t\t\tsm.handleHeadersMsg(msg)\n\n\t\t\tcase *notFoundMsg:\n\t\t\t\tsm.handleNotFoundMsg(msg)\n\n\t\t\tcase *donePeerMsg:\n\t\t\t\tsm.handleDonePeerMsg(msg.peer)\n\n\t\t\tcase getSyncPeerMsg:\n\t\t\t\tvar peerID int32\n\t\t\t\tif sm.syncPeer != nil {\n\t\t\t\t\tpeerID = sm.syncPeer.ID()\n\t\t\t\t}\n\t\t\t\tmsg.reply <- peerID\n\n\t\t\tcase processBlockMsg:\n\t\t\t\t_, isOrphan, err := sm.chain.ProcessBlock(\n\t\t\t\t\tmsg.block, msg.flags)\n\t\t\t\tif err != nil {\n\t\t\t\t\tmsg.reply <- processBlockResponse{\n\t\t\t\t\t\tisOrphan: false,\n\t\t\t\t\t\terr:      err,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tmsg.reply <- processBlockResponse{\n\t\t\t\t\tisOrphan: isOrphan,\n\t\t\t\t\terr:      nil,\n\t\t\t\t}\n\n\t\t\tcase isCurrentMsg:\n\t\t\t\tmsg.reply <- sm.current()\n\n\t\t\tcase pauseMsg:\n\t\t\t\t// Wait until the sender unpauses the manager.\n\t\t\t\t<-msg.unpause\n\n\t\t\tdefault:\n\t\t\t\tlog.Warnf(\"Invalid message type in block \"+\n\t\t\t\t\t\"handler: %T\", msg)\n\t\t\t}\n\n\t\tcase <-stallTicker.C:\n\t\t\tsm.handleStallSample()\n\n\t\tcase <-sm.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\tlog.Debug(\"Block handler shutting down: flushing blockchain caches...\")\n\tif err := sm.chain.FlushUtxoCache(blockchain.FlushRequired); err != nil {\n\t\tlog.Errorf(\"Error while flushing blockchain caches: %v\", err)\n\t}\n\n\tsm.wg.Done()\n\tlog.Trace(\"Block handler done\")\n}\n\n// handleBlockchainNotification handles notifications from blockchain.  It does\n// things such as request orphan block parents and relay accepted blocks to\n// connected peers.\nfunc (sm *SyncManager) handleBlockchainNotification(notification *blockchain.Notification) {\n\tswitch notification.Type {\n\t// A block has been accepted into the block chain.  Relay it to other\n\t// peers.\n\tcase blockchain.NTBlockAccepted:\n\t\t// Don't relay if we are not current. Other peers that are\n\t\t// current should already know about it.\n\t\tif !sm.current() {\n\t\t\treturn\n\t\t}\n\n\t\tblock, ok := notification.Data.(*btcutil.Block)\n\t\tif !ok {\n\t\t\tlog.Warnf(\"Chain accepted notification is not a block.\")\n\t\t\tbreak\n\t\t}\n\n\t\t// Generate the inventory vector and relay it.\n\t\tiv := wire.NewInvVect(wire.InvTypeBlock, block.Hash())\n\t\tsm.peerNotifier.RelayInventory(iv, block.MsgBlock().Header)\n\n\t// A block has been connected to the main block chain.\n\tcase blockchain.NTBlockConnected:\n\t\t// Don't attempt to update the mempool if we're not current.\n\t\t// The mempool is empty and the fee estimator is useless unless\n\t\t// we're caught up.\n\t\tif !sm.current() {\n\t\t\treturn\n\t\t}\n\n\t\tblock, ok := notification.Data.(*btcutil.Block)\n\t\tif !ok {\n\t\t\tlog.Warnf(\"Chain connected notification is not a block.\")\n\t\t\tbreak\n\t\t}\n\n\t\t// Remove all of the transactions (except the coinbase) in the\n\t\t// connected block from the transaction pool.  Secondly, remove any\n\t\t// transactions which are now double spends as a result of these\n\t\t// new transactions.  Finally, remove any transaction that is\n\t\t// no longer an orphan. Transactions which depend on a confirmed\n\t\t// transaction are NOT removed recursively because they are still\n\t\t// valid.\n\t\tfor _, tx := range block.Transactions()[1:] {\n\t\t\tsm.txMemPool.RemoveTransaction(tx, false)\n\t\t\tsm.txMemPool.RemoveDoubleSpends(tx)\n\t\t\tsm.txMemPool.RemoveOrphan(tx)\n\t\t\tsm.peerNotifier.TransactionConfirmed(tx)\n\t\t\tacceptedTxs := sm.txMemPool.ProcessOrphans(tx)\n\t\t\tsm.peerNotifier.AnnounceNewTransactions(acceptedTxs)\n\t\t}\n\n\t\t// Register block with the fee estimator, if it exists.\n\t\tif sm.feeEstimator != nil {\n\t\t\terr := sm.feeEstimator.RegisterBlock(block)\n\n\t\t\t// If an error is somehow generated then the fee estimator\n\t\t\t// has entered an invalid state. Since it doesn't know how\n\t\t\t// to recover, create a new one.\n\t\t\tif err != nil {\n\t\t\t\tsm.feeEstimator = mempool.NewFeeEstimator(\n\t\t\t\t\tmempool.DefaultEstimateFeeMaxRollback,\n\t\t\t\t\tmempool.DefaultEstimateFeeMinRegisteredBlocks)\n\t\t\t}\n\t\t}\n\n\t// A block has been disconnected from the main block chain.\n\tcase blockchain.NTBlockDisconnected:\n\t\tblock, ok := notification.Data.(*btcutil.Block)\n\t\tif !ok {\n\t\t\tlog.Warnf(\"Chain disconnected notification is not a block.\")\n\t\t\tbreak\n\t\t}\n\n\t\t// Reinsert all of the transactions (except the coinbase) into\n\t\t// the transaction pool.\n\t\tfor _, tx := range block.Transactions()[1:] {\n\t\t\t_, _, err := sm.txMemPool.MaybeAcceptTransaction(tx,\n\t\t\t\tfalse, false)\n\t\t\tif err != nil {\n\t\t\t\t// Remove the transaction and all transactions\n\t\t\t\t// that depend on it if it wasn't accepted into\n\t\t\t\t// the transaction pool.\n\t\t\t\tsm.txMemPool.RemoveTransaction(tx, true)\n\t\t\t}\n\t\t}\n\n\t\t// Rollback previous block recorded by the fee estimator.\n\t\tif sm.feeEstimator != nil {\n\t\t\tsm.feeEstimator.Rollback(block.Hash())\n\t\t}\n\t}\n}\n\n// NewPeer informs the sync manager of a newly active peer.\nfunc (sm *SyncManager) NewPeer(peer *peerpkg.Peer) {\n\t// Ignore if we are shutting down.\n\tif atomic.LoadInt32(&sm.shutdown) != 0 {\n\t\treturn\n\t}\n\tsm.msgChan <- &newPeerMsg{peer: peer}\n}\n\n// QueueTx adds the passed transaction message and peer to the block handling\n// queue. Responds to the done channel argument after the tx message is\n// processed.\nfunc (sm *SyncManager) QueueTx(tx *btcutil.Tx, peer *peerpkg.Peer, done chan struct{}) {\n\t// Don't accept more transactions if we're shutting down.\n\tif atomic.LoadInt32(&sm.shutdown) != 0 {\n\t\tdone <- struct{}{}\n\t\treturn\n\t}\n\n\tsm.msgChan <- &txMsg{tx: tx, peer: peer, reply: done}\n}\n\n// QueueBlock adds the passed block message and peer to the block handling\n// queue. Responds to the done channel argument after the block message is\n// processed.\nfunc (sm *SyncManager) QueueBlock(block *btcutil.Block, peer *peerpkg.Peer, done chan struct{}) {\n\t// Don't accept more blocks if we're shutting down.\n\tif atomic.LoadInt32(&sm.shutdown) != 0 {\n\t\tdone <- struct{}{}\n\t\treturn\n\t}\n\n\tsm.msgChan <- &blockMsg{block: block, peer: peer, reply: done}\n}\n\n// QueueInv adds the passed inv message and peer to the block handling queue.\nfunc (sm *SyncManager) QueueInv(inv *wire.MsgInv, peer *peerpkg.Peer) {\n\t// No channel handling here because peers do not need to block on inv\n\t// messages.\n\tif atomic.LoadInt32(&sm.shutdown) != 0 {\n\t\treturn\n\t}\n\n\tsm.msgChan <- &invMsg{inv: inv, peer: peer}\n}\n\n// QueueHeaders adds the passed headers message and peer to the block handling\n// queue.\nfunc (sm *SyncManager) QueueHeaders(headers *wire.MsgHeaders, peer *peerpkg.Peer) {\n\t// No channel handling here because peers do not need to block on\n\t// headers messages.\n\tif atomic.LoadInt32(&sm.shutdown) != 0 {\n\t\treturn\n\t}\n\n\tsm.msgChan <- &headersMsg{headers: headers, peer: peer}\n}\n\n// QueueNotFound adds the passed notfound message and peer to the block handling\n// queue.\nfunc (sm *SyncManager) QueueNotFound(notFound *wire.MsgNotFound, peer *peerpkg.Peer) {\n\t// No channel handling here because peers do not need to block on\n\t// reject messages.\n\tif atomic.LoadInt32(&sm.shutdown) != 0 {\n\t\treturn\n\t}\n\n\tsm.msgChan <- &notFoundMsg{notFound: notFound, peer: peer}\n}\n\n// DonePeer informs the blockmanager that a peer has disconnected.\nfunc (sm *SyncManager) DonePeer(peer *peerpkg.Peer) {\n\t// Ignore if we are shutting down.\n\tif atomic.LoadInt32(&sm.shutdown) != 0 {\n\t\treturn\n\t}\n\n\tsm.msgChan <- &donePeerMsg{peer: peer}\n}\n\n// Start begins the core block handler which processes block and inv messages.\nfunc (sm *SyncManager) Start() {\n\t// Already started?\n\tif atomic.AddInt32(&sm.started, 1) != 1 {\n\t\treturn\n\t}\n\n\tlog.Trace(\"Starting sync manager\")\n\tsm.wg.Add(1)\n\tgo sm.blockHandler()\n}\n\n// Stop gracefully shuts down the sync manager by stopping all asynchronous\n// handlers and waiting for them to finish.\nfunc (sm *SyncManager) Stop() error {\n\tif atomic.AddInt32(&sm.shutdown, 1) != 1 {\n\t\tlog.Warnf(\"Sync manager is already in the process of \" +\n\t\t\t\"shutting down\")\n\t\treturn nil\n\t}\n\n\tlog.Infof(\"Sync manager shutting down\")\n\tclose(sm.quit)\n\tsm.wg.Wait()\n\treturn nil\n}\n\n// SyncPeerID returns the ID of the current sync peer, or 0 if there is none.\nfunc (sm *SyncManager) SyncPeerID() int32 {\n\treply := make(chan int32)\n\tsm.msgChan <- getSyncPeerMsg{reply: reply}\n\treturn <-reply\n}\n\n// ProcessBlock makes use of ProcessBlock on an internal instance of a block\n// chain.\nfunc (sm *SyncManager) ProcessBlock(block *btcutil.Block, flags blockchain.BehaviorFlags) (bool, error) {\n\treply := make(chan processBlockResponse, 1)\n\tsm.msgChan <- processBlockMsg{block: block, flags: flags, reply: reply}\n\tresponse := <-reply\n\treturn response.isOrphan, response.err\n}\n\n// IsCurrent returns whether or not the sync manager believes it is synced with\n// the connected peers.\nfunc (sm *SyncManager) IsCurrent() bool {\n\treply := make(chan bool)\n\tsm.msgChan <- isCurrentMsg{reply: reply}\n\treturn <-reply\n}\n\n// Pause pauses the sync manager until the returned channel is closed.\n//\n// Note that while paused, all peer and block processing is halted.  The\n// message sender should avoid pausing the sync manager for long durations.\nfunc (sm *SyncManager) Pause() chan<- struct{} {\n\tc := make(chan struct{})\n\tsm.msgChan <- pauseMsg{c}\n\treturn c\n}\n\n// New constructs a new SyncManager. Use Start to begin processing asynchronous\n// block, tx, and inv updates.\nfunc New(config *Config) (*SyncManager, error) {\n\tsm := SyncManager{\n\t\tpeerNotifier:    config.PeerNotifier,\n\t\tchain:           config.Chain,\n\t\ttxMemPool:       config.TxMemPool,\n\t\tchainParams:     config.ChainParams,\n\t\trejectedTxns:    make(map[chainhash.Hash]struct{}),\n\t\trequestedTxns:   make(map[chainhash.Hash]struct{}),\n\t\trequestedBlocks: make(map[chainhash.Hash]struct{}),\n\t\tpeerStates:      make(map[*peerpkg.Peer]*peerSyncState),\n\t\tprogressLogger:  newBlockProgressLogger(\"Processed\", log),\n\t\tmsgChan:         make(chan interface{}, config.MaxPeers*3),\n\t\theaderList:      list.New(),\n\t\tquit:            make(chan struct{}),\n\t\tfeeEstimator:    config.FeeEstimator,\n\t}\n\n\tbest := sm.chain.BestSnapshot()\n\tif !config.DisableCheckpoints {\n\t\t// Initialize the next checkpoint based on the current height.\n\t\tsm.nextCheckpoint = sm.findNextHeaderCheckpoint(best.Height)\n\t\tif sm.nextCheckpoint != nil {\n\t\t\tsm.resetHeaderState(&best.Hash, best.Height)\n\t\t}\n\t} else {\n\t\tlog.Info(\"Checkpoints are disabled\")\n\t}\n\n\tsm.chain.Subscribe(sm.handleBlockchainNotification)\n\n\treturn &sm, nil\n}\n"
  },
  {
    "path": "ossec/ossec.go",
    "content": "//go:build !openbsd\n\npackage ossec\n\nfunc Unveil(path string, perms string) error {\n\treturn nil\n}\n\nfunc Pledge(promises, execpromises string) error {\n\treturn nil\n}\n\nfunc PledgePromises(promises string) error {\n\treturn nil\n}\n"
  },
  {
    "path": "ossec/ossec_openbsd.go",
    "content": "package ossec\n\nimport (\n\t\"golang.org/x/sys/unix\"\n)\n\nfunc Unveil(path string, perms string) error {\n\treturn unix.Unveil(path, perms)\n}\n\nfunc Pledge(promises, execpromises string) error {\n\treturn unix.Pledge(promises, execpromises)\n}\n\nfunc PledgePromises(promises string) error {\n\treturn unix.PledgePromises(promises)\n}\n"
  },
  {
    "path": "params.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// activeNetParams is a pointer to the parameters specific to the\n// currently active bitcoin network.\nvar activeNetParams = &mainNetParams\n\n// params is used to group parameters for various networks such as the main\n// network and test networks.\ntype params struct {\n\t*chaincfg.Params\n\trpcPort string\n}\n\n// mainNetParams contains parameters specific to the main network\n// (wire.MainNet).  NOTE: The RPC port is intentionally different from the\n// reference implementation because btcd does not handle wallet requests.  The\n// separate wallet process listens on the well-known port and forwards requests\n// it does not handle on to btcd.  This approach allows the wallet process\n// to emulate the full reference implementation RPC API.\nvar mainNetParams = params{\n\tParams:  &chaincfg.MainNetParams,\n\trpcPort: \"8334\",\n}\n\n// regressionNetParams contains parameters specific to the regression test\n// network (wire.TestNet).  NOTE: The RPC port is intentionally different\n// than the reference implementation - see the mainNetParams comment for\n// details.\nvar regressionNetParams = params{\n\tParams:  &chaincfg.RegressionNetParams,\n\trpcPort: \"18334\",\n}\n\n// testNet3Params contains parameters specific to the test network (version 3)\n// (wire.TestNet3).  NOTE: The RPC port is intentionally different from the\n// reference implementation - see the mainNetParams comment for details.\nvar testNet3Params = params{\n\tParams:  &chaincfg.TestNet3Params,\n\trpcPort: \"18334\",\n}\n\n// testNet4Params contains parameters specific to the test network (version 4)\n// (wire.TestNet4).  NOTE: The RPC port is intentionally different from the\n// reference implementation - see the mainNetParams comment for details.\nvar testNet4Params = params{\n\tParams:  &chaincfg.TestNet4Params,\n\trpcPort: \"48334\",\n}\n\n// simNetParams contains parameters specific to the simulation test network\n// (wire.SimNet).\nvar simNetParams = params{\n\tParams:  &chaincfg.SimNetParams,\n\trpcPort: \"18556\",\n}\n\n// sigNetParams contains parameters specific to the Signet network\n// (wire.SigNet).\nvar sigNetParams = params{\n\tParams:  &chaincfg.SigNetParams,\n\trpcPort: \"38332\",\n}\n\n// netName returns the name used when referring to a bitcoin network.  At the\n// time of writing, btcd currently places blocks for testnet version 3 in the\n// data and log directory \"testnet\", which does not match the Name field of the\n// chaincfg parameters.  This function can be used to override this directory\n// name as \"testnet\" when the passed active network matches wire.TestNet3.\n//\n// A proper upgrade to move the data and log directories for this network to\n// \"testnet3\" is planned for the future, at which point this function can be\n// removed and the network parameter's name used instead.\nfunc netName(chainParams *params) string {\n\tswitch chainParams.Net {\n\tcase wire.TestNet3:\n\t\treturn \"testnet\"\n\tdefault:\n\t\treturn chainParams.Name\n\t}\n}\n"
  },
  {
    "path": "peer/README.md",
    "content": "peer\n====\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/peer)\n\nPackage peer provides a common base for creating and managing bitcoin network\npeers.\n\nThis package has intentionally been designed so it can be used as a standalone\npackage for any projects needing a full featured bitcoin peer base to build on.\n\n## Overview\n\nThis package builds upon the wire package, which provides the fundamental\nprimitives necessary to speak the bitcoin wire protocol, in order to simplify\nthe process of creating fully functional peers.  In essence, it provides a\ncommon base for creating concurrent safe fully validating nodes, Simplified\nPayment Verification (SPV) nodes, proxies, etc.\n\nA quick overview of the major features peer provides are as follows:\n\n - Provides a basic concurrent safe bitcoin peer for handling bitcoin\n   communications via the peer-to-peer protocol\n - Full duplex reading and writing of bitcoin protocol messages\n - Automatic handling of the initial handshake process including protocol\n   version negotiation\n - Asynchronous message queueing of outbound messages with optional channel for\n   notification when the message is actually sent\n - Flexible peer configuration\n   - Caller is responsible for creating outgoing connections and listening for\n     incoming connections so they have flexibility to establish connections as\n     they see fit (proxies, etc)\n   - User agent name and version\n   - Bitcoin network\n   - Service support signalling (full nodes, bloom filters, etc)\n   - Maximum supported protocol version\n   - Ability to register callbacks for handling bitcoin protocol messages\n - Inventory message batching and send trickling with known inventory detection\n   and avoidance\n - Automatic periodic keep-alive pinging and pong responses\n - Random nonce generation and self connection detection\n - Proper handling of bloom filter related commands when the caller does not\n   specify the related flag to signal support\n   - Disconnects the peer when the protocol version is high enough\n   - Does not invoke the related callbacks for older protocol versions\n - Snapshottable peer statistics such as the total number of bytes read and\n   written, the remote address, user agent, and negotiated protocol version\n - Helper functions pushing addresses, getblocks, getheaders, and reject\n   messages\n   - These could all be sent manually via the standard message output function,\n     but the helpers provide additional nice functionality such as duplicate\n     filtering and address randomization\n - Ability to wait for shutdown/disconnect\n - Comprehensive test coverage\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/peer\n```\n\n## Examples\n\n* [New Outbound Peer Example](https://pkg.go.dev/github.com/btcsuite/btcd/peer#example-package--NewOutboundPeer)  \n  Demonstrates the basic process for initializing and creating an outbound peer.\n  Peers negotiate by exchanging version and verack messages.  For demonstration,\n  a simple handler for the version message is attached to the peer.\n\n## License\n\nPackage peer is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "peer/doc.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage peer provides a common base for creating and managing Bitcoin network\npeers.\n\n# Overview\n\nThis package builds upon the wire package, which provides the fundamental\nprimitives necessary to speak the bitcoin wire protocol, in order to simplify\nthe process of creating fully functional peers.  In essence, it provides a\ncommon base for creating concurrent safe fully validating nodes, Simplified\nPayment Verification (SPV) nodes, proxies, etc.\n\nA quick overview of the major features peer provides are as follows:\n\n  - Provides a basic concurrent safe bitcoin peer for handling bitcoin\n    communications via the peer-to-peer protocol\n  - Full duplex reading and writing of bitcoin protocol messages\n  - Automatic handling of the initial handshake process including protocol\n    version negotiation\n  - Asynchronous message queuing of outbound messages with optional channel for\n    notification when the message is actually sent\n  - Flexible peer configuration\n    1. Caller is responsible for creating outgoing connections and listening for\n    incoming connections so they have flexibility to establish connections as\n    they see fit (proxies, etc)\n    2. User agent name and version\n    3. Bitcoin network\n    4. Service support signalling (full nodes, bloom filters, etc)\n    5. Maximum supported protocol version\n    6. Ability to register callbacks for handling bitcoin protocol messages\n  - Inventory message batching and send trickling with known inventory detection\n    and avoidance\n  - Automatic periodic keep-alive pinging and pong responses\n  - Random nonce generation and self connection detection\n  - Proper handling of bloom filter related commands when the caller does not\n    specify the related flag to signal support\n    1. Disconnects the peer when the protocol version is high enough\n    2. Does not invoke the related callbacks for older protocol versions\n  - Snapshottable peer statistics such as the total number of bytes read and\n    written, the remote address, user agent, and negotiated protocol version\n  - Helper functions pushing addresses, getblocks, getheaders, and reject\n    messages\n    1. These could all be sent manually via the standard message output function,\n    but the helpers provide additional nice functionality such as duplicate\n    filtering and address randomization\n  - Ability to wait for shutdown/disconnect\n  - Comprehensive test coverage\n\n# Peer Configuration\n\nAll peer configuration is handled with the Config struct.  This allows the\ncaller to specify things such as the user agent name and version, the bitcoin\nnetwork to use, which services it supports, and callbacks to invoke when bitcoin\nmessages are received.  See the documentation for each field of the Config\nstruct for more details.\n\n# Inbound and Outbound Peers\n\nA peer can either be inbound or outbound.  The caller is responsible for\nestablishing the connection to remote peers and listening for incoming peers.\nThis provides high flexibility for things such as connecting via proxies, acting\nas a proxy, creating bridge peers, choosing whether to listen for inbound peers,\netc.\n\nNewOutboundPeer and NewInboundPeer functions must be followed by calling Connect\nwith a net.Conn instance to the peer.  This will start all async I/O goroutines\nand initiate the protocol negotiation process.  Once finished with the peer call\nDisconnect to disconnect from the peer and clean up all resources.\nWaitForDisconnect can be used to block until peer disconnection and resource\ncleanup has completed.\n\n# Callbacks\n\nIn order to do anything useful with a peer, it is necessary to react to bitcoin\nmessages.  This is accomplished by creating an instance of the MessageListeners\nstruct with the callbacks to be invoke specified and setting the Listeners field\nof the Config struct specified when creating a peer to it.\n\nFor convenience, a callback hook for all of the currently supported bitcoin\nmessages is exposed which receives the peer instance and the concrete message\ntype.  In addition, a hook for OnRead is provided so even custom messages types\nfor which this package does not directly provide a hook, as long as they\nimplement the wire.Message interface, can be used.  Finally, the OnWrite hook\nis provided, which in conjunction with OnRead, can be used to track server-wide\nbyte counts.\n\nIt is often useful to use closures which encapsulate state when specifying the\ncallback handlers.  This provides a clean method for accessing that state when\ncallbacks are invoked.\n\n# Queuing Messages and Inventory\n\nThe QueueMessage function provides the fundamental means to send messages to the\nremote peer.  As the name implies, this employs a non-blocking queue.  A done\nchannel which will be notified when the message is actually sent can optionally\nbe specified.  There are certain message types which are better sent using other\nfunctions which provide additional functionality.\n\nOf special interest are inventory messages.  Rather than manually sending MsgInv\nmessages via Queuemessage, the inventory vectors should be queued using the\nQueueInventory function.  It employs batching and trickling along with\nintelligent known remote peer inventory detection and avoidance through the use\nof a most-recently used algorithm.\n\n# Message Sending Helper Functions\n\nIn addition to the bare QueueMessage function previously described, the\nPushAddrMsg, PushGetBlocksMsg, PushGetHeadersMsg, and PushRejectMsg functions\nare provided as a convenience.  While it is of course possible to create and\nsend these message manually via QueueMessage, these helper functions provided\nadditional useful functionality that is typically desired.\n\nFor example, the PushAddrMsg function automatically limits the addresses to the\nmaximum number allowed by the message and randomizes the chosen addresses when\nthere are too many.  This allows the caller to simply provide a slice of known\naddresses, such as that returned by the addrmgr package, without having to worry\nabout the details.\n\nNext, the PushGetBlocksMsg and PushGetHeadersMsg functions will construct proper\nmessages using a block locator and ignore back to back duplicate requests.\n\nFinally, the PushRejectMsg function can be used to easily create and send an\nappropriate reject message based on the provided parameters as well as\noptionally provides a flag to cause it to block until the message is actually\nsent.\n\n# Peer Statistics\n\nA snapshot of the current peer statistics can be obtained with the StatsSnapshot\nfunction.  This includes statistics such as the total number of bytes read and\nwritten, the remote address, user agent, and negotiated protocol version.\n\n# Logging\n\nThis package provides extensive logging capabilities through the UseLogger\nfunction which allows a btclog.Logger to be specified.  For example, logging at\nthe debug level provides summaries of every message sent and received, and\nlogging at the trace level provides full dumps of parsed messages as well as the\nraw message bytes using a format similar to hexdump -C.\n\n# Bitcoin Improvement Proposals\n\nThis package supports all BIPS supported by the wire package.\n(https://pkg.go.dev/github.com/btcsuite/btcd/wire#hdr-Bitcoin_Improvement_Proposals)\n*/\npackage peer\n"
  },
  {
    "path": "peer/example_test.go",
    "content": "// Copyright (c) 2015-2018 The btcsuite developers\n// Copyright (c) 2016-2018 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage peer_test\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/peer\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// mockRemotePeer creates a basic inbound peer listening on the simnet port for\n// use with Example_peerConnection.  It does not return until the listener is\n// active.\nfunc mockRemotePeer() error {\n\t// Configure peer to act as a simnet node that offers no services.\n\tpeerCfg := &peer.Config{\n\t\tUserAgentName:    \"peer\",  // User agent name to advertise.\n\t\tUserAgentVersion: \"1.0.0\", // User agent version to advertise.\n\t\tChainParams:      &chaincfg.SimNetParams,\n\t\tTrickleInterval:  time.Second * 10,\n\t\tAllowSelfConns:   true,\n\t}\n\n\t// Accept connections on the simnet port.\n\tlistener, err := net.Listen(\"tcp\", \"127.0.0.1:18555\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tgo func() {\n\t\tconn, err := listener.Accept()\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Accept: error %v\\n\", err)\n\t\t\treturn\n\t\t}\n\n\t\t// Create and start the inbound peer.\n\t\tp := peer.NewInboundPeer(peerCfg)\n\t\tp.AssociateConnection(conn)\n\t}()\n\n\treturn nil\n}\n\n// This example demonstrates the basic process for initializing and creating an\n// outbound peer.  Peers negotiate by exchanging version and verack messages.\n// For demonstration, a simple handler for version message is attached to the\n// peer.\nfunc Example_newOutboundPeer() {\n\t// Ordinarily this will not be needed since the outbound peer will be\n\t// connecting to a remote peer, however, since this example is executed\n\t// and tested, a mock remote peer is needed to listen for the outbound\n\t// peer.\n\tif err := mockRemotePeer(); err != nil {\n\t\tfmt.Printf(\"mockRemotePeer: unexpected error %v\\n\", err)\n\t\treturn\n\t}\n\n\t// Create an outbound peer that is configured to act as a simnet node\n\t// that offers no services and has listeners for the version and verack\n\t// messages.  The verack listener is used here to signal the code below\n\t// when the handshake has been finished by signalling a channel.\n\tverack := make(chan struct{})\n\tpeerCfg := &peer.Config{\n\t\tUserAgentName:    \"peer\",  // User agent name to advertise.\n\t\tUserAgentVersion: \"1.0.0\", // User agent version to advertise.\n\t\tChainParams:      &chaincfg.SimNetParams,\n\t\tServices:         0,\n\t\tTrickleInterval:  time.Second * 10,\n\t\tListeners: peer.MessageListeners{\n\t\t\tOnVersion: func(p *peer.Peer, msg *wire.MsgVersion) *wire.MsgReject {\n\t\t\t\tfmt.Println(\"outbound: received version\")\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tOnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) {\n\t\t\t\tverack <- struct{}{}\n\t\t\t},\n\t\t},\n\t\tAllowSelfConns: true,\n\t}\n\tp, err := peer.NewOutboundPeer(peerCfg, \"127.0.0.1:18555\")\n\tif err != nil {\n\t\tfmt.Printf(\"NewOutboundPeer: error %v\\n\", err)\n\t\treturn\n\t}\n\n\t// Establish the connection to the peer address and mark it connected.\n\tconn, err := net.Dial(\"tcp\", p.Addr())\n\tif err != nil {\n\t\tfmt.Printf(\"net.Dial: error %v\\n\", err)\n\t\treturn\n\t}\n\tp.AssociateConnection(conn)\n\n\t// Wait for the verack message or timeout in case of failure.\n\tselect {\n\tcase <-verack:\n\tcase <-time.After(time.Second * 1):\n\t\tfmt.Printf(\"Example_peerConnection: verack timeout\")\n\t}\n\n\t// Disconnect the peer.\n\tp.Disconnect()\n\tp.WaitForDisconnect()\n\n\t// Output:\n\t// outbound: received version\n}\n"
  },
  {
    "path": "peer/log.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage peer\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/btcsuite/btclog\"\n)\n\nconst (\n\t// maxRejectReasonLen is the maximum length of a sanitized reject reason\n\t// that will be logged.\n\tmaxRejectReasonLen = 250\n)\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until UseLogger is called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n\n// LogClosure is a closure that can be printed with %v to be used to\n// generate expensive-to-create data for a detailed log level and avoid doing\n// the work if the data isn't printed.\ntype logClosure func() string\n\nfunc (c logClosure) String() string {\n\treturn c()\n}\n\nfunc newLogClosure(c func() string) logClosure {\n\treturn logClosure(c)\n}\n\n// directionString is a helper function that returns a string that represents\n// the direction of a connection (inbound or outbound).\nfunc directionString(inbound bool) string {\n\tif inbound {\n\t\treturn \"inbound\"\n\t}\n\treturn \"outbound\"\n}\n\n// formatLockTime returns a transaction lock time as a human-readable string.\nfunc formatLockTime(lockTime uint32) string {\n\t// The lock time field of a transaction is either a block height at\n\t// which the transaction is finalized or a timestamp depending on if the\n\t// value is before the lockTimeThreshold.  When it is under the\n\t// threshold it is a block height.\n\tif lockTime < txscript.LockTimeThreshold {\n\t\treturn fmt.Sprintf(\"height %d\", lockTime)\n\t}\n\n\treturn time.Unix(int64(lockTime), 0).String()\n}\n\n// invSummary returns an inventory message as a human-readable string.\nfunc invSummary(invList []*wire.InvVect) string {\n\t// No inventory.\n\tinvLen := len(invList)\n\tif invLen == 0 {\n\t\treturn \"empty\"\n\t}\n\n\t// One inventory item.\n\tif invLen == 1 {\n\t\tiv := invList[0]\n\t\tswitch iv.Type {\n\t\tcase wire.InvTypeError:\n\t\t\treturn fmt.Sprintf(\"error %s\", iv.Hash)\n\t\tcase wire.InvTypeWitnessBlock:\n\t\t\treturn fmt.Sprintf(\"witness block %s\", iv.Hash)\n\t\tcase wire.InvTypeBlock:\n\t\t\treturn fmt.Sprintf(\"block %s\", iv.Hash)\n\t\tcase wire.InvTypeWitnessTx:\n\t\t\treturn fmt.Sprintf(\"witness tx %s\", iv.Hash)\n\t\tcase wire.InvTypeTx:\n\t\t\treturn fmt.Sprintf(\"tx %s\", iv.Hash)\n\t\t}\n\n\t\treturn fmt.Sprintf(\"unknown (%d) %s\", uint32(iv.Type), iv.Hash)\n\t}\n\n\t// More than one inv item.\n\treturn fmt.Sprintf(\"size %d\", invLen)\n}\n\n// locatorSummary returns a block locator as a human-readable string.\nfunc locatorSummary(locator []*chainhash.Hash, stopHash *chainhash.Hash) string {\n\tif len(locator) > 0 {\n\t\treturn fmt.Sprintf(\"locator %s, stop %s\", locator[0], stopHash)\n\t}\n\n\treturn fmt.Sprintf(\"no locator, stop %s\", stopHash)\n\n}\n\n// sanitizeString strips any characters which are even remotely dangerous, such\n// as html control characters, from the passed string.  It also limits it to\n// the passed maximum size, which can be 0 for unlimited.  When the string is\n// limited, it will also add \"...\" to the string to indicate it was truncated.\nfunc sanitizeString(str string, maxLength uint) string {\n\tconst safeChars = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY\" +\n\t\t\"Z01234567890 .,;_/:?@\"\n\n\t// Strip any characters not in the safeChars string removed.\n\tstr = strings.Map(func(r rune) rune {\n\t\tif strings.ContainsRune(safeChars, r) {\n\t\t\treturn r\n\t\t}\n\t\treturn -1\n\t}, str)\n\n\t// Limit the string to the max allowed length.\n\tif maxLength > 0 && uint(len(str)) > maxLength {\n\t\tstr = str[:maxLength]\n\t\tstr = str + \"...\"\n\t}\n\treturn str\n}\n\n// messageSummary returns a human-readable string which summarizes a message.\n// Not all messages have or need a summary.  This is used for debug logging.\nfunc messageSummary(msg wire.Message) string {\n\tswitch msg := msg.(type) {\n\tcase *wire.MsgVersion:\n\t\treturn fmt.Sprintf(\"agent %s, pver %d, block %d\",\n\t\t\tmsg.UserAgent, msg.ProtocolVersion, msg.LastBlock)\n\n\tcase *wire.MsgVerAck:\n\t\t// No summary.\n\n\tcase *wire.MsgGetAddr:\n\t\t// No summary.\n\n\tcase *wire.MsgAddr:\n\t\treturn fmt.Sprintf(\"%d addr\", len(msg.AddrList))\n\n\tcase *wire.MsgPing:\n\t\t// No summary - perhaps add nonce.\n\n\tcase *wire.MsgPong:\n\t\t// No summary - perhaps add nonce.\n\n\tcase *wire.MsgMemPool:\n\t\t// No summary.\n\n\tcase *wire.MsgTx:\n\t\treturn fmt.Sprintf(\"hash %s, %d inputs, %d outputs, lock %s\",\n\t\t\tmsg.TxHash(), len(msg.TxIn), len(msg.TxOut),\n\t\t\tformatLockTime(msg.LockTime))\n\n\tcase *wire.MsgBlock:\n\t\theader := &msg.Header\n\t\treturn fmt.Sprintf(\"hash %s, ver %d, %d tx, %s\", msg.BlockHash(),\n\t\t\theader.Version, len(msg.Transactions), header.Timestamp)\n\n\tcase *wire.MsgInv:\n\t\treturn invSummary(msg.InvList)\n\n\tcase *wire.MsgNotFound:\n\t\treturn invSummary(msg.InvList)\n\n\tcase *wire.MsgGetData:\n\t\treturn invSummary(msg.InvList)\n\n\tcase *wire.MsgGetBlocks:\n\t\treturn locatorSummary(msg.BlockLocatorHashes, &msg.HashStop)\n\n\tcase *wire.MsgGetHeaders:\n\t\treturn locatorSummary(msg.BlockLocatorHashes, &msg.HashStop)\n\n\tcase *wire.MsgHeaders:\n\t\treturn fmt.Sprintf(\"num %d\", len(msg.Headers))\n\n\tcase *wire.MsgGetCFHeaders:\n\t\treturn fmt.Sprintf(\"start_height=%d, stop_hash=%v\",\n\t\t\tmsg.StartHeight, msg.StopHash)\n\n\tcase *wire.MsgCFHeaders:\n\t\treturn fmt.Sprintf(\"stop_hash=%v, num_filter_hashes=%d\",\n\t\t\tmsg.StopHash, len(msg.FilterHashes))\n\n\tcase *wire.MsgReject:\n\t\t// Ensure the variable length strings don't contain any\n\t\t// characters which are even remotely dangerous such as HTML\n\t\t// control characters, etc.  Also limit them to sane length for\n\t\t// logging.\n\t\trejCommand := sanitizeString(msg.Cmd, wire.CommandSize)\n\t\trejReason := sanitizeString(msg.Reason, maxRejectReasonLen)\n\t\tsummary := fmt.Sprintf(\"cmd %v, code %v, reason %v\", rejCommand,\n\t\t\tmsg.Code, rejReason)\n\t\tif rejCommand == wire.CmdBlock || rejCommand == wire.CmdTx {\n\t\t\tsummary += fmt.Sprintf(\", hash %v\", msg.Hash)\n\t\t}\n\t\treturn summary\n\t}\n\n\t// No summary for other messages.\n\treturn \"\"\n}\n"
  },
  {
    "path": "peer/p2pdowngrader.go",
    "content": "package peer\n\nimport (\n\t\"github.com/decred/dcrd/lru\"\n)\n\nconst (\n\t// defaultDowngradeCacheSize is the default number of addresses to store\n\t// in the P2P downgrader cache.\n\tdefaultDowngradeCacheSize = 100\n)\n\n// P2PDowngrader manages a list of peer addresses that should be attempted\n// with the v1 P2P protocol on their next connection, typically after a v2\n// handshake failure.\ntype P2PDowngrader struct {\n\tcache lru.Cache\n}\n\n// NewP2PDowngrader returns a new P2PDowngrader instance.\n// cacheSize specifies the maximum number of addresses to remember for downgrade.\nfunc NewP2PDowngrader(cacheSize uint) *P2PDowngrader {\n\tif cacheSize == 0 {\n\t\tcacheSize = defaultDowngradeCacheSize\n\t}\n\treturn &P2PDowngrader{\n\t\tcache: lru.NewCache(cacheSize),\n\t}\n}\n\n// MarkForDowngrade flags an address so that the next outbound connection\n// attempt to it will use the v1 P2P protocol.\nfunc (pd *P2PDowngrader) MarkForDowngrade(addr string) {\n\tpd.cache.Add(addr)\n\n\tlog.Debugf(\"P2PDowngrader: Marked %s for v1 downgrade\", addr)\n}\n\n// ShouldDowngrade checks if an address is marked for a v1 downgrade. If the\n// address is found, it is removed from the list (consumed), and the function\n// returns true. Otherwise, it returns false.\nfunc (pd *P2PDowngrader) ShouldDowngrade(addr string) bool {\n\n\tif exists := pd.cache.Contains(addr); exists {\n\t\tpd.cache.Delete(addr)\n\n\t\tlog.Debugf(\"P2PDowngrader: Consumed v1 downgrade request \"+\n\t\t\t\"for %s\", addr)\n\n\t\treturn true\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "peer/p2pdowngrader_test.go",
    "content": "package peer\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\t\"pgregory.net/rapid\"\n)\n\n// TestP2PDowngraderMarkAndShouldDowngrade tests the basic MarkForDowngrade and\n// ShouldDowngrade functionality.\nfunc TestP2PDowngraderMarkAndShouldDowngrade(t *testing.T) {\n\tt.Parallel()\n\n\trapid.Check(t, func(t *rapid.T) {\n\t\t// addrGen creates somewhat realistic-looking address strings.\n\t\taddrGen := rapid.Map(rapid.SliceOfN(\n\t\t\trapid.Byte(), 10, 20), func(bs []byte) string {\n\t\t\treturn fmt.Sprintf(\"%x.testpeer.net\", bs)\n\t\t})\n\n\t\taddr1 := addrGen.Draw(t, \"addr1\")\n\t\taddr2 := addrGen.Draw(t, \"addr2\")\n\n\t\t// Ensure addr1 and addr2 are different for a clearer test,\n\t\t// though the logic holds even if they are the same.\n\t\tfor addr1 == addr2 {\n\t\t\t// Suffix with retry to ensure rapid sees it as a new\n\t\t\t// draw attempt for addr2.\n\t\t\taddr2 = addrGen.Draw(t, \"addr2_retry\")\n\t\t}\n\n\t\t// Create a P2PDowngrader with a small capacity.\n\t\tdowngrader := NewP2PDowngrader(2)\n\n\t\t// Initially, no address should be marked for downgrade.\n\t\trequire.False(\n\t\t\tt, downgrader.ShouldDowngrade(addr1),\n\t\t\t\"addr1 should not be marked initially\",\n\t\t)\n\t\trequire.False(\n\t\t\tt, downgrader.ShouldDowngrade(addr2),\n\t\t\t\"addr2 should not be marked initially\",\n\t\t)\n\n\t\t// Mark addr1 for downgrade.\n\t\tdowngrader.MarkForDowngrade(addr1)\n\n\t\t// Now, ShouldDowngrade for addr1 should return true.\n\t\trequire.True(\n\t\t\tt, downgrader.ShouldDowngrade(addr1),\n\t\t\t\"addr1 should be marked for downgrade after \"+\n\t\t\t\t\"MarkForDowngrade\",\n\t\t)\n\n\t\t// A subsequent call for addr1 should return false as it is\n\t\t// consumed.\n\t\trequire.False(\n\t\t\tt, downgrader.ShouldDowngrade(addr1),\n\t\t\t\"addr1 should not be marked after being consumed \"+\n\t\t\t\t\"by ShouldDowngrade\",\n\t\t)\n\n\t\t// addr2 should still not be marked.\n\t\trequire.False(\n\t\t\tt, downgrader.ShouldDowngrade(addr2),\n\t\t\t\"addr2 should remain unmarked\",\n\t\t)\n\n\t\tdowngrader.MarkForDowngrade(addr2)\n\n\t\trequire.True(\n\t\t\tt, downgrader.ShouldDowngrade(addr2),\n\t\t\t\"addr2 should be marked\",\n\t\t)\n\t\trequire.False(\n\t\t\tt, downgrader.ShouldDowngrade(addr2),\n\t\t\t\"addr2 should be consumed after ShouldDowngrade\",\n\t\t)\n\t})\n}\n\n// TestP2PDowngraderLRUEviction tests the LRU eviction behavior of the cache.\nfunc TestP2PDowngraderLRUEviction(t *testing.T) {\n\tt.Parallel()\n\n\trapid.Check(t, func(t *rapid.T) {\n\t\t// Capacity for the LRU cache.\n\t\tcapacity := rapid.UintRange(1, 5).Draw(t, \"capacity\")\n\n\t\t// Generate a list of unique addresses, one more than the capacity\n\t\t// to trigger eviction.\n\t\tnumAddresses := int(capacity + 1)\n\t\taddresses := rapid.SliceOfNDistinct(\n\t\t\trapid.String(), numAddresses, numAddresses, rapid.ID,\n\t\t).Draw(t, \"addresses\")\n\n\t\tdowngrader := NewP2PDowngrader(capacity)\n\n\t\t// Mark the first 'capacity' addresses. These are addresses[0]\n\t\t// through addresses[capacity-1]. In dcrd/lru, Add puts new\n\t\t// items at the front (most recent). So, after this loop,\n\t\t// addresses[capacity-1] is newest, addresses[0] is oldest.\n\t\tfor i := 0; i < int(capacity); i++ {\n\t\t\tdowngrader.MarkForDowngrade(addresses[i])\n\t\t}\n\n\t\t// The address that should be evicted is addresses[0] (the\n\n\t\taddressToBeEvicted := addresses[0]\n\n\t\t// The address that causes the eviction is addresses[capacity].\n\t\tevictingAddress := addresses[capacity]\n\t\tdowngrader.MarkForDowngrade(evictingAddress)\n\n\t\t// Check that the address that should have been evicted is no\n\t\t// longer marked.\n\t\trequire.False(\n\t\t\tt, downgrader.ShouldDowngrade(addressToBeEvicted),\n\t\t\t\"address %s should have been evicted by %s\",\n\t\t\taddressToBeEvicted, evictingAddress,\n\t\t)\n\n\t\t// Check that the evicting address is marked and consumable.\n\t\trequire.True(\n\t\t\tt, downgrader.ShouldDowngrade(evictingAddress),\n\t\t\t\"address %s (the evicting one) should \"+\n\t\t\t\t\"be marked\", evictingAddress,\n\t\t)\n\n\t\t// Check the remaining (capacity-1) addresses that were not the\n\t\t// first one. These are addresses[1] through\n\t\t// addresses[capacity-1]. They should still be present.\n\t\tfor i := 1; i < int(capacity); i++ {\n\t\t\trequire.True(\n\t\t\t\tt, downgrader.ShouldDowngrade(addresses[i]),\n\t\t\t\t\"address %s should still be marked\",\n\t\t\t\taddresses[i],\n\t\t\t)\n\t\t}\n\t})\n}\n\n// TestP2PDowngraderMarkExistingUpdatesLRU tests that marking an existing\n// address moves it to the front of the LRU list. This prevents it from being\n// evicted prematurely.\nfunc TestP2PDowngraderMarkExistingUpdatesLRU(t *testing.T) {\n\tt.Parallel()\n\n\trapid.Check(t, func(t *rapid.T) {\n\t\tconst capacity = 3\n\n\t\t// Generate 4 unique addresses.\n\t\tnumAddresses := capacity + 1\n\t\taddresses := rapid.SliceOfNDistinct(\n\t\t\trapid.String(), numAddresses, numAddresses, rapid.ID,\n\t\t).Draw(t, \"addresses\")\n\n\t\taddrA := addresses[0]\n\t\taddrB := addresses[1]\n\t\taddrC := addresses[2]\n\n\t\t// This will be the evicting address.\n\t\taddrD := addresses[3]\n\n\t\tdowngrader := NewP2PDowngrader(capacity)\n\n\t\t// Step 1: Mark A, B, C.\n\t\t// Cache state (newest to oldest): [C, B, A].\n\t\tdowngrader.MarkForDowngrade(addrA)\n\t\tdowngrader.MarkForDowngrade(addrB)\n\t\tdowngrader.MarkForDowngrade(addrC)\n\n\t\t// Step 2: Mark A again. This should move A to the front\n\t\t// (newest). Cache state (newest to oldest): [A, C, B].\n\t\tdowngrader.MarkForDowngrade(addrA)\n\n\t\t// Step 3: Mark D. This should evict B (which is now the\n\t\t// oldest). Cache state (newest to oldest): [D, A, C].\n\t\tdowngrader.MarkForDowngrade(addrD)\n\n\t\t// Assert that B was evicted.\n\t\trequire.False(\n\t\t\tt, downgrader.ShouldDowngrade(addrB),\n\t\t\t\"addrB should have been evicted\",\n\t\t)\n\n\t\t// Assert that A, C, and D are still present and consumable.\n\t\t// Order of checking does not strictly matter here, just\n\t\t// presence.\n\t\trequire.True(\n\t\t\tt, downgrader.ShouldDowngrade(addrA),\n\t\t\t\"addrA should be marked (was re-marked \"+\n\t\t\t\t\"and moved to front)\",\n\t\t)\n\t\trequire.True(\n\t\t\tt, downgrader.ShouldDowngrade(addrC),\n\t\t\t\"addrC should be marked\",\n\t\t)\n\t\trequire.True(\n\t\t\tt, downgrader.ShouldDowngrade(addrD),\n\t\t\t\"addrD should be marked (evicted B)\",\n\t\t)\n\n\t\t// Verify they are consumed.\n\t\trequire.False(\n\t\t\tt, downgrader.ShouldDowngrade(addrA),\n\t\t\t\"addrA should be consumed\",\n\t\t)\n\t\trequire.False(\n\t\t\tt, downgrader.ShouldDowngrade(addrC),\n\t\t\t\"addrC should be consumed\",\n\t\t)\n\t\trequire.False(\n\t\t\tt, downgrader.ShouldDowngrade(addrD),\n\t\t\t\"addrD should be consumed\",\n\t\t)\n\t})\n}\n"
  },
  {
    "path": "peer/peer.go",
    "content": "// Copyright (c) 2013-2018 The btcsuite developers\n// Copyright (c) 2016-2018 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage peer\n\nimport (\n\t\"bytes\"\n\t\"container/list\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/rand\"\n\t\"net\"\n\t\"runtime/debug\"\n\t\"strconv\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/v2transport\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/btcsuite/go-socks/socks\"\n\t\"github.com/davecgh/go-spew/spew\"\n\t\"github.com/decred/dcrd/lru\"\n)\n\nconst (\n\t// MaxProtocolVersion is the max protocol version the peer supports.\n\tMaxProtocolVersion = wire.AddrV2Version\n\n\t// DefaultTrickleInterval is the min time between attempts to send an\n\t// inv message to a peer.\n\tDefaultTrickleInterval = 10 * time.Second\n\n\t// MinAcceptableProtocolVersion is the lowest protocol version that a\n\t// connected peer may support.\n\tMinAcceptableProtocolVersion = wire.MultipleAddressVersion\n\n\t// outputBufferSize is the number of elements the output channels use.\n\toutputBufferSize = 50\n\n\t// invTrickleSize is the maximum amount of inventory to send in a single\n\t// message when trickling inventory to remote peers.\n\tmaxInvTrickleSize = 1000\n\n\t// maxKnownInventory is the maximum number of items to keep in the known\n\t// inventory cache.\n\tmaxKnownInventory = 1000\n\n\t// pingInterval is the interval of time to wait in between sending ping\n\t// messages.\n\tpingInterval = 2 * time.Minute\n\n\t// negotiateTimeout is the duration of inactivity before we timeout a\n\t// peer that hasn't completed the initial version negotiation.\n\tnegotiateTimeout = 30 * time.Second\n\n\t// idleTimeout is the duration of inactivity before we time out a peer.\n\tidleTimeout = 5 * time.Minute\n\n\t// stallTickInterval is the interval of time between each check for\n\t// stalled peers.\n\tstallTickInterval = 15 * time.Second\n\n\t// stallResponseTimeout is the base maximum amount of time messages that\n\t// expect a response will wait before disconnecting the peer for\n\t// stalling.  The deadlines are adjusted for callback running times and\n\t// only checked on each stall tick interval.\n\tstallResponseTimeout = 30 * time.Second\n)\n\nvar (\n\t// nodeCount is the total number of peer connections made since startup\n\t// and is used to assign an id to a peer.\n\tnodeCount int32\n\n\t// zeroHash is the zero value hash (all zeros).  It is defined as a\n\t// convenience.\n\tzeroHash chainhash.Hash\n\n\t// sentNonces houses the unique nonces that are generated when pushing\n\t// version messages that are used to detect self connections.\n\tsentNonces = lru.NewCache(50)\n)\n\n// MessageListeners defines callback function pointers to invoke with message\n// listeners for a peer. Any listener which is not set to a concrete callback\n// during peer initialization is ignored. Execution of multiple message\n// listeners occurs serially, so one callback blocks the execution of the next.\n//\n// NOTE: Unless otherwise documented, these listeners must NOT directly call any\n// blocking calls (such as WaitForShutdown) on the peer instance since the input\n// handler goroutine blocks until the callback has completed.  Doing so will\n// result in a deadlock.\ntype MessageListeners struct {\n\t// OnGetAddr is invoked when a peer receives a getaddr bitcoin message.\n\tOnGetAddr func(p *Peer, msg *wire.MsgGetAddr)\n\n\t// OnAddr is invoked when a peer receives an addr bitcoin message.\n\tOnAddr func(p *Peer, msg *wire.MsgAddr)\n\n\t// OnAddrV2 is invoked when a peer receives an addrv2 bitcoin message.\n\tOnAddrV2 func(p *Peer, msg *wire.MsgAddrV2)\n\n\t// OnPing is invoked when a peer receives a ping bitcoin message.\n\tOnPing func(p *Peer, msg *wire.MsgPing)\n\n\t// OnPong is invoked when a peer receives a pong bitcoin message.\n\tOnPong func(p *Peer, msg *wire.MsgPong)\n\n\t// OnMemPool is invoked when a peer receives a mempool bitcoin message.\n\tOnMemPool func(p *Peer, msg *wire.MsgMemPool)\n\n\t// OnTx is invoked when a peer receives a tx bitcoin message.\n\tOnTx func(p *Peer, msg *wire.MsgTx)\n\n\t// OnBlock is invoked when a peer receives a block bitcoin message.\n\tOnBlock func(p *Peer, msg *wire.MsgBlock, buf []byte)\n\n\t// OnCFilter is invoked when a peer receives a cfilter bitcoin message.\n\tOnCFilter func(p *Peer, msg *wire.MsgCFilter)\n\n\t// OnCFHeaders is invoked when a peer receives a cfheaders bitcoin\n\t// message.\n\tOnCFHeaders func(p *Peer, msg *wire.MsgCFHeaders)\n\n\t// OnCFCheckpt is invoked when a peer receives a cfcheckpt bitcoin\n\t// message.\n\tOnCFCheckpt func(p *Peer, msg *wire.MsgCFCheckpt)\n\n\t// OnInv is invoked when a peer receives an inv bitcoin message.\n\tOnInv func(p *Peer, msg *wire.MsgInv)\n\n\t// OnHeaders is invoked when a peer receives a headers bitcoin message.\n\tOnHeaders func(p *Peer, msg *wire.MsgHeaders)\n\n\t// OnNotFound is invoked when a peer receives a notfound bitcoin\n\t// message.\n\tOnNotFound func(p *Peer, msg *wire.MsgNotFound)\n\n\t// OnGetData is invoked when a peer receives a getdata bitcoin message.\n\tOnGetData func(p *Peer, msg *wire.MsgGetData)\n\n\t// OnGetBlocks is invoked when a peer receives a getblocks bitcoin\n\t// message.\n\tOnGetBlocks func(p *Peer, msg *wire.MsgGetBlocks)\n\n\t// OnGetHeaders is invoked when a peer receives a getheaders bitcoin\n\t// message.\n\tOnGetHeaders func(p *Peer, msg *wire.MsgGetHeaders)\n\n\t// OnGetCFilters is invoked when a peer receives a getcfilters bitcoin\n\t// message.\n\tOnGetCFilters func(p *Peer, msg *wire.MsgGetCFilters)\n\n\t// OnGetCFHeaders is invoked when a peer receives a getcfheaders\n\t// bitcoin message.\n\tOnGetCFHeaders func(p *Peer, msg *wire.MsgGetCFHeaders)\n\n\t// OnGetCFCheckpt is invoked when a peer receives a getcfcheckpt\n\t// bitcoin message.\n\tOnGetCFCheckpt func(p *Peer, msg *wire.MsgGetCFCheckpt)\n\n\t// OnFeeFilter is invoked when a peer receives a feefilter bitcoin message.\n\tOnFeeFilter func(p *Peer, msg *wire.MsgFeeFilter)\n\n\t// OnFilterAdd is invoked when a peer receives a filteradd bitcoin message.\n\tOnFilterAdd func(p *Peer, msg *wire.MsgFilterAdd)\n\n\t// OnFilterClear is invoked when a peer receives a filterclear bitcoin\n\t// message.\n\tOnFilterClear func(p *Peer, msg *wire.MsgFilterClear)\n\n\t// OnFilterLoad is invoked when a peer receives a filterload bitcoin\n\t// message.\n\tOnFilterLoad func(p *Peer, msg *wire.MsgFilterLoad)\n\n\t// OnMerkleBlock  is invoked when a peer receives a merkleblock bitcoin\n\t// message.\n\tOnMerkleBlock func(p *Peer, msg *wire.MsgMerkleBlock)\n\n\t// OnVersion is invoked when a peer receives a version bitcoin message.\n\t// The caller may return a reject message in which case the message will\n\t// be sent to the peer and the peer will be disconnected.\n\tOnVersion func(p *Peer, msg *wire.MsgVersion) *wire.MsgReject\n\n\t// OnVerAck is invoked when a peer receives a verack bitcoin message.\n\tOnVerAck func(p *Peer, msg *wire.MsgVerAck)\n\n\t// OnReject is invoked when a peer receives a reject bitcoin message.\n\tOnReject func(p *Peer, msg *wire.MsgReject)\n\n\t// OnSendHeaders is invoked when a peer receives a sendheaders bitcoin\n\t// message.\n\tOnSendHeaders func(p *Peer, msg *wire.MsgSendHeaders)\n\n\t// OnSendAddrV2 is invoked when a peer receives a sendaddrv2 message.\n\tOnSendAddrV2 func(p *Peer, msg *wire.MsgSendAddrV2)\n\n\t// OnRead is invoked when a peer receives a bitcoin message.  It\n\t// consists of the number of bytes read, the message, and whether or not\n\t// an error in the read occurred.  Typically, callers will opt to use\n\t// the callbacks for the specific message types, however this can be\n\t// useful for circumstances such as keeping track of server-wide byte\n\t// counts or working with custom message types for which the peer does\n\t// not directly provide a callback.\n\tOnRead func(p *Peer, bytesRead int, msg wire.Message, err error)\n\n\t// OnWrite is invoked when we write a bitcoin message to a peer.  It\n\t// consists of the number of bytes written, the message, and whether or\n\t// not an error in the write occurred.  This can be useful for\n\t// circumstances such as keeping track of server-wide byte counts.\n\tOnWrite func(p *Peer, bytesWritten int, msg wire.Message, err error)\n}\n\n// Config is the struct to hold configuration options useful to Peer.\ntype Config struct {\n\t// NewestBlock specifies a callback which provides the newest block\n\t// details to the peer as needed.  This can be nil in which case the\n\t// peer will report a block height of 0, however it is good practice for\n\t// peers to specify this so their currently best known is accurately\n\t// reported.\n\tNewestBlock HashFunc\n\n\t// HostToNetAddress returns the netaddress for the given host. This can be\n\t// nil in  which case the host will be parsed as an IP address.\n\tHostToNetAddress HostToNetAddrFunc\n\n\t// Proxy indicates a proxy is being used for connections.  The only\n\t// effect this has is to prevent leaking the tor proxy address, so it\n\t// only needs to specified if using a tor proxy.\n\tProxy string\n\n\t// UserAgentName specifies the user agent name to advertise.  It is\n\t// highly recommended to specify this value.\n\tUserAgentName string\n\n\t// UserAgentVersion specifies the user agent version to advertise.  It\n\t// is highly recommended to specify this value and that it follows the\n\t// form \"major.minor.revision\" e.g. \"2.6.41\".\n\tUserAgentVersion string\n\n\t// UserAgentComments specify the user agent comments to advertise.  These\n\t// values must not contain the illegal characters specified in BIP 14:\n\t// '/', ':', '(', ')'.\n\tUserAgentComments []string\n\n\t// ChainParams identifies which chain parameters the peer is associated\n\t// with.  It is highly recommended to specify this field, however it can\n\t// be omitted in which case the test network will be used.\n\tChainParams *chaincfg.Params\n\n\t// Services specifies which services to advertise as supported by the\n\t// local peer.  This field can be omitted in which case it will be 0\n\t// and therefore advertise no supported services.\n\tServices wire.ServiceFlag\n\n\t// ProtocolVersion specifies the maximum protocol version to use and\n\t// advertise.  This field can be omitted in which case\n\t// peer.MaxProtocolVersion will be used.\n\tProtocolVersion uint32\n\n\t// DisableRelayTx specifies if the remote peer should be informed to\n\t// not send inv messages for transactions.\n\tDisableRelayTx bool\n\n\t// Listeners houses callback functions to be invoked on receiving peer\n\t// messages.\n\tListeners MessageListeners\n\n\t// TrickleInterval is the duration of the ticker which trickles down the\n\t// inventory to a peer.\n\tTrickleInterval time.Duration\n\n\t// AllowSelfConns is only used to allow the tests to bypass the self\n\t// connection detecting and disconnect logic since they intentionally\n\t// do so for testing purposes.\n\tAllowSelfConns bool\n\n\t// DisableStallHandler if true, then the stall handler that attempts to\n\t// disconnect from peers that appear to be taking too long to respond\n\t// to requests won't be activated. This can be useful in certain simnet\n\t// scenarios where the stall behavior isn't important to the system\n\t// under test.\n\tDisableStallHandler bool\n\n\t// UsingV2Conn is defined if and only if we accept and attempt to make\n\t// v2 connections.\n\tUsingV2Conn bool\n}\n\n// minUint32 is a helper function to return the minimum of two uint32s.\n// This avoids a math import and the need to cast to floats.\nfunc minUint32(a, b uint32) uint32 {\n\tif a < b {\n\t\treturn a\n\t}\n\treturn b\n}\n\n// newNetAddress attempts to extract the IP address and port from the passed\n// net.Addr interface and create a bitcoin NetAddress structure using that\n// information.\nfunc newNetAddress(addr net.Addr, services wire.ServiceFlag) (*wire.NetAddress, error) {\n\t// addr will be a net.TCPAddr when not using a proxy.\n\tif tcpAddr, ok := addr.(*net.TCPAddr); ok {\n\t\tip := tcpAddr.IP\n\t\tport := uint16(tcpAddr.Port)\n\t\tna := wire.NewNetAddressIPPort(ip, port, services)\n\t\treturn na, nil\n\t}\n\n\t// addr will be a socks.ProxiedAddr when using a proxy.\n\tif proxiedAddr, ok := addr.(*socks.ProxiedAddr); ok {\n\t\tip := net.ParseIP(proxiedAddr.Host)\n\t\tif ip == nil {\n\t\t\tip = net.ParseIP(\"0.0.0.0\")\n\t\t}\n\t\tport := uint16(proxiedAddr.Port)\n\t\tna := wire.NewNetAddressIPPort(ip, port, services)\n\t\treturn na, nil\n\t}\n\n\t// For the most part, addr should be one of the two above cases, but\n\t// to be safe, fall back to trying to parse the information from the\n\t// address string as a last resort.\n\thost, portStr, err := net.SplitHostPort(addr.String())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tip := net.ParseIP(host)\n\tport, err := strconv.ParseUint(portStr, 10, 16)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tna := wire.NewNetAddressIPPort(ip, uint16(port), services)\n\treturn na, nil\n}\n\n// outMsg is used to house a message to be sent along with a channel to signal\n// when the message has been sent (or won't be sent due to things such as\n// shutdown)\ntype outMsg struct {\n\tmsg      wire.Message\n\tdoneChan chan<- struct{}\n\tencoding wire.MessageEncoding\n}\n\n// stallControlCmd represents the command of a stall control message.\ntype stallControlCmd uint8\n\n// Constants for the command of a stall control message.\nconst (\n\t// sccSendMessage indicates a message is being sent to the remote peer.\n\tsccSendMessage stallControlCmd = iota\n\n\t// sccReceiveMessage indicates a message has been received from the\n\t// remote peer.\n\tsccReceiveMessage\n\n\t// sccHandlerStart indicates a callback handler is about to be invoked.\n\tsccHandlerStart\n\n\t// sccHandlerStart indicates a callback handler has completed.\n\tsccHandlerDone\n)\n\n// stallControlMsg is used to signal the stall handler about specific events\n// so it can properly detect and handle stalled remote peers.\ntype stallControlMsg struct {\n\tcommand stallControlCmd\n\tmessage wire.Message\n}\n\n// StatsSnap is a snapshot of peer stats at a point in time.\ntype StatsSnap struct {\n\tID             int32\n\tAddr           string\n\tServices       wire.ServiceFlag\n\tLastSend       time.Time\n\tLastRecv       time.Time\n\tBytesSent      uint64\n\tBytesRecv      uint64\n\tConnTime       time.Time\n\tTimeOffset     int64\n\tVersion        uint32\n\tUserAgent      string\n\tInbound        bool\n\tStartingHeight int32\n\tLastBlock      int32\n\tLastPingNonce  uint64\n\tLastPingTime   time.Time\n\tLastPingMicros int64\n\tV2Connection   bool\n}\n\n// HashFunc is a function which returns a block hash, height and error\n// It is used as a callback to get newest block details.\ntype HashFunc func() (hash *chainhash.Hash, height int32, err error)\n\n// AddrFunc is a func which takes an address and returns a related address.\ntype AddrFunc func(remoteAddr *wire.NetAddress) *wire.NetAddress\n\n// HostToNetAddrFunc is a func which takes a host, port, services and returns\n// the netaddress.\ntype HostToNetAddrFunc func(host string, port uint16,\n\tservices wire.ServiceFlag) (*wire.NetAddressV2, error)\n\n// NOTE: The overall data flow of a peer is split into 3 goroutines.  Inbound\n// messages are read via the inHandler goroutine and generally dispatched to\n// their own handler.  For inbound data-related messages such as blocks,\n// transactions, and inventory, the data is handled by the corresponding\n// message handlers.  The data flow for outbound messages is split into 2\n// goroutines, queueHandler and outHandler.  The first, queueHandler, is used\n// as a way for external entities to queue messages, by way of the QueueMessage\n// function, quickly regardless of whether the peer is currently sending or not.\n// It acts as the traffic cop between the external world and the actual\n// goroutine which writes to the network socket.\n\n// Peer provides a basic concurrent safe bitcoin peer for handling bitcoin\n// communications via the peer-to-peer protocol.  It provides full duplex\n// reading and writing, automatic handling of the initial handshake process,\n// querying of usage statistics and other information about the remote peer such\n// as its address, user agent, and protocol version, output message queuing,\n// inventory trickling, and the ability to dynamically register and unregister\n// callbacks for handling bitcoin protocol messages.\n//\n// Outbound messages are typically queued via QueueMessage or QueueInventory.\n// QueueMessage is intended for all messages, including responses to data such\n// as blocks and transactions.  QueueInventory, on the other hand, is only\n// intended for relaying inventory as it employs a trickling mechanism to batch\n// the inventory together.  However, some helper functions for pushing messages\n// of specific types that typically require common special handling are\n// provided as a convenience.\ntype Peer struct {\n\t// The following variables must only be used atomically.\n\tbytesReceived uint64\n\tbytesSent     uint64\n\tlastRecv      int64\n\tlastSend      int64\n\tconnected     int32\n\tdisconnect    int32\n\n\tconn net.Conn\n\n\t// These fields are set at creation time and never modified, so they are\n\t// safe to read from concurrently without a mutex.\n\taddr    string\n\tcfg     Config\n\tinbound bool\n\n\tflagsMtx             sync.Mutex // protects the peer flags below\n\tna                   *wire.NetAddressV2\n\tid                   int32\n\tuserAgent            string\n\tservices             wire.ServiceFlag\n\tversionKnown         bool\n\tadvertisedProtoVer   uint32 // protocol version advertised by remote\n\tprotocolVersion      uint32 // negotiated protocol version\n\tsendHeadersPreferred bool   // peer sent a sendheaders message\n\tverAckReceived       bool\n\twitnessEnabled       bool\n\tsendAddrV2           bool\n\n\tV2Transport *v2transport.Peer\n\n\twireEncoding wire.MessageEncoding\n\n\tknownInventory     lru.Cache\n\tprevGetBlocksMtx   sync.Mutex\n\tprevGetBlocksBegin *chainhash.Hash\n\tprevGetBlocksStop  *chainhash.Hash\n\tprevGetHdrsMtx     sync.Mutex\n\tprevGetHdrsBegin   *chainhash.Hash\n\tprevGetHdrsStop    *chainhash.Hash\n\n\t// These fields keep track of statistics for the peer and are protected\n\t// by the statsMtx mutex.\n\tstatsMtx           sync.RWMutex\n\ttimeOffset         int64\n\ttimeConnected      time.Time\n\tstartingHeight     int32\n\tlastBlock          int32\n\tlastAnnouncedBlock *chainhash.Hash\n\tlastPingNonce      uint64    // Set to nonce if we have a pending ping.\n\tlastPingTime       time.Time // Time we sent last ping.\n\tlastPingMicros     int64     // Time for last ping to return.\n\n\tstallControl  chan stallControlMsg\n\toutputQueue   chan outMsg\n\tsendQueue     chan outMsg\n\tsendDoneQueue chan struct{}\n\toutputInvChan chan *wire.InvVect\n\tinQuit        chan struct{}\n\tqueueQuit     chan struct{}\n\toutQuit       chan struct{}\n\tquit          chan struct{}\n}\n\n// String returns the peer's address and directionality as a human-readable\n// string.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) String() string {\n\treturn fmt.Sprintf(\"%s (%s)\", p.addr, directionString(p.inbound))\n}\n\n// UpdateLastBlockHeight updates the last known block for the peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) UpdateLastBlockHeight(newHeight int32) {\n\tp.statsMtx.Lock()\n\tif newHeight <= p.lastBlock {\n\t\tp.statsMtx.Unlock()\n\t\treturn\n\t}\n\tlog.Tracef(\"Updating last block height of peer %v from %v to %v\",\n\t\tp.addr, p.lastBlock, newHeight)\n\tp.lastBlock = newHeight\n\tp.statsMtx.Unlock()\n}\n\n// UpdateLastAnnouncedBlock updates meta-data about the last block hash this\n// peer is known to have announced.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) UpdateLastAnnouncedBlock(blkHash *chainhash.Hash) {\n\tlog.Tracef(\"Updating last blk for peer %v, %v\", p.addr, blkHash)\n\n\tp.statsMtx.Lock()\n\tp.lastAnnouncedBlock = blkHash\n\tp.statsMtx.Unlock()\n}\n\n// AddKnownInventory adds the passed inventory to the cache of known inventory\n// for the peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) AddKnownInventory(invVect *wire.InvVect) {\n\tp.knownInventory.Add(invVect)\n}\n\n// StatsSnapshot returns a snapshot of the current peer flags and statistics.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) StatsSnapshot() *StatsSnap {\n\tp.statsMtx.RLock()\n\n\tp.flagsMtx.Lock()\n\tid := p.id\n\taddr := p.addr\n\tuserAgent := p.userAgent\n\tservices := p.services\n\tprotocolVersion := p.advertisedProtoVer\n\tp.flagsMtx.Unlock()\n\n\t// Get a copy of all relevant flags and stats.\n\tstatsSnap := &StatsSnap{\n\t\tID:             id,\n\t\tAddr:           addr,\n\t\tUserAgent:      userAgent,\n\t\tServices:       services,\n\t\tLastSend:       p.LastSend(),\n\t\tLastRecv:       p.LastRecv(),\n\t\tBytesSent:      p.BytesSent(),\n\t\tBytesRecv:      p.BytesReceived(),\n\t\tConnTime:       p.timeConnected,\n\t\tTimeOffset:     p.timeOffset,\n\t\tVersion:        protocolVersion,\n\t\tInbound:        p.inbound,\n\t\tStartingHeight: p.startingHeight,\n\t\tLastBlock:      p.lastBlock,\n\t\tLastPingNonce:  p.lastPingNonce,\n\t\tLastPingMicros: p.lastPingMicros,\n\t\tLastPingTime:   p.lastPingTime,\n\t\tV2Connection:   p.cfg.UsingV2Conn,\n\t}\n\n\tp.statsMtx.RUnlock()\n\treturn statsSnap\n}\n\n// ID returns the peer id.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) ID() int32 {\n\tp.flagsMtx.Lock()\n\tid := p.id\n\tp.flagsMtx.Unlock()\n\n\treturn id\n}\n\n// NA returns the peer network address.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) NA() *wire.NetAddressV2 {\n\tp.flagsMtx.Lock()\n\tna := p.na\n\tp.flagsMtx.Unlock()\n\n\treturn na\n}\n\n// Addr returns the peer address.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) Addr() string {\n\t// The address doesn't change after initialization, therefore it is not\n\t// protected by a mutex.\n\treturn p.addr\n}\n\n// Inbound returns whether the peer is inbound.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) Inbound() bool {\n\treturn p.inbound\n}\n\n// Services returns the services flag of the remote peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) Services() wire.ServiceFlag {\n\tp.flagsMtx.Lock()\n\tservices := p.services\n\tp.flagsMtx.Unlock()\n\n\treturn services\n}\n\n// UserAgent returns the user agent of the remote peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) UserAgent() string {\n\tp.flagsMtx.Lock()\n\tuserAgent := p.userAgent\n\tp.flagsMtx.Unlock()\n\n\treturn userAgent\n}\n\n// LastAnnouncedBlock returns the last announced block of the remote peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) LastAnnouncedBlock() *chainhash.Hash {\n\tp.statsMtx.RLock()\n\tlastAnnouncedBlock := p.lastAnnouncedBlock\n\tp.statsMtx.RUnlock()\n\n\treturn lastAnnouncedBlock\n}\n\n// LastPingNonce returns the last ping nonce of the remote peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) LastPingNonce() uint64 {\n\tp.statsMtx.RLock()\n\tlastPingNonce := p.lastPingNonce\n\tp.statsMtx.RUnlock()\n\n\treturn lastPingNonce\n}\n\n// LastPingTime returns the last ping time of the remote peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) LastPingTime() time.Time {\n\tp.statsMtx.RLock()\n\tlastPingTime := p.lastPingTime\n\tp.statsMtx.RUnlock()\n\n\treturn lastPingTime\n}\n\n// LastPingMicros returns the last ping micros of the remote peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) LastPingMicros() int64 {\n\tp.statsMtx.RLock()\n\tlastPingMicros := p.lastPingMicros\n\tp.statsMtx.RUnlock()\n\n\treturn lastPingMicros\n}\n\n// VersionKnown returns the whether or not the version of a peer is known\n// locally.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) VersionKnown() bool {\n\tp.flagsMtx.Lock()\n\tversionKnown := p.versionKnown\n\tp.flagsMtx.Unlock()\n\n\treturn versionKnown\n}\n\n// VerAckReceived returns whether or not a verack message was received by the\n// peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) VerAckReceived() bool {\n\tp.flagsMtx.Lock()\n\tverAckReceived := p.verAckReceived\n\tp.flagsMtx.Unlock()\n\n\treturn verAckReceived\n}\n\n// ProtocolVersion returns the negotiated peer protocol version.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) ProtocolVersion() uint32 {\n\tp.flagsMtx.Lock()\n\tprotocolVersion := p.protocolVersion\n\tp.flagsMtx.Unlock()\n\n\treturn protocolVersion\n}\n\n// LastBlock returns the last block of the peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) LastBlock() int32 {\n\tp.statsMtx.RLock()\n\tlastBlock := p.lastBlock\n\tp.statsMtx.RUnlock()\n\n\treturn lastBlock\n}\n\n// LastSend returns the last send time of the peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) LastSend() time.Time {\n\treturn time.Unix(atomic.LoadInt64(&p.lastSend), 0)\n}\n\n// LastRecv returns the last recv time of the peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) LastRecv() time.Time {\n\treturn time.Unix(atomic.LoadInt64(&p.lastRecv), 0)\n}\n\n// LocalAddr returns the local address of the connection.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) LocalAddr() net.Addr {\n\tvar localAddr net.Addr\n\tif atomic.LoadInt32(&p.connected) != 0 {\n\t\tlocalAddr = p.conn.LocalAddr()\n\t}\n\treturn localAddr\n}\n\n// BytesSent returns the total number of bytes sent by the peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) BytesSent() uint64 {\n\treturn atomic.LoadUint64(&p.bytesSent)\n}\n\n// BytesReceived returns the total number of bytes received by the peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) BytesReceived() uint64 {\n\treturn atomic.LoadUint64(&p.bytesReceived)\n}\n\n// TimeConnected returns the time at which the peer connected.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) TimeConnected() time.Time {\n\tp.statsMtx.RLock()\n\ttimeConnected := p.timeConnected\n\tp.statsMtx.RUnlock()\n\n\treturn timeConnected\n}\n\n// TimeOffset returns the number of seconds the local time was offset from the\n// time the peer reported during the initial negotiation phase.  Negative values\n// indicate the remote peer's time is before the local time.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) TimeOffset() int64 {\n\tp.statsMtx.RLock()\n\ttimeOffset := p.timeOffset\n\tp.statsMtx.RUnlock()\n\n\treturn timeOffset\n}\n\n// StartingHeight returns the last known height the peer reported during the\n// initial negotiation phase.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) StartingHeight() int32 {\n\tp.statsMtx.RLock()\n\tstartingHeight := p.startingHeight\n\tp.statsMtx.RUnlock()\n\n\treturn startingHeight\n}\n\n// WantsHeaders returns if the peer wants header messages instead of\n// inventory vectors for blocks.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) WantsHeaders() bool {\n\tp.flagsMtx.Lock()\n\tsendHeadersPreferred := p.sendHeadersPreferred\n\tp.flagsMtx.Unlock()\n\n\treturn sendHeadersPreferred\n}\n\n// IsWitnessEnabled returns true if the peer has signalled that it supports\n// segregated witness.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) IsWitnessEnabled() bool {\n\tp.flagsMtx.Lock()\n\twitnessEnabled := p.witnessEnabled\n\tp.flagsMtx.Unlock()\n\n\treturn witnessEnabled\n}\n\n// WantsAddrV2 returns if the peer supports addrv2 messages instead of the\n// legacy addr messages.\nfunc (p *Peer) WantsAddrV2() bool {\n\tp.flagsMtx.Lock()\n\twantsAddrV2 := p.sendAddrV2\n\tp.flagsMtx.Unlock()\n\n\treturn wantsAddrV2\n}\n\n// PushAddrMsg sends an addr message to the connected peer using the provided\n// addresses.  This function is useful over manually sending the message via\n// QueueMessage since it automatically limits the addresses to the maximum\n// number allowed by the message and randomizes the chosen addresses when there\n// are too many.  It returns the addresses that were actually sent and no\n// message will be sent if there are no entries in the provided addresses slice.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) PushAddrMsg(addresses []*wire.NetAddress) ([]*wire.NetAddress, error) {\n\taddressCount := len(addresses)\n\n\t// Nothing to send.\n\tif addressCount == 0 {\n\t\treturn nil, nil\n\t}\n\n\tmsg := wire.NewMsgAddr()\n\tmsg.AddrList = make([]*wire.NetAddress, addressCount)\n\tcopy(msg.AddrList, addresses)\n\n\t// Randomize the addresses sent if there are more than the maximum allowed.\n\tif addressCount > wire.MaxAddrPerMsg {\n\t\t// Shuffle the address list.\n\t\tfor i := 0; i < wire.MaxAddrPerMsg; i++ {\n\t\t\tj := i + rand.Intn(addressCount-i)\n\t\t\tmsg.AddrList[i], msg.AddrList[j] = msg.AddrList[j], msg.AddrList[i]\n\t\t}\n\n\t\t// Truncate it to the maximum size.\n\t\tmsg.AddrList = msg.AddrList[:wire.MaxAddrPerMsg]\n\t}\n\n\tp.QueueMessage(msg, nil)\n\treturn msg.AddrList, nil\n}\n\n// PushAddrV2Msg is used to push an addrv2 message to the remote peer.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) PushAddrV2Msg(addrs []*wire.NetAddressV2) (\n\t[]*wire.NetAddressV2, error) {\n\n\tcount := len(addrs)\n\n\t// Nothing to send.\n\tif count == 0 {\n\t\treturn nil, nil\n\t}\n\n\tm := wire.NewMsgAddrV2()\n\tm.AddrList = make([]*wire.NetAddressV2, count)\n\tcopy(m.AddrList, addrs)\n\n\t// Randomize the addresses sent if there are more than the maximum.\n\tif count > wire.MaxV2AddrPerMsg {\n\t\trand.Shuffle(count, func(i, j int) {\n\t\t\tm.AddrList[i] = m.AddrList[j]\n\t\t\tm.AddrList[j] = m.AddrList[i]\n\t\t})\n\n\t\t// Truncate it to the maximum size.\n\t\tm.AddrList = m.AddrList[:wire.MaxV2AddrPerMsg]\n\t}\n\n\tp.QueueMessage(m, nil)\n\treturn m.AddrList, nil\n}\n\n// PushGetBlocksMsg sends a getblocks message for the provided block locator\n// and stop hash.  It will ignore back-to-back duplicate requests.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) PushGetBlocksMsg(locator blockchain.BlockLocator, stopHash *chainhash.Hash) error {\n\t// Extract the begin hash from the block locator, if one was specified,\n\t// to use for filtering duplicate getblocks requests.\n\tvar beginHash *chainhash.Hash\n\tif len(locator) > 0 {\n\t\tbeginHash = locator[0]\n\t}\n\n\t// Filter duplicate getblocks requests.\n\tp.prevGetBlocksMtx.Lock()\n\tisDuplicate := p.prevGetBlocksStop != nil && p.prevGetBlocksBegin != nil &&\n\t\tbeginHash != nil && stopHash.IsEqual(p.prevGetBlocksStop) &&\n\t\tbeginHash.IsEqual(p.prevGetBlocksBegin)\n\tp.prevGetBlocksMtx.Unlock()\n\n\tif isDuplicate {\n\t\tlog.Tracef(\"Filtering duplicate [getblocks] with begin \"+\n\t\t\t\"hash %v, stop hash %v\", beginHash, stopHash)\n\t\treturn nil\n\t}\n\n\t// Construct the getblocks request and queue it to be sent.\n\tmsg := wire.NewMsgGetBlocks(stopHash)\n\tfor _, hash := range locator {\n\t\terr := msg.AddBlockLocatorHash(hash)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tp.QueueMessage(msg, nil)\n\n\t// Update the previous getblocks request information for filtering\n\t// duplicates.\n\tp.prevGetBlocksMtx.Lock()\n\tp.prevGetBlocksBegin = beginHash\n\tp.prevGetBlocksStop = stopHash\n\tp.prevGetBlocksMtx.Unlock()\n\treturn nil\n}\n\n// PushGetHeadersMsg sends a getblocks message for the provided block locator\n// and stop hash.  It will ignore back-to-back duplicate requests.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) PushGetHeadersMsg(locator blockchain.BlockLocator, stopHash *chainhash.Hash) error {\n\t// Extract the begin hash from the block locator, if one was specified,\n\t// to use for filtering duplicate getheaders requests.\n\tvar beginHash *chainhash.Hash\n\tif len(locator) > 0 {\n\t\tbeginHash = locator[0]\n\t}\n\n\t// Filter duplicate getheaders requests.\n\tp.prevGetHdrsMtx.Lock()\n\tisDuplicate := p.prevGetHdrsStop != nil && p.prevGetHdrsBegin != nil &&\n\t\tbeginHash != nil && stopHash.IsEqual(p.prevGetHdrsStop) &&\n\t\tbeginHash.IsEqual(p.prevGetHdrsBegin)\n\tp.prevGetHdrsMtx.Unlock()\n\n\tif isDuplicate {\n\t\tlog.Tracef(\"Filtering duplicate [getheaders] with begin hash %v\",\n\t\t\tbeginHash)\n\t\treturn nil\n\t}\n\n\t// Construct the getheaders request and queue it to be sent.\n\tmsg := wire.NewMsgGetHeaders()\n\tmsg.HashStop = *stopHash\n\tfor _, hash := range locator {\n\t\terr := msg.AddBlockLocatorHash(hash)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tp.QueueMessage(msg, nil)\n\n\t// Update the previous getheaders request information for filtering\n\t// duplicates.\n\tp.prevGetHdrsMtx.Lock()\n\tp.prevGetHdrsBegin = beginHash\n\tp.prevGetHdrsStop = stopHash\n\tp.prevGetHdrsMtx.Unlock()\n\treturn nil\n}\n\n// PushRejectMsg sends a reject message for the provided command, reject code,\n// reject reason, and hash.  The hash will only be used when the command is a tx\n// or block and should be nil in other cases.  The wait parameter will cause the\n// function to block until the reject message has actually been sent.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) PushRejectMsg(command string, code wire.RejectCode, reason string, hash *chainhash.Hash, wait bool) {\n\t// Don't bother sending the reject message if the protocol version\n\t// is too low.\n\tif p.VersionKnown() && p.ProtocolVersion() < wire.RejectVersion {\n\t\treturn\n\t}\n\n\tmsg := wire.NewMsgReject(command, code, reason)\n\tif command == wire.CmdTx || command == wire.CmdBlock {\n\t\tif hash == nil {\n\t\t\tlog.Warnf(\"Sending a reject message for command \"+\n\t\t\t\t\"type %v which should have specified a hash \"+\n\t\t\t\t\"but does not\", command)\n\t\t\thash = &zeroHash\n\t\t}\n\t\tmsg.Hash = *hash\n\t}\n\n\t// Send the message without waiting if the caller has not requested it.\n\tif !wait {\n\t\tp.QueueMessage(msg, nil)\n\t\treturn\n\t}\n\n\t// Send the message and block until it has been sent before returning.\n\tdoneChan := make(chan struct{}, 1)\n\tp.QueueMessage(msg, doneChan)\n\t<-doneChan\n}\n\n// handlePingMsg is invoked when a peer receives a ping bitcoin message.  For\n// recent clients (protocol version > BIP0031Version), it replies with a pong\n// message.  For older clients, it does nothing and anything other than failure\n// is considered a successful ping.\nfunc (p *Peer) handlePingMsg(msg *wire.MsgPing) {\n\t// Only reply with pong if the message is from a new enough client.\n\tif p.ProtocolVersion() > wire.BIP0031Version {\n\t\t// Include nonce from ping so pong can be identified.\n\t\tp.QueueMessage(wire.NewMsgPong(msg.Nonce), nil)\n\t}\n}\n\n// handlePongMsg is invoked when a peer receives a pong bitcoin message.  It\n// updates the ping statistics as required for recent clients (protocol\n// version > BIP0031Version).  There is no effect for older clients or when a\n// ping was not previously sent.\nfunc (p *Peer) handlePongMsg(msg *wire.MsgPong) {\n\t// Arguably we could use a buffered channel here sending data\n\t// in a fifo manner whenever we send a ping, or a list keeping track of\n\t// the times of each ping. For now we just make a best effort and\n\t// only record stats if it was for the last ping sent. Any preceding\n\t// and overlapping pings will be ignored. It is unlikely to occur\n\t// without large usage of the ping rpc call since we ping infrequently\n\t// enough that if they overlap we would have timed out the peer.\n\tif p.ProtocolVersion() > wire.BIP0031Version {\n\t\tp.statsMtx.Lock()\n\t\tif p.lastPingNonce != 0 && msg.Nonce == p.lastPingNonce {\n\t\t\tp.lastPingMicros = time.Since(p.lastPingTime).Nanoseconds()\n\t\t\tp.lastPingMicros /= 1000 // convert to usec.\n\t\t\tp.lastPingNonce = 0\n\t\t}\n\t\tp.statsMtx.Unlock()\n\t}\n}\n\n// readMessage reads the next bitcoin message from the peer with logging. The\n// partial bool indicates that we've partially read a message already. In this\n// case, we use the ReadPartialMessageWithEncodingN function.\nfunc (p *Peer) readMessage(encoding wire.MessageEncoding, partial bool) (\n\twire.Message, []byte, error) {\n\n\tvar (\n\t\tn         int\n\t\tmsg       wire.Message\n\t\tbuf       []byte\n\t\tplaintext []byte\n\t\terr       error\n\t)\n\n\tif p.cfg.UsingV2Conn {\n\t\tplaintext, err = p.V2Transport.V2ReceivePacket(nil)\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\tmsg, buf, err = wire.ReadV2MessageN(\n\t\t\tplaintext, p.ProtocolVersion(), encoding,\n\t\t)\n\t\tn = len(plaintext)\n\t} else if partial {\n\t\tn, msg, buf, err = wire.ReadPartialMessageWithEncodingN(\n\t\t\tp.conn, p.ProtocolVersion(), p.cfg.ChainParams.Net, encoding,\n\t\t\tp.V2Transport.ReceivedPrefix(),\n\t\t)\n\t} else {\n\t\tn, msg, buf, err = wire.ReadMessageWithEncodingN(\n\t\t\tp.conn, p.ProtocolVersion(), p.cfg.ChainParams.Net, encoding,\n\t\t)\n\t}\n\n\tatomic.AddUint64(&p.bytesReceived, uint64(n))\n\tif p.cfg.Listeners.OnRead != nil {\n\t\tp.cfg.Listeners.OnRead(p, n, msg, err)\n\t}\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// Use closures to log expensive operations so they are only run when\n\t// the logging level requires it.\n\tlog.Debugf(\"%v\", newLogClosure(func() string {\n\t\t// Debug summary of message.\n\t\tsummary := messageSummary(msg)\n\t\tif len(summary) > 0 {\n\t\t\tsummary = \" (\" + summary + \")\"\n\t\t}\n\t\treturn fmt.Sprintf(\"Received %v%s from %s\",\n\t\t\tmsg.Command(), summary, p)\n\t}))\n\tlog.Tracef(\"%v\", newLogClosure(func() string {\n\t\treturn spew.Sdump(msg)\n\t}))\n\tlog.Tracef(\"%v\", newLogClosure(func() string {\n\t\treturn spew.Sdump(buf)\n\t}))\n\n\treturn msg, buf, nil\n}\n\n// writeMessage sends a bitcoin message to the peer with logging.\nfunc (p *Peer) writeMessage(msg wire.Message, enc wire.MessageEncoding) error {\n\t// Don't do anything if we're disconnecting.\n\tif atomic.LoadInt32(&p.disconnect) != 0 {\n\t\treturn nil\n\t}\n\n\tvar (\n\t\tbuf bytes.Buffer\n\t\tn   int\n\t\terr error\n\t)\n\n\tif p.cfg.UsingV2Conn {\n\t\t_, err = wire.WriteV2MessageN(&buf, msg, p.ProtocolVersion(), enc)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t_, n, err = p.V2Transport.V2EncPacket(buf.Bytes(), nil, false)\n\t} else {\n\t\tn, err = wire.WriteMessageWithEncodingN(\n\t\t\tp.conn, msg, p.ProtocolVersion(), p.cfg.ChainParams.Net, enc,\n\t\t)\n\t}\n\n\t// Use closures to log expensive operations so they are only run when\n\t// the logging level requires it.\n\tlog.Debugf(\"%v\", newLogClosure(func() string {\n\t\t// Debug summary of message.\n\t\tsummary := messageSummary(msg)\n\t\tif len(summary) > 0 {\n\t\t\tsummary = \" (\" + summary + \")\"\n\t\t}\n\t\treturn fmt.Sprintf(\"Sending %v%s to %s\", msg.Command(),\n\t\t\tsummary, p)\n\t}))\n\tlog.Tracef(\"%v\", newLogClosure(func() string {\n\t\treturn spew.Sdump(msg)\n\t}))\n\tlog.Tracef(\"%v\", newLogClosure(func() string {\n\t\treturn spew.Sdump(buf.Bytes())\n\t}))\n\n\tatomic.AddUint64(&p.bytesSent, uint64(n))\n\tif p.cfg.Listeners.OnWrite != nil {\n\t\tp.cfg.Listeners.OnWrite(p, n, msg, err)\n\t}\n\treturn err\n}\n\n// isAllowedReadError returns whether or not the passed error is allowed without\n// disconnecting the peer.  In particular, regression tests need to be allowed\n// to send malformed messages without the peer being disconnected.\nfunc (p *Peer) isAllowedReadError(err error) bool {\n\t// Only allow read errors in regression test mode.\n\tif p.cfg.ChainParams.Net != wire.TestNet {\n\t\treturn false\n\t}\n\n\t// Don't allow the error if it's not specifically a malformed message error.\n\tif _, ok := err.(*wire.MessageError); !ok {\n\t\treturn false\n\t}\n\n\t// Don't allow the error if it's not coming from localhost or the\n\t// hostname can't be determined for some reason.\n\thost, _, err := net.SplitHostPort(p.addr)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\tif host != \"127.0.0.1\" && host != \"localhost\" {\n\t\treturn false\n\t}\n\n\t// Allowed if all checks passed.\n\treturn true\n}\n\n// shouldHandleReadError returns whether or not the passed error, which is\n// expected to have come from reading from the remote peer in the inHandler,\n// should be logged and responded to with a reject message.\nfunc (p *Peer) shouldHandleReadError(err error) bool {\n\t// No logging or reject message when the peer is being forcibly\n\t// disconnected.\n\tif atomic.LoadInt32(&p.disconnect) != 0 {\n\t\treturn false\n\t}\n\n\t// No logging or reject message when the remote peer has been\n\t// disconnected.\n\tif err == io.EOF {\n\t\treturn false\n\t}\n\tif opErr, ok := err.(*net.OpError); ok && !opErr.Temporary() {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// maybeAddDeadline potentially adds a deadline for the appropriate expected\n// response for the passed wire protocol command to the pending responses map.\nfunc (p *Peer) maybeAddDeadline(pendingResponses map[string]time.Time, msgCmd string) {\n\t// Setup a deadline for each message being sent that expects a response.\n\t//\n\t// NOTE: Pings are intentionally ignored here since they are typically\n\t// sent asynchronously and as a result of a long backlock of messages,\n\t// such as is typical in the case of initial block download, the\n\t// response won't be received in time.\n\tdeadline := time.Now().Add(stallResponseTimeout)\n\tswitch msgCmd {\n\tcase wire.CmdVersion:\n\t\t// Expects a verack message.\n\t\tpendingResponses[wire.CmdVerAck] = deadline\n\n\tcase wire.CmdMemPool:\n\t\t// Expects an inv message.\n\t\tpendingResponses[wire.CmdInv] = deadline\n\n\tcase wire.CmdGetBlocks:\n\t\t// Expects an inv message.\n\t\tpendingResponses[wire.CmdInv] = deadline\n\n\tcase wire.CmdGetData:\n\t\t// Expects a block, merkleblock, tx, or notfound message.\n\t\tpendingResponses[wire.CmdBlock] = deadline\n\t\tpendingResponses[wire.CmdMerkleBlock] = deadline\n\t\tpendingResponses[wire.CmdTx] = deadline\n\t\tpendingResponses[wire.CmdNotFound] = deadline\n\n\tcase wire.CmdGetHeaders:\n\t\t// Expects a headers message.  Use a longer deadline since it\n\t\t// can take a while for the remote peer to load all of the\n\t\t// headers.\n\t\tdeadline = time.Now().Add(stallResponseTimeout * 3)\n\t\tpendingResponses[wire.CmdHeaders] = deadline\n\t}\n}\n\n// stallHandler handles stall detection for the peer.  This entails keeping\n// track of expected responses and assigning them deadlines while accounting for\n// the time spent in callbacks.  It must be run as a goroutine.\nfunc (p *Peer) stallHandler() {\n\t// These variables are used to adjust the deadline times forward by the\n\t// time it takes callbacks to execute.  This is done because new\n\t// messages aren't read until the previous one is finished processing\n\t// (which includes callbacks), so the deadline for receiving a response\n\t// for a given message must account for the processing time as well.\n\tvar handlerActive bool\n\tvar handlersStartTime time.Time\n\tvar deadlineOffset time.Duration\n\n\t// pendingResponses tracks the expected response deadline times.\n\tpendingResponses := make(map[string]time.Time)\n\n\t// stallTicker is used to periodically check pending responses that have\n\t// exceeded the expected deadline and disconnect the peer due to\n\t// stalling.\n\tstallTicker := time.NewTicker(stallTickInterval)\n\tdefer stallTicker.Stop()\n\n\t// ioStopped is used to detect when both the input and output handler\n\t// goroutines are done.\n\tvar ioStopped bool\nout:\n\tfor {\n\t\tselect {\n\t\tcase msg := <-p.stallControl:\n\t\t\tif p.cfg.DisableStallHandler {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tswitch msg.command {\n\t\t\tcase sccSendMessage:\n\t\t\t\t// Add a deadline for the expected response\n\t\t\t\t// message if needed.\n\t\t\t\tp.maybeAddDeadline(pendingResponses,\n\t\t\t\t\tmsg.message.Command())\n\n\t\t\tcase sccReceiveMessage:\n\t\t\t\t// Remove received messages from the expected\n\t\t\t\t// response map.  Since certain commands expect\n\t\t\t\t// one of a group of responses, remove\n\t\t\t\t// everything in the expected group accordingly.\n\t\t\t\tswitch msgCmd := msg.message.Command(); msgCmd {\n\t\t\t\tcase wire.CmdBlock:\n\t\t\t\t\tfallthrough\n\t\t\t\tcase wire.CmdMerkleBlock:\n\t\t\t\t\tfallthrough\n\t\t\t\tcase wire.CmdTx:\n\t\t\t\t\tfallthrough\n\t\t\t\tcase wire.CmdNotFound:\n\t\t\t\t\tdelete(pendingResponses, wire.CmdBlock)\n\t\t\t\t\tdelete(pendingResponses, wire.CmdMerkleBlock)\n\t\t\t\t\tdelete(pendingResponses, wire.CmdTx)\n\t\t\t\t\tdelete(pendingResponses, wire.CmdNotFound)\n\n\t\t\t\tdefault:\n\t\t\t\t\tdelete(pendingResponses, msgCmd)\n\t\t\t\t}\n\n\t\t\tcase sccHandlerStart:\n\t\t\t\t// Warn on unbalanced callback signalling.\n\t\t\t\tif handlerActive {\n\t\t\t\t\tlog.Warn(\"Received handler start \" +\n\t\t\t\t\t\t\"control command while a \" +\n\t\t\t\t\t\t\"handler is already active\")\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\thandlerActive = true\n\t\t\t\thandlersStartTime = time.Now()\n\n\t\t\tcase sccHandlerDone:\n\t\t\t\t// Warn on unbalanced callback signalling.\n\t\t\t\tif !handlerActive {\n\t\t\t\t\tlog.Warn(\"Received handler done \" +\n\t\t\t\t\t\t\"control command when a \" +\n\t\t\t\t\t\t\"handler is not already active\")\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// Extend active deadlines by the time it took\n\t\t\t\t// to execute the callback.\n\t\t\t\tduration := time.Since(handlersStartTime)\n\t\t\t\tdeadlineOffset += duration\n\t\t\t\thandlerActive = false\n\n\t\t\tdefault:\n\t\t\t\tlog.Warnf(\"Unsupported message command %v\",\n\t\t\t\t\tmsg.command)\n\t\t\t}\n\n\t\tcase <-stallTicker.C:\n\t\t\tif p.cfg.DisableStallHandler {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Calculate the offset to apply to the deadline based\n\t\t\t// on how long the handlers have taken to execute since\n\t\t\t// the last tick.\n\t\t\tnow := time.Now()\n\t\t\toffset := deadlineOffset\n\t\t\tif handlerActive {\n\t\t\t\toffset += now.Sub(handlersStartTime)\n\t\t\t}\n\n\t\t\t// Disconnect the peer if any of the pending responses\n\t\t\t// don't arrive by their adjusted deadline.\n\t\t\tfor command, deadline := range pendingResponses {\n\t\t\t\tif now.Before(deadline.Add(offset)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tlog.Debugf(\"Peer %s appears to be stalled or \"+\n\t\t\t\t\t\"misbehaving, %s timeout -- \"+\n\t\t\t\t\t\"disconnecting\", p, command)\n\t\t\t\tp.Disconnect()\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Reset the deadline offset for the next tick.\n\t\t\tdeadlineOffset = 0\n\n\t\tcase <-p.inQuit:\n\t\t\t// The stall handler can exit once both the input and\n\t\t\t// output handler goroutines are done.\n\t\t\tif ioStopped {\n\t\t\t\tbreak out\n\t\t\t}\n\t\t\tioStopped = true\n\n\t\tcase <-p.outQuit:\n\t\t\t// The stall handler can exit once both the input and\n\t\t\t// output handler goroutines are done.\n\t\t\tif ioStopped {\n\t\t\t\tbreak out\n\t\t\t}\n\t\t\tioStopped = true\n\t\t}\n\t}\n\n\t// Drain any wait channels before going away so there is nothing left\n\t// waiting on this goroutine.\ncleanup:\n\tfor {\n\t\tselect {\n\t\tcase <-p.stallControl:\n\t\tdefault:\n\t\t\tbreak cleanup\n\t\t}\n\t}\n\tlog.Tracef(\"Peer stall handler done for %s\", p)\n}\n\n// inHandler handles all incoming messages for the peer.  It must be run as a\n// goroutine.\nfunc (p *Peer) inHandler() {\n\t// Must be first defer (runs last) to catch panics from\n\t// everything, including other defers.\n\tdefer p.recoverFromPanic()\n\tdefer close(p.inQuit)\n\tdefer p.Disconnect()\n\tdefer log.Tracef(\"Peer input handler done for %s\", p)\n\n\t// The timer is stopped when a new message is received and reset after it\n\t// is processed.\n\tidleTimer := time.AfterFunc(idleTimeout, func() {\n\t\tlog.Warnf(\"Peer %s no answer for %s -- disconnecting\", p, idleTimeout)\n\t\tp.Disconnect()\n\t})\n\tdefer idleTimer.Stop()\n\nout:\n\tfor atomic.LoadInt32(&p.disconnect) == 0 {\n\t\t// Read a message and stop the idle timer as soon as the read\n\t\t// is done.  The timer is reset below for the next iteration if\n\t\t// needed.\n\t\trmsg, buf, err := p.readMessage(p.wireEncoding, false)\n\t\tidleTimer.Stop()\n\t\tif err != nil {\n\t\t\t// In order to allow regression tests with malformed messages, don't\n\t\t\t// disconnect the peer when we're in regression test mode and the\n\t\t\t// error is one of the allowed errors.\n\t\t\tif p.isAllowedReadError(err) {\n\t\t\t\tlog.Errorf(\"Allowed test error from %s: %v\", p, err)\n\t\t\t\tidleTimer.Reset(idleTimeout)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Since the protocol version is 70016 but we don't\n\t\t\t// implement compact blocks, we have to ignore unknown\n\t\t\t// messages after the version-verack handshake. This\n\t\t\t// matches bitcoind's behavior and is necessary since\n\t\t\t// compact blocks negotiation occurs after the\n\t\t\t// handshake.\n\t\t\tif err == wire.ErrUnknownMessage {\n\t\t\t\tlog.Debugf(\"Received unknown message from %s:\"+\n\t\t\t\t\t\" %v\", p, err)\n\t\t\t\tidleTimer.Reset(idleTimeout)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Only log the error and send reject message if the\n\t\t\t// local peer is not forcibly disconnecting and the\n\t\t\t// remote peer has not disconnected.\n\t\t\tif p.shouldHandleReadError(err) {\n\t\t\t\terrMsg := fmt.Sprintf(\"Can't read message from %s: %v\", p, err)\n\t\t\t\tif err != io.ErrUnexpectedEOF {\n\t\t\t\t\tlog.Errorf(errMsg)\n\t\t\t\t}\n\n\t\t\t\t// Push a reject message for the malformed message and wait for\n\t\t\t\t// the message to be sent before disconnecting.\n\t\t\t\t//\n\t\t\t\t// NOTE: Ideally this would include the command in the header if\n\t\t\t\t// at least that much of the message was valid, but that is not\n\t\t\t\t// currently exposed by wire, so just used malformed for the\n\t\t\t\t// command.\n\t\t\t\tp.PushRejectMsg(\"malformed\", wire.RejectMalformed, errMsg, nil,\n\t\t\t\t\ttrue)\n\t\t\t}\n\t\t\tbreak out\n\t\t}\n\t\tatomic.StoreInt64(&p.lastRecv, time.Now().Unix())\n\t\tp.stallControl <- stallControlMsg{sccReceiveMessage, rmsg}\n\n\t\t// Handle each supported message type.\n\t\tp.stallControl <- stallControlMsg{sccHandlerStart, rmsg}\n\t\tswitch msg := rmsg.(type) {\n\t\tcase *wire.MsgVersion:\n\t\t\t// Limit to one version message per peer.\n\t\t\tp.PushRejectMsg(msg.Command(), wire.RejectDuplicate,\n\t\t\t\t\"duplicate version message\", nil, true)\n\t\t\tbreak out\n\n\t\tcase *wire.MsgVerAck:\n\t\t\t// Limit to one verack message per peer.\n\t\t\tp.PushRejectMsg(\n\t\t\t\tmsg.Command(), wire.RejectDuplicate,\n\t\t\t\t\"duplicate verack message\", nil, true,\n\t\t\t)\n\t\t\tbreak out\n\n\t\tcase *wire.MsgSendAddrV2:\n\t\t\t// Disconnect if peer sends this after the handshake is\n\t\t\t// completed.\n\t\t\tbreak out\n\n\t\tcase *wire.MsgGetAddr:\n\t\t\tif p.cfg.Listeners.OnGetAddr != nil {\n\t\t\t\tp.cfg.Listeners.OnGetAddr(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgAddr:\n\t\t\tif p.cfg.Listeners.OnAddr != nil {\n\t\t\t\tp.cfg.Listeners.OnAddr(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgAddrV2:\n\t\t\tif p.cfg.Listeners.OnAddrV2 != nil {\n\t\t\t\tp.cfg.Listeners.OnAddrV2(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgPing:\n\t\t\tp.handlePingMsg(msg)\n\t\t\tif p.cfg.Listeners.OnPing != nil {\n\t\t\t\tp.cfg.Listeners.OnPing(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgPong:\n\t\t\tp.handlePongMsg(msg)\n\t\t\tif p.cfg.Listeners.OnPong != nil {\n\t\t\t\tp.cfg.Listeners.OnPong(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgMemPool:\n\t\t\tif p.cfg.Listeners.OnMemPool != nil {\n\t\t\t\tp.cfg.Listeners.OnMemPool(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgTx:\n\t\t\tif p.cfg.Listeners.OnTx != nil {\n\t\t\t\tp.cfg.Listeners.OnTx(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgBlock:\n\t\t\tif p.cfg.Listeners.OnBlock != nil {\n\t\t\t\tp.cfg.Listeners.OnBlock(p, msg, buf)\n\t\t\t}\n\n\t\tcase *wire.MsgInv:\n\t\t\tif p.cfg.Listeners.OnInv != nil {\n\t\t\t\tp.cfg.Listeners.OnInv(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgHeaders:\n\t\t\tif p.cfg.Listeners.OnHeaders != nil {\n\t\t\t\tp.cfg.Listeners.OnHeaders(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgNotFound:\n\t\t\tif p.cfg.Listeners.OnNotFound != nil {\n\t\t\t\tp.cfg.Listeners.OnNotFound(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgGetData:\n\t\t\tif p.cfg.Listeners.OnGetData != nil {\n\t\t\t\tp.cfg.Listeners.OnGetData(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgGetBlocks:\n\t\t\tif p.cfg.Listeners.OnGetBlocks != nil {\n\t\t\t\tp.cfg.Listeners.OnGetBlocks(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgGetHeaders:\n\t\t\tif p.cfg.Listeners.OnGetHeaders != nil {\n\t\t\t\tp.cfg.Listeners.OnGetHeaders(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgGetCFilters:\n\t\t\tif p.cfg.Listeners.OnGetCFilters != nil {\n\t\t\t\tp.cfg.Listeners.OnGetCFilters(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgGetCFHeaders:\n\t\t\tif p.cfg.Listeners.OnGetCFHeaders != nil {\n\t\t\t\tp.cfg.Listeners.OnGetCFHeaders(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgGetCFCheckpt:\n\t\t\tif p.cfg.Listeners.OnGetCFCheckpt != nil {\n\t\t\t\tp.cfg.Listeners.OnGetCFCheckpt(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgCFilter:\n\t\t\tif p.cfg.Listeners.OnCFilter != nil {\n\t\t\t\tp.cfg.Listeners.OnCFilter(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgCFHeaders:\n\t\t\tif p.cfg.Listeners.OnCFHeaders != nil {\n\t\t\t\tp.cfg.Listeners.OnCFHeaders(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgFeeFilter:\n\t\t\tif p.cfg.Listeners.OnFeeFilter != nil {\n\t\t\t\tp.cfg.Listeners.OnFeeFilter(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgFilterAdd:\n\t\t\tif p.cfg.Listeners.OnFilterAdd != nil {\n\t\t\t\tp.cfg.Listeners.OnFilterAdd(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgFilterClear:\n\t\t\tif p.cfg.Listeners.OnFilterClear != nil {\n\t\t\t\tp.cfg.Listeners.OnFilterClear(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgFilterLoad:\n\t\t\tif p.cfg.Listeners.OnFilterLoad != nil {\n\t\t\t\tp.cfg.Listeners.OnFilterLoad(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgMerkleBlock:\n\t\t\tif p.cfg.Listeners.OnMerkleBlock != nil {\n\t\t\t\tp.cfg.Listeners.OnMerkleBlock(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgReject:\n\t\t\tif p.cfg.Listeners.OnReject != nil {\n\t\t\t\tp.cfg.Listeners.OnReject(p, msg)\n\t\t\t}\n\n\t\tcase *wire.MsgSendHeaders:\n\t\t\tp.flagsMtx.Lock()\n\t\t\tp.sendHeadersPreferred = true\n\t\t\tp.flagsMtx.Unlock()\n\n\t\t\tif p.cfg.Listeners.OnSendHeaders != nil {\n\t\t\t\tp.cfg.Listeners.OnSendHeaders(p, msg)\n\t\t\t}\n\n\t\tdefault:\n\t\t\tlog.Debugf(\"Received unhandled message of type %v \"+\n\t\t\t\t\"from %v\", rmsg.Command(), p)\n\t\t}\n\t\tp.stallControl <- stallControlMsg{sccHandlerDone, rmsg}\n\n\t\t// A message was received so reset the idle timer.\n\t\tidleTimer.Reset(idleTimeout)\n\t}\n}\n\n// queueHandler handles the queuing of outgoing data for the peer. This runs as\n// a muxer for various sources of input so we can ensure that server and peer\n// handlers will not block on us sending a message.  That data is then passed on\n// to outHandler to be actually written.\nfunc (p *Peer) queueHandler() {\n\tpendingMsgs := list.New()\n\tinvSendQueue := list.New()\n\ttrickleTicker := time.NewTicker(p.cfg.TrickleInterval)\n\tdefer trickleTicker.Stop()\n\n\t// We keep the waiting flag so that we know if we have a message queued\n\t// to the outHandler or not.  We could use the presence of a head of\n\t// the list for this but then we have rather racy concerns about whether\n\t// it has gotten it at cleanup time - and thus who sends on the\n\t// message's done channel.  To avoid such confusion we keep a different\n\t// flag and pendingMsgs only contains messages that we have not yet\n\t// passed to outHandler.\n\twaiting := false\n\n\t// To avoid duplication below.\n\tqueuePacket := func(msg outMsg, list *list.List, waiting bool) bool {\n\t\tif !waiting {\n\t\t\tp.sendQueue <- msg\n\t\t} else {\n\t\t\tlist.PushBack(msg)\n\t\t}\n\t\t// we are always waiting now.\n\t\treturn true\n\t}\nout:\n\tfor {\n\t\tselect {\n\t\tcase msg := <-p.outputQueue:\n\t\t\twaiting = queuePacket(msg, pendingMsgs, waiting)\n\n\t\t// This channel is notified when a message has been sent across\n\t\t// the network socket.\n\t\tcase <-p.sendDoneQueue:\n\t\t\t// No longer waiting if there are no more messages\n\t\t\t// in the pending messages queue.\n\t\t\tnext := pendingMsgs.Front()\n\t\t\tif next == nil {\n\t\t\t\twaiting = false\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Notify the outHandler about the next item to\n\t\t\t// asynchronously send.\n\t\t\tval := pendingMsgs.Remove(next)\n\t\t\tp.sendQueue <- val.(outMsg)\n\n\t\tcase iv := <-p.outputInvChan:\n\t\t\t// No handshake?  They'll find out soon enough.\n\t\t\tif p.VersionKnown() {\n\t\t\t\t// If this is a new block, then we'll blast it\n\t\t\t\t// out immediately, sipping the inv trickle\n\t\t\t\t// queue.\n\t\t\t\tif iv.Type == wire.InvTypeBlock ||\n\t\t\t\t\tiv.Type == wire.InvTypeWitnessBlock {\n\n\t\t\t\t\tinvMsg := wire.NewMsgInvSizeHint(1)\n\t\t\t\t\tinvMsg.AddInvVect(iv)\n\t\t\t\t\twaiting = queuePacket(outMsg{msg: invMsg},\n\t\t\t\t\t\tpendingMsgs, waiting)\n\t\t\t\t} else {\n\t\t\t\t\tinvSendQueue.PushBack(iv)\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase <-trickleTicker.C:\n\t\t\t// Don't send anything if we're disconnecting or there\n\t\t\t// is no queued inventory.\n\t\t\t// version is known if send queue has any entries.\n\t\t\tif atomic.LoadInt32(&p.disconnect) != 0 ||\n\t\t\t\tinvSendQueue.Len() == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Create and send as many inv messages as needed to\n\t\t\t// drain the inventory send queue.\n\t\t\tinvMsg := wire.NewMsgInvSizeHint(uint(invSendQueue.Len()))\n\t\t\tfor e := invSendQueue.Front(); e != nil; e = invSendQueue.Front() {\n\t\t\t\tiv := invSendQueue.Remove(e).(*wire.InvVect)\n\n\t\t\t\t// Don't send inventory that became known after\n\t\t\t\t// the initial check.\n\t\t\t\tif p.knownInventory.Contains(iv) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tinvMsg.AddInvVect(iv)\n\t\t\t\tif len(invMsg.InvList) >= maxInvTrickleSize {\n\t\t\t\t\twaiting = queuePacket(\n\t\t\t\t\t\toutMsg{msg: invMsg},\n\t\t\t\t\t\tpendingMsgs, waiting)\n\t\t\t\t\tinvMsg = wire.NewMsgInvSizeHint(uint(invSendQueue.Len()))\n\t\t\t\t}\n\n\t\t\t\t// Add the inventory that is being relayed to\n\t\t\t\t// the known inventory for the peer.\n\t\t\t\tp.AddKnownInventory(iv)\n\t\t\t}\n\t\t\tif len(invMsg.InvList) > 0 {\n\t\t\t\twaiting = queuePacket(outMsg{msg: invMsg},\n\t\t\t\t\tpendingMsgs, waiting)\n\t\t\t}\n\n\t\tcase <-p.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\t// Drain any wait channels before we go away so we don't leave something\n\t// waiting for us.\n\tfor e := pendingMsgs.Front(); e != nil; e = pendingMsgs.Front() {\n\t\tval := pendingMsgs.Remove(e)\n\t\tmsg := val.(outMsg)\n\t\tif msg.doneChan != nil {\n\t\t\tmsg.doneChan <- struct{}{}\n\t\t}\n\t}\ncleanup:\n\tfor {\n\t\tselect {\n\t\tcase msg := <-p.outputQueue:\n\t\t\tif msg.doneChan != nil {\n\t\t\t\tmsg.doneChan <- struct{}{}\n\t\t\t}\n\t\tcase <-p.outputInvChan:\n\t\t\t// Just drain channel\n\t\t// sendDoneQueue is buffered so doesn't need draining.\n\t\tdefault:\n\t\t\tbreak cleanup\n\t\t}\n\t}\n\tclose(p.queueQuit)\n\tlog.Tracef(\"Peer queue handler done for %s\", p)\n}\n\n// shouldLogWriteError returns whether or not the passed error, which is\n// expected to have come from writing to the remote peer in the outHandler,\n// should be logged.\nfunc (p *Peer) shouldLogWriteError(err error) bool {\n\t// No logging when the peer is being forcibly disconnected.\n\tif atomic.LoadInt32(&p.disconnect) != 0 {\n\t\treturn false\n\t}\n\n\t// No logging when the remote peer has been disconnected.\n\tif err == io.EOF {\n\t\treturn false\n\t}\n\tif opErr, ok := err.(*net.OpError); ok && !opErr.Temporary() {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// outHandler handles all outgoing messages for the peer.  It must be run as a\n// goroutine.  It uses a buffered channel to serialize output messages while\n// allowing the sender to continue running asynchronously.\nfunc (p *Peer) outHandler() {\nout:\n\tfor {\n\t\tselect {\n\t\tcase msg := <-p.sendQueue:\n\t\t\tswitch m := msg.msg.(type) {\n\t\t\tcase *wire.MsgPing:\n\t\t\t\t// Only expects a pong message in later protocol\n\t\t\t\t// versions.  Also set up statistics.\n\t\t\t\tif p.ProtocolVersion() > wire.BIP0031Version {\n\t\t\t\t\tp.statsMtx.Lock()\n\t\t\t\t\tp.lastPingNonce = m.Nonce\n\t\t\t\t\tp.lastPingTime = time.Now()\n\t\t\t\t\tp.statsMtx.Unlock()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tp.stallControl <- stallControlMsg{sccSendMessage, msg.msg}\n\n\t\t\terr := p.writeMessage(msg.msg, msg.encoding)\n\t\t\tif err != nil {\n\t\t\t\tp.Disconnect()\n\t\t\t\tif p.shouldLogWriteError(err) {\n\t\t\t\t\tlog.Errorf(\"Failed to send message to \"+\n\t\t\t\t\t\t\"%s: %v\", p, err)\n\t\t\t\t}\n\t\t\t\tif msg.doneChan != nil {\n\t\t\t\t\tmsg.doneChan <- struct{}{}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// At this point, the message was successfully sent, so\n\t\t\t// update the last send time, signal the sender of the\n\t\t\t// message that it has been sent (if requested), and\n\t\t\t// signal the send queue to the deliver the next queued\n\t\t\t// message.\n\t\t\tatomic.StoreInt64(&p.lastSend, time.Now().Unix())\n\t\t\tif msg.doneChan != nil {\n\t\t\t\tmsg.doneChan <- struct{}{}\n\t\t\t}\n\t\t\tp.sendDoneQueue <- struct{}{}\n\n\t\tcase <-p.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\t<-p.queueQuit\n\n\t// Drain any wait channels before we go away so we don't leave something\n\t// waiting for us. We have waited on queueQuit and thus we can be sure\n\t// that we will not miss anything sent on sendQueue.\ncleanup:\n\tfor {\n\t\tselect {\n\t\tcase msg := <-p.sendQueue:\n\t\t\tif msg.doneChan != nil {\n\t\t\t\tmsg.doneChan <- struct{}{}\n\t\t\t}\n\t\t\t// no need to send on sendDoneQueue since queueHandler\n\t\t\t// has been waited on and already exited.\n\t\tdefault:\n\t\t\tbreak cleanup\n\t\t}\n\t}\n\tclose(p.outQuit)\n\tlog.Tracef(\"Peer output handler done for %s\", p)\n}\n\n// pingHandler periodically pings the peer.  It must be run as a goroutine.\nfunc (p *Peer) pingHandler() {\n\tpingTicker := time.NewTicker(pingInterval)\n\tdefer pingTicker.Stop()\n\nout:\n\tfor {\n\t\tselect {\n\t\tcase <-pingTicker.C:\n\t\t\tnonce, err := wire.RandomUint64()\n\t\t\tif err != nil {\n\t\t\t\tlog.Errorf(\"Not sending ping to %s: %v\", p, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tp.QueueMessage(wire.NewMsgPing(nonce), nil)\n\n\t\tcase <-p.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n}\n\n// QueueMessage adds the passed bitcoin message to the peer send queue.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) QueueMessage(msg wire.Message, doneChan chan<- struct{}) {\n\tp.QueueMessageWithEncoding(msg, doneChan, wire.BaseEncoding)\n}\n\n// QueueMessageWithEncoding adds the passed bitcoin message to the peer send\n// queue. This function is identical to QueueMessage, however it allows the\n// caller to specify the wire encoding type that should be used when\n// encoding/decoding blocks and transactions.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) QueueMessageWithEncoding(msg wire.Message, doneChan chan<- struct{},\n\tencoding wire.MessageEncoding) {\n\n\t// Avoid risk of deadlock if goroutine already exited.  The goroutine\n\t// we will be sending to hangs around until it knows for a fact that\n\t// it is marked as disconnected and *then* it drains the channels.\n\tif !p.Connected() {\n\t\tif doneChan != nil {\n\t\t\tgo func() {\n\t\t\t\tdoneChan <- struct{}{}\n\t\t\t}()\n\t\t}\n\t\treturn\n\t}\n\tp.outputQueue <- outMsg{msg: msg, encoding: encoding, doneChan: doneChan}\n}\n\n// QueueInventory adds the passed inventory to the inventory send queue which\n// might not be sent right away, rather it is trickled to the peer in batches.\n// Inventory that the peer is already known to have is ignored.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) QueueInventory(invVect *wire.InvVect) {\n\t// Don't add the inventory to the send queue if the peer is already\n\t// known to have it.\n\tif p.knownInventory.Contains(invVect) {\n\t\treturn\n\t}\n\n\t// Avoid risk of deadlock if goroutine already exited.  The goroutine\n\t// we will be sending to hangs around until it knows for a fact that\n\t// it is marked as disconnected and *then* it drains the channels.\n\tif !p.Connected() {\n\t\treturn\n\t}\n\n\tp.outputInvChan <- invVect\n}\n\n// Connected returns whether or not the peer is currently connected.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) Connected() bool {\n\treturn atomic.LoadInt32(&p.connected) != 0 &&\n\t\tatomic.LoadInt32(&p.disconnect) == 0\n}\n\n// recoverFromPanic catches any panic that occurs in a peer goroutine,\n// logs the error with a stack trace, and disconnects the peer. This\n// prevents a single malformed message from crashing the entire node.\nfunc (p *Peer) recoverFromPanic() {\n\tif r := recover(); r != nil {\n\t\tlog.Errorf(\"Recovered panic in peer %s: %v\\n%s\",\n\t\t\tp, r, debug.Stack())\n\t\tp.Disconnect()\n\t}\n}\n\n// Disconnect disconnects the peer by closing the connection.  Calling this\n// function when the peer is already disconnected or in the process of\n// disconnecting will have no effect.\nfunc (p *Peer) Disconnect() {\n\tif atomic.AddInt32(&p.disconnect, 1) != 1 {\n\t\treturn\n\t}\n\n\tlog.Tracef(\"Disconnecting %s\", p)\n\tif atomic.LoadInt32(&p.connected) != 0 {\n\t\tp.conn.Close()\n\t}\n\tclose(p.quit)\n}\n\n// readRemoteVersionMsg waits for the next message to arrive from the remote\n// peer.  If the next message is not a version message or the version is not\n// acceptable then return an error.  The readPartial bool denotes whether we\n// need to read the rest of a partially-received version message.  This only\n// happens with implicitly downgraded v2->v1 connections.\nfunc (p *Peer) readRemoteVersionMsg(readPartial bool) error {\n\tvar (\n\t\tremoteMsg wire.Message\n\t\terr       error\n\t)\n\n\tremoteMsg, _, err = p.readMessage(wire.LatestEncoding, readPartial)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Notify and disconnect clients if the first message is not a version\n\t// message.\n\tmsg, ok := remoteMsg.(*wire.MsgVersion)\n\tif !ok {\n\t\treason := \"a version message must precede all others\"\n\t\trejectMsg := wire.NewMsgReject(msg.Command(), wire.RejectMalformed,\n\t\t\treason)\n\t\t_ = p.writeMessage(rejectMsg, wire.LatestEncoding)\n\t\treturn errors.New(reason)\n\t}\n\n\t// Detect self connections.\n\tif !p.cfg.AllowSelfConns && sentNonces.Contains(msg.Nonce) {\n\t\treturn errors.New(\"disconnecting peer connected to self\")\n\t}\n\n\t// Negotiate the protocol version and set the services to what the remote\n\t// peer advertised.\n\tp.flagsMtx.Lock()\n\tp.advertisedProtoVer = uint32(msg.ProtocolVersion)\n\tp.protocolVersion = minUint32(p.protocolVersion, p.advertisedProtoVer)\n\tp.versionKnown = true\n\tp.services = msg.Services\n\tp.flagsMtx.Unlock()\n\tlog.Debugf(\"Negotiated protocol version %d for peer %s\",\n\t\tp.protocolVersion, p)\n\n\t// Updating a bunch of stats including block based stats, and the\n\t// peer's time offset.\n\tp.statsMtx.Lock()\n\tp.lastBlock = msg.LastBlock\n\tp.startingHeight = msg.LastBlock\n\tp.timeOffset = msg.Timestamp.Unix() - time.Now().Unix()\n\tp.statsMtx.Unlock()\n\n\t// Set the peer's ID, user agent, and potentially the flag which\n\t// specifies the witness support is enabled.\n\tp.flagsMtx.Lock()\n\tp.id = atomic.AddInt32(&nodeCount, 1)\n\tp.userAgent = msg.UserAgent\n\n\t// Determine if the peer would like to receive witness data with\n\t// transactions, or not.\n\tif p.services&wire.SFNodeWitness == wire.SFNodeWitness {\n\t\tp.witnessEnabled = true\n\t}\n\tp.flagsMtx.Unlock()\n\n\t// Once the version message has been exchanged, we're able to determine\n\t// if this peer knows how to encode witness data over the wire\n\t// protocol. If so, then we'll switch to a decoding mode which is\n\t// prepared for the new transaction format introduced as part of\n\t// BIP0144.\n\tif p.services&wire.SFNodeWitness == wire.SFNodeWitness {\n\t\tp.wireEncoding = wire.WitnessEncoding\n\t}\n\n\t// Invoke the callback if specified.\n\tif p.cfg.Listeners.OnVersion != nil {\n\t\trejectMsg := p.cfg.Listeners.OnVersion(p, msg)\n\t\tif rejectMsg != nil {\n\t\t\t_ = p.writeMessage(rejectMsg, wire.LatestEncoding)\n\t\t\treturn errors.New(rejectMsg.Reason)\n\t\t}\n\t}\n\n\t// Notify and disconnect clients that have a protocol version that is\n\t// too old.\n\t//\n\t// NOTE: If minAcceptableProtocolVersion is raised to be higher than\n\t// wire.RejectVersion, this should send a reject packet before\n\t// disconnecting.\n\tif uint32(msg.ProtocolVersion) < MinAcceptableProtocolVersion {\n\t\t// Send a reject message indicating the protocol version is\n\t\t// obsolete and wait for the message to be sent before\n\t\t// disconnecting.\n\t\treason := fmt.Sprintf(\"protocol version must be %d or greater\",\n\t\t\tMinAcceptableProtocolVersion)\n\t\trejectMsg := wire.NewMsgReject(msg.Command(), wire.RejectObsolete,\n\t\t\treason)\n\t\t_ = p.writeMessage(rejectMsg, wire.LatestEncoding)\n\t\treturn errors.New(reason)\n\t}\n\n\treturn nil\n}\n\n// processRemoteVerAckMsg takes the verack from the remote peer and handles it.\nfunc (p *Peer) processRemoteVerAckMsg(msg *wire.MsgVerAck) {\n\tp.flagsMtx.Lock()\n\tp.verAckReceived = true\n\tp.flagsMtx.Unlock()\n\n\tif p.cfg.Listeners.OnVerAck != nil {\n\t\tp.cfg.Listeners.OnVerAck(p, msg)\n\t}\n}\n\n// localVersionMsg creates a version message that can be used to send to the\n// remote peer.\nfunc (p *Peer) localVersionMsg() (*wire.MsgVersion, error) {\n\tvar blockNum int32\n\tif p.cfg.NewestBlock != nil {\n\t\tvar err error\n\t\t_, blockNum, err = p.cfg.NewestBlock()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\ttheirNA := p.na.ToLegacy()\n\n\t// If p.na is a torv3 hidden service address, we'll need to send over\n\t// an empty NetAddress for their address.\n\tif p.na.IsTorV3() {\n\t\ttheirNA = wire.NewNetAddressIPPort(\n\t\t\tnet.IP([]byte{0, 0, 0, 0}), p.na.Port, p.na.Services,\n\t\t)\n\t}\n\n\t// If we are behind a proxy and the connection comes from the proxy then\n\t// we return an unroutable address as their address. This is to prevent\n\t// leaking the tor proxy address.\n\tif p.cfg.Proxy != \"\" {\n\t\tproxyaddress, _, err := net.SplitHostPort(p.cfg.Proxy)\n\t\t// invalid proxy means poorly configured, be on the safe side.\n\t\tif err != nil || p.na.Addr.String() == proxyaddress {\n\t\t\ttheirNA = wire.NewNetAddressIPPort(net.IP([]byte{0, 0, 0, 0}), 0,\n\t\t\t\ttheirNA.Services)\n\t\t}\n\t}\n\n\t// Create a wire.NetAddress with only the services set to use as the\n\t// \"addrme\" in the version message.\n\t//\n\t// Older nodes previously added the IP and port information to the\n\t// address manager which proved to be unreliable as an inbound\n\t// connection from a peer didn't necessarily mean the peer itself\n\t// accepted inbound connections.\n\t//\n\t// Also, the timestamp is unused in the version message.\n\tourNA := &wire.NetAddress{\n\t\tServices: p.cfg.Services,\n\t}\n\n\t// Generate a unique nonce for this peer so self connections can be\n\t// detected.  This is accomplished by adding it to a size-limited map of\n\t// recently seen nonces.\n\tnonce := uint64(rand.Int63())\n\tsentNonces.Add(nonce)\n\n\t// Version message.\n\tmsg := wire.NewMsgVersion(ourNA, theirNA, nonce, blockNum)\n\tmsg.AddUserAgent(p.cfg.UserAgentName, p.cfg.UserAgentVersion,\n\t\tp.cfg.UserAgentComments...)\n\n\t// Advertise local services.\n\tmsg.Services = p.cfg.Services\n\n\t// Advertise our max supported protocol version.\n\tmsg.ProtocolVersion = int32(p.cfg.ProtocolVersion)\n\n\t// Advertise if inv messages for transactions are desired.\n\tmsg.DisableRelayTx = p.cfg.DisableRelayTx\n\n\treturn msg, nil\n}\n\n// writeLocalVersionMsg writes our version message to the remote peer.\nfunc (p *Peer) writeLocalVersionMsg() error {\n\tlocalVerMsg, err := p.localVersionMsg()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn p.writeMessage(localVerMsg, wire.LatestEncoding)\n}\n\n// writeSendAddrV2Msg writes our sendaddrv2 message to the remote peer if the\n// peer supports protocol version 70016 and above.\nfunc (p *Peer) writeSendAddrV2Msg(pver uint32) error {\n\tif pver < wire.AddrV2Version {\n\t\treturn nil\n\t}\n\n\tsendAddrMsg := wire.NewMsgSendAddrV2()\n\treturn p.writeMessage(sendAddrMsg, wire.LatestEncoding)\n}\n\n// waitToFinishNegotiation waits until desired negotiation messages are\n// received, recording the remote peer's preference for sendaddrv2 as an\n// example. The list of negotiated features can be expanded in the future. If a\n// verack is received, negotiation stops and the connection is live.\nfunc (p *Peer) waitToFinishNegotiation(pver uint32) error {\n\t// There are several possible messages that can be received here. We\n\t// could immediately receive verack and be done with the handshake. We\n\t// could receive sendaddrv2 and still have to wait for verack. Or we\n\t// can receive unknown messages before and after sendaddrv2 and still\n\t// have to wait for verack.\n\tfor {\n\t\tremoteMsg, _, err := p.readMessage(wire.LatestEncoding, false)\n\t\tif err == wire.ErrUnknownMessage {\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tswitch m := remoteMsg.(type) {\n\t\tcase *wire.MsgSendAddrV2:\n\t\t\tif pver >= wire.AddrV2Version {\n\t\t\t\tp.flagsMtx.Lock()\n\t\t\t\tp.sendAddrV2 = true\n\t\t\t\tp.flagsMtx.Unlock()\n\n\t\t\t\tif p.cfg.Listeners.OnSendAddrV2 != nil {\n\t\t\t\t\tp.cfg.Listeners.OnSendAddrV2(p, m)\n\t\t\t\t}\n\t\t\t}\n\t\tcase *wire.MsgVerAck:\n\t\t\t// Receiving a verack means we are done with the\n\t\t\t// handshake.\n\t\t\tp.processRemoteVerAckMsg(m)\n\t\t\treturn nil\n\t\tdefault:\n\t\t\t// This is triggered if the peer sends, for example, a\n\t\t\t// GETDATA message during this negotiation.\n\t\t\treturn wire.ErrInvalidHandshake\n\t\t}\n\t}\n}\n\n// negotiateInboundProtocol performs the negotiation protocol for an inbound\n// peer. The events should occur in the following order, otherwise an error is\n// returned:\n//\n//  1. Remote peer sends their version.\n//  2. We send our version.\n//  3. We send sendaddrv2 if their version is >= 70016.\n//  4. We send our verack.\n//  5. Wait until sendaddrv2 or verack is received. Unknown messages are\n//     skipped as it could be wtxidrelay or a different message in the future\n//     that btcd does not implement but bitcoind does.\n//  6. If remote peer sent sendaddrv2 above, wait until receipt of verack.\nfunc (p *Peer) negotiateInboundProtocol() error {\n\t// We may be anticipating a v2 connection, but if the initiating peer\n\t// sends us a v1 version message, we need to note down that we've\n\t// downgraded the connection internally.\n\tdowngradedConn := false\n\n\tif p.cfg.UsingV2Conn {\n\t\tgarbageLen := rand.Intn(v2transport.MaxGarbageLen + 1)\n\t\terr := p.V2Transport.RespondV2Handshake(\n\t\t\tgarbageLen,\n\t\t\tv2transport.BitcoinNet(p.cfg.ChainParams.Net),\n\t\t)\n\t\tswitch {\n\t\tcase errors.Is(err, v2transport.ErrUseV1Protocol):\n\t\t\tlog.Infof(\"Inbound v2 connection attempt from %s \"+\n\t\t\t\t\"downgraded to v1 (peer sent v1 version \"+\n\t\t\t\t\"message)\", p.addr)\n\n\t\t\tp.cfg.UsingV2Conn = false\n\t\t\tdowngradedConn = true\n\n\t\tcase err != nil:\n\t\t\treturn err\n\n\t\tdefault:\n\t\t\terr = p.V2Transport.CompleteHandshake(\n\t\t\t\tfalse, nil,\n\t\t\t\tv2transport.BitcoinNet(p.cfg.ChainParams.Net),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\t// If the connection has been downgraded, then we need to parse the\n\t// rest of the v1 version message properly. Otherwise, we read the\n\t// entire version message off the wire.\n\tif err := p.readRemoteVersionMsg(downgradedConn); err != nil {\n\t\treturn err\n\t}\n\n\tif err := p.writeLocalVersionMsg(); err != nil {\n\t\treturn err\n\t}\n\n\tvar protoVersion uint32\n\tp.flagsMtx.Lock()\n\tprotoVersion = p.protocolVersion\n\tp.flagsMtx.Unlock()\n\n\tif err := p.writeSendAddrV2Msg(protoVersion); err != nil {\n\t\treturn err\n\t}\n\n\terr := p.writeMessage(wire.NewMsgVerAck(), wire.LatestEncoding)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Finish the negotiation by waiting for negotiable messages or verack.\n\treturn p.waitToFinishNegotiation(protoVersion)\n}\n\n// negotiateOutboundProtocol performs the negotiation protocol for an outbound\n// peer. The events should occur in the following order, otherwise an error is\n// returned:\n//\n//  1. We send our version.\n//  2. Remote peer sends their version.\n//  3. We send sendaddrv2 if their version is >= 70016.\n//  4. We send our verack.\n//  5. We wait to receive sendaddrv2 or verack, skipping unknown messages as\n//     in the inbound case.\n//  6. If sendaddrv2 was received, wait for receipt of verack.\nfunc (p *Peer) negotiateOutboundProtocol() error {\n\tif p.cfg.UsingV2Conn {\n\t\t// Note that it's possible that the v2 handshake fails because\n\t\t// the peer does not support v2 connections. In this case, we\n\t\t// should detect that and reconnect using a v1 connection. This\n\t\t// is the logic that bitcoind uses.\n\t\tgarbageLen := rand.Intn(v2transport.MaxGarbageLen + 1)\n\t\terr := p.V2Transport.InitiateV2Handshake(garbageLen)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\terr = p.V2Transport.CompleteHandshake(\n\t\t\ttrue, nil,\n\t\t\tv2transport.BitcoinNet(p.cfg.ChainParams.Net),\n\t\t)\n\t\tif errors.Is(err, v2transport.ErrShouldDowngradeToV1) {\n\t\t\tlog.Infof(\"Outbound v2 connection attempt to %s \"+\n\t\t\t\t\"failed, will downgrade to v1 (peer does \"+\n\t\t\t\t\"not support v2)\", p.addr)\n\t\t\treturn err\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif err := p.writeLocalVersionMsg(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := p.readRemoteVersionMsg(false); err != nil {\n\t\treturn err\n\t}\n\n\tvar protoVersion uint32\n\tp.flagsMtx.Lock()\n\tprotoVersion = p.protocolVersion\n\tp.flagsMtx.Unlock()\n\n\tif err := p.writeSendAddrV2Msg(protoVersion); err != nil {\n\t\treturn err\n\t}\n\n\terr := p.writeMessage(wire.NewMsgVerAck(), wire.LatestEncoding)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Finish the negotiation by waiting for negotiable messages or verack.\n\treturn p.waitToFinishNegotiation(protoVersion)\n}\n\n// start begins processing input and output messages.\nfunc (p *Peer) start() error {\n\tlog.Tracef(\"Starting peer %s\", p)\n\n\tnegotiateErr := make(chan error, 1)\n\tgo func() {\n\t\tdefer p.recoverFromPanic()\n\n\t\tif p.inbound {\n\t\t\tnegotiateErr <- p.negotiateInboundProtocol()\n\t\t} else {\n\t\t\tnegotiateErr <- p.negotiateOutboundProtocol()\n\t\t}\n\t}()\n\n\t// Negotiate the protocol within the specified negotiateTimeout.\n\tselect {\n\tcase err := <-negotiateErr:\n\t\tif err != nil {\n\t\t\tp.Disconnect()\n\t\t\treturn err\n\t\t}\n\tcase <-time.After(negotiateTimeout):\n\t\tp.Disconnect()\n\t\treturn errors.New(\"protocol negotiation timeout\")\n\tcase <-p.quit:\n\t\treturn errors.New(\"peer disconnected during negotiation\")\n\t}\n\tlog.Debugf(\"Connected to %s\", p.Addr())\n\n\t// The protocol has been negotiated successfully so start processing input\n\t// and output messages.\n\tgo p.stallHandler()\n\tgo p.inHandler()\n\tgo p.queueHandler()\n\tgo p.outHandler()\n\tgo p.pingHandler()\n\n\treturn nil\n}\n\n// AssociateConnection associates the given conn to the peer.   Calling this\n// function when the peer is already connected will have no effect.\nfunc (p *Peer) AssociateConnection(conn net.Conn) {\n\t// Already connected?\n\tif !atomic.CompareAndSwapInt32(&p.connected, 0, 1) {\n\t\treturn\n\t}\n\n\tp.conn = conn\n\tp.timeConnected = time.Now()\n\n\tif p.cfg.UsingV2Conn {\n\t\tp.V2Transport.UseReadWriter(conn)\n\t}\n\n\tif p.inbound {\n\t\tp.addr = p.conn.RemoteAddr().String()\n\n\t\t// Set up a NetAddress for the peer to be used with AddrManager.  We\n\t\t// only do this inbound because outbound set this up at connection time\n\t\t// and no point recomputing.\n\t\tna, err := newNetAddress(p.conn.RemoteAddr(), p.services)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Cannot create remote net address: %v\", err)\n\t\t\tp.Disconnect()\n\t\t\treturn\n\t\t}\n\n\t\t// Convert the NetAddress created above into NetAddressV2.\n\t\tcurrentNa := wire.NetAddressV2FromBytes(\n\t\t\tna.Timestamp, na.Services, na.IP, na.Port,\n\t\t)\n\t\tp.na = currentNa\n\t}\n\n\tgo func() {\n\t\tif err := p.start(); err != nil {\n\t\t\tlog.Debugf(\"Cannot start peer %v: %v\", p, err)\n\t\t\tp.Disconnect()\n\t\t}\n\t}()\n}\n\n// WaitForDisconnect waits until the peer has completely disconnected and all\n// resources are cleaned up.  This will happen if either the local or remote\n// side has been disconnected or the peer is forcibly disconnected via\n// Disconnect.\nfunc (p *Peer) WaitForDisconnect() {\n\t<-p.quit\n}\n\n// ShouldDowngradeToV1 is called when we try to connect to a peer via v2 BIP324\n// transport and they hang up. In this case, we should reconnect with the\n// legacy transport.\n//\n// This function is safe for concurrent access.\nfunc (p *Peer) ShouldDowngradeToV1() bool {\n\t// If we weren't attempting a V2 connection with a V2 transport,\n\t// or have no V2 transport instance, then no downgrade is indicated.\n\tif !p.cfg.UsingV2Conn || p.V2Transport == nil {\n\t\treturn false\n\t}\n\treturn p.V2Transport.ShouldDowngradeToV1()\n}\n\n// newPeerBase returns a new base bitcoin peer based on the inbound flag.  This\n// is used by the NewInboundPeer and NewOutboundPeer functions to perform base\n// setup needed by both types of peers.\nfunc newPeerBase(origCfg *Config, inbound bool) *Peer {\n\t// Default to the max supported protocol version if not specified by the\n\t// caller.\n\tcfg := *origCfg // Copy to avoid mutating caller.\n\tif cfg.ProtocolVersion == 0 {\n\t\tcfg.ProtocolVersion = MaxProtocolVersion\n\t}\n\n\t// Set the chain parameters to testnet if the caller did not specify any.\n\tif cfg.ChainParams == nil {\n\t\tcfg.ChainParams = &chaincfg.TestNet3Params\n\t}\n\n\t// Set the trickle interval if a non-positive value is specified.\n\tif cfg.TrickleInterval <= 0 {\n\t\tcfg.TrickleInterval = DefaultTrickleInterval\n\t}\n\n\tp := Peer{\n\t\tinbound:         inbound,\n\t\twireEncoding:    wire.BaseEncoding,\n\t\tknownInventory:  lru.NewCache(maxKnownInventory),\n\t\tstallControl:    make(chan stallControlMsg, 1), // nonblocking sync\n\t\toutputQueue:     make(chan outMsg, outputBufferSize),\n\t\tsendQueue:       make(chan outMsg, 1),   // nonblocking sync\n\t\tsendDoneQueue:   make(chan struct{}, 1), // nonblocking sync\n\t\toutputInvChan:   make(chan *wire.InvVect, outputBufferSize),\n\t\tinQuit:          make(chan struct{}),\n\t\tqueueQuit:       make(chan struct{}),\n\t\toutQuit:         make(chan struct{}),\n\t\tquit:            make(chan struct{}),\n\t\tcfg:             cfg, // Copy so caller can't mutate.\n\t\tservices:        cfg.Services,\n\t\tprotocolVersion: cfg.ProtocolVersion,\n\t}\n\n\tif p.cfg.UsingV2Conn && p.Services()&wire.SFNodeP2PV2 == wire.SFNodeP2PV2 {\n\t\tp.V2Transport = v2transport.NewPeer()\n\t} else {\n\t\t// TODO: Hack, change.\n\t\tp.cfg.UsingV2Conn = false\n\t}\n\n\treturn &p\n}\n\n// NewInboundPeer returns a new inbound bitcoin peer. Use Start to begin\n// processing incoming and outgoing messages.\nfunc NewInboundPeer(cfg *Config) *Peer {\n\treturn newPeerBase(cfg, true)\n}\n\n// NewOutboundPeer returns a new outbound bitcoin peer. If the Config argument\n// does not set HostToNetAddress, connecting to anything other than an ipv4 or\n// ipv6 address will fail and may cause a nil-pointer-dereference. This\n// includes hostnames and onion services.\nfunc NewOutboundPeer(cfg *Config, addr string) (*Peer, error) {\n\tp := newPeerBase(cfg, false)\n\tp.addr = addr\n\n\thost, portStr, err := net.SplitHostPort(addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tport, err := strconv.ParseUint(portStr, 10, 16)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif cfg.HostToNetAddress != nil {\n\t\tna, err := cfg.HostToNetAddress(host, uint16(port), 0)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tp.na = na\n\t} else {\n\t\t// If host is an onion hidden service or a hostname, it is\n\t\t// likely that a nil-pointer-dereference will occur. The caller\n\t\t// should set HostToNetAddress if connecting to these.\n\t\tp.na = wire.NetAddressV2FromBytes(\n\t\t\ttime.Now(), 0, net.ParseIP(host), uint16(port),\n\t\t)\n\t}\n\n\treturn p, nil\n}\n\nfunc init() {\n\trand.Seed(time.Now().UnixNano())\n}\n"
  },
  {
    "path": "peer/peer_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Copyright (c) 2016-2018 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage peer_test\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"net\"\n\t\"strconv\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/peer\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/btcsuite/go-socks/socks\"\n)\n\n// conn mocks a network connection by implementing the net.Conn interface.  It\n// is used to test peer connection without actually opening a network\n// connection.\ntype conn struct {\n\tio.Reader\n\tio.Writer\n\tio.Closer\n\n\t// local network, address for the connection.\n\tlnet, laddr string\n\n\t// remote network, address for the connection.\n\trnet, raddr string\n\n\t// mocks socks proxy if true\n\tproxy bool\n}\n\n// LocalAddr returns the local address for the connection.\nfunc (c conn) LocalAddr() net.Addr {\n\treturn &addr{c.lnet, c.laddr}\n}\n\n// Remote returns the remote address for the connection.\nfunc (c conn) RemoteAddr() net.Addr {\n\tif !c.proxy {\n\t\treturn &addr{c.rnet, c.raddr}\n\t}\n\thost, strPort, _ := net.SplitHostPort(c.raddr)\n\tport, _ := strconv.Atoi(strPort)\n\treturn &socks.ProxiedAddr{\n\t\tNet:  c.rnet,\n\t\tHost: host,\n\t\tPort: port,\n\t}\n}\n\n// Close handles closing the connection.\nfunc (c conn) Close() error {\n\tif c.Closer == nil {\n\t\treturn nil\n\t}\n\treturn c.Closer.Close()\n}\n\nfunc (c conn) SetDeadline(t time.Time) error      { return nil }\nfunc (c conn) SetReadDeadline(t time.Time) error  { return nil }\nfunc (c conn) SetWriteDeadline(t time.Time) error { return nil }\n\n// addr mocks a network address\ntype addr struct {\n\tnet, address string\n}\n\nfunc (m addr) Network() string { return m.net }\nfunc (m addr) String() string  { return m.address }\n\n// pipe turns two mock connections into a full-duplex connection similar to\n// net.Pipe to allow pipe's with (fake) addresses.\nfunc pipe(c1, c2 *conn) (*conn, *conn) {\n\tr1, w1 := io.Pipe()\n\tr2, w2 := io.Pipe()\n\n\tc1.Writer = w1\n\tc1.Closer = w1\n\tc2.Reader = r1\n\tc1.Reader = r2\n\tc2.Writer = w2\n\tc2.Closer = w2\n\n\treturn c1, c2\n}\n\n// peerStats holds the expected peer stats used for testing peer.\ntype peerStats struct {\n\twantUserAgent       string\n\twantServices        wire.ServiceFlag\n\twantProtocolVersion uint32\n\twantConnected       bool\n\twantVersionKnown    bool\n\twantVerAckReceived  bool\n\twantLastBlock       int32\n\twantStartingHeight  int32\n\twantLastPingTime    time.Time\n\twantLastPingNonce   uint64\n\twantLastPingMicros  int64\n\twantTimeOffset      int64\n\twantBytesSent       uint64\n\twantBytesReceived   uint64\n\twantWitnessEnabled  bool\n}\n\n// testPeer tests the given peer's flags and stats\nfunc testPeer(t *testing.T, p *peer.Peer, s peerStats) {\n\tif p.UserAgent() != s.wantUserAgent {\n\t\tt.Errorf(\"testPeer: wrong UserAgent - got %v, want %v\", p.UserAgent(), s.wantUserAgent)\n\t\treturn\n\t}\n\n\tif p.Services() != s.wantServices {\n\t\tt.Errorf(\"testPeer: wrong Services - got %v, want %v\", p.Services(), s.wantServices)\n\t\treturn\n\t}\n\n\tif !p.LastPingTime().Equal(s.wantLastPingTime) {\n\t\tt.Errorf(\"testPeer: wrong LastPingTime - got %v, want %v\", p.LastPingTime(), s.wantLastPingTime)\n\t\treturn\n\t}\n\n\tif p.LastPingNonce() != s.wantLastPingNonce {\n\t\tt.Errorf(\"testPeer: wrong LastPingNonce - got %v, want %v\", p.LastPingNonce(), s.wantLastPingNonce)\n\t\treturn\n\t}\n\n\tif p.LastPingMicros() != s.wantLastPingMicros {\n\t\tt.Errorf(\"testPeer: wrong LastPingMicros - got %v, want %v\", p.LastPingMicros(), s.wantLastPingMicros)\n\t\treturn\n\t}\n\n\tif p.VerAckReceived() != s.wantVerAckReceived {\n\t\tt.Errorf(\"testPeer: wrong VerAckReceived - got %v, want %v\", p.VerAckReceived(), s.wantVerAckReceived)\n\t\treturn\n\t}\n\n\tif p.VersionKnown() != s.wantVersionKnown {\n\t\tt.Errorf(\"testPeer: wrong VersionKnown - got %v, want %v\", p.VersionKnown(), s.wantVersionKnown)\n\t\treturn\n\t}\n\n\tif p.ProtocolVersion() != s.wantProtocolVersion {\n\t\tt.Errorf(\"testPeer: wrong ProtocolVersion - got %v, want %v\", p.ProtocolVersion(), s.wantProtocolVersion)\n\t\treturn\n\t}\n\n\tif p.LastBlock() != s.wantLastBlock {\n\t\tt.Errorf(\"testPeer: wrong LastBlock - got %v, want %v\", p.LastBlock(), s.wantLastBlock)\n\t\treturn\n\t}\n\n\t// Allow for a deviation of 1s, as the second may tick when the message is\n\t// in transit and the protocol doesn't support any further precision.\n\tif p.TimeOffset() != s.wantTimeOffset && p.TimeOffset() != s.wantTimeOffset-1 {\n\t\tt.Errorf(\"testPeer: wrong TimeOffset - got %v, want %v or %v\", p.TimeOffset(),\n\t\t\ts.wantTimeOffset, s.wantTimeOffset-1)\n\t\treturn\n\t}\n\n\tif p.BytesSent() != s.wantBytesSent {\n\t\tt.Errorf(\"testPeer: wrong BytesSent - got %v, want %v\", p.BytesSent(), s.wantBytesSent)\n\t\treturn\n\t}\n\n\tif p.BytesReceived() != s.wantBytesReceived {\n\t\tt.Errorf(\"testPeer: wrong BytesReceived - got %v, want %v\", p.BytesReceived(), s.wantBytesReceived)\n\t\treturn\n\t}\n\n\tif p.StartingHeight() != s.wantStartingHeight {\n\t\tt.Errorf(\"testPeer: wrong StartingHeight - got %v, want %v\", p.StartingHeight(), s.wantStartingHeight)\n\t\treturn\n\t}\n\n\tif p.Connected() != s.wantConnected {\n\t\tt.Errorf(\"testPeer: wrong Connected - got %v, want %v\", p.Connected(), s.wantConnected)\n\t\treturn\n\t}\n\n\tif p.IsWitnessEnabled() != s.wantWitnessEnabled {\n\t\tt.Errorf(\"testPeer: wrong WitnessEnabled - got %v, want %v\",\n\t\t\tp.IsWitnessEnabled(), s.wantWitnessEnabled)\n\t\treturn\n\t}\n\n\tstats := p.StatsSnapshot()\n\n\tif p.ID() != stats.ID {\n\t\tt.Errorf(\"testPeer: wrong ID - got %v, want %v\", p.ID(), stats.ID)\n\t\treturn\n\t}\n\n\tif p.Addr() != stats.Addr {\n\t\tt.Errorf(\"testPeer: wrong Addr - got %v, want %v\", p.Addr(), stats.Addr)\n\t\treturn\n\t}\n\n\tif p.LastSend() != stats.LastSend {\n\t\tt.Errorf(\"testPeer: wrong LastSend - got %v, want %v\", p.LastSend(), stats.LastSend)\n\t\treturn\n\t}\n\n\tif p.LastRecv() != stats.LastRecv {\n\t\tt.Errorf(\"testPeer: wrong LastRecv - got %v, want %v\", p.LastRecv(), stats.LastRecv)\n\t\treturn\n\t}\n}\n\n// TestPeerConnection tests connection between inbound and outbound peers.\nfunc TestPeerConnection(t *testing.T) {\n\tverack := make(chan struct{})\n\tpeer1Cfg := &peer.Config{\n\t\tListeners: peer.MessageListeners{\n\t\t\tOnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) {\n\t\t\t\tverack <- struct{}{}\n\t\t\t},\n\t\t\tOnWrite: func(p *peer.Peer, bytesWritten int, msg wire.Message,\n\t\t\t\terr error) {\n\t\t\t\tif _, ok := msg.(*wire.MsgVerAck); ok {\n\t\t\t\t\tverack <- struct{}{}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tUserAgentName:     \"peer\",\n\t\tUserAgentVersion:  \"1.0\",\n\t\tUserAgentComments: []string{\"comment\"},\n\t\tChainParams:       &chaincfg.MainNetParams,\n\t\tProtocolVersion:   wire.RejectVersion, // Configure with older version\n\t\tServices:          0,\n\t\tTrickleInterval:   time.Second * 10,\n\t\tAllowSelfConns:    true,\n\t}\n\tpeer2Cfg := &peer.Config{\n\t\tListeners:         peer1Cfg.Listeners,\n\t\tUserAgentName:     \"peer\",\n\t\tUserAgentVersion:  \"1.0\",\n\t\tUserAgentComments: []string{\"comment\"},\n\t\tChainParams:       &chaincfg.MainNetParams,\n\t\tServices:          wire.SFNodeNetwork | wire.SFNodeWitness,\n\t\tTrickleInterval:   time.Second * 10,\n\t\tAllowSelfConns:    true,\n\t}\n\n\twantStats1 := peerStats{\n\t\twantUserAgent:       wire.DefaultUserAgent + \"peer:1.0(comment)/\",\n\t\twantServices:        0,\n\t\twantProtocolVersion: wire.RejectVersion,\n\t\twantConnected:       true,\n\t\twantVersionKnown:    true,\n\t\twantVerAckReceived:  true,\n\t\twantLastPingTime:    time.Time{},\n\t\twantLastPingNonce:   uint64(0),\n\t\twantLastPingMicros:  int64(0),\n\t\twantTimeOffset:      int64(0),\n\t\twantBytesSent:       167, // 143 version + 24 verack\n\t\twantBytesReceived:   167,\n\t\twantWitnessEnabled:  false,\n\t}\n\twantStats2 := peerStats{\n\t\twantUserAgent:       wire.DefaultUserAgent + \"peer:1.0(comment)/\",\n\t\twantServices:        wire.SFNodeNetwork | wire.SFNodeWitness,\n\t\twantProtocolVersion: wire.RejectVersion,\n\t\twantConnected:       true,\n\t\twantVersionKnown:    true,\n\t\twantVerAckReceived:  true,\n\t\twantLastPingTime:    time.Time{},\n\t\twantLastPingNonce:   uint64(0),\n\t\twantLastPingMicros:  int64(0),\n\t\twantTimeOffset:      int64(0),\n\t\twantBytesSent:       167, // 143 version + 24 verack\n\t\twantBytesReceived:   167,\n\t\twantWitnessEnabled:  true,\n\t}\n\n\ttests := []struct {\n\t\tname  string\n\t\tsetup func() (*peer.Peer, *peer.Peer, error)\n\t}{\n\t\t{\n\t\t\t\"basic handshake\",\n\t\t\tfunc() (*peer.Peer, *peer.Peer, error) {\n\t\t\t\tinPeer := peer.NewInboundPeer(peer1Cfg)\n\t\t\t\toutPeer, err := peer.NewOutboundPeer(peer2Cfg, \"10.0.0.2:8333\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\n\t\t\t\terr = setupPeerConnection(inPeer, outPeer)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\n\t\t\t\tfor i := 0; i < 4; i++ {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase <-verack:\n\t\t\t\t\tcase <-time.After(time.Second):\n\t\t\t\t\t\treturn nil, nil, errors.New(\"verack timeout\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn inPeer, outPeer, nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"socks proxy\",\n\t\t\tfunc() (*peer.Peer, *peer.Peer, error) {\n\t\t\t\tinPeer := peer.NewInboundPeer(peer1Cfg)\n\t\t\t\toutPeer, err := peer.NewOutboundPeer(peer2Cfg, \"10.0.0.2:8333\")\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\n\t\t\t\terr = setupPeerConnection(inPeer, outPeer)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\n\t\t\t\tfor i := 0; i < 4; i++ {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase <-verack:\n\t\t\t\t\tcase <-time.After(time.Second):\n\t\t\t\t\t\treturn nil, nil, errors.New(\"verack timeout\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn inPeer, outPeer, nil\n\t\t\t},\n\t\t},\n\t}\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tinPeer, outPeer, err := test.setup()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"TestPeerConnection setup #%d: unexpected err %v\", i, err)\n\t\t\treturn\n\t\t}\n\t\ttestPeer(t, inPeer, wantStats2)\n\t\ttestPeer(t, outPeer, wantStats1)\n\n\t\tinPeer.Disconnect()\n\t\toutPeer.Disconnect()\n\t\tinPeer.WaitForDisconnect()\n\t\toutPeer.WaitForDisconnect()\n\t}\n}\n\n// TestPeerListeners tests that the peer listeners are called as expected.\nfunc TestPeerListeners(t *testing.T) {\n\tverack := make(chan struct{}, 1)\n\tok := make(chan wire.Message, 22)\n\tpeerCfg := &peer.Config{\n\t\tListeners: peer.MessageListeners{\n\t\t\tOnGetAddr: func(p *peer.Peer, msg *wire.MsgGetAddr) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnAddr: func(p *peer.Peer, msg *wire.MsgAddr) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnPing: func(p *peer.Peer, msg *wire.MsgPing) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnPong: func(p *peer.Peer, msg *wire.MsgPong) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnMemPool: func(p *peer.Peer, msg *wire.MsgMemPool) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnTx: func(p *peer.Peer, msg *wire.MsgTx) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnBlock: func(p *peer.Peer, msg *wire.MsgBlock, buf []byte) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnInv: func(p *peer.Peer, msg *wire.MsgInv) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnHeaders: func(p *peer.Peer, msg *wire.MsgHeaders) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnNotFound: func(p *peer.Peer, msg *wire.MsgNotFound) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnGetData: func(p *peer.Peer, msg *wire.MsgGetData) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnGetBlocks: func(p *peer.Peer, msg *wire.MsgGetBlocks) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnGetHeaders: func(p *peer.Peer, msg *wire.MsgGetHeaders) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnGetCFilters: func(p *peer.Peer, msg *wire.MsgGetCFilters) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnGetCFHeaders: func(p *peer.Peer, msg *wire.MsgGetCFHeaders) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnGetCFCheckpt: func(p *peer.Peer, msg *wire.MsgGetCFCheckpt) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnCFilter: func(p *peer.Peer, msg *wire.MsgCFilter) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnCFHeaders: func(p *peer.Peer, msg *wire.MsgCFHeaders) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnFeeFilter: func(p *peer.Peer, msg *wire.MsgFeeFilter) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnFilterAdd: func(p *peer.Peer, msg *wire.MsgFilterAdd) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnFilterClear: func(p *peer.Peer, msg *wire.MsgFilterClear) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnFilterLoad: func(p *peer.Peer, msg *wire.MsgFilterLoad) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnMerkleBlock: func(p *peer.Peer, msg *wire.MsgMerkleBlock) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnVersion: func(p *peer.Peer, msg *wire.MsgVersion) *wire.MsgReject {\n\t\t\t\tok <- msg\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tOnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) {\n\t\t\t\tverack <- struct{}{}\n\t\t\t},\n\t\t\tOnReject: func(p *peer.Peer, msg *wire.MsgReject) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnSendHeaders: func(p *peer.Peer, msg *wire.MsgSendHeaders) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnSendAddrV2: func(p *peer.Peer, msg *wire.MsgSendAddrV2) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t\tOnAddrV2: func(p *peer.Peer, msg *wire.MsgAddrV2) {\n\t\t\t\tok <- msg\n\t\t\t},\n\t\t},\n\t\tUserAgentName:     \"peer\",\n\t\tUserAgentVersion:  \"1.0\",\n\t\tUserAgentComments: []string{\"comment\"},\n\t\tChainParams:       &chaincfg.MainNetParams,\n\t\tServices:          wire.SFNodeBloom,\n\t\tTrickleInterval:   time.Second * 10,\n\t\tAllowSelfConns:    true,\n\t}\n\tinPeer := peer.NewInboundPeer(peerCfg)\n\n\tpeerCfg.Listeners = peer.MessageListeners{\n\t\tOnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) {\n\t\t\tverack <- struct{}{}\n\t\t},\n\t}\n\toutPeer, err := peer.NewOutboundPeer(peerCfg, \"10.0.0.1:8333\")\n\tif err != nil {\n\t\tt.Errorf(\"NewOutboundPeer: unexpected err %v\\n\", err)\n\t\treturn\n\t}\n\n\terr = setupPeerConnection(inPeer, outPeer)\n\tif err != nil {\n\t\tt.Errorf(\"setupPeerConnection: failed: %v\\n\", err)\n\t\treturn\n\t}\n\n\tfor i := 0; i < 2; i++ {\n\t\tselect {\n\t\tcase <-verack:\n\t\tcase <-time.After(time.Second * 1):\n\t\t\tt.Errorf(\"TestPeerListeners: verack timeout\\n\")\n\t\t\treturn\n\t\t}\n\t}\n\n\ttests := []struct {\n\t\tlistener string\n\t\tmsg      wire.Message\n\t}{\n\t\t{\n\t\t\t\"OnGetAddr\",\n\t\t\twire.NewMsgGetAddr(),\n\t\t},\n\t\t{\n\t\t\t\"OnAddr\",\n\t\t\twire.NewMsgAddr(),\n\t\t},\n\t\t{\n\t\t\t\"OnPing\",\n\t\t\twire.NewMsgPing(42),\n\t\t},\n\t\t{\n\t\t\t\"OnPong\",\n\t\t\twire.NewMsgPong(42),\n\t\t},\n\t\t{\n\t\t\t\"OnMemPool\",\n\t\t\twire.NewMsgMemPool(),\n\t\t},\n\t\t{\n\t\t\t\"OnTx\",\n\t\t\twire.NewMsgTx(wire.TxVersion),\n\t\t},\n\t\t{\n\t\t\t\"OnBlock\",\n\t\t\twire.NewMsgBlock(wire.NewBlockHeader(1,\n\t\t\t\t&chainhash.Hash{}, &chainhash.Hash{}, 1, 1)),\n\t\t},\n\t\t{\n\t\t\t\"OnInv\",\n\t\t\twire.NewMsgInv(),\n\t\t},\n\t\t{\n\t\t\t\"OnHeaders\",\n\t\t\twire.NewMsgHeaders(),\n\t\t},\n\t\t{\n\t\t\t\"OnNotFound\",\n\t\t\twire.NewMsgNotFound(),\n\t\t},\n\t\t{\n\t\t\t\"OnGetData\",\n\t\t\twire.NewMsgGetData(),\n\t\t},\n\t\t{\n\t\t\t\"OnGetBlocks\",\n\t\t\twire.NewMsgGetBlocks(&chainhash.Hash{}),\n\t\t},\n\t\t{\n\t\t\t\"OnGetHeaders\",\n\t\t\twire.NewMsgGetHeaders(),\n\t\t},\n\t\t{\n\t\t\t\"OnGetCFilters\",\n\t\t\twire.NewMsgGetCFilters(wire.GCSFilterRegular, 0, &chainhash.Hash{}),\n\t\t},\n\t\t{\n\t\t\t\"OnGetCFHeaders\",\n\t\t\twire.NewMsgGetCFHeaders(wire.GCSFilterRegular, 0, &chainhash.Hash{}),\n\t\t},\n\t\t{\n\t\t\t\"OnGetCFCheckpt\",\n\t\t\twire.NewMsgGetCFCheckpt(wire.GCSFilterRegular, &chainhash.Hash{}),\n\t\t},\n\t\t{\n\t\t\t\"OnCFilter\",\n\t\t\twire.NewMsgCFilter(wire.GCSFilterRegular, &chainhash.Hash{},\n\t\t\t\t[]byte(\"payload\")),\n\t\t},\n\t\t{\n\t\t\t\"OnCFHeaders\",\n\t\t\twire.NewMsgCFHeaders(),\n\t\t},\n\t\t{\n\t\t\t\"OnFeeFilter\",\n\t\t\twire.NewMsgFeeFilter(15000),\n\t\t},\n\t\t{\n\t\t\t\"OnFilterAdd\",\n\t\t\twire.NewMsgFilterAdd([]byte{0x01}),\n\t\t},\n\t\t{\n\t\t\t\"OnFilterClear\",\n\t\t\twire.NewMsgFilterClear(),\n\t\t},\n\t\t{\n\t\t\t\"OnFilterLoad\",\n\t\t\twire.NewMsgFilterLoad([]byte{0x01}, 10, 0, wire.BloomUpdateNone),\n\t\t},\n\t\t{\n\t\t\t\"OnMerkleBlock\",\n\t\t\twire.NewMsgMerkleBlock(wire.NewBlockHeader(1,\n\t\t\t\t&chainhash.Hash{}, &chainhash.Hash{}, 1, 1)),\n\t\t},\n\t\t// only one version message is allowed\n\t\t// only one verack message is allowed\n\t\t{\n\t\t\t\"OnReject\",\n\t\t\twire.NewMsgReject(\"block\", wire.RejectDuplicate, \"dupe block\"),\n\t\t},\n\t\t{\n\t\t\t\"OnSendHeaders\",\n\t\t\twire.NewMsgSendHeaders(),\n\t\t},\n\t\t{\n\t\t\t\"OnSendAddrV2\",\n\t\t\twire.NewMsgSendAddrV2(),\n\t\t},\n\t\t{\n\t\t\t\"OnAddrV2\",\n\t\t\twire.NewMsgAddrV2(),\n\t\t},\n\t}\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor _, test := range tests {\n\t\t// Queue the test message\n\t\toutPeer.QueueMessage(test.msg, nil)\n\t\tselect {\n\t\tcase <-ok:\n\t\tcase <-time.After(time.Second * 1):\n\t\t\tt.Errorf(\"TestPeerListeners: %s timeout\", test.listener)\n\t\t\treturn\n\t\t}\n\t}\n\tinPeer.Disconnect()\n\toutPeer.Disconnect()\n}\n\n// TestOutboundPeer tests that the outbound peer works as expected.\nfunc TestOutboundPeer(t *testing.T) {\n\n\tpeerCfg := &peer.Config{\n\t\tNewestBlock: func() (*chainhash.Hash, int32, error) {\n\t\t\treturn nil, 0, errors.New(\"newest block not found\")\n\t\t},\n\t\tUserAgentName:     \"peer\",\n\t\tUserAgentVersion:  \"1.0\",\n\t\tUserAgentComments: []string{\"comment\"},\n\t\tChainParams:       &chaincfg.MainNetParams,\n\t\tServices:          0,\n\t\tTrickleInterval:   time.Second * 10,\n\t\tAllowSelfConns:    true,\n\t}\n\n\tr, w := io.Pipe()\n\tc := &conn{raddr: \"10.0.0.1:8333\", Writer: w, Reader: r}\n\n\tp, err := peer.NewOutboundPeer(peerCfg, \"10.0.0.1:8333\")\n\tif err != nil {\n\t\tt.Errorf(\"NewOutboundPeer: unexpected err - %v\\n\", err)\n\t\treturn\n\t}\n\n\t// Test trying to connect twice.\n\tp.AssociateConnection(c)\n\tp.AssociateConnection(c)\n\n\tdisconnected := make(chan struct{})\n\tgo func() {\n\t\tp.WaitForDisconnect()\n\t\tdisconnected <- struct{}{}\n\t}()\n\n\tselect {\n\tcase <-disconnected:\n\t\tclose(disconnected)\n\tcase <-time.After(time.Second):\n\t\tt.Fatal(\"Peer did not automatically disconnect.\")\n\t}\n\n\tif p.Connected() {\n\t\tt.Fatalf(\"Should not be connected as NewestBlock produces error.\")\n\t}\n\n\t// Test Queue Inv\n\tfakeBlockHash := &chainhash.Hash{0: 0x00, 1: 0x01}\n\tfakeInv := wire.NewInvVect(wire.InvTypeBlock, fakeBlockHash)\n\n\t// Should be noops as the peer could not connect.\n\tp.QueueInventory(fakeInv)\n\tp.AddKnownInventory(fakeInv)\n\tp.QueueInventory(fakeInv)\n\n\tfakeMsg := wire.NewMsgVerAck()\n\tp.QueueMessage(fakeMsg, nil)\n\tdone := make(chan struct{})\n\tp.QueueMessage(fakeMsg, done)\n\t<-done\n\tp.Disconnect()\n\n\t// Test NewestBlock\n\tvar newestBlock = func() (*chainhash.Hash, int32, error) {\n\t\thashStr := \"14a0810ac680a3eb3f82edc878cea25ec41d6b790744e5daeef\"\n\t\thash, err := chainhash.NewHashFromStr(hashStr)\n\t\tif err != nil {\n\t\t\treturn nil, 0, err\n\t\t}\n\t\treturn hash, 234439, nil\n\t}\n\n\tpeerCfg.NewestBlock = newestBlock\n\tr1, w1 := io.Pipe()\n\tc1 := &conn{raddr: \"10.0.0.1:8333\", Writer: w1, Reader: r1}\n\tp1, err := peer.NewOutboundPeer(peerCfg, \"10.0.0.1:8333\")\n\tif err != nil {\n\t\tt.Errorf(\"NewOutboundPeer: unexpected err - %v\\n\", err)\n\t\treturn\n\t}\n\tp1.AssociateConnection(c1)\n\n\t// Test update latest block\n\tlatestBlockHash, err := chainhash.NewHashFromStr(\"1a63f9cdff1752e6375c8c76e543a71d239e1a2e5c6db1aa679\")\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: unexpected err %v\\n\", err)\n\t\treturn\n\t}\n\tp1.UpdateLastAnnouncedBlock(latestBlockHash)\n\tp1.UpdateLastBlockHeight(234440)\n\tif p1.LastAnnouncedBlock() != latestBlockHash {\n\t\tt.Errorf(\"LastAnnouncedBlock: wrong block - got %v, want %v\",\n\t\t\tp1.LastAnnouncedBlock(), latestBlockHash)\n\t\treturn\n\t}\n\n\t// Test Queue Inv after connection\n\tp1.QueueInventory(fakeInv)\n\tp1.Disconnect()\n\n\t// Test regression\n\tpeerCfg.ChainParams = &chaincfg.RegressionNetParams\n\tpeerCfg.Services = wire.SFNodeBloom\n\tr2, w2 := io.Pipe()\n\tc2 := &conn{raddr: \"10.0.0.1:8333\", Writer: w2, Reader: r2}\n\tp2, err := peer.NewOutboundPeer(peerCfg, \"10.0.0.1:8333\")\n\tif err != nil {\n\t\tt.Errorf(\"NewOutboundPeer: unexpected err - %v\\n\", err)\n\t\treturn\n\t}\n\tp2.AssociateConnection(c2)\n\n\t// Test PushXXX\n\tvar addrs []*wire.NetAddress\n\tfor i := 0; i < 5; i++ {\n\t\tna := wire.NetAddress{}\n\t\taddrs = append(addrs, &na)\n\t}\n\tif _, err := p2.PushAddrMsg(addrs); err != nil {\n\t\tt.Errorf(\"PushAddrMsg: unexpected err %v\\n\", err)\n\t\treturn\n\t}\n\tif err := p2.PushGetBlocksMsg(nil, &chainhash.Hash{}); err != nil {\n\t\tt.Errorf(\"PushGetBlocksMsg: unexpected err %v\\n\", err)\n\t\treturn\n\t}\n\tif err := p2.PushGetHeadersMsg(nil, &chainhash.Hash{}); err != nil {\n\t\tt.Errorf(\"PushGetHeadersMsg: unexpected err %v\\n\", err)\n\t\treturn\n\t}\n\n\tp2.PushRejectMsg(\"block\", wire.RejectMalformed, \"malformed\", nil, false)\n\tp2.PushRejectMsg(\"block\", wire.RejectInvalid, \"invalid\", nil, false)\n\n\t// Test Queue Messages\n\tp2.QueueMessage(wire.NewMsgGetAddr(), nil)\n\tp2.QueueMessage(wire.NewMsgPing(1), nil)\n\tp2.QueueMessage(wire.NewMsgMemPool(), nil)\n\tp2.QueueMessage(wire.NewMsgGetData(), nil)\n\tp2.QueueMessage(wire.NewMsgGetHeaders(), nil)\n\tp2.QueueMessage(wire.NewMsgFeeFilter(20000), nil)\n\n\tp2.Disconnect()\n}\n\n// Tests that the node disconnects from peers with an unsupported protocol\n// version.\nfunc TestUnsupportedVersionPeer(t *testing.T) {\n\tpeerCfg := &peer.Config{\n\t\tUserAgentName:     \"peer\",\n\t\tUserAgentVersion:  \"1.0\",\n\t\tUserAgentComments: []string{\"comment\"},\n\t\tChainParams:       &chaincfg.MainNetParams,\n\t\tServices:          0,\n\t\tTrickleInterval:   time.Second * 10,\n\t\tAllowSelfConns:    true,\n\t}\n\n\tlocalNA := wire.NewNetAddressIPPort(\n\t\tnet.ParseIP(\"10.0.0.1\"),\n\t\tuint16(8333),\n\t\twire.SFNodeNetwork,\n\t)\n\tremoteNA := wire.NewNetAddressIPPort(\n\t\tnet.ParseIP(\"10.0.0.2\"),\n\t\tuint16(8333),\n\t\twire.SFNodeNetwork,\n\t)\n\tlocalConn, remoteConn := pipe(\n\t\t&conn{laddr: \"10.0.0.1:8333\", raddr: \"10.0.0.2:8333\"},\n\t\t&conn{laddr: \"10.0.0.2:8333\", raddr: \"10.0.0.1:8333\"},\n\t)\n\n\tp, err := peer.NewOutboundPeer(peerCfg, \"10.0.0.1:8333\")\n\tif err != nil {\n\t\tt.Fatalf(\"NewOutboundPeer: unexpected err - %v\\n\", err)\n\t}\n\tp.AssociateConnection(localConn)\n\n\t// Read outbound messages to peer into a channel\n\toutboundMessages := make(chan wire.Message)\n\tgo func() {\n\t\tfor {\n\t\t\t_, msg, _, err := wire.ReadMessageN(\n\t\t\t\tremoteConn,\n\t\t\t\tp.ProtocolVersion(),\n\t\t\t\tpeerCfg.ChainParams.Net,\n\t\t\t)\n\t\t\tif err == io.EOF {\n\t\t\t\tclose(outboundMessages)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Error reading message from local node: %v\\n\", err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\toutboundMessages <- msg\n\t\t}\n\t}()\n\n\t// Read version message sent to remote peer\n\tselect {\n\tcase msg := <-outboundMessages:\n\t\tif _, ok := msg.(*wire.MsgVersion); !ok {\n\t\t\tt.Fatalf(\"Expected version message, got [%s]\", msg.Command())\n\t\t}\n\tcase <-time.After(time.Second):\n\t\tt.Fatal(\"Peer did not send version message\")\n\t}\n\n\t// Remote peer writes version message advertising invalid protocol version 1\n\tinvalidVersionMsg := wire.NewMsgVersion(remoteNA, localNA, 0, 0)\n\tinvalidVersionMsg.ProtocolVersion = 1\n\n\t_, err = wire.WriteMessageN(\n\t\tremoteConn.Writer,\n\t\tinvalidVersionMsg,\n\t\tuint32(invalidVersionMsg.ProtocolVersion),\n\t\tpeerCfg.ChainParams.Net,\n\t)\n\tif err != nil {\n\t\tt.Fatalf(\"wire.WriteMessageN: unexpected err - %v\\n\", err)\n\t}\n\n\t// Expect peer to disconnect automatically\n\tdisconnected := make(chan struct{})\n\tgo func() {\n\t\tp.WaitForDisconnect()\n\t\tdisconnected <- struct{}{}\n\t}()\n\n\tselect {\n\tcase <-disconnected:\n\t\tclose(disconnected)\n\tcase <-time.After(time.Second):\n\t\tt.Fatal(\"Peer did not automatically disconnect\")\n\t}\n\n\t// Expect no further outbound messages from peer\n\tselect {\n\tcase msg, chanOpen := <-outboundMessages:\n\t\tif chanOpen {\n\t\t\tt.Fatalf(\"Expected no further messages, received [%s]\", msg.Command())\n\t\t}\n\tcase <-time.After(time.Second):\n\t\tt.Fatal(\"Timeout waiting for remote reader to close\")\n\t}\n}\n\n// TestDuplicateVersionMsg ensures that receiving a version message after one\n// has already been received results in the peer being disconnected.\nfunc TestDuplicateVersionMsg(t *testing.T) {\n\t// Create a pair of peers that are connected to each other using a fake\n\t// connection.\n\tverack := make(chan struct{})\n\tpeerCfg := &peer.Config{\n\t\tListeners: peer.MessageListeners{\n\t\t\tOnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) {\n\t\t\t\tverack <- struct{}{}\n\t\t\t},\n\t\t},\n\t\tUserAgentName:    \"peer\",\n\t\tUserAgentVersion: \"1.0\",\n\t\tChainParams:      &chaincfg.MainNetParams,\n\t\tServices:         0,\n\t\tAllowSelfConns:   true,\n\t}\n\toutPeer, err := peer.NewOutboundPeer(peerCfg, \"10.0.0.2:8333\")\n\tif err != nil {\n\t\tt.Fatalf(\"NewOutboundPeer: unexpected err: %v\\n\", err)\n\t}\n\tinPeer := peer.NewInboundPeer(peerCfg)\n\n\terr = setupPeerConnection(inPeer, outPeer)\n\tif err != nil {\n\t\tt.Fatalf(\"setupPeerConnection failed to connect: %v\\n\", err)\n\t}\n\n\t// Wait for the veracks from the initial protocol version negotiation.\n\tfor i := 0; i < 2; i++ {\n\t\tselect {\n\t\tcase <-verack:\n\t\tcase <-time.After(time.Second):\n\t\t\tt.Fatal(\"verack timeout\")\n\t\t}\n\t}\n\t// Queue a duplicate version message from the outbound peer and wait until\n\t// it is sent.\n\tdone := make(chan struct{})\n\toutPeer.QueueMessage(&wire.MsgVersion{}, done)\n\tselect {\n\tcase <-done:\n\tcase <-time.After(time.Second):\n\t\tt.Fatal(\"send duplicate version timeout\")\n\t}\n\t// Ensure the peer that is the recipient of the duplicate version closes the\n\t// connection.\n\tdisconnected := make(chan struct{}, 1)\n\tgo func() {\n\t\tinPeer.WaitForDisconnect()\n\t\tdisconnected <- struct{}{}\n\t}()\n\tselect {\n\tcase <-disconnected:\n\tcase <-time.After(time.Second):\n\t\tt.Fatal(\"peer did not disconnect\")\n\t}\n}\n\n// TestUpdateLastBlockHeight ensures the last block height is set properly\n// during the initial version negotiation and is only allowed to advance to\n// higher values via the associated update function.\nfunc TestUpdateLastBlockHeight(t *testing.T) {\n\t// Create a pair of peers that are connected to each other using a fake\n\t// connection and the remote peer starting at height 100.\n\tconst remotePeerHeight = 100\n\tverack := make(chan struct{})\n\tpeerCfg := peer.Config{\n\t\tListeners: peer.MessageListeners{\n\t\t\tOnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) {\n\t\t\t\tverack <- struct{}{}\n\t\t\t},\n\t\t},\n\t\tUserAgentName:    \"peer\",\n\t\tUserAgentVersion: \"1.0\",\n\t\tChainParams:      &chaincfg.MainNetParams,\n\t\tServices:         0,\n\t\tAllowSelfConns:   true,\n\t}\n\tremotePeerCfg := peerCfg\n\tremotePeerCfg.NewestBlock = func() (*chainhash.Hash, int32, error) {\n\t\treturn &chainhash.Hash{}, remotePeerHeight, nil\n\t}\n\tlocalPeer, err := peer.NewOutboundPeer(&peerCfg, \"10.0.0.2:8333\")\n\tif err != nil {\n\t\tt.Fatalf(\"NewOutboundPeer: unexpected err: %v\\n\", err)\n\t}\n\tinPeer := peer.NewInboundPeer(&remotePeerCfg)\n\n\terr = setupPeerConnection(inPeer, localPeer)\n\tif err != nil {\n\t\tt.Fatalf(\"setupPeerConnection failed to connect: %v\\n\", err)\n\t}\n\n\t// Wait for the veracks from the initial protocol version negotiation.\n\tfor i := 0; i < 2; i++ {\n\t\tselect {\n\t\tcase <-verack:\n\t\tcase <-time.After(time.Second):\n\t\t\tt.Fatal(\"verack timeout\")\n\t\t}\n\t}\n\n\t// Ensure the latest block height starts at the value reported by the remote\n\t// peer via its version message.\n\tif height := localPeer.LastBlock(); height != remotePeerHeight {\n\t\tt.Fatalf(\"wrong starting height - got %d, want %d\", height,\n\t\t\tremotePeerHeight)\n\t}\n\n\t// Ensure the latest block height is not allowed to go backwards.\n\tlocalPeer.UpdateLastBlockHeight(remotePeerHeight - 1)\n\tif height := localPeer.LastBlock(); height != remotePeerHeight {\n\t\tt.Fatalf(\"height allowed to go backwards - got %d, want %d\", height,\n\t\t\tremotePeerHeight)\n\t}\n\n\t// Ensure the latest block height is allowed to advance.\n\tlocalPeer.UpdateLastBlockHeight(remotePeerHeight + 1)\n\tif height := localPeer.LastBlock(); height != remotePeerHeight+1 {\n\t\tt.Fatalf(\"height not allowed to advance - got %d, want %d\", height,\n\t\t\tremotePeerHeight+1)\n\t}\n}\n\n// setupPeerConnection initiates a tcp connection between two peers.\nfunc setupPeerConnection(in, out *peer.Peer) error {\n\t// listenFunc is a function closure that listens for a tcp connection.\n\t// The tcp connection will be the one the inbound peer uses. This will\n\t// be run as a goroutine.\n\tlistenFunc := func(l *net.TCPListener, errChan chan error,\n\t\tlistenChan chan struct{}) {\n\n\t\tlistenChan <- struct{}{}\n\n\t\tconn, err := l.Accept()\n\t\tif err != nil {\n\t\t\terrChan <- err\n\t\t\treturn\n\t\t}\n\n\t\tin.AssociateConnection(conn)\n\t\terrChan <- nil\n\t}\n\n\t// dialFunc is a function closure that initiates the tcp connection.\n\t// The tcp connection will be the one the outbound peer uses.\n\tdialFunc := func(addr *net.TCPAddr) error {\n\t\tconn, err := net.Dial(\"tcp\", addr.String())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tout.AssociateConnection(conn)\n\t\treturn nil\n\t}\n\n\tlistenAddr := \"localhost:0\"\n\n\taddr, err := net.ResolveTCPAddr(\"tcp\", listenAddr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tl, err := net.ListenTCP(\"tcp\", addr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terrChan := make(chan error, 1)\n\tlistenChan := make(chan struct{}, 1)\n\n\tgo listenFunc(l, errChan, listenChan)\n\t<-listenChan\n\n\tif err := dialFunc(l.Addr().(*net.TCPAddr)); err != nil {\n\t\treturn err\n\t}\n\n\tselect {\n\tcase err = <-errChan:\n\t\treturn err\n\tcase <-time.After(time.Second * 2):\n\t\treturn errors.New(\"failed to create connection\")\n\t}\n}\n\n// TestSendAddrV2Handshake tests that the version-verack handshake with the\n// addition of the sendaddrv2 message works as expected.\nfunc TestSendAddrV2Handshake(t *testing.T) {\n\tverack := make(chan struct{}, 2)\n\tsendaddr := make(chan struct{}, 2)\n\tpeer1Cfg := &peer.Config{\n\t\tListeners: peer.MessageListeners{\n\t\t\tOnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) {\n\t\t\t\tverack <- struct{}{}\n\t\t\t},\n\t\t\tOnSendAddrV2: func(p *peer.Peer,\n\t\t\t\tmsg *wire.MsgSendAddrV2) {\n\n\t\t\t\tsendaddr <- struct{}{}\n\t\t\t},\n\t\t},\n\t\tAllowSelfConns: true,\n\t\tChainParams:    &chaincfg.MainNetParams,\n\t}\n\n\tpeer2Cfg := &peer.Config{\n\t\tListeners:      peer1Cfg.Listeners,\n\t\tAllowSelfConns: true,\n\t\tChainParams:    &chaincfg.MainNetParams,\n\t}\n\n\tverackErr := errors.New(\"verack timeout\")\n\n\ttests := []struct {\n\t\tname      string\n\t\texpectsV2 bool\n\t\tsetup     func() (*peer.Peer, *peer.Peer, error)\n\t}{\n\t\t{\n\t\t\t\"successful sendaddrv2 handshake\",\n\t\t\ttrue,\n\t\t\tfunc() (*peer.Peer, *peer.Peer, error) {\n\t\t\t\tinPeer := peer.NewInboundPeer(peer1Cfg)\n\t\t\t\toutPeer, err := peer.NewOutboundPeer(\n\t\t\t\t\tpeer2Cfg, \"10.0.0.2:8333\",\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\n\t\t\t\terr = setupPeerConnection(inPeer, outPeer)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\n\t\t\t\tfor i := 0; i < 4; i++ {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase <-sendaddr:\n\t\t\t\t\tcase <-verack:\n\t\t\t\t\tcase <-time.After(time.Second * 2):\n\t\t\t\t\t\treturn nil, nil, verackErr\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn inPeer, outPeer, nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"handshake with legacy inbound peer\",\n\t\t\tfalse,\n\t\t\tfunc() (*peer.Peer, *peer.Peer, error) {\n\t\t\t\tlegacyVersion := wire.AddrV2Version - 1\n\t\t\t\tpeer1Cfg.ProtocolVersion = legacyVersion\n\t\t\t\tinPeer := peer.NewInboundPeer(peer1Cfg)\n\t\t\t\toutPeer, err := peer.NewOutboundPeer(\n\t\t\t\t\tpeer2Cfg, \"10.0.0.2:8333\",\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\n\t\t\t\terr = setupPeerConnection(inPeer, outPeer)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\n\t\t\t\tfor i := 0; i < 2; i++ {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase <-verack:\n\t\t\t\t\tcase <-time.After(time.Second * 2):\n\t\t\t\t\t\treturn nil, nil, verackErr\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn inPeer, outPeer, nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"handshake with legacy outbound peer\",\n\t\t\tfalse,\n\t\t\tfunc() (*peer.Peer, *peer.Peer, error) {\n\t\t\t\tinPeer := peer.NewInboundPeer(peer1Cfg)\n\t\t\t\tlegacyVersion := wire.AddrV2Version - 1\n\t\t\t\tpeer2Cfg.ProtocolVersion = legacyVersion\n\t\t\t\toutPeer, err := peer.NewOutboundPeer(\n\t\t\t\t\tpeer2Cfg, \"10.0.0.2:8333\",\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\n\t\t\t\terr = setupPeerConnection(inPeer, outPeer)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\n\t\t\t\tfor i := 0; i < 2; i++ {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase <-verack:\n\t\t\t\t\tcase <-time.After(time.Second * 2):\n\t\t\t\t\t\treturn nil, nil, verackErr\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn inPeer, outPeer, nil\n\t\t\t},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tinPeer, outPeer, err := test.setup()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"TestSendAddrV2Handshake setup #%d: \"+\n\t\t\t\t\"unexpected err: %v\", i, err)\n\t\t}\n\n\t\tif inPeer.WantsAddrV2() != test.expectsV2 {\n\t\t\tt.Fatalf(\"TestSendAddrV2Handshake #%d expected \"+\n\t\t\t\t\"wantsAddrV2 to be %v instead was %v\", i,\n\t\t\t\ttest.expectsV2, inPeer.WantsAddrV2())\n\t\t} else if outPeer.WantsAddrV2() != test.expectsV2 {\n\t\t\tt.Fatalf(\"TestSendAddrV2Handshake #%d expected \"+\n\t\t\t\t\"wantsAddrV2 to be %v instead was %v\", i,\n\t\t\t\ttest.expectsV2, outPeer.WantsAddrV2())\n\t\t}\n\n\t\tinPeer.Disconnect()\n\t\toutPeer.Disconnect()\n\t\tinPeer.WaitForDisconnect()\n\t\toutPeer.WaitForDisconnect()\n\t}\n}\n"
  },
  {
    "path": "peer/recover_test.go",
    "content": "package peer\n\nimport (\n\t\"sync/atomic\"\n\t\"testing\"\n)\n\n// TestRecoverFromPanic verifies that recoverFromPanic catches a panic\n// and disconnects the peer instead of crashing the process.\nfunc TestRecoverFromPanic(t *testing.T) {\n\tt.Parallel()\n\n\t// Build a minimal Peer with a closed quit channel so\n\t// Disconnect() does not block or nil-deref.\n\tp := &Peer{\n\t\tquit: make(chan struct{}),\n\t}\n\n\t// Simulate a goroutine that panics.\n\tdone := make(chan struct{})\n\tgo func() {\n\t\tdefer close(done)\n\t\tdefer p.recoverFromPanic()\n\n\t\tpanic(\"test: crafted message decode\")\n\t}()\n\n\t<-done\n\n\t// After recovery, the disconnect flag must be set.\n\tif atomic.LoadInt32(&p.disconnect) == 0 {\n\t\tt.Fatal(\"expected disconnect flag to be set \" +\n\t\t\t\"after panic recovery\")\n\t}\n}\n"
  },
  {
    "path": "release/README.md",
    "content": "# `btcd`'s Reproducible Build System\n\nThis package contains the build script that the `btcd` project uses in order to\nbuild binaries for each new release. As of `go1.13`, with some new build flags,\nbinaries are now reproducible, allowing developers to build the binary on\ndistinct machines, and end up with a byte-for-byte identical binary.\nEvery release should note which Go version was used to build the release, so\nthat version should be used for verifying the release.\n\n## Building a New Release\n\n### Tagging and pushing a new tag (for maintainers)\n\nBefore running release scripts, a few things need to happen in order to finally\ncreate a release and make sure there are no mistakes in the release process.\n\nFirst, make sure that before the tagged commit there are modifications to the\n[CHANGES](../CHANGES) file committed.\nThe CHANGES file should be a changelog that roughly mirrors the release notes.\nGenerally, the PRs that have been merged since the last release have been\nlisted in the CHANGES file and categorized.\nFor example, these changes have had the following format in the past:\n```\nChanges in X.YY.Z (Month Day Year):\n  - Protocol and Network-related changes:\n    - PR Title One (#PRNUM)\n    - PR Title Two (#PRNUMTWO)\n    ...\n  - RPC changes:\n  - Crypto changes:\n  ...\n\n  - Contributors (alphabetical order):\n    - Contributor A\n    - Contributor B\n    - Contributor C\n    ...\n```\n\nIf the previous tag is, for example, `vA.B.C`, then you can get the list of\ncontributors (from `vA.B.C` until the current `HEAD`) using the following command:\n```bash\ngit log vA.B.C..HEAD --pretty=\"%an\" | sort | uniq\n```\nAfter committing changes to the CHANGES file, the tagged release commit\nshould be created.\n\nThe tagged commit should be a commit that bumps version numbers in `version.go`\nand `cmd/btcctl/version.go`.\nFor example (taken from [f3ec130](https://github.com/btcsuite/btcd/commit/f3ec13030e4e828869954472cbc51ac36bee5c1d)):\n```diff\ndiff --git a/cmd/btcctl/version.go b/cmd/btcctl/version.go\nindex 2195175c71..f65cacef7e 100644\n--- a/cmd/btcctl/version.go\n+++ b/cmd/btcctl/version.go\n@@ -18,7 +18,7 @@ const semanticAlphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\n const (\n \tappMajor uint = 0\n \tappMinor uint = 20\n-\tappPatch uint = 0\n+\tappPatch uint = 1\n \n \t// appPreRelease MUST only contain characters from semanticAlphabet\n \t// per the semantic versioning spec.\ndiff --git a/version.go b/version.go\nindex 92fd60fdd4..fba55b5a37 100644\n--- a/version.go\n+++ b/version.go\n@@ -18,7 +18,7 @@ const semanticAlphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\n const (\n \tappMajor uint = 0\n \tappMinor uint = 20\n-\tappPatch uint = 0\n+\tappPatch uint = 1\n \n \t// appPreRelease MUST only contain characters from semanticAlphabet\n \t// per the semantic versioning spec.\n```\n\nNext, this commit should be signed by the maintainer using `git commit -S`.\nThe commit should be tagged and signed with `git tag <TAG> -s`, and should be\npushed using `git push origin TAG`.\n\n### Building a release on macOS/Linux/Windows (WSL)\n\nNo prior set up is needed on Linux or macOS is required in order to build the\nrelease binaries. However, on Windows, the only way to build the release\nbinaries at the moment is by using the Windows Subsystem Linux. One can build\nthe release binaries following these steps:\n\n1. `git clone https://github.com/btcsuite/btcd.git`\n2. `cd btcd`\n3. `./release/release.sh <TAG> # <TAG> is the name of the next release/tag`\n\nThis will then create a directory of the form `btcd-<TAG>` containing archives\nof the release binaries for each supported operating system and architecture,\nand a manifest file containing the hash of each archive.\n\n### Pushing a release (for maintainers)\n\nNow that the directory `btcd-<TAG>` is created, the manifest file needs to be\nsigned by a maintainer and the release files need to be published to GitHub.\n\nSign the `manifest-<TAG>.txt` file like so:\n```sh\ngpg --sign --detach-sig manifest-<TAG>.txt\n```\nThis will create a file named `manifest-<TAG>.txt.sig`, which will must\nbe included in the release files later.\n\n#### Note before publishing\nBefore publishing, go through the reproducible build process that is outlined\nin this document with the files created from `release/release.sh`. This includes\nverifying commit and tag signatures using `git verify-commit` and git `verify-tag`\nrespectively.\n\nNow that we've double-checked everything and have all of the necessary files,\nit's time to publish release files on GitHub.\nFollow [this documentation](https://docs.github.com/en/github/administering-a-repository/managing-releases-in-a-repository)\nto create a release using the GitHub UI, and make sure to write release notes\nwhich roughly follow the format of [previous release notes](https://github.com/btcsuite/btcd/releases/tag/v0.20.1-beta).\nThis is different from the [CHANGES](../CHANGES) file, which should be before the\ntagged commit in the git history.\nMuch of the information in the release notes will be the same as the CHANGES\nfile.\nIt's important to include the Go version used to produce the release files in\nthe release notes, so users know the correct version of Go to use to reproduce\nand verify the build.\nWhen following the GitHub documentation, include every file in the `btcd-<TAG>`\ndirectory.\n\nAt this point, a signed commit and tag on that commit should be pushed to the main\nbranch. The directory created from running `release/release.sh` should be included\nas release files in the GitHub release UI, and the `manifest-<TAG>.txt` file\nsignature, called `manifest-<TAG>.txt.sig`, should also be included.\nA release notes document should be created and written in the GitHub release UI.\nOnce all of this is done, feel free to click `Publish Release`!\n\n## Verifying a Release\n\nWith `go1.13`, it's now possible for third parties to verify release binaries.\nBefore this version of `go`, one had to trust the release manager(s) to build the\nproper binary. With this new system, third parties can now _independently_ run\nthe release process, and verify that all the hashes of the release binaries\nmatch exactly that of the release binaries produced by said third parties.\n\nTo verify a release, one must obtain the following tools (many of these come\ninstalled by default in most Unix systems): `gpg`/`gpg2`, `shashum`, and\n`tar`/`unzip`.\n\nOnce done, verifiers can proceed with the following steps:\n\n1. Acquire the archive containing the release binaries for one's specific\n   operating system and architecture, and the manifest file along with its\n   signature.\n2. Verify the signature of the manifest file with `gpg --verify\n   manifest-<TAG>.txt.sig`. This will require obtaining the PGP keys which\n   signed the manifest file, which are included in the release notes.\n3. Recompute the `SHA256` hash of the archive with `shasum -a 256 <filename>`,\n   locate the corresponding one in the manifest file, and ensure they match\n   __exactly__.\n\nAt this point, verifiers can use the release binaries acquired if they trust\nthe integrity of the release manager(s). Otherwise, one can proceed with the\nguide to verify the release binaries were built properly by obtaining `shasum`\nand `go` (matching the same version used in the release):\n\n4. Extract the release binaries contained within the archive, compute their\n   hashes as done above, and note them down.\n5. Ensure `go` is installed, matching the same version as noted in the release\n   notes. \n6. Obtain a copy of `btcd`'s source code with `git clone\n   https://github.com/btcsuite/btcd` and checkout the source code of the\n   release with `git checkout <TAG>`.\n7. Proceed to verify the tag with `git verify-tag <TAG>` and compile the\n   binaries from source for the intended operating system and architecture with\n   `BTCDBUILDSYS=OS-ARCH ./release/release.sh <TAG>`.\n8. Extract the archive found in the `btcd-<TAG>` directory created by the\n   release script and recompute the `SHA256` hash of the release binaries (btcd\n   and btcctl) with `shasum -a 256 <filename>`. These should match __exactly__\n   as the ones noted above."
  },
  {
    "path": "release/release.sh",
    "content": "#!/bin/bash\n\n# Copyright (c) 2016 Company 0, LLC.\n# Copyright (c) 2016-2020 The btcsuite developers\n# Use of this source code is governed by an ISC\n# license that can be found in the LICENSE file.\n\n# Simple bash script to build basic btcd tools for all the platforms we support\n# with the golang cross-compiler.\n\nset -e\n\n# If no tag specified, use date + version otherwise use tag.\nif [[ $1x = x ]]; then\n    DATE=`date +%Y%m%d`\n    VERSION=\"01\"\n    TAG=$DATE-$VERSION\nelse\n    TAG=$1\nfi\n\ngo mod vendor\ntar -cvzf vendor.tar.gz vendor\n\nPACKAGE=btcd\nMAINDIR=$PACKAGE-$TAG\nmkdir -p $MAINDIR\n\ncp vendor.tar.gz $MAINDIR/\nrm vendor.tar.gz\nrm -r vendor\n\nPACKAGESRC=\"$MAINDIR/$PACKAGE-source-$TAG.tar\"\ngit archive -o $PACKAGESRC HEAD\ngzip -f $PACKAGESRC > \"$PACKAGESRC.gz\"\n\ncd $MAINDIR\n\n# If BTCDBUILDSYS is set the default list is ignored. Useful to release\n# for a subset of systems/architectures.\nSYS=${BTCDBUILDSYS:-\"\n        darwin-amd64\n        darwin-arm64\n        dragonfly-amd64\n        freebsd-386\n        freebsd-amd64\n        freebsd-arm\n        illumos-amd64\n        linux-386\n        linux-amd64\n        linux-armv6\n        linux-armv7\n        linux-arm64\n        linux-ppc64\n        linux-ppc64le\n        linux-mips\n        linux-mipsle\n        linux-mips64\n        linux-mips64le\n        linux-s390x\n        netbsd-386\n        netbsd-amd64\n        netbsd-arm\n        netbsd-arm64\n        openbsd-386\n        openbsd-amd64\n        openbsd-arm\n        openbsd-arm64\n        solaris-amd64\n        windows-386\n        windows-amd64\n\"}\n\n# Use the first element of $GOPATH in the case where GOPATH is a list\n# (something that is totally allowed).\nPKG=\"github.com/btcsuite/btcd\"\nCOMMIT=$(git describe --abbrev=40 --dirty)\n\nfor i in $SYS; do\n    OS=$(echo $i | cut -f1 -d-)\n    ARCH=$(echo $i | cut -f2 -d-)\n    ARM=\n\n    if [[ $ARCH = \"armv6\" ]]; then\n      ARCH=arm\n      ARM=6\n    elif [[ $ARCH = \"armv7\" ]]; then\n      ARCH=arm\n      ARM=7\n    fi\n\n    mkdir $PACKAGE-$i-$TAG\n    cd $PACKAGE-$i-$TAG\n\n    echo \"Building:\" $OS $ARCH $ARM\n    env CGO_ENABLED=0 GOOS=$OS GOARCH=$ARCH GOARM=$ARM go build -v -trimpath -ldflags=\"-s -w -buildid=\" github.com/btcsuite/btcd\n    env CGO_ENABLED=0 GOOS=$OS GOARCH=$ARCH GOARM=$ARM go build -v -trimpath -ldflags=\"-s -w -buildid=\" github.com/btcsuite/btcd/cmd/btcctl\n    cd ..\n\n    if [[ $OS = \"windows\" ]]; then\n\tzip -r $PACKAGE-$i-$TAG.zip $PACKAGE-$i-$TAG\n    else\n\ttar -cvzf $PACKAGE-$i-$TAG.tar.gz $PACKAGE-$i-$TAG\n    fi\n\n    rm -r $PACKAGE-$i-$TAG\ndone\n\nshasum -a 256 * > manifest-$TAG.txt\n"
  },
  {
    "path": "rpcadapters.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"sync/atomic\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/mempool\"\n\t\"github.com/btcsuite/btcd/netsync\"\n\t\"github.com/btcsuite/btcd/peer\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// rpcPeer provides a peer for use with the RPC server and implements the\n// rpcserverPeer interface.\ntype rpcPeer serverPeer\n\n// Ensure rpcPeer implements the rpcserverPeer interface.\nvar _ rpcserverPeer = (*rpcPeer)(nil)\n\n// ToPeer returns the underlying peer instance.\n//\n// This function is safe for concurrent access and is part of the rpcserverPeer\n// interface implementation.\nfunc (p *rpcPeer) ToPeer() *peer.Peer {\n\tif p == nil {\n\t\treturn nil\n\t}\n\treturn (*serverPeer)(p).Peer\n}\n\n// IsTxRelayDisabled returns whether or not the peer has disabled transaction\n// relay.\n//\n// This function is safe for concurrent access and is part of the rpcserverPeer\n// interface implementation.\nfunc (p *rpcPeer) IsTxRelayDisabled() bool {\n\treturn (*serverPeer)(p).disableRelayTx\n}\n\n// BanScore returns the current integer value that represents how close the peer\n// is to being banned.\n//\n// This function is safe for concurrent access and is part of the rpcserverPeer\n// interface implementation.\nfunc (p *rpcPeer) BanScore() uint32 {\n\treturn (*serverPeer)(p).banScore.Int()\n}\n\n// FeeFilter returns the requested current minimum fee rate for which\n// transactions should be announced.\n//\n// This function is safe for concurrent access and is part of the rpcserverPeer\n// interface implementation.\nfunc (p *rpcPeer) FeeFilter() int64 {\n\treturn atomic.LoadInt64(&(*serverPeer)(p).feeFilter)\n}\n\n// rpcConnManager provides a connection manager for use with the RPC server and\n// implements the rpcserverConnManager interface.\ntype rpcConnManager struct {\n\tserver *server\n}\n\n// Ensure rpcConnManager implements the rpcserverConnManager interface.\nvar _ rpcserverConnManager = &rpcConnManager{}\n\n// Connect adds the provided address as a new outbound peer.  The permanent flag\n// indicates whether or not to make the peer persistent and reconnect if the\n// connection is lost.  Attempting to connect to an already existing peer will\n// return an error.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) Connect(addr string, permanent bool) error {\n\treplyChan := make(chan error)\n\tcm.server.query <- connectNodeMsg{\n\t\taddr:      addr,\n\t\tpermanent: permanent,\n\t\treply:     replyChan,\n\t}\n\treturn <-replyChan\n}\n\n// RemoveByID removes the peer associated with the provided id from the list of\n// persistent peers.  Attempting to remove an id that does not exist will return\n// an error.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) RemoveByID(id int32) error {\n\treplyChan := make(chan error)\n\tcm.server.query <- removeNodeMsg{\n\t\tcmp:   func(sp *serverPeer) bool { return sp.ID() == id },\n\t\treply: replyChan,\n\t}\n\treturn <-replyChan\n}\n\n// RemoveByAddr removes the peer associated with the provided address from the\n// list of persistent peers.  Attempting to remove an address that does not\n// exist will return an error.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) RemoveByAddr(addr string) error {\n\treplyChan := make(chan error)\n\tcm.server.query <- removeNodeMsg{\n\t\tcmp:   func(sp *serverPeer) bool { return sp.Addr() == addr },\n\t\treply: replyChan,\n\t}\n\treturn <-replyChan\n}\n\n// DisconnectByID disconnects the peer associated with the provided id.  This\n// applies to both inbound and outbound peers.  Attempting to remove an id that\n// does not exist will return an error.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) DisconnectByID(id int32) error {\n\treplyChan := make(chan error)\n\tcm.server.query <- disconnectNodeMsg{\n\t\tcmp:   func(sp *serverPeer) bool { return sp.ID() == id },\n\t\treply: replyChan,\n\t}\n\treturn <-replyChan\n}\n\n// DisconnectByAddr disconnects the peer associated with the provided address.\n// This applies to both inbound and outbound peers.  Attempting to remove an\n// address that does not exist will return an error.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) DisconnectByAddr(addr string) error {\n\treplyChan := make(chan error)\n\tcm.server.query <- disconnectNodeMsg{\n\t\tcmp:   func(sp *serverPeer) bool { return sp.Addr() == addr },\n\t\treply: replyChan,\n\t}\n\treturn <-replyChan\n}\n\n// ConnectedCount returns the number of currently connected peers.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) ConnectedCount() int32 {\n\treturn cm.server.ConnectedCount()\n}\n\n// NetTotals returns the sum of all bytes received and sent across the network\n// for all peers.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) NetTotals() (uint64, uint64) {\n\treturn cm.server.NetTotals()\n}\n\n// ConnectedPeers returns an array consisting of all connected peers.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) ConnectedPeers() []rpcserverPeer {\n\treplyChan := make(chan []*serverPeer)\n\tcm.server.query <- getPeersMsg{reply: replyChan}\n\tserverPeers := <-replyChan\n\n\t// Convert to RPC server peers.\n\tpeers := make([]rpcserverPeer, 0, len(serverPeers))\n\tfor _, sp := range serverPeers {\n\t\tpeers = append(peers, (*rpcPeer)(sp))\n\t}\n\treturn peers\n}\n\n// PersistentPeers returns an array consisting of all the added persistent\n// peers.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) PersistentPeers() []rpcserverPeer {\n\treplyChan := make(chan []*serverPeer)\n\tcm.server.query <- getAddedNodesMsg{reply: replyChan}\n\tserverPeers := <-replyChan\n\n\t// Convert to generic peers.\n\tpeers := make([]rpcserverPeer, 0, len(serverPeers))\n\tfor _, sp := range serverPeers {\n\t\tpeers = append(peers, (*rpcPeer)(sp))\n\t}\n\treturn peers\n}\n\n// BroadcastMessage sends the provided message to all currently connected peers.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) BroadcastMessage(msg wire.Message) {\n\tcm.server.BroadcastMessage(msg)\n}\n\n// AddRebroadcastInventory adds the provided inventory to the list of\n// inventories to be rebroadcast at random intervals until they show up in a\n// block.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) AddRebroadcastInventory(iv *wire.InvVect, data interface{}) {\n\tcm.server.AddRebroadcastInventory(iv, data)\n}\n\n// RelayTransactions generates and relays inventory vectors for all of the\n// passed transactions to all connected peers.\nfunc (cm *rpcConnManager) RelayTransactions(txns []*mempool.TxDesc) {\n\tcm.server.relayTransactions(txns)\n}\n\n// NodeAddresses returns an array consisting node addresses which can\n// potentially be used to find new nodes in the network.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverConnManager interface implementation.\nfunc (cm *rpcConnManager) NodeAddresses() []*wire.NetAddressV2 {\n\treturn cm.server.addrManager.AddressCache()\n}\n\n// rpcSyncMgr provides a block manager for use with the RPC server and\n// implements the rpcserverSyncManager interface.\ntype rpcSyncMgr struct {\n\tserver  *server\n\tsyncMgr *netsync.SyncManager\n}\n\n// Ensure rpcSyncMgr implements the rpcserverSyncManager interface.\nvar _ rpcserverSyncManager = (*rpcSyncMgr)(nil)\n\n// IsCurrent returns whether or not the sync manager believes the chain is\n// current as compared to the rest of the network.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverSyncManager interface implementation.\nfunc (b *rpcSyncMgr) IsCurrent() bool {\n\treturn b.syncMgr.IsCurrent()\n}\n\n// SubmitBlock submits the provided block to the network after processing it\n// locally.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverSyncManager interface implementation.\nfunc (b *rpcSyncMgr) SubmitBlock(block *btcutil.Block, flags blockchain.BehaviorFlags) (bool, error) {\n\treturn b.syncMgr.ProcessBlock(block, flags)\n}\n\n// Pause pauses the sync manager until the returned channel is closed.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverSyncManager interface implementation.\nfunc (b *rpcSyncMgr) Pause() chan<- struct{} {\n\treturn b.syncMgr.Pause()\n}\n\n// SyncPeerID returns the peer that is currently the peer being used to sync\n// from.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverSyncManager interface implementation.\nfunc (b *rpcSyncMgr) SyncPeerID() int32 {\n\treturn b.syncMgr.SyncPeerID()\n}\n\n// LocateHeaders returns the hashes of the blocks after the first known block in\n// the provided locators until the provided stop hash or the current tip is\n// reached, up to a max of wire.MaxBlockHeadersPerMsg hashes.\n//\n// This function is safe for concurrent access and is part of the\n// rpcserverSyncManager interface implementation.\nfunc (b *rpcSyncMgr) LocateHeaders(locators []*chainhash.Hash, hashStop *chainhash.Hash) []wire.BlockHeader {\n\treturn b.server.chain.LocateHeaders(locators, hashStop)\n}\n"
  },
  {
    "path": "rpcclient/CONTRIBUTORS",
    "content": "# This is the list of people who have contributed code to the repository.\n#\n# Names should be added to this file only after verifying that the individual\n# or the individual's organization has agreed to the LICENSE.\n#\n# Names should be added to this file like so:\n# Name <email address>\n\nDave Collins <davec@conformal.com>\nGeert-Johan Riemer <geertjohan.riemer@gmail.com>\nJosh Rickmar <jrick@conformal.com>\nMichalis Kargakis <michaliskargakis@gmail.com>\nRuben de Vries <ruben@rubensayshi.com\n"
  },
  {
    "path": "rpcclient/README.md",
    "content": "rpcclient\n=========\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/rpcclient)\n\nrpcclient implements a Websocket-enabled Bitcoin JSON-RPC client package written\nin [Go](http://golang.org/).  It provides a robust and easy to use client for\ninterfacing with a Bitcoin RPC server that uses a btcd/bitcoin core compatible\nBitcoin JSON-RPC API.\n\n## Status\n\nThis package is currently under active development.  It is already stable and\nthe infrastructure is complete.  However, there are still several RPCs left to\nimplement and the API is not stable yet.\n\n## Documentation\n\n* [API Reference](https://pkg.go.dev/github.com/btcsuite/btcd/rpcclient)\n* [btcd Websockets Example](https://github.com/btcsuite/btcd/tree/master/rpcclient/examples/btcdwebsockets)\n  Connects to a btcd RPC server using TLS-secured websockets, registers for\n  block connected and block disconnected notifications, and gets the current\n  block count\n* [btcwallet Websockets Example](https://github.com/btcsuite/btcd/tree/master/rpcclient/examples/btcwalletwebsockets)\n  Connects to a btcwallet RPC server using TLS-secured websockets, registers for\n  notifications about changes to account balances, and gets a list of unspent\n  transaction outputs (utxos) the wallet can sign\n* [Bitcoin Core HTTP POST Example](https://github.com/btcsuite/btcd/tree/master/rpcclient/examples/bitcoincorehttp)\n  Connects to a bitcoin core RPC server using HTTP POST mode with TLS disabled\n  and gets the current block count\n\n## Major Features\n\n* Supports Websockets (btcd/btcwallet) and HTTP POST mode (bitcoin core)\n* Provides callback and registration functions for btcd/btcwallet notifications\n* Supports btcd extensions\n* Translates to and from higher-level and easier to use Go types\n* Offers a synchronous (blocking) and asynchronous API\n* When running in Websockets mode (the default):\n  * Automatic reconnect handling (can be disabled)\n  * Outstanding commands are automatically reissued\n  * Registered notifications are automatically reregistered\n  * Back-off support on reconnect attempts\n\n## Installation\n\n```bash\n$ go get -u github.com/btcsuite/btcd/rpcclient\n```\n\n## License\n\nPackage rpcclient is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "rpcclient/backend_version.go",
    "content": "package rpcclient\n\nimport \"strings\"\n\n// BackendVersion defines an interface to handle the version of the backend\n// used by the client.\ntype BackendVersion interface {\n\t// String returns a human-readable backend version.\n\tString() string\n\n\t// SupportUnifiedSoftForks returns true if the backend supports the\n\t// unified softforks format.\n\tSupportUnifiedSoftForks() bool\n\n\t// SupportTestMempoolAccept returns true if the backend supports the\n\t// testmempoolaccept RPC.\n\tSupportTestMempoolAccept() bool\n\n\t// SupportGetTxSpendingPrevOut returns true if the backend supports the\n\t// gettxspendingprevout RPC.\n\tSupportGetTxSpendingPrevOut() bool\n}\n\n// BitcoindVersion represents the version of the bitcoind the client is\n// currently connected to.\ntype BitcoindVersion uint8\n\nconst (\n\t// BitcoindPre19 represents a bitcoind version before 0.19.0.\n\tBitcoindPre19 BitcoindVersion = iota\n\n\t// BitcoindPre22 represents a bitcoind version equal to or greater than\n\t// 0.19.0 and smaller than 22.0.0.\n\tBitcoindPre22\n\n\t// BitcoindPre24 represents a bitcoind version equal to or greater than\n\t// 22.0.0 and smaller than 24.0.0.\n\tBitcoindPre24\n\n\t// BitcoindPre25 represents a bitcoind version equal to or greater than\n\t// 24.0.0 and smaller than 25.0.0.\n\tBitcoindPre25\n\n\t// BitcoindPre25 represents a bitcoind version equal to or greater than\n\t// 25.0.0.\n\tBitcoindPost25\n)\n\n// String returns a human-readable backend version.\nfunc (b BitcoindVersion) String() string {\n\tswitch b {\n\tcase BitcoindPre19:\n\t\treturn \"bitcoind 0.19 and below\"\n\n\tcase BitcoindPre22:\n\t\treturn \"bitcoind v0.19.0-v22.0.0\"\n\n\tcase BitcoindPre24:\n\t\treturn \"bitcoind v22.0.0-v24.0.0\"\n\n\tcase BitcoindPre25:\n\t\treturn \"bitcoind v24.0.0-v25.0.0\"\n\n\tcase BitcoindPost25:\n\t\treturn \"bitcoind v25.0.0 and above\"\n\n\tdefault:\n\t\treturn \"unknown\"\n\t}\n}\n\n// SupportUnifiedSoftForks returns true if the backend supports the unified\n// softforks format.\nfunc (b BitcoindVersion) SupportUnifiedSoftForks() bool {\n\t// Versions of bitcoind on or after v0.19.0 use the unified format.\n\treturn b > BitcoindPre19\n}\n\n// SupportTestMempoolAccept returns true if bitcoind version is 22.0.0 or\n// above.\nfunc (b BitcoindVersion) SupportTestMempoolAccept() bool {\n\treturn b > BitcoindPre22\n}\n\n// SupportGetTxSpendingPrevOut returns true if bitcoind version is 24.0.0 or\n// above.\nfunc (b BitcoindVersion) SupportGetTxSpendingPrevOut() bool {\n\treturn b > BitcoindPre24\n}\n\n// Compile-time checks to ensure that BitcoindVersion satisfy the\n// BackendVersion interface.\nvar _ BackendVersion = BitcoindVersion(0)\n\nconst (\n\t// bitcoind19Str is the string representation of bitcoind v0.19.0.\n\tbitcoind19Str = \"0.19.0\"\n\n\t// bitcoind22Str is the string representation of bitcoind v22.0.0.\n\tbitcoind22Str = \"22.0.0\"\n\n\t// bitcoind24Str is the string representation of bitcoind v24.0.0.\n\tbitcoind24Str = \"24.0.0\"\n\n\t// bitcoind25Str is the string representation of bitcoind v25.0.0.\n\tbitcoind25Str = \"25.0.0\"\n\n\t// bitcoindVersionPrefix specifies the prefix included in every bitcoind\n\t// version exposed through GetNetworkInfo.\n\tbitcoindVersionPrefix = \"/Satoshi:\"\n\n\t// bitcoindVersionSuffix specifies the suffix included in every bitcoind\n\t// version exposed through GetNetworkInfo.\n\tbitcoindVersionSuffix = \"/\"\n)\n\n// parseBitcoindVersion parses the bitcoind version from its string\n// representation.\nfunc parseBitcoindVersion(version string) BitcoindVersion {\n\t// Trim the version of its prefix and suffix to determine the\n\t// appropriate version number.\n\tversion = strings.TrimPrefix(\n\t\tstrings.TrimSuffix(version, bitcoindVersionSuffix),\n\t\tbitcoindVersionPrefix,\n\t)\n\tswitch {\n\tcase version < bitcoind19Str:\n\t\treturn BitcoindPre19\n\n\tcase version < bitcoind22Str:\n\t\treturn BitcoindPre22\n\n\tcase version < bitcoind24Str:\n\t\treturn BitcoindPre24\n\n\tcase version < bitcoind25Str:\n\t\treturn BitcoindPre25\n\n\tdefault:\n\t\treturn BitcoindPost25\n\t}\n}\n\n// BtcdVersion represents the version of the btcd the client is currently\n// connected to.\ntype BtcdVersion int32\n\nconst (\n\t// BtcdPre2401 describes a btcd version before 0.24.1, which doesn't\n\t// include the `testmempoolaccept` and `gettxspendingprevout` RPCs.\n\tBtcdPre2401 BtcdVersion = iota\n\n\t// BtcdPost2401 describes a btcd version equal to or greater than\n\t// 0.24.1.\n\tBtcdPost2401\n)\n\n// String returns a human-readable backend version.\nfunc (b BtcdVersion) String() string {\n\tswitch b {\n\tcase BtcdPre2401:\n\t\treturn \"btcd 24.0.0 and below\"\n\n\tcase BtcdPost2401:\n\t\treturn \"btcd 24.1.0 and above\"\n\n\tdefault:\n\t\treturn \"unknown\"\n\t}\n}\n\n// SupportUnifiedSoftForks returns true if the backend supports the unified\n// softforks format.\n//\n// NOTE: always true for btcd as we didn't track it before.\nfunc (b BtcdVersion) SupportUnifiedSoftForks() bool {\n\treturn true\n}\n\n// SupportTestMempoolAccept returns true if btcd version is 24.1.0 or above.\nfunc (b BtcdVersion) SupportTestMempoolAccept() bool {\n\treturn b > BtcdPre2401\n}\n\n// SupportGetTxSpendingPrevOut returns true if btcd version is 24.1.0 or above.\nfunc (b BtcdVersion) SupportGetTxSpendingPrevOut() bool {\n\treturn b > BtcdPre2401\n}\n\n// Compile-time checks to ensure that BtcdVersion satisfy the BackendVersion\n// interface.\nvar _ BackendVersion = BtcdVersion(0)\n\nconst (\n\t// btcd2401Val is the int representation of btcd v0.24.1.\n\tbtcd2401Val = 240100\n)\n\n// parseBtcdVersion parses the btcd version from its string representation.\nfunc parseBtcdVersion(version int32) BtcdVersion {\n\tswitch {\n\tcase version < btcd2401Val:\n\t\treturn BtcdPre2401\n\n\tdefault:\n\t\treturn BtcdPost2401\n\t}\n}\n"
  },
  {
    "path": "rpcclient/backend_version_test.go",
    "content": "package rpcclient\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestParseBitcoindVersion checks that the correct version from bitcoind's\n// `getnetworkinfo` RPC call is parsed.\nfunc TestParseBitcoindVersion(t *testing.T) {\n\tt.Parallel()\n\n\ttestCases := []struct {\n\t\tname          string\n\t\trpcVersion    string\n\t\tparsedVersion BitcoindVersion\n\t}{\n\t\t{\n\t\t\tname:          \"parse version 0.19 and below\",\n\t\t\trpcVersion:    \"/Satoshi:0.18.0/\",\n\t\t\tparsedVersion: BitcoindPre19,\n\t\t},\n\t\t{\n\t\t\tname:          \"parse version 0.19\",\n\t\t\trpcVersion:    \"/Satoshi:0.19.0/\",\n\t\t\tparsedVersion: BitcoindPre22,\n\t\t},\n\t\t{\n\t\t\tname:          \"parse version 0.19 - 22.0\",\n\t\t\trpcVersion:    \"/Satoshi:0.20.1/\",\n\t\t\tparsedVersion: BitcoindPre22,\n\t\t},\n\t\t{\n\t\t\tname:          \"parse version 22.0\",\n\t\t\trpcVersion:    \"/Satoshi:22.0.0/\",\n\t\t\tparsedVersion: BitcoindPre24,\n\t\t},\n\t\t{\n\t\t\tname:          \"parse version 22.0 - 24.0\",\n\t\t\trpcVersion:    \"/Satoshi:23.1.0/\",\n\t\t\tparsedVersion: BitcoindPre24,\n\t\t},\n\t\t{\n\t\t\tname:          \"parse version 24.0\",\n\t\t\trpcVersion:    \"/Satoshi:24.0.0/\",\n\t\t\tparsedVersion: BitcoindPre25,\n\t\t},\n\t\t{\n\t\t\tname:          \"parse version 25.0\",\n\t\t\trpcVersion:    \"/Satoshi:25.0.0/\",\n\t\t\tparsedVersion: BitcoindPost25,\n\t\t},\n\t\t{\n\t\t\tname:          \"parse version 25.0 and above\",\n\t\t\trpcVersion:    \"/Satoshi:26.0.0/\",\n\t\t\tparsedVersion: BitcoindPost25,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tversion := parseBitcoindVersion(tc.rpcVersion)\n\t\t\trequire.Equal(t, tc.parsedVersion, version)\n\t\t})\n\t}\n}\n\n// TestParseBtcdVersion checks that the correct version from btcd's `getinfo`\n// RPC call is parsed.\nfunc TestParseBtcdVersion(t *testing.T) {\n\tt.Parallel()\n\n\ttestCases := []struct {\n\t\tname          string\n\t\trpcVersion    int32\n\t\tparsedVersion BtcdVersion\n\t}{\n\t\t{\n\t\t\tname:          \"parse version 0.24 and below\",\n\t\t\trpcVersion:    230000,\n\t\t\tparsedVersion: BtcdPre2401,\n\t\t},\n\t\t{\n\t\t\tname:          \"parse version 0.24.1\",\n\t\t\trpcVersion:    240100,\n\t\t\tparsedVersion: BtcdPost2401,\n\t\t},\n\t\t{\n\t\t\tname:          \"parse version 0.24.1 and above\",\n\t\t\trpcVersion:    250000,\n\t\t\tparsedVersion: BtcdPost2401,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tversion := parseBtcdVersion(tc.rpcVersion)\n\t\t\trequire.Equal(t, tc.parsedVersion, version)\n\t\t})\n\t}\n}\n\n// TestVersionSupports checks all the versions of bitcoind and btcd to ensure\n// that the RPCs are supported correctly.\nfunc TestVersionSupports(t *testing.T) {\n\tt.Parallel()\n\n\trequire := require.New(t)\n\n\t// For bitcoind, unified softforks format is supported in 19.0 and\n\t// above.\n\trequire.False(BitcoindPre19.SupportUnifiedSoftForks())\n\trequire.True(BitcoindPre22.SupportUnifiedSoftForks())\n\trequire.True(BitcoindPre24.SupportUnifiedSoftForks())\n\trequire.True(BitcoindPre25.SupportUnifiedSoftForks())\n\trequire.True(BitcoindPost25.SupportUnifiedSoftForks())\n\n\t// For bitcoind, `testmempoolaccept` is supported in 22.0 and above.\n\trequire.False(BitcoindPre19.SupportTestMempoolAccept())\n\trequire.False(BitcoindPre22.SupportTestMempoolAccept())\n\trequire.True(BitcoindPre24.SupportTestMempoolAccept())\n\trequire.True(BitcoindPre25.SupportTestMempoolAccept())\n\trequire.True(BitcoindPost25.SupportTestMempoolAccept())\n\n\t// For bitcoind, `gettxspendingprevout` is supported in 24.0 and above.\n\trequire.False(BitcoindPre19.SupportGetTxSpendingPrevOut())\n\trequire.False(BitcoindPre22.SupportGetTxSpendingPrevOut())\n\trequire.False(BitcoindPre24.SupportGetTxSpendingPrevOut())\n\trequire.True(BitcoindPre25.SupportGetTxSpendingPrevOut())\n\trequire.True(BitcoindPost25.SupportGetTxSpendingPrevOut())\n\n\t// For btcd, unified softforks format is supported in all versions.\n\trequire.True(BtcdPre2401.SupportUnifiedSoftForks())\n\trequire.True(BtcdPost2401.SupportUnifiedSoftForks())\n\n\t// For btcd, `testmempoolaccept` is supported in 24.1 and above.\n\trequire.False(BtcdPre2401.SupportTestMempoolAccept())\n\trequire.True(BtcdPost2401.SupportTestMempoolAccept())\n\n\t// For btcd, `gettxspendingprevout` is supported in 24.1 and above.\n\trequire.False(BtcdPre2401.SupportGetTxSpendingPrevOut())\n\trequire.True(BtcdPost2401.SupportGetTxSpendingPrevOut())\n}\n"
  },
  {
    "path": "rpcclient/chain.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// FutureGetBestBlockHashResult is a future promise to deliver the result of a\n// GetBestBlockAsync RPC invocation (or an applicable error).\ntype FutureGetBestBlockHashResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the hash of\n// the best block in the longest block chain.\nfunc (r FutureGetBestBlockHashResult) Receive() (*chainhash.Hash, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar txHashStr string\n\terr = json.Unmarshal(res, &txHashStr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn chainhash.NewHashFromStr(txHashStr)\n}\n\n// GetBestBlockHashAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetBestBlockHash for the blocking version and more details.\nfunc (c *Client) GetBestBlockHashAsync() FutureGetBestBlockHashResult {\n\tcmd := btcjson.NewGetBestBlockHashCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetBestBlockHash returns the hash of the best block in the longest block\n// chain.\nfunc (c *Client) GetBestBlockHash() (*chainhash.Hash, error) {\n\treturn c.GetBestBlockHashAsync().Receive()\n}\n\n// legacyGetBlockRequest constructs and sends a legacy getblock request which\n// contains two separate bools to denote verbosity, in contract to a single int\n// parameter.\nfunc (c *Client) legacyGetBlockRequest(hash string, verbose,\n\tverboseTx bool) ([]byte, error) {\n\n\thashJSON, err := json.Marshal(hash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tverboseJSON, err := json.Marshal(btcjson.Bool(verbose))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tverboseTxJSON, err := json.Marshal(btcjson.Bool(verboseTx))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn c.RawRequest(\"getblock\", []json.RawMessage{\n\t\thashJSON, verboseJSON, verboseTxJSON,\n\t})\n}\n\n// waitForGetBlockRes waits for the Response of a getblock request. If the\n// Response indicates an invalid parameter was provided, a legacy style of the\n// request is resent and its Response is returned instead.\nfunc (c *Client) waitForGetBlockRes(respChan chan *Response, hash string,\n\tverbose, verboseTx bool) ([]byte, error) {\n\n\tres, err := ReceiveFuture(respChan)\n\n\t// If we receive an invalid parameter error, then we may be\n\t// communicating with a btcd node which only understands the legacy\n\t// request, so we'll try that.\n\tif err, ok := err.(*btcjson.RPCError); ok &&\n\t\terr.Code == btcjson.ErrRPCInvalidParams.Code {\n\t\treturn c.legacyGetBlockRequest(hash, verbose, verboseTx)\n\t}\n\n\t// Otherwise, we can return the Response as is.\n\treturn res, err\n}\n\n// FutureGetBlockResult is a future promise to deliver the result of a\n// GetBlockAsync RPC invocation (or an applicable error).\ntype FutureGetBlockResult struct {\n\tclient   *Client\n\thash     string\n\tResponse chan *Response\n}\n\n// Receive waits for the Response promised by the future and returns the raw\n// block requested from the server given its hash.\nfunc (r FutureGetBlockResult) Receive() (*wire.MsgBlock, error) {\n\tres, err := r.client.waitForGetBlockRes(r.Response, r.hash, false, false)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar blockHex string\n\terr = json.Unmarshal(res, &blockHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Decode the serialized block hex to raw bytes.\n\tserializedBlock, err := hex.DecodeString(blockHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Deserialize the block and return it.\n\tvar msgBlock wire.MsgBlock\n\terr = msgBlock.Deserialize(bytes.NewReader(serializedBlock))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &msgBlock, nil\n}\n\n// GetBlockAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetBlock for the blocking version and more details.\nfunc (c *Client) GetBlockAsync(blockHash *chainhash.Hash) FutureGetBlockResult {\n\thash := \"\"\n\tif blockHash != nil {\n\t\thash = blockHash.String()\n\t}\n\n\tcmd := btcjson.NewGetBlockCmd(hash, btcjson.Int(0))\n\treturn FutureGetBlockResult{\n\t\tclient:   c,\n\t\thash:     hash,\n\t\tResponse: c.SendCmd(cmd),\n\t}\n}\n\n// GetBlock returns a raw block from the server given its hash.\n//\n// See GetBlockVerbose to retrieve a data structure with information about the\n// block instead.\nfunc (c *Client) GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) {\n\treturn c.GetBlockAsync(blockHash).Receive()\n}\n\n// FutureGetBlockVerboseResult is a future promise to deliver the result of a\n// GetBlockVerboseAsync RPC invocation (or an applicable error).\ntype FutureGetBlockVerboseResult struct {\n\tclient   *Client\n\thash     string\n\tResponse chan *Response\n}\n\n// Receive waits for the Response promised by the future and returns the data\n// structure from the server with information about the requested block.\nfunc (r FutureGetBlockVerboseResult) Receive() (*btcjson.GetBlockVerboseResult, error) {\n\tres, err := r.client.waitForGetBlockRes(r.Response, r.hash, true, false)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal the raw result into a BlockResult.\n\tvar blockResult btcjson.GetBlockVerboseResult\n\terr = json.Unmarshal(res, &blockResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &blockResult, nil\n}\n\n// GetBlockVerboseAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetBlockVerbose for the blocking version and more details.\nfunc (c *Client) GetBlockVerboseAsync(blockHash *chainhash.Hash) FutureGetBlockVerboseResult {\n\thash := \"\"\n\tif blockHash != nil {\n\t\thash = blockHash.String()\n\t}\n\t// From the bitcoin-cli getblock documentation:\n\t// \"If verbosity is 1, returns an Object with information about block .\"\n\tcmd := btcjson.NewGetBlockCmd(hash, btcjson.Int(1))\n\treturn FutureGetBlockVerboseResult{\n\t\tclient:   c,\n\t\thash:     hash,\n\t\tResponse: c.SendCmd(cmd),\n\t}\n}\n\n// GetBlockVerbose returns a data structure from the server with information\n// about a block given its hash.\n//\n// See GetBlockVerboseTx to retrieve transaction data structures as well.\n// See GetBlock to retrieve a raw block instead.\nfunc (c *Client) GetBlockVerbose(blockHash *chainhash.Hash) (*btcjson.GetBlockVerboseResult, error) {\n\treturn c.GetBlockVerboseAsync(blockHash).Receive()\n}\n\n// FutureGetBlockVerboseTxResult is a future promise to deliver the result of a\n// GetBlockVerboseTxResult RPC invocation (or an applicable error).\ntype FutureGetBlockVerboseTxResult struct {\n\tclient   *Client\n\thash     string\n\tResponse chan *Response\n}\n\n// Receive waits for the Response promised by the future and returns a verbose\n// version of the block including detailed information about its transactions.\nfunc (r FutureGetBlockVerboseTxResult) Receive() (*btcjson.GetBlockVerboseTxResult, error) {\n\tres, err := r.client.waitForGetBlockRes(r.Response, r.hash, true, true)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar blockResult btcjson.GetBlockVerboseTxResult\n\terr = json.Unmarshal(res, &blockResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &blockResult, nil\n}\n\n// GetBlockVerboseTxAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetBlockVerboseTx or the blocking version and more details.\nfunc (c *Client) GetBlockVerboseTxAsync(blockHash *chainhash.Hash) FutureGetBlockVerboseTxResult {\n\thash := \"\"\n\tif blockHash != nil {\n\t\thash = blockHash.String()\n\t}\n\n\t// From the bitcoin-cli getblock documentation:\n\t//\n\t// If verbosity is 2, returns an Object with information about block\n\t// and information about each transaction.\n\tcmd := btcjson.NewGetBlockCmd(hash, btcjson.Int(2))\n\treturn FutureGetBlockVerboseTxResult{\n\t\tclient:   c,\n\t\thash:     hash,\n\t\tResponse: c.SendCmd(cmd),\n\t}\n}\n\n// GetBlockVerboseTx returns a data structure from the server with information\n// about a block and its transactions given its hash.\n//\n// See GetBlockVerbose if only transaction hashes are preferred.\n// See GetBlock to retrieve a raw block instead.\nfunc (c *Client) GetBlockVerboseTx(blockHash *chainhash.Hash) (*btcjson.GetBlockVerboseTxResult, error) {\n\treturn c.GetBlockVerboseTxAsync(blockHash).Receive()\n}\n\n// FutureGetBlockCountResult is a future promise to deliver the result of a\n// GetBlockCountAsync RPC invocation (or an applicable error).\ntype FutureGetBlockCountResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the height\n// of the most-work fully-validated chain. The genesis block has height 0.\nfunc (r FutureGetBlockCountResult) Receive() (int64, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Unmarshal the result as an int64.\n\tvar count int64\n\terr = json.Unmarshal(res, &count)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn count, nil\n}\n\n// GetBlockCountAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetBlockCount for the blocking version and more details.\nfunc (c *Client) GetBlockCountAsync() FutureGetBlockCountResult {\n\tcmd := btcjson.NewGetBlockCountCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetBlockCount returns the height of the most-work fully-validated chain.\n// The genesis block has height 0.\nfunc (c *Client) GetBlockCount() (int64, error) {\n\treturn c.GetBlockCountAsync().Receive()\n}\n\n// FutureGetChainTxStatsResult is a future promise to deliver the result of a\n// GetChainTxStatsAsync RPC invocation (or an applicable error).\ntype FutureGetChainTxStatsResult chan *Response\n\n// Receive waits for the Response promised by the future and returns transaction statistics\nfunc (r FutureGetChainTxStatsResult) Receive() (*btcjson.GetChainTxStatsResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar chainTxStats btcjson.GetChainTxStatsResult\n\terr = json.Unmarshal(res, &chainTxStats)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &chainTxStats, nil\n}\n\n// GetChainTxStatsAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetChainTxStats for the blocking version and more details.\nfunc (c *Client) GetChainTxStatsAsync() FutureGetChainTxStatsResult {\n\tcmd := btcjson.NewGetChainTxStatsCmd(nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// GetChainTxStatsNBlocksAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetChainTxStatsNBlocks for the blocking version and more details.\nfunc (c *Client) GetChainTxStatsNBlocksAsync(nBlocks int32) FutureGetChainTxStatsResult {\n\tcmd := btcjson.NewGetChainTxStatsCmd(&nBlocks, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// GetChainTxStatsNBlocksBlockHashAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetChainTxStatsNBlocksBlockHash for the blocking version and more details.\nfunc (c *Client) GetChainTxStatsNBlocksBlockHashAsync(nBlocks int32, blockHash chainhash.Hash) FutureGetChainTxStatsResult {\n\thash := blockHash.String()\n\tcmd := btcjson.NewGetChainTxStatsCmd(&nBlocks, &hash)\n\treturn c.SendCmd(cmd)\n}\n\n// GetChainTxStats returns statistics about the total number and rate of transactions in the chain.\n//\n// Size of the window is one month and it ends at chain tip.\nfunc (c *Client) GetChainTxStats() (*btcjson.GetChainTxStatsResult, error) {\n\treturn c.GetChainTxStatsAsync().Receive()\n}\n\n// GetChainTxStatsNBlocks returns statistics about the total number and rate of transactions in the chain.\n//\n// The argument specifies size of the window in number of blocks. The window ends at chain tip.\nfunc (c *Client) GetChainTxStatsNBlocks(nBlocks int32) (*btcjson.GetChainTxStatsResult, error) {\n\treturn c.GetChainTxStatsNBlocksAsync(nBlocks).Receive()\n}\n\n// GetChainTxStatsNBlocksBlockHash returns statistics about the total number and rate of transactions in the chain.\n//\n// First argument specifies size of the window in number of blocks.\n// Second argument is the hash of the block that ends the window.\nfunc (c *Client) GetChainTxStatsNBlocksBlockHash(nBlocks int32, blockHash chainhash.Hash) (*btcjson.GetChainTxStatsResult, error) {\n\treturn c.GetChainTxStatsNBlocksBlockHashAsync(nBlocks, blockHash).Receive()\n}\n\n// FutureGetDifficultyResult is a future promise to deliver the result of a\n// GetDifficultyAsync RPC invocation (or an applicable error).\ntype FutureGetDifficultyResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// proof-of-work difficulty as a multiple of the minimum difficulty.\nfunc (r FutureGetDifficultyResult) Receive() (float64, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Unmarshal the result as a float64.\n\tvar difficulty float64\n\terr = json.Unmarshal(res, &difficulty)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn difficulty, nil\n}\n\n// GetDifficultyAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetDifficulty for the blocking version and more details.\nfunc (c *Client) GetDifficultyAsync() FutureGetDifficultyResult {\n\tcmd := btcjson.NewGetDifficultyCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetDifficulty returns the proof-of-work difficulty as a multiple of the\n// minimum difficulty.\nfunc (c *Client) GetDifficulty() (float64, error) {\n\treturn c.GetDifficultyAsync().Receive()\n}\n\n// FutureGetBlockChainInfoResult is a promise to deliver the result of a\n// GetBlockChainInfoAsync RPC invocation (or an applicable error).\ntype FutureGetBlockChainInfoResult struct {\n\tclient   *Client\n\tResponse chan *Response\n}\n\n// unmarshalPartialGetBlockChainInfoResult unmarshals the response into an\n// instance of GetBlockChainInfoResult without populating the SoftForks and\n// UnifiedSoftForks fields.\nfunc unmarshalPartialGetBlockChainInfoResult(res []byte) (*btcjson.GetBlockChainInfoResult, error) {\n\tvar chainInfo btcjson.GetBlockChainInfoResult\n\tif err := json.Unmarshal(res, &chainInfo); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &chainInfo, nil\n}\n\n// unmarshalGetBlockChainInfoResultSoftForks properly unmarshals the softforks\n// related fields into the GetBlockChainInfoResult instance.\nfunc unmarshalGetBlockChainInfoResultSoftForks(chainInfo *btcjson.GetBlockChainInfoResult,\n\tversion BackendVersion, res []byte) error {\n\n\t// Versions of bitcoind on or after v0.19.0 use the unified format.\n\tif version.SupportUnifiedSoftForks() {\n\t\tvar softForks btcjson.UnifiedSoftForks\n\t\tif err := json.Unmarshal(res, &softForks); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tchainInfo.UnifiedSoftForks = &softForks\n\t} else {\n\n\t\t// All other versions use the original format.\n\t\tvar softForks btcjson.SoftForks\n\t\tif err := json.Unmarshal(res, &softForks); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tchainInfo.SoftForks = &softForks\n\t}\n\n\treturn nil\n}\n\n// Receive waits for the Response promised by the future and returns chain info\n// result provided by the server.\nfunc (r FutureGetBlockChainInfoResult) Receive() (*btcjson.GetBlockChainInfoResult, error) {\n\tres, err := ReceiveFuture(r.Response)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tchainInfo, err := unmarshalPartialGetBlockChainInfoResult(res)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Inspect the version to determine how we'll need to parse the\n\t// softforks from the response.\n\tversion, err := r.client.BackendVersion()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = unmarshalGetBlockChainInfoResultSoftForks(chainInfo, version, res)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn chainInfo, nil\n}\n\n// GetBlockChainInfoAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function\n// on the returned instance.\n//\n// See GetBlockChainInfo for the blocking version and more details.\nfunc (c *Client) GetBlockChainInfoAsync() FutureGetBlockChainInfoResult {\n\tcmd := btcjson.NewGetBlockChainInfoCmd()\n\treturn FutureGetBlockChainInfoResult{\n\t\tclient:   c,\n\t\tResponse: c.SendCmd(cmd),\n\t}\n}\n\n// GetBlockChainInfo returns information related to the processing state of\n// various chain-specific details such as the current difficulty from the tip\n// of the main chain.\nfunc (c *Client) GetBlockChainInfo() (*btcjson.GetBlockChainInfoResult, error) {\n\treturn c.GetBlockChainInfoAsync().Receive()\n}\n\n// FutureGetBlockFilterResult is a future promise to deliver the result of a\n// GetBlockFilterAsync RPC invocation (or an applicable error).\ntype FutureGetBlockFilterResult chan *Response\n\n// Receive waits for the Response promised by the future and returns block filter\n// result provided by the server.\nfunc (r FutureGetBlockFilterResult) Receive() (*btcjson.GetBlockFilterResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar blockFilter btcjson.GetBlockFilterResult\n\terr = json.Unmarshal(res, &blockFilter)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &blockFilter, nil\n}\n\n// GetBlockFilterAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetBlockFilter for the blocking version and more details.\nfunc (c *Client) GetBlockFilterAsync(blockHash chainhash.Hash, filterType *btcjson.FilterTypeName) FutureGetBlockFilterResult {\n\thash := blockHash.String()\n\n\tcmd := btcjson.NewGetBlockFilterCmd(hash, filterType)\n\treturn c.SendCmd(cmd)\n}\n\n// GetBlockFilter retrieves a BIP0157 content filter for a particular block.\nfunc (c *Client) GetBlockFilter(blockHash chainhash.Hash, filterType *btcjson.FilterTypeName) (*btcjson.GetBlockFilterResult, error) {\n\treturn c.GetBlockFilterAsync(blockHash, filterType).Receive()\n}\n\n// FutureGetBlockHashResult is a future promise to deliver the result of a\n// GetBlockHashAsync RPC invocation (or an applicable error).\ntype FutureGetBlockHashResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the hash of\n// the block in the best block chain at the given height.\nfunc (r FutureGetBlockHashResult) Receive() (*chainhash.Hash, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal the result as a string-encoded sha.\n\tvar txHashStr string\n\terr = json.Unmarshal(res, &txHashStr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn chainhash.NewHashFromStr(txHashStr)\n}\n\n// GetBlockHashAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetBlockHash for the blocking version and more details.\nfunc (c *Client) GetBlockHashAsync(blockHeight int64) FutureGetBlockHashResult {\n\tcmd := btcjson.NewGetBlockHashCmd(blockHeight)\n\treturn c.SendCmd(cmd)\n}\n\n// GetBlockHash returns the hash of the block in the best block chain at the\n// given height.\nfunc (c *Client) GetBlockHash(blockHeight int64) (*chainhash.Hash, error) {\n\treturn c.GetBlockHashAsync(blockHeight).Receive()\n}\n\n// FutureGetBlockHeaderResult is a future promise to deliver the result of a\n// GetBlockHeaderAsync RPC invocation (or an applicable error).\ntype FutureGetBlockHeaderResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// blockheader requested from the server given its hash.\nfunc (r FutureGetBlockHeaderResult) Receive() (*wire.BlockHeader, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar bhHex string\n\terr = json.Unmarshal(res, &bhHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tserializedBH, err := hex.DecodeString(bhHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Deserialize the blockheader and return it.\n\tvar bh wire.BlockHeader\n\terr = bh.Deserialize(bytes.NewReader(serializedBH))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &bh, err\n}\n\n// GetBlockHeaderAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetBlockHeader for the blocking version and more details.\nfunc (c *Client) GetBlockHeaderAsync(blockHash *chainhash.Hash) FutureGetBlockHeaderResult {\n\thash := \"\"\n\tif blockHash != nil {\n\t\thash = blockHash.String()\n\t}\n\n\tcmd := btcjson.NewGetBlockHeaderCmd(hash, btcjson.Bool(false))\n\treturn c.SendCmd(cmd)\n}\n\n// GetBlockHeader returns the blockheader from the server given its hash.\n//\n// See GetBlockHeaderVerbose to retrieve a data structure with information about the\n// block instead.\nfunc (c *Client) GetBlockHeader(blockHash *chainhash.Hash) (*wire.BlockHeader, error) {\n\treturn c.GetBlockHeaderAsync(blockHash).Receive()\n}\n\n// FutureGetBlockHeaderVerboseResult is a future promise to deliver the result of a\n// GetBlockAsync RPC invocation (or an applicable error).\ntype FutureGetBlockHeaderVerboseResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// data structure of the blockheader requested from the server given its hash.\nfunc (r FutureGetBlockHeaderVerboseResult) Receive() (*btcjson.GetBlockHeaderVerboseResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar bh btcjson.GetBlockHeaderVerboseResult\n\terr = json.Unmarshal(res, &bh)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &bh, nil\n}\n\n// GetBlockHeaderVerboseAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetBlockHeader for the blocking version and more details.\nfunc (c *Client) GetBlockHeaderVerboseAsync(blockHash *chainhash.Hash) FutureGetBlockHeaderVerboseResult {\n\thash := \"\"\n\tif blockHash != nil {\n\t\thash = blockHash.String()\n\t}\n\n\tcmd := btcjson.NewGetBlockHeaderCmd(hash, btcjson.Bool(true))\n\treturn c.SendCmd(cmd)\n}\n\n// GetBlockHeaderVerbose returns a data structure with information about the\n// blockheader from the server given its hash.\n//\n// See GetBlockHeader to retrieve a blockheader instead.\nfunc (c *Client) GetBlockHeaderVerbose(blockHash *chainhash.Hash) (*btcjson.GetBlockHeaderVerboseResult, error) {\n\treturn c.GetBlockHeaderVerboseAsync(blockHash).Receive()\n}\n\n// FutureGetChainTipsResult is a future promise to deliver the result of a\n// GetChainTips RPC invocation (or an applicable error).\ntype FutureGetChainTipsResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// data structure of all the chain tips the node is aware of.\nfunc (r FutureGetChainTipsResult) Receive() ([]*btcjson.GetChainTipsResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar chainTips []*btcjson.GetChainTipsResult\n\terr = json.Unmarshal(res, &chainTips)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn chainTips, nil\n}\n\n// GetChainTipsAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetChainTips for the blocking version and more details.\nfunc (c *Client) GetChainTipsAsync() FutureGetChainTipsResult {\n\tcmd := btcjson.NewGetChainTipsCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetChainTips returns a slice of data structure with information about all the\n// current chain tips that this node is aware of.\nfunc (c *Client) GetChainTips() ([]*btcjson.GetChainTipsResult, error) {\n\treturn c.GetChainTipsAsync().Receive()\n}\n\n// FutureGetMempoolEntryResult is a future promise to deliver the result of a\n// GetMempoolEntryAsync RPC invocation (or an applicable error).\ntype FutureGetMempoolEntryResult chan *Response\n\n// Receive waits for the Response promised by the future and returns a data\n// structure with information about the transaction in the memory pool given\n// its hash.\nfunc (r FutureGetMempoolEntryResult) Receive() (*btcjson.GetMempoolEntryResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal the result as an array of strings.\n\tvar mempoolEntryResult btcjson.GetMempoolEntryResult\n\terr = json.Unmarshal(res, &mempoolEntryResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &mempoolEntryResult, nil\n}\n\n// GetMempoolEntryAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetMempoolEntry for the blocking version and more details.\nfunc (c *Client) GetMempoolEntryAsync(txHash string) FutureGetMempoolEntryResult {\n\tcmd := btcjson.NewGetMempoolEntryCmd(txHash)\n\treturn c.SendCmd(cmd)\n}\n\n// GetMempoolEntry returns a data structure with information about the\n// transaction in the memory pool given its hash.\nfunc (c *Client) GetMempoolEntry(txHash string) (*btcjson.GetMempoolEntryResult, error) {\n\treturn c.GetMempoolEntryAsync(txHash).Receive()\n}\n\n// FutureGetRawMempoolResult is a future promise to deliver the result of a\n// GetRawMempoolAsync RPC invocation (or an applicable error).\ntype FutureGetRawMempoolResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the hashes\n// of all transactions in the memory pool.\nfunc (r FutureGetRawMempoolResult) Receive() ([]*chainhash.Hash, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal the result as an array of strings.\n\tvar txHashStrs []string\n\terr = json.Unmarshal(res, &txHashStrs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Create a slice of ShaHash arrays from the string slice.\n\ttxHashes := make([]*chainhash.Hash, 0, len(txHashStrs))\n\tfor _, hashStr := range txHashStrs {\n\t\ttxHash, err := chainhash.NewHashFromStr(hashStr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttxHashes = append(txHashes, txHash)\n\t}\n\n\treturn txHashes, nil\n}\n\n// GetRawMempoolAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetRawMempool for the blocking version and more details.\nfunc (c *Client) GetRawMempoolAsync() FutureGetRawMempoolResult {\n\tcmd := btcjson.NewGetRawMempoolCmd(btcjson.Bool(false))\n\treturn c.SendCmd(cmd)\n}\n\n// GetRawMempool returns the hashes of all transactions in the memory pool.\n//\n// See GetRawMempoolVerbose to retrieve data structures with information about\n// the transactions instead.\nfunc (c *Client) GetRawMempool() ([]*chainhash.Hash, error) {\n\treturn c.GetRawMempoolAsync().Receive()\n}\n\n// FutureGetRawMempoolVerboseResult is a future promise to deliver the result of\n// a GetRawMempoolVerboseAsync RPC invocation (or an applicable error).\ntype FutureGetRawMempoolVerboseResult chan *Response\n\n// Receive waits for the Response promised by the future and returns a map of\n// transaction hashes to an associated data structure with information about the\n// transaction for all transactions in the memory pool.\nfunc (r FutureGetRawMempoolVerboseResult) Receive() (map[string]btcjson.GetRawMempoolVerboseResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal the result as a map of strings (tx shas) to their detailed\n\t// results.\n\tvar mempoolItems map[string]btcjson.GetRawMempoolVerboseResult\n\terr = json.Unmarshal(res, &mempoolItems)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn mempoolItems, nil\n}\n\n// GetRawMempoolVerboseAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetRawMempoolVerbose for the blocking version and more details.\nfunc (c *Client) GetRawMempoolVerboseAsync() FutureGetRawMempoolVerboseResult {\n\tcmd := btcjson.NewGetRawMempoolCmd(btcjson.Bool(true))\n\treturn c.SendCmd(cmd)\n}\n\n// GetRawMempoolVerbose returns a map of transaction hashes to an associated\n// data structure with information about the transaction for all transactions in\n// the memory pool.\n//\n// See GetRawMempool to retrieve only the transaction hashes instead.\nfunc (c *Client) GetRawMempoolVerbose() (map[string]btcjson.GetRawMempoolVerboseResult, error) {\n\treturn c.GetRawMempoolVerboseAsync().Receive()\n}\n\n// FutureEstimateFeeResult is a future promise to deliver the result of a\n// EstimateFeeAsync RPC invocation (or an applicable error).\ntype FutureEstimateFeeResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the info\n// provided by the server.\nfunc (r FutureEstimateFeeResult) Receive() (float64, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\t// Unmarshal result as a getinfo result object.\n\tvar fee float64\n\terr = json.Unmarshal(res, &fee)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\treturn fee, nil\n}\n\n// EstimateFeeAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See EstimateFee for the blocking version and more details.\nfunc (c *Client) EstimateFeeAsync(numBlocks int64) FutureEstimateFeeResult {\n\tcmd := btcjson.NewEstimateFeeCmd(numBlocks)\n\treturn c.SendCmd(cmd)\n}\n\n// EstimateFee provides an estimated fee  in bitcoins per kilobyte.\nfunc (c *Client) EstimateFee(numBlocks int64) (float64, error) {\n\treturn c.EstimateFeeAsync(numBlocks).Receive()\n}\n\n// FutureEstimateSmartFeeResult is a future promise to deliver the result of a\n// EstimateSmartFeeAsync RPC invocation (or an applicable error).\ntype FutureEstimateSmartFeeResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// estimated fee.\nfunc (r FutureEstimateSmartFeeResult) Receive() (*btcjson.EstimateSmartFeeResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar verified btcjson.EstimateSmartFeeResult\n\terr = json.Unmarshal(res, &verified)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &verified, nil\n}\n\n// EstimateSmartFeeAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See EstimateSmartFee for the blocking version and more details.\nfunc (c *Client) EstimateSmartFeeAsync(confTarget int64, mode *btcjson.EstimateSmartFeeMode) FutureEstimateSmartFeeResult {\n\tcmd := btcjson.NewEstimateSmartFeeCmd(confTarget, mode)\n\treturn c.SendCmd(cmd)\n}\n\n// EstimateSmartFee requests the server to estimate a fee level based on the given parameters.\nfunc (c *Client) EstimateSmartFee(confTarget int64, mode *btcjson.EstimateSmartFeeMode) (*btcjson.EstimateSmartFeeResult, error) {\n\treturn c.EstimateSmartFeeAsync(confTarget, mode).Receive()\n}\n\n// FutureVerifyChainResult is a future promise to deliver the result of a\n// VerifyChainAsync, VerifyChainLevelAsyncRPC, or VerifyChainBlocksAsync\n// invocation (or an applicable error).\ntype FutureVerifyChainResult chan *Response\n\n// Receive waits for the Response promised by the future and returns whether\n// or not the chain verified based on the check level and number of blocks\n// to verify specified in the original call.\nfunc (r FutureVerifyChainResult) Receive() (bool, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Unmarshal the result as a boolean.\n\tvar verified bool\n\terr = json.Unmarshal(res, &verified)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn verified, nil\n}\n\n// VerifyChainAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See VerifyChain for the blocking version and more details.\nfunc (c *Client) VerifyChainAsync() FutureVerifyChainResult {\n\tcmd := btcjson.NewVerifyChainCmd(nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// VerifyChain requests the server to verify the block chain database using\n// the default check level and number of blocks to verify.\n//\n// See VerifyChainLevel and VerifyChainBlocks to override the defaults.\nfunc (c *Client) VerifyChain() (bool, error) {\n\treturn c.VerifyChainAsync().Receive()\n}\n\n// VerifyChainLevelAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See VerifyChainLevel for the blocking version and more details.\nfunc (c *Client) VerifyChainLevelAsync(checkLevel int32) FutureVerifyChainResult {\n\tcmd := btcjson.NewVerifyChainCmd(&checkLevel, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// VerifyChainLevel requests the server to verify the block chain database using\n// the passed check level and default number of blocks to verify.\n//\n// The check level controls how thorough the verification is with higher numbers\n// increasing the amount of checks done as consequently how long the\n// verification takes.\n//\n// See VerifyChain to use the default check level and VerifyChainBlocks to\n// override the number of blocks to verify.\nfunc (c *Client) VerifyChainLevel(checkLevel int32) (bool, error) {\n\treturn c.VerifyChainLevelAsync(checkLevel).Receive()\n}\n\n// VerifyChainBlocksAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See VerifyChainBlocks for the blocking version and more details.\nfunc (c *Client) VerifyChainBlocksAsync(checkLevel, numBlocks int32) FutureVerifyChainResult {\n\tcmd := btcjson.NewVerifyChainCmd(&checkLevel, &numBlocks)\n\treturn c.SendCmd(cmd)\n}\n\n// VerifyChainBlocks requests the server to verify the block chain database\n// using the passed check level and number of blocks to verify.\n//\n// The check level controls how thorough the verification is with higher numbers\n// increasing the amount of checks done as consequently how long the\n// verification takes.\n//\n// The number of blocks refers to the number of blocks from the end of the\n// current longest chain.\n//\n// See VerifyChain and VerifyChainLevel to use defaults.\nfunc (c *Client) VerifyChainBlocks(checkLevel, numBlocks int32) (bool, error) {\n\treturn c.VerifyChainBlocksAsync(checkLevel, numBlocks).Receive()\n}\n\n// FutureGetTxOutResult is a future promise to deliver the result of a\n// GetTxOutAsync RPC invocation (or an applicable error).\ntype FutureGetTxOutResult chan *Response\n\n// Receive waits for the Response promised by the future and returns a\n// transaction given its hash.\nfunc (r FutureGetTxOutResult) Receive() (*btcjson.GetTxOutResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// take care of the special case where the output has been spent already\n\t// it should return the string \"null\"\n\tif string(res) == \"null\" {\n\t\treturn nil, nil\n\t}\n\n\t// Unmarshal result as an gettxout result object.\n\tvar txOutInfo *btcjson.GetTxOutResult\n\terr = json.Unmarshal(res, &txOutInfo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn txOutInfo, nil\n}\n\n// GetTxOutAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetTxOut for the blocking version and more details.\nfunc (c *Client) GetTxOutAsync(txHash *chainhash.Hash, index uint32, mempool bool) FutureGetTxOutResult {\n\thash := \"\"\n\tif txHash != nil {\n\t\thash = txHash.String()\n\t}\n\n\tcmd := btcjson.NewGetTxOutCmd(hash, index, &mempool)\n\treturn c.SendCmd(cmd)\n}\n\n// GetTxOut returns the transaction output info if it's unspent and\n// nil, otherwise.\nfunc (c *Client) GetTxOut(txHash *chainhash.Hash, index uint32, mempool bool) (*btcjson.GetTxOutResult, error) {\n\treturn c.GetTxOutAsync(txHash, index, mempool).Receive()\n}\n\n// FutureGetTxOutSetInfoResult is a future promise to deliver the result of a\n// GetTxOutSetInfoAsync RPC invocation (or an applicable error).\ntype FutureGetTxOutSetInfoResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// results of GetTxOutSetInfoAsync RPC invocation.\nfunc (r FutureGetTxOutSetInfoResult) Receive() (*btcjson.GetTxOutSetInfoResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as an gettxoutsetinfo result object.\n\tvar txOutSetInfo *btcjson.GetTxOutSetInfoResult\n\terr = json.Unmarshal(res, &txOutSetInfo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn txOutSetInfo, nil\n}\n\n// GetTxOutSetInfoAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetTxOutSetInfo for the blocking version and more details.\nfunc (c *Client) GetTxOutSetInfoAsync() FutureGetTxOutSetInfoResult {\n\tcmd := btcjson.NewGetTxOutSetInfoCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetTxOutSetInfo returns the statistics about the unspent transaction output\n// set.\nfunc (c *Client) GetTxOutSetInfo() (*btcjson.GetTxOutSetInfoResult, error) {\n\treturn c.GetTxOutSetInfoAsync().Receive()\n}\n\n// FutureRescanBlocksResult is a future promise to deliver the result of a\n// RescanBlocksAsync RPC invocation (or an applicable error).\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\ntype FutureRescanBlocksResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// discovered rescanblocks data.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\nfunc (r FutureRescanBlocksResult) Receive() ([]btcjson.RescannedBlock, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar rescanBlocksResult []btcjson.RescannedBlock\n\terr = json.Unmarshal(res, &rescanBlocksResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn rescanBlocksResult, nil\n}\n\n// RescanBlocksAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See RescanBlocks for the blocking version and more details.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\nfunc (c *Client) RescanBlocksAsync(blockHashes []chainhash.Hash) FutureRescanBlocksResult {\n\tstrBlockHashes := make([]string, len(blockHashes))\n\tfor i := range blockHashes {\n\t\tstrBlockHashes[i] = blockHashes[i].String()\n\t}\n\n\tcmd := btcjson.NewRescanBlocksCmd(strBlockHashes)\n\treturn c.SendCmd(cmd)\n}\n\n// RescanBlocks rescans the blocks identified by blockHashes, in order, using\n// the client's loaded transaction filter.  The blocks do not need to be on the\n// main chain, but they do need to be adjacent to each other.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\nfunc (c *Client) RescanBlocks(blockHashes []chainhash.Hash) ([]btcjson.RescannedBlock, error) {\n\treturn c.RescanBlocksAsync(blockHashes).Receive()\n}\n\n// FutureInvalidateBlockResult is a future promise to deliver the result of a\n// InvalidateBlockAsync RPC invocation (or an applicable error).\ntype FutureInvalidateBlockResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the raw\n// block requested from the server given its hash.\nfunc (r FutureInvalidateBlockResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\n\treturn err\n}\n\n// InvalidateBlockAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See InvalidateBlock for the blocking version and more details.\nfunc (c *Client) InvalidateBlockAsync(blockHash *chainhash.Hash) FutureInvalidateBlockResult {\n\thash := \"\"\n\tif blockHash != nil {\n\t\thash = blockHash.String()\n\t}\n\n\tcmd := btcjson.NewInvalidateBlockCmd(hash)\n\treturn c.SendCmd(cmd)\n}\n\n// InvalidateBlock invalidates a specific block.\nfunc (c *Client) InvalidateBlock(blockHash *chainhash.Hash) error {\n\treturn c.InvalidateBlockAsync(blockHash).Receive()\n}\n\n// FutureGetCFilterResult is a future promise to deliver the result of a\n// GetCFilterAsync RPC invocation (or an applicable error).\ntype FutureGetCFilterResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the raw\n// filter requested from the server given its block hash.\nfunc (r FutureGetCFilterResult) Receive() (*wire.MsgCFilter, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar filterHex string\n\terr = json.Unmarshal(res, &filterHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Decode the serialized cf hex to raw bytes.\n\tserializedFilter, err := hex.DecodeString(filterHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Assign the filter bytes to the correct field of the wire message.\n\t// We aren't going to set the block hash or extended flag, since we\n\t// don't actually get that back in the RPC response.\n\tvar msgCFilter wire.MsgCFilter\n\tmsgCFilter.Data = serializedFilter\n\treturn &msgCFilter, nil\n}\n\n// GetCFilterAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetCFilter for the blocking version and more details.\nfunc (c *Client) GetCFilterAsync(blockHash *chainhash.Hash,\n\tfilterType wire.FilterType) FutureGetCFilterResult {\n\thash := \"\"\n\tif blockHash != nil {\n\t\thash = blockHash.String()\n\t}\n\n\tcmd := btcjson.NewGetCFilterCmd(hash, filterType)\n\treturn c.SendCmd(cmd)\n}\n\n// GetCFilter returns a raw filter from the server given its block hash.\nfunc (c *Client) GetCFilter(blockHash *chainhash.Hash,\n\tfilterType wire.FilterType) (*wire.MsgCFilter, error) {\n\treturn c.GetCFilterAsync(blockHash, filterType).Receive()\n}\n\n// FutureGetCFilterHeaderResult is a future promise to deliver the result of a\n// GetCFilterHeaderAsync RPC invocation (or an applicable error).\ntype FutureGetCFilterHeaderResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the raw\n// filter header requested from the server given its block hash.\nfunc (r FutureGetCFilterHeaderResult) Receive() (*wire.MsgCFHeaders, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar headerHex string\n\terr = json.Unmarshal(res, &headerHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Assign the decoded header into a hash\n\theaderHash, err := chainhash.NewHashFromStr(headerHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Assign the hash to a headers message and return it.\n\tmsgCFHeaders := wire.MsgCFHeaders{PrevFilterHeader: *headerHash}\n\treturn &msgCFHeaders, nil\n\n}\n\n// GetCFilterHeaderAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function\n// on the returned instance.\n//\n// See GetCFilterHeader for the blocking version and more details.\nfunc (c *Client) GetCFilterHeaderAsync(blockHash *chainhash.Hash,\n\tfilterType wire.FilterType) FutureGetCFilterHeaderResult {\n\thash := \"\"\n\tif blockHash != nil {\n\t\thash = blockHash.String()\n\t}\n\n\tcmd := btcjson.NewGetCFilterHeaderCmd(hash, filterType)\n\treturn c.SendCmd(cmd)\n}\n\n// GetCFilterHeader returns a raw filter header from the server given its block\n// hash.\nfunc (c *Client) GetCFilterHeader(blockHash *chainhash.Hash,\n\tfilterType wire.FilterType) (*wire.MsgCFHeaders, error) {\n\treturn c.GetCFilterHeaderAsync(blockHash, filterType).Receive()\n}\n\n// FutureGetBlockStatsResult is a future promise to deliver the result of a\n// GetBlockStatsAsync RPC invocation (or an applicable error).\ntype FutureGetBlockStatsResult chan *Response\n\n// Receive waits for the Response promised by the future and returns statistics\n// of a block at a certain height.\nfunc (r FutureGetBlockStatsResult) Receive() (*btcjson.GetBlockStatsResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar blockStats btcjson.GetBlockStatsResult\n\terr = json.Unmarshal(res, &blockStats)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &blockStats, nil\n}\n\n// GetBlockStatsAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetBlockStats or the blocking version and more details.\nfunc (c *Client) GetBlockStatsAsync(hashOrHeight interface{}, stats *[]string) FutureGetBlockStatsResult {\n\tif hash, ok := hashOrHeight.(*chainhash.Hash); ok {\n\t\thashOrHeight = hash.String()\n\t}\n\n\tcmd := btcjson.NewGetBlockStatsCmd(btcjson.HashOrHeight{Value: hashOrHeight}, stats)\n\treturn c.SendCmd(cmd)\n}\n\n// GetBlockStats returns block statistics. First argument specifies height or hash of the target block.\n// Second argument allows to select certain stats to return.\nfunc (c *Client) GetBlockStats(hashOrHeight interface{}, stats *[]string) (*btcjson.GetBlockStatsResult, error) {\n\treturn c.GetBlockStatsAsync(hashOrHeight, stats).Receive()\n}\n\n// FutureDeriveAddressesResult is a future promise to deliver the result of an\n// DeriveAddressesAsync RPC invocation (or an applicable error).\ntype FutureDeriveAddressesResult chan *Response\n\n// Receive waits for the Response promised by the future and derives one or more addresses\n// corresponding to the given output descriptor.\nfunc (r FutureDeriveAddressesResult) Receive() (*btcjson.DeriveAddressesResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar deriveAddressesResult btcjson.DeriveAddressesResult\n\n\terr = json.Unmarshal(res, &deriveAddressesResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &deriveAddressesResult, nil\n}\n\n// DeriveAddressesAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See DeriveAddresses for the blocking version and more details.\nfunc (c *Client) DeriveAddressesAsync(descriptor string, descriptorRange *btcjson.DescriptorRange) FutureDeriveAddressesResult {\n\tcmd := btcjson.NewDeriveAddressesCmd(descriptor, descriptorRange)\n\treturn c.SendCmd(cmd)\n}\n\n// DeriveAddresses derives one or more addresses corresponding to an output\n// descriptor. If a ranged descriptor is used, the end or the range\n// (in [begin,end] notation) to derive must be specified.\nfunc (c *Client) DeriveAddresses(descriptor string, descriptorRange *btcjson.DescriptorRange) (*btcjson.DeriveAddressesResult, error) {\n\treturn c.DeriveAddressesAsync(descriptor, descriptorRange).Receive()\n}\n\n// FutureGetDescriptorInfoResult is a future promise to deliver the result of a\n// GetDescriptorInfoAsync RPC invocation (or an applicable error).\ntype FutureGetDescriptorInfoResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the analysed\n// info of the descriptor.\nfunc (r FutureGetDescriptorInfoResult) Receive() (*btcjson.GetDescriptorInfoResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar descriptorInfo btcjson.GetDescriptorInfoResult\n\n\terr = json.Unmarshal(res, &descriptorInfo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &descriptorInfo, nil\n}\n\n// GetDescriptorInfoAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetDescriptorInfo for the blocking version and more details.\nfunc (c *Client) GetDescriptorInfoAsync(descriptor string) FutureGetDescriptorInfoResult {\n\tcmd := btcjson.NewGetDescriptorInfoCmd(descriptor)\n\treturn c.SendCmd(cmd)\n}\n\n// GetDescriptorInfo returns the analysed info of a descriptor string, by invoking the\n// getdescriptorinfo RPC.\n//\n// Use this function to analyse a descriptor string, or compute the checksum\n// for a descriptor without one.\n//\n// See btcjson.GetDescriptorInfoResult for details about the result.\nfunc (c *Client) GetDescriptorInfo(descriptor string) (*btcjson.GetDescriptorInfoResult, error) {\n\treturn c.GetDescriptorInfoAsync(descriptor).Receive()\n}\n\n// FutureReconsiderBlockResult is a future promise to deliver the result of a\n// ReconsiderBlockAsync RPC invocation (or an applicable error).\ntype FutureReconsiderBlockResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the raw\n// block requested from the server given its hash.\nfunc (r FutureReconsiderBlockResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// ReconsiderBlockAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See ReconsiderBlock for the blocking version and more details.\nfunc (c *Client) ReconsiderBlockAsync(\n\tblockHash *chainhash.Hash) FutureReconsiderBlockResult {\n\n\thash := \"\"\n\tif blockHash != nil {\n\t\thash = blockHash.String()\n\t}\n\n\tcmd := btcjson.NewReconsiderBlockCmd(hash)\n\treturn c.SendCmd(cmd)\n}\n\n// ReconsiderBlock reconsiders an verifies a specific block and the branch that\n// the block is included in.  If the block is valid on reconsideration, the chain\n// will reorg to that block if it has more PoW than the current tip.\nfunc (c *Client) ReconsiderBlock(blockHash *chainhash.Hash) error {\n\treturn c.ReconsiderBlockAsync(blockHash).Receive()\n}\n"
  },
  {
    "path": "rpcclient/chain_test.go",
    "content": "package rpcclient\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/gorilla/websocket\"\n)\n\nvar upgrader = websocket.Upgrader{}\n\n// TestUnmarshalGetBlockChainInfoResult ensures that the SoftForks and\n// UnifiedSoftForks fields of GetBlockChainInfoResult are properly unmarshaled\n// when using the expected backend version.\nfunc TestUnmarshalGetBlockChainInfoResultSoftForks(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname       string\n\t\tversion    BackendVersion\n\t\tres        []byte\n\t\tcompatible bool\n\t}{\n\t\t{\n\t\t\tname:       \"bitcoind < 0.19.0 with separate softforks\",\n\t\t\tversion:    BitcoindPre19,\n\t\t\tres:        []byte(`{\"softforks\": [{\"version\": 2}]}`),\n\t\t\tcompatible: true,\n\t\t},\n\t\t{\n\t\t\tname:       \"bitcoind >= 0.19.0 with separate softforks\",\n\t\t\tversion:    BitcoindPre22,\n\t\t\tres:        []byte(`{\"softforks\": [{\"version\": 2}]}`),\n\t\t\tcompatible: false,\n\t\t},\n\t\t{\n\t\t\tname:       \"bitcoind < 0.19.0 with unified softforks\",\n\t\t\tversion:    BitcoindPre19,\n\t\t\tres:        []byte(`{\"softforks\": {\"segwit\": {\"type\": \"bip9\"}}}`),\n\t\t\tcompatible: false,\n\t\t},\n\t\t{\n\t\t\tname:       \"bitcoind >= 0.19.0 with unified softforks\",\n\t\t\tversion:    BitcoindPre22,\n\t\t\tres:        []byte(`{\"softforks\": {\"segwit\": {\"type\": \"bip9\"}}}`),\n\t\t\tcompatible: true,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tsuccess := t.Run(test.name, func(t *testing.T) {\n\t\t\t// We'll start by unmarshalling the JSON into a struct.\n\t\t\t// The SoftForks and UnifiedSoftForks field should not\n\t\t\t// be set yet, as they are unmarshaled within a\n\t\t\t// different function.\n\t\t\tinfo, err := unmarshalPartialGetBlockChainInfoResult(test.res)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif info.SoftForks != nil {\n\t\t\t\tt.Fatal(\"expected SoftForks to be empty\")\n\t\t\t}\n\t\t\tif info.UnifiedSoftForks != nil {\n\t\t\t\tt.Fatal(\"expected UnifiedSoftForks to be empty\")\n\t\t\t}\n\n\t\t\t// Proceed to unmarshal the softforks of the response\n\t\t\t// with the expected version. If the version is\n\t\t\t// incompatible with the response, then this should\n\t\t\t// fail.\n\t\t\terr = unmarshalGetBlockChainInfoResultSoftForks(\n\t\t\t\tinfo, test.version, test.res,\n\t\t\t)\n\t\t\tif test.compatible && err != nil {\n\t\t\t\tt.Fatalf(\"unable to unmarshal softforks: %v\", err)\n\t\t\t}\n\t\t\tif !test.compatible && err == nil {\n\t\t\t\tt.Fatal(\"expected to not unmarshal softforks\")\n\t\t\t}\n\t\t\tif !test.compatible {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// If the version is compatible with the response, we\n\t\t\t// should expect to see the proper softforks field set.\n\t\t\tif test.version == BitcoindPre22 &&\n\t\t\t\tinfo.SoftForks != nil {\n\t\t\t\tt.Fatal(\"expected SoftForks to be empty\")\n\t\t\t}\n\t\t\tif test.version == BitcoindPre19 &&\n\t\t\t\tinfo.UnifiedSoftForks != nil {\n\t\t\t\tt.Fatal(\"expected UnifiedSoftForks to be empty\")\n\t\t\t}\n\t\t})\n\t\tif !success {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc TestFutureGetBlockCountResultReceiveErrors(t *testing.T) {\n\tresponseChan := FutureGetBlockCountResult(make(chan *Response))\n\tresponse := Response{\n\t\tresult: []byte{},\n\t\terr:    errors.New(\"blah blah something bad happened\"),\n\t}\n\tgo func() {\n\t\tresponseChan <- &response\n\t}()\n\n\t_, err := responseChan.Receive()\n\tif err == nil || err.Error() != \"blah blah something bad happened\" {\n\t\tt.Fatalf(\"unexpected error: %s\", err.Error())\n\t}\n}\n\nfunc TestFutureGetBlockCountResultReceiveMarshalsResponseCorrectly(t *testing.T) {\n\tresponseChan := FutureGetBlockCountResult(make(chan *Response))\n\tresponse := Response{\n\t\tresult: []byte{0x36, 0x36},\n\t\terr:    nil,\n\t}\n\tgo func() {\n\t\tresponseChan <- &response\n\t}()\n\n\tres, err := responseChan.Receive()\n\tif err != nil {\n\t\tt.Fatalf(\"unexpected error: %s\", err.Error())\n\t}\n\n\tif res != 66 {\n\t\tt.Fatalf(\"unexpected response: %d (0x%X)\", res, res)\n\t}\n}\n\nfunc TestClientConnectedToWSServerRunner(t *testing.T) {\n\ttype TestTableItem struct {\n\t\tName     string\n\t\tTestCase func(t *testing.T)\n\t}\n\n\ttestTable := []TestTableItem{\n\t\t{\n\t\t\tName: \"TestGetChainTxStatsAsyncSuccessTx\",\n\t\t\tTestCase: func(t *testing.T) {\n\t\t\t\tclient, serverReceivedChannel, cleanup := makeClient(t)\n\t\t\t\tdefer cleanup()\n\t\t\t\tclient.GetChainTxStatsAsync()\n\n\t\t\t\tmessage := <-serverReceivedChannel\n\t\t\t\tif message != \"{\\\"jsonrpc\\\":\\\"1.0\\\",\\\"method\\\":\\\"getchaintxstats\\\",\\\"params\\\":[],\\\"id\\\":1}\" {\n\t\t\t\t\tt.Fatalf(\"received unexpected message: %s\", message)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tName: \"TestGetChainTxStatsAsyncShutdownError\",\n\t\t\tTestCase: func(t *testing.T) {\n\t\t\t\tclient, _, cleanup := makeClient(t)\n\t\t\t\tdefer cleanup()\n\n\t\t\t\t// a bit of a hack here: since there are multiple places where we read\n\t\t\t\t// from the shutdown channel, and it is not buffered, ensure that a shutdown\n\t\t\t\t// message is sent every time it is read from, this will ensure that\n\t\t\t\t// when client.GetChainTxStatsAsync() gets called, it hits the non-blocking\n\t\t\t\t// read from the shutdown channel\n\t\t\t\tgo func() {\n\t\t\t\t\ttype shutdownMessage struct{}\n\t\t\t\t\tfor {\n\t\t\t\t\t\tclient.shutdown <- shutdownMessage{}\n\t\t\t\t\t}\n\t\t\t\t}()\n\n\t\t\t\tvar response *Response = nil\n\n\t\t\t\tfor response == nil {\n\t\t\t\t\trespChan := client.GetChainTxStatsAsync()\n\t\t\t\t\tselect {\n\t\t\t\t\tcase response = <-respChan:\n\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif response.err == nil || response.err.Error() != \"the client has been shutdown\" {\n\t\t\t\t\tt.Fatalf(\"unexpected error: %s\", response.err.Error())\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tName: \"TestGetBestBlockHashAsync\",\n\t\t\tTestCase: func(t *testing.T) {\n\t\t\t\tclient, serverReceivedChannel, cleanup := makeClient(t)\n\t\t\t\tdefer cleanup()\n\t\t\t\tch := client.GetBestBlockHashAsync()\n\n\t\t\t\tmessage := <-serverReceivedChannel\n\t\t\t\tif message != \"{\\\"jsonrpc\\\":\\\"1.0\\\",\\\"method\\\":\\\"getbestblockhash\\\",\\\"params\\\":[],\\\"id\\\":1}\" {\n\t\t\t\t\tt.Fatalf(\"received unexpected message: %s\", message)\n\t\t\t\t}\n\n\t\t\t\texpectedResponse := Response{}\n\n\t\t\t\twg := sync.WaitGroup{}\n\n\t\t\t\twg.Add(1)\n\t\t\t\tgo func() {\n\t\t\t\t\tdefer wg.Done()\n\t\t\t\t\tfor {\n\t\t\t\t\t\tclient.requestLock.Lock()\n\t\t\t\t\t\tif client.requestList.Len() > 0 {\n\t\t\t\t\t\t\tr := client.requestList.Back()\n\t\t\t\t\t\t\tr.Value.(*jsonRequest).responseChan <- &expectedResponse\n\t\t\t\t\t\t\tclient.requestLock.Unlock()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclient.requestLock.Unlock()\n\t\t\t\t\t}\n\t\t\t\t}()\n\n\t\t\t\tresponse := <-ch\n\n\t\t\t\tif &expectedResponse != response {\n\t\t\t\t\tt.Fatalf(\"received unexpected response\")\n\t\t\t\t}\n\n\t\t\t\t// ensure the goroutine created in this test exists,\n\t\t\t\t// the test is ran with a timeout\n\t\t\t\twg.Wait()\n\t\t\t},\n\t\t},\n\t}\n\n\t// since these tests rely on concurrency, ensure there is a reasonable timeout\n\t// that they should run within\n\tfor _, testCase := range testTable {\n\t\tdone := make(chan bool)\n\n\t\tgo func() {\n\t\t\tt.Run(testCase.Name, testCase.TestCase)\n\t\t\tdone <- true\n\t\t}()\n\n\t\tselect {\n\t\tcase <-done:\n\t\tcase <-time.After(5 * time.Second):\n\t\t\tt.Fatalf(\"timeout exceeded for: %s\", testCase.Name)\n\t\t}\n\t}\n}\n\nfunc makeClient(t *testing.T) (*Client, chan string, func()) {\n\tserverReceivedChannel := make(chan string)\n\ts := httptest.NewServer(http.HandlerFunc(makeUpgradeOnConnect(serverReceivedChannel)))\n\turl := strings.TrimPrefix(s.URL, \"http://\")\n\n\tconfig := ConnConfig{\n\t\tDisableTLS: true,\n\t\tUser:       \"username\",\n\t\tPass:       \"password\",\n\t\tHost:       url,\n\t}\n\n\tclient, err := New(&config, nil)\n\tif err != nil {\n\t\tt.Fatalf(\"error when creating new client %s\", err.Error())\n\t}\n\treturn client, serverReceivedChannel, func() {\n\t\ts.Close()\n\t}\n}\n\nfunc makeUpgradeOnConnect(ch chan string) func(http.ResponseWriter, *http.Request) {\n\treturn func(w http.ResponseWriter, r *http.Request) {\n\t\tc, err := upgrader.Upgrade(w, r, nil)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tdefer c.Close()\n\t\tfor {\n\t\t\t_, message, err := c.ReadMessage()\n\t\t\tif err != nil {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tgo func() {\n\t\t\t\tch <- string(message)\n\t\t\t}()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "rpcclient/cookiefile.go",
    "content": "// Copyright (c) 2017 The Namecoin developers\n// Copyright (c) 2019 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n)\n\nfunc readCookieFile(path string) (username, password string, err error) {\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer f.Close()\n\n\tscanner := bufio.NewScanner(f)\n\tscanner.Scan()\n\terr = scanner.Err()\n\tif err != nil {\n\t\treturn\n\t}\n\ts := scanner.Text()\n\n\tparts := strings.SplitN(s, \":\", 2)\n\tif len(parts) != 2 {\n\t\terr = fmt.Errorf(\"malformed cookie file\")\n\t\treturn\n\t}\n\n\tusername, password = parts[0], parts[1]\n\treturn\n}\n"
  },
  {
    "path": "rpcclient/doc.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage rpcclient implements a websocket-enabled Bitcoin JSON-RPC client.\n\n# Overview\n\nThis client provides a robust and easy to use client for interfacing with a\nBitcoin RPC server that uses a btcd/bitcoin core compatible Bitcoin JSON-RPC\nAPI.  This client has been tested with btcd (https://github.com/btcsuite/btcd),\nbtcwallet (https://github.com/btcsuite/btcwallet), and\nbitcoin core (https://github.com/bitcoin).\n\nIn addition to the compatible standard HTTP POST JSON-RPC API, btcd and\nbtcwallet provide a websocket interface that is more efficient than the standard\nHTTP POST method of accessing RPC.  The section below discusses the differences\nbetween HTTP POST and websockets.\n\nBy default, this client assumes the RPC server supports websockets and has\nTLS enabled.  In practice, this currently means it assumes you are talking to\nbtcd or btcwallet by default.  However, configuration options are provided to\nfall back to HTTP POST and disable TLS to support talking with inferior bitcoin\ncore style RPC servers.\n\n# Websockets vs HTTP POST\n\nIn HTTP POST-based JSON-RPC, every request creates a new HTTP connection,\nissues the call, waits for the response, and closes the connection.  This adds\nquite a bit of overhead to every call and lacks flexibility for features such as\nnotifications.\n\nIn contrast, the websocket-based JSON-RPC interface provided by btcd and\nbtcwallet only uses a single connection that remains open and allows\nasynchronous bi-directional communication.\n\nThe websocket interface supports all of the same commands as HTTP POST, but they\ncan be invoked without having to go through a connect/disconnect cycle for every\ncall.  In addition, the websocket interface provides other nice features such as\nthe ability to register for asynchronous notifications of various events.\n\n# Synchronous vs Asynchronous API\n\nThe client provides both a synchronous (blocking) and asynchronous API.\n\nThe synchronous (blocking) API is typically sufficient for most use cases.  It\nworks by issuing the RPC and blocking until the response is received.  This\nallows  straightforward code where you have the response as soon as the function\nreturns.\n\nThe asynchronous API works on the concept of futures.  When you invoke the async\nversion of a command, it will quickly return an instance of a type that promises\nto provide the result of the RPC at some future time.  In the background, the\nRPC call is issued and the result is stored in the returned instance.  Invoking\nthe Receive method on the returned instance will either return the result\nimmediately if it has already arrived, or block until it has.  This is useful\nsince it provides the caller with greater control over concurrency.\n\n# Notifications\n\nThe first important part of notifications is to realize that they will only\nwork when connected via websockets.  This should intuitively make sense\nbecause HTTP POST mode does not keep a connection open!\n\nAll notifications provided by btcd require registration to opt-in.  For example,\nif you want to be notified when funds are received by a set of addresses, you\nregister the addresses via the NotifyReceived (or NotifyReceivedAsync) function.\n\n# Notification Handlers\n\nNotifications are exposed by the client through the use of callback handlers\nwhich are setup via a NotificationHandlers instance that is specified by the\ncaller when creating the client.\n\nIt is important that these notification handlers complete quickly since they\nare intentionally in the main read loop and will block further reads until\nthey complete.  This provides the caller with the flexibility to decide what to\ndo when notifications are coming in faster than they are being handled.\n\nIn particular this means issuing a blocking RPC call from a callback handler\nwill cause a deadlock as more server responses won't be read until the callback\nreturns, but the callback would be waiting for a response.   Thus, any\nadditional RPCs must be issued an a completely decoupled manner.\n\n# Automatic Reconnection\n\nBy default, when running in websockets mode, this client will automatically\nkeep trying to reconnect to the RPC server should the connection be lost.  There\nis a back-off in between each connection attempt until it reaches one try per\nminute.  Once a connection is re-established, all previously registered\nnotifications are automatically re-registered and any in-flight commands are\nre-issued.  This means from the caller's perspective, the request simply takes\nlonger to complete.\n\nThe caller may invoke the Shutdown method on the client to force the client\nto cease reconnect attempts and return ErrClientShutdown for all outstanding\ncommands.\n\nThe automatic reconnection can be disabled by setting the DisableAutoReconnect\nflag to true in the connection config when creating the client.\n\nMinor RPC Server Differences and Chain/Wallet Separation\n\nSome of the commands are extensions specific to a particular RPC server.  For\nexample, the DebugLevel call is an extension only provided by btcd (and\nbtcwallet passthrough).  Therefore if you call one of these commands against\nan RPC server that doesn't provide them, you will get an unimplemented error\nfrom the server.  An effort has been made to call out which commands are\nextensions in their documentation.\n\nAlso, it is important to realize that btcd intentionally separates the wallet\nfunctionality into a separate process named btcwallet.  This means if you are\nconnected to the btcd RPC server directly, only the RPCs which are related to\nchain services will be available.  Depending on your application, you might only\nneed chain-related RPCs.  In contrast, btcwallet provides pass through treatment\nfor chain-related RPCs, so it supports them in addition to wallet-related RPCs.\n\n# Errors\n\nThere are 3 categories of errors that will be returned throughout this package:\n\n  - Errors related to the client connection such as authentication, endpoint,\n    disconnect, and shutdown\n  - Errors that occur before communicating with the remote RPC server such as\n    command creation and marshaling errors or issues talking to the remote\n    server\n  - Errors returned from the remote RPC server like unimplemented commands,\n    nonexistent requested blocks and transactions, malformed data, and incorrect\n    networks\n\nThe first category of errors are typically one of ErrInvalidAuth,\nErrInvalidEndpoint, ErrClientDisconnect, or ErrClientShutdown.\n\nNOTE: The ErrClientDisconnect will not be returned unless the\nDisableAutoReconnect flag is set since the client automatically handles\nreconnect by default as previously described.\n\nThe second category of errors typically indicates a programmer error and as such\nthe type can vary, but usually will be best handled by simply showing/logging\nit.\n\nThe third category of errors, that is errors returned by the server, can be\ndetected by type asserting the error in a *btcjson.RPCError.  For example, to\ndetect if a command is unimplemented by the remote RPC server:\n\n\t  amount, err := client.GetBalance(\"\")\n\t  if err != nil {\n\t  \tif jerr, ok := err.(*btcjson.RPCError); ok {\n\t  \t\tswitch jerr.Code {\n\t  \t\tcase btcjson.ErrRPCUnimplemented:\n\t  \t\t\t// Handle not implemented error\n\n\t  \t\t// Handle other specific errors you care about\n\t\t\t}\n\t  \t}\n\n\t  \t// Log or otherwise handle the error knowing it was not one returned\n\t  \t// from the remote RPC server.\n\t  }\n\n# Example Usage\n\nThe following full-blown client examples are in the examples directory:\n\n  - bitcoincorehttp\n    Connects to a bitcoin core RPC server using HTTP POST mode with TLS disabled\n    and gets the current block count\n  - btcdwebsockets\n    Connects to a btcd RPC server using TLS-secured websockets, registers for\n    block connected and block disconnected notifications, and gets the current\n    block count\n  - btcwalletwebsockets\n    Connects to a btcwallet RPC server using TLS-secured websockets, registers\n    for notifications about changes to account balances, and gets a list of\n    unspent transaction outputs (utxos) the wallet can sign\n*/\npackage rpcclient\n"
  },
  {
    "path": "rpcclient/errors.go",
    "content": "package rpcclient\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n)\n\nvar (\n\t// ErrBackendVersion is returned when running against a bitcoind or\n\t// btcd that is older than the minimum version supported by the\n\t// rpcclient.\n\tErrBackendVersion = errors.New(\"backend version too low\")\n\n\t// ErrInvalidParam is returned when the caller provides an invalid\n\t// parameter to an RPC method.\n\tErrInvalidParam = errors.New(\"invalid param\")\n\n\t// ErrUndefined is used when an error returned is not recognized. We\n\t// should gradually increase our error types to avoid returning this\n\t// error.\n\tErrUndefined = errors.New(\"undefined\")\n)\n\n// BitcoindRPCErr represents an error returned by bitcoind's RPC server.\ntype BitcoindRPCErr uint32\n\n// This section defines all possible errors or reject reasons returned from\n// bitcoind's `sendrawtransaction` or `testmempoolaccept` RPC.\nconst (\n\t// ErrMissingInputsOrSpent is returned when calling\n\t// `sendrawtransaction` with missing inputs.\n\tErrMissingInputsOrSpent BitcoindRPCErr = iota\n\n\t// ErrMaxBurnExceeded is returned when calling `sendrawtransaction`\n\t// with exceeding, falling short of, and equaling maxburnamount.\n\tErrMaxBurnExceeded\n\n\t// ErrMaxFeeExceeded can happen when passing a signed tx to\n\t// `testmempoolaccept`, but the tx pays more fees than specified.\n\tErrMaxFeeExceeded\n\n\t// ErrTxAlreadyKnown is used in the `reject-reason` field of\n\t// `testmempoolaccept` when a transaction is already in the blockchain.\n\tErrTxAlreadyKnown\n\n\t// ErrTxAlreadyConfirmed is returned as an error from\n\t// `sendrawtransaction` when a transaction is already in the\n\t// blockchain.\n\tErrTxAlreadyConfirmed\n\n\t// ErrMempoolConflict happens when RBF is not enabled yet the\n\t// transaction conflicts with an unconfirmed tx.  .\n\t//\n\t// NOTE: RBF rule 1.\n\tErrMempoolConflict\n\n\t// ErrReplacementAddsUnconfirmed is returned when a transaction adds\n\t// new unconfirmed inputs.\n\t//\n\t// NOTE: RBF rule 2.\n\tErrReplacementAddsUnconfirmed\n\n\t// ErrInsufficientFee is returned when fee rate used or fees paid\n\t// doesn't meet the requirements.\n\t//\n\t// NOTE: RBF rule 3 or 4.\n\tErrInsufficientFee\n\n\t// ErrTooManyReplacements is returned when a transaction causes too\n\t// many transactions being replaced. This is set by\n\t// `MAX_REPLACEMENT_CANDIDATES` in `bitcoind` and defaults to 100.\n\t//\n\t// NOTE: RBF rule 5.\n\tErrTooManyReplacements\n\n\t// ErrMempoolMinFeeNotMet is returned when the transaction doesn't meet\n\t// the minimum relay fee.\n\tErrMempoolMinFeeNotMet\n\n\t// ErrConflictingTx is returned when a transaction that spends\n\t// conflicting tx outputs that are rejected.\n\tErrConflictingTx\n\n\t// ErrEmptyOutput is returned when a transaction has no outputs.\n\tErrEmptyOutput\n\n\t// ErrEmptyInput is returned when a transaction has no inputs.\n\tErrEmptyInput\n\n\t// ErrTxTooSmall is returned when spending a tiny transaction(in\n\t// non-witness bytes) that is disallowed.\n\t//\n\t// NOTE: ErrTxTooLarge must be put after ErrTxTooSmall because it's a\n\t// subset of ErrTxTooSmall. Otherwise, if bitcoind returns\n\t// `tx-size-small`, it will be matched to ErrTxTooLarge.\n\tErrTxTooSmall\n\n\t// ErrDuplicateInput is returned when a transaction has duplicate\n\t// inputs.\n\tErrDuplicateInput\n\n\t// ErrEmptyPrevOut is returned when a non-coinbase transaction has\n\t// coinbase-like outpoint.\n\tErrEmptyPrevOut\n\n\t// ErrBelowOutValue is returned when a transaction's output value is\n\t// greater than its input value.\n\tErrBelowOutValue\n\n\t// ErrNegativeOutput is returned when a transaction has negative output\n\t// value.\n\tErrNegativeOutput\n\n\t// ErrLargeOutput is returned when a transaction has too large output\n\t// value.\n\tErrLargeOutput\n\n\t// ErrLargeTotalOutput is returned when a transaction has too large sum\n\t// of output values.\n\tErrLargeTotalOutput\n\n\t// ErrScriptVerifyFlag is returned when there is invalid OP_IF\n\t// construction.\n\tErrScriptVerifyFlag\n\n\t// ErrTooManySigOps is returned when a transaction has too many sigops.\n\tErrTooManySigOps\n\n\t// ErrInvalidOpcode is returned when a transaction has invalid OP\n\t// codes.\n\tErrInvalidOpcode\n\n\t// ErrTxAlreadyInMempool is returned when a transaction is in the\n\t// mempool.\n\tErrTxAlreadyInMempool\n\n\t// ErrMissingInputs is returned when a transaction has missing inputs,\n\t// that never existed or only existed once in the past.\n\tErrMissingInputs\n\n\t// ErrOversizeTx is returned when a transaction is too large.\n\tErrOversizeTx\n\n\t// ErrCoinbaseTx is returned when the transaction is coinbase tx.\n\tErrCoinbaseTx\n\n\t// ErrNonStandardVersion is returned when the transactions are not\n\t// standard - a version currently non-standard.\n\tErrNonStandardVersion\n\n\t// ErrNonStandardScript is returned when the transactions are not\n\t// standard - non-standard script.\n\tErrNonStandardScript\n\n\t// ErrBareMultiSig is returned when the transactions are not standard -\n\t// bare multisig script (2-of-3).\n\tErrBareMultiSig\n\n\t// ErrScriptSigNotPushOnly is returned when the transactions are not\n\t// standard - not-pushonly scriptSig.\n\tErrScriptSigNotPushOnly\n\n\t// ErrScriptSigSize is returned when the transactions are not standard\n\t// - too large scriptSig (>1650 bytes).\n\tErrScriptSigSize\n\n\t// ErrTxTooLarge is returned when the transactions are not standard -\n\t// too large tx size.\n\tErrTxTooLarge\n\n\t// ErrDust is returned when the transactions are not standard - output\n\t// too small.\n\tErrDust\n\n\t// ErrMultiOpReturn is returned when the transactions are not standard\n\t// - muiltiple OP_RETURNs.\n\tErrMultiOpReturn\n\n\t// ErrNonFinal is returned when spending a timelocked transaction that\n\t// hasn't expired yet.\n\tErrNonFinal\n\n\t// ErrNonBIP68Final is returned when a transaction that is locked by\n\t// BIP68 sequence logic and not expired yet.\n\tErrNonBIP68Final\n\n\t// ErrSameNonWitnessData is returned when another tx with the same\n\t// non-witness data is already in the mempool. For instance, these two\n\t// txns share the same `txid` but different `wtxid`.\n\tErrSameNonWitnessData\n\n\t// ErrNonMandatoryScriptVerifyFlag is returned when passing a raw tx to\n\t// `testmempoolaccept`, which gives the error followed by (Witness\n\t// program hash mismatch).\n\tErrNonMandatoryScriptVerifyFlag\n\n\t// errSentinel is used to indicate the end of the error list. This\n\t// should always be the last error code.\n\terrSentinel\n)\n\n// Error implements the error interface. It returns the error message defined\n// in `bitcoind`.\n\n// Some of the dashes used in the original error string is removed, e.g.\n// \"missing-inputs\" is now \"missing inputs\". This is ok since we will normalize\n// the errors before matching.\n//\n// references:\n// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/rpc_rawtransaction.py#L342\n// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/data/invalid_txs.py\n// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/mempool_accept.py\n// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/mempool_accept_wtxid.py\n// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/mempool_dust.py\n// - https://github.com/bitcoin/bitcoin/blob/master/test/functional/mempool_limit.py\n// - https://github.com/bitcoin/bitcoin/blob/master/src/validation.cpp\nfunc (r BitcoindRPCErr) Error() string {\n\tswitch r {\n\tcase ErrMissingInputsOrSpent:\n\t\treturn \"bad-txns-inputs-missingorspent\"\n\n\tcase ErrMaxBurnExceeded:\n\t\treturn \"Unspendable output exceeds maximum configured by user (maxburnamount)\"\n\n\tcase ErrMaxFeeExceeded:\n\t\treturn \"max-fee-exceeded\"\n\n\tcase ErrTxAlreadyKnown:\n\t\treturn \"txn-already-known\"\n\n\tcase ErrTxAlreadyConfirmed:\n\t\treturn \"Transaction already in block chain\"\n\n\tcase ErrMempoolConflict:\n\t\treturn \"txn mempool conflict\"\n\n\tcase ErrReplacementAddsUnconfirmed:\n\t\treturn \"replacement adds unconfirmed\"\n\n\tcase ErrInsufficientFee:\n\t\treturn \"insufficient fee\"\n\n\tcase ErrTooManyReplacements:\n\t\treturn \"too many potential replacements\"\n\n\tcase ErrMempoolMinFeeNotMet:\n\t\treturn \"mempool min fee not met\"\n\n\tcase ErrConflictingTx:\n\t\treturn \"bad txns spends conflicting tx\"\n\n\tcase ErrEmptyOutput:\n\t\treturn \"bad txns vout empty\"\n\n\tcase ErrEmptyInput:\n\t\treturn \"bad txns vin empty\"\n\n\tcase ErrTxTooSmall:\n\t\treturn \"tx size small\"\n\n\tcase ErrDuplicateInput:\n\t\treturn \"bad txns inputs duplicate\"\n\n\tcase ErrEmptyPrevOut:\n\t\treturn \"bad txns prevout null\"\n\n\tcase ErrBelowOutValue:\n\t\treturn \"bad txns in belowout\"\n\n\tcase ErrNegativeOutput:\n\t\treturn \"bad txns vout negative\"\n\n\tcase ErrLargeOutput:\n\t\treturn \"bad txns vout toolarge\"\n\n\tcase ErrLargeTotalOutput:\n\t\treturn \"bad txns txouttotal toolarge\"\n\n\tcase ErrScriptVerifyFlag:\n\t\treturn \"mandatory script verify flag failed\"\n\n\tcase ErrTooManySigOps:\n\t\treturn \"bad txns too many sigops\"\n\n\tcase ErrInvalidOpcode:\n\t\treturn \"disabled opcode\"\n\n\tcase ErrTxAlreadyInMempool:\n\t\treturn \"txn already in mempool\"\n\n\tcase ErrMissingInputs:\n\t\treturn \"missing inputs\"\n\n\tcase ErrOversizeTx:\n\t\treturn \"bad txns oversize\"\n\n\tcase ErrCoinbaseTx:\n\t\treturn \"coinbase\"\n\n\tcase ErrNonStandardVersion:\n\t\treturn \"version\"\n\n\tcase ErrNonStandardScript:\n\t\treturn \"scriptpubkey\"\n\n\tcase ErrBareMultiSig:\n\t\treturn \"bare multisig\"\n\n\tcase ErrScriptSigNotPushOnly:\n\t\treturn \"scriptsig not pushonly\"\n\n\tcase ErrScriptSigSize:\n\t\treturn \"scriptsig size\"\n\n\tcase ErrTxTooLarge:\n\t\treturn \"tx size\"\n\n\tcase ErrDust:\n\t\treturn \"dust\"\n\n\tcase ErrMultiOpReturn:\n\t\treturn \"multi op return\"\n\n\tcase ErrNonFinal:\n\t\treturn \"non final\"\n\n\tcase ErrNonBIP68Final:\n\t\treturn \"non BIP68 final\"\n\n\tcase ErrSameNonWitnessData:\n\t\treturn \"txn-same-nonwitness-data-in-mempool\"\n\n\tcase ErrNonMandatoryScriptVerifyFlag:\n\t\treturn \"non-mandatory-script-verify-flag\"\n\t}\n\n\treturn \"unknown error\"\n}\n\n// BitcoindErrMap is a map of additional errors bitcoind can throw that are\n// version dependent (e.g. versions up to v29 return the error as specified in\n// `Error()` above, while versions v30 and beyond return the error as mapped\n// here. We add a new map for errors that were simply renamed but have the same\n// semantic meaning. New errors should be added above as new error constants.\nvar BitcoindErrMap = map[string]error{\n\t// The error message was changed in\n\t// https://github.com/bitcoin/bitcoin/pull/33050 which will be included\n\t// in bitcoind v30.0 and beyond.\n\t\"mempool script verify flag failed\": ErrNonMandatoryScriptVerifyFlag,\n\n\t// The error message was changed in\n\t// https://github.com/bitcoin/bitcoin/pull/33183 which will also be\n\t// included in bitcoind v30.0 and beyond.\n\t\"block script verify flag failed\": ErrScriptVerifyFlag,\n}\n\n// BtcdErrMap takes the errors returned from btcd's `testmempoolaccept` and\n// `sendrawtransaction` RPCs and map them to the errors defined above, which\n// are results from calling either `testmempoolaccept` or `sendrawtransaction`\n// in `bitcoind`.\n//\n// Errors not mapped in `btcd`:\n//   - deployment error from `validateSegWitDeployment`.\n//   - the error when total inputs is higher than max allowed value from\n//     `CheckTransactionInputs`.\n//   - the error when total outputs is higher than total inputs from\n//     `CheckTransactionInputs`.\n//   - errors from `CalcSequenceLock`.\n//\n// NOTE: This is not an exhaustive list of errors, but it covers the\n// usage case of LND.\n//\n//nolint:lll\nvar BtcdErrMap = map[string]error{\n\t// BIP125 related errors.\n\t//\n\t// When fee rate used or fees paid doesn't meet the requirements.\n\t\"replacement transaction has an insufficient fee rate\":     ErrInsufficientFee,\n\t\"replacement transaction has an insufficient absolute fee\": ErrInsufficientFee,\n\n\t// When a transaction causes too many transactions being replaced. This\n\t// is set by `MAX_REPLACEMENT_CANDIDATES` in `bitcoind` and defaults to\n\t// 100.\n\t\"replacement transaction evicts more transactions than permitted\": ErrTooManyReplacements,\n\n\t// When a transaction adds new unconfirmed inputs.\n\t\"replacement transaction spends new unconfirmed input\": ErrReplacementAddsUnconfirmed,\n\n\t// A transaction that spends conflicting tx outputs that are rejected.\n\t\"replacement transaction spends parent transaction\": ErrConflictingTx,\n\n\t// A transaction that conflicts with an unconfirmed tx. Happens when\n\t// RBF is not enabled.\n\t\"output already spent in mempool\": ErrMempoolConflict,\n\n\t// A transaction with no outputs.\n\t\"transaction has no outputs\": ErrEmptyOutput,\n\n\t// A transaction with no inputs.\n\t\"transaction has no inputs\": ErrEmptyInput,\n\n\t// A transaction with duplicate inputs.\n\t\"transaction contains duplicate inputs\": ErrDuplicateInput,\n\n\t// A non-coinbase transaction with coinbase-like outpoint.\n\t\"transaction input refers to previous output that is null\": ErrEmptyPrevOut,\n\n\t// A transaction pays too little fee.\n\t\"fees which is under the required amount\":               ErrMempoolMinFeeNotMet,\n\t\"has insufficient priority\":                             ErrInsufficientFee,\n\t\"has been rejected by the rate limiter due to low fees\": ErrInsufficientFee,\n\n\t// A transaction with negative output value.\n\t\"transaction output has negative value\": ErrNegativeOutput,\n\n\t// A transaction with too large output value.\n\t\"transaction output value is higher than max allowed value\": ErrLargeOutput,\n\n\t// A transaction with too large sum of output values.\n\t\"total value of all transaction outputs exceeds max allowed value\": ErrLargeTotalOutput,\n\n\t// A transaction with too many sigops.\n\t\"sigop cost is too hight\": ErrTooManySigOps,\n\n\t// A transaction already in the blockchain.\n\t\"database contains entry for spent tx output\": ErrTxAlreadyKnown,\n\t\"transaction already exists in blockchain\":    ErrTxAlreadyConfirmed,\n\n\t// A transaction in the mempool.\n\t//\n\t// NOTE: For btcd v0.24.2 and beyond, the error message is \"already\n\t// have transaction in mempool\".\n\t\"already have transaction\": ErrTxAlreadyInMempool,\n\n\t// A transaction with missing inputs, that never existed or only\n\t// existed once in the past.\n\t\"either does not exist or has already been spent\": ErrMissingInputs,\n\t\"orphan transaction\":                              ErrMissingInputs,\n\n\t// A really large transaction.\n\t\"serialized transaction is too big\": ErrOversizeTx,\n\n\t// A coinbase transaction.\n\t\"transaction is an invalid coinbase\": ErrCoinbaseTx,\n\n\t// Some nonstandard transactions - a version currently non-standard.\n\t\"transaction version\": ErrNonStandardVersion,\n\n\t// Some nonstandard transactions - non-standard script.\n\t\"non-standard script form\": ErrNonStandardScript,\n\t\"has a non-standard input\": ErrNonStandardScript,\n\n\t// Some nonstandard transactions - bare multisig script\n\t// (2-of-3).\n\t\"milti-signature script\": ErrBareMultiSig,\n\n\t// Some nonstandard transactions - not-pushonly scriptSig.\n\t\"signature script is not push only\": ErrScriptSigNotPushOnly,\n\n\t// Some nonstandard transactions - too large scriptSig (>1650\n\t// bytes).\n\t\"signature script size is larger than max allowed\": ErrScriptSigSize,\n\n\t// Some nonstandard transactions - too large tx size.\n\t\"weight of transaction is larger than max allowed\": ErrTxTooLarge,\n\n\t// Some nonstandard transactions - output too small.\n\t\"payment is dust\": ErrDust,\n\n\t// Some nonstandard transactions - muiltiple OP_RETURNs.\n\t\"more than one transaction output in a nulldata script\": ErrMultiOpReturn,\n\n\t// A timelocked transaction.\n\t\"transaction is not finalized\":               ErrNonFinal,\n\t\"tried to spend coinbase transaction output\": ErrNonFinal,\n\n\t// A transaction that is locked by BIP68 sequence logic.\n\t\"transaction's sequence locks on inputs not met\": ErrNonBIP68Final,\n\n\t// TODO(yy): find/return the following errors in `btcd`.\n\t//\n\t// A tiny transaction(in non-witness bytes) that is disallowed.\n\t// \"unmatched btcd error 1\": ErrTxTooSmall,\n\t// \"unmatched btcd error 2\": ErrScriptVerifyFlag,\n\t// // A transaction with invalid OP codes.\n\t// \"unmatched btcd error 3\": ErrInvalidOpcode,\n\t// // Minimally-small transaction(in non-witness bytes) that is\n\t// // allowed.\n\t// \"unmatched btcd error 4\": ErrSameNonWitnessData,\n}\n\n// MapRPCErr takes an error returned from calling RPC methods from various\n// chain backend and map it to an defined error here. It uses the `BtcdErrMap`\n// defined above, whose keys are btcd error strings and values are errors made\n// from bitcoind error strings.\n//\n// NOTE: we assume neutrino shares the same error strings as btcd.\nfunc MapRPCErr(rpcErr error) error {\n\t// Iterate the btcd error map and find the matching error.\n\tfor btcdErr, err := range BtcdErrMap {\n\t\t// Match it against btcd's error first.\n\t\tif matchErrStr(rpcErr, btcdErr) {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Also check the bitcoind error map, which is used for bitcoind version\n\t// dependent errors.\n\tfor bitcoindErr, err := range BitcoindErrMap {\n\t\t// Match it against bitcoind's error.\n\t\tif matchErrStr(rpcErr, bitcoindErr) {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// If not found, try to match it against bitcoind's error.\n\tfor i := uint32(0); i < uint32(errSentinel); i++ {\n\t\terr := BitcoindRPCErr(i)\n\t\tif matchErrStr(rpcErr, err.Error()) {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// If not matched, return the original error wrapped.\n\treturn fmt.Errorf(\"%w: %v\", ErrUndefined, rpcErr)\n}\n\n// matchErrStr takes an error returned from RPC client and matches it against\n// the specified string. If the expected string pattern is found in the error\n// passed, return true. Both the error strings are normalized before matching.\nfunc matchErrStr(err error, s string) bool {\n\t// Replace all dashes found in the error string with spaces.\n\tstrippedErrStr := strings.ReplaceAll(err.Error(), \"-\", \" \")\n\n\t// Replace all dashes found in the error string with spaces.\n\tstrippedMatchStr := strings.ReplaceAll(s, \"-\", \" \")\n\n\t// Match against the lowercase.\n\treturn strings.Contains(\n\t\tstrings.ToLower(strippedErrStr),\n\t\tstrings.ToLower(strippedMatchStr),\n\t)\n}\n"
  },
  {
    "path": "rpcclient/errors_test.go",
    "content": "package rpcclient\n\nimport (\n\t\"errors\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestMatchErrStr checks that `matchErrStr` can correctly replace the dashes\n// with spaces and turn title cases into lowercases for a given error and match\n// it against the specified string pattern.\nfunc TestMatchErrStr(t *testing.T) {\n\tt.Parallel()\n\n\ttestCases := []struct {\n\t\tname        string\n\t\tbitcoindErr error\n\t\tmatchStr    string\n\t\tmatched     bool\n\t}{\n\t\t{\n\t\t\tname:        \"error without dashes\",\n\t\t\tbitcoindErr: errors.New(\"missing input\"),\n\t\t\tmatchStr:    \"missing input\",\n\t\t\tmatched:     true,\n\t\t},\n\t\t{\n\t\t\tname:        \"match str without dashes\",\n\t\t\tbitcoindErr: errors.New(\"missing-input\"),\n\t\t\tmatchStr:    \"missing input\",\n\t\t\tmatched:     true,\n\t\t},\n\t\t{\n\t\t\tname:        \"error with dashes\",\n\t\t\tbitcoindErr: errors.New(\"missing-input\"),\n\t\t\tmatchStr:    \"missing input\",\n\t\t\tmatched:     true,\n\t\t},\n\t\t{\n\t\t\tname:        \"match str with dashes\",\n\t\t\tbitcoindErr: errors.New(\"missing-input\"),\n\t\t\tmatchStr:    \"missing-input\",\n\t\t\tmatched:     true,\n\t\t},\n\t\t{\n\t\t\tname:        \"error with title case and dash\",\n\t\t\tbitcoindErr: errors.New(\"Missing-Input\"),\n\t\t\tmatchStr:    \"missing input\",\n\t\t\tmatched:     true,\n\t\t},\n\t\t{\n\t\t\tname:        \"match str with title case and dash\",\n\t\t\tbitcoindErr: errors.New(\"missing-input\"),\n\t\t\tmatchStr:    \"Missing-Input\",\n\t\t\tmatched:     true,\n\t\t},\n\t\t{\n\t\t\tname:        \"unmatched error\",\n\t\t\tbitcoindErr: errors.New(\"missing input\"),\n\t\t\tmatchStr:    \"missingorspent\",\n\t\t\tmatched:     false,\n\t\t},\n\t\t{\n\t\t\tname: \"new bitcoind v30 error\",\n\t\t\tbitcoindErr: errors.New(\n\t\t\t\t\"mempool-script-verify-flag-failed\",\n\t\t\t),\n\t\t\tmatchStr: \"mempool script verify flag failed\",\n\t\t\tmatched:  true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tmatched := matchErrStr(tc.bitcoindErr, tc.matchStr)\n\t\t\trequire.Equal(t, tc.matched, matched)\n\t\t})\n\t}\n}\n\n// TestMapRPCErr checks that `MapRPCErr` can correctly map a given error to\n// the corresponding error in the `BtcdErrMap` or `BitcoindErrors` map.\nfunc TestMapRPCErr(t *testing.T) {\n\tt.Parallel()\n\n\trequire := require.New(t)\n\n\t// Get all known bitcoind errors.\n\tbitcoindErrors := make([]error, 0, errSentinel)\n\tfor i := uint32(0); i < uint32(errSentinel); i++ {\n\t\terr := BitcoindRPCErr(i)\n\t\tbitcoindErrors = append(bitcoindErrors, err)\n\t}\n\n\t// An unknown error should be mapped to ErrUndefined.\n\terrUnknown := errors.New(\"unknown error\")\n\terr := MapRPCErr(errUnknown)\n\trequire.ErrorIs(err, ErrUndefined)\n\n\t// A known error should be mapped to the corresponding error in the\n\t// `BtcdErrMap` or `bitcoindErrors` map.\n\tfor btcdErrStr, mappedErr := range BtcdErrMap {\n\t\terr := MapRPCErr(errors.New(btcdErrStr))\n\t\trequire.ErrorIs(err, mappedErr)\n\n\t\terr = MapRPCErr(mappedErr)\n\t\trequire.ErrorIs(err, mappedErr)\n\t}\n\n\tfor _, bitcoindErr := range bitcoindErrors {\n\t\terr = MapRPCErr(bitcoindErr)\n\t\trequire.ErrorIs(err, bitcoindErr)\n\t}\n}\n\n// TestBitcoindErrorSentinel checks that all defined BitcoindRPCErr errors are\n// added to the method `Error`.\nfunc TestBitcoindErrorSentinel(t *testing.T) {\n\tt.Parallel()\n\n\trt := require.New(t)\n\n\tfor i := uint32(0); i < uint32(errSentinel); i++ {\n\t\terr := BitcoindRPCErr(i)\n\t\trt.NotEqualf(err.Error(), \"unknown error\", \"error code %d is \"+\n\t\t\t\"not defined, make sure to update it inside the Error \"+\n\t\t\t\"method\", i)\n\t}\n}\n"
  },
  {
    "path": "rpcclient/example_test.go",
    "content": "// Copyright (c) 2020 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\nvar connCfg = &ConnConfig{\n\tHost:         \"localhost:8332\",\n\tUser:         \"user\",\n\tPass:         \"pass\",\n\tHTTPPostMode: true,\n\tDisableTLS:   true,\n}\n\nfunc ExampleClient_GetDescriptorInfo() {\n\tclient, err := New(connCfg, nil)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer client.Shutdown()\n\n\tdescriptorInfo, err := client.GetDescriptorInfo(\n\t\t\"wpkh([d34db33f/84h/0h/0h]0279be667ef9dcbbac55a06295Ce870b07029Bfcdb2dce28d959f2815b16f81798)\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Printf(\"%+v\\n\", descriptorInfo)\n\t// &{Descriptor:wpkh([d34db33f/84'/0'/0']0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798)#n9g43y4k Checksum:qwlqgth7 IsRange:false IsSolvable:true HasPrivateKeys:false}\n}\n\nfunc ExampleClient_ImportMulti() {\n\tclient, err := New(connCfg, nil)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer client.Shutdown()\n\n\trequests := []btcjson.ImportMultiRequest{\n\t\t{\n\t\t\tDescriptor: btcjson.String(\n\t\t\t\t\"pkh([f34db33f/44'/0'/0']xpub6Cc939fyHvfB9pPLWd3bSyyQFvgKbwhidca49jGCM5Hz5ypEPGf9JVXB4NBuUfPgoHnMjN6oNgdC9KRqM11RZtL8QLW6rFKziNwHDYhZ6Kx/0/*)#ed7px9nu\"),\n\t\t\tRange:     &btcjson.DescriptorRange{Value: []int{0, 100}},\n\t\t\tTimestamp: btcjson.TimestampOrNow{Value: 0}, // scan from genesis\n\t\t\tWatchOnly: btcjson.Bool(true),\n\t\t\tKeyPool:   btcjson.Bool(false),\n\t\t\tInternal:  btcjson.Bool(false),\n\t\t},\n\t}\n\topts := &btcjson.ImportMultiOptions{Rescan: true}\n\n\tresp, err := client.ImportMulti(requests, opts)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(resp[0].Success)\n\t// true\n}\n\nfunc ExampleClient_DeriveAddresses() {\n\tclient, err := New(connCfg, nil)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer client.Shutdown()\n\n\taddrs, err := client.DeriveAddresses(\n\t\t\"pkh([f34db33f/44'/0'/0']xpub6Cc939fyHvfB9pPLWd3bSyyQFvgKbwhidca49jGCM5Hz5ypEPGf9JVXB4NBuUfPgoHnMjN6oNgdC9KRqM11RZtL8QLW6rFKziNwHDYhZ6Kx/0/*)#ed7px9nu\",\n\t\t&btcjson.DescriptorRange{Value: []int{0, 2}})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Printf(\"%+v\\n\", addrs)\n\t// &[14NjenDKkGGq1McUgoSkeUHJpW3rrKLbPW 1Pn6i3cvdGhqbdgNjXHfbaYfiuviPiymXj 181x1NbgGYKLeMXkDdXEAqepG75EgU8XtG]\n}\n\nfunc ExampleClient_GetAddressInfo() {\n\tclient, err := New(connCfg, nil)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer client.Shutdown()\n\n\tinfo, err := client.GetAddressInfo(\"2NF1FbxtUAsvdU4uW1UC2xkBVatp6cYQuJ3\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(info.Address)             // 2NF1FbxtUAsvdU4uW1UC2xkBVatp6cYQuJ3\n\tfmt.Println(info.ScriptType.String()) // witness_v0_keyhash\n\tfmt.Println(*info.HDKeyPath)          // m/49'/1'/0'/0/4\n\tfmt.Println(info.Embedded.Address)    // tb1q3x2h2kh57wzg7jz00jhwn0ycvqtdk2ane37j27\n}\n\nfunc ExampleClient_GetWalletInfo() {\n\tclient, err := New(connCfg, nil)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer client.Shutdown()\n\n\tinfo, err := client.GetWalletInfo()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(info.WalletVersion)    // 169900\n\tfmt.Println(info.TransactionCount) // 22\n\tfmt.Println(*info.HDSeedID)        // eb44e4e9b864ef17e7ba947da746375b000f5d94\n\tfmt.Println(info.Scanning.Value)   // false\n}\n\nfunc ExampleClient_GetTxOutSetInfo() {\n\tclient, err := New(connCfg, nil)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer client.Shutdown()\n\n\tr, err := client.GetTxOutSetInfo()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(r.TotalAmount.String()) // 20947654.56996054 BTC\n\tfmt.Println(r.BestBlock.String())   // 000000000000005f94116250e2407310463c0a7cf950f1af9ebe935b1c0687ab\n\tfmt.Println(r.TxOuts)               // 24280607\n\tfmt.Println(r.Transactions)         // 9285603\n\tfmt.Println(r.DiskSize)             // 1320871611\n}\n\nfunc ExampleClient_CreateWallet() {\n\tclient, err := New(connCfg, nil)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer client.Shutdown()\n\n\tr, err := client.CreateWallet(\n\t\t\"mywallet\",\n\t\tWithCreateWalletBlank(),\n\t\tWithCreateWalletPassphrase(\"secret\"),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(r.Name) // mywallet\n}\n"
  },
  {
    "path": "rpcclient/examples/bitcoincorehttp/README.md",
    "content": "Bitcoin Core HTTP POST Example\n==============================\n\nThis example shows how to use the rpcclient package to connect to a Bitcoin\nCore RPC server using HTTP POST mode with TLS disabled and gets the current\nblock count.\n\n## Running the Example\n\nThe first step is to use `go get` to download and install the rpcclient package:\n\n```bash\n$ go get github.com/btcsuite/btcd/rpcclient\n```\n\nNext, modify the `main.go` source to specify the correct RPC username and\npassword for the RPC server:\n\n```Go\n\tUser: \"yourrpcuser\",\n\tPass: \"yourrpcpass\",\n```\n\nFinally, navigate to the example's directory and run it with:\n\n```bash\n$ cd $GOPATH/src/github.com/btcsuite/btcd/rpcclient/examples/bitcoincorehttp\n$ go run *.go\n```\n\n## License\n\nThis example is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "rpcclient/examples/bitcoincorehttp/main.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"log\"\n\n\t\"github.com/btcsuite/btcd/rpcclient\"\n)\n\nfunc main() {\n\t// Connect to local bitcoin core RPC server using HTTP POST mode.\n\tconnCfg := &rpcclient.ConnConfig{\n\t\tHost:         \"localhost:8332\",\n\t\tUser:         \"yourrpcuser\",\n\t\tPass:         \"yourrpcpass\",\n\t\tHTTPPostMode: true, // Bitcoin core only supports HTTP POST mode\n\t\tDisableTLS:   true, // Bitcoin core does not provide TLS by default\n\t}\n\t// Notice the notification parameter is nil since notifications are\n\t// not supported in HTTP POST mode.\n\tclient, err := rpcclient.New(connCfg, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer client.Shutdown()\n\n\t// Get the current block count.\n\tblockCount, err := client.GetBlockCount()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tlog.Printf(\"Block count: %d\", blockCount)\n}\n"
  },
  {
    "path": "rpcclient/examples/bitcoincorehttpbulk/README.md",
    "content": "Bitcoin Core Batch HTTP POST Example\n==============================\n\nThis example shows how to use the rpclient package to connect to a Bitcoin Core RPC server using HTTP POST and batch JSON-RPC mode with TLS disabled.\n\n## Running the Example\n\nThe first step is to use `go get` to download and install the rpcclient package:\n\n```bash\n$ go get github.com/btcsuite/btcd/rpcclient\n```\n\nNext, modify the `main.go` source to specify the correct RPC username and\npassword for the RPC server:\n\n```Go\n\tUser: \"yourrpcuser\",\n\tPass: \"yourrpcpass\",\n```\n\nFinally, navigate to the example's directory and run it with:\n\n```bash\n$ cd $GOPATH/src/github.com/btcsuite/btcd/rpcclient/examples/bitcoincorehttp\n$ go run *.go\n```\n\n## License\n\nThis example is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "rpcclient/examples/bitcoincorehttpbulk/main.go",
    "content": "// Copyright (c) 2014-2020 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\n\t\"github.com/btcsuite/btcd/rpcclient\"\n)\n\nfunc main() {\n\t// Connect to local bitcoin core RPC server using HTTP POST mode.\n\tconnCfg := &rpcclient.ConnConfig{\n\t\tHost:                \"localhost:8332\",\n\t\tUser:                \"yourrpcuser\",\n\t\tPass:                \"yourrpcpass\",\n\t\tDisableConnectOnNew: true,\n\t\tHTTPPostMode:        true, // Bitcoin core only supports HTTP POST mode\n\t\tDisableTLS:          true, // Bitcoin core does not provide TLS by default\n\t}\n\tbatchClient, err := rpcclient.NewBatch(connCfg)\n\tdefer batchClient.Shutdown()\n\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// batch mode requires async requests\n\tblockCount := batchClient.GetBlockCountAsync()\n\tblock1 := batchClient.GetBlockHashAsync(1)\n\tbatchClient.GetBlockHashAsync(2)\n\tbatchClient.GetBlockHashAsync(3)\n\tblock4 := batchClient.GetBlockHashAsync(4)\n\tdifficulty := batchClient.GetDifficultyAsync()\n\n\t// sends all queued batch requests\n\tbatchClient.Send()\n\n\tfmt.Println(blockCount.Receive())\n\tfmt.Println(block1.Receive())\n\tfmt.Println(block4.Receive())\n\tfmt.Println(difficulty.Receive())\n}\n"
  },
  {
    "path": "rpcclient/examples/bitcoincoreunixsocket/README.md",
    "content": "Bitcoin Core HTTP POST Over Unix Socket Example\n==============================\n\nThis example shows how to use the rpcclient package to connect to a Bitcoin\nCore RPC server using HTTP POST mode over a Unix Socket with TLS disabled \nand gets the current block count.\n\n## Running the Example\n\nThe first step is to use `go get` to download and install the rpcclient package:\n\n```bash\n$ go get github.com/btcsuite/btcd/rpcclient\n```\n\nNext, modify the `main.go` source to specify the correct RPC username and\npassword for the RPC server:\n\n```Go\n\tUser: \"yourrpcuser\",\n\tPass: \"yourrpcpass\",\n```\n\nAs Bitcoin Core supports only TCP/IP, we'll redirect RPC requests from the \nUnix Socket to Bitcoin Core. For this example, we'll use the `socat` command:\n\n```bash\n$ socat -d UNIX-LISTEN:\"my-unix-socket-path\",fork TCP:\"host-address\"\n$ socat -d UNIX-LISTEN:/tmp/test.XXXX,fork TCP:localhost:8332\n```\n\nFinally, navigate to the example's directory and run it with:\n\n```bash\n$ cd $GOPATH/src/github.com/btcsuite/btcd/rpcclient/examples/bitcoincorehttp\n$ go run *.go\n```\n\n## License\n\nThis example is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "rpcclient/examples/bitcoincoreunixsocket/main.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"log\"\n\n\t\"github.com/btcsuite/btcd/rpcclient\"\n)\n\nfunc main() {\n\t// Connect to local bitcoin core RPC server using HTTP POST mode over a\n\t// Unix Socket.\n\tconnCfg := &rpcclient.ConnConfig{\n\t\t// For unix sockets, use unix:// + \"your unix socket path\".\n\t\tHost:         \"unix:///tmp/test.XXXX\",\n\t\tUser:         \"yourrpcuser\",\n\t\tPass:         \"yourrpcpass\",\n\t\tHTTPPostMode: true, // Bitcoin core only supports HTTP POST mode.\n\t\tDisableTLS:   true, // Bitcoin core does not provide TLS by default.\n\t}\n\n\t// Notice the notification parameter is nil since notifications are\n\t// not supported in HTTP POST mode.\n\tclient, err := rpcclient.New(connCfg, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer client.Shutdown()\n\n\t// Get the current block count.\n\tblockCount, err := client.GetBlockCount()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tlog.Printf(\"Block count: %d\", blockCount)\n}\n"
  },
  {
    "path": "rpcclient/examples/btcdwebsockets/README.md",
    "content": "btcd Websockets Example\n=======================\n\nThis example shows how to use the rpcclient package to connect to a btcd RPC\nserver using TLS-secured websockets, register for block connected and block\ndisconnected notifications, and get the current block count.\n\nThis example also sets a timer to shutdown the client after 10 seconds to\ndemonstrate clean shutdown.\n\n## Running the Example\n\nThe first step is to use `go get` to download and install the rpcclient package:\n\n```bash\n$ go get github.com/btcsuite/btcd/rpcclient\n```\n\nNext, modify the `main.go` source to specify the correct RPC username and\npassword for the RPC server:\n\n```Go\n\tUser: \"yourrpcuser\",\n\tPass: \"yourrpcpass\",\n```\n\nFinally, navigate to the example's directory and run it with:\n\n```bash\n$ cd $GOPATH/src/github.com/btcsuite/btcd/rpcclient/examples/btcdwebsockets\n$ go run *.go\n```\n\n## License\n\nThis example is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "rpcclient/examples/btcdwebsockets/main.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/rpcclient\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nfunc main() {\n\t// Only override the handlers for notifications you care about.\n\t// Also note most of these handlers will only be called if you register\n\t// for notifications.  See the documentation of the rpcclient\n\t// NotificationHandlers type for more details about each handler.\n\tntfnHandlers := rpcclient.NotificationHandlers{\n\t\tOnFilteredBlockConnected: func(height int32, header *wire.BlockHeader, txns []*btcutil.Tx) {\n\t\t\tlog.Printf(\"Block connected: %v (%d) %v\",\n\t\t\t\theader.BlockHash(), height, header.Timestamp)\n\t\t},\n\t\tOnFilteredBlockDisconnected: func(height int32, header *wire.BlockHeader) {\n\t\t\tlog.Printf(\"Block disconnected: %v (%d) %v\",\n\t\t\t\theader.BlockHash(), height, header.Timestamp)\n\t\t},\n\t}\n\n\t// Connect to local btcd RPC server using websockets.\n\tbtcdHomeDir := btcutil.AppDataDir(\"btcd\", false)\n\tcerts, err := os.ReadFile(filepath.Join(btcdHomeDir, \"rpc.cert\"))\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tconnCfg := &rpcclient.ConnConfig{\n\t\tHost:         \"localhost:8334\",\n\t\tEndpoint:     \"ws\",\n\t\tUser:         \"yourrpcuser\",\n\t\tPass:         \"yourrpcpass\",\n\t\tCertificates: certs,\n\t}\n\tclient, err := rpcclient.New(connCfg, &ntfnHandlers)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Register for block connect and disconnect notifications.\n\tif err := client.NotifyBlocks(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tlog.Println(\"NotifyBlocks: Registration Complete\")\n\n\t// Get the current block count.\n\tblockCount, err := client.GetBlockCount()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tlog.Printf(\"Block count: %d\", blockCount)\n\n\t// For this example gracefully shutdown the client after 10 seconds.\n\t// Ordinarily when to shutdown the client is highly application\n\t// specific.\n\tlog.Println(\"Client shutdown in 10 seconds...\")\n\ttime.AfterFunc(time.Second*10, func() {\n\t\tlog.Println(\"Client shutting down...\")\n\t\tclient.Shutdown()\n\t\tlog.Println(\"Client shutdown complete.\")\n\t})\n\n\t// Wait until the client either shuts down gracefully (or the user\n\t// terminates the process with Ctrl+C).\n\tclient.WaitForShutdown()\n}\n"
  },
  {
    "path": "rpcclient/examples/btcwalletwebsockets/README.md",
    "content": "btcwallet Websockets Example\n============================\n\nThis example shows how to use the rpcclient package to connect to a btcwallet\nRPC server using TLS-secured websockets, register for notifications about\nchanges to account balances, and get a list of unspent transaction outputs\n(utxos) the wallet can sign.\n\nThis example also sets a timer to shutdown the client after 10 seconds to\ndemonstrate clean shutdown.\n\n## Running the Example\n\nThe first step is to use `go get` to download and install the rpcclient package:\n\n```bash\n$ go get github.com/btcsuite/btcd/rpcclient\n```\n\nNext, modify the `main.go` source to specify the correct RPC username and\npassword for the RPC server:\n\n```Go\n\tUser: \"yourrpcuser\",\n\tPass: \"yourrpcpass\",\n```\n\nFinally, navigate to the example's directory and run it with:\n\n```bash\n$ cd $GOPATH/src/github.com/btcsuite/btcd/rpcclient/examples/btcwalletwebsockets\n$ go run *.go\n```\n\n## License\n\nThis example is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "rpcclient/examples/btcwalletwebsockets/main.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/rpcclient\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\nfunc main() {\n\t// Only override the handlers for notifications you care about.\n\t// Also note most of the handlers will only be called if you register\n\t// for notifications.  See the documentation of the rpcclient\n\t// NotificationHandlers type for more details about each handler.\n\tntfnHandlers := rpcclient.NotificationHandlers{\n\t\tOnAccountBalance: func(account string, balance btcutil.Amount, confirmed bool) {\n\t\t\tlog.Printf(\"New balance for account %s: %v\", account,\n\t\t\t\tbalance)\n\t\t},\n\t}\n\n\t// Connect to local btcwallet RPC server using websockets.\n\tcertHomeDir := btcutil.AppDataDir(\"btcwallet\", false)\n\tcerts, err := os.ReadFile(filepath.Join(certHomeDir, \"rpc.cert\"))\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tconnCfg := &rpcclient.ConnConfig{\n\t\tHost:         \"localhost:18332\",\n\t\tEndpoint:     \"ws\",\n\t\tUser:         \"yourrpcuser\",\n\t\tPass:         \"yourrpcpass\",\n\t\tCertificates: certs,\n\t}\n\tclient, err := rpcclient.New(connCfg, &ntfnHandlers)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Get the list of unspent transaction outputs (utxos) that the\n\t// connected wallet has at least one private key for.\n\tunspent, err := client.ListUnspent()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tlog.Printf(\"Num unspent outputs (utxos): %d\", len(unspent))\n\tif len(unspent) > 0 {\n\t\tlog.Printf(\"First utxo:\\n%v\", spew.Sdump(unspent[0]))\n\t}\n\n\t// For this example gracefully shutdown the client after 10 seconds.\n\t// Ordinarily when to shutdown the client is highly application\n\t// specific.\n\tlog.Println(\"Client shutdown in 10 seconds...\")\n\ttime.AfterFunc(time.Second*10, func() {\n\t\tlog.Println(\"Client shutting down...\")\n\t\tclient.Shutdown()\n\t\tlog.Println(\"Client shutdown complete.\")\n\t})\n\n\t// Wait until the client either shuts down gracefully (or the user\n\t// terminates the process with Ctrl+C).\n\tclient.WaitForShutdown()\n}\n"
  },
  {
    "path": "rpcclient/examples/customcommand/README.md",
    "content": "Custom Command Example\n======================\n\nThis example shows how to use custom commands with the rpcclient package, by\nimplementing the `name_show` command from Namecoin Core.\n\n## Running the Example\n\nThe first step is to use `go get` to download and install the rpcclient package:\n\n```bash\n$ go get github.com/btcsuite/btcd/rpcclient\n```\n\nNext, modify the `main.go` source to specify the correct RPC username and\npassword for the RPC server of your Namecoin Core node:\n\n```Go\n\tUser: \"yourrpcuser\",\n\tPass: \"yourrpcpass\",\n```\n\nFinally, navigate to the example's directory and run it with:\n\n```bash\n$ cd $GOPATH/src/github.com/btcsuite/btcd/rpcclient/examples/customcommand\n$ go run *.go\n```\n\n## License\n\nThis example is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "rpcclient/examples/customcommand/main.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Copyright (c) 2019-2020 The Namecoin developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"log\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/rpcclient\"\n)\n\n// NameShowCmd defines the name_show JSON-RPC command.\ntype NameShowCmd struct {\n\tName string\n}\n\n// NameShowResult models the data from the name_show command.\ntype NameShowResult struct {\n\tName          string `json:\"name\"`\n\tNameEncoding  string `json:\"name_encoding\"`\n\tNameError     string `json:\"name_error\"`\n\tValue         string `json:\"value\"`\n\tValueEncoding string `json:\"value_encoding\"`\n\tValueError    string `json:\"value_error\"`\n\tTxID          string `json:\"txid\"`\n\tVout          uint32 `json:\"vout\"`\n\tAddress       string `json:\"address\"`\n\tIsMine        bool   `json:\"ismine\"`\n\tHeight        int32  `json:\"height\"`\n\tExpiresIn     int32  `json:\"expires_in\"`\n\tExpired       bool   `json:\"expired\"`\n}\n\n// FutureNameShowResult is a future promise to deliver the result\n// of a NameShowAsync RPC invocation (or an applicable error).\ntype FutureNameShowResult chan *rpcclient.Response\n\n// Receive waits for the Response promised by the future and returns detailed\n// information about a name.\nfunc (r FutureNameShowResult) Receive() (*NameShowResult, error) {\n\tres, err := rpcclient.ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a name_show result object\n\tvar nameShow NameShowResult\n\terr = json.Unmarshal(res, &nameShow)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &nameShow, nil\n}\n\n// NameShowAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See NameShow for the blocking version and more details.\nfunc NameShowAsync(c *rpcclient.Client, name string) FutureNameShowResult {\n\tcmd := &NameShowCmd{\n\t\tName: name,\n\t}\n\treturn c.SendCmd(cmd)\n}\n\n// NameShow returns detailed information about a name.\nfunc NameShow(c *rpcclient.Client, name string) (*NameShowResult, error) {\n\treturn NameShowAsync(c, name).Receive()\n}\n\nfunc init() {\n\t// No special flags for commands in this file.\n\tflags := btcjson.UsageFlag(0)\n\n\tbtcjson.MustRegisterCmd(\"name_show\", (*NameShowCmd)(nil), flags)\n}\n\nfunc main() {\n\t// Connect to local namecoin core RPC server using HTTP POST mode.\n\tconnCfg := &rpcclient.ConnConfig{\n\t\tHost:         \"localhost:8336\",\n\t\tUser:         \"yourrpcuser\",\n\t\tPass:         \"yourrpcpass\",\n\t\tHTTPPostMode: true, // Namecoin core only supports HTTP POST mode\n\t\tDisableTLS:   true, // Namecoin core does not provide TLS by default\n\t}\n\t// Notice the notification parameter is nil since notifications are\n\t// not supported in HTTP POST mode.\n\tclient, err := rpcclient.New(connCfg, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer client.Shutdown()\n\n\t// Get the current block count.\n\tresult, err := NameShow(client, \"d/namecoin\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tvalue := result.Value\n\n\tlog.Printf(\"Value of d/namecoin: %s\", value)\n}\n"
  },
  {
    "path": "rpcclient/extensions.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// FutureDebugLevelResult is a future promise to deliver the result of a\n// DebugLevelAsync RPC invocation (or an applicable error).\ntype FutureDebugLevelResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of setting the debug logging level to the passed level specification or the\n// list of of the available subsystems for the special keyword 'show'.\nfunc (r FutureDebugLevelResult) Receive() (string, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Unmashal the result as a string.\n\tvar result string\n\terr = json.Unmarshal(res, &result)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn result, nil\n}\n\n// DebugLevelAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See DebugLevel for the blocking version and more details.\n//\n// NOTE: This is a btcd extension.\nfunc (c *Client) DebugLevelAsync(levelSpec string) FutureDebugLevelResult {\n\tcmd := btcjson.NewDebugLevelCmd(levelSpec)\n\treturn c.SendCmd(cmd)\n}\n\n// DebugLevel dynamically sets the debug logging level to the passed level\n// specification.\n//\n// The levelspec can be either a debug level or of the form:\n//\n//\t<subsystem>=<level>,<subsystem2>=<level2>,...\n//\n// Additionally, the special keyword 'show' can be used to get a list of the\n// available subsystems.\n//\n// NOTE: This is a btcd extension.\nfunc (c *Client) DebugLevel(levelSpec string) (string, error) {\n\treturn c.DebugLevelAsync(levelSpec).Receive()\n}\n\n// FutureCreateEncryptedWalletResult is a future promise to deliver the error\n// result of a CreateEncryptedWalletAsync RPC invocation.\ntype FutureCreateEncryptedWalletResult chan *Response\n\n// Receive waits for and returns the error Response promised by the future.\nfunc (r FutureCreateEncryptedWalletResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// CreateEncryptedWalletAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See CreateEncryptedWallet for the blocking version and more details.\n//\n// NOTE: This is a btcwallet extension.\nfunc (c *Client) CreateEncryptedWalletAsync(passphrase string) FutureCreateEncryptedWalletResult {\n\tcmd := btcjson.NewCreateEncryptedWalletCmd(passphrase)\n\treturn c.SendCmd(cmd)\n}\n\n// CreateEncryptedWallet requests the creation of an encrypted wallet.  Wallets\n// managed by btcwallet are only written to disk with encrypted private keys,\n// and generating wallets on the fly is impossible as it requires user input for\n// the encryption passphrase.  This RPC specifies the passphrase and instructs\n// the wallet creation.  This may error if a wallet is already opened, or the\n// new wallet cannot be written to disk.\n//\n// NOTE: This is a btcwallet extension.\nfunc (c *Client) CreateEncryptedWallet(passphrase string) error {\n\treturn c.CreateEncryptedWalletAsync(passphrase).Receive()\n}\n\n// FutureListAddressTransactionsResult is a future promise to deliver the result\n// of a ListAddressTransactionsAsync RPC invocation (or an applicable error).\ntype FutureListAddressTransactionsResult chan *Response\n\n// Receive waits for the Response promised by the future and returns information\n// about all transactions associated with the provided addresses.\nfunc (r FutureListAddressTransactionsResult) Receive() ([]btcjson.ListTransactionsResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal the result as an array of listtransactions objects.\n\tvar transactions []btcjson.ListTransactionsResult\n\terr = json.Unmarshal(res, &transactions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn transactions, nil\n}\n\n// ListAddressTransactionsAsync returns an instance of a type that can be used\n// to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListAddressTransactions for the blocking version and more details.\n//\n// NOTE: This is a btcd extension.\nfunc (c *Client) ListAddressTransactionsAsync(addresses []btcutil.Address, account string) FutureListAddressTransactionsResult {\n\t// Convert addresses to strings.\n\taddrs := make([]string, 0, len(addresses))\n\tfor _, addr := range addresses {\n\t\taddrs = append(addrs, addr.EncodeAddress())\n\t}\n\tcmd := btcjson.NewListAddressTransactionsCmd(addrs, &account)\n\treturn c.SendCmd(cmd)\n}\n\n// ListAddressTransactions returns information about all transactions associated\n// with the provided addresses.\n//\n// NOTE: This is a btcwallet extension.\nfunc (c *Client) ListAddressTransactions(addresses []btcutil.Address, account string) ([]btcjson.ListTransactionsResult, error) {\n\treturn c.ListAddressTransactionsAsync(addresses, account).Receive()\n}\n\n// FutureGetBestBlockResult is a future promise to deliver the result of a\n// GetBestBlockAsync RPC invocation (or an applicable error).\ntype FutureGetBestBlockResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the hash\n// and height of the block in the longest (best) chain.\nfunc (r FutureGetBestBlockResult) Receive() (*chainhash.Hash, int32, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\t// Unmarshal result as a getbestblock result object.\n\tvar bestBlock btcjson.GetBestBlockResult\n\terr = json.Unmarshal(res, &bestBlock)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\t// Convert to hash from string.\n\thash, err := chainhash.NewHashFromStr(bestBlock.Hash)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\treturn hash, bestBlock.Height, nil\n}\n\n// GetBestBlockAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetBestBlock for the blocking version and more details.\n//\n// NOTE: This is a btcd extension.\nfunc (c *Client) GetBestBlockAsync() FutureGetBestBlockResult {\n\tcmd := btcjson.NewGetBestBlockCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetBestBlock returns the hash and height of the block in the longest (best)\n// chain.\n//\n// NOTE: This is a btcd extension.\nfunc (c *Client) GetBestBlock() (*chainhash.Hash, int32, error) {\n\treturn c.GetBestBlockAsync().Receive()\n}\n\n// FutureGetCurrentNetResult is a future promise to deliver the result of a\n// GetCurrentNetAsync RPC invocation (or an applicable error).\ntype FutureGetCurrentNetResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the network\n// the server is running on.\nfunc (r FutureGetCurrentNetResult) Receive() (wire.BitcoinNet, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Unmarshal result as an int64.\n\tvar net int64\n\terr = json.Unmarshal(res, &net)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn wire.BitcoinNet(net), nil\n}\n\n// GetCurrentNetAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetCurrentNet for the blocking version and more details.\n//\n// NOTE: This is a btcd extension.\nfunc (c *Client) GetCurrentNetAsync() FutureGetCurrentNetResult {\n\tcmd := btcjson.NewGetCurrentNetCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetCurrentNet returns the network the server is running on.\n//\n// NOTE: This is a btcd extension.\nfunc (c *Client) GetCurrentNet() (wire.BitcoinNet, error) {\n\treturn c.GetCurrentNetAsync().Receive()\n}\n\n// FutureGetHeadersResult is a future promise to deliver the result of a\n// getheaders RPC invocation (or an applicable error).\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\ntype FutureGetHeadersResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// getheaders result.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\nfunc (r FutureGetHeadersResult) Receive() ([]wire.BlockHeader, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a slice of strings.\n\tvar result []string\n\terr = json.Unmarshal(res, &result)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Deserialize the []string into []wire.BlockHeader.\n\theaders := make([]wire.BlockHeader, len(result))\n\tfor i, headerHex := range result {\n\t\tserialized, err := hex.DecodeString(headerHex)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\terr = headers[i].Deserialize(bytes.NewReader(serialized))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn headers, nil\n}\n\n// GetHeadersAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the returned instance.\n//\n// See GetHeaders for the blocking version and more details.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\nfunc (c *Client) GetHeadersAsync(blockLocators []chainhash.Hash, hashStop *chainhash.Hash) FutureGetHeadersResult {\n\tlocators := make([]string, len(blockLocators))\n\tfor i := range blockLocators {\n\t\tlocators[i] = blockLocators[i].String()\n\t}\n\thash := \"\"\n\tif hashStop != nil {\n\t\thash = hashStop.String()\n\t}\n\tcmd := btcjson.NewGetHeadersCmd(locators, hash)\n\treturn c.SendCmd(cmd)\n}\n\n// GetHeaders mimics the wire protocol getheaders and headers messages by\n// returning all headers on the main chain after the first known block in the\n// locators, up until a block hash matches hashStop.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\nfunc (c *Client) GetHeaders(blockLocators []chainhash.Hash, hashStop *chainhash.Hash) ([]wire.BlockHeader, error) {\n\treturn c.GetHeadersAsync(blockLocators, hashStop).Receive()\n}\n\n// FutureExportWatchingWalletResult is a future promise to deliver the result of\n// an ExportWatchingWalletAsync RPC invocation (or an applicable error).\ntype FutureExportWatchingWalletResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// exported wallet.\nfunc (r FutureExportWatchingWalletResult) Receive() ([]byte, []byte, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// Unmarshal result as a JSON object.\n\tvar obj map[string]interface{}\n\terr = json.Unmarshal(res, &obj)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// Check for the wallet and tx string fields in the object.\n\tbase64Wallet, ok := obj[\"wallet\"].(string)\n\tif !ok {\n\t\treturn nil, nil, fmt.Errorf(\"unexpected response type for \"+\n\t\t\t\"exportwatchingwallet 'wallet' field: %T\\n\",\n\t\t\tobj[\"wallet\"])\n\t}\n\tbase64TxStore, ok := obj[\"tx\"].(string)\n\tif !ok {\n\t\treturn nil, nil, fmt.Errorf(\"unexpected response type for \"+\n\t\t\t\"exportwatchingwallet 'tx' field: %T\\n\",\n\t\t\tobj[\"tx\"])\n\t}\n\n\twalletBytes, err := base64.StdEncoding.DecodeString(base64Wallet)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\ttxStoreBytes, err := base64.StdEncoding.DecodeString(base64TxStore)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn walletBytes, txStoreBytes, nil\n\n}\n\n// ExportWatchingWalletAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ExportWatchingWallet for the blocking version and more details.\n//\n// NOTE: This is a btcwallet extension.\nfunc (c *Client) ExportWatchingWalletAsync(account string) FutureExportWatchingWalletResult {\n\tcmd := btcjson.NewExportWatchingWalletCmd(&account, btcjson.Bool(true))\n\treturn c.SendCmd(cmd)\n}\n\n// ExportWatchingWallet returns the raw bytes for a watching-only version of\n// wallet.bin and tx.bin, respectively, for the specified account that can be\n// used by btcwallet to enable a wallet which does not have the private keys\n// necessary to spend funds.\n//\n// NOTE: This is a btcwallet extension.\nfunc (c *Client) ExportWatchingWallet(account string) ([]byte, []byte, error) {\n\treturn c.ExportWatchingWalletAsync(account).Receive()\n}\n\n// FutureSessionResult is a future promise to deliver the result of a\n// SessionAsync RPC invocation (or an applicable error).\ntype FutureSessionResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// session result.\nfunc (r FutureSessionResult) Receive() (*btcjson.SessionResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a session result object.\n\tvar session btcjson.SessionResult\n\terr = json.Unmarshal(res, &session)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &session, nil\n}\n\n// SessionAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See Session for the blocking version and more details.\n//\n// NOTE: This is a btcsuite extension.\nfunc (c *Client) SessionAsync() FutureSessionResult {\n\t// Not supported in HTTP POST mode.\n\tif c.config.HTTPPostMode {\n\t\treturn newFutureError(ErrWebsocketsRequired)\n\t}\n\n\tcmd := btcjson.NewSessionCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// Session returns details regarding a websocket client's current connection.\n//\n// This RPC requires the client to be running in websocket mode.\n//\n// NOTE: This is a btcsuite extension.\nfunc (c *Client) Session() (*btcjson.SessionResult, error) {\n\treturn c.SessionAsync().Receive()\n}\n\n// FutureVersionResult is a future promise to deliver the result of a version\n// RPC invocation (or an applicable error).\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\ntype FutureVersionResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the version\n// result.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\nfunc (r FutureVersionResult) Receive() (map[string]btcjson.VersionResult,\n\terror) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a version result object.\n\tvar vr map[string]btcjson.VersionResult\n\terr = json.Unmarshal(res, &vr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn vr, nil\n}\n\n// VersionAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See Version for the blocking version and more details.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\nfunc (c *Client) VersionAsync() FutureVersionResult {\n\tcmd := btcjson.NewVersionCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// Version returns information about the server's JSON-RPC API versions.\n//\n// NOTE: This is a btcsuite extension ported from\n// github.com/decred/dcrrpcclient.\nfunc (c *Client) Version() (map[string]btcjson.VersionResult, error) {\n\treturn c.VersionAsync().Receive()\n}\n"
  },
  {
    "path": "rpcclient/infrastructure.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"bytes\"\n\t\"container/list\"\n\t\"context\"\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/go-socks/socks\"\n\t\"github.com/btcsuite/websocket\"\n)\n\nvar (\n\t// ErrInvalidAuth is an error to describe the condition where the client\n\t// is either unable to authenticate or the specified endpoint is\n\t// incorrect.\n\tErrInvalidAuth = errors.New(\"authentication failure\")\n\n\t// ErrInvalidEndpoint is an error to describe the condition where the\n\t// websocket handshake failed with the specified endpoint.\n\tErrInvalidEndpoint = errors.New(\"the endpoint either does not support \" +\n\t\t\"websockets or does not exist\")\n\n\t// ErrClientNotConnected is an error to describe the condition where a\n\t// websocket client has been created, but the connection was never\n\t// established.  This condition differs from ErrClientDisconnect, which\n\t// represents an established connection that was lost.\n\tErrClientNotConnected = errors.New(\"the client was never connected\")\n\n\t// ErrClientDisconnect is an error to describe the condition where the\n\t// client has been disconnected from the RPC server.  When the\n\t// DisableAutoReconnect option is not set, any outstanding futures\n\t// when a client disconnect occurs will return this error as will\n\t// any new requests.\n\tErrClientDisconnect = errors.New(\"the client has been disconnected\")\n\n\t// ErrClientShutdown is an error to describe the condition where the\n\t// client is either already shutdown, or in the process of shutting\n\t// down.  Any outstanding futures when a client shutdown occurs will\n\t// return this error as will any new requests.\n\tErrClientShutdown = errors.New(\"the client has been shutdown\")\n\n\t// ErrNotWebsocketClient is an error to describe the condition of\n\t// calling a Client method intended for a websocket client when the\n\t// client has been configured to run in HTTP POST mode instead.\n\tErrNotWebsocketClient = errors.New(\"client is not configured for \" +\n\t\t\"websockets\")\n\n\t// ErrClientAlreadyConnected is an error to describe the condition where\n\t// a new client connection cannot be established due to a websocket\n\t// client having already connected to the RPC server.\n\tErrClientAlreadyConnected = errors.New(\"websocket client has already \" +\n\t\t\"connected\")\n\n\t// ErrEmptyBatch is an error to describe that there is nothing to send.\n\tErrEmptyBatch = errors.New(\"batch is empty\")\n)\n\nconst (\n\t// sendBufferSize is the number of elements the websocket send channel\n\t// can queue before blocking.\n\tsendBufferSize = 50\n\n\t// sendPostBufferSize is the number of elements the HTTP POST send\n\t// channel can queue before blocking.\n\tsendPostBufferSize = 100\n\n\t// connectionRetryInterval is the amount of time to wait in between\n\t// retries when automatically reconnecting to an RPC server.\n\tconnectionRetryInterval = time.Second * 5\n\n\t// requestRetryInterval is the initial amount of time to wait in between\n\t// retries when sending HTTP POST requests.\n\trequestRetryInterval = time.Millisecond * 500\n\n\t// defaultHTTPTimeout is the default timeout for an http request, so the\n\t// request does not block indefinitely.\n\tdefaultHTTPTimeout = time.Minute\n)\n\n// jsonRequest holds information about a json request that is used to properly\n// detect, interpret, and deliver a reply to it.\ntype jsonRequest struct {\n\tid             uint64\n\tmethod         string\n\tcmd            interface{}\n\tmarshalledJSON []byte\n\tresponseChan   chan *Response\n}\n\n// Client represents a Bitcoin RPC client which allows easy access to the\n// various RPC methods available on a Bitcoin RPC server.  Each of the wrapper\n// functions handle the details of converting the passed and return types to and\n// from the underlying JSON types which are required for the JSON-RPC\n// invocations\n//\n// The client provides each RPC in both synchronous (blocking) and asynchronous\n// (non-blocking) forms.  The asynchronous forms are based on the concept of\n// futures where they return an instance of a type that promises to deliver the\n// result of the invocation at some future time.  Invoking the Receive method on\n// the returned future will block until the result is available if it's not\n// already.\ntype Client struct {\n\tid uint64 // atomic, so must stay 64-bit aligned\n\n\t// config holds the connection configuration associated with this client.\n\tconfig *ConnConfig\n\n\t// chainParams holds the params for the chain that this client is using,\n\t// and is used for many wallet methods.\n\tchainParams *chaincfg.Params\n\n\t// wsConn is the underlying websocket connection when not in HTTP POST\n\t// mode.\n\twsConn *websocket.Conn\n\n\t// httpClient is the underlying HTTP client to use when running in HTTP\n\t// POST mode.\n\thttpClient *http.Client\n\n\t// backendVersion is the version of the backend the client is currently\n\t// connected to. This should be retrieved through GetVersion.\n\tbackendVersionMu sync.Mutex\n\tbackendVersion   BackendVersion\n\n\t// mtx is a mutex to protect access to connection related fields.\n\tmtx sync.Mutex\n\n\t// disconnected indicated whether or not the server is disconnected.\n\tdisconnected bool\n\n\t// whether or not to batch requests, false unless changed by Batch()\n\tbatch     bool\n\tbatchLock sync.Mutex\n\tbatchList *list.List\n\n\t// retryCount holds the number of times the client has tried to\n\t// reconnect to the RPC server.\n\tretryCount int64\n\n\t// Track command and their response channels by ID.\n\trequestLock sync.Mutex\n\trequestMap  map[uint64]*list.Element\n\trequestList *list.List\n\n\t// Notifications.\n\tntfnHandlers  *NotificationHandlers\n\tntfnStateLock sync.Mutex\n\tntfnState     *notificationState\n\n\t// Networking infrastructure.\n\tsendChan        chan []byte\n\tsendPostChan    chan *jsonRequest\n\tconnEstablished chan struct{}\n\tdisconnect      chan struct{}\n\tshutdown        chan struct{}\n\twg              sync.WaitGroup\n}\n\n// NextID returns the next id to be used when sending a JSON-RPC message.  This\n// ID allows responses to be associated with particular requests per the\n// JSON-RPC specification.  Typically the consumer of the client does not need\n// to call this function, however, if a custom request is being created and used\n// this function should be used to ensure the ID is unique amongst all requests\n// being made.\nfunc (c *Client) NextID() uint64 {\n\treturn atomic.AddUint64(&c.id, 1)\n}\n\n// addRequest associates the passed jsonRequest with its id.  This allows the\n// response from the remote server to be unmarshalled to the appropriate type\n// and sent to the specified channel when it is received.\n//\n// If the client has already begun shutting down, ErrClientShutdown is returned\n// and the request is not added.\n//\n// This function is safe for concurrent access.\nfunc (c *Client) addRequest(jReq *jsonRequest) error {\n\tc.requestLock.Lock()\n\tdefer c.requestLock.Unlock()\n\n\t// A non-blocking read of the shutdown channel with the request lock\n\t// held avoids adding the request to the client's internal data\n\t// structures if the client is in the process of shutting down (and\n\t// has not yet grabbed the request lock), or has finished shutdown\n\t// already (responding to each outstanding request with\n\t// ErrClientShutdown).\n\tselect {\n\tcase <-c.shutdown:\n\t\treturn ErrClientShutdown\n\tdefault:\n\t}\n\n\tif !c.batch {\n\t\telement := c.requestList.PushBack(jReq)\n\t\tc.requestMap[jReq.id] = element\n\t} else {\n\t\tc.batchLock.Lock()\n\t\telement := c.batchList.PushBack(jReq)\n\t\tc.batchLock.Unlock()\n\n\t\tc.requestMap[jReq.id] = element\n\t}\n\treturn nil\n}\n\n// removeRequest returns and removes the jsonRequest which contains the response\n// channel and original method associated with the passed id or nil if there is\n// no association.\n//\n// This function is safe for concurrent access.\nfunc (c *Client) removeRequest(id uint64) *jsonRequest {\n\tc.requestLock.Lock()\n\tdefer c.requestLock.Unlock()\n\n\telement, ok := c.requestMap[id]\n\tif !ok {\n\t\treturn nil\n\t}\n\n\tdelete(c.requestMap, id)\n\n\tvar request *jsonRequest\n\tif c.batch {\n\t\tc.batchLock.Lock()\n\t\trequest = c.batchList.Remove(element).(*jsonRequest)\n\t\tc.batchLock.Unlock()\n\t} else {\n\t\trequest = c.requestList.Remove(element).(*jsonRequest)\n\t}\n\n\treturn request\n}\n\n// removeAllRequests removes all the jsonRequests which contain the response\n// channels for outstanding requests.\n//\n// This function MUST be called with the request lock held.\nfunc (c *Client) removeAllRequests() {\n\tc.requestMap = make(map[uint64]*list.Element)\n\tc.requestList.Init()\n}\n\n// trackRegisteredNtfns examines the passed command to see if it is one of\n// the notification commands and updates the notification state that is used\n// to automatically re-establish registered notifications on reconnects.\nfunc (c *Client) trackRegisteredNtfns(cmd interface{}) {\n\t// Nothing to do if the caller is not interested in notifications.\n\tif c.ntfnHandlers == nil {\n\t\treturn\n\t}\n\n\tc.ntfnStateLock.Lock()\n\tdefer c.ntfnStateLock.Unlock()\n\n\tswitch bcmd := cmd.(type) {\n\tcase *btcjson.NotifyBlocksCmd:\n\t\tc.ntfnState.notifyBlocks = true\n\n\tcase *btcjson.NotifyNewTransactionsCmd:\n\t\tif bcmd.Verbose != nil && *bcmd.Verbose {\n\t\t\tc.ntfnState.notifyNewTxVerbose = true\n\t\t} else {\n\t\t\tc.ntfnState.notifyNewTx = true\n\n\t\t}\n\n\tcase *btcjson.NotifySpentCmd:\n\t\tfor _, op := range bcmd.OutPoints {\n\t\t\tc.ntfnState.notifySpent[op] = struct{}{}\n\t\t}\n\n\tcase *btcjson.NotifyReceivedCmd:\n\t\tfor _, addr := range bcmd.Addresses {\n\t\t\tc.ntfnState.notifyReceived[addr] = struct{}{}\n\t\t}\n\t}\n}\n\n// FutureGetBulkResult waits for the responses promised by the future\n// and returns them in a channel\ntype FutureGetBulkResult chan *Response\n\n// Receive waits for the response promised by the future and returns an map\n// of results by request id\nfunc (r FutureGetBulkResult) Receive() (BulkResult, error) {\n\tm := make(BulkResult)\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar arr []IndividualBulkResult\n\terr = json.Unmarshal(res, &arr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfor _, results := range arr {\n\t\tm[results.Id] = results\n\t}\n\n\treturn m, nil\n}\n\n// IndividualBulkResult represents one result\n// from a bulk json rpc api\ntype IndividualBulkResult struct {\n\tResult interface{}       `json:\"result\"`\n\tError  *btcjson.RPCError `json:\"error\"`\n\tId     uint64            `json:\"id\"`\n}\n\ntype BulkResult = map[uint64]IndividualBulkResult\n\n// inMessage is the first type that an incoming message is unmarshaled\n// into. It supports both requests (for notification support) and\n// responses.  The partially-unmarshaled message is a notification if\n// the embedded ID (from the response) is nil.  Otherwise, it is a\n// response.\ntype inMessage struct {\n\tID *float64 `json:\"id\"`\n\t*rawNotification\n\t*rawResponse\n}\n\n// rawNotification is a partially-unmarshaled JSON-RPC notification.\ntype rawNotification struct {\n\tMethod string            `json:\"method\"`\n\tParams []json.RawMessage `json:\"params\"`\n}\n\n// rawResponse is a partially-unmarshaled JSON-RPC response.  For this\n// to be valid (according to JSON-RPC 1.0 spec), ID may not be nil.\ntype rawResponse struct {\n\tResult json.RawMessage   `json:\"result\"`\n\tError  *btcjson.RPCError `json:\"error\"`\n}\n\n// Response is the raw bytes of a JSON-RPC result, or the error if the response\n// error object was non-null.\ntype Response struct {\n\tresult []byte\n\terr    error\n}\n\n// result checks whether the unmarshaled response contains a non-nil error,\n// returning an unmarshaled btcjson.RPCError (or an unmarshalling error) if so.\n// If the response is not an error, the raw bytes of the request are\n// returned for further unmashaling into specific result types.\nfunc (r rawResponse) result() (result []byte, err error) {\n\tif r.Error != nil {\n\t\treturn nil, r.Error\n\t}\n\treturn r.Result, nil\n}\n\n// handleMessage is the main handler for incoming notifications and responses.\nfunc (c *Client) handleMessage(msg []byte) {\n\t// Attempt to unmarshal the message as either a notification or\n\t// response.\n\tvar in inMessage\n\tin.rawResponse = new(rawResponse)\n\tin.rawNotification = new(rawNotification)\n\terr := json.Unmarshal(msg, &in)\n\tif err != nil {\n\t\tlog.Warnf(\"Remote server sent invalid message: %v\", err)\n\t\treturn\n\t}\n\n\t// JSON-RPC 1.0 notifications are requests with a null id.\n\tif in.ID == nil {\n\t\tntfn := in.rawNotification\n\t\tif ntfn == nil {\n\t\t\tlog.Warn(\"Malformed notification: missing \" +\n\t\t\t\t\"method and parameters\")\n\t\t\treturn\n\t\t}\n\t\tif ntfn.Method == \"\" {\n\t\t\tlog.Warn(\"Malformed notification: missing method\")\n\t\t\treturn\n\t\t}\n\t\t// params are not optional: nil isn't valid (but len == 0 is)\n\t\tif ntfn.Params == nil {\n\t\t\tlog.Warn(\"Malformed notification: missing params\")\n\t\t\treturn\n\t\t}\n\t\t// Deliver the notification.\n\t\tlog.Tracef(\"Received notification [%s]\", in.Method)\n\t\tc.handleNotification(in.rawNotification)\n\t\treturn\n\t}\n\n\t// ensure that in.ID can be converted to an integer without loss of precision\n\tif *in.ID < 0 || *in.ID != math.Trunc(*in.ID) {\n\t\tlog.Warn(\"Malformed response: invalid identifier\")\n\t\treturn\n\t}\n\n\tif in.rawResponse == nil {\n\t\tlog.Warn(\"Malformed response: missing result and error\")\n\t\treturn\n\t}\n\n\tid := uint64(*in.ID)\n\tlog.Tracef(\"Received response for id %d (result %s)\", id, in.Result)\n\trequest := c.removeRequest(id)\n\n\t// Nothing more to do if there is no request associated with this reply.\n\tif request == nil || request.responseChan == nil {\n\t\tlog.Warnf(\"Received unexpected reply: %s (id %d)\", in.Result,\n\t\t\tid)\n\t\treturn\n\t}\n\n\t// Since the command was successful, examine it to see if it's a\n\t// notification, and if is, add it to the notification state so it\n\t// can automatically be re-established on reconnect.\n\tc.trackRegisteredNtfns(request.cmd)\n\n\t// Deliver the response.\n\tresult, err := in.rawResponse.result()\n\trequest.responseChan <- &Response{result: result, err: err}\n}\n\n// shouldLogReadError returns whether or not the passed error, which is expected\n// to have come from reading from the websocket connection in wsInHandler,\n// should be logged.\nfunc (c *Client) shouldLogReadError(err error) bool {\n\t// No logging when the connection is being forcibly disconnected.\n\tselect {\n\tcase <-c.shutdown:\n\t\treturn false\n\tdefault:\n\t}\n\n\t// No logging when the connection has been disconnected.\n\tif err == io.EOF {\n\t\treturn false\n\t}\n\tif opErr, ok := err.(*net.OpError); ok && !opErr.Temporary() {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// wsInHandler handles all incoming messages for the websocket connection\n// associated with the client.  It must be run as a goroutine.\nfunc (c *Client) wsInHandler() {\nout:\n\tfor {\n\t\t// Break out of the loop once the shutdown channel has been\n\t\t// closed.  Use a non-blocking select here so we fall through\n\t\t// otherwise.\n\t\tselect {\n\t\tcase <-c.shutdown:\n\t\t\tbreak out\n\t\tdefault:\n\t\t}\n\n\t\t_, msg, err := c.wsConn.ReadMessage()\n\t\tif err != nil {\n\t\t\t// Log the error if it's not due to disconnecting.\n\t\t\tif c.shouldLogReadError(err) {\n\t\t\t\tlog.Errorf(\"Websocket receive error from \"+\n\t\t\t\t\t\"%s: %v\", c.config.Host, err)\n\t\t\t}\n\t\t\tbreak out\n\t\t}\n\t\tc.handleMessage(msg)\n\t}\n\n\t// Ensure the connection is closed.\n\tc.Disconnect()\n\tc.wg.Done()\n\tlog.Tracef(\"RPC client input handler done for %s\", c.config.Host)\n}\n\n// disconnectChan returns a copy of the current disconnect channel.  The channel\n// is read protected by the client mutex, and is safe to call while the channel\n// is being reassigned during a reconnect.\nfunc (c *Client) disconnectChan() <-chan struct{} {\n\tc.mtx.Lock()\n\tch := c.disconnect\n\tc.mtx.Unlock()\n\treturn ch\n}\n\n// wsOutHandler handles all outgoing messages for the websocket connection.  It\n// uses a buffered channel to serialize output messages while allowing the\n// sender to continue running asynchronously.  It must be run as a goroutine.\nfunc (c *Client) wsOutHandler() {\nout:\n\tfor {\n\t\t// Send any messages ready for send until the client is\n\t\t// disconnected closed.\n\t\tselect {\n\t\tcase msg := <-c.sendChan:\n\t\t\terr := c.wsConn.WriteMessage(websocket.TextMessage, msg)\n\t\t\tif err != nil {\n\t\t\t\tc.Disconnect()\n\t\t\t\tbreak out\n\t\t\t}\n\n\t\tcase <-c.disconnectChan():\n\t\t\tbreak out\n\t\t}\n\t}\n\n\t// Drain any channels before exiting so nothing is left waiting around\n\t// to send.\ncleanup:\n\tfor {\n\t\tselect {\n\t\tcase <-c.sendChan:\n\t\tdefault:\n\t\t\tbreak cleanup\n\t\t}\n\t}\n\tc.wg.Done()\n\tlog.Tracef(\"RPC client output handler done for %s\", c.config.Host)\n}\n\n// sendMessage sends the passed JSON to the connected server using the\n// websocket connection.  It is backed by a buffered channel, so it will not\n// block until the send channel is full.\nfunc (c *Client) sendMessage(marshalledJSON []byte) {\n\t// Don't send the message if disconnected.\n\tselect {\n\tcase c.sendChan <- marshalledJSON:\n\tcase <-c.disconnectChan():\n\t\treturn\n\t}\n}\n\n// reregisterNtfns creates and sends commands needed to re-establish the current\n// notification state associated with the client.  It should only be called on\n// on reconnect by the resendRequests function.\nfunc (c *Client) reregisterNtfns() error {\n\t// Nothing to do if the caller is not interested in notifications.\n\tif c.ntfnHandlers == nil {\n\t\treturn nil\n\t}\n\n\t// In order to avoid holding the lock on the notification state for the\n\t// entire time of the potentially long running RPCs issued below, make a\n\t// copy of it and work from that.\n\t//\n\t// Also, other commands will be running concurrently which could modify\n\t// the notification state (while not under the lock of course) which\n\t// also register it with the remote RPC server, so this prevents double\n\t// registrations.\n\tc.ntfnStateLock.Lock()\n\tstateCopy := c.ntfnState.Copy()\n\tc.ntfnStateLock.Unlock()\n\n\t// Reregister notifyblocks if needed.\n\tif stateCopy.notifyBlocks {\n\t\tlog.Debugf(\"Reregistering [notifyblocks]\")\n\t\tif err := c.NotifyBlocks(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Reregister notifynewtransactions if needed.\n\tif stateCopy.notifyNewTx || stateCopy.notifyNewTxVerbose {\n\t\tlog.Debugf(\"Reregistering [notifynewtransactions] (verbose=%v)\",\n\t\t\tstateCopy.notifyNewTxVerbose)\n\t\terr := c.NotifyNewTransactions(stateCopy.notifyNewTxVerbose)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Reregister the combination of all previously registered notifyspent\n\t// outpoints in one command if needed.\n\tnslen := len(stateCopy.notifySpent)\n\tif nslen > 0 {\n\t\toutpoints := make([]btcjson.OutPoint, 0, nslen)\n\t\tfor op := range stateCopy.notifySpent {\n\t\t\toutpoints = append(outpoints, op)\n\t\t}\n\t\tlog.Debugf(\"Reregistering [notifyspent] outpoints: %v\", outpoints)\n\t\tif err := c.notifySpentInternal(outpoints).Receive(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Reregister the combination of all previously registered\n\t// notifyreceived addresses in one command if needed.\n\tnrlen := len(stateCopy.notifyReceived)\n\tif nrlen > 0 {\n\t\taddresses := make([]string, 0, nrlen)\n\t\tfor addr := range stateCopy.notifyReceived {\n\t\t\taddresses = append(addresses, addr)\n\t\t}\n\t\tlog.Debugf(\"Reregistering [notifyreceived] addresses: %v\", addresses)\n\t\tif err := c.notifyReceivedInternal(addresses).Receive(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// ignoreResends is a set of all methods for requests that are \"long running\"\n// are not be reissued by the client on reconnect.\nvar ignoreResends = map[string]struct{}{\n\t\"rescan\": {},\n}\n\n// resendRequests resends any requests that had not completed when the client\n// disconnected.  It is intended to be called once the client has reconnected as\n// a separate goroutine.\nfunc (c *Client) resendRequests() {\n\t// Set the notification state back up.  If anything goes wrong,\n\t// disconnect the client.\n\tif err := c.reregisterNtfns(); err != nil {\n\t\tlog.Warnf(\"Unable to re-establish notification state: %v\", err)\n\t\tc.Disconnect()\n\t\treturn\n\t}\n\n\t// Since it's possible to block on send and more requests might be\n\t// added by the caller while resending, make a copy of all of the\n\t// requests that need to be resent now and work from the copy.  This\n\t// also allows the lock to be released quickly.\n\tc.requestLock.Lock()\n\tresendReqs := make([]*jsonRequest, 0, c.requestList.Len())\n\tvar nextElem *list.Element\n\tfor e := c.requestList.Front(); e != nil; e = nextElem {\n\t\tnextElem = e.Next()\n\n\t\tjReq := e.Value.(*jsonRequest)\n\t\tif _, ok := ignoreResends[jReq.method]; ok {\n\t\t\t// If a request is not sent on reconnect, remove it\n\t\t\t// from the request structures, since no reply is\n\t\t\t// expected.\n\t\t\tdelete(c.requestMap, jReq.id)\n\t\t\tc.requestList.Remove(e)\n\t\t} else {\n\t\t\tresendReqs = append(resendReqs, jReq)\n\t\t}\n\t}\n\tc.requestLock.Unlock()\n\n\tfor _, jReq := range resendReqs {\n\t\t// Stop resending commands if the client disconnected again\n\t\t// since the next reconnect will handle them.\n\t\tif c.Disconnected() {\n\t\t\treturn\n\t\t}\n\n\t\tlog.Tracef(\"Sending command [%s] with id %d\", jReq.method,\n\t\t\tjReq.id)\n\t\tc.sendMessage(jReq.marshalledJSON)\n\t}\n}\n\n// wsReconnectHandler listens for client disconnects and automatically tries\n// to reconnect with retry interval that scales based on the number of retries.\n// It also resends any commands that had not completed when the client\n// disconnected so the disconnect/reconnect process is largely transparent to\n// the caller.  This function is not run when the DisableAutoReconnect config\n// options is set.\n//\n// This function must be run as a goroutine.\nfunc (c *Client) wsReconnectHandler() {\nout:\n\tfor {\n\t\tselect {\n\t\tcase <-c.disconnect:\n\t\t\t// On disconnect, fallthrough to reestablish the\n\t\t\t// connection.\n\n\t\tcase <-c.shutdown:\n\t\t\tbreak out\n\t\t}\n\n\treconnect:\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-c.shutdown:\n\t\t\t\tbreak out\n\t\t\tdefault:\n\t\t\t}\n\n\t\t\twsConn, err := dial(c.config)\n\t\t\tif err != nil {\n\t\t\t\tc.retryCount++\n\t\t\t\tlog.Infof(\"Failed to connect to %s: %v\",\n\t\t\t\t\tc.config.Host, err)\n\n\t\t\t\t// Scale the retry interval by the number of\n\t\t\t\t// retries so there is a backoff up to a max\n\t\t\t\t// of 1 minute.\n\t\t\t\tscaledInterval := connectionRetryInterval.Nanoseconds() * c.retryCount\n\t\t\t\tscaledDuration := time.Duration(scaledInterval)\n\t\t\t\tif scaledDuration > time.Minute {\n\t\t\t\t\tscaledDuration = time.Minute\n\t\t\t\t}\n\t\t\t\tlog.Infof(\"Retrying connection to %s in \"+\n\t\t\t\t\t\"%s\", c.config.Host, scaledDuration)\n\t\t\t\ttime.Sleep(scaledDuration)\n\t\t\t\tcontinue reconnect\n\t\t\t}\n\n\t\t\tlog.Infof(\"Reestablished connection to RPC server %s\",\n\t\t\t\tc.config.Host)\n\n\t\t\t// Reset the version in case the backend was\n\t\t\t// disconnected due to an upgrade.\n\t\t\tc.backendVersionMu.Lock()\n\t\t\tc.backendVersion = nil\n\t\t\tc.backendVersionMu.Unlock()\n\n\t\t\t// Reset the connection state and signal the reconnect\n\t\t\t// has happened.\n\t\t\tc.mtx.Lock()\n\t\t\tc.wsConn = wsConn\n\t\t\tc.retryCount = 0\n\n\t\t\tc.disconnect = make(chan struct{})\n\t\t\tc.disconnected = false\n\t\t\tc.mtx.Unlock()\n\n\t\t\t// Start processing input and output for the\n\t\t\t// new connection.\n\t\t\tc.start()\n\n\t\t\t// Reissue pending requests in another goroutine since\n\t\t\t// the send can block.\n\t\t\tgo c.resendRequests()\n\n\t\t\t// Break out of the reconnect loop back to wait for\n\t\t\t// disconnect again.\n\t\t\tbreak reconnect\n\t\t}\n\t}\n\tc.wg.Done()\n\tlog.Tracef(\"RPC client reconnect handler done for %s\", c.config.Host)\n}\n\n// handleSendPostMessage handles performing the passed HTTP request, reading the\n// result, unmarshalling it, and delivering the unmarshalled result to the\n// provided response channel.\nfunc (c *Client) handleSendPostMessage(jReq *jsonRequest) {\n\tvar (\n\t\tlastErr      error\n\t\tbackoff      time.Duration\n\t\thttpResponse *http.Response\n\t)\n\n\thttpURL, err := c.config.httpURL()\n\tif err != nil {\n\t\tjReq.responseChan <- &Response{\n\t\t\terr: fmt.Errorf(\"failed to parse address %v\", err),\n\t\t}\n\t\treturn\n\t}\n\n\ttries := 10\n\tfor i := 0; i < tries; i++ {\n\t\tvar httpReq *http.Request\n\n\t\tbodyReader := bytes.NewReader(jReq.marshalledJSON)\n\t\thttpReq, err = http.NewRequest(\"POST\", httpURL, bodyReader)\n\t\tif err != nil {\n\t\t\tjReq.responseChan <- &Response{result: nil, err: err}\n\t\t\treturn\n\t\t}\n\t\thttpReq.Close = true\n\t\thttpReq.Header.Set(\"Content-Type\", \"application/json\")\n\t\tfor key, value := range c.config.ExtraHeaders {\n\t\t\thttpReq.Header.Set(key, value)\n\t\t}\n\n\t\t// Configure basic access authorization.\n\t\tuser, pass, err := c.config.getAuth()\n\t\tif err != nil {\n\t\t\tjReq.responseChan <- &Response{result: nil, err: err}\n\t\t\treturn\n\t\t}\n\t\thttpReq.SetBasicAuth(user, pass)\n\n\t\thttpResponse, err = c.httpClient.Do(httpReq)\n\n\t\t// Quit the retry loop on success or if we can't retry anymore.\n\t\tif err == nil || i == tries-1 {\n\t\t\tbreak\n\t\t}\n\n\t\t// Save the last error for the case where we backoff further,\n\t\t// retry and get an invalid response but no error. If this\n\t\t// happens the saved last error will be used to enrich the error\n\t\t// message that we pass back to the caller.\n\t\tlastErr = err\n\n\t\t// Backoff sleep otherwise.\n\t\tbackoff = requestRetryInterval * time.Duration(i+1)\n\t\tif backoff > time.Minute {\n\t\t\tbackoff = time.Minute\n\t\t}\n\t\tlog.Debugf(\"Failed command [%s] with id %d attempt %d.\"+\n\t\t\t\" Retrying in %v... \\n\", jReq.method, jReq.id,\n\t\t\ti, backoff)\n\n\t\tselect {\n\t\tcase <-time.After(backoff):\n\n\t\tcase <-c.shutdown:\n\t\t\treturn\n\t\t}\n\t}\n\tif err != nil {\n\t\tjReq.responseChan <- &Response{err: err}\n\t\treturn\n\t}\n\n\t// We still want to return an error if for any reason the response\n\t// remains empty.\n\tif httpResponse == nil {\n\t\tjReq.responseChan <- &Response{\n\t\t\terr: fmt.Errorf(\"invalid http POST response (nil), \"+\n\t\t\t\t\"method: %s, id: %d, last error=%v\",\n\t\t\t\tjReq.method, jReq.id, lastErr),\n\t\t}\n\t\treturn\n\t}\n\n\t// Read the raw bytes and close the response.\n\trespBytes, err := io.ReadAll(httpResponse.Body)\n\thttpResponse.Body.Close()\n\tif err != nil {\n\t\terr = fmt.Errorf(\"error reading json reply: %v\", err)\n\t\tjReq.responseChan <- &Response{err: err}\n\t\treturn\n\t}\n\n\t// Try to unmarshal the response as a regular JSON-RPC response.\n\tvar resp rawResponse\n\tvar batchResponse json.RawMessage\n\tif c.batch {\n\t\terr = json.Unmarshal(respBytes, &batchResponse)\n\t} else {\n\t\terr = json.Unmarshal(respBytes, &resp)\n\t}\n\tif err != nil {\n\t\t// When the response itself isn't a valid JSON-RPC response\n\t\t// return an error which includes the HTTP status code and raw\n\t\t// response bytes.\n\t\terr = fmt.Errorf(\"status code: %d, response: %q\",\n\t\t\thttpResponse.StatusCode, string(respBytes))\n\t\tjReq.responseChan <- &Response{err: err}\n\t\treturn\n\t}\n\tvar res []byte\n\tif c.batch {\n\t\t// errors must be dealt with downstream since a whole request cannot\n\t\t// \"error out\" other than through the status code error handled above\n\t\tres, err = batchResponse, nil\n\t} else {\n\t\tres, err = resp.result()\n\t}\n\tjReq.responseChan <- &Response{result: res, err: err}\n}\n\n// sendPostHandler handles all outgoing messages when the client is running\n// in HTTP POST mode.  It uses a buffered channel to serialize output messages\n// while allowing the sender to continue running asynchronously.  It must be run\n// as a goroutine.\nfunc (c *Client) sendPostHandler() {\nout:\n\tfor {\n\t\t// Send any messages ready for send until the shutdown channel\n\t\t// is closed.\n\t\tselect {\n\t\tcase jReq := <-c.sendPostChan:\n\t\t\tc.handleSendPostMessage(jReq)\n\n\t\tcase <-c.shutdown:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\t// Drain any wait channels before exiting so nothing is left waiting\n\t// around to send.\ncleanup:\n\tfor {\n\t\tselect {\n\t\tcase jReq := <-c.sendPostChan:\n\t\t\tjReq.responseChan <- &Response{\n\t\t\t\tresult: nil,\n\t\t\t\terr:    ErrClientShutdown,\n\t\t\t}\n\n\t\tdefault:\n\t\t\tbreak cleanup\n\t\t}\n\t}\n\tc.wg.Done()\n\tlog.Tracef(\"RPC client send handler done for %s\", c.config.Host)\n}\n\n// sendPostRequest sends the passed HTTP request to the RPC server using the\n// HTTP client associated with the client.  It is backed by a buffered channel,\n// so it will not block until the send channel is full.\nfunc (c *Client) sendPostRequest(jReq *jsonRequest) {\n\t// Don't send the message if shutting down.\n\tselect {\n\tcase <-c.shutdown:\n\t\tjReq.responseChan <- &Response{result: nil, err: ErrClientShutdown}\n\tdefault:\n\t}\n\n\tselect {\n\tcase c.sendPostChan <- jReq:\n\t\tlog.Tracef(\"Sent command [%s] with id %d\", jReq.method, jReq.id)\n\n\tcase <-c.shutdown:\n\t\treturn\n\t}\n}\n\n// newFutureError returns a new future result channel that already has the\n// passed error waitin on the channel with the reply set to nil.  This is useful\n// to easily return errors from the various Async functions.\nfunc newFutureError(err error) chan *Response {\n\tresponseChan := make(chan *Response, 1)\n\tresponseChan <- &Response{err: err}\n\treturn responseChan\n}\n\n// Expose newFutureError for developer usage when creating custom commands.\nfunc NewFutureError(err error) chan *Response {\n\treturn newFutureError(err)\n}\n\n// ReceiveFuture receives from the passed futureResult channel to extract a\n// reply or any errors.  The examined errors include an error in the\n// futureResult and the error in the reply from the server.  This will block\n// until the result is available on the passed channel.\nfunc ReceiveFuture(f chan *Response) ([]byte, error) {\n\t// Wait for a response on the returned channel.\n\tr := <-f\n\treturn r.result, r.err\n}\n\n// sendRequest sends the passed json request to the associated server using the\n// provided response channel for the reply.  It handles both websocket and HTTP\n// POST mode depending on the configuration of the client.\nfunc (c *Client) sendRequest(jReq *jsonRequest) {\n\t// Choose which marshal and send function to use depending on whether\n\t// the client running in HTTP POST mode or not.  When running in HTTP\n\t// POST mode, the command is issued via an HTTP client.  Otherwise,\n\t// the command is issued via the asynchronous websocket channels.\n\tif c.config.HTTPPostMode {\n\t\tif c.batch {\n\t\t\tif err := c.addRequest(jReq); err != nil {\n\t\t\t\tlog.Warn(err)\n\t\t\t}\n\t\t} else {\n\t\t\tc.sendPostRequest(jReq)\n\t\t}\n\t\treturn\n\t}\n\n\t// Check whether the websocket connection has never been established,\n\t// in which case the handler goroutines are not running.\n\tselect {\n\tcase <-c.connEstablished:\n\tdefault:\n\t\tjReq.responseChan <- &Response{err: ErrClientNotConnected}\n\t\treturn\n\t}\n\n\t// Add the request to the internal tracking map so the response from the\n\t// remote server can be properly detected and routed to the response\n\t// channel.  Then send the marshalled request via the websocket\n\t// connection.\n\tif err := c.addRequest(jReq); err != nil {\n\t\tjReq.responseChan <- &Response{err: err}\n\t\treturn\n\t}\n\tlog.Tracef(\"Sending command [%s] with id %d\", jReq.method, jReq.id)\n\tc.sendMessage(jReq.marshalledJSON)\n}\n\n// SendCmd sends the passed command to the associated server and returns a\n// response channel on which the reply will be delivered at some point in the\n// future.  It handles both websocket and HTTP POST mode depending on the\n// configuration of the client.\nfunc (c *Client) SendCmd(cmd interface{}) chan *Response {\n\trpcVersion := btcjson.RpcVersion1\n\tif c.batch {\n\t\trpcVersion = btcjson.RpcVersion2\n\t}\n\t// Get the method associated with the command.\n\tmethod, err := btcjson.CmdMethod(cmd)\n\tif err != nil {\n\t\treturn newFutureError(err)\n\t}\n\n\t// Marshal the command.\n\tid := c.NextID()\n\tmarshalledJSON, err := btcjson.MarshalCmd(rpcVersion, id, cmd)\n\tif err != nil {\n\t\treturn newFutureError(err)\n\t}\n\n\t// Generate the request and send it along with a channel to respond on.\n\tresponseChan := make(chan *Response, 1)\n\tjReq := &jsonRequest{\n\t\tid:             id,\n\t\tmethod:         method,\n\t\tcmd:            cmd,\n\t\tmarshalledJSON: marshalledJSON,\n\t\tresponseChan:   responseChan,\n\t}\n\n\tc.sendRequest(jReq)\n\n\treturn responseChan\n}\n\n// sendCmdAndWait sends the passed command to the associated server, waits\n// for the reply, and returns the result from it.  It will return the error\n// field in the reply if there is one.\nfunc (c *Client) sendCmdAndWait(cmd interface{}) (interface{}, error) {\n\t// Marshal the command to JSON-RPC, send it to the connected server, and\n\t// wait for a response on the returned channel.\n\treturn ReceiveFuture(c.SendCmd(cmd))\n}\n\n// Disconnected returns whether or not the server is disconnected.  If a\n// websocket client was created but never connected, this also returns false.\nfunc (c *Client) Disconnected() bool {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tselect {\n\tcase <-c.connEstablished:\n\t\treturn c.disconnected\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// doDisconnect disconnects the websocket associated with the client if it\n// hasn't already been disconnected.  It will return false if the disconnect is\n// not needed or the client is running in HTTP POST mode.\n//\n// This function is safe for concurrent access.\nfunc (c *Client) doDisconnect() bool {\n\tif c.config.HTTPPostMode {\n\t\treturn false\n\t}\n\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\t// Nothing to do if already disconnected.\n\tif c.disconnected {\n\t\treturn false\n\t}\n\n\tlog.Tracef(\"Disconnecting RPC client %s\", c.config.Host)\n\tclose(c.disconnect)\n\tif c.wsConn != nil {\n\t\tc.wsConn.Close()\n\t}\n\tc.disconnected = true\n\treturn true\n}\n\n// doShutdown closes the shutdown channel and logs the shutdown unless shutdown\n// is already in progress.  It will return false if the shutdown is not needed.\n//\n// This function is safe for concurrent access.\nfunc (c *Client) doShutdown() bool {\n\t// Ignore the shutdown request if the client is already in the process\n\t// of shutting down or already shutdown.\n\tselect {\n\tcase <-c.shutdown:\n\t\treturn false\n\tdefault:\n\t}\n\n\tlog.Tracef(\"Shutting down RPC client %s\", c.config.Host)\n\tclose(c.shutdown)\n\treturn true\n}\n\n// Disconnect disconnects the current websocket associated with the client.  The\n// connection will automatically be re-established unless the client was\n// created with the DisableAutoReconnect flag.\n//\n// This function has no effect when the client is running in HTTP POST mode.\nfunc (c *Client) Disconnect() {\n\t// Nothing to do if already disconnected or running in HTTP POST mode.\n\tif !c.doDisconnect() {\n\t\treturn\n\t}\n\n\tc.requestLock.Lock()\n\tdefer c.requestLock.Unlock()\n\n\t// When operating without auto reconnect, send errors to any pending\n\t// requests and shutdown the client.\n\tif c.config.DisableAutoReconnect {\n\t\tfor e := c.requestList.Front(); e != nil; e = e.Next() {\n\t\t\treq := e.Value.(*jsonRequest)\n\t\t\treq.responseChan <- &Response{\n\t\t\t\tresult: nil,\n\t\t\t\terr:    ErrClientDisconnect,\n\t\t\t}\n\t\t}\n\t\tc.removeAllRequests()\n\t\tc.doShutdown()\n\t}\n}\n\n// Shutdown shuts down the client by disconnecting any connections associated\n// with the client and, when automatic reconnect is enabled, preventing future\n// attempts to reconnect.  It also stops all goroutines.\nfunc (c *Client) Shutdown() {\n\t// Do the shutdown under the request lock to prevent clients from\n\t// adding new requests while the client shutdown process is initiated.\n\tc.requestLock.Lock()\n\tdefer c.requestLock.Unlock()\n\n\t// Ignore the shutdown request if the client is already in the process\n\t// of shutting down or already shutdown.\n\tif !c.doShutdown() {\n\t\treturn\n\t}\n\n\t// Send the ErrClientShutdown error to any pending requests.\n\tfor e := c.requestList.Front(); e != nil; e = e.Next() {\n\t\treq := e.Value.(*jsonRequest)\n\t\treq.responseChan <- &Response{\n\t\t\tresult: nil,\n\t\t\terr:    ErrClientShutdown,\n\t\t}\n\t}\n\tc.removeAllRequests()\n\n\t// Disconnect the client if needed.\n\tc.doDisconnect()\n}\n\n// start begins processing input and output messages.\nfunc (c *Client) start() {\n\tlog.Tracef(\"Starting RPC client %s\", c.config.Host)\n\n\t// Start the I/O processing handlers depending on whether the client is\n\t// in HTTP POST mode or the default websocket mode.\n\tif c.config.HTTPPostMode {\n\t\tc.wg.Add(1)\n\t\tgo c.sendPostHandler()\n\t} else {\n\t\tc.wg.Add(3)\n\t\tgo func() {\n\t\t\tif c.ntfnHandlers != nil {\n\t\t\t\tif c.ntfnHandlers.OnClientConnected != nil {\n\t\t\t\t\tc.ntfnHandlers.OnClientConnected()\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.wg.Done()\n\t\t}()\n\t\tgo c.wsInHandler()\n\t\tgo c.wsOutHandler()\n\t}\n}\n\n// WaitForShutdown blocks until the client goroutines are stopped and the\n// connection is closed.\nfunc (c *Client) WaitForShutdown() {\n\tc.wg.Wait()\n}\n\n// ConnConfig describes the connection configuration parameters for the client.\n// This\ntype ConnConfig struct {\n\t// Host is the IP address and port of the RPC server you want to connect\n\t// to.\n\tHost string\n\n\t// Endpoint is the websocket endpoint on the RPC server.  This is\n\t// typically \"ws\".\n\tEndpoint string\n\n\t// User is the username to use to authenticate to the RPC server.\n\tUser string\n\n\t// Pass is the passphrase to use to authenticate to the RPC server.\n\tPass string\n\n\t// CookiePath is the path to a cookie file containing the username and\n\t// passphrase to use to authenticate to the RPC server.  It is used\n\t// instead of User and Pass if non-empty.\n\tCookiePath string\n\n\tcookieLastCheckTime time.Time\n\tcookieLastModTime   time.Time\n\tcookieLastUser      string\n\tcookieLastPass      string\n\tcookieLastErr       error\n\n\t// Params is the string representing the network that the server\n\t// is running. If there is no parameter set in the config, then\n\t// mainnet will be used by default.\n\tParams string\n\n\t// DisableTLS specifies whether transport layer security should be\n\t// disabled.  It is recommended to always use TLS if the RPC server\n\t// supports it as otherwise your username and password is sent across\n\t// the wire in cleartext.\n\tDisableTLS bool\n\n\t// Certificates are the bytes for a PEM-encoded certificate chain used\n\t// for the TLS connection.  It has no effect if the DisableTLS parameter\n\t// is true.\n\tCertificates []byte\n\n\t// Proxy specifies to connect through a SOCKS 5 proxy server.  It may\n\t// be an empty string if a proxy is not required.\n\tProxy string\n\n\t// ProxyUser is an optional username to use for the proxy server if it\n\t// requires authentication.  It has no effect if the Proxy parameter\n\t// is not set.\n\tProxyUser string\n\n\t// ProxyPass is an optional password to use for the proxy server if it\n\t// requires authentication.  It has no effect if the Proxy parameter\n\t// is not set.\n\tProxyPass string\n\n\t// DisableAutoReconnect specifies the client should not automatically\n\t// try to reconnect to the server when it has been disconnected.\n\tDisableAutoReconnect bool\n\n\t// DisableConnectOnNew specifies that a websocket client connection\n\t// should not be tried when creating the client with New.  Instead, the\n\t// client is created and returned unconnected, and Connect must be\n\t// called manually.\n\tDisableConnectOnNew bool\n\n\t// HTTPPostMode instructs the client to run using multiple independent\n\t// connections issuing HTTP POST requests instead of using the default\n\t// of websockets.  Websockets are generally preferred as some of the\n\t// features of the client such notifications only work with websockets,\n\t// however, not all servers support the websocket extensions, so this\n\t// flag can be set to true to use basic HTTP POST requests instead.\n\tHTTPPostMode bool\n\n\t// ExtraHeaders specifies the extra headers when perform request. It's\n\t// useful when RPC provider need customized headers.\n\tExtraHeaders map[string]string\n\n\t// EnableBCInfoHacks is an option provided to enable compatibility hacks\n\t// when connecting to blockchain.info RPC server\n\tEnableBCInfoHacks bool\n}\n\n// getAuth returns the username and passphrase that will actually be used for\n// this connection.  This will be the result of checking the cookie if a cookie\n// path is configured; if not, it will be the user-configured username and\n// passphrase.\nfunc (config *ConnConfig) getAuth() (username, passphrase string, err error) {\n\t// Try username+passphrase auth first.\n\tif config.Pass != \"\" {\n\t\treturn config.User, config.Pass, nil\n\t}\n\n\t// If no username or passphrase is set, try cookie auth.\n\treturn config.retrieveCookie()\n}\n\n// retrieveCookie returns the cookie username and passphrase.\nfunc (config *ConnConfig) retrieveCookie() (username, passphrase string, err error) {\n\tif !config.cookieLastCheckTime.IsZero() && time.Now().Before(config.cookieLastCheckTime.Add(30*time.Second)) {\n\t\treturn config.cookieLastUser, config.cookieLastPass, config.cookieLastErr\n\t}\n\n\tconfig.cookieLastCheckTime = time.Now()\n\n\tst, err := os.Stat(config.CookiePath)\n\tif err != nil {\n\t\tconfig.cookieLastErr = err\n\t\treturn config.cookieLastUser, config.cookieLastPass, config.cookieLastErr\n\t}\n\n\tmodTime := st.ModTime()\n\tif !modTime.Equal(config.cookieLastModTime) {\n\t\tconfig.cookieLastModTime = modTime\n\t\tconfig.cookieLastUser, config.cookieLastPass, config.cookieLastErr = readCookieFile(config.CookiePath)\n\t}\n\n\treturn config.cookieLastUser, config.cookieLastPass, config.cookieLastErr\n}\n\n// newHTTPClient returns a new http client that is configured according to the\n// proxy and TLS settings in the associated connection configuration.\nfunc newHTTPClient(config *ConnConfig) (*http.Client, error) {\n\t// Set proxy function if there is a proxy configured.\n\tvar proxyFunc func(*http.Request) (*url.URL, error)\n\tif config.Proxy != \"\" {\n\t\tproxyURL, err := url.Parse(config.Proxy)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tproxyFunc = http.ProxyURL(proxyURL)\n\t}\n\n\t// Configure TLS if needed.\n\tvar tlsConfig *tls.Config\n\tif !config.DisableTLS {\n\t\tif len(config.Certificates) > 0 {\n\t\t\tpool := x509.NewCertPool()\n\t\t\tpool.AppendCertsFromPEM(config.Certificates)\n\t\t\ttlsConfig = &tls.Config{\n\t\t\t\tRootCAs: pool,\n\t\t\t}\n\t\t}\n\t}\n\n\tparsedDialAddr, err := ParseAddressString(config.Host)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclient := http.Client{\n\t\tTransport: &http.Transport{\n\t\t\tProxy:           proxyFunc,\n\t\t\tTLSClientConfig: tlsConfig,\n\t\t\tDialContext: func(ctx context.Context, _,\n\t\t\t\t_ string) (net.Conn, error) {\n\t\t\t\td := &net.Dialer{}\n\t\t\t\treturn d.DialContext(\n\t\t\t\t\tctx,\n\t\t\t\t\tparsedDialAddr.Network(),\n\t\t\t\t\tparsedDialAddr.String(),\n\t\t\t\t)\n\t\t\t},\n\t\t},\n\t\tTimeout: defaultHTTPTimeout,\n\t}\n\n\treturn &client, nil\n}\n\n// httpURL returns the URL to use for HTTP POST requests.\nfunc (config *ConnConfig) httpURL() (string, error) {\n\tprotocol := \"http\"\n\tif !config.DisableTLS {\n\t\tprotocol = \"https\"\n\t}\n\n\tparsedAddr, err := ParseAddressString(config.Host)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"error parsing host '%v': %v\",\n\t\t\tconfig.Host, err)\n\t}\n\n\tvar httpURL string\n\tswitch parsedAddr.Network() {\n\tcase \"unix\", \"unixpacket\":\n\t\t// Using a placeholder URL because a non-empty URL is required.\n\t\t// The Unix domain socket is specified in the DialContext.\n\t\thttpURL = protocol + \"://unix\"\n\tdefault:\n\t\thttpURL = protocol + \"://\" + config.Host\n\t}\n\n\treturn httpURL, nil\n}\n\n// dial opens a websocket connection using the passed connection configuration\n// details.\nfunc dial(config *ConnConfig) (*websocket.Conn, error) {\n\t// Setup TLS if not disabled.\n\tvar tlsConfig *tls.Config\n\tvar scheme = \"ws\"\n\tif !config.DisableTLS {\n\t\ttlsConfig = &tls.Config{\n\t\t\tMinVersion: tls.VersionTLS12,\n\t\t}\n\t\tif len(config.Certificates) > 0 {\n\t\t\tpool := x509.NewCertPool()\n\t\t\tpool.AppendCertsFromPEM(config.Certificates)\n\t\t\ttlsConfig.RootCAs = pool\n\t\t}\n\t\tscheme = \"wss\"\n\t}\n\n\t// Create a websocket dialer that will be used to make the connection.\n\t// It is modified by the proxy setting below as needed.\n\tdialer := websocket.Dialer{TLSClientConfig: tlsConfig}\n\n\t// Setup the proxy if one is configured.\n\tif config.Proxy != \"\" {\n\t\tproxy := &socks.Proxy{\n\t\t\tAddr:     config.Proxy,\n\t\t\tUsername: config.ProxyUser,\n\t\t\tPassword: config.ProxyPass,\n\t\t}\n\t\tdialer.NetDial = proxy.Dial\n\t}\n\n\t// The RPC server requires basic authorization, so create a custom\n\t// request header with the Authorization header set.\n\tuser, pass, err := config.getAuth()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogin := user + \":\" + pass\n\tauth := \"Basic \" + base64.StdEncoding.EncodeToString([]byte(login))\n\trequestHeader := make(http.Header)\n\trequestHeader.Add(\"Authorization\", auth)\n\tfor key, value := range config.ExtraHeaders {\n\t\trequestHeader.Add(key, value)\n\t}\n\n\t// Dial the connection.\n\turl := fmt.Sprintf(\"%s://%s/%s\", scheme, config.Host, config.Endpoint)\n\twsConn, resp, err := dialer.Dial(url, requestHeader)\n\tif err != nil {\n\t\tif err != websocket.ErrBadHandshake || resp == nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Detect HTTP authentication error status codes.\n\t\tif resp.StatusCode == http.StatusUnauthorized ||\n\t\t\tresp.StatusCode == http.StatusForbidden {\n\t\t\treturn nil, ErrInvalidAuth\n\t\t}\n\n\t\t// The connection was authenticated and the status response was\n\t\t// ok, but the websocket handshake still failed, so the endpoint\n\t\t// is invalid in some way.\n\t\tif resp.StatusCode == http.StatusOK {\n\t\t\treturn nil, ErrInvalidEndpoint\n\t\t}\n\n\t\t// Return the status text from the server if none of the special\n\t\t// cases above apply.\n\t\treturn nil, errors.New(resp.Status)\n\t}\n\treturn wsConn, nil\n}\n\n// New creates a new RPC client based on the provided connection configuration\n// details.  The notification handlers parameter may be nil if you are not\n// interested in receiving notifications and will be ignored if the\n// configuration is set to run in HTTP POST mode.\nfunc New(config *ConnConfig, ntfnHandlers *NotificationHandlers) (*Client, error) {\n\t// Either open a websocket connection or create an HTTP client depending\n\t// on the HTTP POST mode.  Also, set the notification handlers to nil\n\t// when running in HTTP POST mode.\n\tvar wsConn *websocket.Conn\n\tvar httpClient *http.Client\n\tconnEstablished := make(chan struct{})\n\tvar start bool\n\tif config.HTTPPostMode {\n\t\tntfnHandlers = nil\n\t\tstart = true\n\n\t\tvar err error\n\t\thttpClient, err = newHTTPClient(config)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\tif !config.DisableConnectOnNew {\n\t\t\tvar err error\n\t\t\twsConn, err = dial(config)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tstart = true\n\t\t}\n\t}\n\n\tclient := &Client{\n\t\tconfig:          config,\n\t\twsConn:          wsConn,\n\t\thttpClient:      httpClient,\n\t\trequestMap:      make(map[uint64]*list.Element),\n\t\trequestList:     list.New(),\n\t\tbatch:           false,\n\t\tbatchList:       list.New(),\n\t\tntfnHandlers:    ntfnHandlers,\n\t\tntfnState:       newNotificationState(),\n\t\tsendChan:        make(chan []byte, sendBufferSize),\n\t\tsendPostChan:    make(chan *jsonRequest, sendPostBufferSize),\n\t\tconnEstablished: connEstablished,\n\t\tdisconnect:      make(chan struct{}),\n\t\tshutdown:        make(chan struct{}),\n\t}\n\n\t// Default network is mainnet, no parameters are necessary but if mainnet\n\t// is specified it will be the param\n\tswitch config.Params {\n\tcase \"\":\n\t\tfallthrough\n\tcase chaincfg.MainNetParams.Name:\n\t\tclient.chainParams = &chaincfg.MainNetParams\n\tcase chaincfg.TestNet3Params.Name:\n\t\tclient.chainParams = &chaincfg.TestNet3Params\n\tcase chaincfg.TestNet4Params.Name:\n\t\tclient.chainParams = &chaincfg.TestNet4Params\n\tcase chaincfg.RegressionNetParams.Name:\n\t\tclient.chainParams = &chaincfg.RegressionNetParams\n\tcase chaincfg.SigNetParams.Name:\n\t\tclient.chainParams = &chaincfg.SigNetParams\n\tcase chaincfg.SimNetParams.Name:\n\t\tclient.chainParams = &chaincfg.SimNetParams\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"rpcclient.New: Unknown chain %s\", config.Params)\n\t}\n\n\tif start {\n\t\tlog.Infof(\"Established connection to RPC server %s\",\n\t\t\tconfig.Host)\n\t\tclose(connEstablished)\n\t\tclient.start()\n\t\tif !client.config.HTTPPostMode && !client.config.DisableAutoReconnect {\n\t\t\tclient.wg.Add(1)\n\t\t\tgo client.wsReconnectHandler()\n\t\t}\n\t}\n\n\treturn client, nil\n}\n\n// Batch is a factory that creates a client able to interact with the server using\n// JSON-RPC 2.0. The client is capable of accepting an arbitrary number of requests\n// and having the server process the all at the same time. It's compatible with both\n// btcd and bitcoind\nfunc NewBatch(config *ConnConfig) (*Client, error) {\n\tif !config.HTTPPostMode {\n\t\treturn nil, errors.New(\"http post mode is required to use batch client\")\n\t}\n\t// notification parameter is nil since notifications are not supported in POST mode.\n\tclient, err := New(config, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclient.batch = true //copy the client with changed batch setting\n\tclient.start()\n\treturn client, nil\n}\n\n// Connect establishes the initial websocket connection.  This is necessary when\n// a client was created after setting the DisableConnectOnNew field of the\n// Config struct.\n//\n// Up to tries number of connections (each after an increasing backoff) will\n// be tried if the connection can not be established.  The special value of 0\n// indicates an unlimited number of connection attempts.\n//\n// This method will error if the client is not configured for websockets, if the\n// connection has already been established, or if none of the connection\n// attempts were successful.\nfunc (c *Client) Connect(tries int) error {\n\tc.mtx.Lock()\n\tdefer c.mtx.Unlock()\n\n\tif c.config.HTTPPostMode {\n\t\treturn ErrNotWebsocketClient\n\t}\n\tif c.wsConn != nil {\n\t\treturn ErrClientAlreadyConnected\n\t}\n\n\t// Begin connection attempts.  Increase the backoff after each failed\n\t// attempt, up to a maximum of one minute.\n\tvar err error\n\tvar backoff time.Duration\n\tfor i := 0; tries == 0 || i < tries; i++ {\n\t\tvar wsConn *websocket.Conn\n\t\twsConn, err = dial(c.config)\n\t\tif err != nil {\n\t\t\tbackoff = connectionRetryInterval * time.Duration(i+1)\n\t\t\tif backoff > time.Minute {\n\t\t\t\tbackoff = time.Minute\n\t\t\t}\n\t\t\ttime.Sleep(backoff)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Connection was established.  Set the websocket connection\n\t\t// member of the client and start the goroutines necessary\n\t\t// to run the client.\n\t\tlog.Infof(\"Established connection to RPC server %s\",\n\t\t\tc.config.Host)\n\t\tc.wsConn = wsConn\n\t\tclose(c.connEstablished)\n\t\tc.start()\n\t\tif !c.config.DisableAutoReconnect {\n\t\t\tc.wg.Add(1)\n\t\t\tgo c.wsReconnectHandler()\n\t\t}\n\t\treturn nil\n\t}\n\n\t// All connection attempts failed, so return the last error.\n\treturn err\n}\n\n// BackendVersion retrieves the version of the backend the client is currently\n// connected to.\nfunc (c *Client) BackendVersion() (BackendVersion, error) {\n\tc.backendVersionMu.Lock()\n\tdefer c.backendVersionMu.Unlock()\n\n\tif c.backendVersion != nil {\n\t\treturn c.backendVersion, nil\n\t}\n\n\t// We'll start by calling GetInfo. This method doesn't exist for\n\t// bitcoind nodes as of v0.16.0, so we'll assume the client is connected\n\t// to a btcd backend if it does exist.\n\tinfo, err := c.GetInfo()\n\n\tswitch err := err.(type) {\n\t// Parse the btcd version and cache it.\n\tcase nil:\n\t\tlog.Debugf(\"Detected btcd version: %v\", info.Version)\n\t\tversion := parseBtcdVersion(info.Version)\n\t\tc.backendVersion = version\n\t\treturn c.backendVersion, nil\n\n\t// Inspect the RPC error to ensure the method was not found, otherwise\n\t// we actually ran into an error.\n\tcase *btcjson.RPCError:\n\t\tif err.Code != btcjson.ErrRPCMethodNotFound.Code {\n\t\t\treturn nil, fmt.Errorf(\"unable to detect btcd version: \"+\n\t\t\t\t\"%v\", err)\n\t\t}\n\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unable to detect btcd version: %v\", err)\n\t}\n\n\t// Since the GetInfo method was not found, we assume the client is\n\t// connected to a bitcoind backend, which exposes its version through\n\t// GetNetworkInfo.\n\tnetworkInfo, err := c.GetNetworkInfo()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to detect bitcoind version: %v\",\n\t\t\terr)\n\t}\n\n\t// Parse the bitcoind version and cache it.\n\tlog.Debugf(\"Detected bitcoind version: %v\", networkInfo.SubVersion)\n\tversion := parseBitcoindVersion(networkInfo.SubVersion)\n\tc.backendVersion = &version\n\n\treturn c.backendVersion, nil\n}\n\nfunc (c *Client) sendAsync() (FutureGetBulkResult, error) {\n\tc.batchLock.Lock()\n\tdefer c.batchLock.Unlock()\n\n\t// If batchList is empty, there's nothing to send.\n\tif c.batchList.Len() == 0 {\n\t\treturn nil, ErrEmptyBatch\n\t}\n\n\t// convert the array of marshalled json requests to a single request we can send\n\tresponseChan := make(chan *Response, 1)\n\tmarshalledRequest := []byte(\"[\")\n\tfor iter := c.batchList.Front(); iter != nil; iter = iter.Next() {\n\t\trequest := iter.Value.(*jsonRequest)\n\t\tmarshalledRequest = append(marshalledRequest, request.marshalledJSON...)\n\t\tmarshalledRequest = append(marshalledRequest, []byte(\",\")...)\n\t}\n\tif len(marshalledRequest) > 0 {\n\t\t// removes the trailing comma to process the request individually\n\t\tmarshalledRequest = marshalledRequest[:len(marshalledRequest)-1]\n\t}\n\tmarshalledRequest = append(marshalledRequest, []byte(\"]\")...)\n\trequest := jsonRequest{\n\t\tid:             c.NextID(),\n\t\tmethod:         \"\",\n\t\tcmd:            nil,\n\t\tmarshalledJSON: marshalledRequest,\n\t\tresponseChan:   responseChan,\n\t}\n\tc.sendPostRequest(&request)\n\treturn responseChan, nil\n}\n\n// Marshall's bulk requests and sends to the server\n// creates a response channel to receive the response\nfunc (c *Client) Send() error {\n\tfuture, err := c.sendAsync()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tbatchResp, err := future.Receive()\n\tif err != nil {\n\t\t// Clear batchlist in case of an error.\n\n\t\tc.batchLock.Lock()\n\t\tc.batchList = list.New()\n\t\tc.batchLock.Unlock()\n\n\t\treturn err\n\t}\n\n\t// Iterate each response and send it to the corresponding request.\n\tfor id, resp := range batchResp {\n\t\t// Perform a GC on batchList and requestMap before moving\n\t\t// forward.\n\t\trequest := c.removeRequest(id)\n\t\tif request == nil {\n\t\t\t// Perhaps another goroutine has already processed this request.\n\t\t\tcontinue\n\t\t}\n\n\t\t// If there's an error, we log it and continue to the next\n\t\t// request.\n\t\tfullResult, err := json.Marshal(resp.Result)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Unable to marshal result: %v for req=%v\",\n\t\t\t\terr, request.id)\n\n\t\t\tcontinue\n\t\t}\n\n\t\t// If there's a response error, we send it back the request.\n\t\tvar requestError error\n\t\tif resp.Error != nil {\n\t\t\trequestError = resp.Error\n\t\t}\n\n\t\tresult := Response{\n\t\t\tresult: fullResult,\n\t\t\terr:    requestError,\n\t\t}\n\t\trequest.responseChan <- &result\n\t}\n\n\treturn nil\n}\n\n// cutPrefix returns s without the provided leading prefix string\n// and reports whether it found the prefix.\n// If s doesn't start with prefix, cutPrefix returns s, false.\n// If prefix is the empty string, cutPrefix returns s, true.\n// Copied from go1.20 version.\nfunc cutPrefix(s, prefix string) (after string, found bool) {\n\tif !strings.HasPrefix(s, prefix) {\n\t\treturn s, false\n\t}\n\treturn s[len(prefix):], true\n}\n\n// ParseAddressString converts an address in string format to a net.Addr that is\n// compatible with btcd. UDP is not supported because btcd needs reliable\n// connections.\nfunc ParseAddressString(strAddress string) (net.Addr, error) {\n\t// Addresses can either be in unix://address, unixpacket://address URL\n\t// format, or just address:port host format for tcp.\n\tif after, ok := cutPrefix(strAddress, \"unix://\"); ok {\n\t\treturn net.ResolveUnixAddr(\"unix\", after)\n\t}\n\tif after, ok := cutPrefix(strAddress, \"unixpacket://\"); ok {\n\t\treturn net.ResolveUnixAddr(\"unixpacket\", after)\n\t}\n\n\tif strings.Contains(strAddress, \"://\") {\n\t\t// Not supporting :// anywhere in the host or path.\n\t\treturn nil, fmt.Errorf(\"unsupported protocol in address: %s\",\n\t\t\tstrAddress)\n\t}\n\n\t// Parse it as a dummy URL to get the host and port.\n\tu, err := url.Parse(\"dummy://\" + strAddress)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn net.ResolveTCPAddr(\"tcp\", verifyPort(u.Host))\n}\n\n// verifyPort makes sure that an address string has both a host and a port.\n// If the address is just a port, then we'll assume that the user is using the\n// shortcut to specify a localhost:port address.\nfunc verifyPort(address string) string {\n\thost, port, err := net.SplitHostPort(address)\n\tif err != nil {\n\t\t// If the address itself is just an integer, then we'll assume\n\t\t// that we're mapping this directly to a localhost:port pair.\n\t\t// This ensures we maintain the legacy behavior.\n\t\tif _, err := strconv.Atoi(address); err == nil {\n\t\t\treturn net.JoinHostPort(\"localhost\", address)\n\t\t}\n\n\t\t// Otherwise, we'll assume that the address just failed to\n\t\t// attach its own port, so we'll leave it as is. In the\n\t\t// case of IPv6 addresses, if the host is already surrounded by\n\t\t// brackets, then we'll avoid using the JoinHostPort function,\n\t\t// since it will always add a pair of brackets.\n\t\tif strings.HasPrefix(address, \"[\") {\n\t\t\treturn address\n\t\t}\n\t\treturn net.JoinHostPort(address, \"\")\n\t}\n\n\t// In the case that both the host and port are empty, we'll use an empty\n\t// port.\n\tif host == \"\" && port == \"\" {\n\t\treturn \":\"\n\t}\n\n\treturn address\n}\n"
  },
  {
    "path": "rpcclient/infrastructure_test.go",
    "content": "package rpcclient\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestParseAddressString checks different variation of supported and\n// unsupported addresses.\nfunc TestParseAddressString(t *testing.T) {\n\tt.Parallel()\n\n\t// Using localhost only to avoid network calls.\n\ttestCases := []struct {\n\t\tname          string\n\t\taddressString string\n\t\texpNetwork    string\n\t\texpAddress    string\n\t\texpErrStr     string\n\t}{\n\t\t{\n\t\t\tname:          \"localhost\",\n\t\t\taddressString: \"localhost\",\n\t\t\texpNetwork:    \"tcp\",\n\t\t\texpAddress:    \"127.0.0.1:0\",\n\t\t},\n\t\t{\n\t\t\tname:          \"localhost ip\",\n\t\t\taddressString: \"127.0.0.1\",\n\t\t\texpNetwork:    \"tcp\",\n\t\t\texpAddress:    \"127.0.0.1:0\",\n\t\t},\n\t\t{\n\t\t\tname:          \"localhost ipv6\",\n\t\t\taddressString: \"::1\",\n\t\t\texpNetwork:    \"tcp\",\n\t\t\texpAddress:    \"[::1]:0\",\n\t\t},\n\t\t{\n\t\t\tname:          \"localhost and port\",\n\t\t\taddressString: \"localhost:80\",\n\t\t\texpNetwork:    \"tcp\",\n\t\t\texpAddress:    \"127.0.0.1:80\",\n\t\t},\n\t\t{\n\t\t\tname:          \"localhost ipv6 and port\",\n\t\t\taddressString: \"[::1]:80\",\n\t\t\texpNetwork:    \"tcp\",\n\t\t\texpAddress:    \"[::1]:80\",\n\t\t},\n\t\t{\n\t\t\tname:          \"colon and port\",\n\t\t\taddressString: \":80\",\n\t\t\texpNetwork:    \"tcp\",\n\t\t\texpAddress:    \":80\",\n\t\t},\n\t\t{\n\t\t\tname:          \"colon only\",\n\t\t\taddressString: \":\",\n\t\t\texpNetwork:    \"tcp\",\n\t\t\texpAddress:    \":0\",\n\t\t},\n\t\t{\n\t\t\tname:          \"localhost and path\",\n\t\t\taddressString: \"localhost/path\",\n\t\t\texpNetwork:    \"tcp\",\n\t\t\texpAddress:    \"127.0.0.1:0\",\n\t\t},\n\t\t{\n\t\t\tname:          \"localhost port and path\",\n\t\t\taddressString: \"localhost:80/path\",\n\t\t\texpNetwork:    \"tcp\",\n\t\t\texpAddress:    \"127.0.0.1:80\",\n\t\t},\n\t\t{\n\t\t\tname:          \"unix prefix\",\n\t\t\taddressString: \"unix://the/rest/of/the/path\",\n\t\t\texpNetwork:    \"unix\",\n\t\t\texpAddress:    \"the/rest/of/the/path\",\n\t\t},\n\t\t{\n\t\t\tname:          \"unix prefix\",\n\t\t\taddressString: \"unixpacket://the/rest/of/the/path\",\n\t\t\texpNetwork:    \"unixpacket\",\n\t\t\texpAddress:    \"the/rest/of/the/path\",\n\t\t},\n\t\t{\n\t\t\tname:          \"error http prefix\",\n\t\t\taddressString: \"http://localhost:1010\",\n\t\t\texpErrStr:     \"unsupported protocol in address\",\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\taddr, err := ParseAddressString(tc.addressString)\n\t\t\tif tc.expErrStr != \"\" {\n\t\t\t\trequire.Error(t, err)\n\t\t\t\trequire.Contains(t, err.Error(), tc.expErrStr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\trequire.NoError(t, err)\n\t\t\trequire.Equal(t, tc.expNetwork, addr.Network())\n\t\t\trequire.Equal(t, tc.expAddress, addr.String())\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "rpcclient/log.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"github.com/btcsuite/btclog\"\n)\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until UseLogger is called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n\n// LogClosure is a closure that can be printed with %v to be used to\n// generate expensive-to-create data for a detailed log level and avoid doing\n// the work if the data isn't printed.\ntype logClosure func() string\n\n// String invokes the log closure and returns the results string.\nfunc (c logClosure) String() string {\n\treturn c()\n}\n\n// newLogClosure returns a new closure over the passed function which allows\n// it to be used as a parameter in a logging function that is only invoked when\n// the logging level is such that the message will actually be logged.\nfunc newLogClosure(c func() string) logClosure {\n\treturn logClosure(c)\n}\n"
  },
  {
    "path": "rpcclient/mining.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// FutureGenerateResult is a future promise to deliver the result of a\n// GenerateAsync RPC invocation (or an applicable error).\ntype FutureGenerateResult chan *Response\n\n// Receive waits for the Response promised by the future and returns a list of\n// block hashes generated by the call.\nfunc (r FutureGenerateResult) Receive() ([]*chainhash.Hash, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a list of strings.\n\tvar result []string\n\terr = json.Unmarshal(res, &result)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Convert each block hash to a chainhash.Hash and store a pointer to\n\t// each.\n\tconvertedResult := make([]*chainhash.Hash, len(result))\n\tfor i, hashString := range result {\n\t\tconvertedResult[i], err = chainhash.NewHashFromStr(hashString)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn convertedResult, nil\n}\n\n// GenerateAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See Generate for the blocking version and more details.\nfunc (c *Client) GenerateAsync(numBlocks uint32) FutureGenerateResult {\n\tcmd := btcjson.NewGenerateCmd(numBlocks)\n\treturn c.SendCmd(cmd)\n}\n\n// Generate generates numBlocks blocks and returns their hashes.\nfunc (c *Client) Generate(numBlocks uint32) ([]*chainhash.Hash, error) {\n\treturn c.GenerateAsync(numBlocks).Receive()\n}\n\n// FutureGenerateToAddressResult is a future promise to deliver the result of a\n// GenerateToAddressResult RPC invocation (or an applicable error).\ntype FutureGenerateToAddressResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the hashes of\n// of the generated blocks.\nfunc (f FutureGenerateToAddressResult) Receive() ([]*chainhash.Hash, error) {\n\tres, err := ReceiveFuture(f)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a list of strings.\n\tvar result []string\n\terr = json.Unmarshal(res, &result)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Convert each block hash to a chainhash.Hash and store a pointer to\n\t// each.\n\tconvertedResult := make([]*chainhash.Hash, len(result))\n\tfor i, hashString := range result {\n\t\tconvertedResult[i], err = chainhash.NewHashFromStr(hashString)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn convertedResult, nil\n}\n\n// GenerateToAddressAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GenerateToAddress for the blocking version and more details.\nfunc (c *Client) GenerateToAddressAsync(numBlocks int64, address btcutil.Address, maxTries *int64) FutureGenerateToAddressResult {\n\tcmd := btcjson.NewGenerateToAddressCmd(numBlocks, address.EncodeAddress(), maxTries)\n\treturn c.SendCmd(cmd)\n}\n\n// GenerateToAddress generates numBlocks blocks to the given address and returns their hashes.\nfunc (c *Client) GenerateToAddress(numBlocks int64, address btcutil.Address, maxTries *int64) ([]*chainhash.Hash, error) {\n\treturn c.GenerateToAddressAsync(numBlocks, address, maxTries).Receive()\n}\n\n// FutureGetGenerateResult is a future promise to deliver the result of a\n// GetGenerateAsync RPC invocation (or an applicable error).\ntype FutureGetGenerateResult chan *Response\n\n// Receive waits for the Response promised by the future and returns true if the\n// server is set to mine, otherwise false.\nfunc (r FutureGetGenerateResult) Receive() (bool, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Unmarshal result as a boolean.\n\tvar result bool\n\terr = json.Unmarshal(res, &result)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn result, nil\n}\n\n// GetGenerateAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetGenerate for the blocking version and more details.\nfunc (c *Client) GetGenerateAsync() FutureGetGenerateResult {\n\tcmd := btcjson.NewGetGenerateCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetGenerate returns true if the server is set to mine, otherwise false.\nfunc (c *Client) GetGenerate() (bool, error) {\n\treturn c.GetGenerateAsync().Receive()\n}\n\n// FutureSetGenerateResult is a future promise to deliver the result of a\n// SetGenerateAsync RPC invocation (or an applicable error).\ntype FutureSetGenerateResult chan *Response\n\n// Receive waits for the Response promised by the future and returns an error if\n// any occurred when setting the server to generate coins (mine) or not.\nfunc (r FutureSetGenerateResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// SetGenerateAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See SetGenerate for the blocking version and more details.\nfunc (c *Client) SetGenerateAsync(enable bool, numCPUs int) FutureSetGenerateResult {\n\tcmd := btcjson.NewSetGenerateCmd(enable, &numCPUs)\n\treturn c.SendCmd(cmd)\n}\n\n// SetGenerate sets the server to generate coins (mine) or not.\nfunc (c *Client) SetGenerate(enable bool, numCPUs int) error {\n\treturn c.SetGenerateAsync(enable, numCPUs).Receive()\n}\n\n// FutureGetHashesPerSecResult is a future promise to deliver the result of a\n// GetHashesPerSecAsync RPC invocation (or an applicable error).\ntype FutureGetHashesPerSecResult chan *Response\n\n// Receive waits for the Response promised by the future and returns a recent\n// hashes per second performance measurement while generating coins (mining).\n// Zero is returned if the server is not mining.\nfunc (r FutureGetHashesPerSecResult) Receive() (int64, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\t// Unmarshal result as an int64.\n\tvar result int64\n\terr = json.Unmarshal(res, &result)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn result, nil\n}\n\n// GetHashesPerSecAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetHashesPerSec for the blocking version and more details.\nfunc (c *Client) GetHashesPerSecAsync() FutureGetHashesPerSecResult {\n\tcmd := btcjson.NewGetHashesPerSecCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetHashesPerSec returns a recent hashes per second performance measurement\n// while generating coins (mining).  Zero is returned if the server is not\n// mining.\nfunc (c *Client) GetHashesPerSec() (int64, error) {\n\treturn c.GetHashesPerSecAsync().Receive()\n}\n\n// FutureGetMiningInfoResult is a future promise to deliver the result of a\n// GetMiningInfoAsync RPC invocation (or an applicable error).\ntype FutureGetMiningInfoResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the mining\n// information.\nfunc (r FutureGetMiningInfoResult) Receive() (*btcjson.GetMiningInfoResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a getmininginfo result object.\n\tvar infoResult btcjson.GetMiningInfoResult\n\terr = json.Unmarshal(res, &infoResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &infoResult, nil\n}\n\n// GetMiningInfoAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetMiningInfo for the blocking version and more details.\nfunc (c *Client) GetMiningInfoAsync() FutureGetMiningInfoResult {\n\tcmd := btcjson.NewGetMiningInfoCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetMiningInfo returns mining information.\nfunc (c *Client) GetMiningInfo() (*btcjson.GetMiningInfoResult, error) {\n\treturn c.GetMiningInfoAsync().Receive()\n}\n\n// FutureGetNetworkHashPS is a future promise to deliver the result of a\n// GetNetworkHashPSAsync RPC invocation (or an applicable error).\ntype FutureGetNetworkHashPS chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// estimated network hashes per second for the block heights provided by the\n// parameters.\nfunc (r FutureGetNetworkHashPS) Receive() (float64, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\t// Unmarshal result as an float64.\n\tvar result float64\n\terr = json.Unmarshal(res, &result)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn result, nil\n}\n\n// GetNetworkHashPSAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetNetworkHashPS for the blocking version and more details.\nfunc (c *Client) GetNetworkHashPSAsync() FutureGetNetworkHashPS {\n\tcmd := btcjson.NewGetNetworkHashPSCmd(nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// GetNetworkHashPS returns the estimated network hashes per second using the\n// default number of blocks and the most recent block height.\n//\n// See GetNetworkHashPS2 to override the number of blocks to use and\n// GetNetworkHashPS3 to override the height at which to calculate the estimate.\nfunc (c *Client) GetNetworkHashPS() (float64, error) {\n\treturn c.GetNetworkHashPSAsync().Receive()\n}\n\n// GetNetworkHashPS2Async returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetNetworkHashPS2 for the blocking version and more details.\nfunc (c *Client) GetNetworkHashPS2Async(blocks int) FutureGetNetworkHashPS {\n\tcmd := btcjson.NewGetNetworkHashPSCmd(&blocks, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// GetNetworkHashPS2 returns the estimated network hashes per second for the\n// specified previous number of blocks working backwards from the most recent\n// block height.  The blocks parameter can also be -1 in which case the number\n// of blocks since the last difficulty change will be used.\n//\n// See GetNetworkHashPS to use defaults and GetNetworkHashPS3 to override the\n// height at which to calculate the estimate.\nfunc (c *Client) GetNetworkHashPS2(blocks int) (float64, error) {\n\treturn c.GetNetworkHashPS2Async(blocks).Receive()\n}\n\n// GetNetworkHashPS3Async returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetNetworkHashPS3 for the blocking version and more details.\nfunc (c *Client) GetNetworkHashPS3Async(blocks, height int) FutureGetNetworkHashPS {\n\tcmd := btcjson.NewGetNetworkHashPSCmd(&blocks, &height)\n\treturn c.SendCmd(cmd)\n}\n\n// GetNetworkHashPS3 returns the estimated network hashes per second for the\n// specified previous number of blocks working backwards from the specified\n// block height.  The blocks parameter can also be -1 in which case the number\n// of blocks since the last difficulty change will be used.\n//\n// See GetNetworkHashPS and GetNetworkHashPS2 to use defaults.\nfunc (c *Client) GetNetworkHashPS3(blocks, height int) (float64, error) {\n\treturn c.GetNetworkHashPS3Async(blocks, height).Receive()\n}\n\n// FutureGetWork is a future promise to deliver the result of a\n// GetWorkAsync RPC invocation (or an applicable error).\ntype FutureGetWork chan *Response\n\n// Receive waits for the Response promised by the future and returns the hash\n// data to work on.\nfunc (r FutureGetWork) Receive() (*btcjson.GetWorkResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a getwork result object.\n\tvar result btcjson.GetWorkResult\n\terr = json.Unmarshal(res, &result)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &result, nil\n}\n\n// GetWorkAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetWork for the blocking version and more details.\nfunc (c *Client) GetWorkAsync() FutureGetWork {\n\tcmd := btcjson.NewGetWorkCmd(nil)\n\treturn c.SendCmd(cmd)\n}\n\n// GetWork returns hash data to work on.\n//\n// See GetWorkSubmit to submit the found solution.\nfunc (c *Client) GetWork() (*btcjson.GetWorkResult, error) {\n\treturn c.GetWorkAsync().Receive()\n}\n\n// FutureGetWorkSubmit is a future promise to deliver the result of a\n// GetWorkSubmitAsync RPC invocation (or an applicable error).\ntype FutureGetWorkSubmit chan *Response\n\n// Receive waits for the Response promised by the future and returns whether\n// or not the submitted block header was accepted.\nfunc (r FutureGetWorkSubmit) Receive() (bool, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Unmarshal result as a boolean.\n\tvar accepted bool\n\terr = json.Unmarshal(res, &accepted)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn accepted, nil\n}\n\n// GetWorkSubmitAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetWorkSubmit for the blocking version and more details.\nfunc (c *Client) GetWorkSubmitAsync(data string) FutureGetWorkSubmit {\n\tcmd := btcjson.NewGetWorkCmd(&data)\n\treturn c.SendCmd(cmd)\n}\n\n// GetWorkSubmit submits a block header which is a solution to previously\n// requested data and returns whether or not the solution was accepted.\n//\n// See GetWork to request data to work on.\nfunc (c *Client) GetWorkSubmit(data string) (bool, error) {\n\treturn c.GetWorkSubmitAsync(data).Receive()\n}\n\n// FutureSubmitBlockResult is a future promise to deliver the result of a\n// SubmitBlockAsync RPC invocation (or an applicable error).\ntype FutureSubmitBlockResult chan *Response\n\n// Receive waits for the Response promised by the future and returns an error if\n// any occurred when submitting the block.\nfunc (r FutureSubmitBlockResult) Receive() error {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif string(res) != \"null\" {\n\t\tvar result string\n\t\terr = json.Unmarshal(res, &result)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn errors.New(result)\n\t}\n\n\treturn nil\n\n}\n\n// SubmitBlockAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See SubmitBlock for the blocking version and more details.\nfunc (c *Client) SubmitBlockAsync(block *btcutil.Block, options *btcjson.SubmitBlockOptions) FutureSubmitBlockResult {\n\tblockHex := \"\"\n\tif block != nil {\n\t\tblockBytes, err := block.Bytes()\n\t\tif err != nil {\n\t\t\treturn newFutureError(err)\n\t\t}\n\n\t\tblockHex = hex.EncodeToString(blockBytes)\n\t}\n\n\tcmd := btcjson.NewSubmitBlockCmd(blockHex, options)\n\treturn c.SendCmd(cmd)\n}\n\n// SubmitBlock attempts to submit a new block into the bitcoin network.\nfunc (c *Client) SubmitBlock(block *btcutil.Block, options *btcjson.SubmitBlockOptions) error {\n\treturn c.SubmitBlockAsync(block, options).Receive()\n}\n\n// FutureGetBlockTemplateResponse is a future promise to deliver the result of a\n// GetBlockTemplateAsync RPC invocation (or an applicable error).\ntype FutureGetBlockTemplateResponse chan *Response\n\n// Receive waits for the Response promised by the future and returns an error if\n// any occurred when retrieving the block template.\nfunc (r FutureGetBlockTemplateResponse) Receive() (*btcjson.GetBlockTemplateResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a getwork result object.\n\tvar result btcjson.GetBlockTemplateResult\n\terr = json.Unmarshal(res, &result)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &result, nil\n}\n\n// GetBlockTemplateAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetBlockTemplate for the blocking version and more details.\nfunc (c *Client) GetBlockTemplateAsync(req *btcjson.TemplateRequest) FutureGetBlockTemplateResponse {\n\tcmd := btcjson.NewGetBlockTemplateCmd(req)\n\treturn c.SendCmd(cmd)\n}\n\n// GetBlockTemplate returns a new block template for mining.\nfunc (c *Client) GetBlockTemplate(req *btcjson.TemplateRequest) (*btcjson.GetBlockTemplateResult, error) {\n\treturn c.GetBlockTemplateAsync(req).Receive()\n}\n"
  },
  {
    "path": "rpcclient/net.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// AddNodeCommand enumerates the available commands that the AddNode function\n// accepts.\ntype AddNodeCommand string\n\n// Constants used to indicate the command for the AddNode function.\nconst (\n\t// ANAdd indicates the specified host should be added as a persistent\n\t// peer.\n\tANAdd AddNodeCommand = \"add\"\n\n\t// ANRemove indicates the specified peer should be removed.\n\tANRemove AddNodeCommand = \"remove\"\n\n\t// ANOneTry indicates the specified host should try to connect once,\n\t// but it should not be made persistent.\n\tANOneTry AddNodeCommand = \"onetry\"\n)\n\n// String returns the AddNodeCommand in human-readable form.\nfunc (cmd AddNodeCommand) String() string {\n\treturn string(cmd)\n}\n\n// FutureAddNodeResult is a future promise to deliver the result of an\n// AddNodeAsync RPC invocation (or an applicable error).\ntype FutureAddNodeResult chan *Response\n\n// Receive waits for the Response promised by the future and returns an error if\n// any occurred when performing the specified command.\nfunc (r FutureAddNodeResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// AddNodeAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See AddNode for the blocking version and more details.\nfunc (c *Client) AddNodeAsync(host string, command AddNodeCommand) FutureAddNodeResult {\n\tcmd := btcjson.NewAddNodeCmd(host, btcjson.AddNodeSubCmd(command))\n\treturn c.SendCmd(cmd)\n}\n\n// AddNode attempts to perform the passed command on the passed persistent peer.\n// For example, it can be used to add or a remove a persistent peer, or to do\n// a one time connection to a peer.\n//\n// It may not be used to remove non-persistent peers.\nfunc (c *Client) AddNode(host string, command AddNodeCommand) error {\n\treturn c.AddNodeAsync(host, command).Receive()\n}\n\n// FutureNodeResult is a future promise to deliver the result of a NodeAsync\n// RPC invocation (or an applicable error).\ntype FutureNodeResult chan *Response\n\n// Receive waits for the Response promised by the future and returns an error if\n// any occurred when performing the specified command.\nfunc (r FutureNodeResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// NodeAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See Node for the blocking version and more details.\nfunc (c *Client) NodeAsync(command btcjson.NodeSubCmd, host string,\n\tconnectSubCmd *string) FutureNodeResult {\n\tcmd := btcjson.NewNodeCmd(command, host, connectSubCmd)\n\treturn c.SendCmd(cmd)\n}\n\n// Node attempts to perform the passed node command on the host.\n// For example, it can be used to add or a remove a persistent peer, or to do\n// connect or diconnect a non-persistent one.\n//\n// The connectSubCmd should be set either \"perm\" or \"temp\", depending on\n// whether we are targeting a persistent or non-persistent peer. Passing nil\n// will cause the default value to be used, which currently is \"temp\".\nfunc (c *Client) Node(command btcjson.NodeSubCmd, host string,\n\tconnectSubCmd *string) error {\n\treturn c.NodeAsync(command, host, connectSubCmd).Receive()\n}\n\n// FutureGetAddedNodeInfoResult is a future promise to deliver the result of a\n// GetAddedNodeInfoAsync RPC invocation (or an applicable error).\ntype FutureGetAddedNodeInfoResult chan *Response\n\n// Receive waits for the Response promised by the future and returns information\n// about manually added (persistent) peers.\nfunc (r FutureGetAddedNodeInfoResult) Receive() ([]btcjson.GetAddedNodeInfoResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal as an array of getaddednodeinfo result objects.\n\tvar nodeInfo []btcjson.GetAddedNodeInfoResult\n\terr = json.Unmarshal(res, &nodeInfo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn nodeInfo, nil\n}\n\n// GetAddedNodeInfoAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetAddedNodeInfo for the blocking version and more details.\nfunc (c *Client) GetAddedNodeInfoAsync(peer string) FutureGetAddedNodeInfoResult {\n\tcmd := btcjson.NewGetAddedNodeInfoCmd(true, &peer)\n\treturn c.SendCmd(cmd)\n}\n\n// GetAddedNodeInfo returns information about manually added (persistent) peers.\n//\n// See GetAddedNodeInfoNoDNS to retrieve only a list of the added (persistent)\n// peers.\nfunc (c *Client) GetAddedNodeInfo(peer string) ([]btcjson.GetAddedNodeInfoResult, error) {\n\treturn c.GetAddedNodeInfoAsync(peer).Receive()\n}\n\n// FutureGetAddedNodeInfoNoDNSResult is a future promise to deliver the result\n// of a GetAddedNodeInfoNoDNSAsync RPC invocation (or an applicable error).\ntype FutureGetAddedNodeInfoNoDNSResult chan *Response\n\n// Receive waits for the Response promised by the future and returns a list of\n// manually added (persistent) peers.\nfunc (r FutureGetAddedNodeInfoNoDNSResult) Receive() ([]string, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as an array of strings.\n\tvar nodes []string\n\terr = json.Unmarshal(res, &nodes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn nodes, nil\n}\n\n// GetAddedNodeInfoNoDNSAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetAddedNodeInfoNoDNS for the blocking version and more details.\nfunc (c *Client) GetAddedNodeInfoNoDNSAsync(peer string) FutureGetAddedNodeInfoNoDNSResult {\n\tcmd := btcjson.NewGetAddedNodeInfoCmd(false, &peer)\n\treturn c.SendCmd(cmd)\n}\n\n// GetAddedNodeInfoNoDNS returns a list of manually added (persistent) peers.\n// This works by setting the dns flag to false in the underlying RPC.\n//\n// See GetAddedNodeInfo to obtain more information about each added (persistent)\n// peer.\nfunc (c *Client) GetAddedNodeInfoNoDNS(peer string) ([]string, error) {\n\treturn c.GetAddedNodeInfoNoDNSAsync(peer).Receive()\n}\n\n// FutureGetConnectionCountResult is a future promise to deliver the result\n// of a GetConnectionCountAsync RPC invocation (or an applicable error).\ntype FutureGetConnectionCountResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the number\n// of active connections to other peers.\nfunc (r FutureGetConnectionCountResult) Receive() (int64, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Unmarshal result as an int64.\n\tvar count int64\n\terr = json.Unmarshal(res, &count)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn count, nil\n}\n\n// GetConnectionCountAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetConnectionCount for the blocking version and more details.\nfunc (c *Client) GetConnectionCountAsync() FutureGetConnectionCountResult {\n\tcmd := btcjson.NewGetConnectionCountCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetConnectionCount returns the number of active connections to other peers.\nfunc (c *Client) GetConnectionCount() (int64, error) {\n\treturn c.GetConnectionCountAsync().Receive()\n}\n\n// FuturePingResult is a future promise to deliver the result of a PingAsync RPC\n// invocation (or an applicable error).\ntype FuturePingResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of queueing a ping to be sent to each connected peer.\nfunc (r FuturePingResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// PingAsync returns an instance of a type that can be used to get the result of\n// the RPC at some future time by invoking the Receive function on the returned\n// instance.\n//\n// See Ping for the blocking version and more details.\nfunc (c *Client) PingAsync() FuturePingResult {\n\tcmd := btcjson.NewPingCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// Ping queues a ping to be sent to each connected peer.\n//\n// Use the GetPeerInfo function and examine the PingTime and PingWait fields to\n// access the ping times.\nfunc (c *Client) Ping() error {\n\treturn c.PingAsync().Receive()\n}\n\n// FutureGetNetworkInfoResult is a future promise to deliver the result of a\n// GetNetworkInfoAsync RPC invocation (or an applicable error).\ntype FutureGetNetworkInfoResult chan *Response\n\n// Receive waits for the Response promised by the future and returns data about\n// the current network.\nfunc (r FutureGetNetworkInfoResult) Receive() (*btcjson.GetNetworkInfoResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as an array of getpeerinfo result objects.\n\tvar networkInfo btcjson.GetNetworkInfoResult\n\terr = json.Unmarshal(res, &networkInfo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &networkInfo, nil\n}\n\n// GetNetworkInfoAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetNetworkInfo for the blocking version and more details.\nfunc (c *Client) GetNetworkInfoAsync() FutureGetNetworkInfoResult {\n\tcmd := btcjson.NewGetNetworkInfoCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetNetworkInfo returns data about the current network.\nfunc (c *Client) GetNetworkInfo() (*btcjson.GetNetworkInfoResult, error) {\n\treturn c.GetNetworkInfoAsync().Receive()\n}\n\n// FutureGetNodeAddressesResult is a future promise to deliver the result of a\n// GetNodeAddressesAsync RPC invocation (or an applicable error).\ntype FutureGetNodeAddressesResult chan *Response\n\n// Receive waits for the Response promised by the future and returns data about\n// known node addresses.\nfunc (r FutureGetNodeAddressesResult) Receive() ([]btcjson.GetNodeAddressesResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as an array of getnodeaddresses result objects.\n\tvar nodeAddresses []btcjson.GetNodeAddressesResult\n\terr = json.Unmarshal(res, &nodeAddresses)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn nodeAddresses, nil\n}\n\n// GetNodeAddressesAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetNodeAddresses for the blocking version and more details.\nfunc (c *Client) GetNodeAddressesAsync(count *int32) FutureGetNodeAddressesResult {\n\tcmd := btcjson.NewGetNodeAddressesCmd(count)\n\treturn c.SendCmd(cmd)\n}\n\n// GetNodeAddresses returns data about known node addresses.\nfunc (c *Client) GetNodeAddresses(count *int32) ([]btcjson.GetNodeAddressesResult, error) {\n\treturn c.GetNodeAddressesAsync(count).Receive()\n}\n\n// FutureGetPeerInfoResult is a future promise to deliver the result of a\n// GetPeerInfoAsync RPC invocation (or an applicable error).\ntype FutureGetPeerInfoResult chan *Response\n\n// Receive waits for the Response promised by the future and returns  data about\n// each connected network peer.\nfunc (r FutureGetPeerInfoResult) Receive() ([]btcjson.GetPeerInfoResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as an array of getpeerinfo result objects.\n\tvar peerInfo []btcjson.GetPeerInfoResult\n\terr = json.Unmarshal(res, &peerInfo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn peerInfo, nil\n}\n\n// GetPeerInfoAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetPeerInfo for the blocking version and more details.\nfunc (c *Client) GetPeerInfoAsync() FutureGetPeerInfoResult {\n\tcmd := btcjson.NewGetPeerInfoCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetPeerInfo returns data about each connected network peer.\nfunc (c *Client) GetPeerInfo() ([]btcjson.GetPeerInfoResult, error) {\n\treturn c.GetPeerInfoAsync().Receive()\n}\n\n// FutureGetNetTotalsResult is a future promise to deliver the result of a\n// GetNetTotalsAsync RPC invocation (or an applicable error).\ntype FutureGetNetTotalsResult chan *Response\n\n// Receive waits for the Response promised by the future and returns network\n// traffic statistics.\nfunc (r FutureGetNetTotalsResult) Receive() (*btcjson.GetNetTotalsResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a getnettotals result object.\n\tvar totals btcjson.GetNetTotalsResult\n\terr = json.Unmarshal(res, &totals)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &totals, nil\n}\n\n// GetNetTotalsAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetNetTotals for the blocking version and more details.\nfunc (c *Client) GetNetTotalsAsync() FutureGetNetTotalsResult {\n\tcmd := btcjson.NewGetNetTotalsCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetNetTotals returns network traffic statistics.\nfunc (c *Client) GetNetTotals() (*btcjson.GetNetTotalsResult, error) {\n\treturn c.GetNetTotalsAsync().Receive()\n}\n"
  },
  {
    "path": "rpcclient/notify.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nvar (\n\t// ErrWebsocketsRequired is an error to describe the condition where the\n\t// caller is trying to use a websocket-only feature, such as requesting\n\t// notifications or other websocket requests when the client is\n\t// configured to run in HTTP POST mode.\n\tErrWebsocketsRequired = errors.New(\"a websocket connection is required \" +\n\t\t\"to use this feature\")\n)\n\n// notificationState is used to track the current state of successfully\n// registered notification so the state can be automatically re-established on\n// reconnect.\ntype notificationState struct {\n\tnotifyBlocks       bool\n\tnotifyNewTx        bool\n\tnotifyNewTxVerbose bool\n\tnotifyReceived     map[string]struct{}\n\tnotifySpent        map[btcjson.OutPoint]struct{}\n}\n\n// Copy returns a deep copy of the receiver.\nfunc (s *notificationState) Copy() *notificationState {\n\tvar stateCopy notificationState\n\tstateCopy.notifyBlocks = s.notifyBlocks\n\tstateCopy.notifyNewTx = s.notifyNewTx\n\tstateCopy.notifyNewTxVerbose = s.notifyNewTxVerbose\n\tstateCopy.notifyReceived = make(map[string]struct{})\n\tfor addr := range s.notifyReceived {\n\t\tstateCopy.notifyReceived[addr] = struct{}{}\n\t}\n\tstateCopy.notifySpent = make(map[btcjson.OutPoint]struct{})\n\tfor op := range s.notifySpent {\n\t\tstateCopy.notifySpent[op] = struct{}{}\n\t}\n\n\treturn &stateCopy\n}\n\n// newNotificationState returns a new notification state ready to be populated.\nfunc newNotificationState() *notificationState {\n\treturn &notificationState{\n\t\tnotifyReceived: make(map[string]struct{}),\n\t\tnotifySpent:    make(map[btcjson.OutPoint]struct{}),\n\t}\n}\n\n// newNilFutureResult returns a new future result channel that already has the\n// result waiting on the channel with the reply set to nil.  This is useful\n// to ignore things such as notifications when the caller didn't specify any\n// notification handlers.\nfunc newNilFutureResult() chan *Response {\n\tresponseChan := make(chan *Response, 1)\n\tresponseChan <- &Response{result: nil, err: nil}\n\treturn responseChan\n}\n\n// NotificationHandlers defines callback function pointers to invoke with\n// notifications.  Since all of the functions are nil by default, all\n// notifications are effectively ignored until their handlers are set to a\n// concrete callback.\n//\n// NOTE: Unless otherwise documented, these handlers must NOT directly call any\n// blocking calls on the client instance since the input reader goroutine blocks\n// until the callback has completed.  Doing so will result in a deadlock\n// situation.\ntype NotificationHandlers struct {\n\t// OnClientConnected is invoked when the client connects or reconnects\n\t// to the RPC server.  This callback is run async with the rest of the\n\t// notification handlers, and is safe for blocking client requests.\n\tOnClientConnected func()\n\n\t// OnBlockConnected is invoked when a block is connected to the longest\n\t// (best) chain.  It will only be invoked if a preceding call to\n\t// NotifyBlocks has been made to register for the notification and the\n\t// function is non-nil.\n\t//\n\t// Deprecated: Use OnFilteredBlockConnected instead.\n\tOnBlockConnected func(hash *chainhash.Hash, height int32, t time.Time)\n\n\t// OnFilteredBlockConnected is invoked when a block is connected to the\n\t// longest (best) chain.  It will only be invoked if a preceding call to\n\t// NotifyBlocks has been made to register for the notification and the\n\t// function is non-nil.  Its parameters differ from OnBlockConnected: it\n\t// receives the block's height, header, and relevant transactions.\n\tOnFilteredBlockConnected func(height int32, header *wire.BlockHeader,\n\t\ttxs []*btcutil.Tx)\n\n\t// OnBlockDisconnected is invoked when a block is disconnected from the\n\t// longest (best) chain.  It will only be invoked if a preceding call to\n\t// NotifyBlocks has been made to register for the notification and the\n\t// function is non-nil.\n\t//\n\t// Deprecated: Use OnFilteredBlockDisconnected instead.\n\tOnBlockDisconnected func(hash *chainhash.Hash, height int32, t time.Time)\n\n\t// OnFilteredBlockDisconnected is invoked when a block is disconnected\n\t// from the longest (best) chain.  It will only be invoked if a\n\t// preceding NotifyBlocks has been made to register for the notification\n\t// and the call to function is non-nil.  Its parameters differ from\n\t// OnBlockDisconnected: it receives the block's height and header.\n\tOnFilteredBlockDisconnected func(height int32, header *wire.BlockHeader)\n\n\t// OnRecvTx is invoked when a transaction that receives funds to a\n\t// registered address is received into the memory pool and also\n\t// connected to the longest (best) chain.  It will only be invoked if a\n\t// preceding call to NotifyReceived, Rescan, or RescanEndHeight has been\n\t// made to register for the notification and the function is non-nil.\n\t//\n\t// Deprecated: Use OnRelevantTxAccepted instead.\n\tOnRecvTx func(transaction *btcutil.Tx, details *btcjson.BlockDetails)\n\n\t// OnRedeemingTx is invoked when a transaction that spends a registered\n\t// outpoint is received into the memory pool and also connected to the\n\t// longest (best) chain.  It will only be invoked if a preceding call to\n\t// NotifySpent, Rescan, or RescanEndHeight has been made to register for\n\t// the notification and the function is non-nil.\n\t//\n\t// NOTE: The NotifyReceived will automatically register notifications\n\t// for the outpoints that are now \"owned\" as a result of receiving\n\t// funds to the registered addresses.  This means it is possible for\n\t// this to invoked indirectly as the result of a NotifyReceived call.\n\t//\n\t// Deprecated: Use OnRelevantTxAccepted instead.\n\tOnRedeemingTx func(transaction *btcutil.Tx, details *btcjson.BlockDetails)\n\n\t// OnRelevantTxAccepted is invoked when an unmined transaction passes\n\t// the client's transaction filter.\n\t//\n\t// NOTE: This is a btcsuite extension ported from\n\t// github.com/decred/dcrrpcclient.\n\tOnRelevantTxAccepted func(transaction []byte)\n\n\t// OnRescanFinished is invoked after a rescan finishes due to a previous\n\t// call to Rescan or RescanEndHeight.  Finished rescans should be\n\t// signaled on this notification, rather than relying on the return\n\t// result of a rescan request, due to how btcd may send various rescan\n\t// notifications after the rescan request has already returned.\n\t//\n\t// Deprecated: Not used with RescanBlocks.\n\tOnRescanFinished func(hash *chainhash.Hash, height int32, blkTime time.Time)\n\n\t// OnRescanProgress is invoked periodically when a rescan is underway.\n\t// It will only be invoked if a preceding call to Rescan or\n\t// RescanEndHeight has been made and the function is non-nil.\n\t//\n\t// Deprecated: Not used with RescanBlocks.\n\tOnRescanProgress func(hash *chainhash.Hash, height int32, blkTime time.Time)\n\n\t// OnTxAccepted is invoked when a transaction is accepted into the\n\t// memory pool.  It will only be invoked if a preceding call to\n\t// NotifyNewTransactions with the verbose flag set to false has been\n\t// made to register for the notification and the function is non-nil.\n\tOnTxAccepted func(hash *chainhash.Hash, amount btcutil.Amount)\n\n\t// OnTxAccepted is invoked when a transaction is accepted into the\n\t// memory pool.  It will only be invoked if a preceding call to\n\t// NotifyNewTransactions with the verbose flag set to true has been\n\t// made to register for the notification and the function is non-nil.\n\tOnTxAcceptedVerbose func(txDetails *btcjson.TxRawResult)\n\n\t// OnBtcdConnected is invoked when a wallet connects or disconnects from\n\t// btcd.\n\t//\n\t// This will only be available when client is connected to a wallet\n\t// server such as btcwallet.\n\tOnBtcdConnected func(connected bool)\n\n\t// OnAccountBalance is invoked with account balance updates.\n\t//\n\t// This will only be available when speaking to a wallet server\n\t// such as btcwallet.\n\tOnAccountBalance func(account string, balance btcutil.Amount, confirmed bool)\n\n\t// OnWalletLockState is invoked when a wallet is locked or unlocked.\n\t//\n\t// This will only be available when client is connected to a wallet\n\t// server such as btcwallet.\n\tOnWalletLockState func(locked bool)\n\n\t// OnUnknownNotification is invoked when an unrecognized notification\n\t// is received.  This typically means the notification handling code\n\t// for this package needs to be updated for a new notification type or\n\t// the caller is using a custom notification this package does not know\n\t// about.\n\tOnUnknownNotification func(method string, params []json.RawMessage)\n}\n\n// handleNotification examines the passed notification type, performs\n// conversions to get the raw notification types into higher level types and\n// delivers the notification to the appropriate On<X> handler registered with\n// the client.\nfunc (c *Client) handleNotification(ntfn *rawNotification) {\n\t// Ignore the notification if the client is not interested in any\n\t// notifications.\n\tif c.ntfnHandlers == nil {\n\t\treturn\n\t}\n\n\tswitch ntfn.Method {\n\t// OnBlockConnected\n\tcase btcjson.BlockConnectedNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnBlockConnected == nil {\n\t\t\treturn\n\t\t}\n\n\t\tblockHash, blockHeight, blockTime, err := parseChainNtfnParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid block connected \"+\n\t\t\t\t\"notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnBlockConnected(blockHash, blockHeight, blockTime)\n\n\t// OnFilteredBlockConnected\n\tcase btcjson.FilteredBlockConnectedNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnFilteredBlockConnected == nil {\n\t\t\treturn\n\t\t}\n\n\t\tblockHeight, blockHeader, transactions, err :=\n\t\t\tparseFilteredBlockConnectedParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid filtered block \"+\n\t\t\t\t\"connected notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnFilteredBlockConnected(blockHeight,\n\t\t\tblockHeader, transactions)\n\n\t// OnBlockDisconnected\n\tcase btcjson.BlockDisconnectedNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnBlockDisconnected == nil {\n\t\t\treturn\n\t\t}\n\n\t\tblockHash, blockHeight, blockTime, err := parseChainNtfnParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid block connected \"+\n\t\t\t\t\"notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnBlockDisconnected(blockHash, blockHeight, blockTime)\n\n\t// OnFilteredBlockDisconnected\n\tcase btcjson.FilteredBlockDisconnectedNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnFilteredBlockDisconnected == nil {\n\t\t\treturn\n\t\t}\n\n\t\tblockHeight, blockHeader, err :=\n\t\t\tparseFilteredBlockDisconnectedParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid filtered block \"+\n\t\t\t\t\"disconnected notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnFilteredBlockDisconnected(blockHeight,\n\t\t\tblockHeader)\n\n\t// OnRecvTx\n\tcase btcjson.RecvTxNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnRecvTx == nil {\n\t\t\treturn\n\t\t}\n\n\t\ttx, block, err := parseChainTxNtfnParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid recvtx notification: %v\",\n\t\t\t\terr)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnRecvTx(tx, block)\n\n\t// OnRedeemingTx\n\tcase btcjson.RedeemingTxNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnRedeemingTx == nil {\n\t\t\treturn\n\t\t}\n\n\t\ttx, block, err := parseChainTxNtfnParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid redeemingtx \"+\n\t\t\t\t\"notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnRedeemingTx(tx, block)\n\n\t// OnRelevantTxAccepted\n\tcase btcjson.RelevantTxAcceptedNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnRelevantTxAccepted == nil {\n\t\t\treturn\n\t\t}\n\n\t\ttransaction, err := parseRelevantTxAcceptedParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid relevanttxaccepted \"+\n\t\t\t\t\"notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnRelevantTxAccepted(transaction)\n\n\t// OnRescanFinished\n\tcase btcjson.RescanFinishedNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnRescanFinished == nil {\n\t\t\treturn\n\t\t}\n\n\t\thash, height, blkTime, err := parseRescanProgressParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid rescanfinished \"+\n\t\t\t\t\"notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnRescanFinished(hash, height, blkTime)\n\n\t// OnRescanProgress\n\tcase btcjson.RescanProgressNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnRescanProgress == nil {\n\t\t\treturn\n\t\t}\n\n\t\thash, height, blkTime, err := parseRescanProgressParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid rescanprogress \"+\n\t\t\t\t\"notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnRescanProgress(hash, height, blkTime)\n\n\t// OnTxAccepted\n\tcase btcjson.TxAcceptedNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnTxAccepted == nil {\n\t\t\treturn\n\t\t}\n\n\t\thash, amt, err := parseTxAcceptedNtfnParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid tx accepted \"+\n\t\t\t\t\"notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnTxAccepted(hash, amt)\n\n\t// OnTxAcceptedVerbose\n\tcase btcjson.TxAcceptedVerboseNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnTxAcceptedVerbose == nil {\n\t\t\treturn\n\t\t}\n\n\t\trawTx, err := parseTxAcceptedVerboseNtfnParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid tx accepted verbose \"+\n\t\t\t\t\"notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnTxAcceptedVerbose(rawTx)\n\n\t// OnBtcdConnected\n\tcase btcjson.BtcdConnectedNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnBtcdConnected == nil {\n\t\t\treturn\n\t\t}\n\n\t\tconnected, err := parseBtcdConnectedNtfnParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid btcd connected \"+\n\t\t\t\t\"notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnBtcdConnected(connected)\n\n\t// OnAccountBalance\n\tcase btcjson.AccountBalanceNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnAccountBalance == nil {\n\t\t\treturn\n\t\t}\n\n\t\taccount, bal, conf, err := parseAccountBalanceNtfnParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid account balance \"+\n\t\t\t\t\"notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnAccountBalance(account, bal, conf)\n\n\t// OnWalletLockState\n\tcase btcjson.WalletLockStateNtfnMethod:\n\t\t// Ignore the notification if the client is not interested in\n\t\t// it.\n\t\tif c.ntfnHandlers.OnWalletLockState == nil {\n\t\t\treturn\n\t\t}\n\n\t\t// The account name is not notified, so the return value is\n\t\t// discarded.\n\t\t_, locked, err := parseWalletLockStateNtfnParams(ntfn.Params)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Received invalid wallet lock state \"+\n\t\t\t\t\"notification: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnWalletLockState(locked)\n\n\t// OnUnknownNotification\n\tdefault:\n\t\tif c.ntfnHandlers.OnUnknownNotification == nil {\n\t\t\treturn\n\t\t}\n\n\t\tc.ntfnHandlers.OnUnknownNotification(ntfn.Method, ntfn.Params)\n\t}\n}\n\n// wrongNumParams is an error type describing an unparsable JSON-RPC\n// notification due to an incorrect number of parameters for the\n// expected notification type.  The value is the number of parameters\n// of the invalid notification.\ntype wrongNumParams int\n\n// Error satisfies the builtin error interface.\nfunc (e wrongNumParams) Error() string {\n\treturn fmt.Sprintf(\"wrong number of parameters (%d)\", e)\n}\n\n// parseChainNtfnParams parses out the block hash and height from the parameters\n// of blockconnected and blockdisconnected notifications.\nfunc parseChainNtfnParams(params []json.RawMessage) (*chainhash.Hash,\n\tint32, time.Time, error) {\n\n\tif len(params) != 3 {\n\t\treturn nil, 0, time.Time{}, wrongNumParams(len(params))\n\t}\n\n\t// Unmarshal first parameter as a string.\n\tvar blockHashStr string\n\terr := json.Unmarshal(params[0], &blockHashStr)\n\tif err != nil {\n\t\treturn nil, 0, time.Time{}, err\n\t}\n\n\t// Unmarshal second parameter as an integer.\n\tvar blockHeight int32\n\terr = json.Unmarshal(params[1], &blockHeight)\n\tif err != nil {\n\t\treturn nil, 0, time.Time{}, err\n\t}\n\n\t// Unmarshal third parameter as unix time.\n\tvar blockTimeUnix int64\n\terr = json.Unmarshal(params[2], &blockTimeUnix)\n\tif err != nil {\n\t\treturn nil, 0, time.Time{}, err\n\t}\n\n\t// Create hash from block hash string.\n\tblockHash, err := chainhash.NewHashFromStr(blockHashStr)\n\tif err != nil {\n\t\treturn nil, 0, time.Time{}, err\n\t}\n\n\t// Create time.Time from unix time.\n\tblockTime := time.Unix(blockTimeUnix, 0)\n\n\treturn blockHash, blockHeight, blockTime, nil\n}\n\n// parseFilteredBlockConnectedParams parses out the parameters included in a\n// filteredblockconnected notification.\n//\n// NOTE: This is a btcd extension ported from github.com/decred/dcrrpcclient\n// and requires a websocket connection.\nfunc parseFilteredBlockConnectedParams(params []json.RawMessage) (int32,\n\t*wire.BlockHeader, []*btcutil.Tx, error) {\n\n\tif len(params) < 3 {\n\t\treturn 0, nil, nil, wrongNumParams(len(params))\n\t}\n\n\t// Unmarshal first parameter as an integer.\n\tvar blockHeight int32\n\terr := json.Unmarshal(params[0], &blockHeight)\n\tif err != nil {\n\t\treturn 0, nil, nil, err\n\t}\n\n\t// Unmarshal second parameter as a slice of bytes.\n\tblockHeaderBytes, err := parseHexParam(params[1])\n\tif err != nil {\n\t\treturn 0, nil, nil, err\n\t}\n\n\t// Deserialize block header from slice of bytes.\n\tvar blockHeader wire.BlockHeader\n\terr = blockHeader.Deserialize(bytes.NewReader(blockHeaderBytes))\n\tif err != nil {\n\t\treturn 0, nil, nil, err\n\t}\n\n\t// Unmarshal third parameter as a slice of hex-encoded strings.\n\tvar hexTransactions []string\n\terr = json.Unmarshal(params[2], &hexTransactions)\n\tif err != nil {\n\t\treturn 0, nil, nil, err\n\t}\n\n\t// Create slice of transactions from slice of strings by hex-decoding.\n\ttransactions := make([]*btcutil.Tx, len(hexTransactions))\n\tfor i, hexTx := range hexTransactions {\n\t\ttransaction, err := hex.DecodeString(hexTx)\n\t\tif err != nil {\n\t\t\treturn 0, nil, nil, err\n\t\t}\n\n\t\ttransactions[i], err = btcutil.NewTxFromBytes(transaction)\n\t\tif err != nil {\n\t\t\treturn 0, nil, nil, err\n\t\t}\n\t}\n\n\treturn blockHeight, &blockHeader, transactions, nil\n}\n\n// parseFilteredBlockDisconnectedParams parses out the parameters included in a\n// filteredblockdisconnected notification.\n//\n// NOTE: This is a btcd extension ported from github.com/decred/dcrrpcclient\n// and requires a websocket connection.\nfunc parseFilteredBlockDisconnectedParams(params []json.RawMessage) (int32,\n\t*wire.BlockHeader, error) {\n\tif len(params) < 2 {\n\t\treturn 0, nil, wrongNumParams(len(params))\n\t}\n\n\t// Unmarshal first parameter as an integer.\n\tvar blockHeight int32\n\terr := json.Unmarshal(params[0], &blockHeight)\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\n\t// Unmarshal second parameter as a slice of bytes.\n\tblockHeaderBytes, err := parseHexParam(params[1])\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\n\t// Deserialize block header from slice of bytes.\n\tvar blockHeader wire.BlockHeader\n\terr = blockHeader.Deserialize(bytes.NewReader(blockHeaderBytes))\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\n\treturn blockHeight, &blockHeader, nil\n}\n\nfunc parseHexParam(param json.RawMessage) ([]byte, error) {\n\tvar s string\n\terr := json.Unmarshal(param, &s)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn hex.DecodeString(s)\n}\n\n// parseRelevantTxAcceptedParams parses out the parameter included in a\n// relevanttxaccepted notification.\nfunc parseRelevantTxAcceptedParams(params []json.RawMessage) (transaction []byte, err error) {\n\tif len(params) < 1 {\n\t\treturn nil, wrongNumParams(len(params))\n\t}\n\n\treturn parseHexParam(params[0])\n}\n\n// parseChainTxNtfnParams parses out the transaction and optional details about\n// the block it's mined in from the parameters of recvtx and redeemingtx\n// notifications.\nfunc parseChainTxNtfnParams(params []json.RawMessage) (*btcutil.Tx,\n\t*btcjson.BlockDetails, error) {\n\n\tif len(params) == 0 || len(params) > 2 {\n\t\treturn nil, nil, wrongNumParams(len(params))\n\t}\n\n\t// Unmarshal first parameter as a string.\n\tvar txHex string\n\terr := json.Unmarshal(params[0], &txHex)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// If present, unmarshal second optional parameter as the block details\n\t// JSON object.\n\tvar block *btcjson.BlockDetails\n\tif len(params) > 1 {\n\t\terr = json.Unmarshal(params[1], &block)\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t}\n\n\t// Hex decode and deserialize the transaction.\n\tserializedTx, err := hex.DecodeString(txHex)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tvar msgTx wire.MsgTx\n\terr = msgTx.Deserialize(bytes.NewReader(serializedTx))\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// TODO: Change recvtx and redeemingtx callback signatures to use\n\t// nicer types for details about the block (block hash as a\n\t// chainhash.Hash, block time as a time.Time, etc.).\n\treturn btcutil.NewTx(&msgTx), block, nil\n}\n\n// parseRescanProgressParams parses out the height of the last rescanned block\n// from the parameters of rescanfinished and rescanprogress notifications.\nfunc parseRescanProgressParams(params []json.RawMessage) (*chainhash.Hash, int32, time.Time, error) {\n\tif len(params) != 3 {\n\t\treturn nil, 0, time.Time{}, wrongNumParams(len(params))\n\t}\n\n\t// Unmarshal first parameter as an string.\n\tvar hashStr string\n\terr := json.Unmarshal(params[0], &hashStr)\n\tif err != nil {\n\t\treturn nil, 0, time.Time{}, err\n\t}\n\n\t// Unmarshal second parameter as an integer.\n\tvar height int32\n\terr = json.Unmarshal(params[1], &height)\n\tif err != nil {\n\t\treturn nil, 0, time.Time{}, err\n\t}\n\n\t// Unmarshal third parameter as an integer.\n\tvar blkTime int64\n\terr = json.Unmarshal(params[2], &blkTime)\n\tif err != nil {\n\t\treturn nil, 0, time.Time{}, err\n\t}\n\n\t// Decode string encoding of block hash.\n\thash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\treturn nil, 0, time.Time{}, err\n\t}\n\n\treturn hash, height, time.Unix(blkTime, 0), nil\n}\n\n// parseTxAcceptedNtfnParams parses out the transaction hash and total amount\n// from the parameters of a txaccepted notification.\nfunc parseTxAcceptedNtfnParams(params []json.RawMessage) (*chainhash.Hash,\n\tbtcutil.Amount, error) {\n\n\tif len(params) != 2 {\n\t\treturn nil, 0, wrongNumParams(len(params))\n\t}\n\n\t// Unmarshal first parameter as a string.\n\tvar txHashStr string\n\terr := json.Unmarshal(params[0], &txHashStr)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\t// Unmarshal second parameter as a floating point number.\n\tvar famt float64\n\terr = json.Unmarshal(params[1], &famt)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\t// Bounds check amount.\n\tamt, err := btcutil.NewAmount(famt)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\t// Decode string encoding of transaction sha.\n\ttxHash, err := chainhash.NewHashFromStr(txHashStr)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\treturn txHash, amt, nil\n}\n\n// parseTxAcceptedVerboseNtfnParams parses out details about a raw transaction\n// from the parameters of a txacceptedverbose notification.\nfunc parseTxAcceptedVerboseNtfnParams(params []json.RawMessage) (*btcjson.TxRawResult,\n\terror) {\n\n\tif len(params) != 1 {\n\t\treturn nil, wrongNumParams(len(params))\n\t}\n\n\t// Unmarshal first parameter as a raw transaction result object.\n\tvar rawTx btcjson.TxRawResult\n\terr := json.Unmarshal(params[0], &rawTx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// TODO: change txacceptedverbose notification callbacks to use nicer\n\t// types for all details about the transaction (i.e. decoding hashes\n\t// from their string encoding).\n\treturn &rawTx, nil\n}\n\n// parseBtcdConnectedNtfnParams parses out the connection status of btcd\n// and btcwallet from the parameters of a btcdconnected notification.\nfunc parseBtcdConnectedNtfnParams(params []json.RawMessage) (bool, error) {\n\tif len(params) != 1 {\n\t\treturn false, wrongNumParams(len(params))\n\t}\n\n\t// Unmarshal first parameter as a boolean.\n\tvar connected bool\n\terr := json.Unmarshal(params[0], &connected)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn connected, nil\n}\n\n// parseAccountBalanceNtfnParams parses out the account name, total balance,\n// and whether or not the balance is confirmed or unconfirmed from the\n// parameters of an accountbalance notification.\nfunc parseAccountBalanceNtfnParams(params []json.RawMessage) (account string,\n\tbalance btcutil.Amount, confirmed bool, err error) {\n\n\tif len(params) != 3 {\n\t\treturn \"\", 0, false, wrongNumParams(len(params))\n\t}\n\n\t// Unmarshal first parameter as a string.\n\terr = json.Unmarshal(params[0], &account)\n\tif err != nil {\n\t\treturn \"\", 0, false, err\n\t}\n\n\t// Unmarshal second parameter as a floating point number.\n\tvar fbal float64\n\terr = json.Unmarshal(params[1], &fbal)\n\tif err != nil {\n\t\treturn \"\", 0, false, err\n\t}\n\n\t// Unmarshal third parameter as a boolean.\n\terr = json.Unmarshal(params[2], &confirmed)\n\tif err != nil {\n\t\treturn \"\", 0, false, err\n\t}\n\n\t// Bounds check amount.\n\tbal, err := btcutil.NewAmount(fbal)\n\tif err != nil {\n\t\treturn \"\", 0, false, err\n\t}\n\n\treturn account, bal, confirmed, nil\n}\n\n// parseWalletLockStateNtfnParams parses out the account name and locked\n// state of an account from the parameters of a walletlockstate notification.\nfunc parseWalletLockStateNtfnParams(params []json.RawMessage) (account string,\n\tlocked bool, err error) {\n\n\tif len(params) != 2 {\n\t\treturn \"\", false, wrongNumParams(len(params))\n\t}\n\n\t// Unmarshal first parameter as a string.\n\terr = json.Unmarshal(params[0], &account)\n\tif err != nil {\n\t\treturn \"\", false, err\n\t}\n\n\t// Unmarshal second parameter as a boolean.\n\terr = json.Unmarshal(params[1], &locked)\n\tif err != nil {\n\t\treturn \"\", false, err\n\t}\n\n\treturn account, locked, nil\n}\n\n// FutureNotifyBlocksResult is a future promise to deliver the result of a\n// NotifyBlocksAsync RPC invocation (or an applicable error).\ntype FutureNotifyBlocksResult chan *Response\n\n// Receive waits for the Response promised by the future and returns an error\n// if the registration was not successful.\nfunc (r FutureNotifyBlocksResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// NotifyBlocksAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See NotifyBlocks for the blocking version and more details.\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\nfunc (c *Client) NotifyBlocksAsync() FutureNotifyBlocksResult {\n\t// Not supported in HTTP POST mode.\n\tif c.config.HTTPPostMode {\n\t\treturn newFutureError(ErrWebsocketsRequired)\n\t}\n\n\t// Ignore the notification if the client is not interested in\n\t// notifications.\n\tif c.ntfnHandlers == nil {\n\t\treturn newNilFutureResult()\n\t}\n\n\tcmd := btcjson.NewNotifyBlocksCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// NotifyBlocks registers the client to receive notifications when blocks are\n// connected and disconnected from the main chain.  The notifications are\n// delivered to the notification handlers associated with the client.  Calling\n// this function has no effect if there are no notification handlers and will\n// result in an error if the client is configured to run in HTTP POST mode.\n//\n// The notifications delivered as a result of this call will be via one of\n// OnBlockConnected or OnBlockDisconnected.\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\nfunc (c *Client) NotifyBlocks() error {\n\treturn c.NotifyBlocksAsync().Receive()\n}\n\n// FutureNotifySpentResult is a future promise to deliver the result of a\n// NotifySpentAsync RPC invocation (or an applicable error).\n//\n// Deprecated: Use FutureLoadTxFilterResult instead.\ntype FutureNotifySpentResult chan *Response\n\n// Receive waits for the Response promised by the future and returns an error\n// if the registration was not successful.\nfunc (r FutureNotifySpentResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// notifySpentInternal is the same as notifySpentAsync except it accepts\n// the converted outpoints as a parameter so the client can more efficiently\n// recreate the previous notification state on reconnect.\nfunc (c *Client) notifySpentInternal(outpoints []btcjson.OutPoint) FutureNotifySpentResult {\n\t// Not supported in HTTP POST mode.\n\tif c.config.HTTPPostMode {\n\t\treturn newFutureError(ErrWebsocketsRequired)\n\t}\n\n\t// Ignore the notification if the client is not interested in\n\t// notifications.\n\tif c.ntfnHandlers == nil {\n\t\treturn newNilFutureResult()\n\t}\n\n\tcmd := btcjson.NewNotifySpentCmd(outpoints)\n\treturn c.SendCmd(cmd)\n}\n\n// newOutPointFromWire constructs the btcjson representation of a transaction\n// outpoint from the wire type.\nfunc newOutPointFromWire(op *wire.OutPoint) btcjson.OutPoint {\n\treturn btcjson.OutPoint{\n\t\tHash:  op.Hash.String(),\n\t\tIndex: op.Index,\n\t}\n}\n\n// NotifySpentAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See NotifySpent for the blocking version and more details.\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\n//\n// Deprecated: Use LoadTxFilterAsync instead.\nfunc (c *Client) NotifySpentAsync(outpoints []*wire.OutPoint) FutureNotifySpentResult {\n\t// Not supported in HTTP POST mode.\n\tif c.config.HTTPPostMode {\n\t\treturn newFutureError(ErrWebsocketsRequired)\n\t}\n\n\t// Ignore the notification if the client is not interested in\n\t// notifications.\n\tif c.ntfnHandlers == nil {\n\t\treturn newNilFutureResult()\n\t}\n\n\tops := make([]btcjson.OutPoint, 0, len(outpoints))\n\tfor _, outpoint := range outpoints {\n\t\tops = append(ops, newOutPointFromWire(outpoint))\n\t}\n\tcmd := btcjson.NewNotifySpentCmd(ops)\n\treturn c.SendCmd(cmd)\n}\n\n// NotifySpent registers the client to receive notifications when the passed\n// transaction outputs are spent.  The notifications are delivered to the\n// notification handlers associated with the client.  Calling this function has\n// no effect if there are no notification handlers and will result in an error\n// if the client is configured to run in HTTP POST mode.\n//\n// The notifications delivered as a result of this call will be via\n// OnRedeemingTx.\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\n//\n// Deprecated: Use LoadTxFilter instead.\nfunc (c *Client) NotifySpent(outpoints []*wire.OutPoint) error {\n\treturn c.NotifySpentAsync(outpoints).Receive()\n}\n\n// FutureNotifyNewTransactionsResult is a future promise to deliver the result\n// of a NotifyNewTransactionsAsync RPC invocation (or an applicable error).\ntype FutureNotifyNewTransactionsResult chan *Response\n\n// Receive waits for the Response promised by the future and returns an error\n// if the registration was not successful.\nfunc (r FutureNotifyNewTransactionsResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// NotifyNewTransactionsAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See NotifyNewTransactionsAsync for the blocking version and more details.\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\nfunc (c *Client) NotifyNewTransactionsAsync(verbose bool) FutureNotifyNewTransactionsResult {\n\t// Not supported in HTTP POST mode.\n\tif c.config.HTTPPostMode {\n\t\treturn newFutureError(ErrWebsocketsRequired)\n\t}\n\n\t// Ignore the notification if the client is not interested in\n\t// notifications.\n\tif c.ntfnHandlers == nil {\n\t\treturn newNilFutureResult()\n\t}\n\n\tcmd := btcjson.NewNotifyNewTransactionsCmd(&verbose)\n\treturn c.SendCmd(cmd)\n}\n\n// NotifyNewTransactions registers the client to receive notifications every\n// time a new transaction is accepted to the memory pool.  The notifications are\n// delivered to the notification handlers associated with the client.  Calling\n// this function has no effect if there are no notification handlers and will\n// result in an error if the client is configured to run in HTTP POST mode.\n//\n// The notifications delivered as a result of this call will be via one of\n// OnTxAccepted (when verbose is false) or OnTxAcceptedVerbose (when verbose is\n// true).\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\nfunc (c *Client) NotifyNewTransactions(verbose bool) error {\n\treturn c.NotifyNewTransactionsAsync(verbose).Receive()\n}\n\n// FutureNotifyReceivedResult is a future promise to deliver the result of a\n// NotifyReceivedAsync RPC invocation (or an applicable error).\n//\n// Deprecated: Use FutureLoadTxFilterResult instead.\ntype FutureNotifyReceivedResult chan *Response\n\n// Receive waits for the Response promised by the future and returns an error\n// if the registration was not successful.\nfunc (r FutureNotifyReceivedResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// notifyReceivedInternal is the same as notifyReceivedAsync except it accepts\n// the converted addresses as a parameter so the client can more efficiently\n// recreate the previous notification state on reconnect.\nfunc (c *Client) notifyReceivedInternal(addresses []string) FutureNotifyReceivedResult {\n\t// Not supported in HTTP POST mode.\n\tif c.config.HTTPPostMode {\n\t\treturn newFutureError(ErrWebsocketsRequired)\n\t}\n\n\t// Ignore the notification if the client is not interested in\n\t// notifications.\n\tif c.ntfnHandlers == nil {\n\t\treturn newNilFutureResult()\n\t}\n\n\t// Convert addresses to strings.\n\tcmd := btcjson.NewNotifyReceivedCmd(addresses)\n\treturn c.SendCmd(cmd)\n}\n\n// NotifyReceivedAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See NotifyReceived for the blocking version and more details.\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\n//\n// Deprecated: Use LoadTxFilterAsync instead.\nfunc (c *Client) NotifyReceivedAsync(addresses []btcutil.Address) FutureNotifyReceivedResult {\n\t// Not supported in HTTP POST mode.\n\tif c.config.HTTPPostMode {\n\t\treturn newFutureError(ErrWebsocketsRequired)\n\t}\n\n\t// Ignore the notification if the client is not interested in\n\t// notifications.\n\tif c.ntfnHandlers == nil {\n\t\treturn newNilFutureResult()\n\t}\n\n\t// Convert addresses to strings.\n\taddrs := make([]string, 0, len(addresses))\n\tfor _, addr := range addresses {\n\t\taddrs = append(addrs, addr.String())\n\t}\n\tcmd := btcjson.NewNotifyReceivedCmd(addrs)\n\treturn c.SendCmd(cmd)\n}\n\n// NotifyReceived registers the client to receive notifications every time a\n// new transaction which pays to one of the passed addresses is accepted to\n// memory pool or in a block connected to the block chain.  In addition, when\n// one of these transactions is detected, the client is also automatically\n// registered for notifications when the new transaction outpoints the address\n// now has available are spent (See NotifySpent).  The notifications are\n// delivered to the notification handlers associated with the client.  Calling\n// this function has no effect if there are no notification handlers and will\n// result in an error if the client is configured to run in HTTP POST mode.\n//\n// The notifications delivered as a result of this call will be via one of\n// *OnRecvTx (for transactions that receive funds to one of the passed\n// addresses) or OnRedeemingTx (for transactions which spend from one\n// of the outpoints which are automatically registered upon receipt of funds to\n// the address).\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\n//\n// Deprecated: Use LoadTxFilter instead.\nfunc (c *Client) NotifyReceived(addresses []btcutil.Address) error {\n\treturn c.NotifyReceivedAsync(addresses).Receive()\n}\n\n// FutureRescanResult is a future promise to deliver the result of a RescanAsync\n// or RescanEndHeightAsync RPC invocation (or an applicable error).\n//\n// Deprecated: Use FutureRescanBlocksResult instead.\ntype FutureRescanResult chan *Response\n\n// Receive waits for the Response promised by the future and returns an error\n// if the rescan was not successful.\nfunc (r FutureRescanResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// RescanAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See Rescan for the blocking version and more details.\n//\n// NOTE: Rescan requests are not issued on client reconnect and must be\n// performed manually (ideally with a new start height based on the last\n// rescan progress notification).  See the OnClientConnected notification\n// callback for a good callsite to reissue rescan requests on connect and\n// reconnect.\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\n//\n// Deprecated: Use RescanBlocksAsync instead.\nfunc (c *Client) RescanAsync(startBlock *chainhash.Hash,\n\taddresses []btcutil.Address,\n\toutpoints []*wire.OutPoint) FutureRescanResult {\n\n\t// Not supported in HTTP POST mode.\n\tif c.config.HTTPPostMode {\n\t\treturn newFutureError(ErrWebsocketsRequired)\n\t}\n\n\t// Ignore the notification if the client is not interested in\n\t// notifications.\n\tif c.ntfnHandlers == nil {\n\t\treturn newNilFutureResult()\n\t}\n\n\t// Convert block hashes to strings.\n\tvar startBlockHashStr string\n\tif startBlock != nil {\n\t\tstartBlockHashStr = startBlock.String()\n\t}\n\n\t// Convert addresses to strings.\n\taddrs := make([]string, 0, len(addresses))\n\tfor _, addr := range addresses {\n\t\taddrs = append(addrs, addr.String())\n\t}\n\n\t// Convert outpoints.\n\tops := make([]btcjson.OutPoint, 0, len(outpoints))\n\tfor _, op := range outpoints {\n\t\tops = append(ops, newOutPointFromWire(op))\n\t}\n\n\tcmd := btcjson.NewRescanCmd(startBlockHashStr, addrs, ops, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// Rescan rescans the block chain starting from the provided starting block to\n// the end of the longest chain for transactions that pay to the passed\n// addresses and transactions which spend the passed outpoints.\n//\n// The notifications of found transactions are delivered to the notification\n// handlers associated with client and this call will not return until the\n// rescan has completed.  Calling this function has no effect if there are no\n// notification handlers and will result in an error if the client is configured\n// to run in HTTP POST mode.\n//\n// The notifications delivered as a result of this call will be via one of\n// OnRedeemingTx (for transactions which spend from the one of the\n// passed outpoints), OnRecvTx (for transactions that receive funds\n// to one of the passed addresses), and OnRescanProgress (for rescan progress\n// updates).\n//\n// See RescanEndBlock to also specify an ending block to finish the rescan\n// without continuing through the best block on the main chain.\n//\n// NOTE: Rescan requests are not issued on client reconnect and must be\n// performed manually (ideally with a new start height based on the last\n// rescan progress notification).  See the OnClientConnected notification\n// callback for a good callsite to reissue rescan requests on connect and\n// reconnect.\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\n//\n// Deprecated: Use RescanBlocks instead.\nfunc (c *Client) Rescan(startBlock *chainhash.Hash,\n\taddresses []btcutil.Address,\n\toutpoints []*wire.OutPoint) error {\n\n\treturn c.RescanAsync(startBlock, addresses, outpoints).Receive()\n}\n\n// RescanEndBlockAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See RescanEndBlock for the blocking version and more details.\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\n//\n// Deprecated: Use RescanBlocksAsync instead.\nfunc (c *Client) RescanEndBlockAsync(startBlock *chainhash.Hash,\n\taddresses []btcutil.Address, outpoints []*wire.OutPoint,\n\tendBlock *chainhash.Hash) FutureRescanResult {\n\n\t// Not supported in HTTP POST mode.\n\tif c.config.HTTPPostMode {\n\t\treturn newFutureError(ErrWebsocketsRequired)\n\t}\n\n\t// Ignore the notification if the client is not interested in\n\t// notifications.\n\tif c.ntfnHandlers == nil {\n\t\treturn newNilFutureResult()\n\t}\n\n\t// Convert block hashes to strings.\n\tvar startBlockHashStr, endBlockHashStr string\n\tif startBlock != nil {\n\t\tstartBlockHashStr = startBlock.String()\n\t}\n\tif endBlock != nil {\n\t\tendBlockHashStr = endBlock.String()\n\t}\n\n\t// Convert addresses to strings.\n\taddrs := make([]string, 0, len(addresses))\n\tfor _, addr := range addresses {\n\t\taddrs = append(addrs, addr.String())\n\t}\n\n\t// Convert outpoints.\n\tops := make([]btcjson.OutPoint, 0, len(outpoints))\n\tfor _, op := range outpoints {\n\t\tops = append(ops, newOutPointFromWire(op))\n\t}\n\n\tcmd := btcjson.NewRescanCmd(startBlockHashStr, addrs, ops,\n\t\t&endBlockHashStr)\n\treturn c.SendCmd(cmd)\n}\n\n// RescanEndHeight rescans the block chain starting from the provided starting\n// block up to the provided ending block for transactions that pay to the\n// passed addresses and transactions which spend the passed outpoints.\n//\n// The notifications of found transactions are delivered to the notification\n// handlers associated with client and this call will not return until the\n// rescan has completed.  Calling this function has no effect if there are no\n// notification handlers and will result in an error if the client is configured\n// to run in HTTP POST mode.\n//\n// The notifications delivered as a result of this call will be via one of\n// OnRedeemingTx (for transactions which spend from the one of the\n// passed outpoints), OnRecvTx (for transactions that receive funds\n// to one of the passed addresses), and OnRescanProgress (for rescan progress\n// updates).\n//\n// See Rescan to also perform a rescan through current end of the longest chain.\n//\n// NOTE: This is a btcd extension and requires a websocket connection.\n//\n// Deprecated: Use RescanBlocks instead.\nfunc (c *Client) RescanEndHeight(startBlock *chainhash.Hash,\n\taddresses []btcutil.Address, outpoints []*wire.OutPoint,\n\tendBlock *chainhash.Hash) error {\n\n\treturn c.RescanEndBlockAsync(startBlock, addresses, outpoints,\n\t\tendBlock).Receive()\n}\n\n// FutureLoadTxFilterResult is a future promise to deliver the result\n// of a LoadTxFilterAsync RPC invocation (or an applicable error).\n//\n// NOTE: This is a btcd extension ported from github.com/decred/dcrrpcclient\n// and requires a websocket connection.\ntype FutureLoadTxFilterResult chan *Response\n\n// Receive waits for the Response promised by the future and returns an error\n// if the registration was not successful.\n//\n// NOTE: This is a btcd extension ported from github.com/decred/dcrrpcclient\n// and requires a websocket connection.\nfunc (r FutureLoadTxFilterResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// LoadTxFilterAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See LoadTxFilter for the blocking version and more details.\n//\n// NOTE: This is a btcd extension ported from github.com/decred/dcrrpcclient\n// and requires a websocket connection.\nfunc (c *Client) LoadTxFilterAsync(reload bool, addresses []btcutil.Address,\n\toutPoints []wire.OutPoint) FutureLoadTxFilterResult {\n\n\taddrStrs := make([]string, len(addresses))\n\tfor i, a := range addresses {\n\t\taddrStrs[i] = a.EncodeAddress()\n\t}\n\toutPointObjects := make([]btcjson.OutPoint, len(outPoints))\n\tfor i := range outPoints {\n\t\toutPointObjects[i] = btcjson.OutPoint{\n\t\t\tHash:  outPoints[i].Hash.String(),\n\t\t\tIndex: outPoints[i].Index,\n\t\t}\n\t}\n\n\tcmd := btcjson.NewLoadTxFilterCmd(reload, addrStrs, outPointObjects)\n\treturn c.SendCmd(cmd)\n}\n\n// LoadTxFilter loads, reloads, or adds data to a websocket client's transaction\n// filter.  The filter is consistently updated based on inspected transactions\n// during mempool acceptance, block acceptance, and for all rescanned blocks.\n//\n// NOTE: This is a btcd extension ported from github.com/decred/dcrrpcclient\n// and requires a websocket connection.\nfunc (c *Client) LoadTxFilter(reload bool, addresses []btcutil.Address, outPoints []wire.OutPoint) error {\n\treturn c.LoadTxFilterAsync(reload, addresses, outPoints).Receive()\n}\n"
  },
  {
    "path": "rpcclient/rawrequest.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// FutureRawResult is a future promise to deliver the result of a RawRequest RPC\n// invocation (or an applicable error).\ntype FutureRawResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the raw\n// response, or an error if the request was unsuccessful.\nfunc (r FutureRawResult) Receive() (json.RawMessage, error) {\n\treturn ReceiveFuture(r)\n}\n\n// RawRequestAsync returns an instance of a type that can be used to get the\n// result of a custom RPC request at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See RawRequest for the blocking version and more details.\nfunc (c *Client) RawRequestAsync(method string, params []json.RawMessage) FutureRawResult {\n\t// Method may not be empty.\n\tif method == \"\" {\n\t\treturn newFutureError(errors.New(\"no method\"))\n\t}\n\n\t// Marshal parameters as \"[]\" instead of \"null\" when no parameters\n\t// are passed.\n\tif params == nil {\n\t\tparams = []json.RawMessage{}\n\t}\n\n\t// Create a raw JSON-RPC request using the provided method and params\n\t// and marshal it.  This is done rather than using the SendCmd function\n\t// since that relies on marshalling registered btcjson commands rather\n\t// than custom commands.\n\tid := c.NextID()\n\trawRequest := &btcjson.Request{\n\t\tJsonrpc: btcjson.RpcVersion1,\n\t\tID:      id,\n\t\tMethod:  method,\n\t\tParams:  params,\n\t}\n\tmarshalledJSON, err := json.Marshal(rawRequest)\n\tif err != nil {\n\t\treturn newFutureError(err)\n\t}\n\n\t// Generate the request and send it along with a channel to respond on.\n\tresponseChan := make(chan *Response, 1)\n\tjReq := &jsonRequest{\n\t\tid:             id,\n\t\tmethod:         method,\n\t\tcmd:            nil,\n\t\tmarshalledJSON: marshalledJSON,\n\t\tresponseChan:   responseChan,\n\t}\n\tc.sendRequest(jReq)\n\n\treturn responseChan\n}\n\n// RawRequest allows the caller to send a raw or custom request to the server.\n// This method may be used to send and receive requests and responses for\n// requests that are not handled by this client package, or to proxy partially\n// unmarshaled requests to another JSON-RPC server if a request cannot be\n// handled directly.\nfunc (c *Client) RawRequest(method string, params []json.RawMessage) (json.RawMessage, error) {\n\treturn c.RawRequestAsync(method, params).Receive()\n}\n"
  },
  {
    "path": "rpcclient/rawtransactions.go",
    "content": "// Copyright (c) 2014-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// defaultMaxFeeRate is the default maximum fee rate in BTC/kvB enforced\n\t// by bitcoind v0.19.0 or after for transaction broadcast.\n\tdefaultMaxFeeRate btcjson.BTCPerkvB = 0.1\n)\n\n// SigHashType enumerates the available signature hashing types that the\n// SignRawTransaction function accepts.\ntype SigHashType string\n\n// Constants used to indicate the signature hash type for SignRawTransaction.\nconst (\n\t// SigHashAll indicates ALL of the outputs should be signed.\n\tSigHashAll SigHashType = \"ALL\"\n\n\t// SigHashNone indicates NONE of the outputs should be signed.  This\n\t// can be thought of as specifying the signer does not care where the\n\t// bitcoins go.\n\tSigHashNone SigHashType = \"NONE\"\n\n\t// SigHashSingle indicates that a SINGLE output should be signed.  This\n\t// can be thought of specifying the signer only cares about where ONE of\n\t// the outputs goes, but not any of the others.\n\tSigHashSingle SigHashType = \"SINGLE\"\n\n\t// SigHashAllAnyoneCanPay indicates that signer does not care where the\n\t// other inputs to the transaction come from, so it allows other people\n\t// to add inputs.  In addition, it uses the SigHashAll signing method\n\t// for outputs.\n\tSigHashAllAnyoneCanPay SigHashType = \"ALL|ANYONECANPAY\"\n\n\t// SigHashNoneAnyoneCanPay indicates that signer does not care where the\n\t// other inputs to the transaction come from, so it allows other people\n\t// to add inputs.  In addition, it uses the SigHashNone signing method\n\t// for outputs.\n\tSigHashNoneAnyoneCanPay SigHashType = \"NONE|ANYONECANPAY\"\n\n\t// SigHashSingleAnyoneCanPay indicates that signer does not care where\n\t// the other inputs to the transaction come from, so it allows other\n\t// people to add inputs.  In addition, it uses the SigHashSingle signing\n\t// method for outputs.\n\tSigHashSingleAnyoneCanPay SigHashType = \"SINGLE|ANYONECANPAY\"\n)\n\n// String returns the SighHashType in human-readable form.\nfunc (s SigHashType) String() string {\n\treturn string(s)\n}\n\n// FutureGetRawTransactionResult is a future promise to deliver the result of a\n// GetRawTransactionAsync RPC invocation (or an applicable error).\ntype FutureGetRawTransactionResult chan *Response\n\n// Receive waits for the Response promised by the future and returns a\n// transaction given its hash.\nfunc (r FutureGetRawTransactionResult) Receive() (*btcutil.Tx, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar txHex string\n\terr = json.Unmarshal(res, &txHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Decode the serialized transaction hex to raw bytes.\n\tserializedTx, err := hex.DecodeString(txHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Deserialize the transaction and return it.\n\tvar msgTx wire.MsgTx\n\tif err := msgTx.Deserialize(bytes.NewReader(serializedTx)); err != nil {\n\t\treturn nil, err\n\t}\n\treturn btcutil.NewTx(&msgTx), nil\n}\n\n// GetRawTransactionAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetRawTransaction for the blocking version and more details.\nfunc (c *Client) GetRawTransactionAsync(txHash *chainhash.Hash) FutureGetRawTransactionResult {\n\thash := \"\"\n\tif txHash != nil {\n\t\thash = txHash.String()\n\t}\n\n\tcmd := btcjson.NewGetRawTransactionCmd(hash, btcjson.Int(0))\n\treturn c.SendCmd(cmd)\n}\n\n// GetRawTransaction returns a transaction given its hash.\n//\n// See GetRawTransactionVerbose to obtain additional information about the\n// transaction.\nfunc (c *Client) GetRawTransaction(txHash *chainhash.Hash) (*btcutil.Tx, error) {\n\treturn c.GetRawTransactionAsync(txHash).Receive()\n}\n\n// FutureGetRawTransactionVerboseResult is a future promise to deliver the\n// result of a GetRawTransactionVerboseAsync RPC invocation (or an applicable\n// error).\ntype FutureGetRawTransactionVerboseResult chan *Response\n\n// Receive waits for the Response promised by the future and returns information\n// about a transaction given its hash.\nfunc (r FutureGetRawTransactionVerboseResult) Receive() (*btcjson.TxRawResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a gettrawtransaction result object.\n\tvar rawTxResult btcjson.TxRawResult\n\terr = json.Unmarshal(res, &rawTxResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &rawTxResult, nil\n}\n\n// GetRawTransactionVerboseAsync returns an instance of a type that can be used\n// to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetRawTransactionVerbose for the blocking version and more details.\nfunc (c *Client) GetRawTransactionVerboseAsync(txHash *chainhash.Hash) FutureGetRawTransactionVerboseResult {\n\thash := \"\"\n\tif txHash != nil {\n\t\thash = txHash.String()\n\t}\n\n\tcmd := btcjson.NewGetRawTransactionCmd(hash, btcjson.Int(1))\n\treturn c.SendCmd(cmd)\n}\n\n// GetRawTransactionVerbose returns information about a transaction given\n// its hash.\n//\n// See GetRawTransaction to obtain only the transaction already deserialized.\nfunc (c *Client) GetRawTransactionVerbose(txHash *chainhash.Hash) (*btcjson.TxRawResult, error) {\n\treturn c.GetRawTransactionVerboseAsync(txHash).Receive()\n}\n\n// FutureDecodeRawTransactionResult is a future promise to deliver the result\n// of a DecodeRawTransactionAsync RPC invocation (or an applicable error).\ntype FutureDecodeRawTransactionResult chan *Response\n\n// Receive waits for the Response promised by the future and returns information\n// about a transaction given its serialized bytes.\nfunc (r FutureDecodeRawTransactionResult) Receive() (*btcjson.TxRawResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a decoderawtransaction result object.\n\tvar rawTxResult btcjson.TxRawResult\n\terr = json.Unmarshal(res, &rawTxResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &rawTxResult, nil\n}\n\n// DecodeRawTransactionAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See DecodeRawTransaction for the blocking version and more details.\nfunc (c *Client) DecodeRawTransactionAsync(serializedTx []byte) FutureDecodeRawTransactionResult {\n\ttxHex := hex.EncodeToString(serializedTx)\n\tcmd := btcjson.NewDecodeRawTransactionCmd(txHex)\n\treturn c.SendCmd(cmd)\n}\n\n// DecodeRawTransaction returns information about a transaction given its\n// serialized bytes.\nfunc (c *Client) DecodeRawTransaction(serializedTx []byte) (*btcjson.TxRawResult, error) {\n\treturn c.DecodeRawTransactionAsync(serializedTx).Receive()\n}\n\n// FutureFundRawTransactionResult is a future promise to deliver the result\n// of a FutureFundRawTransactionAsync RPC invocation (or an applicable error).\ntype FutureFundRawTransactionResult chan *Response\n\n// Receive waits for the Response promised by the future and returns information\n// about a funding attempt\nfunc (r FutureFundRawTransactionResult) Receive() (*btcjson.FundRawTransactionResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar marshalled btcjson.FundRawTransactionResult\n\tif err := json.Unmarshal(res, &marshalled); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &marshalled, nil\n}\n\n// FundRawTransactionAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See FundRawTransaction for the blocking version and more details.\nfunc (c *Client) FundRawTransactionAsync(tx *wire.MsgTx, opts btcjson.FundRawTransactionOpts, isWitness *bool) FutureFundRawTransactionResult {\n\tvar txBuf bytes.Buffer\n\tif err := tx.Serialize(&txBuf); err != nil {\n\t\treturn newFutureError(err)\n\t}\n\n\tcmd := btcjson.NewFundRawTransactionCmd(txBuf.Bytes(), opts, isWitness)\n\treturn c.SendCmd(cmd)\n}\n\n// FundRawTransaction returns the result of trying to fund the given transaction with\n// funds from the node wallet\nfunc (c *Client) FundRawTransaction(tx *wire.MsgTx, opts btcjson.FundRawTransactionOpts, isWitness *bool) (*btcjson.FundRawTransactionResult, error) {\n\treturn c.FundRawTransactionAsync(tx, opts, isWitness).Receive()\n}\n\n// FutureCreateRawTransactionResult is a future promise to deliver the result\n// of a CreateRawTransactionAsync RPC invocation (or an applicable error).\ntype FutureCreateRawTransactionResult chan *Response\n\n// Receive waits for the Response promised by the future and returns a new\n// transaction spending the provided inputs and sending to the provided\n// addresses.\nfunc (r FutureCreateRawTransactionResult) Receive() (*wire.MsgTx, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar txHex string\n\terr = json.Unmarshal(res, &txHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Decode the serialized transaction hex to raw bytes.\n\tserializedTx, err := hex.DecodeString(txHex)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Deserialize the transaction and return it.\n\tvar msgTx wire.MsgTx\n\t// we try both the new and old encoding format\n\twitnessErr := msgTx.Deserialize(bytes.NewReader(serializedTx))\n\tif witnessErr != nil {\n\t\tlegacyErr := msgTx.DeserializeNoWitness(bytes.NewReader(serializedTx))\n\t\tif legacyErr != nil {\n\t\t\treturn nil, legacyErr\n\t\t}\n\t}\n\treturn &msgTx, nil\n}\n\n// CreateRawTransactionAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See CreateRawTransaction for the blocking version and more details.\nfunc (c *Client) CreateRawTransactionAsync(inputs []btcjson.TransactionInput,\n\tamounts map[btcutil.Address]btcutil.Amount, lockTime *int64) FutureCreateRawTransactionResult {\n\n\tconvertedAmts := make(map[string]float64, len(amounts))\n\tfor addr, amount := range amounts {\n\t\tconvertedAmts[addr.String()] = amount.ToBTC()\n\t}\n\tcmd := btcjson.NewCreateRawTransactionCmd(inputs, convertedAmts, lockTime)\n\treturn c.SendCmd(cmd)\n}\n\n// CreateRawTransaction returns a new transaction spending the provided inputs\n// and sending to the provided addresses. If the inputs are either nil or an\n// empty slice, it is interpreted as an empty slice.\nfunc (c *Client) CreateRawTransaction(inputs []btcjson.TransactionInput,\n\tamounts map[btcutil.Address]btcutil.Amount, lockTime *int64) (*wire.MsgTx, error) {\n\n\treturn c.CreateRawTransactionAsync(inputs, amounts, lockTime).Receive()\n}\n\n// FutureSendRawTransactionResult is a future promise to deliver the result\n// of a SendRawTransactionAsync RPC invocation (or an applicable error).\ntype FutureSendRawTransactionResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of submitting the encoded transaction to the server which then relays it to\n// the network.\nfunc (r FutureSendRawTransactionResult) Receive() (*chainhash.Hash, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar txHashStr string\n\terr = json.Unmarshal(res, &txHashStr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn chainhash.NewHashFromStr(txHashStr)\n}\n\n// SendRawTransactionAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See SendRawTransaction for the blocking version and more details.\nfunc (c *Client) SendRawTransactionAsync(tx *wire.MsgTx, allowHighFees bool) FutureSendRawTransactionResult {\n\ttxHex := \"\"\n\tif tx != nil {\n\t\t// Serialize the transaction and convert to hex string.\n\t\tbuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\t\tif err := tx.Serialize(buf); err != nil {\n\t\t\treturn newFutureError(err)\n\t\t}\n\t\ttxHex = hex.EncodeToString(buf.Bytes())\n\t}\n\n\t// Due to differences in the sendrawtransaction API for different\n\t// backends, we'll need to inspect our version and construct the\n\t// appropriate request.\n\tversion, err := c.BackendVersion()\n\tif err != nil {\n\t\treturn newFutureError(err)\n\t}\n\n\tvar cmd *btcjson.SendRawTransactionCmd\n\t// Starting from bitcoind v0.19.0, the MaxFeeRate field should be used.\n\t//\n\t// When unified softforks format is supported, it's 0.19 and above.\n\tif version.SupportUnifiedSoftForks() {\n\t\t// Using a 0 MaxFeeRate is interpreted as a maximum fee rate not\n\t\t// being enforced by bitcoind.\n\t\tvar maxFeeRate btcjson.BTCPerkvB\n\t\tif !allowHighFees {\n\t\t\tmaxFeeRate = defaultMaxFeeRate\n\t\t}\n\t\tcmd = btcjson.NewBitcoindSendRawTransactionCmd(txHex, maxFeeRate)\n\t} else {\n\t\t// Otherwise, use the AllowHighFees field.\n\t\tcmd = btcjson.NewSendRawTransactionCmd(txHex, &allowHighFees)\n\t}\n\n\treturn c.SendCmd(cmd)\n}\n\n// SendRawTransaction submits the encoded transaction to the server which will\n// then relay it to the network.\nfunc (c *Client) SendRawTransaction(tx *wire.MsgTx, allowHighFees bool) (*chainhash.Hash, error) {\n\treturn c.SendRawTransactionAsync(tx, allowHighFees).Receive()\n}\n\n// FutureSignRawTransactionResult is a future promise to deliver the result\n// of one of the SignRawTransactionAsync family of RPC invocations (or an\n// applicable error).\ntype FutureSignRawTransactionResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// signed transaction as well as whether or not all inputs are now signed.\nfunc (r FutureSignRawTransactionResult) Receive() (*wire.MsgTx, bool, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, false, err\n\t}\n\n\t// Unmarshal as a signrawtransaction result.\n\tvar signRawTxResult btcjson.SignRawTransactionResult\n\terr = json.Unmarshal(res, &signRawTxResult)\n\tif err != nil {\n\t\treturn nil, false, err\n\t}\n\n\t// Decode the serialized transaction hex to raw bytes.\n\tserializedTx, err := hex.DecodeString(signRawTxResult.Hex)\n\tif err != nil {\n\t\treturn nil, false, err\n\t}\n\n\t// Deserialize the transaction and return it.\n\tvar msgTx wire.MsgTx\n\tif err := msgTx.Deserialize(bytes.NewReader(serializedTx)); err != nil {\n\t\treturn nil, false, err\n\t}\n\n\treturn &msgTx, signRawTxResult.Complete, nil\n}\n\n// SignRawTransactionAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See SignRawTransaction for the blocking version and more details.\nfunc (c *Client) SignRawTransactionAsync(tx *wire.MsgTx) FutureSignRawTransactionResult {\n\ttxHex := \"\"\n\tif tx != nil {\n\t\t// Serialize the transaction and convert to hex string.\n\t\tbuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\t\tif err := tx.Serialize(buf); err != nil {\n\t\t\treturn newFutureError(err)\n\t\t}\n\t\ttxHex = hex.EncodeToString(buf.Bytes())\n\t}\n\n\tcmd := btcjson.NewSignRawTransactionCmd(txHex, nil, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// SignRawTransaction signs inputs for the passed transaction and returns the\n// signed transaction as well as whether or not all inputs are now signed.\n//\n// This function assumes the RPC server already knows the input transactions and\n// private keys for the passed transaction which needs to be signed and uses the\n// default signature hash type.  Use one of the SignRawTransaction# variants to\n// specify that information if needed.\nfunc (c *Client) SignRawTransaction(tx *wire.MsgTx) (*wire.MsgTx, bool, error) {\n\treturn c.SignRawTransactionAsync(tx).Receive()\n}\n\n// SignRawTransaction2Async returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See SignRawTransaction2 for the blocking version and more details.\nfunc (c *Client) SignRawTransaction2Async(tx *wire.MsgTx, inputs []btcjson.RawTxInput) FutureSignRawTransactionResult {\n\ttxHex := \"\"\n\tif tx != nil {\n\t\t// Serialize the transaction and convert to hex string.\n\t\tbuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\t\tif err := tx.Serialize(buf); err != nil {\n\t\t\treturn newFutureError(err)\n\t\t}\n\t\ttxHex = hex.EncodeToString(buf.Bytes())\n\t}\n\n\tcmd := btcjson.NewSignRawTransactionCmd(txHex, &inputs, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// SignRawTransaction2 signs inputs for the passed transaction given the list\n// of information about the input transactions needed to perform the signing\n// process.\n//\n// This only input transactions that need to be specified are ones the\n// RPC server does not already know.  Already known input transactions will be\n// merged with the specified transactions.\n//\n// See SignRawTransaction if the RPC server already knows the input\n// transactions.\nfunc (c *Client) SignRawTransaction2(tx *wire.MsgTx, inputs []btcjson.RawTxInput) (*wire.MsgTx, bool, error) {\n\treturn c.SignRawTransaction2Async(tx, inputs).Receive()\n}\n\n// SignRawTransaction3Async returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See SignRawTransaction3 for the blocking version and more details.\nfunc (c *Client) SignRawTransaction3Async(tx *wire.MsgTx,\n\tinputs []btcjson.RawTxInput,\n\tprivKeysWIF []string) FutureSignRawTransactionResult {\n\n\ttxHex := \"\"\n\tif tx != nil {\n\t\t// Serialize the transaction and convert to hex string.\n\t\tbuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\t\tif err := tx.Serialize(buf); err != nil {\n\t\t\treturn newFutureError(err)\n\t\t}\n\t\ttxHex = hex.EncodeToString(buf.Bytes())\n\t}\n\n\tcmd := btcjson.NewSignRawTransactionCmd(txHex, &inputs, &privKeysWIF,\n\t\tnil)\n\treturn c.SendCmd(cmd)\n}\n\n// SignRawTransaction3 signs inputs for the passed transaction given the list\n// of information about extra input transactions and a list of private keys\n// needed to perform the signing process.  The private keys must be in wallet\n// import format (WIF).\n//\n// This only input transactions that need to be specified are ones the\n// RPC server does not already know.  Already known input transactions will be\n// merged with the specified transactions.  This means the list of transaction\n// inputs can be nil if the RPC server already knows them all.\n//\n// NOTE: Unlike the merging functionality of the input transactions, ONLY the\n// specified private keys will be used, so even if the server already knows some\n// of the private keys, they will NOT be used.\n//\n// See SignRawTransaction if the RPC server already knows the input\n// transactions and private keys or SignRawTransaction2 if it already knows the\n// private keys.\nfunc (c *Client) SignRawTransaction3(tx *wire.MsgTx,\n\tinputs []btcjson.RawTxInput,\n\tprivKeysWIF []string) (*wire.MsgTx, bool, error) {\n\n\treturn c.SignRawTransaction3Async(tx, inputs, privKeysWIF).Receive()\n}\n\n// SignRawTransaction4Async returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See SignRawTransaction4 for the blocking version and more details.\nfunc (c *Client) SignRawTransaction4Async(tx *wire.MsgTx,\n\tinputs []btcjson.RawTxInput, privKeysWIF []string,\n\thashType SigHashType) FutureSignRawTransactionResult {\n\n\ttxHex := \"\"\n\tif tx != nil {\n\t\t// Serialize the transaction and convert to hex string.\n\t\tbuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\t\tif err := tx.Serialize(buf); err != nil {\n\t\t\treturn newFutureError(err)\n\t\t}\n\t\ttxHex = hex.EncodeToString(buf.Bytes())\n\t}\n\n\tcmd := btcjson.NewSignRawTransactionCmd(txHex, &inputs, &privKeysWIF,\n\t\tbtcjson.String(string(hashType)))\n\treturn c.SendCmd(cmd)\n}\n\n// SignRawTransaction4 signs inputs for the passed transaction using\n// the specified signature hash type given the list of information about extra\n// input transactions and a potential list of private keys needed to perform\n// the signing process.  The private keys, if specified, must be in wallet\n// import format (WIF).\n//\n// The only input transactions that need to be specified are ones the RPC server\n// does not already know.  This means the list of transaction inputs can be nil\n// if the RPC server already knows them all.\n//\n// NOTE: Unlike the merging functionality of the input transactions, ONLY the\n// specified private keys will be used, so even if the server already knows some\n// of the private keys, they will NOT be used.  The list of private keys can be\n// nil in which case any private keys the RPC server knows will be used.\n//\n// This function should only used if a non-default signature hash type is\n// desired.  Otherwise, see SignRawTransaction if the RPC server already knows\n// the input transactions and private keys, SignRawTransaction2 if it already\n// knows the private keys, or SignRawTransaction3 if it does not know both.\nfunc (c *Client) SignRawTransaction4(tx *wire.MsgTx,\n\tinputs []btcjson.RawTxInput, privKeysWIF []string,\n\thashType SigHashType) (*wire.MsgTx, bool, error) {\n\n\treturn c.SignRawTransaction4Async(tx, inputs, privKeysWIF,\n\t\thashType).Receive()\n}\n\n// FutureSignRawTransactionWithWalletResult is a future promise to deliver\n// the result of the SignRawTransactionWithWalletAsync RPC invocation (or\n// an applicable error).\ntype FutureSignRawTransactionWithWalletResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// signed transaction as well as whether or not all inputs are now signed.\nfunc (r FutureSignRawTransactionWithWalletResult) Receive() (*wire.MsgTx, bool, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, false, err\n\t}\n\n\t// Unmarshal as a signtransactionwithwallet result.\n\tvar signRawTxWithWalletResult btcjson.SignRawTransactionWithWalletResult\n\terr = json.Unmarshal(res, &signRawTxWithWalletResult)\n\tif err != nil {\n\t\treturn nil, false, err\n\t}\n\n\t// Decode the serialized transaction hex to raw bytes.\n\tserializedTx, err := hex.DecodeString(signRawTxWithWalletResult.Hex)\n\tif err != nil {\n\t\treturn nil, false, err\n\t}\n\n\t// Deserialize the transaction and return it.\n\tvar msgTx wire.MsgTx\n\tif err := msgTx.Deserialize(bytes.NewReader(serializedTx)); err != nil {\n\t\treturn nil, false, err\n\t}\n\n\treturn &msgTx, signRawTxWithWalletResult.Complete, nil\n}\n\n// SignRawTransactionWithWalletAsync returns an instance of a type that can be used\n// to get the result of the RPC at some future time by invoking the Receive function\n// on the returned instance.\n//\n// See SignRawTransactionWithWallet for the blocking version and more details.\nfunc (c *Client) SignRawTransactionWithWalletAsync(tx *wire.MsgTx) FutureSignRawTransactionWithWalletResult {\n\ttxHex := \"\"\n\tif tx != nil {\n\t\t// Serialize the transaction and convert to hex string.\n\t\tbuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\t\tif err := tx.Serialize(buf); err != nil {\n\t\t\treturn newFutureError(err)\n\t\t}\n\t\ttxHex = hex.EncodeToString(buf.Bytes())\n\t}\n\n\tcmd := btcjson.NewSignRawTransactionWithWalletCmd(txHex, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// SignRawTransactionWithWallet signs inputs for the passed transaction and returns\n// the signed transaction as well as whether or not all inputs are now signed.\n//\n// This function assumes the RPC server already knows the input transactions for the\n// passed transaction which needs to be signed and uses the default signature hash\n// type.  Use one of the SignRawTransactionWithWallet# variants to specify that\n// information if needed.\nfunc (c *Client) SignRawTransactionWithWallet(tx *wire.MsgTx) (*wire.MsgTx, bool, error) {\n\treturn c.SignRawTransactionWithWalletAsync(tx).Receive()\n}\n\n// SignRawTransactionWithWallet2Async returns an instance of a type that can be\n// used to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See SignRawTransactionWithWallet2 for the blocking version and more details.\nfunc (c *Client) SignRawTransactionWithWallet2Async(tx *wire.MsgTx,\n\tinputs []btcjson.RawTxWitnessInput) FutureSignRawTransactionWithWalletResult {\n\n\ttxHex := \"\"\n\tif tx != nil {\n\t\t// Serialize the transaction and convert to hex string.\n\t\tbuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\t\tif err := tx.Serialize(buf); err != nil {\n\t\t\treturn newFutureError(err)\n\t\t}\n\t\ttxHex = hex.EncodeToString(buf.Bytes())\n\t}\n\n\tcmd := btcjson.NewSignRawTransactionWithWalletCmd(txHex, &inputs, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// SignRawTransactionWithWallet2 signs inputs for the passed transaction given the\n// list of information about the input transactions needed to perform the signing\n// process.\n//\n// This only input transactions that need to be specified are ones the\n// RPC server does not already know.  Already known input transactions will be\n// merged with the specified transactions.\n//\n// See SignRawTransactionWithWallet if the RPC server already knows the input\n// transactions.\nfunc (c *Client) SignRawTransactionWithWallet2(tx *wire.MsgTx,\n\tinputs []btcjson.RawTxWitnessInput) (*wire.MsgTx, bool, error) {\n\n\treturn c.SignRawTransactionWithWallet2Async(tx, inputs).Receive()\n}\n\n// SignRawTransactionWithWallet3Async returns an instance of a type that can\n// be used to get the result of the RPC at some future time by invoking the\n// Receive function on the returned instance.\n//\n// See SignRawTransactionWithWallet3 for the blocking version and more details.\nfunc (c *Client) SignRawTransactionWithWallet3Async(tx *wire.MsgTx,\n\tinputs []btcjson.RawTxWitnessInput, hashType SigHashType) FutureSignRawTransactionWithWalletResult {\n\n\ttxHex := \"\"\n\tif tx != nil {\n\t\t// Serialize the transaction and convert to hex string.\n\t\tbuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\t\tif err := tx.Serialize(buf); err != nil {\n\t\t\treturn newFutureError(err)\n\t\t}\n\t\ttxHex = hex.EncodeToString(buf.Bytes())\n\t}\n\n\tcmd := btcjson.NewSignRawTransactionWithWalletCmd(txHex, &inputs, btcjson.String(string(hashType)))\n\treturn c.SendCmd(cmd)\n}\n\n// SignRawTransactionWithWallet3 signs inputs for the passed transaction using\n// the specified signature hash type given the list of information about extra\n// input transactions.\n//\n// The only input transactions that need to be specified are ones the RPC server\n// does not already know.  This means the list of transaction inputs can be nil\n// if the RPC server already knows them all.\n//\n// This function should only used if a non-default signature hash type is\n// desired.  Otherwise, see SignRawTransactionWithWallet if the RPC server already\n// knows the input transactions, or SignRawTransactionWithWallet2 if it does not.\nfunc (c *Client) SignRawTransactionWithWallet3(tx *wire.MsgTx,\n\tinputs []btcjson.RawTxWitnessInput, hashType SigHashType) (*wire.MsgTx, bool, error) {\n\n\treturn c.SignRawTransactionWithWallet3Async(tx, inputs, hashType).Receive()\n}\n\n// FutureSearchRawTransactionsResult is a future promise to deliver the result\n// of the SearchRawTransactionsAsync RPC invocation (or an applicable error).\ntype FutureSearchRawTransactionsResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// found raw transactions.\nfunc (r FutureSearchRawTransactionsResult) Receive() ([]*wire.MsgTx, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal as an array of strings.\n\tvar searchRawTxnsResult []string\n\terr = json.Unmarshal(res, &searchRawTxnsResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Decode and deserialize each transaction.\n\tmsgTxns := make([]*wire.MsgTx, 0, len(searchRawTxnsResult))\n\tfor _, hexTx := range searchRawTxnsResult {\n\t\t// Decode the serialized transaction hex to raw bytes.\n\t\tserializedTx, err := hex.DecodeString(hexTx)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Deserialize the transaction and add it to the result slice.\n\t\tvar msgTx wire.MsgTx\n\t\terr = msgTx.Deserialize(bytes.NewReader(serializedTx))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tmsgTxns = append(msgTxns, &msgTx)\n\t}\n\n\treturn msgTxns, nil\n}\n\n// SearchRawTransactionsAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See SearchRawTransactions for the blocking version and more details.\nfunc (c *Client) SearchRawTransactionsAsync(address btcutil.Address, skip, count int, reverse bool, filterAddrs []string) FutureSearchRawTransactionsResult {\n\taddr := address.EncodeAddress()\n\tverbose := btcjson.Int(0)\n\tcmd := btcjson.NewSearchRawTransactionsCmd(addr, verbose, &skip, &count,\n\t\tnil, &reverse, &filterAddrs)\n\treturn c.SendCmd(cmd)\n}\n\n// SearchRawTransactions returns transactions that involve the passed address.\n//\n// NOTE: Chain servers do not typically provide this capability unless it has\n// specifically been enabled.\n//\n// See SearchRawTransactionsVerbose to retrieve a list of data structures with\n// information about the transactions instead of the transactions themselves.\nfunc (c *Client) SearchRawTransactions(address btcutil.Address, skip, count int, reverse bool, filterAddrs []string) ([]*wire.MsgTx, error) {\n\treturn c.SearchRawTransactionsAsync(address, skip, count, reverse, filterAddrs).Receive()\n}\n\n// FutureSearchRawTransactionsVerboseResult is a future promise to deliver the\n// result of the SearchRawTransactionsVerboseAsync RPC invocation (or an\n// applicable error).\ntype FutureSearchRawTransactionsVerboseResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// found raw transactions.\nfunc (r FutureSearchRawTransactionsVerboseResult) Receive() ([]*btcjson.SearchRawTransactionsResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal as an array of raw transaction results.\n\tvar result []*btcjson.SearchRawTransactionsResult\n\terr = json.Unmarshal(res, &result)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn result, nil\n}\n\n// SearchRawTransactionsVerboseAsync returns an instance of a type that can be\n// used to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See SearchRawTransactionsVerbose for the blocking version and more details.\nfunc (c *Client) SearchRawTransactionsVerboseAsync(address btcutil.Address, skip,\n\tcount int, includePrevOut, reverse bool, filterAddrs *[]string) FutureSearchRawTransactionsVerboseResult {\n\n\taddr := address.EncodeAddress()\n\tverbose := btcjson.Int(1)\n\tvar prevOut *int\n\tif includePrevOut {\n\t\tprevOut = btcjson.Int(1)\n\t}\n\tcmd := btcjson.NewSearchRawTransactionsCmd(addr, verbose, &skip, &count,\n\t\tprevOut, &reverse, filterAddrs)\n\treturn c.SendCmd(cmd)\n}\n\n// SearchRawTransactionsVerbose returns a list of data structures that describe\n// transactions which involve the passed address.\n//\n// NOTE: Chain servers do not typically provide this capability unless it has\n// specifically been enabled.\n//\n// See SearchRawTransactions to retrieve a list of raw transactions instead.\nfunc (c *Client) SearchRawTransactionsVerbose(address btcutil.Address, skip,\n\tcount int, includePrevOut, reverse bool, filterAddrs []string) ([]*btcjson.SearchRawTransactionsResult, error) {\n\n\treturn c.SearchRawTransactionsVerboseAsync(address, skip, count,\n\t\tincludePrevOut, reverse, &filterAddrs).Receive()\n}\n\n// FutureDecodeScriptResult is a future promise to deliver the result\n// of a DecodeScriptAsync RPC invocation (or an applicable error).\ntype FutureDecodeScriptResult chan *Response\n\n// Receive waits for the Response promised by the future and returns information\n// about a script given its serialized bytes.\nfunc (r FutureDecodeScriptResult) Receive() (*btcjson.DecodeScriptResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a decodescript result object.\n\tvar decodeScriptResult btcjson.DecodeScriptResult\n\terr = json.Unmarshal(res, &decodeScriptResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &decodeScriptResult, nil\n}\n\n// DecodeScriptAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See DecodeScript for the blocking version and more details.\nfunc (c *Client) DecodeScriptAsync(serializedScript []byte) FutureDecodeScriptResult {\n\tscriptHex := hex.EncodeToString(serializedScript)\n\tcmd := btcjson.NewDecodeScriptCmd(scriptHex)\n\treturn c.SendCmd(cmd)\n}\n\n// DecodeScript returns information about a script given its serialized bytes.\nfunc (c *Client) DecodeScript(serializedScript []byte) (*btcjson.DecodeScriptResult, error) {\n\treturn c.DecodeScriptAsync(serializedScript).Receive()\n}\n\n// FutureTestMempoolAcceptResult is a future promise to deliver the result\n// of a TestMempoolAccept RPC invocation (or an applicable error).\ntype FutureTestMempoolAcceptResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// response from TestMempoolAccept.\nfunc (r FutureTestMempoolAcceptResult) Receive() (\n\t[]*btcjson.TestMempoolAcceptResult, error) {\n\n\tresponse, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal as an array of TestMempoolAcceptResult items.\n\tvar results []*btcjson.TestMempoolAcceptResult\n\n\terr = json.Unmarshal(response, &results)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn results, nil\n}\n\n// TestMempoolAcceptAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function\n// on the returned instance.\n//\n// See TestMempoolAccept for the blocking version and more details.\nfunc (c *Client) TestMempoolAcceptAsync(txns []*wire.MsgTx,\n\tmaxFeeRate btcjson.BTCPerkvB) FutureTestMempoolAcceptResult {\n\n\t// Due to differences in the testmempoolaccept API for different\n\t// backends, we'll need to inspect our version and construct the\n\t// appropriate request.\n\tversion, err := c.BackendVersion()\n\tif err != nil {\n\t\treturn newFutureError(err)\n\t}\n\n\tlog.Debugf(\"TestMempoolAcceptAsync: backend version %s\", version)\n\n\t// Exit early if the version is below 22.0.0.\n\t//\n\t// Based on the history of `testmempoolaccept` in bitcoind,\n\t// - introduced in 0.17.0\n\t// - unchanged in 0.18.0\n\t// - allowhighfees(bool) param is changed to maxfeerate(numeric) in\n\t//   0.19.0\n\t// - unchanged in 0.20.0\n\t// - added fees and vsize fields in its response in 0.21.0\n\t// - allow more than one txes in param rawtx and added package-error\n\t//   and wtxid fields in its response in 0.22.0\n\t// - unchanged in 0.23.0\n\t// - unchanged in 0.24.0\n\t// - added effective-feerate and effective-includes fields in its\n\t//   response in 0.25.0\n\t//\n\t// We decide to not support this call for versions below 22.0.0. as the\n\t// request/response formats are very different.\n\tif !version.SupportTestMempoolAccept() {\n\t\terr := fmt.Errorf(\"%w: %v\", ErrBackendVersion, version)\n\t\treturn newFutureError(err)\n\t}\n\n\t// The maximum number of transactions allowed is 25.\n\tif len(txns) > 25 {\n\t\terr := fmt.Errorf(\"%w: too many transactions provided\",\n\t\t\tErrInvalidParam)\n\t\treturn newFutureError(err)\n\t}\n\n\t// Exit early if an empty array of transactions is provided.\n\tif len(txns) == 0 {\n\t\terr := fmt.Errorf(\"%w: no transactions provided\",\n\t\t\tErrInvalidParam)\n\t\treturn newFutureError(err)\n\t}\n\n\t// Iterate all the transactions and turn them into hex strings.\n\trawTxns := make([]string, 0, len(txns))\n\tfor _, tx := range txns {\n\t\t// Serialize the transaction and convert to hex string.\n\t\tbuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\n\t\t// TODO(yy): add similar checks found in `BtcDecode` to\n\t\t// `BtcEncode` - atm it just serializes bytes without any\n\t\t// bitcoin-specific checks.\n\t\tif err := tx.Serialize(buf); err != nil {\n\t\t\terr = fmt.Errorf(\"%w: %v\", ErrInvalidParam, err)\n\t\t\treturn newFutureError(err)\n\t\t}\n\n\t\trawTx := hex.EncodeToString(buf.Bytes())\n\t\trawTxns = append(rawTxns, rawTx)\n\n\t\t// Sanity check the provided tx is valid, which can be removed\n\t\t// once we have similar checks added in `BtcEncode`.\n\t\t//\n\t\t// NOTE: must be performed after buf.Bytes is copied above.\n\t\t//\n\t\t// TODO(yy): remove it once the above TODO is addressed.\n\t\tif err := tx.Deserialize(buf); err != nil {\n\t\t\terr = fmt.Errorf(\"%w: %v\", ErrInvalidParam, err)\n\t\t\treturn newFutureError(err)\n\t\t}\n\t}\n\n\tcmd := btcjson.NewTestMempoolAcceptCmd(rawTxns, maxFeeRate)\n\n\treturn c.SendCmd(cmd)\n}\n\n// TestMempoolAccept returns result of mempool acceptance tests indicating if\n// raw transaction(s) would be accepted by mempool.\n//\n// If multiple transactions are passed in, parents must come before children\n// and package policies apply: the transactions cannot conflict with any\n// mempool transactions or each other.\n//\n// If one transaction fails, other transactions may not be fully validated (the\n// 'allowed' key will be blank).\n//\n// The maximum number of transactions allowed is 25.\nfunc (c *Client) TestMempoolAccept(txns []*wire.MsgTx,\n\tmaxFeeRate btcjson.BTCPerkvB) ([]*btcjson.TestMempoolAcceptResult, error) {\n\n\treturn c.TestMempoolAcceptAsync(txns, maxFeeRate).Receive()\n}\n\n// FutureGetTxSpendingPrevOut is a future promise to deliver the result of a\n// GetTxSpendingPrevOut RPC invocation (or an applicable error).\ntype FutureGetTxSpendingPrevOut chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// response from GetTxSpendingPrevOut.\nfunc (r FutureGetTxSpendingPrevOut) Receive() (\n\t[]*btcjson.GetTxSpendingPrevOutResult, error) {\n\n\tresponse, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal as an array of GetTxSpendingPrevOutResult items.\n\tvar results []*btcjson.GetTxSpendingPrevOutResult\n\n\terr = json.Unmarshal(response, &results)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn results, nil\n}\n\n// GetTxSpendingPrevOutAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetTxSpendingPrevOut for the blocking version and more details.\nfunc (c *Client) GetTxSpendingPrevOutAsync(\n\toutpoints []wire.OutPoint) FutureGetTxSpendingPrevOut {\n\n\t// Due to differences in the testmempoolaccept API for different\n\t// backends, we'll need to inspect our version and construct the\n\t// appropriate request.\n\tversion, err := c.BackendVersion()\n\tif err != nil {\n\t\treturn newFutureError(err)\n\t}\n\n\tlog.Debugf(\"GetTxSpendingPrevOutAsync: backend version %s\", version)\n\n\t// Exit early if the version is below 24.0.0.\n\tif !version.SupportGetTxSpendingPrevOut() {\n\t\terr := fmt.Errorf(\"%w: %v\", ErrBackendVersion, version)\n\t\treturn newFutureError(err)\n\t}\n\n\t// Exit early if an empty array of outpoints is provided.\n\tif len(outpoints) == 0 {\n\t\terr := fmt.Errorf(\"%w: no outpoints provided\", ErrInvalidParam)\n\t\treturn newFutureError(err)\n\t}\n\n\tcmd := btcjson.NewGetTxSpendingPrevOutCmd(outpoints)\n\n\treturn c.SendCmd(cmd)\n}\n\n// GetTxSpendingPrevOut returns the result from calling `gettxspendingprevout`\n// RPC.\nfunc (c *Client) GetTxSpendingPrevOut(outpoints []wire.OutPoint) (\n\t[]*btcjson.GetTxSpendingPrevOutResult, error) {\n\n\treturn c.GetTxSpendingPrevOutAsync(outpoints).Receive()\n}\n"
  },
  {
    "path": "rpcclient/wallet.go",
    "content": "// Copyright (c) 2014-2020 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage rpcclient\n\nimport (\n\t\"encoding/json\"\n\t\"strconv\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// *****************************\n// Transaction Listing Functions\n// *****************************\n\n// FutureGetTransactionResult is a future promise to deliver the result\n// of a GetTransactionAsync or GetTransactionWatchOnlyAsync RPC invocation\n// (or an applicable error).\ntype FutureGetTransactionResult chan *Response\n\n// Receive waits for the Response promised by the future and returns detailed\n// information about a wallet transaction.\nfunc (r FutureGetTransactionResult) Receive() (*btcjson.GetTransactionResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a gettransaction result object\n\tvar getTx btcjson.GetTransactionResult\n\terr = json.Unmarshal(res, &getTx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &getTx, nil\n}\n\n// GetTransactionAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetTransaction for the blocking version and more details.\nfunc (c *Client) GetTransactionAsync(txHash *chainhash.Hash) FutureGetTransactionResult {\n\thash := \"\"\n\tif txHash != nil {\n\t\thash = txHash.String()\n\t}\n\n\tcmd := btcjson.NewGetTransactionCmd(hash, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// GetTransaction returns detailed information about a wallet transaction.\n//\n// See GetRawTransaction to return the raw transaction instead.\nfunc (c *Client) GetTransaction(txHash *chainhash.Hash) (*btcjson.GetTransactionResult, error) {\n\treturn c.GetTransactionAsync(txHash).Receive()\n}\n\n// GetTransactionWatchOnlyAsync returns an instance of a type that can be used\n// to get the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetTransactionWatchOnly for the blocking version and more details.\nfunc (c *Client) GetTransactionWatchOnlyAsync(txHash *chainhash.Hash, watchOnly bool) FutureGetTransactionResult {\n\thash := \"\"\n\tif txHash != nil {\n\t\thash = txHash.String()\n\t}\n\n\tcmd := btcjson.NewGetTransactionCmd(hash, &watchOnly)\n\treturn c.SendCmd(cmd)\n}\n\n// GetTransactionWatchOnly returns detailed information about a wallet\n// transaction, and allow including watch-only addresses in balance\n// calculation and details.\nfunc (c *Client) GetTransactionWatchOnly(txHash *chainhash.Hash, watchOnly bool) (*btcjson.GetTransactionResult, error) {\n\treturn c.GetTransactionWatchOnlyAsync(txHash, watchOnly).Receive()\n}\n\n// FutureListTransactionsResult is a future promise to deliver the result of a\n// ListTransactionsAsync, ListTransactionsCountAsync, or\n// ListTransactionsCountFromAsync RPC invocation (or an applicable error).\ntype FutureListTransactionsResult chan *Response\n\n// Receive waits for the Response promised by the future and returns a list of\n// the most recent transactions.\nfunc (r FutureListTransactionsResult) Receive() ([]btcjson.ListTransactionsResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as an array of listtransaction result objects.\n\tvar transactions []btcjson.ListTransactionsResult\n\terr = json.Unmarshal(res, &transactions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn transactions, nil\n}\n\n// ListTransactionsAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See ListTransactions for the blocking version and more details.\nfunc (c *Client) ListTransactionsAsync(account string) FutureListTransactionsResult {\n\tcmd := btcjson.NewListTransactionsCmd(&account, nil, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListTransactions returns a list of the most recent transactions.\n//\n// See the ListTransactionsCount and ListTransactionsCountFrom to control the\n// number of transactions returned and starting point, respectively.\nfunc (c *Client) ListTransactions(account string) ([]btcjson.ListTransactionsResult, error) {\n\treturn c.ListTransactionsAsync(account).Receive()\n}\n\n// ListTransactionsCountAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListTransactionsCount for the blocking version and more details.\nfunc (c *Client) ListTransactionsCountAsync(account string, count int) FutureListTransactionsResult {\n\tcmd := btcjson.NewListTransactionsCmd(&account, &count, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListTransactionsCount returns a list of the most recent transactions up\n// to the passed count.\n//\n// See the ListTransactions and ListTransactionsCountFrom functions for\n// different options.\nfunc (c *Client) ListTransactionsCount(account string, count int) ([]btcjson.ListTransactionsResult, error) {\n\treturn c.ListTransactionsCountAsync(account, count).Receive()\n}\n\n// ListTransactionsCountFromAsync returns an instance of a type that can be used\n// to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListTransactionsCountFrom for the blocking version and more details.\nfunc (c *Client) ListTransactionsCountFromAsync(account string, count, from int) FutureListTransactionsResult {\n\tcmd := btcjson.NewListTransactionsCmd(&account, &count, &from, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListTransactionsCountFrom returns a list of the most recent transactions up\n// to the passed count while skipping the first 'from' transactions.\n//\n// See the ListTransactions and ListTransactionsCount functions to use defaults.\nfunc (c *Client) ListTransactionsCountFrom(account string, count, from int) ([]btcjson.ListTransactionsResult, error) {\n\treturn c.ListTransactionsCountFromAsync(account, count, from).Receive()\n}\n\n// ListTransactionsCountFromWatchOnlyAsync returns an instance of a type that can be used\n// to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListTransactionsCountFromWatchOnly for the blocking version and more details.\nfunc (c *Client) ListTransactionsCountFromWatchOnlyAsync(account string, count, from int, watchOnly bool) FutureListTransactionsResult {\n\tcmd := btcjson.NewListTransactionsCmd(&account, &count, &from, &watchOnly)\n\treturn c.SendCmd(cmd)\n}\n\n// ListTransactionsCountFromWatchOnly returns a list of the most recent transactions up\n// to the passed count while skipping the first 'from' transactions. It will include or\n// exclude transactions from watch-only addresses based on the passed value for the watchOnly parameter\n//\n// See the ListTransactions and ListTransactionsCount functions to use defaults.\nfunc (c *Client) ListTransactionsCountFromWatchOnly(account string, count, from int, watchOnly bool) ([]btcjson.ListTransactionsResult, error) {\n\treturn c.ListTransactionsCountFromWatchOnlyAsync(account, count, from, watchOnly).Receive()\n}\n\n// FutureListUnspentResult is a future promise to deliver the result of a\n// ListUnspentAsync, ListUnspentMinAsync, ListUnspentMinMaxAsync, or\n// ListUnspentMinMaxAddressesAsync RPC invocation (or an applicable error).\ntype FutureListUnspentResult chan *Response\n\n// Receive waits for the Response promised by the future and returns all\n// unspent wallet transaction outputs returned by the RPC call.  If the\n// future wac returned by a call to ListUnspentMinAsync, ListUnspentMinMaxAsync,\n// or ListUnspentMinMaxAddressesAsync, the range may be limited by the\n// parameters of the RPC invocation.\nfunc (r FutureListUnspentResult) Receive() ([]btcjson.ListUnspentResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as an array of listunspent results.\n\tvar unspent []btcjson.ListUnspentResult\n\terr = json.Unmarshal(res, &unspent)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn unspent, nil\n}\n\n// ListUnspentAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function\n// on the returned instance.\n//\n// See ListUnspent for the blocking version and more details.\nfunc (c *Client) ListUnspentAsync() FutureListUnspentResult {\n\tcmd := btcjson.NewListUnspentCmd(nil, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListUnspentMinAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function\n// on the returned instance.\n//\n// See ListUnspentMin for the blocking version and more details.\nfunc (c *Client) ListUnspentMinAsync(minConf int) FutureListUnspentResult {\n\tcmd := btcjson.NewListUnspentCmd(&minConf, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListUnspentMinMaxAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function\n// on the returned instance.\n//\n// See ListUnspentMinMax for the blocking version and more details.\nfunc (c *Client) ListUnspentMinMaxAsync(minConf, maxConf int) FutureListUnspentResult {\n\tcmd := btcjson.NewListUnspentCmd(&minConf, &maxConf, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListUnspentMinMaxAddressesAsync returns an instance of a type that can be\n// used to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListUnspentMinMaxAddresses for the blocking version and more details.\nfunc (c *Client) ListUnspentMinMaxAddressesAsync(minConf, maxConf int, addrs []btcutil.Address) FutureListUnspentResult {\n\taddrStrs := make([]string, 0, len(addrs))\n\tfor _, a := range addrs {\n\t\taddrStrs = append(addrStrs, a.EncodeAddress())\n\t}\n\n\tcmd := btcjson.NewListUnspentCmd(&minConf, &maxConf, &addrStrs)\n\treturn c.SendCmd(cmd)\n}\n\n// ListUnspent returns all unspent transaction outputs known to a wallet, using\n// the default number of minimum and maximum number of confirmations as a\n// filter (1 and 999999, respectively).\nfunc (c *Client) ListUnspent() ([]btcjson.ListUnspentResult, error) {\n\treturn c.ListUnspentAsync().Receive()\n}\n\n// ListUnspentMin returns all unspent transaction outputs known to a wallet,\n// using the specified number of minimum confirmations and default number of\n// maximum confirmations (999999) as a filter.\nfunc (c *Client) ListUnspentMin(minConf int) ([]btcjson.ListUnspentResult, error) {\n\treturn c.ListUnspentMinAsync(minConf).Receive()\n}\n\n// ListUnspentMinMax returns all unspent transaction outputs known to a wallet,\n// using the specified number of minimum and maximum number of confirmations as\n// a filter.\nfunc (c *Client) ListUnspentMinMax(minConf, maxConf int) ([]btcjson.ListUnspentResult, error) {\n\treturn c.ListUnspentMinMaxAsync(minConf, maxConf).Receive()\n}\n\n// ListUnspentMinMaxAddresses returns all unspent transaction outputs that pay\n// to any of specified addresses in a wallet using the specified number of\n// minimum and maximum number of confirmations as a filter.\nfunc (c *Client) ListUnspentMinMaxAddresses(minConf, maxConf int, addrs []btcutil.Address) ([]btcjson.ListUnspentResult, error) {\n\treturn c.ListUnspentMinMaxAddressesAsync(minConf, maxConf, addrs).Receive()\n}\n\n// FutureListSinceBlockResult is a future promise to deliver the result of a\n// ListSinceBlockAsync or ListSinceBlockMinConfAsync RPC invocation (or an\n// applicable error).\ntype FutureListSinceBlockResult chan *Response\n\n// Receive waits for the Response promised by the future and returns all\n// transactions added in blocks since the specified block hash, or all\n// transactions if it is nil.\nfunc (r FutureListSinceBlockResult) Receive() (*btcjson.ListSinceBlockResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a listsinceblock result object.\n\tvar listResult btcjson.ListSinceBlockResult\n\terr = json.Unmarshal(res, &listResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &listResult, nil\n}\n\n// ListSinceBlockAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See ListSinceBlock for the blocking version and more details.\nfunc (c *Client) ListSinceBlockAsync(blockHash *chainhash.Hash) FutureListSinceBlockResult {\n\tvar hash *string\n\tif blockHash != nil {\n\t\thash = btcjson.String(blockHash.String())\n\t}\n\n\tcmd := btcjson.NewListSinceBlockCmd(hash, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListSinceBlock returns all transactions added in blocks since the specified\n// block hash, or all transactions if it is nil, using the default number of\n// minimum confirmations as a filter.\n//\n// See ListSinceBlockMinConf to override the minimum number of confirmations.\n// See ListSinceBlockMinConfWatchOnly to override the minimum number of confirmations and watch only parameter.\nfunc (c *Client) ListSinceBlock(blockHash *chainhash.Hash) (*btcjson.ListSinceBlockResult, error) {\n\treturn c.ListSinceBlockAsync(blockHash).Receive()\n}\n\n// ListSinceBlockMinConfAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListSinceBlockMinConf for the blocking version and more details.\nfunc (c *Client) ListSinceBlockMinConfAsync(blockHash *chainhash.Hash, minConfirms int) FutureListSinceBlockResult {\n\tvar hash *string\n\tif blockHash != nil {\n\t\thash = btcjson.String(blockHash.String())\n\t}\n\n\tcmd := btcjson.NewListSinceBlockCmd(hash, &minConfirms, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListSinceBlockMinConf returns all transactions added in blocks since the\n// specified block hash, or all transactions if it is nil, using the specified\n// number of minimum confirmations as a filter.\n//\n// See ListSinceBlock to use the default minimum number of confirmations.\nfunc (c *Client) ListSinceBlockMinConf(blockHash *chainhash.Hash, minConfirms int) (*btcjson.ListSinceBlockResult, error) {\n\treturn c.ListSinceBlockMinConfAsync(blockHash, minConfirms).Receive()\n}\n\n// ListSinceBlockMinConfWatchOnlyAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListSinceBlockMinConfWatchOnly for the blocking version and more details.\nfunc (c *Client) ListSinceBlockMinConfWatchOnlyAsync(blockHash *chainhash.Hash, minConfirms int, watchOnly bool) FutureListSinceBlockResult {\n\tvar hash *string\n\tif blockHash != nil {\n\t\thash = btcjson.String(blockHash.String())\n\t}\n\n\tcmd := btcjson.NewListSinceBlockCmd(hash, &minConfirms, &watchOnly)\n\treturn c.SendCmd(cmd)\n}\n\n// ListSinceBlockMinConfWatchOnly returns all transactions added in blocks since the\n// specified block hash, or all transactions if it is nil, using the specified\n// number of minimum confirmations as a filter.\n//\n// See ListSinceBlock to use the default minimum number of confirmations and default watch only parameter.\nfunc (c *Client) ListSinceBlockMinConfWatchOnly(blockHash *chainhash.Hash, minConfirms int, watchOnly bool) (*btcjson.ListSinceBlockResult, error) {\n\treturn c.ListSinceBlockMinConfWatchOnlyAsync(blockHash, minConfirms, watchOnly).Receive()\n}\n\n// **************************\n// Transaction Send Functions\n// **************************\n\n// FutureLockUnspentResult is a future promise to deliver the error result of a\n// LockUnspentAsync RPC invocation.\ntype FutureLockUnspentResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of locking or unlocking the unspent output(s).\nfunc (r FutureLockUnspentResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// LockUnspentAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See LockUnspent for the blocking version and more details.\nfunc (c *Client) LockUnspentAsync(unlock bool, ops []*wire.OutPoint) FutureLockUnspentResult {\n\toutputs := make([]btcjson.TransactionInput, len(ops))\n\tfor i, op := range ops {\n\t\toutputs[i] = btcjson.TransactionInput{\n\t\t\tTxid: op.Hash.String(),\n\t\t\tVout: op.Index,\n\t\t}\n\t}\n\tcmd := btcjson.NewLockUnspentCmd(unlock, outputs)\n\treturn c.SendCmd(cmd)\n}\n\n// LockUnspent marks outputs as locked or unlocked, depending on the value of\n// the unlock bool.  When locked, the unspent output will not be selected as\n// input for newly created, non-raw transactions, and will not be returned in\n// future ListUnspent results, until the output is marked unlocked again.\n//\n// If unlock is false, each outpoint in ops will be marked locked.  If unlocked\n// is true and specific outputs are specified in ops (len != 0), exactly those\n// outputs will be marked unlocked.  If unlocked is true and no outpoints are\n// specified, all previous locked outputs are marked unlocked.\n//\n// The locked or unlocked state of outputs are not written to disk and after\n// restarting a wallet process, this data will be reset (every output unlocked).\n//\n// NOTE: While this method would be a bit more readable if the unlock bool was\n// reversed (that is, LockUnspent(true, ...) locked the outputs), it has been\n// left as unlock to keep compatibility with the reference client API and to\n// avoid confusion for those who are already familiar with the lockunspent RPC.\nfunc (c *Client) LockUnspent(unlock bool, ops []*wire.OutPoint) error {\n\treturn c.LockUnspentAsync(unlock, ops).Receive()\n}\n\n// FutureListLockUnspentResult is a future promise to deliver the result of a\n// ListLockUnspentAsync RPC invocation (or an applicable error).\ntype FutureListLockUnspentResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of all currently locked unspent outputs.\nfunc (r FutureListLockUnspentResult) Receive() ([]*wire.OutPoint, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal as an array of transaction inputs.\n\tvar inputs []btcjson.TransactionInput\n\terr = json.Unmarshal(res, &inputs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Create a slice of outpoints from the transaction input structs.\n\tops := make([]*wire.OutPoint, len(inputs))\n\tfor i, input := range inputs {\n\t\tsha, err := chainhash.NewHashFromStr(input.Txid)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tops[i] = wire.NewOutPoint(sha, input.Vout)\n\t}\n\n\treturn ops, nil\n}\n\n// ListLockUnspentAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See ListLockUnspent for the blocking version and more details.\nfunc (c *Client) ListLockUnspentAsync() FutureListLockUnspentResult {\n\tcmd := btcjson.NewListLockUnspentCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// ListLockUnspent returns a slice of outpoints for all unspent outputs marked\n// as locked by a wallet.  Unspent outputs may be marked locked using\n// LockOutput.\nfunc (c *Client) ListLockUnspent() ([]*wire.OutPoint, error) {\n\treturn c.ListLockUnspentAsync().Receive()\n}\n\n// FutureSetTxFeeResult is a future promise to deliver the result of a\n// SetTxFeeAsync RPC invocation (or an applicable error).\ntype FutureSetTxFeeResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of setting an optional transaction fee per KB that helps ensure transactions\n// are processed quickly.  Most transaction are 1KB.\nfunc (r FutureSetTxFeeResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// SetTxFeeAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See SetTxFee for the blocking version and more details.\nfunc (c *Client) SetTxFeeAsync(fee btcutil.Amount) FutureSetTxFeeResult {\n\tcmd := btcjson.NewSetTxFeeCmd(fee.ToBTC())\n\treturn c.SendCmd(cmd)\n}\n\n// SetTxFee sets an optional transaction fee per KB that helps ensure\n// transactions are processed quickly.  Most transaction are 1KB.\nfunc (c *Client) SetTxFee(fee btcutil.Amount) error {\n\treturn c.SetTxFeeAsync(fee).Receive()\n}\n\n// FutureSendToAddressResult is a future promise to deliver the result of a\n// SendToAddressAsync RPC invocation (or an applicable error).\ntype FutureSendToAddressResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the hash\n// of the transaction sending the passed amount to the given address.\nfunc (r FutureSendToAddressResult) Receive() (*chainhash.Hash, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar txHash string\n\terr = json.Unmarshal(res, &txHash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn chainhash.NewHashFromStr(txHash)\n}\n\n// SendToAddressAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See SendToAddress for the blocking version and more details.\nfunc (c *Client) SendToAddressAsync(address btcutil.Address, amount btcutil.Amount) FutureSendToAddressResult {\n\taddr := address.EncodeAddress()\n\tcmd := btcjson.NewSendToAddressCmd(addr, amount.ToBTC(), nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// SendToAddress sends the passed amount to the given address.\n//\n// See SendToAddressComment to associate comments with the transaction in the\n// wallet.  The comments are not part of the transaction and are only internal\n// to the wallet.\n//\n// NOTE: This function requires to the wallet to be unlocked.  See the\n// WalletPassphrase function for more details.\nfunc (c *Client) SendToAddress(address btcutil.Address, amount btcutil.Amount) (*chainhash.Hash, error) {\n\treturn c.SendToAddressAsync(address, amount).Receive()\n}\n\n// SendToAddressCommentAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See SendToAddressComment for the blocking version and more details.\nfunc (c *Client) SendToAddressCommentAsync(address btcutil.Address,\n\tamount btcutil.Amount, comment,\n\tcommentTo string) FutureSendToAddressResult {\n\n\taddr := address.EncodeAddress()\n\tcmd := btcjson.NewSendToAddressCmd(addr, amount.ToBTC(), &comment,\n\t\t&commentTo)\n\treturn c.SendCmd(cmd)\n}\n\n// SendToAddressComment sends the passed amount to the given address and stores\n// the provided comment and comment to in the wallet.  The comment parameter is\n// intended to be used for the purpose of the transaction while the commentTo\n// parameter is intended to be used for who the transaction is being sent to.\n//\n// The comments are not part of the transaction and are only internal\n// to the wallet.\n//\n// See SendToAddress to avoid using comments.\n//\n// NOTE: This function requires to the wallet to be unlocked.  See the\n// WalletPassphrase function for more details.\nfunc (c *Client) SendToAddressComment(address btcutil.Address, amount btcutil.Amount, comment, commentTo string) (*chainhash.Hash, error) {\n\treturn c.SendToAddressCommentAsync(address, amount, comment,\n\t\tcommentTo).Receive()\n}\n\n// FutureSendFromResult is a future promise to deliver the result of a\n// SendFromAsync, SendFromMinConfAsync, or SendFromCommentAsync RPC invocation\n// (or an applicable error).\ntype FutureSendFromResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the hash\n// of the transaction sending amount to the given address using the provided\n// account as a source of funds.\nfunc (r FutureSendFromResult) Receive() (*chainhash.Hash, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar txHash string\n\terr = json.Unmarshal(res, &txHash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn chainhash.NewHashFromStr(txHash)\n}\n\n// SendFromAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See SendFrom for the blocking version and more details.\nfunc (c *Client) SendFromAsync(fromAccount string, toAddress btcutil.Address, amount btcutil.Amount) FutureSendFromResult {\n\taddr := toAddress.EncodeAddress()\n\tcmd := btcjson.NewSendFromCmd(fromAccount, addr, amount.ToBTC(), nil,\n\t\tnil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// SendFrom sends the passed amount to the given address using the provided\n// account as a source of funds.  Only funds with the default number of minimum\n// confirmations will be used.\n//\n// See SendFromMinConf and SendFromComment for different options.\n//\n// NOTE: This function requires to the wallet to be unlocked.  See the\n// WalletPassphrase function for more details.\nfunc (c *Client) SendFrom(fromAccount string, toAddress btcutil.Address, amount btcutil.Amount) (*chainhash.Hash, error) {\n\treturn c.SendFromAsync(fromAccount, toAddress, amount).Receive()\n}\n\n// SendFromMinConfAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See SendFromMinConf for the blocking version and more details.\nfunc (c *Client) SendFromMinConfAsync(fromAccount string, toAddress btcutil.Address, amount btcutil.Amount, minConfirms int) FutureSendFromResult {\n\taddr := toAddress.EncodeAddress()\n\tcmd := btcjson.NewSendFromCmd(fromAccount, addr, amount.ToBTC(),\n\t\t&minConfirms, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// SendFromMinConf sends the passed amount to the given address using the\n// provided account as a source of funds.  Only funds with the passed number of\n// minimum confirmations will be used.\n//\n// See SendFrom to use the default number of minimum confirmations and\n// SendFromComment for additional options.\n//\n// NOTE: This function requires to the wallet to be unlocked.  See the\n// WalletPassphrase function for more details.\nfunc (c *Client) SendFromMinConf(fromAccount string, toAddress btcutil.Address, amount btcutil.Amount, minConfirms int) (*chainhash.Hash, error) {\n\treturn c.SendFromMinConfAsync(fromAccount, toAddress, amount,\n\t\tminConfirms).Receive()\n}\n\n// SendFromCommentAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See SendFromComment for the blocking version and more details.\nfunc (c *Client) SendFromCommentAsync(fromAccount string,\n\ttoAddress btcutil.Address, amount btcutil.Amount, minConfirms int,\n\tcomment, commentTo string) FutureSendFromResult {\n\n\taddr := toAddress.EncodeAddress()\n\tcmd := btcjson.NewSendFromCmd(fromAccount, addr, amount.ToBTC(),\n\t\t&minConfirms, &comment, &commentTo)\n\treturn c.SendCmd(cmd)\n}\n\n// SendFromComment sends the passed amount to the given address using the\n// provided account as a source of funds and stores the provided comment and\n// comment to in the wallet.  The comment parameter is intended to be used for\n// the purpose of the transaction while the commentTo parameter is intended to\n// be used for who the transaction is being sent to.  Only funds with the passed\n// number of minimum confirmations will be used.\n//\n// See SendFrom and SendFromMinConf to use defaults.\n//\n// NOTE: This function requires to the wallet to be unlocked.  See the\n// WalletPassphrase function for more details.\nfunc (c *Client) SendFromComment(fromAccount string, toAddress btcutil.Address,\n\tamount btcutil.Amount, minConfirms int,\n\tcomment, commentTo string) (*chainhash.Hash, error) {\n\n\treturn c.SendFromCommentAsync(fromAccount, toAddress, amount,\n\t\tminConfirms, comment, commentTo).Receive()\n}\n\n// FutureSendManyResult is a future promise to deliver the result of a\n// SendManyAsync, SendManyMinConfAsync, or SendManyCommentAsync RPC invocation\n// (or an applicable error).\ntype FutureSendManyResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the hash\n// of the transaction sending multiple amounts to multiple addresses using the\n// provided account as a source of funds.\nfunc (r FutureSendManyResult) Receive() (*chainhash.Hash, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmashal result as a string.\n\tvar txHash string\n\terr = json.Unmarshal(res, &txHash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn chainhash.NewHashFromStr(txHash)\n}\n\n// SendManyAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See SendMany for the blocking version and more details.\nfunc (c *Client) SendManyAsync(fromAccount string, amounts map[btcutil.Address]btcutil.Amount) FutureSendManyResult {\n\tconvertedAmounts := make(map[string]float64, len(amounts))\n\tfor addr, amount := range amounts {\n\t\tconvertedAmounts[addr.EncodeAddress()] = amount.ToBTC()\n\t}\n\tcmd := btcjson.NewSendManyCmd(fromAccount, convertedAmounts, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// SendMany sends multiple amounts to multiple addresses using the provided\n// account as a source of funds in a single transaction.  Only funds with the\n// default number of minimum confirmations will be used.\n//\n// See SendManyMinConf and SendManyComment for different options.\n//\n// NOTE: This function requires to the wallet to be unlocked.  See the\n// WalletPassphrase function for more details.\nfunc (c *Client) SendMany(fromAccount string, amounts map[btcutil.Address]btcutil.Amount) (*chainhash.Hash, error) {\n\treturn c.SendManyAsync(fromAccount, amounts).Receive()\n}\n\n// SendManyMinConfAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See SendManyMinConf for the blocking version and more details.\nfunc (c *Client) SendManyMinConfAsync(fromAccount string,\n\tamounts map[btcutil.Address]btcutil.Amount,\n\tminConfirms int) FutureSendManyResult {\n\n\tconvertedAmounts := make(map[string]float64, len(amounts))\n\tfor addr, amount := range amounts {\n\t\tconvertedAmounts[addr.EncodeAddress()] = amount.ToBTC()\n\t}\n\tcmd := btcjson.NewSendManyCmd(fromAccount, convertedAmounts,\n\t\t&minConfirms, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// SendManyMinConf sends multiple amounts to multiple addresses using the\n// provided account as a source of funds in a single transaction.  Only funds\n// with the passed number of minimum confirmations will be used.\n//\n// See SendMany to use the default number of minimum confirmations and\n// SendManyComment for additional options.\n//\n// NOTE: This function requires to the wallet to be unlocked.  See the\n// WalletPassphrase function for more details.\nfunc (c *Client) SendManyMinConf(fromAccount string,\n\tamounts map[btcutil.Address]btcutil.Amount,\n\tminConfirms int) (*chainhash.Hash, error) {\n\n\treturn c.SendManyMinConfAsync(fromAccount, amounts, minConfirms).Receive()\n}\n\n// SendManyCommentAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See SendManyComment for the blocking version and more details.\nfunc (c *Client) SendManyCommentAsync(fromAccount string,\n\tamounts map[btcutil.Address]btcutil.Amount, minConfirms int,\n\tcomment string) FutureSendManyResult {\n\n\tconvertedAmounts := make(map[string]float64, len(amounts))\n\tfor addr, amount := range amounts {\n\t\tconvertedAmounts[addr.EncodeAddress()] = amount.ToBTC()\n\t}\n\tcmd := btcjson.NewSendManyCmd(fromAccount, convertedAmounts,\n\t\t&minConfirms, &comment)\n\treturn c.SendCmd(cmd)\n}\n\n// SendManyComment sends multiple amounts to multiple addresses using the\n// provided account as a source of funds in a single transaction and stores the\n// provided comment in the wallet.  The comment parameter is intended to be used\n// for the purpose of the transaction   Only funds with the passed number of\n// minimum confirmations will be used.\n//\n// See SendMany and SendManyMinConf to use defaults.\n//\n// NOTE: This function requires to the wallet to be unlocked.  See the\n// WalletPassphrase function for more details.\nfunc (c *Client) SendManyComment(fromAccount string,\n\tamounts map[btcutil.Address]btcutil.Amount, minConfirms int,\n\tcomment string) (*chainhash.Hash, error) {\n\n\treturn c.SendManyCommentAsync(fromAccount, amounts, minConfirms,\n\t\tcomment).Receive()\n}\n\n// *************************\n// Address/Account Functions\n// *************************\n\n// FutureAddMultisigAddressResult is a future promise to deliver the result of a\n// AddMultisigAddressAsync RPC invocation (or an applicable error).\ntype FutureAddMultisigAddressResult struct {\n\tresponseChannel chan *Response\n\tnetwork         *chaincfg.Params\n}\n\n// Receive waits for the Response promised by the future and returns the\n// multisignature address that requires the specified number of signatures for\n// the provided addresses.\nfunc (r FutureAddMultisigAddressResult) Receive() (btcutil.Address, error) {\n\tres, err := ReceiveFuture(r.responseChannel)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar addr string\n\terr = json.Unmarshal(res, &addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn btcutil.DecodeAddress(addr, r.network)\n}\n\n// AddMultisigAddressAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See AddMultisigAddress for the blocking version and more details.\nfunc (c *Client) AddMultisigAddressAsync(requiredSigs int, addresses []btcutil.Address, account string) FutureAddMultisigAddressResult {\n\taddrs := make([]string, 0, len(addresses))\n\tfor _, addr := range addresses {\n\t\taddrs = append(addrs, addr.String())\n\t}\n\n\tcmd := btcjson.NewAddMultisigAddressCmd(requiredSigs, addrs, &account)\n\tresult := FutureAddMultisigAddressResult{\n\t\tnetwork:         c.chainParams,\n\t\tresponseChannel: c.SendCmd(cmd),\n\t}\n\treturn result\n}\n\n// AddMultisigAddress adds a multisignature address that requires the specified\n// number of signatures for the provided addresses to the wallet.\nfunc (c *Client) AddMultisigAddress(requiredSigs int, addresses []btcutil.Address, account string) (btcutil.Address, error) {\n\treturn c.AddMultisigAddressAsync(requiredSigs, addresses, account).Receive()\n}\n\n// FutureCreateMultisigResult is a future promise to deliver the result of a\n// CreateMultisigAsync RPC invocation (or an applicable error).\ntype FutureCreateMultisigResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// multisignature address and script needed to redeem it.\nfunc (r FutureCreateMultisigResult) Receive() (*btcjson.CreateMultiSigResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a createmultisig result object.\n\tvar multisigRes btcjson.CreateMultiSigResult\n\terr = json.Unmarshal(res, &multisigRes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &multisigRes, nil\n}\n\n// CreateMultisigAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See CreateMultisig for the blocking version and more details.\nfunc (c *Client) CreateMultisigAsync(requiredSigs int, addresses []btcutil.Address) FutureCreateMultisigResult {\n\taddrs := make([]string, 0, len(addresses))\n\tfor _, addr := range addresses {\n\t\taddrs = append(addrs, addr.String())\n\t}\n\n\tcmd := btcjson.NewCreateMultisigCmd(requiredSigs, addrs)\n\treturn c.SendCmd(cmd)\n}\n\n// CreateMultisig creates a multisignature address that requires the specified\n// number of signatures for the provided addresses and returns the\n// multisignature address and script needed to redeem it.\nfunc (c *Client) CreateMultisig(requiredSigs int, addresses []btcutil.Address) (*btcjson.CreateMultiSigResult, error) {\n\treturn c.CreateMultisigAsync(requiredSigs, addresses).Receive()\n}\n\n// FutureCreateNewAccountResult is a future promise to deliver the result of a\n// CreateNewAccountAsync RPC invocation (or an applicable error).\ntype FutureCreateNewAccountResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// result of creating new account.\nfunc (r FutureCreateNewAccountResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// CreateNewAccountAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See CreateNewAccount for the blocking version and more details.\nfunc (c *Client) CreateNewAccountAsync(account string) FutureCreateNewAccountResult {\n\tcmd := btcjson.NewCreateNewAccountCmd(account)\n\treturn c.SendCmd(cmd)\n}\n\n// CreateNewAccount creates a new wallet account.\nfunc (c *Client) CreateNewAccount(account string) error {\n\treturn c.CreateNewAccountAsync(account).Receive()\n}\n\n// FutureCreateWalletResult is a future promise to deliver the result of a\n// CreateWalletAsync RPC invocation (or an applicable error).\ntype FutureCreateWalletResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// result of creating a new wallet.\nfunc (r FutureCreateWalletResult) Receive() (*btcjson.CreateWalletResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar createWalletResult btcjson.CreateWalletResult\n\terr = json.Unmarshal(res, &createWalletResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &createWalletResult, nil\n}\n\n// CreateWalletOpt defines a functional-option to be used with CreateWallet\n// method.\ntype CreateWalletOpt func(*btcjson.CreateWalletCmd)\n\n// WithCreateWalletDisablePrivateKeys disables the possibility of private keys\n// to be used with a wallet created using the CreateWallet method. Using this\n// option will make the wallet watch-only.\nfunc WithCreateWalletDisablePrivateKeys() CreateWalletOpt {\n\treturn func(c *btcjson.CreateWalletCmd) {\n\t\tc.DisablePrivateKeys = btcjson.Bool(true)\n\t}\n}\n\n// WithCreateWalletBlank specifies creation of a blank wallet.\nfunc WithCreateWalletBlank() CreateWalletOpt {\n\treturn func(c *btcjson.CreateWalletCmd) {\n\t\tc.Blank = btcjson.Bool(true)\n\t}\n}\n\n// WithCreateWalletPassphrase specifies a passphrase to encrypt the wallet\n// with.\nfunc WithCreateWalletPassphrase(value string) CreateWalletOpt {\n\treturn func(c *btcjson.CreateWalletCmd) {\n\t\tc.Passphrase = btcjson.String(value)\n\t}\n}\n\n// WithCreateWalletAvoidReuse specifies keeping track of coin reuse, and\n// treat dirty and clean coins differently with privacy considerations in mind.\nfunc WithCreateWalletAvoidReuse() CreateWalletOpt {\n\treturn func(c *btcjson.CreateWalletCmd) {\n\t\tc.AvoidReuse = btcjson.Bool(true)\n\t}\n}\n\n// CreateWalletAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See CreateWallet for the blocking version and more details.\nfunc (c *Client) CreateWalletAsync(name string, opts ...CreateWalletOpt) FutureCreateWalletResult {\n\tcmd := btcjson.NewCreateWalletCmd(name, nil, nil, nil, nil)\n\n\t// Apply each specified option to mutate the default command.\n\tfor _, opt := range opts {\n\t\topt(cmd)\n\t}\n\n\treturn c.SendCmd(cmd)\n}\n\n// CreateWallet creates a new wallet account, with the possibility to use\n// private keys.\n//\n// Optional parameters can be specified using functional-options pattern. The\n// following functions are available:\n//   - WithCreateWalletDisablePrivateKeys\n//   - WithCreateWalletBlank\n//   - WithCreateWalletPassphrase\n//   - WithCreateWalletAvoidReuse\nfunc (c *Client) CreateWallet(name string, opts ...CreateWalletOpt) (*btcjson.CreateWalletResult, error) {\n\treturn c.CreateWalletAsync(name, opts...).Receive()\n}\n\n// FutureGetAddressInfoResult is a future promise to deliver the result of an\n// GetAddressInfoAsync RPC invocation (or an applicable error).\ntype FutureGetAddressInfoResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the information\n// about the given bitcoin address.\nfunc (r FutureGetAddressInfoResult) Receive() (*btcjson.GetAddressInfoResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar getAddressInfoResult btcjson.GetAddressInfoResult\n\terr = json.Unmarshal(res, &getAddressInfoResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &getAddressInfoResult, nil\n}\n\n// GetAddressInfoAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetAddressInfo for the blocking version and more details.\nfunc (c *Client) GetAddressInfoAsync(address string) FutureGetAddressInfoResult {\n\tcmd := btcjson.NewGetAddressInfoCmd(address)\n\treturn c.SendCmd(cmd)\n}\n\n// GetAddressInfo returns information about the given bitcoin address.\nfunc (c *Client) GetAddressInfo(address string) (*btcjson.GetAddressInfoResult, error) {\n\treturn c.GetAddressInfoAsync(address).Receive()\n}\n\n// FutureGetNewAddressResult is a future promise to deliver the result of a\n// GetNewAddressAsync RPC invocation (or an applicable error).\ntype FutureGetNewAddressResult struct {\n\tresponseChannel chan *Response\n\tnetwork         *chaincfg.Params\n}\n\n// Receive waits for the Response promised by the future and returns a new\n// address.\nfunc (r FutureGetNewAddressResult) Receive() (btcutil.Address, error) {\n\tres, err := ReceiveFuture(r.responseChannel)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar addr string\n\terr = json.Unmarshal(res, &addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn btcutil.DecodeAddress(addr, r.network)\n}\n\n// GetNewAddressAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetNewAddress for the blocking version and more details.\nfunc (c *Client) GetNewAddressAsync(account string) FutureGetNewAddressResult {\n\tcmd := btcjson.NewGetNewAddressCmd(&account, nil)\n\tresult := FutureGetNewAddressResult{\n\t\tnetwork:         c.chainParams,\n\t\tresponseChannel: c.SendCmd(cmd),\n\t}\n\treturn result\n}\n\n// GetNewAddress returns a new address, and decodes based on the client's\n// chain params.\nfunc (c *Client) GetNewAddress(account string) (btcutil.Address, error) {\n\treturn c.GetNewAddressAsync(account).Receive()\n}\n\n// GetNewAddressTypeAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetNewAddressType for the blocking version and more details.\nfunc (c *Client) GetNewAddressTypeAsync(account, addrType string) FutureGetNewAddressResult {\n\tcmd := btcjson.NewGetNewAddressCmd(&account, &addrType)\n\tresult := FutureGetNewAddressResult{\n\t\tnetwork:         c.chainParams,\n\t\tresponseChannel: c.SendCmd(cmd),\n\t}\n\treturn result\n}\n\n// GetNewAddressType returns a new address, and decodes based on the client's\n// chain params.\nfunc (c *Client) GetNewAddressType(account, addrType string) (btcutil.Address, error) {\n\treturn c.GetNewAddressTypeAsync(account, addrType).Receive()\n}\n\n// FutureGetRawChangeAddressResult is a future promise to deliver the result of\n// a GetRawChangeAddressAsync RPC invocation (or an applicable error).\ntype FutureGetRawChangeAddressResult struct {\n\tresponseChannel chan *Response\n\tnetwork         *chaincfg.Params\n}\n\n// Receive waits for the Response promised by the future and returns a new\n// address for receiving change that will be associated with the provided\n// account.  Note that this is only for raw transactions and NOT for normal use.\nfunc (r FutureGetRawChangeAddressResult) Receive() (btcutil.Address, error) {\n\tres, err := ReceiveFuture(r.responseChannel)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar addr string\n\terr = json.Unmarshal(res, &addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn btcutil.DecodeAddress(addr, r.network)\n}\n\n// GetRawChangeAddressAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetRawChangeAddress for the blocking version and more details.\nfunc (c *Client) GetRawChangeAddressAsync(account string) FutureGetRawChangeAddressResult {\n\tcmd := btcjson.NewGetRawChangeAddressCmd(&account, nil)\n\tresult := FutureGetRawChangeAddressResult{\n\t\tnetwork:         c.chainParams,\n\t\tresponseChannel: c.SendCmd(cmd),\n\t}\n\treturn result\n}\n\n// GetRawChangeAddress returns a new address for receiving change that will be\n// associated with the provided account.  Note that this is only for raw\n// transactions and NOT for normal use.\nfunc (c *Client) GetRawChangeAddress(account string) (btcutil.Address, error) {\n\treturn c.GetRawChangeAddressAsync(account).Receive()\n}\n\n// GetRawChangeAddressTypeAsync returns an instance of a type that can be used\n// to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetRawChangeAddressType for the blocking version and more details.\nfunc (c *Client) GetRawChangeAddressTypeAsync(account, addrType string) FutureGetRawChangeAddressResult {\n\tcmd := btcjson.NewGetRawChangeAddressCmd(&account, &addrType)\n\tresult := FutureGetRawChangeAddressResult{\n\t\tnetwork:         c.chainParams,\n\t\tresponseChannel: c.SendCmd(cmd),\n\t}\n\treturn result\n}\n\n// GetRawChangeAddressType returns a new address for receiving change that will\n// be associated with the provided account.  Note that this is only for raw\n// transactions and NOT for normal use.\nfunc (c *Client) GetRawChangeAddressType(account, addrType string) (btcutil.Address, error) {\n\treturn c.GetRawChangeAddressTypeAsync(account, addrType).Receive()\n}\n\n// FutureAddWitnessAddressResult is a future promise to deliver the result of\n// a AddWitnessAddressAsync RPC invocation (or an applicable error).\ntype FutureAddWitnessAddressResult struct {\n\tresponseChannel chan *Response\n\tnetwork         *chaincfg.Params\n}\n\n// Receive waits for the Response promised by the future and returns the new\n// address.\nfunc (r FutureAddWitnessAddressResult) Receive() (btcutil.Address, error) {\n\tres, err := ReceiveFuture(r.responseChannel)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar addr string\n\terr = json.Unmarshal(res, &addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn btcutil.DecodeAddress(addr, r.network)\n}\n\n// AddWitnessAddressAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See AddWitnessAddress for the blocking version and more details.\nfunc (c *Client) AddWitnessAddressAsync(address string) FutureAddWitnessAddressResult {\n\tcmd := btcjson.NewAddWitnessAddressCmd(address)\n\tresponse := FutureAddWitnessAddressResult{\n\t\tnetwork:         c.chainParams,\n\t\tresponseChannel: c.SendCmd(cmd),\n\t}\n\treturn response\n}\n\n// AddWitnessAddress adds a witness address for a script and returns the new\n// address (P2SH of the witness script).\nfunc (c *Client) AddWitnessAddress(address string) (btcutil.Address, error) {\n\treturn c.AddWitnessAddressAsync(address).Receive()\n}\n\n// FutureGetAccountAddressResult is a future promise to deliver the result of a\n// GetAccountAddressAsync RPC invocation (or an applicable error).\ntype FutureGetAccountAddressResult struct {\n\tresponseChannel chan *Response\n\tnetwork         *chaincfg.Params\n}\n\n// Receive waits for the Response promised by the future and returns the current\n// Bitcoin address for receiving payments to the specified account.\nfunc (r FutureGetAccountAddressResult) Receive() (btcutil.Address, error) {\n\tres, err := ReceiveFuture(r.responseChannel)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar addr string\n\terr = json.Unmarshal(res, &addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn btcutil.DecodeAddress(addr, r.network)\n}\n\n// GetAccountAddressAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetAccountAddress for the blocking version and more details.\nfunc (c *Client) GetAccountAddressAsync(account string) FutureGetAccountAddressResult {\n\tcmd := btcjson.NewGetAccountAddressCmd(account)\n\tresult := FutureGetAccountAddressResult{\n\t\tnetwork:         c.chainParams,\n\t\tresponseChannel: c.SendCmd(cmd),\n\t}\n\treturn result\n}\n\n// GetAccountAddress returns the current Bitcoin address for receiving payments\n// to the specified account.\nfunc (c *Client) GetAccountAddress(account string) (btcutil.Address, error) {\n\treturn c.GetAccountAddressAsync(account).Receive()\n}\n\n// FutureGetAccountResult is a future promise to deliver the result of a\n// GetAccountAsync RPC invocation (or an applicable error).\ntype FutureGetAccountResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the account\n// associated with the passed address.\nfunc (r FutureGetAccountResult) Receive() (string, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar account string\n\terr = json.Unmarshal(res, &account)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn account, nil\n}\n\n// GetAccountAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetAccount for the blocking version and more details.\nfunc (c *Client) GetAccountAsync(address btcutil.Address) FutureGetAccountResult {\n\taddr := address.EncodeAddress()\n\tcmd := btcjson.NewGetAccountCmd(addr)\n\treturn c.SendCmd(cmd)\n}\n\n// GetAccount returns the account associated with the passed address.\nfunc (c *Client) GetAccount(address btcutil.Address) (string, error) {\n\treturn c.GetAccountAsync(address).Receive()\n}\n\n// FutureSetAccountResult is a future promise to deliver the result of a\n// SetAccountAsync RPC invocation (or an applicable error).\ntype FutureSetAccountResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of setting the account to be associated with the passed address.\nfunc (r FutureSetAccountResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// SetAccountAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See SetAccount for the blocking version and more details.\nfunc (c *Client) SetAccountAsync(address btcutil.Address, account string) FutureSetAccountResult {\n\taddr := address.EncodeAddress()\n\tcmd := btcjson.NewSetAccountCmd(addr, account)\n\treturn c.SendCmd(cmd)\n}\n\n// SetAccount sets the account associated with the passed address.\nfunc (c *Client) SetAccount(address btcutil.Address, account string) error {\n\treturn c.SetAccountAsync(address, account).Receive()\n}\n\n// FutureGetAddressesByAccountResult is a future promise to deliver the result\n// of a GetAddressesByAccountAsync RPC invocation (or an applicable error).\ntype FutureGetAddressesByAccountResult struct {\n\tresponseChannel chan *Response\n\tnetwork         *chaincfg.Params\n}\n\n// Receive waits for the Response promised by the future and returns the list of\n// addresses associated with the passed account.\nfunc (r FutureGetAddressesByAccountResult) Receive() ([]btcutil.Address, error) {\n\tres, err := ReceiveFuture(r.responseChannel)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmashal result as an array of string.\n\tvar addrStrings []string\n\terr = json.Unmarshal(res, &addrStrings)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\taddresses := make([]btcutil.Address, len(addrStrings))\n\tfor i, addrString := range addrStrings {\n\t\taddresses[i], err = btcutil.DecodeAddress(addrString, r.network)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn addresses, nil\n}\n\n// GetAddressesByAccountAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetAddressesByAccount for the blocking version and more details.\nfunc (c *Client) GetAddressesByAccountAsync(account string) FutureGetAddressesByAccountResult {\n\tcmd := btcjson.NewGetAddressesByAccountCmd(account)\n\tresult := FutureGetAddressesByAccountResult{\n\t\tnetwork:         c.chainParams,\n\t\tresponseChannel: c.SendCmd(cmd),\n\t}\n\treturn result\n}\n\n// GetAddressesByAccount returns the list of addresses associated with the\n// passed account.\nfunc (c *Client) GetAddressesByAccount(account string) ([]btcutil.Address, error) {\n\treturn c.GetAddressesByAccountAsync(account).Receive()\n}\n\n// FutureMoveResult is a future promise to deliver the result of a MoveAsync,\n// MoveMinConfAsync, or MoveCommentAsync RPC invocation (or an applicable\n// error).\ntype FutureMoveResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of the move operation.\nfunc (r FutureMoveResult) Receive() (bool, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Unmarshal result as a boolean.\n\tvar moveResult bool\n\terr = json.Unmarshal(res, &moveResult)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn moveResult, nil\n}\n\n// MoveAsync returns an instance of a type that can be used to get the result of\n// the RPC at some future time by invoking the Receive function on the returned\n// instance.\n//\n// See Move for the blocking version and more details.\nfunc (c *Client) MoveAsync(fromAccount, toAccount string, amount btcutil.Amount) FutureMoveResult {\n\tcmd := btcjson.NewMoveCmd(fromAccount, toAccount, amount.ToBTC(), nil,\n\t\tnil)\n\treturn c.SendCmd(cmd)\n}\n\n// Move moves specified amount from one account in your wallet to another.  Only\n// funds with the default number of minimum confirmations will be used.\n//\n// See MoveMinConf and MoveComment for different options.\nfunc (c *Client) Move(fromAccount, toAccount string, amount btcutil.Amount) (bool, error) {\n\treturn c.MoveAsync(fromAccount, toAccount, amount).Receive()\n}\n\n// MoveMinConfAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See MoveMinConf for the blocking version and more details.\nfunc (c *Client) MoveMinConfAsync(fromAccount, toAccount string,\n\tamount btcutil.Amount, minConfirms int) FutureMoveResult {\n\n\tcmd := btcjson.NewMoveCmd(fromAccount, toAccount, amount.ToBTC(),\n\t\t&minConfirms, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// MoveMinConf moves specified amount from one account in your wallet to\n// another.  Only funds with the passed number of minimum confirmations will be\n// used.\n//\n// See Move to use the default number of minimum confirmations and MoveComment\n// for additional options.\nfunc (c *Client) MoveMinConf(fromAccount, toAccount string, amount btcutil.Amount, minConf int) (bool, error) {\n\treturn c.MoveMinConfAsync(fromAccount, toAccount, amount, minConf).Receive()\n}\n\n// MoveCommentAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See MoveComment for the blocking version and more details.\nfunc (c *Client) MoveCommentAsync(fromAccount, toAccount string,\n\tamount btcutil.Amount, minConfirms int, comment string) FutureMoveResult {\n\n\tcmd := btcjson.NewMoveCmd(fromAccount, toAccount, amount.ToBTC(),\n\t\t&minConfirms, &comment)\n\treturn c.SendCmd(cmd)\n}\n\n// MoveComment moves specified amount from one account in your wallet to\n// another and stores the provided comment in the wallet.  The comment\n// parameter is only available in the wallet.  Only funds with the passed number\n// of minimum confirmations will be used.\n//\n// See Move and MoveMinConf to use defaults.\nfunc (c *Client) MoveComment(fromAccount, toAccount string, amount btcutil.Amount,\n\tminConf int, comment string) (bool, error) {\n\n\treturn c.MoveCommentAsync(fromAccount, toAccount, amount, minConf,\n\t\tcomment).Receive()\n}\n\n// FutureRenameAccountResult is a future promise to deliver the result of a\n// RenameAccountAsync RPC invocation (or an applicable error).\ntype FutureRenameAccountResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// result of creating new account.\nfunc (r FutureRenameAccountResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// RenameAccountAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See RenameAccount for the blocking version and more details.\nfunc (c *Client) RenameAccountAsync(oldAccount, newAccount string) FutureRenameAccountResult {\n\tcmd := btcjson.NewRenameAccountCmd(oldAccount, newAccount)\n\treturn c.SendCmd(cmd)\n}\n\n// RenameAccount creates a new wallet account.\nfunc (c *Client) RenameAccount(oldAccount, newAccount string) error {\n\treturn c.RenameAccountAsync(oldAccount, newAccount).Receive()\n}\n\n// FutureValidateAddressResult is a future promise to deliver the result of a\n// ValidateAddressAsync RPC invocation (or an applicable error).\ntype FutureValidateAddressResult chan *Response\n\n// Receive waits for the Response promised by the future and returns information\n// about the given bitcoin address.\nfunc (r FutureValidateAddressResult) Receive() (*btcjson.ValidateAddressWalletResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a validateaddress result object.\n\tvar addrResult btcjson.ValidateAddressWalletResult\n\terr = json.Unmarshal(res, &addrResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &addrResult, nil\n}\n\n// ValidateAddressAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See ValidateAddress for the blocking version and more details.\nfunc (c *Client) ValidateAddressAsync(address btcutil.Address) FutureValidateAddressResult {\n\taddr := address.EncodeAddress()\n\tcmd := btcjson.NewValidateAddressCmd(addr)\n\treturn c.SendCmd(cmd)\n}\n\n// ValidateAddress returns information about the given bitcoin address.\nfunc (c *Client) ValidateAddress(address btcutil.Address) (*btcjson.ValidateAddressWalletResult, error) {\n\treturn c.ValidateAddressAsync(address).Receive()\n}\n\n// FutureKeyPoolRefillResult is a future promise to deliver the result of a\n// KeyPoolRefillAsync RPC invocation (or an applicable error).\ntype FutureKeyPoolRefillResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of refilling the key pool.\nfunc (r FutureKeyPoolRefillResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// KeyPoolRefillAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See KeyPoolRefill for the blocking version and more details.\nfunc (c *Client) KeyPoolRefillAsync() FutureKeyPoolRefillResult {\n\tcmd := btcjson.NewKeyPoolRefillCmd(nil)\n\treturn c.SendCmd(cmd)\n}\n\n// KeyPoolRefill fills the key pool as necessary to reach the default size.\n//\n// See KeyPoolRefillSize to override the size of the key pool.\nfunc (c *Client) KeyPoolRefill() error {\n\treturn c.KeyPoolRefillAsync().Receive()\n}\n\n// KeyPoolRefillSizeAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See KeyPoolRefillSize for the blocking version and more details.\nfunc (c *Client) KeyPoolRefillSizeAsync(newSize uint) FutureKeyPoolRefillResult {\n\tcmd := btcjson.NewKeyPoolRefillCmd(&newSize)\n\treturn c.SendCmd(cmd)\n}\n\n// KeyPoolRefillSize fills the key pool as necessary to reach the specified\n// size.\nfunc (c *Client) KeyPoolRefillSize(newSize uint) error {\n\treturn c.KeyPoolRefillSizeAsync(newSize).Receive()\n}\n\n// ************************\n// Amount/Balance Functions\n// ************************\n\n// FutureListAccountsResult is a future promise to deliver the result of a\n// ListAccountsAsync or ListAccountsMinConfAsync RPC invocation (or an\n// applicable error).\ntype FutureListAccountsResult chan *Response\n\n// Receive waits for the Response promised by the future and returns returns a\n// map of account names and their associated balances.\nfunc (r FutureListAccountsResult) Receive() (map[string]btcutil.Amount, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a json object.\n\tvar accounts map[string]float64\n\terr = json.Unmarshal(res, &accounts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\taccountsMap := make(map[string]btcutil.Amount)\n\tfor k, v := range accounts {\n\t\tamount, err := btcutil.NewAmount(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\taccountsMap[k] = amount\n\t}\n\n\treturn accountsMap, nil\n}\n\n// ListAccountsAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See ListAccounts for the blocking version and more details.\nfunc (c *Client) ListAccountsAsync() FutureListAccountsResult {\n\tcmd := btcjson.NewListAccountsCmd(nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListAccounts returns a map of account names and their associated balances\n// using the default number of minimum confirmations.\n//\n// See ListAccountsMinConf to override the minimum number of confirmations.\nfunc (c *Client) ListAccounts() (map[string]btcutil.Amount, error) {\n\treturn c.ListAccountsAsync().Receive()\n}\n\n// ListAccountsMinConfAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListAccountsMinConf for the blocking version and more details.\nfunc (c *Client) ListAccountsMinConfAsync(minConfirms int) FutureListAccountsResult {\n\tcmd := btcjson.NewListAccountsCmd(&minConfirms)\n\treturn c.SendCmd(cmd)\n}\n\n// ListAccountsMinConf returns a map of account names and their associated\n// balances using the specified number of minimum confirmations.\n//\n// See ListAccounts to use the default minimum number of confirmations.\nfunc (c *Client) ListAccountsMinConf(minConfirms int) (map[string]btcutil.Amount, error) {\n\treturn c.ListAccountsMinConfAsync(minConfirms).Receive()\n}\n\n// FutureGetBalanceResult is a future promise to deliver the result of a\n// GetBalanceAsync or GetBalanceMinConfAsync RPC invocation (or an applicable\n// error).\ntype FutureGetBalanceResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// available balance from the server for the specified account.\nfunc (r FutureGetBalanceResult) Receive() (btcutil.Amount, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Unmarshal result as a floating point number.\n\tvar balance float64\n\terr = json.Unmarshal(res, &balance)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tamount, err := btcutil.NewAmount(balance)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn amount, nil\n}\n\n// FutureGetBalanceParseResult is same as FutureGetBalanceResult except\n// that the result is expected to be a string which is then parsed into\n// a float64 value\n// This is required for compatibility with servers like blockchain.info\ntype FutureGetBalanceParseResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// available balance from the server for the specified account.\nfunc (r FutureGetBalanceParseResult) Receive() (btcutil.Amount, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Unmarshal result as a string\n\tvar balanceString string\n\terr = json.Unmarshal(res, &balanceString)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tbalance, err := strconv.ParseFloat(balanceString, 64)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tamount, err := btcutil.NewAmount(balance)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn amount, nil\n}\n\n// GetBalanceAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetBalance for the blocking version and more details.\nfunc (c *Client) GetBalanceAsync(account string) FutureGetBalanceResult {\n\tcmd := btcjson.NewGetBalanceCmd(&account, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// GetBalance returns the available balance from the server for the specified\n// account using the default number of minimum confirmations.  The account may\n// be \"*\" for all accounts.\n//\n// See GetBalanceMinConf to override the minimum number of confirmations.\nfunc (c *Client) GetBalance(account string) (btcutil.Amount, error) {\n\treturn c.GetBalanceAsync(account).Receive()\n}\n\n// GetBalanceMinConfAsync returns an instance of a type that can be used to get\n// the result of the RPC at some future time by invoking the Receive function on\n// the returned instance.\n//\n// See GetBalanceMinConf for the blocking version and more details.\nfunc (c *Client) GetBalanceMinConfAsync(account string, minConfirms int) FutureGetBalanceResult {\n\tcmd := btcjson.NewGetBalanceCmd(&account, &minConfirms)\n\treturn c.SendCmd(cmd)\n}\n\n// GetBalanceMinConf returns the available balance from the server for the\n// specified account using the specified number of minimum confirmations.  The\n// account may be \"*\" for all accounts.\n//\n// See GetBalance to use the default minimum number of confirmations.\nfunc (c *Client) GetBalanceMinConf(account string, minConfirms int) (btcutil.Amount, error) {\n\tif c.config.EnableBCInfoHacks {\n\t\tresponse := c.GetBalanceMinConfAsync(account, minConfirms)\n\t\treturn FutureGetBalanceParseResult(response).Receive()\n\t}\n\treturn c.GetBalanceMinConfAsync(account, minConfirms).Receive()\n}\n\n// FutureGetBalancesResult is a future promise to deliver the result of a\n// GetBalancesAsync RPC invocation (or an applicable error).\ntype FutureGetBalancesResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// available balances from the server.\nfunc (r FutureGetBalancesResult) Receive() (*btcjson.GetBalancesResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a floating point number.\n\tvar balances btcjson.GetBalancesResult\n\terr = json.Unmarshal(res, &balances)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &balances, nil\n}\n\n// GetBalancesAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetBalances for the blocking version and more details.\nfunc (c *Client) GetBalancesAsync() FutureGetBalancesResult {\n\tcmd := btcjson.NewGetBalancesCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetBalances returns the available balances from the server.\nfunc (c *Client) GetBalances() (*btcjson.GetBalancesResult, error) {\n\treturn c.GetBalancesAsync().Receive()\n}\n\n// FutureGetReceivedByAccountResult is a future promise to deliver the result of\n// a GetReceivedByAccountAsync or GetReceivedByAccountMinConfAsync RPC\n// invocation (or an applicable error).\ntype FutureGetReceivedByAccountResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the total\n// amount received with the specified account.\nfunc (r FutureGetReceivedByAccountResult) Receive() (btcutil.Amount, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Unmarshal result as a floating point number.\n\tvar balance float64\n\terr = json.Unmarshal(res, &balance)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tamount, err := btcutil.NewAmount(balance)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn amount, nil\n}\n\n// GetReceivedByAccountAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetReceivedByAccount for the blocking version and more details.\nfunc (c *Client) GetReceivedByAccountAsync(account string) FutureGetReceivedByAccountResult {\n\tcmd := btcjson.NewGetReceivedByAccountCmd(account, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// GetReceivedByAccount returns the total amount received with the specified\n// account with at least the default number of minimum confirmations.\n//\n// See GetReceivedByAccountMinConf to override the minimum number of\n// confirmations.\nfunc (c *Client) GetReceivedByAccount(account string) (btcutil.Amount, error) {\n\treturn c.GetReceivedByAccountAsync(account).Receive()\n}\n\n// GetReceivedByAccountMinConfAsync returns an instance of a type that can be\n// used to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetReceivedByAccountMinConf for the blocking version and more details.\nfunc (c *Client) GetReceivedByAccountMinConfAsync(account string, minConfirms int) FutureGetReceivedByAccountResult {\n\tcmd := btcjson.NewGetReceivedByAccountCmd(account, &minConfirms)\n\treturn c.SendCmd(cmd)\n}\n\n// GetReceivedByAccountMinConf returns the total amount received with the\n// specified account with at least the specified number of minimum\n// confirmations.\n//\n// See GetReceivedByAccount to use the default minimum number of confirmations.\nfunc (c *Client) GetReceivedByAccountMinConf(account string, minConfirms int) (btcutil.Amount, error) {\n\treturn c.GetReceivedByAccountMinConfAsync(account, minConfirms).Receive()\n}\n\n// FutureGetUnconfirmedBalanceResult is a future promise to deliver the result\n// of a GetUnconfirmedBalanceAsync RPC invocation (or an applicable error).\ntype FutureGetUnconfirmedBalanceResult chan *Response\n\n// Receive waits for the Response promised by the future and returns returns the\n// unconfirmed balance from the server for the specified account.\nfunc (r FutureGetUnconfirmedBalanceResult) Receive() (btcutil.Amount, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Unmarshal result as a floating point number.\n\tvar balance float64\n\terr = json.Unmarshal(res, &balance)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tamount, err := btcutil.NewAmount(balance)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn amount, nil\n}\n\n// GetUnconfirmedBalanceAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetUnconfirmedBalance for the blocking version and more details.\nfunc (c *Client) GetUnconfirmedBalanceAsync(account string) FutureGetUnconfirmedBalanceResult {\n\tcmd := btcjson.NewGetUnconfirmedBalanceCmd(&account)\n\treturn c.SendCmd(cmd)\n}\n\n// GetUnconfirmedBalance returns the unconfirmed balance from the server for\n// the specified account.\nfunc (c *Client) GetUnconfirmedBalance(account string) (btcutil.Amount, error) {\n\treturn c.GetUnconfirmedBalanceAsync(account).Receive()\n}\n\n// FutureGetReceivedByAddressResult is a future promise to deliver the result of\n// a GetReceivedByAddressAsync or GetReceivedByAddressMinConfAsync RPC\n// invocation (or an applicable error).\ntype FutureGetReceivedByAddressResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the total\n// amount received by the specified address.\nfunc (r FutureGetReceivedByAddressResult) Receive() (btcutil.Amount, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Unmarshal result as a floating point number.\n\tvar balance float64\n\terr = json.Unmarshal(res, &balance)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tamount, err := btcutil.NewAmount(balance)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn amount, nil\n}\n\n// GetReceivedByAddressAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetReceivedByAddress for the blocking version and more details.\nfunc (c *Client) GetReceivedByAddressAsync(address btcutil.Address) FutureGetReceivedByAddressResult {\n\taddr := address.EncodeAddress()\n\tcmd := btcjson.NewGetReceivedByAddressCmd(addr, nil)\n\treturn c.SendCmd(cmd)\n\n}\n\n// GetReceivedByAddress returns the total amount received by the specified\n// address with at least the default number of minimum confirmations.\n//\n// See GetReceivedByAddressMinConf to override the minimum number of\n// confirmations.\nfunc (c *Client) GetReceivedByAddress(address btcutil.Address) (btcutil.Amount, error) {\n\treturn c.GetReceivedByAddressAsync(address).Receive()\n}\n\n// GetReceivedByAddressMinConfAsync returns an instance of a type that can be\n// used to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetReceivedByAddressMinConf for the blocking version and more details.\nfunc (c *Client) GetReceivedByAddressMinConfAsync(address btcutil.Address, minConfirms int) FutureGetReceivedByAddressResult {\n\taddr := address.EncodeAddress()\n\tcmd := btcjson.NewGetReceivedByAddressCmd(addr, &minConfirms)\n\treturn c.SendCmd(cmd)\n}\n\n// GetReceivedByAddressMinConf returns the total amount received by the specified\n// address with at least the specified number of minimum confirmations.\n//\n// See GetReceivedByAddress to use the default minimum number of confirmations.\nfunc (c *Client) GetReceivedByAddressMinConf(address btcutil.Address, minConfirms int) (btcutil.Amount, error) {\n\treturn c.GetReceivedByAddressMinConfAsync(address, minConfirms).Receive()\n}\n\n// FutureListReceivedByAccountResult is a future promise to deliver the result\n// of a ListReceivedByAccountAsync, ListReceivedByAccountMinConfAsync, or\n// ListReceivedByAccountIncludeEmptyAsync RPC invocation (or an applicable\n// error).\ntype FutureListReceivedByAccountResult chan *Response\n\n// Receive waits for the Response promised by the future and returns a list of\n// balances by account.\nfunc (r FutureListReceivedByAccountResult) Receive() ([]btcjson.ListReceivedByAccountResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal as an array of listreceivedbyaccount result objects.\n\tvar received []btcjson.ListReceivedByAccountResult\n\terr = json.Unmarshal(res, &received)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn received, nil\n}\n\n// ListReceivedByAccountAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListReceivedByAccount for the blocking version and more details.\nfunc (c *Client) ListReceivedByAccountAsync() FutureListReceivedByAccountResult {\n\tcmd := btcjson.NewListReceivedByAccountCmd(nil, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListReceivedByAccount lists balances by account using the default number\n// of minimum confirmations and including accounts that haven't received any\n// payments.\n//\n// See ListReceivedByAccountMinConf to override the minimum number of\n// confirmations and ListReceivedByAccountIncludeEmpty to filter accounts that\n// haven't received any payments from the results.\nfunc (c *Client) ListReceivedByAccount() ([]btcjson.ListReceivedByAccountResult, error) {\n\treturn c.ListReceivedByAccountAsync().Receive()\n}\n\n// ListReceivedByAccountMinConfAsync returns an instance of a type that can be\n// used to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListReceivedByAccountMinConf for the blocking version and more details.\nfunc (c *Client) ListReceivedByAccountMinConfAsync(minConfirms int) FutureListReceivedByAccountResult {\n\tcmd := btcjson.NewListReceivedByAccountCmd(&minConfirms, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListReceivedByAccountMinConf lists balances by account using the specified\n// number of minimum confirmations not including accounts that haven't received\n// any payments.\n//\n// See ListReceivedByAccount to use the default minimum number of confirmations\n// and ListReceivedByAccountIncludeEmpty to also include accounts that haven't\n// received any payments in the results.\nfunc (c *Client) ListReceivedByAccountMinConf(minConfirms int) ([]btcjson.ListReceivedByAccountResult, error) {\n\treturn c.ListReceivedByAccountMinConfAsync(minConfirms).Receive()\n}\n\n// ListReceivedByAccountIncludeEmptyAsync returns an instance of a type that can\n// be used to get the result of the RPC at some future time by invoking the\n// Receive function on the returned instance.\n//\n// See ListReceivedByAccountIncludeEmpty for the blocking version and more details.\nfunc (c *Client) ListReceivedByAccountIncludeEmptyAsync(minConfirms int, includeEmpty bool) FutureListReceivedByAccountResult {\n\tcmd := btcjson.NewListReceivedByAccountCmd(&minConfirms, &includeEmpty,\n\t\tnil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListReceivedByAccountIncludeEmpty lists balances by account using the\n// specified number of minimum confirmations and including accounts that\n// haven't received any payments depending on specified flag.\n//\n// See ListReceivedByAccount and ListReceivedByAccountMinConf to use defaults.\nfunc (c *Client) ListReceivedByAccountIncludeEmpty(minConfirms int, includeEmpty bool) ([]btcjson.ListReceivedByAccountResult, error) {\n\treturn c.ListReceivedByAccountIncludeEmptyAsync(minConfirms,\n\t\tincludeEmpty).Receive()\n}\n\n// FutureListReceivedByAddressResult is a future promise to deliver the result\n// of a ListReceivedByAddressAsync, ListReceivedByAddressMinConfAsync, or\n// ListReceivedByAddressIncludeEmptyAsync RPC invocation (or an applicable\n// error).\ntype FutureListReceivedByAddressResult chan *Response\n\n// Receive waits for the Response promised by the future and returns a list of\n// balances by address.\nfunc (r FutureListReceivedByAddressResult) Receive() ([]btcjson.ListReceivedByAddressResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal as an array of listreceivedbyaddress result objects.\n\tvar received []btcjson.ListReceivedByAddressResult\n\terr = json.Unmarshal(res, &received)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn received, nil\n}\n\n// ListReceivedByAddressAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListReceivedByAddress for the blocking version and more details.\nfunc (c *Client) ListReceivedByAddressAsync() FutureListReceivedByAddressResult {\n\tcmd := btcjson.NewListReceivedByAddressCmd(nil, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListReceivedByAddress lists balances by address using the default number\n// of minimum confirmations not including addresses that haven't received any\n// payments or watching only addresses.\n//\n// See ListReceivedByAddressMinConf to override the minimum number of\n// confirmations and ListReceivedByAddressIncludeEmpty to also include addresses\n// that haven't received any payments in the results.\nfunc (c *Client) ListReceivedByAddress() ([]btcjson.ListReceivedByAddressResult, error) {\n\treturn c.ListReceivedByAddressAsync().Receive()\n}\n\n// ListReceivedByAddressMinConfAsync returns an instance of a type that can be\n// used to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See ListReceivedByAddressMinConf for the blocking version and more details.\nfunc (c *Client) ListReceivedByAddressMinConfAsync(minConfirms int) FutureListReceivedByAddressResult {\n\tcmd := btcjson.NewListReceivedByAddressCmd(&minConfirms, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListReceivedByAddressMinConf lists balances by address using the specified\n// number of minimum confirmations not including addresses that haven't received\n// any payments.\n//\n// See ListReceivedByAddress to use the default minimum number of confirmations\n// and ListReceivedByAddressIncludeEmpty to also include addresses that haven't\n// received any payments in the results.\nfunc (c *Client) ListReceivedByAddressMinConf(minConfirms int) ([]btcjson.ListReceivedByAddressResult, error) {\n\treturn c.ListReceivedByAddressMinConfAsync(minConfirms).Receive()\n}\n\n// ListReceivedByAddressIncludeEmptyAsync returns an instance of a type that can\n// be used to get the result of the RPC at some future time by invoking the\n// Receive function on the returned instance.\n//\n// See ListReceivedByAccountIncludeEmpty for the blocking version and more details.\nfunc (c *Client) ListReceivedByAddressIncludeEmptyAsync(minConfirms int, includeEmpty bool) FutureListReceivedByAddressResult {\n\tcmd := btcjson.NewListReceivedByAddressCmd(&minConfirms, &includeEmpty,\n\t\tnil)\n\treturn c.SendCmd(cmd)\n}\n\n// ListReceivedByAddressIncludeEmpty lists balances by address using the\n// specified number of minimum confirmations and including addresses that\n// haven't received any payments depending on specified flag.\n//\n// See ListReceivedByAddress and ListReceivedByAddressMinConf to use defaults.\nfunc (c *Client) ListReceivedByAddressIncludeEmpty(minConfirms int, includeEmpty bool) ([]btcjson.ListReceivedByAddressResult, error) {\n\treturn c.ListReceivedByAddressIncludeEmptyAsync(minConfirms,\n\t\tincludeEmpty).Receive()\n}\n\n// ************************\n// Wallet Locking Functions\n// ************************\n\n// FutureWalletLockResult is a future promise to deliver the result of a\n// WalletLockAsync RPC invocation (or an applicable error).\ntype FutureWalletLockResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of locking the wallet.\nfunc (r FutureWalletLockResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// WalletLockAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See WalletLock for the blocking version and more details.\nfunc (c *Client) WalletLockAsync() FutureWalletLockResult {\n\tcmd := btcjson.NewWalletLockCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// WalletLock locks the wallet by removing the encryption key from memory.\n//\n// After calling this function, the WalletPassphrase function must be used to\n// unlock the wallet prior to calling any other function which requires the\n// wallet to be unlocked.\nfunc (c *Client) WalletLock() error {\n\treturn c.WalletLockAsync().Receive()\n}\n\n// WalletPassphrase unlocks the wallet by using the passphrase to derive the\n// decryption key which is then stored in memory for the specified timeout\n// (in seconds).\nfunc (c *Client) WalletPassphrase(passphrase string, timeoutSecs int64) error {\n\tcmd := btcjson.NewWalletPassphraseCmd(passphrase, timeoutSecs)\n\t_, err := c.sendCmdAndWait(cmd)\n\treturn err\n}\n\n// FutureWalletPassphraseChangeResult is a future promise to deliver the result\n// of a WalletPassphraseChangeAsync RPC invocation (or an applicable error).\ntype FutureWalletPassphraseChangeResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of changing the wallet passphrase.\nfunc (r FutureWalletPassphraseChangeResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// WalletPassphraseChangeAsync returns an instance of a type that can be used to\n// get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See WalletPassphraseChange for the blocking version and more details.\nfunc (c *Client) WalletPassphraseChangeAsync(old, new string) FutureWalletPassphraseChangeResult {\n\tcmd := btcjson.NewWalletPassphraseChangeCmd(old, new)\n\treturn c.SendCmd(cmd)\n}\n\n// WalletPassphraseChange changes the wallet passphrase from the specified old\n// to new passphrase.\nfunc (c *Client) WalletPassphraseChange(old, new string) error {\n\treturn c.WalletPassphraseChangeAsync(old, new).Receive()\n}\n\n// *************************\n// Message Signing Functions\n// *************************\n\n// FutureSignMessageResult is a future promise to deliver the result of a\n// SignMessageAsync RPC invocation (or an applicable error).\ntype FutureSignMessageResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the message\n// signed with the private key of the specified address.\nfunc (r FutureSignMessageResult) Receive() (string, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar b64 string\n\terr = json.Unmarshal(res, &b64)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn b64, nil\n}\n\n// SignMessageAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See SignMessage for the blocking version and more details.\nfunc (c *Client) SignMessageAsync(address btcutil.Address, message string) FutureSignMessageResult {\n\taddr := address.EncodeAddress()\n\tcmd := btcjson.NewSignMessageCmd(addr, message)\n\treturn c.SendCmd(cmd)\n}\n\n// SignMessage signs a message with the private key of the specified address.\n//\n// NOTE: This function requires to the wallet to be unlocked.  See the\n// WalletPassphrase function for more details.\nfunc (c *Client) SignMessage(address btcutil.Address, message string) (string, error) {\n\treturn c.SignMessageAsync(address, message).Receive()\n}\n\n// FutureVerifyMessageResult is a future promise to deliver the result of a\n// VerifyMessageAsync RPC invocation (or an applicable error).\ntype FutureVerifyMessageResult chan *Response\n\n// Receive waits for the Response promised by the future and returns whether or\n// not the message was successfully verified.\nfunc (r FutureVerifyMessageResult) Receive() (bool, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Unmarshal result as a boolean.\n\tvar verified bool\n\terr = json.Unmarshal(res, &verified)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn verified, nil\n}\n\n// VerifyMessageAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See VerifyMessage for the blocking version and more details.\nfunc (c *Client) VerifyMessageAsync(address btcutil.Address, signature, message string) FutureVerifyMessageResult {\n\taddr := address.EncodeAddress()\n\tcmd := btcjson.NewVerifyMessageCmd(addr, signature, message)\n\treturn c.SendCmd(cmd)\n}\n\n// VerifyMessage verifies a signed message.\n//\n// NOTE: This function requires to the wallet to be unlocked.  See the\n// WalletPassphrase function for more details.\nfunc (c *Client) VerifyMessage(address btcutil.Address, signature, message string) (bool, error) {\n\treturn c.VerifyMessageAsync(address, signature, message).Receive()\n}\n\n// *********************\n// Dump/Import Functions\n// *********************\n\n// FutureDumpPrivKeyResult is a future promise to deliver the result of a\n// DumpPrivKeyAsync RPC invocation (or an applicable error).\ntype FutureDumpPrivKeyResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the private\n// key corresponding to the passed address encoded in the wallet import format\n// (WIF)\nfunc (r FutureDumpPrivKeyResult) Receive() (*btcutil.WIF, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a string.\n\tvar privKeyWIF string\n\terr = json.Unmarshal(res, &privKeyWIF)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn btcutil.DecodeWIF(privKeyWIF)\n}\n\n// DumpPrivKeyAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See DumpPrivKey for the blocking version and more details.\nfunc (c *Client) DumpPrivKeyAsync(address btcutil.Address) FutureDumpPrivKeyResult {\n\taddr := address.EncodeAddress()\n\tcmd := btcjson.NewDumpPrivKeyCmd(addr)\n\treturn c.SendCmd(cmd)\n}\n\n// DumpPrivKey gets the private key corresponding to the passed address encoded\n// in the wallet import format (WIF).\n//\n// NOTE: This function requires to the wallet to be unlocked.  See the\n// WalletPassphrase function for more details.\nfunc (c *Client) DumpPrivKey(address btcutil.Address) (*btcutil.WIF, error) {\n\treturn c.DumpPrivKeyAsync(address).Receive()\n}\n\n// FutureImportAddressResult is a future promise to deliver the result of an\n// ImportAddressAsync RPC invocation (or an applicable error).\ntype FutureImportAddressResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of importing the passed public address.\nfunc (r FutureImportAddressResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// ImportAddressAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See ImportAddress for the blocking version and more details.\nfunc (c *Client) ImportAddressAsync(address string) FutureImportAddressResult {\n\tcmd := btcjson.NewImportAddressCmd(address, \"\", nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ImportAddress imports the passed public address.\nfunc (c *Client) ImportAddress(address string) error {\n\treturn c.ImportAddressAsync(address).Receive()\n}\n\n// ImportAddressRescanAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See ImportAddress for the blocking version and more details.\nfunc (c *Client) ImportAddressRescanAsync(address string, account string, rescan bool) FutureImportAddressResult {\n\tcmd := btcjson.NewImportAddressCmd(address, account, &rescan)\n\treturn c.SendCmd(cmd)\n}\n\n// ImportAddressRescan imports the passed public address. When rescan is true,\n// the block history is scanned for transactions addressed to provided address.\nfunc (c *Client) ImportAddressRescan(address string, account string, rescan bool) error {\n\treturn c.ImportAddressRescanAsync(address, account, rescan).Receive()\n}\n\n// FutureImportMultiResult is a future promise to deliver the result of an\n// ImportMultiAsync RPC invocation (or an applicable error).\ntype FutureImportMultiResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of importing multiple addresses/scripts.\nfunc (r FutureImportMultiResult) Receive() (btcjson.ImportMultiResults, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar importMultiResults btcjson.ImportMultiResults\n\terr = json.Unmarshal(res, &importMultiResults)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn importMultiResults, nil\n}\n\n// ImportMultiAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See ImportMulti for the blocking version and more details.\nfunc (c *Client) ImportMultiAsync(requests []btcjson.ImportMultiRequest, options *btcjson.ImportMultiOptions) FutureImportMultiResult {\n\tcmd := btcjson.NewImportMultiCmd(requests, options)\n\treturn c.SendCmd(cmd)\n}\n\n// ImportMulti imports addresses/scripts, optionally rescanning the blockchain\n// from the earliest creation time of the imported scripts.\n//\n// See btcjson.ImportMultiRequest for details on the requests parameter.\nfunc (c *Client) ImportMulti(requests []btcjson.ImportMultiRequest, options *btcjson.ImportMultiOptions) (btcjson.ImportMultiResults, error) {\n\treturn c.ImportMultiAsync(requests, options).Receive()\n}\n\n// FutureImportPrivKeyResult is a future promise to deliver the result of an\n// ImportPrivKeyAsync RPC invocation (or an applicable error).\ntype FutureImportPrivKeyResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of importing the passed private key which must be the wallet import format\n// (WIF).\nfunc (r FutureImportPrivKeyResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// ImportPrivKeyAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See ImportPrivKey for the blocking version and more details.\nfunc (c *Client) ImportPrivKeyAsync(privKeyWIF *btcutil.WIF) FutureImportPrivKeyResult {\n\twif := \"\"\n\tif privKeyWIF != nil {\n\t\twif = privKeyWIF.String()\n\t}\n\n\tcmd := btcjson.NewImportPrivKeyCmd(wif, nil, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ImportPrivKey imports the passed private key which must be the wallet import\n// format (WIF).\nfunc (c *Client) ImportPrivKey(privKeyWIF *btcutil.WIF) error {\n\treturn c.ImportPrivKeyAsync(privKeyWIF).Receive()\n}\n\n// ImportPrivKeyLabelAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See ImportPrivKey for the blocking version and more details.\nfunc (c *Client) ImportPrivKeyLabelAsync(privKeyWIF *btcutil.WIF, label string) FutureImportPrivKeyResult {\n\twif := \"\"\n\tif privKeyWIF != nil {\n\t\twif = privKeyWIF.String()\n\t}\n\n\tcmd := btcjson.NewImportPrivKeyCmd(wif, &label, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ImportPrivKeyLabel imports the passed private key which must be the wallet import\n// format (WIF). It sets the account label to the one provided.\nfunc (c *Client) ImportPrivKeyLabel(privKeyWIF *btcutil.WIF, label string) error {\n\treturn c.ImportPrivKeyLabelAsync(privKeyWIF, label).Receive()\n}\n\n// ImportPrivKeyRescanAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See ImportPrivKey for the blocking version and more details.\nfunc (c *Client) ImportPrivKeyRescanAsync(privKeyWIF *btcutil.WIF, label string, rescan bool) FutureImportPrivKeyResult {\n\twif := \"\"\n\tif privKeyWIF != nil {\n\t\twif = privKeyWIF.String()\n\t}\n\n\tcmd := btcjson.NewImportPrivKeyCmd(wif, &label, &rescan)\n\treturn c.SendCmd(cmd)\n}\n\n// ImportPrivKeyRescan imports the passed private key which must be the wallet import\n// format (WIF). It sets the account label to the one provided. When rescan is true,\n// the block history is scanned for transactions addressed to provided privKey.\nfunc (c *Client) ImportPrivKeyRescan(privKeyWIF *btcutil.WIF, label string, rescan bool) error {\n\treturn c.ImportPrivKeyRescanAsync(privKeyWIF, label, rescan).Receive()\n}\n\n// FutureImportPubKeyResult is a future promise to deliver the result of an\n// ImportPubKeyAsync RPC invocation (or an applicable error).\ntype FutureImportPubKeyResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of importing the passed public key.\nfunc (r FutureImportPubKeyResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// ImportPubKeyAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See ImportPubKey for the blocking version and more details.\nfunc (c *Client) ImportPubKeyAsync(pubKey string) FutureImportPubKeyResult {\n\tcmd := btcjson.NewImportPubKeyCmd(pubKey, nil)\n\treturn c.SendCmd(cmd)\n}\n\n// ImportPubKey imports the passed public key.\nfunc (c *Client) ImportPubKey(pubKey string) error {\n\treturn c.ImportPubKeyAsync(pubKey).Receive()\n}\n\n// ImportPubKeyRescanAsync returns an instance of a type that can be used to get the\n// result of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See ImportPubKey for the blocking version and more details.\nfunc (c *Client) ImportPubKeyRescanAsync(pubKey string, rescan bool) FutureImportPubKeyResult {\n\tcmd := btcjson.NewImportPubKeyCmd(pubKey, &rescan)\n\treturn c.SendCmd(cmd)\n}\n\n// ImportPubKeyRescan imports the passed public key. When rescan is true, the\n// block history is scanned for transactions addressed to provided pubkey.\nfunc (c *Client) ImportPubKeyRescan(pubKey string, rescan bool) error {\n\treturn c.ImportPubKeyRescanAsync(pubKey, rescan).Receive()\n}\n\n// ***********************\n// Miscellaneous Functions\n// ***********************\n\n// NOTE: While getinfo is implemented here (in wallet.go), a btcd chain server\n// will respond to getinfo requests as well, excluding any wallet information.\n\n// FutureGetInfoResult is a future promise to deliver the result of a\n// GetInfoAsync RPC invocation (or an applicable error).\ntype FutureGetInfoResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the info\n// provided by the server.\nfunc (r FutureGetInfoResult) Receive() (*btcjson.InfoWalletResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a getinfo result object.\n\tvar infoRes btcjson.InfoWalletResult\n\terr = json.Unmarshal(res, &infoRes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &infoRes, nil\n}\n\n// GetInfoAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetInfo for the blocking version and more details.\nfunc (c *Client) GetInfoAsync() FutureGetInfoResult {\n\tcmd := btcjson.NewGetInfoCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetInfo returns miscellaneous info regarding the RPC server.  The returned\n// info object may be void of wallet information if the remote server does\n// not include wallet functionality.\nfunc (c *Client) GetInfo() (*btcjson.InfoWalletResult, error) {\n\treturn c.GetInfoAsync().Receive()\n}\n\n// FutureWalletCreateFundedPsbtResult is a future promise to deliver the result of an\n// WalletCreateFundedPsbt RPC invocation (or an applicable error).\ntype FutureWalletCreateFundedPsbtResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the\n// partially signed transaction in PSBT format along with the resulting fee\n// and change output index.\nfunc (r FutureWalletCreateFundedPsbtResult) Receive() (*btcjson.WalletCreateFundedPsbtResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a getinfo result object.\n\tvar psbtRes btcjson.WalletCreateFundedPsbtResult\n\terr = json.Unmarshal(res, &psbtRes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &psbtRes, nil\n}\n\n// WalletCreateFundedPsbtAsync returns an instance of a type that can be used\n// to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See WalletCreateFundedPsbt for the blocking version and more details.\nfunc (c *Client) WalletCreateFundedPsbtAsync(\n\tinputs []btcjson.PsbtInput, outputs []btcjson.PsbtOutput, locktime *uint32,\n\toptions *btcjson.WalletCreateFundedPsbtOpts, bip32Derivs *bool,\n) FutureWalletCreateFundedPsbtResult {\n\tcmd := btcjson.NewWalletCreateFundedPsbtCmd(inputs, outputs, locktime, options, bip32Derivs)\n\treturn c.SendCmd(cmd)\n}\n\n// WalletCreateFundedPsbt creates and funds a transaction in the Partially\n// Signed Transaction format. Inputs will be added if supplied inputs are not\n// enough.\nfunc (c *Client) WalletCreateFundedPsbt(\n\tinputs []btcjson.PsbtInput, outputs []btcjson.PsbtOutput, locktime *uint32,\n\toptions *btcjson.WalletCreateFundedPsbtOpts, bip32Derivs *bool,\n) (*btcjson.WalletCreateFundedPsbtResult, error) {\n\treturn c.WalletCreateFundedPsbtAsync(inputs, outputs, locktime, options, bip32Derivs).Receive()\n}\n\n// FutureWalletProcessPsbtResult is a future promise to deliver the result of a\n// WalletCreateFundedPsb RPC invocation (or an applicable error).\ntype FutureWalletProcessPsbtResult chan *Response\n\n// Receive waits for the Response promised by the future and returns an updated\n// PSBT with signed inputs from the wallet and a boolean indicating if the\n// transaction has a complete set of signatures.\nfunc (r FutureWalletProcessPsbtResult) Receive() (*btcjson.WalletProcessPsbtResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Unmarshal result as a getinfo result object.\n\tvar psbtRes btcjson.WalletProcessPsbtResult\n\terr = json.Unmarshal(res, &psbtRes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &psbtRes, nil\n}\n\n// WalletProcessPsbtAsync returns an instance of a type that can be used\n// to get the result of the RPC at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See WalletProcessPsbt for the blocking version and more details.\nfunc (c *Client) WalletProcessPsbtAsync(\n\tpsbt string, sign *bool, sighashType SigHashType, bip32Derivs *bool,\n) FutureWalletProcessPsbtResult {\n\tcmd := btcjson.NewWalletProcessPsbtCmd(psbt, sign, btcjson.String(sighashType.String()), bip32Derivs)\n\treturn c.SendCmd(cmd)\n}\n\n// WalletProcessPsbt updates a PSBT with input information from our wallet and\n// then signs inputs.\nfunc (c *Client) WalletProcessPsbt(\n\tpsbt string, sign *bool, sighashType SigHashType, bip32Derivs *bool,\n) (*btcjson.WalletProcessPsbtResult, error) {\n\treturn c.WalletProcessPsbtAsync(psbt, sign, sighashType, bip32Derivs).Receive()\n}\n\n// FutureGetWalletInfoResult is a future promise to deliver the result of an\n// GetWalletInfoAsync RPC invocation (or an applicable error).\ntype FutureGetWalletInfoResult chan *Response\n\n// Receive waits for the Response promised by the future and returns the result\n// of wallet state info.\nfunc (r FutureGetWalletInfoResult) Receive() (*btcjson.GetWalletInfoResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar getWalletInfoResult btcjson.GetWalletInfoResult\n\terr = json.Unmarshal(res, &getWalletInfoResult)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &getWalletInfoResult, nil\n}\n\n// GetWalletInfoAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See GetWalletInfo for the blocking version and more details.\nfunc (c *Client) GetWalletInfoAsync() FutureGetWalletInfoResult {\n\tcmd := btcjson.NewGetWalletInfoCmd()\n\treturn c.SendCmd(cmd)\n}\n\n// GetWalletInfo returns various wallet state info.\nfunc (c *Client) GetWalletInfo() (*btcjson.GetWalletInfoResult, error) {\n\treturn c.GetWalletInfoAsync().Receive()\n}\n\n// FutureBackupWalletResult is a future promise to deliver the result of an\n// BackupWalletAsync RPC invocation (or an applicable error)\ntype FutureBackupWalletResult chan *Response\n\n// Receive waits for the Response promised by the future\nfunc (r FutureBackupWalletResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// BackupWalletAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See BackupWallet for the blocking version and more details.\nfunc (c *Client) BackupWalletAsync(destination string) FutureBackupWalletResult {\n\treturn c.SendCmd(btcjson.NewBackupWalletCmd(destination))\n}\n\n// BackupWallet safely copies current wallet file to destination, which can\n// be a directory or a path with filename\nfunc (c *Client) BackupWallet(destination string) error {\n\treturn c.BackupWalletAsync(destination).Receive()\n}\n\n// FutureDumpWalletResult is a future promise to deliver the result of an\n// DumpWallet RPC invocation (or an applicable error)\ntype FutureDumpWalletResult chan *Response\n\n// Receive waits for the Response promised by the future\nfunc (r FutureDumpWalletResult) Receive() (*btcjson.DumpWalletResult, error) {\n\tbytes, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar res btcjson.DumpWalletResult\n\terr = json.Unmarshal(bytes, &res)\n\treturn &res, err\n}\n\n// DumpWalletAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See DumpWalletAsync for the blocking version and more details.\nfunc (c *Client) DumpWalletAsync(destination string) FutureDumpWalletResult {\n\treturn c.SendCmd(btcjson.NewDumpWalletCmd(destination))\n}\n\n// DumpWallet dumps all wallet keys in a human-readable format to a server-side file.\nfunc (c *Client) DumpWallet(destination string) (*btcjson.DumpWalletResult, error) {\n\treturn c.DumpWalletAsync(destination).Receive()\n}\n\n// FutureImportWalletResult is a future promise to deliver the result of an\n// ImportWalletAsync RPC invocation (or an applicable error)\ntype FutureImportWalletResult chan *Response\n\n// Receive waits for the Response promised by the future\nfunc (r FutureImportWalletResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// ImportWalletAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See ImportWallet for the blocking version and more details.\nfunc (c *Client) ImportWalletAsync(filename string) FutureImportWalletResult {\n\treturn c.SendCmd(btcjson.NewImportWalletCmd(filename))\n}\n\n// ImportWallet imports keys from a wallet dump file (see DumpWallet).\nfunc (c *Client) ImportWallet(filename string) error {\n\treturn c.ImportWalletAsync(filename).Receive()\n}\n\n// FutureUnloadWalletResult is a future promise to deliver the result of an\n// UnloadWalletAsync RPC invocation (or an applicable error)\ntype FutureUnloadWalletResult chan *Response\n\n// Receive waits for the Response promised by the future\nfunc (r FutureUnloadWalletResult) Receive() error {\n\t_, err := ReceiveFuture(r)\n\treturn err\n}\n\n// UnloadWalletAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See UnloadWallet for the blocking version and more details.\nfunc (c *Client) UnloadWalletAsync(walletName *string) FutureUnloadWalletResult {\n\treturn c.SendCmd(btcjson.NewUnloadWalletCmd(walletName))\n}\n\n// UnloadWallet unloads the referenced wallet. If the RPC server URL already\n// contains the name of the wallet, like http://127.0.0.1:8332/wallet/<walletname>,\n// the parameter must be nil, or it'll return an error.\nfunc (c *Client) UnloadWallet(walletName *string) error {\n\treturn c.UnloadWalletAsync(walletName).Receive()\n}\n\n// FutureLoadWalletResult is a future promise to deliver the result of an\n// LoadWalletAsync RPC invocation (or an applicable error)\ntype FutureLoadWalletResult chan *Response\n\n// Receive waits for the Response promised by the future\nfunc (r FutureLoadWalletResult) Receive() (*btcjson.LoadWalletResult, error) {\n\tbytes, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar result btcjson.LoadWalletResult\n\terr = json.Unmarshal(bytes, &result)\n\treturn &result, err\n}\n\n// LoadWalletAsync returns an instance of a type that can be used to get the result\n// of the RPC at some future time by invoking the Receive function on the\n// returned instance.\n//\n// See LoadWallet for the blocking version and more details.\nfunc (c *Client) LoadWalletAsync(walletName string) FutureLoadWalletResult {\n\treturn c.SendCmd(btcjson.NewLoadWalletCmd(walletName))\n}\n\n// LoadWallet loads a wallet from a wallet file or directory.\nfunc (c *Client) LoadWallet(walletName string) (*btcjson.LoadWalletResult, error) {\n\treturn c.LoadWalletAsync(walletName).Receive()\n}\n\n// TODO(davec): Implement\n// encryptwallet (Won't be supported by btcwallet since it's always encrypted)\n// listaddressgroupings (NYI in btcwallet)\n// listreceivedbyaccount (NYI in btcwallet)\n"
  },
  {
    "path": "rpcclient/zmq.go",
    "content": "package rpcclient\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// FutureGetZmqNotificationsResult is a future promise to deliver the result of\n// a GetZmqNotifications RPC invocation\ntype FutureGetZmqNotificationsResult chan *Response\n\n// Receive waits for the response promised by the future and returns the unmarshalled\n// response, or an error if the request was unsuccessful.\nfunc (r FutureGetZmqNotificationsResult) Receive() (btcjson.GetZmqNotificationResult, error) {\n\tres, err := ReceiveFuture(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar notifications btcjson.GetZmqNotificationResult\n\tif err := json.Unmarshal(res, &notifications); err != nil {\n\t\treturn nil, err\n\t}\n\treturn notifications, nil\n}\n\n// GetZmqNotificationsAsync returns an instance of a type that can be used to get\n// the result of a custom RPC request at some future time by invoking the Receive\n// function on the returned instance.\n//\n// See GetZmqNotifications for the blocking version and more details.\nfunc (c *Client) GetZmqNotificationsAsync() FutureGetZmqNotificationsResult {\n\treturn c.SendCmd(btcjson.NewGetZmqNotificationsCmd())\n}\n\n// GetZmqNotifications returns information about the active ZeroMQ notifications.\nfunc (c *Client) GetZmqNotifications() (btcjson.GetZmqNotificationResult, error) {\n\treturn c.GetZmqNotificationsAsync().Receive()\n}\n"
  },
  {
    "path": "rpcserver.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha256\"\n\t\"crypto/subtle\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"math/rand\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/blockchain/indexers\"\n\t\"github.com/btcsuite/btcd/btcec/v2/ecdsa\"\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/mempool\"\n\t\"github.com/btcsuite/btcd/mining\"\n\t\"github.com/btcsuite/btcd/mining/cpuminer\"\n\t\"github.com/btcsuite/btcd/peer\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/btcsuite/websocket\"\n)\n\n// API version constants\nconst (\n\tjsonrpcSemverString = \"1.3.0\"\n\tjsonrpcSemverMajor  = 1\n\tjsonrpcSemverMinor  = 3\n\tjsonrpcSemverPatch  = 0\n)\n\nconst (\n\t// rpcAuthTimeoutSeconds is the number of seconds a connection to the\n\t// RPC server is allowed to stay open without authenticating before it\n\t// is closed.\n\trpcAuthTimeoutSeconds = 10\n\n\t// uint256Size is the number of bytes needed to represent an unsigned\n\t// 256-bit integer.\n\tuint256Size = 32\n\n\t// gbtNonceRange is two 32-bit big-endian hexadecimal integers which\n\t// represent the valid ranges of nonces returned by the getblocktemplate\n\t// RPC.\n\tgbtNonceRange = \"00000000ffffffff\"\n\n\t// gbtRegenerateSeconds is the number of seconds that must pass before\n\t// a new template is generated when the previous block hash has not\n\t// changed and there have been changes to the available transactions\n\t// in the memory pool.\n\tgbtRegenerateSeconds = 60\n\n\t// maxProtocolVersion is the max protocol version the server supports.\n\tmaxProtocolVersion = 70002\n\n\t// defaultMaxFeeRate is the default value to use(0.1 BTC/kvB) when the\n\t// `MaxFee` field is not set when calling `testmempoolaccept`.\n\tdefaultMaxFeeRate = 0.1\n)\n\nvar (\n\t// gbtMutableFields are the manipulations the server allows to be made\n\t// to block templates generated by the getblocktemplate RPC.  It is\n\t// declared here to avoid the overhead of creating the slice on every\n\t// invocation for constant data.\n\tgbtMutableFields = []string{\n\t\t\"time\", \"transactions/add\", \"prevblock\", \"coinbase/append\",\n\t}\n\n\t// gbtCoinbaseAux describes additional data that miners should include\n\t// in the coinbase signature script.  It is declared here to avoid the\n\t// overhead of creating a new object on every invocation for constant\n\t// data.\n\tgbtCoinbaseAux = &btcjson.GetBlockTemplateResultAux{\n\t\tFlags: hex.EncodeToString(builderScript(txscript.\n\t\t\tNewScriptBuilder().\n\t\t\tAddData([]byte(mining.CoinbaseFlags)))),\n\t}\n\n\t// gbtCapabilities describes additional capabilities returned with a\n\t// block template generated by the getblocktemplate RPC.    It is\n\t// declared here to avoid the overhead of creating the slice on every\n\t// invocation for constant data.\n\tgbtCapabilities = []string{\"proposal\"}\n\n\t// JSON 2.0 batched request prefix\n\tbatchedRequestPrefix = []byte(\"[\")\n)\n\n// Errors\nvar (\n\t// ErrRPCUnimplemented is an error returned to RPC clients when the\n\t// provided command is recognized, but not implemented.\n\tErrRPCUnimplemented = &btcjson.RPCError{\n\t\tCode:    btcjson.ErrRPCUnimplemented,\n\t\tMessage: \"Command unimplemented\",\n\t}\n\n\t// ErrRPCNoWallet is an error returned to RPC clients when the provided\n\t// command is recognized as a wallet command.\n\tErrRPCNoWallet = &btcjson.RPCError{\n\t\tCode:    btcjson.ErrRPCNoWallet,\n\t\tMessage: \"This implementation does not implement wallet commands\",\n\t}\n)\n\ntype commandHandler func(*rpcServer, interface{}, <-chan struct{}) (interface{}, error)\n\n// rpcHandlers maps RPC command strings to appropriate handler functions.\n// This is set by init because help references rpcHandlers and thus causes\n// a dependency loop.\nvar rpcHandlers map[string]commandHandler\nvar rpcHandlersBeforeInit = map[string]commandHandler{\n\t\"addnode\":                handleAddNode,\n\t\"createrawtransaction\":   handleCreateRawTransaction,\n\t\"debuglevel\":             handleDebugLevel,\n\t\"decoderawtransaction\":   handleDecodeRawTransaction,\n\t\"decodescript\":           handleDecodeScript,\n\t\"estimatefee\":            handleEstimateFee,\n\t\"generate\":               handleGenerate,\n\t\"getaddednodeinfo\":       handleGetAddedNodeInfo,\n\t\"getbestblock\":           handleGetBestBlock,\n\t\"getbestblockhash\":       handleGetBestBlockHash,\n\t\"getblock\":               handleGetBlock,\n\t\"getblockchaininfo\":      handleGetBlockChainInfo,\n\t\"getblockcount\":          handleGetBlockCount,\n\t\"getblockhash\":           handleGetBlockHash,\n\t\"getblockheader\":         handleGetBlockHeader,\n\t\"getblocktemplate\":       handleGetBlockTemplate,\n\t\"getchaintips\":           handleGetChainTips,\n\t\"getcfilter\":             handleGetCFilter,\n\t\"getcfilterheader\":       handleGetCFilterHeader,\n\t\"getconnectioncount\":     handleGetConnectionCount,\n\t\"getcurrentnet\":          handleGetCurrentNet,\n\t\"getdifficulty\":          handleGetDifficulty,\n\t\"getgenerate\":            handleGetGenerate,\n\t\"gethashespersec\":        handleGetHashesPerSec,\n\t\"getheaders\":             handleGetHeaders,\n\t\"getinfo\":                handleGetInfo,\n\t\"getmempoolinfo\":         handleGetMempoolInfo,\n\t\"getmininginfo\":          handleGetMiningInfo,\n\t\"getnettotals\":           handleGetNetTotals,\n\t\"getnetworkhashps\":       handleGetNetworkHashPS,\n\t\"getnodeaddresses\":       handleGetNodeAddresses,\n\t\"getpeerinfo\":            handleGetPeerInfo,\n\t\"getrawmempool\":          handleGetRawMempool,\n\t\"getrawtransaction\":      handleGetRawTransaction,\n\t\"gettxout\":               handleGetTxOut,\n\t\"help\":                   handleHelp,\n\t\"invalidateblock\":        handleInvalidateBlock,\n\t\"node\":                   handleNode,\n\t\"ping\":                   handlePing,\n\t\"reconsiderblock\":        handleReconsiderBlock,\n\t\"searchrawtransactions\":  handleSearchRawTransactions,\n\t\"sendrawtransaction\":     handleSendRawTransaction,\n\t\"setgenerate\":            handleSetGenerate,\n\t\"signmessagewithprivkey\": handleSignMessageWithPrivKey,\n\t\"stop\":                   handleStop,\n\t\"submitblock\":            handleSubmitBlock,\n\t\"uptime\":                 handleUptime,\n\t\"validateaddress\":        handleValidateAddress,\n\t\"verifychain\":            handleVerifyChain,\n\t\"verifymessage\":          handleVerifyMessage,\n\t\"version\":                handleVersion,\n\t\"testmempoolaccept\":      handleTestMempoolAccept,\n\t\"gettxspendingprevout\":   handleGetTxSpendingPrevOut,\n}\n\n// list of commands that we recognize, but for which btcd has no support because\n// it lacks support for wallet functionality. For these commands the user\n// should ask a connected instance of btcwallet.\nvar rpcAskWallet = map[string]struct{}{\n\t\"addmultisigaddress\":     {},\n\t\"backupwallet\":           {},\n\t\"createencryptedwallet\":  {},\n\t\"createmultisig\":         {},\n\t\"dumpprivkey\":            {},\n\t\"dumpwallet\":             {},\n\t\"encryptwallet\":          {},\n\t\"getaccount\":             {},\n\t\"getaccountaddress\":      {},\n\t\"getaddressesbyaccount\":  {},\n\t\"getbalance\":             {},\n\t\"getnewaddress\":          {},\n\t\"getrawchangeaddress\":    {},\n\t\"getreceivedbyaccount\":   {},\n\t\"getreceivedbyaddress\":   {},\n\t\"gettransaction\":         {},\n\t\"gettxoutsetinfo\":        {},\n\t\"getunconfirmedbalance\":  {},\n\t\"getwalletinfo\":          {},\n\t\"importprivkey\":          {},\n\t\"importwallet\":           {},\n\t\"keypoolrefill\":          {},\n\t\"listaccounts\":           {},\n\t\"listaddressgroupings\":   {},\n\t\"listlockunspent\":        {},\n\t\"listreceivedbyaccount\":  {},\n\t\"listreceivedbyaddress\":  {},\n\t\"listsinceblock\":         {},\n\t\"listtransactions\":       {},\n\t\"listunspent\":            {},\n\t\"lockunspent\":            {},\n\t\"move\":                   {},\n\t\"sendfrom\":               {},\n\t\"sendmany\":               {},\n\t\"sendtoaddress\":          {},\n\t\"setaccount\":             {},\n\t\"settxfee\":               {},\n\t\"signmessage\":            {},\n\t\"signrawtransaction\":     {},\n\t\"walletlock\":             {},\n\t\"walletpassphrase\":       {},\n\t\"walletpassphrasechange\": {},\n}\n\n// Commands that are currently unimplemented, but should ultimately be.\nvar rpcUnimplemented = map[string]struct{}{\n\t\"estimatepriority\": {},\n\t\"getmempoolentry\":  {},\n\t\"getnetworkinfo\":   {},\n\t\"getwork\":          {},\n\t\"preciousblock\":    {},\n}\n\n// Commands that are available to a limited user\nvar rpcLimited = map[string]struct{}{\n\t// Websockets commands\n\t\"loadtxfilter\":          {},\n\t\"notifyblocks\":          {},\n\t\"notifynewtransactions\": {},\n\t\"notifyreceived\":        {},\n\t\"notifyspent\":           {},\n\t\"rescan\":                {},\n\t\"rescanblocks\":          {},\n\t\"session\":               {},\n\n\t// Websockets AND HTTP/S commands\n\t\"help\": {},\n\n\t// HTTP/S-only commands\n\t\"createrawtransaction\":  {},\n\t\"decoderawtransaction\":  {},\n\t\"decodescript\":          {},\n\t\"estimatefee\":           {},\n\t\"getbestblock\":          {},\n\t\"getbestblockhash\":      {},\n\t\"getblock\":              {},\n\t\"getblockcount\":         {},\n\t\"getblockhash\":          {},\n\t\"getblockheader\":        {},\n\t\"getchaintips\":          {},\n\t\"getcfilter\":            {},\n\t\"getcfilterheader\":      {},\n\t\"getcurrentnet\":         {},\n\t\"getdifficulty\":         {},\n\t\"getheaders\":            {},\n\t\"getinfo\":               {},\n\t\"getnettotals\":          {},\n\t\"getnetworkhashps\":      {},\n\t\"getrawmempool\":         {},\n\t\"getrawtransaction\":     {},\n\t\"gettxout\":              {},\n\t\"invalidateblock\":       {},\n\t\"reconsiderblock\":       {},\n\t\"searchrawtransactions\": {},\n\t\"sendrawtransaction\":    {},\n\t\"submitblock\":           {},\n\t\"uptime\":                {},\n\t\"validateaddress\":       {},\n\t\"verifymessage\":         {},\n\t\"version\":               {},\n}\n\n// builderScript is a convenience function which is used for hard-coded scripts\n// built with the script builder.   Any errors are converted to a panic since it\n// is only, and must only, be used with hard-coded, and therefore, known good,\n// scripts.\nfunc builderScript(builder *txscript.ScriptBuilder) []byte {\n\tscript, err := builder.Script()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn script\n}\n\n// internalRPCError is a convenience function to convert an internal error to\n// an RPC error with the appropriate code set.  It also logs the error to the\n// RPC server subsystem since internal errors really should not occur.  The\n// context parameter is only used in the log message and may be empty if it's\n// not needed.\nfunc internalRPCError(errStr, context string) *btcjson.RPCError {\n\tlogStr := errStr\n\tif context != \"\" {\n\t\tlogStr = context + \": \" + errStr\n\t}\n\trpcsLog.Error(logStr)\n\treturn btcjson.NewRPCError(btcjson.ErrRPCInternal.Code, errStr)\n}\n\n// rpcDecodeHexError is a convenience function for returning a nicely formatted\n// RPC error which indicates the provided hex string failed to decode.\nfunc rpcDecodeHexError(gotHex string) *btcjson.RPCError {\n\treturn btcjson.NewRPCError(btcjson.ErrRPCDecodeHexString,\n\t\tfmt.Sprintf(\"Argument must be hexadecimal string (not %q)\",\n\t\t\tgotHex))\n}\n\n// rpcNoTxInfoError is a convenience function for returning a nicely formatted\n// RPC error which indicates there is no information available for the provided\n// transaction hash.\nfunc rpcNoTxInfoError(txHash *chainhash.Hash) *btcjson.RPCError {\n\treturn btcjson.NewRPCError(btcjson.ErrRPCNoTxInfo,\n\t\tfmt.Sprintf(\"No information available about transaction %v\",\n\t\t\ttxHash))\n}\n\n// gbtWorkState houses state that is used in between multiple RPC invocations to\n// getblocktemplate.\ntype gbtWorkState struct {\n\tsync.Mutex\n\tlastTxUpdate  time.Time\n\tlastGenerated time.Time\n\tprevHash      *chainhash.Hash\n\tminTimestamp  time.Time\n\ttemplate      *mining.BlockTemplate\n\tnotifyMap     map[chainhash.Hash]map[int64]chan struct{}\n\ttimeSource    blockchain.MedianTimeSource\n}\n\n// newGbtWorkState returns a new instance of a gbtWorkState with all internal\n// fields initialized and ready to use.\nfunc newGbtWorkState(timeSource blockchain.MedianTimeSource) *gbtWorkState {\n\treturn &gbtWorkState{\n\t\tnotifyMap:  make(map[chainhash.Hash]map[int64]chan struct{}),\n\t\ttimeSource: timeSource,\n\t}\n}\n\n// handleUnimplemented is the handler for commands that should ultimately be\n// supported but are not yet implemented.\nfunc handleUnimplemented(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\treturn nil, ErrRPCUnimplemented\n}\n\n// handleAskWallet is the handler for commands that are recognized as valid, but\n// are unable to answer correctly since it involves wallet state.\n// These commands will be implemented in btcwallet.\nfunc handleAskWallet(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\treturn nil, ErrRPCNoWallet\n}\n\n// handleAddNode handles addnode commands.\nfunc handleAddNode(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.AddNodeCmd)\n\n\taddr := normalizeAddress(c.Addr, s.cfg.ChainParams.DefaultPort)\n\tvar err error\n\tswitch c.SubCmd {\n\tcase \"add\":\n\t\terr = s.cfg.ConnMgr.Connect(addr, true)\n\tcase \"remove\":\n\t\terr = s.cfg.ConnMgr.RemoveByAddr(addr)\n\tcase \"onetry\":\n\t\terr = s.cfg.ConnMgr.Connect(addr, false)\n\tdefault:\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\tMessage: \"invalid subcommand for addnode\",\n\t\t}\n\t}\n\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n\n\t// no data returned unless an error.\n\treturn nil, nil\n}\n\n// handleNode handles node commands.\nfunc handleNode(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.NodeCmd)\n\n\tvar addr string\n\tvar nodeID uint64\n\tvar errN, err error\n\tparams := s.cfg.ChainParams\n\tswitch c.SubCmd {\n\tcase \"disconnect\":\n\t\t// If we have a valid uint disconnect by node id. Otherwise,\n\t\t// attempt to disconnect by address, returning an error if a\n\t\t// valid IP address is not supplied.\n\t\tif nodeID, errN = strconv.ParseUint(c.Target, 10, 32); errN == nil {\n\t\t\terr = s.cfg.ConnMgr.DisconnectByID(int32(nodeID))\n\t\t} else {\n\t\t\tif _, _, errP := net.SplitHostPort(c.Target); errP == nil || net.ParseIP(c.Target) != nil {\n\t\t\t\taddr = normalizeAddress(c.Target, params.DefaultPort)\n\t\t\t\terr = s.cfg.ConnMgr.DisconnectByAddr(addr)\n\t\t\t} else {\n\t\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\t\t\tMessage: \"invalid address or node ID\",\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif err != nil && peerExists(s.cfg.ConnMgr, addr, int32(nodeID)) {\n\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCMisc,\n\t\t\t\tMessage: \"can't disconnect a permanent peer, use remove\",\n\t\t\t}\n\t\t}\n\n\tcase \"remove\":\n\t\t// If we have a valid uint disconnect by node id. Otherwise,\n\t\t// attempt to disconnect by address, returning an error if a\n\t\t// valid IP address is not supplied.\n\t\tif nodeID, errN = strconv.ParseUint(c.Target, 10, 32); errN == nil {\n\t\t\terr = s.cfg.ConnMgr.RemoveByID(int32(nodeID))\n\t\t} else {\n\t\t\tif _, _, errP := net.SplitHostPort(c.Target); errP == nil || net.ParseIP(c.Target) != nil {\n\t\t\t\taddr = normalizeAddress(c.Target, params.DefaultPort)\n\t\t\t\terr = s.cfg.ConnMgr.RemoveByAddr(addr)\n\t\t\t} else {\n\t\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\t\t\tMessage: \"invalid address or node ID\",\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif err != nil && peerExists(s.cfg.ConnMgr, addr, int32(nodeID)) {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCMisc,\n\t\t\t\tMessage: \"can't remove a temporary peer, use disconnect\",\n\t\t\t}\n\t\t}\n\n\tcase \"connect\":\n\t\taddr = normalizeAddress(c.Target, params.DefaultPort)\n\n\t\t// Default to temporary connections.\n\t\tsubCmd := \"temp\"\n\t\tif c.ConnectSubCmd != nil {\n\t\t\tsubCmd = *c.ConnectSubCmd\n\t\t}\n\n\t\tswitch subCmd {\n\t\tcase \"perm\", \"temp\":\n\t\t\terr = s.cfg.ConnMgr.Connect(addr, subCmd == \"perm\")\n\t\tdefault:\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\t\tMessage: \"invalid subcommand for node connect\",\n\t\t\t}\n\t\t}\n\tdefault:\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\tMessage: \"invalid subcommand for node\",\n\t\t}\n\t}\n\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n\n\t// no data returned unless an error.\n\treturn nil, nil\n}\n\n// peerExists determines if a certain peer is currently connected given\n// information about all currently connected peers. Peer existence is\n// determined using either a target address or node id.\nfunc peerExists(connMgr rpcserverConnManager, addr string, nodeID int32) bool {\n\tfor _, p := range connMgr.ConnectedPeers() {\n\t\tif p.ToPeer().ID() == nodeID || p.ToPeer().Addr() == addr {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// messageToHex serializes a message to the wire protocol encoding using the\n// latest protocol version and returns a hex-encoded string of the result.\nfunc messageToHex(msg wire.Message) (string, error) {\n\tvar buf bytes.Buffer\n\tif err := msg.BtcEncode(&buf, maxProtocolVersion, wire.WitnessEncoding); err != nil {\n\t\tcontext := fmt.Sprintf(\"Failed to encode msg of type %T\", msg)\n\t\treturn \"\", internalRPCError(err.Error(), context)\n\t}\n\n\treturn hex.EncodeToString(buf.Bytes()), nil\n}\n\n// handleCreateRawTransaction handles createrawtransaction commands.\nfunc handleCreateRawTransaction(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.CreateRawTransactionCmd)\n\n\t// Validate the locktime, if given.\n\tif c.LockTime != nil &&\n\t\t(*c.LockTime < 0 || *c.LockTime > int64(wire.MaxTxInSequenceNum)) {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\tMessage: \"Locktime out of range\",\n\t\t}\n\t}\n\n\t// Add all transaction inputs to a new transaction after performing\n\t// some validity checks.\n\tmtx := wire.NewMsgTx(wire.TxVersion)\n\tfor _, input := range c.Inputs {\n\t\ttxHash, err := chainhash.NewHashFromStr(input.Txid)\n\t\tif err != nil {\n\t\t\treturn nil, rpcDecodeHexError(input.Txid)\n\t\t}\n\n\t\tprevOut := wire.NewOutPoint(txHash, input.Vout)\n\t\ttxIn := wire.NewTxIn(prevOut, []byte{}, nil)\n\t\tif c.LockTime != nil && *c.LockTime != 0 {\n\t\t\ttxIn.Sequence = wire.MaxTxInSequenceNum - 1\n\t\t}\n\t\tmtx.AddTxIn(txIn)\n\t}\n\n\t// Add all transaction outputs to the transaction after performing\n\t// some validity checks.\n\tparams := s.cfg.ChainParams\n\tfor encodedAddr, amount := range c.Amounts {\n\t\t// Ensure amount is in the valid range for monetary amounts.\n\t\tif amount <= 0 || amount*btcutil.SatoshiPerBitcoin > btcutil.MaxSatoshi {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCType,\n\t\t\t\tMessage: \"Invalid amount\",\n\t\t\t}\n\t\t}\n\n\t\t// Decode the provided address.\n\t\taddr, err := btcutil.DecodeAddress(encodedAddr, params)\n\t\tif err != nil {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCInvalidAddressOrKey,\n\t\t\t\tMessage: \"Invalid address or key: \" + err.Error(),\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the address is one of the supported types and that\n\t\t// the network encoded with the address matches the network the\n\t\t// server is currently on.\n\t\tswitch addr.(type) {\n\t\tcase *btcutil.AddressPubKeyHash:\n\t\tcase *btcutil.AddressScriptHash:\n\t\tdefault:\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCInvalidAddressOrKey,\n\t\t\t\tMessage: \"Invalid address or key\",\n\t\t\t}\n\t\t}\n\t\tif !addr.IsForNet(params) {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode: btcjson.ErrRPCInvalidAddressOrKey,\n\t\t\t\tMessage: \"Invalid address: \" + encodedAddr +\n\t\t\t\t\t\" is for the wrong network\",\n\t\t\t}\n\t\t}\n\n\t\t// Create a new script which pays to the provided address.\n\t\tpkScript, err := txscript.PayToAddrScript(addr)\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to generate pay-to-address script\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\n\t\t// Convert the amount to satoshi.\n\t\tsatoshi, err := btcutil.NewAmount(amount)\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to convert amount\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\n\t\ttxOut := wire.NewTxOut(int64(satoshi), pkScript)\n\t\tmtx.AddTxOut(txOut)\n\t}\n\n\t// Set the Locktime, if given.\n\tif c.LockTime != nil {\n\t\tmtx.LockTime = uint32(*c.LockTime)\n\t}\n\n\t// Return the serialized and hex-encoded transaction.  Note that this\n\t// is intentionally not directly returning because the first return\n\t// value is a string and it would result in returning an empty string to\n\t// the client instead of nothing (nil) in the case of an error.\n\tmtxHex, err := messageToHex(mtx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn mtxHex, nil\n}\n\n// handleDebugLevel handles debuglevel commands.\nfunc handleDebugLevel(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.DebugLevelCmd)\n\n\t// Special show command to list supported subsystems.\n\tif c.LevelSpec == \"show\" {\n\t\treturn fmt.Sprintf(\"Supported subsystems %v\",\n\t\t\tsupportedSubsystems()), nil\n\t}\n\n\terr := parseAndSetDebugLevels(c.LevelSpec)\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidParams.Code,\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n\n\treturn \"Done.\", nil\n}\n\n// createVinList returns a slice of JSON objects for the inputs of the passed\n// transaction.\nfunc createVinList(mtx *wire.MsgTx) []btcjson.Vin {\n\t// Coinbase transactions only have a single txin by definition.\n\tvinList := make([]btcjson.Vin, len(mtx.TxIn))\n\tif blockchain.IsCoinBaseTx(mtx) {\n\t\ttxIn := mtx.TxIn[0]\n\t\tvinList[0].Coinbase = hex.EncodeToString(txIn.SignatureScript)\n\t\tvinList[0].Sequence = txIn.Sequence\n\t\tvinList[0].Witness = txIn.Witness.ToHexStrings()\n\t\treturn vinList\n\t}\n\n\tfor i, txIn := range mtx.TxIn {\n\t\t// The disassembled string will contain [error] inline\n\t\t// if the script doesn't fully parse, so ignore the\n\t\t// error here.\n\t\tdisbuf, _ := txscript.DisasmString(txIn.SignatureScript)\n\n\t\tvinEntry := &vinList[i]\n\t\tvinEntry.Txid = txIn.PreviousOutPoint.Hash.String()\n\t\tvinEntry.Vout = txIn.PreviousOutPoint.Index\n\t\tvinEntry.Sequence = txIn.Sequence\n\t\tvinEntry.ScriptSig = &btcjson.ScriptSig{\n\t\t\tAsm: disbuf,\n\t\t\tHex: hex.EncodeToString(txIn.SignatureScript),\n\t\t}\n\n\t\tif mtx.HasWitness() {\n\t\t\tvinEntry.Witness = txIn.Witness.ToHexStrings()\n\t\t}\n\t}\n\n\treturn vinList\n}\n\n// createVoutList returns a slice of JSON objects for the outputs of the passed\n// transaction.\nfunc createVoutList(mtx *wire.MsgTx, chainParams *chaincfg.Params, filterAddrMap map[string]struct{}) []btcjson.Vout {\n\tvoutList := make([]btcjson.Vout, 0, len(mtx.TxOut))\n\tfor i, v := range mtx.TxOut {\n\t\t// The disassembled string will contain [error] inline if the\n\t\t// script doesn't fully parse, so ignore the error here.\n\t\tdisbuf, _ := txscript.DisasmString(v.PkScript)\n\n\t\t// Ignore the error here since an error means the script\n\t\t// couldn't parse and there is no additional information about\n\t\t// it anyways.\n\t\tscriptClass, addrs, reqSigs, _ := txscript.ExtractPkScriptAddrs(\n\t\t\tv.PkScript, chainParams)\n\n\t\t// Encode the addresses while checking if the address passes the\n\t\t// filter when needed.\n\t\tpassesFilter := len(filterAddrMap) == 0\n\t\tencodedAddrs := make([]string, len(addrs))\n\t\tfor j, addr := range addrs {\n\t\t\tencodedAddr := addr.EncodeAddress()\n\t\t\tencodedAddrs[j] = encodedAddr\n\n\t\t\t// No need to check the map again if the filter already\n\t\t\t// passes.\n\t\t\tif passesFilter {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, exists := filterAddrMap[encodedAddr]; exists {\n\t\t\t\tpassesFilter = true\n\t\t\t}\n\t\t}\n\n\t\tif !passesFilter {\n\t\t\tcontinue\n\t\t}\n\n\t\tvar vout btcjson.Vout\n\t\tvout.N = uint32(i)\n\t\tvout.Value = btcutil.Amount(v.Value).ToBTC()\n\t\tvout.ScriptPubKey.Addresses = encodedAddrs\n\t\tvout.ScriptPubKey.Asm = disbuf\n\t\tvout.ScriptPubKey.Hex = hex.EncodeToString(v.PkScript)\n\t\tvout.ScriptPubKey.Type = scriptClass.String()\n\t\tvout.ScriptPubKey.ReqSigs = int32(reqSigs)\n\n\t\t// Address is defined when there's a single well-defined\n\t\t// receiver address. To spend the output a signature for this,\n\t\t// and only this, address is required.\n\t\tif len(encodedAddrs) == 1 && reqSigs <= 1 {\n\t\t\tvout.ScriptPubKey.Address = encodedAddrs[0]\n\t\t}\n\n\t\tvoutList = append(voutList, vout)\n\t}\n\n\treturn voutList\n}\n\n// createTxRawResult converts the passed transaction and associated parameters\n// to a raw transaction JSON object.\nfunc createTxRawResult(chainParams *chaincfg.Params, mtx *wire.MsgTx,\n\ttxHash string, blkHeader *wire.BlockHeader, blkHash string,\n\tblkHeight int32, chainHeight int32) (*btcjson.TxRawResult, error) {\n\n\tmtxHex, err := messageToHex(mtx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttxReply := &btcjson.TxRawResult{\n\t\tHex:      mtxHex,\n\t\tTxid:     txHash,\n\t\tHash:     mtx.WitnessHash().String(),\n\t\tSize:     int32(mtx.SerializeSize()),\n\t\tVsize:    int32(mempool.GetTxVirtualSize(btcutil.NewTx(mtx))),\n\t\tWeight:   int32(blockchain.GetTransactionWeight(btcutil.NewTx(mtx))),\n\t\tVin:      createVinList(mtx),\n\t\tVout:     createVoutList(mtx, chainParams, nil),\n\t\tVersion:  uint32(mtx.Version),\n\t\tLockTime: mtx.LockTime,\n\t}\n\n\tif blkHeader != nil {\n\t\t// This is not a typo, they are identical in bitcoind as well.\n\t\ttxReply.Time = blkHeader.Timestamp.Unix()\n\t\ttxReply.Blocktime = blkHeader.Timestamp.Unix()\n\t\ttxReply.BlockHash = blkHash\n\t\ttxReply.Confirmations = uint64(1 + chainHeight - blkHeight)\n\t}\n\n\treturn txReply, nil\n}\n\n// handleDecodeRawTransaction handles decoderawtransaction commands.\nfunc handleDecodeRawTransaction(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.DecodeRawTransactionCmd)\n\n\t// Deserialize the transaction.\n\thexStr := c.HexTx\n\tif len(hexStr)%2 != 0 {\n\t\thexStr = \"0\" + hexStr\n\t}\n\tserializedTx, err := hex.DecodeString(hexStr)\n\tif err != nil {\n\t\treturn nil, rpcDecodeHexError(hexStr)\n\t}\n\tvar mtx wire.MsgTx\n\terr = mtx.Deserialize(bytes.NewReader(serializedTx))\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCDeserialization,\n\t\t\tMessage: \"TX decode failed: \" + err.Error(),\n\t\t}\n\t}\n\n\t// Create and return the result.\n\ttxReply := btcjson.TxRawDecodeResult{\n\t\tTxid:     mtx.TxHash().String(),\n\t\tVersion:  mtx.Version,\n\t\tLocktime: mtx.LockTime,\n\t\tVin:      createVinList(&mtx),\n\t\tVout:     createVoutList(&mtx, s.cfg.ChainParams, nil),\n\t}\n\treturn txReply, nil\n}\n\n// handleDecodeScript handles decodescript commands.\nfunc handleDecodeScript(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.DecodeScriptCmd)\n\n\t// Convert the hex script to bytes.\n\thexStr := c.HexScript\n\tif len(hexStr)%2 != 0 {\n\t\thexStr = \"0\" + hexStr\n\t}\n\tscript, err := hex.DecodeString(hexStr)\n\tif err != nil {\n\t\treturn nil, rpcDecodeHexError(hexStr)\n\t}\n\n\t// The disassembled string will contain [error] inline if the script\n\t// doesn't fully parse, so ignore the error here.\n\tdisbuf, _ := txscript.DisasmString(script)\n\n\t// Get information about the script.\n\t// Ignore the error here since an error means the script couldn't parse\n\t// and there is no additional information about it anyways.\n\tscriptClass, addrs, reqSigs, _ := txscript.ExtractPkScriptAddrs(script,\n\t\ts.cfg.ChainParams)\n\taddresses := make([]string, len(addrs))\n\tfor i, addr := range addrs {\n\t\taddresses[i] = addr.EncodeAddress()\n\t}\n\n\t// Convert the script itself to a pay-to-script-hash address.\n\tp2sh, err := btcutil.NewAddressScriptHash(script, s.cfg.ChainParams)\n\tif err != nil {\n\t\tcontext := \"Failed to convert script to pay-to-script-hash\"\n\t\treturn nil, internalRPCError(err.Error(), context)\n\t}\n\n\t// Generate and return the reply.\n\treply := btcjson.DecodeScriptResult{\n\t\tAsm:       disbuf,\n\t\tReqSigs:   int32(reqSigs),\n\t\tType:      scriptClass.String(),\n\t\tAddresses: addresses,\n\t}\n\tif scriptClass != txscript.ScriptHashTy {\n\t\treply.P2sh = p2sh.EncodeAddress()\n\t}\n\n\t// Address is defined when there's a single well-defined\n\t// receiver address. To spend the output a signature for this,\n\t// and only this, address is required.\n\tif len(addresses) == 1 && reqSigs <= 1 {\n\t\treply.Address = addresses[0]\n\t}\n\treturn reply, nil\n}\n\n// handleEstimateFee handles estimatefee commands.\nfunc handleEstimateFee(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.EstimateFeeCmd)\n\n\tif s.cfg.FeeEstimator == nil {\n\t\treturn nil, errors.New(\"Fee estimation disabled\")\n\t}\n\n\tif c.NumBlocks <= 0 {\n\t\treturn -1.0, errors.New(\"Parameter NumBlocks must be positive\")\n\t}\n\n\tfeeRate, err := s.cfg.FeeEstimator.EstimateFee(uint32(c.NumBlocks))\n\n\tif err != nil {\n\t\treturn -1.0, err\n\t}\n\n\t// Convert to satoshis per kb.\n\treturn float64(feeRate), nil\n}\n\n// handleGenerate handles generate commands.\nfunc handleGenerate(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\t// Respond with an error if there are no addresses to pay the\n\t// created blocks to.\n\tif len(cfg.miningAddrs) == 0 {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode: btcjson.ErrRPCInternal.Code,\n\t\t\tMessage: \"No payment addresses specified \" +\n\t\t\t\t\"via --miningaddr\",\n\t\t}\n\t}\n\n\t// Respond with an error if there's virtually 0 chance of mining a block\n\t// with the CPU.\n\tif !s.cfg.ChainParams.GenerateSupported {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode: btcjson.ErrRPCDifficulty,\n\t\t\tMessage: fmt.Sprintf(\"No support for `generate` on \"+\n\t\t\t\t\"the current network, %s, as it's unlikely to \"+\n\t\t\t\t\"be possible to mine a block with the CPU.\",\n\t\t\t\ts.cfg.ChainParams.Net),\n\t\t}\n\t}\n\n\tc := cmd.(*btcjson.GenerateCmd)\n\n\t// Respond with an error if the client is requesting 0 blocks to be generated.\n\tif c.NumBlocks == 0 {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInternal.Code,\n\t\t\tMessage: \"Please request a nonzero number of blocks to generate.\",\n\t\t}\n\t}\n\n\t// Create a reply\n\treply := make([]string, c.NumBlocks)\n\n\tblockHashes, err := s.cfg.CPUMiner.GenerateNBlocks(c.NumBlocks)\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInternal.Code,\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n\n\t// Mine the correct number of blocks, assigning the hex representation of the\n\t// hash of each one to its place in the reply.\n\tfor i, hash := range blockHashes {\n\t\treply[i] = hash.String()\n\t}\n\n\treturn reply, nil\n}\n\n// handleGetAddedNodeInfo handles getaddednodeinfo commands.\nfunc handleGetAddedNodeInfo(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.GetAddedNodeInfoCmd)\n\n\t// Retrieve a list of persistent (added) peers from the server and\n\t// filter the list of peers per the specified address (if any).\n\tpeers := s.cfg.ConnMgr.PersistentPeers()\n\tif c.Node != nil {\n\t\tnode := *c.Node\n\t\tfound := false\n\t\tfor i, peer := range peers {\n\t\t\tif peer.ToPeer().Addr() == node {\n\t\t\t\tpeers = peers[i : i+1]\n\t\t\t\tfound = true\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCClientNodeNotAdded,\n\t\t\t\tMessage: \"Node has not been added\",\n\t\t\t}\n\t\t}\n\t}\n\n\t// Without the dns flag, the result is just a slice of the addresses as\n\t// strings.\n\tif !c.DNS {\n\t\tresults := make([]string, 0, len(peers))\n\t\tfor _, peer := range peers {\n\t\t\tresults = append(results, peer.ToPeer().Addr())\n\t\t}\n\t\treturn results, nil\n\t}\n\n\t// With the dns flag, the result is an array of JSON objects which\n\t// include the result of DNS lookups for each peer.\n\tresults := make([]*btcjson.GetAddedNodeInfoResult, 0, len(peers))\n\tfor _, rpcPeer := range peers {\n\t\t// Set the \"address\" of the peer which could be an ip address\n\t\t// or a domain name.\n\t\tpeer := rpcPeer.ToPeer()\n\t\tvar result btcjson.GetAddedNodeInfoResult\n\t\tresult.AddedNode = peer.Addr()\n\t\tresult.Connected = btcjson.Bool(peer.Connected())\n\n\t\t// Split the address into host and port portions so we can do\n\t\t// a DNS lookup against the host.  When no port is specified in\n\t\t// the address, just use the address as the host.\n\t\thost, _, err := net.SplitHostPort(peer.Addr())\n\t\tif err != nil {\n\t\t\thost = peer.Addr()\n\t\t}\n\n\t\tvar ipList []string\n\t\tswitch {\n\t\tcase net.ParseIP(host) != nil, strings.HasSuffix(host, \".onion\"):\n\t\t\tipList = make([]string, 1)\n\t\t\tipList[0] = host\n\t\tdefault:\n\t\t\t// Do a DNS lookup for the address.  If the lookup fails, just\n\t\t\t// use the host.\n\t\t\tips, err := btcdLookup(host)\n\t\t\tif err != nil {\n\t\t\t\tipList = make([]string, 1)\n\t\t\t\tipList[0] = host\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tipList = make([]string, 0, len(ips))\n\t\t\tfor _, ip := range ips {\n\t\t\t\tipList = append(ipList, ip.String())\n\t\t\t}\n\t\t}\n\n\t\t// Add the addresses and connection info to the result.\n\t\taddrs := make([]btcjson.GetAddedNodeInfoResultAddr, 0, len(ipList))\n\t\tfor _, ip := range ipList {\n\t\t\tvar addr btcjson.GetAddedNodeInfoResultAddr\n\t\t\taddr.Address = ip\n\t\t\taddr.Connected = \"false\"\n\t\t\tif ip == host && peer.Connected() {\n\t\t\t\taddr.Connected = directionString(peer.Inbound())\n\t\t\t}\n\t\t\taddrs = append(addrs, addr)\n\t\t}\n\t\tresult.Addresses = &addrs\n\t\tresults = append(results, &result)\n\t}\n\treturn results, nil\n}\n\n// handleGetBestBlock implements the getbestblock command.\nfunc handleGetBestBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\t// All other \"get block\" commands give either the height, the\n\t// hash, or both but require the block SHA.  This gets both for\n\t// the best block.\n\tbest := s.cfg.Chain.BestSnapshot()\n\tresult := &btcjson.GetBestBlockResult{\n\t\tHash:   best.Hash.String(),\n\t\tHeight: best.Height,\n\t}\n\treturn result, nil\n}\n\n// handleGetBestBlockHash implements the getbestblockhash command.\nfunc handleGetBestBlockHash(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tbest := s.cfg.Chain.BestSnapshot()\n\treturn best.Hash.String(), nil\n}\n\n// getDifficultyRatio returns the proof-of-work difficulty as a multiple of the\n// minimum difficulty using the passed bits field from the header of a block.\nfunc getDifficultyRatio(bits uint32, params *chaincfg.Params) float64 {\n\t// The minimum difficulty is the max possible proof-of-work limit bits\n\t// converted back to a number.  Note this is not the same as the proof of\n\t// work limit directly because the block difficulty is encoded in a block\n\t// with the compact form which loses precision.\n\tmax := blockchain.CompactToBig(params.PowLimitBits)\n\ttarget := blockchain.CompactToBig(bits)\n\n\tdifficulty := new(big.Rat).SetFrac(max, target)\n\toutString := difficulty.FloatString(8)\n\tdiff, err := strconv.ParseFloat(outString, 64)\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Cannot get difficulty: %v\", err)\n\t\treturn 0\n\t}\n\treturn diff\n}\n\n// handleGetBlock implements the getblock command.\nfunc handleGetBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.GetBlockCmd)\n\n\t// Load the raw block bytes from the database.\n\thash, err := chainhash.NewHashFromStr(c.Hash)\n\tif err != nil {\n\t\treturn nil, rpcDecodeHexError(c.Hash)\n\t}\n\tvar blkBytes []byte\n\terr = s.cfg.DB.View(func(dbTx database.Tx) error {\n\t\tvar err error\n\t\tblkBytes, err = dbTx.FetchBlock(hash)\n\t\treturn err\n\t})\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCBlockNotFound,\n\t\t\tMessage: \"Block not found\",\n\t\t}\n\t}\n\t// If verbosity is 0, return the serialized block as a hex encoded string.\n\tif c.Verbosity != nil && *c.Verbosity == 0 {\n\t\treturn hex.EncodeToString(blkBytes), nil\n\t}\n\n\t// Otherwise, generate the JSON object and return it.\n\n\t// Deserialize the block.\n\tblk, err := btcutil.NewBlockFromBytes(blkBytes)\n\tif err != nil {\n\t\tcontext := \"Failed to deserialize block\"\n\t\treturn nil, internalRPCError(err.Error(), context)\n\t}\n\n\t// Get the block height from chain.\n\tblockHeight, err := s.cfg.Chain.BlockHeightByHash(hash)\n\tif err != nil {\n\t\tcontext := \"Failed to obtain block height\"\n\t\treturn nil, internalRPCError(err.Error(), context)\n\t}\n\tblk.SetHeight(blockHeight)\n\tbest := s.cfg.Chain.BestSnapshot()\n\n\t// Get next block hash unless there are none.\n\tvar nextHashString string\n\tif blockHeight < best.Height {\n\t\tnextHash, err := s.cfg.Chain.BlockHashByHeight(blockHeight + 1)\n\t\tif err != nil {\n\t\t\tcontext := \"No next block\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\t\tnextHashString = nextHash.String()\n\t}\n\n\tparams := s.cfg.ChainParams\n\tblockHeader := &blk.MsgBlock().Header\n\tblockReply := btcjson.GetBlockVerboseResult{\n\t\tHash:          c.Hash,\n\t\tVersion:       blockHeader.Version,\n\t\tVersionHex:    fmt.Sprintf(\"%08x\", blockHeader.Version),\n\t\tMerkleRoot:    blockHeader.MerkleRoot.String(),\n\t\tPreviousHash:  blockHeader.PrevBlock.String(),\n\t\tNonce:         blockHeader.Nonce,\n\t\tTime:          blockHeader.Timestamp.Unix(),\n\t\tConfirmations: int64(1 + best.Height - blockHeight),\n\t\tHeight:        int64(blockHeight),\n\t\tSize:          int32(len(blkBytes)),\n\t\tStrippedSize:  int32(blk.MsgBlock().SerializeSizeStripped()),\n\t\tWeight:        int32(blockchain.GetBlockWeight(blk)),\n\t\tBits:          strconv.FormatInt(int64(blockHeader.Bits), 16),\n\t\tDifficulty:    getDifficultyRatio(blockHeader.Bits, params),\n\t\tNextHash:      nextHashString,\n\t}\n\n\tif *c.Verbosity == 1 {\n\t\ttransactions := blk.Transactions()\n\t\ttxNames := make([]string, len(transactions))\n\t\tfor i, tx := range transactions {\n\t\t\ttxNames[i] = tx.Hash().String()\n\t\t}\n\n\t\tblockReply.Tx = txNames\n\t} else {\n\t\ttxns := blk.Transactions()\n\t\trawTxns := make([]btcjson.TxRawResult, len(txns))\n\t\tfor i, tx := range txns {\n\t\t\trawTxn, err := createTxRawResult(params, tx.MsgTx(),\n\t\t\t\ttx.Hash().String(), blockHeader, hash.String(),\n\t\t\t\tblockHeight, best.Height)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\trawTxns[i] = *rawTxn\n\t\t}\n\t\tblockReply.RawTx = rawTxns\n\t}\n\n\treturn blockReply, nil\n}\n\n// softForkStatus converts a ThresholdState state into a human readable string\n// corresponding to the particular state.\nfunc softForkStatus(state blockchain.ThresholdState) (string, error) {\n\tswitch state {\n\tcase blockchain.ThresholdDefined:\n\t\treturn \"defined\", nil\n\tcase blockchain.ThresholdStarted:\n\t\treturn \"started\", nil\n\tcase blockchain.ThresholdLockedIn:\n\t\treturn \"lockedin\", nil\n\tcase blockchain.ThresholdActive:\n\t\treturn \"active\", nil\n\tcase blockchain.ThresholdFailed:\n\t\treturn \"failed\", nil\n\tdefault:\n\t\treturn \"\", fmt.Errorf(\"unknown deployment state: %v\", state)\n\t}\n}\n\n// handleGetBlockChainInfo implements the getblockchaininfo command.\nfunc handleGetBlockChainInfo(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\t// Obtain a snapshot of the current best known blockchain state. We'll\n\t// populate the response to this call primarily from this snapshot.\n\tparams := s.cfg.ChainParams\n\tchain := s.cfg.Chain\n\tchainSnapshot := chain.BestSnapshot()\n\n\tchainInfo := &btcjson.GetBlockChainInfoResult{\n\t\tChain:         params.Name,\n\t\tBlocks:        chainSnapshot.Height,\n\t\tHeaders:       chainSnapshot.Height,\n\t\tBestBlockHash: chainSnapshot.Hash.String(),\n\t\tDifficulty:    getDifficultyRatio(chainSnapshot.Bits, params),\n\t\tMedianTime:    chainSnapshot.MedianTime.Unix(),\n\t\tPruned:        cfg.Prune != 0,\n\t\tSoftForks: &btcjson.SoftForks{\n\t\t\tBip9SoftForks: make(map[string]*btcjson.Bip9SoftForkDescription),\n\t\t},\n\t}\n\n\t// Next, populate the response with information describing the current\n\t// status of soft-forks deployed via the super-majority block\n\t// signalling mechanism.\n\theight := chainSnapshot.Height\n\tchainInfo.SoftForks.SoftForks = []*btcjson.SoftForkDescription{\n\t\t{\n\t\t\tID:      \"bip34\",\n\t\t\tVersion: 2,\n\t\t\tReject: struct {\n\t\t\t\tStatus bool `json:\"status\"`\n\t\t\t}{\n\t\t\t\tStatus: height >= params.BIP0034Height,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tID:      \"bip66\",\n\t\t\tVersion: 3,\n\t\t\tReject: struct {\n\t\t\t\tStatus bool `json:\"status\"`\n\t\t\t}{\n\t\t\t\tStatus: height >= params.BIP0066Height,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tID:      \"bip65\",\n\t\t\tVersion: 4,\n\t\t\tReject: struct {\n\t\t\t\tStatus bool `json:\"status\"`\n\t\t\t}{\n\t\t\t\tStatus: height >= params.BIP0065Height,\n\t\t\t},\n\t\t},\n\t}\n\n\t// Finally, query the BIP0009 version bits state for all currently\n\t// defined BIP0009 soft-fork deployments.\n\tfor deployment, deploymentDetails := range params.Deployments {\n\t\t// Map the integer deployment ID into a human readable\n\t\t// fork-name.\n\t\tvar forkName string\n\t\tswitch deployment {\n\t\tcase chaincfg.DeploymentTestDummy:\n\t\t\tforkName = \"dummy\"\n\n\t\tcase chaincfg.DeploymentTestDummyMinActivation:\n\t\t\tforkName = \"dummy-min-activation\"\n\n\t\tcase chaincfg.DeploymentTestDummyAlwaysActive:\n\t\t\tforkName = \"dummy-always-active\"\n\n\t\tcase chaincfg.DeploymentCSV:\n\t\t\tforkName = \"csv\"\n\n\t\tcase chaincfg.DeploymentSegwit:\n\t\t\tforkName = \"segwit\"\n\n\t\tcase chaincfg.DeploymentTaproot:\n\t\t\tforkName = \"taproot\"\n\n\t\tdefault:\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode: btcjson.ErrRPCInternal.Code,\n\t\t\t\tMessage: fmt.Sprintf(\"Unknown deployment %v \"+\n\t\t\t\t\t\"detected\", deployment),\n\t\t\t}\n\t\t}\n\n\t\t// Query the chain for the current status of the deployment as\n\t\t// identified by its deployment ID.\n\t\tdeploymentStatus, err := chain.ThresholdState(uint32(deployment))\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to obtain deployment status\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\n\t\t// Attempt to convert the current deployment status into a\n\t\t// human readable string. If the status is unrecognized, then a\n\t\t// non-nil error is returned.\n\t\tstatusString, err := softForkStatus(deploymentStatus)\n\t\tif err != nil {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode: btcjson.ErrRPCInternal.Code,\n\t\t\t\tMessage: fmt.Sprintf(\"unknown deployment status: %v\",\n\t\t\t\t\tdeploymentStatus),\n\t\t\t}\n\t\t}\n\n\t\t// Finally, populate the soft-fork description with all the\n\t\t// information gathered above.\n\t\tvar startTime, endTime int64\n\t\tif starter, ok := deploymentDetails.DeploymentStarter.(*chaincfg.MedianTimeDeploymentStarter); ok {\n\t\t\tstartTime = starter.StartTime().Unix()\n\t\t}\n\t\tif ender, ok := deploymentDetails.DeploymentEnder.(*chaincfg.MedianTimeDeploymentEnder); ok {\n\t\t\tendTime = ender.EndTime().Unix()\n\t\t}\n\t\tchainInfo.SoftForks.Bip9SoftForks[forkName] = &btcjson.Bip9SoftForkDescription{\n\t\t\tStatus:              strings.ToLower(statusString),\n\t\t\tBit:                 deploymentDetails.BitNumber,\n\t\t\tStartTime2:          startTime,\n\t\t\tTimeout:             endTime,\n\t\t\tMinActivationHeight: int32(deploymentDetails.MinActivationHeight),\n\t\t}\n\t}\n\n\treturn chainInfo, nil\n}\n\n// handleGetBlockCount implements the getblockcount command.\nfunc handleGetBlockCount(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tbest := s.cfg.Chain.BestSnapshot()\n\treturn int64(best.Height), nil\n}\n\n// handleGetBlockHash implements the getblockhash command.\nfunc handleGetBlockHash(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.GetBlockHashCmd)\n\thash, err := s.cfg.Chain.BlockHashByHeight(int32(c.Index))\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCOutOfRange,\n\t\t\tMessage: \"Block number out of range\",\n\t\t}\n\t}\n\n\treturn hash.String(), nil\n}\n\n// handleGetBlockHeader implements the getblockheader command.\nfunc handleGetBlockHeader(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.GetBlockHeaderCmd)\n\n\t// Fetch the header from chain.\n\thash, err := chainhash.NewHashFromStr(c.Hash)\n\tif err != nil {\n\t\treturn nil, rpcDecodeHexError(c.Hash)\n\t}\n\tblockHeader, err := s.cfg.Chain.HeaderByHash(hash)\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCBlockNotFound,\n\t\t\tMessage: \"Block not found\",\n\t\t}\n\t}\n\n\t// When the verbose flag isn't set, simply return the serialized block\n\t// header as a hex-encoded string.\n\tif c.Verbose != nil && !*c.Verbose {\n\t\tvar headerBuf bytes.Buffer\n\t\terr := blockHeader.Serialize(&headerBuf)\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to serialize block header\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\t\treturn hex.EncodeToString(headerBuf.Bytes()), nil\n\t}\n\n\t// The verbose flag is set, so generate the JSON object and return it.\n\n\t// Get the block height from chain.\n\tblockHeight, err := s.cfg.Chain.BlockHeightByHash(hash)\n\tif err != nil {\n\t\tcontext := \"Failed to obtain block height\"\n\t\treturn nil, internalRPCError(err.Error(), context)\n\t}\n\tbest := s.cfg.Chain.BestSnapshot()\n\n\t// Get next block hash unless there are none.\n\tvar nextHashString string\n\tif blockHeight < best.Height {\n\t\tnextHash, err := s.cfg.Chain.BlockHashByHeight(blockHeight + 1)\n\t\tif err != nil {\n\t\t\tcontext := \"No next block\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\t\tnextHashString = nextHash.String()\n\t}\n\n\tparams := s.cfg.ChainParams\n\tblockHeaderReply := btcjson.GetBlockHeaderVerboseResult{\n\t\tHash:          c.Hash,\n\t\tConfirmations: int64(1 + best.Height - blockHeight),\n\t\tHeight:        blockHeight,\n\t\tVersion:       blockHeader.Version,\n\t\tVersionHex:    fmt.Sprintf(\"%08x\", blockHeader.Version),\n\t\tMerkleRoot:    blockHeader.MerkleRoot.String(),\n\t\tNextHash:      nextHashString,\n\t\tPreviousHash:  blockHeader.PrevBlock.String(),\n\t\tNonce:         uint64(blockHeader.Nonce),\n\t\tTime:          blockHeader.Timestamp.Unix(),\n\t\tBits:          strconv.FormatInt(int64(blockHeader.Bits), 16),\n\t\tDifficulty:    getDifficultyRatio(blockHeader.Bits, params),\n\t}\n\treturn blockHeaderReply, nil\n}\n\n// encodeTemplateID encodes the passed details into an ID that can be used to\n// uniquely identify a block template.\nfunc encodeTemplateID(prevHash *chainhash.Hash, lastGenerated time.Time) string {\n\treturn fmt.Sprintf(\"%s-%d\", prevHash.String(), lastGenerated.Unix())\n}\n\n// decodeTemplateID decodes an ID that is used to uniquely identify a block\n// template.  This is mainly used as a mechanism to track when to update clients\n// that are using long polling for block templates.  The ID consists of the\n// previous block hash for the associated template and the time the associated\n// template was generated.\nfunc decodeTemplateID(templateID string) (*chainhash.Hash, int64, error) {\n\tfields := strings.Split(templateID, \"-\")\n\tif len(fields) != 2 {\n\t\treturn nil, 0, errors.New(\"invalid longpollid format\")\n\t}\n\n\tprevHash, err := chainhash.NewHashFromStr(fields[0])\n\tif err != nil {\n\t\treturn nil, 0, errors.New(\"invalid longpollid format\")\n\t}\n\tlastGenerated, err := strconv.ParseInt(fields[1], 10, 64)\n\tif err != nil {\n\t\treturn nil, 0, errors.New(\"invalid longpollid format\")\n\t}\n\n\treturn prevHash, lastGenerated, nil\n}\n\n// notifyLongPollers notifies any channels that have been registered to be\n// notified when block templates are stale.\n//\n// This function MUST be called with the state locked.\nfunc (state *gbtWorkState) notifyLongPollers(latestHash *chainhash.Hash, lastGenerated time.Time) {\n\t// Notify anything that is waiting for a block template update from a\n\t// hash which is not the hash of the tip of the best chain since their\n\t// work is now invalid.\n\tfor hash, channels := range state.notifyMap {\n\t\tif !hash.IsEqual(latestHash) {\n\t\t\tfor _, c := range channels {\n\t\t\t\tclose(c)\n\t\t\t}\n\t\t\tdelete(state.notifyMap, hash)\n\t\t}\n\t}\n\n\t// Return now if the provided last generated timestamp has not been\n\t// initialized.\n\tif lastGenerated.IsZero() {\n\t\treturn\n\t}\n\n\t// Return now if there is nothing registered for updates to the current\n\t// best block hash.\n\tchannels, ok := state.notifyMap[*latestHash]\n\tif !ok {\n\t\treturn\n\t}\n\n\t// Notify anything that is waiting for a block template update from a\n\t// block template generated before the most recently generated block\n\t// template.\n\tlastGeneratedUnix := lastGenerated.Unix()\n\tfor lastGen, c := range channels {\n\t\tif lastGen < lastGeneratedUnix {\n\t\t\tclose(c)\n\t\t\tdelete(channels, lastGen)\n\t\t}\n\t}\n\n\t// Remove the entry altogether if there are no more registered\n\t// channels.\n\tif len(channels) == 0 {\n\t\tdelete(state.notifyMap, *latestHash)\n\t}\n}\n\n// NotifyBlockConnected uses the newly-connected block to notify any long poll\n// clients with a new block template when their existing block template is\n// stale due to the newly connected block.\nfunc (state *gbtWorkState) NotifyBlockConnected(blockHash *chainhash.Hash) {\n\tgo func() {\n\t\tstate.Lock()\n\t\tdefer state.Unlock()\n\n\t\tstate.notifyLongPollers(blockHash, state.lastTxUpdate)\n\t}()\n}\n\n// NotifyMempoolTx uses the new last updated time for the transaction memory\n// pool to notify any long poll clients with a new block template when their\n// existing block template is stale due to enough time passing and the contents\n// of the memory pool changing.\nfunc (state *gbtWorkState) NotifyMempoolTx(lastUpdated time.Time) {\n\tgo func() {\n\t\tstate.Lock()\n\t\tdefer state.Unlock()\n\n\t\t// No need to notify anything if no block templates have been generated\n\t\t// yet.\n\t\tif state.prevHash == nil || state.lastGenerated.IsZero() {\n\t\t\treturn\n\t\t}\n\n\t\tif time.Now().After(state.lastGenerated.Add(time.Second *\n\t\t\tgbtRegenerateSeconds)) {\n\n\t\t\tstate.notifyLongPollers(state.prevHash, lastUpdated)\n\t\t}\n\t}()\n}\n\n// templateUpdateChan returns a channel that will be closed once the block\n// template associated with the passed previous hash and last generated time\n// is stale.  The function will return existing channels for duplicate\n// parameters which allows multiple clients to wait for the same block template\n// without requiring a different channel for each client.\n//\n// This function MUST be called with the state locked.\nfunc (state *gbtWorkState) templateUpdateChan(prevHash *chainhash.Hash, lastGenerated int64) chan struct{} {\n\t// Either get the current list of channels waiting for updates about\n\t// changes to block template for the previous hash or create a new one.\n\tchannels, ok := state.notifyMap[*prevHash]\n\tif !ok {\n\t\tm := make(map[int64]chan struct{})\n\t\tstate.notifyMap[*prevHash] = m\n\t\tchannels = m\n\t}\n\n\t// Get the current channel associated with the time the block template\n\t// was last generated or create a new one.\n\tc, ok := channels[lastGenerated]\n\tif !ok {\n\t\tc = make(chan struct{})\n\t\tchannels[lastGenerated] = c\n\t}\n\n\treturn c\n}\n\n// updateBlockTemplate creates or updates a block template for the work state.\n// A new block template will be generated when the current best block has\n// changed or the transactions in the memory pool have been updated and it has\n// been long enough since the last template was generated.  Otherwise, the\n// timestamp for the existing block template is updated (and possibly the\n// difficulty on testnet per the consesus rules).  Finally, if the\n// useCoinbaseValue flag is false and the existing block template does not\n// already contain a valid payment address, the block template will be updated\n// with a randomly selected payment address from the list of configured\n// addresses.\n//\n// This function MUST be called with the state locked.\nfunc (state *gbtWorkState) updateBlockTemplate(s *rpcServer, useCoinbaseValue bool) error {\n\tgenerator := s.cfg.Generator\n\tlastTxUpdate := generator.TxSource().LastUpdated()\n\tif lastTxUpdate.IsZero() {\n\t\tlastTxUpdate = time.Now()\n\t}\n\n\t// Generate a new block template when the current best block has\n\t// changed or the transactions in the memory pool have been updated and\n\t// it has been at least gbtRegenerateSecond since the last template was\n\t// generated.\n\tvar msgBlock *wire.MsgBlock\n\tvar targetDifficulty string\n\tlatestHash := &s.cfg.Chain.BestSnapshot().Hash\n\ttemplate := state.template\n\tif template == nil || state.prevHash == nil ||\n\t\t!state.prevHash.IsEqual(latestHash) ||\n\t\t(state.lastTxUpdate != lastTxUpdate &&\n\t\t\ttime.Now().After(state.lastGenerated.Add(time.Second*\n\t\t\t\tgbtRegenerateSeconds))) {\n\n\t\t// Reset the previous best hash the block template was generated\n\t\t// against so any errors below cause the next invocation to try\n\t\t// again.\n\t\tstate.prevHash = nil\n\n\t\t// Choose a payment address at random if the caller requests a\n\t\t// full coinbase as opposed to only the pertinent details needed\n\t\t// to create their own coinbase.\n\t\tvar payAddr btcutil.Address\n\t\tif !useCoinbaseValue {\n\t\t\tpayAddr = cfg.miningAddrs[rand.Intn(len(cfg.miningAddrs))]\n\t\t}\n\n\t\t// Create a new block template that has a coinbase which anyone\n\t\t// can redeem.  This is only acceptable because the returned\n\t\t// block template doesn't include the coinbase, so the caller\n\t\t// will ultimately create their own coinbase which pays to the\n\t\t// appropriate address(es).\n\t\tblkTemplate, err := generator.NewBlockTemplate(payAddr)\n\t\tif err != nil {\n\t\t\treturn internalRPCError(\"Failed to create new block \"+\n\t\t\t\t\"template: \"+err.Error(), \"\")\n\t\t}\n\t\ttemplate = blkTemplate\n\t\tmsgBlock = template.Block\n\t\ttargetDifficulty = fmt.Sprintf(\"%064x\",\n\t\t\tblockchain.CompactToBig(msgBlock.Header.Bits))\n\n\t\t// Get the minimum allowed timestamp for the block based on the\n\t\t// median timestamp of the last several blocks per the chain\n\t\t// consensus rules.\n\t\tbest := s.cfg.Chain.BestSnapshot()\n\t\tminTimestamp := mining.MinimumMedianTime(best)\n\n\t\t// Update work state to ensure another block template isn't\n\t\t// generated until needed.\n\t\tstate.template = template\n\t\tstate.lastGenerated = time.Now()\n\t\tstate.lastTxUpdate = lastTxUpdate\n\t\tstate.prevHash = latestHash\n\t\tstate.minTimestamp = minTimestamp\n\n\t\trpcsLog.Debugf(\"Generated block template (timestamp %v, \"+\n\t\t\t\"target %s, merkle root %s)\",\n\t\t\tmsgBlock.Header.Timestamp, targetDifficulty,\n\t\t\tmsgBlock.Header.MerkleRoot)\n\n\t\t// Notify any clients that are long polling about the new\n\t\t// template.\n\t\tstate.notifyLongPollers(latestHash, lastTxUpdate)\n\t} else {\n\t\t// At this point, there is a saved block template and another\n\t\t// request for a template was made, but either the available\n\t\t// transactions haven't change or it hasn't been long enough to\n\t\t// trigger a new block template to be generated.  So, update the\n\t\t// existing block template.\n\n\t\t// When the caller requires a full coinbase as opposed to only\n\t\t// the pertinent details needed to create their own coinbase,\n\t\t// add a payment address to the output of the coinbase of the\n\t\t// template if it doesn't already have one.  Since this requires\n\t\t// mining addresses to be specified via the config, an error is\n\t\t// returned if none have been specified.\n\t\tif !useCoinbaseValue && !template.ValidPayAddress {\n\t\t\t// Choose a payment address at random.\n\t\t\tpayToAddr := cfg.miningAddrs[rand.Intn(len(cfg.miningAddrs))]\n\n\t\t\t// Update the block coinbase output of the template to\n\t\t\t// pay to the randomly selected payment address.\n\t\t\tpkScript, err := txscript.PayToAddrScript(payToAddr)\n\t\t\tif err != nil {\n\t\t\t\tcontext := \"Failed to create pay-to-addr script\"\n\t\t\t\treturn internalRPCError(err.Error(), context)\n\t\t\t}\n\t\t\ttemplate.Block.Transactions[0].TxOut[0].PkScript = pkScript\n\t\t\ttemplate.ValidPayAddress = true\n\n\t\t\t// Update the merkle root.\n\t\t\tblock := btcutil.NewBlock(template.Block)\n\t\t\tmerkleRoot := blockchain.CalcMerkleRoot(block.Transactions(), false)\n\t\t\ttemplate.Block.Header.MerkleRoot = merkleRoot\n\t\t}\n\n\t\t// Set locals for convenience.\n\t\tmsgBlock = template.Block\n\t\ttargetDifficulty = fmt.Sprintf(\"%064x\",\n\t\t\tblockchain.CompactToBig(msgBlock.Header.Bits))\n\n\t\t// Update the time of the block template to the current time\n\t\t// while accounting for the median time of the past several\n\t\t// blocks per the chain consensus rules.\n\t\tgenerator.UpdateBlockTime(msgBlock)\n\t\tmsgBlock.Header.Nonce = 0\n\n\t\trpcsLog.Debugf(\"Updated block template (timestamp %v, \"+\n\t\t\t\"target %s)\", msgBlock.Header.Timestamp,\n\t\t\ttargetDifficulty)\n\t}\n\n\treturn nil\n}\n\n// blockTemplateResult returns the current block template associated with the\n// state as a btcjson.GetBlockTemplateResult that is ready to be encoded to JSON\n// and returned to the caller.\n//\n// This function MUST be called with the state locked.\nfunc (state *gbtWorkState) blockTemplateResult(useCoinbaseValue bool, submitOld *bool) (*btcjson.GetBlockTemplateResult, error) {\n\t// Ensure the timestamps are still in valid range for the template.\n\t// This should really only ever happen if the local clock is changed\n\t// after the template is generated, but it's important to avoid serving\n\t// invalid block templates.\n\ttemplate := state.template\n\tmsgBlock := template.Block\n\theader := &msgBlock.Header\n\tadjustedTime := state.timeSource.AdjustedTime()\n\tmaxTime := adjustedTime.Add(time.Second * blockchain.MaxTimeOffsetSeconds)\n\tif header.Timestamp.After(maxTime) {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode: btcjson.ErrRPCOutOfRange,\n\t\t\tMessage: fmt.Sprintf(\"The template time is after the \"+\n\t\t\t\t\"maximum allowed time for a block - template \"+\n\t\t\t\t\"time %v, maximum time %v\", adjustedTime,\n\t\t\t\tmaxTime),\n\t\t}\n\t}\n\n\t// Convert each transaction in the block template to a template result\n\t// transaction.  The result does not include the coinbase, so notice\n\t// the adjustments to the various lengths and indices.\n\tnumTx := len(msgBlock.Transactions)\n\ttransactions := make([]btcjson.GetBlockTemplateResultTx, 0, numTx-1)\n\ttxIndex := make(map[chainhash.Hash]int64, numTx)\n\tfor i, tx := range msgBlock.Transactions {\n\t\ttxID := tx.TxHash()\n\t\ttxIndex[txID] = int64(i)\n\n\t\t// Skip the coinbase transaction.\n\t\tif i == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Create an array of 1-based indices to transactions that come\n\t\t// before this one in the transactions list which this one\n\t\t// depends on.  This is necessary since the created block must\n\t\t// ensure proper ordering of the dependencies.  A map is used\n\t\t// before creating the final array to prevent duplicate entries\n\t\t// when multiple inputs reference the same transaction.\n\t\tdependsMap := make(map[int64]struct{})\n\t\tfor _, txIn := range tx.TxIn {\n\t\t\tif idx, ok := txIndex[txIn.PreviousOutPoint.Hash]; ok {\n\t\t\t\tdependsMap[idx] = struct{}{}\n\t\t\t}\n\t\t}\n\t\tdepends := make([]int64, 0, len(dependsMap))\n\t\tfor idx := range dependsMap {\n\t\t\tdepends = append(depends, idx)\n\t\t}\n\n\t\t// Serialize the transaction for later conversion to hex.\n\t\ttxBuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\t\tif err := tx.Serialize(txBuf); err != nil {\n\t\t\tcontext := \"Failed to serialize transaction\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\n\t\tbTx := btcutil.NewTx(tx)\n\t\tresultTx := btcjson.GetBlockTemplateResultTx{\n\t\t\tData:    hex.EncodeToString(txBuf.Bytes()),\n\t\t\tTxID:    txID.String(),\n\t\t\tHash:    tx.WitnessHash().String(),\n\t\t\tDepends: depends,\n\t\t\tFee:     template.Fees[i],\n\t\t\tSigOps:  template.SigOpCosts[i],\n\t\t\tWeight:  blockchain.GetTransactionWeight(bTx),\n\t\t}\n\t\ttransactions = append(transactions, resultTx)\n\t}\n\n\t// Generate the block template reply.  Note that following mutations are\n\t// implied by the included or omission of fields:\n\t//  Including MinTime -> time/decrement\n\t//  Omitting CoinbaseTxn -> coinbase, generation\n\ttargetDifficulty := fmt.Sprintf(\"%064x\", blockchain.CompactToBig(header.Bits))\n\ttemplateID := encodeTemplateID(state.prevHash, state.lastGenerated)\n\treply := btcjson.GetBlockTemplateResult{\n\t\tBits:         strconv.FormatInt(int64(header.Bits), 16),\n\t\tCurTime:      header.Timestamp.Unix(),\n\t\tHeight:       int64(template.Height),\n\t\tPreviousHash: header.PrevBlock.String(),\n\t\tWeightLimit:  blockchain.MaxBlockWeight,\n\t\tSigOpLimit:   blockchain.MaxBlockSigOpsCost,\n\t\tSizeLimit:    wire.MaxBlockPayload,\n\t\tTransactions: transactions,\n\t\tVersion:      header.Version,\n\t\tLongPollID:   templateID,\n\t\tSubmitOld:    submitOld,\n\t\tTarget:       targetDifficulty,\n\t\tMinTime:      state.minTimestamp.Unix(),\n\t\tMaxTime:      maxTime.Unix(),\n\t\tMutable:      gbtMutableFields,\n\t\tNonceRange:   gbtNonceRange,\n\t\tCapabilities: gbtCapabilities,\n\t}\n\t// If the generated block template includes transactions with witness\n\t// data, then include the witness commitment in the GBT result.\n\tif template.WitnessCommitment != nil {\n\t\treply.DefaultWitnessCommitment = hex.EncodeToString(template.WitnessCommitment)\n\t}\n\n\tif useCoinbaseValue {\n\t\treply.CoinbaseAux = gbtCoinbaseAux\n\t\treply.CoinbaseValue = &msgBlock.Transactions[0].TxOut[0].Value\n\t} else {\n\t\t// Ensure the template has a valid payment address associated\n\t\t// with it when a full coinbase is requested.\n\t\tif !template.ValidPayAddress {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode: btcjson.ErrRPCInternal.Code,\n\t\t\t\tMessage: \"A coinbase transaction has been \" +\n\t\t\t\t\t\"requested, but the server has not \" +\n\t\t\t\t\t\"been configured with any payment \" +\n\t\t\t\t\t\"addresses via --miningaddr\",\n\t\t\t}\n\t\t}\n\n\t\t// Serialize the transaction for conversion to hex.\n\t\ttx := msgBlock.Transactions[0]\n\t\ttxBuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\t\tif err := tx.Serialize(txBuf); err != nil {\n\t\t\tcontext := \"Failed to serialize transaction\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\n\t\tresultTx := btcjson.GetBlockTemplateResultTx{\n\t\t\tData:    hex.EncodeToString(txBuf.Bytes()),\n\t\t\tHash:    tx.TxHash().String(),\n\t\t\tDepends: []int64{},\n\t\t\tFee:     template.Fees[0],\n\t\t\tSigOps:  template.SigOpCosts[0],\n\t\t}\n\n\t\treply.CoinbaseTxn = &resultTx\n\t}\n\n\treturn &reply, nil\n}\n\n// handleGetBlockTemplateLongPoll is a helper for handleGetBlockTemplateRequest\n// which deals with handling long polling for block templates.  When a caller\n// sends a request with a long poll ID that was previously returned, a response\n// is not sent until the caller should stop working on the previous block\n// template in favor of the new one.  In particular, this is the case when the\n// old block template is no longer valid due to a solution already being found\n// and added to the block chain, or new transactions have shown up and some time\n// has passed without finding a solution.\n//\n// See https://en.bitcoin.it/wiki/BIP_0022 for more details.\nfunc handleGetBlockTemplateLongPoll(s *rpcServer, longPollID string, useCoinbaseValue bool, closeChan <-chan struct{}) (interface{}, error) {\n\tstate := s.gbtWorkState\n\tstate.Lock()\n\t// The state unlock is intentionally not deferred here since it needs to\n\t// be manually unlocked before waiting for a notification about block\n\t// template changes.\n\n\tif err := state.updateBlockTemplate(s, useCoinbaseValue); err != nil {\n\t\tstate.Unlock()\n\t\treturn nil, err\n\t}\n\n\t// Just return the current block template if the long poll ID provided by\n\t// the caller is invalid.\n\tprevHash, lastGenerated, err := decodeTemplateID(longPollID)\n\tif err != nil {\n\t\tresult, err := state.blockTemplateResult(useCoinbaseValue, nil)\n\t\tif err != nil {\n\t\t\tstate.Unlock()\n\t\t\treturn nil, err\n\t\t}\n\n\t\tstate.Unlock()\n\t\treturn result, nil\n\t}\n\n\t// Return the block template now if the specific block template\n\t// identified by the long poll ID no longer matches the current block\n\t// template as this means the provided template is stale.\n\tprevTemplateHash := &state.template.Block.Header.PrevBlock\n\tif !prevHash.IsEqual(prevTemplateHash) ||\n\t\tlastGenerated != state.lastGenerated.Unix() {\n\n\t\t// Include whether or not it is valid to submit work against the\n\t\t// old block template depending on whether or not a solution has\n\t\t// already been found and added to the block chain.\n\t\tsubmitOld := prevHash.IsEqual(prevTemplateHash)\n\t\tresult, err := state.blockTemplateResult(useCoinbaseValue,\n\t\t\t&submitOld)\n\t\tif err != nil {\n\t\t\tstate.Unlock()\n\t\t\treturn nil, err\n\t\t}\n\n\t\tstate.Unlock()\n\t\treturn result, nil\n\t}\n\n\t// Register the previous hash and last generated time for notifications\n\t// Get a channel that will be notified when the template associated with\n\t// the provided ID is stale and a new block template should be returned to\n\t// the caller.\n\tlongPollChan := state.templateUpdateChan(prevHash, lastGenerated)\n\tstate.Unlock()\n\n\tselect {\n\t// When the client closes before it's time to send a reply, just return\n\t// now so the goroutine doesn't hang around.\n\tcase <-closeChan:\n\t\treturn nil, ErrClientQuit\n\n\t// Wait until signal received to send the reply.\n\tcase <-longPollChan:\n\t\t// Fallthrough\n\t}\n\n\t// Get the lastest block template\n\tstate.Lock()\n\tdefer state.Unlock()\n\n\tif err := state.updateBlockTemplate(s, useCoinbaseValue); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Include whether or not it is valid to submit work against the old\n\t// block template depending on whether or not a solution has already\n\t// been found and added to the block chain.\n\tsubmitOld := prevHash.IsEqual(&state.template.Block.Header.PrevBlock)\n\tresult, err := state.blockTemplateResult(useCoinbaseValue, &submitOld)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn result, nil\n}\n\n// handleGetBlockTemplateRequest is a helper for handleGetBlockTemplate which\n// deals with generating and returning block templates to the caller.  It\n// handles both long poll requests as specified by BIP 0022 as well as regular\n// requests.  In addition, it detects the capabilities reported by the caller\n// in regards to whether or not it supports creating its own coinbase (the\n// coinbasetxn and coinbasevalue capabilities) and modifies the returned block\n// template accordingly.\nfunc handleGetBlockTemplateRequest(s *rpcServer, request *btcjson.TemplateRequest, closeChan <-chan struct{}) (interface{}, error) {\n\t// Extract the relevant passed capabilities and restrict the result to\n\t// either a coinbase value or a coinbase transaction object depending on\n\t// the request.  Default to only providing a coinbase value.\n\tuseCoinbaseValue := true\n\tif request != nil {\n\t\tvar hasCoinbaseValue, hasCoinbaseTxn bool\n\t\tfor _, capability := range request.Capabilities {\n\t\t\tswitch capability {\n\t\t\tcase \"coinbasetxn\":\n\t\t\t\thasCoinbaseTxn = true\n\t\t\tcase \"coinbasevalue\":\n\t\t\t\thasCoinbaseValue = true\n\t\t\t}\n\t\t}\n\n\t\tif hasCoinbaseTxn && !hasCoinbaseValue {\n\t\t\tuseCoinbaseValue = false\n\t\t}\n\t}\n\n\t// When a coinbase transaction has been requested, respond with an error\n\t// if there are no addresses to pay the created block template to.\n\tif !useCoinbaseValue && len(cfg.miningAddrs) == 0 {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode: btcjson.ErrRPCInternal.Code,\n\t\t\tMessage: \"A coinbase transaction has been requested, \" +\n\t\t\t\t\"but the server has not been configured with \" +\n\t\t\t\t\"any payment addresses via --miningaddr\",\n\t\t}\n\t}\n\n\t// Return an error if there are no peers connected since there is no\n\t// way to relay a found block or receive transactions to work on.\n\t// However, allow this state when running in the regression test or\n\t// simulation test mode.\n\tif !(cfg.RegressionTest || cfg.SimNet) &&\n\t\ts.cfg.ConnMgr.ConnectedCount() == 0 {\n\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCClientNotConnected,\n\t\t\tMessage: \"Bitcoin is not connected\",\n\t\t}\n\t}\n\n\t// No point in generating or accepting work before the chain is synced.\n\tcurrentHeight := s.cfg.Chain.BestSnapshot().Height\n\tif currentHeight != 0 && !s.cfg.SyncMgr.IsCurrent() {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCClientInInitialDownload,\n\t\t\tMessage: \"Bitcoin is downloading blocks...\",\n\t\t}\n\t}\n\n\t// When a long poll ID was provided, this is a long poll request by the\n\t// client to be notified when block template referenced by the ID should\n\t// be replaced with a new one.\n\tif request != nil && request.LongPollID != \"\" {\n\t\treturn handleGetBlockTemplateLongPoll(s, request.LongPollID,\n\t\t\tuseCoinbaseValue, closeChan)\n\t}\n\n\t// Protect concurrent access when updating block templates.\n\tstate := s.gbtWorkState\n\tstate.Lock()\n\tdefer state.Unlock()\n\n\t// Get and return a block template.  A new block template will be\n\t// generated when the current best block has changed or the transactions\n\t// in the memory pool have been updated and it has been at least five\n\t// seconds since the last template was generated.  Otherwise, the\n\t// timestamp for the existing block template is updated (and possibly\n\t// the difficulty on testnet per the consesus rules).\n\tif err := state.updateBlockTemplate(s, useCoinbaseValue); err != nil {\n\t\treturn nil, err\n\t}\n\treturn state.blockTemplateResult(useCoinbaseValue, nil)\n}\n\n// chainErrToGBTErrString converts an error returned from btcchain to a string\n// which matches the reasons and format described in BIP0022 for rejection\n// reasons.\nfunc chainErrToGBTErrString(err error) string {\n\t// When the passed error is not a RuleError, just return a generic\n\t// rejected string with the error text.\n\truleErr, ok := err.(blockchain.RuleError)\n\tif !ok {\n\t\treturn \"rejected: \" + err.Error()\n\t}\n\n\tswitch ruleErr.ErrorCode {\n\tcase blockchain.ErrDuplicateBlock:\n\t\treturn \"duplicate\"\n\tcase blockchain.ErrBlockTooBig:\n\t\treturn \"bad-blk-length\"\n\tcase blockchain.ErrBlockWeightTooHigh:\n\t\treturn \"bad-blk-weight\"\n\tcase blockchain.ErrBlockVersionTooOld:\n\t\treturn \"bad-version\"\n\tcase blockchain.ErrInvalidTime:\n\t\treturn \"bad-time\"\n\tcase blockchain.ErrTimeTooOld:\n\t\treturn \"time-too-old\"\n\tcase blockchain.ErrTimeTooNew:\n\t\treturn \"time-too-new\"\n\tcase blockchain.ErrDifficultyTooLow:\n\t\treturn \"bad-diffbits\"\n\tcase blockchain.ErrUnexpectedDifficulty:\n\t\treturn \"bad-diffbits\"\n\tcase blockchain.ErrHighHash:\n\t\treturn \"high-hash\"\n\tcase blockchain.ErrBadMerkleRoot:\n\t\treturn \"bad-txnmrklroot\"\n\tcase blockchain.ErrBadCheckpoint:\n\t\treturn \"bad-checkpoint\"\n\tcase blockchain.ErrForkTooOld:\n\t\treturn \"fork-too-old\"\n\tcase blockchain.ErrCheckpointTimeTooOld:\n\t\treturn \"checkpoint-time-too-old\"\n\tcase blockchain.ErrNoTransactions:\n\t\treturn \"bad-txns-none\"\n\tcase blockchain.ErrNoTxInputs:\n\t\treturn \"bad-txns-noinputs\"\n\tcase blockchain.ErrNoTxOutputs:\n\t\treturn \"bad-txns-nooutputs\"\n\tcase blockchain.ErrTxTooBig:\n\t\treturn \"bad-txns-size\"\n\tcase blockchain.ErrBadTxOutValue:\n\t\treturn \"bad-txns-outputvalue\"\n\tcase blockchain.ErrDuplicateTxInputs:\n\t\treturn \"bad-txns-dupinputs\"\n\tcase blockchain.ErrBadTxInput:\n\t\treturn \"bad-txns-badinput\"\n\tcase blockchain.ErrMissingTxOut:\n\t\treturn \"bad-txns-missinginput\"\n\tcase blockchain.ErrUnfinalizedTx:\n\t\treturn \"bad-txns-unfinalizedtx\"\n\tcase blockchain.ErrDuplicateTx:\n\t\treturn \"bad-txns-duplicate\"\n\tcase blockchain.ErrOverwriteTx:\n\t\treturn \"bad-txns-overwrite\"\n\tcase blockchain.ErrImmatureSpend:\n\t\treturn \"bad-txns-maturity\"\n\tcase blockchain.ErrSpendTooHigh:\n\t\treturn \"bad-txns-highspend\"\n\tcase blockchain.ErrBadFees:\n\t\treturn \"bad-txns-fees\"\n\tcase blockchain.ErrTooManySigOps:\n\t\treturn \"high-sigops\"\n\tcase blockchain.ErrFirstTxNotCoinbase:\n\t\treturn \"bad-txns-nocoinbase\"\n\tcase blockchain.ErrMultipleCoinbases:\n\t\treturn \"bad-txns-multicoinbase\"\n\tcase blockchain.ErrBadCoinbaseScriptLen:\n\t\treturn \"bad-cb-length\"\n\tcase blockchain.ErrBadCoinbaseValue:\n\t\treturn \"bad-cb-value\"\n\tcase blockchain.ErrMissingCoinbaseHeight:\n\t\treturn \"bad-cb-height\"\n\tcase blockchain.ErrBadCoinbaseHeight:\n\t\treturn \"bad-cb-height\"\n\tcase blockchain.ErrScriptMalformed:\n\t\treturn \"bad-script-malformed\"\n\tcase blockchain.ErrScriptValidation:\n\t\treturn \"bad-script-validate\"\n\tcase blockchain.ErrUnexpectedWitness:\n\t\treturn \"unexpected-witness\"\n\tcase blockchain.ErrInvalidWitnessCommitment:\n\t\treturn \"bad-witness-nonce-size\"\n\tcase blockchain.ErrWitnessCommitmentMismatch:\n\t\treturn \"bad-witness-merkle-match\"\n\tcase blockchain.ErrPreviousBlockUnknown:\n\t\treturn \"prev-blk-not-found\"\n\tcase blockchain.ErrInvalidAncestorBlock:\n\t\treturn \"bad-prevblk\"\n\tcase blockchain.ErrPrevBlockNotBest:\n\t\treturn \"inconclusive-not-best-prvblk\"\n\t}\n\n\treturn \"rejected: \" + err.Error()\n}\n\n// handleGetBlockTemplateProposal is a helper for handleGetBlockTemplate which\n// deals with block proposals.\n//\n// See https://en.bitcoin.it/wiki/BIP_0023 for more details.\nfunc handleGetBlockTemplateProposal(s *rpcServer, request *btcjson.TemplateRequest) (interface{}, error) {\n\thexData := request.Data\n\tif hexData == \"\" {\n\t\treturn false, &btcjson.RPCError{\n\t\t\tCode: btcjson.ErrRPCType,\n\t\t\tMessage: fmt.Sprintf(\"Data must contain the \" +\n\t\t\t\t\"hex-encoded serialized block that is being \" +\n\t\t\t\t\"proposed\"),\n\t\t}\n\t}\n\n\t// Ensure the provided data is sane and deserialize the proposed block.\n\tif len(hexData)%2 != 0 {\n\t\thexData = \"0\" + hexData\n\t}\n\tdataBytes, err := hex.DecodeString(hexData)\n\tif err != nil {\n\t\treturn false, &btcjson.RPCError{\n\t\t\tCode: btcjson.ErrRPCDeserialization,\n\t\t\tMessage: fmt.Sprintf(\"Data must be \"+\n\t\t\t\t\"hexadecimal string (not %q)\", hexData),\n\t\t}\n\t}\n\tvar msgBlock wire.MsgBlock\n\tif err := msgBlock.Deserialize(bytes.NewReader(dataBytes)); err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCDeserialization,\n\t\t\tMessage: \"Block decode failed: \" + err.Error(),\n\t\t}\n\t}\n\tblock := btcutil.NewBlock(&msgBlock)\n\n\t// Ensure the block is building from the expected previous block.\n\texpectedPrevHash := s.cfg.Chain.BestSnapshot().Hash\n\tprevHash := &block.MsgBlock().Header.PrevBlock\n\tif !expectedPrevHash.IsEqual(prevHash) {\n\t\treturn \"bad-prevblk\", nil\n\t}\n\n\tif err := s.cfg.Chain.CheckConnectBlockTemplate(block); err != nil {\n\t\tif _, ok := err.(blockchain.RuleError); !ok {\n\t\t\terrStr := fmt.Sprintf(\"Failed to process block proposal: %v\", err)\n\t\t\trpcsLog.Error(errStr)\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCVerify,\n\t\t\t\tMessage: errStr,\n\t\t\t}\n\t\t}\n\n\t\trpcsLog.Infof(\"Rejected block proposal: %v\", err)\n\t\treturn chainErrToGBTErrString(err), nil\n\t}\n\n\treturn nil, nil\n}\n\n// handleGetBlockTemplate implements the getblocktemplate command.\n//\n// See https://en.bitcoin.it/wiki/BIP_0022 and\n// https://en.bitcoin.it/wiki/BIP_0023 for more details.\nfunc handleGetBlockTemplate(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.GetBlockTemplateCmd)\n\trequest := c.Request\n\n\t// Set the default mode and override it if supplied.\n\tmode := \"template\"\n\tif request != nil && request.Mode != \"\" {\n\t\tmode = request.Mode\n\t}\n\n\tswitch mode {\n\tcase \"template\":\n\t\treturn handleGetBlockTemplateRequest(s, request, closeChan)\n\tcase \"proposal\":\n\t\treturn handleGetBlockTemplateProposal(s, request)\n\t}\n\n\treturn nil, &btcjson.RPCError{\n\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\tMessage: \"Invalid mode\",\n\t}\n}\n\n// handleGetChainTips implements the getchaintips command.\nfunc handleGetChainTips(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tchainTips := s.cfg.Chain.ChainTips()\n\n\tret := make([]btcjson.GetChainTipsResult, 0, len(chainTips))\n\tfor _, chainTip := range chainTips {\n\t\tret = append(ret, struct {\n\t\t\tHeight    int32  \"json:\\\"height\\\"\"\n\t\t\tHash      string \"json:\\\"hash\\\"\"\n\t\t\tBranchLen int32  \"json:\\\"branchlen\\\"\"\n\t\t\tStatus    string \"json:\\\"status\\\"\"\n\t\t}{\n\t\t\tHeight:    chainTip.Height,\n\t\t\tHash:      chainTip.BlockHash.String(),\n\t\t\tBranchLen: chainTip.BranchLen,\n\t\t\tStatus:    chainTip.Status.String(),\n\t\t})\n\t}\n\n\treturn ret, nil\n}\n\n// handleGetCFilter implements the getcfilter command.\nfunc handleGetCFilter(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tif s.cfg.CfIndex == nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCNoCFIndex,\n\t\t\tMessage: \"The CF index must be enabled for this command\",\n\t\t}\n\t}\n\n\tc := cmd.(*btcjson.GetCFilterCmd)\n\thash, err := chainhash.NewHashFromStr(c.Hash)\n\tif err != nil {\n\t\treturn nil, rpcDecodeHexError(c.Hash)\n\t}\n\n\tfilterBytes, err := s.cfg.CfIndex.FilterByBlockHash(hash, c.FilterType)\n\tif err != nil {\n\t\trpcsLog.Debugf(\"Could not find committed filter for %v: %v\",\n\t\t\thash, err)\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCBlockNotFound,\n\t\t\tMessage: \"Block not found\",\n\t\t}\n\t}\n\n\trpcsLog.Debugf(\"Found committed filter for %v\", hash)\n\treturn hex.EncodeToString(filterBytes), nil\n}\n\n// handleGetCFilterHeader implements the getcfilterheader command.\nfunc handleGetCFilterHeader(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tif s.cfg.CfIndex == nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCNoCFIndex,\n\t\t\tMessage: \"The CF index must be enabled for this command\",\n\t\t}\n\t}\n\n\tc := cmd.(*btcjson.GetCFilterHeaderCmd)\n\thash, err := chainhash.NewHashFromStr(c.Hash)\n\tif err != nil {\n\t\treturn nil, rpcDecodeHexError(c.Hash)\n\t}\n\n\theaderBytes, err := s.cfg.CfIndex.FilterHeaderByBlockHash(hash, c.FilterType)\n\tif len(headerBytes) > 0 {\n\t\trpcsLog.Debugf(\"Found header of committed filter for %v\", hash)\n\t} else {\n\t\trpcsLog.Debugf(\"Could not find header of committed filter for %v: %v\",\n\t\t\thash, err)\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCBlockNotFound,\n\t\t\tMessage: \"Block not found\",\n\t\t}\n\t}\n\n\thash.SetBytes(headerBytes)\n\treturn hash.String(), nil\n}\n\n// handleGetConnectionCount implements the getconnectioncount command.\nfunc handleGetConnectionCount(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\treturn s.cfg.ConnMgr.ConnectedCount(), nil\n}\n\n// handleGetCurrentNet implements the getcurrentnet command.\nfunc handleGetCurrentNet(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\treturn s.cfg.ChainParams.Net, nil\n}\n\n// handleGetDifficulty implements the getdifficulty command.\nfunc handleGetDifficulty(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tbest := s.cfg.Chain.BestSnapshot()\n\treturn getDifficultyRatio(best.Bits, s.cfg.ChainParams), nil\n}\n\n// handleGetGenerate implements the getgenerate command.\nfunc handleGetGenerate(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\treturn s.cfg.CPUMiner.IsMining(), nil\n}\n\n// handleGetHashesPerSec implements the gethashespersec command.\nfunc handleGetHashesPerSec(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\treturn int64(s.cfg.CPUMiner.HashesPerSecond()), nil\n}\n\n// handleGetHeaders implements the getheaders command.\n//\n// NOTE: This is a btcsuite extension originally ported from\n// github.com/decred/dcrd.\nfunc handleGetHeaders(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.GetHeadersCmd)\n\n\t// Fetch the requested headers from chain while respecting the provided\n\t// block locators and stop hash.\n\tblockLocators := make([]*chainhash.Hash, len(c.BlockLocators))\n\tfor i := range c.BlockLocators {\n\t\tblockLocator, err := chainhash.NewHashFromStr(c.BlockLocators[i])\n\t\tif err != nil {\n\t\t\treturn nil, rpcDecodeHexError(c.BlockLocators[i])\n\t\t}\n\t\tblockLocators[i] = blockLocator\n\t}\n\tvar hashStop chainhash.Hash\n\tif c.HashStop != \"\" {\n\t\terr := chainhash.Decode(&hashStop, c.HashStop)\n\t\tif err != nil {\n\t\t\treturn nil, rpcDecodeHexError(c.HashStop)\n\t\t}\n\t}\n\theaders := s.cfg.SyncMgr.LocateHeaders(blockLocators, &hashStop)\n\n\t// Return the serialized block headers as hex-encoded strings.\n\thexBlockHeaders := make([]string, len(headers))\n\tvar buf bytes.Buffer\n\tfor i, h := range headers {\n\t\terr := h.Serialize(&buf)\n\t\tif err != nil {\n\t\t\treturn nil, internalRPCError(err.Error(),\n\t\t\t\t\"Failed to serialize block header\")\n\t\t}\n\t\thexBlockHeaders[i] = hex.EncodeToString(buf.Bytes())\n\t\tbuf.Reset()\n\t}\n\treturn hexBlockHeaders, nil\n}\n\n// handleGetInfo implements the getinfo command. We only return the fields\n// that are not related to wallet functionality.\nfunc handleGetInfo(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tbest := s.cfg.Chain.BestSnapshot()\n\tret := &btcjson.InfoChainResult{\n\t\tVersion:         int32(1000000*appMajor + 10000*appMinor + 100*appPatch),\n\t\tProtocolVersion: int32(maxProtocolVersion),\n\t\tBlocks:          best.Height,\n\t\tTimeOffset:      int64(s.cfg.TimeSource.Offset().Seconds()),\n\t\tConnections:     s.cfg.ConnMgr.ConnectedCount(),\n\t\tProxy:           cfg.Proxy,\n\t\tDifficulty:      getDifficultyRatio(best.Bits, s.cfg.ChainParams),\n\t\tTestNet:         cfg.TestNet3 || cfg.TestNet4,\n\t\tRelayFee:        cfg.minRelayTxFee.ToBTC(),\n\t}\n\n\treturn ret, nil\n}\n\n// handleGetMempoolInfo implements the getmempoolinfo command.\nfunc handleGetMempoolInfo(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tmempoolTxns := s.cfg.TxMemPool.TxDescs()\n\n\tvar numBytes int64\n\tfor _, txD := range mempoolTxns {\n\t\tnumBytes += int64(txD.Tx.MsgTx().SerializeSize())\n\t}\n\n\tret := &btcjson.GetMempoolInfoResult{\n\t\tSize:  int64(len(mempoolTxns)),\n\t\tBytes: numBytes,\n\t}\n\n\treturn ret, nil\n}\n\n// handleGetMiningInfo implements the getmininginfo command. We only return the\n// fields that are not related to wallet functionality.\nfunc handleGetMiningInfo(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\t// Create a default getnetworkhashps command to use defaults and make\n\t// use of the existing getnetworkhashps handler.\n\tgnhpsCmd := btcjson.NewGetNetworkHashPSCmd(nil, nil)\n\tnetworkHashesPerSecIface, err := handleGetNetworkHashPS(s, gnhpsCmd,\n\t\tcloseChan)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnetworkHashesPerSec, ok := networkHashesPerSecIface.(float64)\n\tif !ok {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInternal.Code,\n\t\t\tMessage: \"networkHashesPerSec is not a float64\",\n\t\t}\n\t}\n\n\tbest := s.cfg.Chain.BestSnapshot()\n\tresult := btcjson.GetMiningInfoResult{\n\t\tBlocks:             int64(best.Height),\n\t\tCurrentBlockSize:   best.BlockSize,\n\t\tCurrentBlockWeight: best.BlockWeight,\n\t\tCurrentBlockTx:     best.NumTxns,\n\t\tDifficulty:         getDifficultyRatio(best.Bits, s.cfg.ChainParams),\n\t\tGenerate:           s.cfg.CPUMiner.IsMining(),\n\t\tGenProcLimit:       s.cfg.CPUMiner.NumWorkers(),\n\t\tHashesPerSec:       s.cfg.CPUMiner.HashesPerSecond(),\n\t\tNetworkHashPS:      networkHashesPerSec,\n\t\tPooledTx:           uint64(s.cfg.TxMemPool.Count()),\n\t\tTestNet:            cfg.TestNet3 || cfg.TestNet4,\n\t}\n\treturn &result, nil\n}\n\n// handleGetNetTotals implements the getnettotals command.\nfunc handleGetNetTotals(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\ttotalBytesRecv, totalBytesSent := s.cfg.ConnMgr.NetTotals()\n\treply := &btcjson.GetNetTotalsResult{\n\t\tTotalBytesRecv: totalBytesRecv,\n\t\tTotalBytesSent: totalBytesSent,\n\t\tTimeMillis:     time.Now().UTC().UnixNano() / int64(time.Millisecond),\n\t}\n\treturn reply, nil\n}\n\n// handleGetNetworkHashPS implements the getnetworkhashps command.\nfunc handleGetNetworkHashPS(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\t// Note: All valid error return paths should return a float64.\n\t// Literal zeros are inferred as int, and won't coerce to float64\n\t// because the return value is an interface{}.\n\n\tc := cmd.(*btcjson.GetNetworkHashPSCmd)\n\n\t// When the passed height is too high or zero, just return 0 now\n\t// since we can't reasonably calculate the number of network hashes\n\t// per second from invalid values.  When it's negative, use the current\n\t// best block height.\n\tbest := s.cfg.Chain.BestSnapshot()\n\tendHeight := int32(-1)\n\tif c.Height != nil {\n\t\tendHeight = int32(*c.Height)\n\t}\n\tif endHeight > best.Height || endHeight == 0 {\n\t\treturn float64(0), nil\n\t}\n\tif endHeight < 0 {\n\t\tendHeight = best.Height\n\t}\n\n\t// Calculate the number of blocks per retarget interval based on the\n\t// chain parameters.\n\tblocksPerRetarget := int32(s.cfg.ChainParams.TargetTimespan /\n\t\ts.cfg.ChainParams.TargetTimePerBlock)\n\n\t// Calculate the starting block height based on the passed number of\n\t// blocks.  When the passed value is negative, use the last block the\n\t// difficulty changed as the starting height.  Also make sure the\n\t// starting height is not before the beginning of the chain.\n\tnumBlocks := int32(120)\n\tif c.Blocks != nil {\n\t\tnumBlocks = int32(*c.Blocks)\n\t}\n\tvar startHeight int32\n\tif numBlocks <= 0 {\n\t\tstartHeight = endHeight - ((endHeight % blocksPerRetarget) + 1)\n\t} else {\n\t\tstartHeight = endHeight - numBlocks\n\t}\n\tif startHeight < 0 {\n\t\tstartHeight = 0\n\t}\n\trpcsLog.Debugf(\"Calculating network hashes per second from %d to %d\",\n\t\tstartHeight, endHeight)\n\n\t// Find the min and max block timestamps as well as calculate the total\n\t// amount of work that happened between the start and end blocks.\n\tvar minTimestamp, maxTimestamp time.Time\n\ttotalWork := big.NewInt(0)\n\tfor curHeight := startHeight; curHeight <= endHeight; curHeight++ {\n\t\thash, err := s.cfg.Chain.BlockHashByHeight(curHeight)\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to fetch block hash\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\n\t\t// Fetch the header from chain.\n\t\theader, err := s.cfg.Chain.HeaderByHash(hash)\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to fetch block header\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\n\t\tif curHeight == startHeight {\n\t\t\tminTimestamp = header.Timestamp\n\t\t\tmaxTimestamp = minTimestamp\n\t\t} else {\n\t\t\ttotalWork.Add(totalWork, blockchain.CalcWork(header.Bits))\n\n\t\t\tif minTimestamp.After(header.Timestamp) {\n\t\t\t\tminTimestamp = header.Timestamp\n\t\t\t}\n\t\t\tif maxTimestamp.Before(header.Timestamp) {\n\t\t\t\tmaxTimestamp = header.Timestamp\n\t\t\t}\n\t\t}\n\t}\n\n\t// Calculate the difference in seconds between the min and max block\n\t// timestamps and avoid division by zero in the case where there is no\n\t// time difference.\n\ttimeDiff := maxTimestamp.Sub(minTimestamp).Seconds()\n\tif timeDiff == 0 {\n\t\treturn timeDiff, nil\n\t}\n\n\thashesPerSec, _ := new(big.Float).Quo(new(big.Float).SetInt(totalWork), new(big.Float).SetFloat64(timeDiff)).Float64()\n\treturn hashesPerSec, nil\n}\n\n// handleGetNodeAddresses implements the getnodeaddresses command.\nfunc handleGetNodeAddresses(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.GetNodeAddressesCmd)\n\n\tcount := int32(1)\n\tif c.Count != nil {\n\t\tcount = *c.Count\n\t\tif count <= 0 {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\t\tMessage: \"Address count out of range\",\n\t\t\t}\n\t\t}\n\t}\n\n\tnodes := s.cfg.ConnMgr.NodeAddresses()\n\tif n := int32(len(nodes)); n < count {\n\t\tcount = n\n\t}\n\n\taddresses := make([]*btcjson.GetNodeAddressesResult, 0, count)\n\tfor _, node := range nodes[:count] {\n\t\taddress := &btcjson.GetNodeAddressesResult{\n\t\t\tTime:     node.Timestamp.Unix(),\n\t\t\tServices: uint64(node.Services),\n\t\t\tAddress:  node.Addr.String(),\n\t\t\tPort:     node.Port,\n\t\t}\n\t\taddresses = append(addresses, address)\n\t}\n\n\treturn addresses, nil\n}\n\n// handleGetPeerInfo implements the getpeerinfo command.\nfunc handleGetPeerInfo(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tpeers := s.cfg.ConnMgr.ConnectedPeers()\n\tsyncPeerID := s.cfg.SyncMgr.SyncPeerID()\n\tinfos := make([]*btcjson.GetPeerInfoResult, 0, len(peers))\n\tfor _, p := range peers {\n\t\tstatsSnap := p.ToPeer().StatsSnapshot()\n\t\tinfo := &btcjson.GetPeerInfoResult{\n\t\t\tID:             statsSnap.ID,\n\t\t\tAddr:           statsSnap.Addr,\n\t\t\tAddrLocal:      p.ToPeer().LocalAddr().String(),\n\t\t\tServices:       fmt.Sprintf(\"%08d\", uint64(statsSnap.Services)),\n\t\t\tRelayTxes:      !p.IsTxRelayDisabled(),\n\t\t\tLastSend:       statsSnap.LastSend.Unix(),\n\t\t\tLastRecv:       statsSnap.LastRecv.Unix(),\n\t\t\tBytesSent:      statsSnap.BytesSent,\n\t\t\tBytesRecv:      statsSnap.BytesRecv,\n\t\t\tConnTime:       statsSnap.ConnTime.Unix(),\n\t\t\tPingTime:       float64(statsSnap.LastPingMicros),\n\t\t\tTimeOffset:     statsSnap.TimeOffset,\n\t\t\tVersion:        statsSnap.Version,\n\t\t\tSubVer:         statsSnap.UserAgent,\n\t\t\tInbound:        statsSnap.Inbound,\n\t\t\tStartingHeight: statsSnap.StartingHeight,\n\t\t\tCurrentHeight:  statsSnap.LastBlock,\n\t\t\tBanScore:       int32(p.BanScore()),\n\t\t\tFeeFilter:      p.FeeFilter(),\n\t\t\tSyncNode:       statsSnap.ID == syncPeerID,\n\t\t\tV2Connection:   statsSnap.V2Connection,\n\t\t}\n\t\tif p.ToPeer().LastPingNonce() != 0 {\n\t\t\twait := float64(time.Since(statsSnap.LastPingTime).Nanoseconds())\n\t\t\t// We actually want microseconds.\n\t\t\tinfo.PingWait = wait / 1000\n\t\t}\n\t\tinfos = append(infos, info)\n\t}\n\treturn infos, nil\n}\n\n// handleGetRawMempool implements the getrawmempool command.\nfunc handleGetRawMempool(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.GetRawMempoolCmd)\n\tmp := s.cfg.TxMemPool\n\n\tif c.Verbose != nil && *c.Verbose {\n\t\treturn mp.RawMempoolVerbose(), nil\n\t}\n\n\t// The response is simply an array of the transaction hashes if the\n\t// verbose flag is not set.\n\tdescs := mp.TxDescs()\n\thashStrings := make([]string, len(descs))\n\tfor i := range hashStrings {\n\t\thashStrings[i] = descs[i].Tx.Hash().String()\n\t}\n\n\treturn hashStrings, nil\n}\n\n// handleGetRawTransaction implements the getrawtransaction command.\nfunc handleGetRawTransaction(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.GetRawTransactionCmd)\n\n\t// Convert the provided transaction hash hex to a Hash.\n\ttxHash, err := chainhash.NewHashFromStr(c.Txid)\n\tif err != nil {\n\t\treturn nil, rpcDecodeHexError(c.Txid)\n\t}\n\n\tverbose := false\n\tif c.Verbose != nil {\n\t\tverbose = *c.Verbose != 0\n\t}\n\n\t// Try to fetch the transaction from the memory pool and if that fails,\n\t// try the block database.\n\tvar mtx *wire.MsgTx\n\tvar blkHash *chainhash.Hash\n\tvar blkHeight int32\n\ttx, err := s.cfg.TxMemPool.FetchTransaction(txHash)\n\tif err != nil {\n\t\tif s.cfg.TxIndex == nil {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode: btcjson.ErrRPCNoTxInfo,\n\t\t\t\tMessage: \"The transaction index must be \" +\n\t\t\t\t\t\"enabled to query the blockchain \" +\n\t\t\t\t\t\"(specify --txindex)\",\n\t\t\t}\n\t\t}\n\n\t\t// Look up the location of the transaction.\n\t\tblockRegion, err := s.cfg.TxIndex.TxBlockRegion(txHash)\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to retrieve transaction location\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\t\tif blockRegion == nil {\n\t\t\treturn nil, rpcNoTxInfoError(txHash)\n\t\t}\n\n\t\t// Load the raw transaction bytes from the database.\n\t\tvar txBytes []byte\n\t\terr = s.cfg.DB.View(func(dbTx database.Tx) error {\n\t\t\tvar err error\n\t\t\ttxBytes, err = dbTx.FetchBlockRegion(blockRegion)\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, rpcNoTxInfoError(txHash)\n\t\t}\n\n\t\t// When the verbose flag isn't set, simply return the serialized\n\t\t// transaction as a hex-encoded string.  This is done here to\n\t\t// avoid deserializing it only to reserialize it again later.\n\t\tif !verbose {\n\t\t\treturn hex.EncodeToString(txBytes), nil\n\t\t}\n\n\t\t// Grab the block height.\n\t\tblkHash = blockRegion.Hash\n\t\tblkHeight, err = s.cfg.Chain.BlockHeightByHash(blkHash)\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to retrieve block height\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\n\t\t// Deserialize the transaction\n\t\tvar msgTx wire.MsgTx\n\t\terr = msgTx.Deserialize(bytes.NewReader(txBytes))\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to deserialize transaction\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\t\tmtx = &msgTx\n\t} else {\n\t\t// When the verbose flag isn't set, simply return the\n\t\t// network-serialized transaction as a hex-encoded string.\n\t\tif !verbose {\n\t\t\t// Note that this is intentionally not directly\n\t\t\t// returning because the first return value is a\n\t\t\t// string and it would result in returning an empty\n\t\t\t// string to the client instead of nothing (nil) in the\n\t\t\t// case of an error.\n\t\t\tmtxHex, err := messageToHex(tx.MsgTx())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn mtxHex, nil\n\t\t}\n\n\t\tmtx = tx.MsgTx()\n\t}\n\n\t// The verbose flag is set, so generate the JSON object and return it.\n\tvar blkHeader *wire.BlockHeader\n\tvar blkHashStr string\n\tvar chainHeight int32\n\tif blkHash != nil {\n\t\t// Fetch the header from chain.\n\t\theader, err := s.cfg.Chain.HeaderByHash(blkHash)\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to fetch block header\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\n\t\tblkHeader = &header\n\t\tblkHashStr = blkHash.String()\n\t\tchainHeight = s.cfg.Chain.BestSnapshot().Height\n\t}\n\n\trawTxn, err := createTxRawResult(s.cfg.ChainParams, mtx, txHash.String(),\n\t\tblkHeader, blkHashStr, blkHeight, chainHeight)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn *rawTxn, nil\n}\n\n// handleGetTxOut handles gettxout commands.\nfunc handleGetTxOut(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.GetTxOutCmd)\n\n\t// Convert the provided transaction hash hex to a Hash.\n\ttxHash, err := chainhash.NewHashFromStr(c.Txid)\n\tif err != nil {\n\t\treturn nil, rpcDecodeHexError(c.Txid)\n\t}\n\n\t// If requested and the tx is available in the mempool try to fetch it\n\t// from there, otherwise attempt to fetch from the block database.\n\tvar bestBlockHash string\n\tvar confirmations int32\n\tvar value int64\n\tvar pkScript []byte\n\tvar isCoinbase bool\n\tvar address string\n\tincludeMempool := true\n\tif c.IncludeMempool != nil {\n\t\tincludeMempool = *c.IncludeMempool\n\t}\n\t// TODO: This is racy.  It should attempt to fetch it directly and check\n\t// the error.\n\tif includeMempool && s.cfg.TxMemPool.HaveTransaction(txHash) {\n\t\ttx, err := s.cfg.TxMemPool.FetchTransaction(txHash)\n\t\tif err != nil {\n\t\t\treturn nil, rpcNoTxInfoError(txHash)\n\t\t}\n\n\t\tmtx := tx.MsgTx()\n\t\tif c.Vout > uint32(len(mtx.TxOut)-1) {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode: btcjson.ErrRPCInvalidTxVout,\n\t\t\t\tMessage: \"Output index number (vout) does not \" +\n\t\t\t\t\t\"exist for transaction.\",\n\t\t\t}\n\t\t}\n\n\t\ttxOut := mtx.TxOut[c.Vout]\n\t\tif txOut == nil {\n\t\t\terrStr := fmt.Sprintf(\"Output index: %d for txid: %s \"+\n\t\t\t\t\"does not exist\", c.Vout, txHash)\n\t\t\treturn nil, internalRPCError(errStr, \"\")\n\t\t}\n\n\t\tbest := s.cfg.Chain.BestSnapshot()\n\t\tbestBlockHash = best.Hash.String()\n\t\tconfirmations = 0\n\t\tvalue = txOut.Value\n\t\tpkScript = txOut.PkScript\n\t\tisCoinbase = blockchain.IsCoinBaseTx(mtx)\n\t} else {\n\t\tout := wire.OutPoint{Hash: *txHash, Index: c.Vout}\n\t\tentry, err := s.cfg.Chain.FetchUtxoEntry(out)\n\t\tif err != nil {\n\t\t\treturn nil, rpcNoTxInfoError(txHash)\n\t\t}\n\n\t\t// To match the behavior of the reference client, return nil\n\t\t// (JSON null) if the transaction output is spent by another\n\t\t// transaction already in the main chain.  Mined transactions\n\t\t// that are spent by a mempool transaction are not affected by\n\t\t// this.\n\t\tif entry == nil || entry.IsSpent() {\n\t\t\treturn nil, nil\n\t\t}\n\n\t\tbest := s.cfg.Chain.BestSnapshot()\n\t\tbestBlockHash = best.Hash.String()\n\t\tconfirmations = 1 + best.Height - entry.BlockHeight()\n\t\tvalue = entry.Amount()\n\t\tpkScript = entry.PkScript()\n\t\tisCoinbase = entry.IsCoinBase()\n\t}\n\n\t// Disassemble script into single line printable format.\n\t// The disassembled string will contain [error] inline if the script\n\t// doesn't fully parse, so ignore the error here.\n\tdisbuf, _ := txscript.DisasmString(pkScript)\n\n\t// Get further info about the script.\n\t// Ignore the error here since an error means the script couldn't parse\n\t// and there is no additional information about it anyways.\n\tscriptClass, addrs, reqSigs, _ := txscript.ExtractPkScriptAddrs(pkScript,\n\t\ts.cfg.ChainParams)\n\taddresses := make([]string, len(addrs))\n\tfor i, addr := range addrs {\n\t\taddresses[i] = addr.EncodeAddress()\n\t}\n\n\t// Address is defined when there's a single well-defined\n\t// receiver address. To spend the output a signature for this,\n\t// and only this, address is required.\n\tif len(addresses) == 1 && reqSigs <= 1 {\n\t\taddress = addresses[0]\n\t}\n\n\ttxOutReply := &btcjson.GetTxOutResult{\n\t\tBestBlock:     bestBlockHash,\n\t\tConfirmations: int64(confirmations),\n\t\tValue:         btcutil.Amount(value).ToBTC(),\n\t\tScriptPubKey: btcjson.ScriptPubKeyResult{\n\t\t\tAsm:       disbuf,\n\t\t\tHex:       hex.EncodeToString(pkScript),\n\t\t\tReqSigs:   int32(reqSigs),\n\t\t\tType:      scriptClass.String(),\n\t\t\tAddress:   address,\n\t\t\tAddresses: addresses,\n\t\t},\n\t\tCoinbase: isCoinbase,\n\t}\n\n\treturn txOutReply, nil\n}\n\n// handleInvalidateBlock implements the invalidateblock command.\nfunc handleInvalidateBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.InvalidateBlockCmd)\n\n\tinvalidateHash, err := chainhash.NewHashFromStr(c.BlockHash)\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode: btcjson.ErrRPCDeserialization,\n\t\t\tMessage: fmt.Sprintf(\"Failed to deserialize blockhash from string of %s\",\n\t\t\t\tinvalidateHash),\n\t\t}\n\t}\n\n\terr = s.cfg.Chain.InvalidateBlock(invalidateHash)\n\treturn nil, err\n}\n\n// handleHelp implements the help command.\nfunc handleHelp(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.HelpCmd)\n\n\t// Provide a usage overview of all commands when no specific command\n\t// was specified.\n\tvar command string\n\tif c.Command != nil {\n\t\tcommand = *c.Command\n\t}\n\tif command == \"\" {\n\t\tusage, err := s.helpCacher.rpcUsage(false)\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to generate RPC usage\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\t\treturn usage, nil\n\t}\n\n\t// Check that the command asked for is supported and implemented.  Only\n\t// search the main list of handlers since help should not be provided\n\t// for commands that are unimplemented or related to wallet\n\t// functionality.\n\tif _, ok := rpcHandlers[command]; !ok {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\tMessage: \"Unknown command: \" + command,\n\t\t}\n\t}\n\n\t// Get the help for the command.\n\thelp, err := s.helpCacher.rpcMethodHelp(command)\n\tif err != nil {\n\t\tcontext := \"Failed to generate help\"\n\t\treturn nil, internalRPCError(err.Error(), context)\n\t}\n\treturn help, nil\n}\n\n// handlePing implements the ping command.\nfunc handlePing(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\t// Ask server to ping \\o_\n\tnonce, err := wire.RandomUint64()\n\tif err != nil {\n\t\treturn nil, internalRPCError(\"Not sending ping - failed to \"+\n\t\t\t\"generate nonce: \"+err.Error(), \"\")\n\t}\n\ts.cfg.ConnMgr.BroadcastMessage(wire.NewMsgPing(nonce))\n\n\treturn nil, nil\n}\n\n// retrievedTx represents a transaction that was either loaded from the\n// transaction memory pool or from the database.  When a transaction is loaded\n// from the database, it is loaded with the raw serialized bytes while the\n// mempool has the fully deserialized structure.  This structure therefore will\n// have one of the two fields set depending on where is was retrieved from.\n// This is mainly done for efficiency to avoid extra serialization steps when\n// possible.\ntype retrievedTx struct {\n\ttxBytes []byte\n\tblkHash *chainhash.Hash // Only set when transaction is in a block.\n\ttx      *btcutil.Tx\n}\n\n// fetchInputTxos fetches the outpoints from all transactions referenced by the\n// inputs to the passed transaction by checking the transaction mempool first\n// then the transaction index for those already mined into blocks.\nfunc fetchInputTxos(s *rpcServer, tx *wire.MsgTx) (map[wire.OutPoint]wire.TxOut, error) {\n\tmp := s.cfg.TxMemPool\n\toriginOutputs := make(map[wire.OutPoint]wire.TxOut)\n\tfor txInIndex, txIn := range tx.TxIn {\n\t\t// Attempt to fetch and use the referenced transaction from the\n\t\t// memory pool.\n\t\torigin := &txIn.PreviousOutPoint\n\t\toriginTx, err := mp.FetchTransaction(&origin.Hash)\n\t\tif err == nil {\n\t\t\ttxOuts := originTx.MsgTx().TxOut\n\t\t\tif origin.Index >= uint32(len(txOuts)) {\n\t\t\t\terrStr := fmt.Sprintf(\"unable to find output \"+\n\t\t\t\t\t\"%v referenced from transaction %s:%d\",\n\t\t\t\t\torigin, tx.TxHash(), txInIndex)\n\t\t\t\treturn nil, internalRPCError(errStr, \"\")\n\t\t\t}\n\n\t\t\toriginOutputs[*origin] = *txOuts[origin.Index]\n\t\t\tcontinue\n\t\t}\n\n\t\t// Look up the location of the transaction.\n\t\tblockRegion, err := s.cfg.TxIndex.TxBlockRegion(&origin.Hash)\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to retrieve transaction location\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\t\tif blockRegion == nil {\n\t\t\treturn nil, rpcNoTxInfoError(&origin.Hash)\n\t\t}\n\n\t\t// Load the raw transaction bytes from the database.\n\t\tvar txBytes []byte\n\t\terr = s.cfg.DB.View(func(dbTx database.Tx) error {\n\t\t\tvar err error\n\t\t\ttxBytes, err = dbTx.FetchBlockRegion(blockRegion)\n\t\t\treturn err\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, rpcNoTxInfoError(&origin.Hash)\n\t\t}\n\n\t\t// Deserialize the transaction\n\t\tvar msgTx wire.MsgTx\n\t\terr = msgTx.Deserialize(bytes.NewReader(txBytes))\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to deserialize transaction\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\n\t\t// Add the referenced output to the map.\n\t\tif origin.Index >= uint32(len(msgTx.TxOut)) {\n\t\t\terrStr := fmt.Sprintf(\"unable to find output %v \"+\n\t\t\t\t\"referenced from transaction %s:%d\", origin,\n\t\t\t\ttx.TxHash(), txInIndex)\n\t\t\treturn nil, internalRPCError(errStr, \"\")\n\t\t}\n\t\toriginOutputs[*origin] = *msgTx.TxOut[origin.Index]\n\t}\n\n\treturn originOutputs, nil\n}\n\n// createVinListPrevOut returns a slice of JSON objects for the inputs of the\n// passed transaction.\nfunc createVinListPrevOut(s *rpcServer, mtx *wire.MsgTx, chainParams *chaincfg.Params, vinExtra bool, filterAddrMap map[string]struct{}) ([]btcjson.VinPrevOut, error) {\n\t// Coinbase transactions only have a single txin by definition.\n\tif blockchain.IsCoinBaseTx(mtx) {\n\t\t// Only include the transaction if the filter map is empty\n\t\t// because a coinbase input has no addresses and so would never\n\t\t// match a non-empty filter.\n\t\tif len(filterAddrMap) != 0 {\n\t\t\treturn nil, nil\n\t\t}\n\n\t\ttxIn := mtx.TxIn[0]\n\t\tvinList := make([]btcjson.VinPrevOut, 1)\n\t\tvinList[0].Coinbase = hex.EncodeToString(txIn.SignatureScript)\n\t\tvinList[0].Sequence = txIn.Sequence\n\t\treturn vinList, nil\n\t}\n\n\t// Use a dynamically sized list to accommodate the address filter.\n\tvinList := make([]btcjson.VinPrevOut, 0, len(mtx.TxIn))\n\n\t// Lookup all of the referenced transaction outputs needed to populate\n\t// the previous output information if requested.\n\tvar originOutputs map[wire.OutPoint]wire.TxOut\n\tif vinExtra || len(filterAddrMap) > 0 {\n\t\tvar err error\n\t\toriginOutputs, err = fetchInputTxos(s, mtx)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tfor _, txIn := range mtx.TxIn {\n\t\t// The disassembled string will contain [error] inline\n\t\t// if the script doesn't fully parse, so ignore the\n\t\t// error here.\n\t\tdisbuf, _ := txscript.DisasmString(txIn.SignatureScript)\n\n\t\t// Create the basic input entry without the additional optional\n\t\t// previous output details which will be added later if\n\t\t// requested and available.\n\t\tprevOut := &txIn.PreviousOutPoint\n\t\tvinEntry := btcjson.VinPrevOut{\n\t\t\tTxid:     prevOut.Hash.String(),\n\t\t\tVout:     prevOut.Index,\n\t\t\tSequence: txIn.Sequence,\n\t\t\tScriptSig: &btcjson.ScriptSig{\n\t\t\t\tAsm: disbuf,\n\t\t\t\tHex: hex.EncodeToString(txIn.SignatureScript),\n\t\t\t},\n\t\t}\n\n\t\tif len(txIn.Witness) != 0 {\n\t\t\tvinEntry.Witness = txIn.Witness.ToHexStrings()\n\t\t}\n\n\t\t// Add the entry to the list now if it already passed the filter\n\t\t// since the previous output might not be available.\n\t\tpassesFilter := len(filterAddrMap) == 0\n\t\tif passesFilter {\n\t\t\tvinList = append(vinList, vinEntry)\n\t\t}\n\n\t\t// Only populate previous output information if requested and\n\t\t// available.\n\t\tif len(originOutputs) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\toriginTxOut, ok := originOutputs[*prevOut]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ignore the error here since an error means the script\n\t\t// couldn't parse and there is no additional information about\n\t\t// it anyways.\n\t\t_, addrs, _, _ := txscript.ExtractPkScriptAddrs(\n\t\t\toriginTxOut.PkScript, chainParams)\n\n\t\t// Encode the addresses while checking if the address passes the\n\t\t// filter when needed.\n\t\tencodedAddrs := make([]string, len(addrs))\n\t\tfor j, addr := range addrs {\n\t\t\tencodedAddr := addr.EncodeAddress()\n\t\t\tencodedAddrs[j] = encodedAddr\n\n\t\t\t// No need to check the map again if the filter already\n\t\t\t// passes.\n\t\t\tif passesFilter {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, exists := filterAddrMap[encodedAddr]; exists {\n\t\t\t\tpassesFilter = true\n\t\t\t}\n\t\t}\n\n\t\t// Ignore the entry if it doesn't pass the filter.\n\t\tif !passesFilter {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Add entry to the list if it wasn't already done above.\n\t\tif len(filterAddrMap) != 0 {\n\t\t\tvinList = append(vinList, vinEntry)\n\t\t}\n\n\t\t// Update the entry with previous output information if\n\t\t// requested.\n\t\tif vinExtra {\n\t\t\tvinListEntry := &vinList[len(vinList)-1]\n\t\t\tvinListEntry.PrevOut = &btcjson.PrevOut{\n\t\t\t\tAddresses: encodedAddrs,\n\t\t\t\tValue:     btcutil.Amount(originTxOut.Value).ToBTC(),\n\t\t\t}\n\t\t}\n\t}\n\n\treturn vinList, nil\n}\n\n// fetchMempoolTxnsForAddress queries the address index for all unconfirmed\n// transactions that involve the provided address.  The results will be limited\n// by the number to skip and the number requested.\nfunc fetchMempoolTxnsForAddress(s *rpcServer, addr btcutil.Address, numToSkip, numRequested uint32) ([]*btcutil.Tx, uint32) {\n\t// There are no entries to return when there are less available than the\n\t// number being skipped.\n\tmpTxns := s.cfg.AddrIndex.UnconfirmedTxnsForAddress(addr)\n\tnumAvailable := uint32(len(mpTxns))\n\tif numToSkip > numAvailable {\n\t\treturn nil, numAvailable\n\t}\n\n\t// Filter the available entries based on the number to skip and number\n\t// requested.\n\trangeEnd := numToSkip + numRequested\n\tif rangeEnd > numAvailable {\n\t\trangeEnd = numAvailable\n\t}\n\treturn mpTxns[numToSkip:rangeEnd], numToSkip\n}\n\n// handleReconsiderBlock implements the reconsiderblock command.\nfunc handleReconsiderBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.ReconsiderBlockCmd)\n\n\treconsiderHash, err := chainhash.NewHashFromStr(c.BlockHash)\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode: btcjson.ErrRPCDeserialization,\n\t\t\tMessage: fmt.Sprintf(\"Failed to deserialize blockhash from string of %s\",\n\t\t\t\treconsiderHash),\n\t\t}\n\t}\n\n\terr = s.cfg.Chain.ReconsiderBlock(reconsiderHash)\n\treturn nil, err\n}\n\n// handleSearchRawTransactions implements the searchrawtransactions command.\nfunc handleSearchRawTransactions(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\t// Respond with an error if the address index is not enabled.\n\taddrIndex := s.cfg.AddrIndex\n\tif addrIndex == nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCMisc,\n\t\t\tMessage: \"Address index must be enabled (--addrindex)\",\n\t\t}\n\t}\n\n\t// Override the flag for including extra previous output information in\n\t// each input if needed.\n\tc := cmd.(*btcjson.SearchRawTransactionsCmd)\n\tvinExtra := false\n\tif c.VinExtra != nil {\n\t\tvinExtra = *c.VinExtra != 0\n\t}\n\n\t// Including the extra previous output information requires the\n\t// transaction index.  Currently the address index relies on the\n\t// transaction index, so this check is redundant, but it's better to be\n\t// safe in case the address index is ever changed to not rely on it.\n\tif vinExtra && s.cfg.TxIndex == nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCMisc,\n\t\t\tMessage: \"Transaction index must be enabled (--txindex)\",\n\t\t}\n\t}\n\n\t// Attempt to decode the supplied address.\n\tparams := s.cfg.ChainParams\n\taddr, err := btcutil.DecodeAddress(c.Address, params)\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidAddressOrKey,\n\t\t\tMessage: \"Invalid address or key: \" + err.Error(),\n\t\t}\n\t}\n\n\t// Override the default number of requested entries if needed.  Also,\n\t// just return now if the number of requested entries is zero to avoid\n\t// extra work.\n\tnumRequested := 100\n\tif c.Count != nil {\n\t\tnumRequested = *c.Count\n\t\tif numRequested < 0 {\n\t\t\tnumRequested = 1\n\t\t}\n\t}\n\tif numRequested == 0 {\n\t\treturn nil, nil\n\t}\n\n\t// Override the default number of entries to skip if needed.\n\tvar numToSkip int\n\tif c.Skip != nil {\n\t\tnumToSkip = *c.Skip\n\t\tif numToSkip < 0 {\n\t\t\tnumToSkip = 0\n\t\t}\n\t}\n\n\t// Override the reverse flag if needed.\n\tvar reverse bool\n\tif c.Reverse != nil {\n\t\treverse = *c.Reverse\n\t}\n\n\t// Add transactions from mempool first if client asked for reverse\n\t// order.  Otherwise, they will be added last (as needed depending on\n\t// the requested counts).\n\t//\n\t// NOTE: This code doesn't sort by dependency.  This might be something\n\t// to do in the future for the client's convenience, or leave it to the\n\t// client.\n\tnumSkipped := uint32(0)\n\taddressTxns := make([]retrievedTx, 0, numRequested)\n\tif reverse {\n\t\t// Transactions in the mempool are not in a block header yet,\n\t\t// so the block header field in the retrieved transaction struct\n\t\t// is left nil.\n\t\tmpTxns, mpSkipped := fetchMempoolTxnsForAddress(s, addr,\n\t\t\tuint32(numToSkip), uint32(numRequested))\n\t\tnumSkipped += mpSkipped\n\t\tfor _, tx := range mpTxns {\n\t\t\taddressTxns = append(addressTxns, retrievedTx{tx: tx})\n\t\t}\n\t}\n\n\t// Fetch transactions from the database in the desired order if more are\n\t// needed.\n\tif len(addressTxns) < numRequested {\n\t\terr = s.cfg.DB.View(func(dbTx database.Tx) error {\n\t\t\tregions, dbSkipped, err := addrIndex.TxRegionsForAddress(\n\t\t\t\tdbTx, addr, uint32(numToSkip)-numSkipped,\n\t\t\t\tuint32(numRequested-len(addressTxns)), reverse)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Load the raw transaction bytes from the database.\n\t\t\tserializedTxns, err := dbTx.FetchBlockRegions(regions)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Add the transaction and the hash of the block it is\n\t\t\t// contained in to the list.  Note that the transaction\n\t\t\t// is left serialized here since the caller might have\n\t\t\t// requested non-verbose output and hence there would be\n\t\t\t// no point in deserializing it just to reserialize it\n\t\t\t// later.\n\t\t\tfor i, serializedTx := range serializedTxns {\n\t\t\t\taddressTxns = append(addressTxns, retrievedTx{\n\t\t\t\t\ttxBytes: serializedTx,\n\t\t\t\t\tblkHash: regions[i].Hash,\n\t\t\t\t})\n\t\t\t}\n\t\t\tnumSkipped += dbSkipped\n\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to load address index entries\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\n\t}\n\n\t// Add transactions from mempool last if client did not request reverse\n\t// order and the number of results is still under the number requested.\n\tif !reverse && len(addressTxns) < numRequested {\n\t\t// Transactions in the mempool are not in a block header yet,\n\t\t// so the block header field in the retrieved transaction struct\n\t\t// is left nil.\n\t\tmpTxns, mpSkipped := fetchMempoolTxnsForAddress(s, addr,\n\t\t\tuint32(numToSkip)-numSkipped, uint32(numRequested-\n\t\t\t\tlen(addressTxns)))\n\t\tnumSkipped += mpSkipped\n\t\tfor _, tx := range mpTxns {\n\t\t\taddressTxns = append(addressTxns, retrievedTx{tx: tx})\n\t\t}\n\t}\n\n\t// Address has never been used if neither source yielded any results.\n\tif len(addressTxns) == 0 {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCNoTxInfo,\n\t\t\tMessage: \"No information available about address\",\n\t\t}\n\t}\n\n\t// Serialize all of the transactions to hex.\n\thexTxns := make([]string, len(addressTxns))\n\tfor i := range addressTxns {\n\t\t// Simply encode the raw bytes to hex when the retrieved\n\t\t// transaction is already in serialized form.\n\t\trtx := &addressTxns[i]\n\t\tif rtx.txBytes != nil {\n\t\t\thexTxns[i] = hex.EncodeToString(rtx.txBytes)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Serialize the transaction first and convert to hex when the\n\t\t// retrieved transaction is the deserialized structure.\n\t\thexTxns[i], err = messageToHex(rtx.tx.MsgTx())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// When not in verbose mode, simply return a list of serialized txns.\n\tif c.Verbose != nil && *c.Verbose == 0 {\n\t\treturn hexTxns, nil\n\t}\n\n\t// Normalize the provided filter addresses (if any) to ensure there are\n\t// no duplicates.\n\tfilterAddrMap := make(map[string]struct{})\n\tif c.FilterAddrs != nil && len(*c.FilterAddrs) > 0 {\n\t\tfor _, addr := range *c.FilterAddrs {\n\t\t\tfilterAddrMap[addr] = struct{}{}\n\t\t}\n\t}\n\n\t// The verbose flag is set, so generate the JSON object and return it.\n\tbest := s.cfg.Chain.BestSnapshot()\n\tsrtList := make([]btcjson.SearchRawTransactionsResult, len(addressTxns))\n\tfor i := range addressTxns {\n\t\t// The deserialized transaction is needed, so deserialize the\n\t\t// retrieved transaction if it's in serialized form (which will\n\t\t// be the case when it was lookup up from the database).\n\t\t// Otherwise, use the existing deserialized transaction.\n\t\trtx := &addressTxns[i]\n\t\tvar mtx *wire.MsgTx\n\t\tif rtx.tx == nil {\n\t\t\t// Deserialize the transaction.\n\t\t\tmtx = new(wire.MsgTx)\n\t\t\terr := mtx.Deserialize(bytes.NewReader(rtx.txBytes))\n\t\t\tif err != nil {\n\t\t\t\tcontext := \"Failed to deserialize transaction\"\n\t\t\t\treturn nil, internalRPCError(err.Error(),\n\t\t\t\t\tcontext)\n\t\t\t}\n\t\t} else {\n\t\t\tmtx = rtx.tx.MsgTx()\n\t\t}\n\n\t\tresult := &srtList[i]\n\t\tresult.Hex = hexTxns[i]\n\t\tresult.Txid = mtx.TxHash().String()\n\t\tresult.Vin, err = createVinListPrevOut(s, mtx, params, vinExtra,\n\t\t\tfilterAddrMap)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tresult.Vout = createVoutList(mtx, params, filterAddrMap)\n\t\tresult.Version = mtx.Version\n\t\tresult.LockTime = mtx.LockTime\n\n\t\t// Transactions grabbed from the mempool aren't yet in a block,\n\t\t// so conditionally fetch block details here.  This will be\n\t\t// reflected in the final JSON output (mempool won't have\n\t\t// confirmations or block information).\n\t\tvar blkHeader *wire.BlockHeader\n\t\tvar blkHashStr string\n\t\tvar blkHeight int32\n\t\tif blkHash := rtx.blkHash; blkHash != nil {\n\t\t\t// Fetch the header from chain.\n\t\t\theader, err := s.cfg.Chain.HeaderByHash(blkHash)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\t\tCode:    btcjson.ErrRPCBlockNotFound,\n\t\t\t\t\tMessage: \"Block not found\",\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get the block height from chain.\n\t\t\theight, err := s.cfg.Chain.BlockHeightByHash(blkHash)\n\t\t\tif err != nil {\n\t\t\t\tcontext := \"Failed to obtain block height\"\n\t\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t\t}\n\n\t\t\tblkHeader = &header\n\t\t\tblkHashStr = blkHash.String()\n\t\t\tblkHeight = height\n\t\t}\n\n\t\t// Add the block information to the result if there is any.\n\t\tif blkHeader != nil {\n\t\t\t// This is not a typo, they are identical in Bitcoin\n\t\t\t// Core as well.\n\t\t\tresult.Time = blkHeader.Timestamp.Unix()\n\t\t\tresult.Blocktime = blkHeader.Timestamp.Unix()\n\t\t\tresult.BlockHash = blkHashStr\n\t\t\tresult.Confirmations = uint64(1 + best.Height - blkHeight)\n\t\t}\n\t}\n\n\treturn srtList, nil\n}\n\n// handleSendRawTransaction implements the sendrawtransaction command.\nfunc handleSendRawTransaction(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.SendRawTransactionCmd)\n\t// Deserialize and send off to tx relay\n\thexStr := c.HexTx\n\tif len(hexStr)%2 != 0 {\n\t\thexStr = \"0\" + hexStr\n\t}\n\tserializedTx, err := hex.DecodeString(hexStr)\n\tif err != nil {\n\t\treturn nil, rpcDecodeHexError(hexStr)\n\t}\n\tvar msgTx wire.MsgTx\n\terr = msgTx.Deserialize(bytes.NewReader(serializedTx))\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCDeserialization,\n\t\t\tMessage: \"TX decode failed: \" + err.Error(),\n\t\t}\n\t}\n\n\t// Use 0 for the tag to represent local node.\n\ttx := btcutil.NewTx(&msgTx)\n\tacceptedTxs, err := s.cfg.TxMemPool.ProcessTransaction(tx, false, false, 0)\n\tif err != nil {\n\t\t// When the error is a rule error, it means the transaction was\n\t\t// simply rejected as opposed to something actually going wrong,\n\t\t// so log it as such. Otherwise, something really did go wrong,\n\t\t// so log it as an actual error and return.\n\t\truleErr, ok := err.(mempool.RuleError)\n\t\tif !ok {\n\t\t\trpcsLog.Errorf(\"Failed to process transaction %v: %v\",\n\t\t\t\ttx.Hash(), err)\n\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCTxError,\n\t\t\t\tMessage: \"TX rejected: \" + err.Error(),\n\t\t\t}\n\t\t}\n\n\t\trpcsLog.Debugf(\"Rejected transaction %v: %v\", tx.Hash(), err)\n\n\t\t// We'll then map the rule error to the appropriate RPC error,\n\t\t// matching bitcoind's behavior.\n\t\tcode := btcjson.ErrRPCTxError\n\t\tif txRuleErr, ok := ruleErr.Err.(mempool.TxRuleError); ok {\n\t\t\terrDesc := txRuleErr.Description\n\t\t\tswitch {\n\t\t\tcase strings.Contains(\n\t\t\t\tstrings.ToLower(errDesc), \"orphan transaction\",\n\t\t\t):\n\t\t\t\tcode = btcjson.ErrRPCTxError\n\n\t\t\tcase strings.Contains(\n\t\t\t\tstrings.ToLower(errDesc), \"transaction already exists\",\n\t\t\t):\n\t\t\t\tcode = btcjson.ErrRPCTxAlreadyInChain\n\n\t\t\tdefault:\n\t\t\t\tcode = btcjson.ErrRPCTxRejected\n\t\t\t}\n\t\t}\n\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    code,\n\t\t\tMessage: \"TX rejected: \" + err.Error(),\n\t\t}\n\t}\n\n\t// When the transaction was accepted it should be the first item in the\n\t// returned array of accepted transactions.  The only way this will not\n\t// be true is if the API for ProcessTransaction changes and this code is\n\t// not properly updated, but ensure the condition holds as a safeguard.\n\t//\n\t// Also, since an error is being returned to the caller, ensure the\n\t// transaction is removed from the memory pool.\n\tif len(acceptedTxs) == 0 || !acceptedTxs[0].Tx.Hash().IsEqual(tx.Hash()) {\n\t\ts.cfg.TxMemPool.RemoveTransaction(tx, true)\n\n\t\terrStr := fmt.Sprintf(\"transaction %v is not in accepted list\",\n\t\t\ttx.Hash())\n\t\treturn nil, internalRPCError(errStr, \"\")\n\t}\n\n\t// Generate and relay inventory vectors for all newly accepted\n\t// transactions into the memory pool due to the original being\n\t// accepted.\n\ts.cfg.ConnMgr.RelayTransactions(acceptedTxs)\n\n\t// Notify both websocket and getblocktemplate long poll clients of all\n\t// newly accepted transactions.\n\ts.NotifyNewTransactions(acceptedTxs)\n\n\t// Keep track of all the sendrawtransaction request txns so that they\n\t// can be rebroadcast if they don't make their way into a block.\n\ttxD := acceptedTxs[0]\n\tiv := wire.NewInvVect(wire.InvTypeTx, txD.Tx.Hash())\n\ts.cfg.ConnMgr.AddRebroadcastInventory(iv, txD)\n\n\treturn tx.Hash().String(), nil\n}\n\n// handleSetGenerate implements the setgenerate command.\nfunc handleSetGenerate(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.SetGenerateCmd)\n\n\t// Disable generation regardless of the provided generate flag if the\n\t// maximum number of threads (goroutines for our purposes) is 0.\n\t// Otherwise enable or disable it depending on the provided flag.\n\tgenerate := c.Generate\n\tgenProcLimit := -1\n\tif c.GenProcLimit != nil {\n\t\tgenProcLimit = *c.GenProcLimit\n\t}\n\tif genProcLimit == 0 {\n\t\tgenerate = false\n\t}\n\n\tif !generate {\n\t\ts.cfg.CPUMiner.Stop()\n\t} else {\n\t\t// Respond with an error if there are no addresses to pay the\n\t\t// created blocks to.\n\t\tif len(cfg.miningAddrs) == 0 {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode: btcjson.ErrRPCInternal.Code,\n\t\t\t\tMessage: \"No payment addresses specified \" +\n\t\t\t\t\t\"via --miningaddr\",\n\t\t\t}\n\t\t}\n\n\t\t// It's safe to call start even if it's already started.\n\t\ts.cfg.CPUMiner.SetNumWorkers(int32(genProcLimit))\n\t\ts.cfg.CPUMiner.Start()\n\t}\n\treturn nil, nil\n}\n\n// Text used to signify that a signed message follows and to prevent\n// inadvertently signing a transaction.\nconst messageSignatureHeader = \"Bitcoin Signed Message:\\n\"\n\n// handleSignMessageWithPrivKey implements the signmessagewithprivkey command.\nfunc handleSignMessageWithPrivKey(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.SignMessageWithPrivKeyCmd)\n\n\twif, err := btcutil.DecodeWIF(c.PrivKey)\n\tif err != nil {\n\t\tmessage := \"Invalid private key\"\n\t\tswitch err {\n\t\tcase btcutil.ErrMalformedPrivateKey:\n\t\t\tmessage = \"Malformed private key\"\n\t\tcase btcutil.ErrChecksumMismatch:\n\t\t\tmessage = \"Private key checksum mismatch\"\n\t\t}\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidAddressOrKey,\n\t\t\tMessage: message,\n\t\t}\n\t}\n\tif !wif.IsForNet(s.cfg.ChainParams) {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidAddressOrKey,\n\t\t\tMessage: \"Private key for wrong network\",\n\t\t}\n\t}\n\n\tvar buf bytes.Buffer\n\twire.WriteVarString(&buf, 0, messageSignatureHeader)\n\twire.WriteVarString(&buf, 0, c.Message)\n\tmessageHash := chainhash.DoubleHashB(buf.Bytes())\n\n\tsig := ecdsa.SignCompact(wif.PrivKey, messageHash, wif.CompressPubKey)\n\n\treturn base64.StdEncoding.EncodeToString(sig), nil\n}\n\n// handleStop implements the stop command.\nfunc handleStop(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tselect {\n\tcase s.requestProcessShutdown <- struct{}{}:\n\tdefault:\n\t}\n\treturn \"btcd stopping.\", nil\n}\n\n// handleSubmitBlock implements the submitblock command.\nfunc handleSubmitBlock(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.SubmitBlockCmd)\n\n\t// Deserialize the submitted block.\n\thexStr := c.HexBlock\n\tif len(hexStr)%2 != 0 {\n\t\thexStr = \"0\" + c.HexBlock\n\t}\n\tserializedBlock, err := hex.DecodeString(hexStr)\n\tif err != nil {\n\t\treturn nil, rpcDecodeHexError(hexStr)\n\t}\n\n\tblock, err := btcutil.NewBlockFromBytes(serializedBlock)\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCDeserialization,\n\t\t\tMessage: \"Block decode failed: \" + err.Error(),\n\t\t}\n\t}\n\n\t// Process this block using the same rules as blocks coming from other\n\t// nodes.  This will in turn relay it to the network like normal.\n\t_, err = s.cfg.SyncMgr.SubmitBlock(block, blockchain.BFNone)\n\tif err != nil {\n\t\treturn fmt.Sprintf(\"rejected: %s\", err.Error()), nil\n\t}\n\n\trpcsLog.Infof(\"Accepted block %s via submitblock\", block.Hash())\n\treturn nil, nil\n}\n\n// handleUptime implements the uptime command.\nfunc handleUptime(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\treturn time.Now().Unix() - s.cfg.StartupTime, nil\n}\n\n// handleValidateAddress implements the validateaddress command.\nfunc handleValidateAddress(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.ValidateAddressCmd)\n\n\tresult := btcjson.ValidateAddressChainResult{}\n\taddr, err := btcutil.DecodeAddress(c.Address, s.cfg.ChainParams)\n\tif err != nil {\n\t\t// Return the default value (false) for IsValid.\n\t\treturn result, nil\n\t}\n\n\tswitch addr := addr.(type) {\n\tcase *btcutil.AddressPubKeyHash:\n\t\tresult.IsScript = btcjson.Bool(false)\n\t\tresult.IsWitness = btcjson.Bool(false)\n\n\tcase *btcutil.AddressScriptHash:\n\t\tresult.IsScript = btcjson.Bool(true)\n\t\tresult.IsWitness = btcjson.Bool(false)\n\n\tcase *btcutil.AddressPubKey:\n\t\tresult.IsScript = btcjson.Bool(false)\n\t\tresult.IsWitness = btcjson.Bool(false)\n\n\tcase *btcutil.AddressWitnessPubKeyHash:\n\t\tresult.IsScript = btcjson.Bool(false)\n\t\tresult.IsWitness = btcjson.Bool(true)\n\t\tresult.WitnessVersion = btcjson.Int32(int32(addr.WitnessVersion()))\n\t\tresult.WitnessProgram = btcjson.String(hex.EncodeToString(addr.WitnessProgram()))\n\n\tcase *btcutil.AddressWitnessScriptHash:\n\t\tresult.IsScript = btcjson.Bool(true)\n\t\tresult.IsWitness = btcjson.Bool(true)\n\t\tresult.WitnessVersion = btcjson.Int32(int32(addr.WitnessVersion()))\n\t\tresult.WitnessProgram = btcjson.String(hex.EncodeToString(addr.WitnessProgram()))\n\n\tdefault:\n\t\t// Handle the case when a new Address is supported by btcutil, but none\n\t\t// of the cases were matched in the switch block. The current behaviour\n\t\t// is to do nothing, and only populate the Address and IsValid fields.\n\t}\n\n\tresult.Address = addr.EncodeAddress()\n\tresult.IsValid = true\n\n\treturn result, nil\n}\n\nfunc verifyChain(s *rpcServer, level, depth int32) error {\n\tbest := s.cfg.Chain.BestSnapshot()\n\tfinishHeight := best.Height - depth\n\tif finishHeight < 0 {\n\t\tfinishHeight = 0\n\t}\n\trpcsLog.Infof(\"Verifying chain for %d blocks at level %d\",\n\t\tbest.Height-finishHeight, level)\n\n\tfor height := best.Height; height > finishHeight; height-- {\n\t\t// Level 0 just looks up the block.\n\t\tblock, err := s.cfg.Chain.BlockByHeight(height)\n\t\tif err != nil {\n\t\t\trpcsLog.Errorf(\"Verify is unable to fetch block at \"+\n\t\t\t\t\"height %d: %v\", height, err)\n\t\t\treturn err\n\t\t}\n\n\t\t// Level 1 does basic chain sanity checks.\n\t\tif level > 0 {\n\t\t\terr := blockchain.CheckBlockSanity(block,\n\t\t\t\ts.cfg.ChainParams.PowLimit, s.cfg.TimeSource)\n\t\t\tif err != nil {\n\t\t\t\trpcsLog.Errorf(\"Verify is unable to validate \"+\n\t\t\t\t\t\"block at hash %v height %d: %v\",\n\t\t\t\t\tblock.Hash(), height, err)\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\trpcsLog.Infof(\"Chain verify completed successfully\")\n\n\treturn nil\n}\n\n// handleVerifyChain implements the verifychain command.\nfunc handleVerifyChain(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.VerifyChainCmd)\n\n\tvar checkLevel, checkDepth int32\n\tif c.CheckLevel != nil {\n\t\tcheckLevel = *c.CheckLevel\n\t}\n\tif c.CheckDepth != nil {\n\t\tcheckDepth = *c.CheckDepth\n\t}\n\n\terr := verifyChain(s, checkLevel, checkDepth)\n\treturn err == nil, nil\n}\n\n// handleVerifyMessage implements the verifymessage command.\nfunc handleVerifyMessage(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tc := cmd.(*btcjson.VerifyMessageCmd)\n\n\t// Decode the provided address.\n\tparams := s.cfg.ChainParams\n\taddr, err := btcutil.DecodeAddress(c.Address, params)\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidAddressOrKey,\n\t\t\tMessage: \"Invalid address or key: \" + err.Error(),\n\t\t}\n\t}\n\n\t// Only P2PKH addresses are valid for signing.\n\tif _, ok := addr.(*btcutil.AddressPubKeyHash); !ok {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCType,\n\t\t\tMessage: \"Address is not a pay-to-pubkey-hash address\",\n\t\t}\n\t}\n\n\t// Decode base64 signature.\n\tsig, err := base64.StdEncoding.DecodeString(c.Signature)\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCParse.Code,\n\t\t\tMessage: \"Malformed base64 encoding: \" + err.Error(),\n\t\t}\n\t}\n\n\t// Validate the signature - this just shows that it was valid at all.\n\t// we will compare it with the key next.\n\tvar buf bytes.Buffer\n\twire.WriteVarString(&buf, 0, messageSignatureHeader)\n\twire.WriteVarString(&buf, 0, c.Message)\n\texpectedMessageHash := chainhash.DoubleHashB(buf.Bytes())\n\tpk, wasCompressed, err := ecdsa.RecoverCompact(sig,\n\t\texpectedMessageHash)\n\tif err != nil {\n\t\t// Mirror Bitcoin Core behavior, which treats error in\n\t\t// RecoverCompact as invalid signature.\n\t\treturn false, nil\n\t}\n\n\t// Reconstruct the pubkey hash.\n\tvar serializedPK []byte\n\tif wasCompressed {\n\t\tserializedPK = pk.SerializeCompressed()\n\t} else {\n\t\tserializedPK = pk.SerializeUncompressed()\n\t}\n\taddress, err := btcutil.NewAddressPubKey(serializedPK, params)\n\tif err != nil {\n\t\t// Again mirror Bitcoin Core behavior, which treats error in public key\n\t\t// reconstruction as invalid signature.\n\t\treturn false, nil\n\t}\n\n\t// Return boolean if addresses match.\n\treturn address.EncodeAddress() == c.Address, nil\n}\n\n// handleVersion implements the version command.\n//\n// NOTE: This is a btcsuite extension ported from github.com/decred/dcrd.\nfunc handleVersion(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {\n\tresult := map[string]btcjson.VersionResult{\n\t\t\"btcdjsonrpcapi\": {\n\t\t\tVersionString: jsonrpcSemverString,\n\t\t\tMajor:         jsonrpcSemverMajor,\n\t\t\tMinor:         jsonrpcSemverMinor,\n\t\t\tPatch:         jsonrpcSemverPatch,\n\t\t},\n\t}\n\treturn result, nil\n}\n\n// handleTestMempoolAccept implements the testmempoolaccept command.\nfunc handleTestMempoolAccept(s *rpcServer, cmd interface{},\n\tcloseChan <-chan struct{}) (interface{}, error) {\n\n\tc := cmd.(*btcjson.TestMempoolAcceptCmd)\n\n\t// Create txns to hold the decoded tx.\n\ttxns := make([]*btcutil.Tx, 0, len(c.RawTxns))\n\n\t// Iterate the raw hex slice and decode them.\n\tfor _, rawTx := range c.RawTxns {\n\t\trawBytes, err := hex.DecodeString(rawTx)\n\t\tif err != nil {\n\t\t\treturn nil, rpcDecodeHexError(rawTx)\n\t\t}\n\n\t\ttx, err := btcutil.NewTxFromBytes(rawBytes)\n\t\tif err != nil {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCDeserialization,\n\t\t\t\tMessage: \"TX decode failed: \" + err.Error(),\n\t\t\t}\n\t\t}\n\n\t\ttxns = append(txns, tx)\n\t}\n\n\tresults := make([]*btcjson.TestMempoolAcceptResult, 0, len(txns))\n\tfor _, tx := range txns {\n\t\t// Create a test result item.\n\t\titem := &btcjson.TestMempoolAcceptResult{\n\t\t\tTxid:  tx.Hash().String(),\n\t\t\tWtxid: tx.WitnessHash().String(),\n\t\t}\n\n\t\t// Check the mempool acceptance.\n\t\tresult, err := s.cfg.TxMemPool.CheckMempoolAcceptance(tx)\n\n\t\t// If an error is returned, this tx is not allow, hence we\n\t\t// record the reason.\n\t\tif err != nil {\n\t\t\titem.Allowed = false\n\n\t\t\t// TODO(yy): differentiate the errors and put package\n\t\t\t// error in `PackageError` field.\n\t\t\titem.RejectReason = err.Error()\n\n\t\t\tresults = append(results, item)\n\n\t\t\t// Move to the next transaction.\n\t\t\tcontinue\n\t\t}\n\n\t\t// If this transaction is an orphan, it's not allowed.\n\t\tif result.MissingParents != nil {\n\t\t\titem.Allowed = false\n\n\t\t\t// NOTE: \"missing-inputs\" is what bitcoind returns\n\t\t\t// here, so we mimic the same error message.\n\t\t\titem.RejectReason = \"missing-inputs\"\n\n\t\t\tresults = append(results, item)\n\n\t\t\t// Move to the next transaction.\n\t\t\tcontinue\n\t\t}\n\n\t\t// Otherwise this tx is allowed if its fee rate is below the\n\t\t// max fee rate, we now patch the fields in\n\t\t// `TestMempoolAcceptItem` as much as possible.\n\t\t//\n\t\t// Calculate the fee field and validate its fee rate.\n\t\titem.Fees, item.Allowed = validateFeeRate(\n\t\t\tresult.TxFee, result.TxSize, c.MaxFeeRate,\n\t\t)\n\n\t\t// If the fee rate check passed, assign the corresponding\n\t\t// fields.\n\t\tif item.Allowed {\n\t\t\titem.Vsize = int32(result.TxSize)\n\t\t} else {\n\t\t\t// NOTE: \"max-fee-exceeded\" is what bitcoind returns\n\t\t\t// here, so we mimic the same error message.\n\t\t\titem.RejectReason = \"max-fee-exceeded\"\n\t\t}\n\n\t\tresults = append(results, item)\n\t}\n\n\treturn results, nil\n}\n\n// handleGetTxSpendingPrevOut implements the gettxspendingprevout command.\nfunc handleGetTxSpendingPrevOut(s *rpcServer, cmd interface{},\n\tcloseChan <-chan struct{}) (interface{}, error) {\n\n\tc := cmd.(*btcjson.GetTxSpendingPrevOutCmd)\n\n\t// Convert the outpoints.\n\tops := make([]wire.OutPoint, 0, len(c.Outputs))\n\tfor _, o := range c.Outputs {\n\t\thash, err := chainhash.NewHashFromStr(o.Txid)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tops = append(ops, wire.OutPoint{\n\t\t\tHash:  *hash,\n\t\t\tIndex: o.Vout,\n\t\t})\n\t}\n\n\t// Check mempool spend for all the outpoints.\n\tresults := make([]*btcjson.GetTxSpendingPrevOutResult, 0, len(ops))\n\tfor _, op := range ops {\n\t\t// Create a result entry.\n\t\tresult := &btcjson.GetTxSpendingPrevOutResult{\n\t\t\tTxid: op.Hash.String(),\n\t\t\tVout: op.Index,\n\t\t}\n\n\t\t// Check the mempool spend.\n\t\tspendingTx := s.cfg.TxMemPool.CheckSpend(op)\n\n\t\t// Set the spending txid if found.\n\t\tif spendingTx != nil {\n\t\t\tresult.SpendingTxid = spendingTx.Hash().String()\n\t\t}\n\n\t\tresults = append(results, result)\n\t}\n\n\treturn results, nil\n}\n\n// validateFeeRate checks that the fee rate used by transaction doesn't exceed\n// the max fee rate specified.\nfunc validateFeeRate(feeSats btcutil.Amount, txSize int64,\n\tmaxFeeRate float64) (*btcjson.TestMempoolAcceptFees, bool) {\n\n\t// Calculate fee rate in sats/kvB.\n\tfeeRateSatsPerKVB := feeSats * 1e3 / btcutil.Amount(txSize)\n\n\t// Convert sats/vB to BTC/kvB.\n\tfeeRate := feeRateSatsPerKVB.ToBTC()\n\n\t// Get the max fee rate, if not provided, default to 0.1 BTC/kvB.\n\tif maxFeeRate == 0 {\n\t\tmaxFeeRate = defaultMaxFeeRate\n\t}\n\n\t// If the fee rate is above the max fee rate, this tx is not accepted.\n\tif feeRate > maxFeeRate {\n\t\treturn nil, false\n\t}\n\n\treturn &btcjson.TestMempoolAcceptFees{\n\t\tBase:             feeSats.ToBTC(),\n\t\tEffectiveFeeRate: feeRate,\n\t}, true\n}\n\n// rpcServer provides a concurrent safe RPC server to a chain server.\ntype rpcServer struct {\n\tstarted                int32\n\tshutdown               int32\n\tcfg                    rpcserverConfig\n\tauthsha                [sha256.Size]byte\n\tlimitauthsha           [sha256.Size]byte\n\tntfnMgr                *wsNotificationManager\n\tnumClients             int32\n\tstatusLines            map[int]string\n\tstatusLock             sync.RWMutex\n\twg                     sync.WaitGroup\n\tgbtWorkState           *gbtWorkState\n\thelpCacher             *helpCacher\n\trequestProcessShutdown chan struct{}\n\tquit                   chan int\n}\n\n// httpStatusLine returns a response Status-Line (RFC 2616 Section 6.1)\n// for the given request and response status code.  This function was lifted and\n// adapted from the standard library HTTP server code since it's not exported.\nfunc (s *rpcServer) httpStatusLine(req *http.Request, code int) string {\n\t// Fast path:\n\tkey := code\n\tproto11 := req.ProtoAtLeast(1, 1)\n\tif !proto11 {\n\t\tkey = -key\n\t}\n\ts.statusLock.RLock()\n\tline, ok := s.statusLines[key]\n\ts.statusLock.RUnlock()\n\tif ok {\n\t\treturn line\n\t}\n\n\t// Slow path:\n\tproto := \"HTTP/1.0\"\n\tif proto11 {\n\t\tproto = \"HTTP/1.1\"\n\t}\n\tcodeStr := strconv.Itoa(code)\n\ttext := http.StatusText(code)\n\tif text != \"\" {\n\t\tline = proto + \" \" + codeStr + \" \" + text + \"\\r\\n\"\n\t\ts.statusLock.Lock()\n\t\ts.statusLines[key] = line\n\t\ts.statusLock.Unlock()\n\t} else {\n\t\ttext = \"status code \" + codeStr\n\t\tline = proto + \" \" + codeStr + \" \" + text + \"\\r\\n\"\n\t}\n\n\treturn line\n}\n\n// writeHTTPResponseHeaders writes the necessary response headers prior to\n// writing an HTTP body given a request to use for protocol negotiation, headers\n// to write, a status code, and a writer.\nfunc (s *rpcServer) writeHTTPResponseHeaders(req *http.Request, headers http.Header, code int, w io.Writer) error {\n\t_, err := io.WriteString(w, s.httpStatusLine(req, code))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = headers.Write(w)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = io.WriteString(w, \"\\r\\n\")\n\treturn err\n}\n\n// Stop is used by server.go to stop the rpc listener.\nfunc (s *rpcServer) Stop() error {\n\tif atomic.AddInt32(&s.shutdown, 1) != 1 {\n\t\trpcsLog.Infof(\"RPC server is already in the process of shutting down\")\n\t\treturn nil\n\t}\n\trpcsLog.Warnf(\"RPC server shutting down\")\n\tfor _, listener := range s.cfg.Listeners {\n\t\terr := listener.Close()\n\t\tif err != nil {\n\t\t\trpcsLog.Errorf(\"Problem shutting down rpc: %v\", err)\n\t\t\treturn err\n\t\t}\n\t}\n\ts.ntfnMgr.Shutdown()\n\ts.ntfnMgr.WaitForShutdown()\n\tclose(s.quit)\n\ts.wg.Wait()\n\trpcsLog.Infof(\"RPC server shutdown complete\")\n\treturn nil\n}\n\n// RequestedProcessShutdown returns a channel that is sent to when an authorized\n// RPC client requests the process to shutdown.  If the request can not be read\n// immediately, it is dropped.\nfunc (s *rpcServer) RequestedProcessShutdown() <-chan struct{} {\n\treturn s.requestProcessShutdown\n}\n\n// NotifyNewTransactions notifies both websocket and getblocktemplate long\n// poll clients of the passed transactions.  This function should be called\n// whenever new transactions are added to the mempool.\nfunc (s *rpcServer) NotifyNewTransactions(txns []*mempool.TxDesc) {\n\tfor _, txD := range txns {\n\t\t// Notify websocket clients about mempool transactions.\n\t\ts.ntfnMgr.NotifyMempoolTx(txD.Tx, true)\n\n\t\t// Potentially notify any getblocktemplate long poll clients\n\t\t// about stale block templates due to the new transaction.\n\t\ts.gbtWorkState.NotifyMempoolTx(s.cfg.TxMemPool.LastUpdated())\n\t}\n}\n\n// limitConnections responds with a 503 service unavailable and returns true if\n// adding another client would exceed the maximum allow RPC clients.\n//\n// This function is safe for concurrent access.\nfunc (s *rpcServer) limitConnections(w http.ResponseWriter, remoteAddr string) bool {\n\tif int(atomic.LoadInt32(&s.numClients)+1) > cfg.RPCMaxClients {\n\t\trpcsLog.Infof(\"Max RPC clients exceeded [%d] - \"+\n\t\t\t\"disconnecting client %s\", cfg.RPCMaxClients,\n\t\t\tremoteAddr)\n\t\thttp.Error(w, \"503 Too busy.  Try again later.\",\n\t\t\thttp.StatusServiceUnavailable)\n\t\treturn true\n\t}\n\treturn false\n}\n\n// incrementClients adds one to the number of connected RPC clients.  Note\n// this only applies to standard clients.  Websocket clients have their own\n// limits and are tracked separately.\n//\n// This function is safe for concurrent access.\nfunc (s *rpcServer) incrementClients() {\n\tatomic.AddInt32(&s.numClients, 1)\n}\n\n// decrementClients subtracts one from the number of connected RPC clients.\n// Note this only applies to standard clients.  Websocket clients have their own\n// limits and are tracked separately.\n//\n// This function is safe for concurrent access.\nfunc (s *rpcServer) decrementClients() {\n\tatomic.AddInt32(&s.numClients, -1)\n}\n\n// checkAuth checks the HTTP Basic authentication supplied by a wallet\n// or RPC client in the HTTP request r.  If the supplied authentication\n// does not match the username and password expected, a non-nil error is\n// returned.\n//\n// This check is time-constant.\n//\n// The first bool return value signifies auth success (true if successful) and\n// the second bool return value specifies whether the user can change the state\n// of the server (true) or whether the user is limited (false). The second is\n// always false if the first is.\nfunc (s *rpcServer) checkAuth(r *http.Request, require bool) (bool, bool, error) {\n\tauthhdr := r.Header[\"Authorization\"]\n\tif len(authhdr) <= 0 {\n\t\tif require {\n\t\t\trpcsLog.Warnf(\"RPC authentication failure from %s\",\n\t\t\t\tr.RemoteAddr)\n\t\t\treturn false, false, errors.New(\"auth failure\")\n\t\t}\n\n\t\treturn false, false, nil\n\t}\n\n\tauthsha := sha256.Sum256([]byte(authhdr[0]))\n\n\t// Check for limited auth first as in environments with limited users, those\n\t// are probably expected to have a higher volume of calls\n\tlimitcmp := subtle.ConstantTimeCompare(authsha[:], s.limitauthsha[:])\n\tif limitcmp == 1 {\n\t\treturn true, false, nil\n\t}\n\n\t// Check for admin-level auth\n\tcmp := subtle.ConstantTimeCompare(authsha[:], s.authsha[:])\n\tif cmp == 1 {\n\t\treturn true, true, nil\n\t}\n\n\t// Request's auth doesn't match either user\n\trpcsLog.Warnf(\"RPC authentication failure from %s\", r.RemoteAddr)\n\treturn false, false, errors.New(\"auth failure\")\n}\n\n// parsedRPCCmd represents a JSON-RPC request object that has been parsed into\n// a known concrete command along with any error that might have happened while\n// parsing it.\ntype parsedRPCCmd struct {\n\tjsonrpc btcjson.RPCVersion\n\tid      interface{}\n\tmethod  string\n\tcmd     interface{}\n\terr     *btcjson.RPCError\n}\n\n// standardCmdResult checks that a parsed command is a standard Bitcoin JSON-RPC\n// command and runs the appropriate handler to reply to the command.  Any\n// commands which are not recognized or not implemented will return an error\n// suitable for use in replies.\nfunc (s *rpcServer) standardCmdResult(cmd *parsedRPCCmd, closeChan <-chan struct{}) (interface{}, error) {\n\thandler, ok := rpcHandlers[cmd.method]\n\tif ok {\n\t\tgoto handled\n\t}\n\t_, ok = rpcAskWallet[cmd.method]\n\tif ok {\n\t\thandler = handleAskWallet\n\t\tgoto handled\n\t}\n\t_, ok = rpcUnimplemented[cmd.method]\n\tif ok {\n\t\thandler = handleUnimplemented\n\t\tgoto handled\n\t}\n\treturn nil, btcjson.ErrRPCMethodNotFound\nhandled:\n\n\treturn handler(s, cmd.cmd, closeChan)\n}\n\n// parseCmd parses a JSON-RPC request object into known concrete command.  The\n// err field of the returned parsedRPCCmd struct will contain an RPC error that\n// is suitable for use in replies if the command is invalid in some way such as\n// an unregistered command or invalid parameters.\nfunc parseCmd(request *btcjson.Request) *parsedRPCCmd {\n\tparsedCmd := parsedRPCCmd{\n\t\tjsonrpc: request.Jsonrpc,\n\t\tid:      request.ID,\n\t\tmethod:  request.Method,\n\t}\n\n\tcmd, err := btcjson.UnmarshalCmd(request)\n\tif err != nil {\n\t\t// When the error is because the method is not registered,\n\t\t// produce a method not found RPC error.\n\t\tif jerr, ok := err.(btcjson.Error); ok &&\n\t\t\tjerr.ErrorCode == btcjson.ErrUnregisteredMethod {\n\n\t\t\tparsedCmd.err = btcjson.ErrRPCMethodNotFound\n\t\t\treturn &parsedCmd\n\t\t}\n\n\t\t// Otherwise, some type of invalid parameters is the\n\t\t// cause, so produce the equivalent RPC error.\n\t\tparsedCmd.err = btcjson.NewRPCError(\n\t\t\tbtcjson.ErrRPCInvalidParams.Code, err.Error())\n\t\treturn &parsedCmd\n\t}\n\n\tparsedCmd.cmd = cmd\n\treturn &parsedCmd\n}\n\n// createMarshalledReply returns a new marshalled JSON-RPC response given the\n// passed parameters.  It will automatically convert errors that are not of\n// the type *btcjson.RPCError to the appropriate type as needed.\nfunc createMarshalledReply(rpcVersion btcjson.RPCVersion, id interface{}, result interface{}, replyErr error) ([]byte, error) {\n\tvar jsonErr *btcjson.RPCError\n\tif replyErr != nil {\n\t\tif jErr, ok := replyErr.(*btcjson.RPCError); ok {\n\t\t\tjsonErr = jErr\n\t\t} else {\n\t\t\tjsonErr = internalRPCError(replyErr.Error(), \"\")\n\t\t}\n\t}\n\n\treturn btcjson.MarshalResponse(rpcVersion, id, result, jsonErr)\n}\n\n// processRequest determines the incoming request type (single or batched),\n// parses it and returns a marshalled response.\nfunc (s *rpcServer) processRequest(request *btcjson.Request, isAdmin bool, closeChan <-chan struct{}) []byte {\n\tvar result interface{}\n\tvar err error\n\tvar jsonErr *btcjson.RPCError\n\n\tif !isAdmin {\n\t\tif _, ok := rpcLimited[request.Method]; !ok {\n\t\t\tjsonErr = internalRPCError(\"limited user not \"+\n\t\t\t\t\"authorized for this method\", \"\")\n\t\t}\n\t}\n\n\tif jsonErr == nil {\n\t\tif request.Method == \"\" || request.Params == nil {\n\t\t\tjsonErr = &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCInvalidRequest.Code,\n\t\t\t\tMessage: \"Invalid request: malformed\",\n\t\t\t}\n\t\t\tmsg, err := createMarshalledReply(request.Jsonrpc, request.ID, result, jsonErr)\n\t\t\tif err != nil {\n\t\t\t\trpcsLog.Errorf(\"Failed to marshal reply: %v\", err)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn msg\n\t\t}\n\n\t\t// Valid requests with no ID (notifications) must not have a response\n\t\t// per the JSON-RPC spec.\n\t\tif request.ID == nil {\n\t\t\treturn nil\n\t\t}\n\n\t\t// Attempt to parse the JSON-RPC request into a known\n\t\t// concrete command.\n\t\tparsedCmd := parseCmd(request)\n\t\tif parsedCmd.err != nil {\n\t\t\tjsonErr = parsedCmd.err\n\t\t} else {\n\t\t\tresult, err = s.standardCmdResult(parsedCmd,\n\t\t\t\tcloseChan)\n\t\t\tif err != nil {\n\t\t\t\tif rpcErr, ok := err.(*btcjson.RPCError); ok {\n\t\t\t\t\tjsonErr = rpcErr\n\t\t\t\t} else {\n\t\t\t\t\tjsonErr = &btcjson.RPCError{\n\t\t\t\t\t\tCode:    btcjson.ErrRPCInvalidRequest.Code,\n\t\t\t\t\t\tMessage: \"Invalid request: malformed\",\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Marshal the response.\n\tmsg, err := createMarshalledReply(request.Jsonrpc, request.ID, result, jsonErr)\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Failed to marshal reply: %v\", err)\n\t\treturn nil\n\t}\n\treturn msg\n}\n\n// jsonRPCRead handles reading and responding to RPC messages.\nfunc (s *rpcServer) jsonRPCRead(w http.ResponseWriter, r *http.Request, isAdmin bool) {\n\tif atomic.LoadInt32(&s.shutdown) != 0 {\n\t\treturn\n\t}\n\n\t// Read and close the JSON-RPC request body from the caller.\n\tbody, err := io.ReadAll(r.Body)\n\tr.Body.Close()\n\tif err != nil {\n\t\terrCode := http.StatusBadRequest\n\t\thttp.Error(w, fmt.Sprintf(\"%d error reading JSON message: %v\",\n\t\t\terrCode, err), errCode)\n\t\treturn\n\t}\n\n\t// Unfortunately, the http server doesn't provide the ability to\n\t// change the read deadline for the new connection and having one breaks\n\t// long polling.  However, not having a read deadline on the initial\n\t// connection would mean clients can connect and idle forever.  Thus,\n\t// hijack the connection from the HTTP server, clear the read deadline,\n\t// and handle writing the response manually.\n\thj, ok := w.(http.Hijacker)\n\tif !ok {\n\t\terrMsg := \"webserver doesn't support hijacking\"\n\t\trpcsLog.Warnf(errMsg)\n\t\terrCode := http.StatusInternalServerError\n\t\thttp.Error(w, strconv.Itoa(errCode)+\" \"+errMsg, errCode)\n\t\treturn\n\t}\n\tconn, buf, err := hj.Hijack()\n\tif err != nil {\n\t\trpcsLog.Warnf(\"Failed to hijack HTTP connection: %v\", err)\n\t\terrCode := http.StatusInternalServerError\n\t\thttp.Error(w, strconv.Itoa(errCode)+\" \"+err.Error(), errCode)\n\t\treturn\n\t}\n\tdefer conn.Close()\n\tdefer buf.Flush()\n\tconn.SetReadDeadline(timeZeroVal)\n\n\t// Attempt to parse the raw body into a JSON-RPC request.\n\t// Setup a close notifier.  Since the connection is hijacked,\n\t// the CloseNotifier on the ResponseWriter is not available.\n\tcloseChan := make(chan struct{}, 1)\n\tgo func() {\n\t\t_, err = conn.Read(make([]byte, 1))\n\t\tif err != nil {\n\t\t\tclose(closeChan)\n\t\t}\n\t}()\n\n\tvar results []json.RawMessage\n\tvar batchSize int\n\tvar batchedRequest bool\n\n\t// Determine request type\n\tif bytes.HasPrefix(body, batchedRequestPrefix) {\n\t\tbatchedRequest = true\n\t}\n\n\t// Process a single request\n\tif !batchedRequest {\n\t\tvar req btcjson.Request\n\t\tvar resp json.RawMessage\n\t\terr = json.Unmarshal(body, &req)\n\t\tif err != nil {\n\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\tCode: btcjson.ErrRPCParse.Code,\n\t\t\t\tMessage: fmt.Sprintf(\"Failed to parse request: %v\",\n\t\t\t\t\terr),\n\t\t\t}\n\t\t\tresp, err = btcjson.MarshalResponse(btcjson.RpcVersion1, nil, nil, jsonErr)\n\t\t\tif err != nil {\n\t\t\t\trpcsLog.Errorf(\"Failed to create reply: %v\", err)\n\t\t\t}\n\t\t}\n\n\t\tif err == nil {\n\t\t\t// The JSON-RPC 1.0 spec defines that notifications must have their \"id\"\n\t\t\t// set to null and states that notifications do not have a response.\n\t\t\t//\n\t\t\t// A JSON-RPC 2.0 notification is a request with \"json-rpc\":\"2.0\", and\n\t\t\t// without an \"id\" member. The specification states that notifications\n\t\t\t// must not be responded to. JSON-RPC 2.0 permits the null value as a\n\t\t\t// valid request id, therefore such requests are not notifications.\n\t\t\t//\n\t\t\t// Bitcoin Core serves requests with \"id\":null or even an absent \"id\",\n\t\t\t// and responds to such requests with \"id\":null in the response.\n\t\t\t//\n\t\t\t// Btcd does not respond to any request without and \"id\" or \"id\":null,\n\t\t\t// regardless the indicated JSON-RPC protocol version unless RPC quirks\n\t\t\t// are enabled. With RPC quirks enabled, such requests will be responded\n\t\t\t// to if the request does not indicate JSON-RPC version.\n\t\t\t//\n\t\t\t// RPC quirks can be enabled by the user to avoid compatibility issues\n\t\t\t// with software relying on Core's behavior.\n\t\t\tif req.ID == nil && !(cfg.RPCQuirks && req.Jsonrpc == \"\") {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresp = s.processRequest(&req, isAdmin, closeChan)\n\t\t}\n\n\t\tif resp != nil {\n\t\t\tresults = append(results, resp)\n\t\t}\n\t}\n\n\t// Process a batched request\n\tif batchedRequest {\n\t\tvar batchedRequests []interface{}\n\t\tvar resp json.RawMessage\n\t\terr = json.Unmarshal(body, &batchedRequests)\n\t\tif err != nil {\n\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\tCode: btcjson.ErrRPCParse.Code,\n\t\t\t\tMessage: fmt.Sprintf(\"Failed to parse request: %v\",\n\t\t\t\t\terr),\n\t\t\t}\n\t\t\tresp, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr)\n\t\t\tif err != nil {\n\t\t\t\trpcsLog.Errorf(\"Failed to create reply: %v\", err)\n\t\t\t}\n\n\t\t\tif resp != nil {\n\t\t\t\tresults = append(results, resp)\n\t\t\t}\n\t\t}\n\n\t\tif err == nil {\n\t\t\t// Response with an empty batch error if the batch size is zero\n\t\t\tif len(batchedRequests) == 0 {\n\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\tCode:    btcjson.ErrRPCInvalidRequest.Code,\n\t\t\t\t\tMessage: \"Invalid request: empty batch\",\n\t\t\t\t}\n\t\t\t\tresp, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr)\n\t\t\t\tif err != nil {\n\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal reply: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tif resp != nil {\n\t\t\t\t\tresults = append(results, resp)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Process each batch entry individually\n\t\t\tif len(batchedRequests) > 0 {\n\t\t\t\tbatchSize = len(batchedRequests)\n\n\t\t\t\tfor _, entry := range batchedRequests {\n\t\t\t\t\tvar reqBytes []byte\n\t\t\t\t\treqBytes, err = json.Marshal(entry)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\t\t\tCode: btcjson.ErrRPCInvalidRequest.Code,\n\t\t\t\t\t\t\tMessage: fmt.Sprintf(\"Invalid request: %v\",\n\t\t\t\t\t\t\t\terr),\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresp, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\trpcsLog.Errorf(\"Failed to create reply: %v\", err)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif resp != nil {\n\t\t\t\t\t\t\tresults = append(results, resp)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tvar req btcjson.Request\n\t\t\t\t\terr := json.Unmarshal(reqBytes, &req)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\t\t\tCode: btcjson.ErrRPCInvalidRequest.Code,\n\t\t\t\t\t\t\tMessage: fmt.Sprintf(\"Invalid request: %v\",\n\t\t\t\t\t\t\t\terr),\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresp, err = btcjson.MarshalResponse(\"\", nil, nil, jsonErr)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\trpcsLog.Errorf(\"Failed to create reply: %v\", err)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif resp != nil {\n\t\t\t\t\t\t\tresults = append(results, resp)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tresp = s.processRequest(&req, isAdmin, closeChan)\n\t\t\t\t\tif resp != nil {\n\t\t\t\t\t\tresults = append(results, resp)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvar msg = []byte{}\n\tif batchedRequest && batchSize > 0 {\n\t\tif len(results) > 0 {\n\t\t\t// Form the batched response json\n\t\t\tvar buffer bytes.Buffer\n\t\t\tbuffer.WriteByte('[')\n\t\t\tfor idx, reply := range results {\n\t\t\t\tif idx == len(results)-1 {\n\t\t\t\t\tbuffer.Write(reply)\n\t\t\t\t\tbuffer.WriteByte(']')\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tbuffer.Write(reply)\n\t\t\t\tbuffer.WriteByte(',')\n\t\t\t}\n\t\t\tmsg = buffer.Bytes()\n\t\t}\n\t}\n\n\tif !batchedRequest || batchSize == 0 {\n\t\t// Respond with the first results entry for single requests\n\t\tif len(results) > 0 {\n\t\t\tmsg = results[0]\n\t\t}\n\t}\n\n\t// Write the response.\n\terr = s.writeHTTPResponseHeaders(r, w.Header(), http.StatusOK, buf)\n\tif err != nil {\n\t\trpcsLog.Error(err)\n\t\treturn\n\t}\n\tif _, err := buf.Write(msg); err != nil {\n\t\trpcsLog.Errorf(\"Failed to write marshalled reply: %v\", err)\n\t}\n\n\t// Terminate with newline to maintain compatibility with Bitcoin Core.\n\tif err := buf.WriteByte('\\n'); err != nil {\n\t\trpcsLog.Errorf(\"Failed to append terminating newline to reply: %v\", err)\n\t}\n}\n\n// jsonAuthFail sends a message back to the client if the http auth is rejected.\nfunc jsonAuthFail(w http.ResponseWriter) {\n\tw.Header().Add(\"WWW-Authenticate\", `Basic realm=\"btcd RPC\"`)\n\thttp.Error(w, \"401 Unauthorized.\", http.StatusUnauthorized)\n}\n\n// Start is used by server.go to start the rpc listener.\nfunc (s *rpcServer) Start() {\n\tif atomic.AddInt32(&s.started, 1) != 1 {\n\t\treturn\n\t}\n\n\trpcsLog.Trace(\"Starting RPC server\")\n\trpcServeMux := http.NewServeMux()\n\thttpServer := &http.Server{\n\t\tHandler: rpcServeMux,\n\n\t\t// Timeout connections which don't complete the initial\n\t\t// handshake within the allowed timeframe.\n\t\tReadTimeout: time.Second * rpcAuthTimeoutSeconds,\n\t}\n\trpcServeMux.HandleFunc(\"/\", func(w http.ResponseWriter, r *http.Request) {\n\t\tw.Header().Set(\"Connection\", \"close\")\n\t\tw.Header().Set(\"Content-Type\", \"application/json\")\n\t\tr.Close = true\n\n\t\t// Limit the number of connections to max allowed.\n\t\tif s.limitConnections(w, r.RemoteAddr) {\n\t\t\treturn\n\t\t}\n\n\t\t// Keep track of the number of connected clients.\n\t\ts.incrementClients()\n\t\tdefer s.decrementClients()\n\t\t_, isAdmin, err := s.checkAuth(r, true)\n\t\tif err != nil {\n\t\t\tjsonAuthFail(w)\n\t\t\treturn\n\t\t}\n\n\t\t// Read and respond to the request.\n\t\ts.jsonRPCRead(w, r, isAdmin)\n\t})\n\n\t// Websocket endpoint.\n\trpcServeMux.HandleFunc(\"/ws\", func(w http.ResponseWriter, r *http.Request) {\n\t\tauthenticated, isAdmin, err := s.checkAuth(r, false)\n\t\tif err != nil {\n\t\t\tjsonAuthFail(w)\n\t\t\treturn\n\t\t}\n\n\t\t// Attempt to upgrade the connection to a websocket connection\n\t\t// using the default size for read/write buffers.\n\t\tws, err := websocket.Upgrade(w, r, nil, 0, 0)\n\t\tif err != nil {\n\t\t\tif _, ok := err.(websocket.HandshakeError); !ok {\n\t\t\t\trpcsLog.Errorf(\"Unexpected websocket error: %v\",\n\t\t\t\t\terr)\n\t\t\t}\n\t\t\thttp.Error(w, \"400 Bad Request.\", http.StatusBadRequest)\n\t\t\treturn\n\t\t}\n\t\ts.WebsocketHandler(ws, r.RemoteAddr, authenticated, isAdmin)\n\t})\n\n\tfor _, listener := range s.cfg.Listeners {\n\t\ts.wg.Add(1)\n\t\tgo func(listener net.Listener) {\n\t\t\trpcsLog.Infof(\"RPC server listening on %s\", listener.Addr())\n\t\t\thttpServer.Serve(listener)\n\t\t\trpcsLog.Tracef(\"RPC listener done for %s\", listener.Addr())\n\t\t\ts.wg.Done()\n\t\t}(listener)\n\t}\n\n\ts.ntfnMgr.Start()\n}\n\n// genCertPair generates a key/cert pair to the paths provided.\nfunc genCertPair(certFile, keyFile string) error {\n\trpcsLog.Infof(\"Generating TLS certificates...\")\n\n\torg := \"btcd autogenerated cert\"\n\tvalidUntil := time.Now().Add(10 * 365 * 24 * time.Hour)\n\tcert, key, err := btcutil.NewTLSCertPair(org, validUntil, nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Write cert and key files.\n\tif err = os.WriteFile(certFile, cert, 0666); err != nil {\n\t\treturn err\n\t}\n\tif err = os.WriteFile(keyFile, key, 0600); err != nil {\n\t\tos.Remove(certFile)\n\t\treturn err\n\t}\n\n\trpcsLog.Infof(\"Done generating TLS certificates\")\n\treturn nil\n}\n\n// rpcserverPeer represents a peer for use with the RPC server.\n//\n// The interface contract requires that all of these methods are safe for\n// concurrent access.\ntype rpcserverPeer interface {\n\t// ToPeer returns the underlying peer instance.\n\tToPeer() *peer.Peer\n\n\t// IsTxRelayDisabled returns whether or not the peer has disabled\n\t// transaction relay.\n\tIsTxRelayDisabled() bool\n\n\t// BanScore returns the current integer value that represents how close\n\t// the peer is to being banned.\n\tBanScore() uint32\n\n\t// FeeFilter returns the requested current minimum fee rate for which\n\t// transactions should be announced.\n\tFeeFilter() int64\n}\n\n// rpcserverConnManager represents a connection manager for use with the RPC\n// server.\n//\n// The interface contract requires that all of these methods are safe for\n// concurrent access.\ntype rpcserverConnManager interface {\n\t// Connect adds the provided address as a new outbound peer.  The\n\t// permanent flag indicates whether or not to make the peer persistent\n\t// and reconnect if the connection is lost.  Attempting to connect to an\n\t// already existing peer will return an error.\n\tConnect(addr string, permanent bool) error\n\n\t// RemoveByID removes the peer associated with the provided id from the\n\t// list of persistent peers.  Attempting to remove an id that does not\n\t// exist will return an error.\n\tRemoveByID(id int32) error\n\n\t// RemoveByAddr removes the peer associated with the provided address\n\t// from the list of persistent peers.  Attempting to remove an address\n\t// that does not exist will return an error.\n\tRemoveByAddr(addr string) error\n\n\t// DisconnectByID disconnects the peer associated with the provided id.\n\t// This applies to both inbound and outbound peers.  Attempting to\n\t// remove an id that does not exist will return an error.\n\tDisconnectByID(id int32) error\n\n\t// DisconnectByAddr disconnects the peer associated with the provided\n\t// address.  This applies to both inbound and outbound peers.\n\t// Attempting to remove an address that does not exist will return an\n\t// error.\n\tDisconnectByAddr(addr string) error\n\n\t// ConnectedCount returns the number of currently connected peers.\n\tConnectedCount() int32\n\n\t// NetTotals returns the sum of all bytes received and sent across the\n\t// network for all peers.\n\tNetTotals() (uint64, uint64)\n\n\t// ConnectedPeers returns an array consisting of all connected peers.\n\tConnectedPeers() []rpcserverPeer\n\n\t// PersistentPeers returns an array consisting of all the persistent\n\t// peers.\n\tPersistentPeers() []rpcserverPeer\n\n\t// BroadcastMessage sends the provided message to all currently\n\t// connected peers.\n\tBroadcastMessage(msg wire.Message)\n\n\t// AddRebroadcastInventory adds the provided inventory to the list of\n\t// inventories to be rebroadcast at random intervals until they show up\n\t// in a block.\n\tAddRebroadcastInventory(iv *wire.InvVect, data interface{})\n\n\t// RelayTransactions generates and relays inventory vectors for all of\n\t// the passed transactions to all connected peers.\n\tRelayTransactions(txns []*mempool.TxDesc)\n\n\t// NodeAddresses returns an array consisting node addresses which can\n\t// potentially be used to find new nodes in the network.\n\tNodeAddresses() []*wire.NetAddressV2\n}\n\n// rpcserverSyncManager represents a sync manager for use with the RPC server.\n//\n// The interface contract requires that all of these methods are safe for\n// concurrent access.\ntype rpcserverSyncManager interface {\n\t// IsCurrent returns whether or not the sync manager believes the chain\n\t// is current as compared to the rest of the network.\n\tIsCurrent() bool\n\n\t// SubmitBlock submits the provided block to the network after\n\t// processing it locally.\n\tSubmitBlock(block *btcutil.Block, flags blockchain.BehaviorFlags) (bool, error)\n\n\t// Pause pauses the sync manager until the returned channel is closed.\n\tPause() chan<- struct{}\n\n\t// SyncPeerID returns the ID of the peer that is currently the peer being\n\t// used to sync from or 0 if there is none.\n\tSyncPeerID() int32\n\n\t// LocateHeaders returns the headers of the blocks after the first known\n\t// block in the provided locators until the provided stop hash or the\n\t// current tip is reached, up to a max of wire.MaxBlockHeadersPerMsg\n\t// hashes.\n\tLocateHeaders(locators []*chainhash.Hash, hashStop *chainhash.Hash) []wire.BlockHeader\n}\n\n// rpcserverConfig is a descriptor containing the RPC server configuration.\ntype rpcserverConfig struct {\n\t// Listeners defines a slice of listeners for which the RPC server will\n\t// take ownership of and accept connections.  Since the RPC server takes\n\t// ownership of these listeners, they will be closed when the RPC server\n\t// is stopped.\n\tListeners []net.Listener\n\n\t// StartupTime is the unix timestamp for when the server that is hosting\n\t// the RPC server started.\n\tStartupTime int64\n\n\t// ConnMgr defines the connection manager for the RPC server to use.  It\n\t// provides the RPC server with a means to do things such as add,\n\t// remove, connect, disconnect, and query peers as well as other\n\t// connection-related data and tasks.\n\tConnMgr rpcserverConnManager\n\n\t// SyncMgr defines the sync manager for the RPC server to use.\n\tSyncMgr rpcserverSyncManager\n\n\t// These fields allow the RPC server to interface with the local block\n\t// chain data and state.\n\tTimeSource  blockchain.MedianTimeSource\n\tChain       *blockchain.BlockChain\n\tChainParams *chaincfg.Params\n\tDB          database.DB\n\n\t// TxMemPool defines the transaction memory pool to interact with.\n\tTxMemPool mempool.TxMempool\n\n\t// These fields allow the RPC server to interface with mining.\n\t//\n\t// Generator produces block templates and the CPUMiner solves them using\n\t// the CPU.  CPU mining is typically only useful for test purposes when\n\t// doing regression or simulation testing.\n\tGenerator *mining.BlkTmplGenerator\n\tCPUMiner  *cpuminer.CPUMiner\n\n\t// These fields define any optional indexes the RPC server can make use\n\t// of to provide additional data when queried.\n\tTxIndex   *indexers.TxIndex\n\tAddrIndex *indexers.AddrIndex\n\tCfIndex   *indexers.CfIndex\n\n\t// The fee estimator keeps track of how long transactions are left in\n\t// the mempool before they are mined into blocks.\n\tFeeEstimator *mempool.FeeEstimator\n}\n\n// newRPCServer returns a new instance of the rpcServer struct.\nfunc newRPCServer(config *rpcserverConfig) (*rpcServer, error) {\n\trpc := rpcServer{\n\t\tcfg:                    *config,\n\t\tstatusLines:            make(map[int]string),\n\t\tgbtWorkState:           newGbtWorkState(config.TimeSource),\n\t\thelpCacher:             newHelpCacher(),\n\t\trequestProcessShutdown: make(chan struct{}),\n\t\tquit:                   make(chan int),\n\t}\n\tif cfg.RPCUser != \"\" && cfg.RPCPass != \"\" {\n\t\tlogin := cfg.RPCUser + \":\" + cfg.RPCPass\n\t\tauth := \"Basic \" + base64.StdEncoding.EncodeToString([]byte(login))\n\t\trpc.authsha = sha256.Sum256([]byte(auth))\n\t}\n\tif cfg.RPCLimitUser != \"\" && cfg.RPCLimitPass != \"\" {\n\t\tlogin := cfg.RPCLimitUser + \":\" + cfg.RPCLimitPass\n\t\tauth := \"Basic \" + base64.StdEncoding.EncodeToString([]byte(login))\n\t\trpc.limitauthsha = sha256.Sum256([]byte(auth))\n\t}\n\trpc.ntfnMgr = newWsNotificationManager(&rpc)\n\trpc.cfg.Chain.Subscribe(rpc.handleBlockchainNotification)\n\n\treturn &rpc, nil\n}\n\n// Callback for notifications from blockchain.  It notifies clients that are\n// long polling for changes or subscribed to websockets notifications.\nfunc (s *rpcServer) handleBlockchainNotification(notification *blockchain.Notification) {\n\tswitch notification.Type {\n\tcase blockchain.NTBlockAccepted:\n\t\tblock, ok := notification.Data.(*btcutil.Block)\n\t\tif !ok {\n\t\t\trpcsLog.Warnf(\"Chain accepted notification is not a block.\")\n\t\t\tbreak\n\t\t}\n\n\t\t// Allow any clients performing long polling via the\n\t\t// getblocktemplate RPC to be notified when the new block causes\n\t\t// their old block template to become stale.\n\t\ts.gbtWorkState.NotifyBlockConnected(block.Hash())\n\n\tcase blockchain.NTBlockConnected:\n\t\tblock, ok := notification.Data.(*btcutil.Block)\n\t\tif !ok {\n\t\t\trpcsLog.Warnf(\"Chain connected notification is not a block.\")\n\t\t\tbreak\n\t\t}\n\n\t\t// Notify registered websocket clients of incoming block.\n\t\ts.ntfnMgr.NotifyBlockConnected(block)\n\n\tcase blockchain.NTBlockDisconnected:\n\t\tblock, ok := notification.Data.(*btcutil.Block)\n\t\tif !ok {\n\t\t\trpcsLog.Warnf(\"Chain disconnected notification is not a block.\")\n\t\t\tbreak\n\t\t}\n\n\t\t// Notify registered websocket clients.\n\t\ts.ntfnMgr.NotifyBlockDisconnected(block)\n\t}\n}\n\nfunc init() {\n\trpcHandlers = rpcHandlersBeforeInit\n\trand.Seed(time.Now().UnixNano())\n}\n"
  },
  {
    "path": "rpcserver_test.go",
    "content": "package main\n\nimport (\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/mempool\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestHandleTestMempoolAcceptFailDecode checks that when invalid hex string is\n// used as the raw txns, the corresponding error is returned.\nfunc TestHandleTestMempoolAcceptFailDecode(t *testing.T) {\n\tt.Parallel()\n\n\trequire := require.New(t)\n\n\t// Create a testing server.\n\ts := &rpcServer{}\n\n\ttestCases := []struct {\n\t\tname            string\n\t\ttxns            []string\n\t\texpectedErrCode btcjson.RPCErrorCode\n\t}{\n\t\t{\n\t\t\tname:            \"hex decode fail\",\n\t\t\ttxns:            []string{\"invalid\"},\n\t\t\texpectedErrCode: btcjson.ErrRPCDecodeHexString,\n\t\t},\n\t\t{\n\t\t\tname:            \"tx decode fail\",\n\t\t\ttxns:            []string{\"696e76616c6964\"},\n\t\t\texpectedErrCode: btcjson.ErrRPCDeserialization,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\t// Create a request that uses invalid raw txns.\n\t\t\tcmd := btcjson.NewTestMempoolAcceptCmd(tc.txns, 0)\n\n\t\t\t// Call the method under test.\n\t\t\tcloseChan := make(chan struct{})\n\t\t\tresult, err := handleTestMempoolAccept(\n\t\t\t\ts, cmd, closeChan,\n\t\t\t)\n\n\t\t\t// Ensure the expected error is returned.\n\t\t\trequire.Error(err)\n\t\t\trpcErr, ok := err.(*btcjson.RPCError)\n\t\t\trequire.True(ok)\n\t\t\trequire.Equal(tc.expectedErrCode, rpcErr.Code)\n\n\t\t\t// No result should be returned.\n\t\t\trequire.Nil(result)\n\t\t})\n\t}\n}\n\nvar (\n\t// TODO(yy): make a `btctest` package and move these testing txns there\n\t// so they be used in other tests.\n\t//\n\t// txHex1 is taken from `txscript/data/tx_valid.json`.\n\ttxHex1 = \"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b\" +\n\t\t\"49aa43ad90ba26000000000490047304402203f16c6f40162ab686621ef3\" +\n\t\t\"000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507a\" +\n\t\t\"c48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0\" +\n\t\t\"140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271a\" +\n\t\t\"d504b88ac00000000\"\n\n\t// txHex2 is taken from `txscript/data/tx_valid.json`.\n\ttxHex2 = \"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b\" +\n\t\t\"49aa43ad90ba260000000004a0048304402203f16c6f40162ab686621ef3\" +\n\t\t\"000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507a\" +\n\t\t\"c48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2bab01fffffff\" +\n\t\t\"f0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c27\" +\n\t\t\"1ad504b88ac00000000\"\n\n\t// txHex3 is taken from `txscript/data/tx_valid.json`.\n\ttxHex3 = \"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b\" +\n\t\t\"49aa43ad90ba260000000004a01ff47304402203f16c6f40162ab686621e\" +\n\t\t\"f3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc350\" +\n\t\t\"7ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01fffffff\" +\n\t\t\"f0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c27\" +\n\t\t\"1ad504b88ac00000000\"\n)\n\n// decodeTxHex decodes the given hex string into a transaction.\nfunc decodeTxHex(t *testing.T, txHex string) *btcutil.Tx {\n\trawBytes, err := hex.DecodeString(txHex)\n\trequire.NoError(t, err)\n\ttx, err := btcutil.NewTxFromBytes(rawBytes)\n\trequire.NoError(t, err)\n\n\treturn tx\n}\n\n// TestHandleTestMempoolAcceptMixedResults checks that when different txns get\n// different responses from calling the mempool method `CheckMempoolAcceptance`\n// their results are correctly returned.\nfunc TestHandleTestMempoolAcceptMixedResults(t *testing.T) {\n\tt.Parallel()\n\n\trequire := require.New(t)\n\n\t// Create a mock mempool.\n\tmm := &mempool.MockTxMempool{}\n\n\t// Create a testing server with the mock mempool.\n\ts := &rpcServer{cfg: rpcserverConfig{\n\t\tTxMemPool: mm,\n\t}}\n\n\t// Decode the hex so we can assert the mock mempool is called with it.\n\ttx1 := decodeTxHex(t, txHex1)\n\ttx2 := decodeTxHex(t, txHex2)\n\ttx3 := decodeTxHex(t, txHex3)\n\n\t// Create a slice to hold the expected results. We will use three txns\n\t// so we expect threeresults.\n\texpectedResults := make([]*btcjson.TestMempoolAcceptResult, 3)\n\n\t// We now mock the first call to `CheckMempoolAcceptance` to return an\n\t// error.\n\tdummyErr := errors.New(\"dummy error\")\n\tmm.On(\"CheckMempoolAcceptance\", tx1).Return(nil, dummyErr).Once()\n\n\t// Since the call failed, we expect the first result to give us the\n\t// error.\n\texpectedResults[0] = &btcjson.TestMempoolAcceptResult{\n\t\tTxid:         tx1.Hash().String(),\n\t\tWtxid:        tx1.WitnessHash().String(),\n\t\tAllowed:      false,\n\t\tRejectReason: dummyErr.Error(),\n\t}\n\n\t// We mock the second call to `CheckMempoolAcceptance` to return a\n\t// result saying the tx is missing inputs.\n\tmm.On(\"CheckMempoolAcceptance\", tx2).Return(\n\t\t&mempool.MempoolAcceptResult{\n\t\t\tMissingParents: []*chainhash.Hash{},\n\t\t}, nil,\n\t).Once()\n\n\t// We expect the second result to give us the missing-inputs error.\n\texpectedResults[1] = &btcjson.TestMempoolAcceptResult{\n\t\tTxid:         tx2.Hash().String(),\n\t\tWtxid:        tx2.WitnessHash().String(),\n\t\tAllowed:      false,\n\t\tRejectReason: \"missing-inputs\",\n\t}\n\n\t// We mock the third call to `CheckMempoolAcceptance` to return a\n\t// result saying the tx allowed.\n\tconst feeSats = btcutil.Amount(1000)\n\tmm.On(\"CheckMempoolAcceptance\", tx3).Return(\n\t\t&mempool.MempoolAcceptResult{\n\t\t\tTxFee:  feeSats,\n\t\t\tTxSize: 100,\n\t\t}, nil,\n\t).Once()\n\n\t// We expect the third result to give us the fee details.\n\texpectedResults[2] = &btcjson.TestMempoolAcceptResult{\n\t\tTxid:    tx3.Hash().String(),\n\t\tWtxid:   tx3.WitnessHash().String(),\n\t\tAllowed: true,\n\t\tVsize:   100,\n\t\tFees: &btcjson.TestMempoolAcceptFees{\n\t\t\tBase:             feeSats.ToBTC(),\n\t\t\tEffectiveFeeRate: feeSats.ToBTC() * 1e3 / 100,\n\t\t},\n\t}\n\n\t// Create a mock request with default max fee rate of 0.1 BTC/KvB.\n\tcmd := btcjson.NewTestMempoolAcceptCmd(\n\t\t[]string{txHex1, txHex2, txHex3}, 0.1,\n\t)\n\n\t// Call the method handler and assert the expected results are\n\t// returned.\n\tcloseChan := make(chan struct{})\n\tresults, err := handleTestMempoolAccept(s, cmd, closeChan)\n\trequire.NoError(err)\n\trequire.Equal(expectedResults, results)\n\n\t// Assert the mocked method is called as expected.\n\tmm.AssertExpectations(t)\n}\n\n// TestValidateFeeRate checks that `validateFeeRate` behaves as expected.\nfunc TestValidateFeeRate(t *testing.T) {\n\tt.Parallel()\n\n\tconst (\n\t\t// testFeeRate is in BTC/kvB.\n\t\ttestFeeRate = 0.1\n\n\t\t// testTxSize is in vb.\n\t\ttestTxSize = 100\n\n\t\t// testFeeSats is in sats.\n\t\t// We have 0.1BTC/kvB =\n\t\t//   0.1 * 1e8 sats/kvB =\n\t\t//   0.1 * 1e8 / 1e3 sats/vb = 0.1 * 1e5 sats/vb.\n\t\ttestFeeSats = btcutil.Amount(testFeeRate * 1e5 * testTxSize)\n\t)\n\n\ttestCases := []struct {\n\t\tname         string\n\t\tfeeSats      btcutil.Amount\n\t\ttxSize       int64\n\t\tmaxFeeRate   float64\n\t\texpectedFees *btcjson.TestMempoolAcceptFees\n\t\tallowed      bool\n\t}{\n\t\t{\n\t\t\t// When the fee rate(0.1) is above the max fee\n\t\t\t// rate(0.01), we expect a nil result and false.\n\t\t\tname:         \"fee rate above max\",\n\t\t\tfeeSats:      testFeeSats,\n\t\t\ttxSize:       testTxSize,\n\t\t\tmaxFeeRate:   testFeeRate / 10,\n\t\t\texpectedFees: nil,\n\t\t\tallowed:      false,\n\t\t},\n\t\t{\n\t\t\t// When the fee rate(0.1) is no greater than the max\n\t\t\t// fee rate(0.1), we expect a result and true.\n\t\t\tname:       \"fee rate below max\",\n\t\t\tfeeSats:    testFeeSats,\n\t\t\ttxSize:     testTxSize,\n\t\t\tmaxFeeRate: testFeeRate,\n\t\t\texpectedFees: &btcjson.TestMempoolAcceptFees{\n\t\t\t\tBase:             testFeeSats.ToBTC(),\n\t\t\t\tEffectiveFeeRate: testFeeRate,\n\t\t\t},\n\t\t\tallowed: true,\n\t\t},\n\t\t{\n\t\t\t// When the fee rate(1) is above the default max fee\n\t\t\t// rate(0.1), we expect a nil result and false.\n\t\t\tname:         \"fee rate above default max\",\n\t\t\tfeeSats:      testFeeSats,\n\t\t\ttxSize:       testTxSize / 10,\n\t\t\texpectedFees: nil,\n\t\t\tallowed:      false,\n\t\t},\n\t\t{\n\t\t\t// When the fee rate(0.1) is no greater than the\n\t\t\t// default max fee rate(0.1), we expect a result and\n\t\t\t// true.\n\t\t\tname:    \"fee rate below default max\",\n\t\t\tfeeSats: testFeeSats,\n\t\t\ttxSize:  testTxSize,\n\t\t\texpectedFees: &btcjson.TestMempoolAcceptFees{\n\t\t\t\tBase:             testFeeSats.ToBTC(),\n\t\t\t\tEffectiveFeeRate: testFeeRate,\n\t\t\t},\n\t\t\tallowed: true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\trequire := require.New(t)\n\n\t\t\tresult, allowed := validateFeeRate(\n\t\t\t\ttc.feeSats, tc.txSize, tc.maxFeeRate,\n\t\t\t)\n\n\t\t\trequire.Equal(tc.expectedFees, result)\n\t\t\trequire.Equal(tc.allowed, allowed)\n\t\t})\n\t}\n}\n\n// TestHandleTestMempoolAcceptFees checks that the `Fees` field is correctly\n// populated based on the max fee rate and the tx being checked.\nfunc TestHandleTestMempoolAcceptFees(t *testing.T) {\n\tt.Parallel()\n\n\t// Create a mock mempool.\n\tmm := &mempool.MockTxMempool{}\n\n\t// Create a testing server with the mock mempool.\n\ts := &rpcServer{cfg: rpcserverConfig{\n\t\tTxMemPool: mm,\n\t}}\n\n\tconst (\n\t\t// Set transaction's fee rate to be 0.2BTC/kvB.\n\t\tfeeRate = defaultMaxFeeRate * 2\n\n\t\t// txSize is 100vb.\n\t\ttxSize = 100\n\n\t\t// feeSats is 2e6 sats.\n\t\tfeeSats = feeRate * 1e8 * txSize / 1e3\n\t)\n\n\ttestCases := []struct {\n\t\tname         string\n\t\tmaxFeeRate   float64\n\t\ttxHex        string\n\t\trejectReason string\n\t\tallowed      bool\n\t}{\n\t\t{\n\t\t\t// When the fee rate(0.2) used by the tx is below the\n\t\t\t// max fee rate(2) specified, the result should allow\n\t\t\t// it.\n\t\t\tname:       \"below max fee rate\",\n\t\t\tmaxFeeRate: feeRate * 10,\n\t\t\ttxHex:      txHex1,\n\t\t\tallowed:    true,\n\t\t},\n\t\t{\n\t\t\t// When the fee rate(0.2) used by the tx is above the\n\t\t\t// max fee rate(0.02) specified, the result should\n\t\t\t// disallow it.\n\t\t\tname:         \"above max fee rate\",\n\t\t\tmaxFeeRate:   feeRate / 10,\n\t\t\ttxHex:        txHex1,\n\t\t\tallowed:      false,\n\t\t\trejectReason: \"max-fee-exceeded\",\n\t\t},\n\t\t{\n\t\t\t// When the max fee rate is not set, the default\n\t\t\t// 0.1BTC/kvB is used and the fee rate(0.2) used by the\n\t\t\t// tx is above it, the result should disallow it.\n\t\t\tname:         \"above default max fee rate\",\n\t\t\ttxHex:        txHex1,\n\t\t\tallowed:      false,\n\t\t\trejectReason: \"max-fee-exceeded\",\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\ttc := tc\n\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\trequire := require.New(t)\n\n\t\t\t// Decode the hex so we can assert the mock mempool is\n\t\t\t// called with it.\n\t\t\ttx := decodeTxHex(t, txHex1)\n\n\t\t\t// We mock the call to `CheckMempoolAcceptance` to\n\t\t\t// return the result.\n\t\t\tmm.On(\"CheckMempoolAcceptance\", tx).Return(\n\t\t\t\t&mempool.MempoolAcceptResult{\n\t\t\t\t\tTxFee:  feeSats,\n\t\t\t\t\tTxSize: txSize,\n\t\t\t\t}, nil,\n\t\t\t).Once()\n\n\t\t\t// We expect the third result to give us the fee\n\t\t\t// details.\n\t\t\texpected := &btcjson.TestMempoolAcceptResult{\n\t\t\t\tTxid:    tx.Hash().String(),\n\t\t\t\tWtxid:   tx.WitnessHash().String(),\n\t\t\t\tAllowed: tc.allowed,\n\t\t\t}\n\n\t\t\tif tc.allowed {\n\t\t\t\texpected.Vsize = txSize\n\t\t\t\texpected.Fees = &btcjson.TestMempoolAcceptFees{\n\t\t\t\t\tBase:             feeSats / 1e8,\n\t\t\t\t\tEffectiveFeeRate: feeRate,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\texpected.RejectReason = tc.rejectReason\n\t\t\t}\n\n\t\t\t// Create a mock request with specified max fee rate.\n\t\t\tcmd := btcjson.NewTestMempoolAcceptCmd(\n\t\t\t\t[]string{txHex1}, tc.maxFeeRate,\n\t\t\t)\n\n\t\t\t// Call the method handler and assert the expected\n\t\t\t// result is returned.\n\t\t\tcloseChan := make(chan struct{})\n\t\t\tr, err := handleTestMempoolAccept(s, cmd, closeChan)\n\t\t\trequire.NoError(err)\n\n\t\t\t// Check the interface type.\n\t\t\tresults, ok := r.([]*btcjson.TestMempoolAcceptResult)\n\t\t\trequire.True(ok)\n\n\t\t\t// Expect exactly one result.\n\t\t\trequire.Len(results, 1)\n\n\t\t\t// Check the result is returned as expected.\n\t\t\trequire.Equal(expected, results[0])\n\n\t\t\t// Assert the mocked method is called as expected.\n\t\t\tmm.AssertExpectations(t)\n\t\t})\n\t}\n}\n\n// TestGetTxSpendingPrevOut checks that handleGetTxSpendingPrevOut handles the\n// cmd as expected.\nfunc TestGetTxSpendingPrevOut(t *testing.T) {\n\tt.Parallel()\n\n\trequire := require.New(t)\n\n\t// Create a mock mempool.\n\tmm := &mempool.MockTxMempool{}\n\tdefer mm.AssertExpectations(t)\n\n\t// Create a testing server with the mock mempool.\n\ts := &rpcServer{cfg: rpcserverConfig{\n\t\tTxMemPool: mm,\n\t}}\n\n\t// First, check the error case.\n\t//\n\t// Create a request that will cause an error.\n\tcmd := &btcjson.GetTxSpendingPrevOutCmd{\n\t\tOutputs: []*btcjson.GetTxSpendingPrevOutCmdOutput{\n\t\t\t{Txid: \"invalid\"},\n\t\t},\n\t}\n\n\t// Call the method handler and assert the error is returned.\n\tcloseChan := make(chan struct{})\n\tresults, err := handleGetTxSpendingPrevOut(s, cmd, closeChan)\n\trequire.Error(err)\n\trequire.Nil(results)\n\n\t// We now check the normal case. Two outputs will be tested - one found\n\t// in mempool and other not.\n\t//\n\t// Decode the hex so we can assert the mock mempool is called with it.\n\ttx := decodeTxHex(t, txHex1)\n\n\t// Create testing outpoints.\n\topInMempool := wire.OutPoint{Hash: chainhash.Hash{1}, Index: 1}\n\topNotInMempool := wire.OutPoint{Hash: chainhash.Hash{2}, Index: 1}\n\n\t// We only expect to see one output being found as spent in mempool.\n\texpectedResults := []*btcjson.GetTxSpendingPrevOutResult{\n\t\t{\n\t\t\tTxid:         opInMempool.Hash.String(),\n\t\t\tVout:         opInMempool.Index,\n\t\t\tSpendingTxid: tx.Hash().String(),\n\t\t},\n\t\t{\n\t\t\tTxid: opNotInMempool.Hash.String(),\n\t\t\tVout: opNotInMempool.Index,\n\t\t},\n\t}\n\n\t// We mock the first call to `CheckSpend` to return a result saying the\n\t// output is found.\n\tmm.On(\"CheckSpend\", opInMempool).Return(tx).Once()\n\n\t// We mock the second call to `CheckSpend` to return a result saying the\n\t// output is NOT found.\n\tmm.On(\"CheckSpend\", opNotInMempool).Return(nil).Once()\n\n\t// Create a request with the above outputs.\n\tcmd = &btcjson.GetTxSpendingPrevOutCmd{\n\t\tOutputs: []*btcjson.GetTxSpendingPrevOutCmdOutput{\n\t\t\t{\n\t\t\t\tTxid: opInMempool.Hash.String(),\n\t\t\t\tVout: opInMempool.Index,\n\t\t\t},\n\t\t\t{\n\t\t\t\tTxid: opNotInMempool.Hash.String(),\n\t\t\t\tVout: opNotInMempool.Index,\n\t\t\t},\n\t\t},\n\t}\n\n\t// Call the method handler and assert the expected result is returned.\n\tcloseChan = make(chan struct{})\n\tresults, err = handleGetTxSpendingPrevOut(s, cmd, closeChan)\n\trequire.NoError(err)\n\trequire.Equal(expectedResults, results)\n}\n"
  },
  {
    "path": "rpcserverhelp.go",
    "content": "// Copyright (c) 2015-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"errors\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/btcsuite/btcd/btcjson\"\n)\n\n// helpDescsEnUS defines the English descriptions used for the help strings.\nvar helpDescsEnUS = map[string]string{\n\t// DebugLevelCmd help.\n\t\"debuglevel--synopsis\": \"Dynamically changes the debug logging level.\\n\" +\n\t\t\"The levelspec can either a debug level or of the form:\\n\" +\n\t\t\"<subsystem>=<level>,<subsystem2>=<level2>,...\\n\" +\n\t\t\"The valid debug levels are trace, debug, info, warn, error, and critical.\\n\" +\n\t\t\"The valid subsystems are AMGR, ADXR, BCDB, BMGR, BTCD, CHAN, DISC, PEER, RPCS, SCRP, SRVR, and TXMP.\\n\" +\n\t\t\"Finally the keyword 'show' will return a list of the available subsystems.\",\n\t\"debuglevel-levelspec\":   \"The debug level(s) to use or the keyword 'show'\",\n\t\"debuglevel--condition0\": \"levelspec!=show\",\n\t\"debuglevel--condition1\": \"levelspec=show\",\n\t\"debuglevel--result0\":    \"The string 'Done.'\",\n\t\"debuglevel--result1\":    \"The list of subsystems\",\n\n\t// AddNodeCmd help.\n\t\"addnode--synopsis\": \"Attempts to add or remove a persistent peer.\",\n\t\"addnode-addr\":      \"IP address and port of the peer to operate on\",\n\t\"addnode-subcmd\":    \"'add' to add a persistent peer, 'remove' to remove a persistent peer, or 'onetry' to try a single connection to a peer\",\n\n\t// NodeCmd help.\n\t\"node--synopsis\":     \"Attempts to add or remove a peer.\",\n\t\"node-subcmd\":        \"'disconnect' to remove all matching non-persistent peers, 'remove' to remove a persistent peer, or 'connect' to connect to a peer\",\n\t\"node-target\":        \"Either the IP address and port of the peer to operate on, or a valid peer ID.\",\n\t\"node-connectsubcmd\": \"'perm' to make the connected peer a permanent one, 'temp' to try a single connect to a peer\",\n\n\t// TransactionInput help.\n\t\"transactioninput-txid\": \"The hash of the input transaction\",\n\t\"transactioninput-vout\": \"The specific output of the input transaction to redeem\",\n\n\t// CreateRawTransactionCmd help.\n\t\"createrawtransaction--synopsis\": \"Returns a new transaction spending the provided inputs and sending to the provided addresses.\\n\" +\n\t\t\"The transaction inputs are not signed in the created transaction.\\n\" +\n\t\t\"The signrawtransaction RPC command provided by wallet must be used to sign the resulting transaction.\",\n\t\"createrawtransaction-inputs\":         \"The inputs to the transaction\",\n\t\"createrawtransaction-amounts\":        \"JSON object with the destination addresses as keys and amounts as values\",\n\t\"createrawtransaction-amounts--key\":   \"address\",\n\t\"createrawtransaction-amounts--value\": \"n.nnn\",\n\t\"createrawtransaction-amounts--desc\":  \"The destination address as the key and the amount in BTC as the value\",\n\t\"createrawtransaction-locktime\":       \"Locktime value; a non-zero value will also locktime-activate the inputs\",\n\t\"createrawtransaction--result0\":       \"Hex-encoded bytes of the serialized transaction\",\n\n\t// ScriptSig help.\n\t\"scriptsig-asm\": \"Disassembly of the script\",\n\t\"scriptsig-hex\": \"Hex-encoded bytes of the script\",\n\n\t// PrevOut help.\n\t\"prevout-addresses\": \"previous output addresses\",\n\t\"prevout-value\":     \"previous output value\",\n\n\t// VinPrevOut help.\n\t\"vinprevout-coinbase\":    \"The hex-encoded bytes of the signature script (coinbase txns only)\",\n\t\"vinprevout-txid\":        \"The hash of the origin transaction (non-coinbase txns only)\",\n\t\"vinprevout-vout\":        \"The index of the output being redeemed from the origin transaction (non-coinbase txns only)\",\n\t\"vinprevout-scriptSig\":   \"The signature script used to redeem the origin transaction as a JSON object (non-coinbase txns only)\",\n\t\"vinprevout-txinwitness\": \"The witness stack of the passed input, encoded as a JSON string array\",\n\t\"vinprevout-prevOut\":     \"Data from the origin transaction output with index vout.\",\n\t\"vinprevout-sequence\":    \"The script sequence number\",\n\n\t// Vin help.\n\t\"vin-coinbase\":    \"The hex-encoded bytes of the signature script (coinbase txns only)\",\n\t\"vin-txid\":        \"The hash of the origin transaction (non-coinbase txns only)\",\n\t\"vin-vout\":        \"The index of the output being redeemed from the origin transaction (non-coinbase txns only)\",\n\t\"vin-scriptSig\":   \"The signature script used to redeem the origin transaction as a JSON object (non-coinbase txns only)\",\n\t\"vin-txinwitness\": \"The witness used to redeem the input encoded as a string array of its items\",\n\t\"vin-sequence\":    \"The script sequence number\",\n\n\t// ScriptPubKeyResult help.\n\t\"scriptpubkeyresult-asm\":       \"Disassembly of the script\",\n\t\"scriptpubkeyresult-hex\":       \"Hex-encoded bytes of the script\",\n\t\"scriptpubkeyresult-reqSigs\":   \"(DEPRECATED) The number of required signatures\",\n\t\"scriptpubkeyresult-type\":      \"The type of the script (e.g. 'pubkeyhash')\",\n\t\"scriptpubkeyresult-address\":   \"The bitcoin address associated with this script (only if a well-defined address exists)\",\n\t\"scriptpubkeyresult-addresses\": \"(DEPRECATED) The bitcoin addresses associated with this script\",\n\n\t// Vout help.\n\t\"vout-value\":        \"The amount in BTC\",\n\t\"vout-n\":            \"The index of this transaction output\",\n\t\"vout-scriptPubKey\": \"The public key script used to pay coins as a JSON object\",\n\n\t// TxRawDecodeResult help.\n\t\"txrawdecoderesult-txid\":     \"The hash of the transaction\",\n\t\"txrawdecoderesult-version\":  \"The transaction version\",\n\t\"txrawdecoderesult-locktime\": \"The transaction lock time\",\n\t\"txrawdecoderesult-vin\":      \"The transaction inputs as JSON objects\",\n\t\"txrawdecoderesult-vout\":     \"The transaction outputs as JSON objects\",\n\n\t// DecodeRawTransactionCmd help.\n\t\"decoderawtransaction--synopsis\": \"Returns a JSON object representing the provided serialized, hex-encoded transaction.\",\n\t\"decoderawtransaction-hextx\":     \"Serialized, hex-encoded transaction\",\n\n\t// DecodeScriptResult help.\n\t\"decodescriptresult-asm\":       \"Disassembly of the script\",\n\t\"decodescriptresult-reqSigs\":   \"(DEPRECATED) The number of required signatures\",\n\t\"decodescriptresult-type\":      \"The type of the script (e.g. 'pubkeyhash')\",\n\t\"decodescriptresult-address\":   \"The bitcoin address associated with this script (only if a well-defined address exists)\",\n\t\"decodescriptresult-addresses\": \"(DEPRECATED) The bitcoin addresses associated with this script\",\n\t\"decodescriptresult-p2sh\":      \"The script hash for use in pay-to-script-hash transactions (only present if the provided redeem script is not already a pay-to-script-hash script)\",\n\n\t// DecodeScriptCmd help.\n\t\"decodescript--synopsis\": \"Returns a JSON object with information about the provided hex-encoded script.\",\n\t\"decodescript-hexscript\": \"Hex-encoded script\",\n\n\t// EstimateFeeCmd help.\n\t\"estimatefee--synopsis\": \"Estimate the fee per kilobyte in satoshis \" +\n\t\t\"required for a transaction to be mined before a certain number of \" +\n\t\t\"blocks have been generated.\",\n\t\"estimatefee-numblocks\": \"The maximum number of blocks which can be \" +\n\t\t\"generated before the transaction is mined.\",\n\t\"estimatefee--result0\": \"Estimated fee per kilobyte in satoshis for a block to \" +\n\t\t\"be mined in the next NumBlocks blocks.\",\n\n\t// GenerateCmd help\n\t\"generate--synopsis\": \"Generates a set number of blocks (simnet or regtest only) and returns a JSON\\n\" +\n\t\t\" array of their hashes.\",\n\t\"generate-numblocks\": \"Number of blocks to generate\",\n\t\"generate--result0\":  \"The hashes, in order, of blocks generated by the call\",\n\n\t// GetAddedNodeInfoResultAddr help.\n\t\"getaddednodeinforesultaddr-address\":   \"The ip address for this DNS entry\",\n\t\"getaddednodeinforesultaddr-connected\": \"The connection 'direction' (inbound/outbound/false)\",\n\n\t// GetAddedNodeInfoResult help.\n\t\"getaddednodeinforesult-addednode\": \"The ip address or domain of the added peer\",\n\t\"getaddednodeinforesult-connected\": \"Whether or not the peer is currently connected\",\n\t\"getaddednodeinforesult-addresses\": \"DNS lookup and connection information about the peer\",\n\n\t// GetAddedNodeInfo help.\n\t\"getaddednodeinfo--synopsis\":   \"Returns information about manually added (persistent) peers.\",\n\t\"getaddednodeinfo-dns\":         \"Specifies whether the returned data is a JSON object including DNS and connection information, or just a list of added peers\",\n\t\"getaddednodeinfo-node\":        \"Only return information about this specific peer instead of all added peers\",\n\t\"getaddednodeinfo--condition0\": \"dns=false\",\n\t\"getaddednodeinfo--condition1\": \"dns=true\",\n\t\"getaddednodeinfo--result0\":    \"List of added peers\",\n\n\t// GetBestBlockResult help.\n\t\"getbestblockresult-hash\":   \"Hex-encoded bytes of the best block hash\",\n\t\"getbestblockresult-height\": \"Height of the best block\",\n\n\t// GetBestBlockCmd help.\n\t\"getbestblock--synopsis\": \"Get block height and hash of best block in the main chain.\",\n\t\"getbestblock--result0\":  \"Get block height and hash of best block in the main chain.\",\n\n\t// GetBestBlockHashCmd help.\n\t\"getbestblockhash--synopsis\": \"Returns the hash of the of the best (most recent) block in the longest block chain.\",\n\t\"getbestblockhash--result0\":  \"The hex-encoded block hash\",\n\n\t// GetBlockCmd help.\n\t\"getblock--synopsis\":   \"Returns information about a block given its hash.\",\n\t\"getblock-hash\":        \"The hash of the block\",\n\t\"getblock-verbosity\":   \"Specifies whether the block data should be returned as a hex-encoded string (0), as parsed data with a slice of TXIDs (1), or as parsed data with parsed transaction data (2) \",\n\t\"getblock--condition0\": \"verbosity=0\",\n\t\"getblock--condition1\": \"verbosity=1\",\n\t\"getblock--result0\":    \"Hex-encoded bytes of the serialized block\",\n\n\t// GetBlockChainInfoCmd help.\n\t\"getblockchaininfo--synopsis\": \"Returns information about the current blockchain state and the status of any active soft-fork deployments.\",\n\n\t// GetBlockChainInfoResult help.\n\t\"getblockchaininforesult-chain\":                \"The name of the chain the daemon is on (testnet, mainnet, etc)\",\n\t\"getblockchaininforesult-blocks\":               \"The number of blocks in the best known chain\",\n\t\"getblockchaininforesult-headers\":              \"The number of headers that we've gathered for in the best known chain\",\n\t\"getblockchaininforesult-bestblockhash\":        \"The block hash for the latest block in the main chain\",\n\t\"getblockchaininforesult-difficulty\":           \"The current chain difficulty\",\n\t\"getblockchaininforesult-mediantime\":           \"The median time from the PoV of the best block in the chain\",\n\t\"getblockchaininforesult-verificationprogress\": \"An estimate for how much of the best chain we've verified\",\n\t\"getblockchaininforesult-pruned\":               \"A bool that indicates if the node is pruned or not\",\n\t\"getblockchaininforesult-pruneheight\":          \"The lowest block retained in the current pruned chain\",\n\t\"getblockchaininforesult-chainwork\":            \"The total cumulative work in the best chain\",\n\t\"getblockchaininforesult-size_on_disk\":         \"The estimated size of the block and undo files on disk\",\n\t\"getblockchaininforesult-initialblockdownload\": \"Estimate of whether this node is in Initial Block Download mode\",\n\t\"getblockchaininforesult-softforks\":            \"The status of the super-majority soft-forks\",\n\t\"getblockchaininforesult-unifiedsoftforks\":     \"The status of the super-majority soft-forks used by bitcoind on or after v0.19.0\",\n\n\t// SoftForkDescription help.\n\t\"softforkdescription-reject\":  \"The current activation status of the softfork\",\n\t\"softforkdescription-version\": \"The block version that signals enforcement of this softfork\",\n\t\"softforkdescription-id\":      \"The string identifier for the soft fork\",\n\t\"-status\":                     \"A bool which indicates if the soft fork is active\",\n\n\t// SoftForks help.\n\t\"softforks-softforks\":             \"The status of the super-majority soft-forks\",\n\t\"softforks-bip9_softforks\":        \"JSON object describing active BIP0009 deployments\",\n\t\"softforks-bip9_softforks--key\":   \"bip9_softforks\",\n\t\"softforks-bip9_softforks--value\": \"An object describing a particular BIP009 deployment\",\n\t\"softforks-bip9_softforks--desc\":  \"The status of any defined BIP0009 soft-fork deployments\",\n\n\t// UnifiedSoftForks help.\n\t\"unifiedsoftforks-softforks\":        \"The status of the super-majority soft-forks used by bitcoind on or after v0.19.0\",\n\t\"unifiedsoftforks-softforks--key\":   \"softforks\",\n\t\"unifiedsoftforks-softforks--value\": \"An object describing an active softfork deployment used by bitcoind on or after v0.19.0\",\n\t\"unifiedsoftforks-softforks--desc\":  \"JSON object describing an active softfork deployment used by bitcoind on or after v0.19.0\",\n\n\t// TxRawResult help.\n\t\"txrawresult-hex\":           \"Hex-encoded transaction\",\n\t\"txrawresult-txid\":          \"The hash of the transaction\",\n\t\"txrawresult-version\":       \"The transaction version\",\n\t\"txrawresult-locktime\":      \"The transaction lock time\",\n\t\"txrawresult-vin\":           \"The transaction inputs as JSON objects\",\n\t\"txrawresult-vout\":          \"The transaction outputs as JSON objects\",\n\t\"txrawresult-blockhash\":     \"Hash of the block the transaction is part of\",\n\t\"txrawresult-confirmations\": \"Number of confirmations of the block\",\n\t\"txrawresult-time\":          \"Transaction time in seconds since 1 Jan 1970 GMT\",\n\t\"txrawresult-blocktime\":     \"Block time in seconds since the 1 Jan 1970 GMT\",\n\t\"txrawresult-size\":          \"The size of the transaction in bytes\",\n\t\"txrawresult-vsize\":         \"The virtual size of the transaction in bytes\",\n\t\"txrawresult-weight\":        \"The transaction's weight (between vsize*4-3 and vsize*4)\",\n\t\"txrawresult-hash\":          \"The wtxid of the transaction\",\n\n\t// SearchRawTransactionsResult help.\n\t\"searchrawtransactionsresult-hex\":           \"Hex-encoded transaction\",\n\t\"searchrawtransactionsresult-txid\":          \"The hash of the transaction\",\n\t\"searchrawtransactionsresult-hash\":          \"The wxtid of the transaction\",\n\t\"searchrawtransactionsresult-version\":       \"The transaction version\",\n\t\"searchrawtransactionsresult-locktime\":      \"The transaction lock time\",\n\t\"searchrawtransactionsresult-vin\":           \"The transaction inputs as JSON objects\",\n\t\"searchrawtransactionsresult-vout\":          \"The transaction outputs as JSON objects\",\n\t\"searchrawtransactionsresult-blockhash\":     \"Hash of the block the transaction is part of\",\n\t\"searchrawtransactionsresult-confirmations\": \"Number of confirmations of the block\",\n\t\"searchrawtransactionsresult-time\":          \"Transaction time in seconds since 1 Jan 1970 GMT\",\n\t\"searchrawtransactionsresult-blocktime\":     \"Block time in seconds since the 1 Jan 1970 GMT\",\n\t\"searchrawtransactionsresult-size\":          \"The size of the transaction in bytes\",\n\t\"searchrawtransactionsresult-vsize\":         \"The virtual size of the transaction in bytes\",\n\t\"searchrawtransactionsresult-weight\":        \"The transaction's weight (between vsize*4-3 and vsize*4)\",\n\n\t// GetBlockVerboseResult help.\n\t\"getblockverboseresult-hash\":              \"The hash of the block (same as provided)\",\n\t\"getblockverboseresult-confirmations\":     \"The number of confirmations\",\n\t\"getblockverboseresult-size\":              \"The size of the block\",\n\t\"getblockverboseresult-height\":            \"The height of the block in the block chain\",\n\t\"getblockverboseresult-version\":           \"The block version\",\n\t\"getblockverboseresult-versionHex\":        \"The block version in hexadecimal\",\n\t\"getblockverboseresult-merkleroot\":        \"Root hash of the merkle tree\",\n\t\"getblockverboseresult-tx\":                \"The transaction hashes (only when verbosity=1)\",\n\t\"getblockverboseresult-rawtx\":             \"The transactions as JSON objects (only when verbosity=2)\",\n\t\"getblockverboseresult-time\":              \"The block time in seconds since 1 Jan 1970 GMT\",\n\t\"getblockverboseresult-nonce\":             \"The block nonce\",\n\t\"getblockverboseresult-bits\":              \"The bits which represent the block difficulty\",\n\t\"getblockverboseresult-difficulty\":        \"The proof-of-work difficulty as a multiple of the minimum difficulty\",\n\t\"getblockverboseresult-previousblockhash\": \"The hash of the previous block\",\n\t\"getblockverboseresult-nextblockhash\":     \"The hash of the next block (only if there is one)\",\n\t\"getblockverboseresult-strippedsize\":      \"The size of the block without witness data\",\n\t\"getblockverboseresult-weight\":            \"The weight of the block\",\n\n\t// GetBlockCountCmd help.\n\t\"getblockcount--synopsis\": \"Returns the number of blocks in the longest block chain.\",\n\t\"getblockcount--result0\":  \"The current block count\",\n\n\t// GetBlockHashCmd help.\n\t\"getblockhash--synopsis\": \"Returns hash of the block in best block chain at the given height.\",\n\t\"getblockhash-index\":     \"The block height\",\n\t\"getblockhash--result0\":  \"The block hash\",\n\n\t// GetBlockHeaderCmd help.\n\t\"getblockheader--synopsis\":   \"Returns information about a block header given its hash.\",\n\t\"getblockheader-hash\":        \"The hash of the block\",\n\t\"getblockheader-verbose\":     \"Specifies the block header is returned as a JSON object instead of hex-encoded string\",\n\t\"getblockheader--condition0\": \"verbose=false\",\n\t\"getblockheader--condition1\": \"verbose=true\",\n\t\"getblockheader--result0\":    \"The block header hash\",\n\n\t// GetBlockHeaderVerboseResult help.\n\t\"getblockheaderverboseresult-hash\":              \"The hash of the block (same as provided)\",\n\t\"getblockheaderverboseresult-confirmations\":     \"The number of confirmations\",\n\t\"getblockheaderverboseresult-height\":            \"The height of the block in the block chain\",\n\t\"getblockheaderverboseresult-version\":           \"The block version\",\n\t\"getblockheaderverboseresult-versionHex\":        \"The block version in hexadecimal\",\n\t\"getblockheaderverboseresult-merkleroot\":        \"Root hash of the merkle tree\",\n\t\"getblockheaderverboseresult-time\":              \"The block time in seconds since 1 Jan 1970 GMT\",\n\t\"getblockheaderverboseresult-nonce\":             \"The block nonce\",\n\t\"getblockheaderverboseresult-bits\":              \"The bits which represent the block difficulty\",\n\t\"getblockheaderverboseresult-difficulty\":        \"The proof-of-work difficulty as a multiple of the minimum difficulty\",\n\t\"getblockheaderverboseresult-previousblockhash\": \"The hash of the previous block\",\n\t\"getblockheaderverboseresult-nextblockhash\":     \"The hash of the next block (only if there is one)\",\n\n\t// TemplateRequest help.\n\t\"templaterequest-mode\":         \"This is 'template', 'proposal', or omitted\",\n\t\"templaterequest-capabilities\": \"List of capabilities\",\n\t\"templaterequest-longpollid\":   \"The long poll ID of a job to monitor for expiration; required and valid only for long poll requests \",\n\t\"templaterequest-sigoplimit\":   \"Number of signature operations allowed in blocks (this parameter is ignored)\",\n\t\"templaterequest-sizelimit\":    \"Number of bytes allowed in blocks (this parameter is ignored)\",\n\t\"templaterequest-maxversion\":   \"Highest supported block version number (this parameter is ignored)\",\n\t\"templaterequest-target\":       \"The desired target for the block template (this parameter is ignored)\",\n\t\"templaterequest-data\":         \"Hex-encoded block data (only for mode=proposal)\",\n\t\"templaterequest-workid\":       \"The server provided workid if provided in block template (not applicable)\",\n\t\"templaterequest-rules\":        \"Specific block rules that are to be enforced e.g. '[\\\"segwit\\\"]\",\n\n\t// GetBlockTemplateResultTx help.\n\t\"getblocktemplateresulttx-data\":    \"Hex-encoded transaction data (byte-for-byte)\",\n\t\"getblocktemplateresulttx-hash\":    \"Hex-encoded transaction hash (little endian if treated as a 256-bit number)\",\n\t\"getblocktemplateresulttx-depends\": \"Other transactions before this one (by 1-based index in the 'transactions'  list) that must be present in the final block if this one is\",\n\t\"getblocktemplateresulttx-fee\":     \"Difference in value between transaction inputs and outputs (in Satoshi)\",\n\t\"getblocktemplateresulttx-sigops\":  \"Total number of signature operations as counted for purposes of block limits\",\n\t\"getblocktemplateresulttx-txid\":    \"The transaction id, can be different from hash.\",\n\t\"getblocktemplateresulttx-weight\":  \"The weight of the transaction\",\n\n\t// GetBlockTemplateResultAux help.\n\t\"getblocktemplateresultaux-flags\": \"Hex-encoded byte-for-byte data to include in the coinbase signature script\",\n\n\t// GetBlockTemplateResult help.\n\t\"getblocktemplateresult-bits\":                       \"Hex-encoded compressed difficulty\",\n\t\"getblocktemplateresult-curtime\":                    \"Current time as seen by the server (recommended for block time); must fall within mintime/maxtime rules\",\n\t\"getblocktemplateresult-height\":                     \"Height of the block to be solved\",\n\t\"getblocktemplateresult-previousblockhash\":          \"Hex-encoded big-endian hash of the previous block\",\n\t\"getblocktemplateresult-sigoplimit\":                 \"Number of sigops allowed in blocks \",\n\t\"getblocktemplateresult-sizelimit\":                  \"Number of bytes allowed in blocks\",\n\t\"getblocktemplateresult-transactions\":               \"Array of transactions as JSON objects\",\n\t\"getblocktemplateresult-version\":                    \"The block version\",\n\t\"getblocktemplateresult-coinbaseaux\":                \"Data that should be included in the coinbase signature script\",\n\t\"getblocktemplateresult-coinbasetxn\":                \"Information about the coinbase transaction\",\n\t\"getblocktemplateresult-coinbasevalue\":              \"Total amount available for the coinbase in Satoshi\",\n\t\"getblocktemplateresult-workid\":                     \"This value must be returned with result if provided (not provided)\",\n\t\"getblocktemplateresult-longpollid\":                 \"Identifier for long poll request which allows monitoring for expiration\",\n\t\"getblocktemplateresult-longpolluri\":                \"An alternate URI to use for long poll requests if provided (not provided)\",\n\t\"getblocktemplateresult-submitold\":                  \"Not applicable\",\n\t\"getblocktemplateresult-target\":                     \"Hex-encoded big-endian number which valid results must be less than\",\n\t\"getblocktemplateresult-expires\":                    \"Maximum number of seconds (starting from when the server sent the response) this work is valid for\",\n\t\"getblocktemplateresult-maxtime\":                    \"Maximum allowed time\",\n\t\"getblocktemplateresult-mintime\":                    \"Minimum allowed time\",\n\t\"getblocktemplateresult-mutable\":                    \"List of mutations the server explicitly allows\",\n\t\"getblocktemplateresult-noncerange\":                 \"Two concatenated hex-encoded big-endian 32-bit integers which represent the valid ranges of nonces the miner may scan\",\n\t\"getblocktemplateresult-capabilities\":               \"List of server capabilities including 'proposal' to indicate support for block proposals\",\n\t\"getblocktemplateresult-reject-reason\":              \"Reason the proposal was invalid as-is (only applies to proposal responses)\",\n\t\"getblocktemplateresult-default_witness_commitment\": \"The witness commitment itself. Will be populated if the block has witness data\",\n\t\"getblocktemplateresult-weightlimit\":                \"The current limit on the max allowed weight of a block\",\n\n\t// GetBlockTemplateCmd help.\n\t\"getblocktemplate--synopsis\": \"Returns a JSON object with information necessary to construct a block to mine or accepts a proposal to validate.\\n\" +\n\t\t\"See BIP0022 and BIP0023 for the full specification.\",\n\t\"getblocktemplate-request\":     \"Request object which controls the mode and several parameters\",\n\t\"getblocktemplate--condition0\": \"mode=template\",\n\t\"getblocktemplate--condition1\": \"mode=proposal, rejected\",\n\t\"getblocktemplate--condition2\": \"mode=proposal, accepted\",\n\t\"getblocktemplate--result1\":    \"An error string which represents why the proposal was rejected or nothing if accepted\",\n\n\t// GetChainTipsResult help.\n\t\"getchaintipsresult-chaintips\": \"The chaintips that this node is aware of\",\n\t\"getchaintipsresult-height\":    \"The height of the chain tip\",\n\t\"getchaintipsresult-hash\":      \"The block hash of the chain tip\",\n\t\"getchaintipsresult-branchlen\": \"Returns zero for main chain. Otherwise is the length of branch connecting the tip to the main chain\",\n\t\"getchaintipsresult-status\":    \"Status of the chain. Returns \\\"active\\\" for the main chain\",\n\t// GetChainTipsCmd help.\n\t\"getchaintips--synopsis\": \"Returns information about all known tips in the block tree, including the main chain as well as orphaned branches.\",\n\n\t// GetCFilterCmd help.\n\t\"getcfilter--synopsis\":  \"Returns a block's committed filter given its hash.\",\n\t\"getcfilter-filtertype\": \"The type of filter to return (0=regular)\",\n\t\"getcfilter-hash\":       \"The hash of the block\",\n\t\"getcfilter--result0\":   \"The block's committed filter\",\n\n\t// GetCFilterHeaderCmd help.\n\t\"getcfilterheader--synopsis\":  \"Returns a block's compact filter header given its hash.\",\n\t\"getcfilterheader-filtertype\": \"The type of filter header to return (0=regular)\",\n\t\"getcfilterheader-hash\":       \"The hash of the block\",\n\t\"getcfilterheader--result0\":   \"The block's gcs filter header\",\n\n\t// GetConnectionCountCmd help.\n\t\"getconnectioncount--synopsis\": \"Returns the number of active connections to other peers.\",\n\t\"getconnectioncount--result0\":  \"The number of connections\",\n\n\t// GetCurrentNetCmd help.\n\t\"getcurrentnet--synopsis\": \"Get bitcoin network the server is running on.\",\n\t\"getcurrentnet--result0\":  \"The network identifier\",\n\n\t// GetDifficultyCmd help.\n\t\"getdifficulty--synopsis\": \"Returns the proof-of-work difficulty as a multiple of the minimum difficulty.\",\n\t\"getdifficulty--result0\":  \"The difficulty\",\n\n\t// GetGenerateCmd help.\n\t\"getgenerate--synopsis\": \"Returns if the server is set to generate coins (mine) or not.\",\n\t\"getgenerate--result0\":  \"True if mining, false if not\",\n\n\t// GetHashesPerSecCmd help.\n\t\"gethashespersec--synopsis\": \"Returns a recent hashes per second performance measurement while generating coins (mining).\",\n\t\"gethashespersec--result0\":  \"The number of hashes per second\",\n\n\t// InfoChainResult help.\n\t\"infochainresult-version\":         \"The version of the server\",\n\t\"infochainresult-protocolversion\": \"The latest supported protocol version\",\n\t\"infochainresult-blocks\":          \"The number of blocks processed\",\n\t\"infochainresult-timeoffset\":      \"The time offset\",\n\t\"infochainresult-connections\":     \"The number of connected peers\",\n\t\"infochainresult-proxy\":           \"The proxy used by the server\",\n\t\"infochainresult-difficulty\":      \"The current target difficulty\",\n\t\"infochainresult-testnet\":         \"Whether or not server is using testnet\",\n\t\"infochainresult-relayfee\":        \"The minimum relay fee for non-free transactions in BTC/KB\",\n\t\"infochainresult-errors\":          \"Any current errors\",\n\n\t// InfoWalletResult help.\n\t\"infowalletresult-version\":         \"The version of the server\",\n\t\"infowalletresult-protocolversion\": \"The latest supported protocol version\",\n\t\"infowalletresult-walletversion\":   \"The version of the wallet server\",\n\t\"infowalletresult-balance\":         \"The total bitcoin balance of the wallet\",\n\t\"infowalletresult-blocks\":          \"The number of blocks processed\",\n\t\"infowalletresult-timeoffset\":      \"The time offset\",\n\t\"infowalletresult-connections\":     \"The number of connected peers\",\n\t\"infowalletresult-proxy\":           \"The proxy used by the server\",\n\t\"infowalletresult-difficulty\":      \"The current target difficulty\",\n\t\"infowalletresult-testnet\":         \"Whether or not server is using testnet\",\n\t\"infowalletresult-keypoololdest\":   \"Seconds since 1 Jan 1970 GMT of the oldest pre-generated key in the key pool\",\n\t\"infowalletresult-keypoolsize\":     \"The number of new keys that are pre-generated\",\n\t\"infowalletresult-unlocked_until\":  \"The timestamp in seconds since 1 Jan 1970 GMT that the wallet is unlocked for transfers, or 0 if the wallet is locked\",\n\t\"infowalletresult-paytxfee\":        \"The transaction fee set in BTC/KB\",\n\t\"infowalletresult-relayfee\":        \"The minimum relay fee for non-free transactions in BTC/KB\",\n\t\"infowalletresult-errors\":          \"Any current errors\",\n\n\t// GetHeadersCmd help.\n\t\"getheaders--synopsis\":     \"Returns block headers starting with the first known block hash from the request\",\n\t\"getheaders-blocklocators\": \"JSON array of hex-encoded hashes of blocks.  Headers are returned starting from the first known hash in this list\",\n\t\"getheaders-hashstop\":      \"Block hash to stop including block headers for; if not found, all headers to the latest known block are returned.\",\n\t\"getheaders--result0\":      \"Serialized block headers of all located blocks, limited to some arbitrary maximum number of hashes (currently 2000, which matches the wire protocol headers message, but this is not guaranteed)\",\n\n\t// GetInfoCmd help.\n\t\"getinfo--synopsis\": \"Returns a JSON object containing various state info.\",\n\n\t// GetMempoolInfoCmd help.\n\t\"getmempoolinfo--synopsis\": \"Returns memory pool information\",\n\n\t// GetMempoolInfoResult help.\n\t\"getmempoolinforesult-bytes\": \"Size in bytes of the mempool\",\n\t\"getmempoolinforesult-size\":  \"Number of transactions in the mempool\",\n\n\t// GetMiningInfoResult help.\n\t\"getmininginforesult-blocks\":             \"Height of the latest best block\",\n\t\"getmininginforesult-currentblocksize\":   \"Size of the latest best block\",\n\t\"getmininginforesult-currentblockweight\": \"Weight of the latest best block\",\n\t\"getmininginforesult-currentblocktx\":     \"Number of transactions in the latest best block\",\n\t\"getmininginforesult-difficulty\":         \"Current target difficulty\",\n\t\"getmininginforesult-errors\":             \"Any current errors\",\n\t\"getmininginforesult-generate\":           \"Whether or not server is set to generate coins\",\n\t\"getmininginforesult-genproclimit\":       \"Number of processors to use for coin generation (-1 when disabled)\",\n\t\"getmininginforesult-hashespersec\":       \"Recent hashes per second performance measurement while generating coins\",\n\t\"getmininginforesult-networkhashps\":      \"Estimated network hashes per second for the most recent blocks\",\n\t\"getmininginforesult-pooledtx\":           \"Number of transactions in the memory pool\",\n\t\"getmininginforesult-testnet\":            \"Whether or not server is using testnet\",\n\n\t// GetMiningInfoCmd help.\n\t\"getmininginfo--synopsis\": \"Returns a JSON object containing mining-related information.\",\n\n\t// GetNetworkHashPSCmd help.\n\t\"getnetworkhashps--synopsis\": \"Returns the estimated network hashes per second for the block heights provided by the parameters.\",\n\t\"getnetworkhashps-blocks\":    \"The number of blocks, or -1 for blocks since last difficulty change\",\n\t\"getnetworkhashps-height\":    \"Perform estimate ending with this height or -1 for current best chain block height\",\n\t\"getnetworkhashps--result0\":  \"Estimated hashes per second\",\n\n\t// GetNetTotalsCmd help.\n\t\"getnettotals--synopsis\": \"Returns a JSON object containing network traffic statistics.\",\n\n\t// GetNetTotalsResult help.\n\t\"getnettotalsresult-totalbytesrecv\": \"Total bytes received\",\n\t\"getnettotalsresult-totalbytessent\": \"Total bytes sent\",\n\t\"getnettotalsresult-timemillis\":     \"Number of milliseconds since 1 Jan 1970 GMT\",\n\n\t// GetNodeAddressesResult help.\n\t\"getnodeaddressesresult-time\":     \"Timestamp in seconds since epoch (Jan 1 1970 GMT) keeping track of when the node was last seen\",\n\t\"getnodeaddressesresult-services\": \"The services offered\",\n\t\"getnodeaddressesresult-address\":  \"The address of the node\",\n\t\"getnodeaddressesresult-port\":     \"The port of the node\",\n\n\t// GetNodeAddressesCmd help.\n\t\"getnodeaddresses--synopsis\": \"Return known addresses which can potentially be used to find new nodes in the network\",\n\t\"getnodeaddresses-count\":     \"How many addresses to return. Limited to the smaller of 2500 or 23% of all known addresses\",\n\t\"getnodeaddresses--result0\":  \"List of node addresses\",\n\n\t// GetPeerInfoResult help.\n\t\"getpeerinforesult-id\":             \"A unique node ID\",\n\t\"getpeerinforesult-addr\":           \"The ip address and port of the peer\",\n\t\"getpeerinforesult-addrlocal\":      \"Local address\",\n\t\"getpeerinforesult-services\":       \"Services bitmask which represents the services supported by the peer\",\n\t\"getpeerinforesult-relaytxes\":      \"Peer has requested transactions be relayed to it\",\n\t\"getpeerinforesult-lastsend\":       \"Time the last message was received in seconds since 1 Jan 1970 GMT\",\n\t\"getpeerinforesult-lastrecv\":       \"Time the last message was sent in seconds since 1 Jan 1970 GMT\",\n\t\"getpeerinforesult-bytessent\":      \"Total bytes sent\",\n\t\"getpeerinforesult-bytesrecv\":      \"Total bytes received\",\n\t\"getpeerinforesult-conntime\":       \"Time the connection was made in seconds since 1 Jan 1970 GMT\",\n\t\"getpeerinforesult-timeoffset\":     \"The time offset of the peer\",\n\t\"getpeerinforesult-pingtime\":       \"Number of microseconds the last ping took\",\n\t\"getpeerinforesult-pingwait\":       \"Number of microseconds a queued ping has been waiting for a response\",\n\t\"getpeerinforesult-version\":        \"The protocol version of the peer\",\n\t\"getpeerinforesult-subver\":         \"The user agent of the peer\",\n\t\"getpeerinforesult-inbound\":        \"Whether or not the peer is an inbound connection\",\n\t\"getpeerinforesult-startingheight\": \"The latest block height the peer knew about when the connection was established\",\n\t\"getpeerinforesult-currentheight\":  \"The current height of the peer\",\n\t\"getpeerinforesult-banscore\":       \"The ban score\",\n\t\"getpeerinforesult-feefilter\":      \"The requested minimum fee a transaction must have to be announced to the peer\",\n\t\"getpeerinforesult-syncnode\":       \"Whether or not the peer is the sync peer\",\n\t\"getpeerinforesult-v2_connection\":  \"Whether or not the peer is a v2 connection\",\n\n\t// GetPeerInfoCmd help.\n\t\"getpeerinfo--synopsis\": \"Returns data about each connected network peer as an array of json objects.\",\n\n\t// GetRawMempoolVerboseResult help.\n\t\"getrawmempoolverboseresult-size\":             \"Transaction size in bytes\",\n\t\"getrawmempoolverboseresult-fee\":              \"Transaction fee in bitcoins\",\n\t\"getrawmempoolverboseresult-time\":             \"Local time transaction entered pool in seconds since 1 Jan 1970 GMT\",\n\t\"getrawmempoolverboseresult-height\":           \"Block height when transaction entered the pool\",\n\t\"getrawmempoolverboseresult-startingpriority\": \"Priority when transaction entered the pool\",\n\t\"getrawmempoolverboseresult-currentpriority\":  \"Current priority\",\n\t\"getrawmempoolverboseresult-depends\":          \"Unconfirmed transactions used as inputs for this transaction\",\n\t\"getrawmempoolverboseresult-vsize\":            \"The virtual size of a transaction\",\n\t\"getrawmempoolverboseresult-weight\":           \"The transaction's weight (between vsize*4-3 and vsize*4)\",\n\n\t// GetRawMempoolCmd help.\n\t\"getrawmempool--synopsis\":   \"Returns information about all of the transactions currently in the memory pool.\",\n\t\"getrawmempool-verbose\":     \"Returns JSON object when true or an array of transaction hashes when false\",\n\t\"getrawmempool--condition0\": \"verbose=false\",\n\t\"getrawmempool--condition1\": \"verbose=true\",\n\t\"getrawmempool--result0\":    \"Array of transaction hashes\",\n\n\t// GetRawTransactionCmd help.\n\t\"getrawtransaction--synopsis\":   \"Returns information about a transaction given its hash.\",\n\t\"getrawtransaction-txid\":        \"The hash of the transaction\",\n\t\"getrawtransaction-verbose\":     \"Specifies the transaction is returned as a JSON object instead of a hex-encoded string\",\n\t\"getrawtransaction--condition0\": \"verbose=false\",\n\t\"getrawtransaction--condition1\": \"verbose=true\",\n\t\"getrawtransaction--result0\":    \"Hex-encoded bytes of the serialized transaction\",\n\n\t// GetTxOutResult help.\n\t\"gettxoutresult-bestblock\":     \"The block hash that contains the transaction output\",\n\t\"gettxoutresult-confirmations\": \"The number of confirmations\",\n\t\"gettxoutresult-value\":         \"The transaction amount in BTC\",\n\t\"gettxoutresult-scriptPubKey\":  \"The public key script used to pay coins as a JSON object\",\n\t\"gettxoutresult-version\":       \"The transaction version\",\n\t\"gettxoutresult-coinbase\":      \"Whether or not the transaction is a coinbase\",\n\n\t// GetTxOutCmd help.\n\t\"gettxout--synopsis\":      \"Returns information about an unspent transaction output.\",\n\t\"gettxout-txid\":           \"The hash of the transaction\",\n\t\"gettxout-vout\":           \"The index of the output\",\n\t\"gettxout-includemempool\": \"Include the mempool when true\",\n\n\t// InvalidateBlockCmd help.\n\t\"invalidateblock--synopsis\": \"Invalidates the block of the given block hash. To re-validate the invalidated block, use the reconsiderblock rpc\",\n\t\"invalidateblock-blockhash\": \"The block hash of the block to invalidate\",\n\n\t// HelpCmd help.\n\t\"help--synopsis\":   \"Returns a list of all commands or help for a specified command.\",\n\t\"help-command\":     \"The command to retrieve help for\",\n\t\"help--condition0\": \"no command provided\",\n\t\"help--condition1\": \"command specified\",\n\t\"help--result0\":    \"List of commands\",\n\t\"help--result1\":    \"Help for specified command\",\n\n\t// PingCmd help.\n\t\"ping--synopsis\": \"Queues a ping to be sent to each connected peer.\\n\" +\n\t\t\"Ping times are provided by getpeerinfo via the pingtime and pingwait fields.\",\n\n\t// SearchRawTransactionsCmd help.\n\t\"searchrawtransactions--synopsis\": \"Returns raw data for transactions involving the passed address.\\n\" +\n\t\t\"Returned transactions are pulled from both the database, and transactions currently in the mempool.\\n\" +\n\t\t\"Transactions pulled from the mempool will have the 'confirmations' field set to 0.\\n\" +\n\t\t\"Usage of this RPC requires the optional --addrindex flag to be activated, otherwise all responses will simply return with an error stating the address index has not yet been built.\\n\" +\n\t\t\"Similarly, until the address index has caught up with the current best height, all requests will return an error response in order to avoid serving stale data.\",\n\t\"searchrawtransactions-address\":     \"The Bitcoin address to search for\",\n\t\"searchrawtransactions-verbose\":     \"Specifies the transaction is returned as a JSON object instead of hex-encoded string\",\n\t\"searchrawtransactions--condition0\": \"verbose=0\",\n\t\"searchrawtransactions--condition1\": \"verbose=1\",\n\t\"searchrawtransactions-skip\":        \"The number of leading transactions to leave out of the final response\",\n\t\"searchrawtransactions-count\":       \"The maximum number of transactions to return\",\n\t\"searchrawtransactions-vinextra\":    \"Specify that extra data from previous output will be returned in vin\",\n\t\"searchrawtransactions-reverse\":     \"Specifies that the transactions should be returned in reverse chronological order\",\n\t\"searchrawtransactions-filteraddrs\": \"Address list.  Only inputs or outputs with matching address will be returned\",\n\t\"searchrawtransactions--result0\":    \"Hex-encoded serialized transaction\",\n\n\t// SendRawTransactionCmd help.\n\t\"sendrawtransaction--synopsis\":    \"Submits the serialized, hex-encoded transaction to the local peer and relays it to the network.\",\n\t\"sendrawtransaction-hextx\":        \"Serialized, hex-encoded signed transaction\",\n\t\"sendrawtransaction-feesetting\":   \"Whether or not to allow insanely high fees in bitcoind < v0.19.0 or the max fee rate for bitcoind v0.19.0 and later (btcd does not yet implement this parameter, so it has no effect)\",\n\t\"sendrawtransaction--result0\":     \"The hash of the transaction\",\n\t\"allowhighfeesormaxfeerate-value\": \"Either the boolean value for the allowhighfees parameter in bitcoind < v0.19.0 or the numerical value for the maxfeerate field in bitcoind v0.19.0 and later\",\n\n\t// SetGenerateCmd help.\n\t\"setgenerate--synopsis\":    \"Set the server to generate coins (mine) or not.\",\n\t\"setgenerate-generate\":     \"Use true to enable generation, false to disable it\",\n\t\"setgenerate-genproclimit\": \"The number of processors (cores) to limit generation to or -1 for default\",\n\n\t// SignMessageWithPrivKeyCmd help.\n\t\"signmessagewithprivkey--synopsis\": \"Sign a message with the private key of an address\",\n\t\"signmessagewithprivkey-privkey\":   \"The private key to sign the message with\",\n\t\"signmessagewithprivkey-message\":   \"The message to create a signature of\",\n\t\"signmessagewithprivkey--result0\":  \"The signature of the message encoded in base 64\",\n\n\t// StopCmd help.\n\t\"stop--synopsis\": \"Shutdown btcd.\",\n\t\"stop--result0\":  \"The string 'btcd stopping.'\",\n\n\t// SubmitBlockOptions help.\n\t\"submitblockoptions-workid\": \"This parameter is currently ignored\",\n\n\t// SubmitBlockCmd help.\n\t\"submitblock--synopsis\":   \"Attempts to submit a new serialized, hex-encoded block to the network.\",\n\t\"submitblock-hexblock\":    \"Serialized, hex-encoded block\",\n\t\"submitblock-options\":     \"This parameter is currently ignored\",\n\t\"submitblock--condition0\": \"Block successfully submitted\",\n\t\"submitblock--condition1\": \"Block rejected\",\n\t\"submitblock--result1\":    \"The reason the block was rejected\",\n\n\t// ValidateAddressResult help.\n\t\"validateaddresschainresult-isvalid\":         \"Whether or not the address is valid\",\n\t\"validateaddresschainresult-address\":         \"The bitcoin address (only when isvalid is true)\",\n\t\"validateaddresschainresult-isscript\":        \"If the key is a script\",\n\t\"validateaddresschainresult-iswitness\":       \"If the address is a witness address\",\n\t\"validateaddresschainresult-witness_version\": \"The version number of the witness program\",\n\t\"validateaddresschainresult-witness_program\": \"The hex value of the witness program\",\n\n\t// ValidateAddressCmd help.\n\t\"validateaddress--synopsis\": \"Verify an address is valid.\",\n\t\"validateaddress-address\":   \"Bitcoin address to validate\",\n\n\t// VerifyChainCmd help.\n\t\"verifychain--synopsis\": \"Verifies the block chain database.\\n\" +\n\t\t\"The actual checks performed by the checklevel parameter are implementation specific.\\n\" +\n\t\t\"For btcd this is:\\n\" +\n\t\t\"checklevel=0 - Look up each block and ensure it can be loaded from the database.\\n\" +\n\t\t\"checklevel=1 - Perform basic context-free sanity checks on each block.\",\n\t\"verifychain-checklevel\": \"How thorough the block verification is\",\n\t\"verifychain-checkdepth\": \"The number of blocks to check\",\n\t\"verifychain--result0\":   \"Whether or not the chain verified\",\n\n\t// VerifyMessageCmd help.\n\t\"verifymessage--synopsis\": \"Verify a signed message.\",\n\t\"verifymessage-address\":   \"The bitcoin address to use for the signature\",\n\t\"verifymessage-signature\": \"The base-64 encoded signature provided by the signer\",\n\t\"verifymessage-message\":   \"The signed message\",\n\t\"verifymessage--result0\":  \"Whether or not the signature verified\",\n\n\t// -------- Websocket-specific help --------\n\n\t// Session help.\n\t\"session--synopsis\":       \"Return details regarding a websocket client's current connection session.\",\n\t\"sessionresult-sessionid\": \"The unique session ID for a client's websocket connection.\",\n\n\t// NotifyBlocksCmd help.\n\t\"notifyblocks--synopsis\": \"Request notifications for whenever a block is connected or disconnected from the main (best) chain.\",\n\n\t// StopNotifyBlocksCmd help.\n\t\"stopnotifyblocks--synopsis\": \"Cancel registered notifications for whenever a block is connected or disconnected from the main (best) chain.\",\n\n\t// NotifyNewTransactionsCmd help.\n\t\"notifynewtransactions--synopsis\": \"Send either a txaccepted or a txacceptedverbose notification when a new transaction is accepted into the mempool.\",\n\t\"notifynewtransactions-verbose\":   \"Specifies which type of notification to receive. If verbose is true, then the caller receives txacceptedverbose, otherwise the caller receives txaccepted\",\n\n\t// StopNotifyNewTransactionsCmd help.\n\t\"stopnotifynewtransactions--synopsis\": \"Stop sending either a txaccepted or a txacceptedverbose notification when a new transaction is accepted into the mempool.\",\n\n\t// NotifyReceivedCmd help.\n\t\"notifyreceived--synopsis\": \"Send a recvtx notification when a transaction added to mempool or appears in a newly-attached block contains a txout pkScript sending to any of the passed addresses.\\n\" +\n\t\t\"Matching outpoints are automatically registered for redeemingtx notifications.\",\n\t\"notifyreceived-addresses\": \"List of address to receive notifications about\",\n\n\t// StopNotifyReceivedCmd help.\n\t\"stopnotifyreceived--synopsis\": \"Cancel registered receive notifications for each passed address.\",\n\t\"stopnotifyreceived-addresses\": \"List of address to cancel receive notifications for\",\n\n\t// OutPoint help.\n\t\"outpoint-hash\":  \"The hex-encoded bytes of the outpoint hash\",\n\t\"outpoint-index\": \"The index of the outpoint\",\n\n\t// NotifySpentCmd help.\n\t\"notifyspent--synopsis\": \"Send a redeemingtx notification when a transaction spending an outpoint appears in mempool (if relayed to this btcd instance) and when such a transaction first appears in a newly-attached block.\",\n\t\"notifyspent-outpoints\": \"List of transaction outpoints to monitor.\",\n\n\t// StopNotifySpentCmd help.\n\t\"stopnotifyspent--synopsis\": \"Cancel registered spending notifications for each passed outpoint.\",\n\t\"stopnotifyspent-outpoints\": \"List of transaction outpoints to stop monitoring.\",\n\n\t// LoadTxFilterCmd help.\n\t\"loadtxfilter--synopsis\": \"Load, add to, or reload a websocket client's transaction filter for mempool transactions, new blocks and rescanblocks.\",\n\t\"loadtxfilter-reload\":    \"Load a new filter instead of adding data to an existing one\",\n\t\"loadtxfilter-addresses\": \"Array of addresses to add to the transaction filter\",\n\t\"loadtxfilter-outpoints\": \"Array of outpoints to add to the transaction filter\",\n\n\t// ReconsiderBlockCmd help.\n\t\"reconsiderblock--synopsis\": \"Reconsiders the block of the given block hash. Can be used to re-validate blocks invalidated with invalidateblock\",\n\t\"reconsiderblock-blockhash\": \"The block hash of the block to reconsider\",\n\n\t// Rescan help.\n\t\"rescan--synopsis\": \"Rescan block chain for transactions to addresses.\\n\" +\n\t\t\"When the endblock parameter is omitted, the rescan continues through the best block in the main chain.\\n\" +\n\t\t\"Rescan results are sent as recvtx and redeemingtx notifications.\\n\" +\n\t\t\"This call returns once the rescan completes.\",\n\t\"rescan-beginblock\": \"Hash of the first block to begin rescanning\",\n\t\"rescan-addresses\":  \"List of addresses to include in the rescan\",\n\t\"rescan-outpoints\":  \"List of transaction outpoints to include in the rescan\",\n\t\"rescan-endblock\":   \"Hash of final block to rescan\",\n\n\t// RescanBlocks help.\n\t\"rescanblocks--synopsis\":   \"Rescan blocks for transactions matching the loaded transaction filter.\",\n\t\"rescanblocks-blockhashes\": \"List of hashes to rescan.  Each next block must be a child of the previous.\",\n\t\"rescanblocks--result0\":    \"List of matching blocks.\",\n\n\t// RescannedBlock help.\n\t\"rescannedblock-hash\":         \"Hash of the matching block.\",\n\t\"rescannedblock-transactions\": \"List of matching transactions, serialized and hex-encoded.\",\n\n\t// Uptime help.\n\t\"uptime--synopsis\": \"Returns the total uptime of the server.\",\n\t\"uptime--result0\":  \"The number of seconds that the server has been running\",\n\n\t// Version help.\n\t\"version--synopsis\":       \"Returns the JSON-RPC API version (semver)\",\n\t\"version--result0--desc\":  \"Version objects keyed by the program or API name\",\n\t\"version--result0--key\":   \"Program or API name\",\n\t\"version--result0--value\": \"Object containing the semantic version\",\n\n\t// VersionResult help.\n\t\"versionresult-versionstring\": \"The JSON-RPC API version (semver)\",\n\t\"versionresult-major\":         \"The major component of the JSON-RPC API version\",\n\t\"versionresult-minor\":         \"The minor component of the JSON-RPC API version\",\n\t\"versionresult-patch\":         \"The patch component of the JSON-RPC API version\",\n\t\"versionresult-prerelease\":    \"Prerelease info about the current build\",\n\t\"versionresult-buildmetadata\": \"Metadata about the current build\",\n\n\t// TestMempoolAcceptCmd help.\n\t\"testmempoolaccept--synopsis\":  \"Returns result of mempool acceptance tests indicating if raw transaction(s) would be accepted by mempool.\",\n\t\"testmempoolaccept-rawtxns\":    \"Serialized transactions to test.\",\n\t\"testmempoolaccept-maxfeerate\": \"Maximum acceptable fee rate in BTC/kB\",\n\n\t// TestMempoolAcceptCmd result help.\n\t\"testmempoolacceptresult-txid\":             \"The transaction hash in hex.\",\n\t\"testmempoolacceptresult-wtxid\":            \"The transaction witness hash in hex.\",\n\t\"testmempoolacceptresult-package-error\":    \"Package validation error, if any (only possible if rawtxs had more than 1 transaction).\",\n\t\"testmempoolacceptresult-allowed\":          \"Whether the transaction would be accepted to the mempool.\",\n\t\"testmempoolacceptresult-vsize\":            \"Virtual transaction size as defined in BIP 141.(only present when 'allowed' is true)\",\n\t\"testmempoolacceptresult-reject-reason\":    \"Rejection string (only present when 'allowed' is false).\",\n\t\"testmempoolacceptresult-fees\":             \"Transaction fees (only present if 'allowed' is true).\",\n\t\"testmempoolacceptfees-base\":               \"Transaction fees (only present if 'allowed' is true).\",\n\t\"testmempoolacceptfees-effective-feerate\":  \"The effective feerate in BTC per KvB.\",\n\t\"testmempoolacceptfees-effective-includes\": \"Transactions whose fees and vsizes are included in effective-feerate. Each item is a transaction wtxid in hex.\",\n\n\t// GetTxSpendingPrevOutCmd help.\n\t\"gettxspendingprevout--synopsis\": \"Scans the mempool to find transactions spending any of the given outputs\",\n\t\"gettxspendingprevout-outputs\":   \"The transaction outputs that we want to check, and within each, the txid (string) vout (numeric).\",\n\t\"gettxspendingprevout-txid\":      \"The transaction id\",\n\t\"gettxspendingprevout-vout\":      \"The output number\",\n\n\t// GetTxSpendingPrevOutCmd result help.\n\t\"gettxspendingprevoutresult-txid\":         \"The transaction hash in hex.\",\n\t\"gettxspendingprevoutresult-vout\":         \"The output index.\",\n\t\"gettxspendingprevoutresult-spendingtxid\": \"The hash of the transaction that spends the output.\",\n}\n\n// rpcResultTypes specifies the result types that each RPC command can return.\n// This information is used to generate the help.  Each result type must be a\n// pointer to the type (or nil to indicate no return value).\nvar rpcResultTypes = map[string][]interface{}{\n\t\"addnode\":                nil,\n\t\"createrawtransaction\":   {(*string)(nil)},\n\t\"debuglevel\":             {(*string)(nil), (*string)(nil)},\n\t\"decoderawtransaction\":   {(*btcjson.TxRawDecodeResult)(nil)},\n\t\"decodescript\":           {(*btcjson.DecodeScriptResult)(nil)},\n\t\"estimatefee\":            {(*float64)(nil)},\n\t\"generate\":               {(*[]string)(nil)},\n\t\"getaddednodeinfo\":       {(*[]string)(nil), (*[]btcjson.GetAddedNodeInfoResult)(nil)},\n\t\"getbestblock\":           {(*btcjson.GetBestBlockResult)(nil)},\n\t\"getbestblockhash\":       {(*string)(nil)},\n\t\"getblock\":               {(*string)(nil), (*btcjson.GetBlockVerboseResult)(nil)},\n\t\"getblockcount\":          {(*int64)(nil)},\n\t\"getblockhash\":           {(*string)(nil)},\n\t\"getblockheader\":         {(*string)(nil), (*btcjson.GetBlockHeaderVerboseResult)(nil)},\n\t\"getblocktemplate\":       {(*btcjson.GetBlockTemplateResult)(nil), (*string)(nil), nil},\n\t\"getblockchaininfo\":      {(*btcjson.GetBlockChainInfoResult)(nil)},\n\t\"getchaintips\":           {(*[]btcjson.GetChainTipsResult)(nil)},\n\t\"getcfilter\":             {(*string)(nil)},\n\t\"getcfilterheader\":       {(*string)(nil)},\n\t\"getconnectioncount\":     {(*int32)(nil)},\n\t\"getcurrentnet\":          {(*uint32)(nil)},\n\t\"getdifficulty\":          {(*float64)(nil)},\n\t\"getgenerate\":            {(*bool)(nil)},\n\t\"gethashespersec\":        {(*float64)(nil)},\n\t\"getheaders\":             {(*[]string)(nil)},\n\t\"getinfo\":                {(*btcjson.InfoChainResult)(nil)},\n\t\"getmempoolinfo\":         {(*btcjson.GetMempoolInfoResult)(nil)},\n\t\"getmininginfo\":          {(*btcjson.GetMiningInfoResult)(nil)},\n\t\"getnettotals\":           {(*btcjson.GetNetTotalsResult)(nil)},\n\t\"getnetworkhashps\":       {(*float64)(nil)},\n\t\"getnodeaddresses\":       {(*[]btcjson.GetNodeAddressesResult)(nil)},\n\t\"getpeerinfo\":            {(*[]btcjson.GetPeerInfoResult)(nil)},\n\t\"getrawmempool\":          {(*[]string)(nil), (*btcjson.GetRawMempoolVerboseResult)(nil)},\n\t\"getrawtransaction\":      {(*string)(nil), (*btcjson.TxRawResult)(nil)},\n\t\"gettxout\":               {(*btcjson.GetTxOutResult)(nil)},\n\t\"node\":                   nil,\n\t\"help\":                   {(*string)(nil), (*string)(nil)},\n\t\"invalidateblock\":        nil,\n\t\"ping\":                   nil,\n\t\"reconsiderblock\":        nil,\n\t\"searchrawtransactions\":  {(*string)(nil), (*[]btcjson.SearchRawTransactionsResult)(nil)},\n\t\"sendrawtransaction\":     {(*string)(nil)},\n\t\"setgenerate\":            nil,\n\t\"signmessagewithprivkey\": {(*string)(nil)},\n\t\"stop\":                   {(*string)(nil)},\n\t\"submitblock\":            {nil, (*string)(nil)},\n\t\"uptime\":                 {(*int64)(nil)},\n\t\"validateaddress\":        {(*btcjson.ValidateAddressChainResult)(nil)},\n\t\"verifychain\":            {(*bool)(nil)},\n\t\"verifymessage\":          {(*bool)(nil)},\n\t\"version\":                {(*map[string]btcjson.VersionResult)(nil)},\n\t\"testmempoolaccept\":      {(*[]btcjson.TestMempoolAcceptResult)(nil)},\n\t\"gettxspendingprevout\":   {(*[]btcjson.GetTxSpendingPrevOutResult)(nil)},\n\n\t// Websocket commands.\n\t\"loadtxfilter\":              nil,\n\t\"session\":                   {(*btcjson.SessionResult)(nil)},\n\t\"notifyblocks\":              nil,\n\t\"stopnotifyblocks\":          nil,\n\t\"notifynewtransactions\":     nil,\n\t\"stopnotifynewtransactions\": nil,\n\t\"notifyreceived\":            nil,\n\t\"stopnotifyreceived\":        nil,\n\t\"notifyspent\":               nil,\n\t\"stopnotifyspent\":           nil,\n\t\"rescan\":                    nil,\n\t\"rescanblocks\":              {(*[]btcjson.RescannedBlock)(nil)},\n}\n\n// helpCacher provides a concurrent safe type that provides help and usage for\n// the RPC server commands and caches the results for future calls.\ntype helpCacher struct {\n\tsync.Mutex\n\tusage      string\n\tmethodHelp map[string]string\n}\n\n// rpcMethodHelp returns an RPC help string for the provided method.\n//\n// This function is safe for concurrent access.\nfunc (c *helpCacher) rpcMethodHelp(method string) (string, error) {\n\tc.Lock()\n\tdefer c.Unlock()\n\n\t// Return the cached method help if it exists.\n\tif help, exists := c.methodHelp[method]; exists {\n\t\treturn help, nil\n\t}\n\n\t// Look up the result types for the method.\n\tresultTypes, ok := rpcResultTypes[method]\n\tif !ok {\n\t\treturn \"\", errors.New(\"no result types specified for method \" +\n\t\t\tmethod)\n\t}\n\n\t// Generate, cache, and return the help.\n\thelp, err := btcjson.GenerateHelp(method, helpDescsEnUS, resultTypes...)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tc.methodHelp[method] = help\n\treturn help, nil\n}\n\n// rpcUsage returns one-line usage for all support RPC commands.\n//\n// This function is safe for concurrent access.\nfunc (c *helpCacher) rpcUsage(includeWebsockets bool) (string, error) {\n\tc.Lock()\n\tdefer c.Unlock()\n\n\t// Return the cached usage if it is available.\n\tif c.usage != \"\" {\n\t\treturn c.usage, nil\n\t}\n\n\t// Generate a list of one-line usage for every command.\n\tusageTexts := make([]string, 0, len(rpcHandlers))\n\tfor k := range rpcHandlers {\n\t\tusage, err := btcjson.MethodUsageText(k)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tusageTexts = append(usageTexts, usage)\n\t}\n\n\t// Include websockets commands if requested.\n\tif includeWebsockets {\n\t\tfor k := range wsHandlers {\n\t\t\tusage, err := btcjson.MethodUsageText(k)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tusageTexts = append(usageTexts, usage)\n\t\t}\n\t}\n\n\tsort.Strings(usageTexts)\n\tc.usage = strings.Join(usageTexts, \"\\n\")\n\treturn c.usage, nil\n}\n\n// newHelpCacher returns a new instance of a help cacher which provides help and\n// usage for the RPC server commands and caches the results for future calls.\nfunc newHelpCacher() *helpCacher {\n\treturn &helpCacher{\n\t\tmethodHelp: make(map[string]string),\n\t}\n}\n"
  },
  {
    "path": "rpcserverhelp_test.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport \"testing\"\n\n// TestHelp ensures the help is reasonably accurate by checking that every\n// command specified also has result types defined and the one-line usage and\n// help text can be generated for them.\nfunc TestHelp(t *testing.T) {\n\t// Ensure there are result types specified for every handler.\n\tfor k := range rpcHandlers {\n\t\tif _, ok := rpcResultTypes[k]; !ok {\n\t\t\tt.Errorf(\"RPC handler defined for method '%v' without \"+\n\t\t\t\t\"also specifying result types\", k)\n\t\t\tcontinue\n\t\t}\n\n\t}\n\tfor k := range wsHandlers {\n\t\tif _, ok := rpcResultTypes[k]; !ok {\n\t\t\tt.Errorf(\"RPC handler defined for method '%v' without \"+\n\t\t\t\t\"also specifying result types\", k)\n\t\t\tcontinue\n\t\t}\n\n\t}\n\n\t// Ensure the usage for every command can be generated without errors.\n\thelpCacher := newHelpCacher()\n\tif _, err := helpCacher.rpcUsage(true); err != nil {\n\t\tt.Fatalf(\"Failed to generate one-line usage: %v\", err)\n\t}\n\tif _, err := helpCacher.rpcUsage(true); err != nil {\n\t\tt.Fatalf(\"Failed to generate one-line usage (cached): %v\", err)\n\t}\n\n\t// Ensure the help for every command can be generated without errors.\n\tfor k := range rpcHandlers {\n\t\tif _, err := helpCacher.rpcMethodHelp(k); err != nil {\n\t\t\tt.Errorf(\"Failed to generate help for method '%v': %v\",\n\t\t\t\tk, err)\n\t\t\tcontinue\n\t\t}\n\t\tif _, err := helpCacher.rpcMethodHelp(k); err != nil {\n\t\t\tt.Errorf(\"Failed to generate help for method '%v'\"+\n\t\t\t\t\"(cached): %v\", k, err)\n\t\t\tcontinue\n\t\t}\n\t}\n\tfor k := range wsHandlers {\n\t\tif _, err := helpCacher.rpcMethodHelp(k); err != nil {\n\t\t\tt.Errorf(\"Failed to generate help for method '%v': %v\",\n\t\t\t\tk, err)\n\t\t\tcontinue\n\t\t}\n\t\tif _, err := helpCacher.rpcMethodHelp(k); err != nil {\n\t\t\tt.Errorf(\"Failed to generate help for method '%v'\"+\n\t\t\t\t\"(cached): %v\", k, err)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "rpcwebsocket.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2017 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"container/list\"\n\t\"crypto/sha256\"\n\t\"crypto/subtle\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/btcjson\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/btcsuite/websocket\"\n\t\"golang.org/x/crypto/ripemd160\"\n)\n\nconst (\n\t// websocketSendBufferSize is the number of elements the send channel\n\t// can queue before blocking.  Note that this only applies to requests\n\t// handled directly in the websocket client input handler or the async\n\t// handler since notifications have their own queuing mechanism\n\t// independent of the send channel buffer.\n\twebsocketSendBufferSize = 50\n)\n\ntype semaphore chan struct{}\n\nfunc makeSemaphore(n int) semaphore {\n\treturn make(chan struct{}, n)\n}\n\nfunc (s semaphore) acquire() { s <- struct{}{} }\nfunc (s semaphore) release() { <-s }\n\n// timeZeroVal is simply the zero value for a time.Time and is used to avoid\n// creating multiple instances.\nvar timeZeroVal time.Time\n\n// wsCommandHandler describes a callback function used to handle a specific\n// command.\ntype wsCommandHandler func(*wsClient, interface{}) (interface{}, error)\n\n// wsHandlers maps RPC command strings to appropriate websocket handler\n// functions.  This is set by init because help references wsHandlers and thus\n// causes a dependency loop.\nvar wsHandlers map[string]wsCommandHandler\nvar wsHandlersBeforeInit = map[string]wsCommandHandler{\n\t\"loadtxfilter\":              handleLoadTxFilter,\n\t\"help\":                      handleWebsocketHelp,\n\t\"notifyblocks\":              handleNotifyBlocks,\n\t\"notifynewtransactions\":     handleNotifyNewTransactions,\n\t\"notifyreceived\":            handleNotifyReceived,\n\t\"notifyspent\":               handleNotifySpent,\n\t\"session\":                   handleSession,\n\t\"stopnotifyblocks\":          handleStopNotifyBlocks,\n\t\"stopnotifynewtransactions\": handleStopNotifyNewTransactions,\n\t\"stopnotifyspent\":           handleStopNotifySpent,\n\t\"stopnotifyreceived\":        handleStopNotifyReceived,\n\t\"rescan\":                    handleRescan,\n\t\"rescanblocks\":              handleRescanBlocks,\n}\n\n// WebsocketHandler handles a new websocket client by creating a new wsClient,\n// starting it, and blocking until the connection closes.  Since it blocks, it\n// must be run in a separate goroutine.  It should be invoked from the websocket\n// server handler which runs each new connection in a new goroutine thereby\n// satisfying the requirement.\nfunc (s *rpcServer) WebsocketHandler(conn *websocket.Conn, remoteAddr string,\n\tauthenticated bool, isAdmin bool) {\n\n\t// Clear the read deadline that was set before the websocket hijacked\n\t// the connection.\n\tconn.SetReadDeadline(timeZeroVal)\n\n\t// Limit max number of websocket clients.\n\trpcsLog.Infof(\"New websocket client %s\", remoteAddr)\n\tif s.ntfnMgr.NumClients()+1 > cfg.RPCMaxWebsockets {\n\t\trpcsLog.Infof(\"Max websocket clients exceeded [%d] - \"+\n\t\t\t\"disconnecting client %s\", cfg.RPCMaxWebsockets,\n\t\t\tremoteAddr)\n\t\tconn.Close()\n\t\treturn\n\t}\n\n\t// Create a new websocket client to handle the new websocket connection\n\t// and wait for it to shutdown.  Once it has shutdown (and hence\n\t// disconnected), remove it and any notifications it registered for.\n\tclient, err := newWebsocketClient(s, conn, remoteAddr, authenticated, isAdmin)\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Failed to serve client %s: %v\", remoteAddr, err)\n\t\tconn.Close()\n\t\treturn\n\t}\n\ts.ntfnMgr.AddClient(client)\n\tclient.Start()\n\tclient.WaitForShutdown()\n\ts.ntfnMgr.RemoveClient(client)\n\trpcsLog.Infof(\"Disconnected websocket client %s\", remoteAddr)\n}\n\n// wsNotificationManager is a connection and notification manager used for\n// websockets.  It allows websocket clients to register for notifications they\n// are interested in.  When an event happens elsewhere in the code such as\n// transactions being added to the memory pool or block connects/disconnects,\n// the notification manager is provided with the relevant details needed to\n// figure out which websocket clients need to be notified based on what they\n// have registered for and notifies them accordingly.  It is also used to keep\n// track of all connected websocket clients.\ntype wsNotificationManager struct {\n\t// server is the RPC server the notification manager is associated with.\n\tserver *rpcServer\n\n\t// queueNotification queues a notification for handling.\n\tqueueNotification chan interface{}\n\n\t// notificationMsgs feeds notificationHandler with notifications\n\t// and client (un)registration requests from a queue as well as\n\t// registration and unregistration requests from clients.\n\tnotificationMsgs chan interface{}\n\n\t// Access channel for current number of connected clients.\n\tnumClients chan int\n\n\t// Shutdown handling\n\twg   sync.WaitGroup\n\tquit chan struct{}\n}\n\n// queueHandler manages a queue of empty interfaces, reading from in and\n// sending the oldest unsent to out.  This handler stops when either of the\n// in or quit channels are closed, and closes out before returning, without\n// waiting to send any variables still remaining in the queue.\nfunc queueHandler(in <-chan interface{}, out chan<- interface{}, quit <-chan struct{}) {\n\tvar q []interface{}\n\tvar dequeue chan<- interface{}\n\tskipQueue := out\n\tvar next interface{}\nout:\n\tfor {\n\t\tselect {\n\t\tcase n, ok := <-in:\n\t\t\tif !ok {\n\t\t\t\t// Sender closed input channel.\n\t\t\t\tbreak out\n\t\t\t}\n\n\t\t\t// Either send to out immediately if skipQueue is\n\t\t\t// non-nil (queue is empty) and reader is ready,\n\t\t\t// or append to the queue and send later.\n\t\t\tselect {\n\t\t\tcase skipQueue <- n:\n\t\t\tdefault:\n\t\t\t\tq = append(q, n)\n\t\t\t\tdequeue = out\n\t\t\t\tskipQueue = nil\n\t\t\t\tnext = q[0]\n\t\t\t}\n\n\t\tcase dequeue <- next:\n\t\t\tcopy(q, q[1:])\n\t\t\tq[len(q)-1] = nil // avoid leak\n\t\t\tq = q[:len(q)-1]\n\t\t\tif len(q) == 0 {\n\t\t\t\tdequeue = nil\n\t\t\t\tskipQueue = out\n\t\t\t} else {\n\t\t\t\tnext = q[0]\n\t\t\t}\n\n\t\tcase <-quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\tclose(out)\n}\n\n// queueHandler maintains a queue of notifications and notification handler\n// control messages.\nfunc (m *wsNotificationManager) queueHandler() {\n\tqueueHandler(m.queueNotification, m.notificationMsgs, m.quit)\n\tm.wg.Done()\n}\n\n// NotifyBlockConnected passes a block newly-connected to the best chain\n// to the notification manager for block and transaction notification\n// processing.\nfunc (m *wsNotificationManager) NotifyBlockConnected(block *btcutil.Block) {\n\t// As NotifyBlockConnected will be called by the block manager\n\t// and the RPC server may no longer be running, use a select\n\t// statement to unblock enqueuing the notification once the RPC\n\t// server has begun shutting down.\n\tselect {\n\tcase m.queueNotification <- (*notificationBlockConnected)(block):\n\tcase <-m.quit:\n\t}\n}\n\n// NotifyBlockDisconnected passes a block disconnected from the best chain\n// to the notification manager for block notification processing.\nfunc (m *wsNotificationManager) NotifyBlockDisconnected(block *btcutil.Block) {\n\t// As NotifyBlockDisconnected will be called by the block manager\n\t// and the RPC server may no longer be running, use a select\n\t// statement to unblock enqueuing the notification once the RPC\n\t// server has begun shutting down.\n\tselect {\n\tcase m.queueNotification <- (*notificationBlockDisconnected)(block):\n\tcase <-m.quit:\n\t}\n}\n\n// NotifyMempoolTx passes a transaction accepted by mempool to the\n// notification manager for transaction notification processing.  If\n// isNew is true, the tx is a new transaction, rather than one\n// added to the mempool during a reorg.\nfunc (m *wsNotificationManager) NotifyMempoolTx(tx *btcutil.Tx, isNew bool) {\n\tn := &notificationTxAcceptedByMempool{\n\t\tisNew: isNew,\n\t\ttx:    tx,\n\t}\n\n\t// As NotifyMempoolTx will be called by mempool and the RPC server\n\t// may no longer be running, use a select statement to unblock\n\t// enqueuing the notification once the RPC server has begun\n\t// shutting down.\n\tselect {\n\tcase m.queueNotification <- n:\n\tcase <-m.quit:\n\t}\n}\n\n// wsClientFilter tracks relevant addresses for each websocket client for\n// the `rescanblocks` extension. It is modified by the `loadtxfilter` command.\n//\n// NOTE: This extension was ported from github.com/decred/dcrd\ntype wsClientFilter struct {\n\tmu sync.Mutex\n\n\t// Implemented fast paths for address lookup.\n\tpubKeyHashes        map[[ripemd160.Size]byte]struct{}\n\tscriptHashes        map[[ripemd160.Size]byte]struct{}\n\tcompressedPubKeys   map[[33]byte]struct{}\n\tuncompressedPubKeys map[[65]byte]struct{}\n\n\t// A fallback address lookup map in case a fast path doesn't exist.\n\t// Only exists for completeness.  If using this shows up in a profile,\n\t// there's a good chance a fast path should be added.\n\totherAddresses map[string]struct{}\n\n\t// Outpoints of unspent outputs.\n\tunspent map[wire.OutPoint]struct{}\n}\n\n// newWSClientFilter creates a new, empty wsClientFilter struct to be used\n// for a websocket client.\n//\n// NOTE: This extension was ported from github.com/decred/dcrd\nfunc newWSClientFilter(addresses []string, unspentOutPoints []wire.OutPoint, params *chaincfg.Params) *wsClientFilter {\n\tfilter := &wsClientFilter{\n\t\tpubKeyHashes:        map[[ripemd160.Size]byte]struct{}{},\n\t\tscriptHashes:        map[[ripemd160.Size]byte]struct{}{},\n\t\tcompressedPubKeys:   map[[33]byte]struct{}{},\n\t\tuncompressedPubKeys: map[[65]byte]struct{}{},\n\t\totherAddresses:      map[string]struct{}{},\n\t\tunspent:             make(map[wire.OutPoint]struct{}, len(unspentOutPoints)),\n\t}\n\n\tfor _, s := range addresses {\n\t\tfilter.addAddressStr(s, params)\n\t}\n\tfor i := range unspentOutPoints {\n\t\tfilter.addUnspentOutPoint(&unspentOutPoints[i])\n\t}\n\n\treturn filter\n}\n\n// addAddress adds an address to a wsClientFilter, treating it correctly based\n// on the type of address passed as an argument.\n//\n// NOTE: This extension was ported from github.com/decred/dcrd\nfunc (f *wsClientFilter) addAddress(a btcutil.Address) {\n\tswitch a := a.(type) {\n\tcase *btcutil.AddressPubKeyHash:\n\t\tf.pubKeyHashes[*a.Hash160()] = struct{}{}\n\t\treturn\n\tcase *btcutil.AddressScriptHash:\n\t\tf.scriptHashes[*a.Hash160()] = struct{}{}\n\t\treturn\n\tcase *btcutil.AddressPubKey:\n\t\tserializedPubKey := a.ScriptAddress()\n\t\tswitch len(serializedPubKey) {\n\t\tcase 33: // compressed\n\t\t\tvar compressedPubKey [33]byte\n\t\t\tcopy(compressedPubKey[:], serializedPubKey)\n\t\t\tf.compressedPubKeys[compressedPubKey] = struct{}{}\n\t\t\treturn\n\t\tcase 65: // uncompressed\n\t\t\tvar uncompressedPubKey [65]byte\n\t\t\tcopy(uncompressedPubKey[:], serializedPubKey)\n\t\t\tf.uncompressedPubKeys[uncompressedPubKey] = struct{}{}\n\t\t\treturn\n\t\t}\n\t}\n\n\tf.otherAddresses[a.EncodeAddress()] = struct{}{}\n}\n\n// addAddressStr parses an address from a string and then adds it to the\n// wsClientFilter using addAddress.\n//\n// NOTE: This extension was ported from github.com/decred/dcrd\nfunc (f *wsClientFilter) addAddressStr(s string, params *chaincfg.Params) {\n\t// If address can't be decoded, no point in saving it since it should also\n\t// impossible to create the address from an inspected transaction output\n\t// script.\n\ta, err := btcutil.DecodeAddress(s, params)\n\tif err != nil {\n\t\treturn\n\t}\n\tf.addAddress(a)\n}\n\n// existsAddress returns true if the passed address has been added to the\n// wsClientFilter.\n//\n// NOTE: This extension was ported from github.com/decred/dcrd\nfunc (f *wsClientFilter) existsAddress(a btcutil.Address) bool {\n\tswitch a := a.(type) {\n\tcase *btcutil.AddressPubKeyHash:\n\t\t_, ok := f.pubKeyHashes[*a.Hash160()]\n\t\treturn ok\n\tcase *btcutil.AddressScriptHash:\n\t\t_, ok := f.scriptHashes[*a.Hash160()]\n\t\treturn ok\n\tcase *btcutil.AddressPubKey:\n\t\tserializedPubKey := a.ScriptAddress()\n\t\tswitch len(serializedPubKey) {\n\t\tcase 33: // compressed\n\t\t\tvar compressedPubKey [33]byte\n\t\t\tcopy(compressedPubKey[:], serializedPubKey)\n\t\t\t_, ok := f.compressedPubKeys[compressedPubKey]\n\t\t\tif !ok {\n\t\t\t\t_, ok = f.pubKeyHashes[*a.AddressPubKeyHash().Hash160()]\n\t\t\t}\n\t\t\treturn ok\n\t\tcase 65: // uncompressed\n\t\t\tvar uncompressedPubKey [65]byte\n\t\t\tcopy(uncompressedPubKey[:], serializedPubKey)\n\t\t\t_, ok := f.uncompressedPubKeys[uncompressedPubKey]\n\t\t\tif !ok {\n\t\t\t\t_, ok = f.pubKeyHashes[*a.AddressPubKeyHash().Hash160()]\n\t\t\t}\n\t\t\treturn ok\n\t\t}\n\t}\n\n\t_, ok := f.otherAddresses[a.EncodeAddress()]\n\treturn ok\n}\n\n// removeAddress removes the passed address, if it exists, from the\n// wsClientFilter.\n//\n// NOTE: This extension was ported from github.com/decred/dcrd\nfunc (f *wsClientFilter) removeAddress(a btcutil.Address) {\n\tswitch a := a.(type) {\n\tcase *btcutil.AddressPubKeyHash:\n\t\tdelete(f.pubKeyHashes, *a.Hash160())\n\t\treturn\n\tcase *btcutil.AddressScriptHash:\n\t\tdelete(f.scriptHashes, *a.Hash160())\n\t\treturn\n\tcase *btcutil.AddressPubKey:\n\t\tserializedPubKey := a.ScriptAddress()\n\t\tswitch len(serializedPubKey) {\n\t\tcase 33: // compressed\n\t\t\tvar compressedPubKey [33]byte\n\t\t\tcopy(compressedPubKey[:], serializedPubKey)\n\t\t\tdelete(f.compressedPubKeys, compressedPubKey)\n\t\t\treturn\n\t\tcase 65: // uncompressed\n\t\t\tvar uncompressedPubKey [65]byte\n\t\t\tcopy(uncompressedPubKey[:], serializedPubKey)\n\t\t\tdelete(f.uncompressedPubKeys, uncompressedPubKey)\n\t\t\treturn\n\t\t}\n\t}\n\n\tdelete(f.otherAddresses, a.EncodeAddress())\n}\n\n// removeAddressStr parses an address from a string and then removes it from the\n// wsClientFilter using removeAddress.\n//\n// NOTE: This extension was ported from github.com/decred/dcrd\nfunc (f *wsClientFilter) removeAddressStr(s string, params *chaincfg.Params) {\n\ta, err := btcutil.DecodeAddress(s, params)\n\tif err == nil {\n\t\tf.removeAddress(a)\n\t} else {\n\t\tdelete(f.otherAddresses, s)\n\t}\n}\n\n// addUnspentOutPoint adds an outpoint to the wsClientFilter.\n//\n// NOTE: This extension was ported from github.com/decred/dcrd\nfunc (f *wsClientFilter) addUnspentOutPoint(op *wire.OutPoint) {\n\tf.unspent[*op] = struct{}{}\n}\n\n// existsUnspentOutPoint returns true if the passed outpoint has been added to\n// the wsClientFilter.\n//\n// NOTE: This extension was ported from github.com/decred/dcrd\nfunc (f *wsClientFilter) existsUnspentOutPoint(op *wire.OutPoint) bool {\n\t_, ok := f.unspent[*op]\n\treturn ok\n}\n\n// removeUnspentOutPoint removes the passed outpoint, if it exists, from the\n// wsClientFilter.\n//\n// NOTE: This extension was ported from github.com/decred/dcrd\nfunc (f *wsClientFilter) removeUnspentOutPoint(op *wire.OutPoint) {\n\tdelete(f.unspent, *op)\n}\n\n// Notification types\ntype notificationBlockConnected btcutil.Block\ntype notificationBlockDisconnected btcutil.Block\ntype notificationTxAcceptedByMempool struct {\n\tisNew bool\n\ttx    *btcutil.Tx\n}\n\n// Notification control requests\ntype notificationRegisterClient wsClient\ntype notificationUnregisterClient wsClient\ntype notificationRegisterBlocks wsClient\ntype notificationUnregisterBlocks wsClient\ntype notificationRegisterNewMempoolTxs wsClient\ntype notificationUnregisterNewMempoolTxs wsClient\ntype notificationRegisterSpent struct {\n\twsc *wsClient\n\tops []*wire.OutPoint\n}\ntype notificationUnregisterSpent struct {\n\twsc *wsClient\n\top  *wire.OutPoint\n}\ntype notificationRegisterAddr struct {\n\twsc   *wsClient\n\taddrs []string\n}\ntype notificationUnregisterAddr struct {\n\twsc  *wsClient\n\taddr string\n}\n\n// notificationHandler reads notifications and control messages from the queue\n// handler and processes one at a time.\nfunc (m *wsNotificationManager) notificationHandler() {\n\t// clients is a map of all currently connected websocket clients.\n\tclients := make(map[chan struct{}]*wsClient)\n\n\t// Maps used to hold lists of websocket clients to be notified on\n\t// certain events.  Each websocket client also keeps maps for the events\n\t// which have multiple triggers to make removal from these lists on\n\t// connection close less horrendously expensive.\n\t//\n\t// Where possible, the quit channel is used as the unique id for a client\n\t// since it is quite a bit more efficient than using the entire struct.\n\tblockNotifications := make(map[chan struct{}]*wsClient)\n\ttxNotifications := make(map[chan struct{}]*wsClient)\n\twatchedOutPoints := make(map[wire.OutPoint]map[chan struct{}]*wsClient)\n\twatchedAddrs := make(map[string]map[chan struct{}]*wsClient)\n\nout:\n\tfor {\n\t\tselect {\n\t\tcase n, ok := <-m.notificationMsgs:\n\t\t\tif !ok {\n\t\t\t\t// queueHandler quit.\n\t\t\t\tbreak out\n\t\t\t}\n\t\t\tswitch n := n.(type) {\n\t\t\tcase *notificationBlockConnected:\n\t\t\t\tblock := (*btcutil.Block)(n)\n\n\t\t\t\t// Skip iterating through all txs if no\n\t\t\t\t// tx notification requests exist.\n\t\t\t\tif len(watchedOutPoints) != 0 || len(watchedAddrs) != 0 {\n\t\t\t\t\tfor _, tx := range block.Transactions() {\n\t\t\t\t\t\tm.notifyForTx(watchedOutPoints,\n\t\t\t\t\t\t\twatchedAddrs, tx, block)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif len(blockNotifications) != 0 {\n\t\t\t\t\tm.notifyBlockConnected(blockNotifications,\n\t\t\t\t\t\tblock)\n\t\t\t\t\tm.notifyFilteredBlockConnected(blockNotifications,\n\t\t\t\t\t\tblock)\n\t\t\t\t}\n\n\t\t\tcase *notificationBlockDisconnected:\n\t\t\t\tblock := (*btcutil.Block)(n)\n\n\t\t\t\tif len(blockNotifications) != 0 {\n\t\t\t\t\tm.notifyBlockDisconnected(blockNotifications,\n\t\t\t\t\t\tblock)\n\t\t\t\t\tm.notifyFilteredBlockDisconnected(blockNotifications,\n\t\t\t\t\t\tblock)\n\t\t\t\t}\n\n\t\t\tcase *notificationTxAcceptedByMempool:\n\t\t\t\tif n.isNew && len(txNotifications) != 0 {\n\t\t\t\t\tm.notifyForNewTx(txNotifications, n.tx)\n\t\t\t\t}\n\t\t\t\tm.notifyForTx(watchedOutPoints, watchedAddrs, n.tx, nil)\n\t\t\t\tm.notifyRelevantTxAccepted(n.tx, clients)\n\n\t\t\tcase *notificationRegisterBlocks:\n\t\t\t\twsc := (*wsClient)(n)\n\t\t\t\tblockNotifications[wsc.quit] = wsc\n\n\t\t\tcase *notificationUnregisterBlocks:\n\t\t\t\twsc := (*wsClient)(n)\n\t\t\t\tdelete(blockNotifications, wsc.quit)\n\n\t\t\tcase *notificationRegisterClient:\n\t\t\t\twsc := (*wsClient)(n)\n\t\t\t\tclients[wsc.quit] = wsc\n\n\t\t\tcase *notificationUnregisterClient:\n\t\t\t\twsc := (*wsClient)(n)\n\t\t\t\t// Remove any requests made by the client as well as\n\t\t\t\t// the client itself.\n\t\t\t\tdelete(blockNotifications, wsc.quit)\n\t\t\t\tdelete(txNotifications, wsc.quit)\n\t\t\t\tfor k := range wsc.spentRequests {\n\t\t\t\t\top := k\n\t\t\t\t\tm.removeSpentRequest(watchedOutPoints, wsc, &op)\n\t\t\t\t}\n\t\t\t\tfor addr := range wsc.addrRequests {\n\t\t\t\t\tm.removeAddrRequest(watchedAddrs, wsc, addr)\n\t\t\t\t}\n\t\t\t\tdelete(clients, wsc.quit)\n\n\t\t\tcase *notificationRegisterSpent:\n\t\t\t\tm.addSpentRequests(watchedOutPoints, n.wsc, n.ops)\n\n\t\t\tcase *notificationUnregisterSpent:\n\t\t\t\tm.removeSpentRequest(watchedOutPoints, n.wsc, n.op)\n\n\t\t\tcase *notificationRegisterAddr:\n\t\t\t\tm.addAddrRequests(watchedAddrs, n.wsc, n.addrs)\n\n\t\t\tcase *notificationUnregisterAddr:\n\t\t\t\tm.removeAddrRequest(watchedAddrs, n.wsc, n.addr)\n\n\t\t\tcase *notificationRegisterNewMempoolTxs:\n\t\t\t\twsc := (*wsClient)(n)\n\t\t\t\ttxNotifications[wsc.quit] = wsc\n\n\t\t\tcase *notificationUnregisterNewMempoolTxs:\n\t\t\t\twsc := (*wsClient)(n)\n\t\t\t\tdelete(txNotifications, wsc.quit)\n\n\t\t\tdefault:\n\t\t\t\trpcsLog.Warn(\"Unhandled notification type\")\n\t\t\t}\n\n\t\tcase m.numClients <- len(clients):\n\n\t\tcase <-m.quit:\n\t\t\t// RPC server shutting down.\n\t\t\tbreak out\n\t\t}\n\t}\n\n\tfor _, c := range clients {\n\t\tc.Disconnect()\n\t}\n\tm.wg.Done()\n}\n\n// NumClients returns the number of clients actively being served.\nfunc (m *wsNotificationManager) NumClients() (n int) {\n\tselect {\n\tcase n = <-m.numClients:\n\tcase <-m.quit: // Use default n (0) if server has shut down.\n\t}\n\treturn\n}\n\n// RegisterBlockUpdates requests block update notifications to the passed\n// websocket client.\nfunc (m *wsNotificationManager) RegisterBlockUpdates(wsc *wsClient) {\n\tm.queueNotification <- (*notificationRegisterBlocks)(wsc)\n}\n\n// UnregisterBlockUpdates removes block update notifications for the passed\n// websocket client.\nfunc (m *wsNotificationManager) UnregisterBlockUpdates(wsc *wsClient) {\n\tm.queueNotification <- (*notificationUnregisterBlocks)(wsc)\n}\n\n// subscribedClients returns the set of all websocket client quit channels that\n// are registered to receive notifications regarding tx, either due to tx\n// spending a watched output or outputting to a watched address.  Matching\n// client's filters are updated based on this transaction's outputs and output\n// addresses that may be relevant for a client.\nfunc (m *wsNotificationManager) subscribedClients(tx *btcutil.Tx,\n\tclients map[chan struct{}]*wsClient) map[chan struct{}]struct{} {\n\n\t// Use a map of client quit channels as keys to prevent duplicates when\n\t// multiple inputs and/or outputs are relevant to the client.\n\tsubscribed := make(map[chan struct{}]struct{})\n\n\tmsgTx := tx.MsgTx()\n\tfor _, input := range msgTx.TxIn {\n\t\tfor quitChan, wsc := range clients {\n\t\t\twsc.Lock()\n\t\t\tfilter := wsc.filterData\n\t\t\twsc.Unlock()\n\t\t\tif filter == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfilter.mu.Lock()\n\t\t\tif filter.existsUnspentOutPoint(&input.PreviousOutPoint) {\n\t\t\t\tsubscribed[quitChan] = struct{}{}\n\t\t\t}\n\t\t\tfilter.mu.Unlock()\n\t\t}\n\t}\n\n\tfor i, output := range msgTx.TxOut {\n\t\t_, addrs, _, err := txscript.ExtractPkScriptAddrs(\n\t\t\toutput.PkScript, m.server.cfg.ChainParams)\n\t\tif err != nil {\n\t\t\t// Clients are not able to subscribe to\n\t\t\t// nonstandard or non-address outputs.\n\t\t\tcontinue\n\t\t}\n\t\tfor quitChan, wsc := range clients {\n\t\t\twsc.Lock()\n\t\t\tfilter := wsc.filterData\n\t\t\twsc.Unlock()\n\t\t\tif filter == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfilter.mu.Lock()\n\t\t\tfor _, a := range addrs {\n\t\t\t\tif filter.existsAddress(a) {\n\t\t\t\t\tsubscribed[quitChan] = struct{}{}\n\t\t\t\t\top := wire.OutPoint{\n\t\t\t\t\t\tHash:  *tx.Hash(),\n\t\t\t\t\t\tIndex: uint32(i),\n\t\t\t\t\t}\n\t\t\t\t\tfilter.addUnspentOutPoint(&op)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfilter.mu.Unlock()\n\t\t}\n\t}\n\n\treturn subscribed\n}\n\n// notifyBlockConnected notifies websocket clients that have registered for\n// block updates when a block is connected to the main chain.\nfunc (*wsNotificationManager) notifyBlockConnected(clients map[chan struct{}]*wsClient,\n\tblock *btcutil.Block) {\n\n\t// Notify interested websocket clients about the connected block.\n\tntfn := btcjson.NewBlockConnectedNtfn(block.Hash().String(), block.Height(),\n\t\tblock.MsgBlock().Header.Timestamp.Unix())\n\tmarshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn)\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Failed to marshal block connected notification: \"+\n\t\t\t\"%v\", err)\n\t\treturn\n\t}\n\tfor _, wsc := range clients {\n\t\twsc.QueueNotification(marshalledJSON)\n\t}\n}\n\n// notifyBlockDisconnected notifies websocket clients that have registered for\n// block updates when a block is disconnected from the main chain (due to a\n// reorganize).\nfunc (*wsNotificationManager) notifyBlockDisconnected(clients map[chan struct{}]*wsClient, block *btcutil.Block) {\n\t// Skip notification creation if no clients have requested block\n\t// connected/disconnected notifications.\n\tif len(clients) == 0 {\n\t\treturn\n\t}\n\n\t// Notify interested websocket clients about the disconnected block.\n\tntfn := btcjson.NewBlockDisconnectedNtfn(block.Hash().String(),\n\t\tblock.Height(), block.MsgBlock().Header.Timestamp.Unix())\n\tmarshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn)\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Failed to marshal block disconnected \"+\n\t\t\t\"notification: %v\", err)\n\t\treturn\n\t}\n\tfor _, wsc := range clients {\n\t\twsc.QueueNotification(marshalledJSON)\n\t}\n}\n\n// notifyFilteredBlockConnected notifies websocket clients that have registered for\n// block updates when a block is connected to the main chain.\nfunc (m *wsNotificationManager) notifyFilteredBlockConnected(clients map[chan struct{}]*wsClient,\n\tblock *btcutil.Block) {\n\n\t// Create the common portion of the notification that is the same for\n\t// every client.\n\tvar w bytes.Buffer\n\terr := block.MsgBlock().Header.Serialize(&w)\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Failed to serialize header for filtered block \"+\n\t\t\t\"connected notification: %v\", err)\n\t\treturn\n\t}\n\tntfn := btcjson.NewFilteredBlockConnectedNtfn(block.Height(),\n\t\thex.EncodeToString(w.Bytes()), nil)\n\n\t// Search for relevant transactions for each client and save them\n\t// serialized in hex encoding for the notification.\n\tsubscribedTxs := make(map[chan struct{}][]string)\n\tfor _, tx := range block.Transactions() {\n\t\tvar txHex string\n\t\tfor quitChan := range m.subscribedClients(tx, clients) {\n\t\t\tif txHex == \"\" {\n\t\t\t\ttxHex = txHexString(tx.MsgTx())\n\t\t\t}\n\t\t\tsubscribedTxs[quitChan] = append(subscribedTxs[quitChan], txHex)\n\t\t}\n\t}\n\tfor quitChan, wsc := range clients {\n\t\t// Add all discovered transactions for this client. For clients\n\t\t// that have no new-style filter, add the empty string slice.\n\t\tntfn.SubscribedTxs = subscribedTxs[quitChan]\n\n\t\t// Marshal and queue notification.\n\t\tmarshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn)\n\t\tif err != nil {\n\t\t\trpcsLog.Errorf(\"Failed to marshal filtered block \"+\n\t\t\t\t\"connected notification: %v\", err)\n\t\t\treturn\n\t\t}\n\t\twsc.QueueNotification(marshalledJSON)\n\t}\n}\n\n// notifyFilteredBlockDisconnected notifies websocket clients that have registered for\n// block updates when a block is disconnected from the main chain (due to a\n// reorganize).\nfunc (*wsNotificationManager) notifyFilteredBlockDisconnected(clients map[chan struct{}]*wsClient,\n\tblock *btcutil.Block) {\n\t// Skip notification creation if no clients have requested block\n\t// connected/disconnected notifications.\n\tif len(clients) == 0 {\n\t\treturn\n\t}\n\n\t// Notify interested websocket clients about the disconnected block.\n\tvar w bytes.Buffer\n\terr := block.MsgBlock().Header.Serialize(&w)\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Failed to serialize header for filtered block \"+\n\t\t\t\"disconnected notification: %v\", err)\n\t\treturn\n\t}\n\tntfn := btcjson.NewFilteredBlockDisconnectedNtfn(block.Height(),\n\t\thex.EncodeToString(w.Bytes()))\n\tmarshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn)\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Failed to marshal filtered block disconnected \"+\n\t\t\t\"notification: %v\", err)\n\t\treturn\n\t}\n\tfor _, wsc := range clients {\n\t\twsc.QueueNotification(marshalledJSON)\n\t}\n}\n\n// RegisterNewMempoolTxsUpdates requests notifications to the passed websocket\n// client when new transactions are added to the memory pool.\nfunc (m *wsNotificationManager) RegisterNewMempoolTxsUpdates(wsc *wsClient) {\n\tm.queueNotification <- (*notificationRegisterNewMempoolTxs)(wsc)\n}\n\n// UnregisterNewMempoolTxsUpdates removes notifications to the passed websocket\n// client when new transaction are added to the memory pool.\nfunc (m *wsNotificationManager) UnregisterNewMempoolTxsUpdates(wsc *wsClient) {\n\tm.queueNotification <- (*notificationUnregisterNewMempoolTxs)(wsc)\n}\n\n// notifyForNewTx notifies websocket clients that have registered for updates\n// when a new transaction is added to the memory pool.\nfunc (m *wsNotificationManager) notifyForNewTx(clients map[chan struct{}]*wsClient, tx *btcutil.Tx) {\n\ttxHashStr := tx.Hash().String()\n\tmtx := tx.MsgTx()\n\n\tvar amount int64\n\tfor _, txOut := range mtx.TxOut {\n\t\tamount += txOut.Value\n\t}\n\n\tntfn := btcjson.NewTxAcceptedNtfn(txHashStr, btcutil.Amount(amount).ToBTC())\n\tmarshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn)\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Failed to marshal tx notification: %s\", err.Error())\n\t\treturn\n\t}\n\n\tvar verboseNtfn *btcjson.TxAcceptedVerboseNtfn\n\tvar marshalledJSONVerbose []byte\n\tfor _, wsc := range clients {\n\t\tif wsc.verboseTxUpdates {\n\t\t\tif marshalledJSONVerbose != nil {\n\t\t\t\twsc.QueueNotification(marshalledJSONVerbose)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tnet := m.server.cfg.ChainParams\n\t\t\trawTx, err := createTxRawResult(net, mtx, txHashStr, nil,\n\t\t\t\t\"\", 0, 0)\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tverboseNtfn = btcjson.NewTxAcceptedVerboseNtfn(*rawTx)\n\t\t\tmarshalledJSONVerbose, err = btcjson.MarshalCmd(btcjson.RpcVersion1, nil,\n\t\t\t\tverboseNtfn)\n\t\t\tif err != nil {\n\t\t\t\trpcsLog.Errorf(\"Failed to marshal verbose tx \"+\n\t\t\t\t\t\"notification: %s\", err.Error())\n\t\t\t\treturn\n\t\t\t}\n\t\t\twsc.QueueNotification(marshalledJSONVerbose)\n\t\t} else {\n\t\t\twsc.QueueNotification(marshalledJSON)\n\t\t}\n\t}\n}\n\n// RegisterSpentRequests requests a notification when each of the passed\n// outpoints is confirmed spent (contained in a block connected to the main\n// chain) for the passed websocket client.  The request is automatically\n// removed once the notification has been sent.\nfunc (m *wsNotificationManager) RegisterSpentRequests(wsc *wsClient, ops []*wire.OutPoint) {\n\tm.queueNotification <- &notificationRegisterSpent{\n\t\twsc: wsc,\n\t\tops: ops,\n\t}\n}\n\n// addSpentRequests modifies a map of watched outpoints to sets of websocket\n// clients to add a new request watch all of the outpoints in ops and create\n// and send a notification when spent to the websocket client wsc.\nfunc (m *wsNotificationManager) addSpentRequests(opMap map[wire.OutPoint]map[chan struct{}]*wsClient,\n\twsc *wsClient, ops []*wire.OutPoint) {\n\n\tfor _, op := range ops {\n\t\t// Track the request in the client as well so it can be quickly\n\t\t// be removed on disconnect.\n\t\twsc.spentRequests[*op] = struct{}{}\n\n\t\t// Add the client to the list to notify when the outpoint is seen.\n\t\t// Create the list as needed.\n\t\tcmap, ok := opMap[*op]\n\t\tif !ok {\n\t\t\tcmap = make(map[chan struct{}]*wsClient)\n\t\t\topMap[*op] = cmap\n\t\t}\n\t\tcmap[wsc.quit] = wsc\n\t}\n\n\t// Check if any transactions spending these outputs already exists in\n\t// the mempool, if so send the notification immediately.\n\tspends := make(map[chainhash.Hash]*btcutil.Tx)\n\tfor _, op := range ops {\n\t\tspend := m.server.cfg.TxMemPool.CheckSpend(*op)\n\t\tif spend != nil {\n\t\t\trpcsLog.Debugf(\"Found existing mempool spend for \"+\n\t\t\t\t\"outpoint<%v>: %v\", op, spend.Hash())\n\t\t\tspends[*spend.Hash()] = spend\n\t\t}\n\t}\n\n\tfor _, spend := range spends {\n\t\tm.notifyForTx(opMap, nil, spend, nil)\n\t}\n}\n\n// UnregisterSpentRequest removes a request from the passed websocket client\n// to be notified when the passed outpoint is confirmed spent (contained in a\n// block connected to the main chain).\nfunc (m *wsNotificationManager) UnregisterSpentRequest(wsc *wsClient, op *wire.OutPoint) {\n\tm.queueNotification <- &notificationUnregisterSpent{\n\t\twsc: wsc,\n\t\top:  op,\n\t}\n}\n\n// removeSpentRequest modifies a map of watched outpoints to remove the\n// websocket client wsc from the set of clients to be notified when a\n// watched outpoint is spent.  If wsc is the last client, the outpoint\n// key is removed from the map.\nfunc (*wsNotificationManager) removeSpentRequest(ops map[wire.OutPoint]map[chan struct{}]*wsClient,\n\twsc *wsClient, op *wire.OutPoint) {\n\n\t// Remove the request tracking from the client.\n\tdelete(wsc.spentRequests, *op)\n\n\t// Remove the client from the list to notify.\n\tnotifyMap, ok := ops[*op]\n\tif !ok {\n\t\trpcsLog.Warnf(\"Attempt to remove nonexistent spent request \"+\n\t\t\t\"for websocket client %s\", wsc.addr)\n\t\treturn\n\t}\n\tdelete(notifyMap, wsc.quit)\n\n\t// Remove the map entry altogether if there are\n\t// no more clients interested in it.\n\tif len(notifyMap) == 0 {\n\t\tdelete(ops, *op)\n\t}\n}\n\n// txHexString returns the serialized transaction encoded in hexadecimal.\nfunc txHexString(tx *wire.MsgTx) string {\n\tbuf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))\n\t// Ignore Serialize's error, as writing to a bytes.buffer cannot fail.\n\ttx.Serialize(buf)\n\treturn hex.EncodeToString(buf.Bytes())\n}\n\n// blockDetails creates a BlockDetails struct to include in btcws notifications\n// from a block and a transaction's block index.\nfunc blockDetails(block *btcutil.Block, txIndex int) *btcjson.BlockDetails {\n\tif block == nil {\n\t\treturn nil\n\t}\n\treturn &btcjson.BlockDetails{\n\t\tHeight: block.Height(),\n\t\tHash:   block.Hash().String(),\n\t\tIndex:  txIndex,\n\t\tTime:   block.MsgBlock().Header.Timestamp.Unix(),\n\t}\n}\n\n// newRedeemingTxNotification returns a new marshalled redeemingtx notification\n// with the passed parameters.\nfunc newRedeemingTxNotification(txHex string, index int, block *btcutil.Block) ([]byte, error) {\n\t// Create and marshal the notification.\n\tntfn := btcjson.NewRedeemingTxNtfn(txHex, blockDetails(block, index))\n\treturn btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn)\n}\n\n// notifyForTxOuts examines each transaction output, notifying interested\n// websocket clients of the transaction if an output spends to a watched\n// address.  A spent notification request is automatically registered for\n// the client for each matching output.\nfunc (m *wsNotificationManager) notifyForTxOuts(ops map[wire.OutPoint]map[chan struct{}]*wsClient,\n\taddrs map[string]map[chan struct{}]*wsClient, tx *btcutil.Tx, block *btcutil.Block) {\n\n\t// Nothing to do if nobody is listening for address notifications.\n\tif len(addrs) == 0 {\n\t\treturn\n\t}\n\n\ttxHex := \"\"\n\twscNotified := make(map[chan struct{}]struct{})\n\tfor i, txOut := range tx.MsgTx().TxOut {\n\t\t_, txAddrs, _, err := txscript.ExtractPkScriptAddrs(\n\t\t\ttxOut.PkScript, m.server.cfg.ChainParams)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, txAddr := range txAddrs {\n\t\t\tcmap, ok := addrs[txAddr.EncodeAddress()]\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif txHex == \"\" {\n\t\t\t\ttxHex = txHexString(tx.MsgTx())\n\t\t\t}\n\t\t\tntfn := btcjson.NewRecvTxNtfn(txHex, blockDetails(block,\n\t\t\t\ttx.Index()))\n\n\t\t\tmarshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn)\n\t\t\tif err != nil {\n\t\t\t\trpcsLog.Errorf(\"Failed to marshal processedtx notification: %v\", err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\top := []*wire.OutPoint{wire.NewOutPoint(tx.Hash(), uint32(i))}\n\t\t\tfor wscQuit, wsc := range cmap {\n\t\t\t\tm.addSpentRequests(ops, wsc, op)\n\n\t\t\t\tif _, ok := wscNotified[wscQuit]; !ok {\n\t\t\t\t\twscNotified[wscQuit] = struct{}{}\n\t\t\t\t\twsc.QueueNotification(marshalledJSON)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// notifyRelevantTxAccepted examines the inputs and outputs of the passed\n// transaction, notifying websocket clients of outputs spending to a watched\n// address and inputs spending a watched outpoint.  Any outputs paying to a\n// watched address result in the output being watched as well for future\n// notifications.\nfunc (m *wsNotificationManager) notifyRelevantTxAccepted(tx *btcutil.Tx,\n\tclients map[chan struct{}]*wsClient) {\n\n\tclientsToNotify := m.subscribedClients(tx, clients)\n\n\tif len(clientsToNotify) != 0 {\n\t\tn := btcjson.NewRelevantTxAcceptedNtfn(txHexString(tx.MsgTx()))\n\t\tmarshalled, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, n)\n\t\tif err != nil {\n\t\t\trpcsLog.Errorf(\"Failed to marshal notification: %v\", err)\n\t\t\treturn\n\t\t}\n\t\tfor quitChan := range clientsToNotify {\n\t\t\tclients[quitChan].QueueNotification(marshalled)\n\t\t}\n\t}\n}\n\n// notifyForTx examines the inputs and outputs of the passed transaction,\n// notifying websocket clients of outputs spending to a watched address\n// and inputs spending a watched outpoint.\nfunc (m *wsNotificationManager) notifyForTx(ops map[wire.OutPoint]map[chan struct{}]*wsClient,\n\taddrs map[string]map[chan struct{}]*wsClient, tx *btcutil.Tx, block *btcutil.Block) {\n\n\tif len(ops) != 0 {\n\t\tm.notifyForTxIns(ops, tx, block)\n\t}\n\tif len(addrs) != 0 {\n\t\tm.notifyForTxOuts(ops, addrs, tx, block)\n\t}\n}\n\n// notifyForTxIns examines the inputs of the passed transaction and sends\n// interested websocket clients a redeemingtx notification if any inputs\n// spend a watched output.  If block is non-nil, any matching spent\n// requests are removed.\nfunc (m *wsNotificationManager) notifyForTxIns(ops map[wire.OutPoint]map[chan struct{}]*wsClient,\n\ttx *btcutil.Tx, block *btcutil.Block) {\n\n\t// Nothing to do if nobody is watching outpoints.\n\tif len(ops) == 0 {\n\t\treturn\n\t}\n\n\ttxHex := \"\"\n\twscNotified := make(map[chan struct{}]struct{})\n\tfor _, txIn := range tx.MsgTx().TxIn {\n\t\tprevOut := &txIn.PreviousOutPoint\n\t\tif cmap, ok := ops[*prevOut]; ok {\n\t\t\tif txHex == \"\" {\n\t\t\t\ttxHex = txHexString(tx.MsgTx())\n\t\t\t}\n\t\t\tmarshalledJSON, err := newRedeemingTxNotification(txHex, tx.Index(), block)\n\t\t\tif err != nil {\n\t\t\t\trpcsLog.Warnf(\"Failed to marshal redeemingtx notification: %v\", err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor wscQuit, wsc := range cmap {\n\t\t\t\tif block != nil {\n\t\t\t\t\tm.removeSpentRequest(ops, wsc, prevOut)\n\t\t\t\t}\n\n\t\t\t\tif _, ok := wscNotified[wscQuit]; !ok {\n\t\t\t\t\twscNotified[wscQuit] = struct{}{}\n\t\t\t\t\twsc.QueueNotification(marshalledJSON)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// RegisterTxOutAddressRequests requests notifications to the passed websocket\n// client when a transaction output spends to the passed address.\nfunc (m *wsNotificationManager) RegisterTxOutAddressRequests(wsc *wsClient, addrs []string) {\n\tm.queueNotification <- &notificationRegisterAddr{\n\t\twsc:   wsc,\n\t\taddrs: addrs,\n\t}\n}\n\n// addAddrRequests adds the websocket client wsc to the address to client set\n// addrMap so wsc will be notified for any mempool or block transaction outputs\n// spending to any of the addresses in addrs.\nfunc (*wsNotificationManager) addAddrRequests(addrMap map[string]map[chan struct{}]*wsClient,\n\twsc *wsClient, addrs []string) {\n\n\tfor _, addr := range addrs {\n\t\t// Track the request in the client as well so it can be quickly be\n\t\t// removed on disconnect.\n\t\twsc.addrRequests[addr] = struct{}{}\n\n\t\t// Add the client to the set of clients to notify when the\n\t\t// outpoint is seen.  Create map as needed.\n\t\tcmap, ok := addrMap[addr]\n\t\tif !ok {\n\t\t\tcmap = make(map[chan struct{}]*wsClient)\n\t\t\taddrMap[addr] = cmap\n\t\t}\n\t\tcmap[wsc.quit] = wsc\n\t}\n}\n\n// UnregisterTxOutAddressRequest removes a request from the passed websocket\n// client to be notified when a transaction spends to the passed address.\nfunc (m *wsNotificationManager) UnregisterTxOutAddressRequest(wsc *wsClient, addr string) {\n\tm.queueNotification <- &notificationUnregisterAddr{\n\t\twsc:  wsc,\n\t\taddr: addr,\n\t}\n}\n\n// removeAddrRequest removes the websocket client wsc from the address to\n// client set addrs so it will no longer receive notification updates for\n// any transaction outputs send to addr.\nfunc (*wsNotificationManager) removeAddrRequest(addrs map[string]map[chan struct{}]*wsClient,\n\twsc *wsClient, addr string) {\n\n\t// Remove the request tracking from the client.\n\tdelete(wsc.addrRequests, addr)\n\n\t// Remove the client from the list to notify.\n\tcmap, ok := addrs[addr]\n\tif !ok {\n\t\trpcsLog.Warnf(\"Attempt to remove nonexistent addr request \"+\n\t\t\t\"<%s> for websocket client %s\", addr, wsc.addr)\n\t\treturn\n\t}\n\tdelete(cmap, wsc.quit)\n\n\t// Remove the map entry altogether if there are no more clients\n\t// interested in it.\n\tif len(cmap) == 0 {\n\t\tdelete(addrs, addr)\n\t}\n}\n\n// AddClient adds the passed websocket client to the notification manager.\nfunc (m *wsNotificationManager) AddClient(wsc *wsClient) {\n\tm.queueNotification <- (*notificationRegisterClient)(wsc)\n}\n\n// RemoveClient removes the passed websocket client and all notifications\n// registered for it.\nfunc (m *wsNotificationManager) RemoveClient(wsc *wsClient) {\n\tselect {\n\tcase m.queueNotification <- (*notificationUnregisterClient)(wsc):\n\tcase <-m.quit:\n\t}\n}\n\n// Start starts the goroutines required for the manager to queue and process\n// websocket client notifications.\nfunc (m *wsNotificationManager) Start() {\n\tm.wg.Add(2)\n\tgo m.queueHandler()\n\tgo m.notificationHandler()\n}\n\n// WaitForShutdown blocks until all notification manager goroutines have\n// finished.\nfunc (m *wsNotificationManager) WaitForShutdown() {\n\tm.wg.Wait()\n}\n\n// Shutdown shuts down the manager, stopping the notification queue and\n// notification handler goroutines.\nfunc (m *wsNotificationManager) Shutdown() {\n\tclose(m.quit)\n}\n\n// newWsNotificationManager returns a new notification manager ready for use.\n// See wsNotificationManager for more details.\nfunc newWsNotificationManager(server *rpcServer) *wsNotificationManager {\n\treturn &wsNotificationManager{\n\t\tserver:            server,\n\t\tqueueNotification: make(chan interface{}),\n\t\tnotificationMsgs:  make(chan interface{}),\n\t\tnumClients:        make(chan int),\n\t\tquit:              make(chan struct{}),\n\t}\n}\n\n// wsResponse houses a message to send to a connected websocket client as\n// well as a channel to reply on when the message is sent.\ntype wsResponse struct {\n\tmsg      []byte\n\tdoneChan chan bool\n}\n\n// wsClient provides an abstraction for handling a websocket client.  The\n// overall data flow is split into 3 main goroutines, a possible 4th goroutine\n// for long-running operations (only started if request is made), and a\n// websocket manager which is used to allow things such as broadcasting\n// requested notifications to all connected websocket clients.   Inbound\n// messages are read via the inHandler goroutine and generally dispatched to\n// their own handler.  However, certain potentially long-running operations such\n// as rescans, are sent to the asyncHandler goroutine and are limited to one at a\n// time.  There are two outbound message types - one for responding to client\n// requests and another for async notifications.  Responses to client requests\n// use SendMessage which employs a buffered channel thereby limiting the number\n// of outstanding requests that can be made.  Notifications are sent via\n// QueueNotification which implements a queue via notificationQueueHandler to\n// ensure sending notifications from other subsystems can't block.  Ultimately,\n// all messages are sent via the outHandler.\ntype wsClient struct {\n\tsync.Mutex\n\n\t// server is the RPC server that is servicing the client.\n\tserver *rpcServer\n\n\t// conn is the underlying websocket connection.\n\tconn *websocket.Conn\n\n\t// disconnected indicated whether or not the websocket client is\n\t// disconnected.\n\tdisconnected bool\n\n\t// addr is the remote address of the client.\n\taddr string\n\n\t// authenticated specifies whether a client has been authenticated\n\t// and therefore is allowed to communicated over the websocket.\n\tauthenticated bool\n\n\t// isAdmin specifies whether a client may change the state of the server;\n\t// false means its access is only to the limited set of RPC calls.\n\tisAdmin bool\n\n\t// sessionID is a random ID generated for each client when connected.\n\t// These IDs may be queried by a client using the session RPC.  A change\n\t// to the session ID indicates that the client reconnected.\n\tsessionID uint64\n\n\t// verboseTxUpdates specifies whether a client has requested verbose\n\t// information about all new transactions.\n\tverboseTxUpdates bool\n\n\t// addrRequests is a set of addresses the caller has requested to be\n\t// notified about.  It is maintained here so all requests can be removed\n\t// when a wallet disconnects.  Owned by the notification manager.\n\taddrRequests map[string]struct{}\n\n\t// spentRequests is a set of unspent Outpoints a wallet has requested\n\t// notifications for when they are spent by a processed transaction.\n\t// Owned by the notification manager.\n\tspentRequests map[wire.OutPoint]struct{}\n\n\t// filterData is the new generation transaction filter backported from\n\t// github.com/decred/dcrd for the new backported `loadtxfilter` and\n\t// `rescanblocks` methods.\n\tfilterData *wsClientFilter\n\n\t// Networking infrastructure.\n\tserviceRequestSem semaphore\n\tntfnChan          chan []byte\n\tsendChan          chan wsResponse\n\tquit              chan struct{}\n\twg                sync.WaitGroup\n}\n\n// inHandler handles all incoming messages for the websocket connection.  It\n// must be run as a goroutine.\nfunc (c *wsClient) inHandler() {\nout:\n\tfor {\n\t\t// Break out of the loop once the quit channel has been closed.\n\t\t// Use a non-blocking select here so we fall through otherwise.\n\t\tselect {\n\t\tcase <-c.quit:\n\t\t\tbreak out\n\t\tdefault:\n\t\t}\n\n\t\t_, msg, err := c.conn.ReadMessage()\n\t\tif err != nil {\n\t\t\t// Log the error if it's not due to disconnecting.\n\t\t\tif err != io.EOF {\n\t\t\t\trpcsLog.Errorf(\"Websocket receive error from \"+\n\t\t\t\t\t\"%s: %v\", c.addr, err)\n\t\t\t}\n\t\t\tbreak out\n\t\t}\n\n\t\tvar batchedRequest bool\n\n\t\t// Determine request type\n\t\tif bytes.HasPrefix(msg, batchedRequestPrefix) {\n\t\t\tbatchedRequest = true\n\t\t}\n\n\t\tif !batchedRequest {\n\t\t\tvar req btcjson.Request\n\t\t\tvar reply json.RawMessage\n\t\t\terr = json.Unmarshal(msg, &req)\n\t\t\tif err != nil {\n\t\t\t\t// only process requests from authenticated clients\n\t\t\t\tif !c.authenticated {\n\t\t\t\t\tbreak out\n\t\t\t\t}\n\n\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\tCode:    btcjson.ErrRPCParse.Code,\n\t\t\t\t\tMessage: \"Failed to parse request: \" + err.Error(),\n\t\t\t\t}\n\t\t\t\treply, err = createMarshalledReply(btcjson.RpcVersion1, nil, nil, jsonErr)\n\t\t\t\tif err != nil {\n\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal reply: %v\", err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tc.SendMessage(reply, nil)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif req.Method == \"\" || req.Params == nil {\n\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\tCode:    btcjson.ErrRPCInvalidRequest.Code,\n\t\t\t\t\tMessage: \"Invalid request: malformed\",\n\t\t\t\t}\n\t\t\t\treply, err := createMarshalledReply(req.Jsonrpc, req.ID, nil, jsonErr)\n\t\t\t\tif err != nil {\n\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal reply: %v\", err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tc.SendMessage(reply, nil)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Valid requests with no ID (notifications) must not have a response\n\t\t\t// per the JSON-RPC spec.\n\t\t\tif req.ID == nil {\n\t\t\t\tif !c.authenticated {\n\t\t\t\t\tbreak out\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tcmd := parseCmd(&req)\n\t\t\tif cmd.err != nil {\n\t\t\t\t// Only process requests from authenticated clients\n\t\t\t\tif !c.authenticated {\n\t\t\t\t\tbreak out\n\t\t\t\t}\n\n\t\t\t\treply, err = createMarshalledReply(cmd.jsonrpc, cmd.id, nil, cmd.err)\n\t\t\t\tif err != nil {\n\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal reply: %v\", err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tc.SendMessage(reply, nil)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\trpcsLog.Debugf(\"Received command <%s> from %s\", cmd.method, c.addr)\n\n\t\t\t// Check auth.  The client is immediately disconnected if the\n\t\t\t// first request of an unauthentiated websocket client is not\n\t\t\t// the authenticate request, an authenticate request is received\n\t\t\t// when the client is already authenticated, or incorrect\n\t\t\t// authentication credentials are provided in the request.\n\t\t\tswitch authCmd, ok := cmd.cmd.(*btcjson.AuthenticateCmd); {\n\t\t\tcase c.authenticated && ok:\n\t\t\t\trpcsLog.Warnf(\"Websocket client %s is already authenticated\",\n\t\t\t\t\tc.addr)\n\t\t\t\tbreak out\n\t\t\tcase !c.authenticated && !ok:\n\t\t\t\trpcsLog.Warnf(\"Unauthenticated websocket message \" +\n\t\t\t\t\t\"received\")\n\t\t\t\tbreak out\n\t\t\tcase !c.authenticated:\n\t\t\t\t// Check credentials.\n\t\t\t\tlogin := authCmd.Username + \":\" + authCmd.Passphrase\n\t\t\t\tauth := \"Basic \" + base64.StdEncoding.EncodeToString([]byte(login))\n\t\t\t\tauthSha := sha256.Sum256([]byte(auth))\n\t\t\t\tcmp := subtle.ConstantTimeCompare(authSha[:], c.server.authsha[:])\n\t\t\t\tlimitcmp := subtle.ConstantTimeCompare(authSha[:], c.server.limitauthsha[:])\n\t\t\t\tif cmp != 1 && limitcmp != 1 {\n\t\t\t\t\trpcsLog.Warnf(\"Auth failure.\")\n\t\t\t\t\tbreak out\n\t\t\t\t}\n\t\t\t\tc.authenticated = true\n\t\t\t\tc.isAdmin = cmp == 1\n\n\t\t\t\t// Marshal and send response.\n\t\t\t\treply, err = createMarshalledReply(cmd.jsonrpc, cmd.id, nil, nil)\n\t\t\t\tif err != nil {\n\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal authenticate reply: \"+\n\t\t\t\t\t\t\"%v\", err.Error())\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tc.SendMessage(reply, nil)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Check if the client is using limited RPC credentials and\n\t\t\t// error when not authorized to call the supplied RPC.\n\t\t\tif !c.isAdmin {\n\t\t\t\tif _, ok := rpcLimited[req.Method]; !ok {\n\t\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\t\tCode:    btcjson.ErrRPCInvalidParams.Code,\n\t\t\t\t\t\tMessage: \"limited user not authorized for this method\",\n\t\t\t\t\t}\n\t\t\t\t\t// Marshal and send response.\n\t\t\t\t\treply, err = createMarshalledReply(\"\", req.ID, nil, jsonErr)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal parse failure \"+\n\t\t\t\t\t\t\t\"reply: %v\", err)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tc.SendMessage(reply, nil)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Asynchronously handle the request.  A semaphore is used to\n\t\t\t// limit the number of concurrent requests currently being\n\t\t\t// serviced.  If the semaphore can not be acquired, simply wait\n\t\t\t// until a request finished before reading the next RPC request\n\t\t\t// from the websocket client.\n\t\t\t//\n\t\t\t// This could be a little fancier by timing out and erroring\n\t\t\t// when it takes too long to service the request, but if that is\n\t\t\t// done, the read of the next request should not be blocked by\n\t\t\t// this semaphore, otherwise the next request will be read and\n\t\t\t// will probably sit here for another few seconds before timing\n\t\t\t// out as well.  This will cause the total timeout duration for\n\t\t\t// later requests to be much longer than the check here would\n\t\t\t// imply.\n\t\t\t//\n\t\t\t// If a timeout is added, the semaphore acquiring should be\n\t\t\t// moved inside of the new goroutine with a select statement\n\t\t\t// that also reads a time.After channel.  This will unblock the\n\t\t\t// read of the next request from the websocket client and allow\n\t\t\t// many requests to be waited on concurrently.\n\t\t\tc.serviceRequestSem.acquire()\n\t\t\tgo func() {\n\t\t\t\tc.serviceRequest(cmd)\n\t\t\t\tc.serviceRequestSem.release()\n\t\t\t}()\n\t\t}\n\n\t\t// Process a batched request\n\t\tif batchedRequest {\n\t\t\tvar batchedRequests []interface{}\n\t\t\tvar results []json.RawMessage\n\t\t\tvar batchSize int\n\t\t\tvar reply json.RawMessage\n\t\t\tc.serviceRequestSem.acquire()\n\t\t\terr = json.Unmarshal(msg, &batchedRequests)\n\t\t\tif err != nil {\n\t\t\t\t// Only process requests from authenticated clients\n\t\t\t\tif !c.authenticated {\n\t\t\t\t\tbreak out\n\t\t\t\t}\n\n\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\tCode: btcjson.ErrRPCParse.Code,\n\t\t\t\t\tMessage: fmt.Sprintf(\"Failed to parse request: %v\",\n\t\t\t\t\t\terr),\n\t\t\t\t}\n\t\t\t\treply, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr)\n\t\t\t\tif err != nil {\n\t\t\t\t\trpcsLog.Errorf(\"Failed to create reply: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tif reply != nil {\n\t\t\t\t\tresults = append(results, reply)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif err == nil {\n\t\t\t\t// Response with an empty batch error if the batch size is zero\n\t\t\t\tif len(batchedRequests) == 0 {\n\t\t\t\t\tif !c.authenticated {\n\t\t\t\t\t\tbreak out\n\t\t\t\t\t}\n\n\t\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\t\tCode:    btcjson.ErrRPCInvalidRequest.Code,\n\t\t\t\t\t\tMessage: \"Invalid request: empty batch\",\n\t\t\t\t\t}\n\t\t\t\t\treply, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal reply: %v\", err)\n\t\t\t\t\t}\n\n\t\t\t\t\tif reply != nil {\n\t\t\t\t\t\tresults = append(results, reply)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Process each batch entry individually\n\t\t\t\tif len(batchedRequests) > 0 {\n\t\t\t\t\tbatchSize = len(batchedRequests)\n\t\t\t\t\tfor _, entry := range batchedRequests {\n\t\t\t\t\t\tvar reqBytes []byte\n\t\t\t\t\t\treqBytes, err = json.Marshal(entry)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t// Only process requests from authenticated clients\n\t\t\t\t\t\t\tif !c.authenticated {\n\t\t\t\t\t\t\t\tbreak out\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\t\t\t\tCode: btcjson.ErrRPCInvalidRequest.Code,\n\t\t\t\t\t\t\t\tMessage: fmt.Sprintf(\"Invalid request: %v\",\n\t\t\t\t\t\t\t\t\terr),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treply, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\trpcsLog.Errorf(\"Failed to create reply: %v\", err)\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif reply != nil {\n\t\t\t\t\t\t\t\tresults = append(results, reply)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar req btcjson.Request\n\t\t\t\t\t\terr := json.Unmarshal(reqBytes, &req)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t// Only process requests from authenticated clients\n\t\t\t\t\t\t\tif !c.authenticated {\n\t\t\t\t\t\t\t\tbreak out\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\t\t\t\tCode: btcjson.ErrRPCInvalidRequest.Code,\n\t\t\t\t\t\t\t\tMessage: fmt.Sprintf(\"Invalid request: %v\",\n\t\t\t\t\t\t\t\t\terr),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treply, err = btcjson.MarshalResponse(btcjson.RpcVersion2, nil, nil, jsonErr)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\trpcsLog.Errorf(\"Failed to create reply: %v\", err)\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif reply != nil {\n\t\t\t\t\t\t\t\tresults = append(results, reply)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif req.Method == \"\" || req.Params == nil {\n\t\t\t\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\t\t\t\tCode:    btcjson.ErrRPCInvalidRequest.Code,\n\t\t\t\t\t\t\t\tMessage: \"Invalid request: malformed\",\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treply, err := createMarshalledReply(req.Jsonrpc, req.ID, nil, jsonErr)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal reply: %v\", err)\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif reply != nil {\n\t\t\t\t\t\t\t\tresults = append(results, reply)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Valid requests with no ID (notifications) must not have a response\n\t\t\t\t\t\t// per the JSON-RPC spec.\n\t\t\t\t\t\tif req.ID == nil {\n\t\t\t\t\t\t\tif !c.authenticated {\n\t\t\t\t\t\t\t\tbreak out\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcmd := parseCmd(&req)\n\t\t\t\t\t\tif cmd.err != nil {\n\t\t\t\t\t\t\t// Only process requests from authenticated clients\n\t\t\t\t\t\t\tif !c.authenticated {\n\t\t\t\t\t\t\t\tbreak out\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treply, err = createMarshalledReply(cmd.jsonrpc, cmd.id, nil, cmd.err)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal reply: %v\", err)\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif reply != nil {\n\t\t\t\t\t\t\t\tresults = append(results, reply)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trpcsLog.Debugf(\"Received command <%s> from %s\", cmd.method, c.addr)\n\n\t\t\t\t\t\t// Check auth.  The client is immediately disconnected if the\n\t\t\t\t\t\t// first request of an unauthentiated websocket client is not\n\t\t\t\t\t\t// the authenticate request, an authenticate request is received\n\t\t\t\t\t\t// when the client is already authenticated, or incorrect\n\t\t\t\t\t\t// authentication credentials are provided in the request.\n\t\t\t\t\t\tswitch authCmd, ok := cmd.cmd.(*btcjson.AuthenticateCmd); {\n\t\t\t\t\t\tcase c.authenticated && ok:\n\t\t\t\t\t\t\trpcsLog.Warnf(\"Websocket client %s is already authenticated\",\n\t\t\t\t\t\t\t\tc.addr)\n\t\t\t\t\t\t\tbreak out\n\t\t\t\t\t\tcase !c.authenticated && !ok:\n\t\t\t\t\t\t\trpcsLog.Warnf(\"Unauthenticated websocket message \" +\n\t\t\t\t\t\t\t\t\"received\")\n\t\t\t\t\t\t\tbreak out\n\t\t\t\t\t\tcase !c.authenticated:\n\t\t\t\t\t\t\t// Check credentials.\n\t\t\t\t\t\t\tlogin := authCmd.Username + \":\" + authCmd.Passphrase\n\t\t\t\t\t\t\tauth := \"Basic \" + base64.StdEncoding.EncodeToString([]byte(login))\n\t\t\t\t\t\t\tauthSha := sha256.Sum256([]byte(auth))\n\t\t\t\t\t\t\tcmp := subtle.ConstantTimeCompare(authSha[:], c.server.authsha[:])\n\t\t\t\t\t\t\tlimitcmp := subtle.ConstantTimeCompare(authSha[:], c.server.limitauthsha[:])\n\t\t\t\t\t\t\tif cmp != 1 && limitcmp != 1 {\n\t\t\t\t\t\t\t\trpcsLog.Warnf(\"Auth failure.\")\n\t\t\t\t\t\t\t\tbreak out\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tc.authenticated = true\n\t\t\t\t\t\t\tc.isAdmin = cmp == 1\n\n\t\t\t\t\t\t\t// Marshal and send response.\n\t\t\t\t\t\t\treply, err = createMarshalledReply(cmd.jsonrpc, cmd.id, nil, nil)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal authenticate reply: \"+\n\t\t\t\t\t\t\t\t\t\"%v\", err.Error())\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif reply != nil {\n\t\t\t\t\t\t\t\tresults = append(results, reply)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check if the client is using limited RPC credentials and\n\t\t\t\t\t\t// error when not authorized to call the supplied RPC.\n\t\t\t\t\t\tif !c.isAdmin {\n\t\t\t\t\t\t\tif _, ok := rpcLimited[req.Method]; !ok {\n\t\t\t\t\t\t\t\tjsonErr := &btcjson.RPCError{\n\t\t\t\t\t\t\t\t\tCode:    btcjson.ErrRPCInvalidParams.Code,\n\t\t\t\t\t\t\t\t\tMessage: \"limited user not authorized for this method\",\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Marshal and send response.\n\t\t\t\t\t\t\t\treply, err = createMarshalledReply(req.Jsonrpc, req.ID, nil, jsonErr)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal parse failure \"+\n\t\t\t\t\t\t\t\t\t\t\"reply: %v\", err)\n\t\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif reply != nil {\n\t\t\t\t\t\t\t\t\tresults = append(results, reply)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Lookup the websocket extension for the command, if it doesn't\n\t\t\t\t\t\t// exist fallback to handling the command as a standard command.\n\t\t\t\t\t\tvar resp interface{}\n\t\t\t\t\t\twsHandler, ok := wsHandlers[cmd.method]\n\t\t\t\t\t\tif ok {\n\t\t\t\t\t\t\tresp, err = wsHandler(c, cmd.cmd)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresp, err = c.server.standardCmdResult(cmd, nil)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Marshal request output.\n\t\t\t\t\t\treply, err := createMarshalledReply(cmd.jsonrpc, cmd.id, resp, err)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal reply for <%s> \"+\n\t\t\t\t\t\t\t\t\"command: %v\", cmd.method, err)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif reply != nil {\n\t\t\t\t\t\t\tresults = append(results, reply)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// generate reply\n\t\t\tvar payload = []byte{}\n\t\t\tif batchedRequest && batchSize > 0 {\n\t\t\t\tif len(results) > 0 {\n\t\t\t\t\t// Form the batched response json\n\t\t\t\t\tvar buffer bytes.Buffer\n\t\t\t\t\tbuffer.WriteByte('[')\n\t\t\t\t\tfor idx, marshalledReply := range results {\n\t\t\t\t\t\tif idx == len(results)-1 {\n\t\t\t\t\t\t\tbuffer.Write(marshalledReply)\n\t\t\t\t\t\t\tbuffer.WriteByte(']')\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbuffer.Write(marshalledReply)\n\t\t\t\t\t\tbuffer.WriteByte(',')\n\t\t\t\t\t}\n\t\t\t\t\tpayload = buffer.Bytes()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !batchedRequest || batchSize == 0 {\n\t\t\t\t// Respond with the first results entry for single requests\n\t\t\t\tif len(results) > 0 {\n\t\t\t\t\tpayload = results[0]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tc.SendMessage(payload, nil)\n\t\t\tc.serviceRequestSem.release()\n\t\t}\n\t}\n\n\t// Ensure the connection is closed.\n\tc.Disconnect()\n\tc.wg.Done()\n\trpcsLog.Tracef(\"Websocket client input handler done for %s\", c.addr)\n}\n\n// serviceRequest services a parsed RPC request by looking up and executing the\n// appropriate RPC handler.  The response is marshalled and sent to the\n// websocket client.\nfunc (c *wsClient) serviceRequest(r *parsedRPCCmd) {\n\tvar (\n\t\tresult interface{}\n\t\terr    error\n\t)\n\n\t// Lookup the websocket extension for the command and if it doesn't\n\t// exist fallback to handling the command as a standard command.\n\twsHandler, ok := wsHandlers[r.method]\n\tif ok {\n\t\tresult, err = wsHandler(c, r.cmd)\n\t} else {\n\t\tresult, err = c.server.standardCmdResult(r, nil)\n\t}\n\treply, err := createMarshalledReply(r.jsonrpc, r.id, result, err)\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Failed to marshal reply for <%s> \"+\n\t\t\t\"command: %v\", r.method, err)\n\t\treturn\n\t}\n\tc.SendMessage(reply, nil)\n}\n\n// notificationQueueHandler handles the queuing of outgoing notifications for\n// the websocket client.  This runs as a muxer for various sources of input to\n// ensure that queuing up notifications to be sent will not block.  Otherwise,\n// slow clients could bog down the other systems (such as the mempool or block\n// manager) which are queuing the data.  The data is passed on to outHandler to\n// actually be written.  It must be run as a goroutine.\nfunc (c *wsClient) notificationQueueHandler() {\n\tntfnSentChan := make(chan bool, 1) // nonblocking sync\n\n\t// pendingNtfns is used as a queue for notifications that are ready to\n\t// be sent once there are no outstanding notifications currently being\n\t// sent.  The waiting flag is used over simply checking for items in the\n\t// pending list to ensure cleanup knows what has and hasn't been sent\n\t// to the outHandler.  Currently no special cleanup is needed, however\n\t// if something like a done channel is added to notifications in the\n\t// future, not knowing what has and hasn't been sent to the outHandler\n\t// (and thus who should respond to the done channel) would be\n\t// problematic without using this approach.\n\tpendingNtfns := list.New()\n\twaiting := false\nout:\n\tfor {\n\t\tselect {\n\t\t// This channel is notified when a message is being queued to\n\t\t// be sent across the network socket.  It will either send the\n\t\t// message immediately if a send is not already in progress, or\n\t\t// queue the message to be sent once the other pending messages\n\t\t// are sent.\n\t\tcase msg := <-c.ntfnChan:\n\t\t\tif !waiting {\n\t\t\t\tc.SendMessage(msg, ntfnSentChan)\n\t\t\t} else {\n\t\t\t\tpendingNtfns.PushBack(msg)\n\t\t\t}\n\t\t\twaiting = true\n\n\t\t// This channel is notified when a notification has been sent\n\t\t// across the network socket.\n\t\tcase <-ntfnSentChan:\n\t\t\t// No longer waiting if there are no more messages in\n\t\t\t// the pending messages queue.\n\t\t\tnext := pendingNtfns.Front()\n\t\t\tif next == nil {\n\t\t\t\twaiting = false\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Notify the outHandler about the next item to\n\t\t\t// asynchronously send.\n\t\t\tmsg := pendingNtfns.Remove(next).([]byte)\n\t\t\tc.SendMessage(msg, ntfnSentChan)\n\n\t\tcase <-c.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\t// Drain any wait channels before exiting so nothing is left waiting\n\t// around to send.\ncleanup:\n\tfor {\n\t\tselect {\n\t\tcase <-c.ntfnChan:\n\t\tcase <-ntfnSentChan:\n\t\tdefault:\n\t\t\tbreak cleanup\n\t\t}\n\t}\n\tc.wg.Done()\n\trpcsLog.Tracef(\"Websocket client notification queue handler done \"+\n\t\t\"for %s\", c.addr)\n}\n\n// outHandler handles all outgoing messages for the websocket connection.  It\n// must be run as a goroutine.  It uses a buffered channel to serialize output\n// messages while allowing the sender to continue running asynchronously.  It\n// must be run as a goroutine.\nfunc (c *wsClient) outHandler() {\nout:\n\tfor {\n\t\t// Send any messages ready for send until the quit channel is\n\t\t// closed.\n\t\tselect {\n\t\tcase r := <-c.sendChan:\n\t\t\terr := c.conn.WriteMessage(websocket.TextMessage, r.msg)\n\t\t\tif err != nil {\n\t\t\t\tc.Disconnect()\n\t\t\t\tbreak out\n\t\t\t}\n\t\t\tif r.doneChan != nil {\n\t\t\t\tr.doneChan <- true\n\t\t\t}\n\n\t\tcase <-c.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\t// Drain any wait channels before exiting so nothing is left waiting\n\t// around to send.\ncleanup:\n\tfor {\n\t\tselect {\n\t\tcase r := <-c.sendChan:\n\t\t\tif r.doneChan != nil {\n\t\t\t\tr.doneChan <- false\n\t\t\t}\n\t\tdefault:\n\t\t\tbreak cleanup\n\t\t}\n\t}\n\tc.wg.Done()\n\trpcsLog.Tracef(\"Websocket client output handler done for %s\", c.addr)\n}\n\n// SendMessage sends the passed json to the websocket client.  It is backed\n// by a buffered channel, so it will not block until the send channel is full.\n// Note however that QueueNotification must be used for sending async\n// notifications instead of the this function.  This approach allows a limit to\n// the number of outstanding requests a client can make without preventing or\n// blocking on async notifications.\nfunc (c *wsClient) SendMessage(marshalledJSON []byte, doneChan chan bool) {\n\t// Don't send the message if disconnected.\n\tif c.Disconnected() {\n\t\tif doneChan != nil {\n\t\t\tdoneChan <- false\n\t\t}\n\t\treturn\n\t}\n\n\tc.sendChan <- wsResponse{msg: marshalledJSON, doneChan: doneChan}\n}\n\n// ErrClientQuit describes the error where a client send is not processed due\n// to the client having already been disconnected or dropped.\nvar ErrClientQuit = errors.New(\"client quit\")\n\n// QueueNotification queues the passed notification to be sent to the websocket\n// client.  This function, as the name implies, is only intended for\n// notifications since it has additional logic to prevent other subsystems, such\n// as the memory pool and block manager, from blocking even when the send\n// channel is full.\n//\n// If the client is in the process of shutting down, this function returns\n// ErrClientQuit.  This is intended to be checked by long-running notification\n// handlers to stop processing if there is no more work needed to be done.\nfunc (c *wsClient) QueueNotification(marshalledJSON []byte) error {\n\t// Don't queue the message if disconnected.\n\tif c.Disconnected() {\n\t\treturn ErrClientQuit\n\t}\n\n\tc.ntfnChan <- marshalledJSON\n\treturn nil\n}\n\n// Disconnected returns whether or not the websocket client is disconnected.\nfunc (c *wsClient) Disconnected() bool {\n\tc.Lock()\n\tisDisconnected := c.disconnected\n\tc.Unlock()\n\n\treturn isDisconnected\n}\n\n// Disconnect disconnects the websocket client.\nfunc (c *wsClient) Disconnect() {\n\tc.Lock()\n\tdefer c.Unlock()\n\n\t// Nothing to do if already disconnected.\n\tif c.disconnected {\n\t\treturn\n\t}\n\n\trpcsLog.Tracef(\"Disconnecting websocket client %s\", c.addr)\n\tclose(c.quit)\n\tc.conn.Close()\n\tc.disconnected = true\n}\n\n// Start begins processing input and output messages.\nfunc (c *wsClient) Start() {\n\trpcsLog.Tracef(\"Starting websocket client %s\", c.addr)\n\n\t// Start processing input and output.\n\tc.wg.Add(3)\n\tgo c.inHandler()\n\tgo c.notificationQueueHandler()\n\tgo c.outHandler()\n}\n\n// WaitForShutdown blocks until the websocket client goroutines are stopped\n// and the connection is closed.\nfunc (c *wsClient) WaitForShutdown() {\n\tc.wg.Wait()\n}\n\n// newWebsocketClient returns a new websocket client given the notification\n// manager, websocket connection, remote address, and whether or not the client\n// has already been authenticated (via HTTP Basic access authentication).  The\n// returned client is ready to start.  Once started, the client will process\n// incoming and outgoing messages in separate goroutines complete with queuing\n// and asynchrous handling for long-running operations.\nfunc newWebsocketClient(server *rpcServer, conn *websocket.Conn,\n\tremoteAddr string, authenticated bool, isAdmin bool) (*wsClient, error) {\n\n\tsessionID, err := wire.RandomUint64()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tclient := &wsClient{\n\t\tconn:              conn,\n\t\taddr:              remoteAddr,\n\t\tauthenticated:     authenticated,\n\t\tisAdmin:           isAdmin,\n\t\tsessionID:         sessionID,\n\t\tserver:            server,\n\t\taddrRequests:      make(map[string]struct{}),\n\t\tspentRequests:     make(map[wire.OutPoint]struct{}),\n\t\tserviceRequestSem: makeSemaphore(cfg.RPCMaxConcurrentReqs),\n\t\tntfnChan:          make(chan []byte, 1), // nonblocking sync\n\t\tsendChan:          make(chan wsResponse, websocketSendBufferSize),\n\t\tquit:              make(chan struct{}),\n\t}\n\treturn client, nil\n}\n\n// handleWebsocketHelp implements the help command for websocket connections.\nfunc handleWebsocketHelp(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\tcmd, ok := icmd.(*btcjson.HelpCmd)\n\tif !ok {\n\t\treturn nil, btcjson.ErrRPCInternal\n\t}\n\n\t// Provide a usage overview of all commands when no specific command\n\t// was specified.\n\tvar command string\n\tif cmd.Command != nil {\n\t\tcommand = *cmd.Command\n\t}\n\tif command == \"\" {\n\t\tusage, err := wsc.server.helpCacher.rpcUsage(true)\n\t\tif err != nil {\n\t\t\tcontext := \"Failed to generate RPC usage\"\n\t\t\treturn nil, internalRPCError(err.Error(), context)\n\t\t}\n\t\treturn usage, nil\n\t}\n\n\t// Check that the command asked for is supported and implemented.\n\t// Search the list of websocket handlers as well as the main list of\n\t// handlers since help should only be provided for those cases.\n\tvalid := true\n\tif _, ok := rpcHandlers[command]; !ok {\n\t\tif _, ok := wsHandlers[command]; !ok {\n\t\t\tvalid = false\n\t\t}\n\t}\n\tif !valid {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\tMessage: \"Unknown command: \" + command,\n\t\t}\n\t}\n\n\t// Get the help for the command.\n\thelp, err := wsc.server.helpCacher.rpcMethodHelp(command)\n\tif err != nil {\n\t\tcontext := \"Failed to generate help\"\n\t\treturn nil, internalRPCError(err.Error(), context)\n\t}\n\treturn help, nil\n}\n\n// handleLoadTxFilter implements the loadtxfilter command extension for\n// websocket connections.\n//\n// NOTE: This extension is ported from github.com/decred/dcrd\nfunc handleLoadTxFilter(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\tcmd := icmd.(*btcjson.LoadTxFilterCmd)\n\n\toutPoints := make([]wire.OutPoint, len(cmd.OutPoints))\n\tfor i := range cmd.OutPoints {\n\t\thash, err := chainhash.NewHashFromStr(cmd.OutPoints[i].Hash)\n\t\tif err != nil {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCInvalidParameter,\n\t\t\t\tMessage: err.Error(),\n\t\t\t}\n\t\t}\n\t\toutPoints[i] = wire.OutPoint{\n\t\t\tHash:  *hash,\n\t\t\tIndex: cmd.OutPoints[i].Index,\n\t\t}\n\t}\n\n\tparams := wsc.server.cfg.ChainParams\n\n\twsc.Lock()\n\tif cmd.Reload || wsc.filterData == nil {\n\t\twsc.filterData = newWSClientFilter(cmd.Addresses, outPoints,\n\t\t\tparams)\n\t\twsc.Unlock()\n\t} else {\n\t\twsc.Unlock()\n\n\t\twsc.filterData.mu.Lock()\n\t\tfor _, a := range cmd.Addresses {\n\t\t\twsc.filterData.addAddressStr(a, params)\n\t\t}\n\t\tfor i := range outPoints {\n\t\t\twsc.filterData.addUnspentOutPoint(&outPoints[i])\n\t\t}\n\t\twsc.filterData.mu.Unlock()\n\t}\n\n\treturn nil, nil\n}\n\n// handleNotifyBlocks implements the notifyblocks command extension for\n// websocket connections.\nfunc handleNotifyBlocks(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\twsc.server.ntfnMgr.RegisterBlockUpdates(wsc)\n\treturn nil, nil\n}\n\n// handleSession implements the session command extension for websocket\n// connections.\nfunc handleSession(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\treturn &btcjson.SessionResult{SessionID: wsc.sessionID}, nil\n}\n\n// handleStopNotifyBlocks implements the stopnotifyblocks command extension for\n// websocket connections.\nfunc handleStopNotifyBlocks(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\twsc.server.ntfnMgr.UnregisterBlockUpdates(wsc)\n\treturn nil, nil\n}\n\n// handleNotifySpent implements the notifyspent command extension for\n// websocket connections.\nfunc handleNotifySpent(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\tcmd, ok := icmd.(*btcjson.NotifySpentCmd)\n\tif !ok {\n\t\treturn nil, btcjson.ErrRPCInternal\n\t}\n\n\toutpoints, err := deserializeOutpoints(cmd.OutPoints)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\twsc.server.ntfnMgr.RegisterSpentRequests(wsc, outpoints)\n\treturn nil, nil\n}\n\n// handleNotifyNewTransactions implements the notifynewtransactions command\n// extension for websocket connections.\nfunc handleNotifyNewTransactions(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\tcmd, ok := icmd.(*btcjson.NotifyNewTransactionsCmd)\n\tif !ok {\n\t\treturn nil, btcjson.ErrRPCInternal\n\t}\n\n\twsc.verboseTxUpdates = cmd.Verbose != nil && *cmd.Verbose\n\twsc.server.ntfnMgr.RegisterNewMempoolTxsUpdates(wsc)\n\treturn nil, nil\n}\n\n// handleStopNotifyNewTransactions implements the stopnotifynewtransactions\n// command extension for websocket connections.\nfunc handleStopNotifyNewTransactions(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\twsc.server.ntfnMgr.UnregisterNewMempoolTxsUpdates(wsc)\n\treturn nil, nil\n}\n\n// handleNotifyReceived implements the notifyreceived command extension for\n// websocket connections.\nfunc handleNotifyReceived(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\tcmd, ok := icmd.(*btcjson.NotifyReceivedCmd)\n\tif !ok {\n\t\treturn nil, btcjson.ErrRPCInternal\n\t}\n\n\t// Decode addresses to validate input, but the strings slice is used\n\t// directly if these are all ok.\n\terr := checkAddressValidity(cmd.Addresses, wsc.server.cfg.ChainParams)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\twsc.server.ntfnMgr.RegisterTxOutAddressRequests(wsc, cmd.Addresses)\n\treturn nil, nil\n}\n\n// handleStopNotifySpent implements the stopnotifyspent command extension for\n// websocket connections.\nfunc handleStopNotifySpent(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\tcmd, ok := icmd.(*btcjson.StopNotifySpentCmd)\n\tif !ok {\n\t\treturn nil, btcjson.ErrRPCInternal\n\t}\n\n\toutpoints, err := deserializeOutpoints(cmd.OutPoints)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfor _, outpoint := range outpoints {\n\t\twsc.server.ntfnMgr.UnregisterSpentRequest(wsc, outpoint)\n\t}\n\n\treturn nil, nil\n}\n\n// handleStopNotifyReceived implements the stopnotifyreceived command extension\n// for websocket connections.\nfunc handleStopNotifyReceived(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\tcmd, ok := icmd.(*btcjson.StopNotifyReceivedCmd)\n\tif !ok {\n\t\treturn nil, btcjson.ErrRPCInternal\n\t}\n\n\t// Decode addresses to validate input, but the strings slice is used\n\t// directly if these are all ok.\n\terr := checkAddressValidity(cmd.Addresses, wsc.server.cfg.ChainParams)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfor _, addr := range cmd.Addresses {\n\t\twsc.server.ntfnMgr.UnregisterTxOutAddressRequest(wsc, addr)\n\t}\n\n\treturn nil, nil\n}\n\n// checkAddressValidity checks the validity of each address in the passed\n// string slice. It does this by attempting to decode each address using the\n// current active network parameters. If any single address fails to decode\n// properly, the function returns an error. Otherwise, nil is returned.\nfunc checkAddressValidity(addrs []string, params *chaincfg.Params) error {\n\tfor _, addr := range addrs {\n\t\t_, err := btcutil.DecodeAddress(addr, params)\n\t\tif err != nil {\n\t\t\treturn &btcjson.RPCError{\n\t\t\t\tCode: btcjson.ErrRPCInvalidAddressOrKey,\n\t\t\t\tMessage: fmt.Sprintf(\"Invalid address or key: %v\",\n\t\t\t\t\taddr),\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// deserializeOutpoints deserializes each serialized outpoint.\nfunc deserializeOutpoints(serializedOuts []btcjson.OutPoint) ([]*wire.OutPoint, error) {\n\toutpoints := make([]*wire.OutPoint, 0, len(serializedOuts))\n\tfor i := range serializedOuts {\n\t\tblockHash, err := chainhash.NewHashFromStr(serializedOuts[i].Hash)\n\t\tif err != nil {\n\t\t\treturn nil, rpcDecodeHexError(serializedOuts[i].Hash)\n\t\t}\n\t\tindex := serializedOuts[i].Index\n\t\toutpoints = append(outpoints, wire.NewOutPoint(blockHash, index))\n\t}\n\n\treturn outpoints, nil\n}\n\ntype rescanKeys struct {\n\taddrs   map[string]struct{}\n\tunspent map[wire.OutPoint]struct{}\n}\n\n// unspentSlice returns a slice of currently-unspent outpoints for the rescan\n// lookup keys.  This is primarily intended to be used to register outpoints\n// for continuous notifications after a rescan has completed.\nfunc (r *rescanKeys) unspentSlice() []*wire.OutPoint {\n\tops := make([]*wire.OutPoint, 0, len(r.unspent))\n\tfor op := range r.unspent {\n\t\topCopy := op\n\t\tops = append(ops, &opCopy)\n\t}\n\treturn ops\n}\n\n// ErrRescanReorg defines the error that is returned when an unrecoverable\n// reorganize is detected during a rescan.\nvar ErrRescanReorg = btcjson.RPCError{\n\tCode:    btcjson.ErrRPCDatabase,\n\tMessage: \"Reorganize\",\n}\n\n// rescanBlock rescans all transactions in a single block.  This is a helper\n// function for handleRescan.\nfunc rescanBlock(wsc *wsClient, lookups *rescanKeys, blk *btcutil.Block) {\n\tfor _, tx := range blk.Transactions() {\n\t\t// Hexadecimal representation of this tx.  Only created if\n\t\t// needed, and reused for later notifications if already made.\n\t\tvar txHex string\n\n\t\t// All inputs and outputs must be iterated through to correctly\n\t\t// modify the unspent map, however, just a single notification\n\t\t// for any matching transaction inputs or outputs should be\n\t\t// created and sent.\n\t\tspentNotified := false\n\t\trecvNotified := false\n\n\t\t// notifySpend is a closure we'll use when we first detect that\n\t\t// a transactions spends an outpoint/script in our filter list.\n\t\tnotifySpend := func() error {\n\t\t\tif txHex == \"\" {\n\t\t\t\ttxHex = txHexString(tx.MsgTx())\n\t\t\t}\n\t\t\tmarshalledJSON, err := newRedeemingTxNotification(\n\t\t\t\ttxHex, tx.Index(), blk,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"unable to marshal \"+\n\t\t\t\t\t\"btcjson.RedeeminTxNtfn: %v\", err)\n\t\t\t}\n\n\t\t\treturn wsc.QueueNotification(marshalledJSON)\n\t\t}\n\n\t\t// We'll start by iterating over the transaction's inputs to\n\t\t// determine if it spends an outpoint/script in our filter list.\n\t\tfor _, txin := range tx.MsgTx().TxIn {\n\t\t\t// If it spends an outpoint, we'll dispatch a spend\n\t\t\t// notification for the transaction.\n\t\t\tif _, ok := lookups.unspent[txin.PreviousOutPoint]; ok {\n\t\t\t\tdelete(lookups.unspent, txin.PreviousOutPoint)\n\n\t\t\t\tif spentNotified {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\terr := notifySpend()\n\n\t\t\t\t// Stop the rescan early if the websocket client\n\t\t\t\t// disconnected.\n\t\t\t\tif err == ErrClientQuit {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err != nil {\n\t\t\t\t\trpcsLog.Errorf(\"Unable to notify \"+\n\t\t\t\t\t\t\"redeeming transaction %v: %v\",\n\t\t\t\t\t\ttx.Hash(), err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tspentNotified = true\n\t\t\t}\n\n\t\t\t// We'll also recompute the pkScript the input is\n\t\t\t// attempting to spend to determine whether it is\n\t\t\t// relevant to us.\n\t\t\tpkScript, err := txscript.ComputePkScript(\n\t\t\t\ttxin.SignatureScript, txin.Witness,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\taddr, err := pkScript.Address(wsc.server.cfg.ChainParams)\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// If it is, we'll also dispatch a spend notification\n\t\t\t// for this transaction if we haven't already.\n\t\t\tif _, ok := lookups.addrs[addr.String()]; ok {\n\t\t\t\tif spentNotified {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\terr := notifySpend()\n\n\t\t\t\t// Stop the rescan early if the websocket client\n\t\t\t\t// disconnected.\n\t\t\t\tif err == ErrClientQuit {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err != nil {\n\t\t\t\t\trpcsLog.Errorf(\"Unable to notify \"+\n\t\t\t\t\t\t\"redeeming transaction %v: %v\",\n\t\t\t\t\t\ttx.Hash(), err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tspentNotified = true\n\t\t\t}\n\t\t}\n\n\t\tfor txOutIdx, txout := range tx.MsgTx().TxOut {\n\t\t\t_, addrs, _, _ := txscript.ExtractPkScriptAddrs(\n\t\t\t\ttxout.PkScript, wsc.server.cfg.ChainParams)\n\n\t\t\tfor _, addr := range addrs {\n\t\t\t\tif _, ok := lookups.addrs[addr.String()]; !ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\toutpoint := wire.OutPoint{\n\t\t\t\t\tHash:  *tx.Hash(),\n\t\t\t\t\tIndex: uint32(txOutIdx),\n\t\t\t\t}\n\t\t\t\tlookups.unspent[outpoint] = struct{}{}\n\n\t\t\t\tif recvNotified {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tif txHex == \"\" {\n\t\t\t\t\ttxHex = txHexString(tx.MsgTx())\n\t\t\t\t}\n\t\t\t\tntfn := btcjson.NewRecvTxNtfn(txHex,\n\t\t\t\t\tblockDetails(blk, tx.Index()))\n\n\t\t\t\tmarshalledJSON, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, ntfn)\n\t\t\t\tif err != nil {\n\t\t\t\t\trpcsLog.Errorf(\"Failed to marshal recvtx notification: %v\", err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\terr = wsc.QueueNotification(marshalledJSON)\n\t\t\t\t// Stop the rescan early if the websocket client\n\t\t\t\t// disconnected.\n\t\t\t\tif err == ErrClientQuit {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\trecvNotified = true\n\t\t\t}\n\t\t}\n\t}\n}\n\n// rescanBlockFilter rescans a block for any relevant transactions for the\n// passed lookup keys. Any discovered transactions are returned hex encoded as\n// a string slice.\n//\n// NOTE: This extension is ported from github.com/decred/dcrd\nfunc rescanBlockFilter(filter *wsClientFilter, block *btcutil.Block, params *chaincfg.Params) []string {\n\tvar transactions []string\n\n\tfilter.mu.Lock()\n\tfor _, tx := range block.Transactions() {\n\t\tmsgTx := tx.MsgTx()\n\n\t\t// Keep track of whether the transaction has already been added\n\t\t// to the result.  It shouldn't be added twice.\n\t\tadded := false\n\n\t\t// Scan inputs if not a coinbase transaction.\n\t\tif !blockchain.IsCoinBaseTx(msgTx) {\n\t\t\tfor _, input := range msgTx.TxIn {\n\t\t\t\tif !filter.existsUnspentOutPoint(&input.PreviousOutPoint) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif !added {\n\t\t\t\t\ttransactions = append(\n\t\t\t\t\t\ttransactions,\n\t\t\t\t\t\ttxHexString(msgTx))\n\t\t\t\t\tadded = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Scan outputs.\n\t\tfor i, output := range msgTx.TxOut {\n\t\t\t_, addrs, _, err := txscript.ExtractPkScriptAddrs(\n\t\t\t\toutput.PkScript, params)\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor _, a := range addrs {\n\t\t\t\tif !filter.existsAddress(a) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\top := wire.OutPoint{\n\t\t\t\t\tHash:  *tx.Hash(),\n\t\t\t\t\tIndex: uint32(i),\n\t\t\t\t}\n\t\t\t\tfilter.addUnspentOutPoint(&op)\n\n\t\t\t\tif !added {\n\t\t\t\t\ttransactions = append(\n\t\t\t\t\t\ttransactions,\n\t\t\t\t\t\ttxHexString(msgTx))\n\t\t\t\t\tadded = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfilter.mu.Unlock()\n\n\treturn transactions\n}\n\n// handleRescanBlocks implements the rescanblocks command extension for\n// websocket connections.\n//\n// NOTE: This extension is ported from github.com/decred/dcrd\nfunc handleRescanBlocks(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\tcmd, ok := icmd.(*btcjson.RescanBlocksCmd)\n\tif !ok {\n\t\treturn nil, btcjson.ErrRPCInternal\n\t}\n\n\t// Load client's transaction filter.  Must exist in order to continue.\n\twsc.Lock()\n\tfilter := wsc.filterData\n\twsc.Unlock()\n\tif filter == nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCMisc,\n\t\t\tMessage: \"Transaction filter must be loaded before rescanning\",\n\t\t}\n\t}\n\n\tblockHashes := make([]*chainhash.Hash, len(cmd.BlockHashes))\n\n\tfor i := range cmd.BlockHashes {\n\t\thash, err := chainhash.NewHashFromStr(cmd.BlockHashes[i])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tblockHashes[i] = hash\n\t}\n\n\tdiscoveredData := make([]btcjson.RescannedBlock, 0, len(blockHashes))\n\n\t// Iterate over each block in the request and rescan.  When a block\n\t// contains relevant transactions, add it to the response.\n\tbc := wsc.server.cfg.Chain\n\tparams := wsc.server.cfg.ChainParams\n\tvar lastBlockHash *chainhash.Hash\n\tfor i := range blockHashes {\n\t\tblock, err := bc.BlockByHash(blockHashes[i])\n\t\tif err != nil {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCBlockNotFound,\n\t\t\t\tMessage: \"Failed to fetch block: \" + err.Error(),\n\t\t\t}\n\t\t}\n\t\tif lastBlockHash != nil && block.MsgBlock().Header.PrevBlock != *lastBlockHash {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode: btcjson.ErrRPCInvalidParameter,\n\t\t\t\tMessage: fmt.Sprintf(\"Block %v is not a child of %v\",\n\t\t\t\t\tblockHashes[i], lastBlockHash),\n\t\t\t}\n\t\t}\n\t\tlastBlockHash = blockHashes[i]\n\n\t\ttransactions := rescanBlockFilter(filter, block, params)\n\t\tif len(transactions) != 0 {\n\t\t\tdiscoveredData = append(discoveredData, btcjson.RescannedBlock{\n\t\t\t\tHash:         cmd.BlockHashes[i],\n\t\t\t\tTransactions: transactions,\n\t\t\t})\n\t\t}\n\t}\n\n\treturn &discoveredData, nil\n}\n\n// recoverFromReorg attempts to recover from a detected reorganize during a\n// rescan.  It fetches a new range of block shas from the database and\n// verifies that the new range of blocks is on the same fork as a previous\n// range of blocks.  If this condition does not hold true, the JSON-RPC error\n// for an unrecoverable reorganize is returned.\nfunc recoverFromReorg(chain *blockchain.BlockChain, minBlock, maxBlock int32,\n\tlastBlock *chainhash.Hash) ([]chainhash.Hash, error) {\n\n\thashList, err := chain.HeightRange(minBlock, maxBlock)\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Error looking up block range: %v\", err)\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCDatabase,\n\t\t\tMessage: \"Database error: \" + err.Error(),\n\t\t}\n\t}\n\tif lastBlock == nil || len(hashList) == 0 {\n\t\treturn hashList, nil\n\t}\n\n\tblk, err := chain.BlockByHash(&hashList[0])\n\tif err != nil {\n\t\trpcsLog.Errorf(\"Error looking up possibly reorged block: %v\",\n\t\t\terr)\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCDatabase,\n\t\t\tMessage: \"Database error: \" + err.Error(),\n\t\t}\n\t}\n\tjsonErr := descendantBlock(lastBlock, blk)\n\tif jsonErr != nil {\n\t\treturn nil, jsonErr\n\t}\n\treturn hashList, nil\n}\n\n// descendantBlock returns the appropriate JSON-RPC error if a current block\n// fetched during a reorganize is not a direct child of the parent block hash.\nfunc descendantBlock(prevHash *chainhash.Hash, curBlock *btcutil.Block) error {\n\tcurHash := &curBlock.MsgBlock().Header.PrevBlock\n\tif !prevHash.IsEqual(curHash) {\n\t\trpcsLog.Errorf(\"Stopping rescan for reorged block %v \"+\n\t\t\t\"(replaced by block %v)\", prevHash, curHash)\n\t\treturn &ErrRescanReorg\n\t}\n\treturn nil\n}\n\n// scanBlockChunks executes a rescan in chunked stages. We do this to limit the\n// amount of memory that we'll allocate to a given rescan. Every so often,\n// we'll send back a rescan progress notification to the websockets client. The\n// final block and block hash that we've scanned will be returned.\nfunc scanBlockChunks(wsc *wsClient, cmd *btcjson.RescanCmd, lookups *rescanKeys, minBlock,\n\tmaxBlock int32, chain *blockchain.BlockChain) (\n\t*btcutil.Block, *chainhash.Hash, error) {\n\n\t// lastBlock and lastBlockHash track the previously-rescanned block.\n\t// They equal nil when no previous blocks have been rescanned.\n\tvar (\n\t\tlastBlock     *btcutil.Block\n\t\tlastBlockHash *chainhash.Hash\n\t)\n\n\t// A ticker is created to wait at least 10 seconds before notifying the\n\t// websocket client of the current progress completed by the rescan.\n\tticker := time.NewTicker(10 * time.Second)\n\tdefer ticker.Stop()\n\n\t// Instead of fetching all block shas at once, fetch in smaller chunks\n\t// to ensure large rescans consume a limited amount of memory.\nfetchRange:\n\tfor minBlock < maxBlock {\n\t\t// Limit the max number of hashes to fetch at once to the\n\t\t// maximum number of items allowed in a single inventory.\n\t\t// This value could be higher since it's not creating inventory\n\t\t// messages, but this mirrors the limiting logic used in the\n\t\t// peer-to-peer protocol.\n\t\tmaxLoopBlock := maxBlock\n\t\tif maxLoopBlock-minBlock > wire.MaxInvPerMsg {\n\t\t\tmaxLoopBlock = minBlock + wire.MaxInvPerMsg\n\t\t}\n\t\thashList, err := chain.HeightRange(minBlock, maxLoopBlock)\n\t\tif err != nil {\n\t\t\trpcsLog.Errorf(\"Error looking up block range: %v\", err)\n\t\t\treturn nil, nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCDatabase,\n\t\t\t\tMessage: \"Database error: \" + err.Error(),\n\t\t\t}\n\t\t}\n\t\tif len(hashList) == 0 {\n\t\t\t// The rescan is finished if no blocks hashes for this\n\t\t\t// range were successfully fetched and a stop block\n\t\t\t// was provided.\n\t\t\tif maxBlock != math.MaxInt32 {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// If the rescan is through the current block, set up\n\t\t\t// the client to continue to receive notifications\n\t\t\t// regarding all rescanned addresses and the current set\n\t\t\t// of unspent outputs.\n\t\t\t//\n\t\t\t// This is done safely by temporarily grabbing exclusive\n\t\t\t// access of the block manager.  If no more blocks have\n\t\t\t// been attached between this pause and the fetch above,\n\t\t\t// then it is safe to register the websocket client for\n\t\t\t// continuous notifications if necessary.  Otherwise,\n\t\t\t// continue the fetch loop again to rescan the new\n\t\t\t// blocks (or error due to an irrecoverable reorganize).\n\t\t\tpauseGuard := wsc.server.cfg.SyncMgr.Pause()\n\t\t\tbest := wsc.server.cfg.Chain.BestSnapshot()\n\t\t\tcurHash := &best.Hash\n\t\t\tagain := true\n\t\t\tif lastBlockHash == nil || *lastBlockHash == *curHash {\n\t\t\t\tagain = false\n\t\t\t\tn := wsc.server.ntfnMgr\n\t\t\t\tn.RegisterSpentRequests(wsc, lookups.unspentSlice())\n\t\t\t\tn.RegisterTxOutAddressRequests(wsc, cmd.Addresses)\n\t\t\t}\n\t\t\tclose(pauseGuard)\n\t\t\tif err != nil {\n\t\t\t\trpcsLog.Errorf(\"Error fetching best block \"+\n\t\t\t\t\t\"hash: %v\", err)\n\t\t\t\treturn nil, nil, &btcjson.RPCError{\n\t\t\t\t\tCode: btcjson.ErrRPCDatabase,\n\t\t\t\t\tMessage: \"Database error: \" +\n\t\t\t\t\t\terr.Error(),\n\t\t\t\t}\n\t\t\t}\n\t\t\tif again {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\tloopHashList:\n\t\tfor i := range hashList {\n\t\t\tblk, err := chain.BlockByHash(&hashList[i])\n\t\t\tif err != nil {\n\t\t\t\t// Only handle reorgs if a block could not be\n\t\t\t\t// found for the hash.\n\t\t\t\tif dbErr, ok := err.(database.Error); !ok ||\n\t\t\t\t\tdbErr.ErrorCode != database.ErrBlockNotFound {\n\n\t\t\t\t\trpcsLog.Errorf(\"Error looking up \"+\n\t\t\t\t\t\t\"block: %v\", err)\n\t\t\t\t\treturn nil, nil, &btcjson.RPCError{\n\t\t\t\t\t\tCode: btcjson.ErrRPCDatabase,\n\t\t\t\t\t\tMessage: \"Database error: \" +\n\t\t\t\t\t\t\terr.Error(),\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If an absolute max block was specified, don't\n\t\t\t\t// attempt to handle the reorg.\n\t\t\t\tif maxBlock != math.MaxInt32 {\n\t\t\t\t\trpcsLog.Errorf(\"Stopping rescan for \"+\n\t\t\t\t\t\t\"reorged block %v\",\n\t\t\t\t\t\tcmd.EndBlock)\n\t\t\t\t\treturn nil, nil, &ErrRescanReorg\n\t\t\t\t}\n\n\t\t\t\t// If the lookup for the previously valid block\n\t\t\t\t// hash failed, there may have been a reorg.\n\t\t\t\t// Fetch a new range of block hashes and verify\n\t\t\t\t// that the previously processed block (if there\n\t\t\t\t// was any) still exists in the database.  If it\n\t\t\t\t// doesn't, we error.\n\t\t\t\t//\n\t\t\t\t// A goto is used to branch execution back to\n\t\t\t\t// before the range was evaluated, as it must be\n\t\t\t\t// reevaluated for the new hashList.\n\t\t\t\tminBlock += int32(i)\n\t\t\t\thashList, err = recoverFromReorg(\n\t\t\t\t\tchain, minBlock, maxBlock, lastBlockHash,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, nil, err\n\t\t\t\t}\n\t\t\t\tif len(hashList) == 0 {\n\t\t\t\t\tbreak fetchRange\n\t\t\t\t}\n\t\t\t\tgoto loopHashList\n\t\t\t}\n\t\t\tif i == 0 && lastBlockHash != nil {\n\t\t\t\t// Ensure the new hashList is on the same fork\n\t\t\t\t// as the last block from the old hashList.\n\t\t\t\tjsonErr := descendantBlock(lastBlockHash, blk)\n\t\t\t\tif jsonErr != nil {\n\t\t\t\t\treturn nil, nil, jsonErr\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// A select statement is used to stop rescans if the\n\t\t\t// client requesting the rescan has disconnected.\n\t\t\tselect {\n\t\t\tcase <-wsc.quit:\n\t\t\t\trpcsLog.Debugf(\"Stopped rescan at height %v \"+\n\t\t\t\t\t\"for disconnected client\", blk.Height())\n\t\t\t\treturn nil, nil, nil\n\t\t\tdefault:\n\t\t\t\trescanBlock(wsc, lookups, blk)\n\t\t\t\tlastBlock = blk\n\t\t\t\tlastBlockHash = blk.Hash()\n\t\t\t}\n\n\t\t\t// Periodically notify the client of the progress\n\t\t\t// completed.  Continue with next block if no progress\n\t\t\t// notification is needed yet.\n\t\t\tselect {\n\t\t\tcase <-ticker.C: // fallthrough\n\t\t\tdefault:\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tn := btcjson.NewRescanProgressNtfn(\n\t\t\t\thashList[i].String(), blk.Height(),\n\t\t\t\tblk.MsgBlock().Header.Timestamp.Unix(),\n\t\t\t)\n\t\t\tmn, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, n)\n\t\t\tif err != nil {\n\t\t\t\trpcsLog.Errorf(\"Failed to marshal rescan \"+\n\t\t\t\t\t\"progress notification: %v\", err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif err = wsc.QueueNotification(mn); err == ErrClientQuit {\n\t\t\t\t// Finished if the client disconnected.\n\t\t\t\trpcsLog.Debugf(\"Stopped rescan at height %v \"+\n\t\t\t\t\t\"for disconnected client\", blk.Height())\n\t\t\t\treturn nil, nil, nil\n\t\t\t}\n\t\t}\n\n\t\tminBlock += int32(len(hashList))\n\t}\n\n\treturn lastBlock, lastBlockHash, nil\n}\n\n// handleRescan implements the rescan command extension for websocket\n// connections.\n//\n// NOTE: This does not smartly handle reorgs, and fixing requires database\n// changes (for safe, concurrent access to full block ranges, and support\n// for other chains than the best chain).  It will, however, detect whether\n// a reorg removed a block that was previously processed, and result in the\n// handler erroring.  Clients must handle this by finding a block still in\n// the chain (perhaps from a rescanprogress notification) to resume their\n// rescan.\nfunc handleRescan(wsc *wsClient, icmd interface{}) (interface{}, error) {\n\tcmd, ok := icmd.(*btcjson.RescanCmd)\n\tif !ok {\n\t\treturn nil, btcjson.ErrRPCInternal\n\t}\n\n\toutpoints := make([]*wire.OutPoint, 0, len(cmd.OutPoints))\n\tfor i := range cmd.OutPoints {\n\t\tcmdOutpoint := &cmd.OutPoints[i]\n\t\tblockHash, err := chainhash.NewHashFromStr(cmdOutpoint.Hash)\n\t\tif err != nil {\n\t\t\treturn nil, rpcDecodeHexError(cmdOutpoint.Hash)\n\t\t}\n\t\toutpoint := wire.NewOutPoint(blockHash, cmdOutpoint.Index)\n\t\toutpoints = append(outpoints, outpoint)\n\t}\n\n\tnumAddrs := len(cmd.Addresses)\n\tif numAddrs == 1 {\n\t\trpcsLog.Info(\"Beginning rescan for 1 address\")\n\t} else {\n\t\trpcsLog.Infof(\"Beginning rescan for %d addresses\", numAddrs)\n\t}\n\n\t// Build lookup maps.\n\tlookups := rescanKeys{\n\t\taddrs:   map[string]struct{}{},\n\t\tunspent: map[wire.OutPoint]struct{}{},\n\t}\n\tfor _, addrStr := range cmd.Addresses {\n\t\tlookups.addrs[addrStr] = struct{}{}\n\t}\n\tfor _, outpoint := range outpoints {\n\t\tlookups.unspent[*outpoint] = struct{}{}\n\t}\n\n\tchain := wsc.server.cfg.Chain\n\n\tminBlockHash, err := chainhash.NewHashFromStr(cmd.BeginBlock)\n\tif err != nil {\n\t\treturn nil, rpcDecodeHexError(cmd.BeginBlock)\n\t}\n\tminBlock, err := chain.BlockHeightByHash(minBlockHash)\n\tif err != nil {\n\t\treturn nil, &btcjson.RPCError{\n\t\t\tCode:    btcjson.ErrRPCBlockNotFound,\n\t\t\tMessage: \"Error getting block: \" + err.Error(),\n\t\t}\n\t}\n\n\tmaxBlock := int32(math.MaxInt32)\n\tif cmd.EndBlock != nil {\n\t\tmaxBlockHash, err := chainhash.NewHashFromStr(*cmd.EndBlock)\n\t\tif err != nil {\n\t\t\treturn nil, rpcDecodeHexError(*cmd.EndBlock)\n\t\t}\n\t\tmaxBlock, err = chain.BlockHeightByHash(maxBlockHash)\n\t\tif err != nil {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCBlockNotFound,\n\t\t\t\tMessage: \"Error getting block: \" + err.Error(),\n\t\t\t}\n\t\t}\n\t}\n\n\tvar (\n\t\tlastBlock     *btcutil.Block\n\t\tlastBlockHash *chainhash.Hash\n\t)\n\tif len(lookups.addrs) != 0 || len(lookups.unspent) != 0 {\n\t\t// With all the arguments parsed, we'll execute our chunked rescan\n\t\t// which will notify the clients of any address deposits or output\n\t\t// spends.\n\t\tlastBlock, lastBlockHash, err = scanBlockChunks(\n\t\t\twsc, cmd, &lookups, minBlock, maxBlock, chain,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// If the last block is nil, then this means that the client\n\t\t// disconnected mid-rescan. As a result, we don't need to send\n\t\t// anything back to them.\n\t\tif lastBlock == nil {\n\t\t\treturn nil, nil\n\t\t}\n\t} else {\n\t\trpcsLog.Infof(\"Skipping rescan as client has no addrs/utxos\")\n\n\t\t// If we didn't actually do a rescan, then we'll give the\n\t\t// client our best known block within the final rescan finished\n\t\t// notification.\n\t\tchainTip := chain.BestSnapshot()\n\t\tlastBlockHash = &chainTip.Hash\n\t\tlastBlock, err = chain.BlockByHash(lastBlockHash)\n\t\tif err != nil {\n\t\t\treturn nil, &btcjson.RPCError{\n\t\t\t\tCode:    btcjson.ErrRPCBlockNotFound,\n\t\t\t\tMessage: \"Error getting block: \" + err.Error(),\n\t\t\t}\n\t\t}\n\t}\n\n\t// Notify websocket client of the finished rescan.  Due to how btcd\n\t// asynchronously queues notifications to not block calling code,\n\t// there is no guarantee that any of the notifications created during\n\t// rescan (such as rescanprogress, recvtx and redeemingtx) will be\n\t// received before the rescan RPC returns.  Therefore, another method\n\t// is needed to safely inform clients that all rescan notifications have\n\t// been sent.\n\tn := btcjson.NewRescanFinishedNtfn(\n\t\tlastBlockHash.String(), lastBlock.Height(),\n\t\tlastBlock.MsgBlock().Header.Timestamp.Unix(),\n\t)\n\tif mn, err := btcjson.MarshalCmd(btcjson.RpcVersion1, nil, n); err != nil {\n\t\trpcsLog.Errorf(\"Failed to marshal rescan finished \"+\n\t\t\t\"notification: %v\", err)\n\t} else {\n\t\t// The rescan is finished, so we don't care whether the client\n\t\t// has disconnected at this point, so discard error.\n\t\t_ = wsc.QueueNotification(mn)\n\t}\n\n\trpcsLog.Info(\"Finished rescan\")\n\treturn nil, nil\n}\n\nfunc init() {\n\twsHandlers = wsHandlersBeforeInit\n}\n"
  },
  {
    "path": "sample-btcd.conf",
    "content": "[Application Options]\n\n; ------------------------------------------------------------------------------\n; Data settings\n; ------------------------------------------------------------------------------\n\n; The directory to store data such as the block chain and peer addresses.  The\n; block chain takes several GB, so this location must have a lot of free space.\n; The default is ~/.btcd/data on POSIX OSes, $LOCALAPPDATA/Btcd/data on Windows,\n; ~/Library/Application Support/Btcd/data on Mac OS, and $home/btcd/data on\n; Plan9.  Environment variables are expanded so they may be used.  NOTE: Windows\n; environment variables are typically %VARIABLE%, but they must be accessed with\n; $VARIABLE here.  Also, ~ is expanded to $LOCALAPPDATA on Windows.\n; datadir=~/.btcd/data\n\n; The prune option removes old blocks from disk after they're downloaded and\n; verified.  The smallest value is 1536 which will limit the block data to 1536\n; mebibytes.\n; NOTE: This limit does not apply to indexes and the UTXO set which are both\n; larger than 1536 mebibytes as of December 2024.\n; prune=1536\n\n; ------------------------------------------------------------------------------\n; Network settings\n; ------------------------------------------------------------------------------\n\n; Use testnet.\n; testnet=1\n\n; Connect via a SOCKS5 proxy.  NOTE: Specifying a proxy will disable listening\n; for incoming connections unless listen addresses are provided via the 'listen'\n; option.\n; proxy=127.0.0.1:9050\n; proxyuser=\n; proxypass=\n\n; The SOCKS5 proxy above is assumed to be Tor (https://www.torproject.org).\n; If the proxy is not tor the following may be used to prevent using tor\n; specific SOCKS queries to lookup addresses (this increases anonymity when tor\n; is used by preventing your IP being leaked via DNS).\n; noonion=1\n\n; Use an alternative proxy to connect to .onion addresses. The proxy is assumed\n; to be a Tor node. Non .onion addresses will be contacted with the main proxy\n; or without a proxy if none is set.\n; onion=127.0.0.1:9051\n; onionuser=\n; onionpass=\n\n; Enable Tor stream isolation by randomizing proxy user credentials resulting in\n; Tor creating a new circuit for each connection.  This makes it more difficult\n; to correlate connections.\n; torisolation=1\n\n; Use Universal Plug and Play (UPnP) to automatically open the listen port\n; and obtain the external IP address from supported devices.  NOTE: This option\n; will have no effect if external IP addresses are specified.\n; upnp=1\n\n; Specify the external IP addresses your node is listening on.  One address per\n; line.  btcd will not contact 3rd-party sites to obtain external ip addresses.\n; This means if you are behind NAT, your node will not be able to advertise a\n; reachable address unless you specify it here or enable the 'upnp' option (and\n; have a supported device).\n; externalip=1.2.3.4\n; externalip=2002::1234\n\n; ******************************************************************************\n; Summary of 'addpeer' versus 'connect'.\n;\n; Only one of the following two options, 'addpeer' and 'connect', may be\n; specified.  Both allow you to specify peers that you want to stay connected\n; with, but the behavior is slightly different.  By default, btcd will query DNS\n; to find peers to connect to, so unless you have a specific reason such as\n; those described below, you probably won't need to modify anything here.\n;\n; 'addpeer' does not prevent connections to other peers discovered from\n; the peers you are connected to and also lets the remote peers know you are\n; available so they can notify other peers they can to connect to you.  This\n; option might be useful if you are having problems finding a node for some\n; reason (perhaps due to a firewall).\n;\n; 'connect', on the other hand, will ONLY connect to the specified peers and\n; no others.  It also disables listening (unless you explicitly set listen\n; addresses via the 'listen' option) and DNS seeding, so you will not be\n; advertised as an available peer to the peers you connect to and won't accept\n; connections from any other peers.  So, the 'connect' option effectively allows\n; you to only connect to \"trusted\" peers.\n; ******************************************************************************\n\n; Add persistent peers to connect to as desired.  One peer per line.\n; You may specify each IP address with or without a port.  The default port will\n; be added automatically if one is not specified here.\n; addpeer=192.168.1.1\n; addpeer=10.0.0.2:8333\n; addpeer=fe80::1\n; addpeer=[fe80::2]:8333\n\n; Add persistent peers that you ONLY want to connect to as desired.  One peer\n; per line.  You may specify each IP address with or without a port.  The\n; default port will be added automatically if one is not specified here.\n; NOTE: Specifying this option has other side effects as described above in\n; the 'addpeer' versus 'connect' summary section.\n; connect=192.168.1.1\n; connect=10.0.0.2:8333\n; connect=fe80::1\n; connect=[fe80::2]:8333\n\n; Maximum number of inbound and outbound peers.\n; maxpeers=125\n\n; Disable banning of misbehaving peers.\n; nobanning=1\n\n; Maximum allowed ban score before disconnecting and banning misbehaving peers.\n; banthreshold=100\n\n; How long to ban misbehaving peers. Valid time units are {s, m, h}.\n; Minimum 1s.\n; banduration=24h\n; banduration=11h30m15s\n\n; Add whitelisted IP networks and IPs. Connected peers whose IP matches a\n; whitelist will not have their ban score increased.\n; whitelist=127.0.0.1\n; whitelist=::1\n; whitelist=192.168.0.0/24\n; whitelist=fd00::/16\n\n; Disable DNS seeding for peers.  By default, when btcd starts, it will use\n; DNS to query for available peers to connect with.\n; nodnsseed=1\n\n; Specify the interfaces to listen on.  One listen address per line.\n; NOTE: The default port is modified by some options such as 'testnet', so it is\n; recommended to not specify a port and allow a proper default to be chosen\n; unless you have a specific reason to do otherwise.\n; All interfaces on default port (this is the default):\n;  listen=\n; All ipv4 interfaces on default port:\n;  listen=0.0.0.0\n; All ipv6 interfaces on default port:\n;   listen=::\n; All interfaces on port 8333:\n;   listen=:8333\n; All ipv4 interfaces on port 8333:\n;   listen=0.0.0.0:8333\n; All ipv6 interfaces on port 8333:\n;   listen=[::]:8333\n; Only ipv4 localhost on port 8333:\n;   listen=127.0.0.1:8333\n; Only ipv6 localhost on port 8333:\n;   listen=[::1]:8333\n; Only ipv4 localhost on non-standard port 8336:\n;   listen=127.0.0.1:8336\n; All interfaces on non-standard port 8336:\n;   listen=:8336\n; All ipv4 interfaces on non-standard port 8336:\n;   listen=0.0.0.0:8336\n; All ipv6 interfaces on non-standard port 8336:\n;   listen=[::]:8336\n\n; Disable listening for incoming connections.  This will override all listeners.\n; nolisten=1\n\n; Disable peer bloom filtering.  See BIP0111.\n; nopeerbloomfilters=1\n\n; Add additional checkpoints. Format: '<height>:<hash>'\n; addcheckpoint=<height>:<hash>\n\n; Add comments to the user agent that is advertised to peers.\n; Must not include characters '/', ':', '(' and ')'.\n; uacomment=\n\n; Disable committed peer filtering (CF).\n; nocfilters=1\n\n; Enable or disable the P2P v2 encrypted transport protocol (BIP324).\n; If disabled (which is the default), btcd will only attempt to use the\n; v1 P2P protocol. (default: 0)\n; v2transport=0\n\n; ------------------------------------------------------------------------------\n; RPC server options - The following options control the built-in RPC server\n; which is used to control and query information from a running btcd process.\n;\n; NOTE: The RPC server is disabled by default if rpcuser AND rpcpass, or\n; rpclimituser AND rpclimitpass, are not specified.\n; ------------------------------------------------------------------------------\n\n; Secure the RPC API by specifying the username and password.  You can also\n; specify a limited username and password.  You must specify at least one\n; full set of credentials - limited or admin - or the RPC server will\n; be disabled.\n; rpcuser=whatever_admin_username_you_want\n; rpcpass=\n; rpclimituser=whatever_limited_username_you_want\n; rpclimitpass=\n\n; Specify the interfaces for the RPC server listen on.  One listen address per\n; line.  NOTE: The default port is modified by some options such as 'testnet',\n; so it is recommended to not specify a port and allow a proper default to be\n; chosen unless you have a specific reason to do otherwise.  By default, the\n; RPC server will only listen on localhost for IPv4 and IPv6.\n; All interfaces on default port:\n;   rpclisten=\n; All ipv4 interfaces on default port:\n;   rpclisten=0.0.0.0\n; All ipv6 interfaces on default port:\n;   rpclisten=::\n; All interfaces on port 8334:\n;   rpclisten=:8334\n; All ipv4 interfaces on port 8334:\n;   rpclisten=0.0.0.0:8334\n; All ipv6 interfaces on port 8334:\n;   rpclisten=[::]:8334\n; Only ipv4 localhost on port 8334:\n;   rpclisten=127.0.0.1:8334\n; Only ipv6 localhost on port 8334:\n;   rpclisten=[::1]:8334\n; Only ipv4 localhost on non-standard port 8337:\n;   rpclisten=127.0.0.1:8337\n; All interfaces on non-standard port 8337:\n;   rpclisten=:8337\n; All ipv4 interfaces on non-standard port 8337:\n;   rpclisten=0.0.0.0:8337\n; All ipv6 interfaces on non-standard port 8337:\n;   rpclisten=[::]:8337\n\n; Specify the maximum number of concurrent RPC clients for standard connections.\n; rpcmaxclients=10\n\n; Specify the maximum number of concurrent RPC websocket clients.\n; rpcmaxwebsockets=25\n\n; Mirror some JSON-RPC quirks of Bitcoin Core -- NOTE: Discouraged unless\n; interoperability issues need to be worked around\n; rpcquirks=1\n\n; Use the following setting to disable the RPC server even if the rpcuser and\n; rpcpass are specified above.  This allows one to quickly disable the RPC\n; server without having to remove credentials from the config file.\n; norpc=1\n\n; Use the following setting to disable TLS for the RPC server.  NOTE: This\n; option only works if the RPC server is bound to localhost interfaces (which is\n; the default).\n; notls=1\n\n\n; ------------------------------------------------------------------------------\n; Mempool Settings - The following options\n; ------------------------------------------------------------------------------\n\n; Set the minimum transaction fee to be considered a non-zero fee,\n; minrelaytxfee=0.00001\n\n; Rate-limit free transactions to the value 15 * 1000 bytes per\n; minute.\n; limitfreerelay=15\n\n; Require high priority for relaying free or low-fee transactions.\n; norelaypriority=0\n\n; Limit orphan transaction pool to 100 transactions.\n; maxorphantx=100\n\n; Do not accept transactions from remote peers.\n; blocksonly=1\n\n; Relay non-standard transactions regardless of default network settings.\n; relaynonstd=1\n\n; Reject non-standard transactions regardless of default network settings.\n; rejectnonstd=1\n\n\n; ------------------------------------------------------------------------------\n; Optional Indexes\n; ------------------------------------------------------------------------------\n\n; Build and maintain a full hash-based transaction index which makes all\n; transactions available via the getrawtransaction RPC.\n; txindex=1\n\n; Build and maintain a full address-based transaction index which makes the\n; searchrawtransactions RPC available.\n; addrindex=1\n\n; Delete the entire address index on start up, then exit.\n; dropaddrindex=0\n\n\n; ------------------------------------------------------------------------------\n; Signature Verification Cache\n; ------------------------------------------------------------------------------\n\n; Limit the signature cache to a max of 50000 entries.\n; sigcachemaxsize=50000\n\n\n; ------------------------------------------------------------------------------\n; Coin Generation (Mining) Settings - The following options control the\n; generation of block templates used by external mining applications through RPC\n; calls as well as the built-in CPU miner (if enabled).\n; ------------------------------------------------------------------------------\n\n; Enable built-in CPU mining.\n;\n; NOTE: This is typically only useful for testing purposes such as testnet or\n; simnet since the difficulty on mainnet is far too high for CPU mining to be\n; worth your while.\n; generate=false\n\n; Add addresses to pay mined blocks to for CPU mining and potentially in the\n; block templates generated for the getblocktemplate RPC.  One address per line.\n; miningaddr=1yourbitcoinaddress\n; miningaddr=1yourbitcoinaddress2\n; miningaddr=1yourbitcoinaddress3\n\n; Specify the minimum block size in bytes to create.  By default, only\n; transactions which have enough fees or a high enough priority will be included\n; in generated block templates.  Specifying a minimum block size will instead\n; attempt to fill generated block templates up with transactions until it is at\n; least the specified number of bytes.\n; blockminsize=0\n\n; Specify the maximum block size in bytes to create.  This value will be limited\n; to the consensus limit if it is larger than that value.\n; blockmaxsize=750000\n\n; Specify the size in bytes of the high-priority/low-fee area when creating a\n; block.  Transactions which consist of large amounts, old inputs, and small\n; sizes have the highest priority.  One consequence of this is that as low-fee\n; or free transactions age, they raise in priority thereby making them more\n; likely to be included in this section of a new block.  This value is limited\n; by the blockmaxsize option and will be limited as needed.\n; blockprioritysize=50000\n\n\n; ------------------------------------------------------------------------------\n; Debug\n; ------------------------------------------------------------------------------\n\n; Debug logging level.\n; Valid levels are {trace, debug, info, warn, error, critical}\n; You may also specify <subsystem>=<level>,<subsystem2>=<level>,... to set\n; log level for individual subsystems.  Use btcd --debuglevel=show to list\n; available subsystems.\n; debuglevel=info\n\n; The port used to listen for HTTP profile requests.  The profile server will\n; be disabled if this option is not specified.  The profile information can be\n; accessed at http://localhost:<profileport>/debug/pprof once running.\n; profile=6061\n"
  },
  {
    "path": "scripts/tidy_modules.sh",
    "content": "#!/bin/bash\n\nSUBMODULES=$(find . -mindepth 2 -name \"go.mod\" | cut -d'/' -f2)\n\n\n# Run 'go mod tidy' for root.\ngo mod tidy\n\n# Run 'go mod tidy' for each module.\nfor submodule in $SUBMODULES\ndo\n  pushd $submodule\n\n  go mod tidy\n\n  popd\ndone\n"
  },
  {
    "path": "server.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2018 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"crypto/tls\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"net\"\n\t\"runtime\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/addrmgr\"\n\t\"github.com/btcsuite/btcd/blockchain\"\n\t\"github.com/btcsuite/btcd/blockchain/indexers\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/btcutil/bloom\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/connmgr\"\n\t\"github.com/btcsuite/btcd/database\"\n\t\"github.com/btcsuite/btcd/mempool\"\n\t\"github.com/btcsuite/btcd/mining\"\n\t\"github.com/btcsuite/btcd/mining/cpuminer\"\n\t\"github.com/btcsuite/btcd/netsync\"\n\t\"github.com/btcsuite/btcd/peer\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/decred/dcrd/lru\"\n)\n\nconst (\n\t// defaultServices describes the default services that are supported by\n\t// the server.\n\tdefaultServices = wire.SFNodeNetwork | wire.SFNodeNetworkLimited |\n\t\twire.SFNodeBloom | wire.SFNodeWitness | wire.SFNodeCF | wire.SFNodeP2PV2\n\n\t// defaultRequiredServices describes the default services that are\n\t// required to be supported by outbound peers.\n\tdefaultRequiredServices = wire.SFNodeNetwork\n\n\t// defaultTargetOutbound is the default number of outbound peers to target.\n\tdefaultTargetOutbound = 8\n\n\t// connectionRetryInterval is the base amount of time to wait in between\n\t// retries when connecting to persistent peers.  It is adjusted by the\n\t// number of retries such that there is a retry backoff.\n\tconnectionRetryInterval = time.Second * 5\n)\n\nvar (\n\t// userAgentName is the user agent name and is used to help identify\n\t// ourselves to other bitcoin peers.\n\tuserAgentName = \"btcd\"\n\n\t// userAgentVersion is the user agent version and is used to help\n\t// identify ourselves to other bitcoin peers.\n\tuserAgentVersion = fmt.Sprintf(\"%d.%d.%d\", appMajor, appMinor, appPatch)\n)\n\n// zeroHash is the zero value hash (all zeros).  It is defined as a convenience.\nvar zeroHash chainhash.Hash\n\n// onionAddr implements the net.Addr interface and represents a tor address.\ntype onionAddr struct {\n\taddr string\n}\n\n// String returns the onion address.\n//\n// This is part of the net.Addr interface.\nfunc (oa *onionAddr) String() string {\n\treturn oa.addr\n}\n\n// Network returns \"onion\".\n//\n// This is part of the net.Addr interface.\nfunc (oa *onionAddr) Network() string {\n\treturn \"onion\"\n}\n\n// Ensure onionAddr implements the net.Addr interface.\nvar _ net.Addr = (*onionAddr)(nil)\n\n// simpleAddr implements the net.Addr interface with two struct fields\ntype simpleAddr struct {\n\tnet, addr string\n}\n\n// String returns the address.\n//\n// This is part of the net.Addr interface.\nfunc (a simpleAddr) String() string {\n\treturn a.addr\n}\n\n// Network returns the network.\n//\n// This is part of the net.Addr interface.\nfunc (a simpleAddr) Network() string {\n\treturn a.net\n}\n\n// Ensure simpleAddr implements the net.Addr interface.\nvar _ net.Addr = simpleAddr{}\n\n// broadcastMsg provides the ability to house a bitcoin message to be broadcast\n// to all connected peers except specified excluded peers.\ntype broadcastMsg struct {\n\tmessage      wire.Message\n\texcludePeers []*serverPeer\n}\n\n// broadcastInventoryAdd is a type used to declare that the InvVect it contains\n// needs to be added to the rebroadcast map\ntype broadcastInventoryAdd relayMsg\n\n// broadcastInventoryDel is a type used to declare that the InvVect it contains\n// needs to be removed from the rebroadcast map\ntype broadcastInventoryDel *wire.InvVect\n\n// relayMsg packages an inventory vector along with the newly discovered\n// inventory so the relay has access to that information.\ntype relayMsg struct {\n\tinvVect *wire.InvVect\n\tdata    interface{}\n}\n\n// updatePeerHeightsMsg is a message sent from the blockmanager to the server\n// after a new block has been accepted. The purpose of the message is to update\n// the heights of peers that were known to announce the block before we\n// connected it to the main chain or recognized it as an orphan. With these\n// updates, peer heights will be kept up to date, allowing for fresh data when\n// selecting sync peer candidacy.\ntype updatePeerHeightsMsg struct {\n\tnewHash    *chainhash.Hash\n\tnewHeight  int32\n\toriginPeer *peer.Peer\n}\n\n// peerState maintains state of inbound, persistent, outbound peers as well\n// as banned peers and outbound groups.\ntype peerState struct {\n\tinboundPeers    map[int32]*serverPeer\n\toutboundPeers   map[int32]*serverPeer\n\tpersistentPeers map[int32]*serverPeer\n\tbanned          map[string]time.Time\n\toutboundGroups  map[string]int\n}\n\n// Count returns the count of all known peers.\nfunc (ps *peerState) Count() int {\n\treturn len(ps.inboundPeers) + len(ps.outboundPeers) +\n\t\tlen(ps.persistentPeers)\n}\n\n// forAllOutboundPeers is a helper function that runs closure on all outbound\n// peers known to peerState.\nfunc (ps *peerState) forAllOutboundPeers(closure func(sp *serverPeer)) {\n\tfor _, e := range ps.outboundPeers {\n\t\tclosure(e)\n\t}\n\tfor _, e := range ps.persistentPeers {\n\t\tclosure(e)\n\t}\n}\n\n// forAllPeers is a helper function that runs closure on all peers known to\n// peerState.\nfunc (ps *peerState) forAllPeers(closure func(sp *serverPeer)) {\n\tfor _, e := range ps.inboundPeers {\n\t\tclosure(e)\n\t}\n\tps.forAllOutboundPeers(closure)\n}\n\n// cfHeaderKV is a tuple of a filter header and its associated block hash. The\n// struct is used to cache cfcheckpt responses.\ntype cfHeaderKV struct {\n\tblockHash    chainhash.Hash\n\tfilterHeader chainhash.Hash\n}\n\n// server provides a bitcoin server for handling communications to and from\n// bitcoin peers.\ntype server struct {\n\t// The following variables must only be used atomically.\n\t// Putting the uint64s first makes them 64-bit aligned for 32-bit systems.\n\tbytesReceived uint64 // Total bytes received from all peers since start.\n\tbytesSent     uint64 // Total bytes sent by all peers since start.\n\tstarted       int32\n\tshutdown      int32\n\tshutdownSched int32\n\tstartupTime   int64\n\n\tchainParams          *chaincfg.Params\n\taddrManager          *addrmgr.AddrManager\n\tconnManager          *connmgr.ConnManager\n\tsigCache             *txscript.SigCache\n\thashCache            *txscript.HashCache\n\trpcServer            *rpcServer\n\tsyncManager          *netsync.SyncManager\n\tchain                *blockchain.BlockChain\n\ttxMemPool            *mempool.TxPool\n\tcpuMiner             *cpuminer.CPUMiner\n\tmodifyRebroadcastInv chan interface{}\n\tp2pDowngrader        *peer.P2PDowngrader\n\tnewPeers             chan *serverPeer\n\tdonePeers            chan *serverPeer\n\tbanPeers             chan *serverPeer\n\tquery                chan interface{}\n\trelayInv             chan relayMsg\n\tbroadcast            chan broadcastMsg\n\tpeerHeightsUpdate    chan updatePeerHeightsMsg\n\twg                   sync.WaitGroup\n\tquit                 chan struct{}\n\tnat                  NAT\n\tdb                   database.DB\n\ttimeSource           blockchain.MedianTimeSource\n\tservices             wire.ServiceFlag\n\n\t// The following fields are used for optional indexes.  They will be nil\n\t// if the associated index is not enabled.  These fields are set during\n\t// initial creation of the server and never changed afterwards, so they\n\t// do not need to be protected for concurrent access.\n\ttxIndex   *indexers.TxIndex\n\taddrIndex *indexers.AddrIndex\n\tcfIndex   *indexers.CfIndex\n\n\t// The fee estimator keeps track of how long transactions are left in\n\t// the mempool before they are mined into blocks.\n\tfeeEstimator *mempool.FeeEstimator\n\n\t// cfCheckptCaches stores a cached slice of filter headers for cfcheckpt\n\t// messages for each filter type.\n\tcfCheckptCaches    map[wire.FilterType][]cfHeaderKV\n\tcfCheckptCachesMtx sync.RWMutex\n\n\t// agentBlacklist is a list of blacklisted substrings by which to filter\n\t// user agents.\n\tagentBlacklist []string\n\n\t// agentWhitelist is a list of whitelisted user agent substrings, no\n\t// whitelisting will be applied if the list is empty or nil.\n\tagentWhitelist []string\n}\n\n// serverPeer extends the peer to maintain state shared by the server and\n// the blockmanager.\ntype serverPeer struct {\n\t// The following variables must only be used atomically\n\tfeeFilter int64\n\n\t*peer.Peer\n\n\tconnReq        *connmgr.ConnReq\n\tserver         *server\n\tpersistent     bool\n\tcontinueHash   *chainhash.Hash\n\trelayMtx       sync.Mutex\n\tdisableRelayTx bool\n\tsentAddrs      bool\n\tisWhitelisted  bool\n\tfilter         *bloom.Filter\n\taddressesMtx   sync.RWMutex\n\tknownAddresses lru.Cache\n\tbanScore       connmgr.DynamicBanScore\n\tquit           chan struct{}\n\t// The following chans are used to sync blockmanager and server.\n\ttxProcessed    chan struct{}\n\tblockProcessed chan struct{}\n}\n\n// newServerPeer returns a new serverPeer instance. The peer needs to be set by\n// the caller.\nfunc newServerPeer(s *server, isPersistent bool) *serverPeer {\n\treturn &serverPeer{\n\t\tserver:         s,\n\t\tpersistent:     isPersistent,\n\t\tfilter:         bloom.LoadFilter(nil),\n\t\tknownAddresses: lru.NewCache(5000),\n\t\tquit:           make(chan struct{}),\n\t\ttxProcessed:    make(chan struct{}, 1),\n\t\tblockProcessed: make(chan struct{}, 1),\n\t}\n}\n\n// newestBlock returns the current best block hash and height using the format\n// required by the configuration for the peer package.\nfunc (sp *serverPeer) newestBlock() (*chainhash.Hash, int32, error) {\n\tbest := sp.server.chain.BestSnapshot()\n\treturn &best.Hash, best.Height, nil\n}\n\n// addKnownAddresses adds the given addresses to the set of known addresses to\n// the peer to prevent sending duplicate addresses.\nfunc (sp *serverPeer) addKnownAddresses(addresses []*wire.NetAddressV2) {\n\tsp.addressesMtx.Lock()\n\tfor _, na := range addresses {\n\t\tsp.knownAddresses.Add(addrmgr.NetAddressKey(na))\n\t}\n\tsp.addressesMtx.Unlock()\n}\n\n// addressKnown true if the given address is already known to the peer.\nfunc (sp *serverPeer) addressKnown(na *wire.NetAddressV2) bool {\n\tsp.addressesMtx.RLock()\n\texists := sp.knownAddresses.Contains(addrmgr.NetAddressKey(na))\n\tsp.addressesMtx.RUnlock()\n\treturn exists\n}\n\n// setDisableRelayTx toggles relaying of transactions for the given peer.\n// It is safe for concurrent access.\nfunc (sp *serverPeer) setDisableRelayTx(disable bool) {\n\tsp.relayMtx.Lock()\n\tsp.disableRelayTx = disable\n\tsp.relayMtx.Unlock()\n}\n\n// relayTxDisabled returns whether or not relaying of transactions for the given\n// peer is disabled.\n// It is safe for concurrent access.\nfunc (sp *serverPeer) relayTxDisabled() bool {\n\tsp.relayMtx.Lock()\n\tisDisabled := sp.disableRelayTx\n\tsp.relayMtx.Unlock()\n\n\treturn isDisabled\n}\n\n// pushAddrMsg sends a legacy addr message to the connected peer using the\n// provided addresses.\nfunc (sp *serverPeer) pushAddrMsg(addresses []*wire.NetAddressV2) {\n\tif sp.WantsAddrV2() {\n\t\t// If the peer supports addrv2, we'll be pushing an addrv2\n\t\t// message instead. The logic is otherwise identical to the\n\t\t// addr case below.\n\t\taddrs := make([]*wire.NetAddressV2, 0, len(addresses))\n\t\tfor _, addr := range addresses {\n\t\t\t// Filter addresses already known to the peer.\n\t\t\tif sp.addressKnown(addr) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\taddrs = append(addrs, addr)\n\t\t}\n\n\t\tknown, err := sp.PushAddrV2Msg(addrs)\n\t\tif err != nil {\n\t\t\tpeerLog.Errorf(\"Can't push addrv2 message to %s: %v\",\n\t\t\t\tsp.Peer, err)\n\t\t\tsp.Disconnect()\n\t\t\treturn\n\t\t}\n\n\t\t// Add the final set of addresses sent to the set the peer\n\t\t// knows of.\n\t\tsp.addKnownAddresses(known)\n\t\treturn\n\t}\n\n\taddrs := make([]*wire.NetAddress, 0, len(addresses))\n\tfor _, addr := range addresses {\n\t\t// Filter addresses already known to the peer.\n\t\tif sp.addressKnown(addr) {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Must skip the V3 addresses for legacy ADDR messages.\n\t\tif addr.IsTorV3() {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Convert the NetAddressV2 to a legacy address.\n\t\taddrs = append(addrs, addr.ToLegacy())\n\t}\n\n\tknown, err := sp.PushAddrMsg(addrs)\n\tif err != nil {\n\t\tpeerLog.Errorf(\n\t\t\t\"Can't push address message to %s: %v\", sp.Peer, err,\n\t\t)\n\t\tsp.Disconnect()\n\t\treturn\n\t}\n\n\t// Convert all of the known addresses to NetAddressV2 to add them to\n\t// the set of known addresses.\n\tknownAddrs := make([]*wire.NetAddressV2, 0, len(known))\n\tfor _, knownAddr := range known {\n\t\tcurrentKna := wire.NetAddressV2FromBytes(\n\t\t\tknownAddr.Timestamp, knownAddr.Services,\n\t\t\tknownAddr.IP, knownAddr.Port,\n\t\t)\n\t\tknownAddrs = append(knownAddrs, currentKna)\n\t}\n\tsp.addKnownAddresses(knownAddrs)\n}\n\n// addBanScore increases the persistent and decaying ban score fields by the\n// values passed as parameters. If the resulting score exceeds half of the ban\n// threshold, a warning is logged including the reason provided. Further, if\n// the score is above the ban threshold, the peer will be banned and\n// disconnected.\nfunc (sp *serverPeer) addBanScore(persistent, transient uint32, reason string) bool {\n\t// No warning is logged and no score is calculated if banning is disabled.\n\tif cfg.DisableBanning {\n\t\treturn false\n\t}\n\tif sp.isWhitelisted {\n\t\tpeerLog.Debugf(\"Misbehaving whitelisted peer %s: %s\", sp, reason)\n\t\treturn false\n\t}\n\n\twarnThreshold := cfg.BanThreshold >> 1\n\tif transient == 0 && persistent == 0 {\n\t\t// The score is not being increased, but a warning message is still\n\t\t// logged if the score is above the warn threshold.\n\t\tscore := sp.banScore.Int()\n\t\tif score > warnThreshold {\n\t\t\tpeerLog.Warnf(\"Misbehaving peer %s: %s -- ban score is %d, \"+\n\t\t\t\t\"it was not increased this time\", sp, reason, score)\n\t\t}\n\t\treturn false\n\t}\n\tscore := sp.banScore.Increase(persistent, transient)\n\tif score > warnThreshold {\n\t\tpeerLog.Warnf(\"Misbehaving peer %s: %s -- ban score increased to %d\",\n\t\t\tsp, reason, score)\n\t\tif score > cfg.BanThreshold {\n\t\t\tpeerLog.Warnf(\"Misbehaving peer %s -- banning and disconnecting\",\n\t\t\t\tsp)\n\t\t\tsp.server.BanPeer(sp)\n\t\t\tsp.Disconnect()\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// hasServices returns whether or not the provided advertised service flags have\n// all of the provided desired service flags set.\nfunc hasServices(advertised, desired wire.ServiceFlag) bool {\n\treturn advertised&desired == desired\n}\n\n// ShouldReconnectV1 is invoked when we need to determine if we are going to\n// reconnect to an outbound peer. This will return true if we attempted to\n// connect to the peer using the v2 transport, and need to fall back to v1.\nfunc (sp *serverPeer) ShouldReconnectV1() bool {\n\treturn sp.ShouldDowngradeToV1()\n}\n\n// OnVersion is invoked when a peer receives a version bitcoin message\n// and is used to negotiate the protocol version details as well as kick start\n// the communications.\nfunc (sp *serverPeer) OnVersion(_ *peer.Peer, msg *wire.MsgVersion) *wire.MsgReject {\n\t// Update the address manager with the advertised services for outbound\n\t// connections in case they have changed.  This is not done for inbound\n\t// connections to help prevent malicious behavior and is skipped when\n\t// running on the simulation test network since it is only intended to\n\t// connect to specified peers and actively avoids advertising and\n\t// connecting to discovered peers.\n\t//\n\t// NOTE: This is done before rejecting peers that are too old to ensure\n\t// it is updated regardless in the case a new minimum protocol version is\n\t// enforced and the remote node has not upgraded yet.\n\tisInbound := sp.Inbound()\n\tremoteAddr := sp.NA()\n\taddrManager := sp.server.addrManager\n\tif !cfg.SimNet && !isInbound {\n\t\taddrManager.SetServices(remoteAddr, msg.Services)\n\t}\n\n\t// Ignore peers that have a protocol version that is too old.  The peer\n\t// negotiation logic will disconnect it after this callback returns.\n\tif msg.ProtocolVersion < int32(peer.MinAcceptableProtocolVersion) {\n\t\treturn nil\n\t}\n\n\t// Reject outbound peers that are not full nodes.\n\twantServices := wire.SFNodeNetwork\n\tif !isInbound && !hasServices(msg.Services, wantServices) {\n\t\tmissingServices := wantServices & ^msg.Services\n\t\tsrvrLog.Debugf(\"Rejecting peer %s with services %v due to not \"+\n\t\t\t\"providing desired services %v\", sp.Peer, msg.Services,\n\t\t\tmissingServices)\n\t\treason := fmt.Sprintf(\"required services %#x not offered\",\n\t\t\tuint64(missingServices))\n\t\treturn wire.NewMsgReject(msg.Command(), wire.RejectNonstandard, reason)\n\t}\n\n\tif !cfg.SimNet && !isInbound {\n\t\t// After soft-fork activation, only make outbound\n\t\t// connection to peers if they flag that they're segwit\n\t\t// enabled.\n\t\tchain := sp.server.chain\n\t\tsegwitActive, err := chain.IsDeploymentActive(chaincfg.DeploymentSegwit)\n\t\tif err != nil {\n\t\t\tpeerLog.Errorf(\"Unable to query for segwit soft-fork state: %v\",\n\t\t\t\terr)\n\t\t\treturn nil\n\t\t}\n\n\t\tif segwitActive && !sp.IsWitnessEnabled() {\n\t\t\tpeerLog.Infof(\"Disconnecting non-segwit peer %v, isn't segwit \"+\n\t\t\t\t\"enabled and we need more segwit enabled peers\", sp)\n\t\t\tsp.Disconnect()\n\t\t\treturn nil\n\t\t}\n\t}\n\n\t// Add the remote peer time as a sample for creating an offset against\n\t// the local clock to keep the network time in sync.\n\tsp.server.timeSource.AddTimeSample(sp.Addr(), msg.Timestamp)\n\n\t// Choose whether or not to relay transactions before a filter command\n\t// is received.\n\tsp.setDisableRelayTx(msg.DisableRelayTx)\n\n\treturn nil\n}\n\n// OnVerAck is invoked when a peer receives a verack bitcoin message and is used\n// to kick start communication with them.\nfunc (sp *serverPeer) OnVerAck(_ *peer.Peer, _ *wire.MsgVerAck) {\n\tsp.server.AddPeer(sp)\n}\n\n// OnMemPool is invoked when a peer receives a mempool bitcoin message.\n// It creates and sends an inventory message with the contents of the memory\n// pool up to the maximum inventory allowed per message.  When the peer has a\n// bloom filter loaded, the contents are filtered accordingly.\nfunc (sp *serverPeer) OnMemPool(_ *peer.Peer, msg *wire.MsgMemPool) {\n\t// Only allow mempool requests if the server has bloom filtering\n\t// enabled.\n\tif sp.server.services&wire.SFNodeBloom != wire.SFNodeBloom {\n\t\tpeerLog.Debugf(\"peer %v sent mempool request with bloom \"+\n\t\t\t\"filtering disabled -- disconnecting\", sp)\n\t\tsp.Disconnect()\n\t\treturn\n\t}\n\n\t// A decaying ban score increase is applied to prevent flooding.\n\t// The ban score accumulates and passes the ban threshold if a burst of\n\t// mempool messages comes from a peer. The score decays each minute to\n\t// half of its value.\n\tif sp.addBanScore(0, 33, \"mempool\") {\n\t\treturn\n\t}\n\n\t// Generate inventory message with the available transactions in the\n\t// transaction memory pool.  Limit it to the max allowed inventory\n\t// per message.  The NewMsgInvSizeHint function automatically limits\n\t// the passed hint to the maximum allowed, so it's safe to pass it\n\t// without double checking it here.\n\ttxMemPool := sp.server.txMemPool\n\ttxDescs := txMemPool.TxDescs()\n\tinvMsg := wire.NewMsgInvSizeHint(uint(len(txDescs)))\n\n\tfor _, txDesc := range txDescs {\n\t\t// Either add all transactions when there is no bloom filter,\n\t\t// or only the transactions that match the filter when there is\n\t\t// one.\n\t\tif !sp.filter.IsLoaded() || sp.filter.MatchTxAndUpdate(txDesc.Tx) {\n\t\t\tiv := wire.NewInvVect(wire.InvTypeTx, txDesc.Tx.Hash())\n\t\t\tinvMsg.AddInvVect(iv)\n\t\t\tif len(invMsg.InvList)+1 > wire.MaxInvPerMsg {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Send the inventory message if there is anything to send.\n\tif len(invMsg.InvList) > 0 {\n\t\tsp.QueueMessage(invMsg, nil)\n\t}\n}\n\n// OnTx is invoked when a peer receives a tx bitcoin message.  It blocks\n// until the bitcoin transaction has been fully processed.  Unlock the block\n// handler this does not serialize all transactions through a single thread\n// transactions don't rely on the previous one in a linear fashion like blocks.\nfunc (sp *serverPeer) OnTx(_ *peer.Peer, msg *wire.MsgTx) {\n\tif cfg.BlocksOnly {\n\t\tpeerLog.Tracef(\"Ignoring tx %v from %v - blocksonly enabled\",\n\t\t\tmsg.TxHash(), sp)\n\t\treturn\n\t}\n\n\t// Add the transaction to the known inventory for the peer.\n\t// Convert the raw MsgTx to a btcutil.Tx which provides some convenience\n\t// methods and things such as hash caching.\n\ttx := btcutil.NewTx(msg)\n\tiv := wire.NewInvVect(wire.InvTypeTx, tx.Hash())\n\tsp.AddKnownInventory(iv)\n\n\t// Queue the transaction up to be handled by the sync manager and\n\t// intentionally block further receives until the transaction is fully\n\t// processed and known good or bad.  This helps prevent a malicious peer\n\t// from queuing up a bunch of bad transactions before disconnecting (or\n\t// being disconnected) and wasting memory.\n\tsp.server.syncManager.QueueTx(tx, sp.Peer, sp.txProcessed)\n\t<-sp.txProcessed\n}\n\n// OnBlock is invoked when a peer receives a block bitcoin message.  It\n// blocks until the bitcoin block has been fully processed.\nfunc (sp *serverPeer) OnBlock(_ *peer.Peer, msg *wire.MsgBlock, buf []byte) {\n\t// Convert the raw MsgBlock to a btcutil.Block which provides some\n\t// convenience methods and things such as hash caching.\n\tblock := btcutil.NewBlockFromBlockAndBytes(msg, buf)\n\n\t// Add the block to the known inventory for the peer.\n\tiv := wire.NewInvVect(wire.InvTypeBlock, block.Hash())\n\tsp.AddKnownInventory(iv)\n\n\t// Queue the block up to be handled by the block\n\t// manager and intentionally block further receives\n\t// until the bitcoin block is fully processed and known\n\t// good or bad.  This helps prevent a malicious peer\n\t// from queuing up a bunch of bad blocks before\n\t// disconnecting (or being disconnected) and wasting\n\t// memory.  Additionally, this behavior is depended on\n\t// by at least the block acceptance test tool as the\n\t// reference implementation processes blocks in the same\n\t// thread and therefore blocks further messages until\n\t// the bitcoin block has been fully processed.\n\tsp.server.syncManager.QueueBlock(block, sp.Peer, sp.blockProcessed)\n\t<-sp.blockProcessed\n}\n\n// OnInv is invoked when a peer receives an inv bitcoin message and is\n// used to examine the inventory being advertised by the remote peer and react\n// accordingly.  We pass the message down to blockmanager which will call\n// QueueMessage with any appropriate responses.\nfunc (sp *serverPeer) OnInv(_ *peer.Peer, msg *wire.MsgInv) {\n\tif !cfg.BlocksOnly {\n\t\tif len(msg.InvList) > 0 {\n\t\t\tsp.server.syncManager.QueueInv(msg, sp.Peer)\n\t\t}\n\t\treturn\n\t}\n\n\tnewInv := wire.NewMsgInvSizeHint(uint(len(msg.InvList)))\n\tfor _, invVect := range msg.InvList {\n\t\tif invVect.Type == wire.InvTypeTx {\n\t\t\tpeerLog.Tracef(\"Ignoring tx %v in inv from %v -- \"+\n\t\t\t\t\"blocksonly enabled\", invVect.Hash, sp)\n\t\t\tif sp.ProtocolVersion() >= wire.BIP0037Version {\n\t\t\t\tpeerLog.Infof(\"Peer %v is announcing \"+\n\t\t\t\t\t\"transactions -- disconnecting\", sp)\n\t\t\t\tsp.Disconnect()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\terr := newInv.AddInvVect(invVect)\n\t\tif err != nil {\n\t\t\tpeerLog.Errorf(\"Failed to add inventory vector: %v\", err)\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif len(newInv.InvList) > 0 {\n\t\tsp.server.syncManager.QueueInv(newInv, sp.Peer)\n\t}\n}\n\n// OnHeaders is invoked when a peer receives a headers bitcoin\n// message.  The message is passed down to the sync manager.\nfunc (sp *serverPeer) OnHeaders(_ *peer.Peer, msg *wire.MsgHeaders) {\n\tsp.server.syncManager.QueueHeaders(msg, sp.Peer)\n}\n\n// OnGetData is invoked when a peer receives a getdata bitcoin message and is\n// used to deliver block and transaction information.\nfunc (sp *serverPeer) OnGetData(_ *peer.Peer, msg *wire.MsgGetData) {\n\t// failedMsg is an inventory that stores all the failed msgs - either\n\t// the msg is an unknown type, or there's an error processing it.\n\tfailedMsg := wire.NewMsgNotFound()\n\n\tlength := len(msg.InvList)\n\n\t// A decaying ban score increase is applied to prevent exhausting\n\t// resources with unusually large inventory queries.\n\t//\n\t// Requesting more than the maximum inventory vector length within a\n\t// short period of time yields a score above the default ban threshold.\n\t// Sustained bursts of small requests are not penalized as that would\n\t// potentially ban peers performing IBD.\n\t//\n\t// This incremental score decays each minute to half of its value.\n\tif sp.addBanScore(0, uint32(length)*99/wire.MaxInvPerMsg, \"getdata\") {\n\t\treturn\n\t}\n\n\t// We wait on this wait channel periodically to prevent queuing far\n\t// more data than we can send in a reasonable time, wasting memory. The\n\t// waiting occurs after the database fetch for the next one to provide\n\t// a little pipelining.\n\n\t// We now create a doneChans with a size of 5, which essentially\n\t// behaves like a semaphore that allows 5 goroutines to be running at\n\t// the same time.\n\tconst numBuffered = 5\n\tdoneChans := make([]chan struct{}, 0, numBuffered)\n\n\tfor i, iv := range msg.InvList {\n\t\t// doneChan behaves like a semaphore - every time a msg is\n\t\t// processed, either succeeded or failed, a signal is sent to\n\t\t// this doneChan.\n\t\tdoneChan := make(chan struct{}, 1)\n\n\t\t// Add this doneChan for tracking.\n\t\tdoneChans = append(doneChans, doneChan)\n\n\t\terr := sp.server.pushInventory(sp, iv, doneChan)\n\t\tif err != nil {\n\t\t\tfailedMsg.AddInvVect(iv)\n\t\t}\n\n\t\t// Move to the next item if we haven't processed 5 times yet.\n\t\tif (i+1)%numBuffered != 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Empty all the slots.\n\t\tfor _, dc := range doneChans {\n\t\t\tselect {\n\t\t\t// NOTE: We always expect am empty struct to be sent to\n\t\t\t// this doneChan, even when `pushInventory` failed.\n\t\t\tcase <-dc:\n\n\t\t\t// Exit if the server is shutting down.\n\t\t\tcase <-sp.quit:\n\t\t\t\tpeerLog.Debug(\"Server shutting down in \" +\n\t\t\t\t\t\"OnGetData\")\n\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// Re-initialize the done chans.\n\t\tdoneChans = make([]chan struct{}, 0, numBuffered)\n\t}\n\n\tif len(failedMsg.InvList) != 0 {\n\t\tdoneChan := make(chan struct{}, 1)\n\n\t\t// Add this doneChan for tracking.\n\t\tdoneChans = append(doneChans, doneChan)\n\n\t\t// Send the failed msgs.\n\t\tsp.QueueMessage(failedMsg, doneChan)\n\t}\n\n\t// Wait for messages to be sent. We can send quite a lot of data at\n\t// this point and this will keep the peer busy for a decent amount of\n\t// time. We don't process anything else by them in this time so that we\n\t// have an idea of when we should hear back from them - else the idle\n\t// timeout could fire when we were only half done sending the blocks.\n\tfor _, dc := range doneChans {\n\t\tselect {\n\t\tcase <-dc:\n\n\t\t// Exit if the server is shutting down.\n\t\tcase <-sp.quit:\n\t\t\tpeerLog.Debug(\"Server shutting down in OnGetData\")\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// pushInventory sends the requested inventory to the given peer.\nfunc (s *server) pushInventory(sp *serverPeer, iv *wire.InvVect,\n\tdoneChan chan<- struct{}) error {\n\n\tswitch iv.Type {\n\tcase wire.InvTypeWitnessTx:\n\t\treturn s.pushTxMsg(sp, &iv.Hash, doneChan, wire.WitnessEncoding)\n\n\tcase wire.InvTypeTx:\n\t\treturn s.pushTxMsg(sp, &iv.Hash, doneChan, wire.BaseEncoding)\n\n\tcase wire.InvTypeWitnessBlock:\n\t\treturn s.pushBlockMsg(\n\t\t\tsp, &iv.Hash, doneChan, wire.WitnessEncoding,\n\t\t)\n\n\tcase wire.InvTypeBlock:\n\t\treturn s.pushBlockMsg(sp, &iv.Hash, doneChan, wire.BaseEncoding)\n\n\tcase wire.InvTypeFilteredWitnessBlock:\n\t\treturn s.pushMerkleBlockMsg(\n\t\t\tsp, &iv.Hash, doneChan, wire.WitnessEncoding,\n\t\t)\n\n\tcase wire.InvTypeFilteredBlock:\n\t\treturn s.pushMerkleBlockMsg(\n\t\t\tsp, &iv.Hash, doneChan, wire.BaseEncoding,\n\t\t)\n\n\tdefault:\n\t\tpeerLog.Warnf(\"Unknown type in inventory request %d\", iv.Type)\n\n\t\tif doneChan != nil {\n\t\t\tdoneChan <- struct{}{}\n\t\t}\n\n\t\treturn errors.New(\"unknown inventory type\")\n\t}\n}\n\n// OnGetBlocks is invoked when a peer receives a getblocks bitcoin\n// message.\nfunc (sp *serverPeer) OnGetBlocks(_ *peer.Peer, msg *wire.MsgGetBlocks) {\n\t// Find the most recent known block in the best chain based on the block\n\t// locator and fetch all of the block hashes after it until either\n\t// wire.MaxBlocksPerMsg have been fetched or the provided stop hash is\n\t// encountered.\n\t//\n\t// Use the block after the genesis block if no other blocks in the\n\t// provided locator are known.  This does mean the client will start\n\t// over with the genesis block if unknown block locators are provided.\n\t//\n\t// This mirrors the behavior in the reference implementation.\n\tchain := sp.server.chain\n\thashList := chain.LocateBlocks(msg.BlockLocatorHashes, &msg.HashStop,\n\t\twire.MaxBlocksPerMsg)\n\n\t// Generate inventory message.\n\tinvMsg := wire.NewMsgInv()\n\tfor i := range hashList {\n\t\tiv := wire.NewInvVect(wire.InvTypeBlock, &hashList[i])\n\t\tinvMsg.AddInvVect(iv)\n\t}\n\n\t// Send the inventory message if there is anything to send.\n\tif len(invMsg.InvList) > 0 {\n\t\tinvListLen := len(invMsg.InvList)\n\t\tif invListLen == wire.MaxBlocksPerMsg {\n\t\t\t// Intentionally use a copy of the final hash so there\n\t\t\t// is not a reference into the inventory slice which\n\t\t\t// would prevent the entire slice from being eligible\n\t\t\t// for GC as soon as it's sent.\n\t\t\tcontinueHash := invMsg.InvList[invListLen-1].Hash\n\t\t\tsp.continueHash = &continueHash\n\t\t}\n\t\tsp.QueueMessage(invMsg, nil)\n\t}\n}\n\n// OnGetHeaders is invoked when a peer receives a getheaders bitcoin\n// message.\nfunc (sp *serverPeer) OnGetHeaders(_ *peer.Peer, msg *wire.MsgGetHeaders) {\n\t// Ignore getheaders requests if not in sync.\n\tif !sp.server.syncManager.IsCurrent() {\n\t\treturn\n\t}\n\n\t// Find the most recent known block in the best chain based on the block\n\t// locator and fetch all of the headers after it until either\n\t// wire.MaxBlockHeadersPerMsg have been fetched or the provided stop\n\t// hash is encountered.\n\t//\n\t// Use the block after the genesis block if no other blocks in the\n\t// provided locator are known.  This does mean the client will start\n\t// over with the genesis block if unknown block locators are provided.\n\t//\n\t// This mirrors the behavior in the reference implementation.\n\tchain := sp.server.chain\n\theaders := chain.LocateHeaders(msg.BlockLocatorHashes, &msg.HashStop)\n\n\t// Send found headers to the requesting peer.\n\tblockHeaders := make([]*wire.BlockHeader, len(headers))\n\tfor i := range headers {\n\t\tblockHeaders[i] = &headers[i]\n\t}\n\tsp.QueueMessage(&wire.MsgHeaders{Headers: blockHeaders}, nil)\n}\n\n// OnGetCFilters is invoked when a peer receives a getcfilters bitcoin message.\nfunc (sp *serverPeer) OnGetCFilters(_ *peer.Peer, msg *wire.MsgGetCFilters) {\n\t// Ignore getcfilters requests if not in sync.\n\tif !sp.server.syncManager.IsCurrent() {\n\t\treturn\n\t}\n\n\t// We'll also ensure that the remote party is requesting a set of\n\t// filters that we actually currently maintain.\n\tswitch msg.FilterType {\n\tcase wire.GCSFilterRegular:\n\t\tbreak\n\n\tdefault:\n\t\tpeerLog.Debug(\"Filter request for unknown filter: %v\",\n\t\t\tmsg.FilterType)\n\t\treturn\n\t}\n\n\thashes, err := sp.server.chain.HeightToHashRange(\n\t\tint32(msg.StartHeight), &msg.StopHash, wire.MaxGetCFiltersReqRange,\n\t)\n\tif err != nil {\n\t\tpeerLog.Debugf(\"Invalid getcfilters request: %v\", err)\n\t\treturn\n\t}\n\n\t// Create []*chainhash.Hash from []chainhash.Hash to pass to\n\t// FiltersByBlockHashes.\n\thashPtrs := make([]*chainhash.Hash, len(hashes))\n\tfor i := range hashes {\n\t\thashPtrs[i] = &hashes[i]\n\t}\n\n\tfilters, err := sp.server.cfIndex.FiltersByBlockHashes(\n\t\thashPtrs, msg.FilterType,\n\t)\n\tif err != nil {\n\t\tpeerLog.Errorf(\"Error retrieving cfilters: %v\", err)\n\t\treturn\n\t}\n\n\tfor i, filterBytes := range filters {\n\t\tif len(filterBytes) == 0 {\n\t\t\tpeerLog.Warnf(\"Could not obtain cfilter for %v\",\n\t\t\t\thashes[i])\n\t\t\treturn\n\t\t}\n\n\t\tfilterMsg := wire.NewMsgCFilter(\n\t\t\tmsg.FilterType, &hashes[i], filterBytes,\n\t\t)\n\t\tsp.QueueMessage(filterMsg, nil)\n\t}\n}\n\n// OnGetCFHeaders is invoked when a peer receives a getcfheader bitcoin message.\nfunc (sp *serverPeer) OnGetCFHeaders(_ *peer.Peer, msg *wire.MsgGetCFHeaders) {\n\t// Ignore getcfilterheader requests if not in sync.\n\tif !sp.server.syncManager.IsCurrent() {\n\t\treturn\n\t}\n\n\t// We'll also ensure that the remote party is requesting a set of\n\t// headers for filters that we actually currently maintain.\n\tswitch msg.FilterType {\n\tcase wire.GCSFilterRegular:\n\t\tbreak\n\n\tdefault:\n\t\tpeerLog.Debug(\"Filter request for unknown headers for \"+\n\t\t\t\"filter: %v\", msg.FilterType)\n\t\treturn\n\t}\n\n\tstartHeight := int32(msg.StartHeight)\n\tmaxResults := wire.MaxCFHeadersPerMsg\n\n\t// If StartHeight is positive, fetch the predecessor block hash so we\n\t// can populate the PrevFilterHeader field.\n\tif msg.StartHeight > 0 {\n\t\tstartHeight--\n\t\tmaxResults++\n\t}\n\n\t// Fetch the hashes from the block index.\n\thashList, err := sp.server.chain.HeightToHashRange(\n\t\tstartHeight, &msg.StopHash, maxResults,\n\t)\n\tif err != nil {\n\t\tpeerLog.Debugf(\"Invalid getcfheaders request: %v\", err)\n\t}\n\n\t// This is possible if StartHeight is one greater that the height of\n\t// StopHash, and we pull a valid range of hashes including the previous\n\t// filter header.\n\tif len(hashList) == 0 || (msg.StartHeight > 0 && len(hashList) == 1) {\n\t\tpeerLog.Debug(\"No results for getcfheaders request\")\n\t\treturn\n\t}\n\n\t// Create []*chainhash.Hash from []chainhash.Hash to pass to\n\t// FilterHeadersByBlockHashes.\n\thashPtrs := make([]*chainhash.Hash, len(hashList))\n\tfor i := range hashList {\n\t\thashPtrs[i] = &hashList[i]\n\t}\n\n\t// Fetch the raw filter hash bytes from the database for all blocks.\n\tfilterHashes, err := sp.server.cfIndex.FilterHashesByBlockHashes(\n\t\thashPtrs, msg.FilterType,\n\t)\n\tif err != nil {\n\t\tpeerLog.Errorf(\"Error retrieving cfilter hashes: %v\", err)\n\t\treturn\n\t}\n\n\t// Generate cfheaders message and send it.\n\theadersMsg := wire.NewMsgCFHeaders()\n\n\t// Populate the PrevFilterHeader field.\n\tif msg.StartHeight > 0 {\n\t\tprevBlockHash := &hashList[0]\n\n\t\t// Fetch the raw committed filter header bytes from the\n\t\t// database.\n\t\theaderBytes, err := sp.server.cfIndex.FilterHeaderByBlockHash(\n\t\t\tprevBlockHash, msg.FilterType)\n\t\tif err != nil {\n\t\t\tpeerLog.Errorf(\"Error retrieving CF header: %v\", err)\n\t\t\treturn\n\t\t}\n\t\tif len(headerBytes) == 0 {\n\t\t\tpeerLog.Warnf(\"Could not obtain CF header for %v\", prevBlockHash)\n\t\t\treturn\n\t\t}\n\n\t\t// Deserialize the hash into PrevFilterHeader.\n\t\terr = headersMsg.PrevFilterHeader.SetBytes(headerBytes)\n\t\tif err != nil {\n\t\t\tpeerLog.Warnf(\"Committed filter header deserialize \"+\n\t\t\t\t\"failed: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\thashList = hashList[1:]\n\t\tfilterHashes = filterHashes[1:]\n\t}\n\n\t// Populate HeaderHashes.\n\tfor i, hashBytes := range filterHashes {\n\t\tif len(hashBytes) == 0 {\n\t\t\tpeerLog.Warnf(\"Could not obtain CF hash for %v\", hashList[i])\n\t\t\treturn\n\t\t}\n\n\t\t// Deserialize the hash.\n\t\tfilterHash, err := chainhash.NewHash(hashBytes)\n\t\tif err != nil {\n\t\t\tpeerLog.Warnf(\"Committed filter hash deserialize \"+\n\t\t\t\t\"failed: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\theadersMsg.AddCFHash(filterHash)\n\t}\n\n\theadersMsg.FilterType = msg.FilterType\n\theadersMsg.StopHash = msg.StopHash\n\n\tsp.QueueMessage(headersMsg, nil)\n}\n\n// OnGetCFCheckpt is invoked when a peer receives a getcfcheckpt bitcoin message.\nfunc (sp *serverPeer) OnGetCFCheckpt(_ *peer.Peer, msg *wire.MsgGetCFCheckpt) {\n\t// Ignore getcfcheckpt requests if not in sync.\n\tif !sp.server.syncManager.IsCurrent() {\n\t\treturn\n\t}\n\n\t// We'll also ensure that the remote party is requesting a set of\n\t// checkpoints for filters that we actually currently maintain.\n\tswitch msg.FilterType {\n\tcase wire.GCSFilterRegular:\n\t\tbreak\n\n\tdefault:\n\t\tpeerLog.Debug(\"Filter request for unknown checkpoints for \"+\n\t\t\t\"filter: %v\", msg.FilterType)\n\t\treturn\n\t}\n\n\t// Now that we know the client is fetching a filter that we know of,\n\t// we'll fetch the block hashes et each check point interval so we can\n\t// compare against our cache, and create new check points if necessary.\n\tblockHashes, err := sp.server.chain.IntervalBlockHashes(\n\t\t&msg.StopHash, wire.CFCheckptInterval,\n\t)\n\tif err != nil {\n\t\tpeerLog.Debugf(\"Invalid getcfilters request: %v\", err)\n\t\treturn\n\t}\n\n\tcheckptMsg := wire.NewMsgCFCheckpt(\n\t\tmsg.FilterType, &msg.StopHash, len(blockHashes),\n\t)\n\n\t// Fetch the current existing cache so we can decide if we need to\n\t// extend it or if its adequate as is.\n\tsp.server.cfCheckptCachesMtx.RLock()\n\tcheckptCache := sp.server.cfCheckptCaches[msg.FilterType]\n\n\t// If the set of block hashes is beyond the current size of the cache,\n\t// then we'll expand the size of the cache and also retain the write\n\t// lock.\n\tvar updateCache bool\n\tif len(blockHashes) > len(checkptCache) {\n\t\t// Now that we know we'll need to modify the size of the cache,\n\t\t// we'll release the read lock and grab the write lock to\n\t\t// possibly expand the cache size.\n\t\tsp.server.cfCheckptCachesMtx.RUnlock()\n\n\t\tsp.server.cfCheckptCachesMtx.Lock()\n\t\tdefer sp.server.cfCheckptCachesMtx.Unlock()\n\n\t\t// Now that we have the write lock, we'll check again as it's\n\t\t// possible that the cache has already been expanded.\n\t\tcheckptCache = sp.server.cfCheckptCaches[msg.FilterType]\n\n\t\t// If we still need to expand the cache, then We'll mark that\n\t\t// we need to update the cache for below and also expand the\n\t\t// size of the cache in place.\n\t\tif len(blockHashes) > len(checkptCache) {\n\t\t\tupdateCache = true\n\n\t\t\tadditionalLength := len(blockHashes) - len(checkptCache)\n\t\t\tnewEntries := make([]cfHeaderKV, additionalLength)\n\n\t\t\tpeerLog.Infof(\"Growing size of checkpoint cache from %v to %v \"+\n\t\t\t\t\"block hashes\", len(checkptCache), len(blockHashes))\n\n\t\t\tcheckptCache = append(\n\t\t\t\tsp.server.cfCheckptCaches[msg.FilterType],\n\t\t\t\tnewEntries...,\n\t\t\t)\n\t\t}\n\t} else {\n\t\t// Otherwise, we'll hold onto the read lock for the remainder\n\t\t// of this method.\n\t\tdefer sp.server.cfCheckptCachesMtx.RUnlock()\n\n\t\tpeerLog.Tracef(\"Serving stale cache of size %v\",\n\t\t\tlen(checkptCache))\n\t}\n\n\t// Now that we know the cache is of an appropriate size, we'll iterate\n\t// backwards until the find the block hash. We do this as it's possible\n\t// a re-org has occurred so items in the db are now in the main china\n\t// while the cache has been partially invalidated.\n\tvar forkIdx int\n\tfor forkIdx = len(blockHashes); forkIdx > 0; forkIdx-- {\n\t\tif checkptCache[forkIdx-1].blockHash == blockHashes[forkIdx-1] {\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// Now that we know the how much of the cache is relevant for this\n\t// query, we'll populate our check point message with the cache as is.\n\t// Shortly below, we'll populate the new elements of the cache.\n\tfor i := 0; i < forkIdx; i++ {\n\t\tcheckptMsg.AddCFHeader(&checkptCache[i].filterHeader)\n\t}\n\n\t// We'll now collect the set of hashes that are beyond our cache so we\n\t// can look up the filter headers to populate the final cache.\n\tblockHashPtrs := make([]*chainhash.Hash, 0, len(blockHashes)-forkIdx)\n\tfor i := forkIdx; i < len(blockHashes); i++ {\n\t\tblockHashPtrs = append(blockHashPtrs, &blockHashes[i])\n\t}\n\tfilterHeaders, err := sp.server.cfIndex.FilterHeadersByBlockHashes(\n\t\tblockHashPtrs, msg.FilterType,\n\t)\n\tif err != nil {\n\t\tpeerLog.Errorf(\"Error retrieving cfilter headers: %v\", err)\n\t\treturn\n\t}\n\n\t// Now that we have the full set of filter headers, we'll add them to\n\t// the checkpoint message, and also update our cache in line.\n\tfor i, filterHeaderBytes := range filterHeaders {\n\t\tif len(filterHeaderBytes) == 0 {\n\t\t\tpeerLog.Warnf(\"Could not obtain CF header for %v\",\n\t\t\t\tblockHashPtrs[i])\n\t\t\treturn\n\t\t}\n\n\t\tfilterHeader, err := chainhash.NewHash(filterHeaderBytes)\n\t\tif err != nil {\n\t\t\tpeerLog.Warnf(\"Committed filter header deserialize \"+\n\t\t\t\t\"failed: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tcheckptMsg.AddCFHeader(filterHeader)\n\n\t\t// If the new main chain is longer than what's in the cache,\n\t\t// then we'll override it beyond the fork point.\n\t\tif updateCache {\n\t\t\tcheckptCache[forkIdx+i] = cfHeaderKV{\n\t\t\t\tblockHash:    blockHashes[forkIdx+i],\n\t\t\t\tfilterHeader: *filterHeader,\n\t\t\t}\n\t\t}\n\t}\n\n\t// Finally, we'll update the cache if we need to, and send the final\n\t// message back to the requesting peer.\n\tif updateCache {\n\t\tsp.server.cfCheckptCaches[msg.FilterType] = checkptCache\n\t}\n\n\tsp.QueueMessage(checkptMsg, nil)\n}\n\n// enforceNodeBloomFlag disconnects the peer if the server is not configured to\n// allow bloom filters.  Additionally, if the peer has negotiated to a protocol\n// version  that is high enough to observe the bloom filter service support bit,\n// it will be banned since it is intentionally violating the protocol.\nfunc (sp *serverPeer) enforceNodeBloomFlag(cmd string) bool {\n\tif sp.server.services&wire.SFNodeBloom != wire.SFNodeBloom {\n\t\t// Ban the peer if the protocol version is high enough that the\n\t\t// peer is knowingly violating the protocol and banning is\n\t\t// enabled.\n\t\t//\n\t\t// NOTE: Even though the addBanScore function already examines\n\t\t// whether or not banning is enabled, it is checked here as well\n\t\t// to ensure the violation is logged and the peer is\n\t\t// disconnected regardless.\n\t\tif sp.ProtocolVersion() >= wire.BIP0111Version &&\n\t\t\t!cfg.DisableBanning {\n\n\t\t\t// Disconnect the peer regardless of whether it was\n\t\t\t// banned.\n\t\t\tsp.addBanScore(100, 0, cmd)\n\t\t\tsp.Disconnect()\n\t\t\treturn false\n\t\t}\n\n\t\t// Disconnect the peer regardless of protocol version or banning\n\t\t// state.\n\t\tpeerLog.Debugf(\"%s sent an unsupported %s request -- \"+\n\t\t\t\"disconnecting\", sp, cmd)\n\t\tsp.Disconnect()\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// OnFeeFilter is invoked when a peer receives a feefilter bitcoin message and\n// is used by remote peers to request that no transactions which have a fee rate\n// lower than provided value are inventoried to them.  The peer will be\n// disconnected if an invalid fee filter value is provided.\nfunc (sp *serverPeer) OnFeeFilter(_ *peer.Peer, msg *wire.MsgFeeFilter) {\n\t// Check that the passed minimum fee is a valid amount.\n\tif msg.MinFee < 0 || msg.MinFee > btcutil.MaxSatoshi {\n\t\tpeerLog.Debugf(\"Peer %v sent an invalid feefilter '%v' -- \"+\n\t\t\t\"disconnecting\", sp, btcutil.Amount(msg.MinFee))\n\t\tsp.Disconnect()\n\t\treturn\n\t}\n\n\tatomic.StoreInt64(&sp.feeFilter, msg.MinFee)\n}\n\n// OnFilterAdd is invoked when a peer receives a filteradd bitcoin\n// message and is used by remote peers to add data to an already loaded bloom\n// filter.  The peer will be disconnected if a filter is not loaded when this\n// message is received or the server is not configured to allow bloom filters.\nfunc (sp *serverPeer) OnFilterAdd(_ *peer.Peer, msg *wire.MsgFilterAdd) {\n\t// Disconnect and/or ban depending on the node bloom services flag and\n\t// negotiated protocol version.\n\tif !sp.enforceNodeBloomFlag(msg.Command()) {\n\t\treturn\n\t}\n\n\tif !sp.filter.IsLoaded() {\n\t\tpeerLog.Debugf(\"%s sent a filteradd request with no filter \"+\n\t\t\t\"loaded -- disconnecting\", sp)\n\t\tsp.Disconnect()\n\t\treturn\n\t}\n\n\tsp.filter.Add(msg.Data)\n}\n\n// OnFilterClear is invoked when a peer receives a filterclear bitcoin\n// message and is used by remote peers to clear an already loaded bloom filter.\n// The peer will be disconnected if a filter is not loaded when this message is\n// received  or the server is not configured to allow bloom filters.\nfunc (sp *serverPeer) OnFilterClear(_ *peer.Peer, msg *wire.MsgFilterClear) {\n\t// Disconnect and/or ban depending on the node bloom services flag and\n\t// negotiated protocol version.\n\tif !sp.enforceNodeBloomFlag(msg.Command()) {\n\t\treturn\n\t}\n\n\tif !sp.filter.IsLoaded() {\n\t\tpeerLog.Debugf(\"%s sent a filterclear request with no \"+\n\t\t\t\"filter loaded -- disconnecting\", sp)\n\t\tsp.Disconnect()\n\t\treturn\n\t}\n\n\tsp.filter.Unload()\n}\n\n// OnFilterLoad is invoked when a peer receives a filterload bitcoin\n// message and it used to load a bloom filter that should be used for\n// delivering merkle blocks and associated transactions that match the filter.\n// The peer will be disconnected if the server is not configured to allow bloom\n// filters.\nfunc (sp *serverPeer) OnFilterLoad(_ *peer.Peer, msg *wire.MsgFilterLoad) {\n\t// Disconnect and/or ban depending on the node bloom services flag and\n\t// negotiated protocol version.\n\tif !sp.enforceNodeBloomFlag(msg.Command()) {\n\t\treturn\n\t}\n\n\tsp.setDisableRelayTx(false)\n\n\tsp.filter.Reload(msg)\n}\n\n// OnGetAddr is invoked when a peer receives a getaddr bitcoin message\n// and is used to provide the peer with known addresses from the address\n// manager.\nfunc (sp *serverPeer) OnGetAddr(_ *peer.Peer, msg *wire.MsgGetAddr) {\n\t// Don't return any addresses when running on the simulation test\n\t// network.  This helps prevent the network from becoming another\n\t// public test network since it will not be able to learn about other\n\t// peers that have not specifically been provided.\n\tif cfg.SimNet {\n\t\treturn\n\t}\n\n\t// Do not accept getaddr requests from outbound peers.  This reduces\n\t// fingerprinting attacks.\n\tif !sp.Inbound() {\n\t\tpeerLog.Debugf(\"Ignoring getaddr request from outbound peer \"+\n\t\t\t\"%v\", sp)\n\t\treturn\n\t}\n\n\t// Only allow one getaddr request per connection to discourage\n\t// address stamping of inv announcements.\n\tif sp.sentAddrs {\n\t\tpeerLog.Debugf(\"Ignoring repeated getaddr request from peer \"+\n\t\t\t\"%v\", sp)\n\t\treturn\n\t}\n\tsp.sentAddrs = true\n\n\t// Get the current known addresses from the address manager.\n\taddrCache := sp.server.addrManager.AddressCache()\n\n\t// Push the addresses.\n\tsp.pushAddrMsg(addrCache)\n}\n\n// OnAddr is invoked when a peer receives an addr bitcoin message and is\n// used to notify the server about advertised addresses.\nfunc (sp *serverPeer) OnAddr(_ *peer.Peer, msg *wire.MsgAddr) {\n\t// Ignore addresses when running on the simulation test network.  This\n\t// helps prevent the network from becoming another public test network\n\t// since it will not be able to learn about other peers that have not\n\t// specifically been provided.\n\tif cfg.SimNet {\n\t\treturn\n\t}\n\n\t// Ignore old style addresses which don't include a timestamp.\n\tif sp.ProtocolVersion() < wire.NetAddressTimeVersion {\n\t\treturn\n\t}\n\n\t// A message that has no addresses is invalid.\n\tif len(msg.AddrList) == 0 {\n\t\tpeerLog.Errorf(\"Command [%s] from %s does not contain any addresses\",\n\t\t\tmsg.Command(), sp.Peer)\n\t\tsp.Disconnect()\n\t\treturn\n\t}\n\n\taddrs := make([]*wire.NetAddressV2, 0, len(msg.AddrList))\n\tfor _, na := range msg.AddrList {\n\t\t// Don't add more address if we're disconnecting.\n\t\tif !sp.Connected() {\n\t\t\treturn\n\t\t}\n\n\t\t// Set the timestamp to 5 days ago if it's more than 24 hours\n\t\t// in the future so this address is one of the first to be\n\t\t// removed when space is needed.\n\t\tnow := time.Now()\n\t\tif na.Timestamp.After(now.Add(time.Minute * 10)) {\n\t\t\tna.Timestamp = now.Add(-1 * time.Hour * 24 * 5)\n\t\t}\n\n\t\t// Add address to known addresses for this peer. This is\n\t\t// converted to NetAddressV2 since that's what the address\n\t\t// manager uses.\n\t\tcurrentNa := wire.NetAddressV2FromBytes(\n\t\t\tna.Timestamp, na.Services, na.IP, na.Port,\n\t\t)\n\t\taddrs = append(addrs, currentNa)\n\t\tsp.addKnownAddresses([]*wire.NetAddressV2{currentNa})\n\t}\n\n\t// Add addresses to server address manager.  The address manager handles\n\t// the details of things such as preventing duplicate addresses, max\n\t// addresses, and last seen updates.\n\t// XXX bitcoind gives a 2 hour time penalty here, do we want to do the\n\t// same?\n\tsp.server.addrManager.AddAddresses(addrs, sp.NA())\n}\n\n// OnAddrV2 is invoked when a peer receives an addrv2 bitcoin message and is\n// used to notify the server about advertised addresses.\nfunc (sp *serverPeer) OnAddrV2(_ *peer.Peer, msg *wire.MsgAddrV2) {\n\t// Ignore if simnet for the same reasons as the regular addr message.\n\tif cfg.SimNet {\n\t\treturn\n\t}\n\n\t// An empty AddrV2 message is invalid.\n\tif len(msg.AddrList) == 0 {\n\t\tpeerLog.Errorf(\"Command [%s] from %s does not contain any \"+\n\t\t\t\"addresses\", msg.Command(), sp.Peer)\n\t\tsp.Disconnect()\n\t\treturn\n\t}\n\n\tfor _, na := range msg.AddrList {\n\t\t// Don't add more to the set of known addresses if we're\n\t\t// disconnecting.\n\t\tif !sp.Connected() {\n\t\t\treturn\n\t\t}\n\n\t\t// Set the timestamp to 5 days ago if the timestamp received is\n\t\t// more than 10 minutes in the future so this address is one of\n\t\t// the first to be removed.\n\t\tnow := time.Now()\n\t\tif na.Timestamp.After(now.Add(time.Minute * 10)) {\n\t\t\tna.Timestamp = now.Add(-1 * time.Hour * 24 * 5)\n\t\t}\n\n\t\t// Add to the set of known addresses.\n\t\tsp.addKnownAddresses([]*wire.NetAddressV2{na})\n\t}\n\n\t// Add the addresses to the addrmanager.\n\tsp.server.addrManager.AddAddresses(msg.AddrList, sp.NA())\n}\n\n// OnRead is invoked when a peer receives a message and it is used to update\n// the bytes received by the server.\nfunc (sp *serverPeer) OnRead(_ *peer.Peer, bytesRead int, msg wire.Message, err error) {\n\tsp.server.AddBytesReceived(uint64(bytesRead))\n}\n\n// OnWrite is invoked when a peer sends a message and it is used to update\n// the bytes sent by the server.\nfunc (sp *serverPeer) OnWrite(_ *peer.Peer, bytesWritten int, msg wire.Message, err error) {\n\tsp.server.AddBytesSent(uint64(bytesWritten))\n}\n\n// OnNotFound is invoked when a peer sends a notfound message.\nfunc (sp *serverPeer) OnNotFound(p *peer.Peer, msg *wire.MsgNotFound) {\n\tif !sp.Connected() {\n\t\treturn\n\t}\n\n\tvar numBlocks, numTxns uint32\n\tfor _, inv := range msg.InvList {\n\t\tswitch inv.Type {\n\t\tcase wire.InvTypeBlock:\n\t\t\tnumBlocks++\n\t\tcase wire.InvTypeWitnessBlock:\n\t\t\tnumBlocks++\n\t\tcase wire.InvTypeTx:\n\t\t\tnumTxns++\n\t\tcase wire.InvTypeWitnessTx:\n\t\t\tnumTxns++\n\t\tdefault:\n\t\t\tpeerLog.Debugf(\"Invalid inv type '%d' in notfound message from %s\",\n\t\t\t\tinv.Type, sp)\n\t\t\tsp.Disconnect()\n\t\t\treturn\n\t\t}\n\t}\n\tif numBlocks > 0 {\n\t\tblockStr := pickNoun(uint64(numBlocks), \"block\", \"blocks\")\n\t\treason := fmt.Sprintf(\"%d %v not found\", numBlocks, blockStr)\n\t\tif sp.addBanScore(20*numBlocks, 0, reason) {\n\t\t\treturn\n\t\t}\n\t}\n\tif numTxns > 0 {\n\t\ttxStr := pickNoun(uint64(numTxns), \"transaction\", \"transactions\")\n\t\treason := fmt.Sprintf(\"%d %v not found\", numTxns, txStr)\n\t\tif sp.addBanScore(0, 10*numTxns, reason) {\n\t\t\treturn\n\t\t}\n\t}\n\n\tsp.server.syncManager.QueueNotFound(msg, p)\n}\n\n// randomUint16Number returns a random uint16 in a specified input range.  Note\n// that the range is in zeroth ordering; if you pass it 1800, you will get\n// values from 0 to 1800.\nfunc randomUint16Number(max uint16) uint16 {\n\t// In order to avoid modulo bias and ensure every possible outcome in\n\t// [0, max) has equal probability, the random number must be sampled\n\t// from a random source that has a range limited to a multiple of the\n\t// modulus.\n\tvar randomNumber uint16\n\tvar limitRange = (math.MaxUint16 / max) * max\n\tfor {\n\t\tbinary.Read(rand.Reader, binary.LittleEndian, &randomNumber)\n\t\tif randomNumber < limitRange {\n\t\t\treturn (randomNumber % max)\n\t\t}\n\t}\n}\n\n// AddRebroadcastInventory adds 'iv' to the list of inventories to be\n// rebroadcasted at random intervals until they show up in a block.\nfunc (s *server) AddRebroadcastInventory(iv *wire.InvVect, data interface{}) {\n\t// Ignore if shutting down.\n\tif atomic.LoadInt32(&s.shutdown) != 0 {\n\t\treturn\n\t}\n\n\ts.modifyRebroadcastInv <- broadcastInventoryAdd{invVect: iv, data: data}\n}\n\n// RemoveRebroadcastInventory removes 'iv' from the list of items to be\n// rebroadcasted if present.\nfunc (s *server) RemoveRebroadcastInventory(iv *wire.InvVect) {\n\t// Ignore if shutting down.\n\tif atomic.LoadInt32(&s.shutdown) != 0 {\n\t\treturn\n\t}\n\n\ts.modifyRebroadcastInv <- broadcastInventoryDel(iv)\n}\n\n// relayTransactions generates and relays inventory vectors for all of the\n// passed transactions to all connected peers.\nfunc (s *server) relayTransactions(txns []*mempool.TxDesc) {\n\tfor _, txD := range txns {\n\t\tiv := wire.NewInvVect(wire.InvTypeTx, txD.Tx.Hash())\n\t\ts.RelayInventory(iv, txD)\n\t}\n}\n\n// AnnounceNewTransactions generates and relays inventory vectors and notifies\n// both websocket and getblocktemplate long poll clients of the passed\n// transactions.  This function should be called whenever new transactions\n// are added to the mempool.\nfunc (s *server) AnnounceNewTransactions(txns []*mempool.TxDesc) {\n\t// Generate and relay inventory vectors for all newly accepted\n\t// transactions.\n\ts.relayTransactions(txns)\n\n\t// Notify both websocket and getblocktemplate long poll clients of all\n\t// newly accepted transactions.\n\tif s.rpcServer != nil {\n\t\ts.rpcServer.NotifyNewTransactions(txns)\n\t}\n}\n\n// Transaction has one confirmation on the main chain. Now we can mark it as no\n// longer needing rebroadcasting.\nfunc (s *server) TransactionConfirmed(tx *btcutil.Tx) {\n\t// Rebroadcasting is only necessary when the RPC server is active.\n\tif s.rpcServer == nil {\n\t\treturn\n\t}\n\n\tiv := wire.NewInvVect(wire.InvTypeTx, tx.Hash())\n\ts.RemoveRebroadcastInventory(iv)\n}\n\n// pushTxMsg sends a tx message for the provided transaction hash to the\n// connected peer.  An error is returned if the transaction hash is not known.\nfunc (s *server) pushTxMsg(sp *serverPeer, hash *chainhash.Hash,\n\tdoneChan chan<- struct{}, encoding wire.MessageEncoding) error {\n\n\t// Attempt to fetch the requested transaction from the pool.  A\n\t// call could be made to check for existence first, but simply trying\n\t// to fetch a missing transaction results in the same behavior.\n\ttx, err := s.txMemPool.FetchTransaction(hash)\n\tif err != nil {\n\t\tpeerLog.Tracef(\"Unable to fetch tx %v from transaction \"+\n\t\t\t\"pool: %v\", hash, err)\n\n\t\tif doneChan != nil {\n\t\t\tdoneChan <- struct{}{}\n\t\t}\n\t\treturn err\n\t}\n\n\tsp.QueueMessageWithEncoding(tx.MsgTx(), doneChan, encoding)\n\n\treturn nil\n}\n\n// pushBlockMsg sends a block message for the provided block hash to the\n// connected peer.  An error is returned if the block hash is not known.\nfunc (s *server) pushBlockMsg(sp *serverPeer, hash *chainhash.Hash,\n\tdoneChan chan<- struct{}, encoding wire.MessageEncoding) error {\n\n\t// Fetch the raw block bytes from the database.\n\tvar blockBytes []byte\n\terr := sp.server.db.View(func(dbTx database.Tx) error {\n\t\tvar err error\n\t\tblockBytes, err = dbTx.FetchBlock(hash)\n\t\treturn err\n\t})\n\tif err != nil {\n\t\tpeerLog.Tracef(\"Unable to fetch requested block hash %v: %v\",\n\t\t\thash, err)\n\n\t\tif doneChan != nil {\n\t\t\tdoneChan <- struct{}{}\n\t\t}\n\t\treturn err\n\t}\n\n\t// Deserialize the block.\n\tvar msgBlock wire.MsgBlock\n\terr = msgBlock.Deserialize(bytes.NewReader(blockBytes))\n\tif err != nil {\n\t\tpeerLog.Tracef(\"Unable to deserialize requested block hash \"+\n\t\t\t\"%v: %v\", hash, err)\n\n\t\tif doneChan != nil {\n\t\t\tdoneChan <- struct{}{}\n\t\t}\n\t\treturn err\n\t}\n\n\t// We only send the channel for this message if we aren't sending\n\t// an inv straight after.\n\tvar dc chan<- struct{}\n\tcontinueHash := sp.continueHash\n\tsendInv := continueHash != nil && continueHash.IsEqual(hash)\n\tif !sendInv {\n\t\tdc = doneChan\n\t}\n\tsp.QueueMessageWithEncoding(&msgBlock, dc, encoding)\n\n\t// When the peer requests the final block that was advertised in\n\t// response to a getblocks message which requested more blocks than\n\t// would fit into a single message, send it a new inventory message\n\t// to trigger it to issue another getblocks message for the next\n\t// batch of inventory.\n\tif sendInv {\n\t\tbest := sp.server.chain.BestSnapshot()\n\t\tinvMsg := wire.NewMsgInvSizeHint(1)\n\t\tiv := wire.NewInvVect(wire.InvTypeBlock, &best.Hash)\n\t\tinvMsg.AddInvVect(iv)\n\t\tsp.QueueMessage(invMsg, doneChan)\n\t\tsp.continueHash = nil\n\t}\n\treturn nil\n}\n\n// pushMerkleBlockMsg sends a merkleblock message for the provided block hash to\n// the connected peer.  Since a merkle block requires the peer to have a filter\n// loaded, this call will simply be ignored if there is no filter loaded.  An\n// error is returned if the block hash is not known.\nfunc (s *server) pushMerkleBlockMsg(sp *serverPeer, hash *chainhash.Hash,\n\tdoneChan chan<- struct{}, encoding wire.MessageEncoding) error {\n\n\t// Do not send a response if the peer doesn't have a filter loaded.\n\tif !sp.filter.IsLoaded() {\n\t\tif doneChan != nil {\n\t\t\tdoneChan <- struct{}{}\n\t\t}\n\t\treturn nil\n\t}\n\n\t// Fetch the raw block bytes from the database.\n\tblk, err := sp.server.chain.BlockByHash(hash)\n\tif err != nil {\n\t\tpeerLog.Tracef(\"Unable to fetch requested block hash %v: %v\",\n\t\t\thash, err)\n\n\t\tif doneChan != nil {\n\t\t\tdoneChan <- struct{}{}\n\t\t}\n\t\treturn err\n\t}\n\n\t// Generate a merkle block by filtering the requested block according\n\t// to the filter for the peer.\n\tmerkle, matchedTxIndices := bloom.NewMerkleBlock(blk, sp.filter)\n\n\t// Send the merkleblock.  Only send the done channel with this message\n\t// if no transactions will be sent afterwards.\n\tvar dc chan<- struct{}\n\tif len(matchedTxIndices) == 0 {\n\t\tdc = doneChan\n\t}\n\tsp.QueueMessage(merkle, dc)\n\n\t// Finally, send any matched transactions.\n\tblkTransactions := blk.MsgBlock().Transactions\n\tfor i, txIndex := range matchedTxIndices {\n\t\t// Only send the done channel on the final transaction.\n\t\tvar dc chan<- struct{}\n\t\tif i == len(matchedTxIndices)-1 {\n\t\t\tdc = doneChan\n\t\t}\n\t\tif txIndex < uint32(len(blkTransactions)) {\n\t\t\tsp.QueueMessageWithEncoding(blkTransactions[txIndex], dc,\n\t\t\t\tencoding)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// handleUpdatePeerHeight updates the heights of all peers who were known to\n// announce a block we recently accepted.\nfunc (s *server) handleUpdatePeerHeights(state *peerState, umsg updatePeerHeightsMsg) {\n\tstate.forAllPeers(func(sp *serverPeer) {\n\t\t// The origin peer should already have the updated height.\n\t\tif sp.Peer == umsg.originPeer {\n\t\t\treturn\n\t\t}\n\n\t\t// This is a pointer to the underlying memory which doesn't\n\t\t// change.\n\t\tlatestBlkHash := sp.LastAnnouncedBlock()\n\n\t\t// Skip this peer if it hasn't recently announced any new blocks.\n\t\tif latestBlkHash == nil {\n\t\t\treturn\n\t\t}\n\n\t\t// If the peer has recently announced a block, and this block\n\t\t// matches our newly accepted block, then update their block\n\t\t// height.\n\t\tif *latestBlkHash == *umsg.newHash {\n\t\t\tsp.UpdateLastBlockHeight(umsg.newHeight)\n\t\t\tsp.UpdateLastAnnouncedBlock(nil)\n\t\t}\n\t})\n}\n\n// handleAddPeerMsg deals with adding new peers.  It is invoked from the\n// peerHandler goroutine.\nfunc (s *server) handleAddPeerMsg(state *peerState, sp *serverPeer) bool {\n\tif sp == nil || !sp.Connected() {\n\t\treturn false\n\t}\n\n\t// Disconnect peers with unwanted user agents.\n\tif sp.HasUndesiredUserAgent(s.agentBlacklist, s.agentWhitelist) {\n\t\tsp.Disconnect()\n\t\treturn false\n\t}\n\n\t// Ignore new peers if we're shutting down.\n\tif atomic.LoadInt32(&s.shutdown) != 0 {\n\t\tsrvrLog.Infof(\"New peer %s ignored - server is shutting down\", sp)\n\t\tsp.Disconnect()\n\t\treturn false\n\t}\n\n\t// Disconnect banned peers.\n\thost, _, err := net.SplitHostPort(sp.Addr())\n\tif err != nil {\n\t\tsrvrLog.Debugf(\"can't split hostport %v\", err)\n\t\tsp.Disconnect()\n\t\treturn false\n\t}\n\tif banEnd, ok := state.banned[host]; ok {\n\t\tif time.Now().Before(banEnd) {\n\t\t\tsrvrLog.Debugf(\"Peer %s is banned for another %v - disconnecting\",\n\t\t\t\thost, time.Until(banEnd))\n\t\t\tsp.Disconnect()\n\t\t\treturn false\n\t\t}\n\n\t\tsrvrLog.Infof(\"Peer %s is no longer banned\", host)\n\t\tdelete(state.banned, host)\n\t}\n\n\t// TODO: Check for max peers from a single IP.\n\n\t// Limit max number of total peers.\n\tif state.Count() >= cfg.MaxPeers {\n\t\tsrvrLog.Infof(\"Max peers reached [%d] - disconnecting peer %s\",\n\t\t\tcfg.MaxPeers, sp)\n\t\tsp.Disconnect()\n\t\t// TODO: how to handle permanent peers here?\n\t\t// they should be rescheduled.\n\t\treturn false\n\t}\n\n\t// Add the new peer and start it.\n\tsrvrLog.Debugf(\"New peer %s\", sp)\n\tif sp.Inbound() {\n\t\tstate.inboundPeers[sp.ID()] = sp\n\t} else {\n\t\tstate.outboundGroups[addrmgr.GroupKey(sp.NA())]++\n\t\tif sp.persistent {\n\t\t\tstate.persistentPeers[sp.ID()] = sp\n\t\t} else {\n\t\t\tstate.outboundPeers[sp.ID()] = sp\n\t\t}\n\t}\n\n\t// Update the address' last seen time if the peer has acknowledged\n\t// our version and has sent us its version as well.\n\tif sp.VerAckReceived() && sp.VersionKnown() && sp.NA() != nil {\n\t\ts.addrManager.Connected(sp.NA())\n\t}\n\n\t// Signal the sync manager this peer is a new sync candidate.\n\ts.syncManager.NewPeer(sp.Peer)\n\n\t// Update the address manager and request known addresses from the\n\t// remote peer for outbound connections. This is skipped when running on\n\t// the simulation test network since it is only intended to connect to\n\t// specified peers and actively avoids advertising and connecting to\n\t// discovered peers.\n\tif !cfg.SimNet && !sp.Inbound() {\n\t\t// Advertise the local address when the server accepts incoming\n\t\t// connections and it believes itself to be close to the best\n\t\t// known tip.\n\t\tif !cfg.DisableListen && s.syncManager.IsCurrent() {\n\t\t\t// Get address that best matches.\n\t\t\tlna := s.addrManager.GetBestLocalAddress(sp.NA())\n\t\t\tif addrmgr.IsRoutable(lna) {\n\t\t\t\t// Filter addresses the peer already knows about.\n\t\t\t\taddresses := []*wire.NetAddressV2{lna}\n\t\t\t\tsp.pushAddrMsg(addresses)\n\t\t\t}\n\t\t}\n\n\t\t// Request known addresses if the server address manager needs\n\t\t// more and the peer has a protocol version new enough to\n\t\t// include a timestamp with addresses.\n\t\thasTimestamp := sp.ProtocolVersion() >= wire.NetAddressTimeVersion\n\t\tif s.addrManager.NeedMoreAddresses() && hasTimestamp {\n\t\t\tsp.QueueMessage(wire.NewMsgGetAddr(), nil)\n\t\t}\n\n\t\t// Mark the address as a known good address.\n\t\ts.addrManager.Good(sp.NA())\n\t}\n\n\treturn true\n}\n\n// handleDonePeerMsg deals with peers that have signalled they are done.  It is\n// invoked from the peerHandler goroutine.\nfunc (s *server) handleDonePeerMsg(state *peerState, sp *serverPeer) {\n\tvar list map[int32]*serverPeer\n\tif sp.persistent {\n\t\tlist = state.persistentPeers\n\t} else if sp.Inbound() {\n\t\tlist = state.inboundPeers\n\t} else {\n\t\tlist = state.outboundPeers\n\t}\n\n\t// Regardless of whether the peer was found in our list, we'll inform\n\t// our connection manager about the disconnection. This can happen if we\n\t// process a peer's `done` message before its `add`.\n\tif !sp.Inbound() {\n\t\tswitch {\n\t\tcase sp.persistent:\n\t\t\ts.connManager.Disconnect(sp.connReq.ID())\n\n\t\t// If this isn't a persistent peer, but we failed a v2\n\t\t// handshake, then we'll disconnect, but trigger a reconnect so\n\t\t// we can use v1 instead.\n\t\tcase sp.ShouldReconnectV1():\n\t\t\ts.connManager.Disconnect(\n\t\t\t\tsp.connReq.ID(), connmgr.WithTriggerReconnect(),\n\t\t\t)\n\n\t\tdefault:\n\t\t\ts.connManager.Remove(sp.connReq.ID())\n\t\t\tgo s.connManager.NewConnReq()\n\t\t}\n\t}\n\n\tif _, ok := list[sp.ID()]; ok {\n\t\tif !sp.Inbound() && sp.VersionKnown() {\n\t\t\tstate.outboundGroups[addrmgr.GroupKey(sp.NA())]--\n\t\t}\n\t\tdelete(list, sp.ID())\n\t\tsrvrLog.Debugf(\"Removed peer %s\", sp)\n\t\treturn\n\t}\n}\n\n// handleBanPeerMsg deals with banning peers.  It is invoked from the\n// peerHandler goroutine.\nfunc (s *server) handleBanPeerMsg(state *peerState, sp *serverPeer) {\n\thost, _, err := net.SplitHostPort(sp.Addr())\n\tif err != nil {\n\t\tsrvrLog.Debugf(\"can't split ban peer %s %v\", sp.Addr(), err)\n\t\treturn\n\t}\n\tdirection := directionString(sp.Inbound())\n\tsrvrLog.Infof(\"Banned peer %s (%s) for %v\", host, direction,\n\t\tcfg.BanDuration)\n\tstate.banned[host] = time.Now().Add(cfg.BanDuration)\n}\n\n// handleRelayInvMsg deals with relaying inventory to peers that are not already\n// known to have it.  It is invoked from the peerHandler goroutine.\nfunc (s *server) handleRelayInvMsg(state *peerState, msg relayMsg) {\n\tstate.forAllPeers(func(sp *serverPeer) {\n\t\tif !sp.Connected() {\n\t\t\treturn\n\t\t}\n\n\t\t// If the inventory is a block and the peer prefers headers,\n\t\t// generate and send a headers message instead of an inventory\n\t\t// message.\n\t\tif msg.invVect.Type == wire.InvTypeBlock && sp.WantsHeaders() {\n\t\t\tblockHeader, ok := msg.data.(wire.BlockHeader)\n\t\t\tif !ok {\n\t\t\t\tpeerLog.Warnf(\"Underlying data for headers\" +\n\t\t\t\t\t\" is not a block header\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\tmsgHeaders := wire.NewMsgHeaders()\n\t\t\tif err := msgHeaders.AddBlockHeader(&blockHeader); err != nil {\n\t\t\t\tpeerLog.Errorf(\"Failed to add block\"+\n\t\t\t\t\t\" header: %v\", err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tsp.QueueMessage(msgHeaders, nil)\n\t\t\treturn\n\t\t}\n\n\t\tif msg.invVect.Type == wire.InvTypeTx {\n\t\t\t// Don't relay the transaction to the peer when it has\n\t\t\t// transaction relaying disabled.\n\t\t\tif sp.relayTxDisabled() {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttxD, ok := msg.data.(*mempool.TxDesc)\n\t\t\tif !ok {\n\t\t\t\tpeerLog.Warnf(\"Underlying data for tx inv \"+\n\t\t\t\t\t\"relay is not a *mempool.TxDesc: %T\",\n\t\t\t\t\tmsg.data)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Don't relay the transaction if the transaction fee-per-kb\n\t\t\t// is less than the peer's feefilter.\n\t\t\tfeeFilter := atomic.LoadInt64(&sp.feeFilter)\n\t\t\tif feeFilter > 0 && txD.FeePerKB < feeFilter {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Don't relay the transaction if there is a bloom\n\t\t\t// filter loaded and the transaction doesn't match it.\n\t\t\tif sp.filter.IsLoaded() {\n\t\t\t\tif !sp.filter.MatchTxAndUpdate(txD.Tx) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Queue the inventory to be relayed with the next batch.\n\t\t// It will be ignored if the peer is already known to\n\t\t// have the inventory.\n\t\tsp.QueueInventory(msg.invVect)\n\t})\n}\n\n// handleBroadcastMsg deals with broadcasting messages to peers.  It is invoked\n// from the peerHandler goroutine.\nfunc (s *server) handleBroadcastMsg(state *peerState, bmsg *broadcastMsg) {\n\tstate.forAllPeers(func(sp *serverPeer) {\n\t\tif !sp.Connected() {\n\t\t\treturn\n\t\t}\n\n\t\tfor _, ep := range bmsg.excludePeers {\n\t\t\tif sp == ep {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tsp.QueueMessage(bmsg.message, nil)\n\t})\n}\n\ntype getConnCountMsg struct {\n\treply chan int32\n}\n\ntype getPeersMsg struct {\n\treply chan []*serverPeer\n}\n\ntype getOutboundGroup struct {\n\tkey   string\n\treply chan int\n}\n\ntype getAddedNodesMsg struct {\n\treply chan []*serverPeer\n}\n\ntype disconnectNodeMsg struct {\n\tcmp   func(*serverPeer) bool\n\treply chan error\n}\n\ntype connectNodeMsg struct {\n\taddr      string\n\tpermanent bool\n\treply     chan error\n}\n\ntype removeNodeMsg struct {\n\tcmp   func(*serverPeer) bool\n\treply chan error\n}\n\n// handleQuery is the central handler for all queries and commands from other\n// goroutines related to peer state.\nfunc (s *server) handleQuery(state *peerState, querymsg interface{}) {\n\tswitch msg := querymsg.(type) {\n\tcase getConnCountMsg:\n\t\tnconnected := int32(0)\n\t\tstate.forAllPeers(func(sp *serverPeer) {\n\t\t\tif sp.Connected() {\n\t\t\t\tnconnected++\n\t\t\t}\n\t\t})\n\t\tmsg.reply <- nconnected\n\n\tcase getPeersMsg:\n\t\tpeers := make([]*serverPeer, 0, state.Count())\n\t\tstate.forAllPeers(func(sp *serverPeer) {\n\t\t\tif !sp.Connected() {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpeers = append(peers, sp)\n\t\t})\n\t\tmsg.reply <- peers\n\n\tcase connectNodeMsg:\n\t\t// TODO: duplicate oneshots?\n\t\t// Limit max number of total peers.\n\t\tif state.Count() >= cfg.MaxPeers {\n\t\t\tmsg.reply <- errors.New(\"max peers reached\")\n\t\t\treturn\n\t\t}\n\t\tfor _, peer := range state.persistentPeers {\n\t\t\tif peer.Addr() == msg.addr {\n\t\t\t\tif msg.permanent {\n\t\t\t\t\tmsg.reply <- errors.New(\"peer already connected\")\n\t\t\t\t} else {\n\t\t\t\t\tmsg.reply <- errors.New(\"peer exists as a permanent peer\")\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tnetAddr, err := addrStringToNetAddr(msg.addr)\n\t\tif err != nil {\n\t\t\tmsg.reply <- err\n\t\t\treturn\n\t\t}\n\n\t\t// TODO: if too many, nuke a non-perm peer.\n\t\tgo s.connManager.Connect(&connmgr.ConnReq{\n\t\t\tAddr:      netAddr,\n\t\t\tPermanent: msg.permanent,\n\t\t})\n\t\tmsg.reply <- nil\n\tcase removeNodeMsg:\n\t\tfound := disconnectPeer(state.persistentPeers, msg.cmp, func(sp *serverPeer) {\n\t\t\t// Keep group counts ok since we remove from\n\t\t\t// the list now.\n\t\t\tstate.outboundGroups[addrmgr.GroupKey(sp.NA())]--\n\t\t})\n\n\t\tif found {\n\t\t\tmsg.reply <- nil\n\t\t} else {\n\t\t\tmsg.reply <- errors.New(\"peer not found\")\n\t\t}\n\tcase getOutboundGroup:\n\t\tcount, ok := state.outboundGroups[msg.key]\n\t\tif ok {\n\t\t\tmsg.reply <- count\n\t\t} else {\n\t\t\tmsg.reply <- 0\n\t\t}\n\t// Request a list of the persistent (added) peers.\n\tcase getAddedNodesMsg:\n\t\t// Respond with a slice of the relevant peers.\n\t\tpeers := make([]*serverPeer, 0, len(state.persistentPeers))\n\t\tfor _, sp := range state.persistentPeers {\n\t\t\tpeers = append(peers, sp)\n\t\t}\n\t\tmsg.reply <- peers\n\tcase disconnectNodeMsg:\n\t\t// Check inbound peers. We pass a nil callback since we don't\n\t\t// require any additional actions on disconnect for inbound peers.\n\t\tfound := disconnectPeer(state.inboundPeers, msg.cmp, nil)\n\t\tif found {\n\t\t\tmsg.reply <- nil\n\t\t\treturn\n\t\t}\n\n\t\t// Check outbound peers.\n\t\tfound = disconnectPeer(state.outboundPeers, msg.cmp, func(sp *serverPeer) {\n\t\t\t// Keep group counts ok since we remove from\n\t\t\t// the list now.\n\t\t\tstate.outboundGroups[addrmgr.GroupKey(sp.NA())]--\n\t\t})\n\t\tif found {\n\t\t\t// If there are multiple outbound connections to the same\n\t\t\t// ip:port, continue disconnecting them all until no such\n\t\t\t// peers are found.\n\t\t\tfor found {\n\t\t\t\tfound = disconnectPeer(state.outboundPeers, msg.cmp, func(sp *serverPeer) {\n\t\t\t\t\tstate.outboundGroups[addrmgr.GroupKey(sp.NA())]--\n\t\t\t\t})\n\t\t\t}\n\t\t\tmsg.reply <- nil\n\t\t\treturn\n\t\t}\n\n\t\tmsg.reply <- errors.New(\"peer not found\")\n\t}\n}\n\n// disconnectPeer attempts to drop the connection of a targeted peer in the\n// passed peer list. Targets are identified via usage of the passed\n// `compareFunc`, which should return `true` if the passed peer is the target\n// peer. This function returns true on success and false if the peer is unable\n// to be located. If the peer is found, and the passed callback: `whenFound'\n// isn't nil, we call it with the peer as the argument before it is removed\n// from the peerList, and is disconnected from the server.\nfunc disconnectPeer(peerList map[int32]*serverPeer, compareFunc func(*serverPeer) bool, whenFound func(*serverPeer)) bool {\n\tfor addr, peer := range peerList {\n\t\tif compareFunc(peer) {\n\t\t\tif whenFound != nil {\n\t\t\t\twhenFound(peer)\n\t\t\t}\n\n\t\t\t// This is ok because we are not continuing\n\t\t\t// to iterate so won't corrupt the loop.\n\t\t\tdelete(peerList, addr)\n\t\t\tpeer.Disconnect()\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// newPeerConfig returns the configuration for the given serverPeer.\nfunc newPeerConfig(sp *serverPeer) *peer.Config {\n\treturn &peer.Config{\n\t\tListeners: peer.MessageListeners{\n\t\t\tOnVersion:      sp.OnVersion,\n\t\t\tOnVerAck:       sp.OnVerAck,\n\t\t\tOnMemPool:      sp.OnMemPool,\n\t\t\tOnTx:           sp.OnTx,\n\t\t\tOnBlock:        sp.OnBlock,\n\t\t\tOnInv:          sp.OnInv,\n\t\t\tOnHeaders:      sp.OnHeaders,\n\t\t\tOnGetData:      sp.OnGetData,\n\t\t\tOnGetBlocks:    sp.OnGetBlocks,\n\t\t\tOnGetHeaders:   sp.OnGetHeaders,\n\t\t\tOnGetCFilters:  sp.OnGetCFilters,\n\t\t\tOnGetCFHeaders: sp.OnGetCFHeaders,\n\t\t\tOnGetCFCheckpt: sp.OnGetCFCheckpt,\n\t\t\tOnFeeFilter:    sp.OnFeeFilter,\n\t\t\tOnFilterAdd:    sp.OnFilterAdd,\n\t\t\tOnFilterClear:  sp.OnFilterClear,\n\t\t\tOnFilterLoad:   sp.OnFilterLoad,\n\t\t\tOnGetAddr:      sp.OnGetAddr,\n\t\t\tOnAddr:         sp.OnAddr,\n\t\t\tOnAddrV2:       sp.OnAddrV2,\n\t\t\tOnRead:         sp.OnRead,\n\t\t\tOnWrite:        sp.OnWrite,\n\t\t\tOnNotFound:     sp.OnNotFound,\n\t\t},\n\t\tNewestBlock:         sp.newestBlock,\n\t\tHostToNetAddress:    sp.server.addrManager.HostToNetAddress,\n\t\tProxy:               cfg.Proxy,\n\t\tUserAgentName:       userAgentName,\n\t\tUserAgentVersion:    userAgentVersion,\n\t\tUserAgentComments:   cfg.UserAgentComments,\n\t\tChainParams:         sp.server.chainParams,\n\t\tServices:            sp.server.services,\n\t\tDisableRelayTx:      cfg.BlocksOnly,\n\t\tProtocolVersion:     peer.MaxProtocolVersion,\n\t\tTrickleInterval:     cfg.TrickleInterval,\n\t\tDisableStallHandler: cfg.DisableStallHandler,\n\t\tUsingV2Conn:         cfg.V2Transport,\n\t}\n}\n\n// inboundPeerConnected is invoked by the connection manager when a new inbound\n// connection is established.  It initializes a new inbound server peer\n// instance, associates it with the connection, and starts a goroutine to wait\n// for disconnection.\nfunc (s *server) inboundPeerConnected(conn net.Conn) {\n\tsp := newServerPeer(s, false)\n\tsp.isWhitelisted = isWhitelisted(conn.RemoteAddr())\n\tsp.Peer = peer.NewInboundPeer(newPeerConfig(sp))\n\tsp.AssociateConnection(conn)\n\tgo s.peerDoneHandler(sp)\n}\n\n// outboundPeerConnected is invoked by the connection manager when a new\n// outbound connection is established.  It initializes a new outbound server\n// peer instance, associates it with the relevant state such as the connection\n// request instance and the connection itself, and finally notifies the address\n// manager of the attempt.\nfunc (s *server) outboundPeerConnected(c *connmgr.ConnReq, conn net.Conn) {\n\t// Just an alias.\n\tpeerAddr := c.Addr.String()\n\tsp := newServerPeer(s, c.Permanent)\n\n\tpeerCfg := newPeerConfig(sp)\n\n\t// Check with the P2PDowngrader if this connection attempt should be\n\t// forced to v1.\n\tif s.p2pDowngrader.ShouldDowngrade(peerAddr) {\n\t\tsrvrLog.Infof(\"Forcing V1 connection to %s as requested by \"+\n\t\t\t\"P2P downgrader.\", peerAddr)\n\n\t\tpeerCfg.UsingV2Conn = false\n\t}\n\n\tp, err := peer.NewOutboundPeer(peerCfg, peerAddr)\n\tif err != nil {\n\t\tsrvrLog.Debugf(\"Cannot create outbound peer %s: %v\",\n\t\t\tc.Addr, err)\n\n\t\tif c.Permanent {\n\t\t\ts.connManager.Disconnect(c.ID())\n\t\t} else {\n\t\t\ts.connManager.Remove(c.ID())\n\t\t\tgo s.connManager.NewConnReq()\n\t\t}\n\t\treturn\n\t}\n\n\tsp.Peer = p\n\tsp.connReq = c\n\tsp.isWhitelisted = isWhitelisted(conn.RemoteAddr())\n\tsp.AssociateConnection(conn)\n\tgo s.peerDoneHandler(sp)\n}\n\n// peerDoneHandler handles peer disconnects by notifying the server that it's\n// done along with other performing other desirable cleanup.\nfunc (s *server) peerDoneHandler(sp *serverPeer) {\n\tsp.WaitForDisconnect()\n\n\t// If this is an outbound peer and the shouldDowngradeToV1 bool is set\n\t// on the underlying Peer, trigger a reconnect using the OG v1\n\t// connection scheme.\n\tif !sp.Inbound() && sp.Peer.ShouldDowngradeToV1() {\n\t\tsrvrLog.Infof(\"Peer %s indicated v2->v1 downgrade. \"+\n\t\t\t\"Marking for next attempt as v1.\", sp.Addr())\n\n\t\ts.p2pDowngrader.MarkForDowngrade(sp.Addr())\n\t}\n\n\t// This is sent to a buffered channel, so it may not execute immediately.\n\ts.donePeers <- sp\n\n\t// Only tell sync manager we are gone if we ever told it we existed.\n\tif sp.VerAckReceived() {\n\t\ts.syncManager.DonePeer(sp.Peer)\n\n\t\t// Evict any remaining orphans that were sent by the peer.\n\t\tnumEvicted := s.txMemPool.RemoveOrphansByTag(mempool.Tag(sp.ID()))\n\t\tif numEvicted > 0 {\n\t\t\ttxmpLog.Debugf(\"Evicted %d %s from peer %v (id %d)\",\n\t\t\t\tnumEvicted, pickNoun(numEvicted, \"orphan\",\n\t\t\t\t\t\"orphans\"), sp, sp.ID())\n\t\t}\n\t}\n\tclose(sp.quit)\n}\n\n// peerHandler is used to handle peer operations such as adding and removing\n// peers to and from the server, banning peers, and broadcasting messages to\n// peers.  It must be run in a goroutine.\nfunc (s *server) peerHandler() {\n\t// Start the address manager and sync manager, both of which are needed\n\t// by peers.  This is done here since their lifecycle is closely tied\n\t// to this handler and rather than adding more channels to synchronize\n\t// things, it's easier and slightly faster to simply start and stop them\n\t// in this handler.\n\ts.addrManager.Start()\n\ts.syncManager.Start()\n\n\tsrvrLog.Tracef(\"Starting peer handler\")\n\n\tstate := &peerState{\n\t\tinboundPeers:    make(map[int32]*serverPeer),\n\t\tpersistentPeers: make(map[int32]*serverPeer),\n\t\toutboundPeers:   make(map[int32]*serverPeer),\n\t\tbanned:          make(map[string]time.Time),\n\t\toutboundGroups:  make(map[string]int),\n\t}\n\n\tif !cfg.DisableDNSSeed {\n\t\t// Add peers discovered through DNS to the address manager.\n\t\tconnmgr.SeedFromDNS(activeNetParams.Params, defaultRequiredServices,\n\t\t\tbtcdLookup, func(addrs []*wire.NetAddressV2) {\n\t\t\t\t// Bitcoind uses a lookup of the dns seeder here. This\n\t\t\t\t// is rather strange since the values looked up by the\n\t\t\t\t// DNS seed lookups will vary quite a lot.\n\t\t\t\t// to replicate this behaviour we put all addresses as\n\t\t\t\t// having come from the first one.\n\t\t\t\ts.addrManager.AddAddresses(addrs, addrs[0])\n\t\t\t})\n\t}\n\tgo s.connManager.Start()\n\nout:\n\tfor {\n\t\tselect {\n\t\t// New peers connected to the server.\n\t\tcase p := <-s.newPeers:\n\t\t\ts.handleAddPeerMsg(state, p)\n\n\t\t// Disconnected peers.\n\t\tcase p := <-s.donePeers:\n\t\t\ts.handleDonePeerMsg(state, p)\n\n\t\t// Block accepted in mainchain or orphan, update peer height.\n\t\tcase umsg := <-s.peerHeightsUpdate:\n\t\t\ts.handleUpdatePeerHeights(state, umsg)\n\n\t\t// Peer to ban.\n\t\tcase p := <-s.banPeers:\n\t\t\ts.handleBanPeerMsg(state, p)\n\n\t\t// New inventory to potentially be relayed to other peers.\n\t\tcase invMsg := <-s.relayInv:\n\t\t\ts.handleRelayInvMsg(state, invMsg)\n\n\t\t// Message to broadcast to all connected peers except those\n\t\t// which are excluded by the message.\n\t\tcase bmsg := <-s.broadcast:\n\t\t\ts.handleBroadcastMsg(state, &bmsg)\n\n\t\tcase qmsg := <-s.query:\n\t\t\ts.handleQuery(state, qmsg)\n\n\t\tcase <-s.quit:\n\t\t\t// Disconnect all peers on server shutdown.\n\t\t\tstate.forAllPeers(func(sp *serverPeer) {\n\t\t\t\tsrvrLog.Tracef(\"Shutdown peer %s\", sp)\n\t\t\t\tsp.Disconnect()\n\t\t\t})\n\t\t\tbreak out\n\t\t}\n\t}\n\n\ts.connManager.Stop()\n\ts.syncManager.Stop()\n\ts.addrManager.Stop()\n\n\t// Drain channels before exiting so nothing is left waiting around\n\t// to send.\ncleanup:\n\tfor {\n\t\tselect {\n\t\tcase <-s.newPeers:\n\t\tcase <-s.donePeers:\n\t\tcase <-s.peerHeightsUpdate:\n\t\tcase <-s.relayInv:\n\t\tcase <-s.broadcast:\n\t\tcase <-s.query:\n\t\tdefault:\n\t\t\tbreak cleanup\n\t\t}\n\t}\n\ts.wg.Done()\n\tsrvrLog.Tracef(\"Peer handler done\")\n}\n\n// AddPeer adds a new peer that has already been connected to the server.\nfunc (s *server) AddPeer(sp *serverPeer) {\n\ts.newPeers <- sp\n}\n\n// BanPeer bans a peer that has already been connected to the server by ip.\nfunc (s *server) BanPeer(sp *serverPeer) {\n\ts.banPeers <- sp\n}\n\n// RelayInventory relays the passed inventory vector to all connected peers\n// that are not already known to have it.\nfunc (s *server) RelayInventory(invVect *wire.InvVect, data interface{}) {\n\ts.relayInv <- relayMsg{invVect: invVect, data: data}\n}\n\n// BroadcastMessage sends msg to all peers currently connected to the server\n// except those in the passed peers to exclude.\nfunc (s *server) BroadcastMessage(msg wire.Message, exclPeers ...*serverPeer) {\n\t// XXX: Need to determine if this is an alert that has already been\n\t// broadcast and refrain from broadcasting again.\n\tbmsg := broadcastMsg{message: msg, excludePeers: exclPeers}\n\ts.broadcast <- bmsg\n}\n\n// ConnectedCount returns the number of currently connected peers.\nfunc (s *server) ConnectedCount() int32 {\n\treplyChan := make(chan int32)\n\n\ts.query <- getConnCountMsg{reply: replyChan}\n\n\treturn <-replyChan\n}\n\n// OutboundGroupCount returns the number of peers connected to the given\n// outbound group key.\nfunc (s *server) OutboundGroupCount(key string) int {\n\treplyChan := make(chan int)\n\ts.query <- getOutboundGroup{key: key, reply: replyChan}\n\treturn <-replyChan\n}\n\n// AddBytesSent adds the passed number of bytes to the total bytes sent counter\n// for the server.  It is safe for concurrent access.\nfunc (s *server) AddBytesSent(bytesSent uint64) {\n\tatomic.AddUint64(&s.bytesSent, bytesSent)\n}\n\n// AddBytesReceived adds the passed number of bytes to the total bytes received\n// counter for the server.  It is safe for concurrent access.\nfunc (s *server) AddBytesReceived(bytesReceived uint64) {\n\tatomic.AddUint64(&s.bytesReceived, bytesReceived)\n}\n\n// NetTotals returns the sum of all bytes received and sent across the network\n// for all peers.  It is safe for concurrent access.\nfunc (s *server) NetTotals() (uint64, uint64) {\n\treturn atomic.LoadUint64(&s.bytesReceived),\n\t\tatomic.LoadUint64(&s.bytesSent)\n}\n\n// UpdatePeerHeights updates the heights of all peers who have have announced\n// the latest connected main chain block, or a recognized orphan. These height\n// updates allow us to dynamically refresh peer heights, ensuring sync peer\n// selection has access to the latest block heights for each peer.\nfunc (s *server) UpdatePeerHeights(latestBlkHash *chainhash.Hash, latestHeight int32, updateSource *peer.Peer) {\n\ts.peerHeightsUpdate <- updatePeerHeightsMsg{\n\t\tnewHash:    latestBlkHash,\n\t\tnewHeight:  latestHeight,\n\t\toriginPeer: updateSource,\n\t}\n}\n\n// rebroadcastHandler keeps track of user submitted inventories that we have\n// sent out but have not yet made it into a block. We periodically rebroadcast\n// them in case our peers restarted or otherwise lost track of them.\nfunc (s *server) rebroadcastHandler() {\n\t// Wait 5 min before first tx rebroadcast.\n\ttimer := time.NewTimer(5 * time.Minute)\n\tpendingInvs := make(map[wire.InvVect]interface{})\n\nout:\n\tfor {\n\t\tselect {\n\t\tcase riv := <-s.modifyRebroadcastInv:\n\t\t\tswitch msg := riv.(type) {\n\t\t\t// Incoming InvVects are added to our map of RPC txs.\n\t\t\tcase broadcastInventoryAdd:\n\t\t\t\tpendingInvs[*msg.invVect] = msg.data\n\n\t\t\t// When an InvVect has been added to a block, we can\n\t\t\t// now remove it, if it was present.\n\t\t\tcase broadcastInventoryDel:\n\t\t\t\tdelete(pendingInvs, *msg)\n\t\t\t}\n\n\t\tcase <-timer.C:\n\t\t\t// Any inventory we have has not made it into a block\n\t\t\t// yet. We periodically resubmit them until they have.\n\t\t\tfor iv, data := range pendingInvs {\n\t\t\t\tivCopy := iv\n\t\t\t\ts.RelayInventory(&ivCopy, data)\n\t\t\t}\n\n\t\t\t// Process at a random time up to 30mins (in seconds)\n\t\t\t// in the future.\n\t\t\ttimer.Reset(time.Second *\n\t\t\t\ttime.Duration(randomUint16Number(1800)))\n\n\t\tcase <-s.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\ttimer.Stop()\n\n\t// Drain channels before exiting so nothing is left waiting around\n\t// to send.\ncleanup:\n\tfor {\n\t\tselect {\n\t\tcase <-s.modifyRebroadcastInv:\n\t\tdefault:\n\t\t\tbreak cleanup\n\t\t}\n\t}\n\ts.wg.Done()\n}\n\n// Start begins accepting connections from peers.\nfunc (s *server) Start() {\n\t// Already started?\n\tif atomic.AddInt32(&s.started, 1) != 1 {\n\t\treturn\n\t}\n\n\tsrvrLog.Trace(\"Starting server\")\n\n\t// Server startup time. Used for the uptime command for uptime calculation.\n\ts.startupTime = time.Now().Unix()\n\n\t// Start the peer handler which in turn starts the address and block\n\t// managers.\n\ts.wg.Add(1)\n\tgo s.peerHandler()\n\n\tif s.nat != nil {\n\t\ts.wg.Add(1)\n\t\tgo s.upnpUpdateThread()\n\t}\n\n\tif !cfg.DisableRPC {\n\t\ts.wg.Add(1)\n\n\t\t// Start the rebroadcastHandler, which ensures user tx received by\n\t\t// the RPC server are rebroadcast until being included in a block.\n\t\tgo s.rebroadcastHandler()\n\n\t\ts.rpcServer.cfg.StartupTime = s.startupTime\n\t\ts.rpcServer.Start()\n\t}\n\n\t// Start the CPU miner if generation is enabled.\n\tif cfg.Generate {\n\t\ts.cpuMiner.Start()\n\t}\n}\n\n// Stop gracefully shuts down the server by stopping and disconnecting all\n// peers and the main listener.\nfunc (s *server) Stop() error {\n\t// Make sure this only happens once.\n\tif atomic.AddInt32(&s.shutdown, 1) != 1 {\n\t\tsrvrLog.Infof(\"Server is already in the process of shutting down\")\n\t\treturn nil\n\t}\n\n\tsrvrLog.Warnf(\"Server shutting down\")\n\n\t// Stop the CPU miner if needed\n\ts.cpuMiner.Stop()\n\n\t// Shutdown the RPC server if it's not disabled.\n\tif !cfg.DisableRPC {\n\t\ts.rpcServer.Stop()\n\t}\n\n\t// Save fee estimator state in the database.\n\ts.db.Update(func(tx database.Tx) error {\n\t\tmetadata := tx.Metadata()\n\t\tmetadata.Put(mempool.EstimateFeeDatabaseKey, s.feeEstimator.Save())\n\n\t\treturn nil\n\t})\n\n\t// Signal the remaining goroutines to quit.\n\tclose(s.quit)\n\treturn nil\n}\n\n// WaitForShutdown blocks until the main listener and peer handlers are stopped.\nfunc (s *server) WaitForShutdown() {\n\ts.wg.Wait()\n}\n\n// ScheduleShutdown schedules a server shutdown after the specified duration.\n// It also dynamically adjusts how often to warn the server is going down based\n// on remaining duration.\nfunc (s *server) ScheduleShutdown(duration time.Duration) {\n\t// Don't schedule shutdown more than once.\n\tif atomic.AddInt32(&s.shutdownSched, 1) != 1 {\n\t\treturn\n\t}\n\tsrvrLog.Warnf(\"Server shutdown in %v\", duration)\n\tgo func() {\n\t\tremaining := duration\n\t\ttickDuration := dynamicTickDuration(remaining)\n\t\tdone := time.After(remaining)\n\t\tticker := time.NewTicker(tickDuration)\n\tout:\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-done:\n\t\t\t\tticker.Stop()\n\t\t\t\ts.Stop()\n\t\t\t\tbreak out\n\t\t\tcase <-ticker.C:\n\t\t\t\tremaining = remaining - tickDuration\n\t\t\t\tif remaining < time.Second {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// Change tick duration dynamically based on remaining time.\n\t\t\t\tnewDuration := dynamicTickDuration(remaining)\n\t\t\t\tif tickDuration != newDuration {\n\t\t\t\t\ttickDuration = newDuration\n\t\t\t\t\tticker.Stop()\n\t\t\t\t\tticker = time.NewTicker(tickDuration)\n\t\t\t\t}\n\t\t\t\tsrvrLog.Warnf(\"Server shutdown in %v\", remaining)\n\t\t\t}\n\t\t}\n\t}()\n}\n\n// parseListeners determines whether each listen address is IPv4 and IPv6 and\n// returns a slice of appropriate net.Addrs to listen on with TCP. It also\n// properly detects addresses which apply to \"all interfaces\" and adds the\n// address as both IPv4 and IPv6.\nfunc parseListeners(addrs []string) ([]net.Addr, error) {\n\tnetAddrs := make([]net.Addr, 0, len(addrs)*2)\n\tfor _, addr := range addrs {\n\t\thost, _, err := net.SplitHostPort(addr)\n\t\tif err != nil {\n\t\t\t// Shouldn't happen due to already being normalized.\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Empty host or host of * on plan9 is both IPv4 and IPv6.\n\t\tif host == \"\" || (host == \"*\" && runtime.GOOS == \"plan9\") {\n\t\t\tnetAddrs = append(netAddrs, simpleAddr{net: \"tcp4\", addr: addr})\n\t\t\tnetAddrs = append(netAddrs, simpleAddr{net: \"tcp6\", addr: addr})\n\t\t\tcontinue\n\t\t}\n\n\t\t// Strip IPv6 zone id if present since net.ParseIP does not\n\t\t// handle it.\n\t\tzoneIndex := strings.LastIndex(host, \"%\")\n\t\tif zoneIndex > 0 {\n\t\t\thost = host[:zoneIndex]\n\t\t}\n\n\t\t// Parse the IP.\n\t\tip := net.ParseIP(host)\n\t\tif ip == nil {\n\t\t\treturn nil, fmt.Errorf(\"'%s' is not a valid IP address\", host)\n\t\t}\n\n\t\t// To4 returns nil when the IP is not an IPv4 address, so use\n\t\t// this determine the address type.\n\t\tif ip.To4() == nil {\n\t\t\tnetAddrs = append(netAddrs, simpleAddr{net: \"tcp6\", addr: addr})\n\t\t} else {\n\t\t\tnetAddrs = append(netAddrs, simpleAddr{net: \"tcp4\", addr: addr})\n\t\t}\n\t}\n\treturn netAddrs, nil\n}\n\nfunc (s *server) upnpUpdateThread() {\n\t// Go off immediately to prevent code duplication, thereafter we renew\n\t// lease every 15 minutes.\n\ttimer := time.NewTimer(0 * time.Second)\n\tlport, _ := strconv.ParseInt(activeNetParams.DefaultPort, 10, 16)\n\tfirst := true\nout:\n\tfor {\n\t\tselect {\n\t\tcase <-timer.C:\n\t\t\t// TODO: pick external port  more cleverly\n\t\t\t// TODO: know which ports we are listening to on an external net.\n\t\t\t// TODO: if specific listen port doesn't work then ask for wildcard\n\t\t\t// listen port?\n\t\t\t// XXX this assumes timeout is in seconds.\n\t\t\tlistenPort, err := s.nat.AddPortMapping(\"tcp\", int(lport), int(lport),\n\t\t\t\t\"btcd listen port\", 20*60)\n\t\t\tif err != nil {\n\t\t\t\tsrvrLog.Warnf(\"can't add UPnP port mapping: %v\", err)\n\t\t\t}\n\t\t\tif first && err == nil {\n\t\t\t\t// TODO: look this up periodically to see if upnp domain changed\n\t\t\t\t// and so did ip.\n\t\t\t\texternalip, err := s.nat.GetExternalAddress()\n\t\t\t\tif err != nil {\n\t\t\t\t\tsrvrLog.Warnf(\"UPnP can't get external address: %v\", err)\n\t\t\t\t\tcontinue out\n\t\t\t\t}\n\t\t\t\tna := wire.NetAddressV2FromBytes(time.Now(), s.services,\n\t\t\t\t\texternalip, uint16(listenPort))\n\t\t\t\terr = s.addrManager.AddLocalAddress(na, addrmgr.UpnpPrio)\n\t\t\t\tif err != nil {\n\t\t\t\t\t// XXX DeletePortMapping?\n\t\t\t\t}\n\t\t\t\tsrvrLog.Warnf(\"Successfully bound via UPnP to %s\", addrmgr.NetAddressKey(na))\n\t\t\t\tfirst = false\n\t\t\t}\n\t\t\ttimer.Reset(time.Minute * 15)\n\t\tcase <-s.quit:\n\t\t\tbreak out\n\t\t}\n\t}\n\n\ttimer.Stop()\n\n\tif err := s.nat.DeletePortMapping(\"tcp\", int(lport), int(lport)); err != nil {\n\t\tsrvrLog.Warnf(\"unable to remove UPnP port mapping: %v\", err)\n\t} else {\n\t\tsrvrLog.Debugf(\"successfully disestablished UPnP port mapping\")\n\t}\n\n\ts.wg.Done()\n}\n\n// setupRPCListeners returns a slice of listeners that are configured for use\n// with the RPC server depending on the configuration settings for listen\n// addresses and TLS.\nfunc setupRPCListeners() ([]net.Listener, error) {\n\t// Setup TLS if not disabled.\n\tlistenFunc := net.Listen\n\tif !cfg.DisableTLS {\n\t\t// Generate the TLS cert and key file if both don't already\n\t\t// exist.\n\t\tif !fileExists(cfg.RPCKey) && !fileExists(cfg.RPCCert) {\n\t\t\terr := genCertPair(cfg.RPCCert, cfg.RPCKey)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tkeypair, err := tls.LoadX509KeyPair(cfg.RPCCert, cfg.RPCKey)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\ttlsConfig := tls.Config{\n\t\t\tCertificates: []tls.Certificate{keypair},\n\t\t\tMinVersion:   tls.VersionTLS12,\n\t\t}\n\n\t\t// Change the standard net.Listen function to the tls one.\n\t\tlistenFunc = func(net string, laddr string) (net.Listener, error) {\n\t\t\treturn tls.Listen(net, laddr, &tlsConfig)\n\t\t}\n\t}\n\n\tnetAddrs, err := parseListeners(cfg.RPCListeners)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tlisteners := make([]net.Listener, 0, len(netAddrs))\n\tfor _, addr := range netAddrs {\n\t\tlistener, err := listenFunc(addr.Network(), addr.String())\n\t\tif err != nil {\n\t\t\trpcsLog.Warnf(\"Can't listen on %s: %v\", addr, err)\n\t\t\tcontinue\n\t\t}\n\t\tlisteners = append(listeners, listener)\n\t}\n\n\treturn listeners, nil\n}\n\n// newServer returns a new btcd server configured to listen on addr for the\n// bitcoin network type specified by chainParams.  Use start to begin accepting\n// connections from peers.\nfunc newServer(listenAddrs, agentBlacklist, agentWhitelist []string,\n\tdb database.DB, chainParams *chaincfg.Params,\n\tinterrupt <-chan struct{}) (*server, error) {\n\n\tservices := defaultServices\n\tif cfg.NoPeerBloomFilters {\n\t\tservices &^= wire.SFNodeBloom\n\t}\n\tif cfg.NoCFilters {\n\t\tservices &^= wire.SFNodeCF\n\t}\n\tif cfg.Prune != 0 {\n\t\tservices &^= wire.SFNodeNetwork\n\t}\n\tif !cfg.V2Transport {\n\t\tservices &^= wire.SFNodeP2PV2\n\t}\n\n\tamgr := addrmgr.New(cfg.DataDir, btcdLookup)\n\n\tvar listeners []net.Listener\n\tvar nat NAT\n\tif !cfg.DisableListen {\n\t\tvar err error\n\t\tlisteners, nat, err = initListeners(amgr, listenAddrs, services)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif len(listeners) == 0 {\n\t\t\treturn nil, errors.New(\"no valid listen address\")\n\t\t}\n\t}\n\n\tif len(agentBlacklist) > 0 {\n\t\tsrvrLog.Infof(\"User-agent blacklist %s\", agentBlacklist)\n\t}\n\tif len(agentWhitelist) > 0 {\n\t\tsrvrLog.Infof(\"User-agent whitelist %s\", agentWhitelist)\n\t}\n\n\ts := server{\n\t\tchainParams:          chainParams,\n\t\taddrManager:          amgr,\n\t\tnewPeers:             make(chan *serverPeer, cfg.MaxPeers),\n\t\tdonePeers:            make(chan *serverPeer, cfg.MaxPeers),\n\t\tbanPeers:             make(chan *serverPeer, cfg.MaxPeers),\n\t\tquery:                make(chan interface{}),\n\t\trelayInv:             make(chan relayMsg, cfg.MaxPeers),\n\t\tbroadcast:            make(chan broadcastMsg, cfg.MaxPeers),\n\t\tquit:                 make(chan struct{}),\n\t\tmodifyRebroadcastInv: make(chan interface{}),\n\t\tpeerHeightsUpdate:    make(chan updatePeerHeightsMsg),\n\t\tnat:                  nat,\n\t\tdb:                   db,\n\t\ttimeSource:           blockchain.NewMedianTime(),\n\t\tservices:             services,\n\t\tsigCache:             txscript.NewSigCache(cfg.SigCacheMaxSize),\n\t\thashCache:            txscript.NewHashCache(cfg.SigCacheMaxSize),\n\t\tcfCheckptCaches:      make(map[wire.FilterType][]cfHeaderKV),\n\t\tagentBlacklist:       agentBlacklist,\n\t\tagentWhitelist:       agentWhitelist,\n\t}\n\n\t// Create the transaction and address indexes if needed.\n\t//\n\t// CAUTION: the txindex needs to be first in the indexes array because\n\t// the addrindex uses data from the txindex during catchup.  If the\n\t// addrindex is run first, it may not have the transactions from the\n\t// current block indexed.\n\tvar indexes []indexers.Indexer\n\tif cfg.TxIndex || cfg.AddrIndex {\n\t\t// Enable transaction index if address index is enabled since it\n\t\t// requires it.\n\t\tif !cfg.TxIndex {\n\t\t\tindxLog.Infof(\"Transaction index enabled because it \" +\n\t\t\t\t\"is required by the address index\")\n\t\t\tcfg.TxIndex = true\n\t\t} else {\n\t\t\tindxLog.Info(\"Transaction index is enabled\")\n\t\t}\n\n\t\ts.txIndex = indexers.NewTxIndex(db)\n\t\tindexes = append(indexes, s.txIndex)\n\t}\n\tif cfg.AddrIndex {\n\t\tindxLog.Info(\"Address index is enabled\")\n\t\ts.addrIndex = indexers.NewAddrIndex(db, chainParams)\n\t\tindexes = append(indexes, s.addrIndex)\n\t}\n\tif !cfg.NoCFilters {\n\t\tindxLog.Info(\"Committed filter index is enabled\")\n\t\ts.cfIndex = indexers.NewCfIndex(db, chainParams)\n\t\tindexes = append(indexes, s.cfIndex)\n\t}\n\n\t// Create an index manager if any of the optional indexes are enabled.\n\tvar indexManager blockchain.IndexManager\n\tif len(indexes) > 0 {\n\t\tindexManager = indexers.NewManager(db, indexes)\n\t}\n\n\t// Merge given checkpoints with the default ones unless they are disabled.\n\tvar checkpoints []chaincfg.Checkpoint\n\tif !cfg.DisableCheckpoints {\n\t\tcheckpoints = mergeCheckpoints(s.chainParams.Checkpoints, cfg.addCheckpoints)\n\t}\n\n\t// Log that the node is pruned.\n\tif cfg.Prune != 0 {\n\t\tbtcdLog.Infof(\"Prune set to %d MiB\", cfg.Prune)\n\t}\n\n\t// Create a new block chain instance with the appropriate configuration.\n\tvar err error\n\ts.chain, err = blockchain.New(&blockchain.Config{\n\t\tDB:               s.db,\n\t\tInterrupt:        interrupt,\n\t\tChainParams:      s.chainParams,\n\t\tCheckpoints:      checkpoints,\n\t\tTimeSource:       s.timeSource,\n\t\tSigCache:         s.sigCache,\n\t\tIndexManager:     indexManager,\n\t\tHashCache:        s.hashCache,\n\t\tPrune:            cfg.Prune * 1024 * 1024,\n\t\tUtxoCacheMaxSize: uint64(cfg.UtxoCacheMaxSizeMiB) * 1024 * 1024,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Search for a FeeEstimator state in the database. If none can be found\n\t// or if it cannot be loaded, create a new one.\n\tdb.Update(func(tx database.Tx) error {\n\t\tmetadata := tx.Metadata()\n\t\tfeeEstimationData := metadata.Get(mempool.EstimateFeeDatabaseKey)\n\t\tif feeEstimationData != nil {\n\t\t\t// delete it from the database so that we don't try to restore the\n\t\t\t// same thing again somehow.\n\t\t\tmetadata.Delete(mempool.EstimateFeeDatabaseKey)\n\n\t\t\t// If there is an error, log it and make a new fee estimator.\n\t\t\tvar err error\n\t\t\ts.feeEstimator, err = mempool.RestoreFeeEstimator(feeEstimationData)\n\n\t\t\tif err != nil {\n\t\t\t\tpeerLog.Errorf(\"Failed to restore fee estimator %v\", err)\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\n\t// If no feeEstimator has been found, or if the one that has been found\n\t// is behind somehow, create a new one and start over.\n\tif s.feeEstimator == nil || s.feeEstimator.LastKnownHeight() != s.chain.BestSnapshot().Height {\n\t\ts.feeEstimator = mempool.NewFeeEstimator(\n\t\t\tmempool.DefaultEstimateFeeMaxRollback,\n\t\t\tmempool.DefaultEstimateFeeMinRegisteredBlocks)\n\t}\n\n\ttxC := mempool.Config{\n\t\tPolicy: mempool.Policy{\n\t\t\tDisableRelayPriority: cfg.NoRelayPriority,\n\t\t\tAcceptNonStd:         cfg.RelayNonStd,\n\t\t\tFreeTxRelayLimit:     cfg.FreeTxRelayLimit,\n\t\t\tMaxOrphanTxs:         cfg.MaxOrphanTxs,\n\t\t\tMaxOrphanTxSize:      defaultMaxOrphanTxSize,\n\t\t\tMaxSigOpCostPerTx:    blockchain.MaxBlockSigOpsCost / 4,\n\t\t\tMinRelayTxFee:        cfg.minRelayTxFee,\n\t\t\tMaxTxVersion:         2,\n\t\t\tRejectReplacement:    cfg.RejectReplacement,\n\t\t},\n\t\tChainParams:    chainParams,\n\t\tFetchUtxoView:  s.chain.FetchUtxoView,\n\t\tBestHeight:     func() int32 { return s.chain.BestSnapshot().Height },\n\t\tMedianTimePast: func() time.Time { return s.chain.BestSnapshot().MedianTime },\n\t\tCalcSequenceLock: func(tx *btcutil.Tx, view *blockchain.UtxoViewpoint) (*blockchain.SequenceLock, error) {\n\t\t\treturn s.chain.CalcSequenceLock(tx, view, true)\n\t\t},\n\t\tIsDeploymentActive: s.chain.IsDeploymentActive,\n\t\tSigCache:           s.sigCache,\n\t\tHashCache:          s.hashCache,\n\t\tAddrIndex:          s.addrIndex,\n\t\tFeeEstimator:       s.feeEstimator,\n\t}\n\ts.txMemPool = mempool.New(&txC)\n\n\ts.syncManager, err = netsync.New(&netsync.Config{\n\t\tPeerNotifier:       &s,\n\t\tChain:              s.chain,\n\t\tTxMemPool:          s.txMemPool,\n\t\tChainParams:        s.chainParams,\n\t\tDisableCheckpoints: cfg.DisableCheckpoints,\n\t\tMaxPeers:           cfg.MaxPeers,\n\t\tFeeEstimator:       s.feeEstimator,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Create the mining policy and block template generator based on the\n\t// configuration options.\n\t//\n\t// NOTE: The CPU miner relies on the mempool, so the mempool has to be\n\t// created before calling the function to create the CPU miner.\n\tpolicy := mining.Policy{\n\t\tBlockMinWeight:    cfg.BlockMinWeight,\n\t\tBlockMaxWeight:    cfg.BlockMaxWeight,\n\t\tBlockMinSize:      cfg.BlockMinSize,\n\t\tBlockMaxSize:      cfg.BlockMaxSize,\n\t\tBlockPrioritySize: cfg.BlockPrioritySize,\n\t\tTxMinFreeFee:      cfg.minRelayTxFee,\n\t}\n\tblockTemplateGenerator := mining.NewBlkTmplGenerator(&policy,\n\t\ts.chainParams, s.txMemPool, s.chain, s.timeSource,\n\t\ts.sigCache, s.hashCache)\n\ts.cpuMiner = cpuminer.New(&cpuminer.Config{\n\t\tChainParams:            chainParams,\n\t\tBlockTemplateGenerator: blockTemplateGenerator,\n\t\tMiningAddrs:            cfg.miningAddrs,\n\t\tProcessBlock:           s.syncManager.ProcessBlock,\n\t\tConnectedCount:         s.ConnectedCount,\n\t\tIsCurrent:              s.syncManager.IsCurrent,\n\t})\n\n\t// Only setup a function to return new addresses to connect to when\n\t// not running in connect-only mode.  The simulation network is always\n\t// in connect-only mode since it is only intended to connect to\n\t// specified peers and actively avoid advertising and connecting to\n\t// discovered peers in order to prevent it from becoming a public test\n\t// network.\n\tvar newAddressFunc func() (net.Addr, error)\n\tif !cfg.SimNet && len(cfg.ConnectPeers) == 0 {\n\t\tnewAddressFunc = func() (net.Addr, error) {\n\t\t\tfor tries := 0; tries < 100; tries++ {\n\t\t\t\taddr := s.addrManager.GetAddress()\n\t\t\t\tif addr == nil {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\t// Address will not be invalid, local or unroutable\n\t\t\t\t// because addrmanager rejects those on addition.\n\t\t\t\t// Just check that we don't already have an address\n\t\t\t\t// in the same group so that we are not connecting\n\t\t\t\t// to the same network segment at the expense of\n\t\t\t\t// others.\n\t\t\t\tkey := addrmgr.GroupKey(addr.NetAddress())\n\t\t\t\tif s.OutboundGroupCount(key) != 0 {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// only allow recent nodes (10mins) after we failed 30\n\t\t\t\t// times\n\t\t\t\tif tries < 30 && time.Since(addr.LastAttempt()) < 10*time.Minute {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// allow nondefault ports after 50 failed tries.\n\t\t\t\tif tries < 50 && fmt.Sprintf(\"%d\", addr.NetAddress().Port) !=\n\t\t\t\t\tactiveNetParams.DefaultPort {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// Mark an attempt for the valid address.\n\t\t\t\ts.addrManager.Attempt(addr.NetAddress())\n\n\t\t\t\taddrString := addrmgr.NetAddressKey(addr.NetAddress())\n\t\t\t\treturn addrStringToNetAddr(addrString)\n\t\t\t}\n\n\t\t\treturn nil, errors.New(\"no valid connect address\")\n\t\t}\n\t}\n\n\t// Create a connection manager.\n\ttargetOutbound := defaultTargetOutbound\n\tif cfg.MaxPeers < targetOutbound {\n\t\ttargetOutbound = cfg.MaxPeers\n\t}\n\tcmgr, err := connmgr.New(&connmgr.Config{\n\t\tListeners:      listeners,\n\t\tOnAccept:       s.inboundPeerConnected,\n\t\tRetryDuration:  connectionRetryInterval,\n\t\tTargetOutbound: uint32(targetOutbound),\n\t\tDial:           btcdDial,\n\t\tOnConnection:   s.outboundPeerConnected,\n\t\tGetNewAddress:  newAddressFunc,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts.connManager = cmgr\n\n\ts.p2pDowngrader = peer.NewP2PDowngrader(uint(targetOutbound) + 1)\n\n\t// Start up persistent peers.\n\tpermanentPeers := cfg.ConnectPeers\n\tif len(permanentPeers) == 0 {\n\t\tpermanentPeers = cfg.AddPeers\n\t}\n\tfor _, addr := range permanentPeers {\n\t\tnetAddr, err := addrStringToNetAddr(addr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tgo s.connManager.Connect(&connmgr.ConnReq{\n\t\t\tAddr:      netAddr,\n\t\t\tPermanent: true,\n\t\t})\n\t}\n\n\tif !cfg.DisableRPC {\n\t\t// Setup listeners for the configured RPC listen addresses and\n\t\t// TLS settings.\n\t\trpcListeners, err := setupRPCListeners()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif len(rpcListeners) == 0 {\n\t\t\treturn nil, errors.New(\"RPCS: No valid listen address\")\n\t\t}\n\n\t\ts.rpcServer, err = newRPCServer(&rpcserverConfig{\n\t\t\tListeners:    rpcListeners,\n\t\t\tStartupTime:  s.startupTime,\n\t\t\tConnMgr:      &rpcConnManager{&s},\n\t\t\tSyncMgr:      &rpcSyncMgr{&s, s.syncManager},\n\t\t\tTimeSource:   s.timeSource,\n\t\t\tChain:        s.chain,\n\t\t\tChainParams:  chainParams,\n\t\t\tDB:           db,\n\t\t\tTxMemPool:    s.txMemPool,\n\t\t\tGenerator:    blockTemplateGenerator,\n\t\t\tCPUMiner:     s.cpuMiner,\n\t\t\tTxIndex:      s.txIndex,\n\t\t\tAddrIndex:    s.addrIndex,\n\t\t\tCfIndex:      s.cfIndex,\n\t\t\tFeeEstimator: s.feeEstimator,\n\t\t})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Signal process shutdown when the RPC server requests it.\n\t\tgo func() {\n\t\t\t<-s.rpcServer.RequestedProcessShutdown()\n\t\t\tshutdownRequestChannel <- struct{}{}\n\t\t}()\n\t}\n\n\treturn &s, nil\n}\n\n// initListeners initializes the configured net listeners and adds any bound\n// addresses to the address manager. Returns the listeners and a NAT interface,\n// which is non-nil if UPnP is in use.\nfunc initListeners(amgr *addrmgr.AddrManager, listenAddrs []string, services wire.ServiceFlag) ([]net.Listener, NAT, error) {\n\t// Listen for TCP connections at the configured addresses\n\tnetAddrs, err := parseListeners(listenAddrs)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tlisteners := make([]net.Listener, 0, len(netAddrs))\n\tfor _, addr := range netAddrs {\n\t\tlistener, err := net.Listen(addr.Network(), addr.String())\n\t\tif err != nil {\n\t\t\tsrvrLog.Warnf(\"Can't listen on %s: %v\", addr, err)\n\t\t\tcontinue\n\t\t}\n\t\tlisteners = append(listeners, listener)\n\t}\n\n\tvar nat NAT\n\tif len(cfg.ExternalIPs) != 0 {\n\t\tdefaultPort, err := strconv.ParseUint(activeNetParams.DefaultPort, 10, 16)\n\t\tif err != nil {\n\t\t\tsrvrLog.Errorf(\"Can not parse default port %s for active chain: %v\",\n\t\t\t\tactiveNetParams.DefaultPort, err)\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\tfor _, sip := range cfg.ExternalIPs {\n\t\t\teport := uint16(defaultPort)\n\t\t\thost, portstr, err := net.SplitHostPort(sip)\n\t\t\tif err != nil {\n\t\t\t\t// no port, use default.\n\t\t\t\thost = sip\n\t\t\t} else {\n\t\t\t\tport, err := strconv.ParseUint(portstr, 10, 16)\n\t\t\t\tif err != nil {\n\t\t\t\t\tsrvrLog.Warnf(\"Can not parse port from %s for \"+\n\t\t\t\t\t\t\"externalip: %v\", sip, err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\teport = uint16(port)\n\t\t\t}\n\t\t\tna, err := amgr.HostToNetAddress(host, eport, services)\n\t\t\tif err != nil {\n\t\t\t\tsrvrLog.Warnf(\"Not adding %s as externalip: %v\", sip, err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\terr = amgr.AddLocalAddress(na, addrmgr.ManualPrio)\n\t\t\tif err != nil {\n\t\t\t\tamgrLog.Warnf(\"Skipping specified external IP: %v\", err)\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif cfg.Upnp {\n\t\t\tvar err error\n\t\t\tnat, err = Discover()\n\t\t\tif err != nil {\n\t\t\t\tsrvrLog.Warnf(\"Can't discover upnp: %v\", err)\n\t\t\t}\n\t\t\t// nil nat here is fine, just means no upnp on network.\n\t\t}\n\n\t\t// Add bound addresses to address manager to be advertised to peers.\n\t\tfor _, listener := range listeners {\n\t\t\taddr := listener.Addr().String()\n\t\t\terr := addLocalAddress(amgr, addr, services)\n\t\t\tif err != nil {\n\t\t\t\tamgrLog.Warnf(\"Skipping bound address %s: %v\", addr, err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn listeners, nat, nil\n}\n\n// addrStringToNetAddr takes an address in the form of 'host:port' and returns\n// a net.Addr which maps to the original address with any host names resolved\n// to IP addresses.  It also handles tor addresses properly by returning a\n// net.Addr that encapsulates the address.\nfunc addrStringToNetAddr(addr string) (net.Addr, error) {\n\thost, strPort, err := net.SplitHostPort(addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tport, err := strconv.Atoi(strPort)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Skip if host is already an IP address.\n\tif ip := net.ParseIP(host); ip != nil {\n\t\treturn &net.TCPAddr{\n\t\t\tIP:   ip,\n\t\t\tPort: port,\n\t\t}, nil\n\t}\n\n\t// Tor addresses cannot be resolved to an IP, so just return an onion\n\t// address instead.\n\tif strings.HasSuffix(host, \".onion\") {\n\t\tif cfg.NoOnion {\n\t\t\treturn nil, errors.New(\"tor has been disabled\")\n\t\t}\n\n\t\treturn &onionAddr{addr: addr}, nil\n\t}\n\n\t// Attempt to look up an IP address associated with the parsed host.\n\tips, err := btcdLookup(host)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(ips) == 0 {\n\t\treturn nil, fmt.Errorf(\"no addresses found for %s\", host)\n\t}\n\n\treturn &net.TCPAddr{\n\t\tIP:   ips[0],\n\t\tPort: port,\n\t}, nil\n}\n\n// addLocalAddress adds an address that this node is listening on to the\n// address manager so that it may be relayed to peers.\nfunc addLocalAddress(addrMgr *addrmgr.AddrManager, addr string, services wire.ServiceFlag) error {\n\thost, portStr, err := net.SplitHostPort(addr)\n\tif err != nil {\n\t\treturn err\n\t}\n\tport, err := strconv.ParseUint(portStr, 10, 16)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif ip := net.ParseIP(host); ip != nil && ip.IsUnspecified() {\n\t\t// If bound to unspecified address, advertise all local interfaces\n\t\taddrs, err := net.InterfaceAddrs()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tfor _, addr := range addrs {\n\t\t\tifaceIP, _, err := net.ParseCIDR(addr.String())\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// If bound to 0.0.0.0, do not add IPv6 interfaces and if bound to\n\t\t\t// ::, do not add IPv4 interfaces.\n\t\t\tif (ip.To4() == nil) != (ifaceIP.To4() == nil) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tnetAddr := wire.NetAddressV2FromBytes(\n\t\t\t\ttime.Now(), services, ifaceIP, uint16(port),\n\t\t\t)\n\t\t\taddrMgr.AddLocalAddress(netAddr, addrmgr.BoundPrio)\n\t\t}\n\t} else {\n\t\tnetAddr, err := addrMgr.HostToNetAddress(host, uint16(port), services)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\taddrMgr.AddLocalAddress(netAddr, addrmgr.BoundPrio)\n\t}\n\n\treturn nil\n}\n\n// dynamicTickDuration is a convenience function used to dynamically choose a\n// tick duration based on remaining time.  It is primarily used during\n// server shutdown to make shutdown warnings more frequent as the shutdown time\n// approaches.\nfunc dynamicTickDuration(remaining time.Duration) time.Duration {\n\tswitch {\n\tcase remaining <= time.Second*5:\n\t\treturn time.Second\n\tcase remaining <= time.Second*15:\n\t\treturn time.Second * 5\n\tcase remaining <= time.Minute:\n\t\treturn time.Second * 15\n\tcase remaining <= time.Minute*5:\n\t\treturn time.Minute\n\tcase remaining <= time.Minute*15:\n\t\treturn time.Minute * 5\n\tcase remaining <= time.Hour:\n\t\treturn time.Minute * 15\n\t}\n\treturn time.Hour\n}\n\n// isWhitelisted returns whether the IP address is included in the whitelisted\n// networks and IPs.\nfunc isWhitelisted(addr net.Addr) bool {\n\tif len(cfg.whitelists) == 0 {\n\t\treturn false\n\t}\n\n\thost, _, err := net.SplitHostPort(addr.String())\n\tif err != nil {\n\t\tsrvrLog.Warnf(\"Unable to SplitHostPort on '%s': %v\", addr, err)\n\t\treturn false\n\t}\n\tip := net.ParseIP(host)\n\tif ip == nil {\n\t\tsrvrLog.Warnf(\"Unable to parse IP '%s'\", addr)\n\t\treturn false\n\t}\n\n\tfor _, ipnet := range cfg.whitelists {\n\t\tif ipnet.Contains(ip) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// checkpointSorter implements sort.Interface to allow a slice of checkpoints to\n// be sorted.\ntype checkpointSorter []chaincfg.Checkpoint\n\n// Len returns the number of checkpoints in the slice.  It is part of the\n// sort.Interface implementation.\nfunc (s checkpointSorter) Len() int {\n\treturn len(s)\n}\n\n// Swap swaps the checkpoints at the passed indices.  It is part of the\n// sort.Interface implementation.\nfunc (s checkpointSorter) Swap(i, j int) {\n\ts[i], s[j] = s[j], s[i]\n}\n\n// Less returns whether the checkpoint with index i should sort before the\n// checkpoint with index j.  It is part of the sort.Interface implementation.\nfunc (s checkpointSorter) Less(i, j int) bool {\n\treturn s[i].Height < s[j].Height\n}\n\n// mergeCheckpoints returns two slices of checkpoints merged into one slice\n// such that the checkpoints are sorted by height.  In the case the additional\n// checkpoints contain a checkpoint with the same height as a checkpoint in the\n// default checkpoints, the additional checkpoint will take precedence and\n// overwrite the default one.\nfunc mergeCheckpoints(defaultCheckpoints, additional []chaincfg.Checkpoint) []chaincfg.Checkpoint {\n\t// Create a map of the additional checkpoints to remove duplicates while\n\t// leaving the most recently-specified checkpoint.\n\textra := make(map[int32]chaincfg.Checkpoint)\n\tfor _, checkpoint := range additional {\n\t\textra[checkpoint.Height] = checkpoint\n\t}\n\n\t// Add all default checkpoints that do not have an override in the\n\t// additional checkpoints.\n\tnumDefault := len(defaultCheckpoints)\n\tcheckpoints := make([]chaincfg.Checkpoint, 0, numDefault+len(extra))\n\tfor _, checkpoint := range defaultCheckpoints {\n\t\tif _, exists := extra[checkpoint.Height]; !exists {\n\t\t\tcheckpoints = append(checkpoints, checkpoint)\n\t\t}\n\t}\n\n\t// Append the additional checkpoints and return the sorted results.\n\tfor _, checkpoint := range extra {\n\t\tcheckpoints = append(checkpoints, checkpoint)\n\t}\n\tsort.Sort(checkpointSorter(checkpoints))\n\treturn checkpoints\n}\n\n// HasUndesiredUserAgent determines whether the server should continue to pursue\n// a connection with this peer based on its advertised user agent. It performs\n// the following steps:\n// 1) Reject the peer if it contains a blacklisted agent.\n// 2) If no whitelist is provided, accept all user agents.\n// 3) Accept the peer if it contains a whitelisted agent.\n// 4) Reject all other peers.\nfunc (sp *serverPeer) HasUndesiredUserAgent(blacklistedAgents,\n\twhitelistedAgents []string) bool {\n\n\tagent := sp.UserAgent()\n\n\t// First, if peer's user agent contains any blacklisted substring, we\n\t// will ignore the connection request.\n\tfor _, blacklistedAgent := range blacklistedAgents {\n\t\tif strings.Contains(agent, blacklistedAgent) {\n\t\t\tsrvrLog.Debugf(\"Ignoring peer %s, user agent \"+\n\t\t\t\t\"contains blacklisted user agent: %s\", sp,\n\t\t\t\tagent)\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// If no whitelist is provided, we will accept all user agents.\n\tif len(whitelistedAgents) == 0 {\n\t\treturn false\n\t}\n\n\t// Peer's user agent passed blacklist. Now check to see if it contains\n\t// one of our whitelisted user agents, if so accept.\n\tfor _, whitelistedAgent := range whitelistedAgents {\n\t\tif strings.Contains(agent, whitelistedAgent) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// Otherwise, the peer's user agent was not included in our whitelist.\n\t// Ignore just in case it could stall the initial block download.\n\tsrvrLog.Debugf(\"Ignoring peer %s, user agent: %s not found in \"+\n\t\t\"whitelist\", sp, agent)\n\n\treturn true\n}\n"
  },
  {
    "path": "service_windows.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/btcsuite/winsvc/eventlog\"\n\t\"github.com/btcsuite/winsvc/mgr\"\n\t\"github.com/btcsuite/winsvc/svc\"\n)\n\nconst (\n\t// svcName is the name of btcd service.\n\tsvcName = \"btcdsvc\"\n\n\t// svcDisplayName is the service name that will be shown in the windows\n\t// services list.  Not the svcName is the \"real\" name which is used\n\t// to control the service.  This is only for display purposes.\n\tsvcDisplayName = \"Btcd Service\"\n\n\t// svcDesc is the description of the service.\n\tsvcDesc = \"Downloads and stays synchronized with the bitcoin block \" +\n\t\t\"chain and provides chain services to applications.\"\n)\n\n// elog is used to send messages to the Windows event log.\nvar elog *eventlog.Log\n\n// logServiceStartOfDay logs information about btcd when the main server has\n// been started to the Windows event log.\nfunc logServiceStartOfDay(srvr *server) {\n\tvar message string\n\tmessage += fmt.Sprintf(\"Version %s\\n\", version())\n\tmessage += fmt.Sprintf(\"Configuration directory: %s\\n\", defaultHomeDir)\n\tmessage += fmt.Sprintf(\"Configuration file: %s\\n\", cfg.ConfigFile)\n\tmessage += fmt.Sprintf(\"Data directory: %s\\n\", cfg.DataDir)\n\n\telog.Info(1, message)\n}\n\n// btcdService houses the main service handler which handles all service\n// updates and launching btcdMain.\ntype btcdService struct{}\n\n// Execute is the main entry point the winsvc package calls when receiving\n// information from the Windows service control manager.  It launches the\n// long-running btcdMain (which is the real meat of btcd), handles service\n// change requests, and notifies the service control manager of changes.\nfunc (s *btcdService) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (bool, uint32) {\n\t// Service start is pending.\n\tconst cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown\n\tchanges <- svc.Status{State: svc.StartPending}\n\n\t// Start btcdMain in a separate goroutine so the service can start\n\t// quickly.  Shutdown (along with a potential error) is reported via\n\t// doneChan.  serverChan is notified with the main server instance once\n\t// it is started so it can be gracefully stopped.\n\tdoneChan := make(chan error)\n\tserverChan := make(chan *server)\n\tgo func() {\n\t\terr := btcdMain(serverChan)\n\t\tdoneChan <- err\n\t}()\n\n\t// Service is now started.\n\tchanges <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}\n\n\tvar mainServer *server\nloop:\n\tfor {\n\t\tselect {\n\t\tcase c := <-r:\n\t\t\tswitch c.Cmd {\n\t\t\tcase svc.Interrogate:\n\t\t\t\tchanges <- c.CurrentStatus\n\n\t\t\tcase svc.Stop, svc.Shutdown:\n\t\t\t\t// Service stop is pending.  Don't accept any\n\t\t\t\t// more commands while pending.\n\t\t\t\tchanges <- svc.Status{State: svc.StopPending}\n\n\t\t\t\t// Signal the main function to exit.\n\t\t\t\tshutdownRequestChannel <- struct{}{}\n\n\t\t\tdefault:\n\t\t\t\telog.Error(1, fmt.Sprintf(\"Unexpected control \"+\n\t\t\t\t\t\"request #%d.\", c))\n\t\t\t}\n\n\t\tcase srvr := <-serverChan:\n\t\t\tmainServer = srvr\n\t\t\tlogServiceStartOfDay(mainServer)\n\n\t\tcase err := <-doneChan:\n\t\t\tif err != nil {\n\t\t\t\telog.Error(1, err.Error())\n\t\t\t}\n\t\t\tbreak loop\n\t\t}\n\t}\n\n\t// Service is now stopped.\n\tchanges <- svc.Status{State: svc.Stopped}\n\treturn false, 0\n}\n\n// installService attempts to install the btcd service.  Typically this should\n// be done by the msi installer, but it is provided here since it can be useful\n// for development.\nfunc installService() error {\n\t// Get the path of the current executable.  This is needed because\n\t// os.Args[0] can vary depending on how the application was launched.\n\t// For example, under cmd.exe it will only be the name of the app\n\t// without the path or extension, but under mingw it will be the full\n\t// path including the extension.\n\texePath, err := filepath.Abs(os.Args[0])\n\tif err != nil {\n\t\treturn err\n\t}\n\tif filepath.Ext(exePath) == \"\" {\n\t\texePath += \".exe\"\n\t}\n\n\t// Connect to the windows service manager.\n\tserviceManager, err := mgr.Connect()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer serviceManager.Disconnect()\n\n\t// Ensure the service doesn't already exist.\n\tservice, err := serviceManager.OpenService(svcName)\n\tif err == nil {\n\t\tservice.Close()\n\t\treturn fmt.Errorf(\"service %s already exists\", svcName)\n\t}\n\n\t// Install the service.\n\tservice, err = serviceManager.CreateService(svcName, exePath, mgr.Config{\n\t\tDisplayName: svcDisplayName,\n\t\tDescription: svcDesc,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer service.Close()\n\n\t// Support events to the event log using the standard \"standard\" Windows\n\t// EventCreate.exe message file.  This allows easy logging of custom\n\t// messages instead of needing to create our own message catalog.\n\teventlog.Remove(svcName)\n\teventsSupported := uint32(eventlog.Error | eventlog.Warning | eventlog.Info)\n\treturn eventlog.InstallAsEventCreate(svcName, eventsSupported)\n}\n\n// removeService attempts to uninstall the btcd service.  Typically this should\n// be done by the msi uninstaller, but it is provided here since it can be\n// useful for development.  Not the eventlog entry is intentionally not removed\n// since it would invalidate any existing event log messages.\nfunc removeService() error {\n\t// Connect to the windows service manager.\n\tserviceManager, err := mgr.Connect()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer serviceManager.Disconnect()\n\n\t// Ensure the service exists.\n\tservice, err := serviceManager.OpenService(svcName)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"service %s is not installed\", svcName)\n\t}\n\tdefer service.Close()\n\n\t// Remove the service.\n\treturn service.Delete()\n}\n\n// startService attempts to start the btcd service.\nfunc startService() error {\n\t// Connect to the windows service manager.\n\tserviceManager, err := mgr.Connect()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer serviceManager.Disconnect()\n\n\tservice, err := serviceManager.OpenService(svcName)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not access service: %v\", err)\n\t}\n\tdefer service.Close()\n\n\terr = service.Start(os.Args)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not start service: %v\", err)\n\t}\n\n\treturn nil\n}\n\n// controlService allows commands which change the status of the service.  It\n// also waits for up to 10 seconds for the service to change to the passed\n// state.\nfunc controlService(c svc.Cmd, to svc.State) error {\n\t// Connect to the windows service manager.\n\tserviceManager, err := mgr.Connect()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer serviceManager.Disconnect()\n\n\tservice, err := serviceManager.OpenService(svcName)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not access service: %v\", err)\n\t}\n\tdefer service.Close()\n\n\tstatus, err := service.Control(c)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not send control=%d: %v\", c, err)\n\t}\n\n\t// Send the control message.\n\ttimeout := time.Now().Add(10 * time.Second)\n\tfor status.State != to {\n\t\tif timeout.Before(time.Now()) {\n\t\t\treturn fmt.Errorf(\"timeout waiting for service to go \"+\n\t\t\t\t\"to state=%d\", to)\n\t\t}\n\t\ttime.Sleep(300 * time.Millisecond)\n\t\tstatus, err = service.Query()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"could not retrieve service \"+\n\t\t\t\t\"status: %v\", err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// performServiceCommand attempts to run one of the supported service commands\n// provided on the command line via the service command flag.  An appropriate\n// error is returned if an invalid command is specified.\nfunc performServiceCommand(command string) error {\n\tvar err error\n\tswitch command {\n\tcase \"install\":\n\t\terr = installService()\n\n\tcase \"remove\":\n\t\terr = removeService()\n\n\tcase \"start\":\n\t\terr = startService()\n\n\tcase \"stop\":\n\t\terr = controlService(svc.Stop, svc.Stopped)\n\n\tdefault:\n\t\terr = fmt.Errorf(\"invalid service command [%s]\", command)\n\t}\n\n\treturn err\n}\n\n// serviceMain checks whether we're being invoked as a service, and if so uses\n// the service control manager to start the long-running server.  A flag is\n// returned to the caller so the application can determine whether to exit (when\n// running as a service) or launch in normal interactive mode.\nfunc serviceMain() (bool, error) {\n\t// Don't run as a service if the user explicitly requested it. This is\n\t// needed to run btcd on Windows in CI environments like Travis.\n\t// We can't use the config struct to access the value because that's not\n\t// parsed yet. But we add the flag to the struct anyway so the parser\n\t// won't complain about it later.\n\tnoService := false\n\tfor _, arg := range os.Args {\n\t\tif arg == \"--nowinservice\" {\n\t\t\tnoService = true\n\t\t\tbreak\n\t\t}\n\t}\n\tif noService {\n\t\treturn false, nil\n\t}\n\n\t// Don't run as a service if we're running interactively (or that can't\n\t// be determined due to an error).\n\tisInteractive, err := svc.IsAnInteractiveSession()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif isInteractive {\n\t\treturn false, nil\n\t}\n\n\telog, err = eventlog.Open(svcName)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tdefer elog.Close()\n\n\terr = svc.Run(svcName, &btcdService{})\n\tif err != nil {\n\t\telog.Error(1, fmt.Sprintf(\"Service start failed: %v\", err))\n\t\treturn true, err\n\t}\n\n\treturn true, nil\n}\n\n// Set windows specific functions to real functions.\nfunc init() {\n\trunServiceCommand = performServiceCommand\n\twinServiceMain = serviceMain\n}\n"
  },
  {
    "path": "signal.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"os\"\n\t\"os/signal\"\n)\n\n// shutdownRequestChannel is used to initiate shutdown from one of the\n// subsystems using the same code paths as when an interrupt signal is received.\nvar shutdownRequestChannel = make(chan struct{})\n\n// interruptSignals defines the default signals to catch in order to do a proper\n// shutdown.  This may be modified during init depending on the platform.\nvar interruptSignals = []os.Signal{os.Interrupt}\n\n// interruptListener listens for OS Signals such as SIGINT (Ctrl+C) and shutdown\n// requests from shutdownRequestChannel.  It returns a channel that is closed\n// when either signal is received.\nfunc interruptListener() <-chan struct{} {\n\tc := make(chan struct{})\n\tgo func() {\n\t\tinterruptChannel := make(chan os.Signal, 1)\n\t\tsignal.Notify(interruptChannel, interruptSignals...)\n\n\t\t// Listen for initial shutdown signal and close the returned\n\t\t// channel to notify the caller.\n\t\tselect {\n\t\tcase sig := <-interruptChannel:\n\t\t\tbtcdLog.Infof(\"Received signal (%s).  Shutting down...\",\n\t\t\t\tsig)\n\n\t\tcase <-shutdownRequestChannel:\n\t\t\tbtcdLog.Info(\"Shutdown requested.  Shutting down...\")\n\t\t}\n\t\tclose(c)\n\n\t\t// Listen for repeated signals and display a message so the user\n\t\t// knows the shutdown is in progress and the process is not\n\t\t// hung.\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase sig := <-interruptChannel:\n\t\t\t\tbtcdLog.Infof(\"Received signal (%s).  Already \"+\n\t\t\t\t\t\"shutting down...\", sig)\n\n\t\t\tcase <-shutdownRequestChannel:\n\t\t\t\tbtcdLog.Info(\"Shutdown requested.  Already \" +\n\t\t\t\t\t\"shutting down...\")\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn c\n}\n\n// interruptRequested returns true when the channel returned by\n// interruptListener was closed.  This simplifies early shutdown slightly since\n// the caller can just use an if statement instead of a select.\nfunc interruptRequested(interrupted <-chan struct{}) bool {\n\tselect {\n\tcase <-interrupted:\n\t\treturn true\n\tdefault:\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "signalsigterm.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris\n// +build darwin dragonfly freebsd linux netbsd openbsd solaris\n\npackage main\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\nfunc init() {\n\tinterruptSignals = []os.Signal{os.Interrupt, syscall.SIGTERM}\n}\n"
  },
  {
    "path": "txscript/README.md",
    "content": "txscript\n========\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://pkg.go.dev/github.com/btcsuite/btcd/txscript?status.png)](https://pkg.go.dev/github.com/btcsuite/btcd/txscript)\n\nPackage txscript implements the bitcoin transaction script language.  There is\na comprehensive test suite.\n\nThis package has intentionally been designed so it can be used as a standalone\npackage for any projects needing to use or validate bitcoin transaction scripts.\n\n## Bitcoin Scripts\n\nBitcoin provides a stack-based, FORTH-like language for the scripts in\nthe bitcoin transactions.  This language is not turing complete\nalthough it is still fairly powerful.  A description of the language\ncan be found at https://en.bitcoin.it/wiki/Script\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/txscript\n```\n\n## Examples\n\n* [Standard Pay-to-pubkey-hash Script](https://pkg.go.dev/github.com/btcsuite/btcd/txscript#example-PayToAddrScript)  \n  Demonstrates creating a script which pays to a bitcoin address.  It also\n  prints the created script hex and uses the DisasmString function to display\n  the disassembled script.\n\n* [Extracting Details from Standard Scripts](https://pkg.go.dev/github.com/btcsuite/btcd/txscript#example-ExtractPkScriptAddrs)  \n  Demonstrates extracting information from a standard public key script.\n\n* [Manually Signing a Transaction Output](https://pkg.go.dev/github.com/btcsuite/btcd/txscript#example-SignTxOutput)  \n  Demonstrates manually creating and signing a redeem transaction.\n\n* [Counting Opcodes in Scripts](http://godoc.org/github.com/decred/dcrd/txscript#example-ScriptTokenizer)  \n  Demonstrates creating a script tokenizer instance and using it to count the\n  number of opcodes a script contains.\n\n## GPG Verification Key\n\nAll official release tags are signed by Conformal so users can ensure the code\nhas not been tampered with and is coming from the btcsuite developers.  To\nverify the signature perform the following:\n\n- Download the public key from the Conformal website at\n  https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt\n\n- Import the public key into your GPG keyring:\n  ```bash\n  gpg --import GIT-GPG-KEY-conformal.txt\n  ```\n\n- Verify the release tag with the following command where `TAG_NAME` is a\n  placeholder for the specific tag:\n  ```bash\n  git tag -v TAG_NAME\n  ```\n\n## License\n\nPackage txscript is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "txscript/bench_test.go",
    "content": "// Copyright (c) 2018-2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nvar (\n\t// manyInputsBenchTx is a transaction that contains a lot of inputs which is\n\t// useful for benchmarking signature hash calculation.\n\tmanyInputsBenchTx wire.MsgTx\n\n\t// A mock previous output script to use in the signing benchmark.\n\tprevOutScript = hexToBytes(\"a914f5916158e3e2c4551c1796708db8367207ed13bb87\")\n)\n\nfunc init() {\n\t// tx 620f57c92cf05a7f7e7f7d28255d5f7089437bc48e34dcfebf7751d08b7fb8f5\n\ttxHex, err := os.ReadFile(\"data/many_inputs_tx.hex\")\n\tif err != nil {\n\t\tpanic(fmt.Sprintf(\"unable to read benchmark tx file: %v\", err))\n\t}\n\n\ttxBytes := hexToBytes(string(txHex))\n\terr = manyInputsBenchTx.Deserialize(bytes.NewReader(txBytes))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// BenchmarkCalcSigHash benchmarks how long it takes to calculate the signature\n// hashes for all inputs of a transaction with many inputs.\nfunc BenchmarkCalcSigHash(b *testing.B) {\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\tfor j := 0; j < len(manyInputsBenchTx.TxIn); j++ {\n\t\t\t_, err := CalcSignatureHash(prevOutScript, SigHashAll,\n\t\t\t\t&manyInputsBenchTx, j)\n\t\t\tif err != nil {\n\t\t\t\tb.Fatalf(\"failed to calc signature hash: %v\", err)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// BenchmarkCalcWitnessSigHash benchmarks how long it takes to calculate the\n// witness signature hashes for all inputs of a transaction with many inputs.\nfunc BenchmarkCalcWitnessSigHash(b *testing.B) {\n\tprevOutFetcher := NewCannedPrevOutputFetcher(prevOutScript, 5)\n\tsigHashes := NewTxSigHashes(&manyInputsBenchTx, prevOutFetcher)\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\tfor j := 0; j < len(manyInputsBenchTx.TxIn); j++ {\n\t\t\t_, err := CalcWitnessSigHash(\n\t\t\t\tprevOutScript, sigHashes, SigHashAll,\n\t\t\t\t&manyInputsBenchTx, j, 5,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tb.Fatalf(\"failed to calc signature hash: %v\", err)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// genComplexScript returns a script comprised of half as many opcodes as the\n// maximum allowed followed by as many max size data pushes fit without\n// exceeding the max allowed script size.\nfunc genComplexScript() ([]byte, error) {\n\tvar scriptLen int\n\tbuilder := NewScriptBuilder()\n\tfor i := 0; i < MaxOpsPerScript/2; i++ {\n\t\tbuilder.AddOp(OP_TRUE)\n\t\tscriptLen++\n\t}\n\tmaxData := bytes.Repeat([]byte{0x02}, MaxScriptElementSize)\n\tfor i := 0; i < (MaxScriptSize-scriptLen)/(MaxScriptElementSize+3); i++ {\n\t\tbuilder.AddData(maxData)\n\t}\n\treturn builder.Script()\n}\n\n// BenchmarkScriptParsing benchmarks how long it takes to parse a very large\n// script.\nfunc BenchmarkScriptParsing(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tconst scriptVersion = 0\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\t\tfor tokenizer.Next() {\n\t\t\t_ = tokenizer.Opcode()\n\t\t\t_ = tokenizer.Data()\n\t\t\t_ = tokenizer.ByteIndex()\n\t\t}\n\t\tif err := tokenizer.Err(); err != nil {\n\t\t\tb.Fatalf(\"failed to parse script: %v\", err)\n\t\t}\n\t}\n}\n\n// BenchmarkDisasmString benchmarks how long it takes to disassemble a very\n// large script.\nfunc BenchmarkDisasmString(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_, err := DisasmString(script)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"failed to disasm script: %v\", err)\n\t\t}\n\t}\n}\n\n// BenchmarkIsPubKeyScript benchmarks how long it takes to analyze a very large\n// script to determine if it is a standard pay-to-pubkey script.\nfunc BenchmarkIsPubKeyScript(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = IsPayToPubKey(script)\n\t}\n}\n\n// BenchmarkIsPubKeyHashScript benchmarks how long it takes to analyze a very\n// large script to determine if it is a standard pay-to-pubkey-hash script.\nfunc BenchmarkIsPubKeyHashScript(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = IsPayToPubKeyHash(script)\n\t}\n}\n\n// BenchmarkIsPayToScriptHash benchmarks how long it takes IsPayToScriptHash to\n// analyze a very large script.\nfunc BenchmarkIsPayToScriptHash(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = IsPayToScriptHash(script)\n\t}\n}\n\n// BenchmarkIsMultisigScriptLarge benchmarks how long it takes IsMultisigScript\n// to analyze a very large script.\nfunc BenchmarkIsMultisigScriptLarge(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\tisMultisig, err := IsMultisigScript(script)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unexpected err: %v\", err)\n\t\t}\n\t\tif isMultisig {\n\t\t\tb.Fatalf(\"script should NOT be reported as mutisig script\")\n\t\t}\n\t}\n}\n\n// BenchmarkIsMultisigScript benchmarks how long it takes IsMultisigScript to\n// analyze a 1-of-2 multisig public key script.\nfunc BenchmarkIsMultisigScript(b *testing.B) {\n\tmultisigShortForm := \"1 \" +\n\t\t\"DATA_33 \" +\n\t\t\"0x030478aaaa2be30772f1e69e581610f1840b3cf2fe7228ee0281cd599e5746f81e \" +\n\t\t\"DATA_33 \" +\n\t\t\"0x0284f4d078b236a9ff91661f8ffbe012737cd3507566f30fd97d25f2b23539f3cd \" +\n\t\t\"2 CHECKMULTISIG\"\n\tpkScript := mustParseShortForm(multisigShortForm)\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\tisMultisig, err := IsMultisigScript(pkScript)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unexpected err: %v\", err)\n\t\t}\n\t\tif !isMultisig {\n\t\t\tb.Fatalf(\"script should be reported as a mutisig script\")\n\t\t}\n\t}\n}\n\n// BenchmarkIsMultisigSigScript benchmarks how long it takes IsMultisigSigScript\n// to analyze a very large script.\nfunc BenchmarkIsMultisigSigScriptLarge(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\tif IsMultisigSigScript(script) {\n\t\t\tb.Fatalf(\"script should NOT be reported as mutisig sig script\")\n\t\t}\n\t}\n}\n\n// BenchmarkIsMultisigSigScript benchmarks how long it takes IsMultisigSigScript\n// to analyze both a 1-of-2 multisig public key script (which should be false)\n// and a signature script comprised of a pay-to-script-hash 1-of-2 multisig\n// redeem script (which should be true).\nfunc BenchmarkIsMultisigSigScript(b *testing.B) {\n\tmultisigShortForm := \"1 \" +\n\t\t\"DATA_33 \" +\n\t\t\"0x030478aaaa2be30772f1e69e581610f1840b3cf2fe7228ee0281cd599e5746f81e \" +\n\t\t\"DATA_33 \" +\n\t\t\"0x0284f4d078b236a9ff91661f8ffbe012737cd3507566f30fd97d25f2b23539f3cd \" +\n\t\t\"2 CHECKMULTISIG\"\n\tpkScript := mustParseShortForm(multisigShortForm)\n\n\tsigHex := \"0x304402205795c3ab6ba11331eeac757bf1fc9c34bef0c7e1a9c8bd5eebb8\" +\n\t\t\"82f3b79c5838022001e0ab7b4c7662e4522dc5fa479e4b4133fa88c6a53d895dc1d5\" +\n\t\t\"2eddc7bbcf2801 \"\n\tsigScript := mustParseShortForm(\"DATA_71 \" + sigHex + \"DATA_71 \" +\n\t\tmultisigShortForm)\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\tif IsMultisigSigScript(pkScript) {\n\t\t\tb.Fatalf(\"script should NOT be reported as mutisig sig script\")\n\t\t}\n\t\tif !IsMultisigSigScript(sigScript) {\n\t\t\tb.Fatalf(\"script should be reported as a mutisig sig script\")\n\t\t}\n\t}\n}\n\n// BenchmarkIsPushOnlyScript benchmarks how long it takes IsPushOnlyScript to\n// analyze a very large script.\nfunc BenchmarkIsPushOnlyScript(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = IsPushOnlyScript(script)\n\t}\n}\n\n// BenchmarkIsWitnessPubKeyHash benchmarks how long it takes to analyze a very\n// large script to determine if it is a standard witness pubkey hash script.\nfunc BenchmarkIsWitnessPubKeyHash(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = IsPayToWitnessPubKeyHash(script)\n\t}\n}\n\n// BenchmarkIsWitnessScriptHash benchmarks how long it takes to analyze a very\n// large script to determine if it is a standard witness script hash script.\nfunc BenchmarkIsWitnessScriptHash(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = IsPayToWitnessScriptHash(script)\n\t}\n}\n\n// BenchmarkIsNullDataScript benchmarks how long it takes to analyze a very\n// large script to determine if it is a standard nulldata script.\nfunc BenchmarkIsNullDataScript(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = IsNullData(script)\n\t}\n}\n\n// BenchmarkIsUnspendable benchmarks how long it takes IsUnspendable to analyze\n// a very large script.\nfunc BenchmarkIsUnspendable(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = IsUnspendable(script)\n\t}\n}\n\n// BenchmarkGetSigOpCount benchmarks how long it takes to count the signature\n// operations of a very large script.\nfunc BenchmarkGetSigOpCount(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = GetSigOpCount(script)\n\t}\n}\n\n// BenchmarkGetPreciseSigOpCount benchmarks how long it takes to count the\n// signature operations of a very large script using the more precise counting\n// method.\nfunc BenchmarkGetPreciseSigOpCount(b *testing.B) {\n\tredeemScript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\t// Create a fake pay-to-script-hash to pass the necessary checks and create\n\t// the signature script accordingly by pushing the generated \"redeem\" script\n\t// as the final data push so the benchmark will cover the p2sh path.\n\tscriptHash := \"0x0000000000000000000000000000000000000001\"\n\tpkScript := mustParseShortForm(\"HASH160 DATA_20 \" + scriptHash + \" EQUAL\")\n\tsigScript, err := NewScriptBuilder().AddFullData(redeemScript).Script()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create signature script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = GetPreciseSigOpCount(sigScript, pkScript, true)\n\t}\n}\n\n// BenchmarkGetWitnessSigOpCount benchmarks how long it takes to count the\n// witness signature operations of a very large script.\nfunc BenchmarkGetWitnessSigOpCountP2WKH(b *testing.B) {\n\tpkScript := mustParseShortForm(\"OP_0 DATA_20 0x0000000000000000000000000000000000000000\")\n\tredeemScript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\twitness := wire.TxWitness{\n\t\tredeemScript,\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = GetWitnessSigOpCount(nil, pkScript, witness)\n\t}\n}\n\n// BenchmarkGetWitnessSigOpCount benchmarks how long it takes to count the\n// witness signature operations of a very large script.\nfunc BenchmarkGetWitnessSigOpCountNested(b *testing.B) {\n\tpkScript := mustParseShortForm(\"HASH160 DATA_20 0x0000000000000000000000000000000000000000 OP_EQUAL\")\n\tsigScript := mustParseShortForm(\"DATA_22 0x001600000000000000000000000000000000000000000000\")\n\tredeemScript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\twitness := wire.TxWitness{\n\t\tredeemScript,\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = GetWitnessSigOpCount(sigScript, pkScript, witness)\n\t}\n}\n\n// BenchmarkGetScriptClass benchmarks how long it takes GetScriptClass to\n// analyze a very large script.\nfunc BenchmarkGetScriptClass(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = GetScriptClass(script)\n\t}\n}\n\n// BenchmarkPushedData benchmarks how long it takes to extract the pushed data\n// from a very large script.\nfunc BenchmarkPushedData(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_, err := PushedData(script)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unexpected err: %v\", err)\n\t\t}\n\t}\n}\n\n// BenchmarkExtractAtomicSwapDataPushesLarge benchmarks how long it takes\n// ExtractAtomicSwapDataPushes to analyze a very large script.\nfunc BenchmarkExtractAtomicSwapDataPushesLarge(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tconst scriptVersion = 0\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_, err := ExtractAtomicSwapDataPushes(scriptVersion, script)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unexpected err: %v\", err)\n\t\t}\n\t}\n}\n\n// BenchmarkExtractAtomicSwapDataPushesLarge benchmarks how long it takes\n// ExtractAtomicSwapDataPushes to analyze a standard atomic swap script.\nfunc BenchmarkExtractAtomicSwapDataPushes(b *testing.B) {\n\tsecret := \"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\"\n\trecipient := \"0000000000000000000000000000000000000001\"\n\trefund := \"0000000000000000000000000000000000000002\"\n\tscript := mustParseShortForm(fmt.Sprintf(\"IF SIZE 32 EQUALVERIFY SHA256 \"+\n\t\t\"DATA_32 0x%s EQUALVERIFY DUP HASH160 DATA_20 0x%s ELSE 300000 \"+\n\t\t\"CHECKLOCKTIMEVERIFY DROP DUP HASH160 DATA_20 0x%s ENDIF \"+\n\t\t\"EQUALVERIFY CHECKSIG\", secret, recipient, refund))\n\n\tconst scriptVersion = 0\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_, err := ExtractAtomicSwapDataPushes(scriptVersion, script)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unexpected err: %v\", err)\n\t\t}\n\t}\n}\n\n// BenchmarkExtractPkScriptAddrsLarge benchmarks how long it takes to analyze\n// and potentially extract addresses from a very large non-standard script.\nfunc BenchmarkExtractPkScriptAddrsLarge(b *testing.B) {\n\tscript, err := genComplexScript()\n\tif err != nil {\n\t\tb.Fatalf(\"failed to create benchmark script: %v\", err)\n\t}\n\n\tparams := &chaincfg.MainNetParams\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_, _, _, err := ExtractPkScriptAddrs(script, params)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unexpected err: %v\", err)\n\t\t}\n\t}\n}\n\n// BenchmarkExtractPkScriptAddrs benchmarks how long it takes to analyze and\n// potentially extract addresses from a typical script.\nfunc BenchmarkExtractPkScriptAddrs(b *testing.B) {\n\tscript := mustParseShortForm(\"OP_DUP HASH160 \" +\n\t\t\"DATA_20 0x0102030405060708090a0b0c0d0e0f1011121314 \" +\n\t\t\"EQUAL\")\n\n\tparams := &chaincfg.MainNetParams\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\t_, _, _, err := ExtractPkScriptAddrs(script, params)\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"unexpected err: %v\", err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "txscript/consensus.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nconst (\n\t// LockTimeThreshold is the number below which a lock time is\n\t// interpreted to be a block number.  Since an average of one block\n\t// is generated per 10 minutes, this allows blocks for about 9,512\n\t// years.\n\tLockTimeThreshold = 5e8 // Tue Nov 5 00:53:20 1985 UTC\n)\n"
  },
  {
    "path": "txscript/data/LICENSE",
    "content": "The json files in this directory come from the bitcoind project\n(https://github.com/bitcoin/bitcoin) and is released under the following\nlicense:\n\n    Copyright (c) 2012-2014 The Bitcoin Core developers\n    Distributed under the MIT/X11 software license, see the accompanying\n    file COPYING or http://www.opensource.org/licenses/mit-license.php.\n\n"
  },
  {
    "path": "txscript/data/many_inputs_tx.hex",
    "content": "010000005901fa054079e69a46e5aacd8b57f94c3c99744d68c6097957eaa9021c344141a90000000000ffffffff020706fa6444e4c9d110274488a4641161165370cd11a208ad3a3a00178e1d9c0000000000ffffffff0210805cd4cceae0873daaf8b81d2eb7122cdcdf2dfae5a90569378f847e293c0000000000ffffffff021d93a6970f13f10f6b8b1b5763f772f1f37350f893cb305005319a76069f5a0000000000ffffffff021fa71c8d5f8c455820e6d83c6fca218ed2e70391c7dfba4119168c7ebc68c30000000000ffffffff0227b4b9041f1c8ac86ea16f48909c94adac7081b26a36ed5863e4c53175262b0000000000ffffffff0228a49d6e91275b9d0d8aa5f6e81d4e1e9cd957ecfdabd6df68fe6f4970a0b60000000000ffffffff022db9dd2128b6d1f1eba30a681f062f6eaad362e58b23e6cadcd2cb8d65d6880000000000ffffffff0243411baa5b4b3357849e505310dbd29a8a50e6324c4655e403043ac07ce9d10000000000ffffffff024b630ce631441c527d555c237bb68b694d50010b7723957ef4537185eef6c40000000000ffffffff025312b6a2f95a25a109b4f0b46fb35abd74b15a39241291dd3673f1dd58fd3b0000000000ffffffff02554f0d7fe6df9454c8152c6f46429596abc08b57d7cfbc7f5f22db8a0787e00000000000ffffffff025793409101621f48c0f9ebdef0867088c015c5e412ccbdd1d32a5de62ae1b80000000000ffffffff025b53aa8359a7a3fd92d69ef96be30dfed1ea99fa03db0050f3f6d3b9e2b7320000000000ffffffff025cfc35711a57b373b807bbfaadf0950b81a74d0215a0508f2e62989bdbb4aa0000000000ffffffff025ddd8921db66b54f1ad8ef2eae70913d22e5579e2781a1e485fc6a555f6e410000000000ffffffff026466da9b3ebf93b07e7de704789d5ae04f584fa39043716a9830edf5bf99140000000000ffffffff027904d29d4cb521d7c884325b1d42434bc99b6d712681e5e254597821a944550000000000ffffffff027c662f67150bca47a7b23f0fb7c50956b21a4f46b9f4c4a304d51ce9c5900f0000000000ffffffff027ef5afdeab2ec6515a739dc00c2ef8994303c19a74fd0512f8306fb601d10f0000000000ffffffff0284cdef7bdd0c45efdecb2a3a68079d7e01ccc8e229a3e72160ec93218b1ad90000000000ffffffff028885c672656acd03755167361be6ccd94ad72c5e3890773f11a5c627f046890000000000ffffffff028b372c55109471551db0aa772aa66321862fb3a11e4cd7a31cdc4ed989436d0000000000ffffffff0290198f3a73a8febae55d559676303ae495acbad11dde304c21483a951078270000000000ffffffff0298dc5698fb1823ee1ec7469936e0b9b71e69e843d993b2c0096ac3c1d86bb20000000000ffffffff029c5d6da641328e356368383951c5dad56398f29f58a922eb54afaf888e41430000000000ffffffff02d702320af97f4f498aedf0886cd6123692f6d7b6f0b1da3910703648bc80c40000000000ffffffff02d90670fc2d34b7fcfce03ecb3a3650a4cd384eca645c2b05263721e9a5c19f0000000000ffffffff02de1f9e03b532c0bd6a28a7066c81b7abf0f9dc7e40003f638b9a872fa9a74c0000000000ffffffff02ded955aaf74a935a479fb08d4e8ded2a99664cb2235bc617627616e0e313630000000000ffffffff02e3f8ded8a0d2716817259e4144faa83facd27a5c9550c7c65835cc2c93738a0000000000ffffffff03012cf75972966f2c7abb609b43c7e85dd65cada0ee20118c80d92d766a32400000000000ffffffff0307efdd04c2f3e033a0294aaa894b4245695876fc76c12b8523d448ef05e6620000000000ffffffff030db2a3d8afa67b68f0ae663cc88bee0af0a8900e88f099d2ee648603e7b0e30000000000ffffffff03133fb852424925f55c8a660fdec8a10dce9bb9b500bf07bc73e2641f1a55310000000000ffffffff0313954647c73d9c63e4e83d36e337b17797be10eb0d641deaff0c768aa6db060000000000ffffffff031bfd6a0bfc310e204fc0eb5e1c83b9d21dab82847b909db111a371ffdcb5a20000000000ffffffff032588268e35fbd648c621638633ef8188e8b946ebd3d5833a18d9bae556ee5c0000000000ffffffff03378677fc365f67102c2559a2a4300344d41a63920e7450951fc6d8d63fb0110000000000ffffffff033c9955351d351b4f5ac398adce94b2a7ed3ab14a1c790c8e4742b1558c6b200000000000ffffffff034061cfcca9fb77d28d2411f4502c3696e0aa28b040f6780a4bd00c3fa8a02b0000000000ffffffff034b063b587eb75409e56b5ff2f9cc24a994e3ecbf9de56bd46983443067e81b0000000000ffffffff034cb2f8a145b3a55bb07dcdb904859808b29a5f53a01ba3a3cd707211afb7190000000000ffffffff034f96fa5e134b5310731b23fa9235aad58008c7c61f1b8128542b51622a52250000000000ffffffff0357236d19aef1428f117c3067a89adbecfe234ef32d744acdd6b6a5107a95e90000000000ffffffff0362504fcc65272e50ba6cc4583b4b1486592b59d943ab375ea7d6f44ba8038c0000000000ffffffff0369b02dad4259759408f8a3b1fad3c24df0873b767a9d0f1d50bd68f18c789d0000000000ffffffff036e080ba3f983e5bd7d8700dfd4b510a502231d0112c38e804b59d8a84026230000000000ffffffff038298149c290f73c535c3a184d181316ef695146a58d3bb3d2e61ed993cc11c0000000000ffffffff038538c9d6b8200609e4ca2443910daa6d9bbe772b2793e11fcf1763202c998b0000000000ffffffff038aad027dade93191c546648f7125bda82c895f1d80bf174d9637e533e12a1a0000000000ffffffff03960708a37a5654abd75755d1b8f49a84cdbde4676e14fd4863b125a94e9fc40000000000ffffffff03b0e09c55ecabf221c30a086c812e35bc9b586547cde8a83961a7ffa9067cb20000000000ffffffff03b28e682c13e7ada60cb905f8070109ec5a7800a0424c5f7afb6bd3039d48cd0000000000ffffffff03b7e8adc6174ca369ec31b4f944a6b74231d09254fde6b2bfe3416f3c6096ad0000000000ffffffff03c4f1eef6176ce6a2114dce78dd292f6db20fdae7c534d22cbada58befad6cf0000000000ffffffff03c7b5bf7fef69ae11c467f68fb551d58424e8723d05ce3ccf88385187898a710000000000ffffffff03d5150f5295b1e817f44fa34cade950c13789c4129e98eb32634aaad2abe13e0000000000ffffffff03d8250c9557188c7672009c4b14f37f96528e3f9c6889607b2e25299efe08720000000000ffffffff03de1dc49d0146dcc0cdbeb84c68a14ecb7075aba67d6494a5c8d098147843640000000000ffffffff03df8c8392bc17eddab688530697c2c221420464eb643ca8edfd30d7371ed5460000000000ffffffff03ea1dbbe72e20229648695a9b01e09b6080fb1c4632931fb810c5bfbe4b4eed0000000000ffffffff03ebf599f34a7d2cfe7bda1722f76e3df5c7fe299fd5c6e4099cfec4f551f46b0000000000ffffffff03edf95bb2c93c07d734ee8b3b1de4d4085c6b65cdbc3ca23eceec0c4d2b29a00000000000ffffffff03fe259ab7c4c03447011200d7d5236f4b1eeffd075926b78650cf1a59d570590000000000ffffffff040f71baef9c5273ac67fcba44ab29456a820274654624255c27e53ff62fdf8e0000000000ffffffff042938cae95e712592060f872cca771dfcd0218562928311c81127c3170a57bc0000000000ffffffff043a09d788547db3d1bfd8512000f9ad8bb3caab6fc24fd186663542c9f06d750000000000ffffffff043fe8a5586d0309c8dad9277bfba04fb27e7a39d279c0c9a2232e2927874d470000000000ffffffff04426f1fb4981529c32ba5756f59a2211ee9d2b9cab2c5de06a07680e833c33c0000000000ffffffff04454fa62f2c03d785307982ae406224025343f19f183e0fdff83d8e1d4cc1500000000000ffffffff04496141484d641e3b0a661210b225df50221b13bcbcb3cb8c86786890c745db0000000000ffffffff045731a8be6bfab1f9d62d2b2158591029cae655fbde8c8bdee80f183e72ca4e0000000000ffffffff04610a21533b98d3360a6f2c65be5685a1bb3a43f67da08dc1674a0f517618990000000000ffffffff0471b7883558587879bd53e13694069d95acc0d809fd0a65125ba3acdcfd66900000000000ffffffff04729b78d9b706fcb20c9cbb49ec1baf5fa782ff44d45d9a23868bcbdcbca1330000000000ffffffff04747b056b7cdd34c9891845220c2b7227a7c7c4f90e1ced6f36fd2197b26af90000000000ffffffff047a37d63a2a17986896072c77fa2e068f6e593dc64bf2ad8e180fde729fe3250000000000ffffffff04875cf5c94486e6596beaffbd7d08cf5e3111df06a89f59d65989d1485949190000000000ffffffff048944d4aa4d42ae9e864bea755a4c934713c63ce1c61d177a1ef03fd679ee330000000000ffffffff0489d5c9638a3f689c232fc1b9b59e5f82bd2e720744c4405d6537d7931edb030000000000ffffffff04a206bfdb054b041ddca180111aad2abf7b31813e4551da3a29bfb16c03534c0000000000ffffffff04a5feab7629e0cd9569aa62ea70f7ab3fdd58d3aa9bf73e8f76ac32a949d31a0000000000ffffffff04a70237d798a0b48b5abf682b806f31ff425406d93e74cde1ab4b9939ce9bc20000000000ffffffff04acd550baa26049b3dc52fb9efef1cca0b8dfa228c64482440d7217a81e587a0000000000ffffffff04b1caf936f5746da6d683eb00ae36b885fd031a8928df91e3172b1ca17f4e520000000000ffffffff04c45bd25f17cc765d8a67ca80a801c1f1c2131eb51b7b8ceb71eb898582b0380000000000ffffffff04c99a8ab69a640f9891aff371876a9d0c9043cda0430cbd436145c5574c124b0000000000ffffffff04cc0c4723cf9952c0a51db275c9d11370a95f478de98dce603d09de8e3d8e680000000000ffffffff02c6afbe970400000000001976a914c055f905fe8d14a2766801307a418f1e03ba566e88ac5ee85e0d00000000000017a914f5916158e3e2c4551c1796708db8367207ed13bb8700000000000000005923aaa80d0000000018f6020000000000fd4301473044022044e60dc7ff9d720bdc8329f97c5b321a84e0846fed248b23d399d222a074bff402204aaab1ed5df1e4b94d627d8b06171df51140e65eb056536e91103b75d032cacf0147304402200fcc38b7bff890fbd390f4bd1057c72df74c2487a3cd20edee80a20d6b2ce02902200b7893fa29f24e09358b6777a946d40166bc71c25f8e5f850059a1914e25959401473044022006430580bc312023db40b6928ba0c39141a8a59bb0613c5f6feca1c1f9b2bce90220055ffd441357bc34c246024281a7b394c7ee6a2a3c013689d95a3b9dbbb98d9e014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000009503030000000000fd4501473044022059a8f1680e80b50cb8a9180c1fabe8a66e84b34fb6c10912715fa71a5bc0f9770220531c0836d4de61d8e291c517cda25919a8b822b80b5737068120411976e5577e01483045022100a48b720930c142235cc5585a97a11d20e73a81049791526cdcee34d36f92fcef02204d2523393dfc4ba21451fa563b08f53df7c7115b65a9f2f01fd578474d308eaa01483045022100a73d3ebefadefc6dd9c7041b32bf7a3a25e49afd41bb3251c502ae6fef89316102201652f9ee39ef09335f5c8e83b3fc7591b592ff0651c5e8c4786875710cb9d1bb014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000006113030000000000fd4501483045022100a5af3c72e2e15539caf81189fa020cd4b3ac5432c512dc48772d825dfca7c60802203ad5f3caaf54593b8068ce50db67111ac166c2efb73b52b30dfb7884682faadc0147304402207796a265903387a8a612cf47a8df0aae7c251a339590b24b6d813fb4cfb2dacc022076df8e67ec560d8fb74ec7ed0cd368a4da09c98846635c662e5484f5ac5b862101483045022100eb3318b340dd14f8fb797af81d8c1784668f082e54e58cd59c1224890d7f6c19022064ce22ff6bb93806930dd34dcbc846d38028db4d4d4b9c5527b6d493dba01cbd014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000099f2020000000000fd460148304502210081e68619898e8b0f9eadf2b5a324fdd7a684f935bf2cb72eef221e4310631ebc02206c7d5f1067d2980a95bfdf3b8530898ee94138dd99715c44e30b0894a5a6031b01483045022100f675ced0b828f2bae7a8046b41869ff865c081a79e32cbd400baa8ad99a975cb022075f347b57272df25c5d49c810af71fd1ba515b27166e61ad0c2bcbbd746a818101483045022100f271a0a0a8c5cfd149bf99411c4504d9905e6f9ce9f9787744c9593cab7f1c1b0220527057676ffcdd60caf0812b20b08b94ee1f935b44614b29bb9ab59e5bc0080c014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000001b02030000000000fd4401483045022100d068f2da5ba187b9d16b06dc87f1ff241063efaa786e07668abd06f8c2bea77e02206c541479ba49347104b386c36df7e14bc087bff7a17bd9c4096356a8c780fb2701473044022027336ad739d3ae08d1d136a9b7002a97873199d82abdd4bfd0531d62294116a9022001925305ccab8a328b873126baf7977b51154b4f0436685fc21f483ad347fb8b01473044022031a20fbdd66cf2a0d59ed37eda8ac50772c25adc62035b53ea675200fc85cc1c02204c1ab7d35c53ab9a5086fbcb669452367d68c8a3f07e47843c8fc2e2dbbbccc2014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000c7f9020000000000fd4301473044022022bfa36e676571479c3dff1d1a5a5c0cee3677b5ac45c14314d242bee32664270220736875bcd0807c93c3a542dbf98c753c7164ad6830acec833cc43e157eb665180147304402203c2d6ce11bff536cd9bd4f58a930649f708a5735a26971dfd8d4efa7748c48b302201e4c69309d99c41d1c19ee200fe23547f1972173f0954e8833b8ba8ecedb6aca0147304402200e9ac49f352071840f13104f247d1a506a637d898495ffcc4aec7743ca56a2e702203e279aea8208e3128dc27173a6cfbab2bd8c2bc8f273794028ac77a129d5cab7014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000005210030000000000fd4401483045022100d8e2743e7051807e428574f9c881781b40daf0ec572dcc30357350c48683fd84022032a131a11df9571b53284a2cdceb7668e7b6442897fbfd54dfc7e26f8a3a19130147304402207798db2d9031f37eca9788b63869a91b100abfff8ba9966c91c42636e43c56bc0220499af71936bfae1579f6ae8d88dd6ff980ae1dc4fa8d1c5585d08a6461ce1e1301473044022062d193f3c5f74685fbccdd8795515f67b88c8a9aac089591fdc07a8238cbf5390220200f0d61cf48c33f7800150c8af578107c20875846b4a0f2af2a4aff9d2b172e014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000dcfb020000000000fd4501483045022100e4711a4de4d6cb64e8cdaae2a4a5033c1ae87549c8d419b42b8170ee5217e04602202784ec57a6591083dbabaabd49dea7cddd3f8a32d9497e23d4b4219a56a9395f01483045022100fd776ca1d482c1d39e3a414bd0e6d353637ef626929ca5ee37db62e3dbe3501802202abe2e1279e5a354745fc5c8f8dcf367c616d82f91052925b1e2880f3906e7670147304402201976bceee0c3bb19da53e80a10a92dd6d135c86e581f349268f58b7d6b387bb5022042616ed8eee7f19ba7bee1fd5ae5415b521615aae99c45d56f9bde39d2577b9c014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000008f00030000000000fd4501483045022100fda77866c51a7ded28a6e12d3459e32b33401b1c0426f3c727ba4542ded40d1302205981be0eafc9b2c702038844769765df04bef8e17c80d1fef65c2bdba0a8e6ca01473044022018343c7eb59ef103fe102361f9ab8c789dadcfb3e60dc9b25b429165a9625af10220367f3f95f988ae6bc29c8a400687ffd70d009fe0b650994f48c1875620440fe501483045022100ac63791400e4ab5fee7f8c8ac602017409764dd7ef7ffc07d793298277661a2202200c3de5c22cad718ae83c101e987b66f31f62cc3364e8c8505407ebf11b392b66014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000006211030000000000fd4501473044022029a09ec85ea2c7741cdab03fb1185d94029a5511bbe830d11ac22dfa7f21f452022060d4039356c9cf06be106dc81390025735cde670de5c0a5a38e3946cca95211e01483045022100ca82755fa0c2a23e207c665099d102d13a393ace8cfabee79b1a6f97ffb001a2022014e2ef964e3fb5e90743c54e620d40d79ef111be1299d917f762c442d40c2f770148304502210094e9d5926748124f8c215fb006ec2bec55e4cf469a7f8579a339c08a267ed2540220323b0224d9964cd55b9ccc3f1dd919073d83edb293d022b00497b8681624bec3014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000b009030000000000fd4501483045022100a308d49610b603e9ff378fb40620f255216f3325aedc8d9a909f9c5e8983cd4e02205c93d14a43aa5d4cf7a3d4d483c6d47ccb8c2c4b78647e6cbe490ca6e03cfad601473044022004b8e60724ecba532e2677411e2617cbc49ba42cd4843423d724797aed8ba60f0220198d033cf732b5451d5ef00666ecd19bf4ea8a08f6c5fc16f4e153f1759021ba01483045022100e6217183d6869b431befccd5f4b12372028e7975640cebaeefd5f5172b871ad10220152db2015f3a8c16129f34e2488a4cf19a85f26956e3818f2cf76fdc9c43fd35014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000005805030000000000fd4401473044022011d6116b37d985ed52d59aa4fee1c67a44668f55d2db37fcecc3cf89245994a002202ecb47c384e42351995cfac7ee0fa8f55053dbaa11784a1890be84c164a5cdfd01483045022100922746c881c2becbadee3859902d93c9f623d1ccf3cdc0231d31e3ee806a1db90220715d1689faa159f4abe4959063e4dd8f108b4dae79167367843dc31e0fd46e97014730440220280556147f23f8cad1907869154a98b025baae29367cc80c6d23a3a0d3b6443e02207a62c31f1331459885ee236245d3e122013b77b304ed512914b05acd1886ce79014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000004bff020000000000fd45014730440220053f5cb6b633930fc7ccd1abd012292cee5b64d6d5c25220f9d9f22ab16d1df40220430e464f5823ee503616dfbfca55fdd01949cca336c8586f4e1de72ec3f3063201483045022100e16f4708245ca99bb01ab257f495d6a33b2db4ee9ee5089a6a2074ea9070d8f602201d3302d14c85f11b2f42af10e2ac31739f085036f26aa1723c3cfd2d4b35b2b501483045022100a0be245e53ce42f783481e3ff658c13ac850eda7ad21b8206bb48fa20fa2bc5d022072963db0ace1449652a083be585dc75574490248d1069c0a48f7f7a6902fddc2014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000001703030000000000fd4401473044022029960cfa720d3818d4d2d7a55fb1a68323e34678a2a8fa3e68505cd78184cf9d0220723861ca8cee7eaed1f503a9668d9866ccae44f15a3e9da77e4dd23679715e4201483045022100f3054837f1aa88101e983b28466b679fc43fac26c48d0359c4b881ed3cf8e73b02204f4579fffdb2a96fc82b0ede6bb5eab53a86b0bc04e1ea0fc1bae9953ff5a7f90147304402207e3132303406ca2924ad934d49e4027f52083638f08d73bed7138b6d267948ea022018720dc7f47cb13d3d37555c0abeca90cb00060ce1308a3de317d63da5d1f4f1014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000002f3020000000000fd4301473044022012cdbabc4d98705db72c8a6448d8b5e5483b404ce0ff26fad16b3751ccd667be022044bda8f743f51515281b41e7b7a0347e8d52e9aff07ad0c4c84486034b2257a201473044022021e2029bd87c699931a5eb4f997e56f1efe1dcc26a7fb8c8147a762bbea389ac02202ff5feed06720f5bba0c12107dca3d83c349a35c43256429b8f12eacc6b5df16014730440220269980cf3256b87c9ff83b29e3005b6af9c85c5a8fb7a501055b486bb51fe3e0022073196474be83c9cc24a843777835b97c4eca0ddf7956547f6cdc48a1cb42ddb3014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000030f9020000000000fd450147304402204442fa3cbc6d9ca9a217069f984e8fa1bda35a825d6bf39804c92faed97f2b8d02200976a8fa7653918fa23dc3adf15408d09a8069b033f4addb723a028f9928fbda01483045022100a36c038f7e49fea33c9f2a26a4d8e510095d42912ba1cabdd7da19ceccd2466802203b78e02c86e2fec18eea2ae2b94f1e6736dfa7a3453be9ee571c90832978509901483045022100af4a52bf94e8618d387c8f54feccdf0ef49b6b5503102cd405ab28c48c6597ea022031053ae17323c0fb24dc2cbd3107ca374279cac0b54c4a6633747effec83fc9c014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000006508030000000000fd440147304402206391486dc686a643c26e9b43038b2cb1b465ee6ba81ba9203d0d82f9550bd26602202ca9ebd53b20a6238c3d8abd4236b10d9ca304f5e5808db4d5004ab9ede10ad101483045022100e419233679a71a3380b662425657eca9ad26cb425a8aaaceb10de1847b3957ae02206780b4b428765f9bcee90443aaa497ade22fb813951205fd53c999f7ae27c168014730440220656dd7808be7db3a7e448608ccd3b8696cdefb687de8a4e37a58a2a0db8c714b022044683a0d0299b6eaed1ef4162d85f563aced9306d3e4a84961a301604234649d014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000cb13030000000000fd440147304402200ec0afc3a6b07063c61400fdd53e5419bb755bfcc99b1d6d2cf275b3f6848c75022036fa64742979454ce0c6b2e16963dca1d4509360cd35cb85fe533982a2ad9e690147304402206ca03acffd0198c7ea1d78e713eb45812dd0a296929bd679137dfe56f3f0601702201b9d6b25d85e86bc747b8c9d19a1a2329b02ca9de22a914419cec25bcd68e6fe01483045022100d22e473e19fda86e31314fedde03e1710f5de93efa284dab5f86817c99c9417602200bc43a59bee8a46bbc813ce52cdc76066903820af43d4caf173000543f672c6d014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000005efd020000000000fd440147304402205b7ef22035cfb0b11b62354d91f97910937de864369708e3e35376d4f620a1780220496aa95cdab061367e571568269afdc2d0a8fbb83b1bfd08c062d057041fada001483045022100db48444eda15deaab63bc6f3f5f31546d3b44a5a9412323445eb3e0853b440c80220201d7c95c47b5beed4a1139c27a79dbcd30f288ac106a208f43c61a0989f3e0801473044022040693ca2c95a33d5e8e7218b99a6df8507e9b8bf72014d19cae77d489b57b76102201883ef3c9df0b017e8fcf5b0af1bfbd61556d5bf347d77544e3bd263641fcd1c014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000046fb020000000000fd4301473044022005b50050f39f996b5f91e8e2c297e66521d5f72f2f4bec9993dbc44908f662be022001734f6df9a192f00e131fd8627b37b2afdbac8afafc38513b02c52ff305efad014730440220749ef2b72f235127bcc7c949f171ccfcc1ee87a9979543df9b568b323d9707260220440ae76846f8691bc471aa479e876a5fe01ce0e1f8311045cd8de1e7e58e4f890147304402201f5d4ea7f8fe9f08dac2020f4a2242645b27541b3cc591235fe927bfeed375a8022077627f400a799de27063ca0f2ea2d3ba5b8398bbac368a0501066097ad649e3a014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000009a09030000000000fd4501483045022100b83b84be0a0e613dd5e9dd7c6bec573a81bf95f83b546a4a717e3b708cc18bc802204bf97f877e03608103e30aeb9aab39c8f8d6e22cd9e89e66e7be74277bd7b7e201483045022100a9fe153e507bdebaf820f73e016ca8c7c61e3a07cfe7c79d74d674219c3aeb94022030abb047356650b8bb79d9eee45a9030c5cc55466568285e6d6f97cd6be577830147304402203da91297cb8e456b0089bbae43ad02d636f3f3777017c5b0224da4cf31ac5e5c022002a0ab0167395ee04f8e0f37fa261a80bff532c118a6f9fef229c5a9315115bb014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000cd0e030000000000fd4401473044022002012e7841bfd2dca62a5667f9bda8cc9b9e4ef86f8d0d6cca322b5bdb06a9b702206d5428e45ed0e18cb980b385cebc86eb6dcac59ee19f84afdc0c95ef0e782bfd01473044022073c34e5025fda812d8990f1f8cb16fbd4665554e8c467527b2c5c21132fbdf0b02206c22e854f2b704932e8134c46c40c738fc65939b2a516cceeafadd0c80f85efe01483045022100d808f0812a4a124c074166d87084bb3a38a6c632846a8ab4be7c69bda49b880702201a3625f5641c6a3a414196dc3b356f59b9bb8a44cd7623d601f28cb03691cd39014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000007fb020000000000fd4401483045022100e5357e2b20252b028d10d746c386959ba296630f08d94906a36251bf331073b102202c55e9e3a482e27326731821d25fa4c09103ec60c4cdced3f6774e6f1bc929970147304402202e58674ad455a4172f87439beaee82f59842d0c4565a88a358ebe8db35e2204702203cbffea9df59094f823f598cdb252927b1af451f522c8ca24d52274baa2c5f440147304402201a078f0959625258d4ef1bf7918b852bcf1629f8e79e2a95c1e6ffca017b7417022071dfe182e18f1debf0163e85ece438f1f3326e2eae39eab8d9c7a6cd8f179bd6014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000043fc020000000000fd450147304402201d697bdcd56006044872b398bac35b2c736f6bc22080ba7c81f5038de6a87a3702204c832224547a5bd89dbc5639e763dba74e3b35e77234078b425b7157b67f401e01483045022100bd54f0d2fdb584b15215e1eb8af08a2094f9ebabe0db8b01e107d0d6ca7c55f402204b1c9e9d368361903fe3cc99e48d045672818ae5ee15b3fc46e1c84049ed1c7a01483045022100e62ff90682934ec550ea89646de3a8d8bad4919bfd7d04a343aa490ca380d49d022046b3c4d8354661d6061798201cdec35744471b61bc55d83fa403d1aa6aa3b2b0014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000000cf6020000000000fd450147304402202d47018ec27c8d18a170cf22fa9f16df5da26c9ec85b5e7ab1220d7619d3bfb80220391bce1206a19b54496101317aa853f59fe8685f4ef1080525ec13149bfbe0e801483045022100ebab59d9714232e70788b14713364d8fa9c6284e0c2f173a3376521fffcdc80e0220624b5b801a7127e41c4378582026262e917a35c69ddb6fdf0de7ecaa26017904014830450221008905e07026703b5c1f6793fa9d749981369235d540fe0127be7b5d8cd18e401f022017b7e658adf3ad47487dc49c6aa8e88cc4d3b97f87ed0771299ef4026a8d8995014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aea4a2d10a00000000c506030000000000fd4401483045022100c73924d67aaa9977d5b85fbad560b5315d36a657a402913be2aa90a1d12300e2022048b79577559462b4fd8c348a0b4d98caa20cff2c8a0363eda46037fd11782432014730440220345499c9d88b6989f158f7f980fa6f78f0a4b57d70f159739bf631b788fdbd3702207340e0fb636061cd9b7de0723d196b5f406d24120cb84f1236e3873f6e2fd6540147304402203332474e7a96938334a32052a802abb131d7a5000fb8fe1b903ca2474217d514022022533f3d58829d55689671efa27901878cfb75b20f5c696bb00ef4fcabde125f014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000002afd020000000000fd4601483045022100e7e10b3fa44e3bac1a8a5baa89ee3f34f437a37572a111d75ebc323007220956022007332c4fa0a81b99711a87342f7e13e720d09122f6f8d91ba093346d17cacbbf01483045022100d8f075435a1f1e6b3352beb482e899b95ee611551a499539c0004d703588a4cc02201b339915bf5cc5b1f4ca95d507576e58dfe20b2a2a3f9e97adc37c8f1f2921b301483045022100a25df71a3f33e602652db2a3ea88a65522edaf1e05c0900c87ef7149dafa9ed80220300d23d4abf09c979ad36916da78de09656f4c38a4fdac72454a888babc3f22b014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000b90f030000000000fd4501483045022100b6240b6c0f35b38bfc074939789eb53550f6c570487245666cdb825c13b95fe002200789f35de73db6342d1a3fd381ae55f5e801e1d170e7c9672c8179ddb7c9738101483045022100fb1a47917fef805908d2e02ff317a685a9550e5edc0aa8ef8568282575d4f6c802204a6b7a54338332ccff52ba21310cb0dca6a6b97370f1a621566c9214e03b49d20147304402203ef5647f608b1e921ed139dc54bfaf5e5ac3d959b88f3dc7a2ade0729f62818002205df3b44fab36a105bcecbe1f6b2794f692e0fe65eaa6d78126279c52db2a438e014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000004b10030000000000fd450147304402204cdd0d63816bd37ceaf959d323788b35a629d6b167cb2337ac81c0adae1366450220271435beb70cd8a18ddbcf98356de296ec16847a7a3e1a7c36d400f332374af601483045022100842dbb08884f9834eae867feedfa0ed158175348ee671aca1b470a9c5a723ee202201b9c8ffb52dc70fde054f18ab5a0419b603880bba4c9dec47d46bafb25c061dc01483045022100848c18295767444c5e0670930a0e0436fad251964bd4884ff5671db1a3f19d76022016edbdb3e65f99cdede5e957a941f3f35889342818f6805e0126e715a335aefe014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000001402030000000000fd430147304402202b7fe153e0a3f19123f677cfde86578aa546f8a46550806758b053d0b45b89710220792803175b29dab2c6e8c751436b30213a3b409c8d7cb0299f29a69522b120880147304402204e67807d8a30c8358cec44173c7a0727f542b4dc131f9701f2555a27cc17b628022044487b404d9edc2e2e8f553ac874c5dc549d9b261694752759d101ec00cc44c10147304402206d537d0aa88752db936ee48e986afd68338411ff68797ee2f80ce537bbf41d9002201d276c24365b68d18ce4020792c5d9558c7134495af96bcc55721d795c7662c2014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aee854ed0a00000000f1fe020000000000fd4501483045022100a53176fb86d2190592abe80725917bfd5ab910b942d6f9648510e91730f3986b02205db19b272d2a2be3e315f2c9526a02c23f043c7b643128284faf734ce1d8930401483045022100be116b856b1f0ecac3c621c21a09d484a4bb86468a93e37f7c6d684c74c9031202205bcb65f89495e4575a1e5babb08cbd2aa21b200bbb9af1bd789b2a5b68c804f50147304402202a0dffdd955e6a5764e06113b5b712e789e956e7b6bcfaa225da8ef66e446c1b0220455f54d546976dd492b94f1693aa9d7e76dfffe3a7e861cec5f809fd5ac18caa014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000b305030000000000fd450148304502210098e4071de0540dd5d502e71a962803452695d3033ae1df83855e238197e2073e02202b825fb2190c784c050c375e1f520c0a2a85f9925fb43ffe58cdd25708e2877701483045022100892cb91af82982c870671e956805fa7aec721b82962311f4c51f959889ca8efc022051766e50a95d2ac480851b98f129889a4dd566c69b6ecda9654b3d4064aa40760147304402206ad1b9cd9af3c1e69ce32f42f1eb9ceab84e99b9f04cd14ab8842ad065a5589e022020b98e515e17d59e415d11b1be3e4fc34783d547200960ec96a4f67b6741aa58014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000018f8020000000000fd4501483045022100e500b89edaca4c2408069dd40b9645eec796f536ed10811016aceaaeba48b9b102201bc364c56b9647a7c6c53b235418a78c8d8faddf793bf3ffdbba41818b9a401601483045022100a9695d1776c81442dfc4931a960188be256f58c46ff546d1e872015c8ddf56a2022012443c230d3257b64bc8ee05d18269c211becf4b9ed3a5c7a3b63e2e216dabd8014730440220073a21f37e0d3cf9d706dde6e4fc2232395f4bf1982785ed04c61b1144f7c00f02202c7b18f4893413590bb4fb139896826bba6fc3e1205fa43fae30d8e7cce48edc014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000fe08030000000000fd4401483045022100ed3f9d7fedec8c9f8bbf1afb2b7b1edb3e4e8b9dfaf789f1effe19a32dea4728022046cba3fe18f0c1107d3fe2436d037aa8fee47e830cef788fa86541c84ac02a490147304402207326ffc63de54f4554f56a7da2072cb4bf89479bbdcf22d00169f4c3d7054a5c0220717c3c86a5470ad7f7a4900cc13e05a0a929ecc00e3ad58ac5850508ebcf7a6a01473044022052cfcc5fcd981d38c150af8897bbad4541a8aa2742d31369bf0c37c4670ec5eb02206031643bea000d5d33e180a75627cfa7bacd9eedc0926eaec773e529255c6262014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aea4a2d10a00000000e001030000000000fd450147304402206c7e38bf498a7ff831513413e5bf283b93fa456993162fb698a88933e1451fa60220669d5f75d9817f3ec08607f4b3b0ffc3f4190b5f7cbfa3336f1b64dac28178f001483045022100d8a58946dc73974ead5766e023a11eb2f32d3b7d7e482ff92255137fa6aede21022040c02e902a208a25b10296ee0a5466c6a8ce211ae2a6e2b7a541d2ea69fa4fbb014830450221009bafaf344ef873797281daf907d4e1171d8220e47bac5888e5cc72f3e219ef85022029773c52b7785abb77d72c22fbda1f9cc2a8536ccca43ec756bc9655ce6a9a84014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000980a030000000000fd45014830450221009be858cd5d4a8bce15d433d040be529a38cf38d9358919a9c04a1ca26127e3e402203de44aed9159f37e4b04ca449621d82040eab2528e2cdb7539708574899175c80147304402207271dd94d087a7b2174f3c3ccea7b92e29c84c6471224269f30faea34f2b77bb022000c9e94e92ea9f311d7a6260a2283f879115eb84d319d0da3cdb724b2b66da890148304502210093397c395481625411641fec29b5f8c37b4163e6bf886843080082f14dc716c402202f1b776d07f69ac148ec36a257ed43a2a016cc3257b091f1180bdffe9fb8fd39014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aee854ed0a0000000047f3020000000000fd4401483045022100e59a2bba52457cd3a884568aefb50a2500309e0262243553b31da735cd281d1402201c238950f19cff6cecb3e75a7308c6a0e9addb39001b36e12454575dd695ef07014730440220679cb79f57fdabea76ea42e3f145aea59f3cfd4401c4c5b1693b2ba03a2054b202205e3e2accd4d889e6fe4ce0a4ee8d6618dc79aa1f3b2d3bfb664d83d25d6562b501473044022043b80b0e55ea34ff22377a57c4633c1c5fdb57d53d04176c1673cc67e56d63a802207081bacf923edaa05c4848a11fbac160eaf3a33bb495c26361f85f3ff1fc482b014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000be08030000000000fd4601483045022100ebac21191cfac6123e0a66e7c6af7febc1a1ce2e63c4e6fa1e4f75d6d2f39dab02203d592a16f40f8c8c88817d0788457d66bdb35dde14b02b90c7c353d040d4af9101483045022100827b7e2ef669a5d1407b98562a4cd45f302f6e2489c1bef3b8bdc6a0592bd922022036fd1961511848f84c9e8c633044033501091c5e756e28a4787846156cb00f9201483045022100e330508c7b1072b3644bdaab4a6219a7cd7ddd364ec0729534385e2e6e7fdf5502200dfa2bc091014c8cc134728c60c40f21f737203e5c5c04740fbea54bba8eed04014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000f5f2020000000000fd45014830450221009db0475dc62ee80b8b49bac4d0138de52f985642f5ac40b75f46b643e4115767022042a464c53ebf57bfcefa05634ceb14e7669b86e94bea517c68e2264d676c70f80147304402205e563709bdcb24975892a67eddf3958a31d3a58471c6c0e0cb6891be80b9eeb802203c69bdf9042af7429f1555cba2180108834b3d3b139514274fe5c30aeb9f054901483045022100f792db494bef64ca96ec49891434bd33f511db09d214a3ac323343d758e2d3c702203a86fd817a81cb84610fb948d6b3ec7f4d4fed24da15ae9ee245606c4f5c42ab014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000bef8020000000000fd4501483045022100ca7a5b358614ba7615381667ed1d6ee7b2332d520caa6c5c6c1b4aab12fc4bd9022062990a8aef2fa44dc073cafaa2f3e95c3534ee075ba998beb716756f985b8f4601483045022100eb982763c3fdacf7bb59642df124f090cc5e55287b28c206a47c8a3ec8f08add0220668510362e0da663f117235f3aacdfa7fce13abfdd2c54425cf63d1b32c0b56d014730440220447bb198dc7466bfcf815e6b91e2431b970f6eba34a02260c224e503622e126902207c8fd1e1bdd32def46f7442df011f58a561b04477b372da26888c2a38d2bbb53014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000580a030000000000fd45014730440220702dd862dda92c7b3b214909a1f9dab7653a2f9103b7a62d6646d02c651b34e7022022e3c90cbf41c1fa2a5aa89ee139eee2e656a640947e8431c63c54e1e944763501483045022100f0781151a884d97b3de74df629265914f8d0253581e789a2eb511ef76568a4d602200f33782718c74ed75c25d66426f2037690d0ef3734fd06017bbd65d992b68bbe014830450221009d56003be4df82e009e4584088807d5f4a4322151865681dd04645c63b7a5a010220584ade2f5b18756f6c3cec7dd391cd174fa9103c747c8ea0d0fdf6877a4fc882014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000006407030000000000fd440147304402205d00ab5aa7656681bcde46fb484802c2a304249dddee6555e680067577805f2b02207541b235dbef5e123e7b392c63497ea074c26f08d004e766a7711dca4e2696ec01483045022100fed3c2fa5de22702bfb31075897e03b433fa593ae0fb80794103566c490a595102203f5b01c8e7296be4e2f1a836b9be4d073bd2378816ed09baf416188d9b25c3b00147304402202cc6e2988cf32e02b25b2a2d853a507857ff6eac50427c4def421f20aa36e9cc02201313060f0fedb86d1dc00b41b437705fae3e5e3df23b254a2343afde89e17ee9014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000074f3020000000000fd44014730440220681a9e9bcbffa35a8328fbbdb173d803042ab1a858c4ca9ed0e4f5a67d453c8e02205820f9fcbb4414d41c28e3509806443a869168cd1e17b428549ec2495161f5180147304402201339021529c4f6eb6dd22b56752ad5b2df7e1e8d978439c9578f0e907974711002202c63c6b1386bea4536364610c38ac0994ae863f9f35bef25850d6173901f794701483045022100bb021e7846352c38f3fd4fd21179b448a8d34295de73fa41c57a5f972e91c355022008f06f8bd66571e4027556cfa9124b4e1e518a9e82470261db3f0a3972efbcb6014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000e1f8020000000000fd4601483045022100f30681d06bbe18241bfeeb7cdd484bfb44efcd579f2c2e2ae53cdb68fa5032e202200d96812f571f9d8e8fa0756e351c7a779c46cf4ac62a6825f14a5020b771988c01483045022100996344d3a16c60b94789cd5ae4d3cfd8f0b660520c8e7602e0f8a7aae705b127022008d6d5577a2b90e2462bbccb88c79cfa2936d001e1b14ea530261235460c0778014830450221009a64402bdfdaaa64d429576b0c77601e8da643dab7437e8cfd27db5a56c05d2002202d263058b96116381e1879ad483c664341174f341537665c1ba7b8a33e378e75014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000086f9020000000000fd46014830450221009b8535b0fbf8f854787cd30b5109010183dae5807fa34e66e15cd6066dcb6b2502200783da464daec7780b546c0b6a4c274afe5f4698987820d36d6f9d5798ba2b7b01483045022100ccf647bcc6a89c6cca668aa5d4cb8577b8b1ebde8caf476c4270d96c631f6b8b022072e9d434ae2130352841477494a39168fda21ba51af04f372416a12b2a3eeb3601483045022100b71cf0b31f05baf22586a01f0e1869e8a37c9fb50e1470c6d82f0e8c7e709bff022050bb9d7638620264be1f8d69a477be454dd753beaf0ad6dd92f3d996f62910ac014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000007e08030000000000fd44014730440220563b7ed04dfec4aa05efd0911b384ae4995b1ec21be2572013f924268db89c9902205b3c939ecf522cfcd9d4678bcbfe23a31a3fab94043725be1d1e0c2a1ac6faf001483045022100bcfa16f8de773f97dbf9dcab27ead17ac1b3bfaeb16733d1bc355380595730a7022000d0125f418f48606a41c8b6f3e7dbcc21fd45f8c64be25513d58f56a0cbb0bc01473044022038b52dabadc8e617c7efaea42019fb8732a1bec5fa7a696c4c050b36968b637f02205b0bb3befba6a9fad35b34b99280523ebc37c20ba2eb9996d91c3f25a8d2a933014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000001c0b030000000000fd4601483045022100df6c07633b6669c8a73e33a004924e1a1e488329a165bf73871a6153cd222b9b0220240131a2687dcb6ce091ddb241d9e533362b29e351a7e181180b09a6c395a3e301483045022100884e519da7405180a348e67a6f9065d6a28520168924cebdc291f00aa28901e402204ff72a4d9bdb0f4fe667eeb0ef658a0414fe978c71193649235251ec99e0ea1d01483045022100c54d7fc08cca52150fe97c943e8d174306f125a459f3e71b489e7d497cea63270220101d71cd023d9131e98a1630a1566ba445b8e006aed4171d09f859aedbfb010a014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000befa020000000000fd4401483045022100e1c1a88390bc698025e6e40d1005a028e02f48f4708a2d8adb6b388e8ff83c33022013afc0b581e7b70d7f515d32bb1c7da68ff84dd741dbfb35855213467fc04cd30147304402205775454f05bf5fdd98df0d27b91eeb68955477768b9f50015f41a79b6f55b67002206861d59d11023c98d3a8df4edbc30a6008f615624fb18bc7d09c76d91f3abace01473044022055e4148ace2edcef6fd14e2aa7524ba7cdc397eaa025d2decfe8dff9ef93cfd402203cbdf55e08018990bcea1255149f31661fd568f1542c3c34ad9865161382a845014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000005507030000000000fd4501483045022100db1d65c4c10c62a9a727e8702730347528a810c18734666efbb8a9fb372d553c02205e3c8dee1c43ada5aab36e5e91291129dc06bca5dbcb2f72b143e98bbf8b506a01483045022100c824496528cf45264250c975ad4926e216c51a757aafe4d374b43d20fc3f108802205f3555d6c1c819be780e0fdb0b73e90727a9ffd86620c2eae6e71dba4bbb696001473044022045e218224cb0e51b36a8fedba5309d4bd0e0f3b3c89eaca58c1100a658f5370702202aefbb0c45f6044af9e8f873909e122f317c0d70872374308b6a4506ca4918fe014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000ba10030000000000fd4501483045022100a5ad7fa4026ee61e4c1e390a9d7cad33e7a23c8e84eac552ed5bd226350f2cec0220053a68add02401a90cbe70dd3ca95e02f7f3fa9c7554c9b85eb2ef9dbd7570d3014730440220458d2a918740dd329e7d3cfdb2035251503a472138b9ab19f18361ba1c05c40e0220523a8a265bbab021a019d54934bbccf0d7070342acf3ddbfb4c4d85671b34fcb01483045022100f8a7da4ff094abe375185b727847cbcf4dfb9edc7aa2c7d067153c6e4f59a479022001e0b4d4b71c818e3790accac1fcc7ab94c7949c9942224ab8146f31fe5b1fd8014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000003d0b030000000000fd44014830450221009ff8642e68b10e870a62eef426786fd90385f27ad7aeb2ed86313ef5572cf69202206ae5e31a87ee7537329c5a791ad06666797542d0d53e5e803565c46e850fdbe10147304402206477af187868ba99a2fd16ef32c5718e0710e497cf3b63c8d0451fc91aa2973e0220756a79e9d3c7ab5478caaa194c620ef6c5cb051105cd8d5906d2234226bf17420147304402200b6bec9b2956c32bdc2d39dd77790ee8469253cbed7ae4b1006eea6786bff7ab02207fde3b16eb595c5cbe2c022907f157a64a5d8dde2ce2a354228f6bf447a7b874014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aea4a2d10a00000000f301030000000000fd4601483045022100b927e3f030945624fb57a1c78083dd5ecbd16bee095f1427fee2dcd8fe3571b4022059fae4cbe0bea4848e4d1e398f4d2aa4b2a17614fdbad4f1448a920cf73e189001483045022100f7fff756ed604f5239b0312d195e67880242c4090d92df66c2ee925c88acad9e02201aa1785336c8bdb7c604ba39809d889fcf5ee8eb63c90f4a04fe2726c58418fa01483045022100bda45c1641278939fa116163fbefbe1977628506882f873768a3c478739727d802200498f9e44d1e820ebc8e5d77e961aaf889bb72935b9274085fed3fa15f77e2f2014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000078f7020000000000fd440147304402207d4a786eaf1b2a169916850e5452c4e220b790fb3f2ad669a75aa54aed1a469c02205bce95b79ea705713d6c78fed676d2f0a0af31e4716b3d91f4f3722ac571357a01483045022100e5aa71c4430cc8acbec03d7a666c90e675df226bfd9e64f36e72da3fa3615a1c022038b8e99f6a16de52780723ee3f2b72ecd193002222df75db1035629ecce2a03b014730440220097f37a7c2996aa2e49aa2f36dc1669912a4cf2e5dd092751ed9df53188e078c0220676faaa01133f821bb044cf2d6f50a459c25c4b19eaf0145b4430967db73b01d014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aee854ed0a00000000dcfd020000000000fd4501483045022100e60da48ef5ba5b29ab98cbe2ef99ff0a2bc92cd85024e49e5ca3597f12bcf300022048e6b0090e5c8057477dd7eb3789ae0b8fbdf5362421eda08c76d859ad7b544b01483045022100b4cdbbd212bbda1f70d6793d9956039d7edaa8fd70bfea7fb6a04bed7319e3780220425f48e5b29e7452107e19fddaec28e5846e04a2df14b80fc143bfd71e6266df014730440220279c65bad108d0007d821385aaad55ecad775a436de2b4e32988815020764847022067a86c7c33ece430d743102f84a9c48b29b9de9da821b6666929b13fb34e96e0014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000000f8020000000000fd4501483045022100e0d21364935dc638b62cc87e9a198a47afaa348143c28c35e3c1d4424bdf4121022008bd790132b5f6192ea6187f5cb5a9ffc6435eff720357382739d1a961fd9d890147304402203aab999b99e7753f39e2ef8d450241b911f6ffc4d9e858ca6743b2a5b7ff236802206344c728587b60b56672c4ada3fa58778cf4905697d46d026e1019eba70d1e3d014830450221009525cca77d25075ea465237b5259c3227c2924507e74851db33a71d6434a90fa02207fad277b64c89ade6a42a682f049b462e8257be13ee27cd16145b52bf60847ec014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000004ef5020000000000fd430147304402205879477cf645049300fbcb532853fd3672c4f00ebe8866df4479feec600e4217022021e95feaf3015d9d03fe78b3a0b5b61003e4182709aa7db198a050d9ca6d54be0147304402202df5b7711a3ca99433ca9a6bc6894e95ee4f1c5c94811f771e22fc7eba8514ed02206a2763d0ccd7a641d2bbca36110a4d0972bf5ab2e4660306bf8af866117759670147304402202a22e0d36d9f55d479414abfdba71a933083f44704997d0eeafca51a3dd8d37802201a4ec8031ee9325834f31805fa8bd50e5f9fa165b965f2027500ef0ee0b8138d014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453aea4a2d10a000000004412030000000000fd43014730440220221ca9f2149986b521ded423d8bf044b33502c128d5820c7ef6ea240a5bac8cb0220567cfd17e603a28a961f2a2ee88443ae709f5fab0d3cea9aa6232f5ea2570e000147304402202e38267764d91a348d25b328c11ad05323228bb3769334527418cc83df6815b7022072d856c6d2d45b1947f99e9c8e695da78c97e956eec9d75e2ac2f7cb450ae4240147304402202baa2f128838ad113ebdd95bd16db144ccd1f29be98fe435f145e7ca954c44b40220279934a60ff066f77c05031d6624cd1c7de4e120835162a2d43021526ad84bd1014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000006c0a030000000000fd4601483045022100c858877b7ebab9df2f7b0681239c92e6c03e95d963e42a075fad8c452e045b3a02202e04bbef330e7fbec49a7ba9859a6cadfd61830ab858362a2a695ad4db84ec8c014830450221009139aef771bb21f6ccd0b357d5e62f0991f98e67039b4ef146ca74c7a95883a00220268ea8e98573e4199ddaa75d2bb08f6b694af8bd383614f59e8699eacd7850be014830450221009694018de0f453d6732941e22309064ef42127d412ad135808acd9031e058fbd02202b4d893c63a553fe2401c983d4ab5a2f1ae9d411c195470be7d895ea4284b86f014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000ed10030000000000fd450147304402204a295e4d135f4f6421bea46bdd97d452b23b262408d77fe38c1f090f5f88651f02206f79e3a47f198091c92cf5733f9ab0acb3347e21f1d66ebc53e01db3dbd6845701483045022100a606efb31d0eb4cc4112721878cc3bf2fd0fa2b2cd3337a98cd3304e0cd2e38c02204b6117547daae39c06d7477c8f5e9e0e0d767007326df7b027cf80ec36282af1014830450221009d3a3360ead284b47ccc8a13eb1ad8de55563dbc5ff0a98744fde8947ff5484202203c350ab88bd4650aaa762bb1379022abedfd9316e9771e3c516190d07fce0349014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000be09030000000000fd4501483045022100bc76c0450c83c1a704cebf734d36f64e1ecdc76fdc1cd6e5f7986caab2d1dea902206bd1907f48bde52c8761bea4b7cbb848b2331ea58e6fbe683ecf2d60990001400147304402203287582617de76c70e8f73fba20100471cd40b4d6cff4b883a9ed88922c96dde02206e36f90628e7822206d93fb668e759ed62d6b73d3ecde935187d239c84d296a401483045022100957d7302576e215c6e97eeab33854a139f88839377eaf10edd1f80d7567ed5e102204452ec2dd7f273d586d7ca83f80c554c73531ec689bd961b524c2d0f2b16049e014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000fa10030000000000fd4501483045022100abeb8758b4ccf148e91c24c43b46c34330210bfa56eda2afa91c64f496215b21022046c5ac2cdb04ff964369cc6137b8c6b1133422640769d9f7bcd66cc45bea71b501483045022100901da0b92045f0c0195447fd2ef83b9cd6944e75e685e38a6ebafb16a03087a0022031f2261fa0f6486d000daa590875596ddd40fe99e943ee9d6bb8bd9129b0f90801473044022021e942e7c2e562631492f4c7bdab659af69efec054e5cf8432b9cca6e2b35579022051ce1c6da198abca7414783ef73e9119d6a345a0f0f989c53d74fb506c5c8fc8014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000850a030000000000fd44014730440220132a4fcc7f1a8f6f3fe4cd9ccb32fe3433a4e450f8594424e2389368f6a7203b0220075d01f8b9ed12b416d1d04cb9e95ceccfeeb420fb49720b4a3f0d1404be2f390147304402203707b8551104cac7c862aab1a2f730208f8ecee7180ac474b409be4c6af73fe0022023e293d0368a43397a93928d61586bc41c6c7bb1793b2bd2639ba8520014783a01483045022100d4504304bfa64c675045ffedf26e9b85a3ab839df273d93e2b1b9ff12338c7c50220080f395e7663fb9539181eee186a6960d69319333cbeb4fd5d596226c7cafa34014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000066f7020000000000fd44014730440220048efe6d5dd87a48a1deba890723e0e568ba8fe0112d29537237e0a1ea1c38070220197fda66031d9df627b79538eb4de824b9b49d94fab8aed185674ea4beac7bb901473044022006bc3ef529905db1a6729c0c8755267f63b3de05a0e1df68f9a2a983596e780e0220017582ffba0935ae9c8739bd6be3d21f9aec531ebe36e12073a5ee985df0110a01483045022100ef338afebdcddc9f46ac98ae9d9f936e44241cc46584096980690174b223da3b022062e0cbe00bc6ee9588ddf92e3c9c74f55632743d3d43dba4e43747fb380a4727014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000003901030000000000fd4601483045022100b21b940e774245ff2cbd5e797973a36ae61bd59c5a24081e73894f5823150d4202207c90190110b9607b151db47b81e7008b3fbf18ab952f83cae3189e4324a21709014830450221008949ea570a61d78294fbe8c2453a211e152b0b2190078b3cb085ef58fa2d47de02206dcede7043213254f01ed0e4b73d1f5d4550ac5fdcb815972b788edd1dc626b901483045022100f8b59f01836c28cbde52114bc8bebf8ece08f45ffe1660266e0dcdc187687bed02200b59ef8ca9b9a4d8d9c937014ac9bf66b7638101c89f10549cb28ee2bd7ce63f014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000004313030000000000fd440147304402205cfc98a5c55837d45207a22a7e20b646d0805a4d35e4bd10b2bbf3fff6ec0f1502207df92aa9d79c5eca866ddc95c446c774947a824e0901361dd42073f277212b66014830450221008845063e4b5c6387f1333d76010493b23d79d47f19b227b659daf8c12369e87a02203b7002cdd2ebf3974be41a5c0dd6ed267cad19b2fdd0526260e52a738bba2de4014730440220575a271b955e464d335bb32cece0813fc730be1c98f3b41d70739e9457c8b6d602206dba0e5fb0f0b3465736cfed2bab04e8f7defbb9f11c35cf1601b95fdaaa8829014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000a8f6020000000000fd45014830450221009cb6793416713945a3b6b08e10139d5c58f3ad21ba52f45913bbeb33d8ce1f5d02202e550c9d430adfaa81b4c9f6f27c2de234dfdf3936c5ad8a3beead34a8a62fde01483045022100807dfe6e8df9e514b6850f94c04efae0e927466c88bae4985d1f5a8014a5504302205265e75bb3d7b2ecbed322b35e998d904a2e4f2a44d5906807ed06566dbf14320147304402204a629c423c8ddb65ebfd05dccc9510aa3e8119b02d73e5997d559b7f9ad6a87d022029190b7200278ad005bf2f1a7aed9c864f9733ac3ec5bd7102ab18de6f44cd17014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000a6f5020000000000fd450148304502210094ef0e131bead508301ecf03a7ffa18ec9263bc3666450d2bddcfa752107310002207b8cac555f7a132aa98e41d2feff833fed68752601d0f84031eb870307630a480147304402203dffac6f1e5b22325cf2ff59a98665a827852a36225bb7db58c013022ce037cf0220502c495cfae8edbd53ca9e8b6b9bb4efbd1278966fd9156297959696d445c06f01483045022100f9d9f9b2058abc9aeb02bcebf6f5b22faaa6356ca640550b3c20744cbdee77fb022051c28736be4150081d5aef3e2253a5ce9d3ab9c4578beb398561029be530ebf3014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000003307030000000000fd44014730440220521bdce46b83ae123bcc4f0a008d2bd5cf76e76e0f98f21e029cdb2d0a4f868d02201d3abecb1216d4b41e6c6b23ad87feb8f7ba7735508a4f33d701289f736f366d0147304402203d15fd7c4c578a8acc93a1ec867199efec7f3cd532adf75e9a689af0a2b9399d0220598e77fbdb195843a2699c3464bbb5ccc55e608ec06fb2723c449469766d212c01483045022100e82cc5d9dde9a9086518ec2c18fa867ebb46112e37d65d9f34d88ac741996c95022053e900ac59bb0a391677ea209611b858a89540e59d66056852f8bf23fe5670d6014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000007eff020000000000fd4401483045022100d71d8a50ea69c55f7fd08defa76bf1b4da053e3575544b0471c461bf5aef137902207fd9f81b4a551bb7afa8dd1b69a0f6b1f2c4e24aa93c992fa82f82471aa8f72701473044022047ab50ee3683939bfef7410135d6b8de00f9405ca5f2faf22979df74bd4ce974022077f23743ab8ae449862ffd48caf40cbac62fdad49e005b7212852d085e82ee020147304402202e98296f1568f3b1fae805d2d6bc6fccd59bf4c5d6f1565b644d142297d7c40902207abe8a1988115e0ab88180cf90821005e645d97ce360d372f2f329fe2a284f76014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000008604030000000000fd4601483045022100d0befa3dba35057e2ef9b8b6d873dbe983166816ceb84eb875b346ce720a6b33022018d3acee74afd13496e6f1c06e7802d7813ad42a890be8a83280dc06ea23941c01483045022100822d27a60f0e4a8c37acfaadbb0be6d49c0981613610fa63c1f162d24e79e4500220316448804078b2df0d126fb9ec97dc1584ca84567332aa3dc2acab6f573856b0014830450221008fd2b5a6421611baaa3deb3739720dfec37f5cf95f93aff572dd92dca8925fa202205d2b99181fc69d7a46c7c58367a3927b1f6fdcf136142cf85f250837fe643454014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000180c030000000000fd44014830450221009c3ccf4b91b6e425a70216bafbcd277682da8bdbdff336b6f58cb97dfc3204cb022058f650ea3ad9d26b2c66f17cacdd10bee5446caa1ee34145061c227a56620225014730440220092afde83e1995e9964b85224dfc4a3782df00a0f982eb4ad3b38d083428149b02207669684a16f7af5563fe061874c80d9e35e745abbaf7396c7f71267f50fe52010147304402202858c626b1245cdfceefa6440e0c0ca838c10d6114098fca6df76559577de29302203fac70696457e9bfec335fa3a892ec3a2161a34c5bdec4a375d63f76a8d51fbe014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000066f4020000000000fd440147304402202397ebef3e1c8008050009f306560d15c5395fa07fae571fb55910749c3fb321022044acc8eab9dc7e1a9b4ab2cb167d0f944398a0b5e2c4d6e007f6f64779ab011301483045022100f4da2295f9558216c77cd9a0c56e0afc84e3ff1e6ec6b286ea5d7ab5a9f0b4b9022047d7353598ee12ea23234fa4fcdc05d7f9930f276cf4ecee76d128fe148596700147304402205216b5502fa0f62c6d5c9844f7b29ada8cda0fdce7d4dbacf8466adffb0eb6680220735d293adb02fb781f1cc02f9d1ef5a64c9436a95b4fc111dc0d69525ebadb03014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000004e09030000000000fd4501483045022100972f0d3af3ad98263fb8f500d6dc9bc75a589148b712ac0c7f95c78feb5a516102207316e12601bfb099b54075e67563a09df9e023094411ad19cbb5850a3778f067014830450221008ef3b3fc80b147b0ec47663d8756ee4d59e6ebbfd53a6d8629d1f30e9d17b70c02206583b2dd5b4f25d219e05da7fc34203ef667e0d49530e6211827f9f3041d3092014730440220088d12eb6a4424bb67b1aa85b8854cec0a959a62ee26e825a64bdc69c5e1219602206912f9adc20c5fe9f46ec852a6f433f276d1480f6a495a7984cf676a925a4f02014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000d80b030000000000fd4401473044022061236f509bf2232223af7219d64a2064dc4c12de828d46a1313b8f97b8a1b73b022043e93a6c2884668dc499ef67e370a6d736318ad39708183d2a702945a53e7cb2014830450221008e6deec7ff876824ee0f5a61f874eb5c303edd2717f5ca866afac208d591cb1502202fef21def83459e46dcb60387fa6ecac65adaf2ebec8d1c4bad92d1b0a928dda014730440220298c9412d02c1c39acfcb9dffa66cb5745904dae9d5f619b29d909cb9d6538ea02201dd6ca43c5fbe2038b6c347ce4e6a35e6d3e6f9703647661f0aa941cfd6136bc014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000b70c030000000000fd4501483045022100ed44d291e5e7c67d7817a0c1efead142048af4b2925df521f5ee011a6bbb797c0220268bc28e0b7f3cefd25b765801d25bc6de760361d5efc4ff4cc37721f191770c0147304402203425355cf89de0872aac696e9a54e1eb47d71b67a878b4291e505f5358b4c8f102205b7bf0aecb2c022fb93d72512fe820b1f9c0f396a80a75dbc72517d41006e12001483045022100b73867e6de73cf880d7eaa7a70f74685284ea52f3fae71eca4e8905d88367248022033f60a882ec544e5607201602229ddc7508c39ec25de2ee9e18e0bffc8f1130f014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000dcfe020000000000fd4501483045022100e565de2989fb12d59dceb8717fa7efe1d430031701a178e93a860b6e7c593b5302207a2c8ee53cc8deceb79e959fdbe72f7fc30e97e51652ee6043687a9f68e24eee01473044022035da650da8f643511b343b3314aab45635f5c7a70d09a34eccf208ee8c0285a602206d3125eeb0ba309c14dbac2a67fc807f8e805d210e8b4d36966ca67e80e8c5a001483045022100d2336814da44438d4e6792dec2ed9017ffe295dff7877a326eda47e76bfa587302200e5ddfdf57537fb32b0ff333744c4a426488b8199923de93691e138e7a00928a014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000ca0e030000000000fd440148304502210085f57e21fb1cd388db4e5c62353dc7f520eab422f3d7ef8624552d1385199ce502206565aa1221fc512ae6236bafc08cb8157d774e1d499ebbbe712c10032f5aaf1601473044022047a029d05cfc8da77b76625abb93ee65fa4ffd23672a7d0348e45c145cba13050220740e4bb703957e56da185bfcaece5e4d3cc602271201dadb2d5afb5475c96283014730440220573c5fd3b203915a057765b361f08082e2d891e57bcd010ecaf6e8d307358b54022018848d5a770f33d667e792853f454359d1bf1c1c846dd00ee3cb3296602dd5b8014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d000000000bf8020000000000fd450147304402203b89df3d311981d4918681f0ee17a629ea632592342085cf1c1794f75626b7d00220141f2bb0d18b5f07d5549d279437c82319ba23b5e23d8b37ee217150331fe05f01483045022100a5b0d516a0457646836b850c195c8389b2747abbf747a557e96059190ad1e38302202ab7e8d5001290350544299dc3556e9abb9da2e8f91dd2ce3b00fa0c718cdec601483045022100f7f5b03dd0f3d6a7edf18847427ac60fb49cb626b074cae1ea95f233960a0729022000aff8e788a856b194effca3a08594ce28d97138143f0b205556886b4a098fec014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000008705030000000000fd4501483045022100c9728ad82c64ab5d548752adf590654a58eb4bfaba85f1f504b57708abc3eb5902204c36886103e1aa4da4c96bb52182710806b25b9b18310d4b9eb574027eddb3100147304402205017577d2e107371b7c8bd17bc15e128e4e1186cef93ed260d6f54947e94382602200ef247802da72844a33163e6d12136027538c6855ff5761aa5ffc65fda7c810a01483045022100b56e938da3ea2ae0248afa7f6be5e8f7ddb81cd3c82e16a41919864482c28ca102202eeb3e20e95448e46c340736d980fc1b75d860264edb814f01e0e430521f51d4014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000004203030000000000fd4501473044022032a1358398cad98c16a8829ffc75fc7b44f77b93d5627dc717b66a44b59dff7102207b0472f44654abdfe1a24eda879f28838bd5184dfba238fb1b3d4ed0adba15a7014830450221008cbaf2f1616afd756d773443a52e55acafdf5202c7cecc5d0775d681de0e903902201218f989b0300a0d75672676a20c3136ef671f5a4c52ea34213eed22b3ee382401483045022100bb7ccc2f7822a511aac2104ef57e34a04c37f3e09bcff1bc779df446a0840d020220789dece4f3172564a56b6001dfddfc1b79e41ab6d156a40f020bb5dde18877a6014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d0000000054fc020000000000fd4401473044022021c6612e0d9d3a57628d54fdfb7ee9756d41ad3247c8c460c499164b6ced3fb302206cb072bf1b753b8ff407b767160acf074f6f34286f4caf3ab5061fb4c980fd270147304402203b4f06ae4d5314e5dd95341c9668b16bc4a71efa1ea4bda2403d2be25e9baf8e02200f09352867d755d614bdb6af4cf22211c93c420fec4fa6fcdacae32b11d1036a01483045022100efd849b2c87782427ce6241c9cb87c60eb0202c12d1ce5f2306b25e857aa8f8d02202eac2b493b0be06093bd4c35d111fb5bdcf24d5795449ebdcbbf234237ecb837014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae23aaa80d00000000c2f3020000000000fd450147304402202649f1955b9a482cab0eef5bde264adf912f5c9351c5d9c10ebd74a7b41dda4602205675c9cfb36ad8ed29e7d431bb7b362e001e999b52d10939636147d19d8de00a01483045022100cbe00b8a033296b9b9e269388a63fb96c4a8f75085c941fa32b037a5991932cb0220020788969972594ccac489afad39bcad1534628f6a649ad5b34f14e5e9421d8401483045022100b7160b1edb5919751ecf6d18c98cceeac9f5941c1854af8560432b34b77dd74b02207105457d94cc4839df8af02f9abc34302eca1b061666e6516d859ec73d89a748014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000009209030000000000fd4401483045022100a54e526956343cfc84ce3e428c138d40381003386375d4ebf9d246101ff678e402201c80e61034511ae79e486380e3a652af58ad5b489aa15f29ec56fb84864e768f0147304402203bdeb20123223d56f13e68817d4a29c87e690540019813b2cdcb4fecbab7044b0220396a1d6971b69b4ef3e63e8727f093b3d7bface1d677a798b4a2d5ece218e8fb0147304402203ff11e576e45e7254fa5959c93956a97c09bb123e95da708001f2ede5f9ba8c602200f9f36ba15933a54a4758d97b7842776bd9706c6a8fab6a58649b9040824634f014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000670a030000000000fd4301473044022029bb920d11e2bf9201d18e7730f3bc5f6553e62bc8314336ae9c8a5859914c1502203bdacff928d4d666507dd2583b9442959c88726a817c67348817cd65e6c3606601473044022077a8ad215d7005f651f3b73a4f5a2e33e98dd2168268e04eb41af2ed6435ce2d02200af0d91cd2880f4158d175e28bce4ddc3fe50ad78b87f969c3662ae242930d980147304402205479fac1941e63c1de3cb25c4760b13f6b62ca59cf7942fb3170fd2d195678f9022040e827f224ea5551a4dad03daaf0ad63ea470b4fceffa8e4bd495e7560f32289014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000fc11030000000000fd440147304402205c09825c601853704b1b0231fbee7591c79b6cbaf30e2e955a0b6a72793b370502203fa13d433613f7e6e63419d5db0ade84cb18d699da64a2138fc086afb6066e8301483045022100eafd46546faf8c4e1152145d0a5c30ef070d5e455b6b3b685e1cb8f47cc2a0030220452568d3b52d7a6f7b1f30f321cb4481aaf8af3d7223d5e3de2d6612fa2c41bc01473044022012fc1168c457070445b883dfbbad6996a9dca5eb006b3755daeee5908918a6bc022063b589fae666c446199742cd78eb1843385660f2a962492476c6cacf3997c9eb014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000a60f030000000000fd4501483045022100872b40bd06e8bcf66cbc8ce478d9ccb62972670682146d19b06e63b919a86da0022071cf9163b60e61078f4a5be7a46cee4978585f7eb27387c0b27ae696c3d79f4701483045022100848eb32ab0284db06df29338a34ec5d63660d8ff8838501acc00694b203a346b02203f67e1f2a8d05894f14e965748ef9391675c263afc356519f3516df5adbc87ff0147304402201a20d9f8b3e236b0807d84a7d7e041d77ee26f002d2b77c695fecca316c01b5e022035edbd8bbd6917b892166fcf4b8202b93609e04440ef7b6d850c12409cb3c1e5014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d000000008409030000000000fd4401473044022009153c7b1bfdfe8ac504213c3ba3321ede43e2dc89261d803601ed6e87cace55022051969259b11cacb80d06ca68563ebdbf8a6e85fa88e9c14afc5797dc82f0fdca01483045022100951209e2d941dd5ba148ef2a0d4a0eaf09c9e0c22051719cb5f3a762517964ab02204acdcfddb8b8aa6a1f61b5126dfb607a472b22d5f731e1318f2405732fc54e750147304402200cd5be575d4b681975316726c211db5fbbc3037d29acdeb06bb7c72119fce5db0220514ea54faba32014d3422ca09c2ebcd332888370249af76809a9f5e4c380dfe6014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000e600030000000000fd45014830450221008d99ed1beda44a35e04ed4b6a20a9335c29d6fa974011c06f7a4467420b7ea39022041faf1da827bf32bc43e56a3de62512491209b1175c8779afe3e07731db7620001483045022100f38d3d3adec74d05204c0c9f0b79521abdc57f23d9599a0423d0227294a0ae3e02204ffe4c18ccf208ce95ade49bb78cfdd86aded1071e1fcede37e19252ee0b7882014730440220477a3fa0d716f8ca73d0f5cd55508231dc05d90d14ee670527f30c7f68406e4302201ee6504b744a53375afb2e84fab902ff8d299d6d897bed9db8dcbd85fd890bad014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae4e0b860d00000000ed13030000000000fd4301473044022075d9d2d1d73ff65f1c3cb5fc705aa3f117b866901a527607c81807408fc924180220062031fca37eed36da2f119ad7f5018f8fdd6ca01f42c4bfebbe8550c17e8d690147304402202897a5b6ecb4426de79bc5be348c4b359c7a9adfec0c152345538bfd5279a3e8022053992fd5f382089e1f41e0c47a1ecc11cdd604dfc46210e6053b7f690e7ec0bb01473044022031a31eeaac96cce93cd3a5fe3d75e7faf99f17a5bba04a6a8387057815663ced0220266867c47ad462ab2e5a794b5db1325e0dd75588aa45e10dfb9c219918eb7af3014c69532102bc2a9206d10e5d5173583cbafebc78998745abeca13ed33151c93afbd850ca8e2103c995ce342de266d561d6ab4b06c7a14adb0f0b30002997f076f71c8f8ac93c98210330d6c9371b561d2b961a5987d336c0186a9c5dacd6ed4551420b5977e46a29b453ae"
  },
  {
    "path": "txscript/data/script_tests.json",
    "content": "[\n[\"Format is: [[wit..., amount]?, scriptSig, scriptPubKey, flags, expected_scripterror, ... comments]\"],\n[\"It is evaluated as if there was a crediting coinbase transaction with two 0\"],\n[\"pushes as scriptSig, and one output of 0 satoshi and given scriptPubKey,\"],\n[\"followed by a spending transaction which spends this output as only input (and\"],\n[\"correct prevout hash), using the given scriptSig. All nLockTimes are 0, all\"],\n[\"nSequences are max.\"],\n\n[\"\", \"DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"Test the test: we should have an empty stack after scriptSig evaluation\"],\n[\"  \", \"DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"and multiple spaces should not change that.\"],\n[\"   \", \"DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"    \", \"DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 2\", \"2 EQUALVERIFY 1 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"Similarly whitespace around and between symbols\"],\n[\"1  2\", \"2 EQUALVERIFY 1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"  1  2\", \"2 EQUALVERIFY 1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1  2  \", \"2 EQUALVERIFY 1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"  1  2  \", \"2 EQUALVERIFY 1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"1\", \"\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0x02 0x01 0x00\", \"\", \"P2SH,STRICTENC\", \"OK\", \"all bytes are significant, not only the last one\"],\n[\"0x09 0x00000000 0x00000000 0x10\", \"\", \"P2SH,STRICTENC\", \"OK\", \"equals zero when cast to Int64\"],\n\n[\"0x01 0x0b\", \"11 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"push 1 byte\"],\n[\"0x02 0x417a\", \"'Az' EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0x4b 0x417a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a\",\n \"'Azzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"push 75 bytes\"],\n\n[\"0x4c 0x01 0x07\",\"7 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"0x4c is OP_PUSHDATA1\"],\n[\"0x4d 0x0100 0x08\",\"8 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"0x4d is OP_PUSHDATA2\"],\n[\"0x4e 0x01000000 0x09\",\"9 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"0x4e is OP_PUSHDATA4\"],\n\n[\"0x4c 0x00\",\"0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0x4d 0x0000\",\"0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0x4e 0x00000000\",\"0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0x4f 1000 ADD\",\"999 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0x50 ENDIF 1\", \"P2SH,STRICTENC\", \"OK\", \"0x50 is reserved (ok if not executed)\"],\n[\"0x51\", \"0x5f ADD 0x60 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"0x51 through 0x60 push 1 through 16 onto stack\"],\n[\"1\",\"NOP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF VER ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\", \"VER non-functional (ok if not executed)\"],\n[\"0\", \"IF RESERVED RESERVED1 RESERVED2 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\", \"RESERVED ok in un-executed IF\"],\n\n[\"1\", \"DUP IF ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1\", \"IF 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1\", \"DUP IF ELSE ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1\", \"IF 1 ELSE ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"1 1\", \"IF IF 1 ELSE 0 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0\", \"IF IF 1 ELSE 0 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 1\", \"IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0\", \"IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"1 0\", \"NOTIF IF 1 ELSE 0 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 1\", \"NOTIF IF 1 ELSE 0 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0\", \"NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1\", \"NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"0\", \"IF 0 ELSE 1 ELSE 0 ENDIF\", \"P2SH,STRICTENC\", \"OK\", \"Multiple ELSE's are valid and executed inverts on each ELSE encountered\"],\n[\"1\", \"IF 1 ELSE 0 ELSE ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1\", \"IF ELSE 0 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1\", \"IF 1 ELSE 0 ELSE 1 ENDIF ADD 2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'' 1\", \"IF SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ENDIF 0x14 0x68ca4fec736264c13b859bac43d5173df6871682 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"1\", \"NOTIF 0 ELSE 1 ELSE 0 ENDIF\", \"P2SH,STRICTENC\", \"OK\", \"Multiple ELSE's are valid and execution inverts on each ELSE encountered\"],\n[\"0\", \"NOTIF 1 ELSE 0 ELSE ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"NOTIF ELSE 0 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"NOTIF 1 ELSE 0 ELSE 1 ENDIF ADD 2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'' 0\", \"NOTIF SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ELSE ELSE SHA1 ENDIF 0x14 0x68ca4fec736264c13b859bac43d5173df6871682 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"0\", \"IF 1 IF RETURN ELSE RETURN ELSE RETURN ENDIF ELSE 1 IF 1 ELSE RETURN ELSE 1 ENDIF ELSE RETURN ENDIF ADD 2 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"Nested ELSE ELSE\"],\n[\"1\", \"NOTIF 0 NOTIF RETURN ELSE RETURN ELSE RETURN ENDIF ELSE 0 NOTIF 1 ELSE RETURN ELSE 1 ENDIF ELSE RETURN ENDIF ADD 2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"0\", \"IF RETURN ENDIF 1\", \"P2SH,STRICTENC\", \"OK\", \"RETURN only works if executed\"],\n\n[\"1 1\", \"VERIFY\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0x05 0x01 0x00 0x00 0x00 0x00\", \"VERIFY\", \"P2SH,STRICTENC\", \"OK\", \"values >4 bytes can be cast to boolean\"],\n[\"1 0x01 0x80\", \"IF 0 ENDIF\", \"P2SH,STRICTENC\", \"OK\", \"negative 0 is false\"],\n\n[\"10 0 11 TOALTSTACK DROP FROMALTSTACK\", \"ADD 21 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'gavin_was_here' TOALTSTACK 11 FROMALTSTACK\", \"'gavin_was_here' EQUALVERIFY 11 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"0 IFDUP\", \"DEPTH 1 EQUALVERIFY 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 IFDUP\", \"DEPTH 2 EQUALVERIFY 1 EQUALVERIFY 1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0x05 0x0100000000 IFDUP\", \"DEPTH 2 EQUALVERIFY 0x05 0x0100000000 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"IFDUP dups non ints\"],\n[\"0 DROP\", \"DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"DUP 1 ADD 1 EQUALVERIFY 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1\", \"NIP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0\", \"OVER DEPTH 3 EQUALVERIFY\", \"P2SH,STRICTENC\", \"OK\"],\n[\"22 21 20\", \"0 PICK 20 EQUALVERIFY DEPTH 3 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"22 21 20\", \"1 PICK 21 EQUALVERIFY DEPTH 3 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"22 21 20\", \"2 PICK 22 EQUALVERIFY DEPTH 3 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"22 21 20\", \"0 ROLL 20 EQUALVERIFY DEPTH 2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"22 21 20\", \"1 ROLL 21 EQUALVERIFY DEPTH 2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"22 21 20\", \"2 ROLL 22 EQUALVERIFY DEPTH 2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"22 21 20\", \"ROT 22 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"22 21 20\", \"ROT DROP 20 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"22 21 20\", \"ROT DROP DROP 21 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"22 21 20\", \"ROT ROT 21 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"22 21 20\", \"ROT ROT ROT 20 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"25 24 23 22 21 20\", \"2ROT 24 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"25 24 23 22 21 20\", \"2ROT DROP 25 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"25 24 23 22 21 20\", \"2ROT 2DROP 20 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"25 24 23 22 21 20\", \"2ROT 2DROP DROP 21 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"25 24 23 22 21 20\", \"2ROT 2DROP 2DROP 22 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"25 24 23 22 21 20\", \"2ROT 2DROP 2DROP DROP 23 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"25 24 23 22 21 20\", \"2ROT 2ROT 22 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"25 24 23 22 21 20\", \"2ROT 2ROT 2ROT 20 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0\", \"SWAP 1 EQUALVERIFY 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1\", \"TUCK DEPTH 3 EQUALVERIFY SWAP 2DROP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"13 14\", \"2DUP ROT EQUALVERIFY EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1 0 1 2\", \"3DUP DEPTH 7 EQUALVERIFY ADD ADD 3 EQUALVERIFY 2DROP 0 EQUALVERIFY\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 2 3 5\", \"2OVER ADD ADD 8 EQUALVERIFY ADD ADD 6 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 3 5 7\", \"2SWAP ADD 4 EQUALVERIFY ADD 12 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"SIZE 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1\", \"SIZE 1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"127\", \"SIZE 1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"128\", \"SIZE 2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"32767\", \"SIZE 2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"32768\", \"SIZE 3 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"8388607\", \"SIZE 3 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"8388608\", \"SIZE 4 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"2147483647\", \"SIZE 4 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"2147483648\", \"SIZE 5 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"549755813887\", \"SIZE 5 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"549755813888\", \"SIZE 6 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"9223372036854775807\", \"SIZE 8 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1\", \"SIZE 1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-127\", \"SIZE 1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-128\", \"SIZE 2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-32767\", \"SIZE 2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-32768\", \"SIZE 3 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-8388607\", \"SIZE 3 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-8388608\", \"SIZE 4 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-2147483647\", \"SIZE 4 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-2147483648\", \"SIZE 5 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-549755813887\", \"SIZE 5 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-549755813888\", \"SIZE 6 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-9223372036854775807\", \"SIZE 8 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'abcdefghijklmnopqrstuvwxyz'\", \"SIZE 26 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"42\", \"SIZE 1 EQUALVERIFY 42 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"SIZE does not consume argument\"],\n\n[\"2 -2 ADD\", \"0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"2147483647 -2147483647 ADD\", \"0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1 -1 ADD\", \"-2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"0 0\",\"EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 1 ADD\", \"2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 1ADD\", \"2 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"111 1SUB\", \"110 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"111 1 ADD 12 SUB\", \"100 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 ABS\", \"0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"16 ABS\", \"16 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-16 ABS\", \"-16 NEGATE EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 NOT\", \"NOP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 NOT\", \"0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"11 NOT\", \"0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0NOTEQUAL\", \"0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0NOTEQUAL\", \"1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"111 0NOTEQUAL\", \"1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-111 0NOTEQUAL\", \"1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 1 BOOLAND\", \"NOP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0 BOOLAND\", \"NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1 BOOLAND\", \"NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0 BOOLAND\", \"NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"16 17 BOOLAND\", \"NOP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 1 BOOLOR\", \"NOP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0 BOOLOR\", \"NOP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1 BOOLOR\", \"NOP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0 BOOLOR\", \"NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"16 17 BOOLOR\", \"NOP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"11 10 1 ADD\", \"NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"11 10 1 ADD\", \"NUMEQUALVERIFY 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"11 10 1 ADD\", \"NUMNOTEQUAL NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"111 10 1 ADD\", \"NUMNOTEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"11 10\", \"LESSTHAN NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"4 4\", \"LESSTHAN NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"10 11\", \"LESSTHAN\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-11 11\", \"LESSTHAN\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-11 -10\", \"LESSTHAN\", \"P2SH,STRICTENC\", \"OK\"],\n[\"11 10\", \"GREATERTHAN\", \"P2SH,STRICTENC\", \"OK\"],\n[\"4 4\", \"GREATERTHAN NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"10 11\", \"GREATERTHAN NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-11 11\", \"GREATERTHAN NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-11 -10\", \"GREATERTHAN NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"11 10\", \"LESSTHANOREQUAL NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"4 4\", \"LESSTHANOREQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"10 11\", \"LESSTHANOREQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-11 11\", \"LESSTHANOREQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-11 -10\", \"LESSTHANOREQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"11 10\", \"GREATERTHANOREQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"4 4\", \"GREATERTHANOREQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"10 11\", \"GREATERTHANOREQUAL NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-11 11\", \"GREATERTHANOREQUAL NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-11 -10\", \"GREATERTHANOREQUAL NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0 MIN\", \"0 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1 MIN\", \"0 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1 0 MIN\", \"-1 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 -2147483647 MIN\", \"-2147483647 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"2147483647 0 MAX\", \"2147483647 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 100 MAX\", \"100 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-100 0 MAX\", \"0 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 -2147483647 MAX\", \"0 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0 1\", \"WITHIN\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0 1\", \"WITHIN NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 -2147483647 2147483647\", \"WITHIN\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1 -100 100\", \"WITHIN\", \"P2SH,STRICTENC\", \"OK\"],\n[\"11 -100 100\", \"WITHIN\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-2147483647 -100 100\", \"WITHIN NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"2147483647 -100 100\", \"WITHIN NOT\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"2147483647 2147483647 SUB\", \"0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"2147483647 DUP ADD\", \"4294967294 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \">32 bit EQUAL is valid\"],\n[\"2147483647 NEGATE DUP ADD\", \"-4294967294 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"''\", \"RIPEMD160 0x14 0x9c1185a5c5e9fc54612808977ee8f548b2258d31 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'a'\", \"RIPEMD160 0x14 0x0bdc9d2d256b3ee9daae347be6f4dc835a467ffe EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'abcdefghijklmnopqrstuvwxyz'\", \"RIPEMD160 0x14 0xf71c27109c692c1b56bbdceb5b9d2865b3708dbc EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"''\", \"SHA1 0x14 0xda39a3ee5e6b4b0d3255bfef95601890afd80709 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'a'\", \"SHA1 0x14 0x86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'abcdefghijklmnopqrstuvwxyz'\", \"SHA1 0x14 0x32d10c7b8cf96570ca04ce37f2a19d84240d3a89 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"''\", \"SHA256 0x20 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'a'\", \"SHA256 0x20 0xca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'abcdefghijklmnopqrstuvwxyz'\", \"SHA256 0x20 0x71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"''\", \"DUP HASH160 SWAP SHA256 RIPEMD160 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"''\", \"DUP HASH256 SWAP SHA256 SHA256 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"''\", \"NOP HASH160 0x14 0xb472a266d0bd89c13706a4132ccfb16f7c3b9fcb EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'a'\", \"HASH160 NOP 0x14 0x994355199e516ff76c4fa4aab39337b9d84cf12b EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'abcdefghijklmnopqrstuvwxyz'\", \"HASH160 0x4c 0x14 0xc286a1af0947f58d1ad787385b1c2c4a976f9e71 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"''\", \"HASH256 0x20 0x5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'a'\", \"HASH256 0x20 0xbf5d3affb73efd2ec6c36ad3112dd933efed63c4e1cbffcfa88e2759c144f2d8 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'abcdefghijklmnopqrstuvwxyz'\", \"HASH256 0x4c 0x20 0xca139bc10c2f660da42666f72e89a225936fc60f193c161124a672050c434671 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n\n[\"1\",\"NOP1 CHECKLOCKTIMEVERIFY CHECKSEQUENCEVERIFY NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 1 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"'NOP_1_to_10' NOP1 CHECKLOCKTIMEVERIFY CHECKSEQUENCEVERIFY NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10\",\"'NOP_1_to_10' EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"1\", \"NOP\", \"P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS\", \"OK\", \"Discourage NOPx flag allows OP_NOP\"],\n\n[\"0\", \"IF NOP10 ENDIF 1\", \"P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS\", \"OK\",\n \"Discouraged NOPs are allowed if not executed\"],\n\n[\"0\", \"IF 0xba ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\", \"opcodes above NOP10 invalid if executed\"],\n[\"0\", \"IF 0xbb ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xbc ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xbd ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xbe ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xbf ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xc0 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xc1 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xc2 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xc3 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xc4 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xc5 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xc6 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xc7 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xc8 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xc9 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xca ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xcb ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xcc ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xcd ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xce ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xcf ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xd0 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xd1 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xd2 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xd3 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xd4 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xd5 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xd6 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xd7 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xd8 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xd9 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xda ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xdb ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xdc ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xdd ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xde ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xdf ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xe0 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xe1 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xe2 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xe3 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xe4 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xe5 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xe6 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xe7 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xe8 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xe9 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xea ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xeb ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xec ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xed ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xee ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xef ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xf0 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xf1 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xf2 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xf3 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xf4 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xf5 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xf6 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xf7 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xf8 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xf9 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xfa ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xfb ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xfc ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xfd ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xfe ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"IF 0xff ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"NOP\",\n\"'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'\",\n\"P2SH,STRICTENC\", \"OK\",\n\"520 byte push\"],\n[\"1\",\n\"0x616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\",\n\"P2SH,STRICTENC\", \"OK\",\n\"201 opcodes executed. 0x61 is NOP\"],\n[\"1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f\",\n\"1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f\",\n\"P2SH,STRICTENC\", \"OK\",\n\"1,000 stack size (0x6f is 3DUP)\"],\n[\"1 TOALTSTACK 2 TOALTSTACK 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f\",\n\"1 2 3 4 5 6 7 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f\",\n\"P2SH,STRICTENC\", \"OK\",\n\"1,000 stack size (altstack cleared between scriptSig/scriptPubKey)\"],\n[\"'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f\",\n\"'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f 2DUP 0x616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\",\n\"P2SH,STRICTENC\", \"OK\",\n\"Max-size (10,000-byte), max-push(520 bytes), max-opcodes(201), max stack size(1,000 items). 0x6f is 3DUP, 0x61 is NOP\"],\n\n[\"0\",\n\"IF 0x5050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050 ENDIF 1\",\n\"P2SH,STRICTENC\", \"OK\",\n\">201 opcodes, but RESERVED (0x50) doesn't count towards opcode limit.\"],\n\n[\"NOP\",\"1\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"1\", \"0x01 0x01 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"The following is useful for checking implementations of BN_bn2mpi\"],\n[\"127\", \"0x01 0x7F EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"128\", \"0x02 0x8000 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"Leave room for the sign bit\"],\n[\"32767\", \"0x02 0xFF7F EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"32768\", \"0x03 0x008000 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"8388607\", \"0x03 0xFFFF7F EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"8388608\", \"0x04 0x00008000 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"2147483647\", \"0x04 0xFFFFFF7F EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"2147483648\", \"0x05 0x0000008000 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"549755813887\", \"0x05 0xFFFFFFFF7F EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"549755813888\", \"0x06 0xFFFFFFFF7F EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"9223372036854775807\", \"0x08 0xFFFFFFFFFFFFFF7F EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1\", \"0x01 0x81 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"Numbers are little-endian with the MSB being a sign bit\"],\n[\"-127\", \"0x01 0xFF EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-128\", \"0x02 0x8080 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-32767\", \"0x02 0xFFFF EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-32768\", \"0x03 0x008080 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-8388607\", \"0x03 0xFFFFFF EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-8388608\", \"0x04 0x00008080 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-2147483647\", \"0x04 0xFFFFFFFF EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-2147483648\", \"0x05 0x0000008080 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-4294967295\", \"0x05 0xFFFFFFFF80 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-549755813887\", \"0x05 0xFFFFFFFFFF EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-549755813888\", \"0x06 0x000000008080 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-9223372036854775807\", \"0x08 0xFFFFFFFFFFFFFFFF EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"2147483647\", \"1ADD 2147483648 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"We can do math on 4-byte integers, and compare 5-byte ones\"],\n[\"2147483647\", \"1ADD 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-2147483647\", \"1ADD 1\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"1\", \"0x02 0x0100 EQUAL NOT\", \"P2SH,STRICTENC\", \"OK\", \"Not the same byte array...\"],\n[\"1\", \"0x02 0x0100 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\", \"... but they are numerically equal\"],\n[\"11\", \"0x4c 0x03 0x0b0000 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"0x01 0x80 EQUAL NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"0x01 0x80 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\", \"Zero numerically equals negative zero\"],\n[\"0\", \"0x02 0x0080 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0x03 0x000080\", \"0x04 0x00000080 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0x03 0x100080\", \"0x04 0x10000080 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0x03 0x100000\", \"0x04 0x10000000 NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"NOP\", \"NOP 1\", \"P2SH,STRICTENC\", \"OK\", \"The following tests check the if(stack.size() < N) tests in each opcode\"],\n[\"1\", \"IF 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\", \"They are here to catch copy-and-paste errors\"],\n[\"0\", \"NOTIF 1 ENDIF\", \"P2SH,STRICTENC\", \"OK\", \"Most of them are duplicated elsewhere,\"],\n[\"1\", \"VERIFY 1\", \"P2SH,STRICTENC\", \"OK\", \"but, hey, more is always better, right?\"],\n\n[\"0\", \"TOALTSTACK 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1\", \"TOALTSTACK FROMALTSTACK\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0\", \"2DROP 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1\", \"2DUP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0 1\", \"3DUP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1 0 0\", \"2OVER\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1 0 0 0 0\", \"2ROT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1 0 0\", \"2SWAP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1\", \"IFDUP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"NOP\", \"DEPTH 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"DROP 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1\", \"DUP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1\", \"NIP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0\", \"OVER\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0 0 0 3\", \"PICK\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0\", \"PICK\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0 0 0 3\", \"ROLL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0\", \"ROLL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0 0\", \"ROT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0\", \"SWAP\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 1\", \"TUCK\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"1\", \"SIZE\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"0 0\", \"EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0\", \"EQUALVERIFY 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0 1\", \"EQUAL EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"OP_0 and bools must have identical byte representations\"],\n\n[\"0\", \"1ADD\", \"P2SH,STRICTENC\", \"OK\"],\n[\"2\", \"1SUB\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1\", \"NEGATE\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1\", \"ABS\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"NOT\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1\", \"0NOTEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"1 0\", \"ADD\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0\", \"SUB\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1 -1\", \"BOOLAND\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1 0\", \"BOOLOR\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0\", \"NUMEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0\", \"NUMEQUALVERIFY 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1 0\", \"NUMNOTEQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1 0\", \"LESSTHAN\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0\", \"GREATERTHAN\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0\", \"LESSTHANOREQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0 0\", \"GREATERTHANOREQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1 0\", \"MIN\", \"P2SH,STRICTENC\", \"OK\"],\n[\"1 0\", \"MAX\", \"P2SH,STRICTENC\", \"OK\"],\n[\"-1 -1 0\", \"WITHIN\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"0\", \"RIPEMD160\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"SHA1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"SHA256\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"HASH160\", \"P2SH,STRICTENC\", \"OK\"],\n[\"0\", \"HASH256\", \"P2SH,STRICTENC\", \"OK\"],\n[\"NOP\", \"CODESEPARATOR 1\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"NOP\", \"NOP1 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"NOP\", \"CHECKLOCKTIMEVERIFY 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"NOP\", \"CHECKSEQUENCEVERIFY 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"NOP\", \"NOP4 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"NOP\", \"NOP5 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"NOP\", \"NOP6 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"NOP\", \"NOP7 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"NOP\", \"NOP8 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"NOP\", \"NOP9 1\", \"P2SH,STRICTENC\", \"OK\"],\n[\"NOP\", \"NOP10 1\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"\", \"0 0 0 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"CHECKMULTISIG is allowed to have zero keys and/or sigs\"],\n[\"\", \"0 0 0 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 0 1 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"Zero sigs means no sigs are checked\"],\n[\"\", \"0 0 0 1 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"\", \"0 0 0 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"CHECKMULTISIG is allowed to have zero keys and/or sigs\"],\n[\"\", \"0 0 0 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 0 1 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"Zero sigs means no sigs are checked\"],\n[\"\", \"0 0 0 1 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"\", \"0 0 'a' 'b' 2 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"Test from up to 20 pubkeys, all not checked\"],\n[\"\", \"0 0 'a' 'b' 'c' 3 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 4 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 5 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 6 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 7 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 8 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 9 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 10 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 11 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 12 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 13 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 14 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 15 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 16 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 17 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 18 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 19 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG VERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 1 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 2 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 3 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 4 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 5 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 6 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 7 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 8 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 9 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 10 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 11 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 12 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 13 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 14 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 15 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 16 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 17 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 18 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 19 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n[\"\", \"0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"\",\n\"0 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG\",\n\"P2SH,STRICTENC\", \"OK\",\n\"nOpCount is incremented by the number of keys evaluated in addition to the usual one op per op. In this case we have zero keys, so we can execute 201 CHECKMULTISIGS\"],\n\n[\"1\",\n\"0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY 0 0 0 CHECKMULTISIGVERIFY\",\n\"P2SH,STRICTENC\", \"OK\"],\n\n[\"\",\n\"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG\",\n\"P2SH,STRICTENC\", \"OK\",\n\"Even though there are no signatures being checked nOpCount is incremented by the number of keys.\"],\n\n[\"1\",\n\"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY\",\n\"P2SH,STRICTENC\", \"OK\"],\n\n[\"0 0x01 1\", \"HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"Very basic P2SH\"],\n[\"0x4c 0 0x01 1\", \"HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL\", \"P2SH,STRICTENC\", \"OK\"],\n\n[\"0x40 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242\",\n\"0x4d 0x4000 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242 EQUAL\",\n\"P2SH,STRICTENC\", \"OK\",\n\"Basic PUSH signedness check\"],\n\n[\"0x4c 0x40 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242\",\n\"0x4d 0x4000 0x42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242 EQUAL\",\n\"P2SH,STRICTENC\", \"OK\",\n\"Basic PUSHDATA1 signedness check\"],\n\n[\"all PUSHDATA forms are equivalent\"],\n\n[\"0x4c 0x4b 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\", \"0x4b 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 EQUAL\", \"\", \"OK\", \"PUSHDATA1 of 75 bytes equals direct push of it\"],\n[\"0x4d 0xFF00 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\", \"0x4c 0xFF 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 EQUAL\", \"\", \"OK\", \"PUSHDATA2 of 255 bytes equals PUSHDATA1 of it\"],\n\n[\"0x00\", \"SIZE 0 EQUAL\", \"P2SH,STRICTENC\", \"OK\", \"Basic OP_0 execution\"],\n\n[\"Numeric pushes\"],\n\n[\"0x01 0x81\", \"0x4f EQUAL\", \"\", \"OK\", \"OP1_NEGATE pushes 0x81\"],\n[\"0x01 0x01\", \"0x51 EQUAL\", \"\", \"OK\", \"OP_1  pushes 0x01\"],\n[\"0x01 0x02\", \"0x52 EQUAL\", \"\", \"OK\", \"OP_2  pushes 0x02\"],\n[\"0x01 0x03\", \"0x53 EQUAL\", \"\", \"OK\", \"OP_3  pushes 0x03\"],\n[\"0x01 0x04\", \"0x54 EQUAL\", \"\", \"OK\", \"OP_4  pushes 0x04\"],\n[\"0x01 0x05\", \"0x55 EQUAL\", \"\", \"OK\", \"OP_5  pushes 0x05\"],\n[\"0x01 0x06\", \"0x56 EQUAL\", \"\", \"OK\", \"OP_6  pushes 0x06\"],\n[\"0x01 0x07\", \"0x57 EQUAL\", \"\", \"OK\", \"OP_7  pushes 0x07\"],\n[\"0x01 0x08\", \"0x58 EQUAL\", \"\", \"OK\", \"OP_8  pushes 0x08\"],\n[\"0x01 0x09\", \"0x59 EQUAL\", \"\", \"OK\", \"OP_9  pushes 0x09\"],\n[\"0x01 0x0a\", \"0x5a EQUAL\", \"\", \"OK\", \"OP_10 pushes 0x0a\"],\n[\"0x01 0x0b\", \"0x5b EQUAL\", \"\", \"OK\", \"OP_11 pushes 0x0b\"],\n[\"0x01 0x0c\", \"0x5c EQUAL\", \"\", \"OK\", \"OP_12 pushes 0x0c\"],\n[\"0x01 0x0d\", \"0x5d EQUAL\", \"\", \"OK\", \"OP_13 pushes 0x0d\"],\n[\"0x01 0x0e\", \"0x5e EQUAL\", \"\", \"OK\", \"OP_14 pushes 0x0e\"],\n[\"0x01 0x0f\", \"0x5f EQUAL\", \"\", \"OK\", \"OP_15 pushes 0x0f\"],\n[\"0x01 0x10\", \"0x60 EQUAL\", \"\", \"OK\", \"OP_16 pushes 0x10\"],\n\n[\"Equivalency of different numeric encodings\"],\n\n[\"0x02 0x8000\", \"128 NUMEQUAL\", \"\", \"OK\", \"0x8000 equals 128\"],\n[\"0x01 0x00\", \"0 NUMEQUAL\", \"\", \"OK\", \"0x00 numequals 0\"],\n[\"0x01 0x80\", \"0 NUMEQUAL\", \"\", \"OK\", \"0x80 (negative zero) numequals 0\"],\n[\"0x02 0x0080\", \"0 NUMEQUAL\", \"\", \"OK\", \"0x0080 numequals 0\"],\n[\"0x02 0x0500\", \"5 NUMEQUAL\", \"\", \"OK\", \"0x0500 numequals 5\"],\n[\"0x03 0xff7f80\", \"0x02 0xffff NUMEQUAL\", \"\", \"OK\", \"\"],\n[\"0x03 0xff7f00\", \"0x02 0xff7f NUMEQUAL\", \"\", \"OK\", \"\"],\n[\"0x04 0xffff7f80\", \"0x03 0xffffff NUMEQUAL\", \"\", \"OK\", \"\"],\n[\"0x04 0xffff7f00\", \"0x03 0xffff7f NUMEQUAL\", \"\", \"OK\", \"\"],\n\n[\"Unevaluated non-minimal pushes are ignored\"],\n\n[\"0 IF 0x4c 0x00 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"non-minimal PUSHDATA1 ignored\"],\n[\"0 IF 0x4d 0x0000 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"non-minimal PUSHDATA2 ignored\"],\n[\"0 IF 0x4c 0x00000000 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"non-minimal PUSHDATA4 ignored\"],\n[\"0 IF 0x01 0x81 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"1NEGATE equiv\"],\n[\"0 IF 0x01 0x01 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_1  equiv\"],\n[\"0 IF 0x01 0x02 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_2  equiv\"],\n[\"0 IF 0x01 0x03 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_3  equiv\"],\n[\"0 IF 0x01 0x04 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_4  equiv\"],\n[\"0 IF 0x01 0x05 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_5  equiv\"],\n[\"0 IF 0x01 0x06 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_6  equiv\"],\n[\"0 IF 0x01 0x07 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_7  equiv\"],\n[\"0 IF 0x01 0x08 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_8  equiv\"],\n[\"0 IF 0x01 0x09 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_9  equiv\"],\n[\"0 IF 0x01 0x0a ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_10 equiv\"],\n[\"0 IF 0x01 0x0b ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_11 equiv\"],\n[\"0 IF 0x01 0x0c ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_12 equiv\"],\n[\"0 IF 0x01 0x0d ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_13 equiv\"],\n[\"0 IF 0x01 0x0e ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_14 equiv\"],\n[\"0 IF 0x01 0x0f ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_15 equiv\"],\n[\"0 IF 0x01 0x10 ENDIF 1\", \"\", \"MINIMALDATA\", \"OK\", \"OP_16 equiv\"],\n\n[\"Numeric minimaldata rules are only applied when a stack item is numerically evaluated; the push itself is allowed\"],\n\n[\"0x01 0x00\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x01 0x80\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0180\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0100\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0200\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0300\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0400\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0500\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0600\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0700\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0800\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0900\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0a00\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0b00\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0c00\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0d00\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0e00\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x0f00\", \"1\", \"MINIMALDATA\", \"OK\"],\n[\"0x02 0x1000\", \"1\", \"MINIMALDATA\", \"OK\"],\n\n[\"Valid version of the 'Test every numeric-accepting opcode for correct handling of the numeric minimal encoding rule' script_invalid test\"],\n\n[\"1 0x02 0x0000\", \"PICK DROP\", \"\", \"OK\"],\n[\"1 0x02 0x0000\", \"ROLL DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000\", \"1ADD DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000\", \"1SUB DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000\", \"NEGATE DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000\", \"ABS DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000\", \"NOT DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000\", \"0NOTEQUAL DROP 1\", \"\", \"OK\"],\n\n[\"0 0x02 0x0000\", \"ADD DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"ADD DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"SUB DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"SUB DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"BOOLAND DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"BOOLAND DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"BOOLOR DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"BOOLOR DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"NUMEQUAL DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 1\", \"NUMEQUAL DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"NUMEQUALVERIFY 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"NUMEQUALVERIFY 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"NUMNOTEQUAL DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"NUMNOTEQUAL DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"LESSTHAN DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"LESSTHAN DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"GREATERTHAN DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"GREATERTHAN DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"LESSTHANOREQUAL DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"LESSTHANOREQUAL DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"GREATERTHANOREQUAL DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"GREATERTHANOREQUAL DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"MIN DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"MIN DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000\", \"MAX DROP 1\", \"\", \"OK\"],\n[\"0x02 0x0000 0\", \"MAX DROP 1\", \"\", \"OK\"],\n\n[\"0x02 0x0000 0 0\", \"WITHIN DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000 0\", \"WITHIN DROP 1\", \"\", \"OK\"],\n[\"0 0 0x02 0x0000\", \"WITHIN DROP 1\", \"\", \"OK\"],\n\n[\"0 0 0x02 0x0000\", \"CHECKMULTISIG DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000 0\", \"CHECKMULTISIG DROP 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000 0 1\", \"CHECKMULTISIG DROP 1\", \"\", \"OK\"],\n[\"0 0 0x02 0x0000\", \"CHECKMULTISIGVERIFY 1\", \"\", \"OK\"],\n[\"0 0x02 0x0000 0\", \"CHECKMULTISIGVERIFY 1\", \"\", \"OK\"],\n\n[\"While not really correctly DER encoded, the empty signature is allowed by\"],\n[\"STRICTENC to provide a compact way to provide a deliberately invalid signature.\"],\n[\"0\", \"0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 CHECKSIG NOT\", \"STRICTENC\", \"OK\"],\n[\"0 0\", \"1 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 1 CHECKMULTISIG NOT\", \"STRICTENC\", \"OK\"],\n\n[\"CHECKMULTISIG evaluation order tests. CHECKMULTISIG evaluates signatures and\"],\n[\"pubkeys in a specific order, and will exit early if the number of signatures\"],\n[\"left to check is greater than the number of keys left. As STRICTENC fails the\"],\n[\"script when it reaches an invalidly encoded signature or pubkey, we can use it\"],\n[\"to test the exact order in which signatures and pubkeys are evaluated by\"],\n[\"distinguishing CHECKMULTISIG returning false on the stack and the script as a\"],\n[\"whole failing.\"],\n[\"See also the corresponding inverted versions of these tests in script_invalid.json\"],\n[\n    \"0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501\",\n    \"2 0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT\",\n    \"STRICTENC\", \"OK\",\n    \"2-of-2 CHECKMULTISIG NOT with the second pubkey invalid, and both signatures validly encoded. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid pubkey.\"\n],\n[\n    \"0 0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501\",\n    \"2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT\",\n    \"STRICTENC\", \"OK\",\n    \"2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but second signature invalid. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid signature.\"\n],\n\n[\"Increase test coverage for DERSIG\"],\n[\"0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"0 CHECKSIG NOT\", \"\", \"OK\", \"Overly long signature is correctly encoded\"],\n[\"0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000\", \"0 CHECKSIG NOT\", \"\", \"OK\", \"Missing S is correctly encoded\"],\n[\"0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701\", \"0 CHECKSIG NOT\", \"\", \"OK\", \"S with invalid S length is correctly encoded\"],\n[\"0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701\", \"0 CHECKSIG NOT\", \"\", \"OK\", \"Non-integer R is correctly encoded\"],\n[\"0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701\", \"0 CHECKSIG NOT\", \"\", \"OK\", \"Non-integer S is correctly encoded\"],\n[\"0x17 0x3014020002107777777777777777777777777777777701\", \"0 CHECKSIG NOT\", \"\", \"OK\", \"Zero-length R is correctly encoded\"],\n[\"0x17 0x3014021077777777777777777777777777777777020001\", \"0 CHECKSIG NOT\", \"\", \"OK\", \"Zero-length S is correctly encoded for DERSIG\"],\n[\"0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701\", \"0 CHECKSIG NOT\", \"\", \"OK\", \"Negative S is correctly encoded\"],\n \n[\"2147483648\", \"CHECKSEQUENCEVERIFY\", \"CHECKSEQUENCEVERIFY\", \"OK\", \"CSV passes if stack top bit 1 << 31 is set\"],\n\n[\"\", \"DEPTH\", \"P2SH,STRICTENC\",   \"EVAL_FALSE\", \"Test the test: we should have an empty stack after scriptSig evaluation\"],\n[\"  \", \"DEPTH\", \"P2SH,STRICTENC\", \"EVAL_FALSE\", \"and multiple spaces should not change that.\"],\n[\"   \", \"DEPTH\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"    \", \"DEPTH\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n\n[\"\", \"\", \"P2SH,STRICTENC\",\"EVAL_FALSE\"],\n[\"\", \"NOP\", \"P2SH,STRICTENC\",\"EVAL_FALSE\"],\n[\"\", \"NOP DEPTH\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"NOP\", \"\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"NOP\", \"DEPTH\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"NOP\",\"NOP\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"NOP\",\"NOP DEPTH\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n\n[\"DEPTH\", \"\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n\n[\"0x4c01\",\"0x01 NOP\", \"P2SH,STRICTENC\",\"BAD_OPCODE\", \"PUSHDATA1 with not enough bytes\"],\n[\"0x4d0200ff\",\"0x01 NOP\", \"P2SH,STRICTENC\",\"BAD_OPCODE\", \"PUSHDATA2 with not enough bytes\"],\n[\"0x4e03000000ffff\",\"0x01 NOP\", \"P2SH,STRICTENC\",\"BAD_OPCODE\", \"PUSHDATA4 with not enough bytes\"],\n\n[\"1\", \"IF 0x50 ENDIF 1\", \"P2SH,STRICTENC\",\"BAD_OPCODE\", \"0x50 is reserved\"],\n[\"0x52\", \"0x5f ADD 0x60 EQUAL\", \"P2SH,STRICTENC\",\"EVAL_FALSE\", \"0x51 through 0x60 push 1 through 16 onto stack\"],\n[\"0\",\"NOP\", \"P2SH,STRICTENC\",\"EVAL_FALSE\",\"\"],\n[\"1\", \"IF VER ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"VER non-functional\"],\n[\"0\", \"IF VERIF ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"VERIF illegal everywhere\"],\n[\"0\", \"IF ELSE 1 ELSE VERIF ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"VERIF illegal everywhere\"],\n[\"0\", \"IF VERNOTIF ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"VERNOTIF illegal everywhere\"],\n[\"0\", \"IF ELSE 1 ELSE VERNOTIF ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"VERNOTIF illegal everywhere\"],\n\n[\"1 IF\", \"1 ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\", \"IF/ENDIF can't span scriptSig/scriptPubKey\"],\n[\"1 IF 0 ENDIF\", \"1 ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\"],\n[\"1 ELSE 0 ENDIF\", \"1\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\"],\n[\"0 NOTIF\", \"123\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\"],\n\n[\"0\", \"DUP IF ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"0\", \"IF 1 ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"0\", \"DUP IF ELSE ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"0\", \"IF 1 ELSE ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"0\", \"NOTIF ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n\n[\"0 1\", \"IF IF 1 ELSE 0 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"0 0\", \"IF IF 1 ELSE 0 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"1 0\", \"IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"0 1\", \"IF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n\n[\"0 0\", \"NOTIF IF 1 ELSE 0 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"0 1\", \"NOTIF IF 1 ELSE 0 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"1 1\", \"NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"0 0\", \"NOTIF IF 1 ELSE 0 ENDIF ELSE IF 0 ELSE 1 ENDIF ENDIF\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n\n[\"1\", \"IF RETURN ELSE ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"OP_RETURN\", \"Multiple ELSEs\"],\n[\"1\", \"IF 1 ELSE ELSE RETURN ENDIF\", \"P2SH,STRICTENC\", \"OP_RETURN\"],\n\n[\"1\", \"ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\", \"Malformed IF/ELSE/ENDIF sequence\"],\n[\"1\", \"ELSE ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\"],\n[\"1\", \"ENDIF ELSE\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\"],\n[\"1\", \"ENDIF ELSE IF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\"],\n[\"1\", \"IF ELSE ENDIF ELSE\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\"],\n[\"1\", \"IF ELSE ENDIF ELSE ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\"],\n[\"1\", \"IF ENDIF ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\"],\n[\"1\", \"IF ELSE ELSE ENDIF ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\"],\n\n[\"1\", \"RETURN\", \"P2SH,STRICTENC\", \"OP_RETURN\"],\n[\"1\", \"DUP IF RETURN ENDIF\", \"P2SH,STRICTENC\", \"OP_RETURN\"],\n\n[\"1\", \"RETURN 'data'\", \"P2SH,STRICTENC\", \"OP_RETURN\", \"canonical prunable txout format\"],\n[\"0 IF\", \"RETURN ENDIF 1\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\", \"still prunable because IF/ENDIF can't span scriptSig/scriptPubKey\"],\n\n[\"0\", \"VERIFY 1\", \"P2SH,STRICTENC\", \"VERIFY\"],\n[\"1\", \"VERIFY\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"1\", \"VERIFY 0\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n\n[\"1 TOALTSTACK\", \"FROMALTSTACK 1\", \"P2SH,STRICTENC\", \"INVALID_ALTSTACK_OPERATION\", \"alt stack not shared between sig/pubkey\"],\n\n[\"IFDUP\", \"DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"DROP\", \"DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"DUP\", \"DEPTH 0 EQUAL\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"DUP 1 ADD 2 EQUALVERIFY 0 EQUAL\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"NOP\", \"NIP\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"1 NIP\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"1 0 NIP\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"NOP\", \"OVER 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"OVER\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"0 1\", \"OVER DEPTH 3 EQUALVERIFY\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"19 20 21\", \"PICK 19 EQUALVERIFY DEPTH 2 EQUAL\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"0 PICK\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"-1 PICK\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"19 20 21\", \"0 PICK 20 EQUALVERIFY DEPTH 3 EQUAL\", \"P2SH,STRICTENC\", \"EQUALVERIFY\"],\n[\"19 20 21\", \"1 PICK 21 EQUALVERIFY DEPTH 3 EQUAL\", \"P2SH,STRICTENC\", \"EQUALVERIFY\"],\n[\"19 20 21\", \"2 PICK 22 EQUALVERIFY DEPTH 3 EQUAL\", \"P2SH,STRICTENC\", \"EQUALVERIFY\"],\n[\"NOP\", \"0 ROLL\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"-1 ROLL\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"19 20 21\", \"0 ROLL 20 EQUALVERIFY DEPTH 2 EQUAL\", \"P2SH,STRICTENC\", \"EQUALVERIFY\"],\n[\"19 20 21\", \"1 ROLL 21 EQUALVERIFY DEPTH 2 EQUAL\", \"P2SH,STRICTENC\", \"EQUALVERIFY\"],\n[\"19 20 21\", \"2 ROLL 22 EQUALVERIFY DEPTH 2 EQUAL\", \"P2SH,STRICTENC\", \"EQUALVERIFY\"],\n[\"NOP\", \"ROT 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"1 ROT 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"1 2 ROT 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"0 1 2 ROT\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"NOP\", \"SWAP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"SWAP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"0 1\", \"SWAP 1 EQUALVERIFY\", \"P2SH,STRICTENC\", \"EQUALVERIFY\"],\n[\"NOP\", \"TUCK 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"TUCK 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1 0\", \"TUCK DEPTH 3 EQUALVERIFY SWAP 2DROP\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"NOP\", \"2DUP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"2DUP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"3DUP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"3DUP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1 2\", \"3DUP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"2OVER 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"2 3 2OVER 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"2SWAP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"2 3 2SWAP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n\n[\"'a' 'b'\", \"CAT\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"CAT disabled\"],\n[\"'a' 'b' 0\", \"IF CAT ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"CAT disabled\"],\n[\"'abc' 1 1\", \"SUBSTR\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"SUBSTR disabled\"],\n[\"'abc' 1 1 0\", \"IF SUBSTR ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"SUBSTR disabled\"],\n[\"'abc' 2 0\", \"IF LEFT ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"LEFT disabled\"],\n[\"'abc' 2 0\", \"IF RIGHT ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"RIGHT disabled\"],\n\n[\"NOP\", \"SIZE 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n\n[\"'abc'\", \"IF INVERT ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"INVERT disabled\"],\n[\"1 2 0 IF AND ELSE 1 ENDIF\", \"NOP\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"AND disabled\"],\n[\"1 2 0 IF OR ELSE 1 ENDIF\", \"NOP\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"OR disabled\"],\n[\"1 2 0 IF XOR ELSE 1 ENDIF\", \"NOP\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"XOR disabled\"],\n[\"2 0 IF 2MUL ELSE 1 ENDIF\", \"NOP\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"2MUL disabled\"],\n[\"2 0 IF 2DIV ELSE 1 ENDIF\", \"NOP\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"2DIV disabled\"],\n[\"2 2 0 IF MUL ELSE 1 ENDIF\", \"NOP\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"MUL disabled\"],\n[\"2 2 0 IF DIV ELSE 1 ENDIF\", \"NOP\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"DIV disabled\"],\n[\"2 2 0 IF MOD ELSE 1 ENDIF\", \"NOP\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"MOD disabled\"],\n[\"2 2 0 IF LSHIFT ELSE 1 ENDIF\", \"NOP\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"LSHIFT disabled\"],\n[\"2 2 0 IF RSHIFT ELSE 1 ENDIF\", \"NOP\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"RSHIFT disabled\"],\n\n[\"\", \"EQUAL NOT\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\", \"EQUAL must error when there are no stack items\"],\n[\"0\", \"EQUAL NOT\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\", \"EQUAL must error when there are not 2 stack items\"],\n[\"0 1\",\"EQUAL\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"1 1 ADD\", \"0 EQUAL\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"11 1 ADD 12 SUB\", \"11 EQUAL\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n\n[\"2147483648 0 ADD\", \"NOP\", \"P2SH,STRICTENC\", \"UNKNOWN_ERROR\", \"arithmetic operands must be in range [-2^31...2^31] \"],\n[\"-2147483648 0 ADD\", \"NOP\", \"P2SH,STRICTENC\", \"UNKNOWN_ERROR\", \"arithmetic operands must be in range [-2^31...2^31] \"],\n[\"2147483647 DUP ADD\", \"4294967294 NUMEQUAL\", \"P2SH,STRICTENC\", \"UNKNOWN_ERROR\", \"NUMEQUAL must be in numeric range\"],\n[\"'abcdef' NOT\", \"0 EQUAL\", \"P2SH,STRICTENC\", \"UNKNOWN_ERROR\", \"NOT is an arithmetic operand\"],\n\n[\"2 DUP MUL\", \"4 EQUAL\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"disabled\"],\n[\"2 DUP DIV\", \"1 EQUAL\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"disabled\"],\n[\"2 2MUL\", \"4 EQUAL\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"disabled\"],\n[\"2 2DIV\", \"1 EQUAL\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"disabled\"],\n[\"7 3 MOD\", \"1 EQUAL\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"disabled\"],\n[\"2 2 LSHIFT\", \"8 EQUAL\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"disabled\"],\n[\"2 1 RSHIFT\", \"1 EQUAL\", \"P2SH,STRICTENC\", \"DISABLED_OPCODE\", \"disabled\"],\n\n[\"1\", \"NOP1 CHECKLOCKTIMEVERIFY CHECKSEQUENCEVERIFY NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 2 EQUAL\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n[\"'NOP_1_to_10' NOP1 CHECKLOCKTIMEVERIFY CHECKSEQUENCEVERIFY NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10\",\"'NOP_1_to_11' EQUAL\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n\n[\"Ensure 100% coverage of discouraged NOPS\"],\n[\"1\", \"NOP1\",  \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\"],\n[\"1\", \"CHECKLOCKTIMEVERIFY\",  \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\"],\n[\"1\", \"CHECKSEQUENCEVERIFY\",  \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\"],\n[\"1\", \"NOP4\",  \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\"],\n[\"1\", \"NOP5\",  \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\"],\n[\"1\", \"NOP6\",  \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\"],\n[\"1\", \"NOP7\",  \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\"],\n[\"1\", \"NOP8\",  \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\"],\n[\"1\", \"NOP9\",  \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\"],\n[\"1\", \"NOP10\", \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\"],\n\n[\"NOP10\", \"1\", \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\", \"Discouraged NOP10 in scriptSig\"],\n\n[\"1 0x01 0xb9\", \"HASH160 0x14 0x15727299b05b45fdaf9ac9ecf7565cfe27c3e567 EQUAL\",\n \"P2SH,DISCOURAGE_UPGRADABLE_NOPS\", \"DISCOURAGE_UPGRADABLE_NOPS\", \"Discouraged NOP10 in redeemScript\"],\n\n[\"0x50\",\"1\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"opcode 0x50 is reserved\"],\n[\"1\", \"IF 0xba ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"opcodes above NOP10 invalid if executed\"],\n[\"1\", \"IF 0xbb ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xbc ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xbd ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xbe ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xbf ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xc0 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xc1 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xc2 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xc3 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xc4 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xc5 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xc6 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xc7 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xc8 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xc9 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xca ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xcb ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xcc ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xcd ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xce ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xcf ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xd0 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xd1 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xd2 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xd3 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xd4 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xd5 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xd6 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xd7 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xd8 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xd9 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xda ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xdb ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xdc ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xdd ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xde ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xdf ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xe0 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xe1 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xe2 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xe3 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xe4 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xe5 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xe6 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xe7 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xe8 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xe9 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xea ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xeb ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xec ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xed ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xee ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xef ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xf0 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xf1 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xf2 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xf3 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xf4 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xf5 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xf6 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xf7 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xf8 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xf9 ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xfa ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xfb ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xfc ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xfd ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xfe ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n[\"1\", \"IF 0xff ELSE 1 ENDIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\"],\n\n[\"1 IF 1 ELSE\", \"0xff ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\", \"invalid because scriptSig and scriptPubKey are processed separately\"],\n\n[\"NOP\", \"RIPEMD160\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"SHA1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"SHA256\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"HASH160\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"HASH256\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n\n[\"NOP\",\n\"'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'\",\n\"P2SH,STRICTENC\",\n\"PUSH_SIZE\",\n\">520 byte push\"],\n[\"0\",\n\"IF 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' ENDIF 1\",\n\"P2SH,STRICTENC\",\n\"PUSH_SIZE\",\n\">520 byte push in non-executed IF branch\"],\n[\"1\",\n\"0x61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\",\n\"P2SH,STRICTENC\",\n\"OP_COUNT\",\n\">201 opcodes executed. 0x61 is NOP\"],\n[\"0\",\n\"IF 0x6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161 ENDIF 1\",\n\"P2SH,STRICTENC\",\n\"OP_COUNT\",\n\">201 opcodes including non-executed IF branch. 0x61 is NOP\"],\n[\"1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f\",\n\"1 2 3 4 5 6 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f\",\n\"P2SH,STRICTENC\",\n\"STACK_SIZE\",\n\">1,000 stack size (0x6f is 3DUP)\"],\n[\"1 2 3 4 5 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f\",\n\"1 TOALTSTACK 2 TOALTSTACK 3 4 5 6 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f\",\n\"P2SH,STRICTENC\",\n\"STACK_SIZE\",\n\">1,000 stack+altstack size\"],\n[\"NOP\",\n\"0 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 0x6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f 2DUP 0x616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\",\n\"P2SH,STRICTENC\",\n\"SCRIPT_SIZE\",\n\"10,001-byte scriptPubKey\"],\n\n[\"NOP1\",\"NOP10\", \"P2SH,STRICTENC\", \"EVAL_FALSE\"],\n\n[\"1\",\"VER\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"OP_VER is reserved\"],\n[\"1\",\"VERIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"OP_VERIF is reserved\"],\n[\"1\",\"VERNOTIF\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"OP_VERNOTIF is reserved\"],\n[\"1\",\"RESERVED\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"OP_RESERVED is reserved\"],\n[\"1\",\"RESERVED1\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"OP_RESERVED1 is reserved\"],\n[\"1\",\"RESERVED2\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"OP_RESERVED2 is reserved\"],\n[\"1\",\"0xba\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"0xba == OP_NOP10 + 1\"],\n\n[\"2147483648\", \"1ADD 1\", \"P2SH,STRICTENC\", \"UNKNOWN_ERROR\", \"We cannot do math on 5-byte integers\"],\n[\"2147483648\", \"NEGATE 1\", \"P2SH,STRICTENC\", \"UNKNOWN_ERROR\", \"We cannot do math on 5-byte integers\"],\n[\"-2147483648\", \"1ADD 1\", \"P2SH,STRICTENC\", \"UNKNOWN_ERROR\", \"Because we use a sign bit, -2147483648 is also 5 bytes\"],\n[\"2147483647\", \"1ADD 1SUB 1\", \"P2SH,STRICTENC\", \"UNKNOWN_ERROR\", \"We cannot do math on 5-byte integers, even if the result is 4-bytes\"],\n[\"2147483648\", \"1SUB 1\", \"P2SH,STRICTENC\", \"UNKNOWN_ERROR\", \"We cannot do math on 5-byte integers, even if the result is 4-bytes\"],\n\n[\"2147483648 1\", \"BOOLOR 1\", \"P2SH,STRICTENC\", \"UNKNOWN_ERROR\", \"We cannot do BOOLOR on 5-byte integers (but we can still do IF etc)\"],\n[\"2147483648 1\", \"BOOLAND 1\", \"P2SH,STRICTENC\", \"UNKNOWN_ERROR\", \"We cannot do BOOLAND on 5-byte integers\"],\n\n[\"1\", \"1 ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\", \"ENDIF without IF\"],\n[\"1\", \"IF 1\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\", \"IF without ENDIF\"],\n[\"1 IF 1\", \"ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\", \"IFs don't carry over\"],\n\n[\"NOP\", \"IF 1 ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\", \"The following tests check the if(stack.size() < N) tests in each opcode\"],\n[\"NOP\", \"NOTIF 1 ENDIF\", \"P2SH,STRICTENC\", \"UNBALANCED_CONDITIONAL\", \"They are here to catch copy-and-paste errors\"],\n[\"NOP\", \"VERIFY 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\", \"Most of them are duplicated elsewhere,\"],\n\n[\"NOP\", \"TOALTSTACK 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\", \"but, hey, more is always better, right?\"],\n[\"1\", \"FROMALTSTACK\", \"P2SH,STRICTENC\", \"INVALID_ALTSTACK_OPERATION\"],\n[\"1\", \"2DROP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"2DUP\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1 1\", \"3DUP\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1 1 1\", \"2OVER\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1 1 1 1 1\", \"2ROT\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1 1 1\", \"2SWAP\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"IFDUP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"DROP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"DUP 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"NIP\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"OVER\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1 1 1 3\", \"PICK\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"0\", \"PICK 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1 1 1 3\", \"ROLL\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"0\", \"ROLL 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1 1\", \"ROT\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"SWAP\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"TUCK\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n\n[\"NOP\", \"SIZE 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n\n[\"1\", \"EQUAL 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"EQUALVERIFY 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n\n[\"NOP\", \"1ADD 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"1SUB 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"NEGATE 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"ABS 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"NOT 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"0NOTEQUAL 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n\n[\"1\", \"ADD\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"SUB\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"BOOLAND\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"BOOLOR\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"NUMEQUAL\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"NUMEQUALVERIFY 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"NUMNOTEQUAL\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"LESSTHAN\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"GREATERTHAN\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"LESSTHANOREQUAL\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"GREATERTHANOREQUAL\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"MIN\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1\", \"MAX\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"1 1\", \"WITHIN\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n\n[\"NOP\", \"RIPEMD160 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"SHA1 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"SHA256 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"HASH160 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n[\"NOP\", \"HASH256 1\", \"P2SH,STRICTENC\", \"INVALID_STACK_OPERATION\"],\n\n[\"Increase CHECKSIG and CHECKMULTISIG negative test coverage\"],\n[\"\", \"CHECKSIG NOT\", \"STRICTENC\", \"INVALID_STACK_OPERATION\", \"CHECKSIG must error when there are no stack items\"],\n[\"0\", \"CHECKSIG NOT\", \"STRICTENC\", \"INVALID_STACK_OPERATION\", \"CHECKSIG must error when there are not 2 stack items\"],\n[\"\", \"CHECKMULTISIG NOT\", \"STRICTENC\", \"INVALID_STACK_OPERATION\", \"CHECKMULTISIG must error when there are no stack items\"],\n[\"\", \"-1 CHECKMULTISIG NOT\", \"STRICTENC\", \"PUBKEY_COUNT\", \"CHECKMULTISIG must error when the specified number of pubkeys is negative\"],\n[\"\", \"1 CHECKMULTISIG NOT\", \"STRICTENC\", \"INVALID_STACK_OPERATION\", \"CHECKMULTISIG must error when there are not enough pubkeys on the stack\"],\n[\"\", \"-1 0 CHECKMULTISIG NOT\", \"STRICTENC\", \"SIG_COUNT\", \"CHECKMULTISIG must error when the specified number of signatures is negative\"],\n[\"\", \"1 'pk1' 1 CHECKMULTISIG NOT\", \"STRICTENC\", \"INVALID_STACK_OPERATION\", \"CHECKMULTISIG must error when there are not enough signatures on the stack\"],\n[\"\", \"'dummy' 'sig1' 1 'pk1' 1 CHECKMULTISIG IF 1 ENDIF\", \"\", \"EVAL_FALSE\", \"CHECKMULTISIG must push false to stack when signature is invalid when NOT in strict enc mode\"],\n\n[\"\",\n\"0 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG\",\n\"P2SH,STRICTENC\",\n\"OP_COUNT\",\n\"202 CHECKMULTISIGS, fails due to 201 op limit\"],\n\n[\"1\",\n\"0 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY 0 0 CHECKMULTISIGVERIFY\",\n\"P2SH,STRICTENC\",\n\"INVALID_STACK_OPERATION\",\n\"\"],\n\n[\"\",\n\"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIG\",\n\"P2SH,STRICTENC\",\n\"OP_COUNT\",\n\"Fails due to 201 script operation limit\"],\n\n[\"1\",\n\"NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY 0 0 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 20 CHECKMULTISIGVERIFY\",\n\"P2SH,STRICTENC\",\n\"OP_COUNT\",\n\"\"],\n\n\n[\"0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21\", \"21 CHECKMULTISIG 1\", \"P2SH,STRICTENC\", \"PUBKEY_COUNT\", \"nPubKeys > 20\"],\n[\"0 'sig' 1 0\", \"CHECKMULTISIG 1\", \"P2SH,STRICTENC\", \"SIG_COUNT\", \"nSigs > nPubKeys\"],\n\n\n[\"NOP 0x01 1\", \"HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL\", \"P2SH,STRICTENC\", \"SIG_PUSHONLY\", \"Tests for Script.IsPushOnly()\"],\n[\"NOP1 0x01 1\", \"HASH160 0x14 0xda1745e9b549bd0bfa1a569971c77eba30cd5a4b EQUAL\", \"P2SH,STRICTENC\", \"SIG_PUSHONLY\"],\n\n[\"0 0x01 0x50\", \"HASH160 0x14 0xece424a6bb6ddf4db592c0faed60685047a361b1 EQUAL\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"OP_RESERVED in P2SH should fail\"],\n[\"0 0x01 VER\", \"HASH160 0x14 0x0f4d7845db968f2a81b530b6f3c1d6246d4c7e01 EQUAL\", \"P2SH,STRICTENC\", \"BAD_OPCODE\", \"OP_VER in P2SH should fail\"],\n\n[\"0x00\", \"'00' EQUAL\", \"P2SH,STRICTENC\", \"EVAL_FALSE\", \"Basic OP_0 execution\"],\n\n[\"MINIMALDATA enforcement for PUSHDATAs\"],\n\n[\"0x4c 0x00\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\", \"Empty vector minimally represented by OP_0\"],\n[\"0x01 0x81\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\", \"-1 minimally represented by OP_1NEGATE\"],\n[\"0x01 0x01\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\", \"1 to 16 minimally represented by OP_1 to OP_16\"],\n[\"0x01 0x02\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x03\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x04\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x05\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x06\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x07\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x08\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x09\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x0a\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x0b\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x0c\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x0d\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x0e\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x0f\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n[\"0x01 0x10\", \"DROP 1\", \"MINIMALDATA\", \"MINIMALDATA\"],\n\n[\"0x4c 0x48 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\", \"DROP 1\", \"MINIMALDATA\",\n \"MINIMALDATA\",\n \"PUSHDATA1 of 72 bytes minimally represented by direct push\"],\n\n[\"0x4d 0xFF00 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\", \"DROP 1\", \"MINIMALDATA\",\n \"MINIMALDATA\",\n \"PUSHDATA2 of 255 bytes minimally represented by PUSHDATA1\"],\n\n[\"0x4e 0x00010000 0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\", \"DROP 1\", \"MINIMALDATA\",\n \"MINIMALDATA\",\n \"PUSHDATA4 of 256 bytes minimally represented by PUSHDATA2\"],\n\n[\"MINIMALDATA enforcement for numeric arguments\"],\n\n[\"0x01 0x00\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"numequals 0\"],\n[\"0x02 0x0000\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"numequals 0\"],\n[\"0x01 0x80\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"0x80 (negative zero) numequals 0\"],\n[\"0x02 0x0080\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"numequals 0\"],\n[\"0x02 0x0500\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"numequals 5\"],\n[\"0x03 0x050000\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"numequals 5\"],\n[\"0x02 0x0580\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"numequals -5\"],\n[\"0x03 0x050080\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"numequals -5\"],\n[\"0x03 0xff7f80\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"Minimal encoding is 0xffff\"],\n[\"0x03 0xff7f00\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"Minimal encoding is 0xff7f\"],\n[\"0x04 0xffff7f80\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"Minimal encoding is 0xffffff\"],\n[\"0x04 0xffff7f00\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\", \"Minimal encoding is 0xffff7f\"],\n\n[\"Test every numeric-accepting opcode for correct handling of the numeric minimal encoding rule\"],\n\n[\"1 0x02 0x0000\", \"PICK DROP\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"1 0x02 0x0000\", \"ROLL DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000\", \"1ADD DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000\", \"1SUB DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000\", \"NEGATE DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000\", \"ABS DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000\", \"NOT DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000\", \"0NOTEQUAL DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n\n[\"0 0x02 0x0000\", \"ADD DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"ADD DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"SUB DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"SUB DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"BOOLAND DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"BOOLAND DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"BOOLOR DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"BOOLOR DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"NUMEQUAL DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 1\", \"NUMEQUAL DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"NUMEQUALVERIFY 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"NUMEQUALVERIFY 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"NUMNOTEQUAL DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"NUMNOTEQUAL DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"LESSTHAN DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"LESSTHAN DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"GREATERTHAN DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"GREATERTHAN DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"LESSTHANOREQUAL DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"LESSTHANOREQUAL DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"GREATERTHANOREQUAL DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"GREATERTHANOREQUAL DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"MIN DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"MIN DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000\", \"MAX DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0x02 0x0000 0\", \"MAX DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n\n[\"0x02 0x0000 0 0\", \"WITHIN DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000 0\", \"WITHIN DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0 0x02 0x0000\", \"WITHIN DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n\n[\"0 0 0x02 0x0000\", \"CHECKMULTISIG DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000 0\", \"CHECKMULTISIG DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000 0 1\", \"CHECKMULTISIG DROP 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0 0x02 0x0000\", \"CHECKMULTISIGVERIFY 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n[\"0 0x02 0x0000 0\", \"CHECKMULTISIGVERIFY 1\", \"MINIMALDATA\", \"UNKNOWN_ERROR\"],\n\n\n[\"Order of CHECKMULTISIG evaluation tests, inverted by swapping the order of\"],\n[\"pubkeys/signatures so they fail due to the STRICTENC rules on validly encoded\"],\n[\"signatures and pubkeys.\"],\n[\n    \"0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501\",\n    \"2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0 2 CHECKMULTISIG NOT\",\n    \"STRICTENC\",\n    \"PUBKEYTYPE\",\n    \"2-of-2 CHECKMULTISIG NOT with the first pubkey invalid, and both signatures validly encoded.\"\n],\n[\n    \"0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 1\",\n    \"2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT\",\n    \"STRICTENC\",\n    \"SIG_DER\",\n    \"2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but first signature invalid.\"\n],\n[\n    \"0 0x47 0x304402205451ce65ad844dbb978b8bdedf5082e33b43cae8279c30f2c74d9e9ee49a94f802203fe95a7ccf74da7a232ee523ef4a53cb4d14bdd16289680cdb97a63819b8f42f01 0x46 0x304402205451ce65ad844dbb978b8bdedf5082e33b43cae8279c30f2c74d9e9ee49a94f802203fe95a7ccf74da7a232ee523ef4a53cb4d14bdd16289680cdb97a63819b8f42f\",\n    \"2 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 3 CHECKMULTISIG\",\n    \"P2SH,STRICTENC\",\n    \"SIG_DER\",\n    \"2-of-3 with one valid and one invalid signature due to parse error, nSigs > validSigs\"\n],\n\n[\"Increase DERSIG test coverage\"],\n[\"0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"0 CHECKSIG NOT\", \"DERSIG\", \"SIG_DER\", \"Overly long signature is incorrectly encoded for DERSIG\"],\n[\"0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000\", \"0 CHECKSIG NOT\", \"DERSIG\", \"SIG_DER\", \"Missing S is incorrectly encoded for DERSIG\"],\n[\"0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701\", \"0 CHECKSIG NOT\", \"DERSIG\", \"SIG_DER\", \"S with invalid S length is incorrectly encoded for DERSIG\"],\n[\"0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701\", \"0 CHECKSIG NOT\", \"DERSIG\", \"SIG_DER\", \"Non-integer R is incorrectly encoded for DERSIG\"],\n[\"0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701\", \"0 CHECKSIG NOT\", \"DERSIG\", \"SIG_DER\", \"Non-integer S is incorrectly encoded for DERSIG\"],\n[\"0x17 0x3014020002107777777777777777777777777777777701\", \"0 CHECKSIG NOT\", \"DERSIG\", \"SIG_DER\", \"Zero-length R is incorrectly encoded for DERSIG\"],\n[\"0x17 0x3014021077777777777777777777777777777777020001\", \"0 CHECKSIG NOT\", \"DERSIG\", \"SIG_DER\", \"Zero-length S is incorrectly encoded for DERSIG\"],\n[\"0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701\", \"0 CHECKSIG NOT\", \"DERSIG\", \"SIG_DER\", \"Negative S is incorrectly encoded for DERSIG\"],\n\n[\"Some basic segwit checks\"],\n[[\"00\", 0.00000000 ], \"\", \"0 0x206e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d\", \"P2SH,WITNESS\", \"EVAL_FALSE\", \"Invalid witness script\"],\n[[\"51\", 0.00000000 ], \"\", \"0 0x206e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d\", \"P2SH,WITNESS\", \"WITNESS_PROGRAM_MISMATCH\", \"Witness script hash mismatch\"],\n[[\"00\", 0.00000000 ], \"\", \"0 0x206e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d\", \"\", \"OK\", \"Invalid witness script without WITNESS\"],\n[[\"51\", 0.00000000 ], \"\", \"0 0x206e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d\", \"\", \"OK\", \"Witness script hash mismatch without WITNESS\"],\n\n[\"Automatically generated test cases\"],\n[\n    \"0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001\",\n    \"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"P2PK\"\n],\n[\n    \"0x47 0x304402200a5c6163f07b8c3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001\",\n    \"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG\",\n    \"\",\n    \"EVAL_FALSE\",\n    \"P2PK, bad sig\"\n],\n[\n    \"0x47 0x304402206e05a6fe23c59196ffe176c9ddc31e73a9885638f9d1328d47c0c703863b8876022076feb53811aa5b04e0e79f938eb19906cc5e67548bc555a8e8b8b0fc603d840c01 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508\",\n    \"DUP HASH160 0x14 0x1018853670f9f3b0582c5b9ee8ce93764ac32b93 EQUALVERIFY CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"P2PKH\"\n],\n[\n    \"0x47 0x3044022034bb0494b50b8ef130e2185bb220265b9284ef5b4b8a8da4d8415df489c83b5102206259a26d9cc0a125ac26af6153b17c02956855ebe1467412f066e402f5f05d1201 0x21 0x03363d90d446b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640\",\n    \"DUP HASH160 0x14 0xc0834c0c158f53be706d234c38fd52de7eece656 EQUALVERIFY CHECKSIG\",\n    \"\",\n    \"EQUALVERIFY\",\n    \"P2PKH, bad pubkey\"\n],\n[\n    \"0x47 0x304402204710a85181663b32d25c70ec2bbd14adff5ddfff6cb50d09e155ef5f541fc86c0220056b0cc949be9386ecc5f6c2ac0493269031dbb185781db90171b54ac127790281\",\n    \"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"P2PK anyonecanpay\"\n],\n[\n    \"0x47 0x304402204710a85181663b32d25c70ec2bbd14adff5ddfff6cb50d09e155ef5f541fc86c0220056b0cc949be9386ecc5f6c2ac0493269031dbb185781db90171b54ac127790201\",\n    \"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG\",\n    \"\",\n    \"EVAL_FALSE\",\n    \"P2PK anyonecanpay marked with normal hashtype\"\n],\n[\n    \"0x47 0x3044022003fef42ed6c7be8917441218f525a60e2431be978e28b7aca4d7a532cc413ae8022067a1f82c74e8d69291b90d148778405c6257bbcfc2353cc38a3e1f22bf44254601 0x23 0x210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\",\n    \"HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL\",\n    \"P2SH\",\n    \"OK\",\n    \"P2SH(P2PK)\"\n],\n[\n    \"0x47 0x3044022003fef42ed6c7be8917441218f525a60e2431be978e28b7aca4d7a532cc413ae8022067a1f82c74e8d69291b90d148778405c6257bbcfc2353cc38a3e1f22bf44254601 0x23 0x210279be667ef9dcbbac54a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\",\n    \"HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL\",\n    \"P2SH\",\n    \"EVAL_FALSE\",\n    \"P2SH(P2PK), bad redeemscript\"\n],\n[\n    \"0x47 0x30440220781ba4f59a7b207a10db87628bc2168df4d59b844b397d2dbc9a5835fb2f2b7602206ed8fbcc1072fe2dfc5bb25909269e5dc42ffcae7ec2bc81d59692210ff30c2b01 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x19 0x76a91491b24bf9f5288532960ac687abb035127b1d28a588ac\",\n    \"HASH160 0x14 0x7f67f0521934a57d3039f77f9f32cf313f3ac74b EQUAL\",\n    \"P2SH\",\n    \"OK\",\n    \"P2SH(P2PKH)\"\n],\n[\n    \"0x47 0x304402204e2eb034be7b089534ac9e798cf6a2c79f38bcb34d1b179efd6f2de0841735db022071461beb056b5a7be1819da6a3e3ce3662831ecc298419ca101eb6887b5dd6a401 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac\",\n    \"HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL\",\n    \"\",\n    \"OK\",\n    \"P2SH(P2PKH), bad sig but no VERIFY_P2SH\"\n],\n[\n    \"0x47 0x304402204e2eb034be7b089534ac9e798cf6a2c79f38bcb34d1b179efd6f2de0841735db022071461beb056b5a7be1819da6a3e3ce3662831ecc298419ca101eb6887b5dd6a401 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac\",\n    \"HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL\",\n    \"P2SH\",\n    \"EQUALVERIFY\",\n    \"P2SH(P2PKH), bad sig\"\n],\n[\n    \"0 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901\",\n    \"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG\",\n    \"\",\n    \"OK\",\n    \"3-of-3\"\n],\n[\n    \"0 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0\",\n    \"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG\",\n    \"\",\n    \"EVAL_FALSE\",\n    \"3-of-3, 2 sigs\"\n],\n[\n    \"0 0x47 0x304402205b7d2c2f177ae76cfbbf14d589c113b0b35db753d305d5562dd0b61cbf366cfb02202e56f93c4f08a27f986cd424ffc48a462c3202c4902104d4d0ff98ed28f4bf8001 0x47 0x30440220563e5b3b1fc11662a84bc5ea2a32cc3819703254060ba30d639a1aaf2d5068ad0220601c1f47ddc76d93284dd9ed68f7c9974c4a0ea7cbe8a247d6bc3878567a5fca01 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae\",\n    \"HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL\",\n    \"P2SH\",\n    \"OK\",\n    \"P2SH(2-of-3)\"\n],\n[\n    \"0 0x47 0x304402205b7d2c2f177ae76cfbbf14d589c113b0b35db753d305d5562dd0b61cbf366cfb02202e56f93c4f08a27f986cd424ffc48a462c3202c4902104d4d0ff98ed28f4bf8001 0 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae\",\n    \"HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL\",\n    \"P2SH\",\n    \"EVAL_FALSE\",\n    \"P2SH(2-of-3), 1 sig\"\n],\n[\n    \"0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"P2PK with too much R padding but no DERSIG\"\n],\n[\n    \"0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"P2PK with too much R padding\"\n],\n[\n    \"0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"P2PK with too much S padding but no DERSIG\"\n],\n[\n    \"0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"P2PK with too much S padding\"\n],\n[\n    \"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"P2PK with too little R padding but no DERSIG\"\n],\n[\n    \"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"P2PK with too little R padding\"\n],\n[\n    \"0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601\",\n    \"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT\",\n    \"\",\n    \"OK\",\n    \"P2PK NOT with bad sig with too much R padding but no DERSIG\"\n],\n[\n    \"0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601\",\n    \"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"P2PK NOT with bad sig with too much R padding\"\n],\n[\n    \"0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601\",\n    \"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT\",\n    \"\",\n    \"EVAL_FALSE\",\n    \"P2PK NOT with too much R padding but no DERSIG\"\n],\n[\n    \"0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601\",\n    \"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"P2PK NOT with too much R padding\"\n],\n[\n    \"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"BIP66 example 1, without DERSIG\"\n],\n[\n    \"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"BIP66 example 1, with DERSIG\"\n],\n[\n    \"0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT\",\n    \"\",\n    \"EVAL_FALSE\",\n    \"BIP66 example 2, without DERSIG\"\n],\n[\n    \"0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"BIP66 example 2, with DERSIG\"\n],\n[\n    \"0\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"\",\n    \"EVAL_FALSE\",\n    \"BIP66 example 3, without DERSIG\"\n],\n[\n    \"0\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"DERSIG\",\n    \"EVAL_FALSE\",\n    \"BIP66 example 3, with DERSIG\"\n],\n[\n    \"0\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT\",\n    \"\",\n    \"OK\",\n    \"BIP66 example 4, without DERSIG\"\n],\n[\n    \"0\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT\",\n    \"DERSIG\",\n    \"OK\",\n    \"BIP66 example 4, with DERSIG\"\n],\n[\n    \"0x09 0x300602010102010101\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT\",\n    \"DERSIG\",\n    \"OK\",\n    \"BIP66 example 4, with DERSIG, non-null DER-compliant signature\"\n],\n[\n    \"0\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT\",\n    \"DERSIG,NULLFAIL\",\n    \"OK\",\n    \"BIP66 example 4, with DERSIG and NULLFAIL\"\n],\n[\n    \"0x09 0x300602010102010101\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT\",\n    \"DERSIG,NULLFAIL\",\n    \"NULLFAIL\",\n    \"BIP66 example 4, with DERSIG and NULLFAIL, non-null DER-compliant signature\"\n],\n[\n    \"1\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"\",\n    \"EVAL_FALSE\",\n    \"BIP66 example 5, without DERSIG\"\n],\n[\n    \"1\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"BIP66 example 5, with DERSIG\"\n],\n[\n    \"1\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT\",\n    \"\",\n    \"OK\",\n    \"BIP66 example 6, without DERSIG\"\n],\n[\n    \"1\",\n    \"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"BIP66 example 6, with DERSIG\"\n],\n[\n    \"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG\",\n    \"\",\n    \"OK\",\n    \"BIP66 example 7, without DERSIG\"\n],\n[\n    \"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"BIP66 example 7, with DERSIG\"\n],\n[\n    \"0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT\",\n    \"\",\n    \"EVAL_FALSE\",\n    \"BIP66 example 8, without DERSIG\"\n],\n[\n    \"0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"BIP66 example 8, with DERSIG\"\n],\n[\n    \"0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG\",\n    \"\",\n    \"EVAL_FALSE\",\n    \"BIP66 example 9, without DERSIG\"\n],\n[\n    \"0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"BIP66 example 9, with DERSIG\"\n],\n[\n    \"0 0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT\",\n    \"\",\n    \"OK\",\n    \"BIP66 example 10, without DERSIG\"\n],\n[\n    \"0 0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"BIP66 example 10, with DERSIG\"\n],\n[\n    \"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG\",\n    \"\",\n    \"EVAL_FALSE\",\n    \"BIP66 example 11, without DERSIG\"\n],\n[\n    \"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG\",\n    \"DERSIG\",\n    \"EVAL_FALSE\",\n    \"BIP66 example 11, with DERSIG\"\n],\n[\n    \"0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT\",\n    \"\",\n    \"OK\",\n    \"BIP66 example 12, without DERSIG\"\n],\n[\n    \"0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT\",\n    \"DERSIG\",\n    \"OK\",\n    \"BIP66 example 12, with DERSIG\"\n],\n[\n    \"0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101\",\n    \"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"P2PK with multi-byte hashtype, without DERSIG\"\n],\n[\n    \"0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101\",\n    \"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG\",\n    \"DERSIG\",\n    \"SIG_DER\",\n    \"P2PK with multi-byte hashtype, with DERSIG\"\n],\n[\n    \"0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001\",\n    \"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"P2PK with high S but no LOW_S\"\n],\n[\n    \"0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001\",\n    \"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG\",\n    \"LOW_S\",\n    \"SIG_HIGH_S\",\n    \"P2PK with high S\"\n],\n[\n    \"0x47 0x3044022057292e2d4dfe775becdd0a9e6547997c728cdf35390f6a017da56d654d374e4902206b643be2fc53763b4e284845bfea2c597d2dc7759941dce937636c9d341b71ed01\",\n    \"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"P2PK with hybrid pubkey but no STRICTENC\"\n],\n[\n    \"0x47 0x3044022057292e2d4dfe775becdd0a9e6547997c728cdf35390f6a017da56d654d374e4902206b643be2fc53763b4e284845bfea2c597d2dc7759941dce937636c9d341b71ed01\",\n    \"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG\",\n    \"STRICTENC\",\n    \"PUBKEYTYPE\",\n    \"P2PK with hybrid pubkey\"\n],\n[\n    \"0x47 0x30440220035d554e3153c14950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101\",\n    \"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT\",\n    \"\",\n    \"EVAL_FALSE\",\n    \"P2PK NOT with hybrid pubkey but no STRICTENC\"\n],\n[\n    \"0x47 0x30440220035d554e3153c14950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101\",\n    \"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT\",\n    \"STRICTENC\",\n    \"PUBKEYTYPE\",\n    \"P2PK NOT with hybrid pubkey\"\n],\n[\n    \"0x47 0x30440220035d554e3153c04950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101\",\n    \"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT\",\n    \"\",\n    \"OK\",\n    \"P2PK NOT with invalid hybrid pubkey but no STRICTENC\"\n],\n[\n    \"0x47 0x30440220035d554e3153c04950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101\",\n    \"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT\",\n    \"STRICTENC\",\n    \"PUBKEYTYPE\",\n    \"P2PK NOT with invalid hybrid pubkey\"\n],\n[\n    \"0 0x47 0x304402202e79441ad1baf5a07fb86bae3753184f6717d9692680947ea8b6e8b777c69af1022079a262e13d868bb5a0964fefe3ba26942e1b0669af1afb55ef3344bc9d4fc4c401\",\n    \"1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG\",\n    \"\",\n    \"OK\",\n    \"1-of-2 with the second 1 hybrid pubkey and no STRICTENC\"\n],\n[\n    \"0 0x47 0x304402202e79441ad1baf5a07fb86bae3753184f6717d9692680947ea8b6e8b777c69af1022079a262e13d868bb5a0964fefe3ba26942e1b0669af1afb55ef3344bc9d4fc4c401\",\n    \"1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG\",\n    \"STRICTENC\",\n    \"OK\",\n    \"1-of-2 with the second 1 hybrid pubkey\"\n],\n[\n    \"0 0x47 0x3044022079c7824d6c868e0e1a273484e28c2654a27d043c8a27f49f52cb72efed0759090220452bbbf7089574fa082095a4fc1b3a16bafcf97a3a34d745fafc922cce66b27201\",\n    \"1 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 2 CHECKMULTISIG\",\n    \"STRICTENC\",\n    \"PUBKEYTYPE\",\n    \"1-of-2 with the first 1 hybrid pubkey\"\n],\n[\n    \"0x47 0x304402206177d513ec2cda444c021a1f4f656fc4c72ba108ae063e157eb86dc3575784940220666fc66702815d0e5413bb9b1df22aed44f5f1efb8b99d41dd5dc9a5be6d205205\",\n    \"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"P2PK with undefined hashtype but no STRICTENC\"\n],\n[\n    \"0x47 0x304402206177d513ec2cda444c021a1f4f656fc4c72ba108ae063e157eb86dc3575784940220666fc66702815d0e5413bb9b1df22aed44f5f1efb8b99d41dd5dc9a5be6d205205\",\n    \"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG\",\n    \"STRICTENC\",\n    \"SIG_HASHTYPE\",\n    \"P2PK with undefined hashtype\"\n],\n[\n    \"0x47 0x304402207409b5b320296e5e2136a7b281a7f803028ca4ca44e2b83eebd46932677725de02202d4eea1c8d3c98e6f42614f54764e6e5e6542e213eb4d079737e9a8b6e9812ec05\",\n    \"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT\",\n    \"\",\n    \"OK\",\n    \"P2PK NOT with invalid sig and undefined hashtype but no STRICTENC\"\n],\n[\n    \"0x47 0x304402207409b5b320296e5e2136a7b281a7f803028ca4ca44e2b83eebd46932677725de02202d4eea1c8d3c98e6f42614f54764e6e5e6542e213eb4d079737e9a8b6e9812ec05\",\n    \"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT\",\n    \"STRICTENC\",\n    \"SIG_HASHTYPE\",\n    \"P2PK NOT with invalid sig and undefined hashtype\"\n],\n[\n    \"1 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901\",\n    \"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG\",\n    \"\",\n    \"OK\",\n    \"3-of-3 with nonzero dummy but no NULLDUMMY\"\n],\n[\n    \"1 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901\",\n    \"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG\",\n    \"NULLDUMMY\",\n    \"SIG_NULLDUMMY\",\n    \"3-of-3 with nonzero dummy\"\n],\n[\n    \"1 0x47 0x304402201bb2edab700a5d020236df174fefed78087697143731f659bea59642c759c16d022061f42cdbae5bcd3e8790f20bf76687443436e94a634321c16a72aa54cbc7c2ea01 0x47 0x304402204bb4a64f2a6e5c7fb2f07fef85ee56fde5e6da234c6a984262307a20e99842d702206f8303aaba5e625d223897e2ffd3f88ef1bcffef55f38dc3768e5f2e94c923f901 0x47 0x3044022040c2809b71fffb155ec8b82fe7a27f666bd97f941207be4e14ade85a1249dd4d02204d56c85ec525dd18e29a0533d5ddf61b6b1bb32980c2f63edf951aebf7a27bfe01\",\n    \"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG NOT\",\n    \"\",\n    \"OK\",\n    \"3-of-3 NOT with invalid sig and nonzero dummy but no NULLDUMMY\"\n],\n[\n    \"1 0x47 0x304402201bb2edab700a5d020236df174fefed78087697143731f659bea59642c759c16d022061f42cdbae5bcd3e8790f20bf76687443436e94a634321c16a72aa54cbc7c2ea01 0x47 0x304402204bb4a64f2a6e5c7fb2f07fef85ee56fde5e6da234c6a984262307a20e99842d702206f8303aaba5e625d223897e2ffd3f88ef1bcffef55f38dc3768e5f2e94c923f901 0x47 0x3044022040c2809b71fffb155ec8b82fe7a27f666bd97f941207be4e14ade85a1249dd4d02204d56c85ec525dd18e29a0533d5ddf61b6b1bb32980c2f63edf951aebf7a27bfe01\",\n    \"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG NOT\",\n    \"NULLDUMMY\",\n    \"SIG_NULLDUMMY\",\n    \"3-of-3 NOT with invalid sig with nonzero dummy\"\n],\n[\n    \"0 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 DUP\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG\",\n    \"\",\n    \"OK\",\n    \"2-of-2 with two identical keys and sigs pushed using OP_DUP but no SIGPUSHONLY\"\n],\n[\n    \"0 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 DUP\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG\",\n    \"SIGPUSHONLY\",\n    \"SIG_PUSHONLY\",\n    \"2-of-2 with two identical keys and sigs pushed using OP_DUP\"\n],\n[\n    \"0x47 0x3044022018a2a81a93add5cb5f5da76305718e4ea66045ec4888b28d84cb22fae7f4645b02201e6daa5ed5d2e4b2b2027cf7ffd43d8d9844dd49f74ef86899ec8e669dfd39aa01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac\",\n    \"HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL\",\n    \"\",\n    \"OK\",\n    \"P2SH(P2PK) with non-push scriptSig but no P2SH or SIGPUSHONLY\"\n],\n[\n    \"0x47 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb125101 NOP8\",\n    \"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG\",\n    \"\",\n    \"OK\",\n    \"P2PK with non-push scriptSig but with P2SH validation\"\n],\n[\n    \"0x47 0x3044022018a2a81a93add5cb5f5da76305718e4ea66045ec4888b28d84cb22fae7f4645b02201e6daa5ed5d2e4b2b2027cf7ffd43d8d9844dd49f74ef86899ec8e669dfd39aa01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac\",\n    \"HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL\",\n    \"P2SH\",\n    \"SIG_PUSHONLY\",\n    \"P2SH(P2PK) with non-push scriptSig but no SIGPUSHONLY\"\n],\n[\n    \"0x47 0x3044022018a2a81a93add5cb5f5da76305718e4ea66045ec4888b28d84cb22fae7f4645b02201e6daa5ed5d2e4b2b2027cf7ffd43d8d9844dd49f74ef86899ec8e669dfd39aa01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac\",\n    \"HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL\",\n    \"SIGPUSHONLY\",\n    \"SIG_PUSHONLY\",\n    \"P2SH(P2PK) with non-push scriptSig but not P2SH\"\n],\n[\n    \"0 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901\",\n    \"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG\",\n    \"SIGPUSHONLY\",\n    \"OK\",\n    \"2-of-2 with two identical keys and sigs pushed\"\n],\n[\n    \"11 0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001\",\n    \"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG\",\n    \"P2SH\",\n    \"OK\",\n    \"P2PK with unnecessary input but no CLEANSTACK\"\n],\n[\n    \"11 0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001\",\n    \"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG\",\n    \"CLEANSTACK,P2SH\",\n    \"CLEANSTACK\",\n    \"P2PK with unnecessary input\"\n],\n[\n    \"11 0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac\",\n    \"HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL\",\n    \"P2SH\",\n    \"OK\",\n    \"P2SH with unnecessary input but no CLEANSTACK\"\n],\n[\n    \"11 0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac\",\n    \"HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL\",\n    \"CLEANSTACK,P2SH\",\n    \"CLEANSTACK\",\n    \"P2SH with unnecessary input\"\n],\n[\n    \"0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac\",\n    \"HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL\",\n    \"CLEANSTACK,P2SH\",\n    \"OK\",\n    \"P2SH with CLEANSTACK\"\n],\n\n[\"Testing with uncompressed keys in witness v0 without WITNESS_PUBKEYTYPE\"],\n[\n    [\n        \"304402200d461c140cfdfcf36b94961db57ae8c18d1cb80e9d95a9e47ac22470c1bf125502201c8dc1cbfef6a3ef90acbbb992ca22fe9466ee6f9d4898eda277a7ac3ab4b25101\",\n        \"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"Basic P2WSH\"\n],\n[\n    [\n        \"304402201e7216e5ccb3b61d46946ec6cc7e8c4e0117d13ac2fd4b152197e4805191c74202203e9903e33e84d9ee1dd13fb057afb7ccfb47006c23f6a067185efbc9dd780fc501\",\n        \"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"Basic P2WPKH\"\n],\n[\n    [\n        \"3044022066e02c19a513049d49349cf5311a1b012b7c4fae023795a18ab1d91c23496c22022025e216342c8e07ce8ef51e8daee88f84306a9de66236cab230bb63067ded1ad301\",\n        \"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac\",\n        0.00000001\n    ],\n    \"0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64\",\n    \"HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"Basic P2SH(P2WSH)\"\n],\n[\n    [\n        \"304402200929d11561cd958460371200f82e9cae64c727a495715a31828e27a7ad57b36d0220361732ced04a6f97351ecca21a56d0b8cd4932c1da1f8f569a2b68e5e48aed7801\",\n        \"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        0.00000001\n    ],\n    \"0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5\",\n    \"HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"Basic P2SH(P2WPKH)\"\n],\n[\n    [\n        \"304402202589f0512cb2408fb08ed9bd24f85eb3059744d9e4f2262d0b7f1338cff6e8b902206c0978f449693e0578c71bc543b11079fd0baae700ee5e9a6bee94db490af9fc01\",\n        \"41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac\",\n        0.00000000\n    ],\n    \"\",\n    \"0 0x20 0xac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610\",\n    \"P2SH,WITNESS\",\n    \"EVAL_FALSE\",\n    \"Basic P2WSH with the wrong key\"\n],\n[\n    [\n        \"304402206ef7fdb2986325d37c6eb1a8bb24aeb46dede112ed8fc76c7d7500b9b83c0d3d02201edc2322c794fe2d6b0bd73ed319e714aa9b86d8891961530d5c9b7156b60d4e01\",\n        \"048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf\",\n        0.00000000\n    ],\n    \"\",\n    \"0 0x14 0x7cf9c846cd4882efec4bf07e44ebdad495c94f4b\",\n    \"P2SH,WITNESS\",\n    \"EVAL_FALSE\",\n    \"Basic P2WPKH with the wrong key\"\n],\n[\n    [\n        \"30440220069ea3581afaf8187f63feee1fd2bd1f9c0dc71ea7d6e8a8b07ee2ebcf824bf402201a4fdef4c532eae59223be1eda6a397fc835142d4ddc6c74f4aa85b766a5c16f01\",\n        \"41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac\",\n        0.00000000\n    ],\n    \"0x22 0x0020ac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610\",\n    \"HASH160 0x14 0x61039a003883787c0d6ebc66d97fdabe8e31449d EQUAL\",\n    \"P2SH,WITNESS\",\n    \"EVAL_FALSE\",\n    \"Basic P2SH(P2WSH) with the wrong key\"\n],\n[\n    [\n        \"304402204209e49457c2358f80d0256bc24535b8754c14d08840fc4be762d6f5a0aed80b02202eaf7d8fc8d62f60c67adcd99295528d0e491ae93c195cec5a67e7a09532a88001\",\n        \"048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf\",\n        0.00000000\n    ],\n    \"0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b\",\n    \"HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL\",\n    \"P2SH,WITNESS\",\n    \"EVAL_FALSE\",\n    \"Basic P2SH(P2WPKH) with the wrong key\"\n],\n[\n    [\n        \"304402202589f0512cb2408fb08ed9bd24f85eb3059744d9e4f2262d0b7f1338cff6e8b902206c0978f449693e0578c71bc543b11079fd0baae700ee5e9a6bee94db490af9fc01\",\n        \"41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac\",\n        0.00000000\n    ],\n    \"\",\n    \"0 0x20 0xac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610\",\n    \"P2SH\",\n    \"OK\",\n    \"Basic P2WSH with the wrong key but no WITNESS\"\n],\n[\n    [\n        \"304402206ef7fdb2986325d37c6eb1a8bb24aeb46dede112ed8fc76c7d7500b9b83c0d3d02201edc2322c794fe2d6b0bd73ed319e714aa9b86d8891961530d5c9b7156b60d4e01\",\n        \"048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf\",\n        0.00000000\n    ],\n    \"\",\n    \"0 0x14 0x7cf9c846cd4882efec4bf07e44ebdad495c94f4b\",\n    \"P2SH\",\n    \"OK\",\n    \"Basic P2WPKH with the wrong key but no WITNESS\"\n],\n[\n    [\n        \"30440220069ea3581afaf8187f63feee1fd2bd1f9c0dc71ea7d6e8a8b07ee2ebcf824bf402201a4fdef4c532eae59223be1eda6a397fc835142d4ddc6c74f4aa85b766a5c16f01\",\n        \"41048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26cafac\",\n        0.00000000\n    ],\n    \"0x22 0x0020ac8ebd9e52c17619a381fa4f71aebb696087c6ef17c960fd0587addad99c0610\",\n    \"HASH160 0x14 0x61039a003883787c0d6ebc66d97fdabe8e31449d EQUAL\",\n    \"P2SH\",\n    \"OK\",\n    \"Basic P2SH(P2WSH) with the wrong key but no WITNESS\"\n],\n[\n    [\n        \"304402204209e49457c2358f80d0256bc24535b8754c14d08840fc4be762d6f5a0aed80b02202eaf7d8fc8d62f60c67adcd99295528d0e491ae93c195cec5a67e7a09532a88001\",\n        \"048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf\",\n        0.00000000\n    ],\n    \"0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b\",\n    \"HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL\",\n    \"P2SH\",\n    \"OK\",\n    \"Basic P2SH(P2WPKH) with the wrong key but no WITNESS\"\n],\n[\n    [\n        \"3044022066faa86e74e8b30e82691b985b373de4f9e26dc144ec399c4f066aa59308e7c202204712b86f28c32503faa051dbeabff2c238ece861abc36c5e0b40b1139ca222f001\",\n        \"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac\",\n        0.00000000\n    ],\n    \"\",\n    \"0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64\",\n    \"P2SH,WITNESS\",\n    \"EVAL_FALSE\",\n    \"Basic P2WSH with wrong value\"\n],\n[\n    [\n        \"304402203b3389b87448d7dfdb5e82fb854fcf92d7925f9938ea5444e36abef02c3d6a9602202410bc3265049abb07fd2e252c65ab7034d95c9d5acccabe9fadbdc63a52712601\",\n        \"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        0.00000000\n    ],\n    \"\",\n    \"0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5\",\n    \"P2SH,WITNESS\",\n    \"EVAL_FALSE\",\n    \"Basic P2WPKH with wrong value\"\n],\n[\n    [\n        \"3044022000a30c4cfc10e4387be528613575434826ad3c15587475e0df8ce3b1746aa210022008149265e4f8e9dafe1f3ea50d90cb425e9e40ea7ebdd383069a7cfa2b77004701\",\n        \"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac\",\n        0.00000000\n    ],\n    \"0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64\",\n    \"HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL\",\n    \"P2SH,WITNESS\",\n    \"EVAL_FALSE\",\n    \"Basic P2SH(P2WSH) with wrong value\"\n],\n[\n    [\n        \"304402204fc3a2cd61a47913f2a5f9107d0ad4a504c7b31ee2d6b3b2f38c2b10ee031e940220055d58b7c3c281aaa381d8f486ac0f3e361939acfd568046cb6a311cdfa974cf01\",\n        \"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        0.00000000\n    ],\n    \"0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5\",\n    \"HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL\",\n    \"P2SH,WITNESS\",\n    \"EVAL_FALSE\",\n    \"Basic P2SH(P2WPKH) with wrong value\"\n],\n[\n    [\n        \"304402205ae57ae0534c05ca9981c8a6cdf353b505eaacb7375f96681a2d1a4ba6f02f84022056248e68643b7d8ce7c7d128c9f1f348bcab8be15d094ad5cadd24251a28df8001\",\n        \"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        0.00000000\n    ],\n    \"\",\n    \"1 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5\",\n    \"DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM,P2SH,WITNESS\",\n    \"DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM\",\n    \"P2WPKH with future witness version\"\n],\n[\n    [\n        \"3044022064100ca0e2a33332136775a86cd83d0230e58b9aebb889c5ac952abff79a46ef02205f1bf900e022039ad3091bdaf27ac2aef3eae9ed9f190d821d3e508405b9513101\",\n        \"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        0.00000000\n    ],\n    \"\",\n    \"0 0x1f 0xb34b78da162751647974d5cb7410aa428ad339dbf7d1e16e833f68a0cbf1c3\",\n    \"P2SH,WITNESS\",\n    \"WITNESS_PROGRAM_WRONG_LENGTH\",\n    \"P2WPKH with wrong witness program length\"\n],\n[\n    \"\",\n    \"0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64\",\n    \"P2SH,WITNESS\",\n    \"WITNESS_PROGRAM_WITNESS_EMPTY\",\n    \"P2WSH with empty witness\"\n],\n[\n    [\n        \"3044022039105b995a5f448639a997a5c90fda06f50b49df30c3bdb6663217bf79323db002206fecd54269dec569fcc517178880eb58bb40f381a282bb75766ff3637d5f4b4301\",\n        \"400479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac\",\n        0.00000000\n    ],\n    \"\",\n    \"0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64\",\n    \"P2SH,WITNESS\",\n    \"WITNESS_PROGRAM_MISMATCH\",\n    \"P2WSH with witness program mismatch\"\n],\n[\n    [\n        \"304402201a96950593cb0af32d080b0f193517f4559241a8ebd1e95e414533ad64a3f423022047f4f6d3095c23235bdff3aeff480d0529c027a3f093cb265b7cbf148553b85101\",\n        \"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        \"\",\n        0.00000000\n    ],\n    \"\",\n    \"0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5\",\n    \"P2SH,WITNESS\",\n    \"WITNESS_PROGRAM_MISMATCH\",\n    \"P2WPKH with witness program mismatch\"\n],\n[\n    [\n        \"304402201a96950593cb0af32d080b0f193517f4559241a8ebd1e95e414533ad64a3f423022047f4f6d3095c23235bdff3aeff480d0529c027a3f093cb265b7cbf148553b85101\",\n        \"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        0.00000000\n    ],\n    \"11\",\n    \"0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5\",\n    \"P2SH,WITNESS\",\n    \"WITNESS_MALLEATED\",\n    \"P2WPKH with non-empty scriptSig\"\n],\n[\n    [\n        \"304402204209e49457c2358f80d0256bc24535b8754c14d08840fc4be762d6f5a0aed80b02202eaf7d8fc8d62f60c67adcd99295528d0e491ae93c195cec5a67e7a09532a88001\",\n        \"048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf\",\n        0.00000000\n    ],\n    \"11 0x16 0x00147cf9c846cd4882efec4bf07e44ebdad495c94f4b\",\n    \"HASH160 0x14 0x4e0c2aed91315303fc6a1dc4c7bc21c88f75402e EQUAL\",\n    \"P2SH,WITNESS\",\n    \"WITNESS_MALLEATED_P2SH\",\n    \"P2SH(P2WPKH) with superfluous push in scriptSig\"\n],\n[\n    [\n        \"\",\n        0.00000000\n    ],\n    \"0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001\",\n    \"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG\",\n    \"P2SH,WITNESS\",\n    \"WITNESS_UNEXPECTED\",\n    \"P2PK with witness\"\n],\n\n[\"Testing with compressed keys in witness v0 with WITNESS_PUBKEYTYPE\"],\n[\n    [\n        \"304402204256146fcf8e73b0fd817ffa2a4e408ff0418ff987dd08a4f485b62546f6c43c02203f3c8c3e2febc051e1222867f5f9d0eaf039d6792911c10940aa3cc74123378e01\",\n        \"210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0x1863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"OK\",\n    \"Basic P2WSH with compressed key\"\n],\n[\n    [\n        \"304402204edf27486f11432466b744df533e1acac727e0c83e5f912eb289a3df5bf8035f022075809fdd876ede40ad21667eba8b7e96394938f9c9c50f11b6a1280cce2cea8601\",\n        \"0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x14 0x751e76e8199196d454941c45d1b3a323f1433bd6\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"OK\",\n    \"Basic P2WPKH with compressed key\"\n],\n[\n    [\n        \"304402203a549090cc46bce1e5e95c4922ea2c12747988e0207b04c42f81cdbe87bb1539022050f57a245b875fd5119c419aaf050bcdf41384f0765f04b809e5bced1fe7093d01\",\n        \"210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\",\n        0.00000001\n    ],\n    \"0x22 0x00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262\",\n    \"HASH160 0x14 0xe4300531190587e3880d4c3004f5355d88ff928d EQUAL\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"OK\",\n    \"Basic P2SH(P2WSH) with compressed key\"\n],\n[\n    [\n        \"304402201bc0d53046827f4a35a3166e33e3b3366c4085540dc383b95d21ed2ab11e368a0220333e78c6231214f5f8e59621e15d7eeab0d4e4d0796437e00bfbd2680c5f9c1701\",\n        \"0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\n        0.00000001\n    ],\n    \"0x16 0x0014751e76e8199196d454941c45d1b3a323f1433bd6\",\n    \"HASH160 0x14 0xbcfeb728b584253d5f3f70bcb780e9ef218a68f4 EQUAL\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"OK\",\n    \"Basic P2SH(P2WPKH) with compressed key\"\n],\n\n[\"Testing with uncompressed keys in witness v0 with WITNESS_PUBKEYTYPE\"],\n[\n    [\n        \"304402200d461c140cfdfcf36b94961db57ae8c18d1cb80e9d95a9e47ac22470c1bf125502201c8dc1cbfef6a3ef90acbbb992ca22fe9466ee6f9d4898eda277a7ac3ab4b25101\",\n        \"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"WITNESS_PUBKEYTYPE\",\n    \"Basic P2WSH\"\n],\n[\n    [\n        \"304402201e7216e5ccb3b61d46946ec6cc7e8c4e0117d13ac2fd4b152197e4805191c74202203e9903e33e84d9ee1dd13fb057afb7ccfb47006c23f6a067185efbc9dd780fc501\",\n        \"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"WITNESS_PUBKEYTYPE\",\n    \"Basic P2WPKH\"\n],\n[\n    [\n        \"3044022066e02c19a513049d49349cf5311a1b012b7c4fae023795a18ab1d91c23496c22022025e216342c8e07ce8ef51e8daee88f84306a9de66236cab230bb63067ded1ad301\",\n        \"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac\",\n        0.00000001\n    ],\n    \"0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64\",\n    \"HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"WITNESS_PUBKEYTYPE\",\n    \"Basic P2SH(P2WSH)\"\n],\n[\n    [\n        \"304402200929d11561cd958460371200f82e9cae64c727a495715a31828e27a7ad57b36d0220361732ced04a6f97351ecca21a56d0b8cd4932c1da1f8f569a2b68e5e48aed7801\",\n        \"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        0.00000001\n    ],\n    \"0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5\",\n    \"HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"WITNESS_PUBKEYTYPE\",\n    \"Basic P2SH(P2WPKH)\"\n],\n\n[\"Testing P2WSH multisig with compressed keys\"],\n[\n    [\n        \"\",\n        \"304402207eb8a59b5c65fc3f6aeef77066556ed5c541948a53a3ba7f7c375b8eed76ee7502201e036a7a9a98ff919ff94dc905d67a1ec006f79ef7cff0708485c8bb79dce38e01\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0x06c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"OK\",\n    \"P2WSH CHECKMULTISIG with compressed keys\"\n],\n[\n    [\n        \"\",\n        \"3044022033706aed33b8155d5486df3b9bca8cdd3bd4bdb5436dce46d72cdaba51d22b4002203626e94fe53a178af46624f17315c6931f20a30b103f5e044e1eda0c3fe185c601\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"0x22 0x002006c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460\",\n    \"HASH160 0x14 0x26282aad7c29369d15fed062a778b6100d31a340 EQUAL\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"OK\",\n    \"P2SH(P2WSH) CHECKMULTISIG with compressed keys\"\n],\n[\n    [\n        \"\",\n        \"304402204048b7371ab1c544362efb89af0c80154747d665aa4fcfb2edfd2d161e57b42e02207e043748e96637080ffc3acbd4dcc6fee1e58d30f6d1269535f32188e5ddae7301\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0x06c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"OK\",\n    \"P2WSH CHECKMULTISIG with compressed keys\"\n],\n[\n    [\n        \"\",\n        \"3044022073902ef0b8a554c36c44cc03c1b64df96ce2914ebcf946f5bb36078fd5245cdf02205b148f1ba127065fb8c83a5a9576f2dcd111739788ed4bb3ee08b2bd3860c91c01\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"0x22 0x002006c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460\",\n    \"HASH160 0x14 0x26282aad7c29369d15fed062a778b6100d31a340 EQUAL\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"OK\",\n    \"P2SH(P2WSH) CHECKMULTISIG with compressed keys\"\n],\n\n[\"Testing P2WSH multisig with compressed and uncompressed keys (first key being the key closer to the top of stack)\"],\n[\n    [\n        \"\",\n        \"304402202d092ededd1f060609dbf8cb76950634ff42b3e62cf4adb69ab92397b07d742302204ff886f8d0817491a96d1daccdcc820f6feb122ee6230143303100db37dfa79f01\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key\"\n],\n[\n    [\n        \"\",\n        \"304402202dd7e91243f2235481ffb626c3b7baf2c859ae3a5a77fb750ef97b99a8125dc002204960de3d3c3ab9496e218ec57e5240e0e10a6f9546316fe240c216d45116d29301\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae\",\n        0.00000001\n    ],\n    \"0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa\",\n    \"HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"P2SH(P2WSH) CHECKMULTISIG first key uncompressed and signing with the first key\"\n],\n[\n    [\n        \"\",\n        \"304402202d092ededd1f060609dbf8cb76950634ff42b3e62cf4adb69ab92397b07d742302204ff886f8d0817491a96d1daccdcc820f6feb122ee6230143303100db37dfa79f01\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"WITNESS_PUBKEYTYPE\",\n    \"P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key\"\n],\n[\n    [\n        \"\",\n        \"304402202dd7e91243f2235481ffb626c3b7baf2c859ae3a5a77fb750ef97b99a8125dc002204960de3d3c3ab9496e218ec57e5240e0e10a6f9546316fe240c216d45116d29301\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae\",\n        0.00000001\n    ],\n    \"0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa\",\n    \"HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"WITNESS_PUBKEYTYPE\",\n    \"P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the first key\"\n],\n[\n    [\n        \"\",\n        \"304402201e9e6f7deef5b2f21d8223c5189b7d5e82d237c10e97165dd08f547c4e5ce6ed02206796372eb1cc6acb52e13ee2d7f45807780bf96b132cb6697f69434be74b1af901\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key\"\n],\n[\n    [\n        \"\",\n        \"3044022045e667f3f0f3147b95597a24babe9afecea1f649fd23637dfa7ed7e9f3ac18440220295748e81005231135289fe3a88338dabba55afa1bdb4478691337009d82b68d01\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae\",\n        0.00000001\n    ],\n    \"0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa\",\n    \"HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key\"\n],\n[\n    [\n        \"\",\n        \"304402201e9e6f7deef5b2f21d8223c5189b7d5e82d237c10e97165dd08f547c4e5ce6ed02206796372eb1cc6acb52e13ee2d7f45807780bf96b132cb6697f69434be74b1af901\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"WITNESS_PUBKEYTYPE\",\n    \"P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key\"\n],\n[\n    [\n        \"\",\n        \"3044022045e667f3f0f3147b95597a24babe9afecea1f649fd23637dfa7ed7e9f3ac18440220295748e81005231135289fe3a88338dabba55afa1bdb4478691337009d82b68d01\",\n        \"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae\",\n        0.00000001\n    ],\n    \"0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa\",\n    \"HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"WITNESS_PUBKEYTYPE\",\n    \"P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key\"\n],\n[\n    [\n        \"\",\n        \"3044022046f5367a261fd8f8d7de6eb390491344f8ec2501638fb9a1095a0599a21d3f4c02205c1b3b51d20091c5f1020841bbca87b44ebe25405c64e4acf758f2eae8665f8401\",\n        \"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key\"\n],\n[\n    [\n        \"\",\n        \"3044022053e210e4fb1881e6092fd75c3efc5163105599e246ded661c0ee2b5682cc2d6c02203a26b7ada8682a095b84c6d1b881637000b47d761fc837c4cee33555296d63f101\",\n        \"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb\",\n    \"HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"P2SH(P2WSH) CHECKMULTISIG second key uncompressed and signing with the first key\"\n],\n[\n    [\n        \"\",\n        \"3044022046f5367a261fd8f8d7de6eb390491344f8ec2501638fb9a1095a0599a21d3f4c02205c1b3b51d20091c5f1020841bbca87b44ebe25405c64e4acf758f2eae8665f8401\",\n        \"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"OK\",\n    \"P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used\"\n],\n[\n    [\n        \"\",\n        \"3044022053e210e4fb1881e6092fd75c3efc5163105599e246ded661c0ee2b5682cc2d6c02203a26b7ada8682a095b84c6d1b881637000b47d761fc837c4cee33555296d63f101\",\n        \"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb\",\n    \"HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"OK\",\n    \"P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used\"\n],\n[\n    [\n        \"\",\n        \"304402206c6d9f5daf85b54af2a93ec38b15ab27f205dbf5c735365ff12451e43613d1f40220736a44be63423ed5ebf53491618b7cc3d8a5093861908da853739c73717938b701\",\n        \"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key\"\n],\n[\n    [\n        \"\",\n        \"30440220687871bc6144012d75baf585bb26ce13997f7d8c626f4d8825b069c3b2d064470220108936fe1c57327764782253e99090b09c203ec400ed35ce9e026ce2ecf842a001\",\n        \"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb\",\n    \"HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL\",\n    \"P2SH,WITNESS\",\n    \"OK\",\n    \"P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key\"\n],\n[\n    [\n        \"\",\n        \"304402206c6d9f5daf85b54af2a93ec38b15ab27f205dbf5c735365ff12451e43613d1f40220736a44be63423ed5ebf53491618b7cc3d8a5093861908da853739c73717938b701\",\n        \"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"\",\n    \"0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"WITNESS_PUBKEYTYPE\",\n    \"P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key\"\n],\n[\n    [\n        \"\",\n        \"30440220687871bc6144012d75baf585bb26ce13997f7d8c626f4d8825b069c3b2d064470220108936fe1c57327764782253e99090b09c203ec400ed35ce9e026ce2ecf842a001\",\n        \"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae\",\n        0.00000001\n    ],\n    \"0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb\",\n    \"HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL\",\n    \"P2SH,WITNESS,WITNESS_PUBKEYTYPE\",\n    \"WITNESS_PUBKEYTYPE\",\n    \"P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key\"\n],\n\n[\"CHECKSEQUENCEVERIFY tests\"],\n[\"\", \"CHECKSEQUENCEVERIFY\", \"CHECKSEQUENCEVERIFY\", \"INVALID_STACK_OPERATION\", \"CSV automatically fails on a empty stack\"],\n[\"-1\", \"CHECKSEQUENCEVERIFY\", \"CHECKSEQUENCEVERIFY\", \"NEGATIVE_LOCKTIME\", \"CSV automatically fails if stack top is negative\"],\n[\"0x0100\", \"CHECKSEQUENCEVERIFY\", \"CHECKSEQUENCEVERIFY,MINIMALDATA\", \"UNKNOWN_ERROR\", \"CSV fails if stack top is not minimally encoded\"],\n[\"0\", \"CHECKSEQUENCEVERIFY\", \"CHECKSEQUENCEVERIFY\", \"UNSATISFIED_LOCKTIME\", \"CSV fails if stack top bit 1 << 31 is set and the tx version < 2\"],\n[\"4294967296\", \"CHECKSEQUENCEVERIFY\", \"CHECKSEQUENCEVERIFY\", \"UNSATISFIED_LOCKTIME\",\n  \"CSV fails if stack top bit 1 << 31 is not set, and tx version < 2\"],\n\n[\"MINIMALIF tests\"],\n[\"MINIMALIF is not applied to non-segwit scripts\"],\n[\"1\", \"IF 1 ENDIF\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[\"2\", \"IF 1 ENDIF\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[\"0x02 0x0100\", \"IF 1 ENDIF\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[\"0\", \"IF 1 ENDIF\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[\"0x01 0x00\", \"IF 1 ENDIF\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[\"1\", \"NOTIF 1 ENDIF\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[\"2\", \"NOTIF 1 ENDIF\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[\"0x02 0x0100\", \"NOTIF 1 ENDIF\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[\"0\", \"NOTIF 1 ENDIF\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[\"0x01 0x00\", \"NOTIF 1 ENDIF\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[\"Normal P2SH IF 1 ENDIF\"],\n[\"1 0x03 0x635168\", \"HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[\"2 0x03 0x635168\", \"HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[\"0x02 0x0100 0x03 0x635168\", \"HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[\"0 0x03 0x635168\", \"HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[\"0x01 0x00 0x03 0x635168\", \"HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[\"0x03 0x635168\", \"HASH160 0x14 0xe7309652a8e3f600f06f5d8d52d6df03d2176cc3 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"UNBALANCED_CONDITIONAL\"],\n[\"Normal P2SH NOTIF 1 ENDIF\"],\n[\"1 0x03 0x645168\", \"HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[\"2 0x03 0x645168\", \"HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[\"0x02 0x0100 0x03 0x645168\", \"HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[\"0 0x03 0x645168\", \"HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[\"0x01 0x00 0x03 0x645168\", \"HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[\"0x03 0x645168\", \"HASH160 0x14 0x0c3f8fe3d6ca266e76311ecda544c67d15fdd5b0 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"UNBALANCED_CONDITIONAL\"],\n[\"P2WSH IF 1 ENDIF\"],\n[[\"01\", \"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS\", \"OK\"],\n[[\"02\", \"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS\", \"OK\"],\n[[\"0100\", \"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS\", \"OK\"],\n[[\"\", \"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS\", \"EVAL_FALSE\"],\n[[\"00\", \"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS\", \"EVAL_FALSE\"],\n[[\"01\", \"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[[\"02\", \"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"0100\", \"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"\", \"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[[\"00\", \"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS\", \"UNBALANCED_CONDITIONAL\"],\n[[\"635168\", 0.00000001], \"\", \"0 0x20 0xc7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"P2SH,WITNESS,MINIMALIF\", \"UNBALANCED_CONDITIONAL\"],\n[\"P2WSH NOTIF 1 ENDIF\"],\n[[\"01\", \"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS\", \"EVAL_FALSE\"],\n[[\"02\", \"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS\", \"EVAL_FALSE\"],\n[[\"0100\", \"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS\", \"EVAL_FALSE\"],\n[[\"\", \"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS\", \"OK\"],\n[[\"00\", \"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS\", \"OK\"],\n[[\"01\", \"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[[\"02\", \"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"0100\", \"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"\", \"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[[\"00\", \"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS\", \"UNBALANCED_CONDITIONAL\"],\n[[\"645168\", 0.00000001], \"\", \"0 0x20 0xf913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"P2SH,WITNESS,MINIMALIF\", \"UNBALANCED_CONDITIONAL\"],\n\n\n\n[\"P2SH-P2WSH IF 1 ENDIF\"],\n[[\"01\", \"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS\", \"OK\"],\n[[\"02\", \"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS\", \"OK\"],\n[[\"0100\", \"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS\", \"OK\"],\n[[\"\", \"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS\", \"EVAL_FALSE\"],\n[[\"00\", \"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS\", \"EVAL_FALSE\"],\n[[\"01\", \"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[[\"02\", \"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"0100\", \"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"\", \"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[[\"00\", \"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS\", \"UNBALANCED_CONDITIONAL\"],\n[[\"635168\", 0.00000001], \"0x22 0x0020c7eaf06d5ae01a58e376e126eb1e6fab2036076922b96b2711ffbec1e590665d\", \"HASH160 0x14 0x9b27ee6d9010c21bf837b334d043be5d150e7ba7 EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"UNBALANCED_CONDITIONAL\"],\n[\"P2SH-P2WSH NOTIF 1 ENDIF\"],\n[[\"01\", \"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS\", \"EVAL_FALSE\"],\n[[\"02\", \"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS\", \"EVAL_FALSE\"],\n[[\"0100\", \"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS\", \"EVAL_FALSE\"],\n[[\"\", \"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS\", \"OK\"],\n[[\"00\", \"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS\", \"OK\"],\n[[\"01\", \"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"EVAL_FALSE\"],\n[[\"02\", \"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"0100\", \"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"\", \"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"OK\"],\n[[\"00\", \"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"MINIMALIF\"],\n[[\"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS\", \"UNBALANCED_CONDITIONAL\"],\n[[\"645168\", 0.00000001], \"0x22 0x0020f913eacf2e38a5d6fc3a8311d72ae704cb83866350a984dd3e5eb76d2a8c28e8\", \"HASH160 0x14 0xdbb7d1c0a56b7a9c423300c8cca6e6e065baf1dc EQUAL\", \"P2SH,WITNESS,MINIMALIF\", \"UNBALANCED_CONDITIONAL\"],\n\n[\"NULLFAIL should cover all signatures and signatures only\"],\n[\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\", \"0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT\", \"DERSIG\", \"OK\", \"BIP66 and NULLFAIL-compliant\"],\n[\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\", \"0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT\", \"DERSIG,NULLFAIL\", \"OK\", \"BIP66 and NULLFAIL-compliant\"],\n[\"1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\", \"0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT\", \"DERSIG,NULLFAIL\", \"OK\", \"BIP66 and NULLFAIL-compliant, not NULLDUMMY-compliant\"],\n[\"1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\", \"0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT\", \"DERSIG,NULLFAIL,NULLDUMMY\", \"SIG_NULLDUMMY\", \"BIP66 and NULLFAIL-compliant, not NULLDUMMY-compliant\"],\n[\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x09 0x300602010102010101\", \"0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT\", \"DERSIG\", \"OK\", \"BIP66-compliant but not NULLFAIL-compliant\"],\n[\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x09 0x300602010102010101\", \"0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT\", \"DERSIG,NULLFAIL\", \"NULLFAIL\", \"BIP66-compliant but not NULLFAIL-compliant\"],\n[\"0 0x09 0x300602010102010101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\", \"0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT\", \"DERSIG\", \"OK\", \"BIP66-compliant but not NULLFAIL-compliant\"],\n[\"0 0x09 0x300602010102010101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\", \"0x01 0x14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x14 CHECKMULTISIG NOT\", \"DERSIG,NULLFAIL\", \"NULLFAIL\", \"BIP66-compliant but not NULLFAIL-compliant\"],\n\n[\"The End\"]\n]\n"
  },
  {
    "path": "txscript/data/sighash.json",
    "content": "[\n\t[\"raw_transaction, script, input_index, hashType, signature_hash (result)\"],\n\t[\"907c2bc503ade11cc3b04eb2918b6f547b0630ab569273824748c87ea14b0696526c66ba740200000004ab65ababfd1f9bdd4ef073c7afc4ae00da8a66f429c917a0081ad1e1dabce28d373eab81d8628de802000000096aab5253ab52000052ad042b5f25efb33beec9f3364e8a9139e8439d9d7e26529c3c30b6c3fd89f8684cfd68ea0200000009ab53526500636a52ab599ac2fe02a526ed040000000008535300516352515164370e010000000003006300ab2ec229\", \"\", 2, 1864164639, \"31af167a6cf3f9d5f6875caa4d31704ceb0eba078d132b78dab52c3b8997317e\"],\n\t[\"a0aa3126041621a6dea5b800141aa696daf28408959dfb2df96095db9fa425ad3f427f2f6103000000015360290e9c6063fa26912c2e7fb6a0ad80f1c5fea1771d42f12976092e7a85a4229fdb6e890000000001abc109f6e47688ac0e4682988785744602b8c87228fcef0695085edf19088af1a9db126e93000000000665516aac536affffffff8fe53e0806e12dfd05d67ac68f4768fdbe23fc48ace22a5aa8ba04c96d58e2750300000009ac51abac63ab5153650524aa680455ce7b000000000000499e50030000000008636a00ac526563ac5051ee030000000003abacabd2b6fe000000000003516563910fb6b5\", \"65\", 0, -1391424484, \"48d6a1bd2cd9eec54eb866fc71209418a950402b5d7e52363bfb75c98e141175\"],\n\t[\"6e7e9d4b04ce17afa1e8546b627bb8d89a6a7fefd9d892ec8a192d79c2ceafc01694a6a7e7030000000953ac6a51006353636a33bced1544f797f08ceed02f108da22cd24c9e7809a446c61eb3895914508ac91f07053a01000000055163ab516affffffff11dc54eee8f9e4ff0bcf6b1a1a35b1cd10d63389571375501af7444073bcec3c02000000046aab53514a821f0ce3956e235f71e4c69d91abe1e93fb703bd33039ac567249ed339bf0ba0883ef300000000090063ab65000065ac654bec3cc504bcf499020000000005ab6a52abac64eb060100000000076a6a5351650053bbbc130100000000056a6aab53abd6e1380100000000026a51c4e509b8\", \"acab655151\", 0, 479279909, \"2a3d95b09237b72034b23f2d2bb29fa32a58ab5c6aa72f6aafdfa178ab1dd01c\"],\n\t[\"73107cbd025c22ebc8c3e0a47b2a760739216a528de8d4dab5d45cbeb3051cebae73b01ca10200000007ab6353656a636affffffffe26816dffc670841e6a6c8c61c586da401df1261a330a6c6b3dd9f9a0789bc9e000000000800ac6552ac6aac51ffffffff0174a8f0010000000004ac52515100000000\", \"5163ac63635151ac\", 1, 1190874345, \"06e328de263a87b09beabe222a21627a6ea5c7f560030da31610c4611f4a46bc\"],\n\t[\"e93bbf6902be872933cb987fc26ba0f914fcfc2f6ce555258554dd9939d12032a8536c8802030000000453ac5353eabb6451e074e6fef9de211347d6a45900ea5aaf2636ef7967f565dce66fa451805c5cd10000000003525253ffffffff047dc3e6020000000007516565ac656aabec9eea010000000001633e46e600000000000015080a030000000001ab00000000\", \"5300ac6a53ab6a\", 1, -886562767, \"f03aa4fc5f97e826323d0daa03343ebf8a34ed67a1ce18631f8b88e5c992e798\"],\n\t[\"50818f4c01b464538b1e7e7f5ae4ed96ad23c68c830e78da9a845bc19b5c3b0b20bb82e5e9030000000763526a63655352ffffffff023b3f9c040000000008630051516a6a5163a83caf01000000000553ab65510000000000\", \"6aac\", 0, 946795545, \"746306f322de2b4b58ffe7faae83f6a72433c22f88062cdde881d4dd8a5a4e2d\"],\n\t[\"a93e93440250f97012d466a6cc24839f572def241c814fe6ae94442cf58ea33eb0fdd9bcc1030000000600636a0065acffffffff5dee3a6e7e5ad6310dea3e5b3ddda1a56bf8de7d3b75889fc024b5e233ec10f80300000007ac53635253ab53ffffffff0160468b04000000000800526a5300ac526a00000000\", \"ac00636a53\", 1, 1773442520, \"5c9d3a2ce9365bb72cfabbaa4579c843bb8abf200944612cf8ae4b56a908bcbd\"],\n\t[\"ce7d371f0476dda8b811d4bf3b64d5f86204725deeaa3937861869d5b2766ea7d17c57e40b0100000003535265ffffffff7e7e9188f76c34a46d0bbe856bde5cb32f089a07a70ea96e15e92abb37e479a10100000006ab6552ab655225bcab06d1c2896709f364b1e372814d842c9c671356a1aa5ca4e060462c65ae55acc02d0000000006abac0063ac5281b33e332f96beebdbc6a379ebe6aea36af115c067461eb99d22ba1afbf59462b59ae0bd0200000004ab635365be15c23801724a1704000000000965006a65ac00000052ca555572\", \"53ab530051ab\", 1, 2030598449, \"c336b2f7d3702fbbdeffc014d106c69e3413c7c71e436ba7562d8a7a2871f181\"],\n\t[\"d3b7421e011f4de0f1cea9ba7458bf3486bee722519efab711a963fa8c100970cf7488b7bb0200000003525352dcd61b300148be5d05000000000000000000\", \"535251536aac536a\", 0, -1960128125, \"29aa6d2d752d3310eba20442770ad345b7f6a35f96161ede5f07b33e92053e2a\"],\n\t[\"04bac8c5033460235919a9c63c42b2db884c7c8f2ed8fcd69ff683a0a2cccd9796346a04050200000003655351fcad3a2c5a7cbadeb4ec7acc9836c3f5c3e776e5c566220f7f965cf194f8ef98efb5e3530200000007526a006552526526a2f55ba5f69699ece76692552b399ba908301907c5763d28a15b08581b23179cb01eac03000000075363ab6a516351073942c2025aa98a05000000000765006aabac65abd7ffa6030000000004516a655200000000\", \"53ac6365ac526a\", 1, 764174870, \"bf5fdc314ded2372a0ad078568d76c5064bf2affbde0764c335009e56634481b\"],\n\t[\"c363a70c01ab174230bbe4afe0c3efa2d7f2feaf179431359adedccf30d1f69efe0c86ed390200000002ab51558648fe0231318b04000000000151662170000000000008ac5300006a63acac00000000\", \"\", 0, 2146479410, \"191ab180b0d753763671717d051f138d4866b7cb0d1d4811472e64de595d2c70\"],\n\t[\"8d437a7304d8772210a923fd81187c425fc28c17a5052571501db05c7e89b11448b36618cd02000000026a6340fec14ad2c9298fde1477f1e8325e5747b61b7e2ff2a549f3d132689560ab6c45dd43c3010000000963ac00ac000051516a447ed907a7efffebeb103988bf5f947fc688aab2c6a7914f48238cf92c337fad4a79348102000000085352ac526a5152517436edf2d80e3ef06725227c970a816b25d0b58d2cd3c187a7af2cea66d6b27ba69bf33a0300000007000063ab526553f3f0d6140386815d030000000003ab6300de138f00000000000900525153515265abac1f87040300000000036aac6500000000\", \"51\", 3, -315779667, \"b6632ac53578a741ae8c36d8b69e79f39b89913a2c781cdf1bf47a8c29d997a5\"],\n\t[\"fd878840031e82fdbe1ad1d745d1185622b0060ac56638290ec4f66b1beef4450817114a2c0000000009516a63ab53650051abffffffff37b7a10322b5418bfd64fb09cd8a27ddf57731aeb1f1f920ffde7cb2dfb6cdb70300000008536a5365ac53515369ecc034f1594690dbe189094dc816d6d57ea75917de764cbf8eccce4632cbabe7e116cd0100000003515352ffffffff035777fc000000000003515200abe9140300000000050063005165bed6d10200000000076300536363ab65195e9110\", \"635265\", 0, 1729787658, \"6e3735d37a4b28c45919543aabcb732e7a3e1874db5315abb7cc6b143d62ff10\"],\n\t[\"f40a750702af06efff3ea68e5d56e42bc41cdb8b6065c98f1221fe04a325a898cb61f3d7ee030000000363acacffffffffb5788174aef79788716f96af779d7959147a0c2e0e5bfb6c2dba2df5b4b97894030000000965510065535163ac6affffffff0445e6fd0200000000096aac536365526a526aa6546b000000000008acab656a6552535141a0fd010000000000c897ea030000000008526500ab526a6a631b39dba3\", \"00abab5163ac\", 1, -1778064747, \"d76d0fc0abfa72d646df888bce08db957e627f72962647016eeae5a8412354cf\"],\n\t[\"a63bc673049c75211aa2c09ecc38e360eaa571435fedd2af1116b5c1fa3d0629c269ecccbf0000000008ac65ab516352ac52ffffffffbf1a76fdda7f451a5f0baff0f9ccd0fe9136444c094bb8c544b1af0fa2774b06010000000463535253ffffffff13d6b7c3ddceef255d680d87181e100864eeb11a5bb6a3528cb0d70d7ee2bbbc02000000056a0052abab951241809623313b198bb520645c15ec96bfcc74a2b0f3db7ad61d455cc32db04afc5cc702000000016309c9ae25014d9473020000000004abab6aac3bb1e803\", \"\", 3, -232881718, \"6e48f3da3a4ac07eb4043a232df9f84e110485d7c7669dd114f679c27d15b97e\"],\n\t[\"4c565efe04e7d32bac03ae358d63140c1cfe95de15e30c5b84f31bb0b65bb542d637f49e0f010000000551abab536348ae32b31c7d3132030a510a1b1aacf7b7c3f19ce8dc49944ef93e5fa5fe2d356b4a73a00100000009abac635163ac00ab514c8bc57b6b844e04555c0a4f4fb426df139475cd2396ae418bc7015820e852f711519bc202000000086a00510000abac52488ff4aec72cbcfcc98759c58e20a8d2d9725aa4a80f83964e69bc4e793a4ff25cd75dc701000000086a52ac6aac5351532ec6b10802463e0200000000000553005265523e08680100000000002f39a6b0\", \"\", 3, 70712784, \"c6076b6a45e6fcfba14d3df47a34f6aadbacfba107e95621d8d7c9c0e40518ed\"],\n\t[\"1233d5e703403b3b8b4dae84510ddfc126b4838dcb47d3b23df815c0b3a07b55bf3098110e010000000163c5c55528041f480f40cf68a8762d6ed3efe2bd402795d5233e5d94bf5ddee71665144898030000000965525165655151656affffffff6381667e78bb74d0880625993bec0ea3bd41396f2bcccc3cc097b240e5e92d6a01000000096363acac6a63536365ffffffff04610ad60200000000065251ab65ab52e90d680200000000046351516ae30e98010000000008abab52520063656a671856010000000004ac6aac514c84e383\", \"6aabab636300\", 1, -114996813, \"aeb8c5a62e8a0b572c28f2029db32854c0b614dbecef0eaa726abebb42eebb8d\"],\n\t[\"0c69702103b25ceaed43122cc2672de84a3b9aa49872f2a5bb458e19a52f8cc75973abb9f102000000055365656aacffffffff3ffb1cf0f76d9e3397de0942038c856b0ebbea355dc9d8f2b06036e19044b0450100000000ffffffff4b7793f4169617c54b734f2cd905ed65f1ce3d396ecd15b6c426a677186ca0620200000008655263526551006a181a25b703240cce0100000000046352ab53dee22903000000000865526a6a516a51005e121602000000000852ab52ababac655200000000\", \"6a516aab63\", 1, -2040012771, \"a6e6cb69f409ec14e10dd476f39167c29e586e99bfac93a37ed2c230fcc1dbbe\"],\n\t[\"fd22692802db8ae6ab095aeae3867305a954278f7c076c542f0344b2591789e7e33e4d29f4020000000151ffffffffb9409129cfed9d3226f3b6bab7a2c83f99f48d039100eeb5796f00903b0e5e5e0100000006656552ac63abd226abac0403e649000000000007abab51ac5100ac8035f10000000000095165006a63526a52510d42db030000000007635365ac6a63ab24ef5901000000000453ab6a0000000000\", \"536a52516aac6a\", 1, 309309168, \"7ca0f75e6530ec9f80d031fc3513ca4ecd67f20cb38b4dacc6a1d825c3cdbfdb\"],\n\t[\"a43f85f701ffa54a3cc57177510f3ea28ecb6db0d4431fc79171cad708a6054f6e5b4f89170000000008ac6a006a536551652bebeaa2013e779c05000000000665ac5363635100000000\", \"ac\", 0, 2028978692, \"58294f0d7f2e68fe1fd30c01764fe1619bcc7961d68968944a0e263af6550437\"],\n\t[\"c2b0b99001acfecf7da736de0ffaef8134a9676811602a6299ba5a2563a23bb09e8cbedf9300000000026300ffffffff042997c50300000000045252536a272437030000000007655353ab6363ac663752030000000002ab6a6d5c900000000000066a6a5265abab00000000\", \"52ac525163515251\", 0, -894181723, \"8b300032a1915a4ac05cea2f7d44c26f2a08d109a71602636f15866563eaafdc\"],\n\t[\"82f9f10304c17a9d954cf3380db817814a8c738d2c811f0412284b2c791ec75515f38c4f8c020000000265ab5729ca7db1b79abee66c8a757221f29280d0681355cb522149525f36da760548dbd7080a0100000001510b477bd9ce9ad5bb81c0306273a3a7d051e053f04ecf3a1dbeda543e20601a5755c0cfae030000000451ac656affffffff71141a04134f6c292c2e0d415e6705dfd8dcee892b0d0807828d5aeb7d11f5ef0300000001520b6c6dc802a6f3dd0000000000056aab515163bfb6800300000000015300000000\", \"\", 3, -635779440, \"d55ed1e6c53510f2608716c12132a11fb5e662ec67421a513c074537eeccc34b\"],\n\t[\"8edcf5a1014b604e53f0d12fe143cf4284f86dc79a634a9f17d7e9f8725f7beb95e8ffcd2403000000046aabac52ffffffff01c402b5040000000005ab6a63525100000000\", \"6351525251acabab6a\", 0, 1520147826, \"2765bbdcd3ebb8b1a316c04656b28d637f80bffbe9b040661481d3dc83eea6d6\"],\n\t[\"2074bad5011847f14df5ea7b4afd80cd56b02b99634893c6e3d5aaad41ca7c8ee8e5098df003000000026a6affffffff018ad59700000000000900ac656a526551635300000000\", \"65635265\", 0, -1804671183, \"663c999a52288c9999bff36c9da2f8b78d5c61b8347538f76c164ccba9868d0a\"],\n\t[\"7100b11302e554d4ef249ee416e7510a485e43b2ba4b8812d8fe5529fe33ea75f36d392c4403000000020000ffffffff3d01a37e075e9a7715a657ae1bdf1e44b46e236ad16fd2f4c74eb9bf370368810000000007636553ac536365ffffffff01db696a0400000000065200ac656aac00000000\", \"63005151\", 0, -1210499507, \"b9c3aee8515a4a3b439de1ffc9c156824bda12cb75bfe5bc863164e8fd31bd7a\"],\n\t[\"02c1017802091d1cb08fec512db7b012fe4220d57a5f15f9e7676358b012786e1209bcff950100000004acab6352ffffffff799bc282724a970a6fea1828984d0aeb0f16b67776fa213cbdc4838a2f1961a3010000000951516a536552ab6aabffffffff016c7b4b03000000000865abac5253ac5352b70195ad\", \"65655200516a\", 0, -241626954, \"be567cb47170b34ff81c66c1142cb9d27f9b6898a384d6dfc4fce16b75b6cb14\"],\n\t[\"cb3178520136cd294568b83bb2520f78fecc507898f4a2db2674560d72fd69b9858f75b3b502000000066aac00515100ffffffff03ab005a01000000000563526363006e3836030000000001abfbda3200000000000665ab0065006500000000\", \"ab516a0063006a5300\", 0, 1182109299, \"2149e79c3f4513da4e4378608e497dcfdfc7f27c21a826868f728abd2b8a637a\"],\n\t[\"18a4b0c004702cf0e39686ac98aab78ad788308f1d484b1ddfe70dc1997148ba0e28515c310300000000ffffffff05275a52a23c59da91129093364e275da5616c4070d8a05b96df5a2080ef259500000000096aac51656a6aac53ab66e64966b3b36a07dd2bb40242dd4a3743d3026e7e1e0d9e9e18f11d068464b989661321030000000265ac383339c4fae63379cafb63b0bab2eca70e1f5fc7d857eb5c88ccd6c0465093924bba8b2a000000000300636ab5e0545402bc2c4c010000000000cd41c002000000000000000000\", \"abac635253656a00\", 3, 2052372230, \"32db877b6b1ca556c9e859442329406f0f8246706522369839979a9f7a235a32\"],\n\t[\"1d9c5df20139904c582285e1ea63dec934251c0f9cf5c47e86abfb2b394ebc57417a81f67c010000000353515222ba722504800d3402000000000353656a3c0b4a0200000000000fb8d20500000000076300ab005200516462f30400000000015200000000\", \"ab65\", 0, -210854112, \"edf73e2396694e58f6b619f68595b0c1cdcb56a9b3147845b6d6afdb5a80b736\"],\n\t[\"4504cb1904c7a4acf375ddae431a74de72d5436efc73312cf8e9921f431267ea6852f9714a01000000066a656a656553a2fbd587c098b3a1c5bd1d6480f730a0d6d9b537966e20efc0e352d971576d0f87df0d6d01000000016321aeec3c4dcc819f1290edb463a737118f39ab5765800547522708c425306ebfca3f396603000000055300ac656a1d09281d05bfac57b5eb17eb3fa81ffcedfbcd3a917f1be0985c944d473d2c34d245eb350300000007656a51525152ac263078d9032f470f0500000000066aac00000052e12da60200000000003488410200000000076365006300ab539981e432\", \"52536a52526a\", 1, -31909119, \"f0a2deee7fd8a3a9fad6927e763ded11c940ee47e9e6d410f94fda5001f82e0c\"],\n\t[\"14bc7c3e03322ec0f1311f4327e93059c996275302554473104f3f7b46ca179bfac9ef753503000000016affffffff9d405eaeffa1ca54d9a05441a296e5cc3a3e32bb8307afaf167f7b57190b07e00300000008abab51ab5263abab45533aa242c61bca90dd15d46079a0ab0841d85df67b29ba87f2393cd764a6997c372b55030000000452005263ffffffff0250f40e02000000000651516a0063630e95ab0000000000046a5151ac00000000\", \"6a65005151\", 0, -1460947095, \"aa418d096929394c9147be8818d8c9dafe6d105945ab9cd7ec682df537b5dd79\"],\n\t[\"2b3bd0dd04a1832f893bf49a776cd567ec4b43945934f4786b615d6cb850dfc0349b33301a000000000565ac000051cf80c670f6ddafab63411adb4d91a69c11d9ac588898cbfb4cb16061821cc104325c895103000000025163ffffffffa9e2d7506d2d7d53b882bd377bbcc941f7a0f23fd15d2edbef3cd9df8a4c39d10200000009ac63006a52526a5265ffffffff44c099cdf10b10ce87d4b38658d002fd6ea17ae4a970053c05401d86d6e75f99000000000963ab53526a5252ab63ffffffff035af69c01000000000100ba9b8b0400000000004cead10500000000026a520b77d667\", \"ab52abac526553\", 3, -1955078165, \"eb9ceecc3b401224cb79a44d23aa8f428e29f1405daf69b4e01910b848ef1523\"],\n\t[\"35df11f004a48ba439aba878fe9df20cc935b4a761c262b1b707e6f2b33e2bb7565cd68b130000000000ffffffffb2a2f99abf64163bb57ca900500b863f40c02632dfd9ea2590854c5fb4811da90200000006ac006363636affffffffaf9d89b2a8d2670ca37c8f7c140600b81259f2e037cb4590578ec6e37af8bf200000000005abac6a655270a4751eb551f058a93301ffeda2e252b6614a1fdd0e283e1d9fe53c96c5bbaafaac57b8030000000153ffffffff020d9f3b02000000000100ed7008030000000004abac000000000000\", \"abac\", 3, 593793071, \"88fdee1c2d4aeead71d62396e28dc4d00e5a23498eea66844b9f5d26d1f21042\"],\n\t[\"a08ff466049fb7619e25502ec22fedfb229eaa1fe275aa0b5a23154b318441bf547989d0510000000005ab5363636affffffff2b0e335cb5383886751cdbd993dc0720817745a6b1c9b8ab3d15547fc9aafd03000000000965656a536a52656a532b53d10584c290d3ac1ab74ab0a19201a4a039cb59dc58719821c024f6bf2eb26322b33f010000000965ac6aac0053ab6353ffffffff048decba6ebbd2db81e416e39dde1f821ba69329725e702bcdea20c5cc0ecc6402000000086363ab5351ac6551466e377b0468c0fa00000000000651ab53ac6a513461c6010000000008636a636365535100eeb3dc010000000006526a52ac516a43f362010000000005000063536500000000\", \"0063516a\", 1, -1158911348, \"f6a1ecb50bd7c2594ebecea5a1aa23c905087553e40486dade793c2f127fdfae\"],\n\t[\"5ac2f17d03bc902e2bac2469907ec7d01a62b5729340bc58c343b7145b66e6b97d434b30fa000000000163ffffffff44028aa674192caa0d0b4ebfeb969c284cb16b80c312d096efd80c6c6b094cca000000000763acabac516a52ffffffff10c809106e04b10f9b43085855521270fb48ab579266e7474657c6c625062d2d030000000351636595a0a97004a1b69603000000000465ab005352ad68010000000008636a5263acac5100da7105010000000002acab90325200000000000000000000\", \"6a6aab516a63526353\", 2, 1518400956, \"f7efb74b1dcc49d316b49c632301bc46f98d333c427e55338be60c7ef0d953be\"],\n\t[\"aeb2e11902dc3770c218b97f0b1960d6ee70459ecb6a95eff3f05295dc1ef4a0884f10ba460300000005516352526393e9b1b3e6ae834102d699ddd3845a1e159aa7cf7635edb5c02003f7830fee3788b795f20100000009ab006a526553ac006ad8809c570469290e0400000000050000abab00b10fd5040000000008ab655263abac53ab630b180300000000009d9993040000000002516300000000\", \"5351ababac6a65\", 0, 1084852870, \"f2286001af0b0170cbdad92693d0a5ebaa8262a4a9d66e002f6d79a8c94026d1\"],\n\t[\"9860ca9a0294ff4812534def8c3a3e3db35b817e1a2ddb7f0bf673f70eab71bb79e90a2f3100000000086a636551acac5165ffffffffed4d6d3cd9ff9b2d490e0c089739121161a1445844c3e204296816ab06e0a83702000000035100ac88d0db5201c3b59a050000000005ac6a0051ab00000000\", \"535263ab006a526aab\", 1, -962088116, \"30df2473e1403e2b8e637e576825f785528d998af127d501556e5f7f5ed89a2a\"],\n\t[\"4ddaa680026ec4d8060640304b86823f1ac760c260cef81d85bd847952863d629a3002b54b0200000008526365636a656aab65457861fc6c24bdc760c8b2e906b6656edaf9ed22b5f50e1fb29ec076ceadd9e8ebcb6b000000000152ffffffff033ff04f00000000000551526a00657a1d900300000000002153af040000000003006a6300000000\", \"ab526a53acabab\", 0, 1055317633, \"7f21b62267ed52462e371a917eb3542569a4049b9dfca2de3c75872b39510b26\"],\n\t[\"01e76dcd02ad54cbc8c71d68eaf3fa7c883b65d74217b30ba81f1f5144ef80b706c0dc82ca000000000352ab6a078ec18bcd0514825feced2e8b8ea1ccb34429fae41c70cc0b73a2799e85603613c6870002000000086363ab6365536a53ffffffff043acea90000000000016ad20e1803000000000100fa00830200000000056352515351e864ee00000000000865535253ab6a6551d0c46672\", \"6a6365abacab\", 0, -1420559003, \"8af0b4cbdbc011be848edf4dbd2cde96f0578d662cfebc42252495387114224a\"],\n\t[\"fa00b26402670b97906203434aa967ce1559d9bd097d56dbe760469e6032e7ab61accb54160100000006635163630052fffffffffe0d3f4f0f808fd9cfb162e9f0c004601acf725cd7ea5683bbdc9a9a433ef15a0200000005ab52536563d09c7bef049040f305000000000153a7c7b9020000000004ac63ab52847a2503000000000553ab00655390ed80010000000005006553ab52860671d4\", \"536565ab52\", 0, 799022412, \"40ed8e7bbbd893e15f3cce210ae02c97669818de5946ca37eefc7541116e2c78\"],\n\t[\"cb5c06dc01b022ee6105ba410f0eb12b9ce5b5aa185b28532492d839a10cef33d06134b91b010000000153ffffffff02cec0530400000000005e1e4504000000000865656551acacac6a00000000\", \"ab53\", 0, -1514251329, \"136beb95459fe6b126cd6cefd54eb5d971524b0e883e41a292a78f78015cb8d5\"],\n\t[\"f10a0356031cd569d652dbca8e7a4d36c8da33cdff428d003338602b7764fe2c96c505175b010000000465ac516affffffffbb54563c71136fa944ee20452d78dc87073ac2365ba07e638dce29a5d179da600000000003635152ffffffff9a411d8e2d421b1e6085540ee2809901e590940bbb41532fa38bd7a16b68cc350100000007535251635365636195df1603b61c45010000000002ab65bf6a310400000000026352fcbba10200000000016aa30b7ff0\", \"5351\", 0, 1552495929, \"9eb8adf2caecb4bf9ac59d7f46bd20e83258472db2f569ee91aba4cf5ee78e29\"],\n\t[\"c3325c9b012f659466626ca8f3c61dfd36f34670abc054476b7516a1839ec43cd0870aa0c0000000000753525265005351e7e3f04b0112650500000000000363ac6300000000\", \"acac\", 0, -68961433, \"5ca70e727d91b1a42b78488af2ed551642c32d3de4712a51679f60f1456a8647\"],\n\t[\"2333e54c044370a8af16b9750ac949b151522ea6029bacc9a34261599549581c7b4e5ece470000000007510052006563abffffffff80630fc0155c750ce20d0ca4a3d0c8e8d83b014a5b40f0b0be0dd4c63ac28126020000000465000000ffffffff1b5f1433d38cdc494093bb1d62d84b10abbdae57e3d04e82e600857ab3b1dc990300000003515100b76564be13e4890a908ea7508afdad92ec1b200a9a67939fadce6eb7a29eb4550a0a28cb0300000001acffffffff02926c930300000000016373800201000000000153d27ee740\", \"ab6365ab516a53\", 3, 598653797, \"2be27a686eb7940dd32c44ff3a97c1b28feb7ab9c5c0b1593b2d762361cfc2db\"],\n\t[\"b500ca48011ec57c2e5252e5da6432089130603245ffbafb0e4c5ffe6090feb629207eeb0e010000000652ab6a636aab8302c9d2042b44f40500000000015278c05a050000000004ac5251524be080020000000007636aac63ac5252c93a9a04000000000965ab6553636aab5352d91f9ddb\", \"52005100\", 0, -2024394677, \"49c8a6940a461cc7225637f1e512cdd174c99f96ec05935a59637ededc77124c\"],\n\t[\"f52ff64b02ee91adb01f3936cc42e41e1672778962b68cf013293d649536b519bc3271dd2c00000000020065afee11313784849a7c15f44a61cd5fd51ccfcdae707e5896d131b082dc9322a19e12858501000000036aac654e8ca882022deb7c020000000006006a515352abd3defc0000000000016300000000\", \"63520063\", 0, 1130989496, \"7f208df9a5507e98c62cebc5c1e2445eb632e95527594929b9577b53363e96f6\"],\n\t[\"ab7d6f36027a7adc36a5cf7528fe4fb5d94b2c96803a4b38a83a675d7806dda62b380df86a0000000003000000ffffffff5bc00131e29e22057c04be854794b4877dda42e416a7a24706b802ff9da521b20000000007ac6a0065ac52ac957cf45501b9f06501000000000500ac6363ab25f1110b\", \"00526500536a635253\", 0, 911316637, \"5fa09d43c8aef6f6fa01c383a69a5a61a609cd06e37dce35a39dc9eae3ddfe6c\"],\n\t[\"f940888f023dce6360263c850372eb145b864228fdbbb4c1186174fa83aab890ff38f8c9a90300000000ffffffff01e80ccdb081e7bbae1c776531adcbfb77f2e5a7d0e5d0d0e2e6c8758470e85f00000000020053ffffffff03b49088050000000004656a52ab428bd604000000000951630065ab63ac636a0cbacf0400000000070063ac5265ac53d6e16604\", \"ac63\", 0, 39900215, \"713ddeeefcfe04929e7b6593c792a4efbae88d2b5280d1f0835d2214eddcbad6\"],\n\t[\"530ecd0b01ec302d97ef6f1b5a6420b9a239714013e20d39aa3789d191ef623fc215aa8b940200000005ac5351ab6a3823ab8202572eaa04000000000752ab6a51526563fd8a270100000000036a006581a798f0\", \"525153656a0063\", 0, 1784562684, \"fe42f73a8742676e640698222b1bd6b9c338ff1ccd766d3d88d7d3c6c6ac987e\"],\n\t[\"5d781d9303acfcce964f50865ddfddab527ea971aee91234c88e184979985c00b4de15204b0100000003ab6352a009c8ab01f93c8ef2447386c434b4498538f061845862c3f9d5751ad0fce52af442b3a902000000045165ababb909c66b5a3e7c81b3c45396b944be13b8aacfc0204f3f3c105a66fa8fa6402f1b5efddb01000000096a65ac636aacab656ac3c677c402b79fa4050000000004006aab5133e35802000000000751ab635163ab0078c2e025\", \"6aac51636a6a005265\", 0, -882306874, \"551ce975d58647f10adefb3e529d9bf9cda34751627ec45e690f135ef0034b95\"],\n\t[\"25ee54ef0187387564bb86e0af96baec54289ca8d15e81a507a2ed6668dc92683111dfb7a50100000004005263634cecf17d0429aa4d000000000007636a6aabab5263daa75601000000000251ab4df70a01000000000151980a890400000000065253ac6a006377fd24e3\", \"65ab\", 0, 797877378, \"069f38fd5d47abff46f04ee3ae27db03275e9aa4737fa0d2f5394779f9654845\"],\n\t[\"a9c57b1a018551bcbc781b256642532bbc09967f1cbe30a227d352a19365d219d3f11649a3030000000451655352b140942203182894030000000006ab00ac6aab654add350400000000003d379505000000000553abacac00e1739d36\", \"5363\", 0, -1069721025, \"6da32416deb45a0d720a1dbe6d357886eabc44029dd5db74d50feaffbe763245\"],\n\t[\"05c4fb94040f5119dc0b10aa9df054871ed23c98c890f1e931a98ffb0683dac45e98619fdc0200000007acab6a525263513e7495651c9794c4d60da835d303eb4ee6e871f8292f6ad0b32e85ef08c9dc7aa4e03c9c010000000500ab52acacfffffffffee953259cf14ced323fe8d567e4c57ba331021a1ef5ac2fa90f7789340d7c550100000007ac6aacac6a6a53ffffffff08d9dc820d00f18998af247319f9de5c0bbd52a475ea587f16101af3afab7c210100000003535363569bca7c0468e34f00000000000863536353ac51ac6584e319010000000006650052ab6a533debea030000000003ac0053ee7070020000000006ac52005253ac00000000\", \"6351005253\", 2, 1386916157, \"76c4013c40bfa1481badd9d342b6d4b8118de5ab497995fafbf73144469e5ff0\"],\n\t[\"c95ab19104b63986d7303f4363ca8f5d2fa87c21e3c5d462b99f1ebcb7c402fc012f5034780000000009006aac63ac65655265ffffffffbe91afa68af40a8700fd579c86d4b706c24e47f7379dad6133de389f815ef7f501000000046aac00abffffffff1520db0d81be4c631878494668d258369f30b8f2b7a71e257764e9a27f24b48701000000076a515100535300b0a989e1164db9499845bac01d07a3a7d6d2c2a76e4c04abe68f808b6e2ef5068ce6540e0100000009ac53636a63ab65656affffffff0309aac6050000000005ab6563656a6067e8020000000003ac536aec91c8030000000009655251ab65ac6a53acc7a45bc5\", \"63526a65abac\", 1, 512079270, \"fb7eca81d816354b6aedec8cafc721d5b107336657acafd0d246049556f9e04b\"],\n\t[\"ca66ae10049533c2b39f1449791bd6d3f039efe0a121ab7339d39ef05d6dcb200ec3fb2b3b020000000465006a53ffffffff534b8f97f15cc7fb4f4cea9bf798472dc93135cd5b809e4ca7fe4617a61895980100000000ddd83c1dc96f640929dd5e6f1151dab1aa669128591f153310d3993e562cc7725b6ae3d903000000046a52536582f8ccddb8086d8550f09128029e1782c3f2624419abdeaf74ecb24889cc45ac1a64492a0100000002516a4867b41502ee6ccf03000000000752acacab52ab6a4b7ba80000000000075151ab0052536300000000\", \"6553\", 2, -62969257, \"8085e904164ab9a8c20f58f0d387f6adb3df85532e11662c03b53c3df8c943cb\"],\n\t[\"ba646d0b0453999f0c70cb0430d4cab0e2120457bb9128ed002b6e9500e9c7f8d7baa20abe0200000001652a4e42935b21db02b56bf6f08ef4be5adb13c38bc6a0c3187ed7f6197607ba6a2c47bc8a03000000040052516affffffffa55c3cbfc19b1667594ac8681ba5d159514b623d08ed4697f56ce8fcd9ca5b0b00000000096a6a5263ac655263ab66728c2720fdeabdfdf8d9fb2bfe88b295d3b87590e26a1e456bad5991964165f888c03a0200000006630051ac00acffffffff0176fafe0100000000070063acac65515200000000\", \"63\", 1, 2002322280, \"9db4e320208185ee70edb4764ee195deca00ba46412d5527d9700c1cf1c3d057\"],\n\t[\"2ddb8f84039f983b45f64a7a79b74ff939e3b598b38f436def7edd57282d0803c7ef34968d02000000026a537eb00c4187de96e6e397c05f11915270bcc383959877868ba93bac417d9f6ed9f627a7930300000004516551abffffffffacc12f1bb67be3ae9f1d43e55fda8b885340a0df1175392a8bbd9f959ad3605003000000025163ffffffff02ff0f4700000000000070bd99040000000003ac53abf8440b42\", \"\", 2, -393923011, \"0133f1a161363b71dfb3a90065c7128c56bd0028b558b610142df79e055ab5c7\"],\n\t[\"b21fc15403b4bdaa994204444b59323a7b8714dd471bd7f975a4e4b7b48787e720cbd1f5f00000000000ffffffff311533001cb85c98c1d58de0a5fbf27684a69af850d52e22197b0dc941bc6ca9030000000765ab6363ab5351a8ae2c2c7141ece9a4ff75c43b7ea9d94ec79b7e28f63e015ac584d984a526a73fe1e04e0100000007526352536a5365ffffffff02a0a9ea030000000002ab52cfc4f300000000000465525253e8e0f342\", \"000000\", 1, 1305253970, \"d1df1f4bba2484cff8a816012bb6ec91c693e8ca69fe85255e0031711081c46a\"],\n\t[\"d1704d6601acf710b19fa753e307cfcee2735eada0d982b5df768573df690f460281aad12d0000000007656300005100acffffffff0232205505000000000351ab632ca1bc0300000000016300000000\", \"ac65ab65ab51\", 0, 165179664, \"40b4f03c68288bdc996011b0f0ddb4b48dc3be6762db7388bdc826113266cd6c\"],\n\t[\"d2f6c096025cc909952c2400bd83ac3d532bfa8a1f8f3e73c69b1fd7b8913379793f3ce92202000000076a00ab6a53516ade5332d81d58b22ed47b2a249ab3a2cb3a6ce9a6b5a6810e18e3e1283c1a1b3bd73e3ab00300000002acabffffffff01a9b2d40500000000056352abab00dc4b7f69\", \"ab0065\", 0, -78019184, \"2ef025e907f0fa454a2b48a4f3b81346ba2b252769b5c35d742d0c8985e0bf5e\"],\n\t[\"3e6db1a1019444dba461247224ad5933c997256d15c5d37ade3d700506a0ba0a57824930d7010000000852ab6500ab00ac00ffffffff03389242020000000001aba8465a0200000000086a6a636a5100ab52394e6003000000000953ac51526351000053d21d9800\", \"abababacab53ab65\", 0, 1643661850, \"1f8a3aca573a609f4aea0c69522a82fcb4e15835449da24a05886ddc601f4f6a\"],\n\t[\"f821a042036ad43634d29913b77c0fc87b4af593ac86e9a816a9d83fd18dfcfc84e1e1d57102000000076a63ac52006351ffffffffbcdaf490fc75086109e2f832c8985716b3a624a422cf9412fe6227c10585d21203000000095252abab5352ac526affffffff2efed01a4b73ad46c7f7bc7fa3bc480f8e32d741252f389eaca889a2e9d2007e000000000353ac53ffffffff032ac8b3020000000009636300000063516300d3d9f2040000000006510065ac656aafa5de0000000000066352ab5300ac9042b57d\", \"525365\", 1, 667065611, \"0d17a92c8d5041ba09b506ddf9fd48993be389d000aad54f9cc2a44fcc70426b\"],\n\t[\"58e3f0f704a186ef55d3919061459910df5406a9121f375e7502f3be872a449c3f2bb058380100000000f0e858da3ac57b6c973f889ad879ffb2bd645e91b774006dfa366c74e2794aafc8bbc871010000000751ac65516a515131a68f120fd88ca08687ceb4800e1e3fbfea7533d34c84fef70cc5a96b648d580369526d000000000600ac00515363f6191d5b3e460fa541a30a6e83345dedfa3ed31ad8574d46d7bbecd3c9074e6ba5287c24020000000151e3e19d6604162602010000000004005100ac71e17101000000000065b5e90300000000040053ab53f6b7d101000000000200ac00000000\", \"6563ab\", 1, -669018604, \"8221d5dfb75fc301a80e919e158e0b1d1e86ffb08870a326c89408d9bc17346b\"],\n\t[\"efec1cce044a676c1a3d973f810edb5a9706eb4cf888a240f2b5fb08636bd2db482327cf500000000005ab51656a52ffffffff46ef019d7c03d9456e5134eb0a7b5408d274bd8e33e83df44fab94101f7c5b650200000009ac5100006353630051407aadf6f5aaffbd318fdbbc9cae4bd883e67d524df06bb006ce2f7c7e2725744afb76960100000005536aab53acec0d64eae09e2fa1a7c4960354230d51146cf6dc45ee8a51f489e20508a785cbe6ca86fc000000000651536a516300ffffffff014ef598020000000006636aac655265a6ae1b75\", \"53516a5363526563ab\", 2, -1823982010, \"13e8b5ab4e5b2ceeff0045c625e19898bda2d39fd7af682e2d1521303cfe1154\"],\n\t[\"3c436c2501442a5b700cbc0622ee5143b34b1b8021ea7bbc29e4154ab1f5bdfb3dff9d640501000000086aab5251ac5252acffffffff0170b9a20300000000066aab6351525114b13791\", \"63acabab52ab51ac65\", 0, -2140612788, \"87ddf1f9acb6640448e955bd1968f738b4b3e073983af7b83394ab7557f5cd61\"],\n\t[\"d62f183e037e0d52dcf73f9b31f70554bce4f693d36d17552d0e217041e01f15ad3840c838000000000963acac6a6a6a63ab63ffffffffabdfb395b6b4e63e02a763830f536fc09a35ff8a0cf604021c3c751fe4c88f4d0300000006ab63ab65ac53aa4d30de95a2327bccf9039fb1ad976f84e0b4a0936d82e67eafebc108993f1e57d8ae39000000000165ffffffff04364ad30500000000036a005179fd84010000000007ab636aac6363519b9023030000000008510065006563ac6acd2a4a02000000000000000000\", \"52\", 1, 595020383, \"da8405db28726dc4e0f82b61b2bfd82b1baa436b4e59300305cc3b090b157504\"],\n\t[\"44c200a5021238de8de7d80e7cce905606001524e21c8d8627e279335554ca886454d692e6000000000500acac52abbb8d1dc876abb1f514e96b21c6e83f429c66accd961860dc3aed5071e153e556e6cf076d02000000056553526a51870a928d0360a580040000000004516a535290e1e302000000000851ab6a00510065acdd7fc5040000000007515363ab65636abb1ec182\", \"6363\", 0, -785766894, \"ed53cc766cf7cb8071cec9752460763b504b2183442328c5a9761eb005c69501\"],\n\t[\"d682d52d034e9b062544e5f8c60f860c18f029df8b47716cabb6c1b4a4b310a0705e754556020000000400656a0016eeb88eef6924fed207fba7ddd321ff3d84f09902ff958c815a2bf2bb692eb52032c4d803000000076365ac516a520099788831f8c8eb2552389839cfb81a9dc55ecd25367acad4e03cfbb06530f8cccf82802701000000085253655300656a53ffffffff02d543200500000000056a510052ac03978b05000000000700ac51525363acfdc4f784\", \"\", 2, -696035135, \"e1a256854099907050cfee7778f2018082e735a1f1a3d91437584850a74c87bb\"],\n\t[\"e8c0dec5026575ddf31343c20aeeca8770afb33d4e562aa8ee52eeda6b88806fdfd4fe0a97030000000953acabab65ab516552ffffffffdde122c2c3e9708874286465f8105f43019e837746686f442666629088a970e0010000000153ffffffff01f98eee0100000000025251fe87379a\", \"63\", 1, 633826334, \"abe441209165d25bc6d8368f2e7e7dc21019056719fef1ace45542aa2ef282e2\"],\n\t[\"b288c331011c17569293c1e6448e33a64205fc9dc6e35bc756a1ac8b97d18e912ea88dc0770200000007635300ac6aacabfc3c890903a3ccf8040000000004656500ac9c65c9040000000009ab6a6aabab65abac63ac5f7702000000000365005200000000\", \"526a63\", 0, 1574937329, \"0dd1bd5c25533bf5f268aa316ce40f97452cca2061f0b126a59094ca5b65f7a0\"],\n\t[\"fc0a092003cb275fa9a25a72cf85d69c19e4590bfde36c2b91cd2c9c56385f51cc545530210000000004ab530063ffffffff729b006eb6d14d6e5e32b1c376acf1c62830a5d9246da38dbdb4db9f51fd1c74020000000463636500ffffffff0ae695c6d12ab7dcb8d3d4b547b03f178c7268765d1de9af8523d244e3836b12030000000151ffffffff0115c1e20100000000066a6aabac6a6a1ff59aec\", \"ab0053ac\", 0, 931831026, \"73fe22099c826c34a74edf45591f5d7b3a888c8178cd08facdfd96a9a681261c\"],\n\t[\"0fcae7e004a71a4a7c8f66e9450c0c1785268679f5f1a2ee0fb3e72413d70a9049ecff75de020000000452005251ffffffff99c8363c4b95e7ec13b8c017d7bb6e80f7c04b1187d6072961e1c2479b1dc0320200000000ffffffff7cf03b3d66ab53ed740a70c5c392b84f780fff5472aee82971ac3bfeeb09b2df0200000006ab5265636a0058e4fe9257d7c7c7e82ff187757c6eadc14cceb6664dba2de03a018095fd3006682a5b9600000000056353536a636de26b2303ff76de010000000001acdc0a2e020000000001ab0a53ed020000000007530063ab51510088417307\", \"ac6aacab5165535253\", 2, -902160694, \"eea96a48ee572aea33d75d0587ce954fcfb425531a7da39df26ef9a6635201be\"],\n\t[\"612701500414271138e30a46b7a5d95c70c78cc45bf8e40491dac23a6a1b65a51af04e6b94020000000451655153ffffffffeb72dc0e49b2fad3075c19e1e6e4b387f1365dca43d510f6a02136318ddecb7f0200000003536352e115ffc4f9bae25ef5baf534a890d18106fb07055c4d7ec9553ba89ed1ac2101724e507303000000080063006563acabac2ff07f69a080cf61a9d19f868239e6a4817c0eeb6a4f33fe254045d8af2bca289a8695de0300000000430736c404d317840500000000086a00abac5351ab65306e0503000000000963ab0051536aabab6a6c8aca01000000000565516351ab5dcf960100000000016a00000000\", \"ab\", 2, -604581431, \"5ec805e74ee934aa815ca5f763425785ae390282d46b5f6ea076b6ad6255a842\"],\n\t[\"6b68ba00023bb4f446365ea04d68d48539aae66f5b04e31e6b38b594d2723ab82d44512460000000000200acffffffff5dfc6febb484fff69c9eeb7c7eb972e91b6d949295571b8235b1da8955f3137b020000000851ac6352516a535325828c8a03365da801000000000800636aabac6551ab0f594d03000000000963ac536365ac63636a45329e010000000005abac53526a00000000\", \"005151\", 0, 1317038910, \"42f5ba6f5fe1e00e652a08c46715871dc4b40d89d9799fd7c0ea758f86eab6a7\"],\n\t[\"aff5850c0168a67296cc790c1b04a9ed9ad1ba0469263a9432fcb53676d1bb4e0eea8ea1410100000005ac65526a537d5fcb1d01d9c26d0200000000065265ab5153acc0617ca1\", \"51ab650063\", 0, 1712981774, \"8449d5247071325e5f8edcc93cb9666c0fecabb130ce0e5bef050575488477eb\"],\n\t[\"e6d6b9d8042c27aec99af8c12b6c1f7a80453e2252c02515e1f391da185df0874e133696b50300000006ac5165650065ffffffff6a4b60a5bfe7af72b198eaa3cde2e02aa5fa36bdf5f24ebce79f6ecb51f3b554000000000652656aababac2ec4c5a6cebf86866b1fcc4c5bd5f4b19785a8eea2cdfe58851febf87feacf6f355324a80100000001537100145149ac1e287cef62f6f5343579189fad849dd33f25c25bfca841cb696f10c5a34503000000046a636a63df9d7c4c018d96e20100000000015100000000\", \"53ab\", 1, -1924777542, \"f98f95d0c5ec3ac3e699d81f6c440d2e7843eab15393eb023bc5a62835d6dcea\"],\n\t[\"046ac25e030a344116489cc48025659a363da60bc36b3a8784df137a93b9afeab91a04c1ed020000000951ab0000526a65ac51ffffffff6c094a03869fde55b9a8c4942a9906683f0a96e2d3e5a03c73614ea3223b2c29020000000500ab636a6affffffff3da7aa5ecef9071600866267674b54af1740c5aeb88a290c459caa257a2683cb0000000004ab6565ab7e2a1b900301b916030000000005abac63656308f4ed03000000000852ab53ac63ac51ac73d620020000000003ab00008deb1285\", \"6a\", 2, 1299505108, \"f79e6b776e2592bad45ca328c54abf14050c241d8f822d982c36ea890fd45757\"],\n\t[\"bd515acd0130b0ac47c2d87f8d65953ec7d657af8d96af584fc13323d0c182a2e5f9a96573000000000652ac51acac65ffffffff0467aade000000000003655363dc577d050000000006515252ab5300137f60030000000007535163530065004cdc860500000000036a5265241bf53e\", \"acab\", 0, 621090621, \"771d4d87f1591a13d77e51858c16d78f1956712fe09a46ff1abcabbc1e7af711\"],\n\t[\"ff1ae37103397245ac0fa1c115b079fa20930757f5b6623db3579cb7663313c2dc4a3ffdb300000000076353656a000053ffffffff83c59e38e5ad91216ee1a312d15b4267bae2dd2e57d1a3fd5c2f0f809eeb5d46010000000800abab6a6a53ab51ffffffff9d5e706c032c1e0ca75915f8c6686f64ec995ebcd2539508b7dd8abc3e4d7d2a01000000006b2bdcda02a8fe070500000000045253000019e31d04000000000700ab63acab526a00000000\", \"53656aab6a525251\", 0, 881938872, \"726bb88cdf3af2f7603a31f33d2612562306d08972a4412a55dbbc0e3363721c\"],\n\t[\"ff5400dd02fec5beb9a396e1cbedc82bedae09ed44bae60ba9bef2ff375a6858212478844b03000000025253ffffffff01e46c203577a79d1172db715e9cc6316b9cfc59b5e5e4d9199fef201c6f9f0f000000000900ab6552656a5165acffffffff02e8ce62040000000002515312ce3e00000000000251513f119316\", \"\", 0, 1541581667, \"1e0da47eedbbb381b0e0debbb76e128d042e02e65b11125e17fd127305fc65cd\"],\n\t[\"28e3daa603c03626ad91ffd0ff927a126e28d29db5012588b829a06a652ea4a8a5732407030200000004ab6552acffffffff8e643146d3d0568fc2ad854fd7864d43f6f16b84e395db82b739f6f5c84d97b40000000004515165526b01c2dc1469db0198bd884e95d8f29056c48d7e74ff9fd37a9dec53e44b8769a6c99c030200000009ab006a516a53630065eea8738901002398000000000007ac5363516a51abeaef12f5\", \"52ab52515253ab\", 2, 1687390463, \"55591346aec652980885a558cc5fc2e3f8d21cbd09f314a798e5a7ead5113ea6\"],\n\t[\"b54bf5ac043b62e97817abb892892269231b9b220ba08bc8dbc570937cd1ea7cdc13d9676c010000000451ab5365a10adb7b35189e1e8c00b86250f769319668189b7993d6bdac012800f1749150415b2deb0200000003655300ffffffff60b9f4fb9a7e17069fd00416d421f804e2ef2f2c67de4ca04e0241b9f9c1cc5d0200000003ab6aacfffffffff048168461cce1d40601b42fbc5c4f904ace0d35654b7cc1937ccf53fe78505a0100000008526563525265abacffffffff01dbf4e6040000000007acac656553636500000000\", \"63\", 2, 882302077, \"f5b38b0f06e246e47ce622e5ee27d5512c509f8ac0e39651b3389815eff2ab93\"],\n\t[\"ebf628b30360bab3fa4f47ce9e0dcbe9ceaf6675350e638baff0c2c197b2419f8e4fb17e16000000000452516365ac4d909a79be207c6e5fb44fbe348acc42fc7fe7ef1d0baa0e4771a3c4a6efdd7e2c118b0100000003acacacffffffffa6166e9101f03975721a3067f1636cc390d72617be72e5c3c4f73057004ee0ee010000000863636a6a516a5252c1b1e82102d8d54500000000000153324c900400000000015308384913\", \"0063516a51\", 1, -1658428367, \"eb2d8dea38e9175d4d33df41f4087c6fea038a71572e3bad1ea166353bf22184\"],\n\t[\"d6a8500303f1507b1221a91adb6462fb62d741b3052e5e7684ea7cd061a5fc0b0e93549fa50100000004acab65acfffffffffdec79bf7e139c428c7cfd4b35435ae94336367c7b5e1f8e9826fcb0ebaaaea30300000000ffffffffd115fdc00713d52c35ea92805414bd57d1e59d0e6d3b79a77ee18a3228278ada020000000453005151ffffffff040231510300000000085100ac6a6a000063c6041c0400000000080000536a6563acac138a0b04000000000263abd25fbe03000000000900656a00656aac510000000000\", \"ac526aac6a00\", 1, -2007972591, \"13d12a51598b34851e7066cd93ab8c5212d60c6ed2dae09d91672c10ccd7f87c\"],\n\t[\"658cb1c1049564e728291a56fa79987a4ed3146775fce078bd2e875d1a5ca83baf6166a82302000000056a656351ab2170e7d0826cbdb45fda0457ca7689745fd70541e2137bb4f52e7b432dcfe2112807bd720300000007006a0052536351ffffffff8715ca2977696abf86d433d5c920ef26974f50e9f4a20c584fecbb68e530af5101000000009e49d864155bf1d3c757186d29f3388fd89c7f55cc4d9158b4cf74ca27a35a1dd93f945502000000096a535353ac656351510d29fa870230b809040000000006ab6a6a526a633b41da050000000004ab6a6a65ed63bf62\", \"52acabac\", 2, -1774073281, \"53ab197fa7e27b8a3f99ff48305e67081eb90e95d89d7e92d80cee25a03a6689\"],\n\t[\"e92492cc01aec4e62df67ea3bc645e2e3f603645b3c5b353e4ae967b562d23d6e043badecd0100000003acab65ffffffff02c7e5ea040000000002ab52e1e584010000000005536365515195d16047\", \"6551\", 0, -424930556, \"93c34627f526d73f4bea044392d1a99776b4409f7d3d835f23b03c358f5a61c2\"],\n\t[\"02e242db04be2d8ced9179957e98cee395d4767966f71448dd084426844cbc6d15f2182e85030000000200650c8ffce3db9de9c3f9cdb9104c7cb26647a7531ad1ebf7591c259a9c9985503be50f8de30000000007ac6a51636a6353ffffffffa2e33e7ff06fd6469987ddf8a626853dbf30c01719efb259ae768f051f803cd30300000000fffffffffd69d8aead941683ca0b1ee235d09eade960e0b1df3cd99f850afc0af1b73e070300000001ab60bb602a011659670100000000076363526300acac00000000\", \"6353ab515251\", 3, 1451100552, \"bbc9069b8615f3a52ac8a77359098dcc6c1ba88c8372d5d5fe080b99eb781e55\"],\n\t[\"b28d5f5e015a7f24d5f9e7b04a83cd07277d452e898f78b50aae45393dfb87f94a26ef57720200000008ababac630053ac52ffffffff046475ed040000000008ab5100526363ac65c9834a04000000000251abae26b30100000000040000ac65ceefb900000000000000000000\", \"ac6551ac6a536553\", 0, -1756558188, \"5848d93491044d7f21884eef7a244fe7d38886f8ae60df49ce0dfb2a342cd51a\"],\n\t[\"efb8b09801f647553b91922a5874f8e4bb2ed8ddb3536ed2d2ed0698fac5e0e3a298012391030000000952ac005263ac52006affffffff04cdfa0f050000000007ac53ab51abac65b68d1b02000000000553ab65ac00d057d50000000000016a9e1fda010000000007ac63ac536552ac00000000\", \"6aac\", 0, 1947322973, \"603a9b61cd30fcea43ef0a5c18b88ca372690b971b379ee9e01909c336280511\"],\n\t[\"68a59fb901c21946797e7d07a4a3ea86978ce43df0479860d7116ac514ba955460bae78fff0000000001abffffffff03979be80100000000036553639300bc040000000008006552006a656565cfa78d0000000000076552acab63ab5100000000\", \"ab65ab\", 0, 995583673, \"3b320dd47f2702452a49a1288bdc74a19a4b849b132b6cad9a1d945d87dfbb23\"],\n\t[\"67761f2a014a16f3940dcb14a22ba5dc057fcffdcd2cf6150b01d516be00ef55ef7eb07a830100000004636a6a51ffffffff01af67bd050000000008526553526300510000000000\", \"6a00\", 0, 1570943676, \"079fa62e9d9d7654da8b74b065da3154f3e63c315f25751b4d896733a1d67807\"],\n\t[\"e20fe96302496eb436eee98cd5a32e1c49f2a379ceb71ada8a48c5382df7c8cd88bdc47ced03000000016556aa0e180660925a841b457aed0aae47fca2a92fa1d7afeda647abf67198a3902a7c80dd00000000085152ac636a535265bd18335e01803c810100000000046500ac52f371025e\", \"6363ab\", 1, -651254218, \"2921a0e5e3ba83c57ba57c25569380c17986bf34c366ec216d4188d5ba8b0b47\"],\n\t[\"4e1bd9fa011fe7aa14eee8e78f27c9fde5127f99f53d86bc67bdab23ca8901054ee8a8b6eb0300000009ac535153006a6a0063ffffffff044233670500000000000a667205000000000652ab636a51abe5bf35030000000003535351d579e505000000000700630065ab51ac3419ac30\", \"52abac52\", 0, -1807563680, \"4aae6648f856994bed252d319932d78db55da50d32b9008216d5366b44bfdf8a\"],\n\t[\"ec02fbee03120d02fde12574649660c441b40d330439183430c6feb404064d4f507e704f3c0100000000ffffffffe108d99c7a4e5f75cc35c05debb615d52fac6e3240a6964a29c1704d98017fb60200000002ab63fffffffff726ec890038977adfc9dadbeaf5e486d5fcb65dc23acff0dd90b61b8e2773410000000002ac65e9dace55010f881b010000000005ac00ab650000000000\", \"51ac525152ac6552\", 2, -1564046020, \"3f988922d8cd11c7adff1a83ce9499019e5ab5f424752d8d361cf1762e04269b\"],\n\t[\"23dbdcc1039c99bf11938d8e3ccec53b60c6c1d10c8eb6c31197d62c6c4e2af17f52115c3a0300000008636352000063ababffffffff17823880e1df93e63ad98c29bfac12e36efd60254346cac9d3f8ada020afc0620300000003ab63631c26f002ac66e86cd22a25e3ed3cb39d982f47c5118f03253054842daadc88a6c41a2e1500000000096a00ab636a53635163195314de015570fd0100000000096a5263acab5200005300000000\", \"ababac6a6553\", 1, 11586329, \"bd36a50e0e0a4ecbf2709e68daef41eddc1c0c9769efaee57910e99c0a1d1343\"],\n\t[\"33b03bf00222c7ca35c2f8870bbdef2a543b70677e413ce50494ac9b22ea673287b6aa55c50000000005ab00006a52ee4d97b527eb0b427e4514ea4a76c81e68c34900a23838d3e57d0edb5410e62eeb8c92b6000000000553ac6aacac42e59e170326245c000000000009656553536aab516aabb1a10603000000000852ab52ab6a516500cc89c802000000000763ac6a63ac516300000000\", \"\", 0, 557416556, \"41bead1b073e1e9fee065dd612a617ca0689e8f9d3fed9d0acfa97398ebb404c\"],\n\t[\"813eda1103ac8159850b4524ef65e4644e0fc30efe57a5db0c0365a30446d518d9b9aa8fdd0000000003656565c2f1e89448b374b8f12055557927d5b33339c52228f7108228149920e0b77ef0bcd69da60000000006abac00ab63ab82cdb7978d28630c5e1dc630f332c4245581f787936f0b1e84d38d33892141974c75b4750300000004ac53ab65ffffffff0137edfb02000000000000000000\", \"0063\", 1, -1948560575, \"71dfcd2eb7f2e6473aed47b16a6d5fcbd0af22813d892e9765023151e07771ec\"],\n\t[\"9e45d9aa0248c16dbd7f435e8c54ae1ad086de50c7b25795a704f3d8e45e1886386c653fbf01000000025352fb4a1acefdd27747b60d1fb79b96d14fb88770c75e0da941b7803a513e6d4c908c6445c7010000000163ffffffff014069a8010000000001520a794fb3\", \"51ac005363\", 1, -719113284, \"0d31a221c69bd322ef7193dd7359ddfefec9e0a1521d4a8740326d46e44a5d6a\"],\n\t[\"36e42018044652286b19a90e5dd4f8d9f361d0760d080c5c5add1970296ff0f1de630233c8010000000200ac39260c7606017d2246ee14ddb7611586178067e6a4be38e788e33f39a3a95a55a13a6775010000000352ac638bea784f7c2354ed02ea0b93f0240cdfb91796fa77649beee6f7027caa70778b091deee700000000066a65ac656363ffffffff4d9d77ab676d711267ef65363f2d192e1bd55d3cd37f2280a34c72e8b4c559d700000000056a006aab00001764e1020d30220100000000085252516aacab0053472097040000000009635353ab6a636a5100a56407a1\", \"006a536551ab53ab\", 0, 827296034, \"daec2af5622bbe220c762da77bab14dc75e7d28aa1ade9b7f100798f7f0fd97a\"],\n\t[\"5e06159a02762b5f3a5edcdfc91fd88c3bff08b202e69eb5ba74743e9f4291c4059ab008200000000001ac348f5446bb069ef977f89dbe925795d59fb5d98562679bafd61f5f5f3150c3559582992d0000000008ab5165515353abac762fc67703847ec6010000000000e200cf040000000002abaca64b86010000000008520000515363acabb82b491b\", \"ab53525352ab6a\", 0, -61819505, \"75a7db0df41485a28bf6a77a37ca15fa8eccc95b5d6014a731fd8adb9ada0f12\"],\n\t[\"a1948872013b543d6d902ccdeead231c585195214ccf5d39f136023855958436a43266911501000000086aac006a6a6a51514951c9b2038a538a04000000000452526563c0f345050000000007526a5252ac526af9be8e03000000000752acac51ab006306198db2\", \"ab6353\", 0, -326384076, \"ced7ef84aad4097e1eb96310e0d1c8e512cfcb392a01d9010713459b23bc0cf4\"],\n\t[\"c3efabba03cb656f154d1e159aa4a1a4bf9423a50454ebcef07bc3c42a35fb8ad84014864d0000000000d1cc73d260980775650caa272e9103dc6408bdacaddada6b9c67c88ceba6abaa9caa2f7d020000000553536a5265ffffffff9f946e8176d9b11ff854b76efcca0a4c236d29b69fb645ba29d406480427438e01000000066a0065005300ffffffff040419c0010000000003ab6a63cdb5b6010000000009006300ab5352656a63f9fe5e050000000004acac5352611b980100000000086a00acac00006a512d7f0c40\", \"0053\", 0, -59089911, \"c503001c16fbff82a99a18d88fe18720af63656fccd8511bca1c3d0d69bd7fc0\"],\n\t[\"efb55c2e04b21a0c25e0e29f6586be9ef09f2008389e5257ebf2f5251051cdc6a79fce2dac020000000351006affffffffaba73e5b6e6c62048ba5676d18c33ccbcb59866470bb7911ccafb2238cfd493802000000026563ffffffffe62d7cb8658a6eca8a8babeb0f1f4fa535b62f5fc0ec70eb0111174e72bbec5e0300000009abababac516365526affffffffbf568789e681032d3e3be761642f25e46c20322fa80346c1146cb47ac999cf1b0300000000b3dbd55902528828010000000001ab0aac7b0100000000015300000000\", \"acac52\", 3, 1638140535, \"e84444d91580da41c8a7dcf6d32229bb106f1be0c811b2292967ead5a96ce9d4\"],\n\t[\"91d3b21903629209b877b3e1aef09cd59aca6a5a0db9b83e6b3472aceec3bc2109e64ab85a0200000003530065ffffffffca5f92de2f1b7d8478b8261eaf32e5656b9eabbc58dcb2345912e9079a33c4cd010000000700ab65ab00536ad530611da41bbd51a389788c46678a265fe85737b8d317a83a8ff7a839debd18892ae5c80300000007ab6aac65ab51008b86c501038b8a9a05000000000263525b3f7a040000000007ab535353ab00abd4e3ff04000000000665ac51ab65630b7b656f\", \"6551525151516a00\", 2, 499657927, \"ef4bd7622eb7b2bbbbdc48663c1bc90e01d5bde90ff4cb946596f781eb420a0c\"],\n\t[\"5d5c41ad0317aa7e40a513f5141ad5fc6e17d3916eebee4ddb400ddab596175b41a111ead20100000005536a5265acffffffff900ecb5e355c5c9f278c2c6ea15ac1558b041738e4bffe5ae06a9346d66d5b2b00000000080000ab636a65ab6affffffff99f4e08305fa5bd8e38fb9ca18b73f7a33c61ff7b3c68e696b30a04fea87f3ca000000000163d3d1760d019fc13a00000000000000000000\", \"ab53acabab6aac6a52\", 2, 1007461922, \"4012f5ff2f1238a0eb84854074670b4703238ebc15bfcdcd47ffa8498105fcd9\"],\n\t[\"ceecfa6c02b7e3345445b82226b15b7a097563fa7d15f3b0c979232b138124b62c0be007890200000009abac51536a63525253ffffffffbae481ccb4f15d94db5ec0d8854c24c1cc8642bd0c6300ede98a91ca13a4539a0200000001ac50b0813d023110f5020000000006acabac526563e2b0d0040000000009656aac0063516a536300000000\", \"0063526500\", 0, -1862053821, \"e1600e6df8a6160a79ac32aa40bb4644daa88b5f76c0d7d13bf003327223f70c\"],\n\t[\"ae62d5fd0380c4083a26642159f51af24bf55dc69008e6b7769442b6a69a603edd980a33000000000005ab5100ab53ffffffff49d048324d899d4b8ed5e739d604f5806a1104fede4cb9f92cc825a7fa7b4bfe0200000005536a000053ffffffff42e5cea5673c650881d0b4005fa4550fd86de5f21509c4564a379a0b7252ac0e0000000007530000526a53525f26a68a03bfacc3010000000000e2496f000000000009ab5253acac52636563b11cc600000000000700510065526a6a00000000\", \"abab\", 1, -1600104856, \"05cf0ec9c61f1a15f651a0b3c5c221aa543553ce6c804593f43bb5c50bb91ffb\"],\n\t[\"f06f64af04fdcb830464b5efdb3d5ee25869b0744005375481d7b9d7136a0eb8828ad1f0240200000003516563fffffffffd3ba192dabe9c4eb634a1e3079fca4f072ee5ceb4b57deb6ade5527053a92c5000000000165ffffffff39f43401a36ba13a5c6dd7f1190e793933ae32ee3bf3e7bfb967be51e681af760300000009650000536552636a528e34f50b21183952cad945a83d4d56294b55258183e1627d6e8fb3beb8457ec36cadb0630000000005abab530052334a7128014bbfd10100000000085352ab006a63656afc424a7c\", \"53650051635253ac00\", 2, 313255000, \"d309da5afd91b7afa257cfd62df3ca9df036b6a9f4b38f5697d1daa1f587312b\"],\n\t[\"6dfd2f98046b08e7e2ef5fff153e00545faf7076699012993c7a30cb1a50ec528281a9022f030000000152ffffffff1f535e4851920b968e6c437d84d6ecf586984ebddb7d5db6ae035bd02ba222a8010000000651006a53ab51605072acb3e17939fa0737bc3ee43bc393b4acd58451fc4ffeeedc06df9fc649828822d5010000000253525a4955221715f27788d302382112cf60719be9ae159c51f394519bd5f7e70a4f9816c7020200000009526a6a51636aab656a36d3a5ff0445548e0100000000086a6a00516a52655167030b050000000004ac6a63525cfda8030000000000e158200000000000010000000000\", \"535263ac6a65515153\", 3, 585774166, \"72b7da10704c3ca7d1deb60c31b718ee12c70dc9dfb9ae3461edce50789fe2ba\"],\n\t[\"187eafed01389a45e75e9dda526d3acbbd41e6414936b3356473d1f9793d161603efdb45670100000002ab00ffffffff04371c8202000000000563630063523b3bde02000000000753516563006300e9e765010000000005516aac656a373f9805000000000665525352acab08d46763\", \"ab\", 0, 122457992, \"393aa6c758e0eed15fa4af6d9e2d7c63f49057246dbb92b4268ec24fc87301ca\"],\n\t[\"7d50b977035d50411d814d296da9f7965ddc56f3250961ca5ba805cadd0454e7c521e31b0300000000003d0416c2cf115a397bacf615339f0e54f6c35ffec95aa009284d38390bdde1595cc7aa7c0100000005ab52ac5365ffffffff4232c6e796544d5ac848c9dc8d25cfa74e32e847a5fc74c74d8f38ca51188562030000000653ac51006a51ffffffff016bd8bb00000000000465ab5253163526f3\", \"51ab526a00005353\", 1, -1311316785, \"60b7544319b42e4159976c35c32c2644f0adf42eff13be1dc2f726fc0b6bb492\"],\n\t[\"2a45cd1001bf642a2315d4a427eddcc1e2b0209b1c6abd2db81a800c5f1af32812de42032702000000050051525200ffffffff032177db050000000005530051abac49186f000000000004ab6aab00645c0000000000000765655263acabac00000000\", \"6a65\", 0, -1774715722, \"6a9ac3f7da4c7735fbc91f728b52ecbd602233208f96ac5592656074a5db118a\"],\n\t[\"479358c202427f3c8d19e2ea3def6d6d3ef2281b4a93cd76214f0c7d8f040aa042fe19f71f0300000001abffffffffa2709be556cf6ecaa5ef530df9e4d056d0ed57ce96de55a5b1f369fa40d4e74a020000000700006a51635365c426be3f02af578505000000000363ab63fd8f590500000000065153abac53632dfb14b3\", \"520063ab51\", 1, -763226778, \"cfe147982afacde044ce66008cbc5b1e9f0fd9b8ed52b59fc7c0fecf95a39b0e\"],\n\t[\"76179a8e03bec40747ad65ab0f8a21bc0d125b5c3c17ad5565556d5cb03ade7c83b4f32d98030000000151ffffffff99b900504e0c02b97a65e24f3ad8435dfa54e3c368f4e654803b756d011d24150200000003ac5353617a04ac61bb6cf697cfa4726657ba35ed0031432da8c0ffb252a190278830f9bd54f0320100000006656551005153c8e8fc8803677c77020000000007ac6553535253ac70f442030000000001535be0f20200000000026300bf46cb3a\", \"6aab52\", 1, -58495673, \"35e94b3776a6729d20aa2f3ddeeb06d3aad1c14cc4cde52fd21a4efc212ea16c\"],\n\t[\"75ae53c2042f7546223ce5d5f9e00a968ddc68d52e8932ef2013fa40ce4e8c6ed0b6195cde01000000056563ac630079da0452c20697382e3dba6f4fc300da5f52e95a9dca379bb792907db872ba751b8024ee0300000009655151536500005163ffffffffe091b6d43f51ff00eff0ccfbc99b72d3aff208e0f44b44dfa5e1c7322cfc0c5f01000000075200005363ab63ffffffff7e96c3b83443260ac5cfd18258574fbc4225c630d3950df812bf51dceaeb0f9103000000065365655165639a6bf70b01b3e14305000000000563530063ac00000000\", \"6300ab00ac\", 2, 982422189, \"ee4ea49d2aae0dbba05f0b9785172da54408eb1ec67d36759ff7ed25bfc28766\"],\n\t[\"1cdfa01e01e1b8078e9c2b0ca5082249bd18fdb8b629ead659adedf9a0dd5a04031871ba120200000008525351536565ab6affffffff011e28430200000000076a5363636aac52b2febd4a\", \"abacac63656300\", 0, 387396350, \"299dcaac2bdaa627eba0dfd74767ee6c6f27c9200b49da8ff6270b1041669e7e\"],\n\t[\"cc28c1810113dfa6f0fcd9c7d9c9a30fb6f1d774356abeb527a8651f24f4e6b25cf763c4e00300000003ab636affffffff02dfc6050000000000080053636351ab0052afd56903000000000453ab5265f6c90d99\", \"006551abacacac\", 0, 1299280838, \"a4c0773204ab418a939e23f493bd4b3e817375d133d307609e9782f2cc38dbcf\"],\n\t[\"ca816e7802cd43d66b9374cd9bf99a8da09402d69c688d8dcc5283ace8f147e1672b757e020200000005516aabab5240fb06c95c922342279fcd88ba6cd915933e320d7becac03192e0941e0345b79223e89570300000004005151ac353ecb5d0264dfbd010000000005ac6aacababd5d70001000000000752ac53ac6a5151ec257f71\", \"63ac\", 1, 774695685, \"cc180c4f797c16a639962e7aec58ec4b209853d842010e4d090895b22e7a7863\"],\n\t[\"b42b955303942fedd7dc77bbd9040aa0de858afa100f399d63c7f167b7986d6c2377f66a7403000000066aac00525100ffffffff0577d04b64880425a3174055f94191031ad6b4ca6f34f6da9be7c3411d8b51fc000000000300526a6391e1cf0f22e45ef1c44298523b516b3e1249df153590f592fcb5c5fc432dc66f3b57cb03000000046a6aac65ffffffff0393a6c9000000000004516a65aca674ac0400000000046a525352c82c370000000000030053538e577f89\", \"\", 1, -1237094944, \"566953eb806d40a9fb684d46c1bf8c69dea86273424d562bd407b9461c8509af\"],\n\t[\"92c9fe210201e781b72554a0ed5e22507fb02434ddbaa69aff6e74ea8bad656071f1923f3f02000000056a63ac6a514470cef985ba83dcb8eee2044807bedbf0d983ae21286421506ae276142359c8c6a34d68020000000863ac63525265006aa796dd0102ca3f9d05000000000800abab52ab535353cd5c83010000000007ac00525252005322ac75ee\", \"5165\", 0, 97879971, \"6e6307cef4f3a9b386f751a6f40acebab12a0e7e17171d2989293cbec7fd45c2\"],\n\t[\"ccca1d5b01e40fe2c6b3ee24c660252134601dab785b8f55bd6201ffaf2fddc7b3e2192325030000000365535100496d4703b4b66603000000000665535253ac633013240000000000015212d2a502000000000951abac636353636a5337b82426\", \"0052\", 0, -1691630172, \"577bf2b3520b40aef44899a20d37833f1cded6b167e4d648fc5abe203e43b649\"],\n\t[\"bc1a7a3c01691e2d0c4266136f12e391422f93655c71831d90935fbda7e840e50770c61da20000000008635253abac516353ffffffff031f32aa020000000003636563786dbc0200000000003e950f00000000000563516a655184b8a1de\", \"51536a\", 0, -1627072905, \"730bc25699b46703d7718fd5f5c34c4b5f00f594a9968ddc247fa7d5175124ed\"],\n\t[\"076d209e02d904a6c40713c7225d23e7c25d4133c3c3477828f98c7d6dbd68744023dbb66b030000000753ab00536565acffffffff10975f1b8db8861ca94c8cc7c7cff086ddcd83e10b5fffd4fc8f2bdb03f9463c0100000000ffffffff029dff76010000000006526365530051a3be6004000000000000000000\", \"515253ac65acacac\", 1, -1207502445, \"66c488603b2bc53f0d22994a1f0f66fb2958203102eba30fe1d37b27a55de7a5\"],\n\t[\"690fd1f80476db1f9eebe91317f2f130a60cbc1f4feadd9d6474d438e9cb7f91e4994600af0300000004ab536a63a15ce9fa6622d0c4171d895b42bff884dc6e8a7452f827fdc68a29c3c88e6fdee364eaf50000000002ab52ffffffff022dc39d3c0956b24d7f410b1e387859e7a72955f45d6ffb1e884d77888d18fe0300000005ac6a63656afffffffff10b06bce1800f5c49153d24748fdefb0bf514c12863247d1042d56018c3e25c03000000086a63ac6365536a52ffffffff031f162f0500000000060000655265abffbcd40500000000045151ac001a9c8c05000000000652ac53656a6300000000\", \"ac51ab63acac\", 0, -67986012, \"051c0df7ac688c2c930808dabde1f50300aea115f2bb3334f4753d5169b51e46\"],\n\t[\"49ac2af00216c0307a29e83aa5de19770e6b20845de329290bd69cf0e0db7aed61ae41b39002000000035163ac8b2558ef84635bfc59635150e90b61fc753d34acfd10d97531043053e229cd720133cd95000000000463516a51ffffffff02458471040000000008abab636a51ac0065545aa80000000000096a6553516a5263ac6a00000000\", \"51526300ab5363\", 1, 1449668540, \"ddfd902bba312a06197810da96a0ddccb595f96670b28ded7dba88d8cd0469b8\"],\n\t[\"fa4d868b024b010bd5dce46576c2fb489aa60bb797dac3c72a4836f49812c5c564c258414f03000000007a9b3a585e05027bdd89edbadf3c85ac61f8c3a04c773fa746517ae600ff1a9d6b6c02fb0200000004515163abffffffff01b17d020500000000046a65520000000000\", \"536565ab65635363\", 0, -1718953372, \"96c2b32f0a00a5925db7ba72d0b5d39922f30ea0f7443b22bc1b734808513c47\"],\n\t[\"cac6382d0462375e83b67c7a86c922b569a7473bfced67f17afd96c3cd2d896cf113febf9e0300000003006a53ffffffffaa4913b7eae6821487dd3ca43a514e94dcbbf350f8cc4cafff9c1a88720711b800000000096a6a525300acac6353ffffffff184fc4109c34ea27014cc2c1536ef7ed1821951797a7141ddacdd6e429fae6ff01000000055251655200ffffffff9e7b79b4e6836e290d7b489ead931cba65d1030ccc06f20bd4ca46a40195b33c030000000008f6bc8304a09a2704000000000563655353511dbc73050000000000cf34c500000000000091f76e0000000000085200ab00005100abd07208cb\", \"0063656a\", 2, -1488731031, \"bf078519fa87b79f40abc38f1831731422722c59f88d86775535f209cb41b9b1\"],\n\t[\"1711146502c1a0b82eaa7893976fefe0fb758c3f0e560447cef6e1bde11e42de91a125f71c030000000015bd8c04703b4030496c7461482481f290c623be3e76ad23d57a955807c9e851aaaa20270300000000d04abaf20326dcb7030000000001632225350400000000075263ac00520063dddad9020000000000af23d148\", \"52520053510063\", 0, 1852122830, \"e33d5ee08c0f3c130a44d7ce29606450271b676f4a80c52ab9ffab00cecf67f8\"],\n\t[\"8d5b124d0231fbfc640c706ddb1d57bb49a18ba8ca0e1101e32c7e6e65a0d4c7971d93ea360100000008acabac0000abac65ffffffff8fe0fd7696597b845c079c3e7b87d4a44110c445a330d70342a5501955e17dd70100000004ab525363ef22e8a90346629f030000000009516a00ac63acac51657bd57b05000000000200acfd4288050000000009acab5352ab00ab636300000000\", \"53ac526553ab65\", 0, 1253152975, \"8b57a7c3170c6c02dd14ae1d392ce3d828197b20e9145c89c1cfd5de050e1562\"],\n\t[\"38146dc502c7430e92b6708e9e107b61cd38e5e773d9395e5c8ad8986e7e4c03ee1c1e1e760100000000c8962ce2ac1bb3b1285c0b9ba07f4d2e5ce87c738c42ac0548cd8cec1100e6928cd6b0b6010000000763ab636aab52527cccefbd04e5f6f8020000000006006aabacac65ab2c4a00000000000351635209a6f40100000000026aacce57dc040000000008ab5353ab516a516a00000000\", \"ab\", 0, -1205978252, \"3cb5b030e7da0b60ccce5b4a7f3793e6ca56f03e3799fe2d6c3cc22d6d841dcb\"],\n\t[\"22d81c740469695a6a83a9a4824f77ecff8804d020df23713990afce2b72591ed7de98500502000000065352526a6a6affffffff90dc85e118379b1005d7bbc7d2b8b0bab104dad7eaa49ff5bead892f17d8c3ba010000000665656300ab51ffffffff965193879e1d5628b52005d8560a35a2ba57a7f19201a4045b7cbab85133311d0200000003ac005348af21a13f9b4e0ad90ed20bf84e4740c8a9d7129632590349afc03799414b76fd6e826200000000025353ffffffff04a0d40d04000000000060702700000000000652655151516ad31f1502000000000365ac0069a1ac0500000000095100655300ab53525100000000\", \"51636a52ac\", 0, -1644680765, \"add7f5da27262f13da6a1e2cc2feafdc809bd66a67fb8ae2a6f5e6be95373b6f\"],\n\t[\"a27dcbc801e3475174a183586082e0914c314bc9d79d1570f29b54591e5e0dff07fbb45a7f0000000004ac53ab51ffffffff027347f5020000000005535351ab63d0e5c9030000000009ac65ab6a63515200ab7cd632ed\", \"ac63636553\", 0, -686435306, \"883a6ea3b2cc53fe8a803c229106366ca14d25ffbab9fef8367340f65b201da6\"],\n\t[\"b123ed2204410d4e8aaaa8cdb95234ca86dad9ff77fb4ae0fd4c06ebed36794f0215ede0040100000002ac63ffffffff3b58b81b19b90d8f402701389b238c3a84ff9ba9aeea298bbf15b41a6766d27a01000000056a6553ab00151824d401786153b819831fb15926ff1944ea7b03d884935a8bde01ed069d5fd80220310200000000ffffffffa9c9d246f1eb8b7b382a9032b55567e9a93f86c77f4e32c092aa1738f7f756c30100000002ab65ffffffff011a2b48000000000000ed44d1fb\", \"630051ab63\", 2, -1118263883, \"b5dab912bcabedff5f63f6dd395fc2cf030d83eb4dd28214baba68a45b4bfff0\"],\n\t[\"1339051503e196f730955c5a39acd6ed28dec89b4dadc3f7c79b203b344511270e5747fa9900000000045151636affffffff378c6090e08a3895cedf1d25453bbe955a274657172491fd2887ed5c9aceca7b0100000000ffffffffcf7cc3c36ddf9d4749edfa9cefed496d2f86e870deb814bfcd3b5637a5496461030000000451006300ffffffff04dcf3fa010000000008526a63005263acabb41d84040000000004abac5153800eff020000000005656a535365106c5e00000000000000000000\", \"abac5300\", 2, 2013719928, \"7fc74de39ce6ca46ca25d760d3cec7bb21fd14f7efe1c443b5aa294f2cb5f546\"],\n\t[\"0728c606014c1fd6005ccf878196ba71a54e86cc8c53d6db500c3cc0ac369a26fac6fcbc210000000005ab53ac5365ba9668290182d7870100000000066a000053655100000000\", \"65\", 0, 1789961588, \"ab6baa6da3b2bc853868d166f8996ad31d63ef981179f9104f49968fd61c8427\"],\n\t[\"a1134397034bf4067b6c81c581e2b73fb63835a08819ba24e4e92df73074bf773c94577df7000000000465525251ffffffff8b6608feaa3c1f35f49c6330a769716fa01c5c6f6e0cdc2eb10dfc99bbc21e77010000000952656aac005352655180a0bda4bc72002c2ea8262e26e03391536ec36867258cab968a6fd6ec7523b64fa1d8c001000000056a53ac6353ffffffff04dbeeed05000000000553650052abcd5d0e01000000000463abab51104b2e0500000000066aac53ac5165283ca7010000000004535252ab00000000\", \"ab515151516552ab\", 1, -324598676, \"91178482112f94d1c8e929de443e4b9c893e18682998d393ca9ca77950412586\"],\n\t[\"bcdafbae04aa18eb75855aeb1f5124f30044741351b33794254a80070940cb10552fa4fa8e0300000001acd0423fe6e3f3f88ae606f2e8cfab7a5ef87caa2a8f0401765ff9a47d718afcfb40c0099b0000000008ac6565ab53ac6aac645308009d680202d600e492b31ee0ab77c7c5883ebad5065f1ce87e4dfe6453e54023a0010000000151ffffffffb9d818b14245899e1d440152827c95268a676f14c3389fc47f5a11a7b38b1bde03000000026300ffffffff03cda22102000000000751ac535263005100a4d20400000000045200536ac8bef405000000000700ab51ab6563ac00000000\", \"6553516a526aab\", 1, -2111409753, \"5e1849e7368cf4f042718586d9bd831d61479b775bab97aba9f450042bd9876a\"],\n\t[\"ed3bb93802ddbd08cb030ef60a2247f715a0226de390c9c1a81d52e83f8674879065b5f87d0300000003ab6552ffffffff04d2c5e60a21fb6da8de20bf206db43b720e2a24ce26779bca25584c3f765d1e0200000008ab656a6aacab00ab6e946ded025a811d04000000000951abac6352ac00ab5143cfa3030000000005635200636a00000000\", \"5352ac650065535300\", 1, -668727133, \"e9995065e1fddef72a796eef5274de62012249660dc9d233a4f24e02a2979c87\"],\n\t[\"59f4629d030fa5d115c33e8d55a79ea3cba8c209821f979ed0e285299a9c72a73c5bba00150200000002636affffffffd8aca2176df3f7a96d0dc4ee3d24e6cecde1582323eec2ebef9a11f8162f17ac0000000007ab6565acab6553ffffffffeebc10af4f99c7a21cbc1d1074bd9f0ee032482a71800f44f26ee67491208e0403000000065352ac656351ffffffff0434e955040000000004ab515152caf2b305000000000365ac007b1473030000000003ab530033da970500000000060051536a5253bb08ab51\", \"\", 2, 396340944, \"0e9c47973ef2c292b2252c623f465bbb92046fe0b893eebf4e1c9e02cb01c397\"],\n\t[\"286e3eb7043902bae5173ac3b39b44c5950bc363f474386a50b98c7bdab26f98dc83449c4a020000000752ac6a00510051ffffffff4339cd6a07f5a5a2cb5815e5845da70300f5c7833788363bf7fe67595d3225520100000000fffffffff9c2dd8b06ad910365ffdee1a966f124378a2b8021065c8764f6138bb1e951380200000005ab5153ac6affffffff0370202aba7a68df85436ea7c945139513384ef391fa33d16020420b8ad40e9a000000000900ab5165526353abacffffffff020c1907000000000004abac526a1b490b040000000000df1528f7\", \"5353ab\", 3, -1407529517, \"32154c09174a9906183abf26538c39e78468344ca0848bbd0785e24a3565d932\"],\n\t[\"2e245cf80179e2e95cd1b34995c2aff49fe4519cd7cee93ad7587f7f7e8105fc2dff206cd30200000009006a63516a6553ab52350435a201d5ed2d02000000000352ab6558552c89\", \"00ab53\", 0, -233917810, \"4605ae5fd3d50f9c45d37db7118a81a9ef6eb475d2333f59df5d3e216f150d49\"],\n\t[\"33a98004029d262f951881b20a8d746c8c707ea802cd2c8b02a33b7e907c58699f97e42be80100000007ac53536552abacdee04cc01d205fd8a3687fdf265b064d42ab38046d76c736aad8865ca210824b7c622ecf02000000070065006a536a6affffffff01431c5d010000000000270d48ee\", \"\", 1, 921554116, \"ff9d7394002f3f196ea25472ea6c46f753bd879a7244795157bb7235c9322902\"],\n\t[\"aac18f2b02b144ed481557c53f2146ae523f24fcde40f3445ab0193b6b276c315dc2894d2300000000075165650000636a233526947dbffc76aec7db1e1baa6868ad4799c76e14794dcbaaec9e713a83967f6a65170200000005abac6551ab27d518be01b652a30000000000015300000000\", \"52ac5353\", 1, 1559377136, \"59fc2959bb7bb24576cc8a237961ed95bbb900679d94da6567734c4390cb6ef5\"],\n\t[\"5ab79881033555b65fe58c928883f70ce7057426fbdd5c67d7260da0fe8b1b9e6a2674cb850300000009ac516aac6aac006a6affffffffa5be9223b43c2b1a4d120b5c5b6ec0484f637952a3252181d0f8e813e76e11580200000000e4b5ceb8118cb77215bbeedc9a076a4d087bb9cd1473ea32368b71daeeeacc451ec209010000000005acac5153aced7dc34e02bc5d11030000000005ac5363006a54185803000000000552ab00636a00000000\", \"5100\", 1, 1927062711, \"e9f53d531c12cce1c50abed4ac521a372b4449b6a12f9327c80020df6bff66c0\"],\n\t[\"6c2c8fac0124b0b7d4b610c3c5b91dee32b7c927ac71abdf2d008990ca1ac40de0dfd530660300000006ababac5253656bd7eada01d847ec000000000004ac52006af4232ec8\", \"6a6a6a0051\", 0, -340809707, \"fb51eb9d7e47d32ff2086205214f90c7c139e08c257a64829ae4d2b301071c6a\"],\n\t[\"6e3880af031735a0059c0bb5180574a7dcc88e522c8b56746d130f8d45a52184045f96793e0100000008acabac6a526a6553fffffffffe05f14cdef7d12a9169ec0fd37524b5fcd3295f73f48ca35a36e671da4a2f560000000008006a526a6351ab63ffffffffdfbd869ac9e472640a84caf28bdd82e8c6797f42d03b99817a705a24fde2736600000000010090a090a503db956b04000000000952ac53ab6a536a63ab358390010000000009656a5200525153ac65353ee204000000000763530052526aaba6ad83fb\", \"535151ab6300\", 2, 222014018, \"57a34ddeb1bf36d28c7294dda0432e9228a9c9e5cc5c692db98b6ed2e218d825\"],\n\t[\"8df1cd19027db4240718dcaf70cdee33b26ea3dece49ae6917331a028c85c5a1fb7ee3e475020000000865ab6a00510063636157988bc84d8d55a8ba93cdea001b9bf9d0fa65b5db42be6084b5b1e1556f3602f65d4d0100000005ac00ab0052206c852902b2fb54030000000008ac5252536aacac5378c4a5050000000007acabac535163532784439e\", \"acab6a\", 0, 1105620132, \"edb7c74223d1f10f9b3b9c1db8064bc487321ff7bb346f287c6bc2fad83682de\"],\n\t[\"0e803682024f79337b25c98f276d412bc27e56a300aa422c42994004790cee213008ff1b8303000000080051ac65ac655165f421a331892b19a44c9f88413d057fea03c3c4a6c7de4911fe6fe79cf2e9b3b10184b1910200000005525163630096cb1c670398277204000000000253acf7d5d502000000000963536a6a636a5363ab381092020000000002ac6a911ccf32\", \"6565\", 1, -1492094009, \"f0672638a0e568a919e9d8a9cbd7c0189a3e132940beeb52f111a89dcc2daa2c\"],\n\t[\"7d71669d03022f9dd90edac323cde9e56354c6804c6b8e687e9ae699f46805aafb8bcaa636000000000253abffffffff698a5fdd3d7f2b8b000c68333e4dd58fa8045b3e2f689b889beeb3156cecdb490300000009525353abab0051acabc53f0aa821cdd69b473ec6e6cf45cf9b38996e1c8f52c27878a01ec8bb02e8cb31ad24e500000000055353ab0052ffffffff0447a23401000000000565ab53ab5133aaa0030000000006515163656563057d110300000000056a6aacac52cf13b5000000000003526a5100000000\", \"6a6a51\", 1, -1349253507, \"722efdd69a7d51d3d77bed0ac5544502da67e475ea5857cd5af6bdf640a69945\"],\n\t[\"9ff618e60136f8e6bb7eabaaac7d6e2535f5fba95854be6d2726f986eaa9537cb283c701ff02000000026a65ffffffff012d1c0905000000000865ab00ac6a516a652f9ad240\", \"51515253635351ac\", 0, 1571304387, \"659cd3203095d4a8672646add7d77831a1926fc5b66128801979939383695a79\"],\n\t[\"9fbd43ac025e1462ecd10b1a9182a8e0c542f6d1089322a41822ab94361e214ed7e1dfdd8a020000000263519d0437581538e8e0b6aea765beff5b4f3a4a202fca6e5d19b34c141078c6688f71ba5b8e0100000003ac6552ffffffff02077774050000000009655153655263acab6a0ae4e10100000000035152524c97136b\", \"635152ab\", 0, 1969622955, \"d82d4ccd9b67810f26a378ad9592eb7a30935cbbd27e859b00981aefd0a72e08\"],\n\t[\"0117c92004314b84ed228fc11e2999e657f953b6de3b233331b5f0d0cf40d5cc149b93c7b30300000005515263516a083e8af1bd540e54bf5b309d36ba80ed361d77bbf4a1805c7aa73667ad9df4f97e2da410020000000600ab6351ab524d04f2179455e794b2fcb3d214670001c885f0802e4b5e015ed13a917514a7618f5f332203000000086a536aab51000063ecf029e65a4a009a5d67796c9f1eb358b0d4bd2620c8ad7330fb98f5a802ab92d0038b1002000000036a6551a184a88804b04490000000000009ab6a5152535165526a33d1ab020000000001518e92320000000000002913df04000000000952abac6353525353ac8b19bfdf\", \"000051ab0000\", 0, 489433059, \"8eebac87e60da524bbccaf285a44043e2c9232868dda6c6271a53c153e7f3a55\"],\n\t[\"e7f5482903f98f0299e0984b361efb2fddcd9979869102281e705d3001a9d283fe9f3f3a1e02000000025365ffffffffcc5c7fe82feebad32a22715fc30bc584efc9cd9cadd57e5bc4b6a265547e676e0000000001ab579d21235bc2281e08bf5e7f8f64d3afb552839b9aa5c77cf762ba2366fffd7ebb74e49400000000055263ab63633df82cf40100982e05000000000453ac535300000000\", \"acacab\", 2, -1362931214, \"046de666545330e50d53083eb78c9336416902f9b96c77cc8d8e543da6dfc7e4\"],\n\t[\"09adb2e90175ca0e816326ae2dce7750c1b27941b16f6278023dbc294632ab97977852a09d030000000465ab006affffffff027739cf0100000000075151ab63ac65ab8a5bb601000000000653ac5151520011313cdc\", \"ac\", 0, -76831756, \"478ee06501b4965b40bdba6cbaad9b779b38555a970912bb791b86b7191c54bc\"],\n\t[\"f973867602e30f857855cd0364b5bbb894c049f44abbfd661d7ae5dbfeaafca89fac8959c20100000005ab52536a51ffffffffbeceb68a4715f99ba50e131884d8d20f4a179313691150adf0ebf29d05f8770303000000066352ab00ac63ffffffff021fddb90000000000036a656322a177000000000008526500ac5100acac84839083\", \"52acab53ac\", 0, 1407879325, \"db0329439490efc64b7104d6d009b03fbc6fac597cf54fd786fbbb5fd73b92b4\"],\n\t[\"fd22ebaa03bd588ad16795bea7d4aa7f7d48df163d75ea3afebe7017ce2f350f6a0c1cb0bb00000000086aabac5153526363ffffffff488e0bb22e26a565d77ba07178d17d8f85702630ee665ec35d152fa05af3bda10200000004515163abffffffffeb21035849e85ad84b2805e1069a91bb36c425dc9c212d9bae50a95b6bfde1200300000001ab5df262fd02b69848040000000008ab6363636a6363ace23bf2010000000007655263635253534348c1da\", \"006353526563516a00\", 0, -1491036196, \"92364ba3c7a85d4e88885b8cb9b520dd81fc29e9d2b750d0790690e9c1246673\"],\n\t[\"130b462d01dd49fac019dc4442d0fb54eaa6b1c2d1ad0197590b7df26969a67abd7f3fbb4f0100000008ac65abac53ab6563ffffffff0345f825000000000004ac53acac9d5816020000000002ababeff8e90500000000086aab006552ac6a53a892dc55\", \"ab0065ac530052\", 0, 944483412, \"1f4209fd4ce7f13d175fdd522474ae9b34776fe11a5f17a27d0796c77a2a7a9d\"],\n\t[\"f8e50c2604609be2a95f6d0f31553081f4e1a49a0a30777fe51eb1c596c1a9a92c053cf28c0300000009656a51ac5252630052fffffffff792ed0132ae2bd2f11d4a2aab9d0c4fbdf9a66d9ae2dc4108afccdc14d2b1700100000007ab6a6563ac636a7bfb2fa116122b539dd6a2ab089f88f3bc5923e5050c8262c112ff9ce0a3cd51c6e3e84f02000000066551ac5352650d5e687ddf4cc9a497087cabecf74d236aa4fc3081c3f67b6d323cba795e10e7a171b725000000000852635351ab635100ffffffff02df5409020000000008ac6a53acab5151004156990200000000045163655200000000\", \"ac53abac65005300\", 0, -173065000, \"b596f206d7eba22b7e2d1b7a4f4cf69c7c541b6c84dcc943f84e19a99a923310\"],\n\t[\"18020dd1017f149eec65b2ec23300d8df0a7dd64fc8558b36907723c03cd1ba672bbb0f51d0300000005ab65ab6a63ffffffff037cd7ae000000000009ab516a65005352ac65f1e4360400000000056353530053f118f0040000000009536363ab006500abac00000000\", \"63ab51acab52ac\", 0, -550412404, \"e19b796c14a0373674968e342f2741d8b51092a5f8409e9bff7dcd52e56fcbcb\"],\n\t[\"b04154610363fdade55ceb6942d5e5a723323863b48a0cb04fdcf56210717955763f56b08d0300000009ac526a525151635151ffffffff93a176e76151a9eabdd7af00ef2af72f9e7af5ecb0aa4d45d00618f394cdd03c030000000074d818b332ebe05dc24c44d776cf9d275c61f471cc01efce12fd5a16464157f1842c65cb00000000066a0000ac6352d3c4134f01d8a1c0030000000005520000005200000000\", \"5200656a656351\", 2, -9757957, \"6e3e5ba77f760b6b5b5557b13043f1262418f3dd2ce7f0298b012811fc8ad5bc\"],\n\t[\"9794b3ce033df7b1e32db62d2f0906b589eacdacf5743963dc2255b6b9a6cba211fadd0d41020000000600ab00650065ffffffffaae00687a6a4131152bbcaafedfaed461c86754b0bde39e2bef720e6d1860a0302000000070065516aac6552ffffffff50e4ef784d6230df7486e972e8918d919f005025bc2d9aacba130f58bed7056703000000075265ab52656a52ffffffff02c6f1a9000000000006005251006363cf450c040000000008abab63510053abac00000000\", \"ac0063ababab515353\", 1, 2063905082, \"fad092fc98f17c2c20e10ba9a8eb44cc2bcc964b006f4da45cb9ceb249c69698\"],\n\t[\"94533db7015e70e8df715066efa69dbb9c3a42ff733367c18c22ff070392f988f3b93920820000000006535363636300ce4dac3e03169af80300000000080065ac6a53ac65ac39c050020000000006abacab6aacac708a02050000000005ac5251520000000000\", \"6553\", 0, -360458507, \"5418cf059b5f15774836edd93571e0eed3855ba67b2b08c99dccab69dc87d3e9\"],\n\t[\"c8597ada04f59836f06c224a2640b79f3a8a7b41ef3efa2602592ddda38e7597da6c639fee0300000009005251635351acabacffffffff4c518f347ee694884b9d4072c9e916b1a1f0a7fc74a1c90c63fdf8e5a185b6ae02000000007113af55afb41af7518ea6146786c7c726641c68c8829a52925e8d4afd07d8945f68e7230300000008ab00ab65ab650063ffffffffc28e46d7598312c420e11dfaae12add68b4d85adb182ae5b28f8340185394b63000000000165ffffffff04dbabb7010000000000ee2f6000000000000852ab6500ab6a51acb62a27000000000009ac53515300ac006a6345fb7505000000000752516a0051636a00000000\", \"\", 3, 15199787, \"0d66003aff5bf78cf492ecbc8fd40c92891acd58d0a271be9062e035897f317e\"],\n\t[\"1a28c4f702c8efaad96d879b38ec65c5283b5c084b819ad7db1c086e85e32446c7818dc7a90300000008656351536a525165fa78cef86c982f1aac9c5eb8b707aee8366f74574c8f42ef240599c955ef4401cf578be30200000002ab518893292204c430eb0100000000016503138a0300000000040053abac60e0eb010000000005525200ab63567c2d030000000004abab52006cf81e85\", \"ab51525152\", 1, 2118315905, \"4e4c9a781f626b59b1d3ad8f2c488eb6dee8bb19b9bc138bf0dc33e7799210d4\"],\n\t[\"c6c7a87003f772bcae9f3a0ac5e499000b68703e1804b9ddc3e73099663564d53ddc4e1c6e01000000076a536a6aac63636e3102122f4c30056ef8711a6bf11f641ddfa6984c25ac38c3b3e286e74e839198a80a34010000000165867195cd425821dfa2f279cb1390029834c06f018b1e6af73823c867bf3a0524d1d6923b0300000005acab53ab65ffffffff02fa4c49010000000008ab656a0052650053e001100400000000008836d972\", \"ac526351acab\", 1, 978122815, \"a869c18a0edf563d6e5eddd5d5ae8686f41d07f394f95c9feb8b7e52761531ca\"],\n\t[\"0ea580ac04c9495ab6af3b8d59108bb4194fcb9af90b3511c83f7bb046d87aedbf8423218e02000000085152acac006363ab9063d7dc25704e0caa5edde1c6f2dd137ded379ff597e055b2977b9c559b07a7134fcef2000000000200aca89e50181f86e9854ae3b453f239e2847cf67300fff802707c8e3867ae421df69274449402000000056365abababffffffff47a4760c881a4d7e51c69b69977707bd2fb3bcdc300f0efc61f5840e1ac72cee0000000000ffffffff0460179a020000000004ab53ab52a5250c0500000000096565acac6365ab52ab6c281e02000000000952635100ac006563654e55070400000000046552526500000000\", \"ab526563acac53ab\", 2, 1426964167, \"b1c50d58b753e8f6c7513752158e9802cf0a729ebe432b99acc0fe5d9b4e9980\"],\n\t[\"c33028b301d5093e1e8397270d75a0b009b2a6509a01861061ab022ca122a6ba935b8513320200000000ffffffff013bcf5a0500000000015200000000\", \"\", 0, -513413204, \"6b1459536f51482f5dbf42d7e561896557461e1e3b6bf67871e2b51faae2832c\"],\n\t[\"43b2727901a7dd06dd2abf690a1ccedc0b0739cb551200796669d9a25f24f71d8d101379f50300000000ffffffff0418e031040000000000863d770000000000085352ac526563ac5174929e040000000004ac65ac00ec31ac0100000000066a51ababab5300000000\", \"65\", 0, -492874289, \"154ff7a9f0875edcfb9f8657a0b98dd9600fabee3c43eb88af37cf99286d516c\"],\n\t[\"4763ed4401c3e6ab204bed280528e84d5288f9cac5fb8a2e7bd699c7b98d4df4ac0c40e55303000000066a6aacab5165ffffffff015b57f80400000000046a63535100000000\", \"ac51abab53\", 0, -592611747, \"849033a2321b5755e56ef4527ae6f51e30e3bca50149d5707368479723d744f8\"],\n\t[\"d24f647b02f71708a880e6819a1dc929c1a50b16447e158f8ff62f9ccd644e0ca3c592593702000000050053536a00ffffffff67868cd5414b6ca792030b18d649de5450a456407242b296d936bcf3db79e07b02000000005af6319c016022f50100000000036a516300000000\", \"6aab526353516a6a\", 0, 1350782301, \"8556fe52d1d0782361dc28baaf8774b13f3ce5ed486ae0f124b665111e08e3e3\"],\n\t[\"fe6ddf3a02657e42a7496ef170b4a8caf245b925b91c7840fd28e4a22c03cb459cb498b8d603000000065263656a650071ce6bf8d905106f9f1faf6488164f3decac65bf3c5afe1dcee20e6bc3cb6d052561985a030000000163295b117601343dbb0000000000026563dba521df\", \"\", 1, -1696179931, \"d9684685c99ce48f398fb467a91a1a59629a850c429046fb3071f1fa9a5fe816\"],\n\t[\"c61523ef0129bb3952533cbf22ed797fa2088f307837dd0be1849f20decf709cf98c6f032f03000000026563c0f1d378044338310400000000066363516a5165a14fcb0400000000095163536a6a00ab53657271d60200000000001d953f0500000000010000000000\", \"53516353005153\", 0, 1141615707, \"7e975a72db5adaa3c48d525d9c28ac11cf116d0f8b16ce08f735ad75a80aec66\"],\n\t[\"ba3dac6c0182562b0a26d475fe1e36315f0913b6869bdad0ecf21f1339a5fcbccd32056c840200000000ffffffff04300351050000000000220ed405000000000851abac636565ac53dbbd19020000000007636363ac6a52acbb005a0500000000016abd0c78a8\", \"63006a635151005352\", 0, 1359658828, \"47bc8ab070273e1f4a0789c37b45569a6e16f3f3092d1ce94dddc3c34a28f9f4\"],\n\t[\"ac27e7f5025fc877d1d99f7fc18dd4cadbafa50e34e1676748cc89c202f93abf36ed46362101000000036300abffffffff958cd5381962b765e14d87fc9524d751e4752dd66471f973ed38b9d562e525620100000003006500ffffffff02b67120050000000004ac51516adc330c0300000000015200000000\", \"656352\", 1, 15049991, \"f3374253d64ac264055bdbcc32e27426416bd595b7c7915936c70f839e504010\"],\n\t[\"edb30140029182b80c8c3255b888f7c7f061c4174d1db45879dca98c9aab8c8fed647a6ffc03000000086a53510052ab6300ffffffff82f65f261db62d517362c886c429c8fbbea250bcaad93356be6f86ba573e9d930100000000ffffffff04daaf150400000000016a86d1300100000000096a6353535252ac5165d4ddaf000000000002abab5f1c6201000000000000000000\", \"ab6a6a00ac\", 0, -2058017816, \"8d7794703dad18e2e40d83f3e65269834bb293e2d2b8525932d6921884b8f368\"],\n\t[\"7e50207303146d1f7ad62843ae8017737a698498d4b9118c7a89bb02e8370307fa4fada41d000000000753006300005152b7afefc85674b1104ba33ef2bf37c6ed26316badbc0b4aa6cb8b00722da4f82ff3555a6c020000000900ac656363ac51ac52ffffffff93fab89973bd322c5d7ad7e2b929315453e5f7ada3072a36d8e33ca8bebee6e0020000000300acab930da52b04384b04000000000004650052ac435e380200000000076a6a515263ab6aa9494705000000000600ab6a525252af8ba90100000000096565acab526353536a279b17ad\", \"acac005263536aac63\", 1, -34754133, \"4e6357da0057fb7ff79da2cc0f20c5df27ff8b2f8af4c1709e6530459f7972b0\"],\n\t[\"c05764f40244fb4ebe4c54f2c5298c7c798aa90e62c29709acca0b4c2c6ec08430b26167440100000008acab6a6565005253ffffffffc02c2418f398318e7f34a3cf669d034eef2111ea95b9f0978b01493293293a870100000000e563e2e00238ee8d040000000002acab03fb060200000000076500ac656a516aa37f5534\", \"52ab6a0065\", 1, -2033176648, \"83deef4a698b62a79d4877dd9afebc3011a5275dbe06e89567e9ef84e8a4ee19\"],\n\t[\"5a59e0b9040654a3596d6dab8146462363cd6549898c26e2476b1f6ae42915f73fd9aedfda00000000036363abffffffff9ac9e9ca90be0187be2214251ff08ba118e6bf5e2fd1ba55229d24e50a510d53010000000165ffffffff41d42d799ac4104644969937522873c0834cc2fcdab7cdbecd84d213c0e96fd60000000000ffffffffd838db2c1a4f30e2eaa7876ef778470f8729fcf258ad228b388df2488709f8410300000000fdf2ace002ceb6d903000000000265654c1310040000000003ac00657e91c0ec\", \"536a63ac\", 0, 82144555, \"98ccde2dc14d14f5d8b1eeea5364bd18fc84560fec2fcea8de4d88b49c00695e\"],\n\t[\"156ebc8202065d0b114984ee98c097600c75c859bfee13af75dc93f57c313a877efb09f230010000000463536a51ffffffff81114e8a697be3ead948b43b5005770dd87ffb1d5ccd4089fa6c8b33d3029e9c03000000066a5251656351ffffffff01a87f140000000000050000ac51ac00000000\", \"00\", 0, -362221092, \"a903c84d8c5e71134d1ab6dc1e21ac307c4c1a32c90c90f556f257b8a0ec1bf5\"],\n\t[\"15e37793023c7cbf46e073428908fce0331e49550f2a42b92468827852693f0532a01c29f70200000007005353636351acffffffff38426d9cec036f00eb56ec1dcd193647e56a7577278417b8a86a78ac53199bc403000000056353006a53ffffffff04a25ce103000000000900ab5365656a526a63c8eff7030000000004526353537ab6db0200000000016a11a3fa02000000000651acacab526500000000\", \"53ac6aab6a6551\", 0, 1117532791, \"83c68b3c5a89260ce16ce8b4dbf02e1f573c532d9a72f5ea57ab419fa2630214\"],\n\t[\"f7a09f10027250fc1b70398fb5c6bffd2be9718d3da727e841a73596fdd63810c9e4520a6a010000000963ac516a636a65acac1d2e2c57ab28d311edc4f858c1663972eebc3bbc93ed774801227fda65020a7ec1965f780200000005ac5252516a8299fddc01dcbf7200000000000463ac6551960fda03\", \"65acab51\", 1, 2017321737, \"9c5fa02abfd34d0f9dec32bf3edb1089fca70016debdb41f4f54affcb13a2a2a\"],\n\t[\"6d97a9a5029220e04f4ccc342d8394c751282c328bf1c132167fc05551d4ca4da4795f6d4e02000000076a0052ab525165ffffffff9516a205e555fa2a16b73e6db6c223a9e759a7e09c9a149a8f376c0a7233fa1b0100000007acab51ab63ac6affffffff04868aed04000000000652ac65ac536a396edf01000000000044386c0000000000076aab5363655200894d48010000000001ab8ebefc23\", \"6351526aac51\", 1, 1943666485, \"f0bd4ca8e97203b9b4e86bc24bdc8a1a726db5e99b91000a14519dc83fc55c29\"],\n\t[\"8e3fddfb028d9e566dfdda251cd874cd3ce72e9dde837f95343e90bd2a93fe21c5daeb5eed01000000045151525140517dc818181f1e7564b8b1013fd68a2f9a56bd89469686367a0e72c06be435cf99db750000000003635251ffffffff01c051780300000000096552ababac6a65acab099766eb\", \"5163ab6a52ababab51\", 1, 1296295812, \"5509eba029cc11d7dd2808b8c9eb47a19022b8d8b7778893459bbc19ab7ea820\"],\n\t[\"a603f37b02a35e5f25aae73d0adc0b4b479e68a734cf722723fd4e0267a26644c36faefdab0200000000ffffffff43374ad26838bf733f8302585b0f9c22e5b8179888030de9bdda180160d770650200000001004c7309ce01379099040000000005526552536500000000\", \"abababab005153\", 0, 1409936559, \"4ca73da4fcd5f1b10da07998706ffe16408aa5dff7cec40b52081a6514e3827e\"],\n\t[\"9eeedaa8034471a3a0e3165620d1743237986f060c4434f095c226114dcb4b4ec78274729f03000000086a5365510052ac6afb505af3736e347e3f299a58b1b968fce0d78f7457f4eab69240cbc40872fd61b5bf8b120200000002ac52df8247cf979b95a4c97ecb8edf26b3833f967020cd2fb25146a70e60f82c9ee4b14e88b103000000008459e2fa0125cbcd05000000000000000000\", \"52ab5352006353516a\", 0, -1832576682, \"fb018ae54206fdd20c83ae5873ec82b8e320a27ed0d0662db09cda8a071f9852\"],\n\t[\"05921d7c048cf26f76c1219d0237c226454c2a713c18bf152acc83c8b0647a94b13477c07f0300000003ac526afffffffff2f494453afa0cabffd1ba0a626c56f90681087a5c1bd81d6adeb89184b27b7402000000036a6352ffffffff0ad10e2d3ce355481d1b215030820da411d3f571c3f15e8daf22fe15342fed04000000000095f29f7b93ff814a9836f54dc6852ec414e9c4e16a506636715f569151559100ccfec1d100000000055263656a53ffffffff04f4ffef010000000008ac6a6aabacabab6a0e6689040000000006ab536a5352abe364d005000000000965536363655251ab53807e00010000000004526aab63f18003e3\", \"6363ac51\", 3, -375891099, \"001b0b176f0451dfe2d9787b42097ceb62c70d324e925ead4c58b09eebdf7f67\"],\n\t[\"b9b44d9f04b9f15e787d7704e6797d51bc46382190c36d8845ec68dfd63ee64cf7a467b21e00000000096aac00530052ab636aba1bcb110a80c5cbe073f12c739e3b20836aa217a4507648d133a8eedd3f02cb55c132b203000000076a000063526352b1c288e3a9ff1f2da603f230b32ef7c0d402bdcf652545e2322ac01d725d75f5024048ad0100000000ffffffffffd882d963be559569c94febc0ef241801d09dc69527c9490210f098ed8203c700000000056a006300ab9109298d01719d9a0300000000066a52ab006365d7894c5b\", \"ac6351650063636a\", 3, -622355349, \"ac87b1b93a6baab6b2c6624f10e8ebf6849b0378ef9660a3329073e8f5553c8d\"],\n\t[\"ff60473b02574f46d3e49814c484081d1adb9b15367ba8487291fc6714fd6e3383d5b335f001000000026a6ae0b82da3dc77e5030db23d77b58c3c20fa0b70aa7d341a0f95f3f72912165d751afd57230300000008ac536563516a6363ffffffff04f86c0200000000000553acab636ab13111000000000003510065f0d3f305000000000951ab516a65516aabab730a3a010000000002515200000000\", \"ac6a\", 1, 1895032314, \"0767e09bba8cd66d55915677a1c781acd5054f530d5cf6de2d34320d6c467d80\"],\n\t[\"f218026204f4f4fc3d3bd0eada07c57b88570d544a0436ae9f8b753792c0c239810bb30fbc0200000002536affffffff8a468928d6ec4cc10aa0f73047697970e99fa64ae8a3b4dca7551deb0b639149010000000851ab520052650051ffffffffa98dc5df357289c9f6873d0f5afcb5b030d629e8f23aa082cf06ec9a95f3b0cf0000000000ffffffffea2c2850c5107705fd380d6f29b03f533482fd036db88739122aac9eff04e0aa010000000365536a03bd37db034ac4c4020000000007515152655200ac33b27705000000000151efb71e0000000000007b65425b\", \"515151\", 3, -1772252043, \"de35c84a58f2458c33f564b9e58bc57c3e028d629f961ad1b3c10ee020166e5a\"],\n\t[\"48e7d42103b260b27577b70530d1ac2fed2551e9dd607cbcf66dca34bb8c03862cf8f5fd5401000000075151526aacab00ffffffff1e3d3b841552f7c6a83ee379d9d66636836673ce0b0eda95af8f2d2523c91813030000000665acac006365ffffffff388b3c386cd8c9ef67c83f3eaddc79f1ff910342602c9152ffe8003bce51b28b0100000008636363006a636a52ffffffff04b8f67703000000000852005353ac6552520cef720200000000085151ab6352ab00ab5096d6030000000005516a005100662582020000000001ac6c137280\", \"6a65\", 1, 1513618429, \"e2fa3e1976aed82c0987ab30d4542da2cb1cffc2f73be13480132da8c8558d5c\"],\n\t[\"91ebc4cf01bc1e068d958d72ee6e954b196f1d85b3faf75a521b88a78021c543a06e056279000000000265ab7c12df0503832121030000000000cc41a6010000000005ab5263516540a951050000000006ab63ab65acac00000000\", \"526a0065636a6a6aac\", 0, -614046478, \"7de4ba875b2e584a7b658818c112e51ee5e86226f5a80e5f6b15528c86400573\"],\n\t[\"3cd4474201be7a6c25403bf00ca62e2aa8f8f4f700154e1bb4d18c66f7bb7f9b975649f0dc0100000006535151535153ffffffff01febbeb000000000006005151006aac00000000\", \"\", 0, -1674687131, \"6b77ca70cc452cc89acb83b69857cda98efbfc221688fe816ef4cb4faf152f86\"],\n\t[\"92fc95f00307a6b3e2572e228011b9c9ed41e58ddbaefe3b139343dbfb3b34182e9fcdc3f50200000002acab847bf1935fde8bcfe41c7dd99683289292770e7f163ad09deff0e0665ed473cd2b56b0f40300000006516551ab6351294dab312dd87b9327ce2e95eb44b712cfae0e50fda15b07816c8282e8365b643390eaab01000000026aacffffffff016e0b6b040000000001ac00000000\", \"650065acac005300\", 2, -1885164012, \"bd7d26bb3a98fc8c90c972500618bf894cb1b4fe37bf5481ff60eef439d3b970\"],\n\t[\"4db591ab018adcef5f4f3f2060e41f7829ce3a07ea41d681e8cb70a0e37685561e4767ac3b0000000005000052acabd280e63601ae6ef20000000000036a636326c908f7\", \"ac6a51526300630052\", 0, 862877446, \"355ccaf30697c9c5b966e619a554d3323d7494c3ea280a9b0dfb73f953f5c1cb\"],\n\t[\"503fd5ef029e1beb7b242d10032ac2768f9a1aca0b0faffe51cec24770664ec707ef7ede4f01000000045253ac53375e350cc77741b8e96eb1ce2d3ca91858c052e5f5830a0193200ae2a45b413dda31541f0000000003516553ffffffff0175a5ba0500000000015200000000\", \"6aab65510053ab65\", 1, 1603081205, \"353ca9619ccb0210ae18b24d0e57efa7abf8e58fa6f7102738e51e8e72c9f0c4\"],\n\t[\"c80abebd042cfec3f5c1958ee6970d2b4586e0abec8305e1d99eb9ee69ecc6c2cbd76374380000000007ac53006300ac510acee933b44817db79320df8094af039fd82111c7726da3b33269d3820123694d849ee5001000000056a65ab526562699bea8530dc916f5d61f0babea709dac578774e8a4dcd9c640ec3aceb6cb2443f24f302000000020063ea780e9e57d1e4245c1e5df19b4582f1bf704049c5654f426d783069bcc039f2d8fa659f030000000851ab53635200006a8d00de0b03654e8500000000000463ab635178ebbb0400000000055100636aab239f1d030000000006ab006300536500000000\", \"6565ac515100\", 3, 1460851377, \"b35bb1b72d02fab866ed6bbbea9726ab32d968d33a776686df3ac16aa445871e\"],\n\t[\"0337b2d5043eb6949a76d6632b8bb393efc7fe26130d7409ef248576708e2d7f9d0ced9d3102000000075352636a5163007034384dfa200f52160690fea6ce6c82a475c0ef1caf5c9e5a39f8f9ddc1c8297a5aa0eb02000000026a51ffffffff38e536298799631550f793357795d432fb2d4231f4effa183c4e2f61a816bcf0030000000463ac5300706f1cd3454344e521fde05b59b96e875c8295294da5d81d6cc7efcfe8128f150aa54d6503000000008f4a98c704c1561600000000000072cfa6000000000000e43def01000000000100cf31cc0500000000066365526a6500cbaa8e2e\", \"\", 3, 2029506437, \"7615b4a7b3be865633a31e346bc3db0bcc410502c8358a65b8127089d81b01f8\"],\n\t[\"59f6cffd034733f4616a20fe19ea6aaf6abddb30b408a3a6bd86cd343ab6fe90dc58300cc90200000000ffffffffc835430a04c3882066abe7deeb0fa1fdaef035d3233460c67d9eabdb05e95e5a02000000080065ac535353ab00ffffffff4b9a043e89ad1b4a129c8777b0e8d87a014a0ab6a3d03e131c27337bbdcb43b402000000066a5100abac6ad9e9bf62014bb118010000000001526cbe484f\", \"ab526352ab65\", 0, 2103515652, \"4f2ccf981598639bec57f885b4c3d8ea8db445ea6e61cfd45789c69374862e5e\"],\n\t[\"cbc79b10020b15d605680a24ee11d8098ad94ae5203cb6b0589e432832e20c27b72a926af20300000006ab65516a53acbb854f3146e55c508ece25fa3d99dbfde641a58ed88c051a8a51f3dacdffb1afb827814b02000000026352c43e6ef30302410a020000000000ff4bd90100000000065100ab63000008aa8e0400000000095265526565ac5365abc52c8a77\", \"53526aac0051\", 0, 202662340, \"984efe0d8d12e43827b9e4b27e97b3777ece930fd1f589d616c6f9b71dab710e\"],\n\t[\"7c07419202fa756d29288c57b5c2b83f3c847a807f4a9a651a3f6cd6c46034ae0aa3a7446b0200000004ab6a6365ffffffff9da83cf4219bb96c76f2d77d5df31c1411a421171d9b59ec02e5c1218f29935403000000008c13879002f8b1ac0400000000086a63536a636553653c584f02000000000000000000\", \"abac53ab656363\", 1, -1038419525, \"4a74f365a161bc6c9bddd249cbd70f5dadbe3de70ef4bd745dcb6ee1cd299fbd\"],\n\t[\"351cbb57021346e076d2a2889d491e9bfa28c54388c91b46ee8695874ad9aa576f1241874d0200000008ab6563525300516affffffffe13e61b8880b8cd52be4a59e00f9723a4722ea58013ec579f5b3693b9e115b1100000000096363abac5252635351ffffffff027fee02040000000008ab6a5200ab006a65b85f130200000000086a52630053ab52ab00000000\", \"ab6aab65\", 1, 586415826, \"08bbb746a596991ab7f53a76e19acad087f19cf3e1db54054aab403c43682d09\"],\n\t[\"a8252ea903f1e8ff953adb16c1d1455a5036222c6ea98207fc21818f0ece2e1fac310f9a0100000000095163ac635363ac0000be6619e9fffcde50a0413078821283ce3340b3993ad00b59950bae7a9f931a9b0a3a035f010000000463005300b8b0583fbd6049a1715e7adacf770162811989f2be20af33f5f60f26eba653dc26b024a00000000006525351636552ffffffff046d2acc030000000002636a9a2d430500000000080065005165ab53abecf63204000000000052b9ed050000000008acacac53ab65656500000000\", \"65ab53635253636a51\", 2, 1442639059, \"8ca11838775822f9a5beee57bdb352f4ee548f122de4a5ca61c21b01a1d50325\"],\n\t[\"2f1a425c0471a5239068c4f38f9df135b1d24bf52d730d4461144b97ea637504495aec360801000000055300515365c71801dd1f49f376dd134a9f523e0b4ae611a4bb122d8b26de66d95203f181d09037974300000000025152ffffffff9bdcea7bc72b6e5262e242c94851e3a5bf8f314b3e5de0e389fc9e5b3eadac030000000009525265655151005153ffffffffdbb53ce99b5a2320a4e6e2d13b01e88ed885a0957d222e508e9ec8e4f83496cb0200000007635200abac63ac04c96237020cc5490100000000080000516a51ac6553074a360200000000025152225520ca\", \"6551ab65ac65516a\", 1, -489869549, \"9bc5bb772c553831fb40abe466074e59a469154679c7dee042b8ea3001c20393\"],\n\t[\"ef3acfd4024defb48def411b8f8ba2dc408dc9ee97a4e8bde4d6cb8e10280f29c98a6e8e9103000000035100513d5389e3d67e075469dfd9f204a7d16175653a149bd7851619610d7ca6eece85a516b2df0300000005516aac6552ca678bdf02f477f003000000000057e45b0300000000055252525252af35c20a\", \"5165ac53ab\", 1, -1900839569, \"78eb6b24365ac1edc386aa4ffd15772f601059581c8776c34f92f8a7763c9ccf\"],\n\t[\"ff4468dc0108475fc8d4959a9562879ce4ab4867a419664bf6e065f17ae25043e6016c70480100000000ffffffff02133c6f0400000000000bd0a8020000000004006a520035afa4f6\", \"51ac65ab\", 0, -537664660, \"f6da59b9deac63e83728850ac791de61f5dfcaeed384ebcbb20e44afcd8c8910\"],\n\t[\"4e8594d803b1d0a26911a2bcdd46d7cbc987b7095a763885b1a97ca9cbb747d32c5ab9aa91030000000353ac53a0cc4b215e07f1d648b6eeb5cdbe9fa32b07400aa773b9696f582cebfd9930ade067b2b200000000060065abab6500fc99833216b8e27a02defd9be47fafae4e4a97f52a9d2a210d08148d2a4e5d02730bcd460100000004516351ac37ce3ae1033baa55040000000006006a636a63acc63c990400000000025265eb1919030000000005656a6a516a00000000\", \"\", 1, -75217178, \"04c5ee48514cd033b82a28e336c4d051074f477ef2675ce0ce4bafe565ee9049\"],\n\t[\"a88830a7023f13ed19ab14fd757358eb6af10d6520f9a54923a6d613ac4f2c11e249cda8aa030000000851630065abababacffffffff8f5fe0bc04a33504c4b47e3991d25118947a0261a9fa520356731eeabd561dd3020000000363ababffffffff038404bd010000000008ab5153516aab6a63d33a5601000000000263004642dc020000000009655152acac636352004be6f3af\", \"5253536565006aab6a\", 0, 1174417836, \"2e42ead953c9f4f81b72c27557e6dc7d48c37ff2f5c46c1dbe9778fb0d79f5b2\"],\n\t[\"44e1a2b4010762af23d2027864c784e34ef322b6e24c70308a28c8f2157d90d17b99cd94a401000000085163656565006300ffffffff0198233d020000000002000000000000\", \"52525153656365\", 0, 1119696980, \"d9096de94d70c6337da6202e6e588166f31bff5d51bb5adc9468594559d65695\"],\n\t[\"44ca65b901259245abd50a745037b17eb51d9ce1f41aa7056b4888285f48c6f26cb97b7a25020000000552636363abffffffff047820350400000000040053acab14f3e603000000000652635100ab630ce66c03000000000001bdc704000000000765650065ac51ac3e886381\", \"51\", 0, -263340864, \"ed5622ac642d11f90e68c0feea6a2fe36d880ecae6b8c0d89c4ea4b3d162bd90\"],\n\t[\"cfa147d2017fe84122122b4dda2f0d6318e59e60a7207a2d00737b5d89694d480a2c26324b0000000006006351526552ffffffff0456b5b804000000000800516aab525363ab166633000000000004655363ab254c0e02000000000952ab6a6a00ab525151097c1b020000000009656a52ac6300530065ad0d6e50\", \"6a535165ac6a536500\", 0, -574683184, \"f926d4036eac7f019a2b0b65356c4ee2fe50e089dd7a70f1843a9f7bc6997b35\"],\n\t[\"91c5d5f6022fea6f230cc4ae446ce040d8313071c5ac1749c82982cc1988c94cb1738aa48503000000016a19e204f30cb45dd29e68ff4ae160da037e5fc93538e21a11b92d9dd51cf0b5efacba4dd70000000005656a6aac51ffffffff03db126905000000000953006a53ab6563636a36a273030000000006656a52656552b03ede00000000000352516500000000\", \"530052526a00\", 1, 1437328441, \"255c125b60ee85f4718b2972174c83588ee214958c3627f51f13b5fb56c8c317\"],\n\t[\"03f20dc202c886907b607e278731ebc5d7373c348c8c66cac167560f19b341b782dfb634cb03000000076a51ac6aab63abea3e8de7adb9f599c9caba95aa3fa852e947fc88ed97ee50e0a0ec0d14d164f44c0115c10100000004ab5153516fdd679e0414edbd000000000005ac636a53512021f2040000000007006a0051536a52c73db2050000000005525265ac5369046e000000000003ab006a1ef7bd1e\", \"52656a\", 0, 1360223035, \"5a0a05e32ce4cd0558aabd5d79cd5fcbffa95c07137506e875a9afcba4bef5a2\"],\n\t[\"d9611140036881b61e01627078512bc3378386e1d4761f959d480fdb9d9710bebddba2079d020000000763536aab5153ab819271b41e228f5b04daa1d4e72c8e1955230accd790640b81783cfc165116a9f535a74c000000000163ffffffffa2e7bb9a28e810624c251ff5ba6b0f07a356ac082048cf9f39ec036bba3d431a02000000076a000000ac65acffffffff01678a820000000000085363515153ac635100000000\", \"535353\", 2, -82213851, \"52b9e0778206af68998cbc4ebdaad5a9469e04d0a0a6cef251abfdbb74e2f031\"],\n\t[\"98b3a0bf034233afdcf0df9d46ac65be84ef839e58ee9fa59f32daaa7d684b6bdac30081c60200000007636351acabababffffffffc71cf82ded4d1593e5825618dc1d5752ae30560ecfaa07f192731d68ea768d0f0100000006650052636563f3a2888deb5ddd161430177ce298242c1a86844619bc60ca2590d98243b5385bc52a5b8f00000000095365acacab520052ac50d4722801c3b8a60300000000035165517e563b65\", \"51\", 1, -168940690, \"b6b684e2d2ecec8a8dce4ed3fc1147f8b2e45732444222aa8f52d860c2a27a9d\"],\n\t[\"97be4f7702dc20b087a1fdd533c7de762a3f2867a8f439bddf0dcec9a374dfd0276f9c55cc0300000000cdfb1dbe6582499569127bda6ca4aaff02c132dc73e15dcd91d73da77e92a32a13d1a0ba0200000002ab51ffffffff048cfbe202000000000900516351515363ac535128ce0100000000076aac5365ab6aabc84e8302000000000863536a53ab6a6552f051230500000000066aac535153510848d813\", \"ac51\", 0, 229541474, \"e5da9a416ea883be1f8b8b2d178463633f19de3fa82ae25d44ffb531e35bdbc8\"],\n\t[\"085b6e04040b5bff81e29b646f0ed4a45e05890a8d32780c49d09643e69cdccb5bd81357670100000001abffffffffa5c981fe758307648e783217e3b4349e31a557602225e237f62b636ec26df1a80300000004650052ab4792e1da2930cc90822a8d2a0a91ea343317bce5356b6aa8aae6c3956076aa33a5351a9c0300000004abac5265e27ddbcd472a2f13325cc6be40049d53f3e266ac082172f17f6df817db1936d9ff48c02b000000000152ffffffff021aa7670500000000085353635163ab51ac14d584000000000001aca4d136cc\", \"6a525300536352536a\", 0, -1398925877, \"41ecca1e8152ec55074f4c39f8f2a7204dda48e9ec1e7f99d5e7e4044d159d43\"],\n\t[\"eec32fff03c6a18b12cd7b60b7bdc2dd74a08977e53fdd756000af221228fe736bd9c42d870100000007005353ac515265ffffffff037929791a188e9980e8b9cc154ad1b0d05fb322932501698195ab5b219488fc02000000070063510065ab6a0bfc176aa7e84f771ea3d45a6b9c24887ceea715a0ff10ede63db8f089e97d927075b4f1000000000551abab63abffffffff02eb933c000000000000262c420000000000036563632549c2b6\", \"6352\", 2, 1480445874, \"ff8a4016dfdd918f53a45d3a1f62b12c407cd147d68ca5c92b7520e12c353ff5\"],\n\t[\"98ea7eac0313d9fb03573fb2b8e718180c70ce647bebcf49b97a8403837a2556cb8c9377f30000000004ac53ac65ffffffff8caac77a5e52f0d8213ef6ce998bedbb50cfdf108954771031c0e0cd2a78423900000000010066e99a44937ebb37015be3693761078ad5c73aa73ec623ac7300b45375cc8eef36087eb80000000007515352acac5100ffffffff0114a51b02000000000000000000\", \"6aacab\", 0, 243527074, \"bad77967f98941af4dd52a8517d5ad1e32307c0d511e15461e86465e1b8b5273\"],\n\t[\"3ab70f4604e8fc7f9de395ec3e4c3de0d560212e84a63f8d75333b604237aa52a10da17196000000000763526a6553ac63a25de6fd66563d71471716fe59087be0dde98e969e2b359282cf11f82f14b00f1c0ac70f02000000050052516aacdffed6bb6889a13e46956f4b8af20752f10185838fd4654e3191bf49579c961f5597c36c0100000005ac636363abc3a1785bae5b8a1b4be5d0cbfadc240b4f7acaa7dfed6a66e852835df5eb9ac3c553766801000000036a65630733b7530218569602000000000952006a6a6a51acab52777f06030000000007ac0063530052abc08267c9\", \"000000536aac0000\", 1, 1919096509, \"df1c87cf3ba70e754d19618a39fdbd2970def0c1bfc4576260cba5f025b87532\"],\n\t[\"bdb6b4d704af0b7234ced671c04ba57421aba7ead0a117d925d7ebd6ca078ec6e7b93eea6600000000026565ffffffff3270f5ad8f46495d69b9d71d4ab0238cbf86cc4908927fbb70a71fa3043108e6010000000700516a65655152ffffffff6085a0fdc03ae8567d0562c584e8bfe13a1bd1094c518690ebcb2b7c6ce5f04502000000095251530052536a53aba576a37f2c516aad9911f687fe83d0ae7983686b6269b4dd54701cb5ce9ec91f0e6828390300000000ffffffff04cc76cc020000000002656a01ffb702000000000253ab534610040000000009acab006565516a00521f55f5040000000000389dfee9\", \"6a525165\", 0, 1336204763, \"71c294523c48fd7747eebefbf3ca06e25db7b36bff6d95b41c522fecb264a919\"],\n\t[\"54258edd017d22b274fbf0317555aaf11318affef5a5f0ae45a43d9ca4aa652c6e85f8a040010000000953ac65ab5251656500ffffffff03321d450000000000085265526a51526a529ede8b030000000003635151ce6065020000000001534c56ec1b\", \"acac\", 0, 2094130012, \"110d90fea9470dfe6c5048f45c3af5e8cc0cb77dd58fd13d338268e1c24b1ccc\"],\n\t[\"ce0d322e04f0ffc7774218b251530a7b64ebefca55c90db3d0624c0ff4b3f03f918e8cf6f60300000003656500ffffffff9cce943872da8d8af29022d0b6321af5fefc004a281d07b598b95f6dcc07b1830200000007abab515351acab8d926410e69d76b7e584aad1470a97b14b9c879c8b43f9a9238e52a2c2fefc2001c56af8010000000400ab5253cd2cd1fe192ce3a93b5478af82fa250c27064df82ba416dfb0debf4f0eb307a746b6928901000000096500abacac6a0063514214524502947efc0200000000035251652c40340100000000096a6aab52000052656a5231c54c\", \"51\", 2, -2090320538, \"0322ca570446869ec7ec6ad66d9838cff95405002d474c0d3c17708c7ee039c6\"],\n\t[\"47ac54940313430712ebb32004679d3a512242c2b33d549bf5bbc8420ec1fd0850ed50eb6d0300000009536aac6a65acacab51ffffffffb843e44266ce2462f92e6bff54316661048c8c17ecb092cb493b39bfca9117850000000001519ab348c05e74ebc3f67423724a3371dd99e3bceb4f098f8860148f48ad70000313c4c223000000000653006565656512c2d8dc033f3c97010000000002636aa993aa010000000006526365ab526ab7cf560300000000076a0065ac6a526500000000\", \"005352535300ab6a\", 2, 59531991, \"8b5b3d00d9c658f062fe6c5298e54b1fe4ed3a3eab2a87af4f3119edc47b1691\"],\n\t[\"233cd90b043916fc41eb870c64543f0111fb31f3c486dc72457689dea58f75c16ae59e9eb2000000000500536a6a6affffffff9ae30de76be7cd57fb81220fce78d74a13b2dbcad4d023f3cadb3c9a0e45a3ce000000000965ac6353ac5165515130834512dfb293f87cb1879d8d1b20ebad9d7d3d5c3e399a291ce86a3b4d30e4e32368a9020000000453005165ffffffff26d84ae93eb58c81158c9b3c3cbc24a84614d731094f38d0eea8686dec02824d0300000005636a65abacf02c784001a0bd5d03000000000900655351ab65ac516a416ef503\", \"\", 1, -295106477, \"b79f31c289e95d9dadec48ebf88e27c1d920661e50d090e422957f90ff94cb6e\"],\n\t[\"9200e26b03ff36bc4bf908143de5f97d4d02358db642bd5a8541e6ff709c420d1482d471b70000000008abab65536a636553ffffffff61ba6d15f5453b5079fb494af4c48de713a0c3e7f6454d7450074a2a80cb6d880300000007ac6a00ab5165515dfb7574fbce822892c2acb5d978188b1d65f969e4fe874b08db4c791d176113272a5cc10100000000ffffffff0420958d000000000009ac63516a0063516353dd885505000000000465ac00007b79e901000000000066d8bf010000000005525252006a00000000\", \"ac5152\", 0, 2089531339, \"89ec7fab7cfe7d8d7d96956613c49dc48bf295269cfb4ea44f7333d88c170e62\"],\n\t[\"45f335ba01ce2073a8b0273884eb5b48f56df474fc3dff310d9706a8ac7202cf5ac188272103000000025363ffffffff049d859502000000000365ab6a8e98b1030000000002ac51f3a80603000000000752535151ac00000306e30300000000020051b58b2b3a\", \"\", 0, 1899564574, \"78e01310a228f645c23a2ad0acbb8d91cedff4ecdf7ca997662c6031eb702b11\"],\n\t[\"d8f652a6043b4faeada05e14b81756cd6920cfcf332e97f4086961d49232ad6ffb6bc6c097000000000453526563ffffffff1ea4d60e5e91193fbbc1a476c8785a79a4c11ec5e5d6c9950c668ceacfe07a15020000000352ab51fffffffffe029a374595c4edd382875a8dd3f20b9820abb3e93f877b622598d11d0b09e503000000095351000052ac515152ffffffff9d65fea491b979699ceb13caf2479cd42a354bd674ded3925e760758e85a756803000000046365acabffffffff0169001d00000000000651636a65656300000000\", \"ab0063630000ac\", 3, 1050965951, \"4cc85cbc2863ee7dbce15490d8ca2c5ded61998257b9eeaff968fe38e9f009ae\"],\n\t[\"718662be026e1dcf672869ac658fd0c87d6835cfbb34bd854c44e577d5708a7faecda96e260300000004526a636a489493073353b678549adc7640281b9cbcb225037f84007c57e55b874366bb7b0fa03bdc00000000095165ababac65ac00008ab7f2a802eaa53d000000000007acac516aac526ae92f380100000000056aac00536500000000\", \"ab00\", 1, 43296088, \"2d642ceee910abff0af2116af75b2e117ffb7469b2f19ad8fef08f558416d8f7\"],\n\t[\"94083c840288d40a6983faca876d452f7c52a07de9268ad892e70a81e150d602a773c175ad03000000007ec3637d7e1103e2e7e0c61896cbbf8d7e205b2ecc93dd0d6d7527d39cdbf6d335789f660300000000ffffffff019e1f7b03000000000800ac0051acac0053539cb363\", \"\", 1, -183614058, \"a17b66d6bb427f42653d08207a22b02353dd19ccf2c7de6a9a3a2bdb7c49c9e7\"],\n\t[\"30e0d4d20493d0cd0e640b757c9c47a823120e012b3b64c9c1890f9a087ae4f2001ca22a61010000000152f8f05468303b8fcfaad1fb60534a08fe90daa79bff51675472528ebe1438b6f60e7f60c10100000009526aab6551ac510053ffffffffaaab73957ea2133e32329795221ed44548a0d3a54d1cf9c96827e7cffd1706df0200000009ab00526a005265526affffffffd19a6fe54352015bf170119742821696f64083b5f14fb5c7d1b5a721a3d7786801000000085265abababac53abffffffff020f39bd030000000004ab6aac52049f6c050000000004ab52516aba5b4c60\", \"6a6365516a6a655253\", 0, -624256405, \"8e221a6c4bf81ca0d8a0464562674dcd14a76a32a4b7baf99450dd9195d411e6\"],\n\t[\"f9c69d940276ec00f65f9fe08120fc89385d7350388508fd80f4a6ba2b5d4597a9e21c884f010000000663ab63ababab15473ae6d82c744c07fc876ecd53bd0f3018b2dbedad77d757d5bdf3811b23d294e8c0170000000001abafababe00157ede2050000000006ac6a5263635300000000\", \"ab53\", 1, 606547088, \"714d8b14699835b26b2f94c58b6ea4c53da3f7adf0c62ea9966b1e1758272c47\"],\n\t[\"5c0ac112032d6885b7a9071d3c5f493aa16c610a4a57228b2491258c38de8302014276e8be030000000300ab6a17468315215262ad5c7393bb5e0c5a6429fd1911f78f6f72dafbbbb78f3149a5073e24740300000003ac5100ffffffff33c7a14a062bdea1be3c9c8e973f54ade53fe4a69dcb5ab019df5f3345050be00100000008ac63655163526aab428defc0033ec36203000000000765516365536a00ae55b2000000000002ab53f4c0080400000000095265516a536563536a00000000\", \"6a005151006a\", 2, 272749594, \"91082410630337a5d89ff19145097090f25d4a20bdd657b4b953927b2f62c73b\"],\n\t[\"e3683329026720010b08d4bec0faa244f159ae10aa582252dd0f3f80046a4e145207d54d31000000000852acac52656aacac3aaf2a5017438ad6adfa3f9d05f53ebed9ceb1b10d809d507bcf75e0604254a8259fc29c020000000653526552ab51f926e52c04b44918030000000000f7679c0100000000090000525152005365539e3f48050000000009516500ab635363ab008396c905000000000253650591024f\", \"6a6365\", 0, 908746924, \"458aec3b5089a585b6bad9f99fd37a2b443dc5a2eefac2b7e8c5b06705efc9db\"],\n\t[\"48c4afb204204209e1df6805f0697edaa42c0450bbbd767941fe125b9bc40614d63d757e2203000000066a5363005152dc8b6a605a6d1088e631af3c94b8164e36e61445e2c60130292d81dabd30d15f54b355a802000000036a6353ffffffff1d05dcec4f3dedcfd02c042ce5d230587ee92cb22b52b1e59863f3717df2362f0300000005536552ac52ffffffffd4d71c4f0a7d53ba47bb0289ca79b1e33d4c569c1e951dd611fc9c9c1ca8bc6c030000000865536a65ab51abacffffffff042f9aa905000000000753655153656351ab93d8010000000002655337440e0300000000005d4c690000000000015278587acb\", \"ab006565526a51\", 0, 1502064227, \"bbed77ff0f808aa8abd946ba9e7ec1ddb003a969fa223dee0af779643cb841a9\"],\n\t[\"00b20fd104dd59705b84d67441019fa26c4c3dec5fd3b50eca1aa549e750ef9ddb774dcabe000000000651ac656aac65ffffffff52d4246f2db568fc9eea143e4d260c698a319f0d0670f84c9c83341204fde48b0200000000ffffffffb8aeabb85d3bcbc67b132f1fd815b451ea12dcf7fc169c1bc2e2cf433eb6777a03000000086a51ac6aab6563acd510d209f413da2cf036a31b0def1e4dcd8115abf2e511afbcccb5ddf41d9702f28c52900100000006ac52ab6a0065ffffffff039c8276000000000008ab53655200656a52401561010000000003acab0082b7160100000000035100ab00000000\", \"535265\", 1, -947367579, \"3212c6d6dd8d9d3b2ac959dec11f4638ccde9be6ed5d36955769294e23343da0\"],\n\t[\"455131860220abbaa72015519090a666faf137a0febce7edd49da1eada41feab1505a0028b02000000036365ab453ead4225724eb69beb590f2ec56a7693a608871e0ab0c34f5e96157f90e0a96148f3c502000000085251ab51535163acffffffff022d1249040000000009abac00acac6565630088b310040000000000e3920e59\", \"5152ab6a52ac5152\", 0, 294375737, \"c40fd7dfa72321ac79516502500478d09a35cc22cc264d652c7d18b14400b739\"],\n\t[\"624d28cb02c8747915e9af2b13c79b417eb34d2fa2a73547897770ace08c6dd9de528848d3030000000651ab63abab533c69d3f9b75b6ef8ed2df50c2210fd0bf4e889c42477d58682f711cbaece1a626194bb85030000000765acab53ac5353ffffffff018cc280040000000009abacabac52636352ac6859409e\", \"ac51ac\", 1, 1005144875, \"919144aada50db8675b7f9a6849c9d263b86450570293a03c245bd1e3095e292\"],\n\t[\"8f28471d02f7d41b2e70e9b4c804f2d90d23fb24d53426fa746bcdcfffea864925bdeabe3e0200000001acffffffff76d1d35d04db0e64d65810c808fe40168f8d1f2143902a1cc551034fd193be0e0000000001acffffffff048a5565000000000005005151516afafb610400000000045263ac53648bb30500000000086363516a6a5165513245de01000000000000000000\", \"6a0053510053\", 1, -1525137460, \"305fc8ff5dc04ebd9b6448b03c9a3d945a11567206c8d5214666b30ec6d0d6cc\"],\n\t[\"10ec50d7046b8b40e4222a3c6449490ebe41513aad2eca7848284a08f3069f3352c2a9954f0000000009526aac656352acac53ffffffff0d979f236155aa972472d43ee6f8ce22a2d052c740f10b59211454ff22cb7fd00200000007acacacab63ab53ffffffffbbf97ebde8969b35725b2e240092a986a2cbfd58de48c4475fe077bdd493a20c010000000663ab5365ababffffffff4600722d33b8dba300d3ad037bcfc6038b1db8abfe8008a15a1de2da2264007302000000035351ac6dbdafaf020d0ccf04000000000663ab6a51ab6ae06e5e0200000000036aabab00000000\", \"\", 0, -1658960232, \"2420dd722e229eccafae8508e7b8d75c6920bfdb3b5bac7cb8e23419480637c2\"],\n\t[\"fef98b7101bf99277b08a6eff17d08f3fcb862e20e13138a77d66fba55d54f26304143e5360100000006515365abab00ffffffff04265965030000000004655252ace2c775010000000001002b23b4040000000007516a5153ab53ac456a7a00000000000753ab525251acacba521291\", \"526aacacab00abab53\", 0, -1614097109, \"4370d05c07e231d6515c7e454a4e401000b99329d22ed7def323976fa1d2eeb5\"],\n\t[\"34a2b8830253661b373b519546552a2c3bff7414ea0060df183b1052683d78d8f54e842442000000000152ffffffffd961a8e34cf374151058dfcddc86509b33832bc57267c63489f69ff01199697c0300000002abacba856cfb01b17c2f050000000008515365ac53ab000000000000\", \"5263ab656a\", 1, -2104480987, \"2f9993e0a84a6ca560d6d1cc2b63ffe7fd71236d9cfe7d809491cef62bbfad84\"],\n\t[\"43559290038f32fda86580dd8a4bc4422db88dd22a626b8bd4f10f1c9dd325c8dc49bf479f01000000026351ffffffff401339530e1ed3ffe996578a17c3ec9d6fccb0723dd63e7b3f39e2c44b976b7b0300000006ab6a65656a51ffffffff6fb9ba041c96b886482009f56c09c22e7b0d33091f2ac5418d05708951816ce7000000000551ac525100ffffffff020921e40500000000035365533986f40500000000016a00000000\", \"52ac51\", 0, 1769771809, \"02040283ef2291d8e1f79bb71bdabe7c1546c40d7ed615c375643000a8b9600d\"],\n\t[\"6878a6bd02e7e1c8082d5e3ee1b746cfebfac9e8b97e61caa9e0759d8a8ecb3743e36a30de0100000002ab532a911b0f12b73e0071f5d50b6bdaf783f4b9a6ce90ec0cad9eecca27d5abae188241ddec0200000001651c7758d803f7457b0500000000036551515f4e90000000000001007022080200000000035365acc86b6946\", \"6351ab\", 0, -1929374995, \"f24be499c58295f3a07f5f1c6e5084496ae160450bd61fdb2934e615289448f1\"],\n\t[\"35b6fc06047ebad04783a5167ab5fc9878a00c4eb5e7d70ef297c33d5abd5137a2dea9912402000000036aacacffffffff21dc291763419a584bdb3ed4f6f8c60b218aaa5b99784e4ba8acfec04993e50c03000000046a00ac6affffffff69e04d77e4b662a82db71a68dd72ef0af48ca5bebdcb40f5edf0caf591bb41020200000000b5db78a16d93f5f24d7d932f93a29bb4b784febd0cbb1943f90216dc80bba15a0567684b000000000853ab52ab5100006a1be2208a02f6bdc103000000000265ab8550ea04000000000365636a00000000\", \"\", 0, -1114114836, \"1c8655969b241e717b841526f87e6bd68b2329905ba3fc9e9f72526c0b3ea20c\"],\n\t[\"bebb90c302bf91fd4501d33555a5fc5f2e1be281d9b7743680979b65c3c919108cc2f517510100000003abab00ffffffff969c30053f1276550532d0aa33cfe80ca63758cd215b740448a9c08a84826f3303000000056565ab5153ffffffff04bf6f2a04000000000565ab5265ab903e760100000000026a6a7103fa020000000006526553525365b05b2c000000000006ab000000535300000000\", \"51510053ab63635153\", 1, 1081291172, \"94338cd47a4639be30a71e21a7103cee4c99ef7297e0edd56aaf57a068b004de\"],\n\t[\"af48319f031b4eeb4319714a285f44244f283cbff30dcb9275b06f2348ccd0d7f015b54f8500000000066363ac65ac6affffffff2560a9817ebbc738ad01d0c9b9cf657b8f9179b1a7f073eb0b67517409d108180200000005ac6365ab52ffffffff0bdd67cd4ecae96249a2e2a96db1490ee645f042fd9d5579de945e22b799f4d003000000086552ab515153ab00cf187c8202e51abf0300000000066552006a00abadf37d000000000004ac6a535100000000\", \"63ab65\", 1, -1855554446, \"60caf46a7625f303c04706cec515a44b68ec319ee92273acb566cca4f66861c1\"],\n\t[\"f35befbc03faf8c25cc4bc0b92f6239f477e663b44b83065c9cb7cf231243032cf367ce3130000000005ab65526a517c4c334149a9c9edc39e29276a4b3ffbbab337de7908ea6f88af331228bd90086a6900ba020000000151279d19950d2fe81979b72ce3a33c6d82ebb92f9a2e164b6471ac857f3bbd3c0ea213b542010000000953ab51635363520065052657c20300a9ba04000000000452636a6a0516ea020000000008535253656365ababcfdd3f01000000000865ac516aac00530000000000\", \"\", 2, -99793521, \"c834a5485e68dc13edb6c79948784712122440d7fa5bbaa5cd2fc3d4dac8185d\"],\n\t[\"d3da18520216601acf885414538ce2fb4d910997eeb91582cac42eb6982c9381589587794f0300000000fffffffff1b1c9880356852e10cf41c02e928748dd8fae2e988be4e1c4cb32d0bfaea6f7000000000465ab6aabffffffff02fb0d69050000000002ababeda8580500000000085163526565ac52522b913c95\", \"ac\", 1, -1247973017, \"99b32b5679d91e0f9cdd6737afeb07459806e5acd7630c6a3b9ab5d550d0c003\"],\n\t[\"8218eb740229c695c252e3630fc6257c42624f974bc856b7af8208df643a6c520ef681bfd00000000002510066f30f270a09b2b420e274c14d07430008e7886ec621ba45665057120afce58befca96010300000004525153ab84c380a9015d96100000000000076a5300acac526500000000\", \"ac005263\", 0, -1855679695, \"5071f8acf96aea41c7518bd1b5b6bbe16258b529df0c03f9e374b83c66b742c6\"],\n\t[\"1123e7010240310013c74e5def60d8e14dd67aedff5a57d07a24abc84d933483431b8cf8ea0300000003530051fc6775ff1a23c627a2e605dd2560e84e27f4208300071e90f4589e762ad9c9fe8d0da95e020000000465655200ffffffff04251598030000000004ab65ab639d28d90400000000096563636aacac525153474df801000000000851525165ac51006a75e23b040000000000e5bd3a4a\", \"6363636565\", 0, -467124448, \"9cb0dd04e9fe287b112e94a1647590d27e8b164ca13c4fe70c610fd13f82c2fd\"],\n\t[\"fd92fe1003083c5179f97e77bf7d71975788138147adbdb283306802e261c0aee080fa22630200000000860c643ba9a1816b9badf36077b4554d11720e284e395a1121bc45279e148b2064c65e49020000000651ab6a53636a2c713088d20f4bc4001264d972cce05b9fe004dc33376ad24d0d013e417b91a5f1b6734e000000000100ffffffff02e3064c0500000000066552006a5165b86e8705000000000665ab65ab53522052eadb\", \"00ab53525265\", 0, 776203277, \"47207b48777727532f62e09afcd4104ea6687e723c7657c30504fa2081331cc8\"],\n\t[\"d1b6a703038f14d41fcc5cc45455faa135a5322be4bf0f5cbcd526578fc270a236cacb853f0200000001abffffffff135aeff902fa38f202ccf5bd34437ff89c9dc57a028b62447a0a38579383e8ef0000000000ffffffffadf398d2c818d0b90bc474f540c3618a4a643482eeab73d36101987e2ec0335900000000004bd3323504e69fc10000000000055151535251790ada02000000000563ab6aab521337a704000000000963ac63abacac52656a1e9862010000000007656500ac51ab6a8f4ee672\", \"ab5251656565ac63\", 2, 82008394, \"b8f3d255549909c07588ecba10a02e55a2d6f2206d831af9da1a7dae64cfbc8b\"],\n\t[\"81dadaa7011556683db3fe95262f4fdb20391b7e75b7ffcee51b176af64d83c06f85545d620200000005ab5151ab52ffffffff044805ef0300000000065353516352639702c802000000000900516351515252ab5270db08040000000009ac516aab526553abac4aabc90500000000096365ab0052636a525100000000\", \"6565ab6a5152\", 0, -2126294159, \"ad01ec9d6dbae325ec3a8e1fd98e2d03b1188378210efef093dd8b0b0ef3f19d\"],\n\t[\"3b937e05032b8895d2f4945cb7e3679be2fbd15311e2414f4184706dbfc0558cf7de7b4d000000000001638b91a12668a3c3ce349788c961c26aa893c862f1e630f18d80e7843686b6e1e6fc396310000000000852635353ab65ac51eeb09dd1c9605391258ee6f74b9ae17b5e8c2ef010dc721c5433dcdc6e93a1593e3b6d1700000000085365ac6553526351ffffffff0308b18e04000000000253acb6dd00040000000008536aac5153ac516ab0a88201000000000500ac006500804e3ff2\", \"\", 0, 416167343, \"595a3c02254564634e8085283ec4ea7c23808da97ce9c5da7aecd7b553e7fd7f\"],\n\t[\"a48f27ca047997470da74c8ee086ddad82f36d9c22e790bd6f8603ee6e27ad4d3174ea875403000000095153ac636aab6aacabffffffffefc936294e468d2c9a99e09909ba599978a8c0891ad47dc00ba424761627cef202000000056a51630053ffffffff304cae7ed2d3dbb4f2fbd679da442aed06221ffda9aee460a28ceec5a9399f4e0200000000f5bddf82c9c25fc29c5729274c1ff0b43934303e5f595ce86316fc66ad263b96ca46ab8d0100000003536500d7cf226b0146b00c04000000000200ac5c2014ce\", \"515100636563\", 0, 1991799059, \"9c051a7092fe17fa62b1720bc2c4cb2ffc1527d9fb0b006d2e142bb8fe07bf3c\"],\n\t[\"180cd53101c5074cf0b7f089d139e837fe49932791f73fa2342bd823c6df6a2f72fe6dba1303000000076a6a63ac53acabffffffff03853bc1020000000007ac526a6a6a6a003c4a8903000000000453515163a0fbbd030000000005ab656a5253253d64cf\", \"ac65\", 0, -1548453970, \"4d8efb3b99b9064d2f6be33b194a903ffabb9d0e7baa97a48fcec038072aac06\"],\n\t[\"c21ec8b60376c47e057f2c71caa90269888d0ffd5c46a471649144a920d0b409e56f190b700000000008acac6a526a536365ffffffff5d315d9da8bf643a9ba11299450b1f87272e6030fdb0c8adc04e6c1bfc87de9a0000000000ea43a9a142e5830c96b0ce827663af36b23b0277244658f8f606e95384574b91750b8e940000000007516a63ac0063acffffffff023c61be0400000000055165ab5263313cc8020000000006006a53526551ed8c3d56\", \"6a\", 1, 1160627414, \"a638cc17fd91f4b1e77877e8d82448c84b2a4e100df1373f779de7ad32695112\"],\n\t[\"128cd90f04b66a4cbc78bf48748f6eec0f08d5193ee8d0a6f2e8d3e5f138ed12c2c87d01a301000000085200ab6aac00ab00ffffffff09fc88bb1851e3dfb3d30179c38e15aeb1b39929c7c74f6acd071994ed4806490300000000e7fc5ea12ec56f56c0d758ecf4bb88aa95f3b08176b336db3b9bec2f6e27336dce28adbe030000000400530051fffffffffd6ff1adcf1fbe0d883451ee46904f1b7e8820243d395559b2d4ee8190a6e891000000000080fb1ae702f85b400000000000035200ab8d9651010000000006ab6a52536aab00000000\", \"ab\", 1, 1667598199, \"c10ccc9db8a92d7d4b133a2980782dab9d9d1d633d0dde9f9612ada57771fd89\"],\n\t[\"da9695a403493d3511c10e1fe1286f954db0366b7667c91ef18ae4578056c1bf752114ac5901000000035351519788d91dd1f9c62dc005d80ea54eb13f7131ca5aace3d5d29f9b58ccc5fbc9a27e779950010000000453ac6a00ffffffffe2556ff29ebe83eb42a32c7a8d93bc598043578f491b5935805a33608538845a030000000252ab65d21b3b018f26c4030000000006acab51535352e1cbcb10\", \"006565ab52\", 2, -1550927794, \"0ca673a1ee66f9625ceb9ab278ebef772c113c188112b02824570c17fdf48194\"],\n\t[\"b240517501334021240427adb0b413433641555424f6d24647211e3e6bfbb22a8045cbda2f000000000071bac8630112717802000000000000000000\", \"6a5165abac52656551\", 0, 1790414254, \"2c8be597620d95abd88f9c1cf4967c1ae3ca2309f3afec8928058c9598660e9e\"],\n\t[\"96bac43903044a199b4b3efeeec5d196ee23fb05495541fa2cd6fb6405a9432d1723363660010000000151ffffffffe6ce2b66ce1488918a3e880bebb0e750123f007c7bcbac8fcd67ce75cb6fbae80300000000ffffffff9c0955aa07f506455834895c0c56be5a095398f47c62a3d431fe125b161d666a0200000005520000abac7ffdbc540216f2f004000000000165a26dce010000000001ab00000000\", \"5151ab656a656a6a63\", 0, -707123065, \"26b22e18d5d9081fde9631594a4f7c49069ed2e429f3d08caf9d834f685ccab2\"],\n\t[\"b8fd394001ed255f49ad491fecc990b7f38688e9c837ccbc7714ddbbf5404f42524e68c18f0000000007ab6353535363ab081e15ee02706f7d050000000008515200535351526364c7ec040000000005636a53acac9206cbe1\", \"655352ac\", 0, -1251578838, \"8e0697d8cd8a9ccea837fd798cc6c5ed29f6fbd1892ee9bcb6c944772778af19\"],\n\t[\"e42a76740264677829e30ed610864160c7f97232c16528fe5610fc08814b21c34eefcea69d010000000653006a6a0052ffffffff647046cf44f217d040e6a8ff3f295312ab4dd5a0df231c66968ad1c6d8f4428000000000025352ffffffff0199a7f900000000000000000000\", \"655263006a005163\", 1, 1122505713, \"7cda43f1ff9191c646c56a4e29b1a8c6cb3f7b331da6883ef2f0480a515d0861\"],\n\t[\"0f034f32027a8e094119443aa9cfe11737c6d7dda9a52b839bc073dcc0235b847b28e0fab60200000006ac53ac536a63eee63447dfdad80476994b68706e916df1bd9d7cb4f3a4f6b14369de84564bea2e8688bd030000000565636a65acf8434663020b35fe01000000000800abab655163acabb3d6a103000000000353acab345eeda0\", \"526a51ac63ab51\", 1, 66020215, \"4435e62ff6531ac73529aac9cf878a7219e0b6e6cac79af8487c5355d1ad6d43\"],\n\t[\"a2dfa4690214c1ab25331815a5128f143219de51a47abdc7ce2d367e683eeb93960a31af9f010000000363636affffffff8be0628abb1861b078fcc19c236bc4cc726fa49068b88ad170adb2a97862e7460200000004ac655363ffffffff0441f11103000000000153dbab0c000000000009ab53ac5365526aab63abbb95050000000004ab52516a29a029040000000003ac526a00000000\", \"6a52ac63\", 1, -1302210567, \"913060c7454e6c80f5ba3835454b54db2188e37dc4ce72a16b37d11a430b3d23\"],\n\t[\"9dbc591f04521670af83fb3bb591c5d4da99206f5d38e020289f7db95414390dddbbeb56680100000004ac5100acffffffffb6a40b5e29d5e459f8e72d39f800089529f0889006cad3d734011991da8ef09d0100000009526a5100acab536a515fc427436df97cc51dc8497642ffc868857ee245314d28b356bd70adba671bd6071301fc0000000000ffffffff487efde2f620566a9b017b2e6e6d42525e4070f73a602f85c6dfd58304518db30000000005516353006a8d8090180244904a0200000000046a65656ab1e9c203000000000451ab63aba06a5449\", \"\", 0, -1414953913, \"bae189eb3d64aedbc28a6c28f6c0ccbd58472caaf0cf45a5aabae3e031dd1fea\"],\n\t[\"1345fb2c04bb21a35ae33a3f9f295bece34650308a9d8984a989dfe4c977790b0c21ff9a7f0000000006ac52ac6a0053ffffffff7baee9e8717d81d375a43b691e91579be53875350dfe23ba0058ea950029fcb7020000000753ab53ab63ab52ffffffff684b6b3828dfb4c8a92043b49b8cb15dd3a7c98b978da1d314dce5b9570dadd202000000086353ab6a5200ac63d1a8647bf667ceb2eae7ec75569ca249fbfd5d1b582acfbd7e1fcf5886121fca699c011d0100000003ac006affffffff049b1eb00300000000001e46dc0100000000080065ab6a6a630065ca95b40300000000030051520c8499010000000006ab6aac526a6500000000\", \"53526aac636300\", 2, 1809978100, \"cfeaa36790bc398783d4ca45e6354e1ea52ee74e005df7f9ebd10a680e9607bf\"],\n\t[\"7d75dc8f011e5f9f7313ba6aedef8dbe10d0a471aca88bbfc0c4a448ce424a2c5580cda1560300000003ab5152ffffffff01997f8e0200000000096552ac6a65656563530d93bbcc\", \"00656a6563\", 0, 1414485913, \"ec91eda1149f75bffb97612569a78855498c5d5386d473752a2c81454f297fa7\"],\n\t[\"1459179504b69f01c066e8ade5e124c748ae5652566b34ed673eea38568c483a5a4c4836ca0100000008ac5352006563656affffffff5d4e037880ab1975ce95ea378d2874dcd49d5e01e1cdbfae3343a01f383fa35800000000095251ac52ac6aac6500ffffffff7de3ae7d97373b7f2aeb4c55137b5e947b2d5fb325e892530cb589bc4f92abd503000000086563ac53ab520052ffffffffb4db36a32d6e543ef49f4bafde46053cb85b2a6c4f0e19fa0860d9083901a1190300000003ab51531bbcfe5504a6dbda040000000008536a5365abac6500d660c80300000000096565abab6a53536a6a54e84e010000000003acac52df2ccf0500000000025351220c857e\", \"\", 2, 1879181631, \"3aad18a209fab8db44954eb55fd3cc7689b5ec9c77373a4d5f4dae8f7ae58d14\"],\n\t[\"d98b777f04b1b3f4de16b07a05c31d79965579d0edda05600c118908d7cf642c9cd670093f020000000953005351ac65ab5363a268caad6733b7d1718008997f249e1375eb3ab9fe68ab0fe170d8e745ea24f54ce67f9b00000000066500516a5151ffffffff7ef8040dfcc86a0651f5907e8bfd1017c940f51cf8d57e3d3fe78d57e40b1e610200000003535263ffffffff39846cfed4babc098ff465256ba3820c30d710581316afcb67cd31c623b703360300000001acffffffff03d405120100000000056300006a5201a73d050000000004ab636a6a294c8c000000000006ac65536553ac00000000\", \"63525351abac\", 1, 2018694761, \"86970af23c89b72a4f9d6281e46b9ef5220816bed71ebf1ae20df53f38fe16ff\"],\n\t[\"cabb1b06045a895e6dcfc0c1e971e94130c46feace286759f69a16d298c8b0f6fd0afef8f20300000004ac006352ffffffffa299f5edac903072bfb7d29b663c1dd1345c2a33546a508ba5cf17aab911234602000000056a65515365ffffffff89a20dc2ee0524b361231092a070ace03343b162e7162479c96b757739c8394a0300000002abab92ec524daf73fabee63f95c1b79fa8b84e92d0e8bac57295e1d0adc55dc7af5534ebea410200000001534d70e79b04674f6f00000000000600abacab53517d60cc0200000000035265ab96c51d040000000004ac6300ac62a787050000000008006a516563ab63639e2e7ff7\", \"6551ac6351ac\", 3, 1942663262, \"d0c4a780e4e0bc22e2f231e23f01c9d536b09f6e5be51c123d218e906ec518be\"],\n\t[\"8b96d7a30132f6005b5bd33ea82aa325e2bcb441f46f63b5fca159ac7094499f380f6b7e2e00000000076aacabac6300acffffffff0158056700000000000465005100c319e6d0\", \"52006a\", 0, -1100733473, \"fb4bd26a91b5cf225dd3f170eb09bad0eac314bc1e74503cc2a3f376833f183e\"],\n\t[\"112191b7013cfbe18a175eaf09af7a43cbac2c396f3695bbe050e1e5f4250603056d60910e02000000001c8a5bba03738a22010000000005525352656a77a149010000000002510003b52302000000000351ac52722be8e6\", \"65ac6565\", 0, -1847972737, \"8e795aeef18f510d117dfa2b9f4a2bd2e2847a343205276cedd2ba14548fd63f\"],\n\t[\"ce6e1a9e04b4c746318424705ea69517e5e0343357d131ad55d071562d0b6ebfedafd6cb840100000003656553ffffffff67bd2fa78e2f52d9f8900c58b84c27ef9d7679f67a0a6f78645ce61b883fb8de000000000100d699a56b9861d99be2838e8504884af4d30b909b1911639dd0c5ad47c557a0773155d4d303000000046a5151abffffffff9fdb84b77c326921a8266854f7bbd5a71305b54385e747fe41af8a397e78b7fa010000000863acac6a51ab00ac0d2e9b9d049b8173010000000007ac53526a650063ba9b7e010000000008526a00525263acac0ab3fd030000000000ea8a0303000000000200aca61a97b9\", \"\", 1, -1276952681, \"b6ed4a3721be3c3c7305a5128c9d418efa58e419580cec0d83f133a93e3a22c5\"],\n\t[\"a7721d94021652d90c79aaf5022d98219337d50f836382403ed313adb1116ba507ac28b0b0010000000551ac6300ab89e6d64a7aa81fb9595368f04d1b36d7020e7adf5807535c80d015f994cce29554fe869b01000000065353ab636500ffffffff024944c90100000000046300635369df9f01000000000000000000\", \"656a536551ab\", 0, -1740151687, \"935892c6f02948f3b08bcd463b6acb769b02c1912be4450126768b055e8f183a\"],\n\t[\"2f7353dd02e395b0a4d16da0f7472db618857cd3de5b9e2789232952a9b154d249102245fd030000000151617fd88f103280b85b0a198198e438e7cab1a4c92ba58409709997cc7a65a619eb9eec3c0200000003636aabffffffff0397481c0200000000045300636a0dc97803000000000009d389030000000003ac6a53134007bb\", \"0000536552526a\", 0, -1912746174, \"30c4cd4bd6b291f7e9489cc4b4440a083f93a7664ea1f93e77a9597dab8ded9c\"],\n\t[\"7d95473604fd5267d0e1bb8c9b8be06d7e83ff18ad597e7a568a0aa033fa5b4e1e2b6f1007020000000465006a6affffffffaee008503bfc5708bd557c7e78d2eab4878216a9f19daa87555f175490c40aaf000000000263abffffffffabd74f0cff6e7ceb9acc2ee25e65af1abcebb50c08306e6c78fa8171c37613dd010000000552acacababffffffff54a3069393f7930fa1b331cdff0cb945ec21c11d4605d8eedba1d3e094c6ae1f01000000026300ffffffff0182edeb050000000009526353ab5153530065a247e8cd\", \"51516aab00\", 2, -426210430, \"2707ca714af09494bb4cf0794abe33c6cba5f29891d619e76070269d1fa8e690\"],\n\t[\"221d4718023d9ca9fe1af178dbfce02b2b369bf823ea3f43f00891b7fef98e215c06b94fdd000000000951005153ab000051acffffffffb1c7ad1c64b7441bf5e70cd0f6eb4ec96821d67fc4997d9e6dfdceadecd36dde01000000070051536a635153ffffffff04e883cd00000000000851ab536553ab0052bbb2f70400000000002f1b2e03000000000165259fcb00000000000010dbde99\", \"ab\", 1, 665721280, \"4abce77432a86dfe608e7c1646c18b5253a373392ff962e288e3ab96bba1ba1d\"],\n\t[\"6f66c0b3013e6ae6aabae9382a4326df31c981eac169b6bc4f746edaa7fc1f8c796ef4e374000000000665ab6aabac6affffffff0191c8d6030000000002525300000000\", \"6a5352516a635352ab\", 0, -1299629906, \"48411efeb133c6b7fec4e7bdbe613f827093cb06ea0dbcc2ffcfde3a9ac4356c\"],\n\t[\"89e7928c04363cb520eff4465251fd8e41550cbd0d2cdf18c456a0be3d634382abcfd4a2130200000006ac516a6a656355042a796061ed72db52ae47d1607b1ceef6ca6aea3b7eea48e7e02429f382b378c4e51901000000085351ab6352ab5252ffffffff53631cbda79b40183000d6ede011c778f70147dc6fa1aed3395d4ce9f7a8e69701000000096a6553ab52516a52abad0de418d80afe059aab5da73237e0beb60af4ac490c3394c12d66665d1bac13bdf29aa8000000000153f2b59ab6027a33eb040000000007005351ac5100ac88b941030000000003ab0052e1e8a143\", \"63656a\", 0, 1258533326, \"b575a04b0bb56e38bbf26e1a396a76b99fb09db01527651673a073a75f0a7a34\"],\n\t[\"ca356e2004bea08ec2dd2df203dc275765dc3f6073f55c46513a588a7abcc4cbde2ff011c7020000000553525100003aefec4860ef5d6c1c6be93e13bd2d2a40c6fb7361694136a7620b020ecbaca9413bcd2a030000000965ac00536352535100ace4289e00e97caaea741f2b89c1143060011a1f93090dc230bee3f05e34fbd8d8b6c399010000000365526affffffff48fc444238bda7a757cb6a98cb89fb44338829d3e24e46a60a36d4e24ba05d9002000000026a53ffffffff03d70b440200000000056a6a526aac853c97010000000002515335552202000000000351635300000000\", \"0052\", 3, -528192467, \"fc93cc056c70d5e033933d730965f36ad81ef64f1762e57f0bc5506c5b507e24\"],\n\t[\"82d4fa65017958d53e562fac073df233ab154bd0cf6e5a18f57f4badea8200b217975e31030200000004636aab51ac0891a204227cc9050000000006635200655365bfef8802000000000865650051635252acfc2d09050000000006ab65ac51516380195e030000000007ac52525352510063d50572\", \"53\", 0, -713567171, \"e095003ca82af89738c1863f0f5488ec56a96fb81ea7df334f9344fcb1d0cf40\"],\n\t[\"75f6949503e0e47dd70426ef32002d6cdb564a45abedc1575425a18a8828bf385fa8e808e600000000036aabab82f9fd14e9647d7a1b5284e6c55169c8bd228a7ea335987cef0195841e83da45ec28aa2e0300000002516350dc6fe239d150efdb1b51aa288fe85f9b9f741c72956c11d9dcd176889963d699abd63f0000000001ab429a63f502777d20010000000007abac52ac516a53d081d9020000000003acac630c3cc3a8\", \"535152516551510000\", 1, 973814968, \"c6ec1b7cb5c16a1bfd8a3790db227d2acc836300534564252b57bd66acf95092\"],\n\t[\"24f24cd90132b2162f938f1c22d3ca5e7daa83515883f31a61a5177aebf99d7db6bdfc398c010000000163ffffffff01d5562d0100000000016300000000\", \"5265ac5165ac5252ab\", 0, 1055129103, \"5eeb03e03806cd7bfd44bbba69c30f84c2c5120df9e68cd8facc605fcfbc9693\"],\n\t[\"5ff2cac201423064a4d87a96b88f1669b33adddc6fa9acdc840c0d8a243671e0e6de49a5b00300000005ac6353655353b91db50180db5a03000000000663535151006a047a3aff\", \"52ab51ab5365005163\", 0, -1336626596, \"b8db8d57fe40ab3a99cf2f8ed57da7a65050fcc1d34d4280e25faf10108d3110\"],\n\t[\"10011f150220ad76a50ccc7bb1a015eda0ff987e64cd447f84b0afb8dc3060bdae5b36a6900200000000ffffffff1e92dd814dfafa830187bc8e5b9258de2445ec07b02c420ee5181d0b203bb334000000000565ab536a65ffffffff0124e65401000000000800ab636553ab53ac00000000\", \"53abab0051\", 0, 440222748, \"c6675bf229737e005b5c8ffa6f81d9e2c4396840921b6151316f67c4315a4270\"],\n\t[\"8b95ec900456648d820a9b8df1d8f816db647df8a8dc9f6e7151ebf6079d90ee3f6861352a02000000085200ab00ac535151ffffffff039b10b845f961225ac0bcaac4f5fe1991029a051aa3d06a3811b5762977a67403000000035252abffffffff8559d65f40d5e261f45aec8aad3d2c56c6114b22b26f7ee54a06f0881be3a7f5010000000765635252536363ffffffff38f8b003b50f6412feb2322b06b270197f81ad69c36af02ca5008b94eee5f650020000000165ffffffff01ae2b00010000000001638eb153a2\", \"0053ab5300ac53\", 2, 1266056769, \"205f3653f0142b35ce3ef39625442efebae98cde8cbf0516b97b51073bb0479f\"],\n\t[\"babbb7ea01ab5d584727cb44393b17cf66521606dc81e25d85273be0d57bad43e8f6b6d43501000000036a656aba83a68803fb0f4a000000000005536353ab633fcfe4020000000009ac00acab6351006a65182a0c03000000000453ac5363bee74f44\", \"536a6a6a6365ac51ab\", 0, -799187625, \"3275e98dca37243b977525a07b5d8e369d6c3bdc08cb948029a635547d0d1a4e\"],\n\t[\"e86a24bc03e4fae784cdf81b24d120348cb5e52d937cd9055402fdba7e43281e482e77a1c100000000046363006affffffffa5447e9bdcdab22bd20d88b19795d4c8fb263fbbf7ce8f4f9a85f865953a6325020000000663ac53535253ffffffff9f8b693bc84e0101fc73748e0513a8cecdc264270d8a4ee1a1b6717607ee1eaa00000000026a513417bf980158d82c020000000009005253005351acac5200000000\", \"6353516365536a6a\", 2, -563792735, \"508129278ef07b43112ac32faf00170ad38a500eed97615a860fd58baaad174b\"],\n\t[\"53bd749603798ed78798ef0f1861b498fc61dcee2ee0f2b37cddb115b118e73bc6a5a47a0201000000096a63656a6aab6a000007ff674a0d74f8b4be9d2e8e654840e99d533263adbdd0cf083fa1d5dd38e44d2d163d900100000007abab5251ac6a51c8b6b63f744a9b9273ccfdd47ceb05d3be6400c1ed0f7283d32b34a7f4f0889cccf06be30000000009516a52636551ab516a9ac1fe63030c677e05000000000027bc610000000000086565636a635100526e2dc60200000000015300000000\", \"6552536a515351ab\", 1, -1617066878, \"fe516df92299e995b8e6489be824c6839543071ec5e9286060b2600935bf1f20\"],\n\t[\"691bf9fc028ca3099020b79184e70039cf53b3c7b3fe695d661fd62d7b433e65feda2150610000000003ac63abffffffff2c814c15b142bc944192bddccb90a392cd05b968b599c1d8cd99a55a28a243fd0100000009ab5300526a5200abac98516a5803dfd3540500000000046552ac522838120100000000040053ab6a4409a903000000000665636a5300658759621b\", \"65ac5165ab\", 0, -359941441, \"d582c442e0ecc400c7ba33a56c93ad9c8cfd45af820350a13623594b793486f0\"],\n\t[\"536bc5e60232eb60954587667d6bcdd19a49048d67a027383cc0c2a29a48b960dc38c5a0370300000005ac636300abffffffff8f1cfc102f39b1c9348a2195d496e602c77d9f57e0769dabde7eaaedf9c69e250100000006acabab6a6351ffffffff0432f56f0400000000046a5365517fd54b0400000000035265539484e4050000000003536a5376dc25020000000008ac536aab6aab536ab978e686\", \"ac0051006a006a006a\", 0, -273074082, \"f151f1ec305f698d9fdce18ea292b145a58d931f1518cf2a4c83484d9a429638\"],\n\t[\"74606eba01c2f98b86c29ba5a32dc7a7807c2abe6ed8d89435b3da875d87c12ae05329e6070200000003510052ffffffff02a1e2c4020000000006516563526a63c68bae04000000000952ab6363ab00006363fe19ae4f\", \"63ababacac5365\", 0, 112323400, \"d1b1d79001b4a0324962607b739972d6f39c1493c4500ce814fd3bd72d32a5a0\"],\n\t[\"2ed805e20399e52b5bcc9dc075dad5cf19049ff5d7f3de1a77aee9288e59c5f4986751483f020000000165ffffffff967531a5726e7a653a9db75bd3d5208fa3e2c5e6cd5970c4d3aba84eb644c72c0300000000ffffffffd79030d20c65e5f8d3c55b5692e5bdaa2ae78cfa1935a0282efb97515feac43f030000000400006365261ab88c02bdf66a000000000003ab6351d6ad8b000000000005525152abac00000000\", \"630053ab5265\", 0, 2072814938, \"1d25d16d84d5793be1ad5cda2de9c9cf70e04a66c3dae618f1a7ca4026198e7f\"],\n\t[\"fab796ee03f737f07669160d1f1c8bf0800041157e3ac7961fea33a293f976d79ce49c02ab0200000003ac5252eb097ea1a6d1a7ae9dace338505ba559e579a1ee98a2e9ad96f30696d6337adcda5a85f403000000096500abab656a6a656396d5d41a9b11f571d91e4242ddc0cf2420eca796ad4882ef1251e84e42b930398ec69dd80100000005526551ac6a8e5d0de804f763bb0400000000015288271a010000000001acf2bf2905000000000300ab51c9641500000000000952655363636365ac5100000000\", \"00ac536552\", 0, -1854521113, \"f3bbab70b759fe6cfae1bf349ce10716dbc64f6e9b32916904be4386eb461f1f\"],\n\t[\"f2b539a401e4e8402869d5e1502dbc3156dbce93583f516a4947b333260d5af1a34810c6a00200000003525363ffffffff01d305e2000000000005acab535200a265fe77\", \"\", 0, -1435650456, \"41617b27321a830c712638dbb156dae23d4ef181c7a06728ccbf3153ec53d7dd\"],\n\t[\"9f10b1d8033aee81ac04d84ceee0c03416a784d1017a2af8f8a34d2f56b767aea28ff88c8f02000000025352ffffffff748cb29843bea8e9c44ed5ff258df1faf55fbb9146870b8d76454786c4549de100000000016a5ba089417305424d05112c0ca445bc7107339083e7da15e430050d578f034ec0c589223b0200000007abac53ac6565abffffffff025a4ecd010000000006636563ab65ab40d2700000000000056a6553526333fa296c\", \"\", 0, -395044364, \"20fd0eee5b5716d6cbc0ddf852614b686e7a1534693570809f6719b6fcb0a626\"],\n\t[\"ab81755f02b325cbd2377acd416374806aa51482f9cc5c3b72991e64f459a25d0ddb52e66703000000036a00ab8727056d48c00cc6e6222be6608c721bc2b1e69d0ffbadd51d131f05ec54bcd83003aac5000000000003f2cdb60454630e020000000007526aac63000000e9e25c040000000003516a0088c97e0000000000076a535265655263771b5805000000000851ab00ac6565515100000000\", \"5151ab00ac\", 0, -230931127, \"ba0a2c987fcdd74b6915f6462f62c3f126a0750aa70048f7aa20f70726e6a20b\"],\n\t[\"7a17e0ef0378dab4c601240639139335da3b7d684600fa682f59b7346ef39386fe9abd69350000000004ac5252ab807f26fb3249326813e18260a603b9ad66f41f05eaa8146f66bcca452162a502aac4aa8b02000000026a534ea460faa7e3d7854ec6c70d7e797025697b547ec500b2c09c873b4d5517767d3f3720660300000000ffffffff01b12e7a02000000000900ab006aab65656a63991c03e2\", \"6aab6a\", 1, -1577994103, \"62cd3413d9d819fb7355336365cf8a2a997f7436cc050a7143972044343b3281\"],\n\t[\"ff2ecc09041b4cf5abb7b760e910b775268abee2792c7f21cc5301dd3fecc1b4233ee70a2c0200000009acac5300006a51526affffffffeb39c195a5426afff38379fc85369771e4933587218ef4968f3f05c51d6b7c92000000000165453a5f039b8dbef7c1ffdc70ac383b481f72f99f52b0b3a5903c825c45cfa5d2c0642cd50200000001654b5038e6c49daea8c0a9ac8611cfe904fc206dad03a41fb4e5b1d6d85b1ecad73ecd4c0102000000096a51000053ab656565bdb5548302cc719200000000000452655265214a3603000000000300ab6a00000000\", \"52516a006a63\", 1, -2113289251, \"37ed6fae36fcb3360c69cac8b359daa62230fc1419b2cf992a32d8f3e079dcff\"],\n\t[\"70a8577804e553e462a859375957db68cfdf724d68caeacf08995e80d7fa93db7ebc04519d02000000045352ab53619f4f2a428109c5fcf9fee634a2ab92f4a09dc01a5015e8ecb3fc0d9279c4a77fb27e900000000006ab6a51006a6affffffff3ed1a0a0d03f25c5e8d279bb5d931b7eb7e99c8203306a6c310db113419a69ad010000000565516300abffffffff6bf668d4ff5005ef73a1b0c51f32e8235e67ab31fe019bf131e1382050b39a630000000004536a6563ffffffff02faf0bb00000000000163cf2b4b05000000000752ac635363acac15ab369f\", \"ac\", 0, -1175809030, \"1c9d6816c20865849078f9777544b5ddf37c8620fe7bd1618e4b72fb72dddca1\"],\n\t[\"a3604e5304caa5a6ba3c257c20b45dcd468f2c732a8ca59016e77b6476ac741ce8b16ca8360200000004acac6553ffffffff695e7006495517e0b79bd4770f955040610e74d35f01e41c9932ab8ccfa3b55d0300000007ac5253515365acffffffff6153120efc5d73cd959d72566fc829a4eb00b3ef1a5bd3559677fb5aae116e38000000000400abab52c29e7abd06ff98372a3a06227386609adc7665a602e511cadcb06377cc6ac0b8f63d4fdb03000000055100acabacffffffff04209073050000000009ab5163ac525253ab6514462e05000000000952abacab636300656a20672c0400000000025153b276990000000000056565ab6a5300000000\", \"5351\", 0, 1460890590, \"249c4513a49076c6618aabf736dfd5ae2172be4311844a62cf313950b4ba94be\"],\n\t[\"c6a72ed403313b7d027f6864e705ec6b5fa52eb99169f8ea7cd884f5cdb830a150cebade870100000009ac63ab516565ab6a51ffffffff398d5838735ff43c390ca418593dbe43f3445ba69394a6d665b5dc3b4769b5d700000000075265acab515365ffffffff7ee5616a1ee105fd18189806a477300e2a9cf836bf8035464e8192a0d785eea3030000000700ac6a51516a52ffffffff018075fd0000000000015100000000\", \"005251acac5252\", 2, -656067295, \"2cc1c7514fdc512fd45ca7ba4f7be8a9fe6d3318328bc1a61ae6e7675047e654\"],\n\t[\"93c12cc30270fc4370c960665b8f774e07942a627c83e58e860e38bd6b0aa2cb7a2c1e060901000000036300abffffffff4d9b618035f9175f564837f733a2b108c0f462f28818093372eec070d9f0a5440300000001acffffffff039c2137020000000001525500990100000000055265ab636a07980e0300000000005ba0e9d1\", \"656a5100\", 1, 18954182, \"6beca0e0388f824ca33bf3589087a3c8ad0857f9fe7b7609ae3704bef0eb83e2\"],\n\t[\"97bddc63015f1767619d56598ad0eb5c7e9f880b24a928fea1e040e95429c930c1dc653bdb0100000008ac53acac00005152aaa94eb90235ed10040000000000287bdd0400000000016a8077673a\", \"acac6a536352655252\", 0, -813649781, \"5990b139451847343c9bb89cdba0e6daee6850b60e5b7ea505b04efba15f5d92\"],\n\t[\"cc3c9dd303637839fb727270261d8e9ddb8a21b7f6cbdcf07015ba1e5cf01dc3c3a327745d0300000000d2d7804fe20a9fca9659a0e49f258800304580499e8753046276062f69dbbde85d17cd2201000000096352536a520000acabffffffffbc75dfa9b5f81f3552e4143e08f485dfb97ae6187330e6cd6752de6c21bdfd21030000000600ab53650063ffffffff0313d0140400000000096565515253526aacac167f0a040000000008acab00535263536a9a52f8030000000006abab5151ab63f75b66f2\", \"6a635353636a65ac65\", 1, 377286607, \"dbc7935d718328d23d73f8a6dc4f53a267b8d4d9816d0091f33823bd1f0233e9\"],\n\t[\"236f91b702b8ffea3b890700b6f91af713480769dda5a085ae219c8737ebae90ff25915a3203000000056300ac6300811a6a10230f12c9faa28dae5be2ebe93f37c06a79e76214feba49bb017fb25305ff84eb020000000100ffffffff041e351703000000000351ac004ff53e050000000003ab53636c1460010000000000cb55f701000000000651520051ab0000000000\", \"acac636a6aac5300\", 0, 406448919, \"793a3d3c37f6494fab79ff10c16702de002f63e34be25dd8561f424b0ea938c4\"],\n\t[\"22e10d2003ab4ea9849a2801921113583b7c35c3710ff49a6003489395789a7cfb1e6051900100000006526a65535151ffffffff82f21e249ec60db33831d33b9ead0d56f6496db64337dcb7f1c3327c47729c4a020000000253abffffffff138f098f0e6a4cf51dc3e7a3b749f487d1ebde71b73b731d1d02ad1180ac7b8c02000000036563acda215011027a9484020000000007635165530000ac4bf6cb0400000000066aacabab65ab3ce3f32c\", \"ab0052ab\", 2, 1136359457, \"b5bd080bbcb8cd652f440484311d7a3cb6a973cd48f03c5c00fd6beb52dfc061\"],\n\t[\"c47d5ad60485cb2f7a825587b95ea665a593769191382852f3514a486d7a7a11d220b62c54000000000663655253acab8c3cf32b0285b040e50dcf6987ddf7c385b3665048ad2f9317b9e0c5ba0405d8fde4129b00000000095251ab00ac65635300ffffffff549fe963ee410d6435bb2ed3042a7c294d0c7382a83edefba8582a2064af3265000000000152fffffffff7737a85e0e94c2d19cd1cde47328ece04b3e33cd60f24a8a345da7f2a96a6d0000000000865ab6a0051656aab28ff30d5049613ea020000000005ac51000063f06df1050000000008ac63516aabac5153afef5901000000000700656500655253688bc00000000000086aab5352526a53521ff1d5ff\", \"51ac52\", 2, -1296011911, \"0c1fd44476ff28bf603ad4f306e8b6c7f0135a441dc3194a6f227cb54598642a\"],\n\t[\"0b43f122032f182366541e7ee18562eb5f39bc7a8e5e0d3c398f7e306e551cdef773941918030000000863006351ac51acabffffffffae586660c8ff43355b685dfa8676a370799865fbc4b641c5a962f0849a13d8250100000005abab63acabffffffff0b2b6b800d8e77807cf130de6286b237717957658443674df047a2ab18e413860100000008ab6aac655200ab63ffffffff04f1dbca03000000000800635253ab656a52a6eefd0300000000036365655d8ca90200000000005a0d530400000000015300000000\", \"65ac65acac\", 0, 351448685, \"86f26e23822afd1bdfc9fff92840fc1e60089f12f54439e3ab9e5167d0361dcf\"],\n\t[\"4b0ecc0c03ba35700d2a30a71f28e432ff6ac7e357533b49f4e97cf28f1071119ad6b97f3e0300000008acab516363ac63acffffffffcd6a2019d99b5c2d639ddca0b1aa5ea7c1326a071255ea226960bd88f45ca57d00000000085253655363005353ffffffffba257635191c9f216de3277be548cb5a2313114cb1a4c563b03b4ef6c0f4f7040300000001abda542edf0495cdc40100000000026353c049e903000000000752516a53ab65512b0f9304000000000963ab516aac65516552fa9ece050000000009acab6500005152530000000000\", \"65ab51525352510052\", 1, -1355414590, \"3cd85f84aae6d702436f3f9b8980adcc1f8f202e957759540a27da0a32fc6c87\"],\n\t[\"adaac0a803f66811346271c733036d6e0d45e15a9b602092e2e04ad93564f196e7f020b088000000000600526a636a00700ec3f9db07a3a6ce910bf318c7ec87a876e1f2a3366cc69f20cde09203b99c1cb9d15800000000050000ac636a4d0de554ebe95c6cc14faf5ff6361d1deba9474b8b0fd3b93c011cd96aec783abb3f36830200000005ab65005251ffffffff0464eb10050000000007520000ab6a65ab1beaa80300000000005a2f31050000000006526aab65ac52ba7db10000000000045251ab6a0cfb46e7\", \"ab0051ac52636a\", 1, -184733716, \"961ff413850336d3987c550404fc1d923266ca36cc9ffee7113edb3a9fea7f30\"],\n\t[\"af1c4ab301ec462f76ee69ba419b1b2557b7ded639f3442a3522d4f9170b2d6859765c3df402000000016affffffff01a5ca6c000000000008ab52536aab00005300000000\", \"6a6351\", 0, 110304602, \"e88ed2eea9143f2517b15c03db00767eb01a5ce12193b99b964a35700607e5f4\"],\n\t[\"0bfd34210451c92cdfa02125a62ba365448e11ff1db3fb8bc84f1c7e5615da40233a8cd368010000000252ac9a070cd88dec5cf9aed1eab10d19529720e12c52d3a21b92c6fdb589d056908e43ea910e0200000009ac516a52656a6a5165ffffffffc3edcca8d2f61f34a5296c405c5f6bc58276416c720c956ff277f1fb81541ddd00000000030063abffffffff811247905cdfc973d179c03014c01e37d44e78f087233444dfdce1d1389d97c302000000065163000063ab1724a26e02ca37c902000000000851ab53525352ac529012a90100000000085200525253535353fa32575b\", \"5352ac6351\", 1, -1087700448, \"b8f1e1f35e3e1368bd17008c756e59cced216b3c699bcd7bebdb5b6c8eec4697\"],\n\t[\"2c84c0640487a4a695751d3e4be48019dbaea85a6e854f796881697383ea455347d2b2769001000000055265526500ffffffff6aac176d8aa00778d496a7231eeb7d3334f20c512d3db1683276402100d98de5030000000700536a5263526ac1ee9ceb171c0c984ebaf12c234fd1487fbf3b3d73aa0756907f26837efba78d1bed33200300000001ab4d9e8ec0bed837cb929bbed76ee848959cec59de44bd7667b7631a744f880d5c71a20cfd0100000007005363515300abffffffff023753fb0000000000036565532d3873050000000009005152ab6a63acab5200000000\", \"ab650053ab\", 0, -877941183, \"c49af297dffe2d80deddf10ceea84b99f8554bd2d55bbdc34e449728c31f0835\"],\n\t[\"1f7e4b1b045d3efa6cd7a11d7873a8bab886c19bd11fcb6712f0948f2db3a7be76ff76c8f100000000095265ab6a0065ac5363ffffffffdaafcfa6029336c997680a541725190f09a6f6da21e54560eca4b5b8ae987da1000000000952ac52acac52515165ffffffff825a38d3b1e5bb4d10f33653ab3ab6882c7abdaec74460257d1528ce7be3f98e0100000007526a006a656a63c14adc8f04953a5d3d3f89237f38b857dd357713896d36215f7e8b77b11d98ea3cdc93df02000000015212484f6104bfafae0300000000025263a2b0120000000000056563ab00516c4d2605000000000653ac6500655301cc93030000000002acab14643b1f\", \"63acac53ab\", 0, 333824258, \"18da6ceb011cd36f15ad7dd6c55ef07e6f6ed48881ce3bb31416d3c290d9a0e9\"],\n\t[\"467a3e7602e6d1a7a531106791845ec3908a29b833598e41f610ef83d02a7da3a1900bf2960000000005ab6a636353ffffffff031db6dac6f0bafafe723b9199420217ad2c94221b6880654f2b35114f44b1df010000000965ab52636a63ac6352ffffffff02b3b95c0100000000026300703216030000000001ab3261c0aa\", \"6a\", 0, 2110869267, \"3078b1d1a7713c6d101c64afe35adfae0977a5ab4c7e07a0b170b041258adbf2\"],\n\t[\"8713bc4f01b411149d575ebae575f5dd7e456198d61d238695df459dd9b86c4e3b2734b62e0300000004abac6363ffffffff03b58049050000000002ac653c714c04000000000953656a005151526a527b5a9e03000000000652ac5100525300000000\", \"52\", 0, -647281251, \"0e0bed1bf2ff255aef6e5c587f879ae0be6222ab33bd75ee365ec6fbb8acbe38\"],\n\t[\"f2ba8a8701b9c401efe3dd0695d655e20532b90ac0142768cee4a3bb0a89646758f544aa8102000000036a52527899f4e4040c6f0b030000000008636565ab530051ab52b60c000000000009515200ab630053ac53a49c5f040000000008ab53ab516300ab63fa27340300000000015100000000\", \"ac63abab5251\", 0, -1328936437, \"ab61497afd39e61fe06bc5677326919716f9b20083c9f3417dcea905090e0411\"],\n\t[\"b5a7df6102107beded33ae7f1dec0531d4829dff7477260925aa2cba54119b7a07d92d5a1d02000000046a516a52803b625c334c1d2107a326538a3db92c6c6ae3f7c3516cd90a09b619ec6f58d10e77bd6703000000056563006a63ffffffff0117484b03000000000853acab52526a65abc1b548a1\", \"ac006a525100\", 0, 2074359913, \"680336db57347d8183b8898cd27a83f1ba5884155aeae5ce20b4840b75e12871\"],\n\t[\"278cb16204b9dadf400266106392c4aa9df01ba03af988c8139dae4c1818ac009f13fc5f1a00000000065200ac656a52ffffffffd006bbebd8cbd7bdead24cddc9badfcc6bc0c2e63c037e5c29aa858f5d0f3e7d01000000046a0051acffffffffbc62a5f57e58da0b67956003ae81ac97cb4cbd1d694c914fc41515c008c4d8fd020000000165e329c844bcc16164be64b64a81cbf4ffd41ed2934e0daa0040ccb8365bab0b2a9e401c180300000003ab52abffffffff02588460030000000000a25a12030000000005535100005300000000\", \"6553ab6a5300acab51\", 3, 989407546, \"1c29f110576f4a3b257f67454d99dfc0dee62ef5517ca702848ce4bd2ea1a1d7\"],\n\t[\"49eb2178020a04fca08612c34959fd41447319c190fb7ffed9f71c235aa77bec28703aa1820200000003ac6353abaff326071f07ec6b77fb651af06e8e8bd171068ec96b52ed584de1d71437fed186aecf0300000001acffffffff03da3dbe02000000000652ac63ac6aab8f3b680400000000096a536a65636a53516a5175470100000000016500000000\", \"6a536365\", 0, 1283691249, \"c670219a93234929f662ecb9aa148a85a2d281e83f4e53d10509461cdea47979\"],\n\t[\"0f96cea9019b4b3233c0485d5b1bad770c246fe8d4a58fb24c3b7dfdb3b0fd90ea4e8e947f0300000006006a5163515303571e1e01906956030000000005ab635353abadc0fbbe\", \"acac\", 0, -1491469027, \"716a8180e417228f769dcb49e0491e3fda63badf3d5ea0ceeac7970d483dd7e2\"],\n\t[\"9a7d858604577171f5fe3f3fd3e5e039c4b0a06717a5381e9977d80e9f53e025e0f16d2877020000000752636565536353ffffffff5862bd028e8276e63f044be1dddcbb8d0c3fa097678308abf2b0f45104a93dbd0100000001531200667ba8fdd3b28e98a35da73d3ddfe51e210303d8eb580f923de988ee632d77793892030000000752526363526563ffffffffe9744eb44db2658f120847c77f47786d268c302120d269e6004455aa3ea5f5e20200000009ab6300636aab656551ffffffff03c61a3c020000000009ab516a6aab6aab53ab737f1a05000000000853acabab655365ab92a4a00400000000016367edf6c8\", \"535352ab\", 3, 659348595, \"d36ee79fc80db2e63e05cdc50357d186181b40ae20e3720878284228a13ee8b3\"],\n\t[\"148e68480196eb52529af8e83e14127cbfdbd4a174e60a86ac2d86eac9665f46f4447cf7aa01000000045200ac538f8f871401cf240c0300000000065252ab52656a5266cf61\", \"\", 0, -344314825, \"eacc47c5a53734d6ae3aedbc6a7c0a75a1565310851b29ef0342dc4745ceb607\"],\n\t[\"e2bc29d4013660631ba14ecf75c60ec5e9bed7237524d8c10f66d0675daa66d1492cb834530200000004ac510065e42d0c9e04f2b26c01000000000951525152acac65ababa35b7504000000000953ac6aac00650053ab94688c0400000000056365526553a1bced0300000000016a00000000\", \"65ab0063655353\", 0, -888431789, \"59a34b3ed3a1cce0b104de8f7d733f2d386ffc7445efae67680cd90bc915f7e0\"],\n\t[\"0c8a70d70494dca6ab05b2bc941b5b431c43a292bd8f2f02eab5e240a408ca73a676044a4103000000056a51ab006affffffff84496004e54836c035821f14439149f22e1db834f315b24588ba2f031511926c0100000000ffffffffbbc5e70ed1c3060ba1bfe99c1656a3158a7307c3ce8eb362ec32c668596d2bd30000000009636563635351abab00b039344c6fc4f9bec24322e45407af271b2d3dfec5f259ee2fc7227bc5285e22b3be85b40100000009ac00ab53abac6a5352e5ddfcff02d50231020000000005006a51536ab086d9020000000006ababac51ac6a00000000\", \"abab636565acac6a\", 3, 241546088, \"643a7b4c8d832e14d5c10762e74ec84f2c3f7ed96c03053157f1bed226614911\"],\n\t[\"f98f79cf0274b745e1d6f36da7cbe205a79132a7ad462bdc434cfb1dcd62a6977c3d2a5dbc010000000553516a5365ffffffff4f89f485b53cdad7fb80cc1b7e314b9735b9383bc92c1248bb0e5c6173a55c0d010000000353655293f9b014045ad96d02000000000963ac526a53ac636365f4c27904000000000952536563635152526a2788f0030000000002516aff5add01000000000863530051655351abd04716ba\", \"ab6552536a53\", 1, -2128899945, \"56d29f5e300ddfed2cd8dcce5d79826e193981d0b70dc7487772c8a0b3b8d7b1\"],\n\t[\"6c7913f902aa3f5f939dd1615114ce961beda7c1e0dd195be36a2f0d9d047c28ac62738c3a020000000453abac00ffffffff477bf2c5b5c6733881447ac1ecaff3a6f80d7016eee3513f382ad7f554015b970100000007ab6563acab5152ffffffff04e58fe1040000000009ab00526aabab526553e59790010000000002ab525a834b03000000000035fdaf0200000000086551ac65515200ab00000000\", \"63ac53\", 1, 1285478169, \"1536da582a0b6de017862445e91ba14181bd6bf953f4de2f46b040d351a747c9\"],\n\t[\"4624aa9204584f06a8a325c84e3b108cafb97a387af62dc9eab9afd85ae5e2c71e593a3b690200000003636a005eb2b44eabbaeca6257c442fea00107c80e32e8715a1293cc164a42e62ce14fea146220c020000000090b9ee38106e3310037bfc519fd209bdbd21c588522a0e96df5fba4e979392bc993bfe9f01000000086363636a635353ab6f1907d218ef6f3c729d9200e23c1dbff2df58b8b1282c6717b26cf760ee4c880d23f4d100000000086a516a536a525163ffffffff01d6f162050000000000ebbab208\", \"525365ab0053\", 1, -1515409325, \"6cf9cd409b7185b1f118171f0a34217af5b612ea54195ea186505b667c19337f\"],\n\t[\"16562fc503f1cf9113987040c408bfd4523f1512da699a2ca6ba122dc65677a4c9bf7763830000000003636552ffffffff1ec1fab5ff099d1c8e6b068156f4e39b5543286bab53c6d61e2582d1e07c96cf02000000045163656affffffffd0ef40003524d54c08cb4d13a5ee61c84fbb28cde9eca7a6d11ba3a9335d8c620100000007635153536a6300fbb84fc2012003a601000000000363ab6a00000000\", \"63636a006a6aab\", 0, -1310262675, \"1efbf3d37a92bc03d9eb950b792f307e95504f7c4998f668aa250707ebb752ac\"],\n\t[\"531665d701f86bacbdb881c317ef60d9cd1baeffb2475e57d3b282cd9225e2a3bf9cbe0ded01000000086300ac515263acabffffffff0453a8500100000000086353acab516a6565e5e9200500000000026a52a44caa00000000000453ac000065e41b0500000000076500ac0065526ab4476f4d\", \"006563006aab00636a\", 0, 1770013777, \"0898b26dd3ca08632a5131fa48eb55b44386d0c5070c24d6e329673d5e3693b8\"],\n\t[\"0f1227a20140655a3da36e413b9b5d108a866f6f147eb4940f032f5a89854eae6d7c3a91600100000009525363515153515253e37a79480161ab61020000000001ab00000000\", \"ab65005200\", 0, -1996383599, \"979782dc3f36d908d37d7e4046a38d306b4b08ddc60a5eba355fe3d6da1b29a9\"],\n\t[\"063ff6eb01aff98d0d2a6db224475010edb634c2f3b46257084676adeb84165a4ff8558d7601000000066353006a5165deb3262c042d109c0000000000076363ab52ac005200b9c4050000000007516300ac510063cfffc800000000000200639e815501000000000700526a52ac6365ac7b07b8\", \"656552abac6500\", 0, -1559847112, \"674a4bcb04247f8dc98780f1792cac86b8aee41a800fc1e6f5032f6e1dccde65\"],\n\t[\"3320f6730132f830c4681d0cae542188e4177cad5d526fae84565c60ceb5c0118e844f90bd030000000163ffffffff0257ec5a040000000005525251ac6538344d000000000002515200000000\", \"5352656a53ac516a65\", 0, 788050308, \"3afacaca0ef6be9d39e71d7b1b118994f99e4ea5973c9107ca687d28d8eba485\"],\n\t[\"c13aa4b702eedd7cde09d0416e649a890d40e675aa9b5b6d6912686e20e9b9e10dbd40abb1000000000863ab6353515351ac11d24dc4cc22ded7cdbc13edd3f87bd4b226eda3e4408853a57bcd1becf2df2a1671fd1600000000045165516affffffff01baea300100000000076aab52ab53005300000000\", \"0065\", 0, -1195908377, \"241a23e7b1982d5f78917ed97a8678087acbbffe7f624b81df78a5fe5e41e754\"],\n\t[\"d9a6f20e019dd1b5fae897fb472843903f9c3c2293a0ffb59cff2b413bae6eceab574aaf9d030000000663ab006a515102f54939032df5100100000000056a51ab65530ec28f010000000004ac5100007e874905000000000651005265ac6a00000000\", \"abacab63acacabab\", 0, 271463254, \"1326a46f4c21e7619f30a992719a905aa1632aaf481a57e1cbd7d7c22139b41e\"],\n\t[\"157c81bf0490432b3fcb3f9a5b79e5f91f67f05efb89fa1c8740a3fe7e9bdc18d7cb6acd2203000000026351ffffffff912e48e72bbcf8a540b693cf8b028e532a950e6e63a28801f6eaad1afcc52ad00000000000b1a4b170a2b9e60e0cad88a0085137309f6807d25d5afb5c1e1d32aa10ba1cdf7df596dd0000000009525165656a51ab65ab3674fba32a76fe09b273618d5f14124465933f4190ba4e0fd09d838daafc6223b31642ac00000000086a53536551ac6565ffffffff01fe9fb6030000000008ab51656a5165636a00000000\", \"ab00ab6a6551\", 3, -64357617, \"1ddaab7f973551d71f16bd70c4c4edbf7225e64e784a6da0ee7f7a9fe4f12a0b\"],\n\t[\"a2692fff03b2387f5bacd5640c86ba7df574a0ee9ed7f66f22c73cccaef3907eae791cbd230200000004536363abffffffff4d9fe7e5b375de88ba48925d9b2005447a69ea2e00495a96eafb2f144ad475b40000000008000053000052636537259bee3cedd3dcc07c8f423739690c590dc195274a7d398fa196af37f3e9b4a1413f810000000006ac63acac52abffffffff04c65fe60200000000075151536365ab657236fc020000000009005263ab00656a6a5195b8b6030000000007ac5165636aac6a7d7b66010000000002acab00000000\", \"51\", 2, -826546582, \"925037c7dc7625f3f12dc83904755a37016560de8e1cdd153c88270a7201cf15\"],\n\t[\"2c5b003201b88654ac2d02ff6762446cb5a4af77586f05e65ee5d54680cea13291efcf930d0100000005ab536a006a37423d2504100367000000000004536a515335149800000000000152166aeb03000000000452510063226c8e03000000000000000000\", \"635251\", 0, 1060344799, \"7e058ca5dd07640e4aae7dea731cfb7d7fef1bfd0d6d7b6ce109d041f4ca2a31\"],\n\t[\"f981b9e104acb93b9a7e2375080f3ea0e7a94ce54cd8fb25c57992fa8042bdf4378572859f0100000002630008604febba7e4837da77084d5d1b81965e0ea0deb6d61278b6be8627b0d9a2ecd7aeb06a0300000005ac5353536a42af3ef15ce7a2cd60482fc0d191c4236e66b4b48c9018d7dbe4db820f5925aad0e8b52a0300000008ab0063510052516301863715efc8608bf69c0343f18fb81a8b0c720898a3563eca8fe630736c0440a179129d03000000086aac6a52ac6a63ac44fec4c00408320a03000000000062c21c030000000007ac6a655263006553835f0100000000015303cd60000000000005535263536558b596e0\", \"00\", 0, -2140385880, \"49870a961263354c9baf108c6979b28261f99b374e97605baa532d9fa3848797\"],\n\t[\"e7416df901269b7af14a13d9d0507709b3cd751f586ce9d5da8d16a121e1bd481f5a086e1103000000056aab005200ffffffff01aa269c040000000006acac6a6a5263ee718de6\", \"ab525363\", 0, 1309186551, \"eea7d2212bda2d408fff146f9ae5e85e6b640a93b9362622bb9d5e6e36798389\"],\n\t[\"402a815902193073625ab13d876190d1bbb72aecb0ea733c3330f2a4c2fe6146f322d8843a0300000008656aab0000535363fffffffff9dccdec5d8509d9297d26dfcb1e789cf02236c77dc4b90ebccbf94d1b5821150300000001510bf1f96a03c5c145000000000002ac6ae11b1c0100000000055163516a5239c8a600000000000365636300000000\", \"63536aacab\", 0, -1811424955, \"0090803a20102a778ab967a74532faee13e03b702083b090b1497bc2267ee2fe\"],\n\t[\"c4b702e502f1a54f235224f0e6de961d2e53b506ab45b9a40805d1dacd35148f0acf24ca5e00000000085200ac65ac53acabf34ba6099135658460de9d9b433b84a8562032723635baf21ca1db561dce1c13a06f4407000000000851ac006a63516aabffffffff02a853a603000000000163d17a67030000000005ab63006a5200000000\", \"ac5363515153\", 1, 480734903, \"5c46f7ac3d6460af0da28468fcc5b3c87f2b9093d0f837954b7c8174b4d7b6e7\"],\n\t[\"9b83f78704f492b9b353a3faad8d93f688e885030c274856e4037818848b99e490afef27770200000000ffffffff36b60675a5888c0ef4d9e11744ecd90d9fe9e6d8abb4cff5666c898fdce98d9e00000000056aab656352596370fca7a7c139752971e169a1af3e67d7656fc4fc7fd3b98408e607c2f2c836c9f27c030000000653ac51ab6300a0761de7e158947f401b3595b7dc0fe7b75fa9c833d13f1af57b9206e4012de0c41b8124030000000953656a53ab53510052242e5f5601bf83b301000000000465516a6300000000\", \"63515200ac656365\", 3, -150879312, \"9cf05990421ea853782e4a2c67118e03434629e7d52ab3f1d55c37cf7d72cdc4\"],\n\t[\"f492a9da04f80b679708c01224f68203d5ea2668b1f442ebba16b1aa4301d2fe5b4e2568f3010000000953005351525263ab65ffffffff93b34c3f37d4a66df255b514419105b56d7d60c24bf395415eda3d3d8aa5cd0101000000020065ffffffff9dba34dabdc4f1643b372b6b77fdf2b482b33ed425914bb4b1a61e4fad33cf390000000002ab52ffffffffbbf3dc82f397ef3ee902c5146c8a80d9a1344fa6e38b7abce0f157be7adaefae0000000009515351005365006a51ffffffff021359ba010000000000403fea0200000000095200ac6353abac635300000000\", \"00ac51acacac\", 0, -2115078404, \"fd44fc98639ca32c927929196fc3f3594578f4c4bd248156a25c04a65bf3a9f3\"],\n\t[\"2f73e0b304f154d3a00fde2fdd40e791295e28d6cb76af9c0fd8547acf3771a02e3a92ba37030000000852ac6351ab6565639aa95467b065cec61b6e7dc4d6192b5536a7c569315fb43f470078b31ed22a55dab8265f02000000080065636a6aab6a53ffffffff9e3addbff52b2aaf9fe49c67017395198a9b71f0aa668c5cb354d06c295a691a0100000000ffffffff45c2b4019abaf05c5e484df982a4a07459204d1343a6ee5badade358141f8f990300000007ac516a6aacac6308655cd601f3bc2f0000000000015200000000\", \"\", 0, -2082053939, \"9a95e692e1f78efd3e46bb98f178a1e3a0ef60bd0301d9f064c0e5703dc879c2\"],\n\t[\"5a60b9b503553f3c099f775db56af3456330f1e44e67355c4ab290d22764b9144a7b5f959003000000030052acbd63e0564decc8659aa53868be48c1bfcda0a8c9857b0db32a217bc8b46d9e7323fe9649020000000553ac6551abd0ecf806211db989bead96c09c7f3ec5f73c1411d3329d47d12f9e46678f09bac0dc383e0200000000ffffffff01494bb202000000000500516551ac00000000\", \"ac\", 0, 1169947809, \"62a36c6e8da037202fa8aeae03e533665376d5a4e0a854fc4624a75ec52e4eb1\"],\n\t[\"7e98d353045569c52347ca0ff2fdba608829e744f61eb779ffdb5830aae0e6d6857ab2690e03000000075365acab656352ffffffffa890dd37818776d12da8dca53d02d243ef23b4535c67016f4c58103eed85360f030000000093dbacdc25ca65d2951e047d6102c4a7da5e37f3d5e3c8b87c29b489360725dcd117ee2003000000056a6300ac53c7e99fa1dc2b8b51733034e6555f6d6de47dbbf1026effac7db80cb2080678687380dc1e02000000075352005263516affffffff04423272040000000008ab6353ab65510051e0f53b0500000000086300516552635152f74a5f04000000000853acab0053ab52ab0e8e5f00000000000951ac5363516a6aabab00000000\", \"6a5163ab52\", 3, 890006103, \"476868cecd1763c91dade98f17defa42d31049547df45acffa1cc5ae5c3d75d6\"],\n\t[\"e3649aa40405e6ffe377dbb1bbbb672a40d8424c430fa6512c6165273a2b9b6afa9949ec430200000007630052ab655153a365f62f2792fa90c784efe3f0981134d72aac0b1e1578097132c7f0406671457c332b84020000000353ab6ad780f40cf51be22bb4ff755434779c7f1def4999e4f289d2bd23d142f36b66fbe5cfbb4b01000000076a5252abac52ab1430ffdc67127c9c0fc97dcd4b578dab64f4fb9550d2b59d599773962077a563e8b6732c02000000016affffffff04cb2687000000000002ab636e320904000000000252acf70e9401000000000100dc3393050000000006ab0063536aacbc231765\", \"65520053\", 3, -2016196547, \"f64f805f0ff7f237359fa6b0e58085f3c766d1859003332223444fd29144112a\"],\n\t[\"1d033569040700441686672832b531ab55db89b50dc1f9fc00fb72218b652da9dcfbc83be901000000066551ac526a632b390f9ad068e5fdee6563e88e2a8e4e09763c861072713dc069893dc6bbc9db3f00e26502000000096a5363526565525252ffffffff8a36bdd0aaf38f6707592d203e14476ca9f259021e487135c7e8324244057ed90300000000ed3fb2a3dfd4d46b5f3603fe0148653911988457bd0ed7f742b07c452f5476c228ff9f600200000007526aac00525152ffffffff04b88e48030000000000c753d602000000000853510000006553518fda2603000000000853ac52acac5263534839f1030000000006ac006aacac5300000000\", \"516553635300ab0052\", 1, 2075958316, \"c2cefaec2293134acbcf6d2a8bf2b3eb42e4ec04ee8f8bf30ff23e65680677c1\"],\n\t[\"4c4be7540344050e3044f0f1d628039a334a7c1f7b4573469cfea46101d6888bb6161fe9710200000000ffffffffac85a4fdad641d8e28523f78cf5b0f4dc74e6c5d903c10b358dd13a5a1fd8a06000000000163e0ae75d05616b72467b691dc207fe2e65ea35e2eadb7e06ea442b2adb9715f212c0924f10200000000ffffffff0194ddfe02000000000265ac00000000\", \"00006500\", 1, -479922562, \"d66924d49f03a6960d3ca479f3415d638c45889ce9ab05e25b65ac260b51d634\"],\n\t[\"202c18eb012bc0a987e69e205aea63f0f0c089f96dd8f0e9fcde199f2f37892b1d4e6da90302000000055352ac6565ffffffff0257e5450100000000025300ad257203000000000000000000\", \"520052ac6a005265\", 0, 168054797, \"502967a6f999f7ee25610a443caf8653dda288e6d644a77537bcc115a8a29894\"],\n\t[\"32fa0b0804e6ea101e137665a041cc2350b794e59bf42d9b09088b01cde806ec1bbea077df0200000008515153650000006506a11c55904258fa418e57b88b12724b81153260d3f4c9f080439789a391ab147aabb0fa0000000007000052ac51ab510986f2a15c0d5e05d20dc876dd2dafa435276d53da7b47c393f20900e55f163b97ce0b800000000008ab526a520065636a8087df7d4d9c985fb42308fb09dce704650719140aa6050e8955fa5d2ea46b464a333f870000000009636300636a6565006affffffff01994a0d040000000002536500000000\", \"516563530065\", 2, -163068286, \"f58637277d2bc42e18358dc55f7e87e7043f5e33f4ce1fc974e715ef0d3d1c2a\"],\n\t[\"ae23424d040cd884ebfb9a815d8f17176980ab8015285e03fdde899449f4ae71e04275e9a80100000007ab006553530053ffffffff018e06db6af519dadc5280c07791c0fd33251500955e43fe4ac747a4df5c54df020000000251ac330e977c0fec6149a1768e0d312fdb53ed9953a3737d7b5d06aad4d86e9970346a4feeb5030000000951ab51ac6563ab526a67cabc431ee3d8111224d5ecdbb7d717aa8fe82ce4a63842c9bd1aa848f111910e5ae1eb0100000004ac515300bfb7e0d7048acddc030000000009636a5253636a655363a3428e040000000001525b99c6050000000004655265ab717e6e020000000000d99011eb\", \"ac6a6a516565\", 1, -716251549, \"b098eb9aff1bbd375c70a0cbb9497882ab51f3abfebbf4e1f8d74c0739dc7717\"],\n\t[\"030f44fc01b4a9267335a95677bd190c1c12655e64df74addc53b753641259af1a54146baa020000000152e004b56c04ba11780300000000026a53f125f001000000000251acd2cc7c03000000000763536563655363c9b9e50500000000015200000000\", \"ac\", 0, -1351818298, \"19dd32190ed2a37be22f0224a9b55b91e37290577c6c346d36d32774db0219a3\"],\n\t[\"c05f448f02817740b30652c5681a3b128322f9dc97d166bd4402d39c37c0b14506d8adb5890300000003536353ffffffffa188b430357055ba291c648f951cd2f9b28a2e76353bef391b71a889ba68d5fc02000000056565526a6affffffff02745f73010000000001ab3ec34c0400000000036aac5200000000\", \"516551510053\", 0, -267877178, \"3a1c6742d4c374f061b1ebe330b1e169a113a19792a1fdde979b53e094cc4a3c\"],\n\t[\"163ba45703dd8c2c5a1c1f8b806afdc710a2a8fc40c0138e2d83e329e0e02a9b6c837ff6b8000000000700655151ab6a522b48b8f134eb1a7e6f5a6fa319ce9d11b36327ba427b7d65ead3b4a6a69f85cda8bbcd22030000000563656552acffffffffdbcf4955232bd11eef0cc6954f3f6279675b2956b9bcc24f08c360894027a60201000000066500006500abffffffff04d0ce9d0200000000008380650000000000015233f360040000000003006aabedcf0801000000000000000000\", \"000065006500ac\", 0, 216965323, \"9afe3f4978df6a86e9a8ebd62ef6a9d48a2203f02629349f1864ef2b8b92fd55\"],\n\t[\"07f7f5530453a12ad0c7eb8fbc3f140c7ab6818144d67d2d8752600ca5d9a9358e2dff87d4000000000663526aab526a9e599c379d455e2da36d0cde88d931a863a3e97e01e93b9edb65856f3d958dc08b92b720000000000165bbc8d66dae3b1b170a6e2457f5b161465cb8706e0e6ffc6af55deb918365f14c5f40d4890100000000a7bd77c069ee4b48638e2363fcf2a86b02bea022047bd9fcb16d2b94ad068308d19b31cb00000000066aab5300ab529672aa8f01dbd8a205000000000663536353006a02e99901\", \"ac006351006a63ab63\", 1, 119789359, \"6629a1e75c6ae8f4f9d5f734246b6a71682a5ea57246040ef0584f6b97916175\"],\n\t[\"fe647f950311bf8f3a4d90afd7517df306e04a344d2b2a2fea368935faf11fa6882505890d0000000005ab5100516affffffff43c140947d9778718919c49c0535667fc6cc727f5876851cb8f7b6460710c7f60100000000ffffffffce4aa5d90d7ab93cbec2e9626a435afcf2a68dd693c15b0e1ece81a9fcbe025e0300000000ffffffff02f34806020000000002515262e54403000000000965635151ac655363636de5ce24\", \"6a005100ac516351\", 2, 989643518, \"818a7ceaf963f52b5c48a7f01681ac6653c26b63a9f491856f090d9d60f2ffe3\"],\n\t[\"a1050f8604d0f9d2feefcdb5051ae0052f38e21bf39daf583fd0c3900faa3eab5d431c0bbe030000000653536a005151683d27e5c6e0da8f22125823f32d5d98477d8098ef36263b9694d61d4d85d3f2ac02b7570200000007000052005165abffffffff0cad981542bcb54a87d9400aa63e514c7c6fab7158c2b1fb37821ea755eb162a0200000000b94feb5100e5ef3bf8ed8d43356c8a8d5ac6c7e80d7ff6040f4f0aa19abbe783f4f461240200000007636500000052655686fd70042be3ad02000000000465ab636a15680b000000000004acac53511277c705000000000452635252d27a0102000000000000000000\", \"6a6aacab65655251\", 1, -982144648, \"dfcf484111801989eb6df8dc2bafb944d7365ffeb36a575a08f3270d3ef24c9f\"],\n\t[\"cef7316804c3e77fe67fc6207a1ea6ae6eb06b3bf1b3a4010a45ae5c7ad677bb8a4ebd16d90200000009ac536a5152ac5263005301ab8a0da2b3e0654d31a30264f9356ba1851c820a403be2948d35cafc7f9fe67a06960300000006526a63636a53ffffffffbada0d85465199fa4232c6e4222df790470c5b7afd54704595a48eedd7a4916b030000000865ab63ac006a006ab28dba4ad55e58b5375053f78b8cdf4879f723ea4068aed3dd4138766cb4d80aab0aff3d0300000003ac6a00ffffffff010f5dd6010000000006ab006aab51ab00000000\", \"\", 1, 889284257, \"d0f32a6db43378af84b063a6706d614e2d647031cf066997c48c04de3b493a94\"],\n\t[\"7b3ff28004ba3c7590ed6e36f45453ebb3f16636fe716acb2418bb2963df596a50ed954d2e03000000065251515265abffffffff706ee16e32e22179400c9841013971645dabf63a3a6d2d5feb42f83aa468983e030000000653ac51ac5152ffffffffa03a16e5e5de65dfa848b9a64ee8bf8656cc1f96b06a15d35bd5f3d32629876e020000000043c1a3965448b3b46f0f0689f1368f3b2981208a368ec5c30defb35595ef9cf95ffd10e902000000036aac65253a5bbe042e907204000000000800006565656352634203b4020000000002656336b3b7010000000001ab7a063f0100000000026500a233cb76\", \"006551636a53ac5251\", 1, -1144216171, \"68c7bd717b399b1ee33a6562a916825a2fed3019cdf4920418bb72ffd7403c8c\"],\n\t[\"d5c1b16f0248c60a3ddccf7ebd1b3f260360bbdf2230577d1c236891a1993725e262e1b6cb000000000363636affffffff0a32362cfe68d25b243a015fc9aa172ea9c6b087c9e231474bb01824fd6bd8bc0300000005ab52ab516affffffff0420d9a70200000000045152656a45765d0000000000055252536a5277bad100000000000252ab3f3f3803000000000463acac5200000000\", \"52636a52ab65\", 1, 1305123906, \"978dc178ecd03d403b048213d904653979d11c51730381c96c4208e3ea24243a\"],\n\t[\"1be8ee5604a9937ebecffc832155d9ba7860d0ca451eaced58ca3688945a31d93420c27c460100000006abac5300535288b65458af2f17cbbf7c5fbcdcfb334ffd84c1510d5500dc7d25a43c36679b702e850f7c0200000003005300ffffffff7c237281cb859653eb5bb0a66dbb7aeb2ac11d99ba9ed0f12c766a8ae2a2157203000000086aabac526365acabfffffffff09d3d6639849f442a6a52ad10a5d0e4cb1f4a6b22a98a8f442f60280c9e5be80200000007ab00ab6565ab52ffffffff0398fe83030000000005526aababacbdd6ec010000000005535252ab6a82c1e6040000000001652b71c40c\", \"6563526353656351\", 2, -853634888, \"0d936cceda2f56c7bb87d90a7b508f6208577014ff280910a710580357df25f3\"],\n\t[\"9e0f99c504fbca858c209c6d9371ddd78985be1ab52845db0720af9ae5e2664d352f5037d4010000000552ac53636affffffff0e0ce866bc3f5b0a49748f597c18fa47a2483b8a94cef1d7295d9a5d36d31ae7030000000663515263ac635bb5d1698325164cdd3f7f3f7831635a3588f26d47cc30bf0fefd56cd87dc4e84f162ab702000000036a6365ffffffff85c2b1a61de4bcbd1d5332d5f59f338dd5e8accbc466fd860f96eef1f54c28ec030000000165ffffffff04f5cabd010000000007000052ac526563c18f1502000000000465510051dc9157050000000008655363ac525253ac506bb600000000000865656a53ab63006a00000000\", \"006a6a0052\", 0, 1186324483, \"2f9b7348600336512686e7271c53015d1cb096ab1a5e0bce49acd35bceb42bc8\"],\n\t[\"11ce51f90164b4b54b9278f0337d95c50d16f6828fcb641df9c7a041a2b274aa70b1250f2b0000000008ab6a6a65006551524c9fe7f604af44be050000000005525365006521f79a0300000000015306bb4e04000000000265ac99611a05000000000765acab656500006dc866d0\", \"\", 0, -1710478768, \"cfa4b7573559b3b199478880c8013fa713ca81ca8754a3fd68a6d7ee6147dc5a\"],\n\t[\"86bc233e02ba3c647e356558e7252481a7769491fb46e883dd547a4ce9898fc9a1ca1b77790000000006ab5351abab51f0c1d09c37696d5c7c257788f5dff5583f4700687bcb7d4acfb48521dc953659e325fa390300000003acac5280f29523027225af03000000000963abac0065ab65acab7e59d90400000000016549dac846\", \"53006aac52acac\", 0, 711159875, \"880330ccde00991503ea598a6dfd81135c6cda9d317820352781417f89134d85\"],\n\t[\"beac155d03a853bf18cd5c490bb2a245b3b2a501a3ce5967945b0bf388fec2ba9f04c03d68030000000012fe96283aec4d3aafed8f888b0f1534bd903f9cd1af86a7e64006a2fa0d2d30711af770010000000163ffffffffd963a19d19a292104b9021c535d3e302925543fb3b5ed39fb2124ee23a9db00302000000056500ac63acffffffff01ad67f503000000000300ac5189f78db2\", \"53536a636500\", 2, 748992863, \"bde3dd0575164d7ece3b5783ce0783ffddb7df98f178fe6468683230314f285a\"],\n\t[\"81dab34a039c9e225ba8ef421ec8e0e9d46b5172e892058a9ade579fe0eb239f7d9c97d45b0300000009ac65655351ab526363ffffffff10c0faaf7f597fc8b00bbc67c3fd4c6b70ca6b22718d15946bf6b032e62dae570000000005536a00ab6a02cddec3acf985bbe62c96fccf17012a87026ed63fc6756fa39e286eb4c2dd79b59d37400300000002516affffffff04f18b8d03000000000753abab5152636564411c02000000000400ab6300e965750300000000001bd2cf02000000000565ab526aab00000000\", \"006551ab\", 0, -1488174485, \"a3d65a8cd0c1eea8558d01396b929520a2221c29d9f25f29035b8abae874447f\"],\n\t[\"489ebbf10478e260ba88c0168bd7509a651b36aaee983e400c7063da39c93bf28100011f280100000004abab63ab2fc856f05f59b257a4445253e0d91b6dffe32302d520ac8e7f6f2467f7f6b4b65f2f59e903000000096353abacab6351656affffffff0122d9480db6c45a2c6fd68b7bc57246edffbf6330c39ccd36aa3aa45ec108fc030000000265ab9a7e78a69aadd6b030b12602dff0739bbc346b466c7c0129b34f50ae1f61e634e11e9f3d0000000006516a53525100ffffffff011271070000000000086563ab6353536352c4dd0e2c\", \"\", 0, -293358504, \"4eba3055bc2b58765593ec6e11775cea4b6493d8f785e28d01e2d5470ea71575\"],\n\t[\"6911195d04f449e8eade3bc49fd09b6fb4b7b7ec86529918b8593a9f6c34c2f2d301ec378b000000000263ab49162266af054643505b572c24ff6f8e4c920e601b23b3c42095881857d00caf56b28acd030000000565525200ac3ac4d24cb59ee8cfec0950312dcdcc14d1b360ab343e834004a5628d629642422f3c5acc02000000035100accf99b663e3c74787aba1272129a34130668a877cc6516bfb7574af9fa6d07f9b4197303400000000085351ab5152635252ffffffff042b3c95000000000000ff92330200000000046a5252ab884a2402000000000853530065520063000d78be03000000000953abab52ab53ac65aba72cb34b\", \"6a\", 2, -637739405, \"6b80d74eb0e7ee59d14f06f30ba7d72a48d3a8ff2d68d3b99e770dec23e9284f\"],\n\t[\"746347cf03faa548f4c0b9d2bd96504d2e780292730f690bf0475b188493fb67ca58dcca4f0000000002005336e3521bfb94c254058e852a32fc4cf50d99f9cc7215f7c632b251922104f638aa0b9d080100000008656aac5351635251ffffffff4da22a678bb5bb3ad1a29f97f6f7e5b5de11bb80bcf2f7bb96b67b9f1ac44d09030000000365ababffffffff036f02b30000000000076353ab6aac63ac50b72a050000000002acaba8abf804000000000663006a6a6353797eb999\", \"acac5100\", 1, -1484493812, \"164c32a263f357e385bd744619b91c3f9e3ce6c256d6a827d6defcbdff38fa75\"],\n\t[\"e17149010239dd33f847bf1f57896db60e955117d8cf013e7553fae6baa9acd3d0f1412ad90200000006516500516500cb7b32a8a67d58dddfb6ceb5897e75ef1c1ff812d8cd73875856487826dec4a4e2d2422a0100000004ac525365196dbb69039229270400000000070000535351636a8b7596020000000006ab51ac52655131e99d040000000003516551ee437f5c\", \"ac656a53\", 1, 1102662601, \"8858bb47a042243f369f27d9ab4a9cd6216adeac1c1ac413ed0890e46f23d3f3\"],\n\t[\"144971940223597a2d1dec49c7d4ec557e4f4bd207428618bafa3c96c411752d494249e1fb0100000004526a5151ffffffff340a545b1080d4f7e2225ff1c9831f283a7d4ca4d3d0a29d12e07d86d6826f7f0200000003006553ffffffff03c36965000000000000dfa9af00000000000451636aac7f7d140300000000016300000000\", \"\", 1, -108117779, \"c84fcaf9d779df736a26cc3cabd04d0e61150d4d5472dd5358d6626e610be57f\"],\n\t[\"b11b6752044e650b9c4744fb9c930819227d2ac4040d8c91a133080e090b042a142e93906e0000000003650053ffffffff6b9ce7e29550d3c1676b702e5e1537567354b002c8b7bb3d3535e63ad03b50ea01000000055100516300fffffffffcf7b252fea3ad5a108af3640a9bc2cd724a7a3ce22a760fba95496e88e2f2e801000000036a00ac7c58df5efba193d33d9549547f6ca839f93e14fa0e111f780c28c60cc938f785b363941b000000000863ab51516552ac5265e51fcd0308e9830400000000036a00abab72190300000000016a63d0710000000000050051ab6a6300000000\", \"53005165ac51ab65\", 0, 229563932, \"e562579d1a2b10d1c5e45c06513456002a6bec157d7eb42511d30b118103c052\"],\n\t[\"2aee6b9a02172a8288e02fac654520c9dd9ab93cf514d73163701f4788b4caeeb9297d2e250300000004ab6363008fb36695528d7482710ea2926412f877a3b20acae31e9d3091406bfa6b62ebf9d9d2a6470100000009535165536a63520065ffffffff03f7b560050000000003acab6a9a8338050000000000206ce90000000000056552516a5100000000\", \"5252\", 1, -1102319963, \"fa4676c374ae3a417124b4c970d1ed3319dc3ac91fb36efca1aa9ed981a8aa1b\"],\n\t[\"9554595203ad5d687f34474685425c1919e3d2cd05cf2dac89d5f33cd3963e5bb43f8706480100000000ffffffff9de2539c2fe3000d59afbd376cb46cefa8bd01dbc43938ff6089b63d68acdc2b02000000096553655251536a6500fffffffff9695e4016cd4dfeb5f7dadf00968e6a409ef048f81922cec231efed4ac78f5d010000000763abab6a5365006caaf0070162cc640200000000045163ab5100000000\", \"\", 0, -1105256289, \"e8e10ed162b1a43bfd23bd06b74a6c2f138b8dc1ab094ffb2fa11d5b22869bee\"],\n\t[\"04f51f2a0484cba53d63de1cb0efdcb222999cdf2dd9d19b3542a896ca96e23a643dfc45f00200000007acac53510063002b091fd0bfc0cfb386edf7b9e694f1927d7a3cf4e1d2ce937c1e01610313729ef6419ae7030000000165a3372a913c59b8b3da458335dc1714805c0db98992fd0d93f16a7f28c55dc747fe66a5b503000000095351ab65ab52536351ffffffff5650b318b3e236802a4e41ed9bc0a19c32b7aa3f9b2cda1178f84499963a0cde000000000165ffffffff0383954f04000000000553ac536363a8fc90030000000000a2e315000000000005acab00ab5100000000\", \"0053\", 2, -1424653648, \"a5bc0356f56b2b41a2314ec05bee7b91ef57f1074bcd2efc4da442222269d1a3\"],\n\t[\"5e4fab42024a27f0544fe11abc781f46596f75086730be9d16ce948b04cc36f86db7ad50fd01000000026a00613330f4916285b5305cc2d3de6f0293946aa6362fc087727e5203e558c676b314ef8dd401000000001af590d202ba496f040000000001009e3c9604000000000351ac51943d64d3\", \"51acabab5100ab52\", 1, -129301207, \"556c3f90aa81f9b4df5b92a23399fe6432cf8fecf7bba66fd8fdb0246440036c\"],\n\t[\"a115284704b88b45a5f060af429a3a8eab10b26b7c15ed421258f5320fa22f4882817d6c2b0300000003005300ffffffff4162f4d738e973e5d26991452769b2e1be4b2b5b7e8cbeab79b9cf9df2882c040000000006636aac63ac5194abc8aa22f8ddc8a7ab102a58e39671683d1891799d19bd1308d24ea6d365e571172f1e030000000700515352515153ffffffff4da7ad75ce6d8541acbb0226e9818a1784e9c97c54b7d1ff82f791df1c6578f60000000000ffffffff01b1f265040000000009ab0051ac656a516a5300000000\", \"51abab6352535265\", 0, -1269106800, \"0ef7b6e87c782fa33fe109aab157a2d9cddc4472864f629510a1c92fa1fe7fc1\"],\n\t[\"f3f771ae02939752bfe309d6c652c0d271b7cab14107e98032f269d92b2a8c8853ab057da8010000000563ab6a6365670c305c38f458e30a7c0ab45ee9abd9a8dc03bae1860f965ffced879cb2e5d0bb156821020000000153ffffffff025dc619050000000002ac51ec0d250100000000076a5200636a6363333aecd8\", \"650053ac515100ab\", 1, 1812404608, \"a7aa34bf8a5644f03c6dd8801f9b15ba2e07e07256dbf1e02dad59f0d3e17ea9\"],\n\t[\"fd3e267203ae7d6d3975e738ca84f12540229bb237dd228d5f688e9d5ba53fce4302b0334d01000000026353ffffffff602a3ab75af7aa951d93093e345ef0037a2863f3f580a9b1a575fffe68e677450300000000239e476d1e8f81e8b6313880d8a49b27c1b00af467f29756e76f675f084a5676539636ab030000000765ab6351acac52d9217747044d773204000000000752ac51526353acc33e45050000000005516500005115d889040000000004ab5163510cbbbd0200000000016500000000\", \"65ac526aac6a53ab52\", 2, -886179388, \"bc46f3f83058ddf5bebd9e1f2c117a673847c4dc5e31cfb24bac91adf30877cf\"],\n\t[\"f380ae23033646af5dfc186f6599098015139e961919aea28502ea2d69474413d94a555ea2000000000853635265abacac5314da394b99b07733341ddba9e86022637be3b76492992fb0f58f23c915098979250a96620300000003ab6300ffffffff4bb6d1c0a0d84eac7f770d3ad0fdc5369ae42a21bbe4c06e0b5060d5990776220300000000ffffffff0486fd70020000000007ac6500635252acf3fd72010000000005656a6a6551212de90500000000096365006a63635153000fa33100000000000600535151656300000000\", \"ab52\", 2, -740890152, \"f804fc4d81f039009ed1f2cccb5c91da797543f235ac71b214c20e763a6d86d7\"],\n\t[\"5c45d09801bb4d8e7679d857b86b97697472d514f8b76d862460e7421e8617b15a2df217c6010000000863acacab6565006affffffff01156dbc03000000000952ac63516551ac6aac00000000\", \"6aabac\", 0, 1310125891, \"270445ab77258ced2e5e22a6d0d8c36ac7c30fff9beefa4b3e981867b03fa0ad\"],\n\t[\"4ecc6bde030ca0f83c0ed3d4b777f94c0c88708c6c933fe1df6874f296d425cac95355c23d0000000006ac6a51536a52f286a0969d6170e20f2a8000193807f5bc556770e9d82341ef8e17b0035eace89c76edd50200000007ac65525100656affffffff5bade6e462fac1927f078d69d3a981f5b4c1e59311a38efcb9a910aa436afaa80000000007ac6a006352ab52ffffffff0331e58902000000000763ac53636352abb8b3ca000000000001637a1d26040000000009535263ac6a5352ab655ae34a39\", \"6a65ab\", 2, 2142728517, \"4a3415eb1677ae4e0c939644a4cfd5dc6299780b55cd0dc735967057b6b1526a\"],\n\t[\"a59484b501eb50114be0fc79e72ab9bc9f4a5f7acdf274a56d6b68684eb68cf8b07ec5d1c2000000000765abab00ab00639e09aa940141e3530200000000046500ac6500000000\", \"00516565ab\", 0, -1561622405, \"d60bbadd2cc0674100baa08d0e0493ee4248f0304b3eb778da942041f503a896\"],\n\t[\"53dc1a88046531c7b57a35f4d9adf101d068bf8d63fbbedaf4741dba8bc5e92c8725def571030000000453655251fcdf116a226b3ec240739c4c7493800e4edfe67275234e371a227721eac43d3d9ecaf1b50300000003ac0052ffffffff2c9279ffeea4718d167e9499bd067600715c14484e373ef93ae4a31d2f5671ab0000000009516553ac636a6a65001977752eeba95a8f16b88c571a459c2f2a204e23d48cc7090e4f4cc35846ca7fc0a455ce00000000055165ac0063188143f80205972902000000000765ac63ac516353c7b6a50000000000036a510000000000\", \"655351536a\", 0, 103806788, \"b276584d3514e5b4e058167c41dc02915b9d97f6795936a51f40e894ed8508bc\"],\n\t[\"53f8959f01ddb36afdcd20167edcbb75a63d18654fdcf10bc0004c761ab450fe236d79cb2702000000065151650063653435003a033a5e34050000000009ac52516a630000516ab86db3030000000002006344ac090500000000046363ab00f3644537\", \"5263abab63ac656353\", 0, -218513553, \"f1f2a489682e42a6fc20025dfc89584d17f150b2d7ae3ddedd2bf43d5e24f37f\"],\n\t[\"5a06cb4602dcfc85f49b8d14513f33c48f67146f2ee44959bbca092788e6823b2719f3160b0200000001ab3c013f2518035b9ea635f9a1c74ec1a3fb7496a160f46aae2e09bfc5cd5111a0f20969e003000000015158c89ab7049f20d6010000000008ac6a52abac53515349765e00000000000300ab638292630100000000045351ab0086da09010000000006656a6365525300000000\", \"526a63\", 1, 1502936586, \"bdfaff8a4e775379c5dc26e024968efa805f923de53fa8272dd53ec582afa0c5\"],\n\t[\"ca9d84fa0129011e1bf27d7cb71819650b59fb292b053d625c6f02b0339249b498ff7fd4b601000000025352ffffffff032173a0040000000008525253abab5152639473bb030000000009005153526a53535151d085bd0000000000086a5365ab5165655300000000\", \"005152ac51\", 0, 580353445, \"c629d93b02037f40aa110e46d903edb34107f64806aa0c418d435926feef68b8\"],\n\t[\"e3cdbfb4014d90ae6a4401e85f7ac717adc2c035858bf6ff48979dd399d155bce1f150daea0300000002ac51a67a0d39017f6c71040000000005535200535200000000\", \"\", 0, -1899950911, \"c1c7df8206e661d593f6455db1d61a364a249407f88e99ecad05346e495b38d7\"],\n\t[\"b2b6b9ab0283d9d73eeae3d847f41439cd88279c166aa805e44f8243adeb3b09e584efb1df00000000026300ffffffff7dfe653bd67ca094f8dab51007c6adaced09de2af745e175b9714ca1f5c68d050000000003ac6500aa8e596903fd3f3204000000000553ac6a6a533a2e210500000000075253acabab526392d0ee020000000008520065635200ab5200000000\", \"65acacac65005365\", 0, 28298553, \"39c2aaa2496212b3ab120ab7d7f37c5e852bfe38d20f5226413a2268663eeae8\"],\n\t[\"f30c5c3d01a6edb9e10fafaf7e85db14e7fec558b9dca4a80b05d7c3a2944d282c5018f4680200000003005263ffffffff04aac3530300000000026551bc2419010000000009005163acab6a5100658e7085050000000000c5e4ec050000000007656a6a635365ab2d8e8882\", \"abac53ab005251ac52\", 0, -490287546, \"877e347ec7487497769e2581142276d1a8d813b652e4483cf9cc993d16354417\"],\n\t[\"4314339e01de40faabcb1b970245a7f19eedbc17c507dac86cf986c2973715035cf95736ae0200000007abababababab65bde67b900151510b04000000000853ac00655200535300000000\", \"52\", 0, 399070095, \"47585dc25469d04ff3a60939d0a03779e3e81a411bf0ca18b91bb925ebd30718\"],\n\t[\"2d4cf4e9031b3e175b2ff18cd933151379d9cfac4713d8bd0e63b70bd4a92277aa7af901ab000000000565515353abffffffff557666c7f3be9cdecdad44c3df206eb63a2da4ed1f159d21193882a9f0340081020000000963ab53ab5252ac63abffffffff8a8c897bdb87e93886aad5ded9d82a13101d5476554386373646ca5e23612e450300000009006a526552abab6a635ac03fc00198bb02040000000009525100526a6563636a1d052834\", \"ab52ac00acac6a\", 0, -1469882480, \"09ed6563a454814ab7e3b4c28d56d8751162b77df1825b37ba66c6147750b2a3\"],\n\t[\"f063171b03e1830fdc1d685a30a377537363ccafdc68b42bf2e3acb908dac61ee24b37595c020000000765ac5100ab6aacf447bc8e037b89d6cadd62d960cc442d5ced901d188867b5122b42a862929ce45e7b628d010000000253aba009a1ba42b00f1490b0b857052820976c675f335491cda838fb7934d5eea0257684a2a202000000001e83cf2401a7f777030000000008ab6553526a53526a00000000\", \"\", 2, 1984790332, \"c19caada8e71535e29a86fa29cfd9b74a0c7412003fc722a121005e461e01636\"],\n\t[\"cf7bdc250249e22cbe23baf6b648328d31773ea0e771b3b76a48b4748d7fbd390e88a004d30000000003ac536a4ab8cce0e097136c90b2037f231b7fde2063017facd40ed4e5896da7ad00e9c71dd70ae600000000096a0063516352525365ffffffff01b71e3e00000000000300536a00000000\", \"\", 1, 546970113, \"6a815ba155270af102322c882f26d22da11c5330a751f520807936b320b9af5d\"],\n\t[\"ac7a125a0269d35f5dbdab9948c48674616e7507413cd10e1acebeaf85b369cd8c88301b7c030000000963656aac6a530053abffffffffed94c39a582e1a46ce4c6bffda2ccdb16cda485f3a0d94b06206066da12aecfe010000000752abab63536363ef71dcfb02ee07fa0400000000016a6908c802000000000751656a6551abac688c2c2d\", \"6a6351526551\", 0, 858400684, \"552ff97d7924f51cda6d1b94be53483153ef725cc0a3a107adbef220c753f9a6\"],\n\t[\"3a1f454a03a4591e46cf1f7605a3a130b631bf4dfd81bd2443dc4fac1e0a224e74112884fe0000000005516aac6a53a87e78b55548601ffc941f91d75eab263aa79cd498c88c37fdf275a64feff89fc1710efe03000000016a39d7ef6f2a52c00378b4f8f8301853b61c54792c0f1c4e2cd18a08cb97a7668caa008d970200000002656affffffff017642b20100000000096a63535253abac6a6528271998\", \"51\", 2, 1459585400, \"e9a7f21fc2d38be7be47095fbc8f1bf8923660aa4d71df6d797ae0ba5ca4d5b0\"],\n\t[\"f59366cc0114c2a18e6bd1347ed9470f2522284e9e835dd5c5f7ef243639ebea95d9b232b6020000000153474b62eb045c00170500000000096352ab516352ab5200038a520400000000086aab5253656a63005b968904000000000963536353ac0053635387106002000000000000000000\", \"ab52526300ab51\", 0, 1834116153, \"cdf51f6e3a9dc2be5a59ea4c00f5aac1e1426a5202c325e6cf2567d07d8d8de4\"],\n\t[\"6269e0fa0173e76e89657ca495913f1b86af5b8f1c1586bcd6c960aede9bc759718dfd5044000000000352ac530e2c7bd90219849b000000000007ab00ab6a53006319f281000000000007ab00515165ac5200000000\", \"6a\", 0, -2039568300, \"62094f98234a05bf1b9c7078c5275ed085656856fb5bdfd1b48090e86b53dd85\"],\n\t[\"eb2bc00604815b9ced1c604960d54beea4a3a74b5c0035d4a8b6bfec5d0c9108f143c0e99a0000000000ffffffff22645b6e8da5f11d90e5130fd0a0df8cf79829b2647957471d881c2372c527d8010000000263acffffffff1179dbaf17404109f706ae27ad7ba61e860346f63f0c81cb235d2b05d14f2c1003000000025300264cb23aaffdc4d6fa8ec0bb94eff3a2e50a83418a8e9473a16aaa4ef8b855625ed77ef40100000003ac51acf8414ad404dd328901000000000652526500006ab6261c000000000002526a72a4c9020000000006ac526500656586d2e7000000000006656aac00ac5279cd8908\", \"51\", 1, -399279379, \"d37532e7b2b8e7db5c7c534197600397ebcc15a750e3af07a3e2d2e4f84b024f\"],\n\t[\"dc9fe6a8038b84209bbdae5d848e8c040433237f415437592907aa798bf30d9dbbddf0ff85010000000153ffffffff23269a7ea29fcf788db483b8d4c4b35669e582608644259e950ce152b0fa6e050000000003acababffffffff65de94857897ae9ea3aa0b938ba6e5adf374d48469922d2b36dbb83d3b8c8261010000000452ac5200ffffffff02856e9b0300000000026a51980c8e02000000000365ab63d2648db4\", \"00ab0051ac526565\", 2, 1562581941, \"5cef9d8e18a2d5a70448f17b465d411a19dab78f0ddf1672ffd518b188f52433\"],\n\t[\"eba8b0de04ac276293c272d0d3636e81400b1aaa60db5f11561480592f99e6f6fa13ad387002000000070053acab536563bebb23d66fd17d98271b182019864a90e60a54f5a615e40b643a54f8408fa8512cfac927030000000963ac6a6aabac65ababffffffff890a72192bc01255058314f376bab1dc72b5fea104c154a15d6faee75dfa5dba020000000100592b3559b0085387ac7575c05b29b1f35d9a2c26a0c27903cc0f43e7e6e37d5a60d8305a030000000252abffffffff0126518f05000000000000000000\", \"005300635252635351\", 1, 664344756, \"26dc2cba4bd5334e5c0b3a520b44cc1640c6b923d10e576062f1197171724097\"],\n\t[\"91bd040802c92f6fe97411b159df2cd60fb9571764b001f31657f2d616964637605875c2a901000000055263006a65ffffffff3651df372645f50cf4e32fdf6e61c766e912e16335db2b40c5d52fe89eefe7cd00000000040065ab65ffffffff03ca8625030000000009ab51ac63530052ab52c6bf14020000000006ab00ab52005167d270000000000007ab53525351636a00000000\", \"5151ab63005252ac\", 1, 1983087664, \"3e5aa0200248d8d86ede3b315ca1b857018b89184a4bd023bd88ab12e499f6e1\"],\n\t[\"185cda1a01ecf7a8a8c28466725b60431545fc7a3367ab68e34d486e8ea85ee3128e0d8384000000000465ac63abec88b7bb031c56eb04000000000965636a51005252006a7c78d5040000000007acac63abac51ac3024a40500000000086300526a51abac51464c0e8c\", \"0065535265515352\", 0, 1594558917, \"b5280b9610c0625a65b36a8c2402a95019a7bbb9dd3de77f7c3cb1d82c3263ba\"],\n\t[\"a9531f07034091668b65fea8b1a79700d586ac9e2f42ca0455a26abe41f9e1805d009a0f5702000000096365516365ac5263ab3619bac643a9e28ee47855118cf80c3a74531cdf198835d206d0fe41804e325a4f9f105e03000000016a58e3ab0d46375d98994daf0fa7c600d2bb4669e726fca0e3a3f21ea0d9e777396740328f0100000008636a5363ab526a538d3ea7700304cb66030000000007515163ab52ab510184030500000000085353636565ac0051d9cff402000000000751ab52ab5352abf0e36254\", \"ab5353ac5365acab\", 2, 1633101834, \"04c9ef72f33668ca449c0415becf62cc0b8e0c75f9c8813852d42a58acf107c8\"],\n\t[\"6b5ecc7903fe0ba37ea551df92a59e12bad0a3065846ba69179a8f4a741a2b4fcf679aac810200000004535263529a3d343293b99ab425e7ef8529549d84f480bcd92472bab972ea380a302128ae14dfcd0200000000025163ffffffff24636e4545cab9bf87009119b7fc3ec4d5ee9e206b90f35d1df8a563b6cd097a010000000852abac53005153abc64467860406e832020000000009526300006a53ac6352ac1395010000000002ac53b117f300000000000863655351acab00651edf02030000000008ab51ac6353535252628ef71d\", \"ab63ab6a52ac526563\", 2, -1559697626, \"8f07ece7d65e509f1e0780584ef8d271c1c61a13b10335d5faafc7afc8b5b8ec\"],\n\t[\"92c9fb780138abc472e589d5b59489303f234acc838ca66ffcdf0164517a8679bb622a4267020000000153468e373d04de03fa020000000009ac006a5265ab5163006af649050000000007515153006a00658ceb59030000000001ac36afa0020000000009ab53006351ab51000000000000\", \"6a\", 0, 2059357502, \"e2358dfb51831ee81d7b0bc602a65287d6cd2dbfacf55106e2bf597e22a4b573\"],\n\t[\"6f62138301436f33a00b84a26a0457ccbfc0f82403288b9cbae39986b34357cb2ff9b889b302000000045253655335a7ff6701bac9960400000000086552ab656352635200000000\", \"6aac51\", 0, 1444414211, \"502a2435fd02898d2ff3ab08a3c19078414b32ec9b73d64a944834efc9dae10c\"],\n\t[\"9981143a040a88c2484ac3abe053849e72d04862120f424f373753161997dd40505dcb4783030000000700536365536565a2e10da3f4b1c1ad049d97b33f0ae0ea48c5d7c30cc8810e144ad93be97789706a5ead180100000003636a00ffffffffbdcbac84c4bcc87f03d0ad83fbe13b369d7e42ddb3aecf40870a37e814ad8bb5010000000963536a5100636a53abffffffff883609905a80e34202101544f69b58a0b4576fb7391e12a769f890eef90ffb72020000000651656352526affffffff04243660000000000004ab5352534a9ce001000000000863656363ab6a53652df19d030000000003ac65acedc51700000000000000000000\", \"ac6300acac\", 2, 293672388, \"7ba99b289c04718a7283f150d831175ed6303081e191a0608ea81f78926c5bdf\"],\n\t[\"a2bb630b01989bc5d643f2da4fb9b55c0cdf846ba06d1dbe372893024dbbe5b9b8a1900af802000000055265ac63aca7a68d2f04916c74010000000003abac007077f0040000000001007d4127010000000005ac516aac000f31e8030000000000571079c9\", \"65ab0051ac\", 0, -1103627693, \"92d53b4390262e6b288e8a32e0cfc36cd5adfdfabfe96c7bfd4a19d65e233761\"],\n\t[\"49f7d0b6037bba276e910ad3cd74966c7b3bc197ffbcfefd6108d6587006947e97789835ea0300000008526a52006a650053ffffffff8d7b6c07cd10f4c4010eac7946f61aff7fb5f3920bdf3467e939e58a1d4100ab03000000076aac63ac535351ffffffff8f48c3ba2d52ad67fbcdc90d8778f3c8a3894e3c35b9730562d7176b81af23c80100000003ab5265ffffffff0301e3ef0300000000046a525353e899ac0500000000075153ab6a65abac259bea0400000000007b739972\", \"53516aacac6aac\", 1, 955403557, \"5d366a7f4346ae18aeb7c9fc4dab5af71173184aa20ed22fcb4ea8511ad25449\"],\n\t[\"58a4fed801fbd8d92db9dfcb2e26b6ff10b120204243fee954d7dcb3b4b9b53380e7bb8fb60100000003006351ffffffff02a0795b050000000006536351ac6aac2718d00200000000075151acabac515354d21ba1\", \"005363515351\", 0, -1322430665, \"bbee941bbad950424bf40e3623457db47f60ed29deaa43c99dec702317cb3326\"],\n\t[\"32765a0b02e455793d9ce530e9f6a44bcbc612e893a875b5da61d822dc56d8245166c398b403000000085353abac6300006a6bdee2a78d0d0b6a5ea666eed70b9bfea99d1d612ba3878f615c4da10d4a521cba27155002000000035363abffffffff043cd42401000000000551656a53653685320100000000030000511881bc0500000000065165abab636a20169f010000000007acab656aac63acdb0706a8\", \"65ac53ab53\", 0, 1936499176, \"5c5a9c3a5de7dc7a82bc171c9d3505913b8bcc450bc8b2d11772c1a1d781210b\"],\n\t[\"17fad0d303da0d764fedf9f2887a91ea625331b28704940f41e39adf3903d8e75683ef6d46020000000151ffffffffff376eea4e880bcf0f03d33999104aafed2b3daf4907950bb06496af6b51720a020000000900636a63525253525196521684f3b08497bad2c660b00b43a6a517edc58217876eb5e478aa3b5fda0f29ee1bea00000000046aacab6affffffff03dde8e2050000000007ac5365ac51516a14772e000000000005630000abacbbb360010000000006ab5251ab656a50f180f0\", \"0053\", 0, -1043701251, \"a3bdf8771c8990971bff9b4e7d59b7829b067ed0b8d3ac1ec203429811384668\"],\n\t[\"236c32850300045e292c84ede2b9ab5733ba08315a2bb09ab234c4b4e8894808edbdac0d3b020000000653635363abacffffffffd3f696bb31fdd18a72f3fc2bb9ae54b416a253fc37c1a0f0180b52d35bad49440100000004650053abffffffffa85c75a2406d82a93b12e555b66641c1896a4e83ae41ef1038218311e38ace060200000006abab006a51ac104b5e6701e2842c04000000000800630051ac0000ab00000000\", \"ab63ac6a516a\", 1, -1709887524, \"8c29ea8ef60c5a927fccdba8ea385db6b6b84d98e891db45f5d4ee3148d3f5a7\"],\n\t[\"b78d5fd601345f3100af494cdf447e7d4076179f940035b0ebe8962587d4d0c9c6c9fc34ee0300000003516a6affffffff03dc5c890100000000085353ac53ac6a52534ac941040000000007ac63656a51ab51d4266b0100000000036aacac70731f2d\", \"005351ab0053\", 0, -1789071265, \"d5f1c1cb35956a5711d67bfb4cedbc67e77c089b912d688ad440ff735adb390d\"],\n\t[\"5a2257df03554550b774e677f348939b37f8e765a212e566ce6b60b4ea8fed4c9504b7f7d1000000000653655265ab5258b67bb931df15b041177cf9599b0604160b79e30f3d7a594e7826bae2c29700f6d8f8f40300000005515300ac6a159cf8808a41f504eb5c2e0e8a9279f3801a5b5d7bc6a70515fbf1c5edc875bb4c9ffac500000000050063510052ffffffff0422a90105000000000965006a650000516a006417d2020000000006526363ab00524d969d0100000000035153acc4f077040000000005ac5200636500000000\", \"6a52\", 1, -1482463464, \"37b794b05d0687c9b93d5917ab068f6b2f0e38406ff04e7154d104fc1fb14cdc\"],\n\t[\"e0032ad601269154b3fa72d3888a3151da0aed32fb2e1a15b3ae7bee57c3ddcffff76a1321010000000100110d93ae03f5bd080100000000075263516a6551002871e60100000000046a005252eaa753040000000004ab6aab526e325c71\", \"630052\", 0, -1857873018, \"ea117348e94de86381bb8ad1c7f93b8c623f0272104341701bb54e6cb433596c\"],\n\t[\"014b2a5304d46764817aca180dca50f5ab25f2e0d5749f21bb74a2f8bf6b8b7b3fa8189cb7030000000965ac5165ab6a51ac6360ecd91e8abc7e700a4c36c1a708a494c94bb20cbe695c408543146566ab22be43beae9103000000045163ab00ffffffffffa48066012829629a9ec06ccd4905a05df0e2b745b966f6a269c9c8e13451fc00000000026565ffffffffc40ccadc21e65fe8a4b1e072f4994738ccaf4881ae6fede2a2844d7da4d199ab02000000065152ab536aabffffffff01b6e054030000000004515352ab3e063432\", \"\", 0, 1056459916, \"a7aff48f3b8aeb7a4bfe2e6017c80a84168487a69b69e46681e0d0d8e63a84b6\"],\n\t[\"c4ef04c103c5dde65410fced19bf6a569549ecf01ceb0db4867db11f2a3a3eef0320c9e8e001000000085100536a53516aabffffffff2a0354fa5bd96f1e28835ffe30f52e19bd7d5150c687d255021a6bec03cf4cfd03000000056a006300514900c5b01d3d4ae1b97370ff1155b9dd0510e198d266c356d6168109c54c11b4c283dca00300000002ababffffffff02e19e3003000000000451655351fa5c0003000000000163ef1fc64b\", \"51636a51ab630065\", 1, -1754709177, \"0a281172d306b6a32e166e6fb2a2cc52c505c5d60ea448e9ba7029aa0a2211e1\"],\n\t[\"29083fe00398bd2bb76ceb178f22c51b49b5c029336a51357442ed1bac35b67e1ae6fdf13100000000066a6500acab51ffffffffe4ca45c9dc84fd2c9c47c7281575c2ba4bf33b0b45c7eca8a2a483f9e3ebe4b3010000000200abffffffffdf47ad2b8c263fafb1e3908158b18146357c3a6e0832f718cd464518a219d18303000000096352ac656351ac0052daddfb3b0231c36f00000000000400526a5275c7e0020000000001ab00000000\", \"acab536aac52\", 2, 300802386, \"82ebc07b16cff0077e9c1a279373185b3494e39d08fd3194aae6a4a019377509\"],\n\t[\"1201ab5d04f89f07c0077abd009762e59db4bb0d86048383ba9e1dad2c9c2ad96ef660e6d00200000007ab6a65ac5200652466fa5143ab13d55886b6cdc3d0f226f47ec1c3020c1c6e32602cd3428aceab544ef43e00000000086a6a6a526a6a5263ffffffffd5be0b0be13ab75001243749c839d779716f46687e2e9978bd6c9e2fe457ee48020000000365abab1e1bac0f72005cf638f71a3df2e3bbc0fa35bf00f32d9c7dc9c39a5e8909f7d53170c8ae0200000008ab6a51516363516affffffff02f0a6210500000000036300ac867356010000000009acab65ac6353536a659356d367\", \"ac53535252\", 0, 917543338, \"418acc156c2bc76a5d7baa58db29f1b4cf6c266c9222ed167ef5b4d47f0e0f41\"],\n\t[\"344fa11e01c19c4dd232c77742f0dd0aeb3695f18f76da627628741d0ee362b0ea1fb3a2180200000007635151005100529bab25af01937c1f0500000000055153ab53656e7630af\", \"6351005163ac51\", 0, -629732125, \"228ca52a0a376fe0527a61cfa8da6d7baf87486bba92d49dfd3899cac8a1034f\"],\n\t[\"b2fda1950191358a2b855f5626a0ebc830ab625bea7480f09f9cd3b388102e35c0f303124c030000000565ac65ab53ffffffff03f9c5ec04000000000765ab51516551650e2b9f0500000000045365525284e8f6040000000001ac00000000\", \"ac51655253\", 0, 1433027632, \"d2fa7e13c34cecda5105156bd2424c9b84ee0a07162642b0706f83243ff811a8\"],\n\t[\"a4a6bbd201aa5d882957ac94f2c74d4747ae32d69fdc765add4acc2b68abd1bdb8ee333d6e0300000008516a6552515152abffffffff02c353cb040000000007ac6351ab51536588bd320500000000066552525253ac00000000\", \"\", 0, 1702060459, \"499da7d74032388f820645191ac3c8d20f9dba8e8ded7fa3a5401ea2942392a1\"],\n\t[\"584e8d6c035a6b2f9dac2791b980a485994bf38e876d9dda9b77ad156eee02fa39e19224a60300000003ab636529db326cc8686a339b79ab6b6e82794a18e0aabc19d9ad13f31dee9d7aad8eff38288588020000000452530052ffffffff09a41f07755c16cea1c7e193c765807d18cadddca6ec1c2ed7f5dcdca99e90e80000000001acffffffff01cba62305000000000451ac63acccdf1f67\", \"ab536a6363\", 2, -27393461, \"1125645b49202dca2df2d76dae51877387903a096a9d3f66b5ac80e042c95788\"],\n\t[\"83a583d204d926f2ee587a83dd526cf1e25a44bb668e45370798f91a2907d184f7cddcbbc7030000000700ab6565536a539f71d3776300dffdfa0cdd1c3784c9a1f773e34041ca400193612341a9c42df64e3f550e01000000050052515251ffffffff52dab2034ab0648553a1bb8fc4e924b2c89ed97c18dfc8a63e248b454035564b01000000015139ab54708c7d4d2c2886290f08a5221cf69592a810fd1979d7b63d35c271961e710424fd0300000005ac65ac5251ffffffff01168f7c030000000000a85e5fb0\", \"6a536353656a00\", 0, 179595345, \"5350a31ac954a0b49931239d0ecafbf34d035a537fd0c545816b8fdc355e9961\"],\n\t[\"ffd35d51042f290108fcb6ea49a560ba0a6560f9181da7453a55dfdbdfe672dc800b39e7320200000006630065516a65f2166db2e3827f44457e86dddfd27a8af3a19074e216348daa0204717d61825f198ec0030100000006ab51abab00abffffffffdf41807adb7dff7db9f14d95fd6dc4e65f8402c002d009a3f1ddedf6f4895fc8030000000500ab006a65a5a848345052f860620abd5fcd074195548ce3bd0839fa9ad8642ed80627bf43a0d47dbd010000000765ab006a656a53b38cdd6502a186da05000000000765ab00ab006a53527c0e0100000000085365ab51acacac52534bd1b1\", \"6a635253ac0000\", 0, 1095082149, \"3c05473a816621a3613f0e903faa1a1e44891dd40862b029e41fc520776350fa\"],\n\t[\"6c9a4b98013c8f1cae1b1df9f0f2de518d0c50206a0ab871603ac682155504c0e0ce946f460100000000ffffffff04e9266305000000000753535100ac6aacded39e04000000000365ac6ab93ccd010000000002515397bf3d050000000003ab636300000000\", \"63520052ac656353\", 0, -352633155, \"936eff8cdfd771be24124da87c7b24feb48da7cbc2c25fb5ba13d1a23255d902\"],\n\t[\"e01dc7f0021dc07928906b2946ca3e9ac95f14ad4026887101e2d722c26982c27dc2b59fdb0000000005ac5200516ab5a31ffadcbe74957a5a3f97d7f1475cc6423fc6dbc4f96471bd44c70cc736e7dec0d1ea020000000951636a526a52abac53ffffffff04bc2edd05000000000252ab528c7b02000000000952ac51526500525353324820040000000002005380c713000000000009630065ab00ac525252451bbb48\", \"53ab65ac\", 0, -552384418, \"69c0b30f4c630a6c878fde6ea6b74dae94f4eb3bcfbde2dc3649e1a9ada00757\"],\n\t[\"009046a1023f266d0113556d604931374d7932b4d6a7952d08fbd9c9b87cbd83f4f4c178b4030000000452ac526346e73b438c4516c60edd5488023131f07acb5f9ea1540b3e84de92f4e3c432289781ea4900000000046500655357dfd6da02baef910100000000026a007d101703000000000800516500abacac5100000000\", \"6aab6553ac\", 0, -802456605, \"f8757fbb4448ca34e0cd41b997685b37238d331e70316659a9cc9087d116169d\"],\n\t[\"df76ec0801a3fcf3d18862c5f686b878266dd5083f16cf655facab888b4cb3123b3ce5db7e01000000010010e7ac6a0233c83803000000000365ac51faf14a040000000004ac51655100000000\", \"6353acab\", 0, 15705861, \"e7d873aa079a19ec712b269a37d2670f60d8cb334c4f97e2e3fd10eeb8ee5f5e\"],\n\t[\"828fd3e0031084051ccef9cfdd97fae4d9cc50c0dae36bd22a3ff332881f17e9756c3e288e0200000004ab535363961a2ccccaf0218ec6a16ba0c1d8b5e93cfd025c95b6e72bc629ec0a3f47da7a4c396dad01000000025353ffffffff19ad28747fb32b4caf7b5dbd9b2da5a264bedb6c86d3a4805cd294ae53a86ac40200000009ab53535351ab6551abffffffff04a41650030000000005656aab6aab8331a304000000000700516365ac516a0d2a47010000000007abac516353abacdebc19040000000006ab5300636a6300000000\", \"51ab52ab53ac52\", 0, 1866105980, \"311094b4d73e31aefc77e97859ef07ca2f07a7b7e4d7def80c69d3f5d58527e5\"],\n\t[\"c4b80f850323022205b3e1582f1ed097911a81be593471a8dce93d5c3a7bded92ef6c7c1260100000002006affffffff70294d62f37c3da7c5eae5d67dce6e1b28fedd7316d03f4f48e1829f78a88ae801000000096a5200530000516351f6b7b544f7c39189d3a2106ca58ce4130605328ce7795204be592a90acd81bef517d6f170200000000ffffffff012ab8080000000000075100006365006335454c1e\", \"53ac6a536aacac\", 0, -1124103895, \"06277201504e6bf8b8c94136fad81b6e3dadacb9d4a2c21a8e10017bfa929e0e\"],\n\t[\"8ab69ed50351b47b6e04ac05e12320984a63801716739ed7a940b3429c9c9fed44d3398ad40300000006536a516a52638171ef3a46a2adb8025a4884b453889bc457d63499971307a7e834b0e76eec69c943038a0300000000ffffffff566bb96f94904ed8d43d9d44a4a6301073cef2c011bf5a12a89bedbaa03e4724030000000265acb606affd01edea38050000000008515252516aacac6300000000\", \"65000000006365ac53\", 0, -1338942849, \"7912573937824058103cb921a59a7f910a854bf2682f4116a393a2045045a8c3\"],\n\t[\"2484991e047f1cf3cfe38eab071f915fe86ebd45d111463b315217bf9481daf0e0d10902a402000000006e71a424eb1347ffa638363604c0d5eccbc90447ff371e000bf52fc743ec832851bb564a0100000001abffffffffef7d014fad3ae7927948edbbb3afe247c1bcbe7c4c8f5d6cf97c799696412612020000000851536a5353006a001dfee0d7a0dd46ada63b925709e141863f7338f34f7aebde85d39268ae21b77c3068c01d0000000008535151ab00636563ffffffff018478070200000000095200635365ac52ab5341b08cd3\", \"\", 3, 265623923, \"24cb420a53b4f8bb477f7cbb293caabfd2fc47cc400ce37dbbab07f92d3a9575\"],\n\t[\"54839ef9026f65db30fc9cfcb71f5f84d7bb3c48731ab9d63351a1b3c7bc1e7da22bbd508e0300000000442ad138f170e446d427d1f64040016032f36d8325c3b2f7a4078766bdd8fb106e52e8d20000000003656500ffffffff02219aa101000000000851ababac52ab00659646bd02000000000552acacabac24c394a5\", \"ac\", 0, 906807497, \"69264faadcd1a581f7000570a239a0a26b82f2ad40374c5b9c1f58730514de96\"],\n\t[\"5036d7080434eb4eef93efda86b9131b0b4c6a0c421e1e5feb099a28ff9dd8477728639f77030000000951516aab535152ab5391429be9cce85d9f3d358c5605cf8c3666f034af42740e94d495e28b9aaa1001ba0c87580300000008006552ab00ab006affffffffd838978e10c0c78f1cd0a0830d6815f38cdcc631408649c32a25170099669daa0000000002acab8984227e804ad268b5b367285edcdf102d382d027789250a2c0641892b480c21bf84e3fb0100000000b518041e023d8653010000000001004040fb0100000000080051ac5200636a6300000000\", \"52ac\", 0, 366357656, \"bd0e88829afa6bdc1e192bb8b2d9d14db69298a4d81d464cbd34df0302c634c6\"],\n\t[\"9ad5ccf503fa4facf6a27b538bc910cce83c118d6dfd82f3fb1b8ae364a1aff4dcefabd38f03000000096365655263ac655300807c48130c5937190a996105a69a8eba585e0bd32fadfc57d24029cbed6446d30ebc1f100100000004000053650f0ccfca1356768df7f9210cbf078a53c72e0712736d9a7a238e0115faac0ca383f219d0010000000600ab536552002799982b0221b8280000000000000c41320000000000086552ac6365636a6595f233a3\", \"6a5152\", 2, 553208588, \"f99c29a79f1d73d2a69c59abbb5798e987639e36d4c44125d8dc78a94ddcfb13\"],\n\t[\"669538a204047214ce058aed6a07ca5ad4866c821c41ac1642c7d63ed0054f84677077a84f030000000853abacab6a655353ffffffff70c2a071c115282924e3cb678b13800c1d29b6a028b3c989a598c491bc7c76c5030000000752ac52ac5163ac80420e8a6e43d39af0163271580df6b936237f15de998e9589ec39fe717553d415ac02a4030000000463635153184ad8a5a4e69a8969f71288c331aff3c2b7d1b677d2ebafad47234840454b624bf7ac1d03000000056a63abab63df38c24a02fbc63a040000000002ab535ec3dc050000000002536500000000\", \"635153\", 3, -190399351, \"9615541884dfb1feeb08073a6a6aa73ef694bc5076e52187fdf4138a369f94d9\"],\n\t[\"a7f139e502af5894be88158853b7cbea49ba08417fbbca876ca6614b5a41432be34499987b000000000765635165abac63ffffffff8b8d70e96c7f54eb70da0229b548ced438e1ca2ba5ddd648a027f72277ee1efc0100000001abffffffff044f2c4204000000000165e93f550100000000050000526a6a94550304000000000365536aadc21c0300000000016300000000\", \"6aacac6363ab5265ac\", 1, 2143189425, \"6e3f97955490d93d6a107c18d7fe402f1cada79993bb0ff0d096357261b3a724\"],\n\t[\"3b94438f0366f9f53579a9989b86a95d134256ce271da63ca7cd16f7dd5e4bffa17d35133f010000000100ffffffff1aaad0c721e06ec00d07e61a84fb6dc840b9a968002ce7e142f943f06fd143a10100000008535151ac51ab0053b68b8e9c672daf66041332163e04db3f6048534bd718e1940b3fc3811c4eef5b7a56888b01000000001d58e38c012e38e700000000000852ab53ac6365536a00000000\", \"ab655352\", 1, -935223304, \"b3b336de141d4f071313a2207b2a0c7cf54a070dd8d234a511b7f1d13e23b0c4\"],\n\t[\"e5dca8a20456de0a67e185fa6ea94085ceae478d2c15c73cb931a500db3a1b6735dd1649ec0200000005ab536aabab32d11bbdcb81361202681df06a6b824b12b5cb40bb1a672cf9af8f2a836e4d95b7839327030000000951005365ab65abacabb345085932939eef0c724adef8a57f9e1bf5813852d957c039b6a12d9c2f201ea520fb030000000009ac5352005165acac6a5efc6072f1a421dc7dc714fc6368f6d763a5d76d0278b95fc0503b9268ccfadb48213a2500000000026a53ffffffff039ee1c4020000000009ac5353ab6353535163184018000000000005655265526a9a4a8a050000000001ac00000000\", \"65ab53ab6a00ab6553\", 2, 1902561212, \"7928ae8e86c0b0cad1b2c120ea313087437974382ee6d46443ca5ac3f5878b88\"],\n\t[\"972128b904e7b673517e96e98d80c0c8ceceae76e2f5c126d63da77ffd7893fb53308bb2da0300000006ac6552ab52acffffffff4cac767c797d297c079a93d06dc8569f016b4bf7a7d79b605c526e1d36a40e2202000000095365ab636aac6a6a6a69928d2eddc836133a690cfb72ec2d3115bf50fb3b0d10708fa5d2ebb09b4810c426a1db01000000060052526300001e8e89585da7e77b2dd2e30625887f0660accdf29e53a614d23cf698e6fc8ab03310e87700000000076a520051acac6555231ddb0330ec2d03000000000200abfaf457040000000004ab6a6352bdc42400000000000153d6dd2f04\", \"\", 0, 209234698, \"4a92fec1eb03f5bd754ee9bfd70707dc4420cc13737374f4675f48529be518e4\"],\n\t[\"1fb4085b022c6cfb848f8af7ba3ba8d21bd23ffa9f0bfd181cb68bcaaf2074e66d4974a31602000000090000006a6a6500acab6c12c07d9f3dbd2d93295c3a49e3757119767097e7fd5371f7d1ba9ba32f1a67a5a426f00000000000ffffffff018fd2fc04000000000363ac5100000000\", \"65ab006a6aab526a\", 0, 1431502299, \"8b7dd0ff12ca0d8f4dbf9abf0abba00e897c2f6fd3b92c79f5f6a534e0b33b32\"],\n\t[\"5374f0c603d727f63006078bd6c3dce48bd5d0a4b6ea00a47e5832292d86af258ea0825c260000000009655353636352526a6af2221067297d42a9f8933dfe07f61a574048ff9d3a44a3535cd8eb7de79fb7c45b6f47320200000003ac006affffffff153d917c447d367e75693c5591e0abf4c94bbdd88a98ab8ad7f75bfe69a08c470200000005ac65516365ffffffff037b5b7b000000000001515dc4d904000000000004bb26010000000004536a6aac00000000\", \"516552516352ac\", 2, 328538756, \"8bb7a0129eaf4b8fc23e911c531b9b7637a21ab11a246352c6c053ff6e93fcb6\"],\n\t[\"c441132102cc82101b6f31c1025066ab089f28108c95f18fa67db179610247086350c163bd010000000651525263ab00ffffffff9b8d56b1f16746f075249b215bdb3516cbbe190fef6292c75b1ad8a8988897c3000000000751ab6553abab00ffffffff02f9078b000000000009ab0053ac51ac00ab51c0422105000000000651006563525200000000\", \"ac51\", 0, -197051790, \"55acd8293ed0be6792150a3d7ced6c5ccd153ca7daf09cee035c1b0dac92bb96\"],\n\t[\"ab82ad3b04545bd86b3bb937eb1af304d3ef1a6d1343ed809b4346cafb79b7297c09e1648202000000086351ac5200535353ffffffff95d32795bbaaf5977a81c2128a9ec0b3c7551b9b1c3d952876fcb423b2dfb9e80000000005515363acac47a7d050ec1a603627ce6cd606b3af314fa7964abcc579d92e19c7aba00cf6c3090d6d4601000000056a516551633e794768bfe39277ebc0db18b5afb5f0c8117dde9b4dfd5697e9027210eca76a9be20d63000000000700520063ab6aacffffffff01ec2ddc050000000008ac52ac65ac65ac5100000000\", \"536300abab\", 1, -2070209841, \"b362da5634f20be7267de78b545d81773d711b82fe9310f23cd0414a8280801d\"],\n\t[\"8bff9d170419fa6d556c65fa227a185fe066efc1decf8a1c490bc5cbb9f742d68da2ab7f320100000007ab000053525365a7a43a80ab9593b9e8b6130a7849603b14b5c9397a190008d89d362250c3a2257504eb810200000007acabacac00ab51ee141be418f003e75b127fd3883dbf4e8c3f6cd05ca4afcaac52edd25dd3027ae70a62a00000000008ac52526a5200536affffffffb8058f4e1d7f220a1d1fa17e96d81dfb9a304a2de4e004250c9a576963a586ae0300000005abacac5363b9bc856c039c01d804000000000951656aac53005365acb0724e00000000000565abab63acea7c7a0000000000036a00ac00000000\", \"6565\", 1, -1349282084, \"2b822737c2affeefae13451d7c9db22ff98e06490005aba57013f6b9bbc97250\"],\n\t[\"0e1633b4041c50f656e882a53fde964e7f0c853b0ada0964fc89ae124a2b7ffc5bc97ea6230100000006ac6aacacabacffffffff2e35f4dfcad2d53ea1c8ada8041d13ea6c65880860d96a14835b025f76b1fbd9000000000351515121270867ef6bf63a91adbaf790a43465c61a096acc5a776b8e5215d4e5cd1492e611f761000000000600ac6aab5265ffffffff63b5fc39bcac83ca80ac36124abafc5caee608f9f63a12479b68473bd4bae769000000000965ac52acac5263acabffffffff0163153e020000000008ab005165ab65515300000000\", \"6a6aac00\", 0, -968477862, \"20732d5073805419f275c53784e78db45e53332ee618a9fcf60a3417a6e2ca69\"],\n\t[\"2b052c24022369e956a8d318e38780ef73b487ba6a8f674a56bdb80a9a63634c6110fb5154010000000251acffffffff48fe138fb7fdaa014d67044bc05940f4127e70c113c6744fbd13f8d51d45143e01000000005710db3804e01aa9030000000008acac6a516a5152abfd55aa01000000000751ab510000ac636d6026010000000000b97da9000000000000fddf3b53\", \"006552\", 0, 595461670, \"685d67d84755906d67a007a7d4fa311519467b9bdc6a351913246a41e082a29f\"],\n\t[\"073bc856015245f03b2ea2da62ccedc44ecb99e4250c7042f596bcb23b294c9dc92cfceb6b02000000095163abab52abab636afe292fb303b7c3f001000000000352636af3c49502000000000400ac6a535851850100000000066aac6553ab6500000000\", \"ab6aab53006aab52\", 0, 247114317, \"123916c6485cf23bfea95654a8815fbf04ce4d21a3b7f862805c241472906658\"],\n\t[\"7888b71403f6d522e414d4ca2e12786247acf3e78f1918f6d727d081a79813d129ee8befce0100000009ab516a6353ab6365abffffffff4a882791bf6400fda7a8209fb2c83c6eef51831bdf0f5dacde648859090797ec030000000153ffffffffbb08957d59fa15303b681bad19ccf670d7d913697a2f4f51584bf85fcf91f1f30200000008526565ac52ac63acffffffff0227c0e8050000000001ac361dc801000000000800515165ab00ab0000000000\", \"656a\", 2, 1869281295, \"f43378a0b7822ad672773944884e866d7a46579ee34f9afc17b20afc1f6cf197\"],\n\t[\"cc4dda57047bd0ca6806243a6a4b108f7ced43d8042a1acaa28083c9160911cf47eab910c40200000007526a0000ab6a63e4154e581fcf52567836c9a455e8b41b162a78c85906ccc1c2b2b300b4c69caaaa2ba0230300000008ab5152ac5100ab65ffffffff69696b523ed4bd41ecd4d65b4af73c9cf77edf0e066138712a8e60a04614ea1c0300000004ab6a000016c9045c7df7836e05ac4b2e397e2dd72a5708f4a8bf6d2bc36adc5af3cacefcf074b8b403000000065352ac5252acffffffff01d7e380050000000000cf4e699a\", \"525163656351\", 1, -776533694, \"ff18c5bffd086e00917c2234f880034d24e7ea2d1e1933a28973d134ca9e35d2\"],\n\t[\"b7877f82019c832707a60cf14fba44cfa254d787501fdd676bd58c744f6e951dbba0b3b77f0200000009ac515263ac53525300a5a36e500148f89c0500000000085265ac6a6a65acab00000000\", \"6563\", 0, -1785108415, \"cb6e4322955af12eb29613c70e1a00ddbb559c887ba844df0bcdebed736dffbd\"],\n\t[\"aeb14046045a28cc59f244c2347134d3434faaf980961019a084f7547218785a2bd03916f3000000000165f852e6104304955bda5fa0b75826ee176211acc4a78209816bbb4419feff984377b2352200000000003a94a5032df1e0d60390715b4b188c330e4bb7b995f07cdef11ced9d17ee0f60bb7ffc8e0100000002516513e343a5c1dc1c80cd4561e9dddad22391a2dbf9c8d2b6048e519343ca1925a9c6f0800a020000000665516365ac513180144a0290db27000000000006ab655151ab5138b187010000000007ab5363abac516a9e5cd98a\", \"53ac\", 0, 478591320, \"e8d89a302ae626898d4775d103867a8d9e81f4fd387af07212adab99946311ef\"],\n\t[\"c9270fe004c7911b791a00999d108ce42f9f1b19ec59143f7b7b04a67400888808487bd59103000000066a0052ac6565b905e76687be2dd7723b22c5e8269bc0f2000a332a289cfc40bc0d617cfe3214a61a85a30300000007ac63ac00635251560871209f21eb0268f175b8b4a06edd0b04162a974cf8b5dada43e499a1f22380d35ede0300000000792213fc58b6342cc8100079f9f5f046fb89f2d92cf0a2cb6d07304d32d9da858757037c0000000008abab51636565516affffffff02c72a8b03000000000452acac530dfb9f05000000000096f94307\", \"5253ab536351\", 3, 543688436, \"0278adbcc476d135493ae9bdcd7b3c2002df17f2d81c17d631c50c73e546c264\"],\n\t[\"57a5a04c0278c8c8e243d2df4bb716f81d41ac41e2df153e7096f5682380c4f441888d9d260300000004ab63ab6afdbe4203525dff42a7b1e628fe22bccaa5edbb34d8ab02faff198e085580ea5fcdb0c61b0000000002ac6affffffff03375e6c05000000000663ab516a6a513cb6260400000000007ca328020000000006516a636a52ab94701cc7\", \"0053ac5152\", 0, -550925626, \"b7ca991ab2e20d0158168df2d3dd842a57ab4a3b67cca8f45b07c4b7d1d11126\"],\n\t[\"072b75a504ad2550c2e9a02614bc9b2a2f50b5b553af7b87c0ef07c64ddc8d8934c96d216401000000036aabaca1387242a5bcd21099b016ad6045bed7dce603472757d9822cc5f602caa4ae20414d378b02000000026a63e4ac816734acdc969538d6f70b8ab43a2589f55e0177a4dc471bdd0eb61d59f0f46f6bb801000000065351526aab52d9f2977be76a492c3a7617b7a16dc29a3b0a7618f328c2f7d4fd9bafe760dc427a5066ef000000000465635165ffffffff02c5793600000000000165296820050000000002ac6300000000\", \"53006a6aac0052ab\", 2, 66084636, \"437e89bb6f70fd2ed2feef33350b6f6483b891305e574da03e580b3efd81ae13\"],\n\t[\"7e27c42d0279c1a05eeb9b9faedcc9be0cab6303bde351a19e5cbb26dd0d594b9d74f40d2b020000000200518c8689a08a01e862d5c4dcb294a2331912ff11c13785be7dce3092f154a005624970f84e0200000000500cf5a601e74c1f0000000000076aab52636a6a5200000000\", \"6500006a5351\", 0, 449533391, \"535ba819d74770d4d613ee19369001576f98837e18e1777b8246238ff2381dd0\"],\n\t[\"11414de403d7f6c0135a9df01cb108c1359b8d4e105be50a3dcba5e6be595c8817217490b20000000003005263ffffffff0c6becb9c3ad301c8dcd92f5cbc07c8bed7973573806d1489316fc77a829da03030000000700005253535352ffffffff2346d74ff9e12e5111aa8779a2025981850d4bf788a48de72baa2e321e4bc9ca00000000056352acab63cc585b64045e0385050000000009ab5253ab516aacac00efa9cf0300000000065200635151acbe80330400000000070063635100ab000be159050000000007525300655300ac00000000\", \"51656a0051ab\", 0, 683137826, \"d4737f3b58f3e5081b35f36f91acde89dda00a6a09d447e516b523e7a99264d5\"],\n\t[\"1c6b5f29033fc139338658237a42456123727c8430019ca25bd71c6168a9e35a2bf54538d80100000008536aac52ac6a6a52ffffffff3fb36be74036ff0c940a0247c451d923c65f826793d0ac2bb3f01ecbec8033290100000007ab000051ab6363ffffffff5d9eca0cf711685105bd060bf7a67321eaef95367acffab36ce8dedddd632ee2000000000652ac6a63ac517167319e032d26de040000000003516363dc38fb010000000000b37b00000000000006ab520051ac534baba51f\", \"636300ababac6563\", 0, -2049129935, \"3282a2ec6b8c87c9303e6060c17b421687db1bd35fbfa0345b48f2490e15b6cc\"],\n\t[\"978b9dad0214cfc7ce392d74d9dcc507350dc34007d72e4125861c63071ebf2cc0a6fd4856020000000651ac6a6aab52ffffffff47f20734e3370e733f87a6edab95a7a268ae44db7a8974e255614836b22938720200000008635265ac51516553ffffffff0137b2560100000000035252ac2f3363e9\", \"006aab6352\", 1, 2014249801, \"55611a5fb1483bce4c14c33ed15198130e788b72cd8929b2ceef4dd68b1806bf\"],\n\t[\"442f1c8703ab39876153c241ab3d69f432ba6db4732bea5002be45c8ca10c3a2356fe0e9590300000001accb2b679cab7c58a660cb6d4b3452c21cd7251a1b77a52c300f655f5baeb6fa27ff5b79880300000003005252e5ccf55712bc8ed6179f6726f8a78f3018a7a0391594b7e286ef5ee99efdcde302a102cc0200000009006352526351536a63ffffffff04443f63030000000006536a63ab63651405fb020000000009ac535351525300ab6a9f172b000000000004ab535263ad5c50050000000008656a65ab630000ac00000000\", \"65636aab006552\", 2, 2125838294, \"b3ff10f21e71ebc8b25fe058c4074c42f08617e0dcc03f9e75d20539d3242644\"],\n\t[\"2b3470dd028083910117f86614cdcfb459ee56d876572510be4df24c72e8f58c70d5f5948b03000000066aab65635265da2c3aac9d42c9baafd4b655c2f3efc181784d8cba5418e053482132ee798408ba43ccf90300000000ffffffff047dda4703000000000765516a52ac53009384a603000000000651636a63ab6a8cf57a03000000000352ab6a8cf6a405000000000952636a6a6565525100661e09cb\", \"ac520063ac6a6a52\", 1, 1405647183, \"9b360c3310d55c845ef537125662b9fe56840c72136891274e9fedfef56f9bb5\"],\n\t[\"d74282b501be95d3c19a5d9da3d49c8a88a7049c573f3788f2c42fc6fa594f59715560b9b00000000009655353525265ac52ac9772121f028f8303030000000003510065af5f47040000000007ac516a6551630000000000\", \"acab53006363ac\", 0, -1113209770, \"2f482b97178f17286f693796a756f4d7bd2dfcdbecd4142528eec1c7a3e5101a\"],\n\t[\"3a5644a9010f199f253f858d65782d3caec0ac64c3262b56893022b9796086275c9d4d097b02000000009d168f7603a67b30050000000007ac51536a0053acd9d88a050000000007655363535263ab3cf1f403000000000352ac6a00000000\", \"005363536565acac6a\", 0, -1383947195, \"6390ab0963cf611e0cea35a71dc958b494b084e6fd71d22217fdc5524787ade6\"],\n\t[\"67b3cc43049d13007485a8133b90d94648bcf30e83ba174f5486ab42c9107c69c5530c5e1f0000000003005100ffffffff9870ebb65c14263282ea8d41e4f4f40df16b565c2cf86f1d22a9494cad03a67f01000000016a5a121bee5e359da548e808ae1ad6dfccae7c67cbb8898d811638a1f455a671e822f228ef030000000151c1fcc9f9825f27c0dde27ea709da62a80a2ff9f6b1b86a5874c50d6c37d39ae31fb6c8a0030000000163553b8786020ca74a00000000000665635153ab5275c0760000000000020052e659b05d\", \"636aab6a6a\", 0, -342795451, \"f77c3322c97b1681c17b1eba461fa27b07e04c1534e8aaf735a49cab72c7c2e2\"],\n\t[\"bda1ff6804a3c228b7a12799a4c20917301dd501c67847d35da497533a606701ad31bf9d5e0300000001ac16a6c5d03cf516cd7364e4cbbf5aeccd62f8fd03cb6675883a0636a7daeb650423cb1291010000000500656553ac4a63c30b6a835606909c9efbae1b2597e9db020c5ecfc0642da6dc583fba4e84167539a8020000000865525353515200acffffffff990807720a5803c305b7da08a9f24b92abe343c42ac9e917a84e1f335aad785d00000000026a52ffffffff04981f20030000000001ab8c762200000000000253ab690b9605000000000151ce88b301000000000753526a6a51006500000000\", \"000052ac52530000\", 1, -1809193140, \"5299b0fb7fc16f40a5d6b337e71fcd1eb04d2600aefd22c06fe9c71fe0b0ba54\"],\n\t[\"2ead28ff0243b3ab285e5d1067f0ec8724224402b21b9cef9be962a8b0d153d401be99bbee0000000004ac635153ffffffff6985987b7c1360c9fa8406dd6e0a61141709f0d5195f946da55ed83be4e3895301000000020053ffffffff016503d20500000000085251ac6a65656a6a00000000\", \"51abab\", 1, 1723793403, \"67483ee62516be17a2431a163e96fd88a08ff2ce8634a52e42c1bc04e30f3f8a\"],\n\t[\"db4904e6026b6dd8d898f278c6428a176410d1ffbde75a4fa37cda12263108ccd4ca6137440100000007656a0000515263ffffffff1db7d5005c1c40da0ed17b74cf6b2a6ee2c33c9e0bacda76c0da2017dcac2fc70200000004abab6a53ffffffff0454cf2103000000000153463aef000000000009ab6a630065ab52636387e0ed050000000000e8d16f05000000000352ac63e4521b22\", \"\", 1, 1027042424, \"48315a95e49277ab6a2d561ee4626820b7bab919eea372b6bf4e9931ab221d04\"],\n\t[\"dca31ad10461ead74751e83d9a81dcee08db778d3d79ad9a6d079cfdb93919ac1b0b61871102000000086500525365ab51ac7f7e9aed78e1ef8d213d40a1c50145403d196019985c837ffe83836222fe3e5955e177e70100000006525152525300ffffffff5e98482883cc08a6fe946f674cca479822f0576a43bf4113de9cbf414ca628060100000006ac53516a5253ffffffff07490b0b898198ec16c23b75d606e14fa16aa3107ef9818594f72d5776805ec502000000036a0052ffffffff01932a2803000000000865ab6551ac6a516a2687aa06\", \"635300ac\", 2, -1880362326, \"74d6a2fa7866fd8b74b2e34693e2d6fd690410384b7afdcd6461b1ae71d265ce\"],\n\t[\"e14e1a9f0442ab44dfc5f6d945ad1ff8a376bc966aad5515421e96ddbe49e529614995cafc03000000055165515165fffffffff97582b8290e5a5cfeb2b0f018882dbe1b43f60b7f45e4dd21dbd3a8b0cfca3b0200000000daa267726fe075db282d694b9fee7d6216d17a8c1f00b2229085495c5dc5b260c8f8cd5d000000000363ac6affffffffaab083d22d0465471c896a438c6ac3abf4d383ae79420617a8e0ba8b9baa872b010000000963526563ac5363ababd948b5ce022113440200000000076a636552006a53229017040000000000e6f62ac8\", \"526353636a65\", 3, -485265025, \"1bc8ad76f9b7c366c5d052dc479d6a8a2015566d3a42e93ab12f727692c89d65\"],\n\t[\"720d4693025ca3d347360e219e9bc746ef8f7bc88e8795162e5e2f0b0fc99dc17116fc937100000000046353520045cb1fd79824a100d30b6946eab9b219daea2b0cdca6c86367c0c36af98f19ac64f3575002000000008a1c881003ed16f3050000000008536a63630000abac45e0e704000000000151f6551a05000000000963536565515363abab00000000\", \"6553ab6a6a510000ab\", 1, 1249091393, \"a575fa4f59a8e90cd07de012c78fe8f981183bb170b9c50fcc292b8c164cbc3b\"],\n\t[\"69df842a04c1410bfca10896467ce664cfa31c681a5dac10106b34d4b9d4d6d0dc1eac01c1000000000551536a5165269835ca4ad7268667b16d0a2df154ec81e304290d5ed69e0069b43f8c89e673328005e200000000076a5153006aacabffffffffc9314bd80b176488f3d634360fcba90c3a659e74a52e100ac91d3897072e3509010000000765abac51636363ffffffff0e0768b13f10f0fbd2fa3f68e4b4841809b3b5ba0e53987c3aaffcf09eee12bf0300000008ac535263526a53ac514f4c2402da8fab0400000000001ef15201000000000451526a52d0ec9aca\", \"525365ac52\", 1, 313967049, \"a72a760b361af41832d2c667c7488dc9702091918d11e344afc234a4aea3ec44\"],\n\t[\"adf2340d03af5c589cb5d28c06635ac07dd0757b884d4777ba85a6a7c410408ad5efa8b19001000000045100ab00ffffffff808dc0231c96e6667c04786865727013922bcb7db20739b686f0c17f5ba70e8f0300000000fd2332a654b580881a5e2bfec8313f5aa878ae94312f37441bf2d226e7fc953dcf0c77ab000000000163aa73dc580412f8c2050000000005636aacac63da02d502000000000153e74b52020000000001536b293d030000000009636552ababacab526500000000\", \"000052ab52ababab\", 0, -568651175, \"2c45d021db545df7167ac03c9ee56473f2398d9b2b739cf3ff3e074501d324f8\"],\n\t[\"e4fec9f10378a95199c1dd23c6228732c9de0d7997bf1c83918a5cfd36012476c0c3cba24002000000085165536500ac0000ad08ab93fb49d77d12a7ccdbb596bc5110876451b53a79fdce43104ff1c316ad63501de801000000046a6352ab76af9908463444aeecd32516a04dd5803e02680ed7f16307242a794024d93287595250f4000000000089807279041a82e603000000000200521429100200000000055253636a63f20b940400000000004049ed04000000000500ab5265ab43dfaf7d\", \"6563526aac\", 2, -1923470368, \"32f3c012eca9a823bebb9b282240aec40ca65df9f38da43b1dcfa0cac0c0df7e\"],\n\t[\"4000d3600100b7a3ff5b41ec8d6ccdc8b2775ad034765bad505192f05d1f55d2bc39d0cbe10100000007ab5165ac6a5163ffffffff034949150100000000026a6a92c9f6000000000008ab6553ab6aab635200e697040000000007636a5353525365237ae7d2\", \"52000063\", 0, -880046683, \"c76146f68f43037289aaeb2bacf47408cddc0fb326b350eb4f5ef6f0f8564793\"],\n\t[\"eabc0aa701fe489c0e4e6222d72b52f083166b49d63ad1410fb98caed027b6a71c02ab830c03000000075253ab63530065ffffffff01a5dc0b05000000000253533e820177\", \"\", 0, 954499283, \"1d849b92eedb9bf26bd4ced52ce9cb0595164295b0526842ab1096001fcd31b1\"],\n\t[\"d48d55d304aad0139783b44789a771539d052db565379f668def5084daba0dfd348f7dcf6b00000000006826f59e5ffba0dd0ccbac89c1e2d69a346531d7f995dea2ca6d7e6d9225d81aec257c6003000000096a655200ac656552acffffffffa188ffbd5365cae844c8e0dea6213c4d1b2407274ae287b769ab0bf293e049eb0300000005ac6a6aab51ad1c407c5b116ca8f65ed496b476183f85f072c5f8a0193a4273e2015b1cc288bf03e9e2030000000252abffffffff04076f44040000000006655353abab53be6500050000000003ac65ac3c15040500000000095100ab536353516a52ed3aba04000000000900ac53ab53636aabac00000000\", \"5253526563acac\", 2, -1506108646, \"bbee17c8582514744bab5df50012c94b0db4aff5984d2e13a8d09421674404e2\"],\n\t[\"9746f45b039bfe723258fdb6be77eb85917af808211eb9d43b15475ee0b01253d33fc3bfc502000000065163006a655312b12562dc9c54e11299210266428632a7d0ee31d04dfc7375dcad2da6e9c11947ced0e000000000009074095a5ac4df057554566dd04740c61490e1d3826000ad9d8f777a93373c8dddc4918a00000000025351ffffffff01287564030000000004636a00ab00000000\", \"52\", 2, -1380411075, \"84af1623366c4db68d81f452b86346832344734492b9c23fbb89015e516c60b2\"],\n\t[\"8731b64903d735ba16da64af537eaf487b57d73977f390baac57c7b567cb2770dfa2ef65870100000001635aedd990c42645482340eacb0bfa4a0a9e888057389c728b5b6a8691cdeb1a6a67b45e140200000008ac53526a52516551ffffffff45c4f567c47b8d999916fd49642cbc5d10d43c304b99e32d044d35091679cb860100000003006a51ffffffff0176d6c200000000000000000000\", \"ab6a65ab53\", 2, -1221546710, \"ccfdba36d9445f4451fb7cbf0752cc89c23d4fc6fff0f3930d20e116f9db0b95\"],\n\t[\"f5cfc52f016209ab1385e890c2865a74e93076595d1ca77cbe8fbf2022a2f2061a90fb0f3e010000000253acffffffff027de73f0200000000085252ac510052acac49cd6a020000000000e6c2cb56\", \"516552535300ab63\", 0, -1195302704, \"5532717402a2da01a1da912d824964024185ca7e8d4ad1748659dc393a14182b\"],\n\t[\"df0a32ae01c4672fd1abd0b2623aae0a1a8256028df57e532f9a472d1a9ceb194267b6ee190200000009536a6a51516a525251b545f9e803469a2302000000000465526500810631040000000000441f5b050000000006530051006aaceb183c76\", \"536a635252ac6a\", 0, 1601138113, \"9a0435996cc58bdba09643927fe48c1fc908d491a050abbef8daec87f323c58f\"],\n\t[\"d102d10c028b9c721abb259fe70bc68962f6cae384dabd77477c59cbeb1fb26266e091ba3e0100000002516affffffffe8d7305a74f43e30c772109849f4cd6fb867c7216e6d92e27605e69a0818899700000000026a65ecf82d58027db4620500000000026552c28ed3010000000001ab00000000\", \"0051ab515365\", 1, -131815460, \"1d1757a782cb5860302128bcbe9398243124a2f82d671a113f74f8e582c7a182\"],\n\t[\"cef930ed01c36fcb1d62ceef931bef57098f27a77a4299904cc0cbb44504802d535fb11557010000000153ffffffff02c8657403000000000863ac655253520063d593380400000000046aab536a00000000\", \"656a0051ab6365ab53\", 0, -351313308, \"e69dba3efb5c02af2ab1087d0a990678784671f4744d01ca097d71aec14dd8e9\"],\n\t[\"b1c0b71804dff30812b92eefb533ac77c4b9fdb9ab2f77120a76128d7da43ad70c20bbfb990200000002536392693e6001bc59411aebf15a3dc62a6566ec71a302141b0c730a3ecc8de5d76538b30f55010000000665535252ac514b740c6271fb9fe69fdf82bf98b459a7faa8a3b62f3af34943ad55df4881e0d93d3ce0ac0200000000c4158866eb9fb73da252102d1e64a3ce611b52e873533be43e6883137d0aaa0f63966f060000000001abffffffff04a605b604000000000851006a656a630052f49a0300000000000252515a94e1050000000009abac65ab0052abab00fd8dd002000000000651535163526a2566852d\", \"ac5363\", 0, -1718831517, \"b0dc030661783dd9939e4bf1a6dfcba809da2017e1b315a6312e5942d714cf05\"],\n\t[\"6a270ee404ebc8d137cfd4bb6b92aa3702213a3139a579c1fc6f56fbc7edd9574ef17b13f30100000009ab00ab656565ababacffffffffaa65b1ab6c6d87260d9e27a472edceb7dd212483e72d90f08857abf1dbfd46d10100000000fffffffff93c4c9c84c4dbbe8a912b99a2830cfe3401aebc919041de063d660e585fc9f002000000096aabacab52ac6a53acfa6dcef3f28355a8d98eee53839455445eeee83eecd2c854e784efa53cee699dbfecaebd0100000003ab6a51ffffffff04f7d71b050000000009ac6a536aac6a6365513c37650500000000065265abab6a53fa742002000000000039ed82030000000009516aac635165ab51ab2fdabd17\", \"ab535252526563\", 1, -1326210506, \"1dec0d5eb921bf5b2df39c8576e19c38d0c17254a4a0b78ac4b5422bcc426258\"],\n\t[\"3657e4260304ccdc19936e47bdf058d36167ee3d4eb145c52b224eff04c9eb5d1b4e434dfc0000000001ab58aefe57707c66328d3cceef2e6f56ab6b7465e587410c5f73555a513ace2b232793a74400000000036a006522e69d3a785b61ad41a635d59b3a06b2780a92173f85f8ed428491d0aaa436619baa9c4501000000046351abab2609629902eb7793050000000000a1b967040000000003525353a34d6192\", \"516a\", 0, -1761874713, \"0a2ff41f6d155d8d0e37cd9438f3b270df9f9214cda8e95c76d5a239ca189df2\"],\n\t[\"a0eb6dc402994e493c787b45d1f946d267b09c596c5edde043e620ce3d59e95b2b5b93d43002000000096a5252526aac63ab6555694287a279e29ee491c177a801cd685b8744a2eab83824255a3bcd08fc0e3ea13fb8820000000009abab6365ab52ab0063ffffffff029e424a040000000008acab53ab516a636a23830f0400000000016adf49c1f9\", \"ac0065ac6500005252\", 1, 669294500, \"e05e3d383631a7ed1b78210c13c2eb26564e5577db7ddfcea2583c7c014091d4\"],\n\t[\"6e67c0d3027701ef71082204c85ed63c700ef1400c65efb62ce3580d187fb348376a23e9710200000001655b91369d3155ba916a0bc6fe4f5d94cad461d899bb8aaac3699a755838bfc229d6828920010000000765536353526a52ffffffff04c0c792000000000005650052535372f79e000000000001527fc0ee010000000005ac5300ab65d1b3e902000000000251aba942b278\", \"6a5151\", 0, 1741407676, \"e657e2c8ec4ebc769ddd3198a83267b47d4f2a419fc737e813812acefad92ff7\"],\n\t[\"8f53639901f1d643e01fc631f632b7a16e831d846a0184cdcda289b8fa7767f0c292eb221a00000000046a53abacffffffff037a2daa01000000000553ac6a6a51eac349020000000005ac526552638421b3040000000007006a005100ac63048a1492\", \"ac65\", 0, 1033685559, \"da86c260d42a692358f46893d6f91563985d86eeb9ea9e21cd38c2d8ffcfcc4d\"],\n\t[\"491f99cb01bdfba1aa235e5538dac081fae9ce55f9622de483afe7e65105c2b0db75d360d200000000045251636340b60f0f041421330300000000096351ac000051636553ce2822040000000005516a00ac5180c8e40300000000025100caa8570400000000020000cfdc8da6\", \"6a5100516aab655365\", 0, -953727341, \"397c68803b7ce953666830b0221a5e2bcf897aa2ded8e36a6b76c497dcb1a2e1\"],\n\t[\"b3cad3a7041c2c17d90a2cd994f6c37307753fa3635e9ef05ab8b1ff121ca11239a0902e700300000009ab635300006aac5163ffffffffcec91722c7468156dce4664f3c783afef147f0e6f80739c83b5f09d5a09a57040200000004516a6552ffffffff969d1c6daf8ef53a70b7cdf1b4102fb3240055a8eaeaed2489617cd84cfd56cf020000000352ab53ffffffff46598b6579494a77b593681c33422a99559b9993d77ca2fa97833508b0c169f80200000009655300655365516351ffffffff04d7ddf800000000000853536a65ac6351ab09f3420300000000056aab65abac33589d04000000000952656a65655151acac944d6f0400000000006a8004ba\", \"005165\", 1, 1035865506, \"fe1dc9e8554deecf8f50c417c670b839cc9d650722ebaaf36572418756075d58\"],\n\t[\"e1cfd73b0125add9e9d699f5a45dca458355af175a7bd4486ebef28f1928d87864384d02df02000000036a0051ffffffff0357df030100000000036a5365777e2d04000000000763ab6a00005265f434a601000000000351655100000000\", \"ab53ab\", 0, -1936500914, \"950f4b4f72ccdf8a6a0f381265d6c8842fdb7e8b3df3e9742905f643b2432b69\"],\n\t[\"cf781855040a755f5ba85eef93837236b34a5d3daeb2dbbdcf58bb811828d806ed05754ab8010000000351ac53ffffffffda1e264727cf55c67f06ebcc56dfe7fa12ac2a994fecd0180ce09ee15c480f7d00000000096351516a51acac00ab53dd49ff9f334befd6d6f87f1a832cddfd826a90b78fd8cf19a52cb8287788af94e939d6020000000700525251ac526310d54a7e8900ed633f0f6f0841145aae7ee0cbbb1e2a0cae724ee4558dbabfdc58ba6855010000000552536a53abfd1b101102c51f910500000000096300656a525252656a300bee010000000009ac52005263635151abe19235c9\", \"53005365\", 2, 1422854188, \"d5981bd4467817c1330da72ddb8760d6c2556cd809264b2d85e6d274609fc3a3\"],\n\t[\"fea256ce01272d125e577c0a09570a71366898280dda279b021000db1325f27edda41a53460100000002ab53c752c21c013c2b3a01000000000000000000\", \"65\", 0, 1145543262, \"076b9f844f6ae429de228a2c337c704df1652c292b6c6494882190638dad9efd\"]\n]\n"
  },
  {
    "path": "txscript/data/taproot-ref/003af31dd0b5a50c2723531e8ca22ae8ca6e7089",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff2000000001c75619cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4900000000cff75994dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b07010000003c029216047236f3000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8784d7ee4b\", \"prevouts\": [\"ac7783000000000017a91408247b8d3db4e641d0be1ff23f14280256870a5187\", \"06404d000000000017a914b60a534933f6e50f3846e396b9868efc9e681f4187\", \"4408250000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"225c202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"b51b9ccaaea9fd42c652f402c720f9204800e00b2f8ae4766b7fcfa164231fc81d8a8900ca86e7a871b94e86ceded7cff43db52b7ae760520079a117b3a2a562\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/005e61a50014d33f7309097490534db3c0dc65fe",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708900000000676b3469dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2101000000e54ad34c04af0b30000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac6f000000\", \"prevouts\": [\"d015120000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"65ee200000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d14c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4595f1c75585029ef5fafe40c7b455be7b6317879deb123e683907f6588babc52172c8da9bdd43b70cbab8912ef1aa7926e5ad7e47a4f7b71ac936200cc947dd0f9b27230787fc79bd718ce7ac07558dd4f31dfc3ae0570acbd1df01407b1d4ec\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93657385cfb449c384dd2171856b934522ab5b17115bbddd9e3700a77caba093451595f1c75585029ef5fafe40c7b455be7b6317879deb123e683907f6588babc52172c8da9bdd43b70cbab8912ef1aa7926e5ad7e47a4f7b71ac936200cc947dd0f9b27230787fc79bd718ce7ac07558dd4f31dfc3ae0570acbd1df01407b1d4ec\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/007f313a1a53428b7fc9eaf54c5d51be20e10567",
    "content": "{\"tx\": \"52c12c3202bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7d0100000055114ebadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd000000000a78541e802e64d970000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df97972236898705010000\", \"prevouts\": [\"7bdf770000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bd21210000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_66\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2873c80a655850b5bd310a9138328c6fb8f178aecd4dcc016b1823c70f5f02815d8459ecfb1535ba7bf4d426415fa68706072eddc5d75fef76e4fda1f5471aa502\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0d0c8b2aca5e7e7a075e04f6084617cef72dd5f6b2783aba1f9c36cfda42550581d4ebde5a11d7298919cb5c9142b366abb51f60f87ea0e7bbec8cacb393de1466\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/00850c1cc564bd0dcbb02c3398f9fc8e0219a317",
    "content": "{\"tx\": \"1bbfd49402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd3010000009d9e899b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a701000000e3abf6f202e8b091000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487859f2c25\", \"prevouts\": [\"b31c5d00000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\", \"5ffc3600000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"417d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936571460ba76479f128232c1e7f3cb97430b20436d33add020c19a42e032587e00ebfb5abead622ee588f8a14df4b864e849bfb1ffa426a7f0fc441a7ea7f9f3e8819e00a9246c8c145cff8a91ff4546d478c6c8e3d7b4e3f7e61102a4388494af\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d0254c28ec270bdf41d4337856af66ad3dc8a43a5d3e633735369ec57cf2fec9da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e53f01d9cbc4ce44e53bf46e342c1ac713c14ac9ff1cc3e88a31c5570fba253bd819e00a9246c8c145cff8a91ff4546d478c6c8e3d7b4e3f7e61102a4388494af\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0089a0f18b0647cf2bfae0c93e9ae39b345d1611",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702601000000580e63a5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5101000000d93ed2df03842435000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac1f000000\", \"prevouts\": [\"d487110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"eaea250000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_13\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a563b69b91fd5fbe809f3b3a2b7353746f928a30dbfbc8f9ef9328112b7381a6d9b12f9857e1231a5c4b1f16b62d8893c252e110cfb4d46e597de5a8da01753301\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"80ad3c0a699a9ba01ad512740ee0bd865d10f471c737d33e38b443e3e4c72bc9a8df15660ab01897c052d8cf1ce2b7d78c5084b05ac163da8e251bfcd7e5990e13\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/00b6fe5a14ee4fb3bb65e0aa28e70cb57f0cd0b0",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4e01000000192acd32dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbd000000000851923c0387ee7a00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a632000000\", \"prevouts\": [\"a0f6280000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"d6ad540000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"4a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364758c64267c751cdb3a7d0ad4e97f82b7320c0de5dc96a77478bcc9a1aac62dfb1956d2c402f72d86d9128969f4c9ed8db93dfb826b4075483e7d557b0e234b512efaba1d06903f148d2465ca4e4c6639d336576fa6993c6ca48823372648a44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e696e0a39b8006d5c38246735bc900624bc412e796f8d634640137370e1472505749e2a390543356cdb3691ba8d54627dfb45f7f1132e94c1a4e909f84f1614c2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/00cd1f1ac746e81ae27bfe1e9a383975d0bba949",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4eb01000000db6b973760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706401000000f98306f1010fe10c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a648000000\", \"prevouts\": [\"3f4243000000000017a91448274ba0d73ec00ce63e7922c9d87a48fd0c670f87\", \"04e712000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2251202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"151ed1a80e83ef2261d0a7c9cf17ed67c9b014c7f910704afdb6093f8b026fb75e65866fd39c79345c43e8ad7b7e53a111c9dd225afc4285c89b88021c930daf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/00d07d91c86c11dbbd14f4edf55c1f496ffaf010",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1602000000be453d33dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4c000000008b83fd6a01858b58000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748705000000\", \"prevouts\": [\"e5325d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0268220000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_44\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5bfb6605b25e0f6ea070cfddf827a224bc97bcd06c1acfc9328820914bba2d40ff72c23c0a0ac77abd8935b0bdcfc2e6255fad23b88836e5bff973e3748ddfb901\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0b0f6c4a9358db9fd237d6fa5af7f7285f4a369c3840533a090b1f5a8b1af295dc7ac91983312a9135f919ca281fd49d2623c2d21edec613e3f28e455bd072f644\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/00dc037c98e799a31facfab68fce3187ad7a0f68",
    "content": "{\"tx\": \"e4ec8ca402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0801000000348e6ddadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b190100000032c930c80498cd6f00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8700000000\", \"prevouts\": [\"3514520000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"71481f00000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_9a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"475a10bbf8ea5fc324ca213076229310193f2c0dd1dccf1ddd0de8d7ddbbc4c079edce55ab860161adf2a15e2a9c25e0a9d6f720ca0a39fcb8cdb66791f51fbd83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0833d13eb5c92b0f6cce1e5f769d946aa53bcbca9c443ee94dc4c3499027323b06d0d7dd0f6c2b2fbb3a37c0e034e083ae7cdf86975eb2eba1078a7ade4558849a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/00e2723c3cce5d6fa2b7db987e5fbc1d75297650",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cde010000000845aabfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9300000000e34899db029dd8b10000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87a5030000\", \"prevouts\": [\"4f865d000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\", \"302c5600000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"0f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361f550d8843d52ee2b366c31e2565bf158a1473c8f129a11bc7b0dcff887ae948c29bd03bbcbebf503f24139d653052e63a9a9f3faf73bed4a74eee576514948d11491142a38ebb10a24e36aadbe0cf227dedfd0966bcf56b2aea8b33dc3fd67f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368a041bf56b75b4d6888b8caace1d183294aa04f1728740594947390d0dd0c8936f8d113c18817a044fae8525416b35b4656d6d7185568187de608cafb5211e2f68491001e36edf91058819766439c3f31bd198abbe3d2204f458ac7743e1d61ccf16a5e3db9e2b81c974405e52c4661efcc91a529144e47e78be5814d4a09901\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/00eb1a2b8aed4a406ee59371fa0a50e6679857c1",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a101000000803b90c8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b990100000075a93d6802b1c933000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc772010000\", \"prevouts\": [\"139c1100000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"5f092400000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f54c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082bdcbe75f074483e48d717af2cfa8ab1bbef1c35fc84f016c108dd10256d535ae10b3b87e8b9d8544644738d4851bae032b2bf37d3a4aa6541b936ff18c715610c711f738010c3c65afa09c620b919c88f85303c8a6c3749257da2d218fa6976b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52f5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e13fb7770917eb0311339f7797b42ae31badf39be5fac652227efb4e28a80f4e35f46b3ac3e0eb552c07a1c6336d6a3e2704f93e82a6d5b4a7907113e7cf17bb16c711f738010c3c65afa09c620b919c88f85303c8a6c3749257da2d218fa6976b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0108a92da87f766ee005ac0bb220f78b50d04101",
    "content": "{\"tx\": \"bbfdf13103dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba801000000044ebdc3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba3010000006ee87db8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0700000000b29ebcbf04633b6a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc791357b23\", \"prevouts\": [\"55991f0000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"bf142400000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\", \"5a22280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"e27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ddc5ef0753cfbbae9ae95a5d7a8057a0f244ed9534f11134802dcf3d6e001e11de3dcad145b88b360fb9f51ed5363f34910a171e61f360dd6bdf047d4a1b93cb212021a26ea5e00fb993aa3d0fc1bd1e431f365db69035b8e4625845fc9b697c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e0bc8e394a89b61e744ca0843579507fbd14c939f32cc2eb6ce7075b90210fcdaec7827d9bc9e4e8e39cc141cf7690ea6843d6b50eda1fc8d5571fb149b2aabab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/010cc78772e75503cf488b6267f5891e1495c962",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1d01000000a146999d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40b00000000f9d200c960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706c00000000e4a24ae5038de26200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79693145c58\", \"prevouts\": [\"a3d2230000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\", \"ba3a3200000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\", \"f60b0f00000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"9f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e7391eb2542a03443f1c351bcd0fdf78b6f5cd40e118bcfcda3d325918034371ee453f7f7ccbda5a0ba96115b963083e4b2e9e93a3abf82e4dae88dd7e6a6b566f3617d560800e971f99646d89bd2028caf0c6d02b6f505a11fcad3ec349c801\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d16427f90468029d5a6f19bd59ef88b2d31e42e78c5014d25692e36886ec4dd7da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e93df6a2e62376e6a3587300ef2d1a395dd90428413a52508272625b5a1a189adb591a16be56540de55d9fbfa115de937b3aca1e4dd0f5a93f17ebd2ebda95183\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/014aca010656e76077fe517e999ea589e88307d7",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c483010000004b90d992bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf690100000046acbee704b8599500000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487b8040000\", \"prevouts\": [\"a0413100000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"cd9e650000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e16b70d0ea7480f8ba050345bd8e4e7681bbd8db77ef27050d0a3831748599db67afcaf82673e7b509fa61dcb6f9390da3a7ce1e18401449d1277235bd9d9c04d9a72d00f85eae87f4cc31996f158484f267a3b4b9a04e006b9a1cff5c0be2781e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367f568ee3b696c54dce29559b372086a9ebba75be3e39bc103cd26c12b6b516bb29caa746058fefa69912501c9b6f792a531f2cb30638f1f343d3625f0a93b066f288028cdab461d62f9273620b97315e6e9af9458f777a616c1bade2d3f6a89e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/01686c55b9d9f3d0c2d9dc8c0911de32df21a864",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b990000000015e6e6d3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3c010000008991028ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6901000000414a92e6031b996c00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acd3000000\", \"prevouts\": [\"7bf1270000000000225f202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"1007280000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\", \"867e1e0000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4339b5a2bb43edb5ec6015e78422673e93a5f940eb73c4bbc50742946ab32e5eed427b14f6d879458116ab1efc635aea8826b9cc83bdff544ff6844fcdf7a496\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/016e25aa492396c1f2937c07dac87f3bce812041",
    "content": "{\"tx\": \"238858b702dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bca00000000c2cbecccdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce60000000068a68ee4039e927a000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acdf40ad44\", \"prevouts\": [\"b94a230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"97ef580000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_98\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9cf987916c9fc945259df0324a762cd2e10f8cd101b6a6731ab1a8454c54928099a075b1fe092c6ccf2d557f89cfc68ab6f2edf800e60adf72513c4d0fcea5b182\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ca2685331a6191a0114eeabe6ebde5470bce9115c812319aff0b13492676a85fbdda8915dfe9c0f7fd1042634f5acab35eae1255f45d79581ac08d887d49f1d198\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/017f425514c38506670a6136985cf2f693c1851b",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd100000000e6d2f9d0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1801000000ccd8cab80133f516000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487bf169b47\", \"prevouts\": [\"492721000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\", \"7355690000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4a3ea69b746c966c84daf122809976a6bce8b1d887b17a6e963c4c690b8a790e73a6c94bbfbe0c8d8162307ea587875a7b29cdfde589bfdf70042a40a3445f95ec19ec7aa48c905d8ed6637f3c17c0400a43c560e5c859444683190ee16fe2235\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5174c6ee35a9af327fa74c94c4ba87a09a7dd613a1ede58e30654f1c4a24a66737074cc5cf84a1d913e1f5647d3427cc0d6d469f0e5b86c78a49890e87126542fa0e1c61743bed8ba943c0dc40e80402f7423773c7111097ca9c5a140b1b3c94b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0181b63b032265ff6a54d3acaf33d2efc67028ca",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9d0100000067e4a0f360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701d0000000088944686bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9001000000dc741ab4037f16ee00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb3af1b32\", \"prevouts\": [\"de725e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c5840f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ebe5810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/branched_codesep/left\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"03020d3eaa8a72b1aa47728a04d43184a271547970e0ea8816d304ece0a04935f83be78ff4d36c71649a3d01c467534678e5554b87828c0df7b8553b79a0fd1381\", \"01\", \"4cfe26427fc7901b4262f3d916bc0dd8633c30e5af8ceea1dcacd253c102db78cd839b841955f61e94bf7285a2d0e43879ae3b488b8a01e39fb2cd2bafad8fa0106bbb3fade1a7f218e6696679e4d9a0064d7cfa56e38fbce9d589ae3f102c474c244515d6deda3c971875a105d875417da42bab76fa2a27b69ca61e195bbd59e9cd2768feb7ca6768e59331499fe3edd07b3541fad96c6dd5163816913f7c6f555b72f3810c341f5ef952f6cca9fcec7a4eedbd279af7c38d57c9fb075a83b87ca30e3f546f1d56461fddbec204d0d88a9eacf4b14d4a45fdd445f343e09b7eafa0d24b8c53bef7fbf18b28e1f65ddcba4f4f353831e32a3a7c6483034fcf747563ab207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667ab20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2068ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365cbbc2d3d740d8643b25368816a3e2bcc8f965749028964b311d1dfcdbc4a53b754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"50ac042ba05ad11f932cebeef8b239400bced5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c45c79578af8a27f61c2d67ef3a94395648362bde9177391f52f91fe074803e52cd63f6b917d076cea51d4d03ebc29ab73387d1e16560332c56db68c745725c382\", \"01\", \"4cfe26427fc7901b4262f3d916bc0dd8633c30e5af8ceea1dcacd253c102db78cd839b841955f61e94bf7285a2d0e43879ae3b488b8a01e39fb2cd2bafad8fa0106bbb3fade1a7f218e6696679e4d9a0064d7cfa56e38fbce9d589ae3f102c474c244515d6deda3c971875a105d875417da42bab76fa2a27b69ca61e195bbd59e9cd2768feb7ca6768e59331499fe3edd07b3541fad96c6dd5163816913f7c6f555b72f3810c341f5ef952f6cca9fcec7a4eedbd279af7c38d57c9fb075a83b87ca30e3f546f1d56461fddbec204d0d88a9eacf4b14d4a45fdd445f343e09b7eafa0d24b8c53bef7fbf18b28e1f65ddcba4f4f353831e32a3a7c6483034fcf747563ab207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667ab20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2068ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365cbbc2d3d740d8643b25368816a3e2bcc8f965749028964b311d1dfcdbc4a53b754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"50d10d0bd8e3f1cabc6112980cb297bc5c41ed353de56009a1391b18b49f72e57ea91e7772386659b2a4c3f11548cde49c39c8275d3e5e59aa74c00cf8002df9e4d1e0d017c5d08f6eea24e5e837fbc26ad1d9f018e16a6a200b04b73f8b977242e7867c772a6cdf6ecc62cc889f620f5961cb819733f362e9f3843051663078870142a2f60447911e62d53a997fcbadc873a10f2a62b9e03947d26fa0c80062a2402c593629a27df803fa5eb4420421dc7032cbfc83a2a885d2f9149c6d584890fbcc57d4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/018284c1e780a7aacea0d945603d5f06254c5cfe",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4001000000f6f17dea60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701902000000d12b24b1025b3564000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787911ee449\", \"prevouts\": [\"6b4456000000000017a914269f407e1403e9e55237bbaed7146c0fbc0fe6c987\", \"b6a71000000000002251201649567eb00a0fbdde29b894a99c9dfb586a4dcbbedf9e66ed23f8b13544bc3c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_1\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5ae1bb6d9c8227fbe6b4f51287715bd0ff67feca8c40c7f44c5caca4677c8833055e478a619d43466cfb90a3160e1d49cfdc3f8c47c1f376bbf11ef74df018bb\", \"57ae0c5d033c3b21f5ebbe4a9047ea95419ead2af2a6ab25dcd715c5310690bb7fda15f9857fcd552c25974bd2792de4cb0aa1b66902d14953b5d41a065662ffc394024c185878238d98e243889f2bb95d2381d0e48a334ac1c1ae39167ebfe8f7b8aca2d943e01b79a4dd2d6cad180b7a584ace48d190da3782d603dfed577899a8f93ffd4cb4dcc38169072001ef8b79cd9803ff44e6b3e9bfa9e69bebc8d4fc2278bb58bc6a8c9483c89451663773e061df8745b7f6bacd602dea\", \"750442c4413200636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e29b18e54b9e1140aa1e11582f537a5ad3999c59a23047ddb57b3ac70c6daa05e44613a52a3af8356590bcff88b520703b7800fd287a336b2c3b3df06aec1ba9093f9e168a9296464b0cb8d60d5ea228bedf288217508cefa0369dc5c09770c1a08ab1be49aaefe730fc3dc02c42930c0ef8d37e9882b09d910b42fee25cd5fcc0cf11274eb3c1f88f775243e4d6b7852ff5a273b2933877e6c1f7f93705c2aa981d0e7f742d746b7b35b8a606b51debac815e203fd3b195b7554ab4dd3e9960942c624b73feb775cec5155a8259c6a62089426b0a8276f3af6eb31eb7743e2916513b07703f9d17167c9a959fdcd0cae179c2a3beb8eef73f49d54b9a683df90beb45228ea759f56bf279a6490d7939871db834fb4f71e2aa134a1c515491012185bf093501bdd1ed26d6794459dbb074ec632f7aad5abd92cfa2d667f36fb90233ecf9ffa0f1acc87455a974903469689da98c448f59a9ac115d8a0a5e218cc5ddf73967c25d95b1a647dccb6326d59dd55f8c8bb43924508a446b4890ecb4b7105310775c9c23ab9453a8724b9db8f4ec3b9da541bc40cf7e139eb84e5d2fbb2342d4572e5d6890d142c455ebe5eb04d0452cec2b30553d1cf714e9a287b4373837d2f1b875554d0595a98820079f4b0810a322d17e2a11eeafa4b7c79f17560e63654d209cbb282493fdeb1f4fd223e4a735dc90e38c877737eb9ef3abe1000000000000000000000000000000000000000000000000000000000000000061c871e70c7d4119fcc7ed12b89136e223c6aeaedb3ee335a6c3ef523524be01f25f280d9de364a1f86f02d0f520b6ad08e77e2e7ae01f13d6ad0e760a943bb0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc61eebd30f27142c50fdbb2a7fc273ea1dba69879a36d68d4e9f1496b4d827338b6efad5c0e7d0410f01e02028258169b8d6d7aeeae7274b642867424d4b8d268a5848489679402225b8ca9ff91c8268b46b210266c603aa5d18faf745d4953e41819b819a4f7d67493609222558d2580faa86888b1068105b2577fc735b8b9bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7dcdb5fac8897ab4258bb5e4224576578d9ffef55b02135098c3cf86c079d2acffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdb403c85095c5b43a22db076a9577c2e678350dc158d7b91b84a0357cfb68a9b0000000000000000000000000000000000000000000000000000000000000000f29e2f89cf5449492c51956aea99da5af19562992d468947751936b5bccda618ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffab71f6c1d2a905b87ebb27f5fe751c43ab49e1570717c20682fbcb99025351aa00000000000000000000000000000000000000000000000000000000000000003d0ddfb5150cfc195901d331dd25bd3476a7af9b8b9e6c9e53d87a75da617b6effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92b8781761d78d0c2f5ba45ae8e15f96df6914fe95abd57a9c482f07edc7ce6097b7339ed5484fecc4dd609e9431b94a2f55e3cd239cfef1a13b364840ebde28ec7676f80ffb285e6042eb11f3c2e99c48fede5c1ce543f213a13c5e4d04aef40ddb431655269f3d4a88d1f6b6d97f6e62b3726cce6024f57f88488d94f7521180868c0cbf3aa76f710ce164d71916e53281f525d1fbdf049d02c0121eaf1562ede19158fed9dcd017254ea525197fd0f2dd3d737176d7b1c48a24e5e26c8c3500000000000000000000000000000000000000000000000000000000000000004782489e614f0f46202bb2e0be9435ee2cdca64edfb612d743543120b98c7fa500000000000000000000000000000000000000000000000000000000000000009a1c7798415af6cb071c401a749655078551865e4039d0835863429ae207b46af38b9a4f08346b5ed47e670ebd05a75aaa9a8faf04abb1f32afe720cd57ab205ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5ae1bb6d9c8227fbe6b4f51287715bd0ff67feca8c40c7f44c5caca4677c8833055e478a619d43466cfb90a3160e1d49cfdc3f8c47c1f376bbf11ef74df018bb\", \"72e820bf3407ba443a74c04332d7d8aa71f92299ebd2c8df3c9ff04a356e751a6a4ab8c8c911933a611da9814253d961bf871a77516840f16e6da31fdcb16382520d4fc3554da48c5915ce04dc75f739309344353bd2b8e0bb4978d849383d0eaa9b97e2edb9705e26b98025d9d7c818b4e746f75ed7c8ccbc28dbeb49ab055c9c5d2f73afe916079c96b35e817528562e84602864d870dd1f0b8bd03561335c3b485178b2a0c34cdf1d198e88764d9c19db4db948dc41bc74c510\", \"750442c4413200636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e29b18e54b9e1140aa1e11582f537a5ad3999c59a23047ddb57b3ac70c6daa05e44613a52a3af8356590bcff88b520703b7800fd287a336b2c3b3df06aec1ba9093f9e168a9296464b0cb8d60d5ea228bedf288217508cefa0369dc5c09770c1a08ab1be49aaefe730fc3dc02c42930c0ef8d37e9882b09d910b42fee25cd5fcc0cf11274eb3c1f88f775243e4d6b7852ff5a273b2933877e6c1f7f93705c2aa981d0e7f742d746b7b35b8a606b51debac815e203fd3b195b7554ab4dd3e9960942c624b73feb775cec5155a8259c6a62089426b0a8276f3af6eb31eb7743e2916513b07703f9d17167c9a959fdcd0cae179c2a3beb8eef73f49d54b9a683df90beb45228ea759f56bf279a6490d7939871db834fb4f71e2aa134a1c515491012185bf093501bdd1ed26d6794459dbb074ec632f7aad5abd92cfa2d667f36fb90233ecf9ffa0f1acc87455a974903469689da98c448f59a9ac115d8a0a5e218cc5ddf73967c25d95b1a647dccb6326d59dd55f8c8bb43924508a446b4890ecb4b7105310775c9c23ab9453a8724b9db8f4ec3b9da541bc40cf7e139eb84e5d2fbb2342d4572e5d6890d142c455ebe5eb04d0452cec2b30553d1cf714e9a287b4373837d2f1b875554d0595a98820079f4b0810a322d17e2a11eeafa4b7c79f17560e63654d209cbb282493fdeb1f4fd223e4a735dc90e38c877737eb9ef3abe1000000000000000000000000000000000000000000000000000000000000000061c871e70c7d4119fcc7ed12b89136e223c6aeaedb3ee335a6c3ef523524be01f25f280d9de364a1f86f02d0f520b6ad08e77e2e7ae01f13d6ad0e760a943bb0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc61eebd30f27142c50fdbb2a7fc273ea1dba69879a36d68d4e9f1496b4d827338b6efad5c0e7d0410f01e02028258169b8d6d7aeeae7274b642867424d4b8d268a5848489679402225b8ca9ff91c8268b46b210266c603aa5d18faf745d4953e41819b819a4f7d67493609222558d2580faa86888b1068105b2577fc735b8b9bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7dcdb5fac8897ab4258bb5e4224576578d9ffef55b02135098c3cf86c079d2acffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdb403c85095c5b43a22db076a9577c2e678350dc158d7b91b84a0357cfb68a9b0000000000000000000000000000000000000000000000000000000000000000f29e2f89cf5449492c51956aea99da5af19562992d468947751936b5bccda618ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffab71f6c1d2a905b87ebb27f5fe751c43ab49e1570717c20682fbcb99025351aa00000000000000000000000000000000000000000000000000000000000000003d0ddfb5150cfc195901d331dd25bd3476a7af9b8b9e6c9e53d87a75da617b6effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92b8781761d78d0c2f5ba45ae8e15f96df6914fe95abd57a9c482f07edc7ce6097b7339ed5484fecc4dd609e9431b94a2f55e3cd239cfef1a13b364840ebde28ec7676f80ffb285e6042eb11f3c2e99c48fede5c1ce543f213a13c5e4d04aef40ddb431655269f3d4a88d1f6b6d97f6e62b3726cce6024f57f88488d94f7521180868c0cbf3aa76f710ce164d71916e53281f525d1fbdf049d02c0121eaf1562ede19158fed9dcd017254ea525197fd0f2dd3d737176d7b1c48a24e5e26c8c3500000000000000000000000000000000000000000000000000000000000000004782489e614f0f46202bb2e0be9435ee2cdca64edfb612d743543120b98c7fa500000000000000000000000000000000000000000000000000000000000000009a1c7798415af6cb071c401a749655078551865e4039d0835863429ae207b46af38b9a4f08346b5ed47e670ebd05a75aaa9a8faf04abb1f32afe720cd57ab205ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/01ca217ccf1ea0e39003e90d0d3573454b370bd0",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700a02000000307a10d802eece0b000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df9797223689874f040000\", \"prevouts\": [\"83d00e000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"dbcb129ebf4f1e8201527e18f1d2be57cecffd27cf05ac2766de001634d77f1ab28efeeca801991ab3f57bba5e5dafbe42ccb0de07ef2a2a2e2e8180178b23f003\", \"508321106f9aff90ba27dc13d2ef81cc94ec2f8f1ea854ca3e0ce292ddcbf4d61e2320f8ce08a36e0b4d4037a452252b79ea015cca303607d8de1470da0b0507b6c9817fd30b6678079111ab7673f017f0cd07f5291141bb36d639d9bd932f1853f6dacc8a6f3f34a35d2cfb85ba80aea6b542981232e8c2ea969a99809e00fb4dfbbb46b84275821dfa0c46bef0f8542b045f39bfeec1dee1488dce01d411708e73d8566d2887099ec45ec09aaca37d1d4fc453492b958a8397e8668a88043529c055b0dc38b5bfa62c49\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"05aa27047b2f5b25aee0ab27c860c2847dfda7f80ba6b6335f03222edaf26fc88f38915a90f7c50376cb46722d3b6eeac031b52111e2b514ad898c559fa535b803\", \"507d1eae983c3f45190305daa1e0543f00973fd14afca63300647162eea1905d22eeb0656c87b86cc89edb03876003d2359b1a3a96780f610cec16e0cba0b5f21bfa17fa6fef53047de15ea66457bcb475ff3156ea9912c196e1ef411a389889f417652637e2cf7424b9d83ce7b5ec1636b52f50dcf4a77c2a4009445ca5037a2f88ef33699080afa1b0a0324539b3ce8d66014d844af632178356297de11e28af3b45021c445ab85c19b8a219d8ca81a28192929ed9066bd918a24a3159e968db76156238ac94a589d46a40bff32c6ce8b7b1cae6dec43530ed2daccc8b14142e84196bb4019c98be9b4c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/01cc26fa177761f2440d4f78790adfdcb27c9321",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f3000000008d771f89dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd500000000c1cefaf2042f856000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acf2b3e221\", \"prevouts\": [\"23500f0000000000225120a283e1ea0142d34d03fade4b28902cd262d82bab6ae3891658a9596d967dbc43\", \"c97753000000000017a914e014b0ed75ce4306970c9f63e88b08a5a7bb4d0f87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2358212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"05d85d20fc108d588ad29a582be7d3cb74c0b8f2f2ac241d5a1d6881c63326d6299dc8a12f3fba6e77ea7c4b4af004240d4160ea55c6b0cf9eef3588f712700e\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0224ee3efd6d6c2e6024db65267c008a3786f0b2",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2c00000000a3ce2e21dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1702000000adcbac73bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0b02000000deea024702e1a1c8000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ace21d5c2a\", \"prevouts\": [\"e96d23000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\", \"ffd225000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\", \"485c8200000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"cc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360f3116d13ffcf1555cb4ae301ccf73da17002937b6b410b37f9321c49918b540474a999e2826f1f27f01ebf91ad073bfebeca039a55919a1ef327838bd290026ec1da8cea892037e805a477afbb54b1f5ec380954f076c0bcd3c4e3d4797a8d6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f4a945d156e5e86160b430602b16befc6691bb081598fdd6a533cf4573a883d745716b950e27a233a501a90011450809f321d0f7541cd1975fe5718ce8e53406ec1da8cea892037e805a477afbb54b1f5ec380954f076c0bcd3c4e3d4797a8d6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0234f23ded5600eb13895b83e3d3208daa621654",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4020200000098371f3adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbc01000000059cb1e5044b7b7900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6f4010000\", \"prevouts\": [\"a15f32000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"55b04800000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09024f8005087f643e5e326d0fbdb76b9716a98de1150ee25e33b0a11f2f828a5a6ee42441089319f5f7a30f66ae6fe290d924631c0a560e4058cf4cc9365809804ec3203b232bcba98a3677a89bf235a32006a46bceec4815b6a9ad678feaabffc7593aabaaab9ee4166fa2b634131708ae1928fb89743f5cdcac27c76e4e7c1fa351ff9c686d0f9044f68a77f85149944b62dd18b89687aa0a4e52c7f4867097735cd0479406d25087d7cb32168f66fdfba982bbb5f84d89e0e32821a5a30d8df65275b11e1d6ed0d3c31fb4003297b20778f87b1b2bdbfbc8fa36e6273aa4d965aca16bb8dee9c0fec56d17555d88e5d2271c2777b0e3109f4af0050ee1e28432f4b8391d0d414850c09821fd82cee61d206611be218ce229dd4ef6555351a22361273030ee5cd632d845d287a777d1bb8264283a6325643bc524ab6ceb4a7bcfcfdb0ab93165fbd0b5345e6ee7743c545ad5f162f551ea74eae6b6a060525d3f7060e6183c9c9c2e2e235bccb9a497600e9861785de111578e38b29a87c81b4327cd64235e5f770df3cc9072bb075148a264eedc3717e7510982b44a56dc3501d8e9aa3ae1342c7cccc052cdd901a5183aa4b1a4af097b1b216966bf0f4d663aa21af6e02046ec2466db326245e3fc6e692610e3f3eaed6e7823de6225edae0921164233fdb0532af729b79a85c26df585aeaa3e2eb91845c53cce8fbf7e8227537c1d77f676f4009a75c8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082ab352ee2a6a8e236a875eeadb35b814571c290bf5fc32e6cf848a4bdb48a3dff6032c3262f8d7c29daaf8f9846bf0ed9dbcc4a0f9aeeb7c8ab8b4ceb985f45a6c3d30bc3225049ba56ac02c164836762858abedae6e6cb81f8117394fa9e456e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d4079ee5c5ab78967a4de070dcd8917cefcd564da8e2c7b418a7caf1b2a764c993a93077fcf699ee51efcfe06d7d67cf66b058ee19619d948d70f9179a9d209f4fec62c9d7afd685c60061eaf8f3b301baeea8e441796f349ded20653cac996257a65805c024857ce2e6829217dcb1b8cc02c33b1172d9bde101537cf37789ed3fce9c9c67937e9099e366b695b08d4bd5ea93c82ac95922774432237ec82ce62560b9f64e5f8e7e3ef72f2abefb77123c445668a3e336b8a0141174782f7b07194af9718fd1f7bce221ec724cbe7fe43c07a62c367e17022e9e75ee0d25957d6b5ff85b829affe8942632b08597639dc7ad979b058a5be6d59d719fa451cdc66bcc185aebdd38a642bf8500496cc3f433c126106011e79a89440dedf4188b7597794e56bd15344508b9afe32d87449f13052266938bc272af6c01ab3279b41804d94c4f7fd90ae81358adc04b2b90e5bb8681bdb55022afa39c906afe8dd8e19cb03c6cfbee7a72a60c77afbda33dfce0f64926c17d97366b25d2242e009f9856e2173d2ec7fcc199534fd42779dd87eaef5d10739543f59560863d577025650d4c9cb385fa2aec0b92ec1300c00f2d3fc375e0b2f52006639c6fcf0107f07817735aadc7dcf70a5cf5747b6b94b91e7ac27d33d663f4dcb618099e9ed133b9980fb86b8f7e92696598ffcf39baa97736d189eacaec042b2b884f975f4d0b7a4ab82d08cfdcca21b77561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93644a2c580f02407949e8c9479d2e11f86ba508deab24abeabd93013277c882be620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1b553f13873b7614c747e02d52f281322dd98cc8d4ce789920cf593b75c6f05693959a095ba405700a8bdcb88c47f737d45523ad768f5b3698c80add34f2e764b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/026745c2e6a71ca361cb3f37fe3f4e9c3029688e",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e40100000087e476028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47200000000408ded1d02f5c75f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987a7000000\", \"prevouts\": [\"6082310000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"792e310000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ae7\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cbe80ed66a202568e8406ce6daea5cbc02fcaace10fdce03f37cb2cd6261bd65d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51c61a1ab416979399a3dea56cc9db65331fc4d8e9e627e6b90ed3a4ebdc2f66c36df482d4085282f873fe38dcb59fc4eea3656d896112fe243f784a0cfce46b53\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936372e7144be8e6568f861dea45248ebea76fa61ab8bc1a80418220e511074ae7fc61a1ab416979399a3dea56cc9db65331fc4d8e9e627e6b90ed3a4ebdc2f66c36df482d4085282f873fe38dcb59fc4eea3656d896112fe243f784a0cfce46b53\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/026f12b427239f4351f951644afdf9e483ddc4bd",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3901000000294d73f38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f000000000428d778904fbaeb6000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796f7b3ae3c\", \"prevouts\": [\"d7b8770000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\", \"2ac54100000000002251202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"167d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cd8a296a36cabb0bc76215e2b1961ccf6987911bdf985895069abdd55ec163ba2d231140cd01d0310e585ecf2f38aee8d36f3a935cf5b06765b4319c9202713151e3355b9fad1d20bddcd1a8531bcd58c93c4d9ee4159d68db4e08ecdffbe17e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e9208e9eee32827fa4e54b07d43c20a1066def6db0c0487e58a7d5647a1ab7f13f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828719dd3b5606bc946287d150a5ecd03b0f8e892d08bbecd28ea2e3769111c28051e3355b9fad1d20bddcd1a8531bcd58c93c4d9ee4159d68db4e08ecdffbe17e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0274119160b74eb12e8b0ea869012528e5c8c64a",
    "content": "{\"tx\": \"077b85b802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5d0000000030a7fabf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700b00000000c47e39a703584e3500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc1d010000\", \"prevouts\": [\"75172800000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\", \"a8e50e0000000000225120d632d9c3807cee2f3b07918ef684335c8e7823a1a0eb476eaf46267e076b018f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"147d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ab0e9d9a4858a0e69605fe9c5a42d739fbe26fa79650e7074f462b02645f7ea7d9d0ef68974064b15682d7a9aede6e3fda6769a3db9d22f26322e1baaf4532e568dbaf979cca58396dcf271ee6fc736edd00965a3b0ecce9c87347ff88ab08a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ab120007c9d6e5438fb32187fc2295f6e0f6d7a9b61cc04930744a089d58d965ad1099cc9bb3a5e2066786e30d0fff4359b3ce527e140b44a0b5c89c6b4383919a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100efb63111b06c7a0ce3f44d9f6906db8fc60057b72694cfd58ed25db88d188e5fc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/02a2d45e622dec5a4342e4be185659da883e8d6d",
    "content": "{\"tx\": \"66f38c2001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc900000000cda530e803fabc1e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df979722368987c8b2f34b\", \"prevouts\": [\"3f79210000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_5f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9b8c21d8992b703916296f8328c308107fba6a58f4e0c0f3e932ed3869f68918d9de62a3d80e883258011295585bcd3b408a88afe0820ece1a5a9c909e3e9896\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"36e15b42d7f927df7fc4d1976cfb3636ac0b5c7abb195d36a610b4e4c325881285d2d94ce9e47dbe0fc6d149e4773a4754f2d73d8f25603b7c00053ad3e8cdff5f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/02bb3113c2f000ec71e0cac539468d820cfa2df6",
    "content": "{\"tx\": \"e051097e028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45500000000dc24bba48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4730000000064d00afb0499a17b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e789010000\", \"prevouts\": [\"24093e0000000000225120c7cc4d9ecf94fd1d6052a234c093a72236440d0ef34d0ac6810605a4931ceb69\", \"e12440000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667eba4a75e30ef7cf22fbfc1113fbdf039a8bb23353b5bb581506d48372cca6d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a16616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/02c77525ae2279633746cc24153272f0cbebb2cf",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0200000000cc03c0d5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c680000000072bf48db039442c600000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acc4ec2f20\", \"prevouts\": [\"e2656b00000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"65ce5c000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09026bfcc84a20f1dde059eafec76ab3f132b4b97d116fd9c0ecd94fbd5ae160ffca578916630bf7b2ab99380a452ca6feb2c2a0b74569e52a4d3a741119b2769860d266e4be108ab87c5254bea9009479393393b21aeb61546527ce496910bf201a0e418ae95e6bf137eafcad3e06e3c3cf2da59cb3096b9593f6eadb3b7c08bb7a9564002be14a472ba273ade254fc9855f999cdc687f04b32e05795f6d4e705b09fa265f601fc7474c7ab54b7f6966f0b86c34ba81e97cdeae52ccf504dc5dc6e0613f5cbee2cc97ab674d0db7139dfeeec8d26ced7395a13d2d1f0750b17726b2f8b24c9df13b3ec48eba42c2dd48851d08533568756c6bfdf3ea159dca5913e942f75b0e3f8cb35c883ef7da55fc6a84fb28412d58ea3f5e6b77a8895e735465e1f197aa298b03767a80f0f22a8246b6b0c56f78a79a90dd2b310c6049a358e838ab4b02686ccdbac0681739a2e67300ad3d27987e77fad413d0aafbec20332be693871db55788ca49a14ee37761ab5130731a3beeaa7d359d0adffe0c311a366cfc4830192e84e3f7ee79ce185c5b0e6a68a450b31277b074004f9d05a66feb0fbbf240ba7dd661dfa3356101f91b9b55f9f3ace5feab889659ace9879342c33cc2891ef6ecf1acbe8efa220bdf40a7fe1f43b4d3894122ebef09098a68bd08eb7c0d4b64e71c21712a66b85b9acb52f01ae85984b714ba7004df34aeee3a74afacda297895bce4c75\", \"347d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d221413d2c4dda6e421754723c8a1cc16da4dea4f461b707f2ddf3ed15b4d514c5a4ec1ad3c05e8d6cb6e5418cc65ab3865118805b06cbf11da98fae87c97132e97124583e57aeab90707503ff0d8dae530166a9193c4517699e1743b45d7c12\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902db52af405d1c8b0c28b352ede8be9b8a16826899c0bd8773adeb0f0685770f5182bc9b6603ae215ecf1adcc69cf908a68654448d70df7c4e7a6ed92b7a0eeeaaa77c27314daebb270f7ee97bccad49bb2112bac50fb88ca5cb4a0138ecf4f5bac2915cd1face16d5f78c1691417f0da99ade26f9cf7bd760e014c3af369c9a8127acd92dc553ed12b4a7a86e53283730aa5e6a7c27d4d6a0af547c47f625192d6d2cb3d32cea2b611ddb90a90c520fd0fcc2c6b21d73bf9f37caf92deb1be44ba462133ec09ffd7603ae4e40463d2a5cd19683d0e5c50f097ad25785e36806e893ec6b069aa1951c7cd970bcbaee5274efd8b7dc12880d0c228115d12eae2ecdb692de46623e91cd25d0aa6e28b8e72ea2248875505e23582c3614decaf3e0ba31d77ef5ab788adddd53b5baec31a3039727cf15baff9647049a5a192c51879b06fea6506addbb9cb991811b5f7003dc12d1100863c262a97f4463f041bfa9ef95f675711baa0381427ebf1be8ec381d9795ae1bbbfcdf85d2424d8a13e9b0560dbddbb362e07edba65334773ae3bca405a2a630ab41ca253a14843bc0730b459fddeddb484bcec67e7e757283cb631b7657e493daad69218a921b4612c7665cc376a79de26956488d467707e7e937b0f7208b7555dfee6f3288ae902fd9e6dd1db8dafd5046950d755d877bdc6589d6dc1b39d0cb638cb060d32719f28698db6c05b813dca43e87fa75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a750add471e9b5b51db6817cb10861abf00379c9e2c8d017af134b88039c39e3ca882fe3c585d1ac8aa5218112791e3065e91b4e1e0362790dbd367cd44cec36e97124583e57aeab90707503ff0d8dae530166a9193c4517699e1743b45d7c12\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/02d1c1fa4446780154693993cbb3b3357d7dc38f",
    "content": "{\"tx\": \"67740b64038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48b00000000cbcacdbcdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0a010000009adeb4bedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd9010000005dd15aca02d7dc9800000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac56737540\", \"prevouts\": [\"ff1f310000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"d85b480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6f8f21000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00636268\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08265d6469ded31e8361d538153e3993104db0c9d480dfc3dcfe9dd6d2fbda5f8f6abc42ab3738335b78a2a7135de763706b017ef32cb75bc24ca1210f74f6e5b7b3fd119d5a804161d41189f11d8f3e11243ae602674c5e73f1686492aa1f485fe\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365f7d2d3ff74ecf468292bf32d6ccf054ad7a3b1b44c07da8896c3351da300a8722ebb88c16ebf61dfdf766657f947c6b679bf36be3a1118c2e7b2b24c8fd5c2a5a9a81b6bc4d13af192f1d19d1915de95ad8d42e49add8bb4e9a9400ca460b05\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/02f4d455a5e5230510c642f46a00e2819cbd49fa",
    "content": "{\"tx\": \"9701b121028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40902000000f80e52cc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fb00000000f5b250cc04079570000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7961fe84c52\", \"prevouts\": [\"510837000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\", \"0f433b000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09023353eb347d0d2153cd9bad2bd6904e61e7a55a0ab586d7c450417662391636a0d8868ed4fbf3e9f91e6d8b61f972f36f717dca183f648d96b57203ce4f9a2447d44c50c07276d3258977e8fce61f3ce1866d6ce748292380b2be241d4666ca0701410030bedda775b8505d6fe3ce6103288ffede28435eda29614bc189eacf2b17e96eccbc91c782fe66abb968f821d41f680b1dcf007deab123c0422477dee740e7719be7520a18d5b2a118453f846ffb35edb6f22f8f90e01ac68f37c461199f2036e548700bfa8041467ce1fb87f186d0469d658b211595ddce86d95ce929fa4cead051baeeb283bdbfdbab4fbecb6decbb8f40c0f09e69538a5ee16b4a805a285ac0292c49a1594c5ff7629bb603404e50a414b36eb6d23a85a725c00cf51c06b19a1fe943c522c05fed7864534e39bf322f94d4540aa5d731f35a7fe13a024f65a64ad603e2362523066b6bf57e474edb7cd5911a446b1391e6946012143658109491c7736e3e837c3052082a63b335826ad2cab87d68c9cda512c97e6083cb5057ee85cbbc6fd838dc7628e4c69c8277fea144a5f7b0c04e629c77832ab6f89b713b3e04986008a5ebd0001d38b265f8156e9d230acae56a5ac9cc065be2a6efdda57c6c65d3e46f1d756e592a6aed34dd0306dffa384d971a1a23a5e59542cb6303d3415518ecc881582fbaf7593679be5725466f1096f8e20733bd8fae7cd8e11fecdb853875e8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363edf250f59c4f8d5411dc2db66583927bca5ee5d6634a7a83199202757115d4a886d39c7fd191823f2d71d70dbb2b614916cf5220a36a0556ea0e320955e8896770b862ef93acb6091cb4ff8ef135b3065b278142aa4adab757f952a626e2b26c80764b3c3e93e4958bf58fae47a07e6a3ac966c9bf86a1c799b8570c4674755\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09023aeeb10473b6ce93a4415b162ddf8725baea19dc6056c93ebe4665e2b752558a90c2a8179abf63ec0dd2e727a2c7bcdc698ad44a00a85b76ffdb17804ca07919ab22ec6b01e86f6b2e68ecdb567d6c64d18b221084bc29fa1523242ec9453fb58c3fa579e374550650afb81bddbb35dc6702afb0114ba4f2e487a724e83edabfd4587af283918dcadbe2bca16e8eeb8702cfb1dd9a0bfcd697e7668439e459b6bb5ac9b75df68bb4f685b7f87d931dcf760ad8e8ea7b12e13b4cd41e195c51b1b4cf73c68acc17b6093292eee19997bfd701408e0305b9906dea47b79ecfc9bbaf723585f4288a90fe1ccefd8d41b19ba1acd7b9652b71dd8a10d0c87a6b40fbcacfa1b068c16973109aa391e249fa775ac5b2bfc626ab7f9df87decbca832fed887de5ddbd2d903b2889dadfbaaf7e7e5335b00bb1f41525efc2a502b84c3efa4f7d2cd209027a41d038efe432df72f1f5069a6dbb03cb5cfc596fff10f043ff09b2ca87e36abb87a172cb503a14a06d50b76a1e9ba66d3288413f96f6a7e37bf9188e92434d803f7aa7106bf238d81fea1b81b03685597f2591a175f5be89149ff0923a78741b5227d7b654c3726573b4243beb0e9b31842c83fabd310cd034bc1bfbc46eb21027b51b7e1e7b4d1b810066ffa8ffad253dca43894077404c79da411e7a9358a9805f43ed674860519e567adc09c4c5d9b710d3a4a5b60208277480fe28da2994f8d7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e13f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f61f73219d91856056394a010eb6c8ee7f13c9683181be224f0fcf47ad20d61b9aaad3e4ddcb787e09feaf57a938d0a46e7e94627a74ec9b410f8a5374ea1d35\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/02fcf2313f765802ff09c238af833842580fe461",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf29000000001bb3f48cbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff001000000b58b7f9404b14deb000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aced020000\", \"prevouts\": [\"68347b0000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"aedc7200000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063d268\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936845af1e352b99ba1b82573d5ecb8b40522cefe3709b796d40d93abe1531690682bdb5955fa247e32681f749888c9d4f86e5604dd03da59f821ad9d541fb8adcb845c4b1f0ef9796b099f7837236ca3239de7da07050a4e4f568f49f6a65718f105f27aeb1527a9572d42a0ad2bcfbe2bc67b36cc3101a74fc3488cf03d6f1bd0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d519d9c6e51540aa9a09fa82ae61189b3f4badb16bfd2877ff7bde730e5687247de05f27aeb1527a9572d42a0ad2bcfbe2bc67b36cc3101a74fc3488cf03d6f1bd0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0313e7c2127076391d6fd9696d30081eb2c9bfb5",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8d01000000117807cebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0d01000000ea8fb1ec02e7b0ce0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898749102860\", \"prevouts\": [\"7bdc65000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\", \"e5246b00000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"504c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f933d08853672a2275403f631a185860433b7a30f3dde2a4cbab45ca4cd5b5bf04d1c6645dfa5bcea0755bc1d945f129b754bcfdfa4df703b30809220c35586032cb43424d7ca27a7abc5fd0c2fa249f92b1e992144deb3864a86d466f79c2cceedc10b0e9ea9319d9c2157dfe80b60aa665931711963da9ab109764ff1ab789\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367b2c979e5280cffc0fe517d7f3a0a759f39d4606868e0106565d6533994a6841faa718416d21ef008df2257ef512539448f5ca520db3fa3c7b8aa919421e6092eedc10b0e9ea9319d9c2157dfe80b60aa665931711963da9ab109764ff1ab789\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0325cc06523d6b80529e7b67ea669a8cacc195a1",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127033010000009cf2b10cbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2201000000378971070259bd8600000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47876dd8b95c\", \"prevouts\": [\"f1be110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"3569770000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_75\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ee04256d62ea675e3aa806a3452a6a010138f4d64e4e42228095623c25357d90954435ec1693c98fd76fa1597cca47b0f5708950e92c2894573ea12dc3fc37fc01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b02f7b3c1cf4e1d8184f9fe58b46a5189033cddbdc79c54483675266f497dd9fa7e37697d3c2c9b2cac7ac228296b5f7acc853fd7a3ff60a4d5ca5bf9f196e7475\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/032b54a2e80454a2b7039f32a4974095c2f018b0",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d8010000000971c6928bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45001000000c3f02c01025ddd7800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac80ae104b\", \"prevouts\": [\"f8213e0000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"65c23d0000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"4730440220686bb6e46dea578147f27aafedff0c993acd44d4f80a84a57edc035af04d10f202203d2a6da29cf4f18ad64214ecc843c48b120136beb06dc90d4182d08e52df82ff01\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022013a6d2168ed4fa68061b08e3b2d68bc5d2e6671577c6d25201c6e3948901456f022002dbad69f47e00723719f64cc25082628a1b8bb8baac82dc589debdb8563b07a01\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/035336c778f096bfe56ccd9c44ca36a275649299",
    "content": "{\"tx\": \"e2951d0503dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2900000000faacbcb9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1601000000b69418878bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4eb000000002de75a95023fb57d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689870b6d6e3c\", \"prevouts\": [\"4a82260000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\", \"6f1924000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"0ab0340000000000225b202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c65f891f63a4162edc2f85da4a692c563eee896098c5d267f1e194a520bc037cd66194e6887748b9e1e8fa07d0598fbf835e584ebf9a684f336d03b628e6e3a7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/038d58e7a5bd8cd3c42dbd68c099f5900b90ceef",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ec01000000cb4377a0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffe010000004024cc68026864b900000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acdd020000\", \"prevouts\": [\"64e73a000000000017a9140917710a6236c7a08b54f54b004ee705f2913e3087\", \"d82a810000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dba6d090ce6eeca8f19bee4c4b18bd87e742c613226dbb66d44b3d8c22cd4f417d143406647e47f2aa45aee5a8d37fbb079fe3a633dc3f79123da3b3ed47a821a2fa119ef3ac370f8290f87fe8954e212d8c61d3545cf9da1d8aa62b42f72813\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93645b70697259a6092735a83fd9185b271706fbd91da528cf82e26060ba02f7d12c3950c17255228812280bec2d0cca04b586565374a97ee6c913745c9c1a159600ce9ba0618adb3ee44483a22999a54a4e1710b9846377d8164aaa29371d79f22a2fa119ef3ac370f8290f87fe8954e212d8c61d3545cf9da1d8aa62b42f72813\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/03ac2fb4ae30f213cec9edbaf2796b086134d050",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdc01000000f1553faf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41f020000004d967d93dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b20000000009c7a29f501e4bd6e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac9946af3a\", \"prevouts\": [\"8fa24e0000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\", \"07ca3b000000000017a914a7d99db8790799e567017bcc9951f7f968dba70f87\", \"48721e000000000017a914a1b035f555fd87548264c3580a1f62a42acf027e87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902507dceead97f0d39a0479a7449706ea67130065d5b4100aa056b2ec143dce6731bc857eb628da5d6582597ddd0e45ae4b471849db6e9fb3fe1c3682931873323072350cbb62ff65b67c7ecbb06c15cdbaeaf0e9def442c347be5dd7e2a51a96bba938c6c5f9828102ecd35e365e31e1896d945d7b5bf9fa72fc0fef606246e9826e4f611711aa8fcc664d39d556ea91357e5f61f71b4f541550316fab12d018f8a95bfa43156a3b003fa3283f38e89ef9a79b2308933df81d7f3459609dade69e500c90936678b2039f062a86f19196dd7aaa97aa0e7034e4ef1536690ca67356e9ccd071e82b0ccfc50f3ca3503ceec63ae1e674235edd969349a3c60afb544d75801343e5d870cf694cb9d7dce70cc797748b53657e8d8f6d3f3cdcc24f8e4f0f2efb941eee7906e5cee872f9bea68f28f99c45cbe0589e562d80ed16b80343cef4805754b5fd76e527c7fb0b749083094168ee72a1ec8922696977d6256aad60a908c0a28ac7f4e8a1d82d9a23354cd49eb6bdd210921cf0783d918a27f42977cbdd5b183f7e8bed8dac11fb3e55c940b5888725c69d8b38b194fd86345595aea7e8170ad3efd72f93e154a40266741bda110d4c389670e62c93a09fece71f5e58dacbf6bcc4eeffedabed92c760e618b69487805fbbcc7a499e4209660ceb82abd20ec9da6e429b43b26faf5ffe5cc752c7286c9aae9b615e0d0034b82519b8dc02af3837b39dc75\", \"6b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361b101d42e37cf345b14a494ee8db2f6d3825916e42c7a162e255fc6a9b93086c8a154b22b0f2e2bdd7f3b34b8feaf196c14822a5749c8a329692c0e12e8447d605976fe26432a41f3547171b2b9abb696d7de0172bd15211267873326056804912e839b87dc613c826a9c62085431a96f79b8782d4b0fe31dfc75aede09e250a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f62d6b759218d83ab882995d625bf8f2485500966d8bf7856c73cd7d17260caf3da5b7c179032e276a4c2fe6ce6584905c5ee04745a81948f2941bb47d2871fd9eda7ad0fe926bccb818a72d505fa1abae02704f5f734dd0499733aa6a7c8545e06e965af935139702d192ecd586e7ba622fe22314477744538df2decb01028bb15b569d0879012033e02e21e7e999ac2e04ed009bab93eb9359adfae1a5e15dac151db6dea7e7bbb928c4347cba6e488420e9c2bd509b7cd2475a2b39d0b2c2eb87035c474b50edc8e029569990fed0d8029fcb39d89eaa472eafa35987b0e6c819859c3e740cb4d0df76adeb4159c987f96b2fa15cb77d01925b162cf2cf2bb60bb171f6e34601b0ae797b31d14afa7927fa551a461169c7a37429ce51dbfbcaafb572092c25f1f1bcd224e71b5816c7ec9763d5749ec50850d8078cdce5a4611876e702688765b29c58e5de0c229bac703d81576b1c41660ed6a1edc885384aa2a134c60855f617f89668d55780e576d9cdc705f25edc7834aa8c52f2115c10d76bfd6ece6602f42b7d5009b84ef0962d9de477eae8ddd8af32fe3baa60df582008facf3a3544de7b75e39f06b1af4aa009b67af22feab39cf6bdb1124ef0421cf0607be403b0e40fb602738d79c9016df609dadba5fc348920fdf82db61e236f7a27fa44ffb0f5d04fb6d365395cd2e26f3b79826269bef056ad37dd258f1789c799426cb5595c75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bb9f94af104a116bd67f5cc9bb9b862a518db3d2599f39de780392b0d5a72c30f14541946e1cf92393992e5ef2191ac72b106fd890d94444e74600720cd636c212e839b87dc613c826a9c62085431a96f79b8782d4b0fe31dfc75aede09e250a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/03b65143f1009a2a8a2f6b758fd8559f040d207c",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf750100000056603c16bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf44000000000058d92c0486a2f60000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac1d010000\", \"prevouts\": [\"928a81000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"d39f770000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"spendpath/padlongcontrol\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fa77708f4f753ee0939477dd14179863ddef3bc880a8f335609fa93296fd108a0d05c747a90440216c01770041164364c719afd343ff34b1dba534c01de436f0\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b78be31b16966ae882c7ab2969dfe11d69b83e8cde47f805ca2a48764752b9cbbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fa77708f4f753ee0939477dd14179863ddef3bc880a8f335609fa93296fd108a0d05c747a90440216c01770041164364c719afd343ff34b1dba534c01de436f0\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b78be31b16966ae882c7ab2969dfe11d69b83e8cde47f805ca2a48764752b9cbbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcbca2cf1b4d989a3e309c3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/03bc1ab1714e0ffffffd3593268beb217c603b54",
    "content": "{\"tx\": \"077b85b802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5d0000000030a7fabf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700b00000000c47e39a703584e3500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc1d010000\", \"prevouts\": [\"75172800000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\", \"a8e50e0000000000225120d632d9c3807cee2f3b07918ef684335c8e7823a1a0eb476eaf46267e076b018f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090265347be1f1cccbaf5df8907cf7dacd344a716612ebc3cb560fc5c971b8c4c1031327ed44e3d3db8f2a6c3fa7270047ca3e0fb8d3181c0f79483f072706d0c1ed34821282d5ff88375dba3137ab8841a0dcc90314420a19cdb52d3ce9cf73065cf4917d1073712c952299eeb71fecc1ef61d7da57057864573e01ca802e5d5ab8aae93dc35d9e8865c313150e2dbe88ba61a1d49d0aa623ca1d9a40f9fe3c1dc3f9d07911f8bebdcb2a0dc458a05c6d7bcd2c58a30c779bef355529fa16afe3e822ca3e6b9e978a21e798ec4255b7fbf11e4fbe3be6c34d949f08b2e629ed6212d72a7def2f86d00c076678bc3d49fc6c022b9622330ee270195e2c7b2fe11492aa747c6995f535ed973446db7a8d6947a9f02f7d9311820c3ad3a28d3d1bee8b25af08b7b64b8e553430ef573bbd9542c028e9d5d17194fe70357372435a2d27ade8f0fef1fdc8e86e659fa05bfd406a01435f35ec82e372f414e608e7a6b9cdd7c617ac87d05d86791a5779959df85ba78b4fd440889c1d2aaf56cb9db10c8740a3b8625ed018c987cb05b11e4b4304d6172c7aea876226c8e5ffd46bce0200c02623fbeca2ab5dbc44b08145a1668b8cdebdbeb4fc6083e476546179aefc3098c637ee22a98cd34dddfa67e79737c477c778de7010259df66973f6e51b5e65182646affb23e028a8a929cc46e8dbe17f370f65e55700afd68267ab51212657715324cd07fb7ef5c375\", \"e67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa85f665641dd2adac3083650f9d93a4e0ff6d52a887a3a3677c2728d09852a8a99d11a7792f25f0da70e8485da42647201d1062d1bd001b767f1b05dec6877400\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022d82118ada44e3fea673624994afc66bad92397c8b136ccdac6bbdc56245db6a43c1f85fcff07b09fe732657f9e6a700c2f0491035e688b8789978f8c08201b9eaef24419981e8dbc0dad5d1fb73cb4cd43f691d7781c628d06e6fc434b2d59f000ec963a0478d2d2f27ddd1ab0b1370fe98be1e28381ea5a5f7c21b10a5191d5e54512973697271df47434f8a034f8bc984e2d3c0ec64fdca0d1960685bcfab9bb57863cf91c2f2748946ac3862999b77b8a3e37c35addedfd103b1fbbe48b21f2de8440d5d4c1922ddb3a1194567266c8ce4fc59acce9fc99d1b50f4fc2eb1c5c4f875cc7e8b7ecf924d54fb6770105316c6ba5eca48bb8be92903c3aeebe6635663362a4d1efe4ebe7159fad8571fda3cf01bcfd9c89a92e1de286f60b04e2bb86c6f94d5546f457da3700faedef2c8a2568676f74022fac45dd67951020779c297c8c4533fc822a130c5ac4b459fb22560bb4d2a26ca04a20e818e41bf245195ef501a21341af2c79ee9423e280138bcb1a05a18bf7c26f47a8ed113b5ed97b44874431d6abcf48bfc3a947df90b6f1fee7d1d62defb32ab68b54dfb35d8af8db95b614560d99bdff7d12226a0c95ef60fc119cff197c61dfa41f4ade49148a997ad68c352bcda141e3b6271b092d93ec0bd148922a274a2bed64a7b8710bd40c7b8c03e213ecc97b991eae66d902e06fa67d27de2eae4e373a5167505d9e6f7339ba641bac3c475\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac9ea19512c809756aa5c58e4cd3562935caab0c2ca4eda8db33914ce4decb3cfe9d11a7792f25f0da70e8485da42647201d1062d1bd001b767f1b05dec6877400\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/03bf93a96878a9f8ab6cdeabb7da6656971299e2",
    "content": "{\"tx\": \"47c0016f0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700301000000248adfaddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca601000000923ad6d7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb500000000bc64099104f8507b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72f050000\", \"prevouts\": [\"71151300000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"c3c7480000000000235c212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"db32210000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"ee\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361f25297efdbed2aa8c1ec8b5437cb1f621645355ab4fec48723d1bef81dab8b605e01deb44bf60eeaa09a037ba0d53221083944f657819e2d2b55bb732cda3dfdd207214d6df2d18dfa237afd6016520e9e6ed6636ebebd182087bb183877c35439ca2b6d52d4fa79aee6ecbc14a8999a29f1c28c4c5c5b9dd610517c3b748ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d519b8dfaa69151d05ccddc10c8c1e468eb7b78f9ad17f99ee1b916fd61bdfbcfce40899fd8696dac9e3afc960f0a100b615a3c324ed3a125e98af98336f748ba56\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/03ec899fb91c58bbb5676ebce177b0b63fa704a1",
    "content": "{\"tx\": \"fb2bc47d028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43301000000be89569360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b101000000f904b380013e3908000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8790010000\", \"prevouts\": [\"4291310000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\", \"39b01100000000002360212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0c77e9f90c808108c29bf4f0eee7fe28be0cf50bb14d1f2d61baf0ea4772c38e7db30e1b807fd143bd3ee6cdbe06c2af20de4ad634330073b3d1149b4aaea84d\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/03edb43f652ba7e0ad56e117bab26ed1b3cc0b66",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb001000000037ef9808bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48201000000c798b1410490418700000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd3010000\", \"prevouts\": [\"2c324c0000000000225120bf14cc6d2f64add112964063c7917cbfbca584b2015bb2b877e08d516634d692\", \"d1193d000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3045022100edfe03812173e4c65957e82650a060bccbc61c5acd076fb840b5006e26588f9602206e45846d2e23ee3be178578b2ca3a7dbfe49e2c59dbee2c9670a03a1fa7ea87803\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3044022075a06455df7b20225492f9e3a6b68b36c199ee9f47dffe33de5d5184e03d7bda022070cb646fd931c2a6e62e27739f564e67eb5ad82b5d332ee1dc706246d6e4284103\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0401cdbd85422acd1857a2cf6024ba4b7b5d909e",
    "content": "{\"tx\": \"55f3a2c603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5b010000003b874fecdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0b01000000e740bcee8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4580100000096508f98011c849e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac56000000\", \"prevouts\": [\"4ff72300000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\", \"9d0f53000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\", \"b9943e0000000000225120beebf2e29d62b55aba368e7e892512e69e2ef37d942bd7f6bc768a8958380305\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902186868f5a49aba39336c7fac1fccedd9e432f0b9208b9bd2ee9e0d09e6a93c86743368b82265f4a755e42a71776eef04a7f548cdbace159dd5156fe1f0e436baee748c28de426195b330bb0f57f5063b78d02d48131f65ca2ff5df87d41ba016df5cc54ee19410223521f4cfe48699df0fc934b0ead5a57b2accd4984f49b69d1c8506e2867dc9409c6fd8737f53343668a26debd293e65e04f0ed187b745da016b3477c5965683e03b3780db59a6945f22d122bf20d5ffef5bc24974cfeef66e01fa2d6bf5b9360f125fac8fe200344c1f684aad16f00c9126997ea9cbd72e33c7e712cbde801d47a634c7df00706652cdf4683099aadd1af94e4ff71495914ad7ce3a43855f379dda6ba5eee3fd85eab78de66f2ddd02b249f1a7ba655b874d736218cc7f5ead91222e183623d860f1e0170d3b442d08ebf67e2663b9f847deb78b435204059b09237df46056ea2b1b6703b83b7e03abbc1ef56c15b46c81b4f1afd2d12275de54381ce1efd2428da6ac745794dcc4cd76ab9fb1ae39a8b5b74e7c10b6fcd9fceeed2550fb50eacbf3152992d8cd0d799fb345f3c4164dcdf7c2435e3f4af5bed9394b273a31d63665d42e5a50d07ce849b94dd48a7e9df822ed193a46fd455a7869aadbbcdb03c49008672d15da2b9243346cd5b379feb2de18c774b6142374d3bb8f4592a3b0b45b06aae1de7d3737b78f4765ca1f846573d7273b4d81fba51e175\", \"a77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082146d6305f54208d13896b102f4aea30badeaee99896cb007ba6ff00553e24c3b2915fd873a4966f8e9b4a3b328eef3933245a1c852c287990317c3760d8289da96773453f0744a158be0509abdec64f05b1db7ccf03251d8359952271b442a24\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902adba052ef3b7f1f9c73d7fb2caf16d7e56b2a8bb485272f0b81fdcc4a2489707719be15d2eae049fcff8ed09471a560c4b1faa7c5397212214c7d202c003f5d69a4c9fb2f2fafa2142a3e2304471509d9630047a556c4c43170770c360f017fe932fffec7047d0cd013b465ec747e570437acdbf472c9dd837808488f1ef1c917c9a46bcc7f276cbd732e2aea11c8e9c6e2ec769bffe42289a89da5e7a87aafece139edb0a6671f674a786e4bd1667b2325499a20b87efb5165378522107c7d57c465c120bf358b23aabaedc396007606e3d425d2cc33cca71fee916265a302dcd391736163a0e6f08464e6007ff1b217b64a2c127f450e75f7dcfd2f43de96f03d390986a5d6a52cc6e315a6a5fcf9b6e22d54c5b93a81fdf34c4f01073eb97b702188dd17715ca673b79d05ea524f4addb1e07fd906359fe869399c8e682c3cd355ed94c418b72b2d7ec4ac09a4e84b193e031a5782174e6357e4384783f6a926f2f57ee4d50b0f251a857b195cf47aaf0358e3ad921de76b524e36cc3d277b599bfcd8537fa0a282024c591fb23de6f92764f8e690d1ac37adf47c8e8f7a43103390fc49d97117bb83e4ad50d3209d12afcf15acc6b1c1dd088ef4790e5a1b10b337499858d51832c1c300f202d6e19c91bd54b87beca78e8f29e10c7355774453bc5a9182449ff53d972e8a9c6c3add5cad9bb28dcd10808877aecd62cdeb565bef8e250df241e75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ed1a62e8154f816026f7403b3a9565755790b01b86635a59f42302343c6f3dd69619a83ee22e28c5507e71eab09869c4e19cd00c1b769e62c37a8de310ec2a6696773453f0744a158be0509abdec64f05b1db7ccf03251d8359952271b442a24\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/040d05cbd66190be71c513b0ebd00bbc34debe8b",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4d0100000097b2f1d4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff300000000335a90e48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43900000000f069d69701a1ee2600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aceb020000\", \"prevouts\": [\"98775d0000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\", \"e37b73000000000017a9148462ed29696925d7688e1db8e76ef9e6667f05b287\", \"74ed3100000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"21551f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"599545692eed16acc6ed23622eadfbf98699e55a84d0ec9431e80c8c0c234e9837aae449445814abe7cd48a61719937fb7c323ee98203f0e903c941edc17b58e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/04369027c0cf8f61083f8faeaf5d15a4bba2cb26",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c424000000004c7ffa9e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270120000000067fecfca02e2db4a00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc71c501441\", \"prevouts\": [\"8aeb3c000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"adf20f0000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"30450221008e7924b940b4ee77a40d8c9c071e4dbb61736bd178eb2019aa5d0c9ba76a022b022015f77f2b5791496908100fc43681d4d366f8af4630d9c2efdd48a4a16987fab681\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"304402205a4634d78cd7d210cf1551300af2cd466b9ed3b18ff568e6bafe3bcfb25a38ae0220055ac9545dd9559aaf2f619e6bb3f785fac840c1065df3742022a2a7f23e406881\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/043ee2fa352668d08af2912ea4c7dc868039dd7c",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c26010000008481b789dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6a000000000539fbbf038fa4a4000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487c283824c\", \"prevouts\": [\"38d65900000000002251201902cefa81d0b0fe2050344a0485b195b36f31ece5900d0426a9de0fd01dcd1a\", \"f9154d00000000001600141cc39a492a6f67587324888ae674f2f534a7639e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f650677a85498c606c782b8f888c9310727e5031ed3d767ec20b675f0ef8f617\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a1e616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/046dee126274f9efbec0b1803cf0483b40e0bc0a",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3c0000000017ddeeecdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfb0100000096479ad303c0b99c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac86e9c54b\", \"prevouts\": [\"6d6a48000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"fe56570000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"93765305a3fae08d9a1b1d28b4b2065aa3d6f1031fd31a5e3b926f65d534a5dce6eeb59b0d59e42719939f6e7d4ce9883d9276137c979d255bd3c1c6af7c6335\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"babdec7f600efe50933dfc100c4e0d503430f6be4a7858f1996d6ed735afcd79769e2e7aaf9b694a12c1d47f0f6d7fb8673f6b9301634aed5143e8167a04b877\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/047736248915b6ec7bb882618f4c6428dc10bc32",
    "content": "{\"tx\": \"2718af9003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbe01000000e5a9b0d4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7701000000d487d4b6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7c01000000a122a7d901541e3f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e1010000\", \"prevouts\": [\"436e760000000000225120cd69e6502803f0acddd51df30ad464e69e95dcae732a2073690eba6ce00d0199\", \"a2f375000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\", \"0988520000000000225120a98c6fc01fa4c9d83199250e6e76cd0e9fc22cdfbaba8827d6d131a9d8267c4e\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646cb5e8c66a9ebf72f7ffb8f0d067589f8122f5d919b65c933101887d7d058af\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ab0616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0496f56b7283138d77bd26aa97936a80588bc908",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3c0000000017ddeeecdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfb0100000096479ad303c0b99c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac86e9c54b\", \"prevouts\": [\"6d6a48000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"fe56570000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063f268\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045726f0db9cf92b82453fc0fb8c6e624f8035b680f8d4bf4414d1abd8846bea56401b5a419c18d23e8c03ade77009761f1ea37c255231895048329572c11717ad56187254dcadbfeb5c8509faa2902470872e97e8359524e33e4df3f76314d708e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f36ca7668fa45ed948b1c8d1bea39db523e0bba5358b896321d776a78fadcd6f726f0db9cf92b82453fc0fb8c6e624f8035b680f8d4bf4414d1abd8846bea56401b5a419c18d23e8c03ade77009761f1ea37c255231895048329572c11717ad56187254dcadbfeb5c8509faa2902470872e97e8359524e33e4df3f76314d708e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/04a0415662e8fe755a1cad7e31e996b0f9553a15",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf7010000007a32a641bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff50000000030c813b30337aecb00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7aa000000\", \"prevouts\": [\"f054530000000000225120396e1e3d37873693c049a0e141d36811f0051f76fd306cc6c1f2259368cdf0eb\", \"d4857a000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"be7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fd522f1cef67c43cc160020062cdc11d631b4f6eefdd5e68f18dfd86aed0bbdde4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8c20793b34d3eca391845c9ee05577f0fe1c8a49b621d2ce1a9da4783f236266e6f69f1f3a976918b4a05b157c0a8e21d478cce8b5d78fdf690138c8d187dd5c9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eb7c20d175283666615e94eef717cc04c54a6d9612bfb359a13b4f03ea50e15671092566d000aee18de877d7d37a6499dcaa40717b87fb42c4af8a156e9c8751ba72dfb389a6a0bb3f8b3aa7842bba2225719f72a11deb6eb959f4e6afb1e08b911ebac8c921821ba74d98d656401ec4b56b2bfe8f672693a939227457b8b1a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/04a9e5bdcdafa1f723281d72593020692f3b5004",
    "content": "{\"tx\": \"08ffb27f01bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfab00000000334465f70206687300000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acabd39529\", \"prevouts\": [\"532a750000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063e768\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93664ec3f6c98a66c6847beb09afa70d74962ff9c9e8b80ab563ab503c0812acea03f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0826cbd7cfc5d340306ce0f8e37fe1bfa8aba9fd4064e6187eeb928db0d0bdab726391a14412c925771c32fa4c7776d5872be2a56fee9c5a8de868e7e6e5a4c84da\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ee9caaa52dbb5b2356b97143365eda72b121d3e2ab2e725af8b99797f1a4e7c0809bd2604b63a9913b428e9bd239a7888c90ad67a336710c360335112147f5da391a14412c925771c32fa4c7776d5872be2a56fee9c5a8de868e7e6e5a4c84da\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/04bb5c8ad218b2ea6cbabde04b776a727cb804d3",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba101000000a9a32afc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ce00000000d3ee6bbadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf600000000f28de0af0335865a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb813d458\", \"prevouts\": [\"5519240000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"15bb0f000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"0239280000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"483045022100a6c5a91a092958f8894c0f8d9978c5eb068bfda5fcfc24b850b97988f146ae8702200e9256ebbaf450ddfe88150fa324f2c18b284c0de17870691d27f3aac83b120e932102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022028aa0294c582a0e055ce32f145b187a3e18bd48f37a8a76895a79872fa675e7b02205553461a848c955cc16628c50c7bc5fb21e3701f48d09f1f307e591abba1ffd5932102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/04c14170bf3650e0dee112ba4b888f2e76fc3b69",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2e000000004f19aad78bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a9000000008152fdb1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8b01000000bc4390e0033a13a400000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d3c8e225\", \"prevouts\": [\"20dc4d0000000000225120ec87a05d11c16a148e05f58a688dc5bed4b2941085b66901aaa75337acfb52a4\", \"f0dc3300000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"0f0a25000000000022512063eb770f298cfb14c87c6cff1e0541dd7cbc30bdbab4472c0f37d52bd55ad696\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"ba7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93679583417cf0de5689111c04e71e0d01ec961f10ecfecded2a9e36ca9bac8c22da47630aaed9dd66550bfcb0f3b3ec2bd830a8a42bcee9dbdef471b4e5cf2e89f5668d978bcc8d3ac0b8aded42d2a4a1c5e69a5396581e310868cb48ff813edbf\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670c450feb28eb0f8b74116aafe4d624d4bc8d2ad8551ccd2959f6334db4959b5a0ef97ab7ee9fc1eac24be41bfdadcbb7c9625a4e882ca5abbd81147d09c0527a47630aaed9dd66550bfcb0f3b3ec2bd830a8a42bcee9dbdef471b4e5cf2e89f5668d978bcc8d3ac0b8aded42d2a4a1c5e69a5396581e310868cb48ff813edbf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/04f498a7f3cfb530edcae02afc0d1476b8fbcd8a",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704a00000000197308bfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8000000000a81903c801c1d73a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796b73c7c53\", \"prevouts\": [\"6d9e100000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\", \"456f820000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"067d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93652d640cff0c4ca0b51ec04f00e7d6ca5ab56cb8e34eb7266cfd1f29ce54ee2fa85587f46271ff71c1a8d3d9e62b351dc1e7761b3de349b9de66c491fc83cbc116ed3422fe95872366e2174646ef4116c9fafb56aaaad9ae25dbd472ec9cd0fc1c48ffafb7a4cf249a6909d8fbff6ddfd3f500331ce755bc2f73b79afc0800987\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e2edee9d6f4a8cbfbb4a0af0dddab94d753895c3cdd7995db9d6f3e266cdd0bebd1973e93f7ad3f562801731a237f358bfce42fb636b2a0dab3a823989e87b4ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0526255fad6bcad83e0f38f3e175d8b55d0113d3",
    "content": "{\"tx\": \"78fb85ab02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7e01000000c5e6ddac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708e0100000019cdf7a804af2e3400000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acb51aa824\", \"prevouts\": [\"0c31250000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\", \"2b311100000000002259202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"947d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360bd0ac8016dcf75d48c3ac69d2580b72b0ba7cd77592bc6631039a54a132ee505432af4ca45b9bbe99b3e8be0ff589ddab81e08d94f2d38bc0283112328f69fdfe847a112bc0d43d64007e06b59459a0c0ad8818c3210afd17f00e931ed6a3b8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936301899a4270bb6916b9141aa84e043e27ca85cd4d827e482e33ee8eaa8161c9e7085091e7b587d9e3d903161356c0634077d7e43e5aac1c0c25d5c3c805eac670235be472b05f11e998cd7dc8896eb16b23bac01933cdabddca8bd45937e3454\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0530510aa69fa36a6377468b144a6daefe9e0779",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0202000000b786b0918bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a20000000008aab3a404e02093000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47878a82972a\", \"prevouts\": [\"2360560000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"88d43e0000000000225120032ba6f397146bf93cda2585b16902a48899558623e6c842c83c4de6509e8b52\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c5b305c186e9c550c1f891932feea0e9cd4c7688ca45dc8e9b187d3246f8c99e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a0b616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/05645a121a9dee2f1e618d22d9c0e11f1729c008",
    "content": "{\"tx\": \"17f2605402dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc60100000098f115be60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270230100000050702df8027ffe3200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48752b40928\", \"prevouts\": [\"5c6025000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\", \"9a19100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_f8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"acce478862100e38361491bd945e99d878d7c209ca2466b06a8958a76f6f4fc2b10ee9cff032553be630ebad7b867179e1f6765748c8f3045c0e7ce6b430e4cc83\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b2db7022dfe0f5d2d2ddaa02534f2faa1e42c0d851740edc1a40039c8d7bc312761b2c9da391696f41f6f8352d39353ee94c4ad3768f79b09c5ba0a9d2d57957f8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/05723fdb3ecd4a3d4acc01d8ce541e74f11ba38f",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703f0000000024d521f4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbc01000000e8ed3cd4048e26370000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac76000000\", \"prevouts\": [\"ec7f110000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\", \"7866270000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00638168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936266992371c49134ecc3cd22e54af8ffd5ffa261d20c402b4c0da0de3b849e1f1f98bea6a80fea94b985145b0732d825e6fbd27add9cac654f3749fb201eaf5c0cdb938e1cb9dba9647cc0512f82c526c8f6107930613b31200f04f80acff8889\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1770c141d000b7389bcb028eba0df2d51be96e98815503d59ed22f20e414bb1bdd3571a06a1d33120289e06483b2785a7356eedf367170ec7792d3587508789d4da9670c383f4b71f5a22d48df0589bd68dfe195935a65f1aeaa80f10f8ca6973\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0576b0175f23da9546b0ed7d213c1bdf55941dcd",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49c01000000fc23b6c3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b040100000067f7ca9b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f0010000009dd718dd01c92f7a00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac43010000\", \"prevouts\": [\"ad873700000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\", \"baf1220000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\", \"f44440000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ae9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1a58b6826c45b958e6a43801c4f9a11218097d5d18de4cdf93890daaefc8ad62d7d143406647e47f2aa45aee5a8d37fbb079fe3a633dc3f79123da3b3ed47a821a2fa119ef3ac370f8290f87fe8954e212d8c61d3545cf9da1d8aa62b42f72813\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bf5896ca46bce08ea2cd3a2aa0391d54c59b6987085b2861de9c65df3f5b29ee99aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb45e04c998862288954a26ee7ce146837a88020619bd4ef6b5d2b0b49b83f7fafffc7f9c78871d6a598c7c7c3f4c8210a5c47caa8abf9700608b6e75845c74a6c5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/05a7b91a73da2203e485ff51426532165c688040",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca2010000006f1d02720215695200000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796208d153c\", \"prevouts\": [\"a0f7530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_c3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1576b15728f36c1aaa93f11db6c9bdc1b071cf0560a8d9fa87cd8ad0bfceb02e1ae7c6d34166db4273141aa4413f2c7a966cb7a906ea6844dcbe0d5888e6ab2d03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7a62ff08fdfe196332f5092e6d2a3ea47973d5284e5574bbc9aa3222143f62d0cc6f31eee34f662763ee3028d1dbce5ad51b1989d5040835f378384609b58c89c3\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/05d3a449ff645092d95ff6fa07d433d341861837",
    "content": "{\"tx\": \"4a4547c3028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46301000000d1c47481dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b90010000006136b0e302a00c5b0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df97972236898718b3c029\", \"prevouts\": [\"4bef3800000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"d1392400000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"473044022054554f319c3795aa4a008926b3d564d699315ae2fe362eb1ab83128392896be70220144c04d7f15e0d82069520d1c36f0bd5f7ed8c2d42d2386749f3f3b264a7aa45024104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100e8b5c8e27b4d3120a70ae403b885a224bfe2bb31f385665cc08f7bb87bdc096a02201c6fe2cfd3d16d4eacd377af6ce78d7746e1b2a9e95b6ed78d4d70328af19507024104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/05e7d1f74a0f0d69935dcee5b60fd0b08ff396cf",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4db00000000fb0b3489dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bff01000000ea7ff3a203f9225a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc75f7548\", \"prevouts\": [\"524935000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"93f3260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_90\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7337baf5e1481f981491127edfa649a51943c66757f9f029ef9bcb15bab0f31f4fd8cc4d5f96191468c3d7b011083c36dd742fbc4c4a7e5a2a901f64cc0f152001\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"abba4f3beb209d4dc153b59c58acee686622d181b79b538386b806c18685e4031c1909f4685c873c0a726923429d12c2b2343def9e628420dcf2cec6298b55d090\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/05f2dfea38b07d623e2947cc2c7963f25a45e24e",
    "content": "{\"tx\": \"bbfdf13103dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba801000000044ebdc3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba3010000006ee87db8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0700000000b29ebcbf04633b6a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc791357b23\", \"prevouts\": [\"55991f0000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"bf142400000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\", \"5a22280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d7a4de15e00961d988e4ac3f11e36dead0af966fcc97ce922dc435dd9573b8def6cf418e70726de23090f91a058eb36d779521aab880d3bc49245bb5b989e7bc03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4250137e209af13e73d9d4b423b7459d0bcf20813e4d75427dcdda2bc89e28ef152d866c961e2771fe8dc9ef92c9d3bceb55908dae0976b510dcbd2d1397d53a04\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/05ff688173b90131ed218e693cd3e0735c88955a",
    "content": "{\"tx\": \"0200000001a86a862f8a1bc1808f7ba2abcc71e2c0ff30c2c698fc832f6545a8dcb978b6cb0100000000d612f0b5043c3da44010000000160014ca9858c362545bc83a3b93e73b12b27a9b3ca003580200000000000017a914ca5375a68588393c82c00f5d2ab21f91e99aa5ce8758020000000000001600143f886f8feaf75ad7bedd5713d4d148e7c97c11345802000000000000160014bf1a19526352877c6b170dd8786dc91b1610ae1ca7010000\", \"prevouts\": [\"bc9aa6401000000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_invalidcb\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3450353dceeead4aeffc66c2623942031803cc26b4417f85fee94662355c0cc06ade70ade320622ef9465ab480f3fbe3614e16d5bcdf8e49a8dd4d2a6abbe867\", \"20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac\", \"c0cb0ba18c127bd01c924f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f312f383ce02997bd7885b2023ff24b4d79c49e77348af650460f5903df7baafc9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/060f27e89600b0edaefb344b00420aa71360fd11",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb9000000001e948b94dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b63010000003a5b129a014d5c680000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc10000000\", \"prevouts\": [\"2162530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"da65220000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_92\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a9f6700bd6df58bceaa4597de51e0fa2e1e6a82d27393f0ace9053aa9fd3f367376a5715a22c87cb958d3163bdff15193be416b68feca647a8cdd056dedb9f3101\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"84d14dc499dc1e3eabcc5034d1fe1b9e102d6c36c6410edc2abe97c85167b0a06e34f8ae3bbceddead34c1b1821a96c80dda92a87e155f7ec2be54f487e1067592\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0621f65ed4f98e0fc3ba2caa915de84ac2773b64",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709b000000007f3424108bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4af010000004517a8d7048319420000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875f000000\", \"prevouts\": [\"e4820e0000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\", \"3867350000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_29\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"beddc99585101211d166f1161dec6948a6f5976e2d29d9b7eb5347db8a42ef66cd4be058672497360f1216eb4f078d697ec07da884dcbf6710355643ac872b3181\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"072a0633145d14fe087930b8e08bd67bbcb251ab0e53472d7c1d78373cadfb352712f1cf65e74305237d9b02e9528ecd95aac0b757eb00d8d3b15ff66cab8a1729\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/064cb40080f9955f34713af8c9ccd370c7ce8d39",
    "content": "{\"tx\": \"997c8d6803dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb000000000b13b4e848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fc010000003b13f7f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf4010000001bbc0c8c04cff9dc00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4870cba8322\", \"prevouts\": [\"4d2151000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\", \"2a41350000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"170c590000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"597d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee343ebd89880aabef0f18c5bef462b16920a32508939784a2317d7ebda32c7f1d0160c53d01d80ab4be204ae4e021ad6f56ad3990ac4b37baa4678d530d3ba4ecd61c62feef9509bc7b3762bc81079411fa6867ea4986820580c60fa1e8298e9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369246ff60def872dcd9425d4b182836bb1c9ba5ca30c9708f02d69701de6960d646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faa393999847c63b69274661db27cd2e7bb4343911a06570db858c301dc754c7eb4be962498b383c32e8a84fa570ade752f3a2216469b10dbfd65078bd8e1b5998\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/064f3862567d3645a67ad42e8f1234919491ef00",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfda00000000be838db68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e80100000074bdb79c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b0000000006cc0e3ed03fdbde60000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a613ede228\", \"prevouts\": [\"566f7f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5c51330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0198350000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a83\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936648b8fdbc24ddaf6fda4be3c15bd53c3c8af4eb62251b7ead54781f83ba5fc3b8ed6c904d531fc0d19ced9482d4cbb64035dc55104164ba190923612d3f9e9a82b9d1447cbfb5d72d5da72ac5ad193469eaa6b44c038aa23e2a9d2dd480586adaf3b292550aa3dd1beea84cf7009fb6c6992543e64edf52f25a9194aed3bcd7c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da4a1468d71fb79ddca97f2d0be02d5c32dc1eb93332690a2fd408e08d38e5e68f4301bf594f01c0bdeaf5c3d617f0344f5f915f3ffa16d6ac31751e310f3332b0bdfd7fd43775a37ae3e20c8f8514aca25517db969733cf8d9f690f9b6d8ea23f980255362d30444bd4a09dfd60422f4fe5b70b7cde78729ca8cd52cb50aace\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/06689eea577fd577cf0ed48baa3396126bb6f1b5",
    "content": "{\"tx\": \"36cdf06c018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ee01000000c0f713de01703f22000000000017a914719f78084af863e000acd618ba76df97972236898778000000\", \"prevouts\": [\"1847330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_23\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"11c8d2d2d77f80429dd899f88143ae6f988f00b7c9efe7d938d51fa2547f2c50debc9a4745150d77db2e9e0c24d8fd0057ddf5543e537bb0384616efd364915201\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"78ac00751bd1251df05faadc67c597881293ee1ecabd0418f41c375db6ed526487e20a8c65cb0156e7b83cf4086ca18dd83083b0f74fe6e580d8143b7859d8e923\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0672af82ea3c78b3ade4b7424ecf5c00466fba2e",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc10100000045d79042bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf650000000093c03899033fb4c3000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac0a030000\", \"prevouts\": [\"9f9c520000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"0ae7730000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f74c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e6bf3ef0c52029538d60b405bd64e2cc9734303fd934f9ee1f37723dcf17f67fbe0beccf8b53a38f7a20d51eb008bdc60f78fac094fdd23935202ece673d8622376e34112ab1bc736956b41978cebed690ad16294afa2ba0e9d8b5fa7e9f6f2f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52f7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1dec24bcd5a84e558ba1632e81361cbfb2715ab9fa3d579aef34157cfe08620975813d9fe920e311eca68d9da8ac683d4c5ffd57c03f9174ce1b6c58fb2e14cca376e34112ab1bc736956b41978cebed690ad16294afa2ba0e9d8b5fa7e9f6f2f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/06882dd6d50dc8061c56b887fa16764a4db5cc51",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca401000000a89fb6d18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d9010000001d4379cf0321668a00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df9797223689870d020000\", \"prevouts\": [\"d6ca500000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"40f93b0000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dab42da502f2250da43a527a2c86d70ef22e86fb8286b7cba8088edd55a95ebde8db2f81248ad9ed5128a6abc5bb92ba3aeb558dfcb95d0b55c9fe030b8e1ae1c9fc6c767d5aa72b6a61d813f4dedd67fc97d91e71acf86e276ab6f41d1da0fa8c03caa221836b2e776996c8fa4c69c403af6889ee9c99c5c1fa82cf4b3a1b61\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369bab5c143898502b1abd6718354496239c5165981c0d5d614586abbdfb87575999aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4e05de1aec4dcfd94364dc697d2506f2d3dcb95f0b1cd2734b3ed6d289f30b19a3cace0aa47e1a0afcba116b3dffe01d164ab3e15a9a2b15599aaabc05c638667\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/06aa8b12e6ae5c391fb3d92c4050218d552b6923",
    "content": "{\"tx\": \"97afbbe90160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270aa010000007d516c87016e320700000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acbc030000\", \"prevouts\": [\"432b100000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bf4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cddd07b9b59a457ac18abed7266986241d091147981a1ef9d43f6473969f25041ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045911e2ebc11e8ff6aef3c08be5d8086fd4b944e3e1f7063038c1b6dadb4d48ab0219675e68f7f320420702225b2b85f84783248daa0c82b4ef34e304883a54210\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c00247f9d8df68482c9cba9042da753e4cb10c5fb7c4ff28bbbb197976934ac148ad690b4db681210d49373d4012b83591ebe1050d9c81702caad07f4cd5bb9faa736b6bec5c04b20c5b38998d4f897a7594adad2cf377758bae1284900c20e3219675e68f7f320420702225b2b85f84783248daa0c82b4ef34e304883a54210\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/06b7ea9f43da11b479b267aca3bdd7cf6fb9cfa7",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c8000000008115ba958bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c485010000004a1f0fbd0350b06200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7624b9d51\", \"prevouts\": [\"7b22320000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\", \"9234320000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063c268\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b9602a0fa147d5a6995f53504151ef0f1c99d37971b01cb6c21f8bc7a527e93d60a46f1edbb097ed18057c0e42fb935953c4336ec9d443d16e55ae39a225d9f2f0288dcf8f2e1e03125ab45cd0efca3a23715e7661e5c17627e98d50057f87374b5cd80fb8cd7c947a98554a389db356265b198fc72df311d010d98c3d6e3928\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d5c78237289a8636bb429226e0de9c7befeb1ddb6aefa0b188bf3d9b51e606da144e2b32fb029cde325456c88021dd04a80b93e0665f7e39c1e8a56bfdcaf4a64b5cd80fb8cd7c947a98554a389db356265b198fc72df311d010d98c3d6e3928\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/06e74af8b10a6ab9ce11036f2747f8034ec3febf",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7900000000f330f40adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b590100000008d985f0031e937400000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac2cb95a1f\", \"prevouts\": [\"9343500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a6ef260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_be\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"efda24429d139dd7964b3f3923dfff8c4e7934d53387dfa110b912083d14f9ea5ef852d3ccf60772a205f9e5f658eb3aa52b90cfeb83fac4c71db46599a6608e81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bbcd15b5296d5628463756efc7405c482007a0ecf43b2a5b1b60c1f31447b8812a767d8c06fadb8014d21ebdc22a32ba279b328020eab220e95008123bab3ef2be\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/06f54531f7cc822f36462b303f5eed8313ca07f5",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be500000000e3fccd6e0404431f0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acba000000\", \"prevouts\": [\"a4fb2100000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"304402207247050860ceb4e196d3b1f5c057e6ddd839afbacb556d7f7098e299fc8c78ea022017e3c0252268a13b78d7351d3d3ec355c8f6620cc53dfffb6ae119361e21450c02\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"304402203bd0af9847bf68ab8778f9160de97b5e9caaf7e8e5b866e72bb6c3dff5c3bc3d022079f5d9271d0a58ca69a9dadaafc365350b753d7bb69345d335e17ee20768a88a02\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/07249b6446b452a9005766194cb824b77c6ed600",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d8010000000971c6928bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45001000000c3f02c01025ddd7800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac80ae104b\", \"prevouts\": [\"f8213e0000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"65c23d0000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"2f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e478f34169e056cf51b9394d2ada3735c0a63dc9f48f236da8ac021a74c045d29ed6bb91bf977e9e370b444e9d5512cd4ec7f3694a9311c01272a4c1a167cd930\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360eb2d35c2916f6ee10417bbe503f487f009b40ae689b59f28732d8e6ab85ee945f3be5f8f698e83d3665b890524642b89b7b05493241beec338309aba778c454d8fcf0fa02e125fe1892f3caadd01fd66f2ae3104b90b9e35e4c43083bce335e4e9031d393e93ec4f3e9da8fc51e83b82f31256dd96ef4af94581a47eb5c67bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0725dac7b6c36d404b706902e2a350065ba66fbd",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c489000000005bca01bcdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba70100000054f58ac701aac509000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487adb94525\", \"prevouts\": [\"3bde380000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\", \"b5601e0000000000225120dfb9bbe67fbb4eb318568f7b177f9ecde078527d023b90a4ec13e543e4037efe\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360f84a3d63b5b1872a1abd5454056145b48969a3f6a653dce575a0a82ad7f58cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a5d616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/073b21ccb622912fef49f0555d5ed7b6ea85ad7e",
    "content": "{\"tx\": \"56711c2a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b55010000007a913ec4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccb01000000598666940321156700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac6c010000\", \"prevouts\": [\"f4382000000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\", \"6595480000000000235a212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"d4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51419220fa8a7a918b3857a082d32be9fa2ecc61d36b58eead0239ee9c5d9d4afcd5a470b8497850c3a230fee464eb343180400453804118582df887251250b2f1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4ef65a7bc88e8caa9953fbbe68415f348dc7b3deedacdb598041f1438fea667b18959ac4fa8a57d164b76708dc6f63c2efb2484bc5a77a391ceb66b2f5ad6b35f745d0948d124101db49c294d83630876065ae400dd84de1c183cd8c786ec24f9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/07904e76401a888153be57bdc173982a4396aea3",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0502000000d16cb6e660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127073000000003ed0908104709196000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acdfd17120\", \"prevouts\": [\"10ea8600000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\", \"a4a0110000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ad9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936725108a440ed4012535da7c85222e4fd4d60d8ac1b151397c12e7bd31b62cd6b31a3099151dd9022c8ab6721206c57c00ed937e9f62099522c543aef8c2ea8dec19ec7aa48c905d8ed6637f3c17c0400a43c560e5c859444683190ee16fe2235\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08274c6ee35a9af327fa74c94c4ba87a09a7dd613a1ede58e30654f1c4a24a66737074cc5cf84a1d913e1f5647d3427cc0d6d469f0e5b86c78a49890e87126542fa0e1c61743bed8ba943c0dc40e80402f7423773c7111097ca9c5a140b1b3c94b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/079662a69dfd16ca9215a4e0c822fc44641e72ed",
    "content": "{\"tx\": \"c99d682202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5e010000002c0ba2bebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf67000000009fdb47ec02affe8e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79659a35950\", \"prevouts\": [\"2cbd26000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\", \"dbd56900000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"e47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89220988768fa939e91d6ac18545dc908ae35e0fbdf4f2079456a337e4567f1e2befe4cc2cebe7bba8b4a4f82666342333b91a450af49acc0f1954b5763bfc142\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93627a793cd26d083ba6aa51290dd61966260e2cea77d3c953e5a10e1c750a41acd9220988768fa939e91d6ac18545dc908ae35e0fbdf4f2079456a337e4567f1e2befe4cc2cebe7bba8b4a4f82666342333b91a450af49acc0f1954b5763bfc142\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/07991f2bbd7bbe3fad499b0c428f795590321613",
    "content": "{\"tx\": \"8e8e60c302dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3d00000000e9ad4fc0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfe00000000630dd0fc01f5cf80000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478754000000\", \"prevouts\": [\"9422520000000000225120396e1e3d37873693c049a0e141d36811f0051f76fd306cc6c1f2259368cdf0eb\", \"671c5000000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"737d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e85062220981136031499d54282dd1dc217e6360b68c94112219f47c832c6b09fa8cadcf9bcd23f9249fd09eb8b2b9ca63044a0ccef58f4cae9402f6ead4c2071\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa1755d4e71afcc10f3d2573fa2263bf007b883f1245d387f3f26fe0befbe96d0f3ec5aec6a85c1ca54f3417a27e00c281f3765ee450a46261b59de169989c9a702c501a2f323d94577f3c4b353be8e702d3f9991edd341efb02c3132264010bb33a63f37675deadbbcd666ca6b38ad7090050f3dcc6bba45985e955ec185c53\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/07a56716b603afd041d05639404b37744bc2b83c",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1f00000000624a02eb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127095010000009ed305a30279d36200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac70030000\", \"prevouts\": [\"fa02520000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\", \"73761200000000002251202ea95065368f678e25a669a7906e1051ddb7c321fda55e7bd6b39829f3117b75\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cb4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936140d663498a4274ecf7f45240089a1df766efe22ae76bf8a987a78cbf23a246a1937db199a07e1996385ab03857d8e2ee63e136796e4b408281aef544a937c0c73f74a88798a5fcf30fd7aa5fdae43144d667a238076c6d52287fea96c6e3fd1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52cb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93604078a57b801774f1511fcfcd4e29746b07fc4b44c1e1428c3fe5e43ff6be5a920e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e191fd70f8e44f42202023c580ea06f1578af3f03a2439147535e7b1f16736e0d18859d05a814eb862cab9a6acf3b7acf0881c47896b22b56466b77992f62c0511\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/07aa3010d9cc23f67f6962a7c18f7dedccd7855b",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd801000000872a088c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c418010000008af1d13301eb745300000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3d95c32e\", \"prevouts\": [\"a1705a0000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\", \"2fb636000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"897d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08246c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa58e965213f8dbdd3ccbab86b6d585f0f8e78abed831015bbc989f3cab476ce59ac632f1e88e109b3d5485dae08acb0148fc939094c3a94300b3efbd66c89bc20\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e8e7fff1bca432c9ba96d0556d2ed7bd47849d71950e18b52879751e42d3038d46c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa58e965213f8dbdd3ccbab86b6d585f0f8e78abed831015bbc989f3cab476ce59ac632f1e88e109b3d5485dae08acb0148fc939094c3a94300b3efbd66c89bc20\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/07ae5671fc31d245f515f5c967b4e7cfed38567b",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702d00000000d650368ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8701000000b6f15db004cee659000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7efa05528\", \"prevouts\": [\"f62210000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\", \"f6ee4b000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063c068\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93663c49f3bc9f550c63855e2d5fc0a261957d370018a90e39a0a9924b5c04b4f32f827dd3f971806aab342b51fb6c2519c5b3aa410ee2eacb06207a66da829722129de37322ddf566a2356077a247b666bf816d75bd62d8842c555909c8a1545e03de843256fc2f72424a897ba91cb5d3893aa03eaf52af3ae765db300c5c19165\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d753e4c48a29c49a51002f402079443dae545bd96b00a3a5880d5a88ed66a5a500c8753d4e6010499b58065b36892efcd9281a64e85ebf7c5dcb8f6f4baee16c3de843256fc2f72424a897ba91cb5d3893aa03eaf52af3ae765db300c5c19165\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/07b8ee857d10f18474e7471c3c27d10be12c5f25",
    "content": "{\"tx\": \"02a25573038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44300000000a45df2cd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d7000000004530aec2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c62000000009004818202ae91bf0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478724ab1f33\", \"prevouts\": [\"520e3100000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\", \"942a410000000000225120327dc9effbe915b227349282cadfcd45dc438d4f1c3ec72713111ad7587a718c\", \"f2415000000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366db23d78c6adee92f78ed0a395ed560dcca3b184d0294b17d87d5ff6314e6d5c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a25616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/07cbbc0e4129794730bb9bb49d334b497f11b422",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6000000000f1c183f860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b201000000b9cf07d303a0995a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca2e5a443\", \"prevouts\": [\"478e4c0000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\", \"d047100000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"717d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa135cf860bbff3a99fb4ec2fdf299b3a63be6e4cd6baa7eae64af9a923e2398def4fdc20f1f5535ceda7aadddab857a143114b7886b058839365016ac02e93c97\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365ed3e5978e160b34ed2da7d8b0e41bdf70d28308fbcd927b9d3a78fa41469786135cf860bbff3a99fb4ec2fdf299b3a63be6e4cd6baa7eae64af9a923e2398def4fdc20f1f5535ceda7aadddab857a143114b7886b058839365016ac02e93c97\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/07d68512aa206614c478ec869a8b7d4f7c32333b",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700100000000d4506fd8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0100000000c19213868bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4df01000000e0a85df0028455cb00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acece8b33d\", \"prevouts\": [\"2e421200000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"1de97d000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"8ed73d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936070bb467edca609e1a3246a8ba31e6266509d0d4e74e5fb2a32359b5f156527204d1c6645dfa5bcea0755bc1d945f129b754bcfdfa4df703b30809220c35586032cb43424d7ca27a7abc5fd0c2fa249f92b1e992144deb3864a86d466f79c2cceedc10b0e9ea9319d9c2157dfe80b60aa665931711963da9ab109764ff1ab789\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93672fb7b0b8b9d34fd164052a9d1d97e8f2f76026babd1f73e719809b132cf1e5b464f19ce228e2f316c50129d6edd6267acdc0242055b306d7ddf31bf4be6326132cb43424d7ca27a7abc5fd0c2fa249f92b1e992144deb3864a86d466f79c2cceedc10b0e9ea9319d9c2157dfe80b60aa665931711963da9ab109764ff1ab789\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/07ff10e93b7bf06e8da854a647ad08d5bc902326",
    "content": "{\"tx\": \"a890ed2e028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4dc000000001f541de760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700601000000ecb8d1e201aa403a00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac99020000\", \"prevouts\": [\"ec3b3f00000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\", \"f06c110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_9b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4a759f3cd1e4a0694f3ecab49b9fb8b1105aa45bd3fedfc0e466ee468604f08d6b0f0b51c255b1478f34acd7e9282b818c5005828be1d56dd641bb72d72b465681\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1604cbbabe361b73faaf2ef6187ff51b79098bf820c004152c14e1af0d6048e47c451ccefee48a1cc76d0116eb1185a950a8565ff37f7ad81c1e66d36fc41d709a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/08106eb8543994958b201f3ce5f42dbbf19adf37",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7001000000fe2a26babcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfaa000000006e3943b604070dc800000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df979722368987fc927851\", \"prevouts\": [\"7fcc4b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"59217f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_96\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cec646cc69f13f2bbcac7aaed897dcd0b3d9585a286fcad369bc4b434669e2be41856dc069c2169609f3dcb3898a0a75d5b40a27f2f623f8b09d4eaa8f4fcf4803\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b03291d79fd59944fa0c87ffeb37f8e2a795a1d103f274afe4db0745384bd147f0c8ebef1091d6d71a5f59c5c636dfe2b42c55bd290809e2a3575216122904b096\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/081a75fb52ef536975050ff3192f6c516b3b557a",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8d000000009628e1ab8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f10100000041654ba460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c200000000352cd7d102283e7a00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7eca46228\", \"prevouts\": [\"be4828000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"99de42000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"344811000000000017a914d574841bde7bf0817694c799002118e85acf040e87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"db4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361eadd57732c956dfe38750ac99bf9f6a185a50e2b535aa6e427b8b7d9ced3e4c3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082a04823906532712c3d4cb334ae6c7c41a1294a824a25b5277d43f47953a1da33e053a85c36f8a6bbb26ecc461a581c33f0f0e79993e29030d20b8bcc8871f830\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52db\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fdf92fb2c16504bc9198e70ee5e2872df4025bad8bb2a722e84a5b213bdb644c99aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4ba0f4accdd80d494e1b95824e4feb55c95caee559d90e25fbf6396e2b6be61303dda2dfca806ccc9c3ad62846e64b9ac16121de5d926db5bebf2e82f8dec8d2a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/08421b069ef3b27abeb764e8412aa879c8bfb0cd",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700c000000003eac70b460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707f00000000d49919bd011e8c0700000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac99020000\", \"prevouts\": [\"e78610000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\", \"39a5100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"267d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2135dfff529a8c82f4e399fa9509c5b3ed194ad634f2dd2a3feda036a1773d4612b49f68f31842330decdce79aecc48c70a85ed65081abd3cb605a7bb4f89ac9cd4c02f64c49cc162ff9325daec6263c98ea78a2c5346e44c6d55d79722c7edb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361698797c10f7187c2383d0e226dcd2087587d02c12a3e721aa4a470e9466395a9ed12ee2db6918b2bff03768a1c947d0f4fb00a38b9989b1add1650628df27e9913d4be53f363cb6dc14d29c1d7e4819045cdc001ac228b3b700074691e2599d91e402d116972020cc4db8f7e1431e7a7416668817d422dd270400f40dd8d238\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/08630f23c6a755790aea6ed91128183d6ddc8291",
    "content": "{\"tx\": \"67740b64038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48b00000000cbcacdbcdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0a010000009adeb4bedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd9010000005dd15aca02d7dc9800000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac56737540\", \"prevouts\": [\"ff1f310000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"d85b480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6f8f21000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_3a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1baf12dd595451dc6e061dc85971849281a59ce923b4dd9e5c71906b5f1aab7ae1ad709d24f63537e368ad07b86fdf8747a3adcef89d5d0ebc19d640d885305383\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"56f2474ee41a5df06a56fb69998211768db21c5418bbb1df3b9baa95b084a65402d9195bb969be51016361e8d7bd3a5a148737533394790b737722145711ba8f3a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/086661b19fe6034d3748295413e2b4d4251157aa",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e601000000f77c8100bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf780100000075a884cc0355c5ac00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd9000000\", \"prevouts\": [\"6fdb3400000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"f282790000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_83\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f34b66da181de5b1e7cc51a57058c475f7ad24e1d1bb4467c6db55c2faee0bd10e8195367e7f72d51559b0aee8c60eef65d3e1ad6fc11f0df622b437a999653a83\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50d31224d31895d5f93214e389286652f6716bf1e190d51c9b23c1b205b5ba743072b263b80f96f7d373613400c7547c85c9a6c31c55cebcafc8a8c9dd42f67ab9f66679e23e5d1aeca7d76d761fe889aad74eaab38bd9ac5093e43d732ef19131a45721770a4c6fa3892249946f81f8a22ec2b808bf909e9901e6eede46863cd8b1b6893ef793c36e5dfa85d62fef0fbefebd0bad4f9a865cc0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2580f77d8bfc0fa5330d36a68d182c3d90a9cb020ddb046a9ceb3486c59bacfd142ec9637a3c90b908fa4fe710e4a1cf75cc11f03547b8f74e130e1c1726e5a783\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"5057a54fbd5d4b07929441b26b64d130112c537fa56ea4ac84c490dc2f4d68a42c3570b5f36314017256e821f3bc76214ef0b973ba2d3f3a3a66e88df751\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/08a0635b26ef56d2f6ddd4c31295a8bbde840584",
    "content": "{\"tx\": \"4cb277ca02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbc01000000987c9ec48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48a00000000ab7f4a8301368b720000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7960c7c812e\", \"prevouts\": [\"9c487c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7b65400000000000215a1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f8715e58be64394a10159f3d1c9c715912297ee6d2210f80979aa46ef71fd8cbac68d41553095afec7b14a4e3f5cc081463aef8d2ce3d98c0e772eae2ab24088\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/08a19ba6422f65b65cacb3f20b5507bca39fffc3",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe800000000f78152b3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3501000000776103a803669483000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58000000\", \"prevouts\": [\"8c6f65000000000017a9148bc1125bf4e3450c593a5be1ae9a05461832d39a87\", \"f6cb200000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"8d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0829640e65f27972e690b56e28a8f49ec76fed3450565b59143bd547c42619e148d8047789ecbd47ea83af97bdb87f8422a4707031714ddb05eaa38b24e158a7c35\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360a8a801582dd903a75de5904df4445cb714185a34938b03fb7716e9516670c429640e65f27972e690b56e28a8f49ec76fed3450565b59143bd547c42619e148d8047789ecbd47ea83af97bdb87f8422a4707031714ddb05eaa38b24e158a7c35\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/08b5c0ff184e15e9c21e4949e2382b9a71623d3c",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfac010000005fbc51e78bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ff01000000a025c78004003eb7000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acfa151a24\", \"prevouts\": [\"c84d7d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e9ba3b0000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"bf\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936db7a6a7e9e2eb861c5b236223f8a0e993b636b19808476c0a20268bf09779a38cc596949c599e703b9191d3ba022749fca5ec33c3492eb5532759cd445d2634b82745fb8509382ce1e64511ce3c1d55be477e9687cea49eaad32aa52098dfc07\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365bf71cf7816bf4c839ad04f64c439f60ca1e0c1202f6058d0897192eaa874d9b285ab48eb468144e5e6aa7ce6d4aa75a792c11a68b383289399495d27c15055ecc596949c599e703b9191d3ba022749fca5ec33c3492eb5532759cd445d2634b82745fb8509382ce1e64511ce3c1d55be477e9687cea49eaad32aa52098dfc07\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/08b74fd5e5bdcfc0a22933abb14c20399138f612",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf21000000004676830d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41702000000bbb7591260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707600000000094760f703733ebe000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcc56f0646\", \"prevouts\": [\"044877000000000017a914b1a54d09172ecbb89289f2a670acc3fe14ced9ee87\", \"4656390000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\", \"ea96100000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d7b6456f201cf74ae23f528fa19076a87cd6787b60d78d7f8cae6ede245595824cce38957e3567f0634717543ddf7bae1e1d4620d2ac610a556e520ac5bfe7c303\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bc8faa4589338734df135c0ca3414dc0a62163edfc2c51b5f64898a53408c21f74f08cc0e3bf557b67b5f4a11806ccb8b0a65312491d3a627c9569459a9e998d03\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/08cb0cb08cfb93d7ca744dbf018072b119fbc650",
    "content": "{\"tx\": \"14fa46cf02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4801000000d70bd4f0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c64010000005783b2cd023169cc0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac6b25ab25\", \"prevouts\": [\"0c20700000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a57e5e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_2d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7e300717a60ac55fdac518e5d9429f32257a2306c8a1ffdd0330ee8746e70be3277f2adc0f58c46255c40342ea996d06c4bed5d4b5334976cbf2177a1ee4e39d01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"69677d02c38b008c37dd52c9cd225831df3d9dbadac2bde0735c2f75b27472a945948273eeb2bfd7fb1d854347e7e8750e9cdd3fdd330c1687ff9f0a80e783de2d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/08cefa50635850a5a6caa88ddae4d4e4c5178f8b",
    "content": "{\"tx\": \"1b7091bf0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705001000000fb6c19bdbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf80010000000a4e7ece028b5f8400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7e7000000\", \"prevouts\": [\"8822100000000000235f212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"1dd2760000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"57e0667e28ec049022631f787411974501133ec1fc2911cec719d1de6efc6db1783e2089ab96f7027a37435dd54893aec2a1ee758153f939cfc2a7f48b78fc99\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0918ed067691e99a0ac65b680c99b8a0bd6d2dc2",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd50000000053f403cadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8c0000000080e6db55bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0b010000007bfc680003fe5216010000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc79aa1c358\", \"prevouts\": [\"f266720000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\", \"bdf22300000000002251203d5ffb7cd06f5c84b56ec9f73ff7cc3a22b38565d229330748f260d30800c008\", \"acc68100000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d44c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004536ccddef3149683af65c31c85a3c06583d8e56fa5e9b8809ad6476a55251e65fad1faed220136b938a4936a71b98f5f9e86de449242d6a82efdf7a3adba2ae62745d0948d124101db49c294d83630876065ae400dd84de1c183cd8c786ec24f9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52d4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936455dd346a6e8884f0fb95ea8c71bd7948dbe722bf7c03e38225b2fa9604e199b70b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d8657208959ac4fa8a57d164b76708dc6f63c2efb2484bc5a77a391ceb66b2f5ad6b35f745d0948d124101db49c294d83630876065ae400dd84de1c183cd8c786ec24f9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0920b0864e2f856ec01587533e768fdc9f982a59",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e5010000000f6b49bbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf66010000005e3d45c0020d06a1000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acc2a8f43a\", \"prevouts\": [\"777a3800000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\", \"e9266a00000000001652142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"2be378d8e07bb734176317b5e7115c5678dbc8a9b591e95bec222e3bd303eed6c64f6ca230a44c3e80ea20e10c772c1b3b65825a41f508baf4cad948bfee4af4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/092dfb3e8b68e6142fcb0a354c4d02c23428b870",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2600000000d7f2c4e302b2435a000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7f7030000\", \"prevouts\": [\"74175d000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"483045022100b90463b19720a17907e34d06465ad5f60baab23b489b42b0e5f2e1256377f21402205e684ce7490e311ff071e05b8eb208c04be3b4bb035199ced6f6668f6a953f7b2f4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4730440220412a88fe97f96fe569517b3cabd861be17ea143bf28c30205a0c192a25d8703c022006e1ae891ea74bb35556d88cde9be264e7722e342bfdb5678019d09783d737692f4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/09342cfa6e3461e698ef1f6aceb83fd4a3ccbf35",
    "content": "{\"tx\": \"02000000012e09ffdbb2069feade9688806d408b21e4e24b0581b653f6a686a5bf690596fa0000000000436cd2f903305b7ed20f0000001600143f886f8feaf75ad7bedd5713d4d148e7c97c1134580200000000000017a914dfd1018683cfaa440400f061c02b281ec7e8e2d887580200000000000017a91402e53bc18808b3955166f5113b83b265fa421e998736050000\", \"prevouts\": [\"12fd7fd20f00000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/keypath_valid\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8736d0e96fabfd24bd45fbc3771242ddb5fa61dc00c00bfac51f0a981912f1b36c103fd984b420028aae849ab44624cb8301d97984442513133cafef4151d6c5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0942d800ed811d505130b0e5cca50e722fc4f19b",
    "content": "{\"tx\": \"2a4ba92a0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270680100000050b312a0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6d01000000f7b1108603868a800000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c6020000\", \"prevouts\": [\"7995100000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"cdad7100000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367cbe056fd5524803d39d9d872de87d596ee1d58542b57a2a09fc467d443df29299aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4c1a4178950446608ddf8409535ad79bdd567504e9e3f05b7b17ad70ac9eb9eeed4a2033150a39b6917f88ea297b4f989401264ea3eb8667a511a69e57850c639\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c88cdf200e9cb41c74ff1734a224bd622bb601baa19704ac4140592d266c2a7878d069a3e06f8a8ee706e51fefe68609e4a48214bf7e1dad1e46f763a0ae6da54d6fbd68a9aac62cc0fc4848936fa6d465cb32a19d5a751074f74d9c4f7fb368ab0b669047babd6208c97c1428e12fb9e633b2b0d2e51b7853d96a7caae1fe0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/095bca4fc65d75681b759e14d34e7a5987625ab4",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b74000000004fcd769dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9d0100000099219efd01df608a000000000017a914719f78084af863e000acd618ba76df97972236898710000000\", \"prevouts\": [\"b816270000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5df17c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_5c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"47c95e08771f68bb9e4dd1c5cf0be918327f9cedca27ad3ce00ec22c227394ed60b479071b0570e9dc435e6f0d60f84d5beab93fcb4cc18d0c72711ab2a094d382\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f15e080b96ee4f6a5117d8ced8ef43e304e35c5361937fb427282ddb0df9f539c8acec89cd4740689854b69148286c50ed776429aaa0fc8c4620fcf04e23ed865c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/097dbe987c217c3d9b230bc0e634a9e3f0bab2fd",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cac00000000e581b6e704f4065500000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48779000000\", \"prevouts\": [\"32dd5600000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"187d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eaad0670a1a2805483e1b6119aead8e5c4f5e2d65383350292f138c62bc77d51b80858ffdbef3a81ff8eaeb69bf692b0617d2bdcb9145576d5843e6d9e5e1cb0c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93658baf989b33fdf7a985d181ac7c72c0e79727fa5bf7d6725e5e076c24bcc85c5aad0670a1a2805483e1b6119aead8e5c4f5e2d65383350292f138c62bc77d51b80858ffdbef3a81ff8eaeb69bf692b0617d2bdcb9145576d5843e6d9e5e1cb0c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/09b3e7123f40c4ddb240073a912a440a18168c13",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1101000000a081b3de60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127053000000000c7b5fdbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc5000000006f40e899046516ab000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c6030000\", \"prevouts\": [\"bf8d4a000000000022512074a4c3567b4c4ece2d1ea256a6bf2f85bf4dc051497bd8ce7ed8816e2d4c108a\", \"befc0f0000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\", \"19b35200000000001653142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5dcfa6aa91ce6da49a5c1dc23d4fb246deb6a5a93a275f981169ecd31cdf0e4a4e034b8f7a5c641927ca17720284b3f5e34aea6d9c96f79c6745e63a6fc75369\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/09c225b7d61512e189a466c46243a4511b6eae8d",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6c01000000b9a21ffd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127021020000007ef33ff3034d9e330000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748708010000\", \"prevouts\": [\"63bb250000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\", \"75911000000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a922ac303092a6cb80a96afd5c7c243ba2385da8ab4baf3331612d0b9d31d6a7777e5a97eed984c98f8bc097a5ecd26814ddecb354a6d174fd826a31e179fc1bc382eac721f5d77f3709779bcbce4280b42008010e70d0a562a81fa2c4c1b7f7fd5b6fb9181510151652fd5eb41d40f94ed6292d29cb5ce365c2b2d5850a9d03d394d510ef0b1c601e81a235ab43c62f13399d7091a1d57334da623f787f533ebb7fbbf6a5f765e9f04e174764a619fe4ea8fca4ef5e0cb0b0c4f29d680fb28ed99b4258b91f82e5a2d3d59be20d98ab0c1338c62b36ea4038535b61d4d2d177b086aefcb77dfd85712b1617b9c7b1d65cb75d2ca349b739fed1d2abc6ce3bc714c4c1021e3b25fea1c3d07e02d5f12534f4e91cae5160c28094d8c7246fe7c6cf7639eaf5c65825e5da682018cdc3a24414aa77a36768f52e0cf192476ba0c879393c2d1b17cd8b2c32990c74201177ed022f6a9af26b2354fad690e9b23e2a0452dfbcfbed25660fd4e3d3e0c3fd9a9f60aac3b30d60b5ff1bda95d6b792e78fab815a5d25254cb36cbbe93df4ecd777f365b19320f34c1ca884c8c2a8493458a49b851efe928bacc9aaf1b5bf1eb83458a09cfbac7639295f1edf9c7387050c73bc4444bf11964b34a07b30dafa5fb861f7a61c485e83c0dcb6f6799efb743f91f8eafd31e3607a01df8ddc07f645ecf372e81d02bca2cab5a564ed6dca8b1723168fa0df1743c875e3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900451741062de046b8f3bdf7ef41b5db27631c489deab6fd85436806296af4173e7e74166a9b0f1c55c1671126e5eb7d3b70cf827ee1dc762db7ef6404d6cf84ba0da54f7803bb2e93759f587214c70a485617458826e57c89c2ab5c5e7ce47181a1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090268c590697e1ff9c25d1423bbc25d5b0159c38c30fb65a06cbefed7e0f0791e50aac7b5fc03b5cc8975d160d3594d272235a6fc4521f0f426f479e061e99ffb0caeb42a71b452dcc75b1e8e4f7595a597321e15216349e58c0c79569b8308944cab79ba12ad5355a6e4a0b9ba7f6be89db13cfac2687bdf0507f9bca7395d557c7b437b6be9902e38b4060006fb8219d474e923bb36808c9bc270f037b776888cc8ea3ca7f9b92400a362441778f9e1c8a13c53450a996c6f2e78e5307eca335f33b12e1b0f000de1401cd7f1eb3ad1e988f4db7917af6ad83ad232e9baeec51d4f306a1c4a32023d1570bc8f5e952a2f45211252950663565feda7336528943fcf4a8a7a23ddceae03d91048bfab3bcc4450f9c7cf7318fbe8e29c970938530bc4b80c36570982b27d0055a59311bb49894b286f753ac93681a4c663bfd8cf2b72c0fd2bb68098a8467508dd4220bd75eb2fb67d9399b2c277d936a43b910905fd7444adafd95ed169ca118b00b380a4ad13f663f49d4dc7dfe2b09f56069731ec1749fd2e246a3752d5d27defbab850abb6a5a158044428224d8314aacb93d68e71f4fa4823514537be93d1a65b22f066d2bdb188308cba8a6d04e76b51c0e0731a9f0687e03dfddcd0b0063f41e25fe4c6320ffc2ce7565386c9dea17b6e2257e3224bf000fe59e6e8a35a0cf3847f033b57faaa3def005bb597bf0569bb7a473885f1d912b07e3c7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362dd9a6a816a27714ed943cc25e1a1e39dd34d5569d3490ab6023dfe42a6cba430277e21fac1036469cce09bee47dd6f35fd38d265061a05632a5c9d8280907c6449280c515e7ef393424f0dc01282cb8b28e26e76822dbd41f29cf7fcf3ef3a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/09cd349f59ff286840fb04789da01062c5d83ba2",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbd000000008b1e38c6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6100000000422eee7f02753dcc00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac466b3933\", \"prevouts\": [\"6b948300000000002251204bd530dd92500289ca536d9e0216beec7b39c81554ac6dd1e9e4cc3828e76161\", \"7a884a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"fa7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ab5229b48fb31f4aebc56e2dee567bf7ba352c6c3615b44a029752a401ad5af48c1a9074fcf4072701b6c332871422b1ccd41e69925b4b38aff436cff44d889284b3c1002850d4c89a68130d64a5a5ee29d0b1bb458f5120fd1f649ff1c37e66ac496a48f5e08c9a0063585476106fe61a3ff4222f4c7aaafd1f65bf01170e2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936048c253878ae3aaf7983b8b419d3ff5fe49de177c40f616b90817e056f3cc67b06f1c7e5fb59ec6be7dc8dd9b5e5a9bf4b5e4bf2d4887cde3c9822cca7ddc75b6ac496a48f5e08c9a0063585476106fe61a3ff4222f4c7aaafd1f65bf01170e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/09d7f478f35e48679ca5a97a08febfa49d510081",
    "content": "{\"tx\": \"3995509b02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c05020000006f476edcbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8f000000009096b4e5019114a90000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000\", \"prevouts\": [\"0e825f000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\", \"336a680000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_8c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b2dd830aa16a9fd3b8a6d567462260d9063a4956bfcb1980cb68c50acaa289321d9d3311794ff9e589a3352d47652e16e9a2675b0d2d6e41b4e9b235f2c152f582\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1707541a32c6ceffb3038cc9bdbb74596608920000379ed6a93c3ffa61ee638ed6d043198826f277e11431cd2d2fafcd80a191656fc8057f0a7ef98c189cea168c\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0a3e2dd5f11a2182d7b86b927a600bde565229a8",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46b000000000540a8d7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd30000000018732d9204c7b2b20000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5c000000\", \"prevouts\": [\"9d083200000000002251202ae35af575feea0dc18681bbd0ec0494b44b5926493fa5426b4858bf97ae878d\", \"4972830000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_42\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8d8c44f14f15a7529f6ebd2573e08047a72348b7133320ea9b5d59bcae5d14810c7d770be878812fbb9c49135ba1ee6658ccf1105a661e74458a2e50ebb2d3b083\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"79db11fe61cced14eef34b841c4b89bdbd475ee0a749a817f406b3acccf937cba5b5568c9a20514887def0d5422a639187d1feca6f1182ca445a9e3d3d547a3842\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0a9a9a6e04b0e55c5a90ca23c2586a07ae1fc542",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6f01000000928f47ca60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c1010000000276321b048f28600000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc1683433c\", \"prevouts\": [\"d36254000000000022512055d32a9b44ee6fb3a2a0e7e2d6444c6afa4ce43aaa0c5357064383c70ed0d31b\", \"3f930e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_6f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b9dfa6e4602a68a3e727e8b6324c65adf31bfb0e849554f32e1be32860dd177e4feee48b1caad022448907a02332badc78c44661afc503291886d71fe448dc3f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"58f5560fab5895e3dd35ac7aa23d8113b7de0cb2df256b3a4900aa5264e93995bc5e4a3c7ea6f86156bf998769485bdbb30fd2725359835bf7a6be8336454d8d6f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0aaeeea67c9e79315c703c56429535fd670ef5aa",
    "content": "{\"tx\": \"564957d90260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702a000000004dcc25e160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b100000000af182efc0194a10e00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac93b72d3e\", \"prevouts\": [\"5f160f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"cdd10e00000000001600141cc39a492a6f67587324888ae674f2f534a7639e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100c370e2d294552c952dc54982c7ae7b7a1cb9feb56ee6637a5d18bd4bd3464cdb022040d6bf05500243fb6f1587b4aecdcd16bc12175e906527753b114b2b09e2d5bb81\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100cdc6ed9006971e967d7e22567ae7c9a89e580bc255cc7964cff1711f982d907d02200ed8f2b2d8efce97aef9c01a0e687c51fdeb267560b261f1893b6f9094ab89bf81\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0abded429f191b0375a464688f06bd465af7c644",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd20000000060f33779dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b70000000001ed470278bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ab00000000c60fe4de03dd71ba000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987a6000000\", \"prevouts\": [\"e3725e000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\", \"5044260000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\", \"2a20380000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93692bf74884f2cec72519997a0395ff7ca30fc290a0cf462789b3d1378cedb3028ff42e4d873fbb915aa5b42e254ee79c6fd372778836ebbd6336959492b60478df213b900f5cb66b025bdcf0538d69427e8f93cfc9741b2125e61cf9215fad53f373be813dc08f80e09d78de4ac5358a3bdf22545a425b50fe87daa20f96c44d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51064e90022f018e8cc473163b262248813e3dc7e43f487ab53623d6c75190b10b282285524a15c732567d099967405d35f7136f74f48f011bc4ab279ad8d14f14\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0abdf3a09f88ee47573f9509a323dfd8af89e021",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b48010000003a3e7a78dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbe010000003e008dd90464f34700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875b04d52d\", \"prevouts\": [\"f08027000000000022512090f7a6000b5d616b8fab8dbf93f0441952f14900faa8700280033be77a40eb2f\", \"ef642300000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360089274d47cee2433e5e796e01aa5462b16341b60f863914d1ab1664c5146ca6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a54616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0ad139668541c092541da58168e6488a1191ff58",
    "content": "{\"tx\": \"065bd6d102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4500000000c1b6cdc160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270180100000068d0aff1028cb48f00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a69a350326\", \"prevouts\": [\"373e83000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"e4e50e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_b6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"123416c4147c380e906aad495a06009aca12b8565d91b82769dab30b07b158043193ba7b36e47cc6017d2cc0c14454b0717af19d028c93d14a229a0ada13d5dc83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"281271137238ad2d3648e7b2f38adf379f9a8348bb23f2e000a68e8eb60bb1f9c60c6fc56b7bcef23fb9a90a32ed376974f9ed75e88119cda3209e35b1001e46b6\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0b0a37b5c9ef3c034545cbefc3e8de97c8b5ea05",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb501000000739790e5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc401000000d48d3cbfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c06010000008bfda2e203856df3000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6a988fe22\", \"prevouts\": [\"3bb34f00000000002251201aa53d82b3e96e8e01ae5203880cf5cebef0e054596b6f65010b7ca42a314e33\", \"5cd8500000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"7f6954000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d34c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08279688f26c44e4c38ecd8996ded351dfac291f6a9fe2ce500158a378a1caa9ee2234a5a049dfcee5b69ebdb7c70e6242c675d1abc9cd58c84d7f9a8e8e1277a43a4337ae81428241101d56ff91a1822e405405037c9afab8da6ba5df5d84918ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361dc8d6179080437d4f90682873ed4bbb3e32e9d0e3b60c87db9e5499f1f336eb272895df1c355058834787a12b20ffb756990efd77bd7ff75ef6e99c81f77af73e02ad6eabd24d4d247e98c297de2a9d81d67e55d72d4ddf06c8e9a23565ad8a003e045cb689fe4fc6de332c618eb0cdce02c2dd8aae7c6dd6f70bdbaede2814\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0b0f9ae5467a2c8d14e86527b264cacbf4871500",
    "content": "{\"tx\": \"6f7d0d91028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45d0100000075023faa8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e9000000009cb7bebe0114cd4600000000001600149d38710eb90e420b159c7a9263994c88e6810bc722010000\", \"prevouts\": [\"db1f410000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"a72f42000000000022512012d5e5f1356f7dd71d8fd34dd655f0d6117e8d6eac3bda425a0cfaea0a76750b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369c9aed3dfd11ab0e78bf87ef3bf296269dc4b0f7712140386d6980992bab4b45\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ab3616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0b37dc29cfcef1377a94a17297a0525504b5a9d2",
    "content": "{\"tx\": \"f0b08b4f02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cae01000000806254d3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1e020000004cedc9fb03ed11cc000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7962c010000\", \"prevouts\": [\"d7c14f0000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\", \"2f8c7e0000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"9d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e5cb645b004d221127868eb317b35b9739fc590ddfdd834a11f89e113e113367cae2f7927e5cc4d53e0e18212acda8d85e01e1da74473232947322e5e96654c18\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ebf8cf3051908396d96a16e21f9fb14717dee7b5dfac112f56d0746b9362fe4375cb645b004d221127868eb317b35b9739fc590ddfdd834a11f89e113e113367cae2f7927e5cc4d53e0e18212acda8d85e01e1da74473232947322e5e96654c18\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0b7236484ffa4dee58a006bc3b9e51c30e5cc903",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703300000000690e42c28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42102000000816bc2b260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f701000000b4d361eb03c83c6000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcad010000\", \"prevouts\": [\"3f56100000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"e9274300000000002251201d9d7b8068d804e3524a88462f1a480f3f4200cc7b90f0ee3c3216cc2f53f488\", \"35100f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_0\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c3bdcbe1e2eff48c1048119be70323e738c75dd92578275c35365df43298c550b2dda6b6b2b09bd7632c973116077c46a123119dd6e043a0a058b1f87f78ebce\", \"6c4b52258ba4ef018a012f1db18fb5ea51005404280abbe8a32968c2ea51d3a32020031152cf733f2339e64b25fdbf77a33f9b8badd61eaaa8119b677964c4ad3cbd8dda42dab5e7295cfe65d7144ee8d59407a370bf23ee01dfda5df2d8f85d909a0a8e1b7745cd9d262d7e0252b9946f82bcc303562f54da29200f73d62faac9b2d00f15e99d676cd1f41bcfc5d52eb9307c894b898cdfca520665\", \"7529dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b32506ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368c6f1ab0f60b6d27d4740b7424952ec5e9b4e6c3a2634fa4afdbe60332efe621ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000007b784d38a23b40086bfd8c053fb648544285a5c3cbd31b2ca243e62da1e820f4d41d47364315281464bb2bc7e133a14da7f761774864f1526404216e30be056404fb8040571c8f889efdf519c29ee8c0a22a7589e5342bca315d8ad264c09d6181feb0b0d6f40f12ef28a31a1b280bca1a116bc974608e4ae0f1bcecebf03cba00000000000000000000000000000000000000000000000000000000000000007a3f7f1ab29d05ddd347dcc7928b7367ebc1a4a1546562a00473f7a3c6cbcf0d9cca28d02b3bdd251e8552d7a0e9bb8c63d0967d76f6715e9dbcbc94651ddcb8ee680609b7aff51c1d9aa75ba6b47d666e0e92bc9a9ecc88a92a0e7a60ebd9bb00000000000000000000000000000000000000000000000000000000000000000df841a0ef8b8bf0fa3a48e28b09185afcffbe67dfc208294fa46558aaea9415c9df80e4514be4fbb7dba4245959f5be6017d29074c75e2c025d0e2c8f61cd95f8addca2ed8f6529a558a9e3e01e14c00915d486cd0ce24bbb8280d9a2eeea26ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6822ed0c934c780077812a8ec4675344f31d0a1f886d4fca11f71b2ca8ffcc8effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceee2ef00c3d39f074722549e72a39677df22e78e46c2dd38db485fa08abbdda1dfcbe42a832838b98369f674b9bf3dab730221099e42598963bb1e0a9d40262ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000986680564d03774fa0facae89091f858d1d206ac28b6442ee070bf6debcfce9ee963c61d1ba7029aafb57abcfc927e0e76cf93ff7e4bdf08fa3af38940687ec6e6015be418b3b5609201008328468dbec4d16a3ec5e289fb31b9a775a88752932c4f85be333f315015496ef30778a90f2134bd87da0b96578b16fc6d615b3165c03ae9316f70f8f50e03e4c06f46bc55efad0bb3f658852384a046dbf03e93c591ae2675a823ff8de9db76fbd74c25c4e47124311c1654e04acc45adcd3bc2614472c0326c6920b128a30a578c540b1cacfef48f13a605e93cef8903921f66d7e1001240797f76542ccc4aabd7691b1ee1b4ef21ba5e005380b8fb1fd83103ca4100379d987e2db9374b325e0b2892820f7d08d1d9003f65e8c1ae4d916fb24569c5c7ec9f5a881a9544e2ef1ca88d8200ec3a90a62c9dafefc9ac3208a6269e323c5129a1675cddc59abf4ded8cdbe6b8aff4d9e31c8f684cca885464705324fd838fc5cb3489ce7914e1d1331abf3fe7d5c7473c146dbb911f0ae07f59172cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f5d3fb6127668f215b35bd94a716148714d264d9f7708148d25263d273655262b49dfa124fc488476ac7626decbd7a81b514bb187f144a81d3367ea5957474992128d9f9761238fec5926078ca9b3c7ef3fc7beca4b235226aec32709e100929027c07512a6b66469b7e23bf7c50a5dcdef7b1cd0447a1120e120cabd0301557707a40774284bc5a91b179523bdc301a1f9a4b134e0331ee2981ba97b0220c2f10c5e5b67d2ea7a8766da934bc52528f141bc45f12c2e8511208a0675192b6e340899eb1ebe25dcf532599528649fe7631e08c2ce875b5ecaa85015253d44500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff27a5f874f01ba2df25b9511937f5c10357cbc3e6e2951c9caddfad0dc241792800000000000000000000000000000000000000000000000000000000000000005eef2440bb5a7cf4aa324e6fc40dac1c0182f24c80a5c50562ea024c388931840000000000000000000000000000000000000000000000000000000000000000280e73ce9d3d72fcca33d93965c67a6cdd83c054d246b63c29943fd2a9e19b09b4f4e017fabf8fc9c60acbbd0c1b2eb6870fabf36ad94ab2bfce6642becf84d084e13e8ab30ce81e1bb15a0e1f5ef6389cc07dc736259391d6561a2d1a6b63404ff00ed246db6aabe5a34518eb4889d9746b8cf0b6f10fb7b680b1bcfb37287bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff055bf56685ee9d33b04a565cd01cb749eecf681703e571753a2fd5b22428b617bc3b2028f448e7c6fb7c22a9da463f596c6ae2e7669db52a643f05a5976b2bc7e96479f87b60ec38e71f5d4045f98ddb819af129b686fa6572dd44cf13a26b3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04277e44a2347fc589673a4e101d4e013919d466cc2f9bcdc39282a85bb1af3b6431f6ac3f92296b33895064cffb34d6b60018b1d6685ebf84eac8699265b25c8b369c92418c14fd791117af0af3fc64fe9d0cbc6e5e843bbd2390cb0ca02e4aa26345d5eb934add1898678e0d0b4081797b53ec31da25a14fd8b510975dbecd24b915103d0b4a531b061c9eec6327f7f05aaf1e3a89a2adcac086f27946cbbaa6895484aab65e0743a3cc784df53820909e89b476f8f3a85f6ad3713308f35f2cfba897bf57159d95ccd5f2cec2c594d28258370c0303f640d8fccd39ab063e93a44a62fd53d3731ffad2fa26c2ce73e0b36b3bd7ef4fd5a3cd4c69b35680159205e1be6536802c983896b3dbd280b06ecb74db1f5d2baf7320094bda793815e4888c2ada5b687bd36343aee249fd77b989aeaca24c227b661bdf9919065a8f836041c27ccf576251836af5bd9c4d806dd1165f181f422fe7b4c2d9f10a5e4059b4b5b3464a70695e6004bb5787d12c865e1da166bdada7f1d1d10b3070095ad5af93cca42812d207e2fdb48159701b1bb0d5c8c8e9210201242a69a2d4cd51ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff125da1aad2c202d21a32b894e3857da7ad2189b92cb138de5b6153d142aa257a22ae748312c68ec7b05d89fe5087425449a1a155675fdb83a63f66694ea52bebfc90693be6fc486612871f3dd6f8840f974a3ee1922c6a48f3db1c3cb643a6c5df2c37540a97e6aa1dc6dc2dd7e7edb85dd5054d81a1c8352e9ad78dbfa251910000000000000000000000000000000000000000000000000000000000000000089d59173070797e1b39b3c6f38ae7b617efc5c3e535584906eac6067af77dec06333f9ef7783bacfc4a0598596da0415a64d1b1d460970a14f994c49cad20cbf94a26d777e3f8395245d7e45d69a7b24add08058f9afb66e0b72b2e844295452179af02a00d22a0716bb98d17b1f581846be6977b94adf16d34c58a460c9d90bc66952187cbe572574d5fa7fa37948e674c3e12fc0f56259f41d53d70870d1dbe87ef145a49b30cf99cd5c12f5a63181ce2d0922a48bfe122c173e2db2cd86279727aaf8e7d1abdd10d982bb935ae0d282f4d24f255880eeb7b4f6556ea10acd4be89eefafa9548d8cb15e567afd7e9e326516f2446055635c5785a047dfdb900000000000000000000000000000000000000000000000000000000000000009d47d33a5dcbc6bc50dde0ab6e957b0102659febd9b30c4e8ed5ad7bb42705bf4bbae6057afb128115fd12c8a0dd5c67fe9a016ce6b155b77b6efee28f99975abe22cd3c492cd082d1a84ca8041f3032b68e143b8b9ddfa1a4cebe7f2a0d896a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aab68dcb9ba5edb99dc0517a9d37ac3076680f101ced4036d50cdedca6e0877827c27d16f862a82a428bb0b917d69dbd78889f1ae7ed0e594f256ef4dd479a12abd741f4708efe323f9e966c96caed925e1df30bd844885b2c3d806e5ffc10239a13faf0d6e56d28a23f9ba1c3387da4bf6746ada8253a9d6151df5afc000fa77b6494acc6e4d9aca8357cd000055100454321aa8e821258e9a1fa2960ee17369590f39e8ef5ebbaf9f91dfee92fa1b301db1dc60a7a1ac91927f60508c423e586cb40cb20a4a0626533d56de0654e1664972d7151ac8d8c45ced1506b3b346a0f4f2e58b9d1eaad28153d39573ed50df12b59f5ba7c7d420ccb80227634d6e319fd65d1e7a090f83adb53bc53675c3d4ba2f1c5448737c58a088c16d078aa4f11780ce817ee436fa8709654ceb1c8ce1c5c30cd69176c52903e6c3dd897061263355d6173acff5b589da6745f344aa150b9f389de40f7400804dcd7854a30effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20cd59322096216580c07d7431e7af7bb4d2841ee7d7c4baa62b1da2319b92b4647602476d791a2d2d5abc6749f6d39198577c033841894cc538a7aeac19f336ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18dd9c054d018cb9e0a206e26446c6a13c5f0d8f9edcd56d5e402c5e99852ce609ff0d0bb4243e2a4d92d91a75c6db1152fb70760fa5c459ccb964b8599aee06861524c109334956d92b085d4d08da511f01b056feb57f71ca31257e7b596f7ddd434a83ea2c94897d047a1e0441c0c7210e06b7bf406ebe45ad1b5dac562e01598333715708e7e879880cd37b489c40373a9cb8fbcf74b53c7113aa62a4b9761938bf78928c88e2e9005ceb2136af4b8a299f1f8687a3c503b54853231beeed1ca9fa27ee78aef8ab74aec366a7ddc5c4aad3a38681a7b57665aaa99f0e20d40000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd03d954b5fb6eb9295ae6377a00573071aee29ac5bfc401a20de905bc07c7069803355c54e8ed96b7552b2f89f26b961f92e9063bcd5d151aac93adcb5c84604ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c3bdcbe1e2eff48c1048119be70323e738c75dd92578275c35365df43298c550b2dda6b6b2b09bd7632c973116077c46a123119dd6e043a0a058b1f87f78ebce\", \"89cd78a9a24ab161bdfb8555cd6bdcd8547095eadcf6d7f9a872e85ce0e7a153e7ca5269b3e885c337c715754e10c296e55165af6321fc25d9db26911daafe5034f4c469bc49e66357902f484a4dfd6e7e9a188afab10fd9e58ae1701e494e138b4bc4620b8901b58171541767e6edfc214471825ebef0ff58339ee66bc5eb869f20f5d613f6ebeecbadbcfa86ab66d5e5e6276e2e719b37849342\", \"7529dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b32506ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368c6f1ab0f60b6d27d4740b7424952ec5e9b4e6c3a2634fa4afdbe60332efe621ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000007b784d38a23b40086bfd8c053fb648544285a5c3cbd31b2ca243e62da1e820f4d41d47364315281464bb2bc7e133a14da7f761774864f1526404216e30be056404fb8040571c8f889efdf519c29ee8c0a22a7589e5342bca315d8ad264c09d6181feb0b0d6f40f12ef28a31a1b280bca1a116bc974608e4ae0f1bcecebf03cba00000000000000000000000000000000000000000000000000000000000000007a3f7f1ab29d05ddd347dcc7928b7367ebc1a4a1546562a00473f7a3c6cbcf0d9cca28d02b3bdd251e8552d7a0e9bb8c63d0967d76f6715e9dbcbc94651ddcb8ee680609b7aff51c1d9aa75ba6b47d666e0e92bc9a9ecc88a92a0e7a60ebd9bb00000000000000000000000000000000000000000000000000000000000000000df841a0ef8b8bf0fa3a48e28b09185afcffbe67dfc208294fa46558aaea9415c9df80e4514be4fbb7dba4245959f5be6017d29074c75e2c025d0e2c8f61cd95f8addca2ed8f6529a558a9e3e01e14c00915d486cd0ce24bbb8280d9a2eeea26ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6822ed0c934c780077812a8ec4675344f31d0a1f886d4fca11f71b2ca8ffcc8effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceee2ef00c3d39f074722549e72a39677df22e78e46c2dd38db485fa08abbdda1dfcbe42a832838b98369f674b9bf3dab730221099e42598963bb1e0a9d40262ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000986680564d03774fa0facae89091f858d1d206ac28b6442ee070bf6debcfce9ee963c61d1ba7029aafb57abcfc927e0e76cf93ff7e4bdf08fa3af38940687ec6e6015be418b3b5609201008328468dbec4d16a3ec5e289fb31b9a775a88752932c4f85be333f315015496ef30778a90f2134bd87da0b96578b16fc6d615b3165c03ae9316f70f8f50e03e4c06f46bc55efad0bb3f658852384a046dbf03e93c591ae2675a823ff8de9db76fbd74c25c4e47124311c1654e04acc45adcd3bc2614472c0326c6920b128a30a578c540b1cacfef48f13a605e93cef8903921f66d7e1001240797f76542ccc4aabd7691b1ee1b4ef21ba5e005380b8fb1fd83103ca4100379d987e2db9374b325e0b2892820f7d08d1d9003f65e8c1ae4d916fb24569c5c7ec9f5a881a9544e2ef1ca88d8200ec3a90a62c9dafefc9ac3208a6269e323c5129a1675cddc59abf4ded8cdbe6b8aff4d9e31c8f684cca885464705324fd838fc5cb3489ce7914e1d1331abf3fe7d5c7473c146dbb911f0ae07f59172cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f5d3fb6127668f215b35bd94a716148714d264d9f7708148d25263d273655262b49dfa124fc488476ac7626decbd7a81b514bb187f144a81d3367ea5957474992128d9f9761238fec5926078ca9b3c7ef3fc7beca4b235226aec32709e100929027c07512a6b66469b7e23bf7c50a5dcdef7b1cd0447a1120e120cabd0301557707a40774284bc5a91b179523bdc301a1f9a4b134e0331ee2981ba97b0220c2f10c5e5b67d2ea7a8766da934bc52528f141bc45f12c2e8511208a0675192b6e340899eb1ebe25dcf532599528649fe7631e08c2ce875b5ecaa85015253d44500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff27a5f874f01ba2df25b9511937f5c10357cbc3e6e2951c9caddfad0dc241792800000000000000000000000000000000000000000000000000000000000000005eef2440bb5a7cf4aa324e6fc40dac1c0182f24c80a5c50562ea024c388931840000000000000000000000000000000000000000000000000000000000000000280e73ce9d3d72fcca33d93965c67a6cdd83c054d246b63c29943fd2a9e19b09b4f4e017fabf8fc9c60acbbd0c1b2eb6870fabf36ad94ab2bfce6642becf84d084e13e8ab30ce81e1bb15a0e1f5ef6389cc07dc736259391d6561a2d1a6b63404ff00ed246db6aabe5a34518eb4889d9746b8cf0b6f10fb7b680b1bcfb37287bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff055bf56685ee9d33b04a565cd01cb749eecf681703e571753a2fd5b22428b617bc3b2028f448e7c6fb7c22a9da463f596c6ae2e7669db52a643f05a5976b2bc7e96479f87b60ec38e71f5d4045f98ddb819af129b686fa6572dd44cf13a26b3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04277e44a2347fc589673a4e101d4e013919d466cc2f9bcdc39282a85bb1af3b6431f6ac3f92296b33895064cffb34d6b60018b1d6685ebf84eac8699265b25c8b369c92418c14fd791117af0af3fc64fe9d0cbc6e5e843bbd2390cb0ca02e4aa26345d5eb934add1898678e0d0b4081797b53ec31da25a14fd8b510975dbecd24b915103d0b4a531b061c9eec6327f7f05aaf1e3a89a2adcac086f27946cbbaa6895484aab65e0743a3cc784df53820909e89b476f8f3a85f6ad3713308f35f2cfba897bf57159d95ccd5f2cec2c594d28258370c0303f640d8fccd39ab063e93a44a62fd53d3731ffad2fa26c2ce73e0b36b3bd7ef4fd5a3cd4c69b35680159205e1be6536802c983896b3dbd280b06ecb74db1f5d2baf7320094bda793815e4888c2ada5b687bd36343aee249fd77b989aeaca24c227b661bdf9919065a8f836041c27ccf576251836af5bd9c4d806dd1165f181f422fe7b4c2d9f10a5e4059b4b5b3464a70695e6004bb5787d12c865e1da166bdada7f1d1d10b3070095ad5af93cca42812d207e2fdb48159701b1bb0d5c8c8e9210201242a69a2d4cd51ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff125da1aad2c202d21a32b894e3857da7ad2189b92cb138de5b6153d142aa257a22ae748312c68ec7b05d89fe5087425449a1a155675fdb83a63f66694ea52bebfc90693be6fc486612871f3dd6f8840f974a3ee1922c6a48f3db1c3cb643a6c5df2c37540a97e6aa1dc6dc2dd7e7edb85dd5054d81a1c8352e9ad78dbfa251910000000000000000000000000000000000000000000000000000000000000000089d59173070797e1b39b3c6f38ae7b617efc5c3e535584906eac6067af77dec06333f9ef7783bacfc4a0598596da0415a64d1b1d460970a14f994c49cad20cbf94a26d777e3f8395245d7e45d69a7b24add08058f9afb66e0b72b2e844295452179af02a00d22a0716bb98d17b1f581846be6977b94adf16d34c58a460c9d90bc66952187cbe572574d5fa7fa37948e674c3e12fc0f56259f41d53d70870d1dbe87ef145a49b30cf99cd5c12f5a63181ce2d0922a48bfe122c173e2db2cd86279727aaf8e7d1abdd10d982bb935ae0d282f4d24f255880eeb7b4f6556ea10acd4be89eefafa9548d8cb15e567afd7e9e326516f2446055635c5785a047dfdb900000000000000000000000000000000000000000000000000000000000000009d47d33a5dcbc6bc50dde0ab6e957b0102659febd9b30c4e8ed5ad7bb42705bf4bbae6057afb128115fd12c8a0dd5c67fe9a016ce6b155b77b6efee28f99975abe22cd3c492cd082d1a84ca8041f3032b68e143b8b9ddfa1a4cebe7f2a0d896a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aab68dcb9ba5edb99dc0517a9d37ac3076680f101ced4036d50cdedca6e0877827c27d16f862a82a428bb0b917d69dbd78889f1ae7ed0e594f256ef4dd479a12abd741f4708efe323f9e966c96caed925e1df30bd844885b2c3d806e5ffc10239a13faf0d6e56d28a23f9ba1c3387da4bf6746ada8253a9d6151df5afc000fa77b6494acc6e4d9aca8357cd000055100454321aa8e821258e9a1fa2960ee17369590f39e8ef5ebbaf9f91dfee92fa1b301db1dc60a7a1ac91927f60508c423e586cb40cb20a4a0626533d56de0654e1664972d7151ac8d8c45ced1506b3b346a0f4f2e58b9d1eaad28153d39573ed50df12b59f5ba7c7d420ccb80227634d6e319fd65d1e7a090f83adb53bc53675c3d4ba2f1c5448737c58a088c16d078aa4f11780ce817ee436fa8709654ceb1c8ce1c5c30cd69176c52903e6c3dd897061263355d6173acff5b589da6745f344aa150b9f389de40f7400804dcd7854a30effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20cd59322096216580c07d7431e7af7bb4d2841ee7d7c4baa62b1da2319b92b4647602476d791a2d2d5abc6749f6d39198577c033841894cc538a7aeac19f336ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18dd9c054d018cb9e0a206e26446c6a13c5f0d8f9edcd56d5e402c5e99852ce609ff0d0bb4243e2a4d92d91a75c6db1152fb70760fa5c459ccb964b8599aee06861524c109334956d92b085d4d08da511f01b056feb57f71ca31257e7b596f7ddd434a83ea2c94897d047a1e0441c0c7210e06b7bf406ebe45ad1b5dac562e01598333715708e7e879880cd37b489c40373a9cb8fbcf74b53c7113aa62a4b9761938bf78928c88e2e9005ceb2136af4b8a299f1f8687a3c503b54853231beeed1ca9fa27ee78aef8ab74aec366a7ddc5c4aad3a38681a7b57665aaa99f0e20d40000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd03d954b5fb6eb9295ae6377a00573071aee29ac5bfc401a20de905bc07c7069803355c54e8ed96b7552b2f89f26b961f92e9063bcd5d151aac93adcb5c84604ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0b727481698d5b6e33b991da896215f0527335a6",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43c0100000095415d86dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6b00000000d4fe448802e1715d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2708ec21\", \"prevouts\": [\"fc1c370000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6fad28000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"33aef750cbca2ae70fa4e61a360cc74cdc5845f7220478c5ae24ba9e7d58d7c3a64c1537ec8bf5da3564fbe092ed4323ceb447b28be659e0f810ae1a8d43d4a283\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7e73988dc4ea242eb936f608260ffc3407d458b61f57777a861d37f87d509ab7a0e2e1f452b647e6c5abb4e1c564d5d3641f6751b2c287deabd310b62320e2bd83\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0b931370dfff16b9e6d9a7a333e61cabe23290eb",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd800000000a44e63dd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bd00000000160a5735025a6d7a000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787fd27fe2e\", \"prevouts\": [\"f38748000000000017a914b0716f1bec91d4758ee97d9063c9da884dd2ba5287\", \"ebc33300000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"165a142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"34f6449f6b7994f1e4e3219f28990cedb1f93d63779bea56e3a89b87d7096db705989fd4d740a69b9a1c7711ed50e63e8519ba2af37c4169369cebc001f3bc62\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0bc98deaaa9007629b3338d906d73f87abce0b62",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709e0000000047e9de70bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf36000000000931f20a02e0517500000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc22fbf46\", \"prevouts\": [\"e25a0f000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\", \"c8216800000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"3045022100e41de8ee7baef7958dfed81c9982dcd8eeb37dcf13eac0d81f9d7273de1797f60220664d2178b377acf8205a7f9822f533751109e595a719e8852a63ee20397e93b483\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"3045022100e661b3b0b5ddae11ce0764751e22e523fb243c6337d707e4f0d75865a39dd56b02206892d0fc8790325387265ed6c293867991ab8edd6ce3d1a4b6d09bdd2de9af3783\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0bf313616424ee4fc95cf71286563567fc87c472",
    "content": "{\"tx\": \"85ad78690260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701102000000aa846bd8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bce00000000353636d60413b23000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47870a020000\", \"prevouts\": [\"b39f0e00000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\", \"28aa2300000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c57d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e80f62f511a5f57d359682e9bf2433f4757cbd4acbee5d7e6d55377acbc6e694247b7f3ebdceab6737726d3802236d8368ee483fc4ea684d1523b8c26fc56452a37def1cc2232d9b1ca5244635fcf6779cb15e82fb856baa2ca11d8fd1da35295f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936969f17f40163001b57522e1bfe2b5fe7c0c4e62446f9d2c84d4738fa96391d180f62f511a5f57d359682e9bf2433f4757cbd4acbee5d7e6d55377acbc6e694247b7f3ebdceab6737726d3802236d8368ee483fc4ea684d1523b8c26fc56452a37def1cc2232d9b1ca5244635fcf6779cb15e82fb856baa2ca11d8fd1da35295f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0bfc8b69a3702ac6986ce61b00e837a148e7d0eb",
    "content": "{\"tx\": \"1af00c3402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd0000000006c00f6ad60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705401000000ca7050f7032c0a5f00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796a3093b4e\", \"prevouts\": [\"bd14510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"81c20f0000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_9d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e8b301698cc8fe10b9fbe252e7025e9d5fae59b7c9332f8094b1fb5439874ddcfcb7e04c95749504a7a69af462581849c82c2fb91813911755ad8a69171bed9e82\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"66d5a75332f4785db4ee435536e7d33848897633b18efac07ce703c2389d3229093cbc9316acd88ce6f4fbaaef4bf20208fac4dc3fc52874598fb6312bb841ba9d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0c00a8351b02f2185ea30aa4052174b38417e0ff",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cf010000002d86ee8cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba5000000005702dfc60407903000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a627000000\", \"prevouts\": [\"e2b60f000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"91282300000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09022b246878ccfab611754d6f0642f8b2cb1743063978de071b35b7d288c79916a2736cc63b07a7a2a623acfab6f6ce99322b728dd44be021e2a05dfb22735ee0db9a0b70734036bbae9f90c9c020ccb4cfec0cdfb447931a5bb6cf69a54b661ddd5a8a8eb5b10c22718fbb64c69fd23c8198bfee2a421f9fbc353e319404dcab1183126d0898eb2e878a22f820faf6b02afa4c6aa6fe27eb87ca09de15a4eb3478653fd9637a31a0789434009a5d941dce685d6bbefefc6ed96ab72a2f939056ef452d6fa2f0aee639a4e12fb8703ad7c4c99db7fda84e84b4db551f1b4d679effb3fee16e090d7bc0b866e427e6046d0d057a378c7c898655df882c5eaaab5a59d76105e4db7cb76f5dd40da1505350d1cbc02c3d968c5c0d63e44bcc1bd30313f8668001a4d781890cc43f89e40f4c01f3df0c06e241ac05a748112d53767656678aece90969fef87e164368b2a02c44d3e4cf70b791e89c1e287dc003bdd572cae39bdef823a3da7582de538e3588fae69c9f46cbaf707dec9e6894c59176bc4a191dfd8a0b183f3eea93e158cc9f4ebb2fbab1087b1bb4631fdaf784fbadda48c584a417a2406f1fb2d0fd4280b67535663fd16e801468f8d79c68f25a3034ad2b446c0fa3c1a75c029c023fe03b3024d0a56235dd82dce941fefc81de07c0f875c8a59fc3c2b08b0841fdd86126678193c958181b601f2a1e88a1db0f88ab1065fc26082a366c1a75\", \"447d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369ec655510ef0d78e24844d6e76597a80e81981a8d7f61dd7bc99fd53b1a11d65f7b6e2c095a2b9a1b3d0ba71ae2a36fa91117ca9fadc253f03c0f98f0de350244f357c04ffd5ab4b0848fd0bc62a9916d6f879ccec8b8201b6b82c9f83bee932\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d1c3622916b19f90dff3fd08a32465ce6057e3e59a06f4f9bff5830bb2204f732fb5d7bff9f5f6c3bc34b05a8b0674276f6d9910c78549a811c9c1d89842450dcbefb5d20bab5322d4474366a7293452bb3e277818a640d21da6725fb83aa6178d9358d5b7eb8da717809359fc8b381c54fdb83c35317d3f431e71803ec40173c4772358e35f45b9a73194308d79fe4f8c1ffc2e1ec676218a1952ea879da4da627bfd40c547983ee773305840fb91010378336d9bf23d7aa56cd919071db2954f59be64ceb03c20b4fddd8d7c81fa7651a0e91e146dbb85ced0f938a7ef5a55a512540e93e43d9c4aea55f04f9e4ceb3760cd4139c0bbd603ee6d1ccef5bae116d8d7fda24639efaad8a10e8f22ba59837ef3fc532ccc0c8fcfc5993ccdf681bc7c6f51b74f1eadebb63bd985cff13ee775278dc5642155e018c74b197a64931642d0212f588ca0959ba21fe82c439023ed1f9f6e57c4ab4636e37bde1ae08b5c862699ea27bb1c6ea362c7fd3a8b58ccd6c6af15b9d7433f07d4ee36824b0f844f20f531353d39022ca8bc7ca6236eb8d1bc6f9cb3dd9ec058ff9a4c64573517d919ea871e3623e082accb43f52b68323aaecb3e6f9bf019e3873a0032d7cc09c84efd42675bbd1d7a0b5ee6a02c39d0455434a9a84697f566eaffac800788ee96014070564542f0e257b979630aa897fa25fb4567592bca45eacb5514439e89d4d823ce952e776275\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936443b7e89d84dba416b5c010b3eec3635a6b8b3ffa01e53435da8d448fb39e6ccda290f4428e3e675f4a51c1ca36b5af7f0162ea7962d369252b53cfa5e2a91134f357c04ffd5ab4b0848fd0bc62a9916d6f879ccec8b8201b6b82c9f83bee932\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0c02f78d8dd01b33e94abaa865ee6a9792f4ccfa",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb501000000739790e5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc401000000d48d3cbfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c06010000008bfda2e203856df3000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6a988fe22\", \"prevouts\": [\"3bb34f00000000002251201aa53d82b3e96e8e01ae5203880cf5cebef0e054596b6f65010b7ca42a314e33\", \"5cd8500000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"7f6954000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936207372de628be21b0016a4467a52ed3274bee00d5b175bb5f0264e63299a675141d10d6c1f57e693407bbcd98ddd5bf64931b5565c89b36e50f161e759967c3e172c8da9bdd43b70cbab8912ef1aa7926e5ad7e47a4f7b71ac936200cc947dd0f9b27230787fc79bd718ce7ac07558dd4f31dfc3ae0570acbd1df01407b1d4ec\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936557fb8112a3a220373d52cc4c89c6517a2e1720c5885e0e17f2a0be351c36a81ba89d18ed67dd3d5d559101471702e4f2e7d1e8ead8a22feb9e78f041b8f409f5c55ad82284641cab824687b45d4293ada5fb8cbfc4ac19bcb5188e4cd0a7708cf37d2bf9ac9d65f4f9542d60f6497573c04b4d7313f44a5c611386102890a1c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0c043c49e6d5aafcf072e6be1be89160111fcb16",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47e0100000034d6f85adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8200000000012c3b33dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1d000000008f19ffce02f518ac000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987d0010000\", \"prevouts\": [\"baec39000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\", \"d7d2500000000000225120b982c4866c93df3772712b36d4336b477e2dfe66f304c80c21f6bc33f20b8495\", \"8ecf23000000000017a91418261fd2fa0b0480c86b918607add1dde9f7026a87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93645312a56de4d39a275ea41c23c7e6772b7c82cab6a1b0100cced3b0664f6f1e8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a0f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0c10be31ac329baf66d4d083563e6a9c3ab9ee59",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba000000000a4dea4a4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c51010000001e406ea960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701e01000000c86dabae0117a21000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac57020000\", \"prevouts\": [\"0ca3270000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"d08c4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"08ab110000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"8b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362494f98453d8de8230306fae5264b7e20094fd005457c4d9c992af615d79de60493e40fcef10fde3df13bbd1c2551f58461e5d74b1e1953624615bb6f8ad2778f2e441b555c43a724b579c479d380c278f8ccac4217fbfdcb96526a1dcd96287\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa726c3b29d073c2dbcf72056f4f7511ea796d648b755097daf6738edf6332d6d84d7dc2c55a7521ecc297ff7217b922438f95dd9c29c118a2bf5c9e2c8f8c84f32a50ac17afa49989b8cd5fe09550e31f987b9afab4d6ff7fb0ac42074cc4b38f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0c12817899b35dadda1aee2d0a376b1e6fca73d8",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1a010000006c9b93db8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d601000000fcf1a38ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b33010000009c6a06b504e4ebae00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df979722368987182a0b5d\", \"prevouts\": [\"29c3530000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\", \"0ffb35000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"bcdb2600000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"cf\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365e0e9a175fda05a064c52eebe8eea391232a608d343baa66a1ca563d1b6babca6a7a52674f359a7dbed67a49e09732132053a9cde77eaa564fdce3cafe7738b9f4a62e14d7fc4acbfb0196ec29a60565ac2b3043dda4cedec8cb1ff291b90d41\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ba852db044cc7b3c6c227af3aa09dc9e9bae5367030e3f2be29afb15f97933d48121d7901a27ea565e1cb6f91818c43a3dc8f46dc56db80c8bd3776430739107a653bf1dd2d82b0dcbd644d98f066b9fc3e48690fe18b2084515352f558033ba\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0c2099a1366325dfb20d310e00b1c1554e93defd",
    "content": "{\"tx\": \"1b2bfb8902dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b780100000008eb22ab8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42600000000c4deaba3015955540000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc74506636\", \"prevouts\": [\"1b791f00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"c7163f0000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"747d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c1c1cec2ec4a702b027c32afe8f050a7abd6c53cc1a056033971ea23441aa0d3133f027656d2d9f64ade865091a06c0b2adab14558eca27c91472397a1e3806e077aea6ccf316b47e40a0e3636c5ad4f7738b9bfce630d4a478a0dbfcb51ed93\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e86e257627f53ae21a01782ee3e7d4da03b01bc19a25fdaba4c8a32b8ecf0a2d91bf4492fa00dc56072e72009d776219274bea6eb51adb458249eab71940c27cb4bfbb1ef2412aee06f4b75b9e20a72d4d9707545a4ae77abc538f76b00105406a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0c4d9a60206c9ad9b61b6120b3b5495408989e96",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9d00000000e8af27168bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41900000000f499c33c02627c86000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac0e38aa56\", \"prevouts\": [\"e39f5100000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"229f370000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063f568\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c90e280e1421574cb54e7318c63431e4a1edfed926b25be9229483f2d9c0035299ead232f95c20736c4ca28d40406922684ff7a84c70e432a4f6a4d4d1893c4694e361b142bccbbefeea6ac26126d4f4fbb610699e3a27d96f99d1b67de22f2f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb44041dd00c04bb207a9f54805a750c9f5dad18a896c6f9e3a7e4fce73f8863b3a94e361b142bccbbefeea6ac26126d4f4fbb610699e3a27d96f99d1b67de22f2f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0c6dc14de0b80f72306e015b7560fef8a12f722c",
    "content": "{\"tx\": \"9a9e95db02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7c01000000d1dd92ed60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b200000000832b678a025db336000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acdfa28c60\", \"prevouts\": [\"c1f3270000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a348100000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"d67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667d27b234150b851a84a9914325267995d8047a4d411fd05a1678f70c40cfe2ef0c0cd32dca2782b49e872f77a6f41a631e1b6bec2669bf2370bfbcbf3d4a769630d95c26588949f1b3ae4e4e429080b434b995fa18047406852c727cd9e6feb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e14394dbc4504b599527b31ae07292f4c811cc2f9bd5ea2479c58248999356efb1986d7e8e27273be987a3f59c249d736830c7b6f9b487df38f4ee68bd2c5d06630d95c26588949f1b3ae4e4e429080b434b995fa18047406852c727cd9e6feb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0c860ba9e47e23ac7ceaaa948e710e0253317ad1",
    "content": "{\"tx\": \"b96146fd0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270aa00000000012841abbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffa010000002b0920930287757400000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac12010000\", \"prevouts\": [\"3995120000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\", \"1686640000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c64c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900456a39aac74ee3f63949b9c215c515b0db1b113f4639b3fb19cd99ba22ff01310c728ffffb27e62918c729ff5ffa8fa6bd185df3cc350f3591557de0b18c4f64cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52c6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936818d75448986f133fc28c6b1d0348e731f044a1050c9b39e3bfbc63da577cd23d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d514a68ec639edecebbcc441a95b015cfc7d67c6cfab51cac7643a880d3dd4163fb31e5a3cd6e337eb252bd8d7a8d95e14a531fbfbee4d245debca50b247e512ad1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0c90542e3f64cf4c09f66ad39471bbed839d46af",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b00010000006626179d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4dd000000002f9f28d801c65c470000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e70cd67b4d\", \"prevouts\": [\"308e200000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\", \"e53e310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063f868\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e485f1c41272271fc4c80a4e35cc3d5c00c2bf0a9cdab1f013c35398e076f7021ef28805a30acff873fd9260c6b3bfee2b626467fb0ce04f716d513a8a4b08b6f288028cdab461d62f9273620b97315e6e9af9458f777a616c1bade2d3f6a89e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dafdffa5bee5fc279ded3bd906723ad31de263059c45567130a0992fb7d0cdbd7103c9e8ba836cb8a4e14cf2cfa4f8a9b341b4f4aa6fb02102628b5e7003f327891e44dcd1430a53a9228b1d4df01e5c5d5af3846f876ba8dd78ee7e669e7153a72d00f85eae87f4cc31996f158484f267a3b4b9a04e006b9a1cff5c0be2781e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0c91906e6830ed3ad8eba843f2cd7c66205a7981",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa701000000f7176d97dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce401000000c70bcbe401c58e01000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487ef01641e\", \"prevouts\": [\"75707700000000002251202eded5f58e3549770351ff682af5b38d1de1354573522cd8f1060c49001c6d0d\", \"9d5b480000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_keypath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"16160f61bd77a762ef82e4095012cf3118ba7418d282fe9279dfb2ae4f7d693c7ea94e29333a27523c9a3f18ee8ffaac7d31e8b48f3bbd61926b9626b107df7a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"16160f61bd77a762ef82e4095012cf3118ba7418d282fe9279dfb2ae4f7d693c7ea94e29333a27523c9a3f18ee8ffaac7d31e8b48f3bbd61926b9626b107df\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0cbaaae8f169bef4c71cd090d475e96cc8277741",
    "content": "{\"tx\": \"e1a1f69c02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0100000000f91c71a18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e201000000d7f6cca303f3e29600000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac8b000000\", \"prevouts\": [\"b9075d0000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"61e43c0000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e8a82e148e674b2da678756ef7fb3acef7ecdd154992e611b612eb1b2efb3449ec1b6a8174731a6ba3035ed06be8afe3ad4b039a6672ae22c4dbf7617b657e942c89a5194237c2876f0381c2093ce5c84b28cbbf2d88dd8c9038b546232e5aaf505c62194008985a89505cad0a266920a70240182ce14ea47ed784ef3891c68e165a5775cd18a8b1d026edc92e0a6cf58342f06caf5fc8715d42278c86a19f3e39e8e3a656dbc7d3264018a1def62fd260c09823b98ba7aa4e8567076651f6dbccebe5977814d9cbbf01140db39bf4e8aa41bed8665129ee1747003ab3a39f100fe9f9d37bc6e267b1222119bc13ef2acb57ddc9141cdf61b82f7ccb22fd1bdb9df397ca497e35a2acf590d6e7c674c7a72ae700496f096a3b106a9476b6ea98c6654bed94bfeb5c5d40b03026a2d0cad6bcf4744c55b2c80807f71b482d931c31f18ecc0d8d8f938652c343644908705107365043ff7468c39e3698b917e27fb105b6bc860d5c7b3b3ffcf8ff27d85a2acfeaaad608711a640a8758365786ff811f14c7f1fd0d0decb048993991248fb14f95798a302e2f7813bdf53cf82642c98139ace206ad5d3a50655487312cb5002fb5370a9dd7098d850e4d92bca151d8d0a56adb316f1ca237c94dfc5ff5faf3eb1b883ed6d003e04aebf430d79a2e94c46699c7156ab4111d765567ecf018e327c64e2ed97165d0637c3f1a40bf07753ee8265c7d0108c875e2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1a469bfc8de16b0968070038325e6b76e7740524a1c4ae3d3f158ce1e63cb3bfd7c6ac6071aeb5642f86cbd8c403a36f49b1ae971c310fa0b2c6d23cdcc52f9ae3b30ae9fa149c8f8e298eb730b57bfc5eb02dfdad9864c9ec3129b8b9775e615\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902225586b6f5d6e8a902e3ce91f256d235da38e7af3589b6ca4267db6a9170910ae185b2288cb83df651604ee1c06cbe9441d9db43e9eeef8366211f1ce6118b1860ddeed47d85513c0869b7314dfae66b9b3bf8c56b89495bc0edaa2d2f870ad00810d0d8cb8d83936fbcb629bfdbd4f8f8873e7cfd9b8909ab4649b3a93ec0238431593fa55e651fc2761590e52a7cef87d85df33c77e90e17134def3174737627a06de1598c60c2d883191aa38f06a432634e67c61f82a64364d630a906fb7f4ad51b7d4d318a363d4db840aba1d3c4db976be94a5a2c14d06f96c17cff6dac09de4fa8833bd7daf42a9938ec99dd14448cd736ea953d494fc6afa3eecf6d480f03e9fa62c785f10189b8a1c2062a5fd3ed1eb4adc01faa2fa96835ddefd92877dc23bd33cf2515d42a0973c017dddfa1adc52e8ef4fbdafd8002ea281876092dc60340423567c4d57c8a4233f0181119be5660629949b951511b208cd490f1a8ab965a14639b5831ef164f091e608c30bbbd1193742fc04f2c6201dec6d3c928bf4fed3d2f0daaa308e11c92cb0a09e622302f625d828ffd47b6df1214f6f56fae3bfe22b9c1a688816baa12ae2056baa1b470e951118338061135a876b8bb739a8b938bfb57cd7bbcac51b8c3fef9088526db58eb21c49eb3e0f32ed0fb85acf5b877010f2809c83f31c280ba0a5a9a7ad8bc57be5ba11b4aef41afb988a7de5d2c8d40267bc4d77561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb41ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045b0bd2b339cdab1cb752df7db1bf10e0fcc4b57fed7d380ff50ba3a0b4b018724b77966166a359aa5541e77c34a58fd9dcb7d88ef6e7e0cd0e140e1adf959d28b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0cfce5f569e35c19633d12676981cda0b47a34b9",
    "content": "{\"tx\": \"2cc56a15038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49a00000000ec9501e6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7b0000000043261ee960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e100000000823f43cc013ca96b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487b5010000\", \"prevouts\": [\"c1243f0000000000225120036cd49b0a5a8928de04f8e04bd3da02711fbb4d9053aeba12a20cf11cba05b5\", \"bb6f4700000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\", \"cd9e10000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"6f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361835f9abe9a741de0e36f4900df38cc6cd8be0480d341e9b7353c9d58c608762796126e2d69a152489172163b4bb3b76a5285668b37fe09a10764d2324ee4a01a6ef766bda57b4717926485a86d332fc460fd2733e6a54825f17015621dd4290\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936702c3c7c1f1da03c8b27f2bc575737070d61786cccc09f33c0640d21457e29b546c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa250e9882e2e133b56af40caa5e77ecf964d6e28c7a51ea626a8db4d1e1f7bbb4a3f8f9fe88f0f431b5ffad473abfcf1c4b340e1c7daa1232bf4c86f035b8cc51\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0d1dfc0136b588b721884040ebf5911514ebb74f",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270250100000036c4ee558bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4510100000070e54af860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ac000000007953921f012baf0200000000001600149d38710eb90e420b159c7a9263994c88e6810bc727afb653\", \"prevouts\": [\"de1d1200000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\", \"bbba3e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"781d120000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_e8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8b12312a5336aadb74e8201a2892680091c451ad34555b44330dcecafd075fca2da0d6a1cd039c82ea25ec0a66e7321a99d0d437c100510dc0d7465a3513524281\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9b7c20852b9e943c263b2e5c0e100b643ee71ef8ff2416512705ff4ad0dfecc3b9c439cb01f62ad0920375dfe13d746068a161571a51eb3bf0b41782813854bde8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0d25d4167a2171b28beda354bc7a6b814d718e10",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc900000000f2275ef2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565caf01000000fc57e8f90367dc99000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acba7c1440\", \"prevouts\": [\"6647510000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\", \"52934b000000000017a91418261fd2fa0b0480c86b918607add1dde9f7026a87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"6c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a238d55badf8acf8a76486c1c58a90ba61d2c17882158465b124e563f4a2674d94fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6e872a8a6de95a80dc4a6e95ba0e12854eab511c8acfff04c6cfab0ff55ad6b178\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ab66e6e50f0e23344b2fb4fbd1c94b97eff6a18e7892810f712f9b1a97473dfd5b22591e944b414d99fe534a482351afe29b8e90b07993fb7f3f85b72380ca5294fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6e872a8a6de95a80dc4a6e95ba0e12854eab511c8acfff04c6cfab0ff55ad6b178\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0d265e43ba90ce1827ee538563c6a293b0b03ff8",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2a0000000037452ca28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ca000000003ed3dc9a0168c22d0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fca639323d\", \"prevouts\": [\"1e6c240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"06ca36000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/minimalnotif\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6cc2577c611c83d4bf802fbc3817b2e24f285d3c2b707bf9a36769626d6d62cceebf765a634aeb628f611fb164807f6a3f075f63f717fe5f32193ffcd2ea0dc5\", \"01\", \"646a6720871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b5e13cad19c924f09e742cf01d7e012810213f06b075da864011776c4e0e33ce5afd4f5a80fdb0e775e9347ffe0d8d06d20821e8392839b829c29e03cf24dd39e09e6d21873535d25ffee6834466c284ff42ef82d8fa2fdd706d38dd213905035c198717912f4b406e8d3b313d97c1127d1135c371a850790824e04061625b9d13fad9f6d66cfea14ccee2f27c94687462e60c93097e3ddae516a269438c7ee5497178e22127db6c7f8f175fff2d2055fc4c08a025732ff7ea1096ec159efbddc6f248e0af5869f80622f637a3edafb79d72487846d4b0589ad8df1e49d86b58ae982564b911df2d2fca61beb75f1ecc1a3526592822acf1cb81afd4e2a93f13b7dbd0c12ffd99a2b3242b359ecbd2060409f001c89f4f8371cd210f37fc35c4b1df78360227d44f218f9c188c83f404e81070c2440736b5601340b7fe06d3b1bec47189a7be4ffc0056c3ee876b2f14785a511ffb40f655d5a8b5fa356d4081558c155b0d7e8c00e6282b2c83a0b7370731ce99ff8996d6837e990d84e1874f60a177a028d5b32d1137467ad00d3419299404906e230dd6a3cb22ab6dff4f06738a88f45b76d7bc9f694c0e4e272f5d4f15822286d483919ad24a64a55c6aea77b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6cc2577c611c83d4bf802fbc3817b2e24f285d3c2b707bf9a36769626d6d62cceebf765a634aeb628f611fb164807f6a3f075f63f717fe5f32193ffcd2ea0dc5\", \"03\", \"646a6720871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b5e13cad19c924f09e742cf01d7e012810213f06b075da864011776c4e0e33ce5afd4f5a80fdb0e775e9347ffe0d8d06d20821e8392839b829c29e03cf24dd39e09e6d21873535d25ffee6834466c284ff42ef82d8fa2fdd706d38dd213905035c198717912f4b406e8d3b313d97c1127d1135c371a850790824e04061625b9d13fad9f6d66cfea14ccee2f27c94687462e60c93097e3ddae516a269438c7ee5497178e22127db6c7f8f175fff2d2055fc4c08a025732ff7ea1096ec159efbddc6f248e0af5869f80622f637a3edafb79d72487846d4b0589ad8df1e49d86b58ae982564b911df2d2fca61beb75f1ecc1a3526592822acf1cb81afd4e2a93f13b7dbd0c12ffd99a2b3242b359ecbd2060409f001c89f4f8371cd210f37fc35c4b1df78360227d44f218f9c188c83f404e81070c2440736b5601340b7fe06d3b1bec47189a7be4ffc0056c3ee876b2f14785a511ffb40f655d5a8b5fa356d4081558c155b0d7e8c00e6282b2c83a0b7370731ce99ff8996d6837e990d84e1874f60a177a028d5b32d1137467ad00d3419299404906e230dd6a3cb22ab6dff4f06738a88f45b76d7bc9f694c0e4e272f5d4f15822286d483919ad24a64a55c6aea77b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0d3ce2afc206b93ee7c40177e168a295fc3e5ce0",
    "content": "{\"tx\": \"4e4d1dfb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a100000000b81df2cbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcc01000000b1bc72eb0373d0a700000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df979722368987c51ca14c\", \"prevouts\": [\"558933000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\", \"ccf77600000000002251209d7a18923cf92d77a70864db68b8be9c97fe6f327eec6aa2ee3bdf40725ab507\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"677d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a77b70c46c994a01ec5a816124f61e0f5d1b89a7d1384137283c1b5de2b508b62e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdbceae773fe677547a5f8be2986f5e4c7dc436c0d3f0e1e86711aa468c8778215\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8687eac120734a03ae4c27d3bf57e4c4c383799b8e878ebb1c20141d650e89e9fbceae773fe677547a5f8be2986f5e4c7dc436c0d3f0e1e86711aa468c8778215\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0d4d3db873cac71185de9e2fa4462b2f3ba96462",
    "content": "{\"tx\": \"64f4e4390360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707701000000fb3218d8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ced0100000081e9f5b0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcc010000006137ffcd047b7d89000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6034d4655\", \"prevouts\": [\"3d9412000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\", \"be405700000000002251208ab07249a1fdfb04b130308cc651220c9430f0ee7d7b49fe0191e15183fe6b9a\", \"277321000000000021571f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363885a0e92cd4b057c16daea5a7b83b3e63537af4017f46a840615a8d8f567c1a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a0a616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0d5ecc8d0c063c2641c3a8e7adff9ecb0323914a",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff6010000004f498f07dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c860100000008441211dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7700000000fe3bde330149db9a00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac9fec5531\", \"prevouts\": [\"f6da7500000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\", \"dde94700000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\", \"c6d94e000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3043021f0da3297ff19fb04fa25e2c5bf6bc43816cb2b39db34d5f6754ce62b442aa9d02201b5faaf44a89577cbf13388fb8b09930622afaa54109768373b23b0d57bd6e3283\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3045022100961fb8ba71e716ed2972f15218c42ccc4efab8bc86f2fd593fe50a367952c1a502201b7c7cfb759576779c636d74992adea9355ca1646d860f7bddc563ef13f1f0b683\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0d65edb0c2f57a76df2b15cd2c722b18edffbacc",
    "content": "{\"tx\": \"01000000012e09ffdbb2069feade9688806d408b21e4e24b0581b653f6a686a5bf690596fa01000000008f67898d033cb5fd8a1800000017a9143fd5279308772d81081a68d882f81a7ac08fe1d98758020000000000001976a914d2eef9cb56b74880f063df7305ec01f0b8fc540888ac580200000000000017a914dfd1018683cfaa440400f061c02b281ec7e8e2d88771c9694b\", \"prevouts\": [\"3083ff8a1800000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_valid_unkleaf\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5685a450002b7722b67ce499747bfa853d11943563381312add9b974d99f5729b4e2bf51310826d839a461cf795eefc85bf51bec70a9d1e523ea6b733713db5e\", \"20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac\", \"c2cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3cbfc5d7464d6f9932fdfbdb59ed04135d3da1fd24a1d97149f3f9fe8acd746e901c94ae67cd857f8f23543b618b38154b6c0432568bb8cf7638fb55d4cc0a24e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0d687e26341ba489f3d7be5d0b46f4beacaf8358",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4da000000006af8c3e060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270870100000017873a89035f27450000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcfe030000\", \"prevouts\": [\"2887390000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\", \"a9700e000000000017a914381003aa1ce42a7df73f2dd1e6e78ae0a36c6b1c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"c4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b2172fc08f39dec38a16acdaea6f2fb40d915f4bcb39aadc0ac96def6ea8d2de907407b97958d18eaa787c1cc29670cd8872e7fe2ef4ae33551cfe5c61fc2827ee\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c6d5e8883e00432528415be42327fc5a4a6375200eeb9467b263c8c2a6402f75ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b2172fc08f39dec38a16acdaea6f2fb40d915f4bcb39aadc0ac96def6ea8d2de907407b97958d18eaa787c1cc29670cd8872e7fe2ef4ae33551cfe5c61fc2827ee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0d6ac2e508ad66fe5e2ceb784535d11ee75cbe2f",
    "content": "{\"tx\": \"7aa1c49802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf23000000009585a1b7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b88000000003b0b69d601c2a39000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac3b797542\", \"prevouts\": [\"9ed88400000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\", \"440b1f000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"e0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93623ae85726644c2de015503b238f6d2ff3873dd043771b87773ddc298654b0280d81cfe71594e1389c7dbef12605d87c33af6e429193e755ec800f4a6d58e14260941252319b1d0989c3ca3905f2d65278f17fb3ebe6fd71301329f8e450b42a05a35b5683fdfa8774cce0e3f4376573bc9dcdb125f140a48d9cd3d58bda5cb68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367b1651a3fc1c4e1b7c3cd67236d38206903995e4c6229f7d3322c375e330dd9b093e484a9e3a7c57c3845514d142b984218effb649d9e5eb3f309ab706810aa991d26af6ddceab3892536958f1ea20dd7b885ab499207106c7decaa6511a0e4c5a35b5683fdfa8774cce0e3f4376573bc9dcdb125f140a48d9cd3d58bda5cb68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0d75732bc24cbac5dc017bb967142c5648d55bfd",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf201000000ce5eda9bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2f010000005618a396bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0701000000427c408b01084841000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487d4145d56\", \"prevouts\": [\"24fb4c0000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\", \"4f8a7600000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"3763820000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/invalid_cs_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a25721145276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"611b77aec8c3a0a873ddffa29ff90e034dd6060c5f5aaf0c8a2dee2209879a02adbccd1d3853d9a166e6c32990b621b313362b69b5974a03ac89b352ee5e433b\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a25721145276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0d89c8dca6b7a1af5614348af7dd5ae2f65190bf",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf79000000003b14d3dbdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2401000000537929c80432a09e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48751010000\", \"prevouts\": [\"a0c57b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f4c4240000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a99\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d85ffea93b39ff48f026a1de615f9bd5d9d5cb27805fa051e581b49afd71e8d341e79d00d576d46a63d36f208105835dedf99b7ad1f6575dd8e28af32480c198\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361e4dce6bac278c1b1e733e5c8ab81364e97dbfa61cc5cc43bccc0065b9d2eca6379b42341ec85aaea9ba53764a308ad79e21ba1c6bfeef93296a10f4c0e568eb3c50effc4608d2c714b1f589c510b82e2cb4bd2fb333954004903b4f08f38a79\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0dd2ab05d7639afe71f965b79bd7092a935732e5",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41c0200000090748d82dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cec00000000327a6adb04bd048500000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cf0c1a4c\", \"prevouts\": [\"d0a93c0000000000225120dc347dac30d55fcefc955ccbc6791a94d629e3a9213464313d15e8052cd76ad1\", \"f6434b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ee\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a297b3345456c0e79f1ac7e940ae7b2031b4ffacddd92dcbc50b725a662e8018501ad94d516d521a69b48b21b0d3dcef7b7f042e2ff9b11f9548f65e98be96da02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8c51135843b35986295761edd343c47c0c8f69f566dfc1e7ec19370a20421908d9e647a48691add825a30a57d53ddf5a8c4fb3964ff6196f0084454dc04a58e9ee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0debebb3108bcd03c6d5ce9c5c2ce1a64f8da172",
    "content": "{\"tx\": \"b200976d01bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8e010000009fb86ac8037b817200000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac33fc3f5d\", \"prevouts\": [\"a7b074000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"97\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369753cb1a5a2e209ace27a7eb8605f5f7017a5ce229afe5de89ccd0b48219a4f45a7303e26d6b86d2a780c30dbeb7ba87c6a0494b901c3875fb9ca7f2f12bb2fd373be813dc08f80e09d78de4ac5358a3bdf22545a425b50fe87daa20f96c44d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362b9f3130479ebcff49fd970febd3f22cafd2118ccf82fa26a081c98b144e890c088456232115bcc24dec0b5a24cea45f7d15fc3427ff6cd91fcf5dc3f7efaf083288455e3867d2ff7594cc417650f42f79f93c98aaa5c5ef25eb3554c8bf2ec6282285524a15c732567d099967405d35f7136f74f48f011bc4ab279ad8d14f14\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0e03e6819458e3a55e6655f8ac2fb5cb9b28406b",
    "content": "{\"tx\": \"0aaa8a4802dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c72000000002635b9ba60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701802000000ce18a8af021b536e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac0651971f\", \"prevouts\": [\"36135f0000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\", \"19de1100000000002251207ea7068de42e8dd8ec2d889eabca72799b94dd329861089e307e247da6412b8e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"837d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e87e533ff75a4d67e066dc739e50d12e058e790be330db290aa1a5b4fb647c89858163db171dbfcbf374971659a5a65d0378eae0ee15db360ca8cf80a8c2e13046\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365b8d95c6db891b4b73acf316d977e35c7b522b3e596d08ccbc7a995da83161483f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08209d3f278379d69ec93b9031f683f10c8ab57e2d08c050c4811cb81bd332eb9e3ff15e37d03bf407745d47da370f693bba1bd1439d95d9059575aa23ebc3ce6e3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0e1d5cb6786009b8f3825aeb3f4c7eecc240bf0b",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1e000000007f87f9d660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bb01000000b381a6b20118072100000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac24010000\", \"prevouts\": [\"ef6d640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"076c110000000000235a212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"43859efd869b15d8b33f3c634b4e96d875595f9690bd5803c48fae26bbf1f097fa69dd48f8f59d02a7e642043bbe44a539d068d0e3f79843bd4aa4ac91433b86\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0e1f79030f3681187ce4b16bf43133d56c470a63",
    "content": "{\"tx\": \"6fe1dd5a02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c070000000006cfdada8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48600000000e8441bcf03113b90000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cf000000\", \"prevouts\": [\"bdc05b000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"6a7436000000000017a91486e5fab3386e07350db4c59e442dbaac96c1816287\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"235a212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"472e4d32f1c25c84db688dbda40fa933bf8472109f2303175068888ae7b2dbace4d10bc6468c490dc7c2935c1a01af39812db491416acc58a4809fc899dfa862\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0e229a80fe4e2619a4b272d19ce5815986d08fa2",
    "content": "{\"tx\": \"0f80966902dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0e00000000ea3117d060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708f00000000ee3251bc0203da6600000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc722010000\", \"prevouts\": [\"a96a590000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"3efa0e000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_66\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bc6e0c791c7513090a5f4e337e6e2c521f16dde08d35c7a410615e8fc0936afc9dd68bf98dac81565c3776a26a4ad2f09022b9d9fe5b3290db73f67ddb89c01083\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ba2408cd81a669ba47141a8e5dfc436b0f542877da45e559ca29b444e5eb9eb23815b7e4d96999bef8bb447fc0cf6c0bd6e670d024436c27f4437f8094b3aada66\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0e27294bb1dafe333a689bcad39dff7fb6f9cddf",
    "content": "{\"tx\": \"57cf5f4502dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf6010000006a9486e760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702d0100000035f118d4039b315b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac7d735b5b\", \"prevouts\": [\"8eae4b0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"768f11000000000017a914b403773244c403f76163005c780d53872622b52c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_csa_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef3255bdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e0fe281e14a8a8cd59a07d5c0ece3e4836edc64880ae9350f56ba15bc232fa9257b1d4f98bd0336f690615600dfc64bc5919d993ef03289dbc3944f754036e7000\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef3255bdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0e28329dee72cdf3ca474e54b4eae5fb8c42ce45",
    "content": "{\"tx\": \"c4706a100260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f700000000efbe80c4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcf0100000062bb14f502b16d800000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898726000000\", \"prevouts\": [\"9d9a100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"012f720000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"287d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e780a528759e22c32b672b3582ec3b98210a6d7cdb045b8c2f36dc39043db702a61bc10490c3b13d9c4f63caefcea4aba06d3a92ca8668ebd56c703a638058ee7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ae0185d73b30cde4b6f847d95b0ec77b009b44599f3d33d8be12ed96fb030558462eebfc32d9e48af9ce92e50735d36faef083a1171bd1899835a9be2fa30ea55b4ae3ee914d52223472aa57f653ca8073aef0e7910b2553778e1ae03228475361bc10490c3b13d9c4f63caefcea4aba06d3a92ca8668ebd56c703a638058ee7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0e292d3b3af29268349fe695e0f7ad74c422612d",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127008000000009184f39cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8b00000000b18bd5d28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43300000000963b85dc031aab6f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7697ea15d\", \"prevouts\": [\"9e2f0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"3c0a27000000000017a91486e5fab3386e07350db4c59e442dbaac96c1816287\", \"7c613b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_c6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f5664d07dfa6f7a84016bb2df0387801d3a8d30dd7f4b641105f06ab04c2d69986c4d0e6085db919fb36100d3d67ad8c46c007f37046634b145e8d33568ae8c3\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a22fd97ec717ce4684ca78b6efc91ea96808bdf3854146a3a69c6f26dc3ac74345926d557f0d40fc61bc3da466d3bb2945d464df51b1b21e1dc83b9e10927f4bc6\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0e41c7f53cff3726f8dbca36445f5bb99cc7515f",
    "content": "{\"tx\": \"48b53c3102dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c390000000029ddda8dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd6010000002acd50fb0243a8c5000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc70404943d\", \"prevouts\": [\"84ac53000000000022512027986c975f6014bd54fa55f3e483bd83d3384004828bdd3e489d9b175e79ead5\", \"ae1574000000000017a91498e55eac47e04767f832d50008ff18559102c9e787\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"21601f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"516609a38ddfe1d98bbaad43bd619e65b73a163a7a9467bad83936a63ee4fc84d6d53ec50ce63dd171c906b33b9d4e41feea1e386ea2c3c1853f8f736bd03010\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0e73fd872d8f71896397723287ddf1497ea61297",
    "content": "{\"tx\": \"4de70a2202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1402000000fa3ce6a6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf401000000b6192cae031df747000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374872a010000\", \"prevouts\": [\"52c025000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"e47b24000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090202cab6ff434e1d5b531b7202a554db72d8e3a67b117026249d92b7f971b77531e5440a1d94bd95bf355f7480cc535932d63a68eca87816757587158a417ec9e2d1c5bfc9f7dce2efe4090f1cf58d93c68becd06ac3221cb3dcdd419ac707037f85fcedfbfb8c3f44e847e751d244732dbd2304e4b232e5a8d8cc6a4fd4a9f418c2bc2e991b82f503077342da58cfe34cc3269e36fb4cb2c239a2a390d21323498c58a3280380e3944222ccd55a0c94dc57fd41b1a2655180e655615a684ab78bacb6318a43cf5377004bff7fd42bc6655b9ba7e53d0eba72c1bfec28a45a0ad1d971868761d057246ce4b852620c0ec16db0a8c62fe4b561236e64b72285b88e754c655d465d3b2d7261874ffc761f74e2e5a8c7ccd94decbec81a746d50d138dc66cfa8c4ede8df437da98a94de362b49874eb3acb1566effbda20bc545ef9c961d27219ca49813cdad47f82892b9060bac47e0b9df85f89df4230e3b4a9a4d5aeb61c791049334bca917d67b7299eb61f80f607212b731adba0e1db180cb0a05cce3d4a88913612caef50e3b4bb7c1e4b1e124eededd1f978cb6217f45992de079c39f331f51fe9b0ebce3a1a9d84b8aee0f2e3c4c09d1ccb1c4f2a5439b0227639daa1b36ba0694185e07e546f43a0a382dba25df1aebc79326fbd342f9cdefc85b8f1689c9dfe48b1d140e18d16c945cabdcbe344e485fd14394882638e7b61685fff9d41cf87d75db\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eb4607ba7298d17f73d24d5d86c1d3d0fb9db652f9c069df5b4a0333ad80d0a33f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082a04823906532712c3d4cb334ae6c7c41a1294a824a25b5277d43f47953a1da33e053a85c36f8a6bbb26ecc461a581c33f0f0e79993e29030d20b8bcc8871f830\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022a97838beabfc8d8978d228f37f06ee48d7614432cb1aa6a915f2bbabb2507f4d8cbf9003ca4a7a110c3ae6b1eeec5f23799dcca73efe08d64f2d976ae0a25db8a8d57a4b605304789807495b4d9fa8c8ef385c52e15dc66f6f22bc05d03313724fc0248cde0b0371edda8bbb3ecdc7cb4042f615648f3bf996bc2da2a795baf2598056feafc1e82d4e374a06a5a18742585ea84f3ed67e1692585a5869ec471e93e715b56e07f93522c4da6e114d7cb38776f2190b1fbe6fc6a5e6a57c52ceaa42a3fab239c4e66ab7910c3d0e5d3ee28b0ceba338b48cdee99fd605171eee11872db14cda1636269e494ef17056919731ccb9b517b4ebb2f79c73ca718b6f91691ce7b5210e5f6913019d9bfdf70b374815352b8072cc40fc0208df93fa41013c2ebdb8225df7926cb2b1af08fbb5c1585914d131a1fcbe4ad644b8504881c787b0a74eb18bbed16193053a0604260a681d4cef558954b82163c8482e6cf11525d3eff08c2b4460cbe091cbcb040039dd79fcd1d426739f3bafe25d75e1f2a2ca5b631ca311053108a36114c753f5285ff0cb036042c302d4fb5a20744760692aaf12f17cd6fce337d63a28bd143cd8c9fda6ebfd2f77235acd89c4485b948cda114869460cec264596a4e11da85fb24e230f2650686711884e2b373199b1bf7f15ac24d5f198ff3b03079b7fc764ab868440c0680b6ec3d170b571da64adcc0b079ab4d051a46cd7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368a7d2c4cebd38f1f6f3fa3eb99e7c82e9a917412571f2b1af1e1c6189830d7fa4e3966518140ddfb4b2a9d93e012e33d80f6a3bf7f24f1b44efe84ec3ac236f0e053a85c36f8a6bbb26ecc461a581c33f0f0e79993e29030d20b8bcc8871f830\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0ea17004d718ec4b5b84011a18828cf136f86973",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40f00000000aee490c3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4b000000005f173cce60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703801000000fe1cc3f8014c7b3000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac9c041628\", \"prevouts\": [\"5139310000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"560c2100000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"d2ad11000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100d7a113b9360aea818c00e3f6a1e2913059efbc3218bfe687f4a214df3a18930a02203a87c5b812f3b0777f570378af8adf62a33bf2edd57185ecbcb01dc0aa75a2b902\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3044022057e577dda9df8746b2428cee605f12b38c5300e902b467e9309a3cbf451456a602200dad23743fdbf1bfd8678000ac822d41d43b62f0e0e609490aa48288275b50b002\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0ea4e4491ee2abc4ea52e48ba33eeccf62d5f85d",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0a0200000089a51db2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6301000000b13edf8504c9d17400000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac29b2eb20\", \"prevouts\": [\"4612240000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\", \"7a71520000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"3d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa671c5f6e3fdb2cca9ff2c8978272a7c72309b5e793932f9bb10a0961dd619da6701c89cbc41056f58ce11974b5756eca381e306e17d72fcef5e58c3aca02cf1415eb41ce20b61903eca7e2f7903a7c5f76d50ccbb22a22a302188dbad2e46b28\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367a4323bca4261be341492d2c8aaea5b9c8cd338f75ff3ca656464aeff6e26a7ada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eef9a48fcabec25982850a496e19df71982d596f167265e15d1ec282fb30074b91cb891527dccd7fe22077390053ac1c45ab6e7110116df1a30c9559411f432f5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0ea84a4a5eee9c0cfe8bd52347d11c08b97d6640",
    "content": "{\"tx\": \"2c58931d0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270220000000000450dd28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4010200000073486ed00336a552000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc44000000\", \"prevouts\": [\"63ed11000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"bbea420000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100922f35dcf07596b5a8df94f8153105be4bc76f6039de12c8071849f9b7ab840c02200e5cf5a15ef2aae75a2ce5f3efce5414b44f85b5c513af68710c2d18c3a8e151832102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402205d40dda17032ebffbe930ec4c8b5deffa2919db868c55604902ab66cbfa9784c02205e22995e1bfdda2e9fefa19c8a07d449f43b75dadbf83e5f22a5af64fd8779e5832102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0eb26606cb3895e3e7c3160a2acb1dd55cfde903",
    "content": "{\"tx\": \"a9916a060160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127020010000002766d9ce0413900f0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca973fc43\", \"prevouts\": [\"5518120000000000225120396e1e3d37873693c049a0e141d36811f0051f76fd306cc6c1f2259368cdf0eb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"be7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eab0507b9227b06ce0689f3875ade4de998c1d9b3bd044e9f3b63e2ed7f9e05ff6f69f1f3a976918b4a05b157c0a8e21d478cce8b5d78fdf690138c8d187dd5c9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d8c2ac45274f354a7fa6bf45f239b04832d37283b3079f2371915482a2c13848c20793b34d3eca391845c9ee05577f0fe1c8a49b621d2ce1a9da4783f236266e6f69f1f3a976918b4a05b157c0a8e21d478cce8b5d78fdf690138c8d187dd5c9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0ec71de4446b68520af7b2f5cb5495f2f7d56bbc",
    "content": "{\"tx\": \"b925e88602dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2a01000000148d50bc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700e02000000c93381a40114a80a00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac61010000\", \"prevouts\": [\"4a2c2400000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\", \"368a10000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"997d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e874e6e02235f222bedd00290eb9daa035321655bcf09c112e5b4a77998f5c860a0e580b14ffff5bbee812c9f6e3af6b100c6b4cffaf41971c257964f1fb14f6f9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368884d2a2b97e27dc9a8d5c4c13a1ad4f8dd33ff04d22905d87b0003d1fc0339de4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e874e6e02235f222bedd00290eb9daa035321655bcf09c112e5b4a77998f5c860a0e580b14ffff5bbee812c9f6e3af6b100c6b4cffaf41971c257964f1fb14f6f9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0ecc927da181cd3e4cf9d00b158c6acd0700b7c0",
    "content": "{\"tx\": \"f33c648a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1801000000efe045ba8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a4000000002db817c60273f54f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca3000000\", \"prevouts\": [\"3d7d1e000000000021511f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"c54b3300000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09024308dd64e7eeaf9ca2934bb2edc0405828ab2e3c96947aea1a656e1d8ccb8eccccb8a8478785121172cd86cc106b63be1cfa178a8853bb8900b66e1cbed5790925fe42025a2bc1e46e614b26f0e50c25f0bbd4621e97613e00340903a590162b9c6da461c5538244177a8f655a4532d13dfc6e7a7cf457c68a5b8beb96687d9f405dd123bc73dfc9accb748851c6d2e0fe7f7c94cd4f921b7b85876f5dc8bf5d804b43c41980b250fb21314454dd0912e643f5b9f38d9297c518625c78498a62571115265f05ff8dff13a154eb1cfbd8c9aa3159515b16f0eac381d36648eb3b8c37f06925cfc6d005869b5d2a0d70e8d7b80fefab7f1c9f8abfc4f311dbcb1de21f92e97bc157d3c47981bc84dc58cc2e44a78ceba1e1c2a27ccd116a80c1c3cb3a0706c1d1ae044966792b9ba6a12cbce633d9275abf86eb4f03e3dada0e396ddabe7a48c1dac4e83b8e43da7fd1f938f13a44b4f5d56f5c03536dcb33c1fb7f08e72e070d6c39c0ef54b922f830ebb90131659084e648be2881569105b238863c742db2647996fa247f87db1ea2bbe81f20c08666333c7e3cfff05a10e3e0ad72071a7302d77499346ce53c8e8f5c608fc97b39e83b31b8f2606372113c31f9c444dd73862900a33917a9b2c54965064e22d751da0c44acc6f8be5bc0ffa3947a6b61e53d3a8756da5e27f39590647b7e5b6f0a5d6c6d2f1388ccb1e6615020c3ce8e147a7cd83475\", \"967d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082bf86d7708a8015fd8c392d5dfda539be3c55b3d42b83ba5bec57bef080407e280ad15d5ff3e747c4643a2e7779e2cae74c1db700bc0de7d47935e7ffa6ea968f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090220e2abbf680f2ed9ebb9358138d93a8f99cea634015714200ffad0a07283553e012b8ea97ea8f366753988f2d122da3a47fbfa14bf4db54f3ae1081b0e01eb500b86ec085c81b6acf27a05639f352cd928e9918cd40b0aacca273f35e95f9fcdf08f1cef2ef3685010affbb8705aeb6f567ed5da99d80a0d8ec66007855f79e07c9bed840a56359fbc6bf42c1c8189a3fbb02d24c4e3f75535209e1c600f1e8247a0804edda81a3441a07566a3dbed889d45e09d8a09008af47bfe7362bb3b751d9238b44e2b7dc3bcfc23c4092f0e9c5bb3836547cd3a3f53226dedf032d3af18f132b684c3fd0bceab36dcfb608d51e0170c3b00804972a8c59e90b2c80024d975eaadc5d55290089649e1760c3485769cb8693aa6c5a5db88ce8a151aa22962e3a50d465858137719df4cbab33993637ac1706a6dfdd40ccdaa9960118af4369d769dd7452fd281faa7d213d6b9c83175e5dfb9d68cc8644a0b43877c57eea6d2a6e3842bba47c60ca184c886fc752b41694d164b569b434788490ad7ec2100345df48c7643d4e60c7c4b9dacce0088850eb3bc54c1e469c767ba932789c00d7c0b081c2e8dfbe70bd4232fee055b594a9a25f369ea5186508489792c2026fca6e5ada25413ca0ff273108d5eb71a7c025703bde96ed4678e87e1c4a507b4171acd5548a32fbda2f76fd88ac4b78c9b5780ad42a9ee7fdeb86f3af12446f579ba472a47a416dc4275\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360a229273ee78a689305c88529da0b62b319efef7a9724ef9ac9c424c39c39693dfa3c45458ee21e782394432ca1779912e92f35e0ff52c3985a5265a8dee58b3654e31a1d81b19a8c2670362b3a1330b2f2d66c8db1c8314023a61983d2ff610\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0ef9e684b87a52e1d2ec2b274d91ca104093f268",
    "content": "{\"tx\": \"2922ebe703dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb9010000005c19b4fedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b13020000001998e48adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b010100000093d904b504fad96600000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac67c6fe2b\", \"prevouts\": [\"deda1f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5841230000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"70472500000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_34\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1bb7d8ac82792da18cf7b6fc941ae456d366e3b2e5dc80016affdc81639cb19dd353b28add3538645bbf1a95b668d8ccc2021328e7f3352bbb809a04320deeb281\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"35be4efe08071f56f077d44e7e833ed7b38d1d25f107b68e9a061be4f948dce90dea7af84b9ea48a0bf9e685757c428191e8a9f4605c75808ae0a12b0f40bdf234\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0f0de5c345a12934d91427634192d4040e5bd1fe",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4070200000035c405e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca301000000f48bf49ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b52000000003a56f2d902d8daa3000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac6c000000\", \"prevouts\": [\"5bc8310000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"a32d5400000000001652142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"05a12000000000002251202b18b828586b5828635076972ee0bba96c3f290312125c393cc54d832abc1349\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"26c43c1b8ec990445982be5e9b8915828484df8c50e041436cb711d37db150faee76fee8fbf9d59dbbc90642b9a5292906c32de278fa80e07c68cfa3d832e0bd\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0f1aee7720bb0ab848210f3e547b18c4431e3651",
    "content": "{\"tx\": \"4b419ba103bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe30000000088c28bd08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cb00000000ab5264a260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709f010000009807c48504d038ca0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d33e7c40\", \"prevouts\": [\"2bbf7d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"af753c00000000002251204b9049d3a4bee03b6d234dd4c8f499fa4ef0a49d04247a5113735801c2defee0\", \"5551120000000000225120997d8f010f68a117b9644ba05425738241c47f04463545c88006dd06ca2c16fc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_69\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8229af1d9e1a0356663f422ec8b816037cd086555f2f4fb97efe1b321c781b101a39c08fc602478e583b8da8bad33fb23e76e4f57506b5cdc1dfca0537390508\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ac613cf8dd46d046fe317410f8017a6d0e7ffa027284d45d3c31e6a4fe4f9787d47fe2423fc2096b31d864e4656611df0282c756101e505ba3401772217b467169\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0f2ec0ef703ae34c9801d778277b221e6ec19ba7",
    "content": "{\"tx\": \"0100000003d15657a619affff084fc6b1bc2cdf5e85e399bb207d84ace710aa8effb82232f0000000000378eeb7906f5bd527bde63f7c45daff54c390a64a59dabeafc8078a9bd0a050f54db6b44010000000038906fb3492909e056fa5c0ef2af542be68aba07da39583e95b43e24484150891b1d5323000000000077e0c98802d0235951380000001600146d764276c66fec1127e5074db5bff3aa6c52553358020000000000001976a914b2c48f336848c91e9c274b4615a238e127bb7e2d88ac40000000\", \"prevouts\": [\"24977ad110000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"1ad1d66814000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"14cf091713000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_valid_opsuccess\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"699fdb6b143012370d036103fdbcee3723efc7a11d8bb794ffa0cd69264b4b8cbd2b943139985650e3b05e6c591a1acdc72c62e1074032538cd74455bfede244\", \"20159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717ac00635068\", \"c0159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f7173cf6535970adc1aa2e2cd04b60847ed9656d715af72d750ffdba18631024451b7902b78fc59ae74800241e9b7a2e0578a35ace37791478c3e04a51e81e708c61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0f51e2a5ab57413a930a436edf258d17d6ae7de2",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c8000000008115ba958bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c485010000004a1f0fbd0350b06200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7624b9d51\", \"prevouts\": [\"7b22320000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\", \"9234320000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100cc917317757baebac9ac7ea2b4437c4f196381721810a37e5cb17506c1efe01e0220054caeb99365885257fddacda5176a180e4a80aca61a86710c6f9bd528d34dda02\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022038dad12902e5b503b0ebd814cd812e3d4287088d17f0c282c80175915bab241c022071526b902f0a1d8b81ca20efc0cec65f1abbf6fc811eb55c8589312bc4f8239f02\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0f7b105b71e9cb68726584b4fa24c0ebd801c4ca",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41e00000000689473618bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e500000000333fa0f201c56120000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d2000000\", \"prevouts\": [\"c2e73700000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\", \"5e323600000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6acc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362039563b955d2dbb4039cf2ce233b67393a3c90b1c8e11b9e093e855d67171ef5f8b38696f7f521c781f821b55aa4ff86c04fbebd102ad129a9d47907becd36b4e19d3b2ec28c8925d54c04f383936b915813fb16b738060565344c47074fe42\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e183e343f15a28f9ad1157957559cb0b6b8ddccd5d64405c8ba15aa31cdad4142c00ae7d77688765097c61dd6dc7203a99b1de19633b0fe895af4a245d0fe1ab9735478fd9f7e773d9cefb2e6c2d4f28929a19e0115b3c92e29fd8719e7d86d1ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0fa616a640ec4b881c4c4ea08e1a39f481403fe6",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704a00000000197308bfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8000000000a81903c801c1d73a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796b73c7c53\", \"prevouts\": [\"6d9e100000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\", \"456f820000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"477d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936079db4e6166f733d5f26884094154d18acad271c7897e45716ba972f6c28bc89ff81b1159cd56b1887f265c0d653f3c782f8c9b1bd8992faa992c6296a364de747adf318628644459e7d8d4ba81b7833f70746497cdf0fced2937ab961dc2be46657009e9173c5ef8826379cea4b8c999e3ae37a5805e4cc6da117a3d2ee0eec\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d573dcae6844503e10ad73cd9b71da3919fcdf6472c18e1c41584f6b5b237bc2dbbe6d997bdcd7c7603d7696a19dfa7a137162827825260b73e89d3e21fe597dfd9e929a06047270fff43ba4c6b47136464c62381aba7ed74ab98bc69d199aa4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/0fabe142a692b593ed073f5db1ef2aca01dbd689",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa00100000085aa13c060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e70100000090538ffa0198587a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7964401975a\", \"prevouts\": [\"395b84000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\", \"69b7100000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09024a923d3cf89646fe239b6e78edc49ef372a465916a2802bc58363bed0bfb6af97295a944a06831ba07e48ce1fdbbe0c3fbe99f7cd010612193e4aee7cc1adf8f102b8550e11c14561e13f825081218bf0d03e00bd0a88f84efd874a6831c94b90a1f62a1e15bcd144de1fd5d6d25f7eac390835b46ee3efc5e9de2ad4f7a4f5034f57994963b0f95029c14433ed728a3ce0ab2657e3277371413650b08c3a15db7f54c6507457c2704eb74c1925bf51305ce25e707275d73dbd10fc4e583190ebaf994f8b7a73219d2ab05a67fd3b8d76f41d650bbfd3d6a7cd469e1a7ddfd4a6c4ecf884dcb45517fba401be9194a716009a83b0cee92ad5238e5715277582389729a17782ee77aae8e0c88d8a265851ca33cc5e655aa4c06adc294fab4b94cd4c8b5f1470fe6177b7ad941326c4e5ffdb4a5f6c0d0d2e8c4ca36e68be3ae46249ea4a80c21115bf6263c0237ca832eff837f94d7c3a929e863ad157af581bb59e68b2938b7536075b807f3a13a4ddc01433d31258a2a173899ce082f9e616a379ec14bd54b7efd1901da4eb72db6834f635f1936e9ae40d240648784108435103849e1d5e0fea2952714daceb3f6bc3f77d34b70907c2ca67a344e5ee0ce35d5f3af7873d3f11601edaf4718af4da9c4e2ba5128d41b75acc1e289b0d5d96f9f76ecb30075debeeaa16c48d38dcf4744e855a95eb9431aafdbbb0a259f3b0baa4fcfa84c8140034375\", \"9d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361e133a480e620191da8aaca6530685b5d8d82e919edeb5352d49c034c0d561ba8024f0f821479c34a3d08a46a80a2c380535e71b033b1c786baa16eef71e1977ae2f7927e5cc4d53e0e18212acda8d85e01e1da74473232947322e5e96654c18\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090243a349217aa263976d92dce8f5610a6ec4a5e47bd02dab69919d176fd8ee4b03d4dfc4d258d1dc62344e1d0612e750a676ea8359aff9abb7bc9692cdb2b5b33833e3ffa4fdc4036c5cef11a9df1952086df6c8e4d3af51b6b3d3059ad9edaa34cb17f8cb8cc9feba574ebdb2a527b1c9a3f3f2aa44716424a80d4a25cb866a05d9759adf56a1cb93e88fb82a8ebad11a5525079f88a427760443f7d942441b816a482d7ce8fb7b9869594c1db3a8d3fd874b9ba32dad414870072b12155f3837908faa0dabaca85c3e46e0b28fb705aada228c84f18bf414e237637ff8cdd2c26647471b63501e899b8a65fd128ad0479042b9c1bdcaf70f6d0f8b7d92e490d0a48e4d2ce423cd79365f8cfec8e86425ba6bb4c90a0537aa16d26b48c53144e37c92657d46a797b7ae74578a05bd61616bed287e036cc0747c2b4320017c7099aae6a723dc5efb658e0e1a231812f452702ee0b062913a80bad5aed663b50e5a6458f6533593d8c7176d2a0cb7f280dd02f8a8a677932c12fe7e3cdf09f8ef12a1291a9d1dd27f0a59c5b9d0f99fe907f78a9673b9be0003ef1d90bd954db72d67cc0999a25c624f4c977a4f89656831748b08ccaa1b3a694022982709502393410fdd293c0dd73da16d6808e7a0e646c2be031483d000f19807c8b1b2edfdf8e1756c433da925e0d1dcd9f548bc8923b00b549760f0dd5fda53ff3245e86ba2548368aeed566a37fd75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361c801b4c4a2960858f413ab5d98ddadc6ffe3ff6a6f0ddc4e13767870b9a730796b892175c0861377cad04fa4faba87807216c52ab5a24eadee36522f056d83a72756956c694637235f847009e8e23b8c05283b4a047903b3fbdb647ae4209c1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1000a469dfca1be2144a6563e3bc8e3f5ceb2448",
    "content": "{\"tx\": \"a1212fcc028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f50000000035a475f48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c476000000007698abaf02c9fa77000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478702030000\", \"prevouts\": [\"bdc53c000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\", \"d6083e00000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8e4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb46e8601d3af4b3a958df52448c90f2764dee9285ef639d0a94e9c0ff98d78680d8d550033184c6424688af85d43f5bf525b7f6d8111e731f6e2359cae2801b117ed4b6001a8fdeaa28275cc8a939e32dd3c3fbbfbba5c677bbce429d0c1a1675d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c528e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93698751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d5099eb053c54d8f72c6d7331f9a1bb3bf1b628df692ad9b7eecd4e01f4a47bb5aed4b6001a8fdeaa28275cc8a939e32dd3c3fbbfbba5c677bbce429d0c1a1675d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1007d21149445ee61da9ad4413d7acefa9ede7e3",
    "content": "{\"tx\": \"7cd259480160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ca00000000e0fec3de04d7741000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87aa000000\", \"prevouts\": [\"722c13000000000017a91448964eab407ad5d6e123f59d9280ca7998f71bce87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2351212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"9c54e3358dc40fff5b6eaab0a7356c6e097a91d7d87aadd4a30d61eb9667964d011eafb4a8a5867f537a947468abeb8c238a1a7c6b9953215dcf3ff5b714520d\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/100be162498b413ca391dea2387d07097432e64b",
    "content": "{\"tx\": \"e82fd79b028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40002000000f2fd11988bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4740000000030e1c39504a9a063000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac9333884e\", \"prevouts\": [\"093f3300000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"1a28320000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"d97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363255b317c7de6e9ae6bb70a9fb776c4c6a00d056fb5cee6a264a49253b234c169208680e05d04c3942bb784f68e647b385a50066aeeb87d1b11822ef550a3a38682a6e83df749f265180f93fd54e474915a8abfc6fef0a760c06d61a0bf42967\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361d56eca119efe8600c7ddbecaafaac765d2e5fc0abc9d3eeeeb65fccd7070d9846c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2d5942624d66fc39e30c2a996d85a0dad9a6418b79db996452744438b84f9614682a6e83df749f265180f93fd54e474915a8abfc6fef0a760c06d61a0bf42967\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/101afec325ccd0ecfd32b22bcb5ddb64cbc1c497",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf070000000062aabd978bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f10000000022d1bc9003560c960000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb3c81660\", \"prevouts\": [\"78b26200000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"1625360000000000235d212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e92d8101c980eff4377e6d8955a6be6eb9c513a73b76b0c2865d9217ecc002952e790d9c1b6d4873f01b62966c2e29a6c5c67d56950c0adb21878e7ce72b19ad\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/102f84dec76aa32c7c32a67b8398d3433fd9c124",
    "content": "{\"tx\": \"2a4ba92a0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270680100000050b312a0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6d01000000f7b1108603868a800000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c6020000\", \"prevouts\": [\"7995100000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"cdad7100000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"807d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac32beddb8df376ed0f15f8ca557ca4fa4dab9ea34398a6bb2b3d4cd5dda00bcea090cbfbdc5dfcad7ff4463f3cf2898b3c754f5d70a369d7bdece79053e0da647\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ebc7c443b27f0c4bcb1a4d24531c68d10c673cef24ac139c6bf3ae7480664417e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e83f9b6f826008f58b0a2f0424fb9eb1e858fa037e128d89da74120b3f1d2e75bf3dbbf3726cbcb24bd9ee344fc88539efd23f46f5d6cac68dd1bf47840d55ab8c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/10549677366e93a6b247cf85ef6b109794e927a0",
    "content": "{\"tx\": \"f0b08b4f02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cae01000000806254d3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1e020000004cedc9fb03ed11cc000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7962c010000\", \"prevouts\": [\"d7c14f0000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\", \"2f8c7e0000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"4e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa024d2ced480b827388702026dedb2056611ff82f89a108072a2691dd6856cb09a4a8046f0466b39966676954eca5d67ee52b1615e6fe46612ea9ab4edfa131fb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369dbcd1ddf7df12d2fbe56f12d93a74f67dca3a0fa03128d33a048f2d963a2099024d2ced480b827388702026dedb2056611ff82f89a108072a2691dd6856cb09a4a8046f0466b39966676954eca5d67ee52b1615e6fe46612ea9ab4edfa131fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/10624dd984bc11b57e154d0125049824624ef4b9",
    "content": "{\"tx\": \"3980379002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7f00000000bdb16596dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc001000000f9f628ff01158fbf000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a68a000000\", \"prevouts\": [\"b65179000000000017a914f955a33e905fb6c7b7e694c8cef25993577deafb87\", \"68725e0000000000235b212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"21581f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"26814cdf6b8010156c55e773cbb30eb356c9f94852cfb3d3454e0b3c12c52fe7e73c81b9d90ce86a4c7b3fab2d18d4a3c833fe4e9f0f47ab9f6ad8468b7663cd\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/106f9a1f4925d539eab0171af97bfe996099ad01",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c330100000072fc8e80dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c83000000003e0d57f5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1d01000000594c5146046d9223010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79661010000\", \"prevouts\": [\"bb6c5900000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\", \"aa9357000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\", \"edbe740000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ac8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045da069eb8d814e8e6c846f6346fa512368611d0ddd5fc662af48af9436c51fa006032c3262f8d7c29daaf8f9846bf0ed9dbcc4a0f9aeeb7c8ab8b4ceb985f45a6c3d30bc3225049ba56ac02c164836762858abedae6e6cb81f8117394fa9e456e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936555a30cab9babe93a50caa7d6258c00dbdef6dc9d9a8b2d0ae40520e9152db0899aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb470901b40dea8c7a5ffa56ebe32dcbb2bdc70f6165f45007f6a309c26f1d76d473959a095ba405700a8bdcb88c47f737d45523ad768f5b3698c80add34f2e764b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/107e2cdcdfabb3aca2ab5aa2fd3c97288ca30c94",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127014010000007885ab88bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3501000000d8098c37dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0800000000ce51b63e0198b6c300000000001600149d38710eb90e420b159c7a9263994c88e6810bc7bf71183c\", \"prevouts\": [\"2537120000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\", \"5971770000000000215d1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"58b05a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"777d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936317c62222341529afe8f077c28135e4216d182041ddde4bb210fc7dce870fc693c7477a635aa10de5895d22b0b13d3a2307950c6447747564098b225c8ebc094ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457e2aee6c91b47bf7b7aff3c5d3800b2287c2f5852e09bca12781ffc191c1d4f04\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fafa584ded413e2880e88fe5cf9cb62118b35d382d99cebe394016833778f1470de2aee6c91b47bf7b7aff3c5d3800b2287c2f5852e09bca12781ffc191c1d4f04\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/109b57979771e9a623eab0dbd365a6eb604e4d39",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b08000000005eac31d2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5f00000000e9c12dda030e24a300000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487c5010000\", \"prevouts\": [\"bb4c220000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5a55830000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_38\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"318843384a5fd6307421fe114c473c43c927ce9a7e92c77cbd360837d2f3ce568afd9cf540777bf5b7a44f588aebc1fd32897f817bc396db13d556190e34d87981\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0edceeef26ec81812148b0a5c98897bc906ca52cb5da5f40f802de1d1f5cb9bcac8f269da3b88c9a56b9472733d3b2ca5646c3be46707330bb3a069ba4ccbb7238\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/10a884685231a301c2628f0607b449081b250ab5",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700c000000003eac70b460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707f00000000d49919bd011e8c0700000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac99020000\", \"prevouts\": [\"e78610000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\", \"39a5100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/hashtype1to0_scriptpath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4825723baafebd7062b84c3074b58adf3e370d04d93a9cab253810e9c2d90b3c8e12793d4c452331bf9c3961cfbe7230c2fe2c591fdeb87458a1f185e0756f0001\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4825723baafebd7062b84c3074b58adf3e370d04d93a9cab253810e9c2d90b3c8e12793d4c452331bf9c3961cfbe7230c2fe2c591fdeb87458a1f185e0756f00\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/10e147455c54d7bb8f4395e8f52666ee498a10a3",
    "content": "{\"tx\": \"b5d5ba7e02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be900000000704da091dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b970100000044b31bb50347704b0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796a3010000\", \"prevouts\": [\"2c7d240000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\", \"12a5280000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f84c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369bb84f5f1451210ceb72432b3e6d63235af9ffb877329c35283c8b2d18797507891e44dcd1430a53a9228b1d4df01e5c5d5af3846f876ba8dd78ee7e669e7153a72d00f85eae87f4cc31996f158484f267a3b4b9a04e006b9a1cff5c0be2781e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52f8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f5ae99bcfb285d164f9370410e936aae64489acadcf2521c7c395e9f790ed55435701ef224ad20174d0190f97f9f6d3f23a41bbc27fc82fd96c9e1fc2f7b2cb81ef28805a30acff873fd9260c6b3bfee2b626467fb0ce04f716d513a8a4b08b6f288028cdab461d62f9273620b97315e6e9af9458f777a616c1bade2d3f6a89e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/10e2ba2a40c7f4b5bbe26a0ae7a814ef9883672e",
    "content": "{\"tx\": \"2c58931d0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270220000000000450dd28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4010200000073486ed00336a552000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc44000000\", \"prevouts\": [\"63ed11000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"bbea420000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_f4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c18996a50a9ede14356673d49ccc2fbaf76d0bb2740f796e6e0626b92728f0a6acba91321f22429f5166252b8ecdd37ebf5230ac334fffe2d27b205e38471db883\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f24b2db5f83e6a23473c07573e33803dd9ea06c07c971dd5d2949f3f18e48b3d139020e8677fb0b2c3ed9f2283489d6584e2e5a478534918409b6edaf64a344df4\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/10fefd7899096dc27cf05039ac9a172231d52173",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c00020000002b7885eb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e50100000052310cfd02d0af62000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac12010000\", \"prevouts\": [\"b53f550000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\", \"eed40f0000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d15d544d61c31b4fed0aeefc13ec08cc85209c6d5b38125e07f8d6b119aad417a9cc7cf8942e20871e843abc4d08f3260aa34782de145843bab753526013ba9d6000ff4712f1551ed36f1c3a3b6b2b237c7925585bb72d1991c7487de12aa2045f2292fc61c89b5afbed6a11237ad29f6db36f760dfecf42096516463315ad69079cae38d857203628e5a2bbc04266f26710157112a01495eba3346e4dca46eab56e48272ccb02bc5f30d335eea1fcd2ce2954c430ce26d0530bfbdfca8bea0066f7c58eb63705984a6916db34ad728d972bf125bd95938c8af9b5fabd6def1d8ab325b69740128eb3db07bd331f7d3cb448727709870987c37dd1f722dc9061745e4c806a33be348e794440fd3214fc5625237efade29e0df41582d5f717de1f0392fd754d6c44ea7aa742041ce538ea82b74ed172d374f7be3c97b212ec2e2a2efdf2e2ccbd2797caccda97a55be1113bf5ba63e96174064cefa2e162cbe7d427a7b04b910361b84159e0e2080ed07660e49a4adac55ec179557db0db7bbbc49a1ae4324f4e54905ced6895d3245bc90ca20f510f04d4553d24c2276adc93290d06fed4cd5f6ae28ee091b43848791fccbc29ccf1355625374adc3f39018e2520bee94d08d27418a60b2155d59446061e6d1a412e6346638bec392684228908903ee901845d34414c98436faafc0191f30c0e38a346b324bd79e30839b3e58c04c6a56f7ab065b0e75\", \"8d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa6c417b1d65e26db5cf9371b0ce7a9c3a110335bcae099de9d0155d4e514bb408a37683ca92a47492765ed69e840601310475c5f70013240e7a67747a5da918187472d664747fea006dedee35c74318028ad9a0ae37c154fe8226ccc2af402983\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09021008d23baf9c904d7e1664b68b2a7d53743b9f098060a028684222e1959810f5360f94181368887278c7a4f8fe66e11b90514e89ed7c586a382abe671ea4e34ca1f7f9e99472e21a7c2cbe1a304d3eb8f66c7130d96c1ce1690551d02563bd28745a187b35914b1f8ad6886f82cba13088c9a596c46a73a83f1e83aa46ccc16e55c186dac0864dee058e37a897f2b890de699dce56bf0238e584eea74960443880ca083c3d02267b814b267f1e6b39efd0b8f4ea719c9d8afff3be37b6ddc31b349a4e9c3eb6f4f82fef4a0a3e93c7e651c65545af17d888def481cd7dde9489fb1e12402f875b5bd463127d58478f9fea8722486a848df31352f808d67eb3b7b879757a0d73e7996a11623d6ba5f20509c743e039e5e8e269c4db86a817bf90790c1105f969dfb044b1b786e033e64ad98798295e4987559b40ee48f88aa3fdcf5150ea11c1ea98627a42d5a80f3c80cd832eb3eefae58019d1844c36af6fbd56983e1168fd397fa93be636ff78e14fc83cd6b8b77d03ab86d7761b901eac2f89bab527b678f6a22f62d5aa725ef28c3b5756ed2dff0e3d1d8e711c1d8aef312abd0c2a87322ce433ee160f966a86d5f49d43e492e8b8de32a3d86944df8ad654c9d2e75cbff386d53dd5417259a072c0452a0590841491a28ea2fbffbff6924bdef73ab12dff424ee121fdd885c317d64c13a76cc7c2d7e10c3107df7ad7f0a713454575834eacfb75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e80492d17ab4c59254bcdea8b81e7721fca5f8758b8cd0b322bd5a652bd9dfe7967472d664747fea006dedee35c74318028ad9a0ae37c154fe8226ccc2af402983\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1113b16ac0b3e4b76353eb896e7272061f03ff8c",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1601000000ce4364e8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe400000000a9dbb2eb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46000000000b49550d804b90201010000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc60416b55\", \"prevouts\": [\"b6636600000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"becd650000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\", \"4eaa370000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_27\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"77a42b33d07826192717f841bbb97d4a3aee00c2e26de594b231dd079f86cb7e7b37c49ff2c6e52df896e11bcb6e3559510c46e5c113f9b83d10d4df08ea67e502\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e42c5ca8cdf8f2ebc0c45de9d8184c5d872850a6a0cc84e9fc6bbd851a651cf4e37e151424d736cf656b11151a72c82fad84c292047afb49f01677a137d334f627\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1131434b4bb6f2acbd59abb881c239975a1116af",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca1010000002f81b9ab60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c9010000000f201065042881640000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8764000000\", \"prevouts\": [\"a46f5700000000002251207c84ae2d9063cc63412a30e00823aa01b05bc54bcf6d9936dc1c650bbdc9e98b\", \"d71a0f0000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"7b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb2ec5b5f80be5ffc851a24e9e2606734899b00ea08cfb8b544162f48ce08ae2064fb6de85916ce1333b57715a419fbbb7fd448155796c8af09a2e4a2bc14d947\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d8531e2fd89fa5f39409e38f05906a9d1ca5d490c9939b0e896f59f0755d169eb2ec5b5f80be5ffc851a24e9e2606734899b00ea08cfb8b544162f48ce08ae2064fb6de85916ce1333b57715a419fbbb7fd448155796c8af09a2e4a2bc14d947\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/117e130d533574c601aab37e70b93bae134a6527",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9b01000000744771be8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40100000000c8bd0fb801d2b675000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87c37dd022\", \"prevouts\": [\"f61b7b000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\", \"8dc2360000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"677d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93688382350e48c4cf8321145c516ef78ca067967743c135ad2d056468d55d14eb52bba6f8d4f5daf96bc6060ee089cc6dcbd533ad30ddd55009697a11ce72a351d2e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdbceae773fe677547a5f8be2986f5e4c7dc436c0d3f0e1e86711aa468c8778215\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cdc40148670f97d658d45aac2004072c8bcd1ff901e6e1bec20ff924a01653ad5ea7fd6123a97de30c69bfce8661bc08bde914a895a50530d51ffe984d9d20eafa195b9f6f39c732eb35859a6bf094cf148e251ed4d8a79570f47a225cba2c42\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1184f4a41ef45af98fbb77736bcca10e157c347c",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf280000000029e4a59edceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd60000000005371cd401525245000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48722d99d32\", \"prevouts\": [\"4f2071000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\", \"990126000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6afc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dc78fa2606fd84cafa3e9f2d8805c3b820cb57841f4a0769a1e9f387ba6d96c239c06a64e39d88ea3d05132fdd32c8e90a6b90ff74e726fde2d8f99de3a7b89959b5d8c486a0b4fb1c0695d0398f92463f78d98cf4d122171b1dc85f0cff66bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93669c989d0e3cd6f361274bcf4d5c8319fbc2250da7e1afff7d5a216e9b52c6b5ce96c6534a767436613e49f724d4ec24036cb4bdca8403821be2a67ec4c00c0e3731d32c4c28957ee8de75561afe63689e2428997edbca796d37c8feacf80dd0b4e0df2464f99a35d5bc9fbf69ae3045675e957332f77327dfd622124d00cb4df\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/118b63929e90757c8ca1ec818ecf53f8b71c70fb",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41700000000818fa90adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0101000000f46e8321024948840000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e784621a3f\", \"prevouts\": [\"e47a390000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\", \"b2b14d000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"d3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e15f20acab37c5a5cb044828a71c51f411f3799e0c9201344692cb6121a679af6a96525fdd0eb5f3c5c39bf5b04d78b37703e3d3b538b36e17fa0ddbdeb236a5daa4337ae81428241101d56ff91a1822e405405037c9afab8da6ba5df5d84918ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa108807fd1da60fca18a375aa3fa2202a3eae5e0bf99a9374f58816bea445c879688f26c44e4c38ecd8996ded351dfac291f6a9fe2ce500158a378a1caa9ee2234a5a049dfcee5b69ebdb7c70e6242c675d1abc9cd58c84d7f9a8e8e1277a43a4337ae81428241101d56ff91a1822e405405037c9afab8da6ba5df5d84918ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/11b1f9db49bba588d8f418e89843ef901274fe93",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702800000000800da0c18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b4000000004386efe703b659440000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1bd3c834\", \"prevouts\": [\"d1a1100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"46513600000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_f7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e0f26ec8b7c33a1f3eb4d65181d089d5db4d2bda9d68ac0f17dc311aa5c956daf559749149d33519ec46e33695dce9a9766132a6e0dcb49d3966c6f0b0f6a82282\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"597962e8961e4e72ba14b26e40d5d6c71d81563d7a041f081065262e729fa2db2ea36f6eb4c88882bdadb41f87129215cb9081fa2b807a209689ac7a5932b910f7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/11e26aa15592a14b6f7dc59ed4225b0ceeca2418",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705400000000d43674c0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0201000000aeba28e203296f2f000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df97972236898731a52e29\", \"prevouts\": [\"cb58100000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"f13f2100000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e74c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e907011b224c3ef86d2f36e7d89b63e177b85cadcf6e2dbac0680b671e6366dad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b292a4f502e305109d81040f98432632ff806e9beae33e8faa7e022234476532106df482d4085282f873fe38dcb59fc4eea3656d896112fe243f784a0cfce46b53\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52e7\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a046b214117572ccd993880051dc23b22a6e41bbc520e5dd4f1b896f3a7710a73f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0826cbd7cfc5d340306ce0f8e37fe1bfa8aba9fd4064e6187eeb928db0d0bdab726391a14412c925771c32fa4c7776d5872be2a56fee9c5a8de868e7e6e5a4c84da\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/11ef5be6a614ca068f2c89bc602378f8ce71d763",
    "content": "{\"tx\": \"7f7876df028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4830000000034c2a7f160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270da00000000bd4927c901e6090f0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb48a7a2d\", \"prevouts\": [\"7e07350000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\", \"36b70f00000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f49738aff57e0a6b8995805d8d75c600ca2593a4bb41e712efc7b944ce86ac09656c167d78024cf9ac8ab753e035ddcfbd9ff3ce8d671a87b961f7dc5c285e19485290b5b24e8c4be158b28d7aa15f62440c20797f0ff9046b08dd5d16dde3f1e33f80b1056bdf2c24e0af1480ff60c2334c347ba12327dd1882336b0f4c053429fb79e32ecfbbf5bd1c1696eb5b1bcb10f531e388c1102ea723b9fbf0c99b20c2cc384f00694f2ca582ed6f519d67422787b3478b24421a6c0f267a915ffae17fcb29d5f40f8f366b918f03c7489cab980b6881ad92df9455e0b0b3b7134cc68c03c16e996ec63f484ec764477f627458d6ecb044b54bf51eec799b6c77c73f13ef126dc2f76fb12aea072623700f9e4c4acfc1ba88cd859a6adea32c0206345ce2bc3e2f6840b9682f8d28d6f6798b009b713b500f916d557bb00d0bad132f3c24c8cc2d69a4ced7956b8847e7224495190407a0a25d7dd56b175dbff8c05bdc1fd6a26ed7cd5fd0fa447ea059246968f013d778895114414babd34440d8bc5b07a91b47f59910240896b68e6976eb8879ca698c202197d7ccb29fb40602c1731dd97d43c9aed2b6aec38fafe90d690c8f656767ae40840ed35e6ffac5978ddf72d7546486a5c310c35d3ffed087d9795b44d20a84b8ac805f55945438a98a38a9550fda80bad11962c36fdea2b4c92fb7d155a866150210dd8ea50e5d3ad8c757bb6e242d7c541d75\", \"d47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9facc94371513ed03fc9b5b146a2753e7b1ecbc6d9bbcb6df59d8f1ce2dd42b56b227fe8633af3ad90c30a4ff6253cd799a6a417bd03591c5308acef4cef6c60fd438c2fd1368e2cc97a2933efae2d13561032948a77b2cd5d87b5e0b8010cd9f32\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09023e40994aa88661520fa6e599727d1ab9e832bb0b282abd1124ea17548d548844dd0634b83b5c8c0db635ed35de4f8a83dec08f2d50958f7753e5c769656025d49febf8568d3d7733f172e292b4c9cce87312e2b499b97b8e1c483e0a54fbc8580f5579d12c2790eb2cb1e473e03812639f15bcf56c7befbcf7d064c31896dc7624e81d3e15d5a9b820e26272e6b9a4c878916877386a2c2b3038939053644ffff156945ea7b218ebfeaa10e232e794f7f5fe244287ac427142a748325bb069b1c5ba6aeb061e841fd02ff9ae34e35f14c6a681ec9350b40a7f255b5909d5f1bfa95e94005fe04206798223cc28b0904cd761ea42a2291e5ed447800161c48db345957c7ddd0bf5460837be67bdf4bcf24941097e599cc8da062dfcab3cf264e95748c71b390d2e473317b2cd6b3a1505419611bf4416e769fb19c2d8050c9f0bc2bc3d9620e861c2f1849b4a4eea4ba8bf9d2dd2b1f7cb1ec26c3f88046a9a3573881044695f06ab7e154e7184b9c4408f8f1d13190da516bb6a6bfb5f0e0275cdfbde8395b311a64112aedd23024e8106419d161efca56dbfdcd511c202341687438187bdc3561b6a845e09e329d9b14fb9f607b488b4faa0b40c56f7aed547dada4f0286692f3c41c13d3c6345e80287b5c56b5d2640d62e0abceedbb16304f22d7c5ab0c75961b177f1af3f91392e1f43fe9190085d9f4dffe6772a2d9317e41fcdfa139c662e8875\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369694bafde2e274b368d6d3b86a79da485f5d9deaac6205f36033c146f59aef9927fe8633af3ad90c30a4ff6253cd799a6a417bd03591c5308acef4cef6c60fd438c2fd1368e2cc97a2933efae2d13561032948a77b2cd5d87b5e0b8010cd9f32\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/121e9e0d61998a2f829c791e9f23a065b8ce683d",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff8000000001375d4d460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f101000000e076448004e67f8600000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acb4030000\", \"prevouts\": [\"620f7a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4e3c0f00000000001600141cc39a492a6f67587324888ae674f2f534a7639e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_14\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"472efdcc4bcabdde7d5b4f147cd6bcc16505dd0aa41a77d4e90a49fdb8bf011aa2ec2b3576c822a55290d1e7e10e5e51c44f083844c5561f44ca3ed214581ab782\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ee16f338ced795c4bb32d7c6c443d28feb43c1533d667ed29d2e35200acc18ce1c507a11412a4707654ae549de36ad18f218626cf6de269ea510911bd0018e6114\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/122e57288341172f17f63e1689fc9a205e9e5905",
    "content": "{\"tx\": \"db212fd101bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8f01000000d3e8b7d40278c269000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a665fff835\", \"prevouts\": [\"396a6b0000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a5119591238be1dbb96dac89a2a1f4200bdf9ca9ffe70af608a628a478a97cfd82e1f304fd5cbcea150151ab9467ed7486524704f6f52be5784e497cf75255948f2d3b38adb8d43e963794c7c849e38b96159d46161410258dff8455721475eda4a439cf7360b606ade423dedbcf68e000a449a5c29ca30f8214e663b5d8814555c4f61973560e1f9ca1364800e359bb1eb1bab74f0d94c9cb3357557af24515d54d1d44a4bfef2597e8260d3b7ea6caaeb30d79fdf50379e989ed159a35d661fa3c2033d1640b03e018857a4e8c9c17ef041f9d177edc87ed86b4bbe57513723ad8952b174a25cd1553e775e2ca21c74adfca8ea192ecef0f9a746e7faaaa2649138c9d9907b0f99f890a0610afc95b283692c4b843558a929b80072136c64b58b8e3576e409cc4398b453b1136ce9a90a80dbfb98b113fd3c22202ed94f701259742caf849a945675ebeecc125cb16f935ce68800a6ca2599208899d72d23829c6c0cb5c991d6500e86e8102378e6849f3f98e77a9d29415896cf2dcf894d9f6adb07406cf4856d17152d55bbea73ac6090dfbaef00f59de3b952aa625c133e7294acfb968b34e5fb795d6e3b979eee0b3a1ef3aa158cfda9b676686457ea4b75c3e7477666392d2f159c406fb7baad0fed77a59cbb6aa31d751ed1b75fd3e447e2fd066e986ae57b6ee84d6d67eddbceb1d5182d30e4a7cd131d9aa5176688a5395e5984c10f87a75\", \"597d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93640c4fde89207c6347043abb6407e1fad26c074a321948ed0af8764114916a85f613bea5824cd1812f2095288c03f032c5bbbfbbcd6a739f4744a40299340ab834be962498b383c32e8a84fa570ade752f3a2216469b10dbfd65078bd8e1b5998\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902761724686fbb95927291d5f9a02b864b6c6593ee844395c7ba318c8b6d9d880156ab95e1a1a00d9238abfe4a8cb2bcdb1262d6dff2fcf789b8714ca19637a47eff2438b5d7e3dd42ea7785ef92052ee84b532dd19cd59beb11fc7ce95afaa108fc8844378309d8ec3850160b8065c05218aac6ae82f4279f64b45e9d5c2879874eb9e1c75ea61dada5dea106ccac88dd96afd7ff4376b128097e29b6104521914654eec1f73479ad069b1b99075a0a99c1d5bc06478500328bfa6841a6eb43909316e4dfa0628f5151fa33a9bebeddb31b3d2a1cbcfdc5618e4db77fe6b4cc3e155769e1579c1679b3b8b059999769f6e3c89bfe76968b9ad46f90e4a9921bb2363c027b324f1b1b65d2341a718e791c7917c253d4530e8aeabc3f35409b4d5678170e79d373b80a28b7246bc14c4f89004116298f5e61530ed617728d80d96ec01a7f5fb066bb7fccb516922b255cb8079856c8b5aaadc6351361a7a436ed4d350b961c66647fd37582ee5608aa7108f5b3d4b0420cfe663e262066818e7787de72dfaba5f710db7717e07691be14e835eb8b6b398d06077f2ee8b77ee994f955d67cfc8a2a8fe5c907730eeed4f898442d39c49aa4bc1e40979d22a3bffd0d6ec7af5e74f0e0c695665c12151623f8b2adad509b4bb91bfd101526905c8e506f38a03eb28fdb2f9b1770e7ce1972571f7eb4a4817890c35c48d1126b47bb342361804f5917c5d27875\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b93df312d52b8f2dd4a25d0e8ed5a68dc4d03b1b80fcd966f75d6d56b0f35fc7d0160c53d01d80ab4be204ae4e021ad6f56ad3990ac4b37baa4678d530d3ba4ecd61c62feef9509bc7b3762bc81079411fa6867ea4986820580c60fa1e8298e9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1260bed4953f82e80f379c79bc4484db28c58d8a",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6f00000000469d4db760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ca010000008269a1ba0146b74100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5d010000\", \"prevouts\": [\"31f95a000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\", \"7c1d0e0000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063eb68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045c5036d5496e9f4f5147754f04cc929214b621a1df3bcbd671a812d74f0d7877d399891b33f3277cd8a2b8473e2e6079de1e6f51840c7864da48d9f2287dbe494cf9ce2244c675144b577c27c052f9ebd481172245e28e9502c6c6e8f12c64fa6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f8e29bc07f5e449d4f156ba38c490a95b3b86c2d169e953b485a0043ccbd92b2c5036d5496e9f4f5147754f04cc929214b621a1df3bcbd671a812d74f0d7877d399891b33f3277cd8a2b8473e2e6079de1e6f51840c7864da48d9f2287dbe494cf9ce2244c675144b577c27c052f9ebd481172245e28e9502c6c6e8f12c64fa6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/126e5c88c57ce073bc1e63e4306d21823db4b99a",
    "content": "{\"tx\": \"23fdaf0a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b660000000016a519fbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3a00000000879540b203c8c28f000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df9797223689877e1bf628\", \"prevouts\": [\"a61d230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"95886f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_86\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"28e62fc2ee5d4d1c39dc02111f43286367debb2554174bfd295225e9c3e08a4ec3623d598784eb10b211e396e5f04b1a9903b6ce2185645362e1af4671d0be1583\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7e87ed8e897adef2508c81f8ca58d8f76435c1e213a052aeb6b1a81f403f49b99c27c41cfaa65b658a0432946c13cda274c0d0cceb793dd7a398116acd02e49586\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/12bcaf48556b4780abcb73c4f32bd274ea7861bb",
    "content": "{\"tx\": \"a77294ea028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ae0000000081d69fbb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a501000000e28dd3c903cee874000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7961f030000\", \"prevouts\": [\"b5783700000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"506d3f0000000000225120fd767bc2bb07e4ca9357cd933b3dc41f590c00db442e0ea12a871bb96cd7e63e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_5\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0eee1782b97d831fe5b635a1d15fba66455951c9e7db31fa98c9a13621beacba406ba378d6d72b358340d9691f1b28696a0ae33905c482e473c4b1aaf6c6ea06\", \"ce474e327dba7b16a19e7f022304063ae63fed1e6fefcbf342ebb202d69441094ef7adf62c1e8e206792e6f2d75db8e4a5e27795fe78e1a6bbfc8f1fc54b52e45a93787a4293df74d65e962b279ec3b8281f4e3b5da43f78bd71d08c57d231cd7e7311be70d7f92036117575b8b34b8fb4aab7c36590ea9614cf3747ca2857ac3167ea725e92eea21ca8c0027522ceb76a40b877f027b9\", \"75005a20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5a8820871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ce99e795792a3b123372692f0c3a2a4c93a6e7d2ec701c9eb9ecdbc27fb0b173956ce300fd1e9317d4788f7559d429e7197ed501cac5b77a30e2e44415254b09724fef99a662e9e1211e563429ab274b90431e7afb6bd5e6bc1fc2f69ae8c56eaac2348dc1bc3cc94ec8cf7de9027247edb1bc76738ded447663208a650b6368000000000000000000000000000000000000000000000000000000000000000070c7c5c179be9d813c0cf052f58ede075dd69e9389addace305677f5b30b36513d6d2aa7d7ef2bac0796a7f067802cc09013c9938e1092ff0cff91b377243fbd10b4abd4c7bc52f818dfae0a3b844a8169fc36593cb4fcd8517ef1dc3172b6a5ddcc86569d849eb34dda562dde11802e394bfc7a773028432e86ce627b92820281a83512c0859f3be040e42fb163f3e39752589ee9236f7fe48d580e8d192204efecc98d6ac5fe619cd8ad0cbe0fc4dc0e56bbc9f1ae493e2910f90cfe3f8d98c0ad375b221c85e52d567a24f734560dd280e896030e1b12e2400dc1fee7915e8ed1d36077cda215168c9d84d4c8153e60def32a01852c2c26735e2dd6f3bf0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adff78ea746c92e4190d0870f7ebd1ce03f586d4871d15117601f3e4ffd74e3f0000000000000000000000000000000000000000000000000000000000000000c73e27c47df88642197488deecd32c4116ec1c1d8f7f333dbfd9c2669a73986156cc523ac66dbc0b610fc7bcef654b2627e947586d674f84449c8f337d5ee34ec0c43b4d2f4ecdf09f2d97bff72819c23fa178f90987fe0676fb36370e93c8f2b09b5e3ac0ac3ea7e49f1a022bda0c0d6baafa3ce41cb6a8b1b060d6fccc723934f5021c5ec5c2dfa5528ffc937480d61e05927f2e2520ee5ca048e551cfda9579584991385068c9da37431443a24de399dc09d0d76e537682de413315c926d246c5023730ea0c4860c7fd0014d26a2a4ed97903e64a01c4f630caf802221c5cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea796666a94a0c67f21efdd73ba3292e39c52318c76f9b210f748a7ed00446b1ad7e67a428810fd1e33ed1839251e4aab947571ee6f49aa48e2a150e16ebbf6d0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67d462f37a9d770a4f8ead434365d5046e2ebb8297f0e853bb3bb0beb201cb0e0000000000000000000000000000000000000000000000000000000000000000decda19431cc4754921f93ac4190ac4ee76e9e4de08e021654cef7b7cce8daf2194f1fc6826df2785bea12215cfa124ed99c3d934ad9a4b7d77d8cf7bbf940cbea4d65835e1293eb408359245301ef20afbd6a540f0b0920173d6e05e146359affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20ded9e62f73615653886d425b45e946d4462aa27e02a509d5c5386b0847b555ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3613c27ce8e2c5209a8d43492d3af6271b81ad026e26a522c8ec55518cf8687240ae14aaec29caac32227e58bcab2d1598fa149b910a9cd0a488190cb981085bb8391a784c88eac8b12b46312a4f74f8c3ceb9e8b881c6aacb015bde35d07c8d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fe8da1f9d88e3062da0007ac52479c42f9a5b81ee1f2fd810d585d00cf6556ef38749dc81a5ff71c3c675c9caa96943d99af744bc309f76bd49a9cee4995b8f02e65eb31a4a70aae63ccbd0f7b7f8d6a912f87fcf44e5ad58c9f9589edc62ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffba18c4c3a42e636a8443264b2e6e8eab468027391f7c4b9e7814f828d2391fecf1b384450b1ee2de452b1834a32af2090cef8402a93122d7f1b093456d6ff73a1ad4cbdfe487f1c681c3fb37cbd28c5d811bb5ced4213cdb2e14cfe902a2e7800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5d4b29dee92766f94f831433289b3ef66829d09ba2abe29cd9a06ec326bbfa7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02ee16e1355c0cf7be210e658ce6ebd74ea4af503edae2f334b59c65a762af46797cf1ddedf299ee15e627789c8dc1c08423ed2b98ff96415c83a376c871549c93bafc7946aed19c633190ed64207ac84d8e29bc97db4f5d723f15cd6e45186bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff57d7ae1df51adb96c454d716899a926b68d13c9968645cc89d3cb5f86cb7ad0f42b60ac760679b729b7d4b807b11893438bb59579294c12a8dc02797d45a86e3669345e25ad0e64f6155549f56506e4cc950539005f9f87d1c54cf5858b7288eb00ef26aa80f15e9be38c53671b5884efe77fb24e73815fb48dc37aca10e832edbbb914d4e8641c5c7026c2d11a50a72fe5431742d7a3c08cdcc47856b2757d8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff089d41b55aed0337173ee62811a8094c029970d0623ac4ed1e8153a4606a47b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff17e1bb55ab6f71c880fccb048eacb4d10a8cc3d4b56471a43dd63f692c3ed4f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff881c26ae3d6c9437c747bdfc8b1384db985615fba23944a17c5f1c09d1bbbf2bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd215a4d83cae44eb84014910ddc131b8a9a891f567d5930a222ed5e2d147ae23b841e46bcb54bdfac481b6520812fa0fbefe5f0ba840599d459e472faafaa792dfbc529aaaa39fa38c21ffd97070982f76989e44b1fe6ba3ebc515e22769fe6e740e3e0bc9e28d77576468dc11ac305ba8bcc3fea44f9ac8926b8095a1b35c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8dd6f353ed25b9760df5d18dfabde5abc637fbdf4b4fbc8f271e941c2111fec5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024345a9a2629ffa5c80af68be2abe39baa7565e3101dc49714683273bf926cf0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7239678bdab2834bc126c9af902186f0e1beeeeb1b13c60bfa4c0ce8245e7321b8b07ab64ae13c1f260f34217a5ab4d79e56b6b01cf58746b43fa9b756e64b8c000000000000000000000000000000000000000000000000000000000000000037af4931d2296edff9601a2574d241f9a94a0211e878244c322743f1cbef996432c4641166bdf22da19cb0a5f3c90108b3a825bb829d765c4647706a0215e3ec0000000000000000000000000000000000000000000000000000000000000000624dd1a53cd497e05917360cd8d4944ea710ee7ceb01c82f93be995f0c987354ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99860e967739a24f87874bed00b417705d9da1c1609106d5c8ce02eea1c0e5625c230f2a4335148a105219d3a1945b3b4e00df0452882ef5100bf23f22ebd5a40b6185328e20211949fe04cdeeede68f0c4d45644a13cdb74cf2444d0be0f5e0bead34447df0fb6000892f14786ce165149060ca0648385bbedcf24b398c6148f8314fa195f351df9e4f10dbb0d36560f3e37896f00dc6ae4995b4456de943ed00000000000000000000000000000000000000000000000000000000000000008ad7f587d130728e281e6557dc582636c00bd0f410b4db21930e82d84617c0e1745226160b9794b3d0ee89d473050505ea3a87e59d8cfe3609beeaaf85747b396de35437058f4dda156063a419fca8b483b352b8816a9eb40fbcaa5d4e5b4a0bcafeae664288c1883780d2eb572e811b3948af113aa57e256e0b645e2643348a209e3471a8178ef49be358ba1a1b821a696d354e8019437766cdb980d8a577bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008424e83a7bce5e70a44f2dc898fa43c2fb1b1f65ed16dfcc1047c83c5e4d856a145ea7b13e44b74135c6d7a0612617c38da6647d97f7e6c74be49ccd9fac8976918ba41213fb71b7844b1b6669ac9d2553545279c18ba96d1f161295c3dfe580b13665b2d82f719efce463a0dd962d16995092329b8065c7948b3ed93df1a2bde63e6804c4a650fa562053414457f5e53dd60051e198a0612b24997f8ba9241a60100ffb7196defe5eb222672be5d06a0a24a9ee6b3e0d68b6d9b57e2cf4bf7d6d10c2901d0948927be1b43cbb38ce0e2e75a59c484e6a051bb4d06cc350d9a7df24c911b0c686b13da4842e3f1791c591e6e7c5d495c106ab721c1eb10df6fa983cb7e31745de028fadef0320dc751c0b07bec602f522cff0b9737a536fefeff7d8b5e85792031ad2a46f9efbd5838ffc3330a511f129987b211bd6f48ea186\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0eee1782b97d831fe5b635a1d15fba66455951c9e7db31fa98c9a13621beacba406ba378d6d72b358340d9691f1b28696a0ae33905c482e473c4b1aaf6c6ea06\", \"063f8403c9a8ee48c87b859e858579b6c39196751715df2fd4594b214d28918766fa70ec1fc897502f41ce11673996aab1105ecdd3baff21871dbb807e140759099f15a3ec7e37999fa31fcd7ad12a14d4b09e141e51ef66775529dbbe1d7494d01e48ec3a9eb57e7228479c787f99c396afb3f87b95b23f0ae2633b2d88e83a4cf588d6ce6299773e351c05d19d605ab16b9fea15c9\", \"75005a20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5a8820871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ce99e795792a3b123372692f0c3a2a4c93a6e7d2ec701c9eb9ecdbc27fb0b173956ce300fd1e9317d4788f7559d429e7197ed501cac5b77a30e2e44415254b09724fef99a662e9e1211e563429ab274b90431e7afb6bd5e6bc1fc2f69ae8c56eaac2348dc1bc3cc94ec8cf7de9027247edb1bc76738ded447663208a650b6368000000000000000000000000000000000000000000000000000000000000000070c7c5c179be9d813c0cf052f58ede075dd69e9389addace305677f5b30b36513d6d2aa7d7ef2bac0796a7f067802cc09013c9938e1092ff0cff91b377243fbd10b4abd4c7bc52f818dfae0a3b844a8169fc36593cb4fcd8517ef1dc3172b6a5ddcc86569d849eb34dda562dde11802e394bfc7a773028432e86ce627b92820281a83512c0859f3be040e42fb163f3e39752589ee9236f7fe48d580e8d192204efecc98d6ac5fe619cd8ad0cbe0fc4dc0e56bbc9f1ae493e2910f90cfe3f8d98c0ad375b221c85e52d567a24f734560dd280e896030e1b12e2400dc1fee7915e8ed1d36077cda215168c9d84d4c8153e60def32a01852c2c26735e2dd6f3bf0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adff78ea746c92e4190d0870f7ebd1ce03f586d4871d15117601f3e4ffd74e3f0000000000000000000000000000000000000000000000000000000000000000c73e27c47df88642197488deecd32c4116ec1c1d8f7f333dbfd9c2669a73986156cc523ac66dbc0b610fc7bcef654b2627e947586d674f84449c8f337d5ee34ec0c43b4d2f4ecdf09f2d97bff72819c23fa178f90987fe0676fb36370e93c8f2b09b5e3ac0ac3ea7e49f1a022bda0c0d6baafa3ce41cb6a8b1b060d6fccc723934f5021c5ec5c2dfa5528ffc937480d61e05927f2e2520ee5ca048e551cfda9579584991385068c9da37431443a24de399dc09d0d76e537682de413315c926d246c5023730ea0c4860c7fd0014d26a2a4ed97903e64a01c4f630caf802221c5cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea796666a94a0c67f21efdd73ba3292e39c52318c76f9b210f748a7ed00446b1ad7e67a428810fd1e33ed1839251e4aab947571ee6f49aa48e2a150e16ebbf6d0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67d462f37a9d770a4f8ead434365d5046e2ebb8297f0e853bb3bb0beb201cb0e0000000000000000000000000000000000000000000000000000000000000000decda19431cc4754921f93ac4190ac4ee76e9e4de08e021654cef7b7cce8daf2194f1fc6826df2785bea12215cfa124ed99c3d934ad9a4b7d77d8cf7bbf940cbea4d65835e1293eb408359245301ef20afbd6a540f0b0920173d6e05e146359affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20ded9e62f73615653886d425b45e946d4462aa27e02a509d5c5386b0847b555ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3613c27ce8e2c5209a8d43492d3af6271b81ad026e26a522c8ec55518cf8687240ae14aaec29caac32227e58bcab2d1598fa149b910a9cd0a488190cb981085bb8391a784c88eac8b12b46312a4f74f8c3ceb9e8b881c6aacb015bde35d07c8d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fe8da1f9d88e3062da0007ac52479c42f9a5b81ee1f2fd810d585d00cf6556ef38749dc81a5ff71c3c675c9caa96943d99af744bc309f76bd49a9cee4995b8f02e65eb31a4a70aae63ccbd0f7b7f8d6a912f87fcf44e5ad58c9f9589edc62ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffba18c4c3a42e636a8443264b2e6e8eab468027391f7c4b9e7814f828d2391fecf1b384450b1ee2de452b1834a32af2090cef8402a93122d7f1b093456d6ff73a1ad4cbdfe487f1c681c3fb37cbd28c5d811bb5ced4213cdb2e14cfe902a2e7800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5d4b29dee92766f94f831433289b3ef66829d09ba2abe29cd9a06ec326bbfa7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02ee16e1355c0cf7be210e658ce6ebd74ea4af503edae2f334b59c65a762af46797cf1ddedf299ee15e627789c8dc1c08423ed2b98ff96415c83a376c871549c93bafc7946aed19c633190ed64207ac84d8e29bc97db4f5d723f15cd6e45186bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff57d7ae1df51adb96c454d716899a926b68d13c9968645cc89d3cb5f86cb7ad0f42b60ac760679b729b7d4b807b11893438bb59579294c12a8dc02797d45a86e3669345e25ad0e64f6155549f56506e4cc950539005f9f87d1c54cf5858b7288eb00ef26aa80f15e9be38c53671b5884efe77fb24e73815fb48dc37aca10e832edbbb914d4e8641c5c7026c2d11a50a72fe5431742d7a3c08cdcc47856b2757d8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff089d41b55aed0337173ee62811a8094c029970d0623ac4ed1e8153a4606a47b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff17e1bb55ab6f71c880fccb048eacb4d10a8cc3d4b56471a43dd63f692c3ed4f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff881c26ae3d6c9437c747bdfc8b1384db985615fba23944a17c5f1c09d1bbbf2bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd215a4d83cae44eb84014910ddc131b8a9a891f567d5930a222ed5e2d147ae23b841e46bcb54bdfac481b6520812fa0fbefe5f0ba840599d459e472faafaa792dfbc529aaaa39fa38c21ffd97070982f76989e44b1fe6ba3ebc515e22769fe6e740e3e0bc9e28d77576468dc11ac305ba8bcc3fea44f9ac8926b8095a1b35c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8dd6f353ed25b9760df5d18dfabde5abc637fbdf4b4fbc8f271e941c2111fec5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024345a9a2629ffa5c80af68be2abe39baa7565e3101dc49714683273bf926cf0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7239678bdab2834bc126c9af902186f0e1beeeeb1b13c60bfa4c0ce8245e7321b8b07ab64ae13c1f260f34217a5ab4d79e56b6b01cf58746b43fa9b756e64b8c000000000000000000000000000000000000000000000000000000000000000037af4931d2296edff9601a2574d241f9a94a0211e878244c322743f1cbef996432c4641166bdf22da19cb0a5f3c90108b3a825bb829d765c4647706a0215e3ec0000000000000000000000000000000000000000000000000000000000000000624dd1a53cd497e05917360cd8d4944ea710ee7ceb01c82f93be995f0c987354ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99860e967739a24f87874bed00b417705d9da1c1609106d5c8ce02eea1c0e5625c230f2a4335148a105219d3a1945b3b4e00df0452882ef5100bf23f22ebd5a40b6185328e20211949fe04cdeeede68f0c4d45644a13cdb74cf2444d0be0f5e0bead34447df0fb6000892f14786ce165149060ca0648385bbedcf24b398c6148f8314fa195f351df9e4f10dbb0d36560f3e37896f00dc6ae4995b4456de943ed00000000000000000000000000000000000000000000000000000000000000008ad7f587d130728e281e6557dc582636c00bd0f410b4db21930e82d84617c0e1745226160b9794b3d0ee89d473050505ea3a87e59d8cfe3609beeaaf85747b396de35437058f4dda156063a419fca8b483b352b8816a9eb40fbcaa5d4e5b4a0bcafeae664288c1883780d2eb572e811b3948af113aa57e256e0b645e2643348a209e3471a8178ef49be358ba1a1b821a696d354e8019437766cdb980d8a577bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008424e83a7bce5e70a44f2dc898fa43c2fb1b1f65ed16dfcc1047c83c5e4d856a145ea7b13e44b74135c6d7a0612617c38da6647d97f7e6c74be49ccd9fac8976918ba41213fb71b7844b1b6669ac9d2553545279c18ba96d1f161295c3dfe580b13665b2d82f719efce463a0dd962d16995092329b8065c7948b3ed93df1a2bde63e6804c4a650fa562053414457f5e53dd60051e198a0612b24997f8ba9241a60100ffb7196defe5eb222672be5d06a0a24a9ee6b3e0d68b6d9b57e2cf4bf7d6d10c2901d0948927be1b43cbb38ce0e2e75a59c484e6a051bb4d06cc350d9a7df24c911b0c686b13da4842e3f1791c591e6e7c5d495c106ab721c1eb10df6fa983cb7e31745de028fadef0320dc751c0b07bec602f522cff0b9737a536fefeff7d8b5e85792031ad2a46f9efbd5838ffc3330a511f129987b211bd6f48ea186\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/12e033c1a8f3298a775b13078a77bc8befe4567c",
    "content": "{\"tx\": \"57cf5f4502dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf6010000006a9486e760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702d0100000035f118d4039b315b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac7d735b5b\", \"prevouts\": [\"8eae4b0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"768f11000000000017a914b403773244c403f76163005c780d53872622b52c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"1659142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"cb500f865cff9b4b2ebc3aa367a9c52d5827d857d852a907cc04180190a0d79e91125f2fc2eca2ab8f50e4b956da9be68cdf7040582f103d0ac8e9fdc10423c1\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/12e5f4d526a722bc9b8f2af83ae028c8ee6b9027",
    "content": "{\"tx\": \"8ab8cf8c02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be401000000e633f1b18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b800000000e45ce987016a015900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac56b72021\", \"prevouts\": [\"64751e000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\", \"23a9400000000000225120c1102a8f1f1acb509ea40275c13487a0c613f8d79621443165b53e6eaf1338d7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8e4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb46e8601d3af4b3a958df52448c90f2764dee9285ef639d0a94e9c0ff98d78680d8d550033184c6424688af85d43f5bf525b7f6d8111e731f6e2359cae2801b117ed4b6001a8fdeaa28275cc8a939e32dd3c3fbbfbba5c677bbce429d0c1a1675d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e0ce34fb0c991ad9d4eca1e4cfc93a976f01940b6dde3760a5561afff4e34d676e8601d3af4b3a958df52448c90f2764dee9285ef639d0a94e9c0ff98d78680d8d550033184c6424688af85d43f5bf525b7f6d8111e731f6e2359cae2801b117ed4b6001a8fdeaa28275cc8a939e32dd3c3fbbfbba5c677bbce429d0c1a1675d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/12fada550b4d90c67f307a0d563ae38283c008fa",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf610000000058cecab6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c12020000005cf0669103c7c9af000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e736847739\", \"prevouts\": [\"b31f680000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"09424900000000002251201dfb228dec79c6e234b1139c58dcf8de3e24a7459acbe9e029f267c6e1783b9a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"627d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e1c3079426a5b5f1fe415ca1dc9a375fc9bf135fffa940368a3174df14ecf01db815577f72abc2219d93608f0bf386debaad95a87d0f429ecb808b0f22f69367f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364044acc6a70fa5b9cf91df37d1a559deb3c0d78b0a462f26dc9347473fa4c4821c3079426a5b5f1fe415ca1dc9a375fc9bf135fffa940368a3174df14ecf01db815577f72abc2219d93608f0bf386debaad95a87d0f429ecb808b0f22f69367f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/13080e256b05f38789902f0dbbc437401d15a3f2",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf29000000001bb3f48cbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff001000000b58b7f9404b14deb000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aced020000\", \"prevouts\": [\"68347b0000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"aedc7200000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ac9\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93663fad082b3d4bc896bd1c7eabf214d4027c747e30ed7127fc38c25827593872689fc6d70c1c4e15dab7d2fdd5db26cf688ca78f103ab970182d2c6706fc8281bcc9238bf2d7dc0bcf11838c34785251ea2fa5f3bb034bc98e2e8efb0909b7dbc17d2416a1ef9313076e185902c26d9ae3ba1c967c4fe3d78707cdcee712bc7b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e10b2b16248e513241b83875342c0ccd59e2b6d40dffb5019b56610da5b5de422d74e6cd8e612cb42cda5f7f42dc10fbfe42e4e0a9faed92158fa7e41e5f92051e17d2416a1ef9313076e185902c26d9ae3ba1c967c4fe3d78707cdcee712bc7b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1318e44a20cde77432578f5126e255855a0f8104",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e9010000001dec1589bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf260000000053ee53c504472cad00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac11ed5824\", \"prevouts\": [\"65a33900000000002251202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"ee537600000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"a87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8159738ff2c4f90cd16c07bb852218b8a19eccf086ed61d505eed94e2770983c2cd165f299bdaaa06ccf8947d9b12e815a5b39fc50068532880492a3446c423d89e26d26d9f798657ab1642d8194f1f5dc9158412142f65824f82701f20125ac7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360696a8ad49f6bde3bd1da86a2495044ebc8bdff93c87d1dc4e64279442168fbe337e31cedb20dd0ec36f43f7131008eded9387a241f89ca892d220549655a6e95def3d75afa0626f5ab572f3c9ae49b6567bf85ec43d0b3933062a3ad8b1e492\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/131ec09b5ca700e6a035eb50138f6a7f62fe3f91",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc101000000c198db84bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcb0000000017fde2f5039f7f8c00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8716010000\", \"prevouts\": [\"56ff250000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\", \"2f89680000000000165a142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"22fd611b311bceb680b02d3c506b7a6490d3073e0978b21351e00df8c57b607f8ce0221a5601fa732041c9a4b1b47ca62499157edd71151ba4088699092959b6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1337852e30e2d514c14e8123b84fadb9d4aa882f",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bba01000000a2f78b97dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b82000000003a48009dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5301000000e7fb77e004cb3fcd00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7f2000000\", \"prevouts\": [\"d4b42600000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\", \"69c2270000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"926981000000000017a914971b3e5f9ac480bdcebf6ea71a9fc7de0ab164e287\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e7\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93668ce749c68de633516e195736934f8a88269848cb24cae075fce4521e857a6cdd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51c61a1ab416979399a3dea56cc9db65331fc4d8e9e627e6b90ed3a4ebdc2f66c36df482d4085282f873fe38dcb59fc4eea3656d896112fe243f784a0cfce46b53\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936feb3983b18e4525f0a8518cd3710c3b144f3f0d5edea574e13e05d297dfd94906cbd7cfc5d340306ce0f8e37fe1bfa8aba9fd4064e6187eeb928db0d0bdab726391a14412c925771c32fa4c7776d5872be2a56fee9c5a8de868e7e6e5a4c84da\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/136bc03e80bca2dc5f71c4fdf91e7d690eac78e2",
    "content": "{\"tx\": \"02000000031980a99ad1eac101c8fe3dd9b7c19f4e81dda5a690601a9eedc2ce713d9132e5000000000007acc88a492909e056fa5c0ef2af542be68aba07da39583e95b43e24484150891b1d532301000000001ad6d4dc1980a99ad1eac101c8fe3dd9b7c19f4e81dda5a690601a9eedc2ce713d9132e5010000000079e1bbdd02ac0b058b320000001600146d764276c66fec1127e5074db5bff3aa6c52553358020000000000001976a9147d8c30278dcbf5bd88310a3c91abbeb33651906c88acd137773e\", \"prevouts\": [\"7371c1150f000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"b7e4d4f711000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"6689717d11000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_valid\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0e0f08267df2ceaffdfeb1cade96dcfe41721caf22f0bb89fad8d7f363b2e9a52928486dd44f7b980ec67683caf4fb4e836db5f68fc7414f46fb53169174b4c2\", \"20159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717ac\", \"c0159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717a00074c7e8df7fd91f9df9f350398e675f9ead7758f02aef75359e3279a8e0e7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1390c111cc1ca46caab6bdee16d74dd49519fb4f",
    "content": "{\"tx\": \"db5803d80260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e101000000d732cef260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d301000000446240800499271f000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac2c32be27\", \"prevouts\": [\"b1ce1000000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"4fef0f0000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb45e04c998862288954a26ee7ce146837a88020619bd4ef6b5d2b0b49b83f7fafffc7f9c78871d6a598c7c7c3f4c8210a5c47caa8abf9700608b6e75845c74a6c5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ea2949503db9bf5110d001b5fe31844dc42c6d6df34bdb7dd462bab705d6d86ea58b6826c45b958e6a43801c4f9a11218097d5d18de4cdf93890daaefc8ad62d7d143406647e47f2aa45aee5a8d37fbb079fe3a633dc3f79123da3b3ed47a821a2fa119ef3ac370f8290f87fe8954e212d8c61d3545cf9da1d8aa62b42f72813\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1395575564b7da66e3b458131eaed79bc605b605",
    "content": "{\"tx\": \"fdc7ce4202bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0900000000f49ff5b1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbb01000000249669d202c284cc000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e77d020000\", \"prevouts\": [\"f3566600000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\", \"cd22690000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090274e9a197dffeab560f6d764160863bd948582bbbe73ce689c2fe924ce23f82a1d8037221258644efdd306d84eea245809cfbfa3d4ec384202f58ec72347e66345c91b30aa391f1f834df7940f6d9b56538f48a4be708aa59603fa8a49d785dbb65e69e75a0c1d7e9bcc4f98c22d87dc47d310d9407d50dd50de93b1de00a25177adc8853c01370e2c5b6d63d8d683145516bced6d17963bf18bffb621791c742784a397ab8ea9c0403b2ef6cd682331f4190e20687f5c49e3bdb6173f0e4cbd900991ec91d23319dcfd82f73226f6378fc5566fc61f9389034354b44c9bd4fa51dca410a0b0cefb28877432b5f7c8bf5f61f8eef57c550d4db2743bfa3fcd2b56d563ee4d11618802db67891ddfd3c0412436d3b1c63daf95dce4c16779f271831df892a04b911a54905b7b3baae7324c5a73f3d3cc12449f40ad9d359e82a67f95fd8eaea473efd1612ae33e383b268e73e631c92d217b32a42ff4e20f8d0407a77bc91badb9d7b54c63de0be89648adfbb793ce1da94f21b862b3ece8fe000c41595f7aebb049d6ec7fe0444a289a77e55baab9bb29c680581bfae20bc9e51bf8b8e1de14e1bb260805f1aa99d60aa8bb5da698a3e7ef28890140bc9d47a58c5c4e539c1d3ef7b73167c963bd0bbbc565b92ba3bb904a39cf425e3bc9f57d2201eef5ee9e73dbe5e9d272a328fc13856a9a51ed9fb86a5937451e0b31672a1978e8d3f677e276995757f\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d0abc6c99cdb1b2d92cc3611af9751bdc3c9fe9addf653926779bc3342f99dfdd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51d82f8c55e99af1bc6044802eb870171f459184b3c99e354e12eac4f204be9c37cf5fd42f9969f7f2472ed1fa62ffa49909a09466cf06ef7c57cb1be351156c54\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090233a526de0f8ac4aa3fa3ccef384d54a17b4b15234b92ab8724d6f68bc591e2c9bb0a88a7f4bbf7d0e1dafd8c1987ab1854abb1752239cdfb383966c02e6d3d81c9970759b59b2976e026bb9c9ac779fcfd5c58e91ae463bf867a1b6e88ebebc06ac3e1ddf878a16ebe4849dc3cedf716670fb602abcf458ae3d7053316a8b156627250b5bb6a01faa6ac51c538dd4d0d342b329e4add88456551b48e5be04dee9973b0b15eeee8f184c367b808f486755c92bb6568fa43db56d206c553d84b081d60c4742529039bdb73167c9493a80e860b9ecf71fa908cd3277e8d1f15b3cd325c7e827aba540c067ebedf36d7bbf7278df90eb5f0dd2d2e5f2a63dee773565ec329ea4e2c4a8915ceaf298fa8b416c4c3f337cb96a4870558991255bccb4148c38a296225c0159726043c89de079fc8b4c8dd9205d60342540c3d57c391ff1630c4a267f108e35565f762ba6310a9c4f225bb884242c3d82eca4763764c04da1ae7fd9ffe8c058e7edd29648d1c9bebb2359d7474c116b9dac03481c589ac7fd54699a1afb575661cffa385a6e9c78563c4d18fcfd852662340697abfaa340e948d5905289cce6fc54db5cea6b1dccf9eca35708a812a4f28368265f47c2f439a03c267b7df015a558e1d82da98a06289a915a5b05e44233a3a16b84072cd93bc52eab1f13828aeebc268c2e80ee9f675c77c364f310cb2ed8a2fa10f9be56ed93dd3603d2102607561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d865720480120d5a477c096fbef97d1ee2aeb957fc425ff8aedf322b93097b3a97db744cf5fd42f9969f7f2472ed1fa62ffa49909a09466cf06ef7c57cb1be351156c54\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/13c9792e4f626e8f900acfa50cf122a5f5f15030",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7d00000000bdb388de8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42302000000684f888f0147fd2300000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5ac08453\", \"prevouts\": [\"109027000000000017a91468f63610c45a6790781558e4d5ce83e16e8f3f3b87\", \"d6aa3a000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2352212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"0a4840b5169b4280cbc2bc61182b91f2558a29f20b31871018012c08fcff664659201014f10cc1f79d371fc6ddf3ab6aff415211de5436aa097fc50eb3f1dbe5\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/13d37de420974d4290a6029f20175feb02e1106e",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1501000000e3ee7de3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c32010000003f2fec4a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b8010000006499adc6032e11bf00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc77d690e25\", \"prevouts\": [\"38975c0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\", \"cb9154000000000022512096d49a663447a0304343e0ca844d9bda5a7da8dbda233b650dfa03e219f7bd31\", \"eee1100000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063ea68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93648734efffc6fccdfa671b85960f6a2915d6c681467297c41489a3521a420b294a2d42db82fd8c87bf94597052443343fe22a3a138f6b0aee44f71ff1c976f3ab32777cb2583add22ba560e78ee9942bfe3080d15b9172e7f2c8ac5adf5c65a1c36f2bcd90a4462875ebc34531696f5fa5671e0fb7e46050530a773670978687e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cb1d5ef1e00fa5f70010a57f200748b29ecde733e01f3ca7c1bafa26b207d579538b2525e5ad3e6ab2346b1907a9f51d3650fdbb6911031be2b995911891caa483976a7e8bc20bfa4c53f64ff2df47d867849c8cbf6df51014735817968d498535c6739a4d626ca1df00777eecd105a7e72aeb1be910a44c9d3be4aa00e70c25\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/13d9b1cfc7b7864ec3f85c71a1046df30cc17b62",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9801000000acfffbeb02e4216d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac90020000\", \"prevouts\": [\"5c146f000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/unkpk/checksigadd\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cbe468d342d05067cf759e7786fa7d773f6336a46b8c391ba4988671fed73eba50cb6bf0ff1ce15f7af17ef4cdf4f7e5263990e8e8643b4fbdc8a7adff46e33e\", \"0051ba\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93629231b61c6552c60ab78187651c3584908ae1e5e6e6a28ea4234170b970c6fec00265579c9ab465d5922d1fe7ccd2a380d6e9c28a567fff5af501862d4fc50743de45c89862fb0bacbcd023499749ca2835a6e0cc10c045df6197f376a1b3da887ace9cacfd100dcef177ae09ce8bb2caf65c00693dfb1e2f65365235a56a522d6b917ab95e1fd9fa58eb1ad6ac180fd5b6f88d1a1a8ec6fad554fcfbece624ac8cd84c5af0b4719e62f8d2013ce0d4d13327c4e6fe65e29938735fc43debe5986c28c228ef1888dee344e41f26af0a1b5fd5ac36fb1e0b8256949ea91a65877ae71cede4162d7d56c21d6566ef88bfb31ac917ecb9cdbd205e92e106d62fabc32a651adc155e6b8aef622a203b8c3224e433a61efe40438a1ee3abe76600fe6967dbbb0216d0210891492746b07a592ae85bb43ae3347ec0e25bfb45e954be856f68441022cd3a444817edbae2583eb76683b8480293994d059289218f0d4a79d976568d9e92c4f00b9c8d7cf447c76042a3234918f31ddf63c43fdd94d6a32c000fafc31f95a626ff6b47272847de898d0fe9392d6cb40a47f54dc91f8f8111360dc44ae3d69de3386cee559eb49e6c76a737e105f9117431d64c73a13a31f98b35f150399876b232678a58bf83578dbb2c055ad176d56177c4ac303846e798f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fd432c6b683e9b89ce010ba01631811316960fd946a28e9042feb1be6d99aa0b333b6d3e8a176dc16310d717ed191409e423131e93227765e76ed44af30ca557\", \"5400ba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368cc4d632c25fb1473ebc2c4691dff712f1529879b16cf6e01c3498b371ad5643f043ba3d030a3b9cb1de0a60e5c22d352c9a6b0167bb0429c65653ad93c6b5ad75df7d692cfa002fbaff39a633e2a3d0c51d8dadcd4fcf0c857fbd83ad169fef2faba22bfc7a47f9e635144f510dd0bf27279d7f381c4c7abb10bfa7caa6f45212b1384dfb83dad558f50952f8dc7a4c93fc05bc0bf8f252596f3f99dcc4aa25ab6fe4c1776346de255528baa11f4624c0da11cd67d3944bc9e3c23527f253a174940966dd57e339c9cd051354c05cad3fffcfa87d89865f388df6a9793fb850795b387e411ef7ecd738a90c270a9e8b41d104f0901d65be980e017742035d2ed5a15550423aeac2e288a32ca51234efdd8592bd1b66a7f846be8561b7af73c90baa320cf1711a17ed2a311e1783897c17c40a4468373563049ba8a82c1cbe704bb8d89f21761581480cc9fb789613a87d31235185f9da4b4384725e898ebf0d2c5eddaeb8557ce0f7cc7880e698091ab104cabb34aeeeb5d0f57ea86d1ebc555dfde575d48d1eaafa8343c63d6f5425984d2425aca274be02e47a5142e089ba2e5262a94fc3ddd3fb5606be458b593782b16d00ce4762d13e98a6ec8488c560f68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/13ecc0464cacec7245082422e8f3212d959e0fa9",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0d00000000f0d0e5afdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb5010000001fc1f48c03cccb44000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acfc000000\", \"prevouts\": [\"f2bb1e00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"59da280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_7f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e44b59fa69e292937d8450cf79b089361836967397d8a696e30cbe1cf896268bf7e0704f77bde10b992b87a8fb5c570fff52fcbb465352faaa49e954f03e28d983\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0ff7815b0b176697d6d7cebe201eaab1db60b0a4c521fb67becdc3dab42147ef948c5bb528e3a81bff4f7c9d102135a9003002a21d1cae0eed13adbf356c63db7f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/14450718a3a9e2266004b863df27746606f071ae",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc501000000731a1b27027c5774000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748751ef9a5d\", \"prevouts\": [\"c30d76000000000022512047adffb94737afedfc89d87094a195f595690331a7dc68829e77727baf25a9ad\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360793597254158918e3369507f2d6fdbef17d18b1028bbb0719450ded0f42c58f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a52616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/146b0be5a219a70b803fc5f82ded6f34e4cf7a6e",
    "content": "{\"tx\": \"f66b5ce4038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c465000000005be9d6eedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc300000000394663ffdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c08020000000e1b4af6047d16af000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a62067231f\", \"prevouts\": [\"3e80410000000000225120783dfb3310d474c767ef9239befe26bff1665135289516e5417abb1737338f98\", \"172323000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"8d5d4c000000000017a9141757f4686f091b43a46fa47e92d07c87fc7a205e87\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"165f142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"63b2ebbc764413c404afcf95e5f700ede4e39144ace8feaf943a413b057ec4448b8eb76fd6be2329a202b567268662569010b636e4fef4c7429523b227dbb93b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1477a76ad0e64b74908b0f8a89549c7cf7190288",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c130200000021444841dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3a0100000069712e0e01f62b6b000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787a59c0849\", \"prevouts\": [\"bf775c00000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\", \"e8922000000000002260202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3a3c590ec08cdb332be8e81f48a4b67e15e9fa330c9c6e57183c9027fa4272edc0c23e4668924216c7e09268bbbdc2dcf74344cc96681f2268e9affdffe701a0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1493716a3ca7c3194959cd177b8dd531b04b0b9f",
    "content": "{\"tx\": \"06cb7a96028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42e01000000df4b95b0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3200000000adddb4a50374fb5d000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acea040000\", \"prevouts\": [\"f3563e00000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\", \"fd30210000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"067d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823f226bc542f166b7ab1884d7601266c0b79ac59ceed404fe5ce2372ecd38c8cf9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ed1973e93f7ad3f562801731a237f358bfce42fb636b2a0dab3a823989e87b4ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93662b4c4e03f8bbc4e0fa6de616a7b17503976357af82c5e4ff1a693444fc6910b3f226bc542f166b7ab1884d7601266c0b79ac59ceed404fe5ce2372ecd38c8cf9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ed1973e93f7ad3f562801731a237f358bfce42fb636b2a0dab3a823989e87b4ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/149679a6778ca49110eaeac21b33cd449242eb91",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127086000000003a2fcd2c0453f10f000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7b2000000\", \"prevouts\": [\"43bf110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_58\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ec39ab289167b4733f108acbf62f1118bd04b5979a66afb0f3c68018d0ce9a502d9f5c7c3300c72e2a8602ddd053040e72ebca258e951c089842e4eda60c5a0783\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"54ead5030a14a9f3d394b7d5b28710aef56bdd7a3d8cec3c3d55009ff788bc433728ebd60a03a77b475bed70a84da7938510401f95cb61c258545b30ca02cf3358\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/149bceae555709818ddc8eb34d3cf4b508780b88",
    "content": "{\"tx\": \"85ad78690260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701102000000aa846bd8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bce00000000353636d60413b23000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47870a020000\", \"prevouts\": [\"b39f0e00000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\", \"28aa2300000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c2c55a726534a8d0321aea5300ccc37acb5b1fc81b19755e9d039e159ccc6bbd6e55e6cc099b3fd5cca65d40087200ff064f8f598dc371f61f8d957b472ffb5414746b6cdbbdbe747c087a2d99e7432ddfa1db1d7a6445e7dea3810e7475536557a61376c510bdd1fc860151a3b261939fa407ec1a2d0490cf2efc4278abc783\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f12e5bdadb74bb113beeaaa5995d4ebaa92337455ee51746db1fb6fe7db125e52d50ee9aa3de1fe988255b0d8b9f34dc2cecc4a96432b9f704e90359a06b468476e3192190387ccfa53649887be3b08a6a0e7169a64b02c3bbfb054cf523373b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/14a9e9b7200758410bd419f2b0954ec253e17889",
    "content": "{\"tx\": \"0572398202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b01020000000b604692dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcb00000000fbc4aeb20342553b00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7fc57fd5c\", \"prevouts\": [\"c5281f0000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\", \"26c71e00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"de7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936de23aba2d7dfc49771c3511939fd66882f5955aeb1ffd7f3f853dee6c699f10346c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa827b55d11351c6fed41de6d200bca95500243dcc7874125f5161f5be208848f0ac1d0874bb493d5b277fe586a1908760dedf191b70e37bd9b06448d9d8257f0a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93603f6319fbb8104be3478515f2930ba3b255e646dae280e79434cdb319e4e3729856e164d8f95680a310901239278cf924747110c023e5c9b2077227ee61e12b7ac1d0874bb493d5b277fe586a1908760dedf191b70e37bd9b06448d9d8257f0a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/14b46e9b808aa20b426e21803aebd6efffef133f",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8100000000cd228e8dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa4000000004c9db3ce04ea51bf000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a60d000000\", \"prevouts\": [\"11384c0000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\", \"6aa37400000000001659142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"9a1626105ce106bafb1b13e47bcbc07de6a37e6f07b467c39d053d20253c064f39d7f135eaeb21eb50f1b7ae032cd0a1a96a4593bcba4e4f277fe871479c0a10\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/14b583f6a2bb67ac548a6daf674748880c14916c",
    "content": "{\"tx\": \"b039045e018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c4000000000d55d5b4022f9b3900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acd328ce2e\", \"prevouts\": [\"44fe3b0000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"6b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366cf9eaec23fdd8ffc56eaf5457c71c87e3a4d680a728575e9c60ac5881aecf96f14541946e1cf92393992e5ef2191ac72b106fd890d94444e74600720cd636c212e839b87dc613c826a9c62085431a96f79b8782d4b0fe31dfc75aede09e250a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f4575c9148ab8fb2f0e3b60c30486bc2998c5a9fcff153a4260746061263c245b36a70886d9e3726a9aa8a2b94454683b5181a970edd894e0d0cd75aad09f75436b2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/14bac90ea6a6692cf7202b96a1c18e47f81a055a",
    "content": "{\"tx\": \"22713f2202dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca30000000021b16c8a8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4940100000024a82fcd0387598700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487a073772b\", \"prevouts\": [\"af76570000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\", \"b7733100000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360437fc07f82a1b970ec5a575c32125a1db89269ab6bba98a0a02cfac89dc7ad84b23f991898c0f7e80b32f00b838c1f1514616fab2a47083539335b67c2689fcce4d7767c8a9637a0804b073b1eb172c67de67ce152ade33f2591a85dfee2e5a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369f15a01ba92850ae0934bcdc7ad7dd0ec30771ae29a80b5a37ba0c6579d57abb111302735ec636dd6cd82402c946e3c4544cb7cccda2620354a4b8fa269f342b5075e3d7a2801b75eefdf65cb630fc6bd09768ae07eb1bf67760ac5f1c253b1300a5530ec2a7d4ba868ec61eef99b13bb3328da6d520ee28822b8288bba3da4c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/14d0d7bc3443d31977bc6035b1a9bce2c6dc9114",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc301000000859e9063bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdc01000000d82019748bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c431000000003461614d047e0708010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487e9103047\", \"prevouts\": [\"f007760000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\", \"93d9610000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\", \"f14b320000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090265dfb469bf381a99034f00c2313db7a9ea8487be485aea065b6a22bb58b09c0d5309145f4ee680d85c19e99edb3f45e1f4bed9589c94883deadebd3a5daa3b8b6b4e28040ecbb0f1f121ba924bcb343c975ac122db37e623c930d91f4611296f0d201fb314d2b988a760eb7983ff6c302b73ede91fba1ce9829c15726910d3398e0f2e6b8e941b96a59951882799189e17ea65da922a16a1e0c153363ee1304828977812013fdb0fa2a9f711e37a8ffe32974de487717c696e5409fda07631e9536ee88b3c1b5263411360122a1747650520be59c8303de25e875bfcc7d90de78b5a729fab6117ee447d5f4785ab39c4184226cbdcc52fd5fad14ef2806e855e6f52eb453acfb02841f5dde4ac674ccf6590592a420ca4368949665494cab71da2bebfb0bd7fc432ee49d355d76fdd59da5d39d12f995804d7b2caf0ccd4b41a51b940085554ee8f1938c72af163288fefdcbc0541b0e06a912bc152fc945a2278103e7dc7625c3c588b46410224860881b4c5af2fe857791103e89a10cc73081a38a97bd449892f664a86ba2d59ccf39ffb0524a8d6dbee8a8a8221ffd29fadb356de9375f79fc28eed914f2cddca1a333a15f6a93c85855011e515d5ec749790f0a9ddd983b2182dcda8297c95feb0a7ee5cb64a430d7bd637681e27086f27da38718e9dd9cb6ac1e44607b35a9d04f31ca79be71e5e0ea78913b464a6f3d3f2607cad3eb019dc1375\", \"0c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828d88e70532c494439586c1157b8a644f11fc532506ec8f5af612c230a11997e628257bae22e6d8aedb31b43cfe467850e731fb88c1221782039a4c16ef44c35617d0d4fc7404dd8984f6a1705481d95654b515a34c586c99c11bfe20e9503459\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090231d27d278dca35e9f72199a0cfa3d8906195b95239ac69a44d4ee627e4148a24c63a3d20f2970e9501a90323e490c366a1b9ee5d7dc6dc89151c8ce8bf3d1ed4cd968718cd918890b942be0f3d5c3e25796f3cc8886c795f90b69d871180fd431d85d43644d5a8e0d1b6093cbd0da3f3961c77c36d753936506381ab188f84a9537fc2aa603b49110d4c455f25e02d3653c2f3e9ee3ab7c037de21ce7f9f11fe1be9f53e454e691d23d5c3ab8d01017bc55b2b33e5105a55872bcc01a6a1891c08ffd418619a06320902816fe0d47e05628b6a5d930660dd7d78273cec77407af6668773aad18cdab903311d102a66f8db7c1d920e13c438ef6d38b9d8e46f115510bca1098e93a4cf32297b9262c4cf00342ae63bd0c75563e31717c11fe94430d5cd76ef126a5ded19ae495f33e348623f49c88c2399688c36adfb47c7ce0b1cc1305efa202815302ebd4164d28e1f551aaba5bc389ab20e84b37960c47da88f1d82f0526cd6e8978d3bf45bc5840ba13e6b5b21110c325ac0b0426a211f504a568f5b3b63c9d0b24fa92e1de500c99b29a1e05bece91487858990493b47c488106d06813911dbf993bf5c05d8f9ece975160ebe2183dddf8372d911dbfb10607c912fcf83a467def7048c911819030bd29dab21b76d8a6ea7daf07f289192e7f92218e2edf2e9af2a098f48000b3b2c7a08050cf78f63f6179e1694d9ed201e4d1cebee4245108375\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a98df32f973e5ecb9021ae265faceadfc19a0621ba8bbdbaed0b61c2d0622269da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e5111e542fd849c49f4d44aada2d8e1aab946c793c1d334242f5a6d1a51a6de2d5b0de380cf0ebf0fa9d17e1d1edb87a374b64935c1c67f0c5024fcc072643681\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/14d9a8a4291206e2c4d73120dc485bd077e5f66d",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1c00000000addaa5ecdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0b01000000d5f25f580315f46d00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acf284905e\", \"prevouts\": [\"41ae4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"91ef230000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_25\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"dc2a706a4a0aa1f32af552a7b5304f12a3813a7f904ccc019d6dcaf3c7fada431badbdd671c254b846fa339901440edf6b43e99ee23e4db215bcfe128019867b83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7f8032755532062218442e9b19b7dd6d4fa75c1a71b6e058621507722689c3e5b6a42b7e42a91de94f0940d8e3efe7b702c8a4ae7747e272f2e6cc7ba0e58c3525\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/14ffecf99f50d1adde6ff14120965c878f744781",
    "content": "{\"tx\": \"1440bee6028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44000000000a895e88fbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf52000000000366cbad01bc8c1b00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac83030000\", \"prevouts\": [\"a0853e00000000002252202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"44c57f0000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a62\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936adba0e1bc195d38fce49fa646b6129b089e3124fdc2016a828a489528ffec7b5c3a658b9783cc0a28fcc02932d4b85eca4f49aba0b4fac0b36a7e3a0001ff4113fd119d5a804161d41189f11d8f3e11243ae602674c5e73f1686492aa1f485fe\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a4acac51423d2718039d2d4f4b1ede307d37862410d7af1d01b9eb1511bc3dae1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004522ebb88c16ebf61dfdf766657f947c6b679bf36be3a1118c2e7b2b24c8fd5c2a5a9a81b6bc4d13af192f1d19d1915de95ad8d42e49add8bb4e9a9400ca460b05\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/15032320c16e26b0069cf1571846247d073f2efe",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1402000000ff7187b9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8600000000e2bd2fabdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b54000000005614c499012d9a5900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388aca876a75f\", \"prevouts\": [\"cc547700000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"b4db27000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\", \"aafc28000000000022512008ff927e8178e20f38298d934a97845982dc7c5901b7d815cf7926413ad6b4c2\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f328d66b083ab2a9c43e5cc215aeb4ee10a12698c3df0ddf89a122fccd78eacd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a90616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/150b2d12becd542c0352fdc80bbd85c2901d8228",
    "content": "{\"tx\": \"32bd0f0b03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7301000000a2d6c9c760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a100000000c06b56c760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127000020000006321a4850146cb4d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48709ff9333\", \"prevouts\": [\"03b67e000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"f22b120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"802711000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"9e7a5db4c19c933d8a1c668f5df19fbea4c8449ec42c618226deb5cdbf56601e0590821fae8c6467f18c74a86f3b381d09c2623874937be21ed1151241df34d882\", \"50664439600155fd4b4c213b5426df46fbba2237183c4c5ab72ab97ac7f95840fc9d7fea4f2bd65d35215ea52b50e717aa96ae22b868d3fb618165042c193ff8803fc7ed900f0a84f257ddea319b01ea30c0387869daa1df78d31771e6bda749f30d1aa832611bbdd6058e6787bc429325c2f1a08d12889954736cc348db08694352730bf7581d4d4f066490c3ea8b33db8a00f5e53df4dec53719d4f108d44ea435c66df718a1762c240482f62de9093a14bdf2ed1c1ab6d5f8d9bbb6dc90b1b0d66449f73ffe99c5d5a260e202819614dc6a80ac3738\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e05cd2880a9cda10a00c04f98f7f4d9743c62524bf765b17c6a37698f9e3b74550d3b29bb8ae6b73bdcb58d1be8c51b9413246e1ba613d872a327a7c438b7d1f82\", \"50e765dd9670a5d889e2ef65331812b31f7b301662cc7be2fb94631a232f39a72d5df054fd5fa2510b825fb2052cb9ca4881b80269621671baf39e962d989c58cba068b76c7a81a0859e1439a1bf5de050f5f7f4accb61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/152491c8478252c98640ae41d5813cd6cc4800a4",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be001000000a799f40abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4f010000001e21c462bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9a0000000077dd0fb3022989fd0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a611000000\", \"prevouts\": [\"025a1f00000000002251203d94c30f7ef8b0d9d4c7a773497c0af2bbd0a232f6e89c19e65bba66d7e2056b\", \"c0e969000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\", \"f4dd760000000000225120ff67dbe5f480d52a3db68ddc8756a5701c353a5e478c53504b3368e48f095423\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_5\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c2811373219b4fe0d51b3636adf30c65e37103a291cad7ced9974fc1ed02719b3c730180f343426fa077c7b021ccf8f14d8e18de65258ee9a2cbecab092d49f\", \"20c361c307b1347c3dbd192b8365ea0856258daea3babb4e0b6cf1473be162b5c249f6a8283ba675e35f5789e589d63f47ad7f6f0d5b741fd2303d960bd2679f492610c0226661ca3b4fa3a985162b4ede7ee3adaf664778a9a77400b693ab17ece76d7805307589a2826dd9d544f88265663f9df8f3526d82ca0f6be0ceaac07f\", \"75005a20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5a8820871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694623ddbddbeff0d470051de72b352c3379666f2e7a0c2d38368d4b52ca36d470000000000000000000000000000000000000000000000000000000000000000da4811e2aacb3c84826462416084743ed6dd43bb284051c03dfdddfd63c540104f14b640f086882c47bced18d592421bbd1a13d929376bd98932a8e6f7af0432ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf51df56b95b936c41835af32e23ec4c37bba09ad354e25a296cf8a2656a50f670993ecbbcf0bc159ec158eab8996524b2d584952c62e23e4e36e6cecb65ecae016910cb2eee6c42404feb46b882062426af39f8f178be9c4f5a5d922c0d788600000000000000000000000000000000000000000000000000000000000000006527910f019c3fcf564669fbb4de551caf24033b91e6e20341a2ad1e19e794975ab79dfa7cf5db7145e5d4b1cf65a62da6f4820b5bb8836c7352aa412d89bbf9cffa665729358e66ee7974075bdc3f023da28c8170769389bd77fd3350573099ad9e4f4a509b1727e57bb4cdfbbc9cdc5e25d1c80d3c0e1c0472b5a012f1c5ac8fdb0ed751460f87321e7eb2778f208b22cc62c5a3333033aabc48d6a4234408555e4ea92c158eabbc383be2138719c205f2e564d5513c602afa90d5d21a64ed07c9bb2cdb84cb55454f658761c235886584f469cb5db1c8f126bb07e52d94fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2b9a385067d1ff76e66456d18758d7252474300231654393e962574dfcb3e02900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6d0207243d3a5e1d40b65a3e00ac09ee4fb9ac90d65b0d48611dc50693aa349554b1a5dfec8ab3dd9cbb3b7c3bce73eeb64d657f9b0edbf4cf233f96ccdd20da897b378d7e7abeea00daa9a8458336b67244f9b33bbdcaedf4e545a463a31220000000000000000000000000000000000000000000000000000000000000000f1923ab9b1427d72e7269c361060aee9e259b71dd54306873c6a83db8917af370000000000000000000000000000000000000000000000000000000000000000dfacecc67e0994959ed18f085c4d51a50d8c63c6ae33e37cdfd0aaa3916a01ffd906df940b0788d9298f45a851e28993d905f4f44e71f23447a8eb291b08da0b13ac2ecd7c087e789b7aec612185da482c4154291c9750ddb61eae66b7a3b84d3637d419470f6e827829fb96ca2244aea96c187addf1800b3a1c93168b7f7352114f215a8f004336333296195e14e4cf4d41b60e61102a4922a0753f47792f52707b26b61c29f13b51ee900bc00311c92ba01cb9fbc8146f086b212616b917eac92168c5b925cb38cf692d2ad85d4a48328295d9a986cf2ed298979ec2d77165b8693445bfd3789f047078d3089189a42154d3c6d025ccca8059fe44b852d46c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026779a7dcd99df21ca785abdb33aa8dcefe047efeecf6776220d361c8db1926d0000000000000000000000000000000000000000000000000000000000000000610c1eb08b2962ddd01d2c8466ebebdc574b186c623b686c6d7d8a5bdb0b6407000000000000000000000000000000000000000000000000000000000000000006c96b0efe981974fe03ce5c459e755d2b9bf6c03ac4be4b9a79954a9bae8bf0dacd581c50f6afba108c6f63783079ff6f9aa98726d907938892631d548282ec0000000000000000000000000000000000000000000000000000000000000000da4bda93fc5768f467514d10b3e0847704a6ab251f1eed02771e37529e138c835224c8e6add6fbfd06d3f86feef55029733513ed47533dab7044333377279f0d813863f5fae4e2e3c999407371460a52d5509a286bfc3367bd768b89ee842fb9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90fa64bd3bee3a05ed5ae22173e7f969667bbe2e1864238b8969d4822a247470472b397fe976f850c4dab4af7a4fe2260bcf80cf77b002706e4fcd222e448e087b98b20d1cd8f5dc8697f8d25ccffa3f7e6106e17b2cfb546ba60b050f05ee34014daf9b7831c6b6aef9dc084c1cbc9e70624e236891a8079a08acb3c4b3733bf8cad34ee169bc56f17c0da902a29574d2874ce1479b25f0a13a55943edf23aea89cf5d84c7cb0a591b3d8c719e5d151096bda56f2b15d1b162f87e1ace3d942fc1aecb5da843cc093ab6bd2197970e55555844fd2778e623b202ac79a197297d7743666a6a236c6f008d32f55f7580c26c63af20514bb21225a25cad5bec6653de563560779ec83e2d18d669241ea80197c1becd5af2a19f55c752356ad7d41e57397ff916836f106d1077c50c353a77cff266c1ca61c192f719e62d11d26f61ca4b7357879edbce8f21690ebb8d359e46d22056ddbcaf4b85fb534a26b924bcd5eff56081dfd8b71d373a31bc6d37ec91f93c78486cd6dab9c5b709f0ed53dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8201962e9051459e1b14ad2163ca08d4980ccfdb063b840b38d00c267fdb51affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6992696ad57ce4955c69e5322b474dc52d445da18f197a3fe875df06f3965f467fede0c9619ced497685906b3e6a271af70afe7b1cf2e6a96572f45027424d2b7f424b07e7f08053d8bd3c2fa343a8a423b1a8bd414efdae03adb9c9c7a43af234068674a7a0acc2028341b92d85529616dfe6deac9718e05acc43bac4285f4c95a57aa0bbb142f8691107c5b257f93ae851f054af2edde97fbdc1b6b815f9f000c6412c25377ad82d391822896adc0e03a8aeeace06fa19c32673ba251f28bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000e4e023bba57072ac921c95300dadef54579723e7d5494fb3cc674e6254aeb46c9d2cc27b9990c26cf55efc8ffb9b295f2e8e771e8f9b9ab66912cc17580edf6d6d9453ed2eaf6a1a94cebc2bd1601c37a141e4baf35b921b1e6a913421b4fb0adea8f5c19fcd235104ae63cc3721a3af04ffd5215ee0f537d6e835030e3c23ad7ab66b33c5fe4136214d2bbf5dff01dffa449a654c8334af799255d0b56ad3c2602a5826bd2d8331651edb05faad28b95f192954389b092c31fc14dcfe55efb7a42bc77d761e80540cee7f3e755be577d16f3061ed7066d55cbfc7731bf317348b006355c1e9b833782ee3fcb0c105d32de7ce461f093b18ac2469170b0f3163eb0b29ffabfadc4548a488bc6f7351730422069f075c89041ebf8c1a1263411b0000000000000000000000000000000000000000000000000000000000000000fb6017f23840baff3a911350961bbcf46bce41f99ddd15430e5c42bf750a2ea0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fa33345aa47618e8fe0368be3040c4a53021f4e4eec186f77f9be22b921ff03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff27070a474e9083bdc6c46593942c11e5941cdd9cb4e0966459aebd77f49a25a5cb404b950305fc3997cf6d7a66804eb33ac708af7c6a5a8afeccd5684498634f49687bb3048bb5756478596a0156d73f72c5cb10b759d6682bf8bf1f1e3a5dce00000000000000000000000000000000000000000000000000000000000000009c20b15f7caac69d8ae700c0e6af6bf4ca64bc1ae695e675ad11a51c3616721ee217543ddb8a58dfd3951d4195b5bf71009a22e4e62eece10fcfdeae1f7808c2cacd00f6e8492212f03ff48ef3c9688d972b72bc418b4432ad7f873bbf2cca0a\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c2811373219b4fe0d51b3636adf30c65e37103a291cad7ced9974fc1ed02719b3c730180f343426fa077c7b021ccf8f14d8e18de65258ee9a2cbecab092d49f\", \"4ec6a99aa59703f81a8c4122a6d5f47117d14935de6551dce6dae5f38bc09de31b90fa725205863e73f0a1f4b42fd279200807e4805c684f9fe65924195f7b0a4e0aadb5c30a09167fe379c2ae362369169498258b791a07386c916db47672377a1237ce7ace8e8a8a7155bb79c3c040d4ae7cb0f9627cfa93d6f2fcd35bf4c8\", \"75005a20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5a8820871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694623ddbddbeff0d470051de72b352c3379666f2e7a0c2d38368d4b52ca36d470000000000000000000000000000000000000000000000000000000000000000da4811e2aacb3c84826462416084743ed6dd43bb284051c03dfdddfd63c540104f14b640f086882c47bced18d592421bbd1a13d929376bd98932a8e6f7af0432ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf51df56b95b936c41835af32e23ec4c37bba09ad354e25a296cf8a2656a50f670993ecbbcf0bc159ec158eab8996524b2d584952c62e23e4e36e6cecb65ecae016910cb2eee6c42404feb46b882062426af39f8f178be9c4f5a5d922c0d788600000000000000000000000000000000000000000000000000000000000000006527910f019c3fcf564669fbb4de551caf24033b91e6e20341a2ad1e19e794975ab79dfa7cf5db7145e5d4b1cf65a62da6f4820b5bb8836c7352aa412d89bbf9cffa665729358e66ee7974075bdc3f023da28c8170769389bd77fd3350573099ad9e4f4a509b1727e57bb4cdfbbc9cdc5e25d1c80d3c0e1c0472b5a012f1c5ac8fdb0ed751460f87321e7eb2778f208b22cc62c5a3333033aabc48d6a4234408555e4ea92c158eabbc383be2138719c205f2e564d5513c602afa90d5d21a64ed07c9bb2cdb84cb55454f658761c235886584f469cb5db1c8f126bb07e52d94fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2b9a385067d1ff76e66456d18758d7252474300231654393e962574dfcb3e02900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6d0207243d3a5e1d40b65a3e00ac09ee4fb9ac90d65b0d48611dc50693aa349554b1a5dfec8ab3dd9cbb3b7c3bce73eeb64d657f9b0edbf4cf233f96ccdd20da897b378d7e7abeea00daa9a8458336b67244f9b33bbdcaedf4e545a463a31220000000000000000000000000000000000000000000000000000000000000000f1923ab9b1427d72e7269c361060aee9e259b71dd54306873c6a83db8917af370000000000000000000000000000000000000000000000000000000000000000dfacecc67e0994959ed18f085c4d51a50d8c63c6ae33e37cdfd0aaa3916a01ffd906df940b0788d9298f45a851e28993d905f4f44e71f23447a8eb291b08da0b13ac2ecd7c087e789b7aec612185da482c4154291c9750ddb61eae66b7a3b84d3637d419470f6e827829fb96ca2244aea96c187addf1800b3a1c93168b7f7352114f215a8f004336333296195e14e4cf4d41b60e61102a4922a0753f47792f52707b26b61c29f13b51ee900bc00311c92ba01cb9fbc8146f086b212616b917eac92168c5b925cb38cf692d2ad85d4a48328295d9a986cf2ed298979ec2d77165b8693445bfd3789f047078d3089189a42154d3c6d025ccca8059fe44b852d46c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026779a7dcd99df21ca785abdb33aa8dcefe047efeecf6776220d361c8db1926d0000000000000000000000000000000000000000000000000000000000000000610c1eb08b2962ddd01d2c8466ebebdc574b186c623b686c6d7d8a5bdb0b6407000000000000000000000000000000000000000000000000000000000000000006c96b0efe981974fe03ce5c459e755d2b9bf6c03ac4be4b9a79954a9bae8bf0dacd581c50f6afba108c6f63783079ff6f9aa98726d907938892631d548282ec0000000000000000000000000000000000000000000000000000000000000000da4bda93fc5768f467514d10b3e0847704a6ab251f1eed02771e37529e138c835224c8e6add6fbfd06d3f86feef55029733513ed47533dab7044333377279f0d813863f5fae4e2e3c999407371460a52d5509a286bfc3367bd768b89ee842fb9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90fa64bd3bee3a05ed5ae22173e7f969667bbe2e1864238b8969d4822a247470472b397fe976f850c4dab4af7a4fe2260bcf80cf77b002706e4fcd222e448e087b98b20d1cd8f5dc8697f8d25ccffa3f7e6106e17b2cfb546ba60b050f05ee34014daf9b7831c6b6aef9dc084c1cbc9e70624e236891a8079a08acb3c4b3733bf8cad34ee169bc56f17c0da902a29574d2874ce1479b25f0a13a55943edf23aea89cf5d84c7cb0a591b3d8c719e5d151096bda56f2b15d1b162f87e1ace3d942fc1aecb5da843cc093ab6bd2197970e55555844fd2778e623b202ac79a197297d7743666a6a236c6f008d32f55f7580c26c63af20514bb21225a25cad5bec6653de563560779ec83e2d18d669241ea80197c1becd5af2a19f55c752356ad7d41e57397ff916836f106d1077c50c353a77cff266c1ca61c192f719e62d11d26f61ca4b7357879edbce8f21690ebb8d359e46d22056ddbcaf4b85fb534a26b924bcd5eff56081dfd8b71d373a31bc6d37ec91f93c78486cd6dab9c5b709f0ed53dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8201962e9051459e1b14ad2163ca08d4980ccfdb063b840b38d00c267fdb51affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6992696ad57ce4955c69e5322b474dc52d445da18f197a3fe875df06f3965f467fede0c9619ced497685906b3e6a271af70afe7b1cf2e6a96572f45027424d2b7f424b07e7f08053d8bd3c2fa343a8a423b1a8bd414efdae03adb9c9c7a43af234068674a7a0acc2028341b92d85529616dfe6deac9718e05acc43bac4285f4c95a57aa0bbb142f8691107c5b257f93ae851f054af2edde97fbdc1b6b815f9f000c6412c25377ad82d391822896adc0e03a8aeeace06fa19c32673ba251f28bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000e4e023bba57072ac921c95300dadef54579723e7d5494fb3cc674e6254aeb46c9d2cc27b9990c26cf55efc8ffb9b295f2e8e771e8f9b9ab66912cc17580edf6d6d9453ed2eaf6a1a94cebc2bd1601c37a141e4baf35b921b1e6a913421b4fb0adea8f5c19fcd235104ae63cc3721a3af04ffd5215ee0f537d6e835030e3c23ad7ab66b33c5fe4136214d2bbf5dff01dffa449a654c8334af799255d0b56ad3c2602a5826bd2d8331651edb05faad28b95f192954389b092c31fc14dcfe55efb7a42bc77d761e80540cee7f3e755be577d16f3061ed7066d55cbfc7731bf317348b006355c1e9b833782ee3fcb0c105d32de7ce461f093b18ac2469170b0f3163eb0b29ffabfadc4548a488bc6f7351730422069f075c89041ebf8c1a1263411b0000000000000000000000000000000000000000000000000000000000000000fb6017f23840baff3a911350961bbcf46bce41f99ddd15430e5c42bf750a2ea0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fa33345aa47618e8fe0368be3040c4a53021f4e4eec186f77f9be22b921ff03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff27070a474e9083bdc6c46593942c11e5941cdd9cb4e0966459aebd77f49a25a5cb404b950305fc3997cf6d7a66804eb33ac708af7c6a5a8afeccd5684498634f49687bb3048bb5756478596a0156d73f72c5cb10b759d6682bf8bf1f1e3a5dce00000000000000000000000000000000000000000000000000000000000000009c20b15f7caac69d8ae700c0e6af6bf4ca64bc1ae695e675ad11a51c3616721ee217543ddb8a58dfd3951d4195b5bf71009a22e4e62eece10fcfdeae1f7808c2cacd00f6e8492212f03ff48ef3c9688d972b72bc418b4432ad7f873bbf2cca0a\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1532d9cb1517dd25a5c8a93eb64d3962a52cf4cd",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4e000000008f41f4e3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b450000000076427492dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cff00000000c272c0da025f6a97000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acbf96ea1e\", \"prevouts\": [\"4be92800000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\", \"7fc7250000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"79b64a00000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6aca\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c6f432293da1a11df20de0df2cdfe573cc92222e6714a6159f8978c317656a2558c38514ede62462d8dcaca890d92a506794ae643449cc5c1c2c2667ece3d2dbdc18898993c284d2f731b7495cb62c60e8571430965d040562487638e1f1fd248a698426442c951e7251e4e87784c9556d503d37bf6168d5559e89d6402ee5a2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369d53ff9cdbd05c7b14874b5d383777a8a4f6c1559bc54c1161d63ac106a237bcc1012b923c15ff4ca5711684c82f77f7d0ace9e417918255ff860668826001128a698426442c951e7251e4e87784c9556d503d37bf6168d5559e89d6402ee5a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/154147c0c82e41a7cfdb7b8295df125020cd7113",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bc00000000045d0f63dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0301000000dc9d369c018f9e5b000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787a2000000\", \"prevouts\": [\"fc803f0000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"8d43260000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"d47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e1d15be41604f0459412a6d9aa888e4d019cca614dbd3b30e8d19f8f49981c6d3eef830f28a0ecbd34c70640f7829eb7d86b0cf2da24853f16b74ab53bbfd728ea84370bdaf8fbfa2c728119f306db95ff534e2e627fabf0c000f69380d4e93e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93669e6d8ef22861e07fee4583a5ab47fb4893c942079130ef347ee1cbb0ba45047b93338c7d107e01cff6d052285c57a3fa3547f5f14e99776c0371239cd8619173eef830f28a0ecbd34c70640f7829eb7d86b0cf2da24853f16b74ab53bbfd728ea84370bdaf8fbfa2c728119f306db95ff534e2e627fabf0c000f69380d4e93e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/154b30ae55351cbd129d9b1b6a6311572840bb26",
    "content": "{\"tx\": \"b516eae002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3801000000c3f7c6c8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8800000000587ace9a0352bb73000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4872f7d0b24\", \"prevouts\": [\"9917220000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"91ee530000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"fb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936832cdd808d94d07e5d991a3d0c5a8b4a06c9fcd7df1eeedb760eeb7a3be6ddfe43d925f8e6664e67417d113cf51c5b4c3126025efa5f83bf5b16dba6746279b738273d2ad306f831e931ee90238e60477c8ec11f350a3ad34ea06c6c58bf7ea3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d466d9f82b2327fc04ce4429e47540ca0f52fd08e57643f6e07da44ee4246ab9eee8539df42e1fa2e5e9e7b75fbe1b52db879ec8a622b496736c99966ce19d0038273d2ad306f831e931ee90238e60477c8ec11f350a3ad34ea06c6c58bf7ea3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/15541041a721e558c8cfa7f4ee5f4d09fa6c9065",
    "content": "{\"tx\": \"e61fc582038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45601000000c4e2b5b8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2001000000c5b7f7db8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41a020000002528aeb801fdae1700000000001600149d38710eb90e420b159c7a9263994c88e6810bc7c4010000\", \"prevouts\": [\"f0893300000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\", \"8b96760000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\", \"5e9f320000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_8d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1b6c242c01c1110e3cb320bbad176adc2fa5b1b01e493aa2200b28f5419ca02a8f8fb950dbe0ccc6de76af5df3cc4ccfdade86acafaca80d8cabe28bb476b73182\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"383ec8f0dd004aebdd2ad05a5a87c334f6d1b2c1398272c26fc9893a4317acba84cf4ed11aebe339d3567509a40e076d0644b5ba82904b643cfc1d6dba72a84e8d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/157183c1796c9575b6c576a29c98f58fbd42356c",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc900000000f2275ef2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565caf01000000fc57e8f90367dc99000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acba7c1440\", \"prevouts\": [\"6647510000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\", \"52934b000000000017a91418261fd2fa0b0480c86b918607add1dde9f7026a87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2255202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"759bd5b16f8435ff1e784f79b0f1bd4de1590a1e54f0536d6d84bab4e8c903d81915781366fe51dfe410e656b2d5f3f89e7374de4e49700275cd296eadcc2b08\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1571fe984911dc73398ce28defbf71e715958a81",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704501000000ee4d8a848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40b01000000f0d42d8a0429894a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8749000000\", \"prevouts\": [\"30ce120000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\", \"725c3a00000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c44c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cebe1805b4dd002a9656fd180b0893baf3654597c23b46cc67f3675a294fa085bbd17872a9d61e54e96dfef681da77b5399be78aec05b527019b8e812e967c33a95f177959a3d24a94a797d1e607e5550897d4e95d12a52323e6e8eeeab3383c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e145a42fba29499bdd7f6ed301115275954ea9ec94acc2dc80e39b9e79b601e9aa172fc08f39dec38a16acdaea6f2fb40d915f4bcb39aadc0ac96def6ea8d2de907407b97958d18eaa787c1cc29670cd8872e7fe2ef4ae33551cfe5c61fc2827ee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/157aebc161b66c638243c0a814262c48979b21de",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45400000000990ad9cb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709601000000ca2459ba01210a0d00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acae847024\", \"prevouts\": [\"dd2d390000000000225120ed1497f510b05298f56dedfdf59bdab87baceded2037e3bc9fe47e7002bf81b0\", \"480f100000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_0\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"9c6d465f3859fe9151e890fc05920f5f0e2268355917987ee9ea7e79de43c463a7d888255b7132ae4dfbe3dc0bc72a101332801010f29430e3cc148bdebbd360\", \"2cae544d1f08c0bf45a6668f8e81e77ed8830fc5fff4a9b50d724022cab5690ee80b421eec511dd5e61010c90a857ef50df533c2f596e0\", \"750442c441326ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f2f760e336cd45075e8c240a289642762d43a502d352eb6f26856b9069ecbd6f0000000000000000000000000000000000000000000000000000000000000000a24976a108ec6afa239bf6529f53a4dd717eb168e3f5be864cac330810dbf6e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92823c675e1a2f7520b6491ff52c17828c7ea50107a5ef1b6f881be6d9db820d\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9c6d465f3859fe9151e890fc05920f5f0e2268355917987ee9ea7e79de43c463a7d888255b7132ae4dfbe3dc0bc72a101332801010f29430e3cc148bdebbd360\", \"4c8b30f49759382a62c79ad4ccc192fdd531d8ebd07da1d328f8dd1d6c551bed44f783ee28e0b6171a7c8a3d5af5de84f4452a1c1a0b\", \"750442c441326ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f2f760e336cd45075e8c240a289642762d43a502d352eb6f26856b9069ecbd6f0000000000000000000000000000000000000000000000000000000000000000a24976a108ec6afa239bf6529f53a4dd717eb168e3f5be864cac330810dbf6e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92823c675e1a2f7520b6491ff52c17828c7ea50107a5ef1b6f881be6d9db820d\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/15b38d795c9bb9ef573b4d2b1ec4af8fc0cd8fb6",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccb000000001cfe6dddbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2c01000000c20cd2c40255c4c200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f877b000000\", \"prevouts\": [\"92f156000000000022512081f4094833c2bd1c8ccd20bca7d3b4bfd2d5ed628270e66be4011ac690e88295\", \"1a336e00000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_4\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fd6b1d3683d073e61bf14c61589314e5217a28e37f79fb5ef1a559a7d092686e004fa5230305827d654a6dced83870b0cf28098e9e15ffa32763cfbc1704645a01\", \"9e692d60bd8d606571937bca6efc4424\", \"750023fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774daac916923fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da6eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360ee8ce1cc6402c664160e2673cd562c284ffe5a9d51d880e57aa7962acbdbaf6b82212375b3163165baf07a41081950e4a930d2d89c0b0e74343bf419d7d9a90faafca2a8a8f6c7d119832e5d564b4d4833a04a2fd7939d6b3f4f9113808a30946961be48dc97c5faed1227dd301bbed3c226f8bae5b9850ca0fec70938223991b8afbaa887ecd89c28162c904940f3bbdde1337cbf5cfaa29807f434f2a3cc2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d991af31a7907ca623e7471472ba05dbdd7634b91e6dd5935b4cc093a81d13387ed1870f3f061cbc24b9576b62dd0a98734759b8e527cbb595f7f3b08e524f7fe4a16c690034d7855c91554dcb96a2d8d2a2769ebe672069a66f653ae4f76ca5d1bdeaec1d93e893b58df5440bac7d0034a93260341cba7c7e17ebd8142671cb618f3f7bd41dc0483f53576fb62c4a4ddf9fa643706403a7e80d2f52c16dfdb68e3b24e18d54ce3bc3f592380d81db6ff0b093303657b7c0217cea14ff19e7f2e577d56b1accd67f73c6a86371f866e23145b60ccc40343af6f38672031b483ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2568d751d8590666015ff790e5e46158bf7fb84480770b17f668e3d6b7108183960f233300d7460f72e9a93ec8ad82180f3479fd15aabb50f8199b7d58c03fd3b3e75a587ddd19655282f16a554597180217d56817cc2503f7772ca013c120c21f4bd07fed00ed63729e02e7a1dd956b0eaca9b45943eeed833f94fd8f9710697657d3dac22b45d9cf80f7698315130eae1662959abdbea7354a1bd55123ab178482c0fb29f4f03e22c5b87e2db34d4e9f152679680ecb88ef3772497d38e6c0e6b8521209d2c8c0b03daced85104381e7697c97be8a424e952346cc7b054a7506cdc72be568f2422212b9e88e6e7c5973a824be4b31a2aa17f52cf6ee495ab32bd2168a51c3a5b05d231b27d2fc6aad802bd77e8edb4ab219ffd6c1df66eda881590b753ce02dbc56d81978897e889e0cba287be84214a041ca7dff0b7997e36a7c2f4c46e7fc4cb5aeb93f28d687ac8c86ed0ed5b09a88d63ea4cef16c59a8000000000000000000000000000000000000000000000000000000000000000006f72b5a2d4bdcea0bd126246ad2d2477c17dea0bb0dc556b640d1aef1e676602492c3d88c830d609a707645ba9640d7d565bcd5aff69b0b6a3dcf2c5eec35c00000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf07e91c9da68d5d703d6e06c45282b0f3ddc059316166f8f9f7a179e25da51a49b0aad9ca9b82f64d83f38eca581ca38d1bb6f9f662829251e69bcf2f3e43145cc59dce48bf6b3d4072f2995aa52ff4488befc6866bd69943917bcd43579ea6ef216ce10035f9b72fff15c20113b0ce4b3064454680131c4e5eb9070cf67937416232689e5c807105b6f37cd192baeff0dd09e185b66338c5899223e92518c1000000000000000000000000000000000000000000000000000000000000000054f70ea626b1f3b00f2b177ed980cf6737c1fb222bf27803957141c673a197e344d81986af3e4fe232fb4cefb56d334dfa7cae09fa5f359cd5171bb54aebf2cdfae0afa293d38f6a60784231cd5c836df1ada5a03252d281528b3313c4ff44d1d2dbbcaadf18dceca71cebcaeb5d4d43c614022a3d5d97cfd78e94525aaa28347593bb42a8d7441c9a11bfa0bd2870f8ce06dda840c0fbf2f7106003cdac424d128c3dcdcdeb73a001958145f157af99ece9fa64aa5d571d87cbcb3025cbdc2f3a17c1097a4681b6ff92ec7197ec6db2514a2d22ee0344df673393be06893b4a00000000000000000000000000000000000000000000000000000000000000004d1c42436eec7dc83920ffb5afcab7d6e9de90f2dcc8d1b70444ba211de242c772e76cd39c87b212680a2ea640588ca6ebb9f1c2dc7ace27890693efa7e1437d77ebc8d0be0253abcc19620a9228e0fc39bff25095f2fcdade5349194d8b5c0aaec7e7dbf321ef772ac6b953fc7fd1b760cede71a36ed1f9f778d1d9d96cf2698141d7f62311cf943699d3bd66f6ef4202a3e3593a0b06e4e10ee1a1036fae949fbf725310621fe2bc1160d6b73acd12af1c9032b22d0c8271f1e608339aa4b2000000000000000000000000000000000000000000000000000000000000000093ab9d3ba174288d6d9576c25bf2eab745d2d2cfce294d070cc8bf0772a9cb52ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a29a7cd992657590929a06c0f1e0810cbbcd6e04dd22a270182707c31a68aa7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fd6b1d3683d073e61bf14c61589314e5217a28e37f79fb5ef1a559a7d092686e004fa5230305827d654a6dced83870b0cf28098e9e15ffa32763cfbc1704645a01\", \"50827f0bdf447b9c8f9d0eaee88b8d\", \"750023fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774daac916923fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da6eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360ee8ce1cc6402c664160e2673cd562c284ffe5a9d51d880e57aa7962acbdbaf6b82212375b3163165baf07a41081950e4a930d2d89c0b0e74343bf419d7d9a90faafca2a8a8f6c7d119832e5d564b4d4833a04a2fd7939d6b3f4f9113808a30946961be48dc97c5faed1227dd301bbed3c226f8bae5b9850ca0fec70938223991b8afbaa887ecd89c28162c904940f3bbdde1337cbf5cfaa29807f434f2a3cc2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d991af31a7907ca623e7471472ba05dbdd7634b91e6dd5935b4cc093a81d13387ed1870f3f061cbc24b9576b62dd0a98734759b8e527cbb595f7f3b08e524f7fe4a16c690034d7855c91554dcb96a2d8d2a2769ebe672069a66f653ae4f76ca5d1bdeaec1d93e893b58df5440bac7d0034a93260341cba7c7e17ebd8142671cb618f3f7bd41dc0483f53576fb62c4a4ddf9fa643706403a7e80d2f52c16dfdb68e3b24e18d54ce3bc3f592380d81db6ff0b093303657b7c0217cea14ff19e7f2e577d56b1accd67f73c6a86371f866e23145b60ccc40343af6f38672031b483ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2568d751d8590666015ff790e5e46158bf7fb84480770b17f668e3d6b7108183960f233300d7460f72e9a93ec8ad82180f3479fd15aabb50f8199b7d58c03fd3b3e75a587ddd19655282f16a554597180217d56817cc2503f7772ca013c120c21f4bd07fed00ed63729e02e7a1dd956b0eaca9b45943eeed833f94fd8f9710697657d3dac22b45d9cf80f7698315130eae1662959abdbea7354a1bd55123ab178482c0fb29f4f03e22c5b87e2db34d4e9f152679680ecb88ef3772497d38e6c0e6b8521209d2c8c0b03daced85104381e7697c97be8a424e952346cc7b054a7506cdc72be568f2422212b9e88e6e7c5973a824be4b31a2aa17f52cf6ee495ab32bd2168a51c3a5b05d231b27d2fc6aad802bd77e8edb4ab219ffd6c1df66eda881590b753ce02dbc56d81978897e889e0cba287be84214a041ca7dff0b7997e36a7c2f4c46e7fc4cb5aeb93f28d687ac8c86ed0ed5b09a88d63ea4cef16c59a8000000000000000000000000000000000000000000000000000000000000000006f72b5a2d4bdcea0bd126246ad2d2477c17dea0bb0dc556b640d1aef1e676602492c3d88c830d609a707645ba9640d7d565bcd5aff69b0b6a3dcf2c5eec35c00000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf07e91c9da68d5d703d6e06c45282b0f3ddc059316166f8f9f7a179e25da51a49b0aad9ca9b82f64d83f38eca581ca38d1bb6f9f662829251e69bcf2f3e43145cc59dce48bf6b3d4072f2995aa52ff4488befc6866bd69943917bcd43579ea6ef216ce10035f9b72fff15c20113b0ce4b3064454680131c4e5eb9070cf67937416232689e5c807105b6f37cd192baeff0dd09e185b66338c5899223e92518c1000000000000000000000000000000000000000000000000000000000000000054f70ea626b1f3b00f2b177ed980cf6737c1fb222bf27803957141c673a197e344d81986af3e4fe232fb4cefb56d334dfa7cae09fa5f359cd5171bb54aebf2cdfae0afa293d38f6a60784231cd5c836df1ada5a03252d281528b3313c4ff44d1d2dbbcaadf18dceca71cebcaeb5d4d43c614022a3d5d97cfd78e94525aaa28347593bb42a8d7441c9a11bfa0bd2870f8ce06dda840c0fbf2f7106003cdac424d128c3dcdcdeb73a001958145f157af99ece9fa64aa5d571d87cbcb3025cbdc2f3a17c1097a4681b6ff92ec7197ec6db2514a2d22ee0344df673393be06893b4a00000000000000000000000000000000000000000000000000000000000000004d1c42436eec7dc83920ffb5afcab7d6e9de90f2dcc8d1b70444ba211de242c772e76cd39c87b212680a2ea640588ca6ebb9f1c2dc7ace27890693efa7e1437d77ebc8d0be0253abcc19620a9228e0fc39bff25095f2fcdade5349194d8b5c0aaec7e7dbf321ef772ac6b953fc7fd1b760cede71a36ed1f9f778d1d9d96cf2698141d7f62311cf943699d3bd66f6ef4202a3e3593a0b06e4e10ee1a1036fae949fbf725310621fe2bc1160d6b73acd12af1c9032b22d0c8271f1e608339aa4b2000000000000000000000000000000000000000000000000000000000000000093ab9d3ba174288d6d9576c25bf2eab745d2d2cfce294d070cc8bf0772a9cb52ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a29a7cd992657590929a06c0f1e0810cbbcd6e04dd22a270182707c31a68aa7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/15bed2762ca16694fce3754fdcb0fe404484b18c",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705c00000000fc3ba74b60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270360100000034bc366cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfa0100000055a193d8039f024700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca335554b\", \"prevouts\": [\"c58a11000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\", \"75690f000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\", \"91f92800000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00637e68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900456a1ef8f97f9d432891c11b27eeccc6d565069ea6fda1d19446b03f857ca9b7d00cbb6a1bc9c683a9249ad6bea98cd3b225511a23bd3763b6594afd12d3e036b5faffec7faeeadfdc2f9d17b998c1a9153f333fbb08a178932d29a7211446b62a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367379cfff3878adda0b859082d5b21f59c33b10ed69d43cb7d8098f3dbbb31e416a1ef8f97f9d432891c11b27eeccc6d565069ea6fda1d19446b03f857ca9b7d00cbb6a1bc9c683a9249ad6bea98cd3b225511a23bd3763b6594afd12d3e036b5faffec7faeeadfdc2f9d17b998c1a9153f333fbb08a178932d29a7211446b62a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/15d389f49e1f412ed725252d3ee81230a2e81cd0",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4f01000000b02ea1ac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e30100000099b12a1b60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703401000000cc4e3d950314417100000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc757020000\", \"prevouts\": [\"0fb65300000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\", \"2ac5100000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"03740f0000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"0b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cd949ca4fda7b418d269ac7332cfe3b3c4d272913f478425fae381281da8c46e49153cc622aa353482ad0128e41c922a496803621b9ad28f713d97cdce77464b2c78e40500fa05b550b7f6357dbf83024c41a574f6a1706762c104fa8aec3fcb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a30bb99d7d9a0fac0fcd125fc81d59b23ab8775c400f56b8708f446f264d38aca51646124a2b4386d840e205fec55c7cefbdbe9c75e9c45dd558741f313d2d0ee0d9bed60e53dfa6fe8b58229f37daf0597893c765c7b30814eb9e16fca89b86\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/15fcafcc7469d59709774013df0fd9633e820008",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47d01000000bf12ba80dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0e020000007eaf3ef5041e8d5500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79693000000\", \"prevouts\": [\"fd043300000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"0f3225000000000017a914a5f28fe5532719f979169bfa3a31d5746f69452187\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2357212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"b8be758fe2d28e7fbfa6f2359efe0fbfe093c11e11aa89a0f25e978fccaabc764e37fb378db09249e7a5fd824831cb3af1a1074bb5d25e5c7d8aa5c537fe4a1a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/16128f27ae921b87284e0eab75845884e009c865",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a1010000009c56d373dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbc00000000662fdb6e03de2e7d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd858f22c\", \"prevouts\": [\"c78532000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"4d314c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ae\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0be36ed8dae05f9cda4607148e82c789c4d9e36be70fa625603182279d00e95f660cfff7d4bde847544ea1944c79df8edf67aceb90d0d743ed452510da9bf601\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1bfd93a70888881a409f12eb9c833a9f696bd4f8c7fec00becc36b0f24dc97c628121b7932065253e71c59618770790c1493f723e0c45479bc432b7c55d54cddae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1630122f5bef1592ca6b6280297bd620d8ce0ab9",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4901000000049cf49e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b801000000bc4daa160275809a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e754000000\", \"prevouts\": [\"0c3a6400000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"53e838000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bfa2103ccccf1488b36a28aa4957dfd6becf11a8a0469d582e7c98bc6255926c5affaaa2f1dddc4c29a1c8e96b141211a3426a1da8693f2e73f2f57fa23d7bde01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4a12e80c94c0ac0584a8eade86f52726f4706abdad42a39268d30b05aa4afaf7ae8c296a8b72e703572ff1e16d3e8fd31c8e6575a53a0f960c28fe83961fc5b801\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/164113b42e586e2e8ce7bb6fccef9f52a5136708",
    "content": "{\"tx\": \"84a1e22002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6700000000d31a558abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3e00000000a47f97e303c77edb00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7b8821e39\", \"prevouts\": [\"fe68600000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"69857d00000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_dc\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1b2c8969f6db96d01c364f245eef671b80073c13aedb6987de3b77d5659cc81e1eba9eb682616a1b7fb85def99082375b2adae70132ce84c20c34e4e398238bd03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d4f296ae3ee1ec947be95c69e6dcbd5f2fb38a277f1329b990a8243c12d9248c745d0c45d0e4a26e6361a8fa896064068d8826c0cafb491a88197cd8bb96630bdc\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/164178c636e1e1ccfbe67f53e9209ff1c0e8584a",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ed01000000980d4ec98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40a02000000fb01bfe604d937760000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48738fdec36\", \"prevouts\": [\"e7e9370000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\", \"685f4000000000002354212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3d601f5f6580ecb01eec7c5ead52441fe44b531ab6ae99d3e697404822425e8759146b1c6992eab52d5279feeba4f7cfe79e2d5a51c026de49302c2f6e01d653\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/16431b60ce2185dc8a3e19f1b9325a1078131515",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701d02000000cf6fd6acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdd00000000770059ed60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270030000000080b8e2a304c1997600000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5997e11d\", \"prevouts\": [\"a72f0e000000000017a91481d4142ddc5ce7a3de4047bd48b623419b5bc45e87\", \"8cd95a0000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\", \"ae2e0f000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"3f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369aba35d3104e600974e554b9cb99049f7aee0f23ae7c74d9fbe3a88b265c838bd728e192bc5f69ac80b4a6e0537a86a2095372e08a2c76143a8a8a3d0ed1b85bc06da1f6599d7e514a71ffa8a2afff73792fcf1df1b953d2196d009aa835a52703985aa46dcbff8b0495de750bd1afe74a661312f7eddf1146199ee1ea8c08aa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3d62cda1d889ee05ca59ece4e76d2fa27c0bab47b49d4f70b1e2cb0efe9a711fea811edfde1d836b623c2094badb4ab8bc7795b2b49da5506600222f32ea3fbd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1658b5c8f7c6d3672d694462a7f53ad3f3596d38",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bec00000000078c47fcbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd5010000001a65b428042cf0a00000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478710020000\", \"prevouts\": [\"f72520000000000022512084127e09a3e5abb8e6ea0ba3ce4737d1c2349f1be422ff5ce1609ab9b3fbb01d\", \"497283000000000017a914269f407e1403e9e55237bbaed7146c0fbc0fe6c987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090275fab9b7195359f7514f30a6475ced76a2aa48da224e6237aa6415c08b28ce5e2fb5859531f43cfbe5564e6677e4945d72bd57a5e391af4eb6b1cc214c3271c6417d1d31156fed8d5608caa4648ae84a369204011aeeb2fdc9a5dd3f501fea490089091faa2601c5fcc1fa05ad0a29fb85a040cc521706b51dfb7fd76f0cb39f0a1a60056079346d67ebfe3325da3b47c20c4c59a349ed192aed4fb7397861e496c7ea413bd961a51830f27bf1c4b270849600f15e878c851bf189d07c56a94d55adcd5e2d6ea8f74fb78f340e9e0a5985fe0396ada1e0903fcd250bfe577bfa194a7bc57eb0e332f33e183489fe985c15a08ba86f40922c19d60319a0529c25943af902e84066b079ea7f1bac331bb5cfb96a8996275c2d6a5cd63e1b04770c81e6887465149f28096b78f61423a5b1e2ee3930f3b2d667fb10f8153d48fd30587c880b7afe5160d4dda45b45d5a388eb3534c827de64b3fa31562a3447950ccd10c5357b76b045e4c8dbff3f4dd42998ef4d1733c25c6acba72107c8f401fcfadb6bbc838342d0556f95fd322b1640256f30753e8f4c4cc4846de415637d5da505100c7f9699ae46c4a3738c3bfa51374e10e2457097a6d9c98ccdf2d40ad57b412c493c48a8afbfe059c7001884b5cc0911e32c601c9a5d078609dd54fd6554aec2459ffe08b2c4265dc63898b68d2467d190eda1f56cb13cab10e10f6edacac0f68425e8ca3b0b75\", \"ef7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367cbfda17c38fed6334a2908ab805e5d14fa71acd028483d3725fa56b0d725d21eda91d0eecd1ce224dc9f5ac46de57cb81ed44d1050e451131a9df60f58ad735b030008666d4260a12bee868d13ea953ce9c9319f2222d8e8469ea0b912b8ceb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022074db48bb9c1f5d88eb3fb771aa8b9567d69e345485ed7d6eed5a405fd4ef514a48923e11cc30d8ea7b6e3670bdfac73b61fb2edb8619603c65920bd0e3368fed8707f68eebe3cadf5b8b830c92f16ea3a535499c31ff7c72292394c77cfe9046310dfa27b589342be471c337d9040f9b20d15171324efbb16e69ad8b1fc08947f991fae6eaf0d61bc0dd75be08fa3e87ef168f9212dcab43cf566416951f4d2bd3a097fcee8a50e1471a01e68dde48a1773fb112b49596adba32732d3c108f20d937146661d7a64e5a770d8676d6e83718653efc899ac583e52b8168af1471480eb4334c6cfa62f853b409fe0f0b18da29256b97d99f84101c0d3168efbce42178734dde7c0c1a1382dff8895a7e3d25dfabf7cc75d69f6044434f8acd327ec5c5645e51a22d15e9b0ece5bf66f96f9af7c4161e6fd4e5b87a7c15e8f1d9292224dad6ad431d7b261ae1e55a60493c0d3acc36c2dced84343019332d9433bd3c018c0348f922cb75912179eef737c08b033b24d4a26fcb10c8de4fb856a52072ea1343d6225d750d1f237b99519b9ec04193a6e3d57cb825db2b0bcedafe6caabbd505cef725f622c74a065006471f433695404b3bbc058e91403a01a7539497d851f98882c53b320d7586031d4689f4e42a3b506ad6abc8911551a612df4482ea5f6b19c1685f84a0eb61771be9a4134baea5e129ba3089f02c23f2b296e91cf738bb5ae4edb91f75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936361ae9315a4f56942059dce8d08baef7ceb9eca078b725cd2c8eec46152008c6eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac8ef60344f111a9c34d055af59cfd42b130acbf4987ee3354719b7c9974e4d449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/166cd55c33178000f9e3e3b366ace5266964a5c3",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd90100000012f00060dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3c010000008347e7830238aeb10000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748761030000\", \"prevouts\": [\"c79c6b00000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\", \"dd9f470000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_19\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2d46ac609b4e1622bd501ff9596c14c9ed0624310f50cc9f3936270dfa548d2c7adf11af4d0eaa4fa4a21739ee0c77dcb014bac0a87346a140d6d018c16fef2682\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ed9ac15921dc6266095a75e80b82ee38ba7a3a2095b816b01f629e5343326880f41a48ba16e00bb810ffac1915d0948a5187cfe9e58e1c162a25bf944d18c7b019\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/167a4033a1f4c30b87898758c3868c1025df1694",
    "content": "{\"tx\": \"7b13900c02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b76010000009ad734fedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4b01000000c5b820b103cef56b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e745000000\", \"prevouts\": [\"0177270000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\", \"43f5460000000000165e142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"205b562ceece4892dab2aaa5b4dd4c3220d2e3d2ed8890be47773502094f216601464380447c2983866fc6c4301cef32ad64a9c377f25b1fcd583377c253b449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/167fe32905b764460a1199e4a4ab3d84ef186e2e",
    "content": "{\"tx\": \"b809cec502dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4d00000000826028da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708200000000d8400db60264ac6e00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acd4000000\", \"prevouts\": [\"3910600000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\", \"4937100000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"777d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364d6f52c65af8984250618465516d171424b5f4605f7d510d2b5bd71719fa37153c7477a635aa10de5895d22b0b13d3a2307950c6447747564098b225c8ebc094ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457e2aee6c91b47bf7b7aff3c5d3800b2287c2f5852e09bca12781ffc191c1d4f04\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a983e3c65cf55188846777a92d5d2662905d67f05c2a27733140ae1b500402ced76a514a469a046f8a639d1762af89c30ccdce4827317950871fa39f73bf898af03474d1f6825ec143575bd2e16c5d5a5b633189d07c1a3af4de94c30aa06021\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1680d648bb0d496b0b5cdc71bd31f42d092b5e31",
    "content": "{\"tx\": \"c3554c7202dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0e0100000076c92ed6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcd0100000015e8f9ac0162f93d00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac8ebf4b29\", \"prevouts\": [\"f7b753000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\", \"2b9321000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090275f8ad32fc82d87f629fce56667f924fd59b23f1967f238b19edd0de3dc262a2ba6ac97c8c761e2a93deed9e676697909ef70de8ba836e6449a000fba219de20afeaab20c73245fe3055fa64bc4fee3604f5f05ad56da1e1b108a15805af6f8f27f91e39312227267431aecd4fb6e5c2cafddf5b0c8065b776f39edcb8ac72a3152f42211527ea426f02486046c4b0748b050651cc2205b0453c70007fc57de292a4c6d42240db36bfd29137b8a8a5ecb1994e50e61d323a4b7255a79b953ba88704d163621dc282c662cb720bf11f25b43c9f29f89d31a6cb87ae73bfbe6f96baf6a4496e8b4df69cef594efc9edac9f2729848b95e87a1b07e01f50e5543100d5d4a91d16d87bb307bce6c891545bf46ec5839c67edfbf43730f71e9f2fb137bab9645cf2b9e539da74cd4da03a12d46a7666c42a824cdfa8b369e614b2595601329fc2c7ab87aec9986bd28ad09e387cb467250a3e02227479062d5c27510fddf0a9fcd204c69c198a5133a59810e8ba7edb973d2845973ae43cc55e7afce144f216680214d5be0e5de4dee5add6a0b5c3e0bd060103e53a0695d7b1b29b4a6723d75207a5018952ce1df6aa0b77687682bfaed4af04bc1ef8702b36e2ff1165b8f85b9eb65e8854bca27702ca2c1237cf5c15c89d91cbfa4432424a44180edced6fa479c99ea9b2f4e066bb31dddea90abf115d7634021447d6eb560adce000045cadce7343a3975eb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ed6552aba169725607bb1130dbc4a5e66e4116f82e73ca53fd59d9f0c82562e31292070a98a4b0647c95affa8e1bd4aa189d67ab6e78b6f1cfbf1b9e41a8f8bf399891b33f3277cd8a2b8473e2e6079de1e6f51840c7864da48d9f2287dbe494cf9ce2244c675144b577c27c052f9ebd481172245e28e9502c6c6e8f12c64fa6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09027274a01e8ad4da83e3fa778a82a2fb92f044ca92c005899e5679ca074a7909a5213a09e1f09efdd4148f37b007c5b2de2fed89f964df70cddf15fec39c1202cb72ab4a624e1bf918dc4cf60fddfdc17dea6b91422e27b54f7bbc1415f92c7f7952e51ca712b812813c52257e17f2e3e8e17ac2ccaba45612e43d5724e90e5e9c168ed72f2b3a8f7c341d7e5acd656986e7f60fc91ae5e180d018b178c0ee3a839020a1a0ea0671949dda3470a9006eb88cbc46b1d88244b93edd34afd2a1803990f19cd5cc197146c7de90144e0260a020d48466de1127f723f6f51aee38941e3167ebea6ab4d0c4416d25cb90d0aca2d42aea46c4ebce4e841625afd0212456f23730832011c3b8840838bfd609dcfbbaf025b0227079bb3141f67fe01614bf7d90d213149010626650c37e06d5fb3d13122160b7c4d276fbfb7476e7cc53c211a6605efbd92f062b62441ab9197fc93adb8a5009633880438a446e10a69bac0478db09e4cc1782fb4a35c3ecab86ecaaea47b913bf5a64647e06550eb43d1cc114ed3d2860e77ceebda45fac1ce02051c92932f827c804bc016352f64c7d37d0847a539065414f92b9796e5991f7eba30d7c0287f8b7f30e1df9ada3f4ef7f58d82d83808fed14dd9c3b4ec9cf31d0433f98ff05e6b4d68a9054e764e6de4cc3028aa8f57118a687a767d06a7c05997cc7845afcaab0622737aaab3feedfdb891e771bedaf0a89f57561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369886f85ebb300297009aa959255e1f8e976b091c7e06b33477ed400c40a83b4c14f0d108097d00934ef2973385fcf188ce2945eb833bd9e90fcb9cf025505833cf9ce2244c675144b577c27c052f9ebd481172245e28e9502c6c6e8f12c64fa6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/168c2988106ea01a8121eba649b024715de5122f",
    "content": "{\"tx\": \"ab01e604018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49e000000002f2cd5fb03a4a13a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796a481275b\", \"prevouts\": [\"f5363d000000000017a914f7f3eae48087a4952a984cf9c1f2f12f8785754687\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2253202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"c2cd116515da87b99de2601d6f479891cd5d8247cff7df2366f63237c6a7fe39aec53d853fdcde99e72311c5be6ba75778f6e11065c44bce3ac9a74220eb997b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/16acfa58909fa72c2eecfaacc8866e7dd1f42fda",
    "content": "{\"tx\": \"0a05db0e028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4230100000039d351eb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707f010000009a75c1ee016fad22000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cdd4d843\", \"prevouts\": [\"852c310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"2f131200000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_7a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"96bf9b8dd7c3e25dae24535d68b03d7034cf2ae0bfb0c257d2306316d6d4de59d533c636b33ffbc710228439042268a9d0147c4b0296c1ea63893508425691aa01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"112329f32b8d24769485befb9431172c5e520686e872a4f5554d429e43f687f2358fcbb14f2cb2b9f6c0df35c92d6fb2b81031df59c54bafef0b80337a361d667a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/16b2bf568fa5aa6e4b5de39fd290f6de49b091ec",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f800000000fdb29b5b60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705101000000f4984f1f04d30d4500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787ba000000\", \"prevouts\": [\"a949370000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\", \"4e5a0f0000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"f07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3e6b1501de3c77a58ed25563289f7380fad902eb870a0fdd7293169316d7b75ff88c7bee1bb9c109f1c6365501285b6447b8ae029d34f47d1dd1efc50e8947b4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eb5208f8b948433da6baa451dcc6971038720543971a17923638ed54c8a85897df7eb609cf6b5925737ad21e523a1c8cc87f95ebe19353e64c9623e085aa5557f88c7bee1bb9c109f1c6365501285b6447b8ae029d34f47d1dd1efc50e8947b4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/16c6bf5c5a6caf8746580f9e01ec4e218a4c0e39",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b07020000007adfb0878bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41d01000000b3b8bc9e0240305d00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f874d000000\", \"prevouts\": [\"43942700000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"1845380000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_6a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2ffc5dbd47ddd5c2f8e370e4599bb5f24a60695d816beda2c13da6cb5016ff2a7008a3c80b599761254448f3da8822bc7282217e3d6e33adc7c68e4f1bec3b3503\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"29482721dc7ac275df8f85c07a78144d243d30cdce18b8d78005ba830e06d6909ba2db0e2c09583cc26b65cb8aeb9fdb063081867a42b45023689e2426b6ab4b6a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/16ecdda3d618db946d6033f96c780764642e0471",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707301000000b075f9f160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703a000000004772b9bc03c6971e00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac66000000\", \"prevouts\": [\"0d7e0f000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"2ae0110000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09022074c1af01a4ab4ee37a577ed2238c8787f0cab6a4bada6f5d2e8e612647c21be6d26696ae79098d80e3f1284580385e0c77a330ff679475d29e10503a4f582147e76794e5a5f855160fc67104736bd34e91bb7e6c6949893d5ba0002ecd78680aedf2bd03daf8238d8742f68cc3475a5b6fe9f667d7fb1e92772fdafff7fe3fefc6c657041d58a4bf9732adc627f7924e13306cde51ea9050b91361d526e1b349e6c362cb9fd1d3e8f11814738a554bd4c4775b06ee086b411aceb72e4cbad1a238e26b4b27e8827dd23f7601e92d11582c34218f30564f0b923e0c4abc70f31b588636015af7f9b899e40f92dea322adc746b0d60b4a0df5c03b9c61c75c844f2e9c8f35e576f4aa897a082c9a6042f78e5d0e5cb2ee6aecdbf1cac2a20bbbfc303525c7309eed6cfc78eb7b44f83536221b7fb45bba92eff5d30e01549ef42a01c468b988ecf776de5c2497f28486c8a4be1cec44f6a3a7f6ff4110fb26761b8d38f638df69dfa24f9ea03d8910402bc726b84d1c1b24d2458c96e56006e7bbd7df1df5b0c655e9f01a2394d4bb361836783c36db19f9433788878880703a72d7512926040a2e570c03e88eda6dd187a0435d175a7763f2c94abdbb82619077a0f1d3611681986def2171430c3885917235fac9b821f1d527749ce43f04efa241f727ebe23c58b5c5e756391e6850e48eb59306ef01633f1a74c80ea603c66bd45bf15fa317810775\", \"717d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936acd583c45d21b204d1804bedee0b0f3c4b80b4344b7f9b78d7e17b5495d745d61e193f5d3ae2ada43ea9223ce508afaffd6393e3458e5d7b2b04f710aee774aaf4fdc20f1f5535ceda7aadddab857a143114b7886b058839365016ac02e93c97\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090275347463f525937e1d40acb4526ae2a606ce4c9ea532e96a08565c5600ba4579e2fae43aec021284ed8df594a5061daa3c984e6ced12570eecb593b21e72e5017dd990c7b1e785872731ace7dcd25d5a409b394badca2fb3e089bd5cbdf5bcbe6538a61152cc0a6692c57c66e71203974426396dbd05597b65e1efdf4835c687edd32019d365cccaef873ce0343172655e841c550e32db2bc1b83abc4cc36ad1edb93a48df3850953383a83a8dfa5e6c17e119a672100be9c49f33ed270023b11f17b5dc70819e544bb68716cc880bcd5e06986669c43a02161ae0594427d1de18dc54eec708cd782eb28a214c1be61bd4b2505d9173ac5cb87934ffcac3a192177bb7659faace9ee3de2d917e59bdb8f845d82e0968b2b0ad14131f4a7f09e6aa98c340995adf8179b4406025acd4d6c788c3c63715271fd2d99898621b07dd8a59f71ed3f931b49c7d84580934da53b637b1ba3b40e3181c7676d52eb9b77a88392e7b2a7aee7360098bd1d64003d72e74c537466548dada818b8d83117e5bab73563e54c3441c8c872cf2671a919e2345ccca71d293ad60b0a6a6927ca9303071581793294793b35acc4f5fc8897a8d67f8202d87e152ffada3674e4c1a565f195f1a80264d3e5773b1df3400c7be59af8c34e4d73074932895fe4213db361754ed666ce91f068701d739b84918bc33eaeec6f2d4c2e4c2fef7b59c74eda5864dfca3d89e58fe3575\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e47c0542868f8d04f04b11c7797ac2650c695e4f1f1a83ba9fe9a249175e916721e193f5d3ae2ada43ea9223ce508afaffd6393e3458e5d7b2b04f710aee774aaf4fdc20f1f5535ceda7aadddab857a143114b7886b058839365016ac02e93c97\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/16f6f25ce07eadca0f3c82818b8910b5006b6aa5",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3e01000000cfab0487bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6c000000006aa54fd6047c69d500000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc797000000\", \"prevouts\": [\"a7a25a0000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"970b7d00000000002251203792436bc7394fc8cacb2bd2cdac9c86871063933d86113811cf92ac8fb26226\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93640873c0ba6ee1189c8eb3d7712690e4c72ee5324e9b4123eca76344463b203ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a3d616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1715e26f824103c322e360c6d3c237781724ca4e",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c81010000006dbe9804bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6101000000606c4766027ae7c2000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487afaba04e\", \"prevouts\": [\"7ea54c0000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\", \"8668780000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9f4d601ee4c95b404904b3634f10340ed5cc2d5217b8d4c8b61fcd07ea2a2ec0be945eeca3e8dd20201edae5e8e4ad5353419b0e7283a9ddefa3c9cb6197aeb683\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ef45f34e72a351230a4b75d54f81f0a013881cbce07c34da05fcb83150234cce6a5602d5b63ed6c66a0b376d84a4189e90f866b71a967a0a415ad11e045bff6b0a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/172062063b7ae63dcffacdd6b98414054d06633e",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0b00000000841f9a698bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d301000000542e177d01f3141c0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fce455ed3d\", \"prevouts\": [\"95cc5a000000000022512089cd9bcf9fe9207377d5b979d86bcf752d8d9dc577da80e024c55776b1ac583b\", \"47af310000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_2\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bbc60f5d705ad205271ae418fa66f0d3c7e753d4ff180d61427337fd992e014cc7b932cd72f78749602d019232db381de632db37e63bb6c98c7b099f8d01bf85\", \"839267d6df0912e5b51f34023acbc7ee499792bf670136104fbdebede46c7bdc92b506accde64fbf85b129d12d39e3b68c5742e49fa574c78df828c285caa75dd5adc196e2aaf19535c8b6ff81359797258a81b5441686e4ff9cf2a3bffe6b356d5973c329e3b83aeda7c597a0007b98f9799f6d38d9235b387a427d7f8907f586e581c18cc2783ad9ca95c6efccd9d61cb7ef1e9a7798300d02e0de99c01a\", \"4cdc5c946e76fa3b8cbba9df2747f00e36922870e04a1d7b73d0d7be7b66ebcf9b7fb48e2c19122178c23c497bdb9e81cca0c8f506c2948de839eb8fd4937fad193a715e0199efa3630d411a86fa04d93b9cdc76493ff3a76194563f4aae77307242bfa399fd6b916ad0cbb23b9c3aef3075068fc66b5f186c14f15e2b1af53afcc633f3857186145b9927a02e1cbacadd099a1a2f58b9d79fe00a0785a531dffcc2a09bbb3a90e22aad7f41f330f16ba557b99d8f6467b650041d69428816875a721eea04addb2cdbd6bd61250600108a3ae9bb21643cd6c4e7ffd0d4e36d20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2051646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000032d2efdbe161f98c288eaa7fde4bf4fcea321901811a63e066302ce97599a1f9c1aedc962753057dd58085b3b42211bdffaf8bfc7fd34f8a41eb79c9c1d3ae83ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000001f858f5656212125faa6eca732f451d22c3247528ede16e402131fa27291047000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008dbb21eaff952aee1413b27d6544f80001b0348805f17871125c31f0c83693bc4e6c0135b1e281dab29c4cad425a9053dd2519a7dd2c8c13a888f296e54cd0ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff43d6bea0072195b361f058c9a7e17831c3c4d4453374f6b3ef9c08e136a3e1ca6c188788cd0ca725f0a3156c1ead00eb9238ea1aafbb39b34d4e0f0fc4c4d3209a54439c8f1b29dec753bac498ba1ac20b83434e06482602f7e0a989f99d6ea963b5c5d77f2175ebd3570a0ccf057ddc65fe30c62b6f1c9c0c34e0a08a62021ed917fd46971d6070abb03d15af5991be56e08a425e0cd9e813f7e96ba49012b3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1d726dc89cf4e5c9124bf8711bdc2e07a8daf774ae4012b22539b71c07ef212f9c938a7204c78c9670b3b453158ffa99b869b633379d29fb1aacca0628e5a9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff58db95f3737e2b8a5a30ff49853ad0936e6c131757bdbaefc3e366453323513f16250042be117da29fef9ef7f439bba7edf9e777b14ed019706f4bc72caed468eac762bd0d93a5dcd4b44b8868b4a20da2906f9229d66631d05efecd463868703475f6ccfcdb564a8516f725723827aabdc7c0b6441aeac1b9b1e3f1d8e9fe3c9661d942f27eab2399848d83364321d832fe274ea51d21fd6e96ff381d5f86c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284df40cb00a2b517a661340b2d63e0d02f2c780340b8dc5d2617845680c33cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bbc60f5d705ad205271ae418fa66f0d3c7e753d4ff180d61427337fd992e014cc7b932cd72f78749602d019232db381de632db37e63bb6c98c7b099f8d01bf85\", \"aaf117669031bf027b0d859b5cb34b284214e9b533bf4c22bcf4714af431f6efd11d5abef709464a6006c1cdc0bdea111ebd46a80ee2b6b214456c169e345e24660acf2db097f7b3574995385abe6c0e91938c6c43e3987e44aa5a4712258025d7593a00ffe4f95a099481d0de95ffa700ba12cc5b135241c8c565ba00e070e878885ac95ee15046a2ba96122e503729a488d066782be6c30cb52105201e\", \"4cdc5c946e76fa3b8cbba9df2747f00e36922870e04a1d7b73d0d7be7b66ebcf9b7fb48e2c19122178c23c497bdb9e81cca0c8f506c2948de839eb8fd4937fad193a715e0199efa3630d411a86fa04d93b9cdc76493ff3a76194563f4aae77307242bfa399fd6b916ad0cbb23b9c3aef3075068fc66b5f186c14f15e2b1af53afcc633f3857186145b9927a02e1cbacadd099a1a2f58b9d79fe00a0785a531dffcc2a09bbb3a90e22aad7f41f330f16ba557b99d8f6467b650041d69428816875a721eea04addb2cdbd6bd61250600108a3ae9bb21643cd6c4e7ffd0d4e36d20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2051646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000032d2efdbe161f98c288eaa7fde4bf4fcea321901811a63e066302ce97599a1f9c1aedc962753057dd58085b3b42211bdffaf8bfc7fd34f8a41eb79c9c1d3ae83ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000001f858f5656212125faa6eca732f451d22c3247528ede16e402131fa27291047000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008dbb21eaff952aee1413b27d6544f80001b0348805f17871125c31f0c83693bc4e6c0135b1e281dab29c4cad425a9053dd2519a7dd2c8c13a888f296e54cd0ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff43d6bea0072195b361f058c9a7e17831c3c4d4453374f6b3ef9c08e136a3e1ca6c188788cd0ca725f0a3156c1ead00eb9238ea1aafbb39b34d4e0f0fc4c4d3209a54439c8f1b29dec753bac498ba1ac20b83434e06482602f7e0a989f99d6ea963b5c5d77f2175ebd3570a0ccf057ddc65fe30c62b6f1c9c0c34e0a08a62021ed917fd46971d6070abb03d15af5991be56e08a425e0cd9e813f7e96ba49012b3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1d726dc89cf4e5c9124bf8711bdc2e07a8daf774ae4012b22539b71c07ef212f9c938a7204c78c9670b3b453158ffa99b869b633379d29fb1aacca0628e5a9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff58db95f3737e2b8a5a30ff49853ad0936e6c131757bdbaefc3e366453323513f16250042be117da29fef9ef7f439bba7edf9e777b14ed019706f4bc72caed468eac762bd0d93a5dcd4b44b8868b4a20da2906f9229d66631d05efecd463868703475f6ccfcdb564a8516f725723827aabdc7c0b6441aeac1b9b1e3f1d8e9fe3c9661d942f27eab2399848d83364321d832fe274ea51d21fd6e96ff381d5f86c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb284df40cb00a2b517a661340b2d63e0d02f2c780340b8dc5d2617845680c33cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/172b85f2524cbd3f0ca1a41380566b1648c8c405",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bae010000006b85b084dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1c020000003e333c8a0305983e00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7beb20230\", \"prevouts\": [\"9b361f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"07072100000000002251205109082c92be6cdaf88bccd1fbf3eb83cfab83a783afec3533a63ba21c303957\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_a2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"76c983c00fb22e9436e98f72d0759ce06226d6b3f4dcfc7c6e430b8a74e4af893c54f63c8731a08f6ef2a870d0226e0c0f6279a4d5565680728a94115c32713a81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"333565cb2306881e71591235c965c1c30f9a392877cedcc6b965f45028b69f512c8bf3d472ddc724ada5df5256200327507374cc5e35026256abd4c9a053bdbea2\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/172ff5cf4d0d01f9ac160be767a1b233dea05ffa",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4660000000079caaceddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9400000000319a8008014ac71c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a631000000\", \"prevouts\": [\"e90e370000000000225e202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"72f2250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f0cef00457cf698bf2d34dd5b5a0ded84464a8bcf9886cccb35a292ef580e492c3abd449cb085d9914f672edae5d0c926025942789a99731e7c216170ad41de7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/17405fca2ae8f08cec8849c6a750217abef9ff89",
    "content": "{\"tx\": \"1856b3df02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4e01000000bd0fc0dd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b0010000008f497eb404b1cd82000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87c40df233\", \"prevouts\": [\"dc4e490000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\", \"11a53b00000000002255202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bf\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936db7a6a7e9e2eb861c5b236223f8a0e993b636b19808476c0a20268bf09779a38cc596949c599e703b9191d3ba022749fca5ec33c3492eb5532759cd445d2634b82745fb8509382ce1e64511ce3c1d55be477e9687cea49eaad32aa52098dfc07\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365bf71cf7816bf4c839ad04f64c439f60ca1e0c1202f6058d0897192eaa874d9b285ab48eb468144e5e6aa7ce6d4aa75a792c11a68b383289399495d27c15055ecc596949c599e703b9191d3ba022749fca5ec33c3492eb5532759cd445d2634b82745fb8509382ce1e64511ce3c1d55be477e9687cea49eaad32aa52098dfc07\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/177f3355a5b98fe40607bd5da8383d7129c515d5",
    "content": "{\"tx\": \"acbf9f810260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cc000000000eb572d4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b920100000084c9bc8602e0ab2e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acb0633037\", \"prevouts\": [\"2dff0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f34f210000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"3d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93643fc02d791da942af66dbc7ed13bfb20fc5039325710c1116f758577e095b78a701c89cbc41056f58ce11974b5756eca381e306e17d72fcef5e58c3aca02cf1415eb41ce20b61903eca7e2f7903a7c5f76d50ccbb22a22a302188dbad2e46b28\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b508c965bf67778dcb8a54be530beda3976f1f18c717ffc195c744ea9b09aadb671c5f6e3fdb2cca9ff2c8978272a7c72309b5e793932f9bb10a0961dd619da6701c89cbc41056f58ce11974b5756eca381e306e17d72fcef5e58c3aca02cf1415eb41ce20b61903eca7e2f7903a7c5f76d50ccbb22a22a302188dbad2e46b28\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/177f56a1fdc5cc3198a785f6f5e7a55d8c324f16",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf430100000019be6fb160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704300000000dcce808e041afa810000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8795000000\", \"prevouts\": [\"d9ef740000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"78f40e000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c04c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93688fc8f615032475bb12c71b7eb73effb9d0886ca0e0e26ca1dee2899bd81981c1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004500c8753d4e6010499b58065b36892efcd9281a64e85ebf7c5dcb8f6f4baee16c3de843256fc2f72424a897ba91cb5d3893aa03eaf52af3ae765db300c5c19165\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a3f25e8770efb05111073ed80fe6014ab4fd3382442a3e29d1922781189381cde2b448ed3f1969af8fffbdb3b73bd72fedaa98057d5c8b58a84426194002c6e029de37322ddf566a2356077a247b666bf816d75bd62d8842c555909c8a1545e03de843256fc2f72424a897ba91cb5d3893aa03eaf52af3ae765db300c5c19165\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/179b29b5e6ade731ba119866f25b6743232bd3ec",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0401000000bebd38a7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbe01000000ba854d0e04f3d9d10000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e790000000\", \"prevouts\": [\"474f840000000000225120ea467ace5d4e72e4b47248d08b4c7e21d4858a06bc17e94ab3d6153139c60e1f\", \"ee48500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936816733c26ff73b2a499b6ca717ce0a086eff22a381422ce1dc07285d274c2f8b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a6b616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/17b2c3c5c8f5c6d4e3b517021c8e26c982fc552f",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9500000000d03e1c89bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd101000000992df1f804e162e200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac708d0a37\", \"prevouts\": [\"a310810000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\", \"b1dc620000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_7c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7fa5da3cd9b4d580444f4654d625dc1b8b9856d7348e7e31b609a33cf89f84997a0e5d95530f5de272f3f2c7cb6605e824b2c0d015c0ba50a451cd12f1f49cd803\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"eab441492422849d56f4622cfcbd0126a9feddfeb2046e6bb576c24bd65113ab7a06955661f92abbad08389afc44b4b36273f587af7a6389364a61dae9318cee7c\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/17cd80eebaac8182716c6996ad037efac35af699",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8c01000000dffcc7d7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfce0000000016cac3e60495eabf000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8729020000\", \"prevouts\": [\"937b5c00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"5f7e650000000000225120e1a0c74a8d16f26f13c9c4b6f4a1ceec6071856e9cbd0cceab614068d31377db\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"47304402203d3811030c08e0a632f8b0fc87b891d3763cbf3a20328a2e256ae000909e68a4022018c009878d1833d1390094c1fddfdfbaa956aebec306538c237df1f506124494cf00\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100a89bdbdcde6c63d7d2a6f29815a2ce2cb4a871c74e636e4791d23b2230e1b645022058f7a4c5a43c0a9ef1cf8800f89fd301f19d03ee803bd530d1324799078acca2cf0101\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/17fccd13627419da75dd075f405d0c40a09c652d",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1a00000000fcf1cbccdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca4000000005c8d71ea02dd33db00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a69c733a34\", \"prevouts\": [\"bd928000000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\", \"adff5c000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"b67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3bc00f369fc994f47536ced64d5e4f722a68c2ed1128957c24de4b5158af0ec621d9a3f11774810afeba87c9188100d693899e640a37210c96e3be6a00ac01d4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e848df663f65f0e27b2d1567423d7462b229bee90dcacba8c1bf1c1a66aca7f6821d9a3f11774810afeba87c9188100d693899e640a37210c96e3be6a00ac01d4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/184dbb048070da2a1db945f29853600246189da2",
    "content": "{\"tx\": \"6a7bc0ae03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2d010000005909f2bfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc501000000c4642ca8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b22020000008a37259c02ef808b00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4c7b8943\", \"prevouts\": [\"697b510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a86c1f0000000000165b142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"e3fe1c0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_7b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6d1784fdb02f794281d08e5a2eadccab5b1087b0a7be24f1c3db188a916719147f28cb172383aadfcbb53a554bd17ead768a785ba87b98aac13881819252009c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"63f65fe0609276b08be634be8b183957880282d8dcc77e30b7193ee9f23ae9ff3f153cffe505e3f46fbc60837bfd76db11d9445ea7ab7c6f569cb8bc77587b377b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/186d4e3b056dbde38d01af9a2095f2b550b930bb",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf10010000001f3f7932dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3401000000f67932efdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2102000000826b9d0304a1acf2000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688accafa8b37\", \"prevouts\": [\"0a62760000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"ff685e0000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\", \"64a1200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_47\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4f15da331ebc736f43a26b66b6f0d3dfe612edb6c9048c30f1a4a1a64824b2d84888175d8752df80ad37d67ac18d69a38fd7f8c8b9594de5aff947d1e54007af82\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ec08c97c7428798b25dcda478f9ec80f14cfe5dcee6e99e556f5247195d0274819d59fe7bab5878e2cbffac9f6f3eed3257d9f9ddf2005fb0c6bf1a7b42b422247\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1870a7b0cbdbdbcb7e9f1d248928fe0dca885fbe",
    "content": "{\"tx\": \"48b53c3102dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c390000000029ddda8dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd6010000002acd50fb0243a8c5000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc70404943d\", \"prevouts\": [\"84ac53000000000022512027986c975f6014bd54fa55f3e483bd83d3384004828bdd3e489d9b175e79ead5\", \"ae1574000000000017a91498e55eac47e04767f832d50008ff18559102c9e787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_5\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3f87d679e4e87922a0eee489ec20a705e9e568dc388bcf757e70cac8d09ecc13b34cfbd387b92a08c4d8d1292f488d73a430928e4a49f7eafeab4d76b68e33aa01\", \"15fe4dba251774e95533d9bc102ed0609a97c946219a1cf03e6fb6112d76020a0c78efaf1d33b244cf21fe90e9fa03a6d0a855dd44da2f8be864e216495dc5495453566b4f6b5fc57cd7f7e0a312e93a2bced2a69847fc45feebe7b7dd5c8ae7dd689286589ebbd15ed9a4417c5fb5df2294d4272c81ade188ed5be3cf0a45f63329fa10da2f0482c4272083ad489dbf160399317c92da90a61ec5c218078d652c45f0a6ce\", \"75005a3535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a2ba5a883535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a26e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936411aaccaa2f00a161189dce43a9cea795f36d9d70d3e1cdfaad5740f706f3bc685a95c0e3a9be06cf58146b3bc5fb1546d7d0e3556502e189d50862181eabedb441369121629d451605e60faa82fb2587a97364c24cffc54a5e52e827c54e449ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000344c3dd851e2ea42f02204f30463dee20c8e4ec50417a06167139b8316877a824c5b466720024622ac5259cd26bec0d05da102db22ba7095575a2ab0833c096ee80c64f88c70fa9c5a569bf63c9b21d14468486491ad016b49487ac210783ef738a473e1ce637153c37c66e2de294c34f551d3bff138f1251d2e0a7f4443f8c56f461f998bb42f4b3acc72e9e53e57f8ec81f342eb5545af3272b690b5de07643a69d446fb5445fb7c454993ad958ec703cba86021ad80fd977d224cf36b429e850602eccaa779cc00b8e901390d0a3f36f43e636d45368154c7ae46fb231fb7000000000000000000000000000000000000000000000000000000000000000028045a5222f219de8ce4ec64d59ec454de0c807af9d7cac8453ec4ba2c236bd4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb9da65bdf156bf72fd39d7f8e5752fca9a112277c8bb84a4f0c27644715f865b557a5191e283f21ba9e21731cfae2cce5fd3871db1cab1b923c6441195a6489a1301aa0ebfabd684fa6000ff7d506040276a9f980293b4f5e1c25cabca2dc3da0e48c71b991503486333f3fb9d1d772ac0a752ba97864b4c8f30a08d1b9986cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6f7dc171b51f4e47daaf698237e670b847083a87634e77718e24b4a1464ae516fedb2e1e9eed857bc9e29f3169583d6da8d59e2ecf81763b37dc26cc9770bca31fb6945707df739a4b83934d90a1dda4122bfc99d5290237e4cf99ee4802f6aa07f773beac71a24828b1c2bcde88987adc1134896e30412787c35d1333060376aff0ea89d2fe3642e776371bed5c0828903ae0efa314eefdba81558a852d8b1363f3636a73ee0d5967e2666ae2d9417538c99a277c2f2399c9ca2da076db766399f07a4ba9b4e291ce4ebb45247e0879b10d6b0a19344e65ad4b68475184fc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1184700b38805717162fd8eb98570728e94e1d69bf2f17a904264923904b5e23b257b4f4aa591205239b696237fb3d9a1787aa2d972c47529486b9a47b76136c6ccf73a78b3c04938de1da676befeb8c12e0346b7baad6f7781b6de83876fce1c06e304006c7f5f29425bed8b063420f0fe2bac560eeec08cc5e418e103a5d4a682425880f6f7aa6c4f19abdd0aaa24988645d00ffbb813497720be270d2fa65ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc04f72245113b62716050c7417eb81c66dd8b1460d05627d683c3c3a50a2ee3b5ace784a5112f602ba4d0d55c8d47b9f58ff462a0a0d0f1bdb3e111bbfbc42fc85215ebb23a45fb555483827840ba84619b643c8c951ee3948f03bfa66dda1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89a0621c6a1237d5e0083f81f775598a85a3ea54c279faaefbf20811c74ceea5d237ac4a5690206981b4ede23e91cb3e799c38126fbb04c4951bbcd72153ce4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3f87d679e4e87922a0eee489ec20a705e9e568dc388bcf757e70cac8d09ecc13b34cfbd387b92a08c4d8d1292f488d73a430928e4a49f7eafeab4d76b68e33aa01\", \"d53139ecbcd5420e03cb5a1f62a039f4613fab6145a39447d28c04ed572eb947c298e0d9527b927af004c454ed9092be4cb71da7a0f5f170107c45764c2a8a9e9b30c4583c48e7d1f54a1b1bfe2f7365faa467dbb9ff03c32cfe99284219a26e53765b32161fd856e2f8b1ebe52296add06888d17b4565e0b5d7af781156c923d4c3b1ec6c0c5f8975fda0810a06148160f6f4c12ea90581c7ca937aa1421cb7c94d66f7\", \"75005a3535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a2ba5a883535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a26e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936411aaccaa2f00a161189dce43a9cea795f36d9d70d3e1cdfaad5740f706f3bc685a95c0e3a9be06cf58146b3bc5fb1546d7d0e3556502e189d50862181eabedb441369121629d451605e60faa82fb2587a97364c24cffc54a5e52e827c54e449ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000344c3dd851e2ea42f02204f30463dee20c8e4ec50417a06167139b8316877a824c5b466720024622ac5259cd26bec0d05da102db22ba7095575a2ab0833c096ee80c64f88c70fa9c5a569bf63c9b21d14468486491ad016b49487ac210783ef738a473e1ce637153c37c66e2de294c34f551d3bff138f1251d2e0a7f4443f8c56f461f998bb42f4b3acc72e9e53e57f8ec81f342eb5545af3272b690b5de07643a69d446fb5445fb7c454993ad958ec703cba86021ad80fd977d224cf36b429e850602eccaa779cc00b8e901390d0a3f36f43e636d45368154c7ae46fb231fb7000000000000000000000000000000000000000000000000000000000000000028045a5222f219de8ce4ec64d59ec454de0c807af9d7cac8453ec4ba2c236bd4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb9da65bdf156bf72fd39d7f8e5752fca9a112277c8bb84a4f0c27644715f865b557a5191e283f21ba9e21731cfae2cce5fd3871db1cab1b923c6441195a6489a1301aa0ebfabd684fa6000ff7d506040276a9f980293b4f5e1c25cabca2dc3da0e48c71b991503486333f3fb9d1d772ac0a752ba97864b4c8f30a08d1b9986cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6f7dc171b51f4e47daaf698237e670b847083a87634e77718e24b4a1464ae516fedb2e1e9eed857bc9e29f3169583d6da8d59e2ecf81763b37dc26cc9770bca31fb6945707df739a4b83934d90a1dda4122bfc99d5290237e4cf99ee4802f6aa07f773beac71a24828b1c2bcde88987adc1134896e30412787c35d1333060376aff0ea89d2fe3642e776371bed5c0828903ae0efa314eefdba81558a852d8b1363f3636a73ee0d5967e2666ae2d9417538c99a277c2f2399c9ca2da076db766399f07a4ba9b4e291ce4ebb45247e0879b10d6b0a19344e65ad4b68475184fc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1184700b38805717162fd8eb98570728e94e1d69bf2f17a904264923904b5e23b257b4f4aa591205239b696237fb3d9a1787aa2d972c47529486b9a47b76136c6ccf73a78b3c04938de1da676befeb8c12e0346b7baad6f7781b6de83876fce1c06e304006c7f5f29425bed8b063420f0fe2bac560eeec08cc5e418e103a5d4a682425880f6f7aa6c4f19abdd0aaa24988645d00ffbb813497720be270d2fa65ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc04f72245113b62716050c7417eb81c66dd8b1460d05627d683c3c3a50a2ee3b5ace784a5112f602ba4d0d55c8d47b9f58ff462a0a0d0f1bdb3e111bbfbc42fc85215ebb23a45fb555483827840ba84619b643c8c951ee3948f03bfa66dda1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89a0621c6a1237d5e0083f81f775598a85a3ea54c279faaefbf20811c74ceea5d237ac4a5690206981b4ede23e91cb3e799c38126fbb04c4951bbcd72153ce4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1878d0c6c90056867949699c2702dab1671a5739",
    "content": "{\"tx\": \"83cc59aa02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bca010000003af476dbdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc6000000006aef47a201686f3a00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac94020000\", \"prevouts\": [\"5b6a1e000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"26871f0000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_81\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"410a83dce0fc1f4b869e6ebad4e96ff5ac038efae48abdd4cd1994cb17db7fd9bac8a598e83f75fed7e9ee950253d942154f170267123240e9fa4e1a842beb9c81\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50f58c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c927375cdecaaaf14e52c715c3a41f3b247660f79b6056fbedbc19d4a9bf647b1637af0ae2d7c36993b6e16338c0df4186c54449bc3ae2912851b1889c01bc6881\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50c8a20490796da18231bd891dfc9ee9fd3dd67e5b30c1a68a6cee31aaa1336563c6ca3d54708b8c2b37edfd5202d99de398f9334228717506d47758da2096d2044c83f25dc7e9130a265932f539855bc55287cd589137c651df4fb02a89d8efcb8dfeb713325eca5030f8fd265bcccf417534c9b9798622d197d365a1399abdff9b863e58d4a947646aab8a203622c4b0de25b3350549c5a7c4b10510109688e65ed8759dd8c4d93ab0abb7c5f86c136630abcfac7f01ddd48edf843ab9d39cb1ea46cee32b93334e12ac9ca566197b98deb2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/187dc420ad18b5fb75f0f40dcfa22e824b23bbd4",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be301000000fb36def3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb301000000e6af33afdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0c00000000754fa2b201d3161100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac7fabae57\", \"prevouts\": [\"c6bf250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b787490000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\", \"1205240000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"167d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936394c54942360201b0e5a9c52bdb8553d3b85213f639fc7674feca5a4529f4e0b46c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa654bbf7a6388e898988522fa7e5d2ba9e6951646cde29fc617f56e0c3d8e4d50afd13a3b2c4c421c5355668ae9e4eec8bcb7618363c6e35efd204a43726d22d6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a6552d9f0078438d40136d7ff6a38e228e91ae2f5adfdceb2d12241afedfa4e08719dd3b5606bc946287d150a5ecd03b0f8e892d08bbecd28ea2e3769111c28051e3355b9fad1d20bddcd1a8531bcd58c93c4d9ee4159d68db4e08ecdffbe17e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/18822bf70764f3c01f808cd81031bdaa811edcaa",
    "content": "{\"tx\": \"cc2a29fc03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8901000000c830c9abbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff100000000746406a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9601000000bd8ec8fe0286b12d0100000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cc349424\", \"prevouts\": [\"6a2b66000000000017a91408247b8d3db4e641d0be1ff23f14280256870a5187\", \"2f55760000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0074530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"1655142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"af342baa3fbdeba74159cdc207a6d6446da28746af0ac0b6527095a2a1df2747abdeb989e446aa880398dc744c8055cd2f37976c5b7311f4c6e1a3923216225f\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/189034044dacfcbaac5a98bbd0a33a369683d2d8",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a300000000afc78ee1dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8a01000000bb1633dc0151876500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac867f065b\", \"prevouts\": [\"ddbc100000000000225120ce3551521fa9f590f4e3a432d6c546446f0d4fa78e73ac01749e3c952a57623c\", \"8fb85a000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e89ef9cd6a14ce137a122e44e8f156230f0fb36a7fe792c664bf4e947afd0d0d697dc42b4471ab4b348f61a8519e7390605ae60b23b14c83a0c81e8115296ac5a9daa7733b3a0feca8343c80a0c3c55f8d113c6a90832209384961aee83e5fb322f0c412ae0e480a0e0707a55e4833d5281a6bfaea7c3a8d9b18cf36ce87fa1e76f9a5770098d2852721ceda1096a092df80654ee99377cfa92b424ce5599d0d022227cd4614fd76dbd6efd459f367214a3a2f308eee0a22a6e43c41e4660239b960204c9abe9ba77eb55dc371c7036b245a9820d0f70682a2e60dc8feb8ec9c2a0bde27353ded2adb1ce2c4644b5a013c9e428b2f4335af9efcc4599029d88c8292161d7eb7a367ec859fdf8e801e8083fcd9b15d821f023eb2bb5d01305a17d85e88d8b147012ffa1ff2582a65fed1793686d8c1b1afa8124161d33e42b897519a76fa1093abe812c7e07daf6e205bd6a41b53dd0612bbf1e860c5383ffa04fde77d9cc56ff7b817061652f8956980c8a60cb14d6d80134d0314a69a646d065f8c540b2c1c5a928f11f24eb7dc9d501e0082bcf5c77f09c27b2f0dc4e98f18c8fc9203088ed95b3ef15dccfcc0099acd050b21e95f2cadccb7506a30d01d8ecb1ad72de8513c9947a1908609df03d7509f01011b85d5f3d033203b8e0add3a1d42dca2feb1b8cad341805d8272faaf7b9f788fe592f0dae7e5ff72970453bee2e027a13736e8ab3275c0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936276d389ce3a0d147c1239f614bede42df56e685272932fdf5fddf7ce36575c5f1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004500c8753d4e6010499b58065b36892efcd9281a64e85ebf7c5dcb8f6f4baee16c3de843256fc2f72424a897ba91cb5d3893aa03eaf52af3ae765db300c5c19165\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b01c77afa7c0b5bbb9b76851dd5b0c4c1291b498150c85d5e77a5760c3c53238768a50eb44fe420f0b709e8cb838731e8abacd0742575f54ef20bd961caa30534f889de0e3322cde7b11b680bb1790cdc3ea2af04982d59d205a600f9d1d9840b7a5024b903073603cdab268a22c15c0afa3a3346364622c843f653ec944cb0f0be9a87541087e0cbbdb2c3fd8ddbc0ca3cdfec638a3a2c4b7ce3c0d1c17259719b7fd78f7b60be45e8942c155728b6f17c028130029eeae1e396b4198b8ed01b16ecdda8c8440aae1795da4f24a39d60bd80fc514504bea4ab1006537aeea72a3c7fe70640c96c3544dc04ec86cce64e29e8bc31783d3dde3b50669aaa1f69140045d8403e6f20860dbb3437be037484e7e7f80c071bea3989fb569489b122a37c12dd34042b81eed66a9cf5f4ce551570c4fa0eb4df0252ec9eaee5bebc884c3450ba26cf52a27e06e9f074edc1eea8f9ad734806a1ea0ad3790abbfc6e50a0262054c73cd894b8f9e608f8e354d14d86f713a2d53e9672074471d9a271cd9fc14530b764937e144e4ec7a0480276c1f49d63cf9a968d7034f12ff75f4926d1ac2701a2eb8cdcf7134c8bf554729efd1c66bbf0a1e95ab0fd5d961386b0e12ef7813f5e9f9c62d3705cd23bccd9c150506e717ef3847316d8f6b73b11d52030d798e14177092cfc2c7f1bf6749d8241110b42bd5462a881b26a3463a1ef7c83668f9d76c9d7e0f977561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e99c9f88738a88b3aa0a4c3963e818c9517aa5d4efdacba58fe8702f7dee8816fd75cc9ac1e6f185878d252db6c7bbd874f5ae03fa9961d4f4a0208503b0750f17ad4bbf375bb62f626ec8048d4347cc1eef977780228a6d2fc47294088d561\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1891c772f3ce8c760b0cf1b52164fe1d2e4ce605",
    "content": "{\"tx\": \"db2f843102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1c0200000066a63388dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1f01000000bf6ffcb001a26d3d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e71019ae4b\", \"prevouts\": [\"a799760000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"62b4510000000000225120db9ddec7a132eff6af262a32a64079b83118332a0594bc0106395f5efc921419\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368ff9558f81ce3a2dd7306f2c5fb453fea421a50752f6b7d85ff2868f6db9902d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a11616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1894c4ad4a51725e14a4b3ca4124be935f442f98",
    "content": "{\"tx\": \"861c712d018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fc000000005f5df3da046a193e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acb2ca1426\", \"prevouts\": [\"23a04000000000001660142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"782efbd86b045ff3423e869c9ff729134d2e2d6d42e34893fc9b54481a272a287e205fb3b5b7bb34ba9e49ffb3340109bc34e99ed3b092d8aecdf643e6de7a31\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1899c6c029807a2b6fb9c8709343768c03f3405b",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc9010000008569c1c7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b05010000000d6c2cfa0347939200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc5000000\", \"prevouts\": [\"5b906d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d95e270000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_e3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7132d2bf84d4c67ce4b2b563bbeb1047587933e3d039c6fce4c818c47f967e8d4fffa2803b3b989fb1e8ba8e6499a92cb8944ffa0facf983d1fb0bd7a3408a0302\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"69c2e1924b1024f6abd8959b5bd5ec07801f72f9f880c60cf36d8c841d967b2fd8dcf8e6f4df839bebe8b1620915a04ec5b60674a1bf2c783ac8dbdad2ec303ce3\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/18ae04d1c49da35415f8e30e1757321ada62e83c",
    "content": "{\"tx\": \"e0ed141303dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b93000000001fcf05f6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7a0100000091bd69b9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc8000000009a4857d5047746c200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487bf000000\", \"prevouts\": [\"bec22800000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\", \"73802000000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"8c967a00000000002251208560e60ff9f5f50e17abe0faa94b8704db3bcecc7cb6f74a11a752b4bbc814f5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fa4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a6765b3a9293f3bfd6c3b684051ad5b8ba6e731c254b25e3cb8e354d60cbb2971a4e7a29e9a68a1d6e5ccf500c3bde1b862f2704e441e939992f2bf5a528056a3bc3f3b627616b9f836af78c18ce00964f5f9dce3e851898685189c72823645e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52fa\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08226ad4257a22b62302a767a5b8896008d1af7055b6fcc30f1a04cbcad06de5cf2f8b8afd7beb88d43ca6c6d2d58dc9425172bd95ccf582b2eeeba83616a9d27d33bc3f3b627616b9f836af78c18ce00964f5f9dce3e851898685189c72823645e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/18cd769c18f505e8bc05856ed71e114b5bd9a022",
    "content": "{\"tx\": \"8a55f3a20260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127021000000004a3d07fb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40e01000000ff9e6bf701948e070000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7fb010000\", \"prevouts\": [\"7a301000000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\", \"1e2442000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"e67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d518f5fcc4dcd317f656293c43c0e8e59e06b99ff36e809cba7caf0d79972dd48256d6f90d235a6ba3188b640209fb1b87a6d8106344fff793e748ee999a397d93d03784866e2fdd94d7d1b7c12b1f0da96746c05c19b8696f0ac6a701ba8135\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee92d7728fe824bb86fbd19678fc348031552299afe2faac0cf612835804e2a859ea19512c809756aa5c58e4cd3562935caab0c2ca4eda8db33914ce4decb3cfe9d11a7792f25f0da70e8485da42647201d1062d1bd001b767f1b05dec6877400\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/19056ae532d1819a4355eff6310ab655a5030df5",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfc01000000e1fb988b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4080000000022028f9adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bea01000000a94b1fb4012f9338000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748777000000\", \"prevouts\": [\"30532100000000001600141cc39a492a6f67587324888ae674f2f534a7639e\", \"b5243b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9a341f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_fb\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a98fb395b3493eb836bf41a5bd15b15209c6528c74263544e6dc96725d7a28e1c7073a7c1a6a9d9ed2651cb1f2b5c7b9712769b98bdfa4efb2162bf9fd3d6adb81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"88b69aaef809e7d03af8417a443da1bf0f7d36da0ae334b0d1b5ab96d960d3fcbcd630dbb9ab3ac6788a73002f8c5a40c64356a9154f83a07c3dbefb07e0d41cfa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/190cfc23dd00d10a83315e6bc368d40445cd322f",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf81010000007d91abc060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700400000000377d028060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270550100000075c420dc03d8f996000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4876c030000\", \"prevouts\": [\"daf6740000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"cd0112000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\", \"923912000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09028598895956c3c54d60141d7dccd3ece136a9ae92e7de806483a046ec5e34a65d7fd4877d911c0a50224968dbcc146ac94bacdbe51c9b3a7dcbe60eb8cc167df34d4dd397489a39ac5c97ea7af8c1225cc8b2653926d9c1fd285d498d62fd162b8c59de799db2895b669387dbfee379a1209b1984b7596b30f05498b9bb919fac74acbf96a1a2ea5709cabf24c0e60a289e62a824c7a5aab185ca8a28a8706ca2b26237be1bc60e08d1d11d299e800c971ed2ee84f4867e7f9fa64afbdd1a4eeb3ca60b1c5e6fc9eb790c541f494938d512ba82982d4d52b70d02bc039ca381afb245f90148055275b38158ec782c20bd308f1dd35b4a3a2826c2daf93e9726ecfe43b13e4c67ecf8a129dfb73d1b94bcbeca814e579540af62b78627c06ce53aa6fe82b4e10b640193214ccbb63f2d3399884216e1cf3164d4e06962f26e279d05f7e91a13d3d5a7d0aead0c0741be2779a2b7f04e403c17572e56721877d58676133a5169b4b6f8b450d22d77566a6d0803f42541ee336606b9c09aceb61b85e001c979ce04470415900db581b190f0f772c500964d7b6b4460db86430dbc3f5bcf69ac09a50dbb03c7be7db156e32bbc4cbef91148fc0a0efb5ac44abffb400aa1afbcf0235208347deb7205e40dbcbdcdeacb0520531ed6c6e96348b641df1252b29e3ab1055a94de18d2da7b8023e4961b0d913857410f2d91d5559c2cd5d46520acb2c30d4a6c75d1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e2640f3481b4b8be81ba7985476c68570d9a370e915b621c48db5cd673c6aa535c55ad82284641cab824687b45d4293ada5fb8cbfc4ac19bcb5188e4cd0a7708cf37d2bf9ac9d65f4f9542d60f6497573c04b4d7313f44a5c611386102890a1c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09024e585a70f6e68623563a521d3ab6d70962de4d06af5ae6286b424445e12893c78ab47c79061d477e81483f9868d4b19902c6af29bb24f8ed5fa6472812109e5c5864796d7e384064a8385264d27c4264fc974cb1ba069899917903c5b6a0d13380042c8af67b33f897a141c6a1edb55701e4d043383f844503bf003d2613c6ec35467b64579c80e51550306db99f472c9613b613aa374cdd7702f49d45ba89dee8a87d6629e4ef7193bf9cc9bcda479effa6426c14dd013a04188fb73c589c9190113d9188da7697b8290b27850f64a3bfc3e18afb14804c69280a3a0f384712279a5ae70bf59fcf17f47e31292632676c9daa3e985917adcdf7ae096398e2782d0a4370c9451a421b192ae396bed9e1c01b1e82eba6624337316c5fa35a955b0b0be26755cb8d76a3076c9ab235a2729324c658f42a3ed1a81b5263ef058800d48843469ebe01658e24b75353e695d79386994b540eb5e3777acd10fecb066b946ce01d4960215f029fc2f5bf320731144c1aeef2ab2d0e53f5e169686f399dfd1947dab539a0664c291d6876d8cce162fe1c5f908ce4954dfe336ee45f80321687aeb9a947ab8ed79fbf91bfd38c60b553dac29401a510e8869df0a9376764699ad7072b4f52c92977044210ae44f2b2eb928611c6187e1b04d595b19f187b4bdce2ecffd6dedd1fbb649a3a89b87522ebfff3df6aef88c74bb80909946eed489c7c7aa8bc3cc0ca7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5172402ee5f7d01023de35bf8c020790747879409f1771ca1b4a9af174b095ec7ee5aa467dfe2257bccb94fb5bf6723e840de90a3890266560a9e3d72c84089f55cf37d2bf9ac9d65f4f9542d60f6497573c04b4d7313f44a5c611386102890a1c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/190dca39f195f8973c60e414fa6fa6aacd3d9290",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ed0000000047b48efbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf38010000006d3fa388017bcc44000000000017a914719f78084af863e000acd618ba76df97972236898720010000\", \"prevouts\": [\"ee9241000000000017a914a4e57198280c195671631f8b9014214c2f083b3c87\", \"da80710000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"f2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e148eb929e36bf5d0ae927afe6ca96e40c19e477115e42779571d6d91d45ed5d842c4c20f1fedac94edf4ee37dcf580edabb0aa4839378386ec3447d53f529f2ea2726256ae6b84713fc66a1300a8292dc92aa88ab82f645f24355049764a6c4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936724f9d0df23615753016e7eb8d62571c0b8a17dd151f7df09f79bc44b2e134251de3578bd50e4aef3f42172206e28aaa53f32c3941b8b4ddcf806814652917426187254dcadbfeb5c8509faa2902470872e97e8359524e33e4df3f76314d708e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/191602968fa2af7edef6e40a0c4e4b9e4ef4cd75",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6401000000c77854c802ab2882000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7e82ebc5d\", \"prevouts\": [\"d461840000000000225120d88cb7f53f02fa1c481625f74693a34411b6fbcd1738e3c4eddc22f3e1da8f8b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936276cdcf8aa7f00f9cb895dc6486b366e3db7f84b06171b90b5a70246671bc599\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a48616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/194da7e8add6b9a1ecf41a75f040b4611f016a09",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a101000000803b90c8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b990100000075a93d6802b1c933000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc772010000\", \"prevouts\": [\"139c1100000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"5f092400000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09028648441159ad2b9d233f800939add1a514c20ed91caa7d2e987b386d685e1d731b58440102d73d177d22f69af5cedb0c49176ceb18d6cf779c1791a5356643889976479b3f3c1c5ed6c0961d6e45617e1a5df3fc53f4ea77bc230facf738c0674f96c5190d6e8cef9371621cb7c4ce9655b947b129caba27823efaa16e54b2c9fda2dee8dd1e168c3fb1a71430207b808b2d987ff11a7bb1eb7aa232887be85514f5742376ac568d7081339fc11fb4756aa3f0d09cd3ca4c6bdbd075b11ac307d49ce466991a48d73cbb7bd03ab1a6f6f6c0e443c7d45c28b6853595f95f9a96113f600e4696ccd06f73e49f563ef52150c7097fc3dcb09164707ae72cfb212ef2a5ede2992dc7fec07184cfa207b3abe85efc42350540a9e0e1f5a0357705e204e188b2cfd081eb9dad8338c823cc5a6de4ea06c79235feb3502e97d463fd2bc558f78c4b9338e537ccb3b4991b809f1b07c3e6017ef9d5f4111e765bc8ec4a8ce81078f71dc56afabf8f6152034824d09c621bcc60c9e4fa2762cb67486e7d149e357d6eaf7a3efdfce693548b3348d318db5c541e0a5d8b546bad75c15334c5f00e89e15f899002fbc5818a9309dea1d7f0db786cab72b6da3bc3139e0135cf7b726f76ef0bdff0d74a4d4ce9ca29669feb3eadf3f7cef5fe7396b0afc3230b9091e235da3a9118008f4a96c11f39851d5a477cffecbfdddbab8f542ab7d8ea787880c52e6b4fb675\", \"737d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820f3ec5aec6a85c1ca54f3417a27e00c281f3765ee450a46261b59de169989c9a702c501a2f323d94577f3c4b353be8e702d3f9991edd341efb02c3132264010bb33a63f37675deadbbcd666ca6b38ad7090050f3dcc6bba45985e955ec185c53\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f8efa2bec798ba64b03a5a73e1ee4e926bf8834987fb701b1bc07641eb1d04ef82a3c3570314e1c487e3eaf7b61b9f5d1e54f66bb2f64071a4f81bffe22ecf61f3f4ad28ed5f3b19b8b5fa19149e35bfff473490f5a2ff09837295014e3b5992155349b58f6ae6ab9a3af1900e52295358d36f12e5f9b56c8dfa5b240ef0ad8a9103962c35efacbeddd5b0ff277c1f2090177411a5906c1f3831782c9a9da9f731f43f6955a8401de9fa99e1c10e6c2fa0dc1954dd6ccf16eb5d6f3fc841d9765d116462af996cc93a11f0428d4bb7fcdb283545cea5b671243313d97bf972cde25871fc92c077407e977135a83531cf74b26615fd61f6c82b1ddc3b16b0ab3309e20bfff864e24e38d1fda3c251233990a5379e82c6b9a48e3b97a2f0bc0262697979971378a5a83708db3ff1cbcec8d6d39a4068510eb7266d9a23a97a1b66e131127191691a2a81008d71ba85351e8cc6656a41d3033dda07e9c51b8641b047bdf8901a31b13211fa4a142f54d6c9ba7c1862ad8d7ace338e8a6a9a8640701cc50deacf8a62ca1d4ec9f096d8abffc79169cf7ddf4c733b93488de08dce3bc7e5c30ab1312d89eef609c3f5d037a0f3b0d14eb0cdf2352d490724c7846ad55856d161afe93de2b67ea373f02daec657ae20704960b9c1e5f6293961892567257f93007cf8085c87c7b092e1e093b3f994d31fc1772384e0439101a9a50842c10e4d1853d3ebadfb75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936349dae1e17845f77bdf4fa0e5359f29aefe32d3d88495b84e8b0fa7ed04ef515be4f7cbc7087a9eecd21f8f9de83a71ce09520dfa28ecbf12e6edbc22e0d0c39a8cadcf9bcd23f9249fd09eb8b2b9ca63044a0ccef58f4cae9402f6ead4c2071\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1969e36c75fe223b6de50a2e92c6ce56dd4915a3",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1402000000d73d2e948bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4200200000097ebd4f30302dd930000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787ad30a625\", \"prevouts\": [\"a81f570000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\", \"e9523f000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"1d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dd31519ef42d9a07de8d84f40740dcd35a5a7ec542cf980ef798e38719a42baac92cd4ecb05acffc69b3cce67f0fe15bd50aa9f87096dacf733b4583e5e3d147ea37f54c31b0dcd6e392a972a33f542af4c40de53091de86bbd5587895c52a53\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368c90fc6b4e29557b0ab9f594980af38df75bea42e763db152d9bd27c49e84296422ef55f7568e8dc283b8fa041d75ce76b297151a0e1c7ebf12f48a20b112ecb6879334807fc224780ba3e72651a115d27f4d0acc1c4b651ff2820865c4364ddea37f54c31b0dcd6e392a972a33f542af4c40de53091de86bbd5587895c52a53\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1970570c77db050bc51d853165e59487dd05c1a7",
    "content": "{\"tx\": \"b940699f0160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706e00000000caa6f69504ef1c1000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388accd7d3e34\", \"prevouts\": [\"b6ba120000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c94c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900453bd2bf476d5c79b80d1dc385df1320868058b4af6871225604d123c25805c1374cc0fc2e3b1a564cf058e89401e888e3d8222f635de2bcbc595bfcbb872403dfb24737b64a51a2c518aa096a7a1ea5ca18eed83cdd20aa73c19d83535c466892\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52c9\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369456184d2f43385344915638f6d037a1adead7f216e201cdee489bfb57cf83ac4cc0fc2e3b1a564cf058e89401e888e3d8222f635de2bcbc595bfcbb872403dfb24737b64a51a2c518aa096a7a1ea5ca18eed83cdd20aa73c19d83535c466892\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/197071c336e5f96eeccaa2d253d5c00e0ac7febc",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45301000000f58a3dee8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44100000000b63cad77dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bef0100000079a1743d0344399800000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df979722368987ea000000\", \"prevouts\": [\"8b783e000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"624c37000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\", \"3919240000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d84c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93602817a41c51ca033292e6ad0865adf1b315ae27488bc31b0f8fb3dd6e91881b7d7b73fe79aa50781a03db77b9e22252058e372f5a0275feae864cfaf4c2a217ec513aca5799d408eee0c275015e54cf6f255f9c56741048ad8672ad33d4825d8e26db4ec4cf8c6a12d3bfb33a6f8c1ee971c26c5be04413f1d9dccd7296a9839\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93676a870c8d6d66d1892dece22bb0edd2c674ad3f2fe5a056bace5d4c57bd527fd06f18ba19de64c771db55f5af06ee3412ffaea1fa921290752d742eff6a1e67f7007ac6d9f1365651a4d55e6df0dcb109d268cc6c386b355a4997173bc95c886\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/197a3fa4a03436efcb2a86e1f8cbb45de1371615",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2a01000000f6816db38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c467000000004c8c3ed5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa300000000092b0a9b015b3c530000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7962ad43c56\", \"prevouts\": [\"4e8f5e00000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"562e3e00000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\", \"81d36500000000002251206ee7f50dd8b37aeb440050df10921bea288340730b764e02d5c3920c65efa447\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93600d8a7d3ba54fbb1fccfd13258af4c0990ddaba061aa27cca5baff13fc191a16\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aa0616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/19928329d12601dfd9c4a12541e9799fefb5439e",
    "content": "{\"tx\": \"0572398202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b01020000000b604692dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcb00000000fbc4aeb20342553b00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7fc57fd5c\", \"prevouts\": [\"c5281f0000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\", \"26c71e00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"f87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac319c7218672eb959ddbc260878b465d5507ea31f17efd143d8fbc0323ae2c89a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e5422b6de6500db2bf907e4c5314ebb405475f57406f25afe5ac62a92a9e6c58b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa9b3730ae0e9b8e06af6fa3903dd842ff49b91f4387036eb6432f756cbb46a1de5422b6de6500db2bf907e4c5314ebb405475f57406f25afe5ac62a92a9e6c58b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/19a982b7ff350572fab07d8c7397bd3e8f2cc04b",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1f0100000024be6dac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708101000000ce3435b90165bf2400000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac4f45d043\", \"prevouts\": [\"f8be21000000000017a9141582f8bc3490e924b143f387e99eced40303eaed87\", \"53cf10000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2355212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"39c95c28eef2d86ff7f805a2e33b30e4b9f33c8c4109928d9a3ac762aad41698a79804c1f7bf30b80dea6d323e1a673df445e3797ec0186de2c1c550eef58e3d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/19b94494f911d6c8dffa42a0570e686d8d385d0e",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4c00000000274f8de6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdf01000000f39357ce027462a30000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e718a8883b\", \"prevouts\": [\"c63d4b0000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\", \"7dc45a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_c3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c1db5d29b3f8836f14c4e1bc3d0c1622dc9224e69e259628e048e23338b334879f8c549e4afa5134d71135b32178095dc092369d1573aca294815119234e7eff83\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"29682f6d3d2cfb2d0ef2a264d5b95c3751b14f71a85f980f49a3ff199d52927a34ec170f44e72cc36a16246d37edc0939f1c1263a63e5b122fa94b7eddfdf41bc3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/19ce749d29e4620af1b8364a70b233842f7e9d56",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41d00000000c6f337eebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1f0000000004cc6ffa02a323b300000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df979722368987074dfa5f\", \"prevouts\": [\"ec8d3f00000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"768e7600000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e19aed6a34821d65edf69e9d12354a87f406d02be059705f92363392a057792142e401215e29d5d13de3b6ed62165bc3378402ce71158bd1208562fc299f33fc22fc39b3065f81e3c179a5faa7416c7afc60db6bda904d6a600fd6a7a1aeafb2cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a0d0ac5788f723aceb0a237bb228183ae381a676877b38e9861fc4f2162de386b9b4175db22b4058fbb32c1c98b401bd6f80a734567664ffaf4b869d5cecb8c8be9bce0da1a8e0eb2f55600b1edecb05394963f1d059e6505f0ccee9d28b62f6faffec7faeeadfdc2f9d17b998c1a9153f333fbb08a178932d29a7211446b62a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1a199a3cd2f3a67e25e36bd4711b535ae3d24e31",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c200200000056d3cc57dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf501000000a74f649460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270020200000040bd4f300326debf000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac82010000\", \"prevouts\": [\"1dfc5f000000000017a91480e36171416c0f598c1c20ba17ab3a3cf10a438e87\", \"34075000000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"95c61200000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063c868\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb470901b40dea8c7a5ffa56ebe32dcbb2bdc70f6165f45007f6a309c26f1d76d473959a095ba405700a8bdcb88c47f737d45523ad768f5b3698c80add34f2e764b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367895634d85db6d6be3323c51ec5b22c423c1332565debeb0f270092a59401143da069eb8d814e8e6c846f6346fa512368611d0ddd5fc662af48af9436c51fa006032c3262f8d7c29daaf8f9846bf0ed9dbcc4a0f9aeeb7c8ab8b4ceb985f45a6c3d30bc3225049ba56ac02c164836762858abedae6e6cb81f8117394fa9e456e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1a3a8c18a8e82421d33989ed4d05f5485999b0db",
    "content": "{\"tx\": \"5ba8d15b028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b100000000a28f43ffdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4301000000f4d3acf404f3d25800000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87e490d753\", \"prevouts\": [\"4153340000000000225120dc3b17a9e97101dd89a6713513f87d72e341f4413af90c87ebb03089172b5d03\", \"e38a27000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367e327090cd1d58a7bb1c01ec2add8b9e55662aa07a105e387969c68210862490\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a68616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1a83bda864530d8086caf59fe1272ad5768d34c7",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c496000000000fcc65bbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfef010000009a2231fa0450179e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47870d661d36\", \"prevouts\": [\"4a9e3b000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"4982650000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"4730440220551b4fac1e931eb4709bd1c9ca34de6fb6d354f2ec95f9b5ef3f19c6f20ad5b50220408f74615a963ab5cca0811ceed7b591b242d5f6c2b7706b363b88e2d2c8b36082\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402203266799c0aebd4129cfc3391cdf081f407db3cf6c5ae353980cd281c1260041f02200a82cd1c0863b4a2e66029e3418e566a916d04ea0c87c504d1356a72bbf958cd82\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1a9368b5d21e42219df4751485b7f522507fdefa",
    "content": "{\"tx\": \"73092d65038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46c000000004658eea8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa401000000a7b39fe5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c450100000060837bf002397b12010000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a60fdfb23c\", \"prevouts\": [\"afe43a0000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"7ec5840000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ee20550000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_6c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e857d2f90a5bc7133586841afde07b1a8a3a411030decc4660825e63f7bdba2ffbe49542633f455dd76988ed20b444f8fc57752c36a192f59b5d41ac601bb60681\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ddf64ec469cf84face0bced4771ee35e04faf554c70568f2de03eb420512c85d2e63950c2e2eb0d7a6bf730c367908d900afb6b3a94fccf5d131cae1f7d985926c\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1ab6d3c20509931b1abf61a6b45d8069679b66fe",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708300000000a2259fc7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8100000000c6f72fe102884f91000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87c8010000\", \"prevouts\": [\"1fea110000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\", \"6e5c82000000000017a914927d550e2674fb9e1f6ae1260d00989fc596dd7f87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090274fa3d8b77f1bffd12d3bbf2b314c93c392949ea529f39c5e3c345c5ff1112b6dfff2435d46796fc34bbdb9748d6736c775b452b064088344aabdea0cec8220b3764b5e34edb61e8405fcad227877826186b0f73ed74abc7405251b6d62ccd0ed2879c1b5aa1d93a3746b70ee16ab3bcab6442e45b3737d2220b4b2a5527573e1fa70d3cd4f839af1c54bd1f315a2e73ea46d58fbcd75ede8678b6fcb2131e036c8dd6c3f17268e6e23701026672e35d450313a4f00f0e6426683b345211bbdae5d4049b90b52eacd11729b6f977029129657df3b1af967d3330d782834afd8ffb8d4ed35f3ab33a8a606a2c3e6369546d25c83523ebc19a8ea2b53375d5d46f5bd51aff5f7de980568a079e8e461bea7f561c8ab39327e32c6405e851a8f525de98119126d2370eeabe7cc093ae031c60b16c86869916be9ffb2b27bd565f73468d134b358fc7717c32777fa07652d585fa096bae11c0121fa1a5ced8339b0c094f605740b0f7090b3af7bb4b4f96e4ef01aefda18ef330b370f32b2323b752df75923f2dfd9759798a9750a0502df4bf8953baf334d862edbfa492de1913dd126f9ed89f82d7b40e0ca3e4acd3ebb779247e8ce4fe06ae94c3a556110605cded8dc3506ca1bb98d7ca853856189069e6d1d818dc3cfd8bd18ba08fe8b7b9c9cdbb05bd9ae2c3e77de0e9a6b311e0175dc92631ae429c457e580463836ffe9e2ec233477aae46085d75\", \"2f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faa9cca9c712bd5dbc651b74ba1f32b079db60a81520e454f56bdbd9ff2bb730ac4a68514c5be2766b31ac79cb27b74c816d51537da76cf4fa244470107a7172f8ed6bb91bf977e9e370b444e9d5512cd4ec7f3694a9311c01272a4c1a167cd930\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09021511def2d2d06019a62a38430800e7d0b9c29ab11904b26a197189f78c6a7e53c20b713823cee88abc75c1b34db860499af0cf4954de25cccdee355137e49030c67bcbc204bfabafb47b93c03a353f3e0fe516b5e28386149ef94f0bb8051dcb31d6614a94f5227592cc93756115cb908152ebb46dfa9f80796f344908a760fca9995210b89ddb932c11569d3d509abcf7bec4ee2c224267d82a768837b9a559c2c13ee9e83a088d5547f50970cac6029c0b52970c6602e17b5483a6399d0c0ecfc3fab1bd43b5c1084bc8503e403b43dd70533d2b055b85ea3b51c3da0d6d958c0ea6438095e66200a0692c8586da0db6b084933f2388e8d0693521b957da46646acf53f917bd1376bb7585bd3893e5b6262b002483122892c53dfb5c59f5141d6811cc913b6f38df2380a81978785149d036dec7612602c4bb6a29937d1d21d13c161fd1a5a1036272834f9b89cea5a912b9978a848288f6d4d72f0e488a3e8063589e3f4eb49369c72b62a42742ffdb440cd12591ea2164684e2d91c5a9922ea55b156a0acce65905032a2b0dff9d8c495347eec48bbb08cb6b066e8de6e51febbc34bfbc923a5a73857d59d1392f492217faa9561b3b883068cf13b80468b5318dff5ba2266680746f499f4be31e07d43813462b9ce55f09aec147354c53ca7b47b5c421ec1e2b83982ecc6b73f1c96122e9ea2a52dda230b4bcf9c2a088c7d4e23fc553304d0e75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369dff55cf6ae51df43fe52c7d0d4fdbe30fa92730d4eceb3c6abd9d09fcc7ef40d8fcf0fa02e125fe1892f3caadd01fd66f2ae3104b90b9e35e4c43083bce335e4e9031d393e93ec4f3e9da8fc51e83b82f31256dd96ef4af94581a47eb5c67bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1af45f5f9b4d38fa9b4e939f3e3622bcdf2d29d6",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6900000000d4abccebbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb700000000bd7983dd023b8a89000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47874aafe95d\", \"prevouts\": [\"0bac2800000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\", \"09de63000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"5a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936648f7288da451c6edcb2ab904ab412d7719851ebe4c732831d3fb8a1e081c682db79ef349d3e4f05529a42271c6cf93f8e06fd8991a688edddf7288612a03eef8b5457f6f65490151d40d3d05d55f9c92d8dec73c7aa55a79aa7c51354918829c531ca70e78518003474f611c07657b0808402a053b744a80e6cf25146bdf24b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367960d7b37dd1361aee34510e77acb4d27ddca17648a17e28475032538c1eb500da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb4949da8d2968254411aebae49708200d0b19b59a844616925b107b397a8b89bee9c212f1ab0dfa1a42522b9ca3467b009d36f3b841f39cdc4da4a0520ce4fa4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1afbe3f769c38b8e8b6210ef4c1e57bc6cfd7f8d",
    "content": "{\"tx\": \"7b8f2880028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46300000000896a89f660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c3000000008f1288ee01e55143000000000017a914719f78084af863e000acd618ba76df97972236898700000000\", \"prevouts\": [\"2c12410000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"797d0f0000000000225120b52a77e37c1fa9b4a7b934796858277b8dc346396dc90993eb725a9563cf0842\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d5012e137fad837f2a561bcd1c9c1f808d9fbccd84ec6909847f68cc5e99fd83680ad4b39187ba2201bd43281cb490806f8c92f3a923381fbf08f71aacda6b45a8d82ce18bd234c1584c4c622342218adb669c8aa790fa32167112ba5ab09537f29ca2a45ef7c036783e7f019aef8c33828dfc20d8195f846b202f5060bd6054c5e9d880afa10b507a611a7cecba0751355e204d7d64cdc65781a30fb764faf16916952ba4bce2ff36064afed8298aede0bfa088d5cd87b98bd86e0d202351a708c54794ccb84200dd55c18b7917646b7f907583615335daf060c73e014afbcd85269a32091ca1a0e619f6cb46502b0617eb208183082b6d5eadd4338e4b10dbb97d8cc4aefd2bbff4ac5774aa7982bc9c37e7f08e57211b2703c97bb67d987aa84ab88925ee8582ab7c5b84ad64822574e5eab73dbea6612084108aad55bf4bed6d6aa2b9e066146b19db11511d4ad8ae5515bddc907180c169281dbc52835b6456a98e3de1086bb652e5971f79fa145d699f0d3f075f058767839d4bc421ea4bff2666e4184e2ba3b40841d4d84ef7df51a9df4d23a49c5c067c7b5ad797adc191b33a6991643a5484210c304c9a55f50151dc5816624ea9a8a448bca698b23c50db5b86b03db533335bf6d0647eae4c039e05f016cc8805dfa15fd010ed2e5f65c5f9ea1e732051d65371f5df0cfe5590cd124d77011f963477e438344a6835e0693fb3d083133775ee\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361e1b8a1feee59cf22177304d96071e13d70dea9b08ecfc21a58c9f3d5fdb3c7559932febacadcdac9e119439ee6db08dc69c3a75ae91b384d859ac01e20a421c0028cdc19f89baf6c362287c7c7841c4536091540a9bd978c440258b5fe7844c439ca2b6d52d4fa79aee6ecbc14a8999a29f1c28c4c5c5b9dd610517c3b748ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ba928d55b192a89bed5e70305a953fb31aed39dbda4d92b7501ca560e75875af4bc1f1cad845cf132d229040f255300d2d92e14e3baf0ca7261028b28525afe557310a4513d6c035826c20ec28ca25d69ffa1fd69324d4f053f46569665001d152a86f5c779661d2e74ca20fb6e60a619dafc445b735fa1c209fdb999454b255e7338a078bd425f1a6523435b24b9d50a0aa221f873dce6e8454ce85e7a4c7c4a92f4dc2ada819992e0f98779276a4b4b18905de8c0ecefa5f445f95814da46bd30037eb8f3ea3e78d8e9da0c92b63198f7826e92c90fa61d7a1d35a87e720d7997cb9b4ed894e84aebd87e54082fb470c490f2bb353a4aa926a15e076e29dcbc8da4a63d5078659ad263302326525911d848b77ad4d35a0c0bc025f37fc5c40b2c06786c14c1682dbe8cff62d3b7b5543e21bb1ba2bf1ac089e1c37fa443d282576ab7b9d37aab9b2161b7491a07923b254494da284488e5302406f7be9ba60234d3c6eccf289416dbdf2cdf17410edcdb2234ba003a985d992ee9e00069bbd1b93fd5fa1b44208d6af7067bf5666e4a570d1b0ac682a5972c84111619a307622e8b2d38e24d42548d3cd47f53b553e62a46efbf4dcd30317c65b834f5ae6474bbe4945a3a66ac34fa4c628bf983ec8e68ccfae08d228f6416737264838eb602652e918ea718b2f4166aa1c1a411f3ed31630ce2345a89f52a363578694ed34220f4f00128197eb077561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364853829b144d1f1df74c8f7a51e60c1d5006a46e3272d2845a586cb2514e9cb959932febacadcdac9e119439ee6db08dc69c3a75ae91b384d859ac01e20a421c0028cdc19f89baf6c362287c7c7841c4536091540a9bd978c440258b5fe7844c439ca2b6d52d4fa79aee6ecbc14a8999a29f1c28c4c5c5b9dd610517c3b748ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1b13c8bd9a345bdcf71eaa1078ef4cb752b3da96",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be9010000003b4ab8d18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49301000000992f62bfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c36000000004f65d726032c18a700000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5f079022\", \"prevouts\": [\"617c220000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\", \"dc55330000000000225120884291612dcc22b2c0e2cf19d55719f5f9dfe9624bd12dad94712b18ad4d330a\", \"c6da520000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e74c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e907011b224c3ef86d2f36e7d89b63e177b85cadcf6e2dbac0680b671e6366dad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b292a4f502e305109d81040f98432632ff806e9beae33e8faa7e022234476532106df482d4085282f873fe38dcb59fc4eea3656d896112fe243f784a0cfce46b53\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1dbfe159b7f074423d2fa61e8a9b5231056855b78cb68876c387837662b8c070f92a4f502e305109d81040f98432632ff806e9beae33e8faa7e022234476532106df482d4085282f873fe38dcb59fc4eea3656d896112fe243f784a0cfce46b53\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1b2543854748d5b37077ed3e53a36309f5330a50",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8801000000c8c8d8b88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ad010000004c9346de03c1f76000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc731010000\", \"prevouts\": [\"4b5d270000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\", \"c51a3c000000000017a9146f2d26adc5ad58653becfc45ce03a0b1167b1b7e87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"cf7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ea56bafcb4adbf2751227cb38af2ee857892c1346189758b7796ca4cc3d2e44b46c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdd6c4167c25132c432c9175336dcf34ec1853eafcfbd891c58e0cd045b8bc4542\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e82a853d9097b45eb0aab266931969d1621607f85e2073f603093b953a54be8539d6c4167c25132c432c9175336dcf34ec1853eafcfbd891c58e0cd045b8bc4542\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1b3c874362224cdb658666354aa6fb9efff9b371",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4300000000d2837e2e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c484010000003ef0486f03696259000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8761727c27\", \"prevouts\": [\"e16b230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"43df37000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/input81limit\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8c51fd3dadf2084c515868c0183c3a4fe1f7af7f1d72b3c5bea38d36b25fead31cebb4337cf0fcc96b784a4673ebda7bc5dc62d4fb2a1f019523632a7f8fd337\", \"6ee6f7f05b6d3e67725ae7b81d24ee0c606bf1ee08210f6d61e0980224e8f31ef531b411854cb17b4d129f949891c8c09237a72dfd743ca002b8ac24f2b8e9e64ac37c2055b4b66dc9fc7ab00faa0994de\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93633f145906eb3b0b9144503b7e952fa7ac030804bf21818b76946b0617a1dc901d4021eb67a5422f2c264ab2e161e443ad68483a924a10f3067064f47bfc1aa823d0cff3dcc0a2d4e46fc30f48a30ceeaa99fba3feb9f110c8632a3b2fa3f4f4f8fbdead7f8de6a8aad36d37b0d589bc9244c1684fd5ac3294cec67c7c6e587a6904ede5a53833ce5d447360be78b94add963f9070eac219e9b04ee2bdd400ddd04364ae3f3c0d48023a93d8481ba8ff7adab87d79476f69028f3fb22b08d057964bbb3ea34308947c748760264ee9e03eb1f98d2b66028dab654f580a418be99661f479a6b0f557293064f4a690bd09af98d8bd3a778ce8944b23259946622ee8f58700e34290ee018923271c5b5338c26b1c5ef6f25154ea2cb21c87cb2bddad45cd3b88d2dbb65b62cf977bb614d0efb5c9353a8b35cfa01122561253231744c2c32064ddb3ff0f538be34c536787771f8aa5aec123a81e8014a979ffa6906075479528a5b4db5d683c0884af4c8976d652dd9505f85dd291fe0843ffd0ff27865ba15c8822e63cb0be5982c1ef15a41fad555080e76aad0b72a8aa15726acd51679a62f62b306cf011a5d1358e6ba8e189d7358bc43376d46dcace83895e75b2934214492b999e4970e4990c42fb0eac353aa09117e3e38145bdbc22646e577b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1b4bc136aef0b80666d85ce3d93b7996d0ce7ab5",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9a00000000410c554104488323000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e76e000000\", \"prevouts\": [\"74fb25000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"a77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8344d9400294a0bc4ed438b22b08ab3b11b45ca3db5baf8ab71a53149f22b235b11a008161139ac7a92b00665158d25501a881aeebdfdbf881ee45b85e0726c11\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b1e774f32bdb28c76107d540bfb745497eaaa89f3b38b8eaacc646c85ab728e2344d9400294a0bc4ed438b22b08ab3b11b45ca3db5baf8ab71a53149f22b235b11a008161139ac7a92b00665158d25501a881aeebdfdbf881ee45b85e0726c11\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1b5a41cda693f9d63f77b9b053dbac3106aea789",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd90100000012f00060dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3c010000008347e7830238aeb10000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748761030000\", \"prevouts\": [\"c79c6b00000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\", \"dd9f470000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d44c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004536ccddef3149683af65c31c85a3c06583d8e56fa5e9b8809ad6476a55251e65fad1faed220136b938a4936a71b98f5f9e86de449242d6a82efdf7a3adba2ae62745d0948d124101db49c294d83630876065ae400dd84de1c183cd8c786ec24f9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082ef65a7bc88e8caa9953fbbe68415f348dc7b3deedacdb598041f1438fea667b18959ac4fa8a57d164b76708dc6f63c2efb2484bc5a77a391ceb66b2f5ad6b35f745d0948d124101db49c294d83630876065ae400dd84de1c183cd8c786ec24f9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1b68c33f2aa26138257e984d7c57524a609332e4",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd401000000a64a7c9bdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2f00000000f9b73b8e0300959b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a695000000\", \"prevouts\": [\"8f217a00000000002251204bd530dd92500289ca536d9e0216beec7b39c81554ac6dd1e9e4cc3828e76161\", \"ed1f240000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"2f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082cb0eee81661f2fefaf772a8bdabbcbada52a1b0c3a58f1bcc7f9bb01897d4d674e9031d393e93ec4f3e9da8fc51e83b82f31256dd96ef4af94581a47eb5c67bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367ca2ffab0cf338eb106c1ce200445cc90ecf54781f497edfad4f32965f124fa8cb0eee81661f2fefaf772a8bdabbcbada52a1b0c3a58f1bcc7f9bb01897d4d674e9031d393e93ec4f3e9da8fc51e83b82f31256dd96ef4af94581a47eb5c67bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1b79cd4b2e7a4b311359e56e468853036d3681d5",
    "content": "{\"tx\": \"d1497db003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5a010000000ac409eddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1802000000b7a057afbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff7000000007c740f92045d5fac0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fce5030000\", \"prevouts\": [\"d1a0230000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\", \"d84b2000000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\", \"d77c6b0000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c54c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694642e1d6a26a11a0c6e91919f09b278112d3d9e7557d10f9f51d88907efe7b71ca095b957df84f3ee7611aa117e5662ab64755743d6d9c5cff6305984f4054c5075e3d7a2801b75eefdf65cb630fc6bd09768ae07eb1bf67760ac5f1c253b1300a5530ec2a7d4ba868ec61eef99b13bb3328da6d520ee28822b8288bba3da4c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52c5\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365ecb95e6307dce8c007c72a55b7b5c6feb3e69a9f251aeba09cf2903e8de24a91ca095b957df84f3ee7611aa117e5662ab64755743d6d9c5cff6305984f4054c5075e3d7a2801b75eefdf65cb630fc6bd09768ae07eb1bf67760ac5f1c253b1300a5530ec2a7d4ba868ec61eef99b13bb3328da6d520ee28822b8288bba3da4c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1b8f51ede6850bb667b5fd80d78e02cd4832d753",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701f010000008a70cce402a20b0e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc11e4753b\", \"prevouts\": [\"b2a6100000000000165c142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cfc26d33c3f5da3eceabd09c022c5e779e8b65893679a04f00096c9348e616a10ce548f5d5717b699b60e94ae7675c4d43a7be8f45ccddc700a88556b6026cea\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1bbde099bad78eb5021b57eaf4e9fecec63162ce",
    "content": "{\"tx\": \"a8b92e5502bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7c01000000345ea6848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40901000000fc4b1ed502e2dfa00000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac69b80e4e\", \"prevouts\": [\"8402640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7c773f000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"be\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93659372e262d5a0f9ef536aae388303ac1332900989a5444d826ec2580d67fc3a21a521886ab29756862a71c0453b77f880429f1d68b1fae0f34d555c1e4747b3e7a9dfad218b10cddcf05e9e788f58784bb5d8eb58cc0f6cfe4d23ba63d85e381\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a5bb2be9c002390585aecd6a44dd843628783a58b1ff5512778ad80556de83f015cb0c87b91becc5e8e88545f518ccd4dd82a3936db012f0c0e2ff8a479534101a521886ab29756862a71c0453b77f880429f1d68b1fae0f34d555c1e4747b3e7a9dfad218b10cddcf05e9e788f58784bb5d8eb58cc0f6cfe4d23ba63d85e381\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1bc3e95ef1ef57164dee0340314916513b071491",
    "content": "{\"tx\": \"044da27e03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdc000000001a07b0b4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9501000000bff781dddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bee00000000ac3a7bb4026db9df0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a67e030000\", \"prevouts\": [\"ca4f73000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\", \"2fbf4b00000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\", \"e43e22000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"a87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa5bae7514f70ba44e8d531d880798aa096a25d03d605b2e6afaf4f02fcbbf71905def3d75afa0626f5ab572f3c9ae49b6567bf85ec43d0b3933062a3ad8b1e492\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e0f273cf51817af2ba6be97d0b489c0ff94fb9e2107188f41c15a52934d07d725bae7514f70ba44e8d531d880798aa096a25d03d605b2e6afaf4f02fcbbf71905def3d75afa0626f5ab572f3c9ae49b6567bf85ec43d0b3933062a3ad8b1e492\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1bc5747eb674dd470ce9e8f236e8c461bd9f5491",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270df010000000d2d46bf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704500000000609e4da760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a601000000c24588ea01641b0d000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87260bfd52\", \"prevouts\": [\"9707110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bde20e000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"f260120000000000225120f52aac6d1851a3bcc3e02eab41e79301b2d0925e53812529fe85f9ade1401e4d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_c6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ddaf1bb74989869b37d16c28f9b40779f55f7f5218aa7f4c0685073d12b99c91b034097dfb03d30811fafd407578b0e2574a239ae4e5611106dc92d5d83046b902\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"04ac942e3e881e0770c43d7aabd4619c2f8fd9930302edb64765b30443e9ebd2d75201cd83ae2f622a4bdfbde08a1f357a601a2c866e2459b1d9be20fddf56fcc6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1bc76532e1949261ee2079d9ce81e5bd2ee2c56a",
    "content": "{\"tx\": \"a83fcb2f01dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0c02000000300def9a03348f220000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72c010000\", \"prevouts\": [\"6614250000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902987bbdb96815479e252b855f04fd09b10903650e7f2b4711d67c5f3d52c6e112abcbb9aeda19ca443637f8af4be0bd588f2bf3d3451c2290f18e2b98fbb0207b0d4cafd72c318d0207acf78da1a6b850968d0dfa2c2ba264ae4d1d9335888894578835dbe8bc0aaa2fa616bcfdd2645e34058e523dbe20cac0296caf6e7669742880805ebcb4988448776844570656fa42a56e438869fb28e2d41bf1491fbbfd0962f8f9293fc970bc61456b63a6f71a95a009b7d04258a2cd7429524c40c0384a8e7e83a46c2cb28470bec8edc59729a2a6666c3a6934fae3a662ee3d744ac831a565d3a637f74561b395b9faf3958422791928ceb370b5d133620de5210bd5d59feb4f4277f33ee4642c3a78927c2dadcd7cc9dd64426e9120bf52716d945aa8ef41165ff702aad7667419322d892d7b31a6580ccdd70cb103e0ef4c627100342d0e968fe4597b6beca749a94923f0b4ccb73d0b9054029a8c64f92138ca07beecc730e33a8db9798c826d2a3322d65d197faa43725fdb5e2eb17aa768ffc466cd96b0ddb7e5e02beb4081648afed31d7307add3aee1e91aadfdec50e0e024752ae7cce334cbbc4c44166fa0717d413fc4705e235f59639466fdb00441ba6b59feb969c484b89a245a896b5954f88cc871642f836c1723f711a1919c52f63bd88823727e359bcf81b7c73fe5fdf1f99a4e89d38f22694ef46fbd6445e90a0d8e0e8e427c62fd0da775c5\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1111302735ec636dd6cd82402c946e3c4544cb7cccda2620354a4b8fa269f342b5075e3d7a2801b75eefdf65cb630fc6bd09768ae07eb1bf67760ac5f1c253b1300a5530ec2a7d4ba868ec61eef99b13bb3328da6d520ee28822b8288bba3da4c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090230ecb3e7cdd1f21ad4866d4b17edb63a2ea54323396ecb9ff29801f7f34cb7fa443c0c5adc090368e9434746ff002e4730351d45e72964762c78d3b03d40d713422223d4857688b9eabc0573719f932518b9e2f2b1beced10da4150cee0049de8254fd03309f9f04d1ff7c1f15c215facb0ec1d51116610a83e9b80d38e9cd917261cd5f6a9d6c2dce17ddc268e07b893564a1ad65dad766465c3055c54c0138cc517808e412c08ef38e6d42dfed56e7dc797f815f14654cf5283883d85c362fd911e5a314097bf785665888e831fe68ca5f22b7497881bb7c9dc33082812cf8162c824ad085bc858b2a1be43091ccab22c989f43ecbb7d152f3365c25a3ee6d12a89609f429b4feebcd549c37b1a13408043428ef2b856fd48ad02fff8e35084046064413e5a44ad3e8e36045f8859e898f5d84f3919c005592aeef473692552a000b94619545fbac00dce04a4c9aacc0fcf54927117b05b84beb4e37f0622317bbd91338eacbcfb5d954866a93931514a051e009cd9c0c6b5e5d08f35365cd88c6fc4aba03331c91bded729f8aeed05c5f32bde8921947844e5d7499238c0ce305d5d0bedf4c53b18d52c1d0cdc51d0650459bc9bd71d7b19cde9ab53084f2e95d489dfd79abaeb4b0a7746f187015067e8576b25ddb0a6f68897529f6842e33b3c7ed7c0b3e276cb43052005d3944a68bc64483610d73d6fd521caa1e40cd730429897b1c0517847561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936afd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173a660eca3fa0edb42c0ab30ffe3daaf6f1f409e953104f48559c2b804c71af6a81ce4d7767c8a9637a0804b073b1eb172c67de67ce152ade33f2591a85dfee2e5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1bfe6046e6cdc344b877ad37196692f2724dfb96",
    "content": "{\"tx\": \"3f83490e02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf29010000004679f882dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7001000000ded352b204041c8c00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487ae53ff24\", \"prevouts\": [\"18d9660000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"dbd8260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_csa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2b44eb7cd66327d88d4548755f38c44c35018f8a857e6c90843b6b9b76e558f77a9de1d26d4076b0f124c9291ad326ee84d275d24343dbe3e3d6b0385bee9ebd\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439befee6fda3cb49175c9fcdc99039bdef34bed6f8c885214259c1ab60f6e0548afc8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2b44eb7cd66327d88d4548755f38c44c35018f8a857e6c90843b6b9b76e558f77a9de1d26d4076b0f124c9291ad326ee84d275d24343dbe3e3d6b0385bee9ebd00\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439befee6fda3cb49175c9fcdc99039bdef34bed6f8c885214259c1ab60f6e0548afc8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1c0b90070d5af0e0da662d27418affd7255bb328",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf300000000050a1b45adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2002000000d5142d75026c9a980000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac27030000\", \"prevouts\": [\"3ca17900000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\", \"03c62100000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"327d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93664a7611b628410c237d06316ee04957fbdc9ecb6c280085c3b6be5718c5572e78ce3cfcf38b656b5bd992972d83f897c8aa5da1de7c0e12ea4c0aa09cdb3dc1d2e4cd18b5d1ec472eec5a95c6c9d67ba3848eb933b0b41a8c6d3176a27b07997\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93613098bd67eb0d948d9da1baef2a1e373b21f0d2c05e2b432c8a43efdf85d0ad308902a07d3a610262cf0bf6826274beb2bca0848f03750f1d66d9fdb1ecc982925d31a4d328a06fbd663a9de03f4f743ae6731d946a7b64875ecbfa9fe5ecb492e4cd18b5d1ec472eec5a95c6c9d67ba3848eb933b0b41a8c6d3176a27b07997\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1c1b10df48009861e679c78f57233fcbab1c9c74",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4c00000000274f8de6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdf01000000f39357ce027462a30000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e718a8883b\", \"prevouts\": [\"c63d4b0000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\", \"7dc45a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"1a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa8e84781bad1ba81b7ce5b7be6cf9bec34b59091704d19096b61e5a37e7aa266c56798b11c96dafc2935d577afad31a6537ce4b1a48ff27833822cff5fe95a51e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369ae37181c42054bd3d996a0cb9fcac8a434e22d455bb156486fd105951d5862240401d3043d3e54134521a2f6b274f3ac0e46a5b9a6f95ac49ca3a75270b4793801cbe9d84ce1e82e006940c90d66235295537a514918e448d1b01c99be1031af2727a08c83da142d000f7f66d34a23554b296f940ffe81022e50f50dcfdd8b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1c1c68f02884233862b5ace3f063b648ef1a8f5b",
    "content": "{\"tx\": \"2cdaf2c70260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127012010000003b999eed60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705901000000d23472a40318961e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5f000000\", \"prevouts\": [\"05ce0e0000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\", \"bd5f1100000000001651142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063ec68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367a5b4453de5c6ff322ea1de12551f31e7d4d3d0aa0fae2cde1b898bb69f40e54afd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173adddfc46016955cd26bcdfd077adbba0d60eefd6e0317def1b858595de21efb103b719bf4b6df334f4ad3966afd516fb2a8d294cb4fface4e4609ab1c9f988c5a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d686773729ee45a24450fddb7da6d0266ea60d425b2bcaf3694e59ee80e6a1a3dddfc46016955cd26bcdfd077adbba0d60eefd6e0317def1b858595de21efb103b719bf4b6df334f4ad3966afd516fb2a8d294cb4fface4e4609ab1c9f988c5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1c2a334bb5693def73177ba056d467309d1a592a",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bed010000004b8c4692dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc00000000064d1b7e701d6ec0500000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5d040000\", \"prevouts\": [\"d41126000000000017a914927d550e2674fb9e1f6ae1260d00989fc596dd7f87\", \"690e290000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2254202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"3986be8a270ddfe32e2009bc7115200b5e1f0a0ebc807f85a6a2f555df4aca454525ee4dda5aaac495658d27b678d55652a1f2ea60fad74816052599f8b8c92c\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1c34962adc291e2c8bf6dae66b8fb9c765b86439",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270dd0100000032bd211460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ae01000000ce12f710049bb81c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac34000000\", \"prevouts\": [\"bfb20e000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"9019100000000000165b142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b0a0c8f5ff054a8c0b66272c21f09d79645ec52eba52e10be1a70c9dce1379227bf4a7668378a0efe2e4ca5c312fb651a52cedfa4773ff4ab97e186205b0a85b\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1c385e281c4e1f86fe4c3b41f133fe0f1ad20791",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41202000000c2df2cc2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3e0000000000c889220437d98f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a63a584d51\", \"prevouts\": [\"d5a340000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\", \"1f1a5200000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"437d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362c503a4390cea1e1efd273895e3e36c6de149914d80a97a30106137d896fa43dd9a73345c989c90f21221bc9fa2fdbe5d62b34ad323157a62317cd84046f2af72db79fc77699d349d3583c063c1ca5cb78d93faef419ab336fa45db1a25ff641\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a84e311995f98367a2a93ed7b61478a76d5defba7ed050312f02844091a9eaa94274b5900613cb2e14ccbb49f92be42e903262ce34f92c4d0a103e0ecbbdfe862db79fc77699d349d3583c063c1ca5cb78d93faef419ab336fa45db1a25ff641\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1c561097325c97828153532b8c7b95b14e46dff4",
    "content": "{\"tx\": \"feb46ba5038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45901000000d71bd59f8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4be010000004e14988560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a7010000008348decf04584a79000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987a5c20248\", \"prevouts\": [\"41353600000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\", \"744c360000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"28650e00000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f99c996d59a69d75c183cc1e3ba6b17987582b2274e87a7d50251745c93805cc8eba4e75ed92f6e82baf0cd6101dcd67879c020ab703e3dac001fd69a24240ecc7034c4ece6ceffdf067bd97d8bd2a80e986f14e8b5dca33ff1523eba7a77d63\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93609ecd9cca2f2b8950833b6aa956617a5b43d405ddabf2f82896509604dfe978d1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045be01dd809c80d07fbb65649666935b9712ecafc77e536b2a27c3cd6425d00c1ec7034c4ece6ceffdf067bd97d8bd2a80e986f14e8b5dca33ff1523eba7a77d63\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1c7cf3e3c8d41ca4743e00d88ec0434c6f31d4c9",
    "content": "{\"tx\": \"d3ff18670260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127077000000001de5cfb8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6200000000bb5121f804c76831000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac74020000\", \"prevouts\": [\"23940f0000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\", \"a9962300000000002251208cf8a45f10f972ce0940452c1be98364c363db2f13613d49d474bd7709bf6664\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"8d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367fb9aaabde077b4a96633c8c7d2d9c056a2c65d4be6dfdaa3c1c9735c6591c4fb838daaa44e784827b3ea8aea20503468fe81f3acdd576e27ac09ae12d8ed7c28047789ecbd47ea83af97bdb87f8422a4707031714ddb05eaa38b24e158a7c35\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e88f7cf44737276fc9e0e4313f71ddb6257126d0499b1311bfe4a854929366560492d17ab4c59254bcdea8b81e7721fca5f8758b8cd0b322bd5a652bd9dfe7967472d664747fea006dedee35c74318028ad9a0ae37c154fe8226ccc2af402983\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1c903f96be3cd8956476fb915624fb89666a187c",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706a00000000ba3847fa01d7b9020000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc15020000\", \"prevouts\": [\"0d141000000000002251209c5a589e416b2bf8d886ac38373c12ee12085629030d3f34ed2b7cf34700cf85\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09024c60c07685b0417c278706be8b20403d535e08fe96e8a49143174c62f87a0fff247b9625014ff97b39045d5791a8f071f7024979d335a05e843ef427d5ebbcca3188050a4668a361e040eb89629cb77b168ad9c46a13427b3f8fe1d7eb4417f132cfa94b84ad4a52d7ab1988879ebef37da6ba67866597973f51d8e05964ceed321323d3e0d857e1421627bb575713d9661841e83b89e0429e271dce0b57061c3ab2e6bec506520c94d2a556c2708c62a9ebd3625214a74277dcfce157927e4c25fc8ca86168dfb495b394b2b6eccbabca296655ec91060cb415658e39313e3c6e570a9bca1127647e20fe0f7246b5fb464e899e6b9f9ebd66b42a2ab5cb9ca2cd20ae9ce19aa5e82991df186a89e579d2282453b43051bd855825191665358fabda6d3dacc64f96f1c1fbc9401da10693286fc252e472ce5338aca9b47feb7f7dae56c04a978ee4fb3a571b777906b70f519cf31098b8759ba4239f77e06153fe967cc9a95c9107d23d07f36396496cb33d224cc86f56b8d0b4a090561c5b6c40d54f23f80105b81824524a1c52ac2e6537501ecae2b61711ba647136d08a54660268bded7c90f9d473a2f000a41e25fac686223bde9debd54b9ebe372edbd8824ff04a4dc126ea7762bb58442cf782ace01c0ca01813e9c71072966f5190164e4103b82aaac539d4d5585d9327850fa7655e7c7a7bef797ec07b6e4d734904b64d7a27ae3363fb0575\", \"107d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e32fffbf821c428499cff2b0139c90d93037c61d12af2692624d5246efcf2a3a14520b5ceb13d27db1b37ec8ee9ee9482aafd08fc62c5401b1fb7c7b4ff374c3d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902aee04339b9490235fa263c8a9d1929a73a22b6665a877f21940e3037e1cb39e76f25ff54c1e217fb5156da8edea597654d2abbe5203007c27276cb78e6786973e1b2f302aa78b0eb3f10ceca4490d6b24a240fcc959704fd574daad1e2604c3aea31cbdf80f3bf38c3ddbc630610dde249dbd182a005648ed105ba802d39b9164ed0a2d19c61a8cee5b4616345b5316703d09221a554f3d1172ab8fd61abe4f46758155f9ccb90695869bc7569e6c25d278b6288e7c1b8a9537d72349fd41041fa2413ebd82723766ff7ebf178afe3a00419d139ec6abc5d8262a6ca8a22ed3539097a0fde7bcb6b37885ce7931e5ba848a1657c6d7f8dec7a214b102bd908dd6a3c57490400f06425cbeb9efbd32af16954ae48b83af314671a0d08c76af69e0eabd9ed703ec91cbd9b8b9a68b6f6dd3fbcd1909b223cb8c50d0a2d1e58423294789f50bdabc07290db9286f9e531d4ed59f42f92bc3d0b767ec2b44815f8756ac222cce21792012882139ea843745b12ba9ff77392617c5bca01d69af30d98d617d40800915bc8a33a53d224ad2da62d578252c629eb705695549e56cbec550a1f2d62f18520496b4f0ffaad2cc085f31b7af0590e2adea835c5e3936a54bff6069a9c03fbcc6f5e5ccbbfa9f4fc2ec5ebba4c5ab56bca459a2ac55bac312a2de82b17a125c95cf4c29c539d5b2414158dc6c0d77833feb713ed9c0994373e19f0139957cd577c6175\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93634545fb38decb633cf6ae769fdef4bf71c30e4ea3f5ff3ea24d94195fdedff4709630471a62c8657382c38b342878f0042beb3ba209e0ca1417f9db2e3d45f6dbd940ade039b405c8439b762bfbc73f9441ef227e6f687b6d94ebcbac32155c7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1c929a0b875b383b7f3db0d168424cf2ba6d3cd5",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702e01000000a82179bedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf101000000b57106c802fe846b000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac32000000\", \"prevouts\": [\"b7550f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"45bd5d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_7c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"50bf221dcc4228142ec7f1b58cdf0cbc075daf28ee8a07041cd6f07a20d05696ebca6a7a8d0ffaf9a2449b39c7b38eb29c2c3f0e5c2d039ba51a0b3c92ae7b6501\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a740c0e16ff18e887707249969575eeffbfa21e71f98fa097001567a45a8504b2913294a49fc25a3cc72a55cec35d5af3147f630280a7b14c6fa3aa9f47b0a7e7c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1c974326af0bc49a9f389a9c91eda58bdb47ef17",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40502000000389ef4cfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cee01000000e0711392020eb285000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e55e102f\", \"prevouts\": [\"67343e0000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"df294a00000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"spendpath/merklelimit\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fc777bfd39e7a40f276038dc2bc4c815879daf9a58586353d6f3f85ee628a1c2dd5353de835c4020bd07ff63da79a03d921019893ee36314ae0ef668da1c456f\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b78be31b16966ae882c7ab2969dfe11d69b83e8cde47f805ca2a48764752b9cbbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fc777bfd39e7a40f276038dc2bc4c815879daf9a58586353d6f3f85ee628a1c2dd5353de835c4020bd07ff63da79a03d921019893ee36314ae0ef668da1c456f\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93672ab2582871329e6d2ee7428615b3ca131667fbf9a036ced2b197b0b63c7847f72ab2582871329e6d2ee7428615b3ca131677fbf9a036ced2b197b0b63c7847fbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1caae5c5cd8d5b5cbaed34c3bffbfa19df6aa109",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8600000000ce2f9983dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4601000000204160840467558b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487ba17e93a\", \"prevouts\": [\"35af690000000000225120a283e1ea0142d34d03fade4b28902cd262d82bab6ae3891658a9596d967dbc43\", \"468324000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"304402207686e00c97162febf58805365e573e1fd0aed87eed6e265268aded331b55b05102202b76a217a8ebe51fd962739ea9065c67a104185abf22b4e7538217e7cb81072f81\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"3045022100dd3abd03be5be846e41d4fc544313f60598ebef60284bf3b954428f6868e187502206732f3dcff5b38dbdccc1f609c0510d3e9b4387b3d5dec49d1f2efa96f61c3b981\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1cb39f47f10b248d485afd4c83fa450fe4dcf928",
    "content": "{\"tx\": \"67740b64038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48b00000000cbcacdbcdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0a010000009adeb4bedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd9010000005dd15aca02d7dc9800000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac56737540\", \"prevouts\": [\"ff1f310000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"d85b480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6f8f21000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"897d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367ab344e4b6d97d5a92cc1b05df0fe09e2cd2d4682c3139258fed99670b6ab8d41726cb8b9ef30538f8a1a93f31e75c47dd280be49ef0cf0ee8d9ed88fe0918226c56da6b4a79dd49e001229b88fb5122d120ac43d63d1be0cdb38b208b21132e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d4b8046dad04a3772f9ccea4aa6561ffa13699a4d5ce62fc25982fe6640a947d25e476051edc329ceb3a02f4bde28569ef4d6846a9140276d24ddc98c1f436ac1726cb8b9ef30538f8a1a93f31e75c47dd280be49ef0cf0ee8d9ed88fe0918226c56da6b4a79dd49e001229b88fb5122d120ac43d63d1be0cdb38b208b21132e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1cc704edb370c2b52aa731bd30ea881ee0b2eb53",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce501000000881946a160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270870000000050efa3a7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb100000000ea994684043ae79000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487046fe641\", \"prevouts\": [\"b8fc5900000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\", \"d298100000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"290d290000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"697d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9facb7a7ab5fd71851d574a9c26887a3027e1173994a10fb9074a9680b95d402bf38dbbed29828226c3a1e74b431b518dca4e99f1ee054f76cd9b7bd5529b5cc8688de3449b5e2c621283b68ab187cecafc7aa77a8721601b5317d3484f84536019\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366514e2792df6cd73727562f46c93cd47aa533cf6032189900e3e0a43e73e7f3e7bbe6274b0dcd2777fc9b1075bd65318fdd52335751f1d5034a6ddc9c2a447578de3449b5e2c621283b68ab187cecafc7aa77a8721601b5317d3484f84536019\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1cf397672140f803d1c48c64b7a9b55ed395d983",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4680100000014cd4d66dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5b01000000d231e7ff03efb58d0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc27030000\", \"prevouts\": [\"9db93700000000001654142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"7b045800000000002358212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"11f1c55903856f2490e230698c97a7170a192ec750008f08d002d35e89a335566076759e504b9c5780d7077cd426e1639c3e0d113dec6a9a678118987f1e4af0\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1d396736b3bc9203fa55467a0775f7a058a44b05",
    "content": "{\"tx\": \"7b8f2880028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46300000000896a89f660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c3000000008f1288ee01e55143000000000017a914719f78084af863e000acd618ba76df97972236898700000000\", \"prevouts\": [\"2c12410000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"797d0f0000000000225120b52a77e37c1fa9b4a7b934796858277b8dc346396dc90993eb725a9563cf0842\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"b87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8d64c15a931058236adef8a4965d2af6c40e751c52c93bf72b53dfa72cc6c024bd12296fcc73680f3617d8f33f0de746e19dcfecb08411ea531ade48d4ab609a0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e5c7be958f18497b82a5f310769c8b8ace0436200d1bb32be05dbac5afb51b7c71ca511921a6acb6b52511c7e467c1fdb04a1d5dae2a81dbcc486709376a8609dd12296fcc73680f3617d8f33f0de746e19dcfecb08411ea531ade48d4ab609a0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1d4be0ac5b202d439cadb143602ea3459a3eea33",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41c0200000090748d82dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cec00000000327a6adb04bd048500000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cf0c1a4c\", \"prevouts\": [\"d0a93c0000000000225120dc347dac30d55fcefc955ccbc6791a94d629e3a9213464313d15e8052cd76ad1\", \"f6434b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fe79816e53960984aa9f9324f7580bf1e252717c8ddcb06f3034ba39587c992e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a12616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1d66bb4f8ee00895bb9533eb0329de6d26b4e395",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdb000000005eaf85bf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e0010000001162e7efbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9701000000c3c69fd004347af5000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac82745761\", \"prevouts\": [\"612151000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"c6b8340000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"f439720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"984c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c161624a971c36aa6290c86687ec80062b931dc8c82c07703e18fb2ec2014c60afd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173a4b5563559956b4521d685614895115ff3b761ab3fb4dd1d8def3bf310bb092b594c58b1e468d5c742a8cec262986ad36b584a802070024df25b549bdc05f9a8a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900451f4c7988b5621a2b4ceb0e4a0295b5522bdaf57a14af19f5e9873d8ccb0a4f054b5563559956b4521d685614895115ff3b761ab3fb4dd1d8def3bf310bb092b594c58b1e468d5c742a8cec262986ad36b584a802070024df25b549bdc05f9a8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1d6b45d432e1a9f7bcf2692c87fd3865d9e96451",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8e010000009d47f8c3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9c00000000643f149804cd20a300000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac550ddd44\", \"prevouts\": [\"3958230000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"01bd8200000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360a008098802adc05b7660f80fc20c7ba5a23d2bd0801d1158072548832fd78b18080c17c1a9ba5ea8a3780f9d0897aa41ac6e03bb9fc27a0b4027847c33ef9f08f84e1cc8430872045fc695723e7e8ea88aa60745b893850b41017408051d8396d96bf27adab25b1c800ec6de9073e8fa8f2a3b567072b632cff39ce61bb3673\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93663f772b330758ff91816ad5871b5e8f137c7278d3b68f945670a0b97a4fd348222ac0f20434af06d5694002e66a328e774b08c17356336e0bf0019524f47df1a7470af5f469e43c444817efa23ad8740a4ec3822d36804e7973b39d521bdef59faeb7b84c883e27227adf79edca80c57b026715ff0da0f52c5e2d2aa306e3b89\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1d6c3731bc1125e0c52a0356e80d994f891c5e9c",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c730000000007e7cb39bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4a000000006802958d0482acd60000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac15766851\", \"prevouts\": [\"4500580000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c9af80000000000017a914b0b53ba433a336ced94ed75e23248458a1c69fab87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2252202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"5d0bd60061e5efbf062c0c572eb308a43704db88b96943fbda77dd4f9d1d97cd33c696ac36c089951dd2bd32b0933da4706cec06b97a5a9a290e728b1afd0703\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1d83703eed5baa3599b3562c9ea6f395f0ecacbd",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5000000000b2eddc38bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9b000000005a19fb67020823d500000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac37a54057\", \"prevouts\": [\"fe80540000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1a6f820000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1d898af12645329314121988bca247d8058a4a07668854d1230edffc57c9ba153634f60451d8f2b1f3f326922d9964c54beb0784c374ce67c2d8a6f96d7a887801\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4713e0a951a41221f90b51516adb5e13c07d104f62e82e715156c4a99939e7193e3b1866035c75fc75d48daa703bd35f5b8f1b1d7c9f36c95edd2417efeed91d0e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1da56d6e6d60e92c14472e47b665a85be68598f1",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ad00000000d70bf3c8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b08010000005adde9fe8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b60100000078ddf57604cdc96f000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787521e713c\", \"prevouts\": [\"6eb8120000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"686e1f0000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\", \"02ce3f0000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100cd39a39352e610354339855f7764070783c64dfb51e94ccb5402fe45ffee70ec02206e2aea3ec7777536a73cb5a604c1f87435c64d05251a235d5ce15597cd31471903\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100da7de1c027823bb7ee1d3365ef19a3d48ae72ec52baccfafbc1af3e92d68185e0220684939173578d11d459d1ebe2ed19ca2978f160209de889bbe65336d97fd158603\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1dd5926d9df81e85da3075d37f0702718c88900e",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bba01000000a2f78b97dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b82000000003a48009dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5301000000e7fb77e004cb3fcd00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7f2000000\", \"prevouts\": [\"d4b42600000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\", \"69c2270000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"926981000000000017a914971b3e5f9ac480bdcebf6ea71a9fc7de0ab164e287\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"21541f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"4292cca86b1b659a1536c0809dbe9ee735a3f3c75c7923f1b1fd213cb26875c533456f950943e6d6c95370ff3a62d8986998da89659d83be93e072de654bc626\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1ddf875ca22b308639d7b1cab6ee74ea77bc6bce",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4100000000ade270268bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e300000000586a0d6902a64ca4000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787c5010000\", \"prevouts\": [\"d61a740000000000225120e5be1c56293dbf2401662c2d3a0e5c3ad348f091e23d387b2bf628c220dc03c1\", \"b02c32000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369b94a607fdb4e67654022166c29e3d68c7d66d8db4d337314bdf481760aeb4b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ab1616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1de45c6257377171ec1383ff685db7ce8e13d8c4",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1200000000f79331a1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1c00000000af1cfe2a0186b90c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d3d29e43\", \"prevouts\": [\"46751e0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"1b83220000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09027e716760078390cdadb0e9260390b88e80098d43502e4672c8fac6d770c8eb42cdb4854a650bfc14629fc38122eec2f3eb0012876861157c780db41969bb8f6b00fcfab393b5fe72d0f5db254f39db30728c397871ba12dc2cf76c7cd347947e8b48262a0e6b8078edab1955a623071b4f180ac3e1f04d87fd76bd4d79f5f93118738002cba5b78eef52e27f5fd2bda939fe8261439196a789e418b27fb34308e10a82cd6eb2b9e7d4ccef6b277d420ea6830678268b09fd16f5a1890b8942d3791129c5848e9d4513307b8bacb61c30ef96cfe16799e3042a7d2cfc649143b610c95191d4de8f8b76b0581ccb7ee1d8af237153d5b128af150dd9593ed0c577a7c7f8fb7a8868504e3a5db5686ac7b94db04c2a72ad39c5822b4665fede0eed0e3ca09030bf676a99f14643e4fbd9dcab698378213e18cf9abf28b5b3abc3eebc5cf297760c79a6e07fdbfc12aea095543c246e48a50437e0e7774d4c30e8719304a58dab234a958bccc260cd66204eefecf2c9e0290b3974c5b4abff01040350c2a8e5514505296d6b1170d404a5493ac59a19408ef6b0c87865c3464ac95015b7fffab5e2433770ec5366510d466d255f3b5cb95f86122e4ac03b18acd584bc34690620e29ccaaf29351d152f2965996f184202c3282f11a6792e352777491fe6d01c36c3d606b7d5281f03ec344779b8dda4ecaaf468ad641dc55f002c0a44fb20b87bf012a56375dd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361dd1f325c7599a78d92b2d23b27ca74bab0f6f46d0fa61f693735ede031c6bf898751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d5c12d2886f924517b8c41f4755cb69ff55f68e740076f0e346dfe7ab1da23e202491431d89488c08702db3cd2303e8a25c8ede371a8df5f96996e099ce5df632e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09028a5657ad0cef0fc2f60c361e3773fe48ca7c066bc0041df797f0c742dc8240da2b4a183b579a2615e3c6f32b650b7021161c2cd68b4b140d52a28f1f327d402865b29ec18d2ac856309782eaf390d19167c42dea8e75b0b423e58eb647481d0010515dba3334450c6f72c1932d37ffc239dcc1c55e72cc12947cfa10bf4eb3f73eee6574eb2e606c0b10a1db3726b8d8879f49f6d84870bc7aeeb389f59bbec5d4669b681fd7aa50b25a514e4ec63cf770e661f610279419ae35717412f5f6d7147dfcde9c04872bdf2bb9ec152e612340a0aa94b7faf636214c12084ce492cac3bd2b11e9685535ea207b8083450a8033211f54b676c167711bf6d267c45bf8716c7362a48aa74b21e6d2f097d1616d2c620345918267866b01224a288e0d13ea22883476de7b07a3fc091a8c4d5ca61b3a4272d582b0ba217597c987d043c17bcdb5e461c27f821988095ac1f9be21c229517a9eca4483ce3f0154fbf8e48903d53310948c5b975c6280c1123ae25946bf9fca2b249adfe9e685811b945a42035ee762bfcb4cab1aa383c4ec40b91f47c578f4313f922f01422cd61d301b9d08bb8aae7634bc891eb853f7caa7b967b813fea7311ffb0b4a94b2c28ea88be4d3f2cc3871f620fb394f201d75300b5b61839f8590da79ce80e0dc34e8704bf41c9ddc443333b65ed6a2eaf55174212f29d65f4634a54ecee6d2cab1cf0b07fad1d935aaf793c466687561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d058489ac116bc6dd9b95d4e3df35f96fc6c43c4fbdbaf0f126d19fb49e472fe6ff37e966b1384c4d5bfa916e4482452180179a80b37f756d07f3e2976ea2d444f11caf36eb2bc7b2ba56ad05f43983925bc55248f9b66a13a767efbac40c00\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1de7bbede303fc60efdde225de97fe6e4cfb88ef",
    "content": "{\"tx\": \"bfc6bdac0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705d01000000a466cbd7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4901000000510497b3033a5032000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8700643d2b\", \"prevouts\": [\"e9d1120000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\", \"0ded210000000000225120803c4cefbfa0d88ba71bbfceadb0978872c77a948bd70ce562f9334bcd1dc6dd\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_4\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0d8b3925a29252d5928eb1425abd42dca2f5f952fe4141bae1f69fc4e09910beef62953a7e1af241cd45ce1784c7bca02b687638ae539b8d5b981a59835debaf01\", \"855f152b8fe068340becfc15f1bfcbf7fd1d10ed67b0ef10db1641a82f5c73a95e3ffc225e28d9e339e24311efa6177664a6dfe14d34ae2022a0e8f14c1c150488d9f68f35e6c5e66a6410fc18eb\", \"750020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac916920871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363a9c58bd41b8fc2379fbb89e979f65b4422719c0e5523b14d43ef7b58bc771b6141a604de8df597194a64a0393f98cc7dcb73e0445b1fdb8f7c5b9743dca7dd300000000000000000000000000000000000000000000000000000000000000009c334e28a41046a614ceb75041aaa8c50b3d2a63c6e199d1a52e17618ee578baf20b1a94752e5511701c811d8863fd07baa3bc138935a9aa0da4c40ccd50dd3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff33513086926ca65d1bcc0ed5fd54f0689e45ea12db577c49ddbeb7fb43895dc05fe8fc5bb3a8eb867f16081e9ff7aab4d1710b464ae04eacbcadea3e96deaa6db251d6000ac52413b8fcfff7ee8cf2a0e783127d3174d4b0c3d18b89562425fe50dc011f7abe9c52b51148917e176632021610f66786cf7eb22e578e382f5d8d23fd60d9f80ffd76c86606ccc070913271e3ae9763ecec8920c600546263f1dcb5d780805fbb369415a2df853983e46d2bbb7de6af62bdcc1630a3ef74128fab29321d4e4e64e89faf895fce335166a483ad5ec640d21f3dc9aeddbf4c594ddeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc129f5a01833e6f687b8d7acb7a198db8c9c6219d9d9e3bb04eea564e9722b2bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5376d1fd9eb5bc7ed5f740970802297606290f8f37c225c2d56c45dfd2e6b2216e069c73ce93231aeeb36f8ec19c13d481d4f01d9a4d1da23ff324a7a0570fe5cc68a4a01876e525de7e7cb051ba59788552a64f2653fba1ab2a5862c0786ba94a406f5d2c9bf7176b77884a7beef7c28d71927f64fa010208f90a29e6799245ba64a3b0e8a7a4761d9d26d99b9a31edd5b957f99544d69c34a1f500fbcccfd6683087cfbe73f76bd4afc2ba12238ceeed9d84dd753404b6da4208c999aa5cd70000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff489008f17c7972c9361baeda34a36d693684286c266b690add962b31e70e04f88683fce20851725ae0c5e6b4e234a0ba7f9ce1f4f167ad2a67459773200d227ceb346fa033c86bca2ab196f3d9a277ff388c861d6eb62922f27c51ccb8a9515ac9233b1e9b73ff54d05436db65ee331970b47db36b384177a6176e14616acad5c397125a5fd584d44faf56567216dec2289faf20a81dd2d3c462bd2d16d3b6a3b0067d58d044ddad4bc6ba80633bfa6aa3c1007d2d9f72e9a975c5f3b715c0baa9ac4db0116efdd97b24b49f296c9041697ac511d91986401bdd1ddddaf461dde57dedd0587e36469271958e71ff56af782b2dd92340df151716636c42b8eefb799c3c66c1c579c0f0f16cbea9c8bb5478e0bc79b0c66714798e9a9f95a3480cbf25c48716c0c7c3adfaf1388e411ab300f1a46e9600b2871d546ceb556d8f82ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb65226b1358c415f1ffc2f1e836aad1406ad36617332fd7bd26e688618d9d1200000000000000000000000000000000000000000000000000000000000000004f6b4fcd8ed4389c0c016bcfc73e722ff2c65d6bbb7995453a88f1b68a0776d30000000000000000000000000000000000000000000000000000000000000000425c88510c0fa6d7bbbe212f5347cae05e80400212515cb35fb6c60db3dd1fc8ea7f5252bf9ed9ae8b70f35a93b421ef96a8a90684e016695af5f35f1be840966ed52a2f8d8268f293b666f6f7d5aa84a6aac3b3b1b80087b14bbfcc13b0333ca86f15b40294dede979afc3e173c68d45e38f7197a4cec150a9d4e5cbe441d66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f421c128db20477f4d8b18e4af2cfffb92d01f8bd46fd88e4ce69d41252731e0d0e50c2c3729f7be46608d0334d5cd7dacbe28801502d31a3b18bc7c1a1e65fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f642cd6eb08ba7b702c471f5f14c176fba15056ed0fbc4bf77626d64ac3df7cd152295262efbdc1502c9f6d815a04a67eb1cd0393bb4c5f67e1287543a990d8a549c25773a3b30a38f5bf32ca94b5a26c2eb1c78756bfb210a8b3751f46341c2d7a7bb1792b15814c782f6ab02c7a34c534ec00563f34ec1822221a0ee6b7df46404cd4305a0820cdc24ad9783542060f3c033aa489f191cfd014fd227a056a34d0d157a1b71afe486f707ea2d249ca1058b7d3a7b6425c4d2393611ad1d713029e075b5bca6f59c6777db817e96677c5e3626cb35248a4dc2f5d905f7071839ff0b8c72b268e09099c620c2f720b27733db3810b619bec5dcdc11edc7a0ae7867d4da97da20fe8559412ba979c238f4dabef763b01c01eb4750d03490c5bb97c130b7b13378352f912eb3b93a5d722c0a912b8600898fd38202e24ea55152eeb00ce84d720d311b5627fab1f4fab7f524bbc51b1a164b81164d54c8f59d6a868df0eeca945bba6643b776bc7f907f2d9b76186b6876b3bd714c0720ca7d9f7ffe4bc49df7e9fcc86a3e3effd7827b57255624f65787cbb010d4d23c23b0a47e306b1f0458efb8eab487be7e5493f2c193660054babf701fcba9537466a092a38187bdfdb079bb9d7bd4be10adaf2b07ce9c9b807da99a11642831849b4c8f0\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0d8b3925a29252d5928eb1425abd42dca2f5f952fe4141bae1f69fc4e09910beef62953a7e1af241cd45ce1784c7bca02b687638ae539b8d5b981a59835debaf01\", \"3cbb21efe1567520b2461b1a88d0d35f17e40fdf502df93155271bd61c475f8402b18eb1e289b75652078d6547c204b016796896ff9a184553e4426fed5aeb508eb5d016b3f0dbe04cc6b9a871\", \"750020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac916920871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363a9c58bd41b8fc2379fbb89e979f65b4422719c0e5523b14d43ef7b58bc771b6141a604de8df597194a64a0393f98cc7dcb73e0445b1fdb8f7c5b9743dca7dd300000000000000000000000000000000000000000000000000000000000000009c334e28a41046a614ceb75041aaa8c50b3d2a63c6e199d1a52e17618ee578baf20b1a94752e5511701c811d8863fd07baa3bc138935a9aa0da4c40ccd50dd3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff33513086926ca65d1bcc0ed5fd54f0689e45ea12db577c49ddbeb7fb43895dc05fe8fc5bb3a8eb867f16081e9ff7aab4d1710b464ae04eacbcadea3e96deaa6db251d6000ac52413b8fcfff7ee8cf2a0e783127d3174d4b0c3d18b89562425fe50dc011f7abe9c52b51148917e176632021610f66786cf7eb22e578e382f5d8d23fd60d9f80ffd76c86606ccc070913271e3ae9763ecec8920c600546263f1dcb5d780805fbb369415a2df853983e46d2bbb7de6af62bdcc1630a3ef74128fab29321d4e4e64e89faf895fce335166a483ad5ec640d21f3dc9aeddbf4c594ddeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc129f5a01833e6f687b8d7acb7a198db8c9c6219d9d9e3bb04eea564e9722b2bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5376d1fd9eb5bc7ed5f740970802297606290f8f37c225c2d56c45dfd2e6b2216e069c73ce93231aeeb36f8ec19c13d481d4f01d9a4d1da23ff324a7a0570fe5cc68a4a01876e525de7e7cb051ba59788552a64f2653fba1ab2a5862c0786ba94a406f5d2c9bf7176b77884a7beef7c28d71927f64fa010208f90a29e6799245ba64a3b0e8a7a4761d9d26d99b9a31edd5b957f99544d69c34a1f500fbcccfd6683087cfbe73f76bd4afc2ba12238ceeed9d84dd753404b6da4208c999aa5cd70000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff489008f17c7972c9361baeda34a36d693684286c266b690add962b31e70e04f88683fce20851725ae0c5e6b4e234a0ba7f9ce1f4f167ad2a67459773200d227ceb346fa033c86bca2ab196f3d9a277ff388c861d6eb62922f27c51ccb8a9515ac9233b1e9b73ff54d05436db65ee331970b47db36b384177a6176e14616acad5c397125a5fd584d44faf56567216dec2289faf20a81dd2d3c462bd2d16d3b6a3b0067d58d044ddad4bc6ba80633bfa6aa3c1007d2d9f72e9a975c5f3b715c0baa9ac4db0116efdd97b24b49f296c9041697ac511d91986401bdd1ddddaf461dde57dedd0587e36469271958e71ff56af782b2dd92340df151716636c42b8eefb799c3c66c1c579c0f0f16cbea9c8bb5478e0bc79b0c66714798e9a9f95a3480cbf25c48716c0c7c3adfaf1388e411ab300f1a46e9600b2871d546ceb556d8f82ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb65226b1358c415f1ffc2f1e836aad1406ad36617332fd7bd26e688618d9d1200000000000000000000000000000000000000000000000000000000000000004f6b4fcd8ed4389c0c016bcfc73e722ff2c65d6bbb7995453a88f1b68a0776d30000000000000000000000000000000000000000000000000000000000000000425c88510c0fa6d7bbbe212f5347cae05e80400212515cb35fb6c60db3dd1fc8ea7f5252bf9ed9ae8b70f35a93b421ef96a8a90684e016695af5f35f1be840966ed52a2f8d8268f293b666f6f7d5aa84a6aac3b3b1b80087b14bbfcc13b0333ca86f15b40294dede979afc3e173c68d45e38f7197a4cec150a9d4e5cbe441d66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f421c128db20477f4d8b18e4af2cfffb92d01f8bd46fd88e4ce69d41252731e0d0e50c2c3729f7be46608d0334d5cd7dacbe28801502d31a3b18bc7c1a1e65fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f642cd6eb08ba7b702c471f5f14c176fba15056ed0fbc4bf77626d64ac3df7cd152295262efbdc1502c9f6d815a04a67eb1cd0393bb4c5f67e1287543a990d8a549c25773a3b30a38f5bf32ca94b5a26c2eb1c78756bfb210a8b3751f46341c2d7a7bb1792b15814c782f6ab02c7a34c534ec00563f34ec1822221a0ee6b7df46404cd4305a0820cdc24ad9783542060f3c033aa489f191cfd014fd227a056a34d0d157a1b71afe486f707ea2d249ca1058b7d3a7b6425c4d2393611ad1d713029e075b5bca6f59c6777db817e96677c5e3626cb35248a4dc2f5d905f7071839ff0b8c72b268e09099c620c2f720b27733db3810b619bec5dcdc11edc7a0ae7867d4da97da20fe8559412ba979c238f4dabef763b01c01eb4750d03490c5bb97c130b7b13378352f912eb3b93a5d722c0a912b8600898fd38202e24ea55152eeb00ce84d720d311b5627fab1f4fab7f524bbc51b1a164b81164d54c8f59d6a868df0eeca945bba6643b776bc7f907f2d9b76186b6876b3bd714c0720ca7d9f7ffe4bc49df7e9fcc86a3e3effd7827b57255624f65787cbb010d4d23c23b0a47e306b1f0458efb8eab487be7e5493f2c193660054babf701fcba9537466a092a38187bdfdb079bb9d7bd4be10adaf2b07ce9c9b807da99a11642831849b4c8f0\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1df8c615c5b7d5080d1019801137bdc97c72d639",
    "content": "{\"tx\": \"1a1da20f038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c496010000003477079360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127029010000000b0db5c160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700e010000000bfac8b303bf195b000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487198ac73f\", \"prevouts\": [\"ed513c00000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\", \"fd2d11000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\", \"5ac90f000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"4830450221008c530efe6c078e627fc8e56d518195b4a6cdc486b85831ae546c4d935b8db6a8022008d2f9353e940029a8a96fd8568578bfc9dd8abeec91d81cbb6f4b0b79ccc62602004c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100a090d756e9f1ed649b6ef69b8d83da87c604ea10e700ad0bd9547163faa215fe02201be9fd953ca42c83e176a0121cb17c70887afeff4b550e2c6aec0df9331e64c80201014c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1e2b8ba68f2655f0f5159ba8ee446f920bd6f384",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6900000000070fc07ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf680000000062cb832204efafcf000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2c000000\", \"prevouts\": [\"0697650000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"24df6b000000000017a9149d4bcb1ed806c9beed692a78614f8b90a68c708187\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_50\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ef1c081533d72348c49b6dced51bf3dbe9f33e3a18e76bea3a51e8e9558f908ea49b2cbbabf6cae85ac397dba0cdb9971da85a595f57d236e6bc533d6fc7783f83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1c068c111f27015bcdc64135671066e2c873572f3dedb5187b98592e47212079a9e22be2dec9dd33300968d016a93d51d6d0074216113a69215de44ee33f0fb550\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1e2f14f392e271b5a594679f83b4847d83b8109a",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41d00000000c6f337eebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1f0000000004cc6ffa02a323b300000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df979722368987074dfa5f\", \"prevouts\": [\"ec8d3f00000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"768e7600000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090289df5dfe666d2cc917e1f55821de1ab143027be0f2ab94845395685182a511a4fbd06f6550babaa8e15cbd24d6090a762ac41e8fd6777ee121423f4ab9fadd448061d721e9614ef46665752ccae11ba8fb8b3e0e8635278d6d1a41575350502d3532aced57cc6793ba7b319de455086c750edec36be168460493ce8ab3b4959284f08f22e5455741738407ea852b845c813effc44941197c00d9cbae33c2a21790845a760592fc96200e7b9f4615e4f65431e19915a5bf9c397b116ce39cba73edd44e22dbc743352ac7715af58be0791ff7ca80f9745a5ed24d555dde57515806c23d55582ec53a78cf66ae28835200ddbefe49c6638d6e4ac21951af73e631a24b39dc18f31e4e2f1d9641591faec6e4fb5235020cc2020437a11110d38a1f5c64cb25df9fa762cceedab2a362acda54590d2a7b85a288d58282b238a225ae1007afdf53e71da548897ec153586a02273985403754dd9b138834e14ef64fb64cf735a2a0a17854149e7187c00cd216f40a40b7712f585792053349e23fed08c9e0a7d4c9a772ba16396a8be3d9d93ed09296f0e7e5246f224c75e33a0133b5d42eeaba07f288a367dfbcca385b7ef9d4e7ff9e1d0398d7a543691261affa79c5b18867b36c9df9a813aa07fa3e5b8a6cebbc5e1b7caf968837198d1d6563b94c42464bea000a1eb4b8ac9f1585a8adf23ab097311917b61d777514e51709c46abde176591b5f1f3775\", \"387d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936db3476583035a6d1b88195251aaba7e67b83c65ae24581826bcc4112443d611c9b60e5914c50703ee8fed26b085ec7bf74c965cec3b126e70865dabf0c3179e2a12168afdb4ef286e7748ddb08cf408d85b089f504486378d2bfb535c0d2875b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902033937b9697af058a166983e989845de94fd06d6c9d4e471685d7514abe06a1f7b44e0e957743d407ea3b60fce90065c8a69f67553571af6e56d23ebac3029343636cac22ff003874c61d825dd304a5b4eb7b01eecc990cb7d6c7e557a028700944f802fa0925ca5fde07f62cfe3a4103407279040fa481a3f7a8a7624b1467461abe9d43be8e2c5b350a094a2e21135a130be57e1b8d0d0165844055a60a68cd4ee92988958cfb233f39a1bc19ce82db3886b7472b5343eba62d15cb40cac2848da8082b76e09355473a7f986257ad0f6aa09cdebc338b874688b9e123d1eca488fa7a21bc2f1b277af53a467efda2440e583114274926d5a534c08a32652f9e752cafac51892ef0dfa4f03fd75bd9681254cd5d2fa7109b78b3cf876db2b014129cfd6d4233f265ad45e8a9da8a3f10c76f877bdebe043d1950124bcefc63a3533481808ed912ed38e0eb7f1d1ff1b7c1feaea1a6dc09cb7a6b287cf2cbb2d43d5cd702c17d493be3e007a0c8c727ae57bc7e743d62a018985e2b0102cdfd50e4a6641993b6406da5b3bb3b55cd017731a74ea96e041a25b66a48cac438174f9ba6704bdcac41446e98f9e81fc9473d27a18e6149fe63b187e814b0d14cb104c8d6f0a0b468371e8af6ca385b46067668053107ff1429326fe98adad3b6cb9dfd822ad3162ab16909d987a0ef69448dcfdc5ec6bebfc02e4e9ad4776d41987b031bc5d4a361a1fec75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365bdf44d130d48ddf5aa080cbaba430c6470780414dc9784f104c605fab81d466c542915153386019108494d00e6bbd0a8a4ab824ea9158d8694b82aeea9ace0ff7118923d14a9704f5c6065ead9bf1df659362e443facca38f7fc54a29b18e2b8fa601fcc68a78472d280e0a6f10ace0c22dad9ad93c154f995d1132d7b2f793\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1e2fa5e498506cf0c5adee563fba8cdb0900cb86",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9a01000000b5f930dadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8d000000005ea06fac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127044000000007a558cdd0125890e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7b1000000\", \"prevouts\": [\"5c0c570000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"7bdd4c0000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\", \"fc3d0e0000000000225a202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902311e76f30cd86bd8a8820920af5ab36e6884f47add64465d23defc7cb327af1f69d1d0ca4e9b1e2368af7128794c2cf73ffc8f78cb9d12fa45d3ba838ad135a44c6344ff062aea4403e91b8bf9c615f45dc7a2dc87ab8d0e7538eb20d569bfdac14d72c4f9cc555556c04aefb1d04182b2ef05520cf474f7a8f0443ec286dadf8c1833eaa6f1ff5b8dc0c2b202311f4725f8f06c9394d33b2a9cf82d17a5cba6675aa8561fbd22086737ab6306291c2e0b7531ba268c30ca69b2bdc1cae06655dacd427cc8c8919249e0c33338c45ff004126d0b2b782ab1af2d0e82085d2a1688cbd6fa966627fc2283108c48ee1ed1a777ccbf2723701701f01bed96a5906857e08695a7fc4150eef75ccb1f7df5c7dd8802fd40e09e9006bafc2d44d3d06842700bfa95863e667a6b6856e614dcc829b1690bd5d5593a7349f906065d8f85ec4d23d0fa8fcc6fa46519163627f8da5c94ec01d4deb6cc1e8e823cae233776bdf47108d142b0b9ff2856a4eac6ed2916ccb09db4cd6ca6415a052feb625494bb1eabcfc555bbad3a01e43a17581ea500c397249b14e542efcd04e394569f2e3f4b8faad28e28598f384b917433ccb9cc3ac1842c07abceea267b86c33eff30a2184f8c8ff2876b8a785ebbb4b461eec6afb1c22083f65f7dd384f53f8c3b7c4490caff14b1eded19d8e967b77744633b9d9e70c927ef17bf841447113603cd34c41105d4e9bc342f75ef\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5170b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d865720cc28207c7af5a37f80d9c7bda068b6f89abe5b5cf72eaf80ed3e31c2f1c9dfaa6c6fa26e4842a5ec51b34186b71f91671a7cf578e5677dc1f65db5fd4f943bbd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902352373deff6fc3da049f4124623a135a6453146cbaac9b4da0cbaebef15e339213472c31bccb69db3d201c31f28b91cd1878f7d76f2339edc48b0c8588a521d2fb4ecbb2d4374c8dc404eb072a9b46a0506a9827d98ae409f590aaa2d98edca01188e76b3450037b3518144475ddeaabbd04467d32371dbe579a9422d9896732c308e9659717f2b58abebe12250105b35b1dd56bfa3b8fc42cfabb343a38e934c80cfb66f8b4886b15e372a9999ec4afdcc9326b89e77a26aa4dc046020061882aed4623aac49d20d08a8ac8b8823c223e9ed68f5014179a9cb112cea8b255d6fe471f1127f28a269b9d40b14dd9862782329fb6d7bdc259d3cc5cf980c842551965a28ec33f715af105bbea7c19ed33f5b335927676a0a59d57577c256f4d5ddb1659e9c52d496d5686f08fb18a4a83f7aea273851751af42f1756bab592bc2ff33014dffe01b70cba23b501fd86c083ffc6fc0a7c92477642a62576b273613835ab50d243e82cbacbfe88b017813779804d62bd346faa016e60923ca626517c56d2ba0092c0e4db8dc7c4dc4fa3d13685585fad0d374677eb6cd708dddcfe9c7407f19ea2a0be5f4859a40b7352c6d4fc63a929b1ee055aac4ccb160dd3645ad39a5925978e94a7ad2a630f45e6b298804423f5a2b3470856d5ac98fd7ab1d0fc664fa92ad180898fb2f5d92395cc7fe1b9f5b0c8196b4bce59ec33537a524cb88a75337c60f8f8c7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e190840bd75c8ee6dcc19a553b4e3bda7516a8577ecf1c365a05a7b0ad0f101a1c215b4c606cdda8e0cd0631e1e6566a3457cf9b2eb8ccfe9cc1918e65b703d3f7cd241e6bbc5ebedd8f50ae206f1f82a1e41ff5c139455a0ddb0d368f52a47602\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1e32a9cc12b73e8a61aaf4c846d1cd0ffa78bf93",
    "content": "{\"tx\": \"e4ba8c7202dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c69000000005862f3e0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcd00000000a6beadbc02bf667500000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87d7010000\", \"prevouts\": [\"d38156000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"608c210000000000225120242fbb4e68c81dfdc905839a5aa96f20c82583acd27e1bde1e06ec2a83f43f26\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/oldpk/checksig\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b00c0ad3306860ca44abb8145f06a470bab5db8e74e2ee20685f616131eec486251f6e958508eb5630b3319ddb7a045d8393e63e7135ef2702230a82aac89c89\", \"2103871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368f39a0868157845cb7ad47461625d394fa6e029b849baf79f532c059eb0c90de3e8a461a0f368c4eaf94de3746540889bc99fb0c1f5702a0984aea55c9bba1eb22670c87c91ee1fda6f8c1b2dbad04ae44c07618f7e68a5991e1d29a00ee01dec96075c0438de6f0216cdd72c8aa39ebb45de420e1f8e51b4e4692bf34a2e56f8158c8b95398c311670004bd9a4afbeae52e97235779550b29728e38cbd58716465db9b66632241155b259b456613f75f4b6110df8d845f1977a6a00467ac0fb2de7e81d2fc1490aa9ea09216c54370d636a110d3f6d009a2836912482a02ec1416c54da450879e4fe6a281fd904df5a47457cf3faf8fff1fc7cefa1429c1f837cce0c16b4ac2bc0a56a4da93975e15b81bed03d043eda7c9ddac9d51a909cf984b496ca51f1d59b029869e88466a950803e0b1fd0201aa98a66ad53a0d4a0c956f68441022cd3a444817edbae2583eb76683b8480293994d059289218f0d4a79d976568d9e92c4f00b9c8d7cf447c76042a3234918f31ddf63c43fdd94d6a32c000fafc31f95a626ff6b47272847de898d0fe9392d6cb40a47f54dc91f8f8111360dc44ae3d69de3386cee559eb49e6c76a737e105f9117431d64c73a13a31f98b35f150399876b232678a58bf83578dbb2c055ad176d56177c4ac303846e798f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6f0391293f93ead6b26939209e234eabb3081854bffef81e74c6ba479b736d0c96a9bbe884e5e6c9c8798b5176a6b0410879165953057fe295a782c7faf2fa0b\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365cd2d09394ee01f4cbf453b8e43120c6bca0157ff833036c4a91161ae8d6db3dd3595e47f783dea9cd898c640c1ccf4b7d0ff5bfa4236f535dc6b4728299c1d69fb9e9eefbd8dee3e5857c0a5c3742d0e58764b1e6eec73b89290af63b7ef8123f752582a11afed87b1aeeab00a91ac5167325e0fc3825def3a8307d2082c1acae8c13f957496bd85a8bfb196b41115877f1c292877d449cb5d56eb109a1f8e695176267bbd1b7867e2eebc439e9f1978d6a17134b75a8bbf0107687388ddeb5ca20cf31e30816ef7bffd0e43d4efa6c46d11185474d89ac75f693a7c477baa289311c864108ea260dd739a7c927abea94bbd3ef2fa436b5348a12a03476bb9e451f31f95136dbefe9a42f2bb6868f993acae25cfce8fc0d73b984508d267a487b041864f4ad19f6b2782b89895068e96969bc0c0cb50b64c3b84612df4c73208c4bcf6cb070e67449ea1a036232a8155856b27be4c634558db013e06b79c26858824757e3ab18b9476867ac69e63e36877af9fee4aeb519472ff5a504bc7e1bb8a70b57e599289922abee7f7cb3f5c4b4e0126255c9af59ddd6c8d572a0551d9a0b10fc29ed9ec9ba811a78159d56d191855f20d80384a7f598d54defaeda75074e07476023602dfde1c8d0d124f96edbab4af8198f97e6bceba6cad7de517a8f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1e5a2d83584c4f1ccd8746aa4cc87f3b5c520e63",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6c01000000caf387b6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0701000000d913f3dbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf000000000d47bb5d904ec5a0d010000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acef05f434\", \"prevouts\": [\"5591730000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"a0b64e0000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"88954d00000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"624c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f393068994750671244e9a386d61bbc7bdd03428d67a6b3b3603ff438afc80a6abc42ab3738335b78a2a7135de763706b017ef32cb75bc24ca1210f74f6e5b7b3fd119d5a804161d41189f11d8f3e11243ae602674c5e73f1686492aa1f485fe\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5262\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93623b186fa626e8512a5fc76cda23f4a60fbbad4c2c958c923f9740c685dc8fa339b124451a95f66d328740c8f74b6bc79ec66573930240463dbcd03d8389735ccc3a658b9783cc0a28fcc02932d4b85eca4f49aba0b4fac0b36a7e3a0001ff4113fd119d5a804161d41189f11d8f3e11243ae602674c5e73f1686492aa1f485fe\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1e754a40c050fe3c356b0e253ed22633f2c5edb5",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e800000000a2a1cdefdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf5010000003ccba3d9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5100000000276aa1a901227028000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787240e3c58\", \"prevouts\": [\"3b470f0000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\", \"fb0b200000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\", \"0b2527000000000022512067225551b50f550878fba08cb06856b99d76e57e98d7477f94810d7b1bff9dd2\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dc50a39cdaeebb2a650cca1339da469af920634404b8985ff645e07812e34845\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a10616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1e841722ec03b5be4c1001e90d8019bf9e01d892",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703100000000aae7c1ca60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127001010000004823318f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270060200000039d291e50304902e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e70b3b865a\", \"prevouts\": [\"076b0e00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"6753100000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\", \"176f12000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"b17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa6d4441481b861885f5ed94900bbd5862c55ac99196b75719f05c0af3923d20525bc912f5bf4aa2c9ddbc9747d59c78f40d0a0aa0a8a4f22dc70e3f9cdb9b6ae3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d5f4fd4f38de76daa30397659fc5eb995186dee5e848d8b406f0f064ef43f0c2e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8d9568d9f877f6ca0cee9df3d4970d26d0e286b65747316dde3c995de6e71d9f55bc912f5bf4aa2c9ddbc9747d59c78f40d0a0aa0a8a4f22dc70e3f9cdb9b6ae3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1ea62bf92cf8078007e5cd279d0ac921980c1395",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3501000000d42eb6c660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ff01000000c3ef7ad960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270af010000003e9053a503f715690000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7a21d363b\", \"prevouts\": [\"1cfc47000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"edf4120000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"94c6100000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5120e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e18e3807b59d4390aa508570eca32c61fc450dce8c5cf98deda801e2e8c3fb4b07491431d89488c08702db3cd2303e8a25c8ede371a8df5f96996e099ce5df632e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368ed9bc7b6602c1c15305ed2f4c8ec9cbeff7f3a1ef2517417313cc014db5fff98e3807b59d4390aa508570eca32c61fc450dce8c5cf98deda801e2e8c3fb4b07491431d89488c08702db3cd2303e8a25c8ede371a8df5f96996e099ce5df632e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1ec26ee9e524029b8cf64e318125007a12c085d1",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fe0000000085a123a1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb8010000002f037acc0296cc62000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcf7000000\", \"prevouts\": [\"d9ef3d00000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\", \"f66a270000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c84c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93666ea2a418f0de61648f1846bcf7f8f7eac0e21721710bf1aae8a61bff50d06c920e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1b553f13873b7614c747e02d52f281322dd98cc8d4ce789920cf593b75c6f05693959a095ba405700a8bdcb88c47f737d45523ad768f5b3698c80add34f2e764b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360379d19db0294afbd483f2a5266502c79758d505384d45d9b44125b08f0b0e3c70901b40dea8c7a5ffa56ebe32dcbb2bdc70f6165f45007f6a309c26f1d76d473959a095ba405700a8bdcb88c47f737d45523ad768f5b3698c80add34f2e764b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1eed48f62357914c0650cba567a06e37071db51e",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0e000000009ccca0ec8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44301000000298165898bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e700000000f154399c02849c8e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7966d030000\", \"prevouts\": [\"a9371f000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\", \"49f43300000000002251209c5a589e416b2bf8d886ac38373c12ee12085629030d3f34ed2b7cf34700cf85\", \"fb803d00000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"107d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936acc696796e153717ed5a6a385f9de8b7611279c250cec566122acf9b81ca854846c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fada7506a3091a1e28dfc5b9aac4646748f840add9c91a317c4120c5f1dff96d2e4520b5ceb13d27db1b37ec8ee9ee9482aafd08fc62c5401b1fb7c7b4ff374c3d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93630300b02e92706ec4fd7f3b61fec60afc7cf4f75cde7fe0ccf1bedc3ed3184dadad4d220d15ec254ba214a445cc73922794d5f92559e27b8850a422e98de131f09630471a62c8657382c38b342878f0042beb3ba209e0ca1417f9db2e3d45f6dbd940ade039b405c8439b762bfbc73f9441ef227e6f687b6d94ebcbac32155c7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1f06a021e51a7104e4b8be0ce9c51232c8fd6c77",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e601000000f77c8100bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf780100000075a884cc0355c5ac00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd9000000\", \"prevouts\": [\"6fdb3400000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"f282790000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"557d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936140d24f18a3c79287a65dbdab01f63e645309929f2cbe7a876d35f25767643489c6f5bbec45690fe95363697d7c9a9077046b35079592ab1dc3c0638990956b6a4c5d50721208c85113b157b4dd4688510f63bd33d4c90ece0d9e0afcb8224b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936410b6b76a639e4f4cca477601870e8f5c1a65fec44bb24e64b1e09572c2ddbf52a116e3d98c0753c1b4fce835beb402fe845fa277dc01c5b4ae7ac2a0861d05e2d0ae3a8a51f8512ed3183c6b189898e3d13807be8720838a97bd7135cdf46e7da77d1c2cfbe9569ee5db2c51580a9857624040db9177af617be0771cc5b8a1b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1f21715d338b4550c3e7e74321d26de8853626f0",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c33000000003fb3db2960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708000000000f56cb0cedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5600000000b56ec84c033b18af0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac87d19161\", \"prevouts\": [\"5469470000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\", \"ad4f1100000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"392e580000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"84\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b09f12ec1a5fa4aa343993f316f0126821d68bdf7911bc110cb6f7136d98f163462b9d29a734e556c6b2d2347029c074a964aefd93d416389a14ef3ddb3da113c419005ce053ef5676128682d79317eecff4f27ad8f3a341c1729484208650bf5e521f6248097fdc64ff5a0a6cea9e07e7c649e93dab8ac6058acbfaf1ad70aa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694086fc36ff4db5fca7b596fd90c3389887398c2c7f02b2c132cac3937a1991e1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900459910ef1376b2f57d6157bb9e8c31b4bd4b9d07432c4b683bf27102948dfaafec7644b3dbe2d9311c88339dffa1c0be80a46778a5837645266f0e84452a246701\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1f33b328ec921a865dddc299139161f27b477147",
    "content": "{\"tx\": \"997c8d6803dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb000000000b13b4e848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fc010000003b13f7f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf4010000001bbc0c8c04cff9dc00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4870cba8322\", \"prevouts\": [\"4d2151000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\", \"2a41350000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"170c590000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_cd\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7c020ccdd67522f4954f025bc3c4029bf6164a536a8eaf2fab9499cb2b9b3cc802e223354bbfea41e635ead55aa4dc3b26215de122527204b933e47ffa7e833902\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3a28164e5b3e874a2836cbef678b40dcc4dc2781d1a67213d7539de84f36581be89fb9bb78c03bbfb4c487c0b5efbb095eb70616f6f5b0a7512dfd5f99d9c262cd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1f59389661d72064b929ee2bac0a3f2782c99fb1",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703e00000000c3348ab560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707c000000000d6403d70465f522000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a67f64dc44\", \"prevouts\": [\"2d431200000000002251204e94ede8d65c6640c4e6b607af4038eeb61cf5c03f43315636aeaf4bbf4b4fcd\", \"482b130000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_0\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e2a5abd0faf03d04bc444eee9e8c8eec00144ae37a2d3b9401bad6291682e856fefb6736fb76aa669edc33000bec526f257566c9295c3a2653f86a32461895a1\", \"efe555c8f4b6a3941cb6dce8d7c8400922fbfc61c5fdb2d0cde49084cd3996329d7ba79e95a91d2cd4dc65cd1b2a6eed8ab75d777d997e4ba77b10357d95d6274a0a9c248234c476c9e29d0509742cc1df33adfc6bd8ba12bdb0550ba0479f5666a7a08b8be84adc934b049530fcf55089d12c2b99fb8a5dc9e3214aff70a6dbc18e0e520de477bfa4910cdcb7f9fe675163492c24b5ae253b1d143f22ce8a4ec08aa32edb96843be21139399feaab4242cd48505626f7084f692a1bdf71a4801e2203457fe527f73440e21e25b2a1c07772c579a116193a3836aa4a41ccf58af4eda33071239c\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff10ff8ff84e2c74b185c3719598e68da490345cea6c4dad36e38092287b147b2bf95c996c233af882906f9dbac1ade951ffbcfbc851784c4426c4244530b53a718781d128360fcf147d876726c34cbb43628eaf8cca219716c2c6c399cebcf5a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e2a5abd0faf03d04bc444eee9e8c8eec00144ae37a2d3b9401bad6291682e856fefb6736fb76aa669edc33000bec526f257566c9295c3a2653f86a32461895a1\", \"04b0c465f4deb7c2f40c81ef09ae86a825a63529d20e6890ccf84f57486afd6dfbe76d6b705ef0446b5da688955e1cc8051702612f445b32e916714da815ba236228459751a0cf9bf26bfc36d1d08531523acc683c8cbbe60c0d0c85e7b63d17de5ed6ecc10b6a23383fac06e92146a36874a968904478e6b02ae0eba2219444017be61918e25839a19230c345d0785bf0fb6ee2bb82813e632c3fbc336524883520a8f08c4591dfaae7a2cf78c8c543ad22e8772707ad7ebaff1c34f8cabcdadc193f1cece0af97125c97b0c4500f9200b9a0f623ba61bf84b957013ea601359c7e2c7df8d1\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff10ff8ff84e2c74b185c3719598e68da490345cea6c4dad36e38092287b147b2bf95c996c233af882906f9dbac1ade951ffbcfbc851784c4426c4244530b53a718781d128360fcf147d876726c34cbb43628eaf8cca219716c2c6c399cebcf5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1f7d7d9cf1ac6252c762a06bdb35e619ce77741d",
    "content": "{\"tx\": \"d950a147028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4710100000088ae7b8cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd2000000002feaa9920273d1630000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75c917233\", \"prevouts\": [\"201d410000000000225120682cff718d7cbe051bd5beaa1ff36d3547b88d6d4bf403f10c1645a08d942ef8\", \"4ae5240000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d54c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365edec6927239e37481c871e98a308ae148761fbd82cda43b44eea2241bece5c01ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045135ed0e678ad02d8eb601751aa1b9acf14c9c27e67d62b009394546cc2bb02284b0fe5a2ac2c1f7a0cb2705bdbeb7bce3dd33edb4ddacee2f772f92b01147433\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52d5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e134849a28cba9aacf50a598dea57ce3ca224575357c4c8c887db8ba6ff2354671f69ea04c091b2bc3b7c7ae53ee1804d998a6447fcbbef49abb62b7a394c4c123854b8121e0ae10d162a4774d9a1b75cd5b5f6f9e51813910e8b7b5db2ca997d7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1fa141a9352d1d89d10a4d09abf044c9506a4bac",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1502000000ee042eca031c9649000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487a36b7049\", \"prevouts\": [\"35654b000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"657d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936642c359003ab8821594404f608687349fe596e5e62fafd127e5735207b1f199b7fdb01d6ca2155f5be7a678ca6a1e1d0c436995e81f878ed9c74997cf4fccddd302781454c6297f6b8a579760f4d591c0acf84ff9d038b064bbab8a5d53835db\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93611b7e6af417d224a1457ec19c3d9b3480cff6eb3dd58882614542c648c838a9319acac53f630ad836c1252ba923d9d3235c3c343fcfee9c8733d292c93bc64142bc2c7d802e8c870cc0fefcfae9d23d316cca1682651be3bf62b663d5ddaa443\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1fa4445b8704e72f4df267622d688919d1c6a44e",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc9010000008d41693360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fe01000000b3acba1101460a090000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc89e64f5d\", \"prevouts\": [\"b00c260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"90ae0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_99\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"28408300b104b8144353cde3903f49e2dc94ca991cdd9211ea108b6b85afee6d4520bdaeaad36e1a05f2e13b2c24571febdee963fe2d391eab38ceb154be36a303\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a4af46dbdcdb7f5b33f16bd681462da43c41d651e2257d815d6c3620f02498b5047564ecbf2a9f08156125db0bcd62f6cc00466a392449fe6001d7a8369cc37d99\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1fbfc728d51680fcfeadde2a9e6fa7d1ac3996ec",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be3000000005ebff876040f9920000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acf3030000\", \"prevouts\": [\"f5702300000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936070bb467edca609e1a3246a8ba31e6266509d0d4e74e5fb2a32359b5f156527204d1c6645dfa5bcea0755bc1d945f129b754bcfdfa4df703b30809220c35586032cb43424d7ca27a7abc5fd0c2fa249f92b1e992144deb3864a86d466f79c2cceedc10b0e9ea9319d9c2157dfe80b60aa665931711963da9ab109764ff1ab789\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93672fb7b0b8b9d34fd164052a9d1d97e8f2f76026babd1f73e719809b132cf1e5b464f19ce228e2f316c50129d6edd6267acdc0242055b306d7ddf31bf4be6326132cb43424d7ca27a7abc5fd0c2fa249f92b1e992144deb3864a86d466f79c2cceedc10b0e9ea9319d9c2157dfe80b60aa665931711963da9ab109764ff1ab789\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1fcd778862db2069278171a2ee940bf756a2bdab",
    "content": "{\"tx\": \"766d60d703bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1201000000da307bb5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0000000000def8accadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba10000000099eb13d001d42a740000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72a040000\", \"prevouts\": [\"f9057b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6272570000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b92221000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_f0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"89bffb1a58ab6675b495f7914fd34c4f41c87b8e25f1179000b0f67220300bf45c525d2f486e738658fcfcff09c3835ffc31aa30192f76deab72fc61f4423ce2\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e167ccec3dea0b6f348da1b70a3c5228d3fd0fa9e38d384d0e75a377cd793c649ee920d7728ab8433d98912fa5b462d21647f06116d294702f86739ff9265cf8f0\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1fcd7eddbae73818ef08042df1c443c53fab0c49",
    "content": "{\"tx\": \"d9cbeb5702dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b06010000007bcede8060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706901000000a3cb8e8102bd1e2b00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acf751961f\", \"prevouts\": [\"eec71e0000000000225120761ee5da1a196558fc88c883f4c68738765f8bbbf6c28fcf877f70c5de6e3c55\", \"e7850e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f467d3b2e53c0044d956650f0b6dad5c85ca4976a3e1b41bee60729426076047\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a23616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1fd0cbef8f091c8edefa214a32625302e2f3a6d8",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf81010000007d91abc060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700400000000377d028060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270550100000075c420dc03d8f996000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4876c030000\", \"prevouts\": [\"daf6740000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"cd0112000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\", \"923912000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063f068\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364a1e8360ef905c29a22b948ad2d88d5f8aceb0a77bd56e2a8ea8c44b68d550acef05bece11fc4259c24dede9b1787a65bcee91937b36a28d108e88384141e6c4419704ddfd13dc63b1b4156372563d65f148a89e112fdd9cbf47f8afee5da0a9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360d1c86e323c4ea98d64ced2095cdf418b8da11459ca8cc7d768d85c68c22e03bad7df43f1383df9f0df0a1e0ce133acd14e2258cbe9a702da78bb61f4d1a9bc80eb43d08761fb76661299d0344fd2d8bfc7de5e7c6dc622156e95971f4b8396db5b66a7e788d7f4d892aefa7b705b94e6e3402f32316550d3b683ba5e55fe37e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1fe16cf825c0f639b3abd120fa85f9a344d3e514",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ed0000000005c790a2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6c0100000018167116dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9f00000000e046d60303b5e5830000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e74d241b32\", \"prevouts\": [\"69900f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ae0c58000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"92f41e000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_23\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6afc5bf813b1756f0a1d5c1f332c15e7a736be9fffc76358a6a1ea00c2e16626e8ba688042cf4ef627e6717c631b6cc0260f4b21e7292ab41747c7fd2aa61ed181\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ae0e98a4fdc95b2953b8e4f09c33b6c0af467c60b4e3f1ddecbd956fa505b1846c57bf267784e943b3c3bbb4786a139fb1362a4deb1f46e2e9fa5161f87fde4323\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1fe6f643a391a7f73e3577d1f4e57935064e1c84",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe2010000006a60a6e6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc700000000333905ed029b4e95000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748789e0cf22\", \"prevouts\": [\"f9d2760000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\", \"ac4c2100000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"844c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51120199479ee6d2d4c88363683365d3fc0e890ec8511afbf0335c75bda2c0295827135a2a7712dc4ffb0f490ef0a9e18994dae8053f69b06dfd6a349e2375b7df7644b3dbe2d9311c88339dffa1c0be80a46778a5837645266f0e84452a246701\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363a081beaa6ca8e8a38428233ed41ed0af84f710aa288efb4d17e1b0b9546cb4415f8a538f68d5e42651660e8feb349dcf42bebc9266cba18280404d93052698127135a2a7712dc4ffb0f490ef0a9e18994dae8053f69b06dfd6a349e2375b7df7644b3dbe2d9311c88339dffa1c0be80a46778a5837645266f0e84452a246701\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1fe7d8f0f7839c475eb9dbd113d0ac120b1301fa",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2e0000000021998959dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd701000000289af2e28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49001000000cc78bb2b01117a7000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acc484a04d\", \"prevouts\": [\"5bd120000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"0a98200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b4ba39000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09029140b18755d55c9ee068ed4156548f810024a038b43525e32e1b421b547d3d4d8bcdd02ab45a5caf22e9992a32cb479fa0992e8222a33e19beba472aaec531b9e8eae3539feb433fdad8fff4f38e7a14b61f65bf1ee5cea54d6bb990dd8688d44b68d23b3dac549fef4bd8cf52bcf6eeb68596b99db64a25ca9550afccb9fcd10e7e6b139a5521d766f52112e64e6094e2461ee8bdf8614eb0828c34a0f5f6ae4e104acc5964a18d6bf872be09546b62831ae744b664c9755eb63321ad5c8cc6a35608884cc0e48904351a50485ae61b7f5460ecf5916aff0f78970a7667099ded8d90e3b986e0354c66787005512c85961fa016593663f6c08f7f4f9984f13de311e7997bae76112f6947058e9501cc03d88fc2210cb34aaa83bf85c3b8cfd7d3fee9153c4e90952644210576fd3af97327926a1851af63122e616444a3a623dafc0141a48813f658f12364f19a54f7e086013768a1ebf7532f3151062f25e34e24d54db1ecb3e64a063b1fe91eda41e1693b9e33b226ac01b1c848a4c80eb20b87d2ed69c00f6e0acb7209561acbf2785afdfa068f66c1d576d3f4250e4b29228edddfc88ed76935b6c10732c3b31d206d156835fc6809159670e9e7e18690c8f35b190dee2bf3ca79afc227b98ef960ac5a45fea9325acd0924aa3de3853ab5b97332845113275b7482a72c1967786c243c34897b07964e7f33949d73065a3a8f57b7c0a463a8e775\", \"bd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364ce5ebf1d1f724a0dbfc9e1d58a876a2ee5271b366a0d0a4478f52badb0e07b5f248cd26a95289b2c5b6dcbde70ff737dd7b8c2860adf4f4d2fc326868c95410d797dd6acf95c24b81e793c9c81b0ab80d381fe8deb935e4a90684c96acd4587\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090216fc59cf9c1b85b35eb2d3760023cade92b0fd92fe309d5bec453763aba2842b3833b7bddec0144ab6ee045eb22cb2dd078e044b8390da1f71678b836b46376905a32870b36d3caa39f497053c65c648de50b8d9f05f0c54d7a4b74b4f76421b99468ece4e5602e290d2bb921317383feccf40b3ecf50f68ba847e0c4c7ecceb2597bde0a0d12fdcd341bcf553527238c23a884684380eb69004b089bfd64945b1f1877b099e2fc6a8d32e75852660e55153d2116f552255cbb04efc7d55de0d58e13f4dd742c003f25351caafb0c613cf9f3def818321f557ff5290135c8966b135c1420f943264afa808d903b9cb9a8bf2a165b656bfb6805e396d865c466f71bc35f63b3194d8c332bd4d2d80d73a6cb1715b7d36e13c283ebece3b1438339f5794c3537135ccfa10ef888505fad21a69cffdb45fe7d44220b3e8054ebe63219f7a29755e44be9655bf119c72edb93e7057d05ecae0c68a9edd706d908ce5a4a4cf792262bbb27169bf2ca90df7679623c618eff8e4f4033f536546306e9426636017c83116d9a9a57b9f7c873b8c1f6a0deda762bc91b280e7bedc5713189ce0ec0fae8704721144a709cc06d0e4c5710c04db69346f9c60c331678a39177a530ff10e8a6cc0bfb544fe5154ed4c3b10bc3b909d176aa629a70c17bb209d23446812c1836735f7671884e5e0df1c31bc8a53354d2e1a207a6830df90f92a37ec2769c0dd01e70f75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ed4c17033a0423a3758914e896a84d75b6af3e7ce95cad06f99098a3cc7df4a1ef248cd26a95289b2c5b6dcbde70ff737dd7b8c2860adf4f4d2fc326868c95410d797dd6acf95c24b81e793c9c81b0ab80d381fe8deb935e4a90684c96acd4587\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/1ff8cc1006122254a00dc42299f828366e65b691",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a700000000d7649d888bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41b020000005bb521d202828c7d0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787ef020000\", \"prevouts\": [\"68bc400000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\", \"10fa3e0000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93619c25e57f1f989d83744c87da06b614bf52628c742756c46ef690ad2ebeffa6f0b87aa3d77021654e9bdded249075f42755a492250fa9a6a44787c57353d93e356798b11c96dafc2935d577afad31a6537ce4b1a48ff27833822cff5fe95a51e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ebd27c35238d7f43d4f7bfdb39568ec119b9aba2b203a7d851ca1c3c89dc41c13ff5c5d6186003b3e6d49f1c6ac4dc5a625cd45316b0701f0e70ab94b228af6df2727a08c83da142d000f7f66d34a23554b296f940ffe81022e50f50dcfdd8b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/202c9cc0aac7d6c5172f0818c8d0d3405649d29b",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701b000000000f33c6c8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8c0100000053d675bb027de5770000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a63f6b2736\", \"prevouts\": [\"a2ef0f00000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\", \"b26b6a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"d07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa74714e58ef013156220aa32c916bb7c1f2fb2617e3ecaa27044ebfec042fafbaa211c16676cbc388c1faf2d1545933d22071968ce5ea9e4d8ac4039e171efe917420b3503815f4c7b180839898c4c4aff0ab6ef4d8b082708dba105a321f7428\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c91ffd9bdd7718e2534d84740feff12c3e278aec2a2c7640f784ff2523f8588c15c449093bd19eda03bff23881ea6078d018b9cd0ffff6e12447ca822e876d277e36b196311c1a9d305bc653889017f46f4c4934a1587d131a83127df4466fae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/20372276860410d8622c60d5ec72e5716e313dfc",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c493000000004619122f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705600000000f0a051aedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdb000000009966758c01ba080700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac63030000\", \"prevouts\": [\"901e38000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"2cff0f00000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\", \"676a26000000000017a9144c4b1fc943f04d775886b4f6d3c3c73bf7d3118c87\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"21511f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"9c977cda999fb777401bb707089a400841e57a42d76a033be16e75d27051f5c0063eb91f26417ebbd83af79a57d1d2b8494303e3208c77ad3e4964f1472679cc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/203cda36559f2e342d3921d1f1f5ab05e330fe7f",
    "content": "{\"tx\": \"e3469bbe0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706700000000c719f5ba60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709f000000002924d0bd01b5301900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac88030000\", \"prevouts\": [\"17b91100000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\", \"09fa0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_de\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"05219fd19c255dd62c22f1d23054b50d11994ed452ab688d5f39c135657686601b112e74d10d9c769c9b3ef2147401bbd1148060ee8b535520d53c4b7c914d6f02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a25754a5be8d5603ff76d699fd962222fd7a6446bc364ebb4483ca18a9554e2e115fda02da9cf38c92f08bc0c56b58969dd9c08c98ef401a14d52946bf47d3e0de\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2068fcad81b42ac14a337456c1c0e850bc5567e8",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270900000000030ccb953bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf360100000044aec6de01f70b180000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc12a84e37\", \"prevouts\": [\"90430e00000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\", \"f73e8200000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"447d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457430173849036d038bb15ccd29e38ea974083458e0cf50b14971883c73e09395afa4004b2cd3f2b5519985ef4ce40029d6249627881f39179d9882ffc68f5bb6a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa08f12ff2db60e07951e3ece83f8d4c41d9b16f9cd93bc43e76ab3ca16313aee1430173849036d038bb15ccd29e38ea974083458e0cf50b14971883c73e09395afa4004b2cd3f2b5519985ef4ce40029d6249627881f39179d9882ffc68f5bb6a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2071f151f52b689e1e3c9f2b0372a3c1ca4c6dc9",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700f010000007bc29c6cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb900000000665aacda033f912f00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e74a010000\", \"prevouts\": [\"0b3c100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0862220000000000225120e57fe1708102910b1e8fab470345c0402aba6cb96c683e4f102534396b5c1780\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_a8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"39eb969c427e032bfbff293814fbd33417be2d8872751fca57e881e37ccf77c2afe50a43cf336625c50cf055e199c0befd766b9c963ecd0d90fa714712896466\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fbeb611f19a3b68d8630ffca6fa6062eb074a92e44f854d10cac4defdc78f08dd6f9392c7c86d3391a6e4aa741bc3c1922c9b47f080461e88188e7a2727b3ab9a8\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2089f610f91855cc26e8760f3910284181dc1b86",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bec010000001d0a2dc2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf00100000010fb28d503d0fc6b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac4d020000\", \"prevouts\": [\"5d3d220000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"c7244c00000000002252202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5a7d220a2162de9dd36b932eec5d84328f53e5a1c5d11922d11565b47cf408654d661e58f11589da695ccac5165f97e5a2cbf83dcedf2fc5f6b321061f22fdd2\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/209d75465a4314536f2bbabf6ada3622bec989d5",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2e0000000021998959dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd701000000289af2e28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49001000000cc78bb2b01117a7000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acc484a04d\", \"prevouts\": [\"5bd120000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"0a98200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b4ba39000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_0\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"959d8b004aec9b6c8b35fc30afa6e1c9c64bbaed1b82210e78e3d772f6bce5777f786bddc06f222a037ebd4777fac8bfd2fe22eb950019490f44d22f2f1858f6\", \"502480a9a1c656a9f5f7746327f1502e9badebe19941d325bffa0b69ca20d42cbba39f6119d85cf48f64651b58f4d172892b615337e5ae1b79b1b075c2c0c6c8fcd824e506c15518a093d3784485f840af3db7c2d6fe64bf0eefbac6760ea866c11bdd38b3b91ad1c92cfa912ce2ea64ad0b8836d6ef9d47df36fb8712a9aadb5b7ebe77916014813c9ba3bfde6e9ca00b747088dc55e836e0a6bb1e817fb5c01a05277b205e73e57ea5eeb53244ee64cf4a15ce1fe1648bae74835f4eac17961062a29c29a5b041873e01f34160e5594a8e88782e07cbe71fc0da7b880cf5bc9923ee\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9ed7c8a586213bebaf0e2e191ab6016cef1f18afd56c1cb8be6387fa7814968f1f46bf2d1dd870c953c60a9e0e8b6ddf070aac51ccc0e5a19d6ded1c7b664d7e\", \"5030e2de755082f6ef0c8db5c1dbb514ed01771dc2fd8356d180d58d8f2b57a03ce1efc7b26ac693ba7844888338cf23f16d34d00d4aeef7f7afce215b518a1df9581a38a199eeb8cba7b1ca06\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/20cd1af7438c223f49d33ed3693631c63f6c3234",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be701000000e408386d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46a010000004e24027602e24e58000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48790000000\", \"prevouts\": [\"6c72270000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\", \"f5703200000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e10a12ee33fd4d96023e4b035134b5e2e7438605ed0c658788ecc1f80acf96e3cde17cc42fca95eeef15c2a149426edd48c8eb93e73982ab4fa8378007bf5ef888ecddbcce676de51918ff82e75e695523ce4d8df7d4ec353d45ae6331617767e1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366cd1429f940fd1b5efd0dd192a5378c597739e1b4337081e905f661f126e379f0a12ee33fd4d96023e4b035134b5e2e7438605ed0c658788ecc1f80acf96e3cde17cc42fca95eeef15c2a149426edd48c8eb93e73982ab4fa8378007bf5ef888ecddbcce676de51918ff82e75e695523ce4d8df7d4ec353d45ae6331617767e1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/21227867cfe4806f692be272ca5b865dcecc1894",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9600000000634b90858bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48800000000344f78fb01beec02000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6c14e4b3b\", \"prevouts\": [\"520829000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\", \"bada40000000000022512084127e09a3e5abb8e6ea0ba3ce4737d1c2349f1be422ff5ce1609ab9b3fbb01d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"ef7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936aa6323c0295bc5775a3404b3aacf7082420dcfdcb982829d77fe55ccdd4d869082a8da46561b857dd56ed73270ec2a55b69a5f7c1db8df98b88468b2be2ca2b7eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac8ef60344f111a9c34d055af59cfd42b130acbf4987ee3354719b7c9974e4d449\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb1d33bd2ec2ef2b80e561b3c30cfb99b356a60261a599d7e1f2ff199de481a6e8ef60344f111a9c34d055af59cfd42b130acbf4987ee3354719b7c9974e4d449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/213cd49c2b13fe3ee6d2220f5f96b63c748d1add",
    "content": "{\"tx\": \"7f672b810260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704600000000d96525f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce000000000157fcba20390206e0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a66a020000\", \"prevouts\": [\"5d7811000000000017a914b0716f1bec91d4758ee97d9063c9da884dd2ba5287\", \"32655f0000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"165a142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"ba35ab6dc7bb7f42a551063c6f63d18d00b0b1d45576ad66786938447dd71941b9813b8443228b535069a06c4cfdc57a0feba8067a80f5fe7fe50c644e535d95\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2152488b729a3937e9f4e83bbefbb36d961013ca",
    "content": "{\"tx\": \"359093cd0160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ec010000002e50bda803557e0e0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac8e757553\", \"prevouts\": [\"12bf10000000000017a914b403773244c403f76163005c780d53872622b52c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"1659142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"c5792a58b67d9ab4f85de726ace781508f45a14949e4f0df33d83e835148398cdc86083f6b2c243dda9b6806313f8618e121ee99d8ee5211a7eebd12017dc9ee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/215ddb94c508c11099b9268dbf4ce0d7f7d18977",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b48010000003a3e7a78dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbe010000003e008dd90464f34700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875b04d52d\", \"prevouts\": [\"f08027000000000022512090f7a6000b5d616b8fab8dbf93f0441952f14900faa8700280033be77a40eb2f\", \"ef642300000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"47304402201204ff9c9eae38bf2b33b671b2d640c822740371a4b2d5bfda1999c4a15cd2840220195e1c96d8ab5bdaeafbdf2d336be51203f4cd8df2284b786386af6fab34d84eb24104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4730440220165b901dc777d7422d0882af9833e6a8b0b63640e6633b39d05373f6e1e6ebb80220535b568652daa99cbc006f31d9d4e7aafbe9057a5f8ff93d450a0682f03bc0beb24104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/21a38194825eb39a4a0ae99128be4409c90d420d",
    "content": "{\"tx\": \"d7f96b1903dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca701000000c90fb0fadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0602000000fe78deebdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b92000000002e15949302b1769a00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac1a020000\", \"prevouts\": [\"3eea5800000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"d5e41f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"688424000000000017a91495eb8fe3d959e08a2cc279c1b4ede1921d14a93b87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_cs_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a25721145276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d3252c4a759ac11949cf9159136b9e06c6295f8939b74bcafcdf3cbef48f320cccb2b22c406a6837310819a4d6b01f220aa934a7832d57d4607faa31a591894400\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a25721145276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/21a967d5a754fe4909db382de1d7debbb040d069",
    "content": "{\"tx\": \"020000000206f5bd527bde63f7c45daff54c390a64a59dabeafc8078a9bd0a050f54db6b44000000000096e4218fd15657a619affff084fc6b1bc2cdf5e85e399bb207d84ace710aa8effb82232f0100000000d0187eb30492422a51220000001600146d764276c66fec1127e5074db5bff3aa6c5255335802000000000000160014a4c1279efe108bfac1a01a2fe5d5c45b8fa18363580200000000000017a9143f5d8a006e43f5509420a4ea1e0b36ae11579f4487580200000000000017a9143f5d8a006e43f5509420a4ea1e0b36ae11579f4487a529293a\", \"prevouts\": [\"22cbf72c10000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"ddc7342412000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_invalidsig\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5e6cd8509542b63d2537a5bac669c0e311e78bff90c017c9c820e0c8da249779835917527ca01331a4054ec1b7b321c9234dfc8ce009f572033573a3c0091b52\", \"20159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717ac\", \"c0159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717a00074c7e8df7fd91f9df9f350398e675f9ead7758f02aef75359e3279a8e0e7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/21b086a0fcb5394bca5e13730e9801a167031fd3",
    "content": "{\"tx\": \"6a76990802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd8000000001d4b6c88dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4a000000002f820b8201e0103a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac02034d61\", \"prevouts\": [\"b82721000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\", \"cf8a1f000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936685ceb4100efa5e54cc068990ea9a5bf606617cab6629ff60e87e062a72f36c14639ba4332756735e08e9dd0c9395e600a8a67669bda3acb22644b013566df80a9fad2668c863ea9bd6dd9197c1c49c61c2b9d7888bac8bf6fef03fc3ace0a5a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ef01d0d256ad0d229e53661481dce388404558ec2529e0bc1d85e0261a585159aa9fad2668c863ea9bd6dd9197c1c49c61c2b9d7888bac8bf6fef03fc3ace0a5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/21b915be35d2383f8baacd2d513b5cdd06836ebd",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47801000000d864d64160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706300000000b0448b2f01b9302e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8754010000\", \"prevouts\": [\"fb623f0000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"33201100000000002256202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f5847d0622df121483b1ed7ca0bdae80206069e1f4810c687064ab59362fa9d59ff12214a208d620ece111200c1b5ab8b29e152a7c0e0e9f34d3dc0633f30eeeec1657f77102ce9c66c2655bb8b142b23ef3aa1d02b33f9da92a5485665189a305894ba7e52c3f59ebde71110e6c07aa3bee1c306f778690742fc0d2666be22433877eb8dadfe7392b904a66d6e5a0fdf6abcec13bfa32b12428fc721b4899425361151473b05c7435b71805c313c77f99fc2e625caddf9eba38b41961d9aac8887fca6a04088dabcc5bb229da55269438cc8cae8510ef86756104a5abcd4b04dc97aff4f977878d8d6dbd4e93781623986ea337f11083eabe3f4041a0bbc18f9202cfac5543a23481545870df93629f7408aa1adf0febc0b154d0e5458d38ac59a8e755fc574e37d5e31620e2e2b509f7500305e244bd9f769f6b55faf0e0541eda6c68ee6cd2f7ecd2986ff4286473e6f519c61771ec01bbecedc12119c173e0a70dd0e4b6e7f33a1dd09bd27ddb591ca0742272179dd3f928b20f87b1056bf95665bda75eed1248735141aa1357ec21922c018c0b65411252c61729c121e65f0889c8c550b605cc3aa364e9044eb48cee5e7a0251145439477b569e393506edac5c52814f53f7c10d91e526ad89a90f900f839e3a03b158cde00fce30f3bc219665407756206e9201e137acbd1e3dc0e4838adff3f0e3ea88ef86a5f118450b2bfbe112db310fe075\", \"697d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e945c33b167c9a8798707088659264fefaebd6f00f5f412ec268481dd4d0e7e4494dcbc06ccecaf65037be0509f5fea40d87445fa254b78f124a4b8c5e16963b53b3c2b944ff5e8034ac7518513c5ca10ab4eec025a723136fa482de383e24ff1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090265099e99201f0ae5ecc7e7150bc7097c376c0da0d359efeeba78eb50d06cb3e3367eb394c456161ff97f0b821c36a335ec772ca86c113a7c1af68e7a5e99811a8045986fc060eaaaf362f85b288c4c2bec1148741ef27504b8168d3e4aee1112cdb5676de582c59200b6279650e63a3e02989f56406065f0798d6e251207e044ce7af6e7259e449c26bc45322b9a9f1a9cec73cc7929f8b6c28aa9b1292a68d222203aa61155a0494f55f7c7262ef8bc61ded342356d7150c6e927f0879dd22baa293eaa0ac1b609b4ccd9369fb906529933c2692b893c0162d4e22870566ddae7f50f09d10f26e3c59ec538e8233d67a72495c9ad2d2360486a205bcbbf9130cb5a551393ac1418596b0fce84d3f2c92bc2b27de57e805c786e78f0bd64623a7780472348003affc7f78fa1f17fdbe6a7e160a2aec3e418a42c146b3e336a158e2590f456d0a1616f40882ee6a2fbb55905a3dbd484204253f8a6663db27cded6ba4a5be14daaa009136ab5061dc57a28e79cc41ff0271be7052513cad6685217d61c76d7ebc05efed1ad376add0ccc97858bffe745a60bdf61f14fc68d9ee473378f960a9df286fbedaf16b03855f5c861b6dd7beddb599188d5551329ef082c329861e86c4c99eab7b7bc07d1393dadc65e7ab4b967ef6c8e919cfae6f96df3d1c54bf5c6c91f9a8f1243ac80cecb7497cb646e4057dafd6d18ffa3b366fe1ccf1a798e2383d24375\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369bbba8c45aec20ec89a583a695eb75c8b6b0a9fdfefa2bfeb5c3f7ebac004de28dbbed29828226c3a1e74b431b518dca4e99f1ee054f76cd9b7bd5529b5cc8688de3449b5e2c621283b68ab187cecafc7aa77a8721601b5317d3484f84536019\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/21c64c51dc34976712f8356ed25d28cb2506a3bd",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44900000000f5f5607edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2400000000a5a0567a0347928500000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a66dc2b32a\", \"prevouts\": [\"ddf93a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"57904c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_c2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8a0085756ab64896d6da8cf6a231042de33fdcb2378af0685f003628646c246d1b4d9c69e97ffc9be71d61dfc961a77aa1232e56195baf91e9eaabd8ac13ddc201\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"38ec05dc82f628ae4093c6109d9ce790cb7d07b666f44f3137a0bd8df91f8f9dc99ab062ca4df414763477ebec5c02b4c1c024d3fe8b08c3d45551577986dd50c2\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/21cd99bcb03828e0395286a09e866684d6c569f0",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40f00000000aee490c3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4b000000005f173cce60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703801000000fe1cc3f8014c7b3000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac9c041628\", \"prevouts\": [\"5139310000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"560c2100000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"d2ad11000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"907d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ed16c11561cb4e52cbc61ad76d34e49a6feea77f682efcf50ee22f89bd1fa0f0da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457ba4f11ff80ca9181e3d85997fa959accb8f97af45a52bfd0df916797673441f5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa51b810e60c043042e0bb2eafa8cecc8c22fa830d489bdf7de51e14fd273b03e0ba4f11ff80ca9181e3d85997fa959accb8f97af45a52bfd0df916797673441f5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/21f06e9520e734ab7974353357c55b81e5ee87a9",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bac00000000a4c899b2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3301000000510c59fc02e5e69f00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac52020000\", \"prevouts\": [\"13cf270000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"33bc7a0000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_e6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e20d99c9b7cc55693d7fcddbdb74b2e4b44d7d73e01a3007f31a7a6b2383aabcdff58c6e37c26938cee76279e85ff2a382f0f91502495007badbb777fab8df4b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e783476659ca403a70e474208bc6081d34140b640add30584d711f8c051b60ba83098caf714b69bfe84538f54302e3ce3a7a6c0dcd3786fb8ec791d43c7c287fe6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/22089449f264bdccac5901669554a20c01c7632d",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bea00000000ee0a502560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fd00000000d7a42f82dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b80010000009c57242704fe4b5500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48746e08936\", \"prevouts\": [\"2584250000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\", \"ec9f120000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"64811f00000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"spendpath/negflag\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7340617ced9340b45760ceb890528fe2485469f12da62bf2170dd2f0de96785c1664b40e8e69c903cb0ceede49127d69deb93704d5e9f4845c384cf5ed9e29c7\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b78be31b16966ae882c7ab2969dfe11d69b83e8cde47f805ca2a48764752b9cbbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7340617ced9340b45760ceb890528fe2485469f12da62bf2170dd2f0de96785c1664b40e8e69c903cb0ceede49127d69deb93704d5e9f4845c384cf5ed9e29c7\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b78be31b16966ae882c7ab2969dfe11d69b83e8cde47f805ca2a48764752b9cbbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/223d492bc034d65fae5c76008697dc6455711a0b",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff50100000056f5479204060a8500000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e798000000\", \"prevouts\": [\"fcad860000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_5b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bda58126d802fc8724e1125ad89e081814d63df7516d10412d5dab66c1e01d3d190f47091320c87d1a69cb736db34bf7d9abd284a594ff6df2b6d116cb5c3e9901\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3ea3be366a45078cc28f71c16628b06f52c8f5f7deac2ad51f942f6bdad7fcf05430857a5d49feed4260131087e8631ac9af928fbd39b17e15c2ae4f01a5bdaf5b\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/227dc7dc4b5fedba0f90b82d69d0f8f6785c49f3",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a300000000afc78ee1dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8a01000000bb1633dc0151876500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac867f065b\", \"prevouts\": [\"ddbc100000000000225120ce3551521fa9f590f4e3a432d6c546446f0d4fa78e73ac01749e3c952a57623c\", \"8fb85a000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"053e1b8e538c3bc309321ac2217c841e880cb5a81e463cb0273e3eb9d8ff51171a2a986efb4e5d8578424799da33525b1c775752a17602e0c96412e87012a8f301\", \"187ab5e105b5f66858c5\", \"4cdc9e50942076c092b25970e2ec1edf7d22f4e8b7d3fec3736a17277eb80fe9326cf18522ad1022328e18c1a14493249583ab862b6578e409ed7ca2edcdb1f3aa054abaa04cc51fae6e33cbf17eb5794fd525f3ef28f01bc15e20750d9ce510485df67443c4925a72e921f620bc7c94dd404f4bfe95fba127119cc784608713b24adec77630aa324369a14a2f16b637bf12180bfbdc8d48692a188aa0563671a10863392b672220a5b12fd3a0f5e7bfa50715370de8fe624a2232cce49783144e169e5f73429de7aa4a634058f95da223f9240494b2fe9ea62072cee4c76d20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2051646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361592bcadc6b0173f44371808ef35839d7baf56fff8f47332472589970ebf0574a56703c807c846ee6abb2e7a8564bac5205dd4eabfb1e9d7f613523c0bbf3fac983123818ea2fb30d9c84b0712135e951ac6fcaf39fdf102e51ec0569ab5991acc2e87e6786e427484b7a25eca77971dac858d288ad2240853937e399511e1ac4814eb3006873c92f651a031d457533ec016334f911cc3244fdb7b55a1bf193c8d7fcaa8a3f248af81478f78c2ae2d84a51a55c107f63091e371c961c44fa973ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc22b5950015ca6bf902ab72aa161ffddb8987823fcc69a35030cb97d9616cfff6331bf3ecd5cecfb7e4dc2b7d61da5af4e5c887b1feb7d18aee6a7d1cd1096818b16ba2eef987ab89b69f32dbaaa9ec389f135c69edb6a4ec37f19740b7f2030fd5d4501928cec0bfd3602ed3e76d8155ec353f26584e3e4366c38f97c64459a00000000000000000000000000000000000000000000000000000000000000000d19e8ba886ddbbc76dafe91b8a3f02f3529cb5ab44e9f64b8ac5357a77f29094c224d123975e63ce69d08583f98430dee35d861114d22679af6131d9293c61b079e2fa6fab44cc7b4c6168b32516e0f04cc913a7bafd309decf260e3dec9ec9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff23c22efba2313404e5904d2fb71b613b37bd41e7dcbb9c2b8be01d05d7a0187f14cb4cb66f826648695fdcb338c2aa262eb871a8c6cd9390c57bbc2ad6593fb3474d25704f9cafc09d6d8453426c7549d5e3004778d9b3968bd3b952c67c78aece7d952da9d14678ebdac73a5c8d5e14d2cf7ad3db2da6307947f0654078ec9fe05bfe0e9604d5022b4976402c46e4791b3c24cc77cdcaa415e28c2d609e771a94d6fdebc6f5faf2a0846ba52c6690c8a7073b213b6876428e0ce15616fd0ae963c0b2339f89cf0c1a47a819d2b9486acee87704ed5fa88be0ebb48e216088e500000000000000000000000000000000000000000000000000000000000000000893f14fcf5d631ca4274979ce31cb9c09423de1cb28e151fdb6568c6c55c988cc59b8e0defd2e76923fd0c02612e4a457ad43e8a186a5bbf1a8a2e635dd74c84f51f3ecd679b6c3af4c536805ad1cba391d88688d829113e460024821dd540fd4e7c034159daba82f364a02678622ec5af6cfeb13e31db96cdbd07f4e158d44c1f6f49e31c03579db62e751ad67ad23ccb8b225365890d25961d69fd722782b012bc98deb593730ee305162ddc176ce1055da8028d8a2ee84d3c5c2c016e610d4ae09ac0895b0e73024df773b4bc8f1fa77f269019c47251e1c591ed460b2286cc58e13e322ea39b4ff78f82227af8337dbb5c72b03e1c7618e558f55a9075fc8c68fd921bcbef3dd6b532ca14b0fd895fc7a323b38714abeec35945cabd814000000000000000000000000000000000000000000000000000000000000000074504a206801529e97cac9bcfbf0e79c56e7bcf3bdd57da720ac7abf661cb56b989feea5982311a81e317d99b193bafbe53278f14d7b4be0dd3d3284c0e978d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000034ad4366c2133fe7305e82f00e8e91cb8b9791a3213d6a5d8bd78689c95b2e2200000000000000000000000000000000000000000000000000000000000000001ede38e04bd71b3ac73e836ccc88072a7a4af163764f3793deb8c7d98cc2f928362f49f48aa2225e55227b3d7ad92193a33b686884306da89b4eaa021b4b7daf0000000000000000000000000000000000000000000000000000000000000000084d5d7678a3ed0fcf0ae03f659b2fa1dcbcbe078bb81640a9785c7ba1c58b4557b5a17667a4d546babc00b67679095d6e28454babbf94f34b1b0c124a0604d8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff27f3c98e8455f02dc20fea8d531a5a4c9e725776b18a66babc2cd47d77c913a3bd2cdad93c71d5ea44101b85685b0084504e664db3a94d92d59fa39ce6a85b0654dd810de0659ebab0f273f152d7bd84250193e07888cd2fa42003624114a381ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000003066daf29525c49d87e5cf6049bb14ef6673f0322201ef9693ab06c4026439d68e8ab8978a96a938148e40440241df287b5f0d5a15cdfeb4e7519593faefb3c45118e72a7730c34cfd24b4adda3b16ab4022e80da0f9444d347922a0b3227d9c000000000000000000000000000000000000000000000000000000000000000044e7c902a1c8fbe84ba609f269cf831ccdb662782f4e70276f4e3b821fd5df5a43acde8c0352fc0aaaae2e02aa01128217fe38f9f6ffda05ac9924746330e0915201a810491ac6470d9eda9794c3d356bdabf10b53d6b81280412c9ea0a70cf3545d56b60a3fd73014bba9fbefcb041aa62d02ac0505ff63888fbe19ad0c9763c69febdb8e0ed135a6949314778b5867f1ed499dd589b0465ae2227c2c373c1bf7b52c16ec7a6a4c7a53b73dc546c6ca5a1e63511fe79bc58b510572ae439831ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8d4608c9c942491a3856d1af5e4ca48a237017c60814331617bdad2705666b325c968575eebb5df14f4b7c35f6a1cdc55e757cf91ede928ce5cbb13b86bc4856ff46359e7411918ed4c675ebb7fc831e8a5add7dc1eb9b3cb2635fa2785f3f880000000000000000000000000000000000000000000000000000000000000000cfdd7a337e747cbf1f441415e766197b1fe31e560f2bec1e61d1a024a657e69b9576076a6c1d6b47dca9816a842858332bcd978d0a69f25c2b051cf9b9feb0dba2f0b7a047dc92e8f11b6a9b77015bee15ee6ea71a811ecc6babaa90fc9464a82bd9c105c600a394f153addc1db5fa33c17990cddb9634cd24788d0a3b13612dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe55f438864ef2a33dcd1ca3767364691085985ef8f411f2902a38068b23af8d50000000000000000000000000000000000000000000000000000000000000000946911e0389d4b583b97ca3d7b2c423ae4a3d6c9fafd58cc8bff8456f17d236b2e53bf69fb1c97e7c7836556c6667046e21cf6785ecd43cfba50274e6df29381\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"053e1b8e538c3bc309321ac2217c841e880cb5a81e463cb0273e3eb9d8ff51171a2a986efb4e5d8578424799da33525b1c775752a17602e0c96412e87012a8f301\", \"525d710a6fed5fb107\", \"4cdc9e50942076c092b25970e2ec1edf7d22f4e8b7d3fec3736a17277eb80fe9326cf18522ad1022328e18c1a14493249583ab862b6578e409ed7ca2edcdb1f3aa054abaa04cc51fae6e33cbf17eb5794fd525f3ef28f01bc15e20750d9ce510485df67443c4925a72e921f620bc7c94dd404f4bfe95fba127119cc784608713b24adec77630aa324369a14a2f16b637bf12180bfbdc8d48692a188aa0563671a10863392b672220a5b12fd3a0f5e7bfa50715370de8fe624a2232cce49783144e169e5f73429de7aa4a634058f95da223f9240494b2fe9ea62072cee4c76d20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2051646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361592bcadc6b0173f44371808ef35839d7baf56fff8f47332472589970ebf0574a56703c807c846ee6abb2e7a8564bac5205dd4eabfb1e9d7f613523c0bbf3fac983123818ea2fb30d9c84b0712135e951ac6fcaf39fdf102e51ec0569ab5991acc2e87e6786e427484b7a25eca77971dac858d288ad2240853937e399511e1ac4814eb3006873c92f651a031d457533ec016334f911cc3244fdb7b55a1bf193c8d7fcaa8a3f248af81478f78c2ae2d84a51a55c107f63091e371c961c44fa973ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc22b5950015ca6bf902ab72aa161ffddb8987823fcc69a35030cb97d9616cfff6331bf3ecd5cecfb7e4dc2b7d61da5af4e5c887b1feb7d18aee6a7d1cd1096818b16ba2eef987ab89b69f32dbaaa9ec389f135c69edb6a4ec37f19740b7f2030fd5d4501928cec0bfd3602ed3e76d8155ec353f26584e3e4366c38f97c64459a00000000000000000000000000000000000000000000000000000000000000000d19e8ba886ddbbc76dafe91b8a3f02f3529cb5ab44e9f64b8ac5357a77f29094c224d123975e63ce69d08583f98430dee35d861114d22679af6131d9293c61b079e2fa6fab44cc7b4c6168b32516e0f04cc913a7bafd309decf260e3dec9ec9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff23c22efba2313404e5904d2fb71b613b37bd41e7dcbb9c2b8be01d05d7a0187f14cb4cb66f826648695fdcb338c2aa262eb871a8c6cd9390c57bbc2ad6593fb3474d25704f9cafc09d6d8453426c7549d5e3004778d9b3968bd3b952c67c78aece7d952da9d14678ebdac73a5c8d5e14d2cf7ad3db2da6307947f0654078ec9fe05bfe0e9604d5022b4976402c46e4791b3c24cc77cdcaa415e28c2d609e771a94d6fdebc6f5faf2a0846ba52c6690c8a7073b213b6876428e0ce15616fd0ae963c0b2339f89cf0c1a47a819d2b9486acee87704ed5fa88be0ebb48e216088e500000000000000000000000000000000000000000000000000000000000000000893f14fcf5d631ca4274979ce31cb9c09423de1cb28e151fdb6568c6c55c988cc59b8e0defd2e76923fd0c02612e4a457ad43e8a186a5bbf1a8a2e635dd74c84f51f3ecd679b6c3af4c536805ad1cba391d88688d829113e460024821dd540fd4e7c034159daba82f364a02678622ec5af6cfeb13e31db96cdbd07f4e158d44c1f6f49e31c03579db62e751ad67ad23ccb8b225365890d25961d69fd722782b012bc98deb593730ee305162ddc176ce1055da8028d8a2ee84d3c5c2c016e610d4ae09ac0895b0e73024df773b4bc8f1fa77f269019c47251e1c591ed460b2286cc58e13e322ea39b4ff78f82227af8337dbb5c72b03e1c7618e558f55a9075fc8c68fd921bcbef3dd6b532ca14b0fd895fc7a323b38714abeec35945cabd814000000000000000000000000000000000000000000000000000000000000000074504a206801529e97cac9bcfbf0e79c56e7bcf3bdd57da720ac7abf661cb56b989feea5982311a81e317d99b193bafbe53278f14d7b4be0dd3d3284c0e978d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000034ad4366c2133fe7305e82f00e8e91cb8b9791a3213d6a5d8bd78689c95b2e2200000000000000000000000000000000000000000000000000000000000000001ede38e04bd71b3ac73e836ccc88072a7a4af163764f3793deb8c7d98cc2f928362f49f48aa2225e55227b3d7ad92193a33b686884306da89b4eaa021b4b7daf0000000000000000000000000000000000000000000000000000000000000000084d5d7678a3ed0fcf0ae03f659b2fa1dcbcbe078bb81640a9785c7ba1c58b4557b5a17667a4d546babc00b67679095d6e28454babbf94f34b1b0c124a0604d8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff27f3c98e8455f02dc20fea8d531a5a4c9e725776b18a66babc2cd47d77c913a3bd2cdad93c71d5ea44101b85685b0084504e664db3a94d92d59fa39ce6a85b0654dd810de0659ebab0f273f152d7bd84250193e07888cd2fa42003624114a381ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000003066daf29525c49d87e5cf6049bb14ef6673f0322201ef9693ab06c4026439d68e8ab8978a96a938148e40440241df287b5f0d5a15cdfeb4e7519593faefb3c45118e72a7730c34cfd24b4adda3b16ab4022e80da0f9444d347922a0b3227d9c000000000000000000000000000000000000000000000000000000000000000044e7c902a1c8fbe84ba609f269cf831ccdb662782f4e70276f4e3b821fd5df5a43acde8c0352fc0aaaae2e02aa01128217fe38f9f6ffda05ac9924746330e0915201a810491ac6470d9eda9794c3d356bdabf10b53d6b81280412c9ea0a70cf3545d56b60a3fd73014bba9fbefcb041aa62d02ac0505ff63888fbe19ad0c9763c69febdb8e0ed135a6949314778b5867f1ed499dd589b0465ae2227c2c373c1bf7b52c16ec7a6a4c7a53b73dc546c6ca5a1e63511fe79bc58b510572ae439831ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8d4608c9c942491a3856d1af5e4ca48a237017c60814331617bdad2705666b325c968575eebb5df14f4b7c35f6a1cdc55e757cf91ede928ce5cbb13b86bc4856ff46359e7411918ed4c675ebb7fc831e8a5add7dc1eb9b3cb2635fa2785f3f880000000000000000000000000000000000000000000000000000000000000000cfdd7a337e747cbf1f441415e766197b1fe31e560f2bec1e61d1a024a657e69b9576076a6c1d6b47dca9816a842858332bcd978d0a69f25c2b051cf9b9feb0dba2f0b7a047dc92e8f11b6a9b77015bee15ee6ea71a811ecc6babaa90fc9464a82bd9c105c600a394f153addc1db5fa33c17990cddb9634cd24788d0a3b13612dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe55f438864ef2a33dcd1ca3767364691085985ef8f411f2902a38068b23af8d50000000000000000000000000000000000000000000000000000000000000000946911e0389d4b583b97ca3d7b2c423ae4a3d6c9fafd58cc8bff8456f17d236b2e53bf69fb1c97e7c7836556c6667046e21cf6785ecd43cfba50274e6df29381\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/228fadb4fab77130e6a42578be8c100758962a74",
    "content": "{\"tx\": \"2922ebe703dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb9010000005c19b4fedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b13020000001998e48adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b010100000093d904b504fad96600000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac67c6fe2b\", \"prevouts\": [\"deda1f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5841230000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"70472500000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93666a124118b98944227ac8799c33055b94d7e7018f02deaa87dcf78fe58f5e6601ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045bd4c1b076909910aa73b6afb36aebfd26014933f900bad794466c6fcd625cde53ff737734404bbc9015f34371be38b9f5376f1a60720e7cf7da81354011ad4f7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360294c57366dead3fd876fc32af42a2fa764f9bd5b32489219346221a609003451f8d24c2756f16b9efc524121d49339a04fd56a536f956352850ed4d5018a4abf7205f064a536655663faab66bf2e716758d251376e4a55710082b6d7272244791bbc3b31bcff977684854464ae3dc2a24522286fe393648b51abc79cc246ff8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/229254c58edf03c88b0434f339de04542e82f168",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c850000000050957517dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce601000000ac49e6a1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5101000000703ea34b033cef1101000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a641020000\", \"prevouts\": [\"59c348000000000017a914ff6a0b1cf86e786bc6de2387f1927f71fd08cd0c87\", \"fabd5d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a3736d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"165d142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"792e781772198103647e5cfac1dc4091877ebb5077e791a2c12f8df0eedd0aea9926b2690076ed08e99357dbf7eeab06cd4b6b474fe179a0f91e8bfb1576a070\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/229a032ed00e20e08e27892cc81b53b28e1d245d",
    "content": "{\"tx\": \"e804ef7102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe80100000034edbacedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd1010000006fa7aca801349d22000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787f2e54f5a\", \"prevouts\": [\"e25f660000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"146920000000000017a9148fdfffe253d045df4a2985902e5465482e50374187\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_25\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e61ba9755f060034285cef78e42a9461431cd3560d8e35b815f0c4939697db5c13d18cd88f908990704eb5289b22675d16eef3222c96d9b83050c4ce96a926a082\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"eeb72d40ee7892901389368277850a2863b21496aae1e44ccc936d22b3b8944c3571313c4eab0a9282c069cb0bf5d539802145bf2def115727c7ecd26e041e0c25\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/22a01d7a209edd8694bd9edb1c95de74dbed6fc4",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6000000000f1c183f860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b201000000b9cf07d303a0995a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca2e5a443\", \"prevouts\": [\"478e4c0000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\", \"d047100000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"217d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b125012b8c96659eb5051cffa1e2d8709a673f9f71e7e6dba2a97721853c7b7f5bb5ed745f7425de3873ba37c460c85acd2f4f50490d9d3680fc958bb85bfda6f488f9b2dd04714e2920653c1afab7d010d81355bbe53edbfcaebea15ff1da48\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936292ff1b7e178d7e9da4854c31b4400aae8a94314f1c0979690521ac9be0bd43e4f67f6e69cf51b25bdfcad90ab02b519823ccb2f4612df68d1a9a4df99984c88f488f9b2dd04714e2920653c1afab7d010d81355bbe53edbfcaebea15ff1da48\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/22b9de25667093d760c9e17c5477dead3043b33e",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706f00000000c32c43f2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf320100000028b9c79a0196fd4300000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac7d040000\", \"prevouts\": [\"bd700f0000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\", \"b5d872000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"747d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366f13115bd78303830deef59a17ab37bfed179177a6532f4fa9f0a1bd0d59f4dc133f027656d2d9f64ade865091a06c0b2adab14558eca27c91472397a1e3806e077aea6ccf316b47e40a0e3636c5ad4f7738b9bfce630d4a478a0dbfcb51ed93\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93600cb8eb27b118577da6335628c0c478e07c27a1a525520767178318f599b32b5ff7c473e619e0ca75adf5145a8683277729cbfddbd5802fec00494435aa4942fbfbb1ef2412aee06f4b75b9e20a72d4d9707545a4ae77abc538f76b00105406a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/23157f2fc305799762478817c79fe62d896edd22",
    "content": "{\"tx\": \"ac7f65d102dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0c010000004de5a7fabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9200000000f76d37d202d679b6000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e1000000\", \"prevouts\": [\"25c3510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"397a660000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_71\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a456c59e98366ae7ff61f61a89cdffdbd005e7e3bc4fbd099197f1a081976d965bcc584c7e7a29ad6a2625259dae4bfc998dea467e2805617b1632f00c73082082\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ba94e56ba101c1b723b2cd8c1fa8a54c5ae79d7cf1a2439c7af948e861f382e2419747a3b57d514515985d0f717045304887d07439977e31e73fc86ee4a63aed71\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2334138f3c633d853dbab847307d9950c227ac09",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706f01000000230ae7af60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d600000000224fd88202d97b1f00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a626000000\", \"prevouts\": [\"621d120000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\", \"78ea0f000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a97\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936320fe3e7102342eb9f8810633fbe90b9d113dd72dc4507b687ff513a291f00e9bbdd0eb743f16fddaffdc87a703f35bd0417e0996b155e435c0add546ea723b55a7303e26d6b86d2a780c30dbeb7ba87c6a0494b901c3875fb9ca7f2f12bb2fd373be813dc08f80e09d78de4ac5358a3bdf22545a425b50fe87daa20f96c44d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b2064e90022f018e8cc473163b262248813e3dc7e43f487ab53623d6c75190b10b282285524a15c732567d099967405d35f7136f74f48f011bc4ab279ad8d14f14\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2341c37b333e27f887345a539b3a46aa15fe6738",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fb010000003f2b16d5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb10100000040c4b8b401a85c0700000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac817e0b21\", \"prevouts\": [\"29c23b0000000000225120b5fac7f9d1efa21092b4bbfea1ca41fe5694dd20d67936ab2b478b1ec4aee588\", \"3cf4590000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ac5\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b7edbaf46c0268ae1918128a2d0d299a3d54c113a31bc8611ce7c78042257f253f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0826c8f4b27179de8a3c9fbcc0ecf825a44b7564122e0508108d3381c6acb047da700a5530ec2a7d4ba868ec61eef99b13bb3328da6d520ee28822b8288bba3da4c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368ca963a534af16cff2b21484c634d90c5e0c00f8b3fd57582cf68a2a29eca46015f1aeabcd45f20884fa261b27121b1c083fa5a2716bfd01069fab98e18c3b0e4b23f991898c0f7e80b32f00b838c1f1514616fab2a47083539335b67c2689fcce4d7767c8a9637a0804b073b1eb172c67de67ce152ade33f2591a85dfee2e5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/234eb0340c07ea7d86dcfac62e971eae6dbc359d",
    "content": "{\"tx\": \"71a4ed46028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44b01000000ec698ea18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47501000000cce1158c0485037000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac31010000\", \"prevouts\": [\"8ce9360000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5f533b00000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6aed\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c7af4cfe0f99cca6fd42b4bad50f9f41e4667d74ccb507e77633a831529259e37eb7d8a059ff700a84b94cf01bc4b173d99041796f2088e1a59df5cc5c18f54d86475c33b310e45b92339559838140b9b3f3d62b1cf111e129ddf9f566de62eb71d4983925d18ba40c8655020b616e094614baaa1bc1b56f6416d7610eedc4a1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368171ab9422ce0db519e36e4df069c3183058a2adc3cc0dfd4bb4c05bde2a2f30c9b0690fa0521f4fddf88c65f69e0716898ebb5a52dcb1ee37dd2f34a8a99dbd71d4983925d18ba40c8655020b616e094614baaa1bc1b56f6416d7610eedc4a1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2363727c5d55ff4d6eaaf41f33d420d94aa0259e",
    "content": "{\"tx\": \"9141e8fb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c431010000009eecc698dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6a00000000ac6348d004e56f6200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca6173146\", \"prevouts\": [\"83e83d00000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\", \"f83727000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d7a19d3d760a1d5b978f5f8613b1d81f8c804efc212bcdee817dc6857aacc54dc4ac7686e1050a7898ca46832dc0b13c656b8aa5296dcb10451fe0686117a525ba8b1d0413a3689afa6e2d3b5e2c7645358d98c43f6c96a422c82685ea6ebed243c7016fa806ba9399c8748af43c67a9931dd4be53300ce189c0addca0147628838b9e44c160d655842f291bfb9229f8c849f630e82253daba9d615aabeb90a2ceb5e9fe548869c37c426773c51df4089cc45f472c69d3ae172a3e96766e4056d2bdd2c883828986bbbf628f78aa9193925784cd080760db15db2d7ddcf232709c468cfdf7f2279136b433104d8a23a726f2e024007ad37bae5a90d61502cabcbacc92aac1e945356c7b905510a04afd1a64056f3ac117e963500e1cf8388dd97fa005b259f8db467372ce304ac59e5233b4cac90f1a410f1b0baa0d30fe804dba19e1ff4cf9f2b46ecf12e1835c88830dc7e5aebb781a630d83beb145a08231e9564a4938cd0864f24f088881405eee602fafd96a120b2fea89c09290402625ed0448801b41bc85baa36810c816cec4ecccc1b9f7044128c1c6ab50ea6dfa8eb8352d6ae2b3a1b8c907ce62a51c3f29ea6ebfe3efa32fe0565bc9b1d09816c004080d40fc21f62bf917edab68690ef37e27bf9a10ee365f1758b8a71b90d6034749ed1d48f90fce1f6045794a00ab8a72f6c49d7fe4b976e89d16e4c3db3a5e39b0e9f5f9688fecfe75e0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900456b8fb8a6613bd9c6482328b74d7fce63938f8fb7ab14fbe335c660b528e72f6791d26af6ddceab3892536958f1ea20dd7b885ab499207106c7decaa6511a0e4c5a35b5683fdfa8774cce0e3f4376573bc9dcdb125f140a48d9cd3d58bda5cb68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09020b84cf359cb0adde03512043954d24058956b42b615de75e6ddcec21df184bbee6c863bc11286694c694fa0a8fb65ffd60304f9f96b4544c14b4163f76923b3773fa746611c4d6ed29af4f8586bab6bfd704aa6fce0c4c201525bcd9e901377bef2915acaaf853e616153933c684a493de9d51d53070dd21d318657b6e654313159eaac3addf54c3f0a1814ec5482b7a7fa7b1f238805a7aaa66e0bf60414823d4b4e7d0fe091a60c1cd66dcfddebe80247654548220e63422fc7f0dc44e3cae708fe297fe5bfe97ecc73c25866c039cbd034bc54b6f60057139722de21b9c669e553c41f949c90e247c81b99aa5657e59d4b37d8b1a659de394957c8314b75bbdd9897bacd2807566073306ddefbb9cc32b0e37b155bdbfe4661ecebdc1825c519c8891a70bdbde9adba7b0cb294a33e87063f83f2e68eedb711f05ef97b8f54fda4d774496bd20773ee5d2d30bdd1031e531c17af6d13ea321a25817cd36a054b8a2b70189f8d25e3b9f1c23f6f745888ecd6ce590cf1170bda83381f7f34bf8baaf0721660aeda86a6726110b58991b0b6b81fd646b1ed5ff8fe10d040116b3727c80c013cf3daa792d1f5b73607be9bc040cfc6fdaac30395ba9914c3a94410af93ca306ba3e225e37b7cf9f8efe90fb68caa92732ff00d975d833066968d7a6b23c164b93fdc84a95083d1f1c7bea248b3b703b2fcbe6c78e51a9380ffe2a722004d92283e08d7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bdcf8e50873998a844faba380504aa6a4d6e9de9af7f46f4843b96a4d07d0a1c0941252319b1d0989c3ca3905f2d65278f17fb3ebe6fd71301329f8e450b42a05a35b5683fdfa8774cce0e3f4376573bc9dcdb125f140a48d9cd3d58bda5cb68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2364ebc1025f0c764130435a3da1d5febf1ac0a5",
    "content": "{\"tx\": \"1440bee6028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44000000000a895e88fbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf52000000000366cbad01bc8c1b00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac83030000\", \"prevouts\": [\"a0853e00000000002252202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"44c57f0000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"9bde27e94522f6809244df9ebd77fd059392ef6e9929729db2a23e7f354cec06728b50c787bb54d821f0f6b64f38a80b0d65b35c5124dc4dc8d03381ba66de4e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/23873275d271cfb7c8271e4058054ab8102b18bd",
    "content": "{\"tx\": \"57a8be88028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4360000000053d6dc89dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c050100000069ebfe9f022b60820000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65c37ec52\", \"prevouts\": [\"657a3100000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\", \"1017530000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"b37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b1edffd5a893e5df644ec9dcdc719e8bca2e1f26d5763c3eeb38ec8c4740357935a4766d58ec26ce2b4efcbf65574b66558d9985cca85178600ded982bb1eb8a33479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a368ced990ebadb111ebc3982eac7e308f07f99a9264ca6c949f56162916d7884\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93657cfe4e05c2801526133fbc39f19ebc94f094228af725e239c5bbdc23ebbaf663f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082ebec8f444f9538a00b5e533aa370349d7181cba703021b72fe611d481b359a8e62055c347ba5402321504576f6c37d0c6cb1d044ee75df535bc9eec0560634a7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/23ce0a835c3fef13acabbe51379451af1bad4377",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcf010000008c867549bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe200000000ef2a1b630206169c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e71bbb9c40\", \"prevouts\": [\"35f922000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\", \"d5937b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ce4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cb2c5514a992c22e53e3a04f6b085a9b65917ab3f28cc532348e66ade0afda2c959bd9b34bb85690c892593228383c48f2c7a3855b4947a3dd1708d13c567655d4436d921361743dde8d98d3cfa724f09037452104a82644e108bdf9bf6fbb39\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52ce\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366e56b48b572a1cc7c2f3559a9632e4e2bdf1e7b793f9a11573ce0ed706b87c990ea67bdb3398814286540937ec364df004af879f987225ad05d036a51e8223e6d4436d921361743dde8d98d3cfa724f09037452104a82644e108bdf9bf6fbb39\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/23ee2abacaf9004b59fb4b0c0bf4fb0518c0b719",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccf010000000c1a2eeadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce100000000a5df58b402ee86b5000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac3e5be55b\", \"prevouts\": [\"6a2c5a00000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"604f5e0000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d781ab0fc22299030d8088d2502bf7faafb676f2c6fd3570596726d37b72f1ea18b5f2fef84521b683d8aac742b48aa2197bd0282730b1a4f3a8fad5441e2c71c315aec02adde316e700f87e7c47f474d1ec7cdd06b196ee567d81a15967a13360497a554a17affee0221519da82623f7958d9c28014b232926f5323d6c78d1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369f2178c5a62b4c30d4502e396e591afca727ab38280213cf79bd50a97c5a07b199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb45385991a3000310359e2a9adae84589f286ca8f4d4476598a0e772bdb8ecbe6352ff338358c59a252efd0a17af70f1cdfe194eb24c5d50483b26343bf89011bf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/24189b1ed398f5834d414ec0517d0e4ec49e5123",
    "content": "{\"tx\": \"dc9f3d8802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf46010000009ae647c88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44901000000ed7e76b5043306b500000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8725000000\", \"prevouts\": [\"89a97b000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\", \"5f003b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_67\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"863013d4da2ddb0a46deb8b892d3eb016fcbdea9c696bce69f15e1aa6fbd98006a72109f81297ab644f1d0e9894e63500c4af91b399c39921c7388e960e2b31203\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f672b112d731d76e4b4d22617715711ee17afbc16e51f1f3aef845b1fce57650326a639e81e3acf410e5daa35ff55e6f422cf1db39b4e8021456d3e1120ce5b667\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2447d402d9160d103faa8fce8f16b8201a516a4c",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1601000000ce4364e8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe400000000a9dbb2eb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46000000000b49550d804b90201010000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc60416b55\", \"prevouts\": [\"b6636600000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"becd650000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\", \"4eaa370000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_keypath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"abc52c9b6e558009b409314e7eac5967890b3ab0fbd19460eceb0e93b7565442ece6be3ecead53f592645f60ef462641aede6a98a50fa514baff89d7bcc0e83d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"abc52c9b6e558009b409314e7eac5967890b3ab0fbd19460eceb0e93b7565442ece6be3ecead53f592645f60ef462641aede6a98a50fa514baff89d7bcc0e83d00\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/244d1fe0151e8979539727b36d9efd4236889b85",
    "content": "{\"tx\": \"1d7233850360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708c010000004c7f1e8bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf76000000001971cdc460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706001000000c78a86e4027ef68b0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f877bbf5d2b\", \"prevouts\": [\"4e1e0e0000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"19636d0000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"a6081300000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"ab7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ce8c86c7323be371b6600ab2618f7270fcde0f103b94fe3f1289a4691bdc2f0b588819b06684552554786b2b49e7cd3d9dcfc0725dc4b3b93f8768a6a84fb31b7c07bb1aa10d02d314eb70c923196d0e49e71087637e2d5a1d7fe44c2440c398\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e894b0c937046f490030e0d20905ef6ea85b70027c49d9391eab6e36e103b9e792f3dd0bfdeb3f64daf38e1101738c14790d5f1c68393c583b55b6fea5718d19818cb303569f28fbe8acbcc2d27d183e3a68170f5392df28f40a03efea695d856e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/24b9d083b99a1fda505df14b9b98cadbf34618a3",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfda00000000be838db68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e80100000074bdb79c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b0000000006cc0e3ed03fdbde60000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a613ede228\", \"prevouts\": [\"566f7f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5c51330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0198350000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ab6f2a367aaa484bda76cf2cb22c487a3174d962013372eb1507ff843e34eadf29fef3f39b6974c382e939309acc68924a9d49e2d55515bb0ab5ec4e15f3dbcc02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9d6fe25fcb93992f8d739c892ae3ce58646a41defc8dbe43097bd1a8969882bf972ba62b773fb797f35d670c68b25bfd115b0dbb0e0499496478bf62bc2d21260a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/24bbb3bb32575090a29c31c6d367e46898dc602a",
    "content": "{\"tx\": \"1bbfd49402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd3010000009d9e899b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a701000000e3abf6f202e8b091000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487859f2c25\", \"prevouts\": [\"b31c5d00000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\", \"5ffc3600000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"e47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366bc9e6400471d4508039602a6371cc2fb521d342dad10229cb10d12c2b95e76f158e114954b29a1fe443083941979d23a0210cc324956afb3dcce424fb4eceefbefe4cc2cebe7bba8b4a4f82666342333b91a450af49acc0f1954b5763bfc142\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa0d58db0463b9d01080baa2617114f2c0459e5723b09a0137090d28117705b675ea7c8dd4a05a6083e4a7ce3fc20cde94d430ec03cbfbe8017e9dc8ef3bce99a9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/24d0fbfa8bd2c68fd6ee1e4839bb0d5bb73ef21a",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706c01000000ba310ba08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41100000000bb14c6b3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b42010000002e7adaf704ccf9680000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987d84ad23d\", \"prevouts\": [\"3b2c110000000000225120e0fbe9053c6d2a439b1df3d9c89ed0e68b8279a92dae6907e23437dbb3b4029a\", \"a9cc330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6891260000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a566cccf8d556b725767057e9855e9c75da02cd5ecac659c8e7aa317cb7ce19154c5e66479190706580cf8ccffb3ee9b3d34c0414cbd4c9d7993d7c9982c86202\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"33a3ba65412efccc995c72a550fc3d0ee02d63309953043a9b3a7625796dc71d3f0f5dfce2bffcb90843143fcd5e266635675865d9e12e227ec0ece6e3dd8e4107\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/24e2153d05b71ded99689e64661aa90af06300e2",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127031010000004cc7cda5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2c00000000af66aafd030a6e79000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87dec2e433\", \"prevouts\": [\"a3ab120000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"b7c06900000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"ae7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fab92d0c8bb72b9935581697fe84ef0173536b04207acfd5de8a2df8889a2a895490189ee9b6b94816743a58868693b6f0ba58cb07e4c6d5ed2ce590077e887d5b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364894fe7b01477097453262073e919cd09e7fe7002637f313a53b18e1ba28b741b509ab67bbf3c81955fa9e200008a666546f84b8be37a00b57f87c80ceedbec790189ee9b6b94816743a58868693b6f0ba58cb07e4c6d5ed2ce590077e887d5b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/24f5f696fe56cb9b25c9d12a9606b6d6f531d6db",
    "content": "{\"tx\": \"67281e5e02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfea000000004aacbe908bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42200000000a23368a302d754a3000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df97972236898740461b2f\", \"prevouts\": [\"a9f1670000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\", \"032d3e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_6a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e00afe554272977ab3f2b49abae534781583d7ad56333709f506f3374d33eef12f64831a0760bbf6ebe943861d12fb4782cd4be5c2ffed0f4ef6cf62ae98112b83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a2aa46f3072abcf280b77d2244b9bc38a46f398b11ef902183651c3e5164c5ad7ec3f3f84a32670ef00ac3ff6d05778f256807269c913366abd1839ac88817dd6a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/24f8bbbbf4e945080301e930844b08d263783100",
    "content": "{\"tx\": \"edcfcdd702d9befb1e9c529d7d9073823d42f590d5d83a9ae9e8205a58b2deac400aa179de0000000000aed2b9bbd9befb1e9c529d7d9073823d42f590d5d83a9ae9e8205a58b2deac400aa179de0100000000c9ef9ecf037bb08b0f2100000017a91417076ced824a76f7f00aa0b9ce412f8713d9a8a68758020000000000001976a914798a0f34de6d8f95c4b7ca7c79a0cd208c63fb0888ac580200000000000017a9146e2b0fcc2c4086d85becf46dae6d7af8c0bb07518738d6ea54\", \"prevouts\": [\"d453c1ad13000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"8032cc610d000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/keypath_valid\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b0e70b088525ec9342c39ffbeda6de86c95b6f4e996aa4d1877d6528a735d6f56f6c5047e4ad727e6c8147f22df9423a81218a920b673bdb6b66ee9f457dcac4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/250db3e160a3b1e5fb27d5880463b82d2da450a9",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2601000000813b7ae6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc100000000e9fc16df02e0e58e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac31c5cb4e\", \"prevouts\": [\"c5496a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c351270000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b6ca9bd00465ce94790b3b7a982cef870607517f3d3166496de7dbf5954c12613b218f74fbd0c55276c685331fdb0afd974d82655877a178fabd8a81865588a6da74b77cec5b7fe449456850d166470def075aebaeccf9499b10505089f5a1cfc7acfc3c61e892a316f931a7e8a743174c6f9d4dde170747ae9fbe17ddeb8e226e47d3da47b9a193dc9a7264e112daacb6f035e28c5102c6322c133c5f5d0b1bb197927209056cbf10e65ed20ee2eea49bbabece407e63d9389b55497709689b44fad0ea8d4fee74cfee5740c541ca49e9673207ed1c91a62bd89cece466f5041baa53f4877b4cfc8ac12aaed89add43ccfcd8614fb3448e11119743c06c2c27fdf88097760c4c7fb482ff62ff52f95440b228504b9369885666588b5aa959d63642f6a47526912090d7eecbe4577ba7566ab1db067ad735b38ccdb03512eb6a8fa7442aaadacbdd3f6a5d23d69b9f0af76d5a288097f92b1d4bc459202435466efdfabe45bb529d952e000da4af29575a01d1caa8864ee77d8dd70f110ff0caee764a67658d9b9d0b8a44122ce224b2625c2c7ca1a2824d78fdfa1b07881176fc1c37a8847e7d8ccd5738fbf671df2af66a030bee73931c9e2657ab6c06fa189af7a1adbdab9b9aeab90c85d457d6edd2238c1aee017c00eaab0ff850925e168cda5fbf9482886ac931bd6a5c74241ccf19c6c7404ebf7e3f8f51cba95a9e4d2d8e39fd5eb5bf195475c4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93640426f7abc0edfa3e5837ac88df8e230a9790a46604f0df0976590e171fcb82c1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045161570c3f10a90b75a16babedba4ef90c71a7e82b9436df981e4930578e77912a95f177959a3d24a94a797d1e607e5550897d4e95d12a52323e6e8eeeab3383c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09026d3cc0d5b63b2610fac20b94fbcb41610aeec5956b511addfa87dbcdbaefc7eebe8947f2684977c8e598abdf9a0f776e51be058cb66ea05fe55aedcba2f9e576121e73dd9202aaf615367a08a46de36784d8eaad291b896b7ac5dfe654c93fbceb111f336f78dab89e5146430f3543b046820131318492ab4520f545a20f62b25828cab0aa3cc5dcbca3f3d0d454bd57823890a8e73ec4e0fb3393f34b42e22c782d8e5221d30282e3d0c91b60449f3e8b9304fd8e6547f2b239385ceb9b2631ac2e7d8b00c2d99f588ca876d9e405d017c9f3c3f9a8806bc7258f3bca0c7f2a8e1216042e649b8965bcf7fb01c9aa5db3c5aa942a9cd51e977281b3d747d72e783091cef5ef104751e70a066df14e1d03fde151b640efaaf6d606696b9f9034fdbda7d2e26ecc6d3075bf45695e6693f762752c121af7b799022db8e5ec0fea45c6b2fcd1b678c87f9861e7b0b3f86af0397c4cbc42780ab6873797831077171be6e0e71121e699eb94c06fc2ee4c8b27161d529d9c8fbbb1060fc15a6c6cd2215cdbb88e560ad167b99b03b058db52d78b14b1b51b7588c126ed7babea7e89aeafc539d5d3dc0f5612e50e31d95f3b6ffcd9b583167a929c32a15a50b1311f572261c5793a0e734b245611cbc636fd664507535e33c1b3352d13c0d0a011bda9d54974c888386e5f4eb02d1c213c20dcb0ec07b731ca05b715335c8bf12fa6aabd0d23e3401e39777561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c204e79a2ed843ca0f497febf0944f07030a971653548149129593a3acd07f1fd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5174048a48c6eb42f280da39a6557d46ee4318cb4e3319043ed115bdbceba7fd7e7407b97958d18eaa787c1cc29670cd8872e7fe2ef4ae33551cfe5c61fc2827ee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/253542d32b85965ac57232e3741542be2aa8d091",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d1000000007867cfcbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf47000000009ee3dbbf01c2b77700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac6c0d4c1e\", \"prevouts\": [\"55523c00000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\", \"ad3d770000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"864c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4a89eab7efa8b8df17a82e815a072b99e340ac1768e499ee92fb25d88959474e250636431b24706e8b1111073dac761b2ba654f4832b7b9ae2a348c6845c1d327\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5286\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93696d81c4fed743e71eb520662c2db8c0fc2de5c834e975d368200854a3f19047c9a49af0eb7097a2b25f70d75fc7fd7c267678862dc5ecafe442b2ce2fa2401f5a112aec6b4b8b5b1ca7f36a9e0521bdf2c7802df3cadcb1e8aa67d830b4a0d3fd33ab5c29645e0220ea4ffd8cb7e67404885cb8b0cf94872336c7b06d59c3124\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/25452194c45988fdb9442f977481e8fb95b4ad75",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700700000000cf91ab8ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1e010000002e60e4f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43f0000000034add3ce038151bc00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79695b58e1e\", \"prevouts\": [\"055d0e00000000002251203236882dfaab6a61030776953d98ee1af902cb36dd280fe66ad8ee191278ec27\", \"e3536f00000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\", \"e1fd400000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_7b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"00559de3606cd6fb38dfa5bd6a0cece71320a2d5799b2f8df76ece1731b38d5e67ae7ee68f9c2efc1f9dccbede1c3586122debda6c390f1351aeb6c0784f554e02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3562b94c856a14147b325fb36410535b2d563f5b4302b04b7a68817b6d461b2274adc80d114388f32f51cbedde6e71d4859959baca2c45bbddc735229bdc8b1e7b\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2546c1139a14d6b2b3d6b9918c96de6e589fbf07",
    "content": "{\"tx\": \"7c7bc09502dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4a010000005814a0c1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf72010000002a1554c90484e08300000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7fc000000\", \"prevouts\": [\"d98421000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\", \"3e4f650000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"3044022007a486a869114165d5fc919c2eeec61779fc7b02a178f36b22edc5cb6a9ece2f022006e6213f5635c03fd8510cffe1da06601b5f4300c850699773a64590442945635f\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"3045022100cea15e514cdb25add06b3fbd62c250979141615cf92db862a8914169378ade5d02206ab02b7dbaf2f7ba0a077b95ae41e194116ac2c134be22be0ffbb84159d39ed85f\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/255e0819d8c9639459a4e49579fbd923cdf9240e",
    "content": "{\"tx\": \"5212986602bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe100000000b6aa49efdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcb01000000fd92fc8b04ca0fa200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acecbfb437\", \"prevouts\": [\"7f66820000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1060210000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"814c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93649f82d663a1e447420f2cf05179af13964281439b8b427a6cb4b09af5b0cc191d3571a06a1d33120289e06483b2785a7356eedf367170ec7792d3587508789d4da9670c383f4b71f5a22d48df0589bd68dfe195935a65f1aeaa80f10f8ca6973\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368d2fc2950fe45156b8c56aeb245dc43c1c6a55e17e72ce5d38a429da4652849019c228cb7ae814d70beabdb725e2cb3ba4f8af3a16648b1300fc97d27ac433c5da9670c383f4b71f5a22d48df0589bd68dfe195935a65f1aeaa80f10f8ca6973\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/25608654bdece6361519480d9115afff3312cb31",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5e00000000bb4e8ee2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8501000000acba6b03047a1da200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac91030000\", \"prevouts\": [\"a3a5820000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"952e220000000000225120b52a77e37c1fa9b4a7b934796858277b8dc346396dc90993eb725a9563cf0842\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_bf\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f593154ba8af9b372c525572230278b9c19b2a48dbd79fc5dc97da5541c23ce446f3ce84a544c17463a78167268231f7a3954f38be52d4629d08ead3369482fb83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"dedf1a77c9358f8385d28ea34d869318f7ad41ab42642f269cce982fec028412edb4234c53457221ec57aac1a2883eeb37b2ef75eb7b4a7141237ff2e293ec8fbf\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/25bdf9d085288589dbb23f1fc7d98f7783cb09fe",
    "content": "{\"tx\": \"82e7331e018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f6000000005e138bb703b93e37000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487db020000\", \"prevouts\": [\"49d039000000000017a91482be44661ef9d172a86ea47619409ff206130f7487\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2256202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"6ddce3068c94bded449e8fc546ab815d4baf7ae5981f67b59a6a85fc59ba731d1e5f4c659e5d88afefc4bc08228f2f291644dfd3a99a48b60452f4416eedf576\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/25e7910e53d821321fab3c8bb9db847f37fff616",
    "content": "{\"tx\": \"6f7d0d91028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45d0100000075023faa8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e9000000009cb7bebe0114cd4600000000001600149d38710eb90e420b159c7a9263994c88e6810bc722010000\", \"prevouts\": [\"db1f410000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"a72f42000000000022512012d5e5f1356f7dd71d8fd34dd655f0d6117e8d6eac3bda425a0cfaea0a76750b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902474f16723479a702a9dd4086a6d913f04c60f046a28d4c3bdef03770d37766806130148165a399b8398f1a7a6101dced6c179bb01a4f58171a3cba1be405f3a4d6e4d8915b513563548274b2350913689a2b297bd7fb11c436ac69da8b7dc4e71c6d4956b2311aecb026f17411b65d6693f46e2f2cb4d9adc69ca99be0ced3e6ddb431514a79ff28635bff881dc5d7f0997c15764471eaa977e515916f501a35b6f85748b3821c1f18e0dd7cefb1455cdff896a1884d916e645c5a61ec830590af1a715d3653178f3d9f4784ee3080b83e4d9ac7c3a5285b1810bdf9c9641904258f5c2e5a810c831e3ded934f04c6dae31a4513e05ce52f75339f0bf2a9d8370395dc56c695b4e94e35703d06c2b89e79e18b6b7b1a5d29c6764f85c76d71c5f75514fcad37adc8f88b724532f65eb5d94402c31bf5217b1ee3fae3a1cc724e889c3bdb0f4973d23b1b023badf2786ad5f8514fdc9c901faa73face5ca598e7c70e64a38547e50fdffd7e67612061c7dc8c8c442c7dacd71b0961aeace9aa18b4c3d9750fd3b07b6b82b03abcc7e486c33345b8d11de7dfea74b29c0e0e5c379a5a69a80fd4e081df770950757e6f3adad7f637eea9e39a8b6d3f14973443ec2a78bd46959ebbf5f86b8774319f94349779d879b54120ec4e95040120837343d6958b3fc81fe9752c28b02d1bfa7c575be75c3b69f8e72552f140154a3fa2ed87cf9c0784316d013f758d\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e1ff68bf827032ff32c71cc2cc31eb8f40be3e575e2b9e5ebb1de96bc2fc57fb6a7569334f57ff848fadca8fed75a3aad007c69b24557dd271b830b96d574d63f2f7628d981d9c0428415dafbd1cc169dd3ce50060f3002d6f03fa895459568af43de7556260bd81909ce9fa765818ab5d5ff32210a0a876b048ce5ffdf4a21f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022f5a3443246efea87c796510050d88cf4e3457f805df227ef0f78f28e0783d00488533cf9debf1b6fbcdac460fcd69643214a3c1065dc5c6775a77c9d91f10479c2c465fffc8b82b3c658eb8289dfb776218fd29e1299865e770952f0b6ba7fc28da221ba35699be6f01dd6b4e07e335abff4a640b5ea9bdd08d07aa5dba50010c194d02ea6aa3c393aed2b51aafb7e7ffa26cbc23836ba1d7986eb90456a905dee34fa3195e04ed92a5e2a64dde4a2580ae0a71b94a2dd247cb63db853bb88d64dea5ddaffd9a0cfb57322e76f6fb12b4239eac0b2408dd779a90255ec907eb7c27664ce924c6a6920d6c793a65ae2d0d12f4b5a7b51db9cc92798737643f63fa7bd1ccb64a737d749068fa91fb7de636e1cb3086d6865d538f2cee23bd9dcbbc4dd7b05d582f75a54b58a751cb45358bb07449bf60035f3d913d5e31074139a57acfcced21d25eac61e76c5e9a586804f18b12f4d60629809c43396cd345106c971019b88f5c485a7d84d057e3c5f64ef1057d0389cb598151d4b8577774844dc0a4cdc5c1fa841f9f41fdf9557e59cf3f274f02a2b16b2411ed9e1882ea17cab93c44850f7a768512a7212a1679bd8066716d98b61e046d9997c602805698256778c56d3866b4cf166673f5ee8ca2820a58ea7d5068101a053ac1af88127f59b58bdbb2b5125aec4c27da2d1eb65e05c00109a36fd167a8e09a6b9e7c944af4a82ec2070aeecbad7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368c644295f81108e0be886f59870f13809827e9d797ba4690398470dbc4c919c19886f85ebb300297009aa959255e1f8e976b091c7e06b33477ed400c40a83b4c185c953dbf0a33402e724bbb72e47d874a897a0941d53d9706dc82e2e14efc19f43de7556260bd81909ce9fa765818ab5d5ff32210a0a876b048ce5ffdf4a21f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/25f13dc685e40d3fb22819356cbba4a5a6789e15",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4b010000006599e3b460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e9010000002319b8e0033a632e000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7a3600632\", \"prevouts\": [\"b22e1f00000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\", \"0de6100000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367b6726ecd04cb905c4ce1620edede51b486a0bd5e02be9efb7864f9dd4803dfc8a154b22b0f2e2bdd7f3b34b8feaf196c14822a5749c8a329692c0e12e8447d605976fe26432a41f3547171b2b9abb696d7de0172bd15211267873326056804912e839b87dc613c826a9c62085431a96f79b8782d4b0fe31dfc75aede09e250a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363993fbb03bcf38c66ad1844758b0c7119cbc650054de9c9a3fd376fb91c92df78a2960a95becb1bbbe0636e0493c58f712af9b8da417013d797bf12c130ac56070886d9e3726a9aa8a2b94454683b5181a970edd894e0d0cd75aad09f75436b2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/25fd25289846f102771af05c1445e63acb583b93",
    "content": "{\"tx\": \"abcdc84802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2300000000aef782f1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7f000000006a9856a70490143e0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df97972236898704010000\", \"prevouts\": [\"dd33220000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\", \"a0951e000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"8f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936963dc86bc71687ecacc1e5b8f2c4145fceca424a4eb02fbe2bf7a8e8f9bd1024e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e81f261744aaaab7b61bfd8b873ce05c274059b1d1cb072d2d2c67e8900f407405dd5f972b05e2f18c3e7c797b604beeb8879a3af7f1e10968a0ac8aaf9d489fe7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa458187dbd74455692a21727c8254a8cae6fcc3fc3c7e883861248db6e64d9919f8fae370a255a677f2f729010dbb329fa966ed9a0dd82e5083dd7ea90426dc47\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2619632226257817c56eb288a9d2075e56dd0e34",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4df00000000d95f0a96dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8f010000003207e989016e8a0d000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d3010000\", \"prevouts\": [\"4a6b3a0000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\", \"6934240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"477d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8af5253a3ae898682e613588786a672ae77746787ad628dd74364be19bb5242936657009e9173c5ef8826379cea4b8c999e3ae37a5805e4cc6da117a3d2ee0eec\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93624f7d08525b5d52815de985e807035e6f0110330bf2d62b1ce3b9c92499c7c7ca24674935b347637fb115fbceef28e6d08e5e47afc6eaa336546ee2e891e964bfd9e929a06047270fff43ba4c6b47136464c62381aba7ed74ab98bc69d199aa4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/26300a1704f502625832730a36d0088f21a46e2f",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf19000000009d3e6ea68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44800000000855c81ec04bce4aa000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478709000000\", \"prevouts\": [\"c8fd7a00000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\", \"b6d4320000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"d07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362b8a3482aa7cb17cad77f3537e7f0fb67661c6720f234fbfa8fc690463546899da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e15c449093bd19eda03bff23881ea6078d018b9cd0ffff6e12447ca822e876d277e36b196311c1a9d305bc653889017f46f4c4934a1587d131a83127df4466fae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360723cf45802ddf87c5577cf46e20a53b28825f20a581d36a06d1de070a7e046a1c85c730685924be02f7d46bcb10c9c474c6189388cc381e7f7055dcad1cfa477e36b196311c1a9d305bc653889017f46f4c4934a1587d131a83127df4466fae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/265d0640e2752abb03fbe0a1b150f575f8469aa5",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270190000000065a894b4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bed00000000c5e85eed04a6fd3100000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787cd030000\", \"prevouts\": [\"661a0f0000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\", \"f080250000000000225120ed31d524ef6bc5b71a68a40bfd6359c52f177bae49683ad83ab62d1806c34929\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e85f3be5f8f698e83d3665b890524642b89b7b05493241beec338309aba778c454d8fcf0fa02e125fe1892f3caadd01fd66f2ae3104b90b9e35e4c43083bce335e4e9031d393e93ec4f3e9da8fc51e83b82f31256dd96ef4af94581a47eb5c67bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368ce38f36f588003ae3435f4b7a2e1027d2d00dc9eb0fa8adac7713a480749442478f34169e056cf51b9394d2ada3735c0a63dc9f48f236da8ac021a74c045d29ed6bb91bf977e9e370b444e9d5512cd4ec7f3694a9311c01272a4c1a167cd930\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2669c9c65bf3af74d4482204c70ea69545d8babf",
    "content": "{\"tx\": \"f919006c02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf62000000009ccc4ad2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0800000000c2f31cf701a3813c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487d9fcb420\", \"prevouts\": [\"8e88720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"735d69000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cd134634a4384f5c6c32353fe0e3d4d3d31c5b176345ebc07f2d6b30b01669e93bd94fe207a6f5e1de2dfe583fffba5c4cdfadc0fe688e34f59c67edd84c81e402\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"34f4a8bcf08a0c7499841efc7edf06fb25520b9fa9dfc2cbdfe0b4a9c488742f71d24044f0729ee618ebdb316ef7c67370cec6e754683a0379cf2a680317120d02\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/266c1691a90b2a342849d25e3704659308c45951",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706a010000003d8886bbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf770000000088db63dd03e1877e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478742010000\", \"prevouts\": [\"ee0f13000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"54426d000000000017a914f5a65ca4534ef3ca5833434c0dd44a3e128f499587\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2259202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"427dc8da4ffa5ecc822b1cf3bae38ff8a32e3788355b9ea21ba5f58b5e2eb6f6a70fdb814bdc4801d45574dfc9679198c5d5228957fe3481a577a9cd3a280d28\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2670c894e879a8499f50e08ae018e501b6693152",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5500000000e17386c6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbf01000000655e64b60215bcbb000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48731792f38\", \"prevouts\": [\"e16e49000000000017a914e18c03fb168c1c1b3408ffb477de8ff77b0fbd9587\", \"c198740000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"235c212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"32ff6e2411fdf496fa6bfc80d7fdcd16b6c28f11fd1090550cd0f96c6c0ae439a7569296b8018165923a6c60a08873efaa1e0d3579a9e43aaa530e4da034901d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2692015cba943bdfa1b324204d53284234754d15",
    "content": "{\"tx\": \"71b5e2d803dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba401000000be38a9c2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9b010000003949d5b6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba2010000007c0e80f601ed1c22000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787e6a4735d\", \"prevouts\": [\"4a3f2100000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\", \"f873240000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\", \"4005270000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"e67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d518f5fcc4dcd317f656293c43c0e8e59e06b99ff36e809cba7caf0d79972dd48256d6f90d235a6ba3188b640209fb1b87a6d8106344fff793e748ee999a397d93d03784866e2fdd94d7d1b7c12b1f0da96746c05c19b8696f0ac6a701ba8135\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee92d7728fe824bb86fbd19678fc348031552299afe2faac0cf612835804e2a859ea19512c809756aa5c58e4cd3562935caab0c2ca4eda8db33914ce4decb3cfe9d11a7792f25f0da70e8485da42647201d1062d1bd001b767f1b05dec6877400\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/26fbe1c5bd294a3fc35af2e36f46c951b25e5cc3",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d900000000dd8001afdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c19000000007ff930cf04916466000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8749030000\", \"prevouts\": [\"a68d110000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"567c56000000000022512077fcdfa5b83233990258cd0e78144655048956ba28606e7ed979bb07d82944e6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670f2b09ce069cb1d2f19757a518c7d2541e6ab5f0b990938e6d2f93119732f11\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a70616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2721ca2fc08ca7ae38cc809a3799bf618ce5a75d",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703200000000ac43b0a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2801000000ab411cb402bca15a00000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963af0dd3e\", \"prevouts\": [\"d08e120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"319b4a000000000017a9141d8eff3030620b266a8bb5e50900ecd7b2ab72da87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_22\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1d30e194b4df56e01a172013a81217111f42aae7e242ef28ac1e86f071b2f101b3cfe1acb5c3bbe18090905b5d0418b1630f46afd2b9d4e64cc490ca5599f68301\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f0785c48c61905e841e84567b2ceb69b42c2bae46fc17cec918a2dfc700a36687ca07a9bc318dfc810379f1ecd9754a11e2e20d2aa8abfffe44f36042c9563e322\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2756fd453011fa7471613114061631b066029dc5",
    "content": "{\"tx\": \"7aa1c49802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf23000000009585a1b7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b88000000003b0b69d601c2a39000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac3b797542\", \"prevouts\": [\"9ed88400000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\", \"440b1f000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"7f\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936db342938b39be9e12773a9624b573dbb1df9d93500dc93058087a84b4280ff8e70f73741da43ca43557c58f6aa15023f4cf70566ac935702465d6fb0f93d4429f8d5397512e216c7ab52609f0ab27ccbbfd2b7e561d7599ada55e292956af911ecddbcce676de51918ff82e75e695523ce4d8df7d4ec353d45ae6331617767e1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb44a1c4274957806206aadadfd15cabecf517c42c49a66a44e84081097b7475aac480120d5a477c096fbef97d1ee2aeb957fc425ff8aedf322b93097b3a97db744cf5fd42f9969f7f2472ed1fa62ffa49909a09466cf06ef7c57cb1be351156c54\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/278eb959a30cf3ec8163a007eb3f89ef107765ea",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270230000000056475b9ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca0010000002f35f8e0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8900000000ccb14bf503f56ee6000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898746a49225\", \"prevouts\": [\"6ab20e0000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"e73c5e000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"aea27b00000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100ada79d62fa15f9115d82840b8691c32a9675d1153431a30d84c575b27f655ff5022037daf47feead7f6bf130cf9b11c67c0ddd821710093bfe758b63d51759b1e2b882\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022055e9d1d50eba789b485e7be1d8723ea09824cb56ff53c14b2dee44d74e7ec379022070fc42377626267d182fdb531525ef651da68d02a997ed5f6da35f9751d958db82\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/27ab4c447f840d27a13d145eb27c80db511a400a",
    "content": "{\"tx\": \"aceead2a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b940100000081d662d860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270db0000000091e8ebe1033d623500000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acb2000000\", \"prevouts\": [\"f89c280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"688a0e00000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ff\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9e14bb8d59f2cdaa26d8446bafdb8ad8e26ae889daa3c5b6be4daf7a5c66b12ffefcc72a251df6530db46cfb3872d1a655816c7e4d0baa30c7a2d8557b82375f83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3a2b267d257536b91fa1ea735b5cafcc7a828875c141be7ffa30f52e08c3eca7fdedf355b3d272cc504879d9dcdcbe4df548b291235c0737fc48beb180a84b71ff\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/27aff0ad61d128505e22df766c0492e316fbd9a9",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708f010000007d6193fc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f6010000004a71e3b960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705c01000000093cd1cd02363e64000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87f047c423\", \"prevouts\": [\"df2c110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4a5e4300000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"818712000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e26684d91d6a25611b98f9525cf8030045f0e379e1e6360450dcf32f11d35fa349c2fd9879a2ee2ae7d76224c991edc718b1729f7f1922f570a67a21926d2cc48d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93600db14dabffde4eadee715a8622cdc410adca6ffbf626fcd1e3a6b0b6e154d3c99aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4faa718416d21ef008df2257ef512539448f5ca520db3fa3c7b8aa919421e6092eedc10b0e9ea9319d9c2157dfe80b60aa665931711963da9ab109764ff1ab789\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/27b9b3e3bde2958e048cee68f2493d41648987d3",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba0010000003f954bf360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706501000000f7025ddc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ec00000000d17f70eb03851b6d000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3a773856\", \"prevouts\": [\"90ed1e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6154110000000000225120685f1f4d981f8d279e9288f3fac3f130840e4486d97e094876558f7ee35a7d24\", \"1f353f000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_70\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4dda5727b9cd37b5c14c9a77d8af9d109ec06230eb6cd58d9f51bbe0feeb0ed852e20570d011a45d84becb8e6cf238140c68a811fd7571bed3a847994bd2e09f03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"498ee427afbf3f1d086ac1eeb701926ab18225d1677e7bc7ed55b83c072d4f6517b884c5050b13dbefac8a91c54a49bec9d0e094ebcf4868148dc71241d79f4f70\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/27be24f0f9eb749b51dc6e83c6ab5c8637349a25",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc7010000003a0d4fc5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1700000000c98173e6018bbc4f000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87921bfa49\", \"prevouts\": [\"658421000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\", \"ad0a4c00000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"897d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08246c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa58e965213f8dbdd3ccbab86b6d585f0f8e78abed831015bbc989f3cab476ce59ac632f1e88e109b3d5485dae08acb0148fc939094c3a94300b3efbd66c89bc20\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e8e7fff1bca432c9ba96d0556d2ed7bd47849d71950e18b52879751e42d3038d46c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa58e965213f8dbdd3ccbab86b6d585f0f8e78abed831015bbc989f3cab476ce59ac632f1e88e109b3d5485dae08acb0148fc939094c3a94300b3efbd66c89bc20\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/27d37797fa4bb9c3bba68f9967eab892fec70642",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0202000000b786b0918bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a20000000008aab3a404e02093000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47878a82972a\", \"prevouts\": [\"2360560000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"88d43e0000000000225120032ba6f397146bf93cda2585b16902a48899558623e6c842c83c4de6509e8b52\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00638068\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045f29e1e33c93035514fb0dd85894dc242cac3fcef5d3781aac1ff5cb7ed66668ed2fecf8564d6a652bf0232997fa790ca314d73b111c417284694cd1738ccb12191585e32e966e39b6b25c1732dbccde0ae2700833a1164b08d78002e58493a9c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a13e25e6d35815262cd49d2dcc0fd0de63cfe51aa238dc2e6ca3c341dac8fec3f29e1e33c93035514fb0dd85894dc242cac3fcef5d3781aac1ff5cb7ed66668ed2fecf8564d6a652bf0232997fa790ca314d73b111c417284694cd1738ccb12191585e32e966e39b6b25c1732dbccde0ae2700833a1164b08d78002e58493a9c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/27f1dbe3a65014c59ae266af3346177a5a57d4e5",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ef000000008cdb3d2f8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4740100000070de6b5704c11e770000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7d5000000\", \"prevouts\": [\"21b33d00000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\", \"6ab93b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_b3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cbac7272a76e134786c66591596a58a32a0e363a6c6d1dff45def2968dcb61b0d39730d5d0392d53f294f0a45acd9374d448934224a8fb142935427831900fc302\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c765d437cdac54a1521f4c8960c1afd35707362404339f96252de68961be4c3227f95a2ea6a636e381b263f3c90908a09a7d653e583805de653055e5c68776e2b3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2807a46ba9b453c2f9e4af2406b26ed38137b216",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c370000000026ad1f6dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbf00000000f2e52467039292ce00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac85020000\", \"prevouts\": [\"88de5c0000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"035a730000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ee4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ba746a1e3af4c529d3cdba1b4e6cf9b58f2b1e1d981455be45b81cc2f039993b0f3b0db014ceaa26ae02ffb8f31853eb721e6357de034fb71f3898341a9ea5240028cdc19f89baf6c362287c7c7841c4536091540a9bd978c440258b5fe7844c439ca2b6d52d4fa79aee6ecbc14a8999a29f1c28c4c5c5b9dd610517c3b748ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52ee\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ab3d7a13ff99e8e18dacbbc4ceeaa4446ab48fce45aaf041cd197f8d702987f5dd207214d6df2d18dfa237afd6016520e9e6ed6636ebebd182087bb183877c35439ca2b6d52d4fa79aee6ecbc14a8999a29f1c28c4c5c5b9dd610517c3b748ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/280d6a9607ad78d3eb40f04e5b5a76c6f8eb4c02",
    "content": "{\"tx\": \"0affb4e102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb601000000148475f38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42101000000c9d6518c023f499c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcf4e9e538\", \"prevouts\": [\"110a680000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5f3e3700000000002358212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e4fd4aa8ed373d196ab6e9a0ba8935c0d889eadfc5126511718e0b222975eb97e2f882010153a250c4f4b2ac4fd2d10797cfae46c68a67bcccc6a7fa91e2636c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/28259bbbf78c881c7400ac4602722df51776ffe0",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c57000000006bfe37f5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd9000000002b9ed0c5018f7108000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478720040000\", \"prevouts\": [\"571d530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a4e51e0000000000215c1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"dbb4ed59e14362647749d55139746050f452d9ecc6c022c09328971453f73ac09c4dcc8d420a62aaf6b133b2cdf953aa3df1b048687bbad72fa841068b20765c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/284cac89d0553dfdc596ce4bfc4251fd2115cb15",
    "content": "{\"tx\": \"c78d28c0028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b900000000714907ce60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709c00000000d69c6cbb04d88644000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df9797223689876b010000\", \"prevouts\": [\"d6823600000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"c2831000000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"f5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93648f8d343e45b2a3fbb17d68cee821227f9a1b53be93535e58c68639dc86e84fc4b6f5261b409d682c30910e7df322d9859114aeb60c7168b8885bdaa0165cc6510b3b87e8b9d8544644738d4851bae032b2bf37d3a4aa6541b936ff18c715610c711f738010c3c65afa09c620b919c88f85303c8a6c3749257da2d218fa6976b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c7e8952e748deb89d7f1315439c5970ec42920b4cab4cfb00d3d1dcb758e23bdbdcbe75f074483e48d717af2cfa8ab1bbef1c35fc84f016c108dd10256d535ae10b3b87e8b9d8544644738d4851bae032b2bf37d3a4aa6541b936ff18c715610c711f738010c3c65afa09c620b919c88f85303c8a6c3749257da2d218fa6976b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2872201824aca727042b22cae049102582283dd9",
    "content": "{\"tx\": \"a5db689303dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8e00000000ee83d8e88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49d010000003a8b0fcadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6e01000000d40773fa021b25830000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ace0020000\", \"prevouts\": [\"24a5260000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\", \"e8e73c0000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\", \"4909220000000000225120acc511cd55079365da76d18a33af3ae7411f3879a9caec918e9264c8959f5dac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"017d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93680d50eb913f48c4bd7a21deaca51149041449e391631c234baaeef92aa25ad44d7f8ee1a917297df4869582a1b348cabbff1db4a1952fbd39d89a346cd02d0a88810a2a55ef559e3dd2f859359930339f67e2de31eeac841179b888fd41fd8a3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee4e5ee47dc19cce5f5bcfbe17d15c6a925997647a0a2c3c32d22380bb5e59a56e05873438be84f92d1402d5d55e9fb409fe52800aaeb5db180b239b834bc1ca2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/288e61a59fe0099d03730d5c9d59712f743123a2",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b90000000044735f0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a5000000005a25110d02bd811f00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8714020000\", \"prevouts\": [\"8cf00e000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"bb0213000000000017a914381003aa1ce42a7df73f2dd1e6e78ae0a36c6b1c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082093e484a9e3a7c57c3845514d142b984218effb649d9e5eb3f309ab706810aa991d26af6ddceab3892536958f1ea20dd7b885ab499207106c7decaa6511a0e4c5a35b5683fdfa8774cce0e3f4376573bc9dcdb125f140a48d9cd3d58bda5cb68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93644f2e60a682fd302b1c3c798b38ae6e5157f4f93288539ff9c08590bf0a0b2aad300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5112303efa97a8ef6ff3cee2bba9a63ee7e38a3d19e4db44f275f3f55c4e39991f7cc0cd924d9aecb0bc2fcf01621d0e73a88693291594fa52fe0219caeccfa5b3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/28a21b4f4afeb9c978b1290c620548f1f33e127e",
    "content": "{\"tx\": \"f919006c02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf62000000009ccc4ad2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0800000000c2f31cf701a3813c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487d9fcb420\", \"prevouts\": [\"8e88720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"735d69000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0ef016eaa849eeae9a07777b6688a6da7982dcb02ef9b98bbfabfa68721fa22f79a121b00be8e65588652fa6f7a396e04dd6496767c76640ec8817c0fa0c20c382\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1a286ae53a16e195ffe38b0b70f03e31f7b8293a664a7f566b1547c94a9f631b521b544aafdba8dafec5583da9e032adbf676a1373c2e8967b03f911f63da1d90f\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/28b1a2ce5cf374a3ce64a6c7853fdbb6a15d1e25",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ca010000006bee4fa801e60a040000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcdb000000\", \"prevouts\": [\"74673b00000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"317d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e14e57181048ac96cb53327a8f686080e72dc312071604fe817a5f66426afc20b12f65ebf74c8b951b09da599ea3d6f486010b8cccb0a2142ec39aae62c1ca3e7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363c68f787ab385ea36bbb3a618645cecd085be4294b842aea644329206b21f53e4187c77ca06c68e3a239e6fea37385de49c0e93bf09ae3a990bb588f1e26193612f65ebf74c8b951b09da599ea3d6f486010b8cccb0a2142ec39aae62c1ca3e7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/28f223ee6f9c2562b1e382ea899bc7f88e63490e",
    "content": "{\"tx\": \"5f9251c902dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf800000000bc13d3a860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705b01000000331e88c204b46b2e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48766d85037\", \"prevouts\": [\"0f9b210000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\", \"89ee0e000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f48f2841dab59f80ad6998fa3cd0986050b454c28fbbaecb941d0e8795529b49f09ad02cb012ed2091760f4e9ad26775ad10447e2b9e598a8be746abc4727fb4e3966518140ddfb4b2a9d93e012e33d80f6a3bf7f24f1b44efe84ec3ac236f0e053a85c36f8a6bbb26ecc461a581c33f0f0e79993e29030d20b8bcc8871f830\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51b7f6b7f6faf43deefc8dfb90058dbe61b727862c364ff314077bff4a6c878d2754e6d4b188f4ba3829c97f16419e7d7896d7c05fe6215d1417ce194d9971cb9e3dda2dfca806ccc9c3ad62846e64b9ac16121de5d926db5bebf2e82f8dec8d2a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/28f4e044d59009036250527f061daea52c6b5917",
    "content": "{\"tx\": \"9ca1b5ad038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46400000000a64e37f060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e001000000fa4a59c660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703701000000d0973dde03647656000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd90b845f\", \"prevouts\": [\"ae4139000000000021511f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"4d750e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7465110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_3f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5cb3501b241eea500dedaaf16734b6243eb53e4ff4acd4e81ea8ca35c0ac1aeca287614ea75026f7ac7b806cc7d6a09e211fc149fbbac303a5f4075fb083314a83\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"444c64a22e1610258cdaf53ec7625f2df5c6d8af447b82d0ae63d8c323b1b69bd2ef597e20675587e40d925dbb230b98ac201588e7bdb1749777c2be392eb9273f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/290325a794a4307e35ab570d847c9854f6d63001",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4da000000006af8c3e060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270870100000017873a89035f27450000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcfe030000\", \"prevouts\": [\"2887390000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\", \"a9700e000000000017a914381003aa1ce42a7df73f2dd1e6e78ae0a36c6b1c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"1654142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"8df426347ce7aa183839cbace2dc0aa6559f8e0884b104badaa8f337f90ca4beec5468c71dac3655f4facf4e9a257dfd14f021ca3a5866be730454807685f9a7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/290a1cf15d24d80b8dba0ba4397f5a7eb13382d0",
    "content": "{\"tx\": \"865915d603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4200000000458456e0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9d00000000e0cafcf560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707a000000000805b2d203a5255300000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac4a000000\", \"prevouts\": [\"ed2920000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"3f51250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e9fa0f0000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_8f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c38095a8e2603d473d663749cd03aa5edc0c9224eb38c6efdf8e4872b14c37516b08471a575cbb113ca5a41ef9cc12294e3e3b7205928f3dd873b17f19b7195102\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2429f911d27d6e99d9a0ad91ba066dbe28df85ac96882efa0d3a30838ab045992494697bb2bee74d1b2a81a1b08bf2bbfe4f959cab3777a4f9be5d0caf1cd7178f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/29186f53cff8c33b62ccd1cec92b4c6b02c8c2c8",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd50000000053f403cadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8c0000000080e6db55bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0b010000007bfc680003fe5216010000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc79aa1c358\", \"prevouts\": [\"f266720000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\", \"bdf22300000000002251203d5ffb7cd06f5c84b56ec9f73ff7cc3a22b38565d229330748f260d30800c008\", \"acc68100000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_4\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5dda6d72098986d04518a24d2521425ba6d77b741f2dc69adc71135d06cc897697b9b998281b4aeb839e0b3bda61f16f4b4c505b81706352bfcf18ea801720f301\", \"d4705b44acd3ec855c255a6dea384759d5063f3b2150dcf17db724df5cc6c9ccf15141f6e0a22c20c664f8ffdba93d8cf8d7770627985b510c66e9fa8c8deb3eea72d0c2e68e0ae503100e608310eeb77614bd31c2bb8390da18cd2eba1826c76ccf37918cda2d4beab01e20cc53dd18b7c5c206e7000a2501a84ef69dbfadd649ef0b0f51327f03f95df877a83b465d50f7c7770cd0aa2ae57d2d1c3323c10d812b8f4b251eb50757bfd05a1f6fbdd7afe6df7d159fa9b5e01e96f262be4e\", \"750020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac916920871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667032e69e21d42781246748391369dbfbe9c2f737a3aa9dd562e73f34721d9f90000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d5e180c56c0451524ee8a3ecc1896e768f754c20286ce8750e284a151907e0f0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff367c934a4e22854ce1859ec32a8b50a173f3d6bf46b91a4e515153e2740f32abd6cfa89ab6efc047f82cae49d2c7e996032853be69261c62e58dcb3c658578fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff814c28f1277924f496f70c6329e6fac80f720e95be11054f2510a4a0e768693e83d0eb0ae905db2b3320532e634fa29e4cb94c4e96928e7deef2f119e52df0a57f6c93a7ffdece33021c7cf7b3d765e1a46296764dc9ba04c599279cb672c479a9925177f77555e7c2464536907aa0652b5d6df5d5805f83e664fcbfa72aba2e31a87647ccae878b37dd674f479be3918775c0a8d0e7cff5e8e41ff5b753198d82594cdf62acb0b1c218457e155e8393989ec96832f8688a1ce662bd91ab362dd146f03dd1d4451010a28a928a5862d9891081ff8346d0be05e585bfa5838048ba9bc477dc9106d83ec59206cfed5e9d001dedc4689f82ab32943944509c6cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8385d325695f4e3dfcf4fd74b8e11ce36b58c36dfbda4f78bef707e7e6e0e55fe75eb3a08875f4fd6054ac3ea535866fe12d75d68f862b514e5b6562b23a066269bb6bd3e6d3a52d1c8e3e2bcb300f97d2d958553c34bf19db98fd0ca15b5717b6b24aabb1a6d761815d5a2aeecfd76e00b319e79a0c094cef081f9597096109e5ee9a49f7c4bd48672eaa3c559c197f42203c0c3f747ec67dcfbbb39a6d8b99964ab793c369c83bebbd6d9ab04fdc20eee4d5b564c2ae0bba8012a506ef0a7359659d7950fbbb61bd5b15b30b553b03295ce3b4802c9bb96c67be53661d1033e4baf755d6772763fb9f00f49b3eca6fed6a61db392a1cddebc28a3a29f183b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4feef60d9a51c95da5f947be6b14a11753c50b6f77c9fde2091b1bf69e7c89499d68da6005d030d02de924b098b912ad8d4407e957916ab58085fa0f0d0bfeb8951440b49f3c0312875a0ed1424d9783139c27b389bce64d8a3fb48826e2facec7c7861ea5509d55dbd2a306764de3d574389ebbb8f3e3a19ec9b86e8101f24b8f8a8d7993ab1b2960566540f39a5e7bbcc8050a68a1ea4a040b0c4e3338a1aac3e8a55a88cf2022e5ec967e99b3491010878a865097750ecc03b9b368467a9cb4c3dd8e9c84081d062d9a493ebde728b0ac140b9fccb94c86ec4ba4332f2eb02198aa9806157c25250e42ff5d040a6d4f93bbbec7b3c533e20f11c6371e4c2a1f64f518b1b16f67fc9af158746931699464c7b709b3f73e234e08a9dd7e782e91c2a1f51d6419311604a1b9af882f49a3e8dd7fcf7e2e88012a16afb55252145ac98b6c2ac10b0bc5f7aaa9934ddfc8ae746072955b5002ae01ddd5f27234c1bf3eb2e5e40ef2a0e2adfd9017cf0a0fad99e659c388d03a9f190db9ae00d51a1857dc312bba1d96a12c87e389ff1d540dea0ddf9f6d2c084c61f1c6411227f18bc930a253a4738929c6fda8d38bcc04911604a72857b6546104eeed291de3f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2339a9818586aeec15c1a33bca4fb74aa5070ce4d351acd4558314783398588623ab4d91c02012cfd3d16762d052e3bea25e0cc4afc61fa618dd7cfee3ef7f900000000000000000000000000000000000000000000000000000000000000007a2932450e8563f21a614cde78869ae4cd0c6c11ad100954ae5d68f257e8b3b2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff29d8f8674248f31ed7eb0e93b8e631d9885381e2eadb6ce29220939193b75c0988d3775f3bba68dbea3679f79f8ef5fc82934acb8388249daa7b82818290f7c00000000000000000000000000000000000000000000000000000000000000000835024320f109a04b39cabc114a7a14246a4335cf860393ca76de3de8cb2cc21056ed338d9bd88ccf476c043068bb7b27c2ee4048ce332a2ee2e697a706c199322ed959329c9e61e24e6adc1397e7f8616eab4013de5770430e05f7955c4b311ec03396403dfbb50cd13942b9a633bb11eeaeed80a65541dd3027f2c096f7b367029d052419f5ea265a8bf7f0ea7065e38016694cd20167eb6c0ae40bf29d3f924b0cdb8ac8dd8b4bf7f7cb3db25c2070bb177dc59eb684faca6f13d48dba1c6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5dda6d72098986d04518a24d2521425ba6d77b741f2dc69adc71135d06cc897697b9b998281b4aeb839e0b3bda61f16f4b4c505b81706352bfcf18ea801720f301\", \"56920577caf00f768afcb45739f46879113eee1f0a6f3e7844dd095da5a9cc28ee594e99904294de13fe35c3da526aec2e214127254baa70de8ec484d38bd9310353b90db40cb2f5523616acaeb81608c86c2e5124973bfc2f5d874fca2f205bbd5e6b56262f469cbd0d649c7db5480c26d62e4283c4b69cda3d13e0a6682e27a41b76876805c3e57480c13c2e99b5bedcbdc14650ebde1310b871da3f71a2da75a7a276ee372826f949916dcdf5e507ead814255ad09bb648b2566951cc\", \"750020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac916920871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667032e69e21d42781246748391369dbfbe9c2f737a3aa9dd562e73f34721d9f90000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d5e180c56c0451524ee8a3ecc1896e768f754c20286ce8750e284a151907e0f0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff367c934a4e22854ce1859ec32a8b50a173f3d6bf46b91a4e515153e2740f32abd6cfa89ab6efc047f82cae49d2c7e996032853be69261c62e58dcb3c658578fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff814c28f1277924f496f70c6329e6fac80f720e95be11054f2510a4a0e768693e83d0eb0ae905db2b3320532e634fa29e4cb94c4e96928e7deef2f119e52df0a57f6c93a7ffdece33021c7cf7b3d765e1a46296764dc9ba04c599279cb672c479a9925177f77555e7c2464536907aa0652b5d6df5d5805f83e664fcbfa72aba2e31a87647ccae878b37dd674f479be3918775c0a8d0e7cff5e8e41ff5b753198d82594cdf62acb0b1c218457e155e8393989ec96832f8688a1ce662bd91ab362dd146f03dd1d4451010a28a928a5862d9891081ff8346d0be05e585bfa5838048ba9bc477dc9106d83ec59206cfed5e9d001dedc4689f82ab32943944509c6cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8385d325695f4e3dfcf4fd74b8e11ce36b58c36dfbda4f78bef707e7e6e0e55fe75eb3a08875f4fd6054ac3ea535866fe12d75d68f862b514e5b6562b23a066269bb6bd3e6d3a52d1c8e3e2bcb300f97d2d958553c34bf19db98fd0ca15b5717b6b24aabb1a6d761815d5a2aeecfd76e00b319e79a0c094cef081f9597096109e5ee9a49f7c4bd48672eaa3c559c197f42203c0c3f747ec67dcfbbb39a6d8b99964ab793c369c83bebbd6d9ab04fdc20eee4d5b564c2ae0bba8012a506ef0a7359659d7950fbbb61bd5b15b30b553b03295ce3b4802c9bb96c67be53661d1033e4baf755d6772763fb9f00f49b3eca6fed6a61db392a1cddebc28a3a29f183b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4feef60d9a51c95da5f947be6b14a11753c50b6f77c9fde2091b1bf69e7c89499d68da6005d030d02de924b098b912ad8d4407e957916ab58085fa0f0d0bfeb8951440b49f3c0312875a0ed1424d9783139c27b389bce64d8a3fb48826e2facec7c7861ea5509d55dbd2a306764de3d574389ebbb8f3e3a19ec9b86e8101f24b8f8a8d7993ab1b2960566540f39a5e7bbcc8050a68a1ea4a040b0c4e3338a1aac3e8a55a88cf2022e5ec967e99b3491010878a865097750ecc03b9b368467a9cb4c3dd8e9c84081d062d9a493ebde728b0ac140b9fccb94c86ec4ba4332f2eb02198aa9806157c25250e42ff5d040a6d4f93bbbec7b3c533e20f11c6371e4c2a1f64f518b1b16f67fc9af158746931699464c7b709b3f73e234e08a9dd7e782e91c2a1f51d6419311604a1b9af882f49a3e8dd7fcf7e2e88012a16afb55252145ac98b6c2ac10b0bc5f7aaa9934ddfc8ae746072955b5002ae01ddd5f27234c1bf3eb2e5e40ef2a0e2adfd9017cf0a0fad99e659c388d03a9f190db9ae00d51a1857dc312bba1d96a12c87e389ff1d540dea0ddf9f6d2c084c61f1c6411227f18bc930a253a4738929c6fda8d38bcc04911604a72857b6546104eeed291de3f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2339a9818586aeec15c1a33bca4fb74aa5070ce4d351acd4558314783398588623ab4d91c02012cfd3d16762d052e3bea25e0cc4afc61fa618dd7cfee3ef7f900000000000000000000000000000000000000000000000000000000000000007a2932450e8563f21a614cde78869ae4cd0c6c11ad100954ae5d68f257e8b3b2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff29d8f8674248f31ed7eb0e93b8e631d9885381e2eadb6ce29220939193b75c0988d3775f3bba68dbea3679f79f8ef5fc82934acb8388249daa7b82818290f7c00000000000000000000000000000000000000000000000000000000000000000835024320f109a04b39cabc114a7a14246a4335cf860393ca76de3de8cb2cc21056ed338d9bd88ccf476c043068bb7b27c2ee4048ce332a2ee2e697a706c199322ed959329c9e61e24e6adc1397e7f8616eab4013de5770430e05f7955c4b311ec03396403dfbb50cd13942b9a633bb11eeaeed80a65541dd3027f2c096f7b367029d052419f5ea265a8bf7f0ea7065e38016694cd20167eb6c0ae40bf29d3f924b0cdb8ac8dd8b4bf7f7cb3db25c2070bb177dc59eb684faca6f13d48dba1c6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/29306f00a438f213a01ebd7a7b0d04ae25d239ad",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701f02000000c88992c38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c471000000002bee261f02805a46000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e745311638\", \"prevouts\": [\"43bd130000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\", \"ae50340000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_98\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3567c39e4922965c877ce5437585a0ce586f4770215af4d36adeaba189e176f44ea5a7cf38a87191f77162d333e4ade4b1e9267c2a86383e03be70d105b8195a01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6c885cd3c57f8434439fbd898a5883458c3cd7878d2f4ac4cc926e993f8af32b44fab4a8359649a55ed7656c35ee56ad23c9e923f34f7a6ce852c11488740de998\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/297a3281b6d5be24c14d7ff51f2fbfe46ed86f1a",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d401000000e688dcea8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ff00000000123c9dc8046d667b000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac3fb5d441\", \"prevouts\": [\"915f410000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\", \"defc3b0000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"834c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bf852205919db101e7100c264881cf502d3d2e764ba6b83faae2c86d526b113f2b9d1447cbfb5d72d5da72ac5ad193469eaa6b44c038aa23e2a9d2dd480586adaf3b292550aa3dd1beea84cf7009fb6c6992543e64edf52f25a9194aed3bcd7c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c18461976e62a50a1c995a04d8b83eea654c194a7ebc4bf0616751df5ce2576839b32d44b6ff86c799acdff23ced11a294722ef2b8af6951bf8429e3bda52b31af3b292550aa3dd1beea84cf7009fb6c6992543e64edf52f25a9194aed3bcd7c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/297a666c7fc982a83775114d7c6821fb42031e06",
    "content": "{\"tx\": \"dd0484290260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127004020000003a1f3dc18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b2010000009ee9318602534e47000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c9000000\", \"prevouts\": [\"e68d100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f4e6380000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93652247e5dd926380ab694d48c4d41b564ea6c104d6001198f68608a68dc76789170b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d865720d6d723e038e6335a667e0268d00f4826306437ee84552cc7f8172181160444ef73f74a88798a5fcf30fd7aa5fdae43144d667a238076c6d52287fea96c6e3fd1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4f551d5f9df51039c21b920ecc011c032a9913b031d76462e802a27cbd0d0ed8dd6d723e038e6335a667e0268d00f4826306437ee84552cc7f8172181160444ef73f74a88798a5fcf30fd7aa5fdae43144d667a238076c6d52287fea96c6e3fd1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/299581f978295f5b97afd9102abe9746f3633e76",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700f010000007bc29c6cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb900000000665aacda033f912f00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e74a010000\", \"prevouts\": [\"0b3c100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0862220000000000225120e57fe1708102910b1e8fab470345c0402aba6cb96c683e4f102534396b5c1780\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936545c476ac6dd89960a95424e037fc45720028d28300f66c18e5d73f49140b067\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a1a616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/29cceb8deed87738d060e1bd5338ab0536f8d2a6",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0a000000000dcc735dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfaa0100000058f69bca01f683110000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7af77dd40\", \"prevouts\": [\"61a26c0000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\", \"cdb27100000000001600141cc39a492a6f67587324888ae674f2f534a7639e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"777d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936317c62222341529afe8f077c28135e4216d182041ddde4bb210fc7dce870fc693c7477a635aa10de5895d22b0b13d3a2307950c6447747564098b225c8ebc094ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457e2aee6c91b47bf7b7aff3c5d3800b2287c2f5852e09bca12781ffc191c1d4f04\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fafa584ded413e2880e88fe5cf9cb62118b35d382d99cebe394016833778f1470de2aee6c91b47bf7b7aff3c5d3800b2287c2f5852e09bca12781ffc191c1d4f04\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/29ce41699e783cf1ab6b5b84bcc1f8da679ce8cd",
    "content": "{\"tx\": \"0fe2948902dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be6010000006a51eadd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c4000000007dccafb10437fd2d000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7964bd1f750\", \"prevouts\": [\"e56f1e000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\", \"981f110000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"f77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee1b135a17580d142a9191c3b85b2fd298f3e09062f6f11151feab86e1334277f9411b885fbcd56b4d2cd2e695cafde2fa2de7097172cb34b20e1fb870aea9a6a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93614bc388ca930cddc1c81a27ee7343eb0c7b6fd8e7416418176eb400a30a42e0c75fbdc6cf2e777e050e79c533e418db275d42efba7f8dbffba71190cfdc033660f5943df1a7722c938328966c7e5ac747f85bf050d43cd9195f6df88860ae066\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/29d289d23bf6e34dbfac501041222a1978cc95d2",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdd01000000023cc89c033c5726000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a64636e056\", \"prevouts\": [\"f79d280000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b8d8025076b24c8a40f76c002001c237b48dcd5ca95a82c0e5e41f0b66f8d235805006cc51063e7185e527fb59c761b5074d10ceb82e6a0b7e047e6dfb68ed645d4f3cf5225bc2e73bca160ca9ad46c357c6d2e1ae176a3211e20e5b1ebd28f9886e04e2e32fa7ad4455724eeab1facbc4974330c42667012f8319582ec02529573cb21a631ca15bb4e9a11f0b33c4fac3f5c23956ccf4c137f9ab5ffb9c788bc2584230d40c4440e5afaa58dc239280e60c7fff9f1e0e04362675d60552e9fd6171c0119c067a199095fa5ffce19230fbfd4bc55a74e9bf9bc95fe7811bcbc5baee5ebef1a5a189e407f78eda078eb3c14e4eefcdb328ff92c0594f07c2be48fc17d7ec39d2654d0e2b7e05ab9abdc96c7cdc9024fc06253d2049207bdd1b75933b1538b7c3d8785dc862cc0e283b57cde1ea32c67de21488473295624630fb3a68ad2053e7ae8e85b08513b274ed188fe50aeb9ad7327ba8d0f053ed46817f1f9547718020eef34d55f693c49717af4420d33dc7b0405e06ecd96c307a0ed6560f14673495fc50c6819ebd0d0663f4e4d84c96aa5a4332bcfedf5010c1705d19d26532e4b5fd8adc36d22acd1b73c0ec3d909abb8b2271349cc48c1fc370d3fb18a660fdb680e4421bcc846aeab0213ee6a3b124a047f1a214390493644e6fe9aa7e1d465407604bed45d57a9165f155cf48144eef19f36baa291368ad974e9702b1e961f52bbc8775bf\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb448ad690b4db681210d49373d4012b83591ebe1050d9c81702caad07f4cd5bb9faa736b6bec5c04b20c5b38998d4f897a7594adad2cf377758bae1284900c20e3219675e68f7f320420702225b2b85f84783248daa0c82b4ef34e304883a54210\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09020e105272e2585e738c768fc20f5d968658bfc397956b671146f4b7795091d902cdc73036841d91a7cf5e5873c97979a7604ca82151d8fc6926a1a7a195f0f3abb3b2b673e9bb7b1c27205eb5a62c7ff9f3744e015650d5d1573c7f521675eb4cb11118a04049e2bf69f5ecf5177f67c3260ace9d3caa675e79da97e0afb04a43e777c245d6fda66c2c63651be6f6757fa8c5dd9441c0ad8db19122f1a0541bb96efa637dad6a22226131a026fa4d6e3b3658fc77f3fc8c3bbfa22940d7e17397e1b0a69fdef34d6b2c0e6e44ab56212b0aa7a5c0263655e43dd86951fea2a604af949af140737a269420350c88075b01bb8fd2c28304fa7c6c37676e60fb89b050f25a7527982eef96665354af9a29733e62a7f756e962e888241f2f63a2de5b04d387dc8a75437b4afb6db301508836125156078ce820574769c5145be3b6161ab298bccddb039f032fba6d7b1137567645870af19e57ead4acf8b9845deb241e61fbad9a3b315415b5e59aecefa9ac0a25a33f2010a607b9d62d5982bacec40d7bfb7033b2943478ce7df0d10f8c57f2b751750d85fa2650ced72cb501c23ef3e3f6adc2180541621111ee26010aa9156c841a3cd9126612663d1cfe2f476414940aca7659c332768f7bb2e92f093659532cbaf81fcc449fdb013abeb368745c23e262a7d2e99c057b5eccc8ba5cb0eae27005fc84a41b3af3a5c0988977e1a11b0360e9aeed1bb37561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082285ab48eb468144e5e6aa7ce6d4aa75a792c11a68b383289399495d27c15055ecc596949c599e703b9191d3ba022749fca5ec33c3492eb5532759cd445d2634b82745fb8509382ce1e64511ce3c1d55be477e9687cea49eaad32aa52098dfc07\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/29dc54df002663eb3874c3fb7d3952e70b1d1779",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c100000000dd110ca0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565caf00000000071f80f3030b996000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac9d000000\", \"prevouts\": [\"b4170f000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"b5bd530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d511915e430f0db2345814ef782ce895d8c23952d8feef260d8eb90daec0803de3eef05bece11fc4259c24dede9b1787a65bcee91937b36a28d108e88384141e6c4419704ddfd13dc63b1b4156372563d65f148a89e112fdd9cbf47f8afee5da0a9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4baf3800ace8e6c95c7e7a9d035d879049832cd6be429795a36cd3109eecab56cf0292c5c10d160f8e0745cc9e7b1222beed517475d04a852f0f3c02abb361f19b5b66a7e788d7f4d892aefa7b705b94e6e3402f32316550d3b683ba5e55fe37e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/29dd1cab8fbe87bf2eba3c671a6054c32e47ee9f",
    "content": "{\"tx\": \"a804d40e02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b96010000007c2543a7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfb00000000e7fe5fb603e9bb46000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79609000000\", \"prevouts\": [\"332f26000000000017a9144370350f30aa8f875e3d2a13be81f25f19bf1a6387\", \"6b2623000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"027d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8c6a1fb55f16de67c2a92ad96c93aeea32aba2f93d3355ba34bd608160e8b6bc30e32049d91f42cbcb04955cd98e985d287b85d3c77c1154d8406ae5e2d81b7b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e27fd3105da1a30ac5d519a74d6ce1b9e57e0f98575d55e76aa178b4a6feecbec6a1fb55f16de67c2a92ad96c93aeea32aba2f93d3355ba34bd608160e8b6bc30e32049d91f42cbcb04955cd98e985d287b85d3c77c1154d8406ae5e2d81b7b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/29ec9ea0cab2025b952a31c864a85546c8a8f032",
    "content": "{\"tx\": \"82be370701dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7100000000e2dd84d901c0404a000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4877c000000\", \"prevouts\": [\"190c530000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c65d6d28abe4427a28718cc9defbf81c26729a2e7a56ee27b8dc889a3e93ef624f81831abc7030d30d94d76608ced7887e45146dfb5c6f498f7413d0801b8ec7370771bc09cab9990a137eb2bb36c383505d4d9622e2608e50044675509ef423478c66cad98a0e432fbf5ebaf8edad64c7e69aef4b0ecb2d91224350ecd4ca2b12fa4f30cd813b1727916698f3a36b99f57249def877c8eb26ffaa2e89ef37ba2d5eae3d4087861a32c2301fcc6526a832631ce74afcb19abe25323e02ce5bcf918938c9260f6cc78f08ccfda91b4edae9e87478fa98959668c188503e739c9250e4fe01f646976a21a8bdeb603de9327a271009c25302ec16a9075b01fb10e3c14e7f9e84c21f0e572d8c0baf5de5badfc858b8d4031a2ed56d0e574b2ae632fa6db275d93e24f7ea1bfc3fd107842c07aeb28e3a11f378b0f058396df45c6d195813457aeaec14ec5f4c34324291fdd81c184c7fa09b70ec6032af1d30edfb986b15f46ba49e847ef142ec8f050c2602e4a5399c960ee556315266d4e3af38da742f2c000c141291d643c3b0c48fe4641ff8ade4a0e89a1ef3388de0d26bbf9e1857b21a56ba99a394f1a8a2f2193511174ba1881308dd9fc7cada8576072c967d068357203d288819ed68c2385cd9f3e83e32c7bdf3a3eb1d1ed4374b6902b39c851708e748952e6040f6f797375ac5df8f0429223f2716feead55539fd605b07dfdf619cd4b11b75\", \"eb7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f6502ed723c13c5ddcf31911de71be6f76e583532ccf009c50f97b41c4fddfbb84ce21fa65bd655e7fa8dd3695f51b098b96b5173f87464f2936878bf520f49fc2ce937a5de573933a673baa3adefc0607b7a8b345eb0a9388ff089ef522bdd2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090299e6ec5cb8d4658f0cf258626bd3d34f4f03b0abbdcdc7114723e8143cb357be842a82f438db98212eee111068e7ac218cac2006e89d62c921b70d38f5a6c5a84d288723d59e4fb8a9e7761d40a6f381739d5b2db8cb1179eb492c2823da5e6712d85632f20d262a17dd659182b9cbbe44c1955da4988c678837160fb8f12f5e341acacd54c50ce56bbea55f20904ec6b672862a854cf6197e8635c7502fe8845708ea12c2d69486fc75d74c6b11898557737115c73f82ebaeda00d243bc745e092c42bcc8fca35a81178923732e7f0a5a21a593f3cc5d376148d143bba4d4938592e1927e279fcb6f6ee2676e668f2f33557976f2438ef61f5b826606519377503e9f1ce443ae1fa81026017c6711d9832256587148be270d272918533f06e0dfdbf98eb7c93d8722db3624222412d424f4635f7ea35663bb7926a17d303b78da410c0c39da5b7e069de4be5d776b5463306373a94dfd8dd027623dbee561e0e34e3d300387c2ff95cddda6478e14ec65b10f3c87452bf7361245a1987203ef362a0ee362e7b1127bc44fa5f8921cd034d4db2f4b1394df6875536f7ebfd73e6e17174703c039eec3a68e93ec983dd1a9a86eca4343153c1d4cdb18e858015c3109731f21970526e1a50ce941409f7ff6120bb1fbe60d12aea1707e5b1bacb17cd17a3259611e4149ecea670cc95b65c000c67d602c808491998a35743bd6746d3404f6a2e1251dd975\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823f13c9f2c0ba7c3724f3080ca99cfd230291165bf004db5bbadb2403d0b759af84ce21fa65bd655e7fa8dd3695f51b098b96b5173f87464f2936878bf520f49fc2ce937a5de573933a673baa3adefc0607b7a8b345eb0a9388ff089ef522bdd2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/29ef22549cd23bb217da411a3ca72d83c71150d6",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d900000000dd8001afdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c19000000007ff930cf04916466000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8749030000\", \"prevouts\": [\"a68d110000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"567c56000000000022512077fcdfa5b83233990258cd0e78144655048956ba28606e7ed979bb07d82944e6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"367d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89a25034f4670dba2bfd8b532fe5e2c4399b1757245b955e89574c41111a3f13a78448a7537869648343bbbdc00eb4ac0785a5f2aec0111e81b0d25ebde82a92a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93618278c07a795a465b0e01ec560e597d9dfa9576d66260ea15112d4b854280992e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89a25034f4670dba2bfd8b532fe5e2c4399b1757245b955e89574c41111a3f13a78448a7537869648343bbbdc00eb4ac0785a5f2aec0111e81b0d25ebde82a92a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/29f6acfc391f9db2fecb96ea0a708da396ed202e",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0302000000e24818d4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9000000000f9f348ce017c48060000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7961c030000\", \"prevouts\": [\"dec2220000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\", \"964c5600000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93626c391d5e47230d4b4e419da58037ce9505b07d9e5ed3742aee4172be09b65ae536798c57c197a746bb2ed7f28bea5bf32719d74447f5bf93d90a00b781807a2845c4b1f0ef9796b099f7837236ca3239de7da07050a4e4f568f49f6a65718f105f27aeb1527a9572d42a0ad2bcfbe2bc67b36cc3101a74fc3488cf03d6f1bd0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d1b360dbc2a68556ffe995fa73d9491f5c7d1d4795c1bc7f06a4bb01cde3d3510ec8a0a1d660d587d93edd278a1416bd3a7fb5c67f78681973183382c988e9bb422e3784e386a40d51dfdc8b2696050c6780884f0aa6a0f3f5d0b1b514784d82ef429df53f77997a088ac7849be23d2367c05dc96029904e93835fc046c3c5b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2a46178ff8d5794433a794e9fe86b9b5fc268cc7",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cba0000000025e7d69ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5201000000d3af49b860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701202000000fc825ac201084a89000000000017a914719f78084af863e000acd618ba76df979722368987398c0a2f\", \"prevouts\": [\"33da480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"65a5590000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\", \"064711000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09028c268e4ecec76aa2f59fd94a68acfe2af67776f00ab61b86e7926b8144e5460e352e8be1a3e826c1de3684dde036bb7fe3ee1d1abed079fa22ad91325d6d250c4071cbbb929bb77ca91eaf03eca18757f412a11ca98c105429b92b01fa2edbf45df934cc0c392ab33e5de08a07d445b2960976e3a612969189fa73381c74b61595c73fdd90a17bbd5d3ad2dfa07331dd78d654069faee70b8f3d0027dd4bda0d25036fa6bd5a31714afc0b876a1484fc0ac1d172488b41385d371429232fd1ca521709e8798d2c8f4632fc0d0991c6601844fa80fdeb0f863d6c8d9e23acea27e4f6e79b1544860e70a1ab109defe1e5d885efba13babf997cfdbbba70e9b43cfd08bb67231cf0f73194c8956eb4836c70499e8f1e1414fbebdd36991ddab518b704a5323fb24bd8cb5dede640dfb43823bfc370ffdc8f8bf9015213367aaf83febc6255cfd65db07e9ae40a72c52cf098a6e39210868f7f112753e19ac1fbf7ae587e08feacee253b364bd8597808e61fdfc766b043a7e5f2660e450d86b6881052c2d6b715def1b3878c16593a3c15f394a666ee03d0f523dd35b8d22d2b882eca659cb3c0a4c1aae1bb05e5963263e1f8431a80722ab1b5a578fabb97d5a4e0b2acc386e1e0ce43bcd17e4027df76691ea1672d466792ec4c0b69529a066b0fa276db15c6f54c2b2bb080efe801aa96151ea9f70473b6b921d902a8ffc8cc73c320a72e2575d93775ec\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367c63ad976486975ed2446585f6ed9ba3fac098da722e4eeebc45988370da4d7fb68406090ec9503da6e41d61411400226504a16a75c985e068fea4ead469507b3b719bf4b6df334f4ad3966afd516fb2a8d294cb4fface4e4609ab1c9f988c5a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d69785071bec72fafe99f102795213c00b384192ae090803f8625c94283c751d50e410062e3117ae2a30ea04b068e7a9d50fb1654db4f7e36a29ee771593efc943b1505a983a6911158499b20c80f50b23983cb242319cf04df8ef13675414c5b15d36795a77d8092b2456ed9ea851470470d8e6dc233b0d7cbe947e92c0713de76718482c411885db43fce7d5ea387f08a3b2f2374af87ee9f49aa887b8bd4e8ea23fcac6638de92fb44c0ed4028e2603390f96262272b8b30d9e0de8a06c111f4e5b5ccb7737c28de9ce83c990b0bae5f8febc8dcaaa664cf3f697c7d912d80b67704f66298cc9cad54c6de90bcebeec5857385f3635af969080018e4fe81c5e47a880ba6e8ba152f9cda6943504eb5df2477038a99165eff24f84cde01173de56907890aab88f8f2a68c3836362f7a252961cabcd26e0096e9d8285f030828eea7ce529e58b6c218a48af9781d86beacba5f9200384e6b50283459c52853b6d1c76986d5294d354bc1379f9a31668ec33d9451a3e2c918e8706bc694ed0df8a419b1ffce6ce3bdb9cb11c537ab37697b1f6edb3cc6512a11839fffb283210c1e6b7f154a60c8b82a31f855ec217b79b96543a47b3d07ee439c2a1c8e3f358db506434a6a8b53b76b7f2e089f140d0ef49f0bec3214ef2f90151a52675127f263af3271e8b42983ef9731e5b6e5a99bf38be069813665bfaa75355f6bf6392b387aa9af1f6223ec27561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dab3c70c06b6d40db1cad4929dc14312cad177937e3c271bc65c4be8c12a381eafd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173adddfc46016955cd26bcdfd077adbba0d60eefd6e0317def1b858595de21efb103b719bf4b6df334f4ad3966afd516fb2a8d294cb4fface4e4609ab1c9f988c5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2a479685fd7da722bb6722ebc37d68cccb881ee6",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd401000000c607a19edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc70000000014b61f7a0255067f000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc783000000\", \"prevouts\": [\"a10d260000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"1c935b00000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"967d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fab066835f4c858657284bc4f27395efb05761f76f20d1739098d7bca44617346d654e31a1d81b19a8c2670362b3a1330b2f2d66c8db1c8314023a61983d2ff610\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ea99249230f034edd8755346ac09fca5c6ef71b313e66a1d1ca3f34bf2000d9789b1afbd82754ccbdb229e33ad6472305abc54dae2fa9ac3a68b58b93ca8c8390ad15d5ff3e747c4643a2e7779e2cae74c1db700bc0de7d47935e7ffa6ea968f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2a4e458a761d418129aa4d22bbbd076927fcef77",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703f0000000024d521f4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbc01000000e8ed3cd4048e26370000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac76000000\", \"prevouts\": [\"ec7f110000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\", \"7866270000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936442ef3e08d4cc76e1b58466903dde6bc7d9143fa5154c6795334e9e845b214803f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08233479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a4bb2c7d85af23cd06361a8d9967d47c0827d7b479cd52e2216fb2d12a2ff38bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a680f8e17236a8fbc1196317399c346aeca722ffefcaac5ef62e17ac4625d25b4bb2c7d85af23cd06361a8d9967d47c0827d7b479cd52e2216fb2d12a2ff38bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2a4e61567a20b2e90af1a0fb476b1ba0154b0a8c",
    "content": "{\"tx\": \"1a1da20f038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c496010000003477079360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127029010000000b0db5c160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700e010000000bfac8b303bf195b000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487198ac73f\", \"prevouts\": [\"ed513c00000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\", \"fd2d11000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\", \"5ac90f000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"e8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362cc5df8a4115da779f8a758b20ada553e9e091a2311498f2aa3552034f30084e276a8166e5256dc9010e53101dfdb6dbd4fafdb1e785ffcbffe7e4bfe923fbf99aaad3e4ddcb787e09feaf57a938d0a46e7e94627a74ec9b410f8a5374ea1d35\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d3d1c8f95326a5f9176c86e1c30427cdf7afee7eae03ceb2fdd83531b682283cf61f73219d91856056394a010eb6c8ee7f13c9683181be224f0fcf47ad20d61b9aaad3e4ddcb787e09feaf57a938d0a46e7e94627a74ec9b410f8a5374ea1d35\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2a7da9157e1527a2190bce26d0a1303d7f239f9f",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdd0000000084353b078bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a0000000004495027302e6bfa3000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e791e25a5a\", \"prevouts\": [\"3415660000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\", \"d8bb3f00000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"eb7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d30f73147a154a3628d0970c0221a8932217afeee5ae5f898a11b906e2468131e58e476735d98d5a1185fd7ff42bb7b31cec58182079010d151d415fc7d6c3e4c2ce937a5de573933a673baa3adefc0607b7a8b345eb0a9388ff089ef522bdd2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e2b3f5d542005946f2ec6051f133431d1ec5375b61ea1504919b9de7f1f58f14cd47700b8e47119238508fabe2c12c2c2868bd36dd1a15df7cf7a783bdc7d4f633479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a9e937f21fcad1bfe108fe60be9a324a720a35d98355df5fe53ca48d5593a6c6b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2aa0596f17f2698bdfd51894a7dc1e1241cd3ae9",
    "content": "{\"tx\": \"78a4f8c4018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b7000000009a731cbd039e5f3a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487fb267745\", \"prevouts\": [\"b4f53c0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"5e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa5d6d6d3f2cd85347736e7cd11e639ac781ae37e103c2c2842f248c73b61e825b0a9249c0485c0b349be2068ea39eda6d50f7b6c474a6d5eb714296c91a9f24b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bb23dba8f127cc5caa444c657f3417e5706f46d2cbe11427067fdee54552685ddaba019801d089772adec5c5b59e5bcfed03a63e4fac904ae7f3c905b717bc6fd7bec169038f6fbc2f311373c62d75738dee89ed934d1dccaea4579b1c053aa90a9249c0485c0b349be2068ea39eda6d50f7b6c474a6d5eb714296c91a9f24b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2aa48f72c81f73267919baef97d2c186ffc36882",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701c0200000078a4abf760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e80100000013f5b7250110821b00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac9f000000\", \"prevouts\": [\"51e6120000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\", \"458a110000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cd4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5148aa6a6dbcb4c7060082480e3e536b464146150e8b2e96d2b5eabf2aaf1fe24e9f4d7ab890a2001a7be6cb25cf630fcd24657943ff80a7c5a11988ecbf9e80e4620a19fd562e5ef578d66d29c84f34a4223ab3b995d34ad300c7b5f252d5e140\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52cd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93683f2a03e8c381f92f3124ed7c392785374a020be92a8046eb2be30094f713c068fd238d2decf6f7142c55252dfef824eea080278838d8f4f1f0f617cfe47b5d91029910a453e765cd82c29c3b576a90579a453f3a941b6b6175fa922e9a13196\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2aa72eaeb2dee91742e3412f9e1ec464ecc22161",
    "content": "{\"tx\": \"896c810602bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfee01000000fadb3ee3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfee00000000d2cc268d0308cbd900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df979722368987e4000000\", \"prevouts\": [\"7dd76b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f3956f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"1fded07e14633319b5e5d364a93e0d1d69618a0bc3e97963976ead7850c805c8e98a23b613814cad05b5405372152115490f3de9a5ae05045b4bd15a8f95266b02\", \"50cdc53a7cb9cd5ee51d6149aecf9513ff5e0ff90b593e41157ee379098b30950d6383f4062f0c953e39bda615242fd08cfe63e1d438b500933bf1f372f8c65613b2d5114825223618514f73aca0f1e0771ae72e00606e445891296845e1dfe150e541ad046eaf767190486fa4b72a399279d95827284367003507c9d75fc300289ac1f466a89d36755e1600e9f1331399a86e3d6614880bc5639e5c5752f982fe8c321f227fe925a9a03dfc15769c4b914ec30a565872e626afd7a688f04d2188aa718ad9cb9c9cfc68ef59d95f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"cae0502574ebeeba586e579f5ff580377e691cd75fec571595fbcb717e287961abed55f6b0c7837de54539d85ca391adfd315d4cec3b7d7d78d13ba6e8acd9ef03\", \"50940335d2bed26fbd5ad4cd2bb4582c647d766eed8bd1ac46942ac25feae77c8d59fd8552f74acc58d02bf139ffd091c977ea845e402a2da1f9e4282183afb49883c37ee77529e224c823cb6f04e16f085c302d16ec88556dd1311f768ceb00fc42f2406ee9d4252e4cdb3835ac88e84fa802fb74639fe01457d17cf4c9655f74b9bd1614010e34f8fe015aa768c73a3db3dda5cbe0dee792f2d25f0cccc7d7a2d08c9c1c8b2639a85d81abb4960393b06fe8570a029d9a2a97eccde684e094b74461cbb6abd5db5491d8ac878e7ee7301352517a6d016050c52a2f00aa37beaa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2ab67ca0e8401c63810a011ea1b9b40ef8573922",
    "content": "{\"tx\": \"65bd5fe701dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf50000000060d4819d03436a2600000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac2ce15b2c\", \"prevouts\": [\"4c042800000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"d07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dae8e61e5a93854f939bc67e0ec3e122a7138bc48d6cec8581769a140f30e791a211c16676cbc388c1faf2d1545933d22071968ce5ea9e4d8ac4039e171efe917420b3503815f4c7b180839898c4c4aff0ab6ef4d8b082708dba105a321f7428\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fbb2c95f519f2e9e9c845032cdd61b2be56a03c746f0eb1686ad2cec90f6300d74714e58ef013156220aa32c916bb7c1f2fb2617e3ecaa27044ebfec042fafbaa211c16676cbc388c1faf2d1545933d22071968ce5ea9e4d8ac4039e171efe917420b3503815f4c7b180839898c4c4aff0ab6ef4d8b082708dba105a321f7428\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2ae84cabbb3a18b00167af69886696809a07a86a",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702d00000000d650368ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8701000000b6f15db004cee659000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7efa05528\", \"prevouts\": [\"f62210000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\", \"f6ee4b000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100f2e79a51fe00c6e6e503785aafc61c471d8b3f3710ce2822fc6b94dad79bb5f20220612a7f3657447392d93d9efd88c018f24279f3576e48a6d63825d2f80156217203434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402205ec6f37e7965778b6138431b2edef66705a66cdf19c15dc917aa27fb8647c52302206fb657046bca821f61f76c1b0e05a68cce9aa61015ce60e471454091f26a4edc03434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2aef8c06dd7c0aa09e6494194a3b812e4b7b2221",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709d00000000dd342c8a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127014000000002d192c0760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d00100000015c28620013a9a03000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a600000000\", \"prevouts\": [\"6c730f0000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"a76f0e0000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\", \"ef970e0000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"597d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee343ebd89880aabef0f18c5bef462b16920a32508939784a2317d7ebda32c7f1d0160c53d01d80ab4be204ae4e021ad6f56ad3990ac4b37baa4678d530d3ba4ecd61c62feef9509bc7b3762bc81079411fa6867ea4986820580c60fa1e8298e9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369246ff60def872dcd9425d4b182836bb1c9ba5ca30c9708f02d69701de6960d646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faa393999847c63b69274661db27cd2e7bb4343911a06570db858c301dc754c7eb4be962498b383c32e8a84fa570ade752f3a2216469b10dbfd65078bd8e1b5998\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2b1075a4c09b4d3aa3be48cb1ce2571ab06a86a7",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9c0000000073b9617bdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565caa00000000e018eef0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf8000000009055c6ed02596ab6000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8cf5391e\", \"prevouts\": [\"56552100000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"682a4e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d136490000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_61\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c0a794abbe885190796db3840260cf4307843554ceecab68b87ff3376813c3ed29dfb4d8f3bbaa85ab8d257d0d203ff2340ed1b96a5935dfe667da753300b4b03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8193c1f31ca8063a843028b265a92d103a0bc55d579077a38dfa4c0f0cf1f578f8aa4ae59b252cb1ad77cb9fd776daefa1da376451b1ac32e0f9e42b0381767861\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2b168b93f7f916976567d85cf8e7ca0d6dbbf32e",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9000000000e38806fadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b27000000003c867fec04b7aea000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df979722368987b2879b25\", \"prevouts\": [\"4d15810000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\", \"1f522100000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"8d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361cedd4ebc3a8843023445addfc64093d9c0a992ca250059238cd67fb8e6a944bb838daaa44e784827b3ea8aea20503468fe81f3acdd576e27ac09ae12d8ed7c28047789ecbd47ea83af97bdb87f8422a4707031714ddb05eaa38b24e158a7c35\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368e1f303af422a99e386a37c6ae9ac8e059bcc48394b77a776eee18f539e12c166c417b1d65e26db5cf9371b0ce7a9c3a110335bcae099de9d0155d4e514bb408a37683ca92a47492765ed69e840601310475c5f70013240e7a67747a5da918187472d664747fea006dedee35c74318028ad9a0ae37c154fe8226ccc2af402983\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2b229e9febea1749971fa08007b52b574b3046fb",
    "content": "{\"tx\": \"b354418b02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2b01000000785719ab60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d801000000a030ebbf032d37300000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac35050000\", \"prevouts\": [\"1c06210000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"72e9100000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"bd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d6822c3ab459532077d5f4bfcf7544c522d220251729d5888eecbf9f185531198751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d50e634e19498d3396bfa452af2ece499faa564dc4b58fae514f4ede8dd179fb909e9ba325ae7de51b47d98058ae5f9889bb6f52223c96865cd06dfd05531cc8a0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900450cffa7efd13876b56a4fb6d16fe87f2b3bb25d39f5e6fb1dfb5ce04c0283c8690e634e19498d3396bfa452af2ece499faa564dc4b58fae514f4ede8dd179fb909e9ba325ae7de51b47d98058ae5f9889bb6f52223c96865cd06dfd05531cc8a0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2b4be33fed42ff17f8c6910629b0e2183d109eb9",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4280000000012c312408bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44b00000000ca4d1b9204be1e7100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc70b020000\", \"prevouts\": [\"7eca39000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\", \"85e938000000000021551f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"cc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa45716b950e27a233a501a90011450809f321d0f7541cd1975fe5718ce8e53406ec1da8cea892037e805a477afbb54b1f5ec380954f076c0bcd3c4e3d4797a8d6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eaf68f276ddb4c0fc7f0310a620a2f1f9fe6c0e4e29d0e280a559099e56625bc6391effb841e4c3f4ca92b599bc572f2bc6440711e20bdc5ba4fc353379105b198f95dbc4edc81931664a748b39a9978dd32dedaf5c850114f6bd2f5098c050fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2b609a197a87b5e2d1507c9acbaf2e2ab79ce53a",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1302000000a081f487dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0500000000e4f110110337dcab000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48777000000\", \"prevouts\": [\"c78166000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"7f1348000000000017a914971b3e5f9ac480bdcebf6ea71a9fc7de0ab164e287\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"21541f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"b0fcfc88cfb5d6a8f5cdc0ea287840d7aff9a8756f3059ef4a2b2630a9ee69c301f524b2bfe20e440501edac14efe3fe089e837b1fa49d825701efc63522b590\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2b9f2b2856d6b4e70d3b3d8e2d4ffcc6048847d9",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3200000000bfb51208dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf700000000ddd630b103d1d6aa00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796cb000000\", \"prevouts\": [\"b68d4f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ec455e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_4f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d328c9fca94688e44f3ddc20a53f0782d432f5cf25486d998b1cd1777ee872169d8df25e6fd5c14c88ac72c6c6c4384aa0bee3bd35f74575a1dde6873a78db081\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"22fc99a53b24832447d4a86902b8a2f9a1d3bb32f9b7a4adaa99b60efdd44c439d94e5f10eada4241a36f9194669561144e77084cb56b63f2eff81c6f07fdd3d4f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2ba9b396adf10109648ab2f9856ca66b6fc5b688",
    "content": "{\"tx\": \"40d9dd910260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cc0100000012faedd7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3e01000000bdce0ea40285d78d00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487a77b7a2b\", \"prevouts\": [\"2dc31200000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"55a47c0000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09029cb4a54efcccea4dafaff73436fc60ee5b4b7435fc92eace37e5c5d2ee723e22f662c2e24427d387f25549d5a36980f4f0ac3f27f8f2210c4cbd92b2a3c693999292caaf533ec3aaf0bc7aa832e780ac41ff1f43d04ccb54342f2db52d90376dedb1682ba31f74cf78d1cf9fad9cdf023e0ffa92e0686adfeb4db0dc1e7f636971b2c8118a9b9177c527ba2420defafc162961f80533f3f38adaca3ba60ee6c01709c86f494d3082e52d35d8e3018b78548654d946c8a300b0023e987133e797a631a95885cc9c1966311c5318bc004d36273bed5a357b25ffcd15a6df9f79ef7e7497fe1299e2dd62ea89215b08d627edb1b2761bd4a7067765924405ec97be826e95a22a6d5341ff4b35ff845743e464f1b0388f36ce1b6485a4a72d97dd6d40de394a2173d3d3cfb9dd880c28745a4bcf04f47325955464882da740f2b078cfdb5fae6cce7ed3e28ad13ce77a757b24abfcd6be705603db6ae6b5ceaba91eefb4e803147c4915e35d5a2b545491043a8a283e680b7ad0d99db1ccf96827b588d9a0101b2a4942f01dda330054b3501e056a6378680a74d250c382d7327993aee995c814fbabbb3ab551a00c1e920faba4d69b1db802c848f93bf97e767f5f0c9ec52dd16e94ceda4aeb8c9d14cb717ff421956750123fdbe84f0927adb67c2cb611d5f935cab2df633acb65efc48e137d807969785e903cc0e7cd395f9f84e33d0cf2068310cc5375f5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365a4535f2a8b8103329caa1c08a23a51463ce03272f6b2653fcde7985b43626f34b6f5261b409d682c30910e7df322d9859114aeb60c7168b8885bdaa0165cc6510b3b87e8b9d8544644738d4851bae032b2bf37d3a4aa6541b936ff18c715610c711f738010c3c65afa09c620b919c88f85303c8a6c3749257da2d218fa6976b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09027370d73d83f0ee286bcdf47d56a638fc2a96fee834f9f3930dcc5b67dcbb7abe7689a28ed15513d1b733a5ed1a38f7699db25858938a56a8abcda8b82a7072385ffeaea4df29e6ccf07fb82ccece359b4b2b9b56a819a977eb7885c60c9ebd03b954938195567f5abe2173261c40f69e31d2478fbcdb45c33df599636505b989d2b3806618b3f359f7d3ade30b78c5671098c4c6456dbf0701f97ac56d02d178d00b5302f7f426a2121c57733a8dc29f0e25bfa4461ea481ab71e85d8ca493d6646a4a752554ac802931e8a783a66e08c3b217d71a7ed95ce86a75b28c57e8fac0a50fa3c45940a472027657fea7e2d7737e8bba3a6d5a396d0f0063be766e3ce553d434787fd2ac1a3499b2387af32fe57830ffdde282f9c011cca75df0c16405e9bcdac75810eed9c2ff8f708196394957d584bac8668727c6608a553a0519aa643eed2d750c0c63df091ea36f92b6ff05ad4cf3a87e2f2daf3607b222e9fa190b67606b998c6d949a66b862a2b7c7c24c3344b52162527d5fc330d81901a70a788174db795f7e11894f3c4cb0c90519666698c1e431e8fbb95f55bcd468fd63e5a513ad4ed4b5147b1e4962aae44bf5703a17d39453596402efdedf3782280eabad201e66bceed466e1b5aaca1c5a72b2a1164f954858686f72b89520da5b83dbaf9184dfe8f3170cf8387d07afab8f279a8379a66b5eea8ed2b3c6bc13f3d326165f21939707207561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363e6166208d8c263b9a4a34aa528e018584d0355a882520645d2ec0d7435d6daaf46b3ac3e0eb552c07a1c6336d6a3e2704f93e82a6d5b4a7907113e7cf17bb16c711f738010c3c65afa09c620b919c88f85303c8a6c3749257da2d218fa6976b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2baded8ac492d5bbd1dcece9f3d4a2f0458c778d",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf801000000af3ec0830480c1240000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac7df1c63e\", \"prevouts\": [\"ea9c27000000000022512063eb770f298cfb14c87c6cff1e0541dd7cbc30bdbab4472c0f37d52bd55ad696\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"ba7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e46c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa8eec2374ba6ebc72bec4e80a7a4eb00aacc51a24e1026152998b46c213b611dafed5a24f2185242e3d6c1310740c566533f3942992fafe5f5be2785933680ed6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d28ed9315b482680e4fce28b95ffa4f42337dfc620d9f0292f84b82b6bf4e2a98eec2374ba6ebc72bec4e80a7a4eb00aacc51a24e1026152998b46c213b611dafed5a24f2185242e3d6c1310740c566533f3942992fafe5f5be2785933680ed6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2bde7ad09804a986048db6aa7983bf552f327e9d",
    "content": "{\"tx\": \"90a986b40260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127057010000006a8f8b938bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e400000000e9d5c1d403674e480000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7e6010000\", \"prevouts\": [\"90c70e000000000017a914aa4a4e70b11f4eec4760f77206dc93b02350fcff87\", \"88c33b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"1656142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"57e53e386b4787443e31509bfee6c0b1bb2cdecda0239fc8d71217960b529cb82c40e0e35928e60c70c32e01eb2177e27f526e4e86f94bffea45ea362be4c589\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2be1d596003c42e91c2a03626c93ce8259dc64ad",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b050000000039ccbcc40458951f0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87d9030000\", \"prevouts\": [\"a854210000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"spendpath/bitflipmerkle\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"983e46c7721e340f16f66741f7f5b66ac0ff2e0a1a718853752a0be0a9ec8418b77190f9661c12602673bb39ed0efe1b2647f1d67218a87164b3d360b67f1711\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b78be31b16966ae882c7ab2969dfe11d69b83e8cde47f805ca2a48764752b9cbbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"983e46c7721e340f16f66741f7f5b66ac0ff2e0a1a718853752a0be0a9ec8418b77190f9661c12602673bb39ed0efe1b2647f1d67218a87164b3d360b67f1711\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b78be31b16966ae882c7ab2969dfe11d69b83e8cde47f805ca2a48764752b9cbbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddfffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2bed09f85647ccc7b26bbdedb9cbf18167240799",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c75010000007ef937a6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3f01000000d149970e0413abc500000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc8beed50\", \"prevouts\": [\"16f4570000000000225120571bc713e1a1d58bc4a7da330f9b17653bffa646093e5f5e3088fb48bff87491\", \"264f700000000000225120af2bbad466c5a636acfebdcec0f137a30a8da1196ff11e44fb40b3a109be056a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902236e2f5f81dae367b3a32efd6df987735531d7a249a36ab57ab1942d2ce2a573b4369058c3a3e021c84082d30e443bf2688653932ae4df20c0f670f595f339bb8180e48106b379adcfec74ba8d4ad1838fe190ce0737da53bd97fcaefd31bfba66ee1295721f198bee5c592951c9e8a531371a55bc321fb847788eadbc2d005029b63c313c1aee1d4297e5bd46ef695c9522ef339c80a5118beb0805834e7f5d16cbc3a65671bb3c71007cce88ddfd6330c113b71c2fe5d3139bcb93bb77e2029b2a476686573c42313b160d5615aa71d5f015753e73e495d22b83ec41014ca5e0c58c94ec79325fd022ce445543850f9f4a12e0a89fc7e7a84e6af93fdce279149322b65da69fdf21846ccf0b35a1527e96fdf8b1a6af144e0d41decb434c80243af46f5c54e7d977528abc9efb1ed94b77daf70cd8dfcc44aeb0f6ba88167d69922afd2a082f50ee7eee80d7c8b56f7c4b8fec1685be3b10887cee1b3a15f237cd7fcaab7663ca30b0016a20e6fbf01a4be2a7125e179d607093607a85d18a938c79e802f9ce5415693e493c1238d12aaaaa4ecc6c44608fd4d45ce35fba7c92ac5abaa71b6d5047e8ddff403b9fd5a3000420b6b357402cfdddf668da8e9e34fdf30eea73acd6038b1268768645a4be94b993a436021923648b58967d311cb8083d91eb05c5b89f027a07d7b7816193082816a1fdc6a8afe060dbf58a4ab2d3436f58c2b998160e75\", \"ca7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360e3072da704737c92e6792de46398d398bda5c7ff39800a3d9751e7fa2331627d8a21256d264232ee00f93dc1ddd051bb1479704967786b363cfaf3cd40418b0ce21dc20c2e8df5336572f81421322a354c6d32fb525b1159d1e49b1e9404bf5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902bcfc97d52a3c0f965091d2cacb7a585d7ac9a9cae9eff3f1790cd8ad05798f6de8d03d290a527b84bdca5fe6986ecdbb7201485bca1b0400fd1395aacf9835f064b0a83507546adb84d6b11ba769402a81435b13ce4501b0fa96536282f5925ab3ff03af6d0e24c3583047b751e34b364f26869405ecb1e0d4bfc5111a53de2ec6f06665f3b6d9da38ac5341ee6c1c75b0adb7357e1ee21ef26f69831f2f91cfc48ef7d16f84362f9f584cabc7d752e69f6ce47ce542ed3247e4d166afe039d1a43b69be51219e81024b9ff04d6961b98e696121c64cf0cb438ef7d5b08c3bf2147431db5763ed35b9fde768a90013100abb6cb16a652ef5732a37d883130a91f42323825d7993f5b6c10a7eaf8a8c955c43acae39fbcd300292d1f41a29de29b265adf9662e62ab971d2507e3bffbba40421ae5347b67201e0ec4dd05623b04e88d74cd45f42413a3137b3908f4e9fd2d1d8de9774bd1431d72de1bcb10ac5a1ad5c766ccd68959a19c1e2d83d4c05fc304f2cd59f29ba6128d5a3357947a2629d8f325790cf36c54074ab867a40f6d669aa5f68afb6e290f047a35c9b7fe52449d636db47cf18c0ecd80637cb8fa9f0031e8b8d1b3607d85d9c71ca9581798c6aa7e3a0e7c814d4e3b73241b7e432040373db8984c3a2790016f2e851b22cf1c42226f9cade6d98424b0798933fbebda7ca71b8e6246e42a966a4d09e6897a2387b9a12b0e493fc175\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e3449c69d4dd26d8f08d0fe98a8e8c1c38138c07c2a650710c465fa6c38a97e3ce21dc20c2e8df5336572f81421322a354c6d32fb525b1159d1e49b1e9404bf5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2c2132ba18413a6ac05a486fd72669aa4293e784",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c75010000007ef937a6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3f01000000d149970e0413abc500000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc8beed50\", \"prevouts\": [\"16f4570000000000225120571bc713e1a1d58bc4a7da330f9b17653bffa646093e5f5e3088fb48bff87491\", \"264f700000000000225120af2bbad466c5a636acfebdcec0f137a30a8da1196ff11e44fb40b3a109be056a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d62e2c11d390d4993697686d5fe9ff5088ad345993c774ed79e9cd5d83468e5b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a2e616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2c24b83fa75f9fc91269d9be43a5c14f9a0c8adb",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1300000000eb0c7ff9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9f01000000c78597bfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0a020000000af4cdaf04a802d1000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e76dfb7e54\", \"prevouts\": [\"501121000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\", \"7beb5e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bbba52000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"2b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936135ad0cd7c9b6311df988de8317b2c783507c964445beca4d69314b6889edfdc527b3d6e358222ba6f0d0e44427df3c74648eb5abf60e34311dababed48c5c2bd74d03d2cf0ae79996d1bf896237ca201e78f1b4c5ece550af4c0e01e9fa9886\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a543900b336a3c008870ed4aa640473f983a69734480d339364ae43ad1d21b16885bea8937005622f3eb8b2c440108feebbdb5f3ff09e0402c722754cbcd9b2d195038de5261112827291f7af9c58b034003ed818b7e5ec0d4ccdf81f6c2ea4d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2c2615f5ff25527bb1609bacc940eda0c32b8d28",
    "content": "{\"tx\": \"8e8e60c302dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3d00000000e9ad4fc0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfe00000000630dd0fc01f5cf80000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478754000000\", \"prevouts\": [\"9422520000000000225120396e1e3d37873693c049a0e141d36811f0051f76fd306cc6c1f2259368cdf0eb\", \"671c5000000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"be7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ca40252659daaf7bd0a99f0cd5df95fe9267f5bca7d63ff15beca83667156d23e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8c20793b34d3eca391845c9ee05577f0fe1c8a49b621d2ce1a9da4783f236266e6f69f1f3a976918b4a05b157c0a8e21d478cce8b5d78fdf690138c8d187dd5c9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93689a733077e07d558d32e9359f72d96d0e65552d1fc5bec129f6b14519670c299ab0507b9227b06ce0689f3875ade4de998c1d9b3bd044e9f3b63e2ed7f9e05ff6f69f1f3a976918b4a05b157c0a8e21d478cce8b5d78fdf690138c8d187dd5c9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2c2686017a35729961e5b4064e6ea9b58c073505",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ed0000000005c790a2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6c0100000018167116dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9f00000000e046d60303b5e5830000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e74d241b32\", \"prevouts\": [\"69900f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ae0c58000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"92f41e000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ae0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5112303efa97a8ef6ff3cee2bba9a63ee7e38a3d19e4db44f275f3f55c4e39991f7cc0cd924d9aecb0bc2fcf01621d0e73a88693291594fa52fe0219caeccfa5b3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a798727fda10d0036e92c2807d287b376d106d60a47a638b2ffa4bc96415976a12303efa97a8ef6ff3cee2bba9a63ee7e38a3d19e4db44f275f3f55c4e39991f7cc0cd924d9aecb0bc2fcf01621d0e73a88693291594fa52fe0219caeccfa5b3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2c28303252e327e51e1e99036e9c4fcc97b10d8e",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c452010000004e24b6b360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127082010000008e6c8db2045a9741000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df97972236898755010000\", \"prevouts\": [\"2c1f340000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c8200f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_8e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2a9fa7f94fb4eed58add5335b59b833f5d23368510bd8a0bad2d767a2071b5b850ff0d7a306f2e990e23ee425f618eeddd804dd8e7123627f7e262936133501b02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4e9dad7f641f850229ab9805daceb057af75c9b7ea11e99ed179c6dd05da65dfbf5fef79d9abc6bf6de2eed4bb0219cdb88706a421c586b9138f50733f22173e8e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2c3a119d1d9da7d4fe68883d95e8f11060a9def5",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707301000000b075f9f160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703a000000004772b9bc03c6971e00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac66000000\", \"prevouts\": [\"0d7e0f000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"2ae0110000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"a4d66911b9fab85fa454ff79e7aacdb46a0cfb135b676c3088d4188b6d8eedfd4b6a7e5d091228483a946f396a7eb7a52e036fab36c42ea72842463904828f6983\", \"50c1e8ebef0ff5a53599a24f57ac480c27d919b1eb13fd98fac93df728ce6b0b78ce1d3365a0bc169463accb988a490f1076f186525a9fd9c3c8b2a4027b15574d015bf2d1ef1fca000ea1d8be5fa4ad17\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3be1d19392a4847afe2c1fd0d8c7ed5c91bf42072f6fd73e7cec54601dbad6a8751360f195d58870f0f11dd3530853fa10c72e7be83aad2c8583195fd6c8488483\", \"505377d055a183100a91b0a0c5ec8601ecc394fa006c26ff0fabf901f319a509e70088370c5136e74d81642146967476ea381f32dc3660ddc4c405213d85046b528bdda31c2075e07de31ded85a571a766bfe188929118b572791b993ec7840972d0e06863cc88fe3393c6101be1ca11f7942045bfce40112b02ae69d0a618a34b8a7a8baa220588bf8567a0141996f444c061c197f06603749a2e67e719b7dc92e50370bfc8c37f81f165f737dc3c58733d158520166cdfa15e640f4f00f219\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2c3a775a5deae4555f3af3537c8a4195c6e5354f",
    "content": "{\"tx\": \"32bd0f0b03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7301000000a2d6c9c760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a100000000c06b56c760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127000020000006321a4850146cb4d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48709ff9333\", \"prevouts\": [\"03b67e000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"f22b120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"802711000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_b9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bac03280310edab32e47ad2149e69de400c7ffe6e28a636181118f38390d7a787f2ae43f65710514538b1fdd779c58769ede109ff1d79db0bf4471ecf111209002\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a297df114f37f55d9b4ed1e3f63bad63d671d4b9b23c07be7af6a916ec99158de750669f9737e120809497c4ce13d79fc1981426b808fb763aa2343f19304573b9\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2c62f7a3d90b30d6f1b1804f6bf0a916d3305efc",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6101000000fa271d9660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270790100000078cbba8d03582c3100000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac1c000000\", \"prevouts\": [\"2453230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b6c010000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_48\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4a56d64489dfcb24ad51a498b7f548027600e170d67317acec759b0f03422d8e5ab3460d69c19f6be0eb559f50974c028601689fb5b5f6237363d47ef5b8e24c02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0db5ebafb35dd767eccccbd366467749618c34c6f5fb7912f66b22577b8d93dd653e03e8d68f6ab4c010e6bef0a6ce86255f8fb46088e55052313894091886f148\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2c67e0be52a7389f103f44944fe8d8913c973b48",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708300000000a2259fc7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8100000000c6f72fe102884f91000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87c8010000\", \"prevouts\": [\"1fea110000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\", \"6e5c82000000000017a914927d550e2674fb9e1f6ae1260d00989fc596dd7f87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2254202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"aea28210ccbc6063f5354013cd50857fba6fd49a8749ad2a4148746ed6bdc422ec0cce14f7f2b83e3d27a6a13354cc60d006a9039e074d670657ae6edb93d62f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2c7c5497a7e7f81979773204f099b9f23323698e",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccd00000000f9b351b001d812490000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e79e000000\", \"prevouts\": [\"d5225900000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ad0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045721cddf589dd211ac28650b11a57c9c7761090d2defca181b3dbd9260ba7b6b1d191de94316b2d555b882a7ea052cdcffb2858bcf3e9dcd4db66bb89a9914d760d690b53af7dfcad925f9834a18ad2ddc318ee8f8616a880729dbc2fd60dfccd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936140d466410f93f506cb3577f700de6259d226f314801f04d6da966bcb64c10bef2809a2eb594a6d82ed798bedf8d6754ddd1a8a74001a2f8f1c3cb07bb651864f3b3fb8d5121830dc5ea13d084a01bce62f4c2426ea7fcb92dda33a6ec3d9661\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2cc2506d179d284634729bf9fbd8c05239f90ca9",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4c00000000fad9e7660375706800000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478780000000\", \"prevouts\": [\"785f6b00000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f94c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c138752b88f442304cd570a99b7416851da048b7f1df3ec1a880a296df45b544a4dd4bfc6549e8d5e198b0f1e67d147f6db02444245a6cb27bc19444f2462468d332399bdd0fdb741da8d579adddb10dac50c4b595c0031ea1e156729d78e3487d6928db58d705af4b513465b8e8f739d066723840f3c873585fab69756481ab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369f418ddb17834b13bad2d7867a7cd562666631728cf586feeab904af49e7e90debe99bd20db478a4ea38512f1221f176d7e5053d85ce724541b970d7e312b589d332399bdd0fdb741da8d579adddb10dac50c4b595c0031ea1e156729d78e3487d6928db58d705af4b513465b8e8f739d066723840f3c873585fab69756481ab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2ccd61243d6bba96a68b774617b9d76c97662ff0",
    "content": "{\"tx\": \"a890ed2e028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4dc000000001f541de760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700601000000ecb8d1e201aa403a00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac99020000\", \"prevouts\": [\"ec3b3f00000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\", \"f06c110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00638668\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365fab757434963be9e6b2bc0ce3358798181954c3af1778da49ffe7612886fff5056f60ea686d79cfa4fb79f197b2e905ac857a983be4a5a41a4873e865aa950715c685a6e20a464c0638846c4feb0cc1ab19a0a1d3cef03660e119c827d202a5d33ab5c29645e0220ea4ffd8cb7e67404885cb8b0cf94872336c7b06d59c3124\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d516619599a2832199ea7520e829579ac708ea18d94219cc28453716c125c7ffbf6b4167115de6998fecfb714975bc270adc7a6998f06c7ef8576e15f157ca8963750636431b24706e8b1111073dac761b2ba654f4832b7b9ae2a348c6845c1d327\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2cd0311c121154bc8385767e5893c92ee5aa2c05",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270410000000011ab04a302b6940f000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc40030000\", \"prevouts\": [\"5d78120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_38\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"671024994d289f8082e67b82ad6c507ae04d157119b587baff5ad260381797efb62a929e26d45f8965e5bd110b3aef395b702fd402ff517d175be30d7cf3f09a03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c81a578377825b6b347ac5c4623fe99cbf806ead287d9bec6c7a24728a2018bb0e54cb299c047d9ce95db7071e4a3f6f99fed67291398ceae513120af070ec438\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2d240420d7f8e429cb31120c7bf532805423084e",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127031010000004cc7cda5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2c00000000af66aafd030a6e79000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87dec2e433\", \"prevouts\": [\"a3ab120000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"b7c06900000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"30440220424a1fcedac58fbab208e7872625898eec1b477b391478d49822257108be639c02203b1888636d3f82bc77e92d9d245acfe2715ca7c9e4963a7d15acae979b7adf7dfe\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100e974a892ae164d3255e966f24d7157c9f6e5773a9f2534152153e64bb12fea0102200186a3dfc8c364a7ae72712fa808647039f4e9fc39c07bb3d89c13f0d62ea0abfe\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2d2a878308fd10775f477107b478ca6993799763",
    "content": "{\"tx\": \"8d072cdd028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c408020000006c4d0c91dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be800000000b35dfbaf0267815900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6e14cf126\", \"prevouts\": [\"7b9236000000000022512085b1b5643880360a93ad399dd8d1aa945ccf0115d9a41dc926feca691d280be1\", \"8981250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93622caa5a4728c320064920d38fb193ace693a56e97bbcb89e0763e5547ea42b91\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a08616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2d50c7d765d0137b5bc9bd78ac8e39437d22fc0f",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbd00000000d61de46603ff1b2000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc754000000\", \"prevouts\": [\"31c0210000000000225b202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"74d06513e254771c994c8eff3a704430ab64d6b1094937fe3e9f90083eb5ef5c0cbbfd8214affb01532e5b00db6afc887d4f96e2c8d8ab269cd12eac425d2b8a\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2d562228e60c1a1e62b21379cc97a7cf96852b48",
    "content": "{\"tx\": \"0adb3c5a0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c30100000007c9f6ac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704a01000000e25f26870387721e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2a817952\", \"prevouts\": [\"569012000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\", \"59830e000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"7e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369989da34048f0fc009025cddcce64a25b2539e47e8d6db7b5752e0bbf5ec5785da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ed3fb5b8f7b3afa290146b30788656a8f4c2497a65b1555cd50f1d702ddc8a1f8f2e4a14a40b0acbe20218e44481fe6660f01d2e0cf04e3bc8d4452bacd1080d1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08246c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fab95efb91d04564594d9dcf752eb8fd975bf01996a0bb9f9eb7163324924bcd44fa5d068ae686a8bb1ac9947127542ac866077ad522de57cab26ce701d52bc951\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2dafca8d1802bbb6ce3ae1196aa647ee3c9e418e",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5c00000000bbab6ce0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb500000000c4ee82fc03fcbb79000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f878865e72f\", \"prevouts\": [\"34dc260000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"8bab550000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"30440220737d2e648a5be65074da66d545eadd11f9ddf1d199ca3ab7cc78cfecc3e18dcc02207f2c8d36c2e65fc7a9934bd579e42176065193e8b901b8209c216c7ae7b8985f82\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3044022065c9c653026db1153cdd8ae6e83aef8a48d7d558f87f475465c26ace6cfe4dc402205731f6814f4a56cf57cd6107ebc60af4a92a74876a32064ee6a8c15e206008c482\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2db945824c150b91aa78265f9e3701bd991fcf10",
    "content": "{\"tx\": \"e2951d0503dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2900000000faacbcb9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1601000000b69418878bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4eb000000002de75a95023fb57d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689870b6d6e3c\", \"prevouts\": [\"4a82260000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\", \"6f1924000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"0ab0340000000000225b202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b904af0aedf319833b6f0b5cc7decb0889776f3b77dd0bee536a968c107450583dc089f03a34f9a466f96706ee05a2c65539647f5e0522a7c1eb730770b2f3bea809c0c19ecf10fa30a127aa36fa908ad7150633bdc76f444042c61340bbce98f283db07d21eb3646864d591d62d7ea89cd4fe5c53d9cac758325c23478cd23cb96479f190182bfd291c39676b63b25ab7189f37c57b6aa43a9787a8349f43ae6af10354e7c7683ba590f944c3f093f860075a196bf752044b2b9e871432bed800b030b09424cb74a4c11ead0a02665a359a06a427191c45484eea8acd392b190ffbb0b67847bf9a36a335ac89a394d88743908daed17785255b26220769bada28c31d2f9f02a4c9b4a00cb3902bcf1cc4f329ddf7b755fb48424ac9e2b15423725fe4392aee827301d3bc45b505bc283104c722e19161595876ffdebcb027e30bd4617df89096bce9d7b78b1451ac28e0b27e029178010867b2da170d39427ff5093c317c8272b429ac5aafa9a052804a61485d365db36ed4e6843a72703898607188976e5c86ffa3d89b4bf040fd3cc53d0f80542bb58ebc484bbdc68885b83eeed607504fcb8e701a3f5d54dd575762b414a2a420b081fc8f60a8b7badc2e7063460be2968cecce24ba321cc219799ea24f62415cf33a6ef1cf4a78606e7fb7f506279b41e02ccbdd054737dca131891bfb6465063f4695a16e5e9dfe559a5b91a3ae9bab51173175\", \"3d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362b5dec934ccf641c1f3f5519568e5c1c1326bd2715cafe0a6e7ee716dc27c9f14ed4022c883bcffdd4981a43d80a989f638bed5cb710560195e12f06d5f3803c1cb891527dccd7fe22077390053ac1c45ab6e7110116df1a30c9559411f432f5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902257170955c47916501f1e60c211483835e75c9607c71846fde55f94f7aa07a0af2cb6418c4e1c2412127f30be270998c93e9590de3c36cac97d677a256b24bcc76b77d943717e4a234ec25292d21dd067dba9e06830f0368f151558d05d5d07e012f91f50149ac649c461743569c40ce9333fe03c4493f78cf0979447849a721f1def33ce6a24d9cbb3ad9cf6e909243572f75b01621e405f251adc94b7dc03d07bc5d94aa409b639ec1a77bf4fca14d3549c531d7eb2449a0520f30ecd38ce52ab978f0402be6e8892482df4274d4d7f0ea0143d29895bc7fd257e62fb7af1d5a2e928f4c6bdf0e192d3b4a285b5ac0089875c94f83aaf2513e3eb15e4c5fae4ec1caa74bfaf5ac4795cf54d655f358d4011f9e68e232e813a4df6489cfc2ce3020464d8c4c0579852ac2529b3623fd1c11ae5178e665382fae66fa7ad93f6eb7443ede6bf926783c8eef39f9495b71a096271b5ce0efd4a7f703a9716827d1217fe9784f1dfc83e52c30c326a3a22d8ec9878b4b51ccfa03958203245afed879db89040dcbb997c948e771f16d17ca798e3e158638132ad6fe035a478231903687b0f2c05f10b447a4b4336a280e48c0ad415fcba55fe7ef100c2ac1da92cee102ed2f2e03a1d01c5a5e5a3696693b8b64bf395d8a75555cd58a353ba21948541ce5427ac4945a027563d24d51dce47446ab54ee30bf25b2854f8eca966297b3c822432b73abc45675\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eef9a48fcabec25982850a496e19df71982d596f167265e15d1ec282fb30074b91cb891527dccd7fe22077390053ac1c45ab6e7110116df1a30c9559411f432f5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2dc10a9c76952430b8601993c330b88bd0e19cb0",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45400000000990ad9cb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709601000000ca2459ba01210a0d00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acae847024\", \"prevouts\": [\"dd2d390000000000225120ed1497f510b05298f56dedfdf59bdab87baceded2037e3bc9fe47e7002bf81b0\", \"480f100000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d666a87a34bdde03248c8aac3a2f3cbb5c6322b1c912a69a1720e7f08fbef08803216184eec05d23f2cf8f11e8132d22e55250b1dd0dd930eed2463a640b4cb3935b24f2dda21bd71b290b36c23a236e30959133139fae36c8c319dfa56ccb90b4f923087529860f60db50a941e0648505ee9229884c11d173fccdaea036b5dba14a392c1fd4395ff1b7822f28ce9a0004528e2fa8ae1dccb1bd625bb1fcfc692e0aa9a022e68826a2877d11dac2e04126f6e07e45bd216ee7ab06a4968c00d89b79a7d694735f4cabb34156980ee79b7aac581cf7775adc112e870cb17fdee261bee9f4bd5b18fa95aa09d60e495a365c9508df1a56f37976c686f96663e0230d8b361d5e30f297cbe821243044a694958a536cd18156076f3622111985cf0a3139f617cb31d4579ae1895b63f089440e77a065a8ec026200c06767f6abb6f469bd20680cb27d39f75fb37f4825620229d9293004f8bd9ca6dc114006363919ba331314771512786f7741367e58d06b74a75d04ce197f6fd9c2847636622112bb1a45221a9a0522bb592c94847b18761c41e2b846be6cc8f45bb8995138e65f85dbc5b0bfc7f32edb83097f4a210f09cda4264ce9f7ee4ee22f69b0bc375ca731222673b6e920f960bdca744e509f5d5954465de105977324203a3e262c0fa535aec5147081fa05fc6fc3b6a117c5369818034468c9580a1f568c01c1b21d9d2bcf4569fe463f603375\", \"7b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffc23cd491e8fcb233d9013136f75dc1e8b804157adf3d15ad0ad23d368e24bf2affe3792374ee751e9779d236e331236b2211c0285bb070b7e5d58aad1c033f64fb6de85916ce1333b57715a419fbbb7fd448155796c8af09a2e4a2bc14d947\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09020d89e0fae9357fdf89b3639a88a65e941d8855eec7ce68e6f13a6a6b5ba7abe824e47f9cf11e1dbd0db57166425eff3ef578e9d73568bd184640c4b591b9868a60e084744e7779b6f7ed248ff685354f7a6fa7e14e3da359ff41a86336d03e9c099b997d1b730bb33294a22b3a195f8aea033d9bc2379a715bde9caeb673718125e9d4d4414cecec1512cabc9cfb91f0b2dc8a05af0d20c29414ca1c038cf78b8e4aa4acfc6d684bed98bf6b681fb6b7df97d391cb17b74973cac63d5bc86bc87f9d430a2edaa5b85e433b89c896b996947815129981a5aff7151ea9f31cb8c9fcf95da2582aa3fe946e980cf8a244f2ad099e966e49e3b8244780b5ef903b7c607cc2ffb736f8d564e668a7980dc19204e424e745cfdd1efd399904892b0a6be52037ff7f6e76fa8d8c7205e6bee9803a215355cd4fde78aad7d52c69434936dac65bd6bd9db59f771ad152530fc9d46a3b2e763bee19b8d3107c2d45860838c11535d77df67292c9824f5522e05a7110767a2958a7cc3ebe595fcbd74ec86be2b8c4bbdf5bb6e961d601c2c23b209754997b2cb59035a9f784a7ca23feca6f227e72a4053b48320e047a819e418a25e269d2e8b14a993ccfb54d8fbecda59635bd327a3b21448c5d75da091427fee5410852eff893bd94ff535963246cdfbbae3891e3675cef51b3bc6440cd3cd3486e3dea650cb3712fccc780e7dac268f9a2244c828fae1383d775\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082565447efa486312fa493bc3efa8d0ca00e2c766484411258b08f0fec6b85156cd34322f35809060e9857f404c38bdcaf402c3d07c78e42a3b4d1eaa304dca88a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2dc5b1536be7b443c27e763739595c42dc34998e",
    "content": "{\"tx\": \"b183537402dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b730000000029171eb98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40a010000006f30ebce04500f4f000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374879e627060\", \"prevouts\": [\"76491f00000000002251200e94bfc4da0ec878710fc6e63dfa8cf2888c96cc8603d6f04301c7800d453852\", \"9dc6310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364f1066f55fda12d1d5279f6f8609595c415a02645efcaf2b4e451b7cd978e9be\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a60616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2dc9f8f8cf217ccac41228917cb739aee23f3b55",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c415020000008b24badfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0400000000376ef8070205c49700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df9797223689878c020000\", \"prevouts\": [\"92b3310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"adb367000000000017a914856f7c6a5a6a1ac0e553b769a4c35bcb9fb6f50287\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_fd\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"697477b6f9d7c74b509fb25aa4948561024137bf5c2dd8edf46921020f4f122a9bec8324cefbd879df5bf6225ecd05d3d86f6f42bb1afff2496a0395467ee504\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"48f3d197c6e9af9cacf64915a2f18cc6c0838397d1f75de62dd956b4e5212be98be8b375a488565b5860f3f0bbf77f9d9eb6760a40ffb52d46a798d994eab796fd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2dcae1af8317442bc492bd0899984f32bf30396d",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd901000000f31c8ecadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6f00000000c116dbd404db3d7a000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5d010000\", \"prevouts\": [\"1ef55c00000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\", \"0fff1f0000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"137d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e86a37fd9f079711aee2dd395c4f9bf6b9cf1f54b1a82846abc908addbbb61fc725d0346f0de7f7080f7758bd86c81c482f81ad0c7703311f4b65ab9d7b77c9f00\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ebd41cd46598692ca564feb702471a27c2b329b731a2dc6dbcecd3c4d6afe3efd7c43b740c0608ac721897ca7a4b0bbd2ef7e62418d1fc20274bd386c7c0d4d7e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2dd9b9584d97aeda14030c0cb94034e5a64e1e33",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ae0100000008a2ec32dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9c00000000ab39da2d03d6d489000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc742d7ef21\", \"prevouts\": [\"0d91320000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6cac590000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_aa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2fe77d385cee1e8ea67bcd1a4ab9a7a56a6fd393937cd299ed84fc6ff756a1df9a87d024d0f2673e09d267c99b2631e47bf3c52436e2f7dd15473b628f861f4702\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"171b6ee5693612f96b8971c02837bcd7990bdac55d1268294b28e40192fd4aac74c35bfb700be0dd9b7481d55e639c3f7b0c8e807fadae98b63b8642b4d0166aaa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2de7782cb97bcd10b69053268684420a0022efd6",
    "content": "{\"tx\": \"35c5f7e30260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270220200000096b2ecaf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44c00000000bf5276d503061a48000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df979722368987c030cb56\", \"prevouts\": [\"02ee0d0000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\", \"ee013c0000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"f77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a71884cd53fc7dd87aebc20425da51a5c294f1bede93b7a913770a59279767c4e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e80a4dc25bef94d3da1f821dff96c297a1e496d55e040bded104527be104f359289411b885fbcd56b4d2cd2e695cafde2fa2de7097172cb34b20e1fb870aea9a6a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f5209053a0e3543f016bdabf2a9b449e56532ff027210dc00b302557bc408c98e1b135a17580d142a9191c3b85b2fd298f3e09062f6f11151feab86e1334277f9411b885fbcd56b4d2cd2e695cafde2fa2de7097172cb34b20e1fb870aea9a6a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2df7793cf7520895ea4121850c34c16bd1874c22",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf48000000009d982271dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c76010000002843b97c03ee7dca0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787fd93ba45\", \"prevouts\": [\"a3c46e00000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\", \"81d15d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d04c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b81ff7cc7637e0c05982e17a8e208328988859d4b2b7eb979a1983188becada13f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823bd101e45a609d3b8e0b3b6f0b7594624f7e9102ef5d5dd3027418de40ebb2180d690b53af7dfcad925f9834a18ad2ddc318ee8f8616a880729dbc2fd60dfccd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eb3c724dd5710b1380b446d964c3207575a75cdfc2d4e5f005be07d8e30cc140daaf72f6551695de9dd2e4eae28f07b41c9ec36110061b2152d7ab3729ab44bcf81a0ae7b640e88bbe84e7c412f47337f1d12d37f95b062c539998fd28213cbdf3b3fb8d5121830dc5ea13d084a01bce62f4c2426ea7fcb92dda33a6ec3d9661\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2e15993224f1d73378824cbd1780f6d25e85740a",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270910100000002ee48babcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6301000000681f3bd404a77680000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac689bb04d\", \"prevouts\": [\"d5e912000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\", \"11686f0000000000225120571bc713e1a1d58bc4a7da330f9b17653bffa646093e5f5e3088fb48bff87491\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"ca7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ea15911bfc306ad37f0e70507a95a4a7045d4c5bf0ca1619bed3f37a14eb6407e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8bfe61acb5630f372e1ed5eec342882068788aa3656bac92c2951e857c300141b065bfcb7199ff8296c5f7d41f3b2c6067d88c0a33f2878328c609d56cc191f12\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367e39eda6846be57e551a440b61577244ebba110fe39aa4de9a3aa77d57736b5ebfe61acb5630f372e1ed5eec342882068788aa3656bac92c2951e857c300141b065bfcb7199ff8296c5f7d41f3b2c6067d88c0a33f2878328c609d56cc191f12\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2e2b8acfc93c65c04508d0730229d6beb1760346",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2101000000cfe0b1b560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701701000000d6dee7570105fc0400000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4c000000\", \"prevouts\": [\"48997400000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\", \"60ea120000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_mis_83\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"a9a463c57f5b1cc5842c32f6861eeb98c56b3095b2197f0179969ef076ab25d20d39b7716feadb72ac981c7987e20c4b8515b4f9c3b8c492e0c03343b569cc2e82\", \"507a06e1db1b486066c7a31bb8825a8d4302e904a212edeb9483bce2e1e7bfc2face2c9d48f67629594d3117b8c3ef6e71a386fe8f45378203b251d4b128acaa7269\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0ee1f68bef8ea48719567c7dcbd082a7445c6f33d6c6725bc7925ef66844f13a78baabac3df01b4ec85b8869e341ff558eb711e6d5e59ce798f12427fa89a4bf83\", \"500b8bdb554277b253a33974533211c9bdbdb494be9869b397c3e49b32982d90b8842ab8908c5724d99cabe2863b00f227b79ff5c83dadb7293a20c7a4be1ebf6cd569b24f9fcebb6937179e2487c7eca78ff87249\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2e4630df1ac360494322a4300b3a916bf4a7aa42",
    "content": "{\"tx\": \"9e51fc1b02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf32000000004143349fdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4beb000000009abff0ed03c1d68f00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ace21a0c39\", \"prevouts\": [\"01b468000000000017a914a8c07d8aa161ec0fed82ac1dc93d81dd0a92012687\", \"54c72800000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93630ff43b1b4fa7d17657f9cc2ec27f32679adb7cdeffb13176335679db5b5919f3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828121d7901a27ea565e1cb6f91818c43a3dc8f46dc56db80c8bd3776430739107a653bf1dd2d82b0dcbd644d98f066b9fc3e48690fe18b2084515352f558033ba\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d514d5a9b7fc917253ce709706ec0b90ac12c0f363dbc177a85b066bc4407805851ecf70b79dd1be85a38988f8929e7263abb01bba95965800009381ed351eddb0fa653bf1dd2d82b0dcbd644d98f066b9fc3e48690fe18b2084515352f558033ba\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2e9a37abf29713e5bf564831df0206b134ed9e23",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf60010000006c56fddcdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf700000000cc52dde28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41200000000d0282f1d047d49ca00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d8000000\", \"prevouts\": [\"a7a86f000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\", \"7af02500000000002251204bd530dd92500289ca536d9e0216beec7b39c81554ac6dd1e9e4cc3828e76161\", \"2e6e3600000000002251200fe4658e0dbf66b6be10f530376fb0e6dfa185e9d7f38ef5d5af1eba17e45594\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b7ad5dba2f6f9458c267035de2d7bf503510508c8170fbdcaea0beece8a3bb23282b7b94ff2692e877eeaa3eafb165130cb72cfea221dc1c58e730ef74fd0fac2d03c13d57b4ce5b0f7ea75927e23ce55c81390c8691b340cca438ac913c93305ebfc1bf0ab184275a47986721d9e8f84e432fcfaa66fc390cc40b5c0290fe4b0c7cfde660d1ee135ba38c440afe4643c43e3d8b4d68ba8040e98073deae341927ebf2266d75261f6214a86770d368c621acbc65bb9a2c7d63609caf35c0ecec934b8a35d972d4eb890c97d9efb764cc68c53e650a3ef109e3716255ed3e0d3ba7aef3ed87e4d27263b62c9061817da64c850af1dfae274cc53511cab2acef4af2b814d26bd325950368d51e19e7ac1c1a2110f7b50316de62e60f5e0ced7a359552e8c90be6246b22132cf033941b5944e52fc7e7aa25bdbabb21948e91ee116fd488fbb7229962ed3e168f23612ef3436cc4c9bd0a5c4d7183d64660df68686f73cd6cf451a862d2c3e833b18d4727df04ee7ab75e62480db84d78a8f5679747e362e4fdff8760ed0d4e03a4383f57d8c88f2964bdf81d017cb6f18be3d7a4b4066719346642082479181c32c448e66a1890e57cf84b0113f5e80de7777280948712cbb01a1df40acca696cd7148190f34cb2fa319793f9c7086b04f8a5be3a02023d4a2928785d933b30c7a160b32310b76a06b255ef4c835996c1cf58a4f7950a8e742049b63d275\", \"fa7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936871d09367f73210ada4ae17c4e696152b1b26636a23a3c040181dad738cb50193f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0829a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ef1076b289256cd19daa60d704e81db3a39e457bb71d9d0e29c4cb2075820e5e1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c4718fa1742f630e1346c8971a97dc28b4cce6fa6cfbae37f39d896e5b06392b510889602d9f3fbe754f3e9d9d1ba4e3f541ad98094691579a8a5d9664d69b1c9c35b2fdabf844c85a1121ef42824f7777bb6b72e47bf0cf97f434d6785dd7e8adb346d0b105209d30cbe127d649011a9ade0103a12da678b54f64b6f0594a3f837c450ffef8f55166ed79348879022fbc2d61b4f2f00095f7a8bfc6a3b283fed52a77d149151c58b6a0b1ab76c118da14bcb10aede9ebdf7fdc6402feb70ac33bb898ac02a3d16497f1296a55da1869548de7a289ee324d21ae208e00cb80f1cffa358190b15800ccbe6806b56530bff303c2990d2cda159b647132c0439bffda5a392b87844d9e911d6a5f83b3ed6fad30e74a263271f07d2c1c6b2691559d7293172b4d43e9162c6b8d8f5868aed99cc7b7c81a78903215779b9fab998bf5675d133b4be726476089f5aa330e4f253db7656b13f58a050cfa5f752f31832abf50c75911b6ede542f22232a351d9416169451df509d7f19ec9225d3fffeb2759eae5ab270110fee0b16f994fdf531f2dec50a73775eadd449b2307f2748d1b9ea07092c437684160b82cb848bcf342067aafc9ca65257dc0ba1e2f7ba302f2aae965b572a53677671866a5aee0dff7ce69e8d4182b9d78007d2c815a29321521020242f6c8f96f2a0d3504a49780db73a422e3fe68b69f76af454f4c0fa3c4bcec9210d88b59dabe75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369137576d67431f087aec678a5b0872b87ad128bcec3b357baf1a434a8a1f59b5284b3c1002850d4c89a68130d64a5a5ee29d0b1bb458f5120fd1f649ff1c37e66ac496a48f5e08c9a0063585476106fe61a3ff4222f4c7aaafd1f65bf01170e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2ecab25cfb72ae137a881589719a53343a030263",
    "content": "{\"tx\": \"956ac78c02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd3010000000bede5d6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbd01000000dd0c1e9303c6f18f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79631010000\", \"prevouts\": [\"3db3220000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\", \"db25700000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_cs_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313dbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0b28dc1a1ed9c237cc12bd76b0de2c6d3a65d4aa2db7a6dee9d7bb55a8f05853c18259cbf31a19f2a6e9653cd9f674322322eb2f4e78dff407e40bb84c9928\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313dbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2eccff6ea763376046948b3876b0d9b3e8b28c87",
    "content": "{\"tx\": \"cc6f3def0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a90100000072a16fcbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1d02000000bff28abf0409d36200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ace2040000\", \"prevouts\": [\"38281000000000002251203e6b8aa12170bf3e8ad7f10d608d1ed027d7fee17123c5116152c821758451f4\", \"bc035500000000002251202f329ebb629b1bb09406fd99900762644c979122f44ddf705116f636c54af1f8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_3\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b169c11161be2668a4898276e1674688a27c346bb637a43c4603cd94a1675fbeb0f4e4a049f072db99a8129c20c7ecb362d04a1f7f31ef2c875354c24c669dd801\", \"4f11cb54cd4363330221a5476e74c99e78c313b7e57ea6a0a1a013458a6017055bf2fb8346e050982ff6bf4e87eee951d27544f6d9bbbd37797efe7145a70c1734571bb22d9dfa6283c74a63267c132bad\", \"753535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a25163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360000000000000000000000000000000000000000000000000000000000000000c464465aab929372e8a3272aaa968cbe1bc1afb1960d855f2fe679d588a02434856b36bfd7f7855bb64dbf9aa668b0b855833757a9d963e8997fdb5f4e4240cb4447818055f223605d46ae0697f5dd051ef4973d44405ad46cb7216702b7ff39fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff31269ab2f4c1c53405a20186a186d3b8959a3926b34b7f6cc4c21ab859b1ef6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b169c11161be2668a4898276e1674688a27c346bb637a43c4603cd94a1675fbeb0f4e4a049f072db99a8129c20c7ecb362d04a1f7f31ef2c875354c24c669dd801\", \"3ff764577193cecedc2471709b069b3d901771a4bbb5117747b819cbd4ae05a8325788723d9289f513cf115e00228431a78d3bd32b6087d0f419353d04936992d9d02a23a2ae49e10d78ec481bb26731\", \"753535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a25163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360000000000000000000000000000000000000000000000000000000000000000c464465aab929372e8a3272aaa968cbe1bc1afb1960d855f2fe679d588a02434856b36bfd7f7855bb64dbf9aa668b0b855833757a9d963e8997fdb5f4e4240cb4447818055f223605d46ae0697f5dd051ef4973d44405ad46cb7216702b7ff39fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff31269ab2f4c1c53405a20186a186d3b8959a3926b34b7f6cc4c21ab859b1ef6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2ef7e082ae22ffb03fec01772b442b4b8d19cf06",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709100000000dc1650da8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49c000000002a8e0ff10207f94a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac4c010000\", \"prevouts\": [\"a0e70f000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"e1773d000000000022512015f6c01f4cbfbd03849fbcce8a636b49e5c18ed85b3712a10e7757f33687c2ef\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_5\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"510c1e0f8d8b217fd756cabc05215322aa202163430f2f8105d26396dee19e42d90269035be717393da60ef10270371fdf81a676ad2565380f0b3ac4743a35e5\", \"6d0445e6ed41c5c1da464b7f69f42c82e904b2019baf9b4c51e22d2598834b0281e418155c336f14c44c8f3e610bbe1694afd26681dcf4c5ed133bc33b9bdf33ec046859ff8bb26d477103dfc106611656ac4e7934ccb0ef45234d9ee840aade4ecf20774557cdbcb815f8fe171f1aa45cf7f3118ec3ba95860df8e3edc54b6e62af3c455379037a790ad462353c453dc44683bbf866ab7544fd983e306393e04dee9f47fded02dee1385ba9fb748aa071a845afba4227a84f1968a87152456f36acfa0f139e15a069702ee81086\", \"75005a0442c44132ba5a880442c441326e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b906ec0996a27a0975ca1985c3441f930e18c0e7161e7296b2172ba13341a453ed9bde459cc607f90434bb166d3ec7e209748081df0503bf0c893b2c05cc89025a4dc0c0ac06154f9e7687d9626a71c4113e7b04462405ea5030300b68649b1f0000000000000000000000000000000000000000000000000000000000000000059c97f71763205d37447d77b9481b0229f316e3ea169182bf6c4442799784c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff47cf94f4ef9a81243015778337beed47d770b1752496c8cb43e14c8f5618d03d2bc023c1a5426b30f2d3ff8ee18cc79337bfe63f8c21b48063f56145891f3fca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c375f9cc4863b77509f570dca37c6f1b0d5780650bc90808dfd966172f0aee314f5e7eb28e29b8f9711d97c5f67205dd5fe5bbccf6c4613c0584d22b427a8640aabee78f518d567a56310fd35e88b053b233b8d53d9a84463c19e404bb93219402edceef2e1cfabda82014c15520265730051f3e196742b5d6f980876f86c9e0ae5e6d1fd7a8aed8617495055bd2756aae86b051d9a7e64aac892410fec9828e7797c85ea40021e6370c6b1247ad96c868ecdfa3b3a09bd1641a75386973b59341bdebd50e1f93218ba374debfaa394f619fcf8ae3e41d68756f77be2b559bc94441bba5950973255a390573b21bbe00a5674bb0e3d894bcaefb4c3f152b2726163d788cc5b2733f8152907944d51204b8abdbe76babf05a395a66a40853220ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90c813b07f3f1e589da2b64465f5fb1c84207d13e616b780826015634f93fc1e419707835256302027c307839e60ddd33a9e3793eceb5c69ca5de22c3ec7bf1616277b9d794c4da0026826782b9260bc2c5379ad6ca693f2d617d559d14a26d6999f00734e9389dca8a9e0ac79833afd33dbd044f69b9b2f9756073ca40fc68adb4bde35283173c269b9673926dfd4351a41d94bedfe523aa26cf069308f577bb0c4f4abba38873964205ff1d891dc324d4591b57c4a9c340da8bc3d8c44bf70f0044922f9c552d236346e932fecdb9abc09fcca6459ee447e7305a9424a0b2ba5760cebbc9e519407c295cf85190c31a45326db562081ca53d2fae07679ee6b5eef6b6ff377c7de10ce1ba4352a612be67f4659b90e3742fedec162eb88f44d0e123e8578004adb49aa2263493fdbd7312ffdb6a7fbd1359c2f7d39be43ed28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000004d631c01803798834ea281dc818038ced54754a8b054812e7806a5fb63db7938ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff79b1fadf47789fa69b12fa81337fb4b9dd503dce04e753e29a3d7206030d04525f492a57ccc8ad78d7af544768e6566d73c807bdaada390521b09849d35ea4065b273116f990e14ba6fac0a194be232846a2032257ef8650eba772493728d326ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ac316cdba4b9d7b340a3e93390a9e51ec7177f56555b1d4dc81944c73c8ecce1ae75ef58286acd8a78947a6fafa96fc79935ac52bcd399d90cbecb897dc7b6f7042d8ac5bd990f5d2df14977d954252a3f4f4425ce1bc99b5d9265d4efbd9d0b8257ed0e3f30076c4b54ba89d76d013d6d5236b4d69415aa5e149fd07f4f00d73350118db15fd4ff62db868637c7de74e18c9aefd9ba6de3c725b3cc59f7697156f40401f7899f325f6dc9468a0d060e00633a197fb96df82f14008184a5d4588bdc717d62e02543ce2019c521db22f153f5b8841108263722c7519285dbbc4cd02a9c11907ffcb18eb5f628354a8c9af9826c0db1fd222186714cae1cc253b875c7b0575481d1a3e533be752b0daf9f6833f7692903e4fc2a5739b84cc02900000000000000000000000000000000000000000000000000000000000000000e01323f29c7b82c367139190b7256078a65437ac9c1e5b9be7c8757a8d44b35842149120a20b2140e28a58f57441ba66e856a33970815631a877f98eabd3eba62c8a64e994be5ad8cc3e9cf8b9d462624da81e70b2f4fd1530d4696cc35acaac703f40116c3b2be49cbe8ade195aa4cc6acceefdc8f2f440ff172be1cd11cb5af24b2ad4e0822adb5846ad68af15b9564ad0aa903f9c68df6b404fffd75b778c8c29a418bc316fd8ec552fed778cdb4e130d22016e0f635fc1e2574b4a968ecda5b3470ee859244ce0038d539bcf90d82d1b7197cea53d7cd98927fe6f8606ad13b28a1ccaaf76512e5c97384d28634a5b8e07fc6fc88fdc219c7c092086e85c00000000000000000000000000000000000000000000000000000000000000004bb364304e2c3099a14595ae3783d99484f261cdfe8ac1c9c9dd8b044bf5af1d52b7ec58a6a31e86ae468579508ef8fafa8494ffb501d58ff7ba5c1a78aca03dcbd9580c456a23201881183c7e6b1555cadf3970d6fff3c1cfc0b0595db6de43e2c17952118e3c3246fe40c3b1763b09f2edeb999caa3d3ece77a6d4f55a212ed5628b648990c536feec6bf6a8f73e0b15722078452bdd040303a20a2c811a70fe48df9f8a53f3566aea507ede96dfd2625a6ec6324867decb474a58b9c3ee75bef0b20a924b0cd13fbb6994ea19b989a9f39e3df3da9d8c872b89c3ae5d361dab4a16d574dc9db1845ed073394ce0cb48b070edfe6dbe86bbb4ddde28d5cc9fe4992cb7cc97f08d79e521194394e42f8abbeedb693f4f361c7db176a82f9afdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9657e34068c80a6680e7119262cf52ba3dc579df242c970b0bd27f0a8a0ffda44d0c46c25e493f8fce00c2f165dfdfd6cf7d0a4c376edb382cd9c314f462c2be026ab7db6da46baab1e5bb55f3fae0a9dd11ee926938172a8ff968bef78ffabd0d8e26e0f044d259b44f24cca1c65b6706f084accd8a9ebcc99640c4f7d08729ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ea263b7d84a27d6fed4a9d6fe8b2108bfec7a471bf77ab3aee6e1979a7d8feef8ef1e99aa602ab3d345c641a79704c3af9569ae0f70a112968822bcc00b328b296e20f25e5000731149e4732b9fa9925eabf3bebfa1d94ed859a8ab12380abb81d80235fe722b9bcc985edd64c98dcad858552092ba23674447e5001870af92c670689bc281bd20293ff9cc8b810cf4b9c20e94c1271e53591283558093c90bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5a376bb2b88ab92a85b954d3d7d3b304933692d788a3dafeb6c4ecc3c561e1f5cee81e4fdef3be738e703a40bfd998df6e9bc90f5e8940a45aedf471a2e40c34f6d6b80393fd2bdb9ac4ec136c87a91e993dd01d266f1d2bf55075e4786afd4eb57cbebb951f85cf2941f373516ba8a56866cfd4d747642622e6a41612781a81bfa9a3064581607042502d5c27f480e6d9b42e285c2f88a5b0977aab1964f19bbde0c206cb8ecb6ca3cb7bb40d78d37c0768b67bf8776de7d3afadca0b1f407a941185a32b56822e84ef9f50d906dc4ce70c6dd202ed2bfc6b1e5f4d0e932a442f2fbacb2a630fb5a9638cc3fe2d350f3675a96fbd38cef95881f33ca1655a188ac3ac1622a9e48c57a993a505d716d5cf4f1250ede35bd9116bbf6afb568baa557f3f4e91b0c33878ec28338679e25b262ce969651876ca1a2237735e408d47\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"510c1e0f8d8b217fd756cabc05215322aa202163430f2f8105d26396dee19e42d90269035be717393da60ef10270371fdf81a676ad2565380f0b3ac4743a35e5\", \"7a07b376cf5ef72cc8df6adb062da0eb0c3ab296cca12d495b3ebd443ce82bdd1f1a7a2a4b5fc72ec2bef62e1a636cb1b35f1b8de7d15eb7207cb6b4efbf4610f3f54b151d24d008cad4ee2b3fc2f61b4d20458bd4e08fa1f6c76f3a1e469dfbab887ae1aad4218e171619eedb4fef67a549828c5abfb1da5cb121d9704b12628867ed6578519321f2a883f87ea3440377f8fdfad4036e0c6af352612a29c42de115f6909791caa5e9d6388922a224777fc47ce672e8021a7656ca7d1bbb69a65d6108f794d91c633741e6bec9\", \"75005a0442c44132ba5a880442c441326e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b906ec0996a27a0975ca1985c3441f930e18c0e7161e7296b2172ba13341a453ed9bde459cc607f90434bb166d3ec7e209748081df0503bf0c893b2c05cc89025a4dc0c0ac06154f9e7687d9626a71c4113e7b04462405ea5030300b68649b1f0000000000000000000000000000000000000000000000000000000000000000059c97f71763205d37447d77b9481b0229f316e3ea169182bf6c4442799784c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff47cf94f4ef9a81243015778337beed47d770b1752496c8cb43e14c8f5618d03d2bc023c1a5426b30f2d3ff8ee18cc79337bfe63f8c21b48063f56145891f3fca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c375f9cc4863b77509f570dca37c6f1b0d5780650bc90808dfd966172f0aee314f5e7eb28e29b8f9711d97c5f67205dd5fe5bbccf6c4613c0584d22b427a8640aabee78f518d567a56310fd35e88b053b233b8d53d9a84463c19e404bb93219402edceef2e1cfabda82014c15520265730051f3e196742b5d6f980876f86c9e0ae5e6d1fd7a8aed8617495055bd2756aae86b051d9a7e64aac892410fec9828e7797c85ea40021e6370c6b1247ad96c868ecdfa3b3a09bd1641a75386973b59341bdebd50e1f93218ba374debfaa394f619fcf8ae3e41d68756f77be2b559bc94441bba5950973255a390573b21bbe00a5674bb0e3d894bcaefb4c3f152b2726163d788cc5b2733f8152907944d51204b8abdbe76babf05a395a66a40853220ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90c813b07f3f1e589da2b64465f5fb1c84207d13e616b780826015634f93fc1e419707835256302027c307839e60ddd33a9e3793eceb5c69ca5de22c3ec7bf1616277b9d794c4da0026826782b9260bc2c5379ad6ca693f2d617d559d14a26d6999f00734e9389dca8a9e0ac79833afd33dbd044f69b9b2f9756073ca40fc68adb4bde35283173c269b9673926dfd4351a41d94bedfe523aa26cf069308f577bb0c4f4abba38873964205ff1d891dc324d4591b57c4a9c340da8bc3d8c44bf70f0044922f9c552d236346e932fecdb9abc09fcca6459ee447e7305a9424a0b2ba5760cebbc9e519407c295cf85190c31a45326db562081ca53d2fae07679ee6b5eef6b6ff377c7de10ce1ba4352a612be67f4659b90e3742fedec162eb88f44d0e123e8578004adb49aa2263493fdbd7312ffdb6a7fbd1359c2f7d39be43ed28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000004d631c01803798834ea281dc818038ced54754a8b054812e7806a5fb63db7938ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff79b1fadf47789fa69b12fa81337fb4b9dd503dce04e753e29a3d7206030d04525f492a57ccc8ad78d7af544768e6566d73c807bdaada390521b09849d35ea4065b273116f990e14ba6fac0a194be232846a2032257ef8650eba772493728d326ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ac316cdba4b9d7b340a3e93390a9e51ec7177f56555b1d4dc81944c73c8ecce1ae75ef58286acd8a78947a6fafa96fc79935ac52bcd399d90cbecb897dc7b6f7042d8ac5bd990f5d2df14977d954252a3f4f4425ce1bc99b5d9265d4efbd9d0b8257ed0e3f30076c4b54ba89d76d013d6d5236b4d69415aa5e149fd07f4f00d73350118db15fd4ff62db868637c7de74e18c9aefd9ba6de3c725b3cc59f7697156f40401f7899f325f6dc9468a0d060e00633a197fb96df82f14008184a5d4588bdc717d62e02543ce2019c521db22f153f5b8841108263722c7519285dbbc4cd02a9c11907ffcb18eb5f628354a8c9af9826c0db1fd222186714cae1cc253b875c7b0575481d1a3e533be752b0daf9f6833f7692903e4fc2a5739b84cc02900000000000000000000000000000000000000000000000000000000000000000e01323f29c7b82c367139190b7256078a65437ac9c1e5b9be7c8757a8d44b35842149120a20b2140e28a58f57441ba66e856a33970815631a877f98eabd3eba62c8a64e994be5ad8cc3e9cf8b9d462624da81e70b2f4fd1530d4696cc35acaac703f40116c3b2be49cbe8ade195aa4cc6acceefdc8f2f440ff172be1cd11cb5af24b2ad4e0822adb5846ad68af15b9564ad0aa903f9c68df6b404fffd75b778c8c29a418bc316fd8ec552fed778cdb4e130d22016e0f635fc1e2574b4a968ecda5b3470ee859244ce0038d539bcf90d82d1b7197cea53d7cd98927fe6f8606ad13b28a1ccaaf76512e5c97384d28634a5b8e07fc6fc88fdc219c7c092086e85c00000000000000000000000000000000000000000000000000000000000000004bb364304e2c3099a14595ae3783d99484f261cdfe8ac1c9c9dd8b044bf5af1d52b7ec58a6a31e86ae468579508ef8fafa8494ffb501d58ff7ba5c1a78aca03dcbd9580c456a23201881183c7e6b1555cadf3970d6fff3c1cfc0b0595db6de43e2c17952118e3c3246fe40c3b1763b09f2edeb999caa3d3ece77a6d4f55a212ed5628b648990c536feec6bf6a8f73e0b15722078452bdd040303a20a2c811a70fe48df9f8a53f3566aea507ede96dfd2625a6ec6324867decb474a58b9c3ee75bef0b20a924b0cd13fbb6994ea19b989a9f39e3df3da9d8c872b89c3ae5d361dab4a16d574dc9db1845ed073394ce0cb48b070edfe6dbe86bbb4ddde28d5cc9fe4992cb7cc97f08d79e521194394e42f8abbeedb693f4f361c7db176a82f9afdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9657e34068c80a6680e7119262cf52ba3dc579df242c970b0bd27f0a8a0ffda44d0c46c25e493f8fce00c2f165dfdfd6cf7d0a4c376edb382cd9c314f462c2be026ab7db6da46baab1e5bb55f3fae0a9dd11ee926938172a8ff968bef78ffabd0d8e26e0f044d259b44f24cca1c65b6706f084accd8a9ebcc99640c4f7d08729ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ea263b7d84a27d6fed4a9d6fe8b2108bfec7a471bf77ab3aee6e1979a7d8feef8ef1e99aa602ab3d345c641a79704c3af9569ae0f70a112968822bcc00b328b296e20f25e5000731149e4732b9fa9925eabf3bebfa1d94ed859a8ab12380abb81d80235fe722b9bcc985edd64c98dcad858552092ba23674447e5001870af92c670689bc281bd20293ff9cc8b810cf4b9c20e94c1271e53591283558093c90bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5a376bb2b88ab92a85b954d3d7d3b304933692d788a3dafeb6c4ecc3c561e1f5cee81e4fdef3be738e703a40bfd998df6e9bc90f5e8940a45aedf471a2e40c34f6d6b80393fd2bdb9ac4ec136c87a91e993dd01d266f1d2bf55075e4786afd4eb57cbebb951f85cf2941f373516ba8a56866cfd4d747642622e6a41612781a81bfa9a3064581607042502d5c27f480e6d9b42e285c2f88a5b0977aab1964f19bbde0c206cb8ecb6ca3cb7bb40d78d37c0768b67bf8776de7d3afadca0b1f407a941185a32b56822e84ef9f50d906dc4ce70c6dd202ed2bfc6b1e5f4d0e932a442f2fbacb2a630fb5a9638cc3fe2d350f3675a96fbd38cef95881f33ca1655a188ac3ac1622a9e48c57a993a505d716d5cf4f1250ede35bd9116bbf6afb568baa557f3f4e91b0c33878ec28338679e25b262ce969651876ca1a2237735e408d47\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2f1b30aed18276568d11bfeb997aac3246d57017",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41102000000869367a3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cef010000005d951084021acb7a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2b040000\", \"prevouts\": [\"86fc330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8835490000000000225120f42b54ceee5422b98931ba4e4259b1fe0b973d9efeacc7f6f710ee118b027bcc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_5d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ef072dc73a2a7c85a106da40cf4350988ada5473f81d7603594996251a4416008427c03b27db4546a392e75922a74ff451367c038407efd2a1783038d4cb36db82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f2f50a5f3eb4ce4a02b45f364fd2b28078d73058b45b484461b8197429502f51979e7a9bcf9871a1ab468ce8e6583e66729b4b4414bb01229a845f3fbcab6a965d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2f63727a65eb7f7437ab5c39d3f16671518719e6",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b12020000006f9651d88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42401000000bdfd4f8d034fab5c00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487ae07c92f\", \"prevouts\": [\"8131230000000000225120f52aac6d1851a3bcc3e02eab41e79301b2d0925e53812529fe85f9ade1401e4d\", \"82de3b000000000017a914f7f3eae48087a4952a984cf9c1f2f12f8785754687\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2253202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"b076743f1b381298fdeedecca24325f7eaa6406b4cc4a9bfb03a0e98be4f2a0fc74c1ea328c89447c37cad026f943ca4e340bb957d3da66003882909baa9a2a3\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2f6a3e29b8be29ea5949fb1b5a71679b5cadc8d8",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2100000000d30a43ec0156331c0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75c010000\", \"prevouts\": [\"bc6f2600000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cf\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365e0e9a175fda05a064c52eebe8eea391232a608d343baa66a1ca563d1b6babca6a7a52674f359a7dbed67a49e09732132053a9cde77eaa564fdce3cafe7738b9f4a62e14d7fc4acbfb0196ec29a60565ac2b3043dda4cedec8cb1ff291b90d41\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ba852db044cc7b3c6c227af3aa09dc9e9bae5367030e3f2be29afb15f97933d48121d7901a27ea565e1cb6f91818c43a3dc8f46dc56db80c8bd3776430739107a653bf1dd2d82b0dcbd644d98f066b9fc3e48690fe18b2084515352f558033ba\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2f718ebe5d9460ba98f7815e59bfffe1cd1f3bc6",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4baa01000000f77c2d26bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0c010000004f4f1f22031457a20000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f870d020000\", \"prevouts\": [\"3c312800000000001600141cc39a492a6f67587324888ae674f2f534a7639e\", \"f4397c000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100feac6a621889f11528fe75f4f1ed3bddc4a3405cafd8e83304097686bb18065a02200f488a566cdf0c26008250132586eb44338afedd92e69b3bed54f457082215e783\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100b64aa1eab2e13c30e201a02745d52123ef5e8190d2fa4aab4cd2164cbbd39b3a02200e621b908bedf7c40b1d3b4dacfcf51a36685bcb35b59a13dd6babca9985bad083\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2f92c5daf5b1fc8c65563916bd77ad58dc8ffdab",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cea00000000937427d7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5000000000476245d802ecc273000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df9797223689870d97cc2d\", \"prevouts\": [\"dbfa5400000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"704f21000000000021601f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b70ef45802c64d612d4f6b57535e50f9dace6e6750abf4373a4664a19d391d8100d29199118100e3759d96e740f519cfa6949b6b04e1bcc8910c672cb0c9dae9\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2fc6756b64916b520df4a5d7eed9bc7c1ee85753",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d00100000061bcd71c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46200000000492c8d5abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfde0000000026f8a34302b303e60000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87ab000000\", \"prevouts\": [\"6f8234000000000021551f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"b983310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c2d5810000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"a37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365aa5ec3a6d8c57772d2eb4e1b20d5e63ae42b9b99b4ff5e41cdc072aa2de00e7fd3695492b964dfcc45d3a474d456ab4db8430bda5885b2eccf08499e11263dad2054b94cb6efba565738f5dbf6ee5a67458962b65d77e1cf5e0d2c1c00b2210\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e2798fbbca1809bcbebf31f88b6105e51fb6f911c134cbc99a44881a528cc9462f8f33b00019c5a92b78a4d0765b6724114f5676deb8014962e3b41b4c6baea3fd3695492b964dfcc45d3a474d456ab4db8430bda5885b2eccf08499e11263dad2054b94cb6efba565738f5dbf6ee5a67458962b65d77e1cf5e0d2c1c00b2210\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/2fe9ee314e024619b228c81cae27f4bd50141a36",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a400000000bf14df5cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0c000000002070b123bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd800000000fbff2f2002a8abd800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac05ebd32a\", \"prevouts\": [\"79d30e00000000002253202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"5ed7480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"853c8300000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100ca4097ba1ea29a4ee74a221595b6449bedb0d92abba7f8b35c74513cf44e1c2a02204f902eff652022536de3e104a7dc21c344778ad6467186ea9eefb567c7c7e89c79\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100fda831829ec294c3db692d9ced24cf52132b6b02cffd3ce55a28a4e4b80cf34802207626f16e69deb1ad1817bb0ff356ba239b98c4b2d09fc099556a48e95bceae8579\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/30060e7ffc388552b8bae73eb28705b637f7685a",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4f00000000aace61d9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4101000000718e46cd01acf570000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487e4000000\", \"prevouts\": [\"a9c1470000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\", \"1a5c710000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090201db07837861b034233f77b3111e4d0454df87e2a2ff67ed85311b71b4f71ea984ee7706783d1d8d901af96336562e8d9b681366f75181d5b5bf5c203b439bfb74691dcd2a3d862aef8ed868371cb201121c920928376a9c354e2164985dad9849282ad32fde8e834e8c0c85492fe0deb0e7f2169ec2f85c6d1bf5cdb80a4b58840f28885f5c76e6f722a85d7140cbdaa3e1bc80d8e92b5143fbce25d74f701388c01a3c150e337cec29f3a5da355215983936b2fdd1455c0a1386d6986d1d7d18d693b6e11da7b611b0ab4b29da5754091eb40f7ff0ee22228eea77a94b059e16e9b8bf1a8eed0acadc92f96e2e1dfe4e7d03b67dd0395550a02a74dfa2d0ad8ea3a1cce721cb512bc800cd4b3faae00ed5d644fc9a5f24194461db2726e8dbae3b8a4841b4b57177c0d020e8d80d5f7037a7e8131d829c473db5fd9661dd1b324f4586f385d8e5436a0eea158b3ec52b488b0ef6124eca6362a614ad4aabe08205e40023becb41201eabaf64a22a43f5852d49acab49037919da7cb246ad532bce07c2f5d9cb3db3fca631f5a47a1bb3deb6f20c979d8fd09d90fe1224b44cbfbef283968d9741dfee1e94abf7a91269f12153db64d4a52f9fc78f181ed31d472f3c4a5b066eb730503906bf339dd1b1a8ff8a0c9422d622ac14655cdd5e838696a3437b56aa1b4c7ecc259f8ed6b7bd7ffd6e7e1bda92f8d7a9bec94c12e25929a0f4e083687d3875\", \"4a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89a5f53a99550b57470dcc4d4233d312935e71f0fec8998bf9150bf0a5d1b49a4615c38a9f4b3c26d8dcb1a4c3fc9e68202e120a4fd7f06c3d33071ff6316723f12efaba1d06903f148d2465ca4e4c6639d336576fa6993c6ca48823372648a44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09020117eafd078d9fdeaf63cb3c5977ab805a9f300e7ccb7d9e91108c18403445bd9b2108817b65d5a42e26389c75ad57668db05f829fc02daf8ec0d29b43a1de7d5036efb52c810bfa4e4bdc426e4e6c588e21ede5fde6f02bbe46f4843ecc5e61278695182541d856245fa73740b4a9766cd7f1f4dd5a9f68de74961e162c9a7d22366abfeda5fefa1e12fcbb6df4d02d38ba18fe8f065e2c87c5ff8662d12fe973366a03ebffdc472935cbc4c3995b0ad24b4ebe994a165aa62051e01d9823ac27c5e9b15f8f84e42fb45cd8b410dac23725a24a1d098537f081f4b105505850f8a0682dde64bbb4f2929814a1a4dbaad8e421d073a6a993a28cf27ef01f9b6c4bc705f5202cb6903d70c49f41b920178a4860cd1f9ffa7c5795de2648d218ebaf2adf2bc9d61d3a9e50345521bbf48d4fd735498cb06b7aaf2f9ea8dd410187653cef74f53582679eeb953c5e4df4c8dd7327b9ea1a0227bcba1532c3ae35a31b86a93017ba63200e30bf7b1969ed2b1e23759ae8ae4661d748137e5ffd796b0f0121ff9d8e106f6d5329ae8596596a21bda2d0b2a231096c26bd9648dd2c4694f514ec13cbbc7a4577726ca5d281301185a94aab801ac722f1df73cc8d9153c1866114b94e31e919d23ab8c496700ad76587a92d0b4da562849b7a6e5eca4ea48fbebd061fec5f4745b27baa51a76187bf7863a0b7887b713c57ad51403b81881582a36727b6f85975\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93649ae925491555535d3452d6a0c9675b1c4c853a5ac96d8d917c8f686b1ab70deb1956d2c402f72d86d9128969f4c9ed8db93dfb826b4075483e7d557b0e234b512efaba1d06903f148d2465ca4e4c6639d336576fa6993c6ca48823372648a44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3012845a3aa7dc757cc4778e5334769c9239ab60",
    "content": "{\"tx\": \"50f7ec8e0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706701000000a45b1eefbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb501000000d4e342ea0211518b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7bfe0a757\", \"prevouts\": [\"10c212000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\", \"41977b0000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063ce68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1a6a38b8d39a057b5d03cc3fb1c5a8fc6fbbf2afa69d215fd7d0ba06cabd825c0959bd9b34bb85690c892593228383c48f2c7a3855b4947a3dd1708d13c567655d4436d921361743dde8d98d3cfa724f09037452104a82644e108bdf9bf6fbb39\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368cdeb0de8daf44e986d19e114a7b8ed70d46e74ed21bd6c6e785c2a6747f82dd5067193501824fc7e1f7f904c1e32fba78339d7701e72316b16feebc15a414abab692e734634bfaf43d653c1e6f6d8e8d14797d8e4fda7a04cf5eec270202b46d11737bfd86c40bc108767f37b7ad1553e96cd0852cc5d3aae7d4d5919ea2951\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3015e994a3e16567397bea00a92ff97eb53971e6",
    "content": "{\"tx\": \"dac681e501dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c250100000096d7d29903b4354e000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4766ee20\", \"prevouts\": [\"555d500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_6b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"60e41b643c1c904eb42c536554f629a5a90730108f3c3f64603aa691fe7e5970c00935965378e91a47e2c720dc2d3595da65f1f42a9a0462503c0ff9dcdb25d702\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"49a0de936e7821d3f58fe5e59c6ce0da34ed62280bcddafe5a9927c420bebd82d83dcb74aec03bac7391e2554da15a352cc0c2cf9ee6d51d1cb07c41844493d36b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3031aef9ccb0cb566246e72e7f976a7cf00b9898",
    "content": "{\"tx\": \"dfd2e9c702dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3201000000e75193c860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c6000000003e731e9f04828f2e00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7eae9964a\", \"prevouts\": [\"f48f21000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"b6d40f0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"5e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369bc10050415f3a7eb0f871e59844dac39a9eb46351c529a41184ff4a5bf872c5d7bec169038f6fbc2f311373c62d75738dee89ed934d1dccaea4579b1c053aa90a9249c0485c0b349be2068ea39eda6d50f7b6c474a6d5eb714296c91a9f24b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369fb909a8cefef27cda8d32206876bbd59a602541b1ac02e9aca8fefecae353d965cca6be1d3cc9714f9205dc72257def63c8e50f66dbe399f94c25bd2c6a85f30c8cbc16505271ed8ce1a03d67d2c4a35529bcf4a25ace24696315022c27c9cf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/305b7d52e8b2e5b62f366d1fe9aca1b4c31a2e51",
    "content": "{\"tx\": \"b4abf2a802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4baf00000000b44aa8a6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7a00000000201254d604ccd0a80000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a64c020000\", \"prevouts\": [\"87bb2600000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\", \"998a840000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090205b8b6acf2a1736dbbaad48ee9d1f6f76f614fe334d2d4879607993100e97cebf90f59892e8df71e7d72827181b3718731fe8058f38f7664fabc855eb51aba6033d063f287d5e4c5795ac8bec57a4beecca7a88847dc99b5c7eaefa8d86be802e14836dd6187494d9d13a61270da2c2383c6a220b70dcce96f0b1ba7459e000fdbba556000c7959d9e25920717d1c39ac30a566db08dcf50a07bc4de8e0524f1a2a6b70fd03e10cb93afd59ee586f5e6efaf5337ba0ca58312824fd43a122ba9070fe087d868f453c6eb0a7ed7c4e5577fdef88af88fa979e473b449d92ae10268368688e754135412dc955f350514dfac3bcdc1126aa2363d8cae0e47f64bee1fa0712f8690d4728c733c85f5ecab2cf9a24eaa28c419cbc1765f948b59e92e7ab0bef423c49e113c534f8da1fb40544142f0ec513a15df5eed3378adfd6d490daecde5a624de508575880aea484ef4b5d8285a1f7ae764d201a4774acb96b96725e9859bfc095d89bafaab1189529362c2d7dd8059773d475f3e716733522911c7cb1f2fdb0cebbeb3d092b1aace46c3f0e98c4477faa239288141db3403ee4773583f0b87f64fc948345ff73c7a471ef5875bf5fe56f172d8c24beb3e29fd0d141256023bcf7cfa2e9ec870b56018ba2f8abf16c603c42491aa870dc2b7ffc3b58af172b7a9ae7e9d822dc05e310b666926b4b35ea7e2fc5d5fae2323fdf10ff759e5beaef0cade75\", \"487d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8fbef2b09bb3fcc5f7a097fe825ffcbc345a4a7607f02adcd9241733378f6a21f7da89940c9c2be3d3cb1ea9fc374137a74dc3bafe909c68993f298761996d666\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e08d56acc221f3c5abd5a672ced6a3b82aca76c67152e71330aa040b6999e65de00b8354a22a07efc36182e2584ce94cad2b7ccae8baf249ae1513e5462eca0736e74e77a052e819f3d5af896d9d50a1fd44ed94bd223b9049c0226b80887cd71331be18a236d77a14e55e5a98ac2467dd4f7f7b7ed938b47193b21fad48c479dd40447a3d304afa0e5c628a2e1b7823a0b4ff442c663583edeb1936652db22a04b18e29ee5bc2cc55f47485a530a7c0a6588c4d0e6ef380f39832a7c1a8525b322784ccf11452ae91acc5d2ac27c4ac6e308a1b31139cc3cf64546aeb61b6fcb1e4b3907d0fef12dc7370f33523ea4392a3731b5861d8efbbd7b4015d3fbd06bb5ee79df526d0c0e9de9dc93183fc6f7971abe2005ecbe6c69e3640920c6a7f56921335ebd25f8bed69d285611b4c818ef3ff48645dbbe1206040e556ec60813a4bca11431e39e00cd6df4a9db07bbd5d949aa4cacbdbf4f8aa5b87a5674882efa72c5c7275c488425b9223900fecf5898853c227fa7842fa929c9190bcf71a4da602eef272702ff34ab9ba2b11d48c2f31241718f2a55a8ca4cb3b862f3019d0972d31c4b501ba29bffb7de4fa5674ba56abad00192d6371d727c1396a5a352a87f4facc462f7ef79705e2c97aceb3f2c04726793897d4a531de7cc40b8545ed67bb1e63a4cb79da4a5f24a891a3afdcb4d508d4907d795210c6f881cf463c00f10e2ea87aed248275\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365c9fca99784b9d41e6f6eaa8a610ad45ac066af872a8b7bf7b421736c80a55bc4d178bbecd44a62a975bb89c44ce69c4bec935ce63261f4a792ecb896593fa3c40210bd7db211b82a407c19f9567cde5a01f8f2a3c3dc032c7ac21169de78447\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/30733f314d77a04fcfb55b009f72a5a1a94cc1e5",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c63000000002fad8be6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9201000000a4949ed304f066a70000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcffb82f2d\", \"prevouts\": [\"8fae510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5ed3570000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_63\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"37a9f9ce33791d68a4f828b52443efbb4a63f8857a585ab57799e1527fdcd431fe22aa36e7b3e099442517ae27200a83146a9ac43d41e3ec1ae4504404a3e1bc82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3a76cf09e0dd45dab9531549c859b67bd303eff4b7dd8f85ccf423d229bc1fa7efa2893ff8279b61d97e4e52182b1514d693e262cb63d90faa6e0aa2ae0266bf63\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/312a2eaf5a3bbccf69b97e292f665b53846038f5",
    "content": "{\"tx\": \"f558c58603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b980000000056c18ef4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2401000000aee696e48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42a01000000869aac980117bc3d00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acdb518220\", \"prevouts\": [\"e140210000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"49c88100000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\", \"8e2839000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09029e9fbc43986dfc06ccc27dfc5fea2ca7339b8830f043004f6b89771c0e3fb83d714645fe4d0076702e2b41f08e672c2bf2d40ffe582975e9ed403094effb4aa62e9f4d8cfdf881ec3f2f25df5231caae77cc45f9aabf37281f5c758d8a79245c576453ea78b3a33116a93e1ebc767d0eaa013836d990a609315eacbf6fbe2738aa274af49863273ab305af6a7caf0d58ff24f5074cdc9a0e68dca18706e888c9a10cee3c859bf6767e782eded343112fdb0e4dc6bfe618197a7f0f8bb5658a33abfa6e130432ae67a77cf91f67c9e22538ff726837d818c202fdf8f2fa7cd17e6b80a5595595aac6ca3dda8875128b259deb1f22831f2238091755bbc3246622e6c4d18312e6aae1efd43e1b26f5659f8f174278ea5ce142043fd9b96003e97784a75891a525a4727ef854d59e6cbc00f2d624b7bdc544562f0e42ebc21ebe19725cedbf9e5034cf63fcebd1297e848c7a225695595fe4234961c5936bb65075e7d5a0db3b9337f6d2992ae5b9edc06420d7ca69f68ee7f424745e3a5b95b00ed46c572a9bf0769ed97aa7ec98af2e16bda3e766755dc257a1af915dfcc21402e376d4ecd669c9410f38835a6a3db4ee71aa883deac397bff34c1d09eec4fc1521ed20cf7f7edcdda358d8af15dde8b084ea6ca3f00dfa98f0528549046df091c79d408718a3ccff84d82ca47adfc3a370307c81fde6241ae6a3b314d4cf2c1d9c74d603426c2154a875\", \"b67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694c0b340583cf13ebe9076e32fe1c03226eaf53cf87bb1d5bdb546787d6812ebca37f8027c2c0b0d436eabba5be8b19fe8a47d5b17abeebfa31c0139f25f704791244d1d955381053a5c36db6928ef13bb9242569ee84b58d7018329936aac78\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09025bf364e9f43484dd5a74e4ee67d8772984549b328dfd37f43cc117b8aa5e8a8a26e43d8b717e7f8ab5985e199c23f11fa41a2ee586133c16a39708d7d863a58a8df54313fc601dff1ef9f32acb35bcec5ba7868cf873e2a9bba9bc970ba3eb4bb571935990924e4040da54c51ea142be5722214f596bd1b51b98d586af75d0dec46d22bbb19272c5fd2f11204d8204a46690eb76019def8b28f08930e6fc6bce5d28af6a74b9492283f3f7958dc5facdd9fd227106ca3dc5cbbdb10083d2fe279815fa066c71498c9d67f4b83ad5069fe1fa818d7a6efd08ea872a95f99a445df7bcb582f0ae58cecc03ff3ebb0e02af229913603b3a451fd7223607fa7bd1fbc52fb75deb9272e474fa8a65d793f9001dfef5e5f0a889051cd357c2d3a1e99f33a4bad065ec3f64fe394d184d816d7c29d9474c78dd47850bcd6327d11acebcb610b2f0d40ffda2b796b6f7fead3070a46680b682e5f7dd03b6dd877a780a30f6be66a379e9e2c233f69d7db4ae3882de3299e2348e4ffb1fe2d88d36d056c096ab5ae85dcbc6651ed3aecd739e0fef5f321592fdabe1c3382da805036909a27f0d721c579bc2bfeefb4e8ea75179be1ef630202972fa11bef077b0712c013d6759354c062748cd35b559cd427759f93d5314c186c0c6a38a112c1b10b53503d4be85272eda3884d96284208d7e96db5f9e1e32470435db03ea42ca031eb545cab114bc871e38092075\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eb561c4b1d6688f5bfb11d0986684152459867eeebbedce173d7984e1f333e22781c07d8975c94d77b7f566737b45f640ec74b2b98cad100fb0cff19b6594ed691244d1d955381053a5c36db6928ef13bb9242569ee84b58d7018329936aac78\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3177278ccbc91f49567f80c0b575882edaf4556b",
    "content": "{\"tx\": \"5e99ba8803bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7500000000df8a91a8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3f000000005c7bc9e9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0d02000000a28c08c40314b9e600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75c6ed459\", \"prevouts\": [\"48417900000000002258202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"685e2300000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"f0a04c0000000000235c212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"18d74be7b73f4c5ca81e26253f5de705a40a19125516b355c897d2050126cfa62a6728c742eeb80723bd09ddfcc22739bb29d0052bbf4cfd8e4118fed4398e29\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/31a7241822ef819833b51d86a78d83bbb4d58136",
    "content": "{\"tx\": \"0f23d10e02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0602000000ff1278f3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2d010000005422bc8b0191e85c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4878f7b482f\", \"prevouts\": [\"ab6a490000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"388f1e000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"a77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936efbd2f9b1cd4fbec58efe0420f12191abaa855d6729399166c4c2475d9d665e59619a83ee22e28c5507e71eab09869c4e19cd00c1b769e62c37a8de310ec2a6696773453f0744a158be0509abdec64f05b1db7ccf03251d8359952271b442a24\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93625bfac2bef47395f58f992c21945b8909d7652ef3a3903d04cb677a2ce7470d8389e677eaf5eeea89a70f01c0aa3bc14cf3320f4b6dd8cc61f33138af3398b5b11a008161139ac7a92b00665158d25501a881aeebdfdbf881ee45b85e0726c11\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/31b4933ee39bc4133c6a36b1e309775c87a96c23",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707800000000d472c2ff8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47e00000000b22608f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbb000000007c5fb0ca0254669200000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8e01af3b\", \"prevouts\": [\"ab600e0000000000225120a2c28b736583e5896e4a53bfde129100bff930ada42454ee2f7bef5a60a371d8\", \"deef37000000000017a914c7d65cb5025eac8b5bf295baac9287994ab34b9b87\", \"28374e00000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"225b202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"c16d2e3e06340d2f877b0eab8731a0be75cd78a304909212b58f76d0de579180d29fc64d6e108c74bbbb3f670903bc091152728424957cc505fd618c0e673814\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/31bf684d25c7125e85ce524a607eb2a52cb7bdca",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c9010000000264f714bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf53000000001434957104c9c89e00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79635000000\", \"prevouts\": [\"8db2310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"3ae16f000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"027d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936420b598f8858794c178995f11a8e34655a29ef30c99d23407a26d0a64bc31f191a39935f0afddba064f6b0bc8589127966a984604296ac06f9873b8ee7d7aea369828280661f54bb25ef200c9d39138c753346ae1cc558703fbc48b26980763768cf2d3d0be95621d7446294d89d9a2894510d2dfb4e1a33e7316a17e39cfc99\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936228879bafec8e1069b4e024c9320127e455344299f19b4d97495a4e33db3a44844c267ebca37631eb8e8b6e08a101702978fd7f172e21a8d6d6b527626f4402168cf2d3d0be95621d7446294d89d9a2894510d2dfb4e1a33e7316a17e39cfc99\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/31c15818563bf9247178dcf6aa28b033af2bb447",
    "content": "{\"tx\": \"0d8311b402bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd701000000fe04979960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700a00000000da955a9d01905b3a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a636020000\", \"prevouts\": [\"df00720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"73d312000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"3b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89a1daf2fbdc5eba8a219f1f8635fe45cf0e30925345452464a53096773d109ba7ef84fce916674b46359d0327d7b56c183d26d6053da1b16053a1f90da8a1d4e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369517bd2ec6e222f593b12487f5a7b1eaee696b6e0fbcce419bd0b390383a361246c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fafc7fa9328de6285e10958c6b3d6f5d3c073b4c582e31cb42904dcf82d4bed78a29f15cefa9911251712bcf83078e1db490f7db40c14a26e0e577f39f7cfaf11f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/31c6f3973f706c7761a06718934fbee33a007e9d",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1502000000692e59dbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdf00000000d423c2f302fde5ca0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac6ee00e50\", \"prevouts\": [\"0990850000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"90e7470000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_45\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b34ea06aceecce83e03cb040193d99209bd9d53d028494754984fdbad06f23e930f5e7dc05fa644db9d6062a4abed83386d095739cb342c46619ef7019bab09a03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fb3fc49762e161cba1c9a95533e76d002d6bfea2c76f997b653f0c2f111f78d3859425789d2f093914bf43aac3d34f3cfbd3161d2895dad5f509ade10153007445\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/31c88595514658ef1b8ff73277244b8f007c505d",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f601000000901c05e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9900000000916fb3af02ceaf58000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a622010000\", \"prevouts\": [\"07680e00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"90344d0000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/invalid_csa_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466dd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f1ee54e6c0c32e3731dab52392c8fe3fb26537d5c72a5a909de0f1aaa6def308dd5ee83fd14aded0294cda3bad5f00bca2aea2f5acf38cf8cc73db14726666bb\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466dd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/31d4c861644fc9edae1f7e2e4f31aa06c7517889",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2e000000004f19aad78bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a9000000008152fdb1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8b01000000bc4390e0033a13a400000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d3c8e225\", \"prevouts\": [\"20dc4d0000000000225120ec87a05d11c16a148e05f58a688dc5bed4b2941085b66901aaa75337acfb52a4\", \"f0dc3300000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"0f0a25000000000022512063eb770f298cfb14c87c6cff1e0541dd7cbc30bdbab4472c0f37d52bd55ad696\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f54c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082bdcbe75f074483e48d717af2cfa8ab1bbef1c35fc84f016c108dd10256d535ae10b3b87e8b9d8544644738d4851bae032b2bf37d3a4aa6541b936ff18c715610c711f738010c3c65afa09c620b919c88f85303c8a6c3749257da2d218fa6976b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec34041dd00c04bb207a9f54805a750c9f5dad18a896c6f9e3a7e4fce73f8863b3a94e361b142bccbbefeea6ac26126d4f4fbb610699e3a27d96f99d1b67de22f2f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/31f076334b0a05c6d42d3ee64880af4288a1a071",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf60010000006c56fddcdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf700000000cc52dde28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41200000000d0282f1d047d49ca00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d8000000\", \"prevouts\": [\"a7a86f000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\", \"7af02500000000002251204bd530dd92500289ca536d9e0216beec7b39c81554ac6dd1e9e4cc3828e76161\", \"2e6e3600000000002251200fe4658e0dbf66b6be10f530376fb0e6dfa185e9d7f38ef5d5af1eba17e45594\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902be1fdb15007c7b079b1fcba37239218d2a0c30bac088eb1bc95a350527d03c30e825e686599f11585d24459989a12b2deb3942948cb4b8f9cda5b0a791d3ed03b4bdfcfd361b094f8caec2142892666ce4b2b488cc016d1fe8c1a607d1af467bafe0dcd94063da1e485b4ce943fa3daab9ffa7ed4765ea8840071d5bd38fca49594ad9b532a51ab448ebb3f19688136f5a74b9eb5f59e2ea931d4a0583f350c50c626903e11087bb74f76859a15cf934c6c46f1fd04a5269bbac98bc751549c470b8f72621925e01ef3f3220b2e7a1a2480279f7b56ab2e0cce2ec534b20cad50ddd20ac47f4b91a5f727622c3ca4d4406214b0c4239f05a9d851a31b5d80e0a8f37b083c19c9ca9f83eee836ccb8592d08ba17d6c822d29e760506b91e769bd74ae989ff28aee9723e60e2c6e9ce1f7ff8654293fc51d7412b103a9ca611de8473caae5a362a95d2047752a598d6b45a3c9717a5693a49d8d752c993a6f755428cc77636e306b2553db19379595174e12ea6c936c8016b3861ba6fd4ea933239b733720e249a6053a9ea4d6852e5561729da7538d4a937673716f95fc2be78e5874aff68e9afba308f6423c5aae7c8e2b45661e26fa14d36cf918ef1379c2cb61d329ce1adc9f94562b71c56bc461eb732e5ebcf8083caed20fd7c73d699480b430c173415f692464e7a1c6a8468a89f7d6313dfa82a6a35ac98892a86aff146044328cec2c15097175\", \"657d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e874d92406f86dee9f8c04bb958856db6cfc0bb7ea92d17397457214a16beb1de2302781454c6297f6b8a579760f4d591c0acf84ff9d038b064bbab8a5d53835db\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090226f850f7916ae805cfd01da3d88ba7199d161feb700e32a1e50021c6003ca27dc720ec4b6f7479434a54f67001de9d4fe624d2cc701234506a3aeab9ffc936897e4b0276a74a482fcadd75f8b0ba5a6115f4acb1d5803b741035c7916e7587c77409522bd0d4987b273d05f6e3d08d281f0c7909b73087769b28231eaa345b901a6b7b43c0547f07df9e089ff1f953ed0bce399c502ec492ffbb6e0a358e549783d8a46223fd1d70dc57bfadae07294e70978d5e5a4aadc6e5859f115f49a5cb21c5b5836748c1a4d5082bc5775f51701daa63a0f8e1753bbc1dd4a97c53cc1a286488205dbb620869a256f9b961ee0a21fb38a71816805d48ec695126afdcd2239296bff27447a2eede5770873acbccb8cc6fbf51dde9b65691a5052f518f84188382e676c04bfa05ff578a9de1191b8405d2597acfad0d5b4479707a936431265c14211a1ba593034235eb24c82b840b4fe131f19fae3ce3fc4d40183db076c935c1486a850bc64994ea20edaa605f56222165541624237602f667f9d254ae7daa69cbae4cdb10a5dec08d4c9cb72166d8e7770d5691ceb6e42ba4f83d9c07d09c271681af9956814c23cdd3ee14b1e4bdc835a6975f65e98041c920a61c1e0209e0d0a57847f2d2414b4c1785037dc9afee306dfb2f63a72f42dc21aa940bb43c09090ce6bf6f144876b9070d5c81d66876524c1052ad44ce1aaa29a5dd8b282a56607cabea3dbc75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e38fd10ac28b4a0ae18793cce60e7e7ebbedf1e3488ce0551c956bc9cf517ba032bc2c7d802e8c870cc0fefcfae9d23d316cca1682651be3bf62b663d5ddaa443\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/31f2c4c02978ae42e16425ad8313162bbbba6fc1",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1b020000001b786e618bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ea01000000fb510c0860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700f020000007a80c8d8019ead11000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d2de3b4b\", \"prevouts\": [\"ab2348000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"bb733b0000000000225120c52c9d5db69f3d85ee35b65e5555252fc0470ab9a3dcbb72267f75438b29b283\", \"885a110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_18\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3bb82bc9855bff63b0806c30243ab6fe6426048089fa359853a43727833a71eb8712e3f23c61d5782e5762c682b7d2d1b04e38eea97d8a5f947b34b3833f7d9e01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d03348852a55ecc7dc459389116e8735107f690dbaf8c2ea77bb4f79999764cc561318fa63ba00c1fe8c4e700c4aabed736d29a2f98fbbcb5ef197bb2bca048b18\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/322e55f03866ad2580881660af953e8169abf66a",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cca01000000beed76a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfa01000000006e98b98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b701000000b215db96035f51d900000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7f08c9e1f\", \"prevouts\": [\"f6c5510000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"2aaa4900000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"ab2940000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"84ca13405546924e6c9fb74dca48f76bd877f7208e82a83f2d23f23e1ae0d8b1c15b7c59a5c02eaf1fb15469bcab66cbba1ccb96702af7e47dc9b055183e59f202\", \"50066a082476af20f64504b01d23ca398afc25473f9061260e2559285294e81f4623d810a196f11f5a4ac85f7bb0c40855b443fd323fbfafc83ff838a6e618ad2316f92962a697139191dfedb3f1f475a75b58bf545bd9ad6c2e183ad7f5b35c0d8aeb66806582f8a9375c2d46327142d816ff6faa4621eb8fddd96c19d2eb4d3adfc7c20e5106beb9bf106a8461e04bda524b17bc460c606628137fcfb4dc50a1acdde2219f744447b0096d70cce90d25c417b2888425252a0697421bb4c0af15121e2aac2eb597937a0c9cd3b00e6d527c17d31b8b045b77707b19cfc280e289\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d8c1fb3ee3067ac98df69fb8275cee5c1944a25abfcd509b44b5e0a9e35f47b1deccb1990859aefcabaeac82a3444d0059e71df69fc0a777100ce79221bb83e002\", \"503fd27fbd47b778410f167be796854ac258f606f5dd6bf4056e43ee08d466c389f40d33521f277645062a807748d8f42e7d064a6e61c9ec028ac755c835f719449be2febf6c70fc4534350b6eed3cdd399d05d7b9fbda5a6a153a20c2d799851c3e25287efec944a976d46b44a2d904422fe38304cf0d800d4c116f194c8c0507373ebd7eab9149c97d0120480b170fe80abaf915f541bbc584bffb5e25187874a9952ebb646df548a0c5dc7ce5a0ef2aa6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/32465695f8a85d30402f9b194bdf25dd6e21729d",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48f01000000072c8a9abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4e0100000043944632025c9eb500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac1c4cd623\", \"prevouts\": [\"881937000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"7fda8000000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"797d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368e9ed2886e7908e27181476c22eef50b42616dd4d44ef70273b9f072453f43980793fbcba16d5416bd6f0933503ffe6704f239223875a49be11ed5869ee331b55be39dc57762be2d9b1a04aa5b570805d23104bfe4fa54c392bda5d51f7f4540\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa0b1051acd7c1b2d32995b3df0c6921af5f8ed3327e7e16cb8a5e0bd007230af127aec9530f4cf05d3554e63105b96634da39f3c52c35c251ce860693e97320b3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3296dbebd697c68468c1215ff252b1da046d3d4c",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4e000000008f41f4e3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b450000000076427492dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cff00000000c272c0da025f6a97000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acbf96ea1e\", \"prevouts\": [\"4be92800000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\", \"7fc7250000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"79b64a00000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb43f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082d4e60e987dc96ee5dbea4bc309cd424f3f3a0504752ed5a5936e8ec363297933734b3a7050eee065844830ad8d45a710891f78004f5e7f35b8fd72bf3ee94449\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93641544759b35923e828b4a61445a8ec3755fffb3583722c19659f8e8298b40b1ac80cdf889f2095af4d324c92b00d2a9db5fcc0724b0f6f8ee9ebbd204938760cb2a240b376911c9876b3695f79f395ec3f2d97b1695e5c0e7f397f1ed982e79a1b6e729898dfeeff93e2067a7d076aa1bb7914d367b163cafe54fabf88cb14d8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/32aba46093e0c1405d3a8229f68cefd6de6d9767",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b07020000007adfb0878bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41d01000000b3b8bc9e0240305d00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f874d000000\", \"prevouts\": [\"43942700000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"1845380000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_cs\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a57f02d016c39779e9ce1f4f3c48385533efe663709d72051b46f19328fc7ccce9f41e98fb5d98c2eada9a462c855f527a2d7e06a95441495a4b4cbf57f45d17\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b7922a9ef31868fd0bdd2720bc44a83a05911c979e226e14df12e43105fabe25154b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a57f02d016c39779e9ce1f4f3c48385533efe663709d72051b46f19328fc7ccce9f41e98fb5d98c2eada9a462c855f527a2d7e06a95441495a4b4cbf57f45d\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b7922a9ef31868fd0bdd2720bc44a83a05911c979e226e14df12e43105fabe25154b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/32abfd2efb454436ddc75cd07a406d88aabceb2a",
    "content": "{\"tx\": \"398e50c902bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8e000000003f6e1e85dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2f010000002f7459e501c7546300000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac9689c95b\", \"prevouts\": [\"219d790000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\", \"768d250000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"8d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363a782270f3344e4a0806c19029d04ad520705ab352d941cef93688ee397cbe2ba37683ca92a47492765ed69e840601310475c5f70013240e7a67747a5da918187472d664747fea006dedee35c74318028ad9a0ae37c154fe8226ccc2af402983\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361387569eff5c8fdfbb47201101452628117e65be58c01e3fcd7a4762d833e9a33f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0829640e65f27972e690b56e28a8f49ec76fed3450565b59143bd547c42619e148d8047789ecbd47ea83af97bdb87f8422a4707031714ddb05eaa38b24e158a7c35\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/32ba176293211377a9ca30f7b1742a3102758b7a",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709400000000b5af37dfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdd010000009d67e5be0212197900000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac7c000000\", \"prevouts\": [\"48250f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6c8d6c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_c9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"130caf75742f8ae965a7d7e33c499d6bc2c28d159e9a4caaf044f94090728b88dbe0ed3d8cf70c6dac63890dd2fb23b6609ab4e55cb3e5ccf9dc54088421c40283\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a6ba0a6bca5ae864aac839be28c034df4c7ee67b75988f87ac47ec326a0a1a0980f34b312b04fd328f4d5ecc453ba46a5380409a1c72dc3195b3af264aa6276c9\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/32bcf37b6b3d15680600c81db467e1dfff6ce375",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4baa00000000d7f864f704dddc25000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1302564d\", \"prevouts\": [\"b5bc270000000000225120d61496029c5d349efd8924002b7ff235d477ef1351b040da94f6febcd1852b9b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f33cb046b8eba7745a43a31b99cce8060d29a3cf40684a8ccadf7d90acba647f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a05616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/333dafc1d96971e2ccab51c8ee0d9e479decf78b",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1102000000ac4cac65dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b710100000030a16be304f0b149000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374871ce85d41\", \"prevouts\": [\"40ac2300000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb\", \"0f2a280000000000225d202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e7e1aae90aceb2e99a7b56eacd7f6d43c8002a6ca89f9e3208f45316cc2cb09dfd5df45bcde2574b895b928b7d66d079e6641938e46fd0b8a63fb5163ce25e4c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/334e3a237339fce576119749a9aa81f3d65211cd",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1a010000006c9b93db8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d601000000fcf1a38ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b33010000009c6a06b504e4ebae00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df979722368987182a0b5d\", \"prevouts\": [\"29c3530000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\", \"0ffb35000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"bcdb2600000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"a17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93654d5e9f128d5d45e2b514bc7d0582e1e8810c31523e6a7d498e7ed4fcc964510a4fb15e70bbc27f4f9ee6ce894c5f8660c4bc0a21501abf5c583e18e279746b733479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4ae668dba12609f1dce2a1e29faaa62ff248d54f408b31ef31944f67a579d4fbb4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93692ed1d8a723f26614ad38a5a6bbff83804b2df3c5c12fea7853938e6cfd441ba04a5fb755beb1eb88fd06fac279ccb2aada241654186a69e6e0c04e3255c18f895176026b3e005afce4c10b5e59a002659822bde369bd64201565ae4c88fc95c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3352986afb9bc33fc67eaf72f47be64e3c6ccba3",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270910100000002ee48babcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6301000000681f3bd404a77680000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac689bb04d\", \"prevouts\": [\"d5e912000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\", \"11686f0000000000225120571bc713e1a1d58bc4a7da330f9b17653bffa646093e5f5e3088fb48bff87491\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"be4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a4c9baaf460c9b08d8af0a53251cd8db921d22667fbf74eb915957e4e9d1c209d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51f60e2d3154f769650886384bb096233f0069490aec77c98efe910f3ad816f81d7a9dfad218b10cddcf05e9e788f58784bb5d8eb58cc0f6cfe4d23ba63d85e381\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52be\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e118b1142f6c6f685b07aa6aec8ab7e3e6024758bf09974a9b2a7615fb4927a0f7d3726db1c97dedfc82502578948b1d779eb886e6296c36bf50b8d2fe25c32b8a344cebdb8ecd56ef01fad0911d9d88482970ec36d3a04b84eda7f5b5c68ec938\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/335b7a860725ca4f2c467a8b034060d0ce6b3bb4",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cad010000006f1f83aa60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702302000000807b5d64015f1d3700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1d010000\", \"prevouts\": [\"3a024d0000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"f1401400000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"964c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900456bbb2d2aacfa419948546f2c8aa96b4ab4a80289c3c8034e795f45f733cf7ae0b35fa22f4b25dbc3a6b67e691e1ba7f45df255baed4abd058cf23fbf36a7f21681a75fe046050f41c6fcdb9e38a8e16ceb2d96bb057130f662fa5c2664fdaf5d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1ba1d7044f76185c852e3494a6fce96de1fdde778c7130ed924b07f57193456c18c78e356042728a8dc5293f4719d9544479381d7bc53161d8023b722566e5250874a9774daa89f30be275a1ff5113653dfa1548b9628ff9725cf694401ebdfe4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/33848da9a02cc62be9f5a84c5ce6e33bb6aa8a29",
    "content": "{\"tx\": \"c37ec3c302dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbf01000000556bab88bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc10100000073720da201fb286d00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acdac25b29\", \"prevouts\": [\"55e22000000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\", \"e2aa6a00000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"fd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa4304fc86dd976b0937fa56c41f386d806abfef37789b2eae5a350cc5f24e0b07f4148296d57de26c46202ca6ca2132af69ac5e2240f6410455c1127b810a8937\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c1b9bacdca57d9824556224747bb261aea2ae7ed0ce11a73241cde6387669db02c6cefb1e181eefac563b15a866f5ecfc3c81e54821b9e81f79abce745f7d95962d72dd1cd8804fbc0be1dcf6a22214dbfb5210e6cde6f2a41edfb954edd50fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/33aa1588445e9cbbedd1d4a629780bcc8b4a8e9d",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d70000000095241478dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7c0000000022e144c003cb9d2d0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7c0000000\", \"prevouts\": [\"839b0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b091210000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"2c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a969cf06ec193d0358c31c8afad5bbcd547aa0657673b5bb10a44e38c372c44cda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ef5981cd58c469d4842aa56f101a76a4447dba55ab7a128197943d7701f95f2823b7ec1fb3aca1c665feb629f75b86bc6796ed5eb830658d68574ea157b89fde9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667e3c1aa8bd39d6182a2299f940d076e52caf4ade4a085ff8961d11623e68188872b08559f184ac3ac9956d54e492d7f98285a254bf010e00b63b6bbe75054353b7ec1fb3aca1c665feb629f75b86bc6796ed5eb830658d68574ea157b89fde9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/33aa91e75b0cc39daae8eb7a1f0889075a667617",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7000000000a124ab458bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4260100000088e9d0d702bff683000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4874b010000\", \"prevouts\": [\"493c4e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d06538000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ace\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828def8465bc2f3cbc3837b9c231547f51d7c9e247c478e05a849822285048dd5e0ea67bdb3398814286540937ec364df004af879f987225ad05d036a51e8223e6d4436d921361743dde8d98d3cfa724f09037452104a82644e108bdf9bf6fbb39\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c90a0cbd53f67dc3e255e72ef3008af6a84b6163b55755c05c159eced1c9429125e7936dacf44c2cc5542287b329619dfaa06ef235a847d66c9c2df863225da6d11737bfd86c40bc108767f37b7ad1553e96cd0852cc5d3aae7d4d5919ea2951\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/33d0d39d6ce6ced2a0a8dc5d8c47e5f5098d7aaf",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6f010000000801f9338bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44e00000000cafb6acc04e6afa2000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac06010000\", \"prevouts\": [\"8cea640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"606d400000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_a5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"344e52e99b8621c7551bc3af9c82142e9503431eb3e7e9a005b520c2d0c32ded2346ee64a63e101d224fed8af6f5e5b8ceca4f99fdaeea8a586ca29820309da601\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c1c7b8e70017ef7a6e69330630f8e1e0cf604cfdbc220833df0657bf4dbf7f23b2fcc00879bc9246d15046067af1493a3ccdb7c714b02f344235fce1c36f1d1da5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/33efade4e6970da9cea78a726935e5443e0d1ba3",
    "content": "{\"tx\": \"e8d0e7300260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127071000000007a5fcead60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705801000000c2c69bd103096b2000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487b8556127\", \"prevouts\": [\"487a12000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\", \"e3b0100000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"867d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e97a330f28472054f17ba9fa881f8fc7a87b4cb8666ce3273442871f099d80d74fc7631352e9fb39bf71f46c116b968047934be68cc4b25c7eb80a8b2383cf163ac108bed01ff7a3c4482bdb9637a0c08eda3eca9d378124f08be0fd1593c53eb98f84b0d7d6fcb38bca0562970da4fa4ac9189daad947902c07179846baca90\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da88b8ff2a82ba0fa3daef634fc59634370b0e98c0a294a285f81b50f56bd3b735e7075953fd5a7e7406fd0d1347280992625a2d2de29c104ee1b42e523bd7beccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f4576b069f256e7b53185a64c953a8831f99a2248244dec917c9fc219bffc52b204f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/33fe1028443f16cce6d9858c8501dfb0a7ae5816",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7f00000000ec0883ebdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf400000000af6e853204717b76000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487e7000000\", \"prevouts\": [\"408f560000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\", \"d3d9220000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063d968\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004520e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1d13faaaba0b83fb431d1a23feb7d5de22e491a7fb36e5108ab00e1ac0e7366690e1c61743bed8ba943c0dc40e80402f7423773c7111097ca9c5a140b1b3c94b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363cf7d6c7dbe5925b37da22fc3f9b29f912bd281d5a092b1ed7e24ae2c32a8d7520e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1d13faaaba0b83fb431d1a23feb7d5de22e491a7fb36e5108ab00e1ac0e7366690e1c61743bed8ba943c0dc40e80402f7423773c7111097ca9c5a140b1b3c94b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/33ff2ff9d9aabf2865009fc3701058f954184c4a",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c290000000006481d8560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701e0200000026bb47f7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5601000000f8a95f8803a645cd00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79665a0ac45\", \"prevouts\": [\"bc855900000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"782b1000000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\", \"077c65000000000022512007a606ac1d369bdfe9b32b88a4b0d4c507785f2481b337f6b3340196eed3e896\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"f9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d79df6a78da0f5e7e8abe67a937df0199bc2719081f435200b4d9406e022e7e11ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045a58cdb730d5140e8751cef937639de4f5fbc77d98986906c68a7616d2fa212f87d6928db58d705af4b513465b8e8f739d066723840f3c873585fab69756481ab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365fb6cdab2e5dc224d99eb40cef967cec823dec47795ecc7beb7ac0a6ad6c13edbb0de8cab6875867027c85350e6845db37b89c1faa2a12b075d8db116249f7bd2367bb7d11bbe7d9666c447942212a409021a53e3151df7f84d090727acdc4c9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3400d35bd94547fb613f1aa5cd2073fdca146533",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2e01000000c5dd29acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca2000000009f8c9bfd026dc5c20000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3aba894c\", \"prevouts\": [\"ee7c6700000000002251207a2f20e860cda556c5e91362c7f67d77fa79d70cce9558dd8fd8d88940237552\", \"cd325d00000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"e47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cfe8c2630d2e6dab45dee7e1e2c518d990c791dc0a4f80f5d66c62d1beb467aa455476c3fa5bfea733d4af800001099064b64c061f8e2c0be311cfe06abfabc5158e114954b29a1fe443083941979d23a0210cc324956afb3dcce424fb4eceefbefe4cc2cebe7bba8b4a4f82666342333b91a450af49acc0f1954b5763bfc142\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c0476de9e93667ef708e6684295477581821e44eb6d19385f240ec9b8d96232c13278694ce96e600b1b1379af0dda4dcee22bd0822513808885cb6e68b7803daccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457ea7c8dd4a05a6083e4a7ce3fc20cde94d430ec03cbfbe8017e9dc8ef3bce99a9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/34038f296d87d228ac46a39bb072cc03e4e585bb",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca1010000002f81b9ab60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c9010000000f201065042881640000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8764000000\", \"prevouts\": [\"a46f5700000000002251207c84ae2d9063cc63412a30e00823aa01b05bc54bcf6d9936dc1c650bbdc9e98b\", \"d71a0f0000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"spendpath/trunc1shortcontrol\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f133e35be334aa55fd1a4020103c95306ba81793663788cc311ca541d9085f594f3c22c0a650975083c14ce3a50ce7df37c835d59be900ba7eeab95ea31598da\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f133e35be334aa55fd1a4020103c95306ba81793663788cc311ca541d9085f594f3c22c0a650975083c14ce3a50ce7df37c835d59be900ba7eeab95ea31598da\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/34264b99b16c56793e013d7d2ac3dc83c0c07da6",
    "content": "{\"tx\": \"db1a6b1b02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc300000000730c61b260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127017000000003c7d6ccc044728720000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac09020000\", \"prevouts\": [\"5f59630000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\", \"986311000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"867d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e35e7075953fd5a7e7406fd0d1347280992625a2d2de29c104ee1b42e523bd7beccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f4576b069f256e7b53185a64c953a8831f99a2248244dec917c9fc219bffc52b204f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823f28332fff4e521a34f62a6094c9ca083df763bc212ee1a103146f1ea11bafd96b069f256e7b53185a64c953a8831f99a2248244dec917c9fc219bffc52b204f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/342a92cea02c320154d0894d36811870581b660e",
    "content": "{\"tx\": \"4f48ddde0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704f00000000ab8735e8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1702000000c289f8a9017946670000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7cf020000\", \"prevouts\": [\"0633100000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\", \"bd2f790000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"7c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93618bfa1a0310c6e7995d51524289b510664f003b8075315c96b030a9e98a309f23f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08208eae3f5bf5f4c26def68bde658fd1412dc2dfb494d39d6b1bd4ba6a274f177d9a711983bc616996e2ac47b27808b31a9b7e87f7ce1f3571999dd3a2a57f1080\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93671c1d10f8373edc2c4abf147e4b905e718eb9e3a7a7d82e3fbe9489fbd4d31fada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e8742f7aec0ae53a52a244a2c0c214837ef2ff67b990e770e70b44d703b0bde01fd5e8f79d631fbf207b458b911c1cf4efab0aea5316113aa9c93bea92caa9fc9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/346b40c03454e4740323b5b0422908722f9a4ed8",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b820100000031e5a6bd03e4231f000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48727000000\", \"prevouts\": [\"3cf2210000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09029799e9d74897279c0afb8c38d5d3c16e364d203dacd3b9fd2ad8aa0c72b731c7e4fcd79c21bcdb17fbf7bd2112c9d486e90a022725fc9f30344ef75a1b6dd33cb5f2111f382512a428b9f0fb7bc037e4a0f29c9d98c64cdd64685e3853ebad79eed2c24e82fc94a901215a7b5eb7242c0d0932a071d8da5b20486970826ac1abbab96b40b667a0b4ae4414c7c90787ddcde93816e7197135b1d0a2337416f3885412c406b29b892f0c1ab57e8cf18db0788f91e464eb3cfec3da5c6e4539f0ef7880e0f1e26dbc5df4b551b09137d16286ce162e356a631e48945957b196ddcaf053cc16daeff06dc24759765904c36b55bbf3007146ee520e6706cd5b2646b96c4e73bc3627802a1f28bd4d51f16c04b21dc0b1bdcbd4b89ee8169fbe86500f2705652fbc77ba0090f1fbe2eb5ea4e731ad74636ac8fc4a8a0642489201874b5653f5a8d5e036142ccfd96ea5eabd0440feb5070a81bfca23bdd5b90f85fd374f99dc5bc1e117affe5743e897cbbe8c3ec27b5252c3adad2374aec2ef39f8f11c7040b779c4e551a5445bbca7441a68c0a4d3fcbc5a5db86fe37275eb260d3de6b600937bb0e7fd37d289f337dd2aa4b5e96fe22604d0d353db52f9d394c38ac9a0d4d457cf10d09d54e51b88a55bed3a6b98a1a4bab32dcd1760a8b682a7b9b19c91ac135f5d5b4d0cf0efac5830df35e1bedbf0ef463a1ee09fb66c51d318f3bdb96e67872e266e75\", \"c37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361a3ba70448446526157b81f30e62eedc08a9d1c5eab7e26d94d9d479cca132acce42d201fd753cc19d7433434234602e4af838ce265353441a761579b9ecb89c78d53ca9a9f93e78db88a883cc9c42dbf55ad09041fa37b21a93adcd191d7180\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09026c74214fedb3c7322ab8deb285da3f4eaf36590572a02a0471ac6700c60b4fbba804cef111caa1d135cfed8192f8a3a9c71335e677dafaa6a1454fa01cc882e4e703966f63ff6944157619abf269bba16dd6853a4c28f5639e4cec96a21e15efef9558a84fbe42d4529630c9dd9fbee8b70c99b88b4db03ebe42f9d640252333ad746d0e195badca5f265af64caeba3fbbf3bf0c79c4691660e077dac6b7d9f8dabd1d4d69bdf211b2f688d55b4bd84a062ad63011e13857facb392df8b004adc222e718c60c385d14c61bb7d58d8ff202545288c7819800d45f480e117495143021017900e671d3e7acf12dfc0852513d3d1ff0d6bbeac4302245c9b993020e9a058b930a328896f712a8b0ce68bb9aba288225bde049fc0c9a97a1577d338682662fd7f335e6bd59bc9754fe14c236ba0427ddf200fe5fc0c2957e692acc71bfc07419a16a9a99cac0e59e9576b387ca11a96fe8586832654eb833cfeda083ccbee194e981378b8acaa6623ffdd1d4618276cf90f1b923900ca8b13f0bfdf4187a6c15ffb5a1ba7f95d006c7bc2779d348b00ed719f489acc459abe1f37b357c1d45fb353bdfd88cda73b10577cad0407ad1d82c8a3da825d62b22ad4793e96227eeb0e078825b8148df33233240a025080bddbdbedabc5d7611a12a0d93784898d5b9eb433d4ff5fed3fc00d1f14fd630022e23f79d7d2c332b3272a3dd79d8d67deb39ded4605b75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082638c14f042a58a31b61c3859e3b726944cfc511dd17ecaa68ed5dba7522a36ac78d53ca9a9f93e78db88a883cc9c42dbf55ad09041fa37b21a93adcd191d7180\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/348d5c1f7c9f5084425a506f649c65b2f31946a0",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9600000000431e98c960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127048000000008ede57ff04e6946e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df979722368987ddbdc542\", \"prevouts\": [\"320f5d00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"6a0f130000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"cf7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ea56bafcb4adbf2751227cb38af2ee857892c1346189758b7796ca4cc3d2e44b46c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdd6c4167c25132c432c9175336dcf34ec1853eafcfbd891c58e0cd045b8bc4542\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e82a853d9097b45eb0aab266931969d1621607f85e2073f603093b953a54be8539d6c4167c25132c432c9175336dcf34ec1853eafcfbd891c58e0cd045b8bc4542\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/349341420dbe9b22120760aa5b91a9099c7cdcea",
    "content": "{\"tx\": \"bfc6bdac0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705d01000000a466cbd7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4901000000510497b3033a5032000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8700643d2b\", \"prevouts\": [\"e9d1120000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\", \"0ded210000000000225120803c4cefbfa0d88ba71bbfceadb0978872c77a948bd70ce562f9334bcd1dc6dd\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"137d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4c49796db8bc731ce4ba3cbbdd752e7baa135113f8e0f4a7981e8466556ff5d9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e7c43b740c0608ac721897ca7a4b0bbd2ef7e62418d1fc20274bd386c7c0d4d7e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368bd2abfcc71c7b73097e9a5763f21997ccd1bd8d9582aa36e06c3dbfb6e67c306a37fd9f079711aee2dd395c4f9bf6b9cf1f54b1a82846abc908addbbb61fc725d0346f0de7f7080f7758bd86c81c482f81ad0c7703311f4b65ab9d7b77c9f00\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/349bf68e15d8f14b4a471b7ab402784c1077db21",
    "content": "{\"tx\": \"398e50c902bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8e000000003f6e1e85dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2f010000002f7459e501c7546300000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac9689c95b\", \"prevouts\": [\"219d790000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\", \"768d250000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09021510852cddac042e61fc3d11e3311df0733ceaf7eb5c20e6d6190f0679d34e8954349e8fca335ea52133f96e208119c5e773ae431a3fc66d668e6987b684fd85d0341e4ac362efd11da618f0ae4a33f61fbccc73a20750a8898bd18ec36d338fc66d1ca186284c0197ff435c1031efb775f5a149c7fe43090f7c57f2bc8287da6efacb67c76d53c573dbcf1eeb190f8862e27a79d2b20f0cf19722fc7b69fcfebbd6b568f7acc9729802ebdf3c09a32fb9da6babfd4f3814e0724a4614a38b68655210d07b58fae306538a7fbdfaa451280288d2b70f2e57864eaf9fda5b7842b8af7ced1545fa1f4d83e67b299231aecaa1885d3e2e278a988f2a10a052c79d6a5ee19b2108611dedfcdde3bab2859d085ae90fd92f369c96245476bed223f9e9d2f2f6625a510b1ae39c50160cad32f9eca9e2f98ebc780bbb38c292f4f0103f706d680d6d3368330dc82a4fc4e5ce7f21722c8b6269627b79675c38ef4cbc015c3245431252b00af0217e18dba78dfe4bceff542753c64810f03efd6e14d95edf35d88d5433e130bf6087cb55b368361289bc2c70c1e87076b72e11375b5c6dd6de25eff532ea47b708cedf5946556379bb60cd88ef3b345f636814e497c2eb53d2b4295c79b1927576ddddf4a39644addce18e177fe6b59f0b214e6f0e3e19f1bee634922c4b00cd19c4b4aae9732184295de06813084d294b205e3166b52049f35cca15ddf21a75\", \"217d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08256da9396880b08a11a17662bac4a7b382e749572eea29fa5ac5793c70e2d18ea5bb5ed745f7425de3873ba37c460c85acd2f4f50490d9d3680fc958bb85bfda6f488f9b2dd04714e2920653c1afab7d010d81355bbe53edbfcaebea15ff1da48\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09021c456d981e5c3b017b4453317e1084985c411e0374eebcd13639455a4bd4cb054b1fffc89b944c9abebb8ad086bbdb188d6b122ad0597a0e23561ba43687f52aa25252aa0bf87be1540ffed38500ab81ea44feeca7797f3b22d47bad9e0a1253a46208e0bc5937b5161b8fe85f8691648422f371aca8153460b32460ea179e8fe6a31a08ff7cab8bda7bf491b53c2c6261ad74511579a5fd97c2eebf92acb284206d872345b1cf850b562f2873a1e6e71df99dd6cb996d939affd6c950c7c5d40ea76e2e2a36b9c71d8ecf5424817aed0efe02c0767705d86521bed0ca3fc24609682970a23517a769f8bbe6f078252ccaf5ff2d7fddca1f86b93450b99ac8fb727523de11eb977069480646fc92cb59a1ef5ea39a6137ea8bf9937afa3bdcbd365350c295aa2276927c2741b41c50948c03e60adfd3683dc74a3238b9977e1ca638fdcb04d92fd5aefce0bab9822498dc4088b74b506d624f476c1818f7d54e2d5665daf9d63cb5ae1d4413bbb029c2e111dca3b7338582219a404d1780fa92e3d0f3e22e4945181679f60ce7812123463c5eb11a8c055bda24fb9d5938e1302adf1066cdfa68db38f1f1ec8a5c8b683d2ae16c23347b50e0f792427a2583c5ed6358250293e5d36632585a202d3f476e76855560844a3010891e72402f9ca7c1ef8dae3a3d8aaf20f4cc47830fd0a6bcd9adcbab196fbabb30c439eef6208a55497785591b3170b375\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8dc39cab162b5ecfeb387365be0497ecf3ceb69817352d9280526c0f75de7c14184bdfafc9427bbc75e549436fc0749ee4f6acf063a9661c81b3024fc653ae79a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/349dc9e7f879b45a530ea9ac4a5ee92a83b80b64",
    "content": "{\"tx\": \"2b7a7ca6028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4700100000089a957d260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707900000000d42a2be001ef6b390000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79653020000\", \"prevouts\": [\"076c330000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"f6b10f00000000002251204c956d2ed9840e95134d355554a887a299d70036ebf1550bbadc52fbd9ddc36f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365c2c02039e1e8eda45733cfa19a15344bb0ca6a0e9236d9dcb31644a405809ec\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a9d616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/34dee51305402e7e6b502025f00f29abbde3cb18",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca0000000001422ed9c02a9f24a00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac7edaba35\", \"prevouts\": [\"61b24d0000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902475f66f483f4c6e7b20e1b16a1d2064a82f252c8117a7ca458b3ff3d51aab9be705f73aae5be6e70f0fe05ccba31ff8a440307e6f18cc7081041ed4b81abaaf1a12e6b5fa427aee1c1ecc074d19b1fbb031d6280e42657dc0eb83d1fa21a9b432991b5f7d1d471ca28ae773dd19b2e218f21a8a3adf4f0ece04226e48d01ec4d26f078b46ff5719a16237517bbf35b5a164097fe733d5973f5e1a9a91424755d4ea17d6bd2459ccdf52a5468bf1cbf5b3413c1f799cb59f731a66229a06c1cdeee53af08bdd3e641d204a229c2f1dd4dbc1aabd7b460a1b157695cfde157aeaf1887362baa734e82bf73642c3c6c57fb07da34ee35ba51795053309e41014fe6eff5906741fa51dbe6fd47e6436935c0e956dfb5cd52f04259ec76b737f1e8cad11ae0d1279268650e3e4ab23a148c79b3423eac5119a34d42b716aa32db32f8aabfa156b6a7946ba3c65515e13fd06a871a851278855da192cb5cae8dcffd76f8d6504390a9b08593c5ef7b4a79d6e5f9063a92ec78cd43c6cd36d2cba6dbe43c02e94b956f291ce0159448aaa20be2d8d40761017078558278e02bf074c2e224832557286fb997596f529dd80c0ff86c45ed6fb5fe866f5ee66260777e6326dc6e90b2e750214233f385affd17e4f8ef63a4c4e227a8a060d621db34ab81036acb37d0abb6dc7a3ae97a6b337eb802d0f4285f3bcbb9329a9702e94dab04299e94845aec0a563ff17583\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08299aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb439b32d44b6ff86c799acdff23ced11a294722ef2b8af6951bf8429e3bda52b31af3b292550aa3dd1beea84cf7009fb6c6992543e64edf52f25a9194aed3bcd7c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c579f8af5ad6cf79aeed517ec77400fa5ae2353ecb0ec200b08c233d23b36901469edd1eee449acc62eefec3271e63f3758c66545059a6b2cf6ff59dcf97e1776ba998c71a2be633fad8275f7f05694a7f90d660a61bd8302561dd5d9fd4b6da5405fb4f4733cbf76ec120c93e00c13d269d1a47937797f44a8a93d86aeae0bbfbbf66468b3ec9cc6d91fe321bebc96f40009dc71fa4485e4f8ded6c631e4f0f289c478dc04b620b5ec72cb2ea20b13503aa4e150f93fb8381d404e3d41977049aee2fb4f3c49dcc572f1eb640b83e7b82385622db518b185a05a8f4fd37efea2b3271e2dbbf6140ae97baac4cc04a632e51834806b3f3768d340ae0d7408298d695318e4e435d90d1af5b103836513906dbd072c9dd943944c25330aa6d591ed8bfd881d245770eadd8f0eccc6dbc01099d4801848fa6e09eb0cff638384541b01b55299b4f83fc09e13b97e3f8dc6192f7bb1130099a2cb7a69fda912108bf8a91c675cf99b1c768f69a4bc30b141da96a396f38c2652690909941f3f4e1d54991b865afe0709db772ed53f8e74057dbb71c2cfd12d2840b11e44fdc74bc276db2a6c7d5c2b74554450ad9291e12c513b758e3e41a7a768e6098a9841cf61a4a3676df32a0d122a55c5f5f0c46cfc4b25d68942c303dc1bdd2a2ee4ed5026bfe694d39847b0779496ad07751c1fccad377bc18f661e3786ce1813c8aec4e1225aa6ea88244b415af7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d518f4301bf594f01c0bdeaf5c3d617f0344f5f915f3ffa16d6ac31751e310f3332b0bdfd7fd43775a37ae3e20c8f8514aca25517db969733cf8d9f690f9b6d8ea23f980255362d30444bd4a09dfd60422f4fe5b70b7cde78729ca8cd52cb50aace\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/34e0f433a921b809a71c9924e9c0956dc34bc220",
    "content": "{\"tx\": \"4b61cf630260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270550000000048887186bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1902000000afa4fda102cbb3790000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8728747447\", \"prevouts\": [\"5c850e000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\", \"74946d0000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d94c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363223f590d275dbf98f3959a26c5345f553357b5bd8a825b42274d58542b11fc5131be74f8e69d59b35718025ad78971477354696379895e31ee13c64e6c94e9a3a6c94bbfbe0c8d8162307ea587875a7b29cdfde589bfdf70042a40a3445f95ec19ec7aa48c905d8ed6637f3c17c0400a43c560e5c859444683190ee16fe2235\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52d9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f2df3669f0ebd61b1abc5e44d231fc82a1446c69bb597cf670e574f96771c819131be74f8e69d59b35718025ad78971477354696379895e31ee13c64e6c94e9a3a6c94bbfbe0c8d8162307ea587875a7b29cdfde589bfdf70042a40a3445f95ec19ec7aa48c905d8ed6637f3c17c0400a43c560e5c859444683190ee16fe2235\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/34ebf584d708a418710a1466a3dbc67b82146196",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1000000000e348ed568bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44e01000000d194e30f035234630000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48709ed1724\", \"prevouts\": [\"119624000000000022512048dae93b9a8752a11e2bf9d811f71f83e914d496dade834e573813f3fedfdad6\", \"607441000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f44c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ce60b07daa005e7e961b1cd1197a880b0926a9defc492f43af4f596fa4d95286ebf10485a7565da4888b0296454aba30a39a8416dd3eaaebe7fea4a18750e931ca477f7eac6c013e182e33a949b526b028f901138401b50189d2a4f50cede7d4a6f8b9af6548d116d93931f99bf1698fdad997ce51263e0555061e012c5780fd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1b205b49dca00d66246302f0b0e6aac7e300ad432a7c010b19b7b2f949f7f012a70b4d2addc31b8421907b0cff80194a5513593e3802bd921239c9c6063ea806bb655a633384d647dfd447ac375ea9b2c02c16d8a17436cec940ed1871036c5ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/34ed3c4ed5af89953d2e81d21f7c1e45d2c7dc87",
    "content": "{\"tx\": \"e3469bbe0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706700000000c719f5ba60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709f000000002924d0bd01b5301900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac88030000\", \"prevouts\": [\"17b91100000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\", \"09fa0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e1118f7cca20da1def9023630ce16f7f5835312be8eda360288bfea17af2b584c5a23e00a9a7dc2f353ba7896709dce82fc16191727b3183f782d36735c96099fe64b50e43d59716fcc3be7bbe76dd3ffd7b0c48a52f5c0065c51f7798af8586ae4d7b94e431407c6b932957460eeee4db73e5697831eef08d4f1c36482c0a73a1c1c7db964d2cd7ae17cde2b332730f90fe27c014cd537d33df94f2efe0792be51a2e13404233f292d33f559f283a1fb45c05d9be9c0733d3f93a3afc8519aa4891fd45fa45710583e767aaca334942360bc823166e2d7bd1f7530b639b6405dfef02e05314c9ef5f74d0d6366228a109c3c87e1633456efd01d544bc972af7b44f12ec87ae432486f66f46cfac9e0643fc4119fba979519851fbb256dc52d8e21cdae6a7955be486547c097041e2096f43818dffb0537ae1286a8c19b65dc777407f853d6ff9296a920deec6ab9bab6cb8818a144597b0a5667d2562f81a9bfb6afd454c0c4934557edda2945543fb9aba37a87fbd38ce2f39689b7476595afb012ddf72298d9e8d7d157a25c9fb1b49a00cd3177dd4c61da1097588a69a464c517b1154f12b35e50848eff7e37e88103a076e5e132736e422ed915aef44a07ed0de6627a7ba5792df9cf79b300b8b7e3aa439e839c2d99ddecc9bec47c8c33a9aed652d5a60e14695ebe74cd093fa15fab53bfbac61d4f32be775f298d610e8030d84c23ba6e8de7596\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b28c78e356042728a8dc5293f4719d9544479381d7bc53161d8023b722566e5250874a9774daa89f30be275a1ff5113653dfa1548b9628ff9725cf694401ebdfe4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090208e2fff581ba5a50b839a109a158f1ae9d512e8b8b5141a4d95106120a8a86d5bec55e773653bbcc8f0f7e0557f9b3ac7f0c8c187908d8a9dba5c3fb734073a30e8d8f527aa72ef8511b79ded506b5deb47352adb253a20fa8f286640a39ee2be0f79c9600f0efc763a1a815adbb227812c2ffd46cad34a865714dc5c07d86a0d54e7600e0902552780d4424de339261b55188228557b692619b645486beb36322fb32c3c7fd431bd41309f5f4f7caba891b1b50671f24ee6751cadb0c749a43e23556e634e8a66907523b220127214718be0f0eb003b05a277a35cc26c2fc284c71a2f938c866f3b3e79c5ddb4d2ed1fb2e13076181367db83194072bd57c9b59a465e00023e5a4181a5bdc61fa69009f198b6adcdc6aaa2b30469c453f9ef5eaf5a63ae0ef2bf1b2d3c68ebaa80238764b6fd117b90b3f9d961d38d670eeebfe4a13f7e03ac64bbcc9a77b30c94416bd9b073e8c50ea87b5b6e373772acea1566d3b3c5ea5b962d223c3b7e2e4aaa16c9ad32ea14f6f4209d8eab409766bf1c5d1c9144a49e319263a1a0785d9b5526ce4c073561f604a4894f6bab7d2069166ea7cd73d2ce5c187fe5f2528cda247e341c3d15978a9954b2da9bd74bc0ad5a2511e7d86c41efb5b7c2ab404fcad2073cec1fba48d8f2bffe3f2d05d519fa964bce785d18c47b961972bc1afb784a3509f2cbedb256e3a73c089e5df3555408e543b1dd309dcbb867561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821bdee2e16a63898e861f6346f98a8f5f2a90fe2be47e52912f18205e56fa5c07b35fa22f4b25dbc3a6b67e691e1ba7f45df255baed4abd058cf23fbf36a7f21681a75fe046050f41c6fcdb9e38a8e16ceb2d96bb057130f662fa5c2664fdaf5d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/34fe51570c93ab7b56e8955a00795a7af3eb88c3",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2301000000aad2904b60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a6000000003d041d050193d671000000000017a914719f78084af863e000acd618ba76df979722368987d0c74728\", \"prevouts\": [\"5b7f6c0000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\", \"663a0f000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"a47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93662a72c7361d2eba7ec3a19fe348f0f06b8ad5a36127d626cba43309febe57ca2d5e071d65b1ff2cbb44adb2a0836dee99e48dd3c256c0643eaf2d4db2ac89d0f9da521cfc521edd35405d6ff7b10120e980b699014de05f8e600b437ffa9c347\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa1a56f6cf7d9f4db4b4e32634d67c1bdca6b80e06b787823c0e4d06c57c1163a2ec4f69e5cd9a0f0c1fda8eb2f54297e33bc5edab35b299e65e2653a923d6ca55\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/350219ab2d9d1993c2e0ad903f92eaaf6318f133",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b85000000009369fd8bdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce3000000008641938a0366ee8000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fce86e6736\", \"prevouts\": [\"6ac7250000000000225120c1ae6350d5e25c8637e3643ccad16ae3a3009b1bad8c1dbb165abd62db3354a2\", \"98df5d0000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"f8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364dc685ecbd8fbb467f50be3541444cace52e2a96f82f6e3a97ffe7c20b40a1e235701ef224ad20174d0190f97f9f6d3f23a41bbc27fc82fd96c9e1fc2f7b2cb81ef28805a30acff873fd9260c6b3bfee2b626467fb0ce04f716d513a8a4b08b6f288028cdab461d62f9273620b97315e6e9af9458f777a616c1bade2d3f6a89e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366f183944a14618fc7fe9ceade0f58e43a19d3c3b179ea6c43c29616413b6971c1fd87b85adb72b018dc8118730af51fe2e1fc2345a45c291032ad5ea0f36db09afcaf82673e7b509fa61dcb6f9390da3a7ce1e18401449d1277235bd9d9c04d9a72d00f85eae87f4cc31996f158484f267a3b4b9a04e006b9a1cff5c0be2781e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/351979da8be9a1fded3861db5068a083d50516e7",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270780100000092a442168bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40500000000ac1f958adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2b000000009c4898ea02e6d16d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875a481120\", \"prevouts\": [\"2b3f120000000000225120c10f9a5287d6d37684b1ac107332d66417d952fdf60fb9cd3e9fa5de48c339b4\", \"fcef35000000000022512070bce5a25570b494d89a85af7ba09d895150a56587b7f7acec0c02ca42514b39\", \"91f927000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93642a698c787d1b847cde6e98849bca61e9a55d0a1c0c2fad329979ba621c74795\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a44616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/35210e4f9eb6f063e680746037b199244fe0997c",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e00000000082a1fedbdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b040000000078251ec4037e9167000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac33248d4d\", \"prevouts\": [\"aec841000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\", \"e5c4280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_31\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a158bebfa7f7e39bb3bd9f2c9bcec51c834aa081291ebf0fbd28b4cd7fe4042fd70875e62105e87be40abc44c6f11600c4be1ff516e1b55e28cc2c81f9951be883\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"dc1f40d2c785e4e5e2450796e46fff01d27991a54698f5782ce784108eb1c5995e082e94bbed1262006a52eae43a8836c65a0c8c1ed15a944cb9ce5050fe8eae31\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3569acb6b68f7aed0054e44b1fa854e2ef33b96d",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4e00000000a4ee171060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708b0100000082b99690015cef6a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc8000000\", \"prevouts\": [\"f6f17d00000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\", \"84ac1100000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"317d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936baa8b3b4b8a0b13d474f8e303d1fb88b1f31b08e2de6caa1fb01bb3d4c0176023f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08228c5b97b98364e562d83f29d0f7226f72eeb298058e828607471d679ccabea05a4517c545b323e839a783e2c84e61e1f1046ec65ac2c085bba4fcd3b8ecf0c89\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936848a98c8453c3accedd5d6c98b5c0c5ec67507e057504b5eef02067a388f801228c5b97b98364e562d83f29d0f7226f72eeb298058e828607471d679ccabea05a4517c545b323e839a783e2c84e61e1f1046ec65ac2c085bba4fcd3b8ecf0c89\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3572c1cebe263656185dea9403422e9884954499",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba800000000d44957fc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127059000000009e3999d502b1992d00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ace6010000\", \"prevouts\": [\"9ad1210000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\", \"92710e000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"814c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93649f82d663a1e447420f2cf05179af13964281439b8b427a6cb4b09af5b0cc191d3571a06a1d33120289e06483b2785a7356eedf367170ec7792d3587508789d4da9670c383f4b71f5a22d48df0589bd68dfe195935a65f1aeaa80f10f8ca6973\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5281\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366acb6639dc224661965f1c40d35e3666caeb8dba1d8ba77ab5b688daa06db8e499aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb419c228cb7ae814d70beabdb725e2cb3ba4f8af3a16648b1300fc97d27ac433c5da9670c383f4b71f5a22d48df0589bd68dfe195935a65f1aeaa80f10f8ca6973\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3574aa7865915325c364ab1364ae532d35ec2952",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f601000000901c05e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9900000000916fb3af02ceaf58000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a622010000\", \"prevouts\": [\"07680e00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"90344d0000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e868e9a99c27257089f8586472cc94222e874ab5c5b462fc98ac1b045b7a37dce65323990ac9ba96640afb66df99f25054f5788ad16157a03b33c6c26a70bd925e21136d3d9ecdf371b2101a7e86edb56e15b10ef185a8506988239bb2b5a4c43e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a48ad409340116ac239d5c746dae159519851dfc1ab3c3ad2152d495f5f1663b52e804f6a261e09ec86c0fb6e6ff5b26564af7d86f56b1539029a07a3794a04021136d3d9ecdf371b2101a7e86edb56e15b10ef185a8506988239bb2b5a4c43e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/357c3aca3897a104f6b209ff00a90eb8f93c11e9",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe101000000a64555a502d9916e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e74d1fe352\", \"prevouts\": [\"a550700000000000225120b5fac7f9d1efa21092b4bbfea1ca41fe5694dd20d67936ab2b478b1ec4aee588\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a2964428c5627bca847605afc80c1617e4aeb928b4472ea19d347e6adf351dd82af60a6b1ce41c85915f4ec0899b6d6f1cca85ed4f86462d464658804bb71b3aea89f0fbfd9dd813268d111dcf81525d56b9783f0f98125d92d41e0fef09748813099d5e1d6a1ba1decf29eb688da21dc9d8f2c43b15e6199aa8fdcb835c5d013c3f13ba0d2d2f679a59679c3f4e557898e02e9b4640171ddb37a28c20a2d3f299647e3e99a9d82a3e4571ea170ccff2b5ae28b402531a470c9ba2e2f8cb91cb3cac4c3f939ab8bb450f63f4214684ebca04065a69d63da74880d4c482873322a12e073835179fe80d1d481ba4fa541e5ded02eaaf75bdc032dc4a39584fa3d7cae88d29bdc72627ebacb9a3a1a370e60549108e373be901ee4937394990431f9776fb597d72e3b1496aa7d124535fed9eb9ec83b411a60dc970eb8328d9a87626967c21f1ce316d5d7616306c899e91e8a63a79cf6689506895bd41428005561ffe726c9f3aeded4f91f7f99bbebb81d93eb1648cad1949731d9db76ef0d77838941151d4539edfaceac81dba7d39a20975c58775fea38fd52b219475a923a18da65fd0d805a5c96ece838500d5f987cbe1d9568079589dec9632deb75affd0d4afee73f71787065b1e3f4f5301a418b90f4bb0787b94e54e54e68746bd1851e638fa1cf691d53017a976db98982361716cdeaf67ee2bd89276446a851a136f92f0d66d90533eb98b75\", \"da7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fabb1bf216bf716c84a1c7f4bdf291db4b4c93f804d437ac6faff07f214860f972566ba3404d3656bfd0df4a55f82c254cdba579fd51be164a5cd21fa2faf92a44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a7f4d0ae60acc87b60720ef208df3f6881c53b5b422ec367d4193d1a9af76b29d2ca7f2ecd176f59a79329a7e0aa40ebc4f4103eaf89d8e3ec96cde7c400212b07fb2a449f35e6f15c2aacc9e33bd2112e6ab98ec76dd1993b76bc932da5a093a64c84fad222d73b29f67c86003da9a9fdffc4a52403e2dad01fc3e590d3c438e6ebbab48d2ae356c0b8ff11278c8440fd5d9dcc4806e14526848b1abba4b7e6a88f5eca475b3349560b54ed0b2b7926341e5ab86248a3d94cc27292473b85cceb17a27410c30802de7e0505232f0c474a976d6897c96e88b8959e8bb9a8e66672ca4a5902d55011ffd3bbb5cca1f5da1eea9a30a97723bf78a37be3fe3fd6669903e1f2b29b7b1f85d38c5a6f5a6513860d2d4cd3cc9a9b68d2c04881b5d13505e9eca66a752990cacffb536c49ee32745cbec92fee57e0c481c66e1ad1b2ff16ae7c8b8c748bff30e0b916749de47c50b6eebac7632340a986c0ab2073919132b3126c4df6588a46b79d1ae0cc73ae2f423bc123e4f0ba8c33113196e39bf00803ea0eefe5f269741fcb84d3b9abf0478e34109cbb792f1267de62d68656448e9841f99a94a5f0135185ae67a830ba0b3e5fb620c145b930e51467fd29485e3547fb2df0d9b15d6b91b8112d18c6eda105f61c207bfe80881de30906598e40ad121088843e1e6f9d7f774852a94be5035bbb0d30be8f054791dddbb71de9dec85639c7e5ecea38d775\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93619e18d071110c5abaa139a6d0bdd1af7c8aedfa20831714d5471a7b6fe83dab09a29f5cb7818ea23e4b491695dace811707e8772e99626d3237c076ba9a076d6566ba3404d3656bfd0df4a55f82c254cdba579fd51be164a5cd21fa2faf92a44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/357f1e298d27372ed2fdb360e6ecf4b4f93bf38f",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffb000000003c3851e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2b01000000a55d69fe016a56890000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796cd000000\", \"prevouts\": [\"ae147e0000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"731e4d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"de\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362f9ea8f2e65eb73025cf4611eb81b9bc973c238c936328a8046b3068be11236b1823ff0d5c6a769fa09e08a59a2485b611e1511239bba2f80aba2b92be945f1b811034f174cb7bd77652d345f06878a8d4eb3ae1b92590cd10e2563bf228d2d6bf82ba79f2fbafe67448595b33026800f76a879cdfc27419c1eb96837433fbad\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb423dda11617dc042479e1d576056805c31872018ddbd603e5e1ceb926e90a3395bf82ba79f2fbafe67448595b33026800f76a879cdfc27419c1eb96837433fbad\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3585f3da19dc73f07d513f4d5e06b3af35381aab",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705400000000d43674c0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0201000000aeba28e203296f2f000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df97972236898731a52e29\", \"prevouts\": [\"cb58100000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"f13f2100000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"b67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368f91b6c4c13aa4ec71d33e29eeb31c6a6eee39b0d151b2bf968ac977aa50b78419cfe9d552d59ccbadc4f3846c4b5c3686f3389826ed032a892d1ca338e6ba63ca37f8027c2c0b0d436eabba5be8b19fe8a47d5b17abeebfa31c0139f25f704791244d1d955381053a5c36db6928ef13bb9242569ee84b58d7018329936aac78\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b4dd63163ec3072393586c7919962509f9d5e063bf86457cbccc929d8e7b42d23bc00f369fc994f47536ced64d5e4f722a68c2ed1128957c24de4b5158af0ec621d9a3f11774810afeba87c9188100d693899e640a37210c96e3be6a00ac01d4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/35995d78575bb81724c123126ae84f04c1ef1324",
    "content": "{\"tx\": \"561ea52603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6001000000363305b7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd501000000b8f01b8d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c442010000002b7372e904bd41b000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748703000000\", \"prevouts\": [\"f0d7250000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"3f614c00000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"cdc840000000000017a9148462ed29696925d7688e1db8e76ef9e6667f05b287\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"21551f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"80972288adc6d7cba75001f1141141eb3686c9d3391523c89ec8a5d51191b31f7ec18951bd568e4fbba5d6e4cc84462a06b1aeaca08f8e5c0bdb85d868bea8bd\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36107f7e7692414cd4ae5e7ee06a1e46821b107a",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3001000000a624d4cc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700802000000f83632e9019e1b0000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac56000000\", \"prevouts\": [\"d9161f000000000017a914e18c03fb168c1c1b3408ffb477de8ff77b0fbd9587\", \"c0db110000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"235c212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"e04c767dfd5b7d04a7575a895a890a96fec52479db16d1360413e16345dd2561ec60f703c0d427d470048b256f382fe9264326d51f90733814b5cb3a78703739\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/361314e0baab060ff8fb2888efad4f841ee2e65d",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127090010000005ac683e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c380000000038d3a0f20107b609000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87cd821a49\", \"prevouts\": [\"b65e0f000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"d17c4d000000000017a914a68ade9e67dbb5e8acf044461cfd5bd8dcf592c387\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"1652142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"1c57dc5cae11418538bd0d2602bc9033ee944789925249b9dc13189e5fdda2d00395bf36c138544c40aeded5fd16f11830dfa8931a56fcf656d1480713061d0b\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/361c2bf607441dd9ae1d9e592d08aff1c4423aec",
    "content": "{\"tx\": \"a812a8340260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127011000000001b84d5c560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b90100000047458cbf0119a31f00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acba000000\", \"prevouts\": [\"7909120000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"c8670f00000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"697d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89363a1a9e3455d5e541eede6f35654fff6287ec2d2087da21729e13d6d7b575f3b3c2b944ff5e8034ac7518513c5ca10ab4eec025a723136fa482de383e24ff1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936af22b4901457eb456597ad7be41b200460b2a53b5535b5af1e9b3a1b5edde2e99363a1a9e3455d5e541eede6f35654fff6287ec2d2087da21729e13d6d7b575f3b3c2b944ff5e8034ac7518513c5ca10ab4eec025a723136fa482de383e24ff1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/361e67ace54dd8058e82517e87d5a294ff0e2430",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8e010000009d47f8c3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9c00000000643f149804cd20a300000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac550ddd44\", \"prevouts\": [\"3958230000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"01bd8200000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8d4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368b6d963912b4b21c343ab35d829758acd38b20aa323c58d3577851a32d8d38189886f85ebb300297009aa959255e1f8e976b091c7e06b33477ed400c40a83b4c185c953dbf0a33402e724bbb72e47d874a897a0941d53d9706dc82e2e14efc19f43de7556260bd81909ce9fa765818ab5d5ff32210a0a876b048ce5ffdf4a21f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5188d314ba4ab03912e470cb461a645c9914779a4907e0bafc42fbc04fe8b44a37185c953dbf0a33402e724bbb72e47d874a897a0941d53d9706dc82e2e14efc19f43de7556260bd81909ce9fa765818ab5d5ff32210a0a876b048ce5ffdf4a21f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36225523764ce0fcf4a54ecc157c7a9ee0ca5e1c",
    "content": "{\"tx\": \"bc407aaf03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6600000000004780dadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9500000000b762a584bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfec00000000c46558bd01b5e525000000000017a914719f78084af863e000acd618ba76df97972236898718b7f726\", \"prevouts\": [\"d3706e00000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"a20f210000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\", \"60e3700000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6afb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4006cb24f353cfca0d245645f6b16ad599c212098eee86bd01fc37c5c4a863127c77e07a04f832bf80fe1e45fa6237ff98bc90e935546ee680c041b2556eaccab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b29f7cabfb957bba526a47fc91b61b10aee27eddba24db724dc3d01c8c4f31434c1cf5ffa00c6c7050afc353617823cd679ab4db6c6aacae1c16f62a2980653852b51aac478484d8a075e848b67a41ce9b347e1249fa49816f898b909a6d4bd5c77e07a04f832bf80fe1e45fa6237ff98bc90e935546ee680c041b2556eaccab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/363516e81c7327e6e8535e74da1cf78a4a939bf2",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1101000000c10c2513dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4a000000001013795b0240fdcd000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac35020000\", \"prevouts\": [\"660a7d0000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"ea8852000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d728ffd3b4e5ee0b6ce4d3eadd407ec13a93466db8301b27f68be80942b82a09ec004eb01a79e36188d5e309ab6f1597fc4d1a9e686b0cc6c52861d6c281ccca82\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0a2eee076946409f4b97aa446498e63db0bfbc131467921e8e2eec44a70ec8a3b539782dd8d7da4b23add8948b476438234ac66ae752aad19f5b9d8bb103609482\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/363d3439b183bb0f2c6a0d1238057e9beb398f18",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c415020000008b24badfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0400000000376ef8070205c49700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df9797223689878c020000\", \"prevouts\": [\"92b3310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"adb367000000000017a914856f7c6a5a6a1ac0e553b769a4c35bcb9fb6f50287\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2353212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"5ec4552ffa2184dada89e5707a20eba875f5638aad7b361827fb125646ac0df368e7301ab8264c017a2e8be4bb09a7bd7f9d1d0a3a74617310f6cbbe76ce09e7\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36415fab25c89139e82b030657b2f8d9f5d9bfc4",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127016010000005a40fda98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cb010000005cc4a369dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cab000000003c7930a40216509d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac25272e3f\", \"prevouts\": [\"2ae70e00000000002251204929a185ed20b7f7e86ae8920b068b5e7d5df0975bee6bbfbcd97b6bb81e709d\", \"b3c23b0000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\", \"8b34540000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"7b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bf376daee13dd63a085ad58e4a789e980aa4a44dc2b29700e972d7f3e78897bcd15ee116aef2a5177f7228fbf74f7a33b70e884325424982f9125cdefb107591d34322f35809060e9857f404c38bdcaf402c3d07c78e42a3b4d1eaa304dca88a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93627167632271a67f79806a6d1eb3003f6a6b2caa9b61c2ff1392a9bd62be206b9e069ba5eeb0bec6bb336aeedfc480da3e66ab61ed5906063fe5b68f45dcb12952affe3792374ee751e9779d236e331236b2211c0285bb070b7e5d58aad1c033f64fb6de85916ce1333b57715a419fbbb7fd448155796c8af09a2e4a2bc14d947\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36608fb81d55d07d46c2f7849cd926ee3b2544c0",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4baa01000000f77c2d26bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0c010000004f4f1f22031457a20000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f870d020000\", \"prevouts\": [\"3c312800000000001600141cc39a492a6f67587324888ae674f2f534a7639e\", \"f4397c000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100d9aad57a3b6ffbe01e5aa610c80a31dac0435ed9ab6bc77300028978a0dfe9ab0220693cfd0fb01370af7d07b4fecc8b192e1a2216e94d42da27db6649c7fb4d3f4101434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100d2bf2bba76cc40c83e4fa88a78cca0a51d823926708c32ceef76f50f0480e74202200846b9fbbed97d2ae1c9ccb73e86cb58120d894da0f2c2486b67b3bb842a071f01434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/367c9b1f3074839cbe7794421f5a5a30b5392887",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c36010000009d36b71e047ee44d000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88accceeb831\", \"prevouts\": [\"4bfe4f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_b7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a4063c93b08049b6f9535c3fe361cbe0ba81ccf1de814e064ae40969d880a544336437e95c43e1308a425be13c2eefcb039e905154e344d7a65a50cf1defd24d03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"788a54b3f2fdc816b53744391b0112b0dd7da2e0905556986fec63395814c0b5ca80404ed642a2a031dcd2230f2d0b26dfcf9b3fd6ccf8f655c623f047ad96a1b7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/368c81b84650d4644c983e3209d93ebe140d375a",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565caa0100000063e069f98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49701000000410c148c017dbf160000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e712fb6959\", \"prevouts\": [\"8d71480000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"40c43200000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"ab7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936868a8b5d4fa4ebb812e9187140be33b96106da21b05039089cc432e85b6849d0588819b06684552554786b2b49e7cd3d9dcfc0725dc4b3b93f8768a6a84fb31b7c07bb1aa10d02d314eb70c923196d0e49e71087637e2d5a1d7fe44c2440c398\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93686c31dcf8859245bfdb2cad1cc94d16ee0f95fa651e4b9f3d702e098ccaa2b3aa05ea26d8201abb1a5c146c7fb3e541bebd813f78d5cb214a01f0b6fbe6f45888cb303569f28fbe8acbcc2d27d183e3a68170f5392df28f40a03efea695d856e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36918d3941b615417b367e0dda84482198335469",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b12020000006f9651d88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42401000000bdfd4f8d034fab5c00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487ae07c92f\", \"prevouts\": [\"8131230000000000225120f52aac6d1851a3bcc3e02eab41e79301b2d0925e53812529fe85f9ade1401e4d\", \"82de3b000000000017a914f7f3eae48087a4952a984cf9c1f2f12f8785754687\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"9a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93610630b77bb4590cf218c5051e5309756c31e53d1c2931037bcb12349387772a4703c0353c01e1109d81375c08919405978bc042794caf82a403da05ca89d0cdeef17902325999cb16876d9e124f321b7a2400c6233e0b61b95917979ea167214\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bf17dfde2600b0767befdacfef733adf21854ac1d2a618729f77c0302a39a08774224dbe9932044562df2f9dbf2ed3a87afba7bd9cf6855f9f40e4c24add8036ef17902325999cb16876d9e124f321b7a2400c6233e0b61b95917979ea167214\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36a94d7bc5dc9af664df029d9cacb70d1662178f",
    "content": "{\"tx\": \"e40f700a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5d01000000e6a4029260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708d00000000b040e98602ca483700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72b040000\", \"prevouts\": [\"7b45280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"2d0d120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_60\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"be007a4e43895b378db7bcd4461d8c69ace0ce7fd51d0cfdbdacc69ac4e742321e220ae6597c6a425a15f621abb7aad75636ce79d1d8a63a3446f3f8fb921e6881\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a9574ec4f482f856bf12b749da5c724444abe5e5e99aa9fbf424151d0089dac86fb575cc267a9769644acf5ec84080d9c5d6f56687885a6548bf37baa825ca3160\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36bc60267ff97612610797a43fa5e7b371687229",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e00000000082a1fedbdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b040000000078251ec4037e9167000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac33248d4d\", \"prevouts\": [\"aec841000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\", \"e5c4280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"867d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936926f2b50f3fbd9ffe22dc41af4426bcb82a03b8aad9cfd0cba46d108de7a4ac73ac108bed01ff7a3c4482bdb9637a0c08eda3eca9d378124f08be0fd1593c53eb98f84b0d7d6fcb38bca0562970da4fa4ac9189daad947902c07179846baca90\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3f28332fff4e521a34f62a6094c9ca083df763bc212ee1a103146f1ea11bafd96b069f256e7b53185a64c953a8831f99a2248244dec917c9fc219bffc52b204f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36bd6cf68074e03b5642284ce7d493af28e048a2",
    "content": "{\"tx\": \"4013c48c02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6201000000bf7eceeedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca901000000a70f748001caf00c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac9a82d82a\", \"prevouts\": [\"164228000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"eaa954000000000017a91439ec132e1466f40f0086baa7ac253013e83c7dc387\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffaf172eeb05afc6853709009cf0d3b6d15c8aef7da615bde3873221decaaac449f82d663a1e447420f2cf05179af13964281439b8b427a6cb4b09af5b0cc1910a67b80b81ed02a57999348bdd390384d424a2522cd0278ffab5313e035bd402791a13a85e5c2e660174c9a1e69b8f96263917ef129d2001c822ceb7fc389f44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045360c8600b70daaa5cf8f525cd2d4abcf69506a056a119fd926e23bd8684708da0a67b80b81ed02a57999348bdd390384d424a2522cd0278ffab5313e035bd402791a13a85e5c2e660174c9a1e69b8f96263917ef129d2001c822ceb7fc389f44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36c7fd31d411d45f3d03143f9a36158791a29660",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2c01000000a1ebc3e504f5da1e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac66000000\", \"prevouts\": [\"3858210000000000225e202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b118a16a7c37649018445f821f07443fcc9bed7e28a4df387e18cbfe4f1ec41ba81f27a4055bdc437628c8c6f9c25381e0f582bf5b351b1c66d6d310404a4c07\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36cefffcad6493e933315f78db381ff7ecc43bfd",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6d00000000c3f473d5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf60000000080c431b7017add220000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796f31d0d46\", \"prevouts\": [\"61587600000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\", \"76ed4f0000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"fd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e850656d0bdb94b88d381f7a82b87984f770e250bf999894456706d2524183d15d62d72dd1cd8804fbc0be1dcf6a22214dbfb5210e6cde6f2a41edfb954edd50fb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93648de95c4bfc2b10e0b5b509c1c28dbcea1b51ec6e9d986bf948a619cc01a5e2a50656d0bdb94b88d381f7a82b87984f770e250bf999894456706d2524183d15d62d72dd1cd8804fbc0be1dcf6a22214dbfb5210e6cde6f2a41edfb954edd50fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36db1eaf5e186f36042dd8afeeebfabe675c620a",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5f00000000392891fa03dd4e1c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48725e0654e\", \"prevouts\": [\"98d21e000000000021571f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bc14b9cc54dcd0d113ada2eefbf6fabd4511fcba5923dff3c44b88c1b06bddf574cd80d1110e2cbd1bc459f4f3b0bf4b81ba3001b188d703c2400398343c347b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/36e7b1c9920f0e9a7c1c52c380c61f6b44246ce8",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce501000000881946a160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270870000000050efa3a7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb100000000ea994684043ae79000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487046fe641\", \"prevouts\": [\"b8fc5900000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\", \"d298100000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"290d290000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"e07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366a34314d49dd780a407fa75b4326be002152b42e0347e780a2c6960ad067bedf3bc00f369fc994f47536ced64d5e4f722a68c2ed1128957c24de4b5158af0ec63ccd0bea79832f66dcec0cbfd0592e3eb2d999b46ac697170d667eb8939a9687\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fd73d9d375b530aa22fee240902ecc7793689bdebd58e9771ff3d6e92b1aa7f5c13ccd0bea79832f66dcec0cbfd0592e3eb2d999b46ac697170d667eb8939a9687\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/370f93aec0042473af8eda625b8e55afa266cf0a",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d4010000004448e7b2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7e0100000089d641a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1a0000000083a09fad0354caca000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acfa030000\", \"prevouts\": [\"5e70100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8e686e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d1414e00000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_79\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"68e2f257581e84c6f9db8e854b0819e47d32393ab66b3d2e241d05dfe5644d274f787cc0b514c60657514693aea2da275941b2656801468ae0f76b282fca837502\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6cdf3a7f7d2142f98f64f3a1e1a2e2392a4b7314983aab1a2c95ea317742c0333168797dfb82249cc68846b2b8a2bba88de4e932a5a60ebac9d459ced3c8dcd679\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3711e5aa1c94f1b0f835504e4dc9cfac933f247d",
    "content": "{\"tx\": \"7f02f66c0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701001000000807656f68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43a000000004a3e6fa701c6143f00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acd3010000\", \"prevouts\": [\"bc16110000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"a79a400000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090238aac846cef107dcfe5b06d54f7a835f803b8f46e9bbfd86772e71fca902bbaef77735fe5859ac6121d74cfb39179104ecceab851f1b7aac77d10ec2c713982da98749799b0a605fa46aeff5b6cf7705a70ba64133eaf44a2723dcb162d2c8a6bd696af167c2a62fad5c89d3f27ee0b5a5ac111549d7a09c84e7ec84a6e0dc828bacef37a198c4f10b47b0be848d318b02aecbc2a49ddb9063a855e1a8d04101eae0154d5d57af82f22bb1ea2ee1b98131867e796552145f42cd26018f13eadd2c8e0785663de4caa6f8f7a956712cceb704f4b39d5621bbde0c85e1b6e56b96c826e0b5f5d6303cb9c5e9918551913bd26ecd7b77d119d5985655ced9cd8abc8f7d2b7162eb8dbdb504c3afe009ce8e010fa2bb58d136094f1a955968db6f563c8587d8d1eedd183918a6fa2e0b45b2076d3eaecf49ceead718f6315c2f9177ff62f9488478da13d6ab1eca9ee10dc36b875b807aab1b8086aa564a39e2447b233133bfc8438da324c38c252f2656951623ef0d96cd8c3e71f7b5df7816c96ed987dca87c955a1ab9da9b45208e24f9d422141b194af646606209b0a7cac9b3e640760ce4cfc6cd40b0245825cd73e47028eaa55953680728c6be7395ea409248d069170a6106da7351f3dc37c3ce475d0365b380e0d6f50aae1f37324b5fd3e500766961a3e487db20a19844639df06065c9c22bee111599978607db5aee0b84bc90f821f7eec7157585\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93655a6e6bedacbdfd967c24f4020a4dae166c9c259a03b3ae16ac1a87dc32929381ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045952384bfcd198c969b60204543b8b578741ae3068409132e955e5c7af181f3d3734b3a7050eee065844830ad8d45a710891f78004f5e7f35b8fd72bf3ee94449\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09020a3ca49792f29cf339b8b3a8faaf531d4c2380b2466dee6102aff920557b65a1adcf05f51430b694be7045ece13921851be291038fac1ae725fae16218a8395489b659901af584ccd3fae26b52119d7395fd03b9573f21de0e4ab692fc935defdd8a8b510ecf405dc4112101ebad92cbdf603c211fd95cd9f12c1237228a37236a414f62204aa9125fead9116dbfed6f162712f9a2af18c9331ece4814db23f9c0fcc717581e62650dbb8dd85c8fa667416ab73f932a83d22cbcb9abdb2a49c84fb41ca764f1fb89628c3b7e82a39df6a12b9fbbfee836cd66fd1111323afb155ca7a625bb59cd3c0386c9bbb0d1431b24281500b89b0192240b61188c052a84265904815ac5447b7a56d368da651ebd6d0fe8ee39c4c655b2a997071befc5282c806e9fe3abcf8066692b8fcba4e12d3ddaf40ec146855c29d86ce1c765348f8d95969f28c9a312b44c61ca29d7ba97aee06d4bbb74d3539441417b29ff9e4d965003d1ec5118f2cfca86726fa8b0cb4eda5d730b9633a5c5e822749832699ae95892bab2cc6d7ee570c6963c1b04e776db2b1bb6ba1a71336df225e58de6efbb786989bf34ce30b5ac8340e521cae7c1f43d638ecea3d3d4de6ec90107f844919c4103f486be7ccda29866e4537e62656b18b1345f91d2708d158f0d7165a26a9913874570728d95c087b072e1b936743b0c85c1be53de3a0051c0404bb813c6f638cb56a42af77a7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cc8c0c7594f9800c68bdab4939f24615b278fe3bf8441cb0c501e2d28dbdb31cd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51f1361648aec2fada6693d9b39e398a39a20a7ec02f5f37d94bd6d3a28893e48e1b6e729898dfeeff93e2067a7d076aa1bb7914d367b163cafe54fabf88cb14d8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/37178f03fde09a06a32ec4e778874ec6ff11c8c3",
    "content": "{\"tx\": \"56711c2a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b55010000007a913ec4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccb01000000598666940321156700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac6c010000\", \"prevouts\": [\"f4382000000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\", \"6595480000000000235a212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"11a3d09719fcca2565f6327fcabf0ca212fe094dce436586689b4974f57f1617ccb5deae62d77f37fa23314a360daed67993799d4f7c07e68efe09d1c52fd2e1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3722cdc62a8920daf88999d381d42a7424417843",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c98010000002f66bab2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9901000000f66711d4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf84000000001a4b64da03373c3901000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac8e020000\", \"prevouts\": [\"d1295e000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"7c9879000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\", \"e9a063000000000021541f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8ebebe2a7fa1a40637b1d39a565324cbb6d10bee6139bb959795df334617057c6e72ecd601dc2b3ffb697171f3f7e380b907435292fd3efe07d08431bd0845e6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3745a800a4b496404473a26dd593f84588194471",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701e00000000c57d4392bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4d0000000052ad4c7c030fba7b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8b92b750\", \"prevouts\": [\"9f611200000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\", \"65ea6b00000000002251208b7fe9d4f09d2d8e7a4070c707b9c580ba6935dccb7bf02b3c8420577f22e1d4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900453e4c13dfee647a17f9595e8b3c65969e7c880cfffed6449fdebc16325bda3bb094cc415af9f84001a6feea45646803cad285186914838c4558edfc97d3166e78fd4cde6e083ceefa41c970e7ff247f88d4db270a866c6958487024deeb358702\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361516cb28afaea3109ac1b2a6be9ee9c1349c985ebc1f094f91933a3c30e1118979a506f75037c50a9ea9c509d8c41e46c95fdf651773b41e5feb3da8f515025ffd4cde6e083ceefa41c970e7ff247f88d4db270a866c6958487024deeb358702\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/374e3814357798251b0430dc4cfb9f212c1dddd3",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706c01000000ba310ba08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41100000000bb14c6b3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b42010000002e7adaf704ccf9680000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987d84ad23d\", \"prevouts\": [\"3b2c110000000000225120e0fbe9053c6d2a439b1df3d9c89ed0e68b8279a92dae6907e23437dbb3b4029a\", \"a9cc330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6891260000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_0\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bf547b49954bc50d0726baffe4902a07de414bdee0da2e167e9afad61312c1f45a986e2212a999b32a35e1e8cf7353b8c6d8e90b0efdebf9415893ea2f7ff7ed01\", \"057e4421e4452c4b7f376dcb03157853348c23cf7b32b1c447a60346de45229034e56168d2cc2d47a1162cda1c03108db0730de5b058866954418c066bf059c81a5ba2479a9eb079ad0038f0350648\", \"753535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a26ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93603873753c288255b908fdaadf531bc1d68ff88416a14514d21f880f381496ce6109f3f9fed7a7850479575fe09819c514312532a101591e70b3ca7a41015d315abb6d11f6afe1d94d9d9f8c365772775719ce7effb301ae3ad4c4b3953942c9a173da251af8551a60e870972ffb93c31d944da40128e84f75b2100254c09f1b4de06e3cd6f3b0b209a8fe563fc0d7d5531bbe10145b72019ee6951325ead69740e6aa5d2a3313b034bf7c50dc92f197b6f924bf5d188e80f7e83cc6b1df9a9200000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92bc58659211a4beadd8fa11a9845ff332b73538a93df84322b83e2be6806aec4a61dabd15e7c32b6ea531d34a692667bed8d7204672e2f2f1175218c050f78a3171dc5c5350b795a66ce38c1722adcba1fc40ef925faf53527faa391efe98bb3a827d6aae010ac333a59a738f4411490fa0ed048e3c7afb8a22b835690661deffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc817f1a371e950a12722586a5229873fcf0aed07489c9e7da60a05e7299def8194ed79115f02ce018b07d4bed9adffd7b00af1ea21eb1006ef232ab168648ba44c4c1787758d755a6445f19dd41348f06ed1b0f8a96cc9a729e5fe6ebc20288a3a2bdda781484822fd984a6a476ae7a39923a558edeba7b039c0d3c8536b086e0000000000000000000000000000000000000000000000000000000000000000976851de7870b0dd0dfc5cf582c477ae966ecdcae30037866fd3d0fd03f206e173dc23d909d6175f94b12ab45f393f9fe7a6f3281c8997a9ae1bd4f7db60083c4eb455c7273b5f737b59d0edaf7c9e9cb4a21445e45d447adb0b9139880e08bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ae5a10d69adbf68cf45d94a7b63f55ee963a9d6bb6dfbb0ee85755a753bde2b5d299b1ba4ccae6aeec9e68e19e2fe8f4070fba2d6c319364523390600be50900718f0e3bc67fdfe6ca4a65a01208d4725c4d9dc6e4c76e45eafc218680aeb39f2e83e2744d4c42c6dc631532134ce32363bdcfad46e7021c6ab562ad02e139f383757a2116a3f40f905ccca878b1151065c4304d44d7214775e69609d520ca72461690e1391a8c20a93f0aa34b30976882eb1aa32ab6d73c80d9cec2dc39c1aa55fda5fd77e4d7054b3d01ddc184a8a78b5d438cb71b048410f6673f5ed219fbdbb454d8a8c8facc9f3d363959565a3c3ca6c0952d6b13e55d66c0853030d9dbecbdded1aa2df877d9cfa28926ae570873cb1f411227d40f07bdd07803ea1b289167b641608c5b160857f960f8f014662a6455b25d4e20b21aee6545b5dacfcf1cdb5a27ec69ca29264ca65fb287c293e794fec15ec0cebf88e6eb59f062821\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bf547b49954bc50d0726baffe4902a07de414bdee0da2e167e9afad61312c1f45a986e2212a999b32a35e1e8cf7353b8c6d8e90b0efdebf9415893ea2f7ff7ed01\", \"3436c6e08ef4187db8091d942d4aac3619e3793a65bf66e411cfedf9b9dd145df699e5f536a0ddf39c4a754d3c5a74c5db6445381f4ef02842e426775f7fadb1f6d8e807ac8595c61760d5055d2c\", \"753535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a26ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93603873753c288255b908fdaadf531bc1d68ff88416a14514d21f880f381496ce6109f3f9fed7a7850479575fe09819c514312532a101591e70b3ca7a41015d315abb6d11f6afe1d94d9d9f8c365772775719ce7effb301ae3ad4c4b3953942c9a173da251af8551a60e870972ffb93c31d944da40128e84f75b2100254c09f1b4de06e3cd6f3b0b209a8fe563fc0d7d5531bbe10145b72019ee6951325ead69740e6aa5d2a3313b034bf7c50dc92f197b6f924bf5d188e80f7e83cc6b1df9a9200000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92bc58659211a4beadd8fa11a9845ff332b73538a93df84322b83e2be6806aec4a61dabd15e7c32b6ea531d34a692667bed8d7204672e2f2f1175218c050f78a3171dc5c5350b795a66ce38c1722adcba1fc40ef925faf53527faa391efe98bb3a827d6aae010ac333a59a738f4411490fa0ed048e3c7afb8a22b835690661deffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc817f1a371e950a12722586a5229873fcf0aed07489c9e7da60a05e7299def8194ed79115f02ce018b07d4bed9adffd7b00af1ea21eb1006ef232ab168648ba44c4c1787758d755a6445f19dd41348f06ed1b0f8a96cc9a729e5fe6ebc20288a3a2bdda781484822fd984a6a476ae7a39923a558edeba7b039c0d3c8536b086e0000000000000000000000000000000000000000000000000000000000000000976851de7870b0dd0dfc5cf582c477ae966ecdcae30037866fd3d0fd03f206e173dc23d909d6175f94b12ab45f393f9fe7a6f3281c8997a9ae1bd4f7db60083c4eb455c7273b5f737b59d0edaf7c9e9cb4a21445e45d447adb0b9139880e08bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ae5a10d69adbf68cf45d94a7b63f55ee963a9d6bb6dfbb0ee85755a753bde2b5d299b1ba4ccae6aeec9e68e19e2fe8f4070fba2d6c319364523390600be50900718f0e3bc67fdfe6ca4a65a01208d4725c4d9dc6e4c76e45eafc218680aeb39f2e83e2744d4c42c6dc631532134ce32363bdcfad46e7021c6ab562ad02e139f383757a2116a3f40f905ccca878b1151065c4304d44d7214775e69609d520ca72461690e1391a8c20a93f0aa34b30976882eb1aa32ab6d73c80d9cec2dc39c1aa55fda5fd77e4d7054b3d01ddc184a8a78b5d438cb71b048410f6673f5ed219fbdbb454d8a8c8facc9f3d363959565a3c3ca6c0952d6b13e55d66c0853030d9dbecbdded1aa2df877d9cfa28926ae570873cb1f411227d40f07bdd07803ea1b289167b641608c5b160857f960f8f014662a6455b25d4e20b21aee6545b5dacfcf1cdb5a27ec69ca29264ca65fb287c293e794fec15ec0cebf88e6eb59f062821\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/375599a0689231a316462d64f42ec6b33ccca33e",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be50100000063a870e860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705a01000000ecf01f0a0126bd150000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c32f391f\", \"prevouts\": [\"821b2600000000002355212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"050211000000000017a914a4e57198280c195671631f8b9014214c2f083b3c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2260202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"55db540a25196391be2d65ae0003c1f649c60f07711f400f13c53bae7ea5ef0981d564739cece5df3646e9f1aa33842655e984da96aac911801425ddaf0cec6b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3771c3d9e542f846b3c206c6719246bde5cb472d",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf49000000007d987b7260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270eb000000000aaa262202847d7500000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac22010000\", \"prevouts\": [\"8e0b6800000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"b7e20f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f4eae6bd6f52ba0e132a99199dd52ce9219533a45594ec0ae315984b9ce8f4516684d91d6a25611b98f9525cf8030045f0e379e1e6360450dcf32f11d35fa349c2fd9879a2ee2ae7d76224c991edc718b1729f7f1922f570a67a21926d2cc48d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f46ef7c73612c270119b2372d340af405f58d8345e16456a531c474619d8ce41fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e26684d91d6a25611b98f9525cf8030045f0e379e1e6360450dcf32f11d35fa349c2fd9879a2ee2ae7d76224c991edc718b1729f7f1922f570a67a21926d2cc48d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3774905200290499adbbac9b674c43b82c3af04d",
    "content": "{\"tx\": \"5fbef0bf0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e4010000002fbbd3ce60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702400000000b17fc38b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4020000000022f32a9201149c1700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac6691b05e\", \"prevouts\": [\"0bd8110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"02e3120000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\", \"37553d00000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_b1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2ce88883ae23b521d480265d741aa13b4b99b2c417116be02119435a96e0d178b86c39ed0c550f3362b4ad4212bef0b2e0c1f06cbea9c9c12ce924a65e25aa4881\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"62b0ad91da6bc00cc47a6a7b5e44ba05b57d486d00ea2523ca960328e47b22c8706f48ee3dd242341ba5c1c899ee487160feab52e87fa32c3f8a03dfb40e4735b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/379b89135a99972794096065de8e1072473b7cdf",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b700000000eb5b4d300435280d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac97030000\", \"prevouts\": [\"5624100000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6acb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5112ea1c769bf4ed96f58121c83502481562485a40fea0bf2693d01f3a88662b8b1937db199a07e1996385ab03857d8e2ee63e136796e4b408281aef544a937c0c73f74a88798a5fcf30fd7aa5fdae43144d667a238076c6d52287fea96c6e3fd1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93671214783dac4295bfd807e673d52a384d4e362b63aa9a14af3c4920cb220748712ea1c769bf4ed96f58121c83502481562485a40fea0bf2693d01f3a88662b8b1937db199a07e1996385ab03857d8e2ee63e136796e4b408281aef544a937c0c73f74a88798a5fcf30fd7aa5fdae43144d667a238076c6d52287fea96c6e3fd1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/37a26cf98e0cb201f2e241d6a41e267821078fc2",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6a01000000d4b6778c01ea400700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac3942b943\", \"prevouts\": [\"a87e280000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"d67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb1986d7e8e27273be987a3f59c249d736830c7b6f9b487df38f4ee68bd2c5d06630d95c26588949f1b3ae4e4e429080b434b995fa18047406852c727cd9e6feb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93630ca117f3a3f5d0edabc733225eb4a624a098c8f44ec26e7a92d0c8239372396e4fd5de156dec52418d0df8cecdd3495838e4d1d1b80598a34f381ec5024e2c9bd0211bc754da142cb3564162304068e34e33074851a6380a45a2a3191e3f102\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/37cfd491e753f20291c4606a4bb007cf1aa69eaa",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1e02000000912e21dfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9a0100000031b47cf98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4980000000092ee46990448da0101000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acd8010000\", \"prevouts\": [\"ac7a4e00000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\", \"3b7a79000000000022512065eb0ad8f24d6d8eb63c7f85eaa52926e45dd0588dc97971df796ca5c67918e7\", \"18b33b0000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"ff7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f59f882dcce043ab5273f79d0d152c35fae0f251a6812c7f2d3daa07c20029a516c082ffd0388de178727289f9edc245ed8244bc4e4186d1c7a66ea621fec0ad\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362bd3a471ee044d9d1aa58d9f4f966cc5745c7ac5592ed682143181a0f47efc0bcba978c9f8bb8ad08bb333d68e8bfcd03859985a79755d391cef5d6f406deb57187b9e30f7e626b28b6dbe2d7b101f74e326290698090dbb0a7eb7a50daae87a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/37fdd34d221df947a4dc6a40f91fe044f88c8ca2",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c5000000006242d66edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd601000000ddd1212b04e58899000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb2000000\", \"prevouts\": [\"26f83d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"36595e000000000017a914856f7c6a5a6a1ac0e553b769a4c35bcb9fb6f50287\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2353212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"20b89804e90837e9dae02d7437fa3f983016fe8a2e1e34e1bf5c5f8b58315efec2c51214a9a3dd71eb0d1b24b1cbd3564045a6b128679dd391a8647ac3469548\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/381cf7c5a9c44f989bb97ebca54137b24a0c5102",
    "content": "{\"tx\": \"64c16f4c0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700900000000414b74a060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700d010000005c64f2b20470e81c00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc733000000\", \"prevouts\": [\"d259100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"40f50e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_54\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5439d7332f467f04095a4ce246f4a56e02d8d830afe42a61b7b5b06e6b2f4bc600fec9385c9ad471c115b070607e613deee2c0592220f954a84827b42f8904c2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b940d74f3172475f5b8173d396b319e2f9d669d27321a5873b5b33d83561112ea32d3f55495b78d3e199ea220e88e46d7583d4888bc892e09ed4d3fa000d976e54\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/381d7b2c554124f48f833d5bb44cb65d6a4e69ae",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfad00000000a2a222a28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40602000000952b84bebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0c000000007b93a1dc01c8cd08010000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487078ca733\", \"prevouts\": [\"be076700000000002251206e4088e3ab3053e34fa9f42678349f51acfd745de3b6b8ba599a97db56ef8c25\", \"59dc4000000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\", \"0d6b780000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"067d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93637a925bc8f704cad671189518c9abd151e4193d3e419ccb499565ec7319392f89a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ed1973e93f7ad3f562801731a237f358bfce42fb636b2a0dab3a823989e87b4ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2edee9d6f4a8cbfbb4a0af0dddab94d753895c3cdd7995db9d6f3e266cdd0bebd1973e93f7ad3f562801731a237f358bfce42fb636b2a0dab3a823989e87b4ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3849d609dcd2299e85caef8d7aaf0dc4cbda60ea",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40f00000000aee490c3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4b000000005f173cce60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703801000000fe1cc3f8014c7b3000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac9c041628\", \"prevouts\": [\"5139310000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"560c2100000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"d2ad11000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"557d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366b85439bc36c09324b2f69ee8bbc5e2d848c6dcad09b29c0021348708068368e9c6f5bbec45690fe95363697d7c9a9077046b35079592ab1dc3c0638990956b6a4c5d50721208c85113b157b4dd4688510f63bd33d4c90ece0d9e0afcb8224b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93651741a4e3e2a3e44a80e6912aaf8177301e30f939f3b8b538bb3a1c1c4af3209283c6292a6ae3f7cd2fa90a42d11f5a54bea63a95cab37375097c35ac3f3911dda77d1c2cfbe9569ee5db2c51580a9857624040db9177af617be0771cc5b8a1b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/385fb0d2eeda5f4790eeab09a29ec612150cd115",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1c00000000addaa5ecdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0b01000000d5f25f580315f46d00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acf284905e\", \"prevouts\": [\"41ae4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"91ef230000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063d168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93686e10009f826ae98be2091575903ddf7d5bec40ff77526fea2822b8bcaa021aa41d10d6c1f57e693407bbcd98ddd5bf64931b5565c89b36e50f161e759967c3e172c8da9bdd43b70cbab8912ef1aa7926e5ad7e47a4f7b71ac936200cc947dd0f9b27230787fc79bd718ce7ac07558dd4f31dfc3ae0570acbd1df01407b1d4ec\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082716f66701312fe6b613a3a288c903128f650d73beac5c480044fdeaa8466574a9dac82751ef42f4155e8d0286eb609cd4bc8c8b3be93c107754fe282612bb362f9b27230787fc79bd718ce7ac07558dd4f31dfc3ae0570acbd1df01407b1d4ec\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3862864a68546884d4ae2ef7644d75b814fd279e",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6d01000000b06dc58edceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4c010000002a7e2e9adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc90100000011c898bc0363a0a1000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a663000000\", \"prevouts\": [\"3c7c220000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"23ef240000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\", \"d7255d000000000017a91498e55eac47e04767f832d50008ff18559102c9e787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364e1c80865788996a05c5a9f6b0900b0096f6056de983ef887886ef5950a10b0c0d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3ab0398bc4828dee75def1007ce877d708ab4ca86c9734bfab291d4bd05bae3eec1a6e987e7baaf45cc4656191a1a193c7abe05aba02d24b24cf2747f96e1d33b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4aede7f6feac32430a03a6fb4ca18c03b66145006034584e3a19904465ea1e66424cf807c4b041deab506320299ff116921971164ef72b2742896e58a89a98f91cdb1729650f5e7315a74782ce14a5f1169946bc7ff3758bb098f0ad0a25b2b7f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/38633120561625bae7ecb1c951acd585717ee56e",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b440100000090a859b3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf91010000003771e53e030b83950000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87d8030000\", \"prevouts\": [\"0817280000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"86656f0000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3044022034335162d737f158c7b3c25f5b5563228f612a7993a0bb0106e6c330fe32e537022004e8ceea10ee54e560a6c6f44459a98742d29a9cae1e7046d27a56836e997aed01\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100e78e92208d7cc2b5a9773c800e825f7ffc0f76077497e7bce6d279d89f75387a022018496549e67be8c0892bc711eeaf089a7166ee2caf0684f3a72e59f09c76403f01\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/387db60867784e48a23882557f34fd3e8df5fe60",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b340000000077941edf0434921d000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d3ec1d3f\", \"prevouts\": [\"8d7b1f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_1b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c5faeb9a347692f3a996631d94d3dd98f32295ddb59104cb542ed4f87b30b9a9d759815bef1affdb5bd2c312d659ac5eeb1fc69ea98787477d5ec772de0a113481\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e36505a5b181292a8650bca5ea7be6bee32cd9a15ad053212d1dee15c825ea1736a5dce27ff6ef989e028d31bd4b2ca27d54484fc7537c0446c34acb9cba871f1b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/38a77bbe28f3ce750b32c16df488eb5970d28d51",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ae0000000047920cabdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5301000000a1ccabe104ac0f5b0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac9e8d6f25\", \"prevouts\": [\"14790f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"910b4e00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_fe\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8ba0e90615127c5d9ea667a5ba5c26b9f66f237978ad352924773ce4f1ebfe070d43b0ca019fbad9466159f4ecd21cdbd58cebb97d1f64945fdcf2350be04d8d83\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9bdb91e89dcbfb39b42a321d60edbb8319f12d05f9faa426ff7badfde3ba30977fcb1128f80e3fd4e90d401861bc4b6c4c85aae92226ba310d49fd85261a7f61fe\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/38b2b86e0814487d32eb0a49aaa091c527c67a39",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf0000000009f8bce5d04818f1d000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df9797223689872aed5655\", \"prevouts\": [\"f2921f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_d8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2aa16639104c78cee7439634edac568733e8bb275edc2ebfc43f6585b5b909bb413c02e57c3b029edb3eeddffbc9426a31f9b0c92cb8db331fd35df209edb1d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c68a740536f42dd9506b682c99896b8c2c5b85fe2341890dc9ebd9a6fe897378677f0c4e15efeb53375353f8a1d9c6583bd18c6d7fba3d92b7deaeaff5faf680d8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/38b7d993272a54c03a7adb7a046e8485546ebd0a",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43b00000000ae08b4eadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c51000000007a44b5c0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b640100000061c4ffd403bdd4b60000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac57010000\", \"prevouts\": [\"f0d03b00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"96d759000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\", \"3c68230000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a8d\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f9b0461d232ca8cbb85f9cff4edce544795cd9e38a4d0e90220b3cc21716164820e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1b25240bc46c035392207c1076e816011b96fc57f286e81391f52d072a1ebea8b62cab3a6172a7c832406474b8da3677455d75595a690190458c84d19d8a3ecc3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb488d314ba4ab03912e470cb461a645c9914779a4907e0bafc42fbc04fe8b44a37185c953dbf0a33402e724bbb72e47d874a897a0941d53d9706dc82e2e14efc19f43de7556260bd81909ce9fa765818ab5d5ff32210a0a876b048ce5ffdf4a21f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/38bce0395152e8d2a60a95b4642bf3700934e4e9",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f80100000079124b848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4320000000067ebebe7049dfa440000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a666010000\", \"prevouts\": [\"2ceb110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9c753500000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ed\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9274ac3e0212f0c0646326e538e9bb9746925b878e92d6ef93ceffc41a6bd160763e2f55764446188879bfeb643cc0328d99caf8fa2e628b62fec59f99c8fedb03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f3d479d4e56ad59dec938dc0253f1dd338753b740fd1f9c836f4fe34b86139c9a255aa3f21ba6fc48bf682df4af4f2e0926dfa53c82f038fcbe6eec1c6560afded\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/38cd5b3045252d1ad4ff3cad40d838874891506c",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705e000000007f3b89fe60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127009020000009be7daae0426b41e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7968bbbee5c\", \"prevouts\": [\"67bf12000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"58640e00000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"4730440220543ded75984f10631c547153e668339318316b46a6acdc95b72565db39cba06102207bd76bd6095de8a6d7d49abc9874100ad9c264dab5e542aff87f9fea8824389f822102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4830450221008e236e8514424afbf80254518324c97bec4a1c1d931f1983b1db672606f3981002207ea1ba5c64fd50d1b4e97d729fe5a0cf08253ea0f7c2480ccb11ca60ae682bd0822102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/38cf290b09eac905ac4bdc5ffd7fbeb55b28d0b1",
    "content": "{\"tx\": \"a804d40e02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b96010000007c2543a7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfb00000000e7fe5fb603e9bb46000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79609000000\", \"prevouts\": [\"332f26000000000017a9144370350f30aa8f875e3d2a13be81f25f19bf1a6387\", \"6b2623000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"165b142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"ec464e0adc042aec0c2faacbf02be14e36edde4da057690d617cb47dc12d8b7ba4531947887a1c1a8f04971eb2b5b269db89a657828cdc1823307d26652693f4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/38fa5cb2147069b9e33e21d621935d45486c5345",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9b01000000744771be8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40100000000c8bd0fb801d2b675000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87c37dd022\", \"prevouts\": [\"f61b7b000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\", \"8dc2360000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_24\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"199a4a926b83803513647ea69935f13837f11bc1a627235ff4df4609f3bc7b25187093e20c26621b83142edcad4473094b6bc3e7e566975c20b7b09cf23ce4ec02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"11857143302617a4e0e926197b5d993695d4ab736d03ce678f550cceabd099a4fa044e495fc36a0ae89b476a2668705dddcd95435b05dcf9ab2175d4dbcdf04424\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/39016f47ee6449811c8a18548ba14d36d60f1a15",
    "content": "{\"tx\": \"85324522028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47f01000000b61021addff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4e000000006b4b3e8303a56079000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7cfcfce3d\", \"prevouts\": [\"153b330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9946480000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_d9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b58ef2299b49b53498f3dfb343bb0147fdfdb16bd8f72099145e74a58299f7f28aa78acd40e2ca3fd7752d6b8a4c6837804f400f27b31cf02f81d77c1c3c70f403\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"12c9d1142090c955e04a1e837957073fbf4a1b811b4103f6875742b7efe793ff244c751da96c6c4d7db0561c824a216d184a26c0bb4fefadcc05b2f04a36b64dd9\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/39095ad3e086951d38e9de71ed6390bf4a910ada",
    "content": "{\"tx\": \"5212986602bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe100000000b6aa49efdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcb01000000fd92fc8b04ca0fa200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acecbfb437\", \"prevouts\": [\"7f66820000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1060210000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_4c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"918b36466f94075e9be07c490788ab309ab2b31ef7692a2579398980edfd07c42cd18bef348f9a554c12fd8e2d95aa197d4f226a507c5b41d47af8db260ba326\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"dbdfca1c96978198be6393361c25561d12cc32b2eb3a2f69da676369f104f6281a43643b74dac99c0c8cbe3d234acea9d21fb67d650d6c7f60e1935f3e614f1b4c\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/391ae71a3b29dc703963bfe3a4d96555cac94848",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf00010000008635effe02de03710000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6bc000000\", \"prevouts\": [\"aaf4720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_47\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2c2708559a3eac7d1c852c6d9edb35e6f356e28a50abd47bd49df6cf6c68173b278c2db69fb0762f2a08749e634024f08a177f02bed811f322990e047717359602\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"27b04ec8efc1299e07da1299a63a337d4e94af12e6c97e5b067c59f88a71fdcaf411c75619806c1ac7f4dc2ed22095c97ae4424c1db8510efe547a7464349b5647\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/391b89f7a6069cedebf4da40cbd2e894c4e4e161",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf330000000056a475b2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cba01000000746cca94dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cca00000000ed67c018043edd1c0100000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88accb010000\", \"prevouts\": [\"e2be7c000000000017a91441ce0eb0e6e5800ced23a872818e5aaa63be0d5b87\", \"3be74d00000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\", \"38fe530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_d3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d04ffb72469ddc66ae082eddc4392c14d71e085d8ae83352f9c37ef680d0d7c04a059b4b5d64a85511f4633d52ad3ff4e608962a6bfe962b3f7514aa8dc5540382\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fa6dc37c2d78322782f92650882c7402e3ac4056be9adf851c3adb5a3e1c7dccecf623a09bd1c2efef20793d0691a8f0e18d079d014130018b741a7e715d062ed3\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/39261d0b29bcefd21020cd2c24c872c070c66ae7",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c730000000007e7cb39bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4a000000006802958d0482acd60000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac15766851\", \"prevouts\": [\"4500580000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c9af80000000000017a914b0b53ba433a336ced94ed75e23248458a1c69fab87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_4e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"76b51f7d8850e815a2f29a132d69601c7c9ed5b7a71560008d7edb776cf04d05d5d11d79e9e5c1c0255a60a72f9770f3ecc3f21e1f38d199448c97228703abf602\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"813e1ebf75e3a78dbe6c55892a1191280240a6f802a60f2b538e5c5cbe99b3890572000bdbb583b8cf2831fe4476599330ed9294ce42cdf139b46c28ae9b166e4e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/39427d9b3326e6d242f88c30c5337e28e60ba2cc",
    "content": "{\"tx\": \"ae141b9f03dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bab000000003d92aca3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0d00000000851034978bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c445010000004f05579f031209c70000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e741700146\", \"prevouts\": [\"27c222000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\", \"30c5690000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\", \"23df3c00000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a8e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ec5722d02b8b9029442961cc3fd9a7a94721ebefae4f707bcb621aeba142f8aeb7a2231cf916c441aa882850e5209a465c1bf953237149df21eb7dcd7136fa198d550033184c6424688af85d43f5bf525b7f6d8111e731f6e2359cae2801b117ed4b6001a8fdeaa28275cc8a939e32dd3c3fbbfbba5c677bbce429d0c1a1675d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1e707b6995f8993c03f45183b0bc1e0ebe72a0445f3f0cf57f2d95712f279e1c2be0cdb6e99edcfec16766ec5847d1f54ccd051e23ee2b2272cffaae333295d1b30b2981ae69232c3f6c5ff759e9ad4102f31f3fc5e7a3a4ffd34dce2e2e06026\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/395284f8211e771929c6abd17a1e39b471bad2ac",
    "content": "{\"tx\": \"543aa354028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44a0000000011a31ca4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7401000000580331d803fd42a9000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acad535e40\", \"prevouts\": [\"137f32000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"1a62790000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"d47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082b93338c7d107e01cff6d052285c57a3fa3547f5f14e99776c0371239cd8619173eef830f28a0ecbd34c70640f7829eb7d86b0cf2da24853f16b74ab53bbfd728ea84370bdaf8fbfa2c728119f306db95ff534e2e627fabf0c000f69380d4e93e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e3e1af50e9fddc5b40f5692067c8c7b9556942ec16723cf5c6b37b54adcf255bb970f6251c63bb7d52d2f522a2f2041b3457429d11106abd9da97a7fab7a15d238c2fd1368e2cc97a2933efae2d13561032948a77b2cd5d87b5e0b8010cd9f32\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/39702f9a29cc5985ccdbae18da3583e3a98271be",
    "content": "{\"tx\": \"c9c8ae8802dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1d00000000fad144c4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9c0100000062d84ea8013cd619000000000017a914719f78084af863e000acd618ba76df979722368987428c8e4e\", \"prevouts\": [\"70f55500000000002251202411d699451e61c2ae1e9b07727f82864d3d401db7c2ec25b77e3a65ecc346bb\", \"fe6e240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ca\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ccfa4da731767429392a91fd269dc432b468f89fc9b4b5543afb9aa8ec596ddf03a339bad380617e4c1befad93475d6c0938813865aa4ad6657fb60c902cfedb81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"768dbee09895e6c1d0577e8be1f8677fcbfa1129e799134e2bac6ccaaae02573c177af4a7c3eed92dbc70bd8e2f072c0da227d768dd37b26c1c7bdf7365b1e05ca\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/39a530e81b2ae6640a22eade59df3f302ebb0806",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa90100000010059b838bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4580000000033dc898602dc7baa000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac08020000\", \"prevouts\": [\"31d1760000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"c135360000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100b718c2791c2badb2b8e183fafda2cbec3d198dcdf6b6a67e53351bbb2646fee4022049a083af5b7cbde125b03df2f12afb821cb9d9650fdecc4e618e91bcd88bf75302\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4830450221009742d27580e3aec93fcaca396886a5dae6b834799f783836a6905f8403e21a1a02201de072fc6889deb35d5720dc03f976a8430e57bd09c40b1f8c2db48e836dacf002\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/39c2d78974b78a945ee5325ec03d2a9842678371",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccc00000000943576cf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41600000000780387a8028e4e9c000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac10010000\", \"prevouts\": [\"a4b05e00000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\", \"293a3f0000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936043ca414401d02c8bceed194a0f5859ab7579e0546fec32e9f1c40942706c7e55813d9fe920e311eca68d9da8ac683d4c5ffd57c03f9174ce1b6c58fb2e14cca376e34112ab1bc736956b41978cebed690ad16294afa2ba0e9d8b5fa7e9f6f2f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d3c7e324ed429231bc80df899753efc8e6aec2cfa09e5404b20e527324b481ee2c6725dd4617fe2c0113ef50b93a252f15ac43c20ed2eeb851ef9070637abf4dac8db205c7d3bb0390b2e22910f5d1cbad00807eee3325f4c4e7f4412ed3064a1c25c837ec0a1f852472f3f26e6d49055bb98717b7b68c46cae1e5f9804f9145\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/39c6fd26ec7474a9addfe549df2cb8ee610ecb51",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2d0100000067095e1ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0b00000000b27fd181049eb8c90000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df9797223689876a020000\", \"prevouts\": [\"9d75660000000000225120de7c17758b854fc68d3061dec4ffef020214eb4d128d0a0aa1b6bff82dc51d5a\", \"f6a1650000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"da4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368d5de9338381cd304b2738c8b1f6fa31d15bcfc9fae7d40af04401c68f4d5de3473df9812949ea11fa7cd8f7a31f5257bc4998fae53c5743d03c7cfeceae664b355d713f01682c54eefc137cacda341f8a928ca67657dd1895f9a847e54f584f6ad20bb4e3465af36c086d3f45ee510bb6828f8cbf764ea9958c57f38670043d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367f6a5a2baa8cd252fc4ab850ea9e4cb81c048efc06f172ee1268b682f3ed0b1b1dc38fa67d6e370c9f405c2af01822f370dc317d6e78d2f71aa14f0ce4de56d6ee4d75780d36bffae9b56136e6d27c02b8d233efdc800bb260bfbba6a6f94b87\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3a48de373b5922e0287dcbaa10361aa1464b3eff",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c43010000003f472588bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4501000000d3e842e9032ea2ca000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac62000000\", \"prevouts\": [\"20175100000000001659142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"d2437c000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"91828a2f001425c1625387988a444090750bf791918c2207b1a3dea73b12df8da6bb09bc2dde7a967fde5f43a9deee757818cef0ebf7bcebdcb8a1fff3bcdb39\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3a4b7a4a72ab611ede23f7e04e2c7e0300d1c7b6",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8f01000000e85c06ea03f6e652000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4871011e341\", \"prevouts\": [\"4422550000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c94c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900453bd2bf476d5c79b80d1dc385df1320868058b4af6871225604d123c25805c1374cc0fc2e3b1a564cf058e89401e888e3d8222f635de2bcbc595bfcbb872403dfb24737b64a51a2c518aa096a7a1ea5ca18eed83cdd20aa73c19d83535c466892\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082d3c147557fd4654830368843709159d459528293d28ab2736e9587eb54fea08bf48725aff660a72fd31f8e9799fbe605d57d774c031cecd8b6989780acb581b6b24737b64a51a2c518aa096a7a1ea5ca18eed83cdd20aa73c19d83535c466892\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3a5d1711382ce031d27b85c9d0db96a8d322c0a5",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe601000000c65799e260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ba00000000d4786d82dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8f00000000fcfa74ef02a77fbf00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87d5000000\", \"prevouts\": [\"6bf861000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\", \"d5740e0000000000225120f53d4d34de47a5fffffaf2fc2c78ea776a7cd8d2ae45e19539d143c70b3fc5d0\", \"5eaf510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c0248df00e7a4dc0c1a55899dad6646a67c262377c42a818f3ac26470e7b94e3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a56616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3a8258d488d60df9cd2d2e0f3fbfda5aa2916b1a",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708900000000676b3469dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2101000000e54ad34c04af0b30000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac6f000000\", \"prevouts\": [\"d015120000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"65ee200000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6afe\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694e0e7acaac641668fc05305801328759974c78d394b9aa0618ae365ee981a7dd800fc56907ebb8e18291aa6f74a5d7a46b4d60066ab44c243b43072452172e3365bb68c3eae5e6cd9b20289e581f52d4e8c0cb4ba58bcd8be9e67bc80fb920a1e45c38e8a62a0e5058038ea76117f85fe5d704aefa5d806bc1a7cbe3a990946\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900455ba7b576a8dda08f1b482f8c289e95e9d52783e5c439690d7dbc8078ddf6e59ab44d8b0f62b2d27de7be259100200d6da1e5303b29f3eaa1b6a4eeb0c96a42f364ab0b66352e66b5bf600abf31d1005c5406f4575b339026213ecb21a668977f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3ad5eb51c8c2ea66907d5c7b40ef6cccaee711ce",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d401000000e688dcea8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ff00000000123c9dc8046d667b000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac3fb5d441\", \"prevouts\": [\"915f410000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\", \"defc3b0000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c6c67fc5db5a48a2d95838acbbf8c02666a57f9afa4a196d8a1c4266fd607a20516db74e79dae20b980131c66ab5c6b1103d5696c84aae822ea57ed7abba6df9c47c79f10eddb86c5430be5b12cd56fd72ed72b8e9fd97b27cb9d8794e4fe0ff0c9ad624fa170605f055a7e7fbd776e840af1d4eec99d8c4672f60d35ac95da2343630e58d0e49d036a3d4c9d64dc660614aa3786242cd0abe4e5b8c5de301bd99af384c5ecc823153c1606e81b61c7d31027375ed835726d4c754f4ffcf383b11d28fe5eaef856dca99fb118187042ca7f59e0195b603d887a814e7bedca5ddecdcef5ab57af375b6f50579acc4d0b5927db9b61a1f2c7d3fbde6d583d9677c339bbacbef59193105c5306550def281332bab47830626009563cb60164a1f5f71405bf8de6d69dd3349b1e4d7c5f9f162eb1de22307ecb9a39d5ba7ce03abfc178600a9275ad26a1ce43ddf70f6da741beb70154bec478a630e3c5e76560c66628d099c709af5e18677bd39bac44d435b0a8a3dc23bf7542271b963a0c934f56870afc62d4cc92eacd9f302dbe974b221d5a70b3d3158bbd7533f1063e6c96aff5e83c814e1bc9fa53e7ff85ee81ffd84deac9a05cb7be108ae7e61fe2ca80bb1e7f8e13bbc94e06cbf11f9621cc7fe532bcb12673a0ef50e147d8612e8048e30a420f6ba5b2225b033f2823300c438ea2e79a21c0ebbeb537507d49edd356511829fafeea17b33ee75\", \"227d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e9f2d7c582f83634cd135c0c41a92af063e6e0eba35e5b92273f4e04c23802be6b7b535eacb46044525b0033e262a0686af8b44a8254e1701bb4a9d0d605b263fcb15428af69077ee4e47ddc8bd2adcf7d97a29fc56c75a24a213a103a1e3586\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090203c94a49e5650f882b71a8b54b11d86841939712125f5b05d3ccdfee26b4c27dfb753ce79127dc1aa67b20a61753c5d52b70dc756138f22fa2e7c075e1bd43f023265deaf540ffb5051b07d4ce8197af06649cf1e587fe9fef4b0e2b60714f687de029f6a678c3645702d03d3649f313600f50d46809233fa1950d9a22f2a73182ee6969a65c23d509792933339081d2fc9e9ac858c28f6bb7b36a2c9f92289df76ce76dc13974c0cf9e3d3c10ee65f5f703a3517e9f4af94d0693aefd00ca3b5c69db4ddeaf232b25a0ca0d8f89cf8a7b4620eb8de35f631631b46e2947478bf1e9ec9c69c20868a2d0010b829df85848e5e0689d7b6146b4b376ab3233fb4ccf256ac705544c3d3e5823b817a4844cbf1233173e4d3e06d1af5714b473494e14188ec6a22c616f10a8f070c55416f55769638cb897345e0f963bc52f77a49e9109ce25da5950362f948f64b751f0ba748558b53ec42ba631aa20d09fd1b7774930e868ada2139848b649923bc857c292c6764e78ad14a8888c3f450940e009dac1f7bf7baf0358b02ffd4322a11d1ba5a41ff46f1bb8e8e17dccf878cb3cf49246b21c42b74a609ad4fcddc0d8303c4bd22b2b08be732a51bf172c708584b24fe6066519efce8319555bffe443454fa1dc682c4b027d7cc110f2da20fd768757ba6724945cdf5832b30383f6f7586bb8c84f12d160041a3e218770d950a5b8f4e2f3c8afe1cf467f75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ef76c402a4bd1fd97ec7cb0657ebc265c6b14283a23241722901633641a1252aadc4c18ce03381be5d83370dbaee0482c0440aa7aa94902a00244e0237bd29478fcb15428af69077ee4e47ddc8bd2adcf7d97a29fc56c75a24a213a103a1e3586\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3b055324162a840bb031e742e417383a3c2b9fff",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1a020000005f503664bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3a01000000af22f6838bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45a01000000ec72071c0131d9410000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc7bf29061\", \"prevouts\": [\"8127570000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"5719770000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4e193e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_67\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9b79da4e610ea8d97803a99b4865bb086bfedb92db6d09a9c17507146a4095ea4be7ae4ba991c21a7701da4148762a0c34b23eaf38228ee9c4dbeac1a8374ad1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"214fcd315f91e6ecf985f4bd4dfe6fe5eeb75f82a37b5908f0238cc3ab1326017c5088c1ed806fd8247045efe366dcfb875eb8b7f12ff9e544fc6f8881d5885766\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3b6174c02c9421bd7512cb0b507ee81cbe621e8f",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4601000000944c61c260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706800000000ba4a2dc30216b76a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7966b000000\", \"prevouts\": [\"4bc55b000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\", \"f1b4100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ab\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8f7f754dc6d102ee359d2cd6eeb3c0a87f330a5d54e15e8e1d57cdcf2ae84b1321af4ab4a8771d0340f6a82423a8186482766759fb25271e9d15a509286ecfd3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"117aca326b17db0c910fa1c611ffe06726f46fdfcecdc130f573a4dc6990bc236c5d6f5b988da6e5da986029bd2211364b5e7db13a52af6ffa0b47a25d846529ab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3b756b29419004b37c85b3e93c13d3f231e1eb67",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2c00000000a3ce2e21dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1702000000adcbac73bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0b02000000deea024702e1a1c8000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ace21d5c2a\", \"prevouts\": [\"e96d23000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\", \"ffd225000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\", \"485c8200000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902cb78b3bdac8d11567c7dc6f2aa5b2ee71076ef2ddffba413e3ce848eb15618be522f737adc97fc90ba295e0727aa88e1696aa25671ff17692233f63ca1df4954b728825a6a0ce2da4774799ca8e2a5dcbafc3ac771c1a956234aafdbfceee834d356c2f129777a4398e354cf4e31c481ef8fe637971a2fbcc949eeb8e6bb4054d2c7c78d8f375b3e539ce67675343b80b177108de78dba18782b2225da8a599234e06c0a162419e01e0b04b7480db0fe96a523c1a7677d2aa2e544249157ca7b75fc4841a7ee073863a521315caf74241fcd3c7ed1dceaa89d8328f24f55aed57a85f7f2c94a5867cae4edcfe458e1ce3a1a9ada3dda198ffb11b8b231d6f129c5adef4bda7ee47edff05d26f21d7888f8a2c0fa3286dae7d20daa15b6573940cd0f7ec62ef6287760afe4131e32d00ef38757a9f8aae4fa78aef59b818633b428a82c29d4f2bd40d3a0b5780786fd644a0effd1a28a4067713b2fad3d6635187e1a3e7b27c7eeb6bea9b8d73810fbd9c60dd461cd792614569beb5440f193bd3de674d02b9674fb2ff8c12d114cda3b5b360967434a8c2d81cfadd021c8ee7a35fd27941c5c6b03088420cb4d79741b6e9d1e37967a35a3ef7106f6e3775b9b8ba4f4c1b111e20a914c7aba4caf80eeda8caac5378bff69c39479dffad6cb116db676b30cd78a4bfc0c3548ea30b0dca1b0f394d7ccd553d352b3436f5ae477dd6dcaabe34ca4848b75\", \"3b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366f43516c2d68d132fac7bd8c90b108bd3a48adfbd6b0c62f8ced1a9f682d0b8d524213bc04a867e2e908d02e9cd05b1befa37bc2f591ad783cb0f6fd2a1a72397ef84fce916674b46359d0327d7b56c183d26d6053da1b16053a1f90da8a1d4e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902507d1ceddc54b77c465a747597375db581a193b47764273510b80b36a7d6b18cb8fae32f1b611da2a4d4fc716c2f2b1024b3534450a8b2033dc1f6c08e8e5f2fa1f867559fc5604a866e21e85d11f46cc874debb7bc0ab48788e81ea25c19aa1034e212616aa348429ed7d5c2a85027b60368bf4aa1010037d08acdd2071a02762db4a2c019e3ce2c444039915f71af5832530c89dc55334bebf3659e295f49889a58d0382fa4d969ab6588c28e5ed12747fe878c0e91d02ec9042549f2d5fdb9216cbcbbe39be42189c4f8ff854f28574191c172d47f025c83a9e463e5f59c27e30c6cf5ccf7c8be09beb6126c7b1ebed962bb9154f0e64760cfb2f5aec68e925c2fdb43c437615d5bbd083098715c448a0e9c11050a2824d3b464baaf48dc4efc7a79aab863283e98d66269c36b08a336eadbb2fd82e22b3be9c00c2f12116d9f565892b62d574a69307d52705f3c11f83cf174aee88a5dc24bf1b4903665683b3eed24068c03d7c38c75d3b933b15cea550701bc0202aaf4f3d93c3627c2ff31646694f90621b7a4932e076fdec416016b4491337e88233473e85877447a28cb9ae08bab119595d96e46686e37ddcadb60f74c9f6a52cc2015adefd7b294def59f55b0d1e27466c7a51d5cd75acfad7a0200f3d0ca23aeec056695d89da655d2f68ff2bfc5ca99de03433ee37496b3fb70e15d23fa599993fbe4043c42e03765c790578746abd8275\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ed450a1526d7659d1d0ab8a304ec78556741ee62c830e21f1e920b63ff49823b3524213bc04a867e2e908d02e9cd05b1befa37bc2f591ad783cb0f6fd2a1a72397ef84fce916674b46359d0327d7b56c183d26d6053da1b16053a1f90da8a1d4e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3b7aa5f0f9d0fc31f7be3558e9eae22f13652d33",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf56000000009d725befbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa600000000046d18dc04521cf200000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acbc0a924b\", \"prevouts\": [\"e40573000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"c8ad800000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sig/key\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bb2af8593bbcfac406e26202e5f13648fa5e664193a79fce786c89934a4c57c1aa81bbf0e1355adf76a445594d00db8c548820da4260010ea7dd5015aa3fe9f5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ab142f24726777850cb9f9bd64c555e3fa49510332c574858d5c2186037810a7088199fd5a1b8cb033a262c4ab06d4a52cf54091cecb548a2ef5340170706d13\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3b964cb9d3464c3949a2e8a0f9edb54a4a9ce6c7",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1102000000e34a2009dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bde0100000060eae28fdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c540000000002789cfd01dce73200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acae030000\", \"prevouts\": [\"6cbd6c000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\", \"4c421e000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\", \"b0574a0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6aea\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93622f1de47b063444ad2876036dacec053228c21a48fe4326b3b842e08dd2b252da2d42db82fd8c87bf94597052443343fe22a3a138f6b0aee44f71ff1c976f3ab32777cb2583add22ba560e78ee9942bfe3080d15b9172e7f2c8ac5adf5c65a1c36f2bcd90a4462875ebc34531696f5fa5671e0fb7e46050530a773670978687e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e170b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d865720f322cf06423056ff4efb147ba4330d28398a4f05a11ad98b1121aa54f60b594336f2bcd90a4462875ebc34531696f5fa5671e0fb7e46050530a773670978687e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3ba14a20059a5c8f8e184fb6d08736296adf21fd",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb80100000095c037858bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4770000000021da5818dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce800000000a4b8f83f04b7dcdd00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c45bb44b\", \"prevouts\": [\"724b5b0000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"d90c3500000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb\", \"294550000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e84c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93616f8948a019ae5ead2cd9d851c765ad0220b162570156f4a7dc6af8fd2e75e36f4bc19c05a4ad9ae05992168d490013403fc5515955a55899592aa66a61db799770b862ef93acb6091cb4ff8ef135b3065b278142aa4adab757f952a626e2b26c80764b3c3e93e4958bf58fae47a07e6a3ac966c9bf86a1c799b8570c4674755\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52e8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045d39fd96f2153f8e279dd396423519f362f93616cb37cbc9b2f05e3e7bc75ada5276a8166e5256dc9010e53101dfdb6dbd4fafdb1e785ffcbffe7e4bfe923fbf99aaad3e4ddcb787e09feaf57a938d0a46e7e94627a74ec9b410f8a5374ea1d35\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3ba4a606e430170b23a098c2ac6ee7213be618ca",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccb000000001cfe6dddbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2c01000000c20cd2c40255c4c200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f877b000000\", \"prevouts\": [\"92f156000000000022512081f4094833c2bd1c8ccd20bca7d3b4bfd2d5ed628270e66be4011ac690e88295\", \"1a336e00000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"304402206a130ea11521b20ceda33cfa589ae04f345a08c6f65264c643fd01917a53be5802206540524df34d1fb00190aba6674a1a63d89f4df10acd60eaba389de4d70adbbe81\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100e27839681f2e9abdb3566e2438767fa2c262e72a9cfa3b4e0d6b7ee7db147168022016fc9cdc28115d8737fe15fadf6be7f0c0ef5ded8d52bf5edb83bfc385a3377b81\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3baa61730ba406d7fad296d7df24a9629ae0240c",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4a0100000084436a61bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc500000000b28535d6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd2010000007e9916a503f4c94f01000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e77c000000\", \"prevouts\": [\"f56e7400000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\", \"259f7f0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"acbf5e0000000000215c1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"dd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2823dff2991922f121728685824385d20f53064595141c17e375e09b6c17310e1f075c573bc42ff1b5fdcad1a87ebee849fc17bcfc5c414a2a4f901b5a19cd44f11caf36eb2bc7b2ba56ad05f43983925bc55248f9b66a13a767efbac40c00\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045d5adfb4b655ff7e7194216f0c9ec7a59b69961b08133bf278a8ed5672f2f6a4fc12d2886f924517b8c41f4755cb69ff55f68e740076f0e346dfe7ab1da23e202491431d89488c08702db3cd2303e8a25c8ede371a8df5f96996e099ce5df632e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3bacefe15c3e633f44d830137c6fe22c074b155d",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c910000000057056869dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c47010000003cf378558bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44d010000006ea78b090428b4f3000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac70000000\", \"prevouts\": [\"9f7a60000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"8619550000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"478f400000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"597d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8e1a055bce30035b144601862be42e0b1f1d387c5344cafae4ff25a0d1808b56acd61c62feef9509bc7b3762bc81079411fa6867ea4986820580c60fa1e8298e9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c551dd4dd159c7937eee09518212705b0904c5c3555f506114395535a1fb444ba393999847c63b69274661db27cd2e7bb4343911a06570db858c301dc754c7eb4be962498b383c32e8a84fa570ade752f3a2216469b10dbfd65078bd8e1b5998\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3bc46b0f49e132b39a7468c0eeae4f18c15a9e46",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdd0000000084353b078bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a0000000004495027302e6bfa3000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e791e25a5a\", \"prevouts\": [\"3415660000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\", \"d8bb3f00000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"e07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dc752bbc00728dc9fc97a524e5c00d8fa73d20f44eeac2a564eeea9db1553afc3bc00f369fc994f47536ced64d5e4f722a68c2ed1128957c24de4b5158af0ec63ccd0bea79832f66dcec0cbfd0592e3eb2d999b46ac697170d667eb8939a9687\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e73d9d375b530aa22fee240902ecc7793689bdebd58e9771ff3d6e92b1aa7f5c13ccd0bea79832f66dcec0cbfd0592e3eb2d999b46ac697170d667eb8939a9687\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3bd1e196feb0c029ad908a2c989b46a4c75e87e4",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfac0000000017ce8cabdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5f01000000fb96d0ee013f6e34000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787bcab301f\", \"prevouts\": [\"18dd840000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4a3e5a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_87\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8891ec441a8fed191cbe43605957eddbf420cccbfd1a991a80ba020b1199fc3c50f148118f94a379b38fa564bedc3193b03a93ad0a9baaedeeb8de153de85b7101\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5cb37f0a3ebda88880990442443905e0ae293ec30e39a0582b10dcc0d4def3c817d2a14a40048b38392f18f6a57b8fdef983215a7ef3b299be90ca0aa87b884e86\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3c0a722d83c61bffb4712e8bdb67f68d6757d30e",
    "content": "{\"tx\": \"36449a2c02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0f0100000000b960bcdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3700000000576d43be01f4b34c00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac83000000\", \"prevouts\": [\"5386840000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\", \"e6232600000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"997d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93659100ab1d99009eaf631522d0390412a62a32905c7f687f8ed538c1d75c8e249e3e7df71444e7cc76d8e211582e4acb0f4a71a503115fbd605db9d475b3b0609413afa0de0ff2ef52577d4c80443f6003c675907986908c28bc93ded208ca160\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93617fe6272c5fffac4ddc4c47d3a6fc8218dc4d9298ec687e863b37acdb8199f2e2e3b986c0375fedeed2562a6fa36a7b38b0ca47fc0125e42be2f4bc52e49716a3d673df10a8cc98fc65477367c7f3bb838b82569297570384f0d4df8cd49e6dd413afa0de0ff2ef52577d4c80443f6003c675907986908c28bc93ded208ca160\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3c11357c518486213b14a41e23ce85acfc7225b9",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a400000000bf14df5cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0c000000002070b123bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd800000000fbff2f2002a8abd800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac05ebd32a\", \"prevouts\": [\"79d30e00000000002253202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"5ed7480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"853c8300000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c18461cc346aa094096b342c10a66208d719576ebcac841c65ce6ba4e93f60ab55a13d8fcaac985f6aa013828744cdde4f51fcfd86f8c5dd481210b20804d5e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3c20247465b4757bf0758627c8b5e4839dd819cc",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f900000000bceb13d28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4dd010000007fcb8fed015e995a00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac9009232e\", \"prevouts\": [\"e33d3a00000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\", \"3bff3b00000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063f968\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363479168552e0c3d7df5f44dbbb743296079984d081213225c4f28f061a2ab719a4dd4bfc6549e8d5e198b0f1e67d147f6db02444245a6cb27bc19444f2462468d332399bdd0fdb741da8d579adddb10dac50c4b595c0031ea1e156729d78e3487d6928db58d705af4b513465b8e8f739d066723840f3c873585fab69756481ab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c5d39e9862e20f53a0e43cd42e822dc4fc6d6c3f6bbd1afa8e6a99e8abcb2192a58cdb730d5140e8751cef937639de4f5fbc77d98986906c68a7616d2fa212f87d6928db58d705af4b513465b8e8f739d066723840f3c873585fab69756481ab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3c4f81b3cab5b54ca2ec122fa809fca650b47db6",
    "content": "{\"tx\": \"d105fdc102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0301000000971ac2e48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41b00000000099cdcd0044657a70000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79617aa1023\", \"prevouts\": [\"43046f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c8213a0000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090283a58b717bb09720c20d04b00847c5f2d0892ee1723208bf1c79cf95ad0fa074694042e6c4aecc8374c42f095cce586dea00c533525f82657cf57ea5944adfd927a660bf5bccf0a4ecf50680e29027294904791c8337089da38b64a4339bb54733b31e31f6b6a1c5be8bd3aae3aeef05a60814ead4c36a1bfa349b3095bc210d133446f83bb20ab0178fc796e3756cbaa257970ad6cf9939d572f227f6d66bf0a1b5a37a89f394a5431b5130ffaac17fbf8cb66f89dda17854f181796192e1503948bbd5b4589e4200bada6a99a67d26076d4c4ccac6c42963e9d738c05cce90e6b3796466220a85a11e420eaaa232c9a56e8b63514cfd49815d20f60faef72294dc85098d4563bc46d9ab322ba218d7e21293c44e143070606895228830c145b2970cd15ed172e83ffe27baa71808cb69ba4244988ce9f40728eab596c350481c8cf4c2fc40b3fcb6143a9f0d36895465496b76c3bf9a926a8c1ca7918554a3c104df9900ce9b93c0937df733c5e8712f6310708adbee79b3059ceb9be16d6a53fd82f30529e839e7f31dac797a4379bbb2afb5d994b77cd671c900688e42b05768229a531c909d26c0c0262b9c0ae2b0f31bdd3f0b8f221a9bdd64df8f99672734b47c6f6943d0f79885a55845febc6b149f526b63143bda37c542aa5256571601a0ecab128b84b582047edae7c8470d4552db589d926dfb5badd136a25cbb3976d6d878b368491b75\", \"a47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e298b057fcdff1fd9eedffab28c4b84177a993dd4b4edb713a819d49be9f33539a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100eec4f69e5cd9a0f0c1fda8eb2f54297e33bc5edab35b299e65e2653a923d6ca55\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b52f8fbb9de22c73b9ed1544813d415a787c2c5484a574fe3a4b3fb45b25cdefdc05d19065d57f8bac97ce3b21f37f1fa319394199461af2223057dcce1ddde5ecd47592ec6309721c864cad28933d42ae2f1fb48b649869b27575dc811dc7e18d0ece4115a24cd4b750a86441b1cb96ca61f5c6ea311be9d2d64bfc44ed9cd3abb5ed0d1a3d89a165876e302f484d6a85cc7e642a4aab569bdf090bb07f12f8c9db042c4fa5bb350ae1729e3b6b560d46ee37b20e4da5bc3ed7d0eff21f6a2cd6afea1192dde618fd1ea197b4493a513f09535ccb65a85d8f05795827cd7bde7eb93e6972269b72231c041294d7f17489847ed56c50427429d98eeeb47b3a2612060c0520c74cc73b7e808296c0c0cff51cf41901e13e0439c7df2b5998a6d3fc0434bce18ca6fefb16306a7ea0e9fadeff0a55980ae595853ad8ca181354f990f0f9f451d46225c62237537bd9582c13d3e672a1701b844b2fb1a910a89ef4d18c68196f60c3ddb8bd673fa35a38a0b484fffb1659928dfdb71178faa029c7119ad1d1ac76713976583edee3312e95f89949141bc9486c06c407c774c7320a54671a76980e81318258760d8d6ecfc179dc1c2e0808d4ec7209d5bdb243eaead5322b7bf3e85dc9091d448eead5e1de5218fb84e649eb188fcf462b9461443563b821affd1bd4405cf5abcd139a6c623649509ddb2918e04252637fad9c2181e61a5f847b81f571f075\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e6f2ceb64e65b7fe0ee2bcc907e6bb6457910dcb8068df083547398b80574b4f873bed7b94a92ccdf1432eab063a27f935bef099df6a1cbcf6734b218f2b6aa9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100eec4f69e5cd9a0f0c1fda8eb2f54297e33bc5edab35b299e65e2653a923d6ca55\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3c695558731a219357e99fced06f0c24b38b6c11",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e9010000001dec1589bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf260000000053ee53c504472cad00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac11ed5824\", \"prevouts\": [\"65a33900000000002251202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"ee537600000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"88d65c168f8a0920214e83e6f345f559981529a1045602dbf8c6ca6b1fa3b5e90f59a018b3bb9d11709625a0997bdc1f558ffcb6f94ee82b58849a1287e5a68b\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"39f4cbfd76887c4a92dca98894059cbc1979e2173137cbb57b75fe307704ee3411b9a854c4ffc10440b9df9b4cc6f1b0442da56d252efe435fd50c8a887ee622\", \"6a\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2072ab2582871329e6d2ee7428615b3ca131677fbf9a036ced2b197b0b63c7847f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3c6b79f35456c42d2578553948e940b494865ac5",
    "content": "{\"tx\": \"5d45ca5a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3100000000f9556abb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bb00000000953fe6a9045d685e00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8eb7014c\", \"prevouts\": [\"0290260000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\", \"4f64390000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"0c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c7110d101968a4b58b88744c41dbbb4e2ad9f7c85e8f992915dc83ff5cca0b4028257bae22e6d8aedb31b43cfe467850e731fb88c1221782039a4c16ef44c35617d0d4fc7404dd8984f6a1705481d95654b515a34c586c99c11bfe20e9503459\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fad8b86df4811d5d33605da5981d7f94c5d3490296d8615b43f813528d1a3f165ada3d451ef6042e8b6b9e1a05667773e16935ec77c1049456c2d3709876bb0617d0d4fc7404dd8984f6a1705481d95654b515a34c586c99c11bfe20e9503459\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3c78b5bf3e8a594974afba095afac84660219f6c",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c370000000026ad1f6dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbf00000000f2e52467039292ce00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac85020000\", \"prevouts\": [\"88de5c0000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"035a730000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6add\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936737f38b389e91945a59e7d1a54cc6743fa202767b45d1f6a954572f10f069a57b6537362191d9a5e0aa3a730b93b6f98a99ef63ed893bef4b9dfa7e3451eaf360e1f075c573bc42ff1b5fdcad1a87ebee849fc17bcfc5c414a2a4f901b5a19cd44f11caf36eb2bc7b2ba56ad05f43983925bc55248f9b66a13a767efbac40c00\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936077cc45fdbcc3c6a197d438d850d88fa7818ff45d2680821c93c0ab1e64d7a1e20e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e18e3807b59d4390aa508570eca32c61fc450dce8c5cf98deda801e2e8c3fb4b07491431d89488c08702db3cd2303e8a25c8ede371a8df5f96996e099ce5df632e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3c986463576a17cc12996a738a2cc479d1198df8",
    "content": "{\"tx\": \"6640765702dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5f0100000029d0c5b9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1e020000000a5e90fd0143ee2a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7ea02a33c\", \"prevouts\": [\"6120210000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0999250000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"e97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362896a049359ddc96fc816a03690dd361f765cb7441c784067b848ad4ad8c32711a6bebb6dd497db999161621b23fc9287dcbaa466f13da5d035327b94edd053dbd7d7e2e0b29bfb283546875adbaa200efb560b624d50a8165ce6ae8ed501592\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936615da7ac8d078e5fc7f4690fc2127ba40f0f97cc070ade5b3a7919783d91ef3fda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e0edd1eeef23b4191adb89e631380cd7acdd7acf00b470d5a9d9dc70e20df3f09bd7d7e2e0b29bfb283546875adbaa200efb560b624d50a8165ce6ae8ed501592\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3cb4479d7f4d2911b165d8e388cda3c7da36bd62",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ce000000004bd0f99e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270610000000097c65b8d01828a39000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47877a0b633c\", \"prevouts\": [\"06f4350000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"30571100000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902014e396e8146f3a3431562dd8f595ab074d6ec1d0d8287250ce946d6635b51732c0f9843d6bf8496532fc900dca4083dca6658d29c7851d1956b5e6dd23a3e0109cc34f511f59b7fce9d624b5ea3c3619e737bbf1dc6ba5a96c115b9d985ca16fc3021cf94c9168b0ff065ecd3fcca362aa72ee0828a5e816698ff4f54dea9e31ec98c9eb353cf8cb45d446278b35da3b70365a505dd1022f5d97572ffea03a986a7446cd33866256e06329c9f24e90f74962fe8488c893d564e3656a706f0d71584df1e676aa4280878f331a1ee40babc890ac22b01cd3ab5a3f2fac547c3ade431dde9520d483adf2c507b670bf4c3ae302ff2f2bcf5f67057c1dfe00c6c9ac143682031f8f330fd2cd11b5d02335bd79aae17c5bb42dd5ee6339aa970a2227258d3e77b617fe787aebd5ba159abbfad24de598593354ba2e889efd80101e45b2ae4aec4c4554ac153c6f6aa9e5e4e724e6b582eb3b525eef679a8a1e95513d6737c119fe33abe1c335ad3b7c7e8621047f8359fd79d789ce0362df3e573770e8e942eed9bac29a7ec4e9e08677f275a0d9fcd62fc8dcb3377067448a1d830fc16464538c6ace04f56bb514dd8b2eddc72e09876fe26f6f38103edd3244918cc58c76e35174c47cb8052858ec3d0cba8d20992312a4bf1f03dac9b7a5b4e503b77fb0992b4aec7a046f8a8a42d4fbcbb18844d90a463ada1871824792fecfa3365712cf8ab09e56475\", \"b47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936db0523871f2cd538158ede77b2d54a3b132610dca27e4b1b70c1c98b9153bdc120cb1d3ba38961d99eb4dd4ca5f4423fa7ecc992e517adf4bcc7891fe49c1f0e90a6d927376acace3683bbc4ff9f5d15a4c9ee2ad4271a1fb38c29668c3ce61898ae4fb28ba039f9030001532aa52d54afebb8b1d186c7283d6707334cdf0cf3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09024398a6799cc67492d8b06aa782f94519ea08f290828c71f6303a4d3376590129dac016694a5bb4fbd631420992ba42145f5fa1bb598cb3dde7011a51e3ce752187b464c878fd7a4ac072baf97592a69aa23590d8778acd8ac35aef8c6e19e3f81122b9926cc8c2f095e8746b507c7cf037ec42517540a65c528862d5df38be27b23f56aafa804a806cabe281b0323ad167a30945ac1929eb9c62a49a6729656a2f011a23f80e386f836c4a3438df5aa85ae8954a369192086238b3700c5e384f7de5b4ec5c11b5e868839df7b5650efc9d07480d41889da51ad7bbac1f40ccfa2a5bfed3e8c6364a9990154419a927d246b7a6d965cbf164bda614e2ef79b51b25e0b6433c89c208db07caee28aab62032d0eadf7acf748da7d0c57cd05cc7f34d83ad53604a31b1142251f53ccdd78552cfdc12740a27d2971895d16a50a536b1a15ae155da18614728e557d6ce39d0583a2e170d020319533a179033b26d1bb6b2e4ca8ad0cffc08c75a584c050499292b8b46657026239d133e669fcb0f6555a093ee8f3d852b89f33688993acb0fc18b0415f645c080dabd98155667f64ec5e63bf847fe488ee836270d9906bea9d05d0c824c5757f4d860a56a6f89b4525d2666b964a72df964b860abd1afbf84b43a9c9238927007ebfaa7f7e3c4ee7ea7931d73188a98b75a7cca86762277c0acd5ae1f0855dcab8107be4b6deaa8245c6c90b1fa425e050175\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363397305a46d15a1fbd1718c65c5b71233ce63301ff33254e27be79b1faf0455420cb1d3ba38961d99eb4dd4ca5f4423fa7ecc992e517adf4bcc7891fe49c1f0e90a6d927376acace3683bbc4ff9f5d15a4c9ee2ad4271a1fb38c29668c3ce61898ae4fb28ba039f9030001532aa52d54afebb8b1d186c7283d6707334cdf0cf3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3cb7605604a629153b71183c4083311f53f6fee1",
    "content": "{\"tx\": \"2168928d02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b680100000082a688d3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0600000000b79a99bf04f55a8e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ace8020000\", \"prevouts\": [\"0ab323000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\", \"5cb06c00000000002353212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"30440220487d2d101ed150b62a24d7d92cfaf315ff929e30c8260139b5399f4cb0af74b602205eb352da3f71fe94ceda84c40c7d13af0053ac9a15a068b01b571f3585dbd04a59\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"30440220487e8ce3df65516fdd3d0efe2c5d41647a023ace5fe6bfda4987ef87b33806160220575ee889d7357643247894ce013d47555819059d4de0449041182149df31807b59\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3cd91b4c3a1d21d1c90b1e6542ae78fd35091778",
    "content": "{\"tx\": \"778899b603dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c95000000007c54b39660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fa00000000b5fe039b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a8010000002867b9b101c0ee1900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2bb98647\", \"prevouts\": [\"325f4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f1bc120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"09e33d000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"38e7db28381c7f870e8f3ea9691ce2d38b31ff5050529ee2b45b9759224fe85f970c45de2c0d5885323318ce7ccbbef71b2993cb1589e8784f16bbf0cfae4a7381\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bde7f721c522a28fc221518a19b4513e461cdf6e46bae113944acc8fd055dc77e37e75dd6c52c9bba0967fa57bb408d14a4c97f19b6f5de4dabdbe835a78ace40a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3d4082e12a369fee00a97f5ee6a3b72ea6f15238",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9400000000c44b13eadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0401000000a6db52abdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c54010000002c43129203bb4104010000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6b86cdd5a\", \"prevouts\": [\"b93560000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\", \"27ca5d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"17f34800000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/leafver\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b1d9a37f61f7c7a4c82bf219436c4f1927e6f76722701677d56a29acfd127e0e3ec0ccd33568526ed29e04a28bde190ad28971e0d1b6d595d41d375d411bea4a01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"500715dd98e8041b179cfb07\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1c7b30a5fd81a190827244ddb13b0f4ad8d3404e9741bac8d15529fca5cfcb7f11ce707b81d4da50f8023c7eaa6296aad320c7b6b4a053426540971565c1869183\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"508116c23b6787b2098b11682c9e8d20d9827696375b938baf0cffbfc4ce2cd059e2021f4d191b54cc75d49b52dd9406e95240b59332b6c16a74218182a06f7860c023aaa6dc5890e4ba1af1b997377a356d263d187885556f5d918b985e226740b3451d49c771216044a4a0ff2165554ad703ed3c401d2744234cf4d2f9a2760551\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3d4137ffad2b1c85003d032d19a2150f4b6517c9",
    "content": "{\"tx\": \"c830ab1802dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c16000000003360f5e8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c650100000012a15abe03ce9c99000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb5020000\", \"prevouts\": [\"be9747000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"7bc35300000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"c1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0826047efe14993a8a73b9baf7cd14f960037ac1d53bb1921fe06fa7eee8637040814a663af4c315d4c0e419951403071b67d2106b9ce8bb6d7e6c872100135a32b791a13a85e5c2e660174c9a1e69b8f96263917ef129d2001c822ceb7fc389f44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b9fcf0a7c92dd23244df9580e55d15e57255b9f51d71ced09e9b8172bc04386f6047efe14993a8a73b9baf7cd14f960037ac1d53bb1921fe06fa7eee8637040814a663af4c315d4c0e419951403071b67d2106b9ce8bb6d7e6c872100135a32b791a13a85e5c2e660174c9a1e69b8f96263917ef129d2001c822ceb7fc389f44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3d65682b1f434030f11d6815360c3d269d231474",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3e000000004eecdbfd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40400000000dc744fac8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48801000000149ea6b603d7969a000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88aca8a50227\", \"prevouts\": [\"6f9121000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\", \"11d139000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"5094410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"657d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa19acac53f630ad836c1252ba923d9d3235c3c343fcfee9c8733d292c93bc64142bc2c7d802e8c870cc0fefcfae9d23d316cca1682651be3bf62b663d5ddaa443\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363d30055f1b2452a1671c6e1eba433b096afb8e3d3c5ba62baf7090afff22fc4e74d92406f86dee9f8c04bb958856db6cfc0bb7ea92d17397457214a16beb1de2302781454c6297f6b8a579760f4d591c0acf84ff9d038b064bbab8a5d53835db\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3d6fb8e46d4f9e03d6de0e295ec2e0e50df1aa5f",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42d01000000bdb630c88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cd000000003ebb08c28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f400000000c26dee9901a9b60e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374879a000000\", \"prevouts\": [\"804a37000000000021561f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"47ba3c0000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\", \"dfe4400000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"be422925792e3ada801d54172a3f99503d375b2a7cbec506e7880aeea8a8340bd54c174c2df59760be6047ed0571ab8346cc9029b75c8f79bf2766c41724817e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3d75756c8dd79c4efe056dd5435cfb6a2457207c",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd100000000ec47e22bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfae01000000926ff007049a1bec000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac12020000\", \"prevouts\": [\"942b7c0000000000225120cebe24bd65f3df56aab440a71cbc9879a1b3f80f985a5dd97b0c93b61f81cd49\", \"6cee72000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_5\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"edfcdfbea3c23f3bc1b87a0fd8f36757ab9564c40868070b71e554f8dc9078d3ffdfa0dceee87a0780f180410e674c5db6c3fe142f05f91227a8a0889696a3d701\", \"d28b204afc5398e160cbfc089192d27fc37dd6d8d3dbc4d7f744d17909f23444246ea1af7d8b725890a1852f7ca0ebf6dbc0e050545f3910c5f8f8e34d82a6d0110fda7adaebc667887af53ae9c9008d66a94f06be60efeaf1e5cb2a0ceff56cc8a4a5037beda28f6fe6f92d4deac48aeb00e163832b5b9032ed05f1dea398c0aff5daf1fe2e2341c0d0b025e6b6caa31f019c1e1cf0f0c9a461d30fe2ed90a9b3ba541d8f09c3af97f025464fb0bd\", \"75005a20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5a8820871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f9c5d7eb03b7f54c91714f607bb106c5a9d67c7c5b975a10fc82efdaa356df65eddbb0afdf37ab261319ce7a8e479c320dc2477983d69b93935705b3f3620fb8ac68ace3853064e722e1b1afd151878c5865be09478b565571c169dd243fb993bad14950d771775f4676bac3906f4b088a0db4dc3dc7eefd6e7ad257912098000000000000000000000000000000000000000000000000000000000000000007772bf51064c90c0e58f48f9db455f9e50b8d8b08ce5800938a6261ec8209eae90b7b6e61126f6d3790e89865ab4119d57119006a85e75cb22756b96079fe197478217f5739698d82667998ebd36e9a2911eebce53cafd314027d12f6f7d6fb34e19f2960ef96b8d186a912da3a133529bf4f01072411fbb38048cc022ea939683a92d5e9be0215a4c7bafb7df24f1deddf8e3e70654a2a0c11526f54ecb2bded6906ecbd007b6adcd2d3a9c180f477d4f1c53a85a3c2f4d888450ce3bd3af660000000000000000000000000000000000000000000000000000000000000000b08832c8ada8bd9ba25a569edcea6d0b0273a8aa79360f1e19c2d1a818c8ca09ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe65874829a6fca96a658b69cd99e9a6ca9e70e2ea5a3c85673e85a85bc71fae6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ff857e1fd6562469c8364952c860f1e45b452f421582252bca13798aa371f62853e97ade0634f6e230ff512547d39d8acef1caaf72f24acf577c27424c68925ee0a5ae304c259c27aadd9bc76d24195f749514a131e48c16792d10e8c2a8e485343f3af3562acf496328ab7e97fc4676c110ae7813eb9b70720dd24cd33338a0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4369e24008103d8c9e6c573f0264e51327bda5fd52ee79f9386fa14dc4c224b742ad2539f6c1874c2ef824f3863f2a8f8052c33072d847547bcd0f5e72f332f500000000000000000000000000000000000000000000000000000000000000007a045ba295822f4cf3608dedf74c453dbad7c9617bc8ece1adec3b86c5403c12642807f1f220d8f386d1ab0609e9a99cf8f1d43c97626e5962d2cc1a0b5af4eafb4e59df34d3d625e91de9c6d25c50026a81b8c20f7cf02fc47355ab870c527d1ba446c59d7334926c5d1dbe2f8a1e1913480ff52db2a0bbdfa86f9ec4580f3c99914b59be4c93f5567d5f33492a01cc2b8e4fed7ae5ce0fe2280a98bda1468d1a906c9c42c9bfaa0d1fc5f6cd71c6c6b161419255acddc046e94fcb824ffcc5d0e462527e0dfdf1dfec4afe30cebf6e6d88ff045127ceeaf75e2bc4049d4fce45158bf70b8138e021f56c9cbb83cba475f04a8a436b707cf9aed9b3a37ca431aecb41c179c688a28bc4eb67bf14294077467cd7feb09b627db9cfc2bf1ffa03816beeec1135ad37064f945160b3191972d8052c36f1397e9bf72ad4098dcfca5a4fe73ce09fb577a9d78c681f878a257248613d22d56c913109f02554ec7b5fa924f2dbb97153499dbb253aa235f5bf5053126d36e5138c04d9d0195b1b36fd00000000000000000000000000000000000000000000000000000000000000009700eae923f62337efa128c93ca75ddf6d9923f84eb457d4bd4625ee87aa667300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfc98418a242151286df9f103cc91b4737daf3474bb060ca60897a5071c5cb13ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0700c3b3d3a3c9ed6f7f9c9b876d19986dec133fe4e23093a3e3ac2321f772c01dbeb5fc721e190f39925e73434c74a8a5fe462047b1e2dfed09c47bb4a116e0000000000000000000000000000000000000000000000000000000000000000531965327d21e27d9d2b918afcab2f3209c8d7dc10cee9e8f37b414c6327057f0000000000000000000000000000000000000000000000000000000000000000a57a09473d1dae69a4cf8423571bb06b901f37253cdaa6e948f92e824fe53774ce748e9f089ba7d5836bd2cb3dd575489d6e593416b7cc9b5925f90571782dfc0000000000000000000000000000000000000000000000000000000000000000795be99b998bb12ec6379cb80d2a5ba5e9fb78303d4d1c6dbe7b097eb266d2a98cf72ef937dfa60258e4433686f6afa93de6212056f4657dbfee7f338fc9277fa6889804ee8b98431d81a65f360f220263348e9c001e9c0a2104450849d5944bed1c9d5b7e3dccdf65674148f2eb44cecbae02a19bddedb6c57fdd48b539e9c8e2e8f6e0f6662045e628a81353e9d0de000a43d6896b152f026b7fc2fc4fef146db315e33d1b3bfaf53bdd19b81a22db5819c2ef1c9bb9cffed167dd590e576415829a408737b4fcf5f6c2ddae5d97ce9f8a129a6a2603b93744fe70a217be14ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99475c4fafedbb1ecb857f13fffc28b7f316b28c0fc88efc47b1cc4e52b8f0b26e6ee6234bbaa24d441ddcf185f186d6a8adbaee2f84527033438a9a89d859b3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb565c8b6ca6fd3f80259dbc88568e44ffc1f0fdd139e5452c4506a5ab6a46818431d69bae4bbdebefe763d5cfb2404b1ba08fb0428c117caea304db70aee0c6d3b1e5943c2d0fb5b0cd32b50ff77324af6345e448e419c8e2aea7711f11fdb632ee771d395c186394417563da56bec3dca90ba3be085367b0664e7ef134bb2ad9702c541b0c4cc1fb44e45c9d1245c0a21ef808528820ba1b80892058b0c05579a12a9e32c3ad6af2463d5d03488875345078119f402d9e1d4c88e4dcd27513377695598d5238e4177608ead4d851e782c309dfffb316f240d019c5b19569bc16749d5177783ad509f99ee914289e4866ecf7ee28223cb85890dbefdc5bf75a67489ca239183c005d36675edc774692901f6229f73ceb4db07d7299ce374ae51e21e7d6da88b73aa8cc1f232b4adb5f5621c8007d07edf771fcd7dbceee497667bb079e3fc189baabe10c78292d9f9bb6273b63109c3083d411bedb78c3226bd0000000000000000000000000000000000000000000000000000000000000000ce47725597941674b7e8bd1ee969309592499f4f1ee4ac83d38834649a3c6523a932e52a4f963c304d828b42c0de38ed5d4fa7c89a2bddf97b64ad966c7b79dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb342ab9a519cdc07dd77b174acc17830f0ea8dfbab2073f15594f414b05c68e7df9ba1e754cc5c999baaa94b7d26f795d4153a238f2e329ea6da26f92df720c25147814778cb006069dd170d3611147781245cf5c03c564e714f81285a1ce6c4018d9e395df31e06a57c07065d5f8cb987b113ed9be344488c59eed27496792cfac4c01f702a704d993876bf616a89cab8911488be9eaeb3b8556b604297a75001c3c1288e65afaeccf1a83f1ac1b7744393b51fcc27297ab5cbdfff743d34a800000000000000000000000000000000000000000000000000000000000000008041f55c0bdc07af5d6c2c0ec4afd20fd042e64663daa99d6a3352ce0c7bf7cad397a496cfcf53857a5e0b8d861b2a23f67be93be84641615b5d82f4ba00d212690eaa87a6b8641686c102382ec3de9005ba359ee5914fbfac245ce48dd1b7b9e8837718c6763acec811ddaac0f572a99f876f557dbb40c0333903d0bb680659f403b5f131380e8dac882fcfee1480b4efc4e6475db1da71ddeb21f8abce3710be65713c1bf91fb6a50ee126da21bb6248d2897c1517325914ff59c2fb012cbb45f9bdac925ed4392fd350ccfeebcc481c08a911f558310acd7a9408c71ed063a541a121265934e85e47f10f377e07340bc406366247b3fd64fa61d13f5bc928fc32675e9e9148915a547e615c77048610f34a8a2944aca1c93b0e7e340298494ed729477b414a782b459dc5b91ddb3f22e5caf167d2ee39edfaeb7333db0898877ca6ccb4a88afa0e4c80140254b39c7dec208b865d962a7422468658cdacc472afcbed6a9d193e85f96d5273c5bb6c090f57d1a2c71c83d6db99bb64d6620f0000000000000000000000000000000000000000000000000000000000000000d5b6e753cb106da3c716a35df2d8dee3e417541b97f8f62bf1fe16a0a6fd319c9ead626369bd6d5f8484ff3da8a9b5c89c18b2d2d268e456150fb20549334cb8296673afbc702ea89fcf861b76b66b8746885fbf3668e09533eae1ed62fdec1179372bc439fe3e8ff996941583cdd821fa061b44ae3381420f4d5973f6a1c537e30df0147a77e13e708e03b38df52f197e2443ea7f7d686a34a47aa52642dc47ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2ea7b694001f5f3d230108f2e954385b3964629545cf5ffb1c89f944aae7b97f0000000000000000000000000000000000000000000000000000000000000000ea3c55499635864516e47c9569140163ec17b994aed30db17408e09a0f05fe2c7f270490ccecaa24cd2f3a34592ac8eb88835240957395e87c881f69826bcf642a78d7bbb6057f8839d6b39afa757e8d08156e2b63ec70d0ba55a8312a8f1989\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"edfcdfbea3c23f3bc1b87a0fd8f36757ab9564c40868070b71e554f8dc9078d3ffdfa0dceee87a0780f180410e674c5db6c3fe142f05f91227a8a0889696a3d701\", \"6d1918b7181d68101b4626a6d6d42553e1ee298c0b5fbf25bfb05227c2d9a8a1faa81168b16ab8e2885fa3dab118c996164ef710bfa88cca1d09347c5683d360f59dc24a012f5abedcba8459d7fed5f145a63bb583b1c0a0932b95f9120bd8a3d0b9c2ac6f0f58af28d43a3a662c00bbf2cc84d17a3074149592c9909f721278df120872cf3d0ff9a3ca48a660201bba384678216494f660c98272b9570335f1ac1a167c479b5d1213841267eeae\", \"75005a20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5a8820871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f9c5d7eb03b7f54c91714f607bb106c5a9d67c7c5b975a10fc82efdaa356df65eddbb0afdf37ab261319ce7a8e479c320dc2477983d69b93935705b3f3620fb8ac68ace3853064e722e1b1afd151878c5865be09478b565571c169dd243fb993bad14950d771775f4676bac3906f4b088a0db4dc3dc7eefd6e7ad257912098000000000000000000000000000000000000000000000000000000000000000007772bf51064c90c0e58f48f9db455f9e50b8d8b08ce5800938a6261ec8209eae90b7b6e61126f6d3790e89865ab4119d57119006a85e75cb22756b96079fe197478217f5739698d82667998ebd36e9a2911eebce53cafd314027d12f6f7d6fb34e19f2960ef96b8d186a912da3a133529bf4f01072411fbb38048cc022ea939683a92d5e9be0215a4c7bafb7df24f1deddf8e3e70654a2a0c11526f54ecb2bded6906ecbd007b6adcd2d3a9c180f477d4f1c53a85a3c2f4d888450ce3bd3af660000000000000000000000000000000000000000000000000000000000000000b08832c8ada8bd9ba25a569edcea6d0b0273a8aa79360f1e19c2d1a818c8ca09ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe65874829a6fca96a658b69cd99e9a6ca9e70e2ea5a3c85673e85a85bc71fae6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ff857e1fd6562469c8364952c860f1e45b452f421582252bca13798aa371f62853e97ade0634f6e230ff512547d39d8acef1caaf72f24acf577c27424c68925ee0a5ae304c259c27aadd9bc76d24195f749514a131e48c16792d10e8c2a8e485343f3af3562acf496328ab7e97fc4676c110ae7813eb9b70720dd24cd33338a0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4369e24008103d8c9e6c573f0264e51327bda5fd52ee79f9386fa14dc4c224b742ad2539f6c1874c2ef824f3863f2a8f8052c33072d847547bcd0f5e72f332f500000000000000000000000000000000000000000000000000000000000000007a045ba295822f4cf3608dedf74c453dbad7c9617bc8ece1adec3b86c5403c12642807f1f220d8f386d1ab0609e9a99cf8f1d43c97626e5962d2cc1a0b5af4eafb4e59df34d3d625e91de9c6d25c50026a81b8c20f7cf02fc47355ab870c527d1ba446c59d7334926c5d1dbe2f8a1e1913480ff52db2a0bbdfa86f9ec4580f3c99914b59be4c93f5567d5f33492a01cc2b8e4fed7ae5ce0fe2280a98bda1468d1a906c9c42c9bfaa0d1fc5f6cd71c6c6b161419255acddc046e94fcb824ffcc5d0e462527e0dfdf1dfec4afe30cebf6e6d88ff045127ceeaf75e2bc4049d4fce45158bf70b8138e021f56c9cbb83cba475f04a8a436b707cf9aed9b3a37ca431aecb41c179c688a28bc4eb67bf14294077467cd7feb09b627db9cfc2bf1ffa03816beeec1135ad37064f945160b3191972d8052c36f1397e9bf72ad4098dcfca5a4fe73ce09fb577a9d78c681f878a257248613d22d56c913109f02554ec7b5fa924f2dbb97153499dbb253aa235f5bf5053126d36e5138c04d9d0195b1b36fd00000000000000000000000000000000000000000000000000000000000000009700eae923f62337efa128c93ca75ddf6d9923f84eb457d4bd4625ee87aa667300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfc98418a242151286df9f103cc91b4737daf3474bb060ca60897a5071c5cb13ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0700c3b3d3a3c9ed6f7f9c9b876d19986dec133fe4e23093a3e3ac2321f772c01dbeb5fc721e190f39925e73434c74a8a5fe462047b1e2dfed09c47bb4a116e0000000000000000000000000000000000000000000000000000000000000000531965327d21e27d9d2b918afcab2f3209c8d7dc10cee9e8f37b414c6327057f0000000000000000000000000000000000000000000000000000000000000000a57a09473d1dae69a4cf8423571bb06b901f37253cdaa6e948f92e824fe53774ce748e9f089ba7d5836bd2cb3dd575489d6e593416b7cc9b5925f90571782dfc0000000000000000000000000000000000000000000000000000000000000000795be99b998bb12ec6379cb80d2a5ba5e9fb78303d4d1c6dbe7b097eb266d2a98cf72ef937dfa60258e4433686f6afa93de6212056f4657dbfee7f338fc9277fa6889804ee8b98431d81a65f360f220263348e9c001e9c0a2104450849d5944bed1c9d5b7e3dccdf65674148f2eb44cecbae02a19bddedb6c57fdd48b539e9c8e2e8f6e0f6662045e628a81353e9d0de000a43d6896b152f026b7fc2fc4fef146db315e33d1b3bfaf53bdd19b81a22db5819c2ef1c9bb9cffed167dd590e576415829a408737b4fcf5f6c2ddae5d97ce9f8a129a6a2603b93744fe70a217be14ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99475c4fafedbb1ecb857f13fffc28b7f316b28c0fc88efc47b1cc4e52b8f0b26e6ee6234bbaa24d441ddcf185f186d6a8adbaee2f84527033438a9a89d859b3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb565c8b6ca6fd3f80259dbc88568e44ffc1f0fdd139e5452c4506a5ab6a46818431d69bae4bbdebefe763d5cfb2404b1ba08fb0428c117caea304db70aee0c6d3b1e5943c2d0fb5b0cd32b50ff77324af6345e448e419c8e2aea7711f11fdb632ee771d395c186394417563da56bec3dca90ba3be085367b0664e7ef134bb2ad9702c541b0c4cc1fb44e45c9d1245c0a21ef808528820ba1b80892058b0c05579a12a9e32c3ad6af2463d5d03488875345078119f402d9e1d4c88e4dcd27513377695598d5238e4177608ead4d851e782c309dfffb316f240d019c5b19569bc16749d5177783ad509f99ee914289e4866ecf7ee28223cb85890dbefdc5bf75a67489ca239183c005d36675edc774692901f6229f73ceb4db07d7299ce374ae51e21e7d6da88b73aa8cc1f232b4adb5f5621c8007d07edf771fcd7dbceee497667bb079e3fc189baabe10c78292d9f9bb6273b63109c3083d411bedb78c3226bd0000000000000000000000000000000000000000000000000000000000000000ce47725597941674b7e8bd1ee969309592499f4f1ee4ac83d38834649a3c6523a932e52a4f963c304d828b42c0de38ed5d4fa7c89a2bddf97b64ad966c7b79dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb342ab9a519cdc07dd77b174acc17830f0ea8dfbab2073f15594f414b05c68e7df9ba1e754cc5c999baaa94b7d26f795d4153a238f2e329ea6da26f92df720c25147814778cb006069dd170d3611147781245cf5c03c564e714f81285a1ce6c4018d9e395df31e06a57c07065d5f8cb987b113ed9be344488c59eed27496792cfac4c01f702a704d993876bf616a89cab8911488be9eaeb3b8556b604297a75001c3c1288e65afaeccf1a83f1ac1b7744393b51fcc27297ab5cbdfff743d34a800000000000000000000000000000000000000000000000000000000000000008041f55c0bdc07af5d6c2c0ec4afd20fd042e64663daa99d6a3352ce0c7bf7cad397a496cfcf53857a5e0b8d861b2a23f67be93be84641615b5d82f4ba00d212690eaa87a6b8641686c102382ec3de9005ba359ee5914fbfac245ce48dd1b7b9e8837718c6763acec811ddaac0f572a99f876f557dbb40c0333903d0bb680659f403b5f131380e8dac882fcfee1480b4efc4e6475db1da71ddeb21f8abce3710be65713c1bf91fb6a50ee126da21bb6248d2897c1517325914ff59c2fb012cbb45f9bdac925ed4392fd350ccfeebcc481c08a911f558310acd7a9408c71ed063a541a121265934e85e47f10f377e07340bc406366247b3fd64fa61d13f5bc928fc32675e9e9148915a547e615c77048610f34a8a2944aca1c93b0e7e340298494ed729477b414a782b459dc5b91ddb3f22e5caf167d2ee39edfaeb7333db0898877ca6ccb4a88afa0e4c80140254b39c7dec208b865d962a7422468658cdacc472afcbed6a9d193e85f96d5273c5bb6c090f57d1a2c71c83d6db99bb64d6620f0000000000000000000000000000000000000000000000000000000000000000d5b6e753cb106da3c716a35df2d8dee3e417541b97f8f62bf1fe16a0a6fd319c9ead626369bd6d5f8484ff3da8a9b5c89c18b2d2d268e456150fb20549334cb8296673afbc702ea89fcf861b76b66b8746885fbf3668e09533eae1ed62fdec1179372bc439fe3e8ff996941583cdd821fa061b44ae3381420f4d5973f6a1c537e30df0147a77e13e708e03b38df52f197e2443ea7f7d686a34a47aa52642dc47ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2ea7b694001f5f3d230108f2e954385b3964629545cf5ffb1c89f944aae7b97f0000000000000000000000000000000000000000000000000000000000000000ea3c55499635864516e47c9569140163ec17b994aed30db17408e09a0f05fe2c7f270490ccecaa24cd2f3a34592ac8eb88835240957395e87c881f69826bcf642a78d7bbb6057f8839d6b39afa757e8d08156e2b63ec70d0ba55a8312a8f1989\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3da479f176b53c08e1248502a5bc75aed6c71746",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cab01000000c52c83f28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41902000000b66db99f0378a38d0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f874b030000\", \"prevouts\": [\"b33c4b00000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\", \"74f3430000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_d4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cc046d3ffc5e59b0b8de740e0d2de28228302d766dedccc174d524acdcc2ed89c895cb81a637b1f4fe04aa7e54cb8c1ee76ef66a352e363340888b71a94fbabe01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"12ecb9562664fc9fe8e7241ab3dcbd019ec2b56bd1e66261b7dd25629447514533420a00ba1cffae854a80eeec73b6f6d25c5e947862ff61b205e20db15e19a9d4\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3db85c10d9886a1d664d6d3db26ae7961d66a4be",
    "content": "{\"tx\": \"5c3eff1d02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4f0100000047cb658a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b400000000b06c21f90234212f000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac25020000\", \"prevouts\": [\"6abb1f00000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\", \"fd3b120000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"417d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936625394cd07ac5332e9837d3d183b906354a4c6266a0b69bd6286a70cd041b76b45bbf2815375aaeee056e6b05e441f58ef8c911146e9d15e94b57fcda7a8d0b76831d286b681d36077bb0670e25d1d3b2bbe36e9d696c3276746d4ede397eb7d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369e909eda73886f3ec8a47c266112c6e5fc7df5ec0f1bcf543e7d218ae8f9d61153f01d9cbc4ce44e53bf46e342c1ac713c14ac9ff1cc3e88a31c5570fba253bd819e00a9246c8c145cff8a91ff4546d478c6c8e3d7b4e3f7e61102a4388494af\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3dc41a3a65eecfb088cf236466ab9fb737a19b57",
    "content": "{\"tx\": \"23fdaf0a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b660000000016a519fbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3a00000000879540b203c8c28f000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df9797223689877e1bf628\", \"prevouts\": [\"a61d230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"95886f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_a5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5257acb12077e4a0cfdd11bb36bea1087fff8792c76a2bb7358071fdc265f3bb9aa43c86a11475e75689650c685417cc22040689941255f306e9a043e3585a8b82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e70b535da6eb381f0563046cfc53c3c41e92dda54620396a8308c80a3e02443618e41919c1224794946240f717b0c81f81ccd67d4658e5ff6a05a150bf8a2367a5\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3dcd87542c1fe27ba922187001739130ac6c6c5c",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40001000000879be48fbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9600000000f30fa8d6019bf8a2000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487e62e0b28\", \"prevouts\": [\"7d1a3c0000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\", \"7f417a00000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"327d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8dc5eed1d7503ecfab0ed4d46e7cc50ff1de729365d43675c7ebcad838ce58c01620e954adb3b90d8c3597d54022d70f5af7b761a66be618c54dd56feea2be872\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93640ff68d439a51ee107fd83731a2288fde4c117a4005465377136bc1a4823e224dc5eed1d7503ecfab0ed4d46e7cc50ff1de729365d43675c7ebcad838ce58c01620e954adb3b90d8c3597d54022d70f5af7b761a66be618c54dd56feea2be872\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3dd2c473cd54ea601b15cc9840f01e6cec72fbd3",
    "content": "{\"tx\": \"32a22d0702dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2500000000efb94c898bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46401000000695cd28101bdee5300000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acab3f1920\", \"prevouts\": [\"d04b53000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\", \"5d2f4200000000002251207a2f20e860cda556c5e91362c7f67d77fa79d70cce9558dd8fd8d88940237552\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b6808ca78b661bce204a3b17b7f3e8f2aa2063dcccc4cffe698227ae90135b9096aecf1c37a7131f7d59a248f44ceb50bce2e40baf9d4d5e1aeebfecd7c68de1c3935167daf605213b52b271f9e6a53725a69c71e98809d589a82fdf67815380f2724b50b68b4936fb2f7b513f82364d9dd2ccf414deca202e2eef9374045dea4b83545d5f0f8d552e1465fb40c88d4cd8c293fb2145dab48252f4df6a68a0342ca8463c38a1f1604f2a32f235f9fbd94c74b95e11ee52278594a144f8dd90888cd13eb642c3c10d17c6ac9b63886e361011ebd5915c34590f564d77fc3a7c15aca11359fae5b5630d0a75d10fc7715c6dc8773980cc9eb22c905d79cf9d58dd2b1184204353f56a4e46d09f63c64be304dd5693cd9aa08b2609b52ee309f40e65c7c49603b1a5c41273233928c568fa04cf2a35bd8b9fe7de9956e394c4a5b2899a477c8f71ea808155321e54be8eec7d2bb9ca55b9b68942a4a3a79e5f292d3c3a9cf243ab0b5d734ac1d0932ca89ab10c3c71f836f660ed23967efacc8420f9263f7a8dabb7e729d7ff900df6e19e463515b0c89fd48d00593fc1c733040e3bf33d09cbab71b555a8572c90b8b25961fcda27b78b609916445e5d8c0328e6f12679e309c48037ad4add4c871b5375afd3931f8f35e578756078ca47cdb79b78d966d308d23ccadc276bb7badbd4baaefd740dd04639a5bc24e6c73b23001bb64e7ed46dc98bfb9b75\", \"6f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93633479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4adc39ce81a6fea632ecf565fa45d7a7ca50aa2e3b548038c9066d72b539243596a6ef766bda57b4717926485a86d332fc460fd2733e6a54825f17015621dd4290\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090238b87369689df0d41cdac31b08995a5b5ce07b2f2182732f8a5ee13a8c46780a7c85e5c7dd9f03be4c603203eabb84a2ee8e277b2d1b214e1ab9c98ed1805c66ba91dd012c4b8201d2e8ce2a5798f2d88943fe0259141034a54590ee09c88fe1d7bc4dbd9fa306acef3a2cdb0bb049d37f94c42479e25a1ae0312dc68ef252f9eefaef6dc28107237690377498009a80915c5cb21c99330db43ee2d97b8c6d0d301e216db4ddd6a28602dc6e089eaae0ddd58d51cae74b1857d8a3acccf4a582e9db8824b23b412c96b228064952e1533cb9cfc85aa762a16439a9c5e8d8f4ce402316ebe911ab27241842dc750722ceb80260614ea65468508327e49c43cfd9a00569d1bfbbf457beba5e1ca922857ecb06e1d3fce829ee0a17f0759b212f1d747ded1588f92d9c4260cab743db6e3c39a225a552b3d7bb9d38f5d8f0a78f7eea7b3264cfdbe23ae86267349c9ba2d8dadb6422ecaf55f067d68034f0c2ef11a777fc32f817dad4917b435eb31731585dbadd9fff7d3561e197954accd4f7596b6f92e9e4a5331dc36cc554051aaeb4cdb7e0072217b9e87c96aa556ca317b0be58298baf2d898648417d8c5497fa22883b89d7a05d9e6cea31c148abe45ae93cd53cebbb6687826b8537fadef6ea42f09ef179e0b8c5b6aeb115fc6db5fbb590348674e614e791df6c325267d3a3852f04f6c094d916c80e7dc0b15cad867325f5c4830a2a6f1a8175\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ff7b311773aae467fec7730c03ca925f7d90d2d8851bbd9c3c07340c4c785e894cd3bb01e072d01d43d3082324ff6e625f5d569cbe89802b785fdd288bfd31c9a3f8f9fe88f0f431b5ffad473abfcf1c4b340e1c7daa1232bf4c86f035b8cc51\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3e0593c1054f6598bbf8297623874e58ed4f2f9e",
    "content": "{\"tx\": \"671d5a89028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46a000000006a1175f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41701000000b71cd6f70163c15100000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac85010000\", \"prevouts\": [\"96443e00000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"82ac3200000000002251207a2f20e860cda556c5e91362c7f67d77fa79d70cce9558dd8fd8d88940237552\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"537d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee1ea8876939edcfa4030d01bff156fecefc420cd1c8fec8a2f14f09f14c187072e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fde150f8c7b4812d3362c6afa34922f3b5cc4b63cc9e98285537a088f4a7fe3bee\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d603694b1746abcdb32c29db50a1413ae8228bd62a4d8e06b3ca802f4bdf7f4d1d38f649aceaf83ba76018e55a1207707882be6904852f7ab0998fc8ad53a321d892d02e0db2d70aca72db86bdb1e35d04291625c81ec0b3d884b10be9f787fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3e1e6aa2f96548cfbcb05311c5d24990bb96a8ef",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff6010000004f498f07dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c860100000008441211dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7700000000fe3bde330149db9a00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac9fec5531\", \"prevouts\": [\"f6da7500000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\", \"dde94700000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\", \"c6d94e000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"9f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e93df6a2e62376e6a3587300ef2d1a395dd90428413a52508272625b5a1a189adb591a16be56540de55d9fbfa115de937b3aca1e4dd0f5a93f17ebd2ebda95183\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936327099b01b253298afa4f7cd9d288beb4aefe51868cce630b6f9dfce458fab5ee7391eb2542a03443f1c351bcd0fdf78b6f5cd40e118bcfcda3d325918034371ee453f7f7ccbda5a0ba96115b963083e4b2e9e93a3abf82e4dae88dd7e6a6b566f3617d560800e971f99646d89bd2028caf0c6d02b6f505a11fcad3ec349c801\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3e2370ff2103895a7c13f394468b1d7588a525a0",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffa0000000003a2aaccdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6d000000009d67e03e033aa3a6000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75b000000\", \"prevouts\": [\"4d2c850000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"6dfe2200000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09026bef139b8b79d9b15d958cbdc1f728486a1718f73e2355a089963e4abef9c0d503b1eeaab8cca325bf1cc68a7cb2c9007b6e3cdf7d90d077d3fdb5dea4014f92c79b5a7809b8bf0f99b1c26cafc5078f267efab1ac6360594a44d476debf7308e42d1fcd5422450c9582cea176c964e3dd81e6efa117624eec6a270289e54b52dc6dbcb1c1871cf31a3b082e5c263e32fe9abf6eb6dcc57b3a03bab8f0d9c10ddb444809c38e9008d328f48fe4a1789cc60ec6c29b11aefcd608361ac35c552d3d916f33e9f4cf10f781192c36d64c7c8a418e532ac353cfe8a4def250752ad04df9ea2656ef4c8cdacdb759c4affa372e05b789d209feec746223df4f9a426315f6cad337e1813a18d09c2554dd0a5ad63a9c523fff216b13d2f500acbfc4ad0de8f33624c87459f7fd881637d005f8d29cbfc6cc173e2db998d71e68f64a9c8c7b89c0f08fd72c86760ed05ccab90116ae3a35ed863898d491f7871a4d38f8db75efd3a04d2270c597ebce0db412c0a3cd3bca56d8f30254acb56bdb6ef26b29f2fcf25b953ffd201f32c68a7f183012522e61cedd35bd8231329b3dec0e1594bb77b39126b0acf16a6f636d9ddfc6fc2c28b3e5702f8cc6a2118acc3eead4eba8cb88cd566ec2e671b9ca1dcd533518eb6176ef3783690962ddeec7fbd68a36f9bc9e98a0787c05b5e506be860c242e07017f3244b62afc92f110fe3d8b3682a25f0a3f6b41736375d6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93605b68b7555431fb9df93ab122414b31e5279de2800baba6f217865faa01584b0c99cdefdc3473a619e12778c4cd588646c716d59e86e999fbd28728a66c3e7c6a7d0a3f3648f0d829df7cabdb8f0af96ecc09ebc190c461c6b5fbdc9f87abaf73acfa007b318c5da81cf6562f4932e2754570ba3b679b809769f541be0a6b617\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09027fc358edd531085246ad04f485140848bbb9d22877da445cfc3ad769c9d8ee95e64f53eeca28db66fa027b0591e1c3ca61fe25c696897b3964e955bac48c6ad49a19c71aba49915e98f8e3d906c60e21726f79f81006f14b4852622007fab3ab7ad95d41188a1083ef45b64036be273829094a699ddb4e6d3ab1b90c7d1a91f20673fd72c8c3e1b8f51075efcb46386ffe516586ffe0ee295a40301bf816158d2289f3923f64efdf7a42cb069314c20dae4a200585ce8ff36fdaad7751a7ba1fee7ed082f64002900517df0f74f769fd79b9d0cf27381262cada3d0072c7b42b3580d1b544716ad0b0770e6b91e7aa5103d872efc3c375f5efb59e11dc1893d474d5f8c3ddb0b2982249603425c4f6a3145f12b3de2f2e6d0fed88b1f5c1bfb5d1d17ba34eb6e31ab53b9b06d7d8c6be8da8a181e88ed63ec1b6e0c9b8be43e2b0d5f3ebded902e468e02baca64940cd8a540c713e3fc113f5a7723762d5b534d63716178b90887e65557be9ce5c60d50bb9eb694f139049c6a6598fcc791528bdc63b58ddda9fcf95d8ec03f3b6da6f71238a7298ac7760832d2607be7da01b0a10f3e8fe9ed179e5b2ec31d04248c819ff1e94c2d5900e068dca4bb28d9405d578337cb16703ba3c9ec801fd37f9d2a85c8d199979152f454fcc08d585e96f86e8f2ba82697e954f51b1cb1aa01c801b46f4a2d96faea8b733ace2efa2f842cd69e486688e90a0907561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ca585b58cbea5a7207e2f9700bf95d02dcde0e3417cbd056c4efa914a582a327ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b22a5aef24b6a1c01bacd2a24a37cefc04a347b590d10f3bd98469f969c355217b0dccf8e3471e4a61057d1540548a04f67f25f6a36812a8ea9d07747f2e4b3a8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3e30536558f547b9ad4f09f367634b969078f719",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc200000000f7b7a2a260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700e00000000e4710aa80255ee7400000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88aca0000000\", \"prevouts\": [\"07906300000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\", \"db0f130000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"577d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936959ca2c498f0f62da8da99e7dd3b27b348a55d74011ce858dd89c431589d8b6e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828cd69c149de1c0fd775c23d200817106db3811e77c5a94d49bd03e58d7bcfa223a8385792857b3824bc259fd95f469eb32c57805e5f383de6590f06749d208e6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362130eabd9bb65b7301a0825f895bcb2d1ad88ce8047b79faf2c001ef0627842a1c685f9e7861cf217f0c3f090528b45399014026e5720182b0faf436212c9d85a66706abdbe591f97764059d8785051c12d40b9c9543fb83334d204ae23d8b59\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3ea9b3574203d1cc954fbb5b93f7588b765a4d0f",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ec000000003f55e4d0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4d01000000793d45fa02b27535000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7a15b323f\", \"prevouts\": [\"522912000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\", \"43a8250000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"907d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8693163a47c3dba2861e33fa837573abaf06e3047dcd3f7c322d2576c3cfe3d489f4b63c6df7ef43e2db8ec562e1d1dc49232dee39216a09a14bc3b6a66d1e38f07d6dd053b835b300872a79bbaa392d17bbe19548a92a63c5948e9fc7e63dbc8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08251b810e60c043042e0bb2eafa8cecc8c22fa830d489bdf7de51e14fd273b03e0ba4f11ff80ca9181e3d85997fa959accb8f97af45a52bfd0df916797673441f5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3eabc6ab34a7c9a974850c1dd22c428aa05b1b1a",
    "content": "{\"tx\": \"c500bd8803dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6b010000005ed744c48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49501000000484908fc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43b01000000f2652ed601e58f2a00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7f5010000\", \"prevouts\": [\"d29a240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d2823f0000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\", \"17283b0000000000225120f103da370e61120ffbfed9be73547691440e55c4664603c27eb9ef615a7ccbdc\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93677e41dab50557b5b20871f2553a2bc1c7b9ddf7d5b647a2744f571de9caa26f1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a57616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3eb9a6cfe1aa2c1c02424702999504c5b096248f",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127016010000005a40fda98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cb010000005cc4a369dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cab000000003c7930a40216509d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac25272e3f\", \"prevouts\": [\"2ae70e00000000002251204929a185ed20b7f7e86ae8920b068b5e7d5df0975bee6bbfbcd97b6bb81e709d\", \"b3c23b0000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\", \"8b34540000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cf152d63f1051f9385c5addf6d53db16062c84e9870929489e0718e5f0e91bd5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a01616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3ebde48f5439e084e28144fd489296408e0dac44",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c493000000004619122f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705600000000f0a051aedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdb000000009966758c01ba080700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac63030000\", \"prevouts\": [\"901e38000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"2cff0f00000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\", \"676a26000000000017a9144c4b1fc943f04d775886b4f6d3c3c73bf7d3118c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6abc\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dae56aa441f4258abe9bcb76736e618cba7a98e5acbee529967b1ef4b09363f599aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d5154a115ce154f943bf3cf8f46c74cde664956f57cd29b00bedec3f53c1a73157ff193055e5853205a1117b7666344cdb66562f15b4d40280f3656784bf5cd3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fd8f5962b372cb4e7f2fb078cf6d27c268bbba1ff2abc83942f0aa063fc70b686a0ed0b6cdb130b03f26b8a245e72d5247ee3941518d7e9956496f6ce27b97d7150e68e664a4d5c991e5183d0e7966d99b6c66da3079bb04bea44808922b61bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3ef5bed9863d50fbfa4dee5c776d36177e888adb",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc001000000cc3e5864bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf850100000023fe971b01f0091c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6c780bb21\", \"prevouts\": [\"5d6e220000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\", \"f656660000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e14c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366ed0e779cc15e2a03d2e3d97c8cf6c7506658d81da92e90af03d7b12593133764b04f8f54a0a76ae0e4c7aeaaef28ce29fe1b2cd8b193a4d28e758ec231d2b883bd198ccbfa9c702c0592bb8c84a948c36ef9eddfd1aec8278a333dab45811656e171838972c3c3a6cdacf031a4825f83b841697bfdf19ec3d087e2c9ca65f0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365bd9e6af64badc3bab736f59ea7db24f388eb048beb664b97cc6c7235b822e2c1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045f693e8696ee404d8be98a67cec2febef1e0f75b013501a27963a3fb4300a4da26e171838972c3c3a6cdacf031a4825f83b841697bfdf19ec3d087e2c9ca65f0b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3efcb90f4a83944731d1cbf69fcde8147549f8ff",
    "content": "{\"tx\": \"fca5d31203bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb801000000d35e6ddfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4001000000e5f842af8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49500000000cbb138bd029ea525010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7b6000000\", \"prevouts\": [\"208c780000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"859d6f00000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"eaec3f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100817ec35acda74ca63193961fbfe82d53b1e97ee57ddcedd61b88c3e49cd38570022025b39d8bee72e545be9bdaa5255eccc67036b5aa1f5c0417168f798dd7e15e3e012102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4830450221008202765397f684b91dbc2d69586666f6c5f1f0012eb1dcc5235401e6bc3818a302201970e0bdfcc3817f49d88aeb11c4317a096229ed3911f7d9d1eb55fe179e99de012102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f08853267dab46c6370068cbb68b228923ff0b3",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c601000000236a23f860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127010020000006b91e6da01a7a13100000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac3e000000\", \"prevouts\": [\"83e233000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\", \"2cb5100000000000225120f52aac6d1851a3bcc3e02eab41e79301b2d0925e53812529fe85f9ade1401e4d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"304402200218967cc003c22e4af7b2444fe390eaf3c6457bb906b8a209a59be641896c3702205b4b4ab9d6b72bc0b58a7a3fccd57cba4bf5597292f8e85dd97285406b239b3681\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"3044022015ee4b743fb8a158aad5b103be8d9913d0514f9bdfed33d482ba580d2b60a2ad022059a6dcff80e0a020e01b2dd65b7b2b5871d1f4648b20673721cc9956c8a4edef81\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f1549e9384322e64380cd38621193a46900a116",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfe010000000fe2765760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ea00000000cfd16a8c01ff36080000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796ba030000\", \"prevouts\": [\"92fd270000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\", \"b4031300000000002251206c786b308a9c6a675d6ba645c0b3fdb6ef76f1ce96e6f31b784e53054a24ec87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"a47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93630a51e3ee68449166d2da506d8de0f0b7ef39424ebe5f034d615a238e9b2a225f873bed7b94a92ccdf1432eab063a27f935bef099df6a1cbcf6734b218f2b6aa9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100eec4f69e5cd9a0f0c1fda8eb2f54297e33bc5edab35b299e65e2653a923d6ca55\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8df22966d6a6c55ca54713f7180fb521ad1601010bda1f1af87739ba1b0e44e80ea84c8431ee0615517346b97932410ca977012a316263f78a9edf0a452e478a09da521cfc521edd35405d6ff7b10120e980b699014de05f8e600b437ffa9c347\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f1d506b154892f06d439bb90ba5202e723507eb",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c130200000021444841dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3a0100000069712e0e01f62b6b000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787a59c0849\", \"prevouts\": [\"bf775c00000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\", \"e8922000000000002260202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"187d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93606a629bc116268be1a17da3f53dc5135cb0ba720860d61650af2ab2ef2f0d65c919a726f5226a1e5e752df6df7fd59ca609863b1a6d095747bbc103e423fb93280858ffdbef3a81ff8eaeb69bf692b0617d2bdcb9145576d5843e6d9e5e1cb0c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364394e80ff16ebdd0b8084d2a2ac0d9fd937ef7443fa96a9eeb67a82d8ebac460b6019e279bd309d4b7ea698da82947cdf92f55834d49ec05c8520ba423c90b8e919a726f5226a1e5e752df6df7fd59ca609863b1a6d095747bbc103e423fb93280858ffdbef3a81ff8eaeb69bf692b0617d2bdcb9145576d5843e6d9e5e1cb0c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f512330103073dbd4f58e82fee2f316a4b0c171",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4f01000000b02ea1ac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e30100000099b12a1b60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703401000000cc4e3d950314417100000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc757020000\", \"prevouts\": [\"0fb65300000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\", \"2ac5100000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"03740f0000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f98b4fa7d70ccacaf149110d37e14afa465a4cce5ea58b45c718aa129bf119442eae45bdbc332bf5a978667243b49c9b979fe92ee1d9ed3823912cc17c63e45aa06b7dbf505033281bc2802f60ea73c6b6bc1ec4f50a830b90bf520018ab39223a7745587804ad8af30810436e9dbff8c3bc66323fb3ea116bdb1b433155b8cfafc20e31cb64906476b2a49674dcc56dc839ba3ad707cca79aadbf462217ddc44c41ac963fb5f1bdb0606d2b6ed11195b99988395877046c99550680e0a941e5e450695eb554e43952678f73e19842e91c51732f2d32592245befb41a7a633df89e310fc546102273713727bc77812093d115b4bd3c7cf5ed4c5f32271b3ea9048d6897ff72cc6d2aba20069ee681b7d46efa95eb60872f3b25eb768042251766e9498d9ffec2ef72ca2be3485cef961547f4ed4f3e82a48dd8f9539ab7efd9dd442e303fafe3bc0f871260ccf1b86851b9d36408f254a47713818c8bd1276285efa3bd8c6702c2a71d0f23cf1a40253feb86e037fc80c875b7b85d2d40808f04dd8e71a76cf127a75a898378bf3c29b120dc4cfaffc8ac9943ad1a7da34523adc8e2d4f3fe5888ece2e6cd48deadd6d46b4dd99f11e7cd0bc9ae3f5f1e0f89302c3408f24d23d8baad092e0ccd4837752a31a3a924d62fd3e2af9c5e12a1f7ae611a0f59670322afe19b2786e4010a9f0a2c29302b14e006f4d1ced3d16a49ef31b30e97ab16fb25875\", \"ab7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366fa2c694f390b743554f08be0c7f2328ba8b079239bffe76afe54da1858b8f590144ecbe7fb1e6c18f5b14cfe26e6e35ca66fe7cdb676ad740673ee849f6d44e7c07bb1aa10d02d314eb70c923196d0e49e71087637e2d5a1d7fe44c2440c398\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c3c94536c8f4da8e5efc8cc87881a5bebb7ed90a9f2d9c743344c030e370532771538f4e57e2d07a516488e39af25bb3da3817bfe5ba4e2f14338112ff799177b19c6f4d69232d1f310a3af5ddf4ff5206eadaeb6fcce8b84fefae069efe5af5703a7409d69a44056ed0e7b8e986e6e40cd1f77c415ad7cd7c37117d0ca07a392435a4a204222a4dba5929e800d317d04272d16ed139a337879c2294e886132c361082ea278181be93b8fc048cba67e2d295a51a26790b207b3a73aa3b1bc9dda9fa49aa3d0b131080f38342311c3f5480d3a361bd37f10e82453ea2875e79426d3780cced736ba8f9a09a951fe7e1b83df0f10e19a297456677c3ecb1d5c861b324d9ba2ae9b2c912b0c589ddb26ace771915921eec798420b874594b9ed9885dd63ffa3ec327b4263cac5fec7ed49c66a747efddc70fb09d3116f942f71cacda11a41a50c61d51ef97cb49d214d7de0940482bb090bdae946ecf56783b0693f953cc7ddcb9d716a89823e48c5d53256811c81a6749e79a3605bba2e9a47e0e41be9cfef7d3fa0de904e1964ee823cfba8b1092030ea6cdc12c0f3e26d85ae27ac8fe24c0d175bf4961faa95bd4395675727fc84629284866fd7e266446908522d69d97b7e425df6f99eb6334ae5f76a3a8d9d32f7d2d0ca62238376341edfecbe37c2eca14c74c404974bf387632efec9f1f0fba009055e8a5ddc3e811eef63506d274592bb2f4ae75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6ef3dd0bfdeb3f64daf38e1101738c14790d5f1c68393c583b55b6fea5718d19818cb303569f28fbe8acbcc2d27d183e3a68170f5392df28f40a03efea695d856e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f513698f389965cd3f800cde5d06d6742166c96",
    "content": "{\"tx\": \"2c3a87c40260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ab010000002b52538260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707e00000000bdae3c9301fb521000000000001600149d38710eb90e420b159c7a9263994c88e6810bc72c010000\", \"prevouts\": [\"b42f100000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"cc000f0000000000225120b52a77e37c1fa9b4a7b934796858277b8dc346396dc90993eb725a9563cf0842\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f34c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364b47e9b9572a2fdbea0003eeba5c6c5df8476b78e561177a43bb360ce14ca93ec9fc6c767d5aa72b6a61d813f4dedd67fc97d91e71acf86e276ab6f41d1da0fa8c03caa221836b2e776996c8fa4c69c403af6889ee9c99c5c1fa82cf4b3a1b61\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ff3c01f4eb155968cc3221659e149da2e0b6684938cae443a11b820562bc19a4e05de1aec4dcfd94364dc697d2506f2d3dcb95f0b1cd2734b3ed6d289f30b19a3cace0aa47e1a0afcba116b3dffe01d164ab3e15a9a2b15599aaabc05c638667\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f6985d5b0c8658ee84900aef20ad6b450f6f3e9",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707800000000d472c2ff8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47e00000000b22608f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbb000000007c5fb0ca0254669200000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8e01af3b\", \"prevouts\": [\"ab600e0000000000225120a2c28b736583e5896e4a53bfde129100bff930ada42454ee2f7bef5a60a371d8\", \"deef37000000000017a914c7d65cb5025eac8b5bf295baac9287994ab34b9b87\", \"28374e00000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93696c243d178212e8777fbc993402db4381baa5ece36ceffefb611138a29c3f415\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ab9616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f6a1b44037f9a0ecf95cd3d23ce8bde0b02ff8e",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca801000000af0593dadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1e000000003ce8e7810303907300000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7b3a96d28\", \"prevouts\": [\"2743510000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"27ec2400000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100a6d030e6236df5287e6444afbc3138d4def56ce2acbb80c3a7930eda90da5bf0022054202da46b6bf32176850e1a63cd3aa7ceee558ff527fb963fa1bf405e240f8983\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"30440220422fabd2f6b6feff4c2386182e09add737f0f5870e761c08d4dcdc3ef78c38ef02202f180c439dd9b7c92a996dc1a0f19ba231e1bb84372db366d9ac04ec7daabff783\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f6da0ebdeff4ba77b33c2c2d3b962e7dc353570",
    "content": "{\"tx\": \"f43d36db02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1700000000fe6134a060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270be010000003e5d2c98033b5d8b00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac2b000000\", \"prevouts\": [\"170b7f00000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\", \"32960e00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"47304402201b1b051e73431f017ee5f51654862cc3e77a553eb2632799f978414d05093b0e0220051a3de18d2bf627cd036e6489216ae87038231777b1f90cd3756bc15f259b918300\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402203638dadfbc3ffec5bbc6c80b9eede4b8e941cec5b12f91faa3aa5bfc6cdfbc1502200f50849d3234ac799332b6f6c6fd30725a31746076feb16d59a5b8bce7a95a47830101\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f7737e152b00480f6b1e13136938142db63c3bb",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270170200000079ce70c5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf31000000004c1ea1b001a9b353000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748760020000\", \"prevouts\": [\"7ff80e0000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\", \"541766000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09020da30906dc4223c30c356b2e1a26c196af1d396fd7f5ebf060b38fde6f589fe587db80d1f7df68dda19e57c8fe86c4ae7defdfdae761407a694e4eb28a17be01de68a7c1e36dfc1fac4670abed59fef0ad6dad16cfc9918a428398fd591c027e08daa77779fa82ac171630b23fe1f5fb25b52fcbce65ff3b2b2587958c31fa4b387e1193adfeeabf919e081d91104acefa870421240fe460f763962d61d30ece56c3a01ce5ad7de454a166229d011f3550cb0f30e9d3847b5d190b147274603bbdb78cd0fa81f3d9834734eaefe30c6570790c6081839ea1401c4057648ba81b2d8b53fd3c79867422f854d803ca2f357a8a0f75424e7814d445d63d6e4d622e5210f0052e70d2800e2f8e5b2fbdffe8b324ddb15833ed9cf2c27914e3d9706208e25faf90c078e5cf9233393ba92b92be10e63dfbaaf45dc5876b53c1c9778cf7b44783d736667fd219fa87fa6372da3afac3bf18596f01d8745fa34fd0a6eb5c1a758802845e391573c6f76891ba2cf433e0bc2aa2578d4e8d5af5cc538621dd2c08b2c224de89cab8aa12f2b832c8bc92a63d91aca8cbfaead4331ae09286c83e6fc0ef357ec64edf280f39db9cfb9421f4848373717957a01fea3e57b26f13fe300ff07df9cb7dfa4ba786c3f03b35af174b3a8fc9e76e5445af96a02a35b322692b06010a1b70a40a0c953c1cb442fb589645c4d74554c742cc18bcbfb0a16beb29f1be429ae675d9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f2e968ff58e95ba8bfb88f713127f2c0a83030ac0ad8720c76044b40e2e6afdce051b2f792b2f00393c750e2f5c1724429883d9e1fb30c50e31a79f17241e62331a3099151dd9022c8ab6721206c57c00ed937e9f62099522c543aef8c2ea8dec19ec7aa48c905d8ed6637f3c17c0400a43c560e5c859444683190ee16fe2235\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090268aa11dd125163f48e7c3bc11c91e0bd82a3a578c8bcfd9f5b6cc5257c749c59b1d4cb1e4aeb7b01ecda1692fbb464e18a29b2147c9b2d21b6c71c5249e286ed856e078000325efd1bc6b68d2d171d4d200e79b776ae802d55bc20a99acac99171b584bd56eefce23864306dcc7029f2f8666e8b98ff7a4135d8aa6bd5be32b7491bfd15149a818c90ce3452f2caf1a665902d9651b56d33ce3a7f60fd28a2f474348a9fafd3b2a96109cde6441c11dc2a9e33211a62a122174d40aea7390ffab5a03623ec681c6adb5bb0121c558e3c4484384fa58703844e42ae81981bbc1b142e5809b7021e6a1233e4733ba72f89c38cff6db5c321c6e4b773845d8eb31192a0fbc554c89b6a3b3d5ff22ea9c10d01099cefc100d7dfe1d146c16d99a69a4830b2ee11e561490fc6c8b85c31d8c05b3b97d86e9555a4d2325ac8fed45e2b80ddfa03bd10cc44f584e85043ac2070a88f27d5cd36d0cfcbe46c9509e55d1ec7068c26b2171000f22aeb3dfe10e2e8eaa063b27cc940afe0d8412a9feebeb0cb16f56e76dda69dc0fdc50976b0e9094f55a6c8b83d238ea44a457f43b06c5777867df76e7b67c79e1f1ae3b4c82efbcbf5f42105af61942b789b968c2116b62bc049575b1b05e3d9b0f44eda5c601d6a498eb154235615b9c31084c2f5517c42d12a13d88a60d9d4d4c5ff0b4ca726aa894326cbc315c7926f7973aecdbd0cd3e3ead0c86b8a46447561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365bd9a855ff120153a9708859ceaae16898e3111e3492b3f2130b56cfe36cb4d3e051b2f792b2f00393c750e2f5c1724429883d9e1fb30c50e31a79f17241e62331a3099151dd9022c8ab6721206c57c00ed937e9f62099522c543aef8c2ea8dec19ec7aa48c905d8ed6637f3c17c0400a43c560e5c859444683190ee16fe2235\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f7dd25efaad7cb28967f110fe74e5e38a763ca8",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46d00000000e4e24797bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd0010000006cf86596dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbe0000000039bf39d9014d7b6700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5e010000\", \"prevouts\": [\"b9ba3900000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\", \"cd767b00000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\", \"7a8f2100000000002357212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"894c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d26d1004a8019ef2e1188b07306b9375b4b58b003610908a9f3451755ce03441ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900454b1cf341ebb9351320fe3e143ffa2dad1c15696d7ac983fbe7e302fe7a073e7ecf46474fab8e7e9306b35224640e271c3ad2c01a28b74e8035b5ea3da4b2d4b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51d8b8b59ec9330d10cfd242c1699350bed4f76e625017108107d5490f0b0ac19bcb3e0a345cce78c1fe891e9b22b966ce84a8b12623d949f63d5e15e148dd67959d8f9ebf09b0c450213ac35faa1ca38fcf1ad0a46ee35414da06dc92335be8b4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f827b95772a69cca7924e0a2e6ed2cef8755536",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be50100000063a870e860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705a01000000ecf01f0a0126bd150000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c32f391f\", \"prevouts\": [\"821b2600000000002355212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"050211000000000017a914a4e57198280c195671631f8b9014214c2f083b3c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8f1ded8b1cd3477bc520967937fd94eb82f6b542ee85528386023e89fb107d527ab78a30ef63c3319ebabb576fd3449b575a4676437710f9914ebc505dc74930\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f86932b9bd5a8f673b4dd4243ebb78bef50c888",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f200000000d11a06a1038d133200000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374871d010000\", \"prevouts\": [\"a7d134000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063fd68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fdd74ee01a272cd292d2b3c7cac8438ee48f053af121a9be8314077ca1dd604920e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1e0a7be32fdcca7a506e9ce249f658cc089bc7a3d23614d55e872a83e7956fea4416efa3a61de7db58e4e5b27e55eab88df01883130071a88e8c07ccbf4e37c61\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51cf0ef20a11005175256561cf2f67252fad6f828fd45e261da47aa072728c1e1d416efa3a61de7db58e4e5b27e55eab88df01883130071a88e8c07ccbf4e37c61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f8e06a01cdada6071275fb451a2ba624eecf6b8",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf59010000001611e3da8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4100200000040147ee90150805700000000001976a914c629d61df58baceae110d15eb5b55e144268615388acc4030000\", \"prevouts\": [\"854e6f0000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"53a039000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"f1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4bb0b9e3baaec320f7de46eda77f4fdd2cda08039a1867e75a703bfdee0f4ff6d1cafc3da456d473afb79353f7068dc1822b24dbf9d7eaef6a0c8c9b611b05e979feb3ebfb72e1f3a9e601929fc7eea4d0eaba4c5291f01c808279d3454a78ee1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1b6ddcef20c10c61d9e21e2293389fb4d83401974c63955ae345dea7dfe41530ea78a04935edfb84e1b4b71380d58e01ed379cbb21cec8f8440ec0fbfce597ab8cd941a6bc152cbea0496b075d4b2611b435301778200e60e8b4147cd93749673\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3f9e6c510733a54871b5b12db956530901898fe5",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702601000000580e63a5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5101000000d93ed2df03842435000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac1f000000\", \"prevouts\": [\"d487110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"eaea250000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"477d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8af5253a3ae898682e613588786a672ae77746787ad628dd74364be19bb5242936657009e9173c5ef8826379cea4b8c999e3ae37a5805e4cc6da117a3d2ee0eec\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93624f7d08525b5d52815de985e807035e6f0110330bf2d62b1ce3b9c92499c7c7ca24674935b347637fb115fbceef28e6d08e5e47afc6eaa336546ee2e891e964bfd9e929a06047270fff43ba4c6b47136464c62381aba7ed74ab98bc69d199aa4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3faa53c6eda1becad9cec3442b7069bc2083f057",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2c010000006700468d60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701b02000000de835db602815d6100000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6f3010000\", \"prevouts\": [\"61ec530000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"4ef50f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_c0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c6c72c36e1b7b923a19dd384dae60627dfcdae430b0916158757f7c29ec316c5885a62a834d4db79520422d1ac58f56d8e747f3b96d9fe570f63081dfe6c6a4903\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1d214d6efc01024016deff46b5272504c03a8c3c1fe6c5320f7c4f805d13562ce163e560a75928452e9e532913d0dbdd8c2aeb3892889ece2ba25fdc97da0ae4c0\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/3fed18356adbd733c605b538f4fbe6434ecad6df",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e900000000852477de60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704301000000434e8635dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bab01000000ef552e5e0380634000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875e020000\", \"prevouts\": [\"f4eb1000000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\", \"4b251000000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\", \"e5f4200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"437d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f74173222da8f55f8c3eb790aea6942ff700236cf5dc88f69953ed52b194a9a0d9a73345c989c90f21221bc9fa2fdbe5d62b34ad323157a62317cd84046f2af72db79fc77699d349d3583c063c1ca5cb78d93faef419ab336fa45db1a25ff641\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936532662ef0d829b3b02e134f996fb7ab3a2665cf7ae2b3d0e4b000d9e17d468433f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0824274b5900613cb2e14ccbb49f92be42e903262ce34f92c4d0a103e0ecbbdfe862db79fc77699d349d3583c063c1ca5cb78d93faef419ab336fa45db1a25ff641\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4017ac5f35612181926802d0cfd9e7f6a5aed8a7",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf300000000050a1b45adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2002000000d5142d75026c9a980000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac27030000\", \"prevouts\": [\"3ca17900000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\", \"03c62100000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7f4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b6d9476ecc09d849d3c16682d4a6fd2c22d5514554f5544b52408747bbaff174e17cc42fca95eeef15c2a149426edd48c8eb93e73982ab4fa8378007bf5ef888ecddbcce676de51918ff82e75e695523ce4d8df7d4ec353d45ae6331617767e1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0824a1c4274957806206aadadfd15cabecf517c42c49a66a44e84081097b7475aac480120d5a477c096fbef97d1ee2aeb957fc425ff8aedf322b93097b3a97db744cf5fd42f9969f7f2472ed1fa62ffa49909a09466cf06ef7c57cb1be351156c54\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/40198d56b45470dd3064ec201e05ca4e3cdca930",
    "content": "{\"tx\": \"db1a6b1b02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc300000000730c61b260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127017000000003c7d6ccc044728720000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac09020000\", \"prevouts\": [\"5f59630000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\", \"986311000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e148d44b3b8b580a9f727722e46acefe6d67c1e6b80ead7c236fb066c3dd6b0bfbdede6356752267b6a4958657c43b99b93cfd40f762fcdaad4937ef48d6413f31b5843f54915b2c97abdf26ed2d562b36c2375ce95d63af6aa508e6368a687449\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a576d03eca93f143feb7e152136a467cbd42f46620dff7de4663782cb270610348d44b3b8b580a9f727722e46acefe6d67c1e6b80ead7c236fb066c3dd6b0bfbdede6356752267b6a4958657c43b99b93cfd40f762fcdaad4937ef48d6413f31b5843f54915b2c97abdf26ed2d562b36c2375ce95d63af6aa508e6368a687449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/405cc03a69b95e49ca66bdd71055159a13f437eb",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3101000000baf8229cbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8700000000f34c48e804c866e000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6bd667b36\", \"prevouts\": [\"9873650000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ffb47d00000000002251207a2f20e860cda556c5e91362c7f67d77fa79d70cce9558dd8fd8d88940237552\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_bf\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d10005f5b799760d6db41be0413cfafa254653405363deb3b3a14f8189a21ef604ee04cee3d85eb8c78772aa62bec509e3843b5b2b165f2688903e173de565b382\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ea71e794c0856062d55971af785ba96a89374e7fcf007bacd1d0ba6298e94f17e25fa3c93eba4ec23be2d8c9813808de14046230563f43d64726eee6055c49e0bf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/405ecda072acc56c38f0eae072ad858ec1097d36",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1800000000666e3e46dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf200000000f1d81ac101a24f220000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7fa698e43\", \"prevouts\": [\"befa55000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\", \"f7b3550000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"8f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c1a7bd15ecdb2694ff0f0300be9147ec1d2e75e3b8043d2543f57834df42dd6da79f40e3d51694d686dc3a1ae4413ff10533c43d32121e1e1cac9518583e4de2dd5f972b05e2f18c3e7c797b604beeb8879a3af7f1e10968a0ac8aaf9d489fe7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936df7ba38e6eab303ff43446256dc29f9eb9d122fbc3cb1286684b6b478f0d16a61f261744aaaab7b61bfd8b873ce05c274059b1d1cb072d2d2c67e8900f407405dd5f972b05e2f18c3e7c797b604beeb8879a3af7f1e10968a0ac8aaf9d489fe7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/40637530cf642a13aaddd88b9e805ab9eed711f1",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4100000000ade270268bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e300000000586a0d6902a64ca4000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787c5010000\", \"prevouts\": [\"d61a740000000000225120e5be1c56293dbf2401662c2d3a0e5c3ad348f091e23d387b2bf628c220dc03c1\", \"b02c32000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"304402207a350c25d0826856f93150b389d40f87965b91b00344eaf7eb19aab90f15a5ce022008560bc36a0fbbd7668f9a0803968c795c4340bd971436e82e7840676c3d6fbc83\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"3045022100f48533e761e43d0e20046043f1bb776bd6dbbbef4cbd83a29940511d1b6a83ea02203abc4cf86259af1158580eee83eb73412b4ff2880a7f198acccb39ca67163e3a83\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/40815dacf70ec14f7b8a062c9faaf258058731fe",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce2000000001a4c53f502057f530000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac79511752\", \"prevouts\": [\"fd145500000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"047d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e84030e911897c6e4798122efc4265e48d96402783f565c89ff2a62155c020859d8460181b685601280cbfaae0e90478ea5ae6fea73a2d03f5a79a14a3e0c6d503\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93665f2789c044d6944fb0be746f461fd1d8ebe7179986f1cc1563b6f682e3c1e51e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e84030e911897c6e4798122efc4265e48d96402783f565c89ff2a62155c020859d8460181b685601280cbfaae0e90478ea5ae6fea73a2d03f5a79a14a3e0c6d503\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4088fa75fe995a05522f18f9b0e6945552611611",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706600000000263fbb6adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1a00000000cebe71a7030bb62e00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87d5afd460\", \"prevouts\": [\"9659110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bd0c1f00000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646243844b2829720c8a21875c1e5ebb7b78aaf54c61f95ffa067870b404aebceb3b80bda1b133ebf5523b41a15c88aa3d5202619e06dcb6a8f4a5442678614e2fc39b3065f81e3c179a5faa7416c7afc60db6bda904d6a600fd6a7a1aeafb2cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368e895c8970650c6085b3331045ea781cb4c0c0a78535361d77c53655614766db9aed6a34821d65edf69e9d12354a87f406d02be059705f92363392a057792142e401215e29d5d13de3b6ed62165bc3378402ce71158bd1208562fc299f33fc22fc39b3065f81e3c179a5faa7416c7afc60db6bda904d6a600fd6a7a1aeafb2cb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/40c7820188392556b1df313d7fe8ad00eac4965f",
    "content": "{\"tx\": \"4a229c5502dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc200000000278d4f8dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9301000000fe6f74e00168477700000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac24030000\", \"prevouts\": [\"784b60000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\", \"40117a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"bd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082956f78f875a4cff3dc955be6c960f7b458e90648c2291f520c96d2b85cf15d2941cfbdca9cced9a9297ecbc29dffc929789a1848311039b5a24b338cddf0aa70\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93641dd31aa852e6f71aedc584ccf1bdf704b326c74e68fda16d455fddcb9868622956f78f875a4cff3dc955be6c960f7b458e90648c2291f520c96d2b85cf15d2941cfbdca9cced9a9297ecbc29dffc929789a1848311039b5a24b338cddf0aa70\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/40cdd6d34a71ec60c962c3ce8c6408731acebed3",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708a000000006cad66f9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf50000000010b9b10002826d6b0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca5000000\", \"prevouts\": [\"c136110000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\", \"bf2e5c000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cd4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5148aa6a6dbcb4c7060082480e3e536b464146150e8b2e96d2b5eabf2aaf1fe24e9f4d7ab890a2001a7be6cb25cf630fcd24657943ff80a7c5a11988ecbf9e80e4620a19fd562e5ef578d66d29c84f34a4223ab3b995d34ad300c7b5f252d5e140\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361f454233ea8ba792ff851233df40d07d043b6f28307e4b5e8da83231ec75b1673f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820aae41afa256ed506dae95e698e8dcc0fa26e2618e50e74a83d05bcf51ab890d620a19fd562e5ef578d66d29c84f34a4223ab3b995d34ad300c7b5f252d5e140\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/410f4c522606d7e3dd362eafa5a5ab9d9811a338",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2a01000000f6816db38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c467000000004c8c3ed5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa300000000092b0a9b015b3c530000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7962ad43c56\", \"prevouts\": [\"4e8f5e00000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"562e3e00000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\", \"81d36500000000002251206ee7f50dd8b37aeb440050df10921bea288340730b764e02d5c3920c65efa447\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100e6f32e5b47ffd07975ddddc3ed46ce9308d56bce465f2695c2182b84eca5b58e02204d0396a8b1af0de29eb1a068b196d61e713686feb1e31f473d0a53665d041a9c02\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3044022001ca27f7fe0468534cf19539a3552f08da74acb2427cbc10521b29b1cf6e8bc502206c077774878a2580a86ccf18828dae2fc0cc9a89f2026b13d7c0deb1bcff15f102\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/41114b51cf4fbb2b1beee4e0cc3047fcddd88c2e",
    "content": "{\"tx\": \"bfeaf70b038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41d02000000f8f102f060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270de010000002f563892dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2d00000000c1b137a404a710660000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac34000000\", \"prevouts\": [\"f4c73700000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"a13c0e0000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"0f2d22000000000022512022abfe1c27b62198bb616e4483022cc980778bee956a61d21a3456cf5e2e41f8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"367d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93610840586922c5e53ad9a63266eaa24e185b5e485f667ba0f3e18873b1df80384d4d2cf0b4a04f3dfea651ef6d0b2c4d5fffa0a14be5e227661027bf8174dd263cddd84017ed719a58f336e1892f80afe07727626533c4c78318e44c39862ffd3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936898ebd438ad33d3fdb6724497cc3faaa24f87c16c7508697e3bc38420604e532b94a5b3352296838f351f650ec3ca72e25dc2a412f5bb92aac76541fe277cb7178448a7537869648343bbbdc00eb4ac0785a5f2aec0111e81b0d25ebde82a92a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/416cc4828a6c9b5f1667ac7ad0d2684eb23cac38",
    "content": "{\"tx\": \"d07c79b8038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41f0100000018502eebdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9a000000002d3f28d1dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c170100000063ffc498030747e700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47874de2e530\", \"prevouts\": [\"a595390000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\", \"51a15800000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\", \"dec15700000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"894c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d26d1004a8019ef2e1188b07306b9375b4b58b003610908a9f3451755ce03441ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900454b1cf341ebb9351320fe3e143ffa2dad1c15696d7ac983fbe7e302fe7a073e7ecf46474fab8e7e9306b35224640e271c3ad2c01a28b74e8035b5ea3da4b2d4b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5289\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93653442b71edc232265c61904a981e049b0ac07d3398e540c73595bf275af3e5a4bd8f71710e2f4773b226617f0b144a9d046788db13e8347a383f909c13421323cf46474fab8e7e9306b35224640e271c3ad2c01a28b74e8035b5ea3da4b2d4b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4184d22015b6c9b7656f411782a4484efd87060b",
    "content": "{\"tx\": \"14fa46cf02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4801000000d70bd4f0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c64010000005783b2cd023169cc0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac6b25ab25\", \"prevouts\": [\"0c20700000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a57e5e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_53\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a42c53fdf9f147990456e9027106f116b1fc8a253ba540763629b00db180057ccf534e0e745dc4e6c2b6b9eff978c43bb2f0f03f249aab6bce94a2457150fe4982\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5bda1280c946d68d6d4f69e81e61b4b6ee4cf2f7b31b7026f7f31db7af35c26ca7b2173339444bd8bb5235cdd690516a66893441460ecca848461c0c4486193e53\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4186f82b0ef77212271ae59a07d75a5f370f8add",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701f02000000c88992c38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c471000000002bee261f02805a46000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e745311638\", \"prevouts\": [\"43bd130000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\", \"ae50340000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a95b51142906d61fff9b6eb19048f2d78beaeff0d809d50241b6dbf74fcc47950fc871d26555c201dd33550300448d4ae64e8667b7b3a5ff0d1457418fd85d97d231b10243e4e269236a618881f024b863ef2cf3de7e16691a59c4df3ad0ff8945b1cd0e9c9eb09b3e99ba2bf4b5bfd19b37e1db85fe20bde69649f3393dcdb499e3e973007cce8228168676134670d0baff825958c666e75c0cd396ba06e797334dda1764c3bff0081b1c1cf24ee069df2bec5d18d164ac2a6ac88c5f6895b9ab4639719d231b433427cc65e8e6b995184940f4ee67db13c86e23de7f882018c70c39edf813811d7daf5e937c4e903792e3bc08adcd4fc29f253b9cde001958746d321d48e3fef7562dd8c8a3ac864dac2d432c424d8ea7119dcb85c5dfc935777d015910e546ce8e9848abc35d583c07b8315bb8a76146797304a1148f4bb8b50968d698ce1d0418e6c736c63324f80a9f6370519a5db88f2f10e6d4acef75dace76a9dcd0e15a1890fdccde6a074e6c5ddc92c08eb9b13a9c74ceb69afb0a637ba9470fe37ea11f85520a810f4b6374e705a54707e8c81830f5a044ad849a488d8a427c4ee1951de23f092ca4742a34955297212e6fc0f37660fcb97c598eab9282c2f8829fc7e047ee3cc93fb86333a7f0009eb5bb1c468de6148c3b7d91783b4eeda3d47e74fd604178d7cef6f2c473826ab5148ddbc73364a006ca3589188d71467c8055be2f75\", \"847d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d67be0b3ed085d8229f99ec7120ac293144efe6be4aade727ce45146ba4b7b4fda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e9f6b3154707dfd0cc47160c458b5d6bbad5dbae79d1b1aff02b8c8f076d5395a9f31796df107fae040796e44aea27c7a7d41418cdc7206378fd34089f9daf951\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09021295e9ea5c3ed71a319ca66f39cfb76fbea35e76d485921c2ef0ea8f0ad5a6043a3bdf0cb1ae4e4864c117597b63ea6cae6f8647c25ab11d2f5e9ce0ae7f47b823c91a19ae552fc9732686d9a2ec73150a993eff0473f96f650dcd3e1f6b6e5271d4e1e3dffed73c51842ef9024a9800f692a08dd4a713ceedb0806e71dc5002cd1dbae7fdbb1e60ed3841db20e1d87535054c949c109ef68f84064f9948548dbe4b31257d230c91157157ae52eda33b8c1cd325897bed3e31ff1ca53c6b68c9d6f95e72db39537acbc5f3438e58ec75d2521915103541a0f42a85460ea1819e120a4352f877cdceb7b424c74df422f9dd8725aaf6dd3abb1ba57db2ac1eb76ad6ab222fff67c578cd3a6a010252713fa0096ad49e62007faa12bc68946234297dba040157e648e1afa77c88043ef0c7e4703b4cc4a9f2049318f7d0e7a342d8f02f40a57845778386c52a6c398a0491c0d2f6f52486dc36058a0ddf0b81def12b9866bad19e800439fd8c48283c84ea0ce66c90959b16670822cec55eb16257888441f266f48356bab6883e55140556907eb0b98985602b74d07896c9e187cc3ec206ad403bee59eef2ba6196210e471747aa0b96991aaacd5dd7ec232d8f8ebefea9a86bf118dc3ee3acd1c8cc4d9a291af29ba5f794284ef9be82fb329454e7076556d14b6a180e2ccfb04f5201e7e8510a649db36d8af96268c4fbd60528b82f9683e1720aafa775\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361950e9cd3056fae57f4e29cba5f1c37ec5e51ffeed67571dacdd2332e5e5df68cc3b36ccc81fe4912a925ea2b1eb99a41bced4468215b0c94e7bf4feca6759c79f31796df107fae040796e44aea27c7a7d41418cdc7206378fd34089f9daf951\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4194caf8692db4d7109076c5dece284d07e06cbf",
    "content": "{\"tx\": \"9a15a34503dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6700000000b98902bb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47301000000b91d6fd260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703d00000000c51f3a80025f6e7000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7964c000000\", \"prevouts\": [\"e6fe26000000000017a9141582f8bc3490e924b143f387e99eced40303eaed87\", \"fca73d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"973b0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_6e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"dfa56b053bc5d80a69aef617f2475e8e09f446e7efc5ee7bd1a231c3a4a64e3d765727f42b37a9f7104332797ee53db8dbed629d668d59f05832417e9faa288c02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c8e6efa90e1fecb749468c4e12dabd2f1ac0ea03c231a8145cdafdee296c24a6f7970a06c21ff5ef9d4da8e5354acfb3c34b52c991228d4a6e6f1a4a1b68c7996e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/41a24f98a0882fe70484f5006c4b6b9a37bc85f0",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7000000000ec9b048ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7301000000231716990186d7ae0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e776040000\", \"prevouts\": [\"2956780000000000225120e126375bd164d085eaf078f7c968ba0351125367548e57f6cc6688a24dc88c09\", \"3cd947000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"347d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faa00efe7e15c1e643e9e1cfaff50670e7cac10128754f4af7dc416953d80cca2b070c3fd2cc03cfe72ec91581f9e22200fa4c4f6deb8dafcd335310e90efb11e5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366956433f4fb745717b89f2dabf7821b404dd73db8a334af9b6b63fb319135fc93ac03c85a7bde4aa83325c4e9fa3803d6178be55885bf5b72d341e036ded0599070c3fd2cc03cfe72ec91581f9e22200fa4c4f6deb8dafcd335310e90efb11e5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/41bb837acd47aa639c62f7986ff46af86a6c36d1",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49000000000575c18d0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6e000000009b12d9b8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6201000000323bd29c036d5608010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6ca6eb94e\", \"prevouts\": [\"b77b360000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\", \"a9315e00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"7c80750000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"7c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364a60ea8a26b95179b8a81cf8791033c1de4a7f8dcf3286d999b7c941f2edf7811202adea3ba63b8efb220ed0b92cf765f01931ebb31f4963f663d14c15b1e6099a711983bc616996e2ac47b27808b31a9b7e87f7ce1f3571999dd3a2a57f1080\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699b107a70635ffc73d55a58255f55b6e906e17a6659bcc3b92a6a185be68db381941f75e5ef6b91990230755a95e91c03e6de7762e861be9dda5623c3157397ffd5e8f79d631fbf207b458b911c1cf4efab0aea5316113aa9c93bea92caa9fc9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/420a24fcbd56a2a2791e7238666b8aa34e2ccf16",
    "content": "{\"tx\": \"2072d98802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1502000000525dbd8060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704d00000000be747faf02cbaf2c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e71c86fa53\", \"prevouts\": [\"2ae61d00000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\", \"45be1100000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"864c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4a89eab7efa8b8df17a82e815a072b99e340ac1768e499ee92fb25d88959474e250636431b24706e8b1111073dac761b2ba654f4832b7b9ae2a348c6845c1d327\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93611dc1db4058b7df57233984f644c48dd57428e5644aa1c5e18e4c2c7e9844a80a89eab7efa8b8df17a82e815a072b99e340ac1768e499ee92fb25d88959474e250636431b24706e8b1111073dac761b2ba654f4832b7b9ae2a348c6845c1d327\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/42c6d3a78f584cc355a0bac6f309e105089332b8",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5400000000ddaec8968bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d5010000003ef568afdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4900000000daee1d6e0386b1db0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac56000000\", \"prevouts\": [\"92bf790000000000235b212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"309640000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"c96623000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7c3697d5de3aa481d64fd5f75484d4994cbea6af6a5e3d8391bc5c52fb3307999ad91102540ca3f8757641bfc1d36dd8faf913d9874937fc17baf6ab4db99eba\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/42da32b7dda49d356987402249a3bb67a0b53529",
    "content": "{\"tx\": \"22713f2202dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca30000000021b16c8a8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4940100000024a82fcd0387598700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487a073772b\", \"prevouts\": [\"af76570000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\", \"b7733100000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"ed7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93633479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a7e5e7dcc199a2f568fd88e83eadcc582fbeb8fc2cdeb8c853fb2288d51fac1b4d19f2c0f6744ba7ac1f5ff1e4bbd0a31d1cdb1f5d58d1dbc476492d0098121b5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e1749aa0b5d70f518b926cb476468410836d749f7ea53df886cb06228889683d97e5e7dcc199a2f568fd88e83eadcc582fbeb8fc2cdeb8c853fb2288d51fac1b4d19f2c0f6744ba7ac1f5ff1e4bbd0a31d1cdb1f5d58d1dbc476492d0098121b5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/42e412a1e895536ef1264d7ee08902b8e37a53a0",
    "content": "{\"tx\": \"0996bdbc02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4201000000c4343cea8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46c010000005a7cd0e60191ac45000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48701283e59\", \"prevouts\": [\"1283730000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\", \"21743a000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"657d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d46ed5c88be999b027defe78826bdf9f79fd708eb8b2e1895cb28c5d0d8f8cf07a9921914746f344d752c7034b32810721c9853c38c376ca018a4c3c5bab65757fdb01d6ca2155f5be7a678ca6a1e1d0c436995e81f878ed9c74997cf4fccddd302781454c6297f6b8a579760f4d591c0acf84ff9d038b064bbab8a5d53835db\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c56699834a23a35d7a8a8e446f06483c0f6f4014465e54b19938cdc9d35914e3da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e38fd10ac28b4a0ae18793cce60e7e7ebbedf1e3488ce0551c956bc9cf517ba032bc2c7d802e8c870cc0fefcfae9d23d316cca1682651be3bf62b663d5ddaa443\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/42eddccf89cbef79a5adffb7eb5ea1523de5b3b7",
    "content": "{\"tx\": \"3229dd7102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfca00000000dbcb3ddb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704b01000000c5a717a901a974190000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963a010000\", \"prevouts\": [\"a632640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ed0d13000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"4830450221009754527738b581abc4f8608a913b98b874c4626f53374f198140d73fe623e4b102206aca3fabafc73b33ab683eb12e436b9835fa0788572f815a6f7bf4c3201c654602434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100e6b5f7be8ae69f76d84286005a58fcbfaa1ea530557e240582c3f4ecc4d65abe02203e1e941e8f87f8354381d67578c031d30a398c6f94b29aac09adbb7af5522a1402434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/42f1cfaa89e0e558cc339a4adfc253b4108d5843",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701c0200000078a4abf760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e80100000013f5b7250110821b00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac9f000000\", \"prevouts\": [\"51e6120000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\", \"458a110000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"d9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4a3ea69b746c966c84daf122809976a6bce8b1d887b17a6e963c4c690b8a790e73a6c94bbfbe0c8d8162307ea587875a7b29cdfde589bfdf70042a40a3445f95ec19ec7aa48c905d8ed6637f3c17c0400a43c560e5c859444683190ee16fe2235\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5174c6ee35a9af327fa74c94c4ba87a09a7dd613a1ede58e30654f1c4a24a66737074cc5cf84a1d913e1f5647d3427cc0d6d469f0e5b86c78a49890e87126542fa0e1c61743bed8ba943c0dc40e80402f7423773c7111097ca9c5a140b1b3c94b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/43532b914ad45faf56c91ef34b9b696012326b2d",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c290000000006481d8560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701e0200000026bb47f7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5601000000f8a95f8803a645cd00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79665a0ac45\", \"prevouts\": [\"bc855900000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"782b1000000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\", \"077c65000000000022512007a606ac1d369bdfe9b32b88a4b0d4c507785f2481b337f6b3340196eed3e896\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"f47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa056823e3960e672c2faac6672d149a4ac5db30e5c30fec842c5078845a2fea890bfc944cea42013591059ba9f4ec0a95c62699d2133b38017223ef90bcb8e42b4a87a36ff2ed7228bcfc2438815b30cc1c98339504e1b834e10aaf4a034051\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93682115a2dfa9b95e696b2e1876a43d90a8957d7c1a0aa8ff9ef276528e0707301bf93feda87a2a10f8ccaf134f5ef6c2a0b95d03f8827da72e1e875b6e78a8a5e876f4540117e7e2fda63f7a015ec774d613b8932caa4388fa9ce7145d42cc7f6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/43a09bc93d6d45b6cef903b1341a287624b825ca",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb201000000cefb2422bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfba01000000810ff78403a63af100000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac7eeaf121\", \"prevouts\": [\"54e3820000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\", \"8c2470000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"4a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936153aa193df228982a93d719b91a9ccdb5e9bf3da7f02bfb3b6c406cdd69a7eb4615c38a9f4b3c26d8dcb1a4c3fc9e68202e120a4fd7f06c3d33071ff6316723f12efaba1d06903f148d2465ca4e4c6639d336576fa6993c6ca48823372648a44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93652be2b7d343b6ff8f1db316ffadb0e63f1ae900c6a55aa5e53be2b7079034d4d9a5f53a99550b57470dcc4d4233d312935e71f0fec8998bf9150bf0a5d1b49a4615c38a9f4b3c26d8dcb1a4c3fc9e68202e120a4fd7f06c3d33071ff6316723f12efaba1d06903f148d2465ca4e4c6639d336576fa6993c6ca48823372648a44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/43a12820d4dfa937dfdbaa0843372e901ec73944",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8000000000896880f4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2302000000409c9b9802fd1ba200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acdfcb3a45\", \"prevouts\": [\"2ca35d000000000022512084127e09a3e5abb8e6ea0ba3ce4737d1c2349f1be422ff5ce1609ab9b3fbb01d\", \"3634470000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"ef7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936aa6323c0295bc5775a3404b3aacf7082420dcfdcb982829d77fe55ccdd4d869082a8da46561b857dd56ed73270ec2a55b69a5f7c1db8df98b88468b2be2ca2b7eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac8ef60344f111a9c34d055af59cfd42b130acbf4987ee3354719b7c9974e4d449\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb1d33bd2ec2ef2b80e561b3c30cfb99b356a60261a599d7e1f2ff199de481a6e8ef60344f111a9c34d055af59cfd42b130acbf4987ee3354719b7c9974e4d449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/43b19c13ed8e58e70071e063750e8fca7a9f05e0",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f80100000079124b848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4320000000067ebebe7049dfa440000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a666010000\", \"prevouts\": [\"2ceb110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9c753500000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_csa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c5a268386538f5dcdc6b32fd437e7aa0f1ee1100b7fb5ecfc40d276cb9007ba505c108bc9acfdbd25afecb6ff023b17e11b1564ef22b16a4136dc00086742954\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef32555276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef32555276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/43bfb11c19ea9173f4b0185fbc6a622fd0787c68",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fc01000000fc7cc7ccbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfed0000000086d73080029a989400000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748768010000\", \"prevouts\": [\"e92f130000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\", \"09138300000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51419220fa8a7a918b3857a082d32be9fa2ecc61d36b58eead0239ee9c5d9d4afcd5a470b8497850c3a230fee464eb343180400453804118582df887251250b2f1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4ef65a7bc88e8caa9953fbbe68415f348dc7b3deedacdb598041f1438fea667b18959ac4fa8a57d164b76708dc6f63c2efb2484bc5a77a391ceb66b2f5ad6b35f745d0948d124101db49c294d83630876065ae400dd84de1c183cd8c786ec24f9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/43d1fadc7620820efcc941a68f7696480649c13d",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127052000000000b665d8edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c200000000084914c6603c36969000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7a37d794a\", \"prevouts\": [\"2f9e0e00000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\", \"ceb65d0000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"e47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366bc9e6400471d4508039602a6371cc2fb521d342dad10229cb10d12c2b95e76f158e114954b29a1fe443083941979d23a0210cc324956afb3dcce424fb4eceefbefe4cc2cebe7bba8b4a4f82666342333b91a450af49acc0f1954b5763bfc142\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa0d58db0463b9d01080baa2617114f2c0459e5723b09a0137090d28117705b675ea7c8dd4a05a6083e4a7ce3fc20cde94d430ec03cbfbe8017e9dc8ef3bce99a9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/43dae97b688afba43b6d88389a78b979f1181c34",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8301000000820c50a18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48c0100000021f32087dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbf01000000a91f7be901ef40c600000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acac07da2f\", \"prevouts\": [\"4cf95b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f456400000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"d4ce59000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c9\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936643cf28b3f57e3e135ddaf8a1f03437647ba3161555e3c3b2dda50db56032ea077878475803065420b5149b394b9f2a263406aa3a3cf62bdb9b13e67809a83ebcc9238bf2d7dc0bcf11838c34785251ea2fa5f3bb034bc98e2e8efb0909b7dbc17d2416a1ef9313076e185902c26d9ae3ba1c967c4fe3d78707cdcee712bc7b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d3c147557fd4654830368843709159d459528293d28ab2736e9587eb54fea08bf48725aff660a72fd31f8e9799fbe605d57d774c031cecd8b6989780acb581b6b24737b64a51a2c518aa096a7a1ea5ca18eed83cdd20aa73c19d83535c466892\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/43eea0f55cf11052527d14c3cf0f96e55882c4d5",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0802000000f4ac4498dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c370100000052b315f604819bde000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac2c000000\", \"prevouts\": [\"1d9887000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\", \"206059000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100adc3d98ee8e5c1787d2b85ce1fcd1e29a503d298d390f63e89972f1760dbdbfc02201b1f6a00bb9a7de1c0b4a3ea0441662cd0dbbfeabac21ac68d8821da5c2f7c1f024104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100bc7217801168eddf5a58a3cfdda97c542a04cdeb3abf6d377edd9649a977664b022075af2dc74696f76798c77103126ab30dce3626b501c2e4213e1bc19da6b1d404024104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/43f8e70fd6ed448f6cd62609f6e4a9d03a0e083a",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706201000000f53fbee960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127004010000008b79075601f01c0f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac54000000\", \"prevouts\": [\"cf231300000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\", \"bfe7110000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_mis_83\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"626a18a6eec2972850c19be268a6a52e86ce74e005009e75ca6e65c08b5cc41eac5c023a6102bad84750eb48fc3a79616a6684cfbd93d151b77a18eaadee0dcc01\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50db6d8b93e424a50fb110d4d237683ac07e6c07da9335a8132d3538472fc0a13fdd63a4f7258a359a055f2ed67b177d56cc00fceafd6c0f973773ba6c49bdb0aa3b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3532dd22bf65057d8863cfd93b0944cf39b5bf0e2f42d8725589592fb56bb7c3abe7515ed71127424fea7de0caefbadd41cadd3540b967c06d2b813cd375f81f83\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50cd54dddf5c435e73def586bd9097cdf835f7188234e6520787964681739d4478193466ac3f5ebdbb9c4b535b3350feda5611f645\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4407ad4a37ac5667b725ef07db2b1b0ebbe6db1e",
    "content": "{\"tx\": \"706e0a0002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd70100000024a962a960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b600000000b076b3840399c468000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2b971d54\", \"prevouts\": [\"cf2e5b000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"ad3810000000000017a914613e66961ccf40c7c83ed07cc80b2528cfe51edb87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"bc\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900459312a224ee6564b861c658371f7a6f0026ad2c58d86ce869dc9b432e830a527104966f092bf1e4b4348fca11e7254311373308f7fc15e3d44d6a2afffa343c9657ff193055e5853205a1117b7666344cdb66562f15b4d40280f3656784bf5cd3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b04dbe1d7a597ef7e58582d6b28f055a2f440add2d85f9dd7bf5919989399b7220e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e14a8563068286881d42b1c4901d93a483973910fd5653bf7ebbf040741f7cd837150e68e664a4d5c991e5183d0e7966d99b6c66da3079bb04bea44808922b61bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4422ccfb3a652df26350f5fd43cab32b4a6db9bc",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0601000000cd66d1bebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf64000000002ad67cc0048a99e0000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac56000000\", \"prevouts\": [\"9ca76c0000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"71787600000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"85\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1c80cdf889f2095af4d324c92b00d2a9db5fcc0724b0f6f8ee9ebbd204938760cb2a240b376911c9876b3695f79f395ec3f2d97b1695e5c0e7f397f1ed982e79a1b6e729898dfeeff93e2067a7d076aa1bb7914d367b163cafe54fabf88cb14d8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364b0900bf42a492e6d84803f411d6b7283b14689911cd75fb3ce169ea1a2bbfe0d4e60e987dc96ee5dbea4bc309cd424f3f3a0504752ed5a5936e8ec363297933734b3a7050eee065844830ad8d45a710891f78004f5e7f35b8fd72bf3ee94449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/443de93ae646f545525c4a8177964caee78a499e",
    "content": "{\"tx\": \"1fa8cf3401dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5701000000ac034f8802b8c04b0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac3f558d5e\", \"prevouts\": [\"83824d00000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"ed\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08220e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e179a506f75037c50a9ea9c509d8c41e46c95fdf651773b41e5feb3da8f515025ffd4cde6e083ceefa41c970e7ff247f88d4db270a866c6958487024deeb358702\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364239bb564bb88fab9cc8a68fc985ce74d0a60efaac94a2193d617d4650dce2ca20e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e179a506f75037c50a9ea9c509d8c41e46c95fdf651773b41e5feb3da8f515025ffd4cde6e083ceefa41c970e7ff247f88d4db270a866c6958487024deeb358702\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/444bdbc8e2a3f36427b9ee3bb33b639f3d06010d",
    "content": "{\"tx\": \"4296b05c0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d701000000192c02da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703800000000b70f74e6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c010200000054072fbe0445ff6e00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e4cb024e\", \"prevouts\": [\"0526100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"099f120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"39c14e0000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/hashtype0_byte_keypath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"da1ab9c302402e20432a4594d9fa7f497ccad03de081d4a84d17f40df1570448874889de2f0b8df815ff234416b9b1192d30e9e894a6aa52d0bde4a7a13bb3e7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"da1ab9c302402e20432a4594d9fa7f497ccad03de081d4a84d17f40df1570448874889de2f0b8df815ff234416b9b1192d30e9e894a6aa52d0bde4a7a13bb3e700\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/44513b5ccd5d2993d98b0f606e24c3363080118d",
    "content": "{\"tx\": \"363a05540260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700f00000000e95226b0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b34010000005888338d017b9b0b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac4fb5bd44\", \"prevouts\": [\"c009130000000000225120440c37f254c07fa4cc41897f3d6c7e819f00ad5f6c5ca97225bb132b6849e94a\", \"0cbb220000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a5cb231d20a79dea39c1cf40c1bbfc5417f53129f0b8bc111b3a1988e404cce5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a18616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/447e0a4f2c9391201bd7abdb3935d959277ac93d",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ee010000002a96f3a28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f4010000000cf823d504af574a00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fced92f55c\", \"prevouts\": [\"dae111000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"57623a0000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/inputmaxlimit\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4ea734ebfed9e69b2eeabc3c8a8761f0d2f4dcfdebb9b46aa28d0ca18ac4b29ca59e5a06042fd767120cdbdc4e7a8693b6dc0641a9c42c3c2731660eeb65b67c\", \"ed6c5c68dc20c4d81e1a9fd4f9a1cea561e6ce4dec463534c9f79be0649c9a14df0481b53baacd38acc07370660cb0ea06bad30ce9c81e3b6982f71742eb0bd16c73134323b6182c28c7cfa4b5d12aa1f1eee3575b62951c78426cde80eee3b1ead621334e200b7705d1db822abb4e8ad641f7a9629e50a120ceee9728ea567175ef04a6e1ffcf03230c9c83f73d3c0afb317bac9b3186dd9fa61ece7d173f6fec4173243c4054f05a9c45710b9d23c31e252369b2e8dfa9b2c526f0fd6d4ed9552d8df2fddde0f539084cadc5eddd5586a40b37a9db1f93e20c82ef5fa0b9291fb75deddd312f29336718aab29d0fabdd12f3e194cc8fa6c7e4cad213e4d0fb992568206ab873bdb40fae9f7d67742eaaf2c6efcb4fccbcf1b5e81c64e41c04ebf631366b669f629adb57c24378754ef7d5ae1eeedc9a4498eca87e1a1dbb78b16c0247a05da6804dcddfca27b44f897f24394e44a18cd30fcc59587236d2a8f696d2e2a62176200c3b33ce2d07a9b0c47e025df6319a3c0b0de94b5c85bcfb96b599217f8c4842c1f26838bad5d96b0fc60a357b24c6e35fe07dba659eed38928e5df01e33cf75d6f34c730440719a97dc95593d31bf6c970d7dd3380d07da9f9daae0a1621c36bfd51dfec939aca5054dd5c13f78a309aad147e1e1b0dc22896b3f0cf905f6a992958dd77aa2e8279a8b516b3e76f566f72fd4144aa59133c9666e409bc99fa3\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93633f145906eb3b0b9144503b7e952fa7ac030804bf21818b76946b0617a1dc901d4021eb67a5422f2c264ab2e161e443ad68483a924a10f3067064f47bfc1aa823d0cff3dcc0a2d4e46fc30f48a30ceeaa99fba3feb9f110c8632a3b2fa3f4f4f8fbdead7f8de6a8aad36d37b0d589bc9244c1684fd5ac3294cec67c7c6e587a6904ede5a53833ce5d447360be78b94add963f9070eac219e9b04ee2bdd400ddd04364ae3f3c0d48023a93d8481ba8ff7adab87d79476f69028f3fb22b08d057964bbb3ea34308947c748760264ee9e03eb1f98d2b66028dab654f580a418be99661f479a6b0f557293064f4a690bd09af98d8bd3a778ce8944b23259946622ee8f58700e34290ee018923271c5b5338c26b1c5ef6f25154ea2cb21c87cb2bddad45cd3b88d2dbb65b62cf977bb614d0efb5c9353a8b35cfa01122561253231744c2c32064ddb3ff0f538be34c536787771f8aa5aec123a81e8014a979ffa6906075479528a5b4db5d683c0884af4c8976d652dd9505f85dd291fe0843ffd0ff27865ba15c8822e63cb0be5982c1ef15a41fad555080e76aad0b72a8aa15726acd51679a62f62b306cf011a5d1358e6ba8e189d7358bc43376d46dcace83895e75b2934214492b999e4970e4990c42fb0eac353aa09117e3e38145bdbc22646e577b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4ea734ebfed9e69b2eeabc3c8a8761f0d2f4dcfdebb9b46aa28d0ca18ac4b29ca59e5a06042fd767120cdbdc4e7a8693b6dc0641a9c42c3c2731660eeb65b67c\", \"9522d307fd40d9be4d4da051ae6910c605180d33f1668ebe958499d5bb8aed34219f719d4498b6375b4d334d66be19c5d26b8210eb751bbb87ede327c69546f4a21dc527aa6d682777c3ce17d0038712b8ad3be26d8f457357b203712a559ccc869d2069cd3e6656d0b631bd15ddde355cc941c79588655b4ecb28d931ad72c2f24dd0bdf93d07c1df0f9c6a5d30613a2d3e30ea5bc367b15539870364eda18ef77b5af3a6aee8ac4a78bbfd581cc8673293945993260ddd9a3c7f238f80de87fd7df5e4a2ce8c292d296c9680b44457ec8fcd7e299b19318d7e17a0f233bb64475751f0f46e46abf37bfd6b213ff556bb885fb08e99a92235668e3e8983daca3efef2f18660eecf9102d8e54a40dde7f8106e25bc9bf46dc549842c6d88fee2c1baa3affbc0d30e8285b8fb474718ba4480eae8fdf4f704df7e1d4d9558ec09e534e2499f64ad12855cd4362b72d7a3552f3d2319df4e2782220654aae7a12ce6e81b8b1b6fc751ad61e60a26dbe6949e1827fa35068b754729a01ecd041771fdfab7c97b51ff5e8768e9b4bc41afcba0f5fcd5817a24110c0447e5e5564af9f032ecf15207d1643a04d8e65b50abd42280fd47593c69ef6489cdb399a8afd44a827bdf173b1ffe8bd57dfb4e7be65aebf2ba543d12629d1475b024713f6f18bba3efe2ae7c2f6efb3418162414164ec7a6876d68a934ac7c5709447412724313e5f8651e8dd36b73\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93633f145906eb3b0b9144503b7e952fa7ac030804bf21818b76946b0617a1dc901d4021eb67a5422f2c264ab2e161e443ad68483a924a10f3067064f47bfc1aa823d0cff3dcc0a2d4e46fc30f48a30ceeaa99fba3feb9f110c8632a3b2fa3f4f4f8fbdead7f8de6a8aad36d37b0d589bc9244c1684fd5ac3294cec67c7c6e587a6904ede5a53833ce5d447360be78b94add963f9070eac219e9b04ee2bdd400ddd04364ae3f3c0d48023a93d8481ba8ff7adab87d79476f69028f3fb22b08d057964bbb3ea34308947c748760264ee9e03eb1f98d2b66028dab654f580a418be99661f479a6b0f557293064f4a690bd09af98d8bd3a778ce8944b23259946622ee8f58700e34290ee018923271c5b5338c26b1c5ef6f25154ea2cb21c87cb2bddad45cd3b88d2dbb65b62cf977bb614d0efb5c9353a8b35cfa01122561253231744c2c32064ddb3ff0f538be34c536787771f8aa5aec123a81e8014a979ffa6906075479528a5b4db5d683c0884af4c8976d652dd9505f85dd291fe0843ffd0ff27865ba15c8822e63cb0be5982c1ef15a41fad555080e76aad0b72a8aa15726acd51679a62f62b306cf011a5d1358e6ba8e189d7358bc43376d46dcace83895e75b2934214492b999e4970e4990c42fb0eac353aa09117e3e38145bdbc22646e577b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4493e5053e8c93d7133c12033db30ab0fad02eea",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd901000000f31c8ecadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6f00000000c116dbd404db3d7a000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5d010000\", \"prevouts\": [\"1ef55c00000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\", \"0fff1f0000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"0b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ddf344411e2a803e2f014fc4dbbd34487be175b3b72a6822dae0235404bef0ad6eee185c5450ca8ff820874ed786a77ca41a0ece110e4e1e272b53628d0f659ee0d9bed60e53dfa6fe8b58229f37daf0597893c765c7b30814eb9e16fca89b86\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a7a0146d222f7b4b0baec19231a96a69115ffe6b14d39b17208bbfe466e36783da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ea51646124a2b4386d840e205fec55c7cefbdbe9c75e9c45dd558741f313d2d0ee0d9bed60e53dfa6fe8b58229f37daf0597893c765c7b30814eb9e16fca89b86\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/44b2a5681330965efa5dadccd65e4296cb9bb54c",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1302000000a081f487dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0500000000e4f110110337dcab000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48777000000\", \"prevouts\": [\"c78166000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"7f1348000000000017a914971b3e5f9ac480bdcebf6ea71a9fc7de0ab164e287\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/emptysigs/checksig\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"36228bbe2462ebf9b44d5743a161bb8b43dec7d353201064a04696e3c5074c9f7e1a0cb72ee02e5eeaa1de3f2b7657cbfdc9ee34efa9d9859d04c40a6b4ac1df\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac91\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b87c3d13bda4bc96912d9e1d3614b88ea00288653983e5946dd79f95cad56850892bd312bf555f4ddaee895b667ff52e0154e570fb3b21fb70ce55962eaacfa82b8a8694f12869a73a7c9258692c0a516e36ca599c5440cd48185ae688899f972334d1082e7cf9fba1fb8bfc554039e0d30e1d717d7bd10b1687557faeaf94ec531fe2ceb6eb6fc38e892c8463543d75fb6857ed3555003db7d30631ee24ce556745e6d5f13398b82293345b14639057cfe7c9133f3a817857bdff96787ef39c49602cf62409ee25e64fef6eaf4f70b438998ea376bf89aac812460edc6098d5da36431739388703f162bfd6be43cc18929921c1c825eeda473da76ec1d4f9fb59fb388f102ea0ad67c71defac059c7c8b93c58afe1a654026c6fac78536b8b1901243e25851de0d6781e7f528327af4772fe14b340f1eedd75761d4eaa742157b0a6f9680ce7f5ca5bec9338fe334e6832114c99db2b4b78f7605856e14f0f922c7dab2635ca4d983bce69908efc2d6c8e3a4e02d107fe54b591d6c8cbc0ea2e862ced977f81641729beff04e69bc449bbaee4ae229138f125e8f575c30a32bf5a3113bfeca67cfbd40f858b9150f2d1112d4e5e609341baa11cda5532a4a71babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"a7f2f47ede28e2e8ce69a17fc3a01f3298b85f5485f6bebfde16c89eec7adf4f6458a7a46922f2fa766f1dc473c0616e81c3b9adc97dfe98f3e8662e0fe06ee1\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad00ac91\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361a911a84ebfe90f85cb95d912de296e406a83e6bb64e40cd5d5446ea831b1e6ec0a0aad722561a657b32c771837934bb172c5e60445fda6f61f0549ad59d168a4a21c5ad207b7d947881fce7c77c2c558bf7d85da25db7933f453b6e11590535e632f05d2f265193b9649a5ef1618ecbe44f766924f0669492df39f8d13b141c3c5693f833d18242b72bcb57e7e060bce728ee6c12c1b8c82231a7efa18d9c9385b2a4b14339866bbd34bafab4a7cc7e6dc675bec351f64691ae0675794190c7171848de06ef9560cb93bd963649849e184ccf9b661423d2aef42d152a6744ce6c2706eb27a56bd81931fb0b15ae24da807c7aa33efa89f4760659c3931e68d37676dbcd6ad8e64a0f0b6ff3a833ffebef72be2857da7c20fbbefad3c0710755dd17badd9d086330be6b0297d0fd804a34aeab6728d2070e6393f90b7e2f24c098ac1853f441446cce5c977f35bdabac1c454ad75f42d53ffaa130b2c28a234a15ef11190bc97bcc8d0e99d5656d0891e3984baf383c021195a3f4accb96a873fe0d5c32a15e7fe92b17b2b8c3b841359f1b14625d34ce4c46a1c898e5b74301d7a21d399a47140b6711788aa4ac5bd9e63ac239ed45da28e932ea3acd6bd9f7f5a3113bfeca67cfbd40f858b9150f2d1112d4e5e609341baa11cda5532a4a71babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/44bf61ffe86491dc47531baea9f4722fed205885",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2301000000aad2904b60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a6000000003d041d050193d671000000000017a914719f78084af863e000acd618ba76df979722368987d0c74728\", \"prevouts\": [\"5b7f6c0000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\", \"663a0f000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"304402206fa6f76e7f571b86a43f0ae206bd48cdd783d877db586d4f37fb4760e5c4980a0220618ca643df307b2f1380f43e2bf1a6765f434929345aa169aeb602cf4651a2e301\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"304402206ce32e5c2078e6996c69dc4263d8d2e08152b7fe43f583f89aaf4640cef0af5302206e2886860b00947eb4547ae247456ad24509c864d70af1623552bf48faa9629a01\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/44c41d5a9ee6d3836c4cd959feb9946950a93097",
    "content": "{\"tx\": \"2164258c0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c801000000643e6ce4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1b010000002e5c44cd0201878c000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65633f05d\", \"prevouts\": [\"e17b11000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\", \"ecc07d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"c3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e144d0ff37a890039c0ba21f76704f7cfad8b9e86a035546ebb7c5a6ad2c2135a28cfae4f24e00136258a4229df9ce1533cc743f70cc4e5c0214ad74c09f63cc0b9de97a2505c9a0de734aa1a6c773f3979bd21cdf34ebf80e6ce3c625c087f57a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bd5fb013d649a0b113a2236243da0be0326b44fd96f8b22737f30239849c7b4bc63b209b29a3611ab6267155884a7f894b498570c9db6a86ba3046458c9f77af637f7085334bd6ace67733ad5f759fad65febfe656f63b2b30abaed1d2ea29dc9de97a2505c9a0de734aa1a6c773f3979bd21cdf34ebf80e6ce3c625c087f57a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/44d03ac572cc57f5a15470cd97f15bcb5b9aae1e",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5c0100000075641680bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8a0000000017e471b5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf300000000ac1340c303f3d21d01000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79694c84f5d\", \"prevouts\": [\"ad2d7f0000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\", \"7d0e7e0000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\", \"9da622000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/disabled_checkmultisigverify\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9a2f7f0b58db0a89e0561ded91d28df1269c2b5f285435e6da4020731219553731994f4e17695e91b6a424f2ba383093cac617f6c1f2c1e622d8d6d129e78aeb\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d2db232a58a684473efffe5f8be15c17374986169cf18c1adb110b544d48679b6f3543d66dd2934a4b4b5b83f3181725b5ccb68f1096ac62351c7c97bd1fb9501b8110e709da1864e3fbcb3b5249515c34bb807e7a52bfe6718950e769cad388c56ff404b78dc0a0b90d50115d89846b94a2b0a1f0895318a364e3dc179dd61f9b1e0d638a311a5be1486a7a4c42f89ed43ffd1d5b18820f631006aab35c0b2a02b593180c53027b35b862cc29f04a25efce114c7682377a83dbcf64f6fe42598064c72ae707f2b03b7d69f3c0306a0bb5edc9aa2d90aecbb96bd412d5b1ee8f00d68262204427d46410b755bc31a6012df0b06b921e6cd021b936d3d4c99eead90212921e1142bda8cb81c5ff3145b34391c40797432570ad9a88a0958a1b955fe09784706370c5f6fd13c48513ab6cc16af1e04504ea44462b93ae24aca3b2228a833ef2c51accd6ee09327b5cb9ad2975d597ee135bfef0964473e20f824ec199d2a72d3d5f5ff6ee974913584144656ddfc893ea617971c4925fe8b7e1c4f556906203221bddfee6deb7780e80a3769637a05bcf2efe708f1aaa4a6ffdc17363486d1e033637af9f6d28292a4f4527a2090bfcb5efca2ed9c0d63c01e16c98b35f150399876b232678a58bf83578dbb2c055ad176d56177c4ac303846e798f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"be73b35f48d93be86cfc0cf74d6d137772570bcd0a4f9d668ba07dbbd44f07e00e58c348cdaa53a47740620b9ad3de92bc80674de5efd8f33a2f0de0021553f1\", \"007c5120871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2051af51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936163a2cc881d2817d2aebbfe172137e370cba72169135b49668e6c780f04e982af52d98203d7275fad400ed3b197c4c0e8622d77cbcb79cf7a2a00d2fc972bf5088fbdd48b7d094f4d49d8b1839b74dcc4dbc013e4a19a5571fcb3060ef9d19df09c62f41d049064138a9903b85876dd9717333b851facc249a6324496924ccd19bda959ee64a0e521086eadef560e007b812ea93c38fe6696cd23c9dbfec9561aa0b9584501d37df2cd6ca13872aa7d8e15f2d972cdc457728ab40ef8953a50d3001935f957d09ca50115598022aa673264713d6b6dab663f57d1ec4e21ca3f1bdd904199a671bb3071cf8c371a0277045925ae6969a91e37c13fd037f6d30f33fa29f5bf4150ae3c3f10f01b96905a4bda7f9c787f1e1f29b743fd45b74a0ded3f6d02e18608fcc5d3e47e21e030a7d2d6f4e266ec508f5b1b295a661225ac65f234c9d20f0c91cddcc015657641c02499e0969ed1c799bb7545acf49ce097d4bb8d89f21761581480cc9fb789613a87d31235185f9da4b4384725e898ebf0d2c5eddaeb8557ce0f7cc7880e698091ab104cabb34aeeeb5d0f57ea86d1ebc555dfde575d48d1eaafa8343c63d6f5425984d2425aca274be02e47a5142e089ba2e5262a94fc3ddd3fb5606be458b593782b16d00ce4762d13e98a6ec8488c560f68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/44d081e51884f8d702e4373433bcf56a8a7ad583",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd801000000e90e4673dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c17020000001ba48a0c0414137a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acdbfcc93d\", \"prevouts\": [\"a9982800000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"c1345400000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902154269b2599e692e7e67455049f2a70cb852434fc1ab386df0f0e61f2e1fda7986033017a4113acd645d6fa3ff6f32f674dea0d97b1bee2d66bf2327ee1824c826b5212e5cf384eb0bd49c7175a7a4eac52c621a6d38fb842b40a6637fc1462170ecb40a604235e08652c2f4cb86773f405d84ddd92920485d8ba82ce2a2a8a0757df116d1e5dca6a64c4d59eb3081db86e2923a3458f00c9f5d5594cc4ffa6a358d5a4269845c3b36db8b044f2e33e52d567a39dc38efe3bc680fa9bb3d87077be5b3c71a06658795e499dba6f12260724b0e9f705236404d579065ed0e9c6adb4797ebe32688107f544bfc814561216dbdf7c679c1174d3048794b4cda9bf1a6dd7a43a44fe0f31b648af40eaa3e1f65f5bcd3fa20611d5ea5133271a1badc9e2621c4f7990cd54294eb375f77a6a6503b4d0944b9fac940cae17108a6de2ab9bda6023521ebd6e2734e4a6d932de7dfe21b1db6afa0074f3567ae0cb58144da4ad0bf76278a6a92f3e9be26ce18124b1a9e2fbf77c260bbd1b4d2a06bcced79478b2cace2232dbf4d130305d06242f702481f722cdd4765188dbfcf5110877db2b4a9934de0b6e1e788d68ee70adda3f9e8715a35725f99dc496c51ff6478ac3e60ae6f7763f26b0a011023d429220839400165ea82b02e138b0290038e39b46a53a632dac987fa0456355d524f41e1087a6852e10a72cca4151873f2b7a59932da8b975e8060fe75\", \"087d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d8b5a7915446f123db4170aa52497de96e23eeb94b1c6e08805331c597130f97392ef61cba24ca089522adfb015944d93e6e298b3bdb8572d6b7e61874c3a207520a79ac573d08fada6e0a495a70546abebfe2eb256837e38d30334686ccae33\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090204e3625c781a3e70b2a310117b40d85d0e9bffcf3d61259962771f28d027f66362e244aee2c8d21aa0ac0987257de1036d92e23a5192bdb47b193286bb782146767394732dc303be0db1c7d25c3287f7c5ed49c4a3f2bab8e2d57bf07bc244b23abe30083d7e1f37433849d25464b3b5b744eccb0e8845f0ce82fb69e1a4b29026ab3ac1a59211f76b5c9254e441110d2fa814f7f61fd549b55ace752bc9c8be5e532fe394027b79d2349cfb1bd2adc6142769bd0494fbf48e5f07411123e0e58f410b653728553e502123eb35bc452e5eed2848b3a27f05be581a23acbea610e1b695feccababd08747aae78b03d75282bbf6f7f604e32599191f64d5c7fff6a907d053f9b7a9c10dcd2d5d4c26218eb756b64f2c0732033a3b9f94eed61df904e512080e7baa5e5e9781f8749407823b9526cc6ce63ddbdd3425e840a597087d3c0e82ad5e75c5d3cdf97604135c8b1dd0802ec73f982aa6207610d6bf21dbd9d0a95a35552430112b6e151f5e416b7e7be52291ca5d100e5105470a1241aca7eca11b74057789b38fab803477a113480e47f5a9a73f6638ddcfcb184fd36c0abf5302a1234d30a2b14cc844003debc8475770016ac37119a5e89af4fdc24e9b17d40d008a5be1f29a9e156a3be25517a3747a08d15a5e71c55a1d7265c204708df349d11119244284b379e64f5edf55d9c5ca2811a702323ff35fee4ecc248b262e827d8a00627a75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ebc0204111bf7e5d13e3ecd3b1c8f71c6ecf5827e1a757374a2d5a102d95777fd392ef61cba24ca089522adfb015944d93e6e298b3bdb8572d6b7e61874c3a207520a79ac573d08fada6e0a495a70546abebfe2eb256837e38d30334686ccae33\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/44d277dff113e85feb1b0da733079ba007e9ce3c",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c489000000005bca01bcdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba70100000054f58ac701aac509000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487adb94525\", \"prevouts\": [\"3bde380000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\", \"b5601e0000000000225120dfb9bbe67fbb4eb318568f7b177f9ecde078527d023b90a4ec13e543e4037efe\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"f77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee1b135a17580d142a9191c3b85b2fd298f3e09062f6f11151feab86e1334277f9411b885fbcd56b4d2cd2e695cafde2fa2de7097172cb34b20e1fb870aea9a6a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93614bc388ca930cddc1c81a27ee7343eb0c7b6fd8e7416418176eb400a30a42e0c75fbdc6cf2e777e050e79c533e418db275d42efba7f8dbffba71190cfdc033660f5943df1a7722c938328966c7e5ac747f85bf050d43cd9195f6df88860ae066\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/44f204855343e69fdcf5529e0a6cb7ea5dee9741",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49801000000f2d4614a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270130200000074abd946dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9f0000000045a6249304c5089b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acf499373c\", \"prevouts\": [\"31f4380000000000225120d7db2432b77440d39106fdcd5c35c463320f36611b8bc46e3633cb3a8d85086a\", \"83da110000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\", \"30d0520000000000225120c3b9d8e50d42de1212377aa9427da72fe17222669efe5204fac1f05c34f6e65b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367962369c05be87b1a218c7edfefd1f740a3e06cdf8be2eccb1098b418ade5b5c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a88616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/452689d60be7f0c8bbd02b65a8c9841ac076b913",
    "content": "{\"tx\": \"3969ed4802dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7b0100000059dcb48ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4101000000052af5c1039b12b0000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acdb000000\", \"prevouts\": [\"a65d5b0000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\", \"6f45560000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c2008843b41165efefa966ef86e5b17069112b4e8811936aac919af7c5cbfc0d863909619a9e5e3690b76be6b1d45a6f641895d036112b103d4a996c01584c34e2dd9164a263db053f999206ee7487ce868bb2edfcde9013ab8828341c83c1860ff9b2b65556c799caacb19ce7174550227ecda758458da932d0e28874d59dbf539e83f0021a1a7375fe3c6a9002e3118d86ec55884c001bd301c3d0640515a62d38b6388937e66e425417d7b1268e89e8f731508ed3b090b9de7d63503eeab79dfd2c9b9acd8446b8c7aca6888a4c3a75dcab570a0b8d5727c9513354522d6b5c2023d0e3d37a341987b71832a732c508924bd4cfe79e3561a5f6b7a6abbe9363d2a71ae58029ef1fbd00680c24e9517ef155cd72f728c2947ea2827403c3cca6a355993bb92d68b49226734d45854f1da196f489fcbe62de470f15ac1f37d969606c93dfcddd44bb850f4a47cf71544452081e2e184dee5f4a8636c24c800177fec87385add0f8f4ee3e5d5ba4ab562118af504ee97dd57732c0ec5e31972c869eeb6ffb7e3dbdcfd96528cdf8def3734b837b295f6c77887eddeccad8b2022215c07cdae9702d2246fa159483674c798d5394dd79633030de667839a72c9cb5eb3773f907acf000256cb7cdabf05e131ffeb16a9e490bca644f46a06e7f100905bed108a2bba43d702900ae46f0145bddeac952a85f4accb3b2d2643ae0a0c84d7bb392a8fc8c9675\", \"1a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8febf22132d9643e24ed9082227473dd30d4d39a0b990b222eadb4d87d4a2f8740b87aa3d77021654e9bdded249075f42755a492250fa9a6a44787c57353d93e356798b11c96dafc2935d577afad31a6537ce4b1a48ff27833822cff5fe95a51e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b112b41944d8bd451ca6f3c4409a4448e82c100cb323999c9a9d7a5655e4ba06c52cfc49e90b3ac8054f4fb5a96bc92dd92f0bf377f0b2d221a10e0c78e7e0cf9c80713a75f1b7a66a506f1fb57e8471d263ca0cd6c052c5ce2d61f79503dcb1df6c9db66f71bdc182aafb5c9d4509461bcf23ba1d455ffa3cf473a61126819ef40002bbf682eff05e7799664e696fa123f7f1dc0b947d1caf4710c976656abe5f300dba88b76e6c9c02c37754dbebf5acbe50e495c5b275d2290051867bf0cdd8077b8fd3bad713be2d7db19e637f2eaf2e1943c1bad05e8399c8a82b2c2f28e12c8adb8719d0546bacb395d9674b872e4d1ccaecc0044d6fd2724c434ad345c9a4f496d7869c0adc35703b2bc3a7fb193e0e4c4f5297774840c5f7e238bf0b1f1a865a2acdea462ccd2988a3de72fe284ba74e371ecea2ff194b2f0b8f1490f8ea080d1a211ae006dddd8141c6f7c9d4d8dd88b039b823ad3248d6ad903b9859aa91b38459a5421956077025656dad3a8f328a837f9df63bc60e4d4bec481292c263798be4574565971f098f876c25eefa45f8f361449d43c0ca65e4a06dfd8cf16dd9533f919599b45300f89c92f9d21345dee13de8223a167de041716be99d9076c66c916fb4f9867ac0a96f1a37493c7c707d21384d0aea007de708e890945d6cd23d0326c041f54d9251605c6fb0fb985529f995a3e109fa54845a17999c1cf3ea4e9ea8bcfc75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3ff5c5d6186003b3e6d49f1c6ac4dc5a625cd45316b0701f0e70ab94b228af6df2727a08c83da142d000f7f66d34a23554b296f940ffe81022e50f50dcfdd8b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/456d04cce86b68e35302afe4c3345e7531aa7304",
    "content": "{\"tx\": \"5c3eff1d02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4f0100000047cb658a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b400000000b06c21f90234212f000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac25020000\", \"prevouts\": [\"6abb1f00000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\", \"fd3b120000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09020a9ed6d0162fdc26a45d63ed84b116e59a5362606f5cd32f4fba084b119446c61d24a4a6d1bafe9b46a76a819927a541c99244a840cace3799afa924a348bbf31d303441b9e968c652d5dd0ed337604ec9bce7ef399c6ca38b45e324cb2b7fdb7ea38da7c59b4c210db0addbb1d4f040a4f5a9167081a91e95ae73f514e22fc5f170e66853b80373ca579ba03365a963ae357aa6facb72ff9a4958fbc63f40e04108b6069677614e99cfc4b1d6afa7b4f26b5aeeefe828f81571b16586ccf589eed7aebfd560c893971fca999b0e4024848aca661aa8002aefd678f3b668facbd7950facf098772c3579adef2e84eaac7fcfc34f558387d1343b57b66b89dd664d96ea9e56e7e69801c996d550fb5357a41dc4e9a3a6dfa56e76b607204ee34b4004c9feec2b53e8bfe30b9285ba2212545fb006b2e1ef0850097d902ef8e277807ddeb23c4c97a35ade7ba9910e801b174d3c6c5f5deabe73aa24bdd6f8070ecc63e3a40b2ede659bcc5ce00caa70e44481665c925583467c190f857d742fa8e3b1bad3133dcd1a2f5b460567377eaa7f5f5b431c6153c23b3b00936a425af67e60cd68c30bfa740356284d8f65f3c95b2ff5186e0718beebbc5cfa6bbd2aad45393e7918205f86fcc3d521e3dc430d76c548b1e134492af5aeb72fbc3a69382361a551ab370e01a71424ffbd2fcebdfc8b1928b8112249b3b3bfb9f5dde4baba70a687ef880e33457599\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51379b42341ec85aaea9ba53764a308ad79e21ba1c6bfeef93296a10f4c0e568eb3c50effc4608d2c714b1f589c510b82e2cb4bd2fb333954004903b4f08f38a79\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902fc7ba2315efad43456443393f9eee65bfe67ead2686f2acbc59651624b753dae58d2b67bf211311d334a34761c9bd63dec663422fbb8c61f01c005f56c5e29efbb290b3b9ca5eb659c66c002ef42f452a0979ea19f3c2d11d8f023c151ff33cd338143a85fe818a812b13468ace78761bb990a13b8a4652a7c0be267747717d6f66c5ec05ea122aac2c4cfe8d1e36b277b388fe02d22e9882c3ece3dbe62c9231648e26ee5136a4672eccc74e7f29e9b9fe2c750c6593e8e5dfb08923bcc0ee47cf691c67cfc9273158d772fe6315785d28346e4b0118710fa3032fccd25cfa0a6a00b0e027ccceda6c8b1c72bc17b492d5dfc8f1c00c078359b65292d757ec6584f106800624b055c26e68fcbe76df8ccbfd3227a284f1cf99131edf1acc38f9f5b9a8b275c8bdfafe77634fd3ba2e59d482f06169cc091af4e82e700fad7fb66684c024ec55f8a35c909e336fcbc795c6ce6460444909fd0190b7e43507f88450b4cce6efc7ca9f0f027271cbd1812a40f1f7e320c84eed0fda2e26ac5d9524d0ac8b479ee89984fef260f3bfd1bd2ddb1cb4e59afabd34b7e58009248815d72a9553355b568faf0963a7c385c20f22b1f9da858636c938f6a99cfd4651ae70b711eba68e7b284977d631e98edcabbba860c28a652c267125675ebfe411f0af4e15bf8ef29fb0d3d2a695b60dce8d386ecff512402497845c3030b530a831d664be9ab0798e71ed77561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366f4927cf48427f778f6164e8488ebda7b6882b6008ccde3c7191d70c6abcfa8cdcf0c734edfbcac159d7813ef9562f4df1a796390e1a91bb6f745d3b9c841d624c8fbf2363a77354fc9c61d01c3ea3e8806c47304e5a0571bc5a832b63c4c4c93c50effc4608d2c714b1f589c510b82e2cb4bd2fb333954004903b4f08f38a79\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/457a9522f60a63cad613ce6f45ab52147b5a1871",
    "content": "{\"tx\": \"0f80966902dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0e00000000ea3117d060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708f00000000ee3251bc0203da6600000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc722010000\", \"prevouts\": [\"a96a590000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"3efa0e000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"dc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e87ec7f48ddb853ff8ec7c3ca68869c312ba33903dcdb15647a5295c052617846c86395c8bc923896e22972506a7f348d4e1ec7a5bf3aa363c117ffaeeeab3b8c4ad29df8a0e62e4f40897f8996914b12118c918ca2851b639742aeab01f587290\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fac1c00ca223002bbb4a77b296f490434ed2387551884308e16e8dfcb52ea12e9f3bfe8b0458382ba4f4ce4b13b8b707c198a710172b0004e49e202e4d70abaa7b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/45afd60d642320c756621d0d193cd27de023f243",
    "content": "{\"tx\": \"5bee4af203bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2200000000c005eba660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ed0100000060fdda93bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf65010000000bf347b903f07aea000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689872898922a\", \"prevouts\": [\"c7c87a0000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\", \"d53a0f00000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\", \"1e11630000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ea30927e3351644c00e8bb9074d5f41820840987fa10657656c3ebbbf4a3ebb7c56246497e5735e52993543a5d89ab846dde66278d9ca099ae882db2da31b924fd2ed0fdceeb1c915ddc0246d99df59eede8544da09c20791208d8e9ecd6d46314991226ba8ccff2dd20f656026969338807e0899fe6d7b9edf6f49864e8a117b27ec025baa7c6a1dd154aa465369c3107e309ba0816c29e84a9ecddcb7bb2a7b1f2445e3230ddb8bdebfa4dc7fc1b70e31a9dd3b5aa063859970c42b1f55c3d3b4e9036ad3d62c50258da97b21415ab24fec02aa04f50c8f97dd8cf895482dff8478fef82195378d4154eaa26c8a77c4f2f4bdc801bf8743dbb97fd881f27b5434156e01060031fd1b94b3156379deee84bb8df2b8a8b2901d6174b259e72c6ed446915499ded265eb8035739a04158d7a8ced365b182b3ce80584ac3f4a907ce89d4620d84adb82c840b0c147d8da988cb882f6bb8fa49f048f35c2e3c88718e26b400feb458bda5793ff9b00036565d411b23be3ed84653ff5ff456dc82f271ba350867992674e76a6cf9e360538453157d00a1294a067c69f1d10acad95cf1f67f2ebaa58fa4e4ba002d862fe8a9b2af4b93e97d3338b556aae79a29e3a91c5ca2f99424b2137276b9dd49ba3b92f09f26262b5e29637ada7d1818b3de799e41d4dd052adfb4cdd89992e8d24b208a27f68e275d2b215dfb4dc1c5c90ef64ee0ab7d52589d0a2c75e6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb42f8e5029e924e7d935b65d329b99c619ed2851847f9f95e76ebd19c6b8448036f7205f064a536655663faab66bf2e716758d251376e4a55710082b6d7272244791bbc3b31bcff977684854464ae3dc2a24522286fe393648b51abc79cc246ff8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902091f234eccbbe679615d46a2a9889ab42a8c486ef6b0fb5066bd6792308d0242e247f4facf7248fe098628de1eb6c66b62104cf36216eea85acb3c0ed207f367515b19b6610ecddd1fc17e5cc21c9e753c2a422d1ca6545868270e7afd0c535936329513cbf0431ae42283f388d0c6cb8d4b03604318f066f7bc4e2c0329da075c6170363047da9328c1d87a095e33fd5e4d8607a607f943714bd888223391dc149735064cc3cd57292cbe9c01043c9c58d32427535deee94c01c6e8e0ac46b15ab4a641a86f88e2e6437e0ade6292037c0ac12e165bb208e592f0054b960c411e2e19c63f04bab79b5aba7fbd768f0ef2a6e9684a6b578aec52ffec2b104ad58403fe3cf9accf0be89c6879748d5c04adc986673ba8bdb3038cf00f0b5becc2870178991082c669049fd50fa5e9cabd137d6880e93bb6845e7a7f243d4baa6825a83e573fd8aa53f951fc6c536c415678d97201cf70d958ed41b0a5f1c2006f927365907cf31e64556a2f73c8f9c86a6a7101f8e231e5adffd657be1538497c37c04e4b2da53d877f3c70697e1a11177f3975bc5bb731d241c3ce1d60c66224716039b14d74eb4d79179c90777fbadc711d1fd4334005d9a979ca5957424407b950a2b8d00dc735387cbfd8ee1ca657615f2240c47caf35b292f76e4c9d5446905e07338196f5235c5c3eab5bf448adc14f3a9237d7b207bfb761408a1427a36f85cee5bd2eff0e7d7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936920eba80c2f9213151a31ef0a132999efa50e46ccfec391e06fd49d7fb9341681ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045bd4c1b076909910aa73b6afb36aebfd26014933f900bad794466c6fcd625cde53ff737734404bbc9015f34371be38b9f5376f1a60720e7cf7da81354011ad4f7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/45b86557bbe4fb210901de818886b7536f396562",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbf000000007c50ca91bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf94000000002da740f8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0101000000229667af01daee3f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963a040000\", \"prevouts\": [\"27a64c000000000017a9146db815d9819f256ca5d1e70b15558a98689cc52e87\", \"24147c000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"aff2740000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"1660142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"cc47afc87fe7e8d7b05810557d398c7c6f0e422d590854faf4d3aea996538b47150c40e9edfa5851e1f642438811c8380333a2d98b1d78fa264d476dd3011794\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/45babb1803fdc9834a37bce496e989425e2fe9b9",
    "content": "{\"tx\": \"9264652d0160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703400000000317b18b403a20d10000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acd5000000\", \"prevouts\": [\"dc5a1200000000002251204bd530dd92500289ca536d9e0216beec7b39c81554ac6dd1e9e4cc3828e76161\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"fa7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93692144fa78a37f9d4158f2341b3f64ea9d93b698f8b61fb7d7e21bdfd4d5c0b363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0829a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ef1076b289256cd19daa60d704e81db3a39e457bb71d9d0e29c4cb2075820e5e1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c5b5d638e62e1ee83083719c01950228b7d23e6528a32df7f751a90376aaaf3e9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ef1076b289256cd19daa60d704e81db3a39e457bb71d9d0e29c4cb2075820e5e1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/45c14cf9149717468bed37e1e419020555c5f927",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270db010000002e0520a960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bc00000000add0448a04b7351e00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac07010000\", \"prevouts\": [\"c18f0e00000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"51ca1100000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fa\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bbf1d1d3d3f3a5ef5765b8348d5c92141ed2621e0ac73cf7baa1850fff99acc06081f43f8c34257025162ccf1daca48ae61c99356c3eb24d5601d3c52dd9de2a6f5053dc49cb92d20c30fe5ab09c589302aa9886b9c794d18405aff33121a169\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a1d35e36d71f4211ee8dcb476ced8f16f1af9e215de664588adfe8e8df5b115526ad4257a22b62302a767a5b8896008d1af7055b6fcc30f1a04cbcad06de5cf2f8b8afd7beb88d43ca6c6d2d58dc9425172bd95ccf582b2eeeba83616a9d27d33bc3f3b627616b9f836af78c18ce00964f5f9dce3e851898685189c72823645e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/45c97ab53324162e66ed1d4c64371055d966b691",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba101000000a9a32afc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ce00000000d3ee6bbadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf600000000f28de0af0335865a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb813d458\", \"prevouts\": [\"5519240000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"15bb0f000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"0239280000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"d47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8b970f6251c63bb7d52d2f522a2f2041b3457429d11106abd9da97a7fab7a15d238c2fd1368e2cc97a2933efae2d13561032948a77b2cd5d87b5e0b8010cd9f32\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dcde3d867c97d7a18e651bca5f63606f08ff12019e315b301fde84bc4d24cd8ff9197423ce94fe6d3a105485c3c73b77ffad3b95ed69b8a8a6b271b9e98a9e69ea84370bdaf8fbfa2c728119f306db95ff534e2e627fabf0c000f69380d4e93e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/461af17d337077781b7e49d203e17cf7cdd7781b",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb700000000d737d52860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d300000000aa1153480339fd2f00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796741c1828\", \"prevouts\": [\"d3ed200000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"6e931100000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363e76fda838f76382ae0d0bdb253de0cdef8bb5a3eb9bc3b2e59c371abae55d530d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3f2a2968b4ea0558d79f1ec3cd2b8a530982c6b5ad0be17180e93d11bc09903133cace0aa47e1a0afcba116b3dffe01d164ab3e15a9a2b15599aaabc05c638667\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361cc0b7b7d6ad7930d95e3200c68d1443ca9c709d86c4485118a6574c598e644fc145688b3898d8a1374847539a36067c996b07f78d82debe95e7e288000a7bb1b9cd72275efe6b477d9cf0b54cc21959221ed58300fa90def59e56d53bf5ae178c03caa221836b2e776996c8fa4c69c403af6889ee9c99c5c1fa82cf4b3a1b61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/464a9d31b63ef5f4fe0f193acff3f7a8251adb7f",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa00100000085aa13c060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e70100000090538ffa0198587a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7964401975a\", \"prevouts\": [\"395b84000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\", \"69b7100000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ce\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900455067193501824fc7e1f7f904c1e32fba78339d7701e72316b16feebc15a414abab692e734634bfaf43d653c1e6f6d8e8d14797d8e4fda7a04cf5eec270202b46d11737bfd86c40bc108767f37b7ad1553e96cd0852cc5d3aae7d4d5919ea2951\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367d1fd0be73b6182e4cd51ed7a2b120ef2cd5ccabb8492e6bf7f26137f064f14b8def8465bc2f3cbc3837b9c231547f51d7c9e247c478e05a849822285048dd5e0ea67bdb3398814286540937ec364df004af879f987225ad05d036a51e8223e6d4436d921361743dde8d98d3cfa724f09037452104a82644e108bdf9bf6fbb39\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4656d9b9e1003224e094622d9723247d8e53ca72",
    "content": "{\"tx\": \"1f1a48c703dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9b00000000fdf160f9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c03010000009968b6f760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270150000000060f62d8a013c37600000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc85000000\", \"prevouts\": [\"5a1a200000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"f39b5b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b0fe12000000000017a914b0b53ba433a336ced94ed75e23248458a1c69fab87\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2252202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"fba8faafcf8b7630fd262a54ff27f6dd7ae88c99224d5ec07684f74d9e49fe888c0efe36ef2e1d2bb45d110e5dc454e7826a5f40f50f158e6b10389b75e0f6de\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/467ac05fa481edab9bf207738a0fdf308bb097c5",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45f00000000788b972abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf02020000008b773e1560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702b00000000fdffac0001b6184e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8721010000\", \"prevouts\": [\"39113f0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"8f097000000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\", \"d0ef0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_4a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"afca39b475d08f31f02c6438e4e3ef89f87a5d88b9653c638a2dd902b3ddad93515dd0ef8705f3130f913d7cfcccae267ca87bd72b40796166c52b630fc70bd402\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a00c7c0b622457becddef0664e7b133699f813a54c5a66c7778b4e3f0e704406820e9a11a2feb0a7449e51fdcd2844b9526915df881fcab0a0396128617bbf374a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/469213f3d0a4e2171977ef67184aa5af2a7d259a",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0d02000000419a5faf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45e010000005e59f2d60130516600000000001600149d38710eb90e420b159c7a9263994c88e6810bc72b000000\", \"prevouts\": [\"73ad7a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"046131000000000022512094bfa417ff7fec0e1f7b84edca83ca6ff73ff5ab901944aa69a26f9bdb9b300a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_43\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d4634c590066bea2959548add44f4ae748221bf303a7f07f4745efb4e1955ee42f2e834c20834610c24d9cdf32adc32a97088f33fd3f4edd9148eec585314ade\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"88728b962159bffed4371671c2d066c044a618f74c657c6b8c85726f35e276f432f9b08211f4ba207b8133b661c5b702ae66c53347109789524bc954f8592ae343\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/46a14a2d2ab594d5d1917b16120cf28258bcd02b",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf59010000001611e3da8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4100200000040147ee90150805700000000001976a914c629d61df58baceae110d15eb5b55e144268615388acc4030000\", \"prevouts\": [\"854e6f0000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"53a039000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00638568\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360696f5b4f1dd7045c4bac67803efea85e4be4911fdec759a69cd2bdfd360ad05717b4e30a5884e3e55754911c167a338fe4fe766d1d9ad9fb23fde5d0da8b2aeb2a240b376911c9876b3695f79f395ec3f2d97b1695e5c0e7f397f1ed982e79a1b6e729898dfeeff93e2067a7d076aa1bb7914d367b163cafe54fabf88cb14d8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366fd39b63ba8e52e90fd8a07b9cb05832c173e8838fd172658667cf8878374d8c952384bfcd198c969b60204543b8b578741ae3068409132e955e5c7af181f3d3734b3a7050eee065844830ad8d45a710891f78004f5e7f35b8fd72bf3ee94449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/46b30a46669909d38ddfd379180d9b9e4b032d30",
    "content": "{\"tx\": \"b516eae002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3801000000c3f7c6c8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8800000000587ace9a0352bb73000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4872f7d0b24\", \"prevouts\": [\"9917220000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"91ee530000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368f5cdfcf40d08d1ee6c8b33ae5ec5247fdb56b1282308d0d349b07692bd5bf381ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045809bd2604b63a9913b428e9bd239a7888c90ad67a336710c360335112147f5da391a14412c925771c32fa4c7776d5872be2a56fee9c5a8de868e7e6e5a4c84da\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4dbfe159b7f074423d2fa61e8a9b5231056855b78cb68876c387837662b8c070f92a4f502e305109d81040f98432632ff806e9beae33e8faa7e022234476532106df482d4085282f873fe38dcb59fc4eea3656d896112fe243f784a0cfce46b53\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/46bf3a742f868512007f33d6092b25ad9851abc5",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9c0100000086f844cdbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf57010000000f4c07bd014c2ab2000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48780020000\", \"prevouts\": [\"ab6b560000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc\", \"09216e0000000000225120460dfd59ffac97f33cb704e62d40a80655c52408ecad6b881ea54a9bb408923f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090247300d269ff90ed5a8fc056a9f4039ace7956bd2266496c395b3f3bf081860e552a40053b948e6efbdbba3519c987fd8b22f029a3c6ed021aecfc84090657657308dfc28c4e589a5690b2a59259903a1d31f3df33c5a0b0c4f01fd370a439453e105749b95ff347b880234267c6b3f0e5e51e77e73a3b6a4750307b0258ab93cc3e20bf6a4a8e2517dd738b729836a4597f6467f665562c9d287f1d34c013038cac1c435d768fd42150a3a691acf2429439f47c3f3ae261a0340895635c2984af00cbff42e287276f7dee31d6da2db71ee5b8f8a921f2d63f749a41d1d99cbcc03e5ecf1b38f095daaf28d144ae432343e55692abd16b01457c5f3eb27fe7bef3817b71d6d3aaa575d5183fe3d85b886966b183bb59162e55060dc25b85ba8ab98b3b36fb62c960ce82cab0d6e66e4dc5a2051249fd7aa153a0945c2574a772cfd85bfa78ca18b594948c391d4b1d72ea544875fc54fddc81a66cff18f5992aa23493d78edb4d229bf84ef70e3f262f5eaa66e6b48045931bdb0136115ab78ebb65f9add46efa738eef38c0178a52f386cfd733dcb92b606be4d38b051d77136651f4740024bde98733a46153c83ef1bce9c42c9c0389a4ece0109e5aba1eebbccf4ee8eaaaa0ceeb05f08012b322ce8536dbc3261806d7b4b5ce8ac40ee87df3184ee1f4e9fb6b37a38ecf1627d9cb494d9077d4448b8c23f2dcd4f7a031b73eaaa6b14ae2c0790cd75\", \"d67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c254a8ac6899858608f160ab69db89bb24ee8208e13d5ff22518d57ffad270f18a47f828b5683f18d8d2a0301cf32ab60b8042f73dfba3f43f347d91ef120fb4bd0211bc754da142cb3564162304068e34e33074851a6380a45a2a3191e3f102\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09021df5defed6b9f3a531496d7ef3200d910bd8f37c98089593d53cc00aaf846087b410b368f872fec06c4fd320cadef3f0c360361fb8818058d67b2732ee6c0e9fc00620a25bcd84be486f363566796320a62b31cbbecef30406a07c134f320b997a64d98b2b24d418a3d6a6042bc7e916f3d7a7dfdb84c867f7b30e5f35337ff6f8f33453eb4aec5605b47157fe0dfc4ce3873ba6319249c04fc558f04a57dca2c0bd2948b68f2c76dcccc261adc60c77815d7f3852b5a642deb5b650ea487c8cec1a8184e1773a6e5a6be17fbfdae06f442263328bccbe1aa37f4620c4533c1c9d2548c639c2209ddc2da85d985063b304e83d97a1f38319dd37d2906ee4c46d159ee253e59f45e69a6ec34d739e141c939036ab8f2f049342f5a34e69a2a3afc0e2b767dd70bb119499639f356e64ce4a9bf10a0765b35ef1165d3f364e50df6d75a87ab3987708f1c3133957bcd0bb552427c0b1f1d352bb7f728f30ae5fbdf41bdf7ea0646087a1f576ed884ced0e3863582203ad85f357d8f227c39b13d607c43037d77e8f1b21356238f8e515470b78821c9550c5f453483e1ad75d799da93e6e9865fec07314f67cb51787c5b86de39718271ea8dd5b44a18703dafe8c8d1d36039351c90bcf7adbb1b1c804f334d708eb35f889da72fdc94b3938c414c9011870ca102d6c8c8bf4fa7a3c2a05f38f19168a124086d7fada507279699a48d38aa8a60b147bd175\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faeebb44c2a26e7d04d06be9441726cfca165ed247b802be55a42fd4c1a57db75ef0c0cd32dca2782b49e872f77a6f41a631e1b6bec2669bf2370bfbcbf3d4a769630d95c26588949f1b3ae4e4e429080b434b995fa18047406852c727cd9e6feb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/46faed608cd8553355e705736f5883a865bdd1c0",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46d010000007fc9e944dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd50100000032d28935bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9401000000353048d30172b24c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487ee4b014d\", \"prevouts\": [\"17883d0000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\", \"4e40240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c40a6f000000000022512026ecbdce513e5cfeb779eb6a118aa90fae67510c7ee9bff64af6ca27f9068c2e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"994c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367643e13e483d98b5cb4a2dd9b2a8baf365ffe94859ab503c911dc21978e6d7804c8fbf2363a77354fc9c61d01c3ea3e8806c47304e5a0571bc5a832b63c4c4c93c50effc4608d2c714b1f589c510b82e2cb4bd2fb333954004903b4f08f38a79\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b39e544a8e3d2b207cd38626a9bebd6ccb5f06d994574d73902ada6a510f1a46d85ffea93b39ff48f026a1de615f9bd5d9d5cb27805fa051e581b49afd71e8d341e79d00d576d46a63d36f208105835dedf99b7ad1f6575dd8e28af32480c198\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/476140a4869c363ff59de15ca0b3dddb33ee16ea",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cce00000000e19e8a348bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ef0100000011e89353dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0c02000000b3dc5d44043c69d900000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac92010000\", \"prevouts\": [\"d9e6520000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8f6b320000000000225120d70bb5030b4517d64d2a3c38713515b320a06334d0ff9db76c903984d8e384a2\", \"bcc555000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_0\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7d160ece680f4a8418caf812fb42769b5e408a02105b9a68896ca83a3171b8a53cf93c9ad110707d9e14d443259d5d290d65209d9000c9004312c9d2450a212f01\", \"0932f4f5d101937a49b2930a1d013cdc91254422cbfcf6f75303c2819f807770914d758b7a9656f312141aa9194210761099ab021ccc7330a2cc83259482407f1684db0a0b3a460b0f3633fcb20f3250353255562bd39c9ac2ddec7ed3ccf2bc2b80f07306\", \"7523fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93661c8486f195c1a3ef65b05b37e21a103ce642eeb740a8caa78a5c1ae370e33e4badc187240961080422bf8276f0a29eb125316a15ec8974d553de5fce36f3bec253415b71957175c16169c49198cd3f0a862455b885e0e35e372fdad520e05c077c3f65b74130262b35e7ddcb26a78aed79f034d7bd147773940bee02cf44653904a03ada378a2a6776c9b245e4a0092001043bfbe5bfd30e518ea25f18ac33ff7f4e9e15e76c636b150da06993b5f6de96a2e1fc090f2c7907997e1d5fa996a51f24777e7b300f38d6ac44a3faf36c476f4e61fd05c7a39a19b078a2b755ce8afa3e5e87451f40747520aa94b1c95a6038cd1e021072105441c983913767b9a3bb2766bcac675bef0bca1c7bda289c172bc7a7a61650a894ef287625c85677a18f2a30f20b7667ceea24effea42161391d26cf59961eaec6d3852f2dd899663ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb475c2965818d83b7e67d20b694a799e76d91799e7c9d242e585855f03d1b3f3a317c237fbae01a7712c5ce36aae4d53315cb1f6d58a4d4a7268d3ee086533d8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffead926b6aaa264f5eef0c2799d712a273681ef3c5162836847eab383546f5ad83da61e004ebac3f4f176fc2fc0c028c8cba9c118abc2ca84e97e1628f00a76f88a9fe018c5a0f50159624ac39dd70cb9487a42ea86e1ab8f7384ea643dd37714827b4b176729dbc4c206dacf4816a37404955c1bd1de44b38c66210020711ff4624343830e54cfb3610465196c2c7499f5c337c03ec74f3acea427504fd7e8a8b0ee0c43bd6793d1598918c2dac05c9908803c7b523bcfd439579d1dafa142fd5f51dacee2a17a5dc8efba06eff0416613cb73850b2889c267f9ef13f780748642ec6bae520583dade36096f88449a4e0166653db943e03b0cab3a9847762884ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860e33487a6aa09e54aa4f342cc7a411a8ef7f6afa6f34d822f4dd0f7e6978c7fa71a1d448e576f7bc8eb2a93f77db90f74289c7b16bb694e2f60c2ae7af96efa4e741f628ff10a1d626052c5b96dd204f2eeee4144e384fcb0f1909b6f642fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9dc24862adb5cce7096a62db5f314c590b5340a9a69760d3ba528c6f4861b35301a20d17517777d4ce8a96339de05cdff73e4c7918682ead0cdd9afedbe6df38ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff28c226ed3ff213133af90d017729877c6ca93ea3d2f4c4ef04cc926a7d2c9dce6b90123d0c13965cbc94a8640b832dc9ecf220d399fcdf833ee978188a0e35e1922ea0efc49e9c9ea2964f58b8825b7edcafeaaa29a53efc52db0e01650091a9e8587a191ca71cf2c3286ee45fb294be949e05e0ace18dd6f0b004f85420edd1eb26af0a5fdc50853c20222041699340e30804b62ed136f631ab79b2ca6e2399c93b9c6ae7b93ec96914f7845b510e34d6deca37679658371c2ed877f0bbff67ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146423451ed710d7875e782a5aab0af9c9ea2f5be99c037f7f68c80f19bd6a4d9b48ed8147bf711ea1497e58e2b87e37ccd0c69af656d39595032a9358ea9167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcb410f2dc5ef8ff73a6320dfac7906626a65cafedcd6208c29103b800d8169ec0efa0ee3964ad3fb78afcd63d08e12dd4923aa3b8b702f7d4d59f7f16172d2ab0000000000000000000000000000000000000000000000000000000000000000fbef2d3df302890842449802b25db8f790749e3fa39301a71efca2eaa0ffe0d20bc08cdace3b2cb38cae679a43fef7183c04d1da78593e91545bd1516babf780e4a1283f5fbe1e73fe0c924d0e63b8250355f37bdbdc68bb59d43746a54e18a3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff593d259514a1eea6eb45841da20e8538cda29e9c068cf2bbf9f6928942e8acd1e03e21750eb40ccf85663c686bf9c9f5a7b8c00c308b081883cc8b3e5a2fc573b30e90f2428c17ee7c54b30800f70536049cfcf3ff7a371d55cbd3255898b068787f39dfcfb5de7a52763752d75e73ec9f49d5be2c6c6b313e13f7c716a4a1f114e6c43d920687090561e291bcc0a781bbe20849c55303416cd89bfb48b24ebcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b1268a56dd0c7e5973326b41543a37308d8a4e6341fa595bc8ff6281316871878caa4516115d1b43b10e9f59762ef9f6c0c07dc30d0d01d50ccf4804af19ccd4fe104c9600bab531746e5efef35e26b6c138b46f2d68f01da70c1a65c0344d224b5e9006c7d5087bed656d559dbf12820bde2f21c6f6add8b4da618eaef8e090716b0ecd7aa43e45edf6bf8005307b8ee94c9d0ea4d0a4c67c652e5cf415cf40ae826539b2dbd0c39086794802b427f7e40aa1846b5973570f402c043dfa2b1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94eb16e8928ef2c98a9739e333343d1c8f559841efe8379299e82c553ccc6ec926f39dc306592ea8ae4de8ce433a4c25f4deeda2fcbd2c2b45b7c0a29f35ab7600000000000000000000000000000000000000000000000000000000000000007359ed95dcb850fc1d84b29b77a5df73488d568934f5d8a345296334750d6de3c2e5e21ba55fb31bb677804e259424c38866491a0dda2e316d998c1bd68a82c8cf37fd5412e92947c5bdf1989938f20fe49730eed2b693c9aa6a330546bda40400000000000000000000000000000000000000000000000000000000000000000f5bab539dd4dd5a555188568ac4b1cbdde0e4123d7d118d3c31408a3a7ad3b6e7cfaddae4283aa121d19689597dd5ed0256579d7ab8a9fe416aa1f15cdfa00e\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7d160ece680f4a8418caf812fb42769b5e408a02105b9a68896ca83a3171b8a53cf93c9ad110707d9e14d443259d5d290d65209d9000c9004312c9d2450a212f01\", \"f92790b4ebd08bef1de8e1d9a8afdd70938b7507ec1beb7c02216dec03e01d1d912b194ffb1fbe579ccf9980c1f9ac8d570eebe418c98a5037d8b0884595507328c5bbdea1015b055b74a4618fcb3e0f1cca81132b9f120f67a23c51161b186a7630baa6\", \"7523fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93661c8486f195c1a3ef65b05b37e21a103ce642eeb740a8caa78a5c1ae370e33e4badc187240961080422bf8276f0a29eb125316a15ec8974d553de5fce36f3bec253415b71957175c16169c49198cd3f0a862455b885e0e35e372fdad520e05c077c3f65b74130262b35e7ddcb26a78aed79f034d7bd147773940bee02cf44653904a03ada378a2a6776c9b245e4a0092001043bfbe5bfd30e518ea25f18ac33ff7f4e9e15e76c636b150da06993b5f6de96a2e1fc090f2c7907997e1d5fa996a51f24777e7b300f38d6ac44a3faf36c476f4e61fd05c7a39a19b078a2b755ce8afa3e5e87451f40747520aa94b1c95a6038cd1e021072105441c983913767b9a3bb2766bcac675bef0bca1c7bda289c172bc7a7a61650a894ef287625c85677a18f2a30f20b7667ceea24effea42161391d26cf59961eaec6d3852f2dd899663ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb475c2965818d83b7e67d20b694a799e76d91799e7c9d242e585855f03d1b3f3a317c237fbae01a7712c5ce36aae4d53315cb1f6d58a4d4a7268d3ee086533d8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffead926b6aaa264f5eef0c2799d712a273681ef3c5162836847eab383546f5ad83da61e004ebac3f4f176fc2fc0c028c8cba9c118abc2ca84e97e1628f00a76f88a9fe018c5a0f50159624ac39dd70cb9487a42ea86e1ab8f7384ea643dd37714827b4b176729dbc4c206dacf4816a37404955c1bd1de44b38c66210020711ff4624343830e54cfb3610465196c2c7499f5c337c03ec74f3acea427504fd7e8a8b0ee0c43bd6793d1598918c2dac05c9908803c7b523bcfd439579d1dafa142fd5f51dacee2a17a5dc8efba06eff0416613cb73850b2889c267f9ef13f780748642ec6bae520583dade36096f88449a4e0166653db943e03b0cab3a9847762884ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860e33487a6aa09e54aa4f342cc7a411a8ef7f6afa6f34d822f4dd0f7e6978c7fa71a1d448e576f7bc8eb2a93f77db90f74289c7b16bb694e2f60c2ae7af96efa4e741f628ff10a1d626052c5b96dd204f2eeee4144e384fcb0f1909b6f642fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9dc24862adb5cce7096a62db5f314c590b5340a9a69760d3ba528c6f4861b35301a20d17517777d4ce8a96339de05cdff73e4c7918682ead0cdd9afedbe6df38ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff28c226ed3ff213133af90d017729877c6ca93ea3d2f4c4ef04cc926a7d2c9dce6b90123d0c13965cbc94a8640b832dc9ecf220d399fcdf833ee978188a0e35e1922ea0efc49e9c9ea2964f58b8825b7edcafeaaa29a53efc52db0e01650091a9e8587a191ca71cf2c3286ee45fb294be949e05e0ace18dd6f0b004f85420edd1eb26af0a5fdc50853c20222041699340e30804b62ed136f631ab79b2ca6e2399c93b9c6ae7b93ec96914f7845b510e34d6deca37679658371c2ed877f0bbff67ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146423451ed710d7875e782a5aab0af9c9ea2f5be99c037f7f68c80f19bd6a4d9b48ed8147bf711ea1497e58e2b87e37ccd0c69af656d39595032a9358ea9167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcb410f2dc5ef8ff73a6320dfac7906626a65cafedcd6208c29103b800d8169ec0efa0ee3964ad3fb78afcd63d08e12dd4923aa3b8b702f7d4d59f7f16172d2ab0000000000000000000000000000000000000000000000000000000000000000fbef2d3df302890842449802b25db8f790749e3fa39301a71efca2eaa0ffe0d20bc08cdace3b2cb38cae679a43fef7183c04d1da78593e91545bd1516babf780e4a1283f5fbe1e73fe0c924d0e63b8250355f37bdbdc68bb59d43746a54e18a3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff593d259514a1eea6eb45841da20e8538cda29e9c068cf2bbf9f6928942e8acd1e03e21750eb40ccf85663c686bf9c9f5a7b8c00c308b081883cc8b3e5a2fc573b30e90f2428c17ee7c54b30800f70536049cfcf3ff7a371d55cbd3255898b068787f39dfcfb5de7a52763752d75e73ec9f49d5be2c6c6b313e13f7c716a4a1f114e6c43d920687090561e291bcc0a781bbe20849c55303416cd89bfb48b24ebcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b1268a56dd0c7e5973326b41543a37308d8a4e6341fa595bc8ff6281316871878caa4516115d1b43b10e9f59762ef9f6c0c07dc30d0d01d50ccf4804af19ccd4fe104c9600bab531746e5efef35e26b6c138b46f2d68f01da70c1a65c0344d224b5e9006c7d5087bed656d559dbf12820bde2f21c6f6add8b4da618eaef8e090716b0ecd7aa43e45edf6bf8005307b8ee94c9d0ea4d0a4c67c652e5cf415cf40ae826539b2dbd0c39086794802b427f7e40aa1846b5973570f402c043dfa2b1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94eb16e8928ef2c98a9739e333343d1c8f559841efe8379299e82c553ccc6ec926f39dc306592ea8ae4de8ce433a4c25f4deeda2fcbd2c2b45b7c0a29f35ab7600000000000000000000000000000000000000000000000000000000000000007359ed95dcb850fc1d84b29b77a5df73488d568934f5d8a345296334750d6de3c2e5e21ba55fb31bb677804e259424c38866491a0dda2e316d998c1bd68a82c8cf37fd5412e92947c5bdf1989938f20fe49730eed2b693c9aa6a330546bda40400000000000000000000000000000000000000000000000000000000000000000f5bab539dd4dd5a555188568ac4b1cbdde0e4123d7d118d3c31408a3a7ad3b6e7cfaddae4283aa121d19689597dd5ed0256579d7ab8a9fe416aa1f15cdfa00e\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/47678ed5dae9d91220f82b512192c03161458d96",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0302000000e24818d4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9000000000f9f348ce017c48060000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7961c030000\", \"prevouts\": [\"dec2220000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\", \"964c5600000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b21cd3eccb1078808f504a0ae9d7c98d8587addb87e97e44101fed206146f041397c930f8b1a350a59ca429b0fd379960979d81cfde5ec584df3b9ebc58890893eea997a0110941a5969b29cda4ab73ccfa6f2fd6e912ed2c1a2d2967497c6fa4915d9725d4d8db5018b5c71ac226416665c86e6e588f7af4bc1f346c66c53c2f2e96c2af1abecd7ec70592c666b70af2736296507164e3a59e0554b9ed47a8b14c678ca98cb4ff6e74801a9057f9ef2aa64047316f13310422c564811bc57ca090c9e7f51fa6e58cf7c2ab965cf4deb74ef5b8f205e30158c7918625b9e004e0a6d7afe29e77c8a5b7d39dc48c521b3c2e0e56a90a7290f68a7a8e9cd2259f6af255e941ddf060cb57c34d3f8692d1eb2d40822c90b741229cb84deb42ac72d6164d94a5a5bc6b42dde89904edbd913771c68e817d4bd13ce172171d532edb3927a967249675621a2ba38d32d4c71218fe8f7eeaa4a486963b0f6be94b9df3082a5bff5da77ea999c39f1886fbe83b65c3c294bd84d923931966794f0ed4c8eb2275e760f51748790687e4eddd8f48fdb5bf4b387de57a7f0ae2bdc5ffd7161bdc8337bb78f423569f0fb3898d21833e02384be4ac11a8f8ff0457ab59b60b870d015fbfe17bf01c6d26bd54a822ddb3265199a0e19ecfe8c163206e432e92c1b6b16b633663741e6c9c7e93c7ec5e072d717e28fdf36b6c22688a4692cc3086ce41309523f20962775f2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936855634eaecdc9d9ac50e15cf1cceda1e94c28cba9dcd92e65bcab0ee1c3b94463493aeab6959567855d46871d1975f827c269435f7c9757b13dbaeb906d5d20b01b5a419c18d23e8c03ade77009761f1ea37c255231895048329572c11717ad56187254dcadbfeb5c8509faa2902470872e97e8359524e33e4df3f76314d708e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ec2584955cfcc968f1671bc170893f3f1d670ae5f3bace663ba6a17899595941ff280165f60d561d360401efc472f2dd97f8b59e3b00925e42a1abec8e328ae896f35511e1dc83b8186dba62a5df93c4c5793fcb840e7eb24f0baa740fb35e170fb4c400ee08ac5023a913d1b21796d5dd74de8da6ba15f022a7400394750208cd8c7b49645be052dc0ea47498fb67d3ad7ac2b813992b7760a9a93a6863f807aaf4686f7ca4bde93d6f05940f17586d42cc57a7b1d40702115b04335b56e2aca100b328fd6c49b3db208564066ea7143a53bb9a9eee9780ba43ade0b77cc90cedb39c7a9152fa082ea04e62812bec435ea21455b5a02994b3c281bd79529203a4984ec581ac07c954af11c32a28638ffdfdbc4d21e47af66c0ed217dc1089dd667d864339d10e8b4bb0998c928aafcd6d05549a54cd2699fa2f3b254f4f3f502d2f6a25988e244b0df660f8c726d582d28db295aeceb753da2bacdb958651029b46541aaa6e3cf630ea2371e737a7ed998b2457e8bd85dfaedfe0e675e846a47cf7006b66fb69d528c238838faa2e33eb6d712447da34883ba0d7c3f2ad6f87f86b0b181bc5026a6af6191d084e31a457bb14df8c523a614b36cbdfcb2ce044c2760b12638c3059c857db01d0d374c8d6ab6b2be6ea793e93e0fa3b64f718a8c79065a8e65f3856efe264c04c3af5ec294f09e96cf02d52dea1df8d613eae2f6fd023376961b36d707561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d513f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821de3578bd50e4aef3f42172206e28aaa53f32c3941b8b4ddcf806814652917426187254dcadbfeb5c8509faa2902470872e97e8359524e33e4df3f76314d708e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/476e1eb3a45bcd3c87728f4a5f152341fc41c6d6",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9c0000000073b9617bdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565caa00000000e018eef0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf8000000009055c6ed02596ab6000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8cf5391e\", \"prevouts\": [\"56552100000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"682a4e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d136490000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"557d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e283c6292a6ae3f7cd2fa90a42d11f5a54bea63a95cab37375097c35ac3f3911dda77d1c2cfbe9569ee5db2c51580a9857624040db9177af617be0771cc5b8a1b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8cf2f607c60f6c156b7df40b9550df6641a796550f01570d3040f84cea15217bcf33eaf0e0e2046a2b327db0183a88d397c5be0a86c812e98815a20f9da9843a2a4c5d50721208c85113b157b4dd4688510f63bd33d4c90ece0d9e0afcb8224b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4775847b1966e3acdf5bf21407d223d54512c0aa",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4600000000ece899acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6b00000000d1ceccb003347ea4000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e754000000\", \"prevouts\": [\"de454a00000000001655142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"7c0a5c0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"5e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71edaba019801d089772adec5c5b59e5bcfed03a63e4fac904ae7f3c905b717bc6fd7bec169038f6fbc2f311373c62d75738dee89ed934d1dccaea4579b1c053aa90a9249c0485c0b349be2068ea39eda6d50f7b6c474a6d5eb714296c91a9f24b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fe3a991642405641833a7e7ab1d7538152ae68165bb1749fa1b8edad905e55795d6d6d3f2cd85347736e7cd11e639ac781ae37e103c2c2842f248c73b61e825b0a9249c0485c0b349be2068ea39eda6d50f7b6c474a6d5eb714296c91a9f24b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/477812c3aa633968c3f508ea4a64f6240b7c1282",
    "content": "{\"tx\": \"716b8db702bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc4000000001e7a2ac28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40b02000000e32d47c101a5858400000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac93010000\", \"prevouts\": [\"3afa6c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e140320000000000225120571bc713e1a1d58bc4a7da330f9b17653bffa646093e5f5e3088fb48bff87491\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"ca7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e8f1383fd7477c38c90a6990274ce9dd13fa2e04ff8b9e6fd75bbda71e156ecd1d8a21256d264232ee00f93dc1ddd051bb1479704967786b363cfaf3cd40418b0ce21dc20c2e8df5336572f81421322a354c6d32fb525b1159d1e49b1e9404bf5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93662cf871ef72e744ac21df2ae1dca341db6636f118cea74203d61b4d210926c308f1383fd7477c38c90a6990274ce9dd13fa2e04ff8b9e6fd75bbda71e156ecd1d8a21256d264232ee00f93dc1ddd051bb1479704967786b363cfaf3cd40418b0ce21dc20c2e8df5336572f81421322a354c6d32fb525b1159d1e49b1e9404bf5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4786bab5e3fdd53811fa094d64658a869323943d",
    "content": "{\"tx\": \"c78d28c0028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b900000000714907ce60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709c00000000d69c6cbb04d88644000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df9797223689876b010000\", \"prevouts\": [\"d6823600000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"c2831000000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_csv\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"77f5d13a5f86ca1707350746753a8d93371add02ed5bf24e662743beeccff85eb72191882226016ef4e4657bffb5f8029792835bf3f531e5956c876c2cab7c92\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313ddd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"77f5d13a5f86ca1707350746753a8d93371add02ed5bf24e662743beeccff85eb72191882226016ef4e4657bffb5f8029792835bf3f531e5956c876c2cab7c9200\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313ddd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/47975b43d53b5ddfe8aebbb719cb70af90f9ca56",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40300000000adc681c160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b301000000dee1962b01d87c34000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478764020000\", \"prevouts\": [\"f8753600000000001656142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"65390f00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7978dde698ec2ffcbe18d31e2b3e1930a62fb25b10c61fab7b5bcb7c9958caaf1005dae1442a6f45bfa98dbdd682397b3b8b78c167932e94f80d4e7c40292eaa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/479ddb4cda1c95a66132ba2891f8deed16e1e31a",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4de0100000044be49a801b7d116000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8701a0b651\", \"prevouts\": [\"e7be3100000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"387d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d03a0e2dd976c032df5ba11c8ac0ec783bfd7377fb7304a38f58a019219dc2e3f7118923d14a9704f5c6065ead9bf1df659362e443facca38f7fc54a29b18e2b8fa601fcc68a78472d280e0a6f10ace0c22dad9ad93c154f995d1132d7b2f793\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8f5321bd3c280560a6e93f009006b65547a58d72ede42c89f2f760c3bf47a1d1aa12168afdb4ef286e7748ddb08cf408d85b089f504486378d2bfb535c0d2875b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/47c96a95d6bd928e3390068b3c94db28d219e9c7",
    "content": "{\"tx\": \"6ce4a80902dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0600000000fb9a44d08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4aa00000000cd2115bb0257a88400000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc0a7ea020\", \"prevouts\": [\"59204b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7ea13b000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"fc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082cb6beef37ee5dce9a0d87dd9110e965067099d7e22847272a5a9481e46004ae8aceb16be1ebf4fc69deaf064fc7bf5d7ff2149818b5ba4c28c799d30ad567cc959b5d8c486a0b4fb1c0695d0398f92463f78d98cf4d122171b1dc85f0cff66bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d8f9b91a8bd77dea62c47e49d062c2fcfe01875e2df978edbcee5db59c7daa26cb6beef37ee5dce9a0d87dd9110e965067099d7e22847272a5a9481e46004ae8aceb16be1ebf4fc69deaf064fc7bf5d7ff2149818b5ba4c28c799d30ad567cc959b5d8c486a0b4fb1c0695d0398f92463f78d98cf4d122171b1dc85f0cff66bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/47d2125494edd0e8f737339160fc2c2bbff13239",
    "content": "{\"tx\": \"d181cd7103bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1f02000000538bccd660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704f0100000003fd78e5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf30010000001a08da8c020568e0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ace80c3a31\", \"prevouts\": [\"725f600000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"3713110000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\", \"e23c710000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_f5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"29b2c78e49ab0e4c1da797ce959ff3729c64b8780327e6e38b44b6fafc92fa2e3343e9dd1bf22830387165b20494522eb04cf25cc768a27b069e4593777de80902\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b32297a833b7f3df8b1030409a31e3422bf382c6aafe4b596b6b507193f0d6a68b61f60e8ea53cdd4794ae56970ba9298884aa1fe55dc5c25ef7536b39dda4a0f5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/47d754aabbae7b0b019240479e872ec641a71606",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ac010000004cc6bcc202066b37000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478736000000\", \"prevouts\": [\"8be139000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"8f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936963dc86bc71687ecacc1e5b8f2c4145fceca424a4eb02fbe2bf7a8e8f9bd1024e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e81f261744aaaab7b61bfd8b873ce05c274059b1d1cb072d2d2c67e8900f407405dd5f972b05e2f18c3e7c797b604beeb8879a3af7f1e10968a0ac8aaf9d489fe7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa458187dbd74455692a21727c8254a8cae6fcc3fc3c7e883861248db6e64d9919f8fae370a255a677f2f729010dbb329fa966ed9a0dd82e5083dd7ea90426dc47\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/47f82c71674923da07b7c082409faecaa9d932d1",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1f0100000024be6dac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708101000000ce3435b90165bf2400000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac4f45d043\", \"prevouts\": [\"f8be21000000000017a9141582f8bc3490e924b143f387e99eced40303eaed87\", \"53cf10000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"db\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936158dbdd04fc8b1597704d885de388d9e8396e20d8d1d942e0680de9f689953519f09ad02cb012ed2091760f4e9ad26775ad10447e2b9e598a8be746abc4727fb4e3966518140ddfb4b2a9d93e012e33d80f6a3bf7f24f1b44efe84ec3ac236f0e053a85c36f8a6bbb26ecc461a581c33f0f0e79993e29030d20b8bcc8871f830\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93674592b4fb9d11d06e04aedf373a859381c5b821797864f536763c5371283881ca04823906532712c3d4cb334ae6c7c41a1294a824a25b5277d43f47953a1da33e053a85c36f8a6bbb26ecc461a581c33f0f0e79993e29030d20b8bcc8871f830\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4849670c7437aabe38ac365b533b2cae10e1c316",
    "content": "{\"tx\": \"fb2bc47d028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43301000000be89569360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b101000000f904b380013e3908000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8790010000\", \"prevouts\": [\"4291310000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\", \"39b01100000000002360212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"f37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e8196b2ad6d6b5bc7837f2ee6018d0c442079551bc2d8b1220df512cb455d716d94fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6ed93ab99c02c1580916967b23bff6c51eda165404bd9578af086db7302f1c7275\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361c7f90985649f4f780ddde68fefeeb82111abffafbe26556b8bb88918199344b8196b2ad6d6b5bc7837f2ee6018d0c442079551bc2d8b1220df512cb455d716d94fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6ed93ab99c02c1580916967b23bff6c51eda165404bd9578af086db7302f1c7275\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4877a47b68dcd97455dcb8cd52e27309ec642b93",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c13010000000be331e3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6a00000000b0cea3c303fd75cf00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb3030000\", \"prevouts\": [\"6a5f51000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\", \"eae27f000000000017a91448964eab407ad5d6e123f59d9280ca7998f71bce87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fd4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365f3e79e727db2ce69498c039b8b655f97a15b215378db35ebb03872d036f84823effc93d9a59775ec6af4eadc6f66e855123af6e736654ec63572366f38b17272c347795cbfd24b3bfff0bc05cfe1b5e01afc0104c4d9fbef2a45c75fa918ca8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52fd\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a87f953251f51e981abdf2d54ebf7b5574cc2fb47742874145712c569ad8b62fd9f77cfc3030f4fa2d9551f14353e565e33cb9a72a19e79fd0e4930553ab0cc3a3aa70c847d82166fa4c32b27cb78dba1a5c77b2d4b8269442df723c9129fb762c347795cbfd24b3bfff0bc05cfe1b5e01afc0104c4d9fbef2a45c75fa918ca8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/487deb88a57dc3cabdf497fe30220136e593d23d",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c45000000002883818660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d100000000f7bd9f9f0118376100000000001600149d38710eb90e420b159c7a9263994c88e6810bc75b020000\", \"prevouts\": [\"6076550000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\", \"c041120000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"477d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361659200379fe61c8b5eb790a44eee46ca3c7c7a86d8d14f6da8b993c764b3aaf47adf318628644459e7d8d4ba81b7833f70746497cdf0fced2937ab961dc2be46657009e9173c5ef8826379cea4b8c999e3ae37a5805e4cc6da117a3d2ee0eec\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d5c45d46d04b15e6ce2ec10bbcc0e8edf35633863cef84b3ede2af6eac197731af5253a3ae898682e613588786a672ae77746787ad628dd74364be19bb5242936657009e9173c5ef8826379cea4b8c999e3ae37a5805e4cc6da117a3d2ee0eec\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/48a74bc4e405cef7fd774039eb79bdfaeafeea6b",
    "content": "{\"tx\": \"2fa783c901dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf7010000002889a1aa03e5041f0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796bc000000\", \"prevouts\": [\"fe29210000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_e5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0df3e4ccb04abe113a16997829890435cf4080e0da36fe75ff9e8c9a2098101b3318f60a1e36abe4c4f9cafd095f3f3c083f506b7bad766eadcd21d9fdf63e2081\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0d9c9acbf56db53388b66c59513222528675d5d7d81475c655877fd04fe00675bc89543f2d1aeb04da715be1ee6c7d5de4b4ef67e3521322647de18fe29dbfb1e5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/48aba9a0a8d38583f02db4ffbfe46b11affd2459",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cde000000009f5d27808bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d201000000283e3bd98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42700000000da52b0940417c3c800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e52a3644\", \"prevouts\": [\"6fb15200000000001653142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"55f23f000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\", \"a8d8370000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"09538187137f32ace2930d2911fe4e69cb81e2d6cf9d93ba927edd3d795fd0bc31fb8767ac49f0dc96b05675635124546f959376cf867517b6eb37681f27883c\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/48ba4204d31335006c77c0a0c393c5424c5c89fd",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1a00000000fcf1cbccdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca4000000005c8d71ea02dd33db00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a69c733a34\", \"prevouts\": [\"bd928000000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\", \"adff5c000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"4730440220446c1176deb9a74e6522ef0c3260bef36aa5b8b9df80bb648482b35f4fe4ea2a02207f75fd0de7e84b77cab8c275e6d4a00f68e108ef84d2e194961c45e5f118a6f901004c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022004dcccbf9b8dbbf6870669aa306086fa649fec5b0f66a16d000084501e14ee6f022043eb9c6c2c26cfef35efd30a0e0da2e86a46c67114375e111fe17d0baac21e9d0101014c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/48bb02ef59af281b015aba26344a918d3e949c98",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd401000000c607a19edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc70000000014b61f7a0255067f000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc783000000\", \"prevouts\": [\"a10d260000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"1c935b00000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100d9cc1260c7352652a2effe8a3455a2a83f456ff83dca9efd3f638a0da6683fa0022009ccaa4281d1ed02854c7dda662a6a3cea157e67f3d452d5d30e4fceb000b7aa81\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022073f273b579378c36efe55e9015e3b7a6154e8fc038472f618ca4214e178e8e6802205d004726202f168eb0fc2fea1d2f6dc130e459280d6067589fae6b2d0b4e262b81\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4907d4a7edab4d2d57ded00e95a654d47f9d823b",
    "content": "{\"tx\": \"c5f01f0f028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d50000000053b9fe8c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ea00000000961af2b201963241000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a653040000\", \"prevouts\": [\"1b69330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5a393e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_9d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"02e5d1da73ca87ac166454b9542ee7450b2e2f0adc84a09e0b7b670942a86cffabf3a960bcdca481a8ec476265849fa865daefed46452eb7ee3605aa1c6c12df81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"769d0599c3383468ea37dac9ec9ab3ceb4d0b3594a956c65fc845ff1b0de01f5ed8c3d56f73f891524663cefbf18b67f2b6fd279c13072d787630c34541e25e79d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/491492c2f48c07bca9ef88c9fd36bbd272563b73",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2800000000ffe4807d60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705201000000dbb069df02474e31000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7bdf76d22\", \"prevouts\": [\"1acc2000000000002351212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"f970120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_46\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c8a6fe54273bf9a667aa0a75d690f199de72bc771fad53250c17629e9888a392d668f25c37a353140bbe462503f85899f1e6b9f38a472e10d13e052f75864e10\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"36d2fa472f06d1d67c5bf8516403f19c64bb670885d335265607ee55d098d2575ab678a0fae7eb1b5ea75de3340079099e92b633bef7b66392b6ba4fafdb9e6b46\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/494a7c765d815e6adc6d4e66a57225322bccde6b",
    "content": "{\"tx\": \"3df0c2550260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704d010000006102a8938bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41302000000e3c820940116cc37000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478714020000\", \"prevouts\": [\"5eaf0e0000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\", \"39193c00000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ca4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb460e4b742334a3ba05c34377629280dcb4ee1c5981341754674382732961bb035dc18898993c284d2f731b7495cb62c60e8571430965d040562487638e1f1fd248a698426442c951e7251e4e87784c9556d503d37bf6168d5559e89d6402ee5a2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52ca\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362f6cae3bfd98fc5a984de3df319deccf414966302f09ea14347630e5855742cc8eba4e75ed92f6e82baf0cd6101dcd67879c020ab703e3dac001fd69a24240ecc7034c4ece6ceffdf067bd97d8bd2a80e986f14e8b5dca33ff1523eba7a77d63\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/496ed2b73e932787fe91d418b240c466ab6a4075",
    "content": "{\"tx\": \"15915fbf0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709900000000fb88b9dc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47d000000000fa7e7b903fc313e0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875b000000\", \"prevouts\": [\"55970f0000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\", \"ca62310000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93621b43ffe028ee9d7bfea2cc09a76d3908c6fc6c62f09d6722d68ca530544f92fb79b88164a8f67b1298a482dda9483af1363bdf02371c7e121a2c285843f3f1e449280c515e7ef393424f0dc01282cb8b28e26e76822dbd41f29cf7fcf3ef3a2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ee5a0294560109b8131d2c42cefe472f9b95bf0b422f14b3dda035051434b22e7387e8fdb6e1953b8492ce494f93b549856be52be3e0b2251aade3a72c8c2c0db79b88164a8f67b1298a482dda9483af1363bdf02371c7e121a2c285843f3f1e449280c515e7ef393424f0dc01282cb8b28e26e76822dbd41f29cf7fcf3ef3a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/496f687a93323cea34ef1249059c862f9397c645",
    "content": "{\"tx\": \"c830ab1802dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c16000000003360f5e8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c650100000012a15abe03ce9c99000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb5020000\", \"prevouts\": [\"be9747000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"7bc35300000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ad2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360f369a784a8897def013640f6b83ddd8e7b013fb685e4cb805a2938f63414ccb99aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb45d26c3c7079b274e62542512e39807ee92511541c708e3b51bc61366b8def992ef429df53f77997a088ac7849be23d2367c05dc96029904e93835fc046c3c5b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93649f82d663a1e447420f2cf05179af13964281439b8b427a6cb4b09af5b0cc1919d9c6e51540aa9a09fa82ae61189b3f4badb16bfd2877ff7bde730e5687247de05f27aeb1527a9572d42a0ad2bcfbe2bc67b36cc3101a74fc3488cf03d6f1bd0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/499184ec78a677697ab3ce5b0a87dfbb5ecce65e",
    "content": "{\"tx\": \"ea9513f50360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e500000000325a22e960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127099010000008f727e8160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b0010000007ad921c20200f131000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e789000000\", \"prevouts\": [\"e680120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"519e10000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\", \"67ba1000000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_bd\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"be991662c79405c44c84daf3d0637966754207abe3b78e1e951955a225853c8254ab8f912032fa2fc2eecef1cc456b3d627d082a97b8a31438045ae7e4c4fa6301\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3324cbbfdf7f4456c9a027d935076ad0f74d7b6d947a7fd7868e9e81f1eafa0f7e13a3a1b8d399354f048c99db1b699f360cf927d62226504785d303869b6e9dbd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/499f8c99044f5a7eb9940853f276e5ed7a9894f3",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700100000000d4506fd8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0100000000c19213868bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4df01000000e0a85df0028455cb00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acece8b33d\", \"prevouts\": [\"2e421200000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"1de97d000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"8ed73d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_5e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d2e866302eeed47d01f0d71c41372587d156c5717f40b41c9d0ccce3a2a242efce91c199d20a8de8244a25d3351c04f395104d6e6ff5e8180e5e98c8f1b624a482\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"78c695559095f0aeff271e86a5569ca642207a7289216004d23149426003338b4ff248ea940076ffa758606d04ffb6f7268a8c94d2cbbfcf718594472b1d3ae55e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4a015d179a6415548a65aa75d68b1927fe2b0738",
    "content": "{\"tx\": \"a54aff3a03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf37010000008bb7459d60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702700000000a6f955b3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b590000000057ec95af02d213ac00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df9797223689873f816d5e\", \"prevouts\": [\"87ab7b0000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\", \"d308130000000000225120efe1fa8c8643b06748235620ecfbc876727366244fc928e9c2000087b14324f1\", \"17ff1e00000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93645c60550b35bd9d705a4e6aa4d32c67750084623e9a280cf31189ad299fac6e7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a17616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4a46cdc5c3a288a4eead1245fd3b0bfea974ea21",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707800000000d472c2ff8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47e00000000b22608f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbb000000007c5fb0ca0254669200000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8e01af3b\", \"prevouts\": [\"ab600e0000000000225120a2c28b736583e5896e4a53bfde129100bff930ada42454ee2f7bef5a60a371d8\", \"deef37000000000017a914c7d65cb5025eac8b5bf295baac9287994ab34b9b87\", \"28374e00000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360df6be8a46bd533a7a93e37944fe1fe70edab0d92eef636eb3f909ab0fae0ce898751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d56e427c91532996b84ed2c37f8a26be8637de11530a49bfc255181ba6103e3464915bb1b7e7b983dc2170cc97c5c6d5436afb034e74288517b9fa4d2c2ab63870\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93669ad745ec8c5686e271a78eda1c132d24041cdcc23e8fee83101a0367275b2af99aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4572db529171a47fc33c2e4ee960be7fb9400c27bdb6fae7dcdae272f7c7daab09b045cee6f1e54629d213b8dbfcd9de8aba2dd7f34fe21c75d81b8576e463c6b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4a729815cf7a0f3947cdf502e425da1b2392d6b8",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c98010000002f66bab2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9901000000f66711d4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf84000000001a4b64da03373c3901000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac8e020000\", \"prevouts\": [\"d1295e000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"7c9879000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\", \"e9a063000000000021541f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"3b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08246c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fafc7fa9328de6285e10958c6b3d6f5d3c073b4c582e31cb42904dcf82d4bed78a29f15cefa9911251712bcf83078e1db490f7db40c14a26e0e577f39f7cfaf11f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93695b1ebd19a72b38f1278a5ef71d649a792e7e469dc9bf05369ce582ee090883f9a1daf2fbdc5eba8a219f1f8635fe45cf0e30925345452464a53096773d109ba7ef84fce916674b46359d0327d7b56c183d26d6053da1b16053a1f90da8a1d4e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4a7e2f54a225b7edfc7761d52940b39a3702b9d8",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7501000000e6d878d9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3f01000000a46d7fa2018ab5160000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7e2c51b57\", \"prevouts\": [\"edec250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"902024000000000022512068a70acb8902a9bd7a8a0bf24e1b522fed50855c0b1040069930cd3d961acf32\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_5d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"70374e2003fcb3638b453dafe36f1386d0a1b71f9bab5e82cd7cfc7925c159be17ce35bccf4191fedbcd84c08eed2681804fb8a09d742d11de2ff214f7860ba102\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e1192e7df04cc54143c59d2e435000fd068852d9f7b6b45c9577117068119ea02e0e1d8e2566b8e0a0e52db261f0cb485d08fc222b1ac08d8b067a91f4a9e5f65d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4a8d82dfb1750aa99deb48b58f8c91a30cc703b0",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700001000000f3c0e6a660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707d0100000038f3cdae03080d1e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc63000000\", \"prevouts\": [\"aeae0e00000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"dbf0110000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063f368\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363c3687187a66b80fafb5b0277cf05dfcb566c0733f5897c37ccf352960211e89b9cd72275efe6b477d9cf0b54cc21959221ed58300fa90def59e56d53bf5ae178c03caa221836b2e776996c8fa4c69c403af6889ee9c99c5c1fa82cf4b3a1b61\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51a6e9c603f7f99515daebfc2839154302ca67407333b540c062b355b85f19a07ff2a2968b4ea0558d79f1ec3cd2b8a530982c6b5ad0be17180e93d11bc09903133cace0aa47e1a0afcba116b3dffe01d164ab3e15a9a2b15599aaabc05c638667\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4ab1d0f5d83d7343f225dc40c2a3a9940dbe3f7c",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c413000000006d7c0687bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0c02000000532d33930418b6b700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc996e2420\", \"prevouts\": [\"69f4340000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\", \"b9e8840000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"da4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368d5de9338381cd304b2738c8b1f6fa31d15bcfc9fae7d40af04401c68f4d5de3473df9812949ea11fa7cd8f7a31f5257bc4998fae53c5743d03c7cfeceae664b355d713f01682c54eefc137cacda341f8a928ca67657dd1895f9a847e54f584f6ad20bb4e3465af36c086d3f45ee510bb6828f8cbf764ea9958c57f38670043d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52da\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004544455204ada9566561196f14caee307d16123ffe4b49d60aeadbae3e053e0a80355d713f01682c54eefc137cacda341f8a928ca67657dd1895f9a847e54f584f6ad20bb4e3465af36c086d3f45ee510bb6828f8cbf764ea9958c57f38670043d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4ab5fb6756c937560dc91ad579231800bcb605f0",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4600000000ece899acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6b00000000d1ceccb003347ea4000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e754000000\", \"prevouts\": [\"de454a00000000001655142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"7c0a5c0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5a0974d832729731c41798c33c7a1c0300be4dff93f440d652a3257fbb5da0e4e77fd5c4c8be4c487baeaf32f951980eb2ab4372177d3bd01d49de2560a2e8b7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4ab75e6d0cbfec5617026ca0e5622cb4be8d69ea",
    "content": "{\"tx\": \"d2c4031102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe40100000010467ce9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9901000000770146d6038921dd000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac0b000000\", \"prevouts\": [\"11f6810000000000225120b52a77e37c1fa9b4a7b934796858277b8dc346396dc90993eb725a9563cf0842\", \"b9f75c00000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090263ae34b455e59724eb6ef57cb0e0123d910934fea3aa0270c9aa1b955a5eb73c6c8a169af2b4646004f9e69faf0e3f03f3151659b6d62a8435c55dab98c6ab3fd86fd69a2c9c4a5fb16dabce31351840564b2becc9f94c7c594240c37f787a1dae71bc58f1349ce3f460f2d1f507caffbca0bc680eb90552b2d0bb87d8f7117759f8c427c6a3a29b7e241b5f53f84a08036e15db3b5ed6c5da0990475968169b6e02036bdff3a4f8300b7d9b259f39a19b554fb2e009ea4cfd28b2fc02b563676510c3e6be086962d3940fea09719b9b655196c6bb5ebe208a8b02c2ffb8c596d7f5755b5ff4f417a32a2348323eb2032d1e08c954808ce80acaff7ae0f7829a13ec60a31a1ddfab6ab817ae6f8ed42f8b2d0262152aceb218b16f795c1473de264a50c12c48c36e7c49527616e71d5cbf6cdd88c881523a403425f1a44a1aa97e7b4fc58b0135cb52452803453c243d89934e02b8dfe9ea01387a7c6d0dd0fbd96c5c2dfc358f911cc5336b4de088ac0325f6f4fcf2d4fa9f9fd40318a642f3d154b2754ff200ce1943395e8dedb1b21af62e0e69f647691ae305bc2a2be53bd175361a8451596ca5b3b73e07b06cf6d3a59cf935afbba4134e4af8a75dcfad9a97fe611d303612a0f76439285b7903ea30dd16f1c53e98513c0aad1ed98e167726e37dbc4a173386642dc265a3ee677051f6028e9fce64ae14a1e5c5f03894080ee7352d72ec477475\", \"b87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bc4cb601b2ff3e4c8eb7bf71eef003c1241e07142df84ef0b259f821b2a43f68ab6940ee0f3b13da6463e2f516d6c168d9c5d733b385f1180629b82031abf4ccad8c3985a8e2539d42260561cfa7167d8724d0e4cbcfaa47665e96933724a3d86960f5e71abb11fb1594f725adbdd26a9f61c928558a58ca58d11d05eb565d16\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090299d45006867b98eec01e1bfa2ead1933035d70a408fbebc560c94fdbed6390098932fc1a21be0ee96c3dd621378d91ae870f2de932098d60568ed8cc613e2cbe3d9925a67ab7686157f2138fc18a286211c949e6024ef952d533a19af2b09b823679c96550c845a56e52d75c6556994db6589e9bfa0b259aae06437f510049489e528ddbd35e36fd1cdabca57af51e350c3a5d9c71bf30ae28ca04f0004bf4170b613428a653a26551337bfba63f98e387b59b513b407f4fb6ecc3a86f97f16439ed22a2fe8eac7a8262325ca83bc07efb982c7308508c13d96fba61a65fd0d1c56a69bc21faff7c695d03b03b77f0e1ab6fc4ee0cd892735f0ceabd4d99a7b78ea803b0a3595c912598b738456bd953d3c546ebef357b50b933d1f58af1f46330419637e710d6c3ebbb64bf3eb9abfeefc1b81b85466d4c1139e845d84bf0dfbc933fecc7a933038bd6b9307ab44993d5696b7f7d07e0504cc63535f6fa13905cc67a1cba58a4ef23b0bf13fc0bf1e9095c2c1c16b7ee013fffecdbf3537702a566b575cd164d76786b72e7c31200b105c12ef52e90a04e58e36d681282de2b43f3b7db892c7e3941a890a33520283f27c5f2aed23babac38c5bace95ff98f3636204016a3e36e0efad68a4fc00a94833bf6d693d71d34855b1c135e16f9548c7f9e33d6cbcac9bff8cf88643d01815cc6402bf1d5443aa9ecb6f32be71b3290c3c35b786342199f875\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365e2e8335e76e899befc23e40fb6f9c6307bfd84edbd8f2adc0fb5ac8d6288970ad8c3985a8e2539d42260561cfa7167d8724d0e4cbcfaa47665e96933724a3d86960f5e71abb11fb1594f725adbdd26a9f61c928558a58ca58d11d05eb565d16\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4aef881f37b09a5f41876628452dac08c70a5c3e",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1402000000ff7187b9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8600000000e2bd2fabdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b54000000005614c499012d9a5900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388aca876a75f\", \"prevouts\": [\"cc547700000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"b4db27000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\", \"aafc28000000000022512008ff927e8178e20f38298d934a97845982dc7c5901b7d815cf7926413ad6b4c2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"557d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2a116e3d98c0753c1b4fce835beb402fe845fa277dc01c5b4ae7ac2a0861d05e2d0ae3a8a51f8512ed3183c6b189898e3d13807be8720838a97bd7135cdf46e7da77d1c2cfbe9569ee5db2c51580a9857624040db9177af617be0771cc5b8a1b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082cf2f607c60f6c156b7df40b9550df6641a796550f01570d3040f84cea15217bcf33eaf0e0e2046a2b327db0183a88d397c5be0a86c812e98815a20f9da9843a2a4c5d50721208c85113b157b4dd4688510f63bd33d4c90ece0d9e0afcb8224b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4af1e59e48ecbb8bcf5f8c2a739ffe2d47054b4a",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5d000000006fb370c1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa501000000e51bbcae03ddc2c000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc7ee3e34d\", \"prevouts\": [\"52205d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6c5565000000000017a914ca8d66b8079fd8386ff3ae1d10b869f5605e693b87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_a9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f2c034aae270d3ab92348aec07cc220b325344dd915672c5c288a0d3fd433fbecfac0da44c094be3e305e1c1ea78680b37dde07a3c9b401d91d05f8e63ad03d203\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"cb41401717f090464cf6d9fab9b14c5004c8dace3497baaf46531a844a764a3cfdc5cf3d2e7f2a77e7bb300ac4a24ec23b38fc06598f259be7ec15ece228a8c5a9\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4b22e5ee8f595d1440ed41006d8e611da06d0c13",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708100000000b5ce03e0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6f0000000017b9b5cd04deb385000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87ead3593a\", \"prevouts\": [\"0888110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1a5f760000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a81\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364125f1cbae1c36a714ee021fd4164bcdcce073dab8e1136386d2993f5734f22399aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb419c228cb7ae814d70beabdb725e2cb3ba4f8af3a16648b1300fc97d27ac433c5da9670c383f4b71f5a22d48df0589bd68dfe195935a65f1aeaa80f10f8ca6973\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d650279aec7c7c5fe6d77189aeacda2bfbbc50f6f488fcb7bb6e3e093d2538718137b75632fc8469b6d274d74e13d397486217d72038875bba282e5d91314c39823c6bcc0c06b1ccedd8f3302fb965778bf11fdbd4830d29cbc62f32a77240ccdb938e1cb9dba9647cc0512f82c526c8f6107930613b31200f04f80acff8889\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4b537d79f1a6255185126b99325e3917dfdc7885",
    "content": "{\"tx\": \"0996bdbc02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4201000000c4343cea8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46c010000005a7cd0e60191ac45000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48701283e59\", \"prevouts\": [\"1283730000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\", \"21743a000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"947d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e46c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa7085091e7b587d9e3d903161356c0634077d7e43e5aac1c0c25d5c3c805eac670235be472b05f11e998cd7dc8896eb16b23bac01933cdabddca8bd45937e3454\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936417d2d865202d20eebfd4aacf46381b0ece3fddc39ce14b62446cc40f8d1090e3ee723c85209fe64e13625f9e221aa1a5a0132ad156eaddb44490f9df3bced660235be472b05f11e998cd7dc8896eb16b23bac01933cdabddca8bd45937e3454\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4b57985dbb3b797fd0788cfb9513abc07ddad003",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4a0100000084436a61bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc500000000b28535d6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd2010000007e9916a503f4c94f01000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e77c000000\", \"prevouts\": [\"f56e7400000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\", \"259f7f0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"acbf5e0000000000215c1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"426430db3dc77ef08364b380c829f036f13d04383c75a0522b3440f4853d948e3eede99181d53675ad93374bc8c69a4162a18d7ebf7f1080a8b3d21b8a55195a\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4b72ce01f999a32aedc950dd1804a8795ff98723",
    "content": "{\"tx\": \"47c0016f0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700301000000248adfaddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca601000000923ad6d7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb500000000bc64099104f8507b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72f050000\", \"prevouts\": [\"71151300000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"c3c7480000000000235c212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"db32210000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902718b1505bf73d8addb5f3c865c6ff14615556e200844aa8308c1fb610a0c09142a1ab31a38b5db43c100771565e3933f6bc6c3b7ee47f119f8dfdc0bf349552c3df18ee788d4eb0366bb8254555092289bcb8383cff15dcbc97d4e655719d5d8952e5ea5d42a45b5ae81820df54447b50423b6e1f71de4c7de9318720d6d85cb8cb4503a13ad35b58dd441107fff3eb51aea69a6699ce7c8793e8a16912e28bdc9a45cebef1a767c12163278116c0a956fdd4794da6a0915390afb0c91360614a389ab80b877d87a70c92fc526e0a6b191a3d0c83e74d4846e8102f06ebfa69f3fbd49be938a387433d000e3fc1385c06bd14ad69b6d29f60d2e8c190972e0fd39858fc7b097ed0efcdab96d17f8aef43660c9630e596f781826060c8f5342fbd810e176b5513fb77f63ffd1e2b050a19f81043394bb613299cbdc59e8f8cd86da92bb529fadb64e0bc9807c58ca4cde44f8d709d3b7b751060dd59c9ba279c224e9082123109741413277a4f7d1ce9aa184c51e35b3966352616ab9bfd3e9b064a81949a1391c2703b86069bb8171280269146e3eff413ab96c9c2d9b74bff2f5f9facf5e325286511c7eda3aa28f1652598597160c203edc65a110d1d23608603ff6307e3aa5724a6122a28cee8de245cb6aaf1fe476cdf64538950301b638886d511ec3e69da6898e5b615c0e30108fd83b4705441f68c5ad2ee33b50166ec7b6f0d987f6014f8f75fa\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e15d4b392b2e4c368022144328e009ed21ebc6df76a38c37cd5c7ada1ffb4033c71a4e7a29e9a68a1d6e5ccf500c3bde1b862f2704e441e939992f2bf5a528056a3bc3f3b627616b9f836af78c18ce00964f5f9dce3e851898685189c72823645e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09024a1d8b6f52c9bf374a22198b10c849f2de4d02124a70757da8118207f01855e57d43b5c69ea657cbf97743e20d0c7e15a72d102f193347c99ce69cd2e3b2b62d7f9524084ef1474ccc699b24a570f67ed33e6238f845c1a79bba1d55cf052dbdb18c6f776cb53faff034a7437dadbbb3d439344767afb2ca48aadb91892c791c7fdbf2a6d4012136d89179c6ff414a6a25e70568f904a527a2baafe467da4baae935ea62b03a492362877bf05f31a444c10ec34b665e3fa6591c4d7ce2b5df836da341bb9aa43fc680439dcef77420745e1eaca54bbd7d27784e28eee7880c77ab194ee4cd940901043daaf9df337a114efc4bd9989c0ee1979b5a8da4e84f0d9b7d457ca971693bad96ffc69ae3928920fd49d93f2686f5a46ae61d8cedc35e57f38f15d35657a8ab2c0af8f4da24faeaa47ade426fac41208de9cea4404ab8001e9cdd54ad7dceae4dd26efea0ecaf8242fcc549d514c99372feffa7805a49afd9447bb2f8ab0658f15f43bac176dae56a7e083fbbe2c77e2d26a3f8dc77a58ed0f70e3d965fa14824856e219e2aff02d967f999d7447e57780bbc4fd4e96032d903bebd5a807a3500a043ff6edead27d70a316dbb6d5f6f439f3e45935f39e56ac5391fab364d9109dbd88c6a0e466dbf08a5a1f416eb5ac7b7050ca7398ab259ec417cd8a2eff19076c0b8a54166e51852738ce5b9ce31df6e9a045eab0178ca9005bde051257b7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368e1d4621f5a2467af09fb339d917c3eaebf29ad88777f17d5401e6cf398d8d98319d91594da7fa35d5ac76c3396b108bc28aa6233c389d8680e4f0461963fe656f5053dc49cb92d20c30fe5ab09c589302aa9886b9c794d18405aff33121a169\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4b7e7a47d519d00fb5bb9332b6fb49586a4134f8",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c452000000003b7dd6d08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41501000000cf2ca79e04c0e7650000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e702dfca59\", \"prevouts\": [\"4fb5330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9b2335000000000017a914a7d99db8790799e567017bcc9951f7f968dba70f87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2356212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"690731b1a0b6814b8fc7d32847d22e69a3fe5726ee1041af6d03555929f7f434924ac9287832f7b0151492da04fc8589593afba56b6c174e03cfc7bb8bb9d9a9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4b8ea927af2611b4cf7fbab90c9f8ffb8bea3ab2",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfff0100000064056d8d60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700201000000167321d8034e0186000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb31b4546\", \"prevouts\": [\"9f5278000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"368c0f00000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/emptypk/checksigadd\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9ea638a16318d7aead6b38111127507d170b8970edc6285e6b801a42574414a6873ddd68e7e040865548fef0018fda27e5d67a008c68fad6228db4087899f32b\", \"5420871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a034685013eb12d0936a5af43ae0e5638d7148ca8da311dd51cf2e290b05ed820ba5102bbf7fbeec60e292aba2a12d06acbee3d1ff3068be768a5f8ab1c15c8b5f95428243b01e6b613d868e39a3cd6f8053f3b8a58a5b42db19ed132d0fdc37ab205f68d8ec55f68ec14e7908e46173699cdebd091fbaa00eafb7815b9069cba262853dbe467a837dbe26fc7f3ad7cd7a62e462e47b7e1bb60054913e91ba6c655d89a1acb7a851de7428c381ead1ba6d1d417e8b953e51f7c670e3863576c3b88611529e8d8ac178c50676d0c91193955b6fb062740847f08c84da5efc29fd5abdcdd61aefa92e26b138e07522d025d19d1fad7762f9c1f70685829a115613fda528b23fc9436db397402f0e7a3d49cf7a01c31cfb831fc26b2262ab8efbabef6fb95525f08c0ad7b451d163f6e35eb4e415957ac629ef0511fe91c7e5e389d906758caa877012f69cc4f32b8c78b5f62c54ebb03c94d75afc9f0e4835f9336f422423aeb19ed8c37b62b0dd1dc6be563591d9481677ce9900692950fc288a25dd19e02d4685ba017b89767b5c8376f6b66370e3202d9e807c9c5b06b99c098acfa6a9da80a755a207eb5a3ad02b1a2cff248af93ddec122a727b43b9e8dbb8b2911ad5a3c4781fcdc9458446cd8039a7a21ad2b04a0c05bedfec6a225c83df68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"cc9b62c485dc8c1de4ab827a7aa0545e4fbca86323408d5d7aaf066258f4c086044ae1d26566d10568834c6a36cb6134e0c545be7b3cd0970608b0b6326c8f2c\", \"5400ba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368cc4d632c25fb1473ebc2c4691dff712f1529879b16cf6e01c3498b371ad5643f043ba3d030a3b9cb1de0a60e5c22d352c9a6b0167bb0429c65653ad93c6b5ad75df7d692cfa002fbaff39a633e2a3d0c51d8dadcd4fcf0c857fbd83ad169fef2faba22bfc7a47f9e635144f510dd0bf27279d7f381c4c7abb10bfa7caa6f45212b1384dfb83dad558f50952f8dc7a4c93fc05bc0bf8f252596f3f99dcc4aa25ab6fe4c1776346de255528baa11f4624c0da11cd67d3944bc9e3c23527f253a174940966dd57e339c9cd051354c05cad3fffcfa87d89865f388df6a9793fb850795b387e411ef7ecd738a90c270a9e8b41d104f0901d65be980e017742035d2ed5a15550423aeac2e288a32ca51234efdd8592bd1b66a7f846be8561b7af73c90baa320cf1711a17ed2a311e1783897c17c40a4468373563049ba8a82c1cbe704bb8d89f21761581480cc9fb789613a87d31235185f9da4b4384725e898ebf0d2c5eddaeb8557ce0f7cc7880e698091ab104cabb34aeeeb5d0f57ea86d1ebc555dfde575d48d1eaafa8343c63d6f5425984d2425aca274be02e47a5142e089ba2e5262a94fc3ddd3fb5606be458b593782b16d00ce4762d13e98a6ec8488c560f68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4ba2921581f7a3560b6ec87297653fb165ccf969",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf55000000004245bcb4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b17000000009c83f3e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3a01000000932991810400c0e700000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac6fe3af24\", \"prevouts\": [\"3f1c6e00000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\", \"ceaf1e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"75615d00000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cf4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936576dcfbd45e3fc8427f121d4200b68bae14bb12011fb1b2bbae78ffacf19fef2e4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0decf70b79dd1be85a38988f8929e7263abb01bba95965800009381ed351eddb0fa653bf1dd2d82b0dcbd644d98f066b9fc3e48690fe18b2084515352f558033ba\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670be4a0ca57acda4948961859806a1e82ea139c65a64667406163012635ee571197eab9a6b3049015e2aeaa64734336ddd9b9acdec5b1d6588bac0b5808dea8f5f88ccdecf77b0d26ba8d6f3209049de9d03155be73752c3625590c2269e1c4cf4a62e14d7fc4acbfb0196ec29a60565ac2b3043dda4cedec8cb1ff291b90d41\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4ba8a95b0f39aae1daf6e664542420657da72fa0",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1b0000000022e6d7a8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc401000000b2de69fa047e0aa800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acb1040000\", \"prevouts\": [\"39ea810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"2995280000000000225120fd40216dd29fb2eecdff7e4128bba3cfbee632fa2e745a84c0cfcf3475ca43df\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362fa354647588dfee660039a90ed403daafd6a7b1cbb30bd112b49394f93378d2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a1d616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4be8d76134fd3aa72fd3ecc702e88a4530fcab53",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff901000000939dafac8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47c01000000d2c3b2ffdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2801000000052131c304cb62b800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787c6010000\", \"prevouts\": [\"1f9b64000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\", \"1e9b35000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\", \"49a720000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"f6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1c75ad5b0c19c64f5d3a7fdf07b71b1a8f8b99e999958fe2a8fbfcbf733553f9475ca33d7e1e5f2997f74dd285eec8a0e5cba5080c4482d5b595e9662ee4b93be0a1b6150087d660153f154c744da46b7319b80aea4f8e08f23015968f3b1d87a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367d0d894f81359a419367fc8ac631148e3eadd39a7159e1d5f784b52cce329de7bc80a3081e946651089c17942e2d2b7e0a2ba8b51162f8e9c4f29cb18d1603310a1b6150087d660153f154c744da46b7319b80aea4f8e08f23015968f3b1d87a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4c0186fb62257335535a95ddfc34807b1f836154",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9f01000000d913cab760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127007010000005f0436fa04d7bb8800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac46000000\", \"prevouts\": [\"c4ba7b00000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\", \"ef5f0f000000000017a914b1a54d09172ecbb89289f2a670acc3fe14ced9ee87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"21531f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"315c9a851d47e522491de1c1ba5d5322a5df750b02611d4cb50ed7000beb732301bc0bc1e59598d7fec28d19249cd55c8f6b8b2ee5a8a9abc8e53766e9e84962\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4c0a1b11b6e6b7691c115aa09cd92e8ee09a5076",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270dd0100000032bd211460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ae01000000ce12f710049bb81c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac34000000\", \"prevouts\": [\"bfb20e000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"9019100000000000165b142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a80286c58cbba2a57fb9b12a69a1841fc8a004e55302942795623103064cf9df0bdc2cfb102452c2a967c53504e9f9addd5f12bd635e8916083c12ec4bd01272c5eaa403f04c1051faebec20966ebe5a50352787073e7fb641e803eb34274f377517bafc24f597fa892a812af569f52d348c8d80cfa868d4eda235b04a983d3adfa470b7205d09bc3586dd6ee4d40e7bd04bded8747cad31bd2e83b1a28fd9453bf701c8b8dc5805234951ce989e309297c94893a9e6acd795c98ad6e618f844ff340e799251d0ed815a57e791c4643e3037c7ffc984a6ba839546f9d1e388d7eab0b0c88a5cf0804c7edc55e13a3add41ed3295857559e43910b7b1ca971061d4dcbf865e1736e4c57eea3bf11c89053e17121a2586624f736cc1bcaf54b293a15eee0e8e0994fb1f5513ef9448ce4c50fac6b384486a6794ad8b8ff952d36f46de70cf2811766de3a0b9b05e346714593ef1c11080a2606c90f1f82dd5103aa4dae7cc403a77b1342f9fb737615956d0edd03b686cf26d81292f46d485ead33774ed1f56c1a3a09729aa1a942588061f4287ee08b8d1a8b7ac13a130f5ab519b9787c2a0685743af16dc0d05b19bfb1cf08084ac1b6586279b9a47d25497ae77a4fa7c14ed55d27a2707fead97c4536754ba7b7b625726c8876a060181ce44591099fcd240d9fc022e90310827e64b4101e2e06676a3f0c9d7123f13232cdefb7701f761df0a8d0d75\", \"797d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8b1663b8b45656caee420ee834d80103f5ad80f9c4de199ff6879db0155217f4eccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f45727aec9530f4cf05d3554e63105b96634da39f3c52c35c251ce860693e97320b3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090212f43ba80991e1c133077a9dbcef510636b40dc18c86830747725cb0f2fcdb6e39f6900e2e51c8f2e03a61c54e1307649458fd09074d5a564fa734d82876731e7fb23a07745f07cc8ccd22f79496f687fbc56738125a1c260908da013cd7aa69dd5fd80561ecd5caf4b99246b80d46c615200c400ca0d15e4a20fadd25e484c9cff13cca6f77f839e42931f32d371be0cb298f6e4a98ff9cc387695e8933bac89a59e1695cb219c12a6aff5b097d6f6dc9c2984d3ffc72a9ccd4acbd93d66c6ca9153f8d352f84715e5fb38c697cfcb9a1d77209d4162483182159b37a4fc48c147bf352c3f72cb13027495d899fff5e91113ac9b92ac95fbbc308c18b77ea646750735016c7c657aa27c01716570c5a37df176b4ae105ffaefb3a12744c966ddf459af3dae74364cea80b6bc31d42e3c534e5eee5f2e96563f576b59c13d0e2c3daf7babd412918e035fa4d2c7b05d69789897fce70b35a3cb0cc40f14869c4a691572397b8203b47d859356b266bce4ba19ddca7f9ba1de207e0d19b89f9ccb119f91f98553139b7e5f974002107d648f12ddc662208884ac6fad53940289be8b236e62c5200c54a1592c568e61f98e4f202b58574524f23b13c57451a0af784f0ec06933be63fbc48e718912186a5402fcc375dec7670382924dc2ff493e26c50b2dd32522ee89a2d596e30013d3cb1812ecef3192d5daeeb136ab59614722b82a5e98d0974219275\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e6301af72c0f0fcbfc62431a82320b93fda30ebabe1c669499e3cf52b4dc2b40fe711fb6ebac21c15598dc6feca0613664d86278cc532834585097123290bb3d45be39dc57762be2d9b1a04aa5b570805d23104bfe4fa54c392bda5d51f7f4540\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4c117e356638d628e5b841bc413e67c8bbf10384",
    "content": "{\"tx\": \"0a67d5d202bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf03020000001e51faa7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7e0100000001bfdca8034512b7000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac9d83214c\", \"prevouts\": [\"bb446500000000002251209884719338e1397826c7fc76b57dc9070e1ae6721fe0f4052d3f32cbc4476e6a\", \"857d5300000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"fd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d55b1ed4b01a6cd7629ecd20d44fed4dc17055f878d3dfd1e02408408b3c8ea2ebdb1eebdcbd8002197b9f44a9e59d0e9024523da319a2f3d109fa4e426d654ff4148296d57de26c46202ca6ca2132af69ac5e2240f6410455c1127b810a8937\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93622db97bf80631dfdf531579b6ec0d52fa26ef63a3bea7b809a4ece9c352aba3e4304fc86dd976b0937fa56c41f386d806abfef37789b2eae5a350cc5f24e0b07f4148296d57de26c46202ca6ca2132af69ac5e2240f6410455c1127b810a8937\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4c2d2d7bdc708a582093d11d189f7addae41c5b4",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdb00000000b104fec5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b15000000008f74357a0431b5990000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987d7010000\", \"prevouts\": [\"94b37700000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"04d82400000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_cs_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a25721145276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c43931c0252ef35eed0164ab7b1b9c14130759b9113fce27ace9dfe7a45f145b3707d661b15108aed4b252dfdc2d8a8aaa002440096f77bed5f253495387a1\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a25721145276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4c66ad58c30b6404b73490df6a7aabdb4eb995b2",
    "content": "{\"tx\": \"c07ee00c0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270200200000062d802d1dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cef00000000fd6645bddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3b01000000fb6fb2d2013a6d4300000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac24ec9a3a\", \"prevouts\": [\"db2511000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\", \"86f3560000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"946057000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936791463836b54b358dc53f27671fdab223563276614e8972ade3f121fa536a5dd4639ba4332756735e08e9dd0c9395e600a8a67669bda3acb22644b013566df80a9fad2668c863ea9bd6dd9197c1c49c61c2b9d7888bac8bf6fef03fc3ace0a5a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f01d0d256ad0d229e53661481dce388404558ec2529e0bc1d85e0261a585159aa9fad2668c863ea9bd6dd9197c1c49c61c2b9d7888bac8bf6fef03fc3ace0a5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4c749139f91d4268578b998b4fc4742cfa968495",
    "content": "{\"tx\": \"ac7f65d102dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0c010000004de5a7fabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9200000000f76d37d202d679b6000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e1000000\", \"prevouts\": [\"25c3510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"397a660000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_b6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1aeb72305fff2e0596cac4c211ee8a821cc9e9d71be1d3e091c05f335b51c6933ff8e974f70e13dff4fb48ea6bed4b2b8da1d7a4e34aa22a4cd7df27a413254201\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f5fc6f58d98f38f1438f26533faca52aee64f9dc25c7246f0356a0f71e8507d031fa6930653073620664d566bdcc9e1226aee7680aec3399c5e61583fe04eb63b6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4c9126df811790be522891686bd1fcd0a7fae560",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf21000000004676830d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41702000000bbb7591260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707600000000094760f703733ebe000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcc56f0646\", \"prevouts\": [\"044877000000000017a914b1a54d09172ecbb89289f2a670acc3fe14ced9ee87\", \"4656390000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\", \"ea96100000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"21531f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"48d22355c0de34fddfd11fb995a3e98c48a4574f5b1786c3527932b6c943da9e5fa6a02efc762df0cbab1d862eeb67ba867934720ad7c1e8aac69368b5386c27\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4cafaf85ab316a592878f9e83a2be01cfcdf738f",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1602000000242acf68dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be400000000ae8b607802db5a4a00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac46000000\", \"prevouts\": [\"b1e125000000000021591f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"55a626000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"2a8b80e8a4f54d2267cf3d402978e8bdf420668ca259624885a6428db47c5d9e5f34f52c8c25435eb0d65ca1a580061a460ead8a38f69365bc452750d37d7f62\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4cb7d23ad1e01a5e42d3c8d927936db03801ab95",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5701000000bcb31209dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7301000000fa266ec5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd8010000005d4ca570010206ad000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d3a8b624\", \"prevouts\": [\"82e721000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\", \"d0211f000000000017a914a5f28fe5532719f979169bfa3a31d5746f69452187\", \"fa38720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100a57375666e23f9777bb1d7f3053dd358a692ac519c36aeec52e51d1ef300e36b022015cc2cdf6d01de7cea07529bb7f0cc6fec832768b289795ee9747b70bbb4121981434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402206b71489933a9cc6a40bc17e90a96b73f46c16d8021b1ab4f9882bf81fe40fe4d02201fa2f81e6e0021d2e593dff95c23ede143a9c4f78121af3328ebcf6783ff5e5f81434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4cff2a8e93a415e0cd8f16313427db2dceea582a",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b23010000000184e7e38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b501000000906251e203788259000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2c010000\", \"prevouts\": [\"41e7200000000000225120b52a77e37c1fa9b4a7b934796858277b8dc346396dc90993eb725a9563cf0842\", \"14703b0000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"b87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac1ca511921a6acb6b52511c7e467c1fdb04a1d5dae2a81dbcc486709376a8609dd12296fcc73680f3617d8f33f0de746e19dcfecb08411ea531ade48d4ab609a0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0825c7be958f18497b82a5f310769c8b8ace0436200d1bb32be05dbac5afb51b7c71ca511921a6acb6b52511c7e467c1fdb04a1d5dae2a81dbcc486709376a8609dd12296fcc73680f3617d8f33f0de746e19dcfecb08411ea531ade48d4ab609a0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4d21f89d57587583f18ad029ffd268e08c6deaed",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c61010000001257accddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c650000000012c97ec6018f237b000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374870b5af43b\", \"prevouts\": [\"bc124f0000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\", \"a21c580000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"e1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1a6ec201a93e79c82aebcb32c5742cba4049490cef67cba707365d2e1379631f73bd198ccbfa9c702c0592bb8c84a948c36ef9eddfd1aec8278a333dab45811656e171838972c3c3a6cdacf031a4825f83b841697bfdf19ec3d087e2c9ca65f0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366f96bfa32a795a0be15451bd7a8acafde79cf5d8ce79cbaf82150de20d1f80e0d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d513070c0d29d47e9fe7be7df27becdaf45cc7da31561e827162b16aa01fe84c4a24f44ecb3bab6b962a7ffa14a2ce082ec551943f33ce508b63a8ee30ee5e49264\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4d2c30084bbdec620ff06379849a52ea2e10b97f",
    "content": "{\"tx\": \"db04e35402dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b79000000000f3aa8f7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6a0100000042e6cff403695068000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d4ac9f56\", \"prevouts\": [\"937e200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"74a7490000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_a2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e9d0ce2741ebf8f3365d05aa4452a7f36e1f34b95fff8a910b459f6a4f00933320a44ec1e9a54516e8862067cd9d0bbf47891320902bf028edb43cdad41927eb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ad6c352c9c549a40d14ec920f77606e7cf01369ac3fce749645bb8f742c344f5e858a5fe628d07a77597fc4aa1abecc0baa5ea13e608d4f1add8d07ae2e578ba2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4d72ed31959a5c8b48c6c9de682cb5364bf0cafe",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44f01000000e8d79ef28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4aa01000000a7c6011a025172760000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df9797223689874bb33631\", \"prevouts\": [\"98d7380000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\", \"af6e4000000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936de087c66081fda9663069b4c8b042046f39088626172b4c1411a7271e0f70433938b5973806e5396d9f6a2ad240022103fc2376d5af9a7129252a47c1a6405aad5a470b8497850c3a230fee464eb343180400453804118582df887251250b2f1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e54b6b787f97e01f22483fa030d88163bddd8804c4bcb1ddbba44b373e5312dad300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51419220fa8a7a918b3857a082d32be9fa2ecc61d36b58eead0239ee9c5d9d4afcd5a470b8497850c3a230fee464eb343180400453804118582df887251250b2f1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4d9a093d9de04fcd9c74eeb3fb252b4f762f048e",
    "content": "{\"tx\": \"a115863c038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48b0100000096e9c4c28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49901000000144124f9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf9010000004abe32e30189092c000000000017a914719f78084af863e000acd618ba76df979722368987dc000000\", \"prevouts\": [\"e7c0370000000000225120975437f6ff12fc45d8ef3d74f3d05cfb35811edf79338d42e1008b4e2cf45094\", \"6ef4350000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\", \"c869260000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369ba4ba1186fc601afa0c557314117fee5cddffb95af3ab27f978a84c6b0c32f2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a94616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4db56aa4ef26d2fbb9c74967c01012f86fb5c60e",
    "content": "{\"tx\": \"20bdf86d02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5a01000000abe94496bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb8000000008c6483c501f95a620000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc21cc5822\", \"prevouts\": [\"e9f97b00000000001655142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"a723680000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7dad6448b4411583ad8d2c2bf818b3c92438e9340c508ee2c4cae7d32a0e655689d8b77e92372bd5c63edbeb50f1ebe16a828c5f28f4cb0b53df526722b611b7\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4dd64e2309c3e9efee2d5404d847b644329d1f7f",
    "content": "{\"tx\": \"0100000003d15657a619affff084fc6b1bc2cdf5e85e399bb207d84ace710aa8effb82232f0000000000378eeb7906f5bd527bde63f7c45daff54c390a64a59dabeafc8078a9bd0a050f54db6b44010000000038906fb3492909e056fa5c0ef2af542be68aba07da39583e95b43e24484150891b1d5323000000000077e0c98802d0235951380000001600146d764276c66fec1127e5074db5bff3aa6c52553358020000000000001976a914b2c48f336848c91e9c274b4615a238e127bb7e2d88ac40000000\", \"prevouts\": [\"24977ad110000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"1ad1d66814000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"14cf091713000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_valid_opsuccess\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5569b5a8669183bbf7a49db9dd9ffb9c4281fda50653a980819e4ca26d199e2f6977de349db0282af31ca1fbe0902025ac9066a24a01a62c320d2d6560605f63\", \"20159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717ac00635068\", \"c0159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f7173cf6535970adc1aa2e2cd04b60847ed9656d715af72d750ffdba18631024451b7902b78fc59ae74800241e9b7a2e0578a35ace37791478c3e04a51e81e708c61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4df3d74d147d4bb7144799be7f96196f44def06d",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf12020000006d57da0d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40d02000000dae2d1f001858c5300000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acca000000\", \"prevouts\": [\"52eb790000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\", \"240d3b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"1d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ea5e09f506d3786832e30b2bdef7e552adbbac598072ee50ea4bccda1394a3023f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08233479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a4bb2c7d85af23cd06361a8d9967d47c0827d7b479cd52e2216fb2d12a2ff38bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fc4cca0131d18d8150e9d666d72698d77b9db3880415ba5ae0e811c11ff8a05c33479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a4bb2c7d85af23cd06361a8d9967d47c0827d7b479cd52e2216fb2d12a2ff38bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4e1c650230dc5d5f622303dbdb697b39acc5953d",
    "content": "{\"tx\": \"fbe4c329028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42000000000fb3c3896bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5a000000001dda1dea04b72eb200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac2d040000\", \"prevouts\": [\"268a3c0000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\", \"fd69770000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08252e804f6a261e09ec86c0fb6e6ff5b26564af7d86f56b1539029a07a3794a04021136d3d9ecdf371b2101a7e86edb56e15b10ef185a8506988239bb2b5a4c43e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936816862a3ca4ec462993bd240f6039fb5376ac85de732ed6933e2ec585e28dd4d65775dfb1ab8912d99abba269b246de78dce1dfa6fdc8b38f44f7be80bcbeb76c308d8e78b0cea59e70bbcac5990a047bb63a968328232757672e5e931dda055\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4e27213b2fb3cbd2c324c9d967eb6837151c512b",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c45000000002883818660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d100000000f7bd9f9f0118376100000000001600149d38710eb90e420b159c7a9263994c88e6810bc75b020000\", \"prevouts\": [\"6076550000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\", \"c041120000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a5f69c5070a670eb4b1f18f2f2ca5111ff00de063a8ffe58727e3dfcc80e4d9921c3bad5225c42c0ecc3da53f98a2c7daf8df9f7b3fb65f74896047d7f1e7bb5619e0bcd71f4d839b5949e01b74e3a38882aeab134d3b043f234bd7c0fb20bd7e397323ba0ced905103554894c438cd3b300a3fd351248bccbe1a84f8e76aa771c90181ab4c7713e81fb73a7f6ea8e1be0dc1257b5b7e392d3d36ac1bebb5778a901db1343b1ab2b6aa3e9287e3e6b4afddec10c20b8032e07812f5cb31d663fe6a7e59820141d992fa653719eae90a72afdd7426e658ffbe75681c3a3601869d7fa15429aec39266115688f130faeb52c86ae4c11fae9e745d70675e434b674ed9ac2b7326ff6fbde3e563764c83495a8878f07eadbd17805479d1f3a0895e0f2fb85995f99ea079949c655955d35c5f8d4ac8ff249ba904b36a2af40c20bb69b18a4705c50ee94c429fee1d48abb6f9c2ebe6c92b329104284b1fde0c19d135cd0748a00a40a256a1fa9a442a27e900c52ee9c9364038779817a8b89a819a3092af96b419d543c9fc125220e8f574c3ee34bfb1a38d5908a735a456ec9b8c8b0319d2483b66e6f6535b39d6de47960fc1c1526ff5086d599cc5f1c33d157f50bade7baadf51f1eb23a046c47edaf735ba7ee786dca7b1febb5289cde4c6828636211b4924d4ca4072e136744ee10ab633925a22bb2d83ea2e050cdf9142161570b68639d0b6e0bb275\", \"167d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e93bd46d889920012fd3d654be778806775b1e6ea0b6836161b66543651907968afd13a3b2c4c421c5355668ae9e4eec8bcb7618363c6e35efd204a43726d22d6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09027c896ed8d46430539ee5555fce2a157a6485859d27de823cf638edb528d3c516cf8bb2daa98e673b6c0c05bdf1a7848a11480f1b7d4385b31f8a268c061ccf50973260095546c2b3bb54b46b44a9f4ebee2504d8ebb2d8e96ecbda2cdca07a30dc9eb7d3c0d6ba5938bbb4d99d19f1e90fc53f77e11bc53c0bc63f64e207bd4f9725bb7af6944d50cbd4707f47f63f99ba045d9e361487ce7d93546646d4a1c83e1aaa4b074683d3cb846e92984dad986f4e7f525e04d84ed01cba48956e1cd8d1dfd686094981750ef846363864e34be8db27965df475178304405cdef9e71b42a30022859e5f98588d73e209ad43196ec31c46232d6c660523b54481c38937099fb046938913a034979bfc758fb81a2e2e29b5710b8964a9aff79e28f455cc58a988cb32767812bf19400fa13a26823ab838a418f1bd8d5068a4fd6d2c9a09ec2fb8edad228ac4685861de436efe4666e6b7bd2957e7701f727a994091500de471d99f70b7225ea1142b982be70140aae8e1321b31f10133dee142cbfbdc1b76160bbca1379db44b6d7cc503f3380808a4444f3bec4145d5dec38305ddee294c540bd404bbb35d501782ba646700f2e3c348c4bba2e93ad1fe51901fc6bccbfd0d8206a632fe12a14f0a4f5db42a042b48fea00608a0fb5c9a70cecdfad7e80209b0c5906dda82369f1dcf521147f0d57664337a11371e7f6fcb0764a7e694c8f4271ffa301d004b75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362ccc651badf627d83c4536dc19a84e418ac77e4d8a40e4afa91bb66f57df18612d231140cd01d0310e585ecf2f38aee8d36f3a935cf5b06765b4319c9202713151e3355b9fad1d20bddcd1a8531bcd58c93c4d9ee4159d68db4e08ecdffbe17e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4e442bf704b5166ed40da217a4f0a6103e117487",
    "content": "{\"tx\": \"ddda8eb9018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41e0100000049486be003053e3000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7968e65065b\", \"prevouts\": [\"d021330000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"4e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366eda255a985f9018ece0f2cdeb0e084c59fd6623beb306595ce95e3d71dbb86b9d8abe9ca6155576d0a7d6ce7b2728ac84476385b9c54c38b8a9cbf195895186ab153920b849b6028620ffd2b7e486a6f5e2411aa058dab621c72a45f67f5d8e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362f5f9e17620b9e5ee117d28ecc81f7c66357561166fee94fa9f70f6d3f1a5605d1fd3f29d710dd7ef94713df6d8e3b931ee02ef1dd830d0dcb285a37875735c080d03cc4210f6c8d536ca11754de7a86c068de81055f4750ba9e0b801f8560f6a4a8046f0466b39966676954eca5d67ee52b1615e6fe46612ea9ab4edfa131fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4e6bb871c5b2e524530d3675221cf34b2e598538",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fe01000000955e53b2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4701000000658363c5011e667c0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e705870958\", \"prevouts\": [\"b6c04200000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"09067000000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"4c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082126001c6c44c6d65a09c6d1b267ed4323a5b88ec68ff3dda19058d2d3d94a32d819d45740b1e9d6e416a8a4978331345395bf058ef0b936b66c7755017d83c65\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d840fd1b4336118158b49a207c7c1265147fcdb5164c3ca7c69b8b407af04dfd126001c6c44c6d65a09c6d1b267ed4323a5b88ec68ff3dda19058d2d3d94a32d819d45740b1e9d6e416a8a4978331345395bf058ef0b936b66c7755017d83c65\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4e7f6d1d5ff623f2b978feb61b0905320a14cea2",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b200000000ea14fb878bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d000000000294766f002728a7600000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87bc010000\", \"prevouts\": [\"72c13d0000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\", \"12c53a0000000000225120a7af56c53f6997dc9f888a8c6887a5f8ee9cb96a9d70fc301f3f9e386ed85991\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b4c2acc3f3dd22048883df4c6ef8926d4d7a863cb2abccf3932c00a61d7b20b7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a91616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4e8673f1a272e7a4846b2b13fd4d6d699de0dd4d",
    "content": "{\"tx\": \"9323717b02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9f01000000a919a7ebdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b380000000000b460fd01079d2e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6da000000\", \"prevouts\": [\"4a23220000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"54912800000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_b5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"be514faad4f3c1d5b1c84ce536f35155e145ae5f45a7dc398aa182c4bbd1c6d6c992b79c2a13682f1442ef3230131f2c5bb67c9ccf42e2373e3d8b88ae45381e81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a636eea579fa3a3a3025ff72706dfff0b95d87a7bf40f0a5b3553671ed021b993faf2a1f7b44b0e8d1174841469e2134d1eb94fec8caa47c7874d235aecf5f57b5\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4e8dce29e5e8dce89954f8535e95a66c4dec52d0",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b76000000005231fa1703f1e32600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487b1392128\", \"prevouts\": [\"0e6b280000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"287d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e780a528759e22c32b672b3582ec3b98210a6d7cdb045b8c2f36dc39043db702a61bc10490c3b13d9c4f63caefcea4aba06d3a92ca8668ebd56c703a638058ee7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ae0185d73b30cde4b6f847d95b0ec77b009b44599f3d33d8be12ed96fb030558462eebfc32d9e48af9ce92e50735d36faef083a1171bd1899835a9be2fa30ea55b4ae3ee914d52223472aa57f653ca8073aef0e7910b2553778e1ae03228475361bc10490c3b13d9c4f63caefcea4aba06d3a92ca8668ebd56c703a638058ee7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4e98f79b12c1bcc786816c990038e187b1881a2b",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8101000000d15525dcdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cac01000000f2c7c6da0498846a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acbf000000\", \"prevouts\": [\"b8cd240000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"6979470000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_f3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"43867394a86759c616af12ad200d02086bbc5efacd7ec261476e75ba65ef99ce80bb987008bd7224c30a4eb00c40c5f9873ec3bf1c0140ca25aaf45edd96285b02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0fba4f1802ebb4446ea3bad58a8f7ef7b26b00af5348d8340103a6716dd120247aed3651d2b9a2b56eee0bd252c1bbbc0abbabae4094dca6d97c11c7b2ad0e82f3\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4ebc10c30a1a1250dc40fd49051eb8cadd3eb677",
    "content": "{\"tx\": \"20bdf86d02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5a01000000abe94496bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb8000000008c6483c501f95a620000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc21cc5822\", \"prevouts\": [\"e9f97b00000000001655142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"a723680000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_a3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9ce4dce770b5f580ab75751e45f91d42e90da09af3e13660dabd5c89e4365a5a8028d4418ac3810f295fe076998c8e86ebad13e00b0db526b76016058196cb6501\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"795ed4081216e0d2fc5dbc1c7e6cd5bdee1cf80bee75bbfe6f4ce03134550c43e1202e0a8a37e2f11b47ecacc9271059cb348399c9f33b7ea7e45a19d7cb3c78a2\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4ed19b212daaac7d9ddf8fbed04bd645b3540c87",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7400000000ed794b8ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2200000000422cea9001bc295b00000000001976a914c629d61df58baceae110d15eb5b55e144268615388acaf970346\", \"prevouts\": [\"1f3653000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\", \"fdbc5a0000000000225120469ff3412c89f5805e53fbb9303c790a98dd32093d40e3b7dfe22bb05f85f37f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"304402205545430d2c1b412c1571a70f3df83420460c789d74754b91f8be4d1658788fa302202fe34318176878e9e7d56b3588928cc6d3eeb377221fb50d42b15df5ac062c0983\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"304402206455b13bba26b5ac6066c6a833d34727b3376fbdd36252d4566faf1b19f61f4902206b6b0e4c73215086cd19bbc0cbb69e4c3000ebeed73ba47a14b98c621da7a67883\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4ed948d6df09636962a55dc16fa8141b57caf0a8",
    "content": "{\"tx\": \"af5f933c02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2d00000000e528e6848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c439010000007ad0089d046ddda8000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac76000000\", \"prevouts\": [\"1a906b0000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\", \"abfc3f0000000000225120997d8f010f68a117b9644ba05425738241c47f04463545c88006dd06ca2c16fc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fe4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93679936465fe465f0d401827e55c2317c08ad696e5227da5899b92494a3d57c5ba365bb68c3eae5e6cd9b20289e581f52d4e8c0cb4ba58bcd8be9e67bc80fb920a1e45c38e8a62a0e5058038ea76117f85fe5d704aefa5d806bc1a7cbe3a990946\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52fe\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3b44d8b0f62b2d27de7be259100200d6da1e5303b29f3eaa1b6a4eeb0c96a42f364ab0b66352e66b5bf600abf31d1005c5406f4575b339026213ecb21a668977f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f01eb0e5c5b453e93d7259acca78110e06e0cdc",
    "content": "{\"tx\": \"53f634e403bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8d00000000fb2721ebdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c86000000001da8c8acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5c000000003f491bb602892f0601000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7ad000000\", \"prevouts\": [\"2902640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e4a94f0000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\", \"e76455000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"83612559b0673fa4042d1e6bdb6d5f9b8451f0132ad5913994aa6774bab5bfb6490f9ae076c61e175b90db6e63400952c4150dc28fcf447661e34f82a44167ff01\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4721cf3ab5cef3685ef13017a460e4d543b1d0d35ed7859204130c9c34254d2a9082b9c7393d2ba311d336b187de688d7e9bb6c3efd30ac3254d88839136a77901\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f043f492b006187a12d4a27a2fb711e089c21cb",
    "content": "{\"tx\": \"ce36f33a02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce1010000007e650397dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfb00000000bd1a57b903916ea10000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374872b040000\", \"prevouts\": [\"e45c4e000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\", \"90e355000000000022512009252952876a5c13cea12f753600009323d5e64530eb665ff4d131016b9c0911\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ad3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900458f435ba6abdf70be4dec7b2a0789d26eb9361219ce4916c9f3e2c2146b2213509dff863108f68b54d204f4b43b2fddebfd69630b8c1a20ba8be96c4e7e2557a5003e045cb689fe4fc6de332c618eb0cdce02c2dd8aae7c6dd6f70bdbaede2814\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363af132e2ca2e1ee00faae667175800cc2b7e8c9bbfff591958a2cb32b4e92f5d4c57128c8a67973c5c0637342f282ffab122f5a34eae9e616b37e48a600a7a243e02ad6eabd24d4d247e98c297de2a9d81d67e55d72d4ddf06c8e9a23565ad8a003e045cb689fe4fc6de332c618eb0cdce02c2dd8aae7c6dd6f70bdbaede2814\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f31274445bc35aaf35c1fc3838142b83f4e4dbb",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3800000000d4d32d95dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb4010000008376eebf04e5a4bd000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac14000000\", \"prevouts\": [\"7e08700000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\", \"c0bc4f0000000000165d142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f9b86e355753a0f7d1178f44a1088ef38025cd452017401a4b3fce94aaa7151fd173eef0f43ce56565e4f7a6a39231826f79f45a6667b46547c758980615ab85\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f3b0d3de5e5a892c662d05f7df9b836b5083f4e",
    "content": "{\"tx\": \"2c3a87c40260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ab010000002b52538260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707e00000000bdae3c9301fb521000000000001600149d38710eb90e420b159c7a9263994c88e6810bc72c010000\", \"prevouts\": [\"b42f100000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"cc000f0000000000225120b52a77e37c1fa9b4a7b934796858277b8dc346396dc90993eb725a9563cf0842\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"b87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8d64c15a931058236adef8a4965d2af6c40e751c52c93bf72b53dfa72cc6c024bd12296fcc73680f3617d8f33f0de746e19dcfecb08411ea531ade48d4ab609a0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e5c7be958f18497b82a5f310769c8b8ace0436200d1bb32be05dbac5afb51b7c71ca511921a6acb6b52511c7e467c1fdb04a1d5dae2a81dbcc486709376a8609dd12296fcc73680f3617d8f33f0de746e19dcfecb08411ea531ade48d4ab609a0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f3eb1205832e452025bc7463ab84f005ccd56a6",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127027010000000982f9e7020d680f000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc1077a92a\", \"prevouts\": [\"160f12000000000022512088dde8afd13f0194fca36526be3687127f2e7cf17d2220794be262690544ab16\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cf710f3f6686759e0a7b7ec2e518295fe9deeba1571514a4091d7bbee9df99b8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ab6616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f444cefd89a49cf66c69836b968e18c893e6243",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c750000000034d93ff2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb10000000088399385027739dc0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac02010000\", \"prevouts\": [\"d9be5a0000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\", \"22ee83000000000017a914c7d65cb5025eac8b5bf295baac9287994ab34b9b87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"225b202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"c6a3f8462131ece7a4ac60951c40c9603b0811c484aa5c62e77f857913a067d7812a85f46e165f2f418a62fd4027001f434c3bf0800a2aa3069e845da792ca4f\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f4de778bdec3be4e7cc1f875680330eb9edda65",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c21010000000ae3668c60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127048010000008de810588bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40d00000000fa4dd06f0403f6a000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47870d92972e\", \"prevouts\": [\"96975b000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\", \"3597120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"cab1350000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/hashtype0to1_scriptpath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2001921562bcace39e2b7522191d9d46e9564579cb9c9f7f10823e4b0c0914cebde959a558bbea6bfb69bc26dc8e041042c0546784c77c9a3639b8653838d338\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2001921562bcace39e2b7522191d9d46e9564579cb9c9f7f10823e4b0c0914cebde959a558bbea6bfb69bc26dc8e041042c0546784c77c9a3639b8653838d33801\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f54816eeaa1958560b3411df01fd36e2cc3cf78",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1c02000000d71284f38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a6000000003d5157d4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8501000000f9d154d30318e4eb000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac33000000\", \"prevouts\": [\"bfc05d00000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\", \"4d2b37000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\", \"cbce580000000000225120aa00b33df18083b0bc269fd07ade71d6a19be5cfe3bbc4e226f77b4058e47cd7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"eb4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360c54e1ada67eb35c9fc75440012c0966dedc9197e6aa1f92cced4ba861a6e0736873018117c319506164013bcdec2d285df0b840d64f5a35ebdb06eb3e2afdaba9431f387a803f7df77af21560d586d92c96180a56916d6b7efaaea6f10ba4ca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52eb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362f7503786cb7ee92eae5d70fa92690036da7bdf6692c5c1fbcf5def7599471201292070a98a4b0647c95affa8e1bd4aa189d67ab6e78b6f1cfbf1b9e41a8f8bf399891b33f3277cd8a2b8473e2e6079de1e6f51840c7864da48d9f2287dbe494cf9ce2244c675144b577c27c052f9ebd481172245e28e9502c6c6e8f12c64fa6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f5d2d6eb42d852d85a2d40419830ff372017208",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe2010000006a60a6e6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc700000000333905ed029b4e95000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748789e0cf22\", \"prevouts\": [\"f9d2760000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\", \"ac4c2100000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"717d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820b90ee144c073a081d1ef827361e7936248dbf88e4cb0dcdac45f51ff02f5de2667dde4f09f14471eadd81946489c41cf4fd01382a4947d773f1f2d4d0db4c57\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936934e71b25832c3b522010201f0ea45f4c2c0f78477650c948e369f9a59638b5a47c0542868f8d04f04b11c7797ac2650c695e4f1f1a83ba9fe9a249175e916721e193f5d3ae2ada43ea9223ce508afaffd6393e3458e5d7b2b04f710aee774aaf4fdc20f1f5535ceda7aadddab857a143114b7886b058839365016ac02e93c97\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f692f08e2284094269303792599c3ca996925a1",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41b01000000b82575a3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6501000000474aeda00135f745000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47876fa28731\", \"prevouts\": [\"0e6e320000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"0ef12100000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"0b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93684c23a4f834a7effc42b1c4f88dcc82246b0d4e764e461eb4f4db8348ecfb3306eee185c5450ca8ff820874ed786a77ca41a0ece110e4e1e272b53628d0f659ee0d9bed60e53dfa6fe8b58229f37daf0597893c765c7b30814eb9e16fca89b86\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ef92671edfc08b1595b62488145cc68a42644b51379cbb9ed71181eed5e56f97e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8784d9e7ee919b8817f3904ff7d27b5c3a4ce3798ed5b994b75288b8e9341d9b42c78e40500fa05b550b7f6357dbf83024c41a574f6a1706762c104fa8aec3fcb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f967edf0f22d51ce89c007d5351844488bfc1d4",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c438000000001ea2ccb8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf180200000014118e3a013b6381000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748747a2fb1d\", \"prevouts\": [\"0dfa40000000000017a914f0ed99a28545ab2ceacee60b5537a9e5c34fcd5187\", \"67f27700000000002251202b6311c61a2a508a144ec510c52a71fff5d62c4fa86296d42faefa4fd619b162\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"215b1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"09e9fcaea32a4aa595828226e2229902d1d88d4c7faad932d9658fba57fc06a73098bd9f61f3b0a752472bed18c70cb645844935573e9647fad8ed6d42a89396\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4f9df26c7948631ce06cb7292bcc481337bff811",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0f00000000fea24c75bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0402000000ffd0d85002b76feb0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc72e261f40\", \"prevouts\": [\"aca878000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\", \"3ab5750000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"473044022004040759a1961cfa82671ebd824d6cb4d62cfcc34da58a47674854aa3f3b49bf0220408c7f4d185c9fb520fbad8f1fc2fac04fdb40f0cb2bb22146d386ea7a8b553f16232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100ebeece7e8de8b04f144fb82fe9c6faea740fd4e5fd4091b93d66424b005e6788022035b3bfdbb28d5ee1576ae08be40fa2dc83ef49f24fd7e33f9a83014f2b6bafc016232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4faee5238fb7a4ab5d716bcfb441ef4b0ab3f888",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2d0100000067095e1ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0b00000000b27fd181049eb8c90000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df9797223689876a020000\", \"prevouts\": [\"9d75660000000000225120de7c17758b854fc68d3061dec4ffef020214eb4d128d0a0aa1b6bff82dc51d5a\", \"f6a1650000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f35a9e9183b809919681c9ebf7f5998e5393f3a0b75bd60b721d49b380be8117\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aaa616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4fc70db2882c50f92cbf554605f20aa8afdc9e7b",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1c02000000d71284f38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a6000000003d5157d4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8501000000f9d154d30318e4eb000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac33000000\", \"prevouts\": [\"bfc05d00000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\", \"4d2b37000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\", \"cbce580000000000225120aa00b33df18083b0bc269fd07ade71d6a19be5cfe3bbc4e226f77b4058e47cd7\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93692171dcce0f83dbc374f842d6c29c40444bab2dbb43dfc5467e2257ffee5e878\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a77616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4fd09ff1c3fd39676f5029f8a82082c4a788cbe7",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d901000000d5ab22dfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf98000000009e40c06902500e8f000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796b4d1895d\", \"prevouts\": [\"8fbe0f00000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\", \"f80a8200000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"997d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cb3e0f47209c8bd03f9c1f4c84e35056958ab5882c2791c6ae554831739033813d673df10a8cc98fc65477367c7f3bb838b82569297570384f0d4df8cd49e6dd413afa0de0ff2ef52577d4c80443f6003c675907986908c28bc93ded208ca160\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cdd31c127df2ea056bd7aeefd91119cf1ab5be9ea7b27ebeefbd713a415465b774e6e02235f222bedd00290eb9daa035321655bcf09c112e5b4a77998f5c860a0e580b14ffff5bbee812c9f6e3af6b100c6b4cffaf41971c257964f1fb14f6f9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4fd67112498e9041d549dca8902b4b18f4151e0a",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7e00000000208666d98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cf01000000b7b13eed03661d95000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acaf000000\", \"prevouts\": [\"96b259000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\", \"a73e3d0000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936aa25749a9d031bca906e25f3e351ca93a9a7d139f4eba150a9b4242be9856031d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5148d61d9b48b1fd3c9dcc7ce9fbab23c91d7bbaaf6610449bdfa8b9a4fdaeae22ee4d75780d36bffae9b56136e6d27c02b8d233efdc800bb260bfbba6a6f94b87\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08216c8ab92abfbe4bc2686b5b42764123e12e1b7fae7b64d8b1bf7005c7df7fa0a3ad7647dae649c97c815eebecc244cfd5d14ac6da92e0e18049c71625e2af9496ad20bb4e3465af36c086d3f45ee510bb6828f8cbf764ea9958c57f38670043d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4fdbb01ee1c89fea2c908ade5230cbf49b493184",
    "content": "{\"tx\": \"02000000017cacf58c1885ec7a53b7658a58e4f1dee7e8d7a954fb736b3a502279c0be18ef0100000000ddf8e0e404c5a5538b160000001976a91472fb0c729bce8fb851f92a5ad48d3d4231beda4988ac5802000000000000160014f2ca549f2f8613e81a7cb48fd110f37b7fb1529a580200000000000017a914ca5375a68588393c82c00f5d2ab21f91e99aa5ce8758020000000000001976a914a875a4732dcf342e2587f26f2b7b2ea4a2fd587488ac10010000\", \"prevouts\": [\"979f558b1600000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_invalidsig\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cde641a27c5267172f2757bdf093f55c990d9cef17568a37276c373b3597303004035690bf6772d6c9ff5401569850db8553020c011ff0530e988a693d5fea34\", \"20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac\", \"c0cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f312f383ce02997bd7885b2023ff24b4d79c49e77348af650460f5903df7baafc9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4fe78456cf82ee1f4f6bf880baf672a53376c62d",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45600000000205bddf760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700d00000000c8f1b58b0186fc1f000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478744990c28\", \"prevouts\": [\"28b5380000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\", \"36b6110000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090216c5c5bb97a54d41103c735c2b8c4a1a5c1039b3ad59da9dca82283fd083a7fd49f1598556e1afeaedbcd178daa05bb8ae60e78836b958581f7926b5c8623020d28ab9b179756e1536af0a4d93bb032b7ac64f81d807513c95471d2d2e8a73f0e5d7443d044b32bbfdd5a2329e73f35c3bcc60628fde61058ed3fff8a5556f8c5a3cc9a46004ca4a796c4e948f8e6f75e0715f49cf23e8ce4d0c92953fa6c2751530d24f44d4e5be183fca935312dab312448cd532f70bc4933caa524b30b317e15c818c9092052611ca51cbcb3e2efe25c2c330023a91d576b3bf35d26b94dad64886a0eb0fb9d4b56aedeca9e087037c5e74b3e1fcde03b0121a9fcb4ea41890efeaa41642118552ef6d5ebc3bff9c87c057882d23518fbe2b92c1b96c67bb29524bf13740a5a8382f668c5da6dc44e943235d2abb047923ae340c0249e612f649801bc971101f02c6b2cc6834bf79961b156e6564b132e0663cab7faffb55de954ca33cafdc1d1f9538b05b1d4983c0d2e7a64407486fa2449d74bd759df93b900fab2e244d563ebca286781f3c284f6d22815aa116514be590bd371626307fef8356068a58bf347a73b9260ddffb7fb726343d8b156e16729296004e5f08d9042b1dd5ba348847e649b7eb9ca7fb69217987db5b254d25197a9e1f51c15d78b760bd506c2ea5c242bf12ba2d73e491c814a6be544a73de8b25a6a31a8340176eb69bf0013cd09c75\", \"d27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93661b2c7f111ba6ec1e70ffb2e90369bb1194c2022d0cf3fc398f654044cd38fea9a9c5d9290705897ef911507dd26b72756738dae23c9379fd676f365e52e00fbc5e1171eec0a28263e9818d2dbd976f4b8066e50dd8906a411b6a9dd47f52980e39f192d4dec24b48e9231a08b7d2e64fac2040aad69c16c1d9eedfe5fb62ebc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022f0997b23c3f9db654af0f95d661e3cad62b9ef2fe8e535048f918b94d767055604f13b5163000c19fd8df4b61012b40a425fec229f2e296106ed26a01296d5602d9d242f0dbdeafedfce29e753d580f7512631c167fc145887edc6276d626c50acd008c695efb4805293aca2665c1776f26835ac8a631f9b13b78726a8d29207ec8e768f6e0d0c6a55263d0c24a7d59393b4278e89ede22d5a12fa17daa8e0474a80b6b3014b2e49d0873ae3c86dcf34452e29244734fbdbcc0392127e9ae59e8ade19f9493e67c6ce59d58d9d45231bf4079341aa3e8a584d2498c6b9058e483a2b5f5ec9ef32215ba72ccbd029cbfe85d16229800ba810ab4da8dd3689b489aed0d7915fdaf8ba542188c2d606e3419b57d111b4a13600968f6c4fae8cb19edb97f05a901cc53ae57840679d099613c0629fdf9b9b9584bc7d13408270114ce46c12c4068028a10fd23dd7b856e72cf3594e00be636546c202e215c7ca18ba7e37fd35d3e456e06f2cf335ea2632c1f0eb4973ecef6ce50254addb814893b36489abf8d1b283d2d2bc4b3e89fd1af20f554d788727b09e190d29d6bd444e0d450b571612db7b5cd8859c338cab823bf9ef1ad02a08baf0b4698541944cfba0180e2b7b43cdc007409def61174877ce6426b3959b441f6d35ab4f58aaee3ec633f83fd20708c8d9632dec5edc836e5e145e358ce4902bdbfcf21d481d0a5db7c060ba1be69734fec75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fd98210eae0fa98a1319e0f8d015acee739784c329755eb742bbe2450ea9c34cc5e1171eec0a28263e9818d2dbd976f4b8066e50dd8906a411b6a9dd47f52980e39f192d4dec24b48e9231a08b7d2e64fac2040aad69c16c1d9eedfe5fb62ebc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/4fe9d51c1a4a51db63ace4b7593bf4d0179da70e",
    "content": "{\"tx\": \"706e0a0002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd70100000024a962a960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b600000000b076b3840399c468000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2b971d54\", \"prevouts\": [\"cf2e5b000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"ad3810000000000017a914613e66961ccf40c7c83ed07cc80b2528cfe51edb87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2258202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"ffb7fe6f8c670a9fbcab42d8e49650ec5cbcc1fd92640bbcdbb19aec61302f2984e22b033cc8bec4b2e1308769422d14f23b55d485fd17856aeab0601a169b81\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5008a5b791ae73ec29ac0e451b2193e921d7d91e",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0502000000d16cb6e660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127073000000003ed0908104709196000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acdfd17120\", \"prevouts\": [\"10ea8600000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\", \"a4a0110000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d24c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820ec8a0a1d660d587d93edd278a1416bd3a7fb5c67f78681973183382c988e9bb422e3784e386a40d51dfdc8b2696050c6780884f0aa6a0f3f5d0b1b514784d82ef429df53f77997a088ac7849be23d2367c05dc96029904e93835fc046c3c5b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52d2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ec61f623cabc1c59ae609038607190a38cf6222717d18f4a17cbb39cf7dbe2c9422e3784e386a40d51dfdc8b2696050c6780884f0aa6a0f3f5d0b1b514784d82ef429df53f77997a088ac7849be23d2367c05dc96029904e93835fc046c3c5b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/50197b1f963b6c70cf02494a68b83252169b58f8",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf430100000019be6fb160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704300000000dcce808e041afa810000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8795000000\", \"prevouts\": [\"d9ef740000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"78f40e000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a95\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a0f07cd9257033b6e222f9f09c7a2afab52c7da4cd2bd631f821ab1682d301643f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082adc7c8b3bda8f17728820267d55a41d559bf30f92e294931cb4fa644579829c4d4a2033150a39b6917f88ea297b4f989401264ea3eb8667a511a69e57850c639\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93690a135c86aa9942f4732601386d1d91f18d87aa0ae76f08bfff5f90e314904dfaab45d9ee0154589058109bae8be3e72a724d93a0656d7cd013110f238c03b0975c046d699a38e7801f010fab6b697cc237a48311758c02bc29e281a6d7a682eab0b669047babd6208c97c1428e12fb9e633b2b0d2e51b7853d96a7caae1fe0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/501c6aa901d9b79489250b1e7c008dad90b998ba",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270dd00000000e98bdfcfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8a010000001e3b31c4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf10000000006ffb29ef043b09130100000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd0000000\", \"prevouts\": [\"f1ac0e000000000017a914ff6a0b1cf86e786bc6de2387f1927f71fd08cd0c87\", \"cda7830000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\", \"20568200000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"f77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa0bef6e20d4c5455f6a7eb766c9d2ecc1d4fc5a0b2a6436d41d520177b8d84d9981b72a8cc1600d8047fe8b56626831fcb5b55f7ee61ebb9b8b91fcb4b55947dd0f5943df1a7722c938328966c7e5ac747f85bf050d43cd9195f6df88860ae066\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e91206a13dce830cde2206e5f739521922f5dc18cf67a0e14634d1bdd9ebb3ed0a4dc25bef94d3da1f821dff96c297a1e496d55e040bded104527be104f359289411b885fbcd56b4d2cd2e695cafde2fa2de7097172cb34b20e1fb870aea9a6a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/501cdfc8b8bfd47787c30328084cb44010d48a2a",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cc00000000b8f83b5e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b000000000ea20edd1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7b010000009599d10e01c5f72d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac71030000\", \"prevouts\": [\"f6d641000000000017a9141757f4686f091b43a46fa47e92d07c87fc7a205e87\", \"5b42100000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"0c43250000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"f3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363e76fda838f76382ae0d0bdb253de0cdef8bb5a3eb9bc3b2e59c371abae55d530d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3f2a2968b4ea0558d79f1ec3cd2b8a530982c6b5ad0be17180e93d11bc09903133cace0aa47e1a0afcba116b3dffe01d164ab3e15a9a2b15599aaabc05c638667\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361cc0b7b7d6ad7930d95e3200c68d1443ca9c709d86c4485118a6574c598e644fc145688b3898d8a1374847539a36067c996b07f78d82debe95e7e288000a7bb1b9cd72275efe6b477d9cf0b54cc21959221ed58300fa90def59e56d53bf5ae178c03caa221836b2e776996c8fa4c69c403af6889ee9c99c5c1fa82cf4b3a1b61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5020bfad68bbf3d62a9901f11d582b9367ff01a8",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700d020000005955ac21bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1301000000b41584b4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b35000000009f42a30602486899000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c5b9435a\", \"prevouts\": [\"ac30110000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\", \"f49e6700000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"7202230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_1d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bb5b83d7d8938ca101024dc3e7460b6b1181f2d63478fab90f85e9763ca6f94243fe0321568a8e77cc7d797b417e5d00c6a6a4da33bb69f7f3b7df3a62424e8a02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3e194e73315fb57b606937e0f2f037069d1004c6b7a4798eda6feb39a435a8c6e650b12b0eca569d65c1f1d0a6aff5a015f67430fbb6be3f7e95ab1ca5ff912d1d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5027b63206364f920f33ae41d244998d60e6d000",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fd010000003193dfcfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b54010000005b35cfa901599734000000000017a914719f78084af863e000acd618ba76df979722368987f8010000\", \"prevouts\": [\"5c99400000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bf2620000000000017a9147e06846ce22cd5e23f7e03391c0538498e0e18ed87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_62\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"99d2157465caae90d91f9016d5319752015f5e5653b5fff8f3f4fe00ad496903b44e66b985d91d189da0e1d7a5766ce18069f9e1aa97f57ae6d7a0acbeef2c1a03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"325df9e2e4adeda8388b98b8d4aaf9125f309fce49bac19d1a494a9c2e0604c2cf80bbefdcfd15f56e262db17e839ad9a3ac959f8ba9119877c1ece2c5990b8862\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/502ba5490df10d7b64842c917be0cc8dce168153",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127011010000009512ffec60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270dc000000001b1f74a901fa2f0300000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac929f8435\", \"prevouts\": [\"9a331000000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\", \"e0c2100000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"e07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac7aee4b44d5965a2155fdfc505fe91ce63bf32d9f7dea97d151efeddbb77a8d8e461ced71aca9bcca55b69078fb4637b626cf10c8373b915aa1b57bf9dc2b76cfc84644ef9fcb418936abdde9e6d46d404f44a19de7b4f5c4865233c46051e9a410273431f29264d27122ed0946ba884bbeaa1cf1ddeb7776ccdcb7bb2f1db0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e73d9d375b530aa22fee240902ecc7793689bdebd58e9771ff3d6e92b1aa7f5c13ccd0bea79832f66dcec0cbfd0592e3eb2d999b46ac697170d667eb8939a9687\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5040561743c74062906a64802db725e7cb87b572",
    "content": "{\"tx\": \"3df0c2550260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704d010000006102a8938bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41302000000e3c820940116cc37000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478714020000\", \"prevouts\": [\"5eaf0e0000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\", \"39193c00000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ef4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fbdd38c28c61f1b7a6e8ceb22fbafcfb9b20df7a8d7411fb9f5b9067992d68d9921261d9825d6464319e11fb6c7a9f7c01f613629293fb1fa80574c155a587736c6fa26e4842a5ec51b34186b71f91671a7cf578e5677dc1f65db5fd4f943bbd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52ef\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364d02a6944b3295a9081531191f8339678ef18bd6d1d93e67f7e41417715ae2b61aac465e0caf83cc75bfd3b0ee046dffa2f2de04035b6590b107e2b54cd5d5d2cd241e6bbc5ebedd8f50ae206f1f82a1e41ff5c139455a0ddb0d368f52a47602\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5047a7a4c5f22dc492d73a6de284a0603fc06171",
    "content": "{\"tx\": \"d505974903dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7d010000009a3a5dc3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b710000000071f6369760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f501000000c7d508ab0473fc5900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487b6000000\", \"prevouts\": [\"a02e250000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"b3ca250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d95a110000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"947d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b94af649fd7e9693ff473420f733b57f9fdcc5cab1f492263ad73d963d21a7732e00206903aca02b9ef6b315776a46e2bb12ad4a7f610ddc80848357a2bf29da5432af4ca45b9bbe99b3e8be0ff589ddab81e08d94f2d38bc0283112328f69fdfe847a112bc0d43d64007e06b59459a0c0ad8818c3210afd17f00e931ed6a3b8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ae0d38dbae0af5265a3cb082a237627ff1f83d25afb725954790e6416ead5eeb9828c38da3f3e346edf59d2f92319d23f93cd7e709e1c3907c38a06ec412d61efe847a112bc0d43d64007e06b59459a0c0ad8818c3210afd17f00e931ed6a3b8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/50701ea0af2da8b084ea4a3566db2cedf8dcc2b9",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0f020000000b347dcbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9800000000d4e7428104d53da800000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79686010000\", \"prevouts\": [\"17065400000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\", \"71505600000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"d2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93626c391d5e47230d4b4e419da58037ce9505b07d9e5ed3742aee4172be09b65ae536798c57c197a746bb2ed7f28bea5bf32719d74447f5bf93d90a00b781807a2845c4b1f0ef9796b099f7837236ca3239de7da07050a4e4f568f49f6a65718f105f27aeb1527a9572d42a0ad2bcfbe2bc67b36cc3101a74fc3488cf03d6f1bd0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d1b360dbc2a68556ffe995fa73d9491f5c7d1d4795c1bc7f06a4bb01cde3d3510ec8a0a1d660d587d93edd278a1416bd3a7fb5c67f78681973183382c988e9bb422e3784e386a40d51dfdc8b2696050c6780884f0aa6a0f3f5d0b1b514784d82ef429df53f77997a088ac7849be23d2367c05dc96029904e93835fc046c3c5b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/50765c36b2c5b67d14ed6d3f1006bcac492b9d7e",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48a01000000668a29f1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3d00000000680a248b0199335c00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acd1918f56\", \"prevouts\": [\"64343f0000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\", \"251a20000000000017a91454957ff2b5c5fa7ace3c6fb485b914ecf6ce0c8c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"0c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c2538f548eb9d319d165a467796d1e60ec6673916444f0d66e1a9edbb7d8ec4eda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e5111e542fd849c49f4d44aada2d8e1aab946c793c1d334242f5a6d1a51a6de2d5b0de380cf0ebf0fa9d17e1d1edb87a374b64935c1c67f0c5024fcc072643681\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f347fc09b13f9ab949e4d0dd849e76d18bd9ee465aaa47c5e053192723bafcd48d88e70532c494439586c1157b8a644f11fc532506ec8f5af612c230a11997e628257bae22e6d8aedb31b43cfe467850e731fb88c1221782039a4c16ef44c35617d0d4fc7404dd8984f6a1705481d95654b515a34c586c99c11bfe20e9503459\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/50ade4cb2bfd78d63959c0c196702463020ec1a7",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdb00000000b104fec5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b15000000008f74357a0431b5990000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987d7010000\", \"prevouts\": [\"94b37700000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"04d82400000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"b17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa6d4441481b861885f5ed94900bbd5862c55ac99196b75719f05c0af3923d20525bc912f5bf4aa2c9ddbc9747d59c78f40d0a0aa0a8a4f22dc70e3f9cdb9b6ae3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d5f4fd4f38de76daa30397659fc5eb995186dee5e848d8b406f0f064ef43f0c2e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8d9568d9f877f6ca0cee9df3d4970d26d0e286b65747316dde3c995de6e71d9f55bc912f5bf4aa2c9ddbc9747d59c78f40d0a0aa0a8a4f22dc70e3f9cdb9b6ae3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/50e97f4dc4e78ccd7491b23a05fec77e705d6d17",
    "content": "{\"tx\": \"143da98402dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b440000000025c5a983dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1f0000000038ac8a9d039d224200000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e764451426\", \"prevouts\": [\"d3781e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"694a250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d9124b8647f3acb4689e4700a9599fc0bc513599668e1920e4bedc7a4ff8f237ae15e32d93778e93fd3702c8a475b974d8f95a6315ce7ebf3560de909a35e99082\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8bd90ef2e9c46dc6d962f61e4765ad430e6f14b7b174c413922efcb80f5e8681c3c222ce2224b789f04f2877a611ed2346d135007c05c7dd22fd824b1b114a770e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/512819dc5f866c4c52a96393d1dc161a298b58cf",
    "content": "{\"tx\": \"d7f96b1903dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca701000000c90fb0fadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0602000000fe78deebdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b92000000002e15949302b1769a00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac1a020000\", \"prevouts\": [\"3eea5800000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"d5e41f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"688424000000000017a91495eb8fe3d959e08a2cc279c1b4ede1921d14a93b87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_2c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cbdcc544b9cf6555405ea1e773a70c6cf70cc997c3adb4cad23abe14380c7065cfe563076597f09919dccc545a384d03421a884e097eddf324fa435083df25f782\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c95a185454bf06e40c9ca70a66723bf19eac83a2702717f5e64ff49f8c6c02914718103f316dc3dd282963d07b03b238afa922488820fd0e9b43336597df8d632c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5134a98d252e038c84c184e2a60b3ab15541c32f",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3f01000000b8a74f8a8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44f00000000e90788d160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702a01000000ca5a428f0116f30700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ace4010000\", \"prevouts\": [\"45214700000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\", \"d6963e0000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\", \"aee20e0000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09026c8996ae41319caadcbf48a28b57f224cbd38d446d2467b4a10a4b0772f7b34cb5e4f581c04147436f22e81793836a4632580b362f43b531602850ea052da4516bbc5b4f689c052ca256fa308c869af00a681823df8b45438e870cc66642b39cf8963eb626019fb6362815b92a6c335fb3af15c99c909ba32496f22bdacd2af9983f09cdaa709d996c9aab70503a7ac17a428f90418959f654ccaa293e6e0d70bc6b79219070e0d959c0bf219fb2fc5685336f84b9c76e05066c772c5dfeabf42601130fe4ef32979200eb886b2912e323b8f9229a755156af3fe5f200f4c3dd56a26be458f4b0c313577ce4cf3569efe2062ea1c631913605e3eb3f6d1828b31cf3f01252528f464d272cee8be990696d0c267b10a584d422c42e6f230f9eb455a52ee05482dcde698772592f09dd7c2dcda5f143e36f0d0687a76248919418e65e9962ab66b988ba9364c5c0891a9ba251e4779d6d05314430a01e053b39d3098861dad21e45895e10d219e9ab0501f2e5e4dd26b2b80386031ee82d7b363788074d2c1e9ebaea1fdbcfa1eb6be6abccdca9a147b7e3848ddc4a257d74d354e8aa3360d31bad3513a9d7c2a6000227a2a51d6cf80ab5bca05425230f58c62a330f855f9e560cbd47112959af75204f852b5f2cd5053d18fcd9b96fad35e4dfdf90a9c5bdeb385f9693da7cefe5d96af6993fd23124b9992091710223e05fd52182a6b27a87c8c5b775\", \"7c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936440c08ad087e39b430304a4ad762f31ceefbef677acccb5a06e2c9abe9dfa4ef3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08208eae3f5bf5f4c26def68bde658fd1412dc2dfb494d39d6b1bd4ba6a274f177d9a711983bc616996e2ac47b27808b31a9b7e87f7ce1f3571999dd3a2a57f1080\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090215af9e4ab190a1dd0b82fd3a290972aa8d406638237717238d40dd22a33723616a87d580c4a856b5f3d2f2657cc1eeadf3e132f5a8733eb7e12b634d0be39b8cbee99af01aed909876a8defa580bdcab1525d41566c292ac583a885b3a10562aaf61abd5fd99e39e5e1509abef35bf9ab0ff05bdbb0120192245721deca95d3af3c7b1bd628c76e4235016af31c82d99ddf82a8f7bde46e5e8689741ff9a80fe085a56f7b5f7817de216133608ded926c44d8465c3d620b8a00d7a18d5da15e03e5b1760860b879ff57e2103f2a110a854150e6a4e454bc1c59453f02d8c5e8253a51ad005c9e73b26d21cd9d38253ddb6beae80317906cafda541cc9336b5d703c2e9d09fe7aa61dec161d987d181ed76742c396ec4e659c308e4abebddd471a16457f86eeb5e073da108b7e8b5f01be0327dd4597ef190daa232f5121b522cf7de7f4f6a34c32d99dcd829592d300fd2084025ae410cd05e54a446e42518954eb86a7c93ec9da7c67300ff14618b26bfae89383cc73694075c2ad53722193f6af5d59bbc294c1e5fd7f7e08edeae6dda6ad158f434377609b51bfb40d38af4b4e8f2dfe951fb625cf6c9211f1d24d83bc023b7bd7d79093c0828da1ab323da5bba9d86810e8bb155c66029796b904697ab5cf8eb471feaa183ce54dee4cb50cdb0e528c096ac37a3f644e5a9f91ade7ed4074c7f91972028f2116f4e9149f34a5a4cee2ed4508db875\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e8742f7aec0ae53a52a244a2c0c214837ef2ff67b990e770e70b44d703b0bde01fd5e8f79d631fbf207b458b911c1cf4efab0aea5316113aa9c93bea92caa9fc9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/513b5b1cd7ae4a18b0684e98b8bea2445f0f267c",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2501000000fa3516db03e85f7400000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a662e5a438\", \"prevouts\": [\"8685760000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"994c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367643e13e483d98b5cb4a2dd9b2a8baf365ffe94859ab503c911dc21978e6d7804c8fbf2363a77354fc9c61d01c3ea3e8806c47304e5a0571bc5a832b63c4c4c93c50effc4608d2c714b1f589c510b82e2cb4bd2fb333954004903b4f08f38a79\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5299\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ef799b79a3787fcc1cc2e029bc49329c320df8be6585c07b1b866b22fbf64c2a637edb6ad97271a1ba84afbf70caa284b53510d77fb53cff70120791d9457d51af95302e7a08635545e6c64d05a20a7ff60718981ac8a997d809f6391d7b2d9241e79d00d576d46a63d36f208105835dedf99b7ad1f6575dd8e28af32480c198\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5145a2f823d50829addf9a923816226e49b73772",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c580000000089646dbadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc10000000056ed9eb1035d779e000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc30010000\", \"prevouts\": [\"bfdd4a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a25e550000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"829634fbe591f16cc6652c86a67cba77a6b184985d1af18139166edc4fe590f08ce8ca6b7a8e41c9c90cd53b49e3f4221044575e26fd3499e0041cf69294cc1281\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a6e2cdb8dbcb055cb8bff5523e2705900c6693f892078f35d623f2a922127af8a66e1a509f22b0d361382ddf77ba710aacf970ff0370f20686f2079438612c150c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/51585e660838f7655a9d3f8e62673ed896abc1b1",
    "content": "{\"tx\": \"19d3c01403bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb400000000d4d080ff60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700b01000000657831fe8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49400000000aa2e2a9604f321bf00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f871a000000\", \"prevouts\": [\"0c0877000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"894f0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"be6b3c0000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_39\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ce90b7e1e1b3078f39a5ee0bf2f6f28ef7457299f4626e2a7bc3c62da383f0a494e07a07419603a3f64d2356bfe887519595ad6c6a5e755b648e07ddc82bbfea02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00f14fca2bd71090c6f6e22b63b497a7f033b83ada84d3cd30bbca9a6897cbb84013d7d24b2b57e6bc9bc842fa74d0c110081ef00b2c69b7d93b5b0b5d3f232d39\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5159ef1765261a6a8967fe22b91be23bc4f7c672",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c98010000002f66bab2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9901000000f66711d4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf84000000001a4b64da03373c3901000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac8e020000\", \"prevouts\": [\"d1295e000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"7c9879000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\", \"e9a063000000000021541f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00639868\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c6acbc7404f4a64833bba86ae12a250fbd4270c03a4df3211800a65b426343c7b806b7a00459a4c1bc30a7ac808d25283aa8d21c996014515e9974f153b7e8517bb22a9d6ce3a4416076bcdc0e15ff24e2eba93ece471e96a0af39f5a01dd3ec6e2c0067d6235544c969c57bb6383bc4dfe8083fe3443e336f29d85bd1c9f087\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb41f4c7988b5621a2b4ceb0e4a0295b5522bdaf57a14af19f5e9873d8ccb0a4f054b5563559956b4521d685614895115ff3b761ab3fb4dd1d8def3bf310bb092b594c58b1e468d5c742a8cec262986ad36b584a802070024df25b549bdc05f9a8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/516e8f247c632cc97a34b088b9b9c5522f6b4b7b",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8a0000000030d2549004c35d4e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875add8536\", \"prevouts\": [\"5912510000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f74c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e6bf3ef0c52029538d60b405bd64e2cc9734303fd934f9ee1f37723dcf17f67fbe0beccf8b53a38f7a20d51eb008bdc60f78fac094fdd23935202ece673d8622376e34112ab1bc736956b41978cebed690ad16294afa2ba0e9d8b5fa7e9f6f2f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900455438ad321f710317d8f3678f772f8337c845de7a4601c479cd7219e318503b74fdf1522df456d7fbfe0d29a7744cbe637017dd01cd6de5bb6b2c07ed06f430b01c25c837ec0a1f852472f3f26e6d49055bb98717b7b68c46cae1e5f9804f9145\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/51902d7c0dc3e60282faf7c3bed70ad3588b79cc",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cce00000000e19e8a348bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ef0100000011e89353dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0c02000000b3dc5d44043c69d900000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac92010000\", \"prevouts\": [\"d9e6520000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8f6b320000000000225120d70bb5030b4517d64d2a3c38713515b320a06334d0ff9db76c903984d8e384a2\", \"bcc555000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063c168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364cc9987f9f1a0b217068c5915d51afe3a2b0e8487705cf8822368d5c636743cdbfb640520cc13bd7f4751eea589bfdaf463667e9e3eebb3331ccb48f0e9ad4c4d3f52a2844c5f7874c7d430ecd2ddfcfe713e30c56da5784f950db6acb8f092a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1360c8600b70daaa5cf8f525cd2d4abcf69506a056a119fd926e23bd8684708da0a67b80b81ed02a57999348bdd390384d424a2522cd0278ffab5313e035bd402791a13a85e5c2e660174c9a1e69b8f96263917ef129d2001c822ceb7fc389f44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/51cb6bd8e208996ef5816ab2e4a5f0a4392acd9f",
    "content": "{\"tx\": \"a54aff3a03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf37010000008bb7459d60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702700000000a6f955b3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b590000000057ec95af02d213ac00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df9797223689873f816d5e\", \"prevouts\": [\"87ab7b0000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\", \"d308130000000000225120efe1fa8c8643b06748235620ecfbc876727366244fc928e9c2000087b14324f1\", \"17ff1e00000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368191df1e8a6412a9133547ec8d3321f9af52362f72a65d356b4413964c57ce831e80b1f8b709fd7e9f8915460d72d278aa0d12452680dedc295e1cc62d069d9c5f8b38696f7f521c781f821b55aa4ff86c04fbebd102ad129a9d47907becd36b4e19d3b2ec28c8925d54c04f383936b915813fb16b738060565344c47074fe42\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5183e343f15a28f9ad1157957559cb0b6b8ddccd5d64405c8ba15aa31cdad4142c00ae7d77688765097c61dd6dc7203a99b1de19633b0fe895af4a245d0fe1ab9735478fd9f7e773d9cefb2e6c2d4f28929a19e0115b3c92e29fd8719e7d86d1ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/51d22c9e318035b292b06c7e92cff7a7dcd2ef46",
    "content": "{\"tx\": \"faa2764402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c11020000009f2c27d5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b77000000005ce06ec703e2aa73000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6fb35962b\", \"prevouts\": [\"7b284e0000000000225120e0ca4cb327604d8bb54d855256413a632bce5e2185126ca2f73680d7829d5a91\", \"ad77280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_1e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"97f4f2cfd939ddd0434001233b05794237a4d684cdb12fb123f26584e9bed16d1659f6fa989a7665f51ec2dcea27584c6e7f3f67c3d02d5db126b8be3a69a4a703\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e3e0778281cb047d0c31055580c8b439d833aef9225ffc93a89ae1e045ae7fdd93c88b9ea86cfc0fa20f20d804ed853db1bc2a8c6e93371f82db4262f6d895531e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/51df77e1f5047cc73d62f6a82b06c76b2f2dfcf2",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c78000000003e1cfcb0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c87000000004eb3e1eebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf930000000022a849d80147e877000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487a8000000\", \"prevouts\": [\"f2d35400000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"17484f00000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\", \"72f17a0000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"087d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa55b45b3af2af0c7a238665fed9a70950b75abf30a3f75b50a7b1cc61308c32d3371e41a07562523a12648be26bdba66be78ce7e249298c356e66cf29847872e0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08281f944ef569cf36d808a56aaa75ca2fdbdf4182c26b1d87989a6b5ad676759bc691c2a9908d9e7287fb91837cd9c32b2a21ac331bb306f4648aa27bb40422e45371e41a07562523a12648be26bdba66be78ce7e249298c356e66cf29847872e0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/51f4a12afbc5c09d84488a09c1ec4fad2f8ad55b",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9400000000c44b13eadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0401000000a6db52abdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c54010000002c43129203bb4104010000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6b86cdd5a\", \"prevouts\": [\"b93560000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\", \"27ca5d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"17f34800000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_csv\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"39d172cedc87521fd3bd91d949348abc24a61074248eae2c541efab24fe7ab4ba11e64d0aba143b7b86543d0ef485368b7b3a002a8bd5f98bfb00c4620bf61f7\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313ddd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"39d172cedc87521fd3bd91d949348abc24a61074248eae2c541efab24fe7ab4ba11e64d0aba143b7b86543d0ef485368b7b3a002a8bd5f98bfb00c4620bf61\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313ddd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5201220ebf5a752ed230ba1c4660d6768ea0ab37",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1f00000000624a02eb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127095010000009ed305a30279d36200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac70030000\", \"prevouts\": [\"fa02520000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\", \"73761200000000002251202ea95065368f678e25a669a7906e1051ddb7c321fda55e7bd6b39829f3117b75\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93605468d6fa5e4634f58d2d208976b5aab4a73e083c36d6c2e411848e44297e02d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a3a616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/52406f743dd8cf468c8739e0e49a5e8c2abe890d",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6900000000070fc07ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf680000000062cb832204efafcf000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2c000000\", \"prevouts\": [\"0697650000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"24df6b000000000017a9149d4bcb1ed806c9beed692a78614f8b90a68c708187\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"21571f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"522e46c0721863b9e3cb7bde3b95912a12c893d3166766d12d02c50c88cf2c328c62350de66dd9e6ea9d65b61b1b69b771583fb4afa450d9a9c5b28b82bd164a\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/524a8fbae511284a4b3feffd7e69391eebfe5fe3",
    "content": "{\"tx\": \"2922ebe703dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb9010000005c19b4fedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b13020000001998e48adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b010100000093d904b504fad96600000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac67c6fe2b\", \"prevouts\": [\"deda1f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5841230000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"70472500000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6aee\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f6f920dc9dcb98ba04cff112f583969b4fa240bedf781759d6b6e0f2e74eb7fa05e01deb44bf60eeaa09a037ba0d53221083944f657819e2d2b55bb732cda3dfdd207214d6df2d18dfa237afd6016520e9e6ed6636ebebd182087bb183877c35439ca2b6d52d4fa79aee6ecbc14a8999a29f1c28c4c5c5b9dd610517c3b748ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d8657209b8dfaa69151d05ccddc10c8c1e468eb7b78f9ad17f99ee1b916fd61bdfbcfce40899fd8696dac9e3afc960f0a100b615a3c324ed3a125e98af98336f748ba56\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/525afb4266fbfcb9a9457044ffa429e6345aca74",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4a0100000084436a61bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc500000000b28535d6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd2010000007e9916a503f4c94f01000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e77c000000\", \"prevouts\": [\"f56e7400000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\", \"259f7f0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"acbf5e0000000000215c1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4572db529171a47fc33c2e4ee960be7fb9400c27bdb6fae7dcdae272f7c7daab09b045cee6f1e54629d213b8dbfcd9de8aba2dd7f34fe21c75d81b8576e463c6b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045141ceaec0b62943b85ddb54ef2037615ee2bfdc3c88602ea27aeaa6ef1c2e0ef6e427c91532996b84ed2c37f8a26be8637de11530a49bfc255181ba6103e3464915bb1b7e7b983dc2170cc97c5c6d5436afb034e74288517b9fa4d2c2ab63870\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/526b41de4d7b2b6cca5b8cca2aff4e05e1edd180",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cb00000000e2137298bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4b010000003490f9c1dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5901000000e9b952fd0237c4c2000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898757020000\", \"prevouts\": [\"30081100000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\", \"bc186b00000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"22bd48000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"e27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b1d764645ac829a889ede7ad8db127382a24af0c39e10b540dba9512d84645b5eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7acec7827d9bc9e4e8e39cc141cf7690ea6843d6b50eda1fc8d5571fb149b2aabab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367c93f7c29ee74358d9798874b9f1b1bb2a78bb36471717798dde9f0a020d10aae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8512c582a906b097cf6fdaec64d2651566eff10d9e5eded90f3aff95e690654e4212021a26ea5e00fb993aa3d0fc1bd1e431f365db69035b8e4625845fc9b697c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/528808e08755d1c4badf200ea1e46b471e697367",
    "content": "{\"tx\": \"ec6f545702bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9e00000000a8a25b8060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705000000000f22c0df9034f438b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d3020000\", \"prevouts\": [\"85f87b0000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\", \"97f8100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_56\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4df118ebbf8fce9da1d6256db5a49c86b2be621827c36591ba5dbb47b8b72795d0d5ce31638322488a9e35909f70df7b8caba4d07418e26742c5863e90ac10d601\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"943060a8657df6697aa72fd099b4c197987b2896f09ff25bac8696a619a8ac4034766042a89d3e7aac55734e897069c03558557deaa09c5fc15a85ed42d6f02556\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5292dd4bbfc4ed134ecca359a50042487bdab8de",
    "content": "{\"tx\": \"d97d1cfb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46601000000d2c0dabe60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703900000000021a8ba701f3112f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7964a030000\", \"prevouts\": [\"4aa7410000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\", \"15ab0f000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"99\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364d586cb5de2dd3058dd7e227544d59b90431907c0aee9f3c45dbe5cd5ada47d3637edb6ad97271a1ba84afbf70caa284b53510d77fb53cff70120791d9457d51af95302e7a08635545e6c64d05a20a7ff60718981ac8a997d809f6391d7b2d9241e79d00d576d46a63d36f208105835dedf99b7ad1f6575dd8e28af32480c198\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a4db2b7303d128165c3aee76333e625284db46e202d1b30be35d2598f7d6b886c0b317c85b837bc971133c463a5a02b3e438f62c623f33a660d87550a4209620af95302e7a08635545e6c64d05a20a7ff60718981ac8a997d809f6391d7b2d9241e79d00d576d46a63d36f208105835dedf99b7ad1f6575dd8e28af32480c198\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/529e15d7495022b3928ad252f217ff7066f4a8c4",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c409000000009364ac4260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ac01000000ed34be6e039fbf50000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48709310e52\", \"prevouts\": [\"e41f420000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f4301000000000002251205fbb8ac28e580fb39d87ab9ecacdc52316773607abc8ac10a5707b0a5a311000\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_1\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5a0ba866675f7dcdd69fa812d8bc0b7100417c09ed26f11d1fb1ccfed13bb8753885813c383a73f49a51bcc12c9a797e6834d60a411e3a3610bc9402a8c57bb401\", \"3fa4524396f75e78ea91e3f7665db7f8cf5e898b2c61d61c31c5785ccce34b72d1b26bee966617925934b5d796b60c04fdc6c69f7f1b4cb888ff0a89c3b3371f2ebd1303f3f2bd8a9f20fc3d45bc87817b1212b702c8f759e11e1ae29c98f921debd49d34f6fb4c98830602b73d94de9275c5973b3c64af620cc48aaa400ab8bf5f11e7aa5c75f9f4c9975\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2000636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ffe2f9e7651e9c582230805dea6ab3f770391f72340882880a9a66d58587497760d14537d26c6420044fa8ebd38475257ff2b21d84f4b8d09ede551234536ca57d36b4a575814cf54685ac704a7dcbc10721e1ec740698e9dcfb57c35e77ff55a5c396eed87ff772ce52825cdc495e9c04fb7ca8a067211a005b28f4578544029f842240c645949adcd0f10466b378902fb744c393ba4780cc2212b976ce07bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73c091b0614ef7942ac3712e9340eee8de2b5d5360d8f858faae197db1531a93d6188a98edee7ef4d72517cf453882e06807799415dfcb5fc26feb6712d5c215a9b05904167f78bd9da3adac10f2f4122c09e9f54abea648caad3c3b7e1f8aa100000000000000000000000000000000000000000000000000000000000000000d342f30abe252a2fc4ad53d00a9b547116ed2eac0fecb6536d542fb489aeb9a54016aeba8dd7ac26ace25c63f13a80d6dec050bffdddb0ac77cece5e83ecd21\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5a0ba866675f7dcdd69fa812d8bc0b7100417c09ed26f11d1fb1ccfed13bb8753885813c383a73f49a51bcc12c9a797e6834d60a411e3a3610bc9402a8c57bb401\", \"f0957755a9ca78dacae97c846fb0e3cf28c9561039ebc678c0c906641e97e75658c56d147d7ba53e6b7836bd7a3ce46a440103d137bbd3cd04574d165af7bd6d0ee056a29418370dab98207c63413ab8ef2e8c3afb82fb86dcf40bc3d65927b34aed6b5f5e5c18e715f2bb01de0606a5f6aa23b5bdadb6093a54952f989b844035f3d480247fd9413a39\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2000636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ffe2f9e7651e9c582230805dea6ab3f770391f72340882880a9a66d58587497760d14537d26c6420044fa8ebd38475257ff2b21d84f4b8d09ede551234536ca57d36b4a575814cf54685ac704a7dcbc10721e1ec740698e9dcfb57c35e77ff55a5c396eed87ff772ce52825cdc495e9c04fb7ca8a067211a005b28f4578544029f842240c645949adcd0f10466b378902fb744c393ba4780cc2212b976ce07bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73c091b0614ef7942ac3712e9340eee8de2b5d5360d8f858faae197db1531a93d6188a98edee7ef4d72517cf453882e06807799415dfcb5fc26feb6712d5c215a9b05904167f78bd9da3adac10f2f4122c09e9f54abea648caad3c3b7e1f8aa100000000000000000000000000000000000000000000000000000000000000000d342f30abe252a2fc4ad53d00a9b547116ed2eac0fecb6536d542fb489aeb9a54016aeba8dd7ac26ace25c63f13a80d6dec050bffdddb0ac77cece5e83ecd21\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/529e417f9521111e7e2b214bbe3a009fb241e0e3",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4b00000000f912b3eedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5001000000e0efbb9d02305ac300000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e775040000\", \"prevouts\": [\"b6b17500000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"bb5450000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f64c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e88526c13eb9f3ceda07aab2d6470ded7d71666b865703d69a451a4808570d93ab836f202d3609bf617cb7b4b7700532182ae3d2e1a09e3b3f38346196fd93b669cfd1883d9d94906422bb83623918edcd109683f826bcbf676882b31fdcf44192fb5cf2427ede6d61c8a74b8487764d962b41d4db4b67b9e943a724e86dc0ff\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52f6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936061ea1cc303ae48ba58384e29824bd453e270f0d0a8b7b8fddbb1c01a6802b543f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082bc80a3081e946651089c17942e2d2b7e0a2ba8b51162f8e9c4f29cb18d1603310a1b6150087d660153f154c744da46b7319b80aea4f8e08f23015968f3b1d87a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/52a46ce5d115709464d927bd868cb66e64d5d890",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cb01000000cd9868e9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2b00000000cd3ed02203b4d76700000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc734010000\", \"prevouts\": [\"3a08110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ba875900000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_9a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bd641174c8c9d5a320e5848603ee4e052442f7f72c6f46d5ed22e6d04533eaf85a42c05a9c170a3878c85512200e1192bf09ffcf7342394b41a1531d5a22520682\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a34328a2f6bae8f0c91edda5b2a87d6da408b1ab8ad1df672aee3e117bb732e8f30fb29a0509c41ca5b824d31b06f63143b7edf0be8f5317169ca7602f9e795e9a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/52b71f15e64724663db04868b953a0dd6f8ab01a",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce90000000060bcc3aadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8b01000000049096870147a1430000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d32e1233\", \"prevouts\": [\"141a590000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"33cf5e0000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"62\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d8b553b0a6fa8101b21fae89df5dd09b18d30a3ef06025a3f9cb6b07028f8b60ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b2a28c39ce330a19a0d6c22ddc640bc3609271e6194de475fecd1ad84a88d361935a9a81b6bc4d13af192f1d19d1915de95ad8d42e49add8bb4e9a9400ca460b05\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93608efc3524da3cce9064a39cd829c421044a59a48c5000df9ec45b645663b2d3865d6469ded31e8361d538153e3993104db0c9d480dfc3dcfe9dd6d2fbda5f8f6abc42ab3738335b78a2a7135de763706b017ef32cb75bc24ca1210f74f6e5b7b3fd119d5a804161d41189f11d8f3e11243ae602674c5e73f1686492aa1f485fe\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/52c7e56d194272214280372b7dbacf979b86a714",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8b000000008783f9a3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf850000000061d3980c048f94c6000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7f11eac39\", \"prevouts\": [\"ed4553000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\", \"e55075000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"eb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936548e02ba2703ccddc552600e93f0a288f5116c529acb2e0434ef3486de3078ba3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821e09e6d24dde1e7a9afb38743b4c2dd55dbb58a3a1803a82bc7b3a42584fec8fa9431f387a803f7df77af21560d586d92c96180a56916d6b7efaaea6f10ba4ca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b965c838716597843dddd943276d0695a7197e96f70841ed980463eb99376fe31e09e6d24dde1e7a9afb38743b4c2dd55dbb58a3a1803a82bc7b3a42584fec8fa9431f387a803f7df77af21560d586d92c96180a56916d6b7efaaea6f10ba4ca\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/52da571031bbcc150454dd6be63a21c6a2dca5e5",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0e02000000dfbf3a19bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa10100000034a2a0af02fe7ad10000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487dac0f83c\", \"prevouts\": [\"fef26900000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\", \"568269000000000022512030fd389dfc6b7dc5f4caf58ddf04b54dbb338c7b69e334c29cccf1a655d02655\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"8a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4572db529171a47fc33c2e4ee960be7fb9400c27bdb6fae7dcdae272f7c7daab09b045cee6f1e54629d213b8dbfcd9de8aba2dd7f34fe21c75d81b8576e463c6b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045141ceaec0b62943b85ddb54ef2037615ee2bfdc3c88602ea27aeaa6ef1c2e0ef6e427c91532996b84ed2c37f8a26be8637de11530a49bfc255181ba6103e3464915bb1b7e7b983dc2170cc97c5c6d5436afb034e74288517b9fa4d2c2ab63870\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53045f62216e6dd1d7b2d1c05dbda813f59f4d38",
    "content": "{\"tx\": \"cc2a29fc03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8901000000c830c9abbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff100000000746406a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9601000000bd8ec8fe0286b12d0100000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cc349424\", \"prevouts\": [\"6a2b66000000000017a91408247b8d3db4e641d0be1ff23f14280256870a5187\", \"2f55760000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0074530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6c638ac7586e761b5544b7fa32d337502bf5593dcba4a8c48c81cfc9ae0af979c571e472a0bd876885ff99d9b93c69ba5829a01b2d479f6b665ec66aaca1efc083\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"108737c5062c0a93d00afc4fc86c180d11ead1f580c3f58c6a58fb53d3daa06c94ecf752a742bda7ce980b1ba1a4a6fe745a367d21bc92075562df5e2671b9ee09\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53090ff0e10b029e37a0eab690a757a5f4c346ea",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701c01000000ec402aaadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0c01000000553296460139f8080000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79629030000\", \"prevouts\": [\"dd961000000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\", \"f5212600000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"f47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa44a76e856afdfa077951e950d1b00a9b743b1044161111d30eb56bfa7ddab902890bfc944cea42013591059ba9f4ec0a95c62699d2133b38017223ef90bcb8e42b4a87a36ff2ed7228bcfc2438815b30cc1c98339504e1b834e10aaf4a034051\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936132265c4b43f7fbce1d2c14e001e4966ccfecb1b0069f6ee6ebbb69457f7bb48760cc2203422c55a835172c125a7e245d244f5477158f1701a7cdf5578cf79bddefbee90a18838bf61213a4f1f5f31a75e180b842cfb60d5f81d26cbd38f8652876f4540117e7e2fda63f7a015ec774d613b8932caa4388fa9ce7145d42cc7f6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/530e0b9098674994a45495cf1eb8c3fd36b04ef3",
    "content": "{\"tx\": \"3c688b8f028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c501000000794a30f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c30100000090cacde503a0306f00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a61e4ba658\", \"prevouts\": [\"83f8390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8c143700000000002357212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e9440ccff55d93379936d095be283dffe5541de496e585ee7250bbcaa943ffab41aba468e5c0aecd6a12d830b424289f15b0a5564fdc86e42e7f72d95df28f99\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53123aee1da68a8b9619edd5140ab5c6aae10886",
    "content": "{\"tx\": \"861025b202dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9b0100000044a148f28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a001000000788338a8029f0189000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acafa0f542\", \"prevouts\": [\"2c4f500000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\", \"af973b0000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"7b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8e069ba5eeb0bec6bb336aeedfc480da3e66ab61ed5906063fe5b68f45dcb12952affe3792374ee751e9779d236e331236b2211c0285bb070b7e5d58aad1c033f64fb6de85916ce1333b57715a419fbbb7fd448155796c8af09a2e4a2bc14d947\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367588a9e23979d821fd29244dca8e20c36f5fbf7a2828b65ef7678089e87c8fd3565447efa486312fa493bc3efa8d0ca00e2c766484411258b08f0fec6b85156cd34322f35809060e9857f404c38bdcaf402c3d07c78e42a3b4d1eaa304dca88a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53234e0beefd772757294c48658a6fb1b632e5f3",
    "content": "{\"tx\": \"d3ff18670260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127077000000001de5cfb8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6200000000bb5121f804c76831000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac74020000\", \"prevouts\": [\"23940f0000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\", \"a9962300000000002251208cf8a45f10f972ce0940452c1be98364c363db2f13613d49d474bd7709bf6664\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fe92aff70a2e8e2a4f34a913b99612468a41e0f8ecaff9a729a173d11013c27e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a4f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5349c13d7b8dd8f692718b4ef221a21825fb04f3",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b100100000018a6bf8ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc8010000001c25910902ab3e8900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875502f91e\", \"prevouts\": [\"12271f0000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\", \"ba146c0000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"227d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93669991cc2f674abc382d5045b0eb857568d5c7aee4d0cb1a298fb8e785822f7d86b7b535eacb46044525b0033e262a0686af8b44a8254e1701bb4a9d0d605b263fcb15428af69077ee4e47ddc8bd2adcf7d97a29fc56c75a24a213a103a1e3586\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f4576a45def9951625cf02c88598f8616d12bef3cc01ed824d79a70edf31b7fbe0e1a4a9bce64ad1fc5af22ad5621933415c83e23766bbab20239912b691ace9dee2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5366b2cab843c6f4979214e27b561d35321bd2a6",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43b00000000ae08b4eadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c51000000007a44b5c0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b640100000061c4ffd403bdd4b60000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac57010000\", \"prevouts\": [\"f0d03b00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"96d759000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\", \"3c68230000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"de7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8856e164d8f95680a310901239278cf924747110c023e5c9b2077227ee61e12b7ac1d0874bb493d5b277fe586a1908760dedf191b70e37bd9b06448d9d8257f0a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93622949a7a9280df6a303321d653363fb1d0908af0005974b2d136602a67fd77b5827b55d11351c6fed41de6d200bca95500243dcc7874125f5161f5be208848f0ac1d0874bb493d5b277fe586a1908760dedf191b70e37bd9b06448d9d8257f0a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5379718fd6733c3194547aea3041303f46159862",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0401000000bebd38a7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbe01000000ba854d0e04f3d9d10000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e790000000\", \"prevouts\": [\"474f840000000000225120ea467ace5d4e72e4b47248d08b4c7e21d4858a06bc17e94ab3d6153139c60e1f\", \"ee48500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_99\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2217ca85f3cb5cf73759214cefb7c16ca214c69645df3c0601a0e6f2c28b28230e42ed2eeb67f3d0fdfe39b2b9daae238c68b07a4b11981d704ee41b0c35679683\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f7350416c0ec992dc10bab3387eefc5b0af7bef73c8dfa126aff9945e90642259910a0ca9c08f119ea96fb174da4381f41f15c63d5be20303b6efe53b3e78b6599\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5394689c5e237d677fa75daa48d897e73a858ecf",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b600000000e9c7f4e6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcc00000000ae03d8a6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b63000000004e7e6ee9020bc17c00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acc8010000\", \"prevouts\": [\"529f330000000000225120973a94e36a4a923b8d161b8fe153210f91b56b5e4fa7540d30da78859ffb8897\", \"1b20280000000000225120035d0d8894332b18eeb5087880b9b7fe7a878dc0e9a501d9b85908b60f4f194b\", \"d2c2230000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93687582901ac4ef6d8d45b4369f7aae1f1005d5e2602d38dd61436b2bc7435277b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a51616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/539798847b99eee00985bc1951275a98b55dd7fd",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700100000000d4506fd8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0100000000c19213868bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4df01000000e0a85df0028455cb00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acece8b33d\", \"prevouts\": [\"2e421200000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"1de97d000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"8ed73d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a98\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368a9afd50783ddcef84deb29fa414f257c4b095e802047876f95e359846f2205c3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082241df2003654f0fe7fc4600eb797dff990a6f251f130f49fda58fcd5b0cbb08c94c58b1e468d5c742a8cec262986ad36b584a802070024df25b549bdc05f9a8a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bc9bcf9ff3721a7f1ef5fd55aac47b8aba67e27589b60c20b5d7827ca859f31020e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1390e5640971602922d6b073671c4e08980ecd1f17d1da07e150f68606efdd1f96e2c0067d6235544c969c57bb6383bc4dfe8083fe3443e336f29d85bd1c9f087\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53a808e42f754a6b97d63d9648f1e9a70ef36421",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703a0100000094624dca8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ba000000007ee534a402fc76420000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac6f5cb72e\", \"prevouts\": [\"1ba20e000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\", \"c868360000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"854c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a8a30cc5f8be195df182d3a0e5016923565d012c99df51a6809fe7dcf26e6445717b4e30a5884e3e55754911c167a338fe4fe766d1d9ad9fb23fde5d0da8b2aeb2a240b376911c9876b3695f79f395ec3f2d97b1695e5c0e7f397f1ed982e79a1b6e729898dfeeff93e2067a7d076aa1bb7914d367b163cafe54fabf88cb14d8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f59837e6bc6752c676e29f45f07d44939857c9cc64ab4a8a9eb8303db51aabd13f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082d4e60e987dc96ee5dbea4bc309cd424f3f3a0504752ed5a5936e8ec363297933734b3a7050eee065844830ad8d45a710891f78004f5e7f35b8fd72bf3ee94449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53c007e4c811059c16e10ba22c2b8c0f4ce3d99d",
    "content": "{\"tx\": \"9141e8fb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c431010000009eecc698dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6a00000000ac6348d004e56f6200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca6173146\", \"prevouts\": [\"83e83d00000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\", \"f83727000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"047d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93640482c4914218b901d904c5b510a4de9c03c595a6755b9edceca77409a5698b30d3ad511cf44769b6705694216a5b431b28318b130ebf832e7f6887216fa315d1a343680beaae3fbea53ecc49afe7cbe880992a117d636f336d7d159be7b446d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936518a056f01b645db024b67c94355cf052bf827de3bece4ad5970bab770c22e93b6863138d45c5b9211ebf4039595f6572b1b39ac7fa7faf75aa7045d3f3541879de556ac6994112f2dbe51e2f18419f84f5e3afde46d5119f13558b672a3f6371a343680beaae3fbea53ecc49afe7cbe880992a117d636f336d7d159be7b446d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53c3edf3601218d001c1e5074a2e608ca903fa25",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701b000000000f33c6c8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8c0100000053d675bb027de5770000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a63f6b2736\", \"prevouts\": [\"a2ef0f00000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\", \"b26b6a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_d1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2c734fe30938a19b22485defb62be791440be6d0aa599f5238ee0714ad4c25d82e1d8e254d9aea29b44addffe7aa101149b6b19e0f9b404f25c58aacefca61b603\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8e21721e91f7e17c912c1a6b87a900441dbd454d64ec58af73ec487ae16932560e3b85baf59e3bf28f84eca67a04f2e7ed9724fe715b715da2a6834998082b69d1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53c8c5901bf8077df2161336a0fc9a5f774e1a5d",
    "content": "{\"tx\": \"b063326b03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfd00000000d54304dcbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe900000000f78d71fd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707000000000eeb7db83038ea0cc0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df9797223689870b010000\", \"prevouts\": [\"daa652000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\", \"f0016e0000000000225c202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"33870e000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"47304402206106ae63e7694ce86de3b32116175b3dc9faea35b32d1297ccc318332809ed5102203dbea36aa72c14dd19fba22971c865a95fd3e274968beaed784b73840b9007bc014104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402201f971571ea8ee83397460eddb6fe47273155118e0dcffcb2ac0c493ca72511630220230d82887541d8d43784a193f9709e4eddd44afee0282c75a80948a3ff860e2d014104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53d0cafdef4e74e058c9073bbd755b723f71207d",
    "content": "{\"tx\": \"9cb7d226028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e800000000505ce1bc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43601000000043fdc9a0412077300000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df9797223689879f020000\", \"prevouts\": [\"728d4000000000002251209c5a589e416b2bf8d886ac38373c12ee12085629030d3f34ed2b7cf34700cf85\", \"e467340000000000225120f52aac6d1851a3bcc3e02eab41e79301b2d0925e53812529fe85f9ade1401e4d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"107d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a4ece29f6647eca10734c36d2b2a9c99580ea1b3b4606d409e3d27a25628f10946c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fada7506a3091a1e28dfc5b9aac4646748f840add9c91a317c4120c5f1dff96d2e4520b5ceb13d27db1b37ec8ee9ee9482aafd08fc62c5401b1fb7c7b4ff374c3d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f97335490236408107edf93c51ed34034fbbb8ad4f6b9a196e596f5650c1ecaf6665110f53a885bff43176a7d7b6b195840e7c84801cde818ee8fcc4f3857331bd940ade039b405c8439b762bfbc73f9441ef227e6f687b6d94ebcbac32155c7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53dc16200f550b0ebabb6c5c132ae4191e1a1482",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2c00000000e3fc62ca04a5c95c000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47878d000000\", \"prevouts\": [\"47075f0000000000225120c766455b5ae5e195764c9b332b78d097f842c4b058ff2966094b650eeeeb1f7a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cdb3d0d78ae173e351549f9bef2b17f5d16e4902f43c7279aa4f3f7b9b217ed3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a8f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53f7ba7985ea8688080ed30b57d08c4ab91d4a7c",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0d01000000ccfbefbebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6000000000dc712be3025d9193000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5db0833e\", \"prevouts\": [\"4dd627000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\", \"bd686e00000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902aa32a49d685c694a272f72af2e558f9c5538a9ac8f1b7f5a8de0f1ce728a6552e4d50d90fe5723fc14a93f913e086bfa9675243b06d15ff82075b4785f46584b26563a65a96d8125fb3d6a37aef446fad780e6b10ee13d2692aeddbaeee69b4a58d9ea2b1192558e96f1722db664a9694058b8074bb7b214ef49c14c8f2349c4a51677831922b369cd4fa85ee3b792072df2f58ef05c09a24dd75d1f16a0c26bfc9800b7da89b2d9e90d05369a24743b85b7df678b4073c29ef53c7576f7b55e4e39f25a168b626e1a65ad0020c8a531b2c9f4b685ef34cd98d4daec49a9f70645b11e9c11e6ef6da14cff63968ec749a04c42808935188f30288800bbf67494cf36e5ad7d5ccd783f6f3681acbce1df0088012c244db592e364b29cc64dd4814db3aa42547bfe54d4c9c8c0a147d7999faa859105ba6bb4a2b0ff86c65dba6c8e359a72e86497a5c5cab851c083300b89dfc6a83e2199521b21d3c28dbfa37445defcb54f7d11e95dacad6694a67d88eea7cf169c6349b9b0ac7c634d71d9622acab9feeb08fdcc7b9d3077181406335ccaeba3200ad471231e04a2c2c6f195b9f845e5d2fce5f6a98641775b799f10fd8a222192005b8903844a36385fdba2c45abf26282a73c874b7f95cd5c610ff428c74cf0ba581303a0e2e29c92234d2a92940581e0b09a00aaf5f1337c9900c3d5f6e618842fb92d1c8885ff91d0e9c259ebe7d6a951edc2675\", \"907d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c374609570e32d34f993f11726b30429119b9dbd5f99ae31546f61854bcb05d1da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457ba4f11ff80ca9181e3d85997fa959accb8f97af45a52bfd0df916797673441f5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902795f5688fa8fa175c26bf326176d3c3339cd166d316d195ecb6bb0a3e465173821c668bdf363e3f2ce214b4798fd9bb5f05f5517f90d85d5fcc96d64ec37c8e360b0bee774514c24efc0855969a5f67df85e1bb21416b809672f1c4862b3d7ab2b8505d1e003ed4ae978d4536dd8a7252d4011d9bb9c442fe8b2a58a6b322af56badd671cef730ca8cba6910face9e6c3cd211a45384a7dda3e159898f0d3450aa092b79c31ee0f945fbc35fc842ba0ed0745cc7d2e6fb6c07b5eab3756c0a6cde0010f7ffa1f7fc3f8310f560ba69c0fba8a07e930d61ed5b47a6980858616a2444dc2d2808544533fb5b133e4b82f4878adbe78eebc99ea3654fb959be3e34b7891ce4f8c9faeb240d1f4d3c49c6cb125fc241c7075e68f76899ad637e2cbd4c7f3dcd6bfef69b19ffdb5277bb9062d75163e60fe4fd6e9b881f29aa75d30d7e45986ae30048e56cd8864963c94666ee7055332bf7dd43e02bc17d14fcf5c204a8b4fb6f1c83d0a3bd76a5239e4d1def2d36da063ef7e1bbded2297b71ea86bbd85d91f5afa9c434ec399b53e68c641db4fd3fde374601b70617d4209dc708edbf3196b7b9715b1796864179b71f1a215682f3e13a2da21176653a2f291e2b9f355a1d5b5bb1f54affb65fc0b47140036caec75846ca3aff2caa5478676cea70264e8468601cda7537983a09a4e747ab5cb5bbb1010267935d4c14aaf47cbf226aa061d4ba55d92c75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b538c086097dec7fff9cc2378d2245032c34a28bbf51320358cadf5b13a0d77c9f4b63c6df7ef43e2db8ec562e1d1dc49232dee39216a09a14bc3b6a66d1e38f07d6dd053b835b300872a79bbaa392d17bbe19548a92a63c5948e9fc7e63dbc8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/53fd1406ce1667cf7d7de3b444b90660d76871fb",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49c01000000fc23b6c3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b040100000067f7ca9b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f0010000009dd718dd01c92f7a00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac43010000\", \"prevouts\": [\"ad873700000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\", \"baf1220000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\", \"f44440000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"3045022100e0a4d654bfb90b42ed8396f0b19a2923f65d70cdf9c17ad803a3e941babeeb9102203a20448663651d81d3f84b8cabb42872fa4c94ecb561b8d41240ec72610d456509\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"304402204dd268c7a63c16ab7f732046be3f0b6281949f30e8cdd322802c13809098811102201194a869e05bf7524d2e23d0815ec8c76c3963e40afd85dbac18decbc786757b09\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/540c6dd899720dbbc04e0f316f56549b4c1ea925",
    "content": "{\"tx\": \"c500bd8803dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6b010000005ed744c48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49501000000484908fc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43b01000000f2652ed601e58f2a00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7f5010000\", \"prevouts\": [\"d29a240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d2823f0000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\", \"17283b0000000000225120f103da370e61120ffbfed9be73547691440e55c4664603c27eb9ef615a7ccbdc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"1a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93610b0866e686ab02e02c75976444f2845fd6cde7bfef10e820cc3554ce683941d801cbe9d84ce1e82e006940c90d66235295537a514918e448d1b01c99be1031af2727a08c83da142d000f7f66d34a23554b296f940ffe81022e50f50dcfdd8b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93604a96bcdb01a6195bb6a7c9814761d079ee609b3dd4c3742d889e5f8a10b718d8e84781bad1ba81b7ce5b7be6cf9bec34b59091704d19096b61e5a37e7aa266c56798b11c96dafc2935d577afad31a6537ce4b1a48ff27833822cff5fe95a51e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/542c02db48e5517905eab16fd96de2d76702fe3a",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1701000000233e40828bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c407000000004acef7c7044c5ca200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72614dd3a\", \"prevouts\": [\"a8956b0000000000225a202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"ca23390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b83a6cc838fe4ff92a9af858d2efde524ed333cea01ebbc4b7f4773fab924030cf11433ef5c5edaafe13139710b3980b471a60ecd69fa7ace7bec388560a62f3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/54305f14909100e1757674ae16a759d855c4a647",
    "content": "{\"tx\": \"c7be2d510260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f2000000007a27fcd68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d300000000f23e2aa40213964400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898778fe3e3b\", \"prevouts\": [\"d736110000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\", \"8239350000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"4e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8d1fd3f29d710dd7ef94713df6d8e3b931ee02ef1dd830d0dcb285a37875735c080d03cc4210f6c8d536ca11754de7a86c068de81055f4750ba9e0b801f8560f6a4a8046f0466b39966676954eca5d67ee52b1615e6fe46612ea9ab4edfa131fb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365455e544596f3c60eab5a6f875fbfa3721cb31fe6673b63508e23ee0c4afbad49fcb6847defd4ab5435e313e937417091a847a9b6ba01e1bd1b0fdc0d1cd93789d8abe9ca6155576d0a7d6ce7b2728ac84476385b9c54c38b8a9cbf195895186ab153920b849b6028620ffd2b7e486a6f5e2411aa058dab621c72a45f67f5d8e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5445a326ed6ffd6f95dc9cb3c9514a0e53f4868a",
    "content": "{\"tx\": \"b183537402dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b730000000029171eb98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40a010000006f30ebce04500f4f000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374879e627060\", \"prevouts\": [\"76491f00000000002251200e94bfc4da0ec878710fc6e63dfa8cf2888c96cc8603d6f04301c7800d453852\", \"9dc6310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_e0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"69afd9f2ddf550f3dd28592c7380f6c43b680e7036a7e1325978b3dda47c48a9fc9cc357a211b8a77a00c9aab0f07118928ec2ebd9374228306de27069bd85ab03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fe7e2ce76ac9de3d83c57f6b8ffe06733f41ab6ba2920b76dc2b58409a3f33df5b3c3855ba7e35dd51bb495d54e8c4e7d48aacd1b8c6ae9156e40513ebb7b1e0e0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/545537c377201418fedef933281d2dcbea90a159",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc6010000004f2f5a8ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf201000000518448d70270749900000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c5000000\", \"prevouts\": [\"81447d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e7081f000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100ca3fb19553c8baf1e000b5f9d1dc48f89e80310337390a5c8ac284f198bfb4ea022039aad2d42b72abd50815651f388ddfcf8665c85b154fbf5af5a0733c7ac9c64283004c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100cf545cf82bbadd5f2ce6a14fe973403c54b610283ad94017a534545ac22651f3022078a099f994710d330f10db2334471551190563fd7bd9e2b9b8393931ca2c68ba8301014c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/547539d40d65ab39026f065bc9152d96c7c4ad43",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1f01000000f063541e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bf010000003a54a79804b961930000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7969a010000\", \"prevouts\": [\"f0058500000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"6a541100000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ae6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936773136ea4d9f4c1bceb0dcfda29bf9f5f26c6bb27d9ca969f75ef19eed55ea123f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08225f2fc2293577bab1371dd996050d2a4e8a01eb34ee2db6c09974277461b3e6691bbc3b31bcff977684854464ae3dc2a24522286fe393648b51abc79cc246ff8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362f5e72664d40ec18feba23359c060b0289d5f21df5bacfea8d53f38e9c21f97b575d1df7a3e4c47ed4bae99c3344f7d42d0c4d3b112e8138771efc2bc74e29dd3ff737734404bbc9015f34371be38b9f5376f1a60720e7cf7da81354011ad4f7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/54ab5c42625d4869197c04f218c443750527c92e",
    "content": "{\"tx\": \"103e89be02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b830000000082ed4bd360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709600000000ede849cf0184480a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e70c17ce26\", \"prevouts\": [\"149c1f000000000017a914bf07e8218e5a3c93fa381357100b6dba1ff2a91287\", \"e7361200000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2354212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"f76e93c925e04e4c813605eae544eec8140e2351cd3f147a2f144173f57b90bf742eb4d523deb2161014d82e5c33c9681a1814e02147707e45695d7109d47601\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/54b4f9842dadbaeb2ac90b0f6d8177f76ce3f9a1",
    "content": "{\"tx\": \"1a7ddf0002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1600000000f71b52aabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbb00000000a38578fe04d6958f00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fccc000000\", \"prevouts\": [\"8900200000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"aa79720000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902388f390252817a200d6a40b588cfd04424d7c863834fdadf2a5db7f53d0c9dca8714303aea8393b95fb4f03ff7c6d8bd81a114e707235dd037520ca8be53b9fc3949a8a200c185a2ab0073e0132e629141577b84b734599034766f2bd19d19705f25dcfab7104448de0500ef7cb84860dda1b8f6d15bd93e83a23a206ec45dd013b1642c17ad3751e6dc8e6e72c20796033afff3200a40597292fbed0a7ca63c06636903a9bd8737354dd3a35ce5824a7d6409d43abd04d1a292be47a547a74f23540d7e7c315e59c7a1dd490565bca6bb8b89d01e5eccbbcbfc10b93d31ab705752a449b1f493bcdae4f9a494b781096876ccaad39c83330c07ed7217b81aa6d91d214f1dfd4dbea38292dccaa6034bc1dea4d0c58a3ab7d77734f3d1e7301ae0ff77b861f5f5e8c51a09656046e0c111c0d2d2b5062aface8dfa1191588d67d6990a6e2a3783328cf505ce47c443a415ef150f8b5448a66ad70e80120186d54b7d940dee872a677a7ce666e0b2c45c6cbeb76248639ca4eca5e7dd731eb542ba030fd6ae3bde665869e37a99d02ccb6b74d59a678dae7a95456654125ee24086dcaae272e76e75cb985f53cdc6c1143b5e18bafbb6eb09d44fa24cf97381a83c321856199f66ddf6c4fa4c4d9ef99b29bcb1ea83398ee8837cd56a969288cd21821e4cf91b22396ec02366273df529efa96eb5ad833b06903f0dd5c0a90691fc28a7df4b74d5aef475\", \"017d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad606e86ced54a653210e8da1037051c2b45f06b64d9f9b7dc936ee1cca52c733f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828874369940c44314cd428c72b977b6d1fa375b1e54ddd71363c505e3530065c38810a2a55ef559e3dd2f859359930339f67e2de31eeac841179b888fd41fd8a3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022d34c754e8621d84f7dc68399121c706d613dc2e9eff25991ab6830780143a43b36aad5ded905e3f3d9a7a80a5cfbdc8432f2e27b8b61adc8ff9026ac400580c62d0dc3f9603273adc4c50a26528a996fb7f50bef113005bb18a1c01e37f633e3ecb79f9a967672d37c616eeea812b04e498b569686dc40ee2434c42588d5eb9ac0750207f0bca4aa6fd92c179c6787658f75de6c5269d0984b0852945fe02fbde9d0436e8dfed7cc5309f95959d5243eb38a380a11907f31410c482e45f643dd664872732407a32a3dadd0586a8608d6bb7735c7356377b5221827c80c69cad2b1398174ca99c3f1a484a29f44e8a1b8547540ef2e65cb54a09d22c95fee64949a3185aa597378fd1a508b75736df72d2627f2002ec15a4cc107440ba80ebaf40966ee924391f7b776e003a444820bdd3f318034bad7b6665612f96e2f06b39858bbfeeb5ae83c3434f53f48bd65421ef2685bb5b164cf18c1dc21e1f33e64e7ffccb416ceee437ea50c7b59c8b64d0334415a78218dcda72f6711bb631b383c971c3c75e86f8d63171f7a939b17949a189a96d8cf6d1dc4652d85fd22b935edb6c8706c8b8ff56fdb3a3ee87c09f826d9eee80e5a2fa4a84287619dc0224b3346c6c2350e8b85d4c779a3bd398fff33dc8c3a093edf4736cd8315aa88a66dd47006b31affd5361fa5b30db1879c7a2a2367bddec86fa4dad85cd26f0091f856c0d38bde4f051fcbf75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361cd8248981863bf5208678f4a8be84ce1e7bd946743b34df66b16d7c3eaa91323f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828874369940c44314cd428c72b977b6d1fa375b1e54ddd71363c505e3530065c38810a2a55ef559e3dd2f859359930339f67e2de31eeac841179b888fd41fd8a3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/54b9966d625700d7ab8b6fb6e1c3e019b5a09f6c",
    "content": "{\"tx\": \"db5803d80260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e101000000d732cef260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d301000000446240800499271f000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac2c32be27\", \"prevouts\": [\"b1ce1000000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"4fef0f0000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_cs_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a25721145276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b1f8db07571db89d159078fb87ed3ecf6e2f05159390af1113a68eb7e26caf0e06184d946290dda3ef2a7026fa03675e437c\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a25721145276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/54bb653bb1662d8b2730bde1e4a255606fea193d",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270350000000098af0dd360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701f00000000ce699485013f66180000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e77b030000\", \"prevouts\": [\"54ae1000000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"fe110f00000000002253202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7e4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4efe8c29822d261ccff72913d153de8b886275dc8d15210ffbb43fd45d8b4e8e401215e29d5d13de3b6ed62165bc3378402ce71158bd1208562fc299f33fc22fc39b3065f81e3c179a5faa7416c7afc60db6bda904d6a600fd6a7a1aeafb2cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bdda9588126290ab75e3f97a29526139f210dcc234ab0ba271134ea4893d76ef82f3f1132320d0959751765567119a0f105dea34ff98e3a4034ab732ff09dfdbb3b80bda1b133ebf5523b41a15c88aa3d5202619e06dcb6a8f4a5442678614e2fc39b3065f81e3c179a5faa7416c7afc60db6bda904d6a600fd6a7a1aeafb2cb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/54c4a1f796d9ff3acf74d30faba1654e46cb8e87",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6c01000000caf387b6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0701000000d913f3dbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf000000000d47bb5d904ec5a0d010000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acef05f434\", \"prevouts\": [\"5591730000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"a0b64e0000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"88954d00000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"e2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368982585ef19be154a5d0887475e9222bb71fccbba422f418bf7ba462437a3b52233ca416c78a4619c687785de007f14a4879f9c7a0556256e1b46b2a7e5a39b3c2782374d67da9500785d400f7ef10ae84f146bbb568355094c68456b68f7a283b30ae9fa149c8f8e298eb730b57bfc5eb02dfdad9864c9ec3129b8b9775e615\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b0e6ddebd74405781922a3c06ec9e019fa66c9803c79b531f33e986452ce61d5d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51ab4aa5d5e3dbd00e7a6b81724e903c1ca482dc7bc8339f552afc52b4f38fc6a5b77966166a359aa5541e77c34a58fd9dcb7d88ef6e7e0cd0e140e1adf959d28b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/54db865605c4886df424d455f6674d7c9f904922",
    "content": "{\"tx\": \"4a229c5502dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc200000000278d4f8dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9301000000fe6f74e00168477700000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac24030000\", \"prevouts\": [\"784b60000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\", \"40117a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/codesep_pk\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"86b2803b04d84f0eb0060af0d56d7c94695f84ce42b701b577ff1355e93ec5b1f2364568ac950202219443dbed6f24cf5dc3d6753b4891db677aea328f69552b81\", \"ab20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b48512f8e6e82cca8f3eef972de21f1531c72d4d209707723bcdf2a49924bb9a\", \"50f3dc1e441fa570b2c205a4cbcd4936eb67a7d6a442efb819ff13ce3318b08c793621b40d973b62bb102fafa78f3d776ee86a9ae954d2894c881fb3607da72be48b173d4b31b54bcd9d3453cda3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"96e2526a50b6f736a62bb7e8af12381ad71571cde2da557b0011f006bf8fa823f96e9a5622a8100b6cfe6a068fb058a3b56f1f0dc0dbe256526e4061b54c3c1e81\", \"ab20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b48512f8e6e82cca8f3eef972de21f1531c72d4d209707723bcdf2a49924bb9a\", \"507412f72ab3d1c93d00e1664a84df69b93d8b3be23e71a919109a94bb98bf61eff93b4ae554c792f895f382099c31873c4c9d7666117b297303093b28c62cd83f299395514c19ebf1ae7e752082d59df36745ec5821b35b9e7b902584b4d7c2993aed093739984da7ece808984b829a0f708fc04a0f2d496d6b14c48aff278db51a819c0001f5c25bcff36fa15a499fe739ab20bfa3dce95bc60fdc0a778d154449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/54eef01ce1e7ec1e6b58bb1a7e192b0e5d3a98e8",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9000000000e38806fadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b27000000003c867fec04b7aea000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df979722368987b2879b25\", \"prevouts\": [\"4d15810000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\", \"1f522100000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"087d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364cb173d9968a47ba6c5c74f630df9011e2eaca208cfb301cadfc15d58ec381f47a9c5848e7797e88ab157cf3f92cb1e084ad7139395a6330a6d0efe4ec0158f0520a79ac573d08fada6e0a495a70546abebfe2eb256837e38d30334686ccae33\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e881f944ef569cf36d808a56aaa75ca2fdbdf4182c26b1d87989a6b5ad676759bc691c2a9908d9e7287fb91837cd9c32b2a21ac331bb306f4648aa27bb40422e45371e41a07562523a12648be26bdba66be78ce7e249298c356e66cf29847872e0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/54fe044e4c6d4dfed594e15518f9550df3910bc9",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49d0000000063080aaebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa801000000660303ee60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ba01000000be4370b5010fb78c0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7d8000000\", \"prevouts\": [\"c21240000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"da9f8400000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"a0b10f00000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"557d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e283c6292a6ae3f7cd2fa90a42d11f5a54bea63a95cab37375097c35ac3f3911dda77d1c2cfbe9569ee5db2c51580a9857624040db9177af617be0771cc5b8a1b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8cf2f607c60f6c156b7df40b9550df6641a796550f01570d3040f84cea15217bcf33eaf0e0e2046a2b327db0183a88d397c5be0a86c812e98815a20f9da9843a2a4c5d50721208c85113b157b4dd4688510f63bd33d4c90ece0d9e0afcb8224b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/55222bbf499234ced0243f0c54a06a8e01ee78e8",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd60000000099b168e7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb2000000007a2554fd01db7f7600000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac30020000\", \"prevouts\": [\"05864a0000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"291c560000000000225120327f04e65f02f8e03ce78ab2157c33b783b64287146459b669c40017b50fedbf\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e24c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93605be3ea16000e1e5d0cd0f286bdd228006eef88980c7cd756b0c9f357e0882437c6ac6071aeb5642f86cbd8c403a36f49b1ae971c310fa0b2c6d23cdcc52f9ae3b30ae9fa149c8f8e298eb730b57bfc5eb02dfdad9864c9ec3129b8b9775e615\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c8536a7660b750cdfc13bd850c6f9f37445f5bbdab2263015cd8e07ff5f1c21f1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045b0bd2b339cdab1cb752df7db1bf10e0fcc4b57fed7d380ff50ba3a0b4b018724b77966166a359aa5541e77c34a58fd9dcb7d88ef6e7e0cd0e140e1adf959d28b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/55296a40c4a4eec0b8b959e6e4af29fbf647774b",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0901000000304617538bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41901000000d85fa7830225df550000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ace8000000\", \"prevouts\": [\"d42d200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"517537000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"30440220114488f8f5c7e9e144d29160202126703340e984a92b22cccd20706b0142ee8d022021ffa4d7437815ac5986054c7ec78518ff5ff7c6eca09782bba6fc69c443718503\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"30440220344a4119ee7599c9e9aeae585b1cad52c732c9eaa20dea4990ec34e8fd2939a102205d792198fa4ebef703067516c2b289ac552a5ef9aaa6868e237a0f5d959695b703\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/554254ae450e17abd46d3c290600e3620f888246",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41c00000000082f34b00462563f000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8740972a26\", \"prevouts\": [\"732642000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09026ec1278f9175ea9964c62306ee2f96c56f3c68684d05706764e8959eac1b5c94278d497170172440f5b7d26901090663278279b1e81477650ef80cfa97271f3eb85b519bc44e0226f23d1d2a79836aa3f792eb7eb50e3c5d7a4cea0803d0635243a29f5b99a6d7a4daaf80317951520f213c8d090ff6a0e4e2ae7e95faca525d97ec42bd9de4027d1ae98cdba59971af909df2814bbc9fb58f4d717017ac6035eaac3ccdc2de8862fa6f7b2b1982105bed692dac05c49675343e18bac994f810665c87ce9f9e2788d6a54d5c94f6736ce00793dcceb718ee8d31e0a380f49129f62a0a8f895d2cbb38203224906587a7dede5edb4f4880ff642c2591bea0e90ff8d795de06e51e618d53b4c7c9c89d3f657533aad57390e8f4989e489b23c6f3621969f1f48155cdaa19b36f668bff036b894e944af6d381d52ee8e1439c86b9d1f7974a51bc084c30f3190264aada52154c85f4b8fc0b2b4eebd391a32350af604a788ea95062f8da07e4790fa52a2988586b964afac0ba57e5dcb529e1ea5409da8396df60271667f9c619ef715c570c743b3b85c9d41ac098d83b64c079740bbc5f1c085567ef6ffaed37b24922dd5134c63adb756ee4a1c1993f7d905790c5a809c75467b6b8999fffd208583bcef1a41ff4f241cb30cf4f3ca6c747f4cd1cd5ce87951b8b464f95eb95f62373b9f3eb7c4caa93b2c7687c81f3aaf36a4147d8af5fc41bb7a89175ce\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366964dc31804cc2f0bf098e3336240100d67f6f4f6698d2be2bda5f0de8a283d2a253f0d292bf616dfa5076ba7d0aea90d79076a752abe834699a79484c5e1632ab692e734634bfaf43d653c1e6f6d8e8d14797d8e4fda7a04cf5eec270202b46d11737bfd86c40bc108767f37b7ad1553e96cd0852cc5d3aae7d4d5919ea2951\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09028c2a3a94e400901a5d9568cbf428fb68b23dbd7bb7ae669cf90c06fcf43682d9e6846744ef634dc0aeb164dbda0eeef5a484a5eb0aba51c09f0dcc226b33f8285139e6958a372be06c0492260bfe3651eb86b2005fa4497a0a4658a0b25677304c3d0a348113392614ca63edc0f58a2982b29bfb23963681d029cbc73fc67cba91fcde9a7ebd424c061d732ad09ee638ddc22dc71ea4b756dc8ab0e0cbe7ba38649f84fc1afe16ab82d22dc4f59447c1ecc816e98516bec89b4b901b12913e2950c1fca82aa9d9639eb061264b731898032c2e57e2a6f89c199e5ba052e5d28d5a3fd2744baa6e9e53687a3aff6827b164695374932f4ef6b2347a34e7353e036cbb225353729997abb8eddc8246b149ae8b2c40a9b99396cec58a22d94f5408ea31e71d0b8680c02833404b7b1531c2475f33d852c5907a03a6df1b89cce8fbaf50a7a7728fbf820858c4f84bdb4e548a66e1a8aec0bd91f872ff5058d13f3754bf87507415e241cc322836baffd447c619d2fbdef394f0dd53de6af9a03f4b3f34a2b0bdf3f3d4cea8b920ae29895946b592876e8d7bf60d672a64c188575d5c420b502c7d1b5bcd756b4c8621951c28065c897aa8f4ceb70292c3db5fea94a3502b53ae587c16cff828d826e341ca5cb446d783c23bfd68835e158ff7addfac61df8b7bc154842033a2c6d5209105d96009c813e4a97c6e99c0b480505387e3793ea6093038b69d7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a9519128ceaa4d58cf3fb9f4d9c0523c691437b9e7fff300bc110a05f7f4d056a253f0d292bf616dfa5076ba7d0aea90d79076a752abe834699a79484c5e1632ab692e734634bfaf43d653c1e6f6d8e8d14797d8e4fda7a04cf5eec270202b46d11737bfd86c40bc108767f37b7ad1553e96cd0852cc5d3aae7d4d5919ea2951\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/554ee85d50ac67df97fb01a2eb533f4a62a41c9f",
    "content": "{\"tx\": \"1856b3df02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4e01000000bd0fc0dd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b0010000008f497eb404b1cd82000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87c40df233\", \"prevouts\": [\"dc4e490000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\", \"11a53b00000000002255202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e5978118d5ab7952e4e6e4d5a8c98c5e9f64c85c89fdf7e3707edd32a9535f8ce29fc39d031b595a30ca3ad31811cebf67b7a27203d8b37a4c7ce5a7310277e5\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/555fcf75ef7ac731ace1cd81886b6cc1b013e911",
    "content": "{\"tx\": \"35c5f7e30260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270220200000096b2ecaf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44c00000000bf5276d503061a48000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df979722368987c030cb56\", \"prevouts\": [\"02ee0d0000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\", \"ee013c0000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09026973b5783f65fbdfbbb97c1e803fb4c9de0c7d1238f104174b03dcc9d587b2b9c7a82559d322149f38f17069afe237e939823f7faa63468e2fb6755a0f0b5067ced966a74f0d3ff0a8a381cc0535ec87eb62aec54d1d08568aea1a998ed54a699132e4cf163174a04f14bd280b10424ce95a02d106929bfb8fdde7a32350ccef8fc012c01e324d8834ff8988dd9e961973f66d0b3e6ece3151a74db71e4b406a4d9bd45cf7ee5c48004657fbb603b5f186643b9397739dea5870434c69a3a493795b619b5b89d74ac57db568992f7d1602f2c27c8dfc5466c7f15d04743ed9a153062c93039010ec75696ba888bd1752c31b842b4d96b0a868190e201bbd6b49d96a958e176f694d9dbecfefbfccb04f16b4e4459912ff369eee76e2d0ab2b4aa2cb9ceed00ee07d05dc1585556ea17d3aaa3b438e6cafdc28ae56db03a406ffd750acc125ed3f24b90d842e808439f4b60941a7d2125a81ec4ef78a7268f8b9ca6ce0ea9179ffd152bd48e8da676f9adeb3eb9b1fb7642fd37122da0e08f13317dcea0a0e3fba7019e29a821b49e39d29ce012b796648d42235bc1929e8172317bff6b2689e8937cecd2652a12bfb2e63192ac9014d9402cb7d18fac115019a543b759fd356b05a86517812e2c4ae4767c73844b1806d4d1e3fa2a4d97c3b1a356ead13e3f969fad22e951f8ad8d072a820d8ec5dae79a4b2926100c405a455481f2fb7348a65eda875\", \"477d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082a24674935b347637fb115fbceef28e6d08e5e47afc6eaa336546ee2e891e964bfd9e929a06047270fff43ba4c6b47136464c62381aba7ed74ab98bc69d199aa4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a994f7cab56864b639d7532171fa7080452b27cc8e4b12c31b45397a6308c0f57382b72241ded327b4632b43f8273d85ed97108114527bbbe415ba0f43d03d38d27d899995919882cb51bc8776324deaa71ff4dcdf96920bb2d7144dbed4f89ecab199dd4b45f01847e18aeceb6769111cd83d93d08dbbf50a23010d21dd752d04ec47a002034ffc182d0b35cefe21873e8f0deacdee0e5e657a4c2c9e1001e31fb951d9e97d18090521ca92652320640bede5c8a221378d55f11611752a778860aa7e3c63a59557b215364415af71d7df84fe7a89917c52af5ea0dd579936fea81f1d0f22e7454aab7401132a5bcde5e26647201d92336f2bc6679a4d7dbf1f58bbb7773d7312f5b173e77b6c3382d8f62fc893466309baf14b8dd04f8dd6300fc213476f98c4b8dbc872395792ffe774e158a6e8ed74bba26b7710ecb2cb352993bf272018b05fb0b9aa7711a8c2452563bcbb1a23ecb614327a28ddbe85ec18189b62d977384f33a2184146f7c498e98e473d2f8bac35455d6cef9db022edc7eaa9be12223f1ec26ba88ff210c26b49d27e73bbbdfbc4bf09196f45904fbe71d1c2378533cc9e9f742b54f16c0152a9cbbc131f359e0456ba056ef192b47ef428af365e825b0bbf3f9bc63acf3f48328a80679c972e1487d7bb561ce6052136a63fc7d90562089b1785c8165f81567c0a365229737245aa03d8c663aa0ba438817bcc7766d3bced75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b0d94273a00f5b73468b8b6c7a839b831dc0df283de3dbe2175dff60161da024ff81b1159cd56b1887f265c0d653f3c782f8c9b1bd8992faa992c6296a364de747adf318628644459e7d8d4ba81b7833f70746497cdf0fced2937ab961dc2be46657009e9173c5ef8826379cea4b8c999e3ae37a5805e4cc6da117a3d2ee0eec\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/555fe6827560beb47e96016c2aae78850a4e345c",
    "content": "{\"tx\": \"26bea3fc01dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c970100000075c2f08501cec6000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7bc98653d\", \"prevouts\": [\"57144c000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2eaa8d5c089018ad5270968232d49205851ae61fce62758bd75b66eb5f615fa421a3365c10fe5f11234c962ded42d732ce69c3aa764a03d4d87b859c333e8a4102\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ab684fe283f2e3a6ba9ca683327d7f1dc3759c793bdf64459499ca596375323b89b4fe5ae5af3e190f35d63c5129b5192c5c417a5c6e1bae88139c0ceaab809202\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/556a65730f4092db6fd77c12b631d10117d47033",
    "content": "{\"tx\": \"28a354820260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ff00000000be3b46b4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1a020000000e78c7d001ff502400000000001600149d38710eb90e420b159c7a9263994c88e6810bc79c000000\", \"prevouts\": [\"1ea6100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9e2f22000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"eb4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360c54e1ada67eb35c9fc75440012c0966dedc9197e6aa1f92cced4ba861a6e0736873018117c319506164013bcdec2d285df0b840d64f5a35ebdb06eb3e2afdaba9431f387a803f7df77af21560d586d92c96180a56916d6b7efaaea6f10ba4ca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51434501c222c2b9303845523b2a5615208b9d5e9b8dddf3d495d8511b54149dc414f0d108097d00934ef2973385fcf188ce2945eb833bd9e90fcb9cf025505833cf9ce2244c675144b577c27c052f9ebd481172245e28e9502c6c6e8f12c64fa6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/556db9cb87763f9c127e87edfb88a8e8443c00d6",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf48000000009d982271dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c76010000002843b97c03ee7dca0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787fd93ba45\", \"prevouts\": [\"a3c46e00000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\", \"81d15d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_b7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"05f60808292ccef731638e9b9747c64e9435dbc9ba39b0e398d17e49dbebf458eee028085fff295713a4ce747ef3d6634c6a1108001022d25cb6881cfa3bff3681\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b7e65707080c7e7248f0619dda3bad03e440bb6597604bc9ba48730a7bea7f137df02784b49116fd665559aca61deb00c6e519c846f32d4dd1be10d8064350d2b7\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5581fa4307ec84b987cdfaee72db964e4a304876",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47b000000002870fb82024be0380000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478780db7c61\", \"prevouts\": [\"c82a3b00000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7f\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936db342938b39be9e12773a9624b573dbb1df9d93500dc93058087a84b4280ff8e70f73741da43ca43557c58f6aa15023f4cf70566ac935702465d6fb0f93d4429f8d5397512e216c7ab52609f0ab27ccbbfd2b7e561d7599ada55e292956af911ecddbcce676de51918ff82e75e695523ce4d8df7d4ec353d45ae6331617767e1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb44a1c4274957806206aadadfd15cabecf517c42c49a66a44e84081097b7475aac480120d5a477c096fbef97d1ee2aeb957fc425ff8aedf322b93097b3a97db744cf5fd42f9969f7f2472ed1fa62ffa49909a09466cf06ef7c57cb1be351156c54\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/55944a2b94a2ca58cff331e3ef254a2869f5fb50",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6701000000a473d9cfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cda0000000076ecb2df043144cd0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7edb0fd40\", \"prevouts\": [\"2b0574000000000017a9146f2d26adc5ad58653becfc45ce03a0b1167b1b7e87\", \"56ed5a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_32\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0d0ab90d46e1643d1ec1fea1cadfb2cc8056cf235a7fe16e181860d7c2c2dd9bfba013dd7d8e1c981f5634e3824897f3a18707edfb4b969727b09a6ae64c731e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a7cf9360233f1ea7d86199a6314b754746092474f24a0872e6ad147b010ab9a589c1835806f024834f0f92703a0ac9d6fd46ece753742dddc5994b5d66046cc232\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/55b0896604f6a6b38c17cf95f8c053e19d26090c",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4b010000006599e3b460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e9010000002319b8e0033a632e000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7a3600632\", \"prevouts\": [\"b22e1f00000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\", \"0de6100000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"b37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936903d2a659aad03c667a6b873e21cea168414c29d3474a9880634e3e12e550e8c33479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a368ced990ebadb111ebc3982eac7e308f07f99a9264ca6c949f56162916d7884\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93613226b488a95574c43053209c9e6fe8a3ea8bc7dade3cccc06ee2b8f5d857db7ebec8f444f9538a00b5e533aa370349d7181cba703021b72fe611d481b359a8e62055c347ba5402321504576f6c37d0c6cb1d044ee75df535bc9eec0560634a7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/55c61e7a6bf6a7b27176d90e85c792e38fa47d95",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c890100000045a341c4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfd010000000a8f2aea0184814a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e742cdbc45\", \"prevouts\": [\"97085a00000000002251201dfb228dec79c6e234b1139c58dcf8de3e24a7459acbe9e029f267c6e1783b9a\", \"44315d000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"627d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457a979a031634820b293704e38f33c20e5acd9cb2a8735bda71fecc5f77708044027529efe07ed3ec82dce77345a5c0eb368b138839946732056b6a908dbf5f05c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b02092f1126067d557fddf65a3b2c06c88f3692f671d91058df5d5c8f702785989c476762c97a1f480fe93da3602a750f62c0ee9bbab5a4ae1c7a4219e84dbc327529efe07ed3ec82dce77345a5c0eb368b138839946732056b6a908dbf5f05c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/55c9ce0b7ccbe8ff676abebe7761bee66f38e3bc",
    "content": "{\"tx\": \"17d518f302dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5800000000e32f0abb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48400000000644a2ed2022f4f5700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc20000000\", \"prevouts\": [\"c7ec230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b9703500000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_f0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5d8de6d1280b5ba87a728e458102f7fec26e020d165021a26baf894cd1424d2bd56e5d09829f99a16dc6a7595e066c8cf463c0d412ff743f029baef8c146a30381\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"48b8dbb88cb5aae0fe5e459a51a3b95dfe7e8cde85b9216a0ea4179884fe651e485ffb8a79463a62a77755ccb5b66f5c38a60dd7564181ca048303089316f134f0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/55cabf94b48b77fc7b0a87efd62377c6a44cfd3d",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca500000000141df85c01b8e702000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48727030000\", \"prevouts\": [\"6eeb510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_45\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b73e5396a76e0c5e3fc6e042edaa12f5a8a8be428d19c023c1afa7b5c9d55f14e0276261e40dd940704155e3015fb3ba68c2f62369c387a53e54c4875f79bb2901\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"792486511c28a806d5c3b5d66dbc15d733e09e541e899e41fa1a7d986e85fe3ec8150262372dc884c8e357af5444fc592b1886497edb697e77b0ee53e892d53b45\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/55db8d546fc7e337dd899c328c82a60b6102a7b5",
    "content": "{\"tx\": \"3f83490e02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf29010000004679f882dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7001000000ded352b204041c8c00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487ae53ff24\", \"prevouts\": [\"18d9660000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"dbd8260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_f3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"48de2e16b4bcaf95bd071a9832c7ce33fee167fcd6292e5eb8c6155a84a992ed9a88955a56979512b2ff872c353f5f3503e5954e524a2442f7b2db2e1cfb3cca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61d9ec5c3d0de53d1eb1d56733a4abd08e9a31f376436e54b83b5a0cec7eaa03bd94cb128f620fd8cc43e0d9359d8d68f9e7bee462abb2999d6467e21fc806f9f3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/55f99e2d68ee85b75133f78cb948a5b7466cb4ea",
    "content": "{\"tx\": \"b07ccdb3028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40e02000000ac2245c68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48c0000000092334be801f08a5b000000000017a914719f78084af863e000acd618ba76df979722368987818e012b\", \"prevouts\": [\"35c53600000000001658142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"1c5737000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063e868\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361b3d4b3c1d12642e7710cbf88d90f6ee341056f129c03c206ce123214db4cfdc886d39c7fd191823f2d71d70dbb2b614916cf5220a36a0556ea0e320955e8896770b862ef93acb6091cb4ff8ef135b3065b278142aa4adab757f952a626e2b26c80764b3c3e93e4958bf58fae47a07e6a3ac966c9bf86a1c799b8570c4674755\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93621ca571378a3ebc1b3d88db0fcc1864f60e2af1eb346e9dd3894589a6bf4e26ad39fd96f2153f8e279dd396423519f362f93616cb37cbc9b2f05e3e7bc75ada5276a8166e5256dc9010e53101dfdb6dbd4fafdb1e785ffcbffe7e4bfe923fbf99aaad3e4ddcb787e09feaf57a938d0a46e7e94627a74ec9b410f8a5374ea1d35\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/55faab0c69903138a86beca8e6ebc3e7a2010e0b",
    "content": "{\"tx\": \"85324522028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47f01000000b61021addff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4e000000006b4b3e8303a56079000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7cfcfce3d\", \"prevouts\": [\"153b330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9946480000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00639968\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082c0b317c85b837bc971133c463a5a02b3e438f62c623f33a660d87550a4209620af95302e7a08635545e6c64d05a20a7ff60718981ac8a997d809f6391d7b2d9241e79d00d576d46a63d36f208105835dedf99b7ad1f6575dd8e28af32480c198\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bda2b2a0c2215fd01cbae6f9632c297c3acc6ad2e282578e936cd31657d5fa84d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51379b42341ec85aaea9ba53764a308ad79e21ba1c6bfeef93296a10f4c0e568eb3c50effc4608d2c714b1f589c510b82e2cb4bd2fb333954004903b4f08f38a79\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/55fc38b7d593fc118d407fcbd2ed49e3ea890734",
    "content": "{\"tx\": \"bf8398af01dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0300000000c148ada60492d14700000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478711010000\", \"prevouts\": [\"cb8e4900000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09028cea88127acc9c3f2a83d257282d4867ac82e62fdd8fc2f26c7f55dde4b46178da6f9b7eeea9ed1a4075a058f3396c3c513042dccf6736926551eb4ec3cee4dd100810d8ef6d792acc5011fd662d8bc2f0fe53886c81144927f8192ed8de3b9abef690be184e86fb019e00f9a8bd5bca1553246e19f4ed6af61e58dbcc8447e7117521241c6c5cf4bb5d6edccf9e2bad1d3551b8d0f89e232a4ee684f80d27f58d173257551c40097c8b0bf7b307b58387fea6cc3365425788c6ff8ec43da3840fa9b2c2c534adb81c40df06ae5aa41c006ec9484d40801d6ffe871d2c95328f9cacfed0bd223f3118e6edd9d182aa038e1ca5f1dcf40ef73008d2fcb80064c56beea0991ea0bd8dc9c64040cabeba9fa63f3596ed60725d5083b15cf5ee10b4a75882777cd4af71795ac7a31563a091f242378afac315b06e421c31775fc30fddfa14a4ce0c16e968bd83d0c96e30071c4aa1c2a3e38fa9a42bd5a4de7e8780e29632699712ca95ae0d4ccd77963378046eea4e57d6e6b72cdbb4028fa07eb69fc662eb13855b2a2c969678c7caf78e69da9e996717decac9b6883e0d619b56ef3fa13fd82f42337e8acee185a31aa77903502eeda6c407874e9c6f8d5a3c62b75be4d57ce3b884924ac9787b18b9a6b0bb89d323c8092846413f09ae47dfc53a11b403a406c01e068b7e5d611430998b35e802ba1b42fb60f8f5fd0a3d95e4b6b28e173199cd0dbc75\", \"e27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366faa7d7d2440a55ec7d139a8964ddbb0355a79c57a8fc16181baf4c33ea43944de3dcad145b88b360fb9f51ed5363f34910a171e61f360dd6bdf047d4a1b93cb212021a26ea5e00fb993aa3d0fc1bd1e431f365db69035b8e4625845fc9b697c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09025c589ef9398582c77991c45f56b5efc2fde50176ec588911636689f5d35522a0cb2104aad106d95202f371942be228197ef76d1b1ac32326f46caeea72b112cc7951803ebf5c711f2b7ae2dc3afb9db78a0742bb94326e2d74fd1b486d2cc60985f58f08420f0bc817014f7efb29c855f866bba320faea04a141a1e6337f1e58ad3253f466636a6e676f3dee84dcdcdfdb7bbd3d58be695e00961a8278a0f90383022396612925667479b4f45afc334a7a779461532a0c18bbe56bfbf6bdfd8da8aa2c3dd2a110e309a82aa347fc265ac0eee3216dd5ddfb255aacdd718685792db52995836f972461388537361de78848a9233bd94fb3f80c0197c2d2766c5aa1ef8894b3dc7a646a92e213af4431636394334e808e06b32886a68d7c2883a14eabd698a6efeb114766ba8d80d4bc1b2155135926ae23177afde428ec673e88fea8d1ae48d9cf68d97e649090a0d6e577357d0f859095304d0c49afa3288ee6148e6c0578f9d2949bdf72495eddadb407c26724ec5c9738e5bb9f6dd39da44f65068ea14592ed127304fdb0ff9c840d16252b9ac72433271f8a7e06d63524e54136b2f11556b7c3f019ab813eac9962a12b7cd305d650221b0a8dfc2c8fb195e66a8a79d1229f31d7e233debe0a284d2ae4cf26b45cd262870d9ef6487961639ea15bad889d136b10cd8c1ee5090f3f2f7a35ecef5c9377cd66ed751a8b12cd20678db29f7c9d1d1d75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694061612a85b22860c670ea907f0f210751112fdd19efc00b4f6773b6f7a9cd1d6719dae808d80c72548faab257df36cf98b115c53ace18df08612b967e5347aeebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7acec7827d9bc9e4e8e39cc141cf7690ea6843d6b50eda1fc8d5571fb149b2aabab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/56397a2ccd392deb6d3ed52e0a065fdde579e9d6",
    "content": "{\"tx\": \"69e9ad9d02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6600000000c9d7deda60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f001000000c805afc401196533000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f871b91163a\", \"prevouts\": [\"17806000000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"eed7110000000000225120934cc30b71223b04aa2af20106e445bb93ef4a67adba137dbea8fd26e6a0b3fd\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063fa68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb462b588f53b8753752456cb241f753d144ff0679dfcac60637407bf69aac4dc17f8b8afd7beb88d43ca6c6d2d58dc9425172bd95ccf582b2eeeba83616a9d27d33bc3f3b627616b9f836af78c18ce00964f5f9dce3e851898685189c72823645e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363d196519084bd9e912011a72f2be62635ef4baff1f9b0d2c0319da63472fdda3b9350299288462116e81ad139d1cf2552ad17a94ea609f697964ec86e4a0e9d9319d91594da7fa35d5ac76c3396b108bc28aa6233c389d8680e4f0461963fe656f5053dc49cb92d20c30fe5ab09c589302aa9886b9c794d18405aff33121a169\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/56567e4be5618770bb97f61b1487c7d47cf8192c",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45b010000002378e255bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2701000000bcdd8d74044f8ea9000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478740000000\", \"prevouts\": [\"780d3e000000000017a91481d4142ddc5ce7a3de4047bd48b623419b5bc45e87\", \"ab0c6d0000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"3d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8dc8c5662064e2d9613ba0f54feafa13b4a8d810a28ca520b1cd1b9628c3c1add15eb41ce20b61903eca7e2f7903a7c5f76d50ccbb22a22a302188dbad2e46b28\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361c1510f921748ad83649efcc17e75d7082e73dd380974088ab927571dfaea01cef9a48fcabec25982850a496e19df71982d596f167265e15d1ec282fb30074b91cb891527dccd7fe22077390053ac1c45ab6e7110116df1a30c9559411f432f5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5658a8d8fb388e7c7e5f7c7fc8630d3de961b676",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc4010000002b6191afdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c21020000009884a17cbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1c000000007c4b09c60226af4401000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd3000000\", \"prevouts\": [\"c299750000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"05cc5a000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"080976000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"30450221009ae58dd691f67621cb44ce3cf3e790a1490280b8d2f21b65954650b7e6ed671602201d17c98e967b79705ef30c47f115bf0d25c4d5c5e493aa026fdb46ca4725b76681\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"3045022100bf491b28ced4492824c5b34d7c4ea5a41dad5c9b629e549488b7dc11502ecad102207e6a2993212e567a96be68ba1a262b405cd70a2986eee40edd63104cb1339b8781\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5687a5e9c47486c4d2f24f74e09c95a9b9139145",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0201000000a5902247dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b260000000016a000b7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0100000000de383c3702a0e7a50000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4879304df5c\", \"prevouts\": [\"f2295f0000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\", \"0b62230000000000235f212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"bbe224000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b8812ae4910f95e260c84c81cda42194f3c09e2266ea82252a16054e3bbcb7d4240112039594c42e43c0670591365309d35ebe3c03b5fc9f3695067e9afe9545\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/56c988fc520dc9a5bafa28ad83eb0e972fd70567",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bec010000001d0a2dc2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf00100000010fb28d503d0fc6b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac4d020000\", \"prevouts\": [\"5d3d220000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"c7244c00000000002252202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"spendpath/bitflippubkey\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a95f4b2151ef091df4c7d19cb4998a3268094cd7f4dbd6d056fa9164170de7c051d60afdd8a370783bed723d081aadd37629557316957f8141a2102bb99624b8\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b78be31b16966ae882c7ab2969dfe11d69b83e8cde47f805ca2a48764752b9cbbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a95f4b2151ef091df4c7d19cb4998a3268094cd7f4dbd6d056fa9164170de7c051d60afdd8a370783bed723d081aadd37629557316957f8141a2102bb99624b8\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5962d1c04795f936b78be31b16966ae882c7ab2969dfe11d69b83e8cde47f805ca2a48764752b9cbbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/56cc448ba82bed7220a831c4b05eabed0406386b",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2000000000868a0dee04630f6000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48766030000\", \"prevouts\": [\"93c66200000000002351212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"738bdbe9cd1a5424b7d83bd7a5e298273445228a286a1ad1a0ab62ab3a890fc0260cccb593eaa605fc1be61b5642b639897bc50cbbf04051dd29a71273e862b6\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/56ed4007baeecebd4a8905063055ace47704a0dc",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40f02000000edc4c2a1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7d00000000b6e37ef8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b970000000032ac10e903965dd000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787c020353f\", \"prevouts\": [\"db0b40000000000017a9147e06846ce22cd5e23f7e03391c0538498e0e18ed87\", \"234c6c00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"693f260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_8a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"214ddaacf7c31cec6634b8d1be5bd63b8250f22ff1390f4c27302b3f77601c3840fec9785a32a74e006b3d902e6b237129e8fcc6fca01f4f93d0805bf659293402\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a52ae61876ee07852f630d8c736bb794b957e000bf42ae6d711136e967f78160e04a61022330c6b25b68162d5ab0e7f8874955632d96ec784dfeec31fde965868a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/56ff467c9c6b5e3079baa559955ba107d89d77fc",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d00100000061bcd71c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46200000000492c8d5abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfde0000000026f8a34302b303e60000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87ab000000\", \"prevouts\": [\"6f8234000000000021551f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"b983310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c2d5810000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_e5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"206fbc11d8471d1c21e61bb46107d8d1f4cf55982ff22f820131fb7f947746579cadb292d2426d0726e5451f0e79d620529e7eeee66f9b910df7ab2139b62c2f83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"67e0abac7e67c6ac12d86c06d9d916cfbbfaa3dc1220a5d266fb61dc7404582397859450a4aa65dddfc91ec49b34c57641f6c54a31e407eb362c6bbbd0a53315e5\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/570fb69de8afa341b54dd79455b6d21085c0334f",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41102000000869367a3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cef010000005d951084021acb7a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2b040000\", \"prevouts\": [\"86fc330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8835490000000000225120f42b54ceee5422b98931ba4e4259b1fe0b973d9efeacc7f6f710ee118b027bcc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936db6f858bcb140df281d7bcf64cb458d8641f6a6ea76b9d437d19719ea520e9d2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a65616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/570fc65b0c81c1473fc82b8545f5ae6efeb839ff",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c900000000e4d8689fdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2601000000013a04e50458d53300000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac3703122b\", \"prevouts\": [\"ff541200000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"f15c240000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d74c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366581f7b0ca6f1aed206970c0804a234f1a44041591cfc91f27f0238489d6aa9aaffae472ebffc4152ddce3f20794b01737e96becc2bb4a1a296a47c8ec0d29af569af0f9e86656db21fe5e74d4bdcdfc2cda5437bccaf9e3d568ba1282fc608d76e3192190387ccfa53649887be3b08a6a0e7169a64b02c3bbfb054cf523373b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f0f1548d1d073f6e5b14220ad2361e8ef5d38bb11452790f522d55796a8a82b3d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d514c1a4ef98c473095d2df256e4c96a081ff076f8ed25b9a6c5f4dacfc5de1b1d157a61376c510bdd1fc860151a3b261939fa407ec1a2d0490cf2efc4278abc783\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/57267f8aca1eeab5fdc28ec5f2cdbd6ce0d150ae",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9301000000b42ed6a28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d90000000081fe60ac049d5a9100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac47d04324\", \"prevouts\": [\"749a5a000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\", \"d2c139000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"3045022100f3c2b9d005defc4d295be85b11319da089ffa512fcf591f4803c2232dddaa1330220615e3f019f504d42bf605cacf388b06c77d9f78ac76dd3299e3e0aa2724ec5d782\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"304402202d315cbd08a6bde5a6c500c965930630db122bbae9679d6d35450b128490a32c02202891c280ebda5a3fa930a72ea6ca1f940fc1c59cd690b89523cffce410bddd0a82\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/572c410d27df3156ea85e726a966af51c9cadf8f",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccd01000000309951c10172eb4000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7ca010000\", \"prevouts\": [\"0b135b000000000017a91468f63610c45a6790781558e4d5ce83e16e8f3f3b87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2352212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"0eb4b3e6ef96cf190e4d3359e19dad29fc52872294cbd7ae7630dd5a95d2abfdb7b008f9acdbba52783b9bc8c4a580b3e3e16f383c551b11d02a41f07a84aa76\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/576476370370b5501ea6a61ac033110ea83ed7c6",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe701000000566f672760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706e01000000333580ee0250697b00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb141a65f\", \"prevouts\": [\"7df96d000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"c049100000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c44c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cebe1805b4dd002a9656fd180b0893baf3654597c23b46cc67f3675a294fa085bbd17872a9d61e54e96dfef681da77b5399be78aec05b527019b8e812e967c33a95f177959a3d24a94a797d1e607e5550897d4e95d12a52323e6e8eeeab3383c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52c4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f9cbacfb9ac71e83a18047da934e295451257fe751eace0e6de3d0887f96ea29ca92fb159a7f16850def0f13a878cd04653ddced5aa57281dcbf7f9041e8663ebbd17872a9d61e54e96dfef681da77b5399be78aec05b527019b8e812e967c33a95f177959a3d24a94a797d1e607e5550897d4e95d12a52323e6e8eeeab3383c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/57731bef67046b96aa1a3f92ffbb41851e7b3353",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c850000000050957517dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce601000000ac49e6a1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5101000000703ea34b033cef1101000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a641020000\", \"prevouts\": [\"59c348000000000017a914ff6a0b1cf86e786bc6de2387f1927f71fd08cd0c87\", \"fabd5d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a3736d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_2a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"962e277db60afc12b4bb4a72a705ce113f7bec80cbda252c3139ef94efa698dbe8d022a82d8b47ac21e1750b158786f802e4ab047f0c7940f0aadc541c95d8eb03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e4fb10238c3981b649883f9f2e22b27fc6470b306ad69b2f4b82b7ec4f763c1c731063b92a47e8fca85eea1b938bfdb8857d6bbefedeadeda7aa3805531a34572a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5777068b6f7170fa6a505e9144aa3f6fc8625b74",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cba0000000025e7d69ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5201000000d3af49b860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701202000000fc825ac201084a89000000000017a914719f78084af863e000acd618ba76df979722368987398c0a2f\", \"prevouts\": [\"33da480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"65a5590000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\", \"064711000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367952003d040c7265d30648e0fedf45af2112bf795f8359b3d6f1b95f924fe55e4f4a9cbf846248908cc3621c28de38a375d9ce3ef1fd8ded826daa29f51353851cafc3da456d473afb79353f7068dc1822b24dbf9d7eaef6a0c8c9b611b05e979feb3ebfb72e1f3a9e601929fc7eea4d0eaba4c5291f01c808279d3454a78ee1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082b6ddcef20c10c61d9e21e2293389fb4d83401974c63955ae345dea7dfe41530ea78a04935edfb84e1b4b71380d58e01ed379cbb21cec8f8440ec0fbfce597ab8cd941a6bc152cbea0496b075d4b2611b435301778200e60e8b4147cd93749673\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/578701a27b2e9321384f3e516f48fe5d2ebfad6d",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2a01000000f6816db38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c467000000004c8c3ed5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa300000000092b0a9b015b3c530000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7962ad43c56\", \"prevouts\": [\"4e8f5e00000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"562e3e00000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\", \"81d36500000000002251206ee7f50dd8b37aeb440050df10921bea288340730b764e02d5c3920c65efa447\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09028896e117af595dd9705c395be3304524f3326fb3478abb985ccccc07e8370b2e9c7e98ad8a1878c633df96638442506ae5a3eea8e092312b13480b01c654c634759653fe89282cf2b362f01b518c6fb6c1de8551ed14cb660924801ae88516a329320a5e18d8db90a660e2d775f9053c47d70815280ce3b323f09130b3a73597be2688fdac0a090647991836c98a037df01d7111fcdc2ce22b558df5cc89b339d18fc20a091dd22154159983edcd75e7a42a9b9e62f5cfa1050782a6766a4cceb16ab80fb42980559573d70c369471e307053340470e8c8c0055eb17c5617663687241fa9babe46a2865462f480c713e147302df7c28f551209bf926ce44b94054d2dbd11aa3ad8fdeda79b22fd2e8bf3e93de154fcfe21d20ca722d0aa58abfc596f5f11456ec9ac8f43b1453ff5091a32ba5fcdc218193a21eee610e998595426b582c8e94419de2792645568a5e80ba2294ed6bfafe10010919f9a75aa6093a1c3e467ed96a15c10c8a5bc6041d637d135249e664a077a73ef48fc61e8807d3276695576958046ce3d102482bb310a86886b42e0bf3b77aa9ad211c4f12e44437b152d30bf9930c2a7dc2ee2914f28865f1e811de1caa10c047f2fd5b0bdf2347fe086177c342b78cd1cffd36cffe9e10bcc0f5a3e6d60745b0f18d647843dc8161ab35d9eafb19babce364a41081b0c25a5267e79fc3f52598302d81df81853cfc46e37458596a75\", \"047d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3af26a389e120e94680e27477caee46163f2ffed4e6499d7dcb61a15b1d76a7c8460181b685601280cbfaae0e90478ea5ae6fea73a2d03f5a79a14a3e0c6d503\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ef9653cd2c33b2efda403841c7fb73246623be34cb46bd0aaced5451f10c6fbe9d50dd7277c2b035e2430dcda8810b0e8584ad371be4ebe16d6f002310bbebe35dbd251f91d17738ec0385d7dc4142edf110374e4434eed04175a82b399a61fe4fd84868f26a4a555c4a850da174f16a36ffcb3631da7a6aa146287e4504ec22f5518f4415f35cfa3338a5e9aea294bf7f1803433042442d5e9fe904f77a6027dfb02fdefeed29c12d5f71fa089a144aab28e710cc7a9a069d0528dd4df4291c63b1c77d16a6eeba92bfc6e73fe3713be4b38a268e38b55c6df93b02bd46f46146361e2db556a3d63530d87d38c5b517a78324133e226909a0e891811576e119301efaee047375cc6194560406e3a406ff43e4d36a277302ed308fd4dc9e8bb6d6736d632decf24ab5459404dd34cd67d356dcf5fa84c0ae2d18cc0bd54be2c1462ed825a51501f26276d1f5116bc838b15692bd42770430aeb126a35e7ad8e9b526e43b7c3d672bcac4b0cd8d4e2df4e0f4218a9b37d45804cda80d200e82ae81836957da821cef7a25c0701d97500bc42888ee8e67b1f186fca6734e3460c51c0c2a57ec5fb2508c7899fdfa0088b60dbd4905e6582bae7514231ef7ddb9edc161599a7bd72bc55d434b2944612f1cdaa47d57e8d9ef192f547d7b7cdb2afdb321f940f3d1d2ca41b4c9ea284806874a039fee9d7e5083986d301c8177d13b9320477bd4cdb0214775\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93616320590b22355b457fc3fa4c4fda2fbc5888b55a29cd6e30112b029eeab3dad9de556ac6994112f2dbe51e2f18419f84f5e3afde46d5119f13558b672a3f6371a343680beaae3fbea53ecc49afe7cbe880992a117d636f336d7d159be7b446d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/57ba07044f687929674d01d0c501e408072f02f8",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd800000000a44e63dd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bd00000000160a5735025a6d7a000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787fd27fe2e\", \"prevouts\": [\"f38748000000000017a914b0716f1bec91d4758ee97d9063c9da884dd2ba5287\", \"ebc33300000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"967d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e889b1afbd82754ccbdb229e33ad6472305abc54dae2fa9ac3a68b58b93ca8c8390ad15d5ff3e747c4643a2e7779e2cae74c1db700bc0de7d47935e7ffa6ea968f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936393d3666f153f5444bbde9f12a33ca18bffeb96af6c3b3812e1be180585532ecbf86d7708a8015fd8c392d5dfda539be3c55b3d42b83ba5bec57bef080407e280ad15d5ff3e747c4643a2e7779e2cae74c1db700bc0de7d47935e7ffa6ea968f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/57e2edb6bce9815f7e92a1cacf2c42a1d8a5ed21",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c1010000006ac7384fbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1100000000d73802e703a25eb7000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787b7000000\", \"prevouts\": [\"edca3c000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\", \"b02b7d0000000000225120dbe65d5ea7d032bcaa5c118e4e1c91ea90d9063ab0b7377212d71cac34e27d50\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"247d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936274b6042ebb9d5348c83f5ca8de85b1be0d48f115321b174dec002a2085b4af312b5d836754160f4cb099c4d8b267e29847dad01b12a09dec3875f376ae126ea3506420e788c3ffd3d8d88ddb9154e82106737a8dd2b5d0940daf68f275cd0d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936195e60e91131137c7fc5ada885ec733e6b607a015084b0ea1ecbb763e672f30dbda2774425301130c379b9a863bac2b926fc4ec0dd6af03d15dab43b60e3a64c440784f6f41cc1ae323b623cf5dcb000da45020704fab66b6b5f2ff7d67a93a3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/580742d9b18b0603cb29360f8e7cbfef479c00c6",
    "content": "{\"tx\": \"2cdaf2c70260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127012010000003b999eed60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705901000000d23472a40318961e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5f000000\", \"prevouts\": [\"05ce0e0000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\", \"bd5f1100000000001651142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3577a9f5e5afd7dec8794ec90f5b30191dc3d1d03aff482e4b3dd0ad46069d3c1df5ffe05a93b0914354000c5013e139352c853c670c19dfdbe29a79b6a88351\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5876822a1e4504b3dcd7a3ddd10ca0dafc4c9ce7",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8d000000009628e1ab8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f10100000041654ba460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c200000000352cd7d102283e7a00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7eca46228\", \"prevouts\": [\"be4828000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"99de42000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"344811000000000017a914d574841bde7bf0817694c799002118e85acf040e87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_83\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"67b122669ea9d7a03ac499c300412e9a4808c17efdf9b008efa5cae7ffb3525adfe5f7840f42178b593fba90e1011296da951f40f07e6762457d4c69363de8f883\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0e27f11d7f93665a2300ffb2feac5bf9c0d8119a059919ac703db6df7ba006cf0adebe580bbc4318c6ccc92082edb6d8c928d4d1b4cae47a46e2abbbfe78479283\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/58d98ae03e7b63b61749dae272899a7f41a89c30",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf160200000050c0ec8560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705d000000008597bb100331928b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc94010000\", \"prevouts\": [\"f8447f00000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\", \"18440f0000000000225120d1655db6fcb356decaccee2a8cc0c67c6e760726bed93f7ed1bf145bc7c6bd94\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902492faceabd608f860a47f22399d1864fe7d0d4ce3321cb876e2535b169e40c0f6893bce11d6feae29f33aeb33f16fb8a0c72d668d8817fbdf1339dd2b775ac0732f396358fe4d6117ebd38e068a3bb65c59175080482645e3daf525dd6af113075391da98059e95a23b704408ce4d3f781f311b82e669e9cfe3e07b3d8cd80c701be93d88f40bf336f2cac12691c3bdeac7e4337ce5a2eb3b8643ca096ac1835b1a06eef09b5aa00529246d5bb4ef7a170e9b32f1aee537b504d852f2df25efec7ff5dd543575b31e6d79f037adcc552536a9c122672dcd3cb3904a011a28cfefbe750bd7464748a217129cdd431d407d7333dc7dbac08daa00e073faa1cbe500a0a814fbc4f7812b8b22d58b6d133844717a4044bb8b1d950b40c34c9c095a290524c523c574957c878618e80fd77d4763771faf38b5fa5aae8e5ed1e2842915151d5b96d411dc06cf7a012af2af502020d5e42a5005cfaa26d21b8b6755b9e2a5d4215b4ded5ccc91869a3390c16bc736e283037c0d06f7a1f71a55f886ec679b2aeb88140d6ecd79865cc22865cc45e3ac021878ea9f32594a144219dfb8df3e9f4492c64daea879dbc9abfda230b1b1d02e64e516c30f6eacb0c15f35fb352adf9518c85371123fb8be9e5331b07ec4477f28cc743ff4a32a9b286a8bc5f6208cf77aed995197030de4740419f634268bc877a418ab0b9f20631daca7e06470c65a3868885809375\", \"b37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082ebec8f444f9538a00b5e533aa370349d7181cba703021b72fe611d481b359a8e62055c347ba5402321504576f6c37d0c6cb1d044ee75df535bc9eec0560634a7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090272468123f56270b4333f287cd1502515beab062f9e033575e93fcb2d4c5b2b60531b61e57d70d57171d03defe8b2385399ada175c6d235b79d6cc8281ed2116cdfb08261cc187de7185b5d6fae37c62585797544cc4e34d6945f5d04a3a9823960c6b55ea761237e10ccdeba6999731c218c5028dc51ee059acf495f31357d1f3a73058d87cbf6a2232d0b942f9b34388893dfcdaa1d38dc42a32c3c39d2443d8f5f7bac4ba8c3513115c73139bff8b02e8ff2e836b26b99312b4c689ae5d6872d6f8618c2d75a16b4b58d9292ddb7d6628bc5fedfab017ba5d03a8ea167f23e4b46c959282578ce472326f36b43a369294daeff4773aa42af1b2e54d07b438923d393d2c31146450f3634a211c9d8b4d1e8f52739d21e05ccc0b068d2182aea690bc46548dd0af9353e4f26fb7a1d839073cd66cabb352d9e5e40f035a99c0d6404bf430eebd59b900ea55a759bf7fb049f0c4845918710474168fa34e7f3f0239d6cae820434cc3377ca9bc5b199c9e149c37c89db262f7659f06dae8d9b26554f2c1b0bc51512411be4834599b825877108d495e4c640082f81f3b77c5fe68e1503b8ce987349d22f49613d934a02c06cfc98ebafb4d06854e87c7c28f3ee72b600c20f16c059fe266a349799ac0ff277743c3b4dd184d0f408e7a97881800e8667b6be3d218bc305a2e05f9eacbbf1b280e9088fe5c3d3f317727e332051083d4259ad2e0420f975\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936497c7e978e1ad8a50d6711ca68bc31cb28123919e82fa890ac36ad6e92fae3cd95b7d6bda25431cc8e02e54f2e1c95b50d23fb11d52c977ad7d2dfd588f90c1962055c347ba5402321504576f6c37d0c6cb1d044ee75df535bc9eec0560634a7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/58dd5844bf68fb5f47e929bf24c7d8dc2cab5791",
    "content": "{\"tx\": \"561ea52603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6001000000363305b7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd501000000b8f01b8d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c442010000002b7372e904bd41b000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748703000000\", \"prevouts\": [\"f0d7250000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"3f614c00000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"cdc840000000000017a9148462ed29696925d7688e1db8e76ef9e6667f05b287\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d74c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366581f7b0ca6f1aed206970c0804a234f1a44041591cfc91f27f0238489d6aa9aaffae472ebffc4152ddce3f20794b01737e96becc2bb4a1a296a47c8ec0d29af569af0f9e86656db21fe5e74d4bdcdfc2cda5437bccaf9e3d568ba1282fc608d76e3192190387ccfa53649887be3b08a6a0e7169a64b02c3bbfb054cf523373b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52d7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369fb2550e1ed51643baef309f81b6f22207378bdcce142874e2eadbef60c073106e55e6cc099b3fd5cca65d40087200ff064f8f598dc371f61f8d957b472ffb5414746b6cdbbdbe747c087a2d99e7432ddfa1db1d7a6445e7dea3810e7475536557a61376c510bdd1fc860151a3b261939fa407ec1a2d0490cf2efc4278abc783\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/58e9cc8b18e2ee0f4ef6cfa6222d9ba9c4e6999e",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f801000000038e6fa4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c00010000005e6f05c7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6c00000000737b03c302ffe3c000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac65fd242d\", \"prevouts\": [\"a82c3e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d5b75e0000000000225120733adac9df449b2595d1b217303cc00a8e3c5ae4d51e5f74120e9d2d90d81fcc\", \"1b492600000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936399ceda524fd992fa8b819159764767086827a3dfffa524bc5c8b2e9b363d21d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a29616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/58f607b447f90cc1f1f8626ebec53c5173658a3b",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706d010000001db75c8f8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e70100000040edebc3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf710000000010bd48dc0265f7b6000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc3fbaa343\", \"prevouts\": [\"9930120000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\", \"dded350000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"1558710000000000225120ba259941c99089f87a1bc06d64ef249f01ab7891d30169746f94b5a6d9357ae2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d6ac5d894ed28d75919bd671c475effc497e0fec610bb120a5968a6df92db1bec343041e033fdd8af2791d16d4589ccf5e4c305832c3fe2d018b69b91776d5506ed2b07bc22bef869f4f341e995eaf352a79c5308dc80f6bc11fe0290b3c756c33a13fab4d30d9e0f2ffeeb52ba377416ce2a4b6cb1da7c5d6782dc58c5c0fe4b0392c86968b3d41e618e714536594016ffeb97e7a3cd0e245e50d4a83cc7ab7c7de629459f517413aa269570dfe96d60a8549a65ff365354db55a744afc461058622ad905639c87dc671ba58c4dc142ae356b1ad1d31968f8b5572d0de8d96171fdaab97030d7f1e106882f7bc902bf546464513c0ec819378d0ed0cd402f69808df7a2a762240b0921a5a6568df602b9db9b7f4a6233d93c467b205dab9a65a4fc43397d707c4553478fa797b584eaf9e599f2fcd26b85f932323f9956ee4a83e4b54a9e9c213ebe43a07e7d17edd7b6a73f403cfbbfbaead28edcd230967e9c36e6aa8d407b46a9f98e6f4bd6fd3ef5d951d4611fb718c339de9bf2b24cdcd9ab34d3080d4dee7565a582e299dd929cbe9427556e09f7289449be9fb1b12ffa5f1cb2ce5b3e2a838c6cad91c9f8d1868810f1b30972c1a9309fecbc430d5dcb35763b3a531b5ee3807fd5f2c9f5dc3d928c87c3e9469468cbcd9012fe3571124fa773bbabc2ebe2c79912803928b8ac265541bb67d9aa3c372780e40d4e53046e5728836e876a1d75e1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c3ebc90e5160821628d2c57ea2f64a4b98877001fa79d5fa719df35ccb90b6abbde4683e2f88a3942929fc88a4cafb8eec09785ff7c9f0b883255a650cf557ca66ee26669afb6dac63e75f53b4cae6cf36ae7535fe99100c6f349ffc46155d224f44ecb3bab6b962a7ffa14a2ce082ec551943f33ce508b63a8ee30ee5e49264\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090210bd435cbb1095a0ddfe7f366a184eb919bc03ec09d806934b20371460792c481b9e3624e1a14ed647b3c91f038dfe216992b567551b0ea0ae5c5413abcae573bd17fb973caf63fbdd2150881e49ca546b2952049a8c51ffa82e10f3c7de1e97f3fc9804b120e948635395fd5ff49876cc1d68987c9fe54a00ade931e4df10da96e2dfffebfaf434bda1ae88197b849d01af37a6468dafa477cbe2d84d81277e1bb9f76292c88cf7d6bd2dcb695f132837adea0a4bcb73e0b664fa7f81d33413b01da5692d24126a4db72185b0abbd9e569ba29be720203bb9f8d22b257cd6fd4b730f8b8b4590d38fdba766eca943bcbfa4ea0436dd0ff16251f17c5b00ff06f754ed5d609fdbfb745574f501bd1db5a42c2d62249de0d91349d8543bcd1c55614ed9748aa3e45fd46ec63eea7d154ae39e269f327b2c73229eaef5fe05875bb6fd8b2cca373df01ea817840d196defd912b3dac69106fe6fdf5a5e66803325142433c7d536e22c2585bbb913a3306c88b0c961105dce7e703902a59352eb28a6eaf8e247b4b2047ddb93fd95d0f197f66a67b591657f14fdd82bcac761485ae0859dba8c6c1d4245251461a8edca37987037897e5096e8f2bbbaa43a8c1b63ac8774f91fbaeb2117441230df32b46db6dbcbceb8fc2a0fb89d382dff6c8df7d17cc5f6d21a9e8f03ec8a9baa83102c93a7cd267e0b976d8e7d703fae183b831a5ba3d7fac85484ba7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d513070c0d29d47e9fe7be7df27becdaf45cc7da31561e827162b16aa01fe84c4a24f44ecb3bab6b962a7ffa14a2ce082ec551943f33ce508b63a8ee30ee5e49264\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/58fb9dddb99befb27e93f61cc7346e2e320d4124",
    "content": "{\"tx\": \"363a05540260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700f00000000e95226b0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b34010000005888338d017b9b0b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac4fb5bd44\", \"prevouts\": [\"c009130000000000225120440c37f254c07fa4cc41897f3d6c7e819f00ad5f6c5ca97225bb132b6849e94a\", \"0cbb220000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_70\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"98ce72c2934e1dff341aa1715387831de345d4bb16004b8f58780e1c404c68d720614c644cb9bafe0d29812957cc389f434fc2a7b5e39c68cacfd7bea0bc993f01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"12ecb843497bd08656e85718be0e8f7172b533757165b010ac4a58b46c16fb40e87ae4d8decd61bcf02f3e0f247e4238ef3c725fa7c65c09f9ebedb75d1425a670\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5901e4b94bc2da63a3099505728106aad680aaf1",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3901000000d158bef104baa42200000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df97972236898740000000\", \"prevouts\": [\"1790240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_78\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7bfff1571b28d2b1951c409f8261b3c759aac2ad0dde259adef342b4a52fdec847942edecd7da47bd8dc8cd3a1ee8d61725ec929f78657ef41778ca50610e8b002\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fe18afdc833986a8455155c2ef5458da646bcaa72aa7042cbdad9e8385ed0c6677318fbed10a32082e9c9ea26fa0c909a58ab0aa459e3e3eba9d79fa43c8f31178\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/59170b1799ffe9d1e085f2b8c38cf655ca14f1bb",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702f0100000063a3e9c760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700502000000f4bedc840447552100000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acae030000\", \"prevouts\": [\"fef7110000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\", \"2a3712000000000022512077461b0e3955cce0a8e05b12e20464a062d47e96c909cad0353185349b78401d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93696a694b26b6349dc8b1d316bba0314d4d3dc947d10f5241ff95786180ff398b9e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8da733fe71e3ce0c37752cc3ed22f63651cf62c657cae6a4db35497744053504dcc62bd398c27c2bcf203967681d855a98ab83c6f29a4f091e05b1c584209e732\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d966958a6a534cbe77cd310764ead8a0428b575df096895d63298a54d270e70ef5981cd58c469d4842aa56f101a76a4447dba55ab7a128197943d7701f95f2823b7ec1fb3aca1c665feb629f75b86bc6796ed5eb830658d68574ea157b89fde9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/592e17797674340048f2ec49023bde0febe810f4",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1c0100000093647caebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd200000000897280c9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf63000000009dfb36d60406682001000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388accbd14a30\", \"prevouts\": [\"e211480000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"22e868000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\", \"cd58720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"897d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e0000de5fc6567ef06db1dece55569d9fe4e9fbe0d833ab67420ad09244343ad18ef0696df011c2e84d95b8f4877f40057090cebf81e873c0600d23ea60362df6c56da6b4a79dd49e001229b88fb5122d120ac43d63d1be0cdb38b208b21132e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c13e8217f4df24b7ed05cd750bc2df5f0081699b55d294026679edf52b865a2d9facf4edbbf526ff5eeb12780b24daca1831089abc7bf461f974d05d276c4783ac632f1e88e109b3d5485dae08acb0148fc939094c3a94300b3efbd66c89bc20\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5930d2e1ddc70c728b1f219bfa14e4053fe56dbc",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cb00000000e2137298bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4b010000003490f9c1dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5901000000e9b952fd0237c4c2000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898757020000\", \"prevouts\": [\"30081100000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\", \"bc186b00000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"22bd48000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"087d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364cb173d9968a47ba6c5c74f630df9011e2eaca208cfb301cadfc15d58ec381f47a9c5848e7797e88ab157cf3f92cb1e084ad7139395a6330a6d0efe4ec0158f0520a79ac573d08fada6e0a495a70546abebfe2eb256837e38d30334686ccae33\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e881f944ef569cf36d808a56aaa75ca2fdbdf4182c26b1d87989a6b5ad676759bc691c2a9908d9e7287fb91837cd9c32b2a21ac331bb306f4648aa27bb40422e45371e41a07562523a12648be26bdba66be78ce7e249298c356e66cf29847872e0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/59357c2c93a40183682393a898e6b58d6e81cb14",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7a0100000095d9f0a38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4af00000000ea0b84ea030401b30000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1bbc2046\", \"prevouts\": [\"1ff07f0000000000225120aee326bed25c38bbd2065ec54ba80d7933aa4c88bcaacc9a661dae671bd05d2c\", \"3a2a350000000000225120cf1cdbebd76187b7cc76a29147a6cff8f4ffead99137b52e0c175bb15fb623b3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93632b3ef9681fb815518e003feddc929afb08e1672963f3eb536a9a38227c931cd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a4b616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5951e8f0a0cafab1db40426b854148481b762ce2",
    "content": "{\"tx\": \"c07ee00c0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270200200000062d802d1dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cef00000000fd6645bddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3b01000000fb6fb2d2013a6d4300000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac24ec9a3a\", \"prevouts\": [\"db2511000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\", \"86f3560000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"946057000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"7e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93601763a9a2ad9de81aacd638dcfd4fda3d0aea4cfecb2218c942c0044c1357ce3e4e9bfb46536bdbe14fd1969523d98350611f9c0fc6236e31514e2d43f59e146f2e4a14a40b0acbe20218e44481fe6660f01d2e0cf04e3bc8d4452bacd1080d1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e846c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fab95efb91d04564594d9dcf752eb8fd975bf01996a0bb9f9eb7163324924bcd44fa5d068ae686a8bb1ac9947127542ac866077ad522de57cab26ce701d52bc951\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/595901e13730319ffed24982bd4ea8c12e89bc96",
    "content": "{\"tx\": \"6b2f1e3902dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2700000000e8905cd3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba9010000008c35e8f9017e2c3400000000001600149d38710eb90e420b159c7a9263994c88e6810bc7445d4235\", \"prevouts\": [\"09254d000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"36be28000000000022512081b6fde8d6a32bf994f385f13e2db06adc6a69d3d570a785570e2b0fcec09f40\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936923488173528c4b9dde2293d2d6ae310180a9f48368b5c2aaa9bb790d91e7493\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a20616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/597a6a03965d41f1179d6a45268ac32531a9c209",
    "content": "{\"tx\": \"5546a66c038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d400000000b5d77298dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b120100000066b879f3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfda010000004fcfbcc7041d3ac4000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcf2010000\", \"prevouts\": [\"968f3a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ebe5240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d3e1660000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_f7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"71388e85bc88682be2696b60a83459f4edd22d13a9bcb2f7a3ecaeeeaf7553b645508f8b3a36244108136f54e480b2fab00c85c3e21442fe475bd0201ad56f8d02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"348b3f4edf4fe977b6ad2261589d623c52430caf094f898fcd8e7e1874a979e49e4fc6b5e1cda0e5f957f89e2a1bb92c958d91aa030ac3df64cedc3867979f38f7\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5981777edd562076958d2a1e4c80225a425eb08e",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2e01000000c5dd29acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca2000000009f8c9bfd026dc5c20000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3aba894c\", \"prevouts\": [\"ee7c6700000000002251207a2f20e860cda556c5e91362c7f67d77fa79d70cce9558dd8fd8d88940237552\", \"cd325d00000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"537d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361e9dee4062f54961d8ab1adbb5855faf1c96da96092bd787cd156b5117b50716aee97a7dfb8acbc78fdce4694f8ba1e1e3bf612a81f34559c93e6dfd336d600fd892d02e0db2d70aca72db86bdb1e35d04291625c81ec0b3d884b10be9f787fb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367092fdad059f732c7ea7ebad169b970067d4e4ac878b6bbd4d3081f11431e8f3e1ea8876939edcfa4030d01bff156fecefc420cd1c8fec8a2f14f09f14c187072e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fde150f8c7b4812d3362c6afa34922f3b5cc4b63cc9e98285537a088f4a7fe3bee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/598b73c14cf25c235e0cc5c5a3bf6a5add3b0b66",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffa0000000003a2aaccdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6d000000009d67e03e033aa3a6000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75b000000\", \"prevouts\": [\"4d2c850000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"6dfe2200000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"804c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ef50ce65e1ce97b405f0b78362b0983814277331f92d6e6fe48e5fe1e54fcd63d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51b44d35a0b3fc5d8cdca17f6fd766b3b7f076a7a891ad519d38c56688c70ff9dbd0313c1abdf0fb4e55d9b6d58af17743a20615f5654a8f167dbe9f4cf3a09059\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cbb3471782f6552fa4d140adb875524e3bffe9f0a11868cc08e8f15e249039b3e222414f291e7c8e231e07541c9ce63e3a938f40bc45d6936d3328c3939c0fbc26dfe099323fd489e28deb26e949bd9371fd3334eb17fb18f59b980c6dd72afd91585e32e966e39b6b25c1732dbccde0ae2700833a1164b08d78002e58493a9c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5991f803b4df614fde19c2f5742b860c1a14d33c",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd3000000009fe7febfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b86010000005573ef0e03daf96e0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787dcce0e48\", \"prevouts\": [\"492f4f00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"2c5e220000000000225120d0cab111a0a7736e4b6d77027eed86efb57774f05b322cfbf052f28c507b8b1c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_1\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4a016cdd855ac098bbc95cb5c41d1c400c9a3c5eb2432ae891f1d0d87d9ad820c401cf59134e62152b6b5ed584501ea2e92ee734c561224a3a2d3e787c23e7c3\", \"8ee6b4\", \"7529dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b325000636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f00eb87a4692b27acc4891d8d3e3cdaac6444510f2bb10f8271fef4ca4ad1c0fe23310ec75f77fca2c744850a143acb95dbca139f1193d320ccff9ac1780fb1200000000000000000000000000000000000000000000000000000000000000008cc5e62b22fc06ef194978040fbbf674b0e75abfea73fecf2b459c58ae47ad882a91134608b03876227b33925d69e197a18014be235f82e13f964d7e3ee38004c0291c475bee6e13b50480160389a299a4b8bfa7b163538b8d8229b0930e2e95d5f24a89f7554a816325f89504348a7d04aecf72acb7b3161cb42fa26a77326da2b24b755b3ef6773bc8621c5ba012fe8e00c045c6e2f4bb3ebb2f332ada06e0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff988bdef943b15b140cdff7ec7804e0bb3df71f763a819e6085ab4a023dfd820948788096dca9fcae82406e083f7a5bedb7db7513a0157bb52bb26f5c29a9516bfb98336861334fb562d365d25a0295c02465abf4545073426ad34a74496923045bf3818d0d3e4c68b13105477d601411785766c22f357699c168d77ad7c8093345c7c6f664b265eb35797bac4e334f98b09f0ed0be5ad6a1be3ebf075cdb341c13eb9944afc357320db238b1601374cb5a7380109c721b09169a336fe81b19f65d395042b8d29122c2810648100d566e2be256d187c66113e3d167df245a4a80ca22df8ea9052a2067a5cbbd192ddd984a0553182843c9e58b5df2dee7f0e3ab69df084681e31896355d4ff4ddb8f66ca0776fd972ceb5b66681b6af4464e832a851a610b136b9d645a3aa7782aac993cb67f0aefce6ca930d24c633dc85b548c64429ca549dbc28b231a4785cac759b2e8f7f18cd068976879f23d2b39b902e480a98b31bc5fe0133271354570993f2261dbaac4ca480005e892c8b3fcad779a93c262a615e37fdaedb6906e28e4e46a511c8bb1abeadafe21ad4734af8de8cb842ca308a2f241ccc07a2c270e302afb6961b621c803a1e05a1dd5089f5568a924ee539b7ecad14df25c5c2d532eed053407eb2e5fcbb67f619bf374b9fe9a9b6ca5ea3a401b564c26b8ec057bfd5764fe1713031627bfaa66d5bac9eb4b50be22518d97c445c2666c3aae84fdc5fe5fd9d61b7fa8e1a9dab09103a97263c0a4753a77f450cb32ddd91f90c6be53fc26cee49206499a19a91266328d53c306ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff561e43e3a89a40edb4478e82f6a8df4d738ae87432ef72cb3eb5a3c401f8b967\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4a016cdd855ac098bbc95cb5c41d1c400c9a3c5eb2432ae891f1d0d87d9ad820c401cf59134e62152b6b5ed584501ea2e92ee734c561224a3a2d3e787c23e7c3\", \"598f\", \"7529dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b325000636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f00eb87a4692b27acc4891d8d3e3cdaac6444510f2bb10f8271fef4ca4ad1c0fe23310ec75f77fca2c744850a143acb95dbca139f1193d320ccff9ac1780fb1200000000000000000000000000000000000000000000000000000000000000008cc5e62b22fc06ef194978040fbbf674b0e75abfea73fecf2b459c58ae47ad882a91134608b03876227b33925d69e197a18014be235f82e13f964d7e3ee38004c0291c475bee6e13b50480160389a299a4b8bfa7b163538b8d8229b0930e2e95d5f24a89f7554a816325f89504348a7d04aecf72acb7b3161cb42fa26a77326da2b24b755b3ef6773bc8621c5ba012fe8e00c045c6e2f4bb3ebb2f332ada06e0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff988bdef943b15b140cdff7ec7804e0bb3df71f763a819e6085ab4a023dfd820948788096dca9fcae82406e083f7a5bedb7db7513a0157bb52bb26f5c29a9516bfb98336861334fb562d365d25a0295c02465abf4545073426ad34a74496923045bf3818d0d3e4c68b13105477d601411785766c22f357699c168d77ad7c8093345c7c6f664b265eb35797bac4e334f98b09f0ed0be5ad6a1be3ebf075cdb341c13eb9944afc357320db238b1601374cb5a7380109c721b09169a336fe81b19f65d395042b8d29122c2810648100d566e2be256d187c66113e3d167df245a4a80ca22df8ea9052a2067a5cbbd192ddd984a0553182843c9e58b5df2dee7f0e3ab69df084681e31896355d4ff4ddb8f66ca0776fd972ceb5b66681b6af4464e832a851a610b136b9d645a3aa7782aac993cb67f0aefce6ca930d24c633dc85b548c64429ca549dbc28b231a4785cac759b2e8f7f18cd068976879f23d2b39b902e480a98b31bc5fe0133271354570993f2261dbaac4ca480005e892c8b3fcad779a93c262a615e37fdaedb6906e28e4e46a511c8bb1abeadafe21ad4734af8de8cb842ca308a2f241ccc07a2c270e302afb6961b621c803a1e05a1dd5089f5568a924ee539b7ecad14df25c5c2d532eed053407eb2e5fcbb67f619bf374b9fe9a9b6ca5ea3a401b564c26b8ec057bfd5764fe1713031627bfaa66d5bac9eb4b50be22518d97c445c2666c3aae84fdc5fe5fd9d61b7fa8e1a9dab09103a97263c0a4753a77f450cb32ddd91f90c6be53fc26cee49206499a19a91266328d53c306ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff561e43e3a89a40edb4478e82f6a8df4d738ae87432ef72cb3eb5a3c401f8b967\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/59a01c32eca07dea482bf25537b7d52b7bc5aaca",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc4010000002b6191afdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c21020000009884a17cbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1c000000007c4b09c60226af4401000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd3000000\", \"prevouts\": [\"c299750000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"05cc5a000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"080976000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045591d3592ddb0f56a18929886f1890713028f922113494349427ddaa1ea39184e02b5f712fb146ffe69ff220cec8aeafe04d8a9d43d299b22043a34551aa1e56e09208a3d5cb0b20fec302022af702ea090b934668d0752a16a75cba2aae8c677\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360de7d78f78fcc1ab87c0aa695c1bfde682cf6b1e0f8cbb7a903d4a6ffdb03c46aac1f02719ff09c82d93c60ae8b21e31f1ec3fca4030b09dbe2604c5a66091c209208a3d5cb0b20fec302022af702ea090b934668d0752a16a75cba2aae8c677\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/59aa7a8b1146af0061b9b9478ffb499b5e7f3229",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b85000000009369fd8bdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce3000000008641938a0366ee8000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fce86e6736\", \"prevouts\": [\"6ac7250000000000225120c1ae6350d5e25c8637e3643ccad16ae3a3009b1bad8c1dbb165abd62db3354a2\", \"98df5d0000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369dff3719d80ed973188b1e18c406e7a882a557b83701af7fafb01b5e6c08518b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a9a616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/59b9a0e1dfe394504f08eae69abd47bfab092572",
    "content": "{\"tx\": \"23ccb2ba038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d2000000000276dbdddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc201000000bff559ce8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49b010000003499f1aa02d96dc3000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac8a010000\", \"prevouts\": [\"334c420000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b5fe4b00000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"3fdb36000000000017a914aa4a4e70b11f4eec4760f77206dc93b02350fcff87\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"1656142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"76090b842d03017fcc3a54ee33291ec26151f7678de4792da9eb6ba5c5f8bc12f1cf6dc101a14ea93f5577908ded8f80c9b53785a1a89a38f47e6522c1e3fb4e\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5a198317abb136510b17c59de5eaa7c880152f8b",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702e01000000a82179bedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf101000000b57106c802fe846b000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac32000000\", \"prevouts\": [\"b7550f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"45bd5d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ef\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f5259f26a46925063bfd0d33a1df0e884a946857efddf2d6a9b96ce25ab7160a9523c6d19b3fc533bc8a54a4f5bdb9de32e49a8ba0107501c976db88b488480302\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8f38202eb656ce07410e142d99a545511f1c2a6922f58ab00095360d409862b6258b14dee274181e99091174ec7f3f7cf5d404c0de070af16f0f8a3d2bff5f01ef\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5a53b6c3fb03892958b022df8a6e0a4cd3d8e51c",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb1010000006efd7897bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdf0100000078ee6cd803e00dd4000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc55030000\", \"prevouts\": [\"00c563000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\", \"dc71720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/pk_codesep\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"781cce034e47e081dfc6aee6d7a23af9df7a9c128799aadddf5edc10761334b8ff406be65cd8e25817cdab42a4e765a199b157d68aab2a3b46a7d6b50d7b0dce03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"50fc41f5a2bd1748e2a7f00451b8b318fed29b9a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"910fdc32fa386f26136e3f934cd48eb062be1b19c61cf0b2aacd04de1f93386836cd074b132c8d9c7e8745393b31bd0ede6ae53f2fe21030ee8428b5acb36d3682\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"50255c0fb59c91025ae877168f6f73e3860bb0f9863f2740801075fd4141576e5c3b6cbb8ae7252a1aefd0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5a5abab97631cffda0f11fd3ecd87d86dc325f8f",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf79000000003b14d3dbdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2401000000537929c80432a09e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48751010000\", \"prevouts\": [\"a0c57b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f4c4240000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_fa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e097ccb88c98bc5b320412d3824c0b7ebbd66b9acc8fa4536ade9d90a7db4875dec758916018f082985fff817c38bc79b6e5b92489c7fcb97f2c823d75a94bb182\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a7e58588e9e3f011a7aeec751f61cf2c36a22221a66678d803d2e6698db1696540e8ab9735b5d69e5690e6d1902590d02801aeaaad47db75fce701a887ec0676fa\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5a5d03ff40bbb94cac9b06c3d47e693d8db5af67",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb1010000006efd7897bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdf0100000078ee6cd803e00dd4000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc55030000\", \"prevouts\": [\"00c563000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\", \"dc71720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"677d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a77b70c46c994a01ec5a816124f61e0f5d1b89a7d1384137283c1b5de2b508b62e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdbceae773fe677547a5f8be2986f5e4c7dc436c0d3f0e1e86711aa468c8778215\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8687eac120734a03ae4c27d3bf57e4c4c383799b8e878ebb1c20141d650e89e9fbceae773fe677547a5f8be2986f5e4c7dc436c0d3f0e1e86711aa468c8778215\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5a5efe209bb7d1e1b0085b1515836fcb2144c5f7",
    "content": "{\"tx\": \"e804ef7102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe80100000034edbacedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd1010000006fa7aca801349d22000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787f2e54f5a\", \"prevouts\": [\"e25f660000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"146920000000000017a9148fdfffe253d045df4a2985902e5465482e50374187\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2360212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"3201faf0f008f4b991bde7c4e5a8e0151e32e6e436f2cdf4795a2128a90e73dcc7985f3467b350aefdb57ee932643e64353e10f0a4d7bf4c1a9cf1a394ee51f0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5a81cfc3ec9bfa6d49dcb19b411b6a4b6043df15",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705100000000fbf40f81dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be10100000028107fd004ce692f000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aceb524132\", \"prevouts\": [\"aafc0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"43d42100000000002255202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_d3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"63d7996c18222f1ff524042a5ddc4d277e17160cf398b4e9cedd99e2deb94b85dc7e7f89e866cf02d3ce88f082436eb3e543efe13992fdecb0da627e90d6d7e781\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ec45c4f58ae924054bcc114730678dd60e16539ae1c4966704cb386cc7e49b09b4cb6e333de6680a8ad78f495fd3c92e8689e64d7d1accf809150b74c9745ff3d3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5a9d9ae70e2df49baefc66227ea1c1604902038d",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270570000000087ad7513011c180500000000001600149d38710eb90e420b159c7a9263994c88e6810bc762000000\", \"prevouts\": [\"5fc60e000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"a17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93654d5e9f128d5d45e2b514bc7d0582e1e8810c31523e6a7d498e7ed4fcc964510a4fb15e70bbc27f4f9ee6ce894c5f8660c4bc0a21501abf5c583e18e279746b733479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4ae668dba12609f1dce2a1e29faaa62ff248d54f408b31ef31944f67a579d4fbb4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93692ed1d8a723f26614ad38a5a6bbff83804b2df3c5c12fea7853938e6cfd441ba04a5fb755beb1eb88fd06fac279ccb2aada241654186a69e6e0c04e3255c18f895176026b3e005afce4c10b5e59a002659822bde369bd64201565ae4c88fc95c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5a9f746ca2d826a621e61152c995893027ae3dff",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc001000000cc3e5864bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf850100000023fe971b01f0091c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6c780bb21\", \"prevouts\": [\"5d6e220000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\", \"f656660000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"e97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e88b8d8a8d8c003fabb93595bfceed403f9a1266ee95e7fa8447cccdf398ce498db8321554bafe286e6661652cf416d3db0b455024b23404eea069d656c79e4f25\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e84a72ef51eb7f1fd93b7716e160b4419190ea5192ffe31c8263ef308a11abcda602e473c0179dfd44294f4ddb50d827cec9d4b4e0c6eae7f68c0301f0fdfe7e6b9e5e4bd2cefcda110a5bf613694738c198174b403d264db4691720c8f18fc7b8321554bafe286e6661652cf416d3db0b455024b23404eea069d656c79e4f25\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5b000b738705bfd4a6198d22129f7e9f2ccf1708",
    "content": "{\"tx\": \"63a8de0b0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270400000000003003e95dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6000000000987504ec042540390000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478761b26b4c\", \"prevouts\": [\"d92113000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\", \"f77028000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93627167bdf7dd6f113555fa8f4b26cff315296a536038735c5506a84f918c8c5ad61eb6e6fd21ad84d93c7a0474b2daf5b011002cbe34781a2a14a95ac7c4e00ae344cebdb8ecd56ef01fad0911d9d88482970ec36d3a04b84eda7f5b5c68ec938\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e44a95c71cca5173fb3cb918c324a06ae35450e2cf1a92910826d87005746c9018b1142f6c6f685b07aa6aec8ab7e3e6024758bf09974a9b2a7615fb4927a0f7d3726db1c97dedfc82502578948b1d779eb886e6296c36bf50b8d2fe25c32b8a344cebdb8ecd56ef01fad0911d9d88482970ec36d3a04b84eda7f5b5c68ec938\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5b08bfcfc4f7317c5e45fbc3a683064ae85a3794",
    "content": "{\"tx\": \"ec6f545702bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9e00000000a8a25b8060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705000000000f22c0df9034f438b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d3020000\", \"prevouts\": [\"85f87b0000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\", \"97f8100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"ac7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e5a9aa32e218bbd7702dd80b5ebdf509d58cd1514da294d038190654a927a1119f9ef29ad3e74b34f129235a64deb65fb580c2718ff9462ea3ca43b3a4f56170fc485b911b91245b46c320351c8e1d13bb30ee22c3f953d2224593bd4b5088ca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93658c6fb8444bf3f1c71dc62d586de8f6b9f63c49598648e9eb416ba7b8eeb55d0f6e1ab16ab4bc20af15f35a7f6b67f82a67b85511624b76e02698979773111889f9ef29ad3e74b34f129235a64deb65fb580c2718ff9462ea3ca43b3a4f56170fc485b911b91245b46c320351c8e1d13bb30ee22c3f953d2224593bd4b5088ca\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5b33a7895ef81de11965a513bcadc8ee53993d21",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf601000000eb15c2fddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7701000000ce8ae4fd044f5f4e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a64ae04558\", \"prevouts\": [\"5f3d280000000000225120768c54f13dde172f25cce5a33aed38e02f08031f35d73759f73c7d1a105e2823\", \"abac270000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a1e25a5a51de273a99a983b8dab5f9a449011b840b2876cc59d12f2fdfbcf4b4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a82616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5b718764a0b56ae1705be7dcf35a2c639fbee6f4",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1102000000e34a2009dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bde0100000060eae28fdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c540000000002789cfd01dce73200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acae030000\", \"prevouts\": [\"6cbd6c000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\", \"4c421e000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\", \"b0574a0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4e2b448ed3f1969af8fffbdb3b73bd72fedaa98057d5c8b58a84426194002c6e029de37322ddf566a2356077a247b666bf816d75bd62d8842c555909c8a1545e03de843256fc2f72424a897ba91cb5d3893aa03eaf52af3ae765db300c5c19165\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365a6a8932227d021db8093e005e96d1e8927d5db9b23e7e4b1a24529d381170a492555fb599a2fbb7b206b08358b85e40a527ad21aa064f750df81600ff72cf4ef17ad4bbf375bb62f626ec8048d4347cc1eef977780228a6d2fc47294088d561\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5b72a3d1797578b12f235ecdfb8305d928514960",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42201000000a7edade360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702e00000000e8af8ed604cd3f4100000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388aca7030000\", \"prevouts\": [\"d6d3320000000000225120bb5a47f5af791bd0da95f040450c31e81733ad36d8a4b487e3e6f1ab189dc604\", \"3056100000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_cs_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313dbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0dd15b60a933bc801626bd96989888c3ef766d4707939fd2fabe3dbe586b1cc2095a90a93de6471623acf924489310ea05bf81e35893164f663c55c0b5346f1a00\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313dbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5b831888d2299bcbbe9bb60f6812a461f2da8720",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b23010000000184e7e38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b501000000906251e203788259000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2c010000\", \"prevouts\": [\"41e7200000000000225120b52a77e37c1fa9b4a7b934796858277b8dc346396dc90993eb725a9563cf0842\", \"14703b0000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"f37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936111cdf76836f174788069938d43a1f118e1d6048d7db416209f274b647d1178e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082cfa000ce8b9790c39a5d5a4e1f475bb1ef714fb8e08d79945cb39f042227236d80eaa4a5149b34d26f0437dfc3cc15f8b829f232fb4e000d97f0d76bcdb6c884\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368ad006099a5afd91da2bb050912b31486a1a5f178aed6fde7a35ffc349c590e4cfa000ce8b9790c39a5d5a4e1f475bb1ef714fb8e08d79945cb39f042227236d80eaa4a5149b34d26f0437dfc3cc15f8b829f232fb4e000d97f0d76bcdb6c884\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5b89dad22b6b9ad7d97be2de400eaaa8ab2a03e9",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c440010000008819fbb38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49f0000000080656b9904c66868000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787c7030000\", \"prevouts\": [\"455135000000000022512089bb171a5e185cc37daf7aa0871afa228227b6abbb83e8d3d329212a244ac814\", \"ebad34000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c0e369f272f9685ae2ab5cbec56c7922838a13e1e8a56851740c1aaff5717a80\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a32616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5b9296392fbbb89f20c46a8276795c3b237a921b",
    "content": "{\"tx\": \"72ce730f02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbb01000000937aa8c7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd400000000e0a2bed102189b98000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787660da74c\", \"prevouts\": [\"89f4240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e849750000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_27\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"685d25c1d2d17a914657bc9226bff699b0619edc946287c76d4e764d6e6522577217f42b52e8ea935a9fd4a8788a3e34d0a574570859d949cc06e893b3a91f0c03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8b3d69c2884b0c8fefa4fd2ea1b2b2577a56b255e688a760517e88ce944ecd9b496b514563a8e8ac308b2777f14057cddee4d74e2a637c9ac7f68636a256ad2027\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5b9476567b263e9cd4c8455b1383c48f559cdd5c",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1800000000666e3e46dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf200000000f1d81ac101a24f220000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7fa698e43\", \"prevouts\": [\"befa55000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\", \"f7b3550000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"8b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366710f0898dc1486fa1452d6452d8e08d4e319f7bf9099dce0673c5abdae87e6f493e40fcef10fde3df13bbd1c2551f58461e5d74b1e1953624615bb6f8ad2778f2e441b555c43a724b579c479d380c278f8ccac4217fbfdcb96526a1dcd96287\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e8cc06f1f6f7ed6c588d622e74b9585b43038ad82cf2101cca86064972a6f81086a27b1635c4d20405f5eb1d8e1a675f8ac3bff005ffde1fde7fd53008c3096ff2e441b555c43a724b579c479d380c278f8ccac4217fbfdcb96526a1dcd96287\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5b95416a6aeb72fb134a6149c2103c7b4b8af54a",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4201000000b563db75dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc301000000f098e3a68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c467010000003d1d4d040391f7a8000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72db95c2a\", \"prevouts\": [\"4e8e4900000000001657142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"f6a2260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f1053b0000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"837d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c30d5e9bc30c4c4af9e4eb5b310ad22b2e60a98f718761077afb06a77f13bd7efcc3b58fc7cb9ae8c07f6b17b965d49129a74935af1e9f3c9d7206d9e0977573ff15e37d03bf407745d47da370f693bba1bd1439d95d9059575aa23ebc3ce6e3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364e4b21485a97c5fd22d086acea81de731dd57bf1980b68bf0a0105c8b4b984177e533ff75a4d67e066dc739e50d12e058e790be330db290aa1a5b4fb647c89858163db171dbfcbf374971659a5a65d0378eae0ee15db360ca8cf80a8c2e13046\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5bc0284515461bcb5e3ebafccc633649bb1ec2fd",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704b000000000a65acfd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c465010000008cdf959c01c1fe0600000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5e000000\", \"prevouts\": [\"d88a0f0000000000225120d632d9c3807cee2f3b07918ef684335c8e7823a1a0eb476eaf46267e076b018f\", \"d44c330000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"147d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c26aa6cc7dbd51dcffea9f3cd500823e5cbc45e46e2b002a2a7ff91e8ab38dae3488b030fbb16fa8d50c4f1f044e6df81cbeac111f0be15e3f466e559374b3e5568dbaf979cca58396dcf271ee6fc736edd00965a3b0ecce9c87347ff88ab08a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa7a317a052512b66d9c0a593db192e28ab9b1379143982fc432aa6f278435f8ccfb63111b06c7a0ce3f44d9f6906db8fc60057b72694cfd58ed25db88d188e5fc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5bdb30e6f918889383a02c0269f0e346fb129035",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49801000000f2d4614a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270130200000074abd946dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9f0000000045a6249304c5089b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acf499373c\", \"prevouts\": [\"31f4380000000000225120d7db2432b77440d39106fdcd5c35c463320f36611b8bc46e3633cb3a8d85086a\", \"83da110000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\", \"30d0520000000000225120c3b9d8e50d42de1212377aa9427da72fe17222669efe5204fac1f05c34f6e65b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09026fecdd4402cc53c7d16d3e939e8e3afcc9d3c59ded67f392425c6737bfa97e5ded722b8cf7d50550b459a9f46d0520b6a5540ce67caf543c0c5f28ee0a0c0f8990e36f730660a7d90aba2720fdc1d390985ec097cea1203b5fb3f9ff4ff0990e4e3c8b9608baae79d5695715f40811a721d607df2a0e7346194293135dc41d9ca6e5079ade54bd6f16c6f60a4c5d75968a3483399ffa1a09d5363025dbf97f57eeddb2ce4b991b5dff568b0e6058364884221a253c2c097b55ab5e57d75ab407ae4feb54c291dbc62df4419e053848666785366a2620d4b8141bca0e858de1d05dc6790ce0996d80b065f4fb5ca44a4eae36d7814700b20f2e2506a3993cf50a250944f44336d4efba1ad82cef4c31596942f3a83b0950f25e87408eb84c208d109a219a67fd5e92bbe75c9f21dce76ef84e9966e021722d28071ca0c5af4db33d603c2ad5bddb7b0951a805699f51b502461b24e5f5fbde7b9fb69ff0f27910dae63dc2be0e38aa2d0ccf6940dc7a636e2bbf85721b58017178bee6ec54f79894726e40825bc8a1d23d10e2390c09058116a6e7bfff9f7489b9069182496c3676b1bd369433435d35c2ee5111a8d0fba6a44dca4564f023a98d485193742c184a0261cc74d72801ce3b3d2cf17ad17375fac0a8c7903b995f93fbda44012a60d9d9c2430153344cb12346ae7a56fa33240f44c3373990981fd210a322ef5a84d141551864d24af56a75\", \"137d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361426daa4bbe5d8fcab9dd1197b7c9101d6becf10f586c66a38819853ce8b40c391993dcc568707dee1346cf3396ea5c7390afa7d45c5790b2352813dde91dd339a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e7c43b740c0608ac721897ca7a4b0bbd2ef7e62418d1fc20274bd386c7c0d4d7e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902158bc98498b37b7647654b0d28d7cb79dfd2016d7902738862e6eeb27c65385701547fc2025bb2be0d0fecf8794c1bba6442eebe3302b4c194dfbdbaba68bda53ea0984be5fd27a0571abd5c6bbe3dd7ff12cef3a4483863d788ff17f80e157301ac1772fedb30e5b20557b972e82e4216140ba93c5e896e862cacc79048077e4be5e880602f63ce49fdc5ab08b8ec5f119fb6cf7898d35eeb1802ee91a5b5015b8f6c6c6030da2164f0a82bdd6a67452ec8d27a88ea9cbec836c6c5b39f9cdebc6ff7fb84b08fd829886c027cd2884536f304c678b7e78827ee5b08f7d50c14490f80226e6bb504714ce85e5d6c7c342d3d263f08ec44baec748dcd8c6e6271cea772250c349fb10278f0a3eeab533d18fda98636c366cf058a612f3cb91279f3caa47cf7795c7b69f78dd8f2fb0a6aea9b6a8cdbc3a6d3fca5d20edfa01aec5077b30a387edf43b8abdf66e359c374dc96a42dcc5130c869580ddfddcc770ab46b13c77097a82fd43701c9577280825ccdb7f0c60d41ec362af39513977c1a3a0fe42c5f67f6d66b66dad330839d93fb66768397b607979d7e1295e76531598c2382393024cbc9c3285350d2379bd53b469ef774b01334be69acf57262c78d27090ddd5e641566438d79614418183e61a4e63fab91ceb2dac3fa9a1d94d83b9e4b7a7651d84d9317cb5fdf61dac9dc68b387890414970fc2bc68afb4b304bb5f74eaab0b92ebda3275\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b8824ca039286516426034e909501685a57dd231358ae092197a767d6d59583991993dcc568707dee1346cf3396ea5c7390afa7d45c5790b2352813dde91dd339a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e7c43b740c0608ac721897ca7a4b0bbd2ef7e62418d1fc20274bd386c7c0d4d7e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5be7de136c7e263729c299d1617ae86dd468f91d",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45700000000d443c5cb01040627000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47870d90964b\", \"prevouts\": [\"b9ec3f00000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902be062cab72511239868c05d22706a5695f0e63841129712bf325d765dad23339b1a9810a58bf2c9bd69e3761daa1f83981df227a9b233d6d1102f6aa8b54a300185d607c6dc16ad92b87f1a440576ab30b3a7e7599aeb921a150f19eeae0c8f92937364734250b68e274993c387a8eb3e92b56ee12746286e20c96fe1743c62679cbb3e7648cb745b0366fa76cc938a1d82d56b483ffd0cd64a15eabfa5f9717ff3c0c168522dc81a5f1c4d6d336674deeb6139fd58bb477c8b329d335f2b5f35de0080e9fd3a5b912b190d328ef3c0f50738e71ef987e55880095366ea2e9701a1aef098439cf686caf4e3f51368166dc9761524256ef031d7398d141c709b8e9ec25870a6e3481a5b996d80017bce46db728198cfd180f9cce9181d17e9754a573dd439c580de353261f5e71796fb0c053ca3191e1d2fbc5fd168d42ca3111ac2bc5ca9112acdc48b7593a3abd4ae7d12cc9b62e82cb2e403687bd35f2908f8e60fa61e08f2170a39a40fdffa559a06ad5ccdf97e1b2cd4ed89a2cb1c1fcce13ba213fc8eb435e9e567b3d54b311e59afe7f7386b389adf5f922d6e0f2010b74ae79bb5dc32d63664a2d28d5acc3e5962c795881dec8f503b8aeaf51eb5a29ff33ed4a7dd7ba0d4ca856750084802e22696e6a25128fae9cfb04eff6f56afa0e1d1c1c8b849dca2dd886ed865a36652e4299ddd98cb679c21bc9a5a15f363a7a9bbf0308397238c1757e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d511f4adb00685858cbe7bcb6f491f781bc30000d79c976ba3736fd7b7a39329ee30cbb6a1bc9c683a9249ad6bea98cd3b225511a23bd3763b6594afd12d3e036b5faffec7faeeadfdc2f9d17b998c1a9153f333fbb08a178932d29a7211446b62a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090282cdcffc3f05c6977b0cd02c835b7eeab7a0f62e169621aa36f5740268d0acfa82f8e80f2f456c7093814f254fbc07e36c04447b10c6b6f48572a05c5fc6d6ced81e61fe075de523f0deb627041f03443884c4bd7b8c85ff128c899f9ecb39847bb9a971d498839358ec9f808e104be0de57640d5d02030948739e99eeb8e139b7832e3d20c939361c349a917c2135102087af2f628046463e0630cfd7e18cf19800164a0e06f4eff7f9c55dfcb441d1039163e518d83b182027b33eba77922f6c2afd463bc48e0c95691f185615860292902fcd23210c63f79b888c9a0180ca52f71874af6ad65bad70c71ee19984c9bec8f745c2a10ff8d0244b22ecbc5f5c1c2750464c14b0a9a39299b76d3a76c520b7c81e6f5b6b104260b65e7440f9a69ba1285e089174e371793af1c20ce0e191d28573eaa3c6508d16232357e637f1dee44caf389e65f336eda982d5a986432081392f9ac8ee4c6732420de1a2bdc9f75ec283a057c52a830ba3f10d243995f23137f9ffe7db82b424f46794efbe9d5cd32d5629716b9be1070af9dfc5d3e4cc99757dbea41189f4bf34c999440caf58538c5f1108f95c4d81e71e43ed22e5122b4a401bc5a16ff6e04853da0e49827ceac8d29f412176bdd5150faa16e11563e1253f59686181380f19ba3052901117082d629889ae4d5a6212ea7b7bec696a7f4f704504836dda729243ed307748a3aed8bc3042eca8917561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082b9b4175db22b4058fbb32c1c98b401bd6f80a734567664ffaf4b869d5cecb8c8be9bce0da1a8e0eb2f55600b1edecb05394963f1d059e6505f0ccee9d28b62f6faffec7faeeadfdc2f9d17b998c1a9153f333fbb08a178932d29a7211446b62a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5c2aec0e280cc6dccb0aa9c3d4c5354a71c3d8e8",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48a01000000668a29f1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3d00000000680a248b0199335c00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acd1918f56\", \"prevouts\": [\"64343f0000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\", \"251a20000000000017a91454957ff2b5c5fa7ace3c6fb485b914ecf6ce0c8c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"1658142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"7698efe28cd54922ea5e6da351039d28e1396fc2b3f262ce287a666ab6bad6f86ddc89802934ad992a50fcc287f7b187b9bf6084e175b85c15f2928f55af056a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5c2cccde1ba71ca24440e1be3fe94d8b2abc9ba0",
    "content": "{\"tx\": \"b07ccdb3028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40e02000000ac2245c68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48c0000000092334be801f08a5b000000000017a914719f78084af863e000acd618ba76df979722368987818e012b\", \"prevouts\": [\"35c53600000000001658142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"1c5737000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8767dc918e57c70b298c1e561d76c5e65deefece0466c1b170a15e69fa408a920e2b04e96f142cc6b66e76d5b89c9b25ae8fbe00cff03bbe00e52c31d1dfc2fd\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5c414ad191f1a4f17701285f026d3be386795f46",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb80100000095c037858bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4770000000021da5818dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce800000000a4b8f83f04b7dcdd00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c45bb44b\", \"prevouts\": [\"724b5b0000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"d90c3500000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb\", \"294550000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"697d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b581e7745017096cad4c25a994b7b5383cb3ce53d5d9c99862d5778426da160494dcbc06ccecaf65037be0509f5fea40d87445fa254b78f124a4b8c5e16963b53b3c2b944ff5e8034ac7518513c5ca10ab4eec025a723136fa482de383e24ff1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f50b5b5da10eb7d793ae86878c22918a1efc57934013172b8e322c1c64be3917945c33b167c9a8798707088659264fefaebd6f00f5f412ec268481dd4d0e7e4494dcbc06ccecaf65037be0509f5fea40d87445fa254b78f124a4b8c5e16963b53b3c2b944ff5e8034ac7518513c5ca10ab4eec025a723136fa482de383e24ff1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5c4b2bd5199eaae65eb1b50ff2282715f285525d",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c100000000dd110ca0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565caf00000000071f80f3030b996000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac9d000000\", \"prevouts\": [\"b4170f000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"b5bd530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_e1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2ff700f146833e50bf28334e5610247af6f4b97b05b9a0f0f79314c30ec3dbb53cf80d6a86a136445362be1371ac101792618ef950a8b828a1a79a3f9d08df9e02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8c2014f4da6230928cd9e7530606b065a82c4f8acb61cf3deec20497ad64645c1f39debe8750c4e6b7f811cf7ec1dc660416613234a87093140313ec80dfd197e1\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5c4e02eac5ec6bfd2aacdf25eb5606e7f1f8d245",
    "content": "{\"tx\": \"d3c407fd02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf59000000008d3110a5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce7010000001d03cbb703ec85ba00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc53000000\", \"prevouts\": [\"c7df65000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\", \"38585600000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100851e49b2e0a4973a6592637503937aaf2597822f72b7aa9873f81ec9ee3328d0022031d016a543c18c5389e366497d5e3c54b26e19434909d55de0ccb8f81b7cebcb83232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022042cc82fb21e88a2ff8018f737d29058c0b0fde64c9e250f39f6efd3b4d21e33f02207d4262b4fa35aa8f608ba21c41583224d1f47160484c0dd731258526e71bbf6d83232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5c58efa0b606fd3a9f5c4149f78312e37884f070",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1e000000007f87f9d660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bb01000000b381a6b20118072100000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac24010000\", \"prevouts\": [\"ef6d640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"076c110000000000235a212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_15\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"90aea01f2cc4cf5f9a75da5cf2a9c5a7fc3db62029872ee27f99e04c9003cbc137f8d0a8279114a4ab44e670db2c6ac13b3ac8d854a728f8d3863e6f1dbdfdcb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ad198d9bf156fff4f37ed51c0e9b879bf2428f2658985b472707f7b6ce48d5de7677fe72cd05041414d28580686ba9e6083a804540325d847a3af0c54b681cfc15\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5c7526188d4edba67f479317b2da9ebd815e25d8",
    "content": "{\"tx\": \"0aaa8a4802dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c72000000002635b9ba60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701802000000ce18a8af021b536e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac0651971f\", \"prevouts\": [\"36135f0000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\", \"19de1100000000002251207ea7068de42e8dd8ec2d889eabca72799b94dd329861089e307e247da6412b8e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93618290ef83a776d63c84ec09e6a4fe5a6d7e5ff269dcf5fcfd50fd6b72ce0989f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a79616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5c82173fb5f60e67f6c570773d0e7ca501b2ef2a",
    "content": "{\"tx\": \"ad9cd02d0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270920000000053c5d9ebdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b30000000008440aebf0409af2f00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487cb000000\", \"prevouts\": [\"15f4120000000000225120571bc713e1a1d58bc4a7da330f9b17653bffa646093e5f5e3088fb48bff87491\", \"d2071f0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"95\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045cf76285204aedeb2e654c32bdcb90a470f0de651bfbe7b8c0c018e8a9ed468384d6fbd68a9aac62cc0fc4848936fa6d465cb32a19d5a751074f74d9c4f7fb368ab0b669047babd6208c97c1428e12fb9e633b2b0d2e51b7853d96a7caae1fe0d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e461b72f89a2c16bf6a5015001c0ff63d37cf9f24e8cabb5685a98f400e46d3aadc7c8b3bda8f17728820267d55a41d559bf30f92e294931cb4fa644579829c4d4a2033150a39b6917f88ea297b4f989401264ea3eb8667a511a69e57850c639\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5cb8c6d32062773a2963b39820bf5c9c9d4d14f4",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb201000000cefb2422bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfba01000000810ff78403a63af100000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac7eeaf121\", \"prevouts\": [\"54e3820000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\", \"8c2470000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/minimalif\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9b978a2871d60b5b8a11ae11e1772b43cce1611b53a5a2c808afd6c82be7a7e300cbd348c33dcc6f0762a107aab5305527f30be20afd52ffb31283fbbe819149\", \"01\", \"6320871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac676a68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93692f0de23ee769069055d0d6d05652e1367445947e897223d0b74ba21bedb5258c23c60128fd3e7af8adaf4abc6718bf379ce4956c06c6d05419568a3b7fbb4becdfa5022fbf9ae5dfa56f4098acf4285bbe92d9aeb187fa2d4d396f6e0eee31df9d9ff7331949f40b876b1f64f1a10013ac65e222e2c8b225fa80db88dddb53aa6a2d9e7459765b4c09c28753bc2ff55d05ebac69a2359cac2688619c9c27618eeb68ce69b97818447ab7b9a4ba90bb798d21d9027f4de024baf5f3b5f4da875d446577c2ae0ff5873a151ab353523af1af4fb00651b9bde1c1989520e7d338bffb609e59d45c7d1e0be4118ae582299f3fc1b7f496d16d6ab2d0d6e0f7a455128ce34dda559eb1787d0c8deddf8f5f19f9fd4c2ccb2eb142b7063fdfa79ad71051bfd8661ff100df5daaf9353084b6d3751b20c475840529a2a7efac33ff2efdbb6b7c86f986531e7bd2af85df536ab9da539cb9ad98883aa4960532e755ead635b927ce0af32fb24943035d26d0ea88bbdc698d8d4264beb9c7e8103a368881360dc44ae3d69de3386cee559eb49e6c76a737e105f9117431d64c73a13a31f98b35f150399876b232678a58bf83578dbb2c055ad176d56177c4ac303846e798f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9b978a2871d60b5b8a11ae11e1772b43cce1611b53a5a2c808afd6c82be7a7e300cbd348c33dcc6f0762a107aab5305527f30be20afd52ffb31283fbbe819149\", \"02\", \"6320871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac676a68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93692f0de23ee769069055d0d6d05652e1367445947e897223d0b74ba21bedb5258c23c60128fd3e7af8adaf4abc6718bf379ce4956c06c6d05419568a3b7fbb4becdfa5022fbf9ae5dfa56f4098acf4285bbe92d9aeb187fa2d4d396f6e0eee31df9d9ff7331949f40b876b1f64f1a10013ac65e222e2c8b225fa80db88dddb53aa6a2d9e7459765b4c09c28753bc2ff55d05ebac69a2359cac2688619c9c27618eeb68ce69b97818447ab7b9a4ba90bb798d21d9027f4de024baf5f3b5f4da875d446577c2ae0ff5873a151ab353523af1af4fb00651b9bde1c1989520e7d338bffb609e59d45c7d1e0be4118ae582299f3fc1b7f496d16d6ab2d0d6e0f7a455128ce34dda559eb1787d0c8deddf8f5f19f9fd4c2ccb2eb142b7063fdfa79ad71051bfd8661ff100df5daaf9353084b6d3751b20c475840529a2a7efac33ff2efdbb6b7c86f986531e7bd2af85df536ab9da539cb9ad98883aa4960532e755ead635b927ce0af32fb24943035d26d0ea88bbdc698d8d4264beb9c7e8103a368881360dc44ae3d69de3386cee559eb49e6c76a737e105f9117431d64c73a13a31f98b35f150399876b232678a58bf83578dbb2c055ad176d56177c4ac303846e798f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5ccd74670aa8f9270b7b6d1ec35f26366e24af92",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fe01000000955e53b2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4701000000658363c5011e667c0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e705870958\", \"prevouts\": [\"b6c04200000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"09067000000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c84c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93666ea2a418f0de61648f1846bcf7f8f7eac0e21721710bf1aae8a61bff50d06c920e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1b553f13873b7614c747e02d52f281322dd98cc8d4ce789920cf593b75c6f05693959a095ba405700a8bdcb88c47f737d45523ad768f5b3698c80add34f2e764b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52c8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cd4dbe16911bf8042e53b5984ba25563e24e4d01fb5e320bf03d1b64849c9db7460b19c0accce5a24a056b98cce949d671afb14dd91d0cbdd469fc3f22c90b1553249301ac20ee33639c015b4a618b106ac87c8ade2ff7aca8998bda2366a260c3d30bc3225049ba56ac02c164836762858abedae6e6cb81f8117394fa9e456e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5ccf6b63be9a26dc12ed0d8d9fcf8f9bd4d32aae",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c900000000e4d8689fdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2601000000013a04e50458d53300000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac3703122b\", \"prevouts\": [\"ff541200000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"f15c240000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"847d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faff78d21b135ee37de5fb006beb46b85f4aedf8bacb6598da1f15171cdf92c209c568c76d6b344a062dd798f6575db1f1731d6a7ca3f2682e7e1b801cd94d3826\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c194e7775fd7c80d883f2d740f9e56e49ab9a06d8b2a8d7428d3ae945cc345b376735f386d1a4700f0e60fd19c47be953169b4ae01039887cebf253884ac2528c568c76d6b344a062dd798f6575db1f1731d6a7ca3f2682e7e1b801cd94d3826\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5cd441bea952394300fbb2b175630e939f70734a",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c63000000002fad8be6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9201000000a4949ed304f066a70000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcffb82f2d\", \"prevouts\": [\"8fae510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5ed3570000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"30440220525a7845ce4b2f5390c5b7c8b9c0e78d50a7d94af7d53bf7f1af09b52160a11e02205d5573f2e64a87e919a821d051f32c0e44ce7b75eb0c647b09203872003b0abb81\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100e965a7e9c14fd31cabcb120624d120d334fd2f3e2eea64998f23d3e0f42f94d6022044703cdd9b3d1c0fa60e96ae026d437c6919a9c6124b6aa4ae6d598a303c8d3281\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5cd9d11e72f21213a0cd5e3b000d85ffc71a267a",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c100000000e823d301dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc801000000d7978e97044cfd5d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac13000000\", \"prevouts\": [\"01ee380000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\", \"2cfe260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_c4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c1622e178ad7a6967ba48e5b0af3b29d709f4d9267a4fbe7a3f46b215849cc8f5651ceac82571931259ff1713ee50f720a1b1dfa57174be82f41a594e668597001\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"92133e4dc13ef643b6e4566c20e64b0cc9ad2c295b12314562b4b6538f708259e0f475f2d753002b57461f2bcd4d3799a9f0a237820010316e4fdbe9c8dcb8e5c4\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5cf79ca7fb6c27351843e8929c62c99f6d116b3e",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7e00000000208666d98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cf01000000b7b13eed03661d95000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acaf000000\", \"prevouts\": [\"96b259000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\", \"a73e3d0000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"5c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89e517178a4498250bd09ce9aecd8afa5f6f049a9750e0fcac48ec3d6edc1b53ae8f45a3ac55dff4b7d62b0bc42204f13e92c55212ff162d480a58edc7717abc8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368cdf980c8580c893c053e8f36fc601f79605cfc76c6b11fd2e35e7b5e626ae0524e037abdf69c22f44b0c591ad93651f749184eaa819a8a63a5d4092bdddfb78f243c72f4e074898aab8058b3c73fee97ec3b9723e213834a8398e97170c1356\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5d460d2d593010e8b116c549316144cec213da3d",
    "content": "{\"tx\": \"716b8db702bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc4000000001e7a2ac28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40b02000000e32d47c101a5858400000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac93010000\", \"prevouts\": [\"3afa6c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e140320000000000225120571bc713e1a1d58bc4a7da330f9b17653bffa646093e5f5e3088fb48bff87491\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_59\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2be37752447d6d3e61d976dcf448cedd3898004706b07bdf763c3498f8f1eabaffca0230eb3385451772fb25bfc84b34af12626e5c57f422a290b3163278c8ca02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ff05145a9ee0ec2d634ba7cb1b257143a03a283099a9f46575731511ec4d29e376b63bc24295183e376b83c8f422d3bbadfbc8f87530bc51352c30d068b606a259\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5d547488bdc33c4ba9f4eb64d9e510fe10c43b64",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706101000000587c2fe78bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c428010000007d05a6b102dfca430000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac31718742\", \"prevouts\": [\"d4c011000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"f5ed340000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/checksigaddresults\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8dd4b96b4c1e16293541ea54ec6b33c8fe9a736c9f4696ca6656bde5a56404787c01f9fdfc65d8b8d90299e328e7a8496f72ae9827624ab8f344210387948ebc\", \"01b820871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba01b787\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363a4ab26b19b12dd5ed84675a14c998105d6f885db851af25affc21adf58dee419d170c934e59191828af4b443d621af5306292ce84d9ec7d56e4d5e95f4a2b883b6fd696714014486fd7f93eb277485a7e6b2ad9076f6f17fc1c22a649c512cece24022bfb434738800d6aeadbb65c0b5f1c54fd97b098ababd1df24d7362e80f41af64fbf9620aa43b24a95927199d6cd96f713b6c21c4241494f6ef0a4794b137108eeeef0d1cdb0bf8b9c7668f98c08793001c20de814582aa46fe17366f71bdfc32c1e1c145969abcbef65c26a893c9816b7a71a91b71dcfe4a49fffd792905e89fbc0a67267d9092cb76689d3f43e2e6846ec5193713df91969e861cb60c31b4d84c9ed58356d00f548e6c0b7494dab0ae598e30a63a373db1671630b0e008f7f368b69fdb42cf55796ee854208b1524a7b7ad1fac452c6296b4ad4fb087b0a6f9680ce7f5ca5bec9338fe334e6832114c99db2b4b78f7605856e14f0f922c7dab2635ca4d983bce69908efc2d6c8e3a4e02d107fe54b591d6c8cbc0ea2e862ced977f81641729beff04e69bc449bbaee4ae229138f125e8f575c30a32bf5a3113bfeca67cfbd40f858b9150f2d1112d4e5e609341baa11cda5532a4a71babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2aefe7af812ccdcfd31cc887cf61877f9006edaf7684a4ce32c2629479aa31cce8b8b9af7f42bf706093e8fda891a7f683bf43ed7a22b722824351e67798ff31\", \"05000000800020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367ca373a9284d9516d65ca57d42aeefe677abc27971d99a0e576ea3e033f0e37e18e226a88f8de1ffdbf8653e5e5c99d8ed6854f82ec6180716e498db4090bc6632eca1c10f6e29adacebae9c18d35728cfda46eaa96261d129acdc4b9e453cdf8e00a42427634156bf48aae55d12e65b2b6cdc4abb92f4ff102785641e1ad0d5b12d8443b4b548fc10604f059128cc28d89f7aec36eeec0a36f070495d2024be6b4d9c782523004c55b59cdfe76d2b17eaca8dbca1786e586c09b966ccead252fef997c426d9e949c5a3515b5e0042d45e4be44351c6f149d4fc020759a6f4b0d67374e7caf20322e7084d9546ded12af1d1c5a4e1ba9f0c95d59cab087df6e422f503472e6304a227f15c06c4bf90b77a0576afae68bfe51800240c398f7b74c3dfc6c9c46ba420c22a4b23a6e73e8909bd27f9a6cc2eba3b71442d590039c84de8a0e517ca4f4c263b0ab1b11f7cea6a468382fed8b4a21a3e6c2259e4be3735e9e781db25a304cb2b703fb372b5fb8e69d12880f4d83920da47a594e16bf0d7b8ad7363e0a6ef78402a031bc0a044f5a7e6c01a5c111176c74efd8c6d7787a57b391dd67ba025b9a60505ecd7fa3b5ed0808730285af9f495e709e1f92ab88b2911ad5a3c4781fcdc9458446cd8039a7a21ad2b04a0c05bedfec6a225c83df68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5d5955b5c12cb917cf3b4b20cef145f61555cebb",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c890100000045a341c4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfd010000000a8f2aea0184814a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e742cdbc45\", \"prevouts\": [\"97085a00000000002251201dfb228dec79c6e234b1139c58dcf8de3e24a7459acbe9e029f267c6e1783b9a\", \"44315d000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"304402203a89f73cc889ae00a7a48cabffdb45543b73bb22e77523cd9d61e5ef9aa5aac402204c6faa9abca40836d371f2854dd6e0a6b4d7964d9d309e212607488b480a3b2d5f\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"304402207ca44b668c8c91a37d7b5be371dd0ed908d5974cfded513072e97cc55b15d0700220773f9e8c44b697a34f30aa0bd2270f130932ff5a63995200cdaba8bbdd7a910b5f\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5d5d395b7d0d39e7e061299a0ac6d887b277e7f6",
    "content": "{\"tx\": \"bf72937702dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c91010000006ea375f4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd700000000a67e3fba04f02f8000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7afb7485f\", \"prevouts\": [\"158b5f000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"80a3220000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_51\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d53cb2aa996dfed6f2b90f6d1a3cd65f1f2cef383e2d9afcc9f36bda76fb7b12b810ddc1e47108eac36467f0f2bd088272242fc3442ec836c51623ac223f5114\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"75c3dacada1a0aa2159dffb05ed62dfc83c7beed10f32d3730c2b4fff673935afa789a917e95169b6e082cf4a51e2986cf01ff022521149c24caecfc2b592eba51\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5d67205500c9fd9a4b6a49b76f5ba2c4bc80f718",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0b020000000f6e3dab048ef750000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc7a814257\", \"prevouts\": [\"7cc753000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09029b250e9ddb4ef1d24523febd77857ce81814cae8c8a7688cb148874e1f1699616564df763ad6557f93a8243f6be9c3bae5eba87a9b1292c300e8180356d7f29e9fa7a022617ad7b782f04210523d7fbf71ad169d3372aebb443456e9630dc3b7fcfc44ea2e3f15419526b0a3a4f4ef10fcd3f4f5a9aa832e56eae1d76e6b6abba102b770c03f482fb69852509b7a45fbf3ec4e804048039872102450eeaafb9462de68efdbe65b6a5909ffab38f456c099cd94d5140e9e854f6004df2d6322f8f56f6be1c098204aa9464ecec7065bf74d89b9fec7116415bf3ea6dfb479474eb476f42743ec93fb34eb28f79020408b3f8723752b4b96b5b6808f17f803e4242a933f7a1432f6eb7d20fc2428c7ef9fb8aca69ebe66333ed68624d8757bffb4d3b70dea1544542640721ab736947f6a6c717f4a6a995dc385f658aff44b23f3a8a9214a2777dbbfc1cd761f281918ab94bef657db1db91f25f7c1b05880a9ff9c7ebdcb9616ccec23ba242fe3234bd2ab2fc3ecb4393f19b1d690dfcfb151fcf4c92a1ccea68b040c9eaef504eda43ecd157e02d309f378fea2f71a336b6704d5a0824f321c8ad90f6a81c6ff5fd53acd2f574c38f82535ceaa092867eb369e3aa874a13e1a6c6f26c397fa6cccf855002b3ebd05cb6aa4ec96c27d63f395643250d44712c71d4772d64a35a35087a68859a234e5e86180ea36d4a78f9cb3a10b23f656e7c041912175bc\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c671f46b5c4a8a91a91b52498ec1d50afa67569c2c9995041aa6fde798981e9899aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d5154a115ce154f943bf3cf8f46c74cde664956f57cd29b00bedec3f53c1a73157ff193055e5853205a1117b7666344cdb66562f15b4d40280f3656784bf5cd3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ff4628ba536955c325b011147fc1714a37f65ab397f7f99f0f14ace75448fd053fb38b0ca943cc4114eec77cc69c05760f01c70e1b9d5495b22ccdc96178f0b85e74c60078796421d1b77b50690deb93942db077130c3b47abc608e2d4c9c85ea2fb95e45183804e1893012c7f7e596047985120b977a82e6ef674a119cf06fb5198fa0e9330ec0d890651d2ce528cfec82d1549726a7a9c6da625bbe28ebdc708f5b98248534132faec965e5c6e7016b07b233cd94316cb788bf2fb74548d4c1b2e574636f8b171a29f898bff3134bcd4e4aeaa939111122f26ba9d829816f9333dc417574e74ce938da9f2cf2d1867a30afb6c6f1a1ebda548215189d43b3938b8fadb88e87e2f5d181c13b7a4488182983f0b695a9cb40113dfc996e57b6018ed4040bbdf6cb7be2d8d05f438a3b10d08b6e882e330977774b9447934727e5b5bf03540680fccb597f108f6e4340365bbb2df0a862bea9ee4286ac6bc3da1ef46f60318be286e333f0c1e44da18034dfda0fbf640a9ff6f3a063ae301d8b44eeaf2b43eb89b05c53eeff7b438f251f3b98d623f0f553aeac70e5480b83986a3cf6ba27679462f67083451d924ae1bc672e1aba419c8ab576cb3bff9a7a25aeb103121f0bf771b209daa74659c937cb4427b7faa8e39c7dbdd0c34a0000b90582fd0928d598e9a02ad80e2efb867ef12d921cb33de772ea35f249cb8155c70c73a889bded48133f07561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93617f3d357d262a0ace1eb8ae0982017753a860c00b575d1442d59c97716b7cc976628fbf290b9055f1812e9325160cdda478fd06188bac581533b5ab5319162eb04966f092bf1e4b4348fca11e7254311373308f7fc15e3d44d6a2afffa343c9657ff193055e5853205a1117b7666344cdb66562f15b4d40280f3656784bf5cd3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5d979fc0c97f4b30b22b3b449446ef2dad2f94fd",
    "content": "{\"tx\": \"3266ab6701bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0a02000000e846028402651c7300000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac25010000\", \"prevouts\": [\"1195750000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_33\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f3646360c3bcb95287fb9ad8eb9c3e93ef3264837f7e1fb204524db415b6331de3502c29ba57470dc285c872fda22ebb207c509de013d6ee82de550bc7d76e4201\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f136f633413d0715a2d15cc0725683fe4e2735a7e56624cd1862384ecdd22f7a8054412af2ba6c3c43735223ab0254b075d8645762d536ebbb5e4bde77ce07d733\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5da06db4c347f603cf5309c3456c26cc7ff974ad",
    "content": "{\"tx\": \"b76923990260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270be000000001e0361fa8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40c02000000c541bcca04e7f550000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df979722368987fe5af33a\", \"prevouts\": [\"2373110000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\", \"71844100000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063cd68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c9423051280ab0ba07278ceefb01ed123f8b9963758d62a87c192126ecaf00f1e22a66b502779d6b233f9a5a075cab3b2a5d3e595dfdfe607248b2d2d8734c7b9f4d7ab890a2001a7be6cb25cf630fcd24657943ff80a7c5a11988ecbf9e80e4620a19fd562e5ef578d66d29c84f34a4223ab3b995d34ad300c7b5f252d5e140\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936498acf89780080a2cd57bc0c10dce52b06266470b3eb2ef99b486159ea0e945d20e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e11863a41bc3dc2a7aa524e62e66740ce82713c2a995d68e9803c1affe373c89601029910a453e765cd82c29c3b576a90579a453f3a941b6b6175fa922e9a13196\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5dccc42ff618aec2747273439401c4901ac182b8",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703200000000ac43b0a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2801000000ab411cb402bca15a00000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963af0dd3e\", \"prevouts\": [\"d08e120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"319b4a000000000017a9141d8eff3030620b266a8bb5e50900ecd7b2ab72da87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"21561f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"974d25958931043c6b7cc3344c248be7a6ed9e6277f40fb672a1e4edd83a2bdff2a10e66e172c91858921ab17edcd9b8c1dc8a065c4bf5c8b78ffd8da66e47a6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5e1b24b8be80cb985494cc5e6aad6e0169f302a9",
    "content": "{\"tx\": \"760cfce6028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41e020000008082e1c6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1a010000009b10e7d2012db07a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478726010000\", \"prevouts\": [\"2967330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5d51770000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_cf\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e4f84cbed1be1e786bb3b34e98127de2b0a6a7259622d003b8fce943f9b980b6af53025d56fbb380e3fa14b2ee267aa278a8af8ab16b81a9fddf10118423228a83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"dd21672b844dc5eef5313357d3ea45619805fc089aa275e3f4ebe4be556d468facd4bff2d5e9e5bf65ab7e678d041b43511869966773f5f1034f39c0c36890a9cf\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5e29c824e31a38432a78e51cb6163effbc1b7632",
    "content": "{\"tx\": \"324e93d202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9a010000002b5640d48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fd00000000938fb6ab03c0a05f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88aca2c5a437\", \"prevouts\": [\"7def240000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"57833c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_c4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9600600e60ef1b30bff3a4e3b3a114d858e47100a069961c8c27151805892c80a161aeb9bde24150e004968b5d9c7660c24390db520b0990fa4379e4abc4a7eb03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4813c8774af586abad439797395c106945eab2540f56d547976d0055ed4118881540eeec74cc6112ec540faf8eedca83afb82fe880ff5179c4d46dbdaf2f5ed0c4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5e5cf1d19425ce321d71cf332626bab6bf9e5c44",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf92010000002d7002b0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb100000000c01dcced048b91e100000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79628eed841\", \"prevouts\": [\"b3f9850000000000235e212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"aa485e0000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b4f086362b79d90b8b59621bf6f80fc3c9e75f17a9109a8b9b2a68fc59cb536dafce45d091db8e55c50b7793462c89389e9b46a622028e2bbd3eff32815638f7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5e7998196110af78479912905025c638163deb00",
    "content": "{\"tx\": \"97ca34d70260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127044010000004c539de760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f0000000002921dd9f0244a22100000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48781000000\", \"prevouts\": [\"264b120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4732120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_41\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"de8089d8b74361b02bf2ec25842ca3a735e650a4ff654f87d7495dc0acb6f37b95b4faffd1186a23dcb3876e30f8d0b9d117f0d1d100223564dc2023bf0c6a2083\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3ae6dfca518aac9fdd2913ad68ff7c8b33b1f65ec7113cc40129c1725712e791c1ffc54da9a0724758798822f1a0e1aaca6389d0d41ea32ea9ce6ee2de5cfb3241\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5ec7eb46ae8e0891018b9848bc2341e3ef6ee62c",
    "content": "{\"tx\": \"f72903db0160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708a01000000c27adeb40243be100000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48716030000\", \"prevouts\": [\"d4a0120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_37\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a1a7efcbefdd3d042f1fe407442b72f7e36b1ba5a5eea8d82963b30e441d87f6eea093896f80738800382daf3a5a54da32c954b3d732d5b24fd22de8db29be8e82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7415f6159d193def5f543889775938ecda7491c83f1f4b5ebb21553fb0bed3f6ec0523428996d3b31a9a25fb058a2c45c2c13e5b014a06a66b58e7217a78554637\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5ef0bcd2fc8dc128e8583e90e1d3848ad698670d",
    "content": "{\"tx\": \"971ef45d02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0e01000000bea1139a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127071010000003f3d64ce026c8d91000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac6b0faa40\", \"prevouts\": [\"a3c78400000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"88c10e0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_csa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"acda7a718582f92aee3759ab0b33eb532ace3f5e408f31b9ece6b7d48686d7c5d3694eda712aaf3aa86498832245544cac0f51bfaf3623b0f726f95b97c2895d\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439befee6fda3cb49175c9fcdc99039bdef34bed6f8c885214259c1ab60f6e0548afc8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439befee6fda3cb49175c9fcdc99039bdef34bed6f8c885214259c1ab60f6e0548afc8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5f065a6b9d7bf300aef6fc736b6256c582fa075b",
    "content": "{\"tx\": \"7647552a02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfc01000000b71eb1cb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c489010000005bb7d7a804ae458a00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4dab3f4e\", \"prevouts\": [\"3c0e530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"85f03900000000002251201e1e43c91fff99f096580082345e8b6c592108fedec9f6a82472097138f3a147\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_1\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"542000d72ec43c4f8d706ce1405158876fe0de3e7b672a19800145de6bf211becb9ee8ff74f3ccabc3ffa061d019bf7e00828f5a4e0d54c62b8ad390217c598b\", \"b71a53f8d1ce3b1b4918fa70f5b7ae6e88675e644e955503751636355bb9e28ee41c315ba7b125074f36f2745c88cd10418f6867c98da30c0bc2c8cf74fcc3d4d9342f70d157a2506b0ecbfdecacac3a8e6e6e60a9c49491d4320e3f9494242fcda484aa13d6139ff187ce1d7bd0349b1fa3c89637198b10818fa758fc4f6f174adba206a83d88306e24aaced754ba733b4349c06e795366e8c94cadda1ed111c952f951047587aca4b64c5ed44d93378c1b972bfbb37c8a14d0e638c47c8f47d4deada61affc61872941d8ad3d1cc3193b645df427e43ef70a781fee7680575\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2000636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365c2ab5ec9fa482b6934284b5609962a0afc3aae20b96a93e54b5fc5dc02f16c60000000000000000000000000000000000000000000000000000000000000000467ba320cf76754858afbd0a410437dd45fec020789ba961ea4172c517f33629e5858531762eb6a698a1e3be7c8affa2992e03597c26e89af62e5a147b5ef486cb7eacdc29d885253cb6dc773ea1c82343fe772a2223138d156f7d07bac5cf2770ed531f6f86030bc09c893afdee98e07365ae576d295e36fde41ff5fa3efa73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe93c61bf449d1ca5ba09a216d6cd0cac8515bdb9901cd5b78b17567dfed89ad71ee7dfe112bf56e87fe8d7e87f6c04ca1d0de94fff41d1c5e23f1527525e2e2231d4b39d818b1eb61c090a0ee418dff9e2ab8f7a724a413571adfa69b3fb6e40aaaad9320e8f9ad462969b6aa096cd4095dd78ac9a586a2c43a4d0876e9081bee56ebd7b46142dca84cdce3bb7157d0682fad18c765ce07405ecf3278c3ef0aee210a26d72fe0be22d4a0f76a2de486244f2b71417194e5440b7574ebd70d0efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff020115476634b435782333af72ce400dbbdbacdea010bae619d3dbfa76cff88845c471c71870b81acbbb00b4afa4261a91d2a541cc33e35a5f0a79b9c45e3b760000000000000000000000000000000000000000000000000000000000000000a6c1b5866a6d69c6209ad23ef71d6a06094f27450e1b4e032183c409cbb411e78b4a687419f9c4ef9df5c78d65c634c1e27a28ac08f97d687d614b1828bc435c3907dd78ede7d267aaf41d3510632656f8817d048302547a9688ad7c4850539077b7573ecb3d28f5f5b092f4974a8043fef0520670f1c6a3ef58c60a72df8807000000000000000000000000000000000000000000000000000000000000000008837b8b6a3f8983afd89ec084ee3e9ee9c1e23306ccc468a29823f68a71d2c885a4620b4bb81d39d439aebd435b049188fd502d91eb02a197736995b7b681a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000b75fe9679abb4f3ef6c76f8204890d129fe5f8aacd42bf21d24036a60f4b7214e53f9f90c04a88857c4eefd545fa9220383d972e755ca1c092ba94faaf2036e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ad5cb5c118b7b710a1d7e63045925c542f6c28041121c1f15f1b2d1e7ed743009a6e94f0c3e4bb5520dc8daaa5e4d45e49ef5a62610f471a6d59f01fee05586c53db31f55a06b0dbeb3ecd8b904c596f7f14c356da40f7b46e2c5f3f20ab04fa0a89b0ea28fb713dd005dcf9defc6ded1c1666aee548e7719fe58f4594edf5affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000544b68a665ca4c315187b7d594a11b6095fc679da480ae7c2a5a79b875ddd5e40000000000000000000000000000000000000000000000000000000000000000a2edc52c483d392e19d27b3682e0539df72431c834a1cf493299c3bc2c48e9d5645d79752f33e13ddc7686e3b5bcb624380465814527ab1a8a96f5edd2255ae8c4dced00ac498230e0697e32927170e9b4e2e460d9a8cfe2477e3d1603bb7adbcfef4409233e1d32a0678b176021a8eebb825448e83c35c00f41a3dc14c0fc9e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c2ca47032e82458967123977e9bbed6a974abadd1477333c3cace184e3ac852aec05e2c2462d28b65e08830ee24c33e9659ca7649cc7e79f7d009dacd063380000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa22633b7b435bab136304e1af1fbdc5025b34d24306502d9d142511426e1cca7d3a4a8ee12f2776b9d9222e28d95839c9488639527171b1579145e96bb8bb4872b0935d8ed445848c17b7eae038d9b187cfb460a451b51d2f8bcef01ae97203d0000000000000000000000000000000000000000000000000000000000000000ce277f6aa795245afec21418da718cccde79d6abe906cb7fd0b0b9e7d8bcfee9af00a4b73dea1d7180fc16801899cf312761d03578288f429bf672eecd27857b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7ecc9a2324d4a2e5f2e11299983b026d7107849329dfdac1e2b04885277af1af59be8d4963d61780ff8301985f114a5168d163ba5c0f47cb07f42e77fb5a451704709ed649af2eaaf8a76d81c4e1f2bc9b359aad877a7d544f0da198be4189714a5388f9f8ebee45eb1ad56d0c75f3306214615107988ef5d09f5ed14fa037f76c154f01491897fd49a3f9e1730953cd1e02c1faaa441ac9918c78602713c67ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb92f5d52ff7399a99a72f1736f293950fb057b616bade753d632dc65769a006f\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"542000d72ec43c4f8d706ce1405158876fe0de3e7b672a19800145de6bf211becb9ee8ff74f3ccabc3ffa061d019bf7e00828f5a4e0d54c62b8ad390217c598b\", \"92f8830adfc90b83d616588b760ee454e07a997960c3f507ac8cfb561e60a218569cfb6c25d11bf935fbd489d8a30b5188ac545841d55f826061c35eb74c0cc1d0800bee575bb2c68143ec3d847f845893b2608e87a1f06d041f1ac0f7787782b53690f9e08e9e3b5d7343e94512cf0efb5a95eaf5205f932e3f9408c266c1617b39aeaefe69d71a5f5cbbbbd01403829decadd0da22097a1d2606ae88a5ed90a18470a1293776271be35d2ca14f7da0d4b9f0eee98a15f1243a834e68237f7427c4e5859b4777d4646ed8489daf898a03dca6063d273e5c1e8c516cf6148b\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2000636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365c2ab5ec9fa482b6934284b5609962a0afc3aae20b96a93e54b5fc5dc02f16c60000000000000000000000000000000000000000000000000000000000000000467ba320cf76754858afbd0a410437dd45fec020789ba961ea4172c517f33629e5858531762eb6a698a1e3be7c8affa2992e03597c26e89af62e5a147b5ef486cb7eacdc29d885253cb6dc773ea1c82343fe772a2223138d156f7d07bac5cf2770ed531f6f86030bc09c893afdee98e07365ae576d295e36fde41ff5fa3efa73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe93c61bf449d1ca5ba09a216d6cd0cac8515bdb9901cd5b78b17567dfed89ad71ee7dfe112bf56e87fe8d7e87f6c04ca1d0de94fff41d1c5e23f1527525e2e2231d4b39d818b1eb61c090a0ee418dff9e2ab8f7a724a413571adfa69b3fb6e40aaaad9320e8f9ad462969b6aa096cd4095dd78ac9a586a2c43a4d0876e9081bee56ebd7b46142dca84cdce3bb7157d0682fad18c765ce07405ecf3278c3ef0aee210a26d72fe0be22d4a0f76a2de486244f2b71417194e5440b7574ebd70d0efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff020115476634b435782333af72ce400dbbdbacdea010bae619d3dbfa76cff88845c471c71870b81acbbb00b4afa4261a91d2a541cc33e35a5f0a79b9c45e3b760000000000000000000000000000000000000000000000000000000000000000a6c1b5866a6d69c6209ad23ef71d6a06094f27450e1b4e032183c409cbb411e78b4a687419f9c4ef9df5c78d65c634c1e27a28ac08f97d687d614b1828bc435c3907dd78ede7d267aaf41d3510632656f8817d048302547a9688ad7c4850539077b7573ecb3d28f5f5b092f4974a8043fef0520670f1c6a3ef58c60a72df8807000000000000000000000000000000000000000000000000000000000000000008837b8b6a3f8983afd89ec084ee3e9ee9c1e23306ccc468a29823f68a71d2c885a4620b4bb81d39d439aebd435b049188fd502d91eb02a197736995b7b681a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000b75fe9679abb4f3ef6c76f8204890d129fe5f8aacd42bf21d24036a60f4b7214e53f9f90c04a88857c4eefd545fa9220383d972e755ca1c092ba94faaf2036e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ad5cb5c118b7b710a1d7e63045925c542f6c28041121c1f15f1b2d1e7ed743009a6e94f0c3e4bb5520dc8daaa5e4d45e49ef5a62610f471a6d59f01fee05586c53db31f55a06b0dbeb3ecd8b904c596f7f14c356da40f7b46e2c5f3f20ab04fa0a89b0ea28fb713dd005dcf9defc6ded1c1666aee548e7719fe58f4594edf5affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000544b68a665ca4c315187b7d594a11b6095fc679da480ae7c2a5a79b875ddd5e40000000000000000000000000000000000000000000000000000000000000000a2edc52c483d392e19d27b3682e0539df72431c834a1cf493299c3bc2c48e9d5645d79752f33e13ddc7686e3b5bcb624380465814527ab1a8a96f5edd2255ae8c4dced00ac498230e0697e32927170e9b4e2e460d9a8cfe2477e3d1603bb7adbcfef4409233e1d32a0678b176021a8eebb825448e83c35c00f41a3dc14c0fc9e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c2ca47032e82458967123977e9bbed6a974abadd1477333c3cace184e3ac852aec05e2c2462d28b65e08830ee24c33e9659ca7649cc7e79f7d009dacd063380000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa22633b7b435bab136304e1af1fbdc5025b34d24306502d9d142511426e1cca7d3a4a8ee12f2776b9d9222e28d95839c9488639527171b1579145e96bb8bb4872b0935d8ed445848c17b7eae038d9b187cfb460a451b51d2f8bcef01ae97203d0000000000000000000000000000000000000000000000000000000000000000ce277f6aa795245afec21418da718cccde79d6abe906cb7fd0b0b9e7d8bcfee9af00a4b73dea1d7180fc16801899cf312761d03578288f429bf672eecd27857b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7ecc9a2324d4a2e5f2e11299983b026d7107849329dfdac1e2b04885277af1af59be8d4963d61780ff8301985f114a5168d163ba5c0f47cb07f42e77fb5a451704709ed649af2eaaf8a76d81c4e1f2bc9b359aad877a7d544f0da198be4189714a5388f9f8ebee45eb1ad56d0c75f3306214615107988ef5d09f5ed14fa037f76c154f01491897fd49a3f9e1730953cd1e02c1faaa441ac9918c78602713c67ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb92f5d52ff7399a99a72f1736f293950fb057b616bade753d632dc65769a006f\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5f06fb75a8156e71669ca65d0d928c7effc223ff",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4f01000000b02ea1ac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e30100000099b12a1b60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703401000000cc4e3d950314417100000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc757020000\", \"prevouts\": [\"0fb65300000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\", \"2ac5100000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"03740f0000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082280ecd46f67705e4464578fc0c4eafd6d20a38d5c68152a49fc5d0c6b2a7c87ed2fecf8564d6a652bf0232997fa790ca314d73b111c417284694cd1738ccb12191585e32e966e39b6b25c1732dbccde0ae2700833a1164b08d78002e58493a9c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366b632d9cf4e2aaebce128d72748304c39681d2bcdf15a688dfe7a1c2c48044586014c92f678e181bf1dc3c918b3709f7d7746b7ca1ad43207ed3c2b1249c00bdd0313c1abdf0fb4e55d9b6d58af17743a20615f5654a8f167dbe9f4cf3a09059\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5f148693c5a6505500494101603fb4754464594f",
    "content": "{\"tx\": \"66a8b84102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf440100000027cdb0cb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a301000000fbab0fe603154c8c000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc74dc3dd23\", \"prevouts\": [\"ff977d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8a63100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ef\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9ab776834a7d51ff312a4d6538c2e273e8258cba8948a2e491d03eb95a2e5696b4578bdfc01b3ae2f4f313ac488b24d452da79dbb68b097c1b254d88a033ec8d01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c6b7be766cff0bf9186ccc6e28d137811fea7b8074fa9ce3940ed235a2e65715b3af32dcb22e427036f1d2021bb516b1e7fea029f3d9eaf66497bac166a54bb0ef\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5f1c481f15b7e89e16871d58cd5784dc2fbfc8f0",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7500000000bed07dca04c0871d00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898783aa7c29\", \"prevouts\": [\"d12c200000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"85\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1c80cdf889f2095af4d324c92b00d2a9db5fcc0724b0f6f8ee9ebbd204938760cb2a240b376911c9876b3695f79f395ec3f2d97b1695e5c0e7f397f1ed982e79a1b6e729898dfeeff93e2067a7d076aa1bb7914d367b163cafe54fabf88cb14d8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364b0900bf42a492e6d84803f411d6b7283b14689911cd75fb3ce169ea1a2bbfe0d4e60e987dc96ee5dbea4bc309cd424f3f3a0504752ed5a5936e8ec363297933734b3a7050eee065844830ad8d45a710891f78004f5e7f35b8fd72bf3ee94449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5f33c80c85ea079ca0e803f9157053bb5cc26ce9",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc9010000008569c1c7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b05010000000d6c2cfa0347939200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc5000000\", \"prevouts\": [\"5b906d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d95e270000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"017d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363a70d9b275504125857cbaafe4a923049b33c80b4c83ac6cdbd36bca05abf17733479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4ae05873438be84f92d1402d5d55e9fb409fe52800aaeb5db180b239b834bc1ca2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361819509e9671e02e7a4d8cb2e99fbc3fdcbb7d0847ecf4f66821ff751ef18b028874369940c44314cd428c72b977b6d1fa375b1e54ddd71363c505e3530065c38810a2a55ef559e3dd2f859359930339f67e2de31eeac841179b888fd41fd8a3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5f49d9e42303e9fd5d3b3beb8b4f91d1d295e920",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c78000000003e1cfcb0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c87000000004eb3e1eebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf930000000022a849d80147e877000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487a8000000\", \"prevouts\": [\"f2d35400000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"17484f00000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\", \"72f17a0000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d68bf7c140feaf8e4f60b8776bc2d1d8905ca34f4654213318f309611a791fb5a1ee4fc8dc3f50b1a7d3e5d21efc1fec664b6d43331f1543a08d774de08283d74b746d331d5c95ed01a802968db1eb0c81e0732cc306eb144cf9060c14b04a5c6a5e5061b73680a999fed0246f6cab8aa050c65d8ca054cbec9889d7184164e16fc8892d53c526e2d0319777ed8f82fb8165f3d4ef862eaa293789e9fa0908c057319c87d954e6274cb12c64f00e91cdc8f5145243a0189bfee992b27429d95021f953f23aeab4c6e7e7987c77378352a21d8b7fe4ebe28d113d8f7e0f662bd4bd4573b6e75c03493e72f22e525b5033e36f9c4e9b6e34a4c0342e539bfaa96c938c2477057ba1fccef550bf7f8d85f3f4eec2b7fc624e88884ad3bf1c32e839de0614b2cb30e81003c0620d9ac091d97c199bcaaa3c38faf2fb1cf1464e18eda2f4fcd7ae55c45a0d3cf2347cf9fd80afa78361c367fb700e17e7868e08757da8dcf9050b185e927d5c0cb7c9a80188884d03049231303cd03c23d9d6275abfe63eb720a423bf8926cd28ac0d416ffb7a866676825b560af653dd9a61be9389e375e1b9b0a117135099ecd9c11e0afaf647e1b9e90de8dd4f67b34a0823b913c66b98b2baff077dda4e21518a2317d1eb7274d9bc1fbded3844b9307ea03a8884d734ff9557ec92d29a1c157bf85c7e83dc0581a144a1e291e275ff5717a529f75ce3ca14b5c75f7275df\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045473717a4c1e901899f4f84b73650625e3fd5128aa3394961893ec6e831ca5ba551d880cc047c10a424f65fe9dd9096492f3efd8e08517d04362957faed36c3f852ff338358c59a252efd0a17af70f1cdfe194eb24c5d50483b26343bf89011bf\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090280dbce27bc6df840e8a2111bfbc544aa69a9062ac998d1aea9b5c19e4508542441b53073dac68032c2a7786a5fccdddc19a01fccd9c88dd0de26ecae8602b82ea65b88253f8f6103c1a1ad55cc629437d04b4ee6d3ccc0e33e3431927b45af53af61ee0593c59b469d553c6c4f550ecf021e07dbcf3981fe0d9a061583f90d6c00dfb5f3fd29fe895d9930c531bc2c5c24544e64b11f0f491320e2f80838a30268e491138071a849afb18322f676d06504ff1ac62d213ebf0330b754f0d96832509dbc5dd00dc9c5285eed78d78758d5033c95b8f38247af94cf64e855deb83e0d0e4a8461d9ac07de149feb3db55d0948f53120f3f454ec6b88f719e54c620163f49efd08813adf2d1fd450e57cb87d19d9c63852ce1c36d7f7eff5e089156971df45ea075b61f2792356059913df7f090cfa0dc801332be78b3ff8efde723f409a80c0f0b54b522b02cca7bd99642adc50ee3f9e1eea08938504b23cb8307a6dc7cf021b031dc32f6937082584aee4d7afcacd01a1479c0d89359b90a63886187849ede948546f367a85041b1546a118a7614488f915247616eef412263d436303c4228e2fea141a71ae0ad128f7d79b5f6c94e7941ee003e3ef6c0a9fb671fa79a6ff9e57143ee18e5bf70d107727b313561d7015477816b92bc41718fd89d5fb18667ef5edfcd3d391eea8791b0d1cfe8e8b7f665914ea119a2197e13fe3d0415ebdd2fbbf32f17561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb45385991a3000310359e2a9adae84589f286ca8f4d4476598a0e772bdb8ecbe6352ff338358c59a252efd0a17af70f1cdfe194eb24c5d50483b26343bf89011bf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5f617801a71e54b50b37fa8715f4acb9c710bc1d",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffb000000003c3851e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2b01000000a55d69fe016a56890000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796cd000000\", \"prevouts\": [\"ae147e0000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"731e4d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"86c6eec7193da1b5455bcf273a3a16114ee645411225a833cdd0a32e9dfd78b089bbf36f4e9af0c6d026973e0f1887dd6d29e2337079ae5afb26e1cfcefc1b3f81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"dfe32bb06ebc64fcd737b27bc8bef0840e3dc7794ab25058705659308f1453cc9be602519eb3ae6bfe877b8f16dd08e96b708997382d53b2a6903546206a00010a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5fae0f3d4ccf63a68fa6fc6ed2f605c153bc568e",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1602000000be453d33dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4c000000008b83fd6a01858b58000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748705000000\", \"prevouts\": [\"e5325d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0268220000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_mis_3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c677708e3196e905a65db1e859f10031e4e09b6ae41585884462f5e1196b3148d3fd4d0603e1d5a2a1d70f3f444fe2e1b8bc569009a5a4539dcfc4a21d3d47cb01\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ba8509c370606f9c579eb466d05a04f13d5db0021bb6e138c306fe8a542cb505acb5b46ba209ff8c47b727d8e35a4de76702e00bdfc0d66fa3199164a105412e03\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5fd0ea816791d944d140a7f5a132e628c4df41cf",
    "content": "{\"tx\": \"58bcc4a301dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbd01000000dd85e9b602df8448000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac46000000\", \"prevouts\": [\"aa2e4a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_43\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"87d077961f8f2397c36aa4a99b46e0dbeaecdd032434c973d6f45c84a2691ed9c40af7f80d79d4cd13dcdbfc7290bd83538f2c1b89d8c6e68db84e3cb3ab03ab\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b91ae0ef9e93bebeb3288bf7e2817763246cb75874fc608094a8f55cf2a1db8b6dd8ea87a26aecb9b3b7df2299d0d8576b1ffe6c8dafabb79c2f688d6f89a4d543\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/5fd72300746767ed3942898b20e747b5e468bf3f",
    "content": "{\"tx\": \"af047eec0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708d0100000035cba8a8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0500000000056a088502900d7b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fca77d2341\", \"prevouts\": [\"67e6110000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\", \"63c76b00000000002354212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4734f7eefaabd240db74a20e895a323978e3541c66ea1e8b55f9b9cc3a956339431fb1d9ecf8acdc726ab83cdcc6c9a89a2e9a0edc755bacfdaf9d5d6db5d5c7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/600a49efd1ef275dd0d15886970d34f50ceb2cb5",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127093010000002d19d9aadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba200000000c727f6d70274d23500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748705010000\", \"prevouts\": [\"f447110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"3830270000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6abf\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d517a865b9233942981930f9f8afabfa67810a1f554556b3d8041274c095c748aa3aa736b6bec5c04b20c5b38998d4f897a7594adad2cf377758bae1284900c20e3219675e68f7f320420702225b2b85f84783248daa0c82b4ef34e304883a54210\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93664b0019b93cb5fba4dac055f468adb936a6222806f746f4014a8a3f37639abc27a865b9233942981930f9f8afabfa67810a1f554556b3d8041274c095c748aa3aa736b6bec5c04b20c5b38998d4f897a7594adad2cf377758bae1284900c20e3219675e68f7f320420702225b2b85f84783248daa0c82b4ef34e304883a54210\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/600aee354a6065175892343ec14dc1eced5c33d7",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701d02000000cf6fd6acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdd00000000770059ed60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270030000000080b8e2a304c1997600000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5997e11d\", \"prevouts\": [\"a72f0e000000000017a91481d4142ddc5ce7a3de4047bd48b623419b5bc45e87\", \"8cd95a0000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\", \"ae2e0f000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"847d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faff78d21b135ee37de5fb006beb46b85f4aedf8bacb6598da1f15171cdf92c209c568c76d6b344a062dd798f6575db1f1731d6a7ca3f2682e7e1b801cd94d3826\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c194e7775fd7c80d883f2d740f9e56e49ab9a06d8b2a8d7428d3ae945cc345b376735f386d1a4700f0e60fd19c47be953169b4ae01039887cebf253884ac2528c568c76d6b344a062dd798f6575db1f1731d6a7ca3f2682e7e1b801cd94d3826\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/60157ba4a7cd240aad985554d23dafcb6b99be47",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1a02000000688f084d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c2010000009ef8d859045db7a1000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acc63ed24d\", \"prevouts\": [\"8f31660000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8f393d00000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_5a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0c322227924edb56429524d47975bec9661feced637da9488d938c579ed9d9f3f751e937ca88e77c996154191cd340a0ecff2647e9cef67303b4811bff21d623\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b72cd534632bcb423fd826395cb0170679cb69c34af86263d9fc29e106097cd0a2f0c7fe295147621a9d101cca84e4241d59b622c6d10e1a9651f22f5f58f3905a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/601bf2a7aa8b6c3a9adef4933fc515d494f4a95c",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47801000000d864d64160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706300000000b0448b2f01b9302e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8754010000\", \"prevouts\": [\"fb623f0000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"33201100000000002256202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7e6eff66ddca203267f8079794c4aa5cc3e46d949ac5d785b162a8c7acf888f7b978e1f3a0accdf966e42dfe4dd7cc59d4d6da856cd372a1bbf908a6bfdb3ed1\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6030146df9ff31d1d977c2672cfc3792ad81865d",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4d0100000097b2f1d4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff300000000335a90e48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43900000000f069d69701a1ee2600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aceb020000\", \"prevouts\": [\"98775d0000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\", \"e37b73000000000017a9148462ed29696925d7688e1db8e76ef9e6667f05b287\", \"74ed3100000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902cebb14ae0976d2a761e7312a258e5691aade4f58cee01a039414a95b2ad9366950f9d22dc2d56986735460027f83409b3d76a03ebb5acf5951b743755e38ef6f856d3330744f493bdbc242a87021e9eee73d256fd114103c90a47cdd9169889ca6d88850e3dc228fdec261be836ca0eca2a63643b5463fe3eca82100fb05a89c6fc7153b0691ed830eebaf4c4a5add6478f5c67a5b0352cea3f315e19bb0caab04878d1c87ad73229e35b16846e1541a378fa47c0136713b96c664e203b7f39736d6752340971b166baea7b7a1b64739802b3228e211a750a2ba6e46037db35828b8be5cfe71d75c54b2c1f4ca5890edcb193ff2f89e1a92b277d6180525e680f649fa1b6a7fb04c09ed5f1ded674c69a1a1f660ac2665092ac9cf44d1a0d83c14cc196b95fd27db03a317cd1ab19247e5ced20bcd1b658cfc6c134aa1094b6f5b311dac11c1ab606eff1a70a5041365e9822b572ecb58bb02d17b726875af11ecb742107be3ca7ad4f59b7b71fb9065334ad509ee37c9400abf4eae3a8ad0384fa350635f2eedff03e71bae11111a7d2495f629ffb888512a01963550bbc0350b863f413c96fac5aa4ac395495c30dfcb75ec7d3eea1bc672a38bacd23419a71fb38a1b2347b459e03ddccd0e32cc810313ff42e5768bbbbbf5a8faf88ec0876e4b67e7f7aa643271374a65005f04598c97dee9fd0968fcfe6371f59b631b2d81d16d8fced4a39d4d75e9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082c3950c17255228812280bec2d0cca04b586565374a97ee6c913745c9c1a159600ce9ba0618adb3ee44483a22999a54a4e1710b9846377d8164aaa29371d79f22a2fa119ef3ac370f8290f87fe8954e212d8c61d3545cf9da1d8aa62b42f72813\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090222a6561a0e906e5cde7507b9e35dda6a2608ec0600c213a66226848db87593fafa194a6a01d862b3e29dbeb40f502a22cafe5bcf5842c552f3aaeafc056d6113c418c285a38d4a625f94f981ad119b0f627e5418c08b471676dd18d7102d2330cc780645a7b0e4e7480172f20641ade124179be416c856f3ee7ffcc1c0f7f66a665ed3b779b9aa02c7df92c9eb3af8b2beb601e42b7cc9a8f696c1a81ea97e23451699214834b98f2b66ad6310664c466276408f754928ccf0fa72ff59193dc6ed0282290fc25205ad57bb0a9415559d0299bfe17b029a6cdb4bca0dd3ed14ec30187c90b4a883d7218bd0b996ff3e60ca83aab6d3279953a9137ddbb6038748f9bb2a83a7c39f18fff94eb2fa5d23a1b6c6db163943ee8fd4dffa4526326a6adf04530e299dfc99683d22677a00251842b6d798ba0fb88826a35f2fc72d04fa40303b66ca2e1c12f8ce6b1a27c9134d6e07a404caa0857a57aa76391558fb9fbb0c98c6df61aa4fa8aa0615e38591470cb0f60317fd74b6b754648f71e599e621438aa654b2bb937b649be08fae10bf953aa791f5a0b6aac76c9e80c61fb1d64948528d9fcae33b277e0506eed1c0785b7577688393914e39ca2cbf39e08c0b77d716db3266a9f902ab20488c091c0300a12e18b9f4f65f81483941ea1bca66c23307f14dad070e3bcefe2cf9da69a00229faff2aec5ccfd76009b3018b45249c00f5d20eb5840a647561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d60d23b5fa12cba50628f4886671306729110bc543fd454bef1f18df07be9211fcbd8218c9dac71a3535cf40d08210778548ef11a7c40c018c5ea1885d9980740ce9ba0618adb3ee44483a22999a54a4e1710b9846377d8164aaa29371d79f22a2fa119ef3ac370f8290f87fe8954e212d8c61d3545cf9da1d8aa62b42f72813\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/60350336430acbd30d2f4a7afd671e1a676249b8",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42d01000000bdb630c88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cd000000003ebb08c28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f400000000c26dee9901a9b60e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374879a000000\", \"prevouts\": [\"804a37000000000021561f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"47ba3c0000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\", \"dfe4400000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"f07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363b039c0e9d8bf6e88a427a2ddf5980e431ac842cc97f6c7b94ab341d52b6d0fdbec2e27f579b173781717090b44a070e7a8880532a05b17dc998986213b0a92d21741bf2762a3041d275698fd56a81520b6404e88c31ed080bdecc36c09cb10e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93652dd3253268b521b8234f9a6c7de3fba7d5f203b8100eaddd2fc9e08d24fa7c435987c1d75c441670cebdf615816c6f42e3d99515a7a7b9841c20e75c916465ebec2e27f579b173781717090b44a070e7a8880532a05b17dc998986213b0a92d21741bf2762a3041d275698fd56a81520b6404e88c31ed080bdecc36c09cb10e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/604aa389e1cdb7844558781a66e69bb80e5f7ed4",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270240100000016d9ce96dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b740100000085d2d2f90174352f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acc1040000\", \"prevouts\": [\"3fde11000000000017a9149d4bcb1ed806c9beed692a78614f8b90a68c708187\", \"7903270000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"21571f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"15bb12fdf12c0e4a1e19ec0ed405846f8e030af8e2f45a52e90f8b4b848d733c528a438c305cc14eaafe646856418e70cd834fed506aa34c27265e7829ddc9ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6070c8050e46e845c5170ec25daefa937dbbdd11",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8b000000008783f9a3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf850000000061d3980c048f94c6000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7f11eac39\", \"prevouts\": [\"ed4553000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\", \"e55075000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"304402207c3560a1b325f60608c03ba21e230e144c06005942eb9b208c676bb569b242e102201e3ab2f0c0137ba95e943535fe46234ce0fbf9143783044187046bc848149f6901\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"30440220590fd32adbcb6e036526a61ea254a11fa14d3319fffa382dff23e0b3395c509f02207ec326f9affa0aa6108fe6b4fb5534d50de66a021083aa3d6ace4bbd65568f3601\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/608151513d665821b3914810e70e9c1f957da187",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702800000000800da0c18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b4000000004386efe703b659440000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1bd3c834\", \"prevouts\": [\"d1a1100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"46513600000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"483045022100a3b9a90f7f608d76fc20be55a2b18001ffd1d09a68f110e8f572715ccc89718c02202f88a2681be70195652e0cf90a000781c6e131e92210db2d4d8a77508a6c18e7852102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100aa9878010ce7dd01e0970ceabc1a33669e4adc188f69f35882800203fe1feca3022063d04c1b13e431fd4395fbb297ac2bf06dca4755dc60a1910855cd3c4215b4b2852102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/60a40b71e2980d806f6e3f1f604e1c25d8d684a9",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfe010000000fe2765760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ea00000000cfd16a8c01ff36080000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796ba030000\", \"prevouts\": [\"92fd270000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\", \"b4031300000000002251206c786b308a9c6a675d6ba645c0b3fdb6ef76f1ce96e6f31b784e53054a24ec87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360ed7b0b6321a9c82dfd18851526d308dc485f056f75d2abb96b2300df7f1dd61\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a9f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/60c433ddebf0bd6ec3f44d608946aed9e843587f",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfd00000000abc441cc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4220200000015f555c90339ce5500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4870b030000\", \"prevouts\": [\"114527000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\", \"9d7b310000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fb4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d514c1cf5ffa00c6c7050afc353617823cd679ab4db6c6aacae1c16f62a2980653852b51aac478484d8a075e848b67a41ce9b347e1249fa49816f898b909a6d4bd5c77e07a04f832bf80fe1e45fa6237ff98bc90e935546ee680c041b2556eaccab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52fb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93695454243f1cd73e7efe7199757ab68ab99257375d0485b32e96b03b75ee2089778b7d2e6e031ffcaa796ad02cee9894dc771f62b9a69e495a6b0c07c9d130bc643d925f8e6664e67417d113cf51c5b4c3126025efa5f83bf5b16dba6746279b738273d2ad306f831e931ee90238e60477c8ec11f350a3ad34ea06c6c58bf7ea3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/616a7fdb9927448c5c9e34f94d4f6d784f55ccf8",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4160200000022cbc59f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700c0200000019f988b38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46e00000000d2570be0027ad87c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc70deadc2a\", \"prevouts\": [\"d5b6320000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\", \"59ad12000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\", \"5152390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"8d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0829640e65f27972e690b56e28a8f49ec76fed3450565b59143bd547c42619e148d8047789ecbd47ea83af97bdb87f8422a4707031714ddb05eaa38b24e158a7c35\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360a8a801582dd903a75de5904df4445cb714185a34938b03fb7716e9516670c429640e65f27972e690b56e28a8f49ec76fed3450565b59143bd547c42619e148d8047789ecbd47ea83af97bdb87f8422a4707031714ddb05eaa38b24e158a7c35\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/617d47ec32a898ac6e2b5bdd9b8e643408054596",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708a000000006cad66f9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf50000000010b9b10002826d6b0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca5000000\", \"prevouts\": [\"c136110000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\", \"bf2e5c000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d514c57128c8a67973c5c0637342f282ffab122f5a34eae9e616b37e48a600a7a243e02ad6eabd24d4d247e98c297de2a9d81d67e55d72d4ddf06c8e9a23565ad8a003e045cb689fe4fc6de332c618eb0cdce02c2dd8aae7c6dd6f70bdbaede2814\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670ae177af992db50f31dcdf0d3e38cfa7e2e74b3eb9ff8cfcd46237e8c91da365f20acab37c5a5cb044828a71c51f411f3799e0c9201344692cb6121a679af6a96525fdd0eb5f3c5c39bf5b04d78b37703e3d3b538b36e17fa0ddbdeb236a5daa4337ae81428241101d56ff91a1822e405405037c9afab8da6ba5df5d84918ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/61ac7af8ebd0ac559618d67f23d159b57dce5577",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2e000000004f19aad78bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a9000000008152fdb1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8b01000000bc4390e0033a13a400000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d3c8e225\", \"prevouts\": [\"20dc4d0000000000225120ec87a05d11c16a148e05f58a688dc5bed4b2941085b66901aaa75337acfb52a4\", \"f0dc3300000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"0f0a25000000000022512063eb770f298cfb14c87c6cff1e0541dd7cbc30bdbab4472c0f37d52bd55ad696\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a4e16c32678f9526b399cba9b784e72f2992f57e86dc0d30aed359cd8163f6c1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a6a616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/61ad3f5b692481700ab46b1c77ecf7e1590f4f72",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7900000000f330f40adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b590100000008d985f0031e937400000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac2cb95a1f\", \"prevouts\": [\"9343500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a6ef260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_f2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a09bd3b259d35714994da18e608796841604a3aa418b893979bc70b65d26913f37371cb50fd2d1bf67f3ba4969d4d43b8d018e122f3be7584b245da98c646ed82\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1b6e3247f48fea47a56cbc1391b4aa6d417090bb66e4eac3feaa66c163dc0ecbd1de148744174d4e5238a52a5cb80fa32e1d1ac598b302807f39a1f00d513413f2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/61ad53ecbb9e93b9d193624ee3222dd39af8c8a4",
    "content": "{\"tx\": \"865915d603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4200000000458456e0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9d00000000e0cafcf560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707a000000000805b2d203a5255300000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac4a000000\", \"prevouts\": [\"ed2920000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"3f51250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e9fa0f0000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d2c366f5f09fc7681ee328c1d1e0744e3d1f6968f411bc983eafb1d97babb7357017647596b1d0b5d4400ffddc5cd50d9aaa53b080f112dfaa2c5985c87c2ab6054554b46e48c04e7631c61fb50d897e6202de7a2650e8e40522947bca33e6cb1402e8ea9ddce4852f0460c99dd3632d833d13dbf42d93b664b88a5ac58d27e9dd411dd68cc2a921a90710ccde304737ed292254dc1b1face00754a7ec9ac0de659194f441184ff96b2cad650d3f53bf15e9d6da8e325857d5aee2b252475d17ab0508ed4eaeae32469282e40f203de623d3cb895eb9bb084bc1304d98d64631cf422de97bfba40f0325e2086add112b420880c543fb742da4d8cdfc0b83091a5478a1b7d4fc836fe6b505f2163d79bbea0b9560c41feca534e9076f70d4481b18cb03b42242bd7987b6040d650f8a4bc410c78d6481ba58b633e3e60ae24d114645a7f0279eb111c4613279adc31608460cf8e526bc2d92a75c2c941b174d172281f4b5fe85af826f5e874e4b11e9900c07dbf8d5b47f7871b8db5cb853f661e8c6b1ab55854d0715ec68418a75887950f3776efc9cf312aef724f17fbec30bd7a5c191712fd1cd05ebfc3fb0f6d32ba36688067c260012c5564ee44b6983d7e284055be54a6a73aea1762b58339e2d48d84060d6049e16b58bb8f3e01bb3aad920e4b1b395c05a697d3e5f511f4d2062db1ff237e5672433a8e5da8c4c311413e31766f53f97f89b75\", \"6c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699ac01d1255123521c36b523ade2f83d5f7b8cfaacc623fc56a5e5790c6fa726582208a7b7ada7f1b97e8a78343d1faf2bcdbc0a6f50e4fc104dcbcaf06e1472e7ade389b5221dc8da0332285833f8f90d31bff9f5dd8cabba4bb6916c2c5f203000b960c1063a40dfb5dc510671dff140eefb73aa6757bc42ddda0d13c6b661\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09026294caed73fb93cbdc2d4cc7c05cbb2e5d67cb415e4bdd98714d6671da1da886775dfb9a1731b8b3252b535fee4a037cfcb44bd4e4af04a3ab23a63ee4e3bdc916c8d0c8abf69d82ad05b5ce0ae927de1f7942b63cba10ad8f5a996b56e998cb051e29f8ebba2a09643b0974c301c6768e85f363aee4376fd2e6a5b5c60b7234f0fdd44ba0670dfc50a13bd80821bfca84b1b0a76ad5aba6f7cd1d5b374ef3dc46fce9480c38472066d540b56a1625193741413aa339a484da5980a773544e2ea67a4a5a6c335e524ff8aaa5cab5e6a23bb41fe3898a8fec94ed42e1d73e965203020fda8fbcdf3a9fb55772f90a8215e9923be8201216d216d1d6915a827a256d0f4185b1b938ec5aab78fd91af7e8ff8042b23a072fa71aaac7f4f7162575bd9aab17780993b109029770444eba185a81b69436a8372d3df59b0d03c20c08111e0e38b5569a68c89002f5d099191b304a6a72b91e9829cadefc342a5bb0041abded379b05ad94118e34b464311fe10eb1fb398ad2351ec5431711f52def2426d268fc2098175e0734494f37385e454057f2feac6faaa5ccffce27e8af066527a7f05c49c755944d240e3223ef9b97b7dee6ab0ecb007c7dd47822121d80bbd8b7f02788d438d1f49551e88203dd130874e4bb9f0c2f798e9b416534d9b267e28dd24a3d5898443d0aee66a306338b26f99195ba7878c47253ad22d8a8977212669db090aec72dca275\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369b3812b1e99c6fdedf163c708140d27f446ac63a89153db0a9d90b526328f674582208a7b7ada7f1b97e8a78343d1faf2bcdbc0a6f50e4fc104dcbcaf06e1472e7ade389b5221dc8da0332285833f8f90d31bff9f5dd8cabba4bb6916c2c5f203000b960c1063a40dfb5dc510671dff140eefb73aa6757bc42ddda0d13c6b661\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/61af1bfa70f27db871da9994cee2a1fa6dbfe915",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4200000000909948478bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47a00000000b7bad9750152878e000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47877d532648\", \"prevouts\": [\"407b6800000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\", \"67d73c00000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e54c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51b15c6036a676a492a4bf737064ce6a21b64de8ad159d3b2e60d879468caf8957d0cdffd10ffbed86c0e7536425f8f402fac685ef3be7cf3af5c775f2718b4072\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52e5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4deb89faaac3ba7f5e16436fc8221b82cf02c075e22a72f26a59deb249ff0d9e9edc23a266999aa1773fe99be867e95cb2abe2d57657b7a4dc20a388644aabac6d0cdffd10ffbed86c0e7536425f8f402fac685ef3be7cf3af5c775f2718b4072\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/61cb3c37ef29bf5abdbf60157dd9334ea8578716",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270970000000058396aee0262b20e00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75b869d3f\", \"prevouts\": [\"246010000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"6f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08246c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa250e9882e2e133b56af40caa5e77ecf964d6e28c7a51ea626a8db4d1e1f7bbb4a3f8f9fe88f0f431b5ffad473abfcf1c4b340e1c7daa1232bf4c86f035b8cc51\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d671bc8379695bd53537ac42fe7f6ce70c4715992c44bf872eb735ea6e29d06250e9882e2e133b56af40caa5e77ecf964d6e28c7a51ea626a8db4d1e1f7bbb4a3f8f9fe88f0f431b5ffad473abfcf1c4b340e1c7daa1232bf4c86f035b8cc51\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/61cca434775b13627deda2ffc7b421cc834c16ee",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127010000000008e090c5160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cd01000000885fa63502431e1c0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8a000000\", \"prevouts\": [\"68d90f000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"d1220f0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"dd4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb48439541955ba1ee927ac695664eb0a176a74cc392dce51705e9d682cc4042391e6ff37e966b1384c4d5bfa916e4482452180179a80b37f756d07f3e2976ea2d444f11caf36eb2bc7b2ba56ad05f43983925bc55248f9b66a13a767efbac40c00\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dbb12e8fa457546fdd4a7d9164919411804187407b1d76f0315307aa97171b6e8439541955ba1ee927ac695664eb0a176a74cc392dce51705e9d682cc4042391e6ff37e966b1384c4d5bfa916e4482452180179a80b37f756d07f3e2976ea2d444f11caf36eb2bc7b2ba56ad05f43983925bc55248f9b66a13a767efbac40c00\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/61cd2f257a7e5a750b8f03f5aac0ffb2badc3aef",
    "content": "{\"tx\": \"0200000001f85ef04c4139d614d10d1a30e75a9f6421df67317126da87b2f877c2ab20246301000000002a67d6e90189d4f84f050000001976a914a875a4732dcf342e2587f26f2b7b2ea4a2fd587488ac30050000\", \"prevouts\": [\"1acc45b01400000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_valid\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"576dd7bfb72e5379a8317f3a54b9287d49891291fd96a2084e781943b3424287a63f413d1b4cccd89e1529deaba58b40aa10b57644af7a2ee55203e2c0244f02\", \"20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac\", \"c0cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f312f383ce02997bd7885b2023ff24b4d79c49e77348af650460f5903df7baafc9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/61dfcc18f9bbed9da1c93970d11da1509777d17c",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bae00000000e0364cf58bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46100000000669af35004b73f53000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca91b3e44\", \"prevouts\": [\"43dc21000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"923d34000000000017a91482be44661ef9d172a86ea47619409ff206130f7487\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2256202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"a660fdb7c4037739f334e7e659b27905e93eaddab34558b64574115300f23f90816ae8cb635589087ba290c7a4fe45f90d9e077b34d78f553880d7ba813979ca\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/622454dc9deabc8438f95f3e6280211c37369c04",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270170200000079ce70c5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf31000000004c1ea1b001a9b353000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748760020000\", \"prevouts\": [\"7ff80e0000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\", \"541766000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"347d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823ac03c85a7bde4aa83325c4e9fa3803d6178be55885bf5b72d341e036ded0599070c3fd2cc03cfe72ec91581f9e22200fa4c4f6deb8dafcd335310e90efb11e5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e273fc53fb3c003aa1081c29bba6e2ce61bbe16b764fbbf36a77a34a2c2a6596a750add471e9b5b51db6817cb10861abf00379c9e2c8d017af134b88039c39e3ca882fe3c585d1ac8aa5218112791e3065e91b4e1e0362790dbd367cd44cec36e97124583e57aeab90707503ff0d8dae530166a9193c4517699e1743b45d7c12\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/626dec99c8f47a95e864b2a31b4ca6b916ee594c",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127014010000007885ab88bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3501000000d8098c37dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0800000000ce51b63e0198b6c300000000001600149d38710eb90e420b159c7a9263994c88e6810bc7bf71183c\", \"prevouts\": [\"2537120000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\", \"5971770000000000215d1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"58b05a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b060881f6fee60f523a0890c4673283817e38433cc5cd4db7c376bb5c48f932c30e3141d824141d7176dcab8d3aaea2d82867678a23d6d379d141b4f9d5f637f\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/629399f535a4b780a7126fd274938c9e1bdd9b94",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd100000000ec47e22bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfae01000000926ff007049a1bec000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac12020000\", \"prevouts\": [\"942b7c0000000000225120cebe24bd65f3df56aab440a71cbc9879a1b3f80f985a5dd97b0c93b61f81cd49\", \"6cee72000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6afd\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ecf11a840f350f547c61b448cdd6e366448a3c04413fe40af096eb0d980da89820e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1e0a7be32fdcca7a506e9ce249f658cc089bc7a3d23614d55e872a83e7956fea4416efa3a61de7db58e4e5b27e55eab88df01883130071a88e8c07ccbf4e37c61\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936afd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173acf0ef20a11005175256561cf2f67252fad6f828fd45e261da47aa072728c1e1d416efa3a61de7db58e4e5b27e55eab88df01883130071a88e8c07ccbf4e37c61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/629683fa749137e2dfd6e82633d304ea6c124ce3",
    "content": "{\"tx\": \"9f516898028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4370000000009665a87bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe60000000014113c8e04b9d8c0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac96dffc49\", \"prevouts\": [\"6081400000000000225120b10c5cbe32c5e90da6e76e6bf182a80e9130a66e1280db2d9eaabffb93bce832\", \"aeb98200000000002251205b7dc500a06d9d49351272d9ef7a52148a11476ab62e1647e512b05f260e1644\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da7a3882115c20da13b0db94a14cd63dfa5fecd118ec27d0fe3f55ed094799d9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a5e616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/62c572a03d69a6b40d25947abae19bf6ce5eb385",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c701000000252fad978bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42f00000000e9e83d9b03a9ff6800000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787f6dec441\", \"prevouts\": [\"e4a632000000000022512035c5e2b60676b638367c49c5274cc65e6feb881fb1407d2a5f35cf666d25b965\", \"0b5b390000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063df68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d5f68448c89c580d464efc0ff5819ac3386b6086c96d1a6f5384fcf87289b415a18b5f2fef84521b683d8aac742b48aa2197bd0282730b1a4f3a8fad5441e2c71c315aec02adde316e700f87e7c47f474d1ec7cdd06b196ee567d81a15967a13360497a554a17affee0221519da82623f7958d9c28014b232926f5323d6c78d1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368461da0bf0f5688f9852115eae774a4cdbbb182b967d387ebd70cf0c7ed10d95473717a4c1e901899f4f84b73650625e3fd5128aa3394961893ec6e831ca5ba551d880cc047c10a424f65fe9dd9096492f3efd8e08517d04362957faed36c3f852ff338358c59a252efd0a17af70f1cdfe194eb24c5d50483b26343bf89011bf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/62d04745f9fcb76848b12153a162a268f14abeca",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1501000000e3ee7de3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c32010000003f2fec4a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b8010000006499adc6032e11bf00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc77d690e25\", \"prevouts\": [\"38975c0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\", \"cb9154000000000022512096d49a663447a0304343e0ca844d9bda5a7da8dbda233b650dfa03e219f7bd31\", \"eee1100000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"9d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bfe22090f7ab89ba3505a6a05ede881092e9f2c3b80d443c66a4d230bc2d602b8024f0f821479c34a3d08a46a80a2c380535e71b033b1c786baa16eef71e1977ae2f7927e5cc4d53e0e18212acda8d85e01e1da74473232947322e5e96654c18\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fabf8cf3051908396d96a16e21f9fb14717dee7b5dfac112f56d0746b9362fe4375cb645b004d221127868eb317b35b9739fc590ddfdd834a11f89e113e113367cae2f7927e5cc4d53e0e18212acda8d85e01e1da74473232947322e5e96654c18\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/62f4696a4d80fd4c0dc13ef75f8bacef6743b8d7",
    "content": "{\"tx\": \"e61fc582038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45601000000c4e2b5b8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2001000000c5b7f7db8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41a020000002528aeb801fdae1700000000001600149d38710eb90e420b159c7a9263994c88e6810bc7c4010000\", \"prevouts\": [\"f0893300000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\", \"8b96760000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\", \"5e9f320000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c08ab59be3ec08c5813df127e6171cab5e5b5b7ca033be6df840b5a39ed859095a2fb75442cf9d6444c8679a19413f9a060e476aaf84ff603b3b22173ec950d19a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e8d213d90ee48874bbf2b18160b4fefa78452fd9fac91ad5f640de90a3ceda28c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936207c9c4f97e2dba2ec4fa9382e1eb978f292c30dbe8b8adc6375e7e52fe13859672094c3f08b9327f7ee48bb8899708766c48e78ef53e5ef370aaf6f5fa99ca1ce42d201fd753cc19d7433434234602e4af838ce265353441a761579b9ecb89c78d53ca9a9f93e78db88a883cc9c42dbf55ad09041fa37b21a93adcd191d7180\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/62f8cb127c31b1882150c0c8effbd39c09119e5f",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdd01000000e63665ac02286c4800000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc43000000\", \"prevouts\": [\"bfd14a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_40\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"14e16d7dcc2c719c7e163b2e5d81cd4aa9781946ba7ddf2b596d9e93222b1177898e01d1ab846bd1d0ea1ba179cf1ff545f5df4442282765f7d7ac4ec7cb65b502\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"dc9a39165d8459b1342428c6aa2e0ef8334459b37b5e05de37f9f6aae4988063e26e3bbc10fefb72cbc5b57db9c825f3aef3e148754155f667f9a6e541dc2bdf40\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/630f756a29287a797ffb5586566bc1d25758573d",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1b020000001b786e618bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ea01000000fb510c0860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700f020000007a80c8d8019ead11000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d2de3b4b\", \"prevouts\": [\"ab2348000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"bb733b0000000000225120c52c9d5db69f3d85ee35b65e5555252fc0470ab9a3dcbb72267f75438b29b283\", \"885a110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369f66c13277c1dff86476ccc2b2410b8070d8457ffe942302ee55e774342eccc7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a9c616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/63167cb8ba3874badf57f0e855e7f02478cfd49f",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0a00000000de79a0db8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48d000000005b9d85b103a002680000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787cfaf4061\", \"prevouts\": [\"7c9e2700000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\", \"aaf3410000000000225120efa68a115895f942057851c042deb7d61335a3ab48b9e56d15cb953fb46ad7bc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"0f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93663c49ee3ba831a9a6786c5c6320bc4ec5a81d02658bcf51f9bb482c2f495569c68491001e36edf91058819766439c3f31bd198abbe3d2204f458ac7743e1d61ccf16a5e3db9e2b81c974405e52c4661efcc91a529144e47e78be5814d4a09901\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d14083827bc4b64cda0a8609af1f33bf70388b2df5d24ede096953ad9366a4004be90cc292444734c987c78e965b1739d018b44a402c956c06fcfea30a9c442ccf16a5e3db9e2b81c974405e52c4661efcc91a529144e47e78be5814d4a09901\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6316bbbc6a41808b00262eab5f5262fcfa97066b",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0e02000000b7c1fbd004b19655000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787b7799960\", \"prevouts\": [\"2db4570000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_89\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fa33aed19e7348584fb2e7883bdbcedd805b763539f1da675e6647cc47c7cf8245200518f107ca97e6847db03dffcd717091a918e649240547789614cda9158c81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"02fc920bb623b62a692aadd32a1663b38b7e38efd98892807e5637239f974e1273937b6facc07344e9ada57e9e82daf6c971dc41b047e3e9ec58afe26396fd1289\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/63254af008fbdb6301cc07058a867abb97610c66",
    "content": "{\"tx\": \"17d518f302dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5800000000e32f0abb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48400000000644a2ed2022f4f5700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc20000000\", \"prevouts\": [\"c7ec230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b9703500000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"ff7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e9987eb7009ccae8c65258c62e5eac53ed5016922d24407b897adc5526f33b91916c082ffd0388de178727289f9edc245ed8244bc4e4186d1c7a66ea621fec0ad\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936481f5e4c3fecd787fe4d3635c6d8b344fb02d1f9c3cab01b9a7177bb21a6fd3df59f882dcce043ab5273f79d0d152c35fae0f251a6812c7f2d3daa07c20029a516c082ffd0388de178727289f9edc245ed8244bc4e4186d1c7a66ea621fec0ad\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/633faf2de8dd00d4d8b3bbdda4d9f2125613a89d",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41400000000eed2c5da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fa01000000017337ee03ceba4600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc71b7ed33b\", \"prevouts\": [\"8c5c36000000000017a91454957ff2b5c5fa7ace3c6fb485b914ecf6ce0c8c87\", \"2b5b12000000000017a91441ce0eb0e6e5800ced23a872818e5aaa63be0d5b87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"1658142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"e73fcdf715aa776aab30a3a370117f5b9829a61e46b42aef46f9dbe2cfd582db4708e22a37de45f7b5fbba25fad2da084132d00e1888740299f644cae68b1224\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/63428d34338ada0748fdd95dc5f6db204de7543a",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46b000000000540a8d7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd30000000018732d9204c7b2b20000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5c000000\", \"prevouts\": [\"9d083200000000002251202ae35af575feea0dc18681bbd0ec0494b44b5926493fa5426b4858bf97ae878d\", \"4972830000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a19e3b1d939cb6a23d473766b748a130ade8f2a056e565bff706cd0491e745bb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a42616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/634458fa7be2820b5e56c8ae2c193b953af0ad40",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfc01000000e1fb988b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4080000000022028f9adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bea01000000a94b1fb4012f9338000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748777000000\", \"prevouts\": [\"30532100000000001600141cc39a492a6f67587324888ae674f2f534a7639e\", \"b5243b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9a341f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_da\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cc61fb581a65202f50b21e47d9e6512cb734d9ba5f06c87419797443abcadc2635a00a7a7e41d9c7c8b5413245d784be457434462df76d27e0824ee448e883e081\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"adf0f76363b1edc4e497a309491f6dc98e6d1ad1ad455fe8c72a0dd71a1630a596543e0f40922612ec9f654784002c61ac9cf7bb45da655c711ca10d28adbcabda\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6360d46053a73eb3d4ae1cc875f022d5d461f571",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b45010000005275e07903f06b1f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac1a010000\", \"prevouts\": [\"975b21000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"47304402200e4c2a11ca32ad615fb9e488fb9cdf0efc97c07b809095d014306faa39c1706a02206c88c9f9bf9508ceb9b70db058cb52c3121c091c3a0324bfd0f8b32cfe6534c183434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100b7c2eeabd221d1d26c576a23e5c724ea87662555f661eca76a32b7d7ed8d3f1702205b778f07aa13315ab18107518b3759dce5d8f60dd1c8ef82162cf56a30278e3c83434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/636131ac174bfe63b118e739bb030a2fae2ae0ed",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c470000000032889c918bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42c01000000160157c404c8ce8b000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac88000000\", \"prevouts\": [\"2b65500000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\", \"d0313d00000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f7bc8d0bdc62b39e0e9c19d19fe3396114a1c841c50c9d6fec174cce198aba7d6cf9133aa763ea773cdeeac140de5c57dceee670de232cdd7f30405a52d22152c579d688b4f95dbfb27db809d6672e68433faf56213dd258fc375d7f1025581eff39b384b66ef78da8b5e0fd063098e306be159c39b9bdddd361b672f78fcd4a613242676014fd3768df8f726d2404332d810bb7f4f63fd447db170e8ff867a34a9cccaa1fc93353cba8eb3475cfbda4e27185757a4e54e43226365dc0f001362302833007e228c040015b1174b8b4237b9305b896720229169522f72b3cc0bd80743828e7844f5937e757b79fec363ab9c816b81974ee2f4619264b2bc91182eda6dc4ae2623b8a1d441c67b140e9a05e99107003011fdd6f6634dd3bcdc7ea430fc98bc2df94555dc7a8ac328bf55ac32217dbc35cdda6eb371067d22417f2a2459f960779e3789eb2e1dc7d2336fc20fb0a5ccf274db57235300fa0f463274794e151a11054804ac0128d76605b3421c36860aa113d488503f68a3c4c3397bf8df2cfa3eab9145f1b94516af2808c8161eede6b1d695e470f3ab43d788ba58a9313fbeb34f758e619c5f570da564e0595a22bc3d8dfb57928bf8c3ac435718da6618e0ffdcd5621dc77c98abf0213aef4eb2e99c4a8e320c818bea2191f40abd0834e1892777424382df9310f9dd1f5cf781b44c2c6669952ff8343924ea9bf6824e455576c7f0075cd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb43f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820aae41afa256ed506dae95e698e8dcc0fa26e2618e50e74a83d05bcf51ab890d620a19fd562e5ef578d66d29c84f34a4223ab3b995d34ad300c7b5f252d5e140\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090237aa9b18b4a7c908c5ae34894588ab96e245b74fec1610a49973392d6eeb6c62c6b55ff2af982a6c76cc379da7e493b10624673a2a6066fb0be803b8621e0250d0ffbba6300bc37b3e88c8df9651a41a3bd39c21e18a47527df7c1f1811b3a853dd5c0da23ab87915a78b77947ddc576e6dd88cd23d852fd9f0be1071eadab098fc7c34bdb3fb71c0c78b3878a11d7879e701374ec5e5e7fa82bcb7eb3184aee94d64a30695e99b9cbe54e4e1f85adf00a77b25b8ee341fddb7f500a1a79b56eaa4c9b1e40db48d11e160aad7e38abbcba2cf3bc8370e2b2f02ff957d174c51f74d6f8890e956a1bff47324cd1d2e8a645ca5b93aba2422eff9aece190871e5f8d8ec150a9026df3deae44b69a8e232e45f4c492062e38b6cb50cb740073d00ad61f02db0723b7c8fe4bd0d684fbe14e52694a717b2e08cc661d6d7bc9a94c218fa998141a6b67f89d9439c6aaac1c09ba4650fce90b887224479f6eb3a7214bdc445b10402263516da19e5539bf6f1092bcf30b97f28afa77531d922822476e186e957fcda37c306549ec22653a1f0f6f9db877fd8ff8baf769a5aafc10771ed5edb13c5b00b09be23c47c4aa55fa4149f79b3ab283470802dec04e1aa292c7534484fe0fa5a193ee5d338ad4aae61c4e68b94a10284c1a5793d533e8b453cc7dc36f2fd157dc760505b14c29f24a53af123b970da92597069e0f2583333aa62a9f2afa3a4b2a42e87561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004520e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e11863a41bc3dc2a7aa524e62e66740ce82713c2a995d68e9803c1affe373c89601029910a453e765cd82c29c3b576a90579a453f3a941b6b6175fa922e9a13196\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6391af63a3bab91b1f963e133bbb54d1ec7814cb",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfaf01000000ef6fe8da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703c00000000151d319e02c354820000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acb4e81421\", \"prevouts\": [\"e0b1750000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bc630f000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_cc\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"06c67c2af3e5d7e192675c72c1500639a3ec0e5b44b307c185cf19ae7fd8dee755a6dd69b80e43b1c944369de37d14f6aee25ee59d3ae30109ac4123e23dd30302\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"25f6e6831fac5efe19a55328d4265e5ab4f29d1e290240341433446d9cd7d119c5e7f17f665a5986a8924a99932b9f953f5915847b7e65e94c5883af0210382bcc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/639afaf27cd09001a498697b15842c3394f9535d",
    "content": "{\"tx\": \"2b7a7ca6028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4700100000089a957d260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707900000000d42a2be001ef6b390000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79653020000\", \"prevouts\": [\"076c330000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"f6b10f00000000002251204c956d2ed9840e95134d355554a887a299d70036ebf1550bbadc52fbd9ddc36f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/invalid_csa_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef3255bdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"532e6937d0b26d3c96951d6910ffa78e5bc2c3d0a11d3635f6fd0066e011d574610b77cb12c0dc44a621e269efcc4407c852f8e03b55638be401f087e800511e\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef3255bdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/63b0cec5acbe499ece5bd821c8af36dd0de95819",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4200000000909948478bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47a00000000b7bad9750152878e000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47877d532648\", \"prevouts\": [\"407b6800000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\", \"67d73c00000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063dc68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e122ac0f20434af06d5694002e66a328e774b08c17356336e0bf0019524f47df1a7470af5f469e43c444817efa23ad8740a4ec3822d36804e7973b39d521bdef59faeb7b84c883e27227adf79edca80c57b026715ff0da0f52c5e2d2aa306e3b89\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb43f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08238e917535475cf2110d0b0ae2ac5bf0f6bfd0fb66e9319f96694509bbaa8cb206d96bf27adab25b1c800ec6de9073e8fa8f2a3b567072b632cff39ce61bb3673\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/63b754b26183ec079fd02af865aea1d5c49d93cb",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49000000000575c18d0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6e000000009b12d9b8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6201000000323bd29c036d5608010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6ca6eb94e\", \"prevouts\": [\"b77b360000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\", \"a9315e00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"7c80750000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"b17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364cd3d9bae846d1e9f19df02762e6d45be556a5a66cadc4939a21519cb29aca313804e0ef706f1ca5c8b2fa38155abc6bb5e2265734815bc03afdad0836bb7f05989f510e73a03c44610e5cde856f75a0d7582565d561698089d126c5e7f66809\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93609b57e90423a4849aac73da1b4bdfdd2798990ba600420d32cf466c1f0d36594d9568d9f877f6ca0cee9df3d4970d26d0e286b65747316dde3c995de6e71d9f55bc912f5bf4aa2c9ddbc9747d59c78f40d0a0aa0a8a4f22dc70e3f9cdb9b6ae3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/63c6cb5ef992299a9604582c39c7f956c65860b3",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702b01000000563eb1acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfe0100000075a2baca015d162200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca7030000\", \"prevouts\": [\"503d1300000000001660142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"112b4d00000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cd6080e32a37eed9423b6209c11b9115af7004c3f774d587368b784e2d008cb826acbfaa43d1b4f66476a1fa51cb847dfc530f1dbca5a3d261af4280ee787fcb\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/63c8bbd564a4a1648edf9f05d80a6b089c40883c",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fb010000009399fa4e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c300000000bad4681203ed4f4b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3cb80434\", \"prevouts\": [\"c70b100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"38fe3d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ac\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0eef8040e6fb98e9abf015034e584ef1376f63fe98fd888c6c7365fe0355f1aa5f1f9a0a35e483773b76f251cc0f7d187c9f080de5f67026a8d4b6eb7ea802b103\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c4a8ca265e1edaf1797ae5c8dec8e3912ab289ecbcc62a92fd850f7404e3d5fe154e317f22a7dd63c77dfb8bb7e734bd39ca8584e6f54dddcff6034765110560ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/63cc94dee9c6256ddfe004eb9fcabb932627fcce",
    "content": "{\"tx\": \"044da27e03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdc000000001a07b0b4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9501000000bff781dddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bee00000000ac3a7bb4026db9df0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a67e030000\", \"prevouts\": [\"ca4f73000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\", \"2fbf4b00000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\", \"e43e22000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3e1f31af440bd9528b56a4b582a327979fd28cb44b9e62075e623987b4c0f8e3992fb5cf2427ede6d61c8a74b8487764d962b41d4db4b67b9e943a724e86dc0ff\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900452c1673aa1d348e5f2f8444d57c2e384a9e542f3652a57ab10bce8213eb35faa5e1f31af440bd9528b56a4b582a327979fd28cb44b9e62075e623987b4c0f8e3992fb5cf2427ede6d61c8a74b8487764d962b41d4db4b67b9e943a724e86dc0ff\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/63e781018cd701d6d445dc7c4ea28f9a53de825f",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4050100000060d5b89860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c5000000004169b1a9047cec4d000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acecddd42f\", \"prevouts\": [\"b7923d0000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\", \"523413000000000022512097f3f32bbea7bd397ebd6824dc6e34758f0b169a6c237662287beed33756fea6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bd4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f8a7004a68fdc05e100340c712f74a3d62667ca0b5d0eafc5e716949571fe18725432b67bf7a212872373c5ea5ac6512ad650fe3d5c26e1d584bcbdba0083b9a9e9ba325ae7de51b47d98058ae5f9889bb6f52223c96865cd06dfd05531cc8a0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52bd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363dcaea11c13b9b36db1e711f26b17d850c4278eabda72c0bd6c73a20768b7a5e98751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d50e634e19498d3396bfa452af2ece499faa564dc4b58fae514f4ede8dd179fb909e9ba325ae7de51b47d98058ae5f9889bb6f52223c96865cd06dfd05531cc8a0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/642e1fbd4f64d1ba035193a0100aefc8d436121a",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9501000000ea4b4ae9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c140000000035454f190291a37500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac963fce3c\", \"prevouts\": [\"e1f320000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\", \"dab856000000000022512063eb770f298cfb14c87c6cff1e0541dd7cbc30bdbab4472c0f37d52bd55ad696\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"bd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936061ae028cfb8cb00b52e1357b0e7a5a4109afe42dd36cfc91bfdcaee18ccf3547353a90cd56d8edfa9d59a5341a6c829ef2ec5b70cfecd5055b0e6c18dd5375841cfbdca9cced9a9297ecbc29dffc929789a1848311039b5a24b338cddf0aa70\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ea156570f3d071b1e4b25e8baffac9afb6306bbc5a1ad7382e42273c38ec7578357b0da8b61d649cedb8c014d8a901c8639aee676049f740bf8079132edd04aed797dd6acf95c24b81e793c9c81b0ab80d381fe8deb935e4a90684c96acd4587\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/642f40f85c3e92c672ec038a2e238351c6c24178",
    "content": "{\"tx\": \"cc2a29fc03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8901000000c830c9abbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff100000000746406a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9601000000bd8ec8fe0286b12d0100000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cc349424\", \"prevouts\": [\"6a2b66000000000017a91408247b8d3db4e641d0be1ff23f14280256870a5187\", \"2f55760000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0074530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_6d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5925493590a1b0ce31553c34efbce5ab7e562ee82229ecc93b7176d52e25172f384b4b102d066dd69f65ec2b85103529c9ebb44f85e134f28475a26d682940c981\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"29706265b3834a43fed40dcc0cd7e5e09c120a09a70af16e08e62e9a0b8f2ee4084015afc0ad3cce7b499204bdb19e59be7de3f63af528d8e5f3de09dbcfe82c6d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/643386ed0f556a2227416f5b32e310b70a2cf743",
    "content": "{\"tx\": \"4c61934d02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b570000000092d58fcd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45100000000baffc09e01cd1c3700000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acfc59935d\", \"prevouts\": [\"cfa9260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1b133900000000002251200120da136b46f6e1c164adef9ba0d2bbe634d7767c7946122aa4909c89df2221\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369892bcceafa0b9465950a6b9b3f74549d7ae8a8c1917a73c91a30481b31306c0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a7a616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/643f751fa11ea6d366ace6319feda720f2e8accd",
    "content": "{\"tx\": \"35adfe970360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d5010000006640029abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf78000000003657cfe8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdf000000008532f2b1014faa6c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4871d222b1e\", \"prevouts\": [\"96730e00000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"d08c660000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\", \"f2fb7b00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93656b2e44901702d460c7de97890111dc615bb44671c92f59d31a1c2531c59c007affae472ebffc4152ddce3f20794b01737e96becc2bb4a1a296a47c8ec0d29af569af0f9e86656db21fe5e74d4bdcdfc2cda5437bccaf9e3d568ba1282fc608d76e3192190387ccfa53649887be3b08a6a0e7169a64b02c3bbfb054cf523373b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1f12e5bdadb74bb113beeaaa5995d4ebaa92337455ee51746db1fb6fe7db125e52d50ee9aa3de1fe988255b0d8b9f34dc2cecc4a96432b9f704e90359a06b468476e3192190387ccfa53649887be3b08a6a0e7169a64b02c3bbfb054cf523373b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/64537ec43a7b2b59f2b936c7247b94e44e1bb551",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45f00000000788b972abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf02020000008b773e1560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702b00000000fdffac0001b6184e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8721010000\", \"prevouts\": [\"39113f0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"8f097000000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\", \"d0ef0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ad4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93641cc9c8285f79db4181623fd29c0ee1439eb4e8d4cf6c70106fa0146ca9f07d3ad1faed220136b938a4936a71b98f5f9e86de449242d6a82efdf7a3adba2ae62745d0948d124101db49c294d83630876065ae400dd84de1c183cd8c786ec24f9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368ab8d96c33f2aebdb2c8ac1cafafbc25c65e9bfa155bf2db52d1cee9a44b59f1419220fa8a7a918b3857a082d32be9fa2ecc61d36b58eead0239ee9c5d9d4afcd5a470b8497850c3a230fee464eb343180400453804118582df887251250b2f1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/648fef1a9a568a6e98c2cb836193a18ec11b60ce",
    "content": "{\"tx\": \"0b6fe83703bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffe000000007cacfbdb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c468000000009c09df848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f700000000774f468401c92a7500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acbd79e031\", \"prevouts\": [\"dcc37900000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"129d37000000000017a91439ec132e1466f40f0086baa7ac253013e83c7dc387\", \"bc53380000000000225120f3eef30b2db388e6b8a313ffb142e2e6ffc970ce6b6a81ae6dc1d81725c678ea\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"215e1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"e9df93b6b02ca0341b0345a2523cec9961d8ca0d900cfd5450582da4b60610363d1cc329fbc34c7929fa8007b99f10aade2fbebaa3985bca24226f56725bba88\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/64b6416da57fa74cb892f8728aac8bc6064ac5dc",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1101000000a081b3de60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127053000000000c7b5fdbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc5000000006f40e899046516ab000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c6030000\", \"prevouts\": [\"bf8d4a000000000022512074a4c3567b4c4ece2d1ea256a6bf2f85bf4dc051497bd8ce7ed8816e2d4c108a\", \"befc0f0000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\", \"19b35200000000001653142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dd5c8e7f006a3ea431b7b4119ba3be3e8bd1aa47a62245ee7cd009a4a7fa39b4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aaf616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/64c1ab90001da13422d892838a22208f71109eb2",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4680100000014cd4d66dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5b01000000d231e7ff03efb58d0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc27030000\", \"prevouts\": [\"9db93700000000001654142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"7b045800000000002358212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e306379641defa88af163715a7c95126d1913945bd4b8d1a728c7e37d4b3879888f06f2be13e87d68eeae13ce45da9a2c8cf25215a8c593795cbbd4bd7a3aedd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/64c86a5fba96a19af3d7f98cb11533d79ff4433f",
    "content": "{\"tx\": \"c3d0c9e202bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf390000000058e04188bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfba00000000df72ae8d014799bf00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acf6020000\", \"prevouts\": [\"18f26900000000002251200f726ea607d510d2ad25fd6aa0b3aa5046595182e7375298ea583ba69075a433\", \"51817b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369c9b89f6cd1c0bc520f57d1b93bb5b773cda74c14172240a9ebd81fab92ee691\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ab5616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/64c9c1019b362e31675420967685e3e5e1d92f06",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccf010000000c1a2eeadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce100000000a5df58b402ee86b5000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac3e5be55b\", \"prevouts\": [\"6a2c5a00000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"604f5e0000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"087d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fd691c2a9908d9e7287fb91837cd9c32b2a21ac331bb306f4648aa27bb40422e45371e41a07562523a12648be26bdba66be78ce7e249298c356e66cf29847872e0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367afe96f638fbf89584e25dade4bd67dd7e08c3a6572904b143b56a75af676e5d55b45b3af2af0c7a238665fed9a70950b75abf30a3f75b50a7b1cc61308c32d3371e41a07562523a12648be26bdba66be78ce7e249298c356e66cf29847872e0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/64e713b456a3f23cd86eeb23d796639b7c85d2b6",
    "content": "{\"tx\": \"dd0484290260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127004020000003a1f3dc18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b2010000009ee9318602534e47000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c9000000\", \"prevouts\": [\"e68d100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f4e6380000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_9b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"01b5c8ffe0fbe48bc5aca298e8db8dcc9ae87ba7f6984815658060ceb708fdc1c00550e225848d5053e613c4d9b2f0dd8328ce4568f7eef204ccaea60de2a66101\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"84337753e8761f22cf9b0f9af87f32d092bb5d8092d70fc83d5f9e833d4512fcd2264207937b6394e059327eb67f923d45b0cb194c3daf68579d656615b3aff89b\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/650b0fcd68979a929ceb682e9024fb7beb57c2b1",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb6010000005bd07d78dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4800000000f3fbe79504c03f770000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cf000000\", \"prevouts\": [\"6300560000000000225120df3728be21c89bb919091ec65a63fe2d83dc46feb767b141518f7734e1cf94cb\", \"b400240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bc3a384262d56f91b8a88cf4efc3914e768fb5c0b907358dff504e87b4ee0842\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a74616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/652f7178db85a30195aec38e5bed56f8d492b18c",
    "content": "{\"tx\": \"c9c8ae8802dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1d00000000fad144c4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9c0100000062d84ea8013cd619000000000017a914719f78084af863e000acd618ba76df979722368987428c8e4e\", \"prevouts\": [\"70f55500000000002251202411d699451e61c2ae1e9b07727f82864d3d401db7c2ec25b77e3a65ecc346bb\", \"fe6e240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_4\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"1e61d4d855ac6c46c9a99357789b79a67c50ad0de37287346a5acebf771114a1c8cb61f569b8b43a09ba674e89746baf16e1641bf951ef5ec1e7f7bd5e8d9197\", \"727f14770010c2293269cf848fb9991b29f239d9c1f3ead46ea41aaabcb616b7be4fda6cf5e3a5dcb5f3218b23531158cc6113c61d383eaef8f87882ab91f065ddfdf3ec975aabeceab120e48ff5f8dd9b577221b0a1049448f1b8b1693b5640f5f859c963247f679f6d34f6d497a9807104871df6022d7a336f8272d601bce26894ae75be976b93c3b2812ec7071b7e4a3ce8928171501e40074666f47ef0e68d3f672d4086f5b8eb013076c595e6428e55dbf3ba5642f920abf9247c5932b69396a7b69eeefd26749fc8eb4235\", \"750029dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b3250ac916929dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b32506eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0daeff790ac0750a5c97c555dd00ad0e25822157617ee0633a1c9b091c67347000000000000000000000000000000000000000000000000000000000000000054273997c6b5f26f691e4d5428bee747f4fb577690066e33fbb86cc3a2ec9b53342550c32fe8e6b835909b157b681845926ff168cbfd9ff5cfb54bd6c774fd9157c5d03f132c6d240068d51b30f30e3d7b2786a2118a8eec0900f5b646cc34a216bbd72ae4633ad4d3f914989b57cd89ca1399cd505a1fed4f763b0e00d4674c2353162f5cadf9b6f3c32b777520a5d562a965fe0a5f3e985bdf7f770a65a1983f523a753630238635a85401e644b6ffd443cc41b1b226185056bff8402c91513dcc58ee4dd7ea460fa36871f87f40a7dce08d15f9f39cadf4ce5d6057706e74a452cd80efddb984cb2088de76d83d12c012975f6f8909fb41fa3853970f3c67\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1e61d4d855ac6c46c9a99357789b79a67c50ad0de37287346a5acebf771114a1c8cb61f569b8b43a09ba674e89746baf16e1641bf951ef5ec1e7f7bd5e8d9197\", \"d0d93a35ab56efdcbb0a0e948031ef7643e0e563ea007031880d0109b960bd716dbe481be7067ae39e002abb4c1dd69ed25b0c0cfba0de2cab8de19782402fbeea47f63dc13713f9041abdb84c2c9952a35c9a548255dac8e524701ed1d10e5f045f9569142255c08b330f35bc671d289d3b8ec4628587812c2c5a6c36e67fd682e8dac3f882c7214d3c52ac6d6c621401bcdc6df27628735ab4407dbf32371b54fc8d5462a3c3f9caf35df9bc2366a5d89844d292e8352eed73b060af31b8b85e7bf937e73ad4aaaa00098bf8\", \"750029dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b3250ac916929dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b32506eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0daeff790ac0750a5c97c555dd00ad0e25822157617ee0633a1c9b091c67347000000000000000000000000000000000000000000000000000000000000000054273997c6b5f26f691e4d5428bee747f4fb577690066e33fbb86cc3a2ec9b53342550c32fe8e6b835909b157b681845926ff168cbfd9ff5cfb54bd6c774fd9157c5d03f132c6d240068d51b30f30e3d7b2786a2118a8eec0900f5b646cc34a216bbd72ae4633ad4d3f914989b57cd89ca1399cd505a1fed4f763b0e00d4674c2353162f5cadf9b6f3c32b777520a5d562a965fe0a5f3e985bdf7f770a65a1983f523a753630238635a85401e644b6ffd443cc41b1b226185056bff8402c91513dcc58ee4dd7ea460fa36871f87f40a7dce08d15f9f39cadf4ce5d6057706e74a452cd80efddb984cb2088de76d83d12c012975f6f8909fb41fa3853970f3c67\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6536f2a8bf497dc4fb07e6344571b041ddf3e9ce",
    "content": "{\"tx\": \"927a8af202dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0902000000a680769e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c499000000003a7254960188a41e000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47871c050000\", \"prevouts\": [\"48375e00000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\", \"babb340000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_b8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7bc450271610fc51bd47f0c60788ac3ccc38fe9e467ede448d0778b38acdc3731284425f5489c5ab7f7c67fcf29bb992a5e0c77cf4d03024a99a46d1837efea882\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"06299b3516f1110561ca47a7acf31b7d84b22b71657bd54a6373e08be5501effbc6d03ff8b4fca485c2326200e3c9628893e52cd992c11296cfcb6cc6df446c9b8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6552bfcd6579a934948b7068b4c551a0117ad0f9",
    "content": "{\"tx\": \"57a8be88028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4360000000053d6dc89dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c050100000069ebfe9f022b60820000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65c37ec52\", \"prevouts\": [\"657a3100000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\", \"1017530000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"167d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e83f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828719dd3b5606bc946287d150a5ecd03b0f8e892d08bbecd28ea2e3769111c28051e3355b9fad1d20bddcd1a8531bcd58c93c4d9ee4159d68db4e08ecdffbe17e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93632f8e635991ab12ca03b6bac9af37eb87a63c2667988d569707a1da1ce4c2228654bbf7a6388e898988522fa7e5d2ba9e6951646cde29fc617f56e0c3d8e4d50afd13a3b2c4c421c5355668ae9e4eec8bcb7618363c6e35efd204a43726d22d6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/657e868eb96e89c02af5430fd6fd6b371011ad19",
    "content": "{\"tx\": \"3e1bd7390160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701a0100000098cd36e703a3950e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374872414a15c\", \"prevouts\": [\"ae6c1000000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"ed7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082a45769ff8e70e4bb7b91d42acbbb62837b0e871ab760bcabf7dfb792b2e999f3b131de5807af4725e3fdc8c81388bc895736ddb6e799e7163e8586c833ffc627\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e81749aa0b5d70f518b926cb476468410836d749f7ea53df886cb06228889683d97e5e7dcc199a2f568fd88e83eadcc582fbeb8fc2cdeb8c853fb2288d51fac1b4d19f2c0f6744ba7ac1f5ff1e4bbd0a31d1cdb1f5d58d1dbc476492d0098121b5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/65883b58c6b3dd90d25b39f5ccc47be52f17c9fc",
    "content": "{\"tx\": \"065bd6d102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4500000000c1b6cdc160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270180100000068d0aff1028cb48f00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a69a350326\", \"prevouts\": [\"373e83000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"e4e50e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"a17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364a06e2178fe69175d6529a39be816f8352bf9d327635b0fd8c53cf86695522e146c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa09531ab440e1705f1c4b791477abf2a4fd5d47d92b3cb9e3998348c9d3a452b095176026b3e005afce4c10b5e59a002659822bde369bd64201565ae4c88fc95c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936054a1904d9cec18d14f2a24d862d1037aa0e706c94223624db69aadf9635fbba09531ab440e1705f1c4b791477abf2a4fd5d47d92b3cb9e3998348c9d3a452b095176026b3e005afce4c10b5e59a002659822bde369bd64201565ae4c88fc95c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/658ae5cbb0d9d2acbdf007a1d56b7a8d343343c5",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b14000000005d6cd1b660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bd01000000cedba4cd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700102000000d9229fe1044be13e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c7040000\", \"prevouts\": [\"a80a1f00000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"1e3d120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"67ba0f0000000000225120fa0c69fd3dab50066606d386e9137466ea422a077bab3cf3dc61d0cdd59f488d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ba\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"32c2327693d0bd2a234db09703de879adc7f3dd8758108608a267983bfcddcee57a1c18ce22d84579cfe5276f155338373869c36d45321d80bf2428090bd137881\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3a549ce4fc3d62f541fffe6227d9843d2c6148b2aec9bd8421b176fcd9fa9fa334fdd185140d94f81b290fac077123231421d36f5e0c73203d93796a27124a0cba\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/659a2dd2fa1b9d801f3241e5ff84637ce06ccb77",
    "content": "{\"tx\": \"6f94846601dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c03020000003ac5f78104706949000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787b9010000\", \"prevouts\": [\"87e64b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_12\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2d178e3d04e54c535c149078274098588da6c2d35df619db034506a0c82a0ac76f2ae668d37f220414d806b09f8af4099b0da5c2d0e0fe8bab1bddf0a29559ec83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8824c40d99be7032cf44d21d6120c667cdf875c012883e52a4fd04d392cfd2c9adbd68145c69f7a15ee008e99818e85b47c625cedba870b88cf90984d03dcf4f12\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/65a933e1d1978ba3bd2f831c22458a755de9ba53",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9c01000000ddd5aec9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6b01000000ae192cbfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdc00000000b552f5a70148b11f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a69aa3133b\", \"prevouts\": [\"dd388500000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"3ddc6b00000000001600141cc39a492a6f67587324888ae674f2f534a7639e\", \"1416560000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3044022053656d62d779c74dff27537a5ce3d86d8b9e5d99ad68f61a04af5f116d902513022041173bc14e430cd2c93eefabba2723e971ec86ec6fc6275eee70a7edecc53adc82\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3044022063ece51f9799d0b8f55cd8c7ce93603b6dee8d9d95b6fb525c22ecf63c579b7d02202ab803e9c6d77ee947bf17be7d388afe4d5c188274a12fe66c6b3d6dc9802a8c82\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/65b54fb91b4a1cb8c833485f4d132f6e676256e0",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c48010000008639869704fe1f4e00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df979722368987ae010000\", \"prevouts\": [\"dcde4f00000000002356212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"059ae24d6eb313597f458e4b902a3ab80888f6266fc76748d0059bfd693f46ff2281f631dbf4acbfeb5a2bce2a20dd8b768eac99932f285edb9e8017bd95a764\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/65b5fce87c9d43529bc25317899f3d88952342f0",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbc00000000f53d232fdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5801000000a868a14b010a422000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ace1030000\", \"prevouts\": [\"f757210000000000225120d65a03f65f30f95ff11470521917ac5fe759126fe5e56fe4b3d214d8fd101829\", \"af9c4c0000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e870bdf58d84db84346f382aca3e68185eb5f8924061d5e755b2af78706b040\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a3e616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/65e72ac1ffd20fc948eb9fd0715334a200044fb6",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffb01000000542e9722dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6100000000f28b12b601df1e4500000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac50000000\", \"prevouts\": [\"54a96e000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\", \"b69c1f000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e84c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93616f8948a019ae5ead2cd9d851c765ad0220b162570156f4a7dc6af8fd2e75e36f4bc19c05a4ad9ae05992168d490013403fc5515955a55899592aa66a61db799770b862ef93acb6091cb4ff8ef135b3065b278142aa4adab757f952a626e2b26c80764b3c3e93e4958bf58fae47a07e6a3ac966c9bf86a1c799b8570c4674755\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93641b80b929874d7d784cf6595e13e696e00b78ea74d97600c5f575c1369dc95b1b4e321dfd5536232eaef67cd7779b0e400c7a17a369dbe44f6d3cf0436c0a34cc80764b3c3e93e4958bf58fae47a07e6a3ac966c9bf86a1c799b8570c4674755\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/65f7ef2d10a182c5af3e4c60b4f23f13770b1d2f",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2401000000b40d39bf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c00100000020db294d014c696800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2e5e9e56\", \"prevouts\": [\"faea5c0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"118d330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_eb\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ffbdd2fbbfb826428699c1389760712bdb2ce33b75bdfad3abb0430d455144c5afb96118b91da89339b33e9671cbee8751bf95de1898f1e79c62c00ed6213649\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5cd37f6b0fabab584df62e1cbfb23b3e3116d5c4db95b23f0c4b36975a60bbddc6304c23de2bee8c9d165a252ad170de31abf28a0498dc599cfd4f40ccc9574eea\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/660b8322660c10bb3072efbf02a01b028869f3ed",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8401000000120a51ffbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf340000000013508af90254e3d2000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4872f19bb23\", \"prevouts\": [\"9bc45e0000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\", \"17e67500000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090267f2f3c4d147d8d888ba9ad3055e1d0c4f91e37099949561274b79da16702993590f16ef275f5e18cf3c1f57ea9060a4302786577560e2280a1b9e9b7639ae59932737f8ebac42f59418766737dad1fcb68c8dd2794ee6e8fdc714c7365eca1be14d46b266f1d3b73cf31db4aa62e1bbad5c115c2dbd5a4a2c3068fe12cf7e94eb58eaff6afeed696ee2d19f14551e522ca781ce52a4db78609b41ec72d3eabc48207564eaf91acb8993893a71c19a112b57ed5e7f43c115b76e68bca823a3320598e6b3f1206b6f8a6eadc326e36414a118fcfd1daea1ba87346ddad309ce8faa2c158016cd3b93a4df536f5946eb7723f4b14560e43c33e750d883ef355ff6a48463483556be10825b2ed4209dcf01f8830ab7a34a7ddf4026d6b860be90930c10b337bc7f1a33f0d1971f03d905efdf923bb1504adbb4f86dbf7ce2e73f1e25c9673c6c598487971db5606b005bf04f99bfab8e96aff708819b58134f9e0f4683a242a249ef3418fee09c6d9e307dfd8d0cab5eed172a1ebf20054b569776ca7e17d050fad3770b66e6516595d54020a329da47e2049caf8acc5ea5bb3c5ecc91ff2d602619dff8c32d1660339af09034881469e0f5c717783260e4751123e2bec729ec58d01ee1bd3509cbcd8df821d6445fc58a2588c240f4aac1fe03c8aabc146a40d0a07ac23b0c0536a0f6dc78d036d0dd444062d9414b336abbb1dc8a61820c220d7870cd75\", \"747d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ecff906089186a2156752da0c3c16267cbd92a27eecc3bf322cbdfb883eaa82d667ed562df09fa99b9816795ca593030d6e2a26df3d36427b327259a2f453cdc8077aea6ccf316b47e40a0e3636c5ad4f7738b9bfce630d4a478a0dbfcb51ed93\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d06a09f660812fd857dca0ba2b82c3be379a62eebcac0eeefaf72e27d97e91762c658d0f3e24bb39059b1dccf075b5133500b9132e3b50b7425cbc7b2bde60b709085af1f73ae5b99aee56fc6d9f756a297a9280dabe2c97537c6f68788c19bd27a6923e8b053ab59543ffc0caedeba20dd12c1df47d8752f08a07d6ec16f50376e1c8da666b94340bf503c4b82a0be5015b5f6dd04b7a8f5bd26a7a2eb8840b0df9672259b94ccfda595bb43c29b1c5cec2f4d6b2543333f94c3a8510aa324cd5cf0816837892bc3fb2352a629f50ed742854471992ae6b0e0ebdce19c27a410b7010e86b121755aef935392bb0657526cd59aa1f1d3ae4bfa84a3b3bd24452e76789df9f093356ca9af72c0c69e6e8ce056c683c0009dfee42d4a73f321f2388f079567cbab984af32035d0e0153fec26985f4a9660b029bb18f2d9c7ffca185e620ae5ded8494b448b160f1fa9ea240d3d722435d21ea2ec257b3ddffb687f8f1a63c0d4ad3a6f7cc17c95a2379a558954826170ce373505ddf5d4e5d25ea142726f58725fbe4aab33244b2be46022a6dee3b68dc584a2a23e6e22ad39390430248f78e410b87c17bdec5b73ec3492c56b7d39f844eb2977248fb851db2a6979729e9491baf884ae255336c6f7d14d15f94191361f0d3e7f463ed7054d234ffe54d42ade6bcc126fda1c0ca2268d0193204b6f999b59d3011e286dcdeff132e6b651ac8feb0094775\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faff7c473e619e0ca75adf5145a8683277729cbfddbd5802fec00494435aa4942fbfbb1ef2412aee06f4b75b9e20a72d4d9707545a4ae77abc538f76b00105406a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/660ef1c053328676703178f6c1f1a9eab0eba34d",
    "content": "{\"tx\": \"9808329802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd90000000006966cb4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0b020000009599b4af03d11683000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d2000000\", \"prevouts\": [\"6e94630000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d835220000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_f9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"07f68954ad90da8e4def4cb40a6b37438126f12b7920455f8c466dde4e42995e4ed138381b2e9f4945630e2e06ed6c4354414dd0b08ad22444f5aa9fdcde4d3f82\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a2ed8b675086ecaaa80c92425e96cf0c8ed0bd9316a765efbd2cd0f570fee91a4ef4a72bf52b69ceaf007c37fe76cd18469cdeb36a7ac794caafbdfeaa8af25df9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/66252c3d296124f1a894a2bef80eb0b8d2780c58",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cba0000000025e7d69ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5201000000d3af49b860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701202000000fc825ac201084a89000000000017a914719f78084af863e000acd618ba76df979722368987398c0a2f\", \"prevouts\": [\"33da480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"65a5590000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\", \"064711000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_21\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c82f5e30d2af58a7297953a3aa68b33786c55fb79c1bba7ad94e14ab611fd39f6d1c6115218a650564925281dd8eca02da21a154036ec8c2bfc0cd64ba08e3d481\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4e48c844d794446185f579607e123395a9c1768c80e7bc95102bc79ccc2a613253b329923a586fd91885cbcdf59bc298cc150bc4223d20e6ac1105870a26d2f721\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6652466b4852d5b5fdaaa69e10880f1a3b76c3fa",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9c01000000ddd5aec9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6b01000000ae192cbfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdc00000000b552f5a70148b11f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a69aa3133b\", \"prevouts\": [\"dd388500000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"3ddc6b00000000001600141cc39a492a6f67587324888ae674f2f534a7639e\", \"1416560000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"777d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364f5cab98ec3e6c74091025ab5a3440b5db25728dfeaaa4910bbb1ab354164160ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457e2aee6c91b47bf7b7aff3c5d3800b2287c2f5852e09bca12781ffc191c1d4f04\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082fa584ded413e2880e88fe5cf9cb62118b35d382d99cebe394016833778f1470de2aee6c91b47bf7b7aff3c5d3800b2287c2f5852e09bca12781ffc191c1d4f04\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/665eb41953197df4c60f261f2844052bbd0c48b6",
    "content": "{\"tx\": \"81800ee502dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bad010000009e677df3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3d010000005da75ce303080a4500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e785000000\", \"prevouts\": [\"6a952400000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\", \"9b09230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93690527042795390690a9a4478775b8c816aa4ae99e8fa73671741082894bf9ec6c99cdefdc3473a619e12778c4cd588646c716d59e86e999fbd28728a66c3e7c6a7d0a3f3648f0d829df7cabdb8f0af96ecc09ebc190c461c6b5fbdc9f87abaf73acfa007b318c5da81cf6562f4932e2754570ba3b679b809769f541be0a6b617\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004596d09828da376c7d22ded5a4cf88780a729051831fc4ab0b26d0bae49a473f5539caad535bb8d51429d9c94edd44271a241bcdcdcd941caf815b31d1e73ac1400dccf8e3471e4a61057d1540548a04f67f25f6a36812a8ea9d07747f2e4b3a8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/66726b80715835e1ff8fad96f3c76a0309586a88",
    "content": "{\"tx\": \"613ba07402bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2b000000006ac1a3f4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9601000000db51c5bc04110dc900000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787e2e1e433\", \"prevouts\": [\"42e6670000000000225120531ded2803baf703e9b8f23e3d6d5459ce6d94a03d15c5d2addf83c32bf56dd4\", \"0c7163000000000017a91480e36171416c0f598c1c20ba17ab3a3cf10a438e87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2359212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"ad842b989b79bcb22880964d30e6f0693d7eacdbf868dc0520a5dedae5a1bfdc82290d27ecbe1ebb09109ae46ebd8b43f43bf9d8c9ebad19893df048576b5869\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6699c94d11593280e700614b550ad835b0025476",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706d010000001db75c8f8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e70100000040edebc3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf710000000010bd48dc0265f7b6000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc3fbaa343\", \"prevouts\": [\"9930120000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\", \"dded350000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"1558710000000000225120ba259941c99089f87a1bc06d64ef249f01ab7891d30169746f94b5a6d9357ae2\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_2\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"08bd160d956025ebe6f5241df6244d6e62dfe0fb88fabd8fa085f027cdb6e08983df2e90448c7730c3529d90b42004d80406a3b544a53f76563f17fd038125b701\", \"36a9a96f7166ddfbaa2dc5cc2c013de209470d0eba56ac9126090164a840d376e07351c961e97010316ec6e1548e8f5987cd6c7d628a1410e986ba2e7696973fd2fcf9065c502e4c997685aaa21bbd36bb2f0933550d2feaa95b2582702fe319d4b561ca31aa80f51e2586f843837d23629afd8abf0fa7dd6d46139c6716b1ee27ef18ef8444ab2f530afacbde61c335546991df2142dd407ba5d3228eadffc353e662951df94dbc8d36c8723efa603494241f5633173eec52b5b43be566\", \"4cdc08b90e8b86d07d7f45c20793efd1389f3568cadb6ab29e4af1d96d774d0a1ee8a681bac9322fdb94fe27887b44b1ebd7d6f11e080431dd709e5bf4c544a59fa92f389f3a96768cfcb1cfe5ceb96c5af9e4665b20aab4457cec76157b472d0d4e8942a1f85da73f9a133b83fda7a5e702ce3e1f11ae0365b7f9bae6af0b0140de6a1569666a392a1cb405d38c52544e393518b5339eddd388bbc4fff323bb1f750292aec93898be4a9bcc624dfe04fe036d2e965fd9e9ceacf4ecc3a1a3949a6ee75e274d467cb4828827d336664d3efb2fd8941873ed27b0d40f0adf6d20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2051646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d30785dadbc4ecd3025a77df10d8adbabc260c7057e27b10584057b3d7f4fc016a21374ff720e76b2196617c9800913718671966153738a51ea73a6432f4ab3bf0dff5a84056750eac9adbb488cfc819afd45d7b707bec8a1e4196bb51be6e7bd60ae29b735f5eff4bd25fb4d4fb61a513a82460c0ef0ce3d2ffc7cbd94b706fdf3b1c9c2cf996feb8c879007ed7f4c68554a2e57cf8c8c5c0bc9ff388144b9a0fe770db21d58cf9191bc21575dfd0a2264c0cda110f7fa0d71b1290f1293823fbc4dcbde5dd13a9e9e1ffc890a0e959188c645bcd70a1a7b91384daa8cd0156ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94da41cbe840438f89a6a0ac625a9416d834b3f33b3770c38031be21b28da83f000000000000000000000000000000000000000000000000000000000000000025c6934f9eba9abbc53e94d34bbadf28debc99a4d2ac249ed5cea3d36fd546bcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b8962a9c54525fb58487c69f3712663acda1a843da215ac10cf024cc5bd45ecac30bf82fa8df3fd0384c459caa1ee82314748e96cda38a9a95edf31e5fa007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff56c166a818eb0f0885e8d6a1af6a547dddc2c2cc277a8dd0e175cda0f0b475cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4afe4d2fa8292491b04ac94f3579e07ea2820a2efe8c5d7cdc321fc6fd962531000000000000000000000000000000000000000000000000000000000000000095effff3d1a70c342441b75631ef902ddf2ddc837994e5043de51789538c4dbb000000000000000000000000000000000000000000000000000000000000000011f2eda03ba6d94486ade61d4f3c93b8e423cfe6ce1a1b01125141c24b6438c889c3acf9263a560421ca2bce10f7d163a8804bb321cb7da79c6321a29d03c0dde8f8a7d1619889b6e3a150d7bc0e637be3080ce9d6ccc38d41a83743dd1e2c51e99aad7db8972198620f4ea74a4494dcd65849b55fd8e1ece8f54fbf0af6816b24cc9cb0793d870b344ae56ddd355b2e771f235e3ffc12354bb39485ad36a7aa7375a32a5e045112cdceecb459c4995999b6db133269a7d7358d416abf805fcfe41bd9bcc97369e423325c88712161f18c3503205998885f063c0525eb5f2d8b4acc167957e4020e85ba25c911f06a2a8dc6065efc34ecb914e933ca3c949405ad791c3a9b80e8890ceec5a58c830f53df34478d164ac44a0e0c38ded2479bdeab5ce9e141632689e266f38e2c2cd8c2cd0b87b08512f9d8712ad93c7abe36d741bed2d0e51e90ac9d31effa23e36c43a2783e747d266c1c0c9bfb7c41188affb8a6bead3e55fe5b88ce81a3b922ca61c1f3f5ce9967c59afa752cd066039867b23027b82614047fc513d36169cb1d4cd347548cc3fb6e78e3f5970f5bb9309fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5fb087677d8eaaf50535cda0874680349d20471d186a6fb56b78cf68a2a396e137d25fa124369759976882ce3899c05a26dbeac25aeec1cf4620ae772020e459e6412c40bf85598a7b2a1d269735d196a38c98f2625b15518b3c4a9f2847817000000000000000000000000000000000000000000000000000000000000000050b8df1d68417e1955818ca12a80830f22a56ebb200b8a376c5b18036e5db64c32fcad9214e2a916766c9050c03ce1b67348c9073fd3867310ec223da95f7bd0b13f87ce275098f394f067f4ee6c5df7673ad84d84aeb0703124d5f489130e8d00000000000000000000000000000000000000000000000000000000000000004ac50d3072abf1778fec113c724452f518053c9f7fe8facce0abad2bf44141b30000000000000000000000000000000000000000000000000000000000000000d7fa016be04d7edeb2ad3d3ef4ce0bba0c2e776eacc0346960e841a0abcab630a5402b4c585240b9106c2d62657fcacd4f19c06b671b744e1ecbceb7e2c8ddb859497008e46106b80a8805ba5558973a878d97ca009957406bfcf4f3cc897d0103583647efc6a941c9cfe5d6b5b5f481578dcbf633127cfad95c9abba62bf282ebfceb33a113b5e22da86f299457aaeed9447bb0ec57ea2815b0eb353e5cd591ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ee0ee28d901acb47d6b2e3fdb5f6a537a4da791c67d65d18f52aacc08b00aae90470036e7c921d30f1e843ef44d9bc86f36517d22d60a331a4d1a8dea235e7f80d73c2905d263cb6cb17a77ae3a30e0837f63411f14c374b716b9c6bf0fe03849a4b9a71603529d25c66ce8682f296c1b91f9585d9bce4508eea7314182397340edbee6c00206f0e0de3ec6a1871aa8a719b84c9b6b8fb7463d3f99614f6d97374f2fd3ce6b410e81bfc9bc528da4cf5d9c55900e3bf6e86cd931768d3ead34ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff107205b80d68d90d7ab6bed69c85d506bfecc9129a6124719dd9259f9ca83d66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff06718ff2b40ea9bb812d68372c657c4e7532ae9c339a045185f0387917cd48e13c5f4e9b318d0dd7d845bc8f57f6ae6f139c62bb692d8d719f358051e9248c01001f5ee4496e79d86e079c265acb5ad792cc2857f1209a998deb6bddd87ba3ef7f205ab1275eea909497773093891de01bbb4d8156133d83477d8fbca56ffa4deb34ce31eec3520b49735b8746a994b213b566af74c9c1fb7cbe5e620541610c95f5280707a1a0172908b6974840e0cf359cc126b37af177b8d7782a458af7783902143ad5dfd26a5bef60ce57360225212e86129c6f9f3a3270a836cebe5b0acc889cc1f77bd63c6735ba075f01207f32d19838517a7312739b05df7c8caf67793cb06c4e94ff4dbbfdc933770a06c250d228b385e7491459d5deb7a0ce0c8affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000b96736d52acf68a3e5b7be814a229a3d9df7a7bf5248c1aeb12f78d0dec9d14da332e79ddab48e27584a8464eabda9f058099687b586c6a2fcb0c611940a702dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1fa44b17f3934485576cdcf58b8713527933168956c1c465eef29f1db88876d8487851be3035d8237006c63ae05685c20fbc14d0745cbfae1a17fa62d55714d92ae85994b3415c619b66c395869716600b3545e6f04a7d75c0ffddac9291bb1f754f557bbafb4940f6e54788495f56a1f54fa5f6aa9a82bd99d0be0f856b563b4ea4e734d1179aab74d5930f8fbb61515ee6b1b58a0ba829a2b1def4c1cff7898ed24b336b550b17055789d17a25b172537ae1455db70617c2b118ec651e0d1a017bae30ef06ee67f32da8a0cdb7e43b61dc49d24ad5a26720c83f5b363097fdf2f57a20a91be0e80418c95c7347cf587d43d81dc268fa8ed5f86fd32091bcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5edabba63702f38eb276ca33af94b77993e1ba5f23eb3b7694279fad7dc0782faa00d8b92a9c7fe9a9dfcbafae4bb989941bce9b61bd618596de0668d488471cae72d0dc4fe68196d465d0209fe1b67054777bad876c563d524a2bad27847a6004db723030b3407c400759e494e54f84e95a798e6d7b6ef38d5d53f65115ecda6cba38c52ee68c6619d54bd6e944beba82747035dd0fbd77085e129c105f445e05a107367ba362ce285c83631f39881f8d0c4fa0e3f3cb2fed5f21932ea194cdc9ab2dffaa2cf5919398e71a1cf9a2863a86dcb10829e1cf959cfe4d00b6c34600000000000000000000000000000000000000000000000000000000000000003454f1097ec5491edd4f147033b634620ec5d0d80964113395bdee2320ba329ef00c4e734e3c6ce347d9561ed201ec77f8881bcb06775e12f9dd43dd028fae656cfa5ae40388ded790c34f9368e5a070bb1fb2c3a4db90309993e45db8c5afa1d4aad98abda7c8e28f3e634df6d4a3a0d87713d78cf95fb199e58383d7cc60f9016e7a0d93a40f984cae5e11618af8803d7397cefbc3d64e40c5831522f8ac297198bf4e3afbffac10a2104847b097edcf877f803375df6a74523fd598e491d458ae479d92e2ed7f073bcb9ced61b5d71df610122e42c8375479371a21f49c663d7599ea2c5554d0896ceef80302d058c9279be888e7b4f71796476ab7b22c77a28286392c4d0fff1b24a5df3c903ba128fd8345faf1c2843988b37222591093e67e4f1366a3bfc0e7a4e1a9d9bbc6821d1cc76282b6a8ac08652aa135d0e17c1a28329f1220195481046aa1c77488fba52c8bf7720bd50830db7130d77960cf8cab1103cf8a463558547838feec8e9963c40e20e79d41437ded67259e5aa2abf766655483fde84d7acabc45f067a2b7ef18fba26ceb1eb8e78aef99213de2d062c520ac10410a600409c7028e927e0f67c9341e32301a22408c0b63056a4c88733ff60f98087d4514f686719a7c163102f2df86cf29f8c93f39b7124a897908221d140f7bddda1cb54158603abac448e206755a5c88e48aa329b2a2a110301cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4c025675267608b16d73539d8e554eb4f1ddb834be786b27a2ce63fd997ef13a819061645333216a624cf08665a379470996c01670da635c11d17a0807db27e7\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"08bd160d956025ebe6f5241df6244d6e62dfe0fb88fabd8fa085f027cdb6e08983df2e90448c7730c3529d90b42004d80406a3b544a53f76563f17fd038125b701\", \"e2747c919a2159c67a575c24898ffa12c5493a737a14638ba8def1f3cd2d50732162b65ace13cd85007f6754d4373e287c35788e32f967a720b03bbd721f322e387495a3b2bcd0cf78934bf3c4c7c9665f7b3804734d4e95e90804539818ded992278dc24888eb7a825ae0044056f4b4ed2fb9a6a12ee22230fe3c3e3918022afa13d1a12002a337398f67a5af982b8fbbdcfcfbd7a5cefd09e652987f97edec4cbf8f91e13a91e5d5139ff8fa6c13f4d2d789d11dd2ff8332d6d647af\", \"4cdc08b90e8b86d07d7f45c20793efd1389f3568cadb6ab29e4af1d96d774d0a1ee8a681bac9322fdb94fe27887b44b1ebd7d6f11e080431dd709e5bf4c544a59fa92f389f3a96768cfcb1cfe5ceb96c5af9e4665b20aab4457cec76157b472d0d4e8942a1f85da73f9a133b83fda7a5e702ce3e1f11ae0365b7f9bae6af0b0140de6a1569666a392a1cb405d38c52544e393518b5339eddd388bbc4fff323bb1f750292aec93898be4a9bcc624dfe04fe036d2e965fd9e9ceacf4ecc3a1a3949a6ee75e274d467cb4828827d336664d3efb2fd8941873ed27b0d40f0adf6d20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2051646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d30785dadbc4ecd3025a77df10d8adbabc260c7057e27b10584057b3d7f4fc016a21374ff720e76b2196617c9800913718671966153738a51ea73a6432f4ab3bf0dff5a84056750eac9adbb488cfc819afd45d7b707bec8a1e4196bb51be6e7bd60ae29b735f5eff4bd25fb4d4fb61a513a82460c0ef0ce3d2ffc7cbd94b706fdf3b1c9c2cf996feb8c879007ed7f4c68554a2e57cf8c8c5c0bc9ff388144b9a0fe770db21d58cf9191bc21575dfd0a2264c0cda110f7fa0d71b1290f1293823fbc4dcbde5dd13a9e9e1ffc890a0e959188c645bcd70a1a7b91384daa8cd0156ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94da41cbe840438f89a6a0ac625a9416d834b3f33b3770c38031be21b28da83f000000000000000000000000000000000000000000000000000000000000000025c6934f9eba9abbc53e94d34bbadf28debc99a4d2ac249ed5cea3d36fd546bcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b8962a9c54525fb58487c69f3712663acda1a843da215ac10cf024cc5bd45ecac30bf82fa8df3fd0384c459caa1ee82314748e96cda38a9a95edf31e5fa007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff56c166a818eb0f0885e8d6a1af6a547dddc2c2cc277a8dd0e175cda0f0b475cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4afe4d2fa8292491b04ac94f3579e07ea2820a2efe8c5d7cdc321fc6fd962531000000000000000000000000000000000000000000000000000000000000000095effff3d1a70c342441b75631ef902ddf2ddc837994e5043de51789538c4dbb000000000000000000000000000000000000000000000000000000000000000011f2eda03ba6d94486ade61d4f3c93b8e423cfe6ce1a1b01125141c24b6438c889c3acf9263a560421ca2bce10f7d163a8804bb321cb7da79c6321a29d03c0dde8f8a7d1619889b6e3a150d7bc0e637be3080ce9d6ccc38d41a83743dd1e2c51e99aad7db8972198620f4ea74a4494dcd65849b55fd8e1ece8f54fbf0af6816b24cc9cb0793d870b344ae56ddd355b2e771f235e3ffc12354bb39485ad36a7aa7375a32a5e045112cdceecb459c4995999b6db133269a7d7358d416abf805fcfe41bd9bcc97369e423325c88712161f18c3503205998885f063c0525eb5f2d8b4acc167957e4020e85ba25c911f06a2a8dc6065efc34ecb914e933ca3c949405ad791c3a9b80e8890ceec5a58c830f53df34478d164ac44a0e0c38ded2479bdeab5ce9e141632689e266f38e2c2cd8c2cd0b87b08512f9d8712ad93c7abe36d741bed2d0e51e90ac9d31effa23e36c43a2783e747d266c1c0c9bfb7c41188affb8a6bead3e55fe5b88ce81a3b922ca61c1f3f5ce9967c59afa752cd066039867b23027b82614047fc513d36169cb1d4cd347548cc3fb6e78e3f5970f5bb9309fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5fb087677d8eaaf50535cda0874680349d20471d186a6fb56b78cf68a2a396e137d25fa124369759976882ce3899c05a26dbeac25aeec1cf4620ae772020e459e6412c40bf85598a7b2a1d269735d196a38c98f2625b15518b3c4a9f2847817000000000000000000000000000000000000000000000000000000000000000050b8df1d68417e1955818ca12a80830f22a56ebb200b8a376c5b18036e5db64c32fcad9214e2a916766c9050c03ce1b67348c9073fd3867310ec223da95f7bd0b13f87ce275098f394f067f4ee6c5df7673ad84d84aeb0703124d5f489130e8d00000000000000000000000000000000000000000000000000000000000000004ac50d3072abf1778fec113c724452f518053c9f7fe8facce0abad2bf44141b30000000000000000000000000000000000000000000000000000000000000000d7fa016be04d7edeb2ad3d3ef4ce0bba0c2e776eacc0346960e841a0abcab630a5402b4c585240b9106c2d62657fcacd4f19c06b671b744e1ecbceb7e2c8ddb859497008e46106b80a8805ba5558973a878d97ca009957406bfcf4f3cc897d0103583647efc6a941c9cfe5d6b5b5f481578dcbf633127cfad95c9abba62bf282ebfceb33a113b5e22da86f299457aaeed9447bb0ec57ea2815b0eb353e5cd591ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ee0ee28d901acb47d6b2e3fdb5f6a537a4da791c67d65d18f52aacc08b00aae90470036e7c921d30f1e843ef44d9bc86f36517d22d60a331a4d1a8dea235e7f80d73c2905d263cb6cb17a77ae3a30e0837f63411f14c374b716b9c6bf0fe03849a4b9a71603529d25c66ce8682f296c1b91f9585d9bce4508eea7314182397340edbee6c00206f0e0de3ec6a1871aa8a719b84c9b6b8fb7463d3f99614f6d97374f2fd3ce6b410e81bfc9bc528da4cf5d9c55900e3bf6e86cd931768d3ead34ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff107205b80d68d90d7ab6bed69c85d506bfecc9129a6124719dd9259f9ca83d66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff06718ff2b40ea9bb812d68372c657c4e7532ae9c339a045185f0387917cd48e13c5f4e9b318d0dd7d845bc8f57f6ae6f139c62bb692d8d719f358051e9248c01001f5ee4496e79d86e079c265acb5ad792cc2857f1209a998deb6bddd87ba3ef7f205ab1275eea909497773093891de01bbb4d8156133d83477d8fbca56ffa4deb34ce31eec3520b49735b8746a994b213b566af74c9c1fb7cbe5e620541610c95f5280707a1a0172908b6974840e0cf359cc126b37af177b8d7782a458af7783902143ad5dfd26a5bef60ce57360225212e86129c6f9f3a3270a836cebe5b0acc889cc1f77bd63c6735ba075f01207f32d19838517a7312739b05df7c8caf67793cb06c4e94ff4dbbfdc933770a06c250d228b385e7491459d5deb7a0ce0c8affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000b96736d52acf68a3e5b7be814a229a3d9df7a7bf5248c1aeb12f78d0dec9d14da332e79ddab48e27584a8464eabda9f058099687b586c6a2fcb0c611940a702dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1fa44b17f3934485576cdcf58b8713527933168956c1c465eef29f1db88876d8487851be3035d8237006c63ae05685c20fbc14d0745cbfae1a17fa62d55714d92ae85994b3415c619b66c395869716600b3545e6f04a7d75c0ffddac9291bb1f754f557bbafb4940f6e54788495f56a1f54fa5f6aa9a82bd99d0be0f856b563b4ea4e734d1179aab74d5930f8fbb61515ee6b1b58a0ba829a2b1def4c1cff7898ed24b336b550b17055789d17a25b172537ae1455db70617c2b118ec651e0d1a017bae30ef06ee67f32da8a0cdb7e43b61dc49d24ad5a26720c83f5b363097fdf2f57a20a91be0e80418c95c7347cf587d43d81dc268fa8ed5f86fd32091bcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5edabba63702f38eb276ca33af94b77993e1ba5f23eb3b7694279fad7dc0782faa00d8b92a9c7fe9a9dfcbafae4bb989941bce9b61bd618596de0668d488471cae72d0dc4fe68196d465d0209fe1b67054777bad876c563d524a2bad27847a6004db723030b3407c400759e494e54f84e95a798e6d7b6ef38d5d53f65115ecda6cba38c52ee68c6619d54bd6e944beba82747035dd0fbd77085e129c105f445e05a107367ba362ce285c83631f39881f8d0c4fa0e3f3cb2fed5f21932ea194cdc9ab2dffaa2cf5919398e71a1cf9a2863a86dcb10829e1cf959cfe4d00b6c34600000000000000000000000000000000000000000000000000000000000000003454f1097ec5491edd4f147033b634620ec5d0d80964113395bdee2320ba329ef00c4e734e3c6ce347d9561ed201ec77f8881bcb06775e12f9dd43dd028fae656cfa5ae40388ded790c34f9368e5a070bb1fb2c3a4db90309993e45db8c5afa1d4aad98abda7c8e28f3e634df6d4a3a0d87713d78cf95fb199e58383d7cc60f9016e7a0d93a40f984cae5e11618af8803d7397cefbc3d64e40c5831522f8ac297198bf4e3afbffac10a2104847b097edcf877f803375df6a74523fd598e491d458ae479d92e2ed7f073bcb9ced61b5d71df610122e42c8375479371a21f49c663d7599ea2c5554d0896ceef80302d058c9279be888e7b4f71796476ab7b22c77a28286392c4d0fff1b24a5df3c903ba128fd8345faf1c2843988b37222591093e67e4f1366a3bfc0e7a4e1a9d9bbc6821d1cc76282b6a8ac08652aa135d0e17c1a28329f1220195481046aa1c77488fba52c8bf7720bd50830db7130d77960cf8cab1103cf8a463558547838feec8e9963c40e20e79d41437ded67259e5aa2abf766655483fde84d7acabc45f067a2b7ef18fba26ceb1eb8e78aef99213de2d062c520ac10410a600409c7028e927e0f67c9341e32301a22408c0b63056a4c88733ff60f98087d4514f686719a7c163102f2df86cf29f8c93f39b7124a897908221d140f7bddda1cb54158603abac448e206755a5c88e48aa329b2a2a110301cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4c025675267608b16d73539d8e554eb4f1ddb834be786b27a2ce63fd997ef13a819061645333216a624cf08665a379470996c01670da635c11d17a0807db27e7\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/669ff69c2c67c7765c32e86e0eda8fcf04bcdbdd",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4600100000096211854dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0802000000ae1def8304d9f05c000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df979722368987ce010000\", \"prevouts\": [\"77073800000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\", \"36a4260000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"9f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa285f58facbc555a1823ccf774e09bcf8bed00fa79ba622996abd47a227307ebab591a16be56540de55d9fbfa115de937b3aca1e4dd0f5a93f17ebd2ebda95183\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f61d84cff52e05d72c3db95a85d4c347800acb4eb97e10662f9f4ebff4d0f9e0285f58facbc555a1823ccf774e09bcf8bed00fa79ba622996abd47a227307ebab591a16be56540de55d9fbfa115de937b3aca1e4dd0f5a93f17ebd2ebda95183\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/66bbe506485ecc1f5f29905e93bbc326b119a9db",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba101000000a9a32afc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ce00000000d3ee6bbadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf600000000f28de0af0335865a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb813d458\", \"prevouts\": [\"5519240000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"15bb0f000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"0239280000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_cs_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313dbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"35\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313dbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/66cb36473c4a75d094b0c109710f2456a52e3ac0",
    "content": "{\"tx\": \"21283431028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49b000000002471ef9560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701502000000ffca41f901f4dc31000000000017a914719f78084af863e000acd618ba76df979722368987c191064a\", \"prevouts\": [\"4e9736000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"2315120000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"304402206dabc2d6bfe31004ed9f9f46abdd975f09ecd1146f315c4ada6291e50489053502201a1f7b7dccc85282c319eb5ca4a15a5a4ed1ec63c0d96213179a93d74b1f67693d\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100843b44b877e5e690eca634f3e2b00c683f5b4729583f5424b36129def7d4248e022060472eda1d2b0c78a08cb35fe7d8a17065626c3e1bdea20da6640e8241b71cb93d\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/66e881b64f9e9007cc27f9ae6ea1d9c09b7ff1dd",
    "content": "{\"tx\": \"b898faab02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd001000000322d1fc28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47201000000a12eaadc03c7936300000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac82030000\", \"prevouts\": [\"ca39240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ee564200000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_f2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d80b9460896c552efa2f1db7d015f374b148a85fe90e13db54827f9424fdd53ced619e4db7464aebe5995e5e277c2564dba5a4d2f150140859697e15e199815481\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a2108ee9a4ce6f69b7e337fe1e767411b4d1a9f8684f868571813a41116df1c6e609fa7bf04a66dcfda1c36ad472f19e947902a5ac5e2248ade24c4a53978860f2\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/66fd2e2f42f7b15c03f46c8f5852fc2b2a1288d4",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc8010000005c7f094c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fa01000000ae244f4003c3a18000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e76e000000\", \"prevouts\": [\"182d500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f1323200000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_17\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a557fb53d5dd4d98fed94cf44dc84912bc1fadd1b2aca3adadd333dd19a5140a9f9527657baa3b3c427ea0f353d50903358cce00544d502e89ae55ce8ebc1ae801\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"44fb34676b9daad624cb34574a24c03c9c7462532b7af617679445f8f653e3bb135b83eb1acd5444328e785c0686ddc87a64a227412ecc3cfb7a4370e921d09017\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6723a627907cb1d91034b75d6a69d055a9d2a9b2",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c290000000006481d8560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701e0200000026bb47f7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5601000000f8a95f8803a645cd00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79665a0ac45\", \"prevouts\": [\"bc855900000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"782b1000000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\", \"077c65000000000022512007a606ac1d369bdfe9b32b88a4b0d4c507785f2481b337f6b3340196eed3e896\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93610658657c9e95ab5519a432137c3fc0dad6c728261b2de6e60ccb78b9288ef57\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aff616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/674c86a431b193721af73dfdf07aeef65a7ef508",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45600000000205bddf760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700d00000000c8f1b58b0186fc1f000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478744990c28\", \"prevouts\": [\"28b5380000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\", \"36b6110000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"9d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936efb1adbb630f4af208384c658773c47546649f7183045c3ea461c7241e38f37a96b892175c0861377cad04fa4faba87807216c52ab5a24eadee36522f056d83a72756956c694637235f847009e8e23b8c05283b4a047903b3fbdb647ae4209c1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363e053c547386d418b4b4623c4b95365b560c64b1d3965d2e285700304f83aa6fa832c2593bdac0cb0b42624935007d1442180dae3fe4e49dcedfd3101f5729d872756956c694637235f847009e8e23b8c05283b4a047903b3fbdb647ae4209c1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/674e2feab074ca0240a6ca55826b14e434793461",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706d000000001f9bde91bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf790100000000c42cfc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48601000000dc5b1c9a012caa0c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc786000000\", \"prevouts\": [\"2d69100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0c5769000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\", \"3b5e3e00000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902324256e2ccc712f51e09bb2517115ef3f7d8a0b9905ddff3a19af56c609f84b271fda4c990677887bbec1909e2004e70b01999a19e0f45b9ca2937754ce280b0f6b15ab303eebe6ee7e8f525a07ad9f1e1d9a2fddace045a288801d86f6069f79a21230c4012acb552f4af8824477a6ebc0029055d84046afe75c9db4a4a3ddd864bdc9accd9f215ee739f9cd4782438b506a0abcdd6c4ccbfe5dd4121710991a16b48dc0e72c7274073c99b1712817745477d40abec6245cec3c2d7a09b08d1b90bbb6091faf2ee768ac019fe91cada18ca141aa15a18b67475b10b72af3fdab7411a9a718aafda9685801ea862f0b36937d976cfdf621634e8c4a45ca4d754e0cdc4ddee4d28a1588ae9915a17821f85c77516a8b2ce6412586dfe1df8300592e31e3624b97350d5a0b8eb0474b7f739ea2e5b8991bbfba615b4e2c8249f61455993d52150af9f9527d8aa9e3af858af12af1bde8dda5c0e5dd5a98b2f62d5198e7c1f3ef2c6bf0abe407d29c33ab2368eb52f70cef85cf2c44755579a9efe174ef85c74017bde4ca326f1fb10621744b566e005f1543680d6f392c23fcd4d9098e4528d8916bb05ebb6b633e8c7f950fde48aafd21c1f816e473169d6129f137a04e9db776cd6d04222236537c5aef746e4fe8b174a2e9b2f238918163d1d04a3af1c1e418733418e1dc192b528061e6dc99d67fbb0728541d1e94ecd82533e9cc129bd101cc29175\", \"867d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363cdaa0eb757ae0199db07cccbb4145c327e3e07b9779dd9bc3db969b58b973854fc7631352e9fb39bf71f46c116b968047934be68cc4b25c7eb80a8b2383cf163ac108bed01ff7a3c4482bdb9637a0c08eda3eca9d378124f08be0fd1593c53eb98f84b0d7d6fcb38bca0562970da4fa4ac9189daad947902c07179846baca90\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902571c8fc7b5aa059399c097dd92a905775c5319d995c2a7dbcaba31488134af38d3d89b7616112e7a93845dc38d66ee0ac381b6497028b516f57418335a224065d23dd53729eab3be7b296b5de82801637397d7454dc2e25fa7685c7e38133a188f7ae057c5cbc019ce883f908a819c42a7b83e0dceb87224d5c9d387944d0a8b7ec6a77ba4d6214d9a42af110635a1333ed8be52af9ab59803c22da1c1f6cfdd09d387f18d5a80a2f1d90b58c25c32a2275528b969ccebfe6461cac4ae9b223603e48d7b14c21b63417c2034b2308eda9e867de2f2b65a4a461d5c55fe7489a536747587a9ca33d74c34ccb9f41f43a17ca1bf0471b069de785a10050a3b2650d69ab27354a5c3f3e1390a4cfeb2415180c4b9b2d356afe640fdd482c45f0f7f2218459c308b09d84326655ac4fa3bd995c64da57c81f993bdc8c4f1547c1a28d09fd18e95cbf1e6a3a42ca2110aa48b60b2a16daaf4eca7c00cf0849e843662083768fd24f17c0efa7524f9b6b6a179c45bcd5498ff08d7e19d1065261d869e0fab148298dfe458a63946b62018ff11e75d13f09f8414e8dace3a89558cbdca6affe97958092fcb5d95293055e1ad1811dd54a9093b60a43af84ca99363e595105e8095bda457165b6b03cbf5a7c9df7eea5c4de0ea59243665b570df78c47cee7d8901f6ceb06746475320911adbc77f16d3815b07a32d4ffb5f1d175cfbd3f69159b01fbe43d43575\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e80adedab43a8ab423f9b5916bd9a862eb4f524e14c7176baa6699ffba0690b6e8b98f84b0d7d6fcb38bca0562970da4fa4ac9189daad947902c07179846baca90\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6766fbe9f961609fc3c2e2dbb922ddf1dc771d96",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c424000000004c7ffa9e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270120000000067fecfca02e2db4a00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc71c501441\", \"prevouts\": [\"8aeb3c000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"adf20f0000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063db68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045e4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0d54e6d4b188f4ba3829c97f16419e7d7896d7c05fe6215d1417ce194d9971cb9e3dda2dfca806ccc9c3ad62846e64b9ac16121de5d926db5bebf2e82f8dec8d2a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936120d11d3534b0b29d9477622fa88775a27b386783982fd9652b8fcb86806fa8be4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0d54e6d4b188f4ba3829c97f16419e7d7896d7c05fe6215d1417ce194d9971cb9e3dda2dfca806ccc9c3ad62846e64b9ac16121de5d926db5bebf2e82f8dec8d2a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/677c2fb0bd66dbf157aed281b05b92ad2c197c37",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700302000000ab56471b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41201000000d13155dc035cd64100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acdd5eaf2b\", \"prevouts\": [\"b4e90f0000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\", \"38243400000000002251207c84ae2d9063cc63412a30e00823aa01b05bc54bcf6d9936dc1c650bbdc9e98b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"a37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2f8f33b00019c5a92b78a4d0765b6724114f5676deb8014962e3b41b4c6baea3fd3695492b964dfcc45d3a474d456ab4db8430bda5885b2eccf08499e11263dad2054b94cb6efba565738f5dbf6ee5a67458962b65d77e1cf5e0d2c1c00b2210\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e1bbd263bb9b57787cc1695f6735ee6aa4874511c0d77def079ec8f767826a474cae923b25d556389dd5dd645f6d7ddd89a07a74a73dddd3d85d7b65ae33798aa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6790425ac6ab89b1bf9e69e61d0a23def2470c84",
    "content": "{\"tx\": \"0972a5e80360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702f000000002df915e3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0d010000005dcd57a3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc0000000008fb04dcc0287d9c80000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac77000000\", \"prevouts\": [\"915d1200000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"ec355c000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\", \"26b35c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_b1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d02f2370cc311fdaea8d390cfa1c63b0eef7d0ea0cb51421ecec6c381cd6cf992956c198c54e508542ddceb10ef1876b5a5fc8c5264bd02bb08e399775a6e603\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3f5405c60901045cf8fbd21b5f236cad6076976eaa41fb829aeb8c9ed18e1fda3c10a5b23d4bcb0d29cc4699811c7889c813758769510ca9297c0ce8bd5cfe35b1\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/679748203674073239d2e5a0f7f9da26bc60feb9",
    "content": "{\"tx\": \"a48d03e901dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ceb0100000038ff23fe03ebf15b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914719f78084af863e000acd618ba76df979722368987c7030000\", \"prevouts\": [\"47925e0000000000225120d632d9c3807cee2f3b07918ef684335c8e7823a1a0eb476eaf46267e076b018f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090249269449cb326047a10e121b8baf579dfc910fc86d8756d3d64a30ecb902b60983a6acffde72b37d73ff805d4a067b5bedbfe5dd27718bcffa1f513bf206fe3bbd445eb62ec5e611aab5e81966239f9d22c150c70bce2542b910c00533d1e6c1422b34a4b9872249ff0e032b1cff26dda1215a8a65b8fc3a9c4916faabc1fc866f9d98d4941e5fe497f94b8d6295c6dadd9e6a2bec9afae7206d31784fb40cce579e518d3c72919c72abbaed9dc27e5dc690e202529f0923eaa67d0713611842459d1af9c8c203b30001e91257090201acf15969ab1014213dcaf3a6c0588bca46fb0b2428f48349c3aba1e9e9eaf55f960d9195af927770bbe5872508bfa63938d125a7cc7a745f5bda9a895981eac471b1e9ef053bfa85c1d0aa0c51a2f910868246ef88aa33c88d8acbba6e1e5d4ce1730d298ee2350e93125ab9b7a5d5f7d394f5290e5d6499d02968ebb90d19c22c3d331d0ed6190e756b23e246d840450f0183b41de6f839688c02083164ecb977277c95999208db8225a093cc11ecaf834b54efe26953d7eba8d5c35ade50bbab8e1835e8f14c9380038a8e77d7235490abb1e3773be0a8cf3ea5e5c8bb356d76acd5b0f03bf41e3110f7a8c159b060c9af9963c3f4c6b47603425ceefe47087cad7ea8165f01b577821038a8b4624d39272c18edf602e0569a235770f31a4b58cfe15bfb9a51b1f0165a98a57034057028413da99d88724775\", \"147d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369dd73bd5bfb795bb2efbe9fe3f0d415ac42feb9661e311246ef70ddb758e793a9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100efb63111b06c7a0ce3f44d9f6906db8fc60057b72694cfd58ed25db88d188e5fc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090299631bf7d4f8df9b4cd3e194c46774ab087eb57a2a7a8d07162b82c319d70d52650ec87bff9d6bb08a7f411786e6f96a2468dec2f411ad741b81c63ac3618d37e32b1837fbe49be9bacce1d49b6fa3bdc190163b2993f77dfb8f0aeb0ad9b0372fbe9b5da046332153ef0f16d8f7c336bab5295f4eef3adcbbf10f9cf95d1d0a9ba283033f90873a908540b2dc91e6b3eda6b9c056bba2385e5e428d90f215ba411e685941f2690910fde28d427d5d837766fb1e7d9e7b517811e3642647e8bf345b2d07ec5bf3491d34a17cb7c2b91717e6b681433d892bce179c28f95054a99ade9e509600620efc81cd577f9ba7fa90b7ea844c5d1d22cb104c38032700293bf8bbe4ea3da72bb9b1c446c351ec9366e52c226f0784d4e94e489126de7351f1e13bae76efbe72ab2bb2ed864f77f061042896fc35aad9b08b6d05ee30c732cf0c4c87cf634e5afe6cc67912a18306c5f9df5073c18294ff832a16f1647e6c2ef6259d751b7eb5538365496d07f08450d06fffd6cc260e038a3a9d48907d9ff676471dd0b74b52e30d8d5a3020f1e398e73cfec7729acc0452412f43a95453e5b68da12be11d77f978e5693310dbb4589411997134cb5c4703b010120086dcdf5e253d4877ca62065237d1946d1aedbb650ea7137825ed36ace21e8cd60537a1b42561b26c428170d1ec4a67224394f7ce85ad8016777e39f730f2edbf57b24dc156d62826811e0f75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8fdc2d7aa80560d1a81b9ed628b4b72c1af718550327182f7e69256034992ba893488b030fbb16fa8d50c4f1f044e6df81cbeac111f0be15e3f466e559374b3e5568dbaf979cca58396dcf271ee6fc736edd00965a3b0ecce9c87347ff88ab08a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/67cfc5cf8010d9b1c152301eae06d149589112ba",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be9010000003b4ab8d18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49301000000992f62bfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c36000000004f65d726032c18a700000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5f079022\", \"prevouts\": [\"617c220000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\", \"dc55330000000000225120884291612dcc22b2c0e2cf19d55719f5f9dfe9624bd12dad94712b18ad4d330a\", \"c6da520000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d5cfcb01809ee692b36a4c346827dc2d7fb8406b64058641986dd57c7b689372\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aa1616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/67f26334e58a0356529496d89738359b7a8dd136",
    "content": "{\"tx\": \"896c810602bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfee01000000fadb3ee3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfee00000000d2cc268d0308cbd900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df979722368987e4000000\", \"prevouts\": [\"7dd76b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f3956f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_e1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"22b1a41c5ff182d73532b7af01acf7b278eedb842baa8d5673e0e1c97e39421fe359f38f6ba1508d7f043439a9be3f32fd916c5f31484fd84893cab9c98ae25c83\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5e2469fd440d3f05159d931cbd94637b1b549f11501eb3fd2e994aff16fdc10660caaa048399316d746ae8d25875ecd16764e28ff7c70aaab93fdcc6cdec20f0e1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/68052b4483af39b51b45980874124e3793c72420",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565caa0100000063e069f98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49701000000410c148c017dbf160000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e712fb6959\", \"prevouts\": [\"8d71480000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"40c43200000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"b37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cb9ecb57c15ba33b94e28a5bb7b52abdb34f711a224c068b58d3581d180ced2335a4766d58ec26ce2b4efcbf65574b66558d9985cca85178600ded982bb1eb8a33479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a368ced990ebadb111ebc3982eac7e308f07f99a9264ca6c949f56162916d7884\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e46f47172cc098fd97d2a24de1b24a28ec1a07dba8121311e99b8793de3d58a2c368ced990ebadb111ebc3982eac7e308f07f99a9264ca6c949f56162916d7884\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/680f37fd69b7d65b2bea1f6968d0d19d60d93bb6",
    "content": "{\"tx\": \"24ca7fe402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6b01000000e24a61968bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44500000000ca3ae0ff013c003800000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88accf07ac48\", \"prevouts\": [\"577755000000000022512054c099d7cf7db0853ef8782c8a4f2f22d5ed4b1e2f91866bde088ab8cd4c1400\", \"60373900000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e5135059a6e03da2faf37010c543c3df76a3376febfb8fd92f682776fb9c956d6fcd0fab6a67c3bf230276b49a6ca24f17dacdd3ceaaa340a5ba0b2ba475b0ee81a75fe046050f41c6fcdb9e38a8e16ceb2d96bb057130f662fa5c2664fdaf5d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4ba1d7044f76185c852e3494a6fce96de1fdde778c7130ed924b07f57193456c18c78e356042728a8dc5293f4719d9544479381d7bc53161d8023b722566e5250874a9774daa89f30be275a1ff5113653dfa1548b9628ff9725cf694401ebdfe4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/682b9ef29382e2d77b5242e0860693527c825702",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4d0100000097b2f1d4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff300000000335a90e48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43900000000f069d69701a1ee2600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aceb020000\", \"prevouts\": [\"98775d0000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\", \"e37b73000000000017a9148462ed29696925d7688e1db8e76ef9e6667f05b287\", \"74ed3100000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063d068\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a3792efafec61e3ae0d1fe66ad279b80b6a6067d0a217ee4ff0d115ccd768a971469e71666f51d71b691366cd88792f62b60965457ad0f8cff2baa31a91ced83d191de94316b2d555b882a7ea052cdcffb2858bcf3e9dcd4db66bb89a9914d760d690b53af7dfcad925f9834a18ad2ddc318ee8f8616a880729dbc2fd60dfccd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365cdad8b7f4602765077dff9aa4c4351956f6937ba55252f34491fabec0d3f596721cddf589dd211ac28650b11a57c9c7761090d2defca181b3dbd9260ba7b6b1d191de94316b2d555b882a7ea052cdcffb2858bcf3e9dcd4db66bb89a9914d760d690b53af7dfcad925f9834a18ad2ddc318ee8f8616a880729dbc2fd60dfccd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/68560332b36281ab2ef6e177361019a087666119",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703000000000fd549f910445780f0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e703030000\", \"prevouts\": [\"cc251100000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364c3da4617f1ee0f61cdd6b0c3800e0774a5e631cb6cd048785fdfa88f1b1ef57f81a0ae7b640e88bbe84e7c412f47337f1d12d37f95b062c539998fd28213cbdf3b3fb8d5121830dc5ea13d084a01bce62f4c2426ea7fcb92dda33a6ec3d9661\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ef4a0b996a651997ca76f2d80ba069e4ceeac28cbc038cb062656a276693f78c3bd101e45a609d3b8e0b3b6f0b7594624f7e9102ef5d5dd3027418de40ebb2180d690b53af7dfcad925f9834a18ad2ddc318ee8f8616a880729dbc2fd60dfccd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/685bad2808b9ebb6dd3bebf554aba2916e169a21",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfa0000000056f07197bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2e00000000e97e04addceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2e010000004e146fe30155a353000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6ed721a49\", \"prevouts\": [\"41e1250000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\", \"b7c76800000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\", \"603822000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063ca68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360933b5913dd2a3e84067c9c541247d08bdb55bc364eff1883b3d8a61fdf16b63d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51c1012b923c15ff4ca5711684c82f77f7d0ace9e417918255ff860668826001128a698426442c951e7251e4e87784c9556d503d37bf6168d5559e89d6402ee5a2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c1712c20a07a0457620eeaae766c8e6d37825c65d24f292e9d3da524b2ddb2c1be01dd809c80d07fbb65649666935b9712ecafc77e536b2a27c3cd6425d00c1ec7034c4ece6ceffdf067bd97d8bd2a80e986f14e8b5dca33ff1523eba7a77d63\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/685c94cdfdc42c71493f0fbf86f6cc75a2bfe7f5",
    "content": "{\"tx\": \"7b13900c02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b76010000009ad734fedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4b01000000c5b820b103cef56b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e745000000\", \"prevouts\": [\"0177270000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\", \"43f5460000000000165e142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ad8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93692bef2ddc6a80d85c82e7a0acbf372ad032dbeb6650a3adfeab3820e5dccb400d7b73fe79aa50781a03db77b9e22252058e372f5a0275feae864cfaf4c2a217ec513aca5799d408eee0c275015e54cf6f255f9c56741048ad8672ad33d4825d8e26db4ec4cf8c6a12d3bfb33a6f8c1ee971c26c5be04413f1d9dccd7296a9839\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93665e98030e68d3feb8f9ccbdb19e208fd51005dad116ab71fa8ee0a355037b3e1709247cbe4599f1b40c45655be9c4524e18ab036a38ca357e6d7c21966c7872b33cf35ac099042702f37424b07b91f05c9425e6e1d18ffa37c0a546b69cafd337007ac6d9f1365651a4d55e6df0dcb109d268cc6c386b355a4997173bc95c886\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6864a32b8e40345c0b76999afe5f1c070d474908",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c21000000006dfe2883dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc201000000b98404e201166f0a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a627f75b52\", \"prevouts\": [\"6cbb5b0000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\", \"dcc01e000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"f07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e829259a32967333cc74bf44ff096d479961194fa0f97de632ce420fba7b687b9321741bf2762a3041d275698fd56a81520b6404e88c31ed080bdecc36c09cb10e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93615d9371bc52daa468585b81d9a616dfec30fa985244c10c6347844b2dacd11a03e6b1501de3c77a58ed25563289f7380fad902eb870a0fdd7293169316d7b75ff88c7bee1bb9c109f1c6365501285b6447b8ae029d34f47d1dd1efc50e8947b4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6864d1927bc63a92a60460a41b2a104d48d49e0a",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703100000000aae7c1ca60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127001010000004823318f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270060200000039d291e50304902e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e70b3b865a\", \"prevouts\": [\"076b0e00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"6753100000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\", \"176f12000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"1f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e576fdfccd5cb93347e3ba64a7809a8c9fb7be90a7e18659d0b981582f285e98b3e02c0e1665e1d6a4b6ef98a6ef3a3632c98688db315e4c8eb8907479035d72\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936220439f899a0db699c3bd5563527680191a7809c0f178d96b69d6a5e01a1309ada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e8a47d733f2ac96a3990499de942ef9a5afce6e4fdb28ae911c182ccc4b722ed2ed661e9ebd30f651fa020177c2a1e4ce51b505c9194e43d6074b392863f250ba\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/687590a8d9eb9f62d77022572d103d4c5adc9867",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127014010000007885ab88bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3501000000d8098c37dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0800000000ce51b63e0198b6c300000000001600149d38710eb90e420b159c7a9263994c88e6810bc7bf71183c\", \"prevouts\": [\"2537120000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\", \"5971770000000000215d1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"58b05a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ac\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b4f7a89986206bb57be108f2587503325139625ec4adacf07a04d254fc9ada78e346601951c0ac808362b101028f3b8943716321a9b11ced5fefa304cdeb6ada\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7a608dc0f7d86f502dbcf40071a0824808709a0f90556d79dd4a8769a8f4382721bc45741c406121d867b44ea1636c09d50462631f6c4b1f522da1190f663f06ac\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/687648741dc59ceab592c14d35fa96ac27ef98d1",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be301000000fb36def3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb301000000e6af33afdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0c00000000754fa2b201d3161100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac7fabae57\", \"prevouts\": [\"c6bf250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b787490000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\", \"1205240000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_39\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0dab70a6fb2b5c835fc49da75566c5dd7d0d65403cdc08ce6a89060a5fa82e4319f8551389c3e13d604e9db9e69dcecb2e493ff5fc2de8225ed213d11b8d84b003\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f01f4ef223236aefb003b32d2e08eb5ec0d2bfaa4f7df8addcff85e63022d39078518400fa18b1ab5a59ea7a4d6b5faf3fe5a079d1fef82145f2bf3819f5e4be39\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6890f89ae85a96d458a2e92ae84db78ff5a3d8e4",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0f00000000fea24c75bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0402000000ffd0d85002b76feb0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc72e261f40\", \"prevouts\": [\"aca878000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\", \"3ab5750000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"e3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e17387e8fdb6e1953b8492ce494f93b549856be52be3e0b2251aade3a72c8c2c0db79b88164a8f67b1298a482dda9483af1363bdf02371c7e121a2c285843f3f1e449280c515e7ef393424f0dc01282cb8b28e26e76822dbd41f29cf7fcf3ef3a2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c8b4938871a8e43bb69010d25957b1b3dd5e0f775cf541eef5db4a9b76fa4cf4c71af5165e16a75a4d38ea496516a466796a1cbb48ef44578cf258de537130fb0277e21fac1036469cce09bee47dd6f35fd38d265061a05632a5c9d8280907c6449280c515e7ef393424f0dc01282cb8b28e26e76822dbd41f29cf7fcf3ef3a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6893c34edde19b9be594417a3321f7522c83713a",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3d01000000da98460ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8401000000f6fde8a203bc4d9400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c147d44c\", \"prevouts\": [\"fc6370000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\", \"5ab02500000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a96\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cbc2a23a7d8296d4ada3bfb9f5a799f80f89c8192169ead6b004adf320674e5033a51c0dffe7e5434825b6cc7212f0d90dea7a5d3b9982f8882f19203896a3c56fcd0fab6a67c3bf230276b49a6ca24f17dacdd3ceaaa340a5ba0b2ba475b0ee81a75fe046050f41c6fcdb9e38a8e16ceb2d96bb057130f662fa5c2664fdaf5d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bbbcd71201d7d2549d70d2328372419fb63309196d1406c01d663de3764feb62b186acb2a5feb9ca494b2668e3b95b217c5b1a118ef72c41b67fce4e6b051c90eb4e626fbd1c5a1d96a595c16e39be42f50aa7a1faa8ff1a1c0cc640b6e10eb9874a9774daa89f30be275a1ff5113653dfa1548b9628ff9725cf694401ebdfe4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/68ae4d6748f33706497031526da5fa76f0c923a1",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2701000000e971dabd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e601000000fb959bc7028d473700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a660000000\", \"prevouts\": [\"241d270000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\", \"0c0a1200000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cb4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936140d663498a4274ecf7f45240089a1df766efe22ae76bf8a987a78cbf23a246a1937db199a07e1996385ab03857d8e2ee63e136796e4b408281aef544a937c0c73f74a88798a5fcf30fd7aa5fdae43144d667a238076c6d52287fea96c6e3fd1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f551d5f9df51039c21b920ecc011c032a9913b031d76462e802a27cbd0d0ed8dd6d723e038e6335a667e0268d00f4826306437ee84552cc7f8172181160444ef73f74a88798a5fcf30fd7aa5fdae43144d667a238076c6d52287fea96c6e3fd1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/68b62ec5b8680759a52e8934526dbf400162c104",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706d010000001db75c8f8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e70100000040edebc3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf710000000010bd48dc0265f7b6000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc3fbaa343\", \"prevouts\": [\"9930120000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\", \"dded350000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"1558710000000000225120ba259941c99089f87a1bc06d64ef249f01ab7891d30169746f94b5a6d9357ae2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"ab7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e1084d1aecbe4c7880bb8a882fc35fa9ebdfb0d7259cb873bd54dfc151a0965e70144ecbe7fb1e6c18f5b14cfe26e6e35ca66fe7cdb676ad740673ee849f6d44e7c07bb1aa10d02d314eb70c923196d0e49e71087637e2d5a1d7fe44c2440c398\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa94b0c937046f490030e0d20905ef6ea85b70027c49d9391eab6e36e103b9e792f3dd0bfdeb3f64daf38e1101738c14790d5f1c68393c583b55b6fea5718d19818cb303569f28fbe8acbcc2d27d183e3a68170f5392df28f40a03efea695d856e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/68c6c0d42504385245c61282657b3afb267a068a",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3300000000fd918ce48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4dc0100000057bd5083dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf300000000c9b3ff710361ce9d0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7961aad1f34\", \"prevouts\": [\"7dc71f00000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\", \"a33834000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\", \"59974c00000000002353212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"5a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f5a747f2c0893f79fe153ae918ac3d696de9322aa679aae62051ff5ed83aa502db79ef349d3e4f05529a42271c6cf93f8e06fd8991a688edddf7288612a03eef8b5457f6f65490151d40d3d05d55f9c92d8dec73c7aa55a79aa7c51354918829c531ca70e78518003474f611c07657b0808402a053b744a80e6cf25146bdf24b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b0f84c5967c23664bae19475758c80d637c70256aa4f8440547e3702c69f37ebb4949da8d2968254411aebae49708200d0b19b59a844616925b107b397a8b89bee9c212f1ab0dfa1a42522b9ca3467b009d36f3b841f39cdc4da4a0520ce4fa4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/68ebe4901e5b73c0d6c376b14ab93cb27b6b9b29",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3101000000eae4e7e90370872200000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79619010000\", \"prevouts\": [\"5b7b250000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09022f9ad783d94518a53419533d0ba556a28c40c576bd961d392d21fecba958cd5ed244f61562037b43c30e20c78eb20b2bf5f2ba2fb6058f3e6e1fdd05c56e8a54d75571060e983ce0c5dc7ac0009c119ceaadcb3147fd13407074ae267fc26afce241cad575953b8cca2778894c709284b34dfe2956ac9985026f376388e418738fabf5c9f6690dd8587198f4e1ff7d71ec79f6e4dc95a66f6d99d2d7534a367f2a3b164269d3807c3f32a860066f2a4646fbdb5f1905cfb8450cc437b41c3014f1dd201e31d6f0ad531e7498fcea50deb7610b375fc44156b8b49b1081830c66e9e7fc7b86187dfc255966918178fed022908e386cde03521f70e85d90f6ab4391cf008d0df8b5d95f800770605c9ce9906362bc9d7e76eee2fa337a864dd52121591d0c5aee89e0cb8cce92bd26e309e8f2495fe57b24a8b950d98d0f9a0fee209b11bc1f96af9596219c4ecba28de97f0397601cf4c5dab3c91dd5f8f682d18806c13f63c78905f0c0a71f314abecc4a29c00a67467c42f5b2e55f3dced9fbe2b6836ac14c52517852792b7979b155996bcc54f993486b0c5213588d68557b52d1ed57dce4c483044c3e7e6258094ef129a63d6548121dc1481968712ee329fea3090f7903a7e5dab1262163108bc172cbaa307c503715cf970569950b41b0335e106d6a1ece839e2b78efb74f63059d5ba63655013c98ece82bad74b28f6a858deca40350649d6e75\", \"4e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ef65db0c35e25312ba208c3242b68aa03b8861e5321a792f3566305ae352922e80d03cc4210f6c8d536ca11754de7a86c068de81055f4750ba9e0b801f8560f6a4a8046f0466b39966676954eca5d67ee52b1615e6fe46612ea9ab4edfa131fb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ff5c2c0824edcd5ce542426bbd7edb7a2638e5bbd0353dc30e76d6911226baf2dd576cd43c0f12c6c4727ce90c40e551adc54dee75fbb28a41dc196e30ab91b63e831213926aa2bb5633804b904e97da19677bcd29c31618722851f5bcee66b289b775523eb782ae971fbbcc27eca67e2e8116bd42fc4018315d78835c1b2b51f342f86f3371836e9e321ebc03e4028d83fb66b10cced0a4a5573bba11bf02a3614bbd86555d53f494d5b1abaf414909cd68e899a3c65d2af3c93e4ac83c7e99dbbf5e8eb112a51314d557594843b93ed91cedc071a25fc38758ff0fc0ea874a7136f1bc6fc6d00ef58141fc0a37a0acfc6fd05728f434e2ed55732bad355de0e1e0369451d58ec35f689be86ba16473bba3afa0c36e9fb9fb5642b10f6cf649c96e81395811d8bdda0ea23612a08c202eb7c8141b6363a1de1a0119df8a2a4330358e6377f2dc0835e9f49cb0e9409638b39e7cd34488a1463e6e2a9eb71c6c4bc82630877a692a0d1a234bc6d03c35e2e85f6ed73f809df6e4227d8441dd82e4f9040d7d40fbf19033280d1883b24e69c1e2573d0fca560fdaaf14e0a8d407d46c91f4468f12e63394f2e2a813bad02de78eb9a72bbdb9e0e26b7586334bb9d62a7bf8082a5bbfdbca764c0976ab92ff16ab751652e0142ba0702ae8277f9dff9c6ea6ab0d64155683716242729023c0926cc9ab46e9b591330d2d6bd16535f7c542f4210c672f8375\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e9fcb6847defd4ab5435e313e937417091a847a9b6ba01e1bd1b0fdc0d1cd93789d8abe9ca6155576d0a7d6ce7b2728ac84476385b9c54c38b8a9cbf195895186ab153920b849b6028620ffd2b7e486a6f5e2411aa058dab621c72a45f67f5d8e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/68f2022142d8ce6c1188c67a635ce455d70e8668",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9a01000000b5f930dadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8d000000005ea06fac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127044000000007a558cdd0125890e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7b1000000\", \"prevouts\": [\"5c0c570000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"7bdd4c0000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\", \"fc3d0e0000000000225a202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"15adfbdf2d9a81e924eb07cf93fc65631167ebeb7622328e77506ad9f633cbf6301c16517569b4b305066bdf9a44f200d00aca1696de04b0bcff77202ab867b4\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/68f3ade32553e6641d33ffec7c4bbbe70c966a75",
    "content": "{\"tx\": \"46adb1710260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709c01000000b5ef5db360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127053010000000d2fecdc02d72f21000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac59010000\", \"prevouts\": [\"9044120000000000225120997d8f010f68a117b9644ba05425738241c47f04463545c88006dd06ca2c16fc\", \"d535110000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/branched_codesep/right\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fa0524343816d323bbd31d2f3636430e704d2c13fc1e4184cfcd8f8926c91d01c732b89b2131ea4075dfcda5fd1c7b83816e9e0e666d2c0393563f2b58266e1b\", \"\", \"4d1301e76af030918e8d96a5e9c2094c9ba06d0ada8d0810ebc2f79ad890d92025a41b5cd08bdfc0cf7d4c9986cceba43fa0e9be5c2377c104330d94f07ea76f76de7aaa32e78ca0685201fb53e48ff30be8b782d5aacce7aecdb4508fb3a4147892070176fda3b74cad0a6f35c859d5e0d7627ae9b9ca8fdb5a4b5b652d3629350b6e6f11f7de2a627705b189459ee6bd1a593add61bffcce4e74b7b6af7efdd904948c80a13bf6734dd07387413a317d6a1134ecf76aae32aa7cf062cdb54d519d560c7a8549bc2fc161f890e330d20d78dced8994561d3d2bd7cdc1ede9bf9342f772d50abe38243c80d5649d81cd34a40ddfd49451e3305d4428e8856314a7308213c662f7f2d689b318f65bfcd530b15515dcf57563ab207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667ab20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2068ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362ccd8c60a773165cc937efb02bc1b35e1115ac0671e1767a3af984f55e4d3c01bac00967532285e5651a233a5d3d97b0c986d2b78702c704bc34e0fc184218be\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ca47eedab1e22272267f0bbe91700822021f48b5888b39453d754b2bccf2f0cc3cef84fcd8b4969612016f023df66ead1d451d5c00ee9162fdadb086c2091e6701\", \"\", \"4d1301e76af030918e8d96a5e9c2094c9ba06d0ada8d0810ebc2f79ad890d92025a41b5cd08bdfc0cf7d4c9986cceba43fa0e9be5c2377c104330d94f07ea76f76de7aaa32e78ca0685201fb53e48ff30be8b782d5aacce7aecdb4508fb3a4147892070176fda3b74cad0a6f35c859d5e0d7627ae9b9ca8fdb5a4b5b652d3629350b6e6f11f7de2a627705b189459ee6bd1a593add61bffcce4e74b7b6af7efdd904948c80a13bf6734dd07387413a317d6a1134ecf76aae32aa7cf062cdb54d519d560c7a8549bc2fc161f890e330d20d78dced8994561d3d2bd7cdc1ede9bf9342f772d50abe38243c80d5649d81cd34a40ddfd49451e3305d4428e8856314a7308213c662f7f2d689b318f65bfcd530b15515dcf57563ab207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667ab20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2068ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362ccd8c60a773165cc937efb02bc1b35e1115ac0671e1767a3af984f55e4d3c01bac00967532285e5651a233a5d3d97b0c986d2b78702c704bc34e0fc184218be\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/692178574c30ecc0fe297e53225c7fe6b7047923",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700500000000d5fa4fd7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2f00000000fc361b8a0386bd590000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df9797223689879194515e\", \"prevouts\": [\"7158120000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\", \"8aa7490000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"227d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e299ff42588850ae9aea87963ebfdf54b1866351a1c5b06174c8f3cba5c9b3108a2960a95becb1bbbe0636e0493c58f712af9b8da417013d797bf12c130ac560a4a9bce64ad1fc5af22ad5621933415c83e23766bbab20239912b691ace9dee2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e86a45def9951625cf02c88598f8616d12bef3cc01ed824d79a70edf31b7fbe0e1a4a9bce64ad1fc5af22ad5621933415c83e23766bbab20239912b691ace9dee2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/692a5e26fd84eb7c487336a8ad5a27bbf550d3e5",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5701000000bcb31209dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7301000000fa266ec5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd8010000005d4ca570010206ad000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d3a8b624\", \"prevouts\": [\"82e721000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\", \"d0211f000000000017a914a5f28fe5532719f979169bfa3a31d5746f69452187\", \"fa38720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2357212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"23afd0f6352c489a263a48cf14d0dd717d50f486dc4046c2eb221875549b4056338600238683b6fbcf4b6791a455c92760fcb8f4ab092a15bba60baf978cdfdf\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/693b4e80b442d5871a480b72fc7f154489eada7b",
    "content": "{\"tx\": \"9a9e95db02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7c01000000d1dd92ed60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b200000000832b678a025db336000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acdfa28c60\", \"prevouts\": [\"c1f3270000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a348100000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_9c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"90b0d723931e2bb36780c33a4088d618e3b2a4b65f90c54aac0cca4b0f367c8803536b5d04eda010945d247bdc5fe6c2ca6d65d22ac962a4da49e11c5d412e52\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"19e4c4dc972df7e0765a345c3a8147c755b37dd40dbc3be82ca5fd75ff50ca5a5414c7a7b415cd8d2981de1b7b4b9ded00950847094007126ad7100fce95ca839c\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/693f1072f030299b192b97d19cba8ff9e045ceba",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49d0000000063080aaebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa801000000660303ee60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ba01000000be4370b5010fb78c0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7d8000000\", \"prevouts\": [\"c21240000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"da9f8400000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"a0b10f00000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b79b39d6cb61f48e6672b5ce685325f452f02f77d276e735b3392558c3ebee21de995344388049b948e4027b164fbf3fcb33b41e61c2f73c46060eaa1498de732e4881f4d906ebe4692161c26f2f86178cf5393c151301131e44f1cf86f8b21096ef7b1ca4b123dc476d04b2e3b6400f7ed578e17b2104739df24448a2eace6db9d6eaa43315a18a478b7fdb7deac7553c55f55a5e298f59e4d90f18f3b97de15b7a9211f342491d312d4640e2331123890148c67161c5502b31e8e2f0e268d6c139453a495e88797ecc12302c6d892337a0154e2b2d807662c6eb401cf063914114a603ae9f7d2d38002631449a759e0a5149c5faded1b7da45791f060974075dcd3047d4ebe3751cea6149f2ba8fa49fcd87a7135c1506b6707760362747da18a05fc7533b7c6c0600aa0f60ee7fa9b8b087b7b7c80eea539899d6a3b43454ac0bece29efc3e9ef95535ae3d3ed5087643dceafa5a2d5042ab64bce4d8547cc725c737e0c5143b19e107fd7c9eb5451cffbfe11d2f39bc089897f9e6ad2cdeaa91e221217fbaeadc5ccdddafcbd30432917c3b71915949017a9294e9f89a5a11b2de83f6e856071f064ba75ec27384d185ac5806ad33e0240f779de2fdab524dfb40c1a6c71a76e3f30547e604725a19dea1eff12cad7b9cf9f58c0b0e8f681923b4223a3cdd4e1479ec35a72017bba87c0bf4e5fa6f4ee091475a54e296e013a552f16e73a4040375\", \"4c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e891faf9d665bb151ea32d070ad80c7b31483dfb68e75e940e326e177970210d6f819d45740b1e9d6e416a8a4978331345395bf058ef0b936b66c7755017d83c65\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902036721bed1287c33bbbb92e89e0eff42275c7a5a2e4fa4686175c3983daf57c190e9a7cebd60e38e9b04c0000a28da0c441dbe7221fae3c24e21f16b2174379e68e277c25b451dd9c144a523e056bc810bfc8eb54b8fd639e396a3620b38d5af0fadedfece7bd7eab6d55c7b8bd60dabb9bb508ba6b27f83e49f9ebcec5c0dfbca14072dd23125885a7ff1453f0d3d65b8217d3601f9dcfba2e7539a422f0966923cd0cee2a26c48f42e8558ada699cb0bcaff26d2f1d454b14cf33a6f32c907a47774461fa83a98f8130a8a0c6bc9fadbe2b5133ad348b3888fc20e1f0f8b690f0104501973435a46ed01508777e163e60589fd3dc792c22368311a7689c7860a825cca5edc2f116236d01ebba671b7301f57b2beb55e23ef0a5d0718905adf275234471a04656d9f4ef57a47b944d2b40d3aec62937a9273ebf1af5f887188e927ef492a18a53701e1b6f9d50118c43dddb6dd1bb36ae0bfa37d78766eee5ae0831ea5127c280aefa7bf984ce6797f7551ee29cd9b8b26ffad110d12b05fa3b0669a0d5fa19d7c1a775866d7c34f8b869e67c93a6795278b567b5ab2978563793623f81e1eb778c2d0bb2003d28db84870dc76d8507ea4fc3a7ea58661c0e2bcafad3590b3a4e4eb058bd0a92c4f0a8c833b8aeae47f35d70989862b3520eaf6c0833bcbe320489d55529826d1689c940b615a605094fa67ff28870a83ec26a867ff06cafd4ebbc975\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936188aba67a59ab5982a35b0b88af28c395ee73611f1233e5ccb71bc1279e708bb0315d5fffb9cd0a0ee84b5f33e057fa02d78cd067c105b2c4520fb43cbb3cdd0d30287fa60720c35e6546eaa391bbb3975ba5e1722a6124c426d678e7f784bd9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/696eb3cf37f866313a3dbf40b4af77d45f827d98",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709e0000000047e9de70bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf36000000000931f20a02e0517500000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc22fbf46\", \"prevouts\": [\"e25a0f000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\", \"c8216800000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cc4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93688e21e0ba4623d9f1238b4cab1fe6058b8adee7f586c209e41396c5ed78664fb1e80b1f8b709fd7e9f8915460d72d278aa0d12452680dedc295e1cc62d069d9c5f8b38696f7f521c781f821b55aa4ff86c04fbebd102ad129a9d47907becd36b4e19d3b2ec28c8925d54c04f383936b915813fb16b738060565344c47074fe42\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52cc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045e4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0d00ae7d77688765097c61dd6dc7203a99b1de19633b0fe895af4a245d0fe1ab9735478fd9f7e773d9cefb2e6c2d4f28929a19e0115b3c92e29fd8719e7d86d1ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/69763ca3d19be4c3d360ac96f990730c211450f4",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700302000000ab56471b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41201000000d13155dc035cd64100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acdd5eaf2b\", \"prevouts\": [\"b4e90f0000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\", \"38243400000000002251207c84ae2d9063cc63412a30e00823aa01b05bc54bcf6d9936dc1c650bbdc9e98b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"spendpath/padshortcontrol\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"96edcf3d2ff03e75e15cb688a69a9145f917f18fc1907d79b682e3c5ae27ae90b87ff58a7f5fc74786825a9291da4f3f5615625de8f4fc43ca6766bab2c724ae\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"96edcf3d2ff03e75e15cb688a69a9145f917f18fc1907d79b682e3c5ae27ae90b87ff58a7f5fc74786825a9291da4f3f5615625de8f4fc43ca6766bab2c724ae\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2030a5a7f3bb1d8a36740590\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6977dc4cb03457ddcfe3fb5e4ebd32c7a60a4f4e",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e900000000852477de60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704301000000434e8635dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bab01000000ef552e5e0380634000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875e020000\", \"prevouts\": [\"f4eb1000000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\", \"4b251000000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\", \"e5f4200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_a6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6dc81c0e415de7c9f522a5abcae782ff177bd07390420ae7339bb131c7d0d5cf172296cc98dc31023c5dc0ae8da07aec290eb7c6a91aa8539187d44339d473dc\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4b9fb81f9867a1b174e1b429a8aea705300f841a00c070da618ad4dafb7c24e280ce9d7e7b9213b692adf7276aba4acd804c8adad309cceae38da850ec1eb62fa6\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/697a7f07151aad714b88aad13a439841eb1d849b",
    "content": "{\"tx\": \"66a8b84102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf440100000027cdb0cb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a301000000fbab0fe603154c8c000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc74dc3dd23\", \"prevouts\": [\"ff977d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8a63100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ed\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"82300fbea4eef67691c08244338531c3737a190699728b50381ca4992578a33ca38b3c3450038a813eee1c168a6bbd57e9228f9f672dec6dc57bd843dea76fbf02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"17d393fee9a3b7b3979e0e603de2353d10d9bcff79830d9b76d117cb93629dd7dba32261c6c6933ad072df9d347532d13d7ca5d88ecff20037169053cbb4eabeed\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/69c1c268224ffcce5d6dc13b49962a3c8887c2ba",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bce01000000e9160568dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7d000000004acaea1b0404d97d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374873d020000\", \"prevouts\": [\"7f13270000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"37b0580000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_4d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6342099a527d5a2f27f6c97be59bbba6bbe68b385e8beede02041a57fdea60eab00aa1b932374a0c44ba09eeb42d3524be87050645f97ac42cb1965fbfa829f401\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"400b05938759609eba837076dc410cff019d984f61113e8dd2168b99ece14ca63316079a60765466cc00cef56d29a59088b9d1c1cc078b1fa649ee01fca03b9c4d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/69d24f5639ca8a5eaf58924722cc313b9936c330",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127095000000005c767951dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8e010000004a51eaed04d34b570000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc73b010000\", \"prevouts\": [\"4f500e00000000002251207642517ca6719fb19e4d50e91940e680bbab7ca2eac6cb77783eaa45a9fa38f3\", \"342c4b0000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936761301ea059e5d2efb2c92912ea7774ef29449812e7d265e858b6fd1c0b51434\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a9b616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/69f36a1e1c567e1d5e44edc58c355abb92e23f68",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b14000000005d6cd1b660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bd01000000cedba4cd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700102000000d9229fe1044be13e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c7040000\", \"prevouts\": [\"a80a1f00000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"1e3d120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"67ba0f0000000000225120fa0c69fd3dab50066606d386e9137466ea422a077bab3cf3dc61d0cdd59f488d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063d768\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936abfe64118223b3c7ae9aa80074b53dd2a4e83d9249918438f788702c58e4386314746b6cdbbdbe747c087a2d99e7432ddfa1db1d7a6445e7dea3810e7475536557a61376c510bdd1fc860151a3b261939fa407ec1a2d0490cf2efc4278abc783\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f3613db4328df8356bb49396f684a07533c02af693a1f1370e1c4eec8af8b548908709641cf32dc4788f906f7e3621a0528df09509ddf1e9982e4479aa4b5d9a2d50ee9aa3de1fe988255b0d8b9f34dc2cecc4a96432b9f704e90359a06b468476e3192190387ccfa53649887be3b08a6a0e7169a64b02c3bbfb054cf523373b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6a35130e1e9674f6d1c241fd478fe85332fbdbb1",
    "content": "{\"tx\": \"f566a34e02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbb0100000061ba5eab60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702c00000000845ff5f404e063680000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478735000000\", \"prevouts\": [\"da89580000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5ee4120000000000225120770a4859be8fbe7a841bd8e66a93f9515817dcc93bcbf3e365174d34bc6304a6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_cd\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b7754e9094c652ebeda837bfa63d050337f67969fec6b0da1adcbb1d6189cacea5759a0b3bf1d641a9d344704c15dfc8d65e7303d48e2a2fb902e5f569c9144982\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"addedeecbf0a5978da663bb1e37be31f6a4b8c7cf48769fe49d2d8afc3194bd98b2616497deacbe55bb1d7c426829a3d1da1629ccd03e5f9e01c4b89a5143324cd\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6a37620db708370995281cf6c46512cd60efeda8",
    "content": "{\"tx\": \"d2a4b633018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c80100000073d678ff03878d34000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acc9889e3c\", \"prevouts\": [\"be89360000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ae3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d2593bff1b0effa885b0aee87a7b2d32e61d34e0a8c26ab8da95f21cdf0740a021a06fc3128a9eadf7c181b12783fc0ac677434699a36c8776c14fb861b85f3ba54f7803bb2e93759f587214c70a485617458826e57c89c2ab5c5e7ce47181a1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dabe61c7346d5e238de070e35e4de194798ce817dea2f205b09d5c015998f3d54e3e51653db7a26891b04c3a1156361c2ac14b53ddf2b0df0fb784e58b5ceef674166a9b0f1c55c1671126e5eb7d3b70cf827ee1dc762db7ef6404d6cf84ba0da54f7803bb2e93759f587214c70a485617458826e57c89c2ab5c5e7ce47181a1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6a8e8effd233033afabfdaf9d971d772b2bf9ecd",
    "content": "{\"tx\": \"b1bb4f9803dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2400000000817a20b660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127002000000008e1dc3c4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2e01000000783f4ee701e06a59000000000017a914719f78084af863e000acd618ba76df9797223689870f010000\", \"prevouts\": [\"90cc23000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"7ab50f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"546d5600000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_2b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"38ed76305929f02dc349485a61c09a6c830e24769200d31626eb387aa97068874ae3508ac14ff04b57c3a47bfc82fda6e627e3598fb139a1d7431e904158202301\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e3bfb102a8ae4aa8b7cf028538d64a4e507655f0c6543d9708b6da907b5a3a528fd8709be59d04619725fd0c1df9c3e698925a6c20c4adf2593fcbb7ee21f36c2a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6abb0ece7e16ec849987f8c8acf3aee7013ec5de",
    "content": "{\"tx\": \"0ffdd2c802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa301000000e046c88abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3b01000000c75831b90470e1e0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac68aa0452\", \"prevouts\": [\"a79e7f0000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"da1c640000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"473044022019b75a030c13440d0d25d275157e4f1c8eb6c5f583c5720f3b60fb2de123007a02200fcd4f1305bb03ee79a22f7b1a6af61a05dda3a0e59345ce880952bcc0c9aaf5b2\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4730440220619c5c65290ae5bb6210dc7ae9e8b32431a22ab84050373e1248680426cc603b02200929fde99a5101b851dbc6f332917cbf6ea421ba3c54b06ac2e30ac7f4976d13b2\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6addba1d7123769bf9727a6a4106110126f36086",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce3010000003bfe4fc1018631450000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79627030000\", \"prevouts\": [\"3c1f4b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_44\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"306f528964a2f5b7939f9ac242ab90719dce5b19dc0b69ec69ffcdd460fa36cf3edbb5d80f2402319194811e27113309eac01201b1684f8c9716d5301524eea402\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"be99136011f0913eb2dedfba07c610bbcde72af7c9df4f493a6f6fed292467bbc23da1f22a895d343912d9247ee4a88f064fd2a97374d2624d945ed28d89d8f544\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6aff050ffc62f58100aca0e5b1839f097fe65155",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd9000000006f1fc6ecbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6e01000000753656c9038b73c300000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388aca1000000\", \"prevouts\": [\"eb125600000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\", \"6b7f6f00000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"807d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a0a4157aaff13ca2809f2717d1454e35c7fe22b58bbf3d38eb14bb2d8f6dda2c9bb3dc44e72947935649b33aa2d807ea07560e0c2333a7ee2c40c2820b24a64a090cbfbdc5dfcad7ff4463f3cf2898b3c754f5d70a369d7bdece79053e0da647\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e6d3ed6bb397f900bca42f5c55206e9e9a5556fe68666fe0d64ebb28af9dc03c732beddb8df376ed0f15f8ca557ca4fa4dab9ea34398a6bb2b3d4cd5dda00bcea090cbfbdc5dfcad7ff4463f3cf2898b3c754f5d70a369d7bdece79053e0da647\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6aff0519662314531494b8b3319e2768ebd40a35",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f800000000fdb29b5b60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705101000000f4984f1f04d30d4500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787ba000000\", \"prevouts\": [\"a949370000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\", \"4e5a0f0000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"0c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa234cf532d828cda123a8c35eaf5d21c66c96423d9004c9f2b6e0f5ba33bf4e7b5b0de380cf0ebf0fa9d17e1d1edb87a374b64935c1c67f0c5024fcc072643681\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f9edf285c3ff17340269ce4937990b92b11525a7bbe669dfecc4ad5542cd24bf5111e542fd849c49f4d44aada2d8e1aab946c793c1d334242f5a6d1a51a6de2d5b0de380cf0ebf0fa9d17e1d1edb87a374b64935c1c67f0c5024fcc072643681\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6b14353e2b7d7788062623a8ab274c36f8e8bf3b",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca9000000009dff9cf2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8e0000000003edc09f0396a2ae00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df9797223689872927853a\", \"prevouts\": [\"872f5600000000002260202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"759c5a00000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5edb9a0c74e702190efa0d08a6efde6df53a84ca9ddce445816b6240e779519091725c66624cdb8d7186ec31dcef6a5fa4f81e7cc1318d959d333c1a90ae40a1\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6b611309b991acee95b55b4b19539f65ceccf76b",
    "content": "{\"tx\": \"dd3b93eb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4350100000001cd7ca760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703001000000c72c4ce603c01c4200000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787eb283c35\", \"prevouts\": [\"7397340000000000215e1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"621410000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"304402205c8335b25c6f8f036f04b0a7a3e460073f8a36d06701a4eeb13e61cc29bb9a2b0220292e057865f1e7c9fc5119e4fcdaeca77f3158fad6904b64e5a1387beba8fc78b4\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"304402206e61a9131f28e30cc16a2d8792a47fdf81d0c09cc344c63365c212538741123102202757695d5930069c5b70f93e64909d952e881d022a0971eefa759612c252247fb4\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6b861044122a6b081803e3a99f47b40277743d06",
    "content": "{\"tx\": \"7fe69d4d0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706601000000d2634dff8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40401000000a84fafc5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0002000000b17c94b301c64a37000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48713020000\", \"prevouts\": [\"0a4311000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\", \"feaf310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8d227a000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_56\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fa795ffbeaefe29bff34e91ad2ad22149ca65e0bb83013f3009cfc9339fa23bfa8e87879dca8231d707f76cfc9397be931b40354d0c5cadf8486dce72984417081\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"881c091013dd2e1068f9c53039d914e8bf786fcc64fa14604ef8634811a0405ecc42a12197ce6e8143b334ee01309722b6bebb17a3c968498ae23201503ded0156\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6b8790739dcd1f8d3ef41a03c6508717d78feb52",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf270000000002c2377a011b63710000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb077df5e\", \"prevouts\": [\"4e6080000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b2d644bb9e96bc550db818ad4a9f84f3bfb9c250241a6740872b4a4bc563fb4ad98bb198f102a907fd10c5bf2e0e4d2bfc9bb38d19b996f85912f97f03c8ac578a90658a7aad5df2d1c5d455740a8352e3ec45e758de66fe280b4b2a8d141889e9ceeda484a8fbb1974ef5b6bb846e6aa0bee04d9164b21ca42714104493fce64045e2eeb8e4797e4583bc9141ca032f9d244ac5291204277e2c4bc03a0cd8fd7d46c21b60cf0d9ecd056fe6b7c4bea1b0665c0e45ec7cdb1aa4e44798a73095419520db9a346ab675e69b41b219bf0b0918dc85834c39e61149d384a66cdc9685afc92afa4cee53c89aa91bc367fea6b6ecf6075c09b057c0a586321352373d89a8c2c3c1e551f2f979a319eef589d3e031c5b58059bbdb82e6bb79a6bcf7b1a6126fd103eaf833d2b59274603ebcd148187f79a393b4adf3d77634429d7c2ab80767a446cb320c8b5498f66082d597c913a9d3ec74505f51538a20b70d042c82b08f52b3b835e8bf542aac88722f125c1f89c6a8c0f5888169a63ac2dbb5f8171573e7fc73f7b275f130be21323c4d8fb6670d055bc28b50bf6d43b2f4ac2fb9f971aaad6cb51f55587a440aac23699ac35cff9053f452bb53a67268195ce2e21d4484140b8d38907e32b086cba42bab7204cb80d2420f89f310f95bf8ee3f9cf59f3c1ef4e35da197e5232e91ea0e5a67b9bc6ba8c4f039b311f6dcee13956dfb948604b13f051975\", \"027d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08244c267ebca37631eb8e8b6e08a101702978fd7f172e21a8d6d6b527626f4402168cf2d3d0be95621d7446294d89d9a2894510d2dfb4e1a33e7316a17e39cfc99\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f9e1cbaf4725ee2c8f729e48cc0aec6866934bc3ea610b2c6a629b109cdf36811fca45561939289d34ebccaf6a88180973115ce8705913ae2086b84370bb0b9d2806ecd0ac6731ef8e77383cc12a75173b1f985c86e562915b39ad04fb20874f1046f2a4b16114423ecd26baa954cbba65c8f4d034e0aef9172f5c06e3ee6ec6d80ca1fbd68ae166d4a1aea8842b72adb03e5a414b4c521a460d7dc0a6eca458f6f1d3fd945687d8178de82d4012138def9bc93a2682a9c610d13d3d47718cc728c010ba1728a8763eb82ffefab35e6ad06b5ad874022b1dce383c61389ebd626ed74ff33bf8e49ea6f348e74f81d38c83d2dffb85d92d0d0c8ef6337491067f3cd9cfaee2b39b1d972f9998f34bc2bc5cfda7083b039c5047cfb560574c4393ef6a915ead6b7254cd5c6853bfb6b3d331c23b64a774758d535f401e66ef078876d20fb7e3d032cc84daf0a4ec0b463f366d6665925b20765ce5dc18f4e2dd8b008fe240195687dce13b07ee3f9c7f7ff6176cc6ef9a5c716ac35e610629ea0c9cfbf9b17d395be58887af2f68859723b0623f1911c9ceaf788efa7c4c1040ab94ee97f388bc5e18fa505b6e65c7fb2590f4828b331028f1680e20356636c6a69bd048eefbc04cd4a1e26242e280626565c5fe2dc6c5ff2d65783a12234e941b6f5cf0518500daf13ad9742de619cfbc5f5ca745e3fc1c5e9ea5af49a54e58208ebe6bb081f095363f75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eea584dae4332b3044a4c8d351fbda1a9ce22b0be13f72ff111d82ccfa4c6759e0e32049d91f42cbcb04955cd98e985d287b85d3c77c1154d8406ae5e2d81b7b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6ba407f0a422507bed18c1d5b52f1f550c278fcb",
    "content": "{\"tx\": \"9b03967e038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40201000000116593bcdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c30000000008140a59460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bc010000003f8a038f03ce439b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a61f020000\", \"prevouts\": [\"fa123a000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\", \"d8a45300000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"95390f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_4c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"86ce071bf60dc606020d2b39afd8cc4ef834eacd817eba063a1fcbd579e2a6d88968cc7292a81c746ed58b21bc7014940f83da3b3c243703ba69b93864e4072802\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"85cb2c73dd46ae83844964ba8c6f7c039a81439e6e2c9d651d6ba8964d1305a9620c12012ea9fc6d62e638b0b7497e68ab5d7db547b5f548b098859a63e3d1a14c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6bc93c9d2144506aeb9dbbe41a5b4a095f8fe9cb",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf201000000ce5eda9bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2f010000005618a396bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0701000000427c408b01084841000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487d4145d56\", \"prevouts\": [\"24fb4c0000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\", \"4f8a7600000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"3763820000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb41ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045f693e8696ee404d8be98a67cec2febef1e0f75b013501a27963a3fb4300a4da26e171838972c3c3a6cdacf031a4825f83b841697bfdf19ec3d087e2c9ca65f0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360f6c1019362bec2bf08a39208cd8ab9e5ec501f845acab16bbbd93a90644444aa6ec201a93e79c82aebcb32c5742cba4049490cef67cba707365d2e1379631f73bd198ccbfa9c702c0592bb8c84a948c36ef9eddfd1aec8278a333dab45811656e171838972c3c3a6cdacf031a4825f83b841697bfdf19ec3d087e2c9ca65f0b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6bde125fedeb05208eb8991bab6ad0713a60d9e4",
    "content": "{\"tx\": \"0d8311b402bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd701000000fe04979960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700a00000000da955a9d01905b3a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a636020000\", \"prevouts\": [\"df00720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"73d312000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_a8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fc26ccb95093c1f4d7d5f63bcca121f2d079547ae6cf70d8b73908c4c50796e6393470992ee7048db8d856a94f0699d2396119f30de7021675c12148b1dc6b3602\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"49e53212930b1a04c55cb7b2da7b7410798ee22339e97d608a425f035a77c6daaa2da896e48892c11530a044939863c86635a89c5c479cd41b6830d9b103cfd7a8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6be0d8042ea3f474de849bc8205c65b017a3d587",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127080010000003832b55860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f600000000395e212301b0d0000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79609c18144\", \"prevouts\": [\"126f1200000000002360212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"1cc50e00000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"997d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b19b5f1885a20d35a814ca61d4ff855898dc4931a7face6e73cd2cb9656d66dde3e7df71444e7cc76d8e211582e4acb0f4a71a503115fbd605db9d475b3b0609413afa0de0ff2ef52577d4c80443f6003c675907986908c28bc93ded208ca160\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363b008e11d5a212ab8cf1e35e075d499c0a83e06f0fb3690023328021119d686440197dfa5e15d56b0c52ba6c1e960d9371338186786a853de15f9da987536b6f0e580b14ffff5bbee812c9f6e3af6b100c6b4cffaf41971c257964f1fb14f6f9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6c1bef32f6ca0cfaee1705746902336e4fd67e96",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47a010000004febb4ce8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45701000000ef83efd203d03a6d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac6e000000\", \"prevouts\": [\"a714330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"28593c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_7e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"18e4979551e7e9dea17ee3a1af3a495cd8b6825bfa50e3189214e8a4c313567aa87267c54a59b9f2a9e77b01de73e083160d0144cdd660f8907f8d922536ba1382\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"811439e6d09bc5d45950c0d14c811531f11006434039013de4c863a5d779f410116286832902192e14cb7afd307f8e73d4d9f5d52058e52b38de6c8c6709cdbd7e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6c3db2c6ab0b6b80838387b923869561f9e1cf11",
    "content": "{\"tx\": \"5cfa37d7028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a301000000ee493d81dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7d010000000e4618c40212f89a0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcac3bac60\", \"prevouts\": [\"b6d9410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"dde95b0000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"da\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93647616881cc706df192d68bdb7ce4fefac112c6e83b2fc7e7a0b73ea4516ce84599aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb41dc38fa67d6e370c9f405c2af01822f370dc317d6e78d2f71aa14f0ce4de56d6ee4d75780d36bffae9b56136e6d27c02b8d233efdc800bb260bfbba6a6f94b87\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e116c8ab92abfbe4bc2686b5b42764123e12e1b7fae7b64d8b1bf7005c7df7fa0a3ad7647dae649c97c815eebecc244cfd5d14ac6da92e0e18049c71625e2af9496ad20bb4e3465af36c086d3f45ee510bb6828f8cbf764ea9958c57f38670043d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6c7e6cdda9913347f0ba8eed8f914941cec5b2c1",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6701000000a473d9cfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cda0000000076ecb2df043144cd0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7edb0fd40\", \"prevouts\": [\"2b0574000000000017a9146f2d26adc5ad58653becfc45ce03a0b1167b1b7e87\", \"56ed5a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"225f202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"385484846fa19f210d3cbc3ad01284046f449d4536f52d57b6ca832e6f1422fc1317b9ccf2d8431150be3ed07f786824360850b023600447926a67b46da42918\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6c8a1b2ea553e6dfa5f653afeeb135465732aa6e",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ce000000004bd0f99e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270610000000097c65b8d01828a39000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47877a0b633c\", \"prevouts\": [\"06f4350000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"30571100000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063c968\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360d781d2df2a0bcb6c98ddf188a5de84fa915a80c53246c09cb7161fa1ccd707e89fc6d70c1c4e15dab7d2fdd5db26cf688ca78f103ab970182d2c6706fc8281bcc9238bf2d7dc0bcf11838c34785251ea2fa5f3bb034bc98e2e8efb0909b7dbc17d2416a1ef9313076e185902c26d9ae3ba1c967c4fe3d78707cdcee712bc7b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b91f1c16b63f67fc716dcb8fb6def1d88e508150b21ac27e49c0548d78f0224d3bd2bf476d5c79b80d1dc385df1320868058b4af6871225604d123c25805c1374cc0fc2e3b1a564cf058e89401e888e3d8222f635de2bcbc595bfcbb872403dfb24737b64a51a2c518aa096a7a1ea5ca18eed83cdd20aa73c19d83535c466892\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6c8acc451d0c73e74ad6918585d0c8776498affd",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c81010000006dbe9804bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6101000000606c4766027ae7c2000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487afaba04e\", \"prevouts\": [\"7ea54c0000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\", \"8668780000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"a37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2f8f33b00019c5a92b78a4d0765b6724114f5676deb8014962e3b41b4c6baea3fd3695492b964dfcc45d3a474d456ab4db8430bda5885b2eccf08499e11263dad2054b94cb6efba565738f5dbf6ee5a67458962b65d77e1cf5e0d2c1c00b2210\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e1bbd263bb9b57787cc1695f6735ee6aa4874511c0d77def079ec8f767826a474cae923b25d556389dd5dd645f6d7ddd89a07a74a73dddd3d85d7b65ae33798aa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6ca4ca112dc6f3b82a4ee1dcb539f5412b61802e",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2f00000000f8ba7bed047a426f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac7a010000\", \"prevouts\": [\"0700720000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"777d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368847b894970b8ab4b6874deecd5eaf7148b7f894b2a434601f88998036d2a73ada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ed76a514a469a046f8a639d1762af89c30ccdce4827317950871fa39f73bf898af03474d1f6825ec143575bd2e16c5d5a5b633189d07c1a3af4de94c30aa06021\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936449975fa8a41d909b43ff06fbaa008862a465221f52e8be68d48e129639049c7afeb4bd46271bdc4aa2a06eff134ee0adb3f92d28971d2f43ac771ecfb2750b1f03474d1f6825ec143575bd2e16c5d5a5b633189d07c1a3af4de94c30aa06021\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6ca7072324326a43f42b641dd4cc2d785bfbb7d6",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfa0000000056f07197bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2e00000000e97e04addceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2e010000004e146fe30155a353000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6ed721a49\", \"prevouts\": [\"41e1250000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\", \"b7c76800000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\", \"603822000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"eb7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936627b63f045b77224e514acc1eb365b6e9afedea5819941d6cc405fd56980362633479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a9e937f21fcad1bfe108fe60be9a324a720a35d98355df5fe53ca48d5593a6c6b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e7d8de85c21b0b3fb0a3c0b5a47bf8fb76656439613f0da43488fdbdb40ca82a29e937f21fcad1bfe108fe60be9a324a720a35d98355df5fe53ca48d5593a6c6b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6cbefe4b22649c02c818e52d3142c768ae99b9eb",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b08000000005eac31d2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5f00000000e9c12dda030e24a300000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487c5010000\", \"prevouts\": [\"bb4c220000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5a55830000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_89\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"acc27a423aba2a823e9fe2d1bdc4b8059cf4b1619195bdec2e4b544b8646a7f2f3126c4b8994bbf829a1fbbd635b2761f52142e8de89328df43b0a0049119fce\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6be9a01f6cd066f5dd0d9ee1fb98474b62b1651e4f1c3df92e1fa8578cb38fa3add2b597c806f0d122128acf5f654be0d138beffee28bcf7ca4972046836a8ad89\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6cdb87bebca9057c621affd2eddfbe726630b1c6",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf7010000007a32a641bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff50000000030c813b30337aecb00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7aa000000\", \"prevouts\": [\"f054530000000000225120396e1e3d37873693c049a0e141d36811f0051f76fd306cc6c1f2259368cdf0eb\", \"d4857a000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"267d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ed3613095503852f968cf254efcb9d0b7a7155094671c0665bdc16a67bf9a23af91e402d116972020cc4db8f7e1431e7a7416668817d422dd270400f40dd8d238\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361cf75455252e12219cb13ff880bc28451a916c621a385ef21679c99f872f6341f7219e5458c3fd087680f56af7e0cb5a098c29a419645486255ebba5b453a7aacd4c02f64c49cc162ff9325daec6263c98ea78a2c5346e44c6d55d79722c7edb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6ceffd0098b1fadf6f95341e39b6b1486b6e2dab",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43a01000000450efd63dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc600000000a8e0fb6603d47d8500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac08030000\", \"prevouts\": [\"3c3f35000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"79ec520000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bc4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08220e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e14a8563068286881d42b1c4901d93a483973910fd5653bf7ebbf040741f7cd837150e68e664a4d5c991e5183d0e7966d99b6c66da3079bb04bea44808922b61bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366e4bbdeda5d79348f03632b8a5af46cbe5e2e7d60e47397790df9d5358fbd9e8d5154a115ce154f943bf3cf8f46c74cde664956f57cd29b00bedec3f53c1a73157ff193055e5853205a1117b7666344cdb66562f15b4d40280f3656784bf5cd3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6d1ad01f9d4765e28554608aaaaf7f86d7fee48a",
    "content": "{\"tx\": \"de79ea5102dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1b0100000001706ee4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6e0000000064da1f9602df27bd000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d8020000\", \"prevouts\": [\"a8084d00000000002251209c5a589e416b2bf8d886ac38373c12ee12085629030d3f34ed2b7cf34700cf85\", \"b2d1710000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"107d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936acc696796e153717ed5a6a385f9de8b7611279c250cec566122acf9b81ca854846c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fada7506a3091a1e28dfc5b9aac4646748f840add9c91a317c4120c5f1dff96d2e4520b5ceb13d27db1b37ec8ee9ee9482aafd08fc62c5401b1fb7c7b4ff374c3d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93630300b02e92706ec4fd7f3b61fec60afc7cf4f75cde7fe0ccf1bedc3ed3184dadad4d220d15ec254ba214a445cc73922794d5f92559e27b8850a422e98de131f09630471a62c8657382c38b342878f0042beb3ba209e0ca1417f9db2e3d45f6dbd940ade039b405c8439b762bfbc73f9441ef227e6f687b6d94ebcbac32155c7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6d2c53b612c9e3931c251808123e215918c34b60",
    "content": "{\"tx\": \"8d072cdd028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c408020000006c4d0c91dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be800000000b35dfbaf0267815900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6e14cf126\", \"prevouts\": [\"7b9236000000000022512085b1b5643880360a93ad399dd8d1aa945ccf0115d9a41dc926feca691d280be1\", \"8981250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_2e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f532f377f686cf38784a48d4b1af3f0c1b47e4764fd9c037519daa4fd3774a67d301e8315621eb9f1cd9883b764223700b5c6c9f5e4a95e152b2de2f4005e46d03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d4cf78493dad4d8866c65df8e600155a4847578ac9c82896c6527a6d6ffcfc326dddabef9fa2466bda9cb0fc4c4951fc5a4795e872a7049530987652080206b92e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6d6cb592531f25b7c0a1a607342e2c3dcf35ac1f",
    "content": "{\"tx\": \"035d7f1e018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c481000000004e33ec9a02352a320000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748754075456\", \"prevouts\": [\"470535000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"bd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8357b0da8b61d649cedb8c014d8a901c8639aee676049f740bf8079132edd04aed797dd6acf95c24b81e793c9c81b0ab80d381fe8deb935e4a90684c96acd4587\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365510f71f915f218e0cfe3f7c324e3aee59ad2c2f3157a77c6e7c2eb6b867ca43ad1c924a2744de25921620091a34db181a435ddb56a0dc8d3bb0ce452693f5f97353a90cd56d8edfa9d59a5341a6c829ef2ec5b70cfecd5055b0e6c18dd5375841cfbdca9cced9a9297ecbc29dffc929789a1848311039b5a24b338cddf0aa70\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6d776b8dcea06b627feb06e8e07e6455f48086d2",
    "content": "{\"tx\": \"2164258c0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c801000000643e6ce4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1b010000002e5c44cd0201878c000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65633f05d\", \"prevouts\": [\"e17b11000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\", \"ecc07d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_bb\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b223293d4e5c89ee8e58073747bae998861fc142a465a072b4dbbe72be87b842d5706b47ad6c744b1d615a6e4d977b18f9a8e8084b0a22891475eaf6a44fbc0703\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"05472656d9355b8e4e91a9f33d9d5b2ff57ab40f5629f1ace63fe30d46f9613bbf9b920597dd711bc1b8b615ce8f4c19d79f4b4e7c5e9282023b737468936f63bb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6d807824d43b2e677fee210fcdda1e52cabbbbc5",
    "content": "{\"tx\": \"f66b5ce4038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c465000000005be9d6eedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc300000000394663ffdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c08020000000e1b4af6047d16af000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a62067231f\", \"prevouts\": [\"3e80410000000000225120783dfb3310d474c767ef9239befe26bff1665135289516e5417abb1737338f98\", \"172323000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"8d5d4c000000000017a9141757f4686f091b43a46fa47e92d07c87fc7a205e87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fc4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900458771b6e792b25070418091d57f3336a76b43209d1f0f67eabea9d94d6d252d60aceb16be1ebf4fc69deaf064fc7bf5d7ff2149818b5ba4c28c799d30ad567cc959b5d8c486a0b4fb1c0695d0398f92463f78d98cf4d122171b1dc85f0cff66bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a2d931e3ff2386eb1ce0fcf605e183edabdccf2d0088e28537def66ac2ff1ddb690da805934f4f93e9c0efd4d4edfea04743fe60c173721d1481257c7ee1801e4e0df2464f99a35d5bc9fbf69ae3045675e957332f77327dfd622124d00cb4df\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6d874714ddd3706018c9051c55abbcf1210b4643",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f20100000037a88ef660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701a02000000b0c706bd0158741900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac4f8a5b2c\", \"prevouts\": [\"00a53b0000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\", \"ac790e0000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_mis_3\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5ab8d870a6ff8eb16d81d15eb5b54c0f8833047e31fd03d61249b6002ded1c6e26f82cafb87703e0b309cfccff06b45a8d457a3ca8af72c6aa5ead5bff906019\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"5029eec7b1423a63e23d005879d82fb235f46a5d11005cd1b9809ce32666a3cd8f16083df6ab04d1f4f22bc8bc2a6be49238f1e17914f9ed5bc73052d59e54a463bebcc9f176dffbde06285b4bcff4ab025da5e25306f317c23259a59a6294af215beaa7b7e03c1b3d9e5dd0309c706d78ebcdfcce9bcd7708b6186dbf94069584fb0f0eddb37ec06b8337a79c2c18b703b2b6e1d36b1791181821475a68ec47f137298db6ef9101128cc42bbd3ed09b83cd5d46611d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ee71a984c12de547232246ddd7eccd6d50c28419b99e7c3cb06c85418bae53d349c58a59d1e70382989d25fd9aa83cf05f0dc37330ff5c4a6ce0e9ba1f18c08b03\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50dd340beb9458b6ef\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6d9b8efdf33eb396820e03892263d3b784e5dcf5",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708f010000007d6193fc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f6010000004a71e3b960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705c01000000093cd1cd02363e64000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87f047c423\", \"prevouts\": [\"df2c110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4a5e4300000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"818712000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09028fa34082c6b789795b8deb89ca5ed1b94eddc15c8ea94b56ef410571d37bff430fa8860257386bae16349634a008631000dd487604a66e5656c2c41b7955e2a086762f8906ec9265bc2713a062be9c7697e5af1532d38b1b6e01f767e6e96753fabf7bdac9e9fde9936ebce7f36e7ef1fd3029a307a75841e994b0f5ee710c2c7f0ae0eaff558933778923dba086f975a51eaa1042b24d36506104a4078f48bfed9d162891c0efa93568557022954e612e338db4e1a630557ed83e73c47e48d392fd13a97f8b490bc5901567cceea222543468cb8c76b0ca318255bcf3c7f060839bddcdb5b3aa3f3893be19978c82235b6c8ca7f1de746767f9910d8b1c1d2d659ab71ef4cd12c91168c35b0d8c90ff63bed28de375c13dc7ce0f1afb16827cd2ce91e5532a7bc624ae20289bfdc4ff980e7beed16f48aca1c25d83f9c39722b52de8884c4bacec4eb55e39a604beca0f0d474329855d86205059148b62d579b8380b486f03945040fca8bc09c77101bbe86f2ffe6f64c2e14ffbe6731eadf0e9db0229e0077e11684ddb7eb5e67498a3f960b39f3070ad3b836b8aa4e753cda98df48f327ce58125b8c3db4652c66123f4b1bdd47f13ce7427b4b9c9d9945c398a5a01e80f1aad4d1cab8971c56da6a75f7b82ff83843f14f38b9af68b1f38a1099f547b2375ce0012ee641b00431d669c42732e7e1010f17298d959dabf0c85c974c421751278307598\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5120e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1390e5640971602922d6b073671c4e08980ecd1f17d1da07e150f68606efdd1f96e2c0067d6235544c969c57bb6383bc4dfe8083fe3443e336f29d85bd1c9f087\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09020743d42a1c01f9d4b54773974aaffa2d1558c919ba6cdf39f5d17d1238d38b3112695b7b591710697c545a33a8f2b4807e2ec6b33a0bb35016364746ca079c008fc53d76a811fb03264da5f64ad4cc76a1422b8a6709b8cab05c279d38e66d7a66dffd6817214024a4bce70b5a73769dc8696c4adef71ccdcd6f9bcb4d371b62bf536ab973b153bb28daf0671675bd5541521833c3ea45b90220709d465d1fe68d95de672233958d176d0dcd4349906365434128537b559cf6269c85ecbc35e566b56a6fa101026ecd6d13a4f60972fe32673689bcfab9ed9e8bb86e419635d0afc50ee1ebea23280194d4ab2afd278e095c38175d2dd6725252f6b92bee7980719e6549df0e8494227f11c867356cc6295ac34b69810099e5b363b880f94ccdb5168660ddf2bce902efcaea5f0b5b3cd0e54cbbe879e33e6ff9d886c501e4fe73e2fffe674f6aaad26c7f04ab0ad7c11c31991ed3e785e85648ce5337cd7cd0f1d97f8c256689f24539f179281d7223e905b583e1c1d7c7b2fa4599a2a71035b634b4851e77042bb7b9b328f900d1b504755cc24696ac48ec93ddcebfd7a12088d3b05415db04abe45b37ef0a3b5315b3c9ddc3bcee0c845477867b7bcfc324fffcdec539ebe00a503e0f9122f7c9fd09fa0c580abe703f28a698d6779f5bbc0bc1493cf70adc1c534fbe55f8762e25552ae7c70b971754ae7763fa1d33a2636cc38033faf0c5a99b7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364da7e9c765d4069add7c566222dcc2fa8795999e4c66c2e0659e8e7b5c350f927bb22a9d6ce3a4416076bcdc0e15ff24e2eba93ece471e96a0af39f5a01dd3ec6e2c0067d6235544c969c57bb6383bc4dfe8083fe3443e336f29d85bd1c9f087\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6de00eee762e4ed839eb40fe1f0e25de0071e584",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ee0000000050e3528e025ff735000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a63d010000\", \"prevouts\": [\"b7b7370000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_15\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1306a7911f8b30043267498bfba57f3bafde8a6ab4cef1af462e1d5dfb2794af72c44c02b05f4f99485705cfad4f2ee2ae8be777f80917f85e5ce590c0e303f002\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"aedf3d834fc929d88abfb96482de1f78f2f4450f25517ac2b0296ecaf2772138db486f2ea5e693b3bd3926a1e1018921c0980ed49c1394b332431448b2e4136115\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6e0058983c03e5e6a363e64deb28a252b20617c1",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127085000000006a1e55d2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd30100000063e1818f049b9e8f00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478706bd7426\", \"prevouts\": [\"4a4a0e0000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\", \"868a830000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"c6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb468405cb22a39b2e10cd1afb6cf33a44daad2098e05cd2010bbeaa225bcf768d84cef708a58e9a16c040ddf6ca6eff300c7bff2a5c928617bb01c850b0a79e89f728ffffb27e62918c729ff5ffa8fa6bd185df3cc350f3591557de0b18c4f64cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b9d6e3f5d9915a7f17d348d09ea3f9ebd96660129a97625007e31c70764ffd301ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900456a39aac74ee3f63949b9c215c515b0db1b113f4639b3fb19cd99ba22ff01310c728ffffb27e62918c729ff5ffa8fa6bd185df3cc350f3591557de0b18c4f64cb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6e20107c698b7f36b9163a7db7382e068caca218",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd101000000f3f4ecba01f6b73500000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acec000000\", \"prevouts\": [\"7f71600000000000225120e17cb865e0c0755340e16ca2f2e2945dbce4ced3da83dcb29c6dddb7ec4631cd\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936aee516190bb66aca76b48f5e931006083b84d9812f39b791c31f97fb29b3271d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a22616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6e41239fdb2bae4970f0a9787e683e94dcfb1760",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2401000000b40d39bf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c00100000020db294d014c696800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2e5e9e56\", \"prevouts\": [\"faea5c0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"118d330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_csv\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8c3bf2f418eac8321ca5a10f3517be596df988d9e7a89dbdf658d38fb16eda1678109f53f9b36d5bac53e35b5d115ecaf5213cdac29f9c322e9dc2162360c839\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bdd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a37f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8c3bf2f418eac8321ca5a10f3517be596df988d9e7a89dbdf658d38fb16eda1678109f53f9b36d5bac53e35b5d115ecaf5213cdac29f9c322e9dc2162360c8\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bdd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a37f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6e59dc43f59b064311d89a689dd58f9a905d10e3",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41e00000000689473618bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e500000000333fa0f201c56120000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d2000000\", \"prevouts\": [\"c2e73700000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\", \"5e323600000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"dc4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c9da215fb1c7a7d8158d804bf09a7228ca7acab75bba3128cb1f7201ab6c755a6950266b78c1c1a06b0abf9d183417cba91a47bb46abdc469d8aa6f91cbf6a3fa39f866618102a4b08e1c83cadbbeb41bf3ed62f238c8432fccdf019ac45545bfaeb7b84c883e27227adf79edca80c57b026715ff0da0f52c5e2d2aa306e3b89\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52dc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369df4b46da53b8939729e9a07a7e7594fd498eddc254844cb75d19f3809a7ad1b8f84e1cc8430872045fc695723e7e8ea88aa60745b893850b41017408051d8396d96bf27adab25b1c800ec6de9073e8fa8f2a3b567072b632cff39ce61bb3673\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6e85ec4ec7f9980d8de6d6892d1415072155eb5f",
    "content": "{\"tx\": \"af047eec0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708d0100000035cba8a8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0500000000056a088502900d7b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fca77d2341\", \"prevouts\": [\"67e6110000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\", \"63c76b00000000002354212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"6b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e8a2960a95becb1bbbe0636e0493c58f712af9b8da417013d797bf12c130ac56070886d9e3726a9aa8a2b94454683b5181a970edd894e0d0cd75aad09f75436b2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e85c9148ab8fb2f0e3b60c30486bc2998c5a9fcff153a4260746061263c245b36a70886d9e3726a9aa8a2b94454683b5181a970edd894e0d0cd75aad09f75436b2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6e99af85369d8643f1c91d6e46c038af402d368c",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcb01000000cbb48829046916610000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a688000000\", \"prevouts\": [\"24016400000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"737d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9facefa89993a6c83e98df45cdbdc82d28bd33af2548fc79063bffdaaeafd2a52fabe4f7cbc7087a9eecd21f8f9de83a71ce09520dfa28ecbf12e6edbc22e0d0c39a8cadcf9bcd23f9249fd09eb8b2b9ca63044a0ccef58f4cae9402f6ead4c2071\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93613adde228e33b56d36b730183a3076a84484135166bc954854de5c480ca0e58dcefa89993a6c83e98df45cdbdc82d28bd33af2548fc79063bffdaaeafd2a52fabe4f7cbc7087a9eecd21f8f9de83a71ce09520dfa28ecbf12e6edbc22e0d0c39a8cadcf9bcd23f9249fd09eb8b2b9ca63044a0ccef58f4cae9402f6ead4c2071\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6eb985be69c6686dbcfaa0cfeba04cbc68dd5298",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270780100000092a442168bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40500000000ac1f958adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2b000000009c4898ea02e6d16d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875a481120\", \"prevouts\": [\"2b3f120000000000225120c10f9a5287d6d37684b1ac107332d66417d952fdf60fb9cd3e9fa5de48c339b4\", \"fcef35000000000022512070bce5a25570b494d89a85af7ba09d895150a56587b7f7acec0c02ca42514b39\", \"91f927000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363e1f8250be4afe1bc8d4d0a31bd3742c51e208f85fe088e4f07f552051790fdb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aa9616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6f3e92cd7c0bd1c759a5d1ec589fa593028c2f27",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7c000000006ccee4d5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf550100000006f9c30c016ca90a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac1b9c1b47\", \"prevouts\": [\"66cc700000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9fee7e0000000000225120b5fac7f9d1efa21092b4bbfea1ca41fe5694dd20d67936ab2b478b1ec4aee588\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"da7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a47bed56458bb8201cfe785d9ebbccb6afef9cc99128ad29d757c102b7b9c0a9eb0481d56926b359fa3e2e34471adba51fafc61fa70dea7541795bc082db9408\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366a029025d4987be8973c8fee4cbbf96b701afaf5d6753deff2d6dff0516fae4ce4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a47bed56458bb8201cfe785d9ebbccb6afef9cc99128ad29d757c102b7b9c0a9eb0481d56926b359fa3e2e34471adba51fafc61fa70dea7541795bc082db9408\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6f52449eba2cea1fa19799e7de8f931e69c70cdb",
    "content": "{\"tx\": \"1f1a48c703dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9b00000000fdf160f9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c03010000009968b6f760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270150000000060f62d8a013c37600000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc85000000\", \"prevouts\": [\"5a1a200000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"f39b5b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b0fe12000000000017a914b0b53ba433a336ced94ed75e23248458a1c69fab87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"spendpath/emptywit\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0c52ef46377fa809dbac5ed322d299d79134955de3618b10201d5faebce378c813ff45e1cdb421317e190245c5ea70d3fd0fff89e028c062d128760bd4134490\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b78be31b16966ae882c7ab2969dfe11d69b83e8cde47f805ca2a48764752b9cbbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6f56fca6cc1c01fee921e3ebec30d918b7e84af1",
    "content": "{\"tx\": \"392083b603dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf8010000000320c5cf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704701000000934072f4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8200000000df73f6d504ec96cd0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac1b08b24d\", \"prevouts\": [\"47805900000000002251204e3fb1c88f2893b13c1c33c3a0d0cd819c49ecb88ca3deab379ce318a8955811\", \"1ca9100000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\", \"e5a5650000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"ac7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa30268d77a27dfffd2973b5655548cd241058e748ff39c1f9c0ebcc25f2590463fc485b911b91245b46c320351c8e1d13bb30ee22c3f953d2224593bd4b5088ca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bef2dd3e84f04fd56d20bf9e4a65c47b7f88dfb77d0f893796cf86007758622a30268d77a27dfffd2973b5655548cd241058e748ff39c1f9c0ebcc25f2590463fc485b911b91245b46c320351c8e1d13bb30ee22c3f953d2224593bd4b5088ca\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6f6d754696a56d367c058bd6cef710ac92a36c4d",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704200000000ec50a7c302a98c1000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787bf020000\", \"prevouts\": [\"043e120000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d98400ecd38521c785b85d37fe584d5d3682edaaae69d132e432540ebea68ba98c233b01e9e4730468573eec45eca5240787c123c03c41e786660d09325d057b4693d177569b8d5579a02ab5e075cd178f2a42353c5d571f41250e8a97a85151d0d9c83f966fbfff1e9f396160c66ba7b103d9245ac4e650ba070672b1a1c9b323060322fd5866b88016a7795daaffc3b634631ae76dca8ca14360f9d880d7c3174e4cc5cdea7118af9c25b7083ede26cb71fd8cbabb2a85b68ff2144b480342ecce0f18506a2ed93df165583b9702e9e55c40127db06cdaeebcb16fd49a39dd7688f57f7ec0331ece16655e5cfa452cc5a34e2d99d9acd6aa82b2930cd7c51d8ec8c08c969f35dded2ac5211a07651b1490eca967d0969098662fa62c23faaf7f37560bf1cea161076a69d3ae4f2b50278b5b0671f70a6a7a9f972c768516cab7672be25d8ccaac83d74a410248bb26ae387a9395dda350458e7a1d7aba28007ee2f135f66cef318ca1e84fdabef5dfcbd5c84bd05611d8fbfe43240fc3302e87fb4c62bdfc28fc865b26a09d0a3fe4e160bc71c2ee831e2847ab48330f0dffee804ba74cfc144497a6330119f6f1b52ca2e002b832db99031c384eee4af001ca76171d2684187f381780bf8fbe3949c3e2d087f0875907283ff5ac0e7131009fcf340caff5cdead5d660c6f55336fef40515e6e7a32fc232408392ee1a70b25dbb4e3ac620ab06ae75\", \"1f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a6fb037ff446ebf56375516806af4ae7659446d7a3fc7277956df288e29adb4cec0d930d2ad3e784600f5ffd1efb1e58c37063febb6da2a9c1576d111e3c4564ed661e9ebd30f651fa020177c2a1e4ce51b505c9194e43d6074b392863f250ba\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d023ed8c46eb022249818b381c17252e7b245aea99a2445ad1eb80a93f572ca3611d97071118248afb797fc7946a532c9561d197e8accd84a36d0f8b30767946626bcbdb7440048493c2b2a958ab755577dbb3bb4615e4403d69d13cb5f1f7c851610ece3d8d1e6ff42a08b7a8d74370c1a666a38cd53ca8d31a71cb0216780a4239f6c9ac15f28cc3f16e01e9b786e9ea531b1ac3d301b98231c7862a6564c36fabc82759c25fcf6f0f04cfdfe19010f64689dd60f0088e4b303a8241263ca08c1aa15ea99f2dfeba6afbcde92cd883288a1e7e1383c31f1e955ff4a64b0ad12bb4605f631d0a3bce1d806b84832135d2c267d1556b4737ca21aca1c9c2e93fb6b0d8642f5990ec7f758d7b99c99f1818a49063ee4eb79c09c958a39b6b37a22390ebe395d73ba3105ba1b0c95a7a31aa59a4232e09eb300941668f2a9bd24d48a3d3d1d08ac8f96942a2614e9ee108887abbcd92d2240c18dc863eaa48ad88726ce2b53f897e62c2eb76b62dc90ab22bae5b9cc87a1611ea5dac0118e4ac950b6b95d5d466f58e9b7131fc2058e078143825c2f5ee21d28c14d961c9731105f2123fc3626aabdba6b41aa330e0ed44860f8faf1bf7259f38fbaf97e630edfb8ae6d0367ddb03a735b1647088a4557b04eb406df846f7d6e2cb9b10c38a9e1e8fe4727612f1c56a0230507d879287ca1c00594f0cc3ea649a3e726a0d0ba3240482938d8a042fef4875\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d3a1ffabbe96d474dd83c1fffece889ca7c1560b62811bbde312ff5c73e7fdd346c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9facfc86bca0a8859889d9efd3fba9c68487fa49a78b15c293938d32f430a3e576ab3e02c0e1665e1d6a4b6ef98a6ef3a3632c98688db315e4c8eb8907479035d72\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6f7390dad86b309a8464acc781b7a22cdc6164de",
    "content": "{\"tx\": \"044da27e03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdc000000001a07b0b4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9501000000bff781dddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bee00000000ac3a7bb4026db9df0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a67e030000\", \"prevouts\": [\"ca4f73000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\", \"2fbf4b00000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\", \"e43e22000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"ce\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900455067193501824fc7e1f7f904c1e32fba78339d7701e72316b16feebc15a414abab692e734634bfaf43d653c1e6f6d8e8d14797d8e4fda7a04cf5eec270202b46d11737bfd86c40bc108767f37b7ad1553e96cd0852cc5d3aae7d4d5919ea2951\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367d1fd0be73b6182e4cd51ed7a2b120ef2cd5ccabb8492e6bf7f26137f064f14b8def8465bc2f3cbc3837b9c231547f51d7c9e247c478e05a849822285048dd5e0ea67bdb3398814286540937ec364df004af879f987225ad05d036a51e8223e6d4436d921361743dde8d98d3cfa724f09037452104a82644e108bdf9bf6fbb39\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6f775290762b949c8416b8db72a80fd4f625aeeb",
    "content": "{\"tx\": \"6640765702dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5f0100000029d0c5b9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1e020000000a5e90fd0143ee2a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7ea02a33c\", \"prevouts\": [\"6120210000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0999250000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_db\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6d195f0a72ee656832bd23e0ae205f238cfdbaf9dc0614c8317838871fff6566db7a60c05ef9c6409974711884c70a3201e9559490602f40f10880b4bcfbcca4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"589d3f38c3ef00f94500624751906d8829d0715f1f4ef2ee87449ee48dcf6532d23b5a18e46f25ce0ba7923f2f58bec1783972ef424ebbbd8f5b24419d82837bdb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6f8393bbb9d02857705efc61028b43ee819ae6ef",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1402000000d73d2e948bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4200200000097ebd4f30302dd930000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787ad30a625\", \"prevouts\": [\"a81f570000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\", \"e9523f000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa552be7238817b807c577e7c571d318055dfcbd95cc3dec1b5752f3912212e63f5a7735bc8e0f27305ca0f6b127eb0c71998afa21cfa1408dfc03edc17ac2e42ff4035580f6aad3e4d48161cfa55cd77c0146622bf63e71def681bc3cbf8a6f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f01d0d256ad0d229e53661481dce388404558ec2529e0bc1d85e0261a585159aa9fad2668c863ea9bd6dd9197c1c49c61c2b9d7888bac8bf6fef03fc3ace0a5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6f8e2a9cd5725921d637323d42b65faaa53b2d0c",
    "content": "{\"tx\": \"ebb0671102dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b780000000086a4f4c3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfb01000000f9046ad00132320800000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac41935239\", \"prevouts\": [\"9e3b2000000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\", \"fe3c270000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"fd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0822c6cefb1e181eefac563b15a866f5ecfc3c81e54821b9e81f79abce745f7d95962d72dd1cd8804fbc0be1dcf6a22214dbfb5210e6cde6f2a41edfb954edd50fb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93647aa351277e8bbf9be587a60760fe90499ff4f7bade942ae6e0cdc6741c21b4ae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e850656d0bdb94b88d381f7a82b87984f770e250bf999894456706d2524183d15d62d72dd1cd8804fbc0be1dcf6a22214dbfb5210e6cde6f2a41edfb954edd50fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6f9c6ccc8504bc417cff64152e5d55f2da6384f6",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4300100000062fdfcd68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45900000000e93273c30153505600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac25000000\", \"prevouts\": [\"c047320000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"3e083400000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"48304502210096d384e390bffcffba0c22773ea4cb94ad5cab4501ae286afc4b73f51eb354ea02200f921c9edff46d1c10ed000b87e42175a53e6ad34153078f00d7117a181080aa38\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100b176add6f5dd593f76f827e87edaee5dfc9e13ad73b04082ad5f05123f21ecab02207f271738f4c4fe0575dee0967548844f3ff5cc2cb1da627d8637a4f64cf4f60f38\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6fae620fa980b4c2193b8d1ca489fecb771da643",
    "content": "{\"tx\": \"71b5e2d803dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba401000000be38a9c2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9b010000003949d5b6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba2010000007c0e80f601ed1c22000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787e6a4735d\", \"prevouts\": [\"4a3f2100000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\", \"f873240000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\", \"4005270000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f84c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369bb84f5f1451210ceb72432b3e6d63235af9ffb877329c35283c8b2d18797507891e44dcd1430a53a9228b1d4df01e5c5d5af3846f876ba8dd78ee7e669e7153a72d00f85eae87f4cc31996f158484f267a3b4b9a04e006b9a1cff5c0be2781e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93616b2433637002a6288e5b498008a36f83adc9a4b9c08229b0f65a7712aba099bd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5129caa746058fefa69912501c9b6f792a531f2cb30638f1f343d3625f0a93b066f288028cdab461d62f9273620b97315e6e9af9458f777a616c1bade2d3f6a89e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6fd7c011c1e087678c2fc502f6049d5a1610b285",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb30000000093a746acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cec010000007ed5e8d5021f6fb300000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acd239a551\", \"prevouts\": [\"0e86640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"519f5000000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"e47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e13278694ce96e600b1b1379af0dda4dcee22bd0822513808885cb6e68b7803daccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457ea7c8dd4a05a6083e4a7ce3fc20cde94d430ec03cbfbe8017e9dc8ef3bce99a9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820d58db0463b9d01080baa2617114f2c0459e5723b09a0137090d28117705b675ea7c8dd4a05a6083e4a7ce3fc20cde94d430ec03cbfbe8017e9dc8ef3bce99a9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6fda74aa278e18be569d89d76d2b7d189719fc9b",
    "content": "{\"tx\": \"564957d90260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702a000000004dcc25e160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b100000000af182efc0194a10e00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac93b72d3e\", \"prevouts\": [\"5f160f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"cdd10e00000000001600141cc39a492a6f67587324888ae674f2f534a7639e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ea\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4bd561d66e58c68fe761237a83f4cc3e98086d7177b59215ff63bfb32c4d4970c60acbff8553353aff690d1f8d399eac4ec267201dfe585f84457b46abccec3181\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ac361121751eecd7ef5f546cb4d4ffa6a292e05f81086ef168557f1098cb7430017430a92e6ce30a54411b3b7baaf44da203655aded95efafb52ca8d4f8a5a92ea\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6fe4cc6bb00f0db22fe4cf7e68170752bf9e1f7d",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9301000000b42ed6a28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d90000000081fe60ac049d5a9100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac47d04324\", \"prevouts\": [\"749a5a000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\", \"d2c139000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"347d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faa00efe7e15c1e643e9e1cfaff50670e7cac10128754f4af7dc416953d80cca2b070c3fd2cc03cfe72ec91581f9e22200fa4c4f6deb8dafcd335310e90efb11e5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366956433f4fb745717b89f2dabf7821b404dd73db8a334af9b6b63fb319135fc93ac03c85a7bde4aa83325c4e9fa3803d6178be55885bf5b72d341e036ded0599070c3fd2cc03cfe72ec91581f9e22200fa4c4f6deb8dafcd335310e90efb11e5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6ff3146da9ac0acb6f0c208976dc39290b684b16",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c910000000057056869dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c47010000003cf378558bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44d010000006ea78b090428b4f3000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac70000000\", \"prevouts\": [\"9f7a60000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"8619550000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"478f400000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063e068\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93628082d35abe6ef83905e008989e1064363253e92a96e384c0e19752d72666028d81cfe71594e1389c7dbef12605d87c33af6e429193e755ec800f4a6d58e14260941252319b1d0989c3ca3905f2d65278f17fb3ebe6fd71301329f8e450b42a05a35b5683fdfa8774cce0e3f4376573bc9dcdb125f140a48d9cd3d58bda5cb68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368a353eb258bfe69706fad87149f0062bbeb66245797a793aa1397e15fb4e048a6b8fb8a6613bd9c6482328b74d7fce63938f8fb7ab14fbe335c660b528e72f6791d26af6ddceab3892536958f1ea20dd7b885ab499207106c7decaa6511a0e4c5a35b5683fdfa8774cce0e3f4376573bc9dcdb125f140a48d9cd3d58bda5cb68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/6ffb4a945d04f8b031049d6b6fa49f15f19568e5",
    "content": "{\"tx\": \"ce6d8fb40260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707b01000000a82eaabe60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702600000000318dc6de03fb901d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487e7b3b94c\", \"prevouts\": [\"945c0f00000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\", \"65c510000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ce4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cb2c5514a992c22e53e3a04f6b085a9b65917ab3f28cc532348e66ade0afda2c959bd9b34bb85690c892593228383c48f2c7a3855b4947a3dd1708d13c567655d4436d921361743dde8d98d3cfa724f09037452104a82644e108bdf9bf6fbb39\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d65a5d3ec5f807343f2d36728ab3e78b89e6b3a032f7e993a165c380ec55ed8fd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5125e7936dacf44c2cc5542287b329619dfaa06ef235a847d66c9c2df863225da6d11737bfd86c40bc108767f37b7ad1553e96cd0852cc5d3aae7d4d5919ea2951\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/70103c6bfa6033fc750d73a791d50375a1b86fea",
    "content": "{\"tx\": \"23ccb2ba038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d2000000000276dbdddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc201000000bff559ce8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49b010000003499f1aa02d96dc3000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac8a010000\", \"prevouts\": [\"334c420000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b5fe4b00000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"3fdb36000000000017a914aa4a4e70b11f4eec4760f77206dc93b02350fcff87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_a9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cf68cfacc0717997e89d00fe409492469bd7456be2fc7cfebb9c7ed437f9f9aa61feec882601b4f1eb93a70437592989b0186ea2a24bdd82882f6bcb2f99267382\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"28a307c3bf4658b932c6b9e8c636463b608b420f93e72cd6fa25b9206ef847ea6baed922ac2d3299c636619e2657554f56c28eb4e789c4560ce0e38db5db8444a9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/70294d4a0a0438dea998f982369933dacc66aacd",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709e01000000b32c5df604b4520d000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac61030000\", \"prevouts\": [\"c4080f0000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063bf68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93619d862adf527dcbd6251afda613bb700de56c3c64ed29851c444942e2faf911420e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e10ad4e0ac96c164f1885f81b1e139f05879070681278f68106e4fa54c23a8038d82745fb8509382ce1e64511ce3c1d55be477e9687cea49eaad32aa52098dfc07\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ab6cf39500705731d4b2d9ebe0ca35e7ccc55c3e2e84eceb274b16f05174389b911e2ebc11e8ff6aef3c08be5d8086fd4b944e3e1f7063038c1b6dadb4d48ab0219675e68f7f320420702225b2b85f84783248daa0c82b4ef34e304883a54210\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/708f0996354e7df20b2aef4b10bc9586dcaa5db0",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42300000000b20b5953dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4baf0100000081d35f7204231e5800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fced000000\", \"prevouts\": [\"db4e380000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"31d2210000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"df4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936be89d319d8869e9bf9ae746cc5e400e37fd9a102b3c132ccd07930db67bce60a51d880cc047c10a424f65fe9dd9096492f3efd8e08517d04362957faed36c3f852ff338358c59a252efd0a17af70f1cdfe194eb24c5d50483b26343bf89011bf\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52df\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369421f0c813f1c39cbe21c39d454fdad8d39c88e7d0478d0b244f0694cec3217cd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5115b534b99635107bf366447ce9661d5eae557250694ef66e76c31b44d1abe134360497a554a17affee0221519da82623f7958d9c28014b232926f5323d6c78d1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/70c7802de56e11939701cba269f74c5c54434e61",
    "content": "{\"tx\": \"5bee4af203bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2200000000c005eba660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ed0100000060fdda93bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf65010000000bf347b903f07aea000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689872898922a\", \"prevouts\": [\"c7c87a0000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\", \"d53a0f00000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\", \"1e11630000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6aec\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d514ff463d85551b82eff8f4009a79f35c7c71a55ad97e02e5d54d505fc944ebf2db68406090ec9503da6e41d61411400226504a16a75c985e068fea4ead469507b3b719bf4b6df334f4ad3966afd516fb2a8d294cb4fface4e4609ab1c9f988c5a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369eeb256fe03de844f7630ee1f9d4f8bd53f7cfbd5ea69e2aa5922cbf41317df14ff463d85551b82eff8f4009a79f35c7c71a55ad97e02e5d54d505fc944ebf2db68406090ec9503da6e41d61411400226504a16a75c985e068fea4ead469507b3b719bf4b6df334f4ad3966afd516fb2a8d294cb4fface4e4609ab1c9f988c5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/70cd3f4760a280eac2806e6373034a5e750cb013",
    "content": "{\"tx\": \"9cb7d226028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e800000000505ce1bc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43601000000043fdc9a0412077300000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df9797223689879f020000\", \"prevouts\": [\"728d4000000000002251209c5a589e416b2bf8d886ac38373c12ee12085629030d3f34ed2b7cf34700cf85\", \"e467340000000000225120f52aac6d1851a3bcc3e02eab41e79301b2d0925e53812529fe85f9ade1401e4d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"9a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e874224dbe9932044562df2f9dbf2ed3a87afba7bd9cf6855f9f40e4c24add8036ef17902325999cb16876d9e124f321b7a2400c6233e0b61b95917979ea167214\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362dd94ab6ac3ba59fc544244dcd9eb18ac121794a237f6dbebbd82fbb662320abda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e75ccfc706e32ae7f6b2a63f59d728082bfb2443bbee0d6dae87ff94b5ceebef57e56d08eecb8b548a03ce82dd22dc92a64f1be159e88ba8944ed4666490b777c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/70e123fe2099ae69883a84234ee7d2c67ffae902",
    "content": "{\"tx\": \"8dbcaa8f0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704e000000001f96ee99bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb900000000f13ab3910248cb8c00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac4f13664b\", \"prevouts\": [\"cc920f00000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\", \"1dc97f0000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a7f\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045d1e2e06d6ff5c459c120ed1951ff2f8353cc05da31129bd66db4aa2f495d014ff8d5397512e216c7ab52609f0ab27ccbbfd2b7e561d7599ada55e292956af911ecddbcce676de51918ff82e75e695523ce4d8df7d4ec353d45ae6331617767e1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93657c0032d4e48b70562ff2a9a0f5ac730dd2177fd5d330b71920c0f4217bb1e47d82f8c55e99af1bc6044802eb870171f459184b3c99e354e12eac4f204be9c37cf5fd42f9969f7f2472ed1fa62ffa49909a09466cf06ef7c57cb1be351156c54\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/70f98e7683065de833f78e968b12a17560c6d145",
    "content": "{\"tx\": \"69e9ad9d02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6600000000c9d7deda60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f001000000c805afc401196533000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f871b91163a\", \"prevouts\": [\"17806000000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"eed7110000000000225120934cc30b71223b04aa2af20106e445bb93ef4a67adba137dbea8fd26e6a0b3fd\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364f585542b894e5830b48f56f4cc72472e37b8c308eeed1b26541f7876cad2bcd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a6c616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7125c24e3079aa7ecd8a075096657aa41cbf32aa",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf55000000004245bcb4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b17000000009c83f3e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3a01000000932991810400c0e700000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac6fe3af24\", \"prevouts\": [\"3f1c6e00000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\", \"ceaf1e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"75615d00000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_f1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2c48c1f997828ff35b795585beb51556a9e7da80571b3b9d00a7ad3fbab2c4bd1b73f08720100c7885c7fced95be4f4025449564a0380c71699a694a110da3dd81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"440bb0fbb382877d0b30eaf1ce461ea54c7d31459e74d0acd0eda91c41409ff3b3fad5b95b5c624aa71c744c931c5532c29b16bb56d9627c8adb3f2cfd0323cdf1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/712c593d655c49212ff38704eff4d5d68d14506d",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4460000000086c6650edceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc500000000f5bf2afe03cdd85f00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac3de12d2f\", \"prevouts\": [\"c9003a000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"c668270000000000165f142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"71eefcdb8d2379aa4114d1652ff5b26ff9e9837a357afe394faff811594b984a68cfccc007366d1849ce7ea39f0378e7103d955f117853687334736851d75c37\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/713565a78c4f0eefe92a042e831427511dd4f5b9",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c09010000008fbe4ad0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7f01000000637407e402af757c000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6af040000\", \"prevouts\": [\"41885b0000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\", \"e76b2300000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"81\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0824d4a172c841d8bdf967229e1606322d36b03ac644f3c557c1b9d417f1b2a2a789823c6bcc0c06b1ccedd8f3302fb965778bf11fdbd4830d29cbc62f32a77240ccdb938e1cb9dba9647cc0512f82c526c8f6107930613b31200f04f80acff8889\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362abad23705572fa5091822077faf7723b4aee0fe16a98731801378aa56415cd84d4a172c841d8bdf967229e1606322d36b03ac644f3c557c1b9d417f1b2a2a789823c6bcc0c06b1ccedd8f3302fb965778bf11fdbd4830d29cbc62f32a77240ccdb938e1cb9dba9647cc0512f82c526c8f6107930613b31200f04f80acff8889\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/715cf3f1edec8508d34687cba9eb9735c4113fc8",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0a00000000b81b6fb28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4440000000042523524047aca7f000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374872584c954\", \"prevouts\": [\"2c8f4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"cc64350000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"25cb817a20ad60a967642bcf9e2bde3234fc99257daa6369fb16f8db5a10332890010ea7a0dc27c45136a30d74e9a89fbaa5a189f9c8401f49ec912b08ad036703\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1b30baf514a3eba21ac4e0dd30c9a3f880398ad89900f83580914b631c7e1a55da4199b85d08a7769dc836336718908b9d2f3e0c642c8bb29120dc47e0f5539109\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/716e9a2309a2d14f0b54d759df166270321962ca",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46101000000b6d1aeac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707b000000000a17a0dc015a9020000000000017a914719f78084af863e000acd618ba76df9797223689878f020000\", \"prevouts\": [\"2a803200000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"dc95120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_55\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"70b172c476617b79f6ebd78f1152014d36200c813615b503e3cde754ac5b44089e89c84b97f88b912779b208f5edafe0888df609eefc9b377c020c46644949de01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"59bec9303e6e85d67f84761eec9a2af84c74df855ca43cb3aa2d5b35d9f29f4a8c50c54e635d7d769eeebda02120978e4600d43567ffdb9db8e334ba25cfa04d55\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/71807ffa82a2c8190651c69c857cb71bcb08e301",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfd010000002957ffe6033cfd1f0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79625826548\", \"prevouts\": [\"49b32200000000002251204581460b504b6638e3fea2d0934fd04d28875d06c13da9be94a1b9d0f13f4099\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936803ab98b0f9ddf6f3e41ca6fb773f94017ab748bdc2b143170ff14bdba4b72f5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a37616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/71a2de6544779c774612b1f87277375ae9792a62",
    "content": "{\"tx\": \"6287608201bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf350000000033d65698012a9d05000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487193a7b37\", \"prevouts\": [\"9780700000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e94c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369ac778bb6e9889cb94937fc77a861bf4edb1757bb7369dd12c591a6cfed1c6a5fcbd8218c9dac71a3535cf40d08210778548ef11a7c40c018c5ea1885d9980740ce9ba0618adb3ee44483a22999a54a4e1710b9846377d8164aaa29371d79f22a2fa119ef3ac370f8290f87fe8954e212d8c61d3545cf9da1d8aa62b42f72813\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93636d4c52f29c92967d3f95d954ae2b8d45ca9ec3ae28f3ad290d21ee88ac8013e5e04c998862288954a26ee7ce146837a88020619bd4ef6b5d2b0b49b83f7fafffc7f9c78871d6a598c7c7c3f4c8210a5c47caa8abf9700608b6e75845c74a6c5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/71d2976410e52b3891d47b0bf5daf36223655072",
    "content": "{\"tx\": \"b519aa9e02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7b000000005fde7c9860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a8000000008d3b00900238e98e000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7a5030000\", \"prevouts\": [\"b94b820000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"893c0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"47304402207298e9f137c42b68f8a3eff5f4558ee11594a946363a925fdf428b2dab5761de022072df6188aa1e65a8fca130f7c42a267a3d95c5eeecf77af9c0454ffbae8f4ade85\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100f55c0187c96fe2aa0fb1f25fd36d194aa15cb0994999993e349ea70323ca80210220310892946f3796e322083e4d44a3ba9243836aeb819df7c7e861ca769bafc38f85\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/71d3d5be815413f81a15e1f21d82fa46ce4eeab9",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be60000000081cd06d2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba600000000e8ea84da04f3fb48000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c8e69e59\", \"prevouts\": [\"4c1b2700000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"bb67240000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c54c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694642e1d6a26a11a0c6e91919f09b278112d3d9e7557d10f9f51d88907efe7b71ca095b957df84f3ee7611aa117e5662ab64755743d6d9c5cff6305984f4054c5075e3d7a2801b75eefdf65cb630fc6bd09768ae07eb1bf67760ac5f1c253b1300a5530ec2a7d4ba868ec61eef99b13bb3328da6d520ee28822b8288bba3da4c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900457ad860089e7bc2a902df7d26b00c72c3270dfe98d44c73f0cc876602eea860a2660eca3fa0edb42c0ab30ffe3daaf6f1f409e953104f48559c2b804c71af6a81ce4d7767c8a9637a0804b073b1eb172c67de67ce152ade33f2591a85dfee2e5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/71ea7e6e573f89e2a23138bfbd547d888bdb7c55",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2001000000af3b7dc802d19f4d00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac491a804c\", \"prevouts\": [\"075e4f00000000002251209c5a589e416b2bf8d886ac38373c12ee12085629030d3f34ed2b7cf34700cf85\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"107d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e86665110f53a885bff43176a7d7b6b195840e7c84801cde818ee8fcc4f3857331bd940ade039b405c8439b762bfbc73f9441ef227e6f687b6d94ebcbac32155c7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936abb663633cecfbdf047dd686359b8961732858ab1d7ce30f20dcec80a10ff65c32fffbf821c428499cff2b0139c90d93037c61d12af2692624d5246efcf2a3a14520b5ceb13d27db1b37ec8ee9ee9482aafd08fc62c5401b1fb7c7b4ff374c3d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/71f13e97734a6166d08d71982621f3785ea5ae3d",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8301000000820c50a18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48c0100000021f32087dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbf01000000a91f7be901ef40c600000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acac07da2f\", \"prevouts\": [\"4cf95b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f456400000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"d4ce59000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_c8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9becb17c1231fe529b6ea1a407ad1f82bc91a5a3732db42c15e13346bfa188bf9b620c62ee46cc570b395da25ebdfb35478b88adc06b46b6e5a77897618bdac103\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a9b7629951a0e094e8cf85c20147b28cdef214259be99a5e0cf25c04ed748e5354323fd920adf1d6c338bb51b5aa7b55720db9abf98276ce581ea3e6c0f8a408c8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7217d80b5053a43d6fb6822470d12e76b42b2764",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9501000000ea4b4ae9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c140000000035454f190291a37500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac963fce3c\", \"prevouts\": [\"e1f320000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\", \"dab856000000000022512063eb770f298cfb14c87c6cff1e0541dd7cbc30bdbab4472c0f37d52bd55ad696\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"ba7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0824a7888d88a49f036a686b85959429d2c21b5cc7c31f53deb0eff848be794e4af5668d978bcc8d3ac0b8aded42d2a4a1c5e69a5396581e310868cb48ff813edbf\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361a6268ec6605c0a71a3baf80bbaf2c35e719965b840f442bd67e2fffd291e10546c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa8eec2374ba6ebc72bec4e80a7a4eb00aacc51a24e1026152998b46c213b611dafed5a24f2185242e3d6c1310740c566533f3942992fafe5f5be2785933680ed6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7222bfdff7231c2aa5afe88a9b8860e057c947b7",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44f01000000e8d79ef28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4aa01000000a7c6011a025172760000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df9797223689874bb33631\", \"prevouts\": [\"98d7380000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\", \"af6e4000000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"fe\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368d877db375ed8535ba033f90d60f6b296e0f2bd1d7897409f54097620de448bdd800fc56907ebb8e18291aa6f74a5d7a46b4d60066ab44c243b43072452172e3365bb68c3eae5e6cd9b20289e581f52d4e8c0cb4ba58bcd8be9e67bc80fb920a1e45c38e8a62a0e5058038ea76117f85fe5d704aefa5d806bc1a7cbe3a990946\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f273e05517e7d7c4ebae818f78ffc6ae6bbd8b4691985bf60fb53bef1b79009a0d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3b44d8b0f62b2d27de7be259100200d6da1e5303b29f3eaa1b6a4eeb0c96a42f364ab0b66352e66b5bf600abf31d1005c5406f4575b339026213ecb21a668977f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/722914ef8c3dfacc1243877cf6bc0be5cc3eb6c2",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1e02000000912e21dfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9a0100000031b47cf98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4980000000092ee46990448da0101000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acd8010000\", \"prevouts\": [\"ac7a4e00000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\", \"3b7a79000000000022512065eb0ad8f24d6d8eb63c7f85eaa52926e45dd0588dc97971df796ca5c67918e7\", \"18b33b0000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_1\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5ec5d50688ba958a318a24ccf231a4caca99043b5b9aeadbd4fdcfd6164e7f05d4bf1d7360752e902b5a043be1e5fab205990eff07191ee96b5faf8686f7ecfd01\", \"61e0f6c7957000856f68afdf46b3201ed9e484f794d24fca155304d56b298ac6a240551a16db\", \"753535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a200636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1605044119c566b794159a23a9ec14e8a93eb35aca328c0e9d704ad02ae272660d408f2c3322130c1b8d98bcdc511cbf08ed6626c6ad5103ccb066ba3a446285d944bd9ad9eefb4639ed414d71b7c064f5fd84ad1c711132e2e9ebde5b94751b1e89caf5e2beb3889a98787abd8bf5d9afe0e4fc9dce3fea32eac6b23d618250000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb7826dd75b46e39b7208110a8e4187cc050392b3240f6316343fd3b5c2b15070000000000000000000000000000000000000000000000000000000000000000adeb2aad8459e3024ad2c2668541698cc8ce93668bd039750f5cc00fa3a4e14a9decdf7367ccf39a5da3025933ebbc5bfd9a59aaa537efe38ecc935db60cc7971db1de8dd1ebdcc2290e210e150309d2465c3e1f8f0d5b69187fa4290bc75b4804cb173a164212cb7d19614d96e5768c34d4dfd8433301572533455de27a30fc0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a15dc305681a926f377a601cf7c23c071267546f841030423230b4c08d220bf6c9371e0d47758eea2a2ef95e5c74652fe359e7a84bebaedd8f5cbad2e472078c89f4b57a3fe8ee55a2db8bc582dc2c086d6e2013270905e13b8a693cb448c815eb89bc8c94a921a08e17d69803aee69436fb8d642a195d2e3dbfd7ff4b07ea357c8c08c8b755ecca4dcd7260f3fc75b2bb426acdb917760f3c308a9dd56db50effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd3514cd63adf5931b68575d063acc4ddc8ee198aba956d89a95c52880f987a5661f576596297ba20062b14f5c152df22829b55362d0bf62d312082561adedf5860061d9b857fa33e2925e2cfb59d3468d01d142aaa17ffdb306a6bcb3eb8c12b272df65b9b97bd8b6d3366db979794369fb42a62a32050c03dd496726c738740ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff952d98373bb692a211303639b04be8941ab69fc8fd8eaf22c25e4559817e4fc473ffe52f713c9509fb97eef4ec0aee20aeaa224974f203ffd301248a8ef6a3f6872745ff295f39dcc43a0fc05df9a0cc9ffd5055d92afa2346ebb2066376e8e558469301a9b6e263ea24102e6961fa2ae1e169c19c62b66d80499088e745bb6f00000000000000000000000000000000000000000000000000000000000000005d5dc489b6e5ed040e15480e64d74b78db75e01ffbe580e92d8a83b4ea6feeca1bb0a648bf98b56229535d4a542e847b45e4adfbc121dbc34dbbeee80e65545d00000000000000000000000000000000000000000000000000000000000000004acc8aa50fa881b69533ab9d152609c0dd064f9d02eb2148495e4078c79340440366f3dea0a2618a35d2722e492eac5b3289be3b7f85d789a6abbe08045b1f31ba87451c2d4b0cc017130b862b1b8210b40dde36f5718c48875db29461a66c2affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000005617bca7ef5e6cb18dbd2fbf24d980e9ccc7f39b70e1ff40d2405bec8d53fe9ad115c1e28ec2189fe47803972a7fd0c558f3daa78566e4be2b36a0c28dd423c200000000000000000000000000000000000000000000000000000000000000002cc1350b22905345362f666e73bada0a8b51404f26211cfbc3dec8c5f395a58b52852d919e15fed226b531c6dfac78217d3f4ec616843da9bcf13cde5dbbd2d252d6e794e5dc155b8e8b5bc46dfdef923814f07c6da7f5104e902378031b941645923efd542f46b65b36296d8568e958d60068696cd8938867d7ad1895bb717534d7e98d5d8c463537c2038f4061bf2f53e73a877ae92d3bc93f95b6b2c5c4028b7d821ebd6a528d2ad07e0f8f328041c9ff00dfc88352e2b863e9ea217d37350000000000000000000000000000000000000000000000000000000000000000d6d1be3f9f22d73e15361b24c926056f492e08e7a2e66c25e9ba2084e65c4a2effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff522e22e9fbda23fe7bac8b261b406cfa379fcb4bc4be65b2f492439cbb293259ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f54a5a7a721fbd7dd169a7f9816769ffaa8cecf08f113505d0a4dcb7eb2f1e8ca9f216f3ebe4a4ecf792769b51ef6f3617d8f04df33be5ac634a8e6f503bd6cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff56067b6a3b8238e03d3addcd41f3fe569f8fe63463f45b4f69f30375e6a57dbadd986b6448bbd0d70ce5ed3edd16f37a28aee9a0401ba2c333ff2410e9a31a75ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ae0d8d847a44579f27fe19e31b1c7c43ce8d41d474656aec9130caa444b60a4446178611dcce24e889d9c2f7ac8464806786032e4870ec6cf39ff3c83279c62000000000000000000000000000000000000000000000000000000000000000068d75ecb954c141cddc6009102adcf05c4c577a456815f49daead75edc4b18c4a2acf3bb28d15d945db1b63fbca8bb15e96676ee0b85dd00a211c659200d55bfa653963c6d225171a310191ba5dfa12da98a0e8e0a2e2415ef8ddcec6835f8b3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff12202008f40f7309b3c7453e91986dfa6e32732e08dd2af6d91e15390ae3deac65255920dc1074edce60bcab1348c3cf866f42b23a58ae1393ba69b8913d65cf0d7fae50141c3e3108f4cbd1f13b7333ee41b96c67cbb7b1e60558f2194f13f10000000000000000000000000000000000000000000000000000000000000000bce4fabfd555fccc54f5fb39c21eb1d92489e12bb54ca79bbfa9f07d2638ded37b8e51d0f490b30741c958cea8c2a821c55ff6f7121bf7a8aa5f94c8b2c4490b45ae10473939f2a532a8213d6cf3326962066d30f164f24697e7a4b8b5a81a7dfbf8bd91da6890ef3a8a40d33886b39f7db38aa33a4342654de37e996b482e821a6ce9571f0eb53fa2dd67c21bb74554b69b76e576f0b4f083e420a992ba9e15ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60eeea331b14f18667651bf2de9c937da7f86785e94288f19cd993d39fd8b1aa161ccf2dd39620d042a908d49ac607762ee1691c06958d3c3eca6ee05c80c309fd35f339800d1b526ce4bb0397359720aec6e2f6d7f29ba49fc55e76c17239660000000000000000000000000000000000000000000000000000000000000000b925063e800b0f603da8d6fee95ba9c797ca5e92e1da12cf510e4253f04467b3a009e9599efd22e228aa8754c121d637e7a29a4bc809a559a8e2b318fd2b7ccc6e974f144d38b7409092881bbecf143c7512f55ed5c01b8f0ca56efae83305391cf16e342c26171396d6203043abfe8d255e066ab2ec23f4f77580cf3395b3d94cd16b22791568a984ed01f8c62118b04ff9d1b7174a72070d84db138355bb5267b3181e480e62b991a2488b2cbc4b9ab69233eee79413425868b1bccc0dd2894c34b15442dbb5f3cac263a7b67c9f668ccbf40cce28939869d980e7a08e0d6affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2976d896158f2e452dcc5e82e7d94c1222a6ffeff8e3a642bf53dfb88e75aa3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d35faa5bff08e02176b268bba767bd054ea45a6afbfab0ddfba339a189039dca8b13a84a55fbcfe4071810185a6ab685582cdad9badbc263842bb6b3daa84928357bc54732c2af7a9a8ae86b96da00b5a963772a438d7e575bdb417620bf07c98f3fddc91038dd143041b7553320eb0531f466cae85ef567a7b56aa8264eec7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaad7f7b1c89fa9fd603038fc9dbfe91846830b37b89309d35ddbcb21eb7ead4b8419d165ba657503d8c8fac9e04888ecb0155d5656cfddcba611a3aa0deffcbcaad93eba073531c6f6122c7951e1093a14d7d07bfae4a4b494d8f26bb7682e9057aa808812a8bebeae3db2629d339b2690300e2d74c081c42fba304dec7563e2272f782359ec29c0f81d54b78ac02848f2d147ae5baff5b799cbe9574db748cc8044689ec1ededf59a10179cf1c112201a907d1e43f6310836c65db58825f0bd04dbc30ef782cb1c3e43b3a3d078c29bf67ceedf5fca61e7271688fe90d4ff6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b0033303d2de10daa76692b6ea201f57b0ea985778960d539da234f8d3d4ecf49f2fd2807beed1e234c20ff1ef0b91eceb83a7113d70bd5b11d6587b35bbac16bc25f0276e423d15bd494a0479c35701478b3997351af11ca8999e16b5a52a916f13a7059e3b88e2cb535ee3c857e3ffffbb30a2860ddf4ebf171608cc80c41935edaa6170f0ce5dff93a1a6b257c7fec45d35fca37c2d259f9b54c53519b5c934029a6d3cf9f905f1c6598826093b6fee6c7092d3e686e16c75eb2167e69b8695230e51389257769e372b1670d700f244923da50dd40177d1ce87f84d31bd0c081f7e8141153f9fbc10e911d5ff34edc6a0674311901ce1842ef2ed590077ae7c054ca8f4adece2737c3d25c3a526c8563a76d32f3376157a6695e986acf0eb85804d72c8a9d84a3774c76b0d3ba17a425a1cc8bac1277801502756727303ba88f2efa561ed0f2798907aa73edbef22c3d6f8c067dee4a79fe78dcad882b064bad4b4440ab524295af9c4432accb4a52b36e45630fc3b7e8586c780f045b1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff695247c5d28f538e46d903d8bfad21d8a131d84f54ca82a749a9e24150287ddc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5ec5d50688ba958a318a24ccf231a4caca99043b5b9aeadbd4fdcfd6164e7f05d4bf1d7360752e902b5a043be1e5fab205990eff07191ee96b5faf8686f7ecfd01\", \"654d55e7f53cb9ed66b4fec695499e0fdec362af3359e09edf4e71bd02087ed3101b036275\", \"753535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a200636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1605044119c566b794159a23a9ec14e8a93eb35aca328c0e9d704ad02ae272660d408f2c3322130c1b8d98bcdc511cbf08ed6626c6ad5103ccb066ba3a446285d944bd9ad9eefb4639ed414d71b7c064f5fd84ad1c711132e2e9ebde5b94751b1e89caf5e2beb3889a98787abd8bf5d9afe0e4fc9dce3fea32eac6b23d618250000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb7826dd75b46e39b7208110a8e4187cc050392b3240f6316343fd3b5c2b15070000000000000000000000000000000000000000000000000000000000000000adeb2aad8459e3024ad2c2668541698cc8ce93668bd039750f5cc00fa3a4e14a9decdf7367ccf39a5da3025933ebbc5bfd9a59aaa537efe38ecc935db60cc7971db1de8dd1ebdcc2290e210e150309d2465c3e1f8f0d5b69187fa4290bc75b4804cb173a164212cb7d19614d96e5768c34d4dfd8433301572533455de27a30fc0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a15dc305681a926f377a601cf7c23c071267546f841030423230b4c08d220bf6c9371e0d47758eea2a2ef95e5c74652fe359e7a84bebaedd8f5cbad2e472078c89f4b57a3fe8ee55a2db8bc582dc2c086d6e2013270905e13b8a693cb448c815eb89bc8c94a921a08e17d69803aee69436fb8d642a195d2e3dbfd7ff4b07ea357c8c08c8b755ecca4dcd7260f3fc75b2bb426acdb917760f3c308a9dd56db50effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd3514cd63adf5931b68575d063acc4ddc8ee198aba956d89a95c52880f987a5661f576596297ba20062b14f5c152df22829b55362d0bf62d312082561adedf5860061d9b857fa33e2925e2cfb59d3468d01d142aaa17ffdb306a6bcb3eb8c12b272df65b9b97bd8b6d3366db979794369fb42a62a32050c03dd496726c738740ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff952d98373bb692a211303639b04be8941ab69fc8fd8eaf22c25e4559817e4fc473ffe52f713c9509fb97eef4ec0aee20aeaa224974f203ffd301248a8ef6a3f6872745ff295f39dcc43a0fc05df9a0cc9ffd5055d92afa2346ebb2066376e8e558469301a9b6e263ea24102e6961fa2ae1e169c19c62b66d80499088e745bb6f00000000000000000000000000000000000000000000000000000000000000005d5dc489b6e5ed040e15480e64d74b78db75e01ffbe580e92d8a83b4ea6feeca1bb0a648bf98b56229535d4a542e847b45e4adfbc121dbc34dbbeee80e65545d00000000000000000000000000000000000000000000000000000000000000004acc8aa50fa881b69533ab9d152609c0dd064f9d02eb2148495e4078c79340440366f3dea0a2618a35d2722e492eac5b3289be3b7f85d789a6abbe08045b1f31ba87451c2d4b0cc017130b862b1b8210b40dde36f5718c48875db29461a66c2affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000005617bca7ef5e6cb18dbd2fbf24d980e9ccc7f39b70e1ff40d2405bec8d53fe9ad115c1e28ec2189fe47803972a7fd0c558f3daa78566e4be2b36a0c28dd423c200000000000000000000000000000000000000000000000000000000000000002cc1350b22905345362f666e73bada0a8b51404f26211cfbc3dec8c5f395a58b52852d919e15fed226b531c6dfac78217d3f4ec616843da9bcf13cde5dbbd2d252d6e794e5dc155b8e8b5bc46dfdef923814f07c6da7f5104e902378031b941645923efd542f46b65b36296d8568e958d60068696cd8938867d7ad1895bb717534d7e98d5d8c463537c2038f4061bf2f53e73a877ae92d3bc93f95b6b2c5c4028b7d821ebd6a528d2ad07e0f8f328041c9ff00dfc88352e2b863e9ea217d37350000000000000000000000000000000000000000000000000000000000000000d6d1be3f9f22d73e15361b24c926056f492e08e7a2e66c25e9ba2084e65c4a2effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff522e22e9fbda23fe7bac8b261b406cfa379fcb4bc4be65b2f492439cbb293259ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f54a5a7a721fbd7dd169a7f9816769ffaa8cecf08f113505d0a4dcb7eb2f1e8ca9f216f3ebe4a4ecf792769b51ef6f3617d8f04df33be5ac634a8e6f503bd6cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff56067b6a3b8238e03d3addcd41f3fe569f8fe63463f45b4f69f30375e6a57dbadd986b6448bbd0d70ce5ed3edd16f37a28aee9a0401ba2c333ff2410e9a31a75ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ae0d8d847a44579f27fe19e31b1c7c43ce8d41d474656aec9130caa444b60a4446178611dcce24e889d9c2f7ac8464806786032e4870ec6cf39ff3c83279c62000000000000000000000000000000000000000000000000000000000000000068d75ecb954c141cddc6009102adcf05c4c577a456815f49daead75edc4b18c4a2acf3bb28d15d945db1b63fbca8bb15e96676ee0b85dd00a211c659200d55bfa653963c6d225171a310191ba5dfa12da98a0e8e0a2e2415ef8ddcec6835f8b3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff12202008f40f7309b3c7453e91986dfa6e32732e08dd2af6d91e15390ae3deac65255920dc1074edce60bcab1348c3cf866f42b23a58ae1393ba69b8913d65cf0d7fae50141c3e3108f4cbd1f13b7333ee41b96c67cbb7b1e60558f2194f13f10000000000000000000000000000000000000000000000000000000000000000bce4fabfd555fccc54f5fb39c21eb1d92489e12bb54ca79bbfa9f07d2638ded37b8e51d0f490b30741c958cea8c2a821c55ff6f7121bf7a8aa5f94c8b2c4490b45ae10473939f2a532a8213d6cf3326962066d30f164f24697e7a4b8b5a81a7dfbf8bd91da6890ef3a8a40d33886b39f7db38aa33a4342654de37e996b482e821a6ce9571f0eb53fa2dd67c21bb74554b69b76e576f0b4f083e420a992ba9e15ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60eeea331b14f18667651bf2de9c937da7f86785e94288f19cd993d39fd8b1aa161ccf2dd39620d042a908d49ac607762ee1691c06958d3c3eca6ee05c80c309fd35f339800d1b526ce4bb0397359720aec6e2f6d7f29ba49fc55e76c17239660000000000000000000000000000000000000000000000000000000000000000b925063e800b0f603da8d6fee95ba9c797ca5e92e1da12cf510e4253f04467b3a009e9599efd22e228aa8754c121d637e7a29a4bc809a559a8e2b318fd2b7ccc6e974f144d38b7409092881bbecf143c7512f55ed5c01b8f0ca56efae83305391cf16e342c26171396d6203043abfe8d255e066ab2ec23f4f77580cf3395b3d94cd16b22791568a984ed01f8c62118b04ff9d1b7174a72070d84db138355bb5267b3181e480e62b991a2488b2cbc4b9ab69233eee79413425868b1bccc0dd2894c34b15442dbb5f3cac263a7b67c9f668ccbf40cce28939869d980e7a08e0d6affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2976d896158f2e452dcc5e82e7d94c1222a6ffeff8e3a642bf53dfb88e75aa3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d35faa5bff08e02176b268bba767bd054ea45a6afbfab0ddfba339a189039dca8b13a84a55fbcfe4071810185a6ab685582cdad9badbc263842bb6b3daa84928357bc54732c2af7a9a8ae86b96da00b5a963772a438d7e575bdb417620bf07c98f3fddc91038dd143041b7553320eb0531f466cae85ef567a7b56aa8264eec7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaad7f7b1c89fa9fd603038fc9dbfe91846830b37b89309d35ddbcb21eb7ead4b8419d165ba657503d8c8fac9e04888ecb0155d5656cfddcba611a3aa0deffcbcaad93eba073531c6f6122c7951e1093a14d7d07bfae4a4b494d8f26bb7682e9057aa808812a8bebeae3db2629d339b2690300e2d74c081c42fba304dec7563e2272f782359ec29c0f81d54b78ac02848f2d147ae5baff5b799cbe9574db748cc8044689ec1ededf59a10179cf1c112201a907d1e43f6310836c65db58825f0bd04dbc30ef782cb1c3e43b3a3d078c29bf67ceedf5fca61e7271688fe90d4ff6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b0033303d2de10daa76692b6ea201f57b0ea985778960d539da234f8d3d4ecf49f2fd2807beed1e234c20ff1ef0b91eceb83a7113d70bd5b11d6587b35bbac16bc25f0276e423d15bd494a0479c35701478b3997351af11ca8999e16b5a52a916f13a7059e3b88e2cb535ee3c857e3ffffbb30a2860ddf4ebf171608cc80c41935edaa6170f0ce5dff93a1a6b257c7fec45d35fca37c2d259f9b54c53519b5c934029a6d3cf9f905f1c6598826093b6fee6c7092d3e686e16c75eb2167e69b8695230e51389257769e372b1670d700f244923da50dd40177d1ce87f84d31bd0c081f7e8141153f9fbc10e911d5ff34edc6a0674311901ce1842ef2ed590077ae7c054ca8f4adece2737c3d25c3a526c8563a76d32f3376157a6695e986acf0eb85804d72c8a9d84a3774c76b0d3ba17a425a1cc8bac1277801502756727303ba88f2efa561ed0f2798907aa73edbef22c3d6f8c067dee4a79fe78dcad882b064bad4b4440ab524295af9c4432accb4a52b36e45630fc3b7e8586c780f045b1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff695247c5d28f538e46d903d8bfad21d8a131d84f54ca82a749a9e24150287ddc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7275e47aff6a2c0f8bacb56d065aaba591e02a30",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3c010000003492e39adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccc010000004291f994019baf2100000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac92000000\", \"prevouts\": [\"4ced810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"102e5100000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"e27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93644f036b5ef9fb8fbfbe8fef0b688d1e976e3d8ae9eec3eca289a706e0eef31c0d6719dae808d80c72548faab257df36cf98b115c53ace18df08612b967e5347aeebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7acec7827d9bc9e4e8e39cc141cf7690ea6843d6b50eda1fc8d5571fb149b2aabab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820bc8e394a89b61e744ca0843579507fbd14c939f32cc2eb6ce7075b90210fcdaec7827d9bc9e4e8e39cc141cf7690ea6843d6b50eda1fc8d5571fb149b2aabab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/72790cb9d6895411ac13e44b9be62c5cb05584e7",
    "content": "{\"tx\": \"ae013cc4018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44c010000007f00bb99025ba03e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487e7010000\", \"prevouts\": [\"0c4a4000000000002251201dfb228dec79c6e234b1139c58dcf8de3e24a7459acbe9e029f267c6e1783b9a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"627d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e889c476762c97a1f480fe93da3602a750f62c0ee9bbab5a4ae1c7a4219e84dbc327529efe07ed3ec82dce77345a5c0eb368b138839946732056b6a908dbf5f05c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fabe3373372acbd8f7355a742b339dc4113bb3ad1c8e82e6b2233d51ce74beeba4a979a031634820b293704e38f33c20e5acd9cb2a8735bda71fecc5f77708044027529efe07ed3ec82dce77345a5c0eb368b138839946732056b6a908dbf5f05c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7282e73fa9d18fc99fa2f10c51211fe1079693fe",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43a01000000450efd63dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc600000000a8e0fb6603d47d8500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac08030000\", \"prevouts\": [\"3c3f35000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"79ec520000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_e2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e8ec293f7fa5184aa33811971677e4dcc782a30455f4b891bb8a3039e24024b734dfe0b5fdb2faee3233091b1e30b19b049e0a9408dfc7bbc30ad53db37397b581\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c370d2f8e980c82071fca4f3a2034caca9617d7cceea7260466f9b8912793c707c872b00a1da8ada8686dc520958fed35487b3935027a011704a230c42b1027fe2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/72893e972bd42b8697f75e7ac80c8885bf7c3a45",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca8000000009decf0f060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127016000000008d9b95b7029da96d00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac87195644\", \"prevouts\": [\"6d105e000000000017a914ca8d66b8079fd8386ff3ae1d10b869f5605e693b87\", \"404511000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"bd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faad1c924a2744de25921620091a34db181a435ddb56a0dc8d3bb0ce452693f5f97353a90cd56d8edfa9d59a5341a6c829ef2ec5b70cfecd5055b0e6c18dd5375841cfbdca9cced9a9297ecbc29dffc929789a1848311039b5a24b338cddf0aa70\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361eef65a04a420b347c827375227f302f031c014f488d196b114eae238398371fd4c17033a0423a3758914e896a84d75b6af3e7ce95cad06f99098a3cc7df4a1ef248cd26a95289b2c5b6dcbde70ff737dd7b8c2860adf4f4d2fc326868c95410d797dd6acf95c24b81e793c9c81b0ab80d381fe8deb935e4a90684c96acd4587\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/728c6175ed68889cfe3f359471f509fd1da1623a",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f8000000006d3588dc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709300000000775f78d38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45c01000000bf2c651d0114714500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1f010000\", \"prevouts\": [\"14030f00000000002359212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"0f160f0000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\", \"13d73e0000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"aca3a5ded9f7d237520217cd24fefa492de0e6805413ebb39cc01b8f920819abce1996bb36eb2d4e73c88a9e82dbce2d459505aef6c35d81255e0b421387fb45\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/729abe2b4cc9df53668a78ea8236ae421f3b5173",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7001000000fe2a26babcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfaa000000006e3943b604070dc800000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df979722368987fc927851\", \"prevouts\": [\"7fcc4b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"59217f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_3d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d195098ea69908e20beb604f9d5d4e23b2d97471868dec2373f48882b351f427b33c8dfbc149a16495ec90ceaf575c56abc83e0553b485cda7313749dce1abb183\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"314ecd9b60a03fa259fa9cc84335fc70c8c25c8f0d1dc56bc022dec1f097b5d15675ee358aa3cf72217bb8065198d6be3f455c7c3307157cbd5b4ef6cc7cf6d43d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/729bc90d92d1235d6d3bc4c56bfc5a7cb1532e39",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce90100000083239af2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ced00000000c0e951d4020615ad000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748700000000\", \"prevouts\": [\"3403520000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c7f65c000000000017a914f0ed99a28545ab2ceacee60b5537a9e5c34fcd5187\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_55\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6acc2c2de3ce53227191cc890f0abb65b823cdd8e61ffcda47c292aed303bd6708bdfcf319d6a4477feeb5be660509a426a22e8057a02a2bedfba33fe692cc2c01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b4512f593f052cd58b67f815e173320cf9af4300706e2fe67b3b2eec0f789e2def21f50791bd6412c15282efd253eee9b146d1f12455d03d7420c1527a9c876755\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/72a19edf12311bc49d7e72f4ce0d25f68b5ba472",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3401000000ac6c38ad0460c56f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac92ef0b31\", \"prevouts\": [\"17c57100000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a89\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368f392c492a5b36963abcdb7fbf7476b495f34d23a20e2b9245c47655ae80aa8c1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900454b1cf341ebb9351320fe3e143ffa2dad1c15696d7ac983fbe7e302fe7a073e7ecf46474fab8e7e9306b35224640e271c3ad2c01a28b74e8035b5ea3da4b2d4b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d8b8b59ec9330d10cfd242c1699350bed4f76e625017108107d5490f0b0ac19bcb3e0a345cce78c1fe891e9b22b966ce84a8b12623d949f63d5e15e148dd67959d8f9ebf09b0c450213ac35faa1ca38fcf1ad0a46ee35414da06dc92335be8b4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/72b351e21f164a536ef913cda1b95716c0de23ce",
    "content": "{\"tx\": \"5fbef0bf0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e4010000002fbbd3ce60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702400000000b17fc38b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4020000000022f32a9201149c1700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac6691b05e\", \"prevouts\": [\"0bd8110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"02e3120000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\", \"37553d00000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"487d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a78f03f4c984da33b67a1f34f73d9f3117d7a8717c805ff9e9061dc3289a8d8637a3a83b36cabe27f746cef99f5e6f5a048cb284627a25ce795acc8b79f1d63b4d178bbecd44a62a975bb89c44ce69c4bec935ce63261f4a792ecb896593fa3c40210bd7db211b82a407c19f9567cde5a01f8f2a3c3dc032c7ac21169de78447\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa8d88ca5d2ed422cbef7221efcadc1e9b79f7a9a7e5e37a381143666b41a8ce50be5e2af3a3c1a6754948d639a5542927d59c509fd5287d02d091c2a39a812b527da89940c9c2be3d3cb1ea9fc374137a74dc3bafe909c68993f298761996d666\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/72b831f893332ad3733b0af04ea0e76cac65b5dc",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3901000000294d73f38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f000000000428d778904fbaeb6000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796f7b3ae3c\", \"prevouts\": [\"d7b8770000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\", \"2ac54100000000002251202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2c4f4c08e82cd2748b627f594356ee1770e152d3ed937afef341d5d1405729e94dcfb2a411d61060992531f5176fcc33e0ffb407fb249880edbc638e48a7e26c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5c1ed01d05ee9ee8ad3e08908198b0301ea4e75cf4b3866a7d5d4378720216ddec9c11e00494a12839388999355a222cb9579bbf423c9df99bc9b63a48938ea2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/72bd024e4b285894458f234b460fcaf90e8445cb",
    "content": "{\"tx\": \"52d03179028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44a0100000058a0458bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9e010000002bb7bb9501169421000000000017a914719f78084af863e000acd618ba76df979722368987f336fc30\", \"prevouts\": [\"806a3300000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\", \"b81e8500000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902bfa1c4843af01b31af8a2762d5db46c30cda3b585094fbd43f3b9d3819a59b72bd28e5dd9c9165e17af1897a1fb1a549933ce84c4393144f63e25f92db635e29c54f872d537c59606ac1b48291ab39b568f8775d4ba386487b73deff380006cf78f96dab00f767c7cec7d50f740cc2c5d6f11098ac68329141c60d3fe0a7bac73f708f6dd15f8a55e9e91e0aa3dabcb90e3d6814df4367be279674e0bc4cc64c5728639023535b6b9e528f8f4c614570c08bee325815acc9ed749ce284d04fa974e36bbec791dab69813d2d3db8ce0d39a6a8ce501c916971d1e64e1479a28018399f63e83ad1de05268803bbd24a1f18dae14e19afe3ccce4ad25dc6f55019473ec586022070bb42d6ae89cc5e1e44e9ff2b0e24d1846b12153dfd4574c9981a1182e0f02fe584eea436299584292f8f31e81aab81d785ac9123fce4bf6b1c74703457034e5177ebf98cf8221e9895c3a8c309a3ca32872df0f66822f44e27caa7b3d03e0a362215ac479b6231c30eab6aa5b78a1fca0dfe4c872612fef770ab42ae1053ef4ea0bb10193183894eb74e85e70a12a9406abcca9279c7efc388b27833682c510f6e4dd1fbeef6f65a2977eace89ce820838527df7834e080ae90c2cb622660da184c183eba125dc5000caa45e1e6bea5ad8987df557077cfacf75c9cb74e82b905e589f542894676a846400f38cc9918fd3edb7a1e430522b642ea14a056ff1a1b349175d0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e2d2a48a19715e5e10213804ecd6bef4aa9ea7ea8b0db9d9bc22fd189820ca533f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823bd101e45a609d3b8e0b3b6f0b7594624f7e9102ef5d5dd3027418de40ebb2180d690b53af7dfcad925f9834a18ad2ddc318ee8f8616a880729dbc2fd60dfccd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f35ba5c782a43fe11859ef38643d9f5cc5f66959b5784b61362d938dcf683fda03c5e104443018355dea3370408d6b90250d7f8b6cf090fe060e634798d9e5ecb565e48904a8fe406080169def180c6df0b9b32c95e743c8f6afb14b46194b319634cc92534b4c747714ac329dc11e15c671954aafbc2cba5f3439296581f5bc783bd13feb0fb2a952df94cf7b7592f4abe3e19620467a7ba1ac28f4daa1cef3000f085ee69d005802120348ccc35b8b14a346808d4a9fdc758279e6683b2b57ab03ce02095a25020e059aacf856bfd2b665e439a3259b4e1ec9ffa90f5abae8e8d6a5e36ed40f52e187ac0c517ed6a794cc0c2789eea42321bbf88d124dfc36c27e99e00b3f8ee6c6d57b792144e6d24a12bd52271b6b7bf3daab66413431b222fb7d9be19e90437706275b06a8a50b2cc12706351de59ff26226046af7a9b1e354d40d191cc9cb8ad552ee127bc7c84cc4849f5b2856f2cfedc401ebbde8247461343265e85257fb86ec572065a84f76bcf56703b9d952a64805bc6ccb7549c604902a5d0a362590abe5584e3e79ab6d1bf76494ae03e979b359055b1f618671ac02bb602a610eff8af7a83bedf0f886b884cf77bb86ecf1163903f4a3b0dd2c945416bc9ffefc1fe629a039e89e0a850f340989089df982bfb4c524cac30649e3d4dbb93cbe835a9cd45de74d0d86d23c102ced1a8c65a4c0578a2a39776da79582a6aaef4bba527561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4daaf72f6551695de9dd2e4eae28f07b41c9ec36110061b2152d7ab3729ab44bcf81a0ae7b640e88bbe84e7c412f47337f1d12d37f95b062c539998fd28213cbdf3b3fb8d5121830dc5ea13d084a01bce62f4c2426ea7fcb92dda33a6ec3d9661\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/72de723051c80828a6318b2251cdaf29db2600f1",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705b0000000087b009d7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfff000000004b4bd0850218eb8600000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ace6000000\", \"prevouts\": [\"aa620e0000000000225120787bdd18c6671a560ba1e95ace53716ad824e1d735ffe5db246005d995daa6d5\", \"d04d7a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_41\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f7bad6a6d2dd226cba0787608e7d3eee2683d5a7909f5e60e60f13683f64c2bc84e83f1f3647c0349df7caf22e9d3955b077dfd85e6b923c87826e764a13a11881\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"693ba7d5c1417efdc0bc6903efe077bbb12aca28713ae932e8f576cce2aaecde52fa0395a69333e489e1f1d09eb77c3e2b2be24e101573af3b2d55187035429441\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/72e0280dc174679a75da3799cbb41ffe349f9f46",
    "content": "{\"tx\": \"b925e88602dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2a01000000148d50bc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700e02000000c93381a40114a80a00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac61010000\", \"prevouts\": [\"4a2c2400000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\", \"368a10000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/emptysigs/checksigadd\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"a035aa3353996b17b5f039dccdcec2d19d71ca2c276ab8786d48ce6a773698b13cd0e27b26c902ca1161fb0f4544bfb14144fb0a44de5e11dc4d1cc27bf974a4\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad00207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ba91\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362993ec8e6179853847d0ee69316ca3a644767c37040f1b0ab2fe506df774d43ff52d98203d7275fad400ed3b197c4c0e8622d77cbcb79cf7a2a00d2fc972bf5002f82dbe4a6db58ee88633b3148d57fb2531bfad9bc912f2dbffc1de55c895509f476918f5ef695c8ab5ffd8fe1863125f9680a1d644e34f9ad8af958befbfd6587daedfcae5757dc790e5fd5fc7e5c85e6dacb92622ee4c35b872074113a22f2a18578b4c6324a679aa30a9e18da15f3551b7d2bf7b5529f4cace820b36473095447d483b1abd7672dfbc0cc5c4264ab29836baf9b905a296f16e6d7c4104528318720e482b09cec20c29a01196f6fc121b2f5494846d4028dc1ebe79751ed047cd408e7e45afc1c667eeea2951fa67d23f0c47f336029f3cc34d8d5ee74ae5de2a3f8aaceb3bdbc013310ea640cd38cdfcaee1e27c35353c5cddffee02d66e0ff2f27b7c8a7bbfbc10862c4415251567b33d7da846974ccc2adf2991d8af397a6da280d39d27fbd3b610ad765c3e7fc2a4ee2753fa02407aa98d856b9c1e1f2c5eddaeb8557ce0f7cc7880e698091ab104cabb34aeeeb5d0f57ea86d1ebc555dfde575d48d1eaafa8343c63d6f5425984d2425aca274be02e47a5142e089ba2e5262a94fc3ddd3fb5606be458b593782b16d00ce4762d13e98a6ec8488c560f68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"276d682e2ab430b2fb2b82fd5bde04a0b000be3736bf2157325bfdc3aac5862b717a17470ae448d4f18a8b1aed54ae0015dcd479ee0bcfec6a2892a09dea54e9\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad0000ba91\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365a9741ace787c3ba5c17bc53ff36467ca73e7d39d03d72c6c77f3cc9496b5503c76c6bd7420b2cea4f2928cd085843fc4ee0f453499d35ceb8e5ee9e0b79ba717f59440f4e67fc23aac21c7aacca3721c15c1516f2a9f6ac5bc60d230b02657b3851023fff65d6f40c4a5aacdb8cf0d40cd5e401b126df9fc0fadb4679eec7ea2f2a57b87935eaa4a17599a5b4ec099d7a36236ecdcd81c11f97ca92c8fa53087e6bf8bd64d9529d83870441f7e27274cb99ec835a095b7ea70a5a322cc5d52b423c6ddcadebf58a5025a8cb1ec3b901e96065e689e06d0af72db26f3ef0356de3494b0db6c991873dc7e87677bcd9ca13e114307dc9071f99f39a46a7715d3533a0941f2233db7810b6423a9958b3dcf1c09c67396d8ec9b45a8144fbdc7a52361e3fd655fb6f9a1743e8f45f41cebeee6a97926aaeee4c3f916a47c83a2790053cbc6b756194fb3ede31be6e35ac6727938739a1ae9b6b028b18e770eedabfadc618cf7f3a0d639ba509d355272eadbcb76778d4d1d605237c1cf557850c008acfa6a9da80a755a207eb5a3ad02b1a2cff248af93ddec122a727b43b9e8dbb8b2911ad5a3c4781fcdc9458446cd8039a7a21ad2b04a0c05bedfec6a225c83df68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/72f423c06f55b024fcd60e3acd20f596205615ab",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2d00000000e75314b28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c475000000008149b6b701e48d50000000000017a914719f78084af863e000acd618ba76df979722368987a331533c\", \"prevouts\": [\"713c4f00000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\", \"6a1339000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"a87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8159738ff2c4f90cd16c07bb852218b8a19eccf086ed61d505eed94e2770983c2cd165f299bdaaa06ccf8947d9b12e815a5b39fc50068532880492a3446c423d89e26d26d9f798657ab1642d8194f1f5dc9158412142f65824f82701f20125ac7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360696a8ad49f6bde3bd1da86a2495044ebc8bdff93c87d1dc4e64279442168fbe337e31cedb20dd0ec36f43f7131008eded9387a241f89ca892d220549655a6e95def3d75afa0626f5ab572f3c9ae49b6567bf85ec43d0b3933062a3ad8b1e492\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/73319dedec7db18100aca1acbdf582d38ed80c64",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44601000000379174ae60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700c01000000bc09d7fa046db3400000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f877d020000\", \"prevouts\": [\"b65e310000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"60391200000000002251201dfb228dec79c6e234b1139c58dcf8de3e24a7459acbe9e029f267c6e1783b9a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"8d\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93698751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d593f37adfd687dc0da405a76cf860eea33b50edba83aa9aefe64ccc08331b86a062cab3a6172a7c832406474b8da3677455d75595a690190458c84d19d8a3ecc3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004529493e63f0262db246dc905ef3bca459233a7269b5efdd4093c0b189ca3e559193f37adfd687dc0da405a76cf860eea33b50edba83aa9aefe64ccc08331b86a062cab3a6172a7c832406474b8da3677455d75595a690190458c84d19d8a3ecc3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/733a381bc9e56cec2e4a856413e56d0bb7972662",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127042010000002bb691cabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb3010000006a9750e360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707e010000007fb4f7fd04ef69900000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb3b44031\", \"prevouts\": [\"86751200000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\", \"695c6d00000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\", \"bbd7120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"fd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa4304fc86dd976b0937fa56c41f386d806abfef37789b2eae5a350cc5f24e0b07f4148296d57de26c46202ca6ca2132af69ac5e2240f6410455c1127b810a8937\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c1b9bacdca57d9824556224747bb261aea2ae7ed0ce11a73241cde6387669db02c6cefb1e181eefac563b15a866f5ecfc3c81e54821b9e81f79abce745f7d95962d72dd1cd8804fbc0be1dcf6a22214dbfb5210e6cde6f2a41edfb954edd50fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/734891576e6360feb0a79e5f6326f4a0f3310853",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bf0100000078d86c1b0145ec0d000000000017a914719f78084af863e000acd618ba76df979722368987eb020000\", \"prevouts\": [\"fe973400000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"737d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a7cf13551a0cc26f1b867240faef9a11531fafe338f01dd82df40bdec0900967702c501a2f323d94577f3c4b353be8e702d3f9991edd341efb02c3132264010bb33a63f37675deadbbcd666ca6b38ad7090050f3dcc6bba45985e955ec185c53\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ca8610289a1fbd8cd81a98f9c36747bf01b158efbf5089bf299485f821bf6f7f55519fad8d6a945f0e016807e9ea80f240f92b51e0c4078917dfba5f2209ef9db33a63f37675deadbbcd666ca6b38ad7090050f3dcc6bba45985e955ec185c53\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/73617507f1dbe680e93caaef1d078ac92ad846ba",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c429010000007cd02a6701eb623600000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac64ba9355\", \"prevouts\": [\"c2a640000000000022512084127e09a3e5abb8e6ea0ba3ce4737d1c2349f1be422ff5ce1609ab9b3fbb01d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"ef7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361a06a52f87096620bfe5973d93b2be2652521f7b71c204e6ee336f5bff2f8e5582a8da46561b857dd56ed73270ec2a55b69a5f7c1db8df98b88468b2be2ca2b7eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac8ef60344f111a9c34d055af59cfd42b130acbf4987ee3354719b7c9974e4d449\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363b6bd5f9b965c7c7d639d1aafbe3f4870e0ac5697c7e0e93783e5267088edc7c7a25236fb2b0caf4a960afecbd8538cf949b3ef5b854c8fdc156128073078e11b030008666d4260a12bee868d13ea953ce9c9319f2222d8e8469ea0b912b8ceb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/739b15f40bb87a9e4f1a8399ce654d068bd0d30b",
    "content": "{\"tx\": \"de79ea5102dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1b0100000001706ee4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6e0000000064da1f9602df27bd000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d8020000\", \"prevouts\": [\"a8084d00000000002251209c5a589e416b2bf8d886ac38373c12ee12085629030d3f34ed2b7cf34700cf85\", \"b2d1710000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_keypath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4deae274edc8cf58b4240480f46ea866b00c1a550b4c565c4cabc660970a0270abdeb41e3c54dcc555aff4128d30703cac10c2475e4029217b38601ce47d6ae0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/739c724fbc1d946d981066a3f82cfb09a034ba1f",
    "content": "{\"tx\": \"8724841602dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1b020000002b49f9e18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41500000000a39d908104476a65000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47873b010000\", \"prevouts\": [\"ffb125000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\", \"e565410000000000215f1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ae8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93649df6e65f74a1616f8b796c28e27e3bfd060faa480f7dcf522b455914aa3f7b8f4bc19c05a4ad9ae05992168d490013403fc5515955a55899592aa66a61db799770b862ef93acb6091cb4ff8ef135b3065b278142aa4adab757f952a626e2b26c80764b3c3e93e4958bf58fae47a07e6a3ac966c9bf86a1c799b8570c4674755\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360d3987bd803fccffa941cee4c647c3a6675599cd3c733dba5d2640e5418dbaac99aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4b4e321dfd5536232eaef67cd7779b0e400c7a17a369dbe44f6d3cf0436c0a34cc80764b3c3e93e4958bf58fae47a07e6a3ac966c9bf86a1c799b8570c4674755\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/73a2aaa511c3c79634f98183fed1aa515112c30c",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e400000000e43d3005dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdb01000000dc21dcf7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1000000000413109ca01c445280000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fca4000000\", \"prevouts\": [\"00ca0e000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"3c28250000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"bb275b00000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c57d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93627fda090ca9180dfb5a3d6eb89a34d71879acd8ae0b8ec415ba4fd7717d6a8ba4a4f1964bf857a391dd30579e6c45654815fe99168eae3a652a179c44e1715327def1cc2232d9b1ca5244635fcf6779cb15e82fb856baa2ca11d8fd1da35295f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0826d35158b06e93427cedf9700445f423da8a62a86b9572893cb3b0c5b8130f93e00378a892e4dc43a17c9ebd71803200f2f24c9a40c2827c304e59be9b4a7df0b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/73ee1a7d0acd1f7e6a29e2cc9de52adf757c34f3",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700801000000b8b76795dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5a00000000f6c7ab86017eae1700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac00030000\", \"prevouts\": [\"cb9b0e000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\", \"91a75000000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063ed68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93630b7c2d4c1b790332bf4ebbdc264de6d20aff90470c4eba5176f312f66ccc9b0d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51c9b0690fa0521f4fddf88c65f69e0716898ebb5a52dcb1ee37dd2f34a8a99dbd71d4983925d18ba40c8655020b616e094614baaa1bc1b56f6416d7610eedc4a1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936777cd695cd6aba6282d5f8080c91c9295c817959fd1278b1f2c6fb3d2abee1f43e4c13dfee647a17f9595e8b3c65969e7c880cfffed6449fdebc16325bda3bb094cc415af9f84001a6feea45646803cad285186914838c4558edfc97d3166e78fd4cde6e083ceefa41c970e7ff247f88d4db270a866c6958487024deeb358702\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/74033d1959e62921897648eae99b7576a518dcbb",
    "content": "{\"tx\": \"c10517cd02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd0000000008c471e8b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49a01000000bce4bdca0378d8a400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d4783521\", \"prevouts\": [\"59bf6f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"536637000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"be4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a4c9baaf460c9b08d8af0a53251cd8db921d22667fbf74eb915957e4e9d1c209d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51f60e2d3154f769650886384bb096233f0069490aec77c98efe910f3ad816f81d7a9dfad218b10cddcf05e9e788f58784bb5d8eb58cc0f6cfe4d23ba63d85e381\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93678e2a199559b583075ea620e9a27812bb6f07692e0c8149045f4c4859f098adbb388de3dfefb2132719c310aa79074581b330ff4b72041fe2a3e03933132949f61eb6e6fd21ad84d93c7a0474b2daf5b011002cbe34781a2a14a95ac7c4e00ae344cebdb8ecd56ef01fad0911d9d88482970ec36d3a04b84eda7f5b5c68ec938\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/74068e2edea30ca07fc3d6536b7beb1e73610c5e",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705a00000000b2b3b0d302b7360f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc72a000000\", \"prevouts\": [\"d0bf1000000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09020544eeceeff632bb6e519e5549d9b5a6e9b634ca09f43ac1c130004e4c23f1a01a32ef677fe7324fdadddbdacde92f5baab4445e85cff3eca3f1163d053bd9432af40a863d65d7fac6059ae5642cb933c7992e619eea75364fcb04ea95e7668ab3374b308597badb6e427ccac499affd6448ba29ceeaaf7d210f4593990494ae6f216a12dcbd590f574f3cf90d417e982fb239bc3525967f97f48d94fc9b83cc7d99862bc7a2342c0c591f5d4063df53c764e5e181963daf496de1ba07f5359e71a56cf05731ba73f7a81ba09f0bf78a6e9a50e7df44dabdcd6980de8fa7f709dc14d56f699e0b69a2a98df9e06215741794938afe48d8d650c84a052f19cf0d77ffe1bffd0caeab8da2d2283ba3e9e50fa4520207732252b8be333baba2a342ed47b1d2ffe529ee86635d230a9ea2efe215a8f9df75ab72095434e8f33e29a33e4508ccd168b9c410c919ed4b158478104dd6339bdb9972401a69a64492995d733b3bc0fe121aad9b3fbec71af7acbca077fa757f4f7e9e0bc8f4cf9bcdeb90d325a7c66716dcf949bdf6307720a3eab6a00b575d525575f8430e9f436c81bc43aeb9f771b0b9288461a171fdc5c2896ae471e256f103615d9015d0b20248e888f3917deb2d68a0e1cbec38fc57390d2f42720c0a674b24a46d5c6b1f859f33fb0bab19d0e0c4168ff13bee3f7065321a68087b3816f2dd6c17e528187421d855889ddd172fd53afc7586\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93629a4cf536966159d361460fab7b3e5d8cc5d596b48cf3118556d4193e0f355519a49af0eb7097a2b25f70d75fc7fd7c267678862dc5ecafe442b2ce2fa2401f5a112aec6b4b8b5b1ca7f36a9e0521bdf2c7802df3cadcb1e8aa67d830b4a0d3fd33ab5c29645e0220ea4ffd8cb7e67404885cb8b0cf94872336c7b06d59c3124\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090250f01e0b8d9ba2d86efd14acbe327dc3bf35551da31875cf846de2653ad21bbbd90bb3e7c95de0d4e3b2ed7cbe51f2797fca07a39eb6630aaf8d2dac2cf206d9c3dea424b1926948e047ac6a4f489c50a7f40be480fe99f8457b6fff735b05d80ecb631f1b2a715477f58b3c7208ece3b04995ed905a78df6c5d06d619dc10d403f04b28c9ad0e61f9bb58430d1237ba9200561f3a41d77c8030f71284edf78b43f485ad7ddfb9e7f94a69f7e8fdaa55f9121b1a06e30f479acaaf0a69367b5309afa847d2f62739e97c537bc4f784170eb8ec830db268e25fc119cbc1cffec39600f45f513d9d9f3d532affd3ab936fa5275d7857b33c27b95d28e33444bb5a60999a95611e2c9c1bf8889f872316fa289d4278ab21c4ab56a752be5ce9297e78a47111e797135af130db01e33a1089944878bb7bee712cfd5e217d58fe34d43625523be41cfe75b2e9fdfdba2757a3a03751cd1468d87b4cbf79ae6fd1ad783649d0a5c022683493288f5c8b210b05452d5ea78f9a703a617cf8552d4f7bbe35f07a20417503c58f318e606012e91f6f8ad8bc42f0cc103b8080653f662557b9b8fbf9e11dd17e329d7e15902d1122aedec46685d2a9aaacf46edce4be90c70d74c71e1c362a9a1f653f02de7dce7077b2b33f90a321be48c690741912628028abdc99aba0863099d0e4b0189c3434d427b55e2f3def90b99796f78df91997adb4519ee24b5718a47561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93656455b54c589ad33b571e695863e621bdfbab9d554d43b73aa0458e592a0e805056f60ea686d79cfa4fb79f197b2e905ac857a983be4a5a41a4873e865aa950715c685a6e20a464c0638846c4feb0cc1ab19a0a1d3cef03660e119c827d202a5d33ab5c29645e0220ea4ffd8cb7e67404885cb8b0cf94872336c7b06d59c3124\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/74077dff1318da9fbe3c8ecbcf570fa2b161a310",
    "content": "{\"tx\": \"3980379002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7f00000000bdb16596dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc001000000f9f628ff01158fbf000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a68a000000\", \"prevouts\": [\"b65179000000000017a914f955a33e905fb6c7b7e694c8cef25993577deafb87\", \"68725e0000000000235b212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"dd847f17abd19500624fb671cc44dc06eb3fd029961806af87c7fe856962bed3c2ee456c83fdd6f3cb50df3b7efd2dda87b00a3db6ef23b78fe45e0732a40b2c\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/742166e63d37f163f9bfa53c3d1ca1c432028519",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9d0100000067e4a0f360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701d0000000088944686bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9001000000dc741ab4037f16ee00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb3af1b32\", \"prevouts\": [\"de725e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c5840f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ebe5810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_84\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0e909defcefc58cbe5d6bdf423b88960162905a00d86dbc26073abb85e0493652667a5e8ecebaffc41bca6c8bc95f9c2f03e4bb89aa1dbf27e3a7a4399adb59181\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c048a583d15a4953ad7ad44d01a147f619065a71c86a43a0b7887740bbe66d7d1144ebbbb0295b3245979e179edd2e80cbbd1137e2504394e7b843722316117684\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/742c9cda5fd595f2f4acc988670128b67aa2cce0",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705f010000000381a28bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfde010000001fdee4ab01e9047600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acdbd92745\", \"prevouts\": [\"55c40f00000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\", \"cb836e00000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3044022063b92c108c0a3b1ca0bd9f5ac2b553e68f307e72f55338a3b9ea2bb70adbb68802202eb65b655e4e689d91f50cd16fe8225078588b23d2b77d6489c88129fec986bfe9\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100801250364f0bafd1dc0f50226529e275c07eaabc3290c69b5c687faa8513bcda02207c72eb10d0c3655e5570f5c4466ac3b2d22b9157682527f1eeecbc5ac5be4512e9\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/743bd395e890e120441210e9d92579d0c7fd94d9",
    "content": "{\"tx\": \"c37ec3c302dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbf01000000556bab88bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc10100000073720da201fb286d00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acdac25b29\", \"prevouts\": [\"55e22000000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\", \"e2aa6a00000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"807d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93605d69d8562a6373f6f9d195fc88f9f90dbe0e07cddba6bc8e429596bb29181bd035ced5e3ad5845cfafeba3c70c2f6d2785016db0dd7771d558e4afbfe1a1e9a3dbbf3726cbcb24bd9ee344fc88539efd23f46f5d6cac68dd1bf47840d55ab8c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c7ef0a13ce9e71fa3d63dc84aef012cf9a91b29c00460432671c98dc081a42ec3f9b6f826008f58b0a2f0424fb9eb1e858fa037e128d89da74120b3f1d2e75bf3dbbf3726cbcb24bd9ee344fc88539efd23f46f5d6cac68dd1bf47840d55ab8c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/74433925d2da6bb3c3edcc954a98eca9eeb57abd",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4160200000022cbc59f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700c0200000019f988b38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46e00000000d2570be0027ad87c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc70deadc2a\", \"prevouts\": [\"d5b6320000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\", \"59ad12000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\", \"5152390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_1c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2e958cb393e98ed3c7d7e58b731ec756001a1b0a116ab033516fec055e8c3376866d75f1809ee05c97e44995c782cc8ab8cada6211b947316ddb5e564e7a8b5682\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9b3462788a7eb84137936bdf47842dc926c6fe2d4178145eab1501246a50f9a6b6ee8b7c329694709afd4aec03c85913acf1cf65de2682aa26ce1eeb93c39e7c1c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/746569f919dd66a45ca13b1e18824a0afdb22d9e",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701d02000000cf6fd6acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdd00000000770059ed60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270030000000080b8e2a304c1997600000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5997e11d\", \"prevouts\": [\"a72f0e000000000017a91481d4142ddc5ce7a3de4047bd48b623419b5bc45e87\", \"8cd95a0000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\", \"ae2e0f000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"21591f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"d5729fe5beb15e862e97824b3e77f62d547e4d7dfdfda48f0f1db8021c4609078bb18be07093da3cff1e66c20d1cec450c766c8f7c0063c652f35c1cffba5332\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/74685cb831119333da8b5a7c83e055eedbef944e",
    "content": "{\"tx\": \"e4ec8ca402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0801000000348e6ddadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b190100000032c930c80498cd6f00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8700000000\", \"prevouts\": [\"3514520000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"71481f00000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09027120ca60f6b28613313f39c76138c923761a185c46cf92000e57fc4b698b9717265802d1f12654a882a5054470f5c83ec5c2e91bea44ac31292c7fe96ec9fd38eda7c4bb92d1a3b27ae80880ffcedc19f4709737f153d5fa2c954ce6a6e80990bf0ca1acbc35ddba8937f00938b737761384e04aa584745d90c9ee1df2768524a2ae64d2a311fff731f5ac8cca6f4241edecfd74eecad37be56edc2218b55af7849e9da340436c2b0d5efad3f27acd961379efb7ab58696d87d391f50b3e518ae8576a527df7df42b240c1a6d10f537b7c9da4f275174aa30fe0eb1087b653ac217a2ffd22df3cce2bf77c2bef6fa46b37a544712632a115b2c2257d68046dfac04322a24bb5d4779b8e9b9679fe1a1404a0d082c9f35d4f4be172fbb23b2ebb02237d42011eea906d9a36981142ad290e0ad2c601daa8e5d0d3f07fa77ce40f4c5a8816f3e6787132aed37de61d560c68bf26141ab07a45d2032dfd6e4028b8df1d66191e97c05f294b1acf8a1cddc689a7177fbdef447dde98a59ea6425901af736f212b7df9340d00333434347e7363c84022cbe2aea627b8b3441d5df80e099f16da892f6cad2095774ebff83fc960ffec3a04a5f0612948e757a380b37526599c62f3dda82f7b54b0df99a1f03e26bf7cb9ee7bf7e655b07901220b1b2ca7facd5737b512c557060577656c59cafbf55cea181c25639f3b9ee44fcf7e15df61cec944ca229cae75cf\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4197eab9a6b3049015e2aeaa64734336ddd9b9acdec5b1d6588bac0b5808dea8f5f88ccdecf77b0d26ba8d6f3209049de9d03155be73752c3625590c2269e1c4cf4a62e14d7fc4acbfb0196ec29a60565ac2b3043dda4cedec8cb1ff291b90d41\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ab481f6fcb9aa5a8e5f232f5a4c42e63bd4b4802f85f765c4f86b3642a96c4b2a29ca3743e82c49dfc023531a9e1a9475e798aff3ca219bb15a1be92e22fbc417ef9dbb625a77c4722a06c91efb2406f45141df83a1eb2e41e02e0b5ad437665b491a310c476cf2aac20179a28bb9d37a8a3755893d99bf2f9bc9095ea8a8c19caba0c4d2a91eacf2d641057b4190dc1d210a1300732b6230f4a3480fd73273c893f9882435706ae0782447237c2e30789e5d87ca4d8c07c59fb055f028ce24b4cdd4cbd5c85b799e969d8c7ea511b2090e3755baf4f850831305a4e7f913df06d5580753ec0892f14fe3b9e24587f125a6b3a6e70291ed7b81ffc9a7a4187cb8242b11b1fbbc4f05142097e7b356e745245f2a2da045ed56ad925b2715089d3df0c2864c46883557be0c648fbcdef7e68aad34c1b9e84a53b562064a3b5a356b93af9589779b0f36c18e3a0c6b1fb11712cef253005ddc34e7afd95ea287c2a72c3e8ef8fe04df9318ba6bcee74b64c61197f21287e94b2c47c16c007be81c0881e38996c7862fb9d546689b67b000dc11eed6996fb2648f6df01ba8ac882597887f4fd10238df4de0a23d4aade84604c050b0f84fac397a0c89d7bd5342962abefa8be4ab1d7adea4743c27d67111e42ef63cd5c91d1e2dc128c07ffd88af0033a5aecaa2f1dd4fa21ecf6d56e44e6174cebe10baa70892bf2d48a57eb26346fc1e815caa29b1d6d7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c43753bef0c8da8689692db8eb397ee477bb8335164dd3b4990f2dc8206c25aee4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0decf70b79dd1be85a38988f8929e7263abb01bba95965800009381ed351eddb0fa653bf1dd2d82b0dcbd644d98f066b9fc3e48690fe18b2084515352f558033ba\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7482f850ee397dd25bd1687e64b7eea626e9c608",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf49000000007d987b7260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270eb000000000aaa262202847d7500000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac22010000\", \"prevouts\": [\"8e0b6800000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"b7e20f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_21\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"63f4c2e86b6fe02c3cbebdba369c949ad42dc874716b6ce4002d023bea343f477d4977ef3779a12efe8978ada7ffce9734a9bb7c4af858497bf0ad7cf09e953803\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"93805f4e0934c879021dcddd54d0ede409773e1c738114880dc32467eed12740a2a5fa06fb3b0991fec42355c5ec5bdd5f6b3db166fcdff63a48527993867cac21\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/748b5f0d6e2f9fa4665f7445654524ae50ffc8ad",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43c00000000668a0bdfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc300000000031806d602a2158800000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac11cba52a\", \"prevouts\": [\"b5fc3f0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"d02e4a000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_cs\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9ffe67de9dfc53c440d6856eb082fc36ae05a78663903eb9f7566ab675ad287bc42d3024658ff9b9b18d72fad23dcd3a94d0ea21bf38aff2d8bdb73593433ffe\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9ffe67de9dfc53c440d6856eb082fc36ae05a78663903eb9f7566ab675ad287bc42d3024658ff9b9b18d72fad23dcd3a94d0ea21bf38aff2d8bdb73593433f\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/748ece6f6568749de6856f4e101f00d04a22d979",
    "content": "{\"tx\": \"0a05db0e028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4230100000039d351eb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707f010000009a75c1ee016fad22000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cdd4d843\", \"prevouts\": [\"852c310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"2f131200000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063e568\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bab5e9c9c7fa88158bc6151e5274dedd524a29f558f8a01649a3b2357052ed1f8cf2788b31c6a31a23c8dbe6ff03f22a1631db08af18d9e87ce7bf14c25a50385e7270ac6e52de2effa1ad4f1d7cc04618f1a83be30b0454843cf6016e9cc3658f009f53a1a3347386cf74e6ce512c14e8f46a54e4d2c64fe3ab77cfdd670d0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08239f0e83d2be49ca995d97c64064bae5b8c7dff64f3bec17af779836b699250933d2e072fd8e8376d3a54b2bea1bfbfff1298aece70c0bc2934c8eaacc3044fe58f009f53a1a3347386cf74e6ce512c14e8f46a54e4d2c64fe3ab77cfdd670d0b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/74965c4ae1074a7c5d80f0889dda62db64f0d7d3",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709d00000000dd342c8a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127014000000002d192c0760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d00100000015c28620013a9a03000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a600000000\", \"prevouts\": [\"6c730f0000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"a76f0e0000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\", \"ef970e0000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"487d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361b6bead8fe288e6ce929026c6989676110fbb022d60d8870f6195026b963435337a3a83b36cabe27f746cef99f5e6f5a048cb284627a25ce795acc8b79f1d63b4d178bbecd44a62a975bb89c44ce69c4bec935ce63261f4a792ecb896593fa3c40210bd7db211b82a407c19f9567cde5a01f8f2a3c3dc032c7ac21169de78447\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93665d4f284dea934ff4ce7884dd9c30919ca3bc6361c3511237c2fe9a645a7cf7afbef2b09bb3fcc5f7a097fe825ffcbc345a4a7607f02adcd9241733378f6a21f7da89940c9c2be3d3cb1ea9fc374137a74dc3bafe909c68993f298761996d666\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/74b0040c6bed65b152921df24d1d78125695306f",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff2000000001c75619cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4900000000cff75994dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b07010000003c029216047236f3000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8784d7ee4b\", \"prevouts\": [\"ac7783000000000017a91408247b8d3db4e641d0be1ff23f14280256870a5187\", \"06404d000000000017a914b60a534933f6e50f3846e396b9868efc9e681f4187\", \"4408250000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"4a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93627de835b8fd66a06eb530d511ef26a01c76127d8d9e29dda3bf7872ee1dae3c946c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faeebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac749e2a390543356cdb3691ba8d54627dfb45f7f1132e94c1a4e909f84f1614c2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93661eef72702ef339b2bb87603a397e70b07da9997acf93d66380977d6359fdd3deebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac749e2a390543356cdb3691ba8d54627dfb45f7f1132e94c1a4e909f84f1614c2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/74ba2f22626f43b6a2563b0cb35c620433682d40",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270dd00000000e98bdfcfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8a010000001e3b31c4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf10000000006ffb29ef043b09130100000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd0000000\", \"prevouts\": [\"f1ac0e000000000017a914ff6a0b1cf86e786bc6de2387f1927f71fd08cd0c87\", \"cda7830000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\", \"20568200000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090277e046b6bf46fb9432b295afa59f87aa799c05ef75516949187963bdc7008ff5bd7ac8b78c16d5422de50893d9f72b53ee28d433178a18a419d2628955bdfcdb5cf517add5bd02de201108a36787987d54b49be934373ef8619eeeba4551fb1f108e22d1842ad5fc956b406068687eba97c2cfed42c9c35e0c8f6a7b9c793cfa1890697d4bd403d7e73cba15c8c0db317096afb05713f74d12abedfb8c357a7b007246e3bdc98398ff62271301877d16260cf3f87536fc0e2f33cf1b35058514ee567ffe93ac1649f1a423f7fd8576e10263cd44e56752849437e1948bbdd491fd4caa22c4cad0b5fd6753d703cf8b7c022e2cf995c0b4eddc3e4909b660674c96a2c82327cf51cf75896799fee143a39ae83611e10c9aeace4d5add85acadc4ab10f3154f5d1ed34fe63ead7894f9820adb34499d6a4e4b03a0417794139f90c5d2653246fd282679cb8995f240c2a549e0c6dfa744abab426d351ff4040f2cf39da4b5616e71afba8e1d1407f54fb6226037bc287b40ff329edab0bcee63c964e4db36a68037204f6e627a61a61dc9d1acdedaf30bf0647fe8e6ff0427b596c4087c76123798ad0b5ac5abb30a30e79c997076500358fac1598aa3ff5a8d2b91f372dbdc561452241ca601e8ba3fe6753c1fcd35ea85825c1e81dd38695c9f24d235aff0084551d88b16a3caf65d3833910ef718d66f6ef5c4822361194c22fef841aca19684201575\", \"d07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eda52357b0961fdced6c3795a6a09818322ab10c7001337037a8d029681d8b6eda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e15c449093bd19eda03bff23881ea6078d018b9cd0ffff6e12447ca822e876d277e36b196311c1a9d305bc653889017f46f4c4934a1587d131a83127df4466fae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090210dd75754c358c3462614730f8fd667c8713dd1e9e6d27696b1f1277853c1c47bf15739a3f3b30efdd4a843c49882223c4822d94d60498680e22d0721edebf629daa84e773e6937333c6330828ee71a92f0b008894b2a3a6722d69c5d423f9228118f4835f3c87b9586c3544d8d296a516d2fd667319eb53e8ba9157b10081e7af413449a44e1df139f738618391e76e960c7c3f4a12688b12531353d92ca07d25281d949ec03fd791d9995526739521e5061601236a8204c56707d8a59b82fd6014635a80912d9b4332a05642552204855bd801d21ac1cdf4642e3fa826cbede07ed3d26812ad85d21e74f58a2a2f9ec26aa6ff9ae1cf0fa3688de5b71ce4bc897c70fe80711833ef90058acca215c1303c93036a2216718a426fcbed07e2bdd5691b33073ead7dd730b9004911199c3045382b4daf8ae7834cd7d9685eefe46c5d1d958ad3cc72b851bcbad4d51bd7501a67fb7672d731f9b53d9410c0e76db3578bdf68c2f1348ad5aa0308adc7c07656044368aa2270429e044d8778e27dd8cc409c8a1a754f3723bd8b6704fcefb6a14c89bda0a536a1b60559033f916e9311c24656fcd4f354204ebd61df13ca591de0f55e8b88e73e16f282084b4f2497ede6963a143a088d1a67611148cce1d37cb340b98dd2dbec921b3651190c7552e63b36c929507bc79fef294ad60f51ee8083b99bb1e8adc86cbb05c39f28b69cc5c6735027020e8375\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082ef78ec8d95f7a630a87f4a69d09adcdf12479e6b3f8e7304927bbc129b24d5867420b3503815f4c7b180839898c4c4aff0ab6ef4d8b082708dba105a321f7428\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/74dba0abfcd70931e9e189f44c9fe76cb1cdbb0a",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b4010000009fa83274dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7e00000000eee18aed04b9ab5c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acec010000\", \"prevouts\": [\"5a6440000000000017a91495eb8fe3d959e08a2cc279c1b4ede1921d14a93b87\", \"fdbb1e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2257202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"ee979f36ea2c02a592926939e3326dab1625c9106db43b47b5bb96060197b48c55035cd0f9b24ae1f3588780876fc9aae0ecec5f2210ee85544970f15a2340de\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/74e0dd99e051486e796a28c6482f0b52f0af67a1",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41f000000006b0b55c0033f723f000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87ab000000\", \"prevouts\": [\"cd0141000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"473044022049574749461bcaba97ee33251e5ae7da21a9891faf2394a14e26e9c1cda04af50220722a83970d53cedfa8506b95a2da4c595d409e80998e553d45077273bacabd37814104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"48304502210086010bad88a9aaa45b2b005071cbe88af385eb08e0af69a32db43abed8a304ca02201f4b320384110796b35f03ef451483d2fd4ff9e27c98f53677dddffa794e7f93814104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/75255d425818aa4e45fa7a8ce30896b30e5f57bf",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2101000000cfe0b1b560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701701000000d6dee7570105fc0400000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4c000000\", \"prevouts\": [\"48997400000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\", \"60ea120000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"327d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363674d83ec545aed04205f6c8011bc6d879deeac8bfcd4272e2d7b511be5f791a25d31a4d328a06fbd663a9de03f4f743ae6731d946a7b64875ecbfa9fe5ecb492e4cd18b5d1ec472eec5a95c6c9d67ba3848eb933b0b41a8c6d3176a27b07997\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac0f29a0308f7dd1d25542f1a27a19e78219e8b2987efd922e316e5388ecd586b0246b7a5461d23b2ebf642f7df88e05c9d62107f66abf7b5f94d7753ce57b53620e954adb3b90d8c3597d54022d70f5af7b761a66be618c54dd56feea2be872\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/75362838d1ed152f60dc3cb74924d167c1b0fd2b",
    "content": "{\"tx\": \"c6e5ab7401dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba9000000006a198ac904d2d91c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478793020000\", \"prevouts\": [\"9dee1e000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"267d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ed3613095503852f968cf254efcb9d0b7a7155094671c0665bdc16a67bf9a23af91e402d116972020cc4db8f7e1431e7a7416668817d422dd270400f40dd8d238\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361cf75455252e12219cb13ff880bc28451a916c621a385ef21679c99f872f6341f7219e5458c3fd087680f56af7e0cb5a098c29a419645486255ebba5b453a7aacd4c02f64c49cc162ff9325daec6263c98ea78a2c5346e44c6d55d79722c7edb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7559c841c04c474bc9ff45fe8504abb5d4e8f57d",
    "content": "{\"tx\": \"8724841602dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1b020000002b49f9e18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41500000000a39d908104476a65000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47873b010000\", \"prevouts\": [\"ffb125000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\", \"e565410000000000215f1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fe481de0054653f6dc89220421b81205d1f67dc9bf372464b33058d3f36b609fda47be226b9e2c17f1a76095a66ef57d64048027692203b62e8260064c28999c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/757adad4f7dd459070f4f1b1f4f4f2374a57ec6c",
    "content": "{\"tx\": \"a117860f03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc701000000bdcfc3bfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5600000000a3e6ebc160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e2000000008a5cc9e102a66ab2000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7d1010000\", \"prevouts\": [\"8417810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1a8a2400000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\", \"27c20e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_db\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4cc2c7023a430a883c4f30c9f42ebdaa1aa7c2932b51bda841d87bccfdf05e6468523df06590868d0ba60d2d45be07ca474c644b3e52d61d00e7eedb1912625082\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1dc7edeb9c04f789c631f77d100607021302f58c78bacb3b7097fac0c17fad76e0b3808c65096c821ab6f6fb5f2a18be1b415dcefa06ae3611f4fd666fb2132cda\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/75ed237efa308c478c8ee1faa516c94e45f17495",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47e0100000034d6f85adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8200000000012c3b33dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1d000000008f19ffce02f518ac000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987d0010000\", \"prevouts\": [\"baec39000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\", \"d7d2500000000000225120b982c4866c93df3772712b36d4336b477e2dfe66f304c80c21f6bc33f20b8495\", \"8ecf23000000000017a91418261fd2fa0b0480c86b918607add1dde9f7026a87\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2255202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"48930aaa45fa2fdb9010214f5b3d024c882fe1cfedbfdb0bb0e749a4ceda95a6b7c7e36ee19f4b85834e93a81fe9f6df72c1cf673b443ed2431e18f758f3ce5a\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/75f1856401af3c6957b627bba156ed076e49ef5a",
    "content": "{\"tx\": \"ee452a9b01dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2201000000f780eafd011ba61200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac4c010000\", \"prevouts\": [\"0392270000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_64\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c13b367e48558707f232e0325203b68f70aab6a4d20d4867ecd67aa7c4e5c731e84cddce8ef781dba48accf56b0bf6b4d3d96240cd50e06d65a38f24c59f7e6082\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e6f210916038ee5faf17710a0f9f9798c135fa34dd30f72de516abaaca2d9c64f80dc4750875dca324c6a07d47f0ee50caa84974466d68868f78efd0ec10280464\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/762487d62765bf58b6c712ce69edfc2a9d91f23c",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709800000000daf956298bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45e00000000b3893e6902e64243000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e740010000\", \"prevouts\": [\"4038110000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\", \"f0bd340000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"f87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cd6beec103bd564656e486a3d8accdfada5c9b845f4a923505854c0068c70f9c9e87f1230a4dffa49f76a6d91b3ffe7dc371ffdd064326b56030bc36a92eabd9a0f16f4cfe8b052d74bbe565102becb5d9831a57baf41b6ebc95ac4a46ff7ed8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e6214fe237ac2788af17775070b6b8447de06a17f7a8c679a51835b9edf50ef76a44cf4e9a2100eeda9c03b98c53803fc7517d02bc9d83cbf3bcae8bb7675812a0f16f4cfe8b052d74bbe565102becb5d9831a57baf41b6ebc95ac4a46ff7ed8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/767dc9730435e95ff0446a5e08a10843c28b5e4d",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cf00000000f88076ab01307b070000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc6f020000\", \"prevouts\": [\"793e330000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"7c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa1941f75e5ef6b91990230755a95e91c03e6de7762e861be9dda5623c3157397ffd5e8f79d631fbf207b458b911c1cf4efab0aea5316113aa9c93bea92caa9fc9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360caa8a549ebb1e902e0f1d1f46675540fab11c0d150014a35b1dcb4da9e7097c8742f7aec0ae53a52a244a2c0c214837ef2ff67b990e770e70b44d703b0bde01fd5e8f79d631fbf207b458b911c1cf4efab0aea5316113aa9c93bea92caa9fc9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/76967f9679742d07c45801b75cdb5ec88f3ea2e6",
    "content": "{\"tx\": \"62db20530260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b30000000059a62bffdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8d0100000072c0dded011a3b5000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac4c2e7253\", \"prevouts\": [\"f1091000000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\", \"c7f15f00000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"d07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e81c85c730685924be02f7d46bcb10c9c474c6189388cc381e7f7055dcad1cfa477e36b196311c1a9d305bc653889017f46f4c4934a1587d131a83127df4466fae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b0d5e55afeda99172050d01357d6d8287f4824ba4286577d269d78bc9373ff36ef78ec8d95f7a630a87f4a69d09adcdf12479e6b3f8e7304927bbc129b24d5867420b3503815f4c7b180839898c4c4aff0ab6ef4d8b082708dba105a321f7428\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7697ccd8a0cbc267875cf87e7ce982f8dbffa82b",
    "content": "{\"tx\": \"2718af9003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbe01000000e5a9b0d4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7701000000d487d4b6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7c01000000a122a7d901541e3f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e1010000\", \"prevouts\": [\"436e760000000000225120cd69e6502803f0acddd51df30ad464e69e95dcae732a2073690eba6ce00d0199\", \"a2f375000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\", \"0988520000000000225120a98c6fc01fa4c9d83199250e6e76cd0e9fc22cdfbaba8827d6d131a9d8267c4e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"304402202d7eb41b6e60bf733120e010d292433a057feec2cc7a5fc84c2b276461dc325602200615777448796abb85280f106b4af2c3e49f053aaf847fac06d13f874035c81d81\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"3045022100d7d5ea8cbb8b2c64b33217a89f9bddc851bd242a1d802dd08a314b665479c13102203db82ca0415d06d4e8f12cc07445f43169455fc7af14b91ba48398c0ee28569681\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/769cf64713d5676b0d7823f406502b750f29f48a",
    "content": "{\"tx\": \"c273581502dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf30100000056f903e4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb901000000a48e00d50318bda000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787f9020000\", \"prevouts\": [\"c6aa49000000000017a9148fdfffe253d045df4a2985902e5465482e50374187\", \"da125900000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"047d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e84030e911897c6e4798122efc4265e48d96402783f565c89ff2a62155c020859d8460181b685601280cbfaae0e90478ea5ae6fea73a2d03f5a79a14a3e0c6d503\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93665f2789c044d6944fb0be746f461fd1d8ebe7179986f1cc1563b6f682e3c1e51e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e84030e911897c6e4798122efc4265e48d96402783f565c89ff2a62155c020859d8460181b685601280cbfaae0e90478ea5ae6fea73a2d03f5a79a14a3e0c6d503\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/76adb95f40dd46b0cd442f82b7eb70ed237f1676",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c9010000000264f714bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf53000000001434957104c9c89e00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79635000000\", \"prevouts\": [\"8db2310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"3ae16f000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_35\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e464d0cd9a97650724c91b3b02001772134e34f1e4ba7d063dd205525e0197395a67b7a026c596fc600b464560f8b825d539f59e70c4c5469da928d42a777fcf\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"26822854eb5f3ac6826ad6a345dcf6faba210b3fe719d913b14c54e0d4c0955c11af367a70a5f7c383a3779cdf0846c71e6dd060eabbbcd85c652136fb43ef8535\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/76ba7be2b975f49a68b47d255757883a4fe65358",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f4010000009c66389e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a601000000edc649680396c34c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acbd5a055c\", \"prevouts\": [\"012010000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\", \"89513e000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_2\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f68fa9407bb9c6c147d0bcf5b59479a1744fc235eaf3f2d82d3a681179c902382a8f1302caeb069ade2252ba144b15a72015e6aee0577f7b247e01c10f879a9e02\", \"501e50790708f3c0d8f1b46f37ff1084b6a4d5423da1665f3c27dfe8224bccd17e478ce1444c4da453e399f233e7c7d2668ab1f6ca02ba9ad5b2496606704a6748265ce43a0316ea3cc86819a9881b08a8220ecd8184d9229ee69552df464bdfbe7d7dc2fa3295f277d9fa7e90525a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"187a22eb65a90679e9f31119bf2f035f76258b190a612fab8f156a375bc1e08e25ec5533a534f2797e55c9aae494478e31a07a1adea6c1574ece4f31312c50dc02\", \"500456a57af69a6a9615ad0e4c280ddd57d32d3f29bb568db26c714c074fb8de607d387efb6b26f9c1883843260188d3dd9974888a77b2b473f26783f36b3ec6b0ba7c12bebd30fd6992270fd1bf7d71dfcc01ab9893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/76bc86d13bce32da92769372e37076c675520959",
    "content": "{\"tx\": \"b96146fd0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270aa00000000012841abbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffa010000002b0920930287757400000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac12010000\", \"prevouts\": [\"3995120000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\", \"1686640000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"a47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93630a51e3ee68449166d2da506d8de0f0b7ef39424ebe5f034d615a238e9b2a225f873bed7b94a92ccdf1432eab063a27f935bef099df6a1cbcf6734b218f2b6aa9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100eec4f69e5cd9a0f0c1fda8eb2f54297e33bc5edab35b299e65e2653a923d6ca55\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8df22966d6a6c55ca54713f7180fb521ad1601010bda1f1af87739ba1b0e44e80ea84c8431ee0615517346b97932410ca977012a316263f78a9edf0a452e478a09da521cfc521edd35405d6ff7b10120e980b699014de05f8e600b437ffa9c347\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/76c17c551bd5e5ae2efbb26f2e05d12c9c8181b3",
    "content": "{\"tx\": \"ad0f55ba02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf000000000020d415c6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf37000000008751388004a9f403010000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487cb7cdf54\", \"prevouts\": [\"781681000000000017a9144c4b1fc943f04d775886b4f6d3c3c73bf7d3118c87\", \"2435850000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09024006cd93f5f60b084a9c8d08f966dbcc9e0e70a9926d232a9d958679ac161177943a477f798fd4066b5de32773201a141cd1bd70630c76c1e8b2f926b8ba6f9b9b55fcffe7283f010f84dca936f6e4f37e43378a46bc9713305239853e990b19eda28c5adfda4c1c8f00de1b7b471df302ca39c5374c820318be1dd64637a82964fc76c9b01d1f1afe3cfd00a8adf6752e94618728612a75b17677b1c372e67ca03d2d84e4b9585d4349a76c29c73465c53023ebd14646e87c6fb627b295e8e5867032bfc1847b955c2f695686aacd19214430264b19fa8d2e5c50f2ec853b20575cee6c7117370456f0a19aee799d2a0679311ffe7e42340b3e894b2fc62b52d041561474f4732d0ae3ef9107270a57bac8caa37c38d93cc64adf33323dea692befe5d67c5810f88cfc6dba97bc5acd2cd826b1174a2c25a6d2ae2adb0ebfcff6fa6bc464f2d3fa9d92208fc6d45b281b0c2bbe3c39f1bb17352c9880d1e326299b539ff176a29a8b237193fbdcf15904ee226d50970479af8da478a3b752580dd42b7909129104044b6f96a7a9e54d107a8a43f2fc07fed2f1cbba13d9a758d8c1029b873a24096bc59dd83fcddc0adc1868fdc90959a6e8778ff13dec76647f2d948e4bd9fd230f8700a7d2a9daad6f2ee75f1072e7f8b5ea3e1a5a0ee2a563b6f6f03f5f933bf23d3e06f53711110bae4ffd1dd3f4e4fb829a1b3035f3e0f8b9152716e4e57e3975d5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fbe755e9607a08942b2a918c9c9a472649e9fa8321d88cb3bf3ced4d061fe811b5f329bd8499c4f72b132f747438a5079d3448c35be74257418716cc5d770d7ef69ea04c091b2bc3b7c7ae53ee1804d998a6447fcbbef49abb62b7a394c4c123854b8121e0ae10d162a4774d9a1b75cd5b5f6f9e51813910e8b7b5db2ca997d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09027d14f8c3a2194bfac66d9dee24939361a77803dde263fb9cfeb1c17256bbfa96dce43ae1187ee059eeda6f4a22bc3c4d22487d90adc1cd10d26145e062ff813781b5362e4104a65a5495606caefe9c74fab11e327b8b2d2c1f28ca64d856fcb28820944de1432fa4be9b70683b9d3204a30db612be6042f7418e3bc4b8e0ece834fec9ea755191d39c613ba3ceacc88030cbfa70757b061d88136cbb818b57b7636241d513dbe961db18b7b31b43d6f729b1a55ed562982c351fcfae96a479d77469a0b9e0bdad84e493c178691f49c33fa5cb8630f0ccea0e6988de4af6a045df07fedaf3c6bafa5c1ee8757268563650f952eaaddd8888ef6f1bc90764fe229d24aa6cf7333a3d93153709194472b804878701a3867799c3dd511d11b87c53c5e5eeb2c86fa57cd8d4f59cb5c0ff79da0deac1dfb505193ce9d27f5eb3b3a10171f5ecfdfa663e35a838ca974f9716f4d8aac6116a4bd1beaeddb0d0d902b6486749d8ff6cba3d2b396b954557c03ab8937704b1198fc0400158f233cbabf9cbf24afe585ea27f70c227b685adaf3bc24d4488750d1bafd03d986d43c7cb91f8bf1772b422c074261562c96124339fc36922a344c5eaf47c1be00b5883aeb39635b40c551e98fc79f7b2242103640435571ba8f144376b8511c259fe764c775e34af4f3dc89db069e6fd7de81a4bdf64bf1110cd31942b419474fea5d645d4298a0ba4917eac51697561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a6754763bd81125d3562783a12f8a78fed0af3e064c5aded9a58b08a7329535c99aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb44c2f2200f850d6a1609ea6f282082fe51ae8a55145cebb4c521120909a7edcb74b0fe5a2ac2c1f7a0cb2705bdbeb7bce3dd33edb4ddacee2f772f92b01147433\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/76c565f5646ff08d8c740ffe4cf133d9c8a3fe65",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43b00000000ae08b4eadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c51000000007a44b5c0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b640100000061c4ffd403bdd4b60000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac57010000\", \"prevouts\": [\"f0d03b00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"96d759000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\", \"3c68230000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"7e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936564aba5bb494d1265d2fc5f111904e284bf007c2b0a6386000b21954c3f321a8fbc41b165d26ac180ad5b5d4c7fd11b6e5ed18084ae5d6505f3de45d58844c1cfa5d068ae686a8bb1ac9947127542ac866077ad522de57cab26ce701d52bc951\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdb95efb91d04564594d9dcf752eb8fd975bf01996a0bb9f9eb7163324924bcd44fa5d068ae686a8bb1ac9947127542ac866077ad522de57cab26ce701d52bc951\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/76f5c55837a53eb0781baf11e0de07184a6d08ee",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49d0000000063080aaebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa801000000660303ee60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ba01000000be4370b5010fb78c0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7d8000000\", \"prevouts\": [\"c21240000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"da9f8400000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"a0b10f00000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c14c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5182d044aa67ca69515bddcd39ff85ae31d999a9a5b32af0a0137c9fa4b226ee88d3f52a2844c5f7874c7d430ecd2ddfcfe713e30c56da5784f950db6acb8f092a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936049f747986f150b9437633843d291800b849149650f68a8c294c910246137135d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5182d044aa67ca69515bddcd39ff85ae31d999a9a5b32af0a0137c9fa4b226ee88d3f52a2844c5f7874c7d430ecd2ddfcfe713e30c56da5784f950db6acb8f092a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/76f83799d26fbfe8607158f4718d6f5cfdc8621b",
    "content": "{\"tx\": \"9a4d26d2028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4340000000054ebc4c9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd401000000535d55b401bc3e0000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac08000000\", \"prevouts\": [\"e42e3b0000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\", \"2fde5c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e8373588cf8424fe73474f68ca177013b4f80e2262b45a155b55745d3c6e43c7da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e65775dfb1ab8912d99abba269b246de78dce1dfa6fdc8b38f44f7be80bcbeb76c308d8e78b0cea59e70bbcac5990a047bb63a968328232757672e5e931dda055\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f9fd4215134e0743a43db076a2ddc66cd37630a1ee932cb7432b56663f87783368e9a99c27257089f8586472cc94222e874ab5c5b462fc98ac1b045b7a37dce65323990ac9ba96640afb66df99f25054f5788ad16157a03b33c6c26a70bd925e21136d3d9ecdf371b2101a7e86edb56e15b10ef185a8506988239bb2b5a4c43e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7705fd1f70110abbefb84b8bb3679338dc85008b",
    "content": "{\"tx\": \"a5db689303dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8e00000000ee83d8e88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49d010000003a8b0fcadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6e01000000d40773fa021b25830000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ace0020000\", \"prevouts\": [\"24a5260000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\", \"e8e73c0000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\", \"4909220000000000225120acc511cd55079365da76d18a33af3ae7411f3879a9caec918e9264c8959f5dac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"f87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cd6beec103bd564656e486a3d8accdfada5c9b845f4a923505854c0068c70f9c9e87f1230a4dffa49f76a6d91b3ffe7dc371ffdd064326b56030bc36a92eabd9a0f16f4cfe8b052d74bbe565102becb5d9831a57baf41b6ebc95ac4a46ff7ed8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e6214fe237ac2788af17775070b6b8447de06a17f7a8c679a51835b9edf50ef76a44cf4e9a2100eeda9c03b98c53803fc7517d02bc9d83cbf3bcae8bb7675812a0f16f4cfe8b052d74bbe565102becb5d9831a57baf41b6ebc95ac4a46ff7ed8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7722142222386c62ee3cf0d244202e77b759f34b",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42b00000000ec4681d5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb3000000009a1ab7c503f24e9400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac34030000\", \"prevouts\": [\"33df3e000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\", \"787358000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/1000inputs\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"783a38a223450cbde7a7b41248ea105f1ec2f7d27d06ffe0bc173368cb79926bde2e9bce343e87772e2c0b6d19e0fe954a756a263ffd3f2e47dc5fecbe0178ff\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"75757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361b31d32273cec10a388aae06b849f4b58d319b8be15342d1582ba39dbae41cdb8d0c3ae4ecd69aafe0cfe43a84c5490ce66f12d05fca780d5434df16d81c50b707b0958e6f1d30ef106eee149eea009878f1bb16c67ddf543cd3674e13327b7267ad95278cf386dea223e62e70daac0dffb1914a422911909ea2326740a911ee4e6da2445d77f245beebfb228d762c59bc4a45aa12cc4f427fb039e22e0741b8a9b8ab344cf2739c9b0c32934aa3ca09577646326af4e24188e665bd1ee1286ae8a1d97d8069ed729c043647fddc6f0881774cc6af50354826eb57bb80c2a537064e7784a32ac7a58f3a60a34997c8053014901c71ada75570a50a230c2a15812d8c2d47d0d67efe3e8b51d627e5dfa00d213ab14a67d5c44c645d4238abb49f653b56bbc07059ab8fbe5f7a1d8b1a014d2dac79b80c168f374716643afc9d2078ce779d35b8b9495da82099971fa23460f65b58297658f8344073387644345bf93c5d65e32b9def275a3e26d7cfb887654cccdb12315dfea4cd4a0817d8d4bf17002da8b6956793790e2522cdbbbc51c3e76cc941c9170ee3ae91039a9479105f3564c54269032898a6cd874ff4d1fe0ed410013dc82714eb7a54d64226e3868b0e659112c9f7f4ef135ef7e3677927c686e2cfb83a5642dd1287d117c18623babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4cdeb6cda4ea5936a8a548d271d20e8d3ef2c43f6561a714f40b06e7505d8d94b88b42fc81df8d1be972e219a062df18d5287dd15867ee2acb2617d76d78281d\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"7575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c83b46994d7f8e6994644064e85620b72250802c25869579473094af99741c2a53d70a499a2b9d07fe4e0e6cff337beba7d38cc150fdbb661dba76e5139a2443acf95dcf25aa121eb2e54ca553120788d0e687c373c34db8910d412871842a61c2ea6390cf7a5065adb655a43cff9312a2403aeb5ea762cebdde4d887b73eb6c49d3b8c8be8af93872b6db7ce0bb5cd37d778c1b0ce6796d0a810415378a7c3dba1b225e18c65d1c10de9a0cc3035ad2761c5c76198c2ab54b8cab7c145b5d828d1cae81044ccd077cc0a6748c134e6cde0d0e3b375ff99dd8f5fc12660edb07ce033cb2548bda430cc0fe75bbd863ef5499578603dd05ac225ff92af4da5b7edca4fc2d6b3b9f6d10b16f2fe0d93e1083dbdcc6039116dd558b96d689a9b6ca973655fd5fd3ea54b033deec3d8b0af8f9d2f52797f3400e4f6e622e7375dc6acdc7095d9956755e1260b1db6b35d4ca0cf370620b49d6dc89fdc714ef75e3b9ab67361a9d368d00307e918b8d4e9a4b3c809cfb6b1f27d7ad87a7bffe6c20b1e1faf1c68c7350ed7e5b99510cfa520ad19515f62e946aa86743be480fffad58a57b391dd67ba025b9a60505ecd7fa3b5ed0808730285af9f495e709e1f92ab88b2911ad5a3c4781fcdc9458446cd8039a7a21ad2b04a0c05bedfec6a225c83df68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/77258dc253bbfcab9ac3a990bda4f20592f9c651",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7a0000000049367eecdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb401000000a94652fe02ebd56900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac3c355049\", \"prevouts\": [\"00244800000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\", \"b705240000000000215b1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090246f5618e5237005debb856b786290b415637a1f1f1a00b78394a2d854ae88184dc518e76c1d0627e1fe87196dfb3184222e3d53ab50086f526676338692cd57aa39de2eee4e49e6fc648d0e1d92b9244f783bd61d8495cbf60156e481943e28725e017a0709c4f1a3b669b97b961b83d37c24e693aa60a3b8937221ca43c4d96da489130dc24ac5f4b557d80f10ff8077fd1b865d5ae5ff9cf1d071ce753a596f82dcccf4fcb896a4c7ec4f8e5f4b4a01717947397c24951c8b9ba68f01496ca75d7786ee34a7542f6902453c7fccd18c2840cdb3ade118295c7c8c88c455528d2ac7ce8157692d77956c0f57ad92f44c0e57d5b9898c97b2cdbb268c4d84330e9926befbdbf984c1af249e28cc5facc6d12e398ae5dcdc5c223064114e7ce1dc06eb9db5c0c312b0da142287f46ade46e172d0e14f185c037330d56013e49240ff80aa1cd46430225d00b7ee8d67b872b8a007c70096685afad973157901f18541086fa4f750a09063bbda0e34362b64b212ab54c72c796a057ec422f3373255fb591079ac1e0bd0514664274dc04e096940d2f5523c7aa014dad38b79b854efcc61a8378d13696473f2c8a348d2aa7a88a349b5bb583037240d8bea60bf770eeb95b028bcdbaa3eacc796aef49eb18f561719b075c40b93a5262e6163c25870a5769aba3873d711682537fe07947f2329b8e8e03602c5ca949122137cd048b986e5a9dd2f44ee19375\", \"ff7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d6cb4833cb0ce17ffb0b5ccd72f003893ae0529ac21789df7af68ae41f1b87092e9788694c2a4005ded48f6fe23dc6801bfbcf181c543907f81cb41df22d2e77f27794099b656b9faa6b5043ba50cab982b2292ed8155b5f0f6568a958ea63ad187b9e30f7e626b28b6dbe2d7b101f74e326290698090dbb0a7eb7a50daae87a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902583306149d617c8af0d3c9a7ae919cb88dd68546e03b4ff5f3cbb9347fa2bfc7e5f580d91a6472b5df5e81ac87753ee2dc93c9d8b159efdd7b1ec3c30125b8e80a8082db6598397ca849aad678e0a67c92cb0aa5581a790057337e59fa48ac8a61f2e67d971f89fafe602e1e62daa84539988ac72be858145801fcab3e32be9cc5d1381ef0696fd749222a2823d18bc9ad5d01fdbc37f18b0938e262048edd139ff4fb0099648b9b62522c651ee03f16688c7f3890cacd95b7804f5d191416ac304e9eed73faf971784e8f3619d2e3230a4efdb4b559d4feed1841eb260945981acc03a56b24b53fa54a77782ebd672abe447262aafad0e11cb063d976c810239b9780a5c578d17577a9a6c3a7c19a52bf20b15502e106d34bdbba56f5fd3633731025b75ee4f096c6aa73d56d8ead7b9f6f4b98dd99771e8d6479b8bf49cea2432a54c4791c3e806558e322db4f77c50b31ede95a5481de826932c72fa6cced57a20a13913e3eaf1b54e2a715fce1c7bcf8c17da9ce5bde6fa27b4a561f0f7b8a96ae33c135033153fb00036ba100e433719c314697284a3fd87f3ad61279c7481101852476cd45cd85f51d99762ebc18748cb929fe1cf31063d5dd3371605fb91885871fa7005b9b4613397ac13beb1b19cdad92dad4cfb814035e578b12cb2cde1cdf3aa529916b7d90570cc32de8f3b0347a57e985d6efb24ef0103c73e0554638498f3c339dcd75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360250bf0957827ec0ef4e6919f825b41a841653c5bffb12706dd1bdd45b1dd4a32e9788694c2a4005ded48f6fe23dc6801bfbcf181c543907f81cb41df22d2e77f27794099b656b9faa6b5043ba50cab982b2292ed8155b5f0f6568a958ea63ad187b9e30f7e626b28b6dbe2d7b101f74e326290698090dbb0a7eb7a50daae87a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7726ec0c41e3e97e7d617065e6504efb8f024cd4",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f9000000002952ca0e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703501000000ec13486101dbaf04000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487ebb0ca47\", \"prevouts\": [\"2b700e000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\", \"1417110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_fa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ce70a1e19d53314c8df0e2a5969f4095575c775cf66ea5b042050a2e6b928ef33d973a510be348fca910c81a6b006319f42df4249808e7db6f7512a32b3f7ff301\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"272aa10ad3414d8c91bdfae458f2fe02bc11f33e05e33b074c62d86d42b06729761198eda32e1621fabda0200f8b3385703317c34553eb418eb491d80263252afa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/773d0e073333f130bcff75d37d1111faaebee058",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4d00000000734e99b70459591d000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7ad010000\", \"prevouts\": [\"c5021f0000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"e7\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93668ce749c68de633516e195736934f8a88269848cb24cae075fce4521e857a6cdd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51c61a1ab416979399a3dea56cc9db65331fc4d8e9e627e6b90ed3a4ebdc2f66c36df482d4085282f873fe38dcb59fc4eea3656d896112fe243f784a0cfce46b53\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936feb3983b18e4525f0a8518cd3710c3b144f3f0d5edea574e13e05d297dfd94906cbd7cfc5d340306ce0f8e37fe1bfa8aba9fd4064e6187eeb928db0d0bdab726391a14412c925771c32fa4c7776d5872be2a56fee9c5a8de868e7e6e5a4c84da\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/774784914f2077e1681344cb01340a934be26ba4",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49000000000575c18d0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6e000000009b12d9b8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6201000000323bd29c036d5608010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6ca6eb94e\", \"prevouts\": [\"b77b360000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\", \"a9315e00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"7c80750000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"83\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936777ff8a9412e94f7b77cdcac9df137438df90b973affcaf29cb29560429bcc3e8ed6c904d531fc0d19ced9482d4cbb64035dc55104164ba190923612d3f9e9a82b9d1447cbfb5d72d5da72ac5ad193469eaa6b44c038aa23e2a9d2dd480586adaf3b292550aa3dd1beea84cf7009fb6c6992543e64edf52f25a9194aed3bcd7c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93683933d45c3442f615ee20a7137db960cea3b9cd87b48587a4de9c490e5a6c9c899aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb439b32d44b6ff86c799acdff23ced11a294722ef2b8af6951bf8429e3bda52b31af3b292550aa3dd1beea84cf7009fb6c6992543e64edf52f25a9194aed3bcd7c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/77907cfa0df9ad35b28a28dc974519599031d5b7",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270de000000007f4af652dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca600000000e56eff118bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48000000000454a026504e231a400000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e79f410645\", \"prevouts\": [\"a4bd1100000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"f33b5400000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\", \"67d540000000000021531f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ca\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f336cbd2c434dcde2d093b968cd4500063515049b2ab4f542ce372ccec22f446d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51c1012b923c15ff4ca5711684c82f77f7d0ace9e417918255ff860668826001128a698426442c951e7251e4e87784c9556d503d37bf6168d5559e89d6402ee5a2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d520ce1e8f5df7741068fe8539649c9e500f335a96aa69621db8e7a39b2f9d4cf99c996d59a69d75c183cc1e3ba6b17987582b2274e87a7d50251745c93805cc8eba4e75ed92f6e82baf0cd6101dcd67879c020ab703e3dac001fd69a24240ecc7034c4ece6ceffdf067bd97d8bd2a80e986f14e8b5dca33ff1523eba7a77d63\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/77a416c6802644089ebc937712578c64cd114e2e",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf12020000006d57da0d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40d02000000dae2d1f001858c5300000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acca000000\", \"prevouts\": [\"52eb790000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\", \"240d3b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_cb\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bb951b2bf5f8b50ac52303fd39cd7e7ee711071d15167ca9042fd85d21f87764ab10f415e04cd3e75f2e8b46a80fbdc069fc63a1387ff905a470a1a12f35152482\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f08a28ec32f09defe6338e79247dae57bedf496481795544319895a06a7cc9c4cbc3cd24999dc52b54f255bad6b0b7d26397c351013611c22d308e836c32495bca\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/77b1d215fef8b044b5354a64c3541f96a5eed3ef",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a400000000bf14df5cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0c000000002070b123bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd800000000fbff2f2002a8abd800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac05ebd32a\", \"prevouts\": [\"79d30e00000000002253202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"5ed7480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"853c8300000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b362dc06d7903fe7aa481fd01a349477e849a2b2c2a0084a62d0c03cb8dafe03be4914b397c8b8344016432f6dda686d022696d71b84d693b53d8ab96e5068e702\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4fabf967b8b61daa66d17eac1a6a529b154585fdd88677c8d6303ff07c92a0c823e794bc94216d774d400ed24518aeec8eeef43bc841c029e053885fdbf37ef608\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/77bc35d370a04908ca4a6126a011623e2b09442d",
    "content": "{\"tx\": \"cc88653202bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf07020000004b0446fa60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ce0100000099320c9c03335573000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898713000000\", \"prevouts\": [\"3517640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"07b7110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_c2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e8a86ea3274b426616d7ac445a38c720cb20975e3424eae2d80e8e03719b20780dd5ba3279a450ec522aa8a4ee88ca4f4f89fbad38b6688fe79c38539489f91681\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bc32942281c86099d29e759d3023958a300d3e30ba576ca39b392a2c62d18a9d82ed94667163aff381954a9a35eb1e9be50abaff847df3bdbb7057601202ab09c2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/77d0cc6e1223f82ea66b45b7eefc97601034b9bb",
    "content": "{\"tx\": \"5f9251c902dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf800000000bc13d3a860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705b01000000331e88c204b46b2e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48766d85037\", \"prevouts\": [\"0f9b210000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\", \"89ee0e000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"a47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e534eece907d9a3224677f965f53c0f955581a0bf9d57668f5d1001f37295acad5e071d65b1ff2cbb44adb2a0836dee99e48dd3c256c0643eaf2d4db2ac89d0f9da521cfc521edd35405d6ff7b10120e980b699014de05f8e600b437ffa9c347\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082df22966d6a6c55ca54713f7180fb521ad1601010bda1f1af87739ba1b0e44e80ea84c8431ee0615517346b97932410ca977012a316263f78a9edf0a452e478a09da521cfc521edd35405d6ff7b10120e980b699014de05f8e600b437ffa9c347\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/77faf5783504d2bd51c625bcecb48b8f87e8e165",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4050100000060d5b89860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c5000000004169b1a9047cec4d000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acecddd42f\", \"prevouts\": [\"b7923d0000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\", \"523413000000000022512097f3f32bbea7bd397ebd6824dc6e34758f0b169a6c237662287beed33756fea6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93621b5bb1a2359f3a8af3fe21ba351d114491ae91346d1641e02870742c471727b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a5c616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/78251c5d9b329e36203639010c03798c0e1dcf20",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c701000000252fad978bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42f00000000e9e83d9b03a9ff6800000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787f6dec441\", \"prevouts\": [\"e4a632000000000022512035c5e2b60676b638367c49c5274cc65e6feb881fb1407d2a5f35cf666d25b965\", \"0b5b390000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b0ba1be0be881933f6293c21d0f105b497a44aefee74f972fd39705efeced0a4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aab616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/78536c856a97d639ec3c9e87656c03a486180cb2",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9b000000002f21cb13dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9000000000819e17eb04c2af770000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e707f3412a\", \"prevouts\": [\"4faa590000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"4d91200000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51709247cbe4599f1b40c45655be9c4524e18ab036a38ca357e6d7c21966c7872b33cf35ac099042702f37424b07b91f05c9425e6e1d18ffa37c0a546b69cafd337007ac6d9f1365651a4d55e6df0dcb109d268cc6c386b355a4997173bc95c886\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08297185a6c30608fff89dfccb39a96a02e4addd353a2af1bc7b33caa3a3ac07fec6e41ed285c226ab336f92f35d989a379104ed593ec3ff802714cc8e85daf0b3be26db4ec4cf8c6a12d3bfb33a6f8c1ee971c26c5be04413f1d9dccd7296a9839\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/78a8516593c8bad79e4092b1b3fc0a850a266c4e",
    "content": "{\"tx\": \"52d03179028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44a0100000058a0458bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9e010000002bb7bb9501169421000000000017a914719f78084af863e000acd618ba76df979722368987f336fc30\", \"prevouts\": [\"806a3300000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\", \"b81e8500000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ee2fab3e49e94f134e5eba454f125062d59ad39f7debc4b1de7b03393300b66cf60cbf310deb0bb8188a5f81dd989130bd5376f4b45afbd70b75330fcf47720df203f66e463a570e0d5cac4962b40a4ace1d328235d8871bef51e6ee71faa78a210d998072726a67258bc4f7f4a4e2391e463c0e74fc6a18cfb4bff2ae7475feeb1a335ae1912b8088f693b3f94d5a67aa12bc0e9385d33b009ea0de294c0ed04b64682814f89b5ce13df01f3a44b1f62c372febcb4c279268d070b842cb594ad4da7bd9fdd85ef65231d2b1283390d20d6d8d1b08e18563bd309482a7a16a72188f11ea140be5ae1ad90880159cf60ceff326288b068bb65d8a605b99e045cb944acf3a4d7f3ddb5e964bf9a11591f2d25cc4fd62f301a0bf03503e6825852503d2561cb82b7e2e07dc7ca798b92494503b2ee97881ae8c181d7234c3fa3b8479e6b5f654c640c1b3423adea9ffae983e0a596c4f42a365d65a87cd99e6eabe302500bb2e5440ec0103d8588670e268435443ec0dc87cd579529ede56b9f37a8ad91dda3529fc9eb9ce7f9c8753b1419c8a8a9dc78700861a14a7780f6908c0c01c4926cb77b04e45bcbe9dad07cbcb7daf5220dfdadf8e306b5e64b4eaa144ec4fac95b458388967abb4d113cb6cc23750c2044ee25a1ef9c962d2b73f37ca850055b2fdf845d3f72055c971d8501c19d8648073cccb1bf8b53ddbacd029a2ecf9a9cb2ed9dbba1875bb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb450430626a247d567d7470b6045f35bcd343227bea51bdb051c26a41fa3e304da7017bb5ae96064d7d19e957b5258c9c864deb4239d29676eb164d7ecbdb9fd5a354ad806189ae64381d3b11a94f516f6d81b0c787d08b0f0aee4f0e917017ea5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09020cc1d2522adfb67359ba949637b69a52117483c8ee70f60244c4e7e2af5918779dfdb23910a8220aa324edf4cda261f8cc48fc6e9f19eeb1f689be87051c7edd6fbc70991c91a8c689c5c4e927169786d228aac781897812a927bd43aeb89bd5b8a3c9dcf1723660f7406bed9d58dd3d071ec3a18559214031574a26403dbfd7d0363b8259f06094912e5a1899414c93d94f7a0b85ecec0e49e19a3cd66d83b87583ece7a22f87843937f040306362b1ce585dd4a47d2c7fc819b498c10e67292a1445025e539f9ab035ad98077d68ba9dab40a602a3f771ac8683633fb495422fec4ffa5c0d0dbf6421dad60cf1fd65eef73f2d76aa5dae90775b20344f968134f1c5b354a74678d68e7b591c00138fd6e260958279d675c054ef8834bf9f924bb0e2854e39fb82c9b3df9cdc3b7f62a47a230d1eb97c0db53f9828fa83fa5b8f8604182b08ec5b1564013bb4226d84061257a057c1df65cd7010e4362980bb2e3da57a424888740d3a0a15392e0728b81832c6cfd88f6bb2e34494f4cb20956b7174016096d00a32108e8c9588759b424d70574b8f162a6e0285d087326e5d6b811f31fa119800561ab77fdad0051063a94fa81bb3b6bb01a93ae7a094cae3053ff110dfeefc2b7f44ed025b14d4f08706d90ad54accbc80c9d122dfe330c833125fc9471cc5b94fcfab6924fb896b339ada1cbbc2875667da1a4ef53bffca9ee6d409bc96bb59db7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93691af7e676faf0d787dd6628f8d068756dd2de2473b94e5aa63915f168764e8211ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900454c3d251f378473e49463283b18fa00944324abf75c7e60d6956acdb0e7ed03a7354ad806189ae64381d3b11a94f516f6d81b0c787d08b0f0aee4f0e917017ea5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/78a85c295a5f5c62f56d7eba74225f31406a0b51",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41400000000eed2c5da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fa01000000017337ee03ceba4600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc71b7ed33b\", \"prevouts\": [\"8c5c36000000000017a91454957ff2b5c5fa7ace3c6fb485b914ecf6ce0c8c87\", \"2b5b12000000000017a91441ce0eb0e6e5800ced23a872818e5aaa63be0d5b87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"1657142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"3dc5f8d29912ba73ca1abbaec21d76bef211e04def0ab69376a3dcc8bfffdbce1db6c1afd3f50a254197f695bd395be48e2c839bf1691044018d14a93d6a09b2\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/78aa0f27c839d5f0b6120545131237373c9ae941",
    "content": "{\"tx\": \"238858b702dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bca00000000c2cbecccdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce60000000068a68ee4039e927a000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acdf40ad44\", \"prevouts\": [\"b94a230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"97ef580000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e76d3451324b9138e1a02bc99606f85398a5c02ad518c2db619f89974ca9e92c026557b708b5ff4838890b3ef28f2dfcc17fbcba41194ca68927d7f0eaa3f8db921261d9825d6464319e11fb6c7a9f7c01f613629293fb1fa80574c155a587736c6fa26e4842a5ec51b34186b71f91671a7cf578e5677dc1f65db5fd4f943bbd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93693ba0b31f1a953c5b215b358b32e1b4fea0fd384922a25a91c841ceac44a754290840bd75c8ee6dcc19a553b4e3bda7516a8577ecf1c365a05a7b0ad0f101a1c215b4c606cdda8e0cd0631e1e6566a3457cf9b2eb8ccfe9cc1918e65b703d3f7cd241e6bbc5ebedd8f50ae206f1f82a1e41ff5c139455a0ddb0d368f52a47602\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/78bb53d71409ce127d2a0ea2bb3fe8ab857c3db0",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127042010000002bb691cabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb3010000006a9750e360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707e010000007fb4f7fd04ef69900000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb3b44031\", \"prevouts\": [\"86751200000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\", \"695c6d00000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\", \"bbd7120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090273831a69d6f99c9e8b1965d77307084ef95fe23f8d4d8156e40e61f335957222af8040d693d19286ee11869b6d980cfadb50f278abcdd240d6a1dee48bb6e365f30dc45f61d5a8ea5f2225b266f79fa03ce639434bf2b7330e1d0cae71698c620ae5c1ee9c793dd8dd9a0f96adec0cf6f1716f4932fc7d535d27563ccc8c86709514fb8a3cf7d44fcae9c933134274d8f38889274b1372e468a7dd5b026591bf30764dfca47b04b587b5a257ec7c1f593344828c48332d95b6021ad6fce2944c4604a90d8890a921ca4b0641a9606db5022eb4fd2b73edccf3607aee01d10cbd0aad130f86860f45c075a84bba27eee6e85f585a8dceddff56debcaf93681b8397db0b8b9b16ec55d7407d7b05b9ae3bf6d13dabbb3dd2b1c73a1e3a9fc2434c305700cb2dcda6ccd2d8084740dc7e88b7ffabf0cb412adf7e9935da0ba6671e33ece30bb8361eba6b65519511cef1365ca8aa70a3f21a6b6500a931327919af0a5f47e8ca84b516b56bc8950174ffe70d320c59c64c6eb0968bdd56b1243250277b00e22e443a8962f54900a91f8041115156416ac0a72fb8c8f748e14042e57b05aef234204d7b829a7d28777deba1ae74dcee6f97235807653e5081dac6149d7be33b6e49def0ff8df238629632d5abf89a23b114284cdff13c7d5d57a77d7d53f2c8f59b75c9e37b06d94b1483ff70bb2461b1b3f03a4e9bd954ead6b300fdc09e2ca6a0f268f975cc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360082200294bdc578fc5250803dfab01bb18c9abef135300b000405e6b83754c366d64d66e5a8ef59726e977ff218232e5171732e5d132f479dce590bd8ea056135478fd9f7e773d9cefb2e6c2d4f28929a19e0115b3c92e29fd8719e7d86d1ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902581e99f97f54669cc06c56921886c717256e17b36781163fa3f3ee36124505af852cabebd2ee1c05fc06f0c8d604d6fdb89c5e54c632a00bb96dcd5fe231b3abc0050c1e37150c3124182f9405bdf62d863557ecfa8329ee51f1aa0a483e8361e5b77aeaa4443487cec4c7f1e1d419815c150f800b633c859ef6ee36cc6dc0a7ea8da3aff4d2eb323527b9e30da37a30d484722c764fa073c591d19fdde1692c5d6ac204d4c3e4565110fcbd8a9928480f8f4160cb90480f4f52a3c09cd5606d2beca568663e180e4d6076bd7f1aa0414c97c0e1f9ce99fbf9f02ae7f915fe68da3fa8dc868390956de9885978a4a44ff97c2af0b02f9d498e59fcfff9ee883008d45007170a48b108970f09da08ab18b535d02c648fa7b6c6816b163c609ad8a05116b74e7ac04a72ce6cbe35404f90f91c84c7fd754c82fa0f19b2353dbab60806e943242017e7998c0a8b64287b4f909283dd5d5c5b70713c09065865931f8603c09d2f5ed193bcb6be6897a7b1a3462ceba781e7bdf0a7ff3fb56c9ee933dfde0c014c4f1b10799e25a00242f06c27dc4e5ce6bc99bb70afa35522cbf36d7c9202909e4ba63ceda1e3a671bfac269d719896e91bc5707a72ae9520fdf3362c4e0c9e01f9f41a18913096620aee35b7a9c2380044b6e13ea9cfc8d722b2349ab33f272ef6f15526396fcb5c1a8fa9fc527c301018b24d935b9cd9cc2fa733370c9a9712513041587561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936421987bd13df4c70e6bf953d88dd086caae9ed404be58b48bef1d4141595753e11c8e78922f12cf5b391747592eaf9e84d545161f4f09ddc8c51091bc04ba49d4e19d3b2ec28c8925d54c04f383936b915813fb16b738060565344c47074fe42\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/78f579fb1bbed4948a321bcad1a70116b995076e",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf610000000058cecab6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c12020000005cf0669103c7c9af000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e736847739\", \"prevouts\": [\"b31f680000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"09424900000000002251201dfb228dec79c6e234b1139c58dcf8de3e24a7459acbe9e029f267c6e1783b9a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902968ce8fa391872c7c8f598dbc24515a2e1ed3a9223392f7dd5d21cc8694cb6dbbcf16537d34fd537904562f1304b6b6dfa3bc2c76930c5ac13c0120088b526214161fb6edf3d22690e1490528f5f291cbc1fb9299ce923a65e4c10dbfcc498d242361700ad444b86097c1dc0c1e7b14160d977ba5df782de32e0128145408c6f8507486013f59b8bccaf02b65d6fe4ecd13fd250ffa6c53a7c730ad3e8f685892d7a7581b23db6a11263ac0ff978ab7d7aee07f2b6b3de2155164b507e962c3d8a4f83b1112eb706139607a880324b7e98f57c79e69d52a14ad3fc121c74eb4704aa1f52d919e987d256cfae0389ba66aaff2bbc1e68f9693f689b40149cc01a74f20b433316062f43763850bfef8e1f6d5b1bd9ecee1f15a8fc1430216aa0e95c546f38afdaec91b97ac033d03502666a9721a20eebe063eb9abaadba33ea63c041668d2b82cf50d29785484b88cc043e929c614f6876384963f989167b6260b61fe596964a1e2338c10d658b885980f7e46dc9ddb72c288cc41573e199691c637b2320dc57eaec9e642f7a2abe37f10ecf96ece71017c6f30131544209d34a06086c91973bf72642f12409889ab4633434abca8fca74c0424e9d13fb516bcf9c662d572752b08ddaa2208df31e200e830f7d98eb378127f1643f3168edb7b038c9410bab5f8417b5f1586093f6987027536a7f189a74c34ba2118e1ac1ac2be847c87dba2833491f7562\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c1b5bd5af873b3cf6e5a90ed7dfa03da09ad4c4f61aedb4357c87f13244d0d44ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b2a28c39ce330a19a0d6c22ddc640bc3609271e6194de475fecd1ad84a88d361935a9a81b6bc4d13af192f1d19d1915de95ad8d42e49add8bb4e9a9400ca460b05\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090297fe5071ffba2c2a12b64809619052831713fd9ecc38fc6e5093d9573f9ef8ef7424ecf7a39c7b8ddcfc80fe0efc9444064af0f0255fdfd318e3e893576b57c61b92e02d4bbeffc039babe9a7c0b9e4d67f7f35cc14081f35b87794151006854c0e3df36ac252ddd243a8e5175ee7779b7741e17291ee894478134bcd22f81d3fbffb9fb71eeca5c1d26ed7d66b8e089d44748274d94626f73478f40ca5761178772a0dba3769df491488fbbacd04b3811135700d60fcf444b02f6f2b79ab6a4f36f1b7348ab022fc8d463818d0d68e672e6c93d7ff1b6557763169065f05351e8273fe78872b85d8316a04460789d3e7963a69a82d3817496e9993d4629c2c2ade56a343b904f4e2ab8b326ec729aa46aeca259bbc31f60702676cacc799f32c7dda8bcf63b76a957924a590e7427fb021f750e88451589bcaf8e5a102a13601492c55f6eeb426976d6e32f682b85aadcb5f5f197df5be2f484aeb113fbeed29f0362f1bedece52fffc6235b6bede7d499e9a6b0d73469cf4d41eaa491e2c4e20a270446b18df776e767cf546ad2369e39bf80f808bfaefb4f68528f09e27b7a6fbc6211c01cc2748b55497c8cd9f1f94430a327c9f2a83cec9a758b455eb95a4ed12e2bd8b6bcf1f8360f35635ea8d326fd9878f13102f4bd6910ffc5302ab1f7dcdf3d88f7461eaedab4580bfb20b8a0ee31d6f26d28c68f6f2b770e10b5487c5e0f9af9c34c7037561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d511ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004522ebb88c16ebf61dfdf766657f947c6b679bf36be3a1118c2e7b2b24c8fd5c2a5a9a81b6bc4d13af192f1d19d1915de95ad8d42e49add8bb4e9a9400ca460b05\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7929ee70089306f9173670db39ef247d71e6d01c",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705e000000007f3b89fe60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127009020000009be7daae0426b41e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7968bbbee5c\", \"prevouts\": [\"67bf12000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"58640e00000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063d468\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365a89721c820f4bdb361f8db64c173640a0ae9a66952c98750353100cbbdfa52ee05ff666526b724612289f11d9af684c97588c9b58f885be5f0bca0261c5a78c938b5973806e5396d9f6a2ad240022103fc2376d5af9a7129252a47c1a6405aad5a470b8497850c3a230fee464eb343180400453804118582df887251250b2f1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93632e5acefd4c8c7967aec45b85cb0451f2bc6c0507eb8db9d83e69d481800454c36ccddef3149683af65c31c85a3c06583d8e56fa5e9b8809ad6476a55251e65fad1faed220136b938a4936a71b98f5f9e86de449242d6a82efdf7a3adba2ae62745d0948d124101db49c294d83630876065ae400dd84de1c183cd8c786ec24f9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/79348dfc973141bd7bee5f470ac28ffd56e6591c",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d4010000004448e7b2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7e0100000089d641a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1a0000000083a09fad0354caca000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acfa030000\", \"prevouts\": [\"5e70100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8e686e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d1414e00000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"e07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fadc06adab560b35cb72027d4fb118b7ccde081e5b76834bff6a0280f6d09fe7dea410273431f29264d27122ed0946ba884bbeaa1cf1ddeb7776ccdcb7bb2f1db0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93652e908c96e49e4bdd4a9a5cd975173f05101b0d874a2afa662ca1474523c4400dc06adab560b35cb72027d4fb118b7ccde081e5b76834bff6a0280f6d09fe7dea410273431f29264d27122ed0946ba884bbeaa1cf1ddeb7776ccdcb7bb2f1db0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/794d2929ccd4a9f38151fa274b7bba0a898aa30c",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf86010000000341de5d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46b010000006e8ce12b02cd14ac0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac61030000\", \"prevouts\": [\"0f05780000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\", \"26f63600000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c36ac07773bbf46c88fee963ca0e4e4acd235bc6e1c8e4009a2ad8ce5db6e1e1e8615c203dc23cb029e7db21a2c25ffa1e58a217fce4f910f96298df6e880ff594fdda965251e4b25324fb25d524f5afff8c7c52a3da7c11a63e869099762eda71455bb45119ec6780a0bd8830f6e5001315edc9a69a5b17e492d09cb408a943a1375e317b16913793017cab657fa068bd0c62abc4c87f853f6b530048a7940352cf090a054588d89de8f408e33fcdaf02e97783d5331ff41f2699ee40d724c1509b0829671152674c6934eb690ca8f6ada1b111d9fd4b6b043a4978f5d9fddf443e1cc08a00649ea2341ad3a3d2220d6b91e63f28567fad751d788441ad53c7c41db5335a4b6a7a5b497631f1734f57f8c3477b215ea2788e234d9e785147df5b043d75b387ea6d337a75c2614816831b3344be2f0d6f35d7b6cbb950fc0e713d4c7d90180fbb3b3f81515bcc6c302e5b45494a81f0928942274dacb4277e5d99ad80699999551b86611f63047eb490dfa50b0b6d3cd2185920fa7c29586b65605164bf2b3743a9770fc819738f427cafe01266b55eba21d8b7e17229559861b4c2ed27772ab8cbad46f12f89eb216d4c536fa28364964cb93a729de392ae1599300eb61c090fb0cf80958ac7c6def73a078f26dfe5db4a4b46433223080e657d3406d5ea39fa444c7321536ae4fe24abb458102fab31f5bc57cb964c69fb41625ef10fc7a997aadc75f8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900457103c9e8ba836cb8a4e14cf2cfa4f8a9b341b4f4aa6fb02102628b5e7003f327891e44dcd1430a53a9228b1d4df01e5c5d5af3846f876ba8dd78ee7e669e7153a72d00f85eae87f4cc31996f158484f267a3b4b9a04e006b9a1cff5c0be2781e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902abc134d4a183d563244ab47c2e6a1f7681b5552650c4046f01d596f54eabda0a73914b5ac396eda2cbf3f7e4b7ab2e96f729e23bc88096b9a99b041b586ca9382dc1f96212aed6049d2c0d3ea8a550fc7bc7f59efca0d793894b829f1a71e2f57f7f2d0678b0c08ce24ea177c561bd4f797ca17aad2d41e0db9fc5e37f4d81e4ddf045d5820d91ea58cf83d716427a6642407d61f030f35982be61d5dfdd1c5aeeb50bc2315366fa90ffe1a3a757cec691073fbadf5808ebdeceedf64a19c0c08d7c1160867726d9c396d2dc5924bc87d54c9ad2c2b327dfc3610b843bda05f962d1f71f831aa11b2f2c07d9656765af23953eacc4a54055c17c4c4efa613ae4d3837365515535f81e29310e8fc401a34920016e92d64211449eedb39e3bccc8f34938159285f7efeae16f7e17c0d0b947f8f0af51f36968cce2dcf10e6a9ff995df8ff20e39bba09cf69bbe4dcd3e55a9e6cad74f676601163992779e2069f591355edaf5f5efad07d75c7d6ef094cbdb713500d6d213941919d92a107fb4f55bc9ec469dbaad2c96371adb1c5d1b80f68598526b996c1fe60cfda7787fff600e27d11d97db37965a5d5d765a60c31ef25ba58f7e63ea812d85de17b25f117568c7da369c1e7a4ea1d7e2b5f66607598ca1787a1a95249ff7a148f2bdb3d475e37fb968d36d4f0917f5b94f5fef2bffb99a8688f72036b2b543229cbbd0bbaf986ca7c768a1e9da4a7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5129caa746058fefa69912501c9b6f792a531f2cb30638f1f343d3625f0a93b066f288028cdab461d62f9273620b97315e6e9af9458f777a616c1bade2d3f6a89e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/79693f140367ae963c396d7952f2b07e3e603755",
    "content": "{\"tx\": \"3995509b02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c05020000006f476edcbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8f000000009096b4e5019114a90000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000\", \"prevouts\": [\"0e825f000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\", \"336a680000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ac0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082784ae775de15fa9e8fc81d7676ee4bb7b8b5e55729a9bd981757787c0c2477c76fd75cc9ac1e6f185878d252db6c7bbd874f5ae03fa9961d4f4a0208503b0750f17ad4bbf375bb62f626ec8048d4347cc1eef977780228a6d2fc47294088d561\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ee8e66f30a7a87e143e326dc67fe32abe85ab342f564e4c116c01cede66b1fe20e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e192555fb599a2fbb7b206b08358b85e40a527ad21aa064f750df81600ff72cf4ef17ad4bbf375bb62f626ec8048d4347cc1eef977780228a6d2fc47294088d561\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7988534604fb11aa559428f200cd7631d266dcdc",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff901000000939dafac8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47c01000000d2c3b2ffdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2801000000052131c304cb62b800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787c6010000\", \"prevouts\": [\"1f9b64000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\", \"1e9b35000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\", \"49a720000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"267d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89ed12ee2db6918b2bff03768a1c947d0f4fb00a38b9989b1add1650628df27e9913d4be53f363cb6dc14d29c1d7e4819045cdc001ac228b3b700074691e2599d91e402d116972020cc4db8f7e1431e7a7416668817d422dd270400f40dd8d238\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366c2c3e102c733a0311253a9baff0bf90ae1d58c1cd06313c904a26512d8ace0ad3613095503852f968cf254efcb9d0b7a7155094671c0665bdc16a67bf9a23af91e402d116972020cc4db8f7e1431e7a7416668817d422dd270400f40dd8d238\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7993ab06fc93824943100f468b83a388dc8396fc",
    "content": "{\"tx\": \"71a4ed46028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44b01000000ec698ea18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47501000000cce1158c0485037000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac31010000\", \"prevouts\": [\"8ce9360000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5f533b00000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_63\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0bf62e3fcb8cd9b3b2fb1feff203fb325907918df0fdd8f99feaa6108f15940b66eac66989e3d8bfc953f821791b0b5ddeaccd955cc2692db8b0d8dc0eb65838\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d31037a44199af88171941e79afaac6887d8a663590b9ff482039e14b6ede2265ad2f7de51506a10e124a0336396fc476eee00ebc8b99d96802c538dd19f7e6a63\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/79a78205700940deac5a3af06b37f7a837ba5d0c",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0b00000000841f9a698bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d301000000542e177d01f3141c0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fce455ed3d\", \"prevouts\": [\"95cc5a000000000022512089cd9bcf9fe9207377d5b979d86bcf752d8d9dc577da80e024c55776b1ac583b\", \"47af310000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"227d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c13c6885c53a07614131d749dc0b9c4fac4cbf357599a76450ee1c7b87f78943dc4c18ce03381be5d83370dbaee0482c0440aa7aa94902a00244e0237bd29478fcb15428af69077ee4e47ddc8bd2adcf7d97a29fc56c75a24a213a103a1e3586\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e86a45def9951625cf02c88598f8616d12bef3cc01ed824d79a70edf31b7fbe0e1a4a9bce64ad1fc5af22ad5621933415c83e23766bbab20239912b691ace9dee2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/79dcbe312ec0cae55271acea3fbcad77eb51a258",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c910000000057056869dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c47010000003cf378558bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44d010000006ea78b090428b4f3000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac70000000\", \"prevouts\": [\"9f7a60000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"8619550000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"478f400000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d54c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365edec6927239e37481c871e98a308ae148761fbd82cda43b44eea2241bece5c01ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045135ed0e678ad02d8eb601751aa1b9acf14c9c27e67d62b009394546cc2bb02284b0fe5a2ac2c1f7a0cb2705bdbeb7bce3dd33edb4ddacee2f772f92b01147433\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369dd67732c9a7b3d13cebfee85233046128c54acdc3b639bf5b0c42b2ec55215b4c2f2200f850d6a1609ea6f282082fe51ae8a55145cebb4c521120909a7edcb74b0fe5a2ac2c1f7a0cb2705bdbeb7bce3dd33edb4ddacee2f772f92b01147433\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/79ed5f67b23082b621f1d3d307cbb3833df70b36",
    "content": "{\"tx\": \"9808329802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd90000000006966cb4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0b020000009599b4af03d11683000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d2000000\", \"prevouts\": [\"6e94630000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d835220000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"837d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e6193e4630789cbfbdcb7d6fc995ac4f032c6d5611c1f6b733abe8356e59ddce06294a5d2648496e5016f850eddfdf01467fe69221e8567db6ec356a8117d8a748163db171dbfcbf374971659a5a65d0378eae0ee15db360ca8cf80a8c2e13046\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d4241eba4335af55cb703ef1b6547d641330ec95ac5c4cf0d3e8e3ea3eadc07c09d3f278379d69ec93b9031f683f10c8ab57e2d08c050c4811cb81bd332eb9e3ff15e37d03bf407745d47da370f693bba1bd1439d95d9059575aa23ebc3ce6e3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/79ee5f66d93ee0d29f8b42ccf65fc760525867d6",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706d000000001f9bde91bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf790100000000c42cfc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48601000000dc5b1c9a012caa0c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc786000000\", \"prevouts\": [\"2d69100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0c5769000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\", \"3b5e3e00000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8a4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369a508197ed6624452fb9289507f9cfe4408c1b7912a8bf4cd7fce31e05c3b62298751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d56e427c91532996b84ed2c37f8a26be8637de11530a49bfc255181ba6103e3464915bb1b7e7b983dc2170cc97c5c6d5436afb034e74288517b9fa4d2c2ab63870\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93655f123e6810ac5f5b7b4df9ac6326a0dbfbe957e974eedae7b2682ba3a8c02e5572db529171a47fc33c2e4ee960be7fb9400c27bdb6fae7dcdae272f7c7daab09b045cee6f1e54629d213b8dbfcd9de8aba2dd7f34fe21c75d81b8576e463c6b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7a043102c33d83ed36e9879386a6e618668535d9",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb001000000f97f388a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702801000000697c5d8a043f238c00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87fe000000\", \"prevouts\": [\"cce97e0000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\", \"fc540f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_f8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"05e31890e2496566adf98bd934dd029381da0fc49f134fcdb3893d4a3c0c03095ad365334618f693e153c89ec07a0a13f93331a6f18873bd6f5c5d588b8e319e81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"33dad7d4828eb94cd241bcfd765c1c0f883f2aca3617c31c021d1b764e328c5baec790392ff21e9d2fb5cbc3f82810cf633a4f8689edd9643e8db70549c5125af8\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7a111af866866f2de4ef478fd546fb1c0fc25d0a",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0a000000000dcc735dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfaa0100000058f69bca01f683110000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7af77dd40\", \"prevouts\": [\"61a26c0000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\", \"cdb27100000000001600141cc39a492a6f67587324888ae674f2f534a7639e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"304402201c9d0f0e15e942865c85a4a840ed0881e1d024f84c3eb034100f8b0c396922fe02201a02f3bf3fb0c6c33081c6936c2e25f47c9446461abd965f8639665e5f44a85402\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"304402203cbe8db24b2fdae8be9f184f148d12841ea66b8a4ff188602cb2fa179195940402205114fea29a22a6f40edace5f804d1ded0b7f0f10bfb2123cbb74b93a5862c28a02\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7a1820d857c8a49a2db73ca33ae771ff2942dccf",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5000000000b2eddc38bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9b000000005a19fb67020823d500000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac37a54057\", \"prevouts\": [\"fe80540000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1a6f820000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fe4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93679936465fe465f0d401827e55c2317c08ad696e5227da5899b92494a3d57c5ba365bb68c3eae5e6cd9b20289e581f52d4e8c0cb4ba58bcd8be9e67bc80fb920a1e45c38e8a62a0e5058038ea76117f85fe5d704aefa5d806bc1a7cbe3a990946\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365bc17b4d65ff6300e0318663c163f0b05a2443748654960ec7f2fad9f3ccdb63dcc932fa7eab9febb69f8eb1775db86ae183d64bb0b86855f9228e743b2ec6db917e8250b412828d56f092e1d9ceabdbedccb5671620a7e05a1f5a122fcf72f11e45c38e8a62a0e5058038ea76117f85fe5d704aefa5d806bc1a7cbe3a990946\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7a490995df2d5f17d023de70297a3ccd20b7e9f0",
    "content": "{\"tx\": \"50c82e5902dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc301000000530c23e0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9f000000006367e0c201cce1b500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac97445a20\", \"prevouts\": [\"24234d0000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\", \"0cba7d0000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"947d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e46c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa7085091e7b587d9e3d903161356c0634077d7e43e5aac1c0c25d5c3c805eac670235be472b05f11e998cd7dc8896eb16b23bac01933cdabddca8bd45937e3454\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936417d2d865202d20eebfd4aacf46381b0ece3fddc39ce14b62446cc40f8d1090e3ee723c85209fe64e13625f9e221aa1a5a0132ad156eaddb44490f9df3bced660235be472b05f11e998cd7dc8896eb16b23bac01933cdabddca8bd45937e3454\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7a4a6b8236fc89f7d9e11728eab5f34c87b831ca",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41b01000000b82575a3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6501000000474aeda00135f745000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47876fa28731\", \"prevouts\": [\"0e6e320000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"0ef12100000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ad1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93698751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d59dac82751ef42f4155e8d0286eb609cd4bc8c8b3be93c107754fe282612bb362f9b27230787fc79bd718ce7ac07558dd4f31dfc3ae0570acbd1df01407b1d4ec\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361f984e6e7c95b40499dfd8f685cb7972c8a61cdc9574ed2e0983d5b6eeeffb3572402ee5f7d01023de35bf8c020790747879409f1771ca1b4a9af174b095ec7ee5aa467dfe2257bccb94fb5bf6723e840de90a3890266560a9e3d72c84089f55cf37d2bf9ac9d65f4f9542d60f6497573c04b4d7313f44a5c611386102890a1c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7a59b37e047189062f0abaf0d629290ecfb35f75",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4620100000077ad6e89bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2002000000f77fe99c020797ad00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac10010000\", \"prevouts\": [\"0b6c38000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\", \"12fb7700000000001657142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"247d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fabda2774425301130c379b9a863bac2b926fc4ec0dd6af03d15dab43b60e3a64c440784f6f41cc1ae323b623cf5dcb000da45020704fab66b6b5f2ff7d67a93a3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082b9b18a780ce64b599d9d3042fe9b5b93046b018637f9f8cec8ef00735e099ba32f1db23017f271ba09e9de40cbf6bd4b292cb969b1168724d03b4425efd5cf153506420e788c3ffd3d8d88ddb9154e82106737a8dd2b5d0940daf68f275cd0d7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7a69a216cc5a6c99a19546872d16973b864b8ec6",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce501000000881946a160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270870000000050efa3a7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb100000000ea994684043ae79000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487046fe641\", \"prevouts\": [\"b8fc5900000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\", \"d298100000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"290d290000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"3d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa671c5f6e3fdb2cca9ff2c8978272a7c72309b5e793932f9bb10a0961dd619da6701c89cbc41056f58ce11974b5756eca381e306e17d72fcef5e58c3aca02cf1415eb41ce20b61903eca7e2f7903a7c5f76d50ccbb22a22a302188dbad2e46b28\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367a4323bca4261be341492d2c8aaea5b9c8cd338f75ff3ca656464aeff6e26a7ada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eef9a48fcabec25982850a496e19df71982d596f167265e15d1ec282fb30074b91cb891527dccd7fe22077390053ac1c45ab6e7110116df1a30c9559411f432f5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7a6afdaaff4560a33eba5ebd9df662b110b72dc2",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42201000000a7edade360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702e00000000e8af8ed604cd3f4100000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388aca7030000\", \"prevouts\": [\"d6d3320000000000225120bb5a47f5af791bd0da95f040450c31e81733ad36d8a4b487e3e6f1ab189dc604\", \"3056100000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dca1b743bdc65e78d5c2b60771c4ad4566262fe3c3305a8b61aa9fbf6a15bbf0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a5f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7a87119e2369843226572e9e9603e14022ad565d",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bce01000000e9160568dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7d000000004acaea1b0404d97d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374873d020000\", \"prevouts\": [\"7f13270000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"37b0580000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"624c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f393068994750671244e9a386d61bbc7bdd03428d67a6b3b3603ff438afc80a6abc42ab3738335b78a2a7135de763706b017ef32cb75bc24ca1210f74f6e5b7b3fd119d5a804161d41189f11d8f3e11243ae602674c5e73f1686492aa1f485fe\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1a90fb3f53527a925db2b4d49a3795cd34d4dcf648c4b3a4a108990f2ed12b180a28c39ce330a19a0d6c22ddc640bc3609271e6194de475fecd1ad84a88d361935a9a81b6bc4d13af192f1d19d1915de95ad8d42e49add8bb4e9a9400ca460b05\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7aa3606e89e98945870fd6072bc248da2ac00194",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce90000000060bcc3aadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8b01000000049096870147a1430000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d32e1233\", \"prevouts\": [\"141a590000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"33cf5e0000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"3d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93616f1c2cf89bd49cb1976d122ca27f5e410eace75a032574b33edbcc631c7f3564ed4022c883bcffdd4981a43d80a989f638bed5cb710560195e12f06d5f3803c1cb891527dccd7fe22077390053ac1c45ab6e7110116df1a30c9559411f432f5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362d14cd9d1df0b21fbc10702de522193e26661e8ce0c7001bc045f1599fb03383dc8c5662064e2d9613ba0f54feafa13b4a8d810a28ca520b1cd1b9628c3c1add15eb41ce20b61903eca7e2f7903a7c5f76d50ccbb22a22a302188dbad2e46b28\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7ab6a9ca3af298309556e392c5a2145121ecad20",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ceb00000000ba7843f08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b5000000008141d6b70267698d000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7966df5ad4e\", \"prevouts\": [\"fc6750000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\", \"81bd3e00000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"b47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367e7b268f617d00298f513ed9d959e4853656836f4da5bc24b22bcfc49034b4c690a6d927376acace3683bbc4ff9f5d15a4c9ee2ad4271a1fb38c29668c3ce61898ae4fb28ba039f9030001532aa52d54afebb8b1d186c7283d6707334cdf0cf3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8f8e322f728f7f2bda8f14cbbb71f9286e41438f49abc55856c1a694b654384417e736a60655dc533a38837433a3a305c9a2d5b0314030c91796018120c3e9a44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7ac66a26b371216e55464bd620f00f9b3cabf539",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ce010000007fec828bdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b09000000006f3caee503bdb35a00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac0f030000\", \"prevouts\": [\"950536000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\", \"2df02600000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"86\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366c9ccce34c09bc03bb8aaff06a11df09f3692c1f74f2178409984d1ab3c04f3715c685a6e20a464c0638846c4feb0cc1ab19a0a1d3cef03660e119c827d202a5d33ab5c29645e0220ea4ffd8cb7e67404885cb8b0cf94872336c7b06d59c3124\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b05e9ad3756e137278ae6e6e7c10c62cfba95395c884b707ca96162ed87516a80d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3b4167115de6998fecfb714975bc270adc7a6998f06c7ef8576e15f157ca8963750636431b24706e8b1111073dac761b2ba654f4832b7b9ae2a348c6845c1d327\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7adcfb6ec993d4f55872e19410191727163f6958",
    "content": "{\"tx\": \"b50f094902bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3f00000000c673fec7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb80000000046642ba302baa7c5000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acba7f4b39\", \"prevouts\": [\"15be6f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b7ea580000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063d868\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362564fd3423e77940cb8b994060b12804efb6a1c8e075c570e076404309a24192908709641cf32dc4788f906f7e3621a0528df09509ddf1e9982e4479aa4b5d9a6e41ed285c226ab336f92f35d989a379104ed593ec3ff802714cc8e85daf0b3be26db4ec4cf8c6a12d3bfb33a6f8c1ee971c26c5be04413f1d9dccd7296a9839\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368a3a181e1fb4c9a4cc49dfa16bddea418e5b2b086e1a4ccfab14939545a03d5c99aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb406f18ba19de64c771db55f5af06ee3412ffaea1fa921290752d742eff6a1e67f7007ac6d9f1365651a4d55e6df0dcb109d268cc6c386b355a4997173bc95c886\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7ae9dff22041f4c1fe093655030d83341a775789",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfef000000005d9bce2a02f6057300000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac32cbb850\", \"prevouts\": [\"95e1740000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"137d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cc2bf80b2db027afc6ff7c1eb2245c9e3cd90dfd08684ab7b931baf85a586a71155f23cd39ff67d8b5a6775be7b28a3d1b06bcb926a8f69937c20b78b14c2d485d0346f0de7f7080f7758bd86c81c482f81ad0c7703311f4b65ab9d7b77c9f00\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e048ad2721d56e7698732cbf102ae8e792035911a0ba8e4825f0ff9fa3590c070ac5ef61da5659d8214c667aee1dbe4febf87286965cb6fe696f5c1a17be3da5155f23cd39ff67d8b5a6775be7b28a3d1b06bcb926a8f69937c20b78b14c2d485d0346f0de7f7080f7758bd86c81c482f81ad0c7703311f4b65ab9d7b77c9f00\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7b1eb9664a41baa7f5e742f91eba9581bd509407",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdc0100000013b74e82dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3900000000fe9609b5020f333b00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acd4a59f23\", \"prevouts\": [\"e1ae1e0000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\", \"18ef1e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_a0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e23b393e9310418c33887f2e5655dcee6a8f5513e26de88ec8d0f1f46471ae2781421200609ba458fa40e41055eb8b7285d8c9465d511e0a3d537e272028a38682\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7d7da58583662a894d67136d1b64aeeff2e3ba3e8d136f57b0fba2e14bc974220278358ac13a9779cb9b8c866e4b1fee40a0b30fe6a7b4abab9b513c01d5d8bda0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7b242c6392ed925c411f5a03c01a5b224498873d",
    "content": "{\"tx\": \"4f48ddde0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704f00000000ab8735e8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1702000000c289f8a9017946670000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7cf020000\", \"prevouts\": [\"0633100000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\", \"bd2f790000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"d67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4fd5de156dec52418d0df8cecdd3495838e4d1d1b80598a34f381ec5024e2c9bd0211bc754da142cb3564162304068e34e33074851a6380a45a2a3191e3f102\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93671224880017bea54f91316a6ee82c754324ae6c5852e98edb5316f0ad1dd13a7eebb44c2a26e7d04d06be9441726cfca165ed247b802be55a42fd4c1a57db75ef0c0cd32dca2782b49e872f77a6f41a631e1b6bec2669bf2370bfbcbf3d4a769630d95c26588949f1b3ae4e4e429080b434b995fa18047406852c727cd9e6feb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7b302c63a0c095634d5b99d885e31d50d348915f",
    "content": "{\"tx\": \"861025b202dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9b0100000044a148f28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a001000000788338a8029f0189000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acafa0f542\", \"prevouts\": [\"2c4f500000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\", \"af973b0000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f24c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b5c223b2b99456872194ca1969830bfef335ab1526807af314f38e6ee168621b20e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1c56c8a32008d6f6a63b4b8ddfaeeeddf640e9afea8e86008d2331d68e9435ec7ea2726256ae6b84713fc66a1300a8292dc92aa88ab82f645f24355049764a6c4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52f2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb427e2cee51cdefa725eb1f8255cf98d00ca42f29f054478581d82ff254acc1f11842c4c20f1fedac94edf4ee37dcf580edabb0aa4839378386ec3447d53f529f2ea2726256ae6b84713fc66a1300a8292dc92aa88ab82f645f24355049764a6c4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7b385bf3549519df825d01ede2e8d9864af0d4f1",
    "content": "{\"tx\": \"d336dfaf02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccf00000000eb3e058b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d701000000e10936e7046a80940000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48745010000\", \"prevouts\": [\"c49657000000000022512084127e09a3e5abb8e6ea0ba3ce4737d1c2349f1be422ff5ce1609ab9b3fbb01d\", \"db093f0000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"7b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8e069ba5eeb0bec6bb336aeedfc480da3e66ab61ed5906063fe5b68f45dcb12952affe3792374ee751e9779d236e331236b2211c0285bb070b7e5d58aad1c033f64fb6de85916ce1333b57715a419fbbb7fd448155796c8af09a2e4a2bc14d947\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367588a9e23979d821fd29244dca8e20c36f5fbf7a2828b65ef7678089e87c8fd3565447efa486312fa493bc3efa8d0ca00e2c766484411258b08f0fec6b85156cd34322f35809060e9857f404c38bdcaf402c3d07c78e42a3b4d1eaa304dca88a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7b8328e1cf64ee86aed185c42ef2d58842a86505",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf160200000050c0ec8560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705d000000008597bb100331928b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc94010000\", \"prevouts\": [\"f8447f00000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\", \"18440f0000000000225120d1655db6fcb356decaccee2a8cc0c67c6e760726bed93f7ed1bf145bc7c6bd94\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d1137f8b15a9c4a2a780a0ae495bfb79a9a7db3f2ae43a0aea42148b525fe64\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ab8616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7b9f95b7241f7c9902e959452e13b67e26806ad6",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705601000000fa8520c302573110000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df979722368987507c0427\", \"prevouts\": [\"f002120000000000225120571bc713e1a1d58bc4a7da330f9b17653bffa646093e5f5e3088fb48bff87491\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"ca7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93602a88ba31ed3d41248d257786b5634ab0e5c1afbee5cd3bd44dcce92371e3b6ce4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8bfe61acb5630f372e1ed5eec342882068788aa3656bac92c2951e857c300141b065bfcb7199ff8296c5f7d41f3b2c6067d88c0a33f2878328c609d56cc191f12\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ab5bafd7c1f93de46b79074fd81f9b2e5cf089f85eea866c1ed233ec2c502c77e3449c69d4dd26d8f08d0fe98a8e8c1c38138c07c2a650710c465fa6c38a97e3ce21dc20c2e8df5336572f81421322a354c6d32fb525b1159d1e49b1e9404bf5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7ba72ec40b0c475f5d75c1845b6a75ce8fa2c003",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1800000000ddf5b1838bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4780000000089a2312a02051d56000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acb49fde2f\", \"prevouts\": [\"49f925000000000021541f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"afa3320000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"80\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a254e7cc6b57a9a94b6584709e7056848938ff7b5d3cd788647ee9c8c010053bd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51b44d35a0b3fc5d8cdca17f6fd766b3b7f076a7a891ad519d38c56688c70ff9dbd0313c1abdf0fb4e55d9b6d58af17743a20615f5654a8f167dbe9f4cf3a09059\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93689697d7380f4ad31bdb00c7ff0dc66aa22f6bae188bed2870f771977d2fb8298280ecd46f67705e4464578fc0c4eafd6d20a38d5c68152a49fc5d0c6b2a7c87ed2fecf8564d6a652bf0232997fa790ca314d73b111c417284694cd1738ccb12191585e32e966e39b6b25c1732dbccde0ae2700833a1164b08d78002e58493a9c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7bcb414301b9d095183f9b852a0c948309483542",
    "content": "{\"tx\": \"1af00c3402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd0000000006c00f6ad60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705401000000ca7050f7032c0a5f00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796a3093b4e\", \"prevouts\": [\"bd14510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"81c20f0000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"c5\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5115f1aeabcd45f20884fa261b27121b1c083fa5a2716bfd01069fab98e18c3b0e4b23f991898c0f7e80b32f00b838c1f1514616fab2a47083539335b67c2689fcce4d7767c8a9637a0804b073b1eb172c67de67ce152ade33f2591a85dfee2e5a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936811133f2935f27641e5de866d6b2526674271c11378ecea72e02f5c1283f85606c8f4b27179de8a3c9fbcc0ecf825a44b7564122e0508108d3381c6acb047da700a5530ec2a7d4ba868ec61eef99b13bb3328da6d520ee28822b8288bba3da4c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7bd191b72e7ea5e8407c5a81557fb3489574834c",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be700000000d5ae6cd9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c040200000082777c9703cb766a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79656000000\", \"prevouts\": [\"4bf723000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"ef46480000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"0c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e85ada3d451ef6042e8b6b9e1a05667773e16935ec77c1049456c2d3709876bb0617d0d4fc7404dd8984f6a1705481d95654b515a34c586c99c11bfe20e9503459\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93663a164d6d530eee3fa9d7e4db273a17bbca3a4f14a5c58ce7db70383c13db5d1234cf532d828cda123a8c35eaf5d21c66c96423d9004c9f2b6e0f5ba33bf4e7b5b0de380cf0ebf0fa9d17e1d1edb87a374b64935c1c67f0c5024fcc072643681\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7c0066094d3af7d6ae9649b1e0d8c4f65d29d5b7",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4b00000000f912b3eedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5001000000e0efbb9d02305ac300000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e775040000\", \"prevouts\": [\"b6b17500000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"bb5450000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"4c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366bccaadcfa8d465832aab59065aa8d3e626f6f7953285a334a61d2728458c8250315d5fffb9cd0a0ee84b5f33e057fa02d78cd067c105b2c4520fb43cbb3cdd0d30287fa60720c35e6546eaa391bbb3975ba5e1722a6124c426d678e7f784bd9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362c2c5f63cb8189e158f8fb075febdc1164769262e328fe4583383832734546d391faf9d665bb151ea32d070ad80c7b31483dfb68e75e940e326e177970210d6f819d45740b1e9d6e416a8a4978331345395bf058ef0b936b66c7755017d83c65\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7c3defc5ef17cddbacd31b76689e0f6d0737ac57",
    "content": "{\"tx\": \"6ce4a80902dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0600000000fb9a44d08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4aa00000000cd2115bb0257a88400000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc0a7ea020\", \"prevouts\": [\"59204b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7ea13b000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_85\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"695769ffff5be4e03469e3c5569ca7a6f29500f1e996023f01ed486bcdfbbccacbda5e33d5b1540dd7f1424141ac31b7a800cc7e914db5f01069bc91eec3e80a81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"51cce5536ab32b9a7f786d62a0e2ac4ee155062851f4919c2ad5e2683c0406f86833a10d7be40fa8f9802ed72130ab96cdd4e4bc6324373bcdfba4e868b3f90885\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7c7017c2b46f27580791e590ff2536195830225d",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42001000000e00a97b08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c413010000008f316cc504fb1b70000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a640010000\", \"prevouts\": [\"14ca400000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\", \"66fb310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"e97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e0edd1eeef23b4191adb89e631380cd7acdd7acf00b470d5a9d9dc70e20df3f09bd7d7e2e0b29bfb283546875adbaa200efb560b624d50a8165ce6ae8ed501592\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cba7bcb35edccb3c3e0177d255d46e6d1d70e0b739c307d2394c91927eddf8d70edd1eeef23b4191adb89e631380cd7acdd7acf00b470d5a9d9dc70e20df3f09bd7d7e2e0b29bfb283546875adbaa200efb560b624d50a8165ce6ae8ed501592\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7c7b7ccbaea2f13ad6524f8a286a5a8e5de67e21",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1101000000a081b3de60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127053000000000c7b5fdbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc5000000006f40e899046516ab000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c6030000\", \"prevouts\": [\"bf8d4a000000000022512074a4c3567b4c4ece2d1ea256a6bf2f85bf4dc051497bd8ce7ed8816e2d4c108a\", \"befc0f0000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\", \"19b35200000000001653142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"1f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e8a47d733f2ac96a3990499de942ef9a5afce6e4fdb28ae911c182ccc4b722ed2ed661e9ebd30f651fa020177c2a1e4ce51b505c9194e43d6074b392863f250ba\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368244bc6a63b5727baff32c8b1af1e9c979b77b213f20864b1aba73e32e7aa16fcfc86bca0a8859889d9efd3fba9c68487fa49a78b15c293938d32f430a3e576ab3e02c0e1665e1d6a4b6ef98a6ef3a3632c98688db315e4c8eb8907479035d72\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7c81f44f5bced662dae488456a190a2b5b68c852",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4df00000000d95f0a96dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8f010000003207e989016e8a0d000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d3010000\", \"prevouts\": [\"4a6b3a0000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\", \"6934240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a80f05eda5fa6452191355b5e1bb0d14413a0834082572e8c7d771847039082ff4028dfa36b64d27678ddabdbc69f16d7446912da8038761ba6261574fbbcd2181\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6d92fce635d2cf9555981c7cb111fe1c0d137db468756d6f2fc95702a43e94218b9b189cf30a760b11d004b71866a4614097942592723a53e7a264efe8f307bb0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7cc6f39aa5cdd7a9af8b06f6627638b3bb770f40",
    "content": "{\"tx\": \"0972a5e80360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702f000000002df915e3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0d010000005dcd57a3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc0000000008fb04dcc0287d9c80000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac77000000\", \"prevouts\": [\"915d1200000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"ec355c000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\", \"26b35c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100a6d2ab2947172e87e0d0420fcaf6652049471544cee25e0b022dfc55e36b0b0602203b0e29188ba06f91bf1ab0ccd70b7c641136597585c13c2ee17a619ea2713dfb834104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100de378d47a3861a1b30501fde0c947d82cd142397252fb61db7da9ba97ec0a2360220707b12cb0f3cf8b2ea50d322da7b3a68e1c5864180dd2520a58d7ad101cc093e834104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7cfcff79af9057d0133f2b5da206b608722bd025",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf601000000eb15c2fddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7701000000ce8ae4fd044f5f4e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a64ae04558\", \"prevouts\": [\"5f3d280000000000225120768c54f13dde172f25cce5a33aed38e02f08031f35d73759f73c7d1a105e2823\", \"abac270000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"287d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368ec32039a2864f4c6d05138d42a3bc8d06036aba11fa129d2d36383244da9c9e18f8625f860d8689a2679aa71112fac717f40bee978e3269b215b9f9d8467661efcb4d33820b2e80b50b7a60cab20b6261c566fe48480267b41ad585cde9a4bb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936980a251d9658563da155f8261bfb8adc21885ea6961ac467eaee09920ce56e15e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e896153d9d0825641ad9dc2862c4b07cae929842b36229bdcb06007f7d47362644efcb4d33820b2e80b50b7a60cab20b6261c566fe48480267b41ad585cde9a4bb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7d568d459cf98a02f42d26cf7a40def28f45c07c",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707401000000447c0d19dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb600000000c89d618601bb761000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac83d9c85a\", \"prevouts\": [\"0d1d1200000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\", \"d74954000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"4730440220111c8a8e4f7073ab568c295023ec7cd24c3d7003c51272c8bf4d187d87ee4d3602200aab60c8970b4d9a4f4181b88bbc1cbcc267169fdc72dcb7ee19e07486c03e586d004c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100bc09fb85699d2d1050ce419e41f756b8d8e91d16e70fb3095ec494c143e6cc47022010834768e94c9da9680a4c68d39bc302651dfa20c77d0fa8057ef1b324c753406d01014c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7d77c20b635f8d363cafef80ce333359495fddeb",
    "content": "{\"tx\": \"dbf3e74b02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b890100000001737dbc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700a0100000096c4f09401d39209000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478760000000\", \"prevouts\": [\"7252240000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"189a100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_d4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9d0831b6254a9df865600f216d1b11bd1b435ca20e650cce38e4788d5b555c7f2e9510d3c0e5f62fbcd753efb1fe9faf68a42863c02e4a5ec62edf31d3a52f9202\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ce36f271cd209957a8c4fe15564c95ad1969360a0dfd19764c6bc1ad1fd4ab5da1aa3dbd7981dbbd0ba65e822adce8229396ffefc2c5f641027f8c090fe53e91d4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7dbdb91634696f23cadac0af049ca2841cbf75df",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2901000000fe70cee560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c40100000092a97d7a03d69a2f00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac4a846650\", \"prevouts\": [\"c485200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c66f110000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"ac7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e5a9aa32e218bbd7702dd80b5ebdf509d58cd1514da294d038190654a927a1119f9ef29ad3e74b34f129235a64deb65fb580c2718ff9462ea3ca43b3a4f56170fc485b911b91245b46c320351c8e1d13bb30ee22c3f953d2224593bd4b5088ca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93658c6fb8444bf3f1c71dc62d586de8f6b9f63c49598648e9eb416ba7b8eeb55d0f6e1ab16ab4bc20af15f35a7f6b67f82a67b85511624b76e02698979773111889f9ef29ad3e74b34f129235a64deb65fb580c2718ff9462ea3ca43b3a4f56170fc485b911b91245b46c320351c8e1d13bb30ee22c3f953d2224593bd4b5088ca\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7dca132115921f6d0134e317bc0c5b2e5b97934d",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1c0100000093647caebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd200000000897280c9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf63000000009dfb36d60406682001000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388accbd14a30\", \"prevouts\": [\"e211480000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"22e868000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\", \"cd58720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_7f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"27eb6a64cb17ded93d9f3b3641927a59f5d27199512c219b61736963630809fd0951b55407ee9bf6fa1533b234a10f6e97712cb7e7b1e8f96b547fd9713d0a4801\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"08e7b763fe61e85a11cc699bc7b9346760359b81598c06e1749ae83486b7ab8bac6a81e2d83204f96c7235413b8eee5c13e9ecff5fb2f40a9b7060b36d4fdc117f\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7dd14622cf7fe1695e710f01b45d90250043dea6",
    "content": "{\"tx\": \"ad0f55ba02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf000000000020d415c6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf37000000008751388004a9f403010000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487cb7cdf54\", \"prevouts\": [\"781681000000000017a9144c4b1fc943f04d775886b4f6d3c3c73bf7d3118c87\", \"2435850000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"21511f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"182f98d35b656395a0e279e8ac79bb10de9f4a0abc90e5019b10ba0ada67ce243d579250203a24e5ad38b67da658ac80b5be97b672557738959f625878e9628c\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7ddf0e4fc007dcceddccc60c7634ce32af1c1782",
    "content": "{\"tx\": \"8e58b9e9028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b301000000df8399ad60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270620000000088e2538303dd3145000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d6bda649\", \"prevouts\": [\"7be839000000000017a9146704ae21c886c9ded757e2b67d582abfc91902d487\", \"05500e000000000017a914f955a33e905fb6c7b7e694c8cef25993577deafb87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"21581f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"0d74bc0c44327702fd68a9e5652814cb4b2ec976729a3f33e2510bc66054b9d42152e2231d14e91753c54ff32f3659e978c0b9868dd8fbf4e474944350321844\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7de80c1c4a6415b28404560b4e476f7ff798b292",
    "content": "{\"tx\": \"9a15a34503dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6700000000b98902bb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47301000000b91d6fd260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703d00000000c51f3a80025f6e7000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7964c000000\", \"prevouts\": [\"e6fe26000000000017a9141582f8bc3490e924b143f387e99eced40303eaed87\", \"fca73d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"973b0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2355212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"fa032475eb0e364864508278f4504454d21962b347e1c5dff402085489120264a90583560a08b8f94092ec583e9a0827710ef8d9d8bb8e6129d91ae016cdfedf\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7e165223d7af3c0a9b55423a23a84315b3549c34",
    "content": "{\"tx\": \"0972a5e80360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702f000000002df915e3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0d010000005dcd57a3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc0000000008fb04dcc0287d9c80000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac77000000\", \"prevouts\": [\"915d1200000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"ec355c000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\", \"26b35c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"027d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936aa7d3ae1fdbd8d879becd21fdbe0d91f4e7a114144544c8c67df92a7e5482d1e69828280661f54bb25ef200c9d39138c753346ae1cc558703fbc48b26980763768cf2d3d0be95621d7446294d89d9a2894510d2dfb4e1a33e7316a17e39cfc99\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b93aeeec33fa290f41b43fbabb5874009d9963b54e8d894b1b04df286a8ec41aea584dae4332b3044a4c8d351fbda1a9ce22b0be13f72ff111d82ccfa4c6759e0e32049d91f42cbcb04955cd98e985d287b85d3c77c1154d8406ae5e2d81b7b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7e2b8b5d88ab86a02660c9f930b1dc7bc915500f",
    "content": "{\"tx\": \"1f1a48c703dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9b00000000fdf160f9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c03010000009968b6f760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270150000000060f62d8a013c37600000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc85000000\", \"prevouts\": [\"5a1a200000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"f39b5b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b0fe12000000000017a914b0b53ba433a336ced94ed75e23248458a1c69fab87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_2a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"22b22bdc7c8764d8a370ddf4e44c2bde5dd67a33f19a9b524d4fc0fe016fa1d4ad8e3533012a33afddb611580a5c978a05458c4bc60246296c2b982f04dc431c02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7e21c85c67b66fbbf1d94c0a4b9238c1f3a7ecb1b5af4b8d21d34119b2ee5973e2bdaefd1ec9fc2cc6ee595c77b57ef15bebd989bb97449a0639a4368e99ee792a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7e2f0de68af4544f103e74bd384b74b2e2f85241",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47a010000004febb4ce8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45701000000ef83efd203d03a6d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac6e000000\", \"prevouts\": [\"a714330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"28593c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_e2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f25b6aadc3c2b33254ec57dffd2c5cb94f23b0e57a16fb495537416c3a31f0fd0be6091a8fd8908867ed74ac8f605a96ceb12bfe1980082e55b69961630a128682\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"77cc97bbf70d60e153aece39c2fc93f62ddf4922d93c3e7492f27018d29208307dd98245d89eb2adbdd3edb95fcd244fa4fd5ad9edf5f90a0b01460428091e3ce2\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7e4029c06ed03535d5f51420d860c7da16cc155e",
    "content": "{\"tx\": \"ed787e2502dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4101000000e197ff86dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bba00000000cb7df6900128ef2b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87281dee3c\", \"prevouts\": [\"7dd81f000000000017a9141a56e0fb41afaf4b9e6feff1797087c69015162687\", \"4674210000000000225120801095ecb8b6618653d214b38461db03e06a33e3af24d0223ea647d6569eff0d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"225e202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"64b433ca7a1fabde520bade4bfaea818a96144cc46107cb1135781b43404a3a8abfba83e664bf2f87295b35658a6da12fe4e51d1a30f33a4dc72c9930f5f1c52\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7e70e8a2a78ad2b7e350dc4a07651a5bf027cb57",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0d00000000f0d0e5afdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb5010000001fc1f48c03cccb44000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acfc000000\", \"prevouts\": [\"f2bb1e00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"59da280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_cs\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4bffc3b1097343fca22d5fcdb57100e76f29666e1054fd1e887e2c7efb35b3d6e1f60e1fff905f0c719d392e95ba00c2dcad1188a8ecf4c928f2afbf7926c3c0\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b7922a9ef31868fd0bdd2720bc44a83a05911c979e226e14df12e43105fabe25154b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b7922a9ef31868fd0bdd2720bc44a83a05911c979e226e14df12e43105fabe25154b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7e874b33beab6c09e8cdbcdcf34c226d959f53a7",
    "content": "{\"tx\": \"0edf5c600360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ef01000000195c71c7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2a01000000128387c360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706301000000d6a1ca9b01111250000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478780000000\", \"prevouts\": [\"77320e0000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"f6ba6f00000000002251208082b91639ce415d44b93ebacde06f605687bdd15466bf93e6aed91c1a4a19e7\", \"1f6e0e0000000000225120ca2f7736d38d84f93b62b86d7eca19a35f2cfb6705849a1c6400bed56ad761ae\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_1\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"784508e5109e40dbf20ca51397fc002ed5125470fd6554c0ee7e14d8497660a36c8964118cef10e8571c4346463a248344c471511dcd0fe340cdb879230e75fd01\", \"39\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2000636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366766fac9c6e784db5f8f76fdaecc5908d346fb10e2a94f3d53afc856df676be9db8a063504914bc780e57f4ce8afcf899f13bddbc9ba6d59a4f52d0470abfbe40b0e8bb2b66fc463e2d54d81f90a0e5f51dcb3568b3086b1f357bf91f83906944fe8fe1069e54ae3b3cb1fdd7472a21ddc8023e0d3d8d2e4897c7cab26f377f7\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"784508e5109e40dbf20ca51397fc002ed5125470fd6554c0ee7e14d8497660a36c8964118cef10e8571c4346463a248344c471511dcd0fe340cdb879230e75fd01\", \"\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2000636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366766fac9c6e784db5f8f76fdaecc5908d346fb10e2a94f3d53afc856df676be9db8a063504914bc780e57f4ce8afcf899f13bddbc9ba6d59a4f52d0470abfbe40b0e8bb2b66fc463e2d54d81f90a0e5f51dcb3568b3086b1f357bf91f83906944fe8fe1069e54ae3b3cb1fdd7472a21ddc8023e0d3d8d2e4897c7cab26f377f7\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7e926dc258ef73747c6dee6961a01976f75e194f",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709100000000dc1650da8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49c000000002a8e0ff10207f94a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac4c010000\", \"prevouts\": [\"a0e70f000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"e1773d000000000022512015f6c01f4cbfbd03849fbcce8a636b49e5c18ed85b3712a10e7757f33687c2ef\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e04c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93660eaf4545b5f7166123e054cf15eb738fe32912d9aa58946aa01c3af8881f1593713490b1e7aa24138c57a652efa6d547b3fb45fa4f05027d6d9331efbfa4d517cc0cd924d9aecb0bc2fcf01621d0e73a88693291594fa52fe0219caeccfa5b3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52e0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4ed9d9b4b668c8953715b364fc922d70c032801be88e8b1547978372f57dddd133713490b1e7aa24138c57a652efa6d547b3fb45fa4f05027d6d9331efbfa4d517cc0cd924d9aecb0bc2fcf01621d0e73a88693291594fa52fe0219caeccfa5b3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7e952aa0d4d919ea11291440bf1f5548858938d6",
    "content": "{\"tx\": \"66f1c1cd0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ea010000009c1919fd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e000000000477db4ae01416e1b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4879c000000\", \"prevouts\": [\"77a610000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\", \"afed0e000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063c368\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936353eae18109edee214f2be0a3d138643cb97d12a4be5b4a3033565f50658463d637f7085334bd6ace67733ad5f759fad65febfe656f63b2b30abaed1d2ea29dc9de97a2505c9a0de734aa1a6c773f3979bd21cdf34ebf80e6ce3c625c087f57a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e8c9e4d0011cdeb9b088f09f0ebbbf16a9fa32ee194ff7dd3162fc83b18004e07cb9328b065f9eb1f6f110e9fe7273590c885552330e2c3269c2432845ee2744cd8777bf679e716871b092f46e3a69645e6fd098b2f58cf3078cdf1926d6f261\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7e95b122591089fda778a2dbd434c55672c92346",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ee00000000e3d0b991bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa8000000009f4a9bdb032cf480000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796122e1a27\", \"prevouts\": [\"a2331000000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"dfa273000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100c251462192731569098900cf1d3b21cf946d6e773e17b9ba0bd3310fe26e3bda02201c53d83c8af1e3b9976a6c6575994f9358ff87e1ad9688369c27c6ee2a57839783\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3044022019d5bd6e1a1ea306364e81fd63fa9199fd0293d96d83b3a65609ca11ca70b8c7022038f911df8254b7d76da4d4003d68b494cbb1edd6981f67e48474773a5e75f22983\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7eaf9980118567289bdc91759abbffb031b64227",
    "content": "{\"tx\": \"af7531b002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b15010000003f6948df60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700702000000b229d6fb012748260000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc4f020000\", \"prevouts\": [\"bee5240000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\", \"25fa0f00000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c3d637b7011ffd00eedbb445a8092699a300f1bf27d1605b591c1c40de685c877c8ee2696e70fd78aa4612c8389c2f050673617b62a757077c4637d3dbb9c49ff52eaf25b03ae274bca090a0b92b839559e9d06510d569b9673468a05ff100ba3e27f6892dcd04d2917fddca63a34f682577eba1dfc9759e8b6f640961840efc15b96da4e473f5c8f5de0305fcd4504806b0195502d7a0403b7bcadbd35689eb9516feab007ccfcc5593e606fc87902da536366e37aa3ae4d9a13e794280aec0d945d0bdcf8875238ab24b771e85c85fe25eae1c7f852c24035bc708c50f711b7c87e3ec5a3675262ca7e9677c17c773c51b1c82ee074440c201e10a5229ad8f70ec228bf41d70cbef2ffda3ee36bc003e82e73cba0f45b5fb050f0e71c732835637c7890a29da273e369192adf6bdee514e7677d24a38911b650e8b10fcba06ea15f5081327675a8b203d1b859d16f94352eb975f491949d673c2380dc2af40d1a21d347f56b9657020fea68ee6a3041c2a29946f0cf7a892c7af3160e00889b8644ba8ace8ad79828769fd9d05a157ddccee7e7f4749fc43b3fc5b7df728521d8f809c394a5193da2faf2c00c59bde8e4e114ff76474cd710b13a183dab9bc0928c7d41ba37a26ecd1f8b05535e24d05ce14b47e2967f02521874205ea0e02c636ad2c46a937e4ec619370cd2c58eb123f9ef7380c2b0377117c5965f8ceec96e349cfff3b1c926475\", \"9f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d928217635fbec2956e337d8cc635fe8686b115d27313616c09cd1eab494f2822016530e482bf934dddf93f5dc5c8477f8e54d8918bd8c9b20d47f007dad28fe6f3617d560800e971f99646d89bd2028caf0c6d02b6f505a11fcad3ec349c801\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f1cd2fa2b7c261d5486386a1264e4af878b2f4c5d663b3b0c67cfc28c712388798b8261c41e0b044e90932c7909cd8102817b4e6d97135ef44adc0bba486b9b683edfda424e49226f651512008f3a0a63438e6c3ccd45f5d3ea57c82ccd0a502a9ee472bc43f930b1bf26eec8a35ad8b278cb5901984aed2f4d8e58d05dc90533927da8594e8acce30ec1ae29af933f9688576424853cb374c9deea7018a895cf86ed74c71255a353f7d6deb9b19f5c8f487fb41ef7805c74e296c14fb249c1fca128b69309800b504f636c47a15cc36e5833bedd70937e13485bb0a33e63f10cc94709f320e92cec22b595a155313c9af153e82538978da14bfc9bbb2a5ee0170bf1c8fcf60bbfaa4d4dba73e2ac2bb8a966a19f5df071568fc6c78c6e63601e44206358767a1cb6b2d86983d8e8ed45052fe049030d547baa085458eff60b6b0d5cb09959d612a60c904c8baffa6dd634b65d32e08d7a8951dbdf9991959e07c9a934b197dc8e137008719b9735a79a5bc56941b6ed78cb321007bb46138646678c8624bf4d7d1ed94dbd9beae8af23f16dad5a7c5ba22a69d8132a6b9bf6d22b46880503528628dc53d98bd117673b2b3ee49d742a8a2a135683742d91b3a6f554fb32a9adb71d4553e9c0abe58e37d629efc42a76fc2945d40f4d5712fd9a33ea72f4115e230d9955d9cfa859dabe809c2198c8bfce85051cf35da7e8a7612425289c42e56619c75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d17a8d967edabc547e7e1f87e3be6b8f080116454f38ecbb7d9556d120e85891ee453f7f7ccbda5a0ba96115b963083e4b2e9e93a3abf82e4dae88dd7e6a6b566f3617d560800e971f99646d89bd2028caf0c6d02b6f505a11fcad3ec349c801\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7eca413996ccecf266e5bf306d63db50903b1ec0",
    "content": "{\"tx\": \"2bd6955703dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca700000000c8472f80bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4600000000d13b7096bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf22020000007262dfc601ef371a01000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac991f5956\", \"prevouts\": [\"846a520000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\", \"8cbd7300000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"3c5a750000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"4730440220187c42c98be72805ee6a6005328cf68088eb005b2ad3e49bb24b484c8b33083902200a2b9a27d2ffa0868f0d65f9d1bdea15902b86887a5bbb245c4d277150dde879342102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022003afaea420bb105276001b4fd88ab9393ef3276a8f51b7b5f348028460e5dc610220381780c541463889708cc3ef67fe60bddd79e869e5e56652a33e4d53d4100782342102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7eeec8eac2847cfc829b4f04a7732871fa5b33bb",
    "content": "{\"tx\": \"87114d0402dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bda010000001bcacfcbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5a01000000684733a90404c2710000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acefe46a4e\", \"prevouts\": [\"33a22800000000002251207a86f45d21fdb08435e271cb417d7b8bb1e066ea2bc109ea12043ac97c7d3e10\", \"94014c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936275aca17f49935962eac90c180a8f819c2936e0eac025cd2a6a39b05ffb78047\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ab4616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7f31dda7857641eb43ac8f245109af960b934c86",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9101000000f4573a6f04da7c2500000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac0f4c6c56\", \"prevouts\": [\"766627000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"677d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e5c46f8483e321cebaf2ee3308d3646486cc3944f1006fd31d055421496231102bba6f8d4f5daf96bc6060ee089cc6dcbd533ad30ddd55009697a11ce72a351d2e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdbceae773fe677547a5f8be2986f5e4c7dc436c0d3f0e1e86711aa468c8778215\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082687eac120734a03ae4c27d3bf57e4c4c383799b8e878ebb1c20141d650e89e9fbceae773fe677547a5f8be2986f5e4c7dc436c0d3f0e1e86711aa468c8778215\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7f36ff093686c198384796967779e512b39b0067",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa700000000ceefd48b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45f01000000e73d30ab02afa5b7000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7719a5825\", \"prevouts\": [\"0af9810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a25e3700000000002251205d2a5ec9abc88b8aa90a173ff406be7abff8b14799a4f6ae3ad10e99906551f7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936435ae76ebb71dc9bdd4eb981061c35de943408dcc30d58732258fe975e745805\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a21616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7f37fc6f46dfd2056c23dce7388e996b2e007166",
    "content": "{\"tx\": \"8afa4c8302bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1b020000003cfad686bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5401000000082929ed0293b5f3000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7ba010000\", \"prevouts\": [\"962f7b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"51277a000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902af3a911aa679f7e606cda485f57acdd53a140d2363ca6ab2a2da3182409741271a038cd152447d92e99cf720e89c7f69987bf3f52c56880f40d10e1802b6f96664211907f8b191a7566205cc36cf793a0b41a905e8c81ddf9f033bdaeadf9c88bba302fb88d20f188df877b814aab86991fb5a4e6171309c703b2c5e1617e18c53c8d9ab0ccb7612c3e8021ec2b9004e8a713f3e3f6aa0149557fea0356a69662b072ec3c0791a1e9477d975ccc161667fe05b7770fa4afb89958e1e060baeee59deb8799c4d0da2decde5cfdeaf63c5945b1a2193887319b7a2e88f98fe390c02e3f38cf9337fe608811d28ced82549e4f221177ad1746374e0c5c9ac7ab02bd5a4fdeab12d2b0bc5c1800779585726264669a6f82960de6f3d8385ccf6eac83f768e9263ed4b01d400e3fa10d5efc506c0f6ddbe7eada4203493b89514a0864548c53a0882a42201b87c88a2ab39eb9c2db6be8ae372da2bbf60b5de69fbbbb265bd919a73fa7cb4f9d16d5b89eb7d96948e9a90222e13d87a54aff156fcbf969c47bd46d0e0ccfcb0f1a9a8ab48a976ba48369735feb355cd48003d5b94dd39d85e247cde37f0ad88ee5df038047bc569f7fb868c27c85435b0d671a3a40fd4b2a16ca7052d9304f61aa432257ca7d234aabee4a8e95144945d25bdece32ea1475d8fb9e9b6cf465b90524e53f6ca353368f1d2c750cdf6ef69d8b7cdfc643c9b4e28e3d523b64e75\", \"267d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a4636362d36fe430e464691f92fe9bddeedaa1a868b07f700ddbcea110392233913d4be53f363cb6dc14d29c1d7e4819045cdc001ac228b3b700074691e2599d91e402d116972020cc4db8f7e1431e7a7416668817d422dd270400f40dd8d238\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090245450b3e387113d0ce5d0371276bf6936933bd20eca3542c8a0636aa706b44a2fee9299c961e33398111243df0aef0b83e5a7c9a5347edaff04f8aafb495ae71b18d0ebf602ef8f1f816612095ac53819e0f7aec71ed33698972db5e08333813009885d7b8d3065cbfb559a3644e6fa40c190ebabaa2b8f01fecde4484aec8951db5efd5639edda806a7c032a28247917183f654e5afa11440f81d77df0d152c105709fb458dc0a2884579ebb0a99ae4b01916b6cc1c1f30a37e794bca974ae8f6ef5e77196689875fe4d1cb2fbf1bb88172715701c77acf0d198262a8033ef2de49d9009e30472770c63307c986f5da4fdb3ec8baacae8409df045c6289a11aa427c7499977574c9d6777111ad3d479f8372456e766a95b388e6bf3fec7d250c0a518a559ef6dab42edbedd059d58ac472c6af092c448830b2b68327250b8517a4359c86540eddeafce06983977c41caacde58f15551f3e7e5bc17f791f6b261076072d040214a5da939a4292f940edcf6186fae7121e44366b01d7f5bb7753d09cd8e9ed2c732c005ac6d8a4301653474e4c8e25d48bc27c5006642fad23a1ca8359daf4264acea7a2f2a7878135fdff0e688d9ed6d2fff68a9c4dc89a8826de329726219fa1a5260b122905ac10d2b6c691af715179177433449a17d73c2224359815eee3a34b6c0be96cbe9b97de7d3ad86f7d9e8cc868739e898eef8d995283aa61f7b38cac6a75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f7219e5458c3fd087680f56af7e0cb5a098c29a419645486255ebba5b453a7aacd4c02f64c49cc162ff9325daec6263c98ea78a2c5346e44c6d55d79722c7edb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7f5fb097a29a27b116140b9366006e578d1139ce",
    "content": "{\"tx\": \"007958d602dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9e010000000160a5b4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2302000000b9f715cc01b1a3b900000000001600149d38710eb90e420b159c7a9263994c88e6810bc7a5020000\", \"prevouts\": [\"8ce35f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"47386e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_f9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"577367ed863cbd40fe824ed1756571da2db8ce634648d5afff58d64391215c28a1231178cb28d84833af6a5bf04e82bf49a147fc72b4a083e7285c8719cb2f2001\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"611b2f417623f690adb513d383a2976867502accb39f2f7ec363f47a706e0933661e7060ddbc7147c21f485c212d1c826a0c2aa3a7dc45e8c9acb53a2fd798f3f9\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7f6b5c7e454d101b3d586c7653b251e1aaa8404d",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1701000000c7fc959a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704c010000007eceaec901a7a40e0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fce500232a\", \"prevouts\": [\"49ba1e00000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\", \"f00011000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"48304502210094a2a0dcb83ebe9818aaf887f84bb68cba54c5e376590146f070df10c7e9ac7e02207dca24c14026289cf3e9c046f2ddfc6ba274006aee79de870f2640104522bfe4012102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100881d2f9416fd35184a097cc6b5566732ed3f5265ede249783b8d21eb015413a0022026f3a6b6fefc2ce1e5ecf42a93d0e583b4aec62945f0dc9a864487a0e8657fde012102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7f76a08aef5329137e1c80a8f4fc7245375849d9",
    "content": "{\"tx\": \"dcaf384b02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cda01000000cf8850f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd400000000479871ed013270a100000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc4ef5541\", \"prevouts\": [\"db3f47000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\", \"03855d0000000000225120fc12a8d66cb681b25d9244e35510bfc0dfd4b0ce262903c87a066ca254a38f8e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090211e5ca7772292b1441e62cebc7470f5bb206c51aab540a8c0106d008dd2ed22fae5fc24244a2b4371591cbd5c8c42c64355a4b38a62b3bc33cba2c1c1300453c77fdb4e16a51c82c2d3929034feb33f016bd1bbc00009f128284aa84885515c45973e014e7dda5cff953423da3b14a1688a13446a47ab3301287880af7722eb96cdc0d12d9ba47f8a65c37d05386f81abefb301f1a91d69e9ba6a01bfba13c3f1d7a0029162702a800ea83954fd5854d235f2ced6c0c3538c66e6da9e7714cc037542c9c1faf47333d80d4e2cc628d9f1ce2589c1b72a2377063cc38983669036f6946492f76345938c023617137cb4fb8884dea466108f3daa73e5d4da38d81e4cb2f08137a83e1a54fe5e9e86e7e62d1c0a355e3a2ee345594c57c043c8d2239e80f12fd5922a23d3aac7420ed5a6c0c0638277fb281f3798892ff24d2b0c3714ac1f0e23cf2f9b55e57da8d9ab487c129df028d91d76de8c37ae965698476189266b7d4dd76c52c4f23c02039018ad7ea5b8745aebb87ec4adaed22c50b2e2e666bcb5b755cdf7b6596c1537594012503452e0b4e16ba2752967acddd798bd5d7a3ebb18f5e5944663b5e570c04cda945930aa1363fd32bd91522701f7bed01b1e8e56572cfcc8bfa7940179ff2aa8e6f0c4ea1f6c7b97c5674b98c986a2d9b70ead7424d6fccf5be6bb136ced57a2df23d01f6f5282046d26ea5f4aeaefa479aaa5078c262ff8175\", \"2b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e83f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082885bea8937005622f3eb8b2c440108feebbdb5f3ff09e0402c722754cbcd9b2d195038de5261112827291f7af9c58b034003ed818b7e5ec0d4ccdf81f6c2ea4d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902fad7da56013d94c7a2f1e1441b0e0151b7dad7e0fec924e4565474039c3fab075da1bb75c325d628dd4339bd8bb75115a95d42acff0c04c0642dd9e23fd80fd2a4e0bb3ba292e1491bc114e7958ff515832bb364c25335e706f305eddff3b282025ed1ec827bdcd494e446ccaeaaca74f7df7ec5c5cdec3a36c15b20de7ea87031a7bc31558af79e9d2a13d5f717af88d4c8fca5020abefb83bf08419400586529dc8e1cc0a107dcab571dac46d266d3cd9fe8127d955ff4bcc4422d83d9f098943e85aaeee380c717fdbb8bd60236884e22d4eecfb5cc88bdaafb862bf160549607dfd4b1aace0f5f3492ed5676d62326087430bb046709cf9e519eb9c01bf7f6ca78a1a70f8ab87c31e66feed7a8aff7079359042ce004892dc0c96ff16ddc832d908a053793e55748aebc560fcd5f7bf75e20e31612a264c546093b8919eb7d88f0c1c5f494b7eb5132ea7f8d14baabf475409ef35fbe00ee41332d03c4e43ad5f0ca69d92fa596c61757867ce47274077f7201f71a9187fdb997caac5a745bf4529b7c51279a25a4acad72a3cc51478bcf825d68d22d3ed4bc2b9ac4bfc48a31cef64276bdfd10e33ff8cce5528c558a1a8396ea69e44e9e6a5d4a78ef3358f442dadb3d3a2ce8491bbb8706f49ee462b4bd5233a392a484d8db73e9f6e7e6669c5292a9c40535a011b592821782d4c4f67c32b7f746b8bf062af89d189022e1f6a2029ff4020075\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a9bf3b6b5783b5bb1528abe4ffb8f169250f3a45ac3fcf85a8b33da4afe75cfffb898061b9e990a9b5449c5e7217db506cdc93f8f373bfce07d03a77edf1b275195038de5261112827291f7af9c58b034003ed818b7e5ec0d4ccdf81f6c2ea4d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7f7be6c8663be7951320cb6c651781e5583ed65e",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff8000000001375d4d460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f101000000e076448004e67f8600000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acb4030000\", \"prevouts\": [\"620f7a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4e3c0f00000000001600141cc39a492a6f67587324888ae674f2f534a7639e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100f7769039e9849a23425809e640b988b91d6c25b3533ff27b05e3e9f49373604b02207c1fc11838f5183c4272c5096f5a56d8ade47bc2707254ceaeeb9549f8078c37fe\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"30440220775c2323a9c98f6c597702add339149e4d0bb96db939394bcc4eaa264fea3bd902201e15716d0db5f9a1e482d38b68fd3465c4043993b66067d07a6c994d33750ca6fe\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7f8f81d1bf5547aca3adaba322cccf59977c80b0",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfab01000000353da8e0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa900000000724751d30155c54600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1ed6a542\", \"prevouts\": [\"8b607600000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\", \"23c780000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4ece7439a6da18213b739641e86399840a31603efd6bc35e889cb5cc2f58e891a69cfd1883d9d94906422bb83623918edcd109683f826bcbf676882b31fdcf44192fb5cf2427ede6d61c8a74b8487764d962b41d4db4b67b9e943a724e86dc0ff\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366888396ae9b1a8f191aefcd5a7a56acfa3ac01b0d4c8aa849bbbe9a5944eb071c75ad5b0c19c64f5d3a7fdf07b71b1a8f8b99e999958fe2a8fbfcbf733553f9475ca33d7e1e5f2997f74dd285eec8a0e5cba5080c4482d5b595e9662ee4b93be0a1b6150087d660153f154c744da46b7319b80aea4f8e08f23015968f3b1d87a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7f9d1a52ba029c7f6e88ff84575df1fcb1075619",
    "content": "{\"tx\": \"e61fc582038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45601000000c4e2b5b8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2001000000c5b7f7db8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41a020000002528aeb801fdae1700000000001600149d38710eb90e420b159c7a9263994c88e6810bc7c4010000\", \"prevouts\": [\"f0893300000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\", \"8b96760000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\", \"5e9f320000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"417d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e832d46fff335db0bc559e9bb1dfa0a13335da6dee7eeb053c06bd06875f6e68356831d286b681d36077bb0670e25d1d3b2bbe36e9d696c3276746d4ede397eb7d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361e2c9952688e2a9f00f4b0b73b9f464050183c79369b385e87738acd2c915b017155e8c33f0c07f7d0de889297fa065f1be8d31098e32dc97a677fdacd11d05345bbf2815375aaeee056e6b05e441f58ef8c911146e9d15e94b57fcda7a8d0b76831d286b681d36077bb0670e25d1d3b2bbe36e9d696c3276746d4ede397eb7d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7fc1bf414713fa9f80c252358021f9f97b15c792",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127072000000003a6d923adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2301000000ec825d2b0388966900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7a76d4227\", \"prevouts\": [\"e98711000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"583e5a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"98\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936862595c5db495f9659b55a4931c0d6b5790089471348683bf5da646fafe3acb03f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082241df2003654f0fe7fc4600eb797dff990a6f251f130f49fda58fcd5b0cbb08c94c58b1e468d5c742a8cec262986ad36b584a802070024df25b549bdc05f9a8a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936135308afc3f1b0427026314dc25c4582126331f233b7d3a6426128e486397ca6241df2003654f0fe7fc4600eb797dff990a6f251f130f49fda58fcd5b0cbb08c94c58b1e468d5c742a8cec262986ad36b584a802070024df25b549bdc05f9a8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/7fdcc6c41ae23f27834e5e1303ac7e3a7a01c43f",
    "content": "{\"tx\": \"ec16b2e503bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf71010000001e2984c9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cff01000000d37921d6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9d010000006e9e6c8f0155bb16000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8796000000\", \"prevouts\": [\"55bd6700000000002251201b1a5025b4fe9992b0e02773e7f35e6be2fc0ec95e56c0e62f01a84c1b9caac2\", \"4966600000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"2317250000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_c9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"856df688e7ec8ac2de3b3eaa7ee2c7e7a01666ae97f299f0b097fe46b64ab0dadf920716a3c53bea12cead7678a3a4e2191045ebdbcc09071df6e16f1f3d1a8182\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0b679c2460e33142fd5e633ea0bc7372ce1690c74bb2710fd3dad6ca5f9488fc04fdd91246154aaf9b55e028b491fb2178fb927661012a992cd546f294c553a9c9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/801315c10fe0fcc26c0c57bc8f631cd93596168d",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4db01000000aa09a19cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0f0100000069f2c7ce60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270920100000099f9349f028e428a000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487596bf447\", \"prevouts\": [\"72db310000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\", \"266e490000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\", \"02ff10000000000017a9146704ae21c886c9ded757e2b67d582abfc91902d487\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"165e142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"3d54f7211a3131376c7caa6a4b4da03c4647e46af1be525c2948322529d5cdc37df71a7e64a98902d2b01b0324693b015a50e45a7c9a70a90ff7509a0e55e760\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/80333b40950b8f22b44ba7c383dc625b1b094df3",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8900000000168e1e960489df45000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcfb000000\", \"prevouts\": [\"65ef470000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d06c877dd86d961faf24eb5b06d1067a63efc55cb5bd19f84e66e81c1d8ce78d7393228d3eb0988ec9fcd75a06765f40457a0e9e3bb59ba4b5eb203b8f76edc57f6cdae672933b8d5270426b7bcec0c61df57a4cef656f5283364a160b6c04deb40b6eb065ccc984fff697bc0344c73ec5e9c5fa63ee26dc05c836112749986b744d4a3b93694a2036550277dc68556ac354f120b33f0bd1571b2aeebeab2200e4da1320df8c8e059de66dcf03e0874eaf7750b0860f98f35b7c10b70415f810946403a50eac215b8a7d39af3ba37d1c853a5ceb47d5ebf203fbced8e91a41125d9eb7089d1d443182afb63ff3eeb03e8f4b2b2046e574c27bb996a70d0246c3a1ab981e979740802b973b3d4aa7e58d071ff91f2d41d97d37f18bb45210a75ce52d2325dd6ded929c17b877085d54fc30f3575a84ae5b2dc38e8050d9f2c611672b1aff3354b1fbc527e3197cc46e4d2bb3c6818ef1b6ae3ecbf5b3f3b4c8e9dbe48b18cef645103ccdcfcf86abffc5e8a4480c163e735d8457cb48df90a060fcbe1ed9e1c00ff3886ec60efd8106d97b05deb93b548311458dae2584bba85471378bb768fa26627ed9b17fdcb450bba081f30ede1a16f65cbf777ac7baa3d3dd2dec517eec9810d6157d19c2fed82f1c1b7c4e977217343fd8a4f69f9d48575b3530ff1f79d081abc60fa41e1c24210a813c24c8304bfdd11c556d86905547bc78d7614227413d6275\", \"f87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e85d94fcac167164a1e762fdc7573aeb7aa116b8ba9fcc5f9bd36bcc426cdd2c869a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e5422b6de6500db2bf907e4c5314ebb405475f57406f25afe5ac62a92a9e6c58b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09020154afaf81a15a88692650b1880577fbae1973e489fe66b93c9d4772ab4a226d42760a78db03608edbc96b23ac65bd7df559dc0fbcc976fe9f1e20c98f810604e279ec97ce3904bf07a966de51e245d43cf42810de716a4d61beeaaa151e03b13180abf8071029304830b9a5af10d6874cf21d45bff46220e7d60d8dc063bed28d7c8743aa5064e3385e49a13cf5b2de933f80eb3eed607426e79db5e0c57635e8de240f91a6ee2b89346f7a09e3bc71773d07382e0eb21bc27780aac226484693a819eb8e203c698ecd787d2cca6faf00fd37640962faed8de5868a063f3916a11c4b4ef313ce66557c2dcd33b2e97ac557f6d3438168a408590c1266eb8219b6d72b9ab780ec15730412666aa58eae131d7a1597774bd07fbf7cd225af26d7989948e3e9a809d8d442afb3de88849be8a71b4055a44e37a3c6029dc77c75e8da3d5a70830520ebc8d370121915ad7ba6ff0124a977ae28109be082a2c8eb80a5f1c56be56e6ca5f5c271393bad7184cc4f378a152e0a70b40c55f0a92f25cb5516dbe20f856958bc09f4b3239808ea2cf6e95e5893b805aa9ca16181fe46f848779f4a8758a14ebb155c45759b248ac73a3589bed623400f70b17bc63a230a0564f596e21deb6fc4a5bea4d9221a472d45052339fd1152e835a5e930f4ee61045b35d8d18cd3e6f0a4638c950b10b9fbfdf910959ac1e96c00c147b3143ecb4dae38b59b8d3956ea75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0826a44cf4e9a2100eeda9c03b98c53803fc7517d02bc9d83cbf3bcae8bb7675812a0f16f4cfe8b052d74bbe565102becb5d9831a57baf41b6ebc95ac4a46ff7ed8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/80376b2b822b9baaef72428ca022d2e8ad5fab95",
    "content": "{\"tx\": \"8ab8cf8c02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be401000000e633f1b18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b800000000e45ce987016a015900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac56b72021\", \"prevouts\": [\"64751e000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\", \"23a9400000000000225120c1102a8f1f1acb509ea40275c13487a0c613f8d79621443165b53e6eaf1338d7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936462aa15e09838b54adb150b3e07c4d162c70ef3c9412f75fa68c6ecefae7c30c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a63616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/803cd5f12d095d218780ad627b0b82b0bab86370",
    "content": "{\"tx\": \"d14930c602dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbb000000002238ed8360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703d010000005e661cef048a862e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca4ce8961\", \"prevouts\": [\"33ee20000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"cfd60f0000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5118137b75632fc8469b6d274d74e13d397486217d72038875bba282e5d91314c39823c6bcc0c06b1ccedd8f3302fb965778bf11fdbd4830d29cbc62f32a77240ccdb938e1cb9dba9647cc0512f82c526c8f6107930613b31200f04f80acff8889\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045770c141d000b7389bcb028eba0df2d51be96e98815503d59ed22f20e414bb1bdd3571a06a1d33120289e06483b2785a7356eedf367170ec7792d3587508789d4da9670c383f4b71f5a22d48df0589bd68dfe195935a65f1aeaa80f10f8ca6973\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8046cd7645e89a0fda7d8f8378e8425fefabb6e8",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7000000000ec9b048ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7301000000231716990186d7ae0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e776040000\", \"prevouts\": [\"2956780000000000225120e126375bd164d085eaf078f7c968ba0351125367548e57f6cc6688a24dc88c09\", \"3cd947000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366da9ade92a00cd903f2bec778be2e2fcad1c3b4b24d4dc7374dfc8c654eb770c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a28616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/804b90af698434a3596956677aba5a5f73dbaed0",
    "content": "{\"tx\": \"02a25573038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44300000000a45df2cd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d7000000004530aec2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c62000000009004818202ae91bf0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478724ab1f33\", \"prevouts\": [\"520e3100000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\", \"942a410000000000225120327dc9effbe915b227349282cadfcd45dc438d4f1c3ec72713111ad7587a718c\", \"f2415000000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"ed7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa229db830b5291510bfd4e55fc2f3a45cfb4105ece0af57cbfe0942d597b32d0c27d2631c3cab5fe643277004a2e6838e79a7dd6765c91a13be066042b33c17d3b131de5807af4725e3fdc8c81388bc895736ddb6e799e7163e8586c833ffc627\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4a97da4cacb7d2ba59131ae423230c4733e99b93a89fd0934cd3e0ba8b31d50a45769ff8e70e4bb7b91d42acbbb62837b0e871ab760bcabf7dfb792b2e999f3b131de5807af4725e3fdc8c81388bc895736ddb6e799e7163e8586c833ffc627\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/808bb1522f5aa5de2dee150c5fe9b2240c76f14e",
    "content": "{\"tx\": \"32d633d502dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4a01000000a75705a460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704e01000000a92a96b3047a596a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac49000000\", \"prevouts\": [\"76e25a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7e79120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_29\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cfe693420f1cc693cbed5917368faf6dd8b05cb899e1a5e7faf739c1dc96cf3f09c85d5184c172fe5274d72ce3ae2632c22a18b4963f34484be0e3df7343a59a01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1bc7a81d5f370cb009c1a825051a8a06a4cdb01c16eaea4d759faaeddd0d0d1846089c86038e31eb8d62689d741c5381a3a4e484ac11503b7622c28d78290c8a29\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/809f182745ce2d04f2ed1126bbd41c71d290955e",
    "content": "{\"tx\": \"e82fd79b028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40002000000f2fd11988bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4740000000030e1c39504a9a063000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac9333884e\", \"prevouts\": [\"093f3300000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"1a28320000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09021ab944e180ca31231b50da81439e79b19f1d40a763242bcb978571d8e6bf01f0a6b4f8f4b8ae3b68cff1b3575eaa97c39ca283faec5f0ede51ed06900ef11a22af65cdc28f23829319f23532649532f496486515ea290ef6375ac45f938f02b4ca4da8fd51c2c5464b485cfdf6eedb5d4d45484487838fe9ee3532825c860e1a47a8069ea88787779140b0a29ac14c6b91600d4dfc4479c061f27887672fdea84d9949802016361d6a2523051964fd0bd11a94aae3293f2feea136dbf91290c456f4fd7484497d4bdf1b8d20d80fbe0e8d5df554c5ae0ff6e90af0eb14ae4c06504140fa117d39a97be2c5cf8627d99bd6003bf57f7f3c98cfc1f368f6247df366f0653c143c65b2dadd7125f52bf477865e4338d882d2ef44da0067f7c689b6961fd506cad0f2e6ae6193313cd39def5e1805323e1681ae3dcd73be7840289305d5a4eea7a5aad40ad12382eef9423be5ec5fb39aa9f3c76704a36b7df182cc128706dc64c925c9799762661f920a364b106bf396df366080905ca3aa74a5689ba80721df515c7740f565efbeced669805c90db9c75cdf15ed97ac6e98c7fdb106a7b1d40df5037554f1fb51c5f68d0de15f83d81177bd63c6dfa6c20345e816ca22a1a454dce2ce07087da3a56f6b18e5f1ac62e4338dab9a5a4aa6d0ceb14118bbbfe9b54c3c6a93898cc7465d767ee7d4474fd51d8ee52637c8051cb190c0ea86f70b6f90c26c875f9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0d5bb8659128f7d307893f477315172a6feef29cf3fc1fd27176c3d23e09b029752367bb7d11bbe7d9666c447942212a409021a53e3151df7f84d090727acdc4c9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c2c3423ec372fdea4a6d2781f624ccf83906af35c178114f947f239143d19d3718b2b8b52c996a41dc4544ae6c1d446b137dfbedd48eaf00ea49b0cb53466edb1f67314c1d9c0c2f1bb74fffb92f83a91796513ce221c1c5b3cea15978aca386d016df8ad648359e1f19d81977a647cfc05e3be62c488e2178935a42ed4eea6b0a24b2ed071c0fd1a17f8a80e7bffe2c5edaf3d7eca0776abb8c6d68eb72bfcc7d72d344b9666c157db190b8463f4a4cee3a008b50fb1d8724e1d0871c5c789f8da4fa81b4cf23866c33de0b69ede882ec5789bf6dc770d3870c52b35e2cf4f1416ff279a7609982a29370ce24ee32474d17b51b860a2dac03cb6b83ff8ca36bc6efef6c641792a282360bd4d989ceb3b38999e3717b0637dc854611d7031a9d4c998afca5abb2cc7ffc306802130fe2a47d06547719c3a5d5bf29ecd9c381f3f3fda66a01ac744cd0756da364ee2a349f51c2f80e353a355dbe805ade1660d05647ba754f227b8034596d554e05d347bf0b2c1f3347c8381dbed6bf000cf381952e9c608561a07c23318d9b5bd3d53c4e32b27955fe7250c29126650449261c1ce399ae508ccb8c34c4266eead892eeb22a41115663209ea6c61d4218a8c393774508ff240273f8f0841af50fa11f267ce42c183d8d9d417bb23a1513ac4271cdf1d179f67ffd4719450e78c86a8f4876e4408cef099408a4d2a29e43e4f0861f66023fe400a1bbf87561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366f6efdc35f2fdc8737195d16fefb12181ba8a3475ed2464c84ee729da1de50531ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045a58cdb730d5140e8751cef937639de4f5fbc77d98986906c68a7616d2fa212f87d6928db58d705af4b513465b8e8f739d066723840f3c873585fab69756481ab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/80b5c3a4f3efc732cfad5a798289e246619f8977",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41202000000c2df2cc2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3e0000000000c889220437d98f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a63a584d51\", \"prevouts\": [\"d5a340000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\", \"1f1a5200000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"5c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936900f19854bc90d6c79e0184be6bef7ba18c323656bf267ebd46e4fd22ae910800ebd37c9b7767cfa75ada9a6605680756deb542ec34cf1dc29d9c7b172412f3174e87bfb4d3d415907d7a3196832fc57be4f6d746253c89a46e8e4c968740366e8f45a3ac55dff4b7d62b0bc42204f13e92c55212ff162d480a58edc7717abc8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936369642414e3e6cba27e1a8d43018b0c6e901f2bd9875554ba9baf88aafe131fada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e24e037abdf69c22f44b0c591ad93651f749184eaa819a8a63a5d4092bdddfb78f243c72f4e074898aab8058b3c73fee97ec3b9723e213834a8398e97170c1356\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/80b9b953d5d211827d5046ddef05778d9e6fe889",
    "content": "{\"tx\": \"c3f06660028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47b010000007a1ec183dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6001000000e09642fe0241047a00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000\", \"prevouts\": [\"c7ac340000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\", \"04b3470000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_3b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e8ac4e116fd92452319a1cc55e5c83d33673880df2371ae4bb58250f6c2e0c0eadbf3d56f96a5c55bc8d5e4fdcbbfdb5810d8883e809c1c2c58b8d4f57703e9b83\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c975edc8daae13a6159ac81c4cba985c2834b2c25e887bbb6c48a3f68ac92345442389cf911d8b9ba1f2cf2ba8fcc9a99405e004d5250c6ff176cc4aae3d7c503b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/80ce5e7fb2b5a1cf0cf9bb4b9a786e4bf6735056",
    "content": "{\"tx\": \"d7f2d62701dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1301000000fb32e38c04ad51230000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac80010000\", \"prevouts\": [\"1116260000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063cb68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e3dccf8482e84b4ddec6df4dd40915d9305dca15dfe62535982a83db5fc62d181ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900450e2995ea6b9af074c8994aee2f7f851552d9aec0cda14b2daf9a27b43dc2eeb28859d05a814eb862cab9a6acf3b7acf0881c47896b22b56466b77992f62c0511\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a8aea858d1ec7924adb827dda39bc25501e41dc8d888bd1e3815f5a6593acc760e2995ea6b9af074c8994aee2f7f851552d9aec0cda14b2daf9a27b43dc2eeb28859d05a814eb862cab9a6acf3b7acf0881c47896b22b56466b77992f62c0511\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/80d98df3c15079be160fd7897dc74ef9a9b4774b",
    "content": "{\"tx\": \"f566a34e02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbb0100000061ba5eab60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702c00000000845ff5f404e063680000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478735000000\", \"prevouts\": [\"da89580000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5ee4120000000000225120770a4859be8fbe7a841bd8e66a93f9515817dcc93bcbf3e365174d34bc6304a6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936460d293845900fca9c67e1db672bcfeaadc226f783a04384d1d04876572e8fae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a2a616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/80dfc8a9fc0fe40ea7577dfd42a34b367905756e",
    "content": "{\"tx\": \"53f634e403bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8d00000000fb2721ebdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c86000000001da8c8acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5c000000003f491bb602892f0601000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7ad000000\", \"prevouts\": [\"2902640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e4a94f0000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\", \"e76455000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"f07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08235987c1d75c441670cebdf615816c6f42e3d99515a7a7b9841c20e75c916465ebec2e27f579b173781717090b44a070e7a8880532a05b17dc998986213b0a92d21741bf2762a3041d275698fd56a81520b6404e88c31ed080bdecc36c09cb10e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936942bb4c31de59fc8dbdb77a6c08d9745d0ae402a84080ebd7ee34cdc7a4c1a1529259a32967333cc74bf44ff096d479961194fa0f97de632ce420fba7b687b9321741bf2762a3041d275698fd56a81520b6404e88c31ed080bdecc36c09cb10e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/80ed8061d1dc94f53f2e897f7421f7e7109037ef",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4f00000000aace61d9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4101000000718e46cd01acf570000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487e4000000\", \"prevouts\": [\"a9c1470000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\", \"1a5c710000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_a6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"821c257e5ed2521423b7500974532e621a22013791af83a38dcd2d4520ad76a52dce176b7f4bdace7ae038c1255872c30fdb4c4265ab8386111b394f0f1050bf82\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"682aa0cab91cb477ca201a52de1faf92bdc48805833577035c57f575a4bf7daf103a3797b52ca761dcad8c8da41ebbd2d5baef8e75d8aa22c9ae427389ed8f7fa6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8114bd4cff1787b06e5836915e62486478f693d1",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6101000000fa271d9660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270790100000078cbba8d03582c3100000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac1c000000\", \"prevouts\": [\"2453230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b6c010000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a4f83673b9228ad584e3c758d3a7ef913b0130d95503994689e6b12c1cc0f2a2ca477f7eac6c013e182e33a949b526b028f901138401b50189d2a4f50cede7d4a6f8b9af6548d116d93931f99bf1698fdad997ce51263e0555061e012c5780fd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364a27ab33ad30c866663b6aaa2ec98e71770b4a6226bfe80c47bff7f69f5996db8ef0ecf285bc5470eddb41e1019d9d697e32571bfa8271cd432e6dc81a28355aef31942b1858214ae33105eca3f0b2cf78e8df05a3972acf71e40f309e975162b655a633384d647dfd447ac375ea9b2c02c16d8a17436cec940ed1871036c5ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8114ee0d2c07fd933798fcf7febf9e08b6cf1043",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4660000000079caaceddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9400000000319a8008014ac71c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a631000000\", \"prevouts\": [\"e90e370000000000225e202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"72f2250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_94\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"637df903528a2669960c10cf7795becf41f1f860494a168863b39218676c0c82e53e14409cfb5fe51bdc1860873c6431ccfb6b826d4c0f0b723a6669c08cabad81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8b0280e6eca447946658aea61f185059689f16e6f65d76e3246fd3472322b4da51e9fbda0def6847213d6d92128dff0d1281c65e72da2efcb54d3837ad492ebb94\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/813b01314937089f22d1d64ac7030c5da92ac36d",
    "content": "{\"tx\": \"392083b603dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf8010000000320c5cf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704701000000934072f4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8200000000df73f6d504ec96cd0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac1b08b24d\", \"prevouts\": [\"47805900000000002251204e3fb1c88f2893b13c1c33c3a0d0cd819c49ecb88ca3deab379ce318a8955811\", \"1ca9100000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\", \"e5a5650000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_32\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e047390b6f2b815028e622b67a7c936b80e970c52de504236c67cbf13d8c9482ee5fe7f40e51fcff18c2e560c4af726b808d134b30257dabcfc414253719d5d482\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"72005ca1df610bee84eee7a8d8422d4d602e1ada34b64f16c0c11fe2d328f4612ad623f7286c59b5018e507e97b0c9efe07f71afec9ba04ad22cf5776ab96dbd32\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/814755d13f451119bbd6e341778fcca05d023f99",
    "content": "{\"tx\": \"5c4be34a02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe001000000849623b560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127009010000005cf056c8010da88300000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acf148915d\", \"prevouts\": [\"3a4e83000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\", \"87df120000000000225120656f89671a8f47d6bf2e8e427ddcf5c0f85be8fade6cfb3bd1e5b2fd091df805\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"5a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8b94a0debb1820c84163419892bb0f6faeb0ccc065c72968f976a9287eda7854dee9c212f1ab0dfa1a42522b9ca3467b009d36f3b841f39cdc4da4a0520ce4fa4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936552f570dbd2f2d23e23457387a9f0809f04049394e9226f0f3f744fca44fa69fb94a0debb1820c84163419892bb0f6faeb0ccc065c72968f976a9287eda7854dee9c212f1ab0dfa1a42522b9ca3467b009d36f3b841f39cdc4da4a0520ce4fa4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8152fa388ef907459fca58c6382e7cf481e8b03f",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa0000000003a5d8e9060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703b01000000b886ef2002b9017a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87de3e9141\", \"prevouts\": [\"613d6c0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"1208100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"dd4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb48439541955ba1ee927ac695664eb0a176a74cc392dce51705e9d682cc4042391e6ff37e966b1384c4d5bfa916e4482452180179a80b37f756d07f3e2976ea2d444f11caf36eb2bc7b2ba56ad05f43983925bc55248f9b66a13a767efbac40c00\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52dd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368ba6fa17392019bae4881bc31f2cd312244d559032edd01d38bf5ef60bdbbc9cb6537362191d9a5e0aa3a730b93b6f98a99ef63ed893bef4b9dfa7e3451eaf360e1f075c573bc42ff1b5fdcad1a87ebee849fc17bcfc5c414a2a4f901b5a19cd44f11caf36eb2bc7b2ba56ad05f43983925bc55248f9b66a13a767efbac40c00\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/816316a3b73af9b70141fff8b2deda8269d38d34",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd400000000b4b636e48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4350000000068748b9903215e57000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87390ebb5b\", \"prevouts\": [\"0e7b25000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\", \"a72b3400000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"8f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369bb3df96467ce9fc7fc29c8ddd81586e6582039bc398dcb0af9e4be844b7de22da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457f8fae370a255a677f2f729010dbb329fa966ed9a0dd82e5083dd7ea90426dc47\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082458187dbd74455692a21727c8254a8cae6fcc3fc3c7e883861248db6e64d9919f8fae370a255a677f2f729010dbb329fa966ed9a0dd82e5083dd7ea90426dc47\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/81639ecf4a65a0d2972d186cbca46aa48c408a2b",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c0000000003bd730a360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b701000000ad8a8be30263f44c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487deff4536\", \"prevouts\": [\"9cd63d00000000002251200fcaedfb972c31a562a88e2127675cb61d773b6b9ce4a4a9159012ab236e47b8\", \"09b9110000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93612b529b7bb29b24c3871885345303f71ca892c4f89489e73513829c3eaf83d96\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a38616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/817d2dc89f753f1b403cbbdd6c078eeee50563d1",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c40000000009d51e232dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c42000000001c11fa30025f6fa30000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48730f47c39\", \"prevouts\": [\"9532570000000000225f202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"3d794e0000000000215a1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ed9fd964f63d35214f9e8c00b0068cf2068da31bf44e5bc4957beee74745f0d1e21743e8cb3228f9486688a0ec355024ba54f99da996f1ec409e6279b24d6c89\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/81873f88c2fbdb0a58e15e3492b63cb1eeebd61d",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270de000000007f4af652dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca600000000e56eff118bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48000000000454a026504e231a400000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e79f410645\", \"prevouts\": [\"a4bd1100000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"f33b5400000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\", \"67d540000000000021531f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"d7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93656b2e44901702d460c7de97890111dc615bb44671c92f59d31a1c2531c59c007affae472ebffc4152ddce3f20794b01737e96becc2bb4a1a296a47c8ec0d29af569af0f9e86656db21fe5e74d4bdcdfc2cda5437bccaf9e3d568ba1282fc608d76e3192190387ccfa53649887be3b08a6a0e7169a64b02c3bbfb054cf523373b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1f12e5bdadb74bb113beeaaa5995d4ebaa92337455ee51746db1fb6fe7db125e52d50ee9aa3de1fe988255b0d8b9f34dc2cecc4a96432b9f704e90359a06b468476e3192190387ccfa53649887be3b08a6a0e7169a64b02c3bbfb054cf523373b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/818a1e4250991ce3f414e0f7215308cf2f23f7fd",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a801000000aa951bf3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bac010000001c53bd7ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe9010000001c47564f026e879f0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca040a226\", \"prevouts\": [\"0c261000000000002258202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"8c5a260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7f456b00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"b17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93631b8b349c71009dd0699fa095c14930b92d0ccc3f805605dccb4e079a114365fc037589144f6259b59768147ff9100354b3b8b337e77dac87d022b72101a452a989f510e73a03c44610e5cde856f75a0d7582565d561698089d126c5e7f66809\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366359014879f365de32ce308b078826923e3810adf17a39985dd2e1f4b53925a86d4441481b861885f5ed94900bbd5862c55ac99196b75719f05c0af3923d20525bc912f5bf4aa2c9ddbc9747d59c78f40d0a0aa0a8a4f22dc70e3f9cdb9b6ae3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/82050e725b7ee8e6090dcb98775499dc19017c4d",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccc00000000943576cf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41600000000780387a8028e4e9c000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac10010000\", \"prevouts\": [\"a4b05e00000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\", \"293a3f0000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6acf\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dacf42e82bb70907a1945a35a6e6e5987b28c8057479ae5c8d9a8053dc0ce2143f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828121d7901a27ea565e1cb6f91818c43a3dc8f46dc56db80c8bd3776430739107a653bf1dd2d82b0dcbd644d98f066b9fc3e48690fe18b2084515352f558033ba\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e14d5a9b7fc917253ce709706ec0b90ac12c0f363dbc177a85b066bc4407805851ecf70b79dd1be85a38988f8929e7263abb01bba95965800009381ed351eddb0fa653bf1dd2d82b0dcbd644d98f066b9fc3e48690fe18b2084515352f558033ba\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/826b8362320fe6f06ab5a2f4b4fbf5c94448170f",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42b00000000ec4681d5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb3000000009a1ab7c503f24e9400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac34030000\", \"prevouts\": [\"33df3e000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\", \"787358000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"304502210086fd6f82cf9f17bcade605d0205e270a8df0beb7b5dc1c0ac7d9aea62967244902203d82f6f92e619a97b40933947edf1fa3acf9e8b4c1cb0502fadfe3a0f277eb2401\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3045022100a64cff4a632e760eab859075e6c7fb4875c413ab70ed25272ee4dba0ded87e5702204c828040502d9d3036480487652af08a9d9aa8629142899dcfec6b40631cf18c01\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8283d17b50ed5619f147c5b35a8f94626b7d5b26",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be60000000081cd06d2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba600000000e8ea84da04f3fb48000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c8e69e59\", \"prevouts\": [\"4c1b2700000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"bb67240000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"304402201c6742ac2a1f0ac4c6da40bc3b37590ae74b22cc39bbbbad3cfbdbbcb477a9440220430741708bd41f2043ed464a5bef8a03c954a35030b5c85bae7f7ad86c841c7a82\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3044022044f71b4c8b957ae93b353ba9cbe0821820ac7302acfb0994a8d29d76222a12b70220382530d71424d8bae92a654ad3fb69cb0cb5740a7d25f8bef56af2807301082682\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/829c3ad6c8ab04d87634c91b6fcd79faa92656fb",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707d00000000065ad5c8021cce0b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914719f78084af863e000acd618ba76df97972236898775967c61\", \"prevouts\": [\"185b0e000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ac1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93674456283e1c6db6717d3e15ed53ad7b64612fc008d624aa1e2dd3f9c613e2b4568c195719e600029237bb2bee296a81ae54a1bf44210bb387eff41995ca6f68fbfb640520cc13bd7f4751eea589bfdaf463667e9e3eebb3331ccb48f0e9ad4c4d3f52a2844c5f7874c7d430ecd2ddfcfe713e30c56da5784f950db6acb8f092a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f6c5cdfdaa55ce393d431a80dfc39c32ae0ebbe82478f6b10a6f2143ea646fac82d044aa67ca69515bddcd39ff85ae31d999a9a5b32af0a0137c9fa4b226ee88d3f52a2844c5f7874c7d430ecd2ddfcfe713e30c56da5784f950db6acb8f092a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/82a84993b98a8fb62799914dc21be4be700e7b5d",
    "content": "{\"tx\": \"273ed95401dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5e00000000ab2de7d602a8b822000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac61b0b131\", \"prevouts\": [\"156624000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bc\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900459312a224ee6564b861c658371f7a6f0026ad2c58d86ce869dc9b432e830a527104966f092bf1e4b4348fca11e7254311373308f7fc15e3d44d6a2afffa343c9657ff193055e5853205a1117b7666344cdb66562f15b4d40280f3656784bf5cd3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b04dbe1d7a597ef7e58582d6b28f055a2f440add2d85f9dd7bf5919989399b7220e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e14a8563068286881d42b1c4901d93a483973910fd5653bf7ebbf040741f7cd837150e68e664a4d5c991e5183d0e7966d99b6c66da3079bb04bea44808922b61bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/82e6db8a76fd387b0eb64cb1d7bf968ef761fb96",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6c0000000082abd590dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf4000000001ad7dbb460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e60000000013b495130186bf0800000000001600149d38710eb90e420b159c7a9263994c88e6810bc720b41b44\", \"prevouts\": [\"0cc849000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\", \"fc1a5d000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\", \"703713000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ab1d378806798b040ca166344440300741f6fb82aa8969ca5a4c2b8cac21f271c2a3c32f2d98482ccc0ae7bd6919d8eb72134d3589ab943a0402c8a931ea420419704ddfd13dc63b1b4156372563d65f148a89e112fdd9cbf47f8afee5da0a9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936282619f1a8afd21996d5c3a5869507072982adc0eccbed94d05afc8e7e03bbd81915e430f0db2345814ef782ce895d8c23952d8feef260d8eb90daec0803de3eef05bece11fc4259c24dede9b1787a65bcee91937b36a28d108e88384141e6c4419704ddfd13dc63b1b4156372563d65f148a89e112fdd9cbf47f8afee5da0a9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/82ec131b824b4c3f3757e1edd238735d0656fc37",
    "content": "{\"tx\": \"19d3c01403bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb400000000d4d080ff60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700b01000000657831fe8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49400000000aa2e2a9604f321bf00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f871a000000\", \"prevouts\": [\"0c0877000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"894f0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"be6b3c0000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_3\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f62e9109b0b954a14f4b2cbdd8ecf546bc9a0b1ac8497421ec4e80363047dc50beb837570521fa587ffef32067b49b072a0dfe4154ada7cbede415a8faa6fd3d03\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"503a1438c7ff5056987cc50215e85ff51437a7837657b729ad9904ac517f3ac825a81587aa5c780487ca9f74ea6afceb7a5561614c8a23c0cc32d3e5dce4affcf8d4f7e5fc1339f0249e98d9ee1b1404342cdad96f67cdac3bd316ca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c6646540e8781cb72f220fb986f517249606cf46da2c22de89ce1bc6e9ec45343a1bc1d045931b5dab65ae615e882cef2a91cb107f4b2f94adb9fdc05d1395b103\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50b3ea659427b833b5edce881509000018807cc6d254cbc585da2de4f58e764da3b80d1687e73184a280689d8b65f9ef480f7338a84b9f1a694f309141ba2586f23705283a15a106ef6f99dda776763ae9f389417748182774fa5bd7224370fd1a9d16b994ea677f6763beddd17ef27f3889f3acb0b53016ba7f6dda39659b087b03ce98b46a122f39b5c7055215d3b2730e16a479d65f41392485bb69ed6549b90c76bdca86e78dddf6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8336cc9fb782ee91ec2fca64631271cf0078de20",
    "content": "{\"tx\": \"1aeda83f03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9900000000a9e71ddadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1601000000c1e722ec8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bb01000000a0e9adf902bb0efd000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acdf000000\", \"prevouts\": [\"6cae7f0000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"02fc470000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"ca9e3700000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cf27e6a544d4d056b81298ae945bd953114a4d53eb4cd249af296d27d349369f6ff84cb0de1f41d907799f0bb3a3d4c37b57eea0ba754203aaf5b7b2671fe888a4b6f827e9c7b2c56d61f57ac31f0aa4c5b637b7f763b3a1a4d37c3a7fd6ec38\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac1cd6ddb9f33f1548d1cedeef681a9f9b56b8dfeb29539fb9e8c97369362df74052bd780e62e78eddfa6319e1e9b5f2922c9c635f126e8f8471707cb2f26f8c7017bb5ae96064d7d19e957b5258c9c864deb4239d29676eb164d7ecbdb9fd5a354ad806189ae64381d3b11a94f516f6d81b0c787d08b0f0aee4f0e917017ea5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/833a14196d27bc959251f1d19b9e4e6829d267d5",
    "content": "{\"tx\": \"bec0953402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9e0000000094ed6d9960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270eb010000004ac8e1f601e4ee1d000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8789e0e922\", \"prevouts\": [\"686f600000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\", \"10e70e0000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936832cdd808d94d07e5d991a3d0c5a8b4a06c9fcd7df1eeedb760eeb7a3be6ddfe43d925f8e6664e67417d113cf51c5b4c3126025efa5f83bf5b16dba6746279b738273d2ad306f831e931ee90238e60477c8ec11f350a3ad34ea06c6c58bf7ea3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d466d9f82b2327fc04ce4429e47540ca0f52fd08e57643f6e07da44ee4246ab9eee8539df42e1fa2e5e9e7b75fbe1b52db879ec8a622b496736c99966ce19d0038273d2ad306f831e931ee90238e60477c8ec11f350a3ad34ea06c6c58bf7ea3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8366f34c8cc56c4971befa8d4905f0f436bf6cda",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa700000000ceefd48b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45f01000000e73d30ab02afa5b7000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7719a5825\", \"prevouts\": [\"0af9810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a25e3700000000002251205d2a5ec9abc88b8aa90a173ff406be7abff8b14799a4f6ae3ad10e99906551f7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_a3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c041fec03511016f270e27d281cada38eae10b7dd1790a912e5dec61e295cb8f45e2b1515dcc23af7de4c27b6e0d1d75ffed8cf005bb3c1734d44393b153858402\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ef33353ad367cdeefca9bfa0f7092aa788f8a6d8ff4b66f7814676037f15b20f9695bbf857d1d1c08f7d1eae4819be8079184ffc46332b9b2a41ee0bdb34abda3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8393e8cc899fa71d1c638c5cb8eea55c40342700",
    "content": "{\"tx\": \"aacaa01b02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1d02000000f3d0e9f9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c44000000008657808f03639ccc000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487941a2455\", \"prevouts\": [\"d91d7900000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\", \"197d560000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361f4b186db3068532a32fed88b54244ea5875c098571a7b8b359e587f4f4af633460b19c0accce5a24a056b98cce949d671afb14dd91d0cbdd469fc3f22c90b1553249301ac20ee33639c015b4a618b106ac87c8ade2ff7aca8998bda2366a260c3d30bc3225049ba56ac02c164836762858abedae6e6cb81f8117394fa9e456e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368d0665fc26da953a71983666256fc3789345858164e4e7f74d6a240db5c0da6cab352ee2a6a8e236a875eeadb35b814571c290bf5fc32e6cf848a4bdb48a3dff6032c3262f8d7c29daaf8f9846bf0ed9dbcc4a0f9aeeb7c8ab8b4ceb985f45a6c3d30bc3225049ba56ac02c164836762858abedae6e6cb81f8117394fa9e456e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/83945bfa970aa433de420b7ac4f4efcc297ec972",
    "content": "{\"tx\": \"bbb137fa0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a7000000004902a3b1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbd01000000f5d511fb02eb6d33000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac27000000\", \"prevouts\": [\"1b9c11000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\", \"1c9d230000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93661e47f5626b1dee7ec991e30519a96bad8de97cc54e04912e68057c15d6ba2285a2fb75442cf9d6444c8679a19413f9a060e476aaf84ff603b3b22173ec950d19a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e8d213d90ee48874bbf2b18160b4fefa78452fd9fac91ad5f640de90a3ceda28c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ecaceb5ed46230d7b49b5ab2b34a8a36729addbd68724e584e32fb6f2cc866bc08d213d90ee48874bbf2b18160b4fefa78452fd9fac91ad5f640de90a3ceda28c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/83970d72a6907256d4feab8e061182642c3d4b24",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ae0100000008a2ec32dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9c00000000ab39da2d03d6d489000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc742d7ef21\", \"prevouts\": [\"0d91320000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6cac590000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_4b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"51c615f74c4bfb2a16f20334483ab145ee4219cad3738cc52c15ff3728d75f599768728bbcffd7ed615ac96674e46d7697c2a6da75a027df0c8143ee112870fd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"75e7c24a8ee892730f0f9c5f8f70babd35c480db5048f5818ad4db9f7bfdc255a98ef0f17c30ab9fda1bfd9c402304913022677fa539649b0e37cfedc2fbe4604b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/83b00e365af084f70ba64981a783c5ec81c0e650",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f3010000005c7b308b013a071b00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac34030000\", \"prevouts\": [\"1fea3a0000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090256cffc752b1fdaa9103090c4c563227213be9648420b90299cb28c029182ea234713a9511fa6aa7f04776db56ae40e997cfd93d0b64614f5cb7eeb387a2a6843a073858936975d88f4e9824386c72d5d53a4ffdf59aa0c69c95ed081535f0dd7b61423cbbf043d0fa0884dba70416dd460f36da7a9510ec647a355a76c7c4b8c4fe3bf24a5ad7b7adecdc4207910251354bb2a1dc599176cb27543426ae01c41fc446658fcc908a31cdfc6351ec94e1d1d2b1dd938384c6692ab857380fc8575484c72b7af7cf97d68f68a066f8311e39b70a1f39f4b2c27df9ed77e24e3cd5c9fd6b99186f2a4dd1dfab7e293dda7e43fc979c5f06fab25271accdda3bc6eac852c44f02285ee0f632607404b8d042bcd1ab3069f528b63f6b59ec1354615795f965ba3d11e32e74cc8f291fb17d9bb4f90ce312b67dfb9706a117863c664e0de4cdd6f557c3def01e257b589acc5f5c70665abd50028fcc83b50894f57e279e39b4502023b402367806ef07bd1df63cc28991a8ed27646da3a912b224590aa80bd05113cadb0238eff5e29e876e53a08f0f051fc97e8086b8d43a11e3d1c917b10343f5100b293aa24874a3468c99c3a6447074d55d8dd0112f1e88b87c5caae6cd27e8f40e234750956f0d527fc81d00b6e450723ea14c532738a1d10ac8181fc1098cf4104ad97e3b8a6f7d2dd1bbd449d4e49e1d897092ee3ed53b05f446ef6349fa00dfb37b775de\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cdbe36c8d36f09fc182996d5125522ce46e288b7df8e779685b1cb3e493768f59c9e480d0f492be6e2f1ef49af1ad63a3a1c7bbd1c59ad16db6c35add41291c9811034f174cb7bd77652d345f06878a8d4eb3ae1b92590cd10e2563bf228d2d6bf82ba79f2fbafe67448595b33026800f76a879cdfc27419c1eb96837433fbad\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e119470798dec3b186efc64abfbfc69df83ffd4de7ff38e90851e04a31a86c32dec05d0d32ecc4ae8d89d335dd8ddff1e69c0d8725520a39005e646340307e8fa2ce21d59ac1296a589002a00340a34b06008e322c294d663639adb40cf728f594469af8623bdc42071077eadf05c3b187bbc23c145b4fdaa37dc8d3a135a8c330109eee5888856ddae86b7979c8f53dfea489c09ed94d810409f39edce217398cb965eaeb8d6142d947f6e1d05bf2c4909b5bbf372f0d14ac44aaffb6f23bf153553298952cc2953b453fb575590274f017969bef4786deb21f760973c458dd2ec859a0dc6bee24a75c07a3a5e5d11a928c2754f1752db28aa34643686d24510b20296d8cdf965130a8c5e47c848cc043df8b181745e750afa49473bdf49dac963c8628b74ec02152a5b155bb108813c3e733969bb9f014d864b204eed6259d97f70e393bfa58c0ff3dd77901d5a4869053b0822620310d2b34671f58bc9439d84254644300966320ed74992d83086d98ac0f34062d664c2065a49b3b0f130fa8f936abd16709e13341ffa0179a276001885b7614bfc5a392f7bba574945f9cd6f40663ba65d6e7980145d5dd25abae21f724815565699d5df6be0ded72b459ef2cd853fe0e1f1e64be7bad4343ecf404e24b163faeb24755f4c8d29093b769c2b9bec3f8133e7f5a5bfd7b69932d0060858ce7e2172cad96d0ca4fc5d5f25368b9eaecd8544f857a7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365ab412a59dee6e3fdf14a7910ee01c80a0ab04929895b54093d5d7f83333528720e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1aac1f02719ff09c82d93c60ae8b21e31f1ec3fca4030b09dbe2604c5a66091c209208a3d5cb0b20fec302022af702ea090b934668d0752a16a75cba2aae8c677\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8434ef7375003e0e049d9248cca04a7d89a51736",
    "content": "{\"tx\": \"56b4ad660260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708400000000a354aaeb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c6010000007d9bcf8c03f5b61c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e746000000\", \"prevouts\": [\"81920e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"74e50f000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_65\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c67a892674b55913536a1b86e02331a59492878def3d40d83fce5ae88ef80e4f93a32d8e933002060e26448685db9c2ee46d4bbbb8366733c24e8b16ab831f39\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3f1ae307735c7bd08745d9ba68a62c09e9ed48f39450a1cfbfb5eb7198e9c97a625a50692c1977c346a20d99f4b6490b8b4f304cc559c17d8e2c7528b585404b65\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8442ffd276255dd9c5995c977f30f700234f866f",
    "content": "{\"tx\": \"359812e802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7201000000f61b3eff8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47f00000000acc258aa01c7a31a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88accb010000\", \"prevouts\": [\"d21d2400000000002251204aa7ef3c48fcabcb6102b9295fbd3d8d5e51a18011383dd7b1650a23dcb19459\", \"fe98330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_6b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8829f4ad8d433e9a75bea23a67abc1f638720439cada1378d01191f39dc386c762a8fe2ad52ccb4cf539506fd07fa13585108f9cdf3f5bbdb913b4fe34cebc9702\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c8016b6737c31aed802bb2d0c0c4692101d96dc8874a8037bae43314f33e0a9957ccfbe9b59bdb35a6fa58d9bc83327587deab6d9366a21d62fd17ce7aee6e716a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8462f1863bdba9f38df24dbeb39d9be31a8b3d93",
    "content": "{\"tx\": \"a16810340360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270320100000001d67dfb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701a00000000ce8a8e9e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40601000000d70e389401384e260000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79622030000\", \"prevouts\": [\"40320f00000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\", \"2701120000000000225d202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"41d2360000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"d27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f894c78f54379a902572b9ff840f9e21b54e663bd24ed566c0b03aa8c4c0e0a633479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a9b801fc18e2353a9cd4de337bb33433fbe6225e21bb8b5572b0acaa50d11b7f3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936285975d087512001f0808626ddb099c402deab2a31fe6815cda4a96046af47231260ed9ec9ab1e79007d15fbab81df65c0fb14652b0fe58f2b730a3e13657de0e39f192d4dec24b48e9231a08b7d2e64fac2040aad69c16c1d9eedfe5fb62ebc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8478b1cc13202df27bd080e55410e541629423e8",
    "content": "{\"tx\": \"faa2764402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c11020000009f2c27d5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b77000000005ce06ec703e2aa73000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6fb35962b\", \"prevouts\": [\"7b284e0000000000225120e0ca4cb327604d8bb54d855256413a632bce5e2185126ca2f73680d7829d5a91\", \"ad77280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a93db9de682c659f71e2df2283b4442c1538d3696de14cf44411646e85b3f4a8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a6f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/847ca904186295e8fd47a4e29885615907cb992e",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41a0000000077b56489dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdf0000000045bcf180046ed1640000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a647a36e60\", \"prevouts\": [\"e4d03d000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\", \"4dd2280000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"be\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93659372e262d5a0f9ef536aae388303ac1332900989a5444d826ec2580d67fc3a21a521886ab29756862a71c0453b77f880429f1d68b1fae0f34d555c1e4747b3e7a9dfad218b10cddcf05e9e788f58784bb5d8eb58cc0f6cfe4d23ba63d85e381\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a5bb2be9c002390585aecd6a44dd843628783a58b1ff5512778ad80556de83f015cb0c87b91becc5e8e88545f518ccd4dd82a3936db012f0c0e2ff8a479534101a521886ab29756862a71c0453b77f880429f1d68b1fae0f34d555c1e4747b3e7a9dfad218b10cddcf05e9e788f58784bb5d8eb58cc0f6cfe4d23ba63d85e381\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/847d38e6322523b12583cde1ac03aa9cb6c11494",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf60010000006c56fddcdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf700000000cc52dde28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41200000000d0282f1d047d49ca00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d8000000\", \"prevouts\": [\"a7a86f000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\", \"7af02500000000002251204bd530dd92500289ca536d9e0216beec7b39c81554ac6dd1e9e4cc3828e76161\", \"2e6e3600000000002251200fe4658e0dbf66b6be10f530376fb0e6dfa185e9d7f38ef5d5af1eba17e45594\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d06edae5b29d15a8589ecda9763945c36b5c241cf3df1afb796e5c490e9af3a4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a5b616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8485b7daa7b9582b7257e4ad6aa767ad9b2c7173",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe7000000001665f807046b096900000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48788f9e455\", \"prevouts\": [\"ce146b00000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c57d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363de8b7b4122057e6036b6b3743e89ea35e047ef60fbd0be824b8516a5d1bfd004639ba4332756735e08e9dd0c9395e600a8a67669bda3acb22644b013566df8000378a892e4dc43a17c9ebd71803200f2f24c9a40c2827c304e59be9b4a7df0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0826d35158b06e93427cedf9700445f423da8a62a86b9572893cb3b0c5b8130f93e00378a892e4dc43a17c9ebd71803200f2f24c9a40c2827c304e59be9b4a7df0b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/848ef68b2028c2d1d2c774427baef8811e6973c6",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c900100000041cd9365dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb300000000928020b40148ac3f0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e734010000\", \"prevouts\": [\"e292480000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\", \"0e52270000000000215f1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ae1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364f8c4c0241059f879e07c0bc8f393a68e96022201a845cb28a0ca7d7bda2740f4b04f8f54a0a76ae0e4c7aeaaef28ce29fe1b2cd8b193a4d28e758ec231d2b883bd198ccbfa9c702c0592bb8c84a948c36ef9eddfd1aec8278a333dab45811656e171838972c3c3a6cdacf031a4825f83b841697bfdf19ec3d087e2c9ca65f0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93665513df49044bb35b46ae900575a7eb3f6e681c52a9940fe88416598d87c452a3070c0d29d47e9fe7be7df27becdaf45cc7da31561e827162b16aa01fe84c4a24f44ecb3bab6b962a7ffa14a2ce082ec551943f33ce508b63a8ee30ee5e49264\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/84b78b9ad073a948405f0b7ab62f9f69118ba8f0",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5000000000de02e99601bf326c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4876d010000\", \"prevouts\": [\"5f74740000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_b4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ab872e6a59e30e38791afbd7e3e528b83731d6ec6a91b4a195a975bb55dcaa8f2c6b2d1254846413fbd7ddc33eadcd632914a4b1726ad459f5156be39b459dda83\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9b036a78fc192e530dd3291f0394faa404f3a9ac30ce54008d17049cf08ca28373d7770948cc4a4daec748f6d28161827ae03e5072c1d9ced55a995ed3343e41b4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/84c54f3da6a5e6fab8e1f0e9e437a602b838b808",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd700000000fbd7ecb1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0f010000001dc16bf4039bbc640000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88aca8010000\", \"prevouts\": [\"f84c4800000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"ac261f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_91\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a8b0ccd91053aa6f75806777f49917fbd414369473204b5304e83df5fa9f9b01aaef1e6624db43330a47439ff3982c569c36aa3665f167e2396e7281000eea2903\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"165a25b414f4fac76d97b5945bcfd00721eeaf105c96d4de1e08b03838d09305b861aca6404486c92c4c1da4b33f047ce3d7be1318fbf527c3c56dadb3179ecf91\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/84d1cf1063766590aee538d2b55b7bd3698c0de7",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c485000000008b339dabdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0600000000e4e34c2901612901000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48716040000\", \"prevouts\": [\"f0d93500000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\", \"dd75230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_77\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8a2d7940f583926ef1d2b26a5caf70e9a1521d8003a94aa2d109a81bceb8463cb5aed13b1030978dc80fc2ccdb4406e1bb280185d4d66f1892bb93e95d780bc302\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"de5a9ffe358c6f96c9b9b36b0a33333da6539d4cf81964c1b77807df3c5ea75baab5adaf0a5bbe117389accf1ccf1ceb8e5ef1fa9868dfcaafec87001a519dc276\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/84dce9fa92c533d455e0c1f97179960220f0a855",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfe00000000526d26b7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2701000000c3f9d3d90238f9730000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79600000000\", \"prevouts\": [\"20c81e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e96a570000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_1a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6e3d234b45458616b432f951eaf3bfa9348f9d18eaaa57f5928eceb141a837f2ad2d54132538b48ecb27e077ca4a20fb4cf5b96fb4f7351a535518f8abde92ae81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d5f63c5027d4441a79055ac686bf7196a0ae298d677ef524d0d3d17ebf91a971b13331950a51a4d2f2ef752758c5556db444d993abbecc461172f66cb304835a1a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/84f74ecd7dcd980cbe8f5c5df3e9de9eb9e2198b",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0d00000000c0b8e70b04391d53000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac50020000\", \"prevouts\": [\"fffc550000000000225120f98f853e6b4327f1b4277c37b28aefc415c1e953b3fa9f1ef781dc42a80d9b71\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361f7693534e61619efc826df84c4da4b2cac3827d7f1ac50b56bb7a432d3ab8c0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a3f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/855137df77e723cfc86499f4fdb99f284ce7dfb2",
    "content": "{\"tx\": \"0a67d5d202bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf03020000001e51faa7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7e0100000001bfdca8034512b7000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac9d83214c\", \"prevouts\": [\"bb446500000000002251209884719338e1397826c7fc76b57dc9070e1ae6721fe0f4052d3f32cbc4476e6a\", \"857d5300000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_0\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"9a93579f0dbc902f20eb3236a29b7795691edc34488210105260dc33c84244ab7a8be3bc9902ab848f83aadb729fa498e01c72a0b8ad9cd2f7360cf8a87d8342\", \"dff13c08fd97ac682a573ee694c37059b46188b1d526eb3d271d01abf3d3e8141f8113c8d0fbc0a74cdd677197f4ef907c45ea3af9beafd302ad0312f7a0ea52fb2545864d1d7b63340ffe54c9415e1965ef3e433b5bc241e80c610ff8ca934ac9a7d7de52c4fdd78d25726174f2eeb3ba10eefe1fffbc06d2\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936aa89738a4c7df4b7e53305df69816a357977ae495ada28d1f508ae0a3b0f08607008d2479bc8b48a246a101ee4b49f0a15a2b0675f0b4b0afee40f21d20b176002322d9b2b60b6e4fd37374163d324c1a6de10f97494d57fc835c33571c5954c8b48a46ebf64bcfb2c54503bf63dee8c40bb51ab59d3df7fecd6d739cedcfe31d768c3c060aa2af011a8ed5af22581cd10184f0ac421571baef6daffb4794bbab275aef13afd117b1160c12da710c6f8f8edb229a889aaf5082ca0fb234dad31bd7a0a2c186fbb5f5bd36ce6bf04ff01cc35949f4ca5d8c5226548c44d324f93473662e31fbff764a3c491e007914a33226c3cae281cdd07f30e6995bef0cf025c2274a75cb4b6ac9405a299cdc7fe3c10b56a5a3133c41cf4007b7e1d7f7a0ad997ed7d66498ec30b5244ac9c72026ef3138743e712b33a45d0b4b81becfa754e45f14ca2740c90eeac17126f8b08e6fb37566a8e657e0f4666eb6c857038e6d4518202151ea7f2cb6516f16339991381e736cda7031484c4b5efcec0f41a079773c21fcf7a9e922d8f9e257b114c80cab1157d015696785b2f06431a2263750000000000000000000000000000000000000000000000000000000000000000\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9a93579f0dbc902f20eb3236a29b7795691edc34488210105260dc33c84244ab7a8be3bc9902ab848f83aadb729fa498e01c72a0b8ad9cd2f7360cf8a87d8342\", \"6e981877b4503e0d242ccc256516bcd30cf0d06ca1dfdb0fa15eae4e28be9e0dc98570a9028366a8c3563759719d1069bf15b93b893ef58bfc4ef0a14f650b96928d0e6a55f94b099e0022f47650fb9377a072b994b16763e14c6e3406f2e806393d50459b72167ad8f970852979d4d127b5b22aa951ba2f\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936aa89738a4c7df4b7e53305df69816a357977ae495ada28d1f508ae0a3b0f08607008d2479bc8b48a246a101ee4b49f0a15a2b0675f0b4b0afee40f21d20b176002322d9b2b60b6e4fd37374163d324c1a6de10f97494d57fc835c33571c5954c8b48a46ebf64bcfb2c54503bf63dee8c40bb51ab59d3df7fecd6d739cedcfe31d768c3c060aa2af011a8ed5af22581cd10184f0ac421571baef6daffb4794bbab275aef13afd117b1160c12da710c6f8f8edb229a889aaf5082ca0fb234dad31bd7a0a2c186fbb5f5bd36ce6bf04ff01cc35949f4ca5d8c5226548c44d324f93473662e31fbff764a3c491e007914a33226c3cae281cdd07f30e6995bef0cf025c2274a75cb4b6ac9405a299cdc7fe3c10b56a5a3133c41cf4007b7e1d7f7a0ad997ed7d66498ec30b5244ac9c72026ef3138743e712b33a45d0b4b81becfa754e45f14ca2740c90eeac17126f8b08e6fb37566a8e657e0f4666eb6c857038e6d4518202151ea7f2cb6516f16339991381e736cda7031484c4b5efcec0f41a079773c21fcf7a9e922d8f9e257b114c80cab1157d015696785b2f06431a2263750000000000000000000000000000000000000000000000000000000000000000\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/857a099c2b46ccc02b866b3d0c0eb37858af7f6b",
    "content": "{\"tx\": \"aeb1416d02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1400000000d2529385dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2f01000000774ad9b801e1a53e000000000017a914719f78084af863e000acd618ba76df97972236898769876854\", \"prevouts\": [\"c5d0730000000000225120cd23ad59c6016ee1812d662f3dfa4b488c728badd6e7eac21806d0875fd86aaa\", \"03124a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93659b2dba12142179b1097cc93efd347ce95e71dd12a795db31a4271de04236572\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aa8616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/857c4d2b4cbe976e614059e4d9eeb613c69a523b",
    "content": "{\"tx\": \"deb4eb260260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708801000000b89731f8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b360100000085b672c00156510a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a698744740\", \"prevouts\": [\"80ad12000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\", \"eebf20000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"3b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93607ffa4357b1418f2570d4fe87dfe37d7ee3541eab3f2e6079ff7fe47c21164c3ee7dbe7f66d64a980d12157b84c42445cf47ca482a00d5396c717810eb35e86629f15cefa9911251712bcf83078e1db490f7db40c14a26e0e577f39f7cfaf11f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e29ca03a9371c532b03ec93c4ffb27f967cf1c414c08502d0b6e094a92f799b5fc7fa9328de6285e10958c6b3d6f5d3c073b4c582e31cb42904dcf82d4bed78a29f15cefa9911251712bcf83078e1db490f7db40c14a26e0e577f39f7cfaf11f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/858fcb46fd11dfff505511ab32c43de93cb923ab",
    "content": "{\"tx\": \"e714d45702bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf73000000005e8f3194dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1b000000008732789101f288010000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e798010000\", \"prevouts\": [\"9d317d00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"c26c240000000000225120396e1e3d37873693c049a0e141d36811f0051f76fd306cc6c1f2259368cdf0eb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"be7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fd522f1cef67c43cc160020062cdc11d631b4f6eefdd5e68f18dfd86aed0bbdde4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8c20793b34d3eca391845c9ee05577f0fe1c8a49b621d2ce1a9da4783f236266e6f69f1f3a976918b4a05b157c0a8e21d478cce8b5d78fdf690138c8d187dd5c9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eb7c20d175283666615e94eef717cc04c54a6d9612bfb359a13b4f03ea50e15671092566d000aee18de877d7d37a6499dcaa40717b87fb42c4af8a156e9c8751ba72dfb389a6a0bb3f8b3aa7842bba2225719f72a11deb6eb959f4e6afb1e08b911ebac8c921821ba74d98d656401ec4b56b2bfe8f672693a939227457b8b1a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8592c80000cf304bf52753ab309ceb04e2652ec5",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff0000000009808edabdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba601000000851525c48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47701000000859dffb10302a2e2000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374871878ff56\", \"prevouts\": [\"74b9810000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"6309280000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"0ace3b000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00639768\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082088456232115bcc24dec0b5a24cea45f7d15fc3427ff6cd91fcf5dc3f7efaf083288455e3867d2ff7594cc417650f42f79f93c98aaa5c5ef25eb3554c8bf2ec6282285524a15c732567d099967405d35f7136f74f48f011bc4ab279ad8d14f14\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fd36adc2e08ee387ad104b346fceb00365162d18a911b71ada63b74469326ca305f4756eb22a3c38e0612932b2e111811a644330efb7a4d77fa512235b8ceac2f213b900f5cb66b025bdcf0538d69427e8f93cfc9741b2125e61cf9215fad53f373be813dc08f80e09d78de4ac5358a3bdf22545a425b50fe87daa20f96c44d7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/859bf525139277f5088a3ce814f120ba25928ba7",
    "content": "{\"tx\": \"bbb137fa0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a7000000004902a3b1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbd01000000f5d511fb02eb6d33000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac27000000\", \"prevouts\": [\"1b9c11000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\", \"1c9d230000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"cc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369bac3d01da396ed984241b54aa1bb3aef909b4fdbe414b6dae042f63774e412bba22abe4a548a0fc6dfdb5b637d4f02bd7b4a4be5fc13f7c30d33fe8bd172a30474a999e2826f1f27f01ebf91ad073bfebeca039a55919a1ef327838bd290026ec1da8cea892037e805a477afbb54b1f5ec380954f076c0bcd3c4e3d4797a8d6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082af68f276ddb4c0fc7f0310a620a2f1f9fe6c0e4e29d0e280a559099e56625bc6391effb841e4c3f4ca92b599bc572f2bc6440711e20bdc5ba4fc353379105b198f95dbc4edc81931664a748b39a9978dd32dedaf5c850114f6bd2f5098c050fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/85c3b1c5bc8469eb9f51ee2b19c514d2dcc9d4e5",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4020200000098371f3adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbc01000000059cb1e5044b7b7900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6f4010000\", \"prevouts\": [\"a15f32000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"55b04800000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"a17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c812096c7134552cd7fcb4579ca5ad4743c34f32df04030bf869cb557754a4a4fb15e70bbc27f4f9ee6ce894c5f8660c4bc0a21501abf5c583e18e279746b733479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4ae668dba12609f1dce2a1e29faaa62ff248d54f408b31ef31944f67a579d4fbb4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e856012e14d1393796178822b876e37f88bfb8786abf6d56f290a567bb98032f4de668dba12609f1dce2a1e29faaa62ff248d54f408b31ef31944f67a579d4fbb4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/85c9ddc38fbb85bd175bf3ac00a626752b964461",
    "content": "{\"tx\": \"2168928d02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b680100000082a688d3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0600000000b79a99bf04f55a8e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ace8020000\", \"prevouts\": [\"0ab323000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\", \"5cb06c00000000002353212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"9621b319c232918a7110a0dda37564d742a55c1be3d598ea7d166118b890070cac09138ae5f98033b6f64e501f2c6196913f21224e80329f83922ebf9ff84a92\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/85cd37fe2c7301fdbdedfe4eee2559a27232c9e1",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffb01000000542e9722dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6100000000f28b12b601df1e4500000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac50000000\", \"prevouts\": [\"54a96e000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\", \"b69c1f000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"dc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082276acb01c569c39653cc9be144b4517abeee153b1e65c2a7dfaac73ffa4f7941ad29df8a0e62e4f40897f8996914b12118c918ca2851b639742aeab01f587290\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ec1c00ca223002bbb4a77b296f490434ed2387551884308e16e8dfcb52ea12e9f3bfe8b0458382ba4f4ce4b13b8b707c198a710172b0004e49e202e4d70abaa7b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/85db7ff2b922cfebbf367553f67005a39f7c7481",
    "content": "{\"tx\": \"0adb3c5a0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c30100000007c9f6ac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704a01000000e25f26870387721e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2a817952\", \"prevouts\": [\"569012000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\", \"59830e000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"6f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936543e4415e2a4e40b55ce2e476aee6da566062b9d3b6813c54da2c8fa9b5db829796126e2d69a152489172163b4bb3b76a5285668b37fe09a10764d2324ee4a01a6ef766bda57b4717926485a86d332fc460fd2733e6a54825f17015621dd4290\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eee33f25a3bc4431a4899fa373225b82f91b265358d1b8c12eb75241dfe6f4bf6dc39ce81a6fea632ecf565fa45d7a7ca50aa2e3b548038c9066d72b539243596a6ef766bda57b4717926485a86d332fc460fd2733e6a54825f17015621dd4290\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/85f392952d2f71a976ea2c35e174e534ade34805",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c455010000002e8aa283bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1c010000000ded30ab019a4146000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478713000000\", \"prevouts\": [\"2248400000000000225120fc4f9d8aed21e545c10b3b4fb5f7ffa2432ec2f4c867e738428f21cc99cd5336\", \"4c276f0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_4\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"1e1f83551bb2f331bca92b461cdf8a63776e92073723dfaa24cddfdf85444fe37e4a3dd0bda69af212cdf64c6b4a2dafb1ceca20b748ddd4ba07e87facba897201\", \"71905065eccacd55d9a6d165d50fedfbb2d9b18962f7ed13600f0a7ed474250792719ff4eafe1b845a981bdd4218a50467da843feac66c4460b4bd10f8df51b2c4bcdf4a3ce34c5c818842fabf052e89d90619d38bed2ff59cfac6675ae4a15d71516055936cd58c04403235b49a77361946ca1a61afcfc359bdd8c7445e8b851b2c5385f2a40700779b70bb6134103ebbd337c662e0fcb3f1\", \"75003535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a2ac91693535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a26eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cafd838e61ab3aa45c319601b563b9c658905b907134deb4cc79f3bc13ff369b0000000000000000000000000000000000000000000000000000000000000000273ca7b5af5c33cd596a394254ccfccd1ad7f414cf24eaf5251ee142edfc6bba19e1974746bcd95f883b2c5f8b9cd70ecc189bb284120cbe237fccafca83785a0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f292326c7bf2ced92e8e5f55f7d4c058bc53f0dc5d72e6f54d90a99bd448a0a7d3178fe8ff3d1648fd0414c507f32ef1a859472bba31e5fd87f9395eb28563d000000000000000000000000000000000000000000000000000000000000000053cb80cf27390b5f3a9b6e8f7b62b6973f471195333decc81153a008733c93f4fdb984c50376bf112fc5b1ba5121971048d8604acf0e95c0aba37777dccd84f7265ff857dd5353a6f266df0c827cc2177bd50674255e0d749a1de050f0543a3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa255cc08baca582f171c88e3afb5850782245b5ed7b91c999e195e37d9159bd5d8e80d80e4a0fe1afa47b4cdcdbc993cd0db79675bf4cd78cc37b4de49bc27cb8b09e1ee9dff2bd5c170a69d6407e15bee592ac7316759c0b21c1ce5c1e004f3bfa663a0599002637d08bc203534805f26d034051e6a67e85ccc9bd956c8d8706de45c3a48843ffe045e251fe069222fe8da2ee54f1847880aa81efdcaa9d8525d20e0edacf2383ded399026cf8bae72fa36b1caa97db067cb54ec3ec4bb5d4284e14408a569f47e5deb40589b32bf49aa1bc60a3632cd7e9e9585937c90d6b5f93801b1dd258f77e7dbd42a444590190088faf2dfd4654dc4249a5d6ad34325ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d5a204a83fe59bacd1cae520ac4d3bed216198175683bb791441d91e89feaf10000000000000000000000000000000000000000000000000000000000000000ad10f52d27e62a6a591b25683e510603924fa6b0f324a16e58aba1d57e478ab50000000000000000000000000000000000000000000000000000000000000000612e5dc139866e7b4626935f13e419d7c281bef6c5b9deccffb02e9f640fef85ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff737008e4121812f7dfc661b4b82fed08887fe73b0c9217265c2827b63ba2f13f59d5370a9318774a5bf4ce7ad10f052d6dd560323b574a7a7e042e3b227c162770be6fea8df19f1fd40bb23931116b7b3d192544775e300f6ade15d75b2779cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0e1f2198ddd478c68fe8bc5cae5fba8f760af3223933412457b382baf708df1000000000000000000000000000000000000000000000000000000000000000057f91a0ae05815cff02d68409806996d2bc455488ec896bddcee07d0c4d6c70e139403ed87e7aea928d90e04ec3797d79f44ff8b7c3d9e6ef9026af18da7ced2aef523a35a1d80f25f28c52fe09f4bc05ca9ca4c55aea7c169ac86caaa8897ad0252fa602c378c73546d62399d429bcd6a33226f823339715698ea6591be845059b987a2a1bc15e860ae688586a890bd57be17a71de63951967861e056cacefc3e95b857a1b91d9aafcf992cc9dc01a2a4e6f9dc4c8c5e5c4349f555667d7123d849ded7c59f5b86a0da4c79ba396037cfeacc2ac9a8670ad8578ef2a84e5b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ea8ac52b648c54e233c15f34def3254a14db47c628758cc7829432e590914faffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffba5c0b91f828bd18271ecd6c4dae93559e9116cf9453bfb8206f901c6743a9cab01bdd510ce4686cea15c3f76949dc144c8f536e699c49f2451df15a870b78ba972c14264ec6d656dd0713cc207f47f0e2b60a1603beb401d0415a3512fdf67fa08d29024c222184cbfb9fc309295d41252e71df924cfd4b9fe9b39eb22f41181ab69b3bfc67a2b0ad743abc470de8038dd4cffa9b86d840403dfb3e6648c0a179acb062d52d263d2938a23080f331b79b7876025046056dc587a22c510e2d0800000000000000000000000000000000000000000000000000000000000000004987b50f34c8c73a37611a384c940b3a992fd3bda13c7977cdea16dc908999c5ad194a9100e95b709f58c760940fd261f58c1801ded98189feb7da08b4e25ccf52b90c8f8e4677d6c7f36ed648f8c95f3247fc7e430a5a5a6da0f580faae6b322bf75bbd6fb247d37416816ff2b34cd40b41adb272237d45191ba43ecfccf66413662ed229705db4b58c9f1f0e7d2c93731755b2ec8225c11cdc26a2509fa8b369eb4bf0bceb70705498c3365658a01c491f03b4c4e96703d754886c48762cd38a9eec07f58066af8bd1958d1581996c3dca686cd7de13fc50562f63913be5680000000000000000000000000000000000000000000000000000000000000000599902bb31b9b47be94d47ea436572ad1d40cc78837396efff19b94d67743d19b36da655666e784462b1bac23bcf49c043cb8938813dd768fa10677620e66edcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb11474d8d7d45a2162c042c809a94637dfae668979492f2bc26f7df267ccadd5472bdc5055cebca364de35de1988fdcf5d99bd1e5f5650a306bcd3365aac47cb00000000000000000000000000000000000000000000000000000000000000006c75b7ec805e6b759379b193d8ddc7f05114cd92dcc9ca81e8d74d4fc647c79de0a4b67933c0571d3ca17ad20d3b84ae5e111c16c67dc40246b2162f4a5e875273648b120252a93c9a01dedfaff864a1c8c97cbfeaa8b7bd7269ebce3fa6c80779240a0ffb055322193a51582b49b6149a85e20d3cf0c5c8d8b23ea8621d9893f8f45270f1ed4c0c735210b7375bb798129e7fc52760d85eb6f9ff49956a1b632d065334eb4aa61a8f6fb07859ebd6156484933ae3ff6b47e2c00ee48a86a6d81db1dd4b77f271b2cb0663cbff1f3356a17005383ef098ac293f71fcb4cf6dfeaebe874adbf1f83e61cbe80d100dc3d727ce63fb671143124592f75daa70648e00000000000000000000000000000000000000000000000000000000000000008ebc3644557f9a14c4447e9063b696e1ef247c64b251adbd183e45282236b50309d3c1994d5fc4da7358467a2d99f469e77b3a0a4cfee42a190dd92e3101e8605ec6de73fa6cd87c792a85e8d1bce2b27f416f0863be8ee106b0cf300ebaa03b272be4c918bca9b79514fac857babe12ff83a7b9160dee3098b71acf612b6fcaeceea30c1150339fe31dd6da8f421e4e10d2cf47cd9edbd2fd74a87954883dd2cc2756e7455df3bb78fac74f3fe83014d0b3f8ca1c15678b712f6a2c4154bc91ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff48216462d877d3d730dcd17ca53780ba486bd88f865ce5608ee144921a3fe0bed5468ed4cc5ac248aa4159cb1ae718483fc82bacdaca36bbf7d3244fda58e01363687c820deb74bbcd202fd2b32ef452f36d50891b57f1e318f2f36ef6e7acebb83f7cf6cb8f273468962b6feed445e6801ab97ca9f5756b00280f654c279c8100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011811a812dfdf49ff524d92f338dc7800912fbbef314a3bf56a6010d8b8c4e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff557f48844356415d0ed40cb48bb3240d578a5b08167d1e1f30a44f4785332649ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff493c0cdbc18a65bf391d45918c887ba6fee56f41a91fe91082b446ba6486bb5bc2236ab0aecf6d68afb88b6a2409b52abe4c48c0974209d445c47da956c1f8720000000000000000000000000000000000000000000000000000000000000000\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1e1f83551bb2f331bca92b461cdf8a63776e92073723dfaa24cddfdf85444fe37e4a3dd0bda69af212cdf64c6b4a2dafb1ceca20b748ddd4ba07e87facba897201\", \"9cb52c193f69929371be021ea2914521eae608cf2f38adcb19961ef85b4407612c35bb494adac35255ab4f1921dfc623accce9e20b6e7cb5363eb73ff94410047a014d93c07f1a84ed737f6e98caf7c8cc2b9be4e3e99d0650a0dcb0121350b26c0e2733752f4ec3b56273b29a2190e0177cd0ea9cfc95070a7d18edafeb40d9851ef75a8c6cb488547bddfb1630acb2ba90d85656047ac2\", \"75003535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a2ac91693535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a26eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cafd838e61ab3aa45c319601b563b9c658905b907134deb4cc79f3bc13ff369b0000000000000000000000000000000000000000000000000000000000000000273ca7b5af5c33cd596a394254ccfccd1ad7f414cf24eaf5251ee142edfc6bba19e1974746bcd95f883b2c5f8b9cd70ecc189bb284120cbe237fccafca83785a0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f292326c7bf2ced92e8e5f55f7d4c058bc53f0dc5d72e6f54d90a99bd448a0a7d3178fe8ff3d1648fd0414c507f32ef1a859472bba31e5fd87f9395eb28563d000000000000000000000000000000000000000000000000000000000000000053cb80cf27390b5f3a9b6e8f7b62b6973f471195333decc81153a008733c93f4fdb984c50376bf112fc5b1ba5121971048d8604acf0e95c0aba37777dccd84f7265ff857dd5353a6f266df0c827cc2177bd50674255e0d749a1de050f0543a3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa255cc08baca582f171c88e3afb5850782245b5ed7b91c999e195e37d9159bd5d8e80d80e4a0fe1afa47b4cdcdbc993cd0db79675bf4cd78cc37b4de49bc27cb8b09e1ee9dff2bd5c170a69d6407e15bee592ac7316759c0b21c1ce5c1e004f3bfa663a0599002637d08bc203534805f26d034051e6a67e85ccc9bd956c8d8706de45c3a48843ffe045e251fe069222fe8da2ee54f1847880aa81efdcaa9d8525d20e0edacf2383ded399026cf8bae72fa36b1caa97db067cb54ec3ec4bb5d4284e14408a569f47e5deb40589b32bf49aa1bc60a3632cd7e9e9585937c90d6b5f93801b1dd258f77e7dbd42a444590190088faf2dfd4654dc4249a5d6ad34325ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d5a204a83fe59bacd1cae520ac4d3bed216198175683bb791441d91e89feaf10000000000000000000000000000000000000000000000000000000000000000ad10f52d27e62a6a591b25683e510603924fa6b0f324a16e58aba1d57e478ab50000000000000000000000000000000000000000000000000000000000000000612e5dc139866e7b4626935f13e419d7c281bef6c5b9deccffb02e9f640fef85ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff737008e4121812f7dfc661b4b82fed08887fe73b0c9217265c2827b63ba2f13f59d5370a9318774a5bf4ce7ad10f052d6dd560323b574a7a7e042e3b227c162770be6fea8df19f1fd40bb23931116b7b3d192544775e300f6ade15d75b2779cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0e1f2198ddd478c68fe8bc5cae5fba8f760af3223933412457b382baf708df1000000000000000000000000000000000000000000000000000000000000000057f91a0ae05815cff02d68409806996d2bc455488ec896bddcee07d0c4d6c70e139403ed87e7aea928d90e04ec3797d79f44ff8b7c3d9e6ef9026af18da7ced2aef523a35a1d80f25f28c52fe09f4bc05ca9ca4c55aea7c169ac86caaa8897ad0252fa602c378c73546d62399d429bcd6a33226f823339715698ea6591be845059b987a2a1bc15e860ae688586a890bd57be17a71de63951967861e056cacefc3e95b857a1b91d9aafcf992cc9dc01a2a4e6f9dc4c8c5e5c4349f555667d7123d849ded7c59f5b86a0da4c79ba396037cfeacc2ac9a8670ad8578ef2a84e5b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ea8ac52b648c54e233c15f34def3254a14db47c628758cc7829432e590914faffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffba5c0b91f828bd18271ecd6c4dae93559e9116cf9453bfb8206f901c6743a9cab01bdd510ce4686cea15c3f76949dc144c8f536e699c49f2451df15a870b78ba972c14264ec6d656dd0713cc207f47f0e2b60a1603beb401d0415a3512fdf67fa08d29024c222184cbfb9fc309295d41252e71df924cfd4b9fe9b39eb22f41181ab69b3bfc67a2b0ad743abc470de8038dd4cffa9b86d840403dfb3e6648c0a179acb062d52d263d2938a23080f331b79b7876025046056dc587a22c510e2d0800000000000000000000000000000000000000000000000000000000000000004987b50f34c8c73a37611a384c940b3a992fd3bda13c7977cdea16dc908999c5ad194a9100e95b709f58c760940fd261f58c1801ded98189feb7da08b4e25ccf52b90c8f8e4677d6c7f36ed648f8c95f3247fc7e430a5a5a6da0f580faae6b322bf75bbd6fb247d37416816ff2b34cd40b41adb272237d45191ba43ecfccf66413662ed229705db4b58c9f1f0e7d2c93731755b2ec8225c11cdc26a2509fa8b369eb4bf0bceb70705498c3365658a01c491f03b4c4e96703d754886c48762cd38a9eec07f58066af8bd1958d1581996c3dca686cd7de13fc50562f63913be5680000000000000000000000000000000000000000000000000000000000000000599902bb31b9b47be94d47ea436572ad1d40cc78837396efff19b94d67743d19b36da655666e784462b1bac23bcf49c043cb8938813dd768fa10677620e66edcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb11474d8d7d45a2162c042c809a94637dfae668979492f2bc26f7df267ccadd5472bdc5055cebca364de35de1988fdcf5d99bd1e5f5650a306bcd3365aac47cb00000000000000000000000000000000000000000000000000000000000000006c75b7ec805e6b759379b193d8ddc7f05114cd92dcc9ca81e8d74d4fc647c79de0a4b67933c0571d3ca17ad20d3b84ae5e111c16c67dc40246b2162f4a5e875273648b120252a93c9a01dedfaff864a1c8c97cbfeaa8b7bd7269ebce3fa6c80779240a0ffb055322193a51582b49b6149a85e20d3cf0c5c8d8b23ea8621d9893f8f45270f1ed4c0c735210b7375bb798129e7fc52760d85eb6f9ff49956a1b632d065334eb4aa61a8f6fb07859ebd6156484933ae3ff6b47e2c00ee48a86a6d81db1dd4b77f271b2cb0663cbff1f3356a17005383ef098ac293f71fcb4cf6dfeaebe874adbf1f83e61cbe80d100dc3d727ce63fb671143124592f75daa70648e00000000000000000000000000000000000000000000000000000000000000008ebc3644557f9a14c4447e9063b696e1ef247c64b251adbd183e45282236b50309d3c1994d5fc4da7358467a2d99f469e77b3a0a4cfee42a190dd92e3101e8605ec6de73fa6cd87c792a85e8d1bce2b27f416f0863be8ee106b0cf300ebaa03b272be4c918bca9b79514fac857babe12ff83a7b9160dee3098b71acf612b6fcaeceea30c1150339fe31dd6da8f421e4e10d2cf47cd9edbd2fd74a87954883dd2cc2756e7455df3bb78fac74f3fe83014d0b3f8ca1c15678b712f6a2c4154bc91ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff48216462d877d3d730dcd17ca53780ba486bd88f865ce5608ee144921a3fe0bed5468ed4cc5ac248aa4159cb1ae718483fc82bacdaca36bbf7d3244fda58e01363687c820deb74bbcd202fd2b32ef452f36d50891b57f1e318f2f36ef6e7acebb83f7cf6cb8f273468962b6feed445e6801ab97ca9f5756b00280f654c279c8100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011811a812dfdf49ff524d92f338dc7800912fbbef314a3bf56a6010d8b8c4e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff557f48844356415d0ed40cb48bb3240d578a5b08167d1e1f30a44f4785332649ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff493c0cdbc18a65bf391d45918c887ba6fee56f41a91fe91082b446ba6486bb5bc2236ab0aecf6d68afb88b6a2409b52abe4c48c0974209d445c47da956c1f8720000000000000000000000000000000000000000000000000000000000000000\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/863c74afe345aa2460edf06abd9aa101ade521bf",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf91000000002b06489adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd001000000a1a8c5bd0374ded3000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487df000000\", \"prevouts\": [\"ca847d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"defa57000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0dbe0cdb6e99edcfec16766ec5847d1f54ccd051e23ee2b2272cffaae333295d1b30b2981ae69232c3f6c5ff759e9ad4102f31f3fc5e7a3a4ffd34dce2e2e06026\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51e707b6995f8993c03f45183b0bc1e0ebe72a0445f3f0cf57f2d95712f279e1c2be0cdb6e99edcfec16766ec5847d1f54ccd051e23ee2b2272cffaae333295d1b30b2981ae69232c3f6c5ff759e9ad4102f31f3fc5e7a3a4ffd34dce2e2e06026\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8641c37d6051843e6ca2af00b13ec220650722d5",
    "content": "{\"tx\": \"e0ed141303dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b93000000001fcf05f6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7a0100000091bd69b9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc8000000009a4857d5047746c200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487bf000000\", \"prevouts\": [\"bec22800000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\", \"73802000000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"8c967a00000000002251208560e60ff9f5f50e17abe0faa94b8704db3bcecc7cb6f74a11a752b4bbc814f5\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360c6fd00de61eb3e1d1c6b14a5c219f23903679f62342f964773f78df2cf30666\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a03616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/86808a5b2f495881fed3418379a96faec86f72a3",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3b00000000110e443e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d6000000007304bad901c0c94000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac97000000\", \"prevouts\": [\"32502700000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"2ad4360000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e868e9a99c27257089f8586472cc94222e874ab5c5b462fc98ac1b045b7a37dce65323990ac9ba96640afb66df99f25054f5788ad16157a03b33c6c26a70bd925e21136d3d9ecdf371b2101a7e86edb56e15b10ef185a8506988239bb2b5a4c43e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a48ad409340116ac239d5c746dae159519851dfc1ab3c3ad2152d495f5f1663b52e804f6a261e09ec86c0fb6e6ff5b26564af7d86f56b1539029a07a3794a04021136d3d9ecdf371b2101a7e86edb56e15b10ef185a8506988239bb2b5a4c43e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/869a1712bd79edfc9d95461a25217f1b4b203e29",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdd000000008a9c37cebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0f02000000eae7a34c03b3f48f000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7c198d544\", \"prevouts\": [\"5d6e23000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\", \"e07a6f000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"3044022066dcf42879c592d57b40b12b5b358b9c1c140fd25638889bc3d110d915ebab3802201230eb2902a683aefb94dff163f86dc2de66878c48a01d7a77e4c3cae813af3601\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"3045022100aeabcf3e19de6dd8ba23cbc9c1beda5d7bbf44e41927f43ee425f87da583df1402203bda596e67695b66dfe856c4e3aef1401a04e6dc9394540159257def137864ab01\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/869e9e9fd462fca683f8b432da94616198c8eb41",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43c0100000095415d86dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6b00000000d4fe448802e1715d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2708ec21\", \"prevouts\": [\"fc1c370000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6fad28000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_b3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"90ac5345a1f7059a3860ee56ba9f595556776139c921143307722a9cdecd90d279a4010ab4a7071b951e2795f32f8f605e22e5084d1602f723054d7a3e97a0c983\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b3787d79274d50571af70bc04d570b112e0177223e453f31a810a5bf9a975e9432023d432f177f6bca6d4133f6961490919ff66a969071f5b24817325d5b8f28b3\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/86e9313b4a88cc4785b502796f36bd97f1174856",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4070200000035c405e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca301000000f48bf49ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b52000000003a56f2d902d8daa3000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac6c000000\", \"prevouts\": [\"5bc8310000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"a32d5400000000001652142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"05a12000000000002251202b18b828586b5828635076972ee0bba96c3f290312125c393cc54d832abc1349\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"d97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e84852eda400aa94cfe5024bf6d05446bd810daab3c27f5a95b027bfb109f343b83d33b10ff9eee8ff434f7c79f826d5967b94922da2ad2ccade1cbab3a3658011\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363a3526d2a5f8c4f602200f77573bcd308e02a3725247a50c328bd371ff84e2072d5942624d66fc39e30c2a996d85a0dad9a6418b79db996452744438b84f9614682a6e83df749f265180f93fd54e474915a8abfc6fef0a760c06d61a0bf42967\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/871647145b6c79309648164fe2e9294d7ba23b0b",
    "content": "{\"tx\": \"859599e302bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0e00000000418ab0fedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3b01000000eea2fbf30421558e0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac52000000\", \"prevouts\": [\"715e6b0000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"c673250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_a7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"23b0d43cfedbf7e5e2a7d12a7001c12944b081f478b73c12f151c9788336c1988f5aa0e593aaef7ecf3a0d8df16bb25ca3dcd345d8b3faeb716b23214e13241582\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"520405065323335d97d24f9b14120e88bd4cbe3b9b85e84e6f50477be8e673802921987159f4e1fcc4de81bfac1979894da0b368effefc1d88dfab65b68b2340a7\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/871b6052e7f9a98779e47518bd5f8bf607a0e268",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c13010000000be331e3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6a00000000b0cea3c303fd75cf00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb3030000\", \"prevouts\": [\"6a5f51000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\", \"eae27f000000000017a91448964eab407ad5d6e123f59d9280ca7998f71bce87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2351212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"949576924f61566a81f8e2fc476db988f70735fe3efb5b0b8a3c7745c025d91dfa932233e661c3be0cad5b027933f921b7a5ee56a0d51065e09ac9f6f94f1e16\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/87360adcbd85bcb0816fa5f993fc9a5e14182074",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8801000000e3859977dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1f0200000017508a9f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708601000000d56fc4e201266d0000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7e89ca15d\", \"prevouts\": [\"0f5467000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"e47e5a00000000002251205857fc26f723a58058d8b22639f4b33f8ef23084aa37309f77fdf87ef7a99b1a\", \"92430f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"809ad1df077d70287fc6ca0fc5f8a1334cd61d3393cf6df7e2e7a1d05d9a944d601000ba5834308063fcafae4b7148cd701ea67464b78b3b8143543cff54547801\", \"50a6662878d52eebaa6f34ef95f87d4bf918bba5d86f3d58af5e7e288defcc6458195b238ae1d4a6427aaaaefa27dddac2f2179e9b8a9837493cf2455442f766305458394d3c339a8641cf4754553b7edf7041082b614ac31ae27981582800872d7b905db993679f9d4ad82e53560699768884e562204d24f16cbff9214fe5c7cef3d032dbadf0f28a05dc672c096a1e2f7e2e35bcc9412ae6132e1ca089f46532dd90f9cd4effb389c0c6cab868a6e09eb482a5e93a0efcfe82eb4bbf3fdc1d3f787ce792e83d3e319d3bec10cf7f5c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"07bb2fc8647a42ebb616f3f893dc8feef08096c966089256ae1dc44fede3193ed8e174212c9defb504cf827457177a59b5e93ff8cc2402eb70bd904eefce197c01\", \"50878585d9ddcf767e45d57c3006aca03e08\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/874116a3fba0e5b88378c9825e5b2cd8fe9707c6",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6b000000005c19b047dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4300000000fa054f9360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127072010000002e2b715c0281e4d10000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6940e7f4d\", \"prevouts\": [\"ab4c790000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"48984900000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"4c73110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_69\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"da36f559a95c4fe3365718da6adff666b82414394edf582c70196463cb4c80a7c32c1905b7b21dd343dee9dad2c89feec310eee7cf9a46ed7cf026852dcc86ee82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f1a8f20db9520fa60eb4b8c12751eaed1f9f4527f28d83a8134e6465bb95d368da98c79e421580a8c9bea79f12e32d1c27565a0fedfbf2bf8750ee1a60c0f5c069\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/874498dbd2d21fb6b01edf60814088feb89dc02e",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48f00000000d54e494e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127089010000004f3ee92e0308664200000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ace75cfe40\", \"prevouts\": [\"113b33000000000021591f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"14ad1100000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902330b623fd8e192f208076d7e17c6e6b31585828ed34de7687213ef68459ec73831edf7d688638ae4d5b635e71d71747759d283e0630ddcef2affb4ce19e1884779417f38b58fe0e8a96813fb53afd0943939047563e3abb8803cb931f5fc54791a76dd6e609611cd984bf604fc08aa38c2e2ace73287a0669644069ae1151f0cb90b2c761ea7ea4be3ebb657a6978dbc869ad3ca3744a225b680f286c9de0fc3dcd8eca16906f5d3a5f5bd1088703380b1f7fc542afc4057c4f18af28c9dfaf51e916f145d7a70ec4b9e900c72ae8357efb10ae217dc8ca99baf71161a2968e7789ecc085c49c4c3718cae4de5102eeae0b4dcfdb0442ab94d27f5f6df696a2b83bf767b2e5e2b63bb76b2c69cc2771ad0be749c9e41801f9b3b521e20159f271ae08bc8e3ffe28e7f91dbad8f1adf15aa3f7f731daf319ea6ee3c47084541494f127b35698e0394303012b006459fc393bb65bd97f447abe07e0658ea078923e484cfd6420b197d08c9a8d69435e95b29ace900580a1e29bc5399609717ab6f12a85705a2ce099a53e480892a6dcf47a9865a9ab04064d36c322e95c5c4a9cbcb4be5ec71313371f63fbad065b7cd43bec0b1f4815c1a0748f745c09d68777abac29c02e0bf35eacc50dbd5632502cc19a844d0611ae32d5ca2810fe4846d93295c67fa5d7afc8f8eecb2a9c904f7e229da2cc41f962815c4a45b5deb3697ffa1616ac594480532f5758a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e8007fec94eb3c5305297f43f34a17512a7dc89cab863bce10ae6260a115e064d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51cfab3477f7b3c3eab66b712f7a90f2a0c89c5ec16767e7d6e87c9be44117720e9b045cee6f1e54629d213b8dbfcd9de8aba2dd7f34fe21c75d81b8576e463c6b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090206da9bdb9064f97b7ff3415bc6d7e7812e5900887a588912f41302be9d134f389ed1238f4d68f0f4aa13dd8c454172baa2a3fed6b54de097cbfdeba2588a007aa46e9e2df6445cd859c67f6d827397e7691f30b7ce749a12d698fd5403fa44b8e3b4d1301959c29a1770b3cc97ae2f21a6aa597b44e045d88c10d45661ed9a76106aea77199339b299db1342ba3b1bf8e817403f998417fa2858aff602636573a4418732fe703dde9098a8157d0bb57ed77f3dfc103987a87f9f7f852f89327cf51167031cf0eee20c69bb98e1e64746ddd8a57d7a0a0e13031cc467eb0150471252956093155cb56b2fcaebcbd970d55470fb5c0bdde60ccde978b6b4881d8f1c208a161e15b850a31fc46036a1316354cfb35c07ee3390474dccc04bd533a75713c10bcbe96c9c36a1f93b65979e8c6f8553af5ff4d86568c0f8cdb97f6d28da37fcb40f21cf4d33a08d5036e27ca62c073f722c0eaa48a572d895a01f1cf04e2f66cdada9d793e8f2eb09a59ca029282bb295f61735f7c4ad5d7405b4cd80d62534c14ffd374c84ad64ef4ef2b63d9582e930e25680feb044c225dded401f453306d74d830c65e56b52b5b1ea73d090d423f8a1604742c1c613ec3ce2e1ad14c383cfb976236457e0d6b291c3ad0447db4c25f351012977e4f507128214a2535f7b17a7d2af2b839bafe2adc7a94612302c459c704c5ab21c9d5590a92de0a178593ea88c8cf4417561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b80456191687daec4f7052b209d86d943f2ed0e607345185a76aba26d7ed1a66d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51cfab3477f7b3c3eab66b712f7a90f2a0c89c5ec16767e7d6e87c9be44117720e9b045cee6f1e54629d213b8dbfcd9de8aba2dd7f34fe21c75d81b8576e463c6b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/874b8f129a3df7a4c057a29c6d71bfa99137ed88",
    "content": "{\"tx\": \"b898faab02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd001000000322d1fc28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47201000000a12eaadc03c7936300000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac82030000\", \"prevouts\": [\"ca39240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ee564200000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"577d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93630f38818e89feee14623c9b7a0eb4bdd9acabdc6da78fd3d02418e3152c5680b35bf8914ec6f25b4d9fa0eb4d13d0c5199bab9da1f0dbae1e1446f691f7eb6d53a8385792857b3824bc259fd95f469eb32c57805e5f383de6590f06749d208e6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93628f51c82c3c6baa906179e2c4249a4fd3466ca100eba1cb5559cdc57701c951ff4a7dcfb64e618b34998ea64659fe772d1fd358b29e003b2257b85d2ca618476a66706abdbe591f97764059d8785051c12d40b9c9543fb83334d204ae23d8b59\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/874c302461e364f71a8f6570728f98611a5c96ce",
    "content": "{\"tx\": \"8e961b1c0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b601000000d2b48baabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4d010000004b4050d501d0c7520000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72bcffb39\", \"prevouts\": [\"4f560f00000000002251204bd530dd92500289ca536d9e0216beec7b39c81554ac6dd1e9e4cc3828e76161\", \"bd2f6d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"fa7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e806f1c7e5fb59ec6be7dc8dd9b5e5a9bf4b5e4bf2d4887cde3c9822cca7ddc75b6ac496a48f5e08c9a0063585476106fe61a3ff4222f4c7aaafd1f65bf01170e2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa89ffffd8cde8e3769edf5532f5f6b1952f639561cd4ccd6343a91fb81843409ef1076b289256cd19daa60d704e81db3a39e457bb71d9d0e29c4cb2075820e5e1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8753f414b84b9ccd0c62553961f88f7c0264c379",
    "content": "{\"tx\": \"a5ed58ed0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d00000000034e4feb1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0200000000551f05a603895f38000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac388b6049\", \"prevouts\": [\"0a9b11000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\", \"7181280000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936af7aa65714282a5b35066fa70de922413df84699e1278cb2a83e1b8810c1ca1420e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1c56c8a32008d6f6a63b4b8ddfaeeeddf640e9afea8e86008d2331d68e9435ec7ea2726256ae6b84713fc66a1300a8292dc92aa88ab82f645f24355049764a6c4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364230902f346ba40e65ddf0aa0663e4719e9615d7abd3dcc6db3c9c5544398849c56c8a32008d6f6a63b4b8ddfaeeeddf640e9afea8e86008d2331d68e9435ec7ea2726256ae6b84713fc66a1300a8292dc92aa88ab82f645f24355049764a6c4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8768655b2d8b6e0cca092c104735354aee0c9b0a",
    "content": "{\"tx\": \"5f8a773c01bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7e000000002bdb96d603a0746a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acbb000000\", \"prevouts\": [\"f7196d000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_82\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"121729a4e5066a4248b812517e0edf3437d4c4b2f3ba9a2e78c1807293563fee00376f779a717136521a6b2fcb1e81a50797141f82f607249310e6061e267f6082\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"51b52ebc32f95d77310b05d7ce627d95505bd3759a65ab95e85815b9805cf114474082a4c88b3240926afea3b994de5e303a6117645ccfb52feb49719de6525682\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/87d794de1dead52b89760fa5e136596c5b59bc40",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708501000000de5aa6eb04b7f80c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8713e73120\", \"prevouts\": [\"746b0f0000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"9d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a832c2593bdac0cb0b42624935007d1442180dae3fe4e49dcedfd3101f5729d872756956c694637235f847009e8e23b8c05283b4a047903b3fbdb647ae4209c1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364d9cfd389e774c529beca95e1955030c310e90019de0d0c1b56b68b6d8ca0660e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a832c2593bdac0cb0b42624935007d1442180dae3fe4e49dcedfd3101f5729d872756956c694637235f847009e8e23b8c05283b4a047903b3fbdb647ae4209c1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/87dcc971a3beea2e91a4d7e9643a5539ff94d52f",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4201000000b563db75dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc301000000f098e3a68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c467010000003d1d4d040391f7a8000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72db95c2a\", \"prevouts\": [\"4e8e4900000000001657142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"f6a2260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f1053b0000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"10e15c282e576b17bfa2876e6f1bacbf88ffd1379b4e62c959e7a0cb2c38cd7dbed5366df6618f3d43dd972519a4352c852d79b6918df80a8e243facb2b23c73\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/87e1e382d129600c7e7f842f983fa6e87de06c9c",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be0000000005fe3e49860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702500000000186ba9b004a336300000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7962a2a795b\", \"prevouts\": [\"614222000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\", \"3766100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3044022031d0a6c9b5e92fcdb84d6557f499872d27859093e7316b0e154f8d8662ee3d720220269ed46ba2a8fe869fb9360cbbe9d3ee953e3678b0d9ecb293e1c11dfb6e927381\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3045022100bf6d27232fb258e64481499016409a1b4498a7c2c1ce9f20b08b1f6921865f1c02201543c89deba4677abe4b0bbd51c1a25778f55a15f59cf288f26d393b9fd725b581\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/87f0c2e540270b3692ef13bc2b91234c893bea37",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe601000000c65799e260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ba00000000d4786d82dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8f00000000fcfa74ef02a77fbf00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87d5000000\", \"prevouts\": [\"6bf861000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\", \"d5740e0000000000225120f53d4d34de47a5fffffaf2fc2c78ea776a7cd8d2ae45e19539d143c70b3fc5d0\", \"5eaf510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e02982c20c8bd2555b9dc2466c73f0b476ea38d756de2725bec69a609b7769b1ef31942b1858214ae33105eca3f0b2cf78e8df05a3972acf71e40f309e975162b655a633384d647dfd447ac375ea9b2c02c16d8a17436cec940ed1871036c5ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4b205b49dca00d66246302f0b0e6aac7e300ad432a7c010b19b7b2f949f7f012a70b4d2addc31b8421907b0cff80194a5513593e3802bd921239c9c6063ea806bb655a633384d647dfd447ac375ea9b2c02c16d8a17436cec940ed1871036c5ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/87f8602bd7dcfb5af1052f424e7403550ff631de",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a900000000bab6199360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702000000000ac5597b703f23b1c000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48752d1432e\", \"prevouts\": [\"fa6510000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\", \"febe0e0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_cs\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1fccd586c3c0004345a49e4332aebc93c1c521d426b22d91ad94cd11d6a86f00bd4fd16d0dff163ef724c99cfdaf74446a2fe735de4f33acafb79a8ac99b3c4c\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1fccd586c3c0004345a49e4332aebc93c1c521d426b22d91ad94cd11d6a86f00bd4fd16d0dff163ef724c99cfdaf74446a2fe735de4f33acafb79a8ac99b3c4c00\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/87ffa0846cd9a6bebb41a9d3d719ba376c69285f",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42a000000003ca5b8c5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bda000000002a7cdb2b04cf6957000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487c7000000\", \"prevouts\": [\"013e340000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\", \"9b13250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090250ce2cda282f55a10517ec40d7b0a4d4723d97464a39e402aa3cc6bbbf8a97e997e1ba87a132b43999ae3c534ce6b0df46b1699b33e54048db660459703a7bb99adcdad885c8b59a1306830fb48c02fbf2893a61db78b5f23278552a67fbdcdf8821ea664a2762c9e189df8e74a493988683a5e50a63cadd5b7b75c1fc41a25c478d6fc1c34c161d1e46d1cd1ec2c1e09264759568016693edcd1e1cf828a73e46a89f0b97c422661fdff143b758e0409ff82b4e568e40849853dcf05ddd1879ac5ec5044d58041465d5e14e7912c3bfbeb12c1e07e9a4adf54f3df393489e5a0acabca79fb7cdde4e362be43d793fe33a1d8a5119d5dbfd9a5e94f20db9a3bc171bc4c2381064d96f80f5730a8686dfeeb925b6caeafd76a421023477beeafceb7dd36613ebf82b32539bde45b5d0195454f7bf5464dcbfefce8e6ebd9480ea29c5240707cc2f69394cd984814a36bef812b25114be38776b769833e659369a4532b4f62eb5df88d68ddcccfe1774f8d3c6bfa36940cd57fbff4cce90ae47b8dea5276a9473d18d5298f4e7fcb62080b8626f88b3bcbcf37205ec8bbd3fd78af577cc0bb5ef389e788a325de6410981ddd6d5d24c5f3d0b8cf1d856891400577e0d1f928153034907421efc0c9215636539d3e9b9d88ff8694f004f178565307f3950d55b827218340ed7027b8914002e233f10c6c0d7a3e84e765f08fcf3e8a1cf7ddbeafbdcee6075\", \"1d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365a72a63dad112e73676294041a75425f56752d13d00a049b2fb88a4045546b166879334807fc224780ba3e72651a115d27f4d0acc1c4b651ff2820865c4364ddea37f54c31b0dcd6e392a972a33f542af4c40de53091de86bbd5587895c52a53\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090253da6a2214a870ef763c7e5a533d492d5c841a1b9839601fddc34f4abe707a02bde2776320d884a2c69174ff797485cf14a383dccdcf34e631e1c4ebd4d5a8ec99d7ab6c3107c82a5679084adaa2a77a51384f11380d19e40b95b8faf8e79412b96cc83b2015a382382057d320d9e37daf6c74becdd3f80992d98ade6dcf77cdf6a2c88dc7a6d7546d79caef81fa8ae5d6a3c9c466ed4db9da9e3e60a24f55127936e1eb126239c57ac6db39ac35b907db081fe372d13e52b55e0a5da3b5e8a21ba37991247bdcf6ad8edc57d3ad1ac4d29ffdb5fa63c21b04ab385ca53eeec5f08d43d5d5188c75e020baae2614c4f7875bd30853bd7e765275bf1f7ce698e2ebb4c420a237d5e6ffb134204c0368d1d802c7774569bf673db172b87e2b1d34a577145d561001b4c9188a1a05c52d44688842190bedafdb3f2a6fe8302a1eaec08fdb3934c86067f984cee9af06e2c7884b6d9638986cc450e913769e96ba58b38b8b73a8f6a0628014e37be090eaf8dce3dbe260ef53397aea7a426af450efb9c8fb7504eb5f2831536f4c1ea3f2a0b5f598c726c11707b3b12f70e90767db8354aa4b5b7f000f01877ecf0ea4d9d4dc892c0e2c644910bb8bad22647ccce6606a597cce1adb0e994c806d3a39b4b8ed81b715957580b5ddf488a187411c688e7f8334a097bb94b9c882d1c19bdbdf10405880fb9a6c83972111eb38cee1329f15287ddcfe74a6d375\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa422ef55f7568e8dc283b8fa041d75ce76b297151a0e1c7ebf12f48a20b112ecb6879334807fc224780ba3e72651a115d27f4d0acc1c4b651ff2820865c4364ddea37f54c31b0dcd6e392a972a33f542af4c40de53091de86bbd5587895c52a53\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/880f03671efb6dcc3f3fdaae9491625f46f6e4ac",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c43010000003f472588bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4501000000d3e842e9032ea2ca000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac62000000\", \"prevouts\": [\"20175100000000001659142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"d2437c000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063f168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936908709641cf32dc4788f906f7e3621a0528df09509ddf1e9982e4479aa4b5d9aa78a04935edfb84e1b4b71380d58e01ed379cbb21cec8f8440ec0fbfce597ab8cd941a6bc152cbea0496b075d4b2611b435301778200e60e8b4147cd93749673\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620b045a5921ba670650c9c8b3cfa2abb5a81e5b0d26916ef9b1c65eea7b40a6ba250e002f75c6b1c142228c210e3ff9b9da21a81c3d6d31af30c750433b28b6418ea1dd842879684de6ce36adf7429742f60d84d7359dfb2eae76d7b546c72259feb3ebfb72e1f3a9e601929fc7eea4d0eaba4c5291f01c808279d3454a78ee1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8829fdc647553393e0d223a098067bdf44dd2c3e",
    "content": "{\"tx\": \"e4c3fc72038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ad00000000ef3908da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270740000000074614a9ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1001000000e3195ced032611a5000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487bd79c71f\", \"prevouts\": [\"c47c41000000000017a9148bc1125bf4e3450c593a5be1ae9a05461832d39a87\", \"ad5b0f0000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\", \"b47b560000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ea5423d4612223c88e79cfd8f9c85f9e8dd0a6b0fd4128e85a165643e2750703125a2f5df03a21df586c245c4f945b8d6d8e026475887da84faec7a502c9fe60c30d7cddc0b2b9f2b727ba5f730bcda8e3cbd0063aa204197d71f66caf9468a34e253abb4bf344256cb04c799d51217d8736aa9b25a61ed1887f949565449c78a7fa7f59eb23d4bbe4ecac95cd08dc9f495ffe7c4c9f467123fdaf119a61e78a1850132ddca18eac1fdacea443a6eff548dd0eb4b02a5276ba646cede0f5adc591d4077f9f21d4a1db3a17f9db0c644182d1e333c0d8d9a05fe477120d2825ea4cf5e62978c7bfc46ecd74b95c054b70675233c1bf173b2886044b4b3a124df01ae7b7a944a2a68b4512695dbfa2be4999fe2a74ed4596177107a3c052ff66c4e66c762f8d4ce61d65ccc5575d52a7c95b699540625d0d826f0a33b045b68758a527e3f7af95474e73e1fd01dda3e9d3df38442c6274f6719b476c63e02269794b2738655cbd769164339eec5646979d3a7a2a29b40574907277745a7b622185f634623072a81c8f5f78eb60131ac8c378297bbd03d4359f0caa1f4610da0ef67f51296995d3b7dedb2a9ecb1b6c2eb126c3697586e32f438714f31eb28ffedc4cde72f67f746a15fd3dc917a0bb7e4ac2dd44ff5611677740f7b02e8eed47d194ff6952431c162901acceb73e96f1dd276eb4c9cf5fa64475bddbec32c54a69e74bff34cd356fce2a75fb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a8e05ad6a2ccae9f66c9a515de938f93f122fdde3ef761cb4746351f00ac75fd78b7d2e6e031ffcaa796ad02cee9894dc771f62b9a69e495a6b0c07c9d130bc643d925f8e6664e67417d113cf51c5b4c3126025efa5f83bf5b16dba6746279b738273d2ad306f831e931ee90238e60477c8ec11f350a3ad34ea06c6c58bf7ea3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902972aeb42bd1e1ff14cd3b1739f4b358751f99707b5f8b9ecce5a822d0b4e535abd7333ca35ef4ddb9989551f0d04e80e9b695e4422fa929f8881ef8f580ff62e8fef05333864d96d7255347402b2fabc9920212ac9f462c3b540ec4a5a9d9729764b7f469548af62d278c189ce5507559fe56ae0e1cd63a6c4ba7dcfd7cc71ec389435b55c1675423d81dd0c0f71df28972136e137b59554c0151f4d7e42ad25097555bee399b1e0e045968a7b080a2afd8f21eec0692e670f047ca10422890664f56fc0239e8fa0973fb2ae370ab6e56fac17761cb77c46f5051df32b560a7d6f54f71e3aeeeb17101c12e0f24ca18f954e2f2d034b20287c9c92f7aa0c2616764d234d87ea314b2f050bdae434a491dc54919922beccee8516400319927a3e1824007bdebb83a94cd9629c391ee57a62644f035532b6b7553d65fdee680579045c23d317921577fb3bad4adff9e57809144a4e4b8277eae2f071c911fded8960c036dc981e50f3cab1a4b80ae3263da638e4d6f02787f53e6f56a2fc9bafb8cfad3f0f5355d3a36aa3ecff88dc864b05dd192533bf8f2287246e94453f93d5065dcac3dd9c8549032b69cbc842571a7223f4fdf51dda181b34d50789751df8226f898b40ad7488a48805318c348c65d3826027324ba0efeb1d6e4201674bc52449525ca22c328e04b680b457e98b2c2026c29acad95f1253d8db23dfac1be40de63cb7c47e0a1c6c7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93600b2d24cdc995533ca5136ddf99c649a7656cea6d4e88007bb6550a8679541173f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082eee8539df42e1fa2e5e9e7b75fbe1b52db879ec8a622b496736c99966ce19d0038273d2ad306f831e931ee90238e60477c8ec11f350a3ad34ea06c6c58bf7ea3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/882c32949367f4f504b543399fa13b4f4118344d",
    "content": "{\"tx\": \"ea9513f50360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e500000000325a22e960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127099010000008f727e8160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b0010000007ad921c20200f131000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e789000000\", \"prevouts\": [\"e680120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"519e10000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\", \"67ba1000000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"304402200dc7891706cdad6e3d6cfc5e81a64aaf77a5b6bc8810c248b5e493a1f14a3ca3022049cfd2a3de2444b9e757ff797b2d867c33a291d515584664755c91abe827f29582\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"304402200d21c2978039d65afe25838f8bb132eff50c41a2a84fbd1909d70eaaea18c8a702207d32e19eb305341fcee33ea31ec200feaadb0fd9c7a9ccb3489e83d53a350f8282\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/884b9c73958e305260b7aa5b9969660166f550c3",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbf00000000a56b6a2060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f400000000b6cc542e020ae337000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acd5656735\", \"prevouts\": [\"148b28000000000021561f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"a4aa11000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"937d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936063b325ba14742a409980c1f892f30b155825542c53b8d83ef812e2e7f36a27808ba990ecca3673e7fa8965b90b12b1af4599069410dd603db7b6040d82b00ca2e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fd6f60e166ab3c31d6fe53c0e4c47c333102fdf48f7428a1dab907384d3ec09a32\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828b73eb14a8afa044a1a6f0495df635bb2745ae30a5fce84d6222f661b17136fd6f60e166ab3c31d6fe53c0e4c47c333102fdf48f7428a1dab907384d3ec09a32\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/885db56c9eb82324c5a0f7e7aebd3d215505a5d3",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c429000000006320e29abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5800000000394a92ad03058d9d000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fceb010000\", \"prevouts\": [\"57323200000000002257202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"ab5b6d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_13\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"32f22dbdfa1b26314684b5f5c57a4ff80e039089a64fead7df159c976b0c79be8372a0a62c5b04962820e40f3df9fb32324fd5060b2e31187452da2b20ec16ed03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3b6054816d24a81873e62305a458b19bfb0a5ee92dc0a4bc4c1cad39c309b96811d3e187bcbb56b1bc02a385a1bf719315e3fc5b6e71365ae7800521c8d1c7ff13\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/88684adb319365b522f644e785033cac77380e06",
    "content": "{\"tx\": \"9a528aa802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf76010000007a3820ef8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a80000000038f526ba02ce2c980000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acd87ed42c\", \"prevouts\": [\"60e1680000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"5ef9310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"483045022100a5137299b03f814aec9199e85b3ee34923c4dc21a6cadfb3d79e2f5ddddf585002202612fd44339d2787fe9740dcfa86645776aa9eecef389fb6e08586c0ca2721a634\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022029843b5432f0a4eb7a17ac0e430819dd664c8297167f9fa3965081d0c4427a0702206d00b729d0b6c97db926b64d207ea48e58bfce6c109e5326d46d9d1efe50449c34\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/88797c1357072ec5f6d7a77f8f554fdf14935742",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c700000000f132150a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270af000000009c88c48704e0582000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374876daaae5e\", \"prevouts\": [\"e225100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"19be1100000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af86ace4b5b0adc0f633234efe0c6fe5535821d6373137115c18acb360febeb08ac53193f96df42dba610abae501128f53d0ef7692c61c7b6e476b4fc323bb5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1519e557356698397c225eb0f398cb6d4887c32e6cd21c869e74f5d17b966ea7c52fb3e6c5bb75c3cc07425e17b7ed7720dcf76cef4ab97238e93535f836078705\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/88d3c033edc04d341651610ce654caab89f0c589",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6d01000000b06dc58edceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4c010000002a7e2e9adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc90100000011c898bc0363a0a1000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a663000000\", \"prevouts\": [\"3c7c220000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"23ef240000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\", \"d7255d000000000017a91498e55eac47e04767f832d50008ff18559102c9e787\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"cb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93652247e5dd926380ab694d48c4d41b564ea6c104d6001198f68608a68dc76789170b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d865720d6d723e038e6335a667e0268d00f4826306437ee84552cc7f8172181160444ef73f74a88798a5fcf30fd7aa5fdae43144d667a238076c6d52287fea96c6e3fd1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4f551d5f9df51039c21b920ecc011c032a9913b031d76462e802a27cbd0d0ed8dd6d723e038e6335a667e0268d00f4826306437ee84552cc7f8172181160444ef73f74a88798a5fcf30fd7aa5fdae43144d667a238076c6d52287fea96c6e3fd1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/88e2041ce84c5a5fd2b056669856844691b520a5",
    "content": "{\"tx\": \"8a55f3a20260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127021000000004a3d07fb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40e01000000ff9e6bf701948e070000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7fb010000\", \"prevouts\": [\"7a301000000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\", \"1e2442000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_0\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5411ab388a5e613c9f5563c8b99b26cd7efa5ace3b7518b8bed09cf3cf08999db537d3a1ef3cc511f889c92b1c3f6f6cc31c665512cef9f588c9e6259cd6e1cb\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"502ed118eab16e576a66fc0f0979ed6e0b1f1c027f87c826\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9395491a345d7fdcffa83c296f121e38f8b550b1a5592513a788f8b85fa5122ffb49d8fbfcabdac37cacbc272bd83e871590206290bc35d9fd1d2e2037618411\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50d3147e86a8d316b180e0220e7493dd9f1ae2275b3d1d372f71e943394ef5af16779683c76935ca1f1f134899c77cf497cfe4474e83da69006b7b4b9f502d2a77281656c5c6d484ad50c7c5d04a5e762e865695dc89cf888137ecfb5b55ab8d66\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/88e2266275388545e1f8f54b8fdbe89bbac43274",
    "content": "{\"tx\": \"3ba8d6ed03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1d01000000e3bae3a4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8c0000000072f053efdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0e01000000551026e5037abdec0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963948d921\", \"prevouts\": [\"75f85e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"74c36b0000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"26ba240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063d568\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936feca977ec5b5f207aa2c7cd2bb0ad4303854687107e6989c92d62d0c0a78ef8fb5f329bd8499c4f72b132f747438a5079d3448c35be74257418716cc5d770d7ef69ea04c091b2bc3b7c7ae53ee1804d998a6447fcbbef49abb62b7a394c4c123854b8121e0ae10d162a4774d9a1b75cd5b5f6f9e51813910e8b7b5db2ca997d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bff0445c3472362aaf493b483fc3cd3d99d32d9ae5b8ca00af6d946998df7578135ed0e678ad02d8eb601751aa1b9acf14c9c27e67d62b009394546cc2bb02284b0fe5a2ac2c1f7a0cb2705bdbeb7bce3dd33edb4ddacee2f772f92b01147433\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/88ec99f421c2381e497fe2fc13b4f6dd8e8786d1",
    "content": "{\"tx\": \"4e0dd6e902dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8c01000000124e14ea60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709701000000743f899101ad8b36000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4871e000000\", \"prevouts\": [\"60bf260000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\", \"a3c812000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09027cd42eea675503086394052e96de2c7c00a2603057cbfc04739ef98af2b9fa9fe84682cd9a5e0b675c5201f22b16a5ba3b6ded254e8ec6111a1f6c09c9f49c01eaf7613f5f07fb856f1ae69d911c594f7c8373283c4ef95c08de3209da2c6803315f3bfe751a8cdd3e0d79022625e15b6c2daa3069f5a5d7e0448b403764d61847995ffc70693d96b5484f7ae2759b248c64985e8bfda3450e4278eae2551a77134fdbbba7f307606940661eacbac1a5196e45648423e83a53224b13015eb826fd699b43f0d116e5a66d0f2911de33b0c8d5d312ad7fe1ab97b62d0f5c81daeb0b4ee6efd64e3f74f56c7ad53eb40a61a75c72c304ca31d81a02905f3ae33b4db39d1388c3cab6d8e13f0907bdad8cf56d343e07b6fd780e4de27fae4957bf70c37e547940709ed8620b24a10ec565ffb0052eb39b4ab2f51c15082da35ddc69a81abc28b74f2a14f9abdd0aec758caa567e01dc64e49236f108e5fc5996fc5a547d1c1dacfcbe1e74ae122605a161274ceaa110bc9284f82355346ab02ecd3a25713ee3942defe4cfae8e728dc01aa52e2769ca39fa48b9580bbda2a45e1f6842771e608f219b600b3f7e2592082b02ac473973d4c8e1f140e2f812243425abc106a3aee3d00c1b0f49601664f47f8c2a06199835e58bec4b024a8bfe918f0affe49afac71be96026e2be9beb5f60c63cca6c532095c3e7f747e885d8129af3d52e87a2b30f46b47c75\", \"897d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e9facf4edbbf526ff5eeb12780b24daca1831089abc7bf461f974d05d276c4783ac632f1e88e109b3d5485dae08acb0148fc939094c3a94300b3efbd66c89bc20\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902005fcda15b5547a050a302ff9b4c53ad25d35dad2db6d8df3c20f8d06f2817828306b864a43e12ed07c87d1d72a5ecb874ff8e60f3644422d9c5f0c4e6e7290587eaf407954dbce6ad0267ea92dfe86f9a2cf8e0009bb462fd14e10d406c7693961eaa8b13470e8eda3dae670a7da99c340f2bf013735f7aae9876c215224e3c3470f4e828c57fc99a7919ea4694ea64c906e75a3a70546b22348f6437665e503c89fcd86d553eed601edff18d482701827d89551dfe10f897c83f052b0691b0c9ec1b17489c3f09d7cb547627f526c25592ee507d6f2db55039e751687f6aae77982954d5389d86e92f9bf23100973997f3bb5ae8ccb4c78a9b824446fa617bccac36232a924bbb87004ae32843c8f1e95419ff2deff79cd4f05903caf27e62c98436014f1beaf72278ec1adf1f815ec9f45a9cc21e01170b784000d765915035d8ce83de39da7090b67b547d74a2ff1ca7f0dba97d6f1397df5db1f33febeeb399a04cdd269ba9e88d6fd942ebe7aff993758d73bb7d70b90ad55a926469a63c4e87abee1ef7cb5566f67c64a433cf6a384881a14256467f4ec8c73edcf14ea62b1adbf3b0bbb28236b4696b72d0ee600c7ac8c81de05302a90ca105d9d86a87ac18a1bbfc92f034233704c165b46a89c8d8d458cdc9cc9afffdd525e7d67ca0fd36d6ea4e3a6e9ad1f18222fee2be2b77a5d6e8ad0c17cd947f1fab6714c70e3bba959f57a3d29775\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d5a3aa5a515fb236d07a83ce20afcf6942ac7037fee8ee73df010e8d2641866618ef0696df011c2e84d95b8f4877f40057090cebf81e873c0600d23ea60362df6c56da6b4a79dd49e001229b88fb5122d120ac43d63d1be0cdb38b208b21132e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/88f24d3d0ee361f07b6a968b39726f1326ec9166",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9d000000009313006660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701800000000454fe720038533720000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4cdccd43\", \"prevouts\": [\"d1d765000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\", \"7bc40e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100944997cb5650b2465d9129612102ac1f86dc6492d6735de55b23b03d212fbd760220336c6d8eefcb240b835fe92eb55b684c6a2675e08698e582feb664efb446ccbe034104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100a75fd2fb2e26a1d3bc517dbdc5d419a7445025f2d7d20e7c0a7a6821607008cc0220522d346f973006b7a1f91a042f4f1e16954a0f74a55a0758dc36b8a407d5b12c034104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/89063488083093835287b1f9c18b2a7944664176",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702f0100000063a3e9c760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700502000000f4bedc840447552100000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acae030000\", \"prevouts\": [\"fef7110000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\", \"2a3712000000000022512077461b0e3955cce0a8e05b12e20464a062d47e96c909cad0353185349b78401d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936adaaf8ebdf7a353de71c15a37034f51fb6be564e19f20a2692fac514c8d543cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a19616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/892cc3023c1245c75dd88475a0e49fe4d5063dd9",
    "content": "{\"tx\": \"e4ba8c7202dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c69000000005862f3e0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcd00000000a6beadbc02bf667500000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87d7010000\", \"prevouts\": [\"d38156000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"608c210000000000225120242fbb4e68c81dfdc905839a5aa96f20c82583acd27e1bde1e06ec2a83f43f26\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b11badc1b045853cc6ce807b5e540444f7b87b7ae8b48e40871fd90309c75788\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aa4616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8951f7b39335a2e501908ed76548372ea5979b19",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b68000000006d4aa6088bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44101000000ac7b6e38014a4656000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f870b000000\", \"prevouts\": [\"297523000000000017a914a1b035f555fd87548264c3580a1f62a42acf027e87\", \"8479410000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f84a27e6cfa94e00b267aae0852f2041373509fc9af9b3b7fcc66b10f710e312dcf0c734edfbcac159d7813ef9562f4df1a796390e1a91bb6f745d3b9c841d624c8fbf2363a77354fc9c61d01c3ea3e8806c47304e5a0571bc5a832b63c4c4c93c50effc4608d2c714b1f589c510b82e2cb4bd2fb333954004903b4f08f38a79\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936629ce26d76b9b6ae4f96b691e050d04905dbbc4177f4fe4be81239365d442ac099aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d85ffea93b39ff48f026a1de615f9bd5d9d5cb27805fa051e581b49afd71e8d341e79d00d576d46a63d36f208105835dedf99b7ad1f6575dd8e28af32480c198\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/895da8e67657010ab55eddf2b5e50156498f59c1",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c57000000006bfe37f5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd9000000002b9ed0c5018f7108000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478720040000\", \"prevouts\": [\"571d530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a4e51e0000000000215c1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_71\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fd1dbe90240c181a478fc7e390e34eb91e0305fb144e4de97169b0a2a9c10b074eaaa3b779ee1ba002fa9263c4072160a9eabe0c7495d97138c300e9d57f5de2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7f579a24f80702c5a5046aa8d1686b53ce1e7a7fa83d61b36a5039dc63ab48d732d3d7baab6d385eab40bed5e14b1849caecfef505c2a8d246a5ba889a776d4671\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/89843a3d7b0d8895dac3541e10e30e0400dc0f5e",
    "content": "{\"tx\": \"d07c79b8038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41f0100000018502eebdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9a000000002d3f28d1dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c170100000063ffc498030747e700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47874de2e530\", \"prevouts\": [\"a595390000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\", \"51a15800000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\", \"dec15700000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004599aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb406f18ba19de64c771db55f5af06ee3412ffaea1fa921290752d742eff6a1e67f7007ac6d9f1365651a4d55e6df0dcb109d268cc6c386b355a4997173bc95c886\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e197185a6c30608fff89dfccb39a96a02e4addd353a2af1bc7b33caa3a3ac07fec6e41ed285c226ab336f92f35d989a379104ed593ec3ff802714cc8e85daf0b3be26db4ec4cf8c6a12d3bfb33a6f8c1ee971c26c5be04413f1d9dccd7296a9839\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/899da8e446fd56d043e8d9fbd5821c09500c8654",
    "content": "{\"tx\": \"e1a1f69c02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0100000000f91c71a18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e201000000d7f6cca303f3e29600000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac8b000000\", \"prevouts\": [\"b9075d0000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"61e43c0000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"717d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e8a1eca6f0ee4838d072753f510379a45001b572be63db33e52094017d71a11fe4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8674d0c931fae68ff43996ef27e2c8ff69e275e322181f769b95dd7ebb695302b667dde4f09f14471eadd81946489c41cf4fd01382a4947d773f1f2d4d0db4c57\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d3905b5eb580817a508bd2452bf8931c371ea644e13d674abeda6dc13dde8f16674d0c931fae68ff43996ef27e2c8ff69e275e322181f769b95dd7ebb695302b667dde4f09f14471eadd81946489c41cf4fd01382a4947d773f1f2d4d0db4c57\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/89c130024a3230c8800c10efba7110244146ea67",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e40100000087e476028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47200000000408ded1d02f5c75f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987a7000000\", \"prevouts\": [\"6082310000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"792e310000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c24c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361d17d6661cc8fb2f1af7119061da5758e988d072e66a98fe62e54b70963bbb8620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e119ca94dd80cd6ec848cff445ef1653ae8d91bf4217e3b4bb0faac1831ae9489bd0ff373d5c06b418f4c5ba421f2e23a69b22cb6c2b7cf326686bcbc29e387cfa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52c2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936737a6221c4287b1aeadc2bab6c338b93b1853c569e1bc8424c8e0cbc8249bbac20e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e119ca94dd80cd6ec848cff445ef1653ae8d91bf4217e3b4bb0faac1831ae9489bd0ff373d5c06b418f4c5ba421f2e23a69b22cb6c2b7cf326686bcbc29e387cfa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/89d3b93983fbc2ea121d1407d7944b74f44c67ae",
    "content": "{\"tx\": \"0200000001f85ef04c4139d614d10d1a30e75a9f6421df67317126da87b2f877c2ab20246300000000002f8f319604f3a7861511000000160014f2ca549f2f8613e81a7cb48fd110f37b7fb1529a580200000000000017a91402e53bc18808b3955166f5113b83b265fa421e9987580200000000000017a9143fd5279308772d81081a68d882f81a7ac08fe1d9875802000000000000160014bf1a19526352877c6b170dd8786dc91b1610ae1ceb8f3f5a\", \"prevouts\": [\"dd6589151100000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/keypath_invalidsig\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"2acb152055acd589ab559fab80591212866cc02b4a6967cab7e92676567cdf906fe0cb89855e0f7bf24b1b402af7b12ec05358eef773b32c861a8e53280322b4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/89db7a1ad6220b1635de9734c32a76ab69bb70e3",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706d000000001f9bde91bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf790100000000c42cfc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48601000000dc5b1c9a012caa0c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc786000000\", \"prevouts\": [\"2d69100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0c5769000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\", \"3b5e3e00000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_f6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"007bd681c6dc9c8c21217ef9bcc62c4dd2b145578198511d6acc59e8f60f176abf98b3e7c63ec1be58765e29b81e930315db501bc126e047c76f6a2bb5e238d782\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bfa88c48012f165fc070b203cd48090df0fd5b243e12775ba2fa7dad623f6caad2c3d363440efa1f991c79523dc99436bf88b1b88f6f70f536dac72e5278ad65f6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/89df1562d15e81161f4c47827c0802d44a116dcd",
    "content": "{\"tx\": \"db2f843102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1c0200000066a63388dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1f01000000bf6ffcb001a26d3d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e71019ae4b\", \"prevouts\": [\"a799760000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"62b4510000000000225120db9ddec7a132eff6af262a32a64079b83118332a0594bc0106395f5efc921419\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"ab7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936868a8b5d4fa4ebb812e9187140be33b96106da21b05039089cc432e85b6849d0588819b06684552554786b2b49e7cd3d9dcfc0725dc4b3b93f8768a6a84fb31b7c07bb1aa10d02d314eb70c923196d0e49e71087637e2d5a1d7fe44c2440c398\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93686c31dcf8859245bfdb2cad1cc94d16ee0f95fa651e4b9f3d702e098ccaa2b3aa05ea26d8201abb1a5c146c7fb3e541bebd813f78d5cb214a01f0b6fbe6f45888cb303569f28fbe8acbcc2d27d183e3a68170f5392df28f40a03efea695d856e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/89e008ea516ef46108ee4b85055e4cba034e75c2",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45b010000002378e255bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2701000000bcdd8d74044f8ea9000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478740000000\", \"prevouts\": [\"780d3e000000000017a91481d4142ddc5ce7a3de4047bd48b623419b5bc45e87\", \"ab0c6d0000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"21591f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"5b1ac49476ce8752c6dc77f30c28a07a3c6555a0b869ccadbc97ddecfc5a9a87f24eb13ce140b2c2dadfb72d43206eb9e2965523aa3f02d2e478c54bb4a4e034\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/89fa19afc7b932f3749a095009d1bf1c6162c607",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ec000000003f55e4d0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4d01000000793d45fa02b27535000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7a15b323f\", \"prevouts\": [\"522912000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\", \"43a8250000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ec4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fd4d99442df2d897dc88267982d8eb20b7dde930eaaf897e66f6a5ce7f7a19008bc5bddb1ae8a97e111feaf10767a648ae88621f6e3dc27f3d4b61f2a6f156b2a9cfc1055a4268af502090450271f6d102883ab16be8e011ae292d6da52fbee7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52ec\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1ea5b08b003f1d8a082790805ee2a5a4def5fb527637606ac665fe1637cb888218bc5bddb1ae8a97e111feaf10767a648ae88621f6e3dc27f3d4b61f2a6f156b2a9cfc1055a4268af502090450271f6d102883ab16be8e011ae292d6da52fbee7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8a0a41ec1bffbaf105b7b5b3784d680d00446960",
    "content": "{\"tx\": \"ddd1479b0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702c010000000c199496bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfca01000000ce7dd895015e5252000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a67e020000\", \"prevouts\": [\"67df110000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"ce3d7e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a85\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e9e4bee3c96900e797e1fee678d6e06beb60b8d47d410b933df49cb9a9e4051dd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51f1361648aec2fada6693d9b39e398a39a20a7ec02f5f37d94bd6d3a28893e48e1b6e729898dfeeff93e2067a7d076aa1bb7914d367b163cafe54fabf88cb14d8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a3c2beca4b8e4f57261ec8681e6b4464b1dc20a4d14bb0589bf8084eb401fef1f1361648aec2fada6693d9b39e398a39a20a7ec02f5f37d94bd6d3a28893e48e1b6e729898dfeeff93e2067a7d076aa1bb7914d367b163cafe54fabf88cb14d8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8a0ad7fc3cf79a721233622b6ae7a4bfc52c228a",
    "content": "{\"tx\": \"a8b92e5502bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7c01000000345ea6848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40901000000fc4b1ed502e2dfa00000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac69b80e4e\", \"prevouts\": [\"8402640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7c773f000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_16\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b1f4e3b8205028770f75a86f26f17fd5c0022451cc288b1d20de7e9503f6e4bb05a65c31706029f2ca81866adeae840d8cd1c063688f8b224e01c0c88ec2f19e02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"39952cb504494eade9631824e8b0187360a59b693b51a347283bb6d608b5e70a5e274c3ebb63fe4d777fa4f9437ed11bc98facf35ade273ee5c06bd763aad17d16\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8a2775fc1b4fdf627698087dbc89fc1a3b0943be",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270130100000004782a72dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1e010000004a150c568bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48d01000000dfbafbcc0153c12000000000001600149d38710eb90e420b159c7a9263994c88e6810bc776010000\", \"prevouts\": [\"053e120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1850210000000000225120bf7c0652824d65f4682a3056a4ee7d3427d5bd09fcf8c412b9591353033138ae\", \"3e9d3b00000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361eff29e1a89e650076b8d3c56302881d09c9df215774ed99993aaed14acd6615\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a0c616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8a289fe11f09a8013015d4bdd383c4d26de1f483",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb700000000d737d52860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d300000000aa1153480339fd2f00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796741c1828\", \"prevouts\": [\"d3ed200000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"6e931100000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ed4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93655e252cfaa9768c1119fa64085e95b8d16b96942ccc526bc25f5651427cfe139d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51c9b0690fa0521f4fddf88c65f69e0716898ebb5a52dcb1ee37dd2f34a8a99dbd71d4983925d18ba40c8655020b616e094614baaa1bc1b56f6416d7610eedc4a1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52ed\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360411da0ef60a663b804e7225eddf07cb547b0be4fa0e1866d29c65c2bfc285257eb7d8a059ff700a84b94cf01bc4b173d99041796f2088e1a59df5cc5c18f54d86475c33b310e45b92339559838140b9b3f3d62b1cf111e129ddf9f566de62eb71d4983925d18ba40c8655020b616e094614baaa1bc1b56f6416d7610eedc4a1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8a29d68c4034560207bd08a36c47e26953bebe3f",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127093010000002d19d9aadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba200000000c727f6d70274d23500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748705010000\", \"prevouts\": [\"f447110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"3830270000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_c5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d207c56374a7ed88115838212127ae62b4f5c0a8c9245d3276c8ab5214e160e3d4fdfb9a2cc7bc3678ad4f4ce96159f1b3a803cb40a3f1c6b4fccb83494e689f01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5252a210e47bf9a706de505f720b8f4e49ac89359706d0765d1d47817c280013ae4825c81edf38b21dea276996e2af22826dc4d32f1a57723e699742a38dff74c5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8a3477e0575b2a93269f750c0395201cd0f19a37",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270230000000056475b9ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca0010000002f35f8e0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8900000000ccb14bf503f56ee6000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898746a49225\", \"prevouts\": [\"6ab20e0000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"e73c5e000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"aea27b00000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00638968\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b5f4aac5bedb8d92acb3d38ea9721137c03ef46c31c1e33f2b8a1b5032692e959886f85ebb300297009aa959255e1f8e976b091c7e06b33477ed400c40a83b4ccb3e0a345cce78c1fe891e9b22b966ce84a8b12623d949f63d5e15e148dd67959d8f9ebf09b0c450213ac35faa1ca38fcf1ad0a46ee35414da06dc92335be8b4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936166b0e2d82fdc11b86a491b111c45071722397947c900f7dc0756a6987fcf7514b1cf341ebb9351320fe3e143ffa2dad1c15696d7ac983fbe7e302fe7a073e7ecf46474fab8e7e9306b35224640e271c3ad2c01a28b74e8035b5ea3da4b2d4b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8a3c9306c70ceb610d6f1f738df6679eabff4238",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48f01000000072c8a9abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4e0100000043944632025c9eb500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac1c4cd623\", \"prevouts\": [\"881937000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"7fda8000000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"ca\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f336cbd2c434dcde2d093b968cd4500063515049b2ab4f542ce372ccec22f446d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51c1012b923c15ff4ca5711684c82f77f7d0ace9e417918255ff860668826001128a698426442c951e7251e4e87784c9556d503d37bf6168d5559e89d6402ee5a2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d520ce1e8f5df7741068fe8539649c9e500f335a96aa69621db8e7a39b2f9d4cf99c996d59a69d75c183cc1e3ba6b17987582b2274e87a7d50251745c93805cc8eba4e75ed92f6e82baf0cd6101dcd67879c020ab703e3dac001fd69a24240ecc7034c4ece6ceffdf067bd97d8bd2a80e986f14e8b5dca33ff1523eba7a77d63\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8a52da0771f3d868955501e901d2540538f4d521",
    "content": "{\"tx\": \"b824250602dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7a01000000fd949edddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1401000000948f09de04c9c07800000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487fc000000\", \"prevouts\": [\"ef115600000000002251209f6df9bf0ba86119ec56bc774d8ddd924452496c0c827ee2df6dd8b5f3d2e1ef\", \"e303250000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93635d60f8ae57e87c9caa24a9d39cb53ca5fb1c070fbd40625acedd7253a41b651\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a6e616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8a7bd56f4854fd39ca2b9dac03cf4e4f92a1b93d",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd10000000089808f898bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f9010000006c9d49b102408d97000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac25e01256\", \"prevouts\": [\"56c25f00000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\", \"91d339000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"3f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369aba35d3104e600974e554b9cb99049f7aee0f23ae7c74d9fbe3a88b265c838bd728e192bc5f69ac80b4a6e0537a86a2095372e08a2c76143a8a8a3d0ed1b85bc06da1f6599d7e514a71ffa8a2afff73792fcf1df1b953d2196d009aa835a52703985aa46dcbff8b0495de750bd1afe74a661312f7eddf1146199ee1ea8c08aa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3d62cda1d889ee05ca59ece4e76d2fa27c0bab47b49d4f70b1e2cb0efe9a711fea811edfde1d836b623c2094badb4ab8bc7795b2b49da5506600222f32ea3fbd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8a8928f98f7dd800744cfcdbefeff96b97543b76",
    "content": "{\"tx\": \"766d60d703bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1201000000da307bb5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0000000000def8accadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba10000000099eb13d001d42a740000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72a040000\", \"prevouts\": [\"f9057b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6272570000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b92221000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"937d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2350f02f615a91dbdd9bf0827d9652a9c0f0c48b61032bfc7abdf258f76a30109625eb62ff27a7a3a1f9ea411032fb959ab5a0c50697db7fef72f456b5013f4a62d371a9b01f30ea116c30e8195d2d6eb7c97c8692c0c95de95a904f83b96ad4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366533bb586569e93ca4a2e8b34ab37dbed5250778907945cd2689174a39ff06ce2350f02f615a91dbdd9bf0827d9652a9c0f0c48b61032bfc7abdf258f76a30109625eb62ff27a7a3a1f9ea411032fb959ab5a0c50697db7fef72f456b5013f4a62d371a9b01f30ea116c30e8195d2d6eb7c97c8692c0c95de95a904f83b96ad4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8a95cc474b746e69625f0fe8c262c07a37a82a7d",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270940100000005a0461d010a6804000000000017a914719f78084af863e000acd618ba76df979722368987c7000000\", \"prevouts\": [\"7c9b110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_6c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f9d6d1cb31f9e227829546490c6cd0c0b52bc1c3a5838984c3e685bcda8254e0f1afa415aeb8736a44ca1bb04b5a05dd1f17b5696cccc66625fc9a531735ad6c01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8aed9816ace7e2ee68b6ff38879d2366a47516ac9fcaf3c1846446fce6bd6f293a839996456ef86d3b826f3e0e6e26ff78a5a600f80b28b3ec3703b4d131cf076c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8ab6f611cd721ca128cb8f5ea3078c1b431d5704",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b100100000018a6bf8ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc8010000001c25910902ab3e8900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875502f91e\", \"prevouts\": [\"12271f0000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\", \"ba146c0000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063e368\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d514e3e51653db7a26891b04c3a1156361c2ac14b53ddf2b0df0fb784e58b5ceef674166a9b0f1c55c1671126e5eb7d3b70cf827ee1dc762db7ef6404d6cf84ba0da54f7803bb2e93759f587214c70a485617458826e57c89c2ab5c5e7ce47181a1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366180c1fbed8b69bb15135837f8534a2d361ae32955d37b8de7eb439883150e361741062de046b8f3bdf7ef41b5db27631c489deab6fd85436806296af4173e7e74166a9b0f1c55c1671126e5eb7d3b70cf827ee1dc762db7ef6404d6cf84ba0da54f7803bb2e93759f587214c70a485617458826e57c89c2ab5c5e7ce47181a1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8abdd04f7c724f0a762d03fb6fb80e698280ae9c",
    "content": "{\"tx\": \"af7531b002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b15010000003f6948df60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700702000000b229d6fb012748260000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc4f020000\", \"prevouts\": [\"bee5240000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\", \"25fa0f00000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"227d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c13c6885c53a07614131d749dc0b9c4fac4cbf357599a76450ee1c7b87f78943dc4c18ce03381be5d83370dbaee0482c0440aa7aa94902a00244e0237bd29478fcb15428af69077ee4e47ddc8bd2adcf7d97a29fc56c75a24a213a103a1e3586\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e86a45def9951625cf02c88598f8616d12bef3cc01ed824d79a70edf31b7fbe0e1a4a9bce64ad1fc5af22ad5621933415c83e23766bbab20239912b691ace9dee2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b08333db48411d829619458a66585a39efcbb11",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b14000000005d6cd1b660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bd01000000cedba4cd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700102000000d9229fe1044be13e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796c7040000\", \"prevouts\": [\"a80a1f00000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"1e3d120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"67ba0f0000000000225120fa0c69fd3dab50066606d386e9137466ea422a077bab3cf3dc61d0cdd59f488d\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c6607ccaad4a40cbb35d90662461c37fc46c0a06aef072d0f22e66c7426113f5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a69616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b2cadafb5c90652623fe20f1da4fa65454b1764",
    "content": "{\"tx\": \"7f672b810260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704600000000d96525f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce000000000157fcba20390206e0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a66a020000\", \"prevouts\": [\"5d7811000000000017a914b0716f1bec91d4758ee97d9063c9da884dd2ba5287\", \"32655f0000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063c768\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b0406f8ad106053ce18d601a69e7ac0d788ca81f875fce58e79951c9b079357c4ecdbff3eecb3f5fa90fd3ed1bb4a8c0c36fc15f71a4102bd4f372c5f95e5c7d5941b26b476c022edf868776977d31e53e85212ba204fe552062798c457a392dc1a6e987e7baaf45cc4656191a1a193c7abe05aba02d24b24cf2747f96e1d33b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51c27b7e516a1b3919c0c2aae21712d1c7c40c32040b64b5fd9dbe249132a2d861ab0398bc4828dee75def1007ce877d708ab4ca86c9734bfab291d4bd05bae3eec1a6e987e7baaf45cc4656191a1a193c7abe05aba02d24b24cf2747f96e1d33b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b379a5db43a90e8d77da62355f3ac86f95b1422",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cde000000009f5d27808bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d201000000283e3bd98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42700000000da52b0940417c3c800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e52a3644\", \"prevouts\": [\"6fb15200000000001653142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"55f23f000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\", \"a8d8370000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"c9\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936643cf28b3f57e3e135ddaf8a1f03437647ba3161555e3c3b2dda50db56032ea077878475803065420b5149b394b9f2a263406aa3a3cf62bdb9b13e67809a83ebcc9238bf2d7dc0bcf11838c34785251ea2fa5f3bb034bc98e2e8efb0909b7dbc17d2416a1ef9313076e185902c26d9ae3ba1c967c4fe3d78707cdcee712bc7b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d3c147557fd4654830368843709159d459528293d28ab2736e9587eb54fea08bf48725aff660a72fd31f8e9799fbe605d57d774c031cecd8b6989780acb581b6b24737b64a51a2c518aa096a7a1ea5ca18eed83cdd20aa73c19d83535c466892\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b436810adfe76e9f0a84f1a2382284cefc4128a",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ee010000002a96f3a28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f4010000000cf823d504af574a00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fced92f55c\", \"prevouts\": [\"dae111000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"57623a0000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c74c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d86572024cf807c4b041deab506320299ff116921971164ef72b2742896e58a89a98f91cdb1729650f5e7315a74782ce14a5f1169946bc7ff3758bb098f0ad0a25b2b7f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52c7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d5c50aa1912c177c20f79fe229e02015d7cb9a41b9e5cf4d8e88b9fad70bb67a0d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3ab0398bc4828dee75def1007ce877d708ab4ca86c9734bfab291d4bd05bae3eec1a6e987e7baaf45cc4656191a1a193c7abe05aba02d24b24cf2747f96e1d33b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b4a8862bbb6306cc7b4473bba476bcaf6383aee",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cad010000006f1f83aa60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702302000000807b5d64015f1d3700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1d010000\", \"prevouts\": [\"3a024d0000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"f1401400000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a47841bfd1c7801e119366e06eef8526d3a7e36eb6419e26d5e658afa9c8cca5b88f998be5301314da3588cf7094ff0b779091d289dc1f0b3826508d93d51b78c2782374d67da9500785d400f7ef10ae84f146bbb568355094c68456b68f7a283b30ae9fa149c8f8e298eb730b57bfc5eb02dfdad9864c9ec3129b8b9775e615\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cb0a7dd9fe9480c6c770de395b90f3ae6bfd835bf7cfa16a827fc723deabf662a469bfc8de16b0968070038325e6b76e7740524a1c4ae3d3f158ce1e63cb3bfd7c6ac6071aeb5642f86cbd8c403a36f49b1ae971c310fa0b2c6d23cdcc52f9ae3b30ae9fa149c8f8e298eb730b57bfc5eb02dfdad9864c9ec3129b8b9775e615\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b5c3d67f71726b53372b58a37b41fce4a30a5ac",
    "content": "{\"tx\": \"9f516898028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4370000000009665a87bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe60000000014113c8e04b9d8c0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac96dffc49\", \"prevouts\": [\"6081400000000000225120b10c5cbe32c5e90da6e76e6bf182a80e9130a66e1280db2d9eaabffb93bce832\", \"aeb98200000000002251205b7dc500a06d9d49351272d9ef7a52148a11476ab62e1647e512b05f260e1644\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367e3e831b563b2b880bbf500bbc169294f1ed56123dafb9d201684792ec0730d8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a4d616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b5c7dbd04ac3065bf6c8164f3068ebc910ddc30",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0601000000cd66d1bebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf64000000002ad67cc0048a99e0000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac56000000\", \"prevouts\": [\"9ca76c0000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"71787600000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"e67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936436f2c3332eeafdc86102af3c688be283ada2e1fa472215067cffd97efb6f869e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e824d900ba5429999a9d5e0d5b2b257ef1523eacccb529e56e7cf347f802d02f5093d03784866e2fdd94d7d1b7c12b1f0da96746c05c19b8696f0ac6a701ba8135\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93674a87b9bffe1a64ed32d6b76ba55fcf88384cfec2ec89e9610ad09f9a858aa1324d900ba5429999a9d5e0d5b2b257ef1523eacccb529e56e7cf347f802d02f5093d03784866e2fdd94d7d1b7c12b1f0da96746c05c19b8696f0ac6a701ba8135\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b714927de7515d6467407861bea2d1b6816f769",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e400000000e43d3005dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdb01000000dc21dcf7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1000000000413109ca01c445280000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fca4000000\", \"prevouts\": [\"00ca0e000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"3c28250000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"bb275b00000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/oldpk/checksigadd\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"15912b8bc6304a33b8ed9d265d403d3802e220f88982dfdb6140a347643b52711d78e260943da36f6ebe274489b03d50f52b72255a7e4d010c67d28a86c13b16\", \"2102871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362c90e4fb2a2921352a86dc7c131784720f0df4e82c7414e3d711f961d82204f725d2d811f1fcdf038ed551a0402edfb56d2882c43855b6a90156ad93536f2a610b12816ededf24e7a65ef26600ff9c8d6dd6be11892b31bc567d31a4224fa918dc78db5a53c26d137b3cdb2b3520f4dc1e22712cbed9218761dec041353758fad69ad387871b891a9868cd30ea616cc787b69a97197bdc922cdd155c8ad8c453965701560206cf1b3adefb9fc7df786920fd1994eeff2c65a7509446ea0945156e83c1ddee4936f7055b581c15b022cb9fc52c765ee248979ac64249602a239e3d351e4d299371dcd96f5d6f96d46c92a1b411ab803a45e7e6d51443156c8f100202def45ffd88d49fddde6662fe7624f6dff183f786d6ce43460a7a16256f5521d7fab248574dc85f779b345c50aa2a58555066e952f31a388332632e2803ad2025e8fb1db960e910596f419fefc77f259577ed82c1cd7ab83eba63e03c4a2615c22c4ce3b706c1d8a9a9d3ff978e7621b37a6868e1d99e3364a361d6bae06a319789fad1a51c3692427fb2b20d7269f1c10af57e5ea3e2c20e0e79126c0422063108b9f07592932b9e5078ce575b814c49190e939925197578c8b829acd51d8b0e659112c9f7f4ef135ef7e3677927c686e2cfb83a5642dd1287d117c18623babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c917a99b78f4b28b8b2a524e089c2965c939a52d493680da9d7c6ebe049034bfdf12f4070cd3ac3ecbd4ffc690272386f2ce294d6a953327d2eac43ecbb606c1\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d2db232a58a684473efffe5f8be15c17374986169cf18c1adb110b544d48679b6f3543d66dd2934a4b4b5b83f3181725b5ccb68f1096ac62351c7c97bd1fb9501b8110e709da1864e3fbcb3b5249515c34bb807e7a52bfe6718950e769cad388c56ff404b78dc0a0b90d50115d89846b94a2b0a1f0895318a364e3dc179dd61f9b1e0d638a311a5be1486a7a4c42f89ed43ffd1d5b18820f631006aab35c0b2a02b593180c53027b35b862cc29f04a25efce114c7682377a83dbcf64f6fe42598064c72ae707f2b03b7d69f3c0306a0bb5edc9aa2d90aecbb96bd412d5b1ee8f00d68262204427d46410b755bc31a6012df0b06b921e6cd021b936d3d4c99eead90212921e1142bda8cb81c5ff3145b34391c40797432570ad9a88a0958a1b955fe09784706370c5f6fd13c48513ab6cc16af1e04504ea44462b93ae24aca3b2228a833ef2c51accd6ee09327b5cb9ad2975d597ee135bfef0964473e20f824ec199d2a72d3d5f5ff6ee974913584144656ddfc893ea617971c4925fe8b7e1c4f556906203221bddfee6deb7780e80a3769637a05bcf2efe708f1aaa4a6ffdc17363486d1e033637af9f6d28292a4f4527a2090bfcb5efca2ed9c0d63c01e16c98b35f150399876b232678a58bf83578dbb2c055ad176d56177c4ac303846e798f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b7781da37cae546b0800cc96db74dfb1988fa5d",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c485000000008b339dabdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0600000000e4e34c2901612901000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48716040000\", \"prevouts\": [\"f0d93500000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\", \"dd75230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6adc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367137195a510293ea231b2d4432bd69f7d82c958dc1ea3c0850c3e080e60319b4a39f866618102a4b08e1c83cadbbeb41bf3ed62f238c8432fccdf019ac45545bfaeb7b84c883e27227adf79edca80c57b026715ff0da0f52c5e2d2aa306e3b89\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c4113e49c86f839239ec362989ec8b927e111aaa7a55b69f94a02373a905535683faa9f1fb55f2c754174031ab88b9fb2c4d1471ac070ceb12091a666ed99e827470af5f469e43c444817efa23ad8740a4ec3822d36804e7973b39d521bdef59faeb7b84c883e27227adf79edca80c57b026715ff0da0f52c5e2d2aa306e3b89\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b8235aeb63d5111ff81b6406893e2c114f3d163",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41a0100000058adf9d98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bc01000000feafeba002c3807700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac0756be2a\", \"prevouts\": [\"75b6380000000000225120d632d9c3807cee2f3b07918ef684335c8e7823a1a0eb476eaf46267e076b018f\", \"472441000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"147d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082ad1099cc9bb3a5e2066786e30d0fff4359b3ce527e140b44a0b5c89c6b4383919a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100efb63111b06c7a0ce3f44d9f6906db8fc60057b72694cfd58ed25db88d188e5fc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e5061717769e1dacf027f152dbc7d505d6964cf4bcf3126b59284ff35a733198fdc2d7aa80560d1a81b9ed628b4b72c1af718550327182f7e69256034992ba893488b030fbb16fa8d50c4f1f044e6df81cbeac111f0be15e3f466e559374b3e5568dbaf979cca58396dcf271ee6fc736edd00965a3b0ecce9c87347ff88ab08a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b926866858180ba6c9e1a87ace930fdf129b59b",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704001000000baee91adbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4c0100000055b2f3940307357600000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6a048da2e\", \"prevouts\": [\"6aed0e00000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\", \"77d6680000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902488b34b36e34d820caceca2b79bd093fa8a7714f7500d5ee32536265b602f40f0be44bf66930e1724203b4edda0782d8468bd533d05c7fdc0daacf035698098cc81547ee2e067b75c4c4ec2758a52c52a5616c5ccfe85bea79a0642313ef787480076ceb3e7bcbd56fa57fc5527fe643943cc62483d8d33d856b11ac8f7468d5e121309217a7cfe0378fb6b8588cc6c238711b6e0f0a743e13ab9659bc5650e69d326cfe0177f77579b9f648a9526ac0adf1ac4aa175e56143c74b73c641e861e14c6385e683c554f05a2a8de1a56c36192818205f7371740c35c4d082d58f3d4565ddd1aa3fd5dcd4540515e951a78585fefa6471481652a715f77b3ab0a57bf75f8022f89794bdd054d1a466bc6a1a93fcab956d4448c487c812b5e8d42ba697c6b8415f59660b3bdbf4716fb44ba65c1f53db9afc770c05fd32fc7d34ec95572b1f0e114817859dcd2a97796b00be013d06337ef342c8d75d8bef8abb166e853fc1f2c339b577da907bd404a0a10f72f801a31ab9da083e8e7ae2705cf97e1e36a1033e49a98994c2ddcf8042c5683c49f146edbf289ab81ac74575a5001cdefb0593c4bdc0bcd16ca5368eac04a8548e49d2a1e6671888a0a6a07c5df09d0d17b5469a08e62c6f44a11792da4516be317009b893ade47e399153235b94d95d9d42ed709c43b27b97ef04905eda2c02c10cfb4dd66beb3f700568ad248c83c7fa2a08ce5466524175\", \"fd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a82c424d3aba119543b343a8fde7bc4fd3ae7e2d0954a13e45d13e7747deceac3deb15f38c362b741ec1998ad5d47cefa85b35179e49129213f0ee69ef729f0eebdb1eebdcbd8002197b9f44a9e59d0e9024523da319a2f3d109fa4e426d654ff4148296d57de26c46202ca6ca2132af69ac5e2240f6410455c1127b810a8937\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090228c008f2f00b965938e70e66b1c2240283ad8d6fb0fbeafa20098375453b83ff87ed6acd50f3e1e5a93c8c2a20cf6355c1381095c3ff0ca468c914221061dfd3aaac28b18ffa44a6f2db2ac97138c0ea44a60daa0bcb69dcaa228ab94e4cd0c2f45ffed095bb83bf9886cbcd6c27b4d1c20f9083d7d731d9ac7b97b45d67c01b766be68a1b1334d68e74567fde836f7ee413ac884b93ffe1f7e629398d1813caab28579a1c04b45862bf9b2a23fee4f9abe2d9f6e00956ef030a60804c1484d0bd8cbee736dd421db2391fbbd685723fea2e34f1c69e2e9d830f814c62f1d505d3f966eb386ff35af103cedb0d660bc3f4017c6f8748e15efbb33d653c9eb585409748513f60564f55300dce491c2b6d9b2c77336293933a5dce6c1a14afe99de694d46f7fd8e56d7932a33a89b94ddde89aa868963732f739f372e6bdb56fc829ada990fd7a7606e7ba28d4e129fc100ce739ac54182324f5171060259e1de802ae6bf9ec2e54c92f0f12c04f144e1bcc02fe11b8c2fc879f3eda9c2a24a8e23f63f47489914d0ce6151fe926f8e059dde43dab62207f7cf0b8814f9d0f9259e5d05b8b34e3b60404db5160e91aa7a688803898f9d88471156c482a70a2bb8cd36c8cef4fa6382f1184c02f4d336dd768a0d9803057d0a887ff311fca5ff095b2d8e5873f46ac71a49da7eb3cc1fdad662d3f7f58547be544cb315d7145ae352874c038fdaeed224575\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936df064c117c137d5c206bbed5b1bea19788f933559dc29ad302e98441d59c8ac23deb15f38c362b741ec1998ad5d47cefa85b35179e49129213f0ee69ef729f0eebdb1eebdcbd8002197b9f44a9e59d0e9024523da319a2f3d109fa4e426d654ff4148296d57de26c46202ca6ca2132af69ac5e2240f6410455c1127b810a8937\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8b9de640b20beae0f41a3d88dacf8e7c8c00e4a9",
    "content": "{\"tx\": \"d666eeb702dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b37010000005ba523eadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2500000000a14399b10167ff3400000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac93222b49\", \"prevouts\": [\"60c422000000000022512036c493d82a149ae4f58587b8995f80246acaf3fa754ebc9da78117b68027b383\", \"5e4f2200000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"dc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366c8229ef6249eef7d294f23c9bd7511150aaa9bb9283ed908def3a40c2c66d128080c17c1a9ba5ea8a3780f9d0897aa41ac6e03bb9fc27a0b4027847c33ef9f08f84e1cc8430872045fc695723e7e8ea88aa60745b893850b41017408051d8396d96bf27adab25b1c800ec6de9073e8fa8f2a3b567072b632cff39ce61bb3673\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936afd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173a38e917535475cf2110d0b0ae2ac5bf0f6bfd0fb66e9319f96694509bbaa8cb206d96bf27adab25b1c800ec6de9073e8fa8f2a3b567072b632cff39ce61bb3673\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8babec8da5a26469095793b097811d07f256a5e9",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42c0000000025baee978bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42d00000000755c9fcc03cfd46800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac95000000\", \"prevouts\": [\"4b5534000000000022512014c9f4af3daae468ca53c2c267c1d6c7824da89a84a3ef6d580562d3f844fc64\", \"4ff0360000000000225120b7b7f868117fc9823373a98908173a9736217ba3f26290a84f96d4cb32d63ac4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e36d5ca6990a7cd162e850c8419d259e8861c79e5a640a9cd7cd8c694717bae0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a13616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8c4cbb21d02e5d466fb2539022255760626149f2",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9d0100000067e4a0f360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701d0000000088944686bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9001000000dc741ab4037f16ee00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb3af1b32\", \"prevouts\": [\"de725e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c5840f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ebe5810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_18\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b78d1fc6cb415d6599bdfbc6d3a791fdf9dccc47efb4a71a0c2913613e80984a1b56b751c6b8b760f2149c6ea7d88a1d02bb24720914df9c787e261afc3afa5b83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2286d794a4355fc5eb36b721bd98592433e50ac481f8d95ef9e79cdb4b233da780ed9b45a5850461755a12ab9f94990a8edcaaff434e12ba4193e1abba6a13fd18\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8c504464b5b4239a47fd8d4b185c3e0e1b6c1af0",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc8000000000f67fec902df6b2500000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87f4c6d04d\", \"prevouts\": [\"2826270000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bf4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cddd07b9b59a457ac18abed7266986241d091147981a1ef9d43f6473969f25041ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045911e2ebc11e8ff6aef3c08be5d8086fd4b944e3e1f7063038c1b6dadb4d48ab0219675e68f7f320420702225b2b85f84783248daa0c82b4ef34e304883a54210\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52bf\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93661c1881d39258f1e1cd2a227228c64064431f4d8fcb20ff13365666a49c5d8ea1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045911e2ebc11e8ff6aef3c08be5d8086fd4b944e3e1f7063038c1b6dadb4d48ab0219675e68f7f320420702225b2b85f84783248daa0c82b4ef34e304883a54210\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8c716ab740c917b4df170efbc22b4e47873d8e3d",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bc00000000045d0f63dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0301000000dc9d369c018f9e5b000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787a2000000\", \"prevouts\": [\"fc803f0000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"8d43260000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100bc459ddf7bc4bd64dea0cc033111fa1a9bf37ecba688b57b124bd5ed93a74d2102204836f32b9271675ee184510c8c21f3ba36f991d13b2b3053550d6f334ae4fde083\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022021007c145d7511680491dfedb1ae554ef2648e19ddb40e39ae86e4664ec0ed08022071f6dd5b3e75068f1782393520a3d8b08ec20479446066a88dc4157af42e593883\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8c7dc16b0e4c9ef242cc7ca7264ea3a4cb62a9bd",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c330100000072fc8e80dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c83000000003e0d57f5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1d01000000594c5146046d9223010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79661010000\", \"prevouts\": [\"bb6c5900000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\", \"aa9357000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\", \"edbe740000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"a37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fe0803cf66684a81fc29be90af35ef83120eb264a0869d6933307511725bb51c5a5b11a87f009b0ff9f397e99e72fe38b81dbea82be72f6430c36b07738f500beebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7accae923b25d556389dd5dd645f6d7ddd89a07a74a73dddd3d85d7b65ae33798aa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821bbd263bb9b57787cc1695f6735ee6aa4874511c0d77def079ec8f767826a474cae923b25d556389dd5dd645f6d7ddd89a07a74a73dddd3d85d7b65ae33798aa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8c87d28e9f82d8cb2da362853cbfd7f6ed73becd",
    "content": "{\"tx\": \"6a7bc0ae03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2d010000005909f2bfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc501000000c4642ca8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b22020000008a37259c02ef808b00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4c7b8943\", \"prevouts\": [\"697b510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a86c1f0000000000165b142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"e3fe1c0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ea4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93645dd27374e1e3840d53c2eddc23e77f3daecabe9190b2b544b03414f960ba3ee83976a7e8bc20bfa4c53f64ff2df47d867849c8cbf6df51014735817968d498535c6739a4d626ca1df00777eecd105a7e72aeb1be910a44c9d3be4aa00e70c25\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0df322cf06423056ff4efb147ba4330d28398a4f05a11ad98b1121aa54f60b594336f2bcd90a4462875ebc34531696f5fa5671e0fb7e46050530a773670978687e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8cac7b8d77d23a0085a03a673ee2021520fbabea",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e800000000a2a1cdefdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf5010000003ccba3d9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5100000000276aa1a901227028000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787240e3c58\", \"prevouts\": [\"3b470f0000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\", \"fb0b200000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\", \"0b2527000000000022512067225551b50f550878fba08cb06856b99d76e57e98d7477f94810d7b1bff9dd2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694fe84cb69964c9ab88d8806a3dd882c1fd4c1e968ee9a10fe0c80ead4a8f7623f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082eee8539df42e1fa2e5e9e7b75fbe1b52db879ec8a622b496736c99966ce19d0038273d2ad306f831e931ee90238e60477c8ec11f350a3ad34ea06c6c58bf7ea3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f8871c7955fe825167f5509f939eda783797f3f4df0f87146827f8d7c3a13ff899aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4006cb24f353cfca0d245645f6b16ad599c212098eee86bd01fc37c5c4a863127c77e07a04f832bf80fe1e45fa6237ff98bc90e935546ee680c041b2556eaccab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8cd544fbd46d49e76648955888fc3047bf5e24bc",
    "content": "{\"tx\": \"cc2e403e02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb10100000091ff68d6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb901000000bd8eaca701a18f31000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478795736527\", \"prevouts\": [\"94a2240000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"ca7d660000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100c24b55bc85bd2bab08c4322ef1e52e7bfddd9534fafdac4aef5da15d474d71fe0220638ecb567de22c82b81a9050d4e21e129e2db4630279c94c2190a38f9c614629e9\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"30440220747a718a2dc63b4a990a31528f8d1270c9d4998f7394690dd93f1a6fba831c5b02206eb3d4e574ff01ab9f5dc6636e455ced3b550ff0ad013abfbb92ed33fc32f378e9\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8cde25f4590bc7a0cb88896228ad8d28ecb9641a",
    "content": "{\"tx\": \"5cfa37d7028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a301000000ee493d81dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7d010000000e4618c40212f89a0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcac3bac60\", \"prevouts\": [\"b6d9410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"dde95b0000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/hashtype1to0_keypath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1a69d4f798ccaaacaf5eb67f604efe840dbdc7338d1db7478929a0409f5c83ea57d0aa5b9fd2beaae3f02d842c70b395fde01bedc6348ba4d791041b52c16deb01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1a69d4f798ccaaacaf5eb67f604efe840dbdc7338d1db7478929a0409f5c83ea57d0aa5b9fd2beaae3f02d842c70b395fde01bedc6348ba4d791041b52c16deb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8cf7c389a03e6d9d8cdd4dc0ee8615f54cccd395",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b98010000007a51900704120721000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a67b000000\", \"prevouts\": [\"50e823000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"473044022015cd3cdd20b2e149491ecf741cbc79454e753352c45992000426222868f84a240220703d90059025922e3f189c0edbd9f80345b8cc6bad80db8a62188a8e3839b734834104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100fab45dd95f3fc509a9089af109ee35f08fb20acae9b4aee952f13b95bfd42f9f0220104aa3321b0ddb40628d611465ddc16321eee078cb6b7e39a21a5d17c641b827834104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8cfbcd30e59e458884ca65687215ef8a39fa420b",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6a010000003b24bf8adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2201000000fb57589c0357a6d200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcca000000\", \"prevouts\": [\"abbb75000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\", \"64ed5e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"3f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c3df7ad94edd5dd8384ea059f961cc865730b5779c671ee2d6f7eddd0a74f8f7eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7acea811edfde1d836b623c2094badb4ab8bc7795b2b49da5506600222f32ea3fbd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823d62cda1d889ee05ca59ece4e76d2fa27c0bab47b49d4f70b1e2cb0efe9a711fea811edfde1d836b623c2094badb4ab8bc7795b2b49da5506600222f32ea3fbd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8d2e1d4e20c8a37b8483b0636a53106414b2e098",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfeb0000000068aa1af660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c0000000003ed329820294e97f00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48725bbbd2a\", \"prevouts\": [\"f0006f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"da2e1300000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c57d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363903e3bb34d25cf71b6983cf4f2b76fbc603b2adde28e34b23c45d7f67d4a2394a4f1964bf857a391dd30579e6c45654815fe99168eae3a652a179c44e1715327def1cc2232d9b1ca5244635fcf6779cb15e82fb856baa2ca11d8fd1da35295f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e6d35158b06e93427cedf9700445f423da8a62a86b9572893cb3b0c5b8130f93e00378a892e4dc43a17c9ebd71803200f2f24c9a40c2827c304e59be9b4a7df0b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8d84c17e2d2a5f1b483ec417d4084cff8a83bd8b",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be001000000a799f40abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4f010000001e21c462bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9a0000000077dd0fb3022989fd0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a611000000\", \"prevouts\": [\"025a1f00000000002251203d94c30f7ef8b0d9d4c7a773497c0af2bbd0a232f6e89c19e65bba66d7e2056b\", \"c0e969000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\", \"f4dd760000000000225120ff67dbe5f480d52a3db68ddc8756a5701c353a5e478c53504b3368e48f095423\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936008088d7cf4bcfd919dc74e7ee4f6736dc4eccb5f6f5d741e30b3c7eda377cbb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a09616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8dad5eca9780e98722de60bdf4209e99730b7ce0",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1500000000e2737d19dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b03000000005a250c9e0284fb83000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e71e000000\", \"prevouts\": [\"2d5f6600000000002352212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"6b0a200000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fafaf4d01509d00362d1685157096ce13f6e0df1edb9baa8d22d7c425316c78328c308d8e78b0cea59e70bbcac5990a047bb63a968328232757672e5e931dda055\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93610bd61aa5ca2d5bbe3b0fd477fc193f06add97123cde67a86227ce5080534856faf4d01509d00362d1685157096ce13f6e0df1edb9baa8d22d7c425316c78328c308d8e78b0cea59e70bbcac5990a047bb63a968328232757672e5e931dda055\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8db878b9f4d8758552ba375e70b1c319d8ca0248",
    "content": "{\"tx\": \"0100000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c30010000006ac7d40b042bcd4b0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47877c030000\", \"prevouts\": [\"b7da4d000000000017a914b60a534933f6e50f3846e396b9868efc9e681f4187\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"225c202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"4182c373cf43d0dd9bf6414da623c57558ab25f87b66cb8aedf074334ca027beb6cd78beb6752e2cbb85dac453db9d5daa3f06470db784573f68e4d75e673e9c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8dceab2924460f1a418835afa3ff5d4bde00914a",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdc0100000013b74e82dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3900000000fe9609b5020f333b00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acd4a59f23\", \"prevouts\": [\"e1ae1e0000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\", \"18ef1e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f4fd06ba2b74fab4c367f8e8e0519d3d9be3851343b71a963fa32cdfd438e05528a09ca0f6d73d82e88e284042e116dab9fe2cbfafc110f6c0fbe5b2788367c646ec42a0fc3b2b57c90387175ef14e4ddb9fbb252ed168d3260bd00914c11302\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b24d4fab40ea135233ddc8c9f724889f007818f7ffad5749db3376d8fcf405e18faf2eb908b8657464a6ead7ee639edc82f346aa77dfb25920bb6227c2c4c35ffd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8dd1413b2a30d480170c4918b00b9b7abe7ae2c6",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2d00000000e75314b28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c475000000008149b6b701e48d50000000000017a914719f78084af863e000acd618ba76df979722368987a331533c\", \"prevouts\": [\"713c4f00000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\", \"6a1339000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4bb0b9e3baaec320f7de46eda77f4fdd2cda08039a1867e75a703bfdee0f4ff6d1cafc3da456d473afb79353f7068dc1822b24dbf9d7eaef6a0c8c9b611b05e979feb3ebfb72e1f3a9e601929fc7eea4d0eaba4c5291f01c808279d3454a78ee1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1b6ddcef20c10c61d9e21e2293389fb4d83401974c63955ae345dea7dfe41530ea78a04935edfb84e1b4b71380d58e01ed379cbb21cec8f8440ec0fbfce597ab8cd941a6bc152cbea0496b075d4b2611b435301778200e60e8b4147cd93749673\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8de4d54ede6f78c61866173f8b1096d7f5e3f478",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706b000000004daee3458bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4810100000091e255d604661a4c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac4d000000\", \"prevouts\": [\"e2cf0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d3ed3e000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"dc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e96c63bd25ae92bbd16086cd18a0ced65254d43d2db01fd8c973d5ac979d0978d49cd47170ad660e437289f08833289e3b90e14293c0ba427f1ef2b5a93f8559a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e3bfe8b0458382ba4f4ce4b13b8b707c198a710172b0004e49e202e4d70abaa7b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936754c3400f5b19129397404414e73e7234111a3665d4d5bc651a2a24db00d5dfa276acb01c569c39653cc9be144b4517abeee153b1e65c2a7dfaac73ffa4f7941ad29df8a0e62e4f40897f8996914b12118c918ca2851b639742aeab01f587290\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8e0a71d16611cdac906bb4dece9fbf87d1a0fc8b",
    "content": "{\"tx\": \"a1212fcc028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f50000000035a475f48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c476000000007698abaf02c9fa77000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478702030000\", \"prevouts\": [\"bdc53c000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\", \"d6083e00000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93698751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d539caad535bb8d51429d9c94edd44271a241bcdcdcd941caf815b31d1e73ac1400dccf8e3471e4a61057d1540548a04f67f25f6a36812a8ea9d07747f2e4b3a8a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4360d69898a7d9d7cfe47282f038ce081b7b00f0e720fcc7ce2a76c05a52019262a5aef24b6a1c01bacd2a24a37cefc04a347b590d10f3bd98469f969c355217b0dccf8e3471e4a61057d1540548a04f67f25f6a36812a8ea9d07747f2e4b3a8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8e1a1f4379046e33058d6b3df5184a181b98a2b5",
    "content": "{\"tx\": \"1d7233850360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708c010000004c7f1e8bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf76000000001971cdc460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706001000000c78a86e4027ef68b0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f877bbf5d2b\", \"prevouts\": [\"4e1e0e0000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"19636d0000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"a6081300000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ed4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93655e252cfaa9768c1119fa64085e95b8d16b96942ccc526bc25f5651427cfe139d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51c9b0690fa0521f4fddf88c65f69e0716898ebb5a52dcb1ee37dd2f34a8a99dbd71d4983925d18ba40c8655020b616e094614baaa1bc1b56f6416d7610eedc4a1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fdb145940c290b3b086078f684e0e7b02072f4c479430733c205d9de9d8640bd3866c9dc2005c39fbfa40f99a1086b922c913a672fc19646edbf7ab3e480e00f86475c33b310e45b92339559838140b9b3f3d62b1cf111e129ddf9f566de62eb71d4983925d18ba40c8655020b616e094614baaa1bc1b56f6416d7610eedc4a1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8e38afa0e7c920bbb4aec155f70d1940028204ee",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270250100000036c4ee558bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4510100000070e54af860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ac000000007953921f012baf0200000000001600149d38710eb90e420b159c7a9263994c88e6810bc727afb653\", \"prevouts\": [\"de1d1200000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\", \"bbba3e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"781d120000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bb4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936023cf8e98f7450905a417c9ac38276f00b59951e06c79e90063ed7e2000f468fba5ae8cba4ed1cb91f8a2ddbe7d0c8637ea6f49c0896515a628c3bea1aa465996ff84cb0de1f41d907799f0bb3a3d4c37b57eea0ba754203aaf5b7b2671fe888a4b6f827e9c7b2c56d61f57ac31f0aa4c5b637b7f763b3a1a4d37c3a7fd6ec38\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369ef25451e1287905b17423f83e08d071b8f612240bd231ae948ab742b6a6315350430626a247d567d7470b6045f35bcd343227bea51bdb051c26a41fa3e304da7017bb5ae96064d7d19e957b5258c9c864deb4239d29676eb164d7ecbdb9fd5a354ad806189ae64381d3b11a94f516f6d81b0c787d08b0f0aee4f0e917017ea5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8ea1e2b4445b668065a333641c17f3c6038f2f27",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43d010000008a18adb58bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4000000000016efe5ec02e2766c000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac05000000\", \"prevouts\": [\"47b438000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"3dcc36000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063be68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4b388de3dfefb2132719c310aa79074581b330ff4b72041fe2a3e03933132949f61eb6e6fd21ad84d93c7a0474b2daf5b011002cbe34781a2a14a95ac7c4e00ae344cebdb8ecd56ef01fad0911d9d88482970ec36d3a04b84eda7f5b5c68ec938\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362358e12ac09d2a6885dfcf9eb233087f34097060d523dcf896ae6036206d510973668dc71689fe0651b36a481e24aaad53f2818649afcdf831b4092eda1b840fd3726db1c97dedfc82502578948b1d779eb886e6296c36bf50b8d2fe25c32b8a344cebdb8ecd56ef01fad0911d9d88482970ec36d3a04b84eda7f5b5c68ec938\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8eb143cfc057b1ffa8e90069a1d1ff91a90ac794",
    "content": "{\"tx\": \"1a7ddf0002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1600000000f71b52aabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbb00000000a38578fe04d6958f00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fccc000000\", \"prevouts\": [\"8900200000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"aa79720000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"de\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362f9ea8f2e65eb73025cf4611eb81b9bc973c238c936328a8046b3068be11236b1823ff0d5c6a769fa09e08a59a2485b611e1511239bba2f80aba2b92be945f1b811034f174cb7bd77652d345f06878a8d4eb3ae1b92590cd10e2563bf228d2d6bf82ba79f2fbafe67448595b33026800f76a879cdfc27419c1eb96837433fbad\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb423dda11617dc042479e1d576056805c31872018ddbd603e5e1ceb926e90a3395bf82ba79f2fbafe67448595b33026800f76a879cdfc27419c1eb96837433fbad\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8ebc6173196e2c3ad4ea6d665b4893fd67690d70",
    "content": "{\"tx\": \"c924110102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff1010000009d574b958bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46900000000c2a4e1b8022e86a90000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a621a7f84a\", \"prevouts\": [\"fc546d0000000000165d142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"a0373e000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"56c614673f4398579993d3f4aaf119ab2881e992735707c31e57e1b6ba410e5c388597bf331c1ce9348b07097e077feff8c24a499b9048a615ad9d4426845dfc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8ee6b6a7957bf8ed03aa4b95dbc232e5ba56ead5",
    "content": "{\"tx\": \"7a4c3a2f028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43e00000000402394cabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf43000000006307458b036973a8000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374874c040000\", \"prevouts\": [\"887434000000000022512003ab4180fdf64546247c5e9f6e4b9eec37b1d29fb6f370a343f066de5418d90b\", \"20ad75000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"974c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93626364c264ca1a1a3113427e98f88e51ff7da2e89277d01d72659b15bd38bb6d4bbdd0eb743f16fddaffdc87a703f35bd0417e0996b155e435c0add546ea723b55a7303e26d6b86d2a780c30dbeb7ba87c6a0494b901c3875fb9ca7f2f12bb2fd373be813dc08f80e09d78de4ac5358a3bdf22545a425b50fe87daa20f96c44d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5297\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f96b744a52162d67d7aee619d433d93e0f112e198bfa8f90bd1cd431f60087e13288455e3867d2ff7594cc417650f42f79f93c98aaa5c5ef25eb3554c8bf2ec6282285524a15c732567d099967405d35f7136f74f48f011bc4ab279ad8d14f14\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8ef96afc00349b4248ec31f4755d1020b7fdda03",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40f02000000edc4c2a1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7d00000000b6e37ef8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b970000000032ac10e903965dd000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787c020353f\", \"prevouts\": [\"db0b40000000000017a9147e06846ce22cd5e23f7e03391c0538498e0e18ed87\", \"234c6c00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"693f260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"de7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367d67b48ae102939b394e240fe50b972a2db09c5d140b2e0ff38ab31a95ec777f3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08267bf5ee6e785c98394c7354db9cd2cb879e9766d4c80c1499d7b3e856282bd13a05e4a06b32de803bd9a925f4d86502b21cf2d106a73f15ada31e997750cbc80\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367b4419e0140799871ba1426129d6a886ea24b454e319298d6cbfcc8b7ce92d14093a387cbf4f722495a20cca4e5071672ad9cff48cf2966de7657b6ee347f57da05e4a06b32de803bd9a925f4d86502b21cf2d106a73f15ada31e997750cbc80\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8f07475a5f9d43a948b3b96452aea50918e4b9b7",
    "content": "{\"tx\": \"b50f094902bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3f00000000c673fec7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb80000000046642ba302baa7c5000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acba7f4b39\", \"prevouts\": [\"15be6f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b7ea580000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_e9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"852ce8c162dca0ea890fc9fec348fa03e54a13028c16172ebb382603917641b41788499ee10e8c9f8c6852fb4271d9d35198440ee8c07b034569a912a2def30102\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"abda8561fb4486cac1e1ec3462430fa73446dca4a2307887ebcf4fe1ed2f2c1916e84b4595655eb805e80df9b3b73dc86851cac3fabd958c0081ea03ac51b943e9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8f0862b153c849b8d035fa189f7ec654f8b3e862",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c750000000034d93ff2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb10000000088399385027739dc0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac02010000\", \"prevouts\": [\"d9be5a0000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\", \"22ee83000000000017a914c7d65cb5025eac8b5bf295baac9287994ab34b9b87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063c568\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f0a6523615754b4aa54ab7599e81d37a390fe5e9971e25848ea770d0aa595f2c3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0826c8f4b27179de8a3c9fbcc0ecf825a44b7564122e0508108d3381c6acb047da700a5530ec2a7d4ba868ec61eef99b13bb3328da6d520ee28822b8288bba3da4c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb47ad860089e7bc2a902df7d26b00c72c3270dfe98d44c73f0cc876602eea860a2660eca3fa0edb42c0ab30ffe3daaf6f1f409e953104f48559c2b804c71af6a81ce4d7767c8a9637a0804b073b1eb172c67de67ce152ade33f2591a85dfee2e5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8f0aa9d861c14d5c32d60092ba04c2253666c4c5",
    "content": "{\"tx\": \"d7f96b1903dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca701000000c90fb0fadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0602000000fe78deebdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b92000000002e15949302b1769a00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac1a020000\", \"prevouts\": [\"3eea5800000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"d5e41f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"688424000000000017a91495eb8fe3d959e08a2cc279c1b4ede1921d14a93b87\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2257202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"4020147d8321202672cb3638e9c82713747ef93d8af087d578629c0f65dae5616b8a0993ba3ee86e8e20e32b1d471c10be28c391d7d67f05bf44acb12bb214c1\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8f4ba01ca74a466747b89a116a26047e58536ef9",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cee00000000168bbd8bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5e010000006458ed8f0459b6b50000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a607030000\", \"prevouts\": [\"7ea84f00000000001658142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"3dc468000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"11b78558c296e038f53e1518c4e81c6eceb9ddd85c9f10faa08f9aa192446b2615dde6ff920d86ef09b7dad738c2cdab602d5cedfddfa1deac7365c5e8e1275f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8f56d7ddb9c736b9c89113453c379ec0a21341f9",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc400000000722b13ffdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1101000000ea73819702fc8940000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f872fbbd44a\", \"prevouts\": [\"04a720000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"b70022000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"797d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93644f5e531b2d1fc6d65a483d63fdb8b5e6dc0a2ebdcfef74cb54fbc1e51fef52fccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f45727aec9530f4cf05d3554e63105b96634da39f3c52c35c251ce860693e97320b3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93681a3012a8ca754d1d79ae7fb9e13063abcccb354ed9b617596389eb42efb17e66301af72c0f0fcbfc62431a82320b93fda30ebabe1c669499e3cf52b4dc2b40fe711fb6ebac21c15598dc6feca0613664d86278cc532834585097123290bb3d45be39dc57762be2d9b1a04aa5b570805d23104bfe4fa54c392bda5d51f7f4540\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8f7ed4f89eb5a042d9a19a78e61c47e5c984a9fa",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708401000000a79891d28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46901000000540de0f504bd1452000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ace8010000\", \"prevouts\": [\"1a9a120000000000225120fc75765be35c7498e91185d3d44c5b81ace48e1fb56783e170e4fddd4a850715\", \"8ec7410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_d5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cd014610cbd7f458a02c10d7176e0f4551e37025b8c16bd0eaedf84a76dd2e31f203181c9a051184edce67f74c60877c3c0d60e30b53d4381fcddd5a9feba38781\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4628dde71dcd903a954776027f1cefb0dbdfe0935a7d25f49dc6e87d05c32a3403fbccf57b98e50c9847aa0245450bc0e9b200b437039fc699c29e89706117d2d5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8f94c8c6a37bcc91d7a39416023f9d78ff08129a",
    "content": "{\"tx\": \"d950a147028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4710100000088ae7b8cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd2000000002feaa9920273d1630000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75c917233\", \"prevouts\": [\"201d410000000000225120682cff718d7cbe051bd5beaa1ff36d3547b88d6d4bf403f10c1645a08d942ef8\", \"4ae5240000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f7adfbd1b335a199d22a67c621fd1ccdebcdebb8f2e40814f300cc202bc5ea67\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/8fc0dcb82f3f88e6c20e123adddbce9afa79dd7e",
    "content": "{\"tx\": \"8b21c5e6028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c432010000009e90c1d88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44d000000000d1ee0b404151f6e000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac44010000\", \"prevouts\": [\"bb693e0000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\", \"20ab3100000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_csa_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466dd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"64494e39aa5da0bca64e8c163b9e9fe1f66a9f918081932cdbf8daee4107ff59740de9a96444781e8924afea1310454612b128548f818066128aea1dd0e4c6ff00\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466dd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/901261518c53841cdeb55041f748183f25fbdb6f",
    "content": "{\"tx\": \"b8c2a6fe01dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b470000000048cd72800462b822000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758837320\", \"prevouts\": [\"b68e2500000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bfcd38c1da080d9fa5f350ac5c5d82a433c6ad7048f1837ebebe4defa9773a5a1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900454c3d251f378473e49463283b18fa00944324abf75c7e60d6956acdb0e7ed03a7354ad806189ae64381d3b11a94f516f6d81b0c787d08b0f0aee4f0e917017ea5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936597c2f6b8dc6d15eebfc9ce9773556a5675730a3f06ef70be75161d60adb64d2d0e13bd92b8f417e9a9e83db8f63381783cc5b261abc3d56b5d515d800102f0ba4b6f827e9c7b2c56d61f57ac31f0aa4c5b637b7f763b3a1a4d37c3a7fd6ec38\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9014cd1a175ea66532264c818ac4692ed805357f",
    "content": "{\"tx\": \"46adb1710260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709c01000000b5ef5db360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127053010000000d2fecdc02d72f21000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac59010000\", \"prevouts\": [\"9044120000000000225120997d8f010f68a117b9644ba05425738241c47f04463545c88006dd06ca2c16fc\", \"d535110000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e94c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369ac778bb6e9889cb94937fc77a861bf4edb1757bb7369dd12c591a6cfed1c6a5fcbd8218c9dac71a3535cf40d08210778548ef11a7c40c018c5ea1885d9980740ce9ba0618adb3ee44483a22999a54a4e1710b9846377d8164aaa29371d79f22a2fa119ef3ac370f8290f87fe8954e212d8c61d3545cf9da1d8aa62b42f72813\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52e9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045ead6d3e810571e3af6462e6592387cebd820372bb489ff10eea7a83e6cd68e83cf301e2cd98ef2d5c028e1b110cc6503fb01279ff4eb452c3408c39d22674b4dfc7f9c78871d6a598c7c7c3f4c8210a5c47caa8abf9700608b6e75845c74a6c5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/902fc67f6a0dd7c17809ac0002972da218f32b8c",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b090200000035a3cbd1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7b00000000bba5cbc704e85a47000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796f3703632\", \"prevouts\": [\"490f2800000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"e0772100000000002251207a2f20e860cda556c5e91362c7f67d77fa79d70cce9558dd8fd8d88940237552\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"537d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365679c4b80b1f02a904f6a1e97bc1e5029a390245cd2e5f4f1bb6526c613587c3c1fcc94e870ec95c088fd37f5daf805336fc0aa07ac91d9d5a0c770a5a47ed76aee97a7dfb8acbc78fdce4694f8ba1e1e3bf612a81f34559c93e6dfd336d600fd892d02e0db2d70aca72db86bdb1e35d04291625c81ec0b3d884b10be9f787fb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89a54256964294f7e46fe5d25ab3411c34d3792ff29ea326544b7c68695f53859e150f8c7b4812d3362c6afa34922f3b5cc4b63cc9e98285537a088f4a7fe3bee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/90439abb1bce7df95926ac69fbe35e9a75849704",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c09010000008fbe4ad0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7f01000000637407e402af757c000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6af040000\", \"prevouts\": [\"41885b0000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\", \"e76b2300000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c40fbd6c2414aad6fe6ba729f95c47f497dc6a4d2aac2f66dd85c70e3b597d70a112aec6b4b8b5b1ca7f36a9e0521bdf2c7802df3cadcb1e8aa67d830b4a0d3fd33ab5c29645e0220ea4ffd8cb7e67404885cb8b0cf94872336c7b06d59c3124\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369ad3d30479f0689dbdf59a6b840d60ad485b2effbed1825a75ce19a44e460e0999aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4a89eab7efa8b8df17a82e815a072b99e340ac1768e499ee92fb25d88959474e250636431b24706e8b1111073dac761b2ba654f4832b7b9ae2a348c6845c1d327\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/906de10a0641d6cd4c0dd422fe885c2f9691128a",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703a0100000094624dca8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ba000000007ee534a402fc76420000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac6f5cb72e\", \"prevouts\": [\"1ba20e000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\", \"c868360000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"247d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a5787881982eabc9f10a574183ce87b535a8253f66971d7d0c58826076cb527312b5d836754160f4cb099c4d8b267e29847dad01b12a09dec3875f376ae126ea3506420e788c3ffd3d8d88ddb9154e82106737a8dd2b5d0940daf68f275cd0d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb9b18a780ce64b599d9d3042fe9b5b93046b018637f9f8cec8ef00735e099ba32f1db23017f271ba09e9de40cbf6bd4b292cb969b1168724d03b4425efd5cf153506420e788c3ffd3d8d88ddb9154e82106737a8dd2b5d0940daf68f275cd0d7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9076f59736d1a417df0e4e53465ba7f80da49859",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702b01000000563eb1acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfe0100000075a2baca015d162200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca7030000\", \"prevouts\": [\"503d1300000000001660142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"112b4d00000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7f4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b6d9476ecc09d849d3c16682d4a6fd2c22d5514554f5544b52408747bbaff174e17cc42fca95eeef15c2a149426edd48c8eb93e73982ab4fa8378007bf5ef888ecddbcce676de51918ff82e75e695523ce4d8df7d4ec353d45ae6331617767e1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c527f\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361279a387fb722f4f14f9a7780c31f5e75533d5e2ffb38299b6ef0e006f47591370f73741da43ca43557c58f6aa15023f4cf70566ac935702465d6fb0f93d4429f8d5397512e216c7ab52609f0ab27ccbbfd2b7e561d7599ada55e292956af911ecddbcce676de51918ff82e75e695523ce4d8df7d4ec353d45ae6331617767e1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/909f04b9af20cf2cb275ec1cf722f9a40b234fdf",
    "content": "{\"tx\": \"92ddf3650260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708c0000000087e1aecfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdc0000000073684b970280a936000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acf0000000\", \"prevouts\": [\"8995100000000000225120264b35643a3a3a95953dacde7cb6bcfadafc46c4f235409840aae4392ea87839\", \"9d4d280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_fb\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"93aa89b646b2bd1010a2742dcd1f6e7794f4d56d1902013caedc8745ed9892d89368216724385c6a8369cce97298829a9572e94f23dc1651205a49c485459c8a01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2ab97fba5fd71c40d7e71a0c7981cee5c56b17c61858fd7ffb6d3bb435d4784847061cb8a5d9cf2c41b9a98685349df8e1cf47aeb4faffb01570abe48f54e075fb\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/90b75e22907115340a987929a776f6f3bea1d9b5",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2001000000681b64db04e2ee2200000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc72e030000\", \"prevouts\": [\"e46125000000000022512063eb770f298cfb14c87c6cff1e0541dd7cbc30bdbab4472c0f37d52bd55ad696\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"ba7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a0ef97ab7ee9fc1eac24be41bfdadcbb7c9625a4e882ca5abbd81147d09c0527a47630aaed9dd66550bfcb0f3b3ec2bd830a8a42bcee9dbdef471b4e5cf2e89f5668d978bcc8d3ac0b8aded42d2a4a1c5e69a5396581e310868cb48ff813edbf\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93654dfb6f6b9a2b04f4592afe6e08b27d0dfb1567237811ea996f2ccf3ff1cd1054a7888d88a49f036a686b85959429d2c21b5cc7c31f53deb0eff848be794e4af5668d978bcc8d3ac0b8aded42d2a4a1c5e69a5396581e310868cb48ff813edbf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/90cddd59c8cf3bcac6b2fb6df29c9362c3a69855",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0a00000000b81b6fb28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4440000000042523524047aca7f000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374872584c954\", \"prevouts\": [\"2c8f4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"cc64350000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"137d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820ac5ef61da5659d8214c667aee1dbe4febf87286965cb6fe696f5c1a17be3da5155f23cd39ff67d8b5a6775be7b28a3d1b06bcb926a8f69937c20b78b14c2d485d0346f0de7f7080f7758bd86c81c482f81ad0c7703311f4b65ab9d7b77c9f00\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fabd41cd46598692ca564feb702471a27c2b329b731a2dc6dbcecd3c4d6afe3efd7c43b740c0608ac721897ca7a4b0bbd2ef7e62418d1fc20274bd386c7c0d4d7e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/90e012902ea03831fe652fb98c2f284c57217115",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0e02000000dfbf3a19bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa10100000034a2a0af02fe7ad10000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487dac0f83c\", \"prevouts\": [\"fef26900000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\", \"568269000000000022512030fd389dfc6b7dc5f4caf58ddf04b54dbb338c7b69e334c29cccf1a655d02655\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93663380db981ab01c8cfc2b73d24e17b0f36e1c245c11385e230b04af30b6c7e74\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a1b616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/910480b0cfba5cfd886687f687f8a73d081c0b15",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0102000000461e5b9c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a5000000003a7310c4024533a8000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487eabc5253\", \"prevouts\": [\"a46675000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"4386340000000000225120997d8f010f68a117b9644ba05425738241c47f04463545c88006dd06ca2c16fc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9303ce586d3f3b9a63015f43a435770e5ff8303edd9c923b06ec079cede831c821d292b735a33f7b710e370cbc2f72495737104b083da863c1d97e86f18fb169\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"df6f99acba42349bdd2e021c65a8ab6f7ba49d65c3e4be2e0e716036dc379e7a2023ee4cd29576f7b351343e9c3363a282fa46f5c44c4cae1108329113f94b70\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9143eec00e7c0dcba52a44c54c7fea4ca90ac9db",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a4010000001d6355fcdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2a00000000547be58f03d0fb9600000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac1baad02a\", \"prevouts\": [\"dd48400000000000225120cc4d42e69b853b2a0a5827098521167109822d5a10f2066982dd9b410753f660\", \"8391580000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936aab4ceb46e8915e34a175c818206b2f8c71eadd166d81881d5d09dfa18400c85\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a24616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/914d626c074a269b3a9d1451d77761c9b6e8db28",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cca01000000beed76a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfa01000000006e98b98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b701000000b215db96035f51d900000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7f08c9e1f\", \"prevouts\": [\"f6c5510000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"2aaa4900000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"ab2940000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fa4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a6765b3a9293f3bfd6c3b684051ad5b8ba6e731c254b25e3cb8e354d60cbb2971a4e7a29e9a68a1d6e5ccf500c3bde1b862f2704e441e939992f2bf5a528056a3bc3f3b627616b9f836af78c18ce00964f5f9dce3e851898685189c72823645e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367c6933323ad2fa3948334e88be7f42bd024e40c953b9156393334b52718986a762b588f53b8753752456cb241f753d144ff0679dfcac60637407bf69aac4dc17f8b8afd7beb88d43ca6c6d2d58dc9425172bd95ccf582b2eeeba83616a9d27d33bc3f3b627616b9f836af78c18ce00964f5f9dce3e851898685189c72823645e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/91b3598a2ceedd0e45722fd9287672a13bf221e1",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6f010000002411c5ba8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cc01000000e72a29ce0200e059000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7966a000000\", \"prevouts\": [\"699f250000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\", \"36ae360000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_d7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3ad20fc73a72f0f30c43fd5739e28f93c47d9d9a5111c7667c56a166563a16ba12a9b528b0d7b90ffb72cacfce34bf6b9696dfc9c508792c972faa29d6ca5e8582\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fe228f450b45239e48687e39a77d68b1bb9e36fbbff2b47425d8556a1374b55a54b4c459cc808cf415c4824044b752ee2f65dd71deb8829c324f3085ef7f03cbd7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/91deadec3dc6c425ddc903b195066184526341bb",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127011010000009512ffec60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270dc000000001b1f74a901fa2f0300000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac929f8435\", \"prevouts\": [\"9a331000000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\", \"e0c2100000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ee4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ba746a1e3af4c529d3cdba1b4e6cf9b58f2b1e1d981455be45b81cc2f039993b0f3b0db014ceaa26ae02ffb8f31853eb721e6357de034fb71f3898341a9ea5240028cdc19f89baf6c362287c7c7841c4536091540a9bd978c440258b5fe7844c439ca2b6d52d4fa79aee6ecbc14a8999a29f1c28c4c5c5b9dd610517c3b748ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d519b8dfaa69151d05ccddc10c8c1e468eb7b78f9ad17f99ee1b916fd61bdfbcfce40899fd8696dac9e3afc960f0a100b615a3c324ed3a125e98af98336f748ba56\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/91eb11de4a9b1c364da7e342da879d0915930da6",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701c0000000093e5369f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270700100000013a28ec804895c2000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787270abf5f\", \"prevouts\": [\"4552100000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"3d1c1200000000002251203e1b6fae524f56ebd8e25d4d2010b2e478325da2c77049f1de4edb81deddfc75\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_cs\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e3c59f8247ce8aa4799c2ca4717b16ffaa80f6c89cf4202246034ba419606982c92a52db48d81748ec0d8f52054c1b0e07bda560b56782996d2b40afe7360328\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/91ed8c8f6952e9dfd27a3d45454432bd4886c8d1",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43d010000008a18adb58bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4000000000016efe5ec02e2766c000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac05000000\", \"prevouts\": [\"47b438000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"3dcc36000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_81\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"771bc9c7f412418640737a6c0afed578a4b8c78dcddc73a90d10e6acb2eb12a6fe8a32012fd9aeda27adccbe1eb3e7f0dab702af25480ae5f95598e333ce30c981\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1751957682848ab9a393ac27fa1018f9eee8546277f50b728134f598b87e5618f34203be06222a0a52b70555f65339646b1983b20babba4eb14dbf0b1ac7df5a81\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/91f11c0a3851e5a1b473cfd412ff28fcd7903c39",
    "content": "{\"tx\": \"98b7339702dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6701000000ce4b1aba60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d400000000185f3c8b02ea2a5d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48721010000\", \"prevouts\": [\"58bb4c00000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\", \"60a5120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"f47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e760cc2203422c55a835172c125a7e245d244f5477158f1701a7cdf5578cf79bddefbee90a18838bf61213a4f1f5f31a75e180b842cfb60d5f81d26cbd38f8652876f4540117e7e2fda63f7a015ec774d613b8932caa4388fa9ce7145d42cc7f6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936391b5ed75d7758930f62a8b38c606eddd0f0b98832e7378176311548388961dd44a76e856afdfa077951e950d1b00a9b743b1044161111d30eb56bfa7ddab902890bfc944cea42013591059ba9f4ec0a95c62699d2133b38017223ef90bcb8e42b4a87a36ff2ed7228bcfc2438815b30cc1c98339504e1b834e10aaf4a034051\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/91f5456cb58ea9371b0fc9864e05767c7a8ee7e4",
    "content": "{\"tx\": \"997c8d6803dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb000000000b13b4e848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fc010000003b13f7f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf4010000001bbc0c8c04cff9dc00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4870cba8322\", \"prevouts\": [\"4d2151000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\", \"2a41350000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"170c590000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"bd7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082956f78f875a4cff3dc955be6c960f7b458e90648c2291f520c96d2b85cf15d2941cfbdca9cced9a9297ecbc29dffc929789a1848311039b5a24b338cddf0aa70\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93641dd31aa852e6f71aedc584ccf1bdf704b326c74e68fda16d455fddcb9868622956f78f875a4cff3dc955be6c960f7b458e90648c2291f520c96d2b85cf15d2941cfbdca9cced9a9297ecbc29dffc929789a1848311039b5a24b338cddf0aa70\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/921d11cbd9a6ba01c1bbfcc40c1205f6ef275acb",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c60000000077e8b85d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e6000000009e49a865016e35600000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb9000000\", \"prevouts\": [\"2580370000000000235e212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"0ca03a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b3790a49c3a8fac6cbb4a7a2da0753a5d801f15728935ae6d5fcba46453fcc4ad01f70cbb990e1a8ad773906c5f6548e1f1204cebeb378f9a06402f44c770412\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9238fc472251c9a3c817ab6cc5ea4e97c3d05410",
    "content": "{\"tx\": \"2aa979a101dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0702000000473615e8043c2958000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e701000000\", \"prevouts\": [\"18555a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_22\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3b4215d1fe4d81d1f7ada506c6ec1c5f09f70af31c4f02969ff8f0169e11063b7394a4f70584f6afd0d1490540ca3f338645d170c878bcea20231697c3be698a01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a430cc306d25ad17bb0ed55ac02c00b6e1d0e372c2097f9d9bfbff1e27edb774accba4681e9320955590f2eaf7c0fcacfc42e8b1c0ad2d70207f2854e8b04b4122\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9250a8a685e1f24b96edf202f1204a332bcb0ba3",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9c0000000073b9617bdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565caa00000000e018eef0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf8000000009055c6ed02596ab6000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8cf5391e\", \"prevouts\": [\"56552100000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"682a4e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d136490000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c64c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900456a39aac74ee3f63949b9c215c515b0db1b113f4639b3fb19cd99ba22ff01310c728ffffb27e62918c729ff5ffa8fa6bd185df3cc350f3591557de0b18c4f64cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364cabf014ebcda750672d1ac021cd6394a2c6c5dad7d3d27b5e1c481868bd978a68405cb22a39b2e10cd1afb6cf33a44daad2098e05cd2010bbeaa225bcf768d84cef708a58e9a16c040ddf6ca6eff300c7bff2a5c928617bb01c850b0a79e89f728ffffb27e62918c729ff5ffa8fa6bd185df3cc350f3591557de0b18c4f64cb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9266cfa0d3adb02eaa15bc09db296fa853d6deed",
    "content": "{\"tx\": \"fbe4c329028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42000000000fb3c3896bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5a000000001dda1dea04b72eb200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac2d040000\", \"prevouts\": [\"268a3c0000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\", \"fd69770000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"2c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936768dcade149bd5f0639738187159aaf838493e37b26b5112985adcc9222a637ae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8da733fe71e3ce0c37752cc3ed22f63651cf62c657cae6a4db35497744053504dcc62bd398c27c2bcf203967681d855a98ab83c6f29a4f091e05b1c584209e732\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93663d313380d2564372a28c167374b7b81401e305a9c99cf4fec75b57ce768e17944f4b784770790344d4d1238d6245096bcc9e2ff88373fd56766bafd01d3e44ecc62bd398c27c2bcf203967681d855a98ab83c6f29a4f091e05b1c584209e732\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/92848420c5779bd1c6d954bfc933383296c73c07",
    "content": "{\"tx\": \"2718af9003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbe01000000e5a9b0d4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7701000000d487d4b6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7c01000000a122a7d901541e3f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e1010000\", \"prevouts\": [\"436e760000000000225120cd69e6502803f0acddd51df30ad464e69e95dcae732a2073690eba6ce00d0199\", \"a2f375000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\", \"0988520000000000225120a98c6fc01fa4c9d83199250e6e76cd0e9fc22cdfbaba8827d6d131a9d8267c4e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366244692c25961778f5b75d5cf74ad811a2554082270838de283603655c691fe8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a75616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/92886f1a44cabcf2e2c4dcef68ee37caa458c47b",
    "content": "{\"tx\": \"2cc2c040028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4180200000083645dc7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7f01000000daddb8d20432929f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac3c000000\", \"prevouts\": [\"cf0338000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\", \"3c73690000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"267d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936642c909a10fe0e4fc753179e3d5cd4c801ae2c5d7d5d2a41704b786877d5c99912b49f68f31842330decdce79aecc48c70a85ed65081abd3cb605a7bb4f89ac9cd4c02f64c49cc162ff9325daec6263c98ea78a2c5346e44c6d55d79722c7edb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936de6c09700178cad280c48f26380917825225e73e9c59e12e875f11cf4740c82b2135dfff529a8c82f4e399fa9509c5b3ed194ad634f2dd2a3feda036a1773d4612b49f68f31842330decdce79aecc48c70a85ed65081abd3cb605a7bb4f89ac9cd4c02f64c49cc162ff9325daec6263c98ea78a2c5346e44c6d55d79722c7edb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9289711f9cf1406a577387a27b8bd4930e29fd38",
    "content": "{\"tx\": \"859599e302bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0e00000000418ab0fedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3b01000000eea2fbf30421558e0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac52000000\", \"prevouts\": [\"715e6b0000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"c673250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ae2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93639446218003eca9d9f50ac312e5383ca657554b5edcf97b5924c2574c3b360b5233ca416c78a4619c687785de007f14a4879f9c7a0556256e1b46b2a7e5a39b3c2782374d67da9500785d400f7ef10ae84f146bbb568355094c68456b68f7a283b30ae9fa149c8f8e298eb730b57bfc5eb02dfdad9864c9ec3129b8b9775e615\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ed1da247c42feee519ec084f389faadb1fea6967491a64d33a6aea1bb627006bab4aa5d5e3dbd00e7a6b81724e903c1ca482dc7bc8339f552afc52b4f38fc6a5b77966166a359aa5541e77c34a58fd9dcb7d88ef6e7e0cd0e140e1adf959d28b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/92bddaa4b62dfceaf980ba7a89bb0cc57e8fc52c",
    "content": "{\"tx\": \"a117860f03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc701000000bdcfc3bfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5600000000a3e6ebc160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e2000000008a5cc9e102a66ab2000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7d1010000\", \"prevouts\": [\"8417810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1a8a2400000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\", \"27c20e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_e4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a985b6ea14e9b384a3f4d2502a8c2585bd9b302b9f06f0e12a12d3b558bf75e828d121472590c20aa3e4ffb987d4228fa29188047671e063b79be8c43cc5f543\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f6279669b6d24a185a71b38dd7f03e2bd16b11b68ce29bd56654f5984ee2bfc1dda5582e2309066e5b56ade9d1e09239c8b7f91f725f39e0fec6632a2eff9933e4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/92c132ca1fe8044c1317c18feaca645a54713ffb",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb80100000095c037858bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4770000000021da5818dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce800000000a4b8f83f04b7dcdd00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c45bb44b\", \"prevouts\": [\"724b5b0000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"d90c3500000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb\", \"294550000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"737d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e855519fad8d6a945f0e016807e9ea80f240f92b51e0c4078917dfba5f2209ef9db33a63f37675deadbbcd666ca6b38ad7090050f3dcc6bba45985e955ec185c53\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a242f3c19d0f129445711ab0315a1086723bfcb35974ff1fec8f3d86f68a5ae585062220981136031499d54282dd1dc217e6360b68c94112219f47c832c6b09fa8cadcf9bcd23f9249fd09eb8b2b9ca63044a0ccef58f4cae9402f6ead4c2071\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/92e0a98f523af81899be75f9371608fd9948b337",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c40100000047cb6918dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5c01000000fd2ae32903ce9890000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6dd902a4f\", \"prevouts\": [\"8d4638000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\", \"ebef590000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360b0630a14fdba5198d2cd32fc4420c8a8ab4ff45908222cfc645bf4223ff04bdf827dd3f971806aab342b51fb6c2519c5b3aa410ee2eacb06207a66da829722129de37322ddf566a2356077a247b666bf816d75bd62d8842c555909c8a1545e03de843256fc2f72424a897ba91cb5d3893aa03eaf52af3ae765db300c5c19165\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f54907a8d380556c8a330e16c78ee3af2c39f1cd46f776ecc20664efdc303ae9784ae775de15fa9e8fc81d7676ee4bb7b8b5e55729a9bd981757787c0c2477c76fd75cc9ac1e6f185878d252db6c7bbd874f5ae03fa9961d4f4a0208503b0750f17ad4bbf375bb62f626ec8048d4347cc1eef977780228a6d2fc47294088d561\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9309be25161f4e02117ef32870ded9650d0e4f7a",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270df010000000d2d46bf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704500000000609e4da760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a601000000c24588ea01641b0d000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87260bfd52\", \"prevouts\": [\"9707110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bde20e000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"f260120000000000225120f52aac6d1851a3bcc3e02eab41e79301b2d0925e53812529fe85f9ade1401e4d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090282ff177af1b03054d9c533035830763fb8eed35ccb16c065252fcf995ad2b48163ae68b5dd01087842b3e484f15d0a4f1025d64dcf323509de1ac3f699ee00d92862e3d2e4a00dae2d2bf460d063ebf696ee1b6448b3462fa012f93150e1d2385ab3423de5034d0bf6b883b58ab8a7057cbc85f1fad044e7cbb12692b60a9ffc7479d5bc9c599ee817464b600b7c06eca8f80c467c517b2505f69f50d4670387dd1ee40d21bcc5c3c6c239f7a37f221431e055b20de844fcbbaf0417e691bd2b3b4ecba0d2a58811ed21f9f3d135caf9c6b7eccf507f71d2fe648b91b7e44cb901b76231dc68d4c1a79d0d4f9716dae56af7d0fe7ed863410f47ff37c2479842d4b8e00a62117bc9cbe89d24bad9c6a5dd07387e5a241d1b05e3f7a66fbf6920a68347e7a77757d557331da781a24930e1b4aa71b5f032f038bb0486545d79c84dab779aed2ab483083299127fdb95dc06fa6109afe7c7ac534a917bf19264f582ffc6c1361562a64fe82a6b1b294200ae02ab7f1346e070b6a8e871fd5acc5b6a0e23c2a73c941f36dc574a0e2681d625bb2b0373e609e18e641d34ed612fe3945aaf8a9cbb9b2f21306a6e7696088ec98ddeccd83dc79c65ee255f7dd573ce57b9edea5409ee4d8e3b5368f5a5bd503bf93a0a2153a9f659540231b73290ae7f251bf5eed0016a813ef8b0cb2e2bfaff590b23dc4b202ceb069186ef037a83a88199ddcc08484f4875c1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d03936fd2fb4ef675a9d8a495ac774f716ce2d4f21b7b05b81097d6a55e8066268c195719e600029237bb2bee296a81ae54a1bf44210bb387eff41995ca6f68fbfb640520cc13bd7f4751eea589bfdaf463667e9e3eebb3331ccb48f0e9ad4c4d3f52a2844c5f7874c7d430ecd2ddfcfe713e30c56da5784f950db6acb8f092a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902821c10f127db89ceb87239f88878cc98b92ec3ed8b8ad829ab4661b9d817091b2b4aa34d5c09c480b6e57f52f63b75396db79eb677021ec87518ac3b638b3ff98aaaec867e0efb8059b3bd538d3444624f74a8003cb1f4e935c70e238bcb57c5a183fab319e390d56be708f163171921bc2f2602cbd76f218ea6657acd2c35ae90bbe3c865b0d4de3fc39bd67983309a6fce9eab76f715de3e089ce872270c2a957f3005ae1fddd6a6b6cdcb6a931ccbab5475a6df2663096ff4008fcb681a691bd1254aef5ee56d923c50a427e7e4b99a73aeddfed8d017a2e5f725bcd42de38eee0670318d8a52ef12fa68a8753919dc95db7e14e7a3b4dd8f520698f92828591df62ac08888e1c8e570aad0c69dda337e79ddba0302bd304c2368f7a797d1e0d13d275ed79f9b2189ddee123fcd32445a0b6665253adfcb81acf8bc69c4668dc93529eb0b24fc04c608ea4abf9f9c988c1f65467b7b87e6573590e72b86f1d38cc2efd7de367e3b86874d4599b26d9f08b3f3490180d80325fd9914efc5eb1a9183bae733c8dd9876c11151c6e5c84a101b8600ede75d5ce52fa14928f9c266294b8a9dda7be93501a326ace83253bb3629bcbd1737cdc875da9aa24ecc66466393ef872ade843506bf6587de45dfe873094ee660dbed9d0a9a07f1adf339f66d32f8c8a623182321819995c347ba5eef8216e42efbece0f25e1553bb00cec58d85e8f8e26593bc7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366e4810b5abaf07487c81afb7f96e2c741409f4a370f93ea97a6bd648850fdc6949f82d663a1e447420f2cf05179af13964281439b8b427a6cb4b09af5b0cc1910a67b80b81ed02a57999348bdd390384d424a2522cd0278ffab5313e035bd402791a13a85e5c2e660174c9a1e69b8f96263917ef129d2001c822ceb7fc389f44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/930d453e2c53ce2b64bd0f4b950552f988bdbc20",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c493000000004619122f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705600000000f0a051aedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdb000000009966758c01ba080700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac63030000\", \"prevouts\": [\"901e38000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"2cff0f00000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\", \"676a26000000000017a9144c4b1fc943f04d775886b4f6d3c3c73bf7d3118c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"187d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cb45493bacb64184bfdaef659f2e68a43f5d1d327dfc30cda594d93dc7e3d57d802a37b3510d82dab4bdf4d6195b9af4c8a1df2dd8a601b49dccd2ea1725fb9deb0356d5dc7bb189d5700ce63be65cd47bafc75bda640418bb3b77b52e492b0f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93636d6e71a30deb5a5d82f1357d7fcc989127a050b444c84f666f959b2abd8d977a2a72d9a87053684bb0dc48081cf5c5135ec23a32b564c6b97b91a1c581596c8802a37b3510d82dab4bdf4d6195b9af4c8a1df2dd8a601b49dccd2ea1725fb9deb0356d5dc7bb189d5700ce63be65cd47bafc75bda640418bb3b77b52e492b0f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/934c8ad33d4e9c5c13372bc93bf26cf3107839a5",
    "content": "{\"tx\": \"00b76927028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4250100000051bf30848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c20000000038c234a6029a2a6e0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e76c020000\", \"prevouts\": [\"61da3a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"77cf350000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/hashtype1_byte_scriptpath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b73f22519c98fc73bb986a24583b60887b0a67b85da0acb5c14e44e24482799f1f2548b81e9f47ffd7b93357b6d67abd8803365637f5e37c889064c304d5bf8a01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b73f22519c98fc73bb986a24583b60887b0a67b85da0acb5c14e44e24482799f1f2548b81e9f47ffd7b93357b6d67abd8803365637f5e37c889064c304d5bf8a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/935a6ed5b994d0bfdaf42bf6dd6fef4ccdbfee4a",
    "content": "{\"tx\": \"2b467a1e03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3d01000000139453f3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b81000000002569e0acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4c01000000b62770a0012fe80c0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc33010000\", \"prevouts\": [\"8f265c000000000022512035205488698c55c3e7035f1484d2f513744eb9d8b6fb6f0df083f7669ef0bfda\", \"7d6a1f0000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\", \"d6c05300000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"8b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6e4d7dc2c55a7521ecc297ff7217b922438f95dd9c29c118a2bf5c9e2c8f8c84f32a50ac17afa49989b8cd5fe09550e31f987b9afab4d6ff7fb0ac42074cc4b38f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cde8e58194ee2d9158b02514bf803786a3307a33652aec833c6f0052c5cf85f6d8095c4fc48dd4a937a2ab720b4c7b803df056a6d61c0b781e24263fdb2663252a50ac17afa49989b8cd5fe09550e31f987b9afab4d6ff7fb0ac42074cc4b38f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/935dfd118a575d599a75b00db37955c92ef6471b",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bad000000007399e0b901dce016000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787c8a96144\", \"prevouts\": [\"ce9d23000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3045022100af6a7d7b71ea42aca50daea1b2785de692f5639191ca5de1a446b2606c3b70d102202cef98b741c37cf76638cd84a7a5ff65cee1d4c0336d88ba7cc0205b281bd73e02\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"30440220661007a625300efcb420ff2d48a0f35a2b93fc4f60ba6c97e850e702a21a8ab902200bbfffbf14db197035a482ceead87fec107f8a6ec3c175f26ef0334f76cdd58302\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/936af0357943e249bd7e428753fc79b7870c4f96",
    "content": "{\"tx\": \"81f75e6703dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cae0000000014a05bb260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127036000000002ce4eb9c60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702201000000586df89c03fad66a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487470e335d\", \"prevouts\": [\"52384c0000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"aa2a13000000000021521f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"06580e00000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d64c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c7d6bb54cde9cc6775748a201bb3f5d5704911b2e65f691925d2f8dff2efd34cd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51e30d689b41c4cadafebe300f1e3aad2e0751ea174af1d1313cd49baaa526270b3acfa007b318c5da81cf6562f4932e2754570ba3b679b809769f541be0a6b617\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52d6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366166923529a9a0d12cf4938b50b7953e2ef8bb3db7f2829ccd570d4454b0cea3ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b22a5aef24b6a1c01bacd2a24a37cefc04a347b590d10f3bd98469f969c355217b0dccf8e3471e4a61057d1540548a04f67f25f6a36812a8ea9d07747f2e4b3a8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/937fe4be2d5689c59d7c617e65996d41cfafdef5",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127008000000009184f39cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8b00000000b18bd5d28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43300000000963b85dc031aab6f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7697ea15d\", \"prevouts\": [\"9e2f0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"3c0a27000000000017a91486e5fab3386e07350db4c59e442dbaac96c1816287\", \"7c613b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_5f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"abeac8960f7dafe5a2e919555e6460b7298142019262fa2dd4a3998dd53ab06ef01fa95a8f5c7115cdd23c95b01baa6c114ff467c2c00d7034601f04964c964e02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ebe010b49f957d45f204485fbb45e4d2e39be523a59a672c79d6cdffc24e9d2478f697633ab9722ee9bf575ffd5cbed28ac54eddf8585cb75e64cea6938a04ba5f\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/938f94084baf3b93faae268cc5e094df56f01f7a",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3501000000d42eb6c660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ff01000000c3ef7ad960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270af010000003e9053a503f715690000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7a21d363b\", \"prevouts\": [\"1cfc47000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"edf4120000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"94c6100000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063da68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cd92e45bf75a1b2b146804c0ed0f2bf0edd954f9eb17213b8b1a71c9ecae831299aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb41dc38fa67d6e370c9f405c2af01822f370dc317d6e78d2f71aa14f0ce4de56d6ee4d75780d36bffae9b56136e6d27c02b8d233efdc800bb260bfbba6a6f94b87\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e3c96742c83ea0214d677c4de90733cc5cf86dd9f7c70b49cd7ec12a5a3c726d44455204ada9566561196f14caee307d16123ffe4b49d60aeadbae3e053e0a80355d713f01682c54eefc137cacda341f8a928ca67657dd1895f9a847e54f584f6ad20bb4e3465af36c086d3f45ee510bb6828f8cbf764ea9958c57f38670043d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/939a2a924292c7f549cc8f8be939826a3de6b820",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2800000000247f1be9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b470100000047d17b1904693c7500000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a62ec0844f\", \"prevouts\": [\"06e6540000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c65b2300000000001654142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_e8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"27816d2cc5e307295f9ba635ace825ae8c14604646013dd9594278abd50b430be530f3befb40017274871baa04f1800a5cd248c1b3a3770c186d0282e7abc58603\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"98d48ff1adcac3a0192abb8a2e0be7c8003f545fc28598db93a71f04f6a2c156240504bbd88a980304a4019c528c0a7dd3ca2c91f095a436811f65e39fb97f3de8\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/93aa13626c3895c12d82d3763e8e916a16a4fd52",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c1010000006ac7384fbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1100000000d73802e703a25eb7000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787b7000000\", \"prevouts\": [\"edca3c000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\", \"b02b7d0000000000225120dbe65d5ea7d032bcaa5c118e4e1c91ea90d9063ab0b7377212d71cac34e27d50\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_0\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"48dd24f01ec389c6aa1c7c4de0b543aeb7f7b94ce820364d0184fe1f53bb065b1f23b30375a33b2b3e6d1fe920de9ef494292be62f0839c8a86aa0485b8beaf301\", \"a841b52a03af9c7e163427d00515846e743a7742c851a17eed0e6750dd8bb1970a6dcf20fe11b9097be804fee2d1d2b5eb52ef5e9a3a3cfdbd591edaac5d21a173a27d205bb8dd0a0749cb58ab4bd9efe53f7741b168eb2fec9fec62fdb3b7e9b89307413f68cc5d210df7aa5e3a8eef4ede53f94819860a15e3df80d2e97faf8ec65314dfdc3b9b023b57ef2ebd8547c892eb980de90baf9dba38718d2c481766b51315650b5b30\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cb1e2cee3375e7a3617675c25794b8c82600f0458264a31e18d2893f71349a5cd20ca8a5b7d3b1bcf360b00e7a0b722e2c5fd3427d5a260246eddbdab3f29e162ee67a218d8499637a26bda36d2a17a3cf791d730915010a6ed0f6452f27224075229ccf552e66693fc023137dae6b03340574af2400f82bbc88f0e481dfc6497225ae0f110f2ee402496f4c339c19a1a603c6786c41be9b4f1c959b2ca4b7880000000000000000000000000000000000000000000000000000000000000000df81a15cb6157a997d23e8367bc6e778d43b26a7391e5efb842e07519fcf2f5399227a58e60ec9e6b42a2ed2fb9ba79d0d26d1d87db5e12175dd2f9c8b16ba652b7b3a6205956e6401c9f35d4a5d33dd0a3ba5495645c15232ff408091a30533520eb4d3a37acbfa4c2b9722f9927a216f07a961a50bef6bba63780c811be1198e724c90cae14c8ffc23ac098ba9b59d9b588fecbfb275ff754d9dc17b3e6dab8d918da947f768627accc543f58f7af31796b5434de8613084eef99decd2baf300000000000000000000000000000000000000000000000000000000000000009234f113cec6627bd6ac8487d93e3699e63c0cdc0619913cce44a51bb0f688eb39877db85e83f0c862d8633caf73a9326257144d7176cafa8629ff0c5b38202a68fe5f304ab2ad9df483dcda2ff7725fc0e7e89294fd0dc679c1a7a07ba414cec58399542820a6aeb2dcf95a041f323d25665f9fbca28886436077cb8be2b10e31362f5e1499ab046a77707a9c8a0c435df78be3b55c3a6aa2922cfe1a01bd14ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff31c7de372da1e17aa478b3e87520204bd20d956f29738cc824c65d8de94324675825aeb0fe9679d64732737cae4ba38ca353b68a4f3eba202b9e314708b61a2e127a0c4fedc2ac6f4adae18240490bb27d7b42d7a168ac08ce6ea079fee6bf690000000000000000000000000000000000000000000000000000000000000000079e65eb1dd2b124a80a8d35bd0029f27fad92fd612b1ff614a8d4a1e5d10ac90ca4c6b50bdf0ed8b864853222019b328796ac321814e1d88f0cdb52f5aa3ba6e58a400dad16b21b14843c4424ec0afbb1772a50e159adf93555f0a136120ec972364c2e6d4aa20a1a8760c5871a6c917650d01c13b664a51dff2bc2bdeeac8ab861982347bd397a1ab93465b080589fc2bf6ee04e3185af7edf8d73dd55326d7b5c915c87acd549339f916f567e3369a5da1912d46d34d7b79ee00a0f8f2ba621d95e82e83fb663631b922d7a9f430ff22c25e07756efeddca343b1c4b3a8986f764e232f2029831716841f4e2abbdd8d103f6085c0a1f56917c01df509ec2e54cb9151558f651cc1e1b0dd0592348420b5594962e953963c0c0e096ab00923e8ecb379c644d74c955a84899c399b1e8c36549036aff13bfb1fab7b36dbaf6b71072d7c456b323bea80f0c3438b35d27f68c3519c42d521cfd221c075e69f14c4dd61e158de2d244554bec2d52888252aca842988327a2f2c49ff1ad52390d29f53dee873326723dd1a456679a3d517f466dbf3230c244aef28d8c67137e393000000000000000000000000000000000000000000000000000000000000000065531fe14e1068f925b6ad5eddec6ccc3a1a910af7f93bed7d3c70bbd93b084effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c7429955b1371d76b9c5a03b2fed2fd7dceac38e721517ec9f63023b74898ba85b9b164b24a926af6531d00893e478019cfa474247430d3a6096db76e0dcf0ec2b7b2b03358038f744b4635e6a84169ae25b213a9b65407a11ad3ec283f8fc79117dfa1bbe4ceade5337c6474155c446f134c4d4564a096a9405b040d4c0de000000000000000000000000000000000000000000000000000000000000000003c243208e98b861d291ceb50342fdfcfdd2cc43175606849f5496c47d47e7b9f04e7c7f30e550162bb4e0f661d6d64b5508f6d2150ed0a6a176f58c2a0eb6d1bf98f69bb6b1d58ad95d0bcc0b605a2085e4dbc1d0b56b3d6128b4f3902d9f0dfdfbb02b23dab79a0011639290e791225b1ab6dc81fc967d21d215948ce50b05f9708d3303f22e7a9dadd0fa3d4fa152f585f19469e1fcc3d405562abbf025f8702f28380b57e16ffaaa570b43cd17e0b6725068ce5e1c9b1f26372a59ae55afef8cfe865368c14fff7e62b8a82478cbac8578808c103929716f2e137361eb7db000000000000000000000000000000000000000000000000000000000000000041b4fd78862ab3d40b1a51cf7d2d6a0288f4cd18a6612051787a5edc2b50167d0000000000000000000000000000000000000000000000000000000000000000a30c266ae1feccd856e1118cc2d68023e52e0de09538816b5ac79fc50efbe7a8727b36045284b7fc2ddccb6f164e73285988fe07dd03d753bb860f41763dbbb2bd9d5111ec067cdb62525b4849415ee86d0dabb4f8a73f6a30de4a539b3b3b95c54f52439fa5168156d15c3e37ab4d37225df79f7422a89d7e3e4135493ff2921ca0ce83222df7eb15ef31d5146da6f9e82f634324cef74550b85ab12337a9fc98fabbb879a80d0176390bad5bba043552303bbee8282dd8fe2449d37f8c088bb01645dd23fb480dc58884ab0e79d9d73494685c7618db1e70b517776321df6276416aa2b26db419ad1a6290893e169be8a70ca9a03781d069d1e58494e580e3a3d96bb0c10fdda9c69e5203b65b6c433092b434accb75594be0ef3b78e6f4267efa3be104ea80c6b41bdd8a4dc87e235c63ec296223fc649fb6af88b370344586eb6d563b9e215635863855633d8788ca69fed658f7b5051dfbbf42cf15878b6fc9bc815afb4af4c54f7088f28dcf9316d12f55d2d8af059fb8d59d6adfcdb6e068fbc7a9bab2aac249f58fa82f831ac02d98b64b4d69596372c61d3640d8dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff645d8253e8231e99b910b430c044a014f3c592f83c269553d49a3ea5eaefa182ba4ed8965a4012c5a826cbc3f0c69ebc16c1b50bfba73b679316f5b531956b2660a4cb2ace9b3bdeb09ae753192a0f8509bfc958c1b8892d68be28a91967f7e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000967247d014acd37115d25537b0a6ffd6d8dfeadd62c2d9217c5cd05d25c7e3aa\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"48dd24f01ec389c6aa1c7c4de0b543aeb7f7b94ce820364d0184fe1f53bb065b1f23b30375a33b2b3e6d1fe920de9ef494292be62f0839c8a86aa0485b8beaf301\", \"430fa5c2e82a4549f63114ce2424c1c0614b93de19eaa8338300d03bdeb1ffaa55051b666a7533d3e9c4994ff63915420d4141f2623de61a081f22ad87dc13bf2aaca326c4791cc9a669dfdb85d4a2eba88c98ad1d69c768615fd1f8ddd33bcbb04ff38770d988f6555bb4537b52701a08f315922a1c2f14c801ccfb0403e89cef3695acaee51e07030730102f873e4a8ed153883d0a69c7232b148282c8e1ae832080e1a17991\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cb1e2cee3375e7a3617675c25794b8c82600f0458264a31e18d2893f71349a5cd20ca8a5b7d3b1bcf360b00e7a0b722e2c5fd3427d5a260246eddbdab3f29e162ee67a218d8499637a26bda36d2a17a3cf791d730915010a6ed0f6452f27224075229ccf552e66693fc023137dae6b03340574af2400f82bbc88f0e481dfc6497225ae0f110f2ee402496f4c339c19a1a603c6786c41be9b4f1c959b2ca4b7880000000000000000000000000000000000000000000000000000000000000000df81a15cb6157a997d23e8367bc6e778d43b26a7391e5efb842e07519fcf2f5399227a58e60ec9e6b42a2ed2fb9ba79d0d26d1d87db5e12175dd2f9c8b16ba652b7b3a6205956e6401c9f35d4a5d33dd0a3ba5495645c15232ff408091a30533520eb4d3a37acbfa4c2b9722f9927a216f07a961a50bef6bba63780c811be1198e724c90cae14c8ffc23ac098ba9b59d9b588fecbfb275ff754d9dc17b3e6dab8d918da947f768627accc543f58f7af31796b5434de8613084eef99decd2baf300000000000000000000000000000000000000000000000000000000000000009234f113cec6627bd6ac8487d93e3699e63c0cdc0619913cce44a51bb0f688eb39877db85e83f0c862d8633caf73a9326257144d7176cafa8629ff0c5b38202a68fe5f304ab2ad9df483dcda2ff7725fc0e7e89294fd0dc679c1a7a07ba414cec58399542820a6aeb2dcf95a041f323d25665f9fbca28886436077cb8be2b10e31362f5e1499ab046a77707a9c8a0c435df78be3b55c3a6aa2922cfe1a01bd14ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff31c7de372da1e17aa478b3e87520204bd20d956f29738cc824c65d8de94324675825aeb0fe9679d64732737cae4ba38ca353b68a4f3eba202b9e314708b61a2e127a0c4fedc2ac6f4adae18240490bb27d7b42d7a168ac08ce6ea079fee6bf690000000000000000000000000000000000000000000000000000000000000000079e65eb1dd2b124a80a8d35bd0029f27fad92fd612b1ff614a8d4a1e5d10ac90ca4c6b50bdf0ed8b864853222019b328796ac321814e1d88f0cdb52f5aa3ba6e58a400dad16b21b14843c4424ec0afbb1772a50e159adf93555f0a136120ec972364c2e6d4aa20a1a8760c5871a6c917650d01c13b664a51dff2bc2bdeeac8ab861982347bd397a1ab93465b080589fc2bf6ee04e3185af7edf8d73dd55326d7b5c915c87acd549339f916f567e3369a5da1912d46d34d7b79ee00a0f8f2ba621d95e82e83fb663631b922d7a9f430ff22c25e07756efeddca343b1c4b3a8986f764e232f2029831716841f4e2abbdd8d103f6085c0a1f56917c01df509ec2e54cb9151558f651cc1e1b0dd0592348420b5594962e953963c0c0e096ab00923e8ecb379c644d74c955a84899c399b1e8c36549036aff13bfb1fab7b36dbaf6b71072d7c456b323bea80f0c3438b35d27f68c3519c42d521cfd221c075e69f14c4dd61e158de2d244554bec2d52888252aca842988327a2f2c49ff1ad52390d29f53dee873326723dd1a456679a3d517f466dbf3230c244aef28d8c67137e393000000000000000000000000000000000000000000000000000000000000000065531fe14e1068f925b6ad5eddec6ccc3a1a910af7f93bed7d3c70bbd93b084effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c7429955b1371d76b9c5a03b2fed2fd7dceac38e721517ec9f63023b74898ba85b9b164b24a926af6531d00893e478019cfa474247430d3a6096db76e0dcf0ec2b7b2b03358038f744b4635e6a84169ae25b213a9b65407a11ad3ec283f8fc79117dfa1bbe4ceade5337c6474155c446f134c4d4564a096a9405b040d4c0de000000000000000000000000000000000000000000000000000000000000000003c243208e98b861d291ceb50342fdfcfdd2cc43175606849f5496c47d47e7b9f04e7c7f30e550162bb4e0f661d6d64b5508f6d2150ed0a6a176f58c2a0eb6d1bf98f69bb6b1d58ad95d0bcc0b605a2085e4dbc1d0b56b3d6128b4f3902d9f0dfdfbb02b23dab79a0011639290e791225b1ab6dc81fc967d21d215948ce50b05f9708d3303f22e7a9dadd0fa3d4fa152f585f19469e1fcc3d405562abbf025f8702f28380b57e16ffaaa570b43cd17e0b6725068ce5e1c9b1f26372a59ae55afef8cfe865368c14fff7e62b8a82478cbac8578808c103929716f2e137361eb7db000000000000000000000000000000000000000000000000000000000000000041b4fd78862ab3d40b1a51cf7d2d6a0288f4cd18a6612051787a5edc2b50167d0000000000000000000000000000000000000000000000000000000000000000a30c266ae1feccd856e1118cc2d68023e52e0de09538816b5ac79fc50efbe7a8727b36045284b7fc2ddccb6f164e73285988fe07dd03d753bb860f41763dbbb2bd9d5111ec067cdb62525b4849415ee86d0dabb4f8a73f6a30de4a539b3b3b95c54f52439fa5168156d15c3e37ab4d37225df79f7422a89d7e3e4135493ff2921ca0ce83222df7eb15ef31d5146da6f9e82f634324cef74550b85ab12337a9fc98fabbb879a80d0176390bad5bba043552303bbee8282dd8fe2449d37f8c088bb01645dd23fb480dc58884ab0e79d9d73494685c7618db1e70b517776321df6276416aa2b26db419ad1a6290893e169be8a70ca9a03781d069d1e58494e580e3a3d96bb0c10fdda9c69e5203b65b6c433092b434accb75594be0ef3b78e6f4267efa3be104ea80c6b41bdd8a4dc87e235c63ec296223fc649fb6af88b370344586eb6d563b9e215635863855633d8788ca69fed658f7b5051dfbbf42cf15878b6fc9bc815afb4af4c54f7088f28dcf9316d12f55d2d8af059fb8d59d6adfcdb6e068fbc7a9bab2aac249f58fa82f831ac02d98b64b4d69596372c61d3640d8dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff645d8253e8231e99b910b430c044a014f3c592f83c269553d49a3ea5eaefa182ba4ed8965a4012c5a826cbc3f0c69ebc16c1b50bfba73b679316f5b531956b2660a4cb2ace9b3bdeb09ae753192a0f8509bfc958c1b8892d68be28a91967f7e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000967247d014acd37115d25537b0a6ffd6d8dfeadd62c2d9217c5cd05d25c7e3aa\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/93c0123f1118e26a15aba5739d9f8db784f21efa",
    "content": "{\"tx\": \"8e58b9e9028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b301000000df8399ad60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270620000000088e2538303dd3145000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d6bda649\", \"prevouts\": [\"7be839000000000017a9146704ae21c886c9ded757e2b67d582abfc91902d487\", \"05500e000000000017a914f955a33e905fb6c7b7e694c8cef25993577deafb87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"165e142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"2bb1a56194abdec51c8331e26013315467988ddbcb79c43216b1b1c8dedd9980c1370b18bcd322d72ddba207457f2254b5a0de08eeee92794bc91278330a2a49\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/93c6f793e89f2bbe200dcd083729e8e2af40c2f2",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be701000000e408386d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46a010000004e24027602e24e58000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48790000000\", \"prevouts\": [\"6c72270000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\", \"f5703200000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"167d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b5d52fd3619198ed9f30c361c888b4873ceed26f5355cdc470271342f0477c7346c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa654bbf7a6388e898988522fa7e5d2ba9e6951646cde29fc617f56e0c3d8e4d50afd13a3b2c4c421c5355668ae9e4eec8bcb7618363c6e35efd204a43726d22d6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936623e05fc14b6e5762de92ccf74a58ef66fb3d817a3f0508030881bf1f629d27293bd46d889920012fd3d654be778806775b1e6ea0b6836161b66543651907968afd13a3b2c4c421c5355668ae9e4eec8bcb7618363c6e35efd204a43726d22d6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/93c799f74d4e3a3b8dafa975cb2453af687a8872",
    "content": "{\"tx\": \"d505974903dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7d010000009a3a5dc3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b710000000071f6369760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f501000000c7d508ab0473fc5900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487b6000000\", \"prevouts\": [\"a02e250000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"b3ca250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d95a110000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"367d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89a25034f4670dba2bfd8b532fe5e2c4399b1757245b955e89574c41111a3f13a78448a7537869648343bbbdc00eb4ac0785a5f2aec0111e81b0d25ebde82a92a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93618278c07a795a465b0e01ec560e597d9dfa9576d66260ea15112d4b854280992e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89a25034f4670dba2bfd8b532fe5e2c4399b1757245b955e89574c41111a3f13a78448a7537869648343bbbdc00eb4ac0785a5f2aec0111e81b0d25ebde82a92a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/93cedb385de6371ec85a3086d53c93ba0e1c6926",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ac000000001d48c503dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5b00000000989542d002fcd25600000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748795010000\", \"prevouts\": [\"0bce3100000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\", \"9010270000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"ae7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8b509ab67bbf3c81955fa9e200008a666546f84b8be37a00b57f87c80ceedbec790189ee9b6b94816743a58868693b6f0ba58cb07e4c6d5ed2ce590077e887d5b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ba812021bec55125a4043e092087428314c694c64b021517d83eab825dad5a3d31f1765c4043c65869fc44409698468cef1d88a3aab3981df946f88d25a1c2d5c67b1d078674a4d97323398e107b13ccefe9299bb9116e21f935c64f37bba24f619c7e3fc3d0f43b284295c7c76b7ff66dfc7bbdbc495ce3e8e20608c97360e5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/93d43e9d7f08eba5daa4d394a95703498c7e2139",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd400000000b4b636e48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4350000000068748b9903215e57000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87390ebb5b\", \"prevouts\": [\"0e7b25000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\", \"a72b3400000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090254786fef98432f4ab257de77d302d189d2ec0f232bca6e2b1fca1feecafcfd854aa110d377d2578d0c1fdcfab4625f708ec4a38dc8cf6d91b4cd2d6fa7746fc563a7f7f0be9e1c1dedf1ec82a8900e7f329d7ed68e76b2c3aa579e3cd196d7366dda6ead2d7a3cdb21a3c8591c9c9183c51bc87260b4343623866120ffc72049ddc4812e61ad04bbc17d557f01e129c68f43b2ef82823b92d171c9fc5184eef6e77b45a0584b9d6f8763628e8f834b0e2ce9a08a6111927c0338b35615f221f46b6b6c43bff73856bac7ab70f3e7781249fb9043d9729ec319cd59d47c4bbba97252ca86c7c979feb223705d89d73a82bd768709e6e3ff0cc4c20ca28ad786041caa0828c6c8a6d2d4c1f99bdce7f0422cc95fe8372c33eca9e19d8f7288ed49001b819b206bcfeece64e3ea9867467f0697ef1e9e0756ba8e47fbd131c2fc0be13b0e15531b21de162d6151e53382d93941118bbe01035677c4469176ae13f991dfcbdbb07502cf46281b3c3b1b9ea1d170c437f5eb01e94331a544eeb07430ae71b6b229166fbc7682a8eb6033b5c0d53f2b133c9069db2619d299afa0627f989aee5400688ea4e41bf5cbaa0a17e02af5d12be9fcf82259f8cdfb7c0795c5fbf2b469b2324f531658e4048dec8544e6ecc22414d82aabeea7f98face78e63cc33e642aff2b66a041216741c0fa19009745012091a87683d040341ba6a7352234ab0357ce803479275d7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93661747dd2a7267965918e87a9e7a48fc27a69ab683578f071fc2334710db08db0569af0f9e86656db21fe5e74d4bdcdfc2cda5437bccaf9e3d568ba1282fc608d76e3192190387ccfa53649887be3b08a6a0e7169a64b02c3bbfb054cf523373b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090231d74aad9ffa52eb77299edc3988789dcbc5d72ab76b297a80f562b7cea5a5dc21290fbfdd52f58fa0223a8c9dc3d11ea859c976e4837c697f05a286628fc13d83328f2e61534a39c729e16b54a3d54c3d9c1517f491295295b78f4934daa61986b7b02d6747ced33510e8b7cd3aa80a2131bc13169390dcc2540e87bcfc7742ebd4cc19e33993f11974952b38742181e1e73f4626a124a43656f4da23c2e78afe27986d9a79d56140391885cc1c0c4cce7d4c7fbfe2c08f6d447f3116e3674593c51212b661e7b791dee5b677c0fce3d524ffbfdad7c72dc4667e3b0a02a260efda42351cdcc6c792472e22740d5732e8267cde1c05cfcfb9d9d3610dec797b67ed9a88b832d9d09da1d46e9444068b00591ff70d0524d2df2fb8c61afc69dbd903ad7efd7b112a5dbe832abb52433bb39352690574e89330121f6683fb8d13a0c6096f1850f752b0976646fd2b8aad149048b66a74c8aa3f601c79734bf15b184d79a1af4281d6b68c6fe483848b1f19958ce6d1aec619c0d19c7113d5ec84560f716a7668c76aa54a39afb08789520ea58f18c88ad778f442fe97bdbd5c901819e62ae3126f82427110228cb9c8e33706abe8e7d33235abc851154ad1167c2bb7eb124781ae4fe0f0ae46067ca5373b7b987010f2aac7c3591fc839ca3f76722bd645aeb1efd6fe1137905af39a4e65fb07882d5960e3a1a5c7514785b68751fcc61aa138c620de7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d514c1a4ef98c473095d2df256e4c96a081ff076f8ed25b9a6c5f4dacfc5de1b1d157a61376c510bdd1fc860151a3b261939fa407ec1a2d0490cf2efc4278abc783\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/93db6d7b5e262a03c9f6ccf71ef4e8de7acf6fb6",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c90000000024f8cfb50281b62f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478786010000\", \"prevouts\": [\"7ccf310000000000225120a283e1ea0142d34d03fade4b28902cd262d82bab6ae3891658a9596d967dbc43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"617d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93680e322cbeba9447e623c355f3a00500243eb51ea80336533073705560965e3918a99f3582d6399c0406dfe65dca998a5ce57b7e950df5f64352e1bbf6c7fd210dd304186c0a2faa80f59261766b0cb9b0760b78eb1f31f166a6f091ab62e6898\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6e0063b43826002dc6eba62f224851f0eabb14759fb10c707a6afd7fdb59e93aad3ab6b2d4691bf881316931c587f0a213fdb9026021e80f212e72f88982a6bfdc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/940254cd6f8f945bc5f1edcef83ba2afc7edfdef",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4210000000088e395bbdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9e00000000065185d6011fae600000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc33040000\", \"prevouts\": [\"64d14100000000002251200aab5f0acbd570bedd550e6582d56f36bedceed0a29e5b4b9333b469d2c71737\", \"cfe726000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d0fe92aaaf9bcbf8f57bd6244a8fb4fbc0ca25d6d0424a43c103cee319c92082c98e5e9b0eaafdadb9b7184639bef269c7aaacc3aec400bafa574ee50a78d1c937b14430a19c2205facd906c64531600bb76adc53c9239ecd75bae8c55bd685bcf3ff5e4714c7e8d810364dea3179289049fc10102165a272bee60a9bb0427608ea0c76ca562fdd4d43e116602f3ca94b17365734a5a0ba06a4ca64c0a9f137e7ff037a8161020c2b9003b47a154a213b107ab80df1b79fe463c6fe3bed41dc1bcf455f14d4ddf7dfb8ac1d65a0f9a0aacc1b9c81335ac9fb2363f9b6fa9058f80066a0732d766ca0ea37d6667f1666075ddaee7b27d19725f1c2486ee4bd8ac431cf264f79215b64b507ea97b1af114e87dbef89fcf415595792bf33ddaafe4e9cf134e006f62ff0b1122ef3f2242b819a878fe17809a9597f28045074ed7b52974e9a2b2f05315decc5cee231aa321423b241ab8e9c1b20a1521f4d37ea0747a7ac6000411f3fe8ca75807e9a388bfcbdbf7a379d660bf95a051a3d46e047a38bdda72b3636fab9ffa0c34167e5afe27cc07ef32aa0bc86e5da4d4ed317ed5efd400a69b89be6d90d8d4e982fbed2549fa4d4e31d925a249114ec3f5d9d482068eb691a4a3ca0f220a499ef9de26ff5dd482f47ba408f57ae2524dad882aced40d933ebdc6ec50f04f74ec925805b936f16eae8e504713ec623a73a9964da95ef83820d6432ee37075\", \"247d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e85e7553debb7d46df339c30c507d2c3e528ab4da6adeae898375a123e3f0f1c20ee08d5698d988fd8465309aa10a601f39a775c4be89f69280a5de9411e45585f440784f6f41cc1ae323b623cf5dcb000da45020704fab66b6b5f2ff7d67a93a3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d8ab9144589dfd188ed38c29a38146fdfae6fd14d7c3ad459816265fa1894697c74a9e81531014e365716550c9dbfba913e7c388df5aa87a9c914bdea04479f13aa5ebb240666c4d5ef29aab31796575a12d1576f0e6698a07473e2ce75eeec88793e9ed55dae3de690d6b58461f88f890c4e4195ff4ee742d58b88f125474b0ba4bbd369820b859e91664859466c8b7ed0396441f26e2c21c0e8ca389bb4a87ba802ed78d31367e48c32b7ffb721bf41d7729610cc9aef06315350089fd04d7fe46c04babfb5e36ac3ff677808d5e139cbe9343cb5224d8f6e230e06d833466e300ff1d874b87c81b4ffbb9c262af0fbc8c67293ff78f6f3c29a2404ba660a6712ea7c4f6298cd80669ebf5acbd76c916cbf9b9eba54642b17d50dd19abe9cf598a8be8f4cbfc845b0c281009da22f2601f26d180c33c922d6915baa2c40406d256800ca4baac9a3ee509c5e5fc178737f643cad6cbccae98ea54370671fef481aab536b786ea76e462b473a60c2133ab4e0f52866bd71552cdfffeace9a551c0bf894321d39efec519c272fd60c0604baafcd1177665a0d02c83eb5520db7d389e3d6183f84bfb17660592c001c0bdeee2468aed3f6f562d87aa1f2b0fe0f8c36d8b7c40e1d9888c591005927595391b443efa5a6bb9408ac3dcfad3d177d97a629e9b435b2e2df4b44046ac4a818ba0c3063cbd6c3fd178f4eb6d4ffe032cf8dc0552fc5173bb3675\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93624d31f15a10278dcb4f9d1f0a96cdf3049a06339797676c8885dddd4f0fc93a7ee08d5698d988fd8465309aa10a601f39a775c4be89f69280a5de9411e45585f440784f6f41cc1ae323b623cf5dcb000da45020704fab66b6b5f2ff7d67a93a3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/94136714739c4978945621f669ecaf025dff07f8",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfc000000001e5111c0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf720000000083aefab460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270490000000053752fdd0376fea8000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987cb000000\", \"prevouts\": [\"de10240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8c427700000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\", \"5ba60f000000000017a914a2a8d85df2f20a0aaff7224012fc4cee13e29cb987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_20\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a090d9990b2e412cd6e3c8e32f54fda22d116b9c0bb0efa2dfca7db13c0b9e6e375a2108dc5208770275f4090b58cd9dabb9541452357807808d9894058659c883\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c9840e15d47a73e5867c99b9844c7b2b14ea7dabec79d1143b5d1e2bfa9734cce169380b194d264cb4e2a3914a690403441bd5608735929f1fc3eb4bb8fd6bb020\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/942302c74767926cf73be9bc6753fc422157855d",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cab01000000c52c83f28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41902000000b66db99f0378a38d0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f874b030000\", \"prevouts\": [\"b33c4b00000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\", \"74f3430000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00637f68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c177cafa467da566f6ea98c1f090f5884eb8b4c26177aaa2b6576cf2c9201f80d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51d82f8c55e99af1bc6044802eb870171f459184b3c99e354e12eac4f204be9c37cf5fd42f9969f7f2472ed1fa62ffa49909a09466cf06ef7c57cb1be351156c54\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362f7be44faca900f8c301ab589905499652f78692082c5eb6dfc73a67bef26ea6d1e2e06d6ff5c459c120ed1951ff2f8353cc05da31129bd66db4aa2f495d014ff8d5397512e216c7ab52609f0ab27ccbbfd2b7e561d7599ada55e292956af911ecddbcce676de51918ff82e75e695523ce4d8df7d4ec353d45ae6331617767e1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/94232b6796277453192019999be8b0fce849e3c3",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be301000000fb36def3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb301000000e6af33afdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0c00000000754fa2b201d3161100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac7fabae57\", \"prevouts\": [\"c6bf250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b787490000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\", \"1205240000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"1a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08240401d3043d3e54134521a2f6b274f3ac0e46a5b9a6f95ac49ca3a75270b4793801cbe9d84ce1e82e006940c90d66235295537a514918e448d1b01c99be1031af2727a08c83da142d000f7f66d34a23554b296f940ffe81022e50f50dcfdd8b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360dfbde9ab9ff110150d651dbb4a3d630519bc9a746ddaf163b71af588c3b00d4febf22132d9643e24ed9082227473dd30d4d39a0b990b222eadb4d87d4a2f8740b87aa3d77021654e9bdded249075f42755a492250fa9a6a44787c57353d93e356798b11c96dafc2935d577afad31a6537ce4b1a48ff27833822cff5fe95a51e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/944304c86610b738afbff55026632249b735f401",
    "content": "{\"tx\": \"5e99ba8803bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7500000000df8a91a8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3f000000005c7bc9e9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0d02000000a28c08c40314b9e600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75c6ed459\", \"prevouts\": [\"48417900000000002258202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"685e2300000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"f0a04c0000000000235c212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f94c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c138752b88f442304cd570a99b7416851da048b7f1df3ec1a880a296df45b544a4dd4bfc6549e8d5e198b0f1e67d147f6db02444245a6cb27bc19444f2462468d332399bdd0fdb741da8d579adddb10dac50c4b595c0031ea1e156729d78e3487d6928db58d705af4b513465b8e8f739d066723840f3c873585fab69756481ab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52f9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936546f12ea3782fdfa089a8659f2ae7491ec9907437584497a98bb88f5268eaae43f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082bb0de8cab6875867027c85350e6845db37b89c1faa2a12b075d8db116249f7bd2367bb7d11bbe7d9666c447942212a409021a53e3151df7f84d090727acdc4c9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9447c6b9ffec17e55cc04961dec9cc9affec21dc",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cde010000000845aabfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9300000000e34899db029dd8b10000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87a5030000\", \"prevouts\": [\"4f865d000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\", \"302c5600000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c34c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667037ae3d106809ce95ad6513527bfd5a0b48627df6eb2b59a2167c6498316646ad1aa2e9998afd312977ef35369de24510af161418b16660639891f4f8529ff8cfae4f24e00136258a4229df9ce1533cc743f70cc4e5c0214ad74c09f63cc0b9de97a2505c9a0de734aa1a6c773f3979bd21cdf34ebf80e6ce3c625c087f57a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365dd02223ca4597acd8de63d12e0412289521ae63f6f7ad5a46a5d7d4a8953badd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51073db8fdd32dfd70cc3c0b801d057b12e5f9f3471dc2e8803f572b477b94c5e2cd8777bf679e716871b092f46e3a69645e6fd098b2f58cf3078cdf1926d6f261\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/94862fb03e48c18301c8d883c0b89da06351e369",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfac010000005fbc51e78bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ff01000000a025c78004003eb7000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acfa151a24\", \"prevouts\": [\"c84d7d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e9ba3b0000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_4d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"eea2c9edfa24f76bf4760d2a53bd5b8ade8432fb437d2ea08ea102ddf0a886847a9109e356829c1e5ec30eb7f17bb5b039959fbb21922fb2bace86851ca3037f01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"73706fe5284f98b0c6a4177669acbc4dc59fa654f9e1420e0a99696196bd82863daf911dab8343e09409419414b646f94616d36728dcc15f2b90c8b1c5cd8dbd4d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/948c81d5b83d1cdb3423d9e81a61becd8bf2a7bf",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f8000000006d3588dc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709300000000775f78d38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45c01000000bf2c651d0114714500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1f010000\", \"prevouts\": [\"14030f00000000002359212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"0f160f0000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\", \"13d73e0000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"99\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364d586cb5de2dd3058dd7e227544d59b90431907c0aee9f3c45dbe5cd5ada47d3637edb6ad97271a1ba84afbf70caa284b53510d77fb53cff70120791d9457d51af95302e7a08635545e6c64d05a20a7ff60718981ac8a997d809f6391d7b2d9241e79d00d576d46a63d36f208105835dedf99b7ad1f6575dd8e28af32480c198\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a4db2b7303d128165c3aee76333e625284db46e202d1b30be35d2598f7d6b886c0b317c85b837bc971133c463a5a02b3e438f62c623f33a660d87550a4209620af95302e7a08635545e6c64d05a20a7ff60718981ac8a997d809f6391d7b2d9241e79d00d576d46a63d36f208105835dedf99b7ad1f6575dd8e28af32480c198\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9499a40681e896adc4c45047502a358ed7cf1237",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0200000000cc03c0d5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c680000000072bf48db039442c600000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acc4ec2f20\", \"prevouts\": [\"e2656b00000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"65ce5c000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3044022049ee0c47c4f3a735b510cb6f85e3c6bcf9d275e29e5f7f2f3693e3ccd37efd7802203f2307995276e4ef52ae9b8526a9d4980553586de3f19a457e49e2cb25530eb483\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100e83255d06c540e8f2511e4bb337d3f43cbd43f57f38ecc1711fc24a9d900884b02200a06d832866bd94d4ce0ec6a694cb41907ea5dffd79f2d723a99711fc0014fa083\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/94a9f7a609640945c820b281c9b05d992b0ac4c2",
    "content": "{\"tx\": \"c7be2d510260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f2000000007a27fcd68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d300000000f23e2aa40213964400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898778fe3e3b\", \"prevouts\": [\"d736110000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\", \"8239350000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51afd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173a144e2b32fb029cde325456c88021dd04a80b93e0665f7e39c1e8a56bfdcaf4a64b5cd80fb8cd7c947a98554a389db356265b198fc72df311d010d98c3d6e3928\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369849f93802d015225ce464a5059afd3869fe1ff89f107510c0c7d17e487c82c619ca94dd80cd6ec848cff445ef1653ae8d91bf4217e3b4bb0faac1831ae9489bd0ff373d5c06b418f4c5ba421f2e23a69b22cb6c2b7cf326686bcbc29e387cfa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/94f8b89ee92aa4c7d64eb59fa7c8811ee71c5de1",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bea00000000ee0a502560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fd00000000d7a42f82dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b80010000009c57242704fe4b5500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48746e08936\", \"prevouts\": [\"2584250000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\", \"ec9f120000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"64811f00000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902680cc4d69146017a87b95bc547afdc8c45fd5312dfb8ed85131cd90383e2229ac196cc1b7148264c63efde8ea5c704d3b11238759cde1ce9235761ba139ed649fa688962dd8029b5dee8bc6fb982c30e5b06d9767cc362c4b9390a68c43e16bc1c1881ef11d328480e30df61013ce5a8af6ccc1d5f007ad18deac8d334d8fad10a0f7c3a47fe4f4113b295d35c14b92870e07e8dd29a8b17beeaa043d0913dca2a424c8d5d9d41ba2caba3b8adc2b0701a1d51be9cb8c2355d8ed6c30d02cbe514e9ba86e9d6146e590e8fc5ee991ab01be077ed9e50ee4b79d9dc7c1b4fb696fec7f50f9d12dc5c52138c30d07405a8074aa265239c4a11127d697b0d28a005ea83087d7a292e13f36f12fa02f3cc254c18fda00694af2a203ce13a3c056c9dd7b463bcb560d567551ab8196949f358a1fb04b557534191ecdcc62a0168d46b57e8a79fa88a3f4c899774ea337268b029300257e83616ca739b013820230ca81fde2507f404a41f127600082432bf097b260ac0fad2113dbf5fc83e0b043d19a51b792e819d76ae730df85361497cd1a6b1e74a57c03373b6b92190784dffdf55eab1a901eaa1e1f7d99b5c1aff1c83c2ce0e63e8d757d8ac0a1ebe38cedf8d7f4edcf6f8f94b88f70cf7967bfc8f26b0fe0533a8678f053e8c12776e6a230c0566250e4ec4d28409584d8f5625cfce5cb6e6b019fc0fcf554760cea342cfbf2a0765165ca163aeb075\", \"8b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082d8095c4fc48dd4a937a2ab720b4c7b803df056a6d61c0b781e24263fdb2663252a50ac17afa49989b8cd5fe09550e31f987b9afab4d6ff7fb0ac42074cc4b38f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a1e8be2efadc6e1b0482eeefecf4e0a64bfef0392b24f5f1c3f62ef22ff58a1338b60654178185c84b277d68f45b68af128503a812dca3290351a5adfb9df0e90cd2624337b3135d7b435fbce48abb693252ff88972819c5a11d19ed2a6c8abb6cb3516175c7b22545b775c2fe6dc390c8b8a873002b0253055d69d2f650c7d8861bf0913a4f3d6de1ae14ea0d8420607391fef732362fa23e3441142d31f166a095c3dc8c2455923625acc971f12be1b3941ebf25b414fbc6a503f62b8be062c3bd6ad3875438b45136355e1c8a4208a077492961c2dd91f4437ac9fc785c423b4d223fc8f11ce7aaae64a7651cde0f8a8b341bd419c60e9347bc1d2af15ab87b484d561051118c34dc18c648ea49ffa0352e61c3a51f0e286325e5a1de2cb842bdbdec170e69ca04d2fbfeca4971376d67fb7223bca0b899ff426f872d28bba90bb2fe075ff5454a8cee45bde09db8c05634ad3f2d74f96701997c4a2e4a513c0c9b281a5328959d6154c48e18c8aeb46fc289d106379c480836ddb931d85fe4b17f7d1b3c2bc34fb101fb86cd16474dfeab80818020e76fdaabdf54ebb12214d39331489476f40e839735f9ddf5751d1fc9d4b6f6c298919abd91709350c0d9f30b0baf5187a823b78ecd1331ee94fa6b2eff010fcf9f491c8f09914f34bdc7c935eda6f7b8f893fdf2237544e2e5981ddc0c6d5a5847e2e5d2f0d382affdd29d08cbf8552eac8a75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367791b2bfed2b76187482b9df9c71e44fe3c2ba7cf851c9a73d39e20991cc5821da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e86a27b1635c4d20405f5eb1d8e1a675f8ac3bff005ffde1fde7fd53008c3096ff2e441b555c43a724b579c479d380c278f8ccac4217fbfdcb96526a1dcd96287\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9506e2eb82ae6c5a245403a82c8c36c49e7dd19a",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b650000000040181b27bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfed010000000fb6f19301b3c016000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487fc000000\", \"prevouts\": [\"9d322100000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"cfc2690000000000225120a276d97cc1349e693e88dad472b695a8145cd2b116efbe16166838c11f43c819\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a90b348cb78586aea9abc13e0f8e119b3cb755ae0df5cadce93cb6748afec68f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a07616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9512c13d6e0d292adb68e6b0ed8f466ba396e30a",
    "content": "{\"tx\": \"0b70bbbf028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43d00000000a3e895eadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc2000000003880c1b703b6b6550000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc72396585c\", \"prevouts\": [\"eb37320000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\", \"98662500000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"ec\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828ed780475d4e357c95738577784a2a9ab12c45b3a32d4ee82ce9965ecaf5f6bbb17c496824b626c02ab547b0eab6d99cf720fc5f5950d9f56a4e0f1a7586e075a9cfc1055a4268af502090450271f6d102883ab16be8e011ae292d6da52fbee7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368fc8101a1f14b662558c0e8593c88d9d486003e9c8266cbc14341013234749228ed780475d4e357c95738577784a2a9ab12c45b3a32d4ee82ce9965ecaf5f6bbb17c496824b626c02ab547b0eab6d99cf720fc5f5950d9f56a4e0f1a7586e075a9cfc1055a4268af502090450271f6d102883ab16be8e011ae292d6da52fbee7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/95285e78757c883cf8644bfcd7749e4b08cb59c4",
    "content": "{\"tx\": \"a77294ea028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ae0000000081d69fbb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a501000000e28dd3c903cee874000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7961f030000\", \"prevouts\": [\"b5783700000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"506d3f0000000000225120fd767bc2bb07e4ca9357cd933b3dc41f590c00db442e0ea12a871bb96cd7e63e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f0eeba7c0eacb784f7272b1ab2a5d964d7d07dcaa25aa39271492b80a379da12aad829192d8416594973be53751c2dc095bf33e54427303a5b8b45ebdea5dafd99ead232f95c20736c4ca28d40406922684ff7a84c70e432a4f6a4d4d1893c4694e361b142bccbbefeea6ac26126d4f4fbb610699e3a27d96f99d1b67de22f2f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365a92a11deea73e637f6f589c2d30a1664a56b9683feb403a53636f2947938dad3fb7770917eb0311339f7797b42ae31badf39be5fac652227efb4e28a80f4e35f46b3ac3e0eb552c07a1c6336d6a3e2704f93e82a6d5b4a7907113e7cf17bb16c711f738010c3c65afa09c620b919c88f85303c8a6c3749257da2d218fa6976b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9528c094e6823258fc43686ee4fdc5d619021a94",
    "content": "{\"tx\": \"aceead2a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b940100000081d662d860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270db0000000091e8ebe1033d623500000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acb2000000\", \"prevouts\": [\"f89c280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"688a0e00000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"b37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670eb4afebc61f249a9d49057fe9b24516a5ecc1080546262d6e5ff85cfdb211b95b7d6bda25431cc8e02e54f2e1c95b50d23fb11d52c977ad7d2dfd588f90c1962055c347ba5402321504576f6c37d0c6cb1d044ee75df535bc9eec0560634a7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e846f47172cc098fd97d2a24de1b24a28ec1a07dba8121311e99b8793de3d58a2c368ced990ebadb111ebc3982eac7e308f07f99a9264ca6c949f56162916d7884\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/95418ddbd4a17ea011fd39c57c1e4389b711dd7e",
    "content": "{\"tx\": \"bc407aaf03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6600000000004780dadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9500000000b762a584bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfec00000000c46558bd01b5e525000000000017a914719f78084af863e000acd618ba76df97972236898718b7f726\", \"prevouts\": [\"d3706e00000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"a20f210000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\", \"60e3700000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4ebe99bd20db478a4ea38512f1221f176d7e5053d85ce724541b970d7e312b589d332399bdd0fdb741da8d579adddb10dac50c4b595c0031ea1e156729d78e3487d6928db58d705af4b513465b8e8f739d066723840f3c873585fab69756481ab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51a022e8e4f1240b3c3d4bb5c70f2b4ea702b5d8a670f036755e200b5950ffec075bb8659128f7d307893f477315172a6feef29cf3fc1fd27176c3d23e09b029752367bb7d11bbe7d9666c447942212a409021a53e3151df7f84d090727acdc4c9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/954e0aead2f1448d168416547f795dc8baa7eb10",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4b0000000063774ab860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d500000000cc67262401117116000000000017a914719f78084af863e000acd618ba76df97972236898756010000\", \"prevouts\": [\"628d500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"2452120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_a0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e1a9667d17a1e75a6cc9b884de02170067a2cb8a87597ae011abcb81b842566b811bb42d1fbca1b65f2f533d0c90ecbdda5fde3c77f5f764a9bc4e4d90e39b1a01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f345510d74b43d1b7e579d4942af46b8fb961ac81025798e2b95973a88e8427415a940f02fcf29c821a73d5cda19b090f1112a8c0ea74e04dca5d390688fa817a0\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/958966b97201943c2831502b3f5bbcccc2d1b2f3",
    "content": "{\"tx\": \"b063326b03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfd00000000d54304dcbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe900000000f78d71fd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707000000000eeb7db83038ea0cc0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df9797223689870b010000\", \"prevouts\": [\"daa652000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\", \"f0016e0000000000225c202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"33870e000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e68b325ef03fa84280a54b34dbf53a9277b395ea2fd16e226cca8ec132028a05ed3734d002e1b197dc424e81a0707786eadf555401954d3232adbab2301adeb7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/95957430f0fd0b98963bf7080efffaa2efc45563",
    "content": "{\"tx\": \"760cfce6028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41e020000008082e1c6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1a010000009b10e7d2012db07a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478726010000\", \"prevouts\": [\"2967330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5d51770000000000225120bd5bbc5b1bf3fe4b708ed63f9408b7b63aebc344d9604176f38c41259c503453\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936848548a800d3e3b730b60aa08b661ee08371fada4c88e7cee944eccb1db67c8820e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e10ad4e0ac96c164f1885f81b1e139f05879070681278f68106e4fa54c23a8038d82745fb8509382ce1e64511ce3c1d55be477e9687cea49eaad32aa52098dfc07\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93654ba7869cf3ca4b2b50b47f0812896a39a8cfc31061938cd1631f43d1a68bccf0ad4e0ac96c164f1885f81b1e139f05879070681278f68106e4fa54c23a8038d82745fb8509382ce1e64511ce3c1d55be477e9687cea49eaad32aa52098dfc07\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/959b1c7bccd9efde5105f9deaa24262e6171f127",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6b000000005c19b047dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4300000000fa054f9360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127072010000002e2b715c0281e4d10000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6940e7f4d\", \"prevouts\": [\"ab4c790000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"48984900000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"4c73110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a7e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb482f3f1132320d0959751765567119a0f105dea34ff98e3a4034ab732ff09dfdbb3b80bda1b133ebf5523b41a15c88aa3d5202619e06dcb6a8f4a5442678614e2fc39b3065f81e3c179a5faa7416c7afc60db6bda904d6a600fd6a7a1aeafb2cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d615c4047bfcad7b0449dd11a2b25a6fa73c03f83d31e78968dc9546bdf436c01f4adb00685858cbe7bcb6f491f781bc30000d79c976ba3736fd7b7a39329ee30cbb6a1bc9c683a9249ad6bea98cd3b225511a23bd3763b6594afd12d3e036b5faffec7faeeadfdc2f9d17b998c1a9153f333fbb08a178932d29a7211446b62a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/959ef5c1dfba6621fcd8365261b27885ba0eedfb",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d70000000095241478dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7c0000000022e144c003cb9d2d0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7c0000000\", \"prevouts\": [\"839b0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b091210000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_df\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"af0635ab83a466aee85370db6138ba6f81a6ba673b5166ab7d2d00abc52b902073c09e41df60a83ed9e62c1641786b24221dc6f31dfc18d50d14d34e2081568b82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4349984b549f290e220e0f2c73fbee085e81fdab3eca4143e77ef7df71aabcaeb3d61669d45a10fcd71f2f4163d6a3f8e598bf41824b9bc5e6e18927c020a291df\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/95a04b0c50967b773d91751126d1ffe273287347",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2800000000247f1be9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b470100000047d17b1904693c7500000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a62ec0844f\", \"prevouts\": [\"06e6540000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c65b2300000000001654142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7f4e68e27590d41fc1d96b76995c0151017c929b2188301d6e02341a4932e699b7d144d2e1920d69af10294c7f52fc08ec27b4dd1d77a6e98601371e91cac3e5\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/95afe9b1e8db35a5924aabbffc0a617e6862a1d3",
    "content": "{\"tx\": \"01000000011221809fa938f2ef41f6621f6e6a0e75e05349f5a7d7094926420abdf536093c0000000000229bfbc70260ef6a521200000017a914ca5375a68588393c82c00f5d2ab21f91e99aa5ce875802000000000000160014ca9858c362545bc83a3b93e73b12b27a9b3ca00336010000\", \"prevouts\": [\"1ff76d521200000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_invalid_unkleaf\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8ce42f81440679dce044d02079a20729983aecfbca152c25d3e936f88c156f8f864364944d6f770c25d7d919ef277045ed1a2464dbb3348ff6203227b2ceb794\", \"20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac\", \"c2cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3cbfc5d7464d6f9932fdfbdb59ed04135d3da1fd24a1d97149f3f9fe8acd746e901c94ae67cd857f8f23543b618b38154b6c0432568bb8cf7638fb55d4cc0a24e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/95b65f78191ad63ba2149f216ad4b1f3a404ee82",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270980100000024408861bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc0010000009526508501d78f510000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7b999eb5b\", \"prevouts\": [\"1e9e100000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"7d097d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f04c65b7c7fd446794a0bdc7f03ec8afe87e7a8979190b8a8d9a7dedf756203a11731258bb3fdfadddb7ae68c53504a25c25356d55367047ba7d256d75a6bb7241a69b934cd2855d9902b26cd23bdcccf828bccd6e43a3687ae54088365633ea5dc2f0a95b502e4151e8232c2eec29d5b91164a6c3efda9c7376ae9fed31d914cf212ab5ab74f971205a7753b54b656f917a7b294d9b6a817dd76a3e453c6f840db86805c7cb385de8fc3d1ac66fdeaedcaabc386c1916cac954990c516fc95baff6181bc66beaaac59a0100489e4596eb40d5697bcf8697c592b5eaffed24eec828c05d4879bdf28244a14189170e9f70cd4a3afee97d564176cc829168fb5a98e4a63785b4466fba8e7b565aa871ce26f989b0536a7646a0bc580713a3a615f832d438f6425370f7a3f8670f1ce6cdc8355b220ca4dc90117aa12d1555fb93ec247e0cbaed1c2286ee1e34f4268a0351fa5997e6e98a181d16b689af29a10addec4a16d9117df49bd167838028309e06e4810cf5bdb46d8d180727e1d838996b93db41eb8cde82043d3a861045a0c204d1ac0befcb1503c642df5c5b7af6574da030ad3d0e211d39e9811102b4b2c4ac09a0f318395a8ccc186afb21733f9f6de47ef03f047c5d04a73fe1a3136ea8cfcbea5b652129a1849148d63cdfbd624a1a4a5c9a31415a2020bdbc5c3d15d0431329283b110f52abf1b86971f7f2dfa80e4ad36734afa46575c9\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0d74e6cd8e612cb42cda5f7f42dc10fbfe42e4e0a9faed92158fa7e41e5f92051e17d2416a1ef9313076e185902c26d9ae3ba1c967c4fe3d78707cdcee712bc7b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f90151c0d9003beaf4adabb925bb8a538073d1fe2883d65c3b6bfc063e3dadc71bc19f7148581d56637e697264c849c2bee9c3cbecc48b284f09f334d95b6f6e4cdb3c7b5ad0393eba0cece63b5866876813b79548ce0fccb39a847f41ecd1d5947c3af0dee314c4e7fd3b87300a529bee34c7387ba18cce0553fbb0e4fc65270818e3e5cef061cabae8304ebc8a3b4d77b3b167dc13a6027ac9ee5a2b5a8f41ad352d20fe1978e5338eafdb24f5c9c593f3894aaae2ee735a316d269ea9a777aa13ba0e4530c3c3945ada7ffb046cb6b95cadc322964492fc86af3eb6db122791637d739ffe83e25b1ead3c86e6e5ed044d814cf8ef50d2dbd148f359f07ad8cd87d19a9f83c4be854c5b32f528265adc3edb6df5022c169ac58c05edddffeecafc7ad25ee315d3147947df3f93909d565d2a8a460c7423149b7212ddb6d268f0cc480865353dfc0fedc82c5d480545f56e3d29d6b374d1038b85db7dc2dbd2250a3e941608a6a6f4d43173f1c628f32fda8490cb0e070c91c6f740a6c0248051ca7c7f9c237666e45de1d322044f7c781bf969eae945f53d1e4f2d0b80173dbee3aecb101c4609bcd398ad93abbea7bc8132bc6de6aea2af19d955edd29f077c421875353c80bcbf0801960a00253c8d6d549f3bd4119ae0ee22cfcfbe0ad868859abb18fd3ea1e7996ce5b71e8979bebb38eb17a029d4a0876ef8b834f2dc71e445e546abc3a83a7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936615498dc0588a9270f8c0d1f3dae5ae97705b42ac78067124fb5b8bbe1895d4977878475803065420b5149b394b9f2a263406aa3a3cf62bdb9b13e67809a83ebcc9238bf2d7dc0bcf11838c34785251ea2fa5f3bb034bc98e2e8efb0909b7dbc17d2416a1ef9313076e185902c26d9ae3ba1c967c4fe3d78707cdcee712bc7b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/95bc7b2db1ac665317576e24031e551189f4efe7",
    "content": "{\"tx\": \"7f02f66c0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701001000000807656f68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43a000000004a3e6fa701c6143f00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acd3010000\", \"prevouts\": [\"bc16110000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"a79a400000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"1d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ea5e09f506d3786832e30b2bdef7e552adbbac598072ee50ea4bccda1394a3023f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08233479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a4bb2c7d85af23cd06361a8d9967d47c0827d7b479cd52e2216fb2d12a2ff38bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fc4cca0131d18d8150e9d666d72698d77b9db3880415ba5ae0e811c11ff8a05c33479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a4bb2c7d85af23cd06361a8d9967d47c0827d7b479cd52e2216fb2d12a2ff38bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/95da825d4132e9de80a280c89ba82724643b74f2",
    "content": "{\"tx\": \"b5d5ba7e02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be900000000704da091dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b970100000044b31bb50347704b0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796a3010000\", \"prevouts\": [\"2c7d240000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\", \"12a5280000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"f07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363b039c0e9d8bf6e88a427a2ddf5980e431ac842cc97f6c7b94ab341d52b6d0fdbec2e27f579b173781717090b44a070e7a8880532a05b17dc998986213b0a92d21741bf2762a3041d275698fd56a81520b6404e88c31ed080bdecc36c09cb10e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93652dd3253268b521b8234f9a6c7de3fba7d5f203b8100eaddd2fc9e08d24fa7c435987c1d75c441670cebdf615816c6f42e3d99515a7a7b9841c20e75c916465ebec2e27f579b173781717090b44a070e7a8880532a05b17dc998986213b0a92d21741bf2762a3041d275698fd56a81520b6404e88c31ed080bdecc36c09cb10e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/95e7d15b24fad0c2e4780004a45b735813a6d457",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9b000000002f21cb13dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9000000000819e17eb04c2af770000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e707f3412a\", \"prevouts\": [\"4faa590000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"4d91200000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"47304402203b3b1b67ef1f56303fe41dd67bed9260158e77033ba8fa721dca9e2d2697a8eb02203e1ffc8f83c9481ae0dacdc38dd1ceafa8b085447dcb3d956041fd010a9b6de683\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402205d90f4735ea2ed121c9fb17b44121becc089a101496976b6cc676c40e7c67d1702201b7d122e86ec7260af8111647d8b9191264c697bdf4c3dab15977b35ed8a168183\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/96089d3e37c85cc3e1727b58cbcd209157529a71",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270de000000007f4af652dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca600000000e56eff118bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48000000000454a026504e231a400000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e79f410645\", \"prevouts\": [\"a4bd1100000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"f33b5400000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\", \"67d540000000000021531f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"81874ea55bb484ce75fe27abc22c65268eccb0819379e66ab9445a41764683988d2bb4ba25bd6eea6753501005e4b83c29e3040cd120cf530ca321279e53f5ca\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/96197c6b417cdc946b9a34b57ac7c50feea0ada4",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9501000000a8b3eea4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6601000000cc72cc87043cc19900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e71b040000\", \"prevouts\": [\"60ae7b0000000000225120ab4625f49c703a23e189ede82045800566d41c1fd8d57f05292e3c6cc685d2ae\", \"2cba2000000000002251205ab8b22cfa491307edea11ffaf6a065b7e494e63cc66e0c2b2743a26e3a8b68a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_1\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6b12de5f3b333ec91a047d2b43355f415e4ded9a048bc4f4c16cd75bc930219eb3cb6b26366d4bad0a4fd214d65a8c781f3bb167d706c82a2b6a51162381b92e01\", \"352284dad82b036af43c24e5be3d4994b4373bf4aeae6a240f2a9ae6cc6d3c06e2e19a3ce2c8a072121a67a8a07c2cf1b93bd083ef6ab9aa680b27cdc2329f626b8cce5da597a591e75d2a8ed1e812c6e7551f15068bb6831c3225785bc5c6c2703d7bcf080f9f14bcabbb776658eeb4f677e1c5c957353ec1a30627379db5a0d305b7dd5a8a0b212ecc9ba14cc6f9b4a05c880aec358cd18f7542e54c4f18ce27b5a7232f1648ba1efa39ce36051325acc3d969879eba227154a8c715f3cb1eae8db4150435d3e259cb017d7141ab16f799f11dc5d3e4acfc5d920b33820fd6f8ffc51133edf6f5a5be8d98\", \"7523fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da00636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366a4132c35eb83b939fc40cc5ccf1cca5af9baff7a5985ad17bef59ab852777703b9a5bcde44843206d9ea957ca2ea9b9d7d55c77ae8c0385d069207fc690dbb30000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0279d32bd902e9dc737021a8d5c1ddeca94898b34864580aae6c64e56b91b81d4dd5ed814737efbcd07c3935f1b55530aa0394366918bc0dfea70abb7a1c69697e8025fe74d0081f7f9a15f533dd681c110855a593b2093844df61448887940809482d422e99a138b392f7354f51e541f10e9b811a38838d323cb0ff3b540f600000000000000000000000000000000000000000000000000000000000000003357ce03edaa37ffb79837839ba74a5028457f4db579843aa562808bb81c250fbc0c6c92c04daf27c17f22ca50729b712619fbbc6793628ec6c6f909f39ffefd800d29ad6642d761bb7794bfbb470a4a8f0d43aebb8e69f7b18a8cbdeec7db6375ecd39d4f765446c5c810baed0c32c1b405039ad2245d6ae04f3beb2032eaa5000000000000000000000000000000000000000000000000000000000000000050ad678e9755084e5b456fb01e726fa2728836ed92539436a7ad264ccdbeb1a000000000000000000000000000000000000000000000000000000000000000004a11e7a9becbeb391512b13f8cb073d0841508fb6e490b3b828c8d1aa087440479e6a0b23eda5a42214f52fb49d6caad0f86da22499a5aa2ee74e67078183072a256bf045c41e66bfec21cb8c884b31edef389b9768f333f414fb77f74129cd6\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6b12de5f3b333ec91a047d2b43355f415e4ded9a048bc4f4c16cd75bc930219eb3cb6b26366d4bad0a4fd214d65a8c781f3bb167d706c82a2b6a51162381b92e01\", \"11fa8d4eaa1bffff91f036208ca07e441fdce1f75d66275c7e79fc0b518b1a97104f105fb558a3f7e62583b80e54fcf0605e9e623ed6bc4940d9f6e44f2b87d5bbab05f8904b5224237e72419f6da552d315e600dda0a9e87f548149b016fe552107dea4fa25220681fb39daaa14d7afe75be22885afd26487e89cd7c96c244fea56feb1ebf6b8a854d51ccb004e777419ff52efd4ad3612c7b97990f1ae504d812bbacee33fed8f73f773c79af7d993663f7485d563f2cc33ddf28ea6eb2abefe9797e06a3195464d566ac734de140fc79294b75d07e698aaced5e4cc826df8f452c35940010ee6930161\", \"7523fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da00636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366a4132c35eb83b939fc40cc5ccf1cca5af9baff7a5985ad17bef59ab852777703b9a5bcde44843206d9ea957ca2ea9b9d7d55c77ae8c0385d069207fc690dbb30000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0279d32bd902e9dc737021a8d5c1ddeca94898b34864580aae6c64e56b91b81d4dd5ed814737efbcd07c3935f1b55530aa0394366918bc0dfea70abb7a1c69697e8025fe74d0081f7f9a15f533dd681c110855a593b2093844df61448887940809482d422e99a138b392f7354f51e541f10e9b811a38838d323cb0ff3b540f600000000000000000000000000000000000000000000000000000000000000003357ce03edaa37ffb79837839ba74a5028457f4db579843aa562808bb81c250fbc0c6c92c04daf27c17f22ca50729b712619fbbc6793628ec6c6f909f39ffefd800d29ad6642d761bb7794bfbb470a4a8f0d43aebb8e69f7b18a8cbdeec7db6375ecd39d4f765446c5c810baed0c32c1b405039ad2245d6ae04f3beb2032eaa5000000000000000000000000000000000000000000000000000000000000000050ad678e9755084e5b456fb01e726fa2728836ed92539436a7ad264ccdbeb1a000000000000000000000000000000000000000000000000000000000000000004a11e7a9becbeb391512b13f8cb073d0841508fb6e490b3b828c8d1aa087440479e6a0b23eda5a42214f52fb49d6caad0f86da22499a5aa2ee74e67078183072a256bf045c41e66bfec21cb8c884b31edef389b9768f333f414fb77f74129cd6\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/962bb09ab095bcd35f7f34055ed0fa8ae434af02",
    "content": "{\"tx\": \"7c5fc7c8028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cd0100000043a3c7eedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0f00000000209d439903a82a8c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e763020000\", \"prevouts\": [\"4cba380000000000165c142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"d2fc540000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cdcd03b7982f23ad354233e9488a289dda72216c8b27a5e543001742fbf05d9388147474fc08919f4af4f6550f081c79cb058547d8047ec5e1876def72c265d4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/962d79802cab79d4bd0c5d840a5f94281465c290",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6900000000d4abccebbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb700000000bd7983dd023b8a89000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47874aafe95d\", \"prevouts\": [\"0bac2800000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\", \"09de63000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"577d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa1c685f9e7861cf217f0c3f090528b45399014026e5720182b0faf436212c9d85a66706abdbe591f97764059d8785051c12d40b9c9543fb83334d204ae23d8b59\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363dccf744be476308f3ad44f6863ff9a5448f7fadb85d23dafd7b2172bbeece448cd69c149de1c0fd775c23d200817106db3811e77c5a94d49bd03e58d7bcfa223a8385792857b3824bc259fd95f469eb32c57805e5f383de6590f06749d208e6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/966f41ea0609c64925ecaee5ba1af166ae43fdda",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1d01000000a146999d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40b00000000f9d200c960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706c00000000e4a24ae5038de26200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79693145c58\", \"prevouts\": [\"a3d2230000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\", \"ba3a3200000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\", \"f60b0f00000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368c95805bfbd60030f39f9e7ff54381e8f5f456ab69fdb578716fcf2f064cb19a3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08208660b63218e506e6f6271f897377780851eb071546e65f7287d9a4083d90048d0ff373d5c06b418f4c5ba421f2e23a69b22cb6c2b7cf326686bcbc29e387cfa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c599d2b9d61b74acf4ac0275e657007f4671c4b15d8de5ed816ccf5810b1da1108660b63218e506e6f6271f897377780851eb071546e65f7287d9a4083d90048d0ff373d5c06b418f4c5ba421f2e23a69b22cb6c2b7cf326686bcbc29e387cfa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/96735cbde31cd1fbca452de029d3f77a7072dd87",
    "content": "{\"tx\": \"caa0da5f02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa6010000007ac8318cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0f0200000026999d930300049100000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac207a7f41\", \"prevouts\": [\"a2016f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"fae5240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_f4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"54f0f7cf5f504be8abaf25e0b378e6ebfc11f5daf7f8dcb88dccf69023cd9a190480c402fa675a57ec9e3761dd0a4b8cfcd4083f3a5c08bfea856fad103d396603\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"967748dda729efdfbd36cfc9b244c0f31dbbf5a106454f5839566692ec8ac6a074f2a17b1b83a7f21d122ff25a96f9219602c5de0d6779e0a40510e55b7c5bc8f4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/967784fbda80e2586d2566b1d20422c209de8e3a",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47d01000000bf12ba80dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0e020000007eaf3ef5041e8d5500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79693000000\", \"prevouts\": [\"fd043300000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"0f3225000000000017a914a5f28fe5532719f979169bfa3a31d5746f69452187\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00635068\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082464f19ce228e2f316c50129d6edd6267acdc0242055b306d7ddf31bf4be6326132cb43424d7ca27a7abc5fd0c2fa249f92b1e992144deb3864a86d466f79c2cceedc10b0e9ea9319d9c2157dfe80b60aa665931711963da9ab109764ff1ab789\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cb2894c14af897d5f38758afa36e148e02b3b317d7add528440e83327826095a4fe66249dd01ecee23c2f5e0ab3cfab587707d36ba83a587f4ef7ad777b411580826552c6add4a61cb16ac7f3706b11d0158c18b61683494ca90054287b9ac7bc2fd9879a2ee2ae7d76224c991edc718b1729f7f1922f570a67a21926d2cc48d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/968b512c074558ddde3b21c60e2886fd579c950b",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a901000000929372e9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c190100000046ba7ae502e2b28d00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748795000000\", \"prevouts\": [\"d018370000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"22c3580000000000225120dd69e0acb4456a75559641628e54f237a5bfa27624d5103e01688d193a4ffbc6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d6f20f9c142c896504037837674b191b1b5298a1d8195d4919ee117d333470ee\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a41616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/96a0422936b6ca5c4077e1e8fceea23c5dd146fe",
    "content": "{\"tx\": \"64f4e4390360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707701000000fb3218d8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ced0100000081e9f5b0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcc010000006137ffcd047b7d89000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6034d4655\", \"prevouts\": [\"3d9412000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\", \"be405700000000002251208ab07249a1fdfb04b130308cc651220c9430f0ee7d7b49fe0191e15183fe6b9a\", \"277321000000000021571f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100b435743e7d6a6a86d4bf4e05e5ba0631fc508b01f4ba4aba81ca3da895dfd63d022050621ea3bb4a49cc2fcd0fa340211e04bf8f261d8e5a343691cd4decec93930481004c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100ea0fd795d63bf3ae74d7bccd20e922c4f25f18161bada16e83931d546594786a02207b106a137ceb2572fc756fe27f5161d9ce2d2b57b91c1c5df406fed4301e0f208101014c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/96aac36c65d79125e3ee07ec601f71c0c09b0cb2",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270900000000030ccb953bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf360100000044aec6de01f70b180000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc12a84e37\", \"prevouts\": [\"90430e00000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\", \"f73e8200000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"577d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa1c685f9e7861cf217f0c3f090528b45399014026e5720182b0faf436212c9d85a66706abdbe591f97764059d8785051c12d40b9c9543fb83334d204ae23d8b59\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363dccf744be476308f3ad44f6863ff9a5448f7fadb85d23dafd7b2172bbeece448cd69c149de1c0fd775c23d200817106db3811e77c5a94d49bd03e58d7bcfa223a8385792857b3824bc259fd95f469eb32c57805e5f383de6590f06749d208e6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/96c1bbeb23affbc8ce9c5703062a448e21a42eeb",
    "content": "{\"tx\": \"fc52232702bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff701000000ec1eb2dbdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b00000000007f7b48d60234038c00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac9d000000\", \"prevouts\": [\"15e1680000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"86ae2500000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902fd4beb2efab09f5c1dea67f0404d4beb74562d7f251bd1c8da47103abc0967a88e01a8a958f45477aba1d9a18fd19f77dc2b7c5ad8aa95a23afeefed2b22616ff8dda7edc1049de7ddc9946ee99db2507679ad0212f518f997c928f3d645921920259d311fb616f00108fdbc78cbc5b96068b92690f12aa2cab1817bd7ddfb46e4dedeb66000ddc0dec609904f8bc6d19c08d8ebb23cc2995580730e20da6acbb7c2951806e4fff1ed9c364d526160343bfe201473b3cae34feed3c78b67c7869f445e4c780ec64c41f9f65285c2799fb671a70ccf47d48b438f2dd6c56500dc3e4ba47ded0c92403113ee8d5627f823e3f93594ae547afeea3fa03ddb3f33565d51d5d1c854118e4d1866609ba643163698e5f996e5349302d4031e98e8309cbfbcdb34097c651c25184e3bf830a98225024886db9c56aa5c47b800d42e28dae3f154dcedd2c5e05f69d3337d11c6a92a8a5ec40368edeec57f1e25ca9900f1bb4f4777d4bcbe83a89a0bb0c4e89c0da2b90e2de467a0d87878f8798882a49bf7f7f0e98ad14db1bf37010ede85c0d4fee5d09f8ed7ff6dc16182feee67e8447a94f7a142a26df23ba20b0129f1dbe1f1702ac0bfaa8c58c3afd73c2a2abbd69edade9d4cf3c2d45ab7056859ec5536903107bcce243c8f2e875a30b4faa59180c6e3366116c6de1dbca753256a97e0c361403369617cbf369f2df58aa907dc0562989ef9d7a00c9475\", \"e47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ff14d7fc37de90fa932265d82b56b477544485d0b71458024cfdbae8fd1d2d30ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457ea7c8dd4a05a6083e4a7ce3fc20cde94d430ec03cbfbe8017e9dc8ef3bce99a9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09029cc360e3bbc9da84d7fcdbe1e6033d03b0303967c79f31333f856d952481dd23db9d92b0a89deeefcd1725fa4b31bcb34fcdd2480a42414fbfc8f196965b3cbdd8c04837a752f43095b370791b59fae7b70c73f7710dbb7c78e86a695a5ae058f06ba041302e86514b1954ec35c8a46964a12fc9debc3e584c8d1170b199d4b9bdfe90aaa24bae6030148e7167859e141f8b05e251c6b65f76f5538e3e10dbc35617266ba02bab2f2a92bc1570bc20b53ab86c8a9e9bd8b9e52c88e838354c6cd22d249b5a30a1fb3bfe4d3895feb98982c311a5ae5b8bd5a3c2a6095367c99997dfe56ddc47e146b475e7ee570df3ef2c20eedca37aa6ee3a12ad1c3b1d32f36aa2a45071fbc007335a465b5392e40ca1e5907ac32b4403ddf11ee8df1c7c083e37a04230757b99523ac78965ea065999542817224a06cb51f9ce7e879e3307bfc22d7ac2863626a7aa2c69e6b2ebda8181461bdc2b8b95537b8f2a6462832cbf1edfaba7bd4d7ab02aa2cc8564e48418be6b3e87ef060a554c53cfce4393b5726c618173c99faacebcea5b78a156a57c81591a530207dc9875fdf49c554501d15783d15b7500d0f44b5bd753658170367f51b58f79bc8d23c2a6de7bb1367d5927d337a511d99d34f0676f0c18aea8236f101c2a33252deeb314379c4ed048da249b536b73f368a099a6f7a6013db8308c4bc4dc3763d5b66a8cd7b721ea8babb9e34268ce49095b75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e9b4a3f63ebc452069e6f153a09db4040a1a2fd26aff12c704ff589f805461b9455476c3fa5bfea733d4af800001099064b64c061f8e2c0be311cfe06abfabc5158e114954b29a1fe443083941979d23a0210cc324956afb3dcce424fb4eceefbefe4cc2cebe7bba8b4a4f82666342333b91a450af49acc0f1954b5763bfc142\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/96f5f4a5b64b8e8462a72eb1d259066fce9fbe2f",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701b01000000bba7c5fabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6801000000b62f87d103d8d78700000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac0e687c36\", \"prevouts\": [\"37c01100000000002251203261e4f5d874791dc168faa2b4a2c68848e71e1814a86d26b34f54a7b16af8d3\", \"be1f780000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93652a1eef91367cd6d74c4f46a0acdd366d2fb1ed04bd26bd49e3b512a0ae11ddb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a2f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9700352a9f17c39165256df2f2f7e4fa2ec9de61",
    "content": "{\"tx\": \"4431cfc6028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40701000000be5f58b98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bf000000000206778f03fb9a7700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f871feb932f\", \"prevouts\": [\"fede3f000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"5c57390000000000225120b5fac7f9d1efa21092b4bbfea1ca41fe5694dd20d67936ab2b478b1ec4aee588\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"da7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936043c0126a9ff46f80efec90b265339725ec2187e176bf61e9c8112d2ff543febee00e627ce877dc7a3321ebc519bf09c5aac598ee9e81cf6d3228685de2d2a5f9a29f5cb7818ea23e4b491695dace811707e8772e99626d3237c076ba9a076d6566ba3404d3656bfd0df4a55f82c254cdba579fd51be164a5cd21fa2faf92a44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e9267ca3ecfb5dde8490070ee5c8f144d07948eba84ecbc5d8caabe33435ae9c3fb4f37cceedf64e5ab756f8bcf3191fe56bd549db8641e271ceb60581364e38eb0481d56926b359fa3e2e34471adba51fafc61fa70dea7541795bc082db9408\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9749e874bbbae2a0dce118ef7501ad135ea6cddc",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c200200000056d3cc57dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf501000000a74f649460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270020200000040bd4f300326debf000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac82010000\", \"prevouts\": [\"1dfc5f000000000017a91480e36171416c0f598c1c20ba17ab3a3cf10a438e87\", \"34075000000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"95c61200000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00638468\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb415f8a538f68d5e42651660e8feb349dcf42bebc9266cba18280404d93052698127135a2a7712dc4ffb0f490ef0a9e18994dae8053f69b06dfd6a349e2375b7df7644b3dbe2d9311c88339dffa1c0be80a46778a5837645266f0e84452a246701\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c777889b9c675ef10221c9e4ff4402fe24beb4f9fe9422385447f7b634cc13289910ef1376b2f57d6157bb9e8c31b4bd4b9d07432c4b683bf27102948dfaafec7644b3dbe2d9311c88339dffa1c0be80a46778a5837645266f0e84452a246701\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/975509735c405d7f26b8bd4c00a32158c4f2911b",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48f00000000d54e494e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127089010000004f3ee92e0308664200000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ace75cfe40\", \"prevouts\": [\"113b33000000000021591f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"14ad1100000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4093438ed6da8aa0c53e5f73939acb7b5def70806f19c4bbcda28a1a09767df92d47a93e38f6d7349c99122a7c8d3236714cd472d0f69a7526a04cfcd596e6aa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/976fab0e9af7ab44ebc738f13b377d23ab763465",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700501000000f60e8805bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe501000000e6fd15b5017fe3180000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc6f000000\", \"prevouts\": [\"0eef110000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"673f660000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063e268\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dd64d3df7c2a1d0f9fe00a8caf7064500c77c82c895dd028fc814cb494a55b73b88f998be5301314da3588cf7094ff0b779091d289dc1f0b3826508d93d51b78c2782374d67da9500785d400f7ef10ae84f146bbb568355094c68456b68f7a283b30ae9fa149c8f8e298eb730b57bfc5eb02dfdad9864c9ec3129b8b9775e615\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c488a3deb56610eb7fa861052ad162bc8070dd60208b70c3d0d74ffd3dcedde8b0bd2b339cdab1cb752df7db1bf10e0fcc4b57fed7d380ff50ba3a0b4b018724b77966166a359aa5541e77c34a58fd9dcb7d88ef6e7e0cd0e140e1adf959d28b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/97703896dfbc748c76753b9dc807252baa7d17ab",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd10000000089808f898bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f9010000006c9d49b102408d97000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac25e01256\", \"prevouts\": [\"56c25f00000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\", \"91d339000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090246543e41f0b80bb5e83bb79dfabda2a0e5f0914e3b04d1b972c8ea454ffcc6472c7d3803a1b27f284f58e315690d55f3f2ef118ddc881d277edd79c9ad2e39ed87ff4df0b573ab9ae53ea9f7c078000d5c6a8613f551f9edb92869a8d4e9f869c5ae583c0707b077ed7d2bcf7fe8cd662ac4722259d8a855280302f629238f694f0b32b87cf323e16a36595056ae8f0f3581324145fd3af76a84237f54bb8f691f6c0cb8f056341fff9eddaaa2787457ec778260722dd15dbaed31323e10a41237c25a9e1924f8b9af54f4d658dc4ceafe1da8e051c6cf56ce978f81e87b2edf8d4381d8e4e74527fe097ef28385eb59cf1fc14ce1a7fb666c9199dec92095d001588bd69fa34dd48f4221746e4550c71b30fa3cff6d34f6db43e048ed090af0100b44ba90fa935005c99ce5a7a9f5de0e04f558a8d2bba9a4fcb70a36e0a74cf91d213ae345381d8838d0208fb9989ab8dddd142d8699b52af35a13ad069f2aa55e8c867b633f09cf3cd075349913b70eeb94b987a26d9f8f47669dd0c37cddddb8c7e4a7ae5cab3138fb8c11a82a04bb8644e63fc04e3c835ea3cbc546b9331fabb6fe5f1fc9da736db78fbe86216c407b27458af80880308dea2f7bd74340b4726c026fdc1e2db6c76e25b2587b31c8aff5fc3ddad37427fe41464eecf44b2433a3b8c3accaa9d2193c1cbf85c110abe637f10a15d9a5f8e9c19f80561306757098ddd232bd62d975\", \"807d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e83f9b6f826008f58b0a2f0424fb9eb1e858fa037e128d89da74120b3f1d2e75bf3dbbf3726cbcb24bd9ee344fc88539efd23f46f5d6cac68dd1bf47840d55ab8c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09021e7cc742df1d8426ec5e0354302afc2ef28f05853ace24873f2f941bdf0062915adef0d02c8c07780c644235e9674d50817d46953398509cb0acc1b8a61814b912df44568a59537d3868039aa41848c17e46d8f2f57ae1966afc65c5de4479e6738c5cbed9a4361b2331f9f8000c0943dc8a4b8a0ce2660cfa5da928f892111b5b4413b74badf46607d41829b739602f4cab78f987903e11b3f919664381d50ed10a0a999fb43ee7fdeb8a544fb2c500eea770be304cc72871d07a7d716bb2ae2be06f96a582b8e22eecd12bcc0164d5dfba3036f4ece0abf4c2aa9586cba9e1aafbfdf4de3b1268a9f8ae402ff04751fb3daaf121f782327495a377a6b26f0aae35de31e5ce5f4000520ca237af6947548ef3b51a6d9aeab73c825258b91541aa3bd9d300a9ab5f682f2e23383414b38916b97eb9dfcc12efda370421c6030c98614ff908880c9f5008b40d32b65ae2615b39063b8949a28372420942b1306d1e0bd86ea60541222d6cddfef76ce9b2d5e381ae1713b88ba89d7e6466bce355257549ced269aa5feb24a68e8246119be7bb24761588996d7f3fdf256e24832fd831a218c227848657b9550d3cad13223fc5006aa79a2e794eb9d0f6819818eb16b5315002a3a4fcee4538a660359e702c908f953daa8f640f1ed615b5262bb6db7b709126ba18b8cd23be0684fbc2734f2c8447138962ec2f369c0e82ec8cf18446f3cbf0b555ee1f75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936039633ad3a04c2b48f1d44fa7c2039ba0cec5460a32c6bd9aee54d5879a3fc75035ced5e3ad5845cfafeba3c70c2f6d2785016db0dd7771d558e4afbfe1a1e9a3dbbf3726cbcb24bd9ee344fc88539efd23f46f5d6cac68dd1bf47840d55ab8c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/978c3a312999502111000de7dfe47b35516164f4",
    "content": "{\"tx\": \"23ccb2ba038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d2000000000276dbdddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc201000000bff559ce8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49b010000003499f1aa02d96dc3000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac8a010000\", \"prevouts\": [\"334c420000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b5fe4b00000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"3fdb36000000000017a914aa4a4e70b11f4eec4760f77206dc93b02350fcff87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"473044022074551d8f048a30da7c61f6f386676c51ab4071e1e30acb091ce1e3cb1f5ed93c022008742d772ee3b3bbc8a0b73f5627414852753fa6291f813c19dbdd9b2a4e63cc034104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100d8da7568d38772f9cae6eb86bb06ddb7e61128512f1bb9b44da900cbb612a10e02204f4e6dbc0d82a032a89d2ee6983db8f8e68abab0eabbccd339694217312accd8034104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/97aba204ef02b37a3627221d61d8e55c8a4e1c89",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4db01000000aa09a19cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0f0100000069f2c7ce60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270920100000099f9349f028e428a000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487596bf447\", \"prevouts\": [\"72db310000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\", \"266e490000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\", \"02ff10000000000017a9146704ae21c886c9ded757e2b67d582abfc91902d487\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ac6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1052557e81dd342a2b41230b0afaea8d13945f509c20a84912c3e9d5b86183ac33720a820d9abe67125ff39f44ffa31194d8e2e56ac0de67f7992994257d70be631e5a3cd6e337eb252bd8d7a8d95e14a531fbfbee4d245debca50b247e512ad1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360b6966964f86bf7042b2b8d0a9c38ad26b592ca0cd295eff76ced7d8c125b4a44a68ec639edecebbcc441a95b015cfc7d67c6cfab51cac7643a880d3dd4163fb31e5a3cd6e337eb252bd8d7a8d95e14a531fbfbee4d245debca50b247e512ad1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/97cc85297ae928c35b606a80f058ab18ea5187d1",
    "content": "{\"tx\": \"615a5ae8028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f501000000cb91e5aebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb600000000f9c80c9a0168a86500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac40208a60\", \"prevouts\": [\"8d6035000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\", \"62a67200000000001600141cc39a492a6f67587324888ae674f2f534a7639e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100aa13db2a3dc117ca3698a46b87fdd7e9a0163ce6c20e927cb59b6d3dfe23cc90022006549da89414cce206bc037e78f0df7acb38931a2bcc9ebfd315b3a27775e0fe03\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100a6d3758b22a0837ae6cab7847b42f9b3d95e3d24e3662bc06a0f91fb2dcae16102205f9c9b8433ea44fc8488be5413237a9a890224b6c74d618376c14520f04040d603\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/97f61b6d98c9ffe5ca701f864969608db86c81fe",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdc01000000f1553faf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41f020000004d967d93dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b20000000009c7a29f501e4bd6e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac9946af3a\", \"prevouts\": [\"8fa24e0000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\", \"07ca3b000000000017a914a7d99db8790799e567017bcc9951f7f968dba70f87\", \"48721e000000000017a914a1b035f555fd87548264c3580a1f62a42acf027e87\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"215d1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"385f9b7511c5668b97f134642d8641fe4d541f4939e6edef8c0a138595b38cd8467d4691a7de84fdb38ad659746ff95930b07135d6178918fab0bef05c859758\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/982a43466eb400711eaa92486fd3a9b22d4ed22c",
    "content": "{\"tx\": \"2bd6955703dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca700000000c8472f80bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4600000000d13b7096bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf22020000007262dfc601ef371a01000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac991f5956\", \"prevouts\": [\"846a520000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\", \"8cbd7300000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"3c5a750000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"2f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a46c7d29a0db0614f2e0f0dc0c143215db302e3c05619472d7444021c8cb05584a68514c5be2766b31ac79cb27b74c816d51537da76cf4fa244470107a7172f8ed6bb91bf977e9e370b444e9d5512cd4ec7f3694a9311c01272a4c1a167cd930\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d13a5469ede1e46cfc998c93aa642cff0bd84312ec04d003cb1cc577ad9b5d6a9cca9c712bd5dbc651b74ba1f32b079db60a81520e454f56bdbd9ff2bb730ac4a68514c5be2766b31ac79cb27b74c816d51537da76cf4fa244470107a7172f8ed6bb91bf977e9e370b444e9d5512cd4ec7f3694a9311c01272a4c1a167cd930\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/984d407c9a0781d661b22c64ad915a555d3bf64d",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf91000000002b06489adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd001000000a1a8c5bd0374ded3000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487df000000\", \"prevouts\": [\"ca847d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"defa57000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_8e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5a3f0c6d3d7d5ecbab1e157172e7fc37f17b55606503fc090ca8679a0ae29fa572e074a75ff44ee4c5988207d5a7a86f1ae241c175b6b126af2b8d8cd21b8f98\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"371288ce6346cb7587f24781557107377254815a3e3bd489fbf22e2cf3729dcde326864dc5e270c65ee003af52dec3621437dbff5ad061c77177028380d50dc58e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/98500d46f789f6e67f2c3e2f6af290db2fc124cd",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127090010000005ac683e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c380000000038d3a0f20107b609000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87cd821a49\", \"prevouts\": [\"b65e0f000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"d17c4d000000000017a914a68ade9e67dbb5e8acf044461cfd5bd8dcf592c387\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_83\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a01258475bcb19795d0a725f8bb820d8094e9dfe0f9dbfb98fb7b7d8f4fa18acc75b50b3674fb8e4287b02b2fa9b5e7a993ad4a040674610b3531bcfc24be74183\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9a7e25e9ce3cac285fe683d0fc7c497ff31dfd2437de629505cf8666201b958f2a2f6b715c348e215b75cc112a8d24df3ef57cbc52b7c3803b070f4e5eb7fa4b83\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9886f8415dd6095f89ff7e519af7516c9b7dc352",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5a000000007aff33b5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf83010000002d294e3a04d10a8f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748772020000\", \"prevouts\": [\"1e5020000000000022512038bab72068016f902ab3c55307335e21603c18bf2ed309a060537ac5746c9535\", \"8f3a7100000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360bc8d8ca652832e81193e5224505a6dd6e16def6e59730a097de7e2e8bd37573\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a55616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/98bd202ec6667081b4a70e2f6b929af634ac6d68",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7f00000000ec0883ebdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf400000000af6e853204717b76000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487e7000000\", \"prevouts\": [\"408f560000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\", \"d3d9220000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"2f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082cb0eee81661f2fefaf772a8bdabbcbada52a1b0c3a58f1bcc7f9bb01897d4d674e9031d393e93ec4f3e9da8fc51e83b82f31256dd96ef4af94581a47eb5c67bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367ca2ffab0cf338eb106c1ce200445cc90ecf54781f497edfad4f32965f124fa8cb0eee81661f2fefaf772a8bdabbcbada52a1b0c3a58f1bcc7f9bb01897d4d674e9031d393e93ec4f3e9da8fc51e83b82f31256dd96ef4af94581a47eb5c67bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/98c6e09cd9cdc3967e01f4842102de38d4cda1a9",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff6010000004f498f07dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c860100000008441211dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7700000000fe3bde330149db9a00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac9fec5531\", \"prevouts\": [\"f6da7500000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\", \"dde94700000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\", \"c6d94e000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"e6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e11f8d24c2756f16b9efc524121d49339a04fd56a536f956352850ed4d5018a4abf7205f064a536655663faab66bf2e716758d251376e4a55710082b6d7272244791bbc3b31bcff977684854464ae3dc2a24522286fe393648b51abc79cc246ff8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f70487ae4384611f908618191b61bece567637059dee67ecc200d57fcc06025825f2fc2293577bab1371dd996050d2a4e8a01eb34ee2db6c09974277461b3e6691bbc3b31bcff977684854464ae3dc2a24522286fe393648b51abc79cc246ff8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/98c83bcdb5956bb94639dc29099871c76564d6bf",
    "content": "{\"tx\": \"d1497db003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5a010000000ac409eddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1802000000b7a057afbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff7000000007c740f92045d5fac0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fce5030000\", \"prevouts\": [\"d1a0230000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\", \"d84b2000000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\", \"d77c6b0000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"dc4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c9da215fb1c7a7d8158d804bf09a7228ca7acab75bba3128cb1f7201ab6c755a6950266b78c1c1a06b0abf9d183417cba91a47bb46abdc469d8aa6f91cbf6a3fa39f866618102a4b08e1c83cadbbeb41bf3ed62f238c8432fccdf019ac45545bfaeb7b84c883e27227adf79edca80c57b026715ff0da0f52c5e2d2aa306e3b89\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900453f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08238e917535475cf2110d0b0ae2ac5bf0f6bfd0fb66e9319f96694509bbaa8cb206d96bf27adab25b1c800ec6de9073e8fa8f2a3b567072b632cff39ce61bb3673\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/98d122b2f88e6c5326c77b7a643d054909d0e33a",
    "content": "{\"tx\": \"d666eeb702dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b37010000005ba523eadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2500000000a14399b10167ff3400000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac93222b49\", \"prevouts\": [\"60c422000000000022512036c493d82a149ae4f58587b8995f80246acaf3fa754ebc9da78117b68027b383\", \"5e4f2200000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368f01bedd13dfce24680e9fc996c53be28560337df17d0cea5b3b3f87d7eec203\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a43616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/98d39d50572a07ce2b34b997b11f0801efe034d0",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45f00000000788b972abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf02020000008b773e1560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702b00000000fdffac0001b6184e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8721010000\", \"prevouts\": [\"39113f0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"8f097000000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\", \"d0ef0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"95\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045cf76285204aedeb2e654c32bdcb90a470f0de651bfbe7b8c0c018e8a9ed468384d6fbd68a9aac62cc0fc4848936fa6d465cb32a19d5a751074f74d9c4f7fb368ab0b669047babd6208c97c1428e12fb9e633b2b0d2e51b7853d96a7caae1fe0d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e461b72f89a2c16bf6a5015001c0ff63d37cf9f24e8cabb5685a98f400e46d3aadc7c8b3bda8f17728820267d55a41d559bf30f92e294931cb4fa644579829c4d4a2033150a39b6917f88ea297b4f989401264ea3eb8667a511a69e57850c639\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/98e6557609649d2edfa5303dc85da6929b3e46cb",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce90100000083239af2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ced00000000c0e951d4020615ad000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748700000000\", \"prevouts\": [\"3403520000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c7f65c000000000017a914f0ed99a28545ab2ceacee60b5537a9e5c34fcd5187\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"215b1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"de02cad6e29bf921d2ee6d5b33c41a108255f36fa9623c61f0e96c86f42e8e441d21577181e866ea37b28e9ea5766de3c538d6f5ea9f67d742fa39b5267a9204\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/990480b357aeb905cfea6ff646718d101978e980",
    "content": "{\"tx\": \"566cc775018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bd010000004d504fd902a1db2f0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6ac000000\", \"prevouts\": [\"d76c32000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09028e545a2899d62cbe3b738c9c1ae244e41921f7a57ff172ba0f409d97b6073605c05a5c8dbb6c6b85ef68a2f28077c7807549d1dc086420bc40feb82128b69730aff8ac1bf8b1b7e0c1e9987facf95dd3497e94bbd184114141fe611f68f4ade7b19bf64e26dcb089e1c95ceacd5f47b50273b183a08ef8ea0d19ce5a0551ec7e1b3745288e5d762fc0159b86b547fb2c8d6f8b566133ce089d218d77b8e252c231219cfc6f399f3d653774ecf1f32fb724e5929a4fb0a2f90424ea3243d0b0561ff3f51bc130d61b7582d625173a9c36127d0c734024e6c646d44585c27677e53d611d282b734967cc39965c7b17135bb0fe6bf4b9d15a7f7b6ca6f0273513b939e013916201ec9bc7770b3a26a4d86db33bce49d9c99363c5bd2e05d34d1d7ee31f1dfc101a8a53b55f13b4e61e33cc48cdbfe95b0fc3623b554676e4677d1dd0eb3e0828f814b232e164ff7c8dd5e780d683032e9e78dadf1e7cf1045908b2a84e630df4186852a5a76fb5870f53c39edc5b2a8b9d76d617f65e9666d5a73e0040aa6ef3b695f10f5066465dd0da66eac64b0d90b90e8ba57eb8077e4da6189ae6be29c366e732b3d52e50d021b977f0bfc86985efa0174ed4366cd1b2fb147d33b3002e9725f1579da95fb84855e9be572b61474768bc26aa8b2713686c015d7e86d8c64d36d19334c9bb9e79974d8475bcb6a70d4a52a9acbda9699b37bdfbb05128574800f0a375\", \"7e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f08dc66ea0f9eb261a29c2f3d2c5e9ee1b32bf5c43d9ea273248408128efb172da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ed3fb5b8f7b3afa290146b30788656a8f4c2497a65b1555cd50f1d702ddc8a1f8f2e4a14a40b0acbe20218e44481fe6660f01d2e0cf04e3bc8d4452bacd1080d1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09028e619fb67d98b88e56079643a6388cefbd0ae51238d974d376ed217947350fa41c76ffca263f1deb415a94d111727fdb5fa30dbf49c1a2df8c5cc07be6ff336791ba1a7b551f651df744fbbdf78f904d5c830c1942a8e0d0fc99eeb6ae2a886a2b97da69611bb45021d2f983c92c6dae88adca3ccbf94254c909d1c1b9f98d34ec9662a78466c0178ee401ecf2dae0ec862e1bab220dc3090a375f040511b708d7a648d43254b8bb829eafe9945138ab81f11a4e5f257986711145a7723cf457bba6cc32a92dd8cb09666ab2af40f3351f8e278a2b2cccc13b4c32e6948d00367dcb320fdc4d4d03b3f5cbd19e757d4a3f799957b8d2d54ed0a4633ea7ecd33732b9d89b3de0354546c1fdc0b66cb5fb52b8993912e23cb204c178bba638700b5cca1f91388d476567eb17d65c741c8c6de9868a74289208cfa87c08ea9f6c7a4b0dd4ab65db185bf911851c17d9ba8441643afe9806a85cf4ac1fbc4efd1efff6be2e12c48b8854c39c6df838470a461fa92ad759e0c9092a5c9bc0ab5501812b8a7d3699a67d33686a93b927b8c2f1e1dbda70aaac733c7e7f5060e6286ef3ec8824626b9a0c23c95dbb7be30ab298e7d10d8cdf8ae383a7c06887e2584c838f7805abfb2ce81dd7d60665291c9846bbe7dea0ec32b132a8857db4ee614b1cfee778358448fd8035f4d35169bee34c22d4b9af843f628f68bfdc0d30f017f80df222a2d2eb0da58075\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93622dd8d97b260f7d47840eeb54422aa4324349cfe541c38798b74309f8db1f0cfe4e9bfb46536bdbe14fd1969523d98350611f9c0fc6236e31514e2d43f59e146f2e4a14a40b0acbe20218e44481fe6660f01d2e0cf04e3bc8d4452bacd1080d1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/990924cc189ea41b110bc4dd575460c49374f23d",
    "content": "{\"tx\": \"6a76990802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd8000000001d4b6c88dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4a000000002f820b8201e0103a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac02034d61\", \"prevouts\": [\"b82721000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\", \"cf8a1f000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00638e68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363c1a09f721b671ff8e4281f9d7689b05138335bc6147fe0c6fcf3e4fb775b626dbab9fd6af1020d04f0143fc46ba56c091000bcdda14289cb5d3981fd1d5b5a654f33cd0b31c9bc4dfcaccd89caa263c020d1b70f58e7e0e884ce19a773d6b5f30b2981ae69232c3f6c5ff759e9ad4102f31f3fc5e7a3a4ffd34dce2e2e06026\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082df5339745586104756c1fc6d4b54e2b6a7d81daf8b03d1fc2a4a51881171d1a3099eb053c54d8f72c6d7331f9a1bb3bf1b628df692ad9b7eecd4e01f4a47bb5aed4b6001a8fdeaa28275cc8a939e32dd3c3fbbfbba5c677bbce429d0c1a1675d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/99621f82461534b8907da50ed4c7020620244c46",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5a000000007aff33b5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf83010000002d294e3a04d10a8f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748772020000\", \"prevouts\": [\"1e5020000000000022512038bab72068016f902ab3c55307335e21603c18bf2ed309a060537ac5746c9535\", \"8f3a7100000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"187d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93606a629bc116268be1a17da3f53dc5135cb0ba720860d61650af2ab2ef2f0d65c919a726f5226a1e5e752df6df7fd59ca609863b1a6d095747bbc103e423fb93280858ffdbef3a81ff8eaeb69bf692b0617d2bdcb9145576d5843e6d9e5e1cb0c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364394e80ff16ebdd0b8084d2a2ac0d9fd937ef7443fa96a9eeb67a82d8ebac460b6019e279bd309d4b7ea698da82947cdf92f55834d49ec05c8520ba423c90b8e919a726f5226a1e5e752df6df7fd59ca609863b1a6d095747bbc103e423fb93280858ffdbef3a81ff8eaeb69bf692b0617d2bdcb9145576d5843e6d9e5e1cb0c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/996fd99ab96f9643d5e5713a831995b17e7a3d6a",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d101000000275cfca3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5201000000eb0037a702a3deb500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374879c010000\", \"prevouts\": [\"c22c3400000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\", \"f5b983000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a86\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3b4167115de6998fecfb714975bc270adc7a6998f06c7ef8576e15f157ca8963750636431b24706e8b1111073dac761b2ba654f4832b7b9ae2a348c6845c1d327\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900456619599a2832199ea7520e829579ac708ea18d94219cc28453716c125c7ffbf6b4167115de6998fecfb714975bc270adc7a6998f06c7ef8576e15f157ca8963750636431b24706e8b1111073dac761b2ba654f4832b7b9ae2a348c6845c1d327\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/99d1d11e7c7797862b2f093aecd2482708213a46",
    "content": "{\"tx\": \"0b70bbbf028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43d00000000a3e895eadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc2000000003880c1b703b6b6550000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc72396585c\", \"prevouts\": [\"eb37320000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\", \"98662500000000002251201b272935825fc7ce2e9b3b4937db8df8af2100736ca7626b35b3c53dfa94e3e7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"b37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936903d2a659aad03c667a6b873e21cea168414c29d3474a9880634e3e12e550e8c33479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a368ced990ebadb111ebc3982eac7e308f07f99a9264ca6c949f56162916d7884\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93613226b488a95574c43053209c9e6fe8a3ea8bc7dade3cccc06ee2b8f5d857db7ebec8f444f9538a00b5e533aa370349d7181cba703021b72fe611d481b359a8e62055c347ba5402321504576f6c37d0c6cb1d044ee75df535bc9eec0560634a7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/99dec7b1a061c754594c315d70173856ee38ca53",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcf00000000a7f3a3d603442a200000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac8380d953\", \"prevouts\": [\"05bd22000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"3f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a6cc0ae96455d40102dba07421af533c8bf9d94b7db74d6a9e1f391a278928dbc06da1f6599d7e514a71ffa8a2afff73792fcf1df1b953d2196d009aa835a52703985aa46dcbff8b0495de750bd1afe74a661312f7eddf1146199ee1ea8c08aa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365ec1e7079ff1f62dd2e6a74a9c34f414c9b037a2415ab122d560dbd709f7ca5d76a51402fc917873b776340a7337d6d9d98f28c38cbc7d5e61e594cad9a2611aeebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7acea811edfde1d836b623c2094badb4ab8bc7795b2b49da5506600222f32ea3fbd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/99e6e3dc68bf0e9973d9cda82f1300e98c4d58a0",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c487000000004bc7f4e2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb6010000002fc980f20145803400000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1c40ee26\", \"prevouts\": [\"9dc3410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"deb0220000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_a4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bba6cf312b17f70b0bf3bc8f96ffb32d469389521cd80abb773d5515de765e8cdb26bb39e2ba5dcc75b3f41dd96c0f4316822d0a5ac3509fe638ea458513a7d482\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"16c56447a1bab4a3de363c353c62237dcb621bf6c2031fb095b189e1bd5dc305a360e5a87d1d296ddf0f99851111bb932cb3098f416974be701f82c9139e7786a4\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/99e8319b516c140aa7badd1e9ef03d1ff1c3bee0",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1300000000eb0c7ff9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9f01000000c78597bfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0a020000000af4cdaf04a802d1000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e76dfb7e54\", \"prevouts\": [\"501121000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\", \"7beb5e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bbba52000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_91\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"153e3dd9239b5f948de197bd87b90c21bb2ea1083c45afcaa3dbd6117d0a8af737c543a7cdc3de748bc03bcbe2543895eb30f5c8fc77b9b91aa0ea93ac7e61d7\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"09c03bc8aab785dd8bf9d4f391eb0f2376edb2e03fb72f4f04fa90b3e86a5045c3f38fd5030a4d668e106bd49c3e4bf7c07cc461f0190578ccdca9fae0a1ff5a91\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9a11c2fda7b9c43e2b7720bd72c00e2503c9dd88",
    "content": "{\"tx\": \"d181cd7103bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1f02000000538bccd660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704f0100000003fd78e5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf30010000001a08da8c020568e0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ace80c3a31\", \"prevouts\": [\"725f600000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"3713110000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\", \"e23c710000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ac7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93651a4b02d6d2d00f96ed624458ca7b08560a5ba04522c3d997cce9fbca7ffe3f57e5a3ad1358e4c8217aebfca59af3ae3bc6dd2d33fcb7e66f52e86370eeb61bbcdb1729650f5e7315a74782ce14a5f1169946bc7ff3758bb098f0ad0a25b2b7f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045c27b7e516a1b3919c0c2aae21712d1c7c40c32040b64b5fd9dbe249132a2d861ab0398bc4828dee75def1007ce877d708ab4ca86c9734bfab291d4bd05bae3eec1a6e987e7baaf45cc4656191a1a193c7abe05aba02d24b24cf2747f96e1d33b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9a309f12e7243094d23099f5433d19602252797b",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bea00000000ee0a502560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fd00000000d7a42f82dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b80010000009c57242704fe4b5500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48746e08936\", \"prevouts\": [\"2584250000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\", \"ec9f120000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"64811f00000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ae5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93629d2c1e655ac438f3db70c25cc3a59e74790bcf64cc75b6e948452f3070fd7888cf2788b31c6a31a23c8dbe6ff03f22a1631db08af18d9e87ce7bf14c25a50385e7270ac6e52de2effa1ad4f1d7cc04618f1a83be30b0454843cf6016e9cc3658f009f53a1a3347386cf74e6ce512c14e8f46a54e4d2c64fe3ab77cfdd670d0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b733bc242514943bdb2f3483e8eeacfc336f33bd44d397c28f9e3357b5aa8100b15c6036a676a492a4bf737064ce6a21b64de8ad159d3b2e60d879468caf8957d0cdffd10ffbed86c0e7536425f8f402fac685ef3be7cf3af5c775f2718b4072\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9a89b6f3139174829b27ab6ead21acbf001ee2be",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ad00000000d70bf3c8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b08010000005adde9fe8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b60100000078ddf57604cdc96f000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787521e713c\", \"prevouts\": [\"6eb8120000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"686e1f0000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\", \"02ce3f0000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"d27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362aacdbaf7feb2ee84db2dc99af1e5f6e1450a5c488d9b9b44f0760fa1ba6b92f9a9c5d9290705897ef911507dd26b72756738dae23c9379fd676f365e52e00fbc5e1171eec0a28263e9818d2dbd976f4b8066e50dd8906a411b6a9dd47f52980e39f192d4dec24b48e9231a08b7d2e64fac2040aad69c16c1d9eedfe5fb62ebc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93621ef10389913bdbd846df0d9639979edfa3f7c76677006bc1a57e34b3956825b9947182c2cf442266d627de6569afbd254a849da3e2d989b935a76fec010797d33479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a9b801fc18e2353a9cd4de337bb33433fbe6225e21bb8b5572b0acaa50d11b7f3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9abdf13e2635797e12d342e2dfb31a9c80d0edd9",
    "content": "{\"tx\": \"0100000003d15657a619affff084fc6b1bc2cdf5e85e399bb207d84ace710aa8effb82232f0000000000378eeb7906f5bd527bde63f7c45daff54c390a64a59dabeafc8078a9bd0a050f54db6b44010000000038906fb3492909e056fa5c0ef2af542be68aba07da39583e95b43e24484150891b1d5323000000000077e0c98802d0235951380000001600146d764276c66fec1127e5074db5bff3aa6c52553358020000000000001976a914b2c48f336848c91e9c274b4615a238e127bb7e2d88ac40000000\", \"prevouts\": [\"24977ad110000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"1ad1d66814000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"14cf091713000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_invalidcb\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"1ded90332935ec88558f8584ac1a3e9b0da6155cb557dee011e261e061c7d76f37a6a92adfedf2fc3d952ec6d1eb50248b6051ffd6e84fa3b4b0de26206ae46c\", \"20159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717ac\", \"c0159f9373f8b28a67627a464ae370e1e712c79726144a1a48958863033f16f717a00074c7e8df7fd91f9df9f350398e675f9ead7758f02aef75359e3279a8e0e7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9adf5a63b8158c84d6bc327d0b1ac1b5964a3ac4",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc8010000005c7f094c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fa01000000ae244f4003c3a18000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e76e000000\", \"prevouts\": [\"182d500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f1323200000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"437d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93682ab6dc69837b4247049ddc8b7ffe2c3e23edfe00b3a8b82ed1d42877f84b2a53d8f160074737ef82cfbb3f905f5039c6634e29d53352416ee52711c9b5e3cc1cc59ecfca53d850b1637d6273d8700d7dc702fb5baeba7c0d1778aadee75959b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364715b474cae40c256682884c4b9f99cc4a0ea50646de4f5d3b66b0a6d8a5bfae3b3e543c1be24a694e5b6685838ec47a730681350c8079fce99319dc90d9ab403d8f160074737ef82cfbb3f905f5039c6634e29d53352416ee52711c9b5e3cc1cc59ecfca53d850b1637d6273d8700d7dc702fb5baeba7c0d1778aadee75959b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9ae58507a65058e0fe31de871c7a34bab5415ae9",
    "content": "{\"tx\": \"5d30506801dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0f0000000053f538be04083620000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc741000000\", \"prevouts\": [\"56d222000000000022512084127e09a3e5abb8e6ea0ba3ce4737d1c2349f1be422ff5ce1609ab9b3fbb01d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"ef7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e83a19147259427e9ccdbc6f2b8e5e1f30c562b83bf76874eaaaea903675d8ebeda91d0eecd1ce224dc9f5ac46de57cb81ed44d1050e451131a9df60f58ad735b030008666d4260a12bee868d13ea953ce9c9319f2222d8e8469ea0b912b8ceb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936547a4bbf5868550c6b5042f98020e4d4cbb7f37004221482c8f9e6bd9702217de4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e87a25236fb2b0caf4a960afecbd8538cf949b3ef5b854c8fdc156128073078e11b030008666d4260a12bee868d13ea953ce9c9319f2222d8e8469ea0b912b8ceb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9aece0f0260af3664b7ed391226bcf127e9fd163",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3300000000fd918ce48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4dc0100000057bd5083dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf300000000c9b3ff710361ce9d0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7961aad1f34\", \"prevouts\": [\"7dc71f00000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\", \"a33834000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\", \"59974c00000000002353212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"d6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93690527042795390690a9a4478775b8c816aa4ae99e8fa73671741082894bf9ec6c99cdefdc3473a619e12778c4cd588646c716d59e86e999fbd28728a66c3e7c6a7d0a3f3648f0d829df7cabdb8f0af96ecc09ebc190c461c6b5fbdc9f87abaf73acfa007b318c5da81cf6562f4932e2754570ba3b679b809769f541be0a6b617\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004596d09828da376c7d22ded5a4cf88780a729051831fc4ab0b26d0bae49a473f5539caad535bb8d51429d9c94edd44271a241bcdcdcd941caf815b31d1e73ac1400dccf8e3471e4a61057d1540548a04f67f25f6a36812a8ea9d07747f2e4b3a8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9af8af68c2f18bca7d94dd8b48ce8692c89ffb04",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45301000000f58a3dee8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44100000000b63cad77dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bef0100000079a1743d0344399800000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df979722368987ea000000\", \"prevouts\": [\"8b783e000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"624c37000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\", \"3919240000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sig/flip_p\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3a32644baefe3ac33337db5680b91ada91bb1492e89948fe78283f042ee27a18f32a7e077dffd72a2dfcedb3c11a76ac85e79a08a4ac88d837c7474d59c03c5e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2d2a002c59ae4f1ad1ff62e8b28787be77ab902f4904301a256bb931da009eaaa0b17b1e971da1628442ac83d6d8d8f1e97b9b3bc114b901a069bacb649de84d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9afe6dae1af7cdc07ef615de0c3d2ebdd4f68c15",
    "content": "{\"tx\": \"dd3b93eb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4350100000001cd7ca760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703001000000c72c4ce603c01c4200000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787eb283c35\", \"prevouts\": [\"7397340000000000215e1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"621410000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4365f1bafa45f9923db203de3ac8ed384e7a9fab5b5ff70682d274a571a3cb19c273da9aa6bd2b34be6b693eaba26bfe7e2cbabd3fb79f0845a0a5727bf14481\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9b42d222b18945ea05823e8a6dbcb0d54a364700",
    "content": "{\"tx\": \"55f3a2c603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5b010000003b874fecdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0b01000000e740bcee8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4580100000096508f98011c849e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac56000000\", \"prevouts\": [\"4ff72300000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\", \"9d0f53000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\", \"b9943e0000000000225120beebf2e29d62b55aba368e7e892512e69e2ef37d942bd7f6bc768a8958380305\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"0f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e40618ced8556b537519ff4ae76117678a5ce8c97b03273c29fa3282403423df211491142a38ebb10a24e36aadbe0cf227dedfd0966bcf56b2aea8b33dc3fd67f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a0125ce869dfcbad463e82b09ee300f32db0e22e1716cfd6fb616cefb0ac74cc40618ced8556b537519ff4ae76117678a5ce8c97b03273c29fa3282403423df211491142a38ebb10a24e36aadbe0cf227dedfd0966bcf56b2aea8b33dc3fd67f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9b4d35c34d31ab2b9e6a0becef710c9b00ec976c",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cd000000001739216b015e94010000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7968b000000\", \"prevouts\": [\"36f40e00000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09021d0e349534330893be62c43bf685af661b5deade0e796f154898d44d7530c5ecbf482869a96c1dca3c401c1cbbac55725c36d42e27620af71b1c8469fc7227e96b95218e4f8e8b0bff434249370ca6e8497f5302b1485f8ef61d3da1f0e788f1fff219d5616dabf4995b68f7ca0704435d99993c0f67b7eee5e0d2bbbef538f606c575d54143153fe24c3290e15022f0bab428fd67dc89580af173da65143a37c4b062f8c60dce2f4bf2d26c127db203821c357c72df8863193fd8d0de1b762b872be6e9afe9c3cff474d7fa825bb5ccd3820680794df6712957331ee8f1d0e090a31ccf0822418061ef32bc2db6daebc9c051ec1f72fac11905989a081c0565d61a71c95e4a0ac2695d7f10455117ade868a109f8713085ba1c5537ba85560d4ec944acc9ea75da0561e3ccc91bdf3fbf47c143ac4fe74a8eca893c2e033cb32e49c91d15ecd9ac9ca791fdee1a49a61cd1b936b081d9b60e8cb89a117aa7a7ccb67a461638fd0fbcacdabf01d2d6c0ab7e2563334f24397ba0857dc4da22e9528176cf818553d368eb6d209520140f06827d86094476a290d5e9ac05d752e58e06886f193352fbd921ee45cd32c6e62ee8a297a1741da5304f537bd13f8b1b7ce9cf5079b649cf50180902bfbebf85fa66a5980032331234f62e1dc8aef84c7437bde84b72b1776f861c9a2ea937bbdf677a00f225e5befd2c34fd67686f1a023ab4c12bcb38c94e7550\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ec3e8652ccdad0df59b5761f2ea097b8016af2709c74f31f9ca84c9f99f70f610826552c6add4a61cb16ac7f3706b11d0158c18b61683494ca90054287b9ac7bc2fd9879a2ee2ae7d76224c991edc718b1729f7f1922f570a67a21926d2cc48d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902883f4eef938c9952b2f2c72ff143ff181a42a1d180e3b595395c0e98240fc25815fe095bac959a256a3d4a5914c9ff25b548addb7097982fecad7ad4b54a1f3b1f3e5c0267b73ce9b5732c6a8f083896e98a34b05b7fe4bbc9b178c8b5c15ae1071a244e87e38ec6c5afd208d5ff4aed4c281f3c39a3f2b14103ee4bb9948b4e9e650c413be5662f0ed9340211481065fbca9b6e37fe1422930f29e070c88ef2fcc75a3775073b09208d1dc60cf4337b8d7402588a8eb6af60226281b8f1feba0d961eeef878b46b4bb0c20130145cbaadcd9d52204839700fb5b5135a3e75c50d675aa21f4412f71b4699f3f846574db63999a6dafb5956c967ec6ba80e3aa92de521a298fe901fce2e0fe2a0d1835b3cd42a05f420dc02824704cbfa65a59e0b62ba42d0b68270be62376b03583635db5cea65fc867f7d3f67f3921153b79489596706407b1190dc95c4043c94766e9026e990e5e9eb0e2ff91c00e3c9dbfa49014c99b1b956ad4c1bd8928bf1ee741a336af4d1f8416874904e6fe32e47ae88bbd07df2a802fd1fa61b7c7c197091ade9e91c7fac65f2cf8b9327293fd6c71922ecdadec083d48dfee6a1a5074468bf78f2b8df60d045f1b6b5ad84766dcc07a4c16e485e59d63cd8494bdbcfa0538aeeb932640ed257b3b8ab501064dec04086971fe269948f6f81e797cb5ded2f881504b32c82c46205f36e1f910ad44082f0b3f7b119172e1a7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4faa718416d21ef008df2257ef512539448f5ca520db3fa3c7b8aa919421e6092eedc10b0e9ea9319d9c2157dfe80b60aa665931711963da9ab109764ff1ab789\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9b51c6d0b56ce78a3dd7924a0c74626beea4b529",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce00100000057728689dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb2010000003f48ebf8048c75b400000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac751fe021\", \"prevouts\": [\"016e5600000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\", \"13e05f000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_81\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e13295c7b6ed57a759038704cb8ddcf0808fe35c803fc1457862f9900fa469f9462a0315d3c3880b499fb50096b0540d80f23bdc98005da87909a8928753d08c81\", \"50638f7cede42607b05e090bf1ac6d41a5a84c4929cc25c2da17c34d977b4b42870d7946377dd689c4c2e096a153831cfd9694f76933b4d225852f5916897f0d7cc071fef6cc91a660fc5df03d8e86571f931d7e613b53ae5550b59a1715b187cee2b4bf1bfc2282fb1d0a7182090163f183fcbe241440c03ad1c789151ccfeca21deb266a51c17c4a5d29dc79072e084a3d729721d5fb86fd35373f277a2862408302635620f322a64d1440ae5ef50931f8de8969250859c9115e28e24943326ce02a365d7e5870490aa8df3a685497e5e7272091d09038541e1d919362dff3971dcab173b3572692cf2c5488ef1b1ae79dda0aaadbb0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9aa7cf253ec29d548228a588e981555279ca42d5b2479bb0f774c6b009fdbd4cf127341e4d00b02b977f5dccf48587fdec0c07e373343a22447782773da7898381\", \"50947eade5523082efb2526fc1ce6790501a5ea02eb097910424f44142541929dd3a910215affd9b3a4c1c2e8dc750c9aa1a48c8ded93fc8fc6bdb067381b3e9ead203af6f47d3a5b7862e4f3deab7dc6edca0afe1ead31013d57e6be66830ea914d9e47f50bce83d6adb3f391da\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9b62911307d4c57e65b67719613737ad5d45433f",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c21010000000ae3668c60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127048010000008de810588bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40d00000000fa4dd06f0403f6a000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47870d92972e\", \"prevouts\": [\"96975b000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\", \"3597120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"cab1350000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"47304402202102236249a2c7ca5dbf805a527d929f15d385667c6de48eae33debe18c14ab102201f0d31e8944160dec4c98499ab94f0467ece919f9c83bba062ade9b72261ed0603004c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100ff0f8af7011e35ce0bc791225830a59fd29bc471eb2074beb42c51d0e79a241a02206273dfd59e248dc077b982e88ca651bac26ae2a79bcbf89b7d5822c6e0cbf5800301014c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9ba6a6cf62c5826ffc6fcd084371c29d51f194c7",
    "content": "{\"tx\": \"d97d1cfb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46601000000d2c0dabe60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703900000000021a8ba701f3112f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7964a030000\", \"prevouts\": [\"4aa7410000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\", \"15ab0f000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"5a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936648f7288da451c6edcb2ab904ab412d7719851ebe4c732831d3fb8a1e081c682db79ef349d3e4f05529a42271c6cf93f8e06fd8991a688edddf7288612a03eef8b5457f6f65490151d40d3d05d55f9c92d8dec73c7aa55a79aa7c51354918829c531ca70e78518003474f611c07657b0808402a053b744a80e6cf25146bdf24b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367960d7b37dd1361aee34510e77acb4d27ddca17648a17e28475032538c1eb500da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb4949da8d2968254411aebae49708200d0b19b59a844616925b107b397a8b89bee9c212f1ab0dfa1a42522b9ca3467b009d36f3b841f39cdc4da4a0520ce4fa4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9baed9539fb0ad3446fb36b9804e562244aec18f",
    "content": "{\"tx\": \"d4ff116302dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0900000000f64f3be68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c482000000007d0525a00173622a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d17e085c\", \"prevouts\": [\"e5b54d000000000022512074d6c61045a03724ef8fd881d073e11ff568ecf53a923220aba8b11cef73942c\", \"fb75340000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367b274c5efd2c9897d6afd12185a48991ee50489712c76155d50b07e4f830953e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aba616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9bb0ba96392a718e713162631e2036c2a0708ce2",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fa00000000486720d6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb200000000fa9d4aef03b15daa000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac24ac6649\", \"prevouts\": [\"0aaf3d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"804b6e0000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"ac7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f6e1ab16ab4bc20af15f35a7f6b67f82a67b85511624b76e02698979773111889f9ef29ad3e74b34f129235a64deb65fb580c2718ff9462ea3ca43b3a4f56170fc485b911b91245b46c320351c8e1d13bb30ee22c3f953d2224593bd4b5088ca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93621ea3e1176867e27a76e6bfe64b0f928a3852297448d22c2e9793b9d6d23c8f132d0ccdc2029b00ec7048abf887bee187f4acce1681536a58b887d4e93139fe875006811b549bdf6e8160f30212dc3199b386e615ec459cd6a9a101291e049b6126490c72a5b15e8927e2896ebf8102d665fc08f8a92e888d3aee8fbb5026d2b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9bb98651acde18815c952146548c472023a22072",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3c010000003492e39adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccc010000004291f994019baf2100000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac92000000\", \"prevouts\": [\"4ced810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"102e5100000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_3a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"51b67b449e083bbea12e4d732039d6e9458dbca041e8cdacc6092706154f23c9721b41d26d738a8a206906876f5c36b69047ec883c49b62b658f866fc0b8a68e81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a7d37dfaf176d232e348a4bcdd544f0a0e684beef3662be4f81e6e4f61e4951eaa4b3a294d8ae5287681c3f14645099d0d360e9c6fba489d3e69ae11a40b6e963a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9bbe3f1ede4caaf74b619e6e82cb6b6f779f366d",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1200000000f79331a1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1c00000000af1cfe2a0186b90c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d3d29e43\", \"prevouts\": [\"46751e0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"1b83220000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09028511e012394139000bc474cbba2e91828002ee1683d62562f44cbd4305dc55106c19ef457daf4470ac49b68596c0a2472a1ff336f24ce431dc440b5cac5c64c7447544ab72369925e9fbeca386f6073c0e6f2aa87c1227b8ef450abee94fcc89f71c4f16193249d67af091917262ecc40f88e9f2535ad72f7d8c2781628c4c96fc7ed17c77c4879ed77fa4ee71a86dba366a6a2720b1bac55468b05b8751ea1aef16a096ac7b60f13294523cf0891ce5c9b7f32888d4b33eb973e0a222cffd75eadca880fd2238f2a12fdb95957f399fbd0208d403eca733a4d4646be9e17e3bdaa17c64af6397935d237e49a083ea46b1b8c27c952a6dfdb13cd9dc4341e9e33c336f9f61ee332361de5cced250a8033e13eef8a1b56886f5b4e299e9325f391a676b48b10b561f5b9005b08dd2c97814edcbe1d4d84455479a477dfacc3e44b71c34de0641a6821f1a2d86cddac537251cbdaa0170d14d0e6dbbd725aab806c49fa41979ee22c893d4ce2c3c816507207dd248ece7a85aae1b10fa218488b47a60747bf95bb2e5b8cb33c2587b484238b645f2717f0b6ac8a55409b91fde74f7338e8ec911baf31aab2bd1749765a9a94c9f2bd01f7892fb54d49d868b3270a3ae5a1ee577e0f98b9d484bde5a4ee561bfc6770fddbf62c7e2a175762d43ae654e99a87450a72541152aa6c1b88d0a583aee33d43c1475d2ccb788aa18b1ffcc6650464ed71884de75c7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ef60611d2eb8e1764aafee2de1c0cc952281cc47e938078f6f5fa59ba73f89875941b26b476c022edf868776977d31e53e85212ba204fe552062798c457a392dc1a6e987e7baaf45cc4656191a1a193c7abe05aba02d24b24cf2747f96e1d33b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09028af4cb89c337cb0aaa5e26b169472571b8797a849d19cc8b3ccf89aabb9c7fefcce3d209e0ab43f3fd293014b9837a7990f53d56712165af825c31986ed9a36f9162b63e97b1849e8761b5d6939228aa1b0790de195dc963bf55aea2346fd9c8ed8be829181f769ff476641f3d20c6a18efb4a55200a76b3a25c683dda241312071fd4d9099f48600f73a56c6d1c086baa41e762fa1709481025f26ef886a168d5094efea51fc571b4db67c04ef79df0b80fb7ec9631ecedc0cd62f0045ce17983b05c9becbab53fb6249d0e39df7157fe0867a8a7f133f0fce9e1302d46e6e4e592c045cdc56e6e78fc26404db05cafc8717ff55bd5e9687fc03d35ffd7f576301da6fae93ba6906f7cfac82f8d2845c1166f34f3de8fbdd8f64f9ee72ab41a40611fb637bb3fa636f7be04ae26ea4fe645a72fa9f25e89baba9550c7a2078f1df10bc8a68b0b17c0586c9b5c0374c4aa3735a9af48b6a5e3a2e8d145e05b6c71c077471dee5b0532efc99645fdbb26f59c5bbfe0cd930e5a258f1b0146c33f67d12ff2b4271e6a3dfdb1bcbde181d93d90c3495519afc96dbef113e60e9a7d0661c1463e0dc42b515ae78df35507416385347688f062aa0abe1741a49d45303ee27e12e70f868456913ea58c9bb8935600e5857ffc7c2514d4346af8828c37f798efa6470e44fb3d9a5a62d99f6c72650b7d449ac6dcc55a9c54f7c5cd9a7f8bd9444216023f3d3a7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e10ec0b51bfc4485592d1a8fc32a0105404420a8dd2ba09b048dd208f3df546c127e5a3ad1358e4c8217aebfca59af3ae3bc6dd2d33fcb7e66f52e86370eeb61bbcdb1729650f5e7315a74782ce14a5f1169946bc7ff3758bb098f0ad0a25b2b7f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9beb9170ecc8bc4e97002efea295cafc58d55688",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bed010000004b8c4692dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc00000000064d1b7e701d6ec0500000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5d040000\", \"prevouts\": [\"d41126000000000017a914927d550e2674fb9e1f6ae1260d00989fc596dd7f87\", \"690e290000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"f37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364fb8570387c74e796d15284503f002089d8bb47567604cc51171761387d9a6214c9f6a777e87112c04511ef8a291d390ec48b54e57ed7e78d9086ead135876e880eaa4a5149b34d26f0437dfc3cc15f8b829f232fb4e000d97f0d76bcdb6c884\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa7bedb3584a87481f218db37ff1fd20e008c2f171ef887df99e3acc75d9f4a6f1d93ab99c02c1580916967b23bff6c51eda165404bd9578af086db7302f1c7275\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9c1a6591aef6efd4346aa9f750f87940a9783107",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb001000000f97f388a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702801000000697c5d8a043f238c00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87fe000000\", \"prevouts\": [\"cce97e0000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\", \"fc540f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"ef\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93652f3ac1aace3c10cf444e97bb7d38ad5b50faf5df229a4892c0d3ad9e10ad091215b4c606cdda8e0cd0631e1e6566a3457cf9b2eb8ccfe9cc1918e65b703d3f7cd241e6bbc5ebedd8f50ae206f1f82a1e41ff5c139455a0ddb0d368f52a47602\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb41645f371c8079005f8f776d501e78f2a21020e20da39870ba1dbf85c4a15b7eacc28207c7af5a37f80d9c7bda068b6f89abe5b5cf72eaf80ed3e31c2f1c9dfaa6c6fa26e4842a5ec51b34186b71f91671a7cf578e5677dc1f65db5fd4f943bbd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9c3a7896381a924c326a82a884be65e632a9f190",
    "content": "{\"tx\": \"a115863c038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48b0100000096e9c4c28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49901000000144124f9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf9010000004abe32e30189092c000000000017a914719f78084af863e000acd618ba76df979722368987dc000000\", \"prevouts\": [\"e7c0370000000000225120975437f6ff12fc45d8ef3d74f3d05cfb35811edf79338d42e1008b4e2cf45094\", \"6ef4350000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\", \"c869260000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09022ef6775c55da8bde108420fca4ddb99f4c8d91494476301bf3e0d5537c74b70e3cacbbb2142caf78dd2b767d5173f0f3490b25ddb57851f8e76247c728a2f7c64bbdbf2de4a3a14be4a8379114ae6f0d1e04d7338c4597e4bb79b704147b6d5f22373ae9a338d2e0e26d6bdb5ef9e606fc0f0225045a415cce0b05756972064bda704b00b7605c5b8a0823881f2026d897cfabd4b49136260b7a20b748128e12d39af03d5953d034a406ccc188d7c35a3c00ea18c58b95ee79b01ae3702030a64589f8fd7705b9c85eb658058a2f10ef5b1929f004c95e0280dc515d68923bc2abc739b0835f19aa3830089cb74ef6cfa9e99016c261fa9860630ba7d6382a270eb61f036f40fc33d326d1b00d482b03bf4ea888e80fb209caff7e8b8703ed36303434a9eb4ce5dc2f92aa2bcd44568e17fec866140f01e458b7877659a97dd1058800e3f7645672f5eeea15d6a83d5054bdc1ad88e27da941df87c5c6947fa52efa4ee5d2765c30bf3062c4d9f59b67fdec4f5c0db0da718f3c7cd645aceebe99329ada54fd99c54039925e62e76a53b732a23fb15fadfacbb04d6501448c8c40e44165f2d89202dd7305e1be76485e3461a6a3bc0bc64ed8f67574236c47347484c9cb0960e058a49fd6b1554f43197aef49da5cc0bf11bb998037513d0473972b679ed9d3abac8e43f7ae8dc99fe551f1aa9c6ab9a492fccd91a3ace183796772019de4b121fbd975\", \"947d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89828c38da3f3e346edf59d2f92319d23f93cd7e709e1c3907c38a06ec412d61efe847a112bc0d43d64007e06b59459a0c0ad8818c3210afd17f00e931ed6a3b8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902189ebccd35a8c56645eb040f2740f2f31231d3ca373a7f5e13dcf15b898005d4cccb4c8567f1485b9c0b82ca1637baa18471a7750657aeb8d725d21a5f97e070d36472f4772ad92555c64f9664cfe0257767f1a7e24919c67bc7cccf46812c219073463743cdff6a5ca420fa01998b2a85dcb694914098c9da6e5571ed4a7965fcfe364b84bdd9a5bcd756beb7f37484fb910d3b8eb1172feac4f788509694e01de58950ec57af7ac69e596c0ce8650b6d64fee8175bf7177f494e0b24b9783c22c83c856a519d18c273afb982807601c64d8e246343926e3e4662a5f830ed176ccf53243e8706681b8fc60556e46aa61ee4c7f12f15d687f4c3be2d4f5ad0705bab10c417adb1f2fab2bda7b3fd0297b198db502deaa5c6aa83c286358ade2d0c16e1e21b36210125eb61c5c2076275b169aefd7141e860bcc01c127ec2bd108b884fd45ea544e739262ce4710399214d2f17806971c7a330e715b26a6456a8a01180349db1db589bfad3a5439542c5cbd2e58aa8183ecb8adc6b1a4821f3cac1ed2c282faccfdd0799df3850e415112444bbd1bb12a5d1c7ea970a89ab28f3dd8f43a0374931efbeaf8a0167f13e5a3bf2247ec365ea540ada381ee88d60e55a155b57fa3051dc0936ef804f9ba5d3bf929a41c974cdbcf1903f9fa47417fcb9b230b7db2a547e43c9845e139fc797f10128fc57622b2e73119ebd89b58beb8baf7c6626a6eafc7075\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a9be5c2685d91ef557cf0947b16abd2128cd8ef8101163de4969c73a48a3f3202e00206903aca02b9ef6b315776a46e2bb12ad4a7f610ddc80848357a2bf29da5432af4ca45b9bbe99b3e8be0ff589ddab81e08d94f2d38bc0283112328f69fdfe847a112bc0d43d64007e06b59459a0c0ad8818c3210afd17f00e931ed6a3b8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9ce105ac118fb5187b993ba8e83d9b199dc86fe9",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48e010000001eafe6a2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5900000000fd8a98450287b78a000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac6f000000\", \"prevouts\": [\"9605370000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"21fa55000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"30450221009b2722d1f1689f2480760fc08ce6c8857a2f2e681fba01edef937ab1a86c393b022001834acdf9f396329968b90f07cb2879ab0a0e374ece804c1f949b5982f6427603\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"304402201706bc807e41337680cc860e84a34e1e8ab6907ded6cb0a350c07b84965dfa2f0220091e8858f4d4706b0e48634941ff61bcc9fc8a408dbc2136e1782f9c690a233c03\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9ce973c4df052f54b32f61eb27b74cff377e6752",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127016010000005a40fda98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cb010000005cc4a369dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cab000000003c7930a40216509d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac25272e3f\", \"prevouts\": [\"2ae70e00000000002251204929a185ed20b7f7e86ae8920b068b5e7d5df0975bee6bbfbcd97b6bb81e709d\", \"b3c23b0000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\", \"8b34540000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"df\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936744d5f1fe8cccbe7a1aaa208055fcd73d33095ca4828da666b0d1eca647814e1d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5115b534b99635107bf366447ce9661d5eae557250694ef66e76c31b44d1abe134360497a554a17affee0221519da82623f7958d9c28014b232926f5323d6c78d1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d27e649847556e23192b8aeafe173c243f56175d6d7082b77d4d94508f7534d8345e83ad245d963f373c443dd6457dec3808a4f865920e34bbc543e7d04d4c3d1c315aec02adde316e700f87e7c47f474d1ec7cdd06b196ee567d81a15967a13360497a554a17affee0221519da82623f7958d9c28014b232926f5323d6c78d1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9cf29382585d7d87b68e19e5244cd47ddedf35c0",
    "content": "{\"tx\": \"9a15a34503dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6700000000b98902bb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47301000000b91d6fd260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703d00000000c51f3a80025f6e7000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7964c000000\", \"prevouts\": [\"e6fe26000000000017a9141582f8bc3490e924b143f387e99eced40303eaed87\", \"fca73d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"973b0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_28\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0b630d3287e3e85358955715f2f0a3f4e5eb1e6afa47984d58d93a641f8f0c85ff6f85114616b4ac1257a62699a40b11c88e474166094f1a71ab96eeaff883f2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"caa9ddb135c95030d0e1c412c4d93870d366d1b9ec3b6665f52e40293303ea623101ee592c430f9248c2587460f5f43666ed3b4a97fa8b08db20b2db5930e06f28\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9cffb02f79fc72e41c0ac0b800b862fb39b0a7fd",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f100000000f59b89c58bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49700000000fbb20ce604dacd49000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc88977143\", \"prevouts\": [\"5b30100000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"0b153c0000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"837d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e6193e4630789cbfbdcb7d6fc995ac4f032c6d5611c1f6b733abe8356e59ddce06294a5d2648496e5016f850eddfdf01467fe69221e8567db6ec356a8117d8a748163db171dbfcbf374971659a5a65d0378eae0ee15db360ca8cf80a8c2e13046\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d4241eba4335af55cb703ef1b6547d641330ec95ac5c4cf0d3e8e3ea3eadc07c09d3f278379d69ec93b9031f683f10c8ab57e2d08c050c4811cb81bd332eb9e3ff15e37d03bf407745d47da370f693bba1bd1439d95d9059575aa23ebc3ce6e3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9d13b7a6b273e9242c1092d047290e60291087da",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b400100000067e43aff60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701901000000e9710afe02937a2d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4879c000000\", \"prevouts\": [\"19c62000000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"b6700e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"4c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b60f374068df7c3adbd1ea091e34cebca1ce39bd416cfdbd5223e6e299acb4c6847bb38ebdfc0ac99f7b57f94cb3711bd799e3f024c53d691ca5d12dd06ff53bd30287fa60720c35e6546eaa391bbb3975ba5e1722a6124c426d678e7f784bd9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac26d679bf3e8de49490d281730f914e806b1d94cee4bc2d775ba3680f9ace98f724f53fccbc5998418268712ec4a55c070b8ba5ae4e04e2685482dbecadeb1c847bb38ebdfc0ac99f7b57f94cb3711bd799e3f024c53d691ca5d12dd06ff53bd30287fa60720c35e6546eaa391bbb3975ba5e1722a6124c426d678e7f784bd9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9d2325335a737991316f3231a676fb415c357be8",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff2000000001c75619cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4900000000cff75994dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b07010000003c029216047236f3000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8784d7ee4b\", \"prevouts\": [\"ac7783000000000017a91408247b8d3db4e641d0be1ff23f14280256870a5187\", \"06404d000000000017a914b60a534933f6e50f3846e396b9868efc9e681f4187\", \"4408250000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"1655142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"829737e149730f35d49cc71ef0e5dc5a78d0a82a669a8d3820dc6ce454be71374970a23d87752512deae5f5565adae93d05958d0b8266ffc47742c389bcaff46\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9d3dab224014b620dde2b56cee3fec23463cb909",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4000000000968b3edf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270df000000007d2befdf02b2673400000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac65020000\", \"prevouts\": [\"6a47240000000000225120363e143e65a8c3ceb9072edb61818663e66ab42c4302b81f45dac8c3551b5de2\", \"27c911000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a0e3c1fe12052284d0803cbff9e1f4b5700444776faa5407abdfff7c22af0e38\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a5a616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9d6211da7d3f0bda14d5067af27a1abd46dd187d",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba000000000a4dea4a4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c51010000001e406ea960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701e01000000c86dabae0117a21000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac57020000\", \"prevouts\": [\"0ca3270000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"d08c4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"08ab110000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a80\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363cc6c18dbb2ad1cefe6366db899026a91e492c9d37a466c4a7f55432a4bad27920e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e16014c92f678e181bf1dc3c918b3709f7d7746b7ca1ad43207ed3c2b1249c00bdd0313c1abdf0fb4e55d9b6d58af17743a20615f5654a8f167dbe9f4cf3a09059\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d9fee1d17d522d8600ea529ee17a1f25da379f68e3940e5d1c004f35581e554ab44d35a0b3fc5d8cdca17f6fd766b3b7f076a7a891ad519d38c56688c70ff9dbd0313c1abdf0fb4e55d9b6d58af17743a20615f5654a8f167dbe9f4cf3a09059\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9d6647e7af1e10de1b3c608d829400e5663b3d7e",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c38010000002c06be89dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7a00000000a16685fd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c7010000002dd89bb302d4447e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4870e000000\", \"prevouts\": [\"c10b4a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0b942700000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"29fb0e0000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"47304402204f706f03a0f3d126c1c369ef5e64567fe561b29f0673774f209c572d8ced6c6d02202dc968afbd20503547c8c438729fc56f236f25bd7087f0914e3a392a14f987840100\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100f2d0d08b3cc8d7d7a6f50f87a0e65b472b823d06798c9ccc93a97b79eea4ce1a02207317d721674eb5284277f938bccf7853fa205392ded546fc67a2a373506f652d010101\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9d86f6cf43b5947de7d50f80fec0483a9072ee0a",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfeb0100000087f4e5fe8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41101000000bf8e4fc9046e05b1000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47878e020000\", \"prevouts\": [\"9ae07700000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\", \"0c683b000000000021581f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"e5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936269ff6546b497129ba1fe09f7f94be9a0d73dd3621c79696a97c5ae123801203edc23a266999aa1773fe99be867e95cb2abe2d57657b7a4dc20a388644aabac6d0cdffd10ffbed86c0e7536425f8f402fac685ef3be7cf3af5c775f2718b4072\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004539f0e83d2be49ca995d97c64064bae5b8c7dff64f3bec17af779836b699250933d2e072fd8e8376d3a54b2bea1bfbfff1298aece70c0bc2934c8eaacc3044fe58f009f53a1a3347386cf74e6ce512c14e8f46a54e4d2c64fe3ab77cfdd670d0b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9d8bf71616bca5ac31e24117c80dad52352d5c2a",
    "content": "{\"tx\": \"81f75e6703dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cae0000000014a05bb260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127036000000002ce4eb9c60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702201000000586df89c03fad66a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487470e335d\", \"prevouts\": [\"52384c0000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"aa2a13000000000021521f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"06580e00000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"d97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363255b317c7de6e9ae6bb70a9fb776c4c6a00d056fb5cee6a264a49253b234c169208680e05d04c3942bb784f68e647b385a50066aeeb87d1b11822ef550a3a38682a6e83df749f265180f93fd54e474915a8abfc6fef0a760c06d61a0bf42967\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361d56eca119efe8600c7ddbecaafaac765d2e5fc0abc9d3eeeeb65fccd7070d9846c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2d5942624d66fc39e30c2a996d85a0dad9a6418b79db996452744438b84f9614682a6e83df749f265180f93fd54e474915a8abfc6fef0a760c06d61a0bf42967\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9da24604599fa08b01181b48265429ebf1cb213a",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6f010000002411c5ba8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cc01000000e72a29ce0200e059000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7966a000000\", \"prevouts\": [\"699f250000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\", \"36ae360000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bfec9f4a544cac12ec45faee03e073e2ca7a1afd48c2e8b5a3a7ddbd5cfcc3ac9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e8d213d90ee48874bbf2b18160b4fefa78452fd9fac91ad5f640de90a3ceda28c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e1906c602469d9808f25282c821ee4b4dcb0a7f347257f6810852481d8753948638c14f042a58a31b61c3859e3b726944cfc511dd17ecaa68ed5dba7522a36ac78d53ca9a9f93e78db88a883cc9c42dbf55ad09041fa37b21a93adcd191d7180\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9db297bad5b8a7a06f76713a5b05cdf2148f3b19",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270db010000002e0520a960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bc00000000add0448a04b7351e00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac07010000\", \"prevouts\": [\"c18f0e00000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"51ca1100000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"447d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e46ff9fefe634101043d8ca11d5a4647687c0df4bd98e414158186cc8065d9a91f7b6e2c095a2b9a1b3d0ba71ae2a36fa91117ca9fadc253f03c0f98f0de350244f357c04ffd5ab4b0848fd0bc62a9916d6f879ccec8b8201b6b82c9f83bee932\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93685122a638a9254058212aed1298d113a9036b8f89f151ed985c2121175e9df03288d1d486ad1cd5e981ede7314b9e0cd98a009052c160e03e008903fffd682c3fa4004b2cd3f2b5519985ef4ce40029d6249627881f39179d9882ffc68f5bb6a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9dc1141da1d44addec511e26f89d5046f97da2c6",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1100000000c319839760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270290000000027cc25ce0383556300000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7b1030000\", \"prevouts\": [\"e6d3550000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\", \"32340f0000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"30450221009f7df4ccb7286f01184071b2f2469e5e6d722c72bdaa5b81d0388e786cb12fe602204dae6ebc306b7645955a0b84c9b88e5d8c8cbdd3451e63c80b1280b339c9a0c283\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3044022015dd4161c186d3aff010b31cce213e8deb239140a647b3d1c8bc78530800002c02201a0dd4eb46ce03f267a7d8f137747f2e8eac2dfefc81ff83ea23e582b3c5b39b83\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9de0c2afad49fa532a8fea5e4dad68a5f1ab8a22",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8801000000e3859977dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1f0200000017508a9f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708601000000d56fc4e201266d0000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7e89ca15d\", \"prevouts\": [\"0f5467000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"e47e5a00000000002251205857fc26f723a58058d8b22639f4b33f8ef23084aa37309f77fdf87ef7a99b1a\", \"92430f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_4\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"44a1978381621ea420f72e8990d0e7e3e28b43fc61e5871ce0943344d4e89fad3c52f36026a30816ab6735b4080d6faaf738c7c90a71229b6fba0ca2720305f7\", \"87855a\", \"750020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac916920871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93607866517f563f914300dc56dfa5f8b2e234717fbb3f83d73d2cc5efe2ba41a0ed98b24582cbb8737e8c7220d7d498ed31f2b9f710dc34600e46a3149ab474161d7d68e31704311d4b712cdf1e1d8e79c279e23740497741197ef9bd8a24d462d629f5f2ff4b5efda05305db76ce9925e0213f8c3960aba617c7546d52b2974abc697220ad4d17d3512c24d5ae155b6adcfb044ab79ab20bd38e1e28a80464f484cbd75784e993be530d5676f8dc2ee09b64f1f32f66cdc7b4ff59c4092b7cf376ee8f8c1e1fa9aab23cd1073c3056ca33bc71f7534defd8cb78efeb53cedcb5960dbdc44debd3a9d6581183ec7e582c81ae2ba327dcd9a8a8596b9498c5442e0f6f4cf1c458df91a0afea0d2c153bcc49a5c91080076e369005eee9d0f0f929c287d66d90c4cbe9643f4dd5fab41adb0ea5f21af54c16a7905d7aa75be9e79abb756e94dd6dbf8811f581a6677dd5040b0770d6580c8a23956aee345bb51bf7e732609e0d9888e8fabb595ed61aca9adfd730b42bb4be3264e3b48daf2dfdb1dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c02e90a504fb885b35041a93f57bf95bff975e3ce3b01edd50e093d99d3d1a7000000000000000000000000000000000000000000000000000000000000000076077fab5cfacfe0d44da24115518e7cc923cfda0846fe7d6664ce76c18ae77effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4fbc6152007b768a0a9e0ea555589417531593915a16dcb5161fa990fe790e2193b77feb85593374d68ba2893ed797c76657c07a7c180e1e161979ce40fd06297a169906078a0293dbc950d85ed90e3a1c6acd68c7233757f5f87f37ea46f07264225bad0351757cee8fbc4204b2b1c4491d39d7192eb176f116ba4cff6f2bb641533f7966d3bc46e7b79fec79f6d1f4df0a1c250c0cacbcf443017af88329adefe7756b0306fc33d2eb0028f4ee0fdb0a1974fcf7045f05d180ebd9603c6150000000000000000000000000000000000000000000000000000000000000000136517a08a3d4af2465b8c7ec780a2358a75ad5f187b663ab087a650f574e59a37bda4a363bd5cba9df5a222a4cd106bc990d013c633cd17f3dc6a39e3467108b67086733584b7622003be83be8f789fa11afe304d7e275cc0beee4ea78d11afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6ff2c617481b75c05b00bd34dee98a92e192ec68ab8484dff43174aea4c66a85623f05c824104f4894efaa986601a7a0a173fcdabe3bf55f33f03d6e9324c0330e981f9e9d7858cf2744234d067f7c65c2f06e45483768054a3cf417124ddf90000000000000000000000000000000000000000000000000000000000000000c857f6b8c4189b4ab1c06030d0f3bbc9d6efcf5e4be3c29626e522a27a0d0ec21df30051e5e20486210b635d36c83ff9cbad4f361067a21c9ef9659cbf15e489de0065e2010eeba19fe5ad09a950e50d2806c8000de4dbb8e5489b2204a312bdfd9d0203e8dcd91d0d623b187e073ac11e62e92ea76c3bb72e9e90e1a35cccd6\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"44a1978381621ea420f72e8990d0e7e3e28b43fc61e5871ce0943344d4e89fad3c52f36026a30816ab6735b4080d6faaf738c7c90a71229b6fba0ca2720305f7\", \"e522\", \"750020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac916920871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93607866517f563f914300dc56dfa5f8b2e234717fbb3f83d73d2cc5efe2ba41a0ed98b24582cbb8737e8c7220d7d498ed31f2b9f710dc34600e46a3149ab474161d7d68e31704311d4b712cdf1e1d8e79c279e23740497741197ef9bd8a24d462d629f5f2ff4b5efda05305db76ce9925e0213f8c3960aba617c7546d52b2974abc697220ad4d17d3512c24d5ae155b6adcfb044ab79ab20bd38e1e28a80464f484cbd75784e993be530d5676f8dc2ee09b64f1f32f66cdc7b4ff59c4092b7cf376ee8f8c1e1fa9aab23cd1073c3056ca33bc71f7534defd8cb78efeb53cedcb5960dbdc44debd3a9d6581183ec7e582c81ae2ba327dcd9a8a8596b9498c5442e0f6f4cf1c458df91a0afea0d2c153bcc49a5c91080076e369005eee9d0f0f929c287d66d90c4cbe9643f4dd5fab41adb0ea5f21af54c16a7905d7aa75be9e79abb756e94dd6dbf8811f581a6677dd5040b0770d6580c8a23956aee345bb51bf7e732609e0d9888e8fabb595ed61aca9adfd730b42bb4be3264e3b48daf2dfdb1dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c02e90a504fb885b35041a93f57bf95bff975e3ce3b01edd50e093d99d3d1a7000000000000000000000000000000000000000000000000000000000000000076077fab5cfacfe0d44da24115518e7cc923cfda0846fe7d6664ce76c18ae77effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4fbc6152007b768a0a9e0ea555589417531593915a16dcb5161fa990fe790e2193b77feb85593374d68ba2893ed797c76657c07a7c180e1e161979ce40fd06297a169906078a0293dbc950d85ed90e3a1c6acd68c7233757f5f87f37ea46f07264225bad0351757cee8fbc4204b2b1c4491d39d7192eb176f116ba4cff6f2bb641533f7966d3bc46e7b79fec79f6d1f4df0a1c250c0cacbcf443017af88329adefe7756b0306fc33d2eb0028f4ee0fdb0a1974fcf7045f05d180ebd9603c6150000000000000000000000000000000000000000000000000000000000000000136517a08a3d4af2465b8c7ec780a2358a75ad5f187b663ab087a650f574e59a37bda4a363bd5cba9df5a222a4cd106bc990d013c633cd17f3dc6a39e3467108b67086733584b7622003be83be8f789fa11afe304d7e275cc0beee4ea78d11afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6ff2c617481b75c05b00bd34dee98a92e192ec68ab8484dff43174aea4c66a85623f05c824104f4894efaa986601a7a0a173fcdabe3bf55f33f03d6e9324c0330e981f9e9d7858cf2744234d067f7c65c2f06e45483768054a3cf417124ddf90000000000000000000000000000000000000000000000000000000000000000c857f6b8c4189b4ab1c06030d0f3bbc9d6efcf5e4be3c29626e522a27a0d0ec21df30051e5e20486210b635d36c83ff9cbad4f361067a21c9ef9659cbf15e489de0065e2010eeba19fe5ad09a950e50d2806c8000de4dbb8e5489b2204a312bdfd9d0203e8dcd91d0d623b187e073ac11e62e92ea76c3bb72e9e90e1a35cccd6\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9de4c3db0a099c27c523988b4b750ce3ee2c0ffc",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705f010000000381a28bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfde010000001fdee4ab01e9047600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acdbd92745\", \"prevouts\": [\"55c40f00000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\", \"cb836e00000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51f2809a2eb594a6d82ed798bedf8d6754ddd1a8a74001a2f8f1c3cb07bb651864f3b3fb8d5121830dc5ea13d084a01bce62f4c2426ea7fcb92dda33a6ec3d9661\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93643c2517ac3ab4c9161235a0b54014a7814087b294481d246f392479809e3784cd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51f2809a2eb594a6d82ed798bedf8d6754ddd1a8a74001a2f8f1c3cb07bb651864f3b3fb8d5121830dc5ea13d084a01bce62f4c2426ea7fcb92dda33a6ec3d9661\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9e080c9060b0017ebfc6f81bd854014a8fc88ee8",
    "content": "{\"tx\": \"08aca4d7028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48701000000c4c226e3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5801000000dcb7abfb040634aa00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87b5000000\", \"prevouts\": [\"5b9a3500000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\", \"7dc8760000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"964c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900456bbb2d2aacfa419948546f2c8aa96b4ab4a80289c3c8034e795f45f733cf7ae0b35fa22f4b25dbc3a6b67e691e1ba7f45df255baed4abd058cf23fbf36a7f21681a75fe046050f41c6fcdb9e38a8e16ceb2d96bb057130f662fa5c2664fdaf5d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5296\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51b186acb2a5feb9ca494b2668e3b95b217c5b1a118ef72c41b67fce4e6b051c90eb4e626fbd1c5a1d96a595c16e39be42f50aa7a1faa8ff1a1c0cc640b6e10eb9874a9774daa89f30be275a1ff5113653dfa1548b9628ff9725cf694401ebdfe4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9e0885e261051e23c61d7b6859e9c25f16f9aa73",
    "content": "{\"tx\": \"ce6d8fb40260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707b01000000a82eaabe60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702600000000318dc6de03fb901d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487e7b3b94c\", \"prevouts\": [\"945c0f00000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\", \"65c510000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"387d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93663dbae3fcd58a782f045d72728c5bacfc693bf32c12881b703312d3ef1ff344f9b60e5914c50703ee8fed26b085ec7bf74c965cec3b126e70865dabf0c3179e2a12168afdb4ef286e7748ddb08cf408d85b089f504486378d2bfb535c0d2875b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93687eb9cd48618043924a0552f13e304cb7cf31192705149ca53d1915b0f7b733ffbb5a1fe7b9516d3f9237414125c5ee80cc77ac3c2791cf19c93edd24acc7f158fa601fcc68a78472d280e0a6f10ace0c22dad9ad93c154f995d1132d7b2f793\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9e533595a0cd03757f4ce00ca1a54a38453f6274",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0f020000000b347dcbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9800000000d4e7428104d53da800000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79686010000\", \"prevouts\": [\"17065400000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\", \"71505600000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"187d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faec2668268b08b6c5058ff907ef397af6488febb6d6ea42f9f262b28546ce31faeb0356d5dc7bb189d5700ce63be65cd47bafc75bda640418bb3b77b52e492b0f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936de248b3259490a8f0e1d30062da8e3e2b08bcf3de85e2266d4c4622ab2525e61ec2668268b08b6c5058ff907ef397af6488febb6d6ea42f9f262b28546ce31faeb0356d5dc7bb189d5700ce63be65cd47bafc75bda640418bb3b77b52e492b0f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9e7cd3ed8c99ea2f99c6c55da41e1a2e4c56fb9b",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270490100000013ecb1ea8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47c0000000014f64124025d7c40000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acbaacd11d\", \"prevouts\": [\"250d100000000000225120a2880b97adcad5e9d951ecbfc4186ac77c307365c746cd6918dba256e34886ce\", \"13f6320000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_3\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4a4b60f20052e77fa5e17f0f78dddc61af17054366c298978de230333c885d93e95ab6a8134b6e7e9cb1b4967a308ddaa357d787584eeb620ab20a1b7dc360da\", \"1cdd65e76f83b2dbab7e250b2b2af8db0a04726cb392d0f232516ae3cb68d014541ca3e63a447e8ff52eadf4aa201210c9f4711964c5b663c1a633fda71af67135d709f832b51f284909e49d2ce464c05e80d69dfcbfbbcd3eb0429fa09140d70c35cbf1c1564970f3c71486e86ab5f9d1b88ec50ec8760fa6024695f1605f0568f69217dafd2f0858a37463081bccc4b6693d6b6062de223bef28b5f72e590fa6efa8ff7a3b2e3362062453cbab08e85f5772ce7f2275f3c178f4ed2ec31c588d372e2f02dbbd22a422f0c4fb450884b715e3703606a48f075628ce7e2d41ee63271e84e58d68\", \"750442c441325163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936038317a9484741889b65c6c22a4d2befdac9a678d76b2139ff47cbccdabce0b075f9de8df9315d179ab13788a9f0a51aed124e9640fe933e0f2dfcd9ba53c650631439ea9479dd43966b5504a57521f1af14b4790d111c4cbcdaaa06b43a1d2c2d818ae92a6038e6df4e77267968ceb432b81fbab4ebf89d2a9e818069d61c087f36f6b993284bd299bca34b1a11009a2ac5385792b05da61d3dca9472536a2e8a47e91632c7febab8b31522c67292f5f625403fe8973fcc5108275eedce267860a161f6a6fe54f76f5ad160876535005425790db445f57b5b3831be508169355c76d28e8ad9d664eb67c41e2e14329e89b79108abfd032672d949297150b8f4fad6d628b62d3fbdf07582a7284e2e3d85250a63e5900c1526f9548cdf96a93b00000000000000000000000000000000000000000000000000000000000000009191506396eb586b31c9d87517b8792c8c3a17034bdc0d3961fc908c8159255b6c6a9bb578cda592892c253df30cdab068ec7aa209c413ca97183e14518fb3db003c5eabb59dd96d3a7f84b7c8e277eb49c48b1a9a0e3e47a50aab828286fe23aee95ca313d50c59641d7142d949b6098ced445b5b01f5d1c99d703db933e1ac604b6ddef78cd4c47ce10b866e3efad318d59660191e471bdd2194bf328a62fdbad3e00dd4963ade259ff5db3df42dbcdffe2ac5e1c22e0b8fa89e5042046e0f0000000000000000000000000000000000000000000000000000000000000000f787ccd98da746b19981235e716eef61efbb45eb09898bffb9102775e17e4ab71525f4431581d1859a3fe28dda84a8e05ece074e1bf73eff9ae9ccc8bdd119dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7e3016f9f9f0caac60190d697ecbad2ea23264a15326ccee406c1d2debcd99bc1519e7f5286023b9d9ada950a832a7c6c497f1195f9c9700e4cc3b0d7652c08d95a8bbc6a44f965eff8b9ad39018af091fdeeb7dd381382eead642930f8600db152a61b9c3d06841939315c14abd28633038ec8d28f77e12ea8001c7cd16a079026b531cb72704102c66830c4be1fdb7821c7101f6dbad3ace793033b347a86015975080c91c305bf53061e64a4e3fcfe157dae50046d86486c5285ef3ef4d15508fc2b4f97f5096ef799f97eba0a39cdffa8d74567559c66fb0dfedac41173046eb626bc5e88b8a1186b7493a9566b7438856599dda96bc4b06349dd58a6795000000000000000000000000000000000000000000000000000000000000000016482ce883d75875f9b58c0c52203dd0094428e1080c20b1909393fbf3ab3915249fd5c976b4b439c8e999d18122f1b3819ccc62e4f184826aa80ec2fc633f967b64d246947cd5a4e73b402db89139cdfda66f8a53440ed6f62dd8f19c1de714f27197236c1b61553e78131a4eb06ca345c24328ae271b4b92a999637123f13683bed5fcdb5e2736f2bd04ea49d7a09a01016aa4b975c7149b1339984f2c4da19ed4eefef6001b5fe776689838adeb4b94263f0a13eaa636ec29ad664ac03f17ec14fa631165009ec4cfcc06ddafc5728535436fefbc34bdab735cd9fb07f81c0000000000000000000000000000000000000000000000000000000000000000cede8a0759d10e57ac431416240020aa1041d88dc5ea25e80beb4f813b948e10ffd2f236b14bd8ae5fffea290c7f6185094e436a0c3c12682fca2d542c6b54d7b26dee6de2be63b3c5cd0d3732c9a3b1a936a016dfb69ec3deba56a3997d7fae30db2a65025e8a47c9c537ae20a4510e816bda13bed12168abfa5de2cfd710c6b843a456cedae9a8c041b3f3d24a12964af86793708450f7f964b4773be4de7f76699a2b09f0d63ecc32afbd3e7e093edc892989190f778e643d8fb47172861c60abc276ea1f64dec42f37feaad848a37b07bcecafa2a30df41080bcca811fd200b7ffc88f1611bdbd0b157f033263a58e491f31ba4d6c0a94f3dfea301e91e300000000000000000000000000000000000000000000000000000000000000008dfe6489bf48f6d3f6631088c12e0b1dfdf29904b6b58d73d3a36ddb3ead01fce7eb01e964bc836fee76a110cb4b53e79e3494aee516c5debb8f7e422ee40276eba6e7d9981f508979fe7fece1ea94f6471faa57b9851a679674b6802778e2c64bbb27ab0758dc5dc51ed0b395e80d9ea5010146aa1438592554d041de1dad617f84c15d0d8a058d7a255bcccd7b29b0e05ce4f3a77399991ade7ec24513d47e493a2155b7efbbcefdc64ada9767566bd2e635610831ed7793409a224e3c634dff075fccb2ffc6270452d3d19b29c42ec59fa6d222f8dcbdbd13a4587007460f8bd4004f2eee7c0f550c29ef21f56fe0f3143417d6799079eb8081169d49cb6e60eec5824bfbe4510df2c33a7ab8bc9066a1686f6e046c63799ce91404f2b3f2e090cd534e843476acb5c7221f1ebf96d617251741dcac6370179580f62c881562d3723e0b1997f3f2c1e6459aaa9aefad842a5eaf0ca86aa0e1fa1ad8c44403c97616d6c4573e9538b9da4fe42e00326fd178df218f0915d2ee0d7f31aa42472d4a415b09b6c465334a1de7425c93db2bb0a0a31bfacf7914c05df1d44c13cea886b4074c506ea43a458508c06f5d2e09d0a634ff24643fd2732d0c0ce608bf4418568e5f4dc4d9c10cc7f51535fd9506e57fac47f6538778f470188b3092b70000000000000000000000000000000000000000000000000000000000000000d451538220b62b15eb837dde746a548175548de2e34828d6c3e21b46a140c64f5af24904a3770e347b475bcd37e69f01bccb44cb672cc2e091edba220307c2b9a35d310fb7880cedb5aaa258873bffc03b1728c981367fab4bde83e8013cc2a131ea937cc9d462877bb7cc8a698eca9df5243fc292d919436388a67a97fc36c9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b3d2f9bf76b5e7f269099f19bfc11d67ffdb0f7d81dff8f85af90095347da85ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff904cbccfc2fd8552081cc9d94479f68f56bdbd8ca0e764a0473c53832929347a70f725975d16a543bff6e6429387999df01469893c61678a855a421415b277355960e2acb4d1f4ae8e93692c69cc178531bcb90543b69dbe8ba75e4c2f794ff8dcc2ea513dc34c35fe0662f48cf0c473a7433d5a789d39a21df5cc77e502999d7944f53d7474a42d645e2eaf665493201816057f307ff181c9513d9b81c6afff7c244780df2b822c8603ad8b7c5c2cd394f61ccda89559f17ab7adbdb38938fa1e0586a1d0b87ff795c835f64e99b11e3165df8b2d0e90a4227af6576ec0fe044887ffb3aac40ba5988059b4d32fe8b1f721235c644c6d4e895cad48b4ef152effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7b8b85b0c5df1bf94a8ed42d63a20d5ab7873b62dce2a4b7e0fe75ded19f6bc50997156d6b6a43003b4b097de50b426293a49ef32d20b4cf4aa10e1f9f6a33b75f1d24542de0ef4dc28aee12be2e13407198faf5d6c1701201382d3cc694e6b91628552a7e4a3a47bb7fdfe1fa5d6ee6a914f73e3ad93d0d2ea5b18f89cf9012d68f6ae7d50ef18a65911259e28b70a2ec9edd99be44f2742848de01c1139d4fe4fe128396b3c16521cdac94dcd5758b5c1e3d847d392b5673519e9be3c8f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3e392f4165719c3fc591a221a18cd76d487a20aacb1f6eb5e90f6e3fcb603b2bd968e26e2bb195b9a749657edf13ab8034a5591d809ec65349a77b352235266eedbbed849fcd5cd85dabecac8a0f95060c63a2591a9c4c30e6fc2f681dad4034ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff496e6e91cb7cfdf79d57bfb33739f04be4206abd598eef2dbcd30502e8d8fcb608d0eff949b55a8d3acf725a10096ffa528dac1425cbe77e0767d9f70a4f297c8d419cf1db45d736321fe436422c91188d6293034a6ef69090da00ee0c806d6205128635787105ab2fbb65c2f9cd90518c50a19119ffa61d88eed3fb3567028dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff33b53f64cc5b42f98e6a545543ae061b4447e606f29d2b330878531c757faae2bbc521c511e5a977f87e050b7e2483faf1f07f1ef31bdbb96e9f15ef77632ee8a395bbd3c906994aeba0c198d7ebe1bc11370c12204f5ed90f396b299f361b7debe005232c9eb4d2149e0a8f861061b6da21fbcb4266037053e9d88ef930fa28000000000000000000000000000000000000000000000000000000000000000035eb9ff40d576cbbcccc148c325fb4511c3513f3e9fa22642ca8437988eb18e6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b5682ffdef1554936f423a87dac08d9c81b23529a58291f655ce958a51e043bba149b5315d1b32fc5ec2f3a3215c12b34df9b5127478e70245ac1e45097ae37014bc7665b5a987f8027c6fbe028e975157cf00a9a0d04d52c9b20f4b16e62d075e9c384c0cced8236246496f61292392b7e0d94e06bdf63f85438c95ad4c2e\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4a4b60f20052e77fa5e17f0f78dddc61af17054366c298978de230333c885d93e95ab6a8134b6e7e9cb1b4967a308ddaa357d787584eeb620ab20a1b7dc360da\", \"a2d563c755f3de1f62a1eb8f1445f638642861ea23334cf6739ac5cf9e0715143d7a56b2ef9061d75fdd6196cbb0d17b7eb340d4c6baca0b7666b1a64fc044a9046f821627862a198129a3006a64d2fb798262b9602a218fe96933bed19ff85b860fd0e21cdb6987770f925f32fcada1634785cb47e35f52ed654ae731d1328cc18787cd2059e8ac65e9b0bccb6bbde5c6c7ceaa163fbf996429ccdf8bbcfad702faa2273483d2226ed91b972b97f05716ea26c03e32075d44a258371e918a4bd70e7139061b49bd68ec8cebcefeee0c248b5d0b3f7d2c35b63673be07350f49af6e8843c74a\", \"750442c441325163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936038317a9484741889b65c6c22a4d2befdac9a678d76b2139ff47cbccdabce0b075f9de8df9315d179ab13788a9f0a51aed124e9640fe933e0f2dfcd9ba53c650631439ea9479dd43966b5504a57521f1af14b4790d111c4cbcdaaa06b43a1d2c2d818ae92a6038e6df4e77267968ceb432b81fbab4ebf89d2a9e818069d61c087f36f6b993284bd299bca34b1a11009a2ac5385792b05da61d3dca9472536a2e8a47e91632c7febab8b31522c67292f5f625403fe8973fcc5108275eedce267860a161f6a6fe54f76f5ad160876535005425790db445f57b5b3831be508169355c76d28e8ad9d664eb67c41e2e14329e89b79108abfd032672d949297150b8f4fad6d628b62d3fbdf07582a7284e2e3d85250a63e5900c1526f9548cdf96a93b00000000000000000000000000000000000000000000000000000000000000009191506396eb586b31c9d87517b8792c8c3a17034bdc0d3961fc908c8159255b6c6a9bb578cda592892c253df30cdab068ec7aa209c413ca97183e14518fb3db003c5eabb59dd96d3a7f84b7c8e277eb49c48b1a9a0e3e47a50aab828286fe23aee95ca313d50c59641d7142d949b6098ced445b5b01f5d1c99d703db933e1ac604b6ddef78cd4c47ce10b866e3efad318d59660191e471bdd2194bf328a62fdbad3e00dd4963ade259ff5db3df42dbcdffe2ac5e1c22e0b8fa89e5042046e0f0000000000000000000000000000000000000000000000000000000000000000f787ccd98da746b19981235e716eef61efbb45eb09898bffb9102775e17e4ab71525f4431581d1859a3fe28dda84a8e05ece074e1bf73eff9ae9ccc8bdd119dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7e3016f9f9f0caac60190d697ecbad2ea23264a15326ccee406c1d2debcd99bc1519e7f5286023b9d9ada950a832a7c6c497f1195f9c9700e4cc3b0d7652c08d95a8bbc6a44f965eff8b9ad39018af091fdeeb7dd381382eead642930f8600db152a61b9c3d06841939315c14abd28633038ec8d28f77e12ea8001c7cd16a079026b531cb72704102c66830c4be1fdb7821c7101f6dbad3ace793033b347a86015975080c91c305bf53061e64a4e3fcfe157dae50046d86486c5285ef3ef4d15508fc2b4f97f5096ef799f97eba0a39cdffa8d74567559c66fb0dfedac41173046eb626bc5e88b8a1186b7493a9566b7438856599dda96bc4b06349dd58a6795000000000000000000000000000000000000000000000000000000000000000016482ce883d75875f9b58c0c52203dd0094428e1080c20b1909393fbf3ab3915249fd5c976b4b439c8e999d18122f1b3819ccc62e4f184826aa80ec2fc633f967b64d246947cd5a4e73b402db89139cdfda66f8a53440ed6f62dd8f19c1de714f27197236c1b61553e78131a4eb06ca345c24328ae271b4b92a999637123f13683bed5fcdb5e2736f2bd04ea49d7a09a01016aa4b975c7149b1339984f2c4da19ed4eefef6001b5fe776689838adeb4b94263f0a13eaa636ec29ad664ac03f17ec14fa631165009ec4cfcc06ddafc5728535436fefbc34bdab735cd9fb07f81c0000000000000000000000000000000000000000000000000000000000000000cede8a0759d10e57ac431416240020aa1041d88dc5ea25e80beb4f813b948e10ffd2f236b14bd8ae5fffea290c7f6185094e436a0c3c12682fca2d542c6b54d7b26dee6de2be63b3c5cd0d3732c9a3b1a936a016dfb69ec3deba56a3997d7fae30db2a65025e8a47c9c537ae20a4510e816bda13bed12168abfa5de2cfd710c6b843a456cedae9a8c041b3f3d24a12964af86793708450f7f964b4773be4de7f76699a2b09f0d63ecc32afbd3e7e093edc892989190f778e643d8fb47172861c60abc276ea1f64dec42f37feaad848a37b07bcecafa2a30df41080bcca811fd200b7ffc88f1611bdbd0b157f033263a58e491f31ba4d6c0a94f3dfea301e91e300000000000000000000000000000000000000000000000000000000000000008dfe6489bf48f6d3f6631088c12e0b1dfdf29904b6b58d73d3a36ddb3ead01fce7eb01e964bc836fee76a110cb4b53e79e3494aee516c5debb8f7e422ee40276eba6e7d9981f508979fe7fece1ea94f6471faa57b9851a679674b6802778e2c64bbb27ab0758dc5dc51ed0b395e80d9ea5010146aa1438592554d041de1dad617f84c15d0d8a058d7a255bcccd7b29b0e05ce4f3a77399991ade7ec24513d47e493a2155b7efbbcefdc64ada9767566bd2e635610831ed7793409a224e3c634dff075fccb2ffc6270452d3d19b29c42ec59fa6d222f8dcbdbd13a4587007460f8bd4004f2eee7c0f550c29ef21f56fe0f3143417d6799079eb8081169d49cb6e60eec5824bfbe4510df2c33a7ab8bc9066a1686f6e046c63799ce91404f2b3f2e090cd534e843476acb5c7221f1ebf96d617251741dcac6370179580f62c881562d3723e0b1997f3f2c1e6459aaa9aefad842a5eaf0ca86aa0e1fa1ad8c44403c97616d6c4573e9538b9da4fe42e00326fd178df218f0915d2ee0d7f31aa42472d4a415b09b6c465334a1de7425c93db2bb0a0a31bfacf7914c05df1d44c13cea886b4074c506ea43a458508c06f5d2e09d0a634ff24643fd2732d0c0ce608bf4418568e5f4dc4d9c10cc7f51535fd9506e57fac47f6538778f470188b3092b70000000000000000000000000000000000000000000000000000000000000000d451538220b62b15eb837dde746a548175548de2e34828d6c3e21b46a140c64f5af24904a3770e347b475bcd37e69f01bccb44cb672cc2e091edba220307c2b9a35d310fb7880cedb5aaa258873bffc03b1728c981367fab4bde83e8013cc2a131ea937cc9d462877bb7cc8a698eca9df5243fc292d919436388a67a97fc36c9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b3d2f9bf76b5e7f269099f19bfc11d67ffdb0f7d81dff8f85af90095347da85ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff904cbccfc2fd8552081cc9d94479f68f56bdbd8ca0e764a0473c53832929347a70f725975d16a543bff6e6429387999df01469893c61678a855a421415b277355960e2acb4d1f4ae8e93692c69cc178531bcb90543b69dbe8ba75e4c2f794ff8dcc2ea513dc34c35fe0662f48cf0c473a7433d5a789d39a21df5cc77e502999d7944f53d7474a42d645e2eaf665493201816057f307ff181c9513d9b81c6afff7c244780df2b822c8603ad8b7c5c2cd394f61ccda89559f17ab7adbdb38938fa1e0586a1d0b87ff795c835f64e99b11e3165df8b2d0e90a4227af6576ec0fe044887ffb3aac40ba5988059b4d32fe8b1f721235c644c6d4e895cad48b4ef152effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7b8b85b0c5df1bf94a8ed42d63a20d5ab7873b62dce2a4b7e0fe75ded19f6bc50997156d6b6a43003b4b097de50b426293a49ef32d20b4cf4aa10e1f9f6a33b75f1d24542de0ef4dc28aee12be2e13407198faf5d6c1701201382d3cc694e6b91628552a7e4a3a47bb7fdfe1fa5d6ee6a914f73e3ad93d0d2ea5b18f89cf9012d68f6ae7d50ef18a65911259e28b70a2ec9edd99be44f2742848de01c1139d4fe4fe128396b3c16521cdac94dcd5758b5c1e3d847d392b5673519e9be3c8f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3e392f4165719c3fc591a221a18cd76d487a20aacb1f6eb5e90f6e3fcb603b2bd968e26e2bb195b9a749657edf13ab8034a5591d809ec65349a77b352235266eedbbed849fcd5cd85dabecac8a0f95060c63a2591a9c4c30e6fc2f681dad4034ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff496e6e91cb7cfdf79d57bfb33739f04be4206abd598eef2dbcd30502e8d8fcb608d0eff949b55a8d3acf725a10096ffa528dac1425cbe77e0767d9f70a4f297c8d419cf1db45d736321fe436422c91188d6293034a6ef69090da00ee0c806d6205128635787105ab2fbb65c2f9cd90518c50a19119ffa61d88eed3fb3567028dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff33b53f64cc5b42f98e6a545543ae061b4447e606f29d2b330878531c757faae2bbc521c511e5a977f87e050b7e2483faf1f07f1ef31bdbb96e9f15ef77632ee8a395bbd3c906994aeba0c198d7ebe1bc11370c12204f5ed90f396b299f361b7debe005232c9eb4d2149e0a8f861061b6da21fbcb4266037053e9d88ef930fa28000000000000000000000000000000000000000000000000000000000000000035eb9ff40d576cbbcccc148c325fb4511c3513f3e9fa22642ca8437988eb18e6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b5682ffdef1554936f423a87dac08d9c81b23529a58291f655ce958a51e043bba149b5315d1b32fc5ec2f3a3215c12b34df9b5127478e70245ac1e45097ae37014bc7665b5a987f8027c6fbe028e975157cf00a9a0d04d52c9b20f4b16e62d075e9c384c0cced8236246496f61292392b7e0d94e06bdf63f85438c95ad4c2e\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9e94137b564120169fc22f85678cc20df3a1128c",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdb000000005eaf85bf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e0010000001162e7efbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9701000000c3c69fd004347af5000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac82745761\", \"prevouts\": [\"612151000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"c6b8340000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"f439720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_fc\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"853d42ba217ade276bec4bea9889ac9bc09bd83ccd2a574c1ec175793897451a023b7a3dd01ff5bdebe81973ca7a3aa93c82eb4c451744e825ae82138795337a81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2197770bd3e8af3068f5b727a940172231dabd48c25a549f8fabdbf7849cb03d66ef506ec44d013bee39596e01a81a55d1712dfc9969d7cc6b04e92a8a2f5e1dfc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9ea50ae0758462d0e77fe1397a5af6f83ad15f39",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0d01000000ccfbefbebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6000000000dc712be3025d9193000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5db0833e\", \"prevouts\": [\"4dd627000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\", \"bd686e00000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4c890db8e530b3b97e91b56063afadbbd8e6ac326e3356562c0a5ff1591f041d611c8e78922f12cf5b391747592eaf9e84d545161f4f09ddc8c51091bc04ba49d4e19d3b2ec28c8925d54c04f383936b915813fb16b738060565344c47074fe42\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e9132ef9050946e44b1b7e4a7390d57682430e3f2d85fcffb45dfde53ebbf6533b9ff415677aca4bd8bea8fa89699624d8c5f018d44ea89c1d7716b3c6d0480766d64d66e5a8ef59726e977ff218232e5171732e5d132f479dce590bd8ea056135478fd9f7e773d9cefb2e6c2d4f28929a19e0115b3c92e29fd8719e7d86d1ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9eafe1e70dda380dee958b8ae1138ab758f76857",
    "content": "{\"tx\": \"47c0016f0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700301000000248adfaddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca601000000923ad6d7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb500000000bc64099104f8507b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72f050000\", \"prevouts\": [\"71151300000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"c3c7480000000000235c212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"db32210000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3f60ee6422cba2535462f4db96604e19e6933f9ddc844f2cbae9020787628186d28d2d4a69e121e342ddc673acb66f074bc82c6bc9cc69c5bd04dbc197acfbd0\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9ee645ca92c85ae4515e7e01d35579bbc6cb046f",
    "content": "{\"tx\": \"232bcb1b0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a201000000a1df09d060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f201000000b8a452ae04e91d1e0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87b413c54d\", \"prevouts\": [\"175e0f00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"f6db100000000000225120c230ba0a2d20add5df8769fc65d7fc3a12d7cd95ad679e3207a6c75325eb884e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f369480f07347d294c5ec55b6a8cae19a0490f895004383b3ec97d49c181391a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a2c616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9efceb8b8d6841f20ca0f194b19427087f5a97ea",
    "content": "{\"tx\": \"a16810340360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270320100000001d67dfb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701a00000000ce8a8e9e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40601000000d70e389401384e260000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79622030000\", \"prevouts\": [\"40320f00000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\", \"2701120000000000225d202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"41d2360000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"437d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e83b3e543c1be24a694e5b6685838ec47a730681350c8079fce99319dc90d9ab403d8f160074737ef82cfbb3f905f5039c6634e29d53352416ee52711c9b5e3cc1cc59ecfca53d850b1637d6273d8700d7dc702fb5baeba7c0d1778aadee75959b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365897004e5f672ac93567f286623682ce4a0a35c34d22bab90c872b273d023f79eb1e69b2064177327a27f356e828bc3139f73429a3608cb2420b3294d8fc1681cc59ecfca53d850b1637d6273d8700d7dc702fb5baeba7c0d1778aadee75959b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9f0427c58e85128c73cd97a9ba41519871d70331",
    "content": "{\"tx\": \"00b76927028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4250100000051bf30848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c20000000038c234a6029a2a6e0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e76c020000\", \"prevouts\": [\"61da3a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"77cf350000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_e0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"35540c96d2bfcca0452351ba875b59e83ab1f4d5d0fa61dc4ed7ed92b4093546ba99177546d6cf56947268693dfdb10fd157965ad74192149732ea5f85c2b81183\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"34d491b130dcb0ae19d2353fbd64025d920e705161fdf0b754baf6a5b03b973c268c756e206c3a1f773d3ddc6e1c388ff03ae03cc386f617bf060655d0aca78ce0\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9f07a530e3bc65a6d0a8da0a8ad697b5dc9ab202",
    "content": "{\"tx\": \"4fe15df402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c790100000077a4d0f7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1801000000465f338e022e7dac00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac43000000\", \"prevouts\": [\"f92b510000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"5e795d00000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"437d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362c503a4390cea1e1efd273895e3e36c6de149914d80a97a30106137d896fa43dd9a73345c989c90f21221bc9fa2fdbe5d62b34ad323157a62317cd84046f2af72db79fc77699d349d3583c063c1ca5cb78d93faef419ab336fa45db1a25ff641\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a84e311995f98367a2a93ed7b61478a76d5defba7ed050312f02844091a9eaa94274b5900613cb2e14ccbb49f92be42e903262ce34f92c4d0a103e0ecbbdfe862db79fc77699d349d3583c063c1ca5cb78d93faef419ab336fa45db1a25ff641\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9f0aaa42e73656b0fce8443aea84266d564470e9",
    "content": "{\"tx\": \"4b419ba103bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe30000000088c28bd08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cb00000000ab5264a260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709f010000009807c48504d038ca0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d33e7c40\", \"prevouts\": [\"2bbf7d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"af753c00000000002251204b9049d3a4bee03b6d234dd4c8f499fa4ef0a49d04247a5113735801c2defee0\", \"5551120000000000225120997d8f010f68a117b9644ba05425738241c47f04463545c88006dd06ca2c16fc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368f473022b83f4d732c0de08884fc6e64a6a991aee44950e226c71d5763f7c410\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a73616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9f1fe443098130f838ce7d5c1460cdc0f13bb12e",
    "content": "{\"tx\": \"d4ff116302dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0900000000f64f3be68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c482000000007d0525a00173622a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796d17e085c\", \"prevouts\": [\"e5b54d000000000022512074d6c61045a03724ef8fd881d073e11ff568ecf53a923220aba8b11cef73942c\", \"fb75340000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_9c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"802a42ae5675834395947fcb3301ea27e1f88de1c06305b5e411769cc3eb0f7e6aa758fee41cb45d165baada061ef4f9ad04c228c39304ceb2cde313b177aea602\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0355d69a42e370d45f177be489afefe75cf14be29e730dfc681d2c9b39dd86de1be6d1b5e5a13e8724d662a1ecebf029a01d9f93ab41eaf4dda7039e1b9bc8f99c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9f282d2e013696b3d63d9269bf869f906bd8cef4",
    "content": "{\"tx\": \"40d9dd910260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cc0100000012faedd7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3e01000000bdce0ea40285d78d00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487a77b7a2b\", \"prevouts\": [\"2dc31200000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"55a47c0000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"947d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823ee723c85209fe64e13625f9e221aa1a5a0132ad156eaddb44490f9df3bced660235be472b05f11e998cd7dc8896eb16b23bac01933cdabddca8bd45937e3454\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364cd5c5526e8b6e5bba0b8549e6c10fc917e32634749acd6fe76e24f40621e4ab46c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa7085091e7b587d9e3d903161356c0634077d7e43e5aac1c0c25d5c3c805eac670235be472b05f11e998cd7dc8896eb16b23bac01933cdabddca8bd45937e3454\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9f78e819952e56d7b1961320d611fdc489b34e51",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ed01000000980d4ec98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40a02000000fb01bfe604d937760000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48738fdec36\", \"prevouts\": [\"e7e9370000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\", \"685f4000000000002354212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"f87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367d28bb4086bcad3c01f7529c578d8b63b0b6c407c08968e5bfbdcc4c6df9aecac194f5b64ca7905ecbca48e3f65ecb2f68dc17df34a907a9e0813d7f728c588e9e87f1230a4dffa49f76a6d91b3ffe7dc371ffdd064326b56030bc36a92eabd9a0f16f4cfe8b052d74bbe565102becb5d9831a57baf41b6ebc95ac4a46ff7ed8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e9b3730ae0e9b8e06af6fa3903dd842ff49b91f4387036eb6432f756cbb46a1de5422b6de6500db2bf907e4c5314ebb405475f57406f25afe5ac62a92a9e6c58b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9f9bfc59905231b990a2d55faaa21a4cf26c8781",
    "content": "{\"tx\": \"f43d36db02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1700000000fe6134a060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270be010000003e5d2c98033b5d8b00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac2b000000\", \"prevouts\": [\"170b7f00000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\", \"32960e00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"967d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fc1eee9341b55b342bc880e6adbdd53cdc9613ecba777072f7bcad421f4395212729135af56592d99186c3f010fd31ebf46aa180b9496740b245c4ec874c834ddfa3c45458ee21e782394432ca1779912e92f35e0ff52c3985a5265a8dee58b3654e31a1d81b19a8c2670362b3a1330b2f2d66c8db1c8314023a61983d2ff610\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936aab9624243e0b9e984d7a536e29f62b11f4b6f668202918f5cad885cf8171da63f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082bf86d7708a8015fd8c392d5dfda539be3c55b3d42b83ba5bec57bef080407e280ad15d5ff3e747c4643a2e7779e2cae74c1db700bc0de7d47935e7ffa6ea968f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9fd2c2accbc395448a7b5d7d8bcafd190ce329a7",
    "content": "{\"tx\": \"4b419ba103bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe30000000088c28bd08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cb00000000ab5264a260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709f010000009807c48504d038ca0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d33e7c40\", \"prevouts\": [\"2bbf7d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"af753c00000000002251204b9049d3a4bee03b6d234dd4c8f499fa4ef0a49d04247a5113735801c2defee0\", \"5551120000000000225120997d8f010f68a117b9644ba05425738241c47f04463545c88006dd06ca2c16fc\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/codesep_pk\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5164a501ab32e15e9e3c23adadff22bc621cc2941d2556b87b03a508ebcedf186b1452f373101e87165c0e90b925b2d6a2d4504ec6df161837fe6ffdf88a89a601\", \"ab04ffffff7f20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba05000000800087\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da6cc091e0a8cd8c992defa26813cb6b91db62f9622e0f05cf39923c26861d57bac00967532285e5651a233a5d3d97b0c986d2b78702c704bc34e0fc184218be\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9b67a30061f0a5c1986b1876193bf412b442c91cfc03ca8a1ebf0eb10c08a58f9311887d9d686725e982104112362571b923525bde686102f6f12be796bfa69f02\", \"ab04ffffff7f20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba05000000800087\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da6cc091e0a8cd8c992defa26813cb6b91db62f9622e0f05cf39923c26861d57bac00967532285e5651a233a5d3d97b0c986d2b78702c704bc34e0fc184218be\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9fda11dcb9654da892e82b6566c4aeab962c8278",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c71010000004ff55bce8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45000000000c0c2d20502325f8a0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac3b000000\", \"prevouts\": [\"c9644d000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\", \"75c53e00000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"96\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ecfde006308150423bef8aa56b6413bd3f073574ad71e6210b8ed31bba8cafc4eb4e626fbd1c5a1d96a595c16e39be42f50aa7a1faa8ff1a1c0cc640b6e10eb9874a9774daa89f30be275a1ff5113653dfa1548b9628ff9725cf694401ebdfe4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362fbabb5db73937a530b9f0def2837a539507418901e7622f5d905eab1607cdfc1bdee2e16a63898e861f6346f98a8f5f2a90fe2be47e52912f18205e56fa5c07b35fa22f4b25dbc3a6b67e691e1ba7f45df255baed4abd058cf23fbf36a7f21681a75fe046050f41c6fcdb9e38a8e16ceb2d96bb057130f662fa5c2664fdaf5d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/9fe5d577717a9a11e4740f29f231fa15b9f4d01c",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe000000000930c87d0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2a00000000cbde473a01036620000000000017a914719f78084af863e000acd618ba76df97972236898797860936\", \"prevouts\": [\"e1c0710000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"1def81000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"47304402205b083d7b3cb3f17ada2bc1041ba1de5c663db5e5ed4e79b6029a95c605079f6d02203e8ccb853b5b8db54c9c5faff5397c824d2675d750efb31c5c69ba7ac39ddacd82004c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100ee78dba8677223030aacb6dd161326d004e574759eb4103242f0c00172948727022030adf79c1c6abc4c5af368abd91cb228f7dd70b3b4b1279079a8f32c67d05f658201014c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a01b0232919914b0a33ff87262f8ba59543b0ab6",
    "content": "{\"tx\": \"5546a66c038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d400000000b5d77298dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b120100000066b879f3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfda010000004fcfbcc7041d3ac4000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcf2010000\", \"prevouts\": [\"968f3a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ebe5240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d3e1660000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_95\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e84803ce85205a41a43df53d568f63f8f346b92a1e7bf717914f776b12834ed1be3f55a2f58d18d24a06f24f0f902667a5d94f4d24a6503c3f979bfae6764128\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"89dd635496138974a37ebffedfe59f49ad8e2097daaa3857a104e9fa608215165971823bc03bc4831d9d012681a530de54da49e895e32d446c4a3bfae68f9dc895\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a027f0c1c564bf78407eed47f2a9f03c60eadc02",
    "content": "{\"tx\": \"fca5d31203bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb801000000d35e6ddfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4001000000e5f842af8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49500000000cbb138bd029ea525010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7b6000000\", \"prevouts\": [\"208c780000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"859d6f00000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"eaec3f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_e6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"121e62952257555587343d62e407df07dc5b15950df2db8c56570a4d2dc1bf1b7caf6a9f4ad1dcc7724d58c75774aedcf52142bb9b675403eb3b211c013fdf0882\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"951e0fb07e827b0a8f589288751d295eb266246153395c5d65c3e78fb204249fe9d4d90b7a5e81945f948c4851b08b14f4e617d52c53daa7219bafec8ec3f546e6\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a0482c5ebc234aebacf836bed890b373827b5958",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d60100000045a55a8fdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c760000000073f099380186396800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2586664f\", \"prevouts\": [\"f629120000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\", \"06e05a0000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ef\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93652f3ac1aace3c10cf444e97bb7d38ad5b50faf5df229a4892c0d3ad9e10ad091215b4c606cdda8e0cd0631e1e6566a3457cf9b2eb8ccfe9cc1918e65b703d3f7cd241e6bbc5ebedd8f50ae206f1f82a1e41ff5c139455a0ddb0d368f52a47602\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb41645f371c8079005f8f776d501e78f2a21020e20da39870ba1dbf85c4a15b7eacc28207c7af5a37f80d9c7bda068b6f89abe5b5cf72eaf80ed3e31c2f1c9dfaa6c6fa26e4842a5ec51b34186b71f91671a7cf578e5677dc1f65db5fd4f943bbd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a04e38678141417445359665f17e2c444cc55835",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffc010000000732978e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270880000000072fd39a2034e918800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e776a0d52a\", \"prevouts\": [\"c1b27a0000000000215e1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"57e90f00000000002254202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e4eb2e5c01db2c5b9db34a40e1ecc9df9d595262605d1edfdef071ce3b0817d8eceada0922be4bad565f02cddc3a9e4cd3511d2d4e5d807c47c8cdd21f6d5468\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a05131b921bd9d6b4ea47f249e51ee98efc05f54",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc7010000003a0d4fc5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1700000000c98173e6018bbc4f000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87921bfa49\", \"prevouts\": [\"658421000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\", \"ad0a4c00000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"30440220617804bde9751b8e890809c5ae8cb4248073155a3e13528353f768c0f0ba8a5f02200113f5d6ecccb5da08e0bde30bdf39c3c00a0780d316404fff35f4a72ced2b0003\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100f18a3f95e2004bd66a0a3a0815525e7972b561d3e272814b34c80e0281bb5263022002f128c1be80d75ebafe7a5b7d39090b044fecf53711c2c207993e40f9d4341d03\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a080874cf108744cedfbb712de9629eed229ec49",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42001000000e00a97b08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c413010000008f316cc504fb1b70000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a640010000\", \"prevouts\": [\"14ca400000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\", \"66fb310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_26\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"23388bb3a5f4f6abb0332f564b193dc02a0cd02cc61add95565958256289a4f6d6f0acd3a0109a874c4b9506ba9e20009fc8531f773b5b27389417744e41482481\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7a2c9962cf680d1a1949e1777423a989b9237cd5a84cbba496f3845ecf411c7fef3976ad52bf74807c25f8416ebb7b109279aa53cfa926a8d478ec4525563db326\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a086f46eaeca09d3649d592dc5a55044d8de1f41",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b990000000015e6e6d3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3c010000008991028ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6901000000414a92e6031b996c00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acd3000000\", \"prevouts\": [\"7bf1270000000000225f202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"1007280000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\", \"867e1e0000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"d27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa1260ed9ec9ab1e79007d15fbab81df65c0fb14652b0fe58f2b730a3e13657de0e39f192d4dec24b48e9231a08b7d2e64fac2040aad69c16c1d9eedfe5fb62ebc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e00def9a487cc21401761fbf52dc8ab7b9916cdeb8a2e13a665b6447e5fe6b3009b801fc18e2353a9cd4de337bb33433fbe6225e21bb8b5572b0acaa50d11b7f3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a0951cc6042b25d64914d945c4e3758a0407ea87",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c201000000284b139001864900000000000017a914719f78084af863e000acd618ba76df97972236898786010000\", \"prevouts\": [\"6eef0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_68\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"677efcd2049ae6dbb42fded0ce28f72dd12eadc92f8136f6756f9b034b8eb7615d6066c637acda634ea7548db5f5369997b43b662a9375a2b26966087b42c43102\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a55fa646dae7e86847c3d31ed2c1676129007e5469172b8ba702009de06d4c7a70938f5e4ef21cef3af388fe1f3f68c477d0d03b08b263b35e32ac42dd1a020568\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a0c092d70e81d7131ac1cb03d9ac8db9d2c0709b",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c00100000051c121fa60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703b00000000d8839a9a038a522100000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4874c59263f\", \"prevouts\": [\"e94a12000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\", \"eafe1000000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"b47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a8eb7b62c5fe5ddbc3113da031846421086c0b7ab5b0b159fa40d7d79be15e64eb712e9c877d580eafa00acbc739496391db115356dec5d41c0ac008be904b5898ae4fb28ba039f9030001532aa52d54afebb8b1d186c7283d6707334cdf0cf3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ed5b4f8de6a475e1475ecf0ed158bd12476ce010b28dce6527e02a32226fe48562e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fd7e736a60655dc533a38837433a3a305c9a2d5b0314030c91796018120c3e9a44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a0d64b88f7e1a35f28c08292725d25214520f7a6",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127075010000009e5d05f1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0a01000000bbe4edb3018e8b46000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478715087253\", \"prevouts\": [\"3e281100000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\", \"f75d75000000000021601f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c57d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363903e3bb34d25cf71b6983cf4f2b76fbc603b2adde28e34b23c45d7f67d4a2394a4f1964bf857a391dd30579e6c45654815fe99168eae3a652a179c44e1715327def1cc2232d9b1ca5244635fcf6779cb15e82fb856baa2ca11d8fd1da35295f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e6d35158b06e93427cedf9700445f423da8a62a86b9572893cb3b0c5b8130f93e00378a892e4dc43a17c9ebd71803200f2f24c9a40c2827c304e59be9b4a7df0b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a1258cbda9cc624bb9f238882cc84253a1dc87c2",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4910100000045a9a31203bb9d36000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8724030000\", \"prevouts\": [\"845f38000000000021531f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"1dff371c0f48cfce29e4d1379377185cdbd69cc7427224110ab9dff4e29f28ea6b2a1651841473ef5b0f5ed2ad0fbe587aaa778f04f4456f364ce1af0851add6\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a1430a0798548b8c620d89157e6f2a54d9f94f2e",
    "content": "{\"tx\": \"98b7339702dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6701000000ce4b1aba60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d400000000185f3c8b02ea2a5d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48721010000\", \"prevouts\": [\"58bb4c00000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\", \"60a5120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_88\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9ac70dec29b2d3b092978378623c536333802faa1d197b5a9126542d8a8f655c9825ac68cf05536e49b469ea4e590d48d4b1d33bbfa2f030852beaa3d03733db02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1d0539899e4afc00c6b5a2a46c857894e39ef5f40ac0f41971a439b814642001fbd0475b4c60100e0dcbca00073b89b31aab779df85964e6e4e4ff412eabd0bb88\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a16835f468084695f51026fc26ce3f842fc97714",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0a00000000de79a0db8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48d000000005b9d85b103a002680000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787cfaf4061\", \"prevouts\": [\"7c9e2700000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\", \"aaf3410000000000225120efa68a115895f942057851c042deb7d61335a3ab48b9e56d15cb953fb46ad7bc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93693a02b6204e347b33b2d98f85c3b8af4711c830846c7f7c064463fb607dbf182\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a45616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a17272e8d29e6c955e3b27761ff0e3908e202ff1",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cea00000000937427d7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5000000000476245d802ecc273000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df9797223689870d97cc2d\", \"prevouts\": [\"dbfa5400000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"704f21000000000021601f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"504c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f933d08853672a2275403f631a185860433b7a30f3dde2a4cbab45ca4cd5b5bf04d1c6645dfa5bcea0755bc1d945f129b754bcfdfa4df703b30809220c35586032cb43424d7ca27a7abc5fd0c2fa249f92b1e992144deb3864a86d466f79c2cceedc10b0e9ea9319d9c2157dfe80b60aa665931711963da9ab109764ff1ab789\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5250\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900454fe66249dd01ecee23c2f5e0ab3cfab587707d36ba83a587f4ef7ad777b411580826552c6add4a61cb16ac7f3706b11d0158c18b61683494ca90054287b9ac7bc2fd9879a2ee2ae7d76224c991edc718b1729f7f1922f570a67a21926d2cc48d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a175484c1508738494b7c85ab928bb65c4a07f42",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709a00000000122eac46bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdb01000000f84b9d610414df8a000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acc3010000\", \"prevouts\": [\"2fb60f00000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\", \"e1c47c0000000000225120a607964ea93077ca088588fe8df58ca0f1df7737d7763c94d5c7768cbab371de\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"9f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93682236f031bcf8158863f62814cbcace59e68087524fe7963c37c3cbb351e6c152016530e482bf934dddf93f5dc5c8477f8e54d8918bd8c9b20d47f007dad28fe6f3617d560800e971f99646d89bd2028caf0c6d02b6f505a11fcad3ec349c801\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fd05043d7db3391e92844c941c401bd083e4053f3eb43fc17e8ceb6537f5686293df6a2e62376e6a3587300ef2d1a395dd90428413a52508272625b5a1a189adb591a16be56540de55d9fbfa115de937b3aca1e4dd0f5a93f17ebd2ebda95183\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a17a5140033f84e309aac8415b2a580b4050203c",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9d000000009313006660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701800000000454fe720038533720000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4cdccd43\", \"prevouts\": [\"d1d765000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\", \"7bc40e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_8b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"51326a5167baadf31a00bc3d2b48d3c3cfb07acf7730c83e95b38e5f666f75d92979d2e684501eceb5fbb9af8c7a86d08ee9b429114ab4cf3cda44d753dcaff7\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6b16e7f81810078d188c33250f16bffb3f542f0b746fe2adfd7b71f3b3c5d5f11558fb927e6ecd7a2e948e784074b97926eaa25f45e014a4cd3f6163ee64fd3f8b\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a1b572d1fe5a9c9111033297ae5ff70014c256ce",
    "content": "{\"tx\": \"bec0953402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9e0000000094ed6d9960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270eb010000004ac8e1f601e4ee1d000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8789e0e922\", \"prevouts\": [\"686f600000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\", \"10e70e0000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063f768\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936afd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173afdf1522df456d7fbfe0d29a7744cbe637017dd01cd6de5bb6b2c07ed06f430b01c25c837ec0a1f852472f3f26e6d49055bb98717b7b68c46cae1e5f9804f9145\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb45438ad321f710317d8f3678f772f8337c845de7a4601c479cd7219e318503b74fdf1522df456d7fbfe0d29a7744cbe637017dd01cd6de5bb6b2c07ed06f430b01c25c837ec0a1f852472f3f26e6d49055bb98717b7b68c46cae1e5f9804f9145\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a1e666afd74df95cb5c06318730dff9116d6a22f",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c22020000002413a1c9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6701000000ebf5dac603056f6a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fca045f754\", \"prevouts\": [\"7aa5480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"691d2400000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"997d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93659100ab1d99009eaf631522d0390412a62a32905c7f687f8ed538c1d75c8e249e3e7df71444e7cc76d8e211582e4acb0f4a71a503115fbd605db9d475b3b0609413afa0de0ff2ef52577d4c80443f6003c675907986908c28bc93ded208ca160\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93617fe6272c5fffac4ddc4c47d3a6fc8218dc4d9298ec687e863b37acdb8199f2e2e3b986c0375fedeed2562a6fa36a7b38b0ca47fc0125e42be2f4bc52e49716a3d673df10a8cc98fc65477367c7f3bb838b82569297570384f0d4df8cd49e6dd413afa0de0ff2ef52577d4c80443f6003c675907986908c28bc93ded208ca160\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a1e97b7bd972796aecfd4b83180776a015f64a8e",
    "content": "{\"tx\": \"d9cbeb5702dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b06010000007bcede8060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706901000000a3cb8e8102bd1e2b00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acf751961f\", \"prevouts\": [\"eec71e0000000000225120761ee5da1a196558fc88c883f4c68738765f8bbbf6c28fcf877f70c5de6e3c55\", \"e7850e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_3c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c507825b3f9bf70f017994ae1df5ac75578936bead8bb05b78cd70c87125a69a7c46fbadf9b2f51f4e2765a6106a176d24e1a4992539ba56828d4985faab548682\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"01244039c8ea5b9a2a132f9b114e5b22d246af4e78d2cceebbd75f5796d4155d064da7f5887bbf9ab0b3ebb7fdf2e1da9e2aed8854c5fd92415f57eff6efa0343c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a2124d0d2b17ee1f1e0998338eea25cffadf437c",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf03000000004470afcedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5e0100000089cf15fa0167036c000000000017a914719f78084af863e000acd618ba76df9797223689875024b63a\", \"prevouts\": [\"d3667100000000002251201dfb228dec79c6e234b1139c58dcf8de3e24a7459acbe9e029f267c6e1783b9a\", \"6789570000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"627d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369bc6aac193a2262f175e26a90d4e5bab3913dfe7b51f554c807a6921f2d2c0809fadf8666e14892eeb42c4caff758b4cfca6e22c4a95966045c21c8e48555a5679949ec80dae58a557a09f1025b3e427a5f07bf4ca030ef1ccb63f0b9143cb03815577f72abc2219d93608f0bf386debaad95a87d0f429ecb808b0f22f69367f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082be3373372acbd8f7355a742b339dc4113bb3ad1c8e82e6b2233d51ce74beeba4a979a031634820b293704e38f33c20e5acd9cb2a8735bda71fecc5f77708044027529efe07ed3ec82dce77345a5c0eb368b138839946732056b6a908dbf5f05c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a2135bcd7d491b07a72fbd501a3b0be1b9f3bdc2",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41001000000e9f03e5d0270ce3100000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7f0d49b42\", \"prevouts\": [\"99d0330000000000225120571bc713e1a1d58bc4a7da330f9b17653bffa646093e5f5e3088fb48bff87491\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"ca7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fad3ea1307367f624c7798ae24e76be5e7488cb515c8e68b506a720d3dc582d682065bfcb7199ff8296c5f7d41f3b2c6067d88c0a33f2878328c609d56cc191f12\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365151d9a62ecf9f92cdb971a6167587795b5c91d8697e265bdca4e7bdbf735582d3ea1307367f624c7798ae24e76be5e7488cb515c8e68b506a720d3dc582d682065bfcb7199ff8296c5f7d41f3b2c6067d88c0a33f2878328c609d56cc191f12\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a21f2d7b6393cda8bcff8df7034062e8925f6377",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d200000000e2e3d8f2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc5010000003f7b88ba0234cb5c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac3c020000\", \"prevouts\": [\"62951000000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\", \"bbf54e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_b0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"593d88a581ae2068becbab43fefd1d17ffa613cb98b37a3a8b63ef4e476e067e8466eed57b0e08ec18bb88d000e9f14b8ebca24888c0eb6db06d114e3db4d622\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d829372431cc203d9de3d6850a28ee9793748eaeb53e292c2533a44764cd414f387231fd303d2e96344cfdca1088ba84d673a00c19704086f4c137bd223abe4bb0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a2452fe77f45ef6a612ce676a6ad9d9002b9331e",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4eb01000000db6b973760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706401000000f98306f1010fe10c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a648000000\", \"prevouts\": [\"3f4243000000000017a91448274ba0d73ec00ce63e7922c9d87a48fd0c670f87\", \"04e712000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_mis_83\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"90cbe6d26f857fa883258d920cbdf22387c79b10ff494ac881ac7757bd1e49ffae3b557583913b4161163c1bdefa8d417579be5431bdc8c5d22fd8e2d9a327b182\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e4c347484f9fecee907d5ea84cf457aacabb6f8628c4b46d156aec0ee8fafec3905ca034020a3f856ee7e9b76dbbbc88be6378dc1afd24b3a26160548236d48f83\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a25b4431040ecd4aca97dad2844cf0080a40800b",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1200000000ec2ee3f4019a091400000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acfba1de46\", \"prevouts\": [\"2b2f5800000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"96\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ecfde006308150423bef8aa56b6413bd3f073574ad71e6210b8ed31bba8cafc4eb4e626fbd1c5a1d96a595c16e39be42f50aa7a1faa8ff1a1c0cc640b6e10eb9874a9774daa89f30be275a1ff5113653dfa1548b9628ff9725cf694401ebdfe4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362fbabb5db73937a530b9f0def2837a539507418901e7622f5d905eab1607cdfc1bdee2e16a63898e861f6346f98a8f5f2a90fe2be47e52912f18205e56fa5c07b35fa22f4b25dbc3a6b67e691e1ba7f45df255baed4abd058cf23fbf36a7f21681a75fe046050f41c6fcdb9e38a8e16ceb2d96bb057130f662fa5c2664fdaf5d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a26f67d81684b9007a2109269de4afe49d23f938",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a000000000a3952b5460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fd010000003122469d0459d21c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374877bbe1c4b\", \"prevouts\": [\"18610f0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\", \"4db40f0000000000225120a283e1ea0142d34d03fade4b28902cd262d82bab6ae3891658a9596d967dbc43\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d9c8c610c58b12163b15ce1ff0c983435a041d13f702eede880a5fb51dce7b8bbce26b858ee1964694df49c854956bd940a4e6651ee2613ac0889a0ca62307c4d72c52511105e97e14983251382fdf68bdae07d0042fda702379b1c9403b67023e44a45315583d327e7312b81cb8f53dec35ca32de8466ced99ea71e9219129b995e0663487f2bddd900c74ad42782a9c835acf86207646b774bb477d587572328d90ae425554246818ac43f1d8e3b189c8d28461b4468ccccadd31674ae163ffba23d7896e9fb65f8b9c99c34057cd73f6c86893f7320894b884c7553efe7e6e9881b7f88932f10cff6d493bcb0b95fb7fb160789e627bbc1ddbdf36f06957c30c8bff80af6305085aa6f36b4c0400a971cdaa9bf8afda35dcd11ddff5f5cc4339a6d602f30bcbb976d6aee00e81841ed043a959ec2150fd868d7d849e322ea402535fe2183efadba2ec82321c80eb01e2a2ba6abf2833171702a9b9e775833f9ca70f37ccc835cab225090255925fe40be04864f85fd2e70ec40d6a6388ffc9fba87c716c3f00dceb0e97a83bb8a7b27cb9f65fa4299aa454db0990a2f0fb75376f4c95368491900fa2baf8982997c80dafbd2a045638462df603e9dd00e03b9ce90595cdfa04ad10eff0cecd58163bca944cb97b5af01389b995b0a9b8b370a57d548957b25b256ab1cb762fc77324128f5e195aa0cc0215b6abf664ade60af5ebca4b7731154c775\", \"617d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4e8a9e18f0e69854b67be61a040c3060df6bfbf530bdefb330c865ce8049deeb0e931380661372836164f4a50b3ffb46f1fe83bc177b7c1bf309591800c178bdd304186c0a2faa80f59261766b0cb9b0760b78eb1f31f166a6f091ab62e6898\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902430eae536e3faa601a9e76609811e76a3dfc9a1296c3e47ed14eccd00ec12de8dd5d86813dae402d0b309129da5fefe13b09e30658f5ee798ab210d2775dc0a835fb84cdedd3a89c8384a99c1f27a8a08052caf06188bd85a1d3a0f89c84ed2549097a76c87343fdd01621a6be421df0dbacffeb3589a7f504fb7b848f2ad4ca397b67e75756fb22a37fa4599f826f59e839e770c7b9d6487b7fc434d93ee1a7e78a8c75413a1ab29c3ab90dd2d2da6875c8542b2422f24cad7e5d2ba8243962940a1f6505284a704c10e28c577929c8e74f23d96b5d5929431fac1a7e75ab70a2a1ed9bd2475b07253d23686033a4e465b9eb32a20a4b81419d3c4796282d298dad6e2610f415f1be2c43720702653bbb467da91390ec7d74a7fbfa0c21b0d116ec394b7205aabd6cbf62257034a44414eaa5f0c50d46b9e388cab815cbd45b683f69a72a94302de34d5294b8f6d7712e69ad8ea68f827d9f874ec3b54815cf2d8697984cbfb270c068d2e89d23fb88fa8b9bab375b563a102ebb2de69a13d7c7bfbde807c8f50896b4be261043eadc465e458adc207757d425860b53617b5fa7f5f6f2b7f95cbf1b878204488b467f7178cffd1ef316dab4bb1732135b3de5b9bb227e511d8a56578cd3668750c23119f3df2ddd45f85fad2af46c46dc6aa36f34cb815a642f2352b403db64e2b4fa77d4db8e6e14ac3ea1c25d10b6a911a95cbb7076c9ed3151bf75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d6338037856eb5e5100eb03828e7e22b5e2035e7682cbb657d792b71d534eb2f43a93d7e1c40927dcd10fd5d28aa4402a453542c320ae883aef57b2a7090ae6b3ab6b2d4691bf881316931c587f0a213fdb9026021e80f212e72f88982a6bfdc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a293d31bc0cff7b14f873a325579ef283c8e2068",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb501000000739790e5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc401000000d48d3cbfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c06010000008bfda2e203856df3000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6a988fe22\", \"prevouts\": [\"3bb34f00000000002251201aa53d82b3e96e8e01ae5203880cf5cebef0e054596b6f65010b7ca42a314e33\", \"5cd8500000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"7f6954000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93636ec3b08c91f84b7488277bf883618c6df6d611cc9638a5cd67e555f32bc0de1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a26616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a2a3d1e6a386b04424a390d174bdd394f0b88602",
    "content": "{\"tx\": \"6a7bc0ae03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2d010000005909f2bfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc501000000c4642ca8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b22020000008a37259c02ef808b00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4c7b8943\", \"prevouts\": [\"697b510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a86c1f0000000000165b142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"e3fe1c0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"1c8ae8c42dca6eec413a2a33e76060a08817f826743139ab4caefbf03e884c281167c767454bc3c057abe112dfabda4a58e393e744ee39c71cf5ba744b10c43f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a2ad73830bfcdf027adbf16721e9d3b54303b060",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c68010000003c978ae7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6e01000000196033aa023d2f98000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac56020000\", \"prevouts\": [\"530253000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\", \"25e24700000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00639668\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93601486982337d932f8a5da13542a421b8e8f9ea3c3f47614babafc47e0d3ee68833a51c0dffe7e5434825b6cc7212f0d90dea7a5d3b9982f8882f19203896a3c56fcd0fab6a67c3bf230276b49a6ca24f17dacdd3ceaaa340a5ba0b2ba475b0ee81a75fe046050f41c6fcdb9e38a8e16ceb2d96bb057130f662fa5c2664fdaf5d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936db0a763bf19cfa833013adb8a01fda43f5416b14010ea87884a0fe04caa7ffcc6bbb2d2aacfa419948546f2c8aa96b4ab4a80289c3c8034e795f45f733cf7ae0b35fa22f4b25dbc3a6b67e691e1ba7f45df255baed4abd058cf23fbf36a7f21681a75fe046050f41c6fcdb9e38a8e16ceb2d96bb057130f662fa5c2664fdaf5d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a2c43c8aa3d41b7eab2ae20fb1f9e973802d902e",
    "content": "{\"tx\": \"d181cd7103bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1f02000000538bccd660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704f0100000003fd78e5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf30010000001a08da8c020568e0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ace80c3a31\", \"prevouts\": [\"725f600000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"3713110000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\", \"e23c710000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821fd87b85adb72b018dc8118730af51fe2e1fc2345a45c291032ad5ea0f36db09afcaf82673e7b509fa61dcb6f9390da3a7ce1e18401449d1277235bd9d9c04d9a72d00f85eae87f4cc31996f158484f267a3b4b9a04e006b9a1cff5c0be2781e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363801b0fa4cf19ddcf56ab9da9960ae09931238675d987d4e01d2f119420058266b70d0ea7480f8ba050345bd8e4e7681bbd8db77ef27050d0a3831748599db67afcaf82673e7b509fa61dcb6f9390da3a7ce1e18401449d1277235bd9d9c04d9a72d00f85eae87f4cc31996f158484f267a3b4b9a04e006b9a1cff5c0be2781e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a2c7ad1b00fd60ced001c83967d4fb945e86a28a",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a1010000009c56d373dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbc00000000662fdb6e03de2e7d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd858f22c\", \"prevouts\": [\"c78532000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"4d314c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/minimalif\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a6462aa0ea470e7e5c32fa016f17fa7bd944e60fff375b5c3d3a24dfbcae204ad958e244ecea882182ced9c81b658a32811b319012b9e7465b483d1ad799c316\", \"01\", \"6320871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac676a68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93692f0de23ee769069055d0d6d05652e1367445947e897223d0b74ba21bedb5258c23c60128fd3e7af8adaf4abc6718bf379ce4956c06c6d05419568a3b7fbb4becdfa5022fbf9ae5dfa56f4098acf4285bbe92d9aeb187fa2d4d396f6e0eee31df9d9ff7331949f40b876b1f64f1a10013ac65e222e2c8b225fa80db88dddb53aa6a2d9e7459765b4c09c28753bc2ff55d05ebac69a2359cac2688619c9c27618eeb68ce69b97818447ab7b9a4ba90bb798d21d9027f4de024baf5f3b5f4da875d446577c2ae0ff5873a151ab353523af1af4fb00651b9bde1c1989520e7d338bffb609e59d45c7d1e0be4118ae582299f3fc1b7f496d16d6ab2d0d6e0f7a455128ce34dda559eb1787d0c8deddf8f5f19f9fd4c2ccb2eb142b7063fdfa79ad71051bfd8661ff100df5daaf9353084b6d3751b20c475840529a2a7efac33ff2efdbb6b7c86f986531e7bd2af85df536ab9da539cb9ad98883aa4960532e755ead635b927ce0af32fb24943035d26d0ea88bbdc698d8d4264beb9c7e8103a368881360dc44ae3d69de3386cee559eb49e6c76a737e105f9117431d64c73a13a31f98b35f150399876b232678a58bf83578dbb2c055ad176d56177c4ac303846e798f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a6462aa0ea470e7e5c32fa016f17fa7bd944e60fff375b5c3d3a24dfbcae204ad958e244ecea882182ced9c81b658a32811b319012b9e7465b483d1ad799c316\", \"003031\", \"6320871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac676a68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93692f0de23ee769069055d0d6d05652e1367445947e897223d0b74ba21bedb5258c23c60128fd3e7af8adaf4abc6718bf379ce4956c06c6d05419568a3b7fbb4becdfa5022fbf9ae5dfa56f4098acf4285bbe92d9aeb187fa2d4d396f6e0eee31df9d9ff7331949f40b876b1f64f1a10013ac65e222e2c8b225fa80db88dddb53aa6a2d9e7459765b4c09c28753bc2ff55d05ebac69a2359cac2688619c9c27618eeb68ce69b97818447ab7b9a4ba90bb798d21d9027f4de024baf5f3b5f4da875d446577c2ae0ff5873a151ab353523af1af4fb00651b9bde1c1989520e7d338bffb609e59d45c7d1e0be4118ae582299f3fc1b7f496d16d6ab2d0d6e0f7a455128ce34dda559eb1787d0c8deddf8f5f19f9fd4c2ccb2eb142b7063fdfa79ad71051bfd8661ff100df5daaf9353084b6d3751b20c475840529a2a7efac33ff2efdbb6b7c86f986531e7bd2af85df536ab9da539cb9ad98883aa4960532e755ead635b927ce0af32fb24943035d26d0ea88bbdc698d8d4264beb9c7e8103a368881360dc44ae3d69de3386cee559eb49e6c76a737e105f9117431d64c73a13a31f98b35f150399876b232678a58bf83578dbb2c055ad176d56177c4ac303846e798f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a2ccb0337cf44bc0b3562bbf7dcdd792989d5faa",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb000000000e4f669ec04ac822300000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a666040000\", \"prevouts\": [\"be952500000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090294fad9d9bc6351fdc94a7656afba8e89e5b812c6783493607a705880eaff1d63d8cfbb05a417579db75737cd3968abc12f70acec2df8eb9b4c546bf9d65017846ccbf6a2b245ed571bd16fcd5798304b39184a3ae968e101d288fef11a1da81d5b0385df894b44d857ee1973418f340ec899109cc89ff39915142f1b3bd692136dd7b39e6f8399273156172436f8cdaa2acd91c244247e385e7dd7b3ae2f200b578cc6d05f86d3a0804953e7c4e76a080408110420014e78cd2170f59d51abe1cff9a532fa5a8efcad381b6c909fce21fede9c800215eaff842449e8e2bbf98590047babb43b1e452a08ba542e25f1a43b924d7c00c45429949767f9778025b2a671986d23f396a8108581502bf5715a287348b92b53a1695b7206ca70c95fea0745b88d592d6cd8e518f8ac9f5bca3b46572df53f660faef30ac24f45566a2bb301b6dbf5b1659c4a2de17907531ca4d8bd5dff7cd50bc5783034bd546529680fddfda909da11af34fc21bd52ae5386941c0a539a93f9258363d35d5a289ae5fd70f17bb3573bb6ec8b1e20501d90257da1253cde48cd8af24bd29a12181683361a802f0e5ae73d53f9b379aebadfc81181a4ab063779b4dc6f77f1c47b91d9f97c86c194079e479de12e07d39bddbf5198c9373da9a4b27a66c33b6015efdd892d6243237655402791e8a882511f0bc52f3b1ed4c15d21bebc24c052d1fced800fed6ab363bab1bc75d4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362999d4fffedb03f009e32ce21e56d156cd5a3e9aac3f7c46145f08b7b6c81b0f70b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d8657208959ac4fa8a57d164b76708dc6f63c2efb2484bc5a77a391ceb66b2f5ad6b35f745d0948d124101db49c294d83630876065ae400dd84de1c183cd8c786ec24f9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902224dbb5cc65ce0dd92bdb20bdc334a3500936782a9cac75aa5987e27a9555ae9b53b8272aba9ae29b1fe58a74e7af7515844dd1c5a6de2eb5da739c71498eeb837e21f5b6fa7bddf9f8c1f96f0fef15baaf56c679fa3bd8c737710ad12d08104c2633ba7bbef4c24856aa9f82ba758e98c5f74e0efc51924ad14da596bdf94793f498eac18f8585edb2a522096534c52a21b63378a3db58f8f281bf7f18ba8fece00df01f12a6766b7f0d7b86e5e23e0c1b8a61445347b9a6fbe2bd4bc7b08c96765c5296dcc83cfd7570f56959e55af1da3e3a62fb82389e972cb37ea002c5e3d8ad64d6f5c95071fe89dcc54cfb979d42a19100092d501b07520c41a6848b3bb25253411938477e2c586703234a413952673d02dba6c0e9f3608aaabefd7c02a8c7b570545c976bb4b81f7ed8d1399e3b427311378269a5d464ebdf85305dd2041fb01c50e125531dca89bab32c4d5e20c7eeb4c75080d980e41d96500b1ab043fbe1a7d2343415ea21c81f26eb77a0a9ecb6f967a082790852813c946c811994adddc14b42304cf79e541652c2a37010c2b490217a86c2689cb48e066f297d403d6e63316cfb9fa2f583bca07dfa3c690fa0c971890e7f73731d89ac19691e4cf947492808656c0eca895845bd825847655573280d39fea3400964205e96b96474a7aedd7317a58da42f3e95be942e01bdd8a49e73666631aa1a4e2bd9a92cae6b54f9f6eb9e2f67561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93698f67b82a647171bd8e62e386c086816d8191afc712ffc3b55ea5f04f05c8f03e05ff666526b724612289f11d9af684c97588c9b58f885be5f0bca0261c5a78c938b5973806e5396d9f6a2ad240022103fc2376d5af9a7129252a47c1a6405aad5a470b8497850c3a230fee464eb343180400453804118582df887251250b2f1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a2f70a0c20b111ca1ab34de6f2319109527a564e",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708b000000003bc37beebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8401000000aa486e00015ea55a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac1e098721\", \"prevouts\": [\"322111000000000017a91448274ba0d73ec00ce63e7922c9d87a48fd0c670f87\", \"d110710000000000225120396e1e3d37873693c049a0e141d36811f0051f76fd306cc6c1f2259368cdf0eb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2251202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"31d78719058083e83da50049f7f5e9dc1ff4c8049e59853f1a2b5a64a95a7e08a161ddc9bf87f24fe39c335d48f9299fd21e5bc8ab0e5e4948929d043d21b0d5\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a32041608e8afe0ca18b503f0e9c30cd1480f6e2",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1a010000006c9b93db8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d601000000fcf1a38ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b33010000009c6a06b504e4ebae00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df979722368987182a0b5d\", \"prevouts\": [\"29c3530000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\", \"0ffb35000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"bcdb2600000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"6c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa2e65fef4aab856faf00f568df948255673469e3e5fcfbe6f15d7212245640ae7ade389b5221dc8da0332285833f8f90d31bff9f5dd8cabba4bb6916c2c5f203000b960c1063a40dfb5dc510671dff140eefb73aa6757bc42ddda0d13c6b661\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa537e729fcf8585ba70be9503b33ad258cc8c70f658d9ebd11d7348a395e977e6872a8a6de95a80dc4a6e95ba0e12854eab511c8acfff04c6cfab0ff55ad6b178\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a32cec9ef7fd885815ad4d76f8a45026473405b3",
    "content": "{\"tx\": \"0200000001a86a862f8a1bc1808f7ba2abcc71e2c0ff30c2c698fc832f6545a8dcb978b6cb00000000003bb9f1ec02bd2aa1fc110000001600143f886f8feaf75ad7bedd5713d4d148e7c97c1134580200000000000017a91402e53bc18808b3955166f5113b83b265fa421e998704f78020\", \"prevouts\": [\"de2ea3fc1100000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_valid_opsuccess\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6d02d0213a37fd5a30867aa1387a81339fc2ddd1d3cf93c769e1d1383d69d5bc7e92044187af535f3f12de8952a123bf6cdc45dad9163ba4efd411fea48ca188\", \"20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac00635068\", \"c0cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f370d37925ebbaa58968ca2d1c370a50dc7325130308285a7d9868d3ad5a34267b01c94ae67cd857f8f23543b618b38154b6c0432568bb8cf7638fb55d4cc0a24e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a34ff67c5e9162f46fa22c082d21a7ac7a23c3a9",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc900000000ad2a3dffdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5001000000014b29e90202c4900000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6db010000\", \"prevouts\": [\"7b506f00000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"9412230000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"473044022040a892018fc73a356b7fe23f749069ec79e165913f21c1a04a63694f7db0fae202205668d51c6fcffa1eeabc76b5de44df2a9dc8238aba9eccc6658c15c1dfd29442832102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022047a161dc84e361ac65e3c873c518fb2c1d1bc3424e76c89ae6d59229bdaa491b0220408620098a8a676cb3cff43f54ed3613e015e32655b7c600fd7a6cc67d64e172832102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a3770de2569e6bc576e5a3947ac08e8bbe24cb5b",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cb01000000cd9868e9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2b00000000cd3ed02203b4d76700000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc734010000\", \"prevouts\": [\"3a08110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ba875900000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ad6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368440119a86ba00e0fd0b2929859510ad60f42825154794cb59f75e9814c77960a7d0a3f3648f0d829df7cabdb8f0af96ecc09ebc190c461c6b5fbdc9f87abaf73acfa007b318c5da81cf6562f4932e2754570ba3b679b809769f541be0a6b617\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365c6e591f067e3c45f61af74326cd1da3b20a4081ce43e1a5881a0f018aae470fe30d689b41c4cadafebe300f1e3aad2e0751ea174af1d1313cd49baaa526270b3acfa007b318c5da81cf6562f4932e2754570ba3b679b809769f541be0a6b617\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a3823af6285ec27ac5824bddb591a1f209bc4018",
    "content": "{\"tx\": \"32e88e8b0160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ef000000009ea8758704c0f81000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac55867d32\", \"prevouts\": [\"480a130000000000225120f52aac6d1851a3bcc3e02eab41e79301b2d0925e53812529fe85f9ade1401e4d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"9a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e874224dbe9932044562df2f9dbf2ed3a87afba7bd9cf6855f9f40e4c24add8036ef17902325999cb16876d9e124f321b7a2400c6233e0b61b95917979ea167214\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362dd94ab6ac3ba59fc544244dcd9eb18ac121794a237f6dbebbd82fbb662320abda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e75ccfc706e32ae7f6b2a63f59d728082bfb2443bbee0d6dae87ff94b5ceebef57e56d08eecb8b548a03ce82dd22dc92a64f1be159e88ba8944ed4666490b777c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a38819d7d0147d7cfd3e537fe3756def5a12274d",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1b0100000056ef84c6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1500000000048e2596dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1e000000009ecaa1df0136422d000000000017a914719f78084af863e000acd618ba76df9797223689875e000000\", \"prevouts\": [\"f4dc280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ee4f4f0000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\", \"53ad4d000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/oldpk/checksigverify\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"a38abf14611e9ff1d34569f50e5ad70c70c0ad2c047d938ad2b2a0935b80f8cb6900e47ddc95c94d1eb0bbfa9084da5b49420934f189889d03680744d4b7ddc1\", \"01b82103871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba01b787\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936380fd5bbdbe4794ea806caa5282c1aef1ffe7d45b4d59f1e9bfad28e3ae4fdca981fadee890ab4417c631792739c4ef8fb641e8446934fa0c8e1805c6909f26281276199cbe4e146b3e88d862cccc3aa4bc6307d35ab5018dae88bfea6394e5f459cabb6ab8c3678b74468069be988139c89c57e63462e56e8133cfed14536d81dd4df20fda0be7a55ac17f98a2aef20e321e01e857502a1cfe23cb6a4ad15866ef67e84dd915acb377988412d057835ef837084affa2d0a196ad926b0944a0ca5ee8aeb035ad1d4ef60ba4feb3fceb7383c5600a25eb23627ffada3881a0f6a4d1f74f48d4492f1e0d45f509c9657df63343859227ddf7f2609ac6ace00e705712f857e99c90e704ad61ead5306e2eb41e85853cd64144b1c0edf26fa2e09017c6b0121788120229dd303fb71c48fd037e58f2c5360624d464c160b0d96d9aa9209aee4db1949f5c818182820cafcc77b58f0cee811d9c138e6e925c6ed7b5822c7dab2635ca4d983bce69908efc2d6c8e3a4e02d107fe54b591d6c8cbc0ea2e862ced977f81641729beff04e69bc449bbaee4ae229138f125e8f575c30a32bf5a3113bfeca67cfbd40f858b9150f2d1112d4e5e609341baa11cda5532a4a71babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3c0b1e0fbd5b5a33aeb59c33de952643664232300e1ed72158ee7c07544b2883f05ff592b537b06d8478520d1140d76bc9b5fd6b6c44d4d5ab286556044ab9dc\", \"01b820871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba01b787\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363a4ab26b19b12dd5ed84675a14c998105d6f885db851af25affc21adf58dee419d170c934e59191828af4b443d621af5306292ce84d9ec7d56e4d5e95f4a2b883b6fd696714014486fd7f93eb277485a7e6b2ad9076f6f17fc1c22a649c512cece24022bfb434738800d6aeadbb65c0b5f1c54fd97b098ababd1df24d7362e80f41af64fbf9620aa43b24a95927199d6cd96f713b6c21c4241494f6ef0a4794b137108eeeef0d1cdb0bf8b9c7668f98c08793001c20de814582aa46fe17366f71bdfc32c1e1c145969abcbef65c26a893c9816b7a71a91b71dcfe4a49fffd792905e89fbc0a67267d9092cb76689d3f43e2e6846ec5193713df91969e861cb60c31b4d84c9ed58356d00f548e6c0b7494dab0ae598e30a63a373db1671630b0e008f7f368b69fdb42cf55796ee854208b1524a7b7ad1fac452c6296b4ad4fb087b0a6f9680ce7f5ca5bec9338fe334e6832114c99db2b4b78f7605856e14f0f922c7dab2635ca4d983bce69908efc2d6c8e3a4e02d107fe54b591d6c8cbc0ea2e862ced977f81641729beff04e69bc449bbaee4ae229138f125e8f575c30a32bf5a3113bfeca67cfbd40f858b9150f2d1112d4e5e609341baa11cda5532a4a71babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a3ad36fa2c2c376afbf409d8fb83e076d6d87bac",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9d00000000e8af27168bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41900000000f499c33c02627c86000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac0e38aa56\", \"prevouts\": [\"e39f5100000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"229f370000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6aef\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c819f8b552bfb697703837962fb5d6d337df981c1fc75a4b0c4677dcaf4c57d1026557b708b5ff4838890b3ef28f2dfcc17fbcba41194ca68927d7f0eaa3f8db921261d9825d6464319e11fb6c7a9f7c01f613629293fb1fa80574c155a587736c6fa26e4842a5ec51b34186b71f91671a7cf578e5677dc1f65db5fd4f943bbd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936850341f24ae52694fce0385034fc0ca207bd809c3dd5acf22e07c8bd464ce0dd70b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d865720cc28207c7af5a37f80d9c7bda068b6f89abe5b5cf72eaf80ed3e31c2f1c9dfaa6c6fa26e4842a5ec51b34186b71f91671a7cf578e5677dc1f65db5fd4f943bbd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a3af8000afdeacd1c3d6137959029e3b260c72ad",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1102000000ac4cac65dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b710100000030a16be304f0b149000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374871ce85d41\", \"prevouts\": [\"40ac2300000000002251200330f6e5108e4b6ba1453dcbe3913edfcf5a50e8c8a7a117f516f4d28e4936cb\", \"0f2a280000000000225d202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"737d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e85062220981136031499d54282dd1dc217e6360b68c94112219f47c832c6b09fa8cadcf9bcd23f9249fd09eb8b2b9ca63044a0ccef58f4cae9402f6ead4c2071\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa1755d4e71afcc10f3d2573fa2263bf007b883f1245d387f3f26fe0befbe96d0f3ec5aec6a85c1ca54f3417a27e00c281f3765ee450a46261b59de169989c9a702c501a2f323d94577f3c4b353be8e702d3f9991edd341efb02c3132264010bb33a63f37675deadbbcd666ca6b38ad7090050f3dcc6bba45985e955ec185c53\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a3b21dcd0e4adb6a0ef920d74555d2f699917d39",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b90000000044735f0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a5000000005a25110d02bd811f00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8714020000\", \"prevouts\": [\"8cf00e000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"bb0213000000000017a914381003aa1ce42a7df73f2dd1e6e78ae0a36c6b1c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"1654142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"a7453dfdeb8869b5bb652ffae48f6657b375ae7df60698807dd8d42c38f5a6eec49f150bcb1ba18149b1b52c375342794f0a329b99cb68eb140cf357ca19e900\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a3ce74eabac11a8d8a11955afa3ad09d86b22961",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6c0000000082abd590dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf4000000001ad7dbb460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e60000000013b495130186bf0800000000001600149d38710eb90e420b159c7a9263994c88e6810bc720b41b44\", \"prevouts\": [\"0cc849000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\", \"fc1a5d000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\", \"703713000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c34c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667037ae3d106809ce95ad6513527bfd5a0b48627df6eb2b59a2167c6498316646ad1aa2e9998afd312977ef35369de24510af161418b16660639891f4f8529ff8cfae4f24e00136258a4229df9ce1533cc743f70cc4e5c0214ad74c09f63cc0b9de97a2505c9a0de734aa1a6c773f3979bd21cdf34ebf80e6ce3c625c087f57a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52c3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936325295392cdb69462e5fa0b7e1c132defbdb6aa7844957c05fd0634208e0d9391ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900457cb9328b065f9eb1f6f110e9fe7273590c885552330e2c3269c2432845ee2744cd8777bf679e716871b092f46e3a69645e6fd098b2f58cf3078cdf1926d6f261\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a3d08eda208b96260cb5b47c1478e155264ff8c1",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a801000000aa951bf3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bac010000001c53bd7ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe9010000001c47564f026e879f0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca040a226\", \"prevouts\": [\"0c261000000000002258202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"8c5a260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7f456b00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_e4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e024351a3b37dcebaa1474684171d9baef2ed8e829e8ac5f9cc2f8603f446a44b6372f13e163438b21ccae47a1c3b71a1aa44fb100a2ba48abca6d92c3eac1d383\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8c14e5c28ba217a2a0b9e5e1144541a12a6b6f168cb4f11927030c4ed7086abedeefb7df8795729eed921e0b3a8ab21eaebe87b9dece8ea74ae0757fd4008b5fe4\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a3e5f143cabf7cdb1f6111fd744b4230796b6064",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f8000000006d3588dc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709300000000775f78d38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45c01000000bf2c651d0114714500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1f010000\", \"prevouts\": [\"14030f00000000002359212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"0f160f0000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\", \"13d73e0000000000225120b5149551dc0241ae0d4420d11e06c98ebd87b9a952c2fc2c5fa7ce9cbc250e4b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"167d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936394c54942360201b0e5a9c52bdb8553d3b85213f639fc7674feca5a4529f4e0b46c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa654bbf7a6388e898988522fa7e5d2ba9e6951646cde29fc617f56e0c3d8e4d50afd13a3b2c4c421c5355668ae9e4eec8bcb7618363c6e35efd204a43726d22d6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a6552d9f0078438d40136d7ff6a38e228e91ae2f5adfdceb2d12241afedfa4e08719dd3b5606bc946287d150a5ecd03b0f8e892d08bbecd28ea2e3769111c28051e3355b9fad1d20bddcd1a8531bcd58c93c4d9ee4159d68db4e08ecdffbe17e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a42eb9002c5144273a55bdd736db4fde19aee488",
    "content": "{\"tx\": \"cb12a30301dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b410000000093957aa004ee5723000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c8010000\", \"prevouts\": [\"e701260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ec\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f671cd90230e59c99f43246d5ef545b039ddb07eee4eafcb7e762383f5f8f05fa12e2fd888ec24463dab47f7eeaae2e3f7465558fe6d42244e1b7076fe27c57903\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"24d7bd17c40082d1ea1c4c34ddcafa36f6f645554947258aae820d3df0d3dd099d1e83a8218def63bf804543e97007f61429814d17974322650350bd51221b20ec\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a446bc4e40187735edce2ecd8fcd0e7ed43952ee",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d1000000007867cfcbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf47000000009ee3dbbf01c2b77700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac6c0d4c1e\", \"prevouts\": [\"55523c00000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\", \"ad3d770000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/script\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"744950d34e41c67563935eb0feba01124ff2eb3deebbd8f2fb7d01a9a4f422bc5cf2e941a659ec3818e2ff6dba56b48d7e35faa21cbe4d8020952eba9546464e01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"503649286e99ca454968e6a58006ddf2a84da5aa86807e02bf27971d483d0091c1d21244ec4579fb8bf719c18ffc64ed357fecb7793dec9c42889c91b8377e56e0022c2d1e4e6846e4a8c039a076e1d7f02d8a3d13f2d999cdea35eefd86b1faf3c72f68daf650a578a71a5d32f6ad9f9fdb44e38629a942eb13276d4ae8f5ee86c296bceb9a6856cb850f453e31a8c79eb9ba78fd01c24ea30f8b36568b981382fa36c47f186c0b1b758ecfa914c8b08c237c997aff85f83846f613649c4275946e1cc10de782324f6dc6a2c2332a7c9653353f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a9a2da3e97bdf73fe0202f6f9491f249110d4337a3de5556b638db26b05d811503395f4efa8f00c9674e51fcbede64058b201f7f0db2b2def94d5204e2f167a002\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"5022c15322a98cca10055037984c8f7c1fc5a8d7e545709fb9da6db45bab7ce1e714435eff81ff68b22c94a7b28b3b8abfebbba8d463e6b3d85b30917d8fb5ef614bbcc9d69779e92ff30685dc4f1d224f49e1c6ffda9d4e944e58c4fe261e17e9bf0f22400ba63d376606f972eac3ddf667a4668a3fcafaadb18b94d599ec8ebe7cf2305ce17330b3a5d041bc7da35168a1b8d4d963dd3a809c54c84738dea1fb24a4ede875a6de5bdaae5bf483e050a3819e2b28ec1cff5125e930165e4487ba9725d0f4c5eb98618b514b61d4722798d85c669757dd5d60b6f48db862084f54ad52182f5ac95ae5aa24b42a38516f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a45d7d60a1eef620afd536f4d69cd4196a0fa6e8",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701b01000000bba7c5fabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6801000000b62f87d103d8d78700000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac0e687c36\", \"prevouts\": [\"37c01100000000002251203261e4f5d874791dc168faa2b4a2c68848e71e1814a86d26b34f54a7b16af8d3\", \"be1f780000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_1d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9e5596a7d6e0167f2cdc966eb0027253600ef10c9c2e71bc5f95ea1aa4c272fda7b82ae9bc9762bea5a1fd85c51eb4739b474b0ad266465607524007f81ea4ed81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"097fd97cde86b0bdbf8cf4e0affa7f9be88e093af052871846d97ec0309089ee6a7a48888d31535d88d7a663abebd77612c0d6e6e50165422f057c7cb36539581d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a460475c32082067af4eb3aca7203a69381aec6f",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffc00000000cb2d96c4010b104d0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7969a020000\", \"prevouts\": [\"adb67f000000000017a914de933560a9a700a6d4f856bfa5cf61713cb34ea687\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"235e212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"9812921cf248a3062afe01f52b057f93bc52be09c8e70356114c3dac90a44a78e9a37585aa57022a1bb560677e47262ea82588fb92ec25026b7373ec8f443817\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a47eeeeb9c724e0247b882207d4598df2b1f9db0",
    "content": "{\"tx\": \"4296b05c0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d701000000192c02da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703800000000b70f74e6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c010200000054072fbe0445ff6e00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e4cb024e\", \"prevouts\": [\"0526100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"099f120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"39c14e0000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"d47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ef9197423ce94fe6d3a105485c3c73b77ffad3b95ed69b8a8a6b271b9e98a9e69ea84370bdaf8fbfa2c728119f306db95ff534e2e627fabf0c000f69380d4e93e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360d3902af40bb61a9efe79ee43d7d4f3634249f4c0f866d22c6fec937b93868b1cc94371513ed03fc9b5b146a2753e7b1ecbc6d9bbcb6df59d8f1ce2dd42b56b227fe8633af3ad90c30a4ff6253cd799a6a417bd03591c5308acef4cef6c60fd438c2fd1368e2cc97a2933efae2d13561032948a77b2cd5d87b5e0b8010cd9f32\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4b22b3869f32433a3caeafcc3e2dd92c010757d",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffc010000000732978e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270880000000072fd39a2034e918800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e776a0d52a\", \"prevouts\": [\"c1b27a0000000000215e1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"57e90f00000000002254202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"a7b105433b4b1915ec19c609d0b6840b2317365b6a7eb657bbcdd76d3d3912ab855ce3c33a90f875c923d0c169d56c5e39986a1740ce00a05bce538bf8270c29\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4b538f21947ef1c76087aab101911f7a2cd4ab0",
    "content": "{\"tx\": \"48e98f73028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d8000000003dc93bfadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba4000000008f1f5de404739f53000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87e995ba23\", \"prevouts\": [\"5d97310000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"9d9e2400000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"0b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362a0eb75e0ec60f99eea3c4e68929a801de09f0e4bcbbd6e06765583d12703af849153cc622aa353482ad0128e41c922a496803621b9ad28f713d97cdce77464b2c78e40500fa05b550b7f6357dbf83024c41a574f6a1706762c104fa8aec3fcb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360bb3fcad263c09d62d88f37d53a8d6e8b6c0ffad9eb9ba751d541b924f6b0c72784d9e7ee919b8817f3904ff7d27b5c3a4ce3798ed5b994b75288b8e9341d9b42c78e40500fa05b550b7f6357dbf83024c41a574f6a1706762c104fa8aec3fcb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4bb5997e547796263c8fda8ffb4c87967e2ea43",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ad01000000ef211fe4028ab70c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787f3f31e41\", \"prevouts\": [\"be800f00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"4730440220636fde6853b48edc1b78fbacdf8768615e54e640313826ec042c4aa2f54c013202201612a55ecb781ea6823b82e2ec5800c9dca08e26a0e064599c82f5d7a398ef220200\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4730440220031fae161179bb8add96b7c89a51e67734bc2d777ac835884d1165ce7e2eae5902206de02e996289ed42308e0fedfcf705b229d90349fcc01d5197a814fee4e6d855020101\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4c0daa47b25c77cdc37c485b2ddaf4db6edaac6",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f801000000038e6fa4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c00010000005e6f05c7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6c00000000737b03c302ffe3c000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac65fd242d\", \"prevouts\": [\"a82c3e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d5b75e0000000000225120733adac9df449b2595d1b217303cc00a8e3c5ae4d51e5f74120e9d2d90d81fcc\", \"1b492600000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_a4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fbf8792532c477932b747a99f61b557d12cb46507713730600155cdb8f3a776c503ee471a29640697d98e34d9119a061ad3caee33cd9d9bbac787aaf5dcdf4f901\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7f8c8537664c6f2eeaf91b657ba7cc6895d1aa0fe2c0885f37793add2c395d16089098f6604d651e3475cf543add9736e3f120d2c707dee16aa349af6ad83490a4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4d7bdb95ff0421ff9f027700815f81ebac50d03",
    "content": "{\"tx\": \"bc10ab850360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e20100000056ca8ef0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd500000000f9c6cbc3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfc0000000042284be90453929600000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e73aa04c47\", \"prevouts\": [\"1d5b110000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"dc1d28000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"74b25e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_d2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f2e1c3063dfad656cdd87f5e5a153559fd347131f02e4d0cb00b9816c408f4d9f56702b811d6d890880b926242802e654fa08c69e001e2014c5f725971923baf81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ae543c27c9d7e2b5dacf2092b56cf7326e3f7ef44348332872fcd56cffa4dea037e5bf77c583353c48f518246297e8b5455c1f8cac2f6dc7f8516d0786006f16d2\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4e49ce4052c6a3e72232ff2f764b972159ce65e",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b910000000007b8c7cb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d2010000006a6039d303ae933100000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748784110e48\", \"prevouts\": [\"759f24000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\", \"1a8a0f000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902618ede92b79a5b81809f6cbb26b0f1acb3409e7eee532034a88be8a398ec0fc9e8bae35b7130da34b76c6912521a66e6d156c4a61b6a4f19c323dbc56647c7c09cc0a995a9624a6108b3adca49d3e5c558bbe4098b4f03aca75acae8806c408593df9b242a22bd3dbcfc450464dc687e8ba3b5ac763210a91aa5588ef48fbe706f33b0a91f8b4057efee182b3d7f8e9d0f6d2d1bf00d3380b2489ac28bb722a2ae386d09a12af0bea36b4609b5e1662abb9688b845a97909a07ea6ed082482cb0f8a18571a19fc332606d53ecac060ab8f585ed152fe4bae3d7addbf5e19266680e723d15620ca051f419f395fd3ffbea6c26439ee3d45b49c3040bea98f21b09311d37d8c076987c6de0751e3c37e1d3e2145e1fcc15bb7571deb64e30470e3d5e2579b9ab2fb01e48ebd18244e466d8aaee7532374064a7915e91207994da877a90a236c05e5874d6a68a05bb549a3e635b20ce0d940a3a92fafdde7b5de323c40c4d66c02788ac7dd75a3244cf2d50d30ced6e9ec73c2e1c813659c64316c1d224160491a95d95580d1bc38262f85a30179ca2209b0e9150865e01025bcea9b2658a567798805f89ddfa0928b28b1b0127a6aad69d598c0c878a5cb05c830f758e09dc456f7e69c8570e1ab65c9dd11630fda7bfbb2ef3cd24ffa4923ad5e4b200b2da300f8cd2d4c288e06175249c71acb366ca55fce5f376df1e3309f9f9e7a3816f667b2c3de75\", \"5a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa16aecc6ca17fc53cd4672680bbeaf62b9cce164f53144e8804363c70dd634bddc531ca70e78518003474f611c07657b0808402a053b744a80e6cf25146bdf24b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090262bc2c10a1a04aeb55a82a0122da77b0351c7d4b28d13bee21b1822a66f8067a9eb096f98fed70a9de8e3cbc91cf3e9f0e13cc236280597a9265fc990d257bc8ab3da5717d7b43be30598cdd6f584c5d3e467ad444ba8b3d1160b268d9ddbd9c978e4911bc9e245d3483c9e4a1ff3861ffaccfaddcdd9c6b0146f3427e7157902ce167f7aec7783e48fc11ab3873dc205b462de4211ecf528330b39ca6ed5c288037757fb1d92e09b98fd4e34cb092b7e3a92c1db4821a18f49c423e672b23ab77e00b3d19d542384532ccb7567d295ba784d9fcda882e69953760480a70da3ff80cda93414fac989f2144248bb80e0c3b61eb68d6e0758e15d54d6f5e8db8c142fc7174077e4dcc32e6b10a293a0559cbbc14e96c8b4ad0e2e75ce138d7db55226d499dbd777a3ad7868098f973501c799bad6dab3bec7eb26d178842846ba147c734e1247a38cd869611b312e003c758321273bf4ce164fde63ea1024ec514420a512df157829071ce5cb78f064e870c1b796c7e7d1f94ac816b798de27e0188a8a3b7b563ac0204af27b398fab1c3e04ef5ab6ae9048d5ace29665802543b28237c2ac917173755a65d6354e70f823b9aa88e0f564e55ec4084877d211673c3c76574b6c2be8602bc4478ac8c9821b2928d2f3619b1929bcecc35acca42f3ca385cff254af0519d0c12ab85cc8422f15a6a91d08d249d92633ebcc8f345811268894700d4cb352d75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bb365091e02541d750ef46249caac5d7ae4cd563209d5fc3ab846231dfad5f298b5457f6f65490151d40d3d05d55f9c92d8dec73c7aa55a79aa7c51354918829c531ca70e78518003474f611c07657b0808402a053b744a80e6cf25146bdf24b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4e87c35b253e9246a0bd98cbe936ecccbf2d89a",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8900000000e8a3feaa60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707c01000000afd25c9604adb63500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc65ed682f\", \"prevouts\": [\"d10f290000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\", \"52ec0e0000000000225120a04971ad2b8c16a17e70d417eb355b323e82da2726ed216775e912c08433fa96\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369dcce049c3ca75880493e046b41be90d5f823e94fd712225d408efa6e34d380a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a6d616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4e89f79f42904ee1b600ddd79f2d3e27c855da0",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfea01000000f5e5319edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7f01000000447e5a1e03ef0fcc00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4874bd55a28\", \"prevouts\": [\"f0347a000000000022512017e91ee0326ee2050a26c2cf73ffa8316bb13627b7c7250ab1d4d36a20fb6045\", \"5da4530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936abb130808be8125d340e7afa0707ecdf35c3f77b9e0336bfcf0ee3f8116d85d2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a4c616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4f449044130b59be750db18b3dd9cfd3bae5588",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4be000000007e34d8a360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704c000000009d55639704a6b64b000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6f14dd35d\", \"prevouts\": [\"34853e00000000002359212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"86520f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_51\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"60fad9cb2ef641fd2568fe31d2da694e720492e5632a431391143f9573de0152a805ed2e45e23e1996e1c605e032315b8dfa107c764f26ac133ccfaa4f303abb03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a7fa61fa0ad828f8814bb99dd2442f9b7418b22342b44fcdea19b331d8be058602b08b1a3758dc1df186f64b87df2c5d93309c81b098f005ff063600672786b51\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4f68b87043e04396cfebc9287c9d7280448eacb",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd9000000006f1fc6ecbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6e01000000753656c9038b73c300000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388aca1000000\", \"prevouts\": [\"eb125600000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\", \"6b7f6f00000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"e67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bda127a894a5039ec4946eb5e413110ae843599cc7241c4a3c4a3a9c1b93ad088256d6f90d235a6ba3188b640209fb1b87a6d8106344fff793e748ee999a397d93d03784866e2fdd94d7d1b7c12b1f0da96746c05c19b8696f0ac6a701ba8135\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e92d7728fe824bb86fbd19678fc348031552299afe2faac0cf612835804e2a859ea19512c809756aa5c58e4cd3562935caab0c2ca4eda8db33914ce4decb3cfe9d11a7792f25f0da70e8485da42647201d1062d1bd001b767f1b05dec6877400\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4faeb187eb7094b39e0f0699026cacbbb9d2ea7",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfab01000000353da8e0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa900000000724751d30155c54600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1ed6a542\", \"prevouts\": [\"8b607600000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\", \"23c780000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"89\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ea0237369b8fe49ed1b05e21155f7ffba4fa029aaf0d531232d0302472e08390b90b3e537e0a498718b42d83f823725a04b39327b9237d74ba7af037a7c89be8bd8f71710e2f4773b226617f0b144a9d046788db13e8347a383f909c13421323cf46474fab8e7e9306b35224640e271c3ad2c01a28b74e8035b5ea3da4b2d4b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e15f4861bfb2a6452ac4a4804b2c6a2c641047e4f139d9501cd1bf471f8e5b3ea6913d98effacbdfffd2adbbf71932929e08e9cbcb7e06a345b8d84d9192524cd99d8f9ebf09b0c450213ac35faa1ca38fcf1ad0a46ee35414da06dc92335be8b4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a4fb1b9f52700ffd6bf24f06e73666810b0e3260",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bae00000000e0364cf58bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46100000000669af35004b73f53000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca91b3e44\", \"prevouts\": [\"43dc21000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"923d34000000000017a91482be44661ef9d172a86ea47619409ff206130f7487\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/emptypk/checksigadd\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"66f66dc43d5bab9b14f3c2043e7c9c8f5b48eea7b9a26d1fbb5c2053d5ad26f158ef14efb526af95e741b301b9ddc874aa544674b29eda87ea49e44def600a34\", \"010420871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ab6877fe4b93adbae43ba31547b2a28b8426e0e264fdaed20741da068e2fde6e79c828b389cc6fa067cc52fe12ccd40f3ff3a983633ea848ec15a2b4831982f7737d8b833e0825ba099c8467f76b1421be2b77993c7e62810ff98ea5481a16a5d99cf36381d9d9a20d2ce9dedaf9116dfe3a9922c76fb47afa7d001862ca7c11a241ff59189a6703879e4c72ba11924ce43c0100733bc95eae687ee9079c18adbe9f9dcc9df76457daf667e614b0a2c9769f05bf9e4612cf41468a5c2edec8b27561be12136e03a34f8e495e73b5ead1813b7376b7b4741440bb77381e68f2c66a36d3584cf1098f42b1db0e5adb952c76295af580ac8e57b6e152c1a3838880c25423e484f9a894f0cd7a4f7a55204cb9503269f7db7c978ae9e1aae745e8cba1e95faa8cd3a458c6fcfad037bb3042008f870bffa75e1adfa3bc03f6ed1f3bf446321ead565d6569148652da647f2ba80fca39d16e6d7a41565c11b66fda799209aee4db1949f5c818182820cafcc77b58f0cee811d9c138e6e925c6ed7b5822c7dab2635ca4d983bce69908efc2d6c8e3a4e02d107fe54b591d6c8cbc0ea2e862ced977f81641729beff04e69bc449bbaee4ae229138f125e8f575c30a32bf5a3113bfeca67cfbd40f858b9150f2d1112d4e5e609341baa11cda5532a4a71babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"67ccc0728bf9fad1ff3f340d11258558170c1ed2901962d8a5b0cdd03b69e39bca660bd274c98fe768d09184690e7edc805f72c0f2c0844782e11374bc30f338\", \"5400ba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368cc4d632c25fb1473ebc2c4691dff712f1529879b16cf6e01c3498b371ad5643f043ba3d030a3b9cb1de0a60e5c22d352c9a6b0167bb0429c65653ad93c6b5ad75df7d692cfa002fbaff39a633e2a3d0c51d8dadcd4fcf0c857fbd83ad169fef2faba22bfc7a47f9e635144f510dd0bf27279d7f381c4c7abb10bfa7caa6f45212b1384dfb83dad558f50952f8dc7a4c93fc05bc0bf8f252596f3f99dcc4aa25ab6fe4c1776346de255528baa11f4624c0da11cd67d3944bc9e3c23527f253a174940966dd57e339c9cd051354c05cad3fffcfa87d89865f388df6a9793fb850795b387e411ef7ecd738a90c270a9e8b41d104f0901d65be980e017742035d2ed5a15550423aeac2e288a32ca51234efdd8592bd1b66a7f846be8561b7af73c90baa320cf1711a17ed2a311e1783897c17c40a4468373563049ba8a82c1cbe704bb8d89f21761581480cc9fb789613a87d31235185f9da4b4384725e898ebf0d2c5eddaeb8557ce0f7cc7880e698091ab104cabb34aeeeb5d0f57ea86d1ebc555dfde575d48d1eaafa8343c63d6f5425984d2425aca274be02e47a5142e089ba2e5262a94fc3ddd3fb5606be458b593782b16d00ce4762d13e98a6ec8488c560f68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a506dd32985fc68730bdda9ec17bd68456455ba2",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfa0000000056f07197bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2e00000000e97e04addceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2e010000004e146fe30155a353000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6ed721a49\", \"prevouts\": [\"41e1250000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\", \"b7c76800000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\", \"603822000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_1\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fc48c577f7b5f3a703a5457be6f551460eeec93367865b5e2166424adbd1ac3f295acb1edf1714f4860d94394f74ea0548e4029291eaacbf244d914336ab151701\", \"503968e07b294f35feb7b41d27b4819473f873691d15ff549a9c12cc197e081edc87f8aaabd5ebeafa67615807d69a5b8c59ab0fc24eff57f7038dd2a483827b9df9939d6c556bc4f61675143f9caaa0ee0eb629928a741ee0c0249ac16173d1cfc9234322a1176ae0448323160a0563b03c500ff64963073b7d70cc0f6f06b5590fbed5bbaf8ac6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"74b5530153f0d51da985b311d560f666dfbb61e8b9bdfca17b755d9895fd49777944913f55fb6a495648a81575841648e376dfb3e9221ff8b5355d0abb1c093201\", \"50ab65cd189b8d11a3d39f9aa1c4e4348f27eb114f13c04376a07b961672d9f88eb38e1cc0356851fc987efe8dc2b46d4fc293720acaa06889605c608a90cc198133cfe14ffbb4468fc36bd8f61935282308cd22b7210c1b193d6d10ff0c7865c5bc41e2f93eab4be9657499c5a2e6ba1bd68d979dbf272743232180969389e056d43b368c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a51dfad994645830ec06457aa99a3680c881234f",
    "content": "{\"tx\": \"19d3c01403bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb400000000d4d080ff60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700b01000000657831fe8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49400000000aa2e2a9604f321bf00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f871a000000\", \"prevouts\": [\"0c0877000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"894f0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"be6b3c0000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"4830450221008f55521fb6f7b72388272102c08b0552b3196cad4de688785c363ddf2dc08a1a022069babc1ba2081a37ce9b4b4266842ea5da2a13d9d0bfa2ddafd691d1381442f4022102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4830450221008b70ded494a4076203863d4eb5d8e5c5ab630ac1dae865777894a00fe390e37a0220372fe37418928a39b8867f2e57e66abdc633a07b5a652f199845798216aeb573022102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a52cb7e463be1bd639929b2d3988c313fb4189b5",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c720100000018c71abf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b800000000898d559f03957a56000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48759030000\", \"prevouts\": [\"83a74800000000002355212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"20d90f0000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"d67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e81925aeb587789c20eb4609a9df455cd23a7da5ff4c702feb6a2f003989c380a08a47f828b5683f18d8d2a0301cf32ab60b8042f73dfba3f43f347d91ef120fb4bd0211bc754da142cb3564162304068e34e33074851a6380a45a2a3191e3f102\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362b0e17b8bf42b7e584614961f092aed83eff492a60c922e0543c90531401fe8f1925aeb587789c20eb4609a9df455cd23a7da5ff4c702feb6a2f003989c380a08a47f828b5683f18d8d2a0301cf32ab60b8042f73dfba3f43f347d91ef120fb4bd0211bc754da142cb3564162304068e34e33074851a6380a45a2a3191e3f102\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a545cc27e2d474a7a7b7ae974d6c61935d3bdfb6",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cde000000009f5d27808bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d201000000283e3bd98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42700000000da52b0940417c3c800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e52a3644\", \"prevouts\": [\"6fb15200000000001653142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"55f23f000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\", \"a8d8370000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"30440220598cfe5677068ee7d3f8d23516d7f12f26863c7ce363ba0ae679b3d9ab8f00c8022033f63fb7accd3895abd01f7c381f4166f0fcd309d239da4d2f34e5a783675c2703\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"304402201962a3ec2d64685ae979b254f13dd532803ce2c9cded4f32114bb36ac1c081f002206cea3880395cdf053a9941d48b417ab90bc1a6604b09b5bb82387986ad539b0303\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a547e004e80194fef36be8b3932bb2a42502c7b9",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45c000000001eec319bdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc6010000002d1bd40e03dd94810000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79633219028\", \"prevouts\": [\"7cdf33000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"d3f44f0000000000225120d1b91456e68c356a2c859a7d0862df581c6fe76c88121c19c4713ce29cfc8e45\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"797d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368e9ed2886e7908e27181476c22eef50b42616dd4d44ef70273b9f072453f43980793fbcba16d5416bd6f0933503ffe6704f239223875a49be11ed5869ee331b55be39dc57762be2d9b1a04aa5b570805d23104bfe4fa54c392bda5d51f7f4540\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa0b1051acd7c1b2d32995b3df0c6921af5f8ed3327e7e16cb8a5e0bd007230af127aec9530f4cf05d3554e63105b96634da39f3c52c35c251ce860693e97320b3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a54e57e8c7e474bf56e54f46813916ef373a9d88",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704001000000baee91adbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4c0100000055b2f3940307357600000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6a048da2e\", \"prevouts\": [\"6aed0e00000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\", \"77d6680000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_csa_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef3255bdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b155cac647d3a0fb0ea2fbbc1aee38b1e76a67093bffc5c29647aa83bc0ce13318ed70863611ab4ec13fa0038580dff9c3e61bfb5cba4794f036a1575c23cf130ea96bb076942e2677916402cc07120d25739fc5\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef3255bdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a56763f3af3e1d367ff0097d69c129ed4bae7f00",
    "content": "{\"tx\": \"4c61934d02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b570000000092d58fcd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45100000000baffc09e01cd1c3700000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acfc59935d\", \"prevouts\": [\"cfa9260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1b133900000000002251200120da136b46f6e1c164adef9ba0d2bbe634d7767c7946122aa4909c89df2221\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_aa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8cf068babb2c0c13e3db94dcb2c9f69b5f104764182a1e578613869dd03d4ff64f8745de6175c713d73a2491a62bb989fb3cdbfee11d9ef353af36547802a04a01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"22e0f9b2e60b85843675de81ec6f465296914fcd0f19bb529e24d0df00da2213ac8f298f41d449c0e04ae5d34671df4d7fc031ecc159eb322f8b5bc05e93bf22aa\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a5706ef86f9f5e79c7eb3a0ed8168f28bdc25f87",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c850000000050957517dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce601000000ac49e6a1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5101000000703ea34b033cef1101000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a641020000\", \"prevouts\": [\"59c348000000000017a914ff6a0b1cf86e786bc6de2387f1927f71fd08cd0c87\", \"fabd5d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a3736d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_93\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"df4c70f13b8f5d4c14b7b2cb79dca889bd2eb1478bc03a936b124688c978c5963643c698aab7d14e9f681bdd30bc79a7cd0042f493fa54399a617035fe11de3b82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"26162aa5f56f85577691407bb0e37d318c7f92c3b0e17eec3376255a970b709601cb3aceb03a3407a1cffcdf90a24e8bfc9b586be9cff7b5db48d43a2dadf62d93\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a574eeebf64538810c2a45c5864f3209361e1c96",
    "content": "{\"tx\": \"d336dfaf02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ccf00000000eb3e058b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d701000000e10936e7046a80940000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48745010000\", \"prevouts\": [\"c49657000000000022512084127e09a3e5abb8e6ea0ba3ce4737d1c2349f1be422ff5ce1609ab9b3fbb01d\", \"db093f0000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"ef7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e87a25236fb2b0caf4a960afecbd8538cf949b3ef5b854c8fdc156128073078e11b030008666d4260a12bee868d13ea953ce9c9319f2222d8e8469ea0b912b8ceb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082b1d33bd2ec2ef2b80e561b3c30cfb99b356a60261a599d7e1f2ff199de481a6e8ef60344f111a9c34d055af59cfd42b130acbf4987ee3354719b7c9974e4d449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a59cd78a997d502a498c2b597cda9c8cb9b435e4",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbf00000000a56b6a2060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f400000000b6cc542e020ae337000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acd5656735\", \"prevouts\": [\"148b28000000000021561f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"a4aa11000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"76f3c1c5360f37e418543fc90fdf11d4bc49ee0f5761f9397c721536f011ef6bee48fa7085ddb2789aaa88835f495523673adc441d8fbc12423c05431834c02b\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a5aaae5e5cc3955871ba97a7c41d307fef2b72eb",
    "content": "{\"tx\": \"6ebe113f03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c480000000082f72a8cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba501000000f5b89fa8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcd00000000c556cf97037ed2db0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acbb000000\", \"prevouts\": [\"98a94b0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"d2402700000000002251208f7166d23fc1e45fbcf26b51bd386ab915626b0708475a8743064036728c78ed\", \"8f956b0000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"e97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e88b8d8a8d8c003fabb93595bfceed403f9a1266ee95e7fa8447cccdf398ce498db8321554bafe286e6661652cf416d3db0b455024b23404eea069d656c79e4f25\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e84a72ef51eb7f1fd93b7716e160b4419190ea5192ffe31c8263ef308a11abcda602e473c0179dfd44294f4ddb50d827cec9d4b4e0c6eae7f68c0301f0fdfe7e6b9e5e4bd2cefcda110a5bf613694738c198174b403d264db4691720c8f18fc7b8321554bafe286e6661652cf416d3db0b455024b23404eea069d656c79e4f25\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a5ace5adf4a44f04399e15b18f44e6a83e13b549",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9a01000000b5f930dadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8d000000005ea06fac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127044000000007a558cdd0125890e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7b1000000\", \"prevouts\": [\"5c0c570000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"7bdd4c0000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\", \"fc3d0e0000000000225a202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d865720f48725aff660a72fd31f8e9799fbe605d57d774c031cecd8b6989780acb581b6b24737b64a51a2c518aa096a7a1ea5ca18eed83cdd20aa73c19d83535c466892\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d510b2b16248e513241b83875342c0ccd59e2b6d40dffb5019b56610da5b5de422d74e6cd8e612cb42cda5f7f42dc10fbfe42e4e0a9faed92158fa7e41e5f92051e17d2416a1ef9313076e185902c26d9ae3ba1c967c4fe3d78707cdcee712bc7b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a5b907c867904b2e2631128c5f637988bef1282b",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40300000000adc681c160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b301000000dee1962b01d87c34000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478764020000\", \"prevouts\": [\"f8753600000000001656142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"65390f00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_csa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"221e1e1f3eececc228910338448dee6024c7288f8c252bfec6a82722f916b512993669a6e26724735390f42f619be92a22f916665ce809bdefc3eb63c759b5cf\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef32555276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"221e1e1f3eececc228910338448dee6024c7288f8c252bfec6a82722f916b512993669a6e26724735390f42f619be92a22f916665ce809bdefc3eb63c759b5cf00\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef32555276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a5c7d3a86b0f7fd48476aea167e188ad2e930dac",
    "content": "{\"tx\": \"232bcb1b0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a201000000a1df09d060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f201000000b8a452ae04e91d1e0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87b413c54d\", \"prevouts\": [\"175e0f00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"f6db100000000000225120c230ba0a2d20add5df8769fc65d7fc3a12d7cd95ad679e3207a6c75325eb884e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_keypath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5b901a4110669a243d2b1eeb05469658a3dc98adb1d7bd56c7c637fe495d38af3aad12243a99cd5b81af57cd02fefff61656d4e179954f3a1f6ba88b6115ea9e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5b901a4110669a243d2b1eeb05469658a3dc98adb1d7bd56c7c637fe495d38af3aad12243a99cd5b81af57cd02fefff61656d4e179954f3a1f6ba88b6115ea\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a5ccdd516198da910321185e29de6f20d9be2985",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1d02000000a05c23cf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e70000000024c7cacb02189b38000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df979722368987a8344a32\", \"prevouts\": [\"0e0e270000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\", \"ae3f1300000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"9f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e93df6a2e62376e6a3587300ef2d1a395dd90428413a52508272625b5a1a189adb591a16be56540de55d9fbfa115de937b3aca1e4dd0f5a93f17ebd2ebda95183\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936327099b01b253298afa4f7cd9d288beb4aefe51868cce630b6f9dfce458fab5ee7391eb2542a03443f1c351bcd0fdf78b6f5cd40e118bcfcda3d325918034371ee453f7f7ccbda5a0ba96115b963083e4b2e9e93a3abf82e4dae88dd7e6a6b566f3617d560800e971f99646d89bd2028caf0c6d02b6f505a11fcad3ec349c801\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a5d4903bde9105b510f48ef3783702f402c38289",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3c00000000038eca4160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270650000000086bf9efc01da691800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac09bb0336\", \"prevouts\": [\"9b0e76000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\", \"3acd12000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902eec2e5a57d677921aa4096b27e673aab99e6095c2094b15af3537f8be01164cdd3ea6510c2c74c68cd36b1cf0be60c3824f19bd36a3462cb5ac7e08db9df41d96c4f7ab6fd8f106635912e51b082a2848c5bfb02ec6000d7efe4f6694170a3a2093f1029782f675b2667204b8638dc957e76d3f5a894c2cfd3581361c2f06a35ef6fe913fe7f0ab9112b1ef2c4a2c5fd84fa449f4795765b025f3f8da609f4a80fccbff16d30aac4246f49f2cd18ab97355156dddc16af612a05b65f56bc170ddb0b8163a0dd5677bcb6718ed4ec9bdce3f614bd322f7eba943e26cca0f3fe141f02c2fd0f728970035effe127950da0258fbea1780a2d956085748424d3d41a16148da948e7d6e115d355436ed2d385e7542d4b75fbd95633b43947c2049445a6136a82780b035e8941b4d5aee7b0fb9a0887d44fd67b4ee47f923c7f1714673ab8c2b2ddd3fdc975ddaec7a3ac9ddb8d9bb74bcc86595f27668d49beeea4ef7053a84af86c9434571da729603d8647b39fe6d173d70fc8c7ae6ca7f40c5a3cd6d924ea8ef86e621e44696d8d5c99bd283d7c4f7e533f8ed07dccdf5ce13e3970c9534fd32e9601ac4b4bcffecc6b385ef1672b67c941c2e1b91332a12b8dc3a28900dd5546dc7fae081100c70851f052e0c668a7fffb79667009f7e6af9544135ceaae30b3efc6647c9865a71cd01cbfde034eee5724ae7a826a6552690c93308bca3be2ae16604875\", \"cc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac391effb841e4c3f4ca92b599bc572f2bc6440711e20bdc5ba4fc353379105b198f95dbc4edc81931664a748b39a9978dd32dedaf5c850114f6bd2f5098c050fb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09028695c928210b8a04282fbfe862a176d53daedc4f373270b87a731c794df8a5ba9babfc041a3d2559894981d2033f68b9e65fcc30886452be0a17f7913f06e13cf00f61424f331dc32df986fe3e817cd25153eee79f062c58bb21516c9f4bfd2bd57e63190004d0c8de74d9a858f80453c92a26168df1ee86a6570628810c311da96ea1552827306efc86de691c94843a887e6d82ce1b0e454de12fcb294e41d81936a9c26ff62b7c289b6e17d649f3901d5214c915cea5b5b2b8f5b4cc7c8f23b6336948429946d6925baaffdcd30908657f7e3b4b0927d499d93ad2f1c0af5654e96c001b55122ad9a07a4d7e55da201776171c08179b53e3603375660d28a92752fa35d72630f777617cde4738fe39e9bbb5fac7e6fb9aa0a512aa9151e83a410cead4e136dac1d042be70176ad9893d0151f2c83e4e607c8f4b2e441c4a742f01f146998cce2c5108b2066e200ea5af86f0f1736294873424a4712700743e461d49a31cef41c0d11da73549e1f2aea5a1f073b93ea6af5cb02c8fd6cf4983dfc86fdf1d1a3437aea4807b4fe3e3ccd1b9669f840e7fb442cc2c7abba36fecea288756f1aa31464d06de6c313b90fcb003653339ce222ba0fc7e9561dda2cc6bf148aefcd8cae1dcb1a5d62a048cefd0b5e18fea383069ee4261c479fe60a98c9fda82c4bdaa6a388f52cf4c848943df42a37cdbee53e5d5c60455a6bd9b739b9adf55c5883e136075\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8f31245d0339f22fddf0c8a157372cfa350cb7b4c29fad108e38a2a212532063d8f95dbc4edc81931664a748b39a9978dd32dedaf5c850114f6bd2f5098c050fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a5f0f80d6202449807c3c23b59496812943f4d12",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c33000000003fb3db2960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708000000000f56cb0cedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5600000000b56ec84c033b18af0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac87d19161\", \"prevouts\": [\"5469470000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\", \"ad4f1100000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"392e580000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"747d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e9d51b7afe827d3ebe2ba9d78269a9de5b698f1c4b4dd21f6a9ac5eedea4c46567ed562df09fa99b9816795ca593030d6e2a26df3d36427b327259a2f453cdc8077aea6ccf316b47e40a0e3636c5ad4f7738b9bfce630d4a478a0dbfcb51ed93\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0826e257627f53ae21a01782ee3e7d4da03b01bc19a25fdaba4c8a32b8ecf0a2d91bf4492fa00dc56072e72009d776219274bea6eb51adb458249eab71940c27cb4bfbb1ef2412aee06f4b75b9e20a72d4d9707545a4ae77abc538f76b00105406a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a610da0c9997c31b63719e6fe71e9b82d48595ec",
    "content": "{\"tx\": \"0affb4e102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb601000000148475f38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42101000000c9d6518c023f499c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcf4e9e538\", \"prevouts\": [\"110a680000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5f3e3700000000002358212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_9e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ed0921a70f405b28f146ee780fe72d7aa100ee6487cd304e5ef0c1ad64e2786e7801ec6e9e89efca57dcd7ba92347680ec58009f8cdeca548938e006adea4d1283\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"707f61a7b7877effdb59b96e8a661221cef02288cb18fb588cde977d58bc77b2703acadfa8d5e49065795b658a98406355c10a2500a1e0e9e42ce7dd40f12cd59e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a63c8dad9a5b7049824ad507266f11ef32fef7c3",
    "content": "{\"tx\": \"7a4c3a2f028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43e00000000402394cabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf43000000006307458b036973a8000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374874c040000\", \"prevouts\": [\"887434000000000022512003ab4180fdf64546247c5e9f6e4b9eec37b1d29fb6f370a343f066de5418d90b\", \"20ad75000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ef4e3ecce5d603e2d157e805fa5065208266e33fd73623d634c8de72e786f0311af4cb7678bbf2159735c79f83fe03a1a89cc7191d09be3128e2430e2b7f37b8\", \"40aa3b83941ca7138c8b99c297ecaf38b30f45cee32bd171fa246b253f034d39a77078b2c441861fe83c78db80d7a38b3f7bacf4b698898ba38e4e79f1856dc4ad6a16affed09ec4d6c9a2\", \"4cdc9925d14c6a90de73495e12e353b24d1bab3e395e525bfa7801b627f0b4e87848425136ebcb9db95449f5953ba463a95ef31b42a3cf0b40e2a4cc2e38ea793ee9b93f98bf3526908a43602118c4837ddd5b66d5dd1d72e356161d3d3ec27bd92143416829ede2a102bee99dcb87bf3469cb550b0adb0a469b36d8d6de17dfdf028e23163063fd42bb48833c5f567f083650fdaf927174fdfb6586dbb757513f9d72de77e5dd84d1d9b751c146a59275e1951767ce3cc2e53d3a813252d4c47b30da077dc3e6574aabfc5a5c823286ba68da388751732556e70a7c2b4c6d20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2051646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93641efbbae90d977c0a77f4a6d00a1fdc193ecaca05aee87ad86fd7458efc1bf9850616ba036f0261d3fbb05bc424770fad9d81a2fab9eae73d3c6a84d24acde4cf7d259f27303adeefe063910662639cd9206b8eed45d51f9a3ddc7becb8e1d697b81bbe024263f56fc7a5f55cd5c1f3dce1d35803fca6550652a1481f3d5d41582d86073393cae44f941e67fb2d850fa0d7a841f3f7007760f5a04dab5a6c76bf8e13d57cbeea15c73e171cc780d6a9ed9745a67e290449b49e5bc260f913c109b2712604811149f7e1fe8660b15f3e9c7c27b36e0865176f061702b8197645464b90c25eadf8e3e7dfb1e0fec34e85834a1a5dd46e16fe1d533563469e8c1b505fa9a39ef433ee7b7ce87bd7d2ac142a5c16fd03db838e94b94ded093b75bdf93a2a91e66878d1a6a955a8d70f562f6276e393d3ac94b5eeab37bddf8de0f74f7f54bd02628b355177f1dd586f09e37f1b80ec17858d180db76c7ee658d4c390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058daf0b4fadf03c4de067af76b756c06c36d23c217cef183c97956a3fb3177f7ae9b9f79d9ac6ec5c9f3f07e75b6b2eb78d303c91d98a4f03fb478fa73d35778ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000dce634dd5f9bc5e08acfd55a920a255912d7ebfb63916c4272554460fd5ae1f40000000000000000000000000000000000000000000000000000000000000000\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ef4e3ecce5d603e2d157e805fa5065208266e33fd73623d634c8de72e786f0311af4cb7678bbf2159735c79f83fe03a1a89cc7191d09be3128e2430e2b7f37b8\", \"a725c68ec8f406dfd7dbf5a273f87645e55f6f5239a31ca00c76a2c7c65d37942611ca42e24d2db79d1f7f6e5466e7bdc2da45f856237221c84dcf3043d3d61b251cb4c9f1b338946c17\", \"4cdc9925d14c6a90de73495e12e353b24d1bab3e395e525bfa7801b627f0b4e87848425136ebcb9db95449f5953ba463a95ef31b42a3cf0b40e2a4cc2e38ea793ee9b93f98bf3526908a43602118c4837ddd5b66d5dd1d72e356161d3d3ec27bd92143416829ede2a102bee99dcb87bf3469cb550b0adb0a469b36d8d6de17dfdf028e23163063fd42bb48833c5f567f083650fdaf927174fdfb6586dbb757513f9d72de77e5dd84d1d9b751c146a59275e1951767ce3cc2e53d3a813252d4c47b30da077dc3e6574aabfc5a5c823286ba68da388751732556e70a7c2b4c6d20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2051646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93641efbbae90d977c0a77f4a6d00a1fdc193ecaca05aee87ad86fd7458efc1bf9850616ba036f0261d3fbb05bc424770fad9d81a2fab9eae73d3c6a84d24acde4cf7d259f27303adeefe063910662639cd9206b8eed45d51f9a3ddc7becb8e1d697b81bbe024263f56fc7a5f55cd5c1f3dce1d35803fca6550652a1481f3d5d41582d86073393cae44f941e67fb2d850fa0d7a841f3f7007760f5a04dab5a6c76bf8e13d57cbeea15c73e171cc780d6a9ed9745a67e290449b49e5bc260f913c109b2712604811149f7e1fe8660b15f3e9c7c27b36e0865176f061702b8197645464b90c25eadf8e3e7dfb1e0fec34e85834a1a5dd46e16fe1d533563469e8c1b505fa9a39ef433ee7b7ce87bd7d2ac142a5c16fd03db838e94b94ded093b75bdf93a2a91e66878d1a6a955a8d70f562f6276e393d3ac94b5eeab37bddf8de0f74f7f54bd02628b355177f1dd586f09e37f1b80ec17858d180db76c7ee658d4c390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058daf0b4fadf03c4de067af76b756c06c36d23c217cef183c97956a3fb3177f7ae9b9f79d9ac6ec5c9f3f07e75b6b2eb78d303c91d98a4f03fb478fa73d35778ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000dce634dd5f9bc5e08acfd55a920a255912d7ebfb63916c4272554460fd5ae1f40000000000000000000000000000000000000000000000000000000000000000\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a65e2a892ee1771cf4861f2c1bc2d5f505645c14",
    "content": "{\"tx\": \"b063326b03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfd00000000d54304dcbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe900000000f78d71fd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707000000000eeb7db83038ea0cc0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df9797223689870b010000\", \"prevouts\": [\"daa652000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\", \"f0016e0000000000225c202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"33870e000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"3045022100f81b8bd0e5856e3eea9ceb7a34c12f671328026bf899b61a060b387234269cc60220282122f39466da35d6ffe4a7c2a6e38c2ce97ab4464dfc9eba2d1b0d06a30b3f83\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"3045022100e75e677ca31a354f30032050d1126fd0546e139de92a73a5392bdebbed38158c022014973c9342a6e814ab9ed22a17b67e9e04d31507de7cdd7d9a5151e3dcec325583\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a66d01f6351976b51603542719f7e00648878dc0",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8701000000bf8067dedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca100000000d2a15cb9029568c300000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47876b040000\", \"prevouts\": [\"d3fe700000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e24b550000000000165e142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_40\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e426331a8fad2cc97e797187ef99b7fb1e378c4b008a351c3c78fcc06c2f00057798b65a87a8f8be462cc502689790c7d9425918e1204cccf4eb617969dbb42603\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"04499c1d4b3d8718dfff9ce4e57130b60d88e4fccd295f0ad8449031d050ffc80c8e162bb14652433f5b3c9e08c5b22a0cfad24b1c9b900f8b017783a4c534bd40\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a686f07063eda38bb50a12b8bff95eb203e492e2",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3e01000000c939c0b1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3c000000003e7a40d504d3214600000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a603000000\", \"prevouts\": [\"72c32600000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\", \"70d6210000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063d668\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936661e017775885ff16b303f239ff1d68a27e8f3b845da3c007af0c869ad5cd4dbd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51e30d689b41c4cadafebe300f1e3aad2e0751ea174af1d1313cd49baaa526270b3acfa007b318c5da81cf6562f4932e2754570ba3b679b809769f541be0a6b617\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08296d09828da376c7d22ded5a4cf88780a729051831fc4ab0b26d0bae49a473f5539caad535bb8d51429d9c94edd44271a241bcdcdcd941caf815b31d1e73ac1400dccf8e3471e4a61057d1540548a04f67f25f6a36812a8ea9d07747f2e4b3a8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a6932b59aafceeb75607a7b5c0b5d93b3f2e17dc",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ed0000000005c790a2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6c0100000018167116dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9f00000000e046d60303b5e5830000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e74d241b32\", \"prevouts\": [\"69900f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ae0c58000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"92f41e000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4b4e321dfd5536232eaef67cd7779b0e400c7a17a369dbe44f6d3cf0436c0a34cc80764b3c3e93e4958bf58fae47a07e6a3ac966c9bf86a1c799b8570c4674755\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364111e840683a1cfa1052f9cfdcf24e918a2939e690b2f7481352b952cd61f4023f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f61f73219d91856056394a010eb6c8ee7f13c9683181be224f0fcf47ad20d61b9aaad3e4ddcb787e09feaf57a938d0a46e7e94627a74ec9b410f8a5374ea1d35\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a6b7a9259b013c7a8613e1a5291dff6a4c46e85d",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd3000000009fe7febfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b86010000005573ef0e03daf96e0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787dcce0e48\", \"prevouts\": [\"492f4f00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"2c5e220000000000225120d0cab111a0a7736e4b6d77027eed86efb57774f05b322cfbf052f28c507b8b1c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"b17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cae86cd3dd9bd9d0577c5e628f8c108447049b8824610cef934ea775cccad27dc037589144f6259b59768147ff9100354b3b8b337e77dac87d022b72101a452a989f510e73a03c44610e5cde856f75a0d7582565d561698089d126c5e7f66809\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d00392cf6f299065ffbf5a36392615c3de37904e8baeaf39337c685dfd4950987965eeee556c39a9ca7aea66d0df3ed5bb1c1b5d1b815eb2ab41d6c7fc5721f63804e0ef706f1ca5c8b2fa38155abc6bb5e2265734815bc03afdad0836bb7f05989f510e73a03c44610e5cde856f75a0d7582565d561698089d126c5e7f66809\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a6ba23753e57cd1a1f2d7e37472e4679a0f113a7",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1101000000c10c2513dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4a000000001013795b0240fdcd000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac35020000\", \"prevouts\": [\"660a7d0000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"ea8852000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f93f6925a87bd14746adb659f1fe3cf13cfffe886e85290181fd9d778229362a9b124451a95f66d328740c8f74b6bc79ec66573930240463dbcd03d8389735ccc3a658b9783cc0a28fcc02932d4b85eca4f49aba0b4fac0b36a7e3a0001ff4113fd119d5a804161d41189f11d8f3e11243ae602674c5e73f1686492aa1f485fe\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4a90fb3f53527a925db2b4d49a3795cd34d4dcf648c4b3a4a108990f2ed12b180a28c39ce330a19a0d6c22ddc640bc3609271e6194de475fecd1ad84a88d361935a9a81b6bc4d13af192f1d19d1915de95ad8d42e49add8bb4e9a9400ca460b05\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a6c5d8b49fda54f8534027bba1269af6af46da1f",
    "content": "{\"tx\": \"1708ab0302dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1902000000fef83395dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb400000000292d34e70146f851000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87f4000000\", \"prevouts\": [\"dd835a0000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\", \"51594f00000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"417d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e53f01d9cbc4ce44e53bf46e342c1ac713c14ac9ff1cc3e88a31c5570fba253bd819e00a9246c8c145cff8a91ff4546d478c6c8e3d7b4e3f7e61102a4388494af\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e6b3e1503a75cab4228de52cbc7114305d9c61d6436e3951ac91baab2f1e550532d46fff335db0bc559e9bb1dfa0a13335da6dee7eeb053c06bd06875f6e68356831d286b681d36077bb0670e25d1d3b2bbe36e9d696c3276746d4ede397eb7d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a6ccf2fabae7c6419459beefef87fd1e78fb2d4f",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca801000000af0593dadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1e000000003ce8e7810303907300000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7b3a96d28\", \"prevouts\": [\"2743510000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"27ec2400000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"e27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ddc5ef0753cfbbae9ae95a5d7a8057a0f244ed9534f11134802dcf3d6e001e11de3dcad145b88b360fb9f51ed5363f34910a171e61f360dd6bdf047d4a1b93cb212021a26ea5e00fb993aa3d0fc1bd1e431f365db69035b8e4625845fc9b697c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e0bc8e394a89b61e744ca0843579507fbd14c939f32cc2eb6ce7075b90210fcdaec7827d9bc9e4e8e39cc141cf7690ea6843d6b50eda1fc8d5571fb149b2aabab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a6f23c5bb6dad507a24fea1ceecc0df2a026481c",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4901000000213507c5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5300000000f92f4bb6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf150100000091782beb0145d3670000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcc4eafb2e\", \"prevouts\": [\"6e315000000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\", \"96f25c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"60086b0000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"0b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93684c23a4f834a7effc42b1c4f88dcc82246b0d4e764e461eb4f4db8348ecfb3306eee185c5450ca8ff820874ed786a77ca41a0ece110e4e1e272b53628d0f659ee0d9bed60e53dfa6fe8b58229f37daf0597893c765c7b30814eb9e16fca89b86\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ef92671edfc08b1595b62488145cc68a42644b51379cbb9ed71181eed5e56f97e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8784d9e7ee919b8817f3904ff7d27b5c3a4ce3798ed5b994b75288b8e9341d9b42c78e40500fa05b550b7f6357dbf83024c41a574f6a1706762c104fa8aec3fcb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a708a2f8ec818a38ec29e17b587179a32b43d704",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3101000000c451b5dd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127015010000002772d9f604f9e86c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df9797223689876014a635\", \"prevouts\": [\"13265e000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\", \"6cab110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"2b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670b7161a5b1cb29051dcb3b6acc763e0bb56982feda88150ccd46d276a32260d527b3d6e358222ba6f0d0e44427df3c74648eb5abf60e34311dababed48c5c2bd74d03d2cf0ae79996d1bf896237ca201e78f1b4c5ece550af4c0e01e9fa9886\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e44f1db148647e579a127c5c190f6913605985e391579ddf83e446378ee4bc7a1d75fc84f2af88925f7ad475b3203cbf9256a43a0cda52d14a3416be93a7fb1c4d74d03d2cf0ae79996d1bf896237ca201e78f1b4c5ece550af4c0e01e9fa9886\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a70da8709e12ffb27292ce7290967a40c89cf126",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfaf01000000ef6fe8da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703c00000000151d319e02c354820000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acb4e81421\", \"prevouts\": [\"e0b1750000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bc630f000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3045022100e3ea4829c15a3bf776b65a0fe0b1e6bb100a0413eb3b20dd5820721f3a62cce30220223e98bd049ac8f17a050b740e2a8cff561ace71bae3711903eb991d6e66976082\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"304402202e4e74cfef2382a010e10be770a5126740c96b42c360beb847292202b380fe49022043a288cffa8855e928ed3ad9029d166d467591dee6597cf40b5e941982dd81b082\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a72f0993c4460fa269fecd7c19909f1a8f319d4a",
    "content": "{\"tx\": \"2b467a1e03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3d01000000139453f3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b81000000002569e0acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4c01000000b62770a0012fe80c0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc33010000\", \"prevouts\": [\"8f265c000000000022512035205488698c55c3e7035f1484d2f513744eb9d8b6fb6f0df083f7669ef0bfda\", \"7d6a1f0000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\", \"d6c05300000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902346020a3263d5c4c92afc2504229468ef459e0c8a9425c4b8d7ad735c4ccb785c9498de5c43d514bac29008e912d831cf2bced5c999b623ff09c62adf6557f97ae80d9e399719012a7d1818a223b88fd05226bb64f4410d12c988e3255557b67fa6820165b381a9852e5e7a1c65d27ce16d1a13b893e68d6e1a5a4a7779735685573fbd3f40f31d7b19f02187a97d4069eba036d9e3c34ffca5326f3507b0b8f3bc18803d1e1e1b297e5c6ffd68e0263ec749efbcaf3394297688a5a82bc869a2e3361fc6ab00381d17e644540619e23e06c328f5ba3925570d4e0d672633b571014293081eaf061ec8026cf778e4639dadcab6db4e70281c6b5a6edcef61155f3b41bf44c1c0b87ae762458aef3e3afe7958edbf20d24453040f80538842ea10459d5537825a3f8643daa481d567b0fb169e8c194f1aaa697479cdd94e45e9cafda25267ea6bef876bce509606e4c8a465e1e2395455bddd09d08e3bffcbf397b8e3736568834900b2d4655bf8e1beee4e7eb3eba37ad9cbeeeb467de3c84187621921a6a12b8d66e632bebf7fd93f93acf4c2f200067a4f61956d776145f4c67e7c8156db0586407a9438f23190b426d1569138af117f08d062371cae0ad0d58e023d755ba0498661894ed3ce24eb3afb5c9a245a058072621f58289a70b4463e331aa052570f8ab87060962c9ced574171afcd493da05c0eb34d3a4216e010bc30138d695cc181875\", \"e07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a9c082d7a7f7de44a9f5e716083bee5abe71d27348a6c6c8c4ae2385abf8d44dcfc84644ef9fcb418936abdde9e6d46d404f44a19de7b4f5c4865233c46051e9a410273431f29264d27122ed0946ba884bbeaa1cf1ddeb7776ccdcb7bb2f1db0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09023cdc65778912e029db5fe78cc6d0b5525d191b55df27ad4610d3fb7db57298422c170fe1d73a30c1667b0282287d9d54a7ba2b101737721a7476993b8a90d38472e7c2d0acd92f1cf21549b7472adfcd070ccaf6b875206e4db55e2f9ed6cd848bf44e340cd155a04ea322aee16c896614c4bbfaa6e8f6b38f0ccd72d9ed8789a9b7597eebdc6d0c6c92eba9fd7029d391807df09619fc2883f1172ac79d004fe87c89974245e5077a6ef34286a24cf2f96ff82403cf12528673d08083d4b52b343622f1cf9d63c62fed5fc18274173fa2766944e4f3b0268cff4443f771e8781519ad8bd4cfcfe70f6b562735c35ddbbec49b4cbf5a84640a6a7d1d22254ed80f65ed54e63fc545f5732479218c1ff2e15a7f5625c152cc6a1c89a8459b585c7f04ffce84ed0569514183d1c6ccb76f6c772b651421c6b52ea282a1fe049ab742a3017f8a15b8984c8adbd8860a3503a0c6ea08db6faa6658eae1aa36be517a65921509e62b8de98a22d113b2e644cff96696e3196b27920461e8dbc6f4c02a09736dc6b25387b13bf94bca5762ee58d82ba67037939e65e39b2cadde03d71b2efb4ca894fe8574d95dd2d10c3916c37f6b4552b1bb65e636e5c4d424de266883004593f8db6752c111a25448ed4bf9e70bda17b69c780b0374a7aa852f14762a4cb4ad1ad570f0047966505ad03410abd8836032b83cf3fce8a71f463ab4fb02b4cdbea4b2059d4b75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93653ef5c0f24be88f175543190b3df0cfd9a18eda71b356c1e4a2e53d4881e725e8e461ced71aca9bcca55b69078fb4637b626cf10c8373b915aa1b57bf9dc2b76cfc84644ef9fcb418936abdde9e6d46d404f44a19de7b4f5c4865233c46051e9a410273431f29264d27122ed0946ba884bbeaa1cf1ddeb7776ccdcb7bb2f1db0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a732f61f7a104110a42397e2f2bcff054f17f50d",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0a0200000089a51db2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6301000000b13edf8504c9d17400000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac29b2eb20\", \"prevouts\": [\"4612240000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\", \"7a71520000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_b4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"be7e3880ca6e693cac1a5f7889b2e04ad8fcf784d322dd445711a14b845f980a726f127e294281ba8f5a371ca3abda7ef5d65b57bf5cc940de9b0f93cfcdeb9683\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7ef176ec3b5b8e94bc337627fe40b23168678ae536a574515e51fe301b78516c38d4453cf77eb2468ba3a5123a5fc2f6f4dc946b5299b279d5aada1bb926d962b4\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a736014c5e879818948ab14c8851770efe5d5fbb",
    "content": "{\"tx\": \"66f1c1cd0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ea010000009c1919fd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e000000000477db4ae01416e1b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4879c000000\", \"prevouts\": [\"77a610000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\", \"afed0e000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/input80limit\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5334ea9e86c7471e37a8b4d5526bc777286b69216c68a844e99e50793190372976b4027c2d9672d4916d60f11b1bdbeeedeed5383c2dcc9f8828f31bde8f845e\", \"34935091b35283d2de16b48ee783ac66311b6ca0edc7b43b5205053f47522eec8534fac18aa726240187128ec99ebd521e90f971d252f3c4c735939c807f73d659dc58e7434887fe7e9b9422c7223808\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93633f145906eb3b0b9144503b7e952fa7ac030804bf21818b76946b0617a1dc901d4021eb67a5422f2c264ab2e161e443ad68483a924a10f3067064f47bfc1aa823d0cff3dcc0a2d4e46fc30f48a30ceeaa99fba3feb9f110c8632a3b2fa3f4f4f8fbdead7f8de6a8aad36d37b0d589bc9244c1684fd5ac3294cec67c7c6e587a6904ede5a53833ce5d447360be78b94add963f9070eac219e9b04ee2bdd400ddd04364ae3f3c0d48023a93d8481ba8ff7adab87d79476f69028f3fb22b08d057964bbb3ea34308947c748760264ee9e03eb1f98d2b66028dab654f580a418be99661f479a6b0f557293064f4a690bd09af98d8bd3a778ce8944b23259946622ee8f58700e34290ee018923271c5b5338c26b1c5ef6f25154ea2cb21c87cb2bddad45cd3b88d2dbb65b62cf977bb614d0efb5c9353a8b35cfa01122561253231744c2c32064ddb3ff0f538be34c536787771f8aa5aec123a81e8014a979ffa6906075479528a5b4db5d683c0884af4c8976d652dd9505f85dd291fe0843ffd0ff27865ba15c8822e63cb0be5982c1ef15a41fad555080e76aad0b72a8aa15726acd51679a62f62b306cf011a5d1358e6ba8e189d7358bc43376d46dcace83895e75b2934214492b999e4970e4990c42fb0eac353aa09117e3e38145bdbc22646e577b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a73a44e1dbbda1a5482aab336034e0f3b2631b86",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1a020000005f503664bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3a01000000af22f6838bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45a01000000ec72071c0131d9410000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc7bf29061\", \"prevouts\": [\"8127570000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"5719770000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4e193e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090235768cc18c827edbc85865db0e988cb5b087aea9388ccfaf882c583719a0cfdf8615ffc50c0449bd2f76210a99e4a2c6d78a6e9d76bc7cb276b1de91886e6905d0b086018a1de6c37cd8bfa48aafc0ee04c063fe0bd102bd1407b19000390a77fea54f87a9576ea959d4be9379a20cf94100df7cdeb59173933133c38b0884125a9e997c58e6ef2a0ecc7902f5f7d48e852b738d3ab4657ea88a29fcb53a8aa379403dbad6b3ddb0913f1b8a8662e41d80f4b9f87daf4587bec216680991e4ef6eaec2d21a83291f49b0b10b146f15a02aad8f346e529fa7536824f156184b373df9169ddcc88415995537434a208ea94cb45357989220c2e9a0caa3650097413871c015b020e5eca366975eb4c86fb0576fc3d49ff90a4086365d2979cb38f2735db5bc95f109476ca68b391204e5b61dcd085fe3b075834d266f6f815884ffda7b43debe8f46ec694648ffb6e95f4cd72d9757e0923b2ffe0f090ec181c2f3a533bc1b00ce5850920916777d45a54cece91289e987e797cee320ac6097f0c941f9ca59a2f08ff378195f2e080c4ee150be00da65419286ee9e3a80eda2a6ce4e09721e913ccbc3c7b54422603602fbaa881c0d2d66bbca7b7f7be2670167c512a71c08c9cd45d102d2fa0d328bd1741e20d95aeeeeeed3db2ab1db20a8bad87833418897f35e6587a7427ec2f33fd730ffd169990e7e7211eb6db48ad411faa35811f4098ab71c8e75e7\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fe99ab9c338d93c77fb73e36d1c4a98d4f4968424582f3ad48770429ba47f9c01ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045809bd2604b63a9913b428e9bd239a7888c90ad67a336710c360335112147f5da391a14412c925771c32fa4c7776d5872be2a56fee9c5a8de868e7e6e5a4c84da\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022527e500d120152e18c6e624bb2fde94a3a4f66e7e630e9836935fe44806ba207ea23ff722849369b25be6e16f49fece2bf2e5fff4c0027b8a6792995e97ad33849d39d5421d7c08ffded882a25db3d4e73908c5735ec774ee705a90f380e900420b6715ffa313c178573d8d6c4a9bbd2bf67e4235f7e0720c0ef8bee3224e0b13b8835d88062126170d329fcf7e11ec3e3db3e49ca6e3f6f49854f443072e1f3f988dc5b234d26516ccad4a4268aa4909a96cf1380553097ab3ab0db61536357d6635d21de410a2a81869c8c6eba6082a13ab5aa5bb63c2c4ceca070941e0ae742480ecbc127d6d1156dd3c7f71065f3a39b66f5577301e3978551ab3d1dfa8f0e633123cd2f9f041b3b3f7c911f5060ba6d0327cc368905bd1e2a46e24b7c56a546577eab2035af69b5ae767e72ad4fbc415e25564850821811e598fc8c33e5e834a236faf9cc90b4b9c87ec6eaf43fb91cd1953971c7f43ac756b728decb5020c50ef56fcbcd16f6e4157010d4264ef85c53f67b9ea8352ff1bf37a449f47eb1c7bad1498b0af78af01ac973a6bb3f68d93cf0f890f14362e4a53b53861efb9e4ccc1d8a51e242d08c5ff3bdd2e420db9294fb8ba3c197eb0478308be33416a003e8f456cb8adfaac1cb07fa625280b44e7ddbbf572415c8c81742a825887b1924f2025625199e78bb9d14998915ee9eb98657e1eb5a6857f54f51d4773eeb5b7a38d17eec1a5987561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360513f5f632a7f8be58086e0894937cecc6daf0ca2d073151c884d599ae841f03ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b292a4f502e305109d81040f98432632ff806e9beae33e8faa7e022234476532106df482d4085282f873fe38dcb59fc4eea3656d896112fe243f784a0cfce46b53\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a742d0a1cc22ae97a4d67dae7649bce1710b89db",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3b00000000110e443e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d6000000007304bad901c0c94000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac97000000\", \"prevouts\": [\"32502700000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"2ad4360000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"483045022100828cde6313848c24476a72f2b71e49823f118872ba1aae36c5c144fd38e29eb202204a36eb88e21ab4de59e851968b047406b2e5028e4ca303dba5ddd1669f856c2e8200\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100de41570bb83244d8a2515d1ec806a05c3749a96f7fe9bc234a8a36155089798f02200f8fd23a97f60a695c8931d32f2ef14158d724defc916738d9bfab3926a98ca8820101\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a758aa7b471d865a094148a124f948d84c1137bd",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706f00000000c32c43f2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf320100000028b9c79a0196fd4300000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac7d040000\", \"prevouts\": [\"bd700f0000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\", \"b5d872000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/emptysigs/nochecksigverify\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"a42d66e22764169649205bf660a36401a5998de14e4e22ac5fa0f49349dce91254650d6f18dc28cac415e74088abc041f585e96e0c884e7de64d36aff8058e70\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac91\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b87c3d13bda4bc96912d9e1d3614b88ea00288653983e5946dd79f95cad56850892bd312bf555f4ddaee895b667ff52e0154e570fb3b21fb70ce55962eaacfa82b8a8694f12869a73a7c9258692c0a516e36ca599c5440cd48185ae688899f972334d1082e7cf9fba1fb8bfc554039e0d30e1d717d7bd10b1687557faeaf94ec531fe2ceb6eb6fc38e892c8463543d75fb6857ed3555003db7d30631ee24ce556745e6d5f13398b82293345b14639057cfe7c9133f3a817857bdff96787ef39c49602cf62409ee25e64fef6eaf4f70b438998ea376bf89aac812460edc6098d5da36431739388703f162bfd6be43cc18929921c1c825eeda473da76ec1d4f9fb59fb388f102ea0ad67c71defac059c7c8b93c58afe1a654026c6fac78536b8b1901243e25851de0d6781e7f528327af4772fe14b340f1eedd75761d4eaa742157b0a6f9680ce7f5ca5bec9338fe334e6832114c99db2b4b78f7605856e14f0f922c7dab2635ca4d983bce69908efc2d6c8e3a4e02d107fe54b591d6c8cbc0ea2e862ced977f81641729beff04e69bc449bbaee4ae229138f125e8f575c30a32bf5a3113bfeca67cfbd40f858b9150f2d1112d4e5e609341baa11cda5532a4a71babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"9c418e456752bdad7c2a2d78dd2db333058a2e8bfb74a2b52dad6b93bca13e67de20aba6ec94b42f141ce7c8f2919f900cbd63cb40934b67e8dcdaa9619fae31\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad0000ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362eb6571610c70f380db264fcf96c64d03665ff198a8b827b7dc791c63516783eb15bda27b7d8ad82c85268f5d7748d6dcf4d5072bcbe6bf1db653a2b9f2a52aaefcd318d6541bb5a7c7e45ebeaed5c7d25dc635446e705c786f9c4ce147f37a9d7197dbb5cfd3049014661f05d5163a8221229ada4cd88087da855b3b81d63fd0b4b5ca1a0f5388bb0d625260e6bd80c4a0feaccd254afb0720be0eacad2de6c8dae29fcb2d9844e6741948f3aa4951320b2ca0e41fcac9fedee7a10c5c5bbcc67dc10fcceb6178979afb039d0ca186b3f923d92479e0d54bcf61271ab453ef19a06951f11ae8cfc71593005298dcd015b99ad04d1f6c27a7163f3dc19ce9a31d4d2a49b2999dc23f41d9ca3b7abd0a877a9fecd5f2ef4fd5885309ed79fd905492e27c5aa3537568f6734824d9e13d17b040b5b13f58e286505de213f86581d977acef7f6b695f70556e0cf280f2f492800c5063304369626aa3de8e4870d2a17002da8b6956793790e2522cdbbbc51c3e76cc941c9170ee3ae91039a9479105f3564c54269032898a6cd874ff4d1fe0ed410013dc82714eb7a54d64226e3868b0e659112c9f7f4ef135ef7e3677927c686e2cfb83a5642dd1287d117c18623babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a76b07ca76b8129996817bda9c15cfe6c801c496",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f801000000038e6fa4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c00010000005e6f05c7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6c00000000737b03c302ffe3c000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac65fd242d\", \"prevouts\": [\"a82c3e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d5b75e0000000000225120733adac9df449b2595d1b217303cc00a8e3c5ae4d51e5f74120e9d2d90d81fcc\", \"1b492600000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d24c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820ec8a0a1d660d587d93edd278a1416bd3a7fb5c67f78681973183382c988e9bb422e3784e386a40d51dfdc8b2696050c6780884f0aa6a0f3f5d0b1b514784d82ef429df53f77997a088ac7849be23d2367c05dc96029904e93835fc046c3c5b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936973a7bdafd3a5ef35a7e23347c5fdd71b10175a725fb4e7f58b4fefebafdb0115d26c3c7079b274e62542512e39807ee92511541c708e3b51bc61366b8def992ef429df53f77997a088ac7849be23d2367c05dc96029904e93835fc046c3c5b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a777b3aa2b4eb6ca1a87d04550c620145fe1fd1d",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8801000000e3859977dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1f0200000017508a9f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708601000000d56fc4e201266d0000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7e89ca15d\", \"prevouts\": [\"0f5467000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"e47e5a00000000002251205857fc26f723a58058d8b22639f4b33f8ef23084aa37309f77fdf87ef7a99b1a\", \"92430f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_24\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"57d29c2b50a27ced58aab6a3c76a12c7ad3b9623b943af4a48702d9de690be2fd078169290c1dd1971a2619341656b66e10275c86e6754072abfdb798e920f7c02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3551c4fde51445d427eb98a70efc9e5bfb2163ae2d5133a85c1edb7235bf8af3e850dfa6675b240c96bc470db72e9d17bf57c49006ca487e4e9d41062a410ce324\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a78c1ce484d2b06f18054390abe8ba3738befc47",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2901000000e28d14cabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf02010000006dad27f30176a80c000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478703010000\", \"prevouts\": [\"44a84d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9959750000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_36\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"40d5a58c9885ab7b1d1b678f6341099506d6bd43698166fe9693788d68c3202d405084d971bd6eb3c5cd0961931e990efa18c030af1d944e42704c294e4db4f502\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5c6e9893b26b4a6d283f23a6f0f8cb1f11ef43e00fa8aac44ab80ff72cc50d96b10c9af93888770b3b71256cf70dca77d9367c0e3fd22800a4784c2e1a6c417f36\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a7ca771886a4f3f8ef1274e272ed3b75f1c52957",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700500000000d5fa4fd7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2f00000000fc361b8a0386bd590000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df9797223689879194515e\", \"prevouts\": [\"7158120000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\", \"8aa7490000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063c668\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364338f70e5e33632588fc102a877b38a4fdb50459f63c5574a90f5a912ec702d9d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d514a68ec639edecebbcc441a95b015cfc7d67c6cfab51cac7643a880d3dd4163fb31e5a3cd6e337eb252bd8d7a8d95e14a531fbfbee4d245debca50b247e512ad1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360d7e5dcbe8dfb5ec682ee6209548eff1fd1425d8165cb88b4f9c5546369c4bac6a39aac74ee3f63949b9c215c515b0db1b113f4639b3fb19cd99ba22ff01310c728ffffb27e62918c729ff5ffa8fa6bd185df3cc350f3591557de0b18c4f64cb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a7d8752018d8cded7995daa9e4cd387a0f75eafc",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf55000000004245bcb4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b17000000009c83f3e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3a01000000932991810400c0e700000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac6fe3af24\", \"prevouts\": [\"3f1c6e00000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\", \"ceaf1e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"75615d00000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"ff7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8cba978c9f8bb8ad08bb333d68e8bfcd03859985a79755d391cef5d6f406deb57187b9e30f7e626b28b6dbe2d7b101f74e326290698090dbb0a7eb7a50daae87a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93601da56f1886d9f6f914134eb53345fabd457f9b9efbcaf83e02a7ef8dfaa155f3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f59f882dcce043ab5273f79d0d152c35fae0f251a6812c7f2d3daa07c20029a516c082ffd0388de178727289f9edc245ed8244bc4e4186d1c7a66ea621fec0ad\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a7edc21f3d053cf490a4f0032887dd77602ce962",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0a01000000b500cca2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb0010000004057a30b02358044000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7da000000\", \"prevouts\": [\"8e402500000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\", \"389821000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d64c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c7d6bb54cde9cc6775748a201bb3f5d5704911b2e65f691925d2f8dff2efd34cd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51e30d689b41c4cadafebe300f1e3aad2e0751ea174af1d1313cd49baaa526270b3acfa007b318c5da81cf6562f4932e2754570ba3b679b809769f541be0a6b617\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1360d69898a7d9d7cfe47282f038ce081b7b00f0e720fcc7ce2a76c05a52019262a5aef24b6a1c01bacd2a24a37cefc04a347b590d10f3bd98469f969c355217b0dccf8e3471e4a61057d1540548a04f67f25f6a36812a8ea9d07747f2e4b3a8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a80117d2623452c4c4d047ad5ffdcd2cfd707957",
    "content": "{\"tx\": \"b3c1472202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf2000000000576e88bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd70000000004c7aada0154af38000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374876209cf31\", \"prevouts\": [\"efcf20000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\", \"a7286400000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f64c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e88526c13eb9f3ceda07aab2d6470ded7d71666b865703d69a451a4808570d93ab836f202d3609bf617cb7b4b7700532182ae3d2e1a09e3b3f38346196fd93b669cfd1883d9d94906422bb83623918edcd109683f826bcbf676882b31fdcf44192fb5cf2427ede6d61c8a74b8487764d962b41d4db4b67b9e943a724e86dc0ff\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93643ff5ae612146c623386afcd59c1296ef50bdcb60fcd6c7914b141fccfe9e234ece7439a6da18213b739641e86399840a31603efd6bc35e889cb5cc2f58e891a69cfd1883d9d94906422bb83623918edcd109683f826bcbf676882b31fdcf44192fb5cf2427ede6d61c8a74b8487764d962b41d4db4b67b9e943a724e86dc0ff\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a814c0230632e5c08f097102f2033615293348b7",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2901000000fe70cee560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c40100000092a97d7a03d69a2f00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac4a846650\", \"prevouts\": [\"c485200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c66f110000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_72\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"11e22a9e4803cde68c6394178c87bb58aca43a6acf77019d87ad91e3c6c671dd7fc40b515b8ca1e601b764945ccb365ca6871801d05571783d480089b1d9693183\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"54338879af07fd4bde5c2f7c68edcd64ec57c357b701c48cd732917be1fd800693456971040f5f75476bee95ec3579dd7cef72a2e8c4f8199d042358a9fb081672\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a83603464a89b1ff53b86c47af7c54b0f8a72405",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42a000000003ca5b8c5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bda000000002a7cdb2b04cf6957000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487c7000000\", \"prevouts\": [\"013e340000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\", \"9b13250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_1a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"970035fdf6c2a35ebb629e3866a63d1ad69b6ee1eb66de87cb661f8a8fe3173f2bc76a5a9aebbf2bd493f92e5f84bac6d418c499852642cc5d64b58b4abd787683\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c37d4dbf74b8e1bca59778650430b3745be9d4b1228eb549c230b0407d0c4333818bcef4c632cad10bb17b74df923f3a166c32a9511b73351ab8f515ce3499d1a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a858130542274ac050eecd7df40f62a22f2af3e5",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4da01000000f19794d98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49201000000e17d8ac402e45f79000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65afb4455\", \"prevouts\": [\"b8394000000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"18193b00000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"84\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b09f12ec1a5fa4aa343993f316f0126821d68bdf7911bc110cb6f7136d98f163462b9d29a734e556c6b2d2347029c074a964aefd93d416389a14ef3ddb3da113c419005ce053ef5676128682d79317eecff4f27ad8f3a341c1729484208650bf5e521f6248097fdc64ff5a0a6cea9e07e7c649e93dab8ac6058acbfaf1ad70aa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694086fc36ff4db5fca7b596fd90c3389887398c2c7f02b2c132cac3937a1991e1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900459910ef1376b2f57d6157bb9e8c31b4bd4b9d07432c4b683bf27102948dfaafec7644b3dbe2d9311c88339dffa1c0be80a46778a5837645266f0e84452a246701\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a87851edeb5a5db0f65fd04d5730500bf77c3e76",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8100000000cd228e8dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa4000000004c9db3ce04ea51bf000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a60d000000\", \"prevouts\": [\"11384c0000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\", \"6aa37400000000001659142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d94c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363223f590d275dbf98f3959a26c5345f553357b5bd8a825b42274d58542b11fc5131be74f8e69d59b35718025ad78971477354696379895e31ee13c64e6c94e9a3a6c94bbfbe0c8d8162307ea587875a7b29cdfde589bfdf70042a40a3445f95ec19ec7aa48c905d8ed6637f3c17c0400a43c560e5c859444683190ee16fe2235\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ce5a205315494d2cbc0845b221baea99481be73664e5e27f84c5797e8ccf74a7a3ea69b746c966c84daf122809976a6bce8b1d887b17a6e963c4c690b8a790e73a6c94bbfbe0c8d8162307ea587875a7b29cdfde589bfdf70042a40a3445f95ec19ec7aa48c905d8ed6637f3c17c0400a43c560e5c859444683190ee16fe2235\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a8a3b52078ade562edb5a7dc6ab61ce4b3cca2ab",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f3000000008d771f89dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd500000000c1cefaf2042f856000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acf2b3e221\", \"prevouts\": [\"23500f0000000000225120a283e1ea0142d34d03fade4b28902cd262d82bab6ae3891658a9596d967dbc43\", \"c97753000000000017a914e014b0ed75ce4306970c9f63e88b08a5a7bb4d0f87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"617d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e2d9d76ecaacf763fa245da0e21bf637d9a70bbacbab17d040c4c51a52a3413843a93d7e1c40927dcd10fd5d28aa4402a453542c320ae883aef57b2a7090ae6b3ab6b2d4691bf881316931c587f0a213fdb9026021e80f212e72f88982a6bfdc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e83f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820063b43826002dc6eba62f224851f0eabb14759fb10c707a6afd7fdb59e93aad3ab6b2d4691bf881316931c587f0a213fdb9026021e80f212e72f88982a6bfdc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a8b03c8e24ef968616c561f18edd3944caccbc5f",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff0000000009808edabdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba601000000851525c48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47701000000859dffb10302a2e2000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374871878ff56\", \"prevouts\": [\"74b9810000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"6309280000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"0ace3b000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"597d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08246c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faa393999847c63b69274661db27cd2e7bb4343911a06570db858c301dc754c7eb4be962498b383c32e8a84fa570ade752f3a2216469b10dbfd65078bd8e1b5998\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a236af21b488012c2421836e39d217363cb976e6d84d75dc27b845e8fa3877b3e1a055bce30035b144601862be42e0b1f1d387c5344cafae4ff25a0d1808b56acd61c62feef9509bc7b3762bc81079411fa6867ea4986820580c60fa1e8298e9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a8b6c76ee96d3aab811609a8979cfcc67cff79c6",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be200000000ee786e5160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bd000000003fc93dccbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5c00000000b8e3e08703aa61a2000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a678fb6231\", \"prevouts\": [\"1b322300000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"217511000000000017a9141a56e0fb41afaf4b9e6feff1797087c69015162687\", \"f93a700000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"9d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a832c2593bdac0cb0b42624935007d1442180dae3fe4e49dcedfd3101f5729d872756956c694637235f847009e8e23b8c05283b4a047903b3fbdb647ae4209c1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364d9cfd389e774c529beca95e1955030c310e90019de0d0c1b56b68b6d8ca0660e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a832c2593bdac0cb0b42624935007d1442180dae3fe4e49dcedfd3101f5729d872756956c694637235f847009e8e23b8c05283b4a047903b3fbdb647ae4209c1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a8cd8ebe1c92a5ce01cb9d553c32988d450e82c9",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0901000000304617538bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41901000000d85fa7830225df550000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ace8000000\", \"prevouts\": [\"d42d200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"517537000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_14\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5db449c20988a545b2c3b5f047023aa6b582f5149664cdd8ac8fd4816e980dfd564f6114607f398abfac602ab58fd1d8a69889a2384c28fd8dbb486f591d524f82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9399abb7aa94859a85d8277e3a6200ebaf4e87f9a3bc74fc366b52db04938298abecf8289cfbd7c8efe9e119940929e81c23d2dbb78f510e009ebea74a1952c814\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a8f6f74ddb0e0e8e8361ea297e0abac830cc1dfd",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf090100000080c5ae2e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c408010000006b50ec9a8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46f01000000809ae9ca023333d50000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e78c000000\", \"prevouts\": [\"8b6969000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\", \"5187380000000000225c202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"971f3600000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f259980f9f225d7b43c3471d51a041623278740413d717b078cf94bbdfcfe080250664c119f639ad9c92d5beabe942124a2293c1a07924c261b1283a169c8c20\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a912b73ec5ce6f1628bcb8d8e2dca4f96fb71c5a",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cf010000002d86ee8cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba5000000005702dfc60407903000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a627000000\", \"prevouts\": [\"e2b60f000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"91282300000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100b2294fec2090424a2bc0a41d32ee1200089bd3acc05f34a7300ae8fa367c024702207d8c120680e254106dcc929875cf72bab4870e2611ea3b700a28e71008cf55b7032102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022078e1a505fd632debff7ad03779c8596f10ab310d178f048c3f34b7ec91fd132e02206cbec89154cee6b01a5a062e75a7d7ef5e435e258f8173517d9c93e611b5aa09032102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a91984528078da07c39af230d966ecfa33124d9d",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46d010000007fc9e944dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd50100000032d28935bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9401000000353048d30172b24c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487ee4b014d\", \"prevouts\": [\"17883d0000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\", \"4e40240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c40a6f000000000022512026ecbdce513e5cfeb779eb6a118aa90fae67510c7ee9bff64af6ca27f9068c2e\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_2\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7ac11bb78f6874d82c97842aab9a20959d7ae4d83df2dd8a8858170678c05f0a8378d25abc8e73105705cb5ad5c9227f9427f8789caed1c4be27f0587bd643a9\", \"cc26a8dfd73130266b06a6a47254e04953432f4decbaf8e28dfb7203c052c76cc5a66c1d8a9a2db33603831ec0a0a84cb1cf7e35d6ca1c61f38765c15f9f21071e5580ac3af5545267773a0024d487ff0be757055c80d3fdfe97c5950f521910ef12c3850392c121da12b15ccce7e329a98fce1597ec9d6008e17b\", \"4cdc07df07fcb3cf785b22ee27afa90728be120f1ac0a2e769f9272c5edf1fb6ce565a0d422a5371039e21c90d6a96379b3c7b115df2ef9cf3c5dfbbff451a8fc49af5e71a097a063fc5fc0e51954038d4ed83b0b917dedff39b353d16332f6c73ea87c2f17d34ee0ee448bc6281ff38f3ed58a92492f6b27bb4cf8134330a59c4387fe0b42aaa77ba10cd6f18c32b7c54ab11e4614a22ff211af1109af450ab8c9b2aeada03ba8fe470a7f6eaf870dd19a9dc98d7b9234e3dbfcb78a62b17b380128fb56fd93d7c1a731626a031f70f1eed6975bee3211391cdd52df9736d0442c4413251646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360aea55674e4a11d078f591c1d921a5492b3bb1be59c0888480755169b7cb15871b7d6818b35e0ea957fad9863835d6347f8f6d9876df5968ca112bcfbceea191949498aa0661d911fbb3348dbcbac453fdebadc4dcd6e311c35c7a5ebf5bbb8bb3920587ebbb9fabc18b7b5c766e9cc9224f8e189e96604be4f961e6da30e1098ad20ddb8bada843816d8e39090b6f68402c2f42ed7e4ff2296393411067a3cc738678ade87a0f60fdc733941515cba8985a82e53060b8d87ae1337100ca868b8dcd092bea6f9e0ab4424f42e6b521eb0ab30e23651fe2bdd8792a11b70c0811ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9e78b7ff580b9714966e7b7b3f9ed004f3990177fddb99b669445d7c1658bdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ede07d4dc7a6bbc7633f9636c3cae9c9db2a0684350bd4065f892a977c68dfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000008da7e7fc95bdfb9802fa80d920249c2a040024a29c3d7028418946dfb418b33cde545c1438d0372e217a29e61fbda9bfe166556b40c8ff5588f9b2f8951784a711ce63ac71f4b06b9613a79e6108a6e59a2aea5a02d73ed398ca5f6873371ae4cfb0fd2388ef534f0ba1d41d6104a73537cbfae9352c0718fc697592e7056a5ae684870c35202af39cbe0f4d3dc2f44bfb95cab676962ba44b0db6f5e781031ec272ff862a0c809875f9bab87ecc81f2b0576517f3a9963117b503365b64c7a55bde9dafd590f07e9bd8096ae18426952cd7a6a5d90d1b22eb178eb948f93f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1c57eb9ca01b12caf07c899b2156122922d93e5c05d7b2583e362d173f8e6b01f8d0016d6aba064b8a962d3b2a6c67418815cda9f1d614693aa3e7d82d1106256c5c857024d5dd604cdce5349cce83df62f353eb06e19c5bbad5b461003943ddcd02d97acded234e511f7ef67a86668958c36c395c197a567f77189a2ae0968fc69c3c29c8c0dc361e29f35fb38537a07141885ef9c8697bb4a755b3f65b4fa700000000000000000000000000000000000000000000000000000000000000000c50e512d885169807860ecb1359e927f1d3026393c57dc608c349a7d92d1fbaccbdea492e545c2e9487711bbf6956b889bc74fff183d4785aa28a26b0a090ccb028567c5aee05ea6e1fe0f29ad1629fd5a2489f448148363c89c91b1e16b35a4e95a2bb7d8dc76b9baf117c4390e476b7284bd4af1eae0050ccb46aadf905a5a6952d7b6ddcd40ee4770ddf66cc91abe733ec79bb7da150cd579f6e34ae438c\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7ac11bb78f6874d82c97842aab9a20959d7ae4d83df2dd8a8858170678c05f0a8378d25abc8e73105705cb5ad5c9227f9427f8789caed1c4be27f0587bd643a9\", \"9f5d8529c066da90b7c26740035edfa3f15481590570e26e07f4158bf395ae2191251d82f3146488e7c8007b9e6eb88624b0ae7e7bbd405f68db4c3d5bb83bde7148f38acde11f5ab33c3fbcd2636b5725dbd640c658d4851759f78cdb87fcfd0ba9fe8a8b60c793223322fb7cbed449668946433b2663810ebc\", \"4cdc07df07fcb3cf785b22ee27afa90728be120f1ac0a2e769f9272c5edf1fb6ce565a0d422a5371039e21c90d6a96379b3c7b115df2ef9cf3c5dfbbff451a8fc49af5e71a097a063fc5fc0e51954038d4ed83b0b917dedff39b353d16332f6c73ea87c2f17d34ee0ee448bc6281ff38f3ed58a92492f6b27bb4cf8134330a59c4387fe0b42aaa77ba10cd6f18c32b7c54ab11e4614a22ff211af1109af450ab8c9b2aeada03ba8fe470a7f6eaf870dd19a9dc98d7b9234e3dbfcb78a62b17b380128fb56fd93d7c1a731626a031f70f1eed6975bee3211391cdd52df9736d0442c4413251646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360aea55674e4a11d078f591c1d921a5492b3bb1be59c0888480755169b7cb15871b7d6818b35e0ea957fad9863835d6347f8f6d9876df5968ca112bcfbceea191949498aa0661d911fbb3348dbcbac453fdebadc4dcd6e311c35c7a5ebf5bbb8bb3920587ebbb9fabc18b7b5c766e9cc9224f8e189e96604be4f961e6da30e1098ad20ddb8bada843816d8e39090b6f68402c2f42ed7e4ff2296393411067a3cc738678ade87a0f60fdc733941515cba8985a82e53060b8d87ae1337100ca868b8dcd092bea6f9e0ab4424f42e6b521eb0ab30e23651fe2bdd8792a11b70c0811ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9e78b7ff580b9714966e7b7b3f9ed004f3990177fddb99b669445d7c1658bdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ede07d4dc7a6bbc7633f9636c3cae9c9db2a0684350bd4065f892a977c68dfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000008da7e7fc95bdfb9802fa80d920249c2a040024a29c3d7028418946dfb418b33cde545c1438d0372e217a29e61fbda9bfe166556b40c8ff5588f9b2f8951784a711ce63ac71f4b06b9613a79e6108a6e59a2aea5a02d73ed398ca5f6873371ae4cfb0fd2388ef534f0ba1d41d6104a73537cbfae9352c0718fc697592e7056a5ae684870c35202af39cbe0f4d3dc2f44bfb95cab676962ba44b0db6f5e781031ec272ff862a0c809875f9bab87ecc81f2b0576517f3a9963117b503365b64c7a55bde9dafd590f07e9bd8096ae18426952cd7a6a5d90d1b22eb178eb948f93f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1c57eb9ca01b12caf07c899b2156122922d93e5c05d7b2583e362d173f8e6b01f8d0016d6aba064b8a962d3b2a6c67418815cda9f1d614693aa3e7d82d1106256c5c857024d5dd604cdce5349cce83df62f353eb06e19c5bbad5b461003943ddcd02d97acded234e511f7ef67a86668958c36c395c197a567f77189a2ae0968fc69c3c29c8c0dc361e29f35fb38537a07141885ef9c8697bb4a755b3f65b4fa700000000000000000000000000000000000000000000000000000000000000000c50e512d885169807860ecb1359e927f1d3026393c57dc608c349a7d92d1fbaccbdea492e545c2e9487711bbf6956b889bc74fff183d4785aa28a26b0a090ccb028567c5aee05ea6e1fe0f29ad1629fd5a2489f448148363c89c91b1e16b35a4e95a2bb7d8dc76b9baf117c4390e476b7284bd4af1eae0050ccb46aadf905a5a6952d7b6ddcd40ee4770ddf66cc91abe733ec79bb7da150cd579f6e34ae438c\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a98e2c1c0077687fbc9166f61a386e4a7023ae4f",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa200000000fb3d70f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49f010000007d25f0a80274e4bc00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8783ce9f30\", \"prevouts\": [\"3ff27c000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\", \"638142000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"6f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361835f9abe9a741de0e36f4900df38cc6cd8be0480d341e9b7353c9d58c608762796126e2d69a152489172163b4bb3b76a5285668b37fe09a10764d2324ee4a01a6ef766bda57b4717926485a86d332fc460fd2733e6a54825f17015621dd4290\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936702c3c7c1f1da03c8b27f2bc575737070d61786cccc09f33c0640d21457e29b546c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa250e9882e2e133b56af40caa5e77ecf964d6e28c7a51ea626a8db4d1e1f7bbb4a3f8f9fe88f0f431b5ffad473abfcf1c4b340e1c7daa1232bf4c86f035b8cc51\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a99032acc713604176f8d95263865e2c6dd015fe",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c330100000072fc8e80dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c83000000003e0d57f5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1d01000000594c5146046d9223010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79661010000\", \"prevouts\": [\"bb6c5900000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\", \"aa9357000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\", \"edbe740000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"dc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362be2eeb3e4370d4c69f7ce59bd76cde59e3fcce79660aa43abb7ce9c746ff5cf86395c8bc923896e22972506a7f348d4e1ec7a5bf3aa363c117ffaeeeab3b8c4ad29df8a0e62e4f40897f8996914b12118c918ca2851b639742aeab01f587290\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936622093dee6774f07419f4929649c97094c7480c0dfd32637f9af19a1dbf7f73a7ec7f48ddb853ff8ec7c3ca68869c312ba33903dcdb15647a5295c052617846c86395c8bc923896e22972506a7f348d4e1ec7a5bf3aa363c117ffaeeeab3b8c4ad29df8a0e62e4f40897f8996914b12118c918ca2851b639742aeab01f587290\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a9b04af95ae95e9a60941ab351fb387c007938a2",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41a0100000058adf9d98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bc01000000feafeba002c3807700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac0756be2a\", \"prevouts\": [\"75b6380000000000225120d632d9c3807cee2f3b07918ef684335c8e7823a1a0eb476eaf46267e076b018f\", \"472441000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"7e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93601763a9a2ad9de81aacd638dcfd4fda3d0aea4cfecb2218c942c0044c1357ce3e4e9bfb46536bdbe14fd1969523d98350611f9c0fc6236e31514e2d43f59e146f2e4a14a40b0acbe20218e44481fe6660f01d2e0cf04e3bc8d4452bacd1080d1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e846c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fab95efb91d04564594d9dcf752eb8fd975bf01996a0bb9f9eb7163324924bcd44fa5d068ae686a8bb1ac9947127542ac866077ad522de57cab26ce701d52bc951\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a9b58c8a3ebf4f2c3c8af6242b20c43aa733d6c5",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf101000000673c277b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4370100000035cb6dc58bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45d0000000023dea660014dee30000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47879c010000\", \"prevouts\": [\"f5ff280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0bce3600000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"67f0410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_53\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bca52a308ea9cc503e4a56e8b76ba72a2c7527ab3924670a2699ac00f6041665e818cff9fd2719ee27efc7e67e9c6856e37e102a7beb5dcdb7b99eabade779e481\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"290bbd2e84cad0d8171e4e2ec772ae058e958508d478b4ab0e067ffe5d835bab3ae40149ec150f8524a0e6bec7ccb6559acd0cefd987a5796d13fc69eb2ff4ac53\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/a9b81c4e5e52ddeed6c3bb9ecb2f67d7e056eb1f",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41700000000818fa90adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0101000000f46e8321024948840000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e784621a3f\", \"prevouts\": [\"e47a390000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\", \"b2b14d000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ada\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936908709641cf32dc4788f906f7e3621a0528df09509ddf1e9982e4479aa4b5d9a3ad7647dae649c97c815eebecc244cfd5d14ac6da92e0e18049c71625e2af9496ad20bb4e3465af36c086d3f45ee510bb6828f8cbf764ea9958c57f38670043d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936868af79d4708fca6e37519c0f8ad1a0e8e0651f5b156ad2621a5318cd7dee94748d61d9b48b1fd3c9dcc7ce9fbab23c91d7bbaaf6610449bdfa8b9a4fdaeae22ee4d75780d36bffae9b56136e6d27c02b8d233efdc800bb260bfbba6a6f94b87\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aa0024897deb20273f4fad0f856967621953d402",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf330000000056a475b2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cba01000000746cca94dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cca00000000ed67c018043edd1c0100000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88accb010000\", \"prevouts\": [\"e2be7c000000000017a91441ce0eb0e6e5800ced23a872818e5aaa63be0d5b87\", \"3be74d00000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\", \"38fe530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"bb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bfcd38c1da080d9fa5f350ac5c5d82a433c6ad7048f1837ebebe4defa9773a5a1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900454c3d251f378473e49463283b18fa00944324abf75c7e60d6956acdb0e7ed03a7354ad806189ae64381d3b11a94f516f6d81b0c787d08b0f0aee4f0e917017ea5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936597c2f6b8dc6d15eebfc9ce9773556a5675730a3f06ef70be75161d60adb64d2d0e13bd92b8f417e9a9e83db8f63381783cc5b261abc3d56b5d515d800102f0ba4b6f827e9c7b2c56d61f57ac31f0aa4c5b637b7f763b3a1a4d37c3a7fd6ec38\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aa0d4dde043c88d76ca0b51949f90e102187198f",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700d020000005955ac21bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1301000000b41584b4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b35000000009f42a30602486899000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c5b9435a\", \"prevouts\": [\"ac30110000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\", \"f49e6700000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"7202230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09029545fea06d348ae6624e1c2545fcbe83430063ce13acf465f55bc5faa1aea3fed5cb34f9ce734f5a4a81dfe9eaf2248afdb4ecd223722b2ffdc4d03248d66d4bbbac76d42a70beeac94857f31fc0166892df72f77f49ae5a78767f167bf772a07a98afc46e36d0f4dd741d2b87523cca6458395d28d36deaca72107dd8fa7e0af8b420a4b899cf33240a23064276c0d372e29e7230ad2b12494eefd73a419631e61fbb49e04eb223f37cad74107b23211effae45b6849633cf216aabd66bfc3a5b50ac3ac2dd3b22f771b325d66925bafeb593e88f713496661a176a4a85746825c515740c2b33412a4d74b13140d21d5e8a87458f445aab6440494d3094be25ea54febfc54cf69eeef18371a038f9eb716869bae6fc137c73226a047c1104e35aa1f3f9d105bd449a269463808b6bf981f1bbc60efc8970511d196f9c90e037f5bbdcc666c7bfc1ed19a601d5913a7f20c7bf23e0bb8502f692c4a81103006e17dd4c362810bf502d2481f23c01f8e2041d5a8ca9f4574038fe017f6e150a7f4c78a4d26a307089889ccbb8708de6036650a93c08c111a909f6111fece4378dc1221238b62f3e5549ff7b6aa4e63dd6d4130a02089ed4140a8cc67abdf444afe386004387cddec22d41aa5aac473a048b3800d83d2257ce979d902daa1de78c4601ecfe3491c8a34fc9d8c21471920ccd56cb264941bd8c4469556ca493e4217bd7a545599ec5fb9d75\", \"a37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363dfa57dfd82955cb3c2f71f4cd7fb6c8829916a42fdf422289d8c886c1cea6eeeebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7accae923b25d556389dd5dd645f6d7ddd89a07a74a73dddd3d85d7b65ae33798aa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902debded4a128c081b897dfd50e79e5486cdfb87ce58f88de1fd8f4f02a9ecb27266f07a777b3ee1b67a766762b74c012fddd109cacd3e5311980d75e7cd6da8273afcb0f3410ed974b15d8dbafe36e803e13b8f941c22a6f8614f9bd7c13f64be931fd0ea5354a2a8a811539ee67109132977911e190246cdbd1e115505040435a3b29fbd9b70962b63d1027acd470f4e3e7130d40199f33dbb3c573f9552cab23d6b62915f2d6025efc03a3fa33fd5813afb58bd7213dc18dd824f48c8163c780030929e8787cd59e5e450e941d754f6045abfde62d5156bea8836d65500cf3f275641c27b2b4133483d416648aa6585b52d356d253ad5c6e165efe27a92b6ec86354ae8f54bae78d17abd8661f0b98ce0962d1d045714b6f073a8c924920e2d6d491ba7abad2c6e4c963995849ac03e0a898555ccdee86fcc12883053c218807da5aa7a0362ea2bc979bfd6deb633d49c186d26d269c7ae93790a7549068fcb3f98cdbecf914222223191a6d2b533bd008e2b55ac2ba5c1c8732b7aef037aca22a72bb983e3a1619b3f90f4eea9763fb28addf281c344ba1399cc71a2be4917ced7062f3a14fd2749dfbc71a300f1958b45a9f12c33e541e5ad3fcecfe4aae2d655cd7d4496fd6d48e524076a95a4f2039900a5276b402e15c7b68ab40fb1a8e73749be8010d265d33f2f5ec482a4710c3231adaa72554b42228224a2c046303b129f76043d355f5275\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8842663f27fdccb53374929a05698df7a3618af6b1227ea033500411481dec31ed2054b94cb6efba565738f5dbf6ee5a67458962b65d77e1cf5e0d2c1c00b2210\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aa17922f64ff7cd6d4aeb56bfab8af47218a86d1",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44601000000379174ae60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700c01000000bc09d7fa046db3400000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f877d020000\", \"prevouts\": [\"b65e310000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"60391200000000002251201dfb228dec79c6e234b1139c58dcf8de3e24a7459acbe9e029f267c6e1783b9a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09022ae802224670715d13146496fbec411ba7cd021183576a4da576c5e7df6afab0e2f7703d5bba5162b779161bb33b72d459e59b56a14229a279dfd58a2810cb209257ded4c8140ddfd2634db4d14b135aa8019c3d6cb0aae2e98d268e32ab9acf75400928e12a21e0b0e8f021e96bb09b34a4c89503846f206ce34b90e3e85e103c5797dd74e8f22d334752a2767540a28dc4de88ed0b7ac8632706da8d65b935ad71017de5ae2ae86ac5ba0551827f67f53bfc0bad7c4f96952b4330b2a06d020dd03ce89234d5bcc9c71cd7d55bf23ccaacd1d4fde6c846a5a6be88f630a2ebf5f2d823c82d312a3ff8a4e4f581ac7bf187fc1362f46d8cddd7181e9115dc30f85f963aedf354e2d412a4a8410835b34b28748e75f6faf6acaca5c56aecb03b334d10b5aff219dace3883518ee582fd1e83f218cd77005514ef6d4ceb3a16011e71f692dfde80bc81769f7f37a057451e56e8e43264c3d173a32b01a92bea68fcb6384846449d4b56e3cc476417b4c957cb776c2dd2351e23910349b344decdeba6c7a25fdb7e9fa85012e2fd8b99d313a99ca393408d4b8aa353361a4d017fb3ad97caadd1cbd3adb7aec97014ac8a7c8d23e16853815477748aa8d1cc1f6b7d1bb294fbdead603fed042e5de6cdd5b98d5b785e7fb0f3c4e61f307981c225c2523aef15fdd34ef8c83c27f9820a647b03c687b1b5a379fcd1a4491de9bd9551a7bfb434fca6fd1c75\", \"627d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93656d54f472826838e1a603c388c018d7e2c442e320e1b9fe79e87cbf43c9b1b239fadf8666e14892eeb42c4caff758b4cfca6e22c4a95966045c21c8e48555a5679949ec80dae58a557a09f1025b3e427a5f07bf4ca030ef1ccb63f0b9143cb03815577f72abc2219d93608f0bf386debaad95a87d0f429ecb808b0f22f69367f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090222c733a1aff26dafa63fb9768f3d0600fafadacad8057e99bf90d3f1f37eeffdfb09e59697c521f0e4803e05e56f9f3f798e039bb7da0fcfe460ba1332e9a22d9e3403fcea2ac1e215fc559e6a81afe356daf73a0e77505772e64c54f5a26ffc157e9c31735412eacf8e39643689b78e0c741348f09f8a5dad152a621664273cea665cc13e9ff35717f2631522d971dabbde3a54a0dd0b09870955ef1d2de98d44881b7a5c776b604a9cbf7fa6a4504e4f1b624b1f1f59e74ed52ce83ac1c30aeb69102b1038a662d802d3efec0aae30eed412e2533607cee148ef37970c5662fcccbeb035f867498fe57329e18c038c1cc51ed5e1ff60a95aa69e048a32d985bf7dee6599cbdedd8783cf3e8085eb29438a36dca688beac460e8a3631c143e593e545f87af6f2a324e5c3644f10fd6a334db07b1dfd9802bc0d7accfd24cd6f02d0c051d34018db2955993017f1cc32b87ece0dda6aaa49f9658120956b80510d0f06f1a5323ee6903bfe1990182f31ee270b96765e6433ef695d7a4f002d07236daa1f6efa67b190f8b1499f4df76485518b2fac4f906d0e63d3eb0fdd57e5b37539a89243ae7707a66964b1e90ef41d61a69928e73e447fdd0b4819e77c5c292111b9de58026936e505a38746f15013a7ed2893e71d427ffa9c9a7b22c0ab2a827f2cfa5701ead6202ef29a060c05380aea813c122cde0ed0cf9ff1b75e70ed8c02de4036e0c67e75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936054631cbd4c23a7a986551177d2d547e6cd133349cfae470f4b00878641ba0dd79949ec80dae58a557a09f1025b3e427a5f07bf4ca030ef1ccb63f0b9143cb03815577f72abc2219d93608f0bf386debaad95a87d0f429ecb808b0f22f69367f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aa376ce844fe5f3d69f1047c99cbef99e732dbdd",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd20000000060f33779dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b70000000001ed470278bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ab00000000c60fe4de03dd71ba000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987a6000000\", \"prevouts\": [\"e3725e000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\", \"5044260000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\", \"2a20380000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"017d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ae3d185db005c09585d5b0f947903fc32969987416884748fade3bb438b9cd79d7f8ee1a917297df4869582a1b348cabbff1db4a1952fbd39d89a346cd02d0a88810a2a55ef559e3dd2f859359930339f67e2de31eeac841179b888fd41fd8a3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c9328a947efdcbc124cee070bf3f4cbfd90ae8e6a9d27cdf09ac9715c089de0e54ce7cc5f439b597f56fd9de2c1657ae9d64eb6e71f5398fcdfdc60a0bc251e633479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4ae05873438be84f92d1402d5d55e9fb409fe52800aaeb5db180b239b834bc1ca2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aa471973e1dc517ae959d5706167622da05bab46",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1b020000001b786e618bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ea01000000fb510c0860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700f020000007a80c8d8019ead11000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d2de3b4b\", \"prevouts\": [\"ab2348000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"bb733b0000000000225120c52c9d5db69f3d85ee35b65e5555252fc0470ab9a3dcbb72267f75438b29b283\", \"885a110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/emptypk/checksigverify\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1693bfe5b28d435d17ac23e9b193024d3c7a1ed0f364352c5b0b607a3b33ce903f5cab3637a41d6f22164e60b2d7a0a2a6b804a1219c1bf3da94471784ed8ec2\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d2db232a58a684473efffe5f8be15c17374986169cf18c1adb110b544d48679b6f3543d66dd2934a4b4b5b83f3181725b5ccb68f1096ac62351c7c97bd1fb9501b8110e709da1864e3fbcb3b5249515c34bb807e7a52bfe6718950e769cad388c56ff404b78dc0a0b90d50115d89846b94a2b0a1f0895318a364e3dc179dd61f9b1e0d638a311a5be1486a7a4c42f89ed43ffd1d5b18820f631006aab35c0b2a02b593180c53027b35b862cc29f04a25efce114c7682377a83dbcf64f6fe42598064c72ae707f2b03b7d69f3c0306a0bb5edc9aa2d90aecbb96bd412d5b1ee8f00d68262204427d46410b755bc31a6012df0b06b921e6cd021b936d3d4c99eead90212921e1142bda8cb81c5ff3145b34391c40797432570ad9a88a0958a1b955fe09784706370c5f6fd13c48513ab6cc16af1e04504ea44462b93ae24aca3b2228a833ef2c51accd6ee09327b5cb9ad2975d597ee135bfef0964473e20f824ec199d2a72d3d5f5ff6ee974913584144656ddfc893ea617971c4925fe8b7e1c4f556906203221bddfee6deb7780e80a3769637a05bcf2efe708f1aaa4a6ffdc17363486d1e033637af9f6d28292a4f4527a2090bfcb5efca2ed9c0d63c01e16c98b35f150399876b232678a58bf83578dbb2c055ad176d56177c4ac303846e798f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fbfad8d835135af4001e59862b3e17fa552904e0a0ce2e872868206be76519ca1dbdfa700541b0b064ebd20e3cf5be2043d83d3b780e4ff926f91b48c65ec35d\", \"00ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367b37f9cba90643389dcb84f8bb3d7354cace0c9189961587fd423479e33fe4bca7f7bc4310acf33ff6106d71eeafb5e618c06787526c83b3a4f243d9848205cbcd98a80529c2a931358c54a01926483afd2817144d11587481c84348a7a5d142851dee7e8956e7989ef1b2310726d24273d46cfad50082ad927e9fc98f9c143d160fce98e5a349b93a878297fe66e998ee720c75d1643072843d75bdb4b18b12adcdd58f284ab1c59b498a19651ff144478d4b0b5a2922bd70cb075f336fe9f4b68777d0bbd7b6c4a577c7fea562e9f4fea2126efe76f3d0ad98be5dbd6871c94c0000d45126f851620d2066634add2abef2580dc803514e3ba652e78e482b6135b10babe6957670b3c4aa2c76f4112b74affc1af435c8383e13a10ccc3e8ee7052652d5467ddd2e384b678ffc365e66fbacf63a4fbd01922cf714b18ee68a4e383d323036182d3162529448348339fc9acae0372091043e56911cb51e390ea725dd19e02d4685ba017b89767b5c8376f6b66370e3202d9e807c9c5b06b99c098acfa6a9da80a755a207eb5a3ad02b1a2cff248af93ddec122a727b43b9e8dbb8b2911ad5a3c4781fcdc9458446cd8039a7a21ad2b04a0c05bedfec6a225c83df68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aa56f625476b200e65ada22557c871b0993ff86e",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb70100000009c40cc18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43f01000000a76706c2046e9aa400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a61f296e39\", \"prevouts\": [\"7e7f6f00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"395737000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a6e961960920036299d1290338b03b5fc0897f2d1c8c4c30f54431f2f0ee319875bc139b944cf1f8d9ed8319ee656276635441c9dbef5e9eb4c61f0ceb683bead4fef1ce24aa15771c39819008f8fd2690127aca0aec153183e70aed34d15336657496d8b13d384313b7ad283ed3b4c5292d6b176114427cb3fe829cf130dd77ff5f11ce3c672c5977051de6c6a7ff55f64183600a82656c96402e98f961e727d93b5b34d8a32d796071d788cb1cdd6212e6740bc003f6f33e7d9fe189815f33aca8ca32c35197fb65562669c2f1466fc27a7d78f4f20b43ee3d8c20d2f51bb8ed6fd203c7097b3920f0598a07b8b2c6661bcba2c61971974c50fa88cdb7f9e3cca427ce61eeb88980b1af88ddb9bc121fa6f908ea9ac784f19b1662dc862cc789f31c0a8d92d90549c9b192c2362c668fab700dc9a744fb8645fca7e66ceecf523df27c017b001039084cfcaecc4f3fc957e37f26464b7f1957cfa1f0edb6396eb9b9dedc5eeaa59a3a122e1f80b60fa77c78d5052ed476e8aaf910094db652d41955f9cf148b476fb1824cdef660d8cf66ddd57d946b6048cc8265bcbfba522e74d42a6a4914cb35ab6f6847adc7f2e3d1d18593dd7cba6c11770d319856183767c77754ecbc734c40e5dff8e8bd104f69e5ee5720ab801718227155131d9815497d51632d3ce862793423863967c90f8f6bc2773de8f88f40a79608b4498abcb7514cd35c01455075c3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51073db8fdd32dfd70cc3c0b801d057b12e5f9f3471dc2e8803f572b477b94c5e2cd8777bf679e716871b092f46e3a69645e6fd098b2f58cf3078cdf1926d6f261\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902cbc5aa41643b6c51d7b13a9a3ec2bfd5cfef5cf0f3ff575c817e8be58f2ae4c07c71c6c5f7ab6b78f7bf50065c5abaad1147d417d090fd16f5174d56dd97fdce6603cf36ca929f3968b77b7f426e8d579011b3a783f4b31ac9c5b9f4c962e1242a6556b375cf9a2ecb331bc7a301bdf245e5476ab1a4beffe73294404c26866f596e282869777c6f3c62c1b2822fc667ed42ce32b806135cceef6abf45611f2a4a006e4031cce851779b65ebca91f456dfe34a2bb391143b7c31cfb8bfd36287e20d3a94cb2f5f477b69e87af3d7dd7848be6204645f04db752f36d664591e4ef3786f81153ea3048528ed9e68117b1c8b58dce4652d3de1a2df1ee51926b7e8e33f84e1deee0283c4b990c33b3cc2fda057ec41d1514476141bf012876f160c355b16772e2a83f2cd8edfe491bdf73a428c68cd94412ee12e20dc5927891912b633ba5733ceb498c516289af39d6c593fa32147b7b0e218e55257ee9eb03b74a779b09a4cd5b5f6e5121ad6f2bf75bc453dcb608a6031004eb57c61dee83442533c82f90a664f3d4b2192d666df4b2c3ee7e328b80a6eb6e5dcba7eae4303ce1719fff7f71a3e67bf8a4645c38706af0bb1b40a117000314b63cb1e637f0e8e9fb529d56d1797acf1427771672099e42403357ea9603774cb05a16c54bde721e45fb61d2967c17cfbdb6a88b921e4021e047e39e4fb918fe3d240c9049cabe43c84280d89e439aa9b7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368a346b8ad70cbb62328f229bdbc3f197dc64b80564f2ec5a0a874aa96f70b3c11ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900457cb9328b065f9eb1f6f110e9fe7273590c885552330e2c3269c2432845ee2744cd8777bf679e716871b092f46e3a69645e6fd098b2f58cf3078cdf1926d6f261\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aa76c2e6c5a061d0580802966b8efb8804164d68",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8600000000ce2f9983dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4601000000204160840467558b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487ba17e93a\", \"prevouts\": [\"35af690000000000225120a283e1ea0142d34d03fade4b28902cd262d82bab6ae3891658a9596d967dbc43\", \"468324000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"617d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93695bb8d2654824dd3955526038f4022aa362c37fc7f85a8eff2e4eedc1db354e88a99f3582d6399c0406dfe65dca998a5ce57b7e950df5f64352e1bbf6c7fd210dd304186c0a2faa80f59261766b0cb9b0760b78eb1f31f166a6f091ab62e6898\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820063b43826002dc6eba62f224851f0eabb14759fb10c707a6afd7fdb59e93aad3ab6b2d4691bf881316931c587f0a213fdb9026021e80f212e72f88982a6bfdc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aa8eac8fb7ebd4e613d8bdbce660665b3f45fa66",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127076010000009e98a7e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb70000000033ac90db0331e2690000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f878995083a\", \"prevouts\": [\"2bc7120000000000165a142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"e0b558000000000017a914d574841bde7bf0817694c799002118e85acf040e87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"dff0006548d0260c0a1dac0892042eb1e23b110b81a12e1d068876601929ed6ac8749a22e15e624632b52257c2a704abf274f6d805aee49c4b3668b32f2efa00\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aaa6693d92f9027513267fd416bd6201171873ac",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6c0000000082abd590dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf4000000001ad7dbb460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e60000000013b495130186bf0800000000001600149d38710eb90e420b159c7a9263994c88e6810bc720b41b44\", \"prevouts\": [\"0cc849000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\", \"fc1a5d000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\", \"703713000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b9cd8a3131493f9a38a21fcb48f1eba7224ac37029eebe06423782cc0227356a6b70b7a62b5c5e0df92365fb7d59f0bc38341b3d2e340457f550b81c2c042a2c34a04a5098447f4e0398dc0c9a2c4efe1278fc77be1b3d48003403aba1647b18fc8d6c1b07c83ef33d2e4f6f549d1e37a8a4712f5ca3077e4083fa19c096182fca0777e37589bc4580da08a05badd8730bf744c4992f5d50e09f508d744d3513fb4e219b36b5ea7738b1ce4f855932bb3cd87cca3066cba6663ed3ed25149aa013897acd25ecca7572fb466e83e2d0415c9aa6966072bbc72d7844a948a578a8976593b24a6e318433ee35188a12037ebdcde58e40c27745aba9875db31d97a2aeac76c4b49722ec8240b2872409a8d41addcf54646c31b8d758151ca431e11c12c94691ab0602ed63ca4ad0063aa269fe92180628d9157ea1002bf9b04e1f21dc77542cbf93670541053b0bf2da4be5bc2f9d6889574141d15acf183bbaff9c7a1ed845136486d7fb708d3b0a870067113d93f5add14823d7100e62015364b60d46996ab563139069663a27841b7c812d0ffcd69a36da0def4988ef89f3b1c62ed27eb39541e747e402b7e8e5f2fe1dcb115faeb28d7377ef2fa157886512f57ce8d8b63ba8b5143e91ecdfd7fd135f6cd352193fd910e2e5862c998bc956034e841142c6e231b382418c0a92e44b1607b80179d30c8ec5c9b07fac7a31d3f64bcfb5911377e71b8c75f6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b6ced9e64c6943ac670763abd5f717e15a7508527424507437b13b7c3de1f72e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082bc80a3081e946651089c17942e2d2b7e0a2ba8b51162f8e9c4f29cb18d1603310a1b6150087d660153f154c744da46b7319b80aea4f8e08f23015968f3b1d87a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09027b619195d54a4b56dd9a65e2f82bfc8d9d39dcac3973f228597b598b7df306aaac130870a83828d085d2549a149f97652604785dde1d37c687e5cdf29a17a451e9508c624ef75818fda145e62fb23a47b08e7fd9e3dcf4a5c057100a538e921018a9e7debbdc364607738d22378455479e577cfa3773e4927726f5f970ee2e997b0f3a3c164ae45811306ee93ae2c497f2545e1a79cb2152d86e301c5d1e5c8c0b902c947459a5fc6c4a739b24d0e30bf52551399f845b1c725b79c7855ec8dcd89f922110407a7da6c9d5b46d7969a30175eb0c7136836b07ad23e95fc81e2e986046449b8b329da5a258e48cc7e4dd33a3efbc0e06b56526247c092476ce3028951cb9a34d52564d73d4d0c0b743e0a6a639b1e1a974f4e83b231e396a0425b27ca5dae555f94bf4efd7746634fe26e5d0548127abfc8dcc0adf24d0e81053ea6eae37e394c59715aff0dbbdc8f97bde90611aca3e800942b5cd785a5b66b2579b7e411b6932c9a0c8be3be66a6641d3ef79d2a8366d7f6ad1d0089bd0692ddd33c68edf3116ecfd7fe8a102a994fae2f118fc0d91b7dda468b006ac2ec69415e943885310b20ac51e9d25f9ef762465517e59663e005681eb1d6e9fec63d30a27cb9f676c366582b265362bc58968b589fd07640f66feaa137072f8746f423fef594e7d975069aaa83a158219014be0a4610228c4cec86a5d4b4dcb07f7c17cc2eb55036f4e8df77561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936de506355e3cf60ace4cef323af6093f7f8acc431ceedff9be89b34e31adfa37dab836f202d3609bf617cb7b4b7700532182ae3d2e1a09e3b3f38346196fd93b669cfd1883d9d94906422bb83623918edcd109683f826bcbf676882b31fdcf44192fb5cf2427ede6d61c8a74b8487764d962b41d4db4b67b9e943a724e86dc0ff\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aab859864bc25e0a7b430273941b291f2b765ba7",
    "content": "{\"tx\": \"d2300b08028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40302000000f7c3138fdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4401000000dfa691ce01a7032d00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac6b020000\", \"prevouts\": [\"21ae390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"358e5700000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_b2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7be32c72334b10d1ceb87f1628d69a055e362ae6399e8f3caea7734554d7f404b806c40f527deec4f936d3c3f5efd89b95f0dca8aa6719bcb3288cc2bc952919\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"30a2af13cb5dbb0192b2e4c32f4677c39f56879e7f39ab9adbf9bb63179d2bd9d9de71928a380b53e028f4d5c145f2971c94f0bba6058422bd827c7da9c47063b2\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ab1a9283d7a85a42aff52d1937193ca27a794187",
    "content": "{\"tx\": \"d21e6dcb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44801000000e3a0c5abdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c52000000009db4d7d80252268f000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5a61c420\", \"prevouts\": [\"4d7d41000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"c9354f000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/checksigaddoversize\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"46fb23060054e2ae7f44f744498642d34576a50319d408c31a9aa40c4754fdacf7d8505910d566fd902d1b2824351e39b6bc737e3534c9c12b5f54a0fab7df02\", \"04ffffff7f20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93682419aa8d327067d95b4d536ebda455395190dd39e18c03232c492cd77bbf5c60655563be430965c12747e751ecddd5d613c326da0f298b6d45d5546ff9dd2ae4b9207f7f22c04ad05799130349bf7a540cf626b5f0a6721ec598560e06bc37c524a194b587849a62681eb9ecfc58471f5db76a054ad222105d6bb4a3b31f73358dcad47cba8e25f74a6437445fae536d2fc98c7487c1d21b3cfb5f5da8b0c2c7f51ab2403311907e0e6eefb69db0ea9627a1f736af8b880d64776e77cdcfad0db33a6bcee22afe78593b06e3e9eba900a802e002bc410d58121b00203e38fcafd9c9a4a65bf2c3535fb687f4d013bfbc8370da866330e8ae0a289930d67ad7eadec89f6dd5d95ee9482e5d679fc9b2ac5b5f79305e9bc53f8e44773a97b7da7b264c52f17389da701e27ebeb344ec2483d6d2fbd801b12beb3b02b8a807d69e5f8f1ecf0284d5344845e5c6781a87f37142204f7c9741aa330acd0daa91ff9e2b619b683119747c3df61c0924a6b44488817af04f06674d926c898b0b6db546464e05bf50edce7b1f5ca81822687132cf7d30ed84f6dc8ca7e183a338d302e00ae160e990742032df386ec8547eb181c0d102fa876c1cd80d9ef530fa1c065d2e5262a94fc3ddd3fb5606be458b593782b16d00ce4762d13e98a6ec8488c560f68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c022a9962f27b65ba8ab2636af9f7be02b206ba5ecfc1ab6808cf5e49bfff897137a29532a6e74f6a941c57403777143643f7996349946723e8231eb1d52b7d9\", \"05000000800020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367ca373a9284d9516d65ca57d42aeefe677abc27971d99a0e576ea3e033f0e37e18e226a88f8de1ffdbf8653e5e5c99d8ed6854f82ec6180716e498db4090bc6632eca1c10f6e29adacebae9c18d35728cfda46eaa96261d129acdc4b9e453cdf8e00a42427634156bf48aae55d12e65b2b6cdc4abb92f4ff102785641e1ad0d5b12d8443b4b548fc10604f059128cc28d89f7aec36eeec0a36f070495d2024be6b4d9c782523004c55b59cdfe76d2b17eaca8dbca1786e586c09b966ccead252fef997c426d9e949c5a3515b5e0042d45e4be44351c6f149d4fc020759a6f4b0d67374e7caf20322e7084d9546ded12af1d1c5a4e1ba9f0c95d59cab087df6e422f503472e6304a227f15c06c4bf90b77a0576afae68bfe51800240c398f7b74c3dfc6c9c46ba420c22a4b23a6e73e8909bd27f9a6cc2eba3b71442d590039c84de8a0e517ca4f4c263b0ab1b11f7cea6a468382fed8b4a21a3e6c2259e4be3735e9e781db25a304cb2b703fb372b5fb8e69d12880f4d83920da47a594e16bf0d7b8ad7363e0a6ef78402a031bc0a044f5a7e6c01a5c111176c74efd8c6d7787a57b391dd67ba025b9a60505ecd7fa3b5ed0808730285af9f495e709e1f92ab88b2911ad5a3c4781fcdc9458446cd8039a7a21ad2b04a0c05bedfec6a225c83df68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ab3899ee5c2ed560ae6beb77e71e4950fc17aab3",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45401000000823bfdc18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4180000000071fce1b204401f74000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac97050000\", \"prevouts\": [\"167039000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\", \"9eb03c0000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902afaedba19cb07ec09801623e11075a7ababb418ea1b7c72a87ff84ab94884be0ff71ed539686fb926a5a8e18f3a529710f152f7d75586ce74c16f7e698a04d7a3d5e9087794f38ba5c142d6f8703d3e92545eb79478f909ff27933cea4e107c57b944b4db8c28397be2b62a24f2524c9f4c6ebb62120e65fe3dc54311b573f267932dd23a179b51486ee3df1e2efbe176d93e1172f177ae1d00b1a7475cf9ba06799a9546950496f3cf8baff20ee660d0d98a1cc31e98561a5a9ee018a8907d9ada2957a91a98b742d80904e4005615c403b06e184d52d32f08b96c2f0307b2a79d73843c4ce0cad81c21bc936ccf777a00362ed5c2295b49b2809ee15b4def6a493a3c64afa02ee7322a0a56a8717faf742b7b28b56b7cd0f2138dec6498799576554f5d387c9c3a7ba8e33d8305d529b585bad9121620ac4011e603a3ff94524fb1be6d6cabaec1c188f7012b2fc728b1ee92dba8f4a6fb43d02ec841f4be3bbb291319987fce484e11b500d1acbf8d553e9aed556ff6fd17a88477066a25f6556f2af28c147aca567d34b33ae17105192dcdda8f1b6c96748662bc8428da0c4bee1616c2197215c7aaed62894bbb43c2fb5bad3831052d055aa2e2d78a1c6d23445e27cbad83fdbfd86558fe8d46ab871212c2cf82232477640c01c3673b305d891992dfa26d73e696e928fd355da5437211f6d15d6107b9d8c1e6ffabc4dadb6dd682fdc95c93975\", \"5c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936747197b798ab967e07c108f007a4e907b9ac872703c3a06a0173ecb6d9f2921e0ebd37c9b7767cfa75ada9a6605680756deb542ec34cf1dc29d9c7b172412f3174e87bfb4d3d415907d7a3196832fc57be4f6d746253c89a46e8e4c968740366e8f45a3ac55dff4b7d62b0bc42204f13e92c55212ff162d480a58edc7717abc8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ee4099c1b8af946c46ded066c6a996103ea2900a9f9448f7f9ce44826a2467b76235b369763273f90a1dc0261df39f8e85940c155532f372907c8b28317344624df52d38fe54f1205efb313d927a1e234ae6ac3096ec247636bcb7b9af082a4d4492758599673e4dbe94decb5bd6d9637926ee909d9904218632c4197de102d5844db217b68ebecd3d7bb48d853e4f1fea6d07fce5877a82f29a195e9f1e656b77281cefd2808215ec157cd56aae00592212c9f3ab650cf372d69091d0a1a34fb1403bab22c1a0e15305c413f789c2a01cd21b660565fa5ba9f75471a261dc0e9a629a43a8ca651d93c6c74023526c2998068a6cd19fe7ffc8d2764f9a275694cc0df97438e287f01c4a2fae01c0ff148438b698bd2f19ff0319a8e5d9d7cc9402b8c1890b0b8aba1e0a8c6eb8e8a9806942a862035e8d1453dcd13d402423284b5d563a9ddf71e6d8facd5a5455c07a86e876aa9dd53b998df32cdb78605ec8ead49f9e0c7a3a80270d7e10aed5fbb3b40b9780343427efdb4223d694e52cb95db932e52ccb040530a601c6c25dcdf6cfa488f77d370767b8533180399b98d41e3369af4ec7f28a4bb419e3ddcafbcd604cfee6733dfa23992659ff75375e8f38dc16ab6ffa42551da4dce6e787055ffde5e33c8c2c1ce58c07096cb7c3f1578a32daa5183e727e9827d1978f58d854651a2c3dd6bdb6880dff44a5e4e906457513f70aed30da9e5175\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e24e037abdf69c22f44b0c591ad93651f749184eaa819a8a63a5d4092bdddfb78f243c72f4e074898aab8058b3c73fee97ec3b9723e213834a8398e97170c1356\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ab3bd8d93632f274ea33e6bac92fec9215c4f20f",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba0010000003f954bf360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706501000000f7025ddc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ec00000000d17f70eb03851b6d000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3a773856\", \"prevouts\": [\"90ed1e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6154110000000000225120685f1f4d981f8d279e9288f3fac3f130840e4486d97e094876558f7ee35a7d24\", \"1f353f000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"304402201ea9793149473141599ef76aaa580bd98f5b76a3c859ee25a8cadc4e20593e4d0220393b8c9b051abf0f4bd2a9c2662964b9b2c836899d7f97cc0926c0642a090a1aa0\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"3045022100ef3fb4bcebbdc0847da0040badbfdcb28262eca9e90b23e6a5e8cf61c38f13f802201c199cc72e1c3cf48228ddd38daf02350e3e9b159d24ad5f025fe475b74c86eba0\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ab3f300e2417c10f0eedeee88f719e82892e53a2",
    "content": "{\"tx\": \"dfd2e9c702dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3201000000e75193c860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c6000000003e731e9f04828f2e00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7eae9964a\", \"prevouts\": [\"f48f21000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"b6d40f0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f04c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045ad7df43f1383df9f0df0a1e0ce133acd14e2258cbe9a702da78bb61f4d1a9bc80eb43d08761fb76661299d0344fd2d8bfc7de5e7c6dc622156e95971f4b8396db5b66a7e788d7f4d892aefa7b705b94e6e3402f32316550d3b683ba5e55fe37e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52f0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936276aee05659d89654db507d09a750387aefafff0901ff8ece8a28a5fdcfac69a8e2168769c1e98187b117731eccdce651c542044ebcbbccf53ba5dcae5773e361c2a3c32f2d98482ccc0ae7bd6919d8eb72134d3589ab943a0402c8a931ea420419704ddfd13dc63b1b4156372563d65f148a89e112fdd9cbf47f8afee5da0a9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ab5267db0c03e93e08f51b597821900db93ae75c",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c00020000002b7885eb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e50100000052310cfd02d0af62000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac12010000\", \"prevouts\": [\"b53f550000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\", \"eed40f0000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"847d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e83f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08276735f386d1a4700f0e60fd19c47be953169b4ae01039887cebf253884ac2528c568c76d6b344a062dd798f6575db1f1731d6a7ca3f2682e7e1b801cd94d3826\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369b280e7b0e172100b660b30f153c20cd729b6a3e92d21f97d20774fbf01245e83f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08276735f386d1a4700f0e60fd19c47be953169b4ae01039887cebf253884ac2528c568c76d6b344a062dd798f6575db1f1731d6a7ca3f2682e7e1b801cd94d3826\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ab8bd300852ee0d05f0c8d476f4205347466c6e3",
    "content": "{\"tx\": \"487bef7002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1002000000de8b8aa4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c69010000002054ea8402c7f0a4000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87a505741e\", \"prevouts\": [\"b4c85d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1ac8480000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364dc685ecbd8fbb467f50be3541444cace52e2a96f82f6e3a97ffe7c20b40a1e235701ef224ad20174d0190f97f9f6d3f23a41bbc27fc82fd96c9e1fc2f7b2cb81ef28805a30acff873fd9260c6b3bfee2b626467fb0ce04f716d513a8a4b08b6f288028cdab461d62f9273620b97315e6e9af9458f777a616c1bade2d3f6a89e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366f183944a14618fc7fe9ceade0f58e43a19d3c3b179ea6c43c29616413b6971c1fd87b85adb72b018dc8118730af51fe2e1fc2345a45c291032ad5ea0f36db09afcaf82673e7b509fa61dcb6f9390da3a7ce1e18401449d1277235bd9d9c04d9a72d00f85eae87f4cc31996f158484f267a3b4b9a04e006b9a1cff5c0be2781e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ab8ffe370320d075a8c7b9daefaf545d29b7ac1b",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc10100000045d79042bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf650000000093c03899033fb4c3000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac0a030000\", \"prevouts\": [\"9f9c520000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"0ae7730000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fb4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d514c1cf5ffa00c6c7050afc353617823cd679ab4db6c6aacae1c16f62a2980653852b51aac478484d8a075e848b67a41ce9b347e1249fa49816f898b909a6d4bd5c77e07a04f832bf80fe1e45fa6237ff98bc90e935546ee680c041b2556eaccab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93658233aaee0e6be68e94a661d667ba26ec53439df00cf64033a82f3558122bc08006cb24f353cfca0d245645f6b16ad599c212098eee86bd01fc37c5c4a863127c77e07a04f832bf80fe1e45fa6237ff98bc90e935546ee680c041b2556eaccab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ab9b4c72f3a16b2e16d40652ec33ca2a8ee4d3ef",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f9000000002952ca0e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703501000000ec13486101dbaf04000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487ebb0ca47\", \"prevouts\": [\"2b700e000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\", \"1417110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"cc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa45716b950e27a233a501a90011450809f321d0f7541cd1975fe5718ce8e53406ec1da8cea892037e805a477afbb54b1f5ec380954f076c0bcd3c4e3d4797a8d6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eaf68f276ddb4c0fc7f0310a620a2f1f9fe6c0e4e29d0e280a559099e56625bc6391effb841e4c3f4ca92b599bc572f2bc6440711e20bdc5ba4fc353379105b198f95dbc4edc81931664a748b39a9978dd32dedaf5c850114f6bd2f5098c050fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ab9c711cf8bbafb6cdfd30f945bfcb03cf0272b6",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9600000000431e98c960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127048000000008ede57ff04e6946e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df979722368987ddbdc542\", \"prevouts\": [\"320f5d00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"6a0f130000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"47304402202a8ba61e58c9d7ba6cbcd346ef5c7351f9d2a0bdb7ef7c857111135bdcfeefca022040b7385d8f2a8df68fd527196e4d88138c4bf01b4c160db908b51928b563838d8100\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402201914b8fb7b2ef0ca7b231c5ddc350f2d53699dea6c0d9b369e58590e81a6ba270220552b7f1712a4d9a2439b70adeae3fd9cde34be3c36392e53b111590d0bf757bc810101\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ac0b35cbd93f63ed7452d6acebde72ca9fcc3d81",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4160200000022cbc59f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700c0200000019f988b38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46e00000000d2570be0027ad87c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc70deadc2a\", \"prevouts\": [\"d5b6320000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\", \"59ad12000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\", \"5152390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"867d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936926f2b50f3fbd9ffe22dc41af4426bcb82a03b8aad9cfd0cba46d108de7a4ac73ac108bed01ff7a3c4482bdb9637a0c08eda3eca9d378124f08be0fd1593c53eb98f84b0d7d6fcb38bca0562970da4fa4ac9189daad947902c07179846baca90\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3f28332fff4e521a34f62a6094c9ca083df763bc212ee1a103146f1ea11bafd96b069f256e7b53185a64c953a8831f99a2248244dec917c9fc219bffc52b204f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ac2088d883a0a84ac9d499824adcbd32f90b53c8",
    "content": "{\"tx\": \"bc10ab850360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e20100000056ca8ef0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd500000000f9c6cbc3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfc0000000042284be90453929600000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e73aa04c47\", \"prevouts\": [\"1d5b110000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"dc1d28000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"74b25e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"797d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364c421c3900c3463ef8c952c4f696eeb0bc35e56e2135d4a2e925409c37853bd90793fbcba16d5416bd6f0933503ffe6704f239223875a49be11ed5869ee331b55be39dc57762be2d9b1a04aa5b570805d23104bfe4fa54c392bda5d51f7f4540\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bed135788b70ac7e03f21dc901124d8cbfe8ea126f939efbc4c5594a61331086b1663b8b45656caee420ee834d80103f5ad80f9c4de199ff6879db0155217f4eccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f45727aec9530f4cf05d3554e63105b96634da39f3c52c35c251ce860693e97320b3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ac3cd67c26d777875eeebe2e90c716e8bd592ff4",
    "content": "{\"tx\": \"324e93d202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9a010000002b5640d48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fd00000000938fb6ab03c0a05f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88aca2c5a437\", \"prevouts\": [\"7def240000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"57833c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8d\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93698751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d593f37adfd687dc0da405a76cf860eea33b50edba83aa9aefe64ccc08331b86a062cab3a6172a7c832406474b8da3677455d75595a690190458c84d19d8a3ecc3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004529493e63f0262db246dc905ef3bca459233a7269b5efdd4093c0b189ca3e559193f37adfd687dc0da405a76cf860eea33b50edba83aa9aefe64ccc08331b86a062cab3a6172a7c832406474b8da3677455d75595a690190458c84d19d8a3ecc3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ac93b3ca2d9c1ec6e07725af461ea07bb19c4dee",
    "content": "{\"tx\": \"bbfdf13103dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba801000000044ebdc3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba3010000006ee87db8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0700000000b29ebcbf04633b6a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc791357b23\", \"prevouts\": [\"55991f0000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"bf142400000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\", \"5a22280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"ab7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082a05ea26d8201abb1a5c146c7fb3e541bebd813f78d5cb214a01f0b6fbe6f45888cb303569f28fbe8acbcc2d27d183e3a68170f5392df28f40a03efea695d856e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363cf3c913a0d0151d6af78c78da1c827a410891daf294851874f6597f4ed324381084d1aecbe4c7880bb8a882fc35fa9ebdfb0d7259cb873bd54dfc151a0965e70144ecbe7fb1e6c18f5b14cfe26e6e35ca66fe7cdb676ad740673ee849f6d44e7c07bb1aa10d02d314eb70c923196d0e49e71087637e2d5a1d7fe44c2440c398\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/acef576be556d6720814253fa450ffd2684c3c7b",
    "content": "{\"tx\": \"9b03967e038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40201000000116593bcdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c30000000008140a59460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bc010000003f8a038f03ce439b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a61f020000\", \"prevouts\": [\"fa123a000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\", \"d8a45300000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"95390f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"844c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51120199479ee6d2d4c88363683365d3fc0e890ec8511afbf0335c75bda2c0295827135a2a7712dc4ffb0f490ef0a9e18994dae8053f69b06dfd6a349e2375b7df7644b3dbe2d9311c88339dffa1c0be80a46778a5837645266f0e84452a246701\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5284\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362266a7dcf41e8820204b3c7c313a73998dbb7a25b9b7d0a8551836cbdc8e1fb771f92e1336a687ea436697fbd19181210e765b944dc821397d885c783bf2f2425e521f6248097fdc64ff5a0a6cea9e07e7c649e93dab8ac6058acbfaf1ad70aa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/acf314897698e9e208634f10df880184d9a7754d",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1d00000000065a48888bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f300000000cb7a9eb304fff3a800000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac0c020000\", \"prevouts\": [\"f03a7100000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\", \"75223a0000000000225120cf3d4a21d95f409285a815c665903ee1793a8187aefd3a8003cd262b63069349\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368d303776f49134788675b6d5b8e7b8eaed975f4d3e59d9f0e5d87dd448448e55\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a1c616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ad1589197b44cb0c659b26869de6c66b103e9682",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d901000000d5ab22dfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf98000000009e40c06902500e8f000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796b4d1895d\", \"prevouts\": [\"8fbe0f00000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\", \"f80a8200000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"30440220789eb29595867f82396e51d5c7d9f29952c0fc4f15adcd99147964726678e0ac02201e539d06a9b8036bbdc86fae321b6e02c6617bb2cbad6db08de13a2250b29af931\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3044022078042c6547ef7114819b28d5f39cd7658f2774d195dde461f784474718bad9b002200fbc52b8cd87a8ceeb47da23e70f33fcc7ad67c4716828202877590f7b5f6b0831\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ad16650f9e472fb459eb487a9f883c894760b565",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b56010000001507ac2fdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c880100000047f521e4028cc57200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914719f78084af863e000acd618ba76df9797223689874a000000\", \"prevouts\": [\"8ab320000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"3c7654000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"867d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364703c1194851d3d768ad1a24962dbcbbc112958428edbb9508a4568f63128e38ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f4576b069f256e7b53185a64c953a8831f99a2248244dec917c9fc219bffc52b204f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d95cb9e4ba0f14f7a61daff0d77db36648450ca2d57fdcf621c9e46ecaedc2ea0adedab43a8ab423f9b5916bd9a862eb4f524e14c7176baa6699ffba0690b6e8b98f84b0d7d6fcb38bca0562970da4fa4ac9189daad947902c07179846baca90\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ad382a856cee976ed155aa5fae9828cd059ccb26",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0d02000000f8d073b0039dd41c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac60040000\", \"prevouts\": [\"1fc51e00000000002251209c5a589e416b2bf8d886ac38373c12ee12085629030d3f34ed2b7cf34700cf85\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"107d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082dad4d220d15ec254ba214a445cc73922794d5f92559e27b8850a422e98de131f09630471a62c8657382c38b342878f0042beb3ba209e0ca1417f9db2e3d45f6dbd940ade039b405c8439b762bfbc73f9441ef227e6f687b6d94ebcbac32155c7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365814385e7aeaada39c80cac3230b4e4d86779350f7373f36ef6f8a954e148cf2da7506a3091a1e28dfc5b9aac4646748f840add9c91a317c4120c5f1dff96d2e4520b5ceb13d27db1b37ec8ee9ee9482aafd08fc62c5401b1fb7c7b4ff374c3d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ad4069abc0712cf1f3c8508b699379282bbf556a",
    "content": "{\"tx\": \"c44943fd0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705e01000000f83269838bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40f01000000d07eb1f80331d14800000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc15bca94a\", \"prevouts\": [\"76f80f0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"dad43a0000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"954c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93629aff60e439a9718fb9441d494108642f29be2d6809c2540641ffb56ffbcae4b3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082adc7c8b3bda8f17728820267d55a41d559bf30f92e294931cb4fa644579829c4d4a2033150a39b6917f88ea297b4f989401264ea3eb8667a511a69e57850c639\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5295\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51aab45d9ee0154589058109bae8be3e72a724d93a0656d7cd013110f238c03b0975c046d699a38e7801f010fab6b697cc237a48311758c02bc29e281a6d7a682eab0b669047babd6208c97c1428e12fb9e633b2b0d2e51b7853d96a7caae1fe0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ad58a3216af0b6f002972233963f6be39c7aee60",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c21010000000ae3668c60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127048010000008de810588bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40d00000000fa4dd06f0403f6a000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47870d92972e\", \"prevouts\": [\"96975b000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\", \"3597120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"cab1350000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_6f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2c040c7778bcc65cda8395e7ae062e13853bcb5c861388366263d03fb307317c58e8b78d598290d629d0b6548b9661d177061b7e80254969222349ae5df948c182\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9e5716207969a18ac4adbec99a101d03e1ba3a535a4364a8c32eaeac0eacc6d165d0a3f344bb31e5f81ea744d1d6c571a71687eb566b5820f8ea73fc2420b9ba6f\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ad67e4cfbdacd913d6561d8fe08f456a4341a88b",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2c010000006700468d60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701b02000000de835db602815d6100000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6f3010000\", \"prevouts\": [\"61ec530000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"4ef50f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"de4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365d68cd89157a1768344d3693d5ddb5d4f8008c6471ee21a81a3a4b68d16bfcc31823ff0d5c6a769fa09e08a59a2485b611e1511239bba2f80aba2b92be945f1b811034f174cb7bd77652d345f06878a8d4eb3ae1b92590cd10e2563bf228d2d6bf82ba79f2fbafe67448595b33026800f76a879cdfc27419c1eb96837433fbad\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361a24f92e0fd66692248020bc486fd34464c8d03dbe31b3b0085981632dac5adc23dda11617dc042479e1d576056805c31872018ddbd603e5e1ceb926e90a3395bf82ba79f2fbafe67448595b33026800f76a879cdfc27419c1eb96837433fbad\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ad705acdd20e8da3a2171681cbf04df9fa98a3f7",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42e00000000888dc23702e4e4350000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df97972236898796acf448\", \"prevouts\": [\"37be370000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936305e2bbfe940f420c214662e3966ca6ecb30394037d73a78f87c1b0a0c14e367fe052270a8089f5fc5ef9a63e8f4df43751c17d276a547e2cd275b71d0b6242a8fd238d2decf6f7142c55252dfef824eea080278838d8f4f1f0f617cfe47b5d91029910a453e765cd82c29c3b576a90579a453f3a941b6b6175fa922e9a13196\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93679da927ebea46a5f8996fbcb41ba1476306b8185e9784cfd3fab60be6d7447790aae41afa256ed506dae95e698e8dcc0fa26e2618e50e74a83d05bcf51ab890d620a19fd562e5ef578d66d29c84f34a4223ab3b995d34ad300c7b5f252d5e140\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ad8af6e7441c7a1e3628b69f1ca22b74068a2278",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce7000000003197a88edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cea01000000b341e2960409599100000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6e0000000\", \"prevouts\": [\"745348000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\", \"f5084c000000000017a9146db815d9819f256ca5d1e70b15558a98689cc52e87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"483045022100dc4a0c1f7116c24b0267bae3735ef4ec04fe060b1f6d55e8cd232c392db401f80220028f4991338f75df258163fa70a9db009594955c8ef0a5c0a16b3649ac74e511914104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402201c3ef58e787111c074aa64c7937924c0b1155bd0992253ea0bba254a2bfbb0ff022070aebb6d8f372d8c4b663071ea6afa00b43368c5f2ae9d18dc618f1479442644914104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ad9cdf2ad4d35e3f1e5279c581d0394ae2aa6972",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6601000000e283ae2e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46f0000000047eb5b7102ce5f95000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787a9020000\", \"prevouts\": [\"5f6c5f0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a\", \"3359380000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_e7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1aa95253650cc6d00a356588dd7da7ad3c29b203f2fdcf5a6d4de877c86da7e9e8ac7bc37a62561e1aa29ebbac1f18727b3a450ed56b7a80b0b6d2d784941b6d81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"df05766cc097f87d57410e983792f6d30a26c2826ec54429c66c18e4f06c78c8e34cbb0bb7305a27314f3367022214517487177d0e352b55b2542bfb9f33225ae7\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ada6178e8321efd51626a855bc6e5557d68ca3fa",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfeb0000000068aa1af660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c0000000003ed329820294e97f00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48725bbbd2a\", \"prevouts\": [\"f0006f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"da2e1300000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_4f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"51f2527e40f3c83d875e342791e5296256ff69e845f8b18d97625782c0af94569a38aeab1ce7071a24bb4016880bce1da4c5d26de354f211e2b35a9fa131d8f6\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"41b2d8cc2138842cedc7d45cb864c1005bbb1cb097d5eb3de46e6317324293e56cddd227fea706548bbf66400a2f7b32d0dd31f015fa97fc1951ec5410f313444f\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/add98ecf3dbbc875a84ca24db0f18c054af38335",
    "content": "{\"tx\": \"007958d602dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9e010000000160a5b4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2302000000b9f715cc01b1a3b900000000001600149d38710eb90e420b159c7a9263994c88e6810bc7a5020000\", \"prevouts\": [\"8ce35f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"47386e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_11\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3b5d6864aa8b433301841fc85ddbcf12ebb46b666238eb0b881222149f7d4dd5ecc0f416bb1e1abc3971ca0cd951af99ce876f5a95fab1dbaf84fe06464aced982\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5358641b54d1ac74d8e48e6e15852693d4ddb9e024818b3d2811c9f082f0a380f2bc49f761b727fd1e0450912cd5c0fe81f243c703f85f401c2d458686f60a7511\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ade2c248d7512985cd0840191f643e986e49db2e",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa200000000fb3d70f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49f010000007d25f0a80274e4bc00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8783ce9f30\", \"prevouts\": [\"3ff27c000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\", \"638142000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082380f015d033fe7faead4766c682a770029d5c79030785f2d26c440da4ef071fea3aa70c847d82166fa4c32b27cb78dba1a5c77b2d4b8269442df723c9129fb762c347795cbfd24b3bfff0bc05cfe1b5e01afc0104c4d9fbef2a45c75fa918ca8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367abd407fa50d9a42f4099c8eac0d1d23fd0b10ba46053f4def08af2f64e6c099e0a7be32fdcca7a506e9ce249f658cc089bc7a3d23614d55e872a83e7956fea4416efa3a61de7db58e4e5b27e55eab88df01883130071a88e8c07ccbf4e37c61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aded7ddfdd7ffa25f49bad4502033ca4a8591786",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40e00000000fb7b46b8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb201000000c6e24f480102291f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac1932c947\", \"prevouts\": [\"d42f3f000000000017a914a2a8d85df2f20a0aaff7224012fc4cee13e29cb987\", \"219e2000000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"b47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e2e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fd7e736a60655dc533a38837433a3a305c9a2d5b0314030c91796018120c3e9a44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fad5b4f8de6a475e1475ecf0ed158bd12476ce010b28dce6527e02a32226fe48562e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fd7e736a60655dc533a38837433a3a305c9a2d5b0314030c91796018120c3e9a44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/adf617416382c5deb595144ff94dce09117c3181",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c60000000077e8b85d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e6000000009e49a865016e35600000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb9000000\", \"prevouts\": [\"2580370000000000235e212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"0ca03a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_8b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cf64ee3a79e442811f63b0ffe23daef785a9ecdb87cf959732eb729e831c4655faa61e8523d42834c141936cd0335f189bfea17fe510969612697f84875633a5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8a0d36835b26f9d683f3d9c19b3d4eeab7dd4d637e2a3638c71f10745d71bcd3e2f5ff33ee2e9b226970d0d07930cf49ca4aaedcfd90816e50fe0af79389e3168a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/adfe9ae4df4e249a66eb91fd2f8b26ee063e6f76",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c00100000051c121fa60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703b00000000d8839a9a038a522100000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4874c59263f\", \"prevouts\": [\"e94a12000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\", \"eafe1000000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"3b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89a1daf2fbdc5eba8a219f1f8635fe45cf0e30925345452464a53096773d109ba7ef84fce916674b46359d0327d7b56c183d26d6053da1b16053a1f90da8a1d4e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369517bd2ec6e222f593b12487f5a7b1eaee696b6e0fbcce419bd0b390383a361246c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fafc7fa9328de6285e10958c6b3d6f5d3c073b4c582e31cb42904dcf82d4bed78a29f15cefa9911251712bcf83078e1db490f7db40c14a26e0e577f39f7cfaf11f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ae32aa63248b35fca6503c67fb4fd2acf15a98ad",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc400000000722b13ffdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1101000000ea73819702fc8940000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f872fbbd44a\", \"prevouts\": [\"04a720000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"b70022000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090255a68059051d49dc036a91ceae241a396273c034f022db6a818141bf265dc30c5201cb46753304681691b9649f09da7741a7b64c377e606fb3856414454f237ecadadac897ba1fc4b311aa512b072fe017e284a2890e2496dac58d38f87105bdefc99d683fb855f817d799b305d9b16884b20d0d38dd1ad8ed26f885533b19a0fc60a17da9a28bee8ec2836d2ef863fce90fc5e892dbb95d9e75ebe39de2568b6aa42c26140a779198ecca7bea5cbe76f87ff0d508e6b81e7c21cbf275526ae9a1d2036d1e3ec75ceb5874c5c2566d614224d944ffe7fe9ed70e9ab34c04f186861021e4d43f2010e0bf7865491c460cf014dbb672dbd60984f30bd7441f48eb5c9a14dde7c48925034fe695622ffe1939929c06357f1d9543b449f2624258c4c7356d987120e3e2bd149a41000202e6c96eb12be79e085762ffff999a96a03609e6387abddca33e4699f3470ed89d55a68c3be9690f50ff10d119b316d81163d2c0aa6151c66e1571e3934fc44257e996f4aed98683f43efadf64d039c8a0ba36ed3feeb6ac2ca131c344aa4faef408e4133cacc2101c354e17fc6c90fdde4122aefc8b4db4906ba621cfda6c80dc9bb27978127e0ee088522436cbf1cfb0e53e161dbc0360e60d20047ec17ebdf1b2e2098e08f9d57c0d35c434647fafaf33be22884bd403059003e627e72e9942afb2cd0a76f5d4a245fbd46c8f7da8ccb52465774f7635bd211275fd\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c6f6cfa678e6eb5d7c16d1e165dff8cc02eb6f9167a730e645b4ae310f8d0f8feaef31cbfe48887fad20fb93d6cf3134c2cce06fe301c1f80fb34276495816473effc93d9a59775ec6af4eadc6f66e855123af6e736654ec63572366f38b17272c347795cbfd24b3bfff0bc05cfe1b5e01afc0104c4d9fbef2a45c75fa918ca8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902320bd827e6f25766fbb1643379276937e6ba22a5479e7f7ee5a2a62c12daf809326a5c1cd95a8377784ca82184e72ca5d80324d673d8cd14d377f3731a59b5120fe4f94c096eef8a217cbc9491a47d0e16db08b50326954b1c47fd6cad8db16547c520d10be8850430302a25b54aca05b69d86f1012258a7357d541d0ac3b7f14ae5e7aa4cff2ee59abe7308a166d54692f84e78fa4e735a054a570410c2f7517444008bf5581761801bd93fc3a32c00d2087792f0bced0098fe0505549310bb449450f45f500b3f7601c118ccc3864fdb35ee06004ac141019fd21a21a4c2db18be26840e267f066016cff913a31931240896195d0e1662a0f0f335c8e864cdc97c2f4bb18eab43888c4935b89def484de71b370e8644c2d290698e8071656b88f6ad173268780c6eed6d034c055c2c772e5260bd44693f98cbe8b182b915c1dd50ef469637b5293f73c696aa0edf86c62729f158e32304a27ed0af0317e2d88135f44fd8292b45f12285a76e040574efffb387b75f7466ee3f98a066b0249c0b4db882b5dd8956400ee89656c363b8b0f116b94d80576711c3d8134f6475f3511a1d7bfae37b31fc3a22412ed184c2d85d6241e2f0a97e6ef8b04bc81f028a06f4128db6fc57397ccf2ea40b32ba1593b52e4121986cbf415d9e98e6537bf876bf78a516ffbfb04e739cfb3c04c1e021240d62fae3e9f4c14bb9e4c798d105394d8e6bbebb82b00d7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93639d1288aac8e3de47a92a81d83162e567702fa83ce81d1d7859f59a963fb0a5beaef31cbfe48887fad20fb93d6cf3134c2cce06fe301c1f80fb34276495816473effc93d9a59775ec6af4eadc6f66e855123af6e736654ec63572366f38b17272c347795cbfd24b3bfff0bc05cfe1b5e01afc0104c4d9fbef2a45c75fa918ca8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ae87ecd86f7053ab8d71a8f1fc84c2d2c62b472b",
    "content": "{\"tx\": \"ddd1479b0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702c010000000c199496bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfca01000000ce7dd895015e5252000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a67e020000\", \"prevouts\": [\"67df110000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"ce3d7e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ad\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"052a73ca708259b3bb65de74ce0515e7e734dfd1339562a3812ccecdeeb095a984282b16d81ff7add38ab390de4607eb3034eb9ab6f4d70b93289b972533a91601\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0f8931209156bc3f0ee8b5ac577dcfe8d80b7ec008817e6ecd5de0b6e3e36efc5095c83f795e94962897556aab4651fbc5b68067ff269dda82d8345b8cb8545dad\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ae887143b966f102e6e5967f76ea3c041af92e65",
    "content": "{\"tx\": \"7c5fc7c8028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cd0100000043a3c7eedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0f00000000209d439903a82a8c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e763020000\", \"prevouts\": [\"4cba380000000000165c142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"d2fc540000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"6b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e8a2960a95becb1bbbe0636e0493c58f712af9b8da417013d797bf12c130ac56070886d9e3726a9aa8a2b94454683b5181a970edd894e0d0cd75aad09f75436b2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e85c9148ab8fb2f0e3b60c30486bc2998c5a9fcff153a4260746061263c245b36a70886d9e3726a9aa8a2b94454683b5181a970edd894e0d0cd75aad09f75436b2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aea2776fad1a4341ceaff3aa6cf21d9c37587a96",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6400000000d6c56a950144091e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acf3010000\", \"prevouts\": [\"53272400000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100e9e465b25b90ec4eae268ef097fb812ce90072ac31c7776933d00f87ccc3f12902206810ed43604b92f161ddee0e83dbbe0e744a39104b412b51700cf83ee01df40e81\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100d9a904875514a7aa3e65f5a9d3352506fb833af39f699af134638e442793aaa30220507ca95fdf22ed259e4735b46cc6aee4cd83fe6b3edc21e565430d2b47ea4a8d81\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aeabf0753dee7e4de87a4ffe6e1414931333b32a",
    "content": "{\"tx\": \"8bbbb434028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f7010000001a4f028560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a5010000007c0d8cd903a9a243000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc79e010000\", \"prevouts\": [\"bcb73500000000002251201aac33169e9e7c3154d6a008d33b220a63d8a9ebf4646c8ee915f75ae7529b5f\", \"7f111000000000002254202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_1\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d2f9ec4434fc2ac4979f7c04e488493ee4ea63447b7ef13a368a98518994a09256a7f90bdda1dffcf99431017cbd3b64005e647ca38c1a5f20c2829a59ff0b8d\", \"9dea30801666942bc30596a757b6eee144dfd44d4c2fa2b4471d057e67f6cfe38909b4b9c2bc868c14ace2c9b5be461ec6ade41dee10002b767c43ddb633baffdfdf4a3b6df3d8069cc2a57155a738abe04e94623cdac78fb96cf500bf09aa551e7906323cba85c438510d0049f947176fb882854178c62fa905bff7a383111004eca216edc79741f93dbd6ec96799cf1282960d7798bd20376ae8ab15ad3609171f0170f27e527d494ddaf368d75e37f0dfe153be1c3d7fe30e4079f5507694ea5900acfefaf1aa478cdfd5\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2000636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1c7bac8717a1f08a6b77c9fbb718269890891be6758928f5cb3459153ae0de08ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000830922897e89e68c07e04de6d130a27a5a951f6b1aea2d24f385224743fe4c81ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff694a2fed14c09c6754383f2742dfe418030d1e2c2b2d9cadf387b2a0b16a674cbfc87899f716171e154af0bccbf57f58c200423513fd20280e4271c015ce23d2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0764280133642a0ed4b654cc75dfadf1e378ce8acdcbe1f4a0f7a47f7d20191c0efc8634b965b6826569b65bbffd03219f5c4d8456855a0953aedfad181fda86acd927010d9a5ae3a537588717dfae67083c7634f11bb0d744d4721be4cb0020ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded0dcf006e86da3002739810e9ad712096942420be48d9757cd65133947cc3bcd0d4f9505d2e403cffef6a6039352eddbf9a714198b1bfa01d247685e1772482d1417f69a2838888e3a6dd70ac5912ee50ff90eb582cda45050b26021e94bfc0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fcdf3e831ff2a692396b71aeceaa5752edf7d64553043662bdb2d035fb6f12effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a1ef1c2c5ab25bc5f00c54aa521540a4bc5a22373dd3145d69f7b626b451135f26739ad8b291a182ebf937d453bffaf5086c66dbd78a4243f5b0af19440d010062781e17adece575d184c126c5da260c183814a1f67c6a33283d2fba36defc93cc2de204cb8a81ef1684806085128d0ce219fdc369074a7dc46fbdda93dab33200000000000000000000000000000000000000000000000000000000000000003a87f62c494f2a95168b096362df7318617c6cb887ad731b45580133eed928454594baebe8131bde06413f226e83bb09c3151fda212ed80d12bee7005552e1a1217f6beed3ebf104cc984d6e6da46579dd5abd1429d4d2f47aca227449caeb7efbd6af6b3c830949083609f210edf4ec0010a880f769894781ee19f6adb76794e00f658893eedf5989891add29f45acfe46abab84de632ecce600a81f7679979ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa85a8a68199b26ce7c96d456241b7d90151eb88ab81514a583104294333511af701c01f1e0d14775ed14889ed08edd4ff91ff3f0e0fdbf97d8de74ccce18be1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045fb260a6bc61047b69ef16e0cc4bb8ee88d9aeae61c1a066039634dea89385dc54d401b29ad7fdac3595fec3fd4df95bed63a5a08c9d98d8e153add63b22a2a0000000000000000000000000000000000000000000000000000000000000000b235ad0219ada7c0df38535235f11fa8135fa1542de32c2085f2897fdf4955ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff68725897865e09ad9e12163864a1fdc5a83a32b6c064f95c1c8a9a36a897f7db75cc6f29cf10b949d2cc7cb57622633bc213ea5e692ce3d44657d8c5c707c5ba31b43609c459b7b7901f80f51492bc95378fb3f51f4333f40890d02bf8835b8292c971f13f0e411919275c65512e9c41d69d3146f117cac27a17ca58231b69b30524b4ded2a7a7bb414a6358cf90604f43cd149d2ee54f056f74e93731c4e526e4344c442186c15590dab0b903a653a642f61d736b49f9482ec326949b95d911000000000000000000000000000000000000000000000000000000000000000095710be98c313fc8abfe4dbe5e065e2e4c224318d84f1d0db7c7c3096588aeff9ff0b86d8a356851e3ee9cb426803a2b8ba4eed715f6804f35175197f9887261a569e2ef4d3895e1a175463355399ec2cd499b34c4977fccb1eb2faa5ac1effc61847e55807b96fe13424e8c3436e556c18ec0bff5018646dd1187dc4baf8afa39e6897e52e177ccd3cda3515910c5a85e4cf5360d6a6a91df37cd69e6c474f1057f7a6dff52f81da94d713d78d8e2a7302de7af2a79eaf7dea0841eb2eb46f431791a44b0a9f0111d1748d1b61a8e0359989ee9d0ff21d3b86129d7211f658c51446878c7085bf068c96163382f5d1e38130a4cf5390fe250df3257ed33f6a073f59ee9a2f14d32e113351088b0fe1afe58ad0c33793836685ef598c5b421780fe98e94eaa9bd32f02ad5d46c507f9d47d4e5df03244f5162f84934b75e6cd8f6525ca88eb66d3294a6b8d93267d4765ffb34ae1aeaa56683eca4eed616eefd625e750326639c16c7742950cea1f7d372481df0a88a1bbe8b8f0514d20d379fcf0c142b16cc6ab3cd60840e65406333199e12f456259f1390a1a79e87cf247fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828e7d646be89df0357092d4bd543bdd6a111a6b61aae0450bf922173932ba59b39c19407a62e4a2e22f818da2908bfd56a6f51ea96e1de5d81b178866d230f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d2f9ec4434fc2ac4979f7c04e488493ee4ea63447b7ef13a368a98518994a09256a7f90bdda1dffcf99431017cbd3b64005e647ca38c1a5f20c2829a59ff0b8d\", \"272f7a1f236902cd20ad291a7a6a076cc603fd2200d9162b36bee2ec618f823f4bb6fb0dc87fa61339e1e22da3d3d8a2868e0a921807fa3564fb3b003046fa3484ee876a0bbecfa359eadcb1918946604807c53f7581fa1b1736b47270219e1eb26d9cb6dc959825c7684c1572bdb596188e93ce617d02d8a846632712da739246328c451c10d22ace4202a544f85846a75e316f3002620f3e92971db914f251ad86cf5a3fcff9d6961025bdbc4a744d816d28f5ce2e6bb2222c2de6ad04d9343b0ad67b7c7775dd3b7eb4\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2000636ead686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead527cba5387\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1c7bac8717a1f08a6b77c9fbb718269890891be6758928f5cb3459153ae0de08ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000830922897e89e68c07e04de6d130a27a5a951f6b1aea2d24f385224743fe4c81ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff694a2fed14c09c6754383f2742dfe418030d1e2c2b2d9cadf387b2a0b16a674cbfc87899f716171e154af0bccbf57f58c200423513fd20280e4271c015ce23d2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0764280133642a0ed4b654cc75dfadf1e378ce8acdcbe1f4a0f7a47f7d20191c0efc8634b965b6826569b65bbffd03219f5c4d8456855a0953aedfad181fda86acd927010d9a5ae3a537588717dfae67083c7634f11bb0d744d4721be4cb0020ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded0dcf006e86da3002739810e9ad712096942420be48d9757cd65133947cc3bcd0d4f9505d2e403cffef6a6039352eddbf9a714198b1bfa01d247685e1772482d1417f69a2838888e3a6dd70ac5912ee50ff90eb582cda45050b26021e94bfc0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fcdf3e831ff2a692396b71aeceaa5752edf7d64553043662bdb2d035fb6f12effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a1ef1c2c5ab25bc5f00c54aa521540a4bc5a22373dd3145d69f7b626b451135f26739ad8b291a182ebf937d453bffaf5086c66dbd78a4243f5b0af19440d010062781e17adece575d184c126c5da260c183814a1f67c6a33283d2fba36defc93cc2de204cb8a81ef1684806085128d0ce219fdc369074a7dc46fbdda93dab33200000000000000000000000000000000000000000000000000000000000000003a87f62c494f2a95168b096362df7318617c6cb887ad731b45580133eed928454594baebe8131bde06413f226e83bb09c3151fda212ed80d12bee7005552e1a1217f6beed3ebf104cc984d6e6da46579dd5abd1429d4d2f47aca227449caeb7efbd6af6b3c830949083609f210edf4ec0010a880f769894781ee19f6adb76794e00f658893eedf5989891add29f45acfe46abab84de632ecce600a81f7679979ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa85a8a68199b26ce7c96d456241b7d90151eb88ab81514a583104294333511af701c01f1e0d14775ed14889ed08edd4ff91ff3f0e0fdbf97d8de74ccce18be1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045fb260a6bc61047b69ef16e0cc4bb8ee88d9aeae61c1a066039634dea89385dc54d401b29ad7fdac3595fec3fd4df95bed63a5a08c9d98d8e153add63b22a2a0000000000000000000000000000000000000000000000000000000000000000b235ad0219ada7c0df38535235f11fa8135fa1542de32c2085f2897fdf4955ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff68725897865e09ad9e12163864a1fdc5a83a32b6c064f95c1c8a9a36a897f7db75cc6f29cf10b949d2cc7cb57622633bc213ea5e692ce3d44657d8c5c707c5ba31b43609c459b7b7901f80f51492bc95378fb3f51f4333f40890d02bf8835b8292c971f13f0e411919275c65512e9c41d69d3146f117cac27a17ca58231b69b30524b4ded2a7a7bb414a6358cf90604f43cd149d2ee54f056f74e93731c4e526e4344c442186c15590dab0b903a653a642f61d736b49f9482ec326949b95d911000000000000000000000000000000000000000000000000000000000000000095710be98c313fc8abfe4dbe5e065e2e4c224318d84f1d0db7c7c3096588aeff9ff0b86d8a356851e3ee9cb426803a2b8ba4eed715f6804f35175197f9887261a569e2ef4d3895e1a175463355399ec2cd499b34c4977fccb1eb2faa5ac1effc61847e55807b96fe13424e8c3436e556c18ec0bff5018646dd1187dc4baf8afa39e6897e52e177ccd3cda3515910c5a85e4cf5360d6a6a91df37cd69e6c474f1057f7a6dff52f81da94d713d78d8e2a7302de7af2a79eaf7dea0841eb2eb46f431791a44b0a9f0111d1748d1b61a8e0359989ee9d0ff21d3b86129d7211f658c51446878c7085bf068c96163382f5d1e38130a4cf5390fe250df3257ed33f6a073f59ee9a2f14d32e113351088b0fe1afe58ad0c33793836685ef598c5b421780fe98e94eaa9bd32f02ad5d46c507f9d47d4e5df03244f5162f84934b75e6cd8f6525ca88eb66d3294a6b8d93267d4765ffb34ae1aeaa56683eca4eed616eefd625e750326639c16c7742950cea1f7d372481df0a88a1bbe8b8f0514d20d379fcf0c142b16cc6ab3cd60840e65406333199e12f456259f1390a1a79e87cf247fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828e7d646be89df0357092d4bd543bdd6a111a6b61aae0450bf922173932ba59b39c19407a62e4a2e22f818da2908bfd56a6f51ea96e1de5d81b178866d230f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aeaf78544ff09661df34acf0ab140ca8f6834d93",
    "content": "{\"tx\": \"ec16b2e503bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf71010000001e2984c9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cff01000000d37921d6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9d010000006e9e6c8f0155bb16000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8796000000\", \"prevouts\": [\"55bd6700000000002251201b1a5025b4fe9992b0e02773e7f35e6be2fc0ec95e56c0e62f01a84c1b9caac2\", \"4966600000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"2317250000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367bcfe338274b1b9eb3713335acbbd071cce1617cc6f1391b8f2a52678a8c2e0a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ab2616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/aeb2510aa3d77a9c6dcf533982e3925d74a03591",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d200000000e2e3d8f2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc5010000003f7b88ba0234cb5c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac3c020000\", \"prevouts\": [\"62951000000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\", \"bbf54e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"447d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8288d1d486ad1cd5e981ede7314b9e0cd98a009052c160e03e008903fffd682c3fa4004b2cd3f2b5519985ef4ce40029d6249627881f39179d9882ffc68f5bb6a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08208f12ff2db60e07951e3ece83f8d4c41d9b16f9cd93bc43e76ab3ca16313aee1430173849036d038bb15ccd29e38ea974083458e0cf50b14971883c73e09395afa4004b2cd3f2b5519985ef4ce40029d6249627881f39179d9882ffc68f5bb6a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/af3246dfb5ebe1bed3d537e239a99af7422239e7",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5c0100000075641680bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8a0000000017e471b5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf300000000ac1340c303f3d21d01000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79694c84f5d\", \"prevouts\": [\"ad2d7f0000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\", \"7d0e7e0000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\", \"9da622000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"eb7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c7d98603ca11f2d62da2f097293e2a9fc40838a31eb24ff9d7fe998ee66e0434e58e476735d98d5a1185fd7ff42bb7b31cec58182079010d151d415fc7d6c3e4c2ce937a5de573933a673baa3adefc0607b7a8b345eb0a9388ff089ef522bdd2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fec5402c57463b820a037283baf958dfe8fa8ff5b14330867ba864fa7bbb305c3f13c9f2c0ba7c3724f3080ca99cfd230291165bf004db5bbadb2403d0b759af84ce21fa65bd655e7fa8dd3695f51b098b96b5173f87464f2936878bf520f49fc2ce937a5de573933a673baa3adefc0607b7a8b345eb0a9388ff089ef522bdd2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/af39e152ec29cf6ef9124bc09c621887cea05402",
    "content": "{\"tx\": \"deb4eb260260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708801000000b89731f8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b360100000085b672c00156510a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a698744740\", \"prevouts\": [\"80ad12000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\", \"eebf20000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"3b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93614dfe64472aec633187704e5e239fcd5c5090a7796420cc2de2328e6e5d0b2fdee7dbe7f66d64a980d12157b84c42445cf47ca482a00d5396c717810eb35e86629f15cefa9911251712bcf83078e1db490f7db40c14a26e0e577f39f7cfaf11f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936617393d62275fdee443a8234280e41d5e175967af62b17afa1af3cdfa9c72adfd450a1526d7659d1d0ab8a304ec78556741ee62c830e21f1e920b63ff49823b3524213bc04a867e2e908d02e9cd05b1befa37bc2f591ad783cb0f6fd2a1a72397ef84fce916674b46359d0327d7b56c183d26d6053da1b16053a1f90da8a1d4e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/af4d15714a467c338537aaa00108e2bee33e8426",
    "content": "{\"tx\": \"4fe15df402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c790100000077a4d0f7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1801000000465f338e022e7dac00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac43000000\", \"prevouts\": [\"f92b510000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"5e795d00000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"854c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a8a30cc5f8be195df182d3a0e5016923565d012c99df51a6809fe7dcf26e6445717b4e30a5884e3e55754911c167a338fe4fe766d1d9ad9fb23fde5d0da8b2aeb2a240b376911c9876b3695f79f395ec3f2d97b1695e5c0e7f397f1ed982e79a1b6e729898dfeeff93e2067a7d076aa1bb7914d367b163cafe54fabf88cb14d8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5285\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936991387851c8cb36895aad31d9483f47fea8c6c064a0164a0cd6e51381ab611551ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045952384bfcd198c969b60204543b8b578741ae3068409132e955e5c7af181f3d3734b3a7050eee065844830ad8d45a710891f78004f5e7f35b8fd72bf3ee94449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/af58cb52355f4201682a37056445b679070634b3",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2e0000000021998959dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd701000000289af2e28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49001000000cc78bb2b01117a7000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acc484a04d\", \"prevouts\": [\"5bd120000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"0a98200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b4ba39000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_bd\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cbf23365cb8880b133d27b3d20c3cccc29fe770e97aafa1521ac972d4c2cb1b607d19e1ad6bc0c00cb86e327fbe7b7eb490bb73be336576ab7c4285b92b7ec0a82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a7f8ce60fca0759d86bd881fbfeac239709c0fc464072faec998076586f156bd383ca59126ba719524d83634bac11d8d770490bbb92df2577ed827ba954861bfbd\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/af5fe2e1f2c809eb47dbe26c8a45e6a55718cce6",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0e000000009ccca0ec8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44301000000298165898bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e700000000f154399c02849c8e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7966d030000\", \"prevouts\": [\"a9371f000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\", \"49f43300000000002251209c5a589e416b2bf8d886ac38373c12ee12085629030d3f34ed2b7cf34700cf85\", \"fb803d00000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"97\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369753cb1a5a2e209ace27a7eb8605f5f7017a5ce229afe5de89ccd0b48219a4f45a7303e26d6b86d2a780c30dbeb7ba87c6a0494b901c3875fb9ca7f2f12bb2fd373be813dc08f80e09d78de4ac5358a3bdf22545a425b50fe87daa20f96c44d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362b9f3130479ebcff49fd970febd3f22cafd2118ccf82fa26a081c98b144e890c088456232115bcc24dec0b5a24cea45f7d15fc3427ff6cd91fcf5dc3f7efaf083288455e3867d2ff7594cc417650f42f79f93c98aaa5c5ef25eb3554c8bf2ec6282285524a15c732567d099967405d35f7136f74f48f011bc4ab279ad8d14f14\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/af7648fbe02efa3d9188b9b61ce6422012612477",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc701000000c9ec5c9303ea284700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acfa60e623\", \"prevouts\": [\"70d2490000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_df\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"35dc529b40db63194d9535aec01fa52120529785c86f0de6ddcd00d518c37e6a2a250b192ac880acdf33caba9bc2faf5426d9f0edf9625043ec863f6a92437c902\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"670b1bc7c74622e6f1bf0ab98abe803b48a381cb70eda81e44f36308e73cd7eabc17c358501e8bab93d976bc68da1bfdd6675e6bfa1b567ff6865d3fe2e655f8df\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/afa5c3718b0a518cee419488c60f2f2741ba28ff",
    "content": "{\"tx\": \"73092d65038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46c000000004658eea8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa401000000a7b39fe5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c450100000060837bf002397b12010000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a60fdfb23c\", \"prevouts\": [\"afe43a0000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"7ec5840000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ee20550000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"697d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0827bbe6274b0dcd2777fc9b1075bd65318fdd52335751f1d5034a6ddc9c2a447578de3449b5e2c621283b68ab187cecafc7aa77a8721601b5317d3484f84536019\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b7af11fbeeafa2e26d6ced4a592e7faf61316ffa4728fe11920bc0a66ec98491cb7a7ab5fd71851d574a9c26887a3027e1173994a10fb9074a9680b95d402bf38dbbed29828226c3a1e74b431b518dca4e99f1ee054f76cd9b7bd5529b5cc8688de3449b5e2c621283b68ab187cecafc7aa77a8721601b5317d3484f84536019\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/afb161887b4215368f593a2d8d8b6bc32170698d",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff0000000009808edabdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba601000000851525c48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47701000000859dffb10302a2e2000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374871878ff56\", \"prevouts\": [\"74b9810000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"6309280000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"0ace3b000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e8e2a3911e1bff2fa3c4af1bc21243f6a834f260cf8a45deb24e4dcea3a99066e2307133f37cbbfe293ea141cadd9a4dd6438bc8da73ae0a01d8d901734469bed1bba87eb66086cf67e2aa9090726ff8a65d448a45ec5afde73e2b01c7a7d6fc0933d7cbcf0b39a6ceb0a67b693dcf784cd711b7bb15972b8a86470a75b9adf05308a078bdc3619b5ef299b0e4bd26b571dc77c8364f588f0b2489610ff0ee96b2a13a56eedae4f4d1490054746f610a2b419d1a6b49e53507e2ec7d3292e4d368b89f9cc2849592fe253c18a92385d93032157aa51d3305f0849bb3ab936076d03650b590b720851e18ecb026c399d835546cc9f4b4438d56d2cde0e08fb04a4815197b6175917310348930121ac7922edc1076068a6dec8186fbb9fb643b91589d4db8fbed751c5e1fc51faf53b606ed49d1556556ea55ae538e4de6881c59f693d8a4dc682a4ac513f7d1bb540334d075356b12b102ce9e6f69a3407fb34fda3ff05be62e0d753a00308b365906892b7b4b8c071b00ff331aee88c3ffc0e83e7c7d6d1eb522ff9258de018918c127a9704314652711d12773f6d9cd56907c0f1cbbe23d435e5ce1d1a68e141e91147d85c3f03eb7c13857033c2208fca3c666e00e1f639ce0707a2c392d54561f3f9bc926fc64fa1feff8324737870e45e912bd4e713dd23a47e7109abcc6eff986b24748ee27353e918b775a84ab599a9a4aa3220d3fbf77d91f75f3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d364ae2d506c0e3a74220f01cc1ba6cfccc161ccd59a1bbc3e0ce3e51240b4b1e8db2f81248ad9ed5128a6abc5bb92ba3aeb558dfcb95d0b55c9fe030b8e1ae1c9fc6c767d5aa72b6a61d813f4dedd67fc97d91e71acf86e276ab6f41d1da0fa8c03caa221836b2e776996c8fa4c69c403af6889ee9c99c5c1fa82cf4b3a1b61\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902633fd27b06bc6bbd5d48e8427495c63be19e420b0fef59f0913ef0c5e5b601b1ff61677cd840af631165ff3bec87362c2d593b4144b5f8b45ca087d173f116b4b62310952f06a057d3154818a2ce6209a4afde69e73962ef6fd9fe6c0857be663eb4e8978d463b20f33f08c4238fd124f2261df2d644ac6bd8277ce3963c88c415140bd655841eb4be252a74158fc8c3f3ede1a5cd650dc5b9979700bf08ec0c481f5df6002b2b728a5db9bde5d5816d895d1ea5714e7ea8535cc09082f22d5b84ade610d0d60a1463221ee67cea6deae01775d13cfc1d3f77029578c89d34f1c6c2e9d25bdca41fd18dd6153bfaa55afc087bf9d436e3b7f4a9d8e15433b225bae863a53403f985a88ca2e22a0efb61fe741e8884e0bac9db99baa711eaf780a5efd3e0660442aea3bd8b9d34e860ee021a95a0b762fe2d739cae6456695c503c481ccec8f584c36547d96016a5b42c0c91ba1c469ef3d6d3ce349586daa13ea1dfe7f92f49e141f188896b8e6aa3b2383aec26206123651a28e301b6756b78b8a31047453f27a7e7e533510f919cade4ef6e4918c065ebf6e427c4389b00065e3cb6844657ac0b29ed017a7b2b2af12c3ef03668914de2ec0813283cab255b3dcfc171be041fa8009d2c91d4197d7d5942ca46b1f0657de6441693ac7300d7bab75eb526c0b686fa449614aeb23af4bf481897024eebfbe4b2b86b51c658d5137cd017770f6f90a87561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082c145688b3898d8a1374847539a36067c996b07f78d82debe95e7e288000a7bb1b9cd72275efe6b477d9cf0b54cc21959221ed58300fa90def59e56d53bf5ae178c03caa221836b2e776996c8fa4c69c403af6889ee9c99c5c1fa82cf4b3a1b61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/afb93dea86c318802ea31536847bc3786c8bb47c",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9500000000d03e1c89bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd101000000992df1f804e162e200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac708d0a37\", \"prevouts\": [\"a310810000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\", \"b1dc620000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a767488fe42262d771f95d10749b7596819dd0a85061a1366a23d9cec3529dbf37f8d6a4384f014fca2d3cdbb6112c7d6167187a43622fb7ab70c92b59ba97398cf3dcdb1aca371f721e0e3bf2b2651b51ce3ba34aca28f0f47f34a6674cf0fb6779b1e291bab0968202ad270cf91a37e8e31cb960dc611520cdaec411dbef0bb438b99b0a7baca4c5e023deb9dfa7f55f0d7c88254219d1d3c98dfe892bfc8f8324df57a3e5b194b205a3c7f8aa1cab1620a3fdc223fafd171ecb77cce8d929758597b5c0dedc9d4f406ea14d44e0aba6bacf906745e14634ba22c2d6adecc5adff9ab3378b04fd87f3178620c97c49e5a7d9a10dc4fbdec708826d17697df6c6ca981815440ad0e511f84ea6a59a12b1df196226cf591713eb0cabb7b00f4f1d4f40f607eb6a7c507e1ac6fa066076680ebb59ec4c99338001e72ef655f1f099e7a090b31e95872c696e526e62b2c5954af635d44740a1da0cd4652e3ab75129698ec2953d332e3b3e36aa9dec875973cab9f403c6645a5b24909c576b715ef36f0e0fb57360f5055aacb7d71a55cb29abe039a297828208198f2978d0590d3a38d01219c3899d2c539c990df2530622775473b7f0ba933b387801ddcdbbe9d392ed7df4f0289a986b6563976f98dab72bfd3d8d9759606cc298b7c4201a300f0fc18e6f9f98bd3fbedfaf70f77889e4921d85798eb8203cdbbca8ea0814f2f4db802ffaf752968775\", \"c87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366ecdbb67ef0066ec076e429fc04f46dda670ca9551cd024f28a867117fd70946da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e65775dfb1ab8912d99abba269b246de78dce1dfa6fdc8b38f44f7be80bcbeb76c308d8e78b0cea59e70bbcac5990a047bb63a968328232757672e5e931dda055\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090250fd27dab27acfa32f56d759b2189bb517126d1d58cdae68b0d3a6d7ebd46d0401a1e864699a0916fb10b127258ee5ad4577d7fc38f477e1eff0b6e61675f7b576d1249f26b5d5b50e72d298952ee6b9242e8657beb8d5a1ba10b864a1acd35f0ed833a3a500dc64df8bfe02c80109926344fa28e37118551fe5736ac39032695e7e2b97b02a1b857ca030c63c22870af71119aa9ad4a47fa96c61224c0de063824b48c7de543b5ba08ed42f6eb663781b0745ec17cce9ce5c9a63ea2d6508716db7ecbd1d857e70f7c5b734b6b60f8c017a415b107bb6cc4029a29eb85517ccfeb60e05ed10a1c589050b5ceaaaad33620ea9b3a58f5d8d163776c9a4082cbcd80db648d6ece66990f3a771a94d353c88312e76a045809364c60a73a3b90ddc68d7d04204139ff38be71298dd3331e4738ed805f3d9ed877897a169ad30b59bb834029c4dcd1913f2526755edbd6b4d23ad63e53dabcc96c3de8c0bdcd9a2f41da0e14058b9831d65964caf40a85f1ae005d1162eac570ef6b3f6e391b345accb4e4390e54b1212c44da9e5c3ba8c4905054e719326b653166bcc856588902aba38e792149b7bba8e1d9d23cc2b38d197178911f79ee7b8bc6c0c155e0e3f24b049ff779c8f960b2e36730757b3f9cb8a5c9392de83fcf56b5d845724f7d41486e3e0f92da3189c0f56d43cbb55b439af9dc8f06f18811849d40fa6914d4bc1e8ef06bef75c48e48875\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c0a8280b2b2a3355b689f18819ebbf93b19ad428a3d20831a21570336086a5905323990ac9ba96640afb66df99f25054f5788ad16157a03b33c6c26a70bd925e21136d3d9ecdf371b2101a7e86edb56e15b10ef185a8506988239bb2b5a4c43e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/afcc94478400491055613ccd42f75d4fa9c1ceab",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf500100000025b6048bdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf0010000009bc157c302da139300000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d8000000\", \"prevouts\": [\"923e720000000000225120279eabb29e123e29b3e35f5f3a43ff6342d7d66d04195fa790bd9d720ea8f0a0\", \"4a6f230000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"83\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936777ff8a9412e94f7b77cdcac9df137438df90b973affcaf29cb29560429bcc3e8ed6c904d531fc0d19ced9482d4cbb64035dc55104164ba190923612d3f9e9a82b9d1447cbfb5d72d5da72ac5ad193469eaa6b44c038aa23e2a9d2dd480586adaf3b292550aa3dd1beea84cf7009fb6c6992543e64edf52f25a9194aed3bcd7c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93683933d45c3442f615ee20a7137db960cea3b9cd87b48587a4de9c490e5a6c9c899aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb439b32d44b6ff86c799acdff23ced11a294722ef2b8af6951bf8429e3bda52b31af3b292550aa3dd1beea84cf7009fb6c6992543e64edf52f25a9194aed3bcd7c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/afea0adf1a155b6acd7f6a1aac9dcfd781f953f1",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1d00000000065a48888bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f300000000cb7a9eb304fff3a800000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac0c020000\", \"prevouts\": [\"f03a7100000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\", \"75223a0000000000225120cf3d4a21d95f409285a815c665903ee1793a8187aefd3a8003cd262b63069349\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936918449c1f1d7e2aefbe78c65a77cf74e4228164403355e620ea48ba4f143fa01b90b3e537e0a498718b42d83f823725a04b39327b9237d74ba7af037a7c89be8bd8f71710e2f4773b226617f0b144a9d046788db13e8347a383f909c13421323cf46474fab8e7e9306b35224640e271c3ad2c01a28b74e8035b5ea3da4b2d4b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0825f4861bfb2a6452ac4a4804b2c6a2c641047e4f139d9501cd1bf471f8e5b3ea6913d98effacbdfffd2adbbf71932929e08e9cbcb7e06a345b8d84d9192524cd99d8f9ebf09b0c450213ac35faa1ca38fcf1ad0a46ee35414da06dc92335be8b4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b0225ebc20fa76a5b5efb83881756503681565fa",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1701000000233e40828bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c407000000004acef7c7044c5ca200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72614dd3a\", \"prevouts\": [\"a8956b0000000000225a202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"ca23390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_52\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"02938847ff632f0f0c15c9da24e9f4861811b6531ee8af7c9e02f39ad63ef28c10cad94e45d7e63ada960257dac7134e318c5fc4e3631d9ac5cab2fd1104c8a4\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"73932d62aa9804ec33dce96cc8d8cd7584c04c5a33c2622c295f30a583122cf80cf93ba581f052ef81a337da361eb6b1c1de6e1cfc8da709e8c30d9851609ee552\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b02921b398ef06202f6f3b3f652c3c8f10888607",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c409000000009364ac4260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ac01000000ed34be6e039fbf50000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48709310e52\", \"prevouts\": [\"e41f420000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f4301000000000002251205fbb8ac28e580fb39d87ab9ecacdc52316773607abc8ac10a5707b0a5a311000\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_35\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4489f55740956045636f25efa0cbe6e85b2c8ee4d441897964459e3cd03f05acb364cf48b8ada980762c69be6321049428d0df54f118b99f1b835aafb9af4b3402\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ec20d8ad8daa4cc44419b71add25a720ba43571d629c871e26a246cf9b160e5f6a0fc2fa687cea0778b0a1ac915f06cba52040d8eb94ea040e0029b3af0e266335\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b068dde987664207f704c5b73a6444bd16d46da8",
    "content": "{\"tx\": \"1a1da20f038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c496010000003477079360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127029010000000b0db5c160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700e010000000bfac8b303bf195b000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487198ac73f\", \"prevouts\": [\"ed513c00000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\", \"fd2d11000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\", \"5ac90f000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"b67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93602d7bf344b6095ff9cc0433017c53b008386fb3f597f891117b70dc62f0c39c7781c07d8975c94d77b7f566737b45f640ec74b2b98cad100fb0cff19b6594ed691244d1d955381053a5c36db6928ef13bb9242569ee84b58d7018329936aac78\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e848df663f65f0e27b2d1567423d7462b229bee90dcacba8c1bf1c1a66aca7f6821d9a3f11774810afeba87c9188100d693899e640a37210c96e3be6a00ac01d4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b06a48e5c2bc5a6b1fc1fec7273e5642a15c8c13",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf070000000062aabd978bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f10000000022d1bc9003560c960000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb3c81660\", \"prevouts\": [\"78b26200000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"1625360000000000235d212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090225807767cddd3374bea047dc917aa65ddde9500a4f784a5475f11dc4d628a2f955e9d72912892e9623eb0f203ab77e10032e634036cf2003ace8b6842bb6197de20edaa6aade498a89585d703af8e07290591314d078fc0843ae351874d2eb7b6d8f2ef5d9bc6c22bd43af2a2c27a44b63b8ab2d570c6b21dca418c986aa8be530ab6d1db50754a3674e8a4593a35bff580992e1170d9a890161930e100a870d254e7b22d9e2090e57a9dc6cbc471049f17c4ab0e2ff55f692eb88690b907a619e159c7f68872fac64c5e0e4bafe6f9cfebd6b64ebedc5fcc0fa912adf54c0409d8a9db1ecdfb77182ab68fb7b1a6ef72f43fdce054b94031a07b2e58ce5f2198aafe8bfc2ba167e35c9d2ad9f8225d5f4ed1a8b9c413c926cd7d69ecde7c63b6304dace749363ea462e9d4546b9cab81a1c09d5b28c787390e7d1379fdf7f635d4fd93305c3f34e87c8ef39bfdf50504b97c6a30e16c9dccea3bdb3b8fd08594ad445673bb629dc3e8cd0693433c8a630e755a4bd51f6e90a1271b2ff591feb49eb1b477993a3608c44bc4e344891301720ff6c4d140c2ded57659605f3c998c3ff60db73e396de772ed312a2b083094b30d026c80f3e91686f015465665a2f0b421dbe9968553f1b4263ba747582105322dc53250dc6ba483fc0e931f31b528c90766ec692015565b8404f064f44acf69615fc38bab734d57350273aef7863c8b64291de596641917584\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93687b90958d8851f8faa791a740c8e3d6af0bcc9b19c9a9104c49c045e7b5d9363462b9d29a734e556c6b2d2347029c074a964aefd93d416389a14ef3ddb3da113c419005ce053ef5676128682d79317eecff4f27ad8f3a341c1729484208650bf5e521f6248097fdc64ff5a0a6cea9e07e7c649e93dab8ac6058acbfaf1ad70aa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c232fd8782c69989f630df34a3fed3b47664fab8d68a4b3ab2fea23d7077d103e58d59aa2e87dc60281ce6386fab2796d20098c04252945a82b2129388d5646ae87124c7ef1be1faff5b766dce9390ae2852899b6e64c375740bbf30943cea03f6002ecd65e85251c740cf4431f9d96b1e72052e2d6b09056efce86fd8ce56d752817758f5aafd71a3ab3510011453b6f0d40fda91b3040934b59ad603f641bd254c35ccab398d6ea4a4f7f2057f5a8c0a4520cb27073766fb7ce6785d398ed7c5cdf11a7fba3c07e872cf0a7d9c30800d3a7f9c1c2f9db7ec208fde50e1af7130e64f0ecb21ddf8ed4486e4e907d3ffee8b8934830c2fdecd4f03a8a811d2b53071471fb9e30ecb18d4be64af405ef72a8a9e7e771edb7a7408001922cc4364dab5b9658994afe148864d1cfffed68a7cabfc31cc046b2112943711f2afea1811c734637d0035bd1add11155fcc92acafbb4db9ec3fe103fcdddc0b2f0cef43c0a310029dfc2df33e946642057a31441e5df68eddc9428d25503dcf8d9fd8e3e0e7e3d2a36405de1f3b98d16d05e322fd004b0bea658c01c73a96ee69ac20ea606e2170fccf3a7eaaf5195418ace9009e36129b0b231a45bf164571cdee42157a01a6bfb6e0b3085173f44c168b9006a5a8756a20d48f5b431ab85462363fd5c47cda75f58fe208856583069d8af0e3d020bc0e1dd8d78490f0ecfcca2a45411717354a42a63b91137561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93616970ca0a1645a57dd7e4993535d76d7bd8f0b29a77eaf17ba06fe1d93791444c419005ce053ef5676128682d79317eecff4f27ad8f3a341c1729484208650bf5e521f6248097fdc64ff5a0a6cea9e07e7c649e93dab8ac6058acbfaf1ad70aa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b075dfb300337efeb5bdabad39fff800ee516fa3",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127021010000006fe273ab02ff3b1000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87cd000000\", \"prevouts\": [\"1b07130000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09025c73a78f2756d264b727f445a0c2966587566bebaa0b4909fdf57273a0c1f229cb62f9667e1c4f824ba89cda36c5b581e20326169466388becd60f066f4e6d525a6a6c1d01ee84dfa23efe8bff2f481cc00996602104f3cc3833f052e9f1b6b0ae1e8cda9cef064b37b361411bc6f27afbbd323aff2512f7b81a951e671351032cf12c849ebd7ae332bab4cdb0033dd1ef2fecb9b27da0f08370e1df09daf0c9d561ce31859d3beb8fd1b42e34fce3e4c7f9219e7456dc0f825d4682d8c6f05137a20643f5d59b64eac1df8627f95754060223e94e833f5904a6e4d5829bb9cf89b217bc1501b701260d3cfcad2a55e902d51cf82ee74319c76844ecb067e06cd750e2e70b738abee804751679dca275cc14a161ca0bc07e016dbe0ab90e2f35195dced5a0dc91961f62f93aa1afba98200d87835390189d1c73e6fc21fa3d5a823e315ef8c2e1040441eb8f5ccdeca5d03ff2aa1eedd6151c3407b29c17e426347bc05c329763109233e8386a8a9f84f56abb45d44475e03d5cead01bba223d6c2c343e5c5ce10410c8de4e6631401ed6a443f14eedd76b49fb3ce82aadf976f305e8842ed58f22d81985c27af5e9f5449721b4e514b4f4261ac3998b6d694c1f533c50c3e01dec592b8bcd72fe26d3bd717d3cf81c5dd903cec3b52d152d54b621c7bb3de609d18ae6e3ec5646f3d7f75bbe204b441095ef5d5a45d93df8046e687bdeb82e95398d75ea\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d46957f69408ac379450e9bb4389343450626e215c5ed15c0a7aee568fcd444532777cb2583add22ba560e78ee9942bfe3080d15b9172e7f2c8ac5adf5c65a1c36f2bcd90a4462875ebc34531696f5fa5671e0fb7e46050530a773670978687e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09021fe139ef2f28fe9b836b87a916cdc079bc6a39d8c815596d237edffae5a131736609cfe655cc3fd898781f7641f0cd70151ee13806e43e5d2dda37e538dcaff3cc82e917cc234d9b39c30853ee7dec592a410cd98e1690436c4f6031c859bd372c37a16270853724e50413f4a592e410f24b760fae202d040fb67c880c5d504711975f6ca0cbe25d0fcb8ee628e6e188a188499f2f43e2f4d6b0b5e288f17e9117705ad1728792ff7b149b3928b13e617612e6d75cf39ba4e409391e081e90801e06690f124aaabb9abdec4f8f3a2d79cc0ad386ca6fa9d927ddf99081705d598ce8a18556ef7b9f52f0a4753eec9b55989585774b192205cd33d0b912fe8e863d42601523a49fd46f5df4ef70c3d0bde51a3abf84935749abc273790fdef99e2555eb3681ea165e56c54fb670d87b2ac8f8a8ad536f9a5dbd38157a3ef5b47fed1f6e45dc2058434862784f10c77ed61dd874e2b1a662709461642eecfff4161ea4986c23a03748170c4fc33e583dcb1fe7606e398dc4ad7abaef2a53a3a03d5531e9031f078201e710106d77e52d74660cd5ef9b10464ab69e78bef058fec08972a6f259519fae0776ecc6b81b9cea7bb67820d3fee59d4c978883ab9522fbc0212a77315ce83e6b00b5cc582b0ac710f8d3cb29fc804e0ef16da7d799cf41b6465912830924393f9bd1603733ddf8eb7fe62d2dd352db45bcf004bff89d6f01effbb0952a1767e17561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369c26013edb97e3ff451a8f909180c8326a435dedafe5a83ac52c9f1bf8b152f16aea47614063a58d04deed750fbc1e2c170629d7889e26e95c64d3b658c7538905d194d5538f9d0578f97aaac3520494006fe8ed5ea4118540907b045326452835c6739a4d626ca1df00777eecd105a7e72aeb1be910a44c9d3be4aa00e70c25\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b085cb29b4ab162f71d870e1b8f890fd0cf23cd6",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c0000000003bd730a360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b701000000ad8a8be30263f44c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487deff4536\", \"prevouts\": [\"9cd63d00000000002251200fcaedfb972c31a562a88e2127675cb61d773b6b9ce4a4a9159012ab236e47b8\", \"09b9110000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902addd150bdc5faa9073d3026a89ee3a83638e006b85fce8df78ff3a5342cac9f0f8ffd4979aefbafd524a3800293ad76a76b34f84dd4a3b78e536c86aa056d764787fb984bc77e060196cb9ac369affdf5eb3c2d1fab5307950ec3877075c0dfe6d877d3c1ddf55f09d924619eccf87c0dae4f4f995d57266fa5445a49e10e2cf39b3f548235c4378cc21fcc3c356341e0910c9b811c55dccef17788d7471e063b0cacf18d805d597ded2fe81e4114d6ffb90f29f13e369154e376bd9b7a050c4f41f9765666a8188490caac683cfc4d9a20bc8fbbd34be1826c4d8f5550275e4aece9ba372f149145022c8fc3ea9b71074e287776cb455b841bd4059b4231ff30d93e94d36f311ec69cd967f062a51ccbb7fcac7a533b4518151b54a9fb619e17f4a25d8d4356c43e5f485bf335d710a825b5ba74f47eee53d14faffa2ebff59f31c99068735ed14c9a22781016f4992415590a7e0472a30d30b117d57ae33a3b0c40ca1cd16c1b5aa1541444136bfecd46add624d95abb5dcde73b39ade4b2db82b5793a14da1cca41e2918deb5833e4f256d7c6f200b1688bfa2ed4fb8a9d45c2468ec32f5b069a56f266923242b2a98c93f847b97053a295a325d4799002013e88d0dfd378efcc9539fdd077c66998e0a443916cf50d71b24c9a54e43a6d6cef56c9b47b5344682466b0d8ae2f7b7b0c92255abc5db2f8e49a86fce194ce78b8170728670c23c5e75bd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef20d31d73af45144650ecda4bfa65e941320968360f95ac17d612a18851d4fdede6356752267b6a4958657c43b99b93cfd40f762fcdaad4937ef48d6413f31b5843f54915b2c97abdf26ed2d562b36c2375ce95d63af6aa508e6368a687449\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09027739f2ea80564eb4ff7bb1ceb524c01579510d94e3a290a69b3399a812039b89574afbdb86bcba9fa0f516082b61e41e4668a2cb9715a2a7052421104434edd8b75d398c3bb2a00a41e25a55349cdf6b1a354082d4fff8a1472ca2fdc6b302672807a635887d1e562a935edbe0de04a1aa37830170c07e3cf04f9b607545289aab146d87e481f5c67456f75e8c59dbe39cfbc19b4290b296a077e7db0a542e9c3a5aed74a8b306d183b491e8dd4d696e7c4683a95b619406f5522705671d6da9f8c92646e84fdc5b3dfe20aa68bf45da12ed9c418e5825d64726ee64e4c6bef2d3b03d92ffb5d5cccce2ed73d91b6198bd6149fbf490fc668f1627c43420d12af28257b1f78e4a1ca224bea36c0b684821c253ef37eff25ad911b600a94ff4330aa62ac6ce23b4b569d639b2e9654d651b1f1392a6d049b39682feeeb401bc4c9ad33ee702d507f36d54ff846d5885ba81d4fd599776ceb049ad3d43c0f1aef9e99059b965db1181c794eecd57101a2b1f5fb741da4e1253d7b60ffe29d7b8dced3a7940f9a9070688654322f70df2bf54af903858172d05571d590f31fe7e785512b997c1f444d5acceec7734c6ad8a1ffeae1bb4c956252fb86bb8f92446f7d8e80ff9ac0a5b76e425a75cc1a20071d66485428ff11d9e07fe7a9c93f73fb22c023e512704b75713bcdee57e6b38ecd6ee32e66a4878e331560a157e4a5d2d76057a33ef15d592c27561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51631743d48971d1733c6ca7857843602fffe2e4122fe98dc3fa85acbd6da797d181cd61fd18311004a5536d1440b72b537197adb3a0d17581cb4a1679e89097edb5843f54915b2c97abdf26ed2d562b36c2375ce95d63af6aa508e6368a687449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b08ac583665d8a49691a3a09c1d5cc1ee3b8a416",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe800000000f78152b3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3501000000776103a803669483000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58000000\", \"prevouts\": [\"8c6f65000000000017a9148bc1125bf4e3450c593a5be1ae9a05461832d39a87\", \"f6cb200000000000225120a4b352e79354edfd3e864ed1ce6cc38f1a5faee50592882c88cc9fa5a730b850\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"1653142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"2d6ac4038ca612d9aa5964b6877692495030730eaa4feddcf58aff6cf05b1ad3b83ad532944b79f035bf2d523d92a80d442edec9788a52ed82e1cb17a312f542\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b0a4831326c413d2804c49788050b9f91a6403f7",
    "content": "{\"tx\": \"1dd1ae6902dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce500000000026e16df8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4100000000051563e9502ec56810000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc2caab52b\", \"prevouts\": [\"e99947000000000017a914de933560a9a700a6d4f856bfa5cf61713cb34ea687\", \"3f4a3c00000000002352212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c121ee29e14189ecf575f48042069fb1cb2b67dd6b993ad51959e998da257d68d3a68e24af1b5a566a1cdd1366976d79d186e98fff0e84827211c49253546ac8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b0ad1929e6a50924bb0dc2de48e23ed645f857f7",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5400000000ddaec8968bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d5010000003ef568afdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4900000000daee1d6e0386b1db0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac56000000\", \"prevouts\": [\"92bf790000000000235b212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"309640000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"c96623000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e04c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93660eaf4545b5f7166123e054cf15eb738fe32912d9aa58946aa01c3af8881f1593713490b1e7aa24138c57a652efa6d547b3fb45fa4f05027d6d9331efbfa4d517cc0cd924d9aecb0bc2fcf01621d0e73a88693291594fa52fe0219caeccfa5b3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364be51c95465cbea3588c9b6c76130e9be14a08cee11d82588795957f6f854169ed9d9b4b668c8953715b364fc922d70c032801be88e8b1547978372f57dddd133713490b1e7aa24138c57a652efa6d547b3fb45fa4f05027d6d9331efbfa4d517cc0cd924d9aecb0bc2fcf01621d0e73a88693291594fa52fe0219caeccfa5b3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b0c00b0f653fb7d6d9c6d10a355b006e90bfdefd",
    "content": "{\"tx\": \"2072d98802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1502000000525dbd8060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704d00000000be747faf02cbaf2c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e71c86fa53\", \"prevouts\": [\"2ae61d00000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\", \"45be1100000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"4830450221008f0c40df843421f9995dc8849f3172df73d4b5fd29aadcc223b653fe669ec833022009210cdc0ad39a9379cb9238adbc1aa5caac67c361c7fa00eeb31fa978f029aa022102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100c4c9372bc11cc688d6f1c6991c3751d7ea1790aff7667073b59aa93cfde5207102206218bee0f56bea822b59ea8eb941d8ae5165e8233debe0813cece3c23eff08ef022102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b0c6d5f594246c874ab683269116303a280482fe",
    "content": "{\"tx\": \"5ba8d15b028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b100000000a28f43ffdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4301000000f4d3acf404f3d25800000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87e490d753\", \"prevouts\": [\"4153340000000000225120dc3b17a9e97101dd89a6713513f87d72e341f4413af90c87ebb03089172b5d03\", \"e38a27000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f14c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360c9deb8d7324d76c36ab4f0759c9a5c2cbf4147d65f4b6b168ab1ae532394b7618ea1dd842879684de6ce36adf7429742f60d84d7359dfb2eae76d7b546c72259feb3ebfb72e1f3a9e601929fc7eea4d0eaba4c5291f01c808279d3454a78ee1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52f1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f5b4495dcd3a27e5602f5de3a080a46677a554abf7524a5bdccd10201372c8add300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d513887c728222b860c37147d016a38c71344b48ea7c651274945970f6f23c5cbb4cd941a6bc152cbea0496b075d4b2611b435301778200e60e8b4147cd93749673\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b0c73ceab30b62cfa56f40cdfd49c1ce58f55a01",
    "content": "{\"tx\": \"da12e55f0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fc00000000eea8349660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703e01000000fdb2d88004830d1c000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787ae0c615b\", \"prevouts\": [\"ec020f000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"54ce0e0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_csa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8f1a24494dab1f03b22408d30520e77aa4b48f8efe7bfd25e309627ca6ef94831c5b9e9893ec34b026caab7ace36a85ea44d74fd60d608b08b4adbfd946aaa99\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439befee6fda3cb49175c9fcdc99039bdef34bed6f8c885214259c1ab60f6e0548afc8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8f1a24494dab1f03b22408d30520e77aa4b48f8efe7bfd25e309627ca6ef94831c5b9e9893ec34b026caab7ace36a85ea44d74fd60d608b08b4adbfd946aaa\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439befee6fda3cb49175c9fcdc99039bdef34bed6f8c885214259c1ab60f6e0548afc8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b0d9006bd4700ed6403142773e914c7bb257d345",
    "content": "{\"tx\": \"77f1ef930260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d8000000007f6b15fadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7801000000785a0adb01d6d25800000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac0f040000\", \"prevouts\": [\"0be812000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\", \"b5ed5d00000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d3d8e8f866e5c93cba06d034c6b0155dc3fb6dcbd1bfc23f94a2cd6d77087a79e8e97acb88a684ebbcf6cd53614657887cf2ab5b7ffa8568b23c580b7cee3fc759745caf2cf1f64f8d8e099707b0430cd5fd31acb7685c6a1867b5bc101b65c89699cbb3a49a3897e0d83b291e8d094574fad4ed03d5ac8d24902fc0d71816e5a01cf78466d0111abb0b3e024e5370f04f86266460cd148af38066a9e860c0847b320d45fde3aae686ac2b310fd0bf93ad880531303bc7f2d255d45e73de07d6fca8354843ef40cee7aaca7bf0a9cf1aa0266b7033d46512959c919a0dc469d3ea8c9e088f6952906d8357b118c976c65519fad6a7ad6a821a520095ffc14606c72631dd95a79efe95914a01937a0dbe25ad0df2539c40a0b6cc7476508b543e54e7925f703533143e8316c1dcc1a1e34c3cabd3e12844f89a0df860daea8b272ad0f051ef337e2708309be9b2396fce6c7de72da317cdff67b98ce2e1216aee213c3f50ee2abf3dd3560408b42bdddd8e8336a73e40085d1b188b3316dd4ac7f635765bd465c6fa35c9791eec15e38b6aecf672eccd911b447cf8e19ba7672a2aeab4f44cb25e76d787d6bfd0e350023a8ab46f0a251b535ba9946ab6768e452c08df6fb79f41652e42abf050d5a97c84d1dd6bc4786238ab259c635664debac17cf199666dc5fd13017896868fb3899eea4147d92148f3c6633c6084a4bb1448c5f182983d9a25f575\", \"997d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa40197dfa5e15d56b0c52ba6c1e960d9371338186786a853de15f9da987536b6f0e580b14ffff5bbee812c9f6e3af6b100c6b4cffaf41971c257964f1fb14f6f9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ba389a32aaa53e4ec0ad44c9d8814f282e8bd985c5b24c932c4ec9101951fcaa12437d38d476ba2e04b73ff6ee55766553e676532e78610356df94be8c3b3f9a24bab69cb55844372babcee11d2cf244f125eafa0ac50c2ca0c871fbaa4ade748dfa14014c83c5854b74c698b42ce3602f98c25f7e15d6804356ee77085a9a79ff23638663a7adea296198ecf3cd44c1780b0baf2c91c7206ea060e82742ca1b2dae45e1c096ffcc2ae1263410e832623f12751ced80fa1fd300676e7da4d18f9aa8f78ec9640dff223deee293c230fcc4b3389ccbd80d97f2f249d3ac1aca366ec81cbf003b84cae439f312714e3a08a8c595d6f2e4fabad6e855c1a9d52a56dd210c8306721edabdf003fcd5c1aab55ab55fda70c623a342b2e0e22ef877cf05c988445c35bccaf0f1b6b11a459689c07b7bc445a8788dbfcead938e9c6a26c5f1f64d2aa102d9d939d2323f005e6d7a1a95d69bdcf5c7c36eb8b3a18219e03930f460d903efa02636284ffe60039ed141bb122e9a7552b3097ce713fa9ed4ba55df01b250e7a537a09f588624d6762e9d9d65cda6abcf5f6c4fbd2056df5a7bbaaf489d29e3b19780b2484b0cd1eaa1489fa5c9a1272b6a1e7d6d6fd514d5ababfbe88cd90dbce7d6c8382a69a24c9781c2f5551b8671047fc64f49ca9f6a3e8986ded806a9bca38b001d959f67262c010bb09a827db9877fa71495ad4c03c6adfd338b8374cbf475\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0822e3b986c0375fedeed2562a6fa36a7b38b0ca47fc0125e42be2f4bc52e49716a3d673df10a8cc98fc65477367c7f3bb838b82569297570384f0d4df8cd49e6dd413afa0de0ff2ef52577d4c80443f6003c675907986908c28bc93ded208ca160\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b0e3df60a56490ae4dccf3851d020b40b21b8b7b",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf16000000008e795ba101d0fb450000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc79020000\", \"prevouts\": [\"0b8a700000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365b2437d263ee0812a46b558174956b86c0172ee942f1fd166ed8fd2626e33ca1b17c496824b626c02ab547b0eab6d99cf720fc5f5950d9f56a4e0f1a7586e075a9cfc1055a4268af502090450271f6d102883ab16be8e011ae292d6da52fbee7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369250ad1237d5633d63cd08d0b09aa1b36322d1a916eb5c296c4ee8f819a8dac8ea5b08b003f1d8a082790805ee2a5a4def5fb527637606ac665fe1637cb888218bc5bddb1ae8a97e111feaf10767a648ae88621f6e3dc27f3d4b61f2a6f156b2a9cfc1055a4268af502090450271f6d102883ab16be8e011ae292d6da52fbee7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b0ec063bde9113e41cd5590763cc5a80a27e57df",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc101000000c198db84bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcb0000000017fde2f5039f7f8c00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8716010000\", \"prevouts\": [\"56ff250000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\", \"2f89680000000000165a142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e11fa2939e65832b6ff7989f1e054fda271120b52cec29bf8626e2a96fe398ca78fd22261ee209e04df9662f52c9dcffd1f6e65f5b546fd3c131bfb02c186b05f664ab0b66352e66b5bf600abf31d1005c5406f4575b339026213ecb21a668977f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93663af012b32f8cd1cc038c1d6c2a62e919380767bc592e88c57dc97e62501e69d1fa2939e65832b6ff7989f1e054fda271120b52cec29bf8626e2a96fe398ca78fd22261ee209e04df9662f52c9dcffd1f6e65f5b546fd3c131bfb02c186b05f664ab0b66352e66b5bf600abf31d1005c5406f4575b339026213ecb21a668977f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b105a50748888b6356015fc47a88bc2be5715d6d",
    "content": "{\"tx\": \"da5995b202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba300000000e933e5a4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb40000000057e27db101a5fd2600000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac59005b4b\", \"prevouts\": [\"fbbc1e000000000017a914bf07e8218e5a3c93fa381357100b6dba1ff2a91287\", \"4a0220000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2354212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"46348d658f319ed8e5e84e982370a36f8491173a86692b9da360a4075f02aede095bad76d7ee1e122c1a39d990b0987229848868db4f88a6f1b9810355a2f8cd\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b14851f777181f4d6991a19eb5faf986f6c5d922",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cce01000000b3e4cc8d01b08b0800000000001600149d38710eb90e420b159c7a9263994c88e6810bc78d3fd55e\", \"prevouts\": [\"ddd4540000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_1e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1aa2b00dab226a1614867273b5cbaea6697e6eb5f0f7550c269dffc763e80d293ead063e8602322512500c46b66fe2de223e525bfd509e9e6c90783f5c7eeb1c03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ef811be4e94b39e868a761df447fba2f0d661c0aab700cf68bd0103a7a5082f1ed3b710cfb6403ca70ac2a6301a1b980b4ae3d86cafa8d4d943655b9c453086b1e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b16c3acf4e0fdb0086f5e645c0abf5248401f236",
    "content": "{\"tx\": \"af5f933c02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2d00000000e528e6848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c439010000007ad0089d046ddda8000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac76000000\", \"prevouts\": [\"1a906b0000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\", \"abfc3f0000000000225120997d8f010f68a117b9644ba05425738241c47f04463545c88006dd06ca2c16fc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/branched_codesep/left\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4523737481b1266900a60dd0715caa3d8050e4b2273427d4fb5a605322f3ba6ebc4eb06341778556cbb9e26f8681ed4aeed30f0ec3214a91bf51e6e585f4be0583\", \"01\", \"4d1301e76af030918e8d96a5e9c2094c9ba06d0ada8d0810ebc2f79ad890d92025a41b5cd08bdfc0cf7d4c9986cceba43fa0e9be5c2377c104330d94f07ea76f76de7aaa32e78ca0685201fb53e48ff30be8b782d5aacce7aecdb4508fb3a4147892070176fda3b74cad0a6f35c859d5e0d7627ae9b9ca8fdb5a4b5b652d3629350b6e6f11f7de2a627705b189459ee6bd1a593add61bffcce4e74b7b6af7efdd904948c80a13bf6734dd07387413a317d6a1134ecf76aae32aa7cf062cdb54d519d560c7a8549bc2fc161f890e330d20d78dced8994561d3d2bd7cdc1ede9bf9342f772d50abe38243c80d5649d81cd34a40ddfd49451e3305d4428e8856314a7308213c662f7f2d689b318f65bfcd530b15515dcf57563ab207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667ab20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2068ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362ccd8c60a773165cc937efb02bc1b35e1115ac0671e1767a3af984f55e4d3c01bac00967532285e5651a233a5d3d97b0c986d2b78702c704bc34e0fc184218be\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8962f0b4e7c0263efd37394edd17b3c3bf9ee95c25efd464d1df92a111014e055adb3f5da6f85b6250dd1a9169c4c1c8b555e842bdea3aef2b7f283184f2f3b3\", \"01\", \"4d1301e76af030918e8d96a5e9c2094c9ba06d0ada8d0810ebc2f79ad890d92025a41b5cd08bdfc0cf7d4c9986cceba43fa0e9be5c2377c104330d94f07ea76f76de7aaa32e78ca0685201fb53e48ff30be8b782d5aacce7aecdb4508fb3a4147892070176fda3b74cad0a6f35c859d5e0d7627ae9b9ca8fdb5a4b5b652d3629350b6e6f11f7de2a627705b189459ee6bd1a593add61bffcce4e74b7b6af7efdd904948c80a13bf6734dd07387413a317d6a1134ecf76aae32aa7cf062cdb54d519d560c7a8549bc2fc161f890e330d20d78dced8994561d3d2bd7cdc1ede9bf9342f772d50abe38243c80d5649d81cd34a40ddfd49451e3305d4428e8856314a7308213c662f7f2d689b318f65bfcd530b15515dcf57563ab207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667ab20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2068ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362ccd8c60a773165cc937efb02bc1b35e1115ac0671e1767a3af984f55e4d3c01bac00967532285e5651a233a5d3d97b0c986d2b78702c704bc34e0fc184218be\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b1776090f6173a9a430ec315e3ed5aabd24b1b72",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3400000000f74ebda1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd6010000003ae740d901134630000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48757010000\", \"prevouts\": [\"a750530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"71fb250000000000225120199333ae2814ece819e66b6eda683343e1bb1d0c50810e300807466af2e93101\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936342529f4bbd62010952df5aa365e09694a0beaf9b870f79f3a07fd65a287ec77\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a31616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b1a7636cf60adfde2e1358221f019b1e6b4155d6",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127042010000002bb691cabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb3010000006a9750e360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707e010000007fb4f7fd04ef69900000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb3b44031\", \"prevouts\": [\"86751200000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\", \"695c6d00000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\", \"bbd7120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8315fd5c3d2b13597202ae29fd5f14b518ec83978a94fa219ed3381eea2945c54347ad9ec3bab91865b4c8dcb398073743086dcfdb350b66e5a4362c4e68f13b83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3ce6377c37ce0024d6f35dc7deeb34796c29d64fb0cef7bfd62d6906b93e4834500958a64d6651b58bc7e108ba19cf8f89baa42ce29fa0896342f4433925ff7b07\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b1ad5a93a73ac48400168c0d0d6867c722e2ee94",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b200000000ea14fb878bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d000000000294766f002728a7600000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87bc010000\", \"prevouts\": [\"72c13d0000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\", \"12c53a0000000000225120a7af56c53f6997dc9f888a8c6887a5f8ee9cb96a9d70fc301f3f9e386ed85991\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ae4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93687ed348611d475a2912210bc8204a20bb00aa96f38a8888f1ea4486413b1a5a6d53bd36d32adc19f711473d01abcb44e7ab561baea4d664230dfa9381cfa8f4828a09ca0f6d73d82e88e284042e116dab9fe2cbfafc110f6c0fbe5b2788367c646ec42a0fc3b2b57c90387175ef14e4ddb9fbb252ed168d3260bd00914c11302\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045bf410b10c26f46641013d73a91af66d7632b0672c14a8d3b0dadcce48aba69ffe0b789927f620aeddbf74aea18c74264c468c5fe823a741d176e0a42636f367e46ec42a0fc3b2b57c90387175ef14e4ddb9fbb252ed168d3260bd00914c11302\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b1b4eed63248ce097e83d9f1723c6762b7de9c27",
    "content": "{\"tx\": \"a67a7ab50160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707a01000000d50a14dc02bb6f0c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5a000000\", \"prevouts\": [\"a46c0f0000000000225120a2b42a3d113bb3bd52e1704c60ab477d21ed62730f87bd557087d89b305101d6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365796547f4e6a3486b790cf242f8b11aecb4a0209f6696518a51333fd17057295\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a71616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b1bf9f8b4545db1b4c96961e0e20f15216c0e8b5",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa201000000a54e1d1abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff600000000058fe3ae01afaa8e000000000017a914719f78084af863e000acd618ba76df979722368987b0010000\", \"prevouts\": [\"b38b84000000000022512005ff23ad1561e684c08dc4654c3a622730f716f9dbc5d4d5a4cd20d536b8ae37\", \"e07864000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93665e966627d89ed7c11a6fe076b6d05158b5eb3f9d5a5f655bd22fafbcd8e8b08\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aa2616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b1c08a839cd0acb873c5f79044f09ba166bfa26d",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7501000000e6d878d9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3f01000000a46d7fa2018ab5160000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7e2c51b57\", \"prevouts\": [\"edec250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"902024000000000022512068a70acb8902a9bd7a8a0bf24e1b522fed50855c0b1040069930cd3d961acf32\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a897063338365c0b13a26eff7985b69373cacf065397f325e0727d23d4450987\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a2b616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b1d288dfd536ad13a01041e19c9c11fead33ff91",
    "content": "{\"tx\": \"6b76e011028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47901000000f2a234b660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cf000000007d7052db024ba54300000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7a3000000\", \"prevouts\": [\"2531340000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\", \"dc6d1100000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"f47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa056823e3960e672c2faac6672d149a4ac5db30e5c30fec842c5078845a2fea890bfc944cea42013591059ba9f4ec0a95c62699d2133b38017223ef90bcb8e42b4a87a36ff2ed7228bcfc2438815b30cc1c98339504e1b834e10aaf4a034051\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93682115a2dfa9b95e696b2e1876a43d90a8957d7c1a0aa8ff9ef276528e0707301bf93feda87a2a10f8ccaf134f5ef6c2a0b95d03f8827da72e1e875b6e78a8a5e876f4540117e7e2fda63f7a015ec774d613b8932caa4388fa9ce7145d42cc7f6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b1e426a1d9ca218fe8dfbd94e4f84deb69cf3add",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb500000000cce811ac04718e6700000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4876c000000\", \"prevouts\": [\"889069000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"47304402201372b7b7415affa8d3a31d7d460063a924f66bdada8bbac4d28d3b0fdc1ba8c0022073caf6a462020ac81fecfbd367190fea654b7ff08d0576352600411c07b97a2a01232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022044a72a8e7b670dc72045e89e8194caa82ad3645f93f17a8182f9d8ce21b29f43022030c4bb3114aaba72e0b5eae6ede44f4945c81d051bb753e52ba318f50dfa49b901232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b21f2a634774a50314c4e0ef19018373cfff5761",
    "content": "{\"tx\": \"d105fdc102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0301000000971ac2e48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41b00000000099cdcd0044657a70000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79617aa1023\", \"prevouts\": [\"43046f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c8213a0000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_f5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"23578c1e3a91ef0dfa332e6c5f58b6f8a1326086c1c7f132e92a17743a8ecb1270c9c7a29f195755c38741e41418904623b09aa69c86ff03882ad7b2512d0a6f81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"da0ef200be08b34b52a38dd86ffd4fb1a09e600f236028eca5b9dcbb9e23092a51cc8f5e5095ffe7e3730997fddf64eb77ec3b8709a7a72cba234cb65c14cbc2f5\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b25b243c1918bd286e71165a606917ad6566dcb9",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4700000000041e430c102ce663f00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a664db913e\", \"prevouts\": [\"125d420000000000225120b52a77e37c1fa9b4a7b934796858277b8dc346396dc90993eb725a9563cf0842\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"b87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369c645b03c2051c6beb7aa80d32191caa487d851613efaf1c31edf92889bcbe40ab6940ee0f3b13da6463e2f516d6c168d9c5d733b385f1180629b82031abf4ccad8c3985a8e2539d42260561cfa7167d8724d0e4cbcfaa47665e96933724a3d86960f5e71abb11fb1594f725adbdd26a9f61c928558a58ca58d11d05eb565d16\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365f3587725e5247e447e4cb6b14e0c535c8313d8ac3ac5420f5f1daba6f6e0dbaff5a0b04042772840f11ed5a15b1f6f5628d6ed53a9b814a67fccb7bf41c87856960f5e71abb11fb1594f725adbdd26a9f61c928558a58ca58d11d05eb565d16\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b279bf9258b4c48220f05e2e891b91c7b13e0572",
    "content": "{\"tx\": \"a115863c038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48b0100000096e9c4c28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49901000000144124f9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf9010000004abe32e30189092c000000000017a914719f78084af863e000acd618ba76df979722368987dc000000\", \"prevouts\": [\"e7c0370000000000225120975437f6ff12fc45d8ef3d74f3d05cfb35811edf79338d42e1008b4e2cf45094\", \"6ef4350000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\", \"c869260000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063e968\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369091fd32923117b71e5ab9b92a9d13a05584ef6b1cd43e2a5b18703bfba3f09acf301e2cd98ef2d5c028e1b110cc6503fb01279ff4eb452c3408c39d22674b4dfc7f9c78871d6a598c7c7c3f4c8210a5c47caa8abf9700608b6e75845c74a6c5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360382dff41a76e3f98bd5f592608b4db8a292c887d72fd2428e596a0b3632a30fead6d3e810571e3af6462e6592387cebd820372bb489ff10eea7a83e6cd68e83cf301e2cd98ef2d5c028e1b110cc6503fb01279ff4eb452c3408c39d22674b4dfc7f9c78871d6a598c7c7c3f4c8210a5c47caa8abf9700608b6e75845c74a6c5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b2bf386739903299a1cce995ba58544747eee3f9",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c71010000004ff55bce8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45000000000c0c2d20502325f8a0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac3b000000\", \"prevouts\": [\"c9644d000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\", \"75c53e00000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"3045022100e36580573e0a91d83bc09082f0299661313823e7209f148b8d24fd7fb24d766402203fea28f7195f9da5736cbc034e6814e5677d7cdf1e82d8a7ffa6ec7ee6027f7d02\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"3045022100ee5f2f79d1dfa297deb5e9d30940b1d3bf18ff8834e93d97ee1cdce6fe334584022043d33a96df3ccb719bd0b403a8b1f8d5d2052c81656880854070990252baf53002\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b34497bedf19b0567d48c3bb9d3c6c6b7285bf56",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44900000000f5f5607edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2400000000a5a0567a0347928500000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a66dc2b32a\", \"prevouts\": [\"ddf93a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"57904c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_31\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7fb04c03105eb712ed2d128076563b8b30f2f03bfeb616f3328177986172e52d658a19b84d106954de7195396167fe7231c36719ef075a18e673f7c5f14723d881\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8821379d423344363033262f0dc7e1a0eca6be4b8c1b8da95f780b0f4477745d9e2cca68605640ed89ff1a7947969d34d7f39995e632a62c0b534399f8ac0e1131\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b354cb571d5964e5709107acf8b69b7a52691648",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff901000000939dafac8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47c01000000d2c3b2ffdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2801000000052131c304cb62b800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787c6010000\", \"prevouts\": [\"1f9b64000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\", \"1e9b35000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\", \"49a720000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"3044022026a14e608bd2246518963f984a9e5b5115db068eebad21bc3cf427842d648baa022040f8a2a0e6cfdd5ec2d386836ef4471903aeb51035135613129d668e99e17a978a\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"3045022100ce87c284455926c4e3c8c87af70f206abefaf9e8f69b32e44b2198d863dfd8ba022046b01e4f4024ecb9a7f2a28cec55d456f1193bb9d053c62d25e49a4b900079948a\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b3621ec700f1905ab8a89bd0dc990c56dc5b2619",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0e000000009ccca0ec8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44301000000298165898bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e700000000f154399c02849c8e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7966d030000\", \"prevouts\": [\"a9371f000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\", \"49f43300000000002251209c5a589e416b2bf8d886ac38373c12ee12085629030d3f34ed2b7cf34700cf85\", \"fb803d00000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e54c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51b15c6036a676a492a4bf737064ce6a21b64de8ad159d3b2e60d879468caf8957d0cdffd10ffbed86c0e7536425f8f402fac685ef3be7cf3af5c775f2718b4072\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936899bb7d21500b6999eed5216ea1db5a9ff8f61deccc2645d4f480296bc202312deb89faaac3ba7f5e16436fc8221b82cf02c075e22a72f26a59deb249ff0d9e9edc23a266999aa1773fe99be867e95cb2abe2d57657b7a4dc20a388644aabac6d0cdffd10ffbed86c0e7536425f8f402fac685ef3be7cf3af5c775f2718b4072\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b36fa07023f7e2c301fca71c92d63d4b9d3dbfe8",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b22000000000e68496b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41601000000d14c8d5b0305ca5300000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac832c5e32\", \"prevouts\": [\"ef35240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6975320000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e44c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936036751089af36ed5c0ef7dca2a713ca9b31e3a2dfbb12490c74aaef9653ee48ca81c44a09079faa406e9dfe20ff322801dbd7fb1c55ee11d2e1c43aeb4d3cbdeaf2eb908b8657464a6ead7ee639edc82f346aa77dfb25920bb6227c2c4c35ffd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52e4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f526a05401741d274ca9fd789911b95efb3576d14523fea071e177c96656d1d00d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3e0b789927f620aeddbf74aea18c74264c468c5fe823a741d176e0a42636f367e46ec42a0fc3b2b57c90387175ef14e4ddb9fbb252ed168d3260bd00914c11302\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b3acffc7854d876acec4be4e8f02c5785c9786cc",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b500000000011604128bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49200000000a36624610468c3470000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac78010000\", \"prevouts\": [\"c58410000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\", \"78f438000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09028457bbd4dde9afe54c6c2f8bf83f35729e8a3c9e3f23c7b45ebe65b3357ca85ba15558e0f24533deb2ad2e0dfc079668e04eb421c0e2c28a1833f987c5703e15e99e9f16c1d7e2cbf21118c5c7a42bb57c03f20c696c809013509da488b0900c36ccc11ed60de7f2b3193acf4bca28e7471e4a4f3e92e18db3c80be44d88366eaecf124256cc09d419f3007cbd45e532c7e161d444960db0a606664e7489063dc115f699143d8262d93cdcd2e852f54de92a5455b2223ad2026a3f055d922a3b7f3058b3ebc2058c266a163f2c1e61e34e6673ccd0de302bc8246ca75f0732b32cde0b5c37b8a43742ab926f9a48c4b3542ba852c7c6265855f72cf618bd01c288c6da46285171dfbf34ef42e0e834681adca76cbfa08b77612f94b9b1d87b85209cdfcfce4a87c627cb9b4f60a3fd0b5fcab7c8bc062549dbbe439c71ef25f2b07824f1d0559c3608866f73d7fd9f84d702274a5f665dd297174046d225cf284ad5e1e09c55f1d3e928555a87a15bd8832beb55fa30d5c30d23778b366a85fd66ac86fa77767709a37d79154f7a1efec1ca022b58707f95c575b80cd0faf4a9dd54d7086c392a13972e59cc84cf32d2e580412fb43af3f35545097afc5ebff4ea2674454b5dd4d21ba1e39a91a676820063c0b5b86e2555feb5e55ce9d14fd1f37e606c00b460cf6483502886fb49e26c6c98df83c3857a5e7c9f437bb66396519ccb05c6fc9264b275be\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08215cb0c87b91becc5e8e88545f518ccd4dd82a3936db012f0c0e2ff8a479534101a521886ab29756862a71c0453b77f880429f1d68b1fae0f34d555c1e4747b3e7a9dfad218b10cddcf05e9e788f58784bb5d8eb58cc0f6cfe4d23ba63d85e381\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902448027d910a2c28dacaec9bdd36e54d01a99672e8db16135ab21ec0692430600c747da65853b1cf02165f4678d55c1bcbc8283c376e90dd59705b414f1da4a9ce01bccb19275b5eb0b8989b4b07a4c855cfbab900a8ed67f4450e5e8cc1362e31d0214557b4475a4156d36999c20f30ea4647742c65ecea157f0057e92fc45cbf9aa47a6eca8ceabd833f0c0a3f6e09b0345e161c1f7fe5d481cd0d7ad86896a57f797ca4270b3eb89a1f4e194d5fccd5be89213155a5ca76c9e019fb7822290116f7b3cb3195037f42ac343a08dd8fda33c5384e19d1a3f222120eb6abb57f47ab64fd5c12484368fc506f9607dd06c552a69c2b68913caa2f0d86e85c99c76030a11f49685653b4fc48903daa0ef2c35e8b1f53ca50b027134027dfa337e051c8c03b9135423e051f6300f649c1fc7e44a58d0589c881749c20dbd3c2c81d4ec965ba222057687889889e36b6cb24659f84a1ae2424aee0e1ac18c378c0f8cdea39cf55d91209ab5eb8e044222187baccbd0a177a66028e1068125751b781bd8031af392fa08ee6c72199b8dc266373ce74d5c52fc4b6b81f620f40a45a6de112a0e4b41a1c2587b7353b791a55ffafafb742d9d4de2895f8105a388e3852bf220ad0328c2c1d5ede8ee77152506efb453129419062688877ee09540fd932f7f89b42cf7921e5d4de7fadf405303b58bf8eedae10e67d29e8385a7444428f60eeba39051ce4b8c1e7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004573668dc71689fe0651b36a481e24aaad53f2818649afcdf831b4092eda1b840fd3726db1c97dedfc82502578948b1d779eb886e6296c36bf50b8d2fe25c32b8a344cebdb8ecd56ef01fad0911d9d88482970ec36d3a04b84eda7f5b5c68ec938\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b3b35af21b57765c4439d83505e2c122bcd9d159",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf330000000056a475b2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cba01000000746cca94dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cca00000000ed67c018043edd1c0100000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88accb010000\", \"prevouts\": [\"e2be7c000000000017a91441ce0eb0e6e5800ced23a872818e5aaa63be0d5b87\", \"3be74d00000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\", \"38fe530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"1657142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"ddaca7147b466835165381f7ed37d503db143637d11c7f16d815ec7bc34c0e9f3a3dba96eb04d63e872619684c4194998a63514ef6ffe93f0eaccbaa87b1ba47\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b3e2b23acbebfcbc2e5f4e54d4fd7005740cae7f",
    "content": "{\"tx\": \"dc7f15740260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705f0000000035065d94bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfce01000000f213c3dd049fb7800000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796be95ab32\", \"prevouts\": [\"b8bb0e0000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\", \"cab3740000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_96\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"34560959274ce200db1d719b55427c3303d033c50526abb970120c21652c1fd5b042a3f3c49127804a8c8adbe59568dbea857e4c659d85397addc46c6801573781\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f302f24d0117461617ce1b6b980dfc41fff8cd5a392a2ca79afa0ef89953151aa3facc1f97810d994aff6d4c78fca137172cc5262e030d9deb5713444271bf7996\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b3f7745d61088bde2d2244a961085a6e8ca22a22",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127033010000009cf2b10cbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2201000000378971070259bd8600000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47876dd8b95c\", \"prevouts\": [\"f1be110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"3569770000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_42\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9f78e6a85ef709de7f86cf0d03afb24fe26ebf8b0838c59205b84c09c0b6618bb13a587e2e95d0ca877f3a7d77caf5fff1347cad9c23141bbc6a379e69978b75\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5600a15e3d3dcda56bf739d4b2460c7e70c94ba5b898979da5995e9024d91915c69804b009ae0c69dec98bfc8151ff4f2afa620a9b6a2749fe8ba1e4c8ba387942\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b3fb8896212c7278ddd055ebe8806a9aadfbdbf4",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c700000000bbe4adda60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708e0000000066bff0d104cae04d000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc00050000\", \"prevouts\": [\"16044000000000002251203931946bff2228105059183c00ae321e35895921175a46193bb089ee2b225687\", \"44b610000000000022512088bd92c864bebf276ea78553bffd47e68dcce8f95537d9019b0b776be36b3d44\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93688b84dd89443b974221dd5eff164e8c7b4057a81ff0cc18ff546def1b21c1105\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a3c616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b42a78220d5bf6c02b4d64f379b4963da854ecf8",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47e0100000034d6f85adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8200000000012c3b33dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1d000000008f19ffce02f518ac000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987d0010000\", \"prevouts\": [\"baec39000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\", \"d7d2500000000000225120b982c4866c93df3772712b36d4336b477e2dfe66f304c80c21f6bc33f20b8495\", \"8ecf23000000000017a91418261fd2fa0b0480c86b918607add1dde9f7026a87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"483045022100da1b4e54c424c8fef5e652a21593fc43edc68fe19436869c978748b96c6c8e370220590e270596f36e2a5c33e3ced8f8ccc5532124d2e7a2c78f161cd6da7ca9c2c791434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"473044022023bd90580bf102b8a2e6f2dd3c092f8a5c299803237ab3bdbdde10261c8fc74102202c43afa40239f58b8992ce023a963ca87bd50783c6b9ca999883cf25e9a7989a91434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b471b7933c10f89f075ebd244fc7dce18cc064ec",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41a0000000077b56489dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdf0000000045bcf180046ed1640000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a647a36e60\", \"prevouts\": [\"e4d03d000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\", \"4dd2280000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362c7d9ab9143a7761e2df5d26d7dce1bb1763a647714ba4cc57b12c7d6fe17e6cd81cc5051f53cb756176679d36bd97691fe000700c9f2a0965e3d67cfda5d0f8a81c44a09079faa406e9dfe20ff322801dbd7fb1c55ee11d2e1c43aeb4d3cbdeaf2eb908b8657464a6ead7ee639edc82f346aa77dfb25920bb6227c2c4c35ffd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb43f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0824d4fab40ea135233ddc8c9f724889f007818f7ffad5749db3376d8fcf405e18faf2eb908b8657464a6ead7ee639edc82f346aa77dfb25920bb6227c2c4c35ffd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b4881b1ab0b628b8e08950b8799b2a7b2f90f6bb",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa0000000003a5d8e9060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703b01000000b886ef2002b9017a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87de3e9141\", \"prevouts\": [\"613d6c0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"1208100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_dd\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bfe7fbaea9e6ebafc9381e9106abc49428b4671512b0473af5735258dcf67890912a355d6966818247a937598c69cc96531125a2133b11e801d7228c73ecdaa703\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5132b07bcc6acfa772d3138671c3aeef0959298dfa8fa65d479c55f37a9fb161cbcc8ea2ca8d38a1da9ce524097c03023b700950b6bb5105cfc31de866ea1408dd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b4b0e6e8de840a729657842fc3f326a51926695a",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705c00000000fc3ba74b60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270360100000034bc366cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfa0100000055a193d8039f024700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca335554b\", \"prevouts\": [\"c58a11000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\", \"75690f000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\", \"91f92800000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"3044022074e56ffa3a4d847aa657df9bff182c4d04ca6703dc0472e30f640c62643e846802204657a0386fe4f248370d383918cf4368819da1ff42714343fab31202303c261a02\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"witness\": [\"3045022100fe3d0ccde45b37f951070b3fd63855b43be9601dcd7424a46f29b6b02f10412102201c28d54a18ee32cec518e1223b89360bc9aae84abc523ec6204e9323a220be8102\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b4c0e993f516711b0d2941c1993f065eee0512a5",
    "content": "{\"tx\": \"8b21c5e6028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c432010000009e90c1d88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44d000000000d1ee0b404151f6e000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac44010000\", \"prevouts\": [\"bb693e0000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\", \"20ab3100000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"d47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e1d15be41604f0459412a6d9aa888e4d019cca614dbd3b30e8d19f8f49981c6d3eef830f28a0ecbd34c70640f7829eb7d86b0cf2da24853f16b74ab53bbfd728ea84370bdaf8fbfa2c728119f306db95ff534e2e627fabf0c000f69380d4e93e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93669e6d8ef22861e07fee4583a5ab47fb4893c942079130ef347ee1cbb0ba45047b93338c7d107e01cff6d052285c57a3fa3547f5f14e99776c0371239cd8619173eef830f28a0ecbd34c70640f7829eb7d86b0cf2da24853f16b74ab53bbfd728ea84370bdaf8fbfa2c728119f306db95ff534e2e627fabf0c000f69380d4e93e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b4d27baa0c7f4d587689db8a9529b71fa55341ec",
    "content": "{\"tx\": \"caa0da5f02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa6010000007ac8318cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0f0200000026999d930300049100000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac207a7f41\", \"prevouts\": [\"a2016f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"fae5240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_e9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1fb82bf0788365d728b9ff776845a4e1f6da622c3a3295c1075ab60b728775a56f1011bf9abcd25f0f6b4fb7c1c50cee22ab9747d0c3802a8c50e3ba5365cfca02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a5020f0599578459c0780e9c3b5c31a50d7e7746c1b31a86c18f61edebf412d0d89c3e8dc51e10fabf432cfd1c01e623abea27728e26071ff4f2146db7c316c4e9\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b535e18acfb42d8eca463e3d005649eeec97a029",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c496000000000fcc65bbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfef010000009a2231fa0450179e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47870d661d36\", \"prevouts\": [\"4a9e3b000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"4982650000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"80fb1b5f90655833fb2fb0d6544b68b278de03509ceecdf4541097c227c5d12b7f92fa5e55f14d4d3aa3ee121077bc96e339253480e204a5518b6f302c2e2429\", \"50f83aa6dbc36226127df9bd7f4f11dd44b4564bd055dc6a444b407f57b32cf927e368aff72559a720863118400c618ba399e55609f5fc1179d6b71e77cbfd1446f2330ab168753a9446f5ed4ab346f402ef05e51c45ef88771b98f5cb3754cb17134b350320e9c9fa337765e77cc50a29575fdde5894d121e8da51572acc7412c42f83ce285264318fd37fd8e7ae56dfd63970556fb593e4bea75fb66a42d319c0fb740a7fe9c2f73e0ec5224aee24d72327a9a4ee36c438856e3672e92619fdda171\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"567eb9d22b837f710af064336faed00db3b47f08f118c0d9e4d4ba4b117b35fe779cc346421f0b4e3856060641633fade6d7bd71988fb22e87e0d9b20b9e840b\", \"508e48a54ec604c6853f0ff01aa13a403804219a8119d8054779accb0c4f1141a293d2696e38346244d19cffc8f2363e41711b4ae9c67c4137372a1ae83a3aad8ba8e8282e06130cab41ba926aa565f40b01ef02748111badd2199443071f85233a701e0c767d70116c7aa151e3cd4d53d487c5fb8ca6bbd939cc342f52f15d18259ed480b20b484f8afed1edb18429667758218e3b31537d0d3f833796852e94cf5a61e93738c88b321187c3e072c6fc406fa79ee9cb6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b537477b73545075fe86dcab51eee08a1eff1f93",
    "content": "{\"tx\": \"fa183ec302dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b530000000029438bd260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709d01000000a26a9cc804691a39000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7b8b82732\", \"prevouts\": [\"2b15280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"acb41200000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_1c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fdf6052c7128cb3d7cbe7b01584ec28858463c9e347f1776890c13ff6f9c822293d102363c44d36e16bc450b9d21ce49ba3a3f33dd04e04d559fcb38d5cf839683\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"aa09de2c1d11bbc4f812f1cf5c869732780aa67ca6e755a34bcf1829608d28f85d21aca0b3f60aaa2e90e2086ba15bf80ac55612322747d7af2aecf7c1d8020a1c\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b545791a846adc504218666c3218bfaa83bc90d2",
    "content": "{\"tx\": \"97ca34d70260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127044010000004c539de760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f0000000002921dd9f0244a22100000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48781000000\", \"prevouts\": [\"264b120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4732120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_b5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3b2a5952a72457b7b400ce8af078faa4007c2fa0dc6721ac6bb4779e311f2809d329095342fb90a773f2635129d25fb0f5e2f46f4d00b2e4ef0fccebbe21f67101\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e2a81bd58fa54fa09bf8575704de54873d6576817d7f581c2d3e7d0a900774450a9597d4f54b16e46e1345b5c4dada41270b0e458cb4bfd3d043f09674980d1ab5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b56d0867bbc5b009c7f592e99f5d598f728cda80",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c720100000018c71abf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b800000000898d559f03957a56000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48759030000\", \"prevouts\": [\"83a74800000000002355212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"20d90f0000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bf127f6c66b7e1102e7e4836650d9806400ed78271d46cc373e046582cdf8390c98ecc85b9404e8eb4b8e9e9b79bed4773fdb5eb0d950bfc127e46a8c7225e62\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b571a84a7a61d25a217f263add5e84836c981aad",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5201000000c07a9ac860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703c01000000d90833cb03dc493500000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc90186125\", \"prevouts\": [\"5c76260000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"80e51000000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3044022002fc22cb5825c98d7bd61746fa0370018ac55f3ae979ac16cc7c8ebd432135a8022069913fe82371b7bb7b9e5791aa9f2734f4b9a2ec187bfd1342519f8d227b8d5582\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"30440220540cbd88fd5b5f45e8d5470557e27c89c6379a2a87dc3d2e15536008fe93c215022061a594385c325818d40303c0489d5f913f71d62c722443f0f080e98527afcae282\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b592aa01c9d16fda0673296c91e16d85378ef308",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703100000000aae7c1ca60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127001010000004823318f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270060200000039d291e50304902e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e70b3b865a\", \"prevouts\": [\"076b0e00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"6753100000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\", \"176f12000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e144d0ff37a890039c0ba21f76704f7cfad8b9e86a035546ebb7c5a6ad2c2135a28cfae4f24e00136258a4229df9ce1533cc743f70cc4e5c0214ad74c09f63cc0b9de97a2505c9a0de734aa1a6c773f3979bd21cdf34ebf80e6ce3c625c087f57a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bd5fb013d649a0b113a2236243da0be0326b44fd96f8b22737f30239849c7b4bc63b209b29a3611ab6267155884a7f894b498570c9db6a86ba3046458c9f77af637f7085334bd6ace67733ad5f759fad65febfe656f63b2b30abaed1d2ea29dc9de97a2505c9a0de734aa1a6c773f3979bd21cdf34ebf80e6ce3c625c087f57a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b594302e03843a9f9c9551e5065d334f5788b18f",
    "content": "{\"tx\": \"4b63d655028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43401000000a620dba3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1201000000e5f7c897016aae05000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374878343df53\", \"prevouts\": [\"fabf390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"197a490000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/hashtype1_byte_keypath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"884d96208de777f6364e510bbc81304d672ef7db1a15dcf8bcb2f398b0883e272073807a37ffa0461435a5af025f423ca0b2d9b5d35bb0f0d8c47a35f4e8d8c001\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"884d96208de777f6364e510bbc81304d672ef7db1a15dcf8bcb2f398b0883e272073807a37ffa0461435a5af025f423ca0b2d9b5d35bb0f0d8c47a35f4e8d8c0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b5c23ef36f914bfe6734a376e3ff23afa4056cdf",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c700000000bbe4adda60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708e0000000066bff0d104cae04d000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc00050000\", \"prevouts\": [\"16044000000000002251203931946bff2228105059183c00ae321e35895921175a46193bb089ee2b225687\", \"44b610000000000022512088bd92c864bebf276ea78553bffd47e68dcce8f95537d9019b0b776be36b3d44\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936269f9110b37a3f6304bf0d8aebdce70c5dee6f88f5a6dfb0bad103ece716e201\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aac616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b5f858c267b5596e80a4ca9e1d9d9fc97493a161",
    "content": "{\"tx\": \"603fae9901dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2300000000c5bac1bd04e5355a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac8e010000\", \"prevouts\": [\"62125c00000000002256202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b492d21c321102276ae54fcbf77e697296436ec49857e79b4e0a7584486c791422a1272287f86f4f5d3201c76c402eb6c628126578e460265310ed7aea9a1c76\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b5f894878cea25475b042e2e6dccf49267130d0f",
    "content": "{\"tx\": \"d86b930c0160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706b01000000d429abdc0248030f000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4873da65f51\", \"prevouts\": [\"e828110000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"4730440220457a47572b23dd0d2a48139bbd294dd602f0cad076ac14ae0886ccf57e812f2602201a54df631df3eee230d529cf98784ada27e28f7c38a4467e8800040b41e84ead03\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100936308966ca9b9c527e9745cf7d2b5f2967b4bd835046a2d2973600a87ee3267022004bb1a268e144013a0ebd54a6206a35437c296f6b7e0a374c7bb1c2406b7054f03\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b605240fb46dc5b5a62d8e4fe44362074c17cd79",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcf010000008c867549bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe200000000ef2a1b630206169c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e71bbb9c40\", \"prevouts\": [\"35f922000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\", \"d5937b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_1f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3d51d6ffe85877bd6004b393ef7f15b111ba6d02fad2f9f9661b53daad79f924d545836a6feddc88ed39436c384291a1bc5fcca53b2a2485290361ddb750df3603\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b3291bee08e4d9de85e3a72f891616b457b12e09495bfa31a8e9210132fb83e42ba7e5673343d4167b4c92aa327ef24486d03271070cb2a14998268a78b589531f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b62a40520073f939f2c0c9f173f5df055dbcfe5e",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb70100000009c40cc18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43f01000000a76706c2046e9aa400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a61f296e39\", \"prevouts\": [\"7e7f6f00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"395737000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"47304402202c91e7f01d27010cded1cdf6210b8e9c1aef45a1d3cda35c826ecfa6534754bd02207524e69961de2b9a3d678dd3525112b09426f58be3a27b56d6fa9add335e84a15400\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402204c06704c3428f9330bc27477f70a27c9bae8972f8738dda3275092ca46a2652002203649cda029cd903c61848928680ddaaf5159c5163b6e0cad87e50a043c64a8b4540101\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b646f8b3b9e38907889dca9d182ffcb148c5eb86",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c455010000002e8aa283bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1c010000000ded30ab019a4146000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478713000000\", \"prevouts\": [\"2248400000000000225120fc4f9d8aed21e545c10b3b4fb5f7ffa2432ec2f4c867e738428f21cc99cd5336\", \"4c276f0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ea4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93645dd27374e1e3840d53c2eddc23e77f3daecabe9190b2b544b03414f960ba3ee83976a7e8bc20bfa4c53f64ff2df47d867849c8cbf6df51014735817968d498535c6739a4d626ca1df00777eecd105a7e72aeb1be910a44c9d3be4aa00e70c25\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52ea\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f4209c1516ced38e23a698f2fc59f604e56c30e06a1cb7b1c589f3d617aca8a56aea47614063a58d04deed750fbc1e2c170629d7889e26e95c64d3b658c7538905d194d5538f9d0578f97aaac3520494006fe8ed5ea4118540907b045326452835c6739a4d626ca1df00777eecd105a7e72aeb1be910a44c9d3be4aa00e70c25\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b64c6d5ba93dfc04d7a168f3316abb231668ca1a",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb600000000b0eabc15bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe500000000b52cf8660410c1a200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47874be99750\", \"prevouts\": [\"4bbb220000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"61aa810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_11\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"754c6bbbbb47123cf5061653be919e1c7e9a44b19d1ce850dda4fe02230e9d2ccca6bac0eee738facf790fce0061d544554a12a0db3a258a8b1160c4bc835e8282\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a3ff602ec2a4530a3b327108b02ffa864190fea846935b9da5199c0fa9f6e25833749ca4ab1672e94bb4e0c8de654f2190f24c0a1334f37b25a7954e4b8985c011\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b66c4be98c84d4c925dd2af48a775cc657d0344d",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127080010000003832b55860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f600000000395e212301b0d0000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79609c18144\", \"prevouts\": [\"126f1200000000002360212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"1cc50e00000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fc2469f70d2142b6c5a1bc787c6753454192d596cfa5390f25fdd84f537c2ffc2924d14846e63516a9c8eedfa1d017bfc24af99d1ad2bb0ff02030359d376267\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b6737bb08c29b827385850c321cf5d8413acfef6",
    "content": "{\"tx\": \"7712fd3c03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc600000000fa2131a6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3a000000004f6247e1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff3010000003fb10ede01318d5900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac50880832\", \"prevouts\": [\"21d5720000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\", \"a3c12000000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\", \"1de070000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d34c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08279688f26c44e4c38ecd8996ded351dfac291f6a9fe2ce500158a378a1caa9ee2234a5a049dfcee5b69ebdb7c70e6242c675d1abc9cd58c84d7f9a8e8e1277a43a4337ae81428241101d56ff91a1822e405405037c9afab8da6ba5df5d84918ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52d3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dac4f378a9a739f7649f71d424bad959e415e848838a94c69104635e832cea3b9dff863108f68b54d204f4b43b2fddebfd69630b8c1a20ba8be96c4e7e2557a5003e045cb689fe4fc6de332c618eb0cdce02c2dd8aae7c6dd6f70bdbaede2814\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b67e4f02f0ff506105dfa4a0171d89ceb6d26cfa",
    "content": "{\"tx\": \"06cb7a96028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42e01000000df4b95b0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3200000000adddb4a50374fb5d000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acea040000\", \"prevouts\": [\"f3563e00000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\", \"fd30210000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063cc68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823b9ff415677aca4bd8bea8fa89699624d8c5f018d44ea89c1d7716b3c6d0480766d64d66e5a8ef59726e977ff218232e5171732e5d132f479dce590bd8ea056135478fd9f7e773d9cefb2e6c2d4f28929a19e0115b3c92e29fd8719e7d86d1ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93691eb1c3299922e83783cf541642d83e80fab5b37c6dac002e0721b387482d418e4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0d00ae7d77688765097c61dd6dc7203a99b1de19633b0fe895af4a245d0fe1ab9735478fd9f7e773d9cefb2e6c2d4f28929a19e0115b3c92e29fd8719e7d86d1ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b68b738158b1aed99780946dcf5925a67eb68cca",
    "content": "{\"tx\": \"103e89be02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b830000000082ed4bd360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709600000000ede849cf0184480a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e70c17ce26\", \"prevouts\": [\"149c1f000000000017a914bf07e8218e5a3c93fa381357100b6dba1ff2a91287\", \"e7361200000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090267fc598d5d0990aab5eca74a300797727d5da5385f212423b091cc7f2acfa60548df3a5cb82ee4c876de16da801e2ebd5fe8475cc30cadc6702ebb12f00b5f8539eaf618a09b5181b85803347fb9f8e598ae19bc63ae84dce1ae3f9e8e7756966ac249855ff750144e912780ddd39c2a5b70f27bff87d7f00fd6285e51ef24ad582ae24bed990085c4cd13b0d32be8d6aee7b079890ba38b8e726cf7d44e1257930e2dd64fd41cc58722b4adee6be37aec54fb05e620e0c5b5d63802f527cf867e5464d1f0cc86a192d5e93a8d67bca994877e0c81d3b0de7419ff86db787da60b4172f12dcd47bede99d2ffbb72d43f802d915f8d948e41db713e7233e210523126e4470165dc66e35effc2da885e5c464a64a6b899fac7fc25835b4ecac0b8c07380e37a9fe968a4b4860fe840763e665c85d5da803d29f5e5e32b896b351f0cb77ba4a8584a58a1493d06cd69dd2b1ec4308ba00bf6835c6c9a23ddb8f1799d4c886966b226b1d5090677ed11e50f295bc0e61f484dd42e15dc48484ec0777f3b03efe6110ae38a3e3aeff626cdab476e673b68804f5af62c17895fbec895bc6a42c3706cc48774dc6a3377867b82ae4421478d29a97d78ab1a0cace6b97b123de08f39bf1f92ae6603c8b0584092de737e7a317bc5141764344dd8f4fffe096f4b360f4111657b613d3eea8d7b7d173fab23a4b67316419e7fbc8b7030a418d1eec06be385482375\", \"437d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faeb1e69b2064177327a27f356e828bc3139f73429a3608cb2420b3294d8fc1681cc59ecfca53d850b1637d6273d8700d7dc702fb5baeba7c0d1778aadee75959b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902783b6c6baf1e098e5de445840e1ee526e9dd14dda816a7e697dac5d31be1ef733973aa233c2167087e226a7b8a6ce4e0a59fecb61f28bf9a74de3e6c796c7d73399f9de452978d7b488e61c3e232707b4abecec3c5482f190e16642efac6fc8cb99eb6603b226440193c324c9896b2b3ff646e40dba03a8b0e16b5642f75792a7c7d524c4e6b3150aaf6a8b081494783a76a5c0ea4cc4e206cad37e0392f33b5b31b0983aed42db4660796319245b56c3b13dcd909370631d91c65bcce5cea7f80ef52fa90352d222dfdf6c8af7d7becb37405ee4266af2d36d34a974bfc828ebf27242b370e4caee6d399117df0e27a33f74b3c0780bfbeb43ff6649cbad7511396ba9786b7ddcd021c5752f77632dd0354dbc44b30cb638fdaf6be8cb03ce428835dc962809414f2fe1a9a5927c648c1f0941256175f203ee8bde81b6320f2e11683e77837d7a14dba5ebcf0e5fb2c42febae600f4a6f5610b47a7a16c8989c3b413cfeb797bcb66b73df50dd124a2ff1f798b0fc5b17c5faf2f98dcfe9584ef1ec7239e3fb29a136a31e1f96e3dfb65b098fbf9273cbad3879f90e0ae01c8fbf06a7a09c4aa8c1117b7ffbbfcb49a1b32d1dea98ad54762256b5c871a52da38b8c2f9b1a4d2aaebd3d6a6dc9b0eadade95ae3d17ad21b6ecfe9dd73b775b1416c8d7c3a06f8f3a6e5b4af79e6993b11a6b6870e3c9e0a78ac6a6b16eeae2d344bd22fbee6f7107b75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0824274b5900613cb2e14ccbb49f92be42e903262ce34f92c4d0a103e0ecbbdfe862db79fc77699d349d3583c063c1ca5cb78d93faef419ab336fa45db1a25ff641\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b6df4711f8c031a1f3fc609594a2746d2d4e3d62",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1102000000e34a2009dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bde0100000060eae28fdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c540000000002789cfd01dce73200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acae030000\", \"prevouts\": [\"6cbd6c000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\", \"4c421e000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\", \"b0574a0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ea2a8543d58089589a40b07f9ee7d8e6ca0b93852ee3965f129beca3d7c8c31858b1e7cd9247161961c2f08ce0d61fed0332457240000658dab3fd5eeadaaeba07f8f0114379a61860299044b9887ed039c5468a2ad50f2d9c91820990bffe87f5a49fb8c34aef2ae4d76dd932bb9256d3aa3c8b513260c6b544025eb4eecba0a138ce6f273b00f5c5a904db028f1f2fdc4ff0dfb2cbda1929147478f84d9fd3bc70b914f3299fec1d849be2dfe5e51902dec6e1c88bc24896fdbd7045b7ee7f5807f54b27f6a6932e7ef3b118a75f9c1189aefcd3b0d68151acf6db87aa01b9e657354e9502a308435d7cdbc2039e46cb2de6027aea7d5f7a37bd3587ff6b27c787b8eb3512d87288180fc03efccb6f74cc1685ed9beef4a7f3dab3cd913e93ef088c060378332ee4e4ae97bd42ea901b63a5c87bdce557173a84e659c9ae69eff47d8a5f945305ccbdd689bfc41da73de2b5d6b0ab8cc7c69490c6187d4dfaf38e2628d801bbeaab7a05aac804a3f23a73c0698a3d4462d30f7d1eb3893039b2a0bcdccb5f529a42fbfc5ff5daa945f2c7e28e48e151def0b9a53f5e993174cc6519630b4ae1678ecb77195907b392be24fbec8b2683a932488ee9f2f85cb346a06a033a8e05c686407a9eedd676653ffa7ba700aef9bb5fcb36081889f89a2e9dd89088cf4a9208cdff32ba6450ae0b74f891a15eff8a7a5a1a7905ffd6d70a56821de4e8b8036e75\", \"8f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad1d8c040d98f7e016b556934cac423be94b74d6bd2b0327759368d6fd53a8bada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457f8fae370a255a677f2f729010dbb329fa966ed9a0dd82e5083dd7ea90426dc47\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902bfbfda238b86155a766904b0624aaa9ae74aa5c10ce197c8c229b94e56a4fc85ceed26821a1ea73c92033ca70e957b8dbd9a9b3abe4057eae50b98894b4333e65e01058f17698b3f88d538617a3b07ba3e007601e1f66064a1f6bd45e603a182b0240b651af669f5567b1e754e8f43c5d14e1b42a55a015c9abc0d3483b97c5c8a26a6eb12f9fa7535ec5767928c2660e60d0dbf72182c6bd2d6a448bb4bd2e942a76290c5bc83fb46a8ea2642f3d34be05801e93805c1b4bfb9a63cfb81e3bc2bff57ba188746dae79077b27fb150d02f6ded4cb71e56a2a4201728d78a63e1246b2ffdb6d4b3a36637d0e950ca84feca553e8f4a8cd1102deeaf3ef5429c4a35829b4bfaaf93a8d53b1bee41947ace99d1081c0806edc8a8c7d2d468edfa9bf53bf7f73367631579c0e54dd7c58ecf8986974d3294b1824e0ef99db38354f9250a79a9157233c47626f1883734b3ff6443fe8f2cbe4ac3711ca63560ed7c877a793b4f0d0e8be7a3fcd60a22d5709fb2a255df764ccc8190fed807f26fc4e7e70e265f752aa310243b5a3d5ecbcf84e4309cdd340b0e93e1b2865ca37530dacd4ce6921d48273c78ce05be0d8e1734aba468ad940209d8dce8a20855b9009a7c013344fa43a591369b52d95d7257d5679ce5727609981a2683994d62c40d5be554d9d3a5b857179e00cd75a5a9a27faf76e0737e46d6cee23d300965f6ab002262d0dad76626ddf175\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93659bcb84e47153ff4e79014703dffadeed7ba3d8123da0f5fd44832628b9f5c46a79f40e3d51694d686dc3a1ae4413ff10533c43d32121e1e1cac9518583e4de2dd5f972b05e2f18c3e7c797b604beeb8879a3af7f1e10968a0ac8aaf9d489fe7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b6e1970eedbfd9c6a474d94f15274687adf86c2e",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706c01000000ba310ba08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41100000000bb14c6b3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b42010000002e7adaf704ccf9680000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987d84ad23d\", \"prevouts\": [\"3b2c110000000000225120e0fbe9053c6d2a439b1df3d9c89ed0e68b8279a92dae6907e23437dbb3b4029a\", \"a9cc330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6891260000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"2c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa44f4b784770790344d4d1238d6245096bcc9e2ff88373fd56766bafd01d3e44ecc62bd398c27c2bcf203967681d855a98ab83c6f29a4f091e05b1c584209e732\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c923690eabf3e888647cb597bd60e90f4b3beb7649a22c5f2f6c3fb70e5402f8da733fe71e3ce0c37752cc3ed22f63651cf62c657cae6a4db35497744053504dcc62bd398c27c2bcf203967681d855a98ab83c6f29a4f091e05b1c584209e732\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b71c95db43c402381d9a9673ab063f0735eb1d31",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3200000000bfb51208dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf700000000ddd630b103d1d6aa00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796cb000000\", \"prevouts\": [\"b68d4f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ec455e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_4b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bccf6e13050aeb8ac005e70d8018d8107e34f741b2369633964dbb497d651d804189b0cddd15cec8b0e3759f14988585d474f90d4ab502756081b2a349860d1981\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"51599d223b7052c676a9454d653433b56f94f2697326ec796cd3b37efa0d666e3e00920c32fe2613350b98393a273c95605480fcf1b625dc2a4b43c7973c7ff34b\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b71ebb4f48a1c213c17c8b1e9166cc38b072dc9d",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3500000000f75e818ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdf01000000a0889ad4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b87010000002757f8a404a146990000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875dfe903c\", \"prevouts\": [\"79b65900000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"221d220000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"80fb1e0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"dd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2823dff2991922f121728685824385d20f53064595141c17e375e09b6c17310e1f075c573bc42ff1b5fdcad1a87ebee849fc17bcfc5c414a2a4f901b5a19cd44f11caf36eb2bc7b2ba56ad05f43983925bc55248f9b66a13a767efbac40c00\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045d5adfb4b655ff7e7194216f0c9ec7a59b69961b08133bf278a8ed5672f2f6a4fc12d2886f924517b8c41f4755cb69ff55f68e740076f0e346dfe7ab1da23e202491431d89488c08702db3cd2303e8a25c8ede371a8df5f96996e099ce5df632e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b72daece9e0661e0bd4c8a41d26c73ba8eef4882",
    "content": "{\"tx\": \"81f75e6703dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cae0000000014a05bb260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127036000000002ce4eb9c60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702201000000586df89c03fad66a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487470e335d\", \"prevouts\": [\"52384c0000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"aa2a13000000000021521f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"06580e00000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e2724605c4d92803b851d6620f06e0d958a4b1b46f4b00b63c352345415d348718303dca66502c00dbb004c294b733f60a36fc50534cbd729ca50ea92420f08f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b795709244b876a1f75a1d801c74732832748ebb",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf19000000009d3e6ea68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44800000000855c81ec04bce4aa000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478709000000\", \"prevouts\": [\"c8fd7a00000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\", \"b6d4320000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_fe\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"73f0609d8312d50f238ef85197f18969449b5e42eaf67672e52d267bc2ce04873cbdbe489a991fbf55ce250b5deeb979d151f00834aee929b2fb5fc830c7e4a783\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6759884cd9dd6ddf52603745cb0d4119162bc3252a8c5ecc6387b2ff47b0b12c26281611269371ea660cb960f3c06c3a0d343d0e4135a13c1ffb4d6c5e43ba69fe\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b7a501079daff65d0e768364b11ab44c69980aa7",
    "content": "{\"tx\": \"5fbef0bf0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e4010000002fbbd3ce60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702400000000b17fc38b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4020000000022f32a9201149c1700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac6691b05e\", \"prevouts\": [\"0bd8110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"02e3120000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\", \"37553d00000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09022809a22ce415cd93da3551dc7ffd852852cab6f35d23cb1d0d7e613eed9fc66abf2e19981a69be7a410c3cf6dfbbc6231d86b6a1e3b66a6c09bf9e862619cb01695f6cd14c2f38ed754875265275921449bcd49ae4f519d7991c8db15da5f847cf9ded8468e0d7d8869beb37f5a0966fe88dea7439c83f28be66f6310f2ca48ff2c078312ff7dfeccf1571f35d440fa1621e437680415a1db4328534cc3b94b59bf9a302e5df863888cc6bce065cff43d4ffe433ab606a3c424981a47ec784cb08bc42021ce359eda8dc514f8b5483ae94b96a1d9b4fe6e24acb41cf3e61d90828d4df299ad7c8e657765c03029efbe005c678a7a749ec5e37a58c527bfef0de1cd4eeba7a8dbf2ac25609e6b8f80781f774cf2e8edf1c32937d430d05a32daaef6cd68e07d292d7a826c330f1fafb00bad4c8b81b8f1c7936c7b5ae82af8cf3d996c01da49943982a2acbbd30e5567f2ec0ae9d162248bf58a345330711afb2fcf9b78220b5f12948efc31168b9182ccd59653533d984156ded6008c8939c8671e8c11f727bbc6345131b4fad70476f8d778655b6183ae5e15376d7f2ccc060272d13e30c21ec881b046f01434866929f57ba84fc81790abf3e5410f472b77a69f45fc8c9d2c67989736834a3b8b8cae459096aaadd335aba72b1366cd10aab3a332cef8714d060ba2dc11456a0365a972f8264006ac38f77164895932d9ba45ed2fb62e287375c3c75\", \"317d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93631b55cc0c5b23f0878108315b133cb569cbdbe54eced0808ecfcc8dcd3b5cd21e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e84187c77ca06c68e3a239e6fea37385de49c0e93bf09ae3a990bb588f1e26193612f65ebf74c8b951b09da599ea3d6f486010b8cccb0a2142ec39aae62c1ca3e7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09029ea27b7aa5fec2c6f890a40deb4f7d968e92c778d31ba59576228222aa7f3216dde170cce0627ef958c3ca920e9a2ce49e8b562413fa8aac8c9c45909fd83bd56eb890f642f19abeda30106d70e81c66d2c0124b2ce5dfd2f284f114b16b872b5b7025a3174492b681d51f78978e3dccbe7cc543ab7a4ae59366d1bddf226939c70981719d45ab400069303974689b4708742b6847562484d343770a7271a4ba3f3a4247a862d6b34382f6de0b68669b67b44469b5c7149539a3a3dcb688a6f700715e79e08d81b190afab120018763bc5ecfe7798b36d5f3c4fec0eb709beb648672433ee1ebd5e41649cfcc3f8409b317fd7c2ba3391a18f299d08542ed3ae9b4d8a498bf4b694a2ac403ea0629a5f4b4b448cabfe8696eb3856fdcc13b8724240481507aa3079024292df65d5394ea4f58567eb577440c64b4acfe485eb01cf96d018193c9e795e7d40af5e4f6d83b08be0a28c12befe2fc20b6506912cc23eddad14ec750fff90f33ecac2e82c6decce27bc4bf5da9ba9ca6746d42f16a6dc4cdd26a5f234baaf7a1b109f7d4c5bdbf3b02f86f69ca32abbca3b2934be5063bd6b65f96817d5248df49fdc3daf99740241d2d80763f6a6f7c578d57827886ec5513f3da4d4fa30f4776b3a598a9f9ee6337f4f198597f093be704d76a7e557dc1001000c3d6d8640a5e68dc1628df821d3a79f8ce3c70a120d15e1bc23b191e6a047648d7a2b9075\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f104fd43f647cf48bfa03c2b2a6872b15b37af0458c377c74f4ad739ad26066de4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e84187c77ca06c68e3a239e6fea37385de49c0e93bf09ae3a990bb588f1e26193612f65ebf74c8b951b09da599ea3d6f486010b8cccb0a2142ec39aae62c1ca3e7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b7b1691a7efc0fca08ac5b931ccb3dbf5aa891d8",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5301000000c8edde918bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43e01000000b111da8a0260cd5e00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac99d03b50\", \"prevouts\": [\"5d9f2200000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\", \"3afb3d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_bc\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f5dc1e9f5a2e36ac4c1d6ec4efe5c9ba754ed1eca39316121f45cfaa9e9393e6aa45ab57aec86393120554af15cf16633ebf8683f294b241ddb9349c2683927101\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"95f49ff7c5d6609b50c638245a04fe676228f552aca436297f596b9c7ae88f49d470cffa6ec0b8a5658731c9d527af5a8c5070f2c37dd8bc297d0976552f198bbc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b7cc907a8b0d3c3e1994be68a40873b4e99a5f78",
    "content": "{\"tx\": \"2bd6955703dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca700000000c8472f80bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4600000000d13b7096bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf22020000007262dfc601ef371a01000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac991f5956\", \"prevouts\": [\"846a520000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\", \"8cbd7300000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"3c5a750000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_de\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"60ee1849f70397dd53b2c5014afd28ac9b5168cb4fd39d9cfe2a33bcb509d273118e3cd069227e56503feeeade700105f347e8f4db802570c9b84f37bb349f09\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"811911d8cc800e5bac115ecdd09729f4ec4055b4c97e67cb4b609bbb718e373cf0ef14f4c237699562e12211b9427860736810871689943baf1238885b4aa45ade\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b8079c5bdcff63a0f477e2f79dd8aaf4928abda7",
    "content": "{\"tx\": \"83cc59aa02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bca010000003af476dbdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc6000000006aef47a201686f3a00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac94020000\", \"prevouts\": [\"5b6a1e000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"26871f0000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368d3aac2ee03ff761670d75d570c1e6415f11113d875e7640d99f370f2f823c02e22a66b502779d6b233f9a5a075cab3b2a5d3e595dfdfe607248b2d2d8734c7b9f4d7ab890a2001a7be6cb25cf630fcd24657943ff80a7c5a11988ecbf9e80e4620a19fd562e5ef578d66d29c84f34a4223ab3b995d34ad300c7b5f252d5e140\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360c9e55bc2fe3ef8dfdc81a5c5017743f46c247ba513700e3a77c0392e087a2b01863a41bc3dc2a7aa524e62e66740ce82713c2a995d68e9803c1affe373c89601029910a453e765cd82c29c3b576a90579a453f3a941b6b6175fa922e9a13196\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b809617c671f07711eb77d11353900df3a1020b0",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be200000000ee786e5160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bd000000003fc93dccbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5c00000000b8e3e08703aa61a2000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a678fb6231\", \"prevouts\": [\"1b322300000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"217511000000000017a9141a56e0fb41afaf4b9e6feff1797087c69015162687\", \"f93a700000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7e4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4efe8c29822d261ccff72913d153de8b886275dc8d15210ffbb43fd45d8b4e8e401215e29d5d13de3b6ed62165bc3378402ce71158bd1208562fc299f33fc22fc39b3065f81e3c179a5faa7416c7afc60db6bda904d6a600fd6a7a1aeafb2cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c527e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93623f8fe7108d8d2644871df6900a0fe81471c37675c8944fa27134bd5cabedd2fbe9bce0da1a8e0eb2f55600b1edecb05394963f1d059e6505f0ccee9d28b62f6faffec7faeeadfdc2f9d17b998c1a9153f333fbb08a178932d29a7211446b62a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b83c1c0b8c3121745e8e5a5de023dfb379736329",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45c000000001eec319bdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc6010000002d1bd40e03dd94810000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79633219028\", \"prevouts\": [\"7cdf33000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"d3f44f0000000000225120d1b91456e68c356a2c859a7d0862df581c6fe76c88121c19c4713ce29cfc8e45\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936050e4717a932781b58420bc98b1449b462749c8b90f030d521274e1d9d2820a1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aa5616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b83df399d9754f536f1c099dfad005119a65be7a",
    "content": "{\"tx\": \"32272e2d02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc400000000cf2c1cae60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d101000000bff585a60172ae45000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a69d78181e\", \"prevouts\": [\"f8e8500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ae000f0000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902fcd5ccaac3277274c885ecbd13cd7175500623b9fb97ff2f869e2692422865ba8426b29a2035ebbea3e832e99a94d94e6dac5bdbc1bb42d9c1f8f70400fb21cc130256499e4516eaa82142063a796eeb2961ffc895a7b136a5e0a43990d45691af70865f1ab456e27d4fe486fc548bd83dadbbc70e68d20f6b971256042465618655e7c3128ecab20b656ac884fd444341babf56f6436069541e0ce70bad083ba2bc3a792bd0688f057880b5efe97e51cb8a0562d4aa9f4d93deb74dc24dc6b8a88657914dd12b864c65b954fa26ea623a471878ebef7d6420b8267ca25142dcc545e12ab34bcb2361ee6170a765e7f2abcc14d4e7b587f72939be775268ea88b4b29b0c21cbad0972f1bc16d4c28a6e289ecbb271faba2a2245f65d76a07196fad19ad8561f01a07947dc3a2b088a66d47311ef80ef347ea40352715d784a3309100254a0e607c7bebf436a857e780cc8aff08b6fbd33d1b78fe3ecaa99a7273933c5125817bc39e080841a5c93f5cd22394ac57e834a0e263e30cbdce9b99cd5c01b5e49d5047c8d03003e07b7bb4e189d092fe76f8bb326e4ffff6b45daa5a555900a9524fcf9507f09c5a787d85dc604917ee8730e63c521f4255d09fdaf339a7b2ea221d76d6a442f139cab05efde25c3eaa2d2218a990a29644f68678fa12b803c4c39e21d4ec8d1610dc699e25cd509cd581892d63272b5663774b7b20a1a9e53faddbfbfa975\", \"f77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ab40a058b7c313978774c1555b16602cbe206701d99a72007414dd67b2fb202e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e80a4dc25bef94d3da1f821dff96c297a1e496d55e040bded104527be104f359289411b885fbcd56b4d2cd2e695cafde2fa2de7097172cb34b20e1fb870aea9a6a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902aff08fda62482b24b5f32fe34827834434205911d753f2d77ecc56d42edaa6d653bd43e1721a9b1f588e2ae2a1e6d987530d402a1e4d57a8861c7a976b079a283bf88c46aff9e94f08785978372c4b2af5c352f399fa25f11601d6470acca48e4b396d6b79a1209c8006a0a50fbb371065b7caf28c7af6aaa3e5c9e6c4ff2fc88de04bd91cedc9a911c062a1a19c0a3e42c4b04e4cca5e3ef8d64aca722ddbb6c6fbe6349b6e6683e3919869fc14cde247bc557aea4ffd9141a69416aadc45e5778a665bd58ac91b4726726cccd8776dd01a1f88512577b0a9e0e2109fd4c8ddd4c5a61b70909fba5743b5461137c9bf7f4961e4762e797553348b25c97e746f5ee29dd1669bda8c1a024502069815d3eedc9a4457d00c9a070686efbd4baf749a17bde187f70ccb0c2820c3346b62ed6ab071a4f60814f8a4c7a7d18074306a4a7e85ce2ebc925fb8ffeb64c316d93ce453d9a36fc000387761bce43dd5567c6d4e06dc522521b3aa39cea40a1305cb1c77f4a251e46b4611dad3f9af2b6d119b9701b32d6e270b87fb26fc1ec8a83fbeaab7eb1dec8d50ce8a5b63af74852c4896d80e3662b7ca2424755955a9c620a4e854c4bdbdc9581135488ebc3fc902ec5d4e8a439d97e17843e59d495e33c05adf3002788c245e2deb1456cd1ba1c2d10dfd951e5d5149865ee9acb29980b163865388cba2b9d516817e360cb2c76a2e580a8fc5454a05be75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365b7feda3faf3b509a00db86c0dc57451a75b4c8e29704952ed7181b28626181681b72a8cc1600d8047fe8b56626831fcb5b55f7ee61ebb9b8b91fcb4b55947dd0f5943df1a7722c938328966c7e5ac747f85bf050d43cd9195f6df88860ae066\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b83ffefda146d967a06f51678c18eff540980695",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c429000000006320e29abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5800000000394a92ad03058d9d000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fceb010000\", \"prevouts\": [\"57323200000000002257202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"ab5b6d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"dec9becce88c7c6ee39fcee29799b588f4e9694890ad4d72d43cbdac13b43b56712e17786a3b14e0edfc289967f985fcfec313b8d86e770a57ff687c43ebeb15\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b84cd36f16a07a3e7153b397d87779a08b904316",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3a00000000e20d6af9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c56010000002af908f40301a1b1000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487363aad34\", \"prevouts\": [\"c6e55a000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\", \"0950590000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"3044022052f16b724718d5d77b170aa4a0649894eaff50e35b4ba654ebd8133c9d49ccc602205a22bc37c35edbc45a40b447096237ffc711a1d1c5e07f7d78c960db3354688902\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"3045022100bd8d09d38b897f1c0801b75640ac816877ca0cc745dd3164524ec5dcf23645bb02200b3ccaaaf17a5c1b60126f10109508e8bc3f64c74993be06e5e97c0df7f1c10602\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b8500830a3e73890fbb7f1b5e546f8dd9a851acb",
    "content": "{\"tx\": \"e051097e028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45500000000dc24bba48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4730000000064d00afb0499a17b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e789010000\", \"prevouts\": [\"24093e0000000000225120c7cc4d9ecf94fd1d6052a234c093a72236440d0ef34d0ac6810605a4931ceb69\", \"e12440000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"937d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c6989904a8cde4fda674e6637e527bd6de2a53b0230c00b4e7a907379bd295f79625eb62ff27a7a3a1f9ea411032fb959ab5a0c50697db7fef72f456b5013f4a62d371a9b01f30ea116c30e8195d2d6eb7c97c8692c0c95de95a904f83b96ad4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eef80e072d9ae36a55284136a2c9e76672de3126f98fa88525427fae9ded2e51f65737139d8cb51b826e6105ecbce8352aa10f0d50686f2268ca6d7900ff7d4462d371a9b01f30ea116c30e8195d2d6eb7c97c8692c0c95de95a904f83b96ad4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b8684e0746d02b30dd7444f365d9552810403e85",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46d00000000e4e24797bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd0010000006cf86596dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbe0000000039bf39d9014d7b6700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5e010000\", \"prevouts\": [\"b9ba3900000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\", \"cd767b00000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\", \"7a8f2100000000002357212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c0366ec45a9d9bc801592451e6399fa02357b8334be28646395e2ec94ddeb39bb1543ca1584ea503ac3e69392f5078ffd6b6e91116d56d4435edabf7e60c3346210b38210de6eed18078ec7fa9def7ef716a428e93131bd2794f7c122831166ac03a540c31f8690e86784c9a52b0566b025d98d660ac37324cbdd21cd10c5515324223f91f2f2364f3b9a161cc8d201503f97a8a087b890961c411eb315bf828248be007511906992f2eff0c0f69bfaffe8edb48e706bd837eb7a12b0b5464657b0d4d6080cfac16d6ab7b26f7ada4e39c077b4e5d36ce06ff4de1b5361c1db735067d04aa8f6a550285f3785440f394eb3c5b987c7592af4161fe625562d267754e69cc133001d3f3fff9868fdaf8f671140f32e95a6daf081916d95d71c134070bff5a89b9d3b347bb83f8e5d60b6c78b7be40ef0eaea57ac7a4ac9ccece84d933812ca2e8cd2b99f18d74e69090d07f2bc3dd4768df412c1e22b7cd51c4a1660cd7dcb23c94315b7b5fb392c72bda8af2462da7d0b12db581ec3bdac5eacdd03f5a664e7bb64b6c1a2cd4464538a2969ce7c8043807d16792880a2c26b4262aa814ccd540735f14795a3328e4ffc86b95c6c68d71b197272c7a127bf23fd3a7edb03dc474461bde9a1ae94e881ebe8fef3efa2545e93e734fe9377465ec16a3c1169b72040e1594a4249781f8b93bf68fc19d06e27b6e13c65d5853ff89bd01f48f0849c5f667f675\", \"a87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082337e31cedb20dd0ec36f43f7131008eded9387a241f89ca892d220549655a6e95def3d75afa0626f5ab572f3c9ae49b6567bf85ec43d0b3933062a3ad8b1e492\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090250d67d916710fb89098556f00026adf7b864251a16d2cb7b2d2b61c409a5a4d80260cc9c69f755a8be6ff363326b30e804216b940723a2db3e4c66a11c02beb83b3f4eb3bd7defaf0aae6cf6e1ddeeb1d12d32da2654d1b983f1e826d0733ed6db62713ac19998f8cf6ae472b5a1b45de9810e548d9ed7f3019581983ebc882a75e4d3b31153b28bde33cf86d8a5ab5360ee3818747f452128d16f2886535ed99bff3f262720527fe8628c3c9c966bedf38180ddfaa743a58b96195e0fd2389d284d15bf4e75c28759bd80457c4b3de89fa6a6751a888346094a99479cb9ad620348f838fd3648154f1cb56140018031883614ac7f7c2e0d052ced1f65223ce138a2170f221fe0b6e628eae6c309db58fffea2c9ed23f787951fe32e37a24c02139055a8004b8df1faf53ae69ca059d97345aedbad464cb1d383be4137ec884c5b89ad8be4c74710a3a244d498840b4effb5fc489d1e06b40d9f8639ea2dbaf645af36f6c0076bc791245a6a26056653019da3e004a424dc02aac1fd8491b451743610b7d33b30f841a3e4374acafe4a49e914d111585d7ee95f350d4bef51d1cfa650d2a031b57625db0fb5f8403829c1ef4b1626f0ad61b95200cb870b71fe93f7e118f1254d918268b1b76519a5fb06b17cc111ded39d4b91d12d5dd38c46cdade09bb546bbcf073cfccb0a37304799665f8bea124ba6c01560e7a1184f237b7bff1edc1340f17475\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366970443a5f937fd7e30cf678e864feb942aa0b5cd234984b56eed725c04cef145480c0b3df47fa838c1e54894d9f77b7e2e8bb4e3c514b095e8a55995fa5d8569e26d26d9f798657ab1642d8194f1f5dc9158412142f65824f82701f20125ac7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b8a16da4c5a5e56d3c75e8933ac8d444b9d06ecc",
    "content": "{\"tx\": \"32a22d0702dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2500000000efb94c898bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46401000000695cd28101bdee5300000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acab3f1920\", \"prevouts\": [\"d04b53000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\", \"5d2f4200000000002251207a2f20e860cda556c5e91362c7f67d77fa79d70cce9558dd8fd8d88940237552\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"537d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93665ec05b081d8cd7cfb81d71467256aa2a6894d13c77a9fd61c7ca1fe9e406c9b2e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fde150f8c7b4812d3362c6afa34922f3b5cc4b63cc9e98285537a088f4a7fe3bee\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0829a54256964294f7e46fe5d25ab3411c34d3792ff29ea326544b7c68695f53859e150f8c7b4812d3362c6afa34922f3b5cc4b63cc9e98285537a088f4a7fe3bee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b8a400a5412cc152b17a2cda851c5874dd5ead2d",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bae010000006b85b084dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1c020000003e333c8a0305983e00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7beb20230\", \"prevouts\": [\"9b361f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"07072100000000002251205109082c92be6cdaf88bccd1fbf3eb83cfab83a783afec3533a63ba21c303957\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936354bdfc687dcb90cdaf5d25b86065c592329a4749c4c36a0ad850fdc148b768f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a27616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b8a97f2ecce17499487b6afbfd74dcdb69711ff3",
    "content": "{\"tx\": \"7f7876df028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4830000000034c2a7f160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270da00000000bd4927c901e6090f0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb48a7a2d\", \"prevouts\": [\"7e07350000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\", \"36b70f00000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e64c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93623815ccbf6fec00b3e507aa7d5724ef597227ebd84c2b7f91468956cf3ee8c66d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51575d1df7a3e4c47ed4bae99c3344f7d42d0c4d3b112e8138771efc2bc74e29dd3ff737734404bbc9015f34371be38b9f5376f1a60720e7cf7da81354011ad4f7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52e6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93697a95948ed2e3cb613b3ada11a161da3add6b7c74ec133d99efecd0d159759ced300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51575d1df7a3e4c47ed4bae99c3344f7d42d0c4d3b112e8138771efc2bc74e29dd3ff737734404bbc9015f34371be38b9f5376f1a60720e7cf7da81354011ad4f7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b8b534195cd5db1dd0cc83d99d7face7ebae029d",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705c00000000fc3ba74b60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270360100000034bc366cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfa0100000055a193d8039f024700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca335554b\", \"prevouts\": [\"c58a11000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\", \"75690f000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\", \"91f92800000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6abe\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f2d5359d5c824637daa1dccfae2526f7581d719b807a72f9216dd7beac93c786d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51f60e2d3154f769650886384bb096233f0069490aec77c98efe910f3ad816f81d7a9dfad218b10cddcf05e9e788f58784bb5d8eb58cc0f6cfe4d23ba63d85e381\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363048c6f46b8964ec3ddca6b987410b71b075e8047b63352cf4d6b057f019c8edf60e2d3154f769650886384bb096233f0069490aec77c98efe910f3ad816f81d7a9dfad218b10cddcf05e9e788f58784bb5d8eb58cc0f6cfe4d23ba63d85e381\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b8ba77481215495fefc3d9c89e8e4251b1514f9b",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270490100000013ecb1ea8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47c0000000014f64124025d7c40000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acbaacd11d\", \"prevouts\": [\"250d100000000000225120a2880b97adcad5e9d951ecbfc4186ac77c307365c746cd6918dba256e34886ce\", \"13f6320000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063e468\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93632e765439daa048bb33f9db790a8aba9692d1958e0de693fa6e1c64f973cb8f2d53bd36d32adc19f711473d01abcb44e7ab561baea4d664230dfa9381cfa8f4828a09ca0f6d73d82e88e284042e116dab9fe2cbfafc110f6c0fbe5b2788367c646ec42a0fc3b2b57c90387175ef14e4ddb9fbb252ed168d3260bd00914c11302\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51bf410b10c26f46641013d73a91af66d7632b0672c14a8d3b0dadcce48aba69ffe0b789927f620aeddbf74aea18c74264c468c5fe823a741d176e0a42636f367e46ec42a0fc3b2b57c90387175ef14e4ddb9fbb252ed168d3260bd00914c11302\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b8c25103015cf79375d6f576186c9bf014842e27",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca9000000009dff9cf2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8e0000000003edc09f0396a2ae00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df9797223689872927853a\", \"prevouts\": [\"872f5600000000002260202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"759c5a00000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"dc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366c8229ef6249eef7d294f23c9bd7511150aaa9bb9283ed908def3a40c2c66d128080c17c1a9ba5ea8a3780f9d0897aa41ac6e03bb9fc27a0b4027847c33ef9f08f84e1cc8430872045fc695723e7e8ea88aa60745b893850b41017408051d8396d96bf27adab25b1c800ec6de9073e8fa8f2a3b567072b632cff39ce61bb3673\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936afd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173a38e917535475cf2110d0b0ae2ac5bf0f6bfd0fb66e9319f96694509bbaa8cb206d96bf27adab25b1c800ec6de9073e8fa8f2a3b567072b632cff39ce61bb3673\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b8c863f970b2f3c39e353171b5902be0355002ed",
    "content": "{\"tx\": \"b76923990260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270be000000001e0361fa8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40c02000000c541bcca04e7f550000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df979722368987fe5af33a\", \"prevouts\": [\"2373110000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\", \"71844100000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"ed7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93653d0566d70d930cda13d1b062e2c88465358c715016c982afb82a06e0ad8ccff998d6970ca8674a6d6a6636f00d706375e44157ef6300dc02db98f8ce0d082c1d19f2c0f6744ba7ac1f5ff1e4bbd0a31d1cdb1f5d58d1dbc476492d0098121b5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362a8804e07b9224c1961ba20baa4cc70c8c0737ff46ed8d377d0925d64085806f229db830b5291510bfd4e55fc2f3a45cfb4105ece0af57cbfe0942d597b32d0c27d2631c3cab5fe643277004a2e6838e79a7dd6765c91a13be066042b33c17d3b131de5807af4725e3fdc8c81388bc895736ddb6e799e7163e8586c833ffc627\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b8daa1c785e390cba67ca10da7ee578c00efb805",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbe0000000064ec2af8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce201000000970d9888023a6b9c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4874e000000\", \"prevouts\": [\"24ae4d0000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\", \"a8e9500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"487d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ebe5e2af3a3c1a6754948d639a5542927d59c509fd5287d02d091c2a39a812b527da89940c9c2be3d3cb1ea9fc374137a74dc3bafe909c68993f298761996d666\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936379a98b85b817e20bc3376f43a8b74803a7c6b50cc59446ffb1c9510b7649235edf94ae33f5606292dd7c11b30be28c4e66005bd3313ca427ad5ed734d53452840210bd7db211b82a407c19f9567cde5a01f8f2a3c3dc032c7ac21169de78447\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b90034052330d016cb6261caaff33ff9b2007d1d",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfad00000000a2a222a28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40602000000952b84bebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0c000000007b93a1dc01c8cd08010000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487078ca733\", \"prevouts\": [\"be076700000000002251206e4088e3ab3053e34fa9f42678349f51acfd745de3b6b8ba599a97db56ef8c25\", \"59dc4000000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\", \"0d6b780000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063e668\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363c8787110c399dd6a0c6d756e60eda0cff5ff48042b3961bab6f48a69e180bd63f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08225f2fc2293577bab1371dd996050d2a4e8a01eb34ee2db6c09974277461b3e6691bbc3b31bcff977684854464ae3dc2a24522286fe393648b51abc79cc246ff8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93615e2e378f02ea6f7ce0cc7f488a9f895da61864d8652fb9a6ebeb0f0a3c3389abd4c1b076909910aa73b6afb36aebfd26014933f900bad794466c6fcd625cde53ff737734404bbc9015f34371be38b9f5376f1a60720e7cf7da81354011ad4f7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b953ae08ca074cfcfeda2be630b7eabb0a0feef0",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9600000000634b90858bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48800000000344f78fb01beec02000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6c14e4b3b\", \"prevouts\": [\"520829000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\", \"bada40000000000022512084127e09a3e5abb8e6ea0ba3ce4737d1c2349f1be422ff5ce1609ab9b3fbb01d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d47d6a591cabcec873405f70266ef9b449bbb661e70e913f5c6f7abacf68414d3da7f20ec44ea0c236deaffde6efab934d360adb6b1ef008f271a526ec7cdba39048511e8e7c789ed514f9b13c26fe9741cce3b90a661d5b889439e5d7d62c33484e62ad4f4dce8d32582292ffe4d070ec4c8f9d723f4844058420a1d2537a8779fb9a42ce7bededc340d517b18f18dff67f3331aaa53e77c1288b33e0659f28d1436a2dfbcb096f3fa7a9e82e4786f556e1925c35cb013c45081eae57c540ad3cab3ce1c281550896845d8655ab71cdf8a708c06d5e54834baa17056693353b5dc04ae9334b2c10884d411bba0cd4e3fd984fa90f4b1e65c93fd2cb10728f751d98256c54b1d5d60fed0e78dcbd500dc356cdcf890680cb3c77c92e45c4ddd12e63ca3d1030639b0f9d2870e33b774e8d3b66c5032eced1bc99d923efa37b6ff74dffa59a90dedaee32c243845aa41477abbc18aea66fd7d8b62f57cb32be897197769682fb2416e7d5ab926f268d9a4bddef2f123b5f72d6a815e7d059ffd89b1153ff46fc4270b9bb40d5a0599c596362d692c06f2abeea5bb5ba7bfee1ae36fdd7cef72ab89f2e37b666bbb7827241e994666012b80d44990e765c6cb21b75d212e364b854e8ce7e2280710fe693e17eb5c2b5efd090243ca88e975a99137aec767e7b0a8cc26a136a7facb806aa7e36a522d8e37d1af4637583ea07b2aa644956dc50448f9de475\", \"3f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368d04e294f7a5b40072490018d5d8a3de038b17aff9339380d2d4333d5f6423b4d728e192bc5f69ac80b4a6e0537a86a2095372e08a2c76143a8a8a3d0ed1b85bc06da1f6599d7e514a71ffa8a2afff73792fcf1df1b953d2196d009aa835a52703985aa46dcbff8b0495de750bd1afe74a661312f7eddf1146199ee1ea8c08aa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b75caf9c5aa0b18720b832ac4a860a72079b0933cd4aee7f6a42767e6bdc2fb299ff8b15d94cd461a60fcec57a65f88997e2b82088dc241e59c4a30edf5cb9514594c59910600c16b7992eb68858c1d504bbb3f6e0b3825645656b307107a06112a3d7232d92b8aca56de6ead6f6ed4d8e1fd6e97535744f9087b3dc8c69a521e5eb9c7c12c35f98eb5170638598eb057617179b6bcabc45e7e7b88822db163ed9c1eee9910c076bedddbbb32366280c40dcd22de76caa6f62f7db968727e17dbe0fb3bb94e9f6b0d47c3d4bac1ac14dcc7eeca79c000bccf71f1abac60157aee194a9efa8eadf12bf8262c205d2c1dd9b5ff12bcc0b83ca007cfd8515c1c96b8a403b18d440ffa22f7ed5d3b99c0d8288e765d7908bdf22df77246b203a9018cec284205578fe41ca1cc21582dd13b7a60d87c99e18f520ea9a0d13cd471a0e1100aafae7af41c962daed23a3f3cb52f0f42dee62002bcaf208cce0461ec5853d9c80a50469d1fcbeaef6641f7911fa6ba4368bd810e552400de6a60423bcf431f3111c6e443a8450a170bef34eeea444080016ad97b889604296ebbcfb11b9a2102d5905e226c5501c6e27a46661e55da12ac9fcba9749541402f49e73b1111297a618b67bad0e43fdccce6edcf674256a1b4d98dc8a87f6cf67340064ca7a4abfb0b16a69f28accb3299af1f72961123649f74b3c647c06204d6d6a850f6977e60376862e615ff575\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8d874772a13c5a1227fda830887213a5c965a8abbda46e6162f44fffadfc4d1ce03985aa46dcbff8b0495de750bd1afe74a661312f7eddf1146199ee1ea8c08aa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b95d3cec25b96ed5bf972cb98ca8c6476eac7630",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ee00000000e3d0b991bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa8000000009f4a9bdb032cf480000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796122e1a27\", \"prevouts\": [\"a2331000000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"dfa273000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"984c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c161624a971c36aa6290c86687ec80062b931dc8c82c07703e18fb2ec2014c60afd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173a4b5563559956b4521d685614895115ff3b761ab3fb4dd1d8def3bf310bb092b594c58b1e468d5c742a8cec262986ad36b584a802070024df25b549bdc05f9a8a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5298\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a12a44ae7bb936654d5435f70f6326205890d9cbcd8f02cde2bb6c76aaa7e01eb806b7a00459a4c1bc30a7ac808d25283aa8d21c996014515e9974f153b7e8517bb22a9d6ce3a4416076bcdc0e15ff24e2eba93ece471e96a0af39f5a01dd3ec6e2c0067d6235544c969c57bb6383bc4dfe8083fe3443e336f29d85bd1c9f087\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b95e31c70d4e1c7f52eb020450f422dc69f2b3f1",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfad00000000a2a222a28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40602000000952b84bebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0c000000007b93a1dc01c8cd08010000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487078ca733\", \"prevouts\": [\"be076700000000002251206e4088e3ab3053e34fa9f42678349f51acfd745de3b6b8ba599a97db56ef8c25\", \"59dc4000000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\", \"0d6b780000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364b15973f9e600691a7121e5a6d9041a72a23eb89accec8cb085df69123b371a0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a47616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b960c57badc5a9291e8064176397f05700f998c2",
    "content": "{\"tx\": \"5d45ca5a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3100000000f9556abb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bb00000000953fe6a9045d685e00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8eb7014c\", \"prevouts\": [\"0290260000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\", \"4f64390000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090232a7d9540e819110b107f6806f46a011f436b75fb93fe17e39c8ee0372fe984a240250a8f89e9e33f4d8f379d28d0a1423442646c2fca29a18045f0ba3b2604739e3bcb29ec9009d3f67a34463f4d3fcc99f56cc92487a0a4d2ad91a6342e074ab46540ebcdb38cd9da5e2b50f1201e593a7a47eb4af02f96189c31d0611e0f4f9a8beb5d78214a78ac25272a79c3f8318c263d3d19c2c5a6aeabf5122827819a2322b7f5d4ade23260119c5e270a0d11141999237f190d5622fd5170bc3a5bed81b8419a8ab7f4c20aec0ba572df27723ee8479df0f9c4b5ee02d017790e84df26d1ad350d4828f9a622afb00a4b82ad5f33a878a0156f5e2d8689edddb11fe1a646924021476d4afe3004d347fc7f4298c0627232902d43b1cd8c5995b2d1ee48dca2a3874e61f8a20048fa0ceca86e772781399b118b25ef6f02d353b23fbb6d14779161847aab61803d52aed242941a8c737887347858dc0b97c9e92b9222e62a44ec035e42703218610b25ad1d7ccb25d5f21b06a9f863cfe54f094b7ef8a2b06e02417add8727c34692534ec7d8586e04ee236c8afd05aa2a4096c71e8bca3a3adb1e0f6cc31ee9ce7714929f2510bc994c2eb2e83b59e57f585cb85ac2457f723b5cb2eee76490d7638adc392e71478edf1ca486ad85008ff302d130c2f1a047229bf819f061df89bd590465df3564c81f6f837ac3c461678540a863dc4a291cc14e30a541575\", \"777d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936241614d3e8cd52fc3453eb56ac2732fb9749715b82b545e0f2eda17e1fed7410da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ed76a514a469a046f8a639d1762af89c30ccdce4827317950871fa39f73bf898af03474d1f6825ec143575bd2e16c5d5a5b633189d07c1a3af4de94c30aa06021\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090210c346f34eb67b338583137ace294a1aebed3911dee8c3dceca8e91c55e3627e2f8f5c70edd8c6df28db02a4db35805d8f191c106f349c0d9a80e71616a0d5c21f957ddb16c65f29ab300ef8efcce8c442db76d27ec5d4c89a145cf16781cdc0051799ed1683f30f4efd4f2c3aad0ced47f41090a8bf766f7b0d6d4d27a3f60ef037224aff7e719008daf73a18afd001da1f32ea188f5de3471ec641cbe4d4a2eaebfd4523d17d3a90136887284082386956f1fb9594b737c3a2e901eff31e0edc7ccf6ab28f595a736b0a4b609934b77ecff3b7fd2eef0753758fef7867c5870b42f68e589d325189b24b6ce8cf550acab48000c2f0964412c086767cc9f7060abc3012a108d9c875325f83feafc4c43b4946814fdedb69fa8353bc65b9ca68fc553ce7e4f604f96e8ec2f5e139a759c2937486074b4282bf0ede4ff90ee41678bf23198dd93dae501abc1860a8999fceaec36e55917c79c2aee4ef98e0d25d544879340d06bea0ac4bd5c247cb60dd49ab4082b6a14742fa85dc3e842319e814ee5cbc09903cb53ed210dedb42abf09d3739d2152b9d1c141011d341a02605dcec05c6fd5144ad35d88719b81df2effee83878ef28572a03ce12c81ffc6c31591bf8beca586461da8b6eb5ba416a4c52fe17ed9be78d799d853cf5e3fffd80f46519a2f1711fed22e1ad91bee20c0c6ba9032ee7a127fe94bc5153c22b28371e896598908f4886f775\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8afeb4bd46271bdc4aa2a06eff134ee0adb3f92d28971d2f43ac771ecfb2750b1f03474d1f6825ec143575bd2e16c5d5a5b633189d07c1a3af4de94c30aa06021\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b98b3ae70f7b3075d295829a4a779d63ac54efc1",
    "content": "{\"tx\": \"dcaf384b02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cda01000000cf8850f6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd400000000479871ed013270a100000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc4ef5541\", \"prevouts\": [\"db3f47000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\", \"03855d0000000000225120fc12a8d66cb681b25d9244e35510bfc0dfd4b0ce262903c87a066ca254a38f8e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936651597828edaf1ec5c9dd157a6c1e84adb29e876232419c139df01e87050662f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a06616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/b9c4f033e767c62469be7d0c9837ff7976269c03",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5c00000000bbab6ce0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb500000000c4ee82fc03fcbb79000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f878865e72f\", \"prevouts\": [\"34dc260000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\", \"8bab550000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"cd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936305e2bbfe940f420c214662e3966ca6ecb30394037d73a78f87c1b0a0c14e367fe052270a8089f5fc5ef9a63e8f4df43751c17d276a547e2cd275b71d0b6242a8fd238d2decf6f7142c55252dfef824eea080278838d8f4f1f0f617cfe47b5d91029910a453e765cd82c29c3b576a90579a453f3a941b6b6175fa922e9a13196\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93679da927ebea46a5f8996fbcb41ba1476306b8185e9784cfd3fab60be6d7447790aae41afa256ed506dae95e698e8dcc0fa26e2618e50e74a83d05bcf51ab890d620a19fd562e5ef578d66d29c84f34a4223ab3b995d34ad300c7b5f252d5e140\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ba1c9764d8c0c80309b24333c675854c1e92edf6",
    "content": "{\"tx\": \"88a47fd8028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c442000000001eaf11b1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf21020000000137c7d2049d1696000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc370c5044\", \"prevouts\": [\"466038000000000017a914525ca05541c81a105639c2efb802eaf5596cfe0187\", \"94b8600000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bfec9f4a544cac12ec45faee03e073e2ca7a1afd48c2e8b5a3a7ddbd5cfcc3ac9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e8d213d90ee48874bbf2b18160b4fefa78452fd9fac91ad5f640de90a3ceda28c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e1906c602469d9808f25282c821ee4b4dcb0a7f347257f6810852481d8753948638c14f042a58a31b61c3859e3b726944cfc511dd17ecaa68ed5dba7522a36ac78d53ca9a9f93e78db88a883cc9c42dbf55ad09041fa37b21a93adcd191d7180\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ba1e6bbaa2a233a2a9e108339e2a03d15db6c21a",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3501000000d42eb6c660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ff01000000c3ef7ad960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270af010000003e9053a503f715690000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7a21d363b\", \"prevouts\": [\"1cfc47000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"edf4120000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"94c6100000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063fc68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694b89f2c9aa4f05454573899159481db85bea08e9a51a1491468cab82b3ad58099aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4690da805934f4f93e9c0efd4d4edfea04743fe60c173721d1481257c7ee1801e4e0df2464f99a35d5bc9fbf69ae3045675e957332f77327dfd622124d00cb4df\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e979609d128077ee19fefa6d4a5ef99e5cd2ea32c1a2ff3bbea06157366b07e58771b6e792b25070418091d57f3336a76b43209d1f0f67eabea9d94d6d252d60aceb16be1ebf4fc69deaf064fc7bf5d7ff2149818b5ba4c28c799d30ad567cc959b5d8c486a0b4fb1c0695d0398f92463f78d98cf4d122171b1dc85f0cff66bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ba213f9e83bc18ee5d889ce921f71786661cdb49",
    "content": "{\"tx\": \"cdcd5a9802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa500000000b8ae7dc6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bde000000003c6de5f402e5588f00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acc9000000\", \"prevouts\": [\"a5346f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e224230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_8d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ee038fdd8bc71ef14a370e519b0379c7953ce4f05b4f564315288d1fcf85078e3fd1446e11bbbd68d919d106bee0c647dabcddafc0551562fa8914a65899263403\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6eeab9143adbb3c61f29938a1ee836c6c0935bf48783c9d794631c96841f2c4ed1c73540ee96b8d3fb5033fa547e225242871081b822556d71ce4f4f75b80dc38d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ba60320519e241dc303d027571c1b6b6677274ef",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf06020000005a8d6e1adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4600000000fc86371d025cac980000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787141e232c\", \"prevouts\": [\"22827a000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\", \"7aab20000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"8e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d512a2ca63ffb455d99d5e48d0ce26693d60c39456d7af39366f9ddaeb418e2954f33cd0b31c9bc4dfcaccd89caa263c020d1b70f58e7e0e884ce19a773d6b5f30b2981ae69232c3f6c5ff759e9ad4102f31f3fc5e7a3a4ffd34dce2e2e06026\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045df5339745586104756c1fc6d4b54e2b6a7d81daf8b03d1fc2a4a51881171d1a3099eb053c54d8f72c6d7331f9a1bb3bf1b628df692ad9b7eecd4e01f4a47bb5aed4b6001a8fdeaa28275cc8a939e32dd3c3fbbfbba5c677bbce429d0c1a1675d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ba66a56ebc2679a2d9e33cd52effe2bf5657ba63",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca501000000580c3db604f64b4e000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fce6010000\", \"prevouts\": [\"2926510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_80\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"975cf7e75f24f1001d638322626a92d040e1840080b79b68d55ae4a3cce3e821fa218b0c276e5f0325550959133c82bfd5a0ac54edf7843766a0c1fdcde06ced83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"edfbcf6ef8812f0c9289fef29458750a771593910ee4b3a385ba78c1dea78375289729cd1f265c8e7eafa6f29a70f36f042df16df8506977cd8ed85762f7518880\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ba71d7ae4697eea6a410b7c4d7d542ded867b329",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b800000000041ad790c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42f01000000ab6dc361024f625900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac25af454e\", \"prevouts\": [\"dbfb260000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\", \"a8f73300000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090293ef17bf1fa91f04d0b8b89561878205c62e6abcd2848db48e9afefc5692257fb659812a041bc5613b20cae249417bd75457bb1dc9e549e93b90b402126834642811092bd589d7a536f571ac31d065876f9fce6dae907cb4181efde5f99d8e51c342d162246815af7b493a6ed4d86acc6b2927a0959aa7c2ab2077135ec9eb67639fa97dc284ce3e722dd5e32c6fa0c1f6bc454dc738a97bf8a812d4828e77feb15e87c4e02063dfe94552b548d5c9992f442a44dd28ec37fa6e862b3f75a0519de0ffd45bf2568f163db900f89e46e3d9d407cfcc3bdd662c25f9ca03901105754d408f98069624a38fe69b2bafcd0fb55292405a1a8b3bd08da62d18383e4cedd12a6feac39c3c30b40874ddb55f4355a6d35ba615f27641c55c3cf822911649c7d6fab98eab20d0b131bee2a15f61e4f34cb727b3e6126e2e6d3d309d32eeceff29ef8adada28f02eb602d6eb06708bd4dd7376bf5f9b8e5db867e374e29d02974e317fd35b591949c9a9d05a90ea0ce61fc68c7828ff9205226a46822d801c51d2198e0a12a5304fd8b74935b47647c28cfea893f2e311db5829c033b749d96a7bb9c967c55dcc744812156deb0ffe57c1c1f6ad32cc33812f5d99473f7bc77084d5cf0ff7e0e085c549c0986fe2cec4b2ad46d5bde3a22cc7e18a9b7f32a4ba8bed15e19a3a268114d7d3eb562fef99bbf5f3fc454f5db73ec791d612f9fb450ed8261220cb1c7589\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368ec9b674b6978b70ca392c5eae7e83a8b3e88bba03d1a19232f64d1d4e5749809886f85ebb300297009aa959255e1f8e976b091c7e06b33477ed400c40a83b4ccb3e0a345cce78c1fe891e9b22b966ce84a8b12623d949f63d5e15e148dd67959d8f9ebf09b0c450213ac35faa1ca38fcf1ad0a46ee35414da06dc92335be8b4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090252e5575fbdf6faf0ba0191b2588ffc308c433e98a153ed48ffadec721607983a686e8cd9cbae745df144c864eaabc2f3d7d588feb5af050ba4d1335dcf8b4ebe035a5ba4b74f35770175015f0148507128ed6c7e21f71f37d3acbd693251db8886782b140740b74138a6b4c3f624a756c085ee5a8c0b962b3c1ef131c2a17ec2e8cac5927f1613dec9ecd854e3f913c82123e821a42db55211a1ea5df526fbdf273a5d1a33b679a5ce0ba624abc8e6b2b855d820549cfd44af4f3e816bc7135af9891ac6c272c649e5f8b22250c641a41d4d5b1a80c6074a2c99cab8f250cd3e54a0d2d2e9cb58f7f1a052643b037d9fb1a68dd622de0687d989e4d594113136036bf001f70a6603169eb672231ffdff8526d23560ccdfbe6cd6209cf7d2bb0897fe3d5af2c8e40bdadcdc00b6d7d6fc6b7b15cae136f97d22f4dfe2ac1590a9404f5758dac119bb842a62a3a66a66d1e913f2a6425816ece9318ba35cd7656f4fcaa2536c3fe42d793aedec2a9b2dcab6e5c9f57cd7f0ce83bd717292a195c9b3416d6469a7871430654c96f9bca568740f71df574df1eadb78b9de7676672e3e3173785cc74e9ef18097bdff44fa0442871cb992d4ded3ee9613314b8003515a90bb6ee33c1fc1ece5002af9b68de57ee30df851195e757529ee5cd4fb4c66562601829d195198809d7b2d59e963706be83f997056f2f18aa3ea4b353cb870cd989e49a9fd5ea7ae7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936908709641cf32dc4788f906f7e3621a0528df09509ddf1e9982e4479aa4b5d9a913d98effacbdfffd2adbbf71932929e08e9cbcb7e06a345b8d84d9192524cd99d8f9ebf09b0c450213ac35faa1ca38fcf1ad0a46ee35414da06dc92335be8b4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ba830627ab470b34e7d889cad07110a91669d64b",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe30100000030bf24908bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b901000000527fb1ee02a3f9a600000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac15e93a5d\", \"prevouts\": [\"33896b0000000000225120b5fac7f9d1efa21092b4bbfea1ca41fe5694dd20d67936ab2b478b1ec4aee588\", \"92d63d00000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363886a001b09f635a34304806ead39fcd4b50b9b619b2b6bc0eb87693aaa0e04953249301ac20ee33639c015b4a618b106ac87c8ade2ff7aca8998bda2366a260c3d30bc3225049ba56ac02c164836762858abedae6e6cb81f8117394fa9e456e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367661e28ff42a08d72c3d32c7503c1e2b25874d2f6a5abb894f6bc68d84afb9a8b553f13873b7614c747e02d52f281322dd98cc8d4ce789920cf593b75c6f05693959a095ba405700a8bdcb88c47f737d45523ad768f5b3698c80add34f2e764b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ba88104330b37c0458b14c5d53739d04527f803a",
    "content": "{\"tx\": \"da0c3ef601dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b190000000029ce61fc02a28223000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987a512d032\", \"prevouts\": [\"acc625000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"3045022100d827c78cc6c8469955f38ebcce0da421cfe33e5917c97c4d1e6aef11cbc613730220504c9adc9e61e9fb428030a8fa6c9a57a778d19c656fe491e342a1dd6a67297703\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"2200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\", \"witness\": [\"304402203d73098df48a8a66efc76370fb5cdf484540419a8282aface6eb4bc971438623022077efe8581f1fadb82fb18b27992ba1ad048d2ae042d4b5902ecbd62b2033bae903\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/baa4d60cb12ba51a47909ac8227ee6df6d0dc0b2",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1401000000cb03ad92028bf17300000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac3fafd534\", \"prevouts\": [\"83137600000000002251204bd530dd92500289ca536d9e0216beec7b39c81554ac6dd1e9e4cc3828e76161\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"fa7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366c55d1291de37bc0cd0b0f7c57f56af990eb1972b2f3e36942e3050d61bb245448c1a9074fcf4072701b6c332871422b1ccd41e69925b4b38aff436cff44d889284b3c1002850d4c89a68130d64a5a5ee29d0b1bb458f5120fd1f649ff1c37e66ac496a48f5e08c9a0063585476106fe61a3ff4222f4c7aaafd1f65bf01170e2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e89ffffd8cde8e3769edf5532f5f6b1952f639561cd4ccd6343a91fb81843409ef1076b289256cd19daa60d704e81db3a39e457bb71d9d0e29c4cb2075820e5e1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/baa96c5298845a9d61eb221acb395d2256d66ee5",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127075010000009e5d05f1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0a01000000bbe4edb3018e8b46000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478715087253\", \"prevouts\": [\"3e281100000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\", \"f75d75000000000021601f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7eb34c8d1a1387448db057283b1804092fe8bed759b596c8dfc46534dc3d0f1722ba7889f2042d25cb663e37ff265891415c0a89e5b0424d7b65816c493c5c76\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/baa9d2ad62a330c543ec07ad2137ad8de21565a1",
    "content": "{\"tx\": \"a3d01f1001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c770100000035a382b702fba44d00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc759010000\", \"prevouts\": [\"41624f0000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361a24f92e0fd66692248020bc486fd34464c8d03dbe31b3b0085981632dac5adc074cc5cf84a1d913e1f5647d3427cc0d6d469f0e5b86c78a49890e87126542fa0e1c61743bed8ba943c0dc40e80402f7423773c7111097ca9c5a140b1b3c94b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360bc51bd168651c63bebcb5a0fcd6ee1be5c250061dd549ccafb897d97d2a0ffcd13faaaba0b83fb431d1a23feb7d5de22e491a7fb36e5108ab00e1ac0e7366690e1c61743bed8ba943c0dc40e80402f7423773c7111097ca9c5a140b1b3c94b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bab370c81fa011cfbd5f4933e8e203b69b4613b9",
    "content": "{\"tx\": \"e4c3fc72038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ad00000000ef3908da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270740000000074614a9ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1001000000e3195ced032611a5000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487bd79c71f\", \"prevouts\": [\"c47c41000000000017a9148bc1125bf4e3450c593a5be1ae9a05461832d39a87\", \"ad5b0f0000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\", \"b47b560000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"1653142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"56ce4aac32ddc9b0137d682bf44e63f566123fbe72d36ac728c4c036e10f935e932ca13d7c8abfafe7f931daebe311f7a74c17285775adc4974f5334e62efd80\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bae295c693b97cb9ce1c49550985444f7083bf7d",
    "content": "{\"tx\": \"c273581502dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf30100000056f903e4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb901000000a48e00d50318bda000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787f9020000\", \"prevouts\": [\"c6aa49000000000017a9148fdfffe253d045df4a2985902e5465482e50374187\", \"da125900000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2360212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"beec2376560d540aba6c3ed02d7cfac13e24e9ba2aa6adaab3ea03441f54fe5e25ce154b67c1a0b40e9cd2da65b692918c4773b9676fa8a30c6f734919612855\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/baf106403ddec9a4e35d93e4d7e9c8858a1db975",
    "content": "{\"tx\": \"c99d682202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5e010000002c0ba2bebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf67000000009fdb47ec02affe8e00000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79659a35950\", \"prevouts\": [\"2cbd26000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\", \"dbd56900000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93669f2c139be00fa1c9661184516144ce5a6d9ace7645806e68661c56c0e240889d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d513887c728222b860c37147d016a38c71344b48ea7c651274945970f6f23c5cbb4cd941a6bc152cbea0496b075d4b2611b435301778200e60e8b4147cd93749673\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93674f520513e79457cf4495a2bb1d0fa039ba02e927188e1401590d675eb0e8e803887c728222b860c37147d016a38c71344b48ea7c651274945970f6f23c5cbb4cd941a6bc152cbea0496b075d4b2611b435301778200e60e8b4147cd93749673\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/baf7af0bebc3219aa43e93f239abf44c3c75cc84",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40f02000000edc4c2a1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7d00000000b6e37ef8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b970000000032ac10e903965dd000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787c020353f\", \"prevouts\": [\"db0b40000000000017a9147e06846ce22cd5e23f7e03391c0538498e0e18ed87\", \"234c6c00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"693f260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"215c1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"ca40b7b6930883ea4773d0a5d65f6d0ca782ec6b7a5254db897aef0eb51e0214c651abb28ba77c3e02b75e8110dd9e73eb30e9654b7a3004f962b8bcc1d9f935\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bb00878c7c40b024bd20fd9e026f76cc0f01bda7",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6c01000000caf387b6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0701000000d913f3dbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf000000000d47bb5d904ec5a0d010000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acef05f434\", \"prevouts\": [\"5591730000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"a0b64e0000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"88954d00000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100adf0b5c7fce312bfca152bef09bfeffeff54f562953e06529c43f48db67fb4a502206e88b5700e794d2dd7f247a12fcff802052474109397c0fe9c579b0b0091ce4a032102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100a84ca6818390bf29e4d1994c4b9d9fb4754fb1bff4ece03745f030530214d6d602200ce39a19f127dfcb702bca006eae4b9f4e9e6c3c50b9365433d0ba9ae8d96c93032102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bb06616585d2cf60ef82187fc0334f6ddea3aafc",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3d000000000652fa9703c1fd7200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acde63cd56\", \"prevouts\": [\"7af97400000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"48304502210086ea90cc5c0728dde80728c034b5f5d7fac95f6ae8d2c33709cd8c5e42060daa022049e439d5201732b05eec818672fc4a721a99f33137803e2a8362e331048fa53b814104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4730440220458935b7ce817cba8b030fc203ea244413afa5c774155a3c8df693aa9e9ed47002200d6efbcf65dcd22b0d73cf5e298b7d89c3171bf7327d5e2710234026ef9616ae814104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bb0848b612e67f32638209d33374606f9f878516",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd801000000872a088c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c418010000008af1d13301eb745300000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3d95c32e\", \"prevouts\": [\"a1705a0000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\", \"2fb636000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d6822c3ab459532077d5f4bfcf7544c522d220251729d5888eecbf9f185531198751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d50e634e19498d3396bfa452af2ece499faa564dc4b58fae514f4ede8dd179fb909e9ba325ae7de51b47d98058ae5f9889bb6f52223c96865cd06dfd05531cc8a0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900450cffa7efd13876b56a4fb6d16fe87f2b3bb25d39f5e6fb1dfb5ce04c0283c8690e634e19498d3396bfa452af2ece499faa564dc4b58fae514f4ede8dd179fb909e9ba325ae7de51b47d98058ae5f9889bb6f52223c96865cd06dfd05531cc8a0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bb213f4cc6adea71bcd254acd7a66de7a21a8fb5",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcc0000000071630ddfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5d0100000077f260fc03d5faa90000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df97972236898796000000\", \"prevouts\": [\"5be962000000000022512064408326fad1f8311f590f6e6ba281aab75c91070d1d43ff117e995859b8513a\", \"a8d4490000000000225120a283e1ea0142d34d03fade4b28902cd262d82bab6ae3891658a9596d967dbc43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d121f7b2fa46772f2cfc578befbd81b504abefd6778e5865b2c5b6755c31495101a118f46f050c81cbbadf2ffa0c9c6b08d2e446670a69be17d0290a8143215d01\", \"fd57a900020f02c3225354a96ffd477821c7786c05a231b56f81d951b932bd379fad0980\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f4aa4f7c8436ca8d8981f6f5734f4602dfc0c44e18db601a12eb96596b0cd18640e63690ce5cc95121adcc35e07ced275f2317c26a179d197ac053960f0f4f147a1cb17023e1e615d13464769edd83781954ce40c3e997c10d9d563131adf152b0b301466fcc99b487f54bcdf71fdafe08c75b498cdfca3ea44357f25a0a6ec1207896441457fd2b6c92ace09ad12d6a1cc6b03727b3353dcdfd94d4fb9d5a4f5d74f2796b98f2c27dc0d9d31f80b5c4be6860f52f23a3a23047d434b27debfdaa5a5078d4000d66a22e2c7b3b94a6a7821f00597277fa5b950f8272c7903fe6ef223bac505f7b73447842270fe9ad944c23bba89cffd18d813eb3c3f2c24dfee534b9c8f80c0cd634f790cfecd39060a61cc867d995e38f8c6a0545cebbec068e85966b052432e8ff002c73077be3268fdff064ea813fbc6f3f7637440b79e3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2f2ca99382fea6afccba9d7672b7238401aa02b3b5b65688095ee89641bd0d65891ad30dc566cd59f177e8cbac8dbc3c996efc49302767d1b5e8302894ec74300000000000000000000000000000000000000000000000000000000000000001acc7e6410c48b21f942db9b7b4f79e17ad6a1c7b719589c08a3fdd6624f970e69846db1afc2154e1c9b23714d29820591741b528a79c50363c0b8135dd178597c6cf129cdfefe06dd1b65bb9b9833c588f329ca16e44f4922ec27e42f62a21a78dc34601aeabf1736ec43781ef95b3e08c43d501af801162a35b11849c3964e7e9cc8b5df612fdcb98046254270875c794792c2f1795b8a882171fccfcf5a3584eafa4dff58e1449b3590ee1f833d71be88bea01fa882e89dd9e6148cf49fd1336381ecd289df25dea3c476bd57aeee10d0a4768f98395d0c6ed4bf356b9fedffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0e5cd23fea34561ccb7889a4f3b36be34e31b5943a06d8296ebc608c9d6f623f000000000000000000000000000000000000000000000000000000000000000055352ef2f6f7fc99a3c6a206ea828aa4e121e5112a7c5da62760a74958cd5984d868bf4ab5cd3050056231123a19adfc4f0723563dab4b706f9de6e6b5726c807e092985e1a1ee2652ddb19520a43f0cedd86b3699c87c18cc5962ee2f78f44f9e1c3a244d9f6facf3574099b42dcdfffc66292e8ba642d6f825063545a645e40d074afeb4bb9161c3149ae3e5e41690ae09ee6a59fe6ead775dcf89b4a4e29fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4bf5d21a9c1b7fb9354cb3098f96d6935ea68dc47503ca75a2482ff80c6cef1effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869e424456dfa56753d4e9e148e949946e27dce809fbdae6e5feab58e8d27c1a00000000000000000000000000000000000000000000000000000000000000005022de3fa16ca886cf2a7b7d19434a609127511a912f61d63e9581885edd48b7c8a75cb4c1835c21d3ffdb9773c68f02697633377815b13b49d519281ec51bec0000000000000000000000000000000000000000000000000000000000000000335425ff4e513ffd6c10b8d74664ea3700983559c48b23ef405bc66be8820272\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d121f7b2fa46772f2cfc578befbd81b504abefd6778e5865b2c5b6755c31495101a118f46f050c81cbbadf2ffa0c9c6b08d2e446670a69be17d0290a8143215d01\", \"42269ce82f5929d7b42290dae7cb60c53a31b6a7e3b3e6eaea5b5598591109fab37e9d\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6eadac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f4aa4f7c8436ca8d8981f6f5734f4602dfc0c44e18db601a12eb96596b0cd18640e63690ce5cc95121adcc35e07ced275f2317c26a179d197ac053960f0f4f147a1cb17023e1e615d13464769edd83781954ce40c3e997c10d9d563131adf152b0b301466fcc99b487f54bcdf71fdafe08c75b498cdfca3ea44357f25a0a6ec1207896441457fd2b6c92ace09ad12d6a1cc6b03727b3353dcdfd94d4fb9d5a4f5d74f2796b98f2c27dc0d9d31f80b5c4be6860f52f23a3a23047d434b27debfdaa5a5078d4000d66a22e2c7b3b94a6a7821f00597277fa5b950f8272c7903fe6ef223bac505f7b73447842270fe9ad944c23bba89cffd18d813eb3c3f2c24dfee534b9c8f80c0cd634f790cfecd39060a61cc867d995e38f8c6a0545cebbec068e85966b052432e8ff002c73077be3268fdff064ea813fbc6f3f7637440b79e3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2f2ca99382fea6afccba9d7672b7238401aa02b3b5b65688095ee89641bd0d65891ad30dc566cd59f177e8cbac8dbc3c996efc49302767d1b5e8302894ec74300000000000000000000000000000000000000000000000000000000000000001acc7e6410c48b21f942db9b7b4f79e17ad6a1c7b719589c08a3fdd6624f970e69846db1afc2154e1c9b23714d29820591741b528a79c50363c0b8135dd178597c6cf129cdfefe06dd1b65bb9b9833c588f329ca16e44f4922ec27e42f62a21a78dc34601aeabf1736ec43781ef95b3e08c43d501af801162a35b11849c3964e7e9cc8b5df612fdcb98046254270875c794792c2f1795b8a882171fccfcf5a3584eafa4dff58e1449b3590ee1f833d71be88bea01fa882e89dd9e6148cf49fd1336381ecd289df25dea3c476bd57aeee10d0a4768f98395d0c6ed4bf356b9fedffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0e5cd23fea34561ccb7889a4f3b36be34e31b5943a06d8296ebc608c9d6f623f000000000000000000000000000000000000000000000000000000000000000055352ef2f6f7fc99a3c6a206ea828aa4e121e5112a7c5da62760a74958cd5984d868bf4ab5cd3050056231123a19adfc4f0723563dab4b706f9de6e6b5726c807e092985e1a1ee2652ddb19520a43f0cedd86b3699c87c18cc5962ee2f78f44f9e1c3a244d9f6facf3574099b42dcdfffc66292e8ba642d6f825063545a645e40d074afeb4bb9161c3149ae3e5e41690ae09ee6a59fe6ead775dcf89b4a4e29fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4bf5d21a9c1b7fb9354cb3098f96d6935ea68dc47503ca75a2482ff80c6cef1effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869e424456dfa56753d4e9e148e949946e27dce809fbdae6e5feab58e8d27c1a00000000000000000000000000000000000000000000000000000000000000005022de3fa16ca886cf2a7b7d19434a609127511a912f61d63e9581885edd48b7c8a75cb4c1835c21d3ffdb9773c68f02697633377815b13b49d519281ec51bec0000000000000000000000000000000000000000000000000000000000000000335425ff4e513ffd6c10b8d74664ea3700983559c48b23ef405bc66be8820272\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bb4c46289dbd303f6704b3a08d9e02f4c48b84e6",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4600100000096211854dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0802000000ae1def8304d9f05c000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df979722368987ce010000\", \"prevouts\": [\"77073800000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\", \"36a4260000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902984083f971962febc2c9860df8dbd8699ca3fcec1a80f1b154752afb2bfa600e958f7ef313d6cfd20a5e6f3ae7ab897ef0cfc782af2a4185e6346883b8ae3ab07f3b7efa36f594be222d6738725562c44af05a495355b3f14a2d5bbae2f3e749cc735de4420d6316f0c3efae0eec72db55cce81826f68bf6475a9c7dcbadbeea486777f5a11718fa0a838fb82c89cb8517ae1b716d2cd227b58d496d998d62b53df1303fc734396fdf730d10cc641962e61ea09e4d6d34464cd4f306ea5df12b3f59acea54d40ec78298e7fa8c921b1fb67a81dcbd96681fd85ec7c637a0eca2696d8d48ec5a8ecec13638b37c239cdf1018853ae111b906e75ea9f3e69ffb912000ba2d5e5a7c408366093c7d69511e4e3ad83fe692827d8e0def82629e64d4a378cf59dbd07bc48dbc0281bec4e2e578718c5698079cb66b0c347a5d6ad263863640089ebb391d8e7552d3579ac4e5a3db829ca1f6f7a94127c78e5be2338695d45010d7af7f73b5d6d8c4c74354419b103ae2bbc8e050764e43fc198fd2279ee94901a990f590f1fd27b391451406a68859981f92a53e27860fd49fddd170e06fed02e483d8cdd43c977abb16fa54c4aa85480a8e7d620c37d08e371cb315e8bb1d7e978dc2588dc59ecc494827e98f0fb6621d6c9f38cb8b57eb22215058f4a3a233f6db5cca02e2bb99a1c860fda02f0c096b6610a52c70395c6df0c41e6d4041385ef9f8d46f75\", \"ac7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365d10d3505502b83681f86b5c9bb7a4ac3d4a0d96424a17c6ae9b696d9543a30775006811b549bdf6e8160f30212dc3199b386e615ec459cd6a9a101291e049b6126490c72a5b15e8927e2896ebf8102d665fc08f8a92e888d3aee8fbb5026d2b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09026ca67e1918315273ff584130fa87692d8728f8624d2d55e5f24260b40f42677080994722e90ac5823ab52aa7e7b9d28bafb6abb149eb6d72e21c1270cb57dc1dfc89e103ae0ffa061688e495e902f874d94648fb9dd0a863518a6da81b1eb3a1f1a622d1723e78fdef3029478f2a97ce2a9a9d46b4c31449b7315da3cadd0fd1a4ffdcaa3b7e1e201e8136d51c8821a081a2acd8c5d78fd9476e923359fa4e28f1a1f1ac82539276daec1d1d231169c6bbe9d1dbbfdee0f36085e058b5d2a4ca6477a92590978f1a5afd2d8ada44ce79b3dd92a07db1cb614f611302f81e048d618ea1a941f4ff7d429471d69b3887440a89f1be49bfa34590a3c691f3f66a7e3b96d101f882f782bf079616687f6fd478ba0d6b916e33bbf8b816aab4bce598b414d2a08591742ad31c50eb0488ba1fc92e6c49e30074819d97049712c7782df2dc8cdb2c4db2f9b825bf44688efd725ed74987ea039088631433209df39ae7a6509e5303c6e62f02723085ebf6885b7f51c19f8c650dfc000009f82d8454cf2dacdc21c2aaeeabb9839b0a887acf92b672b5f26a168bd84dcef0bc0de9c22151ba1f2f17d75a17b4af6cf0509db86db70b0f15114749c727e585bb3e2812e207e2619e49bfccd6b24dfdd52a91f7e2f6951faaebf2cab15861a575b1feab4e43290ecc5e3d47091aeceda97843280fea4b68c5f6861108b0612826ce6e1d09e65a5eaeb34214d11075\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e877e3df24c23560dc7d916d43eb4e055d70ba52495a1ba5531ef20ccccb2bc5f4126490c72a5b15e8927e2896ebf8102d665fc08f8a92e888d3aee8fbb5026d2b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bb4cc97eb2c8303964e3730c003f85cb88a0211d",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4e00000000a4ee171060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708b0100000082b99690015cef6a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc8000000\", \"prevouts\": [\"f6f17d00000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\", \"84ac1100000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a8a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a57a923cb0dd0cd2e6b76c48071b6322c8175ad0a8d13c02ef85aecf2afc050a837054ce51ecdc9e3a3777b2a8e44b7f174730ae5a790047b9842df02ff9276d2430956d1468bedd56ced1f149c0a08e9d241f188aa41dfacb5e515f08af1f16915bb1b7e7b983dc2170cc97c5c6d5436afb034e74288517b9fa4d2c2ab63870\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93619a55fbef70c8b7cc656576193fa332be9fc9118054e5528da63a20c6970f02acfab3477f7b3c3eab66b712f7a90f2a0c89c5ec16767e7d6e87c9be44117720e9b045cee6f1e54629d213b8dbfcd9de8aba2dd7f34fe21c75d81b8576e463c6b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bb7141b532ed1aa0b98bd58bc84ec2e08f2e47c0",
    "content": "{\"tx\": \"757a763b028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c476010000001189b0d6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3f00000000aa93a3e00138d3410000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5f354861\", \"prevouts\": [\"8ba4330000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\", \"91555b0000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"384ee4fb4d496f70a06229e8cd09d2a04dbd57daae4fc7ca23f2a10d0392e3743331b19d4eb71f89acea580f07d154d2b6ba4e689989e2529d80a4f503e64a2303\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"cfee87544a77568c1d7685042c5de42aaf0417477075056b53986d9cfbe0f4adb0453d878cc44b92a126ec9792dac29cc999d0eb2d5b84bb4e1e3ee73fd6f85c03\", \"04ffffffff20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba04feffffff87\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bb7fc95bb6e35ae77514934a3e4ffa53a6516e13",
    "content": "{\"tx\": \"7fe69d4d0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706601000000d2634dff8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40401000000a84fafc5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0002000000b17c94b301c64a37000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48713020000\", \"prevouts\": [\"0a4311000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\", \"feaf310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8d227a000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1c75ad5b0c19c64f5d3a7fdf07b71b1a8f8b99e999958fe2a8fbfcbf733553f9475ca33d7e1e5f2997f74dd285eec8a0e5cba5080c4482d5b595e9662ee4b93be0a1b6150087d660153f154c744da46b7319b80aea4f8e08f23015968f3b1d87a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367d0d894f81359a419367fc8ac631148e3eadd39a7159e1d5f784b52cce329de7bc80a3081e946651089c17942e2d2b7e0a2ba8b51162f8e9c4f29cb18d1603310a1b6150087d660153f154c744da46b7319b80aea4f8e08f23015968f3b1d87a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bb85f9b909ffd0ec974d57b8e96a0afe8031c95f",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701c01000000ec402aaadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0c01000000553296460139f8080000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79629030000\", \"prevouts\": [\"dd961000000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\", \"f5212600000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"cc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4c890db8e530b3b97e91b56063afadbbd8e6ac326e3356562c0a5ff1591f041d611c8e78922f12cf5b391747592eaf9e84d545161f4f09ddc8c51091bc04ba49d4e19d3b2ec28c8925d54c04f383936b915813fb16b738060565344c47074fe42\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e9132ef9050946e44b1b7e4a7390d57682430e3f2d85fcffb45dfde53ebbf6533b9ff415677aca4bd8bea8fa89699624d8c5f018d44ea89c1d7716b3c6d0480766d64d66e5a8ef59726e977ff218232e5171732e5d132f479dce590bd8ea056135478fd9f7e773d9cefb2e6c2d4f28929a19e0115b3c92e29fd8719e7d86d1ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bbb302be328567aed2f8a9548699284ede429dc6",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270980100000024408861bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc0010000009526508501d78f510000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7b999eb5b\", \"prevouts\": [\"1e9e100000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"7d097d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_49\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"204b61452f9fe2fb1644e91d0ca36695254feed8785abd3325db874c547c91572b2f1761d2ffa90b2a93c95a49d286533238f378297c2acb5e2eb7b0755e37f702\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bbc793ee902203e310aa3b4301fa4d7302103c559626d0574b354dc520c989f3eddb6d8c6718f7bc3e284a4bcd31f3c720f139560e8c6d24897c7a41b140edb249\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bbc60e9c8fe20335286b1b4c11f2554bf44bde1c",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be100000000ec6e0586dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf100000000fd59c1ae0257407d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a666000000\", \"prevouts\": [\"82e01e000000000017a9141d8eff3030620b266a8bb5e50900ecd7b2ab72da87\", \"111260000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"21561f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"57402a79b3e34fb69adb8b73c9d4d342a664fac0487a866ab4b684cacd69568755b3fd53b9b7c1c095388601fae8a88f38cb55ad2a3600a606af17cd42a27027\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bbd6a4aa19b13347c78851a8c39dc87ba2c6cc26",
    "content": "{\"tx\": \"53f634e403bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8d00000000fb2721ebdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c86000000001da8c8acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5c000000003f491bb602892f0601000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7ad000000\", \"prevouts\": [\"2902640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e4a94f0000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\", \"e76455000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_c1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d48795d278f51367d376a8c5b3347124429f9a6d16bac06a83ca0298e3466ed83ef0892cf4983bd1b037b3b76124c2d81437b7019fb053841262394ca5b7dfc802\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0ba57f09640013df5738ef1948c73db63feb1b5219a4a0fb4277720579deebc06826e0fe2630b1cdf70c8e60de098725216694f45c022bd81437ff2fa70674e0c1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bc18a41aa534670b3eb06ea552eeaa43a8bf670b",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127008000000009184f39cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8b00000000b18bd5d28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43300000000963b85dc031aab6f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7697ea15d\", \"prevouts\": [\"9e2f0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"3c0a27000000000017a91486e5fab3386e07350db4c59e442dbaac96c1816287\", \"7c613b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"235a212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"58175476044a116be4e68d81ab3d7e6c5b8ff3c5bcc29620e7e8706c8e9a04cbd5a2c8424767b86dbba4a5fd3809175bbce64f1d301898a6c4eef159c70fae7c\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bc44929f9083ce895cef6e68e78c51d907624850",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa701000000f7176d97dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce401000000c70bcbe401c58e01000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487ef01641e\", \"prevouts\": [\"75707700000000002251202eded5f58e3549770351ff682af5b38d1de1354573522cd8f1060c49001c6d0d\", \"9d5b480000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d18d5ba7e45c34badc4e90cee645c54b876f7f533727ef4633edf3b7bfead266\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a3b616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bc61d16fcfe7499f1dda3e1aebd61701783f32bb",
    "content": "{\"tx\": \"10ea334502bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8b00000000fb9e01a48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41402000000a58a699c023885b700000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487eb020000\", \"prevouts\": [\"761e7c000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\", \"7e153d000000000017a914b202aa31930f9cb7b85a632f41f1539f30714abf87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"483045022100e00cb280a9fbc8ed27fbdc1a1684322d90191a7935deff2b23d3029a3742920a022045947575715ad69202135ad7f07f38e1ab9956abd66bf39f11045178c3b3af6a93232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100eeb3c5cc3dc2659769bb7f4129e3e16cf63cf88bfbaa8793a1d19011c0fa84e0022054f780b1d64e8a4363bba38b9fe081ed29e9ecc52c46d0da13e279bff943328b93232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bc63fef6a6e1da11f5ad9cdc8c82557d301f7f93",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d101000000275cfca3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5201000000eb0037a702a3deb500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374879c010000\", \"prevouts\": [\"c22c3400000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\", \"f5b983000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"98\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936862595c5db495f9659b55a4931c0d6b5790089471348683bf5da646fafe3acb03f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082241df2003654f0fe7fc4600eb797dff990a6f251f130f49fda58fcd5b0cbb08c94c58b1e468d5c742a8cec262986ad36b584a802070024df25b549bdc05f9a8a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936135308afc3f1b0427026314dc25c4582126331f233b7d3a6426128e486397ca6241df2003654f0fe7fc4600eb797dff990a6f251f130f49fda58fcd5b0cbb08c94c58b1e468d5c742a8cec262986ad36b584a802070024df25b549bdc05f9a8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bc94c09d187af83d11bc158ffad91041ae1cccf5",
    "content": "{\"tx\": \"59b68c5b02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5b00000000757001b360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f90100000023805aa70289676e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc3e020000\", \"prevouts\": [\"b8776000000000002251201dfb228dec79c6e234b1139c58dcf8de3e24a7459acbe9e029f267c6e1783b9a\", \"d7ba0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"627d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e889c476762c97a1f480fe93da3602a750f62c0ee9bbab5a4ae1c7a4219e84dbc327529efe07ed3ec82dce77345a5c0eb368b138839946732056b6a908dbf5f05c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fabe3373372acbd8f7355a742b339dc4113bb3ad1c8e82e6b2233d51ce74beeba4a979a031634820b293704e38f33c20e5acd9cb2a8735bda71fecc5f77708044027529efe07ed3ec82dce77345a5c0eb368b138839946732056b6a908dbf5f05c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bcd93267863bf6c12c490fdca519c9a6fb257676",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be9010000003b4ab8d18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49301000000992f62bfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c36000000004f65d726032c18a700000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5f079022\", \"prevouts\": [\"617c220000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\", \"dc55330000000000225120884291612dcc22b2c0e2cf19d55719f5f9dfe9624bd12dad94712b18ad4d330a\", \"c6da520000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09026316b3093e23cff5690a75befd7cff394a52cf7787e8654c43261bad0ae27abfd44e3d11c05bbc6e169291527cc0f4b05c37423d26165a9dbb082ed968bd6c683fe43e0cf34c12bdd6c2bbc66540b69a0ae144094abb7915888128b105a11f4de02353eba4eb2530803e14dfc07ac199002b212a24188b9e4f8cc0627190a56d547ed23a2507013cef2f1b8f2ca05356db533832fa6da70c31c65344a535d09b7f26a8d03f4f8e1303a368401f99300fdb02e79bc4b61bf78bfe9b8c494e3a2ada666c8ece2fb35ab5071fc0e135bd5a9b717c8aed49023e51fb504dfa1acbbc3fdfb6b37ebcf8e49ba646420d4b0e5ff7a26ced95774a58de0f76636f3824a359677420022dd07e81f1057163ee6171773c3a86d4ca42cd18b750cd288ef9d9d22e08f74f2a5b2a1da0b11cd9995d2c8b7b4bf24d72e00e2c5e956f84db761b40e14b0e9ac43d720da48fabbe946a54688f82dea65984a4db1f6ec6a116b8d78936a0c6ed4e6373bcf3a49f293d7ceb52f94dd7b511c5fa1acff68938736200c1e0faa878a51934afc483a4b8fcd4d3b30ff49394a57f9f7285acab6591b4db76c3cb33986af636daa8d12b2422211dc6fef8c7caf1baeab2603864ca5d2f429cfb8961eeb8b5c9f36e0ff50048b7e9181086d23bbafa0454d441c78a210e09f48540414010f0e92302ac8554ccfbb209ea9bb040a91578f8dd84abaabce2584280531ab9001ab3cb75\", \"287d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082462eebfc32d9e48af9ce92e50735d36faef083a1171bd1899835a9be2fa30ea55b4ae3ee914d52223472aa57f653ca8073aef0e7910b2553778e1ae03228475361bc10490c3b13d9c4f63caefcea4aba06d3a92ca8668ebd56c703a638058ee7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902dd9ea2ba14162add791a826aa4d18a2bf83aadd9fa241e5ce02e32edf1e21604725da111dc2871901330a81248307fdae3749a7bb6622be0017b88aecd56c8fb6784b529c18355ca4392e369fe39c4ec899eaebb1736791d517cee8672d415dc4a1a6d1e2a53326aced46560b4e4c6440838be5333ba364661b4b936d2cb5e9092bcdf53a18fbd9dad2873390ce9d70a5897a9754d089d66dd5a6e5c448c677fd45ed4aa4c8399909ac76508f67e413087ec3e422be2c5a6b1024177101929ac548a3929db2f130aa99c640587e909b53345662449ad6051f94665459f1ecf1b5f7a28ba891ee9bb94de167eac25ed1cffa509ddf4dba7c71d2b5161ad5ba24979f00e01c8f38a9f216e350c2462c6d87b9aff146cc2a6e140944830637d9fac839b488eca6e06b4f529e25af9e092cc77422f21f170d94944db3c2083e8ac972d19b6891dc09aa29c75ee1f28d982882675efd5445525666b7279edae27205508c041d2e5ff6beea552cfad24739ebcdb352e511f33e7d7a5d8c2fa68e96136a2e2e7d8a3427f7d6e5aff3f747f06375589b19f0a86d5fb00e280a6c6ff1282decd519207f62ddafa3f14597a506517c5ab0faf16b3f530c7c7651f9a14c93b335bcda499637407f5ddb7c342c3ff36bb6c9ed6144764652eeea2296dfb3621ba5f342c31335ecb60f407a6f0a7efba1966d35f210dfd9ee9309c18c141d4ea62c094864c276de4b175\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e896153d9d0825641ad9dc2862c4b07cae929842b36229bdcb06007f7d47362644efcb4d33820b2e80b50b7a60cab20b6261c566fe48480267b41ad585cde9a4bb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bcdee1bf1b6f002a01bcb15b07e1ceef6be9c962",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42300000000b20b5953dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4baf0100000081d35f7204231e5800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fced000000\", \"prevouts\": [\"db4e380000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"31d2210000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936efd379c9bd4c758e31629b45da72255f4fbe43a7d074fe2e3f642017976348fe1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045135ed0e678ad02d8eb601751aa1b9acf14c9c27e67d62b009394546cc2bb02284b0fe5a2ac2c1f7a0cb2705bdbeb7bce3dd33edb4ddacee2f772f92b01147433\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936084e1b08cdbacecafb7fe0fc3375aa5281f8489002cb7af196f64e737a534ac134849a28cba9aacf50a598dea57ce3ca224575357c4c8c887db8ba6ff2354671f69ea04c091b2bc3b7c7ae53ee1804d998a6447fcbbef49abb62b7a394c4c123854b8121e0ae10d162a4774d9a1b75cd5b5f6f9e51813910e8b7b5db2ca997d7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bcfbb863f9751dbc9e52565fa18f52d7cfc28dc0",
    "content": "{\"tx\": \"9ca1b5ad038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46400000000a64e37f060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e001000000fa4a59c660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703701000000d0973dde03647656000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd90b845f\", \"prevouts\": [\"ae4139000000000021511f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"4d750e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7465110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0ec179f5aa9aab3890cce0bd1f48a6488eb01e39c43647fffb3d4715e58914dac41fffaab53dad2b6f3bae7f48c508c1baf0cd580756d01b34db596112971498\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bd06f79eb234682d1b026c5b614cea268261d69b",
    "content": "{\"tx\": \"c10517cd02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd0000000008c471e8b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49a01000000bce4bdca0378d8a400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d4783521\", \"prevouts\": [\"59bf6f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"536637000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_5e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5f36dde2a806443a28c62c5e35174eaa03da2458f83478089899614f9737fb9116f0885286c095af83ba64d43e14bb6ee6a637cd0e004f5d2d357c950260d0bd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"518f7a889717ea067c416eba5560f8ce9405a39894357f02cb803a566343a4b81c7d2df2abcf152d2f9eddf7ddffe779a022c1e884d7114dfe3efbcb0fa6f50e5e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bd10e29dccdef5c1bc2693b295ca9c3ee1a5e9fb",
    "content": "{\"tx\": \"615a5ae8028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f501000000cb91e5aebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb600000000f9c80c9a0168a86500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac40208a60\", \"prevouts\": [\"8d6035000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\", \"62a67200000000001600141cc39a492a6f67587324888ae674f2f534a7639e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"8f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a5823ed2420796b51d928b322338d26a1b11db5af291eb20326b952994336cfce4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e81f261744aaaab7b61bfd8b873ce05c274059b1d1cb072d2d2c67e8900f407405dd5f972b05e2f18c3e7c797b604beeb8879a3af7f1e10968a0ac8aaf9d489fe7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369dd7d600adfc804e2c499c39b2008fe85e995bb2ca03b92b0580b9363b6d74c2ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457f8fae370a255a677f2f729010dbb329fa966ed9a0dd82e5083dd7ea90426dc47\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bd4570befca425281b554426e78e723b29b91aeb",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff40100000023239086dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1b000000007b8490a101327b760000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79613fcc133\", \"prevouts\": [\"b0486c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"47c754000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/1000stack\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2f8144252e57e2ff668ec3e4f237ae5840a370eb2f20eb22560bfecc7693b401766c4898f6d52974f274b58378b6c916e297548aa1d170e07290aaaab569f311\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ab71800260cc4c45d928081596c283425b86befc4cf867721566fba167b9248f9962f30cd6fbb48af3455887495dfee86d4a98af282e2d7bac6fb2ca2e45891be3a6edcfb587287623b4acd2d694696a040c035c3516bffcbceafadc18652f0116feb5c363cc9ca7ae37fc813d8e2765e43ab73c23e8259fb2c39466019f40dc69ec72a5666efca96852a89de09ab7aeffee4b172252222f5c5e8b6c3009c9df82670f592845de8ccf6ed9bbefe639facbbd54f6cf7f8beb23a81bc5872764b7c781e74d39289c012c9134c71aff2c94895c0ee3473cf7b2b9f1482daaf679eefbf975fb4201e0a2b814c3bf547e47eb4a23672ac784435f04b7336600ec6a82dc784183e7f3cc14811fb1ab50df3116b5ed0f06967eb560f7b9991615332c0ef3606a7ffa22127f3860c477e614ab0b0e9d584049910be53886cda4c5b22b7fece622d42e15d9a09f8ac238b01a6949cb9ab79b540250a90b3fc35ed3b857ba67cba4445e9cd0a613a5e6e514eea7a9da662a1fb003dc0b1555d407474a0fa29f0302a595cadbe6f0743d5ef50dc2b0826f0f2e0e84d35ce4b31a2be87bad075dfde575d48d1eaafa8343c63d6f5425984d2425aca274be02e47a5142e089ba2e5262a94fc3ddd3fb5606be458b593782b16d00ce4762d13e98a6ec8488c560f68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"29d1cca0486ba0e3d27e539fe1535f40da0bc2b0cd6308caee1a038a00a697aa82cce42f11a621c5250f59e468c62cacf9e98937655e26a12d7d2c3a5c6e5c16\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad517676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767675757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936153e27070caa292b693ba4ddea8b9482a94a8730fa33c3b3b79ac286ebe40d98bb9d4f1e1e27d029ac6035bf75b0bf88e449c1157741f34d74a96fa066585cd40f99255f893286e215f8002b6d42379ac05485fc11174807e91a31d72f31064dc7fa482117f2c5ad3e450de7bb7eaab611474644f8e1f61caa7962547399fb88342aa615c18023bc33d53d99e896741c8b9f092f128901fe7c9ab35d5600ba72a7eb899eb88c356ab781f6b961c1d6de999781ad65362895c26bf88f330758ef0a72f7d97ec67241c9c95fa34ba9ebf41e4b62c116447535fc0507b0528b1da112264249cddd61d525ccd9ae6ce25acc100082ea9e5e5b1e11e9dc8fcb842061b7fe5c11f617e89d9c8027e8e5abc775a151a67e9ae53e23ce27de7d6b1c7da91877336e92e5a41e5368ea40610a7e213130c1b8bf4fefe5f8f2ad406b661c206a1fa3da1ed0725b15b20ccd115752a72fc7118badcbaa8e05d81ae5299a6df4da1ae37bd6e3382ad5e5e5895bec0d8addde979cb59da276665f005ec58aada8e1b94341016fef68bb49557d2278eb05de13cc05cd27e5f6f381c44fd0963b076f28feb26558d4d064770c2eb738b0251c60e0a639239140ddba0ceb61ff7c3e738a88f45b76d7bc9f694c0e4e272f5d4f15822286d483919ad24a64a55c6aea77b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bd4b0d5ede1b9b28ba821e22b21d2e67eb35fb46",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703f010000008417bf8f02fd950f000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a66f040000\", \"prevouts\": [\"1d8a12000000000017a914b202aa31930f9cb7b85a632f41f1539f30714abf87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"225d202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"2f3970c4d5172c246e2ea982a8bb87c9305b9cbf15d84bfd540d941f6f122ebe2ef3c3501030089b489936ea72e2e92c2663ed2b20a02369ba745daddc80a6f2\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bd5b6bd1cba3b3c9511abe6e7ba85869cc7271a8",
    "content": "{\"tx\": \"0f23d10e02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0602000000ff1278f3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2d010000005422bc8b0191e85c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4878f7b482f\", \"prevouts\": [\"ab6a490000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"388f1e000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"80\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a254e7cc6b57a9a94b6584709e7056848938ff7b5d3cd788647ee9c8c010053bd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51b44d35a0b3fc5d8cdca17f6fd766b3b7f076a7a891ad519d38c56688c70ff9dbd0313c1abdf0fb4e55d9b6d58af17743a20615f5654a8f167dbe9f4cf3a09059\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93689697d7380f4ad31bdb00c7ff0dc66aa22f6bae188bed2870f771977d2fb8298280ecd46f67705e4464578fc0c4eafd6d20a38d5c68152a49fc5d0c6b2a7c87ed2fecf8564d6a652bf0232997fa790ca314d73b111c417284694cd1738ccb12191585e32e966e39b6b25c1732dbccde0ae2700833a1164b08d78002e58493a9c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bd647eceba7eb445528903854da69225eb46a33b",
    "content": "{\"tx\": \"778899b603dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c95000000007c54b39660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fa00000000b5fe039b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a8010000002867b9b101c0ee1900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2bb98647\", \"prevouts\": [\"325f4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f1bc120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"09e33d000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f44c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ce60b07daa005e7e961b1cd1197a880b0926a9defc492f43af4f596fa4d95286ebf10485a7565da4888b0296454aba30a39a8416dd3eaaebe7fea4a18750e931ca477f7eac6c013e182e33a949b526b028f901138401b50189d2a4f50cede7d4a6f8b9af6548d116d93931f99bf1698fdad997ce51263e0555061e012c5780fd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52f4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b270b4d2addc31b8421907b0cff80194a5513593e3802bd921239c9c6063ea806bb655a633384d647dfd447ac375ea9b2c02c16d8a17436cec940ed1871036c5ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bd806dc6dd950acd2fb4799772f9284b52b3eefd",
    "content": "{\"tx\": \"aeb1416d02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1400000000d2529385dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2f01000000774ad9b801e1a53e000000000017a914719f78084af863e000acd618ba76df97972236898769876854\", \"prevouts\": [\"c5d0730000000000225120cd23ad59c6016ee1812d662f3dfa4b488c728badd6e7eac21806d0875fd86aaa\", \"03124a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_3b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0039ced3a4e60b7417f7be29cfbbedede4cdc075ac33a70fceb0742fcfd301b8947895373ef1792ea5a97a226e4c9206957f21475c0be7c76ca15f50b84840ca82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b0f50233317f8973d9568589c79e87b3a0abe2422eb4e297ee7885dd08ffc30eb3ec01e52c478a1862c02c685da06ff070a3643fea6feecdbdebf802c10d73433a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bd90aa727c6f46c0b214029c4cc55665db207ed4",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bba01000000a2f78b97dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b82000000003a48009dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5301000000e7fb77e004cb3fcd00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7f2000000\", \"prevouts\": [\"d4b42600000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\", \"69c2270000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"926981000000000017a914971b3e5f9ac480bdcebf6ea71a9fc7de0ab164e287\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"387d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360d6aad208f2c248715bdc6adf729c9891a9ee5b587a39890b212ec8f00fab902c542915153386019108494d00e6bbd0a8a4ab824ea9158d8694b82aeea9ace0ff7118923d14a9704f5c6065ead9bf1df659362e443facca38f7fc54a29b18e2b8fa601fcc68a78472d280e0a6f10ace0c22dad9ad93c154f995d1132d7b2f793\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7acf5321bd3c280560a6e93f009006b65547a58d72ede42c89f2f760c3bf47a1d1aa12168afdb4ef286e7748ddb08cf408d85b089f504486378d2bfb535c0d2875b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bdb75495237a21c1632a1d8002a2de43c75cbece",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd801000000e90e4673dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c17020000001ba48a0c0414137a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acdbfcc93d\", \"prevouts\": [\"a9982800000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"c1345400000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e64c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93623815ccbf6fec00b3e507aa7d5724ef597227ebd84c2b7f91468956cf3ee8c66d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51575d1df7a3e4c47ed4bae99c3344f7d42d0c4d3b112e8138771efc2bc74e29dd3ff737734404bbc9015f34371be38b9f5376f1a60720e7cf7da81354011ad4f7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bd48f9ec9eb75f9ed6679e2cf51ddd5d7e1370016b30ba4c50a73a51ef54d3d62f8e5029e924e7d935b65d329b99c619ed2851847f9f95e76ebd19c6b8448036f7205f064a536655663faab66bf2e716758d251376e4a55710082b6d7272244791bbc3b31bcff977684854464ae3dc2a24522286fe393648b51abc79cc246ff8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/be342f285479f59388d4ad299b262298ea0a194a",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ce010000007fec828bdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b09000000006f3caee503bdb35a00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac0f030000\", \"prevouts\": [\"950536000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\", \"2df02600000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902aa8d4b20e90453331fa307a9dce37fc19f92fe8330d08a9319a0a632a1f803039a26fadd5ca8540c6485927fb92a3cbd1e9386c4fdd6557743de564d62b2df1eadaa1f9045a1a1dec1c27f9c04101023b9e199d1d4fd77f9645ab6630375ecc949891f381a015e70f2b098bcb9ca20885a6a9a4468365630b792f17cbf5ab8f2b30cee7603afa29c82e020e47f93d6a67ce57944ee7b4dd94dcdd40f9026ae0a6ca1db23e0f4152a4004cfd3628709f8f9866a495ba9594a16f45f307a6742edfafdf6096c99c2ea4428d14f6d0e940217a090e0f474202570a539316e2eea9d0a8c41641ef66f4c7528eb92a6918b2b61cdd4172734c8e5ea6618e214830fb2a843fc0979887d7181a40811b189b7fd2d6271519b538c91f52f26dc16c3e49241cb5a7354d01304935caaf3d79d4362075a86882c1a4314e438a768019f462228e4940edd2639266cb1078e0636ce3d3e3188d8e2ef57328c192760a51d31944f20dbc4065e55ef8ff1ddbc2cd5ecbede6b2e24cdc902a0b33a41aa4af853beec8ef4a87f2e23a4aaf28880819685ac4c10b785f6772169aa2f790bf00b8b08d85bf9ba6a337ae4d145cb872856e0612daad3654981092b36f65a1ae47364de5243dcaf5e0d703a795538a39a3d8da4fe4a59e4ab087d8e1cc6d65da5b35d9ae981c8562fa5861cb9e8922d1b53178ab7189acb79bbd921a52d3795d62379e07a6e2f63c7094cde4175\", \"937d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361c8e826522e1ca857c1f86e804e4cf6a726b8f2b2090951428365ce33c52bd4d08ba990ecca3673e7fa8965b90b12b1af4599069410dd603db7b6040d82b00ca2e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fd6f60e166ab3c31d6fe53c0e4c47c333102fdf48f7428a1dab907384d3ec09a32\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902053ca9fade99b14e5569f3699c39d4fc566908d41c74805e85c43aef4e30e3b54d0abf18e17b3057855519b850be83215fa82203e186d0dea3f734dc965815040aea9fc92b7178551a3cda8cbfeb5964dcbb035f7e341e53912a25a89f174984de82b1ab47bfa1ab6bd36c325201452c580a30f892d9835e89cf4d9bb8d3a69f6d6b807db410552792113af6e1f53f0c86807ca30b823c6403e8f32d8fe2ac4a2da9bdfa2be962ea78d9d581f85390393c9325a94792f435ad3b2f76944f602fdaf0ca1a108579a25c39d0291308392f817de5cdfd1d584ae0873ed718f2505d5964b76dcbffdea5fdfa2b0099ef34ed4f1251c23533bca341429f309499346f6ff23db4de63966a91c68052c064e9be87dab97917f6fd5c468977796278a95d816ed51fed207d05a400863bd35350fa343a95b345285f54ff5b4242cc3709713c313b46e5d094e64ec4b968eea4054e9ccb9fcb44adcf14e379e7c81bf7a5ea3c88a159be69809de42fde5df2ba8f0ca45c7aab31bc657fa1eaf4dd5cec36dcf6c5168c5a60e0597e7ad7725e177969a937cc67d2276ae8fdd9b470486122135695cb66d52ca70287e8a66a833182c5c4e111f0eac056bf99c4bbf2173417ae815f232935684226c0444f52245a82cd7eb560c78febe6d3297cb6d16a65c144210e065987c306d40a78d0f65a1767b46fb7817004298b2c412099008bdb1b1e78ad657cf36bb5079075\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d68141f1158f138a84a3a31991a11ebccc606b1e605d90f596b1985e9f081fd92e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fd6f60e166ab3c31d6fe53c0e4c47c333102fdf48f7428a1dab907384d3ec09a32\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/be4056e6d4621f67f649cc023b36d0616763fb74",
    "content": "{\"tx\": \"35adfe970360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d5010000006640029abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf78000000003657cfe8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdf000000008532f2b1014faa6c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4871d222b1e\", \"prevouts\": [\"96730e00000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"d08c660000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\", \"f2fb7b00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"8b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f9ce7b6ad2b5db54c83a35a4c940a86c1986dd4e23a9b088042cb3ad14ebadacda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e86a27b1635c4d20405f5eb1d8e1a675f8ac3bff005ffde1fde7fd53008c3096ff2e441b555c43a724b579c479d380c278f8ccac4217fbfdcb96526a1dcd96287\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8726c3b29d073c2dbcf72056f4f7511ea796d648b755097daf6738edf6332d6d84d7dc2c55a7521ecc297ff7217b922438f95dd9c29c118a2bf5c9e2c8f8c84f32a50ac17afa49989b8cd5fe09550e31f987b9afab4d6ff7fb0ac42074cc4b38f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/be5fa21ede21c3ae07d18916186307eb0dbd0b20",
    "content": "{\"tx\": \"a8b2c1d602dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5f00000000a06df2f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42701000000a95303a40343c087000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7967f000000\", \"prevouts\": [\"517148000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\", \"1fc6410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_76\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4f8433f2f7f1ba4576941e6e8aec25b95bde8ecfb62e2ae3c7b9d8629519096bfeeffabd5d79ae1fdb64e15529dfd4067e4767d4e0f7de3f01aecb9f39ff606502\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ef01a51bf5a1a9c05df3f37ef53f59e15b00c57214dc80267d115ce196a1c6306e1ea4d5fb19035e981640b897cfb590759189c0ca1520a4e8261d10642818d976\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/be6dd32445672ad01a41728099573f056d19f11b",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d00100000061bcd71c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46200000000492c8d5abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfde0000000026f8a34302b303e60000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87ab000000\", \"prevouts\": [\"6f8234000000000021551f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"b983310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c2d5810000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f14e5905ca8541b51d405c71cf3b707b00110c385335fc5149daa88a2cbdee9bf8e885b0d23f4d2d1febc8c047ff70d3e28c87b150df581dfeac0436f45256a3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/beaac08761cf0537284bd2fb73e52c21bf944e0e",
    "content": "{\"tx\": \"8346c76302bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfec0100000049bf40cebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd201000000179187ab04897dd9000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7961d3c802a\", \"prevouts\": [\"952770000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\", \"18786b0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09020132a6a877721f6182c4900c8c9a91ee785719f3dfbcfc4679289a1694c470b90c9077c924505af201de570bea2460b67bc20b4d0b3675c884fdc16bbe98935ba7bff6f3222652f89bfe65fc275b90c0d36c5b2b0c1c59225cca442549c7fc76e2a056ba0fe01368d4d6c46f7c804d7f4d75e0ec8381f1b1ff0cab79577028c2b69154cd021e395227da4c66490b4cdb1b52adfdfabe9c727f4a3ba9543e3e8d284fe38fd10c2cbbdd926c87377b2666ea2ba16ae6fd9286bcb4b157246e9d22c7d15c58dafcc7f824dfbc8b2ed260996d8a8545c083d9bd5f8a4797c3bf4b2d8c0020b54b7d381a8ab8f0e3e91fc27a470029835357cb11be900f086c301c65c4de2fd3e1f4d00e69cc02ef8dbe3eb99c6c4355375f172a20e7d2b926f81f542520582216a6e2131dffe588259eb75d46f4993651ccf6a0c4a40d35a76efffaa3e3bbfb2895b5352f039a93e2ca64bff32bde694c8e3803fcb7ea045e23f18beda32168645203709a71c5496190638e13f30440aac591e0cba87cfaf1880b6bceeabda515773804f242f525e90dbe4f3d308dc0f26ebde88142a7510f7c0f1432e9c0800fecbd0353acdda68a2a615bfb24283bf0839199e56c0a4a195159784af1ff3938611a6342132b83f1963153e52f99fd26d80cabded14c269d6011defb370bb4ea58f62162cf5856745a887a4120ba846127cb0c4190a7f3ef5f07ab915f5a57d974eb299175\", \"5e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360255f52c8249e8178ded2a32ad0258987e50c1cb8bb770ab3f43966deb2a2d7ae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e865cca6be1d3cc9714f9205dc72257def63c8e50f66dbe399f94c25bd2c6a85f30c8cbc16505271ed8ce1a03d67d2c4a35529bcf4a25ace24696315022c27c9cf\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902808d9404fb4b3798376a988157648593747e7a034cd98f53a6630d1b615af6c9cf43478542ad720ede86dca64be382ef0e7232dbed262fc18ef85d7b108fec2e5939a32ffab50d9b9a306395a98b4438222f42f4c0bf7744e09e5c5334d80a1cf4e12e67ac261099d97b3f9564a5a20bbb1a30ac1ccaacd2a0f88877a5b27e30cd484ec42a1a1509b4964a22df568b947821363aa1b33b01ac33a12dc41a996399b9c2586588f3f0f8116bae35052bbe98590afcbb8164a88ba19ae268a23bb8ff3c24b4bf99466aee5074480c785afb89bea43717ec6ea3626da91bcf9e11a9447cde92f7f7a1be0456c9ebb54a2583690cc6cc204ba6a28f03911c9486329265f1150e7f926d1c60171010be6c7030f7a7da91caba79fdfcfdfb62ccce9b5a2273f749a541c852e9450dd0f42153d038171a22a253f9501d5b4036d314ace61142185e6767ceae26c996bd135b32886e72a686202ea4511e986c3fbbfc43f581bdc70b1eccce05ea76faac3246f41d8c44819b1b5c6c1009c12ecd268c517f2a1eb6ae8ee4ac0e8f701f79e6cb9411861314cd4df8ac183754289b71cec313e217f07928dbef2ee814970bacb39395d837db23cf0b5671d2d9c50514dfa11df6df706095cebb605911f5fcb0ccec1921508f64340978fee108ab3bec6a460f81f10f0a291e354e54ae0212addbfc48dc59b37fe353f9c779475bc2c9e18996149035ce888383817e75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f7c874ff1fbfa959c18ef617f316a882ee2198cf6b5111461971622ca58a5e82e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e865cca6be1d3cc9714f9205dc72257def63c8e50f66dbe399f94c25bd2c6a85f30c8cbc16505271ed8ce1a03d67d2c4a35529bcf4a25ace24696315022c27c9cf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bebcb9f288f4fe614ba1fcc940d72dd3a2e9182c",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be801000000bf09559001077e01000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374871a7a8a50\", \"prevouts\": [\"20eb220000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"954c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93629aff60e439a9718fb9441d494108642f29be2d6809c2540641ffb56ffbcae4b3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082adc7c8b3bda8f17728820267d55a41d559bf30f92e294931cb4fa644579829c4d4a2033150a39b6917f88ea297b4f989401264ea3eb8667a511a69e57850c639\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac8a0bed6c7bbc1bb08bce33089c031a9168eb2767a677139df21750243f2d5cc1a4178950446608ddf8409535ad79bdd567504e9e3f05b7b17ad70ac9eb9eeed4a2033150a39b6917f88ea297b4f989401264ea3eb8667a511a69e57850c639\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bf0031c6d9edfce82c4f7c49f277cbf11c628084",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cc00000000b8f83b5e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b000000000ea20edd1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7b010000009599d10e01c5f72d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac71030000\", \"prevouts\": [\"f6d641000000000017a9141757f4686f091b43a46fa47e92d07c87fc7a205e87\", \"5b42100000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"0c43250000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100b659af5bc7bf80c0cc1eff37ce34f65896a55c1b5928722bd104ad49c4575d8e0220432bb1178b580c0df0a6a1997145559af84288267326e28e33274f2adb30a24f81\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402203185c77604a8be90ca85a2635f87cbc38e72fed7f3bf5b6167da1b72a247f115022052f94c5dab151061d03ba94f1cdaac6993fc438b0578e71ca6ccd902a03e5e0581\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bf1ad139661581e23e01c40061ebbcbdbce507e7",
    "content": "{\"tx\": \"8e961b1c0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b601000000d2b48baabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4d010000004b4050d501d0c7520000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72bcffb39\", \"prevouts\": [\"4f560f00000000002251204bd530dd92500289ca536d9e0216beec7b39c81554ac6dd1e9e4cc3828e76161\", \"bd2f6d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_a1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"62c49876ef07b3464242db73f082f9d482b7d88c47d5cdaefb0696f8b368f778aac96a46d323b54768c65fbcdd1819196713f6af1948e3ce372bd0c8a4e618d001\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4ba62b3b90e2fef1f92a3b27aaad83a28597f4f4da0704b7156490f23b896c84d09f5bf1ef52bdcf7eb59102e61b453081e878cd30c3f461caf01a536b1c9929a1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bf2b441671494bdd813cbde459c3f201b5dc132d",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4620100000077ad6e89bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2002000000f77fe99c020797ad00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac10010000\", \"prevouts\": [\"0b6c38000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\", \"12fb7700000000001657142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f680ed04b947655837744bfb290282b3ede1b1c03b28e020f9570c073aea52469f618a73356d310f01231c0f2514a2e3ea11b3e86f75eeb186369e46407f1b54\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bf34c8983707b06356e258d949ea5d5b386f793c",
    "content": "{\"tx\": \"59b68c5b02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5b00000000757001b360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f90100000023805aa70289676e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc3e020000\", \"prevouts\": [\"b8776000000000002251201dfb228dec79c6e234b1139c58dcf8de3e24a7459acbe9e029f267c6e1783b9a\", \"d7ba0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_d2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cb494deea94a2cd8ababcb8fcf7dbc7effa7ab798ea761eedf5d548de2b675327ececfd5df4402be7a02e3fbe261c8fefdbd715c10be79eea5e927c83fc49ed202\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e8a6df26db3a2ea40536d18f5e81c11356febd0254cc7dbfd8b4cc92dee2591d6bf31cc12bdac996b4f175fd3b91434650e56e8841a0644e9151289511f742d4d2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bf699d29a3431d6314083edeeb34fd0d30d0e88a",
    "content": "{\"tx\": \"b519aa9e02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7b000000005fde7c9860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a8000000008d3b00900238e98e000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7a5030000\", \"prevouts\": [\"b94b820000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"893c0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_30\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1a366301c21fb2865414b257437c6af46ca4fa4026c61eb2ab45c76a81b611796c8e0cad59e491e89ba1278be357f59bd9cf83e2a4917655ff122a8dd747d2b8\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"727ba101668dd9d696423d14995064c79a348530ada915b63da561501941e1bf6f259c3042955d86539ce8166d91a9f01b2a2e75203eb8ef47eef4904c0242b330\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bf79de65a5198ccae719f56cd87e06ebfa963388",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6c01000000b9a21ffd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127021020000007ef33ff3034d9e330000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748708010000\", \"prevouts\": [\"63bb250000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\", \"75911000000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"473044022052d7102a163c80f64a7aae845d78b2e032c436c0dd276056382e5275aa761ce7022076b980a2f2c3b13942ec8dbd136b42bdee7ca576a458c5d2e868c04749d6237a384104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100e97b79f0a2e7bb4360de3703f8a466702afce2783ea138e3b8c6d1a134eefc5e022035717439d025bfc02900f1eee67232f6750dc7a9d3d25ee9994dd1094b7cea7f384104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bf8f7dfface9a3a19ae105b018ef9c8464a7766a",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1a01000000a7f6e1770244d21e00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac65010000\", \"prevouts\": [\"52d8200000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090251eea22263f54538b839a6e32c80ddff99515487950d5444108c6f8a8e8ca641b6c0487d1db717c0eac924992e8bef503da80796d3e700236bd91a046c66bf6f581d292348d74dee367df26854ae2bafdab0efcac13535eed45a6161d6863ae0dcc5309b52195f8c153bef6500ce9337d5a878607824289cdf4f96ee2e9b460a108e6ae88c4a191ad3ec30f4fa402435d59c0c5ecf1773e9ffafd97fa234cc5e228be6f36ede1a9c44914d93a40989fe60db040c120d4764a603257d10467beac52484784d9220ca4bd4869181753d9eb5920945713eb5c9404817b24c595adf19d8375075eae0163f4efe48b8f941798d28946d9c22097c66bc288bd921841269910b0a340dc412f31301768884b191bae4ec497c86dee71ae8c75873726c2e4bd0432ea697079968b652f2e5093959b52ab950bb88fe6ac328fc97b89b2069365d3c0b560cbc6f3e47dd020e76ce36c778819c8ef72c302c105d386e9fc77ba2bf426e1b61807b6883722d971f417d6297e5a4e5b908665929e72770628ce9091f1d8865f83e87baed095c783237195ea097aed852c3b4501dc818c7418db7b7f8a08b3cd91f794ca828149c188d989d9e10786ac0dadfb481f5bb4999f648ca3676e0054302f8495116865cfd34b67384e5484196f5763896fa0bc6a4b89bbffdb892ecc474486d5df3e5c3d35097d77a7819e0b9b02cd70115383c002a5240c7eeb11a7bc6bbe675c6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369789e47787c008d4b1ac49f7e3520e3ba1acc4e691f9f1b35c0f1c9c9f09fa8dd47d6f16ac79aa20d3ae71c6838a1908b9e31e7785a52acba39807bb47995dee4cef708a58e9a16c040ddf6ca6eff300c7bff2a5c928617bb01c850b0a79e89f728ffffb27e62918c729ff5ffa8fa6bd185df3cc350f3591557de0b18c4f64cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09027a6033e9dbfea74785b42dfd58d65ba8e050f5c1a962def70288a71b93b29e609b52d344aa2296979c814e18dc6d773606a6be5ccacab835684150956ffba6465e2a8eb24e7c1b6b276665edc23759b8c1e11b2e60c8c1f6621f70602e29461c1c622701a2f511d787d26deda0efd5565bdedea959a73ce06e434bc94a8cfebd98c950623f4cb4ba9a19937104957765152e6bae28ea1394edd961fddd05774c25d95e1f4856cf3f81a85668cb6a2bbc15ce1324b58799cd1c42e431b5ff941744bddccbdb236105dea7256eac21766951651e44326483f405f27fbafb9587b9f7e7984ac031eff0ab84f9428a6cffdc2fbf504db623447bc8a1a7fbe77abf1e55f48568d396c005e7650bf0a7e0f0cf918dfbd682ff08b7e3f9c5059ebf02aa1b9e2ab14db294de581fffc6c97bd1dd8abb5d09c4e7bbcabe260c57dbedf61ea3f7908b6680920829e1c62a85e56c5967acf0faaabbb240fea111ab6b47415ad9bc4f9bc0dacdfb26506fda87f4e4dc053d94aa271fdf63be7b39bbe4a2b56ac4b7e11f135b17ce6825fb3154bcfee4f462c4ce2ea7e560410e0a257486e17cbe61c9edbf07163496576607b64a01e3dcd68de40344a1911cffda9c038685a76bbba29684c78cc4f4503f516f82ee5533c813b0552f19794570e082d0f329582d339ff2d00faad8a01180f0f1a62b32fc84fc20a66fabf88a0f43ed625d00fee405c5066f699f81d47561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ead70583f94efe61957c66762db35c674fdba58ede6e88df118535ee414388d1d47d6f16ac79aa20d3ae71c6838a1908b9e31e7785a52acba39807bb47995dee4cef708a58e9a16c040ddf6ca6eff300c7bff2a5c928617bb01c850b0a79e89f728ffffb27e62918c729ff5ffa8fa6bd185df3cc350f3591557de0b18c4f64cb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/bff5be66a4aacf336f6a1a8aabdf35a37bd49c75",
    "content": "{\"tx\": \"da12e55f0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fc00000000eea8349660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703e01000000fdb2d88004830d1c000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787ae0c615b\", \"prevouts\": [\"ec020f000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"54ce0e0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sig/bitflip\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"269713504f96ad0d5e815e0440517832f21c478fc2d6309403d12a480fbfc573610d537266ba1625441cb13ebaa0130c80406a24d389c7418bc393378d6cafce\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"269713504f96ad0d5f815e0440517832f21c478fc2d6309403d12a480fbfc573610d537266ba1625441cb13ebaa0130c80406a24d389c7418bc393378d6cafce\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c0039aba73061b1e9d1b5673c11d9a6fec6c2d2b",
    "content": "{\"tx\": \"421bd7b302dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c140100000064fee5d560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270da0100000002f966fe026fee650000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac3dd3f227\", \"prevouts\": [\"28285a0000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\", \"d69a0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_6e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fd5507f6af4da610b2e11b16af216d70c6610eeee1f968fc780e18d4f36ef31b2023a28220727b3d8b4065b9c08b37a1852a97408079d5b77d7d75f23db9a93c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"29188078163bd5145a8a0de99510d5ffc89e8661cca31f30c98d499f21d967417895d29d080228ab6bc1cfab52e1ce2f5084e3a489caa5d07086d7d0d6ea14f36e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c0201387de1a365edea3ae462c8e87757ac56e21",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f900000000bceb13d28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4dd010000007fcb8fed015e995a00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac9009232e\", \"prevouts\": [\"e33d3a00000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\", \"3bff3b00000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00638a68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d1b96e81cead6ac3d8926975c578d0c5f6545830f656c5959ed0243cedef90c4837054ce51ecdc9e3a3777b2a8e44b7f174730ae5a790047b9842df02ff9276d2430956d1468bedd56ced1f149c0a08e9d241f188aa41dfacb5e515f08af1f16915bb1b7e7b983dc2170cc97c5c6d5436afb034e74288517b9fa4d2c2ab63870\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082141ceaec0b62943b85ddb54ef2037615ee2bfdc3c88602ea27aeaa6ef1c2e0ef6e427c91532996b84ed2c37f8a26be8637de11530a49bfc255181ba6103e3464915bb1b7e7b983dc2170cc97c5c6d5436afb034e74288517b9fa4d2c2ab63870\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c0264fc040cf13b7e91a6413eb4b7c76c194b45c",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c470000000032889c918bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42c01000000160157c404c8ce8b000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac88000000\", \"prevouts\": [\"2b65500000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\", \"d0313d00000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090243e0a9de6aa979cc1bd88b6f32b35b4f5cdc1ec6e3e50d6b382ffc140619020502e3dac94586500826980ef68f25c7a35c549d8cf7d2e1480a389ab4d5e2eb68d9e201ab6549c6a8b8ac426f4b82d4a89652f77b80e00df28d6616db3db9e96135e12e6c152d7c0100cfccb8615c74957764aeb7d5ad6448c51828ec198994875033211110d8b3cfb563c5cd1366b16876cbcc5db52441964cad03e76250d7582c480089a8fff6e20abacd855b81296f7c35a46d4fce3b1a3875c5fe4985c647cfda295db1c94cfab6ec04e3345f4f3a5f5313ebca6e75384ebd4c5889811996f336073b7e16116739202d3f059e6651743e73bc6b2fca133a5e1b54372f3730f243a49e2ad890f0b5594e8dcd157859956df24ba6be251c891e8cc9e715c4c4aca028eae77ab2bce2fd3222a470271a196adb8ae47bc2d7515ec7cf2299e1809df3ff2ca956a98410438adbe209cb9e04326f163f16908f45172f783805ec2a65ab2bb608f338a05c0a7c46ff040c17f3159ca8204c3e47d374a5e05684039f93cb106121724e7ed3f63a8a338c75a306da0dd8e73623cad2d9d33ab5722581a4ecfd47e92a796325510c50730059a39cdb9f52a46205a2cb87e1d2048770dd972d7fd024a59ffa9283d9ceac95216de9cec1cd754468637af08d344c773e85399d876a7aaaa02217aef357181c3865ac890b0e8c369d215c6bd480677af007b044957124d5d9759e75\", \"417d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa7155e8c33f0c07f7d0de889297fa065f1be8d31098e32dc97a677fdacd11d05345bbf2815375aaeee056e6b05e441f58ef8c911146e9d15e94b57fcda7a8d0b76831d286b681d36077bb0670e25d1d3b2bbe36e9d696c3276746d4ede397eb7d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09023b22c252102d0bbdc5bdfb0b10f0211835830b2d023c89a4c6a3100b98bc91d24a22bd28a86dd359472d3ca61510f8faba76e767a64635040f1a4aab80bf02a107e53e10092ab8ca4a5af75f2d3ba5998720fd5b8dea6cde37717f3572484f316a623de86e9dfce26b97e15a2b1a0df861d003a4b38fae7dfdb5a4ffb8bbaadcbf3327e420640dfe44cbb88285367e9a38838be7ed6147945329072c047dc202a219a42c7dfdff341bbd7d1c499f863e057343b3acb88c1e3e076fcf2c89f267836fc7ebbf50eb104b55101a1fdfdf1eade9f49a9614c8cc6530ed36051cd65583af538c6c34b4004c52945b2749616749e49afd7fdef0a4d3564630fc2968533882ce1d73f01bdcbfa3e98854b96530db3248950f3c49dc29120694fe5ceb27a9585264df2ddb512a32ad320f7e636b93c19d18f8102fadbbb4be4d89dabecbcea8e764e0815de011dd680a8b0ab054521697d5e21a82a92a03fc628a7a98479b56c8f25f9c8590d83afad3d27586a8851c6bf7a8c6b4926f179db446db40e1a36e842799e78123ca9e41fcfa465a2eb617c5e12abd9b700787930e8a8e109b8162ae7e0fc8ae97d86313808785857c09df13cae1025aeba1a534b430ad1036d59b7179a69655402e648dcb2818f4b7de07ab2cb0773a8c9ffc93bd8b7e0c5064c821673174fbf1f7ec5519f5336d4ac37efcf28e7b8f44f7af6bec432d3acd29fbe57a7c96402f2175\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c59b01a00c1a8ba5a1aee08e5db1d927de1139bb693668c89cce1a6ad71d2265ebfb5abead622ee588f8a14df4b864e849bfb1ffa426a7f0fc441a7ea7f9f3e8819e00a9246c8c145cff8a91ff4546d478c6c8e3d7b4e3f7e61102a4388494af\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c02fa738eb666819f177a296b855df242f3744a5",
    "content": "{\"tx\": \"cc6f3def0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a90100000072a16fcbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1d02000000bff28abf0409d36200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ace2040000\", \"prevouts\": [\"38281000000000002251203e6b8aa12170bf3e8ad7f10d608d1ed027d7fee17123c5116152c821758451f4\", \"bc035500000000002251202f329ebb629b1bb09406fd99900762644c979122f44ddf705116f636c54af1f8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2076b02e7a8c092452fe8cc7600e3d4714f6f512ea929a851b89bd5345065c98b75d96051f8b7e11f69b43a4d71281831a42fa4dd83efe2431868a258047e2e6\", \"2d095a1f1062fe7bd8\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e205163676e567cba5788686ead6ead6ead6ead6ead6ead587cba5987\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f14c077a5df9569646929ff390715adf76260bbf779418b239f42b6e5c4df0bf6e04a680a3e09d2c1c78b970124d832e17e53b3edd07c25f73a974632e6fcb1bba955e8474be2e5ac086aee3ec774721171b5e328eaea831dfbb16e2e79f74edede1cb3350aa36ceb33b3b6c7090611381813ed3ae357cb7bb9b2dc70f0d254d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2076b02e7a8c092452fe8cc7600e3d4714f6f512ea929a851b89bd5345065c98b75d96051f8b7e11f69b43a4d71281831a42fa4dd83efe2431868a258047e2e6\", \"aee58931a9775a2c\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e205163676e567cba5788686ead6ead6ead6ead6ead6ead587cba5987\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f14c077a5df9569646929ff390715adf76260bbf779418b239f42b6e5c4df0bf6e04a680a3e09d2c1c78b970124d832e17e53b3edd07c25f73a974632e6fcb1bba955e8474be2e5ac086aee3ec774721171b5e328eaea831dfbb16e2e79f74edede1cb3350aa36ceb33b3b6c7090611381813ed3ae357cb7bb9b2dc70f0d254d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c04290c4f9037a6b82b7d2392c6c80c1ae11f80c",
    "content": "{\"tx\": \"e7e3b9f90260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c80000000068e24fd8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9200000000b1a782c802e7456700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac33e6a42c\", \"prevouts\": [\"d19c12000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\", \"fe5b560000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c24c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361d17d6661cc8fb2f1af7119061da5758e988d072e66a98fe62e54b70963bbb8620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e119ca94dd80cd6ec848cff445ef1653ae8d91bf4217e3b4bb0faac1831ae9489bd0ff373d5c06b418f4c5ba421f2e23a69b22cb6c2b7cf326686bcbc29e387cfa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045d5c78237289a8636bb429226e0de9c7befeb1ddb6aefa0b188bf3d9b51e606da144e2b32fb029cde325456c88021dd04a80b93e0665f7e39c1e8a56bfdcaf4a64b5cd80fb8cd7c947a98554a389db356265b198fc72df311d010d98c3d6e3928\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c066693ba1a2191967ded9338dab201a79f31370",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1c0100000093647caebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd200000000897280c9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf63000000009dfb36d60406682001000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388accbd14a30\", \"prevouts\": [\"e211480000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"22e868000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\", \"cd58720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_csv\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7839dcdcda4a68b6d8036ffdea6037a2585da1410160ab98fda3e8769595116fc1ec486a359dff8aa6e022c34e6e36cb414aa7731574a0c2f6477f8ad6603886\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bdd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a37f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bdd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a37f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c06e8cd4278bfe18806835f29e8892fe38588b77",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127047000000008b866bc6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c94010000009b039ae9048b395c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8740000000\", \"prevouts\": [\"aed50f00000000002251204f95e2d0ca6e5ead217b338fd8f5ed161ed18d9deb82c1fc7cc39fccfd04e4d9\", \"414e4f000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ef9dd54afee6993a303fd38df7733ffe3104c2b75362843dd01bd11eb312076d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a00616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c09fc10086b95973815a1c9f85b9e89af0b68a27",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0802000000f4ac4498dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c370100000052b315f604819bde000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac2c000000\", \"prevouts\": [\"1d9887000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\", \"206059000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3044022023c1fa86a88954f5ec7acf465d03a69066358cc1f41dd00038fcfaacaff94641022066878e3a4f54cb42e604936659bd75168525b2d7c6308baad77ee15e685e418f8a\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"30440220681e0fc8eaf45c7a4d3765b5b8f7b5f8cdff8c9d0a0509521717d4e78089587602204a23362f703e0bbc418836ee5ec11f616f326f7280a1deb22ab9c45df9883b9d8a\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c0c65b781da778eab58a96c85067f90b2d4d1f4c",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b040200000046cd652b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40a0000000042a9c23e0462eb5600000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac77020000\", \"prevouts\": [\"05bb1f00000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\", \"45ee380000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"d27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362aacdbaf7feb2ee84db2dc99af1e5f6e1450a5c488d9b9b44f0760fa1ba6b92f9a9c5d9290705897ef911507dd26b72756738dae23c9379fd676f365e52e00fbc5e1171eec0a28263e9818d2dbd976f4b8066e50dd8906a411b6a9dd47f52980e39f192d4dec24b48e9231a08b7d2e64fac2040aad69c16c1d9eedfe5fb62ebc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93621ef10389913bdbd846df0d9639979edfa3f7c76677006bc1a57e34b3956825b9947182c2cf442266d627de6569afbd254a849da3e2d989b935a76fec010797d33479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a9b801fc18e2353a9cd4de337bb33433fbe6225e21bb8b5572b0acaa50d11b7f3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c0d2b1edf6f56cba1a8e2d0b100cb918fd7f803d",
    "content": "{\"tx\": \"da5995b202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba300000000e933e5a4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb40000000057e27db101a5fd2600000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac59005b4b\", \"prevouts\": [\"fbbc1e000000000017a914bf07e8218e5a3c93fa381357100b6dba1ff2a91287\", \"4a0220000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"027d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c4b75a5eca83c62ea415013ce3486a59b49eae62a9a2157a509d555c51c755a41a39935f0afddba064f6b0bc8589127966a984604296ac06f9873b8ee7d7aea369828280661f54bb25ef200c9d39138c753346ae1cc558703fbc48b26980763768cf2d3d0be95621d7446294d89d9a2894510d2dfb4e1a33e7316a17e39cfc99\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cdf75c6f1206420e3d576f860d6a0b821efde2bf3dc8c692e6dddc88ddda04bce4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8c6a1fb55f16de67c2a92ad96c93aeea32aba2f93d3355ba34bd608160e8b6bc30e32049d91f42cbcb04955cd98e985d287b85d3c77c1154d8406ae5e2d81b7b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c0d30a73338909cf56a6d97fed0221e78bb7731d",
    "content": "{\"tx\": \"6b2602cb0160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127000000000001a450cc004ef260f00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc76e87a825\", \"prevouts\": [\"d647110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_37\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"dd90dada34e2cb3bc0c1f80a336b1a28e617f0aecced79d25a14a8df4af56efead7547171fcf2c4f50d3fcce324131add81909360a6e82e57e467ce37f261a3303\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3867cde0f18449fc23edbe75601ddda66b9b7009fffe15dd979272260da4fc1dc8abeeba4ccabf453fe16db9a442b5c646058dbaa922b2edd935c0a795bd485237\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c0ea13628224c7cfa08a24dfe6cac5360c02d61f",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3101000000baf8229cbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8700000000f34c48e804c866e000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6bd667b36\", \"prevouts\": [\"9873650000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ffb47d00000000002251207a2f20e860cda556c5e91362c7f67d77fa79d70cce9558dd8fd8d88940237552\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"537d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365679c4b80b1f02a904f6a1e97bc1e5029a390245cd2e5f4f1bb6526c613587c3c1fcc94e870ec95c088fd37f5daf805336fc0aa07ac91d9d5a0c770a5a47ed76aee97a7dfb8acbc78fdce4694f8ba1e1e3bf612a81f34559c93e6dfd336d600fd892d02e0db2d70aca72db86bdb1e35d04291625c81ec0b3d884b10be9f787fb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e89a54256964294f7e46fe5d25ab3411c34d3792ff29ea326544b7c68695f53859e150f8c7b4812d3362c6afa34922f3b5cc4b63cc9e98285537a088f4a7fe3bee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c0f5b91a651c2d181d2e204758d6556b2d362c11",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b22000000000e68496b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41601000000d14c8d5b0305ca5300000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac832c5e32\", \"prevouts\": [\"ef35240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6975320000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_c7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"87e3932eb099c3a059fb9468137ffd33308793027e7135b38b0ecc5a08d91c45cc164d4234ebfbe9f94994d9ae1d69ac2c9ef3b2b3b5d0dcd235ed096686e31d03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7252e641df0bc016fa072ecdc25a5bbea78bde919a71fc5f2f2de2b195a4ed4f0d54ad8b20505e040c9d01f9ef590aa9a6075c04ebd94c0e7c7458100ab44580c7\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c128857e0f643e229c430eb8ef7d3f5aaad861fb",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708100000000b5ce03e0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6f0000000017b9b5cd04deb385000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87ead3593a\", \"prevouts\": [\"0888110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1a5f760000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_72\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4601f45f51444d2268f82b339eecc385de6945a5b41c3525f900f19450dbe9530d6edb84c287f92e243a66a673c87803d4d308ebbda4316be2f69b2df679da9b03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3975a172f6b9b20183f14bb7f9de1a72f3c5c7ab43ef24b60ad06bb2e05fadf338c613e35c08c3e71fd711b3d47c24f6da5c168f4c613e9e89e57286f4d102cc72\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c12b71a60e309ebef55284d493cfd3665116ac35",
    "content": "{\"tx\": \"6ebe113f03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c480000000082f72a8cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba501000000f5b89fa8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcd00000000c556cf97037ed2db0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acbb000000\", \"prevouts\": [\"98a94b0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"d2402700000000002251208f7166d23fc1e45fbcf26b51bd386ab915626b0708475a8743064036728c78ed\", \"8f956b0000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c003e47312495abd0ecea483b7c96f6c06baf07e98ce450a7ab8fc6c1d015d8d419750c06d432bee308f0fae4716b69cb6c25810329b8790fd49c679f7455a77c48cdcd8dbcfef9ad7c7a30771944f2cd4ff67f595b136e3713763062e27bf597e2a087af95959b20705299b695bcc76a7499066c9215d50f1f19d347c9606929e8c43ab2d3c8341e5ddb2e7a976063d2510ea844334a2f10fee1c2a194b374a38e3ab6d6964d755bc0e13212d27e73f5bd049b310ddca632309f40d884ffbd4a43518f5a62961bb48ab613036012a74e221a13c741ea9d3963160e74d5f4ca891448693b23cfe7ef23bcb8ad48cf9686b8b274e632515f150eaba77a1534100a1fa86c4673276316b981d8d3078e7ee0664161ffdbc80837594e11de603fee93a0900422ce8414d3d9ec31eabad215388986f38891e227d1396cd5133088788fd1284c6850ac04377717ea6b69cdfd22358623870c8c1a53b7eef11cd26dfae1a739b323e4dbd888fcc7e46e0308658560a426909489d4b1feb2a72a4042cd2a6f461ee247c48f08002b32a808e4f110f3ce3c9c632099629abb70ecc66da9b3fbb5a8749c9b147a33d669d56f22b0174c822ddb2128eaa425729f909cde6e1918db476fe7415b5713e1ef82d92e0d54e9c900746e84627a7f3ab67a68c4f52ba4928939805cb52647547755ed599179711f9afdca1c437b25d71a95b51f9495b6d66766f017516ff7595\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936efc04f522567ba440a5ccb1f894ddfa30e3ed18bf7db19d3822c68f4f6bc07d299aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4c1a4178950446608ddf8409535ad79bdd567504e9e3f05b7b17ad70ac9eb9eeed4a2033150a39b6917f88ea297b4f989401264ea3eb8667a511a69e57850c639\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09026a1aa4aff7525e1ad84d9de23fe30241b0645131eb0823fe1b7b6ee6335627908d03fb9eddac278ef646ff04d5cad2b264959ac6f25e1b57d2ddf53be312006ed4a10b770de0c068b97e514f09193b3dfaf4a5fe8f2e481cfb3202cbcb0dd886844f0bac52b8c4e8d11c13e990ac4dc212cf14e7cfd6418fb28c7255839eaf8686486cfa8ba11e1f2ae28e8028e92e4196d11f678551aae673860c2b90207c87dc73675e7e892238ee288a1cba2e68007a97af98924dd2b7ecf893334e8386e75749a121dd864ace9c3d6bc81631c5af4ce37f99ef20dd33a41fcf6b8a4bf1f7b1ea0c88bdbb0f728012bfe3e7bbc302faa78fba4886febdcd99875986a8735de6c2b4d2fe313fcff2d74ee5e92b316b4b112585ed46eced024814390a0e4cee6927ab3668932e3d3e94ad79201f4eaa5eeaf6435cc18f138b3bc125456034fd0d94a1c730f35614b898ec8c39f80c07136a617e4a07bba4188069bbaf630da2a801e4c525385a6971ef34b8e1e9fc1f8932814a12bfb6e36c90e8cfea1c01613fe57711ed3412f7255790e6d7aaa5d6f36fa3099d9587ad673890a20ac2b5f609959ed4eac6d35e6ae71a2ef50210543fcd8c2027939f36c9f792cad02d014d42822e1d22bc242afd14f1130e2817391fb27f983e15133611a49692d5619036af5b3c36abede1390da9c78fbefcdeb60846d406856ed79d67c73c13b7e57285f29a8984fe8d0180c37561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369af08a3754cbd3d543e874a27ef2608692e4496bce300b07224b27cbee5eea1575c046d699a38e7801f010fab6b697cc237a48311758c02bc29e281a6d7a682eab0b669047babd6208c97c1428e12fb9e633b2b0d2e51b7853d96a7caae1fe0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c146489c520399688a56c27fa5210f00c10e9e5b",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3c00000000038eca4160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270650000000086bf9efc01da691800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac09bb0336\", \"prevouts\": [\"9b0e76000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\", \"3acd12000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"907d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363bb05f98c2e695c01e670dd2e228a24813d9ab38bd8282e6b549b79433642df758fa50c6d7a3057541347f50382af7d86a4158110d747d8a87c6e51bda235e7807d6dd053b835b300872a79bbaa392d17bbe19548a92a63c5948e9fc7e63dbc8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93653f88528edb69bcf55b01eb77e975ccd2596bca40cd6e1e17cd60b66f98d72ab693163a47c3dba2861e33fa837573abaf06e3047dcd3f7c322d2576c3cfe3d489f4b63c6df7ef43e2db8ec562e1d1dc49232dee39216a09a14bc3b6a66d1e38f07d6dd053b835b300872a79bbaa392d17bbe19548a92a63c5948e9fc7e63dbc8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c180a8fea16357ccb1c9e9a5b1fcde5e0137ba39",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701602000000869bf9f460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701402000000ab8972f801e82b1100000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac09010000\", \"prevouts\": [\"a0941100000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\", \"2266120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ca4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb460e4b742334a3ba05c34377629280dcb4ee1c5981341754674382732961bb035dc18898993c284d2f731b7495cb62c60e8571430965d040562487638e1f1fd248a698426442c951e7251e4e87784c9556d503d37bf6168d5559e89d6402ee5a2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93693549492b615adfe57dda9a6672912be33acba3c614b0a4dd60f18b8fbbcd54c60e4b742334a3ba05c34377629280dcb4ee1c5981341754674382732961bb035dc18898993c284d2f731b7495cb62c60e8571430965d040562487638e1f1fd248a698426442c951e7251e4e87784c9556d503d37bf6168d5559e89d6402ee5a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c195e2cf967dde5160c0de3b6a514dbb2ff8485c",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8000000000896880f4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2302000000409c9b9802fd1ba200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acdfcb3a45\", \"prevouts\": [\"2ca35d000000000022512084127e09a3e5abb8e6ea0ba3ce4737d1c2349f1be422ff5ce1609ab9b3fbb01d\", \"3634470000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ea\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e528ab615282b5f0511a58b57e63faebf8e8947790793f371e3c9f72032feb5af440ff65e2a1a43986e65cdacf01f3e5c551d5a019bb37ed8b2272bdfe68e76082\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7976428c28abccdf2f940adf0684acfe07c9eba9f9b1b456d68b6759fd089665c379e5e54ceddd2e782583fe0a14c3ddf2357e4343a56e9feade163d9dcdd8d1ea\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c19c13729ac0ec5c7e396da5494a3f513d31d8e8",
    "content": "{\"tx\": \"d6166341018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4790000000010c750d201fd6300000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478789020000\", \"prevouts\": [\"2d9c3e0000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e44c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936036751089af36ed5c0ef7dca2a713ca9b31e3a2dfbb12490c74aaef9653ee48ca81c44a09079faa406e9dfe20ff322801dbd7fb1c55ee11d2e1c43aeb4d3cbdeaf2eb908b8657464a6ead7ee639edc82f346aa77dfb25920bb6227c2c4c35ffd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e13f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0824d4fab40ea135233ddc8c9f724889f007818f7ffad5749db3376d8fcf405e18faf2eb908b8657464a6ead7ee639edc82f346aa77dfb25920bb6227c2c4c35ffd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c1b84b02f4cf106428923ebb095dd6888ae0ac50",
    "content": "{\"tx\": \"ed787e2502dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4101000000e197ff86dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bba00000000cb7df6900128ef2b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87281dee3c\", \"prevouts\": [\"7dd81f000000000017a9141a56e0fb41afaf4b9e6feff1797087c69015162687\", \"4674210000000000225120801095ecb8b6618653d214b38461db03e06a33e3af24d0223ea647d6569eff0d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362fd70b7ac25e6ec5d20c4437e9dc3fc360c9cad49d8a5534acf4ee938278cbb5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a4a616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c1bff9e88ae4e9b8bfd1976fa22c1802e6db3962",
    "content": "{\"tx\": \"b809cec502dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4d00000000826028da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708200000000d8400db60264ac6e00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acd4000000\", \"prevouts\": [\"3910600000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\", \"4937100000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e34c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f0d1bc393c3c3c2b57b8b86a9e8a64bd1d4b9e0fd1bc4525ebf92e13eb29f90821a06fc3128a9eadf7c181b12783fc0ac677434699a36c8776c14fb861b85f3ba54f7803bb2e93759f587214c70a485617458826e57c89c2ab5c5e7ce47181a1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360a4f638ce23d17c39a29ede58d266fd12593fb14b584adf686071e58cd6de6a5d2593bff1b0effa885b0aee87a7b2d32e61d34e0a8c26ab8da95f21cdf0740a021a06fc3128a9eadf7c181b12783fc0ac677434699a36c8776c14fb861b85f3ba54f7803bb2e93759f587214c70a485617458826e57c89c2ab5c5e7ce47181a1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c1e5922d5f60798c78f4d0d669795bdad1a0801b",
    "content": "{\"tx\": \"757a763b028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c476010000001189b0d6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3f00000000aa93a3e00138d3410000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5f354861\", \"prevouts\": [\"8ba4330000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\", \"91555b0000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369c3c8aba3b1d9c892342e3bb33d29486ec8523eb8867e3a771f2201c80f0f2143493aeab6959567855d46871d1975f827c269435f7c9757b13dbaeb906d5d20b01b5a419c18d23e8c03ade77009761f1ea37c255231895048329572c11717ad56187254dcadbfeb5c8509faa2902470872e97e8359524e33e4df3f76314d708e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b31cd2587ef1d28654819f6adaa2ac28a0f894d9dd869941f90cec36533241ac3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821de3578bd50e4aef3f42172206e28aaa53f32c3941b8b4ddcf806814652917426187254dcadbfeb5c8509faa2902470872e97e8359524e33e4df3f76314d708e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c1eeed88c600ab669ef89bb18d5ef6a6830d4f0e",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c64000000003cf989cedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8d01000000056889d804c0d86800000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac35030000\", \"prevouts\": [\"ec1e4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a78e1f000000000022512088381247371028bcbdc4971a16b3f7d8df868484be1d753506f5bf6782ea1e55\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936443f9e607c139397158640c1b36ff7afb5325bf4b323e9b48798bcd0a0abafc0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a93616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c21065afa4b19740633e3c552a080169d12b4afb",
    "content": "{\"tx\": \"dd2936eb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49e01000000af2fb8efdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1100000000d31f29b504d62552000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc89ec6633\", \"prevouts\": [\"327935000000000022512008f3b8bffed108016f8bc06cf0d4d62b3035ac315959ae84338bee34a4bab63c\", \"dbac1e00000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6afa\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045b9350299288462116e81ad139d1cf2552ad17a94ea609f697964ec86e4a0e9d9319d91594da7fa35d5ac76c3396b108bc28aa6233c389d8680e4f0461963fe656f5053dc49cb92d20c30fe5ab09c589302aa9886b9c794d18405aff33121a169\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936454ba48940f06012a7e7a07aeda3ebe402d4ace9093c69f202ee75e21741471ec26d78b90df0408cccf5a173a397f35b7225b23776926a85911da6ca9e3721966081f43f8c34257025162ccf1daca48ae61c99356c3eb24d5601d3c52dd9de2a6f5053dc49cb92d20c30fe5ab09c589302aa9886b9c794d18405aff33121a169\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c2268af10452034a5d5f9268c6f6797ab805a459",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7a0100000095d9f0a38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4af00000000ea0b84ea030401b30000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1bbc2046\", \"prevouts\": [\"1ff07f0000000000225120aee326bed25c38bbd2065ec54ba80d7933aa4c88bcaacc9a661dae671bd05d2c\", \"3a2a350000000000225120cf1cdbebd76187b7cc76a29147a6cff8f4ffead99137b52e0c175bb15fb623b3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f4a004f07a59de9b760d587d4f325f6314ed9590119c6b43921a305306c0ac45\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a02616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c22963b5f52cca482bd79213fd1c9fd9819b85dc",
    "content": "{\"tx\": \"4a4547c3028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46301000000d1c47481dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b90010000006136b0e302a00c5b0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df97972236898718b3c029\", \"prevouts\": [\"4bef3800000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"d1392400000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"ff7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e9987eb7009ccae8c65258c62e5eac53ed5016922d24407b897adc5526f33b91916c082ffd0388de178727289f9edc245ed8244bc4e4186d1c7a66ea621fec0ad\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936481f5e4c3fecd787fe4d3635c6d8b344fb02d1f9c3cab01b9a7177bb21a6fd3df59f882dcce043ab5273f79d0d152c35fae0f251a6812c7f2d3daa07c20029a516c082ffd0388de178727289f9edc245ed8244bc4e4186d1c7a66ea621fec0ad\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c23bb15b95f0283493b5e9660535131e08c4b442",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2c00000000a3ce2e21dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1702000000adcbac73bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0b02000000deea024702e1a1c8000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ace21d5c2a\", \"prevouts\": [\"e96d23000000000022512063372fcd34ad063156fb4dd322415aa59bbac8cc6a5a5ba702cef28a298d42aa\", \"ffd225000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\", \"485c8200000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100ea1e8cb884e128aa84d9e40a3c40db5fa74daef688a97cdcd9e6988d7e0e193c022045dc6b602193065d44469f3544d01626e2370c3267e9d6061182721d9f2bfaa001\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"304402205581dd3e5ef023d6b841531afe247e577b4fdb74ff032c21a2336221f63cf020022069f44da106b7ffbc8b296911dc01eaf67bbbdc7681749a0d72a088121abc404b01\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c23dc3dee1bab058e9dda39e357268464aff6993",
    "content": "{\"tx\": \"4e4d1dfb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a100000000b81df2cbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcc01000000b1bc72eb0373d0a700000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df979722368987c51ca14c\", \"prevouts\": [\"558933000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\", \"ccf77600000000002251209d7a18923cf92d77a70864db68b8be9c97fe6f327eec6aa2ee3bdf40725ab507\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b9798a20989a5feb5a965ca55edd87ba1217bc1ca04ecd2269077cb90160a0c2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a46616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c259be6e071636a46f638dc71fbf337480a65d62",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba0010000003f954bf360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706501000000f7025ddc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ec00000000d17f70eb03851b6d000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3a773856\", \"prevouts\": [\"90ed1e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6154110000000000225120685f1f4d981f8d279e9288f3fac3f130840e4486d97e094876558f7ee35a7d24\", \"1f353f000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c7eb1717b6b13726048969a2665ae197b80aa3a5f647d9b50693aa355611c1a6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a0e616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c2606a81031cc7d45d665ff29e83009cdaeb09b4",
    "content": "{\"tx\": \"3969ed4802dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7b0100000059dcb48ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4101000000052af5c1039b12b0000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acdb000000\", \"prevouts\": [\"a65d5b0000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\", \"6f45560000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_1f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bdeeaee1525e0b53b60a342fbbf99f814b8f7419e1a4c3609cf9e0df3412bd4c47ce6f1a34e8420e890e3da1d3b6302bd99f2933852ac9af26c1b10c8030892982\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1ec178ea05b35e92b545d8fbd11b059f8d8bb6a4a2a2e07d7f6f85028876d933474961b12ec3626a11226bc4c62b729c8fa089a0a669867de4cd6602966440251f\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c2615fefcd8c48ae15d7cdf715cb7cbe15365bb4",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5301000000c8edde918bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43e01000000b111da8a0260cd5e00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac99d03b50\", \"prevouts\": [\"5d9f2200000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\", \"3afb3d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"447d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457430173849036d038bb15ccd29e38ea974083458e0cf50b14971883c73e09395afa4004b2cd3f2b5519985ef4ce40029d6249627881f39179d9882ffc68f5bb6a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa08f12ff2db60e07951e3ece83f8d4c41d9b16f9cd93bc43e76ab3ca16313aee1430173849036d038bb15ccd29e38ea974083458e0cf50b14971883c73e09395afa4004b2cd3f2b5519985ef4ce40029d6249627881f39179d9882ffc68f5bb6a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c274fc041bc18ec36b6fc361335ee8c903ba6539",
    "content": "{\"tx\": \"e4c3fc72038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ad00000000ef3908da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270740000000074614a9ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1001000000e3195ced032611a5000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487bd79c71f\", \"prevouts\": [\"c47c41000000000017a9148bc1125bf4e3450c593a5be1ae9a05461832d39a87\", \"ad5b0f0000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\", \"b47b560000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_4a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6f5add61f387f705b44928391e0e61f052851a5b6fc42e27ecbd22e50f941c9675a8958a35c82f8498529775d6c03090bbd893a043402fccd51f9e695a3aa57481\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a4ef629598f6c12594cf05a0b803168efd510ed412d7fe6dccb3066c1333c50bdbf86eb477835fe54992648b7af262e5f118ec9d1e9016364402960d58b762224a\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c2b521f99f9142ffd0f06f35fdbf0a1e6db3b411",
    "content": "{\"tx\": \"b1bb4f9803dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2400000000817a20b660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127002000000008e1dc3c4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2e01000000783f4ee701e06a59000000000017a914719f78084af863e000acd618ba76df9797223689870f010000\", \"prevouts\": [\"90cc23000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"7ab50f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"546d5600000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"c8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361f4b186db3068532a32fed88b54244ea5875c098571a7b8b359e587f4f4af633460b19c0accce5a24a056b98cce949d671afb14dd91d0cbdd469fc3f22c90b1553249301ac20ee33639c015b4a618b106ac87c8ade2ff7aca8998bda2366a260c3d30bc3225049ba56ac02c164836762858abedae6e6cb81f8117394fa9e456e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368d0665fc26da953a71983666256fc3789345858164e4e7f74d6a240db5c0da6cab352ee2a6a8e236a875eeadb35b814571c290bf5fc32e6cf848a4bdb48a3dff6032c3262f8d7c29daaf8f9846bf0ed9dbcc4a0f9aeeb7c8ab8b4ceb985f45a6c3d30bc3225049ba56ac02c164836762858abedae6e6cb81f8117394fa9e456e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c2bc316e1620048c72dc6375bd6c4de0d175594b",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdb000000005eaf85bf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e0010000001162e7efbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9701000000c3c69fd004347af5000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac82745761\", \"prevouts\": [\"612151000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"c6b8340000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"f439720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"d97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361c4a25f5074612e823ed206625c69690dedc2f0ffcf1fd8ec35ac2b8f31f4b29f72d95b601af8434dcd53e2a5d08dfad1c07e45b1031877afc5b1801af7debef3d33b10ff9eee8ff434f7c79f826d5967b94922da2ad2ccade1cbab3a3658011\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93673ae5f4f7cd376f4441ea68f12423409d9361f7b0ff0edde6dbcb904ee162fe14852eda400aa94cfe5024bf6d05446bd810daab3c27f5a95b027bfb109f343b83d33b10ff9eee8ff434f7c79f826d5967b94922da2ad2ccade1cbab3a3658011\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c2ccbe9e06e6c7ce6e43c0b381322fc7dc10a2c2",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1e02000000912e21dfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9a0100000031b47cf98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4980000000092ee46990448da0101000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acd8010000\", \"prevouts\": [\"ac7a4e00000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\", \"3b7a79000000000022512065eb0ad8f24d6d8eb63c7f85eaa52926e45dd0588dc97971df796ca5c67918e7\", \"18b33b0000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"847d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362f045d3665eb25ef0cfe4d08419a1eb3800b7f1f14f27f92c2783d7ecc4f2c0fda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e9f6b3154707dfd0cc47160c458b5d6bbad5dbae79d1b1aff02b8c8f076d5395a9f31796df107fae040796e44aea27c7a7d41418cdc7206378fd34089f9daf951\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93676c67a55215528913c30fec21d45efa8c386b671cc94599e91e8442d85e2d1cc9f6b3154707dfd0cc47160c458b5d6bbad5dbae79d1b1aff02b8c8f076d5395a9f31796df107fae040796e44aea27c7a7d41418cdc7206378fd34089f9daf951\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c2cdbf0cad554855e5a2c77ade2426042fd077d0",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbe00000000a95271d0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcd01000000c9707a1b01a42ac8000000000017a914719f78084af863e000acd618ba76df97972236898781bd9444\", \"prevouts\": [\"5b3179000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\", \"9c0875000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"304402203bf34d1bd454373a50eec8a5e728c39cb8e09001f12513069d215a1b1680188502204f118ccef7d2555779780a1fde3d1b0f336f9132acef2601a8459619177c910902\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"304402204b3eb0544a48531b4bb966c0bfd3b5b6ef629545c27f893e1f6bbb12c375a0580220733de28a1be355583ae9fc59d112b671bdf0b2ac08b4dc69a6217b5819c7440002\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c2fc3139b18939587fa9376d426b5ed6e5a7d384",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3b0000000048f62767dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3600000000af19cd280474a0a200000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df9797223689873baeb45f\", \"prevouts\": [\"0bec7b000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\", \"0f91280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fd4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365f3e79e727db2ce69498c039b8b655f97a15b215378db35ebb03872d036f84823effc93d9a59775ec6af4eadc6f66e855123af6e736654ec63572366f38b17272c347795cbfd24b3bfff0bc05cfe1b5e01afc0104c4d9fbef2a45c75fa918ca8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51cf0ef20a11005175256561cf2f67252fad6f828fd45e261da47aa072728c1e1d416efa3a61de7db58e4e5b27e55eab88df01883130071a88e8c07ccbf4e37c61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c30440e2e36842767c6880d3419ffd67d8fc65e5",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7001000000a1395d8cbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff900000000c2c480d30471ffe6000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e733000000\", \"prevouts\": [\"a365820000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e03f670000000000225120f6b24239f005e5ad8a4113ec06c48cda726a0e511c023e717379412f24fce34c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d8728012ebba8229da41e85c5b00392b3bf786c257585b2b15d31aca865d893b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a87616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c30828b92e910f121013ae0e7e80f112ff29c40a",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce7000000003197a88edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cea01000000b341e2960409599100000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6e0000000\", \"prevouts\": [\"745348000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\", \"f5084c000000000017a9146db815d9819f256ca5d1e70b15558a98689cc52e87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"1660142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"3d7449d3d77f1da18c3361e93814547b7c2706a727e9fda503840ec216e01fb524548e807051b5032d4b8ace50a272df365cc1bb8608790ac017d997eab25e9f\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c30e1db5cebdf16c793ac3774df5940ba0cbd27f",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c22020000002413a1c9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6701000000ebf5dac603056f6a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fca045f754\", \"prevouts\": [\"7aa5480000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"691d2400000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_73\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"51c9e0ab65da7fccc01d3bd3d58d7c97ad08adb582ab798a516708555cf656e4d6c5f66658aa78c5d42acc5e28261abc0947fe01a867207f73196947a5b6d38481\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bd03c9cf21c7618806d5e409ef472b991a286b52d2131d7c0e602691857d270b49d6b52711682b55c4046644496c905826f5230b3068d461823df725fba4bda073\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c34e8364c057d48255c31d4626eee97cb90971f7",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3101000000c451b5dd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127015010000002772d9f604f9e86c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df9797223689876014a635\", \"prevouts\": [\"13265e000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\", \"6cab110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_d5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"85838c332a60598ae003c09c62d8c6a00b57488a5977fe58dc59d3ac4b5e2d7b98ed6004b3104eeac1d9be88b15172a86df3662d7085e9867e0a44c15a36aec503\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4b331e586a685915952247921e66ec5d71d2e07ff2b64a9185e6004453a31e0636e318d9194dcfb999dccbf82287d5dc6999f63243a1d36850618b1ac0dd4139d5\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c34ea38700b3874b1fc56b98fba764e26e442bbf",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1800000000ddf5b1838bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4780000000089a2312a02051d56000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acb49fde2f\", \"prevouts\": [\"49f925000000000021541f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"afa3320000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f3d1ed496c94623ac0a726e91f1ebdf8d2f1f8fcc969396465b5fd55d0a712c470db6ad280ddedd08026910fb3b73f38cc204ea712a73f0461c35e266bcc793b\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c36f9ecac75a1f8369062bd659d7be8116d9426f",
    "content": "{\"tx\": \"c6803302028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48001000000509492ecdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba7000000001c4789db03c46952000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6caebe045\", \"prevouts\": [\"280f360000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\", \"6f4c1f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"df\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936744d5f1fe8cccbe7a1aaa208055fcd73d33095ca4828da666b0d1eca647814e1d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5115b534b99635107bf366447ce9661d5eae557250694ef66e76c31b44d1abe134360497a554a17affee0221519da82623f7958d9c28014b232926f5323d6c78d1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d27e649847556e23192b8aeafe173c243f56175d6d7082b77d4d94508f7534d8345e83ad245d963f373c443dd6457dec3808a4f865920e34bbc543e7d04d4c3d1c315aec02adde316e700f87e7c47f474d1ec7cdd06b196ee567d81a15967a13360497a554a17affee0221519da82623f7958d9c28014b232926f5323d6c78d1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c3759872dcc57d4041c64cfe3164f0beae9647dd",
    "content": "{\"tx\": \"dbf3e74b02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b890100000001737dbc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700a0100000096c4f09401d39209000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478760000000\", \"prevouts\": [\"7252240000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"189a100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a0353c5fbec3cc02a1bc5415d9b11e293487c4582e3bf764f748581ab8af1a21ed68ad085f5a382b0c2fbdd0c22361680fdc52720905ea6f5dbd48c464194db6aedcd2fc9c5943fe706019db34269a1ea53cca57e4f35fb05ac8058a5f51476448699f23776665bd579d3518c0e194fb49f63244e5db8117060de3cc6ffd2eb3100ab31a14e3515571954fcb661c2c8d74c8e506be28b545f26de328e9d2779070e53d4ebc66c177b9fd080ae4f11e27d641f53fe30f6c64c58b84ead84cae709863835327fe1a7fe4a8976b703b592dbc3d259b73e2ad87632a3f2940c432dc0d8950d3e20c8784fa2a6e25576a01ee58417463b338c8f28637c8a756bc9dc58e5849a5875bc3f702b6d37eca2704b77802926670adbbb6549b4f48cfa18565a655123c24f5062f8eb147cb15312aa871cc6c3becf43165c541b0ce8d93b20925848228fa13c09e05763ce05713c531205c76ab45b055e284ccdfdc89691a3551de7276dbddd1c547e2cde3ed75ac6b67742c95ce80ce2b4edf9f8f4a772910d9d16413082269ae065f28bc88e007b723a2539efd081eb4574a8b21c2ea77967cf3354fe09764afe6ab12d4c73cef933f480498c98c576589fd995b601c2504648c485e209a0761dc1b2fee8c09bc5612d735f694c3a508050988def09a808da552d382936217948cfd8fb0538b7d0674724d2a349c497f952732f4e47ddc45242d009cc2b8aba16f75\", \"367d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936081632f3fe6f9ffa833663821f6544b710f6647bb31cd6fca3974f1c38eb8a74293ebb87675db407435945ccb2e2a6a79ad6cc0b8e2f03768d51396c4a1768b6d4d2cf0b4a04f3dfea651ef6d0b2c4d5fffa0a14be5e227661027bf8174dd263cddd84017ed719a58f336e1892f80afe07727626533c4c78318e44c39862ffd3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b1185ae26fd8fbdaa90c2ffc87f13436571c7b8bc43ab1bb2c6927b296eeba7eda9d5cad8204e4182bc8dfb6326e98a45b19c3e04ab998cf774a9cd59514a39519944fea0721220ec9f67c08cc8769aa11805ba2d2baf8742d7abebedd893fcd60be501824168b0d7f38636bd0f9f563f94c1d15e75db5993ed1c6b8de187f95c5ec7334ad62aa0ba08c3ec489a9fc9be069e4732f9fbacd49771b78784b5c5af56e88ff351bf5afbebfc30387753be76312b3903b85db9621738b7fb164e587972b720fa7a5fb5b858c9d101f6b13b46905834b11ee8be00d797c468f42fac1e5d94c24cee8d360a968d571de68bf927d96c377e73fdc1433290a6197b9bb7510155efd661eec9cee2792ebf1bd38a99c73d595c5b2e56a684ca28437fa71614758c34ed4660a8600d1b8a7eab51d85d2c50fe7245a178220a35f17cd0a72e5923127c6d7de0120987191a7516acf5e772ebf22b48a55ecbf6cba26f6dc0664a114188c120bbc6d8586f7a08947ff22d193ac2543bce6c83584b87b8f8977433dd41eff14ab8dfe6b98d5f8b825455d00c126b4a43705e022b0f663e2ae8dc5d30c15a3168977dda3688d4c487c28e8d24fb3b25dcf34d6e7004f32a8cf38b56024913764eab419c634fea81ff0cbe2742f6128c142051ccb614933ba48a653c29649c746f7d6f45af54a0769c00872cecef3466191c1213e713696d1d6cb596f9761f401e1eeacdf75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb94a5b3352296838f351f650ec3ca72e25dc2a412f5bb92aac76541fe277cb7178448a7537869648343bbbdc00eb4ac0785a5f2aec0111e81b0d25ebde82a92a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c37b0f05074e165869fb4e36093d5d05e7f5cd58",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2400000000153b568004314a6900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac500a954a\", \"prevouts\": [\"f5056b00000000002251207c84ae2d9063cc63412a30e00823aa01b05bc54bcf6d9936dc1c650bbdc9e98b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"spendpath/truncshortcontrol\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ae8ab4a2676af693dae1493617eae9caa947f452112902321a990ac6d74668a97ca7b2de345690fcb1815bf33baed1aecade9d1324b0318ece0425e4d9129855\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ae8ab4a2676af693dae1493617eae9caa947f452112902321a990ac6d74668a97ca7b2de345690fcb1815bf33baed1aecade9d1324b0318ece0425e4d9129855\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c38df517f192e8ee8b749587f2286408e1add7af",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270230000000056475b9ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca0010000002f35f8e0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8900000000ccb14bf503f56ee6000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898746a49225\", \"prevouts\": [\"6ab20e0000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"e73c5e000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"aea27b00000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d25bfca305a764261d6521057603065fa946acb912c8ef078a9b999bf9159765f90762efe0ab9c58ac6ee07d07c88c733679b2f6b8a5cfbbffbf19600e5ac3c60b9de9d2ee16786568422ac483b36fe1c9fcf95e65bd3b063efa967e10d688730cf51f63f2f8d866e6663e3b4cb94fe811e1886694db682d7576d055e1b313b79f8ca6e54d8d125a3942d479774dc7a0d5f4e722a498ada7ab9ff7e33cb285ea9a05bfc8ff664a654c0014933940d35ffb6330ad111c7ba46295d01d70b1ad1e8ef0a133c3b33ad3b8b427be3f91cdfab40c1d8987229c4083581d550d42a4f5e6456b7000ec246f155d2feac21a3a09fac2bf6a859cf6c4d01f490d9e8bcef9c62daf9504d6b14d9fbeaebe8463bf3d637aceba337e936de34abcb8c37565724a388f7b21c96aa2e6b7a9708f4a9d2a9c66ec97e68d455fa500aba487966518e2f4d4c1a37f461ed6564676d4569607b21af0360a8afab9f99fb3d27cfa42d6a93bffd3ffc7be1120514697ac003584621b33a5ce5b81b734f9ef02cb25d0190a2baeb94634c32942a2f0309eae50b104420d724fdc1a0b68418915c254da6fd68d9fb31883fb21d8cc35fb13468b0908b466787e2a7a7e4518ebc560400f6a0c0784a24a35d9dcde65b878efff28b989e80b7bf9fb3aab53a326db801dbe9c9c47b01b567e158995ca8316ce84b01614dd5b7446bb86909e9ec5ec80c2a80920ee5041b262a9284175\", \"a17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08204a5fb755beb1eb88fd06fac279ccb2aada241654186a69e6e0c04e3255c18f895176026b3e005afce4c10b5e59a002659822bde369bd64201565ae4c88fc95c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090274c8897502c436ef5bd271900ed9cf2e4489580d4929443ee4b54bdcc447f5bf4ffa9ee2a9543e50dc29871f45738f58664faae0e9a0762a1c3891d331318a3639c6da5b34f1f5712fee12ea17c629d3947499670a36d9764ebeb484445d3a1b995c5a90d513b4910821e3b8973a691e594af54ddc677bdd6f3a2aaed2b2c593c45785ec834ee2909e7c4d0ec2b93020f7e01db088f3244c252fd8526847108b04e675352df98bfea502fc7b82fe4ceb001313ea8b3f29faf3b1d25350ba2ad704a823a10fc8d9f148df7bd06185d600e4f8f0ad0a2912c87abb39975335cf0b3f8aa949020d49a947271834ecc40f7509e40a01559acd39f0d8a8bc40a908424a5f991f5ee3ba5bc12a29d015bac511be049ce986e39aa14f2590e5291d5cb0d96b3b7b64636220b73c76f376767539887a8d4ceeb8671e5b5a92381f9b4e1f6a836a5881e02b8af8140cdaa1a237c6ca7258c3efb641543fd15414ffae1940b5ee1c4b0d1a641d79d6ba7af663635c61cd6eec9c1a615295f099ede06729c6c747ca7281bf648477b8eb27cfcb2c682022e055d620df8aa75a70fbb923496f4eedda6f31b942017684ce49b902cb0e6860f11bc310939b085b972f211035c8091bd5973d18fa53ec56ceed6fd5086a3dfbf0caaeb35ce20ccba35644f51538a0b8feaa810749cf605d8611a1c752b716cb22a8cffb4642292b1ad976d9a56a9813360a4406eebd9275\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936807704338d8ff9f1c6c694bb815b9b0acb03731da8a0b1434ebd817fa66edf1846c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa09531ab440e1705f1c4b791477abf2a4fd5d47d92b3cb9e3998348c9d3a452b095176026b3e005afce4c10b5e59a002659822bde369bd64201565ae4c88fc95c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c3a855f0999c9f0c734c21ec479b4a2de052c197",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42c0000000025baee978bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42d00000000755c9fcc03cfd46800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac95000000\", \"prevouts\": [\"4b5534000000000022512014c9f4af3daae468ca53c2c267c1d6c7824da89a84a3ef6d580562d3f844fc64\", \"4ff0360000000000225120b7b7f868117fc9823373a98908173a9736217ba3f26290a84f96d4cb32d63ac4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b1ad425f8fa42485d7293364b8a850d7e34fa33327ba7ff1de82301dc0a195e0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a7b616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c3ca44e765c59aef19ebc14444cb23801ff338d4",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c33000000003fb3db2960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708000000000f56cb0cedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5600000000b56ec84c033b18af0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac87d19161\", \"prevouts\": [\"5469470000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\", \"ad4f1100000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"392e580000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"eb7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c7d98603ca11f2d62da2f097293e2a9fc40838a31eb24ff9d7fe998ee66e0434e58e476735d98d5a1185fd7ff42bb7b31cec58182079010d151d415fc7d6c3e4c2ce937a5de573933a673baa3adefc0607b7a8b345eb0a9388ff089ef522bdd2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fec5402c57463b820a037283baf958dfe8fa8ff5b14330867ba864fa7bbb305c3f13c9f2c0ba7c3724f3080ca99cfd230291165bf004db5bbadb2403d0b759af84ce21fa65bd655e7fa8dd3695f51b098b96b5173f87464f2936878bf520f49fc2ce937a5de573933a673baa3adefc0607b7a8b345eb0a9388ff089ef522bdd2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c3f3469ae6022ba9a824d15d3e5c6966ecd2729f",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b930100000044a29d078bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40600000000ce8be267bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffd000000004601938b033b82dc0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac33000000\", \"prevouts\": [\"0ba127000000000017a914e014b0ed75ce4306970c9f63e88b08a5a7bb4d0f87\", \"44813e0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"691a790000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2358212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"8f6e30f3e56f652139cfd8158d375f33d485dd0df08e2f04d20e3a4c8483122635fa195cd56cae46f25bf0f0a5697ea06506b59d758f9fc437dcb656cdd1652e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c42ba6332f5103b6c07a6d7b7c7a96e1345fcad3",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ec01000000cb4377a0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffe010000004024cc68026864b900000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acdd020000\", \"prevouts\": [\"64e73a000000000017a9140917710a6236c7a08b54f54b004ee705f2913e3087\", \"d82a810000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"235f212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"ab4e0ec3823951d486f9919ba80751933ed66a0103bfa7a6f7350498163a4207c3765fb3b485bf9e438288b898517a24a341a53a713d248ed56b9e4397156ab8\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c4499beb83fe2bbc215490890a252106247a0d03",
    "content": "{\"tx\": \"88a47fd8028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c442000000001eaf11b1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf21020000000137c7d2049d1696000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc370c5044\", \"prevouts\": [\"466038000000000017a914525ca05541c81a105639c2efb802eaf5596cfe0187\", \"94b8600000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"21521f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"81cf41ac01a8d340559ec283da8639f3fff7a149b72f7168ecf7c03f4414197cc498af8b0c059c0e1181f6662b53f98c1fcc8d007d3e425884e23a06c8de5ffb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c46f7002e386e4c4fd5c63195b15a2720dc604c6",
    "content": "{\"tx\": \"4b63d655028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43401000000a620dba3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1201000000e5f7c897016aae05000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374878343df53\", \"prevouts\": [\"fabf390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"197a490000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_csa_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef3255bdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c5eaf172084393ea09a176390f4340749936672be03925208dc1f3cbdd1cf29a65dbe5716817f2f69003e2143c5e08043bf2f8dfbd59fad28648d31d2301f8\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef3255bdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c4b2c2074e18699523a8e60939dabe323e8cfcc8",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b74000000004fcd769dbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9d0100000099219efd01df608a000000000017a914719f78084af863e000acd618ba76df97972236898710000000\", \"prevouts\": [\"b816270000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5df17c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_30\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2503a87d74c773c4ed6a048416b1efc81fcf8d395b0435b453f7c08e2d5fa2f0dcc0bc4fe63991f93aafae30dff7fb33065c6aecae2bfeff9344aae72d49921f81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8b436722229002c05ea6227a29ab4f3713ab338d5186cdd97fad8a99c28afc00214b81f78110290ac1ac8e3695a2c46f2340fbd99add439f17606a80d715429e30\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c4c19d4cee5d79334aa9c0ff61f19d321cc3941e",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba000000000a4dea4a4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c51010000001e406ea960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701e01000000c86dabae0117a21000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac57020000\", \"prevouts\": [\"0ca3270000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"d08c4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"08ab110000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_16\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"be863d3cbeba81efdade24b193a1f92667829d56035609ea44bb08a9739be1c5adb31005e64216ab1cb23a0575cd5533c045a435ee02777f58da29ebf95f75bb82\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d3a029059e0dcc015bec136d195e1af3206f9150495ab29ed25a2747483c9b619e3b23555a2b749300d9db591cf7ddd4fe4b57d28a5a6cbedf7f7cfa5d0ca42516\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c4e28343af816c29311d37b8559a05b14d797dd9",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4901000000049cf49e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b801000000bc4daa160275809a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e754000000\", \"prevouts\": [\"0c3a6400000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"53e838000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_csa_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466dd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b1a80ca318006d147a1d5e9a294c73ae01beed6bc88e14ab81d5c11d79d99e2396b4366028f860e35e0a8e59195a81b7eb4ac68f35c80f4dfdfd5e0bda8358acbd6832953ae64d\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466dd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c5c550da4ca7e932cdd65a9656f2f7c611148d24",
    "content": "{\"tx\": \"9e51fc1b02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf32000000004143349fdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4beb000000009abff0ed03c1d68f00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ace21a0c39\", \"prevouts\": [\"01b468000000000017a914a8c07d8aa161ec0fed82ac1dc93d81dd0a92012687\", \"54c72800000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"235b212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"80e9c356061bf2ece818b285b3817fd796f5e94296dcfef4c951890ee0a1392b75d52da360c9343ac115e95d49959626b9c80f33ebc2f427e11f0e5d889c151e\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c62a6dec1ec0c7508b82a35dfbcc1d66455eb241",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4601000000944c61c260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706800000000ba4a2dc30216b76a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7966b000000\", \"prevouts\": [\"4bc55b000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\", \"f1b4100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"dc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e96c63bd25ae92bbd16086cd18a0ced65254d43d2db01fd8c973d5ac979d0978d49cd47170ad660e437289f08833289e3b90e14293c0ba427f1ef2b5a93f8559a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e3bfe8b0458382ba4f4ce4b13b8b707c198a710172b0004e49e202e4d70abaa7b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936754c3400f5b19129397404414e73e7234111a3665d4d5bc651a2a24db00d5dfa276acb01c569c39653cc9be144b4517abeee153b1e65c2a7dfaac73ffa4f7941ad29df8a0e62e4f40897f8996914b12118c918ca2851b639742aeab01f587290\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c62d08fa40199eb68353dc3045f6c961f21f080c",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ed0000000047b48efbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf38010000006d3fa388017bcc44000000000017a914719f78084af863e000acd618ba76df97972236898720010000\", \"prevouts\": [\"ee9241000000000017a914a4e57198280c195671631f8b9014214c2f083b3c87\", \"da80710000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2260202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"f0349b0aee20ffdcc09dfdbd87d830a0aa3a64778c92c76b12338811097b9fcf9b67ec92e0109d3a50c1dea117f169c9422e93a567b54205210b26c8f23016f1\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c63b3815a0dae098fa0dce37acfd79f213436d49",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f4010000009c66389e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a601000000edc649680396c34c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acbd5a055c\", \"prevouts\": [\"012010000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\", \"89513e000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"a77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364a2a9cdde08cc910ce988b5b3af607c33ce20f2129cfc5515902d1db320653d12915fd873a4966f8e9b4a3b328eef3933245a1c852c287990317c3760d8289da96773453f0744a158be0509abdec64f05b1db7ccf03251d8359952271b442a24\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93668c2eb14f3f3b0f24a166b832cc6f7897859f8840212d3936488d8e89e33a87eda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e389e677eaf5eeea89a70f01c0aa3bc14cf3320f4b6dd8cc61f33138af3398b5b11a008161139ac7a92b00665158d25501a881aeebdfdbf881ee45b85e0726c11\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c63fa7c5e9f3cfa3be54296de8fcb8c5bae42ab6",
    "content": "{\"tx\": \"1aeda83f03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9900000000a9e71ddadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1601000000c1e722ec8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bb01000000a0e9adf902bb0efd000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acdf000000\", \"prevouts\": [\"6cae7f0000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"02fc470000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"ca9e3700000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063dd68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c4bab67da474338ff25cc5ed4d52931383799134580fe83cedc8cfd52799276c98751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d5c12d2886f924517b8c41f4755cb69ff55f68e740076f0e346dfe7ab1da23e202491431d89488c08702db3cd2303e8a25c8ede371a8df5f96996e099ce5df632e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082d5adfb4b655ff7e7194216f0c9ec7a59b69961b08133bf278a8ed5672f2f6a4fc12d2886f924517b8c41f4755cb69ff55f68e740076f0e346dfe7ab1da23e202491431d89488c08702db3cd2303e8a25c8ede371a8df5f96996e099ce5df632e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c66c43a4b77a41b0bcafd8714216e0e515ea32c1",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127076010000009e98a7e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb70000000033ac90db0331e2690000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f878995083a\", \"prevouts\": [\"2bc7120000000000165a142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"e0b558000000000017a914d574841bde7bf0817694c799002118e85acf040e87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"235d212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"5d53555bf050efc78515fc7cb41c96d7a5577eda299f538f278e08d430aea10e705ebf7db220e1af5856af41294d05b57012e168300ed505ba92d690f812f174\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c671d0d61110d22335aeeff604afc7a78832a1f0",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfda00000000be838db68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e80100000074bdb79c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b0000000006cc0e3ed03fdbde60000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a613ede228\", \"prevouts\": [\"566f7f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5c51330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0198350000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_75\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"aaeba6c1347ae721ed1685124a736b3d03522c05f4eb1a01b2bb8b6d33440b30622063dd44f473bb102095c4dbdc709ac36c17dc0b49b65992348cab9968a96583\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f76413d14bb611731012362e78efbcfe20d658bf81085c416db1b1893e09f72916007c0e69aaf4f61624911b83893045ba5c3c5749bedee55aecf8f8b404d72d75\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c684723b339ed9a247b5fe843d2111fcb009cbf2",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b650000000040181b27bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfed010000000fb6f19301b3c016000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487fc000000\", \"prevouts\": [\"9d322100000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"cfc2690000000000225120a276d97cc1349e693e88dad472b695a8145cd2b116efbe16166838c11f43c819\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"de7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936337de194323cc2d0e259e7f698dbd99f7b4adcc7bc7010d92bfb10064ddb4e563f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08267bf5ee6e785c98394c7354db9cd2cb879e9766d4c80c1499d7b3e856282bd13a05e4a06b32de803bd9a925f4d86502b21cf2d106a73f15ada31e997750cbc80\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93639134f96039a0fa33d353d3657d4f6c27571ed27c9ba3a414c0fc3979439528967bf5ee6e785c98394c7354db9cd2cb879e9766d4c80c1499d7b3e856282bd13a05e4a06b32de803bd9a925f4d86502b21cf2d106a73f15ada31e997750cbc80\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c6911c815fc4eb1fdd0b9ab9cd09d3f6af2c6188",
    "content": "{\"tx\": \"52c12c3202bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7d0100000055114ebadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd000000000a78541e802e64d970000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df97972236898705010000\", \"prevouts\": [\"7bdf770000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bd21210000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_af\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2e3a1fe130f76f0975ce2f5a48f984eaba47d877b38c26b106e6462a25092e38b7847704594af22f6e7dc42466872e3c7f2321322660daa44272609008bdc10c03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3cc4f3eedcf6199066344440ca1432536c072339d4b248de0b748e303ebf125d5c30576b558570cd4a2e55a21fba5edba7c6662c60ac98b2bd85d5646dd35a91af\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c69155ad942486c3313ec96fba99eb4b629b0b7e",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ad00000000d70bf3c8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b08010000005adde9fe8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b60100000078ddf57604cdc96f000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787521e713c\", \"prevouts\": [\"6eb8120000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"686e1f0000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\", \"02ce3f0000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"de4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365d68cd89157a1768344d3693d5ddb5d4f8008c6471ee21a81a3a4b68d16bfcc31823ff0d5c6a769fa09e08a59a2485b611e1511239bba2f80aba2b92be945f1b811034f174cb7bd77652d345f06878a8d4eb3ae1b92590cd10e2563bf228d2d6bf82ba79f2fbafe67448595b33026800f76a879cdfc27419c1eb96837433fbad\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52de\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363088a34860ed35f53da8979e97e04104e910b65ec5cc0eb3f7ffdd72be74d9da9c9e480d0f492be6e2f1ef49af1ad63a3a1c7bbd1c59ad16db6c35add41291c9811034f174cb7bd77652d345f06878a8d4eb3ae1b92590cd10e2563bf228d2d6bf82ba79f2fbafe67448595b33026800f76a879cdfc27419c1eb96837433fbad\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c694a3b9670b92c47faef2482e1c373a96c84b7b",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba800000000d44957fc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127059000000009e3999d502b1992d00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ace6010000\", \"prevouts\": [\"9ad1210000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\", \"92710e000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"a69703bebdc49ffe28abcf4254c1e74f8ec62adde182675482310127231ce7fd145b0804a7e3b6a31c29921730a32ba8172061616170deff64acf66b7623ce9e81\", \"503f8c9a366ad4b7874653c110b34a04d85573ccceebbf42bb1624f0fd511c90cbbff3e616b6e563b6a73d39a2261da87df0319d882f80ff1170aabe48774ae76b5d4ed0326f39bfe14af90791d2ad0670d71d2718dbc542525425a8198447b90be5b28a57ac002e78f0eeb72f5044ee454bd21c76d3aba39e7a0f15573b735227331fda5d20883ed980e3d3ac53009493fd8ab45ecad062ed5b18373454e2fc9cc2a7c57e71614a42338273be8852e9f1df3a287ed0bd698afd025d027622799f917b7b29f4a37e2679a6b8e4e696655e7bc45e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ae9d34ecc3acfdabcc7bd36fafb8dbffffd3d4a940c623b580e8ce08e4a7c7417adc0cd0658cb320b61b1a5f1a17327ad4ed3d27eeea9a6999ffaf544b0cab7481\", \"507ded0c5c1a30ec2c4ff46bf5deb5555c6ea2ba62db47889e0ac3730a703948f7b4d21a36530e2d16b76f80eae968a0cee80a5ff46bfc2f8d77f637f562bb8348fe9ff875d7fdd5589fd4f1fbac5e83f3c64649ecda77aa3384732c8d30c85c3aba744bdf3026f15bef7e8e523626eaf26be9e64b6ce6653aa38c273b903b6ca7511e553e31a42565959cc1956e1355695a4552a6f2e2e4578dd7ff1b40b2fde29742c704b0fe9b1d42b85c6eab03cd80739e3c8e85b23b447dd1cc2b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c6a2dc24e570bc2a810731231121944aa2c4a595",
    "content": "{\"tx\": \"4e0dd6e902dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8c01000000124e14ea60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709701000000743f899101ad8b36000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4871e000000\", \"prevouts\": [\"60bf260000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\", \"a3c812000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93632573be4a708d1acd494d76701189b0a3fd387886b4d95dd6f8cd186553549461ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900450e2995ea6b9af074c8994aee2f7f851552d9aec0cda14b2daf9a27b43dc2eeb28859d05a814eb862cab9a6acf3b7acf0881c47896b22b56466b77992f62c0511\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362c2930913668888644f6abb9a2a8056455fd3fc4d16f365da86be00cecad5d5791fd70f8e44f42202023c580ea06f1578af3f03a2439147535e7b1f16736e0d18859d05a814eb862cab9a6acf3b7acf0881c47896b22b56466b77992f62c0511\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c6fa56d9a3cfa039c883bb5289ea577b65e788ce",
    "content": "{\"tx\": \"8a3f410701dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1902000000d2f9abcd02daec1d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487d2148434\", \"prevouts\": [\"27b8200000000000225120ed3968cff76493ece295a6213927f156d049a0539b8afc5b562db91ee008c85a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361b7a72aa3a05c14cb6a669fa7fd0ca3554039543f0462d8a88f34b84c6433f22\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a15616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c709197b022538558c64745e06cce6340703a73d",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1100000000c319839760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270290000000027cc25ce0383556300000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7b1030000\", \"prevouts\": [\"e6d3550000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\", \"32340f0000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"717d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a84e3bf2953ddc9cb8e31c297a3a65f2ea0223693047b485ee05dec8a9b2b04be4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8674d0c931fae68ff43996ef27e2c8ff69e275e322181f769b95dd7ebb695302b667dde4f09f14471eadd81946489c41cf4fd01382a4947d773f1f2d4d0db4c57\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b2bba68bdba5bb63faec40886b7424a0b364c5795c89d5df60ab242d96dbfca40b90ee144c073a081d1ef827361e7936248dbf88e4cb0dcdac45f51ff02f5de2667dde4f09f14471eadd81946489c41cf4fd01382a4947d773f1f2d4d0db4c57\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c70d23ebccdc1ea73e6448b1df58f62d71582adf",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4300100000062fdfcd68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45900000000e93273c30153505600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac25000000\", \"prevouts\": [\"c047320000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"3e083400000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"30440220573cb450c7c479523c98f5fd7c0e3aeeb22fbd9dcb772dffee75759da4b9dd9b02205bdd134c1584568c52b16feeeec73fe4e15875b18291e465e0326083df476c6203\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3044022074260d008f6bf380e44ae47b7dd5339a2a19382b3c9530ac6a6494f11d3334a0022066b16e1e6002bfb8017dcd93322f8a9b057e074cf111913a708d5b9b3e74b8de03\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c71d9516b42225f3514b4d1df627c022e4817ee0",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfc01000000e1fb988b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4080000000022028f9adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bea01000000a94b1fb4012f9338000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748777000000\", \"prevouts\": [\"30532100000000001600141cc39a492a6f67587324888ae674f2f534a7639e\", \"b5243b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9a341f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100c4a77541eab702eefb7750e4886d4b888f4c7ae032224e10a7a9ed17bda1e69b022058545e74087066a9e8392b327e6dbc90c3e898d39e7ca09b651247b8610b2a113d\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"304402205aa9bbce6272bb98eca7922f03b6379467297a57fe2656b7d223e453ecf91221022016d865dc6133fcee77025a773e1a0f092f08c5d511fb4d801f2f918873a09b4d3d\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c7252d6f48851dc47f8c3177537e12abe69a084c",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8301000000820c50a18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48c0100000021f32087dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbf01000000a91f7be901ef40c600000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acac07da2f\", \"prevouts\": [\"4cf95b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f456400000000000225120269138224e3ba14f27cd7cbdc9d1fed32e4c458a99f813a17992a22634094152\", \"d4ce59000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b68f30278051266e32481f29671a6189c6d353ffd83711e7b38c9357ae292bfdef3840bc6208da4f30144e2790f7ad52c95799fa09daeedea4f2bb4d9f8b26232798618f38f0b364851781b96e66cca1de96243a2ea383776a2b78640b336af04751e020aab18a578c160db4bf05505201763cac112612af1054c31721257208a64f4af43c45e5547211998e16db9ce94345f16cfc05b1f9a89f661272a54271f3f6064532838a3f48054e69a9ee6a55c84397e7a4bb580041e254962e67467112f5084d81e25e4fd96298d96ddcd537c8088829b663cef50c89e18f6ae80dd70aea90519a4b5ef32eb4a7a4236439517a9ef63d9db55c1c383574c0a17ad9575d6dc934f930851e90aa137fc749c3d4fd3f7f0fd0446981ba95063db4212d7c5d14a5e976d3527358465b91ada5afd3b360db77237ad1f117aaa3e84b57f56074cb59b16663b9970d68bbcba192e336d6f8e517e7cfc2848f6a55e052f25ccd849b84f134715364648d104ab55ef2e6671e3e8f420c02a0a0ef86a6ffada4cd6f4ef3ff8a70ea4d840835edbd39479dc0097befe81496ec152f3d8586edea4241d808f3ee9e2996fa3f160493433ae02c6add47c3ca7d33be0dec67be891b81c0d0c0c0e1f9c1ea9b6fe9c6522f083054883b553e7bbe87d966bc26c81b7d20aedf8d4fbec41954fce82a22068dffe4663536d2eab6b77683ad0dc09a8b7d2af3503049f24a2259bf75f1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fbe69cbb8061b83a83f1a5e61a364ffaacb63a1b8e8ddb476f2412726180c54b4f4a9cbf846248908cc3621c28de38a375d9ce3ef1fd8ded826daa29f51353851cafc3da456d473afb79353f7068dc1822b24dbf9d7eaef6a0c8c9b611b05e979feb3ebfb72e1f3a9e601929fc7eea4d0eaba4c5291f01c808279d3454a78ee1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e7bfcd69aa83973e920cd991eba9a815d391e2f67cd94758f503fe66bcbf169936b6436f8403487bf6f6b179c5c0cd030cf62d297627935617fca57a9add700f43a185b369789eeea0a86659a3431599c80a459c78b62eaa4430be15f16224a70a460ceb62a78921999ef3514c01e585a5ab904ee63c6212334f4db59284ca00b12917b5873e6a926fe36fb2fa152ebbcf34124292546a03ed6bbc4d870f46067408bba5a44f28e869891a0aa4775e20fe2908632908b768a953aa6ad40b0d60d17b1ce81d48c43d2d9652ce7175a6c3fa4b1f09c4f4992e37422dbb4ad250c67c08cf420d1ef673614ee1755a0af62741f00de0f0e025b766772bd3fa4254a93eacbefeb1559a30a937daa56fa5f1714e25c0c89c5944c13aa594ae452d0a88aebd838a1395fd4989016c9c17f172262bdcbaffb8ceb48ad682e53e4476d1180d0a3e2c021f158aa6206b472042620d9cee55925f505a7c239444084a8a49879e1a3cc366a97e3eacb83ef329e663ac0c57c31a1d501488b2c727fecb2167ebc0534f2c32e6177dd83002eae9e29d37646d88cc3c85ff8f968d8dcd2541ccbbd6908eb6b4a58c45c1d929c1b9a08e526a86a219d351109f952ec1152979a54f7609e048543d0572ba5bce1b11d28cccd7f9376d9a7520a9dc6c2788391f04a90efcaa33bec155882e45690af21f1b11e5fd49f0a59f74a64a50da300437864431632dfc10c402d1917561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045a250e002f75c6b1c142228c210e3ff9b9da21a81c3d6d31af30c750433b28b6418ea1dd842879684de6ce36adf7429742f60d84d7359dfb2eae76d7b546c72259feb3ebfb72e1f3a9e601929fc7eea4d0eaba4c5291f01c808279d3454a78ee1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c75d0a897f9c6981d81da8b49be331ba03439313",
    "content": "{\"tx\": \"9a4d26d2028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4340000000054ebc4c9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd401000000535d55b401bc3e0000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac08000000\", \"prevouts\": [\"e42e3b0000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\", \"2fde5c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3e76da909411b9aa4a2821f57e1793ffd7ec31709f737922e03de8e63612b877aa259965f78bc28f8240612a1a198a565ae3bd287f041f727515659fa948708d02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c92bcc39f88de0fccf05594a42dfe3635edb57ce21917883d27a19fa0554c878a5dc33fa7839ae067eb0e322af7872b61aeafce79b30eba6b88bd373e3b2506905\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c761e8c4c51ea45aa6c56b949fdc22e5d4c60cf1",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41c01000000818e558c025e5e3400000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac27020000\", \"prevouts\": [\"622f3700000000002259202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e63904a1aaf4a9aebf1f82d156b1ef26f7e6b8586b945d1c33a8575bf074195bd38c7743a15ef171cd8fdf6519c1ed314604b3d15b0cd80f7dacc5b26f871c60\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c763c8080d8e8e78651eaf9140b7aa3fef1d52d4",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c38010000002c06be89dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7a00000000a16685fd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c7010000002dd89bb302d4447e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4870e000000\", \"prevouts\": [\"c10b4a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0b942700000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"29fb0e0000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_94\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ce386fe989eac7c2d83399fd33490506e49a5c9e9acd1419806a333e0bd803f0573450a048cecd2febc4615c11766d2b55f52052473e30149feda2a9ef632f7f\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"625d4991bb3dcc0ec03a460c5f35ed2e794bdf4fdafc610fa83659c9b362c7a2371272fc050707aa27fc7ff596547a97df0956bb0c3957a705dff7b869853d4f94\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c77f06b7f82e62ac50865f5ee4163ae369969020",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4070200000035c405e2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca301000000f48bf49ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b52000000003a56f2d902d8daa3000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac6c000000\", \"prevouts\": [\"5bc8310000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"a32d5400000000001652142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"05a12000000000002251202b18b828586b5828635076972ee0bba96c3f290312125c393cc54d832abc1349\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369ba06655263132793ff4f7f3ead2f9f2f86fc9ceead0ef33e48b2027a64ea445\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a8b616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c785d388c9a15886ab980f88b666d4945c7ee4a6",
    "content": "{\"tx\": \"487bef7002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1002000000de8b8aa4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c69010000002054ea8402c7f0a4000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87a505741e\", \"prevouts\": [\"b4c85d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1ac8480000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ce\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5553abd056338fb08b4bbb5c79dd9a6ad62e1e69b98132dffee6a4aa8ec8778ecc463e52fae07201e14fcfa23151e711460bbdb9b38e3727f6a1b5152fa9dac083\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6e0fa93028289a8dcf0b927eff3fac81b83bb034e741fa1f2521825841a22cd219eb445e0b7d9f07636541e18a878539c729e5e72175cb5da8d58b9997fabe72ce\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c79333ec6723390b7f1563f388c7a50d86f860b2",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6d01000000b06dc58edceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4c010000002a7e2e9adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc90100000011c898bc0363a0a1000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a663000000\", \"prevouts\": [\"3c7c220000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"23ef240000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\", \"d7255d000000000017a91498e55eac47e04767f832d50008ff18559102c9e787\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"21601f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"754f3ae87867a6344f53f4d50002692b1af8401e629b96ac03a9e310075a77957dcb468362594e4ac069e3cfb3a6b2d23f0975c072755245d82efe0f95c911f9\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c7946ca286a4c1e04861f5fe7ff7982618728e8f",
    "content": "{\"tx\": \"543aa354028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44a0000000011a31ca4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7401000000580331d803fd42a9000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acad535e40\", \"prevouts\": [\"137f32000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\", \"1a62790000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100bca98a852f9cbde62ceefaac0cb08b690e73a3e0d3b47f10d72f23355d3772ca0220186709f1b3a4435dc09bfa20db77937c9131c244446cd9b0d352ec70501bab0b812102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100c1c64d231b4b54e02126ac4b06ff870f1b6ecd427eb5b32fe8c58d7d6a38dbfd022070ca91ce07c0919442dde6ee8a4778f442409e31b096b1a32abf4047b49a3492812102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c7a2d84c0203fa2c48f932ed3cdb57e9bc3d4cd3",
    "content": "{\"tx\": \"4013c48c02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6201000000bf7eceeedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca901000000a70f748001caf00c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac9a82d82a\", \"prevouts\": [\"164228000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"eaa954000000000017a91439ec132e1466f40f0086baa7ac253013e83c7dc387\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"215e1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"2e494ef1cb42ca52a79be07dcf9f4a1153a518041c0afcfe69056dcee0f6a6e081bc6e8a26754af686353f1576078eab72262b3b5420112f625b2ee5ed759977\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c7aa7f6d958c6e29a221a767f1d7b3c103fe86b2",
    "content": "{\"tx\": \"3ba8d6ed03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1d01000000e3bae3a4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8c0000000072f053efdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0e01000000551026e5037abdec0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963948d921\", \"prevouts\": [\"75f85e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"74c36b0000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"26ba240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_9f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c565b4ef286c95813ce6b5b51ff2844046260175f110875745fa85081fee1ef80c0116f6fc4797038ebd8c17a89a9da570d8ba9c8801a4d4b478d122c43340b182\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6f7d7b44273b0bde92c1635efb75db031624b81a2fb540843eac8b187a188487d2b01f3c4adbc11b882c69ff06f411986857bf336ece7fbc55cc6c2f152515ec9f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c7b48c2518d6d2a2a5acd628f2fb397cad2ac0ea",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfe00000000526d26b7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2701000000c3f9d3d90238f9730000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79600000000\", \"prevouts\": [\"20c81e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e96a570000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_1b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5d57158b4533e2a6888571746faa954dbc3f85386414fabd7023b25f5dcb9083a6d44833ce64f3f9db87e8c48f832c558b434974ceab2c45ab91ee55ded5cf9d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1f9f8626ee14c89bfd6462423f93c9a4f6f8892951d3abe4bee78cf76d57527e7b92cc0038a65df939b8f89b45c52a9e932bcbca2b9e26d71fd713ef377940d11b\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c814f8c932eb8ff0b1b54d8a85929406a22a72f6",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49c01000000fc23b6c3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b040100000067f7ca9b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f0010000009dd718dd01c92f7a00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac43010000\", \"prevouts\": [\"ad873700000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\", \"baf1220000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\", \"f44440000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d04c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b81ff7cc7637e0c05982e17a8e208328988859d4b2b7eb979a1983188becada13f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823bd101e45a609d3b8e0b3b6f0b7594624f7e9102ef5d5dd3027418de40ebb2180d690b53af7dfcad925f9834a18ad2ddc318ee8f8616a880729dbc2fd60dfccd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52d0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936efbe4fce68f3b8555862407b2d13e298861a0b71ec35e363803758f270d7e6091469e71666f51d71b691366cd88792f62b60965457ad0f8cff2baa31a91ced83d191de94316b2d555b882a7ea052cdcffb2858bcf3e9dcd4db66bb89a9914d760d690b53af7dfcad925f9834a18ad2ddc318ee8f8616a880729dbc2fd60dfccd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c8172ac90dca46ddecfcb6abf992c70d492bdaf0",
    "content": "{\"tx\": \"b7fcc267028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40301000000e44fc5b9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbc00000000dc4397dc0231b2b6000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388accd833d55\", \"prevouts\": [\"960e360000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\", \"1224830000000000225120b5fac7f9d1efa21092b4bbfea1ca41fe5694dd20d67936ab2b478b1ec4aee588\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"da7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93647b36fbf58146635091204325275bf32c600005bcae8b0ef3bfa655f050786d2ee00e627ce877dc7a3321ebc519bf09c5aac598ee9e81cf6d3228685de2d2a5f9a29f5cb7818ea23e4b491695dace811707e8772e99626d3237c076ba9a076d6566ba3404d3656bfd0df4a55f82c254cdba579fd51be164a5cd21fa2faf92a44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c01f27a250fc54a819b2f6e5182b6f4b8059de1027a76afb9faeb15ebb7f4449a47bed56458bb8201cfe785d9ebbccb6afef9cc99128ad29d757c102b7b9c0a9eb0481d56926b359fa3e2e34471adba51fafc61fa70dea7541795bc082db9408\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c8203a41b6f45793c2150ed5554ab5bf5c7eae94",
    "content": "{\"tx\": \"01000000011221809fa938f2ef41f6621f6e6a0e75e05349f5a7d7094926420abdf536093c010000000070ad45a90433d150b310000000160014ca9858c362545bc83a3b93e73b12b27a9b3ca00358020000000000001976a91472fb0c729bce8fb851f92a5ad48d3d4231beda4988ac58020000000000001600144bcade4cacdd490a6aa7afbb8ba77ed6898137ac58020000000000001600143f886f8feaf75ad7bedd5713d4d148e7c97c113409010000\", \"prevouts\": [\"2e6353b31000000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/keypath_empty\", \"success\": {\"scriptSig\": \"\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c82943e824916226a82dbcda450c1cf3f21df1da",
    "content": "{\"tx\": \"35adfe970360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d5010000006640029abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf78000000003657cfe8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdf000000008532f2b1014faa6c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4871d222b1e\", \"prevouts\": [\"96730e00000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"d08c660000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\", \"f2fb7b00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"4730440220745645c13b4b275aac783c64d4d570fb12a959f1f428fb878c54bd13625b3b730220692113b354fb6c333a611a2439070174f869ee1bb77807a644cce3c7866c81dc0300\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402202527f22743fe76485a67d2b696439540bee96a2c89dec0424ffa698d61d7d5ec02202170150595f24ec82a3c3d442e6566536273f96cc0422a00814f50099047b602030101\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c83f86babe52fc934414d829d4969407bdaa8de9",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bac00000000a4c899b2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3301000000510c59fc02e5e69f00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac52020000\", \"prevouts\": [\"13cf270000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"33bc7a0000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"1a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa8e84781bad1ba81b7ce5b7be6cf9bec34b59091704d19096b61e5a37e7aa266c56798b11c96dafc2935d577afad31a6537ce4b1a48ff27833822cff5fe95a51e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369ae37181c42054bd3d996a0cb9fcac8a434e22d455bb156486fd105951d5862240401d3043d3e54134521a2f6b274f3ac0e46a5b9a6f95ac49ca3a75270b4793801cbe9d84ce1e82e006940c90d66235295537a514918e448d1b01c99be1031af2727a08c83da142d000f7f66d34a23554b296f940ffe81022e50f50dcfdd8b9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c85880f71216bacfb5f45a917040c76a5b933f5e",
    "content": "{\"tx\": \"b9d6ebbf02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce801000000681a4abc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c401010000007e28d0e301fb412000000000001600149d38710eb90e420b159c7a9263994c88e6810bc77e020000\", \"prevouts\": [\"f476560000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"cb49320000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_9f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a4d50c81527021ffc43e6fbd6cc40e5ceabe3b5aadbf2de7ca7133677010e3d8a1dea8ec67b9ec2bb8fe716e36f51cd11a26a69558024d7ddfcb106610df3809\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d7be77c7cc3ca06110277ed73b6fbf51e8926ca1635f8ed75cd16ff780d79607fdeb96c019c10c32f39ef9a0197aef4ec72b60017860f0908f2d630b7b3e0659f\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c85ec330c8ffb17623ec929fd4a198c3b768811a",
    "content": "{\"tx\": \"d21e6dcb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44801000000e3a0c5abdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c52000000009db4d7d80252268f000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5a61c420\", \"prevouts\": [\"4d7d41000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"c9354f000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/emptypk/checksig\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9b424e1044e5dc7cdc531e12877671db688a9a52da4a0cf3431e55d0c4d577a816c10033dc6e3e1e8efa220fadc65dce1ec52ad30da949263406fd68f5196304\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365cd2d09394ee01f4cbf453b8e43120c6bca0157ff833036c4a91161ae8d6db3dd3595e47f783dea9cd898c640c1ccf4b7d0ff5bfa4236f535dc6b4728299c1d69fb9e9eefbd8dee3e5857c0a5c3742d0e58764b1e6eec73b89290af63b7ef8123f752582a11afed87b1aeeab00a91ac5167325e0fc3825def3a8307d2082c1acae8c13f957496bd85a8bfb196b41115877f1c292877d449cb5d56eb109a1f8e695176267bbd1b7867e2eebc439e9f1978d6a17134b75a8bbf0107687388ddeb5ca20cf31e30816ef7bffd0e43d4efa6c46d11185474d89ac75f693a7c477baa289311c864108ea260dd739a7c927abea94bbd3ef2fa436b5348a12a03476bb9e451f31f95136dbefe9a42f2bb6868f993acae25cfce8fc0d73b984508d267a487b041864f4ad19f6b2782b89895068e96969bc0c0cb50b64c3b84612df4c73208c4bcf6cb070e67449ea1a036232a8155856b27be4c634558db013e06b79c26858824757e3ab18b9476867ac69e63e36877af9fee4aeb519472ff5a504bc7e1bb8a70b57e599289922abee7f7cb3f5c4b4e0126255c9af59ddd6c8d572a0551d9a0b10fc29ed9ec9ba811a78159d56d191855f20d80384a7f598d54defaeda75074e07476023602dfde1c8d0d124f96edbab4af8198f97e6bceba6cad7de517a8f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"eae4171cce628642d6e5efa57c43cbc6d95289533e778a30726e24617dfd41fc57c1622715784b71214b1252a1b92d886f69d300f26dc1f4f8e670b4afb9609a\", \"00ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366b0431b55481a374c89f40eb98ef9d2a1ea4a15c1fa25842c8dd1b505d3f733008998f104a41d430584d29acc5d80983bfa4388185b9ecb4fb5f364585438a9bd260600b62c8ed4db4bf12723005c7f766cb302a575f8872965ad67f65636a6b0c8f171a0659181424fedfeb48947aa5b62ebec348497eb70a0e4b9dfaff17fe7851f2fbba69e8a986917b32b5f76ef63e06d7f778743be5452643f44f99ea505f10f2cde5a4729d525a487b41d56d434ed7dc5e0aa5e11e544eae0c7246ef2b3ea5155719b875991d083ecd32183be0f5ac452a5905295b6a0b91be04b40b76e4803cbe3d00c239899d4914097448c043dde77fd42773528487758c6d087e8cf83fa64278d817919e62c4d23adcbc207f804fcd146d72915d8e061e85a8f6a6e6cb9d4e0a9220b07d19fc28732eb4bb2345d54d956bd2d189c6a5f87f1c011bb65cbfaa9ed654ade91c00c9fe4f57391c241e95cfd60b1f44f495a05086ba006260268f3fa4d832afae96ff672bd19d7e928d42bc878143589bed193337fe656f28feb26558d4d064770c2eb738b0251c60e0a639239140ddba0ceb61ff7c3e738a88f45b76d7bc9f694c0e4e272f5d4f15822286d483919ad24a64a55c6aea77b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c86c77b200bac67eba1a81988b36e0764528deef",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b040200000046cd652b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40a0000000042a9c23e0462eb5600000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac77020000\", \"prevouts\": [\"05bb1f00000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\", \"45ee380000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"967d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362da8eb1c279bfe4030c40984debdf0218f758d92db84bca846c9a6c0c2c889522729135af56592d99186c3f010fd31ebf46aa180b9496740b245c4ec874c834ddfa3c45458ee21e782394432ca1779912e92f35e0ff52c3985a5265a8dee58b3654e31a1d81b19a8c2670362b3a1330b2f2d66c8db1c8314023a61983d2ff610\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936034fed625626755137a076a5dc7fd4623114bcfec779f6cea9743d7f2e859f08b066835f4c858657284bc4f27395efb05761f76f20d1739098d7bca44617346d654e31a1d81b19a8c2670362b3a1330b2f2d66c8db1c8314023a61983d2ff610\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c8e586d3f61c1ad22568794bbfcb69f57cb8b000",
    "content": "{\"tx\": \"9701b121028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40902000000f80e52cc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fb00000000f5b250cc04079570000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7961fe84c52\", \"prevouts\": [\"510837000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\", \"0f433b000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"247d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a5787881982eabc9f10a574183ce87b535a8253f66971d7d0c58826076cb527312b5d836754160f4cb099c4d8b267e29847dad01b12a09dec3875f376ae126ea3506420e788c3ffd3d8d88ddb9154e82106737a8dd2b5d0940daf68f275cd0d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb9b18a780ce64b599d9d3042fe9b5b93046b018637f9f8cec8ef00735e099ba32f1db23017f271ba09e9de40cbf6bd4b292cb969b1168724d03b4425efd5cf153506420e788c3ffd3d8d88ddb9154e82106737a8dd2b5d0940daf68f275cd0d7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c8ef39151618f6cc8716604cb9c29f93559b5a3d",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe000000000930c87d0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2a00000000cbde473a01036620000000000017a914719f78084af863e000acd618ba76df97972236898797860936\", \"prevouts\": [\"e1c0710000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"1def81000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ad5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361a24f92e0fd66692248020bc486fd34464c8d03dbe31b3b0085981632dac5adc8586fdecbef25bbe615615e0698f2a9b21ec544d3ff645908914cd0f4da91c05854b8121e0ae10d162a4774d9a1b75cd5b5f6f9e51813910e8b7b5db2ca997d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08216dab5147ee209d2bb54465ac69ced1cd5e726256fc4bc53cec72e983b39694d8586fdecbef25bbe615615e0698f2a9b21ec544d3ff645908914cd0f4da91c05854b8121e0ae10d162a4774d9a1b75cd5b5f6f9e51813910e8b7b5db2ca997d7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c908a5304c6a71d150881ee923df19a58e37c8e9",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe601000000c65799e260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ba00000000d4786d82dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8f00000000fcfa74ef02a77fbf00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87d5000000\", \"prevouts\": [\"6bf861000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\", \"d5740e0000000000225120f53d4d34de47a5fffffaf2fc2c78ea776a7cd8d2ae45e19539d143c70b3fc5d0\", \"5eaf510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_cc\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"257ad40fbac7c2d9f1a9e1db11fe94e6d194cddbdfcc69058e46acfd792194a47e9db4a1310bb5a16f76584af5dd5ac853267f15f72ff68abf7cc6f1c148320382\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8efa6ef9e488aeb43095ccb5f019bcf9a725b4c0301f1f987108cccc2c353f71479d1387a06f9e82db505b3c295a715d1c64356626b5ba99499f95399c076f54cc\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c91a0b63271792838de6f8620c116c19028be7d3",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45401000000823bfdc18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4180000000071fce1b204401f74000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac97050000\", \"prevouts\": [\"167039000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\", \"9eb03c0000000000225120d568b8728ac27b6616789818942be5cb929e56b49b97b92550ddc2846ca38bde\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"477d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71edbbe6d997bdcd7c7603d7696a19dfa7a137162827825260b73e89d3e21fe597dfd9e929a06047270fff43ba4c6b47136464c62381aba7ed74ab98bc69d199aa4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365453fa1cf5661ca4e41648bac18e336e0e2b6f234348e01e3b9405a211d280e1da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71edbbe6d997bdcd7c7603d7696a19dfa7a137162827825260b73e89d3e21fe597dfd9e929a06047270fff43ba4c6b47136464c62381aba7ed74ab98bc69d199aa4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c92d0b7830a59c91b7478b9bc6537abc9104ab24",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709400000000b5af37dfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdd010000009d67e5be0212197900000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac7c000000\", \"prevouts\": [\"48250f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6c8d6c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_c8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5ad3e8d9a3c034433bc5885320a6655c35f6fb4e4e21044159dacdbcda9705b392aae27f099a5709080f29e5818c42df824672dedb9277c7fb3587be15223d3283\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f20b460bf96dd5ce5d26f77c330de8a82f53b5576f2a8e66bae591dee0bf66460981456cc948cf5b380d81f43bc2b48eac39b7e6c4f6462a11c21f9b529fc875c8\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c94bf93a205b5120777d3d7dedacadaf6c732df5",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706b000000004daee3458bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4810100000091e255d604661a4c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac4d000000\", \"prevouts\": [\"e2cf0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d3ed3e000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_8a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3c5348f3d426d431117278556a1bd1f6999fa0ac8af1a93e61940c66473da6585068419e3ec05d2abcc43f57e5d386db0bd53db27b8c1723ed341b1dfc7c27d302\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0550351ea676302c8e29b537dc137b16fbe9bc07fb2f19fddb08262c010f767f655ef51d24d7014c8d81700f04c74b01d93a8c7950d416611dcfbb65e35d66ac8a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c95a348b7638eb340903fe3cc3532859ffe5403f",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44401000000b1151faf01043f0b00000000001600149d38710eb90e420b159c7a9263994c88e6810bc70bcbd924\", \"prevouts\": [\"a134380000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_10\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c8d082fd536dc393bbe63bcb99dfe609a785a548abee33b3216dbaf05dfa98af96156992a9fe4379615e11109a1e061f91047150302685f8055bf5695655d21082\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f162e77ec00e3c4853db7fcf3d8d5f85418b3c457ad9107f25232686eefd6c42910d174f5404a351f9217e2af3df799b1c8f46cffca3bed06f954226578729bc10\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c965920ad9808bd3f6a009ce5335213895163c4a",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b790100000051704d828bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ab010000002cc3b20304c1485f00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcc47cb040\", \"prevouts\": [\"74b026000000000017a9144582b7676ffb8c3a2735b8e71e172a272e3e33c087\", \"3db63a000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bc\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad81a9d5fb34658f56ef265a5ea50d6ba4a88b7d3df0c15a8523e96f4d1d6f82d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d516a0ed0b6cdb130b03f26b8a245e72d5247ee3941518d7e9956496f6ce27b97d7150e68e664a4d5c991e5183d0e7966d99b6c66da3079bb04bea44808922b61bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93682cd8a89140098d6b7e3aadd747ce5bb6ed64c7673e0c8243d2c4037d581567c4a8563068286881d42b1c4901d93a483973910fd5653bf7ebbf040741f7cd837150e68e664a4d5c991e5183d0e7966d99b6c66da3079bb04bea44808922b61bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c968d693525b4f56eb70b070dbf41555841fa170",
    "content": "{\"tx\": \"c3554c7202dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0e0100000076c92ed6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcd0100000015e8f9ac0162f93d00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac8ebf4b29\", \"prevouts\": [\"f7b753000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\", \"2b9321000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"47304402202977185013ef83fa9176d431083b8ea006c249bf46248d8d379060c40e5c00bc022045f72dda06b542a894a9fe4ab8928e139c3be905b48ad6ea9407d9dfa4f8743682232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4830450221008497a8a4f8f306b7177f773470b917d254f06199bd013267c78f1496e0565a7b022038bdb3b6ffd73226b87f75359b1022709e6c1ca74c510093a47866f3eebd64c682232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c97c22cac658b5a97d90aab28ef2a0126a80ce6e",
    "content": "{\"tx\": \"87114d0402dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bda010000001bcacfcbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5a01000000684733a90404c2710000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acefe46a4e\", \"prevouts\": [\"33a22800000000002251207a86f45d21fdb08435e271cb417d7b8bb1e066ea2bc109ea12043ac97c7d3e10\", \"94014c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_fc\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"019fbd076e3722f15c832e92193e6758fb07191e463f5d19072ce5acf798553401b73760bb149a69eeb50ee562fdb3fe44eee54d85ac3fc1e90f7c7a2f028e53\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d9ad96e8d42bfb5e16324da41d98c52e904bc6ec5dcc6f0c4b0c14bedcd6b01d10210267d4ae016ddb5244060cf6f66183e06da4d196baaa9892e0eb8c57249ffc\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c9810cb06137edb22aba29ce495e0f5e87073b06",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf10010000001f3f7932dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3401000000f67932efdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2102000000826b9d0304a1acf2000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688accafa8b37\", \"prevouts\": [\"0a62760000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"ff685e0000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\", \"64a1200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ee\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361f25297efdbed2aa8c1ec8b5437cb1f621645355ab4fec48723d1bef81dab8b605e01deb44bf60eeaa09a037ba0d53221083944f657819e2d2b55bb732cda3dfdd207214d6df2d18dfa237afd6016520e9e6ed6636ebebd182087bb183877c35439ca2b6d52d4fa79aee6ecbc14a8999a29f1c28c4c5c5b9dd610517c3b748ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d519b8dfaa69151d05ccddc10c8c1e468eb7b78f9ad17f99ee1b916fd61bdfbcfce40899fd8696dac9e3afc960f0a100b615a3c324ed3a125e98af98336f748ba56\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c9888f4ae613d1778de5399e9c17e6e517df9292",
    "content": "{\"tx\": \"5e99ba8803bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7500000000df8a91a8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3f000000005c7bc9e9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0d02000000a28c08c40314b9e600000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75c6ed459\", \"prevouts\": [\"48417900000000002258202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"685e2300000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"f0a04c0000000000235c212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"faa0a1b1251aef70c3685bfc73637131763e34d62b9aa33bb5780f7131ce8dc197dca2c1059cdaa8026c06e2d3296033eeac23bd31f342ab2bf7999193848c96\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c9a84f25b1d55cfc33df56ee356e86772a479352",
    "content": "{\"tx\": \"fca5d31203bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb801000000d35e6ddfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4001000000e5f842af8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49500000000cbb138bd029ea525010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7b6000000\", \"prevouts\": [\"208c780000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"859d6f00000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"eaec3f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ae\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a84935e7de5977d16b5922aff52ce3e71b50501c577410d644e6087d6ba0dc6440e8db429a4385f68ed70759eb234a95178055731a782558080bc4e13bae0d6702\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"be9b2e228b31e15939d29f0660c5e14498216d715cc3bcb3da2a9b10722470e44ff011d9c32738f989d34537550b9538ef95c5a34cce30391e8f88144558e9cfae\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c9addf4f9fd1a956c97c9babd5981d0c8295e152",
    "content": "{\"tx\": \"c4706a100260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f700000000efbe80c4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcf0100000062bb14f502b16d800000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898726000000\", \"prevouts\": [\"9d9a100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"012f720000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_e3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6871b63fd3c0e28f430be859ee58e940374f716e5c39e47e258b850be84d504770a88c3645586e4264f47ebc91556974438aef78392f59b878936a7c1548789281\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"82a00280c9418e2fbf7a49397d1d2354ce6561a74ad6b2d88cf9f3267847b0aeacb932ffc542fa7d3a02a7408cfcf2956cbff43dc1fb8e8e7cffed784cc3ec54e3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c9b398e28803f0f2e675448f50d7f4d8c39e8991",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbd000000008b1e38c6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6100000000422eee7f02753dcc00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac466b3933\", \"prevouts\": [\"6b948300000000002251204bd530dd92500289ca536d9e0216beec7b39c81554ac6dd1e9e4cc3828e76161\", \"7a884a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/hashtype0_byte_scriptpath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0f3e7f21e5f22b16c508572df5b2369151fab5d20cffcf7e24c3d8901ba4d658336a51205bf64a016c1b5d3ab4f21f766e4b89c112ff0f9b1f68b59c9a7e0660\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0f3e7f21e5f22b16c508572df5b2369151fab5d20cffcf7e24c3d8901ba4d658336a51205bf64a016c1b5d3ab4f21f766e4b89c112ff0f9b1f68b59c9a7e066000\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c9d4c34b8cbf8c16d5b1e01af0f0541cdd36456b",
    "content": "{\"tx\": \"2cc2c040028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4180200000083645dc7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7f01000000daddb8d20432929f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac3c000000\", \"prevouts\": [\"cf0338000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\", \"3c73690000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_8f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"314ee8a5e310fe2648a3d28897a720c681976566449d206bc237738e4fac05f55184abe6dd34db74e1681612eae486e22bb537fe8d7a112c394f57a1b5a8927002\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"658e0008620631287884f7a93ced9692400c38bf3f4e4e8e8c32ee688304151989a1d4260b129f8807378d5cbb8510ca8c34df3bfb1a210b2ae6e13da73e5e9f8f\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c9dd51e291d1902fcc5389ef9f70290ea166e35b",
    "content": "{\"tx\": \"32272e2d02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc400000000cf2c1cae60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d101000000bff585a60172ae45000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a69d78181e\", \"prevouts\": [\"f8e8500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ae000f0000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_6d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"07681357fd8e216d8858882b0449b7b01e1738466bc35a2c6349fb9cdb477af43cbf3665d0844d7baaecf26dc4682470fc4dac4d130e58f1b7fcca649c4560f281\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"dcc081a61a3db0025177c7bad923d394d8b73b872e306cef18ce6712a7cab76e513bf4d9ebc0c206fe47ced6b99881bfc61ccecc6c0d03c2f7cc5b3f73078e556d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c9ed258ea27321037ce42d665a00191863c1ddce",
    "content": "{\"tx\": \"feb46ba5038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45901000000d71bd59f8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4be010000004e14988560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a7010000008348decf04584a79000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987a5c20248\", \"prevouts\": [\"41353600000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\", \"744c360000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"28650e00000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"d5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368a925fb010e9dac59891c803b6a81d462f65c56c77cfff52e46d3d042538a83699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb44c2f2200f850d6a1609ea6f282082fe51ae8a55145cebb4c521120909a7edcb74b0fe5a2ac2c1f7a0cb2705bdbeb7bce3dd33edb4ddacee2f772f92b01147433\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5116dab5147ee209d2bb54465ac69ced1cd5e726256fc4bc53cec72e983b39694d8586fdecbef25bbe615615e0698f2a9b21ec544d3ff645908914cd0f4da91c05854b8121e0ae10d162a4774d9a1b75cd5b5f6f9e51813910e8b7b5db2ca997d7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c9f4f38c06357e5794c082ee3a691a02193ff1e2",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3300000000fd918ce48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4dc0100000057bd5083dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf300000000c9b3ff710361ce9d0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7961aad1f34\", \"prevouts\": [\"7dc71f00000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\", \"a33834000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\", \"59974c00000000002353212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cfa9527db8d94ecaaa4c5f84aa069855344a8e1139532addc267645c320553d1c5ad4a9b270df90a342dd9b911679319b2f4fb7001219e073c30ee0f733f6d1e\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/c9ff164d902f41698dc1714ef130057761a13f8c",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb6010000005bd07d78dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4800000000f3fbe79504c03f770000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cf000000\", \"prevouts\": [\"6300560000000000225120df3728be21c89bb919091ec65a63fe2d83dc46feb767b141518f7734e1cf94cb\", \"b400240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_88\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1e05e1776b78adaad2bd6afe32e838186227902346f39d0d1ec0dc731f955917061bee9697264a842c6a1c6017cab8e2a02eab8e7034229b91f90efe394cb7be01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ed5ae8658026fb9fbf8b98482691b24930e2da2f95446930aee2540f6fd9c21ce4d8af1099c773e60a9d955c063784f0a8ef1629439e32afca12fa7fbc8d94a488\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ca067c02b5a5e0209c277a0cea71db50a16d380f",
    "content": "{\"tx\": \"ae141b9f03dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bab000000003d92aca3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0d00000000851034978bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c445010000004f05579f031209c70000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e741700146\", \"prevouts\": [\"27c222000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\", \"30c5690000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\", \"23df3c00000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090243f58a90114b6aa402bb4f9b0bceb04a56c354faadcd2b5b9336e75fc30d5e9f9d13252f48d8e515aba940330f12781bf2dcb32238d271b2594c8d1a8582a180eb34ebb90b8f13751fcab19fed4d5c8f7a33fe6ce4b976293dfd876314d79c63c6224861310ae2c1db0266e829804965e1c2117a7c9864c8f15dc999f8ece559765b9c0542ada65cd9ab908d11f5fb47c1616e8cd7552b13623868362e9b7fa6a8cbab1e92dfd8c6612e99a33d5f2debefb52b4535b958b74e991a4cc5a43871723a8bda06d5779b1bc91616dd0a339a801014b31e55346967ce4c347922956948a52f91d8751d2e1d4f2326a1afc0b13f7dc183beb529ad11b555c762b1ec2f4a3043ca77cc66e720dad42a457675725090bf60b84442f6e2acce8199eca0f8c7d395f2ca783e8619a335cd535a2869ee8cefcd76697f623fba01a42545ba6f68d83c67ef1296bf9b083268d413c8ba9e1fd5ce2fdff10fc32334f7c0b85ec3b6480cdeb962e9cb3ebb46fbc6717f80e670851a28c3283cce7e102d0195f01affbb32227166559ab085101b7a9629172b4261a7cf328cfcdaf13cc92950ffc74333e0f7f8ce3d23fa106cda339f3075467fc09fa29f76b8f1c1f2b100c72804e5368ffb58f2624b51e91e2be1cee5a87ed643fd475b177c9937de61b73752398fa21ea98f7021e8381ef7e9b487a2cd64358ffd6658362e2c8eed02061ed97829a8c39fff34452e2275\", \"c57d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364fa4baf48be6a9a9bfef03be76e85cf973a3cb7e8c90715eed2621d73e79b1f04639ba4332756735e08e9dd0c9395e600a8a67669bda3acb22644b013566df8000378a892e4dc43a17c9ebd71803200f2f24c9a40c2827c304e59be9b4a7df0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e7ed58a5d1e45da459f2a8e0301ddde15594acc54ff095d5d2c1d0db00b18a64067c74aaebb832d05839becaed55329079673fafa9c00ba7aaf53db021eb459d86bcf78fc89fb0cdee21f431c48d294eabb6a2a8828c3722c8dfb9211be3f0d1084c88ad021beaafee806d632f162ffa9f21fb18ba7dbd1e763d3c7f3efd8e541d988e4c15369c8580b310433f994a584413b63d7114ca1c4bc5772878c53dafff0826ccfac1cc760968b205fb23f87113ab3cbd52b0fe41667fdae55ecd89eb73cb16b89167168e67737985be61d4d215c5ee924df6f031ad9b95064eb38af55e5858321f64709b1a5e8eb28ae7e1d642427b66fdd1db886f41fc4cec2d8accd9dc6ac75543574a8ac5791295bf33874275c24f34ae216fb5cbbc43bd155c7bc443c593117ee8b47ee46f048a5773951b17c6157f5105cae16d624f45f0ddc7a465d7cf5141a58fb568f26f087ef45238957e67f1a2511533e0bdfc76c5f69fa11aed2c3e70e1cfc199806a5c8b0218e9b8cca38ca39b92df174dce8fbcecd3a216bbf86291c9f658076b7e421f153e9f643e6109e739c64b5f6030f4c96025526103cfaca2d4b34f85384667c57cf4a948ecb5abeba9ab5c4337e14a154e21d19c1ca49e483c47031bc5399c36969d7c90f8b874dc0b1a580ca7e266bce0b78e694cdee14c4d2fb79cacecb5127798c5bcfd6e5868ba26939c019edfd24a87833f1d6503b2a8b30475\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bfaddd47df3117200f65a8f2511f385e6ac107d57fbe48a596b05dda60e029cf7b7f3ebdceab6737726d3802236d8368ee483fc4ea684d1523b8c26fc56452a37def1cc2232d9b1ca5244635fcf6779cb15e82fb856baa2ca11d8fd1da35295f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ca0a2329b586ff39d07383acaecfac1982afe0df",
    "content": "{\"tx\": \"db04e35402dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b79000000000f3aa8f7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6a0100000042e6cff403695068000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d4ac9f56\", \"prevouts\": [\"937e200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"74a7490000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c189d3ccfc4948b891aeeaa0f3c252a2902566ef59534bff7a4e867353c33bc2b8fa02a75f2c14ed7d5d0c703f04231a07d54b48265128b0f19f2675cea0a3860ede327a4530e163a08fbb39bc817df8c091647ff10fb19edf5f4101cfd44f0728600564ddbacf5f3725d0c966242f43412b32595be2c9ca0d2c059543867768a8d33d1bf79d85f5789ed848b4533d26a370a1b4a52752612c3d95f6c9d7b97cc934929db8420892ff1120b3c8c411e7767f40152742529dbe086742fadccf432c5345103c8c13190cf3010d182fe02d8996277fcb1d8c0dd593ecb0c1647922a35fbb5d082a277e9fcb414aeff4ec604e33093271e410b73792c789bd98357022d689161dac98863f8867a2e8590ab7ab931d13115977bcd8874d51deedbb047e3fb805cf26aa098ea789f097a2c6d3e9e8b9b6d34b063a2bf52fe3898469afe255722307e5eebe754d452672d60e4dda8a30e597138ff88ac859d98c0c8b4b2c6a9fef104e1ad8d5a53e845c2808e6646c9baf7d5deaec69c7a555bdd130c6a535805a4949dce00f232022cae114cf670818daaf23edb3ef951e7a9bf38d0e9bc6a574dbb62cac0361814c354890e90104ad45b2caa0cb52ff7672428a54dcaa9bcba030922ef862f3ca177f3b9177e9cf150d0195a41ffd5d614cc6fa28d3c01b9be056c8b32d725c90c5678d3d31bd1b5b1280330478832e9f6174b96b8e5d739a142aa31a2d4575da\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361761f890f132d60292ea9451ab2a689005be47319d7fbcba26241d791200a2a1d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5148d61d9b48b1fd3c9dcc7ce9fbab23c91d7bbaaf6610449bdfa8b9a4fdaeae22ee4d75780d36bffae9b56136e6d27c02b8d233efdc800bb260bfbba6a6f94b87\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09027227454db5a9dce2f62dff1570059e93008b6e8c35d4e3d4e482cad6511a693458fc0d59d509576c02daf8b311fdef129763c25d11584af2f46db53929e4ffe32210c73eb4c051c3e3404f9ad77d66a9633ed5eef418fec88818f57e4eb469f93e9f19b21031ed544cc3067e30c21f8564ce1b4b5cc2ba01de9179b8f19a218c7211994dced3705ddfeaafcb061f39868d712aef73133c13c21e740a748b2189fc29efaf763b43ddf1ed875432a692de5387774f9f2aa9348cef432a97685c4ca3bed90e36ddc75d70dd32df2fb7170dcd755463f2503cef896d2b34216b5d19bf3af32add48b32873e5238b30cf69dd5fd8731f02e5ac1acb1f23ebea7d820ee214e912136d79ef5b2e262a457efb4db3b60bf93ad1a947b0cc9160a1bdb0548d5b95c2b86a99874e929ffd538da8550de01886a5b35dd961126fd7c31a2389659b8f7e5553415bb37f2344ca22ced132c0cb2ea101cf91e9d76cd7da5f8af2b000abe5683868913b7e41060349c54313f2dc7bf3177e2a26c7c4640ae7f7f9314474a5febb01a7feba1ffd9b7d7421bd0dabf6acb5a33a806120cf600965e54cabe06fde2694de8229595b732d394b3717bde45fa91aba89be40099a61dbf25c26af762285c63373ffb9b087d0cab28d21ad6a60fbbbed9feb7e67b767b529b98023459c9717a4473beed5f3b3b272a238dc98c3e9e197cd1ceabb56f567d5c6e4541e8ff07170547561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d0c3719315ff0531af977ff551a321675e96f6255e2f5d4cea630188659c9757473df9812949ea11fa7cd8f7a31f5257bc4998fae53c5743d03c7cfeceae664b355d713f01682c54eefc137cacda341f8a928ca67657dd1895f9a847e54f584f6ad20bb4e3465af36c086d3f45ee510bb6828f8cbf764ea9958c57f38670043d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ca10907ed5b956b8d7c600609307e951fa48d8e6",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4460000000086c6650edceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc500000000f5bf2afe03cdd85f00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac3de12d2f\", \"prevouts\": [\"c9003a000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"c668270000000000165f142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0826047efe14993a8a73b9baf7cd14f960037ac1d53bb1921fe06fa7eee8637040814a663af4c315d4c0e419951403071b67d2106b9ce8bb6d7e6c872100135a32b791a13a85e5c2e660174c9a1e69b8f96263917ef129d2001c822ceb7fc389f44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b9fcf0a7c92dd23244df9580e55d15e57255b9f51d71ced09e9b8172bc04386f6047efe14993a8a73b9baf7cd14f960037ac1d53bb1921fe06fa7eee8637040814a663af4c315d4c0e419951403071b67d2106b9ce8bb6d7e6c872100135a32b791a13a85e5c2e660174c9a1e69b8f96263917ef129d2001c822ceb7fc389f44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ca10ab334b15fc1a219962a002ba20266142420e",
    "content": "{\"tx\": \"7712fd3c03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc600000000fa2131a6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3a000000004f6247e1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff3010000003fb10ede01318d5900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac50880832\", \"prevouts\": [\"21d5720000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\", \"a3c12000000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\", \"1de070000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb468405cb22a39b2e10cd1afb6cf33a44daad2098e05cd2010bbeaa225bcf768d84cef708a58e9a16c040ddf6ca6eff300c7bff2a5c928617bb01c850b0a79e89f728ffffb27e62918c729ff5ffa8fa6bd185df3cc350f3591557de0b18c4f64cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b9d6e3f5d9915a7f17d348d09ea3f9ebd96660129a97625007e31c70764ffd301ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900456a39aac74ee3f63949b9c215c515b0db1b113f4639b3fb19cd99ba22ff01310c728ffffb27e62918c729ff5ffa8fa6bd185df3cc350f3591557de0b18c4f64cb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ca3a2137d38c1e9a98dd585fbb1e5e6483a855d0",
    "content": "{\"tx\": \"49871be601dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb301000000721231a4010d471900000000001600149d38710eb90e420b159c7a9263994c88e6810bc780010000\", \"prevouts\": [\"b2472000000000002356212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"571c7b7dc40213dca493216192ace957d503428885c314dbde509aff240517098ac878b539c1e639d59320025659a8295a91ab756c9aa8af233f8ece7b4c2ca5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ca4f72eced8e3ace4cb06faea7d35e7831c1e5ce",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700801000000b8b76795dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5a00000000f6c7ab86017eae1700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac00030000\", \"prevouts\": [\"cb9b0e000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\", \"91a75000000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"347d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366a824c5b532f5dda933d832154b0c83ad7fb2ac42414be4d26e31bf47f087a0bc5a4ec1ad3c05e8d6cb6e5418cc65ab3865118805b06cbf11da98fae87c97132e97124583e57aeab90707503ff0d8dae530166a9193c4517699e1743b45d7c12\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365b9f16c64cb33bf07d6b2062c92fadc965674f21ecb7c903fe1fc58ed8d39da03f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823ac03c85a7bde4aa83325c4e9fa3803d6178be55885bf5b72d341e036ded0599070c3fd2cc03cfe72ec91581f9e22200fa4c4f6deb8dafcd335310e90efb11e5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ca4f932e8cc3a4b016fedf455e955c89cd7237bf",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703700000000456bf00a8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e101000000c6f1b10a040edf4700000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcba4b604d\", \"prevouts\": [\"e40e0f000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"5b843b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"46c27b068d411d00453bb2f23978d33612f157158f2d1269abfb8ed2544d04a8adf80e60ff2220e9106ea2e3853e1adbf64af1c1067c6438ddeccd3c2dde41de81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"234ec4b6bc847f464e80243ad1eeda31abf28a2f9d86b856b88941d8c2489fc1632d85df12d4f5918f16580caa1ff63ce082abc86e52c9194d5413e3042c6a390d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ca67aeff72a1ca354129ea9f32b49e63219b5d98",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4beb0100000031c4939d02d3aa1d000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48717010000\", \"prevouts\": [\"085a1f0000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063e168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364cdf2b0c702c09265c526c69132e8e88ce07fc31df75ddaef1d0c3cd9ea36fb3bde4683e2f88a3942929fc88a4cafb8eec09785ff7c9f0b883255a650cf557ca66ee26669afb6dac63e75f53b4cae6cf36ae7535fe99100c6f349ffc46155d224f44ecb3bab6b962a7ffa14a2ce082ec551943f33ce508b63a8ee30ee5e49264\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f4963aabf3cc95b3b3dcf7e67623762453db9f8eda97e088037773d00ff58aedf693e8696ee404d8be98a67cec2febef1e0f75b013501a27963a3fb4300a4da26e171838972c3c3a6cdacf031a4825f83b841697bfdf19ec3d087e2c9ca65f0b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ca8e90d773aaf3a6cc447fa963353434f82c0e50",
    "content": "{\"tx\": \"d76dec3801bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb00000000010ed51ba02f2876300000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7c1000000\", \"prevouts\": [\"b8e6650000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_20\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9852b68a87443e7d0f8c72a0aefda4c1820b67a688b4e96fa603e9153677a222af819f875ec547bd48f98ba87cbade90524887f4e8a7b00b097b384f42e12f05\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b7dcb5993b6b8ccfdb8ed4e5418b19ba6f0d9016bd32bfecf1b180ead15b77de8c555aae32af79c63e23a0a41f3bdbaa51026ce9476a5c4f4a296260a2e6d58f20\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ca8ead844b2d1ee6d2526ed1a548996bc943ea68",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa90100000010059b838bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4580000000033dc898602dc7baa000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac08020000\", \"prevouts\": [\"31d1760000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"c135360000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"487d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082edf94ae33f5606292dd7c11b30be28c4e66005bd3313ca427ad5ed734d53452840210bd7db211b82a407c19f9567cde5a01f8f2a3c3dc032c7ac21169de78447\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e8d88ca5d2ed422cbef7221efcadc1e9b79f7a9a7e5e37a381143666b41a8ce50be5e2af3a3c1a6754948d639a5542927d59c509fd5287d02d091c2a39a812b527da89940c9c2be3d3cb1ea9fc374137a74dc3bafe909c68993f298761996d666\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ca9fc42da81222da6dec277f6346109bf564fefb",
    "content": "{\"tx\": \"b7fcc267028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40301000000e44fc5b9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbc00000000dc4397dc0231b2b6000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388accd833d55\", \"prevouts\": [\"960e360000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\", \"1224830000000000225120b5fac7f9d1efa21092b4bbfea1ca41fe5694dd20d67936ab2b478b1ec4aee588\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366adb67c50db990d0ffc018ab512ddf792ce3fc48b23d63faf640ed9594ca022e3720a820d9abe67125ff39f44ffa31194d8e2e56ac0de67f7992994257d70be631e5a3cd6e337eb252bd8d7a8d95e14a531fbfbee4d245debca50b247e512ad1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93643147b93bbd48179e21d8eb390a9e202d46507542ccdb812323f4df5ed47756d052557e81dd342a2b41230b0afaea8d13945f509c20a84912c3e9d5b86183ac33720a820d9abe67125ff39f44ffa31194d8e2e56ac0de67f7992994257d70be631e5a3cd6e337eb252bd8d7a8d95e14a531fbfbee4d245debca50b247e512ad1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cab98434bc48379e0a365fff01d6b79bf577457a",
    "content": "{\"tx\": \"ac8ef70c0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f500000000cd6aca99bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1002000000166066d902baef900000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcf8000000\", \"prevouts\": [\"a32e1200000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\", \"c53281000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6aeb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365ecdf9d6b38b43c17196dc2a7eea65eed5a0468b71e2bc36574efa54ca32faa03f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821e09e6d24dde1e7a9afb38743b4c2dd55dbb58a3a1803a82bc7b3a42584fec8fa9431f387a803f7df77af21560d586d92c96180a56916d6b7efaaea6f10ba4ca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4434501c222c2b9303845523b2a5615208b9d5e9b8dddf3d495d8511b54149dc414f0d108097d00934ef2973385fcf188ce2945eb833bd9e90fcb9cf025505833cf9ce2244c675144b577c27c052f9ebd481172245e28e9502c6c6e8f12c64fa6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cab9a4b9aa0799313bf8c71e90011d910fd2eca4",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff801000000b0c13d8502d4c3730000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a66c020000\", \"prevouts\": [\"f03676000000000017a9140917710a6236c7a08b54f54b004ee705f2913e3087\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"235f212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"37d5a197074413e5cfff18078c7c380d852f8aa839695132f190dfc1e266dcb4022523404abfb40d63a3c077cca5e8f4717bc99d7098e6032665c433962bd459\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cabd7d24e6498c820ccd2a79a03cc481607909e5",
    "content": "{\"tx\": \"c07ee00c0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270200200000062d802d1dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cef00000000fd6645bddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3b01000000fb6fb2d2013a6d4300000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac24ec9a3a\", \"prevouts\": [\"db2511000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\", \"86f3560000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"946057000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_64\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a9ce750dc4495b912f5de2c7936b6dc9fbe0af39f57de380f5cad36d870dc90ba56720d46ccb0f7aad7441e5d16f5a21b5fb94e64ab8da12271bf0566043c8b81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"07907fa33089d2ceb658e9e552e4d1055527a7801ad0e2a249b547b24574fcbed9145c3c2b436e8622b22f05a6b1ec42219ad1dcc5d752d71ecd51b3885572a964\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cafd0a9a6dab6200dcb88ecbf7e265de1ad5d317",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c491000000007392a7f260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707500000000579abf8d03798c4b000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4876b000000\", \"prevouts\": [\"f7dc3e000000000021581f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"ee930f000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"222c69bbe3f4f1673e8cf45df278568891b3a7d6fcffd5abc410b2b797aa1927f2d6ff83effa9adf6d3ef712d53a5534bb3fd91915849ae9fb719034ebf80b1d\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cb181959ea829e3c8e81c95a1bbce81b35f8d2fd",
    "content": "{\"tx\": \"aacaa01b02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1d02000000f3d0e9f9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c44000000008657808f03639ccc000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487941a2455\", \"prevouts\": [\"d91d7900000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\", \"197d560000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063fe68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cebf3516b3dc8f192542925d4b3d82199c3e0c8e4a17ec07f1fddd55aaac307b917e8250b412828d56f092e1d9ceabdbedccb5671620a7e05a1f5a122fcf72f11e45c38e8a62a0e5058038ea76117f85fe5d704aefa5d806bc1a7cbe3a990946\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d515ba7b576a8dda08f1b482f8c289e95e9d52783e5c439690d7dbc8078ddf6e59ab44d8b0f62b2d27de7be259100200d6da1e5303b29f3eaa1b6a4eeb0c96a42f364ab0b66352e66b5bf600abf31d1005c5406f4575b339026213ecb21a668977f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cb1b57e08db865390f1b4cf22118530463b721aa",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1b0100000056ef84c6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1500000000048e2596dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1e000000009ecaa1df0136422d000000000017a914719f78084af863e000acd618ba76df9797223689875e000000\", \"prevouts\": [\"f4dc280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ee4f4f0000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\", \"53ad4d000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"6c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0825b22591e944b414d99fe534a482351afe29b8e90b07993fb7f3f85b72380ca5294fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6e872a8a6de95a80dc4a6e95ba0e12854eab511c8acfff04c6cfab0ff55ad6b178\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8537e729fcf8585ba70be9503b33ad258cc8c70f658d9ebd11d7348a395e977e6872a8a6de95a80dc4a6e95ba0e12854eab511c8acfff04c6cfab0ff55ad6b178\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cb5cd2d881a8e8202863c29e2d692b6245167dd1",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a801000000aa951bf3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bac010000001c53bd7ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe9010000001c47564f026e879f0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca040a226\", \"prevouts\": [\"0c261000000000002258202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"8c5a260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7f456b00000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"aa7f169ca09b5112de5218fd2061e9503480eb8c97f5a6094e304468cd47b3358daf879617418a2d2041960835dffa29e30966714b97b3855702656bcbc75a5c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cb7c58b77b079764dd1fdd95626fced2ad539c7c",
    "content": "{\"tx\": \"3b690b7c02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd20100000061e238addceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1f020000001b923abc018b9d0600000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac8a000000\", \"prevouts\": [\"180323000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\", \"ffde2200000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"0f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa6f8d113c18817a044fae8525416b35b4656d6d7185568187de608cafb5211e2f68491001e36edf91058819766439c3f31bd198abbe3d2204f458ac7743e1d61ccf16a5e3db9e2b81c974405e52c4661efcc91a529144e47e78be5814d4a09901\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361c7116f5c3e80617093632a2db9fc234f36b396a24b73f6adf68743edb71604c5d8798a2c57206b85b6eca830bd166e5350a1cd63f89078c321fceabfae97dd5c29bd03bbcbebf503f24139d653052e63a9a9f3faf73bed4a74eee576514948d11491142a38ebb10a24e36aadbe0cf227dedfd0966bcf56b2aea8b33dc3fd67f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cbdd9f9ee3d06ce2cdfe2000194d0fa14bb03cb0",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c453000000000462a8e904bfaa3200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75b000000\", \"prevouts\": [\"d43b350000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_97\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"23baa00c82b9cc499dbdc6037c9ab83f4323f73ae95a0de7d0271fe4f3d2660a3aaaa2f16890c7a07940d2ba9498b73c241be285333e1c3ea78a6b57700cf51d82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1337dd860788e13931302a7e317e5705364f2bb589159cd4363ec42493f2aca5247ea30fb521c5268763bdace0fd6176964bac82528e902a1ab83d25b0802a6b97\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cbe16c2c588c6bc7000fbb04188632167236d008",
    "content": "{\"tx\": \"b4abf2a802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4baf00000000b44aa8a6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7a00000000201254d604ccd0a80000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a64c020000\", \"prevouts\": [\"87bb2600000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\", \"998a840000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936269ff6546b497129ba1fe09f7f94be9a0d73dd3621c79696a97c5ae123801203edc23a266999aa1773fe99be867e95cb2abe2d57657b7a4dc20a388644aabac6d0cdffd10ffbed86c0e7536425f8f402fac685ef3be7cf3af5c775f2718b4072\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004539f0e83d2be49ca995d97c64064bae5b8c7dff64f3bec17af779836b699250933d2e072fd8e8376d3a54b2bea1bfbfff1298aece70c0bc2934c8eaacc3044fe58f009f53a1a3347386cf74e6ce512c14e8f46a54e4d2c64fe3ab77cfdd670d0b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cbfe3b47d8728af1b60451af99e980f90dc89668",
    "content": "{\"tx\": \"6ebe113f03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c480000000082f72a8cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba501000000f5b89fa8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcd00000000c556cf97037ed2db0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acbb000000\", \"prevouts\": [\"98a94b0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"d2402700000000002251208f7166d23fc1e45fbcf26b51bd386ab915626b0708475a8743064036728c78ed\", \"8f956b0000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93626dd86fe63929c58a9e26dc691794fb2cff71343e8c54d7eaccca19ca634607d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a4e616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cc06cd6c0a43860436758eaf21a715c3ecebb6f4",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5e00000000bb4e8ee2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8501000000acba6b03047a1da200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac91030000\", \"prevouts\": [\"a3a5820000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"952e220000000000225120b52a77e37c1fa9b4a7b934796858277b8dc346396dc90993eb725a9563cf0842\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"b87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faff5a0b04042772840f11ed5a15b1f6f5628d6ed53a9b814a67fccb7bf41c87856960f5e71abb11fb1594f725adbdd26a9f61c928558a58ca58d11d05eb565d16\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93695dc9c98a36c2184a4aed19b2e2b490335edbf9105ab62ca8297ce8361fd2945d64c15a931058236adef8a4965d2af6c40e751c52c93bf72b53dfa72cc6c024bd12296fcc73680f3617d8f33f0de746e19dcfecb08411ea531ade48d4ab609a0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cc13210738ed00cc6f24c6bdcc72bc63f13783e2",
    "content": "{\"tx\": \"d1497db003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5a010000000ac409eddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1802000000b7a057afbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff7000000007c740f92045d5fac0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fce5030000\", \"prevouts\": [\"d1a0230000000000225120595c2c45ec3b255cb7947059399917a9363337ebaf1f68587c1f93f355b1a53e\", \"d84b2000000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\", \"d77c6b0000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"7b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936338668e4e5aab28bcde1228c1172683f4e862ace4afbb2c726076e6970101528d15ee116aef2a5177f7228fbf74f7a33b70e884325424982f9125cdefb107591d34322f35809060e9857f404c38bdcaf402c3d07c78e42a3b4d1eaa304dca88a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93688ea954498e4daa92a6ad47f2895ae184189a1c00dbf2f0b5426ffb4ba470bbc3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082565447efa486312fa493bc3efa8d0ca00e2c766484411258b08f0fec6b85156cd34322f35809060e9857f404c38bdcaf402c3d07c78e42a3b4d1eaa304dca88a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cc3fcfad22ff1374fc57610045f054311fc92f6d",
    "content": "{\"tx\": \"613ba07402bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2b000000006ac1a3f4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9601000000db51c5bc04110dc900000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787e2e1e433\", \"prevouts\": [\"42e6670000000000225120531ded2803baf703e9b8f23e3d6d5459ce6d94a03d15c5d2addf83c32bf56dd4\", \"0c7163000000000017a91480e36171416c0f598c1c20ba17ab3a3cf10a438e87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_3\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"935646b576b0b11572ecb7d763b3752d1b3e3071d68da7989bc27b0a11e41c2484ea9660583a3ab9eb0f36df160c9695f81df5ac47b4a66b087ead00f53a488b\", \"82a33283e5d5c118bc3d691b8db05e02da66167cc666945c453ffb4a09ea4a4472f9364d2e6916bb47f5525f79ee246301e8f3b5402002ee1596b70345de3028792e3e7493ada914165f2cc1af7df32cd3bdd523ed818868225a87bd58614d6621d163c6c60a90c06a34f4005fc5a17cbf96fde743024c1621781857a3541283727569c1749751335dea0142545e2b3a41a6db82280f82c229f7552c6b87\", \"7529dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b32505163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936209fcbf868c6a92e3c0922601247e008b3969bf10bdcd8ca5fa998dc09f06a802f0687d3d34dc8b489cf59c8c228dbf015289fca3e4efd1722cfb109cc2081b7ca6089e21816ee6fd9a868544bf105dae013cb095fc7c6576ac374e7e8f3f8a7602d400119a30f02884c803070bed436c54f0c764acba1003e7b049809258f4f014d23742a8b0635629b71bdc4b60db6613049ead7caa2d9b094988249ecdbb9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1943d105a940d03e9376e8b3e63e48c7f2ff317953610e0508c36b01b926f3cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe393e179a7c211225fedfe245fd3ff3e5b3b1c166e4ec0cb700ba82adf7aeaf5ad30f1d4b86ba70fd5952ff2c48b877f705fa7be27f33e4586133d7e5e03ab43e1599d86a25d8f86a682e21d7f29ade2766977671fd4b7506d0d0b5207b0389f00000000000000000000000000000000000000000000000000000000000000007306296b50d506f086f706301f20f725476797ace7d41d8e468e65190ed21eaa414484a1e0e20d9687323f6fce972a7a1fd6e153a4ef49341e3410a13e0063c2a182bfd0ee25f13c6ae38b4288d9a81f069ad6c09f922b6ddbfe4a3348425f453eb697bc1fdc52047a055b28f979b09368d0da8f46da673012037611c64f24321754d5499f8d4371da62fc4af30a52025d38436a936952f1b22a2f152627c609d22eb9d1dc260d11d3d0ab60b5b2aa1111fe23dcaa8498d486e83fabbf555ffaae55a871098d440d13c08dc61184cecc9fca543fd2d38fbc3f0a8209d0e327ad3e1ea5d1d342e58f9725d4f24f287d7f695e6f7367c0b147c406839b6f030da936a9d2298abcbefa3909a813ea3e209227741a2f982d73f026fa7995b10b7941ca1c65131d3215c8773fd39e328aa908c34c88767ae8beb7c98bca985e9e69025922cafb18a8e3286b8333f1c32af113971af648debda5f7a678f807a69a704ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5066f4b09a82745bdbff3fa2cfb73c1e652e1607b0bff475648df74fd8cf08f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013af8904e1b79af564ab7f5afff68a2e3a7266ad5fa82631bbd9a95c5349fe52241c28ae717ce886306e999440b0dbce9372afc7b8cd81e3950bceef0e6d5145923205cc3475b468205b508844fff1cba286c6c4e2ff27b038252313498562a8f0ea45e8cb1d1c5851995e10985ecb619a06de0a240887d1a160813387d846a42410ae81325b565e9589b6e31631d911ab8678fa2f130377d850da29e6f934bea5d5329fe1c33baa779c27ad78bd9f979007888b131969ce0d52d9a0c1635b4dfdb12f2b62cf7736cf70ffff63226c8e300d163a02cf44f3fb6c8d7a9b87fdbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00942d3f1f97d12ca642e60b32e55257b9f2ca905b11dd8880e159a34972f1f0000000000000000000000000000000000000000000000000000000000000000cae63e109f271654eb81bceae7b9c8b2d63ed3f7609cdfde56e8e3017b189bc9da4f7821cd5488e443f829e75a5cfd10ece6c0ce2e09c00b52f986184d74f654cd71816d36dd62349d50f8907985256f4897ada0dddf3bdee11f3eec82f046c407dc150fb3957dd1110f98674d4628e447aa99ad7d4ce5b77b9b61673db283890000000000000000000000000000000000000000000000000000000000000000843217d87b626094c87746ae63facc04ba6cfb18df41de050cf290ba923cdec30000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa785034f31ca41d97e22d96c048424c6c5f47e4e02f5d319c1ad79a8af057c7be9b2fd26b09f5289641de9fabec1b4afce90be6c87ec4dc958481741d42bf3e03b70fbe2ba7043aa8a3d576a354996ee39e30f7a6e45c8de59569288659f0ccfb6af35be1196b8a78de45053eaf8ad9e4cefa14533a0d55d44ed7a16c49f566ef8e2c17cbaf3cba96e205eb120df0ee008d601f642b32ca775c1dd1034841c28d30bd54dfc020d0973914dd4fc03525aa38a12a2d2478b1b3983187c8220bf00ddacf0537de087eeb84179c2b7b129ce1a17257549013160dbe484c9ec243157dfb321c8e5f99aff6743898e964b6e962fbf472b1fc11465e82ba58922e00a9baecda451bd0bda31d6b56f8fb35e04c5efce2e164e269979fd5f8a3ad19422c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3e8271eedb99588d76c587d61cbc001753212af09a33c76077832afb7ec7bb7800000000000000000000000000000000000000000000000000000000000000001965ca26b454da66c7e1feafa45468a24da27a44b4ae760f1487992bb3d3cd644a2fd07ca94ab1b3a5a610f04909fb93b5e4668f5de49294c8adddf0cbd18190000000000000000000000000000000000000000000000000000000000000000049ad7827f314ff46d53b82cc7b55d79a144869b9f71ac2e54d0ecaeceaa07d534b179a52a405bd5263a6c4989b3eac46a4221618c2a8afac08bdcb125670726f85c03d117a587ce130803bd78a9f636fdb5f10257619ed4e1ba7e11f2770a5744c543e977a48984739ac6e93a3a77a563d0632e65c7fd46e476b1ca70c3455a1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff493c612fe574bbd2488fd60abd7173e07a3b5207bdc9a3c7b940f48fd042861804f9e00d834e8b81fd807b280556335504af2c326a6c0e740d4bc81d2173666b93e432f92290af3de5dd855f57f66bb08ade71ec6097f204b9c28939e778521fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff090d2ab16acc7b36ee013fc3d24b20bacd45bc1a519175f55d9cd2041873dfb9436b83cf76a5cc3721fc6c2d562e03cd5c0e89e2f006e7cade685aea921af0acffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f80f82119a89b03095a1361de8e05dba6c36b4feeef2920b2576bb7d91e412a3ece1b56c2492e002fbed1b98bd3f808f43332a4ac6a99701b26d87c5be54b5e69f13c97c97062f0dea2872e87b2e6a72577166c4791392b24a7b80bf93af85bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71a3e93deef542a49e152b87d81a3ac84a3285e7f3cef7cf8f0fa806dfc906d27c7e8b4fbc67c25a2aac37ad899bb8bc865118d3df8e99a5c4276ca115d9675eff73e6d0f505395120fd02a6c0c6f272d1520d6d6e450a0a7f318343b310169effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcff21cc4ae43b31ce85b6f99113615b55ee5087c7922dbdfd82aa065b9253626f004ecedefdd1d3aeaead8dd5c8e44ac769bfc0b626b2525630621cf72375c5352de4a30c7888dd8802e0e2b34d96ecc3d606aa2d93f371bdd05a3fd13f4a5261fbd831a23f77facf5f60aa07ef7caf3f0c954193a726de6e70e2b7052f5517e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"935646b576b0b11572ecb7d763b3752d1b3e3071d68da7989bc27b0a11e41c2484ea9660583a3ab9eb0f36df160c9695f81df5ac47b4a66b087ead00f53a488b\", \"8d67dfcb201b43654275cabd911f2be40f34ace56402838c7eddaa8d720270aef7dfa4e61d708504558d34ee23a6c7d645ea7dcad3763f6fc7c5043b367c652f6073ac302b950dbcae919a77e65d6fb4669b3dc231380ea84487f0a74d2cfb0677ba1f143c6aff0447c042a4207865d89129f64fa254f2c1debdfcb5919841bcdd159822f28f6163203105049211c22a2ac5997e3619aa79be3b8ddd24\", \"7529dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b32505163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936209fcbf868c6a92e3c0922601247e008b3969bf10bdcd8ca5fa998dc09f06a802f0687d3d34dc8b489cf59c8c228dbf015289fca3e4efd1722cfb109cc2081b7ca6089e21816ee6fd9a868544bf105dae013cb095fc7c6576ac374e7e8f3f8a7602d400119a30f02884c803070bed436c54f0c764acba1003e7b049809258f4f014d23742a8b0635629b71bdc4b60db6613049ead7caa2d9b094988249ecdbb9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1943d105a940d03e9376e8b3e63e48c7f2ff317953610e0508c36b01b926f3cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe393e179a7c211225fedfe245fd3ff3e5b3b1c166e4ec0cb700ba82adf7aeaf5ad30f1d4b86ba70fd5952ff2c48b877f705fa7be27f33e4586133d7e5e03ab43e1599d86a25d8f86a682e21d7f29ade2766977671fd4b7506d0d0b5207b0389f00000000000000000000000000000000000000000000000000000000000000007306296b50d506f086f706301f20f725476797ace7d41d8e468e65190ed21eaa414484a1e0e20d9687323f6fce972a7a1fd6e153a4ef49341e3410a13e0063c2a182bfd0ee25f13c6ae38b4288d9a81f069ad6c09f922b6ddbfe4a3348425f453eb697bc1fdc52047a055b28f979b09368d0da8f46da673012037611c64f24321754d5499f8d4371da62fc4af30a52025d38436a936952f1b22a2f152627c609d22eb9d1dc260d11d3d0ab60b5b2aa1111fe23dcaa8498d486e83fabbf555ffaae55a871098d440d13c08dc61184cecc9fca543fd2d38fbc3f0a8209d0e327ad3e1ea5d1d342e58f9725d4f24f287d7f695e6f7367c0b147c406839b6f030da936a9d2298abcbefa3909a813ea3e209227741a2f982d73f026fa7995b10b7941ca1c65131d3215c8773fd39e328aa908c34c88767ae8beb7c98bca985e9e69025922cafb18a8e3286b8333f1c32af113971af648debda5f7a678f807a69a704ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5066f4b09a82745bdbff3fa2cfb73c1e652e1607b0bff475648df74fd8cf08f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013af8904e1b79af564ab7f5afff68a2e3a7266ad5fa82631bbd9a95c5349fe52241c28ae717ce886306e999440b0dbce9372afc7b8cd81e3950bceef0e6d5145923205cc3475b468205b508844fff1cba286c6c4e2ff27b038252313498562a8f0ea45e8cb1d1c5851995e10985ecb619a06de0a240887d1a160813387d846a42410ae81325b565e9589b6e31631d911ab8678fa2f130377d850da29e6f934bea5d5329fe1c33baa779c27ad78bd9f979007888b131969ce0d52d9a0c1635b4dfdb12f2b62cf7736cf70ffff63226c8e300d163a02cf44f3fb6c8d7a9b87fdbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00942d3f1f97d12ca642e60b32e55257b9f2ca905b11dd8880e159a34972f1f0000000000000000000000000000000000000000000000000000000000000000cae63e109f271654eb81bceae7b9c8b2d63ed3f7609cdfde56e8e3017b189bc9da4f7821cd5488e443f829e75a5cfd10ece6c0ce2e09c00b52f986184d74f654cd71816d36dd62349d50f8907985256f4897ada0dddf3bdee11f3eec82f046c407dc150fb3957dd1110f98674d4628e447aa99ad7d4ce5b77b9b61673db283890000000000000000000000000000000000000000000000000000000000000000843217d87b626094c87746ae63facc04ba6cfb18df41de050cf290ba923cdec30000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa785034f31ca41d97e22d96c048424c6c5f47e4e02f5d319c1ad79a8af057c7be9b2fd26b09f5289641de9fabec1b4afce90be6c87ec4dc958481741d42bf3e03b70fbe2ba7043aa8a3d576a354996ee39e30f7a6e45c8de59569288659f0ccfb6af35be1196b8a78de45053eaf8ad9e4cefa14533a0d55d44ed7a16c49f566ef8e2c17cbaf3cba96e205eb120df0ee008d601f642b32ca775c1dd1034841c28d30bd54dfc020d0973914dd4fc03525aa38a12a2d2478b1b3983187c8220bf00ddacf0537de087eeb84179c2b7b129ce1a17257549013160dbe484c9ec243157dfb321c8e5f99aff6743898e964b6e962fbf472b1fc11465e82ba58922e00a9baecda451bd0bda31d6b56f8fb35e04c5efce2e164e269979fd5f8a3ad19422c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3e8271eedb99588d76c587d61cbc001753212af09a33c76077832afb7ec7bb7800000000000000000000000000000000000000000000000000000000000000001965ca26b454da66c7e1feafa45468a24da27a44b4ae760f1487992bb3d3cd644a2fd07ca94ab1b3a5a610f04909fb93b5e4668f5de49294c8adddf0cbd18190000000000000000000000000000000000000000000000000000000000000000049ad7827f314ff46d53b82cc7b55d79a144869b9f71ac2e54d0ecaeceaa07d534b179a52a405bd5263a6c4989b3eac46a4221618c2a8afac08bdcb125670726f85c03d117a587ce130803bd78a9f636fdb5f10257619ed4e1ba7e11f2770a5744c543e977a48984739ac6e93a3a77a563d0632e65c7fd46e476b1ca70c3455a1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff493c612fe574bbd2488fd60abd7173e07a3b5207bdc9a3c7b940f48fd042861804f9e00d834e8b81fd807b280556335504af2c326a6c0e740d4bc81d2173666b93e432f92290af3de5dd855f57f66bb08ade71ec6097f204b9c28939e778521fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff090d2ab16acc7b36ee013fc3d24b20bacd45bc1a519175f55d9cd2041873dfb9436b83cf76a5cc3721fc6c2d562e03cd5c0e89e2f006e7cade685aea921af0acffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f80f82119a89b03095a1361de8e05dba6c36b4feeef2920b2576bb7d91e412a3ece1b56c2492e002fbed1b98bd3f808f43332a4ac6a99701b26d87c5be54b5e69f13c97c97062f0dea2872e87b2e6a72577166c4791392b24a7b80bf93af85bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71a3e93deef542a49e152b87d81a3ac84a3285e7f3cef7cf8f0fa806dfc906d27c7e8b4fbc67c25a2aac37ad899bb8bc865118d3df8e99a5c4276ca115d9675eff73e6d0f505395120fd02a6c0c6f272d1520d6d6e450a0a7f318343b310169effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcff21cc4ae43b31ce85b6f99113615b55ee5087c7922dbdfd82aa065b9253626f004ecedefdd1d3aeaead8dd5c8e44ac769bfc0b626b2525630621cf72375c5352de4a30c7888dd8802e0e2b34d96ecc3d606aa2d93f371bdd05a3fd13f4a5261fbd831a23f77facf5f60aa07ef7caf3f0c954193a726de6e70e2b7052f5517e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ccb6fc2bd7df140d0acaa9fa4f6c64be65339a60",
    "content": "{\"tx\": \"f33c648a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1801000000efe045ba8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a4000000002db817c60273f54f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aca3000000\", \"prevouts\": [\"3d7d1e000000000021511f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"c54b3300000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d274921aecbeb3031c4325f0ef8a23adff0ed7989377ee835ac54787b8fdc4f2e7295329ab844153de271583114b354e1e43309c3042e16794fa1975c037eba8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cd083f5472e5c5b1f0a2910e5400ed9fb0e38379",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c78000000003e1cfcb0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c87000000004eb3e1eebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf930000000022a849d80147e877000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487a8000000\", \"prevouts\": [\"f2d35400000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"17484f00000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\", \"72f17a0000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902826b92e489c52391673ca744d83e228293191492e2d901db7a033a79c8bea7107eace03029c7129e39f3a909dc8ffe6b90754373717e66246ccedc9e052ed3d6f550060f0ee501c40ff79c029c26083e18a30c721fccad49fc127d0138c5608d790468a1f908be0dd9443c422cb7f689609ea85e72e839d44be27b8840f24073ba9ba9e2676ae2b15b97df7d96fa3f62f8117c08ecaa7dec882326e49141d72434ae0223efbfa2637f4daea625871c0b4fc084e3fa81cfdeb510df6319b840af59ca47ba6219e980848081fb5184c9fbad150419b97722cacd33a99d36d4c1082663b7ed0f0b0935c3620ffe25d962bb6ba30ab655e89c143c3eaf32cbc12d940cd3caea23f564eee36468a2f5d4ba8653cb5837d435980439856a40575f7fcb49e0b745a20c7b75465eab42551750dca0fdd0d6dc23bb7b14c971146ef323cdc8dbe963984b5687dc0dfe86f1e19c038372d6f6955d208d2d5ed69e66894e5cb0b4593e39484c4982d496c02b4da70965dc5ecbde230f631bc9238e1dd5a414c0438ea322fd21242a0cc1844a81169e1061b230b9291e6419e8232cab07a18c20e18931d64438d901d160d81a90bf853931aa46937a04413d857398704891418b9ebdd27a70ae989ef2ce174463d50452a9d311211ef46f0853d1a6ed9aea7eb65aa728a6cf4a3252ddc6d2e30533a54d91b9c4b1fc47e2ad977447a265c728bb7c106ebb7d428d9775\", \"ed7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ef2f17803e9b9097b7e9c6a3fa063cf57bf5437f6dd783e7782f9707a99cea5998d6970ca8674a6d6a6636f00d706375e44157ef6300dc02db98f8ce0d082c1d19f2c0f6744ba7ac1f5ff1e4bbd0a31d1cdb1f5d58d1dbc476492d0098121b5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e89b80a27a3a8ceaca1bae7baa51dfdebfb01f7c38d20dd1d9c160e369f4ae61b4bc8a91a7eb6e23a129c512fd7435b24c4132c28155c8d81633abd69c37370f8a69096e8ad562190f3f442bcdbf603048257efbda11522a32e379b47315641be17f1884b7e3a19200d178c73d44812b811024532c2902141a9e77e0bf7b5c649be427c95ec4c948df084512fe80054afc1bde0e8410dbfbff1fd1ecf4dd870345a54df2024ec5608edaf6c0679b7f69b8280d4f870db70f10863172d6fe146f8afd03df1cceba90aeed3cd934e55b4f4d2fc15a1b38a51730211d2b639dbf7039c4f3ad638d222108c6c32742c0f67ad0ba919ffa320d6f85b954789b1cf996ce496e79e8955840811779e79814d0a52bc5872ad1e8856cbf85264848cb5c2146666d7d38916aa352b9ed144eccd298336b2280ee36fb055f60fe92c8f69a644332af45e96da46ed3760824b147d403e6e5c62b511fd7d59191d907efa45e45eb9996af32f75153dbc2199effc69d53b80833c7f2c639acd216db21142101ae4073dbfa30a32a93c68a57d27ab6fc5acf77447bf9b735610ab3a975b87dcc58909e00fe8ff9493d45937b14bfa39deb7262845cf63b8711b20f452c9e03a355bd4dceb5a573592d20063886337281d1231e5e8479b16b3e822f63e79a72ffbde97cf7aab8f01ef3d784d4855d54dd5968ce6aba3b18dcc1426011abfc5851e13172a7cf5ce9fd3b2675\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670a4bc76aed2418d25137dfbb0a799899196711239bc580b794f0105b1596aa027d2631c3cab5fe643277004a2e6838e79a7dd6765c91a13be066042b33c17d3b131de5807af4725e3fdc8c81388bc895736ddb6e799e7163e8586c833ffc627\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cd2bb450b14d6d4aeb2383f17d0b52532a6d60bc",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703700000000456bf00a8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e101000000c6f1b10a040edf4700000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcba4b604d\", \"prevouts\": [\"e40e0f000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"5b843b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082dc2f05b59194cbdf87848463e1c2c1324ea07adf35e05c7c9d5f4b3dae1cf3a20eb43d08761fb76661299d0344fd2d8bfc7de5e7c6dc622156e95971f4b8396db5b66a7e788d7f4d892aefa7b705b94e6e3402f32316550d3b683ba5e55fe37e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367ba371f3d414732c1c9e15a0164c634559da48866c534aa79174298bfda3b2aedc2f05b59194cbdf87848463e1c2c1324ea07adf35e05c7c9d5f4b3dae1cf3a20eb43d08761fb76661299d0344fd2d8bfc7de5e7c6dc622156e95971f4b8396db5b66a7e788d7f4d892aefa7b705b94e6e3402f32316550d3b683ba5e55fe37e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cd2f80cd83fdc9c096ed0c6e1e02112a0e62dd16",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe30100000030bf24908bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b901000000527fb1ee02a3f9a600000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac15e93a5d\", \"prevouts\": [\"33896b0000000000225120b5fac7f9d1efa21092b4bbfea1ca41fe5694dd20d67936ab2b478b1ec4aee588\", \"92d63d00000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"da7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936043c0126a9ff46f80efec90b265339725ec2187e176bf61e9c8112d2ff543febee00e627ce877dc7a3321ebc519bf09c5aac598ee9e81cf6d3228685de2d2a5f9a29f5cb7818ea23e4b491695dace811707e8772e99626d3237c076ba9a076d6566ba3404d3656bfd0df4a55f82c254cdba579fd51be164a5cd21fa2faf92a44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e9267ca3ecfb5dde8490070ee5c8f144d07948eba84ecbc5d8caabe33435ae9c3fb4f37cceedf64e5ab756f8bcf3191fe56bd549db8641e271ceb60581364e38eb0481d56926b359fa3e2e34471adba51fafc61fa70dea7541795bc082db9408\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cd4a620abc44efff9ec16d12232d21d35383be02",
    "content": "{\"tx\": \"b9d6ebbf02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce801000000681a4abc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c401010000007e28d0e301fb412000000000001600149d38710eb90e420b159c7a9263994c88e6810bc77e020000\", \"prevouts\": [\"f476560000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"cb49320000000000225120860c89f9477f4b6d0745b3db3a3158e326aac77c9b39db987890c5dea40689bf\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"e9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dba6d090ce6eeca8f19bee4c4b18bd87e742c613226dbb66d44b3d8c22cd4f417d143406647e47f2aa45aee5a8d37fbb079fe3a633dc3f79123da3b3ed47a821a2fa119ef3ac370f8290f87fe8954e212d8c61d3545cf9da1d8aa62b42f72813\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93645b70697259a6092735a83fd9185b271706fbd91da528cf82e26060ba02f7d12c3950c17255228812280bec2d0cca04b586565374a97ee6c913745c9c1a159600ce9ba0618adb3ee44483a22999a54a4e1710b9846377d8164aaa29371d79f22a2fa119ef3ac370f8290f87fe8954e212d8c61d3545cf9da1d8aa62b42f72813\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cd536df731fdebe8bbafa86ebef1f6c819648a78",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b00010000006626179d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4dd000000002f9f28d801c65c470000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e70cd67b4d\", \"prevouts\": [\"308e200000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\", \"e53e310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_cf\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"bae9395b8894fcb53fcb94909630e0fa8a7b6639cc70b42d414bdc065976bb6134718999d87a92fa944fb8e715b732bbe403f303c5d78afd294a31419a2b92cf02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bffb08b72fb67852c00a7affdfd1ac38d86230e434c3ffec1a01f8f80ece2c15cc413867f11f0d51dbfb27c50080cb9c4799be48f62416760d85c944157b1d58ce\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cd553bbac6c8bd33ad432ca2077facbf41604f68",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1502000000692e59dbdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdf00000000d423c2f302fde5ca0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac6ee00e50\", \"prevouts\": [\"0990850000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"90e7470000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ab\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1b145c19a6eef262e669c0544ef41c63da8b0cea3e09dde2c5df4af0522431b770886ba4158cedabdfcc1094cdaef9c2bcb69961d579197838229249f074750981\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c94b05e615cb27ed909e1a6839bd774f1b7acba2a2bc54c44c4e7085075fd210d5b29939d12fc91b80c458b89bae1acfe521d0d4ba0720b867ec0686181907ccab\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cd8b40b4ffe13dc923550924d4133d5ac918ecc4",
    "content": "{\"tx\": \"02000000031980a99ad1eac101c8fe3dd9b7c19f4e81dda5a690601a9eedc2ce713d9132e5000000000007acc88a492909e056fa5c0ef2af542be68aba07da39583e95b43e24484150891b1d532301000000001ad6d4dc1980a99ad1eac101c8fe3dd9b7c19f4e81dda5a690601a9eedc2ce713d9132e5010000000079e1bbdd02ac0b058b320000001600146d764276c66fec1127e5074db5bff3aa6c52553358020000000000001976a9147d8c30278dcbf5bd88310a3c91abbeb33651906c88acd137773e\", \"prevouts\": [\"7371c1150f000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"b7e4d4f711000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"6689717d11000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_invalid_unkleaf\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"25428a9bd8f0b5b74290865c0e042df7df41ee41a4cdff2193fafef490ff48290a0f40eeb563d2c0b6520066936103d46ace942c00a77679690a7ffcc3a6cf25\", \"20159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717ac\", \"c2159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717c320986550a60a376b2d6a26894b932a0140931c95b78be03572545c726a283e7902b78fc59ae74800241e9b7a2e0578a35ace37791478c3e04a51e81e708c61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cd8ca448ef6a3c3fa7536eee563579389b399c7f",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270190000000065a894b4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bed00000000c5e85eed04a6fd3100000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787cd030000\", \"prevouts\": [\"661a0f0000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\", \"f080250000000000225120ed31d524ef6bc5b71a68a40bfd6359c52f177bae49683ad83ab62d1806c34929\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c32bcf051f24a436904823a4e93e2341ae2a2e44bd383fcc6ea0da3aaabadc12\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a40616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cd935e81f7b958dc94cbb682f2c926e1e63fc213",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2b0100000003d33c9abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffd0100000038eb109e031793e40000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc01802d38\", \"prevouts\": [\"08d775000000000017a914613e66961ccf40c7c83ed07cc80b2528cfe51edb87\", \"e447710000000000225120e477b1c5b341d71bb24c39a2320bc0d86da52fdae37edac491a92c571a2df14a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2258202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"8b4006d050d277b69795e6a2f473003c12721ea302bec3c0af5c31aab3915060d527563039784230876f668b0bd717c49fac01cc4482315f6f4e7e1e5f541695\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cd9562d304291faf33b2752268819af3d9fdd593",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf05010000006c94ab778bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40c01000000a9aa24900176de0a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a603010000\", \"prevouts\": [\"46617a00000000002257202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"f7ef3b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_65\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c88fca301f28870dc7b00e87169aa933f0b517d595bf2219880d036e9341cf0010e0fb47bc33890f3a50d8282602a012d4e6fec3f63f7257a0f344d2b250abf302\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"028efc73b374903084f5d5764340bf31627fc1e2ed3048299aa3f9e1fd4d9db5e39abcfde42bdab263c2a91e2392a9cec5ad262251b54cb84be4a2f871200e8865\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cda64a68115a3ca8971a2747b360b387fbe1d1ec",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c487000000004bc7f4e2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb6010000002fc980f20145803400000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac1c40ee26\", \"prevouts\": [\"9dc3410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"deb0220000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_fd\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d85f74a2016b0d3a0d15194034043af044f7ba411d3d1714454db830b63e729f4cce3f5cea3832d1fbafe2e5b2f817c5f5a64c5e07e2e0efcc0f7706e743bbb481\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"82807f54bec9c57334a769c386b52f3f9b91a4db2800ec02ef38736720221a9af43cc45a23857d9d570a1d184dd02399a11b1d31ebb4f0887084fab7c33b4a92fd\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cdaa800ed715e873d65a75ff494c085689777769",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf06020000005a8d6e1adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4600000000fc86371d025cac980000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787141e232c\", \"prevouts\": [\"22827a000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\", \"7aab20000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"5c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936900f19854bc90d6c79e0184be6bef7ba18c323656bf267ebd46e4fd22ae910800ebd37c9b7767cfa75ada9a6605680756deb542ec34cf1dc29d9c7b172412f3174e87bfb4d3d415907d7a3196832fc57be4f6d746253c89a46e8e4c968740366e8f45a3ac55dff4b7d62b0bc42204f13e92c55212ff162d480a58edc7717abc8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936369642414e3e6cba27e1a8d43018b0c6e901f2bd9875554ba9baf88aafe131fada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e24e037abdf69c22f44b0c591ad93651f749184eaa819a8a63a5d4092bdddfb78f243c72f4e074898aab8058b3c73fee97ec3b9723e213834a8398e97170c1356\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cdae175fecf9783890ad4364fcdb7e9a26312c86",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42d01000000bdb630c88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cd000000003ebb08c28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f400000000c26dee9901a9b60e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374879a000000\", \"prevouts\": [\"804a37000000000021561f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"47ba3c0000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\", \"dfe4400000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"1f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b8d3859c02806498ed0a6443c7e281ed1c8160789600c9782f40e9c097f1ee0446c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9facfc86bca0a8859889d9efd3fba9c68487fa49a78b15c293938d32f430a3e576ab3e02c0e1665e1d6a4b6ef98a6ef3a3632c98688db315e4c8eb8907479035d72\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936606f5652115a36f7672906b3ba9acfb073c3f40076f433b0f89c9999ba02a3338a47d733f2ac96a3990499de942ef9a5afce6e4fdb28ae911c182ccc4b722ed2ed661e9ebd30f651fa020177c2a1e4ce51b505c9194e43d6074b392863f250ba\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cdbb9c9c88d727637e88c5e5f34b796e03a77c9a",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0201000000a5902247dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b260000000016a000b7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0100000000de383c3702a0e7a50000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4879304df5c\", \"prevouts\": [\"f2295f0000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\", \"0b62230000000000235f212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"bbe224000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/cleanstack\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"01\", \"\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f38ec708f0cf53f3b369b3194db6b979fe0cb271fdaad68f02f83e00e6bab6c4f8b9b2591be70a62ed3962c9e65bdf4177c7447c68cebff2d50efdff4267028038515792f22723cd4f021229082349c4f04e1c54e852907992b3d89f9f323988af933dd569ab8ef4734d9ed0029c610ce683439beaa7b2b92d7d5f3785f11f206e293a68e74ead54fc4cd1f2ee252d1412756669ccb87bd0be0195a2fd9047454977d199608b74a0583630fc942382dea1a9b64fce701a02c5c9f815a8d6f7f6fff61305d3bcffd98981c35a7377ac16ebecf9e810a20df0b649c6b66617c71e24bf028b3b4bc9e1d250c72ce187c3ed97dd11379f788342a725ef5254e8152c925be1fdb6690c4e55e22d4093392cf82d7f0a3f5de5ae9c0ca33a9077da1d6d424b46db02ff988fc19cf23a4951173feb3eeb5cf27c148448535e997b51bd7bbd49cc1c9d1c5543faf51f246263bc293a1ec3b05628bc84cfd7f4dfccc3e91545ebbb7a20d90802d61cb761b7ed3a9d8977f7a5521df44543d663068a2348a7c7f6542a544c030cbfdd70964c7e81d665feb2adbff25ad3ab75b67ecf3712c09a0b10fc29ed9ec9ba811a78159d56d191855f20d80384a7f598d54defaeda75074e07476023602dfde1c8d0d124f96edbab4af8198f97e6bceba6cad7de517a8f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"01\", \"01\", \"\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f38ec708f0cf53f3b369b3194db6b979fe0cb271fdaad68f02f83e00e6bab6c4f8b9b2591be70a62ed3962c9e65bdf4177c7447c68cebff2d50efdff4267028038515792f22723cd4f021229082349c4f04e1c54e852907992b3d89f9f323988af933dd569ab8ef4734d9ed0029c610ce683439beaa7b2b92d7d5f3785f11f206e293a68e74ead54fc4cd1f2ee252d1412756669ccb87bd0be0195a2fd9047454977d199608b74a0583630fc942382dea1a9b64fce701a02c5c9f815a8d6f7f6fff61305d3bcffd98981c35a7377ac16ebecf9e810a20df0b649c6b66617c71e24bf028b3b4bc9e1d250c72ce187c3ed97dd11379f788342a725ef5254e8152c925be1fdb6690c4e55e22d4093392cf82d7f0a3f5de5ae9c0ca33a9077da1d6d424b46db02ff988fc19cf23a4951173feb3eeb5cf27c148448535e997b51bd7bbd49cc1c9d1c5543faf51f246263bc293a1ec3b05628bc84cfd7f4dfccc3e91545ebbb7a20d90802d61cb761b7ed3a9d8977f7a5521df44543d663068a2348a7c7f6542a544c030cbfdd70964c7e81d665feb2adbff25ad3ab75b67ecf3712c09a0b10fc29ed9ec9ba811a78159d56d191855f20d80384a7f598d54defaeda75074e07476023602dfde1c8d0d124f96edbab4af8198f97e6bceba6cad7de517a8f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cdd70dfc5c39ec02e5e48d747003dccc345d9c35",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706f01000000230ae7af60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d600000000224fd88202d97b1f00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a626000000\", \"prevouts\": [\"621d120000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\", \"78ea0f000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"d8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004599aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb406f18ba19de64c771db55f5af06ee3412ffaea1fa921290752d742eff6a1e67f7007ac6d9f1365651a4d55e6df0dcb109d268cc6c386b355a4997173bc95c886\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e197185a6c30608fff89dfccb39a96a02e4addd353a2af1bc7b33caa3a3ac07fec6e41ed285c226ab336f92f35d989a379104ed593ec3ff802714cc8e85daf0b3be26db4ec4cf8c6a12d3bfb33a6f8c1ee971c26c5be04413f1d9dccd7296a9839\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ce08102de2f440a689645ebc57829a604424b751",
    "content": "{\"tx\": \"63a8de0b0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270400000000003003e95dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6000000000987504ec042540390000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478761b26b4c\", \"prevouts\": [\"d92113000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\", \"f77028000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"fd\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f9d8f10db74f979c41891759fc87cc010c6171f34a4dc4fa278f7920467dc96cd9f77cfc3030f4fa2d9551f14353e565e33cb9a72a19e79fd0e4930553ab0cc3a3aa70c847d82166fa4c32b27cb78dba1a5c77b2d4b8269442df723c9129fb762c347795cbfd24b3bfff0bc05cfe1b5e01afc0104c4d9fbef2a45c75fa918ca8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936427f03015f7a96869233965cfd3869b27cd157bfb8ae4cf2df456ac491585181380f015d033fe7faead4766c682a770029d5c79030785f2d26c440da4ef071fea3aa70c847d82166fa4c32b27cb78dba1a5c77b2d4b8269442df723c9129fb762c347795cbfd24b3bfff0bc05cfe1b5e01afc0104c4d9fbef2a45c75fa918ca8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ce29a0262edb0e4c4a3905e19cb08c9a4e8318ba",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c13000000007dd53f9260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b5010000000b3d637101b5bf3d000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d1010000\", \"prevouts\": [\"ba5b49000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"a090120000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/minimalnotif\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8cadfaf51f6d962fcdde8eb5af4e11e99fe61a0ee123419858ccc8e5d240b848ef2e5b00a9e10a337b8e276a7f106d051f269bc6b641ab1b0f84c42b182cb6d2\", \"01\", \"646a6720871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b5e13cad19c924f09e742cf01d7e012810213f06b075da864011776c4e0e33ce5afd4f5a80fdb0e775e9347ffe0d8d06d20821e8392839b829c29e03cf24dd39e09e6d21873535d25ffee6834466c284ff42ef82d8fa2fdd706d38dd213905035c198717912f4b406e8d3b313d97c1127d1135c371a850790824e04061625b9d13fad9f6d66cfea14ccee2f27c94687462e60c93097e3ddae516a269438c7ee5497178e22127db6c7f8f175fff2d2055fc4c08a025732ff7ea1096ec159efbddc6f248e0af5869f80622f637a3edafb79d72487846d4b0589ad8df1e49d86b58ae982564b911df2d2fca61beb75f1ecc1a3526592822acf1cb81afd4e2a93f13b7dbd0c12ffd99a2b3242b359ecbd2060409f001c89f4f8371cd210f37fc35c4b1df78360227d44f218f9c188c83f404e81070c2440736b5601340b7fe06d3b1bec47189a7be4ffc0056c3ee876b2f14785a511ffb40f655d5a8b5fa356d4081558c155b0d7e8c00e6282b2c83a0b7370731ce99ff8996d6837e990d84e1874f60a177a028d5b32d1137467ad00d3419299404906e230dd6a3cb22ab6dff4f06738a88f45b76d7bc9f694c0e4e272f5d4f15822286d483919ad24a64a55c6aea77b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8cadfaf51f6d962fcdde8eb5af4e11e99fe61a0ee123419858ccc8e5d240b848ef2e5b00a9e10a337b8e276a7f106d051f269bc6b641ab1b0f84c42b182cb6d2\", \"013030\", \"646a6720871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b5e13cad19c924f09e742cf01d7e012810213f06b075da864011776c4e0e33ce5afd4f5a80fdb0e775e9347ffe0d8d06d20821e8392839b829c29e03cf24dd39e09e6d21873535d25ffee6834466c284ff42ef82d8fa2fdd706d38dd213905035c198717912f4b406e8d3b313d97c1127d1135c371a850790824e04061625b9d13fad9f6d66cfea14ccee2f27c94687462e60c93097e3ddae516a269438c7ee5497178e22127db6c7f8f175fff2d2055fc4c08a025732ff7ea1096ec159efbddc6f248e0af5869f80622f637a3edafb79d72487846d4b0589ad8df1e49d86b58ae982564b911df2d2fca61beb75f1ecc1a3526592822acf1cb81afd4e2a93f13b7dbd0c12ffd99a2b3242b359ecbd2060409f001c89f4f8371cd210f37fc35c4b1df78360227d44f218f9c188c83f404e81070c2440736b5601340b7fe06d3b1bec47189a7be4ffc0056c3ee876b2f14785a511ffb40f655d5a8b5fa356d4081558c155b0d7e8c00e6282b2c83a0b7370731ce99ff8996d6837e990d84e1874f60a177a028d5b32d1137467ad00d3419299404906e230dd6a3cb22ab6dff4f06738a88f45b76d7bc9f694c0e4e272f5d4f15822286d483919ad24a64a55c6aea77b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ce4f3f6725a58e41e3545de8f93475f0f9402a52",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1f01000000f063541e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bf010000003a54a79804b961930000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7969a010000\", \"prevouts\": [\"f0058500000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"6a541100000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_keypath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e4edee017e3a08e1f91b7c97a26d29155c6281d50438dcc8a29476fe9a68b99b38b60acc6eef69f102de8cbdfc6d6676e477dcdd31618e0e5de4955021147f94\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ce5a6e30faecc2d2f249b1bb1b0a21cbffc46674",
    "content": "{\"tx\": \"08aca4d7028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48701000000c4c226e3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5801000000dcb7abfb040634aa00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87b5000000\", \"prevouts\": [\"5b9a3500000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\", \"7dc8760000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"747d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c1c1cec2ec4a702b027c32afe8f050a7abd6c53cc1a056033971ea23441aa0d3133f027656d2d9f64ade865091a06c0b2adab14558eca27c91472397a1e3806e077aea6ccf316b47e40a0e3636c5ad4f7738b9bfce630d4a478a0dbfcb51ed93\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e86e257627f53ae21a01782ee3e7d4da03b01bc19a25fdaba4c8a32b8ecf0a2d91bf4492fa00dc56072e72009d776219274bea6eb51adb458249eab71940c27cb4bfbb1ef2412aee06f4b75b9e20a72d4d9707545a4ae77abc538f76b00105406a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ce5c007dab411a6a225c1b09181578eaf6edf364",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b400100000067e43aff60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701901000000e9710afe02937a2d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4879c000000\", \"prevouts\": [\"19c62000000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"b6700e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ec\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"54d11a88f6ce79d225f0cdafeed5c39d788e16259d61c5275b50e80b3bfb5cfc0f07c172834590e622d40318935009275316a465729aa9a75fadd25c8412620903\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c62d4b9d44dbed0370531ed32f21bf252d426199ac66e81b743502f6d76b552a0decef315f1bf33a9d57e67d162139ca6c11ce525a33c23aa5c502e86c6132a3ec\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cea069b190b73ea7c41e48275d6d0841d7fdd8f3",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708401000000a79891d28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46901000000540de0f504bd1452000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ace8010000\", \"prevouts\": [\"1a9a120000000000225120fc75765be35c7498e91185d3d44c5b81ace48e1fb56783e170e4fddd4a850715\", \"8ec7410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365a8d43fd877bb06b6facd7893ec8875434e1fd6bce1c56381938fe22b4b8acec\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a78616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cec62d6028ecb0885e4adbb89b0c33222ed71d55",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf03000000004470afcedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5e0100000089cf15fa0167036c000000000017a914719f78084af863e000acd618ba76df9797223689875024b63a\", \"prevouts\": [\"d3667100000000002251201dfb228dec79c6e234b1139c58dcf8de3e24a7459acbe9e029f267c6e1783b9a\", \"6789570000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_2f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fbe428a73441a68af60203a55a4796d04d6f7b3d951051d223215aa7524135416a59285e20ba65f22407661e4b0e817881fa778153f27a9463868edf179b7ea002\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"dce78f8d62b7353eac36cc02e196f1e0fdbef7f47d6d25af99c7cd75252046cb8d358f809e8cebf26c5b550b8dd10259fe535a4d6492a829d3f2511a94400d6e2e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cedf97481d67a8a89199abfe8c15570cd253967d",
    "content": "{\"tx\": \"c500bd8803dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6b010000005ed744c48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49501000000484908fc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43b01000000f2652ed601e58f2a00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7f5010000\", \"prevouts\": [\"d29a240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d2823f0000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\", \"17283b0000000000225120f103da370e61120ffbfed9be73547691440e55c4664603c27eb9ef615a7ccbdc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_cb\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5e0ce5e8cd876b82df1fee58302adc4a3cce5803b7d0457172dec7e3f92827dc4e86ce27f3caf22b2e99c5bdfa1613a471da67739d4ea61c0554672aee7c256a03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"dd0861ee7b028ba56c85794d6d6df9ca3da7ead869c9b2f2e0dd7c7bc422489e54f0f5153e25ef95a8174efd803a357bf707f2f3d5c1257294e2ecbf98f6537ecb\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cef118940d5799540be8721e2453120639fbe14e",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706a010000003d8886bbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf770000000088db63dd03e1877e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478742010000\", \"prevouts\": [\"ee0f13000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"54426d000000000017a914f5a65ca4534ef3ca5833434c0dd44a3e128f499587\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"797d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936744fd1b2faf1c01ba2c17357d1ace23791aa902c4bf843c70bade4192b70605de711fb6ebac21c15598dc6feca0613664d86278cc532834585097123290bb3d45be39dc57762be2d9b1a04aa5b570805d23104bfe4fa54c392bda5d51f7f4540\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820b1051acd7c1b2d32995b3df0c6921af5f8ed3327e7e16cb8a5e0bd007230af127aec9530f4cf05d3554e63105b96634da39f3c52c35c251ce860693e97320b3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cef395bb5063aba1aeaafde86a8bfd4c3ae80b8f",
    "content": "{\"tx\": \"c6803302028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48001000000509492ecdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba7000000001c4789db03c46952000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6caebe045\", \"prevouts\": [\"280f360000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\", \"6f4c1f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ff\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"80cd77aa3a5a4d1be123e789c5879de71495ae44e99f4f3081f634dd016da10a6ad9d4183d48e68fdc1329648a49d9d16a3721394702132246e3268da339dcfa01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a8a47a4d127e94dfa116aa6f85a91249b93c2c90aa812d931b967b2d478b78d99b047e56da681d5a4efb92aa309c553397823d9d8fee1f0fdfb32e16fb0caac0ff\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cf1726d92ba0a57e5cb508f7f38cf8c30c31572a",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b800000000041ad790c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42f01000000ab6dc361024f625900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac25af454e\", \"prevouts\": [\"dbfb260000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\", \"a8f73300000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"7c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac26c11d7825777e0f2ddf610788c970bf175cde25cef7de4e72e41494d53bd31202adea3ba63b8efb220ed0b92cf765f01931ebb31f4963f663d14c15b1e6099a711983bc616996e2ac47b27808b31a9b7e87f7ce1f3571999dd3a2a57f1080\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d5fbcf61a2a7c737f60b9029794ca77d60e8dfd9dae9f2322432c03bed71ef108eae3f5bf5f4c26def68bde658fd1412dc2dfb494d39d6b1bd4ba6a274f177d9a711983bc616996e2ac47b27808b31a9b7e87f7ce1f3571999dd3a2a57f1080\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cf19361572439227ba12b4d90a84b45c9c77a6dd",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3b0000000048f62767dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3600000000af19cd280474a0a200000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df9797223689873baeb45f\", \"prevouts\": [\"0bec7b000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\", \"0f91280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_b0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c7e23a2efb0698e1e188a96e58fa23ab5f3de24d0b4c52659dd65caee28d205b8a745781bb8e9aa4e1ad4c31660cd509c53aebdae36b6dea247baceb00afef7d01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"07f48bf2b7d960f2c678093938bc0f4159a8d0c214c961d4370b73333410e9771ad486d70ed4e2692b7af347a8934fa8b6733a90fdf5ffce20193ed60e7d5a25b0\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cf1b9fbc48a705e782d90e0caefa83731663957e",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709d00000000dd342c8a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127014000000002d192c0760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d00100000015c28620013a9a03000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a600000000\", \"prevouts\": [\"6c730f0000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\", \"a76f0e0000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\", \"ef970e0000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"e97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93661b2d540c156192df9dd49945f9f5192f7dda818524a6c961824475c653b1c861a6bebb6dd497db999161621b23fc9287dcbaa466f13da5d035327b94edd053dbd7d7e2e0b29bfb283546875adbaa200efb560b624d50a8165ce6ae8ed501592\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93603d885e7f20d9b45c46863644d45c7ae3e217370ab6fbcc5b4c9a947f89430a48b8d8a8d8c003fabb93595bfceed403f9a1266ee95e7fa8447cccdf398ce498db8321554bafe286e6661652cf416d3db0b455024b23404eea069d656c79e4f25\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cf3ddc0d11192bb67b1d1a9c46dba9cb99e1ab37",
    "content": "{\"tx\": \"4817304a02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8b0100000004f694a9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7b01000000216ddf84044aeae6000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6fe1c4f2f\", \"prevouts\": [\"c95b7a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d8d96e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_dd\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1693a98377fa50d7dbb818dadf1792b7c1ad3a9cb0abe14df45247b12cfd987bd2f475502d3514ff2031b0fe233422feadf71d7adb6d6f4e6d99684e5a36ee7e02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bd4d02fbdc6d4cca7c7ab7a18a93dc76587b1effe83bf61f523e109534dd4e18c4ed61fac327eab914a154a2c68d5dc3b1561b45057df520bc7e7a5398554b3fdd\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cf87f1c7fe8d84db93cab39e5ec4fc004b0daf45",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c68010000003c978ae7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6e01000000196033aa023d2f98000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac56020000\", \"prevouts\": [\"530253000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\", \"25e24700000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"eb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936548e02ba2703ccddc552600e93f0a288f5116c529acb2e0434ef3486de3078ba3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821e09e6d24dde1e7a9afb38743b4c2dd55dbb58a3a1803a82bc7b3a42584fec8fa9431f387a803f7df77af21560d586d92c96180a56916d6b7efaaea6f10ba4ca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b965c838716597843dddd943276d0695a7197e96f70841ed980463eb99376fe31e09e6d24dde1e7a9afb38743b4c2dd55dbb58a3a1803a82bc7b3a42584fec8fa9431f387a803f7df77af21560d586d92c96180a56916d6b7efaaea6f10ba4ca\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/cf99a5aabda5c420d162ea57e1d44c83b4a5f444",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c64000000003cf989cedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8d01000000056889d804c0d86800000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac35030000\", \"prevouts\": [\"ec1e4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a78e1f000000000022512088381247371028bcbdc4971a16b3f7d8df868484be1d753506f5bf6782ea1e55\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_2b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"63722b021a08548fa744e1c0a27362a8610e7dd1c30906c69a3b2816265784581a676077685bd665aec715a8abf2751334393bad43e0e4e9ddd3607487551c2a81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7bb9e09f4b1e0d730c22de6690becf1e6d3a1f100064d17fad55857421d91f42962148b4c56127aacfa0c7f4df742e899e7fa7e1909e235c3f4a1b34e70273f52b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d01804b3f650a230ba4caf6f35710074094ef4bc",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2800000000ffe4807d60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705201000000dbb069df02474e31000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7bdf76d22\", \"prevouts\": [\"1acc2000000000002351212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"f970120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"42ee508d18775b48c94fd207b2626ef394875aa76ea60442ce21a9f0a0fd97bfd705eaf6f95c9eaa6ac9bd6caaf5b9dd6f001d593c2e73b9c5a614dddd582546\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d018c44a4a260f0faa1c368b22e6fd2da47b4279",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3f01000000b8a74f8a8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44f00000000e90788d160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702a01000000ca5a428f0116f30700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ace4010000\", \"prevouts\": [\"45214700000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\", \"d6963e0000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\", \"aee20e0000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09025f772e1437a5b0cc96ef0a34bd193568a916eb560a1c5dddef20463194398d4a14d16e0938cd4678c75f1bd5c1bf871936da2b6748c97bf7fc1fbff8fcdfab084ca628a9dff35f7224f3de1f7ba44a6a23daaaf545a4e77775718db7c6a82b29b43709b6a0b61403e815015f55384b9788cc634138766626c4ce0bce5dbe3da90c8417165766291c5877f3f1bf1fc9592b336e6e417c329942273fc005d0a2f83bda9a03b86966c91ba21108d1761a66a58734da36ac7e4d608a3bec7d3fc8bc1621814203c7cd0c95c9bf4e721d568e2e542e5b43e3825c03b564129bf270d9ed1cd8fc5f46a2e64edbbd92016de955383e9f1819476ce03e8141b08549536afdfecc08023f1d20a96fba281fa7c5bc1f31c161f5351a47e2db41e94e21cd0613b1bf91aaf8fefe2a16b73fc24dbe8080d3af20233a0adcebdc9497d02c5904e358694815d1d3524aa4e4452f3d13fd0f355d8ebc39374249ee7694fed0dbaef31ac6d73517586a4a28f68f8b206998d5137b22e8524e843c1108b6af1ec8af93b37ceebc645c7e671fe1476405d469151316c26dc1bf30f3b391f13c299e078ab260bf9c73c4d12e7884451119b44116164167438eaa4ac7562dccd9ac92ded2ebc0b85f069c3e5598e19e02713f05d7548c510209d9e4344fd110ae0660e299ecbb7d27ac950ace1af6aaad167514a6a6cc0a7fe3212b18746ec8e2c2c615cdd0c07515bccc42d475\", \"067d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e87f2e70a8b9232395faf03242e8d41e7097acd4f110215ae4f1c21e826dd60490c48ffafb7a4cf249a6909d8fbff6ddfd3f500331ce755bc2f73b79afc0800987\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09027708c97aa828833b11b783b5491081b1284c4f33ce5be3a35a4dc94744136fa2cd391e56c9a439e360a518c65cae46495d4574f86817dcd16bc3a3213f4c7d88e0ba8857d3b152f2b2e48fcccdada96afca309af0e78c23dec043b6f39f2b3f333f9f4675f15fa1f241e6a08975968b985b18415ddd5b73a092567ffb72cae99e975a8d0eb1d9ab9ec238cd331baaa2230f211e1ff898256b50e67890468947aaf693273b833c736f724fc73ad991bed14f06ab346440d6dcd960c5ca6949d874cf8a40b269479171fd4b7444400a48e10c420de484ffe9ca2739c7c2cbab0029885b837668531acc7ec9dbbdd28ae206dbd599e55c11e952c593b055a65c55ae9088f94248659c26265b8f68c00004b4d5cde70c38966d13e9cde87648d19a89df27909672c047ab5fdd42e482dd0315161fe54d7c0a8e7d330e7e17a69fecb4a1bba8df1ea1e4296c00c6099f8d8640357924af89a805814fd36512e59ce52d10350e67b62398dd708ae41f0e70ebcdb2c81dc72b69e5c5bc394709fbebc9c1b5fa58ddc3959c3ecde73e0ba690a2c6afc5aab47cd0c2138f8d1c4cd049bd2a239f3918265b30a6126920f8b142d3cc96a368b86e1782fc2d1f501837d2a16d0abf1e31ea47e605c5e6d4725a34bfe2b6d1420a10ca38bf362b3c3ecd34d40d5222a270842221d424682d0b6ea7c4b347543ccb2e0d383d32a9d6326bb81e0401e6ff36a84e16d2e75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936432946cb8c3cdde7216acad2d64eb2e5d48360b34b21542ce9dd46c17c6dddcb6ed3422fe95872366e2174646ef4116c9fafb56aaaad9ae25dbd472ec9cd0fc1c48ffafb7a4cf249a6909d8fbff6ddfd3f500331ce755bc2f73b79afc0800987\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d023d686290f14c19a40f74a18a2c183ac38c02f",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a4010000007ffa04c8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b250100000082473360dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0b00000000b573fe37040fb04f00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e790c8515b\", \"prevouts\": [\"d2ef120000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\", \"8cf01f00000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\", \"df861e0000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"da\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93647616881cc706df192d68bdb7ce4fefac112c6e83b2fc7e7a0b73ea4516ce84599aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb41dc38fa67d6e370c9f405c2af01822f370dc317d6e78d2f71aa14f0ce4de56d6ee4d75780d36bffae9b56136e6d27c02b8d233efdc800bb260bfbba6a6f94b87\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e116c8ab92abfbe4bc2686b5b42764123e12e1b7fae7b64d8b1bf7005c7df7fa0a3ad7647dae649c97c815eebecc244cfd5d14ac6da92e0e18049c71625e2af9496ad20bb4e3465af36c086d3f45ee510bb6828f8cbf764ea9958c57f38670043d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d07029fee875ecd9778957b1eb1b6ed3ba90c94a",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd401000000a64a7c9bdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2f00000000f9b73b8e0300959b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a695000000\", \"prevouts\": [\"8f217a00000000002251204bd530dd92500289ca536d9e0216beec7b39c81554ac6dd1e9e4cc3828e76161\", \"ed1f240000000000225120e9a13f65c3f3d085beb38984e1c9fb296d2b0d4cc9211abac3477617752bcef6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"fa7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93692144fa78a37f9d4158f2341b3f64ea9d93b698f8b61fb7d7e21bdfd4d5c0b363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0829a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ef1076b289256cd19daa60d704e81db3a39e457bb71d9d0e29c4cb2075820e5e1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c5b5d638e62e1ee83083719c01950228b7d23e6528a32df7f751a90376aaaf3e9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ef1076b289256cd19daa60d704e81db3a39e457bb71d9d0e29c4cb2075820e5e1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d076c78276e47d5f2551df88390966202a644ad4",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8300000000f7f2e8ffdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c620100000059b834bf029896b0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb18bbe4d\", \"prevouts\": [\"86e863000000000022512063eb770f298cfb14c87c6cff1e0541dd7cbc30bdbab4472c0f37d52bd55ad696\", \"36094f00000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902452dd112dffa504dee00bb871d5fb4f4cdc70bb11249957e0e42b70388c4a35d888c1540f746007436556326f9f553b5e8fc84ccfeaae44d745d9111f51e6ca22c76388fe40c280094e2d50b8eb25b3d5d3f8a901851dddb1357ee99fbd5de701bffb10f097a8ea1e51916519b83ee492a5cb6dff803d7ea9f8817de5981ce0a6784288b95334560faab08243f18cfd85ae93f45ae21b664c7c3ef2107879ffe657f4ae9a4191b0ae3389d693b03b82b13b6fb2eade79e6fdc8b0620f27893d87606f39c26c0076f2e1ad5212e6b08f11e5dd5b7e14a135f93d0a3941ac2bf08b272c73146298e3cf6200bf885886acad5056a355aaf6a0fe27d668948112b32abf3dc83ea45b434aa9e66871668d0fbfdb641cccf5f34df7652fe634d33b674fa0a247d7637c467853e91cd41150a08ecc9aa8aac03cd223b4c9cc85c24b8fff7b7f77069a5ea7dc3450efd896b6cbfb3cd07764170fc30472b14126c987fa8b5fc53fa4bc5fb46cdb8cf7e32982bfb09c2c04ea3924799fcac32e5363b3fbf0eb85b291b1dcf2b0c7b31121af0b8f61ec158cbb5822dd1cd01195cd89ad9ab03ad276c165c0766f5a90241ec0e0cc152803a23389d7af769d970cb37cec53471d5ba61638c456d3eaa0f5b5454ce50e0b5af0c243810611e07968722358e65d5a0658d9609214e6d90bacb2e35981e52a2b1743fcaab7e7b276d85ceca8df6c40ce9b8508f882b8675\", \"ba7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936912fef94e10f79ce4c6c6612f6fe3346bd2414e9192a19778305ffcd15009acf20c3a872da93914874859cef7e5edec23fb149ebdaab98333cd5c691dfba4028fed5a24f2185242e3d6c1310740c566533f3942992fafe5f5be2785933680ed6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d2208c9246ee7bc47f92cc9c50637293d565e48a057c7abf75635165c186271e4ea5aa83572f20d79ee4ae1669fff288bb7d2ecae5f7bce411fa9906cf9ab36ef8492e397cb36baca77b073614a90111b5b4fcb30bae5be7b0c165d1caa26fca436f608e507ee81e8dd4c003a5eefb33cd057f0ed28457e6de9e36699586b005e80c2712a8081ed204774657de77b11e2ba60b1d9c9b67a72b051088ec912507161f26b3ec7ecfe19cf4898eedc1cb356851099eb587874b83b6dbe44cc06c4004f1b27753d9e336e9f02535dd635f5e618663f2d8938af2ad8a564fe16ae9daea0b2521267c3f3da68e0759eadcd8bed2758f0905b6d41800fb3c2b3bf3d95b6219a9271804a8cfa1cbf23bdc5aabd4ff73c4b36d313162c832b72aa4ab30dd1eedc1811b7f9528b3698a42629c6ce46b57479090146564d6359f006b31bb11e0ca7c499c7366a4f0a872f283b3b5b95d9d05e3e2e8ed33dbce69d978a5f30e004e7452907fa67bcf0e3227569aa2a3f69378e147ae2419a3902be080524190239fbca5a6a5d4817fde99caa5671340db54fc90acac1a9eb412b48f83e53d7d521a24dd811767905674692294862f85517ea0c29e16b3e11ca44aac46380601d72fd45209082934ccce8a36f4b57a138ce36ba0d19807b9040ba897b8e3ea6604eba3abad5b4cc280b6c6f0452955ae9e9af5c8ad88e8dd0ca5b0f0e7caf9ecf51a5b9699fb66cc6175\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93691e172e3ff7e60f8bcc64ca363376b5038c5dffab23b3a4652792c10b41fac7b20c3a872da93914874859cef7e5edec23fb149ebdaab98333cd5c691dfba4028fed5a24f2185242e3d6c1310740c566533f3942992fafe5f5be2785933680ed6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d0a5a7631c5914f69f44abe8d926e7ec265b3853",
    "content": "{\"tx\": \"4c754ce802dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9700000000926720a3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c80010000001f7d298004572a9800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87b7128437\", \"prevouts\": [\"effc4c0000000000225120e181fd7d5a5189f175c5e112edc7401a8c528393c340dac4325961e6f48db1a9\", \"631e4d0000000000225120a283e1ea0142d34d03fade4b28902cd262d82bab6ae3891658a9596d967dbc43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_3\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"026ec354772fa246b3f0394a9e69110fd2c48311f27d0c83cf8b19d69fd72b9f68464473cc633b4bbcc97889ed4f974651cf2c418b211c75953a72324b8c9c3e01\", \"f344c8e4486ebdcd988b2c662b6fc4536264f7c1fcaa7f\", \"7523fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da5163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000bb98778e8b0119682a9e95c76c4762be2b7b0bf0af1ca73bc0d6917921d524ed593db1d8acb3dfc8a5301acf8994f458dd9d809af960217efae134cab2d25a5f3c460051f84ecccb8f94d91e8f35ff993881479ef3c2169078ea27fc1efd1879a83cc0faef5622f00b8684cf9aab916e899c621cfc98f9f8c2408069ee7742b8df1aaa521baa55c818edd5f58122a9dabab919dee88588727f15fe990b660ae80000000000000000000000000000000000000000000000000000000000000000938d5ff6e156e40e5c4bf0dde7f997191f0241386be244bc16425fbe8cdc6f0ef602ef92689002c6bf91fb285c22f83902557ab54b48323f842af71c4a5aca8bd17144d302f4672930a59a8fd6f3285880cd0ed72ae5907c677bb5bb848794afdcb2d5a71197cec237324ce49a219fb4b348d43177ffdd620782ec813b0b718dbb422a33ecb9c5fc1baa551d82e3cc524ac42ee5adff9057861b868ffe286ca8e287bceebc9035fdd129c920261484dadf8c85121151a621722a1712b23dff52ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc38abd44f49c2804a30c3ec31e3b0967d877e32532956cef050547e598b7b6c70000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4b198453811f4c7a4bdd024a8af2c1627be36162779620096c812afd232c90833dce75b24e5e6d274d07e66a9a7da01e56ac0c23936774565897466c1386d3e602343ba7b60b2d0bfe9adf8187eee7f66fe6e07b90e1dd329b8842c2dd191ab003c4ad09d6bc9e246e261f33ceff387720f0fdecbc8059efd62d26726f9474efe1ad2a1021334296cbdfddc898cf292a71591ef70ae96753f9a2981208137b980042b88f0b1d9b2df68a486c1f31d1954350c1ad6dbc6aac04fee62bf9af05992176c77eb7f499dc36668a407834cfd7ac683b66ee2f492c30b665576b40cd3c7e7dc5f13bbc29aa99b7843fedde809b37a57e3f67fe64be4f701efe2c48a46eb4b083ef651d082e8e1a71eb72b6551e6fcdc8402db81e47be0db1fd619d7437d921c5102703ee65f7f0c9c8f3d8bc7e85120bbb075fddf0174c4891020cde023d9672046e2971470903d516190724adb48d739135139e61752564471a4998b5505afd0b845ccfeb86985325af1e27752d0b7eca51204bf535d2ef9d1a46a3d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff173ac20ed5a5381f618aeb45a84c2d2f87ed17c8468292a432dcfc6f552e8da6ec0ea6b531c8335f869772adaacd80c5eb252f3d9b814dcaad502c1f975db75afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01feb7a289dea91399595dcedc43b350f0a98563ce843d6e8ba7cc624f22d7033c74c6fb62ef5d452fe8a5df2de783272e8355b57f1d01ee014414364d40d97\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"026ec354772fa246b3f0394a9e69110fd2c48311f27d0c83cf8b19d69fd72b9f68464473cc633b4bbcc97889ed4f974651cf2c418b211c75953a72324b8c9c3e01\", \"8d395c7053ebafc530ee7f3432c52796fe7bffb2c857\", \"7523fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da5163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000bb98778e8b0119682a9e95c76c4762be2b7b0bf0af1ca73bc0d6917921d524ed593db1d8acb3dfc8a5301acf8994f458dd9d809af960217efae134cab2d25a5f3c460051f84ecccb8f94d91e8f35ff993881479ef3c2169078ea27fc1efd1879a83cc0faef5622f00b8684cf9aab916e899c621cfc98f9f8c2408069ee7742b8df1aaa521baa55c818edd5f58122a9dabab919dee88588727f15fe990b660ae80000000000000000000000000000000000000000000000000000000000000000938d5ff6e156e40e5c4bf0dde7f997191f0241386be244bc16425fbe8cdc6f0ef602ef92689002c6bf91fb285c22f83902557ab54b48323f842af71c4a5aca8bd17144d302f4672930a59a8fd6f3285880cd0ed72ae5907c677bb5bb848794afdcb2d5a71197cec237324ce49a219fb4b348d43177ffdd620782ec813b0b718dbb422a33ecb9c5fc1baa551d82e3cc524ac42ee5adff9057861b868ffe286ca8e287bceebc9035fdd129c920261484dadf8c85121151a621722a1712b23dff52ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc38abd44f49c2804a30c3ec31e3b0967d877e32532956cef050547e598b7b6c70000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4b198453811f4c7a4bdd024a8af2c1627be36162779620096c812afd232c90833dce75b24e5e6d274d07e66a9a7da01e56ac0c23936774565897466c1386d3e602343ba7b60b2d0bfe9adf8187eee7f66fe6e07b90e1dd329b8842c2dd191ab003c4ad09d6bc9e246e261f33ceff387720f0fdecbc8059efd62d26726f9474efe1ad2a1021334296cbdfddc898cf292a71591ef70ae96753f9a2981208137b980042b88f0b1d9b2df68a486c1f31d1954350c1ad6dbc6aac04fee62bf9af05992176c77eb7f499dc36668a407834cfd7ac683b66ee2f492c30b665576b40cd3c7e7dc5f13bbc29aa99b7843fedde809b37a57e3f67fe64be4f701efe2c48a46eb4b083ef651d082e8e1a71eb72b6551e6fcdc8402db81e47be0db1fd619d7437d921c5102703ee65f7f0c9c8f3d8bc7e85120bbb075fddf0174c4891020cde023d9672046e2971470903d516190724adb48d739135139e61752564471a4998b5505afd0b845ccfeb86985325af1e27752d0b7eca51204bf535d2ef9d1a46a3d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff173ac20ed5a5381f618aeb45a84c2d2f87ed17c8468292a432dcfc6f552e8da6ec0ea6b531c8335f869772adaacd80c5eb252f3d9b814dcaad502c1f975db75afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01feb7a289dea91399595dcedc43b350f0a98563ce843d6e8ba7cc624f22d7033c74c6fb62ef5d452fe8a5df2de783272e8355b57f1d01ee014414364d40d97\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d0b362a6e10e2e3ca3df573c3918408d11230109",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1901000000f2b706a8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb701000000d5414634042e88c0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c6010000\", \"prevouts\": [\"2f50740000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\", \"994d4e000000000017a914a68ade9e67dbb5e8acf044461cfd5bd8dcf592c387\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8672094c3f08b9327f7ee48bb8899708766c48e78ef53e5ef370aaf6f5fa99ca1ce42d201fd753cc19d7433434234602e4af838ce265353441a761579b9ecb89c78d53ca9a9f93e78db88a883cc9c42dbf55ad09041fa37b21a93adcd191d7180\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9facaceb5ed46230d7b49b5ab2b34a8a36729addbd68724e584e32fb6f2cc866bc08d213d90ee48874bbf2b18160b4fefa78452fd9fac91ad5f640de90a3ceda28c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d0c14f7b59f5b7c5e2348a842c4f17589992edef",
    "content": "{\"tx\": \"bf72937702dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c91010000006ea375f4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd700000000a67e3fba04f02f8000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7afb7485f\", \"prevouts\": [\"158b5f000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"80a3220000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51e96c6534a767436613e49f724d4ec24036cb4bdca8403821be2a67ec4c00c0e3731d32c4c28957ee8de75561afe63689e2428997edbca796d37c8feacf80dd0b4e0df2464f99a35d5bc9fbf69ae3045675e957332f77327dfd622124d00cb4df\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93663b062b9ef0e1745417b82292d0a45beaaab5fddfb801e218eae4d41ef530e1af41497843ee5deed9b1c1ba808c351924818107785eb2ec7667e528f438b571239c06a64e39d88ea3d05132fdd32c8e90a6b90ff74e726fde2d8f99de3a7b89959b5d8c486a0b4fb1c0695d0398f92463f78d98cf4d122171b1dc85f0cff66bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d0d80b81785e11a47eb4778cde0392ceee57d442",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf101000000673c277b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4370100000035cb6dc58bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45d0000000023dea660014dee30000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47879c010000\", \"prevouts\": [\"f5ff280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0bce3600000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"67f0410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_e7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b44a270191ddbba370b2df3c8772c2f3e42831dd5be0b90a5cbeb0cf8ce1a66083d7842fa44ab943f434d94ad5c1b0f653a1760d98d66dff6ac2956033d0c9aa01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2b78efb142fce672572cd76fcc69165e2efc16527d8cf902c0c97f8ab89297d438729b24433e96bb183b5385ca9c72379393b5f55557b3a967fab001440e115de6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d10cc817535fbf7ed3ccccfffd59542e31fd811c",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4300000000d2837e2e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c484010000003ef0486f03696259000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8761727c27\", \"prevouts\": [\"e16b230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"43df37000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_c0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"41ee4a5bfdeedd772913161e78302877dfbc4cc9dbdc3a8afef12267a74efac53d11e4410662363c2716887073db7e0c39233f6d6585799112bec5039123de5082\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2bf82e8403f67bf0e2f3c6fdfa23374316b64b6262919ad503c27710c989f7f42365bb6371bea7157eaa8e62a7db79881a31a820cf97a3fc19f8b2377efe27a3c0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d120192543d7524d72dbae6640c1fd01b655ba8b",
    "content": "{\"tx\": \"02000000017cacf58c1885ec7a53b7658a58e4f1dee7e8d7a954fb736b3a502279c0be18ef0000000000823ec9e901aef6adca0d000000160014bf1a19526352877c6b170dd8786dc91b1610ae1cfadcf14c\", \"prevouts\": [\"87dd816c1100000022512034153a16ef8458ec2412ba42dd5be0fabd8b4c2f532d179dc958fc1fca3cae43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_valid_opsuccess\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8c62f256a1571e9f48b1901c6193c928ad34746ea514f6d6b11a2ef54c82ad150e244978614c20e9aa60a3270dd7fbdb230e6b28fe98190090fa42ca691bacf2\", \"20cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f3ac00635068\", \"c0cb0ba18c127bd01c824f94fd2578ac4109c167b40bd92fd4f8ede9600f7f41f370d37925ebbaa58968ca2d1c370a50dc7325130308285a7d9868d3ad5a34267b01c94ae67cd857f8f23543b618b38154b6c0432568bb8cf7638fb55d4cc0a24e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d13e9dcbf612e2b605c913bf461a40c14c78981c",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c26010000008481b789dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6a000000000539fbbf038fa4a4000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487c283824c\", \"prevouts\": [\"38d65900000000002251201902cefa81d0b0fe2050344a0485b195b36f31ece5900d0426a9de0fd01dcd1a\", \"f9154d00000000001600141cc39a492a6f67587324888ae674f2f534a7639e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100c97fc9e3a7076e04418abfac48194f9096d7796e2ef4e86c039e00e620c8d595022061eff5f893d2f720219fb5da7830f9c65710419d91339eb976a9a5e6e151226101\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100d8e2f7a50c8e633ef64221d1574079a291550e12b0a1d7f8fa744c052d220b5d02207e6bc0a05d68076b1953f2f72c1302c329fb32f1d3c0e598475d77701758237201\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d145e690ead8e8b91dcf655a058473fba40e05c4",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc4010000002b6191afdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c21020000009884a17cbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1c000000007c4b09c60226af4401000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd3000000\", \"prevouts\": [\"c299750000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"05cc5a000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"080976000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6adb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936264742859895a6868f8bab4d4afceacc8909a577d10be3fb51e14ab1077baea299aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4ba0f4accdd80d494e1b95824e4feb55c95caee559d90e25fbf6396e2b6be61303dda2dfca806ccc9c3ad62846e64b9ac16121de5d926db5bebf2e82f8dec8d2a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1b7f6b7f6faf43deefc8dfb90058dbe61b727862c364ff314077bff4a6c878d2754e6d4b188f4ba3829c97f16419e7d7896d7c05fe6215d1417ce194d9971cb9e3dda2dfca806ccc9c3ad62846e64b9ac16121de5d926db5bebf2e82f8dec8d2a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d1624ab2e4dceb28dc1e7d8f042d85271b474f44",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc000000000567fd09760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e3000000006cc4beb260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703901000000fda958d3043a449000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acf24a3044\", \"prevouts\": [\"c9366c00000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"2745130000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"d0db120000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063ee68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c5d177712b0cd548c59bcfc2592962097a3e59d4c97937b4438e3f3d5730f1a20f3b0db014ceaa26ae02ffb8f31853eb721e6357de034fb71f3898341a9ea5240028cdc19f89baf6c362287c7c7841c4536091540a9bd978c440258b5fe7844c439ca2b6d52d4fa79aee6ecbc14a8999a29f1c28c4c5c5b9dd610517c3b748ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93684766e391fce98464b6a114031f5ccc7f792c1ff341430b2176744987b7570923225856dd898bc2835af0cd8c351393955c132e627f28271e91b4e6043d8131340899fd8696dac9e3afc960f0a100b615a3c324ed3a125e98af98336f748ba56\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d17443611cb2c74ecfda516700477ecdd4ccd1e8",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8401000000120a51ffbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf340000000013508af90254e3d2000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4872f19bb23\", \"prevouts\": [\"9bc45e0000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\", \"17e67500000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09023b9d47925be78b5d388b6d784408664a9a561a65b01fc4f675086acda230728ee4e1beedf6dbec0fe40287000a79bd3e91d72c72517edae08d5af32f9b823f6ccfdc682a7dfed51d7034240e91b3530c12c97b3c8598e165cd1d27006b19a24d23e96b32bca1e69bcad2e94ce6e36eac7e974015b8cbe3686d3c4b926b006c4f084648aa3b9f38ac2eec4dec49fd0a995f79b9b7d184bcf74a10cd932c376997479c8a53fe82a486b91f8e022491cfb892ced4b0d33103d161c61c000223f557739496486d0c8a4b4b1f9b9a4131bc23fd23ab6225c1d1b565c01f6b9f8e9e93273ab21a28f6d1b3561d38660ad60091dcbd2ec29ceed09d536132110c788dae73eb76406b7ed0c247f209e123a9d77a6bbc2b578a88f7a8acd4050d97fe1e52d8af325742dda5f5ce67cb31c6df8fcdb84befac948909e22de9f1b6513398d297083da4e6ed503438f5cb8eb2a264d04677fc74dc747a5a746151575a4cba425995a16e2a66035900c69425242818f282de3abc501ac314672dc53aec77a8600de8be9a253a24cf48364f9a4b69e3eedd88693bf7a75ccba08b4d106e480937296916c499ce84ff0e7185de1f02e8647a280117b6033cb840ea024c40a3d4c72d45929af73c8dfc8fe7d8fbefbbdfbe69a7b2943a61009c81e5faac43cbd53a7e2b693ac260c61f9fd9498b01fbc467394969c26c8ffa54dc0d889c79332eefc2f32be05e172a458875\", \"327d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366fc0e1156245507405f9d89b0f31139d8ec5e61fa01242e57235d244728830438ce3cfcf38b656b5bd992972d83f897c8aa5da1de7c0e12ea4c0aa09cdb3dc1d2e4cd18b5d1ec472eec5a95c6c9d67ba3848eb933b0b41a8c6d3176a27b07997\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09026343d381cb50353a61f09f2a021fa74437ecd6d461707b3a97fd4ff005456a0c3e6b3e75642463046c65dbe4bd98623a64c1940da4b93b5d7732abee3259c9cf71425da9f43988c27f144a56d2a8a85c33f0d5dd07ffa309b6683517ee28ffd8facc3338a129d67272c3ea4c07710495d127a7862b304a3ff9e1f177d244d4ea409196268a67b07993a679bed84781f6f792219dd6bbdd7736f05a6b4934edcbd24877b1afc2fb112ca30bf9d1bb159dd48d4476b12e603b76be95bcebb17482faa65f35a4788fec267ca709bd3c517acaf88f1fadef18faad566c4f603d3e468620ab3f393b4356c79436b4dc0dbef92edc8d3991b99924d44c7339fa511dde3a3d94d036760fb533de78860bb33ff3dfa464f28eba733fb672ebf3be46a299a39b309803e48e721018587f8ba8121b6d38b2f1f5ebc749947c164e0e63bc32f8846c7591b6bdc6aa245a503f2cd0bb8578f158696d5a57aa785b7ba3c9c79565b8793b7a34d276742c88f2c2bb982889ac54bcb5648419001e4d7e38e1aa379ce88e59d8b6dd1ae05ebbdb0457f2fb0cc7d7125e766ceb8c407b004d4802f21ab6313f731906702b00a81c8ce40c41e7f8d418e9593cd6b8b8ff7f26ec66eb5716b4f452ea66c4582c4793eaf18b8f887ccce715143eedc4cd402ca9d3f3681d8203e648ea1784219ae9fd62db3d80a298ba5a7b91ee6f5a473d6781916463574f47a8ba9450ab0475\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e08902a07d3a610262cf0bf6826274beb2bca0848f03750f1d66d9fdb1ecc982925d31a4d328a06fbd663a9de03f4f743ae6731d946a7b64875ecbfa9fe5ecb492e4cd18b5d1ec472eec5a95c6c9d67ba3848eb933b0b41a8c6d3176a27b07997\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d17802655b5504bb0405ee7934ae6e14c9c2f6af",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7000000000a124ab458bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4260100000088e9d0d702bff683000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4874b010000\", \"prevouts\": [\"493c4e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d06538000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_bb\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2c1f8a6b8a3e1e65db41fb16c34dde8abbf9a07dcf9d1d2598d82f9a4b109d6c3026cf4de56c2c3c2fecc82acd80738cdb3d4277950cb6b5a53937f10f4a808281\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5dd4e6192911482efae6143db50952abbce491617e685dfb17f5fc8c5eb0a2dbe1f71c0cb031479f1b3e701db46fbffff3befba0b0ea9c0a5297333a1f778f98bb\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d17b2da02d1d622d7b71dade71d9adc392999c5b",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46101000000b6d1aeac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707b000000000a17a0dc015a9020000000000017a914719f78084af863e000acd618ba76df9797223689878f020000\", \"prevouts\": [\"2a803200000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"dc95120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936428394a21751eb365095acdba6a51fe3b8c76f6f3fbac7b096ac1d441a9276a33f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082bb0de8cab6875867027c85350e6845db37b89c1faa2a12b075d8db116249f7bd2367bb7d11bbe7d9666c447942212a409021a53e3151df7f84d090727acdc4c9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1a022e8e4f1240b3c3d4bb5c70f2b4ea702b5d8a670f036755e200b5950ffec075bb8659128f7d307893f477315172a6feef29cf3fc1fd27176c3d23e09b029752367bb7d11bbe7d9666c447942212a409021a53e3151df7f84d090727acdc4c9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d17e92c55da82ddc95d75ddd15779fff2868ff46",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e3010000008ec9c53704b6083a0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc49f1ff30\", \"prevouts\": [\"7cbd3b000000000022512000397e1d57464f1b51d5b2f938080db6c4e519ee29109bc6f6c1d6348cd27c4a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_5\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"5213d545740b1eee420152efd776896cbc83c605e7beca755e6ac4956f5c0e56da1967fd70074547a77d44379ae0cce2f3513f89456347155dfc985d416a50a301\", \"a2623e62430210b79dfd89e9ecde828b1022c4a38f949a279f089b5dc757123af75661db2ad675fdf7ec98dd8b8a91ff17849a0ce00d81cec63b9b69407330ad5bea44ac0c67b0573f3a36a4ccc4310678c420e3002fbf3767ce59020f35b136fc966ecaf6e5bfbd680595b7ce557e8fbbb66afaad440316415c9f040d0e09beddb0162209f6ccda6702a45cb9f84615695d23149759520f434a3a5b58bd7382\", \"75005a20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5a8820871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936633863466ba87c1899c11f16db5b5be0b750ddadbb4e4dbf6166f79835a38c4430f887e27b668da7b3424a30decccb6d55871a4e29eee8a603d0c8f2f4fe43ed80bd6026482109028f84842e41827e2a19fb594fbebb92d759210479d260a45dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd76256e657933b8bb0a3ec931de5f3d544c0494761c33fc05af675339868669dee2fe44c250a9724efe4ef76ee53bd67b02e08dbd5226c6902177c0148ae73cfa900e42222759350e9b4c2dda999abc00ff6c2dea9524b5f9c6b9dbb7e67af10321050f369f8f4d86f2a13beef36eab6fb9986fa6476de7f6521b2f2571887ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff160f9c68214e30f2520000c0ef6d7596e0ce0d821c8b93328e13c5bba3fae013a57cb6f757a543ac0f10b44ab06156a457a3793e3736d517badbe684390a3930464395a806820194d875d016530f881a948b5b63d5aaa812ca6e6850da17e6510000000000000000000000000000000000000000000000000000000000000000d8c5a17c42d6966898a04caa8deabddc88d00d45a1e69c3fff5d96ab709f9fd63e4924cff277f09d336755660334144b1f08333d1bbff0b53bf0650f86ad4624db4987771bc4e0593314162db6515b1a797790cb487b94090c2574bb44a7bd4dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5213d545740b1eee420152efd776896cbc83c605e7beca755e6ac4956f5c0e56da1967fd70074547a77d44379ae0cce2f3513f89456347155dfc985d416a50a301\", \"418e0e04c63da5594a93360f940424baa87943afe2b6ac7da03514b687d0de15ddbc8867c4be25f77029eca788b1d7a203898a129f9ed4dcca1ca2abcadf8d3ac5968aa84f17357deecc1eacf872c13f8e69bc5d941cb60a3cd008c685c2968c3d19c6a85df215b7a02232e5c5d114c885238996d35033878b2b7b44e7139ad7982dd28f89ff4e516e66f6ad133f236d7ee84f06c410a7b5dffdfa387284b5\", \"75005a20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5a8820871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936633863466ba87c1899c11f16db5b5be0b750ddadbb4e4dbf6166f79835a38c4430f887e27b668da7b3424a30decccb6d55871a4e29eee8a603d0c8f2f4fe43ed80bd6026482109028f84842e41827e2a19fb594fbebb92d759210479d260a45dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd76256e657933b8bb0a3ec931de5f3d544c0494761c33fc05af675339868669dee2fe44c250a9724efe4ef76ee53bd67b02e08dbd5226c6902177c0148ae73cfa900e42222759350e9b4c2dda999abc00ff6c2dea9524b5f9c6b9dbb7e67af10321050f369f8f4d86f2a13beef36eab6fb9986fa6476de7f6521b2f2571887ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff160f9c68214e30f2520000c0ef6d7596e0ce0d821c8b93328e13c5bba3fae013a57cb6f757a543ac0f10b44ab06156a457a3793e3736d517badbe684390a3930464395a806820194d875d016530f881a948b5b63d5aaa812ca6e6850da17e6510000000000000000000000000000000000000000000000000000000000000000d8c5a17c42d6966898a04caa8deabddc88d00d45a1e69c3fff5d96ab709f9fd63e4924cff277f09d336755660334144b1f08333d1bbff0b53bf0650f86ad4624db4987771bc4e0593314162db6515b1a797790cb487b94090c2574bb44a7bd4dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d209841a9bb6b9ed3a4954465f454a0d304ef888",
    "content": "{\"tx\": \"08a01054018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ba0100000063b897c10365303500000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac2f010000\", \"prevouts\": [\"6afa360000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_ee\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b9954da706c9e42b2a7899115a48000cce3cbff5e669fcae880e0e4b6fd2e90bbfa8d904376cf7275e35885247b8df3aa48d5b57ae307d1de4b97ed53de879b303\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9cc79cf95e40dc85c56510090eb746bffe18417404c5389872f466671721f53b43918c0b407b15c789c2190ce650362040bc4386019549c32a58a4e9246b3436ee\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d263cabcd95f3dae465820283cf9b428e89c02f6",
    "content": "{\"tx\": \"bc407aaf03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6600000000004780dadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9500000000b762a584bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfec00000000c46558bd01b5e525000000000017a914719f78084af863e000acd618ba76df97972236898718b7f726\", \"prevouts\": [\"d3706e00000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\", \"a20f210000000000225120a30b9ec0293a7d9469ba59688876e580c43929cab6dae613a98b7270f0f04b32\", \"60e3700000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6acd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363699f0be280803bd87ec3489190568883decb4ffe607bdc225a59725135347c6fe052270a8089f5fc5ef9a63e8f4df43751c17d276a547e2cd275b71d0b6242a8fd238d2decf6f7142c55252dfef824eea080278838d8f4f1f0f617cfe47b5d91029910a453e765cd82c29c3b576a90579a453f3a941b6b6175fa922e9a13196\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367a22d20941183d012c749b02b1f998abfcaf580dc1273b137a622627b312eac248aa6a6dbcb4c7060082480e3e536b464146150e8b2e96d2b5eabf2aaf1fe24e9f4d7ab890a2001a7be6cb25cf630fcd24657943ff80a7c5a11988ecbf9e80e4620a19fd562e5ef578d66d29c84f34a4223ab3b995d34ad300c7b5f252d5e140\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d27d3711e16baa8c89ff9c90b6ed0622ca86ff8e",
    "content": "{\"tx\": \"4b61cf630260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270550000000048887186bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1902000000afa4fda102cbb3790000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8728747447\", \"prevouts\": [\"5c850e000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\", \"74946d0000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93684f69dbeafcf17cb0c1d0b541de5da243f0fb8e40c7c35b0ae2476c51c78eca8bb71aa1af8b43c653f5bd4a49a6dd2a2c220faf9f7ee0d38ca763740363240a33f5a7735bc8e0f27305ca0f6b127eb0c71998afa21cfa1408dfc03edc17ac2e42ff4035580f6aad3e4d48161cfa55cd77c0146622bf63e71def681bc3cbf8a6f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93685fb25bfb3e9aa8dc2d3ba5503ee0e44a578ca0e52ee091cacf7c1e498936ff2100dfdf5c7f83af5d4cdded17045999c289d0f075ba6add5c0ed7b0f5c1761ac2ff4035580f6aad3e4d48161cfa55cd77c0146622bf63e71def681bc3cbf8a6f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d2957d9af2c85119d0e66bf643c7eb85bda86170",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b05020000000688d329dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8400000000b676ae7f03dd933f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688accc010000\", \"prevouts\": [\"1e2c230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7edc1e000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"3045022100b9c272fca46b4e4417948f9f19e148d97fbf4ece274bcbff643234569df5b9be02200f7f72f031c6899a6c004a2a49d00349521df6b8263ae8621167c081249e524882\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"3044022026a718eaeab5c1c8b610484db1b3cb9e2269f6a29e620537b6b9f926e56ede9c0220419bce0d78f032a025bd26b4a5edd1c3edf560e114416c3891423296b6f4966382\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d2c7c0da2861f14114f11766107a7b8aa6efd73b",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4000000000968b3edf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270df000000007d2befdf02b2673400000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac65020000\", \"prevouts\": [\"6a47240000000000225120363e143e65a8c3ceb9072edb61818663e66ab42c4302b81f45dac8c3551b5de2\", \"27c911000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/checksigadd3args\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"34d7b6834c098f4c242e042d63d01ab0de2affe9b53a453a926bc43cc83955893c3fdff5a67a92f7b66c5c637277bc502b0c7005f40e28ce0a33af11b1ad2d39\", \"5420871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a034685013eb12d0936a5af43ae0e5638d7148ca8da311dd51cf2e290b05ed820ba5102bbf7fbeec60e292aba2a12d06acbee3d1ff3068be768a5f8ab1c15c8b5f95428243b01e6b613d868e39a3cd6f8053f3b8a58a5b42db19ed132d0fdc37ab205f68d8ec55f68ec14e7908e46173699cdebd091fbaa00eafb7815b9069cba262853dbe467a837dbe26fc7f3ad7cd7a62e462e47b7e1bb60054913e91ba6c655d89a1acb7a851de7428c381ead1ba6d1d417e8b953e51f7c670e3863576c3b88611529e8d8ac178c50676d0c91193955b6fb062740847f08c84da5efc29fd5abdcdd61aefa92e26b138e07522d025d19d1fad7762f9c1f70685829a115613fda528b23fc9436db397402f0e7a3d49cf7a01c31cfb831fc26b2262ab8efbabef6fb95525f08c0ad7b451d163f6e35eb4e415957ac629ef0511fe91c7e5e389d906758caa877012f69cc4f32b8c78b5f62c54ebb03c94d75afc9f0e4835f9336f422423aeb19ed8c37b62b0dd1dc6be563591d9481677ce9900692950fc288a25dd19e02d4685ba017b89767b5c8376f6b66370e3202d9e807c9c5b06b99c098acfa6a9da80a755a207eb5a3ad02b1a2cff248af93ddec122a727b43b9e8dbb8b2911ad5a3c4781fcdc9458446cd8039a7a21ad2b04a0c05bedfec6a225c83df68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0075b04346e84b6bd32caf3b67b01a56918618682945ab139fe7a9442af0edca2e09652e3e4bca2a4ea235496f3e09ee13e0b38f67da65c7db6074fe5af923d0\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936116f7ad79cd980a022e493d4988dcb1c1b19360c243df8a6c0950ab23ab0c7b69a452cd9073b5f6ffa9e0ccac843a0ce980eb49f1486d2b77bb32b8a94ab6aac66d00f82bb5f2502b956f0c84a51f0e2d02681cc066da536434475c27d851b6d641b0074fcb2e108dc7caa0b55e06c8df3afe81a3ff46ed53f36d13d5f23b7704b55a70bf5793074dc8fcb95a01ffd76c6a7cb3d0a8a0bc039bbffc30b1ced991ce4b1fed6b43d58d9dac2cb7509c7d861499d5ac1d29ab5263dacec4e0c0a847572e6d828a5c45198364cb694bf803dc07555e2d22b7e9f02e8aa8fbca1012f863039c28015c411e675d5dda0e14b5c56378d6deb77e15828d0e89e693b67172ac39977b8d69cebf8dbbf0b021643d19f979fbcf2541dbe46954e2cee6fd107d88c1a48e272320e36e966c5f51d20981d7c2f219d616fffd90e68676bcf4376036134e534d46faa7f08f82a13af8ce2b56a651461eadb4a959e6ccc1a170149ce30f8ef3cfdfb2c400e7b66e7423c5c736cf055f99edd585361b210bdce8bf4614881305c12cbcb98ccd23333e30795e428d971b7425c40394bfc0ee466f4cb7363486d1e033637af9f6d28292a4f4527a2090bfcb5efca2ed9c0d63c01e16c98b35f150399876b232678a58bf83578dbb2c055ad176d56177c4ac303846e798f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d2d896106278d4a3d97f13f67d9366baca387121",
    "content": "{\"tx\": \"e9ce9d250160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bb00000000783c3be90224b51000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478741963b5a\", \"prevouts\": [\"100a130000000000225120396e1e3d37873693c049a0e141d36811f0051f76fd306cc6c1f2259368cdf0eb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09025fd87d13604b549f5c5d9101e72f91f565f9a4b09089125f17363e8d39781061a1116a7fa26a5e15153b1b04ec5c325ef1144c798d89deb6ac7146600bc8b3a85474b15a8ba9cd7bcc3a3b0f2a5b6baae3db82f029ec24b529b591db166e3a6ddacd36d3a9bfccc8cf7a7ec0013435c3be190971d30b9ef4dbbe4b78abe79e199eecbd8c64649806d99b6c767eb5302d37713de0fbd93dda07026bcd56247146764b3614dd6e04eb5dbf3f6285186046e2d7e5a86a6c94411e67f4da968d5509ce548a8cb7469271a6423add5d835ee96f11a716aca74568a0e78e6997c438df1f646128e37b76cb4e02c3ee32c6850fbec1229a0fa54ccd282d2308ed54f76b44a3c6796d137dd7cdc318f409d2b83ae0ab2b239629f84856878b201b635b3ec49b01b8fa5c3fc41da299665d628ec7e2cc9b6ae0f568f231f74bd21bd043567cee9cf15ca2a1cd2f1539ac690afbeda819e56a8b751d793a5bc3a9bebe4ede4f35e642b7ed3cf4bc4eb420e9647b3ba84280a06f00dc9e508933d5198a64ac5a0ebf1b86dbe640757e126da7db9544b2b80995daee939d796167e737aace5841e8df4b35b2c8408bf167e59b3b0a49f7ff9be3ccac313436821296cf9572d44d6c87c954fb27c311f58ba75675bdda4e75b45bc11cca69215d0e267868cfce674deeb027a58dc129a57f641db3261c65c3f4cdb948dff72eb2aaeeb0413841d86e0f50dbbca8f53d75\", \"be7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936076f7a3cf0e2f36f4ca53be6e04d67b19856e69fdea7bebc7bb759d42c5b4076ba72dfb389a6a0bb3f8b3aa7842bba2225719f72a11deb6eb959f4e6afb1e08b911ebac8c921821ba74d98d656401ec4b56b2bfe8f672693a939227457b8b1a2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d82542d2bb36816386406662a46b8b4d97949063bc4ceacd26c34c5b8b1837fee1742f54c38246db4103a3e69c48fbd67a097c91e71cf214c8a958f785a2edb60f26760bd059ff28aacd16bd665011c6ffeee89cf4ccb7bfc8417be7af78c45d77c27d953091cbdd2d9a4c74474cb9979253d8f6aeb6be4f557c74192e43ec4c2e2e10f04edbe9932cfad63a92402f70acc37a066b14e74cf3c3c909c2ecac416eaa938ab350de7f863cda2153efbd95a02a558d771bba9bc7af5ab28144648f2691a5cbbe5b2c9d2a7d43059c7f2ad6e3b75eb88598c3aa1fe32471205bd2aae7046c9336c88ee3c2cbb8eeeed9f445ba27de310466b552515afa0bb7f60eea5d75a671effe37f936052ca2730046b743f5fc00e06b38595545abab6f3cc13fd20a35b8a1276e81ec872ad459840f4a036c661650add69184e4b41dd0b5d2323d43beffe9a6f2d98d38c038c32ae46e39bd52d37113c175eb6e6cff8e7d4316338e9075f0793898cda3b190f21c2a930dae6e1d5263f1139334c1560d3c28c6c1220a311e848fe1a1a9a30b587294ca044e9c31ff190a077700c0242a468894206cc3dedf52f4af1bce4a1b99ab06e849e83e33744693e039038b3c0fae8f17f83516bcd5251f68ac124fec1c98ed5f2b5b7105f03c37bd00b97ffb210897f14b0fd4c1b6cbbd115b23a3a899803fc693864a0bdc91bf2e61d1f73ba0c3e3523498d722039635fc6375\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08271092566d000aee18de877d7d37a6499dcaa40717b87fb42c4af8a156e9c8751ba72dfb389a6a0bb3f8b3aa7842bba2225719f72a11deb6eb959f4e6afb1e08b911ebac8c921821ba74d98d656401ec4b56b2bfe8f672693a939227457b8b1a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d2e69860ee1527c081669b81f428a0dee46fe218",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49801000000f2d4614a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270130200000074abd946dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9f0000000045a6249304c5089b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acf499373c\", \"prevouts\": [\"31f4380000000000225120d7db2432b77440d39106fdcd5c35c463320f36611b8bc46e3633cb3a8d85086a\", \"83da110000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\", \"30d0520000000000225120c3b9d8e50d42de1212377aa9427da72fe17222669efe5204fac1f05c34f6e65b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_4\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c9814340c116ee7a7f1ec50a6e887138bece1466a8f41b531064e8332a1b7eb83262695b117324e414bff4b434764265606301afacf357ede632c3d610b42b85\", \"89d7bfc245dfa9a9e22885e14845f5c61e01147e5d2217537dd9fe2b405f17cc5585c6d1f45769381467a48d16b1a2bc8be8fc6e5ce47929367641c50b4c226556d9d79c6f5079c66f6456c7df6315388a740190b0c8537b49d746385ca4\", \"750020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac916920871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff298fa6498c8be80449c6afc36a9cc6fbe03f2bf753868bcdfd83742d3f15e0c78d10ea3c6f32d3a6f5838ab7302c54d32f4d174b42eebba04b42b036c92456890527c3afa4f32981023115cf41b6bd705d39dfaa189bb389c418f62feb842b8cc812709ee7ec7ce0efa87592725391608778851ec3ba1962d921196d266f2de200000000000000000000000000000000000000000000000000000000000000000f157c370629feb737ef2d30ba1dd35638c064eeda02da7f75f5160bffe3a87885d19d121f62414db00d181c72f2eb14c4eecfe1d60a440773723e87999b842bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec9cf93515a02f9b2b7efe37b1d95837e2a6ef926c49d6f6da29afa7c6cb7232e1bdf3c701a78946e2954b0acb3565b29caef7efc21248964af19ce1c4d361ec00000000000000000000000000000000000000000000000000000000000000000403628f9a3214ba76f7ef16cb06c5730ba697c8b0b763e179bc63ef34bb00050000000000000000000000000000000000000000000000000000000000000000a98a3e02ec5c0c5634b41ee3c3e12c23b713de0f661fcd232dee20dc213f1c3c0000000000000000000000000000000000000000000000000000000000000000d22369a4a09867a7725a7fb28324a06e1d01e65d400a8c67157a6db05b604a00301aa6f569e79a305215df3d29e3dcd907743777a19b753d73122be5d2387b72ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e0c7f641133840dae1ac14bd0005337334ddea87f27f48a1a73f30b4a190b43a16435e8a68a20ecf9f776cdf03f22d8b245bf1e045ed1b153062efecb4166676c916655d6688c405368c97e413d12ca8f4c621d110670e0cba4c1c017a52f035f513c5c5890afc6f149bbe95ca4db7f498ef1918b89c0abdf5f33481de97d453400db9d0d8645730bd82fc2b50d2881aaf279d99f7de05deb676cddff1820a2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc346c320acc0e0a3397584a01f82e2d8b27ca017e661ab69cc6792ed7b0328adf883c62321a29743b652800c3d6c6791d82cdc9b8810e1a18e9f1f1042d2877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16b7dc80f5921406159df5defe0d72ecc44b773d77e09cb2859d2f9cb9701a6c68103fb0c769caf135c1041cf452b40eeaed935c292b8642849d51680a3d5da2b151231b57f161fbcdded96bb19227c9a168c951c9d8ff89771d09647a09dad8b8f34d578ec5b4dab6a07ebe896e9c00f79aab289798ba5cf949bc26586bc7cecdb7cda6956865a5539e65b8f6c2ff2854ec44fe30cd77bd6b500b49188f30d50adbd6b8bb983d8484e9adec7bd3490fe0a83e625dd274a43a5effcfd26785d077644848458d41c9088e67e5eda0391198151639dc2bb89033e5d7375ea32a12fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbaba57575c43d523ff1138ef79198743692cf46496fe391288dd5ee75b8bbeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff564437900748348ebb33b2141c46774d364f2642eeea45a22e17a69ab1c35b7285d326bf8ddc71daab5f6bcdff7bc3207438351c0c4ea6d72e9f6a92732eaee57f2be15320d7dc462a9c195ca432ba61c23fda813b43253af753706f7d7f421668321843ef4d117a70e2f6f9c82cbecd61e3b09ce71b8f9c91c1c65e04dae9c0000000000000000000000000000000000000000000000000000000000000000031f33a3ba38a75fb98685b2bab94900d57c5ba843ed48c6510c3557b457c895e5fe8437ecdc202a00d480305acc32f32ea33bbb45d5cec5a20a722af35c6383b68c1188cb53955707ad5c2cbd687adb516430d30104722f2fa7ee1e58eba23a1132ac42795db81764eb54e0ba89db26c4f7dc85995964eb7d34cd624d98fa28855575ff006a8ac1b79c8925c19b0d920095744a2ed424deb3d3c84fe40774df4d2e14d7ddbe521c9411b37ba2f7438e22e5bce675d39fe94adfaa822b288528702d551bf1cdedddf37a8f88589810f91287f46eaf71d3155ea2fa4bea56dd23e3e1ec526d9e362c63c8511aa14b0b80814241468949de13c84e3dc031850ddcfe79eb89b1b8dfcebbf0e95ec19c70303c24dbd25b29f40deb9c1466fa1d968310000000000000000000000000000000000000000000000000000000000000000f06c45097ffb9b0f0ac114866ead353710f365a1c34e4bbf5c5a49d92577842ba753662187493b9caaabaaf7ca62d9165ac99ed503ffdd4b2d1f61a32b62ea00000000000000000000000000000000000000000000000000000000000000000034ec41e24a59341f115c1f82e4318ba25c658659a0f2258877842e0a77c02b99f5e6ab50d1e18c76a468d91f9cbbda8b24aec6cfb92c8943cd92dd1fc26692bf0000000000000000000000000000000000000000000000000000000000000000b1c68d20df5780a4929d0629c473803180840620aea50c6f5a6032c090836f0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41840fff3ff3e0967cc8bc2e015d06a2e5f56c8c7f9a1673dd2be5613606a19471e771d09add9e25b9b1616175eb39b4098ff55d4b86b8627e49830c45d95e5c8319eae0b2c67007be01e106fd73d306846630337f044c2408e3050c634053d0f482c95044859735b3c75ac45e635c9b06c902d57c84acc435d84f14038029246dfc1add60c42d3b0e497eecfac072a2fbfb8626315529579c09ffd4ef0fe0e35bc43f562d1208350a37d67c85b982feeae7ec97ccc93519a76088580f77aa7ae0548edd7cfa287127c98df94033cbe1d5c7f63a6f18b29f9c19861f22e9a4e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ea178be4be471ae4a0787f12a8483ed9a06b70778628ac1fba28501b3ab4caa2fb77a22b17ec8547bc2d4fa20e20467a237f9782b1659c485323a2b6f9856de1c63f3235be4f3278746d4c077615e52c67ba876f90f9b46e2f2a5bbb3d0fea4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f520de29503220f2e1803e858c15d5d9aaee9e77bd7328cbe7dd63298d1627d1e6db73c583bdcc0c7f328ba6497a4c1647a9a117d0b43ddb5ce4308807f2d6408c736a5b6db6df33e3de82b73a78a57ba411a18ae82aa5799316810d3273aa40570e58785eea61730be1d591c5e8ceee63ef656242aca204f4ef9bb699b3937d18bdccb58ddf0e508d619d9c6ce2fc94b5827eed2621412bf4eefa8b1f26cb2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022185ec5c7891d09ca9999d2e0fc762a3e71d5c64dfa7c30c1e54a255bf45c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbd47697217c8c1b98010dfa381a791d456fe8790fdc0e177cb1b4fbdfb7387cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000768e0f41cbd8a853b4805769796a87f4c4faeda97513f0caaba6c549728f6484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000119bd68aaeb576bce488adaa8410e2ae59180392711ba2ac13139d45505251cc38b76fbdfbd6748dfa5c00a880b28217e36f27d6ccc778b5cb43c2c7317b175648edb43e5fb127e41d19b073776e31125b383bd3daddc1d2af79753972ef68ee0a1f9abee5076aa5c4724795dfe5a75f2d0a3eaf86c8f1616326beb4cca4f08d21ca90171326f786f261094c4f7910cc728820bf54221d88314d847d978e23f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3439629d821490a79bccb222959a1a577fa4547fa3ed3860a35e55c08efae940ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0576521287f781dd7f45553f66fd3db3438fe16683af2a074d1b5b2e232c8c17aba1a17cc646e289a38552e4c38deea7f06fde9605879717a168fbd1750ecf9d99c6ae61b8126fcbd58d936074304c316229f0bccb99e2d00f20c86d238956f1b5d7f83fa79e0e67f9d2246f0742f8d617f9a01c5ab434e253e6f5d706046709\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c9814340c116ee7a7f1ec50a6e887138bece1466a8f41b531064e8332a1b7eb83262695b117324e414bff4b434764265606301afacf357ede632c3d610b42b85\", \"f40a1e242cce6925d9bbc80e8048354d578177047d6fab4e1fa146cf3ce53fb1968ecbaf9b24b1e6b4c243ba14ddf000be368c2f8500658934796293a26a0d6bd1b6d7df8214e14187d82644e5e05f10f1873f13a8516b97b99435bbe1\", \"750020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac916920871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e206eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff298fa6498c8be80449c6afc36a9cc6fbe03f2bf753868bcdfd83742d3f15e0c78d10ea3c6f32d3a6f5838ab7302c54d32f4d174b42eebba04b42b036c92456890527c3afa4f32981023115cf41b6bd705d39dfaa189bb389c418f62feb842b8cc812709ee7ec7ce0efa87592725391608778851ec3ba1962d921196d266f2de200000000000000000000000000000000000000000000000000000000000000000f157c370629feb737ef2d30ba1dd35638c064eeda02da7f75f5160bffe3a87885d19d121f62414db00d181c72f2eb14c4eecfe1d60a440773723e87999b842bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec9cf93515a02f9b2b7efe37b1d95837e2a6ef926c49d6f6da29afa7c6cb7232e1bdf3c701a78946e2954b0acb3565b29caef7efc21248964af19ce1c4d361ec00000000000000000000000000000000000000000000000000000000000000000403628f9a3214ba76f7ef16cb06c5730ba697c8b0b763e179bc63ef34bb00050000000000000000000000000000000000000000000000000000000000000000a98a3e02ec5c0c5634b41ee3c3e12c23b713de0f661fcd232dee20dc213f1c3c0000000000000000000000000000000000000000000000000000000000000000d22369a4a09867a7725a7fb28324a06e1d01e65d400a8c67157a6db05b604a00301aa6f569e79a305215df3d29e3dcd907743777a19b753d73122be5d2387b72ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e0c7f641133840dae1ac14bd0005337334ddea87f27f48a1a73f30b4a190b43a16435e8a68a20ecf9f776cdf03f22d8b245bf1e045ed1b153062efecb4166676c916655d6688c405368c97e413d12ca8f4c621d110670e0cba4c1c017a52f035f513c5c5890afc6f149bbe95ca4db7f498ef1918b89c0abdf5f33481de97d453400db9d0d8645730bd82fc2b50d2881aaf279d99f7de05deb676cddff1820a2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc346c320acc0e0a3397584a01f82e2d8b27ca017e661ab69cc6792ed7b0328adf883c62321a29743b652800c3d6c6791d82cdc9b8810e1a18e9f1f1042d2877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16b7dc80f5921406159df5defe0d72ecc44b773d77e09cb2859d2f9cb9701a6c68103fb0c769caf135c1041cf452b40eeaed935c292b8642849d51680a3d5da2b151231b57f161fbcdded96bb19227c9a168c951c9d8ff89771d09647a09dad8b8f34d578ec5b4dab6a07ebe896e9c00f79aab289798ba5cf949bc26586bc7cecdb7cda6956865a5539e65b8f6c2ff2854ec44fe30cd77bd6b500b49188f30d50adbd6b8bb983d8484e9adec7bd3490fe0a83e625dd274a43a5effcfd26785d077644848458d41c9088e67e5eda0391198151639dc2bb89033e5d7375ea32a12fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbaba57575c43d523ff1138ef79198743692cf46496fe391288dd5ee75b8bbeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff564437900748348ebb33b2141c46774d364f2642eeea45a22e17a69ab1c35b7285d326bf8ddc71daab5f6bcdff7bc3207438351c0c4ea6d72e9f6a92732eaee57f2be15320d7dc462a9c195ca432ba61c23fda813b43253af753706f7d7f421668321843ef4d117a70e2f6f9c82cbecd61e3b09ce71b8f9c91c1c65e04dae9c0000000000000000000000000000000000000000000000000000000000000000031f33a3ba38a75fb98685b2bab94900d57c5ba843ed48c6510c3557b457c895e5fe8437ecdc202a00d480305acc32f32ea33bbb45d5cec5a20a722af35c6383b68c1188cb53955707ad5c2cbd687adb516430d30104722f2fa7ee1e58eba23a1132ac42795db81764eb54e0ba89db26c4f7dc85995964eb7d34cd624d98fa28855575ff006a8ac1b79c8925c19b0d920095744a2ed424deb3d3c84fe40774df4d2e14d7ddbe521c9411b37ba2f7438e22e5bce675d39fe94adfaa822b288528702d551bf1cdedddf37a8f88589810f91287f46eaf71d3155ea2fa4bea56dd23e3e1ec526d9e362c63c8511aa14b0b80814241468949de13c84e3dc031850ddcfe79eb89b1b8dfcebbf0e95ec19c70303c24dbd25b29f40deb9c1466fa1d968310000000000000000000000000000000000000000000000000000000000000000f06c45097ffb9b0f0ac114866ead353710f365a1c34e4bbf5c5a49d92577842ba753662187493b9caaabaaf7ca62d9165ac99ed503ffdd4b2d1f61a32b62ea00000000000000000000000000000000000000000000000000000000000000000034ec41e24a59341f115c1f82e4318ba25c658659a0f2258877842e0a77c02b99f5e6ab50d1e18c76a468d91f9cbbda8b24aec6cfb92c8943cd92dd1fc26692bf0000000000000000000000000000000000000000000000000000000000000000b1c68d20df5780a4929d0629c473803180840620aea50c6f5a6032c090836f0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41840fff3ff3e0967cc8bc2e015d06a2e5f56c8c7f9a1673dd2be5613606a19471e771d09add9e25b9b1616175eb39b4098ff55d4b86b8627e49830c45d95e5c8319eae0b2c67007be01e106fd73d306846630337f044c2408e3050c634053d0f482c95044859735b3c75ac45e635c9b06c902d57c84acc435d84f14038029246dfc1add60c42d3b0e497eecfac072a2fbfb8626315529579c09ffd4ef0fe0e35bc43f562d1208350a37d67c85b982feeae7ec97ccc93519a76088580f77aa7ae0548edd7cfa287127c98df94033cbe1d5c7f63a6f18b29f9c19861f22e9a4e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ea178be4be471ae4a0787f12a8483ed9a06b70778628ac1fba28501b3ab4caa2fb77a22b17ec8547bc2d4fa20e20467a237f9782b1659c485323a2b6f9856de1c63f3235be4f3278746d4c077615e52c67ba876f90f9b46e2f2a5bbb3d0fea4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f520de29503220f2e1803e858c15d5d9aaee9e77bd7328cbe7dd63298d1627d1e6db73c583bdcc0c7f328ba6497a4c1647a9a117d0b43ddb5ce4308807f2d6408c736a5b6db6df33e3de82b73a78a57ba411a18ae82aa5799316810d3273aa40570e58785eea61730be1d591c5e8ceee63ef656242aca204f4ef9bb699b3937d18bdccb58ddf0e508d619d9c6ce2fc94b5827eed2621412bf4eefa8b1f26cb2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022185ec5c7891d09ca9999d2e0fc762a3e71d5c64dfa7c30c1e54a255bf45c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cbd47697217c8c1b98010dfa381a791d456fe8790fdc0e177cb1b4fbdfb7387cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000768e0f41cbd8a853b4805769796a87f4c4faeda97513f0caaba6c549728f6484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000119bd68aaeb576bce488adaa8410e2ae59180392711ba2ac13139d45505251cc38b76fbdfbd6748dfa5c00a880b28217e36f27d6ccc778b5cb43c2c7317b175648edb43e5fb127e41d19b073776e31125b383bd3daddc1d2af79753972ef68ee0a1f9abee5076aa5c4724795dfe5a75f2d0a3eaf86c8f1616326beb4cca4f08d21ca90171326f786f261094c4f7910cc728820bf54221d88314d847d978e23f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3439629d821490a79bccb222959a1a577fa4547fa3ed3860a35e55c08efae940ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0576521287f781dd7f45553f66fd3db3438fe16683af2a074d1b5b2e232c8c17aba1a17cc646e289a38552e4c38deea7f06fde9605879717a168fbd1750ecf9d99c6ae61b8126fcbd58d936074304c316229f0bccb99e2d00f20c86d238956f1b5d7f83fa79e0e67f9d2246f0742f8d617f9a01c5ab434e253e6f5d706046709\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d2f56cc722b3fc0ac3792e7c09a53592a22039af",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1601000000ce4364e8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe400000000a9dbb2eb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46000000000b49550d804b90201010000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc60416b55\", \"prevouts\": [\"b6636600000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"becd650000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\", \"4eaa370000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"287d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93676df232e5f5dbd05da99b40a2d8bb3049d7c61774161e08ff9e9412064d827f55b4ae3ee914d52223472aa57f653ca8073aef0e7910b2553778e1ae03228475361bc10490c3b13d9c4f63caefcea4aba06d3a92ca8668ebd56c703a638058ee7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936487012bffc3542e5de07889edd53e2df3ecd4fff064617ebba77d1f64b07458d780a528759e22c32b672b3582ec3b98210a6d7cdb045b8c2f36dc39043db702a61bc10490c3b13d9c4f63caefcea4aba06d3a92ca8668ebd56c703a638058ee7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d2f8f204891c46f5ba28af13b77da60a054ed30f",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700501000000f60e8805bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe501000000e6fd15b5017fe3180000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc6f000000\", \"prevouts\": [\"0eef110000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"673f660000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"367d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93682baaeffa6f4cca00281777f85149243151f0b330252f89793101ed1e71b4558293ebb87675db407435945ccb2e2a6a79ad6cc0b8e2f03768d51396c4a1768b6d4d2cf0b4a04f3dfea651ef6d0b2c4d5fffa0a14be5e227661027bf8174dd263cddd84017ed719a58f336e1892f80afe07727626533c4c78318e44c39862ffd3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93678acd166f5af146663a37ec796b256aac405c63a52b6185b9a05d94fb3f895c89a25034f4670dba2bfd8b532fe5e2c4399b1757245b955e89574c41111a3f13a78448a7537869648343bbbdc00eb4ac0785a5f2aec0111e81b0d25ebde82a92a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d33cb0c2e7c01d420f375159f3d266e71d9c3bcf",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be200000000ee786e5160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bd000000003fc93dccbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5c00000000b8e3e08703aa61a2000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a678fb6231\", \"prevouts\": [\"1b322300000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"217511000000000017a9141a56e0fb41afaf4b9e6feff1797087c69015162687\", \"f93a700000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"225e202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"755a1b2196fc9c98ce064f8d5237f4299cf20054ab4b74433647e559cd0c73c7b05c9f639d371958d478df28de23c020a099ec8c9bd52e67e377df64c336a43c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d34c8b66d9e51e1f51b9432c19d0d95ce51aa297",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3b000000009f43309c02d7c155000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acce000000\", \"prevouts\": [\"cecc5700000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"b47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367e7b268f617d00298f513ed9d959e4853656836f4da5bc24b22bcfc49034b4c690a6d927376acace3683bbc4ff9f5d15a4c9ee2ad4271a1fb38c29668c3ce61898ae4fb28ba039f9030001532aa52d54afebb8b1d186c7283d6707334cdf0cf3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8f8e322f728f7f2bda8f14cbbb71f9286e41438f49abc55856c1a694b654384417e736a60655dc533a38837433a3a305c9a2d5b0314030c91796018120c3e9a44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d35d96943b798f0362dee33b1c9dd9f5ce520bf7",
    "content": "{\"tx\": \"2cc56a15038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49a00000000ec9501e6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7b0000000043261ee960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e100000000823f43cc013ca96b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487b5010000\", \"prevouts\": [\"c1243f0000000000225120036cd49b0a5a8928de04f8e04bd3da02711fbb4d9053aeba12a20cf11cba05b5\", \"bb6f4700000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\", \"cd9e10000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bb4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936023cf8e98f7450905a417c9ac38276f00b59951e06c79e90063ed7e2000f468fba5ae8cba4ed1cb91f8a2ddbe7d0c8637ea6f49c0896515a628c3bea1aa465996ff84cb0de1f41d907799f0bb3a3d4c37b57eea0ba754203aaf5b7b2671fe888a4b6f827e9c7b2c56d61f57ac31f0aa4c5b637b7f763b3a1a4d37c3a7fd6ec38\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52bb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d513f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082d0e13bd92b8f417e9a9e83db8f63381783cc5b261abc3d56b5d515d800102f0ba4b6f827e9c7b2c56d61f57ac31f0aa4c5b637b7f763b3a1a4d37c3a7fd6ec38\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d386337a1d0705a7cc519dc2e044e51c1831c3f8",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40402000000237d988701de051b0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e760030000\", \"prevouts\": [\"fa9142000000000022512077ac2a27a93614a377debb8ffed5c2ae54185f2c1c8dd8a23e6a2ab719a18bb4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f14c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360c9deb8d7324d76c36ab4f0759c9a5c2cbf4147d65f4b6b168ab1ae532394b7618ea1dd842879684de6ce36adf7429742f60d84d7359dfb2eae76d7b546c72259feb3ebfb72e1f3a9e601929fc7eea4d0eaba4c5291f01c808279d3454a78ee1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dddc2da628ad214b987c122c871fd025273e900a2be892363e6938be42c4976bbb0b9e3baaec320f7de46eda77f4fdd2cda08039a1867e75a703bfdee0f4ff6d1cafc3da456d473afb79353f7068dc1822b24dbf9d7eaef6a0c8c9b611b05e979feb3ebfb72e1f3a9e601929fc7eea4d0eaba4c5291f01c808279d3454a78ee1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d3918bf85a56fd7561082f401a5ebd4a0d642f87",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3e01000000cfab0487bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6c000000006aa54fd6047c69d500000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc797000000\", \"prevouts\": [\"a7a25a0000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"970b7d00000000002251203792436bc7394fc8cacb2bd2cdac9c86871063933d86113811cf92ac8fb26226\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100874bdd6a54f7eecc10b3f521b6b54e8e8134fbfcd1cb0244af35dcd6f1cf732002207142edf17de35f94e887a1b036a1e51fb330ca7c615c9a631cdd757c5983df4331\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"30440220445d2691f1bfa7e9b0a01ee23c2ca35cd3ac20a513713f2c3a51d8302b156d550220276e86b3b5305e923b840e592f750473aea52a88dafc8bbbedbb0177beb60f7f31\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d3abb997507d97ede96a2ca419dd8554e22db558",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b930100000044a29d078bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40600000000ce8be267bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffd000000004601938b033b82dc0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac33000000\", \"prevouts\": [\"0ba127000000000017a914e014b0ed75ce4306970c9f63e88b08a5a7bb4d0f87\", \"44813e0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"691a790000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_7a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"86dbadf3e40b21343798c676aef44eebedf45a74500ea8d1fcbfeb9286d15b65b93e769bf19d3a5f0fcd437299d33ca1965375f35daacee8ffc72dec3a354a4e03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"59029869f5fdd96afc76b79c39335738d11ac3ad9b10962d9914c5114cb5a70272a9c248e2027abc2223d7f9f60fb80e2db357ccc02d410a4da700d05db083a57a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d3ad578f5f3076aa52c4e35e8a0002582433fef9",
    "content": "{\"tx\": \"8346c76302bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfec0100000049bf40cebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd201000000179187ab04897dd9000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7961d3c802a\", \"prevouts\": [\"952770000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\", \"18786b0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5125e7936dacf44c2cc5542287b329619dfaa06ef235a847d66c9c2df863225da6d11737bfd86c40bc108767f37b7ad1553e96cd0852cc5d3aae7d4d5919ea2951\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c5794b22775b9246017f02a30576904e360f7f30d7ba69e42da1f949da49f647a6a38b8d39a057b5d03cc3fb1c5a8fc6fbbf2afa69d215fd7d0ba06cabd825c0959bd9b34bb85690c892593228383c48f2c7a3855b4947a3dd1708d13c567655d4436d921361743dde8d98d3cfa724f09037452104a82644e108bdf9bf6fbb39\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d3ae88e79c1801c2da2ca48244ec5455bb3abe76",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127047000000008b866bc6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c94010000009b039ae9048b395c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8740000000\", \"prevouts\": [\"aed50f00000000002251204f95e2d0ca6e5ead217b338fd8f5ed161ed18d9deb82c1fc7cc39fccfd04e4d9\", \"414e4f000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1135140675f37d3c6ffc244808cf22673ce324d5ba1e34c99f7d0972c5ac012a46873018117c319506164013bcdec2d285df0b840d64f5a35ebdb06eb3e2afdaba9431f387a803f7df77af21560d586d92c96180a56916d6b7efaaea6f10ba4ca\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936863bd85e5c9e012d214e27cb7267ffbbead239b623635de7a566ce4333f17723135140675f37d3c6ffc244808cf22673ce324d5ba1e34c99f7d0972c5ac012a46873018117c319506164013bcdec2d285df0b840d64f5a35ebdb06eb3e2afdaba9431f387a803f7df77af21560d586d92c96180a56916d6b7efaaea6f10ba4ca\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d3d3e2a151a062b9f319dd5ba2d382d38c8c95d4",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706600000000263fbb6adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1a00000000cebe71a7030bb62e00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87d5afd460\", \"prevouts\": [\"9659110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bd0c1f00000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_3d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"691ab130c457e109ed5ac51ed10f812a9def72df45dd4cddaa769e1b77962f1eb6482c848efb32b473a27a3cdbe10b12291f65448ad793146652d83c464ebb3b83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"060bf7550f4b508dd272f5b422b20197e949ad8ba93243e176c2e2fc1280a5482479d97a4a1a7205321c25e75dfceacda3881ad016cfe75edb6218ea8c3fad043d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d3e5ffbc18b1ff4b1db6426ef3962f8c9cf5cdf0",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8700000000f0211ceebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5d000000001eb9ae8703257e82000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac66000000\", \"prevouts\": [\"c04021000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"9df262000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090210639343de065849c855ae8c35c35d79666934225ad4176929280fd7d98de7d372da64f016d53ac645ec6eb2bb75041ab3ec31c104cc4d99203ffdf062685ed6047cd592a11d2e622fafdc2dd6a77c0d1d4f4849cd64f7cd456c33496b0ed86274bc23fffc29d5bc5eb3bb4d491cce1b737152dfc7d88ba95efed373bcd5325e7288266e179365ccc3ad401afb7089ab0d2f9ec4f562a45a5a308bb7f2ce3288f12d1408a727e16a6a0629768b45aea534dcc09fc52a4b3a9e0bb25a0291c71f1968e5b539192d61e09fd93d40bb37144fd393a25e12538bf836a8a8d79f36d5e4b273368aff7a486ec0543fd1ddc52884ed8d3441606a690fe1ce7ccbba7604ce66294c27250667d04077a534ffe15e47ddae3d32dfc45a9f7ba1a75ec88e1cb45ebc8738fe4049e47642fd85194ee3aa6a713c090fea5a54fb883bdf5b87b13474066eda7cf7cdf4fdd5199c2bced7cb779014b30a523729d5c0e9d8343527454e865fd0ac63c8f364c80a4e34eedf8084cd345faa202fe3dfa706987e561fa8df2e85f8198897e55afe5d24edd4f6361b0bfa88b0fc7fe65006f39007d5b0d4cf0c13c736a9aef097e2f052bb26b4b760539274e8787ad5d50b7e16d76e700aeb721c72b0801e40cb8d77a2c41404351be65c9b3a32d39faa18ab39633ddac0f28a12ea956276a91c87b87df1f8182f8835d355a9c7984d327b17cd603dc9edb98b9aa13cacc7bd75f0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b2f0292c5c10d160f8e0745cc9e7b1222beed517475d04a852f0f3c02abb361f19b5b66a7e788d7f4d892aefa7b705b94e6e3402f32316550d3b683ba5e55fe37e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902cc289225ce3c228894dbc80760454c1aeb27ad26e34631ef9e5f5006fe1e9fea33a4b4e5814879a1a0a060b229b12b1b9688b5c2c3744a22c22cadbeeb24ca29aa1670e923050051c67fbd806989a2a0b7dc39906531482a883ee4f58b606ea15194ad3d6b9d716a0f9b17c2cd54d8af1ffc51838f5c8b0145ffd143cd960b52152d0601eeea04418de957e6a3c1b2590b0584393a603abea7311af32bb9bf624fc452c2bb45dd66c507642dbc2362fb9b3f621bb724818ad55725f8b05b775f44cb93520607a349d1fdc5f83325346b253c636c8e1f1efb76d3dd395c2f37811729de74581eac32afb07e8addd6c73738582ac425b011e1bde8526d3b354a6aaf81a428fd9f1e67dd5136f77a766f86aebd11ad1b56dcc6991a2a22ac08fd225eccd44e58feff6f1a6bb536558784130054fb6ab8f8a4e49bde6fd30ebff43c103c6a2b16cc9c375f212fbfcf87cf5dcc9558236290610ce5f8f1722c3696c00c5069ea9e970f8c10fe4562a7ca3f63e2e78870ae04e27af40b0675c9eceb4b663b24e46678f6c269838a0847d58a1cdf102166f91519f04b378d09373302cfab575e5aced5f0b0b121edd74d5867d603abb1d81ed95cbcd31c19928711b394e4eae0208d75108a37f6604fef20f3f258d6f3ec0997ac7ffc6a64125fb8a9ba290ff89d34996c78dfa5bd93a1af4e00f01362ffd90eaf1a7c28d31784811282bc710e4e059497ac297561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93683df6dc1d6178033e3954d6b2c194a6e795ec7ec27bf3469af38305b38a5a5488e2168769c1e98187b117731eccdce651c542044ebcbbccf53ba5dcae5773e361c2a3c32f2d98482ccc0ae7bd6919d8eb72134d3589ab943a0402c8a931ea420419704ddfd13dc63b1b4156372563d65f148a89e112fdd9cbf47f8afee5da0a9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d411fdd25ef73e64648572aee57803f358cf4bb2",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be0000000005fe3e49860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702500000000186ba9b004a336300000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7962a2a795b\", \"prevouts\": [\"614222000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\", \"3766100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_46\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6fc0b4ac26fa3c0981daf6fa30ebba83cf50713a53d9dbcd77ce663c555eebef82090c1b56db0ff1eb33c794c88ed3f4260ef4fd53cbab5d1f2da3206a3de3bb01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ff3ab9773206ffebd944eb847f3c56694d96b1a40b4c2a57349a3619cd1b7aae3e274c6bee07372a37f39750bc5112fae080a6a7edf4ec4407374a6b83d214ad46\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d4208a5824d1318820b3784412f424db595f35ae",
    "content": "{\"tx\": \"ea9513f50360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e500000000325a22e960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127099010000008f727e8160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b0010000007ad921c20200f131000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e789000000\", \"prevouts\": [\"e680120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"519e10000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\", \"67ba1000000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"807d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffc1f73e1ef7cb741aed576361a28c4d25cbb42ec9d623905630c989b808b3539bb3dc44e72947935649b33aa2d807ea07560e0c2333a7ee2c40c2820b24a64a090cbfbdc5dfcad7ff4463f3cf2898b3c754f5d70a369d7bdece79053e0da647\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0826d3ed6bb397f900bca42f5c55206e9e9a5556fe68666fe0d64ebb28af9dc03c732beddb8df376ed0f15f8ca557ca4fa4dab9ea34398a6bb2b3d4cd5dda00bcea090cbfbdc5dfcad7ff4463f3cf2898b3c754f5d70a369d7bdece79053e0da647\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d42eec126dd7b1e4c2c574ddba68f4d0228c3d09",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bec00000000078c47fcbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd5010000001a65b428042cf0a00000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478710020000\", \"prevouts\": [\"f72520000000000022512084127e09a3e5abb8e6ea0ba3ce4737d1c2349f1be422ff5ce1609ab9b3fbb01d\", \"497283000000000017a914269f407e1403e9e55237bbaed7146c0fbc0fe6c987\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"225a202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"0d7022bf110305446ee518fb05f21aa2c432c46510d8a42becdc0afd12f93f2cfb5f82bfd89a4fe0b1ef89cc4b055d78fb203e3916e76b238691a99fa328e0c3\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d48d445fdf8825eb982e112320fe51da22271d30",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700d020000005955ac21bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1301000000b41584b4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b35000000009f42a30602486899000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c5b9435a\", \"prevouts\": [\"ac30110000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\", \"f49e6700000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"7202230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"4c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ef724f53fccbc5998418268712ec4a55c070b8ba5ae4e04e2685482dbecadeb1c847bb38ebdfc0ac99f7b57f94cb3711bd799e3f024c53d691ca5d12dd06ff53bd30287fa60720c35e6546eaa391bbb3975ba5e1722a6124c426d678e7f784bd9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936870a6298af9b4a910f0552eb873b8943700e6bf1d8a778048c3563dd43b31778e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e891faf9d665bb151ea32d070ad80c7b31483dfb68e75e940e326e177970210d6f819d45740b1e9d6e416a8a4978331345395bf058ef0b936b66c7755017d83c65\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d49f2424f7e47981e92cdca8a120fad3b5b46351",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6d00000000774e8a9b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b1010000006be7d4170139141c000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8744020000\", \"prevouts\": [\"c81348000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"e5dd3700000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e6\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e11f8d24c2756f16b9efc524121d49339a04fd56a536f956352850ed4d5018a4abf7205f064a536655663faab66bf2e716758d251376e4a55710082b6d7272244791bbc3b31bcff977684854464ae3dc2a24522286fe393648b51abc79cc246ff8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f70487ae4384611f908618191b61bece567637059dee67ecc200d57fcc06025825f2fc2293577bab1371dd996050d2a4e8a01eb34ee2db6c09974277461b3e6691bbc3b31bcff977684854464ae3dc2a24522286fe393648b51abc79cc246ff8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d4a61c1883d529642358ce1ad476eae28f347140",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbe0000000064ec2af8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce201000000970d9888023a6b9c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4874e000000\", \"prevouts\": [\"24ae4d0000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\", \"a8e9500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_62\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9cc731e5a9cf904d607e62059bd6a4db7527a21a15bfe90786abc0161cd84599b93326922432c10ed41c9764636d932a9a71ec02d3d2071c7fbab46d4bfac0c503\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2093a8dfd613b52c54e91ec6c58232b496c823ceb1598cf5a44404d6abaaca163568efc88cd1ade61ca458bfc780954c410d9955431d285d88f2b3d34ad7baf062\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d4b2d30318741bf9642c79ca255322762ff5a669",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6f01000000928f47ca60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c1010000000276321b048f28600000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc1683433c\", \"prevouts\": [\"d36254000000000022512055d32a9b44ee6fb3a2a0e7e2d6444c6afa4ce43aaa0c5357064383c70ed0d31b\", \"3f930e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936257a75f8119edf70e3bd862f4b5d9d4a02f47e43cb7a52febdf672916561824f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a76616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d4bdc84c656fc906c865b5369626edd1bc0d575d",
    "content": "{\"tx\": \"f558c58603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b980000000056c18ef4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2401000000aee696e48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42a01000000869aac980117bc3d00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acdb518220\", \"prevouts\": [\"e140210000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"49c88100000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\", \"8e2839000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/invalid_cs_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313dbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d79a506e698c3db808d28f100485c98af4a3b06242b45dda2258d5655cfebb6700ca51d9e4cd4938233267c1edf81ec1568cbd923f0071d6ce79a27fb98b93ce\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac91\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313dbdf1030dff2ec7c5788ba50ec11394c7b78eb3f2b816626023d6daa3a2572114c8faadd8f5d0204cf52c57e4d5fdb2eaa5d356938be1ba736d0df22531309921\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d4bfa057df6de164cf5907d1054f7b8f37dc55ca",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7d00000000bdb388de8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42302000000684f888f0147fd2300000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5ac08453\", \"prevouts\": [\"109027000000000017a91468f63610c45a6790781558e4d5ce83e16e8f3f3b87\", \"d6aa3a000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_mis_83\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1dfc303e1378c5b9638d5df1ab09ea73422f921a0aed50d9e94c1a02e70d05165f0cb1a872baabd755d0358941dcc25e9c7a0ff6012c7d1b795707462c88507902\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d30e78f6ab0993b1b0fefa7dec7acc92beefaeed95046194370a16d669347ae5370213671c42b238db5e28413f8683324567f89469f214ed143499de21d0529783\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d4d9f5cbd1cf9b75c9821d5d4746491e46efecb0",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd3000000002c5cd68504874a25000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487f1b85c37\", \"prevouts\": [\"5160270000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f34c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364b47e9b9572a2fdbea0003eeba5c6c5df8476b78e561177a43bb360ce14ca93ec9fc6c767d5aa72b6a61d813f4dedd67fc97d91e71acf86e276ab6f41d1da0fa8c03caa221836b2e776996c8fa4c69c403af6889ee9c99c5c1fa82cf4b3a1b61\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52f3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e199aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4e05de1aec4dcfd94364dc697d2506f2d3dcb95f0b1cd2734b3ed6d289f30b19a3cace0aa47e1a0afcba116b3dffe01d164ab3e15a9a2b15599aaabc05c638667\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d4eb08a9f93ac1b16665f4266fcd570b760e0b41",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbf000000007c50ca91bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf94000000002da740f8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0101000000229667af01daee3f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963a040000\", \"prevouts\": [\"27a64c000000000017a9146db815d9819f256ca5d1e70b15558a98689cc52e87\", \"24147c000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"aff2740000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"f0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082dc2f05b59194cbdf87848463e1c2c1324ea07adf35e05c7c9d5f4b3dae1cf3a20eb43d08761fb76661299d0344fd2d8bfc7de5e7c6dc622156e95971f4b8396db5b66a7e788d7f4d892aefa7b705b94e6e3402f32316550d3b683ba5e55fe37e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367ba371f3d414732c1c9e15a0164c634559da48866c534aa79174298bfda3b2aedc2f05b59194cbdf87848463e1c2c1324ea07adf35e05c7c9d5f4b3dae1cf3a20eb43d08761fb76661299d0344fd2d8bfc7de5e7c6dc622156e95971f4b8396db5b66a7e788d7f4d892aefa7b705b94e6e3402f32316550d3b683ba5e55fe37e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d4f11edc0601915ee85baffdd4721b1d1b3b60d0",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e10000000064472c8d0459df38000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4872a000000\", \"prevouts\": [\"67e63b000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"657d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364a310fc6f479979a5eb932d4070c1430d885228cf96926ff0d6233d323e177b97a9921914746f344d752c7034b32810721c9853c38c376ca018a4c3c5bab65757fdb01d6ca2155f5be7a678ca6a1e1d0c436995e81f878ed9c74997cf4fccddd302781454c6297f6b8a579760f4d591c0acf84ff9d038b064bbab8a5d53835db\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936991fbe960c4d007c38cd214187495a17c7b10e613ea03451dbfa2e0ceb38b03138fd10ac28b4a0ae18793cce60e7e7ebbedf1e3488ce0551c956bc9cf517ba032bc2c7d802e8c870cc0fefcfae9d23d316cca1682651be3bf62b663d5ddaa443\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d4f65e281be1feebd4750e113b05138a9c44f486",
    "content": "{\"tx\": \"dc9f3d8802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf46010000009ae647c88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44901000000ed7e76b5043306b500000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8725000000\", \"prevouts\": [\"89a97b000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\", \"5f003b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"47304402206af2a4432a634af2be9cf92ef05597f05a5d0c402c81b5dfba0ffddd0ce68a4602205008d3965ee05d5e162deed3002a5eda9c09718ca5a1f34c0ca8e684cf6c6d282f434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402205ccf0e4f051da6faff455f471d7cb21d060a81bd9a4406cc2cb3ff894fa9068f022059adec1278f732b0be7311e822dc67933a5a5350167c8d2758886b96422e08c52f434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d5048f880c8259302815a101c17c687a6ddbb1d7",
    "content": "{\"tx\": \"359812e802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7201000000f61b3eff8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47f00000000acc258aa01c7a31a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88accb010000\", \"prevouts\": [\"d21d2400000000002251204aa7ef3c48fcabcb6102b9295fbd3d8d5e51a18011383dd7b1650a23dcb19459\", \"fe98330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_2\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"32c7f223ac8967cba1691441ddd5b520404e6bd0586c612deabf23d031d91a443085d6cce769ac9734b9b8ba4128f6a337aed4173615dbc876bf4a4f948d7dda\", \"b7f6d3cb3c4aa862ef0f0af5a93791c84b9a4f79d873c58aa1f1b9a6fa74644b2137b1affe0fa2bec0e58e50e8e427ff90a092721f35d350b955c467a028b3fd94233ee19770485f1a219d09698a976352e3d4e59d9f7739131d03b71909a098d709482d9201058335a4c65496a9cb45811afebc0e074f5330fc7cf19b719a74c3f3\", \"4cdc9f84ed1706b60db6f8353f94ee36918be19e7397219203e68b81eeee7727728614d8be75a911849e2d27cfd2444c8bd030a51fddd8ba2817bab96ff90891530b70e677806ab2fc53710551e6818c80e4d1c7e3f964bb94112a4ffc7fb8cba5cf5186358ba4561f6b9530426ba8bf9d2edf6f6d5c8aa9480138f624d76d0794a97fc5c98ee71d9ed4372184b95bb954a76c0e60e519c35fb52f66aae5f32ae797ed91ab8cf26978dc5f05136945bfcec85d0f05013c62d122f4ed5ec87498a05acf741efafecf643b2f56879f8be6fa13cc42087889815b078a6081de6d29dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b325051646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a888b001aa38ca4f81f28c348a28e97928d44bd2c2abf7fc923a6982caca431730e2fae8262ecb686a2c0d0b0d7956dde278299606acbcf55eb63db970af7c026559bbe2fbb3ee1b794a568864bae20cc54681e521994968a26f53c0b9047b1df7c5842cca2c5b35e4f143ef350328511c82fdc94d887b021b126a7f63f6eba1219890701613affcb7f92686256a960a6e542bad4487e0f11507ff102da8494efba0e17d9549ec2a5df5da3da78510b4a393c87d28646fd879356f5c36a863575a62101539f29fa2237caf606916095c2facae2e89a1f9a90aa10e855b6dd2e843dd5152050bde1b0e57aaae0d2e237805329ac7ac8a97ce21055a714b651db1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b51b359a9dac5d197ab79419c16a4ab0bd46b8b627fb9c6a515c02b9ea364bea061db9590375c6fa034185521fa93c3738906f28c37ae3b14a830f37a77332c2294f905f6f7fc94a2257e6e30b8e9521a4b96bce7cc6d2e71ba2935d7385e6e0bba479f1cbf6e111aa8e290b91c6252136611d1c70947ee0df00a6830d16d5e29f45db4e1660090530903145de1823c587b88fc33ddbd58861f782171956a3c4a9752b34d80250f27c4f5300249446d1d296c12a0deb46986727cf4f8a4b8f30000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebc4dc6bf140432997c194cdd67857c8587a7e76ed4bd63e8babbb53fbbba0ec53c42f9004e9b0cb5ff998c6279de68d16a8683d19f391af0a230431b39e907869112349cb6c79929ea35acc94f2efae6ccf162076d698f158369121387744ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f46cc218f0a250008da1f30776fea2b77f14055783fffefdb1ff34e74a73f675c8cda47bf66ce13290e0f054d23a1b57fea18685da4f43cca95c40b98b98c941f088b7f15b556fe17bd3de64e86eaf19aa9f40e6f1613d0f3f72e0bc519a650356c9ffc9cd375ffc62dabd5f28de7c7e401c5af46327ca92921753dca3a175a61871bd24dedb950762a2b74aa1ef62aadcf270bc64ba18ec6479a50f7273b1038fb81667be79a2d0044bc6b38ed1df424e3d08f00986eaedf8db9a0cb413bbd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000135e9a6ceada7813b3002f4f251c5724687e3edb62caab37ad7794a7b2e317922dc678efff966a67e49699749288c22d68c9683c8fd7929d265b9474902cd79dc5f4aa8f9ac2d9b99ce2009d49cad0c4a2f89298b4df2303437444ee49c645850000000000000000000000000000000000000000000000000000000000000000ab3dc1b4cc112a7e80c80274c91d249d1e9bffd2252e25112522a6372a3bd6b01839137a43de2932be810f3e03c1a128c369bc85b7c9df253c31446ca2c1ef3040a25a00a887a56ae01f798570b8dece82dffef1eed19bbe49fb48d4c42286112e068ab65c13eda692e3fb2096a0e880ad71c6174edd855fd39ceab37bf8e8efb2fb7f90b786ec9996e01ac6656567cc82d2ca0b9bb04c2f60d4ebfa4c7ca1c454849be350fc11e221571b7983906fc1b212ce398fa81e1aead15cc4fa5a2757bbdccd1d8ce9190883ce9da885acbf3f5722562bb4e524d492798055c63521c20000000000000000000000000000000000000000000000000000000000000000603a9c46007d94ed32805f706394426ae8697d8deb5803a09ff0e82a8f3e7a210000000000000000000000000000000000000000000000000000000000000000aaa2c5c52ccae92631a5af34aa3c38ae0b25f991e86a99572d36a6ddcf2415acf780d638505eb8ad331ef26db2712a0232aeb4f211016fe4b629ae9aa9de04180d867bce0bf602461f7d40b314c8d0d63a4fe769f8b92fc1f5445ae1ee6b94b56ff1b7e7d94538031710c3401ebdd2a1a3ec976382579482b7e9f403c1af1dbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff74248f05ecb92be6b918266dd25e9542bdac05bed733e3b5dfd0150921ddcbc6636a335b68c02027991377ea8b23b1c00b1068b14d50a461bd4737c3b6f5fc663496d6915942c9826b255926030095b4b4a2f9ed5c2460e8c007ee4b311ae4e1d9984f176f32915b66363a142811b933bc191a02409497ccca80fc13dbc750bfbfab6232e52109e8513c1f2f26eed770f84beb853e9d20caa032c59180a76f06fd83b812b978864749e6c8ea721ef7f44a188035ab3943b43f5b2784459e28e10000000000000000000000000000000000000000000000000000000000000000e4577a5de16b3fa88f0bf818340f27f202e8c88260a11fc2ad76bb76f17ddf34ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81ee5aaa5a4ca5f929aff24c7ea434335a3f8f103b02bbb5bffbc49c01076c08da75c3c36fe1beefba884e996a7abd95993cced2e5cfe401a3e00bcd8ef577650a37766312c8614df2ada6c45e2d320b8d7a45e25084f162faad41984ec81ed03a5db47d122ab4312c4e56410f2a242a770fe834e4c519b500344a9e01c30dc74661e9dc30ba59e103040919946cf31cae17353ec21d89138e527bf669dfb000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6012aacabaf14046dad28434109856202eaa8534e380e796a479b37473870f07a74cd2f13aec3346b552f07009dce101d630c6026ebab6901bde58db017b2321f8890fa3315cb1a251c51fee105129d2cee6f1c65e5f86164c752899776e48395b981e0fb6d795b741aede21d193b9242074932b4d9fdd28e8a1731b67658e215954a4dae80e4cb2b1476bb2b862457c49070f367c8f481ba90ab6d08f8f1bfdce993630eacf3addb6686d885184bac046c555702f40ef207faebd154c03523d1b9d67349b47e8f0adf808cd6a116759226ef2767e8115b8bed5794a15e4dae84ef977bc823dfcb17095c38010c14ed1230a1e355d9c8ee4cbdfbb49db252e6c7529d8dae43548a0fed6e93730af5756b7a53d1138c48735a53341dd5b954da394e879341a6e6a4f8b05d184e238340649c481955527911d5bae9d4c11f499fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000b56ecf6f51fa16adb2a6a6753909944dc19eaabe9174db67570dfb07cef263d85de64cc08c3efee4fe5f48c3fb88bbce7f5158ac7729240e2abad48ade8157c7b7863a4ceb1e8a7f9619724f03742d8632e3e563943004cd8ca7b6cfcdae593317f52a56961a13d1d425f12a7fd246347b01a744fc526a3bb8f71ff27667d32e0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000e7655e3fb09734ff7e305818f2ff67018017317c6b43f6df3b46b13ae189abfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb95aa3a37cff9fafa2eff8edeb9afeef1abd6423388e4132b8b4330200412724c2c59374e4ce8664e9c6380fcd7ffe1ab595bc06f0dd83302c1b30e2263225d50000000000000000000000000000000000000000000000000000000000000000c8b94f83818a376911b8f2a136cea4f86f7139f994375170d20b97ed1c853f66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4670b9b748b210a86cc2f2b1444680692b3bf4a3acf0d4fa958989e1ca1d34eec267afd1bb5f98c113bfb1b3a162fd54e413f7ab2dbb52d18428ba704a11c4bc83abb92039ddae21bbeeb271ca6c9de459f8996c433ecf34220619c3923ab53a0000000000000000000000000000000000000000000000000000000000000000cf6f0bf7ea92ec1083bf86998d9810c7ca9e221ed7fac97055379c9ac9a45ad7ea385f129019a1d8c0238a75abe0ec20820b7c3e10c3a672b2b964ebdde8b7e50000000000000000000000000000000000000000000000000000000000000000db03c8da878ee56228e0f2c23e7503073e63e33b82902ce15014d673079e0a1c00000000000000000000000000000000000000000000000000000000000000007bb5edb3223212d4c5b74bc419f4af7e65eb6b19c8935896fcbe82b1afb5dc9dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7163e7d847d570da354f75e2c4fe5a2b8f6949b3968698af9532b7d642789054a53b1e86b07369fef041cf59e9ed38e257bd80fc10a32f8bcc35e000e63845509487c7ec7791be4181c662529bd3fcd9477db17059fde5f7f867aa46b69540c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6b99882291313ebd54f327c6fd86607d5f66d51011e570ef7b5a7edc18ade0f36470b73d195d01c88cc1dbc98a19badd4ce4802653f5495c5c8c79c87e0cb601d6c05f501075ead8dc1610cbdb77edd5fafc1197d7141e57ad239a5aa3dd34c70734efc5367420aac2d4358ef038fbe53fa6ffdf3456ba8dc2c94fc44f9d73f0000000000000000000000000000000000000000000000000000000000000000d7424680efb589544e95d57f84e5b9f08394b6b1d0679da58e8e58c596770a3bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"32c7f223ac8967cba1691441ddd5b520404e6bd0586c612deabf23d031d91a443085d6cce769ac9734b9b8ba4128f6a337aed4173615dbc876bf4a4f948d7dda\", \"e6f4758c5558d3f74d88a980acac6aa59fa4a039bd6154aad55ad34fd1aa23d3681e188df17a1ed625615ef86075db0063f237dee5a87a9d704acffce449d7d10d06f5ce816b85c5223f9c03154f66bc26b7de2f19cb301c263ed58a002bafbce8fdf489175b65c8c0238fbe32a872120fa3f17b0bd9ea86f346f928d51f1a9d26\", \"4cdc9f84ed1706b60db6f8353f94ee36918be19e7397219203e68b81eeee7727728614d8be75a911849e2d27cfd2444c8bd030a51fddd8ba2817bab96ff90891530b70e677806ab2fc53710551e6818c80e4d1c7e3f964bb94112a4ffc7fb8cba5cf5186358ba4561f6b9530426ba8bf9d2edf6f6d5c8aa9480138f624d76d0794a97fc5c98ee71d9ed4372184b95bb954a76c0e60e519c35fb52f66aae5f32ae797ed91ab8cf26978dc5f05136945bfcec85d0f05013c62d122f4ed5ec87498a05acf741efafecf643b2f56879f8be6fa13cc42087889815b078a6081de6d29dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b325051646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a888b001aa38ca4f81f28c348a28e97928d44bd2c2abf7fc923a6982caca431730e2fae8262ecb686a2c0d0b0d7956dde278299606acbcf55eb63db970af7c026559bbe2fbb3ee1b794a568864bae20cc54681e521994968a26f53c0b9047b1df7c5842cca2c5b35e4f143ef350328511c82fdc94d887b021b126a7f63f6eba1219890701613affcb7f92686256a960a6e542bad4487e0f11507ff102da8494efba0e17d9549ec2a5df5da3da78510b4a393c87d28646fd879356f5c36a863575a62101539f29fa2237caf606916095c2facae2e89a1f9a90aa10e855b6dd2e843dd5152050bde1b0e57aaae0d2e237805329ac7ac8a97ce21055a714b651db1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b51b359a9dac5d197ab79419c16a4ab0bd46b8b627fb9c6a515c02b9ea364bea061db9590375c6fa034185521fa93c3738906f28c37ae3b14a830f37a77332c2294f905f6f7fc94a2257e6e30b8e9521a4b96bce7cc6d2e71ba2935d7385e6e0bba479f1cbf6e111aa8e290b91c6252136611d1c70947ee0df00a6830d16d5e29f45db4e1660090530903145de1823c587b88fc33ddbd58861f782171956a3c4a9752b34d80250f27c4f5300249446d1d296c12a0deb46986727cf4f8a4b8f30000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebc4dc6bf140432997c194cdd67857c8587a7e76ed4bd63e8babbb53fbbba0ec53c42f9004e9b0cb5ff998c6279de68d16a8683d19f391af0a230431b39e907869112349cb6c79929ea35acc94f2efae6ccf162076d698f158369121387744ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f46cc218f0a250008da1f30776fea2b77f14055783fffefdb1ff34e74a73f675c8cda47bf66ce13290e0f054d23a1b57fea18685da4f43cca95c40b98b98c941f088b7f15b556fe17bd3de64e86eaf19aa9f40e6f1613d0f3f72e0bc519a650356c9ffc9cd375ffc62dabd5f28de7c7e401c5af46327ca92921753dca3a175a61871bd24dedb950762a2b74aa1ef62aadcf270bc64ba18ec6479a50f7273b1038fb81667be79a2d0044bc6b38ed1df424e3d08f00986eaedf8db9a0cb413bbd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000135e9a6ceada7813b3002f4f251c5724687e3edb62caab37ad7794a7b2e317922dc678efff966a67e49699749288c22d68c9683c8fd7929d265b9474902cd79dc5f4aa8f9ac2d9b99ce2009d49cad0c4a2f89298b4df2303437444ee49c645850000000000000000000000000000000000000000000000000000000000000000ab3dc1b4cc112a7e80c80274c91d249d1e9bffd2252e25112522a6372a3bd6b01839137a43de2932be810f3e03c1a128c369bc85b7c9df253c31446ca2c1ef3040a25a00a887a56ae01f798570b8dece82dffef1eed19bbe49fb48d4c42286112e068ab65c13eda692e3fb2096a0e880ad71c6174edd855fd39ceab37bf8e8efb2fb7f90b786ec9996e01ac6656567cc82d2ca0b9bb04c2f60d4ebfa4c7ca1c454849be350fc11e221571b7983906fc1b212ce398fa81e1aead15cc4fa5a2757bbdccd1d8ce9190883ce9da885acbf3f5722562bb4e524d492798055c63521c20000000000000000000000000000000000000000000000000000000000000000603a9c46007d94ed32805f706394426ae8697d8deb5803a09ff0e82a8f3e7a210000000000000000000000000000000000000000000000000000000000000000aaa2c5c52ccae92631a5af34aa3c38ae0b25f991e86a99572d36a6ddcf2415acf780d638505eb8ad331ef26db2712a0232aeb4f211016fe4b629ae9aa9de04180d867bce0bf602461f7d40b314c8d0d63a4fe769f8b92fc1f5445ae1ee6b94b56ff1b7e7d94538031710c3401ebdd2a1a3ec976382579482b7e9f403c1af1dbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff74248f05ecb92be6b918266dd25e9542bdac05bed733e3b5dfd0150921ddcbc6636a335b68c02027991377ea8b23b1c00b1068b14d50a461bd4737c3b6f5fc663496d6915942c9826b255926030095b4b4a2f9ed5c2460e8c007ee4b311ae4e1d9984f176f32915b66363a142811b933bc191a02409497ccca80fc13dbc750bfbfab6232e52109e8513c1f2f26eed770f84beb853e9d20caa032c59180a76f06fd83b812b978864749e6c8ea721ef7f44a188035ab3943b43f5b2784459e28e10000000000000000000000000000000000000000000000000000000000000000e4577a5de16b3fa88f0bf818340f27f202e8c88260a11fc2ad76bb76f17ddf34ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81ee5aaa5a4ca5f929aff24c7ea434335a3f8f103b02bbb5bffbc49c01076c08da75c3c36fe1beefba884e996a7abd95993cced2e5cfe401a3e00bcd8ef577650a37766312c8614df2ada6c45e2d320b8d7a45e25084f162faad41984ec81ed03a5db47d122ab4312c4e56410f2a242a770fe834e4c519b500344a9e01c30dc74661e9dc30ba59e103040919946cf31cae17353ec21d89138e527bf669dfb000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6012aacabaf14046dad28434109856202eaa8534e380e796a479b37473870f07a74cd2f13aec3346b552f07009dce101d630c6026ebab6901bde58db017b2321f8890fa3315cb1a251c51fee105129d2cee6f1c65e5f86164c752899776e48395b981e0fb6d795b741aede21d193b9242074932b4d9fdd28e8a1731b67658e215954a4dae80e4cb2b1476bb2b862457c49070f367c8f481ba90ab6d08f8f1bfdce993630eacf3addb6686d885184bac046c555702f40ef207faebd154c03523d1b9d67349b47e8f0adf808cd6a116759226ef2767e8115b8bed5794a15e4dae84ef977bc823dfcb17095c38010c14ed1230a1e355d9c8ee4cbdfbb49db252e6c7529d8dae43548a0fed6e93730af5756b7a53d1138c48735a53341dd5b954da394e879341a6e6a4f8b05d184e238340649c481955527911d5bae9d4c11f499fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000b56ecf6f51fa16adb2a6a6753909944dc19eaabe9174db67570dfb07cef263d85de64cc08c3efee4fe5f48c3fb88bbce7f5158ac7729240e2abad48ade8157c7b7863a4ceb1e8a7f9619724f03742d8632e3e563943004cd8ca7b6cfcdae593317f52a56961a13d1d425f12a7fd246347b01a744fc526a3bb8f71ff27667d32e0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000e7655e3fb09734ff7e305818f2ff67018017317c6b43f6df3b46b13ae189abfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb95aa3a37cff9fafa2eff8edeb9afeef1abd6423388e4132b8b4330200412724c2c59374e4ce8664e9c6380fcd7ffe1ab595bc06f0dd83302c1b30e2263225d50000000000000000000000000000000000000000000000000000000000000000c8b94f83818a376911b8f2a136cea4f86f7139f994375170d20b97ed1c853f66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4670b9b748b210a86cc2f2b1444680692b3bf4a3acf0d4fa958989e1ca1d34eec267afd1bb5f98c113bfb1b3a162fd54e413f7ab2dbb52d18428ba704a11c4bc83abb92039ddae21bbeeb271ca6c9de459f8996c433ecf34220619c3923ab53a0000000000000000000000000000000000000000000000000000000000000000cf6f0bf7ea92ec1083bf86998d9810c7ca9e221ed7fac97055379c9ac9a45ad7ea385f129019a1d8c0238a75abe0ec20820b7c3e10c3a672b2b964ebdde8b7e50000000000000000000000000000000000000000000000000000000000000000db03c8da878ee56228e0f2c23e7503073e63e33b82902ce15014d673079e0a1c00000000000000000000000000000000000000000000000000000000000000007bb5edb3223212d4c5b74bc419f4af7e65eb6b19c8935896fcbe82b1afb5dc9dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7163e7d847d570da354f75e2c4fe5a2b8f6949b3968698af9532b7d642789054a53b1e86b07369fef041cf59e9ed38e257bd80fc10a32f8bcc35e000e63845509487c7ec7791be4181c662529bd3fcd9477db17059fde5f7f867aa46b69540c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6b99882291313ebd54f327c6fd86607d5f66d51011e570ef7b5a7edc18ade0f36470b73d195d01c88cc1dbc98a19badd4ce4802653f5495c5c8c79c87e0cb601d6c05f501075ead8dc1610cbdb77edd5fafc1197d7141e57ad239a5aa3dd34c70734efc5367420aac2d4358ef038fbe53fa6ffdf3456ba8dc2c94fc44f9d73f0000000000000000000000000000000000000000000000000000000000000000d7424680efb589544e95d57f84e5b9f08394b6b1d0679da58e8e58c596770a3bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d52e561715cddf6ccf811873e1d9570a5b25b677",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40e00000000fb7b46b8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb201000000c6e24f480102291f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac1932c947\", \"prevouts\": [\"d42f3f000000000017a914a2a8d85df2f20a0aaff7224012fc4cee13e29cb987\", \"219e2000000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"215f1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"bc4b90593b05b9ff449ee11caef0798fd71c32a36f41a3420bae79279e38d3afe6d7923e8cbd990636b3822461c6070222735fccc1a811b2a51da486ff0995a8\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d5466e451d61467e6bd45f66d7608457be8a656f",
    "content": "{\"tx\": \"f4b07dcb0160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704601000000e99584ee02b3830f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d9000000\", \"prevouts\": [\"d773110000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090284f49978384c0b3541a853e003fb71b78619282c1d6eff5ef6c525c5380db9adbb77c600a840e08da90cf963bd3eccf4cd71788e11abb8e72ff5eb20e5e2b7ad4d81be200e5f909d2668b06941be5bf4af139aea8e31f371cea837ef2a13b9e207bccbc3a500195cda61e82681b1aff50f9a9316782024d1961c67ef137759fda284117cc43477f213f1850b114cc8f1cabe8cb618a024ddb1425a250f2127b27e4fc0df67994e36260c59f5aebd9cb9881fd03e1bf6ab86f3b9b5f6cbc80d70439aac8ab95fbf6ffd7ee910079a20a88d170b7082f03aaadbc2bd43e34e6541a760f1e76a2c3dcdba2ddbb09f24be651c78e2ccdef22bb12147b52ea8a21fa4349ad806187d1c5b2b372a232d6b1e7dc671ba1fefb06dacc47a961c39c5b3691de0d291a4c17f9968bf2de5485f559dfc563a7879914c195fd0de37410471c2d5be4ce5505badb18993e84c14a4f8d73e917535224747dd9f3803c298b84f79e5f9b0e7f64c3c1e86ffea8fbfbde25ed1ec8a4e19336e7dd389454c681a378b01b854d039605e7f63ecfbd3b639fcbb612d7ca5444bd968b9e6009522d42bea240d1069e1976d0ac035a8c0a5f45799fcef2339e8ab73ac569601fb4bf47ef25c8d0a9f77051a9de52facab241c2d878aa14e2615285268f514e4a6c713bb60befa3a32f73c1f6c0e8322860ae221e33ad4271ebc7a61c70dcfff8b47c74e1127c8d5636e9708713f75\", \"f07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367f19d13d85523b75ce99e37b4eb76b07a29c0c5af0a35faf8d29e39dbe1f5f9646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fadf7eb609cf6b5925737ad21e523a1c8cc87f95ebe19353e64c9623e085aa5557f88c7bee1bb9c109f1c6365501285b6447b8ae029d34f47d1dd1efc50e8947b4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022d172730b6b54f775690086a5f8940eab41849bf10cdc8b09b523a205515cb8f5c373c27f89f293b7d7ee790ab0b974c69c331aad40832b0b5104aea50a70bbe7de3a844c6aa52384febb0e293ea7991a9f7e170fdc81c01eec25e1342f18753370a42f4f025d781297df195da3b790d57d2492a8b7d3dadbd94d734dd054a35b095a68a028b3e9f46aa6e173dfa771e4dff1ef780d48eeea15f07d6ec11d8661ac90a682e295e793983c0471b3a293e76a6031464edea06a0f5a85f94a53c576dc1a7344bc2a6c2c1d59625195e5cb0e84db47944164fd65e579ec1836868e7f143f19638cecd3bcec05194c5071448153d34c74225b9feb0bbdccf8376ca0b3a8daf0a2f52082d5044e8fafadbd1516225d6497ea78f7ddb0eb7d29cd7eb090f9ef7ef8c7cd479806dba02bb28d0ce6e5b660dea77dfbea4650c7501f6d3f55cb16339118b9ea7b8ecfc1cc26f73c1ada541debe7ce764c1e735fe4fb9f3b49591e55e73a606df3c0e043b5edc10afb0ef51467d88061fb1a9ae1097f438c8f2007d5a40467a80430ba299224ade766b05b4f39d763be2c2df1105f1c98da5d3cca51b44aed31aabde4d470ed63345101d43302710478236906e9faa255fc5adc14760ac0fa64a26bb07434d70669ac66c9832d65bce8cd31e332c5340b9c0434e70ad12de2b149cfa6d8ba712325fa8eec50a0deaced60e575e77bc9e7f909a2b448b29220175f475\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ef410cc536787f5b60ec7eff151035c62e0db5c59dc9e94e3d527a7bd7513d4346c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fadf7eb609cf6b5925737ad21e523a1c8cc87f95ebe19353e64c9623e085aa5557f88c7bee1bb9c109f1c6365501285b6447b8ae029d34f47d1dd1efc50e8947b4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d54c6961bb95000149d7cffd738f1f34eaf1d825",
    "content": "{\"tx\": \"fea3974303bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfaf00000000f2daa1b1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7200000000c374aebcdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb2000000006b51dbf6012250b200000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac38d83e24\", \"prevouts\": [\"447672000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\", \"be8e1f0000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\", \"cbfa2300000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"7e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365b6bfb69b7e814fcb4dcebe676c838c8fffdff04b3ac333f34250baee888dfa2fbc41b165d26ac180ad5b5d4c7fd11b6e5ed18084ae5d6505f3de45d58844c1cfa5d068ae686a8bb1ac9947127542ac866077ad522de57cab26ce701d52bc951\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a63a87ae51c747f55e6919561fc04ebff87ed8246314dc037503ca155d679649d3fb5b8f7b3afa290146b30788656a8f4c2497a65b1555cd50f1d702ddc8a1f8f2e4a14a40b0acbe20218e44481fe6660f01d2e0cf04e3bc8d4452bacd1080d1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d54fe454199d96dd8e1ab2d0069417d2b9be7cf7",
    "content": "{\"tx\": \"cc88653202bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf07020000004b0446fa60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ce0100000099320c9c03335573000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898713000000\", \"prevouts\": [\"3517640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"07b7110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_b9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"15d07b0cc069d30a8ec13eb5c3c23f4c5fa614b462e80e9480e9551ed27212168ea433cd0db8ffa10084f62cdb4e67b4d3c21720c72835959de1e43326e6999f81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"880ddc33cdc662b931bf97f18c063e2f8df2da245148308449957d439fb044f1c2c701efe5d3276d655f0e8aa551d5d3d70f0d2626268afaafbcab0008d594feb9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d573fa9122441a358ecf4c86ea6af4d26e08d93a",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd50000000053f403cadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8c0000000080e6db55bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0b010000007bfc680003fe5216010000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc79aa1c358\", \"prevouts\": [\"f266720000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\", \"bdf22300000000002251203d5ffb7cd06f5c84b56ec9f73ff7cc3a22b38565d229330748f260d30800c008\", \"acc68100000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"6b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364ef05760570d2f55d281475192af611d2decac15c2ab8d6f0b8da16f9770487605976fe26432a41f3547171b2b9abb696d7de0172bd15211267873326056804912e839b87dc613c826a9c62085431a96f79b8782d4b0fe31dfc75aede09e250a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e85c9148ab8fb2f0e3b60c30486bc2998c5a9fcff153a4260746061263c245b36a70886d9e3726a9aa8a2b94454683b5181a970edd894e0d0cd75aad09f75436b2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d5892cc02088b2b7e11febc39b2d7cd9ed96fec6",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5400000000ddaec8968bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d5010000003ef568afdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4900000000daee1d6e0386b1db0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac56000000\", \"prevouts\": [\"92bf790000000000235b212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"309640000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\", \"c96623000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100fd9c26e725eb72c96d343a30ab0919a8743718b5e3ad9a96ae960c31b7fe7e77022017e309e156ba3fcaa65d37f96b761bee39809bf4c421eabdf0700e9ede7db76603232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402207af5bda9ff36368566c85a1f78801dd8928199f1f991d03264ca8ec4b0bc8fde02204842a3ef83ddb802ad5759a6030c209ed1dc46e39747dd7eb8bd72e2299c2d6903232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d58b0cd6e4cd0f7d08d8c5cd8f64fb89bc6c77b3",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf81010000007d91abc060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700400000000377d028060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270550100000075c420dc03d8f996000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4876c030000\", \"prevouts\": [\"daf6740000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"cd0112000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\", \"923912000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_82\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"03e0d56738bd29832c858290db3feb3b1326ac63c3da9b37b60a4cb140dda9706426e80fceef3247cc89534ff2e81ee92c37bf0ba70b09f0358dd3766536aa9482\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fb98395126ae6c08fa5a8441642dd48a958a78e183cd269e3d717016044bf62c13b399cd45a8b42e2087bab912a0c9782346b1111688101a4867635d2b593cf582\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d5ad81a47205ca9893336dfcc66e370ee84776ce",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e400000000e43d3005dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdb01000000dc21dcf7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1000000000413109ca01c445280000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fca4000000\", \"prevouts\": [\"00ca0e000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"3c28250000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"bb275b00000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8d4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368b6d963912b4b21c343ab35d829758acd38b20aa323c58d3577851a32d8d38189886f85ebb300297009aa959255e1f8e976b091c7e06b33477ed400c40a83b4c185c953dbf0a33402e724bbb72e47d874a897a0941d53d9706dc82e2e14efc19f43de7556260bd81909ce9fa765818ab5d5ff32210a0a876b048ce5ffdf4a21f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c528d\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936945f49fdec6cb7878f2e144d67bd9f1df9c3c82417cbc22aa6b753f3ef0a3b346a7569334f57ff848fadca8fed75a3aad007c69b24557dd271b830b96d574d63f2f7628d981d9c0428415dafbd1cc169dd3ce50060f3002d6f03fa895459568af43de7556260bd81909ce9fa765818ab5d5ff32210a0a876b048ce5ffdf4a21f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d5f073d2ccb1d4bc1f4bb2d64971cda535f3abc4",
    "content": "{\"tx\": \"956ac78c02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd3010000000bede5d6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbd01000000dd0c1e9303c6f18f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79631010000\", \"prevouts\": [\"3db3220000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\", \"db25700000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090220181b368ae9d7b686eee6a548d44d6bdcc9fe30a6de125b97673e7d821100af65ecf3a24e1cbf57b13b489afbd03c380b95b725d75afc24ef9216a1d3152497fd62f20f2199f0b6cef32c93b993f120feb97cbde5df1640daaa84adccf4c1f8be4fb14ff684684d5b94cd21a968c49fa17358bd3f59fed0ac33240b0380e3d65efaaf40dc851fa06a6807dbf7acb44fe9417f5ef5b46a81299ecfcb87a81d79a36581cfa6617c1fc9e11fab50263e241e065dd60501497f31a03ebf94b3d7c57025ea7858101bcca00b9e0c8885c29e42f9b4773d424a61023af6ac20e7a312042cc9d2b6d72102f1c0b8358320b58f3e8c75910ef5a30b1aebe3752a89a8d2613d7ba29ce2dfca380aa57e25576a9e3de5e4c608fc58340287460bb14dca4caa953b7fa0b4783b270665975bb33bb4afea36e1509fb2c5c4bc870b344aafa5f36bfdf768f68679ed2aea606febe613e055a7357f4f0f3fefc740b676439b75ed699596f3a183339d2e44cd21339b6002e71407188d72f56a3273f524eb50a8044b6f08c567124def6bd60e40102cb2aca69d1082e654dd39b1ac31b69ffb5e10005ef25be97fc5f5de9a5974a9c3bb52255e6117e6d68bb92c97179367e86bbbf3875c7c0826f8e74ccbbfab3f0c834ef8e3c86538083fe16b28c3f44c23223d710b7a771722b80610b8d17fd9db89819e8f3740fc3f6e8bf323358f3f3ff12210d4c6a18a40dbcb75\", \"2c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93651437a197bbb5be4a199519bf1e4665ed1db87a2684648cfccecc1d7537eb154da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ef5981cd58c469d4842aa56f101a76a4447dba55ab7a128197943d7701f95f2823b7ec1fb3aca1c665feb629f75b86bc6796ed5eb830658d68574ea157b89fde9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902aade6f58f8b7d35ae1fda73390c7bc5965e4ebc9672f1e606845ee10806f002d94a96e12df5082f218e7baf227819dfcec4d27037e3c3392e82161e13aa9ba496538c773f503a94d7708b61ebe0f38000fb23a2220fc199a6b6b56ae8999dad05fb0eacaf4c3141da64bf2be7ffa24ed4986a26c1c8de433e5125cca967112adb967f3a1b9f3c4b1017683599fd0d9c94def03d9c12873437defb7db0c60db96686794d88ad96572d05fcf57255dea02e071319a3666efb14632a8fb2329a2e7fe20fe1c8ee77ec2298dc5e573d5fdac59cd8a26ac05b987c47ec8f57364cd3208b7efd35f8ea7746819fc0b164ec561d410b5e12d34102f38b067664b2af3efcbc25013e35aa61c7ac4443eb6680af87d844fa91736070045b5435279651002c0e829528383fef6a57a1dde5423eb94e1b41bb07d2065c9ec411f0bd1eddea2184e9b886e4e39c696da976834e2a98ee84e0f57252d58ec28d28b46dcdf4d5dda3ad185e6fc19af7758435fd3d5107a46ab726811d8babef37e3968243480fad3fe9524aaa61ae983e2a0e73061900731d534630644a62abbae72a64044d3d55659b6995dbb07681afeab530cf18d30617a9d1418ef86a91984388e9707ca3626416cc5b6d1afda0045f684e1d9a0e4eb11feb73d52c37d1902c34141b2944be315375ae2d705f2e7eb183be3fa3f8bb12d9ed2ea546f64315b961d9b855f31b922d4d74ed5f4b9aa75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082872b08559f184ac3ac9956d54e492d7f98285a254bf010e00b63b6bbe75054353b7ec1fb3aca1c665feb629f75b86bc6796ed5eb830658d68574ea157b89fde9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d60ddd04ef59ce7655ce0640bb9f05a050c50572",
    "content": "{\"tx\": \"1d7233850360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708c010000004c7f1e8bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf76000000001971cdc460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706001000000c78a86e4027ef68b0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f877bbf5d2b\", \"prevouts\": [\"4e1e0e0000000000225120c45578f833be1999146583d65d32aef269809cb1ed8bbdb950ed204b8b0de0ff\", \"19636d0000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"a6081300000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a6865d40cf942811304c2da2a26fa22b20d7be7d75ad42e96fecbb30c380f98d0d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3f2a2968b4ea0558d79f1ec3cd2b8a530982c6b5ad0be17180e93d11bc09903133cace0aa47e1a0afcba116b3dffe01d164ab3e15a9a2b15599aaabc05c638667\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045a6e9c603f7f99515daebfc2839154302ca67407333b540c062b355b85f19a07ff2a2968b4ea0558d79f1ec3cd2b8a530982c6b5ad0be17180e93d11bc09903133cace0aa47e1a0afcba116b3dffe01d164ab3e15a9a2b15599aaabc05c638667\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d6114c41966cf276af2ac91a43b0dcfdde3ff6ec",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4001000000f6f17dea60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701902000000d12b24b1025b3564000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787911ee449\", \"prevouts\": [\"6b4456000000000017a914269f407e1403e9e55237bbaed7146c0fbc0fe6c987\", \"b6a71000000000002251201649567eb00a0fbdde29b894a99c9dfb586a4dcbbedf9e66ed23f8b13544bc3c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"225a202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"996a028585cad8e678304597bd54ce9798c74f6462b9feefb83c1e89c082f298852c39340930c5dcc9f33fbc63ae68f778283660b365deb431d667da2f8da5c5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d64045b67fe7d9bbac6b1955c9709dc8f62c2574",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca8000000009decf0f060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127016000000008d9b95b7029da96d00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac87195644\", \"prevouts\": [\"6d105e000000000017a914ca8d66b8079fd8386ff3ae1d10b869f5605e693b87\", \"404511000000000022512011543fb5006d5ad7e809c5c2abb17f794bc49d4d5bd86d23c4ceb0e33576d3ec\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"1651142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"951bebd424233f0904c77bd753db297cb4475b0567ee71cf6bedaca2ce86b58e9fdd40fc2a73908e92929fcddc80d5e9cd4516b87b9ba6e66634baf24db55102\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d65a0ff7ac01950da5c822d87cd1f1b94663c71f",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2a0000000037452ca28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ca000000003ed3dc9a0168c22d0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fca639323d\", \"prevouts\": [\"1e6c240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"06ca36000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_57\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"17c01d2ff743f9966af357e3451f00a8fa83cdb2de6f1ee41ab22e4d1b86e5eb00833d2ab3b114006fa03e1caf9671f267949345f4209e3b993a05690397994482\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d6fa3e12cc67ee12b147999b55629328538f6b6653a824d66ac3ddcf288321aacf8841c9d76cc92fe19dec3633cfb0f829195429852d9357c80482474b1e8b7f57\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d66bdc15b3bc47537708b688679685d7823933ec",
    "content": "{\"tx\": \"c3d0c9e202bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf390000000058e04188bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfba00000000df72ae8d014799bf00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acf6020000\", \"prevouts\": [\"18f26900000000002251200f726ea607d510d2ad25fd6aa0b3aa5046595182e7375298ea583ba69075a433\", \"51817b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_28\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1a78064d35d88fb109a98f8de6282d7909a6656b6f6df24d2e8dfd5f00ad80db8503d49cdf084b5d6bb23f1b0d7fdff85b9d09bc1603cc797f66c9d03e02a0ef82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5d1ac27c784be09b0899437baf038c3371b483a8b88ca09d7edc6413f1db830b82c16690ef04e1c208c7ba0ac6cdf86725c9ec6fa639aada8eeb572e7ab8d4fb28\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d6a9e0d913d7e024afc093007237124f4a34364c",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a700000000d7649d888bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41b020000005bb521d202828c7d0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787ef020000\", \"prevouts\": [\"68bc400000000000225120fd6d9780dc4cf57c79720b9d63f8d64d8d63d8ff447ddced8591f521343270ca\", \"10fa3e0000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00638368\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1a7f496087fdd0464c266da8b16ca4acd01559ec68405b54c53e2b4568db5223db0bdfd7fd43775a37ae3e20c8f8514aca25517db969733cf8d9f690f9b6d8ea23f980255362d30444bd4a09dfd60422f4fe5b70b7cde78729ca8cd52cb50aace\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93650ad14178052915368d31081c43d3a6fa89eb4eda43da202390c5f626134fc598e881bd6493e98dc576a1c76b7dda488b188d283086ec2219562e3f5b97e3fb63f980255362d30444bd4a09dfd60422f4fe5b70b7cde78729ca8cd52cb50aace\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d6bb41e59dad21fc3ff2d5bb0c784b27307ee4d3",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6d00000000c3f473d5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf60000000080c431b7017add220000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796f31d0d46\", \"prevouts\": [\"61587600000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\", \"76ed4f0000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e148eb929e36bf5d0ae927afe6ca96e40c19e477115e42779571d6d91d45ed5d842c4c20f1fedac94edf4ee37dcf580edabb0aa4839378386ec3447d53f529f2ea2726256ae6b84713fc66a1300a8292dc92aa88ab82f645f24355049764a6c4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936724f9d0df23615753016e7eb8d62571c0b8a17dd151f7df09f79bc44b2e134251de3578bd50e4aef3f42172206e28aaa53f32c3941b8b4ddcf806814652917426187254dcadbfeb5c8509faa2902470872e97e8359524e33e4df3f76314d708e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d6e668abcd05531d83ec0bdff606bec2368882a8",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127085000000006a1e55d2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd30100000063e1818f049b9e8f00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478706bd7426\", \"prevouts\": [\"4a4a0e0000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\", \"868a830000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ef4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fbdd38c28c61f1b7a6e8ceb22fbafcfb9b20df7a8d7411fb9f5b9067992d68d9921261d9825d6464319e11fb6c7a9f7c01f613629293fb1fa80574c155a587736c6fa26e4842a5ec51b34186b71f91671a7cf578e5677dc1f65db5fd4f943bbd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821645f371c8079005f8f776d501e78f2a21020e20da39870ba1dbf85c4a15b7eacc28207c7af5a37f80d9c7bda068b6f89abe5b5cf72eaf80ed3e31c2f1c9dfaa6c6fa26e4842a5ec51b34186b71f91671a7cf578e5677dc1f65db5fd4f943bbd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d6e9b28f9645fdf80b2547f4a875bc298680a83f",
    "content": "{\"tx\": \"971ef45d02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0e01000000bea1139a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127071010000003f3d64ce026c8d91000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac6b0faa40\", \"prevouts\": [\"a3c78400000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"88c10e0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/empty_csv\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"73936867cbc752d6d5e918c808ef94d2b30a081fc0afbac71aeaede820c61f1f11edc6ac869e18b547305f11ddc0cbaf702ade19a9fabd35a044b883ddf20f23\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313ddd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bd74920921194c3fc66d38202825db8e721d0743d3d0e753f82fd9a2f6e54313ddd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d70c950a9b6157fdddbd8eb01fed07f12638844f",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fb010000009399fa4e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c300000000bad4681203ed4f4b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3cb80434\", \"prevouts\": [\"c70b100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"38fe3d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_19\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c3f4e2739cfee480f6ce6755af8338ea541ce1cd0f6ac85f766a96f7c3bb5754771260a7145a087bff6e91d1e8f665c3c9c5dd3586375643896565f93b09be2d03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d34fb7972d268a6402aa623cd67a508390eca4d74388630af9a0ea472db609338a03ce2e47cea6044ebd34ecb4ec2a8c5b2215a5c0000bc9ee43f062b36e627019\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d71a3d01673ec097d7272cd0fcf4fc12f19a90e8",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cee00000000168bbd8bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5e010000006458ed8f0459b6b50000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a607030000\", \"prevouts\": [\"7ea84f00000000001658142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"3dc468000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"304402202fe46beaee17fb95603445977dc6d53128815ceba0f497af5fe350f08100b10b0220258c6c4336316098609c532976678a9be7902bfdd66f3de0f486b163ae25f0c6b4\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"3045022100b5d13b2d25ebb0103c87080c4d506c47742f160549632a71ce11621c880d174902205d1d676eedda2b53d88c32d26353b79db0ce9f65e853b368d4def62572c227bfb4\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d72363609fde245d8d04d59c1d9e2386e97f61ec",
    "content": "{\"tx\": \"b8a0e6aa02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7401000000992304cfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b58010000007f10f6d10409577100000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7abce484b\", \"prevouts\": [\"81ea510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"74d5210000000000215b1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_7e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"72e42b800386932a5c1253e07f7d7b49da9ac834ad3a47c835ffa87c2508691f7bf7a5cd0cd5626c428c2c57e2b676ba33ec961cd3282f6e600750a5df670cea83\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"01c0bfbc0cb79388da00eeb21138d5db21dcaef99fe5dd2af7f9b3d063f3770e016fcc32cbc341cff4c9d3d6aeea9c2da9491d0405ceaf83815e0361bc0b51347e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d73e808e6fe07bbd4cac3998bbd227cb333f3860",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb600000000b0eabc15bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe500000000b52cf8660410c1a200000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47874be99750\", \"prevouts\": [\"4bbb220000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"61aa810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ee\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e11ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900453225856dd898bc2835af0cd8c351393955c132e627f28271e91b4e6043d8131340899fd8696dac9e3afc960f0a100b615a3c324ed3a125e98af98336f748ba56\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362f8c1bb9e22d4bd0c89749bc52dae3cca8ec48a5f1e8dfdaa19896840c71bd601ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900453225856dd898bc2835af0cd8c351393955c132e627f28271e91b4e6043d8131340899fd8696dac9e3afc960f0a100b615a3c324ed3a125e98af98336f748ba56\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d7435dd29bb609d8a757deda3c46bae9522fafb0",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8d01000000117807cebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0d01000000ea8fb1ec02e7b0ce0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898749102860\", \"prevouts\": [\"7bdc65000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\", \"e5246b00000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"48304502210092a855718f24f2886aa3d91e0f75399fbe051333c27010ad6e4507836b56535502204b63cba97b2b03a57551a44a74d9f5134282cf638e44735be1b5edce8149d1ee02232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4730440220262f9e4d589ead27052d908d18769296c446c083c082f3f763e12ff25fb9d75602206e2eb3c67773345306ae4ed2a1d42774a40e2dabc2c2acf0a1ae01226dca153c02232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d747c65611d3195e76faeea3dbaca70f0255d690",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfac0000000017ce8cabdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5f01000000fb96d0ee013f6e34000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787bcab301f\", \"prevouts\": [\"18dd840000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4a3e5a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_17\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"526f44df0ce6e752ac2884b0626b8e7a7f0084f7c024c112c8e0ca4c80cee249cea4426a37dc15a8b4ed5e7cf6440df0ab0e76c58b0f9b7a32135cde3fef077f82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bf4aa0341f2ca2f234bbe493e34014b9b9b485dad45bb34748e352c6afbfc2ac14b16023b240bc1702e8f37fc40ad3ae0de9b01e4bbebee967fd48f87c0dcba317\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d7482427db68b72ab957e74167dbc8c28842b070",
    "content": "{\"tx\": \"ea6657fb02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7c000000006ca5e1b2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c82010000009c4ddacd0182ae3b000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487178c3054\", \"prevouts\": [\"08b54b000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"d0105400000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6abb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366b3e5a0f5e9e7b51fd9351e97ab2875ce03ea25b7f50ee6c9dfbf583fc643f52ba5ae8cba4ed1cb91f8a2ddbe7d0c8637ea6f49c0896515a628c3bea1aa465996ff84cb0de1f41d907799f0bb3a3d4c37b57eea0ba754203aaf5b7b2671fe888a4b6f827e9c7b2c56d61f57ac31f0aa4c5b637b7f763b3a1a4d37c3a7fd6ec38\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361e30f0a1ba0bac296285a8eeb76649cc75d9671ad0bf9d85d254b2b980baede83f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082d0e13bd92b8f417e9a9e83db8f63381783cc5b261abc3d56b5d515d800102f0ba4b6f827e9c7b2c56d61f57ac31f0aa4c5b637b7f763b3a1a4d37c3a7fd6ec38\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d7491a450345ac8fd8bd2da583d6974224917a83",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c21000000006dfe2883dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc201000000b98404e201166f0a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a627f75b52\", \"prevouts\": [\"6cbb5b0000000000225120d767e62fcc8e1bdc4b74e073e2be32f51425a180d82e9ffb428311c4083f028f\", \"dcc01e000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d5777eda6ae5c204d690125e9653b41f5769ac9c6851370f10250a6b2ccac04ea2e4b018ae467cd9e863b5163b939197444cc55447de8b2a8f3873419df9a4569ba9145594a303a5de701ee272913bbdbdf833a16e266529740eba3398a826c4475381071377a904a3ab61e5bcdb977b8678744db0e4e43e9c798254dd628b4760105c23156fd1782b11888d55d8ceaba6e0ad858e98aa76f2b99916ad1542e3abc774ef2c9ae78b994dfdfe5cf95aeab76f0ffae9fba9c9141d0cb6726431a9c49c274462ebd1ad944b974966f14004f3285dfe51a242b73def7cece22c6a6642ed45196c98e53e403e074c47e5818f196cbb925d73ef54372edd2a34cafb8930d878eeb01e0cf9afe66cf2b67c0c5996d8692b7dcb6735aeacbad052570f29707cbc3051a8942b75a7bc478116fc67d99645aa5d96b210d6388f1eed11b8a512a559d326fe6e47e33f732eb68374a09d7ee85afa7f75eed7b5317da716d76979cbe3eb93b96366603b0d4b0acfad56a1662731cfa070d400b3f775ea595bf4d21f8e66ec48de8ea1a86b42b78d5d87e838d7b86ef4fb830f3edfc2506cb9ab4d466fae8e8da46716ca15d34afede50f374b22d59793f67ad361721a34f382ecb3024fc10c0d8c404509025aa759b34fa5950337f5571be7b59cb570b2a8f0f18b61864f42c4e91c546ed4ed23827cc32ee879820bea642d9c295d68c0ec8342e94da1d5cab92bbeb758e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93696c72109085338a697f752fc7c68dd136f18d7357ab421c630a98b1ec147d871b7a2231cf916c441aa882850e5209a465c1bf953237149df21eb7dcd7136fa198d550033184c6424688af85d43f5bf525b7f6d8111e731f6e2359cae2801b117ed4b6001a8fdeaa28275cc8a939e32dd3c3fbbfbba5c677bbce429d0c1a1675d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090296865444c72a6d3120f5231f82ef03374c3d40310f2bd583b251ba8b90a2594086cfa677d21b49a5f37209dff62a16f1ec505260d9c77e6285877315b6a49908a7e97feaaaeee4268a1f0a7209e1dfe6d76154dc287215c40b05357d3d370048dca2114bf69b69661cbd0e15cd662221679d6f513dcf4e27cf6e81f6a4be1a146e0ecf7faf2c73e0464b9769b122a81450a8ff7bf928454a2d9af812711387ced726142455b36b6ecf69c44ad108e716f767c50012930359f8e78440b3fbd7f1f35f70d1120b440649358a9f512eb8ee80adc0a97818e8153db4dbac2d38ee803fa7a47f36be979039484bfe98b550d7111cb7a8a6c4d4c3559f3c8e6707bbfd96c1ed4011e7ce14fd29b42202f1ce9696867318cbe460538c246af18a23ec56427fb9e44a0686db068cc7c086d3bfbde2983e594beffa36af4b1a1c3e84f250a488f75e7b71b61a3ba5c66a3fbaccaf2ed96680efa1add34daa7cb53b6180e93565d3ebdd08ed4fe6886a6206540f87e2abdad1248cd61e3536ac24aed9dc7238c530b0094fa0d4b793557e0035cbfdbb59b5daf1cd19bef17d05c9b943d555222ce4c899ceac0ad7662e0670dd909606615ffdfe811e2e54236522ae1c9e631fa8179330482ed448d67cb7c94f16fe24031d835ce7dfdd35b5ed75e24ee6ad87dab103daaccb1ae515e0e9b5704ad035e5140f71ce78875274df9a609ff5aeba5cd40faadcbf757f7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368956bfaa7088a8d3f86f6b7188e51d428c43bfe63f671887027ad947d21b21d5dbab9fd6af1020d04f0143fc46ba56c091000bcdda14289cb5d3981fd1d5b5a654f33cd0b31c9bc4dfcaccd89caa263c020d1b70f58e7e0e884ce19a773d6b5f30b2981ae69232c3f6c5ff759e9ad4102f31f3fc5e7a3a4ffd34dce2e2e06026\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d750ca1379d7933d2b0750e621fad549663516ca",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6e000000008740a6c30102fd1e0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcec030000\", \"prevouts\": [\"bc6524000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"47304402205cf4684ac9f00685c2dd185c79138189aece15e2bb9b0453df083311130e940e022068495053305437fd97c5460375b32b7116dc177cb4b61e261382d3646c36cc2582434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100def79fa8580f7bd10e0714593f232c9a681e9fed41a16e50eba6419d96dd75d1022048ffc8eed8b18c2d5360cf808a969c4b485569d73778e6b5b8b728ded2843ce182434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d762cef9eb8735ca5282dea549336970c32f0470",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3100000000c6e677ca0122dc2300000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac33000000\", \"prevouts\": [\"22285300000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d4a3aa954d99a0808b2bf4a34eaad4b274a9f5644d16bf38e374bdd4b78dc43f514fdf9f9996eac64dea8e2d2f21992353683b4356a5ad33c6e291ec1ad35138e6f79db5018c5008c2793fb1616ea93309d5c027be1e59893d6060c71a6102191c898158b7fcfb160f80fd5a667319a26ed738f03d0fec7f5e21dedc8e58f7f5a44725dbb915d52a1ade336e1339991650ef5fa3bb4246712940565ed8e61548010f17bef50d4917018cedc3dddfedf9a36d70eb639f570f56bc062398b5fad3f0ea524f69fa6a81ae3f19560f4a4cefe79970059ff1d1da3061d66c8ca69cef782c7a5b81b37151588088925ebc1fae398b78f0bcf12dfd8320cd0929f09993bedc48f67609f5c1489d149817bacb77a5e8609ad9e118e9e6ea76300cc4dcfbc299ccefbd49fb04b6be370a8b523d8576b68939c6177a0807392a47a77b61201fe8471251870aee32be6e7c613d4d558c65dd12cdb1ae3615b0314d74f7c2dbe1a78f0751eb7110f9674191ab1f6ec20f5be9a9390c1f878138681a15e2576aa4e49151ef0d4b3396b24636a4ce1b4820072529ceae8f9c653c1dacdefae7473153ab32cc22cdab23dc5eca23330795cc80f0aee7a25f6d319d6a7270e2164f9dbcf6886681b5984782976d20f6289144e2ac179aab6939179c3d26f1349fee33f84d3a82abf2f18b57c552b1396a7f529a0cbb15d4806b89f2d24a12ded8a20fd5af6371584849bd75\", \"f47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082bf93feda87a2a10f8ccaf134f5ef6c2a0b95d03f8827da72e1e875b6e78a8a5e876f4540117e7e2fda63f7a015ec774d613b8932caa4388fa9ce7145d42cc7f6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09021557521404173230fbd3573c8c228fd0b9da648409807110bf2c67922313c66ec8fb89ff95aac79a3ff89edbd68e27331d93267c3f3719ae65ba121a05e632cfeb78511a65fb00c6fa7cc7204ffa2deb020576ac4293ebde75cc7b5c29196e8fbcb63a4d2193a32119a43a957eeca7400be342f72895a80fcfd70cd9a8756722a4e057d5bae6c3bb9f9a72b7f7a5ce0e338589d630f06e17c253936a2dc9aa9e0b3a44fa6751f52dd57f6ed02d4cd3e50c9d54d172bf193ef665686f04a97d54761c945de1101bb37a44b978675835a1b875a226d5865c4d07abf04a5c3c9ad5bb54cc751c520f96e9ec51b31220ceb32d8ec7a9d690945f14319e017042eb34ed69b4f6de74f20c44ec7e165d7350ff78b0af3fc2e09efab06d14e3bd1b81d9753a284d712cd7ed72171254780579af3da233fef20f9c5d4d691db1f208550fd69158536a08ca9844e0746b0c49c31da77004aa3b1469e41ffe2b6caa7f056872b42227f8f17a59b5738a9c257a832f32e726997bb7326040df2522b245338d4b81a4e2d0d4d705e220063f1b0946b27731a3596d8aec95ab8a8d2df9ff6f21565506a180974a3485301cd1d41bb54efd8766614c8f14bc116f6e02f558577fc1743a3b7cb7282bc6eba0eb4ffe198cf5e1242f06bae5260975c84d73f67d5bda21772649faabb4b03f24c1ef26af2930d1817218ea73607b2645e29f4589f786372b4123e9a6a5f275\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fd6cb83260dd517d361871e17e0728affb238ee2bec7c6aec1cb32ffd91f6217defbee90a18838bf61213a4f1f5f31a75e180b842cfb60d5f81d26cbd38f8652876f4540117e7e2fda63f7a015ec774d613b8932caa4388fa9ce7145d42cc7f6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d784977d5fa21c31f0f510f5a1e2d50f7815c63e",
    "content": "{\"tx\": \"d2300b08028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40302000000f7c3138fdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4401000000dfa691ce01a7032d00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac6b020000\", \"prevouts\": [\"21ae390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"358e5700000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51c26d78b90df0408cccf5a173a397f35b7225b23776926a85911da6ca9e3721966081f43f8c34257025162ccf1daca48ae61c99356c3eb24d5601d3c52dd9de2a6f5053dc49cb92d20c30fe5ab09c589302aa9886b9c794d18405aff33121a169\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93645ced882a1c46bd68a59c6fcc58699bfeb6e11a3b6e75b6ce8d2c57343bebb685d4b392b2e4c368022144328e009ed21ebc6df76a38c37cd5c7ada1ffb4033c71a4e7a29e9a68a1d6e5ccf500c3bde1b862f2704e441e939992f2bf5a528056a3bc3f3b627616b9f836af78c18ce00964f5f9dce3e851898685189c72823645e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d78a59aa9fae45d7cbfb5d42a6d57744818f4f3c",
    "content": "{\"tx\": \"48e98f73028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d8000000003dc93bfadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba4000000008f1f5de404739f53000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87e995ba23\", \"prevouts\": [\"5d97310000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"9d9e2400000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100d30fb719d1875c3c46a98de77aa793514cb4e060b327e008fbf9a49a1fb4dfbd02200dd642d886252d60c35be8083cc2c2ef6f299c6b8e97aca1a620ab49de5f700f01\", \"witness\": []}, \"failure\": {\"scriptSig\": \"4830450221009426393fad42dc8e3a25b09f48fd67527c6c34835b9bfdf3efa36ee170f652d00220217d0f35f8827a01b873d11ce17f14715db62d7b9b383a10e0bd6b0347f8fb2601\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d78b2cc4912fce258a371b34976f623504f00bf5",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c425000000001d54d0dc0137222b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48709c2562e\", \"prevouts\": [\"ec0b320000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f24c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b5c223b2b99456872194ca1969830bfef335ab1526807af314f38e6ee168621b20e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1c56c8a32008d6f6a63b4b8ddfaeeeddf640e9afea8e86008d2331d68e9435ec7ea2726256ae6b84713fc66a1300a8292dc92aa88ab82f645f24355049764a6c4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eb3b0196023257ba22828ffd68cac8334c8e9a2a606c57d60a81549d8eadaf9727e2cee51cdefa725eb1f8255cf98d00ca42f29f054478581d82ff254acc1f11842c4c20f1fedac94edf4ee37dcf580edabb0aa4839378386ec3447d53f529f2ea2726256ae6b84713fc66a1300a8292dc92aa88ab82f645f24355049764a6c4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d796184dcd2791587af889f67ff0bd146da22bf6",
    "content": "{\"tx\": \"70ffc10b02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b230200000009cc2dafdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3901000000dc9f8bc8023bb179000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787fe43162a\", \"prevouts\": [\"1d03210000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"85905a0000000000225120d10cdcba7157d8df26718afda7706aaaa427ac1b5d7e5fac924a4c3a7b738d66\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367515070ee7198470edadce4815bf305ab61e24283d7b82873b83e6e193884685\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a8c616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d7a0524afa7b58f919577fc272101adacde12154",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4cc00000000b8f83b5e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b000000000ea20edd1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7b010000009599d10e01c5f72d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac71030000\", \"prevouts\": [\"f6d641000000000017a9141757f4686f091b43a46fa47e92d07c87fc7a205e87\", \"5b42100000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\", \"0c43250000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"165f142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"aad4d413d20b93ea249d3e5b97cd97a840de55d834d32fd568d08b78a552527f58a0f6b25ef52bbbd9d5b6a44f3865cf7ecfa8a812f1dfd3dfad4d158881d217\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d7ae7546c73cd724ed329a7e111b1874f3fad3a3",
    "content": "{\"tx\": \"64f4e4390360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707701000000fb3218d8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ced0100000081e9f5b0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcc010000006137ffcd047b7d89000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6034d4655\", \"prevouts\": [\"3d9412000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\", \"be405700000000002251208ab07249a1fdfb04b130308cc651220c9430f0ee7d7b49fe0191e15183fe6b9a\", \"277321000000000021571f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8f0324b98e4a688bc8e9b083c101ac36cf765277408c730c20d51e09aa664a607b2ce3280a394734af3b1693e8387e167c6fae4d56b86da1cfd2e115cd7aaa2d\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d7c12a570bce792607b3d5f23fc34ef6392109de",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cce00000000e19e8a348bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ef0100000011e89353dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0c02000000b3dc5d44043c69d900000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac92010000\", \"prevouts\": [\"d9e6520000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8f6b320000000000225120d70bb5030b4517d64d2a3c38713515b320a06334d0ff9db76c903984d8e384a2\", \"bcc555000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_c5\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6c51571d1e64c9599f61f1ea0bce152c3d229e809091a22321e757af056d247e577257d9d9cda5806cf10e78a471e4a104b369a91e3eaea1a4c6dba8b69bdbc701\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3bd704f7d6f451f1604ae63a01b60d188ea3642f7abb2a6cb93f488a329c74452395e75ee8ab1dc41bce85be9e945120119418ec10d6e58258d9d90fb9c7d451c5\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d7d1782dc0b7c5e12cccab548a33619bf58a1db8",
    "content": "{\"tx\": \"f8e59ec202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b020200000080e71b9e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701d01000000ff9dfcfa024f03350000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787b5000000\", \"prevouts\": [\"2b8d260000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"b21a100000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"d1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936626685b331694d0de841e58d95d1842d28c3900fed13098d035c30bbed037f96e5aa467dfe2257bccb94fb5bf6723e840de90a3890266560a9e3d72c84089f55cf37d2bf9ac9d65f4f9542d60f6497573c04b4d7313f44a5c611386102890a1c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045716f66701312fe6b613a3a288c903128f650d73beac5c480044fdeaa8466574a9dac82751ef42f4155e8d0286eb609cd4bc8c8b3be93c107754fe282612bb362f9b27230787fc79bd718ce7ac07558dd4f31dfc3ae0570acbd1df01407b1d4ec\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d7ed3928aecf2d3acbca2fb8d2ee7775f7f52ccf",
    "content": "{\"tx\": \"1dd1ae6902dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce500000000026e16df8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4100000000051563e9502ec56810000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc2caab52b\", \"prevouts\": [\"e99947000000000017a914de933560a9a700a6d4f856bfa5cf61713cb34ea687\", \"3f4a3c00000000002352212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"235e212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"b1b7dd95dbbc4cee32ba2d986ab178ae22de42cf1b059d3f8356fb5e12a6e7588b901314fc23e0525185d577ffd9102b11373a3a6ac4c901d530c8474f23495d\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d7f54f75c60667b7fd883f34d666d917d0b88809",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4f00000000096ba8c2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7400000000156c38e103eb5d8b000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac71040000\", \"prevouts\": [\"1e47260000000000225120bf924c4d20f2c9cd0e276b93ccb8cc76d8c2c0447a0551ca648744a57795d235\", \"27a266000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_2\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"65914ed79dc6a229c28e0dc26cdeee837174dbe2710aa6a80d4782e83fe77faca7f46bc228a85982527e7d0748a105c3ef5728c5c2bb620cce3eb8944daf3af801\", \"aa7f0b81f4cb1cd2336ffad5dab8926b34399f1c11012c3a1e54275224f18b74e41c641cf9c789e0eb82f2b2ead830842fb1984609db3e4513d5004dcb38662936c6381aee07a8eb74934799299728e6ee118844e0ded5b15717e7d24d25ccebd8368e6d4fd71981f679d698a6b3ec1c4a124c1a68a9a2260a7b5265d26225dff4ea0b7d76ce8c4a92d656bdef5e5e6b775f5329dca0372a69f3c2357574762f5aa3424dbb2a632b81ed6e2c2095521864f9e86255a7efd8fcce33e56f784e7b04ab198dfd\", \"4cdc4916429dd43b46f96dbe1b92564950ea25319f017c28a3d59fc97674260912d96b90f24f18c0b44c5c74ff9dd38153bb932495b13acdc6c1f0b9304d843f165c0af0abb830fd641bcdfba64300ccdcb77a6e8e0faeae54ca0250603da7b06d7ebb64cfb0e5b5cca94c0b67fc26786c24e73cba1bd4da99114567a0b548a78f03fe08c62ce444163b256e8900a7401fef6af425f482ca2e86c695e1c17184f6f75bb21288a275b0df284f4fd47ec71ea061163991d67f9945b2217ddfae42ed4a3861523dc90f088a2d082eeeeb03da0202a78dca428c18740b7b658d6d3535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a251646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367fb5552ee6381cdc963f2111a6f573fcfbed929a5b7c4ed5b3a36f5e0db7ec66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98b3c9ce3df34033bc3dd90a77b2b0db97c9c89981b5cf75c5aa87c293dde5a21e1620c18b37992f243287ac1416cf3325e32c6396edb12577e7662588de4da7928e438ad9fbe70f4d0badc06c7ee4c83ca813fca202605ce9f9b474875b982e0d55f0109232bc00dcf6dc13410e1b395cdf86e7f0f25d39d47923d809812313dd2594d6ac6f637d534b85c20b93114807839d2feb8bdd37a4ed3b0575f0b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa32866219c62026f7943059472a02015d9196422dc18cf32ccdfb1bc543c558bb77001a65742f0ec68ef04f1d1de20e1df0c901f62fdf302b0bc2e7cce56c3b25365115c24f001a1f7f6a466f6429ac5452b824ea332bc55da340486be9211e3c1557cbbec067595eb9403e301c9e5b7ac8d7a6875267436812a9f0e99cbea472635a14868093c7960743b4a3454dd3e5ff5639a2725f2433e65396d247e4d210449f63fdec596e5519c6eed966e2f0980b7a713615db5c14d0d64781166ded471a3b6219a83e6c68a031243b897edd79429041868667756862c9d1b38194a57f3d6fa22beb60e2897e24fcb4fe6f183151874d2e032bb70dce4e519d9632c234421d7622a200065f0ec2d551108c54d6bf63cfb84e70b5f86d0861e641f01f31a7f197a76b16e6c33df21de22f6872242719b47812d22907a96f1611514039a4aa8563b19c1d1d11250331c8705531967758c6a3336e611888684dcbb61c27b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"65914ed79dc6a229c28e0dc26cdeee837174dbe2710aa6a80d4782e83fe77faca7f46bc228a85982527e7d0748a105c3ef5728c5c2bb620cce3eb8944daf3af801\", \"9fedc5161501185b324cb50c457a91a7ba7c6e227cba17aa0392ab48f2fd03680d1d500e13fa9af4ed2cd6cc7add756725e40c8e6d4d3ed6126e66f09b00f84b13ca28d8d3bf472d6657d4cbc095463ea2e63abe54a309a8ea6b76c66926677a273a4b323f3e4aeb7ba746851a22abbaccd64fecdc7f1584883607a23deb3ac630a431276beb47b05f5f7375ad04c8a48591d0e7513d0a18936bcb9322e6e895eceb98185fd96373b6d4615290bfba32d462265411c42034c517c94f0ac20b609cc801c8\", \"4cdc4916429dd43b46f96dbe1b92564950ea25319f017c28a3d59fc97674260912d96b90f24f18c0b44c5c74ff9dd38153bb932495b13acdc6c1f0b9304d843f165c0af0abb830fd641bcdfba64300ccdcb77a6e8e0faeae54ca0250603da7b06d7ebb64cfb0e5b5cca94c0b67fc26786c24e73cba1bd4da99114567a0b548a78f03fe08c62ce444163b256e8900a7401fef6af425f482ca2e86c695e1c17184f6f75bb21288a275b0df284f4fd47ec71ea061163991d67f9945b2217ddfae42ed4a3861523dc90f088a2d082eeeeb03da0202a78dca428c18740b7b658d6d3535c89aa41017e2e19c399f1f47af6c33f3263783acb32e3a29832fe4577130a39c7146c51f0cbb1aa7598f0b61eccd6e728b5970a251646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367fb5552ee6381cdc963f2111a6f573fcfbed929a5b7c4ed5b3a36f5e0db7ec66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98b3c9ce3df34033bc3dd90a77b2b0db97c9c89981b5cf75c5aa87c293dde5a21e1620c18b37992f243287ac1416cf3325e32c6396edb12577e7662588de4da7928e438ad9fbe70f4d0badc06c7ee4c83ca813fca202605ce9f9b474875b982e0d55f0109232bc00dcf6dc13410e1b395cdf86e7f0f25d39d47923d809812313dd2594d6ac6f637d534b85c20b93114807839d2feb8bdd37a4ed3b0575f0b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa32866219c62026f7943059472a02015d9196422dc18cf32ccdfb1bc543c558bb77001a65742f0ec68ef04f1d1de20e1df0c901f62fdf302b0bc2e7cce56c3b25365115c24f001a1f7f6a466f6429ac5452b824ea332bc55da340486be9211e3c1557cbbec067595eb9403e301c9e5b7ac8d7a6875267436812a9f0e99cbea472635a14868093c7960743b4a3454dd3e5ff5639a2725f2433e65396d247e4d210449f63fdec596e5519c6eed966e2f0980b7a713615db5c14d0d64781166ded471a3b6219a83e6c68a031243b897edd79429041868667756862c9d1b38194a57f3d6fa22beb60e2897e24fcb4fe6f183151874d2e032bb70dce4e519d9632c234421d7622a200065f0ec2d551108c54d6bf63cfb84e70b5f86d0861e641f01f31a7f197a76b16e6c33df21de22f6872242719b47812d22907a96f1611514039a4aa8563b19c1d1d11250331c8705531967758c6a3336e611888684dcbb61c27b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d80fa30ad1a0824f0da7b212e606ac5496c0715c",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40001000000879be48fbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9600000000f30fa8d6019bf8a2000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487e62e0b28\", \"prevouts\": [\"7d1a3c0000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\", \"7f417a00000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"f87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b76277e7ebb6a6beae3662bd89a171afd4e408216155b40c014c7594821f932cc194f5b64ca7905ecbca48e3f65ecb2f68dc17df34a907a9e0813d7f728c588e9e87f1230a4dffa49f76a6d91b3ffe7dc371ffdd064326b56030bc36a92eabd9a0f16f4cfe8b052d74bbe565102becb5d9831a57baf41b6ebc95ac4a46ff7ed8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362f353434ff448b07af6ab9f2d6b7abed88cb8a262b2c34c793eec61b98efadc45d94fcac167164a1e762fdc7573aeb7aa116b8ba9fcc5f9bd36bcc426cdd2c869a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e5422b6de6500db2bf907e4c5314ebb405475f57406f25afe5ac62a92a9e6c58b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d86ea65d288be1fd03e9e19e503b17612c637374",
    "content": "{\"tx\": \"a8b2c1d602dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5f00000000a06df2f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42701000000a95303a40343c087000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7967f000000\", \"prevouts\": [\"517148000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\", \"1fc6410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"2b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93618bdd98e4dd01571cb4788615e57aa4d3492f4068752bbf05bf3e40f7708bf38fb898061b9e990a9b5449c5e7217db506cdc93f8f373bfce07d03a77edf1b275195038de5261112827291f7af9c58b034003ed818b7e5ec0d4ccdf81f6c2ea4d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa44f1db148647e579a127c5c190f6913605985e391579ddf83e446378ee4bc7a1d75fc84f2af88925f7ad475b3203cbf9256a43a0cda52d14a3416be93a7fb1c4d74d03d2cf0ae79996d1bf896237ca201e78f1b4c5ece550af4c0e01e9fa9886\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d8ac2a246d17295baa73602fa55f5ef1d6edd095",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700700000000cf91ab8ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1e010000002e60e4f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43f0000000034add3ce038151bc00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79695b58e1e\", \"prevouts\": [\"055d0e00000000002251203236882dfaab6a61030776953d98ee1af902cb36dd280fe66ad8ee191278ec27\", \"e3536f00000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\", \"e1fd400000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"387d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d03a0e2dd976c032df5ba11c8ac0ec783bfd7377fb7304a38f58a019219dc2e3f7118923d14a9704f5c6065ead9bf1df659362e443facca38f7fc54a29b18e2b8fa601fcc68a78472d280e0a6f10ace0c22dad9ad93c154f995d1132d7b2f793\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8f5321bd3c280560a6e93f009006b65547a58d72ede42c89f2f760c3bf47a1d1aa12168afdb4ef286e7748ddb08cf408d85b089f504486378d2bfb535c0d2875b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d8d54db51b8f8299982f8136c6058c9e8063811b",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b600000000e9c7f4e6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcc00000000ae03d8a6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b63000000004e7e6ee9020bc17c00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acc8010000\", \"prevouts\": [\"529f330000000000225120973a94e36a4a923b8d161b8fe153210f91b56b5e4fa7540d30da78859ffb8897\", \"1b20280000000000225120035d0d8894332b18eeb5087880b9b7fe7a878dc0e9a501d9b85908b60f4f194b\", \"d2c2230000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a8814e3956d08f0194fae5aa4da4023be389b084c13928eefd595af05138750d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a33616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d8def6ae46c2ae1d19b457603e2015ddad467ad3",
    "content": "{\"tx\": \"7d81ada40260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ab00000000a5db64b8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf970000000016aebcde0482f29200000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79663000000\", \"prevouts\": [\"bef7110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bca582000000000021521f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_f6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f9fc9e4d9ac519dbdce2fb2127d2c12d0355253ff8909de84f5bf5b9e6469f8e2faa5bcbd974a71190e7a1cfc4470fb755181d83987c36a4003d93f96c532e9d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5263da901d565efd7d04f0f476aecec6f0bd20a16d03f37ea48b578ea23197bb7520611bb100569dcf1b7902b5c2b7bc23f139f28705cf6ba3072112ada68a03f6\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d8df811ed2f11c79fe945f4943ea3299a251ecb0",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3d01000000da98460ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8401000000f6fde8a203bc4d9400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c147d44c\", \"prevouts\": [\"fc6370000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\", \"5ab02500000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c04c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93688fc8f615032475bb12c71b7eb73effb9d0886ca0e0e26ca1dee2899bd81981c1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004500c8753d4e6010499b58065b36892efcd9281a64e85ebf7c5dcb8f6f4baee16c3de843256fc2f72424a897ba91cb5d3893aa03eaf52af3ae765db300c5c19165\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52c0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5120e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e192555fb599a2fbb7b206b08358b85e40a527ad21aa064f750df81600ff72cf4ef17ad4bbf375bb62f626ec8048d4347cc1eef977780228a6d2fc47294088d561\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d8e4caa314d508c3062410f0d680eb589488140f",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1000000000e348ed568bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44e01000000d194e30f035234630000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48709ed1724\", \"prevouts\": [\"119624000000000022512048dae93b9a8752a11e2bf9d811f71f83e914d496dade834e573813f3fedfdad6\", \"607441000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d95196c0d5dca92f2d33c0ebad1483bfd9a8aee93ace9d0b7d3c96541db4e2fc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a35616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d8f77e44fa8aab802aa9131ae9f319611a054835",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c61010000001257accddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c650000000012c97ec6018f237b000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374870b5af43b\", \"prevouts\": [\"bc124f0000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\", \"a21c580000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fe\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368d877db375ed8535ba033f90d60f6b296e0f2bd1d7897409f54097620de448bdd800fc56907ebb8e18291aa6f74a5d7a46b4d60066ab44c243b43072452172e3365bb68c3eae5e6cd9b20289e581f52d4e8c0cb4ba58bcd8be9e67bc80fb920a1e45c38e8a62a0e5058038ea76117f85fe5d704aefa5d806bc1a7cbe3a990946\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f273e05517e7d7c4ebae818f78ffc6ae6bbd8b4691985bf60fb53bef1b79009a0d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3b44d8b0f62b2d27de7be259100200d6da1e5303b29f3eaa1b6a4eeb0c96a42f364ab0b66352e66b5bf600abf31d1005c5406f4575b339026213ecb21a668977f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d915944728f949574638f5527cabdee757340ecc",
    "content": "{\"tx\": \"d14930c602dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbb000000002238ed8360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703d010000005e661cef048a862e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca4ce8961\", \"prevouts\": [\"33ee20000000000022512023bf095063e7bb97384fbec96f4f01ad8898e1e0efd80c3cfbd3ae44a7eaec2c\", \"cfd60f0000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"a17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365782dad4624e1436d6ea54bb6ab260d102b127668043cbd100ab813dee80a28c33479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4ae668dba12609f1dce2a1e29faaa62ff248d54f408b31ef31944f67a579d4fbb4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e56012e14d1393796178822b876e37f88bfb8786abf6d56f290a567bb98032f4de668dba12609f1dce2a1e29faaa62ff248d54f408b31ef31944f67a579d4fbb4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d92c58e19437f5a57d606edb988ebe5449b4db1d",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5d0100000065384aca034e9a750000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748722cca356\", \"prevouts\": [\"bea4780000000000225120ee3305d066df7da0d9359f951912ab6e6d37e7b862aba6249b3f95860f1fdc83\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"597d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936312c79d7240b9e23cdcc387c1150aad8c47f5ef9191447124def4f04045de1e0613bea5824cd1812f2095288c03f032c5bbbfbbcd6a739f4744a40299340ab834be962498b383c32e8a84fa570ade752f3a2216469b10dbfd65078bd8e1b5998\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93606d200554e8b3644c14695358e08280b763a8aec693ef25cad933bf038da2c47e343ebd89880aabef0f18c5bef462b16920a32508939784a2317d7ebda32c7f1d0160c53d01d80ab4be204ae4e021ad6f56ad3990ac4b37baa4678d530d3ba4ecd61c62feef9509bc7b3762bc81079411fa6867ea4986820580c60fa1e8298e9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d93387aa595f09f4e40642c715176275012422f9",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3400000000f74ebda1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd6010000003ae740d901134630000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48757010000\", \"prevouts\": [\"a750530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"71fb250000000000225120199333ae2814ece819e66b6eda683343e1bb1d0c50810e300807466af2e93101\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_74\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"aab015fdea84fe0e91b8322a7ea01a7840986b3432f88733206552a5c62be599f7e0b49e00292635f4c69b5af6c9e5bbb31350bcae561d509ad2e819d0d044a103\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a1ef0ed3f13b7f1fc33423c1212ec936086c8dbc09a62853ae1373058575354d28ec806bceabf20ce2771f5ef4b21441aea0cc247743eb9a15ea3208635ebe1574\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d93dd1d6d2d9b39d77cd72571effaec51dad73cf",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1b0100000056ef84c6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1500000000048e2596dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1e000000009ecaa1df0136422d000000000017a914719f78084af863e000acd618ba76df9797223689875e000000\", \"prevouts\": [\"f4dc280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ee4f4f0000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\", \"53ad4d000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ba\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a9a5b68f1d86fd8af024c4f75d1a38f2d10e7637c64a54a2894f0cbedd1e1af59d12b32f020938759a67837bc3fef012ce7d045cb2bb06c6242d1c290206a37082\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"a664329d30e124e738e84ce40146800c1ed5357bbda9e916be43639b3b641673b9c5b2282f208af0925bff854acec14556591069033fae97600e5395e3790f45ba\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d9462d451520aea896848f14167cad63f8eb631b",
    "content": "{\"tx\": \"b354418b02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2b01000000785719ab60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d801000000a030ebbf032d37300000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac35050000\", \"prevouts\": [\"1c06210000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\", \"72e9100000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936529ac28ba9126d334d2bfe78381a644e93a06c9df65fba8ceb6ff6d71211d607f2f7628d981d9c0428415dafbd1cc169dd3ce50060f3002d6f03fa895459568af43de7556260bd81909ce9fa765818ab5d5ff32210a0a876b048ce5ffdf4a21f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936550f803589323383905fb3624331699e0907c54c55ae82563b3c36b855e46ff6b25240bc46c035392207c1076e816011b96fc57f286e81391f52d072a1ebea8b62cab3a6172a7c832406474b8da3677455d75595a690190458c84d19d8a3ecc3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d9632d4e4f8d7cc9db523291bb7442332d7c588c",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701c0000000093e5369f60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270700100000013a28ec804895c2000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787270abf5f\", \"prevouts\": [\"4552100000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"3d1c1200000000002251203e1b6fae524f56ebd8e25d4d2010b2e478325da2c77049f1de4edb81deddfc75\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_5\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8136e60b5a749db7055c098de5c767d09d597e5fb58a7abd1b3b1c5562a2a0de9063b9b4e2d193a68ab4a790844cdad53eb6ffd787a41ddc3e084b1eeaacd8d701\", \"6f729d8258fa1d21cf5e2a685a69f7\", \"75005a23fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774daba5a8823fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da6e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366b28fc3474578691d9e244d7b16b501b38340815892291711d256157ad1ee8dad0de486812e546ee343fc80b33a28f311d3769c55b9f9af57521b8222f62c50b838823e011c3227b6379bd1fafb84ee100b553f66bf120084f89826320ec9a568298dde6fd35a7daedf6e8b43006adf2c3120c6e52ace67cfaa97cf3292ad0adf762774921380a419cd0244be2cf22fc9482b6be6695cebb3f4a25992592b5ff00000000000000000000000000000000000000000000000000000000000000006e692c29a2af08d0c07bd51a20c6f04115844f224a8f2483500101b22c98b78749d66a1bb126827bab6e123cad1c62c1d2c4c3b11621ab38aab2dbd2fadfbb92b4bc223aff5abf00ae2194eba7e7507c4679c544ee0f8fdcc942cb71079cf6590405d7b50775128ddd691afc216d299aa73690516e177ce40e767b014d7234afd3c813fa1c1e96078ceb5d0c20ee865c609d00bd2764aba33dab8299d82201f8f37302572b4032cf89a221f094ee0f776acb1948e2971cc52c7548b0766ce4f700000000000000000000000000000000000000000000000000000000000000001d089b5ad5245ccb86bfa71e3b9f1dc4b881f35f18527b8a712ac27fa4d0077a9be4fbbe05d6b742e19a169393f8399ac49b6a3f8fe25e357fbd21be65c5e480febd64ea7daaac5bc7a1202bcb709ed9698e442c24e3acda87b93669ee8f6e9a8121ebe960744f9749796aafb4b96fb0d838ff9a74d0510dc4ff39bb1a9f4c551c4d8539fa98efdc030f11f2d49ed06f459005af216c5950be29f9248ff8a98647cb83b84db5f0a77171f66bfa83a44fa126bcc7c362c5dc48462fdc3d10a0bbd33772a9ef6caa14e124af9b8cacefeee271d9ca6261be901d26b266105e4b84de10dd7de7d0a271d5dd2e892b957c0aeac76223b0c8a9ae5d28f17f1522d0cef29dac0ecf80bfa2bf2419821d2fcc148757f849b7ee26f8409d618121a637b57b79f04b8200de1b3f169bd662d9ab3977ddda4d399e406b026ce1fb8338f8f33db4eb1ee22921e9b7482cd813335e7a5fe207feb124a119889288f698f4ae2852a529075dfd03b6616b347751547bd79643623e5ac1e391aaf7dfa5a4cb7acc5d4d122a8d3c9493bd10bf5f9fc690163ad98c83fe2fe82629f68c75b9a4ad7f65dfac95d2b6a9580adfe1eb93c34c5b3d07ba658c17807015fed9d87202ca3f7162dded8d8809d366758b5968df33bbb14065deabdd83cb2467e8249ea2a808a89e0e6c85afc06f9ae1b4713e1880b1090ac5e3f7ec32968aac2a003f61127064473c9fd3a2c3dac4f849aba576e319cd9b9b4508583384e8741401427ab18623ad10afad3383b0b306a03bd495ff84a8665b410373f619b18b144ab75d81bd0000000000000000000000000000000000000000000000000000000000000000d73ec15d7f56b5a16b80e54d411bb4a9d67d1c66f078f825ff042fb865b9ea2df92a551b325735c4674c323f8ed8a3c63f4fc3f8c623173ec6985991b8b6f0e0f957ccaddda9182dc82949e6dbf6a1bfa91f4127cbd3124861088c1fd3176f4703eb8b1395916cc80ba6648ba7b0a1a11844e81635c58a50f5c88d0ce3ec1c82b68c4089be2fbb5f7736a3a221d94c0c12d4d0a003e754324c3d7174e4406ddcbbb561cebe9800256ba4504c3fc950a79fd8c2c6c30625d45e3094ef221f9951a436147f0eefdfd78dbfd2735ee3da7c2899f0ee4e18a2344b5d0e1638192defacc59095c8c3cd683f765618a427009da6fd4b5c09e5d0be10694d96688c37c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029a6ad1d9b822582ae9fa8dbd97c350030f17da5c15189bac30a6a7e7f21dc18ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000001ddaad8a5eb165c8d8255498038debcfa140e20dec6301387f98b99b6063338211ae48db51a42a878e484aa563b47d2da3956c5922dca14f6b9db6c24f7bf27988e0fa67203cb2467ecbe60e720fa758aacc2eeae0404c729234a6fddd4c9abfa912d4c87fd2730c0ee798a40f30844018ccfb663649e211a633638ba8bc7556169e4b43106fb02cbec7f91545ad7e8b8205b2d8dd9667739e82fc60d41fa5a55370e872a375fbd5b7ea6681dcd7562c0c0d7824b4703a4610006ef27d28ce53791a32b5344e3a8723bfefd2c361cfc9e6e5e8afb4156ec33bff105db026cbdf\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8136e60b5a749db7055c098de5c767d09d597e5fb58a7abd1b3b1c5562a2a0de9063b9b4e2d193a68ab4a790844cdad53eb6ffd787a41ddc3e084b1eeaacd8d701\", \"18c1e902812f9b4a82d1035803bf\", \"75005a23fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774daba5a8823fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da6e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366b28fc3474578691d9e244d7b16b501b38340815892291711d256157ad1ee8dad0de486812e546ee343fc80b33a28f311d3769c55b9f9af57521b8222f62c50b838823e011c3227b6379bd1fafb84ee100b553f66bf120084f89826320ec9a568298dde6fd35a7daedf6e8b43006adf2c3120c6e52ace67cfaa97cf3292ad0adf762774921380a419cd0244be2cf22fc9482b6be6695cebb3f4a25992592b5ff00000000000000000000000000000000000000000000000000000000000000006e692c29a2af08d0c07bd51a20c6f04115844f224a8f2483500101b22c98b78749d66a1bb126827bab6e123cad1c62c1d2c4c3b11621ab38aab2dbd2fadfbb92b4bc223aff5abf00ae2194eba7e7507c4679c544ee0f8fdcc942cb71079cf6590405d7b50775128ddd691afc216d299aa73690516e177ce40e767b014d7234afd3c813fa1c1e96078ceb5d0c20ee865c609d00bd2764aba33dab8299d82201f8f37302572b4032cf89a221f094ee0f776acb1948e2971cc52c7548b0766ce4f700000000000000000000000000000000000000000000000000000000000000001d089b5ad5245ccb86bfa71e3b9f1dc4b881f35f18527b8a712ac27fa4d0077a9be4fbbe05d6b742e19a169393f8399ac49b6a3f8fe25e357fbd21be65c5e480febd64ea7daaac5bc7a1202bcb709ed9698e442c24e3acda87b93669ee8f6e9a8121ebe960744f9749796aafb4b96fb0d838ff9a74d0510dc4ff39bb1a9f4c551c4d8539fa98efdc030f11f2d49ed06f459005af216c5950be29f9248ff8a98647cb83b84db5f0a77171f66bfa83a44fa126bcc7c362c5dc48462fdc3d10a0bbd33772a9ef6caa14e124af9b8cacefeee271d9ca6261be901d26b266105e4b84de10dd7de7d0a271d5dd2e892b957c0aeac76223b0c8a9ae5d28f17f1522d0cef29dac0ecf80bfa2bf2419821d2fcc148757f849b7ee26f8409d618121a637b57b79f04b8200de1b3f169bd662d9ab3977ddda4d399e406b026ce1fb8338f8f33db4eb1ee22921e9b7482cd813335e7a5fe207feb124a119889288f698f4ae2852a529075dfd03b6616b347751547bd79643623e5ac1e391aaf7dfa5a4cb7acc5d4d122a8d3c9493bd10bf5f9fc690163ad98c83fe2fe82629f68c75b9a4ad7f65dfac95d2b6a9580adfe1eb93c34c5b3d07ba658c17807015fed9d87202ca3f7162dded8d8809d366758b5968df33bbb14065deabdd83cb2467e8249ea2a808a89e0e6c85afc06f9ae1b4713e1880b1090ac5e3f7ec32968aac2a003f61127064473c9fd3a2c3dac4f849aba576e319cd9b9b4508583384e8741401427ab18623ad10afad3383b0b306a03bd495ff84a8665b410373f619b18b144ab75d81bd0000000000000000000000000000000000000000000000000000000000000000d73ec15d7f56b5a16b80e54d411bb4a9d67d1c66f078f825ff042fb865b9ea2df92a551b325735c4674c323f8ed8a3c63f4fc3f8c623173ec6985991b8b6f0e0f957ccaddda9182dc82949e6dbf6a1bfa91f4127cbd3124861088c1fd3176f4703eb8b1395916cc80ba6648ba7b0a1a11844e81635c58a50f5c88d0ce3ec1c82b68c4089be2fbb5f7736a3a221d94c0c12d4d0a003e754324c3d7174e4406ddcbbb561cebe9800256ba4504c3fc950a79fd8c2c6c30625d45e3094ef221f9951a436147f0eefdfd78dbfd2735ee3da7c2899f0ee4e18a2344b5d0e1638192defacc59095c8c3cd683f765618a427009da6fd4b5c09e5d0be10694d96688c37c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029a6ad1d9b822582ae9fa8dbd97c350030f17da5c15189bac30a6a7e7f21dc18ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000001ddaad8a5eb165c8d8255498038debcfa140e20dec6301387f98b99b6063338211ae48db51a42a878e484aa563b47d2da3956c5922dca14f6b9db6c24f7bf27988e0fa67203cb2467ecbe60e720fa758aacc2eeae0404c729234a6fddd4c9abfa912d4c87fd2730c0ee798a40f30844018ccfb663649e211a633638ba8bc7556169e4b43106fb02cbec7f91545ad7e8b8205b2d8dd9667739e82fc60d41fa5a55370e872a375fbd5b7ea6681dcd7562c0c0d7824b4703a4610006ef27d28ce53791a32b5344e3a8723bfefd2c361cfc9e6e5e8afb4156ec33bff105db026cbdf\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d96eb1935933e5d8a16bab96d06d05f8b1ab6619",
    "content": "{\"tx\": \"4296b05c0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d701000000192c02da60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703800000000b70f74e6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c010200000054072fbe0445ff6e00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e4cb024e\", \"prevouts\": [\"0526100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"099f120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"39c14e0000000000225120bbde5ba4efe7e1dea8424d44f6a18f36c486dd20519c71d54e639e6583aa7bfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_c7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c1a85d8b3eb980f76eabd5741f07251635cff2f196a301480812513bb5d63da81eec3fd4d352263e70d2ca1df90242916fb1df6dd125a9f1faeddc52c804b6e7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"561bd7846262baae81f6792ab6d77c043e5928476d727ec47177cd0f017253062b020befafbd057076f69c3e16900a483820fb4aa0691426335697c2cb2f68cfc7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d9721f612be2c4596ef2507879885c69a5e6e58d",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4470100000039193aba8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a3000000008ece121902c3e279000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787819fc62d\", \"prevouts\": [\"8ad53b0000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\", \"73f74000000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"327d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082b0246b7a5461d23b2ebf642f7df88e05c9d62107f66abf7b5f94d7753ce57b53620e954adb3b90d8c3597d54022d70f5af7b761a66be618c54dd56feea2be872\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367bb4cde3e3cc203faebf1c98a38c23c69871d6882171bec860ddcb5f2eddf6363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082b0246b7a5461d23b2ebf642f7df88e05c9d62107f66abf7b5f94d7753ce57b53620e954adb3b90d8c3597d54022d70f5af7b761a66be618c54dd56feea2be872\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d975fa857300c644b1b8b86b9e5579116325e3b6",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4db01000000aa09a19cdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0f0100000069f2c7ce60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270920100000099f9349f028e428a000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487596bf447\", \"prevouts\": [\"72db310000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\", \"266e490000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\", \"02ff10000000000017a9146704ae21c886c9ded757e2b67d582abfc91902d487\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063c468\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367be4a8bb12b73021ccb63a6bc4fd84e79b116d92f00fdc636ff8584a9737600fca92fb159a7f16850def0f13a878cd04653ddced5aa57281dcbf7f9041e8663ebbd17872a9d61e54e96dfef681da77b5399be78aec05b527019b8e812e967c33a95f177959a3d24a94a797d1e607e5550897d4e95d12a52323e6e8eeeab3383c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699870a105b0e885032e1422b6e64265097934c5360dbbe05b4622b568c1cc270161570c3f10a90b75a16babedba4ef90c71a7e82b9436df981e4930578e77912a95f177959a3d24a94a797d1e607e5550897d4e95d12a52323e6e8eeeab3383c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d97fad7ecab4d8f234efc71d9e0019d3cd6866be",
    "content": "{\"tx\": \"70ffc10b02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b230200000009cc2dafdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3901000000dc9f8bc8023bb179000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787fe43162a\", \"prevouts\": [\"1d03210000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"85905a0000000000225120d10cdcba7157d8df26718afda7706aaaa427ac1b5d7e5fac924a4c3a7b738d66\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_57\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a063ce31fba109939234fc01f06aaf1ab642b56141e01b0c1ea84cf22e940aff2fda3c46aea52c8af7433dfaa9f0268a09381bed9deb4cdf35951912ee7fa6a703\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"aa796f3cfdb2b54fef664c0efc3b65c55eeb55a838824f29aeb5f23162930b42f4602b8e974d7da283a76a3231a1657fbdc37d0c49a0d5efc890dfcde9887e2657\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/d9d8525ff675d165e7bd245edb10bef8ffbabf37",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45301000000f58a3dee8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44100000000b63cad77dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bef0100000079a1743d0344399800000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df979722368987ea000000\", \"prevouts\": [\"8b783e000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"624c37000000000022512099a26739d97cb47a5f7edeeb47465139706da2fc4352eb812a3e381cc2e19a92\", \"3919240000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"897d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e825e476051edc329ceb3a02f4bde28569ef4d6846a9140276d24ddc98c1f436ac1726cb8b9ef30538f8a1a93f31e75c47dd280be49ef0cf0ee8d9ed88fe0918226c56da6b4a79dd49e001229b88fb5122d120ac43d63d1be0cdb38b208b21132e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e74521192f9881d050e9eb7f2031b3bef3eee8197447af4f964ecbb21ec264c058e965213f8dbdd3ccbab86b6d585f0f8e78abed831015bbc989f3cab476ce59ac632f1e88e109b3d5485dae08acb0148fc939094c3a94300b3efbd66c89bc20\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/da15d30445dcabf73491b38ff9b7fd6ebf09fabb",
    "content": "{\"tx\": \"6fe1dd5a02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c070000000006cfdada8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48600000000e8441bcf03113b90000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487cf000000\", \"prevouts\": [\"bdc05b000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"6a7436000000000017a91486e5fab3386e07350db4c59e442dbaac96c1816287\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fc4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900458771b6e792b25070418091d57f3336a76b43209d1f0f67eabea9d94d6d252d60aceb16be1ebf4fc69deaf064fc7bf5d7ff2149818b5ba4c28c799d30ad567cc959b5d8c486a0b4fb1c0695d0398f92463f78d98cf4d122171b1dc85f0cff66bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52fc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365599acbe1f244de2cb64ba6851492e50472c162a45b9ea3e19f7ca89ee01985a731d32c4c28957ee8de75561afe63689e2428997edbca796d37c8feacf80dd0b4e0df2464f99a35d5bc9fbf69ae3045675e957332f77327dfd622124d00cb4df\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/da20174fe1299204fdf8cca351a424cf681308a2",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127041010000001720b19702a1341000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acac33b72b\", \"prevouts\": [\"32c9110000000000165f142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e397277edb9892f8bacbdcb6543289fb0df076055a91ea7e74f59d361d35c07b375a39ee6d07249e82169004b19323f96057fdeaa6b91474614cc9ea8b65e71a\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/da3eafaf969feb19889dd744b3407db1aa866e06",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1402000000ff7187b9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8600000000e2bd2fabdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b54000000005614c499012d9a5900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388aca876a75f\", \"prevouts\": [\"cc547700000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"b4db27000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\", \"aafc28000000000022512008ff927e8178e20f38298d934a97845982dc7c5901b7d815cf7926413ad6b4c2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"657d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d46ed5c88be999b027defe78826bdf9f79fd708eb8b2e1895cb28c5d0d8f8cf07a9921914746f344d752c7034b32810721c9853c38c376ca018a4c3c5bab65757fdb01d6ca2155f5be7a678ca6a1e1d0c436995e81f878ed9c74997cf4fccddd302781454c6297f6b8a579760f4d591c0acf84ff9d038b064bbab8a5d53835db\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c56699834a23a35d7a8a8e446f06483c0f6f4014465e54b19938cdc9d35914e3da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e38fd10ac28b4a0ae18793cce60e7e7ebbedf1e3488ce0551c956bc9cf517ba032bc2c7d802e8c870cc0fefcfae9d23d316cca1682651be3bf62b663d5ddaa443\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/da802c4897e37a5e51f367edd23444c11faa33aa",
    "content": "{\"tx\": \"d3c407fd02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf59000000008d3110a5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce7010000001d03cbb703ec85ba00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc53000000\", \"prevouts\": [\"c7df65000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\", \"38585600000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"ed7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa229db830b5291510bfd4e55fc2f3a45cfb4105ece0af57cbfe0942d597b32d0c27d2631c3cab5fe643277004a2e6838e79a7dd6765c91a13be066042b33c17d3b131de5807af4725e3fdc8c81388bc895736ddb6e799e7163e8586c833ffc627\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4a97da4cacb7d2ba59131ae423230c4733e99b93a89fd0934cd3e0ba8b31d50a45769ff8e70e4bb7b91d42acbbb62837b0e871ab760bcabf7dfb792b2e999f3b131de5807af4725e3fdc8c81388bc895736ddb6e799e7163e8586c833ffc627\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/da8a14b376513348d7ee34b10ff6883f15cc6fd5",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf280000000029e4a59edceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd60000000005371cd401525245000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48722d99d32\", \"prevouts\": [\"4f2071000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\", \"990126000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f7e6fecf7b275192c192a6fcd4b891efb7eaa132d8f10fb9190d0a2baa8d1698e004caa59c1baee03f2237f93c7a785aa484b5867d64be51a3270ee620a8e47365db42922f11ed75220edc6c675ddb7d1048605814ef88b38ccc0746b4208adf1b33c78d0723c2efa37f4f3536e545b2e8b2611b89e2ddafb64647effdd93bfc49c8718c058091c10073ac0cd025d6499d83f9ae0269b4d108e8c33cd7cfe9d27858ef80e971b2149ef8e8c576e5ed3461f20d8c2fb97c44720c1c482a436fc48625d5942d4a34ba8e3e26f8fd6589d0569e0041d3960b3cd7c5a08083107befc5e998ca21829da0c5229d4586245f5e3dabbf24fdc911215b9ccf407e62ad75e7b7149e77cc3993b985c49f8376b351cef110f46679bccf8edf7bf773647022ad9f4cc29ed3db956ed2f80af7588dc351e984e2d0a02e22f4293b73fd7d70a72a94ab7463884dfd80003ee289b3a255c9e27fae49a88e2e46f680a1b0778406f0fd29166bf0cbbbc2c3755a93127d6b3872101c04322c88e7d432f45a2f408bb705b72d280fae5fce9ebe9fe4ba070cf5ff6e85f4d85939dd7f993cbeeaee01a730e76a471127b4d2bbde21a68a06f778c6f4e0a3e65f0bf055617e3ef36efa2a6c99413b4ef664db4bb2365e81a5311819bbd431a1790458565ccabcbd30dd260bae0a2a0d3f4011b6b09a1c27da2f35ea9f8f441167e4eb7ee7ce3893fd6166fcc718902d9a348475f4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045a416fde06d6dd90590ccaed91ef0bd8538f486647382cbeeca5e39ce4df66da0ee1e8f33acc088355c2f0e93e4abfc8ab0ff1ea986a1dad4f5112c46f486a1d1a6f8b9af6548d116d93931f99bf1698fdad997ce51263e0555061e012c5780fd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b50eb576fa724141013151db3fe66801fb01f150be3c196047a70e1fc835bd115ff9187b10725dd8393d80463cdddafa5543e4cedcd5864913b75b2febf91db85a19a38b78684cc9cadf4b3a0d088db6597dd003722bb9d825a9082064e51bc3eeaf18a188b89a5de4615b5f0220c954ad46a18a31b82adc288d3b5a7d377a78b885599c4c35d3df694452d47b59657598e437784dd82c7dfce8e03b65a0c3c2a530d33cdb8fe6aeaf8fdb4dde11ea982ac9dedc5a700941c2f661a36cd0f5deebfe8c4b648f88badf4ac3c19c6ca74cf2a24ce56506450d43632d3ec05daf5a9bcac770f957742173eb63b7fb6712bb9ceacc22bb776ab956bc9782368fd4d2b6fa1ad9f01768cb58bead89b323917c6f665475e0222df300700348f005fbe8ab8a89a47a59143590b9cc5dbead51085644c1aaf6fc7c9c5f37b31527e36f77a1eb547315b20445e6b993e28c4e9de6341cc018b4592cd16433c4136f657b992badb3d8aa47436462044799e321298885980913e3e261c5856eef7de1e62c19901b03f0f8cf45a0db1fcccb30e22801ab42f3a382078593e7fec6356f23d23dd74c001419da5ed4d7b36d3912fc77f0cbe7b89fede5147c85a4954b39ef5a7fd9a7d480b01dac3000147fdd817cab3089813d1f55954b3c5bd08df5e5a83bbcb00290d8e895b6f20aab917ef22fb0534fa1938c2e756dec1171cf5aeb23c6f582e5f5584d942afa887561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93614c1f8c55bcbb87ce1813a4e8a3f18dc4a3611102a5652e00c734483b892a61dee1e8f33acc088355c2f0e93e4abfc8ab0ff1ea986a1dad4f5112c46f486a1d1a6f8b9af6548d116d93931f99bf1698fdad997ce51263e0555061e012c5780fd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/da91d607fd954405726ab36fa5677e8163634ff7",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e800000000a2a1cdefdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf5010000003ccba3d9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5100000000276aa1a901227028000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787240e3c58\", \"prevouts\": [\"3b470f0000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\", \"fb0b200000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\", \"0b2527000000000022512067225551b50f550878fba08cb06856b99d76e57e98d7477f94810d7b1bff9dd2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ac4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93642d44eab8720c399910a71555eabe43edd1236492240e69469f7f7192498f0541ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045161570c3f10a90b75a16babedba4ef90c71a7e82b9436df981e4930578e77912a95f177959a3d24a94a797d1e607e5550897d4e95d12a52323e6e8eeeab3383c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369282728574e1b1dad705c3c0a0adb2b81d4b75ec5106c57c346257d4ae7d3e8d74048a48c6eb42f280da39a6557d46ee4318cb4e3319043ed115bdbceba7fd7e7407b97958d18eaa787c1cc29670cd8872e7fe2ef4ae33551cfe5c61fc2827ee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/daad29bf36401da76f1b83f5cd1cc0335bf5c14f",
    "content": "{\"tx\": \"dd2936eb028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49e01000000af2fb8efdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1100000000d31f29b504d62552000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc89ec6633\", \"prevouts\": [\"327935000000000022512008f3b8bffed108016f8bc06cf0d4d62b3035ac315959ae84338bee34a4bab63c\", \"dbac1e00000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_3\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c29b73f6d4115d0c8e2738347376b55bb645c9cb6ad33c9281c831847882821d5ee65f251bab3a02529ecabd935895e97fca13d6ab67c7ace8d72acb94da7407\", \"8d1f1a906bbf8348bae9366c058a6fe47fb27ecda3cd3ad8206b30589f0ae75ba36001b98055c70fff349d7445ded05eefa8b81089d97a610452d99b649ea382a9b321ecafd3355c4a3b6ec2e09daf4862278225be16fa57e54aafbb27bf9ec7fcc41f105ae70897f50b78\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e205163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362cabe4bd1dfe44f9c25caba22ae59e3ed616e0689bb4f0b439d419432e0754930573dffbef728e5f99ec750705b6ff33b4fd9a55f096fd6a737f31f5d0ba7958c431bd7cfd178bfa5c503ab9bb30155f754b7440556fac234eb58007b393c1e6fb24b505461cd1c68932171e021cb72f7a33ff9ec4bbd11f5402ae84f80317ba487c0a4cf32355cf011375687701fe8418d2adf8e5e1545d0028a7dc3585337fb0262e7c9e1c1e177bdbe7391a3265195b8f245141d8d3aeab23f3e1ee9342a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000b759fe35edaa668e572ec3fb2f74edfb27e216052824354fde5b11e7019f9536ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbebe4e320083eed53d867fa6110ab26e788c0e09fcf0f69fb246d02c4951d2380000000000000000000000000000000000000000000000000000000000000000f5fc0c70852c992a99f1b853f11b1f96c9466e2970bea59100d9a925e04cb9381d0e45ebc6eee1203f3e4253ca802a70216924f9d3fcc0d846c53379a751124c1abebf6972bd8dec0eeabb3a7dd423ffd6db53672f9738a6bbd309f39c87e62304cbe06ce13b167c7a29b168646a1f7f6ec8dc95602f01774adf4afc0ab664e1fc4481b20a20cd342cdefd58f3c5dc6bda01d9ef41efc4186145fab7a365b0c9fea2644e2a0afca15d5493009ffdecfe82c74eae4ff314a3775974b43ee68ec570df5e89a63f903565324bf1f73a402ffbd2be955eb9f77a4318e04c24b50e72b0399b5690ad077e97d0040a1f1ef80c25d5c96b430c8bb258a29caf359533551815af5ff8e2965c0426b2a8c66b645d36029d22f44854c58c12d55bb504336e6129379b8aa42604e007e9a69a05796276b2f2dfc1cfcc060d7f2334346d5c3b0000000000000000000000000000000000000000000000000000000000000000dad077641e06245e5d79e8b0d2e1e78402698e2a12caaad79bf0ca77b31ac85300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff25f0d05f1adfb4b6f7f137e15a3076d9204c33d3e041f6861d4540fbe5e18fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7afaa2c6e77b77a4ac661fd898d095eb31421ce9aed365ce8ad2a5796c62b7db7008ae5a86aa245a539305d892736c91fb54d58ba14bfbe8837e70a216c99e74e4e6a4d06cc22e40e3936850bf89196337a582df24d67457843f8ab67dab6d612ed6a19c7672eba3d7a9faee0b1b951a9089e36fc3d813f06c3f5dd6e9d714f8ceb944f2650401eeb23655094c17b6846b621d3fbd7b91a2b644a465b30bb7096017aff21939d6b5e36f9553ee0ee8eae5c6623103eff2e661ae2d49dca2c8005280b25f708d9649a491b2dd6d44143e8f8a4ad8a0ae333499c4edf1460c8878ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8635274c8151c84cfebf83774462c86c2e9cd3a8ff8e932b85a20a8c08e2aa7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1dc562f92ad18037323a661225ea648c987112688c7b8c0231c592e537a44b0e72a8e3ca2db1d46d6631766499597ec88e1169f9620f8218c50a7bacd82915cb5e702081e69eb24fb5b6c7eaf0d40632e9bdb81aa751ddc997607c0671580b6e6c3ed50118115aef62170fa6f14088bdbeef1052e4b53e713d94fc86ff1bc78f7d651b379d743c0e595c742fad553b59485aa1e2fbaf3a1f0c57907feeb76271f72d3536fde6f9cd33b1ab6c921c4b1aa3a4e60db08844023c94b1937b23cf80000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8612c57cd5a990efa9a2a75e9911de9b6a1af594dafa60d9a1fe869c19e71859257a08356782643d9c248791ac934329ae033be1df8847df5bfee34a71e7e64f8876017d09c57d15c33df46c96f26e695d3f39cb930371b405b76dc2e7fbbc94a8b267308c5aca5f3049ff66e72dd6b6c4962ce24a29a3f82cfec426d56a0450601dc3143c29c1131e7d95b1354474edcf393b1320713b90ec3cdb87780191ab951ab137be8814c1c5231ca70ffd4e0ba965ae8496ddb9ac413f4a546ec21282876918e8f99b358acead2ce01d3b9cdf4db89382dd8c655076c07c1896f4d57740612050b5e470d4afb0891b1f99eca2aa1a0c78d1533778ba97e8a798abd9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff023971c3ac138e1865daad101fe68a8df408be7d78d2dc1de272885db76a7850fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ca8e0c0c7af18b1157148e0b76c618e63f4ec3de179fdc0bfa22867fad7ea9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1c8f2e1a2938a99fea74dfcefd7a5befd0b433e71dc553f6b528e8127c11ecbeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000004f5c3932dc531ceaba055d56f02e0277a9034a4aaefe973587dc8e326aacb06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b76cb9cf95dd12747dc8373c8126d81269d98ef9d0b9dd83dfa1f8af7961f1703a1982c44e7d17f44633b5674371174a16b3f4ab4f8f2bb4a79547934314eeb700000000000000000000000000000000000000000000000000000000000000002171a77a6b9a3527ee52dfb1288ed18012b2659d0011d94a481c4c64bb9d82b257a77991677ba0f5067ccdf21a7fc6079dbf81fcf9ce0b02f5d5194afc87fa0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e3c5475f7f3b57a26c1d90a1c543267589e5a9630a57673d1d9a14ef717c09095ff813e02cd4e577b6043f9cf6007ac072abd76b1ef65d5fdfc38548895a657394258661e521e0f6bf9447382c9be6ca6b06aaeaa2f1517f7e0029dccd39818\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c29b73f6d4115d0c8e2738347376b55bb645c9cb6ad33c9281c831847882821d5ee65f251bab3a02529ecabd935895e97fca13d6ab67c7ace8d72acb94da7407\", \"10449375497a886b134261e8fee56d57df90fd5228f9aa236fbede6e1af6ea60f16a12e2fd2b9ae82c6ca11d9f472a19192405da1cfd509bfabdc31e7a080fa828151fef2b74f9d9b0d63bc5b44e45230960bffdbe6c4637831735b2c89206d51770f65059c401cf6c97\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e205163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362cabe4bd1dfe44f9c25caba22ae59e3ed616e0689bb4f0b439d419432e0754930573dffbef728e5f99ec750705b6ff33b4fd9a55f096fd6a737f31f5d0ba7958c431bd7cfd178bfa5c503ab9bb30155f754b7440556fac234eb58007b393c1e6fb24b505461cd1c68932171e021cb72f7a33ff9ec4bbd11f5402ae84f80317ba487c0a4cf32355cf011375687701fe8418d2adf8e5e1545d0028a7dc3585337fb0262e7c9e1c1e177bdbe7391a3265195b8f245141d8d3aeab23f3e1ee9342a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000b759fe35edaa668e572ec3fb2f74edfb27e216052824354fde5b11e7019f9536ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbebe4e320083eed53d867fa6110ab26e788c0e09fcf0f69fb246d02c4951d2380000000000000000000000000000000000000000000000000000000000000000f5fc0c70852c992a99f1b853f11b1f96c9466e2970bea59100d9a925e04cb9381d0e45ebc6eee1203f3e4253ca802a70216924f9d3fcc0d846c53379a751124c1abebf6972bd8dec0eeabb3a7dd423ffd6db53672f9738a6bbd309f39c87e62304cbe06ce13b167c7a29b168646a1f7f6ec8dc95602f01774adf4afc0ab664e1fc4481b20a20cd342cdefd58f3c5dc6bda01d9ef41efc4186145fab7a365b0c9fea2644e2a0afca15d5493009ffdecfe82c74eae4ff314a3775974b43ee68ec570df5e89a63f903565324bf1f73a402ffbd2be955eb9f77a4318e04c24b50e72b0399b5690ad077e97d0040a1f1ef80c25d5c96b430c8bb258a29caf359533551815af5ff8e2965c0426b2a8c66b645d36029d22f44854c58c12d55bb504336e6129379b8aa42604e007e9a69a05796276b2f2dfc1cfcc060d7f2334346d5c3b0000000000000000000000000000000000000000000000000000000000000000dad077641e06245e5d79e8b0d2e1e78402698e2a12caaad79bf0ca77b31ac85300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff25f0d05f1adfb4b6f7f137e15a3076d9204c33d3e041f6861d4540fbe5e18fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7afaa2c6e77b77a4ac661fd898d095eb31421ce9aed365ce8ad2a5796c62b7db7008ae5a86aa245a539305d892736c91fb54d58ba14bfbe8837e70a216c99e74e4e6a4d06cc22e40e3936850bf89196337a582df24d67457843f8ab67dab6d612ed6a19c7672eba3d7a9faee0b1b951a9089e36fc3d813f06c3f5dd6e9d714f8ceb944f2650401eeb23655094c17b6846b621d3fbd7b91a2b644a465b30bb7096017aff21939d6b5e36f9553ee0ee8eae5c6623103eff2e661ae2d49dca2c8005280b25f708d9649a491b2dd6d44143e8f8a4ad8a0ae333499c4edf1460c8878ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8635274c8151c84cfebf83774462c86c2e9cd3a8ff8e932b85a20a8c08e2aa7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1dc562f92ad18037323a661225ea648c987112688c7b8c0231c592e537a44b0e72a8e3ca2db1d46d6631766499597ec88e1169f9620f8218c50a7bacd82915cb5e702081e69eb24fb5b6c7eaf0d40632e9bdb81aa751ddc997607c0671580b6e6c3ed50118115aef62170fa6f14088bdbeef1052e4b53e713d94fc86ff1bc78f7d651b379d743c0e595c742fad553b59485aa1e2fbaf3a1f0c57907feeb76271f72d3536fde6f9cd33b1ab6c921c4b1aa3a4e60db08844023c94b1937b23cf80000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8612c57cd5a990efa9a2a75e9911de9b6a1af594dafa60d9a1fe869c19e71859257a08356782643d9c248791ac934329ae033be1df8847df5bfee34a71e7e64f8876017d09c57d15c33df46c96f26e695d3f39cb930371b405b76dc2e7fbbc94a8b267308c5aca5f3049ff66e72dd6b6c4962ce24a29a3f82cfec426d56a0450601dc3143c29c1131e7d95b1354474edcf393b1320713b90ec3cdb87780191ab951ab137be8814c1c5231ca70ffd4e0ba965ae8496ddb9ac413f4a546ec21282876918e8f99b358acead2ce01d3b9cdf4db89382dd8c655076c07c1896f4d57740612050b5e470d4afb0891b1f99eca2aa1a0c78d1533778ba97e8a798abd9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff023971c3ac138e1865daad101fe68a8df408be7d78d2dc1de272885db76a7850fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ca8e0c0c7af18b1157148e0b76c618e63f4ec3de179fdc0bfa22867fad7ea9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1c8f2e1a2938a99fea74dfcefd7a5befd0b433e71dc553f6b528e8127c11ecbeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000004f5c3932dc531ceaba055d56f02e0277a9034a4aaefe973587dc8e326aacb06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b76cb9cf95dd12747dc8373c8126d81269d98ef9d0b9dd83dfa1f8af7961f1703a1982c44e7d17f44633b5674371174a16b3f4ab4f8f2bb4a79547934314eeb700000000000000000000000000000000000000000000000000000000000000002171a77a6b9a3527ee52dfb1288ed18012b2659d0011d94a481c4c64bb9d82b257a77991677ba0f5067ccdf21a7fc6079dbf81fcf9ce0b02f5d5194afc87fa0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e3c5475f7f3b57a26c1d90a1c543267589e5a9630a57673d1d9a14ef717c09095ff813e02cd4e577b6043f9cf6007ac072abd76b1ef65d5fdfc38548895a657394258661e521e0f6bf9447382c9be6ca6b06aaeaa2f1517f7e0029dccd39818\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dacc869b2d12c823c9a4bb00e5edcd51d35c5978",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fd010000003193dfcfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b54010000005b35cfa901599734000000000017a914719f78084af863e000acd618ba76df979722368987f8010000\", \"prevouts\": [\"5c99400000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bf2620000000000017a9147e06846ce22cd5e23f7e03391c0538498e0e18ed87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"215c1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"81460df501ef435ba685c790d0e36c12bc849c884a1d74cbd9cb660662cde4ab52904a5773b01fb806c06221f2a2cff19cc19c63dd306fb6ad8a66565e62d4b8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dacf3352a5bdd39737fb53affdf284ce61f4e97e",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c40100000047cb6918dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5c01000000fd2ae32903ce9890000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6dd902a4f\", \"prevouts\": [\"8d4638000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\", \"ebef590000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1a6ec201a93e79c82aebcb32c5742cba4049490cef67cba707365d2e1379631f73bd198ccbfa9c702c0592bb8c84a948c36ef9eddfd1aec8278a333dab45811656e171838972c3c3a6cdacf031a4825f83b841697bfdf19ec3d087e2c9ca65f0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366f96bfa32a795a0be15451bd7a8acafde79cf5d8ce79cbaf82150de20d1f80e0d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d513070c0d29d47e9fe7be7df27becdaf45cc7da31561e827162b16aa01fe84c4a24f44ecb3bab6b962a7ffa14a2ce082ec551943f33ce508b63a8ee30ee5e49264\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dadf4bbba1d78a438712afd4e84df10275987f0a",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bf000000003562bfc98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45b000000002c898a1201ae153c00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3607604e\", \"prevouts\": [\"fcdc1200000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\", \"58eb3500000000001656142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063cf68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365dbc42be0fb4d05018f85e57934c949bd98e16e34360285c47c1ce52c024f3275f88ccdecf77b0d26ba8d6f3209049de9d03155be73752c3625590c2269e1c4cf4a62e14d7fc4acbfb0196ec29a60565ac2b3043dda4cedec8cb1ff291b90d41\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b243421d00bd68ca1d9baa1bebc840cebaefc3d7d0b6247bd057554b13606328cf32df52f44331c723f7b513b476c9aa41e2dab3be9ace9864b6dc0f919492d46a7a52674f359a7dbed67a49e09732132053a9cde77eaa564fdce3cafe7738b9f4a62e14d7fc4acbfb0196ec29a60565ac2b3043dda4cedec8cb1ff291b90d41\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/daf266d227dfb92686b3d8cb80cb4d2c4e849468",
    "content": "{\"tx\": \"a4fc63a00160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fb000000004f310ed9015b8f0900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac1b62b249\", \"prevouts\": [\"40f10e0000000000225120be45abe027d497ea26107f03649e0802eba12fae4acacbea0c6ebae5b321218b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_3\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"55f9180acac0838f7aa1a21e01a619dc1cd4977eab715ce88d17747ba537a0054aba6af37c6c42bac656973cf2e4f13e5a4f9d7ef27228ba1b261d9e1af6353b01\", \"5ae231f7b92b6e7ff4b1c248b4e5a75888890d44106d168b427d7340e184ec2857ab8aeef4b5f093a66c7b13a6b984b308c98643e08d388b48a22f7a1db8addd359c3375115f7590a20d16d76db0f81a2d49f912f1728d9298db8ed980b5c421f8d16bccd67770c1a26dc4d6d4e3e1cee739cc04710e519a6b8c728579a1c760652fc14fb76f417847bcd07a9a97255266d9866337d73163eaf8d97c7a9bd8f3b4d49753562543334533417f50d42cc99b7e7d6bc82ce1f67ffc81f8252a06cdbb0efda92e288def8069ac56b08a3c8833913627ab03\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e205163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b20085d1431608a13d9e6d01431e93410d0dfdde60be047e951ef24da4d3d563a1a2bc7c2cd41751e202a72526c257759aa8dc4c33bcbb906937916d53546f277fcfae54ec38d67691557f02c9486972b1f0a8d62d8c1693381df763e8d970fab0cd3dda486f5bdc474013b8bad18ae6d722a5ba69383a7cd585fda02504065248af15a3c286c6cf88b781d8aa9b25674bbcb31583b2191a103a1fee039520cd1bf1183188141ead37fc87cddc1d3f30d9695c97fd00d747e65bd4a7d849628ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9fa185b00cbde494d34ce557c66053774e3d64cd4d41c82296238541df37f7375773b0d19b541d18f41b1e60e49d95bce01c4415a68e11a481d7e4b48568fbfb92e08e3b46d0c7aa5705d957d4c2071652c9a3dc9f0413f64febec95a1bc1f4707aca466883e6bca921172a478d5dd8bd84cd0572fd601163f8ff45fb21683feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff45e0bedf46992462b895ab90f2e44b74d757f7074ccfb73a9d58ee8190489b361eb319a8e4eddca72a02c9ca104b7d00b05ee954cbf2a4ad2ef087218577a2caffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c59dd14a0c109e7683d0b33e5fcbab56ed7fbedc496a2bc37ad2f5fc291f000120456d60ca44db9fb0edf4768044a03e43bd461df4e0d8a7548c718395a74874e4a7f5241dd03ab792a0432554b8a1f5e037e2d586c68921c697c4349a6f57e9bc885c0e8504bd97aa7f1ab8f2e0eeb6b4ca00f7c0007b57e43e27cbd04448558f093548ee2d82731794a40acac6a0162c04fd2b804ec3ab016561b892644939372985ac19d8e73e58fdddfa22f02ae9f3bc3aefe5465645783f4455d6a8e9f000000000000000000000000000000000000000000000000000000000000000020f3ac5b09c24ec47d0a3b7e87fa10cce6dbd8aee340ba8fa9afdf245aa1a200045619bfc6fe4dcd4271da4d2c924f6704c4b81b569527fcbc3aec026c62af5b0000000000000000000000000000000000000000000000000000000000000000196619618544aab26162c4e763b10109da5d92f3b3ecf8a34177dd558f03328dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff397ca559b6ca786194ee70a65ba9c0a55d343344e10b0b11641d21831b294646227c1ecc8d4cf9ecd3cac1c41a56a4c6947d991a122c8f38d348838ba28b21cc8e555ea33dc50534f2d740b3c56792b0b46c9eb674670cfedd74452dffaebff200d095f262b9641d0a63a251be87f585954997437a8745480952fe38adc03aacc57b988d100f65b42312c817241ef64c42f92a647294c92bdf5a912d6215d5110000000000000000000000000000000000000000000000000000000000000000319cf3332908783f8b393a9db63f2c45c8fcf3b58d2024a5b36d4994fa7776d30000000000000000000000000000000000000000000000000000000000000000a11c07e8d5fd88cbba499ac53cc3d4b519e58ff55de45d057a4115e6a3db64244104796de59dfe1631bd82618a3aef5ac88c98bd75d409c76da60cf7e91aa075d12a8fc7a0c7f61476451703d7ff28a8acc17f4368cc21f8e39e1172c2cf7d5222c61a939659ab875f6bc0c71aa211f012c80ffaa9729f49f3b9b788461e540c6c586ad4c36419fc3846fd82ee6bd89a0d635bcab8e990bda7fab24a5d8dc59f23c62fee033a6e645355b86714f40b234af64e3eddf523afafdaf593c4bee739ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0367da238d38b742e29327af08cec9f71a0c3c93503d32b5cd6035a5ba684c90a0ad0e0ab7b5f831dd3d72ce93181a4a2fab4fa10e90e7946680f539150184e07d2e5848296567199ab87909f6259b45f23b3869464b261fb877d4b3614548a891081ddf6520b5b25b6d0d23e1f11b58c82b00f6f4e6f1dfeacb1a81f92f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff851b1a5d164febcd92802d7ba14420652e1fa5cecf9156304d795e86187c1cf92a190b1be1376cf48670e93db187ba7db279cc5bb3d6c30f3130db18d95a231dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff223525b9fe0911b292333d948c81212710156b273d62bbac979aac51264348e17a8622602a1b8519eeb0161b133a290bf32ce3a05a8748f8feba8948f7a2ae1f92ce16ccd074bd21a434ad36c9d8c72c0edf199d10efed77b6f6b305b59b76f6000000000000000000000000000000000000000000000000000000000000000009f230367ae24a8b0fc0b06755bb62c237af82c0537658377aeaa1ba7bb6e6287d274ef14f5f1065a883387bf1a735f355f13334b58762ee02a93a7d91c07c240000000000000000000000000000000000000000000000000000000000000000ce45a8fe9167d4c375805fe5220d93bdd00b8b4ac0385de28f71d631f4d8f059c5e00448b8071c055d284584e4b4b3ff9d8b2d2a46609b375d022eb610e9898dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5e42b4ae9e59beb0239d89bac0e19c34b00b7ed5fa73c66f9665d312cffe7774020372772a41e566516a9f5449f7ad8a25e4e18ff0eaf65e2e8ab5d3ae98f6970000000000000000000000000000000000000000000000000000000000000000ebf2b30bccbb7e5b9714aa95118ef7d1b5dcabbe2efd5c99169bce1882b83b29e9e3fd717a5ed6035c512e8af8ee657b562ad4f6b77a41986e21d177f14c5c239c2e07f4e6ea8697d6f93536e742d756477f3593f36d8c0e737b7260fdb9110c2bb589b0f67c48f52dfa873a05140356c5508bf7b18d8bee1637cfa83207d3004a724018af9ef92756ac5328e1ffc45f8f6618bbd789c7519d7bda73a734d5981c56cbe92f6bab7ef7eef4145d83a37c4f95d3c92daa5a208de8d71620a6e5f072e8d485958a4c1a5862dcfba015d183f1ec4c318b7d278424ba13a6ea8b4cbf24440bd604239bd3ee7909c434904cb49bcbfe9c79ebfbbcb0a49b72a96e7b112f9535975a729f795b119588924b03760c7ca2ae4d2d582b4d761ad50d7c48e840f4dc21a989d180e6e32bde9da1497e9a2af7e6fdb1440eaf2a9bdabbeb8cd9a9a8aa55dc54fdc9d390552d62fe23a61c4ec784cc7829d58b9c41671c0385ee35285ad73cf9a7e31973f81533253e0d65bb924115cc62fcb1f56b50cc3d6345fee4735c9dbf00427ab5a4672ad64b77441c3ca7f8b12e307b99090fe85088bb58c51bb634febc23c5e582e01231835e3b9de55f35884dbaf3b49d634cbde8bf4f35f10548014bd4feaa862f44ccb01eacb5e9f43d74c83c190f9157db8db9d8bb255184981f1f50d9b4ab62596c825feabad713f7e5e3671db6fda47cfe0613ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf3d61e00f7ea105d52de95e2214c64540ec59e6ba70b03ad9644d06275d4a7badc5438c360a1ed0e06f28ce791788a5a1dcd4a38da21c8d537050cbc6e4a353fec2be47ababfa3b968ad98a81c1db525f475fbbe875b5ffbc13c51a27cf8c92509c4a544d5537008c5f39dc9841d45bb1e1db3267ed0283bed4e2a656fd20c8b47ced7c0dcc324c5bfc2aa2392c0079b9fd4a2dbf0784fe1e0500e06367283b295e4f90d8f029176be25607d86d3844058fd54a661f2bd33946b8d320ce7704dd3a0e1733623317bd58fdf32bc93dd192e9a3f97709b6c367728c46947e5b1b75f37336f7363e3df3ad6234d97c87432a2e3ba575e9c096920b313a872d6e502b54f1dff5482e96e72b1ac8720015f4933afc264800e7b085fc465d02d4b0db000000000000000000000000000000000000000000000000000000000000000000f626a941aef43ffd04452b229df6da8fe26af44cb7d4a59362c927484b0df5e3cd73f750dfa56359be3367fb818e655479e50aa8b5a1969de43dda5281d3d57282014796fedb899df18abece1b8f86d456bfa53afdc3767e6ec834d4d260b23cff5fbac9a71946d3669ed6248547591a4c7ed56a3265b689c374a88076450494c684e895b2af6fc6f872e9bc9d180e1dad0974e282e8258f0b875a82c9a90807900b51a7b7d32a871e28b54c96624d0f6d828d0c4dff20b003d5fb016c08fbb3759d99d156356462a80c393e8dfeb7ca0643461411c52d11b4704d144f477f0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a1c50c054395de600f0ca8f4471527e0bd9ca4dcb45a0ba7e863df1ee95c01182162b865a9b136e3042b2ddbe1b0d83033ec2ad60b528846bd18b280d87f43c82e9b32503cafe113b34ab89fd58dfc6e275b4cf912c8678b769fdf4bc4ec98b61e53887b33854f07be5b1a726fa667adfc2cc865e8aa0954eb79e4fd050a96d3c6af388797a01c67e5c682b84b253f9ba48654bacecc6fae35c8d430ce63f7109d1170337b5668c35bb66648600cb1b343cb9064c820ae30abe3b4655941c4cd7ae8ca34736d559ed5b0a98f9c4a03942412b5813236eb73d543aa1750b0f307\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"55f9180acac0838f7aa1a21e01a619dc1cd4977eab715ce88d17747ba537a0054aba6af37c6c42bac656973cf2e4f13e5a4f9d7ef27228ba1b261d9e1af6353b01\", \"304b9b4d1c3487ebc87037fb80fece772541220d1699afc7248dae1a61c8e57210f71ba881724bef0411ac2def288653c7d0546cb8c43cf26695b401442a9f3c1f2346933da58531df56216282b22b086a975d0f3ca59720d473a946cd9c130f5c9d3d45584c1deef5ea58a6836b78dd9d1b8169aa5f54dda1b937092a6a3e88e13e3f1fb4872f3aaaf30f83c473fd53bb02014cc68c9ef4fbdae260792ac57abab3cbecc6f04230046425c1166639f84a39907fbe324c219b77143d998eec88be206e7ea68313c90d4c29a1855a776178ba00dc1d\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e205163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b20085d1431608a13d9e6d01431e93410d0dfdde60be047e951ef24da4d3d563a1a2bc7c2cd41751e202a72526c257759aa8dc4c33bcbb906937916d53546f277fcfae54ec38d67691557f02c9486972b1f0a8d62d8c1693381df763e8d970fab0cd3dda486f5bdc474013b8bad18ae6d722a5ba69383a7cd585fda02504065248af15a3c286c6cf88b781d8aa9b25674bbcb31583b2191a103a1fee039520cd1bf1183188141ead37fc87cddc1d3f30d9695c97fd00d747e65bd4a7d849628ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9fa185b00cbde494d34ce557c66053774e3d64cd4d41c82296238541df37f7375773b0d19b541d18f41b1e60e49d95bce01c4415a68e11a481d7e4b48568fbfb92e08e3b46d0c7aa5705d957d4c2071652c9a3dc9f0413f64febec95a1bc1f4707aca466883e6bca921172a478d5dd8bd84cd0572fd601163f8ff45fb21683feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff45e0bedf46992462b895ab90f2e44b74d757f7074ccfb73a9d58ee8190489b361eb319a8e4eddca72a02c9ca104b7d00b05ee954cbf2a4ad2ef087218577a2caffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c59dd14a0c109e7683d0b33e5fcbab56ed7fbedc496a2bc37ad2f5fc291f000120456d60ca44db9fb0edf4768044a03e43bd461df4e0d8a7548c718395a74874e4a7f5241dd03ab792a0432554b8a1f5e037e2d586c68921c697c4349a6f57e9bc885c0e8504bd97aa7f1ab8f2e0eeb6b4ca00f7c0007b57e43e27cbd04448558f093548ee2d82731794a40acac6a0162c04fd2b804ec3ab016561b892644939372985ac19d8e73e58fdddfa22f02ae9f3bc3aefe5465645783f4455d6a8e9f000000000000000000000000000000000000000000000000000000000000000020f3ac5b09c24ec47d0a3b7e87fa10cce6dbd8aee340ba8fa9afdf245aa1a200045619bfc6fe4dcd4271da4d2c924f6704c4b81b569527fcbc3aec026c62af5b0000000000000000000000000000000000000000000000000000000000000000196619618544aab26162c4e763b10109da5d92f3b3ecf8a34177dd558f03328dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff397ca559b6ca786194ee70a65ba9c0a55d343344e10b0b11641d21831b294646227c1ecc8d4cf9ecd3cac1c41a56a4c6947d991a122c8f38d348838ba28b21cc8e555ea33dc50534f2d740b3c56792b0b46c9eb674670cfedd74452dffaebff200d095f262b9641d0a63a251be87f585954997437a8745480952fe38adc03aacc57b988d100f65b42312c817241ef64c42f92a647294c92bdf5a912d6215d5110000000000000000000000000000000000000000000000000000000000000000319cf3332908783f8b393a9db63f2c45c8fcf3b58d2024a5b36d4994fa7776d30000000000000000000000000000000000000000000000000000000000000000a11c07e8d5fd88cbba499ac53cc3d4b519e58ff55de45d057a4115e6a3db64244104796de59dfe1631bd82618a3aef5ac88c98bd75d409c76da60cf7e91aa075d12a8fc7a0c7f61476451703d7ff28a8acc17f4368cc21f8e39e1172c2cf7d5222c61a939659ab875f6bc0c71aa211f012c80ffaa9729f49f3b9b788461e540c6c586ad4c36419fc3846fd82ee6bd89a0d635bcab8e990bda7fab24a5d8dc59f23c62fee033a6e645355b86714f40b234af64e3eddf523afafdaf593c4bee739ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0367da238d38b742e29327af08cec9f71a0c3c93503d32b5cd6035a5ba684c90a0ad0e0ab7b5f831dd3d72ce93181a4a2fab4fa10e90e7946680f539150184e07d2e5848296567199ab87909f6259b45f23b3869464b261fb877d4b3614548a891081ddf6520b5b25b6d0d23e1f11b58c82b00f6f4e6f1dfeacb1a81f92f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff851b1a5d164febcd92802d7ba14420652e1fa5cecf9156304d795e86187c1cf92a190b1be1376cf48670e93db187ba7db279cc5bb3d6c30f3130db18d95a231dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff223525b9fe0911b292333d948c81212710156b273d62bbac979aac51264348e17a8622602a1b8519eeb0161b133a290bf32ce3a05a8748f8feba8948f7a2ae1f92ce16ccd074bd21a434ad36c9d8c72c0edf199d10efed77b6f6b305b59b76f6000000000000000000000000000000000000000000000000000000000000000009f230367ae24a8b0fc0b06755bb62c237af82c0537658377aeaa1ba7bb6e6287d274ef14f5f1065a883387bf1a735f355f13334b58762ee02a93a7d91c07c240000000000000000000000000000000000000000000000000000000000000000ce45a8fe9167d4c375805fe5220d93bdd00b8b4ac0385de28f71d631f4d8f059c5e00448b8071c055d284584e4b4b3ff9d8b2d2a46609b375d022eb610e9898dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5e42b4ae9e59beb0239d89bac0e19c34b00b7ed5fa73c66f9665d312cffe7774020372772a41e566516a9f5449f7ad8a25e4e18ff0eaf65e2e8ab5d3ae98f6970000000000000000000000000000000000000000000000000000000000000000ebf2b30bccbb7e5b9714aa95118ef7d1b5dcabbe2efd5c99169bce1882b83b29e9e3fd717a5ed6035c512e8af8ee657b562ad4f6b77a41986e21d177f14c5c239c2e07f4e6ea8697d6f93536e742d756477f3593f36d8c0e737b7260fdb9110c2bb589b0f67c48f52dfa873a05140356c5508bf7b18d8bee1637cfa83207d3004a724018af9ef92756ac5328e1ffc45f8f6618bbd789c7519d7bda73a734d5981c56cbe92f6bab7ef7eef4145d83a37c4f95d3c92daa5a208de8d71620a6e5f072e8d485958a4c1a5862dcfba015d183f1ec4c318b7d278424ba13a6ea8b4cbf24440bd604239bd3ee7909c434904cb49bcbfe9c79ebfbbcb0a49b72a96e7b112f9535975a729f795b119588924b03760c7ca2ae4d2d582b4d761ad50d7c48e840f4dc21a989d180e6e32bde9da1497e9a2af7e6fdb1440eaf2a9bdabbeb8cd9a9a8aa55dc54fdc9d390552d62fe23a61c4ec784cc7829d58b9c41671c0385ee35285ad73cf9a7e31973f81533253e0d65bb924115cc62fcb1f56b50cc3d6345fee4735c9dbf00427ab5a4672ad64b77441c3ca7f8b12e307b99090fe85088bb58c51bb634febc23c5e582e01231835e3b9de55f35884dbaf3b49d634cbde8bf4f35f10548014bd4feaa862f44ccb01eacb5e9f43d74c83c190f9157db8db9d8bb255184981f1f50d9b4ab62596c825feabad713f7e5e3671db6fda47cfe0613ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf3d61e00f7ea105d52de95e2214c64540ec59e6ba70b03ad9644d06275d4a7badc5438c360a1ed0e06f28ce791788a5a1dcd4a38da21c8d537050cbc6e4a353fec2be47ababfa3b968ad98a81c1db525f475fbbe875b5ffbc13c51a27cf8c92509c4a544d5537008c5f39dc9841d45bb1e1db3267ed0283bed4e2a656fd20c8b47ced7c0dcc324c5bfc2aa2392c0079b9fd4a2dbf0784fe1e0500e06367283b295e4f90d8f029176be25607d86d3844058fd54a661f2bd33946b8d320ce7704dd3a0e1733623317bd58fdf32bc93dd192e9a3f97709b6c367728c46947e5b1b75f37336f7363e3df3ad6234d97c87432a2e3ba575e9c096920b313a872d6e502b54f1dff5482e96e72b1ac8720015f4933afc264800e7b085fc465d02d4b0db000000000000000000000000000000000000000000000000000000000000000000f626a941aef43ffd04452b229df6da8fe26af44cb7d4a59362c927484b0df5e3cd73f750dfa56359be3367fb818e655479e50aa8b5a1969de43dda5281d3d57282014796fedb899df18abece1b8f86d456bfa53afdc3767e6ec834d4d260b23cff5fbac9a71946d3669ed6248547591a4c7ed56a3265b689c374a88076450494c684e895b2af6fc6f872e9bc9d180e1dad0974e282e8258f0b875a82c9a90807900b51a7b7d32a871e28b54c96624d0f6d828d0c4dff20b003d5fb016c08fbb3759d99d156356462a80c393e8dfeb7ca0643461411c52d11b4704d144f477f0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a1c50c054395de600f0ca8f4471527e0bd9ca4dcb45a0ba7e863df1ee95c01182162b865a9b136e3042b2ddbe1b0d83033ec2ad60b528846bd18b280d87f43c82e9b32503cafe113b34ab89fd58dfc6e275b4cf912c8678b769fdf4bc4ec98b61e53887b33854f07be5b1a726fa667adfc2cc865e8aa0954eb79e4fd050a96d3c6af388797a01c67e5c682b84b253f9ba48654bacecc6fae35c8d430ce63f7109d1170337b5668c35bb66648600cb1b343cb9064c820ae30abe3b4655941c4cd7ae8ca34736d559ed5b0a98f9c4a03942412b5813236eb73d543aa1750b0f307\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dafea52d56a314eff0b38df4ddd35be40d4f6d24",
    "content": "{\"tx\": \"7c7bc09502dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4a010000005814a0c1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf72010000002a1554c90484e08300000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7fc000000\", \"prevouts\": [\"d98421000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\", \"3e4f650000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063ef68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900453d5fd5ac800672ea3242021b662a824007132163c3d52e3d81e7af2ac2d1c56b1aac465e0caf83cc75bfd3b0ee046dffa2f2de04035b6590b107e2b54cd5d5d2cd241e6bbc5ebedd8f50ae206f1f82a1e41ff5c139455a0ddb0d368f52a47602\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93613ba376e93f66744fa625cc79ecff51fb47f28c65369299fa6e04614a4c71f0c3d5fd5ac800672ea3242021b662a824007132163c3d52e3d81e7af2ac2d1c56b1aac465e0caf83cc75bfd3b0ee046dffa2f2de04035b6590b107e2b54cd5d5d2cd241e6bbc5ebedd8f50ae206f1f82a1e41ff5c139455a0ddb0d368f52a47602\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/db01c81c34e5e86ae44bef70289a143173916fb4",
    "content": "{\"tx\": \"24ca7fe402dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6b01000000e24a61968bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44500000000ca3ae0ff013c003800000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88accf07ac48\", \"prevouts\": [\"577755000000000022512054c099d7cf7db0853ef8782c8a4f2f22d5ed4b1e2f91866bde088ab8cd4c1400\", \"60373900000000002251203a052535d72bc3628b339fbda1fb177653fe86e5d6ac7ee3c6549de6bfc2fe81\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670d6a4c90a07321387fde84458427ca433b667233a08bf96ea1eb88ad41e0526\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a92616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/db06c61fa468b40855c83db915cf67df55dddeb9",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1500000000e2737d19dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b03000000005a250c9e0284fb83000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e71e000000\", \"prevouts\": [\"2d5f6600000000002352212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"6b0a200000000000225120a4d11f9ab8dc6b61afd987f8e15499b9970edef61488d41b5de77b1846913dba\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3090bbd9de73322484fe270a1a5006987b8a5c5a65561f363b9082a8a4d72247aa6e1a20569ca99586eb0faf55052c786c3f42a9a0c66427f716bc6a713525b3\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/db191d70ebee38a520718fe3a295896a1840f111",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc000000000567fd09760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e3000000006cc4beb260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703901000000fda958d3043a449000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acf24a3044\", \"prevouts\": [\"c9366c00000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"2745130000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"d0db120000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"6c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a238d55badf8acf8a76486c1c58a90ba61d2c17882158465b124e563f4a2674d94fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6e872a8a6de95a80dc4a6e95ba0e12854eab511c8acfff04c6cfab0ff55ad6b178\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ab66e6e50f0e23344b2fb4fbd1c94b97eff6a18e7892810f712f9b1a97473dfd5b22591e944b414d99fe534a482351afe29b8e90b07993fb7f3f85b72380ca5294fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6e872a8a6de95a80dc4a6e95ba0e12854eab511c8acfff04c6cfab0ff55ad6b178\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/db2f754795e1478498a59b3071a7852a32a70b8e",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46d00000000e4e24797bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd0010000006cf86596dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbe0000000039bf39d9014d7b6700000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5e010000\", \"prevouts\": [\"b9ba3900000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\", \"cd767b00000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\", \"7a8f2100000000002357212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"eaa4642f4330fa159cd36e1f76f94f0db6b32781d14b9657ec806a3f15c9a354be453a1673ceeb5e892325b8164dd70df71151f21c618e823cfa0efb4e5c2667\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/db41febcaac001cb453d4a2ca2a285784d5a9cd8",
    "content": "{\"tx\": \"90a986b40260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127057010000006a8f8b938bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e400000000e9d5c1d403674e480000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7e6010000\", \"prevouts\": [\"90c70e000000000017a914aa4a4e70b11f4eec4760f77206dc93b02350fcff87\", \"88c33b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_8c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9d2afeab3339f6c041d62d67173e41fa2c415ff2b6bcc94668a38ef02334ba32496d5fe93ea2ebbe87e55dd1d8da5746a7a4fe7411c3a735b4cf211f01cc286a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"aae11303411b6934e548effefbf23cbab32a12136172bfd514f6e59db1fea5a8863bbb56364030d301cbe5e076f75dd9fab38029efa2eb81a5fab4aa741623508c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/db5b9f12551bfc0e07e9c89d6d5971df6e4eea17",
    "content": "{\"tx\": \"e790d7e20260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700600000000a8b6c4cfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c020000000097a222af02a72e6200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987f3a42b2c\", \"prevouts\": [\"f69a100000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\", \"dce2530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_78\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2788d8a89c370d99883e88f683d3c5384c214aa6ab2719b7550df346a013c182b5a071050fa3800882e97e857395bfd448bc47982cdfe0ed5e6e63a2d42d5b0881\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"36bf1292f13abd6381161984681530183cb2bc712718ea61abc593a7c3252979ad679f6307aaa79d0ce3e2247df304e4413228c0197d06e2614f0a3ed5245d1078\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/db715816bbafa4a288124a98d0cb4df6a364cb3e",
    "content": "{\"tx\": \"3229dd7102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfca00000000dbcb3ddb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704b01000000c5a717a901a974190000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963a010000\", \"prevouts\": [\"a632640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ed0d13000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_84\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"746fe437dd51c6f5dc427aa5fde5d23e51a912ed8e1881ea7e1c79127ee0618eea3264fb81b4b8ad1048f8515f5750e4ea6593e68ee068bee03748a83e23c05e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8cdb8a151c3976ba31f9f2d90682f43e18a1a73006976fabe14d189f4aad042319b5a9e4a7fe5ce626b300e06ca341187c9e91ae689700217e86bb09570f9e0b84\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/db81d6ad0913097959d953bb6c2e7d576f846a11",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b790100000051704d828bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ab010000002cc3b20304c1485f00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcc47cb040\", \"prevouts\": [\"74b026000000000017a9144582b7676ffb8c3a2735b8e71e172a272e3e33c087\", \"3db63a000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"215a1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"459f4ecbb0a3a82d0080a8f3151984c9ade2caf1cd3d49ae1dd72ebf8acde1e29413500358c6cb02169f4883257b111c19e68129849ed47cf2f036258c963cd5\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/db9eba0b2b563ba067b7fd8e8ee5ddad9b770dce",
    "content": "{\"tx\": \"56793ff30160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706400000000bff850ab031d17110000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac92030000\", \"prevouts\": [\"3f2113000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e15f20acab37c5a5cb044828a71c51f411f3799e0c9201344692cb6121a679af6a96525fdd0eb5f3c5c39bf5b04d78b37703e3d3b538b36e17fa0ddbdeb236a5daa4337ae81428241101d56ff91a1822e405405037c9afab8da6ba5df5d84918ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa108807fd1da60fca18a375aa3fa2202a3eae5e0bf99a9374f58816bea445c879688f26c44e4c38ecd8996ded351dfac291f6a9fe2ce500158a378a1caa9ee2234a5a049dfcee5b69ebdb7c70e6242c675d1abc9cd58c84d7f9a8e8e1277a43a4337ae81428241101d56ff91a1822e405405037c9afab8da6ba5df5d84918ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dba31a12d1adba28878c2a0b52b782a5c72d9972",
    "content": "{\"tx\": \"c20c2afe018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44700000000364b2a8502b5253900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487b1e3e120\", \"prevouts\": [\"23af3a000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e11a0564ffbae55e310260a86fb5d8e023b18d3b1f7fccd674c43ebd3bc7ee476ad1aa2e9998afd312977ef35369de24510af161418b16660639891f4f8529ff8cfae4f24e00136258a4229df9ce1533cc743f70cc4e5c0214ad74c09f63cc0b9de97a2505c9a0de734aa1a6c773f3979bd21cdf34ebf80e6ce3c625c087f57a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93631892e886f9eab59552021ac67ec1685d33f952811cf826cd2d9160e628fa5a644d0ff37a890039c0ba21f76704f7cfad8b9e86a035546ebb7c5a6ad2c2135a28cfae4f24e00136258a4229df9ce1533cc743f70cc4e5c0214ad74c09f63cc0b9de97a2505c9a0de734aa1a6c773f3979bd21cdf34ebf80e6ce3c625c087f57a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dbef858a545baf2d110f1d0e917e4ad258acf993",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4470100000039193aba8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a3000000008ece121902c3e279000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787819fc62d\", \"prevouts\": [\"8ad53b0000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\", \"73f74000000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"1f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362175f5032bb3b53c0a968ee3a2c82bc18dba93c9ba8710418637c72c2d6d5ab6ec0d930d2ad3e784600f5ffd1efb1e58c37063febb6da2a9c1576d111e3c4564ed661e9ebd30f651fa020177c2a1e4ce51b505c9194e43d6074b392863f250ba\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93675adb4fc0189a1382c89853bdffb590e4ee25bdb1025c4992edc4ac6fabdde4de576fdfccd5cb93347e3ba64a7809a8c9fb7be90a7e18659d0b981582f285e98b3e02c0e1665e1d6a4b6ef98a6ef3a3632c98688db315e4c8eb8907479035d72\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dc01bbbcdac6b5bb939e4be9ca56e5b8c3d165af",
    "content": "{\"tx\": \"78fb85ab02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7e01000000c5e6ddac60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708e0100000019cdf7a804af2e3400000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acb51aa824\", \"prevouts\": [\"0c31250000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\", \"2b311100000000002259202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"a85efc3365bad0b94f18bee63a98e02288e29fc22eb62c5f052f41b29f60279c153a5df2b7f313b969c88a1208137dcbfb528cd2393ad2a1364a332debbfcc43\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dc0806f74a893b88a54642a35cd820535fde3ed1",
    "content": "{\"tx\": \"6feaa06102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf13000000008c1dfd8060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709b010000005302e8d802def79200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6bbd63d48\", \"prevouts\": [\"853382000000000017a914a8c07d8aa161ec0fed82ac1dc93d81dd0a92012687\", \"53ae120000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"217d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffaaa48811ce5d96ea10d6e15d7cfc53aa0391399ecd77424ef22989b7ffa3a21a54b706cb1ffe8cdd8302265f43043d8c7f0cfca18957505a6e0d7d2690f95c84bdfafc9427bbc75e549436fc0749ee4f6acf063a9661c81b3024fc653ae79a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369c5c44f52676cf7b33376b75ee003282f22d070fd845339939cf148bbb71db7cdc39cab162b5ecfeb387365be0497ecf3ceb69817352d9280526c0f75de7c14184bdfafc9427bbc75e549436fc0749ee4f6acf063a9661c81b3024fc653ae79a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dc161355dcd6047181d0cf4e25b6a5525f6fe50e",
    "content": "{\"tx\": \"81800ee502dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bad010000009e677df3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3d010000005da75ce303080a4500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e785000000\", \"prevouts\": [\"6a952400000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\", \"9b09230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_9e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7c9bb0acb751426c5cc6ea32a3f5c9347a563ef2988d59352005d1c36cc6f0bfa59c4e63837ea561e1d1e26a84e6276861a1d9624cd749494f17757e17e26c2b01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"32f21156cdbb9ded6aa9fe145d74d41b68d28db695f49c8fab7b369fc021e05fb27ff582fcb87c198c65366d897997a3fa66fa6047fc1093912012c7fdbe8b999e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dc3539d6d3a6a1eaf48ce5185a088eb43b9e383e",
    "content": "{\"tx\": \"50f7ec8e0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706701000000a45b1eefbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb501000000d4e342ea0211518b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7bfe0a757\", \"prevouts\": [\"10c212000000000022512019a5b11800237af5c16615500994d92c1a7914053179f3c566b1561c365a8348\", \"41977b0000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b151d05f5c544acd5f2fff279a3779ee8e89af81e18d97889353464eaadb130e8d3413ba6e577baf4d8733c0b095f735ff202c72d9575d28728312b33c499e7f4e44d8f0ed55b71ff8a33ebea3e1652fa9859defde465709be500aa03793b3b9b07561ec0126bc3e82d419006d041a670775dfadbe4e9e78025cb2b6d140da291a4441a0adef86c62c7dea5c5b1ed132608d00865780bc2f3cf6bb58714f97eb297a5b4055ca996975749aa2a69f2792f39fc0e3c0340f33d60bb232311b33a8fcf95e330a8e5bf4352b0d3c29874702cad5c5ee93e40307a0697dcd8c03de4cb9ccba6a679ff08b660e5b847ab96d1304484327d32d1c7531db3ff32728a2fb7c72a763081dcb518d811584513db3cf2be291186e6282921ad0ba3e9de4a7eae013147022dc494ea27fd2df005abddf10a820f9b7b4a9bae2ce7d0315656fe1e3099059fa0a07c69f923cbe9c5c50e86a431922f4fdba4537c5df9444d653e5580a6e3cbbb7335192c1760380b652f028af1727be33147807b01c0665ea90b617ee004dc59c606e981ef4ade9b226b2598c3041f45d07091b87c42d55767dfc4dd835c6ce1ed27645b8339df3b93270646adc22e396685605f5a50929fa6f3f40c0e35f651d8fe82ed4c6a97932bab711eed801a2d8686f447248d5632782048991fe2584f2a532df7f58ca64ca6c64c45aac8a5ab26dfc1a5cebd0a3c66606bc3bdf1d1f8312c54275c2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936df70b12ca9ad71e3708c972229d1f7eefd79706f0a4ef65e90c6b3ef25905faef0288dcf8f2e1e03125ab45cd0efca3a23715e7661e5c17627e98d50057f87374b5cd80fb8cd7c947a98554a389db356265b198fc72df311d010d98c3d6e3928\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902618d6b37504d0441f180e56a75d19e5e3302c2dc67943293ca97dccf79de9c8757aa9259f2d7806dc2b6c389fe32a3755e0b3012fcd2a6eb9ee38a1c5e1ce2691cd369e5c50b7f74d07600fbd9d1f3a1e178f5fe032dcdcc0a2928faebb3ac395bdc946d625cbbbc03e3613df56d48022e72c362e06b078f82e765cd80078dc15df41d9a8f77e9483b19a595ab1462f53d42c828a5f7600ec63d67466ea1d91df6bbd1696569d02707c7512a654c7398734bbc132037c8528700a44cd86417a5ead73157f285a5164a3a5ff9d17419c6cbc20c8a32651197418e4edb7b8a4e38db201e8e97aa0e04edcf0c5d3b9388f191faf37aa3153be0fc9d4cbd505bd91d47c8c530c37391015ec0047816b4aae30d91a0796a6b9377e32b9a69c5b75aad97eb141a3cd2d0d0a766aaa050ba03403171fd31895bb63ddc5a35d440b856cf994fa1dd9834099dcde68eb90c988741bc87d4a062b6147829b5b44b6e873fa553e8d5ce15257a4b2fecb4e4d130f614618342b541b848b2e7db72cc0d90a7a835b8d04825de3cd7fd3b8aee2d42784aec89a48cca971e681e0d87b5f43726426d23498cc28f7eb13ca9b395c1e345b2fb2cc16ace2ad4dd025aa492ac7c20505d2752b936b5da44acfa0efb85b48099a08d12a082167ab3e2cc9ce36a09a5aacf12fe920f43ee3144d4a5e2ff88750f688c1055e8c7ac4190cba8691d0438f210dc6a4b51226e9a037561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bc1c7496d6757072a067a779454a816e2c160e7eee0de44d001da2d4f54ec2983f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08208660b63218e506e6f6271f897377780851eb071546e65f7287d9a4083d90048d0ff373d5c06b418f4c5ba421f2e23a69b22cb6c2b7cf326686bcbc29e387cfa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dc480267e0ef9ce538b42b77872f2b3532c35322",
    "content": "{\"tx\": \"c5f01f0f028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d50000000053b9fe8c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ea00000000961af2b201963241000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a653040000\", \"prevouts\": [\"1b69330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5a393e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_2f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"01e67d9236e680014b0a43138816d86775c08e96eb5097d6286cc11f1af3584e0f3d9e485fbe7ad42e6b51da2f6358de56b8892fe01be323da3409b86a82be2182\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7ac7473fc85b9c2eb526adddeb3d8ffe2caf07dbddcc9c7abef2e572eee73d23fbf64d26d34185b466652df784329359d5b19b6d4b077315b879cdd95657b6342e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dc57d8ffab2a6632708a04cb288629b09aa5c82e",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3800000000d4d32d95dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb4010000008376eebf04e5a4bd000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac14000000\", \"prevouts\": [\"7e08700000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\", \"c0bc4f0000000000165d142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"f37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936111cdf76836f174788069938d43a1f118e1d6048d7db416209f274b647d1178e3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082cfa000ce8b9790c39a5d5a4e1f475bb1ef714fb8e08d79945cb39f042227236d80eaa4a5149b34d26f0437dfc3cc15f8b829f232fb4e000d97f0d76bcdb6c884\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368ad006099a5afd91da2bb050912b31486a1a5f178aed6fde7a35ffc349c590e4cfa000ce8b9790c39a5d5a4e1f475bb1ef714fb8e08d79945cb39f042227236d80eaa4a5149b34d26f0437dfc3cc15f8b829f232fb4e000d97f0d76bcdb6c884\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dc593bc1e5ac44230400eae2d39c99148ad34e4b",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fb010000003f2b16d5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb10100000040c4b8b401a85c0700000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac817e0b21\", \"prevouts\": [\"29c23b0000000000225120b5fac7f9d1efa21092b4bbfea1ca41fe5694dd20d67936ab2b478b1ec4aee588\", \"3cf4590000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"da7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823fb4f37cceedf64e5ab756f8bcf3191fe56bd549db8641e271ceb60581364e38eb0481d56926b359fa3e2e34471adba51fafc61fa70dea7541795bc082db9408\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93640073767799ee8ff1c3237f84bb48a6083252a313c1fa00b27a2ee1d2ebb2429bb1bf216bf716c84a1c7f4bdf291db4b4c93f804d437ac6faff07f214860f972566ba3404d3656bfd0df4a55f82c254cdba579fd51be164a5cd21fa2faf92a44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dc6dcb26e66c42982855aa1a52a31fd33b250e19",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8d000000009628e1ab8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f10100000041654ba460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c200000000352cd7d102283e7a00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7eca46228\", \"prevouts\": [\"be4828000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"99de42000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"344811000000000017a914d574841bde7bf0817694c799002118e85acf040e87\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"235d212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"69e6bc89953f2b0b0c076080e1b1bf82e003d213bc47f2decb4bfb7dd00185074d1f0b339d45eabd92e63f1bdfc039a5ce924f42bea5e81dcee29d9e9d181099\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dc9395f17d85f800578e0d6e8bf89ad9746befb7",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a0010000004e3bc7cc03dc0f100000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487eaddd940\", \"prevouts\": [\"37d6120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_59\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b6d3a366aff24b46704df81362b580979561a3b16a1c4d76434e953d807fdfe29a4c23a73ba23e64c4bc5aa9d740b938e86ac7950e36377352031ac309fa882083\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9bfc637a2a6385d9b8593f113685a19173e12cab9b1fefa49cde86302930010671a0dadf6e5138f2167e15616224a826a1b38722abcee3820132ee2950d781e159\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dc9899ac6fe73116d5e9f16eb5d414386eaf20b6",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a4010000007ffa04c8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b250100000082473360dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0b00000000b573fe37040fb04f00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e790c8515b\", \"prevouts\": [\"d2ef120000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\", \"8cf01f00000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\", \"df861e0000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"7c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac26c11d7825777e0f2ddf610788c970bf175cde25cef7de4e72e41494d53bd31202adea3ba63b8efb220ed0b92cf765f01931ebb31f4963f663d14c15b1e6099a711983bc616996e2ac47b27808b31a9b7e87f7ce1f3571999dd3a2a57f1080\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d5fbcf61a2a7c737f60b9029794ca77d60e8dfd9dae9f2322432c03bed71ef108eae3f5bf5f4c26def68bde658fd1412dc2dfb494d39d6b1bd4ba6a274f177d9a711983bc616996e2ac47b27808b31a9b7e87f7ce1f3571999dd3a2a57f1080\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dc99d264d246e0de31744757d56e34f81e69221e",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270780100000092a442168bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40500000000ac1f958adceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2b000000009c4898ea02e6d16d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875a481120\", \"prevouts\": [\"2b3f120000000000225120c10f9a5287d6d37684b1ac107332d66417d952fdf60fb9cd3e9fa5de48c339b4\", \"fcef35000000000022512070bce5a25570b494d89a85af7ba09d895150a56587b7f7acec0c02ca42514b39\", \"91f927000000000017a91452f6f26c4daf61bee17f895b7ca2f2ddc941756987\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100f42f6c018177cb6f7105c075f99d29a4c97a752dd0c249abbf778e3c64da803702207c67f762f80a9017759a0a8937f633674b978e631e3fe50f0560dcbd1fdebf47824104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402204603179e9745c6afe10773d58da9ccbab4370b6e6797d3c23e24133311c6ad8502201b8b93b2a5ccdb37f9100d56efc80eef597145e1887b75b74281ecd793cb61a0824104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd218931976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dca299a0e651d9aa555003ff4a5031f3fccf9743",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa201000000a54e1d1abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff600000000058fe3ae01afaa8e000000000017a914719f78084af863e000acd618ba76df979722368987b0010000\", \"prevouts\": [\"b38b84000000000022512005ff23ad1561e684c08dc4654c3a622730f716f9dbc5d4d5a4cd20d536b8ae37\", \"e07864000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361759826991d2ee0a231520f5bcab8f69f31b666272ed9a6e30669b1001adc5384cd3bb01e072d01d43d3082324ff6e625f5d569cbe89802b785fdd288bfd31c9a3f8f9fe88f0f431b5ffad473abfcf1c4b340e1c7daa1232bf4c86f035b8cc51\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8ee33f25a3bc4431a4899fa373225b82f91b265358d1b8c12eb75241dfe6f4bf6dc39ce81a6fea632ecf565fa45d7a7ca50aa2e3b548038c9066d72b539243596a6ef766bda57b4717926485a86d332fc460fd2733e6a54825f17015621dd4290\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dcaa02212efb1b1d7b35ccd1cd382be6b3e66e71",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfae00000000c465f18adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8c000000000e1ef5a50158f18b000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6221bfc54\", \"prevouts\": [\"cd3b7a00000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\", \"c6be550000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"807d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a0a4157aaff13ca2809f2717d1454e35c7fe22b58bbf3d38eb14bb2d8f6dda2c9bb3dc44e72947935649b33aa2d807ea07560e0c2333a7ee2c40c2820b24a64a090cbfbdc5dfcad7ff4463f3cf2898b3c754f5d70a369d7bdece79053e0da647\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e6d3ed6bb397f900bca42f5c55206e9e9a5556fe68666fe0d64ebb28af9dc03c732beddb8df376ed0f15f8ca557ca4fa4dab9ea34398a6bb2b3d4cd5dda00bcea090cbfbdc5dfcad7ff4463f3cf2898b3c754f5d70a369d7bdece79053e0da647\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dcbd31842dac9e7cdaf7ca65e510582bfd1d1a9b",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6f010000000801f9338bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44e00000000cafb6acc04e6afa2000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac06010000\", \"prevouts\": [\"8cea640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"606d400000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_d6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"99797b3bef2647f0fc3e108287a672fe2690ad2f27eeb822b6af994efcd1d7fd99e746521c2b5d4c5950cd4de1dae34a8e5f901e1d03bc340b0e61d8d8d1180e81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"42bf19149e0537555a9aedfec5cf298a03d6d1cf9cbee9c02633db46777e2f7d68be071519d2e6225543a85093bebde0c65a44201d746ee5e1de054c727f36a5d6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dccaf2fc47adc1a3b05f03d5fac2a95f989db10c",
    "content": "{\"tx\": \"5c4be34a02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe001000000849623b560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127009010000005cf056c8010da88300000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acf148915d\", \"prevouts\": [\"3a4e83000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\", \"87df120000000000225120656f89671a8f47d6bf2e8e427ddcf5c0f85be8fade6cfb3bd1e5b2fd091df805\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367113f827a4d4aa8309fbec7694384e6d0aea4a4c939b956fb497455d6a3b7402\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a7d616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dccd7c4272928f022003ea9c7aaa12dcc004a54c",
    "content": "{\"tx\": \"bc10ab850360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e20100000056ca8ef0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd500000000f9c6cbc3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfc0000000042284be90453929600000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e73aa04c47\", \"prevouts\": [\"1d5b110000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"dc1d28000000000022512026e2288702160262aebf9b5500cc105d511ee57f41882217b8afa588f3f75fde\", \"74b25e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c35cd12e8df2fb297eac9d1d135ad50ebd5c464169db6cd9048b151cc7b74cff30080bfe0d76f5066f10c66f5d5c3ff5fe5758eecd3e6b9073fc254bed53c0ae7a5a7f6c287e55c2508813e4a2d248a2412565afbb00cc59f351354b41e897d691cffbca125e9cc38dadd2bd6a98fbb0a43ebb9c62fa8983d26463a9832d19fb411274d4c7f5d6e4b9a56ada23903fa750e271ba59746401cd0606e400be1948c91bf922835d303611e8d7d6f74a6f21af328a37ac045f1895912150ca9181da44410b8fbfe45ce02fa88dc842f161a8c058ea95504a177df9b83d21fb749bfc74c3873c7cd0ea4e084ffb352a1b6b7d97217a6b468aa140a782328890859efab80349b7e9d689a6e588b87397903a7c54fc8b79b82f985f56d3bba6ca35c940fcfafcc8fbd7d1aa771b6aa91e6478222b3a6839b7a5a174d8eba8057fceb5b4516e8a5fedd334b26c57fffc8f4c4dd2311212e87e176ed0bca301c5892bbbdc608766c77c1c8ae9fd65ca3fb91952bfffec93d0beb79cd1d50842d02d74129e28924de0de4ea1be5d02e808d7f87ea2e4db9a635abad9f010e7547e6034b1f68d900268a7aac3aaeadb2d0f75b9017756b8e7bb847053ba194f6bedc7b48662db89a5943ef93d2c921fdf32d517081d7cf6c12d3638aaf5395805d5657e6d1be568a1036aeb9b78a4025cefe05dc5ead041670a24224000cdff2ba4148d1107d832450fd66c7b3a1775f7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368e053cb9a5d09bfe690ea9eedb365d345eaa3c8a3a4d080ab62035ed4ab4aed83e2d335f383706a312226510c4ca5ed297e59b2981bccad977d4984b4ab81a7bbe0beccf8b53a38f7a20d51eb008bdc60f78fac094fdd23935202ece673d8622376e34112ab1bc736956b41978cebed690ad16294afa2ba0e9d8b5fa7e9f6f2f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902adbacb7afddf1a2658f2562dd9d05cef4dca2c5b5a80cdf085afbd75b0fa25fe94e951d0bd501d86d1a523db7db3e039f84aa26d1c3891d01fee2a5b52645b26a9bc08b60629c89eabbaccbb714419f52fe39ac746b8e6518c5f4782e74988c70f0fe5ec57cfb9713595c9219dbd29e9afece13d20eae6855e297f2893ab244ec7948f513e22243fdca3961205f2ecacddbfab385edfd5cef8404288a95b099faa6388602ddeefd5b97d1ddd4047cd504f418e770251b58f7b4e0f38f3fddbbd39f51f97ae2904fdb80276fc00da90e8cedc82d201f4f6e6fe89e72168f826cfbc4ab45eea1b564629e01706c5e6659f2768bdfad1b65af704b4559df38f19cd1c10a888a3f1bdcfd643d231d316835f2c78ca297b6acc7886a727b386ba9c2a79ce978e40edde47bffd7c10adf01479b4c9298f789b348586971038b4b8f87d481a1876614929b14270edeab577b0986b222919d1a6e05d339a7b4e9fe49487eaaee65571644aae9eddee531d1cc22553abca3044de2f33893ebea6e4f54747052ddfc1379c73b40d19c6c665c12e43cd5c4b410914c88b406b86f3e00b80973581d9bb45a143b02ff8f4ef8f13d1863b5deb68eb4003bcfd0b352c59c3bcf8234d41cecf2e380360009b3f0ed6b59f4ba6a835b882a1b2b80b0fff3ee410d1d8c41f0eaa2d3b70340e46c711d7bfb4409a54f9a9ce88feadfb1f42b73495ca830ad862bb77ffd4f87561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082c18d13f23505bf80401329c8d1a0bac5ffbe219ba0d96925c38e985a7086f175ac8db205c7d3bb0390b2e22910f5d1cbad00807eee3325f4c4e7f4412ed3064a1c25c837ec0a1f852472f3f26e6d49055bb98717b7b68c46cae1e5f9804f9145\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dcd041ba07357566b4ee1ed3cbca6574c6154f10",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf56000000009d725befbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa600000000046d18dc04521cf200000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acbc0a924b\", \"prevouts\": [\"e40573000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"c8ad800000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"30450221009b401ebef219005e3a57b6d2be0cedf1a32ad249bbea0bcaf018dd0d78d25cfd02205722f3db1fbe3135c63e7458cc0026e0c2d5ea86cc0faa7867315a0bd906f91d82\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"304402207c56c6f56386fec171bd13e5727eefd8a6873247188b2160d6491f7e26a3689702206b0578c1093d9edeaae3eac932bae1ba5a729c4926ac878176c8f671139a8ce282\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dcf7577a80ecef6f3ca732dc2e3adaa48e682fdb",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700700000000cf91ab8ebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1e010000002e60e4f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43f0000000034add3ce038151bc00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79695b58e1e\", \"prevouts\": [\"055d0e00000000002251203236882dfaab6a61030776953d98ee1af902cb36dd280fe66ad8ee191278ec27\", \"e3536f00000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\", \"e1fd400000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b3dde2cf2529f9d05b2e5492588ecb6418b108a4e637793f6ec2e549504b90ce\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a59616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dd000d20a2f313c18520373a1f18e05ed9a150e2",
    "content": "{\"tx\": \"b1bb4f9803dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2400000000817a20b660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127002000000008e1dc3c4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2e01000000783f4ee701e06a59000000000017a914719f78084af863e000acd618ba76df9797223689870f010000\", \"prevouts\": [\"90cc23000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"7ab50f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"546d5600000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bc4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08220e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e14a8563068286881d42b1c4901d93a483973910fd5653bf7ebbf040741f7cd837150e68e664a4d5c991e5183d0e7966d99b6c66da3079bb04bea44808922b61bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52bc\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a882b0c6bc267a79bb740ac1a2362d94d3f68ec4048cb2b97f57abfb863c1e846628fbf290b9055f1812e9325160cdda478fd06188bac581533b5ab5319162eb04966f092bf1e4b4348fca11e7254311373308f7fc15e3d44d6a2afffa343c9657ff193055e5853205a1117b7666344cdb66562f15b4d40280f3656784bf5cd3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dd0b6ef4b264cf0858480a3460b856a1c8f6dc1d",
    "content": "{\"tx\": \"8bbbb434028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f7010000001a4f028560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a5010000007c0d8cd903a9a243000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc79e010000\", \"prevouts\": [\"bcb73500000000002251201aac33169e9e7c3154d6a008d33b220a63d8a9ebf4646c8ee915f75ae7529b5f\", \"7f111000000000002254202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0b29c03cd81df73a2b574156c0daea3474ec5851a59a011a7d667c3a3646addc88edb1946575a4f48e3b2c20e66d9cdda77515ec287f3b5e972d0c7858810a34\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dd51571565035f293d86c40ad779317f87aedf8a",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701e00000000c57d4392bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4d0000000052ad4c7c030fba7b000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8b92b750\", \"prevouts\": [\"9f611200000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\", \"65ea6b00000000002251208b7fe9d4f09d2d8e7a4070c707b9c580ba6935dccb7bf02b3c8420577f22e1d4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93684086780442dbcf859ffd73a59f855a4b5c3e4d7f57dc79247a591757b7f2310\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a04616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dd6e129061e453f9a72be030e9baeee3e56fcf0f",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4280000000012c312408bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44b00000000ca4d1b9204be1e7100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc70b020000\", \"prevouts\": [\"7eca39000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\", \"85e938000000000021551f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7ee4a8652a801c81f21832a7f20b2aeeac576839e9f39d404e47e760404363a752189c2e02859c0b294e9c8d33bc582084722dcf67aefbe0d7c9864b0815deaf\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dd8c174c7b3d3ef26b6db13442b39a50c7f55222",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be001000000a799f40abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4f010000001e21c462bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9a0000000077dd0fb3022989fd0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a611000000\", \"prevouts\": [\"025a1f00000000002251203d94c30f7ef8b0d9d4c7a773497c0af2bbd0a232f6e89c19e65bba66d7e2056b\", \"c0e969000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\", \"f4dd760000000000225120ff67dbe5f480d52a3db68ddc8756a5701c353a5e478c53504b3368e48f095423\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"2b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ed75fc84f2af88925f7ad475b3203cbf9256a43a0cda52d14a3416be93a7fb1c4d74d03d2cf0ae79996d1bf896237ca201e78f1b4c5ece550af4c0e01e9fa9886\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eb23e8c041b6f4d0a05567219b1a5ab7cf1a58d3c1a796ae684015a86918ec863f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082885bea8937005622f3eb8b2c440108feebbdb5f3ff09e0402c722754cbcd9b2d195038de5261112827291f7af9c58b034003ed818b7e5ec0d4ccdf81f6c2ea4d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dda325195c906944f23de872fa78b2af88631c09",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1c02000000d71284f38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a6000000003d5157d4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8501000000f9d154d30318e4eb000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac33000000\", \"prevouts\": [\"bfc05d00000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\", \"4d2b37000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\", \"cbce580000000000225120aa00b33df18083b0bc269fd07ade71d6a19be5cfe3bbc4e226f77b4058e47cd7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a6bb84e606fb4bb9387730170fbca9e5289d9440f7292b1ebb809b518ef1c84fdc80ae76bb602ab42c46ee853876ca8af61f2b21e003be040fdb009bd17dbb4f808384abb6b187f3a97f85a063898a14354bfb17bdb5626bb6d4aa801087006088c291dc1aa090e3b655056beb5ce7365d5ebffee3580e955fbded69dfd9656f305ac12737920f128f98e38724db72105d47ccf6840d2d22c6868ec556696fcbc081736c6479355882158f8726ea12bbf670d0eac31becf906b74921eea7a9b485468c42290d70e72261e0116bfb043597a3afe9f7779165e7d71f7cec739431151e0782a674060d44293b0b30b0e0d493e6fa018ff3060b0ba0c13acc5c5d9f8cef8ecfcd7f3ce64c4ce9155b12d09f350591a77e1bc9621af17727c816cbf27d5d69b57bef31e5cfa79c3d9e13787c9d339d245c82eca9e912a0a8b367cb289dd644b4437e5102db1ea0cde98f315bab58e280843fcf83d43273a407759260d8923d41234c55e9b71d39bbde607457b1b3b3200b8003b7611559ee92765aa262750cd1d92f91292b98bbd0da028e4cd990d8b4d5e308d6e244d229941183f85edef40a13349eb4c5c53df23ab5a6db33699126fefac34a2c7bc06dc536eda3ff1e3d70568bba7896e628358410ecfcbbaa858685a949833f02a8426c1b65a68021097bdda07d856151940ab1e401679bfa34cf7f12c294f7d9888afb651ec01ce26bb3e3f800737475\", \"577d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bab7869953280f6d3f7a7bc51b385a6914d08ccd41c6d33c824b12a8cb000a8b3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828cd69c149de1c0fd775c23d200817106db3811e77c5a94d49bd03e58d7bcfa223a8385792857b3824bc259fd95f469eb32c57805e5f383de6590f06749d208e6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902abf2f600a9304c04bcce9bcac11aa4bf71b23d1edc75714bff9d6d16c8b4c5f5f764a7fd68bffaf5daa76d8e6d2178c799216e396add1c552420f5f03b5f17cc42999a48a67c6253858a591c679189f0512fc421cf88286940215c9da0c89bf99fc0eeaa098a302b407fe5262103b0c1c039ed5486baa49ef6c661a987421a1fccc490adcf1c3b9355bfadf7f64d98b9b5ebe547630205f30ad78b502369ea7ad94967397b938f2f8dee79fe42d0142588028f3120f3119a8749aa662a48d6d4a1682565e368c69497c961f651f541d5ec37db7e1eb5d0943dcf7d18814ca548270db782a374b5fe181e3aa4d71316491cdcf059eb3aa8360bb2249982e57a1ead8a1a033f063f64dac81aac257489a8b482531e8659415f9211e572f2a9adf107e4678e472f40dc676c071e71633d1e750fcfa9e567a932d6dff1d259b3a949c07c2e07af45a964fbbf0cd03fd064c49db660e1cea47993dace6959ccfd8f9ab18e9dd74363aa9126ad872f0213643488a74cbd376177e8f73d724bbbadb6c192d640108cff927e3ad05ff85d732895e2d96f9ce0d68e6e2c77b897a9c8c13145825c695d820da1b299c2c768559067c093bfa465721231be70ec67b8cf3b1ee78b887a5145ca97d1248d0d462c4c0510756fb6ad7028fbef3691262d862ea39ec0ea007d322cdb02ecd216f02b7ebee9e29d21a810e98ffc0302ee094db2525df955699153203ac975\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ef4a7dcfb64e618b34998ea64659fe772d1fd358b29e003b2257b85d2ca618476a66706abdbe591f97764059d8785051c12d40b9c9543fb83334d204ae23d8b59\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ddaf37dc11a8574b722f076f36e746bc7c60e215",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd60000000099b168e7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb2000000007a2554fd01db7f7600000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac30020000\", \"prevouts\": [\"05864a0000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"291c560000000000225120327f04e65f02f8e03ce78ab2157c33b783b64287146459b669c40017b50fedbf\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c4981c98d09047ee82e029176f402026e6ee9597298967debab1e2419faf3d4a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a36616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ddd4994f43b538ffca8eb9b28ca5fb499238d0b9",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ae0000000047920cabdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5301000000a1ccabe104ac0f5b0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac9e8d6f25\", \"prevouts\": [\"14790f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"910b4e00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_csa_neg\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466dd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ba6d96573030157ef56c9d58a9f6e2a8f1a2029ef3ca0c7e3c6029ad8ca7c939d505002e346ef8c252c3a611a23a5cc65a692ac2493fca52ddbeccf55d7032\", \"5220aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5287\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439beb67122ddc1617dce4a8b1a7532423bf4057eaff692b9473bcfe092baf144466dd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a3754b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dde699e331a7df59bcdada620624b5ba61dc5dd0",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1602000000242acf68dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be400000000ae8b607802db5a4a00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac46000000\", \"prevouts\": [\"b1e125000000000021591f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"55a626000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"04b024de73e0ac65162974d16ecbcb5344408a1f2303658c477ad436b50d7a0d170f01f16ebd920f4b9c192d817db5a2d631b2a8cb30509bf210822d5121a55d81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e14cb87c7c2b7106c97582ec52117c0baf173593f092a800e8514885f11c92c2621b4c1a97c87cc56315d3e22eb73936548eb923070084e09f9e4de56a58b73b81\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ddebb704471c13ddfaf31413aae6c013515a3717",
    "content": "{\"tx\": \"778899b603dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c95000000007c54b39660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fa00000000b5fe039b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a8010000002867b9b101c0ee1900000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2bb98647\", \"prevouts\": [\"325f4c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f1bc120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"09e33d000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_d0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ba093c0e952d439e8dd83a7a9ff81ab4bfec29c44d47b1ddbdbcb3d47423869423f0cc753b8d3fa277b7a7f7d96ce6bdb715c773bdad20f48b369eda0ce5434c01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"150bc1c19fb98d8104ecf60c020b122cf117a8f86e2063c6e0fecf4ef426756940946e2efb395bb2a303c875115f02fe495d8cae2834c762a12c956342e745ced0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ddedd372fed9df45da4d1a59cf4f5cb35009e49f",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc1000000001e5a14ae045e7a76000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fccc9dde3b\", \"prevouts\": [\"0c70790000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_b2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4b537f91a28e8f5a72ea79222386b8312f93a7865ee41bb74d3490551dcef8dd453a0260dcfd4ad1e2dd8071a47f73135dcf9de9b7e05d926824c7f959165c1102\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ac637c79140b15f841cd2405eee050dfb85c39a3344157a57cecaf53405c53cda0877aab0f13f2199d6d13a40f1400396ad15a9f2e3713083fe842f2cce141aab2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ddf80ae28fa37fbe9cd6a838ae2c428932ef3961",
    "content": "{\"tx\": \"05439dcf03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce400000000e23122ffbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2801000000445b0faddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5e00000000b41645be01b3ac85000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487d2010000\", \"prevouts\": [\"5f875f000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"f27f6200000000001651142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"90775b000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"db\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936158dbdd04fc8b1597704d885de388d9e8396e20d8d1d942e0680de9f689953519f09ad02cb012ed2091760f4e9ad26775ad10447e2b9e598a8be746abc4727fb4e3966518140ddfb4b2a9d93e012e33d80f6a3bf7f24f1b44efe84ec3ac236f0e053a85c36f8a6bbb26ecc461a581c33f0f0e79993e29030d20b8bcc8871f830\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93674592b4fb9d11d06e04aedf373a859381c5b821797864f536763c5371283881ca04823906532712c3d4cb334ae6c7c41a1294a824a25b5277d43f47953a1da33e053a85c36f8a6bbb26ecc461a581c33f0f0e79993e29030d20b8bcc8871f830\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/de08cbb895403680951a2ebc90561ac53b1a1f4e",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8101000000d15525dcdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cac01000000f2c7c6da0498846a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acbf000000\", \"prevouts\": [\"b8cd240000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"6979470000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368a925fb010e9dac59891c803b6a81d462f65c56c77cfff52e46d3d042538a83699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb44c2f2200f850d6a1609ea6f282082fe51ae8a55145cebb4c521120909a7edcb74b0fe5a2ac2c1f7a0cb2705bdbeb7bce3dd33edb4ddacee2f772f92b01147433\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5116dab5147ee209d2bb54465ac69ced1cd5e726256fc4bc53cec72e983b39694d8586fdecbef25bbe615615e0698f2a9b21ec544d3ff645908914cd0f4da91c05854b8121e0ae10d162a4774d9a1b75cd5b5f6f9e51813910e8b7b5db2ca997d7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/de2a5caabe3e3b0b1b01533e95ed8f482c6ba0fc",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b05020000000688d329dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8400000000b676ae7f03dd933f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688accc010000\", \"prevouts\": [\"1e2c230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7edc1e000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_34\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"6451d3179e62dca0cc40b81a493aa72f1a9c7ed28955784fa11e9acb9a663176f67fe8d9f8e88f5aca7a340d2dd56318b5306b6b8507f4aac26ab64103c9bb04\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b34ffc91ae7554fb840d132cf67c074147c9171cf5d309cb403196ddc51ead9c0ac0831a2e63767b53c37f985a9ec82b3da0cc3199d0efe13405f5a077c2918334\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/de4f89a55a6d907d16952ca4e4166a5979c39c8b",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf201000000ce5eda9bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2f010000005618a396bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0701000000427c408b01084841000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487d4145d56\", \"prevouts\": [\"24fb4c0000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\", \"4f8a7600000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"3763820000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"cf7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936748d121e1e21609f79570eaf4a0c66e6f2ca68747216dead3ef769b37e72a366da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ed2b7053bd8f6b5ad2f12d7ae765b8b6e1c341259e3dfbe95167fdee949bfcc9ffe03d403be23d34fe95cd8ea927043998b4b921fc49b039e78905cbd289b8eab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0822a853d9097b45eb0aab266931969d1621607f85e2073f603093b953a54be8539d6c4167c25132c432c9175336dcf34ec1853eafcfbd891c58e0cd045b8bc4542\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/de5a7c1447572e08c6b28e753fe662ac083fd6d1",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd700000000fbd7ecb1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0f010000001dc16bf4039bbc640000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88aca8010000\", \"prevouts\": [\"f84c4800000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"ac261f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"fa\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bbf1d1d3d3f3a5ef5765b8348d5c92141ed2621e0ac73cf7baa1850fff99acc06081f43f8c34257025162ccf1daca48ae61c99356c3eb24d5601d3c52dd9de2a6f5053dc49cb92d20c30fe5ab09c589302aa9886b9c794d18405aff33121a169\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a1d35e36d71f4211ee8dcb476ced8f16f1af9e215de664588adfe8e8df5b115526ad4257a22b62302a767a5b8896008d1af7055b6fcc30f1a04cbcad06de5cf2f8b8afd7beb88d43ca6c6d2d58dc9425172bd95ccf582b2eeeba83616a9d27d33bc3f3b627616b9f836af78c18ce00964f5f9dce3e851898685189c72823645e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/de5adc575b18b1c34a68e95cecf166f402e523ff",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9e010000004e8d62c98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48e00000000c08d65870131f23500000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac01adfd1e\", \"prevouts\": [\"0c3422000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\", \"6c6838000000000022512014ab2ce168ab85feead37e4eac5416d9445f157495b1751829a16d631c43d5c4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"347d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93600b38fa5d865fdb23dee295cf5e738ef43355f5bacd695a02d663a7b470d4077ca882fe3c585d1ac8aa5218112791e3065e91b4e1e0362790dbd367cd44cec36e97124583e57aeab90707503ff0d8dae530166a9193c4517699e1743b45d7c12\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936671dace471e6820f5f8191987c15715f38317ddaf0403bd182cd1a89365688b3a00efe7e15c1e643e9e1cfaff50670e7cac10128754f4af7dc416953d80cca2b070c3fd2cc03cfe72ec91581f9e22200fa4c4f6deb8dafcd335310e90efb11e5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/de5af33427175b7548895fa5441e430afe11d1d5",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b68000000006d4aa6088bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44101000000ac7b6e38014a4656000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f870b000000\", \"prevouts\": [\"297523000000000017a914a1b035f555fd87548264c3580a1f62a42acf027e87\", \"8479410000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"215d1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"248c4ecbff0376e38497f2505ebe59d4d0b15bd0e611d1b4b35a48707bbcf0dc895d691e1f190450c250940b11242caf62e507bd623fffa83199602a467b0e80\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/de6875a737b7c8020f44b1c99b70c4853e661ecf",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc000000000567fd09760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e3000000006cc4beb260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703901000000fda958d3043a449000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acf24a3044\", \"prevouts\": [\"c9366c00000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"2745130000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"d0db120000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936910f902344d2bcc0b5c96564c3b5a3672469d9f6056abedd80e999d51f34e041aad829192d8416594973be53751c2dc095bf33e54427303a5b8b45ebdea5dafd99ead232f95c20736c4ca28d40406922684ff7a84c70e432a4f6a4d4d1893c4694e361b142bccbbefeea6ac26126d4f4fbb610699e3a27d96f99d1b67de22f2f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004599aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb44041dd00c04bb207a9f54805a750c9f5dad18a896c6f9e3a7e4fce73f8863b3a94e361b142bccbbefeea6ac26126d4f4fbb610699e3a27d96f99d1b67de22f2f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/de6cf2f6180404aa31b1db7d09cf2baddd601d44",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3e000000004eecdbfd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40400000000dc744fac8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48801000000149ea6b603d7969a000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88aca8a50227\", \"prevouts\": [\"6f9121000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\", \"11d139000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"5094410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_3e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3dc6991c17f520cd55b16b150ed1995c6a1226a91f67b1a6d5ba6a7269700a92dcc657abf599861635e5fc0d66434ae4ccc199d53c6b841a85aaf940c3fec2d681\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f45ff07ce00a4d91199bc40e46be5804cf896608d1c81a4172f7085e51bcd009d2cb520821c0ecd6b92afb1723f9f01443a014d80e837dbbca1de1485d1915fd3e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/de8a035daf19e89e29ba0bbdd71dffd1f9cadc5c",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf250000000093e955ff04cfff7e000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796cfee2c54\", \"prevouts\": [\"40b581000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_1\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0409560971b69583c42103f76826e83d36226f497642c1c6e056bf875cfd5b928b25c6a218e0437035cf85fab6453439b8ec6d4386666317f829eaaceaf7b05f01\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50c891a70b8bb0132d0f693184daa3329f78466fc9e87f04faf00ccc234f11cbc269582b1834d781248799d0c926cf244530da7f9165cf2fc991d2fec2f44ccdef5d8d15caf631eb020f1deed6dec3c08fafb000f7595206524acb72bd61db3340a2a9f8aee6234d7ec65930079413cbe93f6f7c3cd9c34ec4470bd910e815cab46747863ffed685af4ab3e31b82858c7a773131cbd1c90c619709da593c321725b70c7da46e5fa46e8f9cc56e7f2459eee9af5db86137006f87300e47bb2b354dd64d234346e8e9fe2eed2d229414d66bf97b2ec9aaff75223b5a66136b86775e5350ad9486368b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fc32ccb82868ac36ba7911908fcd8dc5ddbb53c91b6ef0f1621d39422e976761c760683f1103fa9b79781c40bf4bad2a993187c6e71136792896bfff62bc6daa01\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"5030bf7e5ec30f854e35517036d813901349f2d6244832b3bc5486468741d351e82c8af6d288bf060cd34a3f99272b1903fa4ff56d6ba0c7253860516424f52c5c53348aee89d1600124636622cd34a7582b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dea753eea55e305608844a4f00655549302ce7dd",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf301000000f07fa784bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa100000000b808a1ce027a278e0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88aca0020000\", \"prevouts\": [\"830c27000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\", \"027e690000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902bf02ff641e31f09c4d35f5f406a11ff59fc515d404a4a638b15c3f346fa771c567a27c0265f0cc211826b11b668419c055a77cc263e5986478f40e36657717f6b3a494dccdbf7cfdfc113bf627df190fb2360826940e8850acef35bca523acec0beafad403c60450194456d4770deb9054ba19193734f2b8ff2f2b4798b0518f188e4058e7715edcec862947ad50fb19cb614d10f704bbbd2bc43e6f29a172284486f05f1b01139e01521a7bc268c3300c519adba03b3f6dbad13db6bb1050419efda175fc1eeb3f4ce71917d919d529af76136b443c86acaee438f9bde767581c2d65117ff9f027cd9305ce42ae74106f593b094ac591d4c01b9924c2bc9f9313ad6b4ea0c567c91d5b3dc9b84ffb5c10afcdc6b7ff988dc09496bc5c6bd335a13a011dc4f18c48c721535707bc1aa7051e42d21b3885895ed4860cd871b68951a0fd86f67af4bb2d42e8edf5960caf8b1187c0e84208355a375e879cc90d38f188fed3188001390acdc2702176daaa94b594ba4c56540f582ebbe168d48cda00494821897826f62a13c9f4910a10e5a39565412e8f3273d6caaf8cfa6a3d56517f3418e5584ce7e54978d358ee9e83d188d475acb6d12643fb8c91b3e7b014be143cd618987d9f8b40ce66eb3eb70c025ff4021184a96dcf7bd27a26899c53cf64b5bd1b90d76704c0583e81e9131e16634f95e3b9c6f00e77a85678eba25e0da1b75d2a718353ab75\", \"dc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936093a5eeea5c169e2fbc7166a6430bf79557f7d46655a225e460f903debcec3108d49cd47170ad660e437289f08833289e3b90e14293c0ba427f1ef2b5a93f8559a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e3bfe8b0458382ba4f4ce4b13b8b707c198a710172b0004e49e202e4d70abaa7b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09025b96938ed9b3e4fac18d3da6b49763a5d1c34f785686c491abcdda7f392637aaaefa9909e13d4efdfe5f14a4418fe2d8e8e0b8ab3c13e853972594541dcacbe2d8bba2c38f5646253b655ce00ff5dbf5db7e6644750d34b04d44dd606792170ad91e6adc2c170ad52dd3fe3488c2638393ed39ef5c81f377ee0bf464625ca87831006409548f75c7297842b5727f1394476709a3b33c213242be9f34de430fb90cd841597d692675a6ecb5d00be96655331d6e18595c82a563fc1ceef4d248f9d2fe2207855fba5d31247eb0edc92df45cce99077376d7620498d1151fe2e173e54aab7a7809d0e378eb276f5c998bf2ff463f6151b93474b013c4faa80c237ed5d9b38e70d8df604f8956948e1c88a1689a39f02e66a398cd4ca7fdcf81d6dfe98c878e287334378fb96e629f020866f9a77151f4351519ee88c560dd0843092ae5e1ed6ed3c5d8ab3beca1c227cd3be60f92ffe1237fe2ca3b1bf9e7445a9fa46f40f45fc77cc8bfc0388f74d81782efca16a0241c65b39ac9525a840784ccd99b95fc4d4124757de96272ccd15c27f01cda7ea2360b999be49e7c3afd21959fb7f2a1b7f70fa882d330f8fca48cf70041a1d4b3c6f1e3f5216804e3aa76b355a895bf7507a14e6e45543e76421fd39d3cc02dbef65531679b93357b3cde0852e62f1f2c66f8740f8294db350a0d85b0cfce382a8011875cb3a0711d71283ed3cba54bbcff15442875\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b824c9a54cd29e76b81e5147f3a84f06642da94bb2b4205613c863597e0bce9e9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100e3bfe8b0458382ba4f4ce4b13b8b707c198a710172b0004e49e202e4d70abaa7b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/decd88daf9600a38bc143777492f37dad4565eaf",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4b0000000063774ab860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d500000000cc67262401117116000000000017a914719f78084af863e000acd618ba76df97972236898756010000\", \"prevouts\": [\"628d500000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"2452120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ad\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"008e817620cffc0c3a58d346ec64b478e48797b6850c6886decdddfc8d5a669ec3888c25c02b6c8deb655209278156b58913cc6e1d1609d6ed4882a25df93eea03\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"de9a8f689e63f3d7c0df31662b3b8c773b214aa835cf868832f5dd09fcf95b578e02fe4de5c383172e84694b9f8567de9b84f790e5eb689351290152957f8693ad\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ded66ffb0cbf19f233f516bd3c63fe712650ef33",
    "content": "{\"tx\": \"0b6fe83703bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffe000000007cacfbdb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c468000000009c09df848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f700000000774f468401c92a7500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acbd79e031\", \"prevouts\": [\"dcc37900000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"129d37000000000017a91439ec132e1466f40f0086baa7ac253013e83c7dc387\", \"bc53380000000000225120f3eef30b2db388e6b8a313ffb142e2e6ffc970ce6b6a81ae6dc1d81725c678ea\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"7e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e19aed6a34821d65edf69e9d12354a87f406d02be059705f92363392a057792142e401215e29d5d13de3b6ed62165bc3378402ce71158bd1208562fc299f33fc22fc39b3065f81e3c179a5faa7416c7afc60db6bda904d6a600fd6a7a1aeafb2cb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a0d0ac5788f723aceb0a237bb228183ae381a676877b38e9861fc4f2162de386b9b4175db22b4058fbb32c1c98b401bd6f80a734567664ffaf4b869d5cecb8c8be9bce0da1a8e0eb2f55600b1edecb05394963f1d059e6505f0ccee9d28b62f6faffec7faeeadfdc2f9d17b998c1a9153f333fbb08a178932d29a7211446b62a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ded72412b30434c168fa06e48b7e054269d006c0",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfea01000000f5e5319edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7f01000000447e5a1e03ef0fcc00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4874bd55a28\", \"prevouts\": [\"f0347a000000000022512017e91ee0326ee2050a26c2cf73ffa8316bb13627b7c7250ab1d4d36a20fb6045\", \"5da4530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_80\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"345e2569f6bc0378e11a381d7bfedb50dd311079ab6fba0c139fd4c352ee4a013d70cd2a332bd949e5b31b78cb892ac21831c9926563830e7fa72a3cace113b601\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"679889311f25bbe6df48ba73daa150525f92b1bc85b626691a1e912f172adaba0f64af3ac315e6be452128c690c103935a87893244d08b695e476f53427131af80\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dedc75c0c2ee756e9070605ce546167cacfbcaca",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1300000000eb0c7ff9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9f01000000c78597bfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0a020000000af4cdaf04a802d1000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e76dfb7e54\", \"prevouts\": [\"501121000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\", \"7beb5e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bbba52000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902675f54c964084363882394ad998da229764604e92985c5054486ac5d718d80f7061a038266cecc59eba9f612781c12845a659d75b65c37dfba7fa65cd6287d9d3bbb14fdad236378803b242648eb36bd7d85be915c6f706c8cb45101fa0af7e8d4c9d61932cfaee823776ddca35413dbf8f9dfbe7f091df3bbb341ef625925e347a00b960fe77bdae5e40e7c3fe4152f39aa5ce7922c5cbef4e9af35320ef7d6cf1260eed59167599bc1d88847bd7027f489351a5bf3cebd7be6e39c09553a4a61f79128569257af65e6b704eefdc93a586843e609c5d689c5ebc0160d4add0e5656194eca0d9e4fb668fab50b7b70333da27c820899454973aff50e92f99bd002f41661432b0dbe1909db9ef5ed10f30d0e3fae24a8fa9e1d01bc348ebc427ab8a8815ace325fbd4835c9a6c80adc5c47d2df50ba768fdb536f21257a29c2719978dcc3ea8240072bd2143e7a999e70eed11751c0ee817b8ace48a3a6faa4dcbdb1fd57441d1d5e696179eb7e05ae4e9fa20b5d0e9b0b4902a8ec1060ce4c6476ba85b6386f855ef3f0edc1f266605d0c1eac9e65329ad9f4b34a9d65ad717f9236f0906a18ac9d956854db9fcbea7700545f7de87d28db70ad14b6c229684c5fd109c6217ad0ee2a2d020de6829968b151591e58f1656e8e81c04dd9f77c3283504e14d452fc69b7f16b91bae882748fbeeec3731b6e5bec203e273e0f97f428c5341b85567750177597\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936adcfeb9b29c6ed44c20ba80ac794e3b3be7a6204c6ce082a2474d233e7fa669cff42e4d873fbb915aa5b42e254ee79c6fd372778836ebbd6336959492b60478df213b900f5cb66b025bdcf0538d69427e8f93cfc9741b2125e61cf9215fad53f373be813dc08f80e09d78de4ac5358a3bdf22545a425b50fe87daa20f96c44d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c34d9b5ef32efa4b78f99a029fc6956dfe364fc0c000ad51b638365278a19a703b498f4e601855ef0f0bfe54de14b7a9b5683c8687790a838c9cac2d86284bd554593f9993309e96b3db5c5cd5f007f6964e77788283b128f688a72ac331c8ae8a23a8b631d0b797cc3c0e804353951c5fa876ecd79570ef6d349b1de34410ddf9953617e94e9248882ac09c2834197bbfc6a1e00a353933a6576321541fca3b21bbca281e6fd79c7bbbe0ce0fc058880455faa49a90ee12130d8bf20d7ad9e1e1a3813b10e39fae954e7aa72ad1ccb5d7c9353f24102c0ead2294cd0df0845c3f6cd438601822420563e463e88a37fe06bdd32dd847d534786df94d1c5b2cd09b08b9aff272ce947f85ab0f67f4df058ecde27d058036848bab5dd7c75d1bfa24caf08bfa6ca004ad475cb0b68d6e7029082556ba911f0d5f814986a486cbdb8189998825612817936c1ed1ec967275feec6d446caab86ff88fd880c0461b8d7c31ac3028521722e46a20edf02c551f2f5b9568a9b4d327af1c739a4cef202b97742b56bad83d03678baf57b22e33861ebe8d97ecf423db50053fc3fc651092851070cc8f4074a46a35bf04036f6b1f23070bed2713df5b3c26448dec1790312e26c8e07453672572bcf56d73606a9dc09bb98c42000a217c3fdd2f442e864b372c78ceabbd6fb9d43e11ab367fd1ed574045c3ec42d41a1db84da2e61fd717d05f6424355325b73c7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d9004505f4756eb22a3c38e0612932b2e111811a644330efb7a4d77fa512235b8ceac2f213b900f5cb66b025bdcf0538d69427e8f93cfc9741b2125e61cf9215fad53f373be813dc08f80e09d78de4ac5358a3bdf22545a425b50fe87daa20f96c44d7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dee101172e339916048ad363fb6995306d7dd142",
    "content": "{\"tx\": \"e2951d0503dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2900000000faacbcb9dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1601000000b69418878bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4eb000000002de75a95023fb57d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689870b6d6e3c\", \"prevouts\": [\"4a82260000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\", \"6f1924000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"0ab0340000000000225b202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c14c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5182d044aa67ca69515bddcd39ff85ae31d999a9a5b32af0a0137c9fa4b226ee88d3f52a2844c5f7874c7d430ecd2ddfcfe713e30c56da5784f950db6acb8f092a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52c1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f59112a8c06ad701f9edfa42ec0be4849dcf79d254814ed43ac6a9ae6ade45014a663af4c315d4c0e419951403071b67d2106b9ce8bb6d7e6c872100135a32b791a13a85e5c2e660174c9a1e69b8f96263917ef129d2001c822ceb7fc389f44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/def37ff0a6957f0a571488b66a768f20f7079048",
    "content": "{\"tx\": \"fc52232702bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff701000000ec1eb2dbdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b00000000007f7b48d60234038c00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac9d000000\", \"prevouts\": [\"15e1680000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"86ae2500000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d512c6725dd4617fe2c0113ef50b93a252f15ac43c20ed2eeb851ef9070637abf4dac8db205c7d3bb0390b2e22910f5d1cbad00807eee3325f4c4e7f4412ed3064a1c25c837ec0a1f852472f3f26e6d49055bb98717b7b68c46cae1e5f9804f9145\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa3b35d8b29d4381edf568701a69a1e2b58fb6f81852737bbb7ef3118982f806dec24bcd5a84e558ba1632e81361cbfb2715ab9fa3d579aef34157cfe08620975813d9fe920e311eca68d9da8ac683d4c5ffd57c03f9174ce1b6c58fb2e14cca376e34112ab1bc736956b41978cebed690ad16294afa2ba0e9d8b5fa7e9f6f2f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/def74495863bbdf9d1af666161152708f2ba582d",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdd000000008a9c37cebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0f02000000eae7a34c03b3f48f000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7c198d544\", \"prevouts\": [\"5d6e23000000000017a914c7049bed1fc82cf46b0539507abaa88864b6346987\", \"e07a6f000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"5c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2e0fed7abdf786fbd6951af9acc54241aed127c5f19f62d09ba4f0526eb81a5df243c72f4e074898aab8058b3c73fee97ec3b9723e213834a8398e97170c1356\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f95811175664830046faed455096fec372413cf10fdfd9c9c39f3ab5db40cc592e0fed7abdf786fbd6951af9acc54241aed127c5f19f62d09ba4f0526eb81a5df243c72f4e074898aab8058b3c73fee97ec3b9723e213834a8398e97170c1356\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/df029e9ebb9e83aace8f0071d2840c27c3ceda07",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcc0000000071630ddfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5d0100000077f260fc03d5faa90000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df97972236898796000000\", \"prevouts\": [\"5be962000000000022512064408326fad1f8311f590f6e6ba281aab75c91070d1d43ff117e995859b8513a\", \"a8d4490000000000225120a283e1ea0142d34d03fade4b28902cd262d82bab6ae3891658a9596d967dbc43\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"617d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93680e322cbeba9447e623c355f3a00500243eb51ea80336533073705560965e3918a99f3582d6399c0406dfe65dca998a5ce57b7e950df5f64352e1bbf6c7fd210dd304186c0a2faa80f59261766b0cb9b0760b78eb1f31f166a6f091ab62e6898\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6e0063b43826002dc6eba62f224851f0eabb14759fb10c707a6afd7fdb59e93aad3ab6b2d4691bf881316931c587f0a213fdb9026021e80f212e72f88982a6bfdc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/df085e9114f63f74c86f24312e70f7b5318ad9fc",
    "content": "{\"tx\": \"36449a2c02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0f0100000000b960bcdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3700000000576d43be01f4b34c00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac83000000\", \"prevouts\": [\"5386840000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\", \"e6232600000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"017d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363a70d9b275504125857cbaafe4a923049b33c80b4c83ac6cdbd36bca05abf17733479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4ae05873438be84f92d1402d5d55e9fb409fe52800aaeb5db180b239b834bc1ca2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361819509e9671e02e7a4d8cb2e99fbc3fdcbb7d0847ecf4f66821ff751ef18b028874369940c44314cd428c72b977b6d1fa375b1e54ddd71363c505e3530065c38810a2a55ef559e3dd2f859359930339f67e2de31eeac841179b888fd41fd8a3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/df12a4966bab2fafa4ffe3a2ffbbbe8d697046c2",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b56010000001507ac2fdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c880100000047f521e4028cc57200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914719f78084af863e000acd618ba76df9797223689874a000000\", \"prevouts\": [\"8ab320000000000022512049309db7adc24e71859de9f715c32a97834a8db8d4836c0bee01675ed84352f5\", \"3c7654000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063bc68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362bdbcaaa23cdff8083cd34ab41f9ef3fcc9019d9deb6ba18cee7c393fa19240cd300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d516a0ed0b6cdb130b03f26b8a245e72d5247ee3941518d7e9956496f6ce27b97d7150e68e664a4d5c991e5183d0e7966d99b6c66da3079bb04bea44808922b61bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a75a59cefab6a6e43e7cd7f010e1e9163ce51aff720166368ac5c7faa51270509312a224ee6564b861c658371f7a6f0026ad2c58d86ce869dc9b432e830a527104966f092bf1e4b4348fca11e7254311373308f7fc15e3d44d6a2afffa343c9657ff193055e5853205a1117b7666344cdb66562f15b4d40280f3656784bf5cd3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/df16a0297efbbe308fa83a0f3e6ad417689b028b",
    "content": "{\"tx\": \"53b6091d018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40c000000008e6ea7d901a6021a0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc80000000\", \"prevouts\": [\"b0743e0000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902996d356a528fcab7ee830ee5aaf2f5d101b1d192eb1378e4caf2bc8f7a426db18ecde281277f52b180790f35b399c99253d7468b53c1615afa504b916c407b5adbcd4bcba48185971e9b4ad829ae532801a5858524d7c201dd0a33636f9c39c4f79ffdb2c535a7cb79d18f495f7c58b1767548ed28de79220d0ada361e0f6ca7f102c05ae817e2970b9411aa3474c781c6b7ce83752fdd1eee3524603770e083092ba4cb6666d682211c0274b02799958b5badeed0e064fa6980b55f83d88e5e84efb6f8fa598fcdbbd912c6f6ea85585dd9d50cc6a32ad71046375904c41da5af9ca7ad95c9a84bfc36e75f7e642a3fd5c8d0321c49e73c2c2ed3397fe5cbff5847c65bf28c370b3098852eb99b7187e799452dbada4949e52efbad4bb8f690fce7ee4e2908a7c823209fa861f0f2d12c8f3270af8f14b003371f3696337142a6c6ba3dc380b9977576a9f14281d8c7c2c77d153ede428de528575fbc5bc04b70d600c52a8820be15d9c57f838509718a741ce7de0488e6ca6f484bf081bb8901647ee93e722cbd4872274838b00e133f1946d53b0e15da55b41d208b4a47db4448d1c2496ab32757e5f94e7f31e6ada4f3ed6e8c369b29f4d2772ff1067231895809abbc87ee75a83d8f327194de90dab8dfa5cd3dc101b9c43f9c2dbb0978eeb496b04e61984ff85ee95fd0160542b2a43c4fc7cde5daec3b457afe38e7e21157212fd466b38dc875\", \"cf7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936143c349571a367481e690b7209c29b5ce19961bf557985bd6c7d96f3e64328220309cb272f305cf5bf6862d0b37519cb4aa2491edaf37578d4af3081a91facd0fe03d403be23d34fe95cd8ea927043998b4b921fc49b039e78905cbd289b8eab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022f26e02f0df918a0d0e06ac416b58e90305ac32689786eda24ff8c32e7b56991e9743a412fffe4c37604a8b64afdac3d04385544f890c8e5247dd42b08b2393323d86a0417517d9fd631db7eb530dfe6aa8e77ebc55e3987391d0001a2ef665ee3793bdda91214f0e2b77908a5565c5be5dae994d6a702f5d568421fffcf614c987dd9e12f09077c467a631121e4e49018b4b900ce0022fe0dc56b201f79d5a3fb64b474a8c9eaf6889d01f464b1aef04381d4277a0a440cb3e3c9a74bb05d988a8d37655dad5d846f6188ed93755e86d36d9b43027dda6429ebc92d04b13102e683357b92d6378f149206deaf0cd2920c65781a5eddfbe4d3eae96293cf0c633f230919dd41f17c0519e5c76f75104661446904939eba161191c8a39bca19345817ca250176e355ff21fe8cd91746225bea5b74adddf15f129189681bdf1d10fadc688fa387a156ee113df5812a2dcecb0b89a5dda4008e77dde9de93f187f8606f5fc69bb0717275338ce3b39e18827425dfaed39197253174a810a0c323fa40c60ef5c9a3d67f5fc5df7194565e5b6dd9bdc396ba7a4f60b2293801eba075d6322824fd978aa0c19ff88286a7a2079d48f9799dbffd44fb4dea28bc9c61e9d5faba8f9ef2c485c707a8c93e3c29dffceb49fdddc69e24a62dac03329c67f6cbd0f60f71e57a9d256c5491c70813fa7ca5a1dae54825276e390a1c730e8780932a3ae66381f8ff6b75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367713179303850cc700febfc1488c688622fdc6710045748da9f51ba3077a9d29da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ed2b7053bd8f6b5ad2f12d7ae765b8b6e1c341259e3dfbe95167fdee949bfcc9ffe03d403be23d34fe95cd8ea927043998b4b921fc49b039e78905cbd289b8eab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/df865486869273fb5f7adede25fcadcb18ce2221",
    "content": "{\"tx\": \"b824250602dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7a01000000fd949edddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1401000000948f09de04c9c07800000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487fc000000\", \"prevouts\": [\"ef115600000000002251209f6df9bf0ba86119ec56bc774d8ddd924452496c0c827ee2df6dd8b5f3d2e1ef\", \"e303250000000000225120a0c53dc99d5bda6251c68fa12a805cfcccc74115072cce855438d885fbd38ca2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"487d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ebe5e2af3a3c1a6754948d639a5542927d59c509fd5287d02d091c2a39a812b527da89940c9c2be3d3cb1ea9fc374137a74dc3bafe909c68993f298761996d666\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936379a98b85b817e20bc3376f43a8b74803a7c6b50cc59446ffb1c9510b7649235edf94ae33f5606292dd7c11b30be28c4e66005bd3313ca427ad5ed734d53452840210bd7db211b82a407c19f9567cde5a01f8f2a3c3dc032c7ac21169de78447\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/df8de808e45c8839831abd0deb0cabf9143753a4",
    "content": "{\"tx\": \"71b5e2d803dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba401000000be38a9c2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9b010000003949d5b6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba2010000007c0e80f601ed1c22000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787e6a4735d\", \"prevouts\": [\"4a3f2100000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\", \"f873240000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\", \"4005270000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09023f9c84743c3be04ebacc743a2b6aa04750418f91bd1282a1cb40d916fb911d671a40db603a9aa900a6c8bb50f3419112460cce22921155a835fb336813220d71659a1eba21ccfbdab649f30721bdf6c430146a1c95e0ccce4ed5226e6217eb4022ee019f8038b75a9874fb1a5b110f10a1dc7f655e2ad0c1114ef5d93047389bdf7b8b96f73ba1b2774d9c0626965c34f401c611ecf3f0e070377768025e35140b2278ba78b03ba17272647acd1234b5b6dc75ca9874ff04e870ad0fc6dbf5257ea3c07f6e33eb28bacd0002482b8f20e39da68dc9c239b31f6db812a812f5ad84ade7f28c1c0cf8786c974e07b0a62a10a549a8bcf9f009f12b1e2ce3e1807795a2ece75ebd7234f3fa529c73c9e59409e4d28f3420c85f35af6b8386c13f00517bf689833e3ce60ff2508c7467a9e533c1be1f70c69df354dadfbb80fdab00b60167134fb19748b56b30e3260bd16092ac2113d3cc059e00ca433f5fa866c338c290d9e652ea0e893f97cf55540c8dbd0a74fb6ce2b446ab524deee537f6f1a79723834a9b5137bb86557683e14652dc5886bb13c89ed1a0cc9e5216012855c6cf1389599c2bd375cd011bd12c7c14bf51dce3cfb6e1074675852b92d4a2842a37057690a087b76475e97c91484afa2ba44006fb2d727b8ae7b6e978b526b3499ccc6177bb3e1d4d105b6d26598a6ffad84f5c5b2b68ee666f13dba48dc267c2cc4bda576082bea07580\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4e222414f291e7c8e231e07541c9ce63e3a938f40bc45d6936d3328c3939c0fbc26dfe099323fd489e28deb26e949bd9371fd3334eb17fb18f59b980c6dd72afd91585e32e966e39b6b25c1732dbccde0ae2700833a1164b08d78002e58493a9c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022a58ed26e6d19916da5455f120b9bd3f2627182e441e3e44087278382c827e1406aabe52b2e3be20a766bfa8daa37c81be9d1e017c44380f169df0d387627c920637b06649191ae08d7614cd6de635a83a5b6d35951b1f23da988fc0e96df01bd8392ffd08fea2839948d1ef45d7b228557a1ffd1f4207aa6227343e2c4b261213f3b0571bcb967001b380b88c55efa3e1d78025ee77003c585f311bc08eb46c30141ac11cdbd754c48b0e1eaf61927101dc14a87c52905031eeca89f754b89a8b7200cf3de2a837159a2152ff59ecf16d13eadcc2dc29b37762a303f712b65310a969ecb44515db112190059301b60c558a27845d6c4b1ec832340e6d5f8796c6c1ce46e9645180b7ec72c10fc1f798f3c08cb0c13bcb85b32c1b03be328c2fdc4f4001407a99d0b5810ee6ba73f721f7a9c8cb3b523ab6122c49fb81c3b97bf53b0c42118c0eb24c4c1219adb65bd9bdfd4c5efe789dcb33a5eee8147edd27dcacdc05978e9619e6e824d4508966e73c1e069212e3aa5c14c19025974b35e7115b0c0b9e42dbb4d8715a7a24b7ce32196103a23feede16fa66ebe811aedaf62ea6ecbfeccfc5a5c45c434b02201f043459ba0fe9bdae08fc5bf5d79a9f65ddebcf80473d78607dbe6808ba7d03be03ea057cb66b2ca7ab3b16a06f3666bcda75ba19a9b2120ed3f421af3aa7177b52104fe713100fae661b633b5f9568f8fd06ebd8ad1fbe3109837561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364386f400f3ec9e99e4a117ad3157ad40372b43bbbdd0f0bff3bd4d11670e39fb26dfe099323fd489e28deb26e949bd9371fd3334eb17fb18f59b980c6dd72afd91585e32e966e39b6b25c1732dbccde0ae2700833a1164b08d78002e58493a9c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/df8e03791d82b6610c2c15664032e32589ea35a8",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703300000000690e42c28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42102000000816bc2b260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f701000000b4d361eb03c83c6000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcad010000\", \"prevouts\": [\"3f56100000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"e9274300000000002251201d9d7b8068d804e3524a88462f1a480f3f4200cc7b90f0ee3c3216cc2f53f488\", \"35100f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368982585ef19be154a5d0887475e9222bb71fccbba422f418bf7ba462437a3b52233ca416c78a4619c687785de007f14a4879f9c7a0556256e1b46b2a7e5a39b3c2782374d67da9500785d400f7ef10ae84f146bbb568355094c68456b68f7a283b30ae9fa149c8f8e298eb730b57bfc5eb02dfdad9864c9ec3129b8b9775e615\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b0e6ddebd74405781922a3c06ec9e019fa66c9803c79b531f33e986452ce61d5d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51ab4aa5d5e3dbd00e7a6b81724e903c1ca482dc7bc8339f552afc52b4f38fc6a5b77966166a359aa5541e77c34a58fd9dcb7d88ef6e7e0cd0e140e1adf959d28b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dfa3c5fef1b463d98f523033ec70daf8d4bf8803",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8300000000f7f2e8ffdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c620100000059b834bf029896b0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb18bbe4d\", \"prevouts\": [\"86e863000000000022512063eb770f298cfb14c87c6cff1e0541dd7cbc30bdbab4472c0f37d52bd55ad696\", \"36094f00000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"0f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa6f8d113c18817a044fae8525416b35b4656d6d7185568187de608cafb5211e2f68491001e36edf91058819766439c3f31bd198abbe3d2204f458ac7743e1d61ccf16a5e3db9e2b81c974405e52c4661efcc91a529144e47e78be5814d4a09901\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361c7116f5c3e80617093632a2db9fc234f36b396a24b73f6adf68743edb71604c5d8798a2c57206b85b6eca830bd166e5350a1cd63f89078c321fceabfae97dd5c29bd03bbcbebf503f24139d653052e63a9a9f3faf73bed4a74eee576514948d11491142a38ebb10a24e36aadbe0cf227dedfd0966bcf56b2aea8b33dc3fd67f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dfb36ff8904f4e8107d8ba666de3e5f94f741bfe",
    "content": "{\"tx\": \"66c9d80602dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bff00000000e4b956c2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b000200000011b1a9fd045972450000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4876c7bd32e\", \"prevouts\": [\"8ef71f000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\", \"f8d7270000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_3f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"11a821d804282ed3f8e49777158fa60fbe76e19e1873d2b28bbe5fa3125262909cdebd9455e37fd062bb1fb94bb22d7d4c2b8ac112dec4121b4012271f6c3de282\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"168a4a2774d61b7aff005ce782158729fd2cd6e14544b385725fba1617b32f9538600f79a3bd53f864e50f423f15e9bd90bb3f8c8569c803dbf82c31a3ed70e03f\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dfca4159ab78bba17ae0d77f088b5aaeb3144266",
    "content": "{\"tx\": \"f608de5102dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1c01000000234b88da8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e200000000afc6ffcb04a1565700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7bcb4062d\", \"prevouts\": [\"be01210000000000225120d632d9c3807cee2f3b07918ef684335c8e7823a1a0eb476eaf46267e076b018f\", \"4c44380000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_da\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"60c79cf8a600096f8a85a9ef515c8744cd0d0a5c56941db9adc89a5e1bb8650788eec46fb60722058a82881355c0151ecba184eec81b3e65fcc49856e6bff75281\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"be63d79f66a757cc5525c3eb51df4e41a12accd97657f116f5ef6b6d92f81e6e9ccd110de22c04592dc48a197929ef7130d8af195193716c1e3a9ce10923978eda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/dfe3a4307a38993f68b0c2518ea2e3e590b0c9d1",
    "content": "{\"tx\": \"421bd7b302dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c140100000064fee5d560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270da0100000002f966fe026fee650000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac3dd3f227\", \"prevouts\": [\"28285a0000000000225120ac0f4213e8783833c45f3d5eb7ad9dd617b78266b96dfb5473a425c0f67cf18a\", \"d69a0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"a37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368269b16152528d89fc36f021923e691aa0c01b4f1f2096ea68808bf45cf529e55a5b11a87f009b0ff9f397e99e72fe38b81dbea82be72f6430c36b07738f500beebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7accae923b25d556389dd5dd645f6d7ddd89a07a74a73dddd3d85d7b65ae33798aa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93638efb5b103e2deb74012998154e31323d0912cade4af687f6058be382e79ebb3842663f27fdccb53374929a05698df7a3618af6b1227ea033500411481dec31ed2054b94cb6efba565738f5dbf6ee5a67458962b65d77e1cf5e0d2c1c00b2210\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e0128963856adfa8520b26e571a93610b5355887",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3f01000000b8a74f8a8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44f00000000e90788d160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702a01000000ca5a428f0116f30700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ace4010000\", \"prevouts\": [\"45214700000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\", \"d6963e0000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\", \"aee20e0000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09021f71643238160aad99ba4e027345691308f1a5ce1cf20b87d58d7ea3aef4fcdb6a2c2aa2c33e7e356f0f8e6210c18f5a49f6198cfb4856caf0aa59d925240a399418058dd0fc3c0470836560c06f2e37985ec97545e6eac2d298d96da35344bcf5033169fd58ca8cf08f41de9d11fba54420c36a3f5cb2b7d4ac0832b96be595041b139d57af1e2b42cc68404691c598f16fa4614f19b3658b6c991419fe337685b444d747e001490e7ee2d293cca6ea81b80ca4cd24ba1616eaed11e1a26086f7f42284b88fd1ed32d5641cdf2965f4ceffe7823a52bfe2cc2e6db6e93a93e243c8a1cc2eafc853804648716654f42a5bd5d17da0e52a08bf3d10d7a85e89a73e162f29f0d394ca9673a0ce8bb0cd0522bd55131ba1b013eb95c9a403930cb92924d2908b57a0735e47d32fc537733ff9702137044743ec4358a977219f7d49a377186b0e2bf0920804088d78478b5c88e5806f3865b2a68bb0f431386e7c1c37405c989c183cada54a0ab1d002e271c524fe4e1acc9112e64c2057563ee94f38b720ebae7452c6245526d8bd975373dd68c2af912d52f00f7ddaf62a3314e525c1404541ae0ef217c499252779d8cd687abe56bea342f034a28a122b90c520ad6530cb7a94b30cccb606580a42a787bbb0f589b8dbbc8553ea0e262ba56e7ee0f46b778e6669d541e7a7b5b298851016882c21b5880e2548d9b79ab6f38683870bd85f9d979e456a75\", \"0f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e84be90cc292444734c987c78e965b1739d018b44a402c956c06fcfea30a9c442ccf16a5e3db9e2b81c974405e52c4661efcc91a529144e47e78be5814d4a09901\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09026921d9bce9d183e1fff6c943711a9afaea661b56ee03416b7a046706e051b8d43fdbb8c01506d5ba97e16d05e1e287c632bb0e7a58ecc3733f05c47163c2a8ef12bba1d5a5385a040797170a04bfe23df641aaca9ac639cac5807d0bfb5db2bef492559149cb6cb5aa7b9f3fceeb26a281f074aa1b8e7bb7e7a3f7b06f0dd315bc9e466f4065769a4885f3c88ebeb9819c854f090ab9b06bf5301e628801e557defd0f64d7b4cc6fd9a23a9b7d394a35be478e027effb8d0512d431d844ca025b7f270ce1a0e9211e050c1b2d1747475d62e1f760b420d4db0808f36a8f5cb3953e5c09c03f4da723e0d5f5bd61af4bdb428fe95699b7026c81233fc54182034d270ef3ba7115e59155f4d8089155aa951234360131490b61d11c7760d8f8f806f49761a5e89bf2ffbdf5f1bd5957424df7eff9c666c6d4a5ccd73ec87aff5c61fdfb60a568beff0ba051fcc1f5fe7ffec77ff2a82fece0daf6ae3498091e1b6bfb8f6e2740339fdbf757a11727b9c61f5812a20cba28bda15c41093eb19246485cbcebaa8c0e9d00bd6b185ee4d899b4b018f22d8ba2c5c2045656d831c82ea24cc493f30cfcaea40c6165b7c3c3174ab2e3c29ca62495c996ab409eda86d5ca04c4eb547f8ee39b44a99cd4c35302de5d0270ca88f177a63797b661ad46f15af47e2f75dc19076339e85d3253645f4d39ed906a8801b62eb97facfd0fbb9fe77bd75ac916456de0475\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0825d8798a2c57206b85b6eca830bd166e5350a1cd63f89078c321fceabfae97dd5c29bd03bbcbebf503f24139d653052e63a9a9f3faf73bed4a74eee576514948d11491142a38ebb10a24e36aadbe0cf227dedfd0966bcf56b2aea8b33dc3fd67f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e03443f852b194c164bc4732fb9c5cc86effe4f6",
    "content": "{\"tx\": \"0edf5c600360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ef01000000195c71c7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2a01000000128387c360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706301000000d6a1ca9b01111250000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478780000000\", \"prevouts\": [\"77320e0000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"f6ba6f00000000002251208082b91639ce415d44b93ebacde06f605687bdd15466bf93e6aed91c1a4a19e7\", \"1f6e0e0000000000225120ca2f7736d38d84f93b62b86d7eca19a35f2cfb6705849a1c6400bed56ad761ae\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b210e7034c35130f37a4c8504b3b1ce362cd53a6c695edf7c15e8918a2b984bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a14616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e0588caa737bfbd960ff3fd219ca062193aa6bf0",
    "content": "{\"tx\": \"67281e5e02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfea000000004aacbe908bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42200000000a23368a302d754a3000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df97972236898740461b2f\", \"prevouts\": [\"a9f1670000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\", \"032d3e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6abd\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb45bc79ec207f4553f17b4d8afbf0e47b02e8cf3ab2b0172732171fcb0f92ff87125432b67bf7a212872373c5ea5ac6512ad650fe3d5c26e1d584bcbdba0083b9a9e9ba325ae7de51b47d98058ae5f9889bb6f52223c96865cd06dfd05531cc8a0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936effe4d48aab6fcce879b221d7012ab600ee1e9c541d61044892151855353df93631743d48971d1733c6ca7857843602fffe2e4122fe98dc3fa85acbd6da797d181cd61fd18311004a5536d1440b72b537197adb3a0d17581cb4a1679e89097edb5843f54915b2c97abdf26ed2d562b36c2375ce95d63af6aa508e6368a687449\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e0aaba61fbc722b30669314cc389d44b8f989110",
    "content": "{\"tx\": \"a045fd37028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c414010000002c805d92bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5f01000000eb722fc402346c99000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689873ec82e5d\", \"prevouts\": [\"2b8b380000000000225120d8440763d2116f9dee5377791731b3635bb44d7a42fb2b8a8507b8fff76ccab7\", \"dddb620000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646dbc3aa3b80e9e2d0a0162b269fe7cc9ff8c1b234cee9fd626b14f4beea4ba0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a7c616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e0bbbcbab18f481daf5b315491e268254f4983fb",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8c01000000dffcc7d7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfce0000000016cac3e60495eabf000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8729020000\", \"prevouts\": [\"937b5c00000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"5f7e650000000000225120e1a0c74a8d16f26f13c9c4b6f4a1ceec6071856e9cbd0cceab614068d31377db\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a29675a8a9f92469804a42001d31f755afd3155cf1499e996268a614f1896320\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a1f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e0da4e0fe645f0a953ac5735fde4706cca9e1197",
    "content": "{\"tx\": \"32d633d502dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4a01000000a75705a460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704e01000000a92a96b3047a596a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac49000000\", \"prevouts\": [\"76e25a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7e79120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_5a\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"00a5b92cf209ea7a03233faaab06f3473c81218f097ae47a29d670f4125c454524d7fae66ef0c37054e12cda1f510131fa2add7087e9c39d0e4e3d21cc16fda2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"32dacef7b8b950c592a6a4bc06665dc63b08f0e930d52f08014ac6a5a2ca79928d028a7825d769b60bc56402f865828a4689f495269a5fe8e4c5c8cdbc205fb65a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e0ebae4900e11a9672f2ae78e61178aa6247650c",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c200200000056d3cc57dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf501000000a74f649460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270020200000040bd4f300326debf000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac82010000\", \"prevouts\": [\"1dfc5f000000000017a91480e36171416c0f598c1c20ba17ab3a3cf10a438e87\", \"34075000000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"95c61200000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"2359212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"106a7e3049dc2c6347306abcffd6f8c8b3f26d4b7ee65ebb24d0fa41c8692b957b5654e881ef324dce199491145286cfa20a23ee05d277712bf9841942e08319\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e1087672834b43c44e37cba854b5b9c9f7179a84",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e5010000000f6b49bbbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf66010000005e3d45c0020d06a1000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acc2a8f43a\", \"prevouts\": [\"777a3800000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\", \"e9266a00000000001652142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"317d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa37da87d72e5c2c3f2bf3679d8ff958ed33e42af1e2394a1323a8da273322fa97a4517c545b323e839a783e2c84e61e1f1046ec65ac2c085bba4fcd3b8ecf0c89\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368c9b7003f83096f4e27f57dbc2b99136041ca132bb1f5d87466faccd9e3f4bc737da87d72e5c2c3f2bf3679d8ff958ed33e42af1e2394a1323a8da273322fa97a4517c545b323e839a783e2c84e61e1f1046ec65ac2c085bba4fcd3b8ecf0c89\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e10bddf4873386e1fe3f6dc0f2b20f5c151c89e1",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcf00000000b38236dfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8a010000005a24c55301f9287000000000001600149d38710eb90e420b159c7a9263994c88e6810bc78fb4e75d\", \"prevouts\": [\"e7bd7500000000002251208ae894af2a9600386c37dee4cfaf898fd39bd624f9812efea0f89b144f5e3b3c\", \"1d6a230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93664b32368c4af7eef3a1be2a374bfa1d9f7dd677f641009402fe4ef93ef570ac8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aae616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e11d98e0003ce918a6fad19f550ea0702a879911",
    "content": "{\"tx\": \"9b03967e038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40201000000116593bcdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c30000000008140a59460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bc010000003f8a038f03ce439b00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a61f020000\", \"prevouts\": [\"fa123a000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\", \"d8a45300000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"95390f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"47304402202cb966c001ff37b464f6a3883ff23bc4b0b57f1077577beaa81a695db7c60587022034da4a6ed8c3808c3465ad5b31113581e7d04baacf44b96f4faa3d621508d30586004c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402207212228898a16d87e7b89181af917c2db17d7f012b69287cd1b63d85cb6ab5f602204cd659fedcc04ca4c50ccd2e793458c59db2e733899c3073b5421e5747fd58a28601014c4c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e1326c178bf8e7b80cda8ea9f9dd86938329c849",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc900000000ad2a3dffdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5001000000014b29e90202c4900000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6db010000\", \"prevouts\": [\"7b506f00000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"9412230000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09025d20600f8db0995e20ae953328fc2d250dfa7161b98e0947b7c54aa754e13053679b8323bffa9b132414ffee703819e68939792426d5672ac9fdf37c787361c23cc28abd6958e28d511ce9d3e5f6bd2b57c07ec0fe7e6b784bf2d226bc5617f13eec00e5b6c4640b69b2c499284bc14a001c9c4d2fb51320c4906d93754c59457d24413dd583ff2483526a7cbf762d06dfc9a0b589bfc5ed4cbd52e6e5a6349c8823ff6fa496531c863460edc2a4c7abfffe1b6c003f31b0ef6a051310077b0dff1dafeeeac4403e906d1383666202fb0cb2237b786b81212e27f236c224842c62a078b61a662104d68ed88246df5f678b326097586e66fe3badee56299f3bb85f74062e90838ee76f3381731e8a47cf3cd1837de25e0d0056e963b7e3068825e803560d29eec26c0527d6e2aca1efe08e5f39f059bd4dd36ac29e4067587a43b80904d2dfb06ce9b2941bdda3b18e6c5fa29ef67add45b3a7c19d625142348120d711d622185dd394ebdab51dd1e9e2c5dd995d0c440124d4f178e6548aca7a757ec048cdfdcd5b0d725f0e2d16933f03b4f63e0cb5cfb686a8db2c8c9c5b6bfb0cbc3e5df68919b813f4d48617cfc0349580aaf16495ce2a3995ea8545e427f0fbb31b219d730067f0e2a2865ccc63018e9d525e640d2a58e569109c9db29d9adef28f50580df9f3e2cdf59234a4a2840cdd3c96803d561c39e772524ee0a4f2709cb5e67c06f34975\", \"d97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e8cfdf3dc4b41074e6d5bb67bf9f12a242211e880ee715069382ad177c5f1aa2ff72d95b601af8434dcd53e2a5d08dfad1c07e45b1031877afc5b1801af7debef3d33b10ff9eee8ff434f7c79f826d5967b94922da2ad2ccade1cbab3a3658011\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090288ebbaed409d5dec4a49a41d1e5245e0611e0f139929d3186910562dd04cbc8171eb9eff0f7ad61c53e411b73b00c6b6d1e4dc21fd29c953cf32189b3cec13613bd6e7ae258d7780ef237ad8c3bc4b29db43dd21b541d63d3691cc6ab72e906d0e31835741465137ab2e32ffe9c3c813d63ed743045fdfdb8f7c3338803117f6e87963a229ddfeca20488ea69309f5bffa9de3718db6af8553ef417af2b359c0db4b7e5dd711d7f024ecce8d458c4be30a1bf7b48f452b2dc5d354a51feee0db64f532866910bd11e279f72923196350d15350f6f6cf8e5afcc3aa3dfd1287689b0db3274888d0acce3740fdf581c514ab918b173f101a83b02663bcb5356f614ca17aff8cb6479081d3751cb822b371c67df7c6e9b965fa00da2934ef18924387878254d29e3e6a0f4cde3d7abd9c1d4bd6ee8caa429862a654341f60e6d8aa9b61d15271b944ca3c0aeefaa44585dbe3a1cbbe689d4ebba739298f62ddb5fac93cc553029d155c2a476b57a118e6e9aad0e9d7800ec13e1b81243e2d7fe3c62303c7ce9f91cab21212953f05cc02f230a219255c78308e9b941f219079234b3b2694230f51c01b71f74b8df5375422c78d775800576e52452b55845d9b4f1e6e3879786fceb1da5e3d654fa5c88d99d70c7880425e5ca562b870366baea4380b6266e9267dcda6a67354e574f0dacd6ee9a711a10b18c05bcf415ab6f95133b731b759ed1226287475\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93629500195d2baebed23c7ef8c6d51f922864fd4e8b73fd6bc85a789a27ba769e79208680e05d04c3942bb784f68e647b385a50066aeeb87d1b11822ef550a3a38682a6e83df749f265180f93fd54e474915a8abfc6fef0a760c06d61a0bf42967\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e147111796d5b53a6bf6dc9458c50027b4d09f87",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4da01000000f19794d98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49201000000e17d8ac402e45f79000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65afb4455\", \"prevouts\": [\"b8394000000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\", \"18193b00000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"317d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936baa8b3b4b8a0b13d474f8e303d1fb88b1f31b08e2de6caa1fb01bb3d4c0176023f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08228c5b97b98364e562d83f29d0f7226f72eeb298058e828607471d679ccabea05a4517c545b323e839a783e2c84e61e1f1046ec65ac2c085bba4fcd3b8ecf0c89\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936848a98c8453c3accedd5d6c98b5c0c5ec67507e057504b5eef02067a388f801228c5b97b98364e562d83f29d0f7226f72eeb298058e828607471d679ccabea05a4517c545b323e839a783e2c84e61e1f1046ec65ac2c085bba4fcd3b8ecf0c89\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e14960a185290ebe95ae6279b9e869e837251710",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca401000000a89fb6d18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d9010000001d4379cf0321668a00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df9797223689870d020000\", \"prevouts\": [\"d6ca500000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"40f93b0000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"spendpath/trunclongcontrol\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c9198bc74e031c9f9e1006abf908758af04e32f0efad12b4c539b1ad2f1627a4b18cb5326fb182d40da5651a09ed969a7b567354f769e97ba429222fd687a6bf\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b78be31b16966ae882c7ab2969dfe11d69b83e8cde47f805ca2a48764752b9cbbf718e574c4e60a583d038972ff24d56360066622b8e32dea6b1f072fad3e0b0e380268a7da44256761590e2195a1dff8c2ca3465130317c0b1ce6724329355e20e712a8eff36d68da3a9b55d8bbb5a56a7c2dffdcf5fda45eb6b04c97de1b90a9e89bcdd7fc6427334431f09d8e083275d692f7a4ea32eb53fdbdfeec8936fdebd95377ebbb40a5c3979ca7a09e65ec6c5748b544907952af1da6c4191f216d633f9d096a188370cc7644b4de45f8a3fbb7f05176fe1bfc064b167b3764b5cb27ad2fcabac681aa39bfac7410cf932536ccdfbd274af833d6abcfedcd9d4c1498e9d4b7b30f3d9fa0392c06867240a1ba1a87750d1e987b2d58da218ecb361b00000000000000000000000000000000000000000000000000000000000000009bdad734e6e3fe025a23777ea959457c1a4763e34fcab485472093e82ba34b6229d0943d0dd65679f059096147c046ad897f468fbc7f0a5601dbec82a0f68715000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a22495b1a4a1891c2253e36490ec96b1607292246135e2ed22c7edd6214f6c4ccdea0dcdbbb8847f77c0f70ac956ee6bba8c40a0b009ffad84cd54ab946361a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18f399bdab8e1515fa960b1287180525634f46ea99e1abbe989bb40b526952a90000000000000000000000000000000000000000000000000000000000000000628a6886de34834298757e072e274ee77a4d415a9bc3d63ed1662b32da0ae780ae848ce8fab73b9d81a11f76fe66b44da73b126a34408d3c66751c72220890517cf20095ddaa0e39b232b31746ec7d72310bf019f8e327de3674ae303353457c15de3dba4653cc4dcf1aef7ad34da9a6e4dce0835909a4c56bc51365dd121e694e4b2521dee2aea7f1e363ab964e95ddea9a07d1bce3b8a3aac42fdb8c579806000000000000000000000000000000000000000000000000000000000000000011a021c551a25e01f25d0d9dac6016d3d162351a82137bb91b22bfae9f045767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94b85d84adb74dc8849bf68f7e7469b98f295bd36fb195c45201c22f7f51d7fe0ed5f704019db5dd1539bbdec3d10e4d036cd037a9d70bb63362f21155e83d2b884c27c034bececdabc8344c8ceefaa5fed486be97d0159d9e6135d56395c958458e55b61aa7341b09ae049d0672ff67c18b036dfcc7c5a2c445b20c65da2e3f0090e86822a05d1d3ab2755a0710df642a4830645df3cedbb48385055b4367c357c5b074248d5062281dd686e2e28c0db8cf03f5ff95cb38d07a5642aeab2532913ebcf29d0660bcf17c396b8002d858a3ef5e68c21ab69a91658cea1f72293446ead3dd0f3a755ddc947c71a48392aa4e3eb7c08ddf4714f57b848c510532630000000000000000000000000000000000000000000000000000000000000000fca92079c632d81adf4a3b258d4338af2b60dab20ebe6975f46e68810bb132c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b202fb3661f0c5604a0c3eeda6978898cb37ff9278e5815d4e5196d466e9dfffa689ab64e3f127861709db1a50a711dc149ccb8834e53273c631f65bb0e52b0000000000000000000000000000000000000000000000000000000000000000145c7a14c04fd30ad7b80bec265d4604563dba8052d658057020ef2cd3fbe02e0000000000000000000000000000000000000000000000000000000000000000db2e0632f9699acbcb6e37f50cb31c205968760c274f796186d2315ae7d0601d198bba16ea8c7c243529aac098a927346981499c1f3d3e915d1fc6006fbee8f3fa36a1bb0792f95109f467202971580cd63a07736022b617fb7faa45b21b687181dde60e4136be7b6472aa99ad0f684bbc7824749be06f19ada3f5689cad234a381d877d08be120085ef8fc78e37e3373af7f7308a09b4da9997f73f1c0e944a4d0e363294d7bc67031d3de2ffe261a4e5b184e40e0adfe553898f8150324ea67e8e64f950f72ed0fb74ac43c4fd37923915c3c77c6e2157db1d340d3f3ac001000000000000000000000000000000000000000000000000000000000000000076877632c0c065446105116b544cd4d4f2fba46cfd0165780841f0e1ded6f203fb11634d6d4bbb66e02c391d2888d1425ed03f8b7c3b266486734e343c8b3065baa96329af5c8916564fdd90306c7f310d0014586839c251c233b0dcd30f1719d76b6c3eea9ec2caf5040160071fd94cb00de6ed94875876911f904c6c82dc02ee05c87b3cc4a312252048a5200d75bf90bf4f177eb21e3a0d0e765df413f586cba37d953ba406a8cacb905df75c6f6aa4acdfb84a186ae48853356010f38a1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff97172ee737f1fa9fb929d8292bb2805ff2268c1b0c4fff5ad29c3652d417025053beb6b633975ad3f0b7a983b4e91e3634c812e7e0d65b0fc1270e5bd5a5bd9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758aebc787b8916e0a88054bd7cce2d63159bf3d0a5daa0256c439c0b2be1afb140c2f70c319de7013bfe2ce2f011bd84d0cd5c4e4eb06d8af9632b603050c8acf273cbc06d80241339df46b65983438c9445c72e2d6b679fd5cf6e645f31694c87a152e5f16de4bf4fe061d11bf67c3c55720cfb37afcd9a0b54996a99c25eee3f320714fd12ce7654c4b83ca0e8afd2b5b4653eda4c797f044939d0d37b62a02be4bfd0192151653144c57650b8401437a01e70ffb9708d9c8751aefb6327e2ab6c48476921b919ace450440c9dd3e97ff786356293b0f5e01fdbeefdabdc80000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000f564116ca2c9937e596fbd82c1183c5915ef10da4f2f72a35334d9c31585ebb89583133c4a14cff9bfc896e5498359f9d87aac7448ef0fdf7199d92511ca7cadb02c9d98725bdd0ad7f7a987a22a8f616f1889aa556e391c1342c2104f633d2b441775e029add390c31e46a9317bc638b6bb5a51b3f2642be45b92748a1672e8c5ccddf10a6a1a44a06133152de9863e0698c1071e33600e07f738f34710de276af9fdacc866f0e01802fd5b5a9ed9a86994f959abfdcd54ad7670e3c498a2d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000a36ca445cf1a781a8bb9dafea3d20c8891f4667789ed11a288a320247bb68adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdf9887df53b35dd5a0aa6a4448bd6b792254dbc3c59493986f05f41661c74fe1fc9192c3b74775c5d594c3a7d05ddf95c6dcbae7f30b9beba7d66f64b9e04af446e4e747db79ea28e3dde4e13f284ade9ad3056115c4184e22133e89b49c8e1e007fe29858f36d52f89a88e25a29916a611a81e2ff0100c6a149676ffe2ebe709cd018dfc65f933b96aa86ad2c25f70a3fe9fec3043261be9bbab80f5042ad0000000000000000000000000000000000000000000000000000000000000000ef468c5fe9b6a8b732686a20e7f7c65543bc50da4f1262ec1eafd44fec2462ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82a159a179389e402345f5153d944866f5da1b1520c2b1281d64d5c9a01929d3e0a818a6eb2febbf43e99c4ca262fc3121359042b561868763ac470241567826f08106b87cc2b22e8eab99b95d827ef386a9ca8422e9fee9141b482d14d70496f6d075ed3065418248c64e82bd7bab5ebfbb93a89fc1fd132e8ea5cad1c0cd3aefbd47181b4e937b7a44e95701dbd40f2ce2d0fe197917a109df7f60fd18d04e0000000000000000000000000000000000000000000000000000000000000000ea7ca48b4d6661dc0e1e70085dee3fccefca29073f686dd0f619444664c3fbc20c62bd38f5a5e193879e1bec2f6a4738c90e10a17dff7a9e399e8aa9bd4988d6459f5cb859e4c808c90f6ed0019fbd2673a9fb29843a766a017f7e160eb6143b355d89624b619efd0c816daf144921029e0517958795158b584de9f6852208dd1df3f8bc459112072b86adbd8c1163d34f720f54185f97b46b3354765de3ea1d23eb0e99276b7387cc9ecaf0ed692624b99e838e49f0d5eedcd56e377cc79791efc6b1f2266d6a4b08d5859a07c31e1404a018b03669aeb715ffc019d94d751246df2cc47965811c390361848484f692ba14c2e62e6f44b542bd52879bcc034937dbbcfcfc3e873a19b446a92392f35f1c4faa401d84fb12cda38f2dac70e2b14374d6fa475421d762df54df4a569b148b7f3ac1914d1624fcc62841501ac36dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8f1a68daedd98588f5fcbea31a8a940a4d32d65684223664bc5f399ef64fd8e229aeedf2df90ca58fec8be2b5af84a9783b08a067145517081f6715e380e74c3a4428ecab42b0023a47dba881b935634d9f2aa7aec5222e99f2ceb1be8101500000000000000000000000000000000000000000000000000000000000000009bc483b6d6ba9fc1f1c4a62e522dfffc09f678788b69c0cb263b5999e11bc3923abc7a392e8271d6b4b8a78124a036c473893a94fe314717d95bed941efc79afa37447111a784689db7d3094206768abfd29b8f3255c8ab5531531e94576579b82ccad9763146d19045ac42f2a46b4286b4b51af7fd6fe115a15fc962c1fb984eea1571bc255d199ef16b2e71ab062469f335574bb9b2adc00e9c166c27d6e1f000000000000000000000000000000000000000000000000000000000000000089eb19b8880af1bc072e67e7e1440929ba857958738cae978ba7ce95231066aa0000000000000000000000000000000000000000000000000000000000000000b0dedac4e789728a5f5680de06b8c7a14a8a057c82868ff58b767e51ba45a3a695d7853ec13823fe853b357744f1d93fc74db6a2a647594f3d40e6b2c819eceb00934c1614f0446884767042ada569edbedb35763667f0a9ba256d88f8b98a3f1a6fe93ae751c55106a2651e129aae2e49d93d782b623fcfac8063d61fabed3f878def2616efa4a4a7fcabc756acfb04b8aef3f8c2852f4b6a095a79df89adcb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c9198bc74e031c9f9e1006abf908758af04e32f0efad12b4c539b1ad2f1627a4b18cb5326fb182d40da5651a09ed969a7b567354f769e97ba429222fd687a6bf\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"b78b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e170c4afc7cf3aa9e0e5c2670686778994fa4f11",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708f010000007d6193fc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f6010000004a71e3b960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705c01000000093cd1cd02363e64000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87f047c423\", \"prevouts\": [\"df2c110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4a5e4300000000002251207ecf5669449c43a088571b8452d22be90b9f1c03aea1b9900f46f7b654cd7ae5\", \"818712000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_d0\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fa4f73410381304292d94eaf5d8be3f7f2709a235b0fd37bb8bfb41ed3d02f7f60a3462e85dc669c0a16166a16762a451637002a03f74f88a1992fad6eaee8a3\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"849bfcd3084d95a95d93738298a994f11f9b7ed192d1e5b96bedad04c2e4a53519bc220cdd391b9087031e62781b4aebc096bb7823bdd92ee8e17099f9c5999bd0\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e184bc711398d7c0c1fa6934192fda6c555a1cb3",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5500000000e17386c6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbf01000000655e64b60215bcbb000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48731792f38\", \"prevouts\": [\"e16e49000000000017a914e18c03fb168c1c1b3408ffb477de8ff77b0fbd9587\", \"c198740000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_93\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"73d4d8990c22287ea75a72b4076651141cd6db6f3529c3865a66cf8fc4e3d5ce9fc88adcc46e4a93ab1320539cd37986901375f02dd10c9581c899c41cf953cc02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bedda449369dfa9d19f670f7ef2005015a16df8e7d720d532ededc00843dc2616c36d7936248781ce86cccd0c60245d8eafd71596ada74735b311887035e8e9693\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e1b11848fd01dfa0ba32bf126463d9d364ab4313",
    "content": "{\"tx\": \"9cd4c5f8028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40d0100000043103d8c60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127060000000005b59fac60132e71700000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac67000000\", \"prevouts\": [\"9f583d00000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\", \"5860110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"047d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb6863138d45c5b9211ebf4039595f6572b1b39ac7fa7faf75aa7045d3f3541879de556ac6994112f2dbe51e2f18419f84f5e3afde46d5119f13558b672a3f6371a343680beaae3fbea53ecc49afe7cbe880992a117d636f336d7d159be7b446d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366b3e41ed570d7da98aeefbdf157119883206a3ec62c5ee7bcc27bd56cc9670384030e911897c6e4798122efc4265e48d96402783f565c89ff2a62155c020859d8460181b685601280cbfaae0e90478ea5ae6fea73a2d03f5a79a14a3e0c6d503\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e1ba585df080f7b1a7f8f2c7db5dd610f19174de",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709a01000000adafb548bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8201000000cf248c1a03e0558a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac05010000\", \"prevouts\": [\"bd9b110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4ea27b000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"027d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936420b598f8858794c178995f11a8e34655a29ef30c99d23407a26d0a64bc31f191a39935f0afddba064f6b0bc8589127966a984604296ac06f9873b8ee7d7aea369828280661f54bb25ef200c9d39138c753346ae1cc558703fbc48b26980763768cf2d3d0be95621d7446294d89d9a2894510d2dfb4e1a33e7316a17e39cfc99\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936228879bafec8e1069b4e024c9320127e455344299f19b4d97495a4e33db3a44844c267ebca37631eb8e8b6e08a101702978fd7f172e21a8d6d6b527626f4402168cf2d3d0be95621d7446294d89d9a2894510d2dfb4e1a33e7316a17e39cfc99\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e1d952db862331ca79b0a9c72c162374fb1857d7",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fc01000000fc7cc7ccbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfed0000000086d73080029a989400000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748768010000\", \"prevouts\": [\"e92f130000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\", \"09138300000000002251207b42365751b5fdb0753f79b4cadb5a33cc8ff9fcbce7e5edcb6c5338d7e5f81e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"f37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93678222c567c1a65829550fd3c2183189ca7aadcb6cabdbec6c6257af0e513de4394fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6ed93ab99c02c1580916967b23bff6c51eda165404bd9578af086db7302f1c7275\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e87bedb3584a87481f218db37ff1fd20e008c2f171ef887df99e3acc75d9f4a6f1d93ab99c02c1580916967b23bff6c51eda165404bd9578af086db7302f1c7275\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e1e49dcfb28496b89f4ea5ce3dc0d76d880076e4",
    "content": "{\"tx\": \"0fe2948902dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be6010000006a51eadd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c4000000007dccafb10437fd2d000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7964bd1f750\", \"prevouts\": [\"e56f1e000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\", \"981f110000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902cb38dfd361afd702c974a25d6865c03a173543537bb6578cdbf2994118157fa521ccdb3f8045d4d5f0b904cbeabc676c128b409ed28168c6044cfe3b374420726862d0d97426f6d11bf9912c253c2638aa41ed0a752203e7cb7cd60868268865031356d1c91af74f1188ded93326d2c57325f143090da96ffcbebd1cee73d74ae7f70e850a37a9ecde11e5a233fa5d4d0edd4905cc4bd8f4a77e2b9fd98d210e355fb7b7b658cf41f01c7b2443e8fda819ccb94cfd2aa6a52be675282748f651167987994112e78dfd7946d9e3843351b817919ac4796e190f09447392834baa612ce71b2fe18ef1c78ee194204c6680f17b0e812c2f3566c1823ed1cb25385aaad6f752dbde1a700d4870ccb70dab75a104c76b8bfd64dc9ac4a165c6c5258a85ce9cba41d6f6a6753cc42b280fb8eeab3e16eb22113fcf2bc80a9033c054cfa3cec68d0afe1184fa970e59b0b5ef2ba28b02cd3e27b6834c431ab8da4f26e2bbc5ea27e77d614616949f2536788421cd80a05ec7125e6db60ba00f96b9e7ef306bb24bdd1554c8a2a62d1443a55e7e3b5735c81a05a63c5db4704d36f7b92ba54f982ab742b17468dd3732e764abaeceb27839e2da9bd94d67218143774b38b3d7e484e46d0322370c445b8e38c10e206b289c5991bfa7502436102bc9ad223ef391d1d482aa3df54a4dcbabc9faaa1c989e5dcbe40b2ca69236959bc0c192f315c054ca8e2fe6fd75d3\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4272895df1c355058834787a12b20ffb756990efd77bd7ff75ef6e99c81f77af73e02ad6eabd24d4d247e98c297de2a9d81d67e55d72d4ddf06c8e9a23565ad8a003e045cb689fe4fc6de332c618eb0cdce02c2dd8aae7c6dd6f70bdbaede2814\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090210557bf04b49bb164a20cb96dba3802883f479e809c623a52d15f1acd522b8191d415389ac455766a36d682969ba18e280eec2c8a3dba4a9079ed35f9f384e7d77c2f2a51588a00408410066542a509b255d0eb2b042061776e7fcfffc47d39f01b0050e585894905ad848179dddd272b0a0ebb225eec06159370f554d603336af639b6d546acbf4e39279539b7b002694cf148e4099f6d279090a7beccc29549da9c8d25bf11125b4eda377cfee0cbaa319314f438d9a12131e6eb48a2cbcd92c1de6920d64dba658daf5b96b01e35dcdeb20009fcfec02b70130d86776087793a62d5d75d7a03ba1d16be28d90f30e7f86048d06326aae5e9560099cfbca949ed312d31cc0ef94c7fa3dff82a0a9e883fab8f5c68b4f348bf51890b27fd3f54b585902e7842d92358b8b32c67fac4b6d89ca90d81452d17603de4895ff5c4b712d447e48043caa33841cfc5f46d9c77a7bec3e7471b93b4fe261a687df340e3900bd7ddac564e3ddac29a4dc87f90db96fd4376ed1159ae71827fd438549d92b126296b2a6627dffe99ee4e1193293d8c2d3e57bfee318091294e7bc3db042e9538d51dc42eb1a4b002563c1148b41d8d9be23ee37acc019dc3adaa9cd5f94ee72037372ab2b2e6af5f1726369ce62318618f42bec75c5b5480da57b1f39f98c39fc9b9752b1b8b8acdeacea5384bde5d0a86fa105c7e6ef7a558ff96da77be1fb32344fcc3b09cd7561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93660bbd289a3574b95652603eba9bb146799ea91d5db46701829a42358fd9ad106234a5a049dfcee5b69ebdb7c70e6242c675d1abc9cd58c84d7f9a8e8e1277a43a4337ae81428241101d56ff91a1822e405405037c9afab8da6ba5df5d84918ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e1f0807d7b3a4bba613963e80beb7c74850d5c28",
    "content": "{\"tx\": \"02934972018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43000000000ee48958c0115ba1c0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7d1000000\", \"prevouts\": [\"26aa3b00000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/popbyte_csa\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cecd5264025adf4013b9549d7df8d8922594246fa1594dd3b27d6f08cb3cc80694f97376a401e6372f386b2b9dd34f1a6474928660619a394f14cadb3d20692d\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef32555276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"cecd5264025adf4013b9549d7df8d8922594246fa1594dd3b27d6f08cb3cc80694f97376a401e6372f386b2b9dd34f1a6474928660619a394f14cadb3d2069\", \"0020aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ba5187\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b4156e42857b376da8d6c773cfda98a48ea1c932813c83e4082e9a92127ef32555276eb689076808afe36911989d4823aa7576798f07a1060fc609cd8f041d5c3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e22480aebb82f3343403252198ba68a247b6d046",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8f00000000ed8cc89e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45a0000000057eac8a603966c5f000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac496bcc1f\", \"prevouts\": [\"7fdf280000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\", \"752e380000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_3\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4a40e5df678a84a92a1b8acf5811cbe61f2ddd41409d091d66f4b0975d350abb88e347986859019450db73f9e8a9fbdb143578940b833f98c7a9772c7218864303\", \"5083deecf4721c9cdb4119d484f0caeaf438104133a0c467de03fedcdf2a6bcd686be9e73c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f096abd28f18cbdc97736ca689aee4cc1da800e447ab15087c032854ecea78e38dd869ecbcf665fd8055fc1fed8d7996f64895a0d406057ee149bd85209ac13703\", \"5018d17b90f0439b917a7d21e57f85801093\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e24851678d123d31e1507cb51348f5b1dc101d4c",
    "content": "{\"tx\": \"66c9d80602dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bff00000000e4b956c2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b000200000011b1a9fd045972450000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4876c7bd32e\", \"prevouts\": [\"8ef71f000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\", \"f8d7270000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"5a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb4949da8d2968254411aebae49708200d0b19b59a844616925b107b397a8b89bee9c212f1ab0dfa1a42522b9ca3467b009d36f3b841f39cdc4da4a0520ce4fa4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363156d98d4892d7410c1d56e89a5dac6879f3c721d967b53738c8218a78e8dbaa16aecc6ca17fc53cd4672680bbeaf62b9cce164f53144e8804363c70dd634bddc531ca70e78518003474f611c07657b0808402a053b744a80e6cf25146bdf24b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e2496a88dd988d4f3ef82308c3cca33a874d45aa",
    "content": "{\"tx\": \"9323717b02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9f01000000a919a7ebdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b380000000000b460fd01079d2e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6da000000\", \"prevouts\": [\"4a23220000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"54912800000000002251205e14f4853651bdc12bc00c912e88f09aa7f67557a17e07f4e10b78cd4d829738\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f9\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d79df6a78da0f5e7e8abe67a937df0199bc2719081f435200b4d9406e022e7e11ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045a58cdb730d5140e8751cef937639de4f5fbc77d98986906c68a7616d2fa212f87d6928db58d705af4b513465b8e8f739d066723840f3c873585fab69756481ab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365fb6cdab2e5dc224d99eb40cef967cec823dec47795ecc7beb7ac0a6ad6c13edbb0de8cab6875867027c85350e6845db37b89c1faa2a12b075d8db116249f7bd2367bb7d11bbe7d9666c447942212a409021a53e3151df7f84d090727acdc4c9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e255d1877a2010d7fcfc04ed18a7a010df14a2c0",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b4010000009fa83274dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7e00000000eee18aed04b9ab5c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acec010000\", \"prevouts\": [\"5a6440000000000017a91495eb8fe3d959e08a2cc279c1b4ede1921d14a93b87\", \"fdbb1e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_49\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f893eeac963b1118173a285f4a8546ce8791939bb90759eda807c640c7750059bf7c9b8e63f1fba83a6fb70a5520b46d24c643ed5f198311ae039bfcaa82504982\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ede171272bd7f49dd7b6c99912e3d475f14d5b710683506840ab3ca043c5142eb876a08a8feca7a0fdff718bc790551fa8e864b5702fbb483fd91e5e775e9b3949\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e25fb2f6402ada66247ba900b01f074eb85ba330",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703e00000000c3348ab560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707c000000000d6403d70465f522000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a67f64dc44\", \"prevouts\": [\"2d431200000000002251204e94ede8d65c6640c4e6b607af4038eeb61cf5c03f43315636aeaf4bbf4b4fcd\", \"482b130000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b2172fc08f39dec38a16acdaea6f2fb40d915f4bcb39aadc0ac96def6ea8d2de907407b97958d18eaa787c1cc29670cd8872e7fe2ef4ae33551cfe5c61fc2827ee\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c6d5e8883e00432528415be42327fc5a4a6375200eeb9467b263c8c2a6402f75ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b2172fc08f39dec38a16acdaea6f2fb40d915f4bcb39aadc0ac96def6ea8d2de907407b97958d18eaa787c1cc29670cd8872e7fe2ef4ae33551cfe5c61fc2827ee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e279990fd5d183e1d8b4f404ff9bb849d49c365a",
    "content": "{\"tx\": \"6feaa06102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf13000000008c1dfd8060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709b010000005302e8d802def79200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6bbd63d48\", \"prevouts\": [\"853382000000000017a914a8c07d8aa161ec0fed82ac1dc93d81dd0a92012687\", \"53ae120000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"235b212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"a89bf0e7e51d916bacac8530956b4a105bb87b458404335cff97cebc187bc4d2ff6ede95852665dbba540f70fcca1837a4dad11db9c39d91dbccce39527bef7e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e2d5ca40d2c53fc997406f6b09aab24c3df0d72c",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270250100000036c4ee558bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4510100000070e54af860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ac000000007953921f012baf0200000000001600149d38710eb90e420b159c7a9263994c88e6810bc727afb653\", \"prevouts\": [\"de1d1200000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\", \"bbba3e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"781d120000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_csv\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2daba7d27b40e2d99db733e13347a769a2b8ce0ef8210b2fab4a605fa1e1ead27aee99160be27976455f20c218134cb9104f7212bb065b9828a4ea0d4be7daa5\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bdd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a37f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2daba7d27b40e2d99db733e13347a769a2b8ce0ef8210b2fab4a605fa1e1ead27aee99160be27976455f20c218134cb9104f7212bb065b9828a4ea0d4be7daa500\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad51\", \"c16caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bdd10f3c8728958fb0bcc53cdfc759a82731936f05c1a0078c53069409a334a37f37969b6a2e7d48dc77eb5766055d03d7a66c5c1ccb6908b74db43ceb06b6b0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e2eeef8ece1fd34ca3dc565f6c64e1e27ffe4394",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c55010000006d0e8729bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1200000000fec08d1f036360c3000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acdbfe094d\", \"prevouts\": [\"a0155100000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"95f273000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sig/sighash\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"520193ebe9230453608bc1f99ebf3d2e834490f0d69577d94d919e3c7820d57f33e138d2fc2445113ceb9a1e2f5cacb7abb5d79a2a4bac18c85b9ceaf0c7ac9d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2024f6aaf5a84cd78ddc8ba0de2c6373fdcaeebbd152bf13f0463fb733264b8b24dafd196e73e940962f9d46bc6f1ce175526454d67411550428869530397429\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e3196566970071a5ddde94e45545b255dbb827b6",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705b0000000087b009d7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfff000000004b4bd0850218eb8600000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ace6000000\", \"prevouts\": [\"aa620e0000000000225120787bdd18c6671a560ba1e95ace53716ad824e1d735ffe5db246005d995daa6d5\", \"d04d7a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_2\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"230d1df19eff895e2599855a9bcb46b5f5e1b3b373521c264d1aed4067621e005e146c4ef4b898a3967c08d4ffceb8880330bec7acfd85f0a072d5a377c2572c01\", \"d5874c9986c6a813b67dfd48c9d32dccf21d139797772b545a585f8cbd64d51d007c244e10a60e13fa5097d4c8e01f0a2b325c854b5dfc824e6507780da91bd51a5cecf14d4477b219c25e6bf3dd571ee5aa236f4dabb5a653463676c0a9420bc7c7093f91bad0783b41e8df1bdfe570a39a0ec152ef4479e556a576d62392b2f831a91c45d25bb417bb5f84555aa645b725020d72ef88d06713a751c049272bfd19d8eef16d9a8fde3e5a54118cf117dd598c874113766b643874e89b9d0acabf612a5aaedb0b2ef0cebcdbbb02e0547b897f86f3c0e2d91451036381617f56563e44940284b020885863\", \"4cdc105ac9b3989c262000fd41f356e1594f27e622977e8ca48ce72891a0916defa02fd5dfec33efdb8b6bf698a2c508f78cd5f6dc6351b9e710753eac332b4b0314ec5f88ea0913156067223bc47bfa60317363c5378343de0a7f973d25b1c088495ba67482f004d018f86cb4d4445669cfa5442ee7e6aab33f1880a9417576df47838c5baa51dd59f18c1da304b81ca290660158c3ae8f4f2d4914b1083cb263a334dc4111a32d8631080a1a75b07131f08d763dfc4f6df987ea9ce43051e0560426535c7089468111a6ec584443daf182f395ad482e834b882f93c0df6d23fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da51646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936673ee8f995d5f053411291b7c711500e5bf5c2b8a04e2c08b17c1d99d191b288df2608c583a153244c14bce98b397ce61bb40bd7c92bdaaee99635b9843e0309f946230ab5c0bb8920790afb616352841690f577ce41be5cea97f5ed9d976756ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff094eb8ad8baddfbbaf914601b8cd3207cfce58ecbfc9a1770bf5199b01284a18ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4e36585f56a8cfa0ab578b87774720cb80d38fb01b1a38a68e031956b2913c38680106056ff0214383bda029a0df88b9ac095b1cf501a23193ed6c4499c2ce968b682063ff9a9990d791188847d9b771876ecaebfecec19c1b640ee7c9d3c4280000000000000000000000000000000000000000000000000000000000000000f42272f3861859d50669482280bcc7f9cbc8131d23d9d947d5221a85d9facfdf4fbb31b6cbe0ccdb6beb614ca7ea11bd2950d588063675e87fd759f3d3f7c4745173f5b65d4791e21af11d27f540d12b5457ac4938f2f8cc2555897fdb2f64dad5641e5cfc7011274a4dfcd053fd282c053954196a97b1f30396010b458e473affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff731ad8edd2ebf9cdfba95d48249bf196956cab254a6bd0145d9acdbe8567f9c4731bb19b42ddf13fa14055564fc231eaf1f8a88cd899fc0d480926d41e88b558ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00fd67e8d13139bc8ed0ac9ce1ee2a3e339eb470fe60d69025a5e99fd57d9f4814d5b8f9dfbb84bc2f49c0ac30da01884a7605ae3a48121e6eefa7eb9769bb57433d58ea9bd94db6658ee31d16330cdb3b3e4c2f8154f78e8e8a424710055555b675d1c6dfa7df33aef4350e36be45204dcc6066f35fa406039d9ca66f00123a31fa7659d6dfb7a506ddcd43fa2434d22830282f76613ee35c36122a2cfcfd6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff644ae27fb2131bbe69749878ca427c23f0619613aa90e17c2b22e2a76fc397966ed39df72b1b8dd446ac582ac132955f3deecfd8176c8d4f279162992b8ff954c03eb5a5e79f7003e9743036de3e4794dae5236a16bb8515ef8e25dddb0cc96600000000000000000000000000000000000000000000000000000000000000000e6dff3e4c52c8c7736c645348e898fd4f4ddbc7ff00bb73d488a1c030d37d54000000000000000000000000000000000000000000000000000000000000000084b14accb769af52b16713af4ec9846635a9c611446103d32ac9b3c6ab16c3adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61a02d51c32c7f9d4fe7f399ec07cd0f3ba353479c3c15c0a87097ff48c4caf00000000000000000000000000000000000000000000000000000000000000000ad32c00abd55cf610b89dfbfcd4f29dc4bfebcd6d66065d13b22b92f3ad0527379768a3d820e347636f13e321b2ad2c9ad5599e83e03583b2fa761f782de4404751d656e1cc9cf447660c0cb44ac96c4e63cfe9f0ee87756335259cdc4c034df321007715711022e43f721812cd9efa1d07c9b3512248a9f944cf27d024542b0000000000000000000000000000000000000000000000000000000000000000071f9b5aca7b9043b9a7a87c56c7374088a1a5ae564ab0ae71df1152621bb00f2573e89a7fc58b722b567ceba9cbdf4568d01f20059b5f0d67ce2f02a5c26d2f6f32d341ee92e5ddc5efe0ba8b7aa3dc71aef00afe9787130cd0221fd19c8b7ee2a5762b49563e18585c6edc15ab23e8a72508b05dee38b5f51d6c972631186d58395cb0e36c38f2285f1e6c301c32b78bbf79b1f4a8f3d92a6a11ffd15be7ffecc86cece7401ad4ed0bf21ab49b443d1e16320b275500e520ba1dccc99771a56048d46b8b7365efdfe5cf88d9c0ffc3fea4797d122aea191bdfce588c8554fdccef95f09527f0681a9d581e220e0bfbfcc9ccd6ecb8e28e08a1575f3dbe0731700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0b14817ff235fe92c1a6562a7b2290e5ed6d95310a63277990576053be34f1d8da9bb2465ff85d048d65d212d740ad94c8db8b0670b3c282fcca8a1637381b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff36804768f0736ff1a653ceccc7fdafa2244398fb3528fbaf22acf3b699cc49e359d02ebf3d32d8b15334b9dbfe5523163c5b5ebb1cc7eb05bc6dbf88b98fa101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff47dca9acdb92211f9e7dc4b057b9dce286a552926821c4f5b0fbe794a80bd20ba990edd6a246b95d2411447466b2e2ccc1589c8e153fce8f160db98ef9b2e105c360afae5455111e55f3716f0a6afb5af6605025be25d40a7048db97134ff9e545bf7d344599742b95a76595bf0a647cbfd58e3cc32b7e7ed09e55f82d7b9ccfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63407cbe1bee091ee8256cb65a3009db4a9a7b0f6712b8071cd5f05bfef9d60236f916c2ebbbc5ad701920af5c7f3ec01a1176574a2b39938ef1f295b91758d015aefde4a6e712e45ce4dda43fd681c7e831aba25743f9c9fafbd98364fdb7c6b89eed55165851ca85176e686c4d82f029dd4fc961daf96804887b653ee23e34638ac68efbff837bdbb9b534401511b9069e69b7a2a12cf78d1f52a26e098cbc6c8d3a4b41955c65bb497c551e6cc1b8a57f839221d25bcf5e7acb0f997ad99ede3099588d6f1a2bd3476a897297c8bd479166d11e15b1fea505fe8427bb8fbc3a94eb37abe20387b3e0fb8637712d3bd65b08e562916a74eff73a16871fe3bc54a8010e3afc091f48296c48c7abb69ee8236f7d2bb6e655c9dba605afb329c6b32176f5e7041c438b2b05d4596d53a42c830fee890fbfbdaa66edeabc98ecb8600706dbcd1b497cdc739d3c7bf16f0b1aa967cbb59504da18175a9854139217140a43e4428e9659648f0fff6f037f9b5dbfd2da8f615910499ded9a2c50179b\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"230d1df19eff895e2599855a9bcb46b5f5e1b3b373521c264d1aed4067621e005e146c4ef4b898a3967c08d4ffceb8880330bec7acfd85f0a072d5a377c2572c01\", \"96e20fe4bac2808aa502ec996ff850f405e3344620235124f0902a1acfde934716ea99c8394a6555af8e80f0b496acf9c9caa8e984ac44ddca7e8bf4bab51dbf33bbae041d5b9d242d8543742c2f36053671956ef8426680654cfb81ec6d8c97eab00fccb33b5c2ffb0b39b3cdc41cdae4608616d67a0277013ea3a407a59898dd284f33fd554e83994c67ab0f9767757c0615c73a4d2e0d7115a8d27219e4f42affa2820a2f02e0055004b2dffa17feb3fd9bf3965fe2a3af275042f8095d50530a99a29eb3f45c23d14bbcb1341357918fbc612a04b661c9a923bcf77bbb95761ba5ad9f38d276b9d2\", \"4cdc105ac9b3989c262000fd41f356e1594f27e622977e8ca48ce72891a0916defa02fd5dfec33efdb8b6bf698a2c508f78cd5f6dc6351b9e710753eac332b4b0314ec5f88ea0913156067223bc47bfa60317363c5378343de0a7f973d25b1c088495ba67482f004d018f86cb4d4445669cfa5442ee7e6aab33f1880a9417576df47838c5baa51dd59f18c1da304b81ca290660158c3ae8f4f2d4914b1083cb263a334dc4111a32d8631080a1a75b07131f08d763dfc4f6df987ea9ce43051e0560426535c7089468111a6ec584443daf182f395ad482e834b882f93c0df6d23fd04c789370a4769e07702aaabf2e481e97af0e9353c38f4af320a201c86fed16774da51646eac69686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead547cba5587\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936673ee8f995d5f053411291b7c711500e5bf5c2b8a04e2c08b17c1d99d191b288df2608c583a153244c14bce98b397ce61bb40bd7c92bdaaee99635b9843e0309f946230ab5c0bb8920790afb616352841690f577ce41be5cea97f5ed9d976756ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff094eb8ad8baddfbbaf914601b8cd3207cfce58ecbfc9a1770bf5199b01284a18ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4e36585f56a8cfa0ab578b87774720cb80d38fb01b1a38a68e031956b2913c38680106056ff0214383bda029a0df88b9ac095b1cf501a23193ed6c4499c2ce968b682063ff9a9990d791188847d9b771876ecaebfecec19c1b640ee7c9d3c4280000000000000000000000000000000000000000000000000000000000000000f42272f3861859d50669482280bcc7f9cbc8131d23d9d947d5221a85d9facfdf4fbb31b6cbe0ccdb6beb614ca7ea11bd2950d588063675e87fd759f3d3f7c4745173f5b65d4791e21af11d27f540d12b5457ac4938f2f8cc2555897fdb2f64dad5641e5cfc7011274a4dfcd053fd282c053954196a97b1f30396010b458e473affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff731ad8edd2ebf9cdfba95d48249bf196956cab254a6bd0145d9acdbe8567f9c4731bb19b42ddf13fa14055564fc231eaf1f8a88cd899fc0d480926d41e88b558ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00fd67e8d13139bc8ed0ac9ce1ee2a3e339eb470fe60d69025a5e99fd57d9f4814d5b8f9dfbb84bc2f49c0ac30da01884a7605ae3a48121e6eefa7eb9769bb57433d58ea9bd94db6658ee31d16330cdb3b3e4c2f8154f78e8e8a424710055555b675d1c6dfa7df33aef4350e36be45204dcc6066f35fa406039d9ca66f00123a31fa7659d6dfb7a506ddcd43fa2434d22830282f76613ee35c36122a2cfcfd6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff644ae27fb2131bbe69749878ca427c23f0619613aa90e17c2b22e2a76fc397966ed39df72b1b8dd446ac582ac132955f3deecfd8176c8d4f279162992b8ff954c03eb5a5e79f7003e9743036de3e4794dae5236a16bb8515ef8e25dddb0cc96600000000000000000000000000000000000000000000000000000000000000000e6dff3e4c52c8c7736c645348e898fd4f4ddbc7ff00bb73d488a1c030d37d54000000000000000000000000000000000000000000000000000000000000000084b14accb769af52b16713af4ec9846635a9c611446103d32ac9b3c6ab16c3adffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61a02d51c32c7f9d4fe7f399ec07cd0f3ba353479c3c15c0a87097ff48c4caf00000000000000000000000000000000000000000000000000000000000000000ad32c00abd55cf610b89dfbfcd4f29dc4bfebcd6d66065d13b22b92f3ad0527379768a3d820e347636f13e321b2ad2c9ad5599e83e03583b2fa761f782de4404751d656e1cc9cf447660c0cb44ac96c4e63cfe9f0ee87756335259cdc4c034df321007715711022e43f721812cd9efa1d07c9b3512248a9f944cf27d024542b0000000000000000000000000000000000000000000000000000000000000000071f9b5aca7b9043b9a7a87c56c7374088a1a5ae564ab0ae71df1152621bb00f2573e89a7fc58b722b567ceba9cbdf4568d01f20059b5f0d67ce2f02a5c26d2f6f32d341ee92e5ddc5efe0ba8b7aa3dc71aef00afe9787130cd0221fd19c8b7ee2a5762b49563e18585c6edc15ab23e8a72508b05dee38b5f51d6c972631186d58395cb0e36c38f2285f1e6c301c32b78bbf79b1f4a8f3d92a6a11ffd15be7ffecc86cece7401ad4ed0bf21ab49b443d1e16320b275500e520ba1dccc99771a56048d46b8b7365efdfe5cf88d9c0ffc3fea4797d122aea191bdfce588c8554fdccef95f09527f0681a9d581e220e0bfbfcc9ccd6ecb8e28e08a1575f3dbe0731700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0b14817ff235fe92c1a6562a7b2290e5ed6d95310a63277990576053be34f1d8da9bb2465ff85d048d65d212d740ad94c8db8b0670b3c282fcca8a1637381b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff36804768f0736ff1a653ceccc7fdafa2244398fb3528fbaf22acf3b699cc49e359d02ebf3d32d8b15334b9dbfe5523163c5b5ebb1cc7eb05bc6dbf88b98fa101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff47dca9acdb92211f9e7dc4b057b9dce286a552926821c4f5b0fbe794a80bd20ba990edd6a246b95d2411447466b2e2ccc1589c8e153fce8f160db98ef9b2e105c360afae5455111e55f3716f0a6afb5af6605025be25d40a7048db97134ff9e545bf7d344599742b95a76595bf0a647cbfd58e3cc32b7e7ed09e55f82d7b9ccfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63407cbe1bee091ee8256cb65a3009db4a9a7b0f6712b8071cd5f05bfef9d60236f916c2ebbbc5ad701920af5c7f3ec01a1176574a2b39938ef1f295b91758d015aefde4a6e712e45ce4dda43fd681c7e831aba25743f9c9fafbd98364fdb7c6b89eed55165851ca85176e686c4d82f029dd4fc961daf96804887b653ee23e34638ac68efbff837bdbb9b534401511b9069e69b7a2a12cf78d1f52a26e098cbc6c8d3a4b41955c65bb497c551e6cc1b8a57f839221d25bcf5e7acb0f997ad99ede3099588d6f1a2bd3476a897297c8bd479166d11e15b1fea505fe8427bb8fbc3a94eb37abe20387b3e0fb8637712d3bd65b08e562916a74eff73a16871fe3bc54a8010e3afc091f48296c48c7abb69ee8236f7d2bb6e655c9dba605afb329c6b32176f5e7041c438b2b05d4596d53a42c830fee890fbfbdaa66edeabc98ecb8600706dbcd1b497cdc739d3c7bf16f0b1aa967cbb59504da18175a9854139217140a43e4428e9659648f0fff6f037f9b5dbfd2da8f615910499ded9a2c50179b\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e31f0de61f44c1cdc4d261d497cf718662ce97d4",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb8000000002b0429fb020c692500000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758f03a40\", \"prevouts\": [\"610d2700000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"b67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3bc00f369fc994f47536ced64d5e4f722a68c2ed1128957c24de4b5158af0ec621d9a3f11774810afeba87c9188100d693899e640a37210c96e3be6a00ac01d4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e848df663f65f0e27b2d1567423d7462b229bee90dcacba8c1bf1c1a66aca7f6821d9a3f11774810afeba87c9188100d693899e640a37210c96e3be6a00ac01d4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e3201e6cef5abb4e32884e254d83db6c48c0c98e",
    "content": "{\"tx\": \"ad9cd02d0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270920000000053c5d9ebdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b30000000008440aebf0409af2f00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487cb000000\", \"prevouts\": [\"15f4120000000000225120571bc713e1a1d58bc4a7da330f9b17653bffa646093e5f5e3088fb48bff87491\", \"d2071f0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"ca7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93602a88ba31ed3d41248d257786b5634ab0e5c1afbee5cd3bd44dcce92371e3b6ce4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8bfe61acb5630f372e1ed5eec342882068788aa3656bac92c2951e857c300141b065bfcb7199ff8296c5f7d41f3b2c6067d88c0a33f2878328c609d56cc191f12\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ab5bafd7c1f93de46b79074fd81f9b2e5cf089f85eea866c1ed233ec2c502c77e3449c69d4dd26d8f08d0fe98a8e8c1c38138c07c2a650710c465fa6c38a97e3ce21dc20c2e8df5336572f81421322a354c6d32fb525b1159d1e49b1e9404bf5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e3588db1c621c20dd15839f0a47a91d2b3a7c779",
    "content": "{\"tx\": \"abcdc84802dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2300000000aef782f1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7f000000006a9856a70490143e0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914719f78084af863e000acd618ba76df97972236898704010000\", \"prevouts\": [\"dd33220000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\", \"a0951e000000000022512051ad98b74eb9bb69aea595719e60a4b6c63bb1a22877115ad0df464229651088\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902fedd680285214298911720ea086f10cc79f987583addf2911375bd8024287541a1448e26a144f03af5db908309e4f116a413d39ee3dd1a900a336252fe40e2e9bc24811782ce338d9c98743a2cbccfc6c5a393dfe2140c007934a639f8ede25f164238fc43d62ccb9e2992cc8e5c5a5af01008bf2453cfbbc130db1970d6a1fb0bebbe8ae45eb100ea03981e5ee5d74d045d5e3bdcabf510442864f9de07134a74efbf408b0066c39a5fad284c2057c425ca415e15629aae9002b637a934f07668799d861f841e531c791e155f5ccd3f1258e025ad973cb5df69655c9594bef86ef29d0712609f98430c2fdae9fab3bd2d649ebc79a82ab5bb5ecc3ebcf4274ed600653ca8c41332e092844ec86b755ba6e6334aab62a5250982558c6390a64ab7aca27258b3eced2086c37bb26d4e7df0246adaef9c0323885e6fb51003ebb78d29c2f59e735e2dcd1e94a34fb6843af3cb7ed12dde16b5563e37e4132eb42522ef331a308a1025861060387966efe19efefb4da3db2cd671ddcd6f32a23cd1578b332ee8ad9b97c56a6f678badfea004399978d23da3c0fe7a137d798a7ab6bd70e20be62e6f59bc5caf1b0092264a9a24d6c0c258d7848b002c276280bc50faa2b322b95ede4a236b2d4c4e6b5954a4381559faddde157ec14303c175646791ffbb32a6899588f288704a9cd05c89a9bc833681f46b5385ceb62e18cacd8aab1cb335102540fd7775d8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b842f99ea244c665df26628cb4bbdbb47487c1eabb2046fab742bacaeedea65833cf35ac099042702f37424b07b91f05c9425e6e1d18ffa37c0a546b69cafd337007ac6d9f1365651a4d55e6df0dcb109d268cc6c386b355a4997173bc95c886\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902173173196458f600957f1ad598578320c270d324d15ed40c256015face8b7476ff26442cbf133db0f2a3f83b369b6d68178ee9e21d95d246050dddd1019f4ec3f8cb32192ad0054bf2b3877db0479f80702afb6b562a744ac2828f0f044c3de5abc5001359b2b1b5c62e7fa13d375e33a649a8818bd4873ce23071dac29484c0fdef2475e033f7afd5b0c87e98694c9380172836aa95eb2a65b9d54d3f814d4c4691eacb4bf2b7fcc8b36f20f449940de5e882b0b8d2614a209de7fa223fd94fe5b5c562468c076563cbe25429935cd01a032345b52506a2ee2144bb9ac3c4c90511e1329fae67d842cd218cec63b175ce578ec2d8782cf71048c593c4678dfa9e66d45451d8cb74c99c94d7790b74c56417c62b651da353e15636fa48fb5b4a3e974ae1ad02a771a7f5907569988e56f483326b3a0eb8fd362a74b6c3882ce617db635ff39394dd77f1838b51fb65f6710f0a5301c9d68ebe6ca6aa6d21632de5a6e20319af1edc5bae1d290de271949eed71bfdeb089eabdebb7e778fa2863fdf0ca7c02efbdb14651f6f4bf8e1e5b566bc0e21ede4ed513ada769ce7d49b7caab3769a6752db202ba14aac07d817cfc9a67cd7a881891801e39bc59aff5d759453300f1a618e843d38db301a6dc4ac4ddf4c9a7477328dc2242f62d9e0e78694bb95e96fa5c472f4d419c967db3c466be72f2aab141a7c64dfcfe9ea56c70a154edc41a805c76607561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bfe9fe1aabc74f583e9b16d04818af537700e25fe268cab74fc74f0ecdec5c0c908709641cf32dc4788f906f7e3621a0528df09509ddf1e9982e4479aa4b5d9a6e41ed285c226ab336f92f35d989a379104ed593ec3ff802714cc8e85daf0b3be26db4ec4cf8c6a12d3bfb33a6f8c1ee971c26c5be04413f1d9dccd7296a9839\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e35adac42c2fa3fac81b5b56415001d9ef213aa9",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706101000000587c2fe78bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c428010000007d05a6b102dfca430000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac31718742\", \"prevouts\": [\"d4c011000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"f5ed340000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3044022001d242d79af56e82790a35cabb034cb4620012c4c2b71802b81ce194276bdbc6022034a598a1f6a01f6e21201ae38684321c3f4d721d8ad9132ef00b81937ece3d0902\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"30440220594c794d944be222fa18971f80be7d6f317a6a8d098db0a8588bba4de170d60f02203142f36632a7057f912086eaf61f7e22470311cf09cdc466e68125e8c7c81cb602\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e36c31c772e822a277d29a41f45a505e97121618",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0102000000461e5b9c8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a5000000003a7310c4024533a8000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487eabc5253\", \"prevouts\": [\"a46675000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"4386340000000000225120997d8f010f68a117b9644ba05425738241c47f04463545c88006dd06ca2c16fc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/pk_codesep\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c208d8f6cfebd1d11aa78e93527acaa8fc1cb4839be6ea139939100422019850954bd45d21b8eee6fcee480987eb2d737f581c7a5fe0040436175d0fb3528eb602\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20acab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362ec9922274474f414215b9a6cbe20bd673e018c9fd10f6b8f0738c7388433633\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"2a2d911382801beba1b7f099b56b63e3553173074cbf37af82ac6d6aa5607708ebce7224de1113b8c841aced42773c0da5d9f9ace310006f47ef08aeff9f2dfa81\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20acab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362ec9922274474f414215b9a6cbe20bd673e018c9fd10f6b8f0738c7388433633\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e37bd80d8483f80595f8de680651a88967e6b765",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b550000000085442cebdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8301000000993071c6049f014a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87c8000000\", \"prevouts\": [\"9ec324000000000017a914f5a65ca4534ef3ca5833434c0dd44a3e128f499587\", \"f67527000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ce4de256d45582b670a4c1239812adc50b8390a19555a28771c44c39ddbc9e48d8c51b601472ea40be046eee3e3d60fbfdb8443327969b51457f5013bb126d3701\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3500b4be1bee9f95f9a302c177ec0d9aacdb67032ac0b8f0a6e776e6f0f07277da13f209756779cf5c8a2faadd8d57e4d1a08889aaae5e620bb9146da2cf444e01\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e385046269e21e18e9615b10675db2b779814ea6",
    "content": "{\"tx\": \"feb46ba5038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45901000000d71bd59f8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4be010000004e14988560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a7010000008348decf04584a79000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df979722368987a5c20248\", \"prevouts\": [\"41353600000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\", \"744c360000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"28650e00000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"b47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936258544fd2f36a8de2d2245a51d08c72c32ca668da38c73d56f207266764d588feb712e9c877d580eafa00acbc739496391db115356dec5d41c0ac008be904b5898ae4fb28ba039f9030001532aa52d54afebb8b1d186c7283d6707334cdf0cf3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082f8e322f728f7f2bda8f14cbbb71f9286e41438f49abc55856c1a694b654384417e736a60655dc533a38837433a3a305c9a2d5b0314030c91796018120c3e9a44\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e3cb84cf87cf0a5a0e394a62331f15e54cde54f5",
    "content": "{\"tx\": \"2bba28450160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f3010000004fa5d0840202ee0c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac49000000\", \"prevouts\": [\"25880f0000000000215d1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8b73e459b89a1d7a6b88e5dcd2cb404d25a635453075b8226871cb5f22c54414eb1214c006685a6b83d7048a59fb5a2969fedfe791fc3d4331e98c48e2a3fc3f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e3e431ac9b495d6b12f584909dd0891e732ef378",
    "content": "{\"tx\": \"e8d0e7300260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127071000000007a5fcead60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705801000000c2c69bd103096b2000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487b8556127\", \"prevouts\": [\"487a12000000000022512001f97817fc806a0f47072a55dae4866d18cdd8ca9234fe6851c34258ebf487c5\", \"e3b0100000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c9c968f9ba5683eb348a293824f936ba4aeab271178d077d8ae451d14797c79222d5ed5700e388fb215a3094328c95f7fb8c0abd1c53ca3ddf4f6d104c5d7ca1d6d3ab3f84dcdbc85d8f5796c1007b8de7ebec0ac109a6c154a12806951c54ff53fd942639f8cfddfa6b5c7d3e587f19a72de0735c456d43455d9227be6160d7d51cf84dec7373b20d8dff64470f8825bcf7a34b731edcfcaab5cd3527926e19048eff542861d21764d3a7d60b7055cb763b9e71d8a9b15a5f7816be2c84fa6d7957487878e06ce9b558a90e7ba780e3c6b77f6c5cca4984377806306df92586eb63ef5a88dcb01c0577640ceeda630459a2e96d36108e9a5631b935af8244919e7ebc5e420f037e17cc9851b95c9aa23cc94855e5257466ccc2e3898ecc7f59ce29ca9fc25d7826cf6af6046a773cd48f41c5ce6a759ecd21e203f4ad8087f456ef3dd527f31f92cd689a30a1bd4d577ef202e5eb071d633e809b19c6d79e76613882ab7fd9c4aade2c7af7ac0f9912b8e04241827ffb0d3d28d9a1fb964a108cc0c3cd93c2bb66ec1c3672b8866ffd3942ea203761b76b7ef45fefb49d0d1e0e0b0cc7abba5ec4f6dc96eb0ca68a09348c9aec4234c7b428a1cfb9cdc45cbe479b8c418aea752f7c7d0f59210b329e7521454940693c821ffc617b7a5373fe53042ac45c569c272c3ab27261c71876396358482a9908e08ff06912fcfce2f30a0129cd58655981a175\", \"837d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b2b6f8ce03da5bdf49a66edb45495bfdc91333d4a04a6613bbe19192007d3d876294a5d2648496e5016f850eddfdf01467fe69221e8567db6ec356a8117d8a748163db171dbfcbf374971659a5a65d0378eae0ee15db360ca8cf80a8c2e13046\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022d1561713753fea5caeb9249549182ca03c636e9461d9b0323932c15ccfeee04988a3ce896f53eedfec4b9fcbd3576f92f688c7cded1d5b1c30dda1df445daac9d3fc376e6ce5b2353313d56025c9202544107727d0e30bbf04085d5582f344bd8c8dd145611dd50d0ef23dc0c0de4dcc8d11e302364f31301605471a3efd8ee421d884ae01d30aee5eb87c42356941b111fd28fa08cfd0689aa6260cf539626ed8134e3844d07c75ee0f6055b0c878595064c23ae2362343ff6c702963a2039302ec2aadb1e8d979710224c17a7129c49ba68c485b6ce7e5132be3110fb2d88fc7c3aa6b4c8f9895c6be2847c75656885e1ff6b697a4b16fb612927ccae55c3148d621fd9a029fcfa2220d0b422f23a488393d0c1be154890d3958088d2a4d8d51832488046954044b3436d950683bb980b7a9b5bafb2ef19f3441c9a342ef2522109af52e6fc59377d0a931d479adbb836283b1f615c76b645c5aac05dc73a49fae0680eee3c9c45ce5afb0d40e52395564b525c751b4eadd986720f7bcdabbc6c75a5922f00b27186554838a76a01140a4ff0831cd6f55d97989ad81cb398265042cd92f132f7b1e3a122ec0992212ea276eeaca7f43a26207fdac60c452a6583d7006821ba3edba5cd3b8d2cc568b4296fc307b7a7f24777499b25d56750be6781a18b9885087b86f560395a2bc59687a0c8a4ec41e283946738a288ce230cb956bbd51be1187575\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08209d3f278379d69ec93b9031f683f10c8ab57e2d08c050c4811cb81bd332eb9e3ff15e37d03bf407745d47da370f693bba1bd1439d95d9059575aa23ebc3ce6e3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e3e86951be6edc4911741f8779b8b81f8e19669e",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc200000000f7b7a2a260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700e00000000e4710aa80255ee7400000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88aca0000000\", \"prevouts\": [\"07906300000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\", \"db0f130000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_68\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"317a4a103b58c27d45baf7c2345a56d485f935e67341ff7860080d48fc6c612ab3e7403e0969f416469c26e125fe7f84f10ada2b55715b4ef00569d0aeda4dc501\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e9e95c398878e7c153910b7372b1eeed9e33a6a35139d9c23ab6ce95bc61c3935e0b522c7c1ebd7f1f56082fcde31fd7bb0960496b7e3b76777b4ebd1a9de57c68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e3ee89b296eda3cdf6b73af88989c9879d826a5c",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40502000000389ef4cfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cee01000000e0711392020eb285000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796e55e102f\", \"prevouts\": [\"67343e0000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\", \"df294a00000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"compat/nocsa\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"304502210092edd3ee6aa58f60c85c28ab19899569f84427455e953a6067d0c7be58c03a9b022024e4be6cb369ffe36d3e1a170f088e65ce99764c3d18d9676ac8be7956f78789b4\", \"\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"30440220391263d7f642df701bbcdeb9507c7984c17558e293cdde994791b453888a7d910220678b14a06f1aa80274dbb0bc4ba4782adbeb0d27647d0f470d2c2ed989f52ea7b4\", \"01\", \"635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e43e0f4dd6d04ff5cb7feb566ac7effde65eabaf",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f20100000037a88ef660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701a02000000b0c706bd0158741900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac4f8a5b2c\", \"prevouts\": [\"00a53b0000000000225120cc81d141bd4bdeba62b4e9a08040837dfb25b01ce96f0a5c25fe4ac81b625b74\", \"ac790e0000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c5215006313e029bf4eb62de3a0d4c6426daac8c531925f7b139c5f1723992229e67b015cd7b874bc075cd8f51008581fc4dcb4842056c029414218bc5a2feea4e1a1df3005c486d02b3b61ec29a3ead78a560e6676b99d8231bc4c29d368d9dca55106a340450f53ec45ed7b5d4071e79002f361b58580dc2466fe9efe2cba7b0bcb5b129bb00b4193c52d316e696f5ab59e4483b71c971a53f07dcdc22de9facbc3f066badcd574f0881f135a18144d897a16541570b87091f3d47cf5926be2ece685dc95e9e271f98062588b23ba81a90f823bbdbf466a963b10e9497e247904cb1cc4b54a4f8e68049e986f75d87dee8bcb611665e159271f6a697112d67275f8876920fd14d255b900753bbd34b8f2a6902ef047de948fc0884487818dbfbc4b88070c7efba56867ca33e52e8a29a2b999d37560bc034a3777da508f05cf56d69f9969990db70f9842f789c55c1324a8723cdbdca5414db759c77f160a345a6e272ab11ca860aab60327b83a22f27365645dde14434d19fa3f3addb88de5cf5defc398a1ee50f8926088b018723eee2ddd5cf5225cab49f6824c923b02829a5b163add1d099d6676a11624693b453045079aef57d1ad91f45ab9a8ced1d4cd6d759a49fd0fbdbee5378a96c8f80d5511fbe9c909c2daa187e8ccaba2231f06c88aedd700e92af11d81847a9190a579bb636255414e15fc2357a08a28d038a2d18a25e396138bf75\", \"f37d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a2e17bb353b396a85b82cbbb125d8a12b9798e1795cafa1972a041833c1bc52e4c9f6a777e87112c04511ef8a291d390ec48b54e57ed7e78d9086ead135876e880eaa4a5149b34d26f0437dfc3cc15f8b829f232fb4e000d97f0d76bcdb6c884\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e3fe184f2a584656cfe013e8b8d9bab901a7882e6c01e4909c59da879f52259175469cd16c2ae4cdbf13f2128b40b98307aacad74d63ee814384acf19f90c3889d2b3f09221a91db4510360db5e17103575797f76fd6314372944a728f5ab3c810963aaa4a98fbda7314777e340d0e0de988c76fae34af0b3e8091dc749110206fe334be37a1170de5dae87800eadc17d27d08164aae335a6c40fb101017ee2b8b3e0c0ea07e252b8c4f621814aa8d9d1a7fec447e8b2c9c4d469ab80b6d8022e2ff6495e926fa72521572643ecb402c43e5cf6e5012cc14f621bc3843d0f9568b635b8dea92cddbc30e54ca332010674402743c50d9c9b8cfa8971b00337701bdee793d48e1d32da8425aad74e23580700dbc1eaf20553468f294dfd47085c667d2cf184767e487163114c9a8959eb3d7edcc536ff000692ec48989012c6c770e5aee575ed68fe3838163abea4fc898e8c233c32003ad218b205313be65e4b0802ce610f45eb9864331d42b9db88b26e9479f911e8c13d8473514c711590b876a2efdfc3a658a6baf6bd6b7a50c95a88c70a93a9495c7fbc6aa7030ff8371ac24ec1f2da075d0bc04cca17e30b20b640962744eabbe565e03d4698e9d5af66cc2f2d7cd79ae87f03c3a42151c803ee0cd74f675935282e8982ee0a1d47163fef3157ce9bffdc6f89699563365092c7d95aa1e87242e43243f2f5e1fb1f4dc19f77cfa33bed98054b875\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364de51b04e37785a51f8e3fff41f769838c27cc7008169d15b9197fc58a3b6e093f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082cfa000ce8b9790c39a5d5a4e1f475bb1ef714fb8e08d79945cb39f042227236d80eaa4a5149b34d26f0437dfc3cc15f8b829f232fb4e000d97f0d76bcdb6c884\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e4400ed471cfae79f01e699c1535a927cd7db111",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf9010000001645c582dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1802000000937c02e50338aea400000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a62e010000\", \"prevouts\": [\"a5fd570000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\", \"f4774e00000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"067d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367d67d1e8ddacf64724cc3740d78bc4f84845b0b5bea6009d6e539481d3db422385587f46271ff71c1a8d3d9e62b351dc1e7761b3de349b9de66c491fc83cbc116ed3422fe95872366e2174646ef4116c9fafb56aaaad9ae25dbd472ec9cd0fc1c48ffafb7a4cf249a6909d8fbff6ddfd3f500331ce755bc2f73b79afc0800987\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d8f8ecbd50a1c4de67b0557ddaa829ed57a787bea0d02f899effe5611de93fd37f2e70a8b9232395faf03242e8d41e7097acd4f110215ae4f1c21e826dd60490c48ffafb7a4cf249a6909d8fbff6ddfd3f500331ce755bc2f73b79afc0800987\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e4403314230ec5266c263c14b3167d0495467abb",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6d00000000774e8a9b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b1010000006be7d4170139141c000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8744020000\", \"prevouts\": [\"c81348000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"e5dd3700000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f04c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045ad7df43f1383df9f0df0a1e0ce133acd14e2258cbe9a702da78bb61f4d1a9bc80eb43d08761fb76661299d0344fd2d8bfc7de5e7c6dc622156e95971f4b8396db5b66a7e788d7f4d892aefa7b705b94e6e3402f32316550d3b683ba5e55fe37e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1baf3800ace8e6c95c7e7a9d035d879049832cd6be429795a36cd3109eecab56cf0292c5c10d160f8e0745cc9e7b1222beed517475d04a852f0f3c02abb361f19b5b66a7e788d7f4d892aefa7b705b94e6e3402f32316550d3b683ba5e55fe37e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e4476c9611f68d7aed1329b54ac787a7dc19d3c1",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf9000000001cfa84b301032e4300000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac7d9fda3f\", \"prevouts\": [\"e64c4d0000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"8b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93694fd982e1b11b93dc03e5fdd59b6f9045cac66289faf2302448a1260c5bfab6e4d7dc2c55a7521ecc297ff7217b922438f95dd9c29c118a2bf5c9e2c8f8c84f32a50ac17afa49989b8cd5fe09550e31f987b9afab4d6ff7fb0ac42074cc4b38f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cde8e58194ee2d9158b02514bf803786a3307a33652aec833c6f0052c5cf85f6d8095c4fc48dd4a937a2ab720b4c7b803df056a6d61c0b781e24263fdb2663252a50ac17afa49989b8cd5fe09550e31f987b9afab4d6ff7fb0ac42074cc4b38f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e4549906b6821c9cfd2bdad13fcedc9f2ce44c8f",
    "content": "{\"tx\": \"01000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46e01000000aca912a00381e13900000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac82010000\", \"prevouts\": [\"a8e93b000000000017a91437a5c76a04bb604ad99785877003310ab74c7e2b87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"165c142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"80b334005ae104106759e292d674d3c28f902644005e258094b870c5c188475a4d383eebf6d0674734689ed679337c48c7e9e5b3670c4a14848905637136d946\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e46150bc653c31e407e6428aa1a6ebf50bf84aea",
    "content": "{\"tx\": \"f66b5ce4038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c465000000005be9d6eedceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc300000000394663ffdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c08020000000e1b4af6047d16af000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a62067231f\", \"prevouts\": [\"3e80410000000000225120783dfb3310d474c767ef9239befe26bff1665135289516e5417abb1737338f98\", \"172323000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"8d5d4c000000000017a9141757f4686f091b43a46fa47e92d07c87fc7a205e87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_3\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"837a68045efd193f0eb98ca50d563125d43cff74e3c8c6993f43e21667b07e47cc0c5f992a02db219e1e3c03868efd69627b67b71a0f123ce6455bc5a05df79d01\", \"456e0e62f9289faf12d8e11aee380df2533753c3927854b1e1321c9ff057df6551384b8ae66513bc066eb9275264d9cf0a4d2d1b1575b79ef2cb29159b7b8a0491af222b67bffda905921df2f95a3c286ee992a87d57b4d447f8ee8a7e67969ad490d8f4847c62e3ae5e0e10b6131bec9dcbaf49427c4defa69f0e12795793e55f0ae087d32680c944c36b3a1a7833d518f5e70149b9c9527a0d\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e205163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05c76cefb21a62104116911d8e8b2e45a18b2b96bc39350390a3dc53de4d7433000000000000000000000000000000000000000000000000000000000000000063d1162584884dbb484b96d1ed4ce4a0512e9716da39c30918608fb6f95bb2c400000000000000000000000000000000000000000000000000000000000000007272812a8889423cb2003a913d32f365c6d35c633594956d5a9cc90b17ca754ac922743679a5a6af278245238d6037175a7256ad00ffbf996a910ea41a7610511fd163d9c8018e5282f21786763a4c52ced4820abfeb403b0b1d7fa7bde30aa139f8ac87943424ef90f5364034d8a7a26fc904027381798e6672c9d1936f41d70000000000000000000000000000000000000000000000000000000000000000105d0ae378ff1b6f0fa719acd7567a35003274abc0d03dfa689f7e95b6df185cabef40480030bfa6b896c61fc6ab80d156e2156d028bac1f1f329a98ee46486d723ba82ec9188bab38613f5640a54fe3d3e7ed44ecc46fb288a21d330e6567a9f8b0768f17293d87e4ae3a232d31846bee1650f75b19c2a43b567cde0e7cfedbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015fc8b4e5af59d5edc2e4cf6be0818a13031d25cb9314ed8998d05c9cf9daf778327c59652234f3b0f296f92c0ebab6d2ef46ce54921b25a9f796c10c849f301ea03ca4f88fb6350e9feab730d33f323a2394c1f5dfc7b9e461a2eaa76eeb264ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed71b9a2736a87d63a4ca2ffa70dec04b8d71a924a48cafbc763ba6e1b0451a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff93816283a2c90c6d10a38061255b862e01577a0aa3eedaa665d8d20a43f1f74f828ac67de897d9bd1366af382045d9cb5797e4e6bc32c8b9ec3c9f5409dfb3fc20060d514f2b33562929bff48ddb4def570ab6a586533f3c1e41e334d3bd092c2ee6a87b947424e4cae845652366f0676c63850638a8d7ca63c4488ff4877408e608068cbc48255ea77105456f8969fb5dd36568aa4bc87035ee2cae1d30427acf63a0460e3135d3368beb2008f7310ad4143e8e5f370736a23446973f3f334c3ca209e6ec3c56f25e2dabfbf555248f02682ab46318b9bbf2da715a12a2b2bf9999705e46af7c358b8ba60d80b4508a8c9729639522f6f63c83c2a34606c8b094d807c24f0d2b08c9b8232bda7b6e3087fd0203bf7f39947db5d25a3f8e6f75246f0d608eaad49446ff6b5b1b9926953d3d883734e979f05038afe526de750ba72fc5d944722c8e9426ab6d57685ee28c2fe526dca1ecba98eea3cbd008295bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000052e3496d6cbc35d102a166e3843d452442a07a0a4683064f6ae0bc1615cd43da11ddab6ebb387dfd7492ec96dbed8283eba9ad068a1aea18c111af22641b5067cf80a56e18218d8ac219d18a141ee4d9fc814d478139d60a5c964e9d08a884073eb6a973dc07fe6fa35dc99d39bacabfd586f0b9398b3c1fd154587b5c3b48f60000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6930f03d4ec7b261c172e4c2de02c038f1f230c95d821038c10fae578ee20b27814b8f6e76637ecaa9724e004e9b7ecff1ccb2a630f559c053260a9b7f06768d20aabc63cfba2703eefc30c4b61979f6687ac7e66014a751fd7ac847906810b54ab005d2ab3d381b1bde5ff1c4d0503824cce1d347ab7ba95e12c9812c2c7bd771eb468ebe3c1ff4b22f9ae8563970f7c9208d2a57c3bd5fd8fe188feb76ef7b483b54318337e0bbe16b685dc49cf5d4dba35cd4fa202c7740447b41dd988cece00bb2acebcf172fa7e5c0535296e8daa79167a7f2aae6bd54c3f86b0caf53785baa30d0f3a9b6354c0e96a550a4a59b52b66ac51c6518574b6a2d37aaf5fa77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00749959ccb6776715d0a7f8e958f9ad8de11205e38827aae38a8700cbd6ffd9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4d1f0778be7e7bf68fbc278adc13515356a7886375ae569c6d601af68aa4f07608d91ded0e41e98d5b81f401676e1ef23541a78ef2e9f460861d5716b482f8f00000000000000000000000000000000000000000000000000000000000000003c3e3a26d225dc69e41910d4af8ca5636f765bdbf9ab00c5be8e82099baa8caa206f85846ef59ecaf3883eff6a46b3dcd02ac966bfb5bc3deec6e032efa01933ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000005e9fc283d0edbbda40a787148720e8c002fd283713cac16a390569aedd312910f6b4d7afde0ef1ad599e16d159c21c3a5749d510b625adf48d88503247e62ea9\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"837a68045efd193f0eb98ca50d563125d43cff74e3c8c6993f43e21667b07e47cc0c5f992a02db219e1e3c03868efd69627b67b71a0f123ce6455bc5a05df79d01\", \"de9d790e2b77dfd852c61699aec17f9c4f439cfaaeb4b321b377976ef72f80b123427abe65e164a8c136982d21905c11034db1f08f74707ded1d5c3e4e3d78e5b18ac37c0aeccf67f600e669909fe39ea8e197f99f9d177e0acd3a0e50311f9c0eba4c6ec701c39ef6ba2f9b2389512b150a7df1d08acbaf360a344c89ebda9fa611d18b9a0776e902271bff0f7010b6e9cf80c422a6a0641e\", \"7520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e205163676e567cba5788686ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead6ead587cba5987\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05c76cefb21a62104116911d8e8b2e45a18b2b96bc39350390a3dc53de4d7433000000000000000000000000000000000000000000000000000000000000000063d1162584884dbb484b96d1ed4ce4a0512e9716da39c30918608fb6f95bb2c400000000000000000000000000000000000000000000000000000000000000007272812a8889423cb2003a913d32f365c6d35c633594956d5a9cc90b17ca754ac922743679a5a6af278245238d6037175a7256ad00ffbf996a910ea41a7610511fd163d9c8018e5282f21786763a4c52ced4820abfeb403b0b1d7fa7bde30aa139f8ac87943424ef90f5364034d8a7a26fc904027381798e6672c9d1936f41d70000000000000000000000000000000000000000000000000000000000000000105d0ae378ff1b6f0fa719acd7567a35003274abc0d03dfa689f7e95b6df185cabef40480030bfa6b896c61fc6ab80d156e2156d028bac1f1f329a98ee46486d723ba82ec9188bab38613f5640a54fe3d3e7ed44ecc46fb288a21d330e6567a9f8b0768f17293d87e4ae3a232d31846bee1650f75b19c2a43b567cde0e7cfedbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015fc8b4e5af59d5edc2e4cf6be0818a13031d25cb9314ed8998d05c9cf9daf778327c59652234f3b0f296f92c0ebab6d2ef46ce54921b25a9f796c10c849f301ea03ca4f88fb6350e9feab730d33f323a2394c1f5dfc7b9e461a2eaa76eeb264ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed71b9a2736a87d63a4ca2ffa70dec04b8d71a924a48cafbc763ba6e1b0451a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff93816283a2c90c6d10a38061255b862e01577a0aa3eedaa665d8d20a43f1f74f828ac67de897d9bd1366af382045d9cb5797e4e6bc32c8b9ec3c9f5409dfb3fc20060d514f2b33562929bff48ddb4def570ab6a586533f3c1e41e334d3bd092c2ee6a87b947424e4cae845652366f0676c63850638a8d7ca63c4488ff4877408e608068cbc48255ea77105456f8969fb5dd36568aa4bc87035ee2cae1d30427acf63a0460e3135d3368beb2008f7310ad4143e8e5f370736a23446973f3f334c3ca209e6ec3c56f25e2dabfbf555248f02682ab46318b9bbf2da715a12a2b2bf9999705e46af7c358b8ba60d80b4508a8c9729639522f6f63c83c2a34606c8b094d807c24f0d2b08c9b8232bda7b6e3087fd0203bf7f39947db5d25a3f8e6f75246f0d608eaad49446ff6b5b1b9926953d3d883734e979f05038afe526de750ba72fc5d944722c8e9426ab6d57685ee28c2fe526dca1ecba98eea3cbd008295bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000052e3496d6cbc35d102a166e3843d452442a07a0a4683064f6ae0bc1615cd43da11ddab6ebb387dfd7492ec96dbed8283eba9ad068a1aea18c111af22641b5067cf80a56e18218d8ac219d18a141ee4d9fc814d478139d60a5c964e9d08a884073eb6a973dc07fe6fa35dc99d39bacabfd586f0b9398b3c1fd154587b5c3b48f60000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6930f03d4ec7b261c172e4c2de02c038f1f230c95d821038c10fae578ee20b27814b8f6e76637ecaa9724e004e9b7ecff1ccb2a630f559c053260a9b7f06768d20aabc63cfba2703eefc30c4b61979f6687ac7e66014a751fd7ac847906810b54ab005d2ab3d381b1bde5ff1c4d0503824cce1d347ab7ba95e12c9812c2c7bd771eb468ebe3c1ff4b22f9ae8563970f7c9208d2a57c3bd5fd8fe188feb76ef7b483b54318337e0bbe16b685dc49cf5d4dba35cd4fa202c7740447b41dd988cece00bb2acebcf172fa7e5c0535296e8daa79167a7f2aae6bd54c3f86b0caf53785baa30d0f3a9b6354c0e96a550a4a59b52b66ac51c6518574b6a2d37aaf5fa77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00749959ccb6776715d0a7f8e958f9ad8de11205e38827aae38a8700cbd6ffd9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4d1f0778be7e7bf68fbc278adc13515356a7886375ae569c6d601af68aa4f07608d91ded0e41e98d5b81f401676e1ef23541a78ef2e9f460861d5716b482f8f00000000000000000000000000000000000000000000000000000000000000003c3e3a26d225dc69e41910d4af8ca5636f765bdbf9ab00c5be8e82099baa8caa206f85846ef59ecaf3883eff6a46b3dcd02ac966bfb5bc3deec6e032efa01933ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000005e9fc283d0edbbda40a787148720e8c002fd283713cac16a390569aedd312910f6b4d7afde0ef1ad599e16d159c21c3a5749d510b625adf48d88503247e62ea9\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e4a1dbfb8711c43befec064b8fd396058b0c54af",
    "content": "{\"tx\": \"17f2605402dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc60100000098f115be60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270230100000050702df8027ffe3200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48752b40928\", \"prevouts\": [\"5c6025000000000022512040649a1fb199947d796ba41a749770af0c9b8b8f2ffad14d369b18f56746cbd7\", \"9a19100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ac3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082c63b209b29a3611ab6267155884a7f894b498570c9db6a86ba3046458c9f77af637f7085334bd6ace67733ad5f759fad65febfe656f63b2b30abaed1d2ea29dc9de97a2505c9a0de734aa1a6c773f3979bd21cdf34ebf80e6ce3c625c087f57a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936832e78f2a5d9b0c4680fc7dba3a6d5673c26e47a2a412d10c5fe178db4951a94073db8fdd32dfd70cc3c0b801d057b12e5f9f3471dc2e8803f572b477b94c5e2cd8777bf679e716871b092f46e3a69645e6fd098b2f58cf3078cdf1926d6f261\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e4ac1ef7380b8d2111b6763169a1743b27f8990e",
    "content": "{\"tx\": \"ce0f492d02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be2010000003249bdd560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c501000000dac634860214d03200000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88aca6414d55\", \"prevouts\": [\"f6a9240000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78\", \"23d00f00000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"217d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e4f67f6e69cf51b25bdfcad90ab02b519823ccb2f4612df68d1a9a4df99984c88f488f9b2dd04714e2920653c1afab7d010d81355bbe53edbfcaebea15ff1da48\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fe391bfd09479964276dd59b1d58dc35d2e52175d5fee5e0ea28559bd14655b056da9396880b08a11a17662bac4a7b382e749572eea29fa5ac5793c70e2d18ea5bb5ed745f7425de3873ba37c460c85acd2f4f50490d9d3680fc958bb85bfda6f488f9b2dd04714e2920653c1afab7d010d81355bbe53edbfcaebea15ff1da48\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e4be0b4404267bdc3cff4674612fa0aafae17da8",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf9000000005afac8d501efd4070000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963b2ee04f\", \"prevouts\": [\"82df230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_61\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"1da26216c5fa21de293a98697b7f3e6e24dd98e9b97695c15c1739edde291ec24824714e58e4e9f472cb3672c9bb1c6f83d4ae985e1a389fc55f599a575691bb02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4b78771f6b75db27ee3b71eb66c82f7ce11a2f6207a3899336db332f998a208ee25739e1e5eacccdf2e17e07da72c1e52bd0af03b979f7a670f99099a53358f461\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e4ed5b23d5de1068cbbde995bd4acee64e91aa7e",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705100000000fbf40f81dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be10100000028107fd004ce692f000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688aceb524132\", \"prevouts\": [\"aafc0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"43d42100000000002255202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bf12b3ce410208e8d45324bc449e14020662d67526263b8e81eb7a746fe6fcf0a151b2f58e36ed3b57ed3d1aee1ecdfd43cb0fce5e33bf3a750433f4d93c9dcb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e4f857e19db4cfd96f2d5054dbf40b5a9e492dff",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf08010000004772068e03027a5f000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d2020000\", \"prevouts\": [\"3a8162000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063f668\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361b9ac4799763e2e351da63ecca5a6348aa482c3eadd4509c967c8b6a34c76e4075ca33d7e1e5f2997f74dd285eec8a0e5cba5080c4482d5b595e9662ee4b93be0a1b6150087d660153f154c744da46b7319b80aea4f8e08f23015968f3b1d87a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d512c1673aa1d348e5f2f8444d57c2e384a9e542f3652a57ab10bce8213eb35faa5e1f31af440bd9528b56a4b582a327979fd28cb44b9e62075e623987b4c0f8e3992fb5cf2427ede6d61c8a74b8487764d962b41d4db4b67b9e943a724e86dc0ff\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e4f9951077eb874d4585b5156eb27d51d2efbfd3",
    "content": "{\"tx\": \"a045fd37028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c414010000002c805d92bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5f01000000eb722fc402346c99000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689873ec82e5d\", \"prevouts\": [\"2b8b380000000000225120d8440763d2116f9dee5377791731b3635bb44d7a42fb2b8a8507b8fff76ccab7\", \"dddb620000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"e4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f4fd06ba2b74fab4c367f8e8e0519d3d9be3851343b71a963fa32cdfd438e05528a09ca0f6d73d82e88e284042e116dab9fe2cbfafc110f6c0fbe5b2788367c646ec42a0fc3b2b57c90387175ef14e4ddb9fbb252ed168d3260bd00914c11302\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b24d4fab40ea135233ddc8c9f724889f007818f7ffad5749db3376d8fcf405e18faf2eb908b8657464a6ead7ee639edc82f346aa77dfb25920bb6227c2c4c35ffd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e50744f139df817035a18b49f300ba44cb0343d3",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b090200000035a3cbd1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7b00000000bba5cbc704e85a47000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796f3703632\", \"prevouts\": [\"490f2800000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"e0772100000000002251207a2f20e860cda556c5e91362c7f67d77fa79d70cce9558dd8fd8d88940237552\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100a3a5a8f8f08e76ef265172a8b0ec8b18f87ebb9279f084af614732c0d539310e022049c0cee6779ea3a42951fdcc769c32767d87fcf292acdba013654415e7a41d16812102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100f34f93c9a62849fd11a5918c863019d5b8c04806102eeb1cb8cb2e6f0a57529602206b166fbf74e0fbdef8baffce8dfa2ba6efc8cfb5d9ee54622b28dc1ce98a7f5b812102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e50e205a1d18fcdba7e8e5fcee9033cc4707f9c7",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9e010000004e8d62c98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48e00000000c08d65870131f23500000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac01adfd1e\", \"prevouts\": [\"0c3422000000000022512054aab8bc8194c133af7274183a7f3060903412eb7cc1a08d3d6a62e380c86e5e\", \"6c6838000000000022512014ab2ce168ab85feead37e4eac5416d9445f157495b1751829a16d631c43d5c4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93602e89707d8973173175c84fc9b7dd7d6cd1c0e0172d2891381d5a5bf4c8c8577\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aa6616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e52cfe3453de9b1d75444df456949cb75040b8b6",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5c0100000075641680bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8a0000000017e471b5dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf300000000ac1340c303f3d21d01000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79694c84f5d\", \"prevouts\": [\"ad2d7f0000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\", \"7d0e7e0000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\", \"9da622000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"4a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936528a77605e4b8cd768848df1e60fd0b649927a7f2710fbb5502fd93c97ebecd446c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9faeebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac749e2a390543356cdb3691ba8d54627dfb45f7f1132e94c1a4e909f84f1614c2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082696e0a39b8006d5c38246735bc900624bc412e796f8d634640137370e1472505749e2a390543356cdb3691ba8d54627dfb45f7f1132e94c1a4e909f84f1614c2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e531badf585946f2d8e4ca711ad08bfab23b255d",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5201000000c07a9ac860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703c01000000d90833cb03dc493500000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc90186125\", \"prevouts\": [\"5c76260000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"80e51000000000002200201c085867a8a36cc3b43fbed118fb6a6a2b3372fa424ec2d949bf17badd0269e3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_keypath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0e48a332b41c140e93e9e231b83c39b2237a87e263e3c1c5078ddfe3d6bff461d042642b49d4aacb0cc8a62eeeeda6c962df57b73f8e90a63ff031d35ea02abd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0e48a332b41c140e93e9e231b83c39b2237a87e263e3c1c5078ddfe3d6bff461d042642b49d4aacb0cc8a62eeeeda6c962df57b73f8e90a63ff031d35ea02abd00\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e556fbc1cbc098965abc9f19de4e699a65701b97",
    "content": "{\"tx\": \"d505974903dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7d010000009a3a5dc3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b710000000071f6369760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f501000000c7d508ab0473fc5900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487b6000000\", \"prevouts\": [\"a02e250000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"b3ca250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d95a110000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_2d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4057160f8c6426979d7439e60ba99759a3935003a8db5b7aca3a5c86a40293a9e05787c2f446b47de87682322df79a42e7b2c8c24b4f265fef710f0f7a68931701\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"12ca3b46c2bc154a147b7ee71a8b5ea042b5deea224b0c72564a5d75a7b0ea6471512e0e7254671afda5d4a3f90e153eec8074d30706e1c8a6cdff43e353abd92d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e5a06372794c8a0907ebcab73767cf918aac39aa",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708b000000003bc37beebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8401000000aa486e00015ea55a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac1e098721\", \"prevouts\": [\"322111000000000017a91448274ba0d73ec00ce63e7922c9d87a48fd0c670f87\", \"d110710000000000225120396e1e3d37873693c049a0e141d36811f0051f76fd306cc6c1f2259368cdf0eb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"be7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa48ad50d9ddf0b427aa1cd7e89a01799c6e7ad3b5475e2761c9fcf711fad5d46d911ebac8c921821ba74d98d656401ec4b56b2bfe8f672693a939227457b8b1a2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d1deaf9b354b7bba504b77e6156643d72237d1ca0dc157d7f2482ea02765e9a648ad50d9ddf0b427aa1cd7e89a01799c6e7ad3b5475e2761c9fcf711fad5d46d911ebac8c921821ba74d98d656401ec4b56b2bfe8f672693a939227457b8b1a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e5c2adb3e9fbf1cd914078ec2a63b5eb9a6e3abe",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c438000000001ea2ccb8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf180200000014118e3a013b6381000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748747a2fb1d\", \"prevouts\": [\"0dfa40000000000017a914f0ed99a28545ab2ceacee60b5537a9e5c34fcd5187\", \"67f27700000000002251202b6311c61a2a508a144ec510c52a71fff5d62c4fa86296d42faefa4fd619b162\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368a6d05bce1350142da4c8baa3641d62f98981f8d5be82f6cd048a62bad6f0283\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a49616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e5d4d4aeaf98b811a93af7c9329c6daf9589e991",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce00100000057728689dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb2010000003f48ebf8048c75b400000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac751fe021\", \"prevouts\": [\"016e5600000000002251201ca29abe36def88662b96aa36425514db4706e1e50a53467368d6fc22d19b945\", \"13e05f000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"327d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363674d83ec545aed04205f6c8011bc6d879deeac8bfcd4272e2d7b511be5f791a25d31a4d328a06fbd663a9de03f4f743ae6731d946a7b64875ecbfa9fe5ecb492e4cd18b5d1ec472eec5a95c6c9d67ba3848eb933b0b41a8c6d3176a27b07997\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac0f29a0308f7dd1d25542f1a27a19e78219e8b2987efd922e316e5388ecd586b0246b7a5461d23b2ebf642f7df88e05c9d62107f66abf7b5f94d7753ce57b53620e954adb3b90d8c3597d54022d70f5af7b761a66be618c54dd56feea2be872\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e5d756b155e51281410e56562a664673b0c34fcd",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc301000000859e9063bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdc01000000d82019748bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c431000000003461614d047e0708010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487e9103047\", \"prevouts\": [\"f007760000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\", \"93d9610000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\", \"f14b320000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"d27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0829947182c2cf442266d627de6569afbd254a849da3e2d989b935a76fec010797d33479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a9b801fc18e2353a9cd4de337bb33433fbe6225e21bb8b5572b0acaa50d11b7f3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e800def9a487cc21401761fbf52dc8ab7b9916cdeb8a2e13a665b6447e5fe6b3009b801fc18e2353a9cd4de337bb33433fbe6225e21bb8b5572b0acaa50d11b7f3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e60ac2a186190f5f41d0f98adb9107b436491c32",
    "content": "{\"tx\": \"91f42efc01dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c84000000001f7a65f003c7cb5a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914719f78084af863e000acd618ba76df97972236898726000000\", \"prevouts\": [\"c47a5c000000000017a914525ca05541c81a105639c2efb802eaf5596cfe0187\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"21521f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"69223f2e1a925dc7c5c485a09fd8f6062cc12da6766059d7d491ee86c66f018695f6f914479e07f220c6674e287fde9eabb44ee085615328446a1b09e8b1c1c2\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e617e275740cca2c1002733c0b62505410149814",
    "content": "{\"tx\": \"ebb0671102dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b780000000086a4f4c3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfb01000000f9046ad00132320800000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac41935239\", \"prevouts\": [\"9e3b2000000000002251208ee514ac0f4f8afe6d51e826a65d73d8e6a6dbdc4949f433ee9013cc9ac16e8b\", \"fe3c270000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_83\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"9adaa546032c13f5bd7fb396b9ed84af3a7459c050647a6330658e9fa44eb7cf97f1a3312d52caafa27d6a9e543d4aa3a3f183eb05d8fd4926126463f51458f482\", \"50e1b68863e2eeede36d96ad7ac37856d5df41c5724361e24ace24ce217b92c38dacfc12b9f6775dfe75b4a01ecbf3ca273e9b00a3a0091ca9e623337d4d69e596340911bc0df754c4c74472ddab49a8afac1c5c0d6f0e98320ec7baf2983a6d2ea246f654219f544de38eb16e4d4bdb05797a36d25c4147476b26578d7dffa6d6cc75232672843ac1f553401c29ca3967dfbb52ec4d2a4feea31c8af17b2a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d09d0fe5ac5750cb15453c48244c0722aa5e012d919be95d80ee37b2ea9ce3523f23f78af73aa23bdba4a706cff89810c83b7a828936e1629b318ea544d682d282\", \"5017eed178b867748f37569b5f1d1079e76759c5d72c3505330886d9daf00a76e65ec760926e487dd2cbb63e11aacc8a49c816345da54d66ef3bdb4a5a27a939325a5ae593e6ccae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e62e88a5e5a9d90dbb6072f7ccea09b105b0f310",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d4010000004448e7b2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7e0100000089d641a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1a0000000083a09fad0354caca000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acfa030000\", \"prevouts\": [\"5e70100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8e686e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d1414e00000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_86\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"5990cb2c8e00ea2a16a0f151d44f74ddc66438063a923331cfec5656dc2da5d14f77f8a988d29a40a97a327fb21ef0155a095c22a2d48f49d849b08bcf5622ae81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bf447c48889e60b479e4f2c98a44a3bf4acbcf12d088f7a9af60a69414fa11d5e6b86a6d98bb1cfbe666a197f7ef485d3d6282e5ddee02f0427e63019bf51ac786\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e638e75f42344b0c3f6564246955fb5d040cf293",
    "content": "{\"tx\": \"f912fae802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0902000000bd0732c4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5c01000000dba8b4d3014d37660000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7966d030000\", \"prevouts\": [\"836c7c00000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\", \"b5d1240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090206502592ab6fd45f774824457c83bfd05fd40c14b81295dd6d2197ae6f00b9a56d866a90a563d4594718017f360e7186af48c8b3ca16b8a002797b9080c8eaf0fab6ef8dfaf1a4259ff13023f68c3179e8bc6d43d0d48efdffce8a74b302304c2532e3ccaedae996197ee7f3693ec1fbd860de8b01c61fc469e8dd2bc640e9ffbcb326bff9d12debbd5d42aaf5a2f795512403658d1f5fbd07bd6a9269587e096a5c4977f8a3118da868fc99b729de21968d4a7d7840b549b8ff218931aa84ceee49867eb5c6e1f4ac83eb3dbc566549bbf103d6eac6cc1241e290c2a459181ad3874a4824146cb1f094111e6a892eb13cae6bdcb9e09c7818c97ad0075acf7638bd05cb925a4589f880847e2ce1bc517c2a6286b9a29241500205351295812941fd601d008c2cb57c9872109dc3053a024d57dd6faefce1eeaf0efb4416b0ec73430e00fc48a22902a5864c6267f79a6eac2352bb28b90581acd912cfacfc9e34112938a48fc12be480ae906bfe0a4c1583c53b29fd71b011f858e86522ab06d5dd207cedc2b4926c053fd8af96e7c27d1feb49121d4954dce1648baa3e6c7ae5202f7cdb0ee4290616ba0f470cd408a30d2d308f3ec99d6bbc0b58ea6daa796b5d18fbe4f00f4f9a5408870995913af92f29d840343b6490ed446d73321ceae02dfd51990c320423485dfe63ecf24725e058fc88a87240cf0e7b12a993d1b2f9fd57d09d6dbb1fca75ed\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ca8c0e626ecf2ef1fe50d0678891192825218ee00caccaeebba0271af988572e94cc415af9f84001a6feea45646803cad285186914838c4558edfc97d3166e78fd4cde6e083ceefa41c970e7ff247f88d4db270a866c6958487024deeb358702\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ce681a3d9f79d82a9dabaeb3ef080757585c84d247986ecb06f13e02e67f974a7d91974ee5914d5328e7e9c903d86f0ecb68283249842c7788c9600a3a4ef7c54635d8e15dd32dc4223da1daeac48d03f8981349fb0d45034043faaba67107ea1be7d9b079f9b6001a54266eac89b0948bcbe1623851671e097ac8a6846d406d65612039be94223bd9b3c1e42e823218c5a109a7cb4f92bbbc5be64b96dc2d072e2edea859bced484922dc5c26471781e6ce9172b896a403102edad052ae0759a7d69e93fe9ab6dc294fbfd417cb916646a5ffb1a5510a2526dd103507682b338b65075ae94e4176232468381ba55c0651697284072ce527b3705cfc6719cd1bc74e2c4a16d687d8ef8b1eff9e0a672d14c55038f1aa3909e8d3a40ab602221f99b87fb7e2da8b044b42bd76b372877f00f64a95e0e8308a983f961df92446b7630de6f41a76746ce2a20c3cc61b539feedc9a2364ed5ce16fd213cf48c734efb79ca0899f04a759377be0f1d3b806b291c568040cc5e4d87827ced3c3acb773e1c017cb4db77633d39f219e524a43fddf8646450fce092297117c946f9e111a631d2a475ed5a2bb03be1f89c98418d91aa40d144e0c8f775b9a291e941061449852feb2ebea67aca3c9c8ec72afc67497a171a82d535db50df6a5698240df7047e7a753357b7ae29c00151979c67e1ddacc58d6e021a63be146aaa4cc29b9f1330ab7068b9fa473887561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb43866c9dc2005c39fbfa40f99a1086b922c913a672fc19646edbf7ab3e480e00f86475c33b310e45b92339559838140b9b3f3d62b1cf111e129ddf9f566de62eb71d4983925d18ba40c8655020b616e094614baaa1bc1b56f6416d7610eedc4a1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e649d79b9010e5f76ed8c6e317e55e0e91802bac",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1d01000000a146999d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40b00000000f9d200c960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706c00000000e4a24ae5038de26200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79693145c58\", \"prevouts\": [\"a3d2230000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\", \"ba3a3200000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\", \"f60b0f00000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"417d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936571460ba76479f128232c1e7f3cb97430b20436d33add020c19a42e032587e00ebfb5abead622ee588f8a14df4b864e849bfb1ffa426a7f0fc441a7ea7f9f3e8819e00a9246c8c145cff8a91ff4546d478c6c8e3d7b4e3f7e61102a4388494af\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d0254c28ec270bdf41d4337856af66ad3dc8a43a5d3e633735369ec57cf2fec9da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e53f01d9cbc4ce44e53bf46e342c1ac713c14ac9ff1cc3e88a31c5570fba253bd819e00a9246c8c145cff8a91ff4546d478c6c8e3d7b4e3f7e61102a4388494af\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e660a993ca6c73039fade4ba3407920ada89923e",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf57000000008fef5e0960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a200000000630d7c750370197c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac27da9e2b\", \"prevouts\": [\"6d146f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"35ba0f0000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"565200a441bd8b33543b7d269c983d8205f3e3529da82e6dbe97079bebcd43624d9edd44919ada73cbbd16a552dc8f7abcc78f8d83fec5c5cafa9aaebb358a4183\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d5c7c919526b7c3c680b3761493b2bc4d2d01c6531647abee47966cf899369e4fdd074ffc209aa0742deb56a238fa0ee9e1c478bb1ce610149ac95a6a1583c5808\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e66bd9898efc98f464bdb5ece0b4f62d602dc737",
    "content": "{\"tx\": \"10ea334502bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8b00000000fb9e01a48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41402000000a58a699c023885b700000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487eb020000\", \"prevouts\": [\"761e7c000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\", \"7e153d000000000017a914b202aa31930f9cb7b85a632f41f1539f30714abf87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"225d202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"f21859a748d58a120b039827bc9f62d58b657c5eba5d59c9910395a6444373d32e691c8d6c874e8a48c7c3accb5eb868c1dcb19634bd3bb0153d21d09d4693e1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e677ad001a80f4218fcb1f38a8705f1d1caeb999",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c100000000e823d301dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc801000000d7978e97044cfd5d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac13000000\", \"prevouts\": [\"01ee380000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\", \"2cfe260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6adf\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082345e83ad245d963f373c443dd6457dec3808a4f865920e34bbc543e7d04d4c3d1c315aec02adde316e700f87e7c47f474d1ec7cdd06b196ee567d81a15967a13360497a554a17affee0221519da82623f7958d9c28014b232926f5323d6c78d1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f7f06e83b8f8d2d2dd50faf041bd8485749e4d90a35c5351976a06488b0663fe15b534b99635107bf366447ce9661d5eae557250694ef66e76c31b44d1abe134360497a554a17affee0221519da82623f7958d9c28014b232926f5323d6c78d1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e68c741fb9f3bd4beb774a6295165f0719b15942",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8700000000f0211ceebcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5d000000001eb9ae8703257e82000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac66000000\", \"prevouts\": [\"c04021000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"9df262000000000022512027ab4b673389804c5c881c6b67bb0bc00b1e4ec28a98fe3352d53ecc50b40912\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"5c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ae78f6229172221ba8b4bfb3a8449e63620c22f298b6d0c8a103fdc8dcdae51974e87bfb4d3d415907d7a3196832fc57be4f6d746253c89a46e8e4c968740366e8f45a3ac55dff4b7d62b0bc42204f13e92c55212ff162d480a58edc7717abc8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b3bb59441821a6815989813e9c3e139ed3a2bb96c5c0b1bed0297fe997254dd09e517178a4498250bd09ce9aecd8afa5f6f049a9750e0fcac48ec3d6edc1b53ae8f45a3ac55dff4b7d62b0bc42204f13e92c55212ff162d480a58edc7717abc8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e69ec7f55ad3c08cfcb37946cda5c9e8bd2f23d4",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9400000000c44b13eadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0401000000a6db52abdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c54010000002c43129203bb4104010000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6b86cdd5a\", \"prevouts\": [\"b93560000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\", \"27ca5d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"17f34800000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"a77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e389e677eaf5eeea89a70f01c0aa3bc14cf3320f4b6dd8cc61f33138af3398b5b11a008161139ac7a92b00665158d25501a881aeebdfdbf881ee45b85e0726c11\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363e9eb096ec4c0e60b6c49349abcbb61376af9764a0a95f04ae72fcd7b6082681146d6305f54208d13896b102f4aea30badeaee99896cb007ba6ff00553e24c3b2915fd873a4966f8e9b4a3b328eef3933245a1c852c287990317c3760d8289da96773453f0744a158be0509abdec64f05b1db7ccf03251d8359952271b442a24\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e69f704fabb54c278ef86ba0a840cc8b462fd273",
    "content": "{\"tx\": \"b3c1472202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf2000000000576e88bbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd70000000004c7aada0154af38000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374876209cf31\", \"prevouts\": [\"efcf20000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\", \"a7286400000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e17bfbf8111851fd9ae24a1858afec5c4de6caf1cc26a2e2b06a933db436efe54e71f92e1336a687ea436697fbd19181210e765b944dc821397d885c783bf2f2425e521f6248097fdc64ff5a0a6cea9e07e7c649e93dab8ac6058acbfaf1ad70aa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367e85fd122cb37c54650db3c457c4ccc1d826b9d67b5660e25842c64e9724a27a7bfbf8111851fd9ae24a1858afec5c4de6caf1cc26a2e2b06a933db436efe54e71f92e1336a687ea436697fbd19181210e765b944dc821397d885c783bf2f2425e521f6248097fdc64ff5a0a6cea9e07e7c649e93dab8ac6058acbfaf1ad70aa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e6a0539a6bf9730e9f7197aac29cee83936137c2",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c580000000089646dbadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc10000000056ed9eb1035d779e000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc30010000\", \"prevouts\": [\"bfdd4a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"a25e550000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ea\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045538b2525e5ad3e6ab2346b1907a9f51d3650fdbb6911031be2b995911891caa483976a7e8bc20bfa4c53f64ff2df47d867849c8cbf6df51014735817968d498535c6739a4d626ca1df00777eecd105a7e72aeb1be910a44c9d3be4aa00e70c25\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4e4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0df322cf06423056ff4efb147ba4330d28398a4f05a11ad98b1121aa54f60b594336f2bcd90a4462875ebc34531696f5fa5671e0fb7e46050530a773670978687e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e6beac0076a3f98639e16833588cb1f7c3630b56",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb001000000037ef9808bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48201000000c798b1410490418700000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd3010000\", \"prevouts\": [\"2c324c0000000000225120bf14cc6d2f64add112964063c7917cbfbca584b2015bb2b877e08d516634d692\", \"d1193d000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936df6796774709e20f3de4e580719925f05298bdadc26b77e803df81f5078f2094\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aa7616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e6c4139fc79b0036b50c35d40646356790b47698",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4201000000b563db75dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc301000000f098e3a68bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c467010000003d1d4d040391f7a8000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72db95c2a\", \"prevouts\": [\"4e8e4900000000001657142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"f6a2260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f1053b0000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_2e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7538d0a63a0ef5288628e67c8f42c8f3aed351a24b2ae3dde09043d648ebda2cafbef1a4e404938bf8deb99cf4db150a48fd3c3c7b50d250044bc263899916d2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5e50c2f2c4e0e081fa7e758f6a7f4d4f01748c4a1282ea2100199c782ed2ce61ca2bddc98aea44730eb62977d87dcf02abe52760bd1d26507533ffb2e9d2675c2e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e6d6a1ae86f60f1e63f309397a0008e6d4943d50",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a000000000a3952b5460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fd010000003122469d0459d21c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374877bbe1c4b\", \"prevouts\": [\"18610f0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\", \"4db40f0000000000225120a283e1ea0142d34d03fade4b28902cd262d82bab6ae3891658a9596d967dbc43\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936688d2e46a192ad60a20fdb5c472affa9c3d9be48c29791f78ee3d204a0eef9e805d194d5538f9d0578f97aaac3520494006fe8ed5ea4118540907b045326452835c6739a4d626ca1df00777eecd105a7e72aeb1be910a44c9d3be4aa00e70c25\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5170b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d865720f322cf06423056ff4efb147ba4330d28398a4f05a11ad98b1121aa54f60b594336f2bcd90a4462875ebc34531696f5fa5671e0fb7e46050530a773670978687e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e6f3612a73d29882780cefe3d036f68100cf0c7b",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4100000000055c6482dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfa00000000f46499b502d29a9d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8767d58622\", \"prevouts\": [\"f8df48000000000017a9144370350f30aa8f875e3d2a13be81f25f19bf1a6387\", \"14b556000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"165b142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"d116ed280c0713e398d54bc4383551f2cd0480ed987ce39caccad5a683a97d66049edee4bff1ee72c96dd4951968ef034acb58d2bd50aefa3edd27f16bfd0e2e\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e721205c821d1cfd009e603052b5cee6c677c52a",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709b000000007f3424108bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4af010000004517a8d7048319420000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875f000000\", \"prevouts\": [\"e4820e0000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\", \"3867350000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d84c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93602817a41c51ca033292e6ad0865adf1b315ae27488bc31b0f8fb3dd6e91881b7d7b73fe79aa50781a03db77b9e22252058e372f5a0275feae864cfaf4c2a217ec513aca5799d408eee0c275015e54cf6f255f9c56741048ad8672ad33d4825d8e26db4ec4cf8c6a12d3bfb33a6f8c1ee971c26c5be04413f1d9dccd7296a9839\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52d8\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f7f0d1fb1b0bb9d70ab8433d07e43e66e6dea85179fd9a6b3a0e9d7d243e07dec513aca5799d408eee0c275015e54cf6f255f9c56741048ad8672ad33d4825d8e26db4ec4cf8c6a12d3bfb33a6f8c1ee971c26c5be04413f1d9dccd7296a9839\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e72d5da834d577e08d8919888da3491b1cfc2395",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270dd00000000e98bdfcfbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8a010000001e3b31c4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf10000000006ffb29ef043b09130100000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd0000000\", \"prevouts\": [\"f1ac0e000000000017a914ff6a0b1cf86e786bc6de2387f1927f71fd08cd0c87\", \"cda7830000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\", \"20568200000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"165d142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"1d11ff9e6594593cbb3db3d706e5329836b53d7b1047452a5869d53e1e3c549c28e59d7a782b615eb017decb90ffe64a5567a5514f624bc899c426cfa3c229c3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e73715f248773b481cfeb2552aceaf18e4b03797",
    "content": "{\"tx\": \"3c688b8f028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c501000000794a30f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c30100000090cacde503a0306f00000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a61e4ba658\", \"prevouts\": [\"83f8390000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8c143700000000002357212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_c1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"817c1b70322061ce0acc5c14edc6eca45ef09e96a86c84bfe84de4e15e71c3a112e6dec6bd65f6f58cf770798e63aa14936fbd2a1854a777163081c081d972e502\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d97bad7ba6d489e059b694aaf49587c68e53e5c0c5dfab57043ed92cdbd8f4daec5ed88fa517a3a2384d1bd7d7394a15d8d3b7847a9ff1af17b25304f16525a9c1\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e7865be06886b6e888fd9d883d55c5faee586ef4",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1901000000f2b706a8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb701000000d5414634042e88c0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c6010000\", \"prevouts\": [\"2f50740000000000225120554d9dd7197117aaa4d7426c37fed7dc5f4b29ff7dce4879497bcc4232903b0f\", \"994d4e000000000017a914a68ade9e67dbb5e8acf044461cfd5bd8dcf592c387\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"1652142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"77f72fcb63f4b3ee909677bb7ca7023720d1d4ed165ce3976dd8898c9b2dc24d781d3439d220f0403fa0dabc6eed1007f1e2332502d61e6af736e38ef9587c08\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e7a375809c225d5450a212abb59a2046d1b5e007",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfeb0100000087f4e5fe8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41101000000bf8e4fc9046e05b1000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47878e020000\", \"prevouts\": [\"9ae07700000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\", \"0c683b000000000021581f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8429a4229b24b38dc77d9f95f72ca2d0ed52126309f69eefee92d5f8f8a8a1b7a6f8cc54c9b2918e742352ad35d793ef376e6c30766c9de854f951d1cd88406e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e7c4905ac16a9774e7e810abf68b112d641b2d9e",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7a0000000049367eecdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb401000000a94652fe02ebd56900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac3c355049\", \"prevouts\": [\"00244800000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\", \"b705240000000000215b1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f85913f1b9c9175497e63ff3fe4937cd61dbdc806165848d02e5a64f871aedd45b5d1212cfb7047204ada9057a4be48c2c6f5ce87a05578bda43662f72114f97\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e7c5c79c85fb153f7749dd5dcfa97ac1401ef95c",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a4010000001d6355fcdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2a00000000547be58f03d0fb9600000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac1baad02a\", \"prevouts\": [\"dd48400000000000225120cc4d42e69b853b2a0a5827098521167109822d5a10f2066982dd9b410753f660\", \"8391580000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"d67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eb1986d7e8e27273be987a3f59c249d736830c7b6f9b487df38f4ee68bd2c5d06630d95c26588949f1b3ae4e4e429080b434b995fa18047406852c727cd9e6feb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93630ca117f3a3f5d0edabc733225eb4a624a098c8f44ec26e7a92d0c8239372396e4fd5de156dec52418d0df8cecdd3495838e4d1d1b80598a34f381ec5024e2c9bd0211bc754da142cb3564162304068e34e33074851a6380a45a2a3191e3f102\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e7ccede981bb4c65fa47e7fa310a9348a7109ba3",
    "content": "{\"tx\": \"c3f06660028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47b010000007a1ec183dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6001000000e09642fe0241047a00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000\", \"prevouts\": [\"c7ac340000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\", \"04b3470000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"cf7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b956c939d6163a1ef6c18d735cf5e1060a6cae99cf52377ddb1bcdce2fbed5e246c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdd6c4167c25132c432c9175336dcf34ec1853eafcfbd891c58e0cd045b8bc4542\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93634aefa031e9db0c34453688b34a5619e3290706aa35ba0709fdb07560fb296d4d2b7053bd8f6b5ad2f12d7ae765b8b6e1c341259e3dfbe95167fdee949bfcc9ffe03d403be23d34fe95cd8ea927043998b4b921fc49b039e78905cbd289b8eab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e7d9419f6cc1411629e9a09076e350aef3f0adbb",
    "content": "{\"tx\": \"7d81ada40260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ab00000000a5db64b8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf970000000016aebcde0482f29200000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79663000000\", \"prevouts\": [\"bef7110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bca582000000000021521f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e852cfaa079c741f4515ed79da14c225d7b03a58e519cbec8eed2b9f348fb7af8f04275ce86156ce1f7cf928a482c97ed207ab38aea691780a93b26f97168cf0\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e7e9f1bdab686670c7fd4b590aaad6feacbbeb73",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a20100000089eab0dd0233813f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acf0030000\", \"prevouts\": [\"dee3410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_60\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"cc8487fc4d8489c3dd52ad2f090001b7531935033f3d5e5702c8f840635cdcae03686ec27b39d28f069c6861935fa5bd2518d0e3df19d4105f6b77d4e494bdfe01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"71a2cf08522bdd941fe5e66a848714af5060294311b0d9c3bbc39dd03a5765ad1b79a43471ccb50dbb47d3ed01f0968cf742e61b3a11c9b2b83017f404fe961b60\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e7fc7fe2e56e39aff52a6c1a3f3ddb20c48651d6",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1701000000c7fc959a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704c010000007eceaec901a7a40e0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fce500232a\", \"prevouts\": [\"49ba1e00000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\", \"f00011000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902d159c28a2f7b7ff761fcae8ee32cc830457aa38ec63388ab160de97533fb61586998360b9068725ea0665cd56dec1773293b984e638653e276ddb940a478231daf72f21632fd7e3ecd6fab2fc91e3817f81a6e65d8de141b20738b1168f2ecabf718fa6df5c065202725a56079ab76c2de31bfb539ad3e5006bdad61c04edae70e1c9715723adbb198c0b9b0528e68f6b2478092674b4f635a3a6b11b2b24f6762e0a22da1c1936c58ab72bdf067e8cc1bffdb55ab5a4160ccf39ca08ac52535cc8b7997a427f0f676a71268c4953a83a8d72f34eb10e3b6d2b8be8b5dbe409fa1dfa47c3e1d8ac614c2ce9397e33b844964671bbe69760709ac194afeaac4779b8c6d1e07121045a0cb6a829ae823a7b2756cd9384dfd0b898b6d9a01bcd9b3b9f022362e16b19858b6afc09abe929c7b5b674a8b13c8b8624ccb75d438a45a08551dff47086baf3a7dc8af4640cce2264d5a9c447f818ee7e36570e45447dd067c137eead04f8aba641a58402e8b18718a962700445f17b42639c70878131802797d440e4a396d57275ede06a4eb2245b269e9086d0b43613df07375ae7657dcc45db6dde0fbd8bc41aec2cf731b0ad4dce8187e46484006e574b6d34deeac077d46127626f5b09c056074bfe2a5e570ff58d12405fe1a5f694c47c466e5072758c6dff00857afdeac0c548c446c93c51b2b59bc49e5071ff577b70c7954028fba7e7943a8946f2d75e5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a9f8156eed7fd3bb2b4cab14b5333356fb81c736bb205a27ebd75cfc9ceba70098751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d53d2e072fd8e8376d3a54b2bea1bfbfff1298aece70c0bc2934c8eaacc3044fe58f009f53a1a3347386cf74e6ce512c14e8f46a54e4d2c64fe3ab77cfdd670d0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902237352b9799019813fe8fc82812659e28cffa3b4df7cd8b99140004fec11d26c8e6e3833370bb3d9d63c081c137c716e45a436056e672483d0a8fa3acf300a2d520d38a64fc6a0839c79ad79bb1fe02acd8deef2047e5f41b3daf06c4d9daef4997ab4f23daee4a2244bf63c5ff7ad1cb54c95a6f0c6456b0ceed3760fe8564a72cb79ac32ffb51a15d338a703af6066eb0fe07fd15a2be1e5f18d1895741202eb959b350229aa3de61a60fa4a2e6461e355246bb7158b8b45b41dde12b31155447efbd8542350e99c06dab30b94cb6dae1bd5c4ef8b96ca8611ac964a664e9b5e094ec92a0862361cf119f6f217c3ce712a7fbc8d45fa5e59dd68728e5281e5d5bc3fde591ae5a01fd49af46a9fd6a1fcb3fd93d5f8012fa3aa28d423f76e258222be10a3ce87176d4572f09ecb44aef2f72a3967e5f13d22177691b935f62760a67f3b23746a5a5fb7eabdb926419bf3ab3762b5830c1059bd1507f46a884864a2b9976af3dc0d6e6815f626e882f6804f8f768465ffafa0c1611ba9b3cfc9c284012c958e417862c016a07d08ee4cdc544b4de37bcc6680eec107f2d392fe6fa35ab6a3053fc4f3e454206e63c98f0c0f26e62bea46a9fb5afe549c07abef16f4a67130ee2b6eeed9eff4f8a040f0ab60395ddef39da8b8d19681b23bb85c4d740b491eb3fbb4c42deee0e752c7932c40c49e3632872230df3e50d8a6d80f44c5273ff329aa34197561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bc95516ff73e0ba0ea1936e2d89c1346855b35984437390d0b37500c31b5ae455e7270ac6e52de2effa1ad4f1d7cc04618f1a83be30b0454843cf6016e9cc3658f009f53a1a3347386cf74e6ce512c14e8f46a54e4d2c64fe3ab77cfdd670d0b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e81dc94c8743dc71b11667a65c76c5ef0e8eaef8",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3e000000004eecdbfd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40400000000dc744fac8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48801000000149ea6b603d7969a000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88aca8a50227\", \"prevouts\": [\"6f9121000000000022512080d15096ed03a913dd2615bb22b23502eb7f2ed72305dfdc851835561a0e6974\", \"11d139000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"5094410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/pushmaxlimit\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ecbbe5a58e56fc80617b50f40e8af25c687c94d5a2f495fffe6052e8208eb884d77559ab0dcb0ff20e20604f09ba63bf7be3d6725ab88d81795bda5303d11684\", \"4d0802dd367a9ac4f69febe46eba96d8c2f0d894999cc95e11a3752f36b909723af9f18cf4da7602cad914034fc5a537f98ae658c499b0e1a228ffbf969c46c3176961d54d84a1e2bdac62384ad86b6b5fd22eb64007deeca4fac2a25f07d438b1d447af3f70ca476afa81b6177521a83ea0450893aadf4505236a5b604f34fe34d751eab3b606e442eb193fd3d88d123519908efb861979119251072e986c11be6899d2d17715c7aaedadc57d69207a4f43d2a934692540443561bb859596cdfc04e9784923c242e3233844eb48630dd5b0cfff6c9d821a3033f4660bd7b2a31f7ced1a4f0718ade4eafc82a54228ab0fb5b64e023b4f9fdb2e38f89cba2a9d8a4e89b5db6d51a1e0b90b643ae4120bd39145491ac7483b352e26b402af0e66fbd8532ef898890412938f3059ea3b3d00d32a6226790fd3b9a95c7cb09d8d2e535d8a42583ea3560691294e26ef26ba32b8396c624e883c1a9a2485617957f02545c097b3408ecac495c02cf770443c2c2280db60e9b9b953dc45368187e72f0b4cb67623dbff3a8b4025e1d92dc3ad63e85aadcde076c7cbfb49eb1c18effeb2434c02e32dac73e5a2ecb59ea357e16d6e74a361cfe5b8025687a73eb0afff120e1f25598d2d554a88b5b5b155b74148a54eb796b1226bd3c23ff46107d96ca2e57878eded8c8d7bdd002c8136b19738e91b283fea5873f25b609135b6c2bea838b726f4245374034f667520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936103cadbcaf2fa5df6e479334a11b958e5957fa2effaa354c06c9313f5686f6aa838550afd43b5c0ac0246c83f68665bd17c01b14cd3e86e9325c0425666bb85e05597bbc76f9d2c64c37772f9ff7280274d9ed9557cc805ea3025c75bcdf8ac78dc251797150d329b8e820d63bb5d58a12f58566ad0e9367e2ceaf5315e4d4628d4486556d0140df24dd8957661ed20e0acff298adf92d4035aba275ac667a2f77ab26e4de9e9f465a75df7696c385eaa6ecb043bc8f566ffbcb0e87dddc5e410142f60a8ebdb7285f9bdeaaac297e7aef914f175757f6209e65e1d504efa78f95e357bd5ce0e69f0bae0d0e5c78e813bcc733b431bf5c1d7f887580db0ed48d8b3e1a4fab038dc3bdab705ad8495d4c7432b8ceb30c4183e94a977ca62a62234e97d4fdf1ae4efe28e87c8298a66c795d715b7214edb50bff87ec712d9aa017bebc678b84a7871003d789a8d21944528b51ca78090c337c3c6ce4e3b71f5ce1dd261fad3bbe190c3c47864868b24b9d45ca4f9b7ef6df09ecc5e2c2e3251cfe2c030205566d26d99f7670359563d47c70c3c17ecce0772c32e7d70afd0c074a7f07ffa6395a21fd19628398e628d5ac5d3d7f77ef8bbf3ea7985fee799a2e0b5b2934214492b999e4970e4990c42fb0eac353aa09117e3e38145bdbc22646e577b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"16430af64cb8a3637928d82525db3199acc8c7d90ee5577d812b8431f994ef9f21a2450e4836b8202a044b3b452d9cdd2a07b064886eb5bfb0b84c29af3b5927\", \"4d090253d399d62628661e736b2df48f4a21782649e99e3929d4834566b927c48f821c06be3519f174f66b8f7b1ed0573c71d1ef55b750ddb00b6ff488c57c2e6a993f19f272125f0155ca8a6c7d9017b340a112b94c4a99e353ecfd7189a27175829025a66133bcca1ac7be915db7391a8300d7de1696a53eac4d825ed3df0f9c8ed892987299646d1f4c0bc8f3ef535d1606bd00ab33111927f918d4fc40e1bafe5431e782f66894f41cb83f7852536f01e91a040f9415f86ae5fe7a7ac42c9566ecf8dfbafae09aea4e8e5f60cc0eb0a07db2bca657ec8fb88a7f0125951051920e9420d02cc31bc1404610d1fba1effd8d2b614f69bd73d03ef57aed7a352acae3ac92de39ef4d6645e620afa87290786e1cff9857db6719b117b9744e0b9a8d975674694e82ba43931ef8c0c510884953f690f7d652d44569b9ae7b613a00e4e7ff2e22dcd75855f1d42297ec21c4a529054d8a09fc90359f6cf64e604f76cf4a238407e122fe82be719a8cf960a9b20339b86a2634ef79c1ca6831d4da925ada516a0445dd6d587f676f2829644d884f5d16e116839e8958b39e77040acbdfab78582b91ea9a785724b3cec68a8483cd7b0f56a6065defb5d40c0d109d8a0776397c37f38c2d04be28a66b3a320f07daec3f144e878c74e7702258683b5ae7630b4b66d037e8f0f9a26cb3a609bf865c958610d487ff4625b9678d3e89569c9783217b8dc58a6021407520871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fe92399151827fdc18825d14251a865e31a5e1c49f80697ce6a3e65db1b6f47c9e2d76b439eb8b90f256c0b5d415475c63c19e74341f69b4cf4d655a142f136b31916e23bdbc1135794d0d6806dd39e768f0b3fefa547ce8553ebcc58a86bee262ed34707a6ec3057d6919ec05d5b94f67ae87cfa587eaef2b12b91ceccc6ef8a875d8879e2514959e0266d8bde9aa7bdbb78c9ef4e7ac7f5cf4ebab7eddebd4a06e111d3be560136713863636b8209103ca01a3cbb41d43efd48545207f107eb77133ba9a11333aec7eda378031b485f5b8e8eabf57bfffc8ba4619b40408b783eb29786b9c7e54d29bd57a82aecf88557e00d4e8aef97ade3b73179d439f2293912176cd8098a5570cf2ae8a62d493725eaf54ef9754ca785295569a25e301492e27c5aa3537568f6734824d9e13d17b040b5b13f58e286505de213f86581d977acef7f6b695f70556e0cf280f2f492800c5063304369626aa3de8e4870d2a17002da8b6956793790e2522cdbbbc51c3e76cc941c9170ee3ae91039a9479105f3564c54269032898a6cd874ff4d1fe0ed410013dc82714eb7a54d64226e3868b0e659112c9f7f4ef135ef7e3677927c686e2cfb83a5642dd1287d117c18623babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e81ee8a9a2165602a74cee1bdc447e2da39ab762",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbc00000000f53d232fdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5801000000a868a14b010a422000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ace1030000\", \"prevouts\": [\"f757210000000000225120d65a03f65f30f95ff11470521917ac5fe759126fe5e56fe4b3d214d8fd101829\", \"af9c4c0000000000225120f855ac1dd07b462ddddee29099c3eda9b5eca4e8470208f3b94e6aab9d37482c\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"f77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08275fbdc6cf2e777e050e79c533e418db275d42efba7f8dbffba71190cfdc033660f5943df1a7722c938328966c7e5ac747f85bf050d43cd9195f6df88860ae066\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ab23e209afea8ddaa27b117399cf1dfb5b8cbf4adc6eef68e1faf96f2bd7a900bef6e20d4c5455f6a7eb766c9d2ecc1d4fc5a0b2a6436d41d520177b8d84d9981b72a8cc1600d8047fe8b56626831fcb5b55f7ee61ebb9b8b91fcb4b55947dd0f5943df1a7722c938328966c7e5ac747f85bf050d43cd9195f6df88860ae066\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e84308cd3dc05d65738bf940c73e11c1342f53dd",
    "content": "{\"tx\": \"0edf5c600360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ef01000000195c71c7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2a01000000128387c360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706301000000d6a1ca9b01111250000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478780000000\", \"prevouts\": [\"77320e0000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"f6ba6f00000000002251208082b91639ce415d44b93ebacde06f605687bdd15466bf93e6aed91c1a4a19e7\", \"1f6e0e0000000000225120ca2f7736d38d84f93b62b86d7eca19a35f2cfb6705849a1c6400bed56ad761ae\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dbc4082c88742c64e777227e559cc787fa79f9ad49b3844bdd2aa78bdd53ae153e2d335f383706a312226510c4ca5ed297e59b2981bccad977d4984b4ab81a7bbe0beccf8b53a38f7a20d51eb008bdc60f78fac094fdd23935202ece673d8622376e34112ab1bc736956b41978cebed690ad16294afa2ba0e9d8b5fa7e9f6f2f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d95f1ea0a1fd23653d05da4ad0eda243001c7a04351d1c2a22e8a2afb82411fc18d13f23505bf80401329c8d1a0bac5ffbe219ba0d96925c38e985a7086f175ac8db205c7d3bb0390b2e22910f5d1cbad00807eee3325f4c4e7f4412ed3064a1c25c837ec0a1f852472f3f26e6d49055bb98717b7b68c46cae1e5f9804f9145\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e8597fda210c9006c4eb35f55099dd53f0804f47",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5b0000000030b2815b03305c6c00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a69846252a\", \"prevouts\": [\"2cdd6e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"48139ca85c5fb7a70b53c6639a15fd7d9d6dc1b19fa2b1f15fb8b272c65b0ca1372b1f62f390098744d5db2d5892cd455c73be7b67ed24c419bfc8121f770d2d02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b3d155c35adf27f8d46a5f951b4aebe4e749148ab80c2d0a54832b9c82991fb700277d32ffe299eae938dcc67815a210ac71ba84e381bb96ccfb8e7d0ffbff9606\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e85ebbbabefe13b277bdb7bb290e81d48aaae843",
    "content": "{\"tx\": \"6b76e011028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47901000000f2a234b660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cf000000007d7052db024ba54300000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7a3000000\", \"prevouts\": [\"2531340000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\", \"dc6d1100000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"0c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c2538f548eb9d319d165a467796d1e60ec6673916444f0d66e1a9edbb7d8ec4eda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e5111e542fd849c49f4d44aada2d8e1aab946c793c1d334242f5a6d1a51a6de2d5b0de380cf0ebf0fa9d17e1d1edb87a374b64935c1c67f0c5024fcc072643681\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f347fc09b13f9ab949e4d0dd849e76d18bd9ee465aaa47c5e053192723bafcd48d88e70532c494439586c1157b8a644f11fc532506ec8f5af612c230a11997e628257bae22e6d8aedb31b43cfe467850e731fb88c1221782039a4c16ef44c35617d0d4fc7404dd8984f6a1705481d95654b515a34c586c99c11bfe20e9503459\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e87e2014a5a0695a3cdffdfe859201eb8beb9fb0",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127095000000005c767951dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8e010000004a51eaed04d34b570000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc73b010000\", \"prevouts\": [\"4f500e00000000002251207642517ca6719fb19e4d50e91940e680bbab7ca2eac6cb77783eaa45a9fa38f3\", \"342c4b0000000000225120c09854f56274e1d35482cf8e2025d8ad7496c75563e822d6c9c7b32cf3be83f2\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"717d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a84e3bf2953ddc9cb8e31c297a3a65f2ea0223693047b485ee05dec8a9b2b04be4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8674d0c931fae68ff43996ef27e2c8ff69e275e322181f769b95dd7ebb695302b667dde4f09f14471eadd81946489c41cf4fd01382a4947d773f1f2d4d0db4c57\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b2bba68bdba5bb63faec40886b7424a0b364c5795c89d5df60ab242d96dbfca40b90ee144c073a081d1ef827361e7936248dbf88e4cb0dcdac45f51ff02f5de2667dde4f09f14471eadd81946489c41cf4fd01382a4947d773f1f2d4d0db4c57\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e8ac301abd5dee5dd4ef8cb0670844bca13f0323",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0a01000000b500cca2dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb0010000004057a30b02358044000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7da000000\", \"prevouts\": [\"8e402500000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\", \"389821000000000022512046885de037d9f439e247c936086c9c89d6da1bca43dc543d3e57bccc8a96eb66\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93623ae85726644c2de015503b238f6d2ff3873dd043771b87773ddc298654b0280d81cfe71594e1389c7dbef12605d87c33af6e429193e755ec800f4a6d58e14260941252319b1d0989c3ca3905f2d65278f17fb3ebe6fd71301329f8e450b42a05a35b5683fdfa8774cce0e3f4376573bc9dcdb125f140a48d9cd3d58bda5cb68\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367b1651a3fc1c4e1b7c3cd67236d38206903995e4c6229f7d3322c375e330dd9b093e484a9e3a7c57c3845514d142b984218effb649d9e5eb3f309ab706810aa991d26af6ddceab3892536958f1ea20dd7b885ab499207106c7decaa6511a0e4c5a35b5683fdfa8774cce0e3f4376573bc9dcdb125f140a48d9cd3d58bda5cb68\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e8de8be751822aa2e8bcf086b89ae6ca68052255",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704b000000000a65acfd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c465010000008cdf959c01c1fe0600000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5e000000\", \"prevouts\": [\"d88a0f0000000000225120d632d9c3807cee2f3b07918ef684335c8e7823a1a0eb476eaf46267e076b018f\", \"d44c330000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_mis_3\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a9ed556b27362671a397085cc5922c9405eca223ef8767b92c77d05d88825c366863b68cedf019302ff5992904ef35c251cf329ed6de69ab09180d8174374ba681\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3d5ff17f49108195b875a93aa5abac40e5935025485f0926dde5450549f11be4ecd6f9485486ad3c9da1504a287802e044ec30cfe7133e982f6feb4c1f4ffda403\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e91b8692e5e50d7452d085b3580b9cdd1676e122",
    "content": "{\"tx\": \"fea3974303bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfaf00000000f2daa1b1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7200000000c374aebcdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb2000000006b51dbf6012250b200000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac38d83e24\", \"prevouts\": [\"447672000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\", \"be8e1f0000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\", \"cbfa2300000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090224bf439fe3680c2b2deb33938ad3d8f62744ebc2b558801d3176378115594d8a264e659939d2770dc5147f806da486661c4424f5e0dec5dbc07c2c2d236996e6dd6ccb90b03451784749cbe074d7202f9238e301b7f9d9be57b4e5453e108fd2e90c4980484b324ae4a426d9f130db03c003219fc0fe85e1e9f40cd8c23ac812b66388942d907a364795683cae213ee5b4774e4f6ab09b045af5618a666eaf92862bdef32be8b1028e908240a47fa1283028aa091a903b1e34b094a4f0ed755dbfa3fef595a09d6362e3629802adfe25e87dfbd32951d351000285c6a9b2c24f67ee5b131ab0c2790eb69f5cfd89e3720cf6ce4fc31c5dddefb71161f9d84536a894fede0008c82b8d0f46b99621e50764e84286f972813ddd6c79334284a2e6336da1b85e00e040e006fcbb0474c0ed3dfec05732ef40d4b1b778c64084ebddb06db78cd5db9d9287dc6e11a968849169805c0dcf33a642634beed9469dbd414c184e77ffc60fe95220e00f21e392b71ed8a30743611d7a3c8f19789e24284b874d0bf52facbc34449b0d3b1d46940e1f5b2a49ef635fa77f1c9e743866a0c38dff619cab74787b07ec81d3233c788cdc83fc33f16de981bcbfddb3efef0e4fb4648e9931db1e10fb490b0e26a3f547c7e1d686d2f5e76b8deac447ef7118c131b7c8302952cbb90a184c2ddb086bcdaf77f804c2ada2f49339565125ce337ed9910d5f3ed3f3724875\", \"187d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082b6019e279bd309d4b7ea698da82947cdf92f55834d49ec05c8520ba423c90b8e919a726f5226a1e5e752df6df7fd59ca609863b1a6d095747bbc103e423fb93280858ffdbef3a81ff8eaeb69bf692b0617d2bdcb9145576d5843e6d9e5e1cb0c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09020231e986b8d2cc144826b67e819040597933571334414f20589a4272e02b0d2a5bb7e3997e196c6a9cbb0f25ee3a5dd8a3f07374c4826bf097ee885ee5887c8572c7912a5e3be8b0eef00ef609837066dc82d249a2b50a51361d6c86b109531702f2640c351bd8850c276c7dbb4ae0c99832475455544e80e0fba6d9df2839eb18684d63083b32da34d9e5b6bdccc7d316eb92fb2c5bb4b8920bc718148d1352edf5c89457aae80ae3019737a43f5e7b9f5ac29c209368987e043c0f2a2591bdd083e5d61c804e5d7556d03d22a1c4363bcef1a2274d2225da431d6fb250e2f6773c71c1877f97ba98d02c383e1d2297265460b8f50ba0a520b81c419a158932a4380e899cb8d034423d9b37d43c119d63451d4c6da1951ca75feeada9359c313fea859ad7a547648c40193374e3e0ec97c03fe9c409805689bfd59614bd82e9345c09fc64dd6303d5d0dd18a44cc784ff1d55901d900decd3666ef97e1ad9cbfd08e7bb7f77e3b13b6fdc5de36fb5b3b75e2b5fe757b69b669b16c8034bb0b6a77fe1783d35a000e5c115c64dfc4e54270fb523d5dc34007bcf59f6e7a078b321bbcbb826e3a6d666d5c6fbd63cd7acaa140e1021613f51f21d03b85f09df44bae5fd4d127d0c4b217146330caea7dc95dd88912cb5a8aaf5b952e999dd1e8c4910cbee46661ea0c3c029b7f6217c0bdeab00d38a2e98386919f0ebbf07ed7bf90e73be500d755f9a75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a2a72d9a87053684bb0dc48081cf5c5135ec23a32b564c6b97b91a1c581596c8802a37b3510d82dab4bdf4d6195b9af4c8a1df2dd8a601b49dccd2ea1725fb9deb0356d5dc7bb189d5700ce63be65cd47bafc75bda640418bb3b77b52e492b0f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e93758815f2e92fcae33eeb424961ee124cec2c7",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709a00000000122eac46bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdb01000000f84b9d610414df8a000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acc3010000\", \"prevouts\": [\"2fb60f00000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\", \"e1c47c0000000000225120a607964ea93077ca088588fe8df58ca0f1df7737d7763c94d5c7768cbab371de\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364cbf97bca8f4e93312d4d79f006e70724fd22ee96fbea9c47aa9d0945795d6f1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a9e616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e9501001531cf5569b3b23daa63df0825b2e06f3",
    "content": "{\"tx\": \"0200000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8800000000e5c675c7011a1f5a00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4cf09922\", \"prevouts\": [\"cc1875000000000022512020555e2c878e81dabdc8b4bbb4d8fbb562c672b13f4ba4a3f97a1487e7c521d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e8\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362cc5df8a4115da779f8a758b20ada553e9e091a2311498f2aa3552034f30084e276a8166e5256dc9010e53101dfdb6dbd4fafdb1e785ffcbffe7e4bfe923fbf99aaad3e4ddcb787e09feaf57a938d0a46e7e94627a74ec9b410f8a5374ea1d35\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d3d1c8f95326a5f9176c86e1c30427cdf7afee7eae03ceb2fdd83531b682283cf61f73219d91856056394a010eb6c8ee7f13c9683181be224f0fcf47ad20d61b9aaad3e4ddcb787e09feaf57a938d0a46e7e94627a74ec9b410f8a5374ea1d35\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e98353914c5de48ee650dfff9741c1285bf29368",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270bf000000003562bfc98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45b000000002c898a1201ae153c00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac3607604e\", \"prevouts\": [\"fcdc1200000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\", \"58eb3500000000001656142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"1778e6788727fd076d7ad6b184d1c3b78ce26ec25463ec8a133f9d2380a680e0e6c65743b86b754004089f8e9f44fb643ea7ca18f4f397cf9a7576e515133e95\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e9a85210b1a1018e7666d51f88430bb5d8bfdb3e",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c55010000006d0e8729bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1200000000fec08d1f036360c3000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acdbfe094d\", \"prevouts\": [\"a0155100000000002251205327380047190b39068e361063e76c0639ec95616567f9015a7792cf50895358\", \"95f273000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"siglen/padzero_cs\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ab8126d03f1f78d9217af03abbd9f6f462a5378ded568ec749eabf659f9b2c895f1922b5c5b86ed28fc30b8fcfd6d05689dec772f11b8d1155ede4ec23d93399\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b7922a9ef31868fd0bdd2720bc44a83a05911c979e226e14df12e43105fabe25154b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ab8126d03f1f78d9217af03abbd9f6f462a5378ded568ec749eabf659f9b2c895f1922b5c5b86ed28fc30b8fcfd6d05689dec772f11b8d1155ede4ec23d9339900\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ac\", \"c06caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439b7922a9ef31868fd0bdd2720bc44a83a05911c979e226e14df12e43105fabe25154b26074893c3ce6717cee85a9b2116337c9f3fc57ee6bb0ed20c59821243ce0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e9b76d10a6eebe9f37aaf17e3c71921c02524b86",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9c0100000086f844cdbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf57010000000f4c07bd014c2ab2000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48780020000\", \"prevouts\": [\"ab6b560000000000225120cf270920c53765cb04b9e9f4d4bb11730a43c2f8bc3507d6160e85b28c4cc6fc\", \"09216e0000000000225120460dfd59ffac97f33cb704e62d40a80655c52408ecad6b881ea54a9bb408923f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bf8f72dfad74eb16af74ee8217f4e342864fc9cf9d5e103f73a49ce67e9f6633\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a66616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e9bf6e5a4cbd00e35ecd77dc39c1f9264b9f4dc1",
    "content": "{\"tx\": \"766d60d703bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1201000000da307bb5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0000000000def8accadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba10000000099eb13d001d42a740000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72a040000\", \"prevouts\": [\"f9057b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6272570000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"b92221000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_b8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"15b241a18d04a42771fec15b73c4db2772fb31e6482de615f9168512d7aed780824cc9984bc28d28cb74bff9e7699d1b2833154cf9cf0bc9c75efb8d59c233e083\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c5dfd59f67ded796f82d56457492083a1d78f992fc728e1e0c10af747e89ab40a5cea1b6a11416ee7d75fb22faf26f82301b42c5d06312223fac879c9c8f6ce9b8\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e9c730fdf2c5807b82dd1e4d042e404651d4c118",
    "content": "{\"tx\": \"6b2f1e3902dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2700000000e8905cd3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4ba9010000008c35e8f9017e2c3400000000001600149d38710eb90e420b159c7a9263994c88e6810bc7445d4235\", \"prevouts\": [\"09254d000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"36be28000000000022512081b6fde8d6a32bf994f385f13e2db06adc6a69d3d570a785570e2b0fcec09f40\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082cb6beef37ee5dce9a0d87dd9110e965067099d7e22847272a5a9481e46004ae8aceb16be1ebf4fc69deaf064fc7bf5d7ff2149818b5ba4c28c799d30ad567cc959b5d8c486a0b4fb1c0695d0398f92463f78d98cf4d122171b1dc85f0cff66bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d8f9b91a8bd77dea62c47e49d062c2fcfe01875e2df978edbcee5db59c7daa26cb6beef37ee5dce9a0d87dd9110e965067099d7e22847272a5a9481e46004ae8aceb16be1ebf4fc69deaf064fc7bf5d7ff2149818b5ba4c28c799d30ad567cc959b5d8c486a0b4fb1c0695d0398f92463f78d98cf4d122171b1dc85f0cff66bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e9d4196818fdc0fa92415cb4a2aff1b96c783b8b",
    "content": "{\"tx\": \"1b7091bf0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705001000000fb6c19bdbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf80010000000a4e7ece028b5f8400000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7e7000000\", \"prevouts\": [\"8822100000000000235f212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"1dd2760000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_95\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"663e41f180a2d9bd4bf89a200f61d4c4041a58022bf544279e89646148da20d87664efef3680cdf50306c8f8892d70a4c1c09213091d01567e546578e1786d5683\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7b79b0f1b63f68b849e927aeeceea7afc37eadab1d23460c1b0b93955ba450b7648d791bf0f0895de4eed4029e3c95f406634fb10b0d7df8e8f6912437c497ae95\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e9dbacbd2e05c550b025911cfa3ca5803dae805e",
    "content": "{\"tx\": \"0200000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8a0000000043c498c602dbdd2100000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48736416c47\", \"prevouts\": [\"c8ba240000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"3045022100f6e5f8178cd31de7928c8c779f2a0b31b162e144fedfc790a8d0d60cde704fa0022041023acd1f1cca412cd549457cb3c0456ad4a259c8cad4777619706cbb47525b01\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3044022053ae4374102415afbf1c09363a4201290af1e87883545c7cdb5e7308718185fe022007e9b9d422a093a32c711f698350747391b89fb6f3fd50005bb92adf8880da6a01\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/e9ddf35ff01ae9bc71730f02a17a6079411fde98",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd100000000e6d2f9d0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1801000000ccd8cab80133f516000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487bf169b47\", \"prevouts\": [\"492721000000000022512083c0e539f639337ae8c0354a4e7a9605e4ad1b55261430431fd50e3d65b9e0b4\", \"7355690000000000225120da5b2ed68dc062d9fd59cecba48d2679c72738370140766f8e961cb8717de4a7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"2b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936135ad0cd7c9b6311df988de8317b2c783507c964445beca4d69314b6889edfdc527b3d6e358222ba6f0d0e44427df3c74648eb5abf60e34311dababed48c5c2bd74d03d2cf0ae79996d1bf896237ca201e78f1b4c5ece550af4c0e01e9fa9886\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a543900b336a3c008870ed4aa640473f983a69734480d339364ae43ad1d21b16885bea8937005622f3eb8b2c440108feebbdb5f3ff09e0402c722754cbcd9b2d195038de5261112827291f7af9c58b034003ed818b7e5ec0d4ccdf81f6c2ea4d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ea1fa2cb1864ebe376683d33d94b64f0f54a43dd",
    "content": "{\"tx\": \"92ddf3650260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708c0000000087e1aecfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdc0000000073684b970280a936000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acf0000000\", \"prevouts\": [\"8995100000000000225120264b35643a3a3a95953dacde7cb6bcfadafc46c4f235409840aae4392ea87839\", \"9d4d280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a7d0890151f60a75c7483286f2af96bab693a8b52a762410918ebecb67b1fcf5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a2d616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ea224ce2e986d690db2a198af3f98a8408cdb30e",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd6000000006b1f0cfb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fe000000009f41f51201fadd4e00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac43020000\", \"prevouts\": [\"70e7780000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"88ef0e0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_d7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"49c5480c4e801fb1f08ee5f62d4ad02c1042f28eeb851515c34bed1cf2474cf9ecbd21699af034e64b3498e72b9a37112fbf942188a4161b13cd39b92ad4166f82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0dad9ae1523e8756e95813fa243398e94eed2db1ac8ce3c18982dec25c131cb951bc6428be63ee6512885913cf3f677a20c872dd4dc1888f722a88e51a00a60dd7\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ea3247c42e38f93b6d8af0e43d7f34cc4bc25070",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127069000000000173f79f03215a0e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898736e85250\", \"prevouts\": [\"cd2c110000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e34c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f0d1bc393c3c3c2b57b8b86a9e8a64bd1d4b9e0fd1bc4525ebf92e13eb29f90821a06fc3128a9eadf7c181b12783fc0ac677434699a36c8776c14fb861b85f3ba54f7803bb2e93759f587214c70a485617458826e57c89c2ab5c5e7ce47181a1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52e3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082c71af5165e16a75a4d38ea496516a466796a1cbb48ef44578cf258de537130fb0277e21fac1036469cce09bee47dd6f35fd38d265061a05632a5c9d8280907c6449280c515e7ef393424f0dc01282cb8b28e26e76822dbd41f29cf7fcf3ef3a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ea3a67eab454450f7603fe0cd98a27c731eb5d00",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3e01000000c939c0b1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3c000000003e7a40d504d3214600000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a603000000\", \"prevouts\": [\"72c32600000000002251209f730866f32bab360a89a22c38a65c192ad65d3314437626484a41919647b175\", \"70d6210000000000225120c08dce064ec071eea1f5304817c49a2bfdceb360f072491bf2d2a32ed65843b9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00638d68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365d51fb579a91f1e7017ad05018cdacf515cd9ac84a638e495c8fd6bd929425d520e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1b25240bc46c035392207c1076e816011b96fc57f286e81391f52d072a1ebea8b62cab3a6172a7c832406474b8da3677455d75595a690190458c84d19d8a3ecc3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08229493e63f0262db246dc905ef3bca459233a7269b5efdd4093c0b189ca3e559193f37adfd687dc0da405a76cf860eea33b50edba83aa9aefe64ccc08331b86a062cab3a6172a7c832406474b8da3677455d75595a690190458c84d19d8a3ecc3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ea3f5822d3ff42dc536ca2f868583167e04fcb24",
    "content": "{\"tx\": \"c924110102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff1010000009d574b958bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46900000000c2a4e1b8022e86a90000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a621a7f84a\", \"prevouts\": [\"fc546d0000000000165d142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"a0373e000000000022512024241b8c28db08f46e2039187a480378b2a1ee734bde764c6e80647709b09b47\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_2\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7def27dab81d3bb1bbe6c4df097458960df6d03b8661956cb1c35d6c5b35cdd1c91ad0f80756ee7390afcc463d34a727db2ef08ff09b798c7f5634eba68ea6c302\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50570a00062fbe5f2ba43c1fb734d7908e3c1ee32333dda1dcec69957da1e118083d167d510ba2bc372333720694bad65a519ca6b72ae91834facc8467645219f5f9d7313ab87c8f2f7079842eddd426ba30b697b28a521993f2980bd50b915a9e61349791576d5c1eac87f44608922d8204938ae3b98dae4182c0dfd7bcb1df466f741f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3003e9772507cb0c5e3dd49a5b105b156801e591908408a867c039718bc33807a67e0575fa64fb8b6a58e57e4bc21cbe74594ef8a31b343cf567b8e7c491217b02\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50b4b71b1612e36ab0bf6006d0430e9b1e14db5f9adcea079419cd36c7f5b4145eb349c69f981154e73f7c555dde6b62faba046ede1af79fad4330047697b0ceb6b07d53401b3e0539a2037854f36cab7c38e7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ea9383c734b03a942fd3c33b4cd6172b0c606aeb",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfc000000001e5111c0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf720000000083aefab460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270490000000053752fdd0376fea8000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987cb000000\", \"prevouts\": [\"de10240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8c427700000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\", \"5ba60f000000000017a914a2a8d85df2f20a0aaff7224012fc4cee13e29cb987\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"215f1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"e92b57286193ec8e221ee627b752db89b05173ea63f7bcb01b59aac63359c00bb799c86be0b19a2a62d88f80e8c71158d3d6e6de1692be63f452f9e42fcc640f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eaa2ec29b35602bac1202162cc43997d10f21ed3",
    "content": "{\"tx\": \"5546a66c038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d400000000b5d77298dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b120100000066b879f3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfda010000004fcfbcc7041d3ac4000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcf2010000\", \"prevouts\": [\"968f3a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ebe5240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d3e1660000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_f\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"7ee81e7753d0ccb087504760ef812f50a1bd452ccd70f0bab9e56546ad5c0f79c9e7c007972f85ef7389f9cc36c701731efc28a2857c41631dfbf9855806d3a781\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bc9253c658f5096ee1292b9aa93a488d9253a6793ed6b516b66a0e0c4f2cf436c027a31a3a1c07718ed3a4e0e3c17441bdb086f2cc725fd71de5cde56672569b0f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eaa7b118760debbe1d5a3d4a62d81d966ab89097",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0d02000000419a5faf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45e010000005e59f2d60130516600000000001600149d38710eb90e420b159c7a9263994c88e6810bc72b000000\", \"prevouts\": [\"73ad7a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"046131000000000022512094bfa417ff7fec0e1f7b84edca83ca6ff73ff5ab901944aa69a26f9bdb9b300a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936175673ced4c1651dc112a32d9e4be1c148bacaad18c2392100569d5094651b3e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a64616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eab77792be235dec9f3313676498d907e560b5cc",
    "content": "{\"tx\": \"02000000031980a99ad1eac101c8fe3dd9b7c19f4e81dda5a690601a9eedc2ce713d9132e5000000000007acc88a492909e056fa5c0ef2af542be68aba07da39583e95b43e24484150891b1d532301000000001ad6d4dc1980a99ad1eac101c8fe3dd9b7c19f4e81dda5a690601a9eedc2ce713d9132e5010000000079e1bbdd02ac0b058b320000001600146d764276c66fec1127e5074db5bff3aa6c52553358020000000000001976a9147d8c30278dcbf5bd88310a3c91abbeb33651906c88acd137773e\", \"prevouts\": [\"7371c1150f000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"b7e4d4f711000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"6689717d11000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/keypath_empty\", \"success\": {\"scriptSig\": \"\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eae489d9b326b6e764166ddf53140f5ddb3b425c",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ac000000001d48c503dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5b00000000989542d002fcd25600000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748795010000\", \"prevouts\": [\"0bce3100000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\", \"9010270000000000225120e3b65a069bc68a4d57751d6a27b5b12923d0926a31ec4185f6f10a22de1840d8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"2c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a969cf06ec193d0358c31c8afad5bbcd547aa0657673b5bb10a44e38c372c44cda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ef5981cd58c469d4842aa56f101a76a4447dba55ab7a128197943d7701f95f2823b7ec1fb3aca1c665feb629f75b86bc6796ed5eb830658d68574ea157b89fde9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667e3c1aa8bd39d6182a2299f940d076e52caf4ade4a085ff8961d11623e68188872b08559f184ac3ac9956d54e492d7f98285a254bf010e00b63b6bbe75054353b7ec1fb3aca1c665feb629f75b86bc6796ed5eb830658d68574ea157b89fde9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eae7770e2a494f15bf0e76460740c8d2e1cbd22e",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1d02000000a05c23cf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e70000000024c7cacb02189b38000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df979722368987a8344a32\", \"prevouts\": [\"0e0e270000000000225120d822e1bd1f5ea10d0aa44b8067d00045600d13617c1c35db91f3c0990a68d49e\", \"ae3f1300000000002251202ba931d41ccae6aa7348a9ccd120452bafbc02325d8b1badffbe10b3b20f3d8c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09021ad436a62d53c1e9319a4ce5c1f22396667078af1f47c4295f505e3f973743d30ee347cda830f26acda70755c08fe8fe809efd6bf4d50fb50bb6cab9862d692f901ae3b974b43b1a3509f3b5a6305047a85308f2241784bd16da924f98f87441592e7090afa233f3924b55d0ab8345968af770b69dfc48c8cab765a259fecb5a1c15b649498c70f518e51b9314474a30a13b53e9a1019ef417e2f59a4ec649043913cfed6dd77dc54554304778e1596bb7747a68f5ffb9a351652787224c93546bc081171e714bd6464ccf1ade083d261f187d437347b1070252599d748940d79bd76da40515e08b87ccfa60023fe737bee305572a2fc9e6c177d68afea91503bb63b7ec19570ea0f3c02fb839f9146b96a230bb94dd9a7c2b2ca6c6553f0b4c2af42e56face25fc9395285df0a794712bb7dff2d372032f836dca409b5471263a02ebc504f781424bd16510f596de58555c2439e1f0ed712522d71506c32e5d9c964756eaa8a2f091525b5f8cd129d00f7f89d68170159159f5159742c592c36ec96afdf51d788255af1c796d1b5e67dc4894fc1a70814d04190ea9b0c50a61d73182f02f23c7bc47a509cb0d7621b7af18d7c4bb71ceaa5096371bf205f5ed8a7960d2fdb05b026261196c580377d61c36c349b4af12b2b95c666c54b115a0796dae0418854d5d3bc10757cfed63ecdbcaeb7e338e987d85eb7ba658ff5f38426511321a9c90f7bc75fe\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b65fb99ebaee40b89c75f91c70dc33c0629af8f94b6b045d23ce00b5520b0d89fd22261ee209e04df9662f52c9dcffd1f6e65f5b546fd3c131bfb02c186b05f664ab0b66352e66b5bf600abf31d1005c5406f4575b339026213ecb21a668977f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902deed117a70cbd602036c28373d45eb7eacc1729850a732356b2cf078735f228bb5dc16f032ff691f9aaefaa3332955f92a97507674d0f7b9b85b3850d0c1470082093787ce4c067d246ca53514d9519126e256d2e7e98dcf57577435cffee9d7d84ff3fe0dab92d2e8def38e12721755d17b7399cc07be1a89caabaf12b35df57a10e5c92e34989f5a0be6224e9568ebc8d6878f71e96003633177fac5b6e9a83b340a92170370da5e5757b7711188aaa7e5b87b03603a7820181ec0d95de1bdb2253c2db801ee942edb80d410a718077d922bec63c5b18d1399b3a1a86c5c5636032b93caef8ef2f74d21808ebeae118b386709b5b5f3f794f72e6ecce401a2762b29b8c3c66df0bcfb9256bbadbe48dd9dff8fbab1418eb225189c557fc67a0aaa9baf5a1b08545cf1edaf2a5c433a495316c3a5ef7a41064a21c45cf1396b2c934c1b486b58122c278524ada0e13f3cfc3c97c7cc8d0623b5fcf85deb1a820405f63fb9dd3b9fa8200c6ea621a3fde93e2ec514574b7b6fa01b0d8bb1f17e13c8430f11abc978eb1dd0a7a31943c8530861fa00112781e792087e25a455074616fd56004ca29d8643aafcd6b61fe71685d76dbb96e0ce3b953cb66e1bd0380122a1aa2717079f03d68aa095134663ccb99df295bf8717d2a0deb05e38431e7af30d25b8eb0cb0ec87c49c4c4fc18355edc6a83b816e22f6b5af6621cb3e084ffec8bf5986e0abea7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4dcc932fa7eab9febb69f8eb1775db86ae183d64bb0b86855f9228e743b2ec6db917e8250b412828d56f092e1d9ceabdbedccb5671620a7e05a1f5a122fcf72f11e45c38e8a62a0e5058038ea76117f85fe5d704aefa5d806bc1a7cbe3a990946\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eaee09f4a0e178165105cf2ccf81513fc80541b9",
    "content": "{\"tx\": \"0ffdd2c802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa301000000e046c88abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3b01000000c75831b90470e1e0000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac68aa0452\", \"prevouts\": [\"a79e7f0000000000434104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\", \"da1c640000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ec4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fd4d99442df2d897dc88267982d8eb20b7dde930eaaf897e66f6a5ce7f7a19008bc5bddb1ae8a97e111feaf10767a648ae88621f6e3dc27f3d4b61f2a6f156b2a9cfc1055a4268af502090450271f6d102883ab16be8e011ae292d6da52fbee7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045d686773729ee45a24450fddb7da6d0266ea60d425b2bcaf3694e59ee80e6a1a3dddfc46016955cd26bcdfd077adbba0d60eefd6e0317def1b858595de21efb103b719bf4b6df334f4ad3966afd516fb2a8d294cb4fface4e4609ab1c9f988c5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eaee80bfbe65037b08eeecc39e40e2b8276a958d",
    "content": "{\"tx\": \"32bd0f0b03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7301000000a2d6c9c760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a100000000c06b56c760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127000020000006321a4850146cb4d000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48709ff9333\", \"prevouts\": [\"03b67e000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\", \"f22b120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"802711000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sig/flip_r\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"834991d8360f77f5e8eacbfb2dd7d75f47d7e3c31e3c59d47f21d6a50f84c8d39faf86705135d7e0acd121dfa01f6e118c9d093b26d8e923c829c9961f595d9c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"834991d8360f77f5e8eacbfb2dd7d75f47d7e3c31e3c59d47f21d6a50f84c8d36177dd7e4cd5d9b381bd755ddc4cf098a8e29a5bd0f0f0e7bb744408adfc1e1b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eb0e20fe944dc77d38b2fc2582d02c80d3d9628f",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2701000000e971dabd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e601000000fb959bc7028d473700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a660000000\", \"prevouts\": [\"241d270000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\", \"0c0a1200000000002251205ac64cb5aeb40708d1f7499406291fd8487a0b8d6b028f8783495d150925a7bb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"e67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f9b5783d82402a6ca1f9b43e9c3fcda656bc8f4fc44d071b6c51ae46a253cfc5e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e824d900ba5429999a9d5e0d5b2b257ef1523eacccb529e56e7cf347f802d02f5093d03784866e2fdd94d7d1b7c12b1f0da96746c05c19b8696f0ac6a701ba8135\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366a6713437001d677a136bbd3fc0158159f58de7b5c6a1fb5a4ed17480094b62285f665641dd2adac3083650f9d93a4e0ff6d52a887a3a3677c2728d09852a8a99d11a7792f25f0da70e8485da42647201d1062d1bd001b767f1b05dec6877400\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eb372b84ca640e23188861d0efa04be45ee5f243",
    "content": "{\"tx\": \"e7e3b9f90260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c80000000068e24fd8dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9200000000b1a782c802e7456700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac33e6a42c\", \"prevouts\": [\"d19c12000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\", \"fe5b560000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"937d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ef65737139d8cb51b826e6105ecbce8352aa10f0d50686f2268ca6d7900ff7d4462d371a9b01f30ea116c30e8195d2d6eb7c97c8692c0c95de95a904f83b96ad4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e88b73eb14a8afa044a1a6f0495df635bb2745ae30a5fce84d6222f661b17136fd6f60e166ab3c31d6fe53c0e4c47c333102fdf48f7428a1dab907384d3ec09a32\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eba9b48ee4b2ed1d213ff803ba46409241800f53",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4de0000000065ee38b08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42b01000000779fbafc031c5471000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987fc040000\", \"prevouts\": [\"a15c3f000000000017a9144582b7676ffb8c3a2735b8e71e172a272e3e33c087\", \"af4434000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"215a1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"witness\": [\"008cca768bb80d31843d8ca0979e53192231a3c965cd8573f4fb822896e85d7ad2957dca3b910c03486750e7923d63faaff2223f617f604bcef4d53f1f51186d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ebaab3cbf799854c56be5ea1c8570b79e12530d3",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c452000000003b7dd6d08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41501000000cf2ca79e04c0e7650000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e702dfca59\", \"prevouts\": [\"4fb5330000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9b2335000000000017a914a7d99db8790799e567017bcc9951f7f968dba70f87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ca\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a0f00d6cfeb7232a691f0b4cf5b04549ce7c7572d39c059f9d59628de33704911059a1f337e9f2b018e186081c7cf7e05102c78f3e49650f2bc272cb47f32e1b81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0b5b72be3d24ae132681bfde8ec47d85c7baf8f1186e01a58f415295a2a0a89530aaf42be4ae1f4617033793b95600f531d4294b7b325eb3fcf896042307677eca\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ec0558d3bd9826dcf5a547231702b26bb029d5b3",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1b0000000022e6d7a8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc401000000b2de69fa047e0aa800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acb1040000\", \"prevouts\": [\"39ea810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"2995280000000000225120fd40216dd29fb2eecdff7e4128bba3cfbee632fa2e745a84c0cfcf3475ca43df\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_5b\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ba3b0ebe67469642f50db51902a0e1f5eec5fc64bd8288118523f2403de23e5bad9391ee55fc1da552c25e568d95398e0d709c78b78f2e04f8dc95a889d317c703\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"1cebfa42f618d7ab09b669150af2d6b37e3f6f0dac9436c45197094568aa0183a3391348348341e268761460e4eeca8b264a2e5468e0a12c75db604f94630f685b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ec11e48dae90b65ac226a309a6ab974cfc87474a",
    "content": "{\"tx\": \"ae141b9f03dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bab000000003d92aca3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0d00000000851034978bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c445010000004f05579f031209c70000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e741700146\", \"prevouts\": [\"27c222000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\", \"30c5690000000000225120216a7619bc8bfafa3d746edfaa5de0aae98c6d9b6031b40cdfc5f53f6bfe1b1b\", \"23df3c00000000002251209afd231cc3806be681d40ad69b07250c6c3c148fe648fcc127815dce6f5b16e8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"1d7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369cbf82e6b81de47b655febedbc15934cca8850242400ffe44c9c244a6aaae8fdc92cd4ecb05acffc69b3cce67f0fe15bd50aa9f87096dacf733b4583e5e3d147ea37f54c31b0dcd6e392a972a33f542af4c40de53091de86bbd5587895c52a53\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ea680f8e17236a8fbc1196317399c346aeca722ffefcaac5ef62e17ac4625d25b4bb2c7d85af23cd06361a8d9967d47c0827d7b479cd52e2216fb2d12a2ff38bc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ec236a1ba693a15d7cd145cb072b03a9edafd25d",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f100000000f59b89c58bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49700000000fbb20ce604dacd49000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc88977143\", \"prevouts\": [\"5b30100000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"0b153c0000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"c7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364e1c80865788996a05c5a9f6b0900b0096f6056de983ef887886ef5950a10b0c0d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3ab0398bc4828dee75def1007ce877d708ab4ca86c9734bfab291d4bd05bae3eec1a6e987e7baaf45cc4656191a1a193c7abe05aba02d24b24cf2747f96e1d33b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4aede7f6feac32430a03a6fb4ca18c03b66145006034584e3a19904465ea1e66424cf807c4b041deab506320299ff116921971164ef72b2742896e58a89a98f91cdb1729650f5e7315a74782ce14a5f1169946bc7ff3758bb098f0ad0a25b2b7f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ec2d9171350303a508d3a35306e1da95e2d45a8c",
    "content": "{\"tx\": \"7fe69d4d0360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706601000000d2634dff8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40401000000a84fafc5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0002000000b17c94b301c64a37000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48713020000\", \"prevouts\": [\"0a4311000000000022512023961a2514901a699ec375254af5daca285299be5db377524e8c4f227aa80aab\", \"feaf310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8d227a000000000022512010c0a77c04a6b5898371cb41f56ff3be56bbf4ef28e67a70faaf4ce5d87e562e\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8e\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d512a2ca63ffb455d99d5e48d0ce26693d60c39456d7af39366f9ddaeb418e2954f33cd0b31c9bc4dfcaccd89caa263c020d1b70f58e7e0e884ce19a773d6b5f30b2981ae69232c3f6c5ff759e9ad4102f31f3fc5e7a3a4ffd34dce2e2e06026\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045df5339745586104756c1fc6d4b54e2b6a7d81daf8b03d1fc2a4a51881171d1a3099eb053c54d8f72c6d7331f9a1bb3bf1b628df692ad9b7eecd4e01f4a47bb5aed4b6001a8fdeaa28275cc8a939e32dd3c3fbbfbba5c677bbce429d0c1a1675d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ec3dc1b7325240192c1e37e75c29831fa68e98d4",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270350000000098af0dd360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701f00000000ce699485013f66180000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e77b030000\", \"prevouts\": [\"54ae1000000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"fe110f00000000002253202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ec706e6205a2d2f4858924a5688a6a1063f32ceab6133572aaa27d1da6be3d420df0d865f9aabc3f9efa2ca71feaf638b96c1c3a5c2e66d4474fbfe5471820d4\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ec4c99541792d43b2c11d31a995e9d4e6494735e",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705800000000d62312c4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1e01000000c89799be02be4f63000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca4226936\", \"prevouts\": [\"69e00e0000000000235d212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"ced55600000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"483045022100b7da1733a408d387bdfad13a62e1e4790313d9eaddea89f8b07588dbefea6c3d022055dbdbbdc8f09652590d5551affe85bf7b4ea441afe925b3585f63e008e40570824104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402207ac9f2de3e9d9c53bfbc1e22ffeb93c2f14a38f3f022c1e3f3c0d8a63fd47fc10220286a8e54ad5b85f671dd214b551b08b973c5b4ddc9d3b04ce84c9a168f9fad40824104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ec5f10d715ff4121c9af8001b65d91bde62f884b",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfff0100000064056d8d60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700201000000167321d8034e0186000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb31b4546\", \"prevouts\": [\"9f5278000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"368c0f00000000002251203dc2472455090bb3a6b10d2b5a6f86a9b76268c5f2a3511c1c846486e45d4259\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a84\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0821ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900459910ef1376b2f57d6157bb9e8c31b4bd4b9d07432c4b683bf27102948dfaafec7644b3dbe2d9311c88339dffa1c0be80a46778a5837645266f0e84452a246701\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fd5c0d5bb068ac75772b5a2ef9617f963c08904a0623a1a21cf299a7cded424b120199479ee6d2d4c88363683365d3fc0e890ec8511afbf0335c75bda2c0295827135a2a7712dc4ffb0f490ef0a9e18994dae8053f69b06dfd6a349e2375b7df7644b3dbe2d9311c88339dffa1c0be80a46778a5837645266f0e84452a246701\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ec7ac5952f631f170c9cf5ab7afb10a2800e3be7",
    "content": "{\"tx\": \"ce0f492d02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be2010000003249bdd560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c501000000dac634860214d03200000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88aca6414d55\", \"prevouts\": [\"f6a9240000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78\", \"23d00f00000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cc4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93688e21e0ba4623d9f1238b4cab1fe6058b8adee7f586c209e41396c5ed78664fb1e80b1f8b709fd7e9f8915460d72d278aa0d12452680dedc295e1cc62d069d9c5f8b38696f7f521c781f821b55aa4ff86c04fbebd102ad129a9d47907becd36b4e19d3b2ec28c8925d54c04f383936b915813fb16b738060565344c47074fe42\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fe06075904b2d09b06d544283b5ed7948355e691785c7b3e1a952a1a705151fec890db8e530b3b97e91b56063afadbbd8e6ac326e3356562c0a5ff1591f041d611c8e78922f12cf5b391747592eaf9e84d545161f4f09ddc8c51091bc04ba49d4e19d3b2ec28c8925d54c04f383936b915813fb16b738060565344c47074fe42\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ecc052cec3d69b0b941945fcfee7fcca160fee0f",
    "content": "{\"tx\": \"77f1ef930260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d8000000007f6b15fadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7801000000785a0adb01d6d25800000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac0f040000\", \"prevouts\": [\"0be812000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\", \"b5ed5d00000000002251202b9c9277757683e3a6231ec9844202804510fe71120186742480ec3d3f4624b8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"907d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ed16c11561cb4e52cbc61ad76d34e49a6feea77f682efcf50ee22f89bd1fa0f0da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71eccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457ba4f11ff80ca9181e3d85997fa959accb8f97af45a52bfd0df916797673441f5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa51b810e60c043042e0bb2eafa8cecc8c22fa830d489bdf7de51e14fd273b03e0ba4f11ff80ca9181e3d85997fa959accb8f97af45a52bfd0df916797673441f5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ed414b2d37754fddb26883baa6399318c130524f",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ceb00000000ba7843f08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b5000000008141d6b70267698d000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7966df5ad4e\", \"prevouts\": [\"fc6750000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\", \"81bd3e00000000002251204f36246572598982690fae3c78190d13eaf0433be2e576bf73c1db563e0893ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936685ceb4100efa5e54cc068990ea9a5bf606617cab6629ff60e87e062a72f36c14639ba4332756735e08e9dd0c9395e600a8a67669bda3acb22644b013566df80a9fad2668c863ea9bd6dd9197c1c49c61c2b9d7888bac8bf6fef03fc3ace0a5a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ef01d0d256ad0d229e53661481dce388404558ec2529e0bc1d85e0261a585159aa9fad2668c863ea9bd6dd9197c1c49c61c2b9d7888bac8bf6fef03fc3ace0a5a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ed5648d424b5a21a684d02bc55bdcfab06ec276e",
    "content": "{\"tx\": \"7712fd3c03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc600000000fa2131a6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3a000000004f6247e1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff3010000003fb10ede01318d5900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac50880832\", \"prevouts\": [\"21d5720000000000225120d8356a7a267600b4bf6c9db376097dc60a7f0eeddcdf6366770ff3523c8fa4d0\", \"a3c12000000000002251204e4a8cfe4f68f657f81d61368182a9dc3b463ed6fb97449e34c0870f4967da87\", \"1de070000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"ff7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936422350ecfc721a5c21c0cf4040c9c5a64d0462da5ea720aefe426d2501e13eb1f27794099b656b9faa6b5043ba50cab982b2292ed8155b5f0f6568a958ea63ad187b9e30f7e626b28b6dbe2d7b101f74e326290698090dbb0a7eb7a50daae87a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361c0123a470b1883e55ff9e366e23b08502d89d95970981457b7d383b3cec07169987eb7009ccae8c65258c62e5eac53ed5016922d24407b897adc5526f33b91916c082ffd0388de178727289f9edc245ed8244bc4e4186d1c7a66ea621fec0ad\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/edb0a385324372442f7d831b7fa747c2a2ba5d40",
    "content": "{\"tx\": \"c44943fd0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705e01000000f83269838bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40f01000000d07eb1f80331d14800000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc15bca94a\", \"prevouts\": [\"76f80f0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"dad43a0000000000225120c5051fcb1fbe13589a66714c26f344d0ddde4ff1aaba22c9e96bf2d553f61a5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c5\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5115f1aeabcd45f20884fa261b27121b1c083fa5a2716bfd01069fab98e18c3b0e4b23f991898c0f7e80b32f00b838c1f1514616fab2a47083539335b67c2689fcce4d7767c8a9637a0804b073b1eb172c67de67ce152ade33f2591a85dfee2e5a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936811133f2935f27641e5de866d6b2526674271c11378ecea72e02f5c1283f85606c8f4b27179de8a3c9fbcc0ecf825a44b7564122e0508108d3381c6acb047da700a5530ec2a7d4ba868ec61eef99b13bb3328da6d520ee28822b8288bba3da4c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ede245d24c4ccbe651f556667d1de8b18984e6bf",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff201000000a1f5ede7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf510000000013f48da304ee0ee2000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e727585449\", \"prevouts\": [\"1d666800000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\", \"adb67b00000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"ae7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ee4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8b509ab67bbf3c81955fa9e200008a666546f84b8be37a00b57f87c80ceedbec790189ee9b6b94816743a58868693b6f0ba58cb07e4c6d5ed2ce590077e887d5b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ba812021bec55125a4043e092087428314c694c64b021517d83eab825dad5a3d31f1765c4043c65869fc44409698468cef1d88a3aab3981df946f88d25a1c2d5c67b1d078674a4d97323398e107b13ccefe9299bb9116e21f935c64f37bba24f619c7e3fc3d0f43b284295c7c76b7ff66dfc7bbdbc495ce3e8e20608c97360e5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/edf48d71ea536f47f2ebae0ef4c1a54805cfd2bf",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf9010000001645c582dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1802000000937c02e50338aea400000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a62e010000\", \"prevouts\": [\"a5fd570000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\", \"f4774e00000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"b67d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936377fef4062e93837ddc7af9cb3191f24f01157283f139309bedbafa016e9f95119cfe9d552d59ccbadc4f3846c4b5c3686f3389826ed032a892d1ca338e6ba63ca37f8027c2c0b0d436eabba5be8b19fe8a47d5b17abeebfa31c0139f25f704791244d1d955381053a5c36db6928ef13bb9242569ee84b58d7018329936aac78\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fd848df663f65f0e27b2d1567423d7462b229bee90dcacba8c1bf1c1a66aca7f6821d9a3f11774810afeba87c9188100d693899e640a37210c96e3be6a00ac01d4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ee216fd86ba1f2f2eecc6892dba069f1fa7e2566",
    "content": "{\"tx\": \"a812a8340260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127011000000001b84d5c560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b90100000047458cbf0119a31f00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acba000000\", \"prevouts\": [\"7909120000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"c8670f00000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ed\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08220e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e179a506f75037c50a9ea9c509d8c41e46c95fdf651773b41e5feb3da8f515025ffd4cde6e083ceefa41c970e7ff247f88d4db270a866c6958487024deeb358702\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364239bb564bb88fab9cc8a68fc985ce74d0a60efaac94a2193d617d4650dce2ca20e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e179a506f75037c50a9ea9c509d8c41e46c95fdf651773b41e5feb3da8f515025ffd4cde6e083ceefa41c970e7ff247f88d4db270a866c6958487024deeb358702\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ee227dd2c697b5ad500c732edea24bd9f2ec08a7",
    "content": "{\"tx\": \"ac8ef70c0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f500000000cd6aca99bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1002000000166066d902baef900000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcf8000000\", \"prevouts\": [\"a32e1200000000002251205e6805afb6d033a5c8eef8d51c29124f559c62b172323155929ced7c3b8e8a62\", \"c53281000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"387d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fafbb5a1fe7b9516d3f9237414125c5ee80cc77ac3c2791cf19c93edd24acc7f158fa601fcc68a78472d280e0a6f10ace0c22dad9ad93c154f995d1132d7b2f793\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8f5321bd3c280560a6e93f009006b65547a58d72ede42c89f2f760c3bf47a1d1aa12168afdb4ef286e7748ddb08cf408d85b089f504486378d2bfb535c0d2875b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ee39d37f93b56b4c318cb83ca60e411ee5c1abbb",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127052000000000b665d8edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c200000000084914c6603c36969000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7a37d794a\", \"prevouts\": [\"2f9e0e00000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\", \"ceb65d0000000000225120ef9f6a66884775055065a73b34ff9ec529e6bca309e0ee5458de4d1e99086d65\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"df4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936be89d319d8869e9bf9ae746cc5e400e37fd9a102b3c132ccd07930db67bce60a51d880cc047c10a424f65fe9dd9096492f3efd8e08517d04362957faed36c3f852ff338358c59a252efd0a17af70f1cdfe194eb24c5d50483b26343bf89011bf\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365bf630a53e970a0c3ed444d8048d7a9defb53d27fdc7ed055594eb691fbb1ea35385991a3000310359e2a9adae84589f286ca8f4d4476598a0e772bdb8ecbe6352ff338358c59a252efd0a17af70f1cdfe194eb24c5d50483b26343bf89011bf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ee4391649d8b6cf1ed2a18eef419b54a19d2f481",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ef000000008cdb3d2f8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4740100000070de6b5704c11e770000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7d5000000\", \"prevouts\": [\"21b33d00000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\", \"6ab93b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"ae7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360ef4bc0489494d72e70e64b388972e514562ef0f037a1295f9b046f981a6c54ffc0ca702511f3076acdc40632b43a1d65714ee25a695072e4ff6818d06cb6b94619c7e3fc3d0f43b284295c7c76b7ff66dfc7bbdbc495ce3e8e20608c97360e5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d8acf455c5d2fad677c631ef590e33b043ac89ad327665e6cf9d96250341867de4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8b509ab67bbf3c81955fa9e200008a666546f84b8be37a00b57f87c80ceedbec790189ee9b6b94816743a58868693b6f0ba58cb07e4c6d5ed2ce590077e887d5b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ee4b75d279f94af5208664797cc453ca45044806",
    "content": "{\"tx\": \"dc7f15740260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705f0000000035065d94bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfce01000000f213c3dd049fb7800000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796be95ab32\", \"prevouts\": [\"b8bb0e0000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\", \"cab3740000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"747d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdbf4492fa00dc56072e72009d776219274bea6eb51adb458249eab71940c27cb4bfbb1ef2412aee06f4b75b9e20a72d4d9707545a4ae77abc538f76b00105406a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936740c20c98eb602ae4e7ad05a38b8b2af7b596435455e1533be50f503dd72332ccff906089186a2156752da0c3c16267cbd92a27eecc3bf322cbdfb883eaa82d667ed562df09fa99b9816795ca593030d6e2a26df3d36427b327259a2f453cdc8077aea6ccf316b47e40a0e3636c5ad4f7738b9bfce630d4a478a0dbfcb51ed93\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ee537050d4b74465e99c77d79aec50879344edb4",
    "content": "{\"tx\": \"ce36f33a02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce1010000007e650397dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfb00000000bd1a57b903916ea10000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374872b040000\", \"prevouts\": [\"e45c4e000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\", \"90e355000000000022512009252952876a5c13cea12f753600009323d5e64530eb665ff4d131016b9c0911\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f8e3d1763d4a4427ec633b67322f57c129a5e80babf61dc89134b834a86f0eef\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a0d616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ee666d81fc0411dbdbf38406d49ba05685bee495",
    "content": "{\"tx\": \"fea3974303bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfaf00000000f2daa1b1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7200000000c374aebcdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb2000000006b51dbf6012250b200000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac38d83e24\", \"prevouts\": [\"447672000000000022512049509520b0f91b1265a5e49cd83a9b0f9e0f493349f712cd14edd64d1d2ac018\", \"be8e1f0000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\", \"cbfa2300000000002251203dc36bb5a2188e61583976906c69e4e1213b5b3aef7eaef25acff80132ded84f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"cf7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936684835b9029b5ef0cdd410a4153383e35a43fd71742849ee7102ccebce63bb580309cb272f305cf5bf6862d0b37519cb4aa2491edaf37578d4af3081a91facd0fe03d403be23d34fe95cd8ea927043998b4b921fc49b039e78905cbd289b8eab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b898d7164c63521d871163a04709f05e318ec8f97be239ce787baf514c9e3f692e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdd6c4167c25132c432c9175336dcf34ec1853eafcfbd891c58e0cd045b8bc4542\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ee92d4d96303e7296f561d5b3efe262b3993bc85",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4de0000000065ee38b08bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42b01000000779fbafc031c5471000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df979722368987fc040000\", \"prevouts\": [\"a15c3f000000000017a9144582b7676ffb8c3a2735b8e71e172a272e3e33c087\", \"af4434000000000017a91405311b2c9f444185bafbe03a9610c5d95324a8c587\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"47304402204f1d0d1e42bfdc4758d48e17bed4509f062d62120e3f8ab50c70ca8564f380e7022069597f4706ae7a4259dbcc96a399168e657bc7a42b34e21ab8b616c2e1b18d35162102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100e734e86cb7e802dcdb76f77171ae3b06125cb261ccdb83d0a602d21be45c5b1c02202a8dc1f656029e582f0765533af65eea98ec9525edb093cf7ac469f4637730e5162102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc294041976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eeb6e1a4eebe04ce7814c38efaf8b5b7e910296f",
    "content": "{\"tx\": \"05439dcf03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce400000000e23122ffbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2801000000445b0faddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5e00000000b41645be01b3ac85000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487d2010000\", \"prevouts\": [\"5f875f000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"f27f6200000000001651142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"90775b000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"3f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa76a51402fc917873b776340a7337d6d9d98f28c38cbc7d5e61e594cad9a2611aeebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7acea811edfde1d836b623c2094badb4ab8bc7795b2b49da5506600222f32ea3fbd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b75c051ccf245b031e4900985c151ba997c96374fffdfa34044d40aec7c89fced874772a13c5a1227fda830887213a5c965a8abbda46e6162f44fffadfc4d1ce03985aa46dcbff8b0495de750bd1afe74a661312f7eddf1146199ee1ea8c08aa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/eef8d1a1e8c3a9566015b3ae089052a50d3c3ddb",
    "content": "{\"tx\": \"d2c4031102bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe40100000010467ce9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9901000000770146d6038921dd000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac0b000000\", \"prevouts\": [\"11f6810000000000225120b52a77e37c1fa9b4a7b934796858277b8dc346396dc90993eb725a9563cf0842\", \"b9f75c00000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"e07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dc752bbc00728dc9fc97a524e5c00d8fa73d20f44eeac2a564eeea9db1553afc3bc00f369fc994f47536ced64d5e4f722a68c2ed1128957c24de4b5158af0ec63ccd0bea79832f66dcec0cbfd0592e3eb2d999b46ac697170d667eb8939a9687\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e73d9d375b530aa22fee240902ecc7793689bdebd58e9771ff3d6e92b1aa7f5c13ccd0bea79832f66dcec0cbfd0592e3eb2d999b46ac697170d667eb8939a9687\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ef1b9627be8307d947f73d84910a2d343187898a",
    "content": "{\"tx\": \"0100000001bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc20100000010e708c30198f04c00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac7b000000\", \"prevouts\": [\"ea217f000000000017a91437a5c76a04bb604ad99785877003310ab74c7e2b87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"165c142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"32b47c5333ab0bdb401ef0771e332fae7cbe19fb0f1fd61b1ee0ba8d9e764104377679372d1753ab1662eeed7e7162abbe9daee6672e3f3b4096e69f23a3cb7a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ef34d2a06ed043b1d7aa5c55d07e649a98e022d0",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c040000000044ed024cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bef00000000056c24ad01f45650000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748779000000\", \"prevouts\": [\"6a234a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4a73280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_33\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f69218b245e6d49856976d83ce63f78c38e160a2f6c7a89a3e51e36a4fde7c535e36278c50071bdd70dc96210e0e4fa632d3ff29046d29e73d51c340595aa9b582\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ae46da8fd6ee642b526973827715bf7b1704fc5b4f256c1f52b58e580e469290beadfc2b8cee52a7c88438c0cbe332a85479de6984f219a7551ca8c441ef460a33\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ef5018ccc4d868e150c22f85faea02a352f124d9",
    "content": "{\"tx\": \"1708ab0302dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1902000000fef83395dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb400000000292d34e70146f851000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87f4000000\", \"prevouts\": [\"dd835a0000000000225120cd05dc3ff800de37cb40ac9c54624c99f7c63a87a98064fe9a32a769a26ad4a4\", \"51594f00000000002251207c531fdbcbb17294861c2fe9842b59c23605dbbb4aeaae1baaa0907152d9a970\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"137d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cc2bf80b2db027afc6ff7c1eb2245c9e3cd90dfd08684ab7b931baf85a586a71155f23cd39ff67d8b5a6775be7b28a3d1b06bcb926a8f69937c20b78b14c2d485d0346f0de7f7080f7758bd86c81c482f81ad0c7703311f4b65ab9d7b77c9f00\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e048ad2721d56e7698732cbf102ae8e792035911a0ba8e4825f0ff9fa3590c070ac5ef61da5659d8214c667aee1dbe4febf87286965cb6fe696f5c1a17be3da5155f23cd39ff67d8b5a6775be7b28a3d1b06bcb926a8f69937c20b78b14c2d485d0346f0de7f7080f7758bd86c81c482f81ad0c7703311f4b65ab9d7b77c9f00\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ef588660a2f4df9f52c4f476036ae92b435dd8be",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6a010000003b24bf8adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2201000000fb57589c0357a6d200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcca000000\", \"prevouts\": [\"abbb75000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\", \"64ed5e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_74\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"fcf934919cdbe5f3ba3a8b3facc9cb916f783bf56cfde2e97ff99e236230f91e3814acf1db6ed634540a9480579bc6c2378e28e318629e11b33f7ee4e6361a1902\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"74616d1f4d5320e99ecb85a5d31ea0e471d4b5a231eee74add5fd45fe458ddac28af1f35702ee9264b19842e4729538fa52d3a785134a19c2d754e6bbab8f37e74\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ef7b84160b7025ab4d29b8bb32de27500874c4e0",
    "content": "{\"tx\": \"01000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46d010000007fc9e944dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd50100000032d28935bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9401000000353048d30172b24c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487ee4b014d\", \"prevouts\": [\"17883d0000000000225120639f61e583baa036c10ed0b3dae79674c76249899948b2504e8e1e0ca79edc96\", \"4e40240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c40a6f000000000022512026ecbdce513e5cfeb779eb6a118aa90fae67510c7ee9bff64af6ca27f9068c2e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_d9\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a066227205a1bbd7f1256dbb9dd7b511aa14ad75eb539150e3a7935ff673829158ce809435082b747307a9e9a19b238e9ae4f6d692580dd13577c42c51fb183a02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"fec8a50f82c2536d588fb7f3e1e4ca4d55f1e482002678b2a62e6c69af97d2964840bc0ed4b26c6ee7f580c12bde8ca15382dc22b95bc3bb6da4c53c0d74a705d9\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/efab9adce18cdbdd285db520ec08c755b0916a2f",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc7000000009095a1b0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb701000000a352ab8601a88993000000000017a914719f78084af863e000acd618ba76df97972236898739000000\", \"prevouts\": [\"dade750000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\", \"ccbd280000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"067d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0823f226bc542f166b7ab1884d7601266c0b79ac59ceed404fe5ce2372ecd38c8cf9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ed1973e93f7ad3f562801731a237f358bfce42fb636b2a0dab3a823989e87b4ae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93662b4c4e03f8bbc4e0fa6de616a7b17503976357af82c5e4ff1a693444fc6910b3f226bc542f166b7ab1884d7601266c0b79ac59ceed404fe5ce2372ecd38c8cf9a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100ed1973e93f7ad3f562801731a237f358bfce42fb636b2a0dab3a823989e87b4ae\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/efb25951d890dbd071c4a3811042fdb8e0bc4326",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc80000000000ffb097046bf559000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac6ba81537\", \"prevouts\": [\"1bbe5b000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063f468\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828ef0ecf285bc5470eddb41e1019d9d697e32571bfa8271cd432e6dc81a28355aef31942b1858214ae33105eca3f0b2cf78e8df05a3972acf71e40f309e975162b655a633384d647dfd447ac375ea9b2c02c16d8a17436cec940ed1871036c5ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a3aec579bf900f7619d434dfcb8a1ac75e7d4cc09e331d2b80b2acddd570caf1a416fde06d6dd90590ccaed91ef0bd8538f486647382cbeeca5e39ce4df66da0ee1e8f33acc088355c2f0e93e4abfc8ab0ff1ea986a1dad4f5112c46f486a1d1a6f8b9af6548d116d93931f99bf1698fdad997ce51263e0555061e012c5780fd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/efb757b9644c060f72a7441ae9f0dbb05935ddee",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfae00000000c465f18adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8c000000000e1ef5a50158f18b000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6221bfc54\", \"prevouts\": [\"cd3b7a00000000002251209dabef6569bf97dfdfd6e4e18b35ff722d4022017cd06d2812750df0c019f7da\", \"c6be550000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"697d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9facb7a7ab5fd71851d574a9c26887a3027e1173994a10fb9074a9680b95d402bf38dbbed29828226c3a1e74b431b518dca4e99f1ee054f76cd9b7bd5529b5cc8688de3449b5e2c621283b68ab187cecafc7aa77a8721601b5317d3484f84536019\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366514e2792df6cd73727562f46c93cd47aa533cf6032189900e3e0a43e73e7f3e7bbe6274b0dcd2777fc9b1075bd65318fdd52335751f1d5034a6ddc9c2a447578de3449b5e2c621283b68ab187cecafc7aa77a8721601b5317d3484f84536019\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/efbdf30300adcc55d7c50d4ec76a75496d6d7b7d",
    "content": "{\"tx\": \"73092d65038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46c000000004658eea8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa401000000a7b39fe5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c450100000060837bf002397b12010000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a60fdfb23c\", \"prevouts\": [\"afe43a0000000000225120b5971b61c25a2798e5070f8744a1dfc2e930eb6eb2b95087e25b503f53923ed3\", \"7ec5840000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"ee20550000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_ce\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a1ba71fb12e1b3fd60210c51e6470eeb527193c5f1446147d1dc9175529a5f6f6880a92cbbb5228be8b7b145657fdd7758e8165df245a2f34b2dceb9a654036282\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8ae788a5918aef5b26a2630292d83d6ee61bceeeb132e6cfd3705c729fbcfe6ed62ebae4a1e1b71047810ca1db32b62d792eb4b05aa22b63463944c10577f381ce\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/efc4b323ebe3c0b9e2f2fd7168ab4437570a54e8",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0201000000a5902247dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b260000000016a000b7dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0100000000de383c3702a0e7a50000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4879304df5c\", \"prevouts\": [\"f2295f0000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\", \"0b62230000000000235f212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"bbe224000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367388cda01113397d4cd00bcfbd08fd68c3cfe3a42cbfe3a7651c1d5e6dacf1ad1ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900458e881bd6493e98dc576a1c76b7dda488b188d283086ec2219562e3f5b97e3fb63f980255362d30444bd4a09dfd60422f4fe5b70b7cde78729ca8cd52cb50aace\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a08be2b61717d300e25a6886a484f941c3f7d4fe4b568cc8a81fab5ca3208b59a7f496087fdd0464c266da8b16ca4acd01559ec68405b54c53e2b4568db5223db0bdfd7fd43775a37ae3e20c8f8514aca25517db969733cf8d9f690f9b6d8ea23f980255362d30444bd4a09dfd60422f4fe5b70b7cde78729ca8cd52cb50aace\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/efce2a5687afc47a9a7951b0d14a86559eccd8af",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3500000000f75e818ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdf01000000a0889ad4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b87010000002757f8a404a146990000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875dfe903c\", \"prevouts\": [\"79b65900000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"221d220000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"80fb1e0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"47304402202087be73d02616120f30209b25a1a1206d400ae632fafb4dbc13e48a14d3ccd302200a83c42f237aa800be508ecc687767cfbe849b2d5e4bd28c219a4e5e1c3092b2822102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}, \"failure\": {\"scriptSig\": \"47304402207f105f2f348b02fb97457b6804d3e6d5d718370627a1b742049ea3ba452a70d0022031b860255b16014816d31097bb6e600748aea9f72faecbbd4b447dba4aee30a3822102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f00c95582e31d9827eabb236ee8b4b776907a667",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704501000000ee4d8a848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40b01000000f0d42d8a0429894a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8749000000\", \"prevouts\": [\"30ce120000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\", \"725c3a00000000002251205179b7d628a57252570761200f058df77fbc655a348e256a168d7aadf31418e7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"f47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a7c1713bb6fd836f670621a98005beef08cd27b654a92512fc54053c11f318fc2b4a87a36ff2ed7228bcfc2438815b30cc1c98339504e1b834e10aaf4a034051\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c6e69b04332a66418bb8cdc9057e862669dacd1ba9189b79de8865de4a0cdf7ba7c1713bb6fd836f670621a98005beef08cd27b654a92512fc54053c11f318fc2b4a87a36ff2ed7228bcfc2438815b30cc1c98339504e1b834e10aaf4a034051\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f015ec4058e4e7ae0d1a64823882e2e3fe9f8bbd",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbf000000007c50ca91bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf94000000002da740f8bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0101000000229667af01daee3f0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963a040000\", \"prevouts\": [\"27a64c000000000017a9146db815d9819f256ca5d1e70b15558a98689cc52e87\", \"24147c000000000022512080bd047c4cf14a11f5476d57183f1020b00443da67a37d5b059d1b67b35ba9d4\", \"aff2740000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"404bbae303d496b8d34d72ae8bb19ff543f55f831bddc06bb9d80c8307ac57c4248bec3118ca0c2fb4e391065b3d5184ac54f40936fc05ef538e4831912d556402\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"50a60fd5ef47cd4b364ad3d01b6c2a28d95f0862b577c9022702aca2037544c47ee429b94f08615a4b713f3d08444c21512ef45c01bd4c6ef81df85bec43cae07a95944d2a18ba750cdc3477c5af2cee0c2a4e52e6611ad1b246861a6aad7c209ef9c1fe44a9dc1fb076d2c567d0540b9128a4f0127b96dead7fdffed92ac95d020f6bd2a6d0ac40c9ed264a699ceec8edf8a899fd2665ef0d03b5de632711297489d097619158d0f84b1c9e3851a988ededefe4aef78c22038cdb86bee7ea243adad253ec1126b6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"085eae44e6c21c241b9120b8501938a6cb0cb676215ffa7f942d8d1f8ba5e269a7d9ef8b426879452b62969e8de1538093e95da9ba988d3892e25e79cbd0b88701\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"50bd36acf066b58343cb81d29d18141760ee03d0080e47456eebe11bade90c08121e2da99af1fa847e41fd280cb0480eea5712b039af28a1ee01f0c57f13d5fc128c0dc27c1d596a463bbac8aa0884583c80f4511688c4f8bbd15446982001a33d195c65ff1b12fe5212cd902263ee0da25179e20f338cd2b4f930fc28ffeac2633fcb93ece080337731834d9fe14a7de80401fe86a09b06a063673d4b14e042e25ce6c603481e63d6cb660bfe3cb5df6b309d6699e4a225e88cf3a7c9a763623c1f402b494b4356520d0eb9bdd2ac28e8748a5422917730fab78b32a639cf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f04d521c21ed8372ae0bcf98ee15b6ca83c85bc2",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf86010000000341de5d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46b010000006e8ce12b02cd14ac0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac61030000\", \"prevouts\": [\"0f05780000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\", \"26f63600000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"a87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936070bcce77ee9cef21e7dde7a48a2affc6a0869a65b8cdae59e8ff14f5e2ace20cd165f299bdaaa06ccf8947d9b12e815a5b39fc50068532880492a3446c423d89e26d26d9f798657ab1642d8194f1f5dc9158412142f65824f82701f20125ac7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d260805e6129c938d2ebd337f78d5f9c6d20fd2f0df083243f56c0722c96d98b3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082337e31cedb20dd0ec36f43f7131008eded9387a241f89ca892d220549655a6e95def3d75afa0626f5ab572f3c9ae49b6567bf85ec43d0b3933062a3ad8b1e492\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f052250556f0a305782ffc367c106bf8213e5199",
    "content": "{\"tx\": \"02a25573038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c44300000000a45df2cd8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4d7000000004530aec2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c62000000009004818202ae91bf0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478724ab1f33\", \"prevouts\": [\"520e3100000000002251209bd2c3b94d09d0c3ddee02b44daf89c5e94fb9f94cc74cd030eef977051f59e4\", \"942a410000000000225120327dc9effbe915b227349282cadfcd45dc438d4f1c3ec72713111ad7587a718c\", \"f2415000000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"e27d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fae4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8512c582a906b097cf6fdaec64d2651566eff10d9e5eded90f3aff95e690654e4212021a26ea5e00fb993aa3d0fc1bd1e431f365db69035b8e4625845fc9b697c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c592cb302a9f446744f5bef15703ec53b083cd3f0692dbc327d4c802b2b75627512c582a906b097cf6fdaec64d2651566eff10d9e5eded90f3aff95e690654e4212021a26ea5e00fb993aa3d0fc1bd1e431f365db69035b8e4625845fc9b697c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f0b8804a6b3fa0ab08fb2e07758480377e212f0b",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc6010000004f2f5a8ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf201000000518448d70270749900000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487c5000000\", \"prevouts\": [\"81447d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e7081f000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_3e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"245911bfc88ff9c207d514cec10b72c5c39a26d05763aab0157f9ea04cb532a58cb01c8cd3e08f56c5d7e76b5cd6974846e641384059bceee278fcdaec64855781\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5f71a1f1237c4091aad404ce88fcd1410d026b15cbe885a3b0896293cc18c8373e6204787797901467daae09e3a127562a226992d5cebc446b4ad33a573d6a273e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f0f31b265d33a5adb67af2f1fec8248f8855469e",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4db00000000fb0b3489dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bff01000000ea7ff3a203f9225a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acc75f7548\", \"prevouts\": [\"524935000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"93f3260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/unkpk/checksig\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00c45e6a38db8e64490d7884167fa7f7d3a4edc4de8f0a033cc292eafcf0eac26ade41a618476098f14304005d715eab6dc86a15679512b886155d8238cc9771\", \"51ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d4e264197456bd4c1b90f4fc8939bbf0610dca38d2fe38774b0a18ec6f9b89fd6d5d57b1dcd138e0cc147645402e61e69606b9792a3b1099031a7a147753fb7ce94cad6d75d2cb0ef900454538e7fd1b3ce4a6d54232bfa291f410b69a126dde54db117b6c10c3b79a9544d066c7c855e7686ab420f6a95e4ddf7a60395767a4dd4f3ac0a3984f3bd2e15d4b9ca628aa2c1824adca4bc410c6babf89cc776a6d4058a827f45ae2febfd6a48e1caac11f989a6c525b4da131ce52fd12e7f252fb6bb3fbe66e03f1e3d5d03c151a1f49af6fe35648ce1fb8bd1df07a497ff65e67ddf671b321fa9f2f2888d22aac2e45fde49c08b0dabc58a3dab9abff3ef25bacc98981699735d9d2ad5870d568ad1367f9ff314388b4fbc7f8cdd9ba342a7b5179c9ccf72d9e1b4864c4c957611c569bc9c3d7747c5432696dcc4a6932a52f70fba63ed8c75c68ab96fce5e685474517ffb0ff82c60ff0dc4d12440e21f52ab15ef11190bc97bcc8d0e99d5656d0891e3984baf383c021195a3f4accb96a873fe0d5c32a15e7fe92b17b2b8c3b841359f1b14625d34ce4c46a1c898e5b74301d7a21d399a47140b6711788aa4ac5bd9e63ac239ed45da28e932ea3acd6bd9f7f5a3113bfeca67cfbd40f858b9150f2d1112d4e5e609341baa11cda5532a4a71babac9d6f1aaabd147ca57e59285d2955e18da8762c420c4b0596550f02e8a0d0eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8c81522dc5faeea7ed36e2c5155605daadc9320e51ad319bfd30bbafd0e19caa2f680299749f3becd74b3c421000dad930bc0e9537816ac6add0cb991becb806\", \"00ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366b0431b55481a374c89f40eb98ef9d2a1ea4a15c1fa25842c8dd1b505d3f733008998f104a41d430584d29acc5d80983bfa4388185b9ecb4fb5f364585438a9bd260600b62c8ed4db4bf12723005c7f766cb302a575f8872965ad67f65636a6b0c8f171a0659181424fedfeb48947aa5b62ebec348497eb70a0e4b9dfaff17fe7851f2fbba69e8a986917b32b5f76ef63e06d7f778743be5452643f44f99ea505f10f2cde5a4729d525a487b41d56d434ed7dc5e0aa5e11e544eae0c7246ef2b3ea5155719b875991d083ecd32183be0f5ac452a5905295b6a0b91be04b40b76e4803cbe3d00c239899d4914097448c043dde77fd42773528487758c6d087e8cf83fa64278d817919e62c4d23adcbc207f804fcd146d72915d8e061e85a8f6a6e6cb9d4e0a9220b07d19fc28732eb4bb2345d54d956bd2d189c6a5f87f1c011bb65cbfaa9ed654ade91c00c9fe4f57391c241e95cfd60b1f44f495a05086ba006260268f3fa4d832afae96ff672bd19d7e928d42bc878143589bed193337fe656f28feb26558d4d064770c2eb738b0251c60e0a639239140ddba0ceb61ff7c3e738a88f45b76d7bc9f694c0e4e272f5d4f15822286d483919ad24a64a55c6aea77b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f111543d0f442f268353dbbbf00ebe24c21f930e",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfd00000000abc441cc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4220200000015f555c90339ce5500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4870b030000\", \"prevouts\": [\"114527000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\", \"9d7b310000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"974c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93626364c264ca1a1a3113427e98f88e51ff7da2e89277d01d72659b15bd38bb6d4bbdd0eb743f16fddaffdc87a703f35bd0417e0996b155e435c0add546ea723b55a7303e26d6b86d2a780c30dbeb7ba87c6a0494b901c3875fb9ca7f2f12bb2fd373be813dc08f80e09d78de4ac5358a3bdf22545a425b50fe87daa20f96c44d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51064e90022f018e8cc473163b262248813e3dc7e43f487ab53623d6c75190b10b282285524a15c732567d099967405d35f7136f74f48f011bc4ab279ad8d14f14\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f1439b2e5f242df93c3d5fd61e367f850098495b",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1a02000000688f084d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c2010000009ef8d859045db7a1000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acc63ed24d\", \"prevouts\": [\"8f31660000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8f393d00000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902992411240ec2753d3808be0a0b86c3cb00d1f0d3e39acac5e325e3b929eb9613b1ab07143677cc1743467afa0ff3dfdd315171c3d78cd0b46054b0bea3a7b36a22bf660ec92ddf353565429140cd649edc18ee664a92b76e5425b7f53f6cace3fa845f2d6c52cc321790001486738311edd5082ddcd29019aa701fb06fc7fa00b767a214a93e963eb1b7d818f44676b0c21b9839bfc2be13a443c8fa71f15d6404832f7bd6f474d1572fc4180090d952dee36a56b64345b3ed2fb8f2d87f22bedd0a597a44a89596e5e79711478b8713b6f4663606f8939f8134631de7810131d064b084392f85e0039c0b8980610a4722a443e6931511630e111ff47ef362fb837bf121bd6a54a3c5d3a50c27ee8d8bfd650e62a8ec240b9a8e9e0775132c97d7c6269db36f93a3ab42ea9a45fb12c1bb0c342cee2d0974af242c0751c2923d10905eeb4df7ae2e4c6a8da1bd1ff6ff0a6fff1097f571c25f8aa8ee15554734f4f498cba7ed2398dbb375eed5d6447d046f2fd689ce77d0e874dbe026901152fee1635acfe5c17e53eff7965c0218d706c95dcfd9b5a1bd9321c9fc3633beaebe23fab1ef8ca0aa038e30f4be9c2ce8d6030b9927a1dacdc064778a9fa0c092505d4a5d3f4a29e6a9d6fb20f74f0001fb5ebbb5f4c1484438ceb99557214909ceb0425baa0a937d16573c3464125ae7cf9739e480a5abdff4ba41183821f9aba3cc2fc871b6c3c17e75\", \"0b7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8784d9e7ee919b8817f3904ff7d27b5c3a4ce3798ed5b994b75288b8e9341d9b42c78e40500fa05b550b7f6357dbf83024c41a574f6a1706762c104fa8aec3fcb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c99ff4130304325e5b01178d4ffda3c0e21c3bd612287c5a5ce107349391e85331108f98dac92f0abc67f2baa39d3612e382eca0dd7d7e2cb3b35cfb851f859a12412296e38a3b261b86a388fabc2e2a1588ae30b7383d82bba8e6e0d5ed5a850f56dd664e659ee5e69dcfce9781a3d6ab95823a179cb34d6fa8d0ad25ee1bae3ee9e2a9db6140fd94327c1061214109ce7c0be7722b8ad3f91663cb1a5df727235f5b89f6be6b2f5ee4555210858cad0d9262db26db5a0f935db6062941204844c91def066ea44e8729ebfb69b47b4ff7988b20c424a451c44f9d67e7a06d0c67f1e065e5e4dd0ed0bd0bfc7aacdcc12e6c72c521bf788cdd97d72cd2dd440482854e9b2ca7fb0b5170bccf8447f57a3d7467b31a8c02a2d644a16ba6173b3bf857e4cd90539d917959f32ca87506b5cd95212be4564ed5810135092d4fca29ac9da2b880a0147afa239c2049438992e6abef6cc3044f08e98a77b7e4d705c807ff9df6b36aca283a3c3f8078fe9299388ba91f3b20ed16b60d601f459b898bc36e3cc5d29ee025c12765ed1ca745ea7970fe239f22a074abbbc384996c0e731e3680a1bfcd75bc26139a311a632ca1a452d88d5c53d5b08cebcd9953aca69fd7d4ea896c28908f1328154864cfb2dedd72a0154f6a69e79924e5757b91bef993aded77880f732ec6b867ab2857bf7b5486612bb2f3306ddbf4f17bbfe3eae048c02865753a20453275\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ea51646124a2b4386d840e205fec55c7cefbdbe9c75e9c45dd558741f313d2d0ee0d9bed60e53dfa6fe8b58229f37daf0597893c765c7b30814eb9e16fca89b86\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f150268fcc20d8c1e1607d773fe9c2af148e9e8e",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdb010000008dcc48a960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127083010000000035858903fdee6a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ace2000000\", \"prevouts\": [\"a4ea5a0000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\", \"05d9120000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063fb68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900454cdb1f00ad8e6f49049c3b8916156053acbc542960ad6e1236bde6d1970b6ee852b51aac478484d8a075e848b67a41ce9b347e1249fa49816f898b909a6d4bd5c77e07a04f832bf80fe1e45fa6237ff98bc90e935546ee680c041b2556eaccab\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93613731d743a1998dabf7620d1d828b5b28163c734bff41737a94b9bb5e3110fd84cdb1f00ad8e6f49049c3b8916156053acbc542960ad6e1236bde6d1970b6ee852b51aac478484d8a075e848b67a41ce9b347e1249fa49816f898b909a6d4bd5c77e07a04f832bf80fe1e45fa6237ff98bc90e935546ee680c041b2556eaccab\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f1728d0e4771e35b1cb1998adc82e22eb67a65c9",
    "content": "{\"tx\": \"a54aff3a03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf37010000008bb7459d60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702700000000a6f955b3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b590000000057ec95af02d213ac00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df9797223689873f816d5e\", \"prevouts\": [\"87ab7b0000000000225120637e54d800000b9ba863fd409e40dd20b023cbab04d0b624963d159680b37b50\", \"d308130000000000225120efe1fa8c8643b06748235620ecfbc876727366244fc928e9c2000087b14324f1\", \"17ff1e00000000002251209e3a3263c4a4d4739bdb7a9cc15be1576bf24ce130b027eee13d8f139fadd4dc\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"227d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93682fb3b4087072a481d7212df69b60b618087c4d1c0d29d2f7ee92b373e21faeb8a2960a95becb1bbbe0636e0493c58f712af9b8da417013d797bf12c130ac560a4a9bce64ad1fc5af22ad5621933415c83e23766bbab20239912b691ace9dee2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936be77e2234f57b9b74ee6a68dadc788f2da89960fcb7a13e163371ae2a2591881f76c402a4bd1fd97ec7cb0657ebc265c6b14283a23241722901633641a1252aadc4c18ce03381be5d83370dbaee0482c0440aa7aa94902a00244e0237bd29478fcb15428af69077ee4e47ddc8bd2adcf7d97a29fc56c75a24a213a103a1e3586\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f172e0269b4ce4678ade6f0ac95a9448d2453792",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff201000000a1f5ede7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf510000000013f48da304ee0ee2000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e727585449\", \"prevouts\": [\"1d666800000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\", \"adb67b00000000002251206c2fec4e8a1c469e06f21e10d3391a530153ef860e8b3f034f0bee0104770428\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"577d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d04bade1c924e92c8fcf5c96cd70dcc3bcf23e3c6838a356e208cff365f4000b35bf8914ec6f25b4d9fa0eb4d13d0c5199bab9da1f0dbae1e1446f691f7eb6d53a8385792857b3824bc259fd95f469eb32c57805e5f383de6590f06749d208e6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360d77fbfdbb69849d4ff0a6fb331fb6eeb19c0afba192c9d1db1aa05948f5f4b1da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ef4a7dcfb64e618b34998ea64659fe772d1fd358b29e003b2257b85d2ca618476a66706abdbe591f97764059d8785051c12d40b9c9543fb83334d204ae23d8b59\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f17ba688055f4e28c6c763a1a67b55ffd27ab22b",
    "content": "{\"tx\": \"05439dcf03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ce400000000e23122ffbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2801000000445b0faddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5e00000000b41645be01b3ac85000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487d2010000\", \"prevouts\": [\"5f875f000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"f27f6200000000001651142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"90775b000000000022512045a6403ae49be683b272d9a42ea0a940324a318f771f036a6a11d0e9905b97e4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af7ee47b9fea2ed853d010eb737fc8ad260ee45bdb324eb6b890516a33267f7949a5cc4d847c4791c38caa75bc9b539b6ca6c3bc1b944a31ded162618a89211\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f18786606f38657d15f1d007fa2934ea6034a605",
    "content": "{\"tx\": \"4cb277ca02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbc01000000987c9ec48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48a00000000ab7f4a8301368b720000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7960c7c812e\", \"prevouts\": [\"9c487c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7b65400000000000215a1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/annex\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"710e80e6f953d1db34b9a28085ac9dff3d7ed72b1023658673e372a4c899dc71160cb84f2a911cf50116289c86f1e946e55b74d2e3fc851e72445def91e1395f02\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"50\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"24ac7b354f286edbafd63ef9dbef70db30d69a37c00bee175ddde69abf2e274cb252c230e696626004e8fb8a4fa3cf94b51edfb25b84200b9d2d6003341daf3a82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"50\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f1ab87a390b003a1f262909e41e5d3853c0dee70",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbe00000000a95271d0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcd01000000c9707a1b01a42ac8000000000017a914719f78084af863e000acd618ba76df97972236898781bd9444\", \"prevouts\": [\"5b3179000000000022512043e98e0a8fa214574b4f7d43d988f280e5f4237220ef6fffc40af5b8eb3be152\", \"9c0875000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fd\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f9d8f10db74f979c41891759fc87cc010c6171f34a4dc4fa278f7920467dc96cd9f77cfc3030f4fa2d9551f14353e565e33cb9a72a19e79fd0e4930553ab0cc3a3aa70c847d82166fa4c32b27cb78dba1a5c77b2d4b8269442df723c9129fb762c347795cbfd24b3bfff0bc05cfe1b5e01afc0104c4d9fbef2a45c75fa918ca8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936427f03015f7a96869233965cfd3869b27cd157bfb8ae4cf2df456ac491585181380f015d033fe7faead4766c682a770029d5c79030785f2d26c440da4ef071fea3aa70c847d82166fa4c32b27cb78dba1a5c77b2d4b8269442df723c9129fb762c347795cbfd24b3bfff0bc05cfe1b5e01afc0104c4d9fbef2a45c75fa918ca8\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f1ac308d98f3a982e3c86ebf022541b3c7a53857",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be100000000ec6e0586dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf100000000fd59c1ae0257407d0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a666000000\", \"prevouts\": [\"82e01e000000000017a9141d8eff3030620b266a8bb5e50900ecd7b2ab72da87\", \"111260000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f5fc9523ef5d711d376a7546b8613c92c6453cf935a9e008f2e992a07522e9b738db03092f78269092a33e7c3338556a6e9ae9561fbcd456ff3caaeddba2a65696ed8ecd3b1f44ea46526d24d4bdb104b33370162d4d99cc9d7116708e1ceeaac08455640a3ac76aa5c6a831ea8a150475947d0f012a80420c5ef4b99d41b3b921e9845154ae02ecc5f3b85b5dcb612455b128b26c9fed38c1df7307d8ec1c0a68785aca3e09b74cdea9dfec3ed29654e0091d59c1204ce0f7c4ecd06d0dc22461c22332ec984262317239a55ba879e08d8903fb5ddf9bf4a1a342abe653da4b6fc4009691fcd73db80ad705292deb492c8704b2aaf002530712fa18ccf6f68122b53f0c3f88ed8a0e43891d759f5db41c3edc9c01d1748ea606fece0e6573c53ff944b42e2f6c08711e02a86b1598d049b3143f27b694f5206043ec7d5d8fb52a435c0b0acca2e9a62c97ff91e84aabb95454e714e084fec3e82bf45c9e73b20e80031edebf4e250fd6b03660a20255081580dca8c5bcc9cf6933b1d330d8ea78bd7e037ce53844f0ee04423685ae0a48f3eca9d02cb31100b96be1337d4f9dabc87b8e7e43a6241a6126d440f6e82a2fa3b8ec1b0037e68b3024cca196139cc2ffe46f40ace1cd5aab0edfd3ad42782c1b3f0ea41e397bba0cdd5c0614a5ad38ff07dccf9f840b5ba02718860a7c3fde6f8fc863ca61179d8807252d21389c36fb6836170b45074d75\", \"677d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa5ea7fd6123a97de30c69bfce8661bc08bde914a895a50530d51ffe984d9d20eafa195b9f6f39c732eb35859a6bf094cf148e251ed4d8a79570f47a225cba2c42\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902b09c19c120598fa6c16873b605bbc903fbc233477afea8d060cfd083527784a21e1355b343e76d8347c8ec4fe11941903c25590143fce536fd8770a8868b901571063e052c01468e7be77a7f72dd1bd17bcf2e2130e17a863594b707d01b8ff5319c745beb38917f3916eeb2c6b767779e4a3fa4eefd15185a62c520e20addb8039acacdbbd33ecbce7a78cf05116430dfea335414f6252403261cb0f6e9be0ca0862333b99c6aa6b21257a1a3816b07b8f1a0c557ef566ffffc501d45c8529074a278c6ecb897292a8e15b899eff316118d555102de9eb45b3047d89c12c002fd914f94812a6f9b374886b0de496067999cffec4bec1cd4a1a262edfe01d86b31d28742be89827594eb23fa98303c4a70e1bccad0380ad1ac0947660194e8b097f1b71d12285b720f5651dc9a47244c432611d4a12e84e98d550ecde8ebb5c05b0fc8dcb5c62dc22703c5dc86d3bc13ab63510feabc203ab6357548aedfecc8457ed74d2452f5a85e65681b01cc81885b5d3112f593475bfd4a83fb7c2cc672c96d6cab7a943d9756ee14be43537854dd72b61975eb9b6e1ae33048e9b1426a8713495865be752b216f5e50e33a1b53938e6ca5383f053eee821dd99dc9f66517e97ce5b7f3deffb4b936b3e5edbbb9a975ba87b54186b6b2ba0334fc591d728db44c4fb554feb0235473fccf58a9ba74e2f1cae5a1b4e10cd94fd42e0b8f5698b014a0d71764779075\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367495a4f76ff6a015f29b6766f26d7385468d8511cf5f36a8072dab9eb3448108da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e577a14a6eded01e2af38af60eef18c742302cceec7e721187e3fa159b8f76816fa195b9f6f39c732eb35859a6bf094cf148e251ed4d8a79570f47a225cba2c42\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f1b42b68e02cd3503158c2cedbad9f43b4a782fc",
    "content": "{\"tx\": \"edcfcdd702d9befb1e9c529d7d9073823d42f590d5d83a9ae9e8205a58b2deac400aa179de0000000000aed2b9bbd9befb1e9c529d7d9073823d42f590d5d83a9ae9e8205a58b2deac400aa179de0100000000c9ef9ecf037bb08b0f2100000017a91417076ced824a76f7f00aa0b9ce412f8713d9a8a68758020000000000001976a914798a0f34de6d8f95c4b7ca7c79a0cd208c63fb0888ac580200000000000017a9146e2b0fcc2c4086d85becf46dae6d7af8c0bb07518738d6ea54\", \"prevouts\": [\"d453c1ad13000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"8032cc610d000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/keypath_invalidsig\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"faaf5f50af119edd122012c71f8cfae4ac508d740074eb7b756a30677ff9a98956fe107f93c3ead41c0d3254684125c1d48ec3a75f9c689a5ca6108cc2c81248\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f1b9e75c583d069af4d354379ec7cbf02e95c41d",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb401000000f091c7dadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf100000000be70b49003eef1a400000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6a491a81e\", \"prevouts\": [\"c76f8000000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\", \"24862600000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c44eecd9b500a2ebbf47c734afa5de1aa2fa12782431ef0dab5671510d72378f98751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d53d2e072fd8e8376d3a54b2bea1bfbfff1298aece70c0bc2934c8eaacc3044fe58f009f53a1a3347386cf74e6ce512c14e8f46a54e4d2c64fe3ab77cfdd670d0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dff5ed59a308aa7ea3a47918565838a3baa1b60a9bafa1ab86863a2da11a4fa3d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51b15c6036a676a492a4bf737064ce6a21b64de8ad159d3b2e60d879468caf8957d0cdffd10ffbed86c0e7536425f8f402fac685ef3be7cf3af5c775f2718b4072\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f1cfa6ecbcc68ba081804e6b531a970f6cc70cee",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdb010000008dcc48a960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127083010000000035858903fdee6a0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ace2000000\", \"prevouts\": [\"a4ea5a0000000000225120defe27edd45ad927249675e5a926c89be2f3fb0cb8fc1f86ac9fffcfc79b097b\", \"05d9120000000000225120192ca6362cd6392703ab2318f0102b3cf7536ede6d4ff88793ef5f7d5ef4db5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"837d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936544a2a42c76e0ee837b7a685e04a782eea16b775b2dde41c180c8b9d92cadb62fcc3b58fc7cb9ae8c07f6b17b965d49129a74935af1e9f3c9d7206d9e0977573ff15e37d03bf407745d47da370f693bba1bd1439d95d9059575aa23ebc3ce6e3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360a4c4e25d839cf1716ff290d0725037bfab2e64d2c89faf706269300ac3ba5676193e4630789cbfbdcb7d6fc995ac4f032c6d5611c1f6b733abe8356e59ddce06294a5d2648496e5016f850eddfdf01467fe69221e8567db6ec356a8117d8a748163db171dbfcbf374971659a5a65d0378eae0ee15db360ca8cf80a8c2e13046\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f1d42d84bf3c0ea75c9ac6babfdb06afac572bfa",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6601000000e283ae2e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46f0000000047eb5b7102ce5f95000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787a9020000\", \"prevouts\": [\"5f6c5f0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a\", \"3359380000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"5e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08259bd71c400ab2f54869740392a5675e37e70879689c9d1a6bcb33863a193d8cf0c8cbc16505271ed8ce1a03d67d2c4a35529bcf4a25ace24696315022c27c9cf\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93601f485ab8dab36fc4237cf32204629d23ab8b7a9b8c57b9fb58bb07cc298c65859bd71c400ab2f54869740392a5675e37e70879689c9d1a6bcb33863a193d8cf0c8cbc16505271ed8ce1a03d67d2c4a35529bcf4a25ace24696315022c27c9cf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f1e479e1e2ba063168c4201bc568c60b601c98f8",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb30000000093a746acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cec010000007ed5e8d5021f6fb300000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acd239a551\", \"prevouts\": [\"0e86640000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"519f5000000000002251201eee2c640bfce5c51bb2c40da2e9766a04a76652bb29070203cf3219889f560d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_4e\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ebf58d73905fd7c2486efdfe028c446f051d8c8344f53b98e47411fe4d8b323585e3fc4b1f1daa84623695fbe505683961d9f0859b62ede344294bf63b39c73501\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"505564d18087b19bb65ff6a3b77d92c091f8e4c7a6c391db38a1a7b980674a4c43d31271578d327f1ee780db8b1df1b68d14e3e0e883b5b36403a06d68cec68f4e\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f20f49c8c8a09c2b68a66d3640886588c1e95299",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4901000000213507c5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5300000000f92f4bb6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf150100000091782beb0145d3670000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcc4eafb2e\", \"prevouts\": [\"6e315000000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\", \"96f25c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"60086b0000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fced35b867b7996fb51563de4ed354837a83892ec30e3bf6ca580b2c02aa0f9ad300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5174048a48c6eb42f280da39a6557d46ee4318cb4e3319043ed115bdbceba7fd7e7407b97958d18eaa787c1cc29670cd8872e7fe2ef4ae33551cfe5c61fc2827ee\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb445a42fba29499bdd7f6ed301115275954ea9ec94acc2dc80e39b9e79b601e9aa172fc08f39dec38a16acdaea6f2fb40d915f4bcb39aadc0ac96def6ea8d2de907407b97958d18eaa787c1cc29670cd8872e7fe2ef4ae33551cfe5c61fc2827ee\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f281cfc9b564fceae1f18905886e1a2ea6a79f8f",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc7000000009095a1b0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb701000000a352ab8601a88993000000000017a914719f78084af863e000acd618ba76df97972236898739000000\", \"prevouts\": [\"dade750000000000225120d7a74e7d66477e5ce18f223a8c348977bbded01f23ea87f4513721d36eca07d5\", \"ccbd280000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_mis_3\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f0e4b330642ae27577f78ac81fd5af3c439a3cd130a668505cbc284e002db55d4da4533c1ef02836b6accdf97a78c84bf65b784119ea6e705ebdea90575341c1\", \"50ba592f23777ae38b527d1e68f48fbbd0597a4bd3512c0706cff7137b704520a6799688434c19b8a47faaa5b17c6887b3157b870a3c23288c8a8cbd09633106ac0a4ae8a59b92dbe9d5adb32aa66a90d0824a54e23936f4e8bd046cfff1c8d9b63774d6b0dbb485da602a7c96289a9aa07eb2248cb17ca8ad8af3b55c8b090e3abfda0e50755f980c8633d6044045c642c48ac87067\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"776496b4f911f0697c460a01114e787f95fa7995f3b25255b937eab94f94397af2331eedeafce921e85ecfbff874f661187be0e9047de2a7ff06a7cb5ccd858d03\", \"508faf687e692be87644ca550eea652b1cd464122e1abd934e57354f21c84900652a187b4e9c5101ac2b49fcc7165c6a850bab92ea2123c52f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f29cde4e4d18f502a83e953d7e6aafc162b49fb0",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf05010000006c94ab778bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40c01000000a9aa24900176de0a000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a603010000\", \"prevouts\": [\"46617a00000000002257202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"f7ef3b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"80a38889277e6769c53ac3422cd17a5b04684959263ae1d4267f5e5d3300267c24c4f79d99ced191a71b09d34b0c3e867be45d2aac0ab8bf37496c932ecd79a6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f2a7b6785e4184b100bb118d537c3e1fe7deed13",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3001000000a624d4cc60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700802000000f83632e9019e1b0000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac56000000\", \"prevouts\": [\"d9161f000000000017a914e18c03fb168c1c1b3408ffb477de8ff77b0fbd9587\", \"c0db110000000000225120d6bee23394c39d6e16307905ff4e75971d1217bbe5d499666628583fea75678b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"eb7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9facd47700b8e47119238508fabe2c12c2c2868bd36dd1a15df7cf7a783bdc7d4f633479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4a9e937f21fcad1bfe108fe60be9a324a720a35d98355df5fe53ca48d5593a6c6b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e87d8de85c21b0b3fb0a3c0b5a47bf8fb76656439613f0da43488fdbdb40ca82a29e937f21fcad1bfe108fe60be9a324a720a35d98355df5fe53ca48d5593a6c6b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f2aed5fc63d1322cbfa59dc10fc63c5c13905bad",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf57000000008fef5e0960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a200000000630d7c750370197c00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac27da9e2b\", \"prevouts\": [\"6d146f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"35ba0f0000000000225120d1600e1e076c2da8b455f76340d5258bf45fecd0d78155a447a8b04344f8ccd4\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"1f7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362175f5032bb3b53c0a968ee3a2c82bc18dba93c9ba8710418637c72c2d6d5ab6ec0d930d2ad3e784600f5ffd1efb1e58c37063febb6da2a9c1576d111e3c4564ed661e9ebd30f651fa020177c2a1e4ce51b505c9194e43d6074b392863f250ba\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93675adb4fc0189a1382c89853bdffb590e4ee25bdb1025c4992edc4ac6fabdde4de576fdfccd5cb93347e3ba64a7809a8c9fb7be90a7e18659d0b981582f285e98b3e02c0e1665e1d6a4b6ef98a6ef3a3632c98688db315e4c8eb8907479035d72\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f2b01b12b747c63ff84c1d178f5cd881a09d61d3",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c440010000008819fbb38bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49f0000000080656b9904c66868000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787c7030000\", \"prevouts\": [\"455135000000000022512089bb171a5e185cc37daf7aa0871afa228227b6abbb83e8d3d329212a244ac814\", \"ebad34000000000017a914694a086836eef6461dc1e0510e2b2815c3da1cfc87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3044022076992d247ec2845d6864017ba617cc710fc6679143851d0990e851e5664b4b2e02206891148f8525123ea53574236cee83e0217b36ab019de5e769bf5762bfa3750d59\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"2200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"witness\": [\"3044022011c58ae31ff86478b242a709804f9c191da3cbfea8bdb58ce304a7d1fa32e15a02204220241dfe89c77fc08276827c3058791d477a294052753eca89c85dd52315b959\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f2cf8fc04a84276827038c4814930bd1166dcb83",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b990000000015e6e6d3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b3c010000008991028ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6901000000414a92e6031b996c00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acd3000000\", \"prevouts\": [\"7bf1270000000000225f202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"1007280000000000225120e98e4d1ca072b074e8ce62a41eedb6ab06e3f93fe902ed968335e3f5f426ca3f\", \"867e1e0000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c3b743ad825b1ae728c2f1c4137682b4ff02b835bd4b7bdf42f6a798d36a71e5e07722f249c0241e62b789dc176f0288271b45f4ccd4acdaa89657f699a53419bb2c6df938780c1f04978657653ddf137825e301d5ad50b36cb6f0a81405322e76416e01666bc6a1cb261cc0f123e7cf1652eed5d0f4713fc4210a5fc106d9df48d1aa407ee6564ea9d7edd28cb03ea10a89783e3972a7a703c5db2d515a94a2c57e7a755ef6c5ee042c62c2ee9d3f95cfe637bc3bbd29cde92d9958e55e52eff742e84cd9569e3d058675330401d7e03f9a30beb48f7d18589efb1267ae02423a14bbc0859df1c4eb4214bf21f29fce6f28947f87ff5869fecb53761b28a0d9fc395e67c3f8a865060e8df463663f85313761b966e552649a58b67650680fd26d18521162978ca6a42352fc4c60be370cba6f839b9559a1f54749486dfe8cf879826e7e940ac8d38f1c03a7a51b367cfd5a30c19cc70bb14d708cbb61657315cb05f1761d152f0da2c8d28fff5a0d5542984b435732a0cd871130fe7b7037fbbd85e0251713ba6d64abe1a42172029d1099286934a1c8b2328f8c36661cca3b3675678cbaa07b7e0c6ab62e44b5a2d7d41234a7b48922d1ae08aa70af4724990ef11b8863c789a93405a13eff7d71edc6e7433414b334bd6f429140ec874fd3388662c7c600ee132004d4a4b8bbe3b575621ca1685dd5120bcd57cb82c268fb53cd69baeca84858b375e4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c351b40ac58314f065731b2e6ee4d3aaca3c0737d7eed49c686f1ff66e68fcdfd81cc5051f53cb756176679d36bd97691fe000700c9f2a0965e3d67cfda5d0f8a81c44a09079faa406e9dfe20ff322801dbd7fb1c55ee11d2e1c43aeb4d3cbdeaf2eb908b8657464a6ead7ee639edc82f346aa77dfb25920bb6227c2c4c35ffd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902bbc440d2c38048705b4157974c62c15679a2d924264f492f46fa562482574a88cd00fdb624964f032c7b891e760c6d561f4fb5115d63cf68d5cc64834e6e95649d90261a49ca9e34c9f9fc5b4d94e0761e2aae1ca65a116d00fc6202409f7b8e50a1ac3b7bb5a9b561b67d2cb37ca8371742007fb35074f136f18ef7fb3184831a254e3559b30df279d05c62b10a8e305210ec8bb8450f7cd9e9934f073e292470c91489d092c498adaadcca91ac797a0949065a4b491850122a56f254e741eda4c5e100f9573b7faae4da8826fbca2ad48120b0b8ddae58d4073790bc531675f6c5a1789407fac5677713747497835d4a523d66f930c1935046181fd99888952a2d07578ef8966661c941e2a415a6a3802ed20d791cb1e11b826641f2df11ec8d1457727a53377917f776f8fae2cc0fbddd2e2de9b29f13ac9d3cdfd2c24aaf160c6c3896d53af08c635499112d34b885e20d514190369f7716d063a8f4d2a2907c359cd9ba109b290329cf5694fb516d5a8ed08d477bd92047e270a84a8ff082a1538347cf09597de5cc3fc2ce73f33600c144254dc9787b14c650bae33b42b4c10a6d341bcb030ed24206a202867f9c38454e5514652b7c98eb9b3d5d6eb897dd0c522f3c52f11ae4e3c30a435de093f55390906d6be5fbcb7bf82898fb96ff4e03a14cf02f3ef4d514efe35f3394539f400d8a34e072457948a5fb98a70fa63d288c0987e8b2f37561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d007d93a2f34e060d7cc5cd39744499027b300a1a6c5700c758a8bb24cd5be060d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3e0b789927f620aeddbf74aea18c74264c468c5fe823a741d176e0a42636f367e46ec42a0fc3b2b57c90387175ef14e4ddb9fbb252ed168d3260bd00914c11302\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f306f010650c1ce3662a988f2d5c8848a114b742",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4210000000088e395bbdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9e00000000065185d6011fae600000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc33040000\", \"prevouts\": [\"64d14100000000002251200aab5f0acbd570bedd550e6582d56f36bedceed0a29e5b4b9333b469d2c71737\", \"cfe726000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93680a36c50f8ef6c287427466622598093ce8ce9053bc22d3973767b96e5c582b7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aad616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f311f3194f27d91bd26c7ac20214d331ade7f1c9",
    "content": "{\"tx\": \"1b2bfb8902dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b780100000008eb22ab8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42600000000c4deaba3015955540000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc74506636\", \"prevouts\": [\"1b791f00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"c7163f0000000000225120de1091fc927c36de35363d478bd0613872bc5b94677334ee7c316f685fdd8d93\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"de7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936337de194323cc2d0e259e7f698dbd99f7b4adcc7bc7010d92bfb10064ddb4e563f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08267bf5ee6e785c98394c7354db9cd2cb879e9766d4c80c1499d7b3e856282bd13a05e4a06b32de803bd9a925f4d86502b21cf2d106a73f15ada31e997750cbc80\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93639134f96039a0fa33d353d3657d4f6c27571ed27c9ba3a414c0fc3979439528967bf5ee6e785c98394c7354db9cd2cb879e9766d4c80c1499d7b3e856282bd13a05e4a06b32de803bd9a925f4d86502b21cf2d106a73f15ada31e997750cbc80\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f32541dee791305368453ac147924b5c2d9dfff7",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8900000000e8a3feaa60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707c01000000afd25c9604adb63500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc65ed682f\", \"prevouts\": [\"d10f290000000000225120d1b58e92ff256598ad684e4e35c535f024a8511a42153841768436269707b6d1\", \"52ec0e0000000000225120a04971ad2b8c16a17e70d417eb355b323e82da2726ed216775e912c08433fa96\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ea0e094034c5e6eb4c6031e9df0a3edf88d2031e7902cc2f751a948274f36cecb8308c36425a65e399229ca8616da8fc9a443a32cb426295828f29981941139df2d2045ea5a8332f99b43418ddeba4420c79fec9082d78325dc460cf6bf74caeb74bc07096985326770db739522f0f7e471d78d2edafcda7884589c570b574a8773120b4ebacbe20a5243295993a277823b0e2b996bbe943ac58a28ddd87e91eea56181dc3f34c5e44ee8c1e3e7bc1b2154967aa7e71fc8810b0e8855033999719c3238bdf5df21520d2eb31fd017829f95513941eb5983c8d9aebe44fefeac6b4a8c7e6ada0f18e71e76c02bf5a9889578ebca7b9a1c61568d1bfaab17bb9c4021fdbaaf5182fc271caa1dce8b8d9150067bc37e0023b3ac8d9403fc4f799830793c87604f69b0310f15020aeea5d6978128e84a08025566e793c7e394f43e4bd0fb1a6a7b107624e789c0bd509bb82de81cb13914cb6619e5da1f2cf9959e151bffcfffb6383b61888cf82e452e702b60d56fe2e36cdab57ad4faeae787bed212c425c8c19da4c89cb6806fdd78c26f28f9286bc2c6503b8bb4e694dba4c9d714859521409dc972b1e8f1eb75234a311d0ab775fcfbcf6ebfeda0238f5aa36e864ff4057bebe3aa5acba8487fe5af4e02fe94824a7cfde225ec22e5c7622791eb6ce6f5534e8f13ffc1243ccf528e2abd2d2c6a14669f58a9ab3121fdc3a59c8475a231bda08e2b375cb\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f53ffac04ec4df156873ff2ce8c8da5c67fc975976d2a82eb9a66b7e9ed214d120e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e191fd70f8e44f42202023c580ea06f1578af3f03a2439147535e7b1f16736e0d18859d05a814eb862cab9a6acf3b7acf0881c47896b22b56466b77992f62c0511\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902fdb6b31fbf2ae8d66df0a611a81c789bea6696d01d691aa75aa7bc49217f89a97be1ff706ed8d47b85afd85daaa36c57ed1ffd25133aa10f3b13c1e9a92c95c7592a133d4660e49263b9913903b14537287f0a24d271d7ff58317cac16f46c1ea3e1d9dad0d8d33ad015df33f88f17664fd1557e66820ce5e6127ffeb4eb726715a876bfcc51a9f3f630ab567a41eeecdeb741820d54e43caaff93d8e931daf5857331dab922ba7262e31e0161f6783f2d29eb034deff5f510f5342b35cd40806b1ed465f7ac9c70377fc73e72ea99aa2479581f78174dba1b99dd17b299c723b59330c894f657c827f70c860ca17e9eec954a4984f1b47af2e3fc30aa34b523f8a92050bff7bc2af149480e368983c0d0c6c120400ef277603a1278eb4d70d3b6f270bd84825b50573217681b55c592348ff8ee587252bc0064b1c17c85732287e313f2dc8bf4c7a0460dd37bed0c2741aa921a5447aec3bdff57249408788dbd7b7740fa1d0edee98d7c6e6a8c569f8a16bc9081a79d3e88dbca03b6734f14429883fb7cca514419e5b59c7345de05291fee851f295d7f4cc86b7888bcf0f1cc4602d8c4d1aa8c67d743ad8f7c4b7e03ffdb3a1378ab17fdba3fc3658b885c3c7974f71e321daf7903a77ddb0446e293e8656e2c6762b694631fbb8f0ad04d0daf1907b41a6910322975bba188123c8afe21e03047617e66dd27050057e763f10a9baeebd2a8f4447561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936628965e7d974c507f702398db63655a3c25a623e9114254b8f562e8f543efbef70b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d865720d6d723e038e6335a667e0268d00f4826306437ee84552cc7f8172181160444ef73f74a88798a5fcf30fd7aa5fdae43144d667a238076c6d52287fea96c6e3fd1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f34aa9739565ceed4d2a67fa8e24e1cffda032d0",
    "content": "{\"tx\": \"64c16f4c0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700900000000414b74a060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700d010000005c64f2b20470e81c00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc733000000\", \"prevouts\": [\"d259100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"40f50e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_bc\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"86ebde0a97b9ac5e1fe581e0338422a4334a3070752cc547427cc67e4e79972fff8a03a01b4a85de9224f4748e7b54e0f702a8294ee5abc6607b9b43b1f58f7983\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"e5ce9a2a9092c727c83f017e2c3e1dff7e83820131d6451ba0643e6053c375a2e8b14c84ad5a4c0c475d87e8b2e739bc8c4788df6b419a169588acd93ede2fabbc\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f36797074db1a3316cf9f79b8cedbea196a94883",
    "content": "{\"tx\": \"15915fbf0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709900000000fb88b9dc8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c47d000000000fa7e7b903fc313e0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875b000000\", \"prevouts\": [\"55970f0000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\", \"ca62310000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"367d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fada435635f2cd61c9348f40975186bdc5a06175f59207abbbf8c9a9810dd12002cddd84017ed719a58f336e1892f80afe07727626533c4c78318e44c39862ffd3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936041f230424bb8fbea78efad3eb719ee17a28dae5a1a9e7f1b55ee9d01d28ee75da435635f2cd61c9348f40975186bdc5a06175f59207abbbf8c9a9810dd12002cddd84017ed719a58f336e1892f80afe07727626533c4c78318e44c39862ffd3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f3a1124f0e210f773fcb446a4c6325838f796dcd",
    "content": "{\"tx\": \"392083b603dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cf8010000000320c5cf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704701000000934072f4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8200000000df73f6d504ec96cd0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac1b08b24d\", \"prevouts\": [\"47805900000000002251204e3fb1c88f2893b13c1c33c3a0d0cd819c49ecb88ca3deab379ce318a8955811\", \"1ca9100000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\", \"e5a5650000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f086534a94238de44df238570c9dd488e8c889ed3d519b7674a8cabbf1761d91\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a39616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f3abe34a0b2b561230223ebd55fa58c1abfa4752",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127010000000008e090c5160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cd01000000885fa63502431e1c0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc8a000000\", \"prevouts\": [\"68d90f000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"d1220f0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"de3e6296b539c5d43ba746df546722bcd0ae6fccfcde1791b4b3090311d145d44ac71ae37af183ab8fd2d6761d9e3d5bc8ed3fd820decc07d60599c01c2b802002\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c575125c0cae9f87297938fc1b4f162ef980f5458ed9333981f99a837ff75ccc9d18428235c2c340127231dda31a63b3c2afb31c3e74f35a587b4a61a75f9b3002\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f3aefeaaf417737c9b08ddb588ac8f34f1bfd7c0",
    "content": "{\"tx\": \"50c82e5902dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc301000000530c23e0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9f000000006367e0c201cce1b500000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac97445a20\", \"prevouts\": [\"24234d0000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\", \"0cba7d0000000000225120f6ebc972e8b9359a70abca9662ec0add7397530b2d8a533f3315a928b489401f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c6c81c190d27154708867b1912e00600f5e2aadf6695da87d92506f791f2d50df22c4110e6f50963c8aaa07a8b1f6f13e31272f737c2dfb86420c921d4e106300d97b6ff006e3f5381fdb806908db2ebd1b4b055814b5f6e3372c3a9f0b8cfe635cea4cf0a31bc6f7ac16acd7ee0f0302971cafba8d2c6a48e0464885538c1c0c3d683c1ce4c94f537c2363b8741da793676dc3541b9abed643ad3a672863582f11c70d48e4f983430d408a512c721a4b93565376c17081c7ea39f5552ac86cedaa18e9297a50c1293d88d3c2ef915a0878b49d3f9663131efb13f33d1129c69091231d141773654db9aecc95aa46518b68249cf219027c5349187b69eba6ae606a154410595b157aa9afa9156992e0ab68cd28e9932d008624d4ef659e4268c0555a1bdc833de6768e4d9fb6e8afb4a60cfeb1da2cc6bd6809e6bc3f0cbef415838f69920a477c892259d2e14678f90ac6ffac284d327289b987a37b66bd8972554cc997a4e0f9a0221ac727e9c76680f7017bec4cff5049e5778cfd8b66ae358282f9a20befa9a5e4ace98e9d8ccdc81dcfe0348e1c25871dcdaecadace9f4a784ede73e9c2727b5f7d13bcc25777be6ab788902a4b9e49f3f48aea1f034b8cf9cc99a8049058a0de716bdece82da3a6993b47ec85e767ea80352d1c5ff85d6ec7399108dc2dc273c66b798baf8f99516766ce211f35441300e2958e21c4b422c3d548014fe362ac7581\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a7634d18480d5775104fe67110de7da21df5ac87ea179725883df64beed806701d1058d265ad692c8fd0f688dbf18dd54d1f122592f426fec87ed7f5bf39e232f98bea6a80fea94b985145b0732d825e6fbd27add9cac654f3749fb201eaf5c0cdb938e1cb9dba9647cc0512f82c526c8f6107930613b31200f04f80acff8889\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090294888dc88238cf98041df8e3c1996005b78c0b1d0c47fadc0f0f9de29a1c58e5e1bf5d39bf5725da985df4565f9f7026bb0159ab38f5ff35371d7f3a0f39b5cd007ec86fd1711c9bc5ef8c3bf2b3913040a26ad3cb052a24ce7b496e6fea088ff23d86a2034095dab89d05399ec4d56f571d5e65648582695ee886e0de19fe51506815439cdb59b15b5dbfceff5b4c19d3a89ad971ef66685e79c82383d9440beffedb6dad95bbeea48565f39d5bc1a224ef530cf107d16ad69b0b700747cecf894543b1cfa1dc7bc939c7dd77ed6dc28967516eb34b32832a7cacab62b6f51211e7dad67a89899d6388257974e78134bc0c80e9ab302e5f4b22b2c55e489e02ac92617df9cf87d370a76d3d0a96dc3c9b1e84c65eef346404bacfd7f261443402facbee94c673bd20e4a28369ef37ee0bd5223a070fd1b87475592947a820873887b3878aecbea17b3277d8782a78620e354f8888d1042269422fc93f13960ddc7662550d2b770e3a8c230cc1cd03080423df1bd37646adb5cc5918f28e0cb7bd3b181d38f396bf628136e599d850472d7d8bfa5f848ea42bb3f9733fd7bdb0bce88979f136d60f05b8cd333f91987b83d262e7f1011f228dbe7bdc40f81b5ccb76c8a9e8425ace8a71ffe51812abf9bf00ae5b4f289f1b369fe442d449a41f1f7519be519efbdd2c03f7abaf4785dfc0f1dc74f79192cc1883a35f9c2bf037bd681f3154a7b418db7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361f65007fd58bd495e8e57cff0dbbf5483e3aa8e1943b9d4f8d3979ba8fb1336b1d1058d265ad692c8fd0f688dbf18dd54d1f122592f426fec87ed7f5bf39e232f98bea6a80fea94b985145b0732d825e6fbd27add9cac654f3749fb201eaf5c0cdb938e1cb9dba9647cc0512f82c526c8f6107930613b31200f04f80acff8889\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f3b9a054bd33583afbecffad0407dcd117b60cb8",
    "content": "{\"tx\": \"a117860f03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc701000000bdcfc3bfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5600000000a3e6ebc160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e2000000008a5cc9e102a66ab2000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7d1010000\", \"prevouts\": [\"8417810000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1a8a2400000000002251200653636fe1575a3601b4d73c1ea9151f68d884d4a6f1db0400b56f492c494afc\", \"27c20e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"317d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936def5188e99593db0c47de29d7d0d72f3d5f471d35a035eb3d04eaa88af1d74c23f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08228c5b97b98364e562d83f29d0f7226f72eeb298058e828607471d679ccabea05a4517c545b323e839a783e2c84e61e1f1046ec65ac2c085bba4fcd3b8ecf0c89\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362f419aa769806fe430d3ce09ee6cb2fadfcf1c0d8c9e17198fe43e74e8367efd14e57181048ac96cb53327a8f686080e72dc312071604fe817a5f66426afc20b12f65ebf74c8b951b09da599ea3d6f486010b8cccb0a2142ec39aae62c1ca3e7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f3c37d9c9bc7bbacd5acc05ecfa2dd6b3e4079be",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf301000000f07fa784bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa100000000b808a1ce027a278e0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88aca0020000\", \"prevouts\": [\"830c27000000000022512019e1bca5d0c34a5bdc7dee301e7e444158f02d22ac120f0d8dd3e9f4121adc33\", \"027e690000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_eb\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"685ef156cf62d73f7cdfa2aaa38d597851af2e5a1174e6ba21f74069c7a7f652bf2a89669337c2df5864303f99ab421b6db4a112c06a3c780a0134634e047c7d82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f95025e4e7746f2556748bfd41186c9f0acef9c795b926a51868bef67c11f8e5d7352ae4b83789271bd1a422e300028aefbf519b2f5ff63164e56ca26d145bb6eb\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f3dbd1cd81a692630c41a036e51a108069161d76",
    "content": "{\"tx\": \"56b4ad660260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708400000000a354aaeb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c6010000007d9bcf8c03f5b61c000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e746000000\", \"prevouts\": [\"81920e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"74e50f000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/purepk\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"4f07e41f1e1869cb4e84b4b46e6b2becec9328e827c5508bd00b3ee6afaed6458a6cffa6a91593edf6921924e6549ffb69761dbc1575f6dcad78da8214ef9f40\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"35a0b0e7fea0af4106791c6c8dc56cfee58a4fdd22f6710db193fef66db2972674f7aa041d4a50f478797756b9fe2bc180bf8f925d0aa702788f4067e8fb3507\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f41b245dc4b63227dcd52bf8df204c69ef2c632d",
    "content": "{\"tx\": \"927a8af202dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0902000000a680769e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c499000000003a7254960188a41e000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47871c050000\", \"prevouts\": [\"48375e00000000002251207492be7c38200a6f417f2df61c3857d7747fae6fd7807509c1951e5f14ba63da\", \"babb340000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"d0\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364c3da4617f1ee0f61cdd6b0c3800e0774a5e631cb6cd048785fdfa88f1b1ef57f81a0ae7b640e88bbe84e7c412f47337f1d12d37f95b062c539998fd28213cbdf3b3fb8d5121830dc5ea13d084a01bce62f4c2426ea7fcb92dda33a6ec3d9661\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ef4a0b996a651997ca76f2d80ba069e4ceeac28cbc038cb062656a276693f78c3bd101e45a609d3b8e0b3b6f0b7594624f7e9102ef5d5dd3027418de40ebb2180d690b53af7dfcad925f9834a18ad2ddc318ee8f8616a880729dbc2fd60dfccd\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f43a467e1ed501e4fae97b23c7ac5f51943b4a60",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb401000000f091c7dadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf100000000be70b49003eef1a400000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6a491a81e\", \"prevouts\": [\"c76f8000000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\", \"24862600000000002251208ba879939f2c6ad8b8ece6e7af2596449dcd53da6e9921656ed46c920282904d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902f76e832bccd01ebee3e3deb319aba4ff88054cd436a3bba64686bca9e093f588d862b5a59fc063cab1b3a383af372fa19a411d4a5078bf9ebfbaacec0e3152375cd0faa3c105b50cad764301ace5ba285e9bc80b2e66e84300c5aaf77cc1ac70ded079305b3fcb0016b0f642d20c98b6ba892f1e1f79353e013e926aee39f8278c92da8d29ca778b6c89558cd24b534ff2fc7d974c0b341a7bd2810d8aafe0940a9471b29f75ceb48659c5ac1d73ac8286841c09f8d5271aca3e4904b74a3a9fd4cb1c8fcbb961be477a22608dcbe76b13e3793f1611dae000e0f7fee8935471de81e262cfafc30719059c00db405f8e5216878441d3174d59729ed35df6e898a144dccf8d3258d77591d29b059d2b887c048f566d56dd28069a5bd6157dc294f8e3d228965f08e199095cad2d3990971e68be174c76587c416e61c2738dac7dbc823ebcf6eff0c9dada42d91667c474e8d5309a8cd5b25aa0348a66dc9ba987827271e077d79f6e31d5e02ae05dbfb533a16545261c0aace40e640deda1a1907ea5504d9e40ea86ccba1d1f132c15cd9e9a55facf7bb9422a28697023ecb566ae706e4e98abe581460b4426c0e51d0b685ffd58f51747008b61a04111630d72a2e144d1752c0b0dc2f92af0a47f6da7ead72259364f7f5433040128816f9f6efe8dc0cd95976b7a0f9f11c090023cab8085a9715eb951c8ef41945a6f735ab7d4429f272d96ac8b1b75d2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f27a0285e06e4d6dd48a2aa2db1f8735e89b1fe8bbcf48293d2d44c61aedd6c7536798c57c197a746bb2ed7f28bea5bf32719d74447f5bf93d90a00b781807a2845c4b1f0ef9796b099f7837236ca3239de7da07050a4e4f568f49f6a65718f105f27aeb1527a9572d42a0ad2bcfbe2bc67b36cc3101a74fc3488cf03d6f1bd0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09025c60a37c5d0b8cdb3cd5ad1de44f9c13610bab8a2957eca32f397892def18c271db72dc7768c9e6badd7eeff51340c6159b1ae4098b01890d1e0eb43e810f73673788887f77c361956f69e57e7a1eed5c0d91f9cec1d6eb3ee17be0cb073d455aa700f15f970789270e4cb308357a4f37db3ee6123ceb7effed95788743cccd1ebb796f5af727cbaf45c256d029c769dba242207c78b822ef9ce7ef473f60f97a1aa71d1c49fc355a00fe2ca17ebcd085f1688eb94c28e219dcfac85a82e3a15c13fb67fd930b1efcbea5d61971c10e37cebb60fbc96ee4d71adaa9e127bd56ae60b93d2ed53df8df859c1d92f0750a38699aea78922e2e0ebeceb39cc68bdfe65ebddf4b0b3c9d79808c7c5bee00c6a5d248cf33cf46de648ef5f05f552292e10883855b292e8683bf850b1f7801f0f7ead5288670aa3868493b44c0762368e5678c8015697a1d26525586ef97ea1d42ae4055e13b6443d5b03b2d75aa13200f677bb63e48b6f76b36091e5475890f3139ab9210c4624a799c14861168ceeb3fc2a14844625c662dceb9219925c3a06c4d9c598c3fde4be3c14cf51c7180a353d50e84eabff5ab415ea7ee5c10e8e69a34573a019daf4e92524d172746f17dd6ea89ab06b56c35a8820d9cde59cb6c3f4e83e726013d05cb9e96846eb60ab1779db3f489eb46da2802680825c1e97157e6237cde850ed7950a3c2a6993dc4b7fe8cfe89205cb88fe57561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365b5b9e30f4b23104a86460dbf05c99022233dbfc847410bd2050778598c1a2352bdb5955fa247e32681f749888c9d4f86e5604dd03da59f821ad9d541fb8adcb845c4b1f0ef9796b099f7837236ca3239de7da07050a4e4f568f49f6a65718f105f27aeb1527a9572d42a0ad2bcfbe2bc67b36cc3101a74fc3488cf03d6f1bd0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f4466a6264c406cffaf61cd062c6954b8145b827",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c040000000044ed024cdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bef00000000056c24ad01f45650000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748779000000\", \"prevouts\": [\"6a234a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4a73280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_92\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"929ed163ff0f1968403a7b8395e155526bcc85f85a7f9dea235fecc15b898dff635386de83b54e1f267e640b3362afae10f7cd3cd3ea31890c3a653e49f5c71882\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5116b9156699710958f2f334ea1767e885d13a6e46bb2d6584166491503cbd57c4527619c26e46df6cdc7c97eaa9c6d6d2d0fae6b7ca1341a18815e7c94d88e292\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f45bfc326aa2978cf872bbd25ac92e74c51b222c",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706201000000f53fbee960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127004010000008b79075601f01c0f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac54000000\", \"prevouts\": [\"cf231300000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\", \"bfe7110000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"d07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e81c85c730685924be02f7d46bcb10c9c474c6189388cc381e7f7055dcad1cfa477e36b196311c1a9d305bc653889017f46f4c4934a1587d131a83127df4466fae\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b0d5e55afeda99172050d01357d6d8287f4824ba4286577d269d78bc9373ff36ef78ec8d95f7a630a87f4a69d09adcdf12479e6b3f8e7304927bbc129b24d5867420b3503815f4c7b180839898c4c4aff0ab6ef4d8b082708dba105a321f7428\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f4604f24ef1262cff35502c140d3a3ab09e62650",
    "content": "{\"tx\": \"cdcd5a9802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa500000000b8ae7dc6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bde000000003c6de5f402e5588f00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acc9000000\", \"prevouts\": [\"a5346f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e224230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_77\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8c0047ba119d7105191261fc39d1282732eee7d88f438175d67723eebfc51ab36ea0ab5cbf93e3b0a20db2f749e37a1c1ad944e447887aa161ea142c1497c81803\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f72adece7342a4fe15d2acd2a7203104f1aa7deef53061d3eae495a89b722824b8dedb456d14e95fe589fe4da91f6f3ec12b414c0650506d3292b419ac15a9db77\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f47e1dd86121d4d47b5e315b8bc8f941d5c890ba",
    "content": "{\"tx\": \"02000000038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b600000000e9c7f4e6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bcc00000000ae03d8a6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b63000000004e7e6ee9020bc17c00000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acc8010000\", \"prevouts\": [\"529f330000000000225120973a94e36a4a923b8d161b8fe153210f91b56b5e4fa7540d30da78859ffb8897\", \"1b20280000000000225120035d0d8894332b18eeb5087880b9b7fe7a878dc0e9a501d9b85908b60f4f194b\", \"d2c2230000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"4e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08230e8cb56a1cc46a8845ca28d4847c7375475f2f7976a44b43884e49f27807546ab153920b849b6028620ffd2b7e486a6f5e2411aa058dab621c72a45f67f5d8e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936323ef28f4e99bb17bfac2f1234bc4bec8e02dbcd7bd8742e9803ed76c3e6ec8530e8cb56a1cc46a8845ca28d4847c7375475f2f7976a44b43884e49f27807546ab153920b849b6028620ffd2b7e486a6f5e2411aa058dab621c72a45f67f5d8e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f49204f8e85d64be3490b7843476939194bca10c",
    "content": "{\"tx\": \"e40f700a02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5d01000000e6a4029260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912708d00000000b040e98602ca483700000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72b040000\", \"prevouts\": [\"7b45280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"2d0d120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"72d1d9985f2bb5f99db483d506f51dd7e1dd9b478d640f64ab7e50b4d632d63395182d40a5c1fdb413f6229fcf5b28aa09c465b3b0255fe1a7fe362a8f5e075901\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0e56dc3d5f52661da4eb15a7f497abb14e4a556b13019d3eeb299b53b3b04e35945df7b2a495fd6a25aca05cf77af2eaf385c06dba788bed111780c2e85709440c\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f4cc235e3a3e0f11b34f866c952d52ba470ce96c",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48e010000001eafe6a2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5900000000fd8a98450287b78a000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac6f000000\", \"prevouts\": [\"9605370000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"21fa55000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"a77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fada584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e389e677eaf5eeea89a70f01c0aa3bc14cf3320f4b6dd8cc61f33138af3398b5b11a008161139ac7a92b00665158d25501a881aeebdfdbf881ee45b85e0726c11\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363e9eb096ec4c0e60b6c49349abcbb61376af9764a0a95f04ae72fcd7b6082681146d6305f54208d13896b102f4aea30badeaee99896cb007ba6ff00553e24c3b2915fd873a4966f8e9b4a3b328eef3933245a1c852c287990317c3760d8289da96773453f0744a158be0509abdec64f05b1db7ccf03251d8359952271b442a24\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f4e60bca3a955a55d00e4186db841023ceef4e20",
    "content": "{\"tx\": \"a5ed58ed0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d00000000034e4feb1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0200000000551f05a603895f38000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac388b6049\", \"prevouts\": [\"0a9b11000000000017a914124ce61ffefcd78a2e382c17cb257bb0bdd741e387\", \"7181280000000000225120bb7ba78fb938249831f92608d0f71e24d86e7660c51dd93d52c4bb7a103fd2d9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"473044022077abc4cc6b7cd5d91ef1175435e1083fd35d2b7681733ffe6a07b7e80a90f19d02205ca8f3d8a33ee788395ad27c52bef0c43d0e251f548f9ca3a7ce2976afe576da81232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100ab43b4ecd06deb2c157ca010f94c1b58a8909e5d7715a349f80a42d8015fab37022024dc6e2228d2b16af1111b94da45d43a8b82672c1557405441724d7b92e712ed81232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f50995c18b1bea7d6e8f78c8db8139687517a781",
    "content": "{\"tx\": \"143da98402dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b440000000025c5a983dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1f0000000038ac8a9d039d224200000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e764451426\", \"prevouts\": [\"d3781e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"694a250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_dc\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"29ea9629f262b3ba7fbe2f9ae3264dce36ab42ddfbf22e319e2abebd7ee781bce6078cb25373936251d6b339549f142453c46a29b6346c6f1a2c9a36d857856f82\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"796c8696d784442be86ab003b2b733669ece34a03828c19c9a994a9a2b0775e2fb3e9b528c99c92386ac583edd69176dd3993c6d52b5a7ec33d90393d4200c09dc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f50bbc9cda906042a1e0c756df37b20c36a36df6",
    "content": "{\"tx\": \"8afa4c8302bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1b020000003cfad686bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5401000000082929ed0293b5f3000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7ba010000\", \"prevouts\": [\"962f7b0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"51277a000000000022512066359af2a4c6a03e108cd4566fff7ab36618284805810b34acf3d4b4f5538ce7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_97\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"ca3f7f1c7693625df3183e3c6e056b4d9107ebfda286fa1c63bac9824200f327f1546e36c20e959d2c2075dac800413d5d66982bd496abfd0962d5223ec2451503\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"40086b6d183ac46211ee43153780b3bc677fddbe93aa07e7de7fcfb3811e130ef6041c90798758373405f1e89a4b819556afc76a305b8d17204c9755e38c6e9b97\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f54e6bed090f658f483733605be1def47c4a00f1",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c601000000236a23f860f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127010020000006b91e6da01a7a13100000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac3e000000\", \"prevouts\": [\"83e233000000000017a9149ae30fb20c1ccf139e5b5804cecde274bac08df787\", \"2cb5100000000000225120f52aac6d1851a3bcc3e02eab41e79301b2d0925e53812529fe85f9ade1401e4d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"9a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936385b7c6b5b390243aefe4c626f55742daed642572f577c299043227d557e4d8e703c0353c01e1109d81375c08919405978bc042794caf82a403da05ca89d0cdeef17902325999cb16876d9e124f321b7a2400c6233e0b61b95917979ea167214\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c31382c7cae07a09a83f26d089aa1893801559adf71a019d4b3fb52cf4a1693575ccfc706e32ae7f6b2a63f59d728082bfb2443bbee0d6dae87ff94b5ceebef57e56d08eecb8b548a03ce82dd22dc92a64f1be159e88ba8944ed4666490b777c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f5584e332423dfd006828addcbd73f040328b087",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c38010000002c06be89dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7a00000000a16685fd60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c7010000002dd89bb302d4447e000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4870e000000\", \"prevouts\": [\"c10b4a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0b942700000000004c635b2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ba5c87672102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac68\", \"29fb0e0000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ade\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361358df4a1c3a93eee872ed849c2733aa302b60a4d8b7bf0bf84905e283593e8220e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1aac1f02719ff09c82d93c60ae8b21e31f1ec3fca4030b09dbe2604c5a66091c209208a3d5cb0b20fec302022af702ea090b934668d0752a16a75cba2aae8c677\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08299aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb423dda11617dc042479e1d576056805c31872018ddbd603e5e1ceb926e90a3395bf82ba79f2fbafe67448595b33026800f76a879cdfc27419c1eb96837433fbad\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f558bde45b06e08703659c22eb17a9b25f4941d1",
    "content": "{\"tx\": \"fb4d73380260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700b020000008922b8d1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b10020000009e066ca8014bde00000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87e8020000\", \"prevouts\": [\"02ba0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5647260000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e14c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366ed0e779cc15e2a03d2e3d97c8cf6c7506658d81da92e90af03d7b12593133764b04f8f54a0a76ae0e4c7aeaaef28ce29fe1b2cd8b193a4d28e758ec231d2b883bd198ccbfa9c702c0592bb8c84a948c36ef9eddfd1aec8278a333dab45811656e171838972c3c3a6cdacf031a4825f83b841697bfdf19ec3d087e2c9ca65f0b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52e1\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367b8e2daca36c32f10b24a19a8031edd6fcfb8e5c5d75e4dfb877ce341a790b8466ee26669afb6dac63e75f53b4cae6cf36ae7535fe99100c6f349ffc46155d224f44ecb3bab6b962a7ffa14a2ce082ec551943f33ce508b63a8ee30ee5e49264\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f560ba3291103bb7f5cc015586c6946d5f9e8857",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7001000000a1395d8cbcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff900000000c2c480d30471ffe6000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e733000000\", \"prevouts\": [\"a365820000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e03f670000000000225120f6b24239f005e5ad8a4113ec06c48cda726a0e511c023e717379412f24fce34c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/branched_codesep/right\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"fced320f12908ab9299f9f2d8bfa76596ed6f1097c6f43f0f9410f41789b92c683585cf63979859ba714c37c2da2d50fb16e8f2f1d7652476d3d10dad6c5123e81\", \"\", \"4cfe26427fc7901b4262f3d916bc0dd8633c30e5af8ceea1dcacd253c102db78cd839b841955f61e94bf7285a2d0e43879ae3b488b8a01e39fb2cd2bafad8fa0106bbb3fade1a7f218e6696679e4d9a0064d7cfa56e38fbce9d589ae3f102c474c244515d6deda3c971875a105d875417da42bab76fa2a27b69ca61e195bbd59e9cd2768feb7ca6768e59331499fe3edd07b3541fad96c6dd5163816913f7c6f555b72f3810c341f5ef952f6cca9fcec7a4eedbd279af7c38d57c9fb075a83b87ca30e3f546f1d56461fddbec204d0d88a9eacf4b14d4a45fdd445f343e09b7eafa0d24b8c53bef7fbf18b28e1f65ddcba4f4f353831e32a3a7c6483034fcf747563ab207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667ab20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2068ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365cbbc2d3d740d8643b25368816a3e2bcc8f965749028964b311d1dfcdbc4a53b754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"50fb21868826d5606c3dff3f36b025df0d3b561df6b9510e73489d482c0e7e3480fb67be3ddd2170aa8bf5159c12d8adcedb8dc6e0f499e39970e07cd46507b0b4b7fdab416239c7a124007a3810e88f9e40ac0bde38d32ccf66c7ba92a36b1fa36bdcd7a0efa5552df0f7fa1ca6395d1c8c203acc31622ef1af08d70793cea67b57de206c1800c40f69e73a6fcc2b9e9e77ae6c92d0705fc01b388e7fd9d6b0084c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"643136c013061262ba2d0702ecf7902bf1e0d3372ac8ee76245fa0f56441b080abdf8d8ac7d8f6abf211c5528a5a74ec91f0e1ec983ff874f3b05c42046763b982\", \"\", \"4cfe26427fc7901b4262f3d916bc0dd8633c30e5af8ceea1dcacd253c102db78cd839b841955f61e94bf7285a2d0e43879ae3b488b8a01e39fb2cd2bafad8fa0106bbb3fade1a7f218e6696679e4d9a0064d7cfa56e38fbce9d589ae3f102c474c244515d6deda3c971875a105d875417da42bab76fa2a27b69ca61e195bbd59e9cd2768feb7ca6768e59331499fe3edd07b3541fad96c6dd5163816913f7c6f555b72f3810c341f5ef952f6cca9fcec7a4eedbd279af7c38d57c9fb075a83b87ca30e3f546f1d56461fddbec204d0d88a9eacf4b14d4a45fdd445f343e09b7eafa0d24b8c53bef7fbf18b28e1f65ddcba4f4f353831e32a3a7c6483034fcf747563ab207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93667ab20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2068ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365cbbc2d3d740d8643b25368816a3e2bcc8f965749028964b311d1dfcdbc4a53b754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\", \"509984bd2dd4b2f9e02fde492614c99ea2a4bb6004b5adffdd1b6296c65cf81752cf3a84e2201b04c0f30a1d57ca53e99e2d25c08d6a19ecbd287f2c867cac45f61ccf3d68064d77d68eebd6b306e37ad94d3941c9e2cab123206b274c3591255c7cbba61c6102bacbe52b4d2c14a88cd687ca07cf609da9fab9a2b9d5889a72de2db2c3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f58c6d8117f18e36e7e31efdf23c18aea2a31b7c",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc301000000859e9063bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfdc01000000d82019748bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c431000000003461614d047e0708010000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487e9103047\", \"prevouts\": [\"f007760000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\", \"93d9610000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\", \"f14b320000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"c2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368c95805bfbd60030f39f9e7ff54381e8f5f456ab69fdb578716fcf2f064cb19a3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08208660b63218e506e6f6271f897377780851eb071546e65f7287d9a4083d90048d0ff373d5c06b418f4c5ba421f2e23a69b22cb6c2b7cf326686bcbc29e387cfa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c599d2b9d61b74acf4ac0275e657007f4671c4b15d8de5ed816ccf5810b1da1108660b63218e506e6f6271f897377780851eb071546e65f7287d9a4083d90048d0ff373d5c06b418f4c5ba421f2e23a69b22cb6c2b7cf326686bcbc29e387cfa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f5a0c3cda376e7bd8f7a27caa053bef8617f451b",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b930100000044a29d078bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40600000000ce8be267bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffd000000004601938b033b82dc0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac33000000\", \"prevouts\": [\"0ba127000000000017a914e014b0ed75ce4306970c9f63e88b08a5a7bb4d0f87\", \"44813e0000000000225120bb7c940411adc6c3ebf9039e294ad28122b4469bbe77b36f9a131b3cbe33d3d3\", \"691a790000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"00639568\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e178d069a3e06f8a8ee706e51fefe68609e4a48214bf7e1dad1e46f763a0ae6da54d6fbd68a9aac62cc0fc4848936fa6d465cb32a19d5a751074f74d9c4f7fb368ab0b669047babd6208c97c1428e12fb9e633b2b0d2e51b7853d96a7caae1fe0d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366daa55a1279544c862a5cabf14f22e4ccb66433690cdbb1ccf1805df6ac4593ccf76285204aedeb2e654c32bdcb90a470f0de651bfbe7b8c0c018e8a9ed468384d6fbd68a9aac62cc0fc4848936fa6d465cb32a19d5a751074f74d9c4f7fb368ab0b669047babd6208c97c1428e12fb9e633b2b0d2e51b7853d96a7caae1fe0d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f5a0cbe081c8037a7f36d438e758b6bcd92abcbc",
    "content": "{\"tx\": \"0100000001dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bee01000000c25d89b703362d1d000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e72c000000\", \"prevouts\": [\"43c71f0000000000225120f52aac6d1851a3bcc3e02eab41e79301b2d0925e53812529fe85f9ade1401e4d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"9a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e75ccfc706e32ae7f6b2a63f59d728082bfb2443bbee0d6dae87ff94b5ceebef57e56d08eecb8b548a03ce82dd22dc92a64f1be159e88ba8944ed4666490b777c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e2d1c68c4ff0ed36e6c29e775aa83ecac22e61e24b7e7dc940647d04cc43fa53e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e874224dbe9932044562df2f9dbf2ed3a87afba7bd9cf6855f9f40e4c24add8036ef17902325999cb16876d9e124f321b7a2400c6233e0b61b95917979ea167214\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f5a7ff2dc8ee9ec1ef36b73c60de71d7978d3d27",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c900100000041cd9365dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb300000000928020b40148ac3f0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e734010000\", \"prevouts\": [\"e292480000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\", \"0e52270000000000215f1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"75cb4bd766694d40394530cd857fe437a01fcddde654f7ed68e78fb2bb074efe7598f030701efdb0578b746a828aaff9ace293ebfd9965fdf5c286a0e8d69774\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f5b5807a9afa7c7b8351abe9a32cdd85d696c15e",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270130000000018cebe6901988808000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787e4020000\", \"prevouts\": [\"3e88120000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d14c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4595f1c75585029ef5fafe40c7b455be7b6317879deb123e683907f6588babc52172c8da9bdd43b70cbab8912ef1aa7926e5ad7e47a4f7b71ac936200cc947dd0f9b27230787fc79bd718ce7ac07558dd4f31dfc3ae0570acbd1df01407b1d4ec\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52d1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1ba89d18ed67dd3d5d559101471702e4f2e7d1e8ead8a22feb9e78f041b8f409f5c55ad82284641cab824687b45d4293ada5fb8cbfc4ac19bcb5188e4cd0a7708cf37d2bf9ac9d65f4f9542d60f6497573c04b4d7313f44a5c611386102890a1c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f5bbca8f5a7339d3dab2b5f758f426cdb744dd6d",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707401000000447c0d19dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb600000000c89d618601bb761000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac83d9c85a\", \"prevouts\": [\"0d1d1200000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\", \"d74954000000000017a914e8fc5dd19b81880e9ce981652fdea2006e91539787\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090201320dfcc205589abb9f6d1a57ea01bb662c2450eb85a7615df7e46d79c034c81390b1a692e0be40b5ed8f87cb09bfd322c5d415dcfd20d67e6e24e85c379fd383df9a01b4945bcf926e1464f5d40d70091c578ce7a111aea7644d7489e063b0796cce981de5019cd46c2bf28aedb6ca56cf0656426750cc88dbb4ec973c717d7eb04c28067d76b57fb8ad39cb52e752e80ed439c15afce1cb9380d3e858e6fd9a37c8eae4a2424369b5b53a74cfa8ffa45303be336f6e2f57101f06f1c68c9a3638691d30fee30466e25a22ce8a240977e86bdcbd85ca4a57335d686f6a0abea53454ba3e2d13af98fa064474b73618284889a20de4fe70510eed63a005b0b56bda892d2a3a019b41fb1f8438b119bd7cd4a3ba77ba1e7bd453cb85d1dcf29f7df87ba958b6eb85815f380c84b19d58c3fde88f4903d0acf19e2de66b09446e69af0b63a311f76eba3519da9eb8dd74f5eb49052e45c00be607bb37fd24521f2eb2bbaeb4ae794bad806bc0f0cca8efe373f4d53f46dad7054887dc3beef2b5c8e1e8715d0884b3d5c53fa4cab69184fbb1c9f563b92ab464f48ad02932354879999744cf7d00e038a5c66f3ad98e313a41b22dc8c41158bef1cd2b045c5a529eededb14c58f901e95a8829bda9f0564bb3b380258c2ef91545c757c136da2f098b1f3ffed1196b7f3404a580d0c5912f343d1f347f63125c7dd49085a474306af4db2d41f5d1afb675\", \"ae7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f6d622f24f94d4576586c4a0fe62a71171bea4f7ff6dcd9fa1e4ca2ca2c05ce8fc0ca702511f3076acdc40632b43a1d65714ee25a695072e4ff6818d06cb6b94619c7e3fc3d0f43b284295c7c76b7ff66dfc7bbdbc495ce3e8e20608c97360e5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902c6f3caedb81d6e4e6de66fef39f8fdf17a7cb6326257543aebe4600fb427dba52b7aaf6b23ede70ab98138207619c300545b230d8ab39521b0e41d2de5e7d1d0435ee0c5ddd68640cf2e1ed7dea31c8094c2edff80abd4c89e603d10e18974d0f700afa060af487fcfb086e24dca317f7a85d3f3ffa809c51c0ac937717e401912737c4ad9a739aa1613e21c02e18dba0827f8014353c521674b92f97eaf32a27fcf815e9f16b449ef93e291673e64182e4273692bb3d54dafa52bd34f8109a09e30e4ae3b9e19b21ec368e85e9134767a16ac243baad9287a66c89d618818258c57eebceb06ca4b5e81d10a999042cee62a3af387fac7865cc1080e875f7ed8ae6f4d92c3f8805d3f84d47dbc6e1723c1967b8de0e78734eaa791d521b79af6fc3a9dbc8d5963a65a1fbc2d4499e0032c29d3ef9c42facf6aa0b0797faf809d663557150a67fad176e1bf24b5bdeca06c300901759cb05110df159b445ad95898ab5822b0c01dff435c2cf798514d5c4ab78dc8b8d6f2811066610febc2ca69c217cf412b20672b752ad2ce68b83fb22d6d57a8cbc1be110e8f67c2192db5943107a13dbc34b18faaf1374c0f6a3f34a65944b626a14867d07c8e4a53f27c855a175f616832c471aa2e6d8f5a603d6372f3893e31419d5f509d250ee300b93250597e3b156122ef9974790b4b4096cfb9c1727a1d32f119a4466887d01587afd2fdb4f84bb520d09f75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360ed42aa30ea97095c7220961c159553b9c090cc22c12fe1d4b83524e8c61dfa4c67b1d078674a4d97323398e107b13ccefe9299bb9116e21f935c64f37bba24f619c7e3fc3d0f43b284295c7c76b7ff66dfc7bbdbc495ce3e8e20608c97360e5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f5bcbe0530388a9d1b0ddeb9fd52bbf9553589c1",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4e000000008f41f4e3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b450000000076427492dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cff00000000c272c0da025f6a97000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acbf96ea1e\", \"prevouts\": [\"4be92800000000002251202cb475dcea7fe75e0d25a92a7081f6c5af7d6f4e70a5adbeeb9514e98fbe57b4\", \"7fc7250000000000225120b96a099e94d8f301268cd1fd84029824568c58021a9c30fb1dbdf65372024416\", \"79b64a00000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"8a4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369a508197ed6624452fb9289507f9cfe4408c1b7912a8bf4cd7fce31e05c3b62298751320860179e53b82a877a47edb7ce4c17ae8ab38dd25c39273bf19ccb7d56e427c91532996b84ed2c37f8a26be8637de11530a49bfc255181ba6103e3464915bb1b7e7b983dc2170cc97c5c6d5436afb034e74288517b9fa4d2c2ab63870\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c528a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367c1444e0411a2b4e4bcc0084c7f38996051d23c9299734e7bc32d46b93ec3b5d2430956d1468bedd56ced1f149c0a08e9d241f188aa41dfacb5e515f08af1f16915bb1b7e7b983dc2170cc97c5c6d5436afb034e74288517b9fa4d2c2ab63870\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f5d29c01f03e55e2269af62ed6364a98353003af",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912705800000000d62312c4dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1e01000000c89799be02be4f63000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca4226936\", \"prevouts\": [\"69e00e0000000000235d212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"ced55600000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"733a1760be1f718a81519e8b535437be910cf1951b19f7e07a21b5c046cea637584007bc94113149d72c0e4bfc05429159f5901dbe1d33e766cfe3842df2545b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f5d9f6f2aa6f7e44a24ecb63e2ccbe34ba6eecfe",
    "content": "{\"tx\": \"f558c58603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b980000000056c18ef4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2401000000aee696e48bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42a01000000869aac980117bc3d00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88acdb518220\", \"prevouts\": [\"e140210000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"49c88100000000002251203b5669f5562f5e3c9be85e1a1ee6c779850048d3bbc6506033f32dde6b1fbfbd\", \"8e2839000000000022512097c143d16968b3b30a5e5383953157c1c65b9df293dca96f701b7f6658094838\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09029fc7f00d6f5ac88be30ec4c385a505b2a7301f6047048d1db6e83a86f8ad594b02c2950f2324dc80bb1f5cfe36b65c4dd96949295f353677b3fd4ccfbcbd49fc5ea409dec0adb5b1088340b238dabf31d6a535749725b94917bb55153a9060165684d5361834e46e7af48a4a5ba92081655b25c9cd08993e79c82c6d4e3a546884ebbf9cc679a157d8e67a8be410668e4ec4ac5484058744a7c68288a223a340e4e7773e96af7624df3a0bed85031bf082d1d4177d89d9264709f05fe221321329c584e1e006f1ffa21d6c00aea2c62d32ce3c15b495c80561e57f72b476b71b9b606a086a5cfdc0b5b4216c198d5d28122a84a52b54985f2b5e539a18c272248f99861a5cbfe9947f631bd37597211f0443036f312d5cfe7fa63dedc66dbe06d9884978f392ee6437a220935d820be4078e6a323fa869e478ca447107d7911a67ebce222208cf6ed2d4a5c978619f88afe01c1eb69e05d09ce23d3e222c99549823c1be27076bf7e12619897c221f5d5f2d008036aef51a5b5eaf63fb1f5d887752447422555a981cbe7bc99b1a004c07a7945edfe4b5f0ce8459b90153d3613ffa48700815e9437b334c6065b2e1627b5923b69c55ca0947119c51f4f78f108163cdaf2ac4105ab0292ae1adfdf85fa2f57df3ebb3eba360502ae8d807427055beb597a9621856c9b1870f3fde075b7b7e0878ed82a02f7bf03fd3d4f804d1c77778cb905ca8a55475\", \"c77d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bd16996175fbce054cbd8b5c26c2d40819e04cc8aa6e6500817533caa4fcbffabb71aa1af8b43c653f5bd4a49a6dd2a2c220faf9f7ee0d38ca763740363240a33f5a7735bc8e0f27305ca0f6b127eb0c71998afa21cfa1408dfc03edc17ac2e42ff4035580f6aad3e4d48161cfa55cd77c0146622bf63e71def681bc3cbf8a6f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022820950910e2c2871348a124f333a391425324cd524e7b16b4f024aef96f12de918197c6ddf0cd0d2c631080ca5228140d00c7cfb9fb72f1142db333c6331655a3b525baaa3b371e4f70311356d05a0caf5821665b7e34d395fe0902256ff10c4740aa27260fe1bde00ed631e661757cddab3b4a820740208656cb3d06c53122015fdffaf986d848227c15233e159f021e63850865a2c313f035532aff372a00a6f413244e86df4859c6b73a46344d1e2830c2371de434d0617238bc18b2ff4cd22f34bef7bbc51a14106277b8b2bb4297c1e4058211ba0484ce7d4c221a8dcf376299d7b232218b748113a5dd927bf6bc786cd36f85be00287cdef698c9b48dc61552bc3825ad989f594fe57494dfeffdad764634019d2cb04bdb168d0e715ac41a86cae1be018499f5db070d5850e85b7d29122445b5187ce9ff53487f8cdab77bf9e08e1620dd694b92a24a95ebf59b5e7df787afface40daacdc923506c077a0317a69097f479d74dea8070e070b3ceff7fb05e5f42d96aadeb18593470f02c0e75a2c2497165bac664323febaef5801cd5378c8ad5dc000e273b37fdf34aeb2976c90606761730f3e0a7056af8e8675d11512fa728e072761c3d7c5bcdead04fae565b672b4917aa0aa4751dc165d3bc34cf070de28e8f3a3c049d6203c11f44493124310ca2f3fab19d6d03a5aac111146df210742329342b06aac9d0860195915b07ce3616475\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8100dfdf5c7f83af5d4cdded17045999c289d0f075ba6add5c0ed7b0f5c1761ac2ff4035580f6aad3e4d48161cfa55cd77c0146622bf63e71def681bc3cbf8a6f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f5f01b555c46d9d86c043b50cdf0dc05ea4c3d08",
    "content": "{\"tx\": \"bfeaf70b038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41d02000000f8f102f060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270de010000002f563892dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2d00000000c1b137a404a710660000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac34000000\", \"prevouts\": [\"f4c73700000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"a13c0e0000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"0f2d22000000000022512022abfe1c27b62198bb616e4483022cc980778bee956a61d21a3456cf5e2e41f8\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366be5feeab2a431d8c7218b36375cedf4fffb9b506ae8c59f48bd66d7e5f8a828\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a67616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f5f4bc663f8ff671a51d503c89c7a5659c0c37ab",
    "content": "{\"tx\": \"0b6fe83703bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffe000000007cacfbdb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c468000000009c09df848bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4f700000000774f468401c92a7500000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acbd79e031\", \"prevouts\": [\"dcc37900000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"129d37000000000017a91439ec132e1466f40f0086baa7ac253013e83c7dc387\", \"bc53380000000000225120f3eef30b2db388e6b8a313ffb142e2e6ffc970ce6b6a81ae6dc1d81725c678ea\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4a4e91ee040b5c2876196adb98fc298df501b5f790b55a4e06e019d08b67838\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a72616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f614cb3aadb14fc4cea6a3fa949cf1c4a5aa490a",
    "content": "{\"tx\": \"e790d7e20260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700600000000a8b6c4cfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c020000000097a222af02a72e6200000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987f3a42b2c\", \"prevouts\": [\"f69a100000000000225120ffd777cccd991739bb38ccbd9db99d10dd791a1388f121434fe253b3e6e47a30\", \"dce2530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ac2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fe2e93ace48bd6003497027436d57b628443993a76d6dc4aa3bb8a3b957edfdc60a46f1edbb097ed18057c0e42fb935953c4336ec9d443d16e55ae39a225d9f2f0288dcf8f2e1e03125ab45cd0efca3a23715e7661e5c17627e98d50057f87374b5cd80fb8cd7c947a98554a389db356265b198fc72df311d010d98c3d6e3928\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93644238c4788dcc6d7bf741c635b7a2ee8b7477bdaeabf5c2adaf292bfc6ab135bafd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173a144e2b32fb029cde325456c88021dd04a80b93e0665f7e39c1e8a56bfdcaf4a64b5cd80fb8cd7c947a98554a389db356265b198fc72df311d010d98c3d6e3928\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f62efd7cbffa78cde24f12d7daf90b120c6b3e5f",
    "content": "{\"tx\": \"c1eba3db02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4f00000000e94ce9b9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf40000000000bf6ebc6028687db00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796bb000000\", \"prevouts\": [\"0e8d74000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"cf0d690000000000225120469ff3412c89f5805e53fbb9303c790a98dd32093d40e3b7dfe22bb05f85f37f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d09024ebce0629bfe29d7ba6d368ccff3460e1a6939014001793a16b4bbeaabcfe8d9658eb0f54423f22ac73bbd15ce4dfe62bad665a213d4f47a7f3dd73a1e5edeeb7237110748eef3b5c6748fb99ea355f7bb22202c6b9249880d7820934330a58e9dce0290ad6aaa1a9ac026f299662b74f072400cfb39a90e3761ce1d790a3c228ed0c9cb118f96b02a40139bbd89c6237a5241fe98c50a74b332a177f8194344d645c191c25a25df9c16a1ceff83a66b2ff4df732a4f2aa376498ef797ac0604c6048772daae84a060dd7fed4eeb1ab1038f22bc74d2fff093311a3b7e2636111fba9cd40252c4ced4eb1f425f264d9802850e4248873578fa520c13765a3ea680b6096e14fcd3fa5da7daeb36c193283f9ac88ad4ccee869a4a45bd48e1c3ff872cdc465236789005e60b2036f7a04202acadef004b5802640f059430ecb8d09d19e9b5cd88faf91533a65d1ab0c58b4ee13084e8839e03faff357ecf3b78571eb20e88d80e15b1004fe5a7cf8ecaa8172e9b087a4a5f51c8a5b94627efde060164c1b41d384614bb66230e385f731f996cf0c290689ab61be83e4cf239b2acfa35c9ed57ac4664c28f22818bd4c5e635c3f97d1ffc47607e0f7c183d9060617e6eb603e01862c0a9acdb02511d042014e927e4874191112f0b6bc84ffd7d35dbd41cb418aa12b1f7e87880b63621cefd28b9f8090b4ffcacb84fa97d7ac6350ace1f59f3e48b7c8375fc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e1f41497843ee5deed9b1c1ba808c351924818107785eb2ec7667e528f438b571239c06a64e39d88ea3d05132fdd32c8e90a6b90ff74e726fde2d8f99de3a7b89959b5d8c486a0b4fb1c0695d0398f92463f78d98cf4d122171b1dc85f0cff66bc\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09022d7de85d544e8436853be8013693a72cc6c30b813d64ae9f882060b095c5a999fbbb4a589bf19731b8d283648ffb368bea4264c552ec8fe3578eddaa30871ea0c4f540d4f7fa8eafc08de90b854c3c2f0957dd8f539a57467e93a7a6b58b6b3dbb4a46ef5309f0ec7719c385f9549cd413fcad3aee1f2c1b0cd993cf96126e940ea7929211b20fe43d519ddfdbff6b756348178b7963da8f7df7c7c364abc52c9bb336576c38334e89dc702112923cddaeb1fcd8b2238690e1f46ca0947caac42fd5bd37242d5617ffa5a138d94e656dd25f52f2ccb3531922d953aa331cf1bd39d55dc399ee95b4fbab2951853a12785cb09796c370277a36f05cdb7a4486a3ed4bef607698a457bcd5fd3f40e2a981e0a4bf83fb0cf6427162db55769b5f74c763c33f0fe8c3e7f142c436e93d4f40cb5caf022b11d05801a7f8b76869be36b5f2696d5d409e87a632c46fff13722480b5c0491985514c1bd32ed011ace3c1bb7a9f5e3ee42f953f2558d1414ff351d668a0810904ffd4b883078524b860af7947dd0b24fe2993bf935b86e9378f1570cf2eff21042b562bc253dcf9c53fd93df02806658842fca201e737ae19ae090ee72028d9ac8c58d8da147d5aa7500b80dee971b0205378abcf701b3143e24276ecd5d8143edc6d755c8d6bf0d756f893da3149f725f0d47c48ed211a594884172b43d6e1b6ebdc1f6f61ed732c07ff2c331b92d6951cc8cf7561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad0bf4e84093dac3642575e5fc14ab670bc7f09f3e86548c6d7239588697b0a299aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4690da805934f4f93e9c0efd4d4edfea04743fe60c173721d1481257c7ee1801e4e0df2464f99a35d5bc9fbf69ae3045675e957332f77327dfd622124d00cb4df\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f6389882692a6a18e427b73ca3a0a34f645e476b",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8f00000000ed8cc89e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45a0000000057eac8a603966c5f000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac496bcc1f\", \"prevouts\": [\"7fdf280000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\", \"752e380000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"d1\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936626685b331694d0de841e58d95d1842d28c3900fed13098d035c30bbed037f96e5aa467dfe2257bccb94fb5bf6723e840de90a3890266560a9e3d72c84089f55cf37d2bf9ac9d65f4f9542d60f6497573c04b4d7313f44a5c611386102890a1c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045716f66701312fe6b613a3a288c903128f650d73beac5c480044fdeaa8466574a9dac82751ef42f4155e8d0286eb609cd4bc8c8b3be93c107754fe282612bb362f9b27230787fc79bd718ce7ac07558dd4f31dfc3ae0570acbd1df01407b1d4ec\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f63afc3910d5b449d7d26586af8681218677fd6d",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9f01000000d913cab760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127007010000005f0436fa04d7bb8800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac46000000\", \"prevouts\": [\"c4ba7b00000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\", \"ef5f0f000000000017a914b1a54d09172ecbb89289f2a670acc3fe14ced9ee87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d090266d942314406b975f02cab7af6ecc78440c27b3d3a72a1e78dcf6fc9cd75ebe28a2027327e19d7af4fc3451b5f22b628be6f748c0cb425739ca9e3fca11f7e93f49741064f1f867b7959613cd7011a47b2b547aae7e7aa50bc2c3f0294541f37ad51b7cd2f735df63c176a1127a90f465850bfd52e7f18c2c0d703d80da1992fb06a4c3115d8cf78685ed571221004909abc87e28fa8504322e0589820a79a2e19fb773b72ffce35c9476da8b3312b3d436ae03c2350362cc68f90bf9e31c07def92d8b445e0bed1d38f9c2e774f4ad04f0f7023f7cb89875252babe5faaaef074c4528ca86ac1f6328c4310bbd91669c6d3372bac0937570cf907aef401e6fe786ff0b638ac875768198f3c4a1ff62cd1bd41d2b94af15512667277f9f9fbc709ab349ccc5b3e6e5a4acf2948b432f572bf934b9c943a1c14bc97f2d0f90cda3a85f74e67c459ff433e51f5d5af3c54397c121f06fd60231249b47fea21ff692bcddc233047cd3de6acad0b5ad0faa2ac9b2fbf1ea44745163c255e79476e8ea1bffcd9d998b6303fa275f370c6a3b7a710da2befd35930f6c325fc4d44a1bda0dd493299bed662bc82add91a4f73f4986823543e384b3cb9bea4d252923f952b3f22efdf659ec00d9ce3afccec73236410bdf4494774dae85ae3fdd1a9c7e94c424d2d92c6828c00bdf8032ba65de411300291fb96342c6176e7954544284742ca330d53bee819f675ca\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e11ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045be01dd809c80d07fbb65649666935b9712ecafc77e536b2a27c3cd6425d00c1ec7034c4ece6ceffdf067bd97d8bd2a80e986f14e8b5dca33ff1523eba7a77d63\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902443801a5ceb04515c5bb3d43a7a4e32f80d5b93027a50d0f70c334edf2feb2bd3876929474e34cf963899e082f640fa1146eac6dc15dabbc5c94a5271a545941c54d09cae64ae26e6402bb6b537f09b83c677cf7a3977adb8f5d8c3415a6af030af5621929ad5557f1820858a0f38fa52e9ac9c351eab815bb745ae70056ba1ae667ce1e951e16081906d4f269bed8ee2abfe1e8f60c9414bc6b188cf45e9ec5a5f0708c5aeb4c87d2344d4df9511e6a196391fe446a65844dc07c1a2e80716ed0f08a508696cfe7f6b9618e3a563e02e143d006bbd81b9b9f6e9ed8b016c32df52a9aaf9401b703178ad644ebccdc55afcc59f8b856e5c7c16450ac925e4dbfc0e71baf1ad1919f506e8fe661df0b545608cfe98e9d18af07df46dd4587f59b205fdb8026f4728d8eb59fa3120b09f3d59e9161c59287a166343a26b40386626fd32a65170999b70ae05287b1bc92129f1b0ad772b4e96888ee68eb239eb3a4c0edbcf46220ca0b0f5f7cc9c37aac73be2b3e4b56facf7415f3a0b81aab240a96af42dbbfb29e10d3c90bf92ef8b63c01584742e053687eb52b718543a9df702e618fd62dd981a8d7f2c69f5f3318ca8183e4f2a9244e1379b8f981473a3143d4a92d909ee3a71dd1017998b5e90082ddaad5b9f333be64ea66a9441796701cb9bda6703cfa1038b5cb80a794446adaa3ff597b939534bef150d3e0b9198a43df73c9d239d482b4517561\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cacf8b2242350f428bd79d35dc27fac1c499655665084a78dd769bcfb813a07758c38514ede62462d8dcaca890d92a506794ae643449cc5c1c2c2667ece3d2dbdc18898993c284d2f731b7495cb62c60e8571430965d040562487638e1f1fd248a698426442c951e7251e4e87784c9556d503d37bf6168d5559e89d6402ee5a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f64c19e45d11b07f585d65dd6f72bcd502d95a0a",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff40100000023239086dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1b000000007b8490a101327b760000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79613fcc133\", \"prevouts\": [\"b0486c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"47c754000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_f1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"97553c1c80f820ad8a2f7f6b4e91f9d3f2825eab51067bbf878caaf5b312b690f286131b4a3b6a4397c7e4dd7e9ef5d00dbdc6e3051e04d6650bf5e3a1487e3c81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3ffb6362e225b3761d4130dbf8dc6a086744f6a148501704fa3b451a634beac10dc51e03aed889e7e7d286bc9bbbd1cc2717676dbc401080e89ed7a7a76998baf1\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f6514adef6dcf766ba7179320ec6c88126688614",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4f00000000096ba8c2bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7400000000156c38e103eb5d8b000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac71040000\", \"prevouts\": [\"1e47260000000000225120bf924c4d20f2c9cd0e276b93ccb8cc76d8c2c0447a0551ca648744a57795d235\", \"27a266000000000022512091a4836ea80f7ca2c21897583e26dd6f79eeaeac6399c549c1cbaa135e7e4bc1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"cc7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93617c8f5b2810c993545fdf5f31da55f5a99b1608086c79b0b58f6326267dbef5eba22abe4a548a0fc6dfdb5b637d4f02bd7b4a4be5fc13f7c30d33fe8bd172a30474a999e2826f1f27f01ebf91ad073bfebeca039a55919a1ef327838bd290026ec1da8cea892037e805a477afbb54b1f5ec380954f076c0bcd3c4e3d4797a8d6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368620c4ec8357c3a4a921d222018bacb93cc988a86d4715e25d6f1f1c6590be1bf31245d0339f22fddf0c8a157372cfa350cb7b4c29fad108e38a2a212532063d8f95dbc4edc81931664a748b39a9978dd32dedaf5c850114f6bd2f5098c050fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f6765d4b30feb17d15d4bd81601ea5788d8d26ed",
    "content": "{\"tx\": \"9cd4c5f8028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40d0100000043103d8c60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127060000000005b59fac60132e71700000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac67000000\", \"prevouts\": [\"9f583d00000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\", \"5860110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_a1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a10458261d945d50d53c0cc865f8205a443e4a8b6e03d86b1fd7cbfe931c330f25f7e0739ebf36285a76f076bb0d29d8bbd608b1e074c0059cd4541308ee236f82\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"630dbaaee14a73e0dd531b19daa63918a1ef7834129ea60ddaf7f8d379e31a1602644354fa8f1896316633e95af39782fab525d4fd185e23924cd8d1fef7044fa1\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f678ee4a403b466dde13be7e941db7ff7684a932",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfe701000000566f672760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912706e01000000333580ee0250697b00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcb141a65f\", \"prevouts\": [\"7df96d000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"c049100000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_81\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0e6ae66a3f51db8c3cea8d4b020e7486e5e480dbd6f5db160cf5d1c224418958ce5aa0eea06f972ed12f6fc3975b440cee50491ac1499c5a8052daf0c743250a81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3fae62c629d2349c86cd7d14514ae14fffd598086d1b9b8254be22cdcb3dfce4189c55232dbe4e7ac6c7afb0ee0b15bfaf726e3e05aebf2cfa61f0baae074e2d81\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f67b572dbad35568f4ec9ba53cafa2997991340e",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf750100000056603c16bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf44000000000058d92c0486a2f60000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac1d010000\", \"prevouts\": [\"928a81000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"d39f770000000000225120c117fdddb90a3f1a4803136a1531a36879999867f6c1969f4ff0fed79ac77cc2\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/bigmulti\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"87174492b6a4dd52e3556640f64a2ba7eab56db2c60047f03dadc4b4da100ab50e0d45bc0a418b2c2f9fb9288d3c9204c0255d951606e2600415b5ecb8531cea83\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"8e554f5f1743309a0778f2b5fc909834198524aea37c85ba783bf0b25c6bae798689beeb9c4f8c731deb98bbcb7fe82e9aee423fdf6bb35b22f9ecc8a1a46d5401\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"87174492b6a4dd52e3556640f64a2ba7eab56db2c60047f03dadc4b4da100ab50e0d45bc0a418b2c2f9fb9288d3c9204c0255d951606e2600415b5ecb8531cea83\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"87174492b6a4dd52e3556640f64a2ba7eab56db2c60047f03dadc4b4da100ab50e0d45bc0a418b2c2f9fb9288d3c9204c0255d951606e2600415b5ecb8531cea83\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"e6646e438b3b1f02d76efa42b04933a551e24ed9c5819f394e57f2a17f84b4f405093e225e898bf889095e21a9434815b82c132c6b9d6ebcc5b1867c4e6560c481\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"8e554f5f1743309a0778f2b5fc909834198524aea37c85ba783bf0b25c6bae798689beeb9c4f8c731deb98bbcb7fe82e9aee423fdf6bb35b22f9ecc8a1a46d5401\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"e6646e438b3b1f02d76efa42b04933a551e24ed9c5819f394e57f2a17f84b4f405093e225e898bf889095e21a9434815b82c132c6b9d6ebcc5b1867c4e6560c481\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"8e554f5f1743309a0778f2b5fc909834198524aea37c85ba783bf0b25c6bae798689beeb9c4f8c731deb98bbcb7fe82e9aee423fdf6bb35b22f9ecc8a1a46d5401\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"8e554f5f1743309a0778f2b5fc909834198524aea37c85ba783bf0b25c6bae798689beeb9c4f8c731deb98bbcb7fe82e9aee423fdf6bb35b22f9ecc8a1a46d5401\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"e6646e438b3b1f02d76efa42b04933a551e24ed9c5819f394e57f2a17f84b4f405093e225e898bf889095e21a9434815b82c132c6b9d6ebcc5b1867c4e6560c481\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"87174492b6a4dd52e3556640f64a2ba7eab56db2c60047f03dadc4b4da100ab50e0d45bc0a418b2c2f9fb9288d3c9204c0255d951606e2600415b5ecb8531cea83\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"8e554f5f1743309a0778f2b5fc909834198524aea37c85ba783bf0b25c6bae798689beeb9c4f8c731deb98bbcb7fe82e9aee423fdf6bb35b22f9ecc8a1a46d5401\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"e6646e438b3b1f02d76efa42b04933a551e24ed9c5819f394e57f2a17f84b4f405093e225e898bf889095e21a9434815b82c132c6b9d6ebcc5b1867c4e6560c481\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"8e554f5f1743309a0778f2b5fc909834198524aea37c85ba783bf0b25c6bae798689beeb9c4f8c731deb98bbcb7fe82e9aee423fdf6bb35b22f9ecc8a1a46d5401\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"8e554f5f1743309a0778f2b5fc909834198524aea37c85ba783bf0b25c6bae798689beeb9c4f8c731deb98bbcb7fe82e9aee423fdf6bb35b22f9ecc8a1a46d5401\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"8e554f5f1743309a0778f2b5fc909834198524aea37c85ba783bf0b25c6bae798689beeb9c4f8c731deb98bbcb7fe82e9aee423fdf6bb35b22f9ecc8a1a46d5401\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"87174492b6a4dd52e3556640f64a2ba7eab56db2c60047f03dadc4b4da100ab50e0d45bc0a418b2c2f9fb9288d3c9204c0255d951606e2600415b5ecb8531cea83\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"8e554f5f1743309a0778f2b5fc909834198524aea37c85ba783bf0b25c6bae798689beeb9c4f8c731deb98bbcb7fe82e9aee423fdf6bb35b22f9ecc8a1a46d5401\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"e6646e438b3b1f02d76efa42b04933a551e24ed9c5819f394e57f2a17f84b4f405093e225e898bf889095e21a9434815b82c132c6b9d6ebcc5b1867c4e6560c481\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"e6646e438b3b1f02d76efa42b04933a551e24ed9c5819f394e57f2a17f84b4f405093e225e898bf889095e21a9434815b82c132c6b9d6ebcc5b1867c4e6560c481\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"87174492b6a4dd52e3556640f64a2ba7eab56db2c60047f03dadc4b4da100ab50e0d45bc0a418b2c2f9fb9288d3c9204c0255d951606e2600415b5ecb8531cea83\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"87174492b6a4dd52e3556640f64a2ba7eab56db2c60047f03dadc4b4da100ab50e0d45bc0a418b2c2f9fb9288d3c9204c0255d951606e2600415b5ecb8531cea83\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"87174492b6a4dd52e3556640f64a2ba7eab56db2c60047f03dadc4b4da100ab50e0d45bc0a418b2c2f9fb9288d3c9204c0255d951606e2600415b5ecb8531cea83\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"3fd5064df06b6378bdbf1a394cd23b562712d7fd5a6af30a2b1ed8ac5b0855edb4abd752aeff738321808a5ba6f4c1da7447541e8789efe8b1b160da9e4d282d81\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"52020a006a3c51a8ff007707013d44f615459edb4ded77db33d5d011de20818d49fefd4bacd1b46f6a16f1d150a334cdb21effa85b4f7895b46cd1c267d32bad81\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"8e554f5f1743309a0778f2b5fc909834198524aea37c85ba783bf0b25c6bae798689beeb9c4f8c731deb98bbcb7fe82e9aee423fdf6bb35b22f9ecc8a1a46d5401\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"0b08c1d3debaeb4acf7b5b9a65c983b634c37a7e392f80e1a312d204642e8c664fc13bba250525f6b90d7cf98015076a92db8261756184728ab0beb7071c2f3283\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"162ee0dc9b3a50a8aad92914c992bbaab7bda8776cfeacf4b491de79b2ee4a919097d252aafa6a2ad8dd8db1bd4fbb0c16cdb330fcb740822c881cf7a75bd49901\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"91f49da0b66c676b7af2a1e315abc0af48995348e4faf299bb9b5b2470cc0adf31c8f63d235f8a6bb03a32f169bb95d617872b7b950c6c5e4e8b366c447912aa\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"22f8816c5f3164197d9a21d5c2962c29d960407abeebb896ba729b49f53584578a88674b63581c241695a226627d20b0f33b8f8aa77611318f80562e56c2a84b\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"52c0db6699f6e83c3e0437c15da3643375ec8a68ad63a11309594e24a3776c929c5d743e11bced02e7fa04200e0b942b6ec661d946d793eaf86e26df8ea1463f03\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"6e832128c9adb130a93fd46b603dca75c504659d5b92fabb988c8d52a98525be9550e5e0538ab26d06703c6ee9cb7f2a18fc6bde48ebd5bc1879a3d702ae50ce02\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"f74c41d6f1a7d5c93931573d11b3ec79e7ef7fe2bb3cfcd7782d2c776e723a8376e8ecfda58244904355b4e87a12833c9d378d5ced53fbe6e3eceb7de504610f82\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"6867e7e97f6fbb96bcfb4cafec0bfb762c0a6dc128e41bb51395a4a8ad3054a82094f9616417ecea8368e4b4c49930006cf6dbc561f0f3dd36ff6779d8677f4881\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"fadea797ae4e5fb8ac17424bbbdb074f26ad74dffd4da10f9fb6f8b4bbdf2c0300a47e40650f39511ad75b2f97979fe877a35a07fc9cf4ed66bc5f23e1ed5f4401\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"a2e6be7fa0cd409b24c4fc7e2c410ff8515069659619502eb1bdbafb0abccc5a4ee9bef833b0e57fdc626c1bac312a85727fa0d48572f8e0532a8c58f4bc7f9883\", \"7c9743c31946179108adcdef1c4f2fe79689962d4830ddb1c7e1772067e8ae5273613703c8cf47d8e4c7b22ade412372ac2a0d44772d2de8f421befee38c8496\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"e1ce0092f8137acf09b9b0dabfcb05b4be5039d0e1f4df7529d596c8ec66cc87544bee43d0851fb34fcadd71a93c34407e85c90265930183d44a3cb5ec1a421a02\", \"4297208ac0b29c1d30b9ba59a4d9fc33d46b535b14f9d39aef432f5c3dc0d1525f5006c6481e5e0fc0560c427db9261c345d95fb829a11892196501a54fcdda982\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"b4a85678040b901b8c34d97eb757bc741524a5fd885ea95676aca4b6b6c29deea57c4f8f0f8058d591ed416575031385d46983d85dd67865fb89e13aab675da702\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"fa4e58f43338f1f930992c0b902f30e5f9019897cdbc91e7b0b0cc66625966ffb8f4a949098540480c5f97015351b99f2948b4d4d90b6e4ec1d9033e5a03713902\", \"96eea49c646eb1798ca0889129172b3494a4f818dd9767f8eb804dab0f99ab189a3c7d8cd4247746f35e2930579e5f44cb8720712267717689f3fcbf7d6c11a302\", \"298be28ee9a3d699494d2d89ed1d26abc25ceb96e32da7dc8f0f3d2587889c8055f2677dc7f2d39e1499a1fa90af32aafe115a98572120721a2d77f46177422003\", \"2a583a8bd3b32ababe4e93d42b3609db8b1c08a635e8479b3b0cc5c68dd567396db501c5626d5e774f6f4e74beb43623e53020139ef821e2dbb1c8b0bccde8c382\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"1395e7663cc259f7e1da04aa0ff0892c2e0fe13b74271c45e25cae515c53ee9a1d0397a15a4731dfa3148c2a8a85ee717436c93e9f20260c6cbd3c000102c33002\", \"4f55feeb34753827f2ca2bfc1f361a4abcf07b4f9341c138ca6ea40089e183d50e2b5356ebd5575db2066bb37d77f73c5305810eeab7608426ea7d978f7c91e881\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"4243d4dd2611f501e6bd1212e10f5bff9cba16585db2fbb97cb8d81330d7cb36e9c16dbff1e88b7c29b25341a8252daf492cf020dc8fb8ea5c29661a1158150f\", \"87174492b6a4dd52e3556640f64a2ba7eab56db2c60047f03dadc4b4da100ab50e0d45bc0a418b2c2f9fb9288d3c9204c0255d951606e2600415b5ecb8531cea83\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"9afd76c4fe64e98b7f23447ed6a383e70dc37f28e3501bbdf82db4fa1c1c0edc65541b3eeccfdca4a5522113fdb04a0ce5ff4fbde15533641dbebefb465e480203\", \"698064499c70c4bc9c00774a26cf8424e243f7f62af8976ede1be4b7d3c4ee6f1f568c1a0079c7ffabd427a95a0a00f6edbbae848e3cb00610ad8abb4361053582\", \"030dcecd0dbd5d8c4b4d72c9c3696d4a22d7e135e202430b65781040e8b3a5b5c2e4a5c18e7d4f44a67b623b25baa155a3422fe6845375ba2465bf0d189571c682\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"d9ccf4e6cbff88b61e4962cdf239a441f0082547272d9ce19c093de1d2d33a26416787e4341722070d39e88d5b2a60ef2c2d9060b2c5a0d80fb6fbb053ac499b83\", \"87029d2d23d92d5ac74690e42187f82f5877f307d8e2ec0f0695b10369f5f7c26d27d3a1a5962a46b49853d125d96fa071484748474d668498813e9c052521b902\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"c4665890359fcfdd2fc57836de46f4c08985572c324f3fda52f12beb31f068d885b22539928683631fbb2c5c54cae53f4fb73fcf23cf55c0ec901ad1d47a6a8782\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"8f663cc49404a233ecfd04ff0e6503f1442fafb6d4ba9e91fd75c1542546e63226f755f74431069929f19607c27aedb91765518574f464bf4263538e309c372781\", \"8122e9f8ebfb3107442afb37809ac57ca1692259ee728c2708874cada411191cd7d0282f16432e66885035dca4884f39ee90a026b25ffc09fe47b3dd795c415701\", \"2a2b2dd9f50988d97627c16e6a894e93a90378c00c93bb40e7166a56f54e0b333bb25f3c832e521af2acca3e24b18afc609f96dc9f58a4fa426f974ed95cdda003\", \"be060e39922f9cc77fe0de9070af87e82a56c145f8bdaf73f3638f4a2f140e96efe26cbd3aa123c84e79b66cb44d89f584cc67fb0930bb2c2f9d640342b92355\", \"b25982266c33986d527464e5386ab16d3c9a510db36e2e84c39cd1b99e80bea6963298f831c4165252be5df580568278677184cb517158eb5480b4a8fb7592c003\", \"add90081b383eb4e7144163aa958e458cae442e66b4e0b7ba57ced9d538f6d1790de44c2ba38477d0642051b14b7eff26db8f24437412a6443c697912ae0025c83\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"4b7740f9eb6ca8f81024fae2ad8b8b65260c91a8ae2590769ca0950123224b0190f29ad79ee12db2a168ebf6386d06aa2b38f95cc41123f034e64917d307b9ff82\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"844f16b5ad563ec846dda659a6afa9690b12728ffe62392741091492f448d3b43ad61a288d502ba77ea6b9f16cc2d29a12e2b5df9c3067ae01341ac0c0c32b6c03\", \"8d4e891fd74d2736aa099c869182a6a26df385f99b4f08896c3096203293405ed62ee25f1fb7172826fe4b5efa7c34753189c6e68b34082595cca953825a596782\", \"9e6d195808802273413438a3cb89c2c99cee31f2837531ad71b344b9fdfabd53e350f17ddbc27a9874ed22f2798a3758a8a1c3117ab35a966100b341aab2289481\", \"beac7fd2ed8e9d7e73b6a460dcc9efb8e831437f2420f5ff7342455a628d1e046c96ba034cb94711a3f3ca5eb4206dc2226ad2b47f0e1293c95eb90ecd917bce03\", \"3600b868ea2d1716b70c3a99d4174a8b5f7d316045e2aad99cc339d80ff8a07d0f57f13ed661e5f1f2ac696415e9f4dc16e5af1168c5b75d6fa1c1a227741b4b\", \"89cf3185505d9bff784c2b4f56c1dacba0003f642e4d596c8bcf1ec3863811deed1a50d7a39a47c7558c188dc2ee2ae2637d83116da878bf7cc2ce718054298f\", \"87174492b6a4dd52e3556640f64a2ba7eab56db2c60047f03dadc4b4da100ab50e0d45bc0a418b2c2f9fb9288d3c9204c0255d951606e2600415b5ecb8531cea83\", \"ea39321d6e868755af165f19b6840e295b1254c956a06c144d2321e37e900c3cb6cb9ff53ed41233c45fcf4530a870385709af297b82290799a575e22b32832c02\", \"f1ca13fbbd32b1acfeee0280603c8ace2f7a73630b4a16813a6147663f1ca5b2078b4dd10f4611b6538f50fc65aed5843e1ebb28d5dcf9b37d3f6eacbd8ae01f03\", \"db2eec5c12097d7ddfb7c20b0c6daf53bf772c5bbe9a25a4f4345769ba04114e43260cd03393c94703c597c6872293c44bb5c1b88df6e24bdd9f6b8e3ecbaf4401\", \"84219f8564d07e8187d9a96bd5a867750ac55bd1e19485f66c9d9b8a5bcf17eeb00c2eed2e264e696760968114a1360a53545e010884c9a07e4f6aebf592430083\", \"1eaa4326e72f68ce61fe4f6c01030934328159e3d31f9051dc039322f95502f30f35c2e7d9a9261457e3ecb8ee2f46b98c6336464bd3ccd935602c03e475017b01\", \"0a5bb8f7532c10dd880f4ecea0ea65b109eb0fcacacbedd862b9804f8b43cd71edee6182322ae3f7abae1cb304ffb904d65c2f8c1c2d06e579bd5983549b80d881\", \"f8fd5a8b2d847641f5d03c383e41e40a3d6f7ecab7a150345bac107fad75609f2cf0e4bf3bece4d89c6b94ae60391cafcd7e4e1f6df203de9a6e96d1faa6ee5183\", \"0ad397e524c28244395794fc57009d62ac6494ebf3ee20b6d063418cba191629a50b56631ad5078be2eb622258257797f7f2625ee61a19e6d45c2db9713a3d4a01\", \"63746b8c49ca2ffbcd3d517ef0af6bd37a9bb313dcb1b517a75c6676b9ac29d2e1b8e46c988b48c81ef1184448ccf231388b42854696bbc606772784cd71bfbc01\", \"3036e749a837b9bea6484c80a089bd22672fbbbcc8a7eb32be34ba93274548ec9e19adfa1e3d478b1c68c9d010aa8c0fb441651dbad1f7e79bd31edf560deb06\", \"bada600aa7be5fc70862900be3c068c690e1d881e7a5ae38857a68a008c668e08791353a63b911c69113ab26431c3c642b3fbf58032e10f700cb3e05db51298083\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936baf4c6d0c51fc96b9141842fe9eaf61c74d8eb4071ad6a2f4b34154fbc32a2d5922bf45c763bb50fa537138ed62437fbd2e1df4bc0e607113a1e5917421b0b067b81b7fc382e624798cc3862955a77c75a888c0e53a3dde41653ba5595c82f9df1baeece72c9f4be68ddb6b2a880c83faf7068dab12aeee553a178b11ea29942e8b036c46d73bf6c33c89bca25cf4f18bd2d5b1ca273be0e396ac7d54c663262554f3299d422f9f8b70de66bb7fbb8073833305569dbf3d5161b03bab0dd3cc2c88365cd45ae6f6426efd2d7f480872cf752a3caad8153d5e359c0ca9017f5b27e4d685b42f14f8c1b90a7ef83ba1348df01eba80d283958a7db4d2fbc621a66fe77277ae713e4f306bbc005bda16e1b7eeebb2f27c524213352b20eb25d682ebd49cc1c9d1c5543faf51f246263bc293a1ec3b05628bc84cfd7f4dfccc3e91545ebbb7a20d90802d61cb761b7ed3a9d8977f7a5521df44543d663068a2348a7c7f6542a544c030cbfdd70964c7e81d665feb2adbff25ad3ab75b67ecf3712c09a0b10fc29ed9ec9ba811a78159d56d191855f20d80384a7f598d54defaeda75074e07476023602dfde1c8d0d124f96edbab4af8198f97e6bceba6cad7de517a8f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"1dfeb80554f47279f289ac27361bdc23e312f6d8089c84c6be5dd84e1f32ce0eedaf872d1e3046f8a441f6a4606511941e5fe17d6f847d1f52bf8113081eafcb83\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"0d2317fbc7c46a318fceeba04c050b4d87ba8f605364ac36be38c988b531ced5e960811b50b597b774555916100f917eaf10e371c7e3e521ca4e3bcc9174156a\", \"eb05b16b5b411847efd57b5108e00967390ed4ed918f85eb29dabfced3e21a79b9dde9e2771038e4ed1ac05c8c09cb151a7872243c9430e55f8120e451117ef883\", \"1dfeb80554f47279f289ac27361bdc23e312f6d8089c84c6be5dd84e1f32ce0eedaf872d1e3046f8a441f6a4606511941e5fe17d6f847d1f52bf8113081eafcb83\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"5b0af420e335200272e7faf2d3be31dcf38e31b3ab5ebef3f3f110d53cd47d0f459f103263c2fc110e4b8c21fad03cecb366702b40722c7c4a748eeca4f1326302\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"562dfbc3025a85f7b70d290a116db3313819037c3aa759dee418102407a1ca826d4ef2cd22d475d9010950098c8c00c2580c4c6e1e1663b436ec9f1c3fbf69e8\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"5b0af420e335200272e7faf2d3be31dcf38e31b3ab5ebef3f3f110d53cd47d0f459f103263c2fc110e4b8c21fad03cecb366702b40722c7c4a748eeca4f1326302\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"0d2317fbc7c46a318fceeba04c050b4d87ba8f605364ac36be38c988b531ced5e960811b50b597b774555916100f917eaf10e371c7e3e521ca4e3bcc9174156a\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"eb05b16b5b411847efd57b5108e00967390ed4ed918f85eb29dabfced3e21a79b9dde9e2771038e4ed1ac05c8c09cb151a7872243c9430e55f8120e451117ef883\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"eb35f11990d515fba653c01a97e84eae7807e6ccb3273c67e0a6d84240f08f0a179233199a68afb3d725baea3fb4c06613d662d82e302516b382049c63904f5903\", \"0d2317fbc7c46a318fceeba04c050b4d87ba8f605364ac36be38c988b531ced5e960811b50b597b774555916100f917eaf10e371c7e3e521ca4e3bcc9174156a\", \"0d2317fbc7c46a318fceeba04c050b4d87ba8f605364ac36be38c988b531ced5e960811b50b597b774555916100f917eaf10e371c7e3e521ca4e3bcc9174156a\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"eb35f11990d515fba653c01a97e84eae7807e6ccb3273c67e0a6d84240f08f0a179233199a68afb3d725baea3fb4c06613d662d82e302516b382049c63904f5903\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"1dfeb80554f47279f289ac27361bdc23e312f6d8089c84c6be5dd84e1f32ce0eedaf872d1e3046f8a441f6a4606511941e5fe17d6f847d1f52bf8113081eafcb83\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"562dfbc3025a85f7b70d290a116db3313819037c3aa759dee418102407a1ca826d4ef2cd22d475d9010950098c8c00c2580c4c6e1e1663b436ec9f1c3fbf69e8\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"eb05b16b5b411847efd57b5108e00967390ed4ed918f85eb29dabfced3e21a79b9dde9e2771038e4ed1ac05c8c09cb151a7872243c9430e55f8120e451117ef883\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"1dfeb80554f47279f289ac27361bdc23e312f6d8089c84c6be5dd84e1f32ce0eedaf872d1e3046f8a441f6a4606511941e5fe17d6f847d1f52bf8113081eafcb83\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"562dfbc3025a85f7b70d290a116db3313819037c3aa759dee418102407a1ca826d4ef2cd22d475d9010950098c8c00c2580c4c6e1e1663b436ec9f1c3fbf69e8\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"eb05b16b5b411847efd57b5108e00967390ed4ed918f85eb29dabfced3e21a79b9dde9e2771038e4ed1ac05c8c09cb151a7872243c9430e55f8120e451117ef883\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"eb35f11990d515fba653c01a97e84eae7807e6ccb3273c67e0a6d84240f08f0a179233199a68afb3d725baea3fb4c06613d662d82e302516b382049c63904f5903\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"5b0af420e335200272e7faf2d3be31dcf38e31b3ab5ebef3f3f110d53cd47d0f459f103263c2fc110e4b8c21fad03cecb366702b40722c7c4a748eeca4f1326302\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"0d2317fbc7c46a318fceeba04c050b4d87ba8f605364ac36be38c988b531ced5e960811b50b597b774555916100f917eaf10e371c7e3e521ca4e3bcc9174156a\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"5b0af420e335200272e7faf2d3be31dcf38e31b3ab5ebef3f3f110d53cd47d0f459f103263c2fc110e4b8c21fad03cecb366702b40722c7c4a748eeca4f1326302\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"eb05b16b5b411847efd57b5108e00967390ed4ed918f85eb29dabfced3e21a79b9dde9e2771038e4ed1ac05c8c09cb151a7872243c9430e55f8120e451117ef883\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"562dfbc3025a85f7b70d290a116db3313819037c3aa759dee418102407a1ca826d4ef2cd22d475d9010950098c8c00c2580c4c6e1e1663b436ec9f1c3fbf69e8\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"5b0af420e335200272e7faf2d3be31dcf38e31b3ab5ebef3f3f110d53cd47d0f459f103263c2fc110e4b8c21fad03cecb366702b40722c7c4a748eeca4f1326302\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"0d2317fbc7c46a318fceeba04c050b4d87ba8f605364ac36be38c988b531ced5e960811b50b597b774555916100f917eaf10e371c7e3e521ca4e3bcc9174156a\", \"5b0af420e335200272e7faf2d3be31dcf38e31b3ab5ebef3f3f110d53cd47d0f459f103263c2fc110e4b8c21fad03cecb366702b40722c7c4a748eeca4f1326302\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"0d2317fbc7c46a318fceeba04c050b4d87ba8f605364ac36be38c988b531ced5e960811b50b597b774555916100f917eaf10e371c7e3e521ca4e3bcc9174156a\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"eb05b16b5b411847efd57b5108e00967390ed4ed918f85eb29dabfced3e21a79b9dde9e2771038e4ed1ac05c8c09cb151a7872243c9430e55f8120e451117ef883\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"0d2317fbc7c46a318fceeba04c050b4d87ba8f605364ac36be38c988b531ced5e960811b50b597b774555916100f917eaf10e371c7e3e521ca4e3bcc9174156a\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"562dfbc3025a85f7b70d290a116db3313819037c3aa759dee418102407a1ca826d4ef2cd22d475d9010950098c8c00c2580c4c6e1e1663b436ec9f1c3fbf69e8\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"eb05b16b5b411847efd57b5108e00967390ed4ed918f85eb29dabfced3e21a79b9dde9e2771038e4ed1ac05c8c09cb151a7872243c9430e55f8120e451117ef883\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"eb35f11990d515fba653c01a97e84eae7807e6ccb3273c67e0a6d84240f08f0a179233199a68afb3d725baea3fb4c06613d662d82e302516b382049c63904f5903\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"eb35f11990d515fba653c01a97e84eae7807e6ccb3273c67e0a6d84240f08f0a179233199a68afb3d725baea3fb4c06613d662d82e302516b382049c63904f5903\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"eb35f11990d515fba653c01a97e84eae7807e6ccb3273c67e0a6d84240f08f0a179233199a68afb3d725baea3fb4c06613d662d82e302516b382049c63904f5903\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"eb05b16b5b411847efd57b5108e00967390ed4ed918f85eb29dabfced3e21a79b9dde9e2771038e4ed1ac05c8c09cb151a7872243c9430e55f8120e451117ef883\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"eb05b16b5b411847efd57b5108e00967390ed4ed918f85eb29dabfced3e21a79b9dde9e2771038e4ed1ac05c8c09cb151a7872243c9430e55f8120e451117ef883\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"1dfeb80554f47279f289ac27361bdc23e312f6d8089c84c6be5dd84e1f32ce0eedaf872d1e3046f8a441f6a4606511941e5fe17d6f847d1f52bf8113081eafcb83\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"562dfbc3025a85f7b70d290a116db3313819037c3aa759dee418102407a1ca826d4ef2cd22d475d9010950098c8c00c2580c4c6e1e1663b436ec9f1c3fbf69e8\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"eb35f11990d515fba653c01a97e84eae7807e6ccb3273c67e0a6d84240f08f0a179233199a68afb3d725baea3fb4c06613d662d82e302516b382049c63904f5903\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"eb35f11990d515fba653c01a97e84eae7807e6ccb3273c67e0a6d84240f08f0a179233199a68afb3d725baea3fb4c06613d662d82e302516b382049c63904f5903\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"eb05b16b5b411847efd57b5108e00967390ed4ed918f85eb29dabfced3e21a79b9dde9e2771038e4ed1ac05c8c09cb151a7872243c9430e55f8120e451117ef883\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"defaac63c0b79a5f10fd7f27f28a9075a3f57dc60b516dfeee046ef7c78257e3099560206098a6f916ba638bb1ed7072080d8d0aef580b9d443735b2e1400cf903\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"5b0af420e335200272e7faf2d3be31dcf38e31b3ab5ebef3f3f110d53cd47d0f459f103263c2fc110e4b8c21fad03cecb366702b40722c7c4a748eeca4f1326302\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"1dfeb80554f47279f289ac27361bdc23e312f6d8089c84c6be5dd84e1f32ce0eedaf872d1e3046f8a441f6a4606511941e5fe17d6f847d1f52bf8113081eafcb83\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"0b8bcbde5c38a9054b0de0b0867b75c1b450df38f7bffd31007d41e1b7097f3a120266ea93a99ffe378d4d15670e3a420e325725b30418ff03dfd11917d99b6581\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"1dfeb80554f47279f289ac27361bdc23e312f6d8089c84c6be5dd84e1f32ce0eedaf872d1e3046f8a441f6a4606511941e5fe17d6f847d1f52bf8113081eafcb83\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"288399afd52c6d80a9c2cab206290717709e94f06423ac8fcb29dd935a43004da3ea0bf3cef46b71f51622fc7336012abef68ef1a2217003f0772c6bccc9e1d403\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"4ba534916fbe1111a3fb08764d4df7c9668da0a89a868e04b14ff76593c50084138ef7a0a02332afd73c86fdbf204fdc838553155484e75ead697979f6e0666101\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"3732b61d846882d4a03081fef87847ad36416a8e83b3b70bc4c2548b852fe9ca367383d9336ded6ecebdbe85fdb8ab01a09a359609595fde719f017ae50da2de01\", \"43e327e5f0409334c78d0805cb3381dfb83af17afae0f6cf88550e626a03908a2aca80ee058807d12b42847c2e8516dae1d35cb3ad1ba7ab7937ffa4ebce111481\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"71fbce77e053f7357f8213ec44399c02a78599d64154b1e155f7de85cd3b7a1dffaeba7c4e45a2f73b5d1b532509959c36056e3f42112b077acfebfb115ad4d003\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"6441691c52de365bd02f0968ca9f29fb87d51d3796efd19b315e75400f4cba2a167724bd2c54966ceccb5b812ae480077cc0bde76b4befa69440e5a659e01bf902\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"5b0af420e335200272e7faf2d3be31dcf38e31b3ab5ebef3f3f110d53cd47d0f459f103263c2fc110e4b8c21fad03cecb366702b40722c7c4a748eeca4f1326302\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"65883bea43df1e4a9935186675101793e6c8065c7c3e69414f5d9335ac6b80ed27bccf9d4643cd66cc9e76f6cebc06038a78aa4a4e0e62bc767e2ed82bb7d8d601\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"f02472a18a242fb92632af71abf37f6b637d7b196d6381c871e274642c67468dbd8250ed426013f67697153f58b8d5dd1b51befd86e9199c66ccf4e611de80d701\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"10b2bc51c2a40d8c5eae536896c3a978e0c94fa848b54fa0d34d51d6b83ec2f601b4bdc8b961f50b1a71a583a3fe2ecb0c3d1765e23cad95660269d56e50389781\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"e74ab0926502627dc5173ae1564a4777b823102fa9e4c99071d1476979884a1843bc87ebcf0a5dae09a325c4168394f5ee328b9f6fef451e0c294489f1035856\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"eb35f11990d515fba653c01a97e84eae7807e6ccb3273c67e0a6d84240f08f0a179233199a68afb3d725baea3fb4c06613d662d82e302516b382049c63904f5903\", \"eb35f11990d515fba653c01a97e84eae7807e6ccb3273c67e0a6d84240f08f0a179233199a68afb3d725baea3fb4c06613d662d82e302516b382049c63904f5903\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"0d2317fbc7c46a318fceeba04c050b4d87ba8f605364ac36be38c988b531ced5e960811b50b597b774555916100f917eaf10e371c7e3e521ca4e3bcc9174156a\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"b938220f84bcf121afacce88aa27cd86a4b54ada24dd4c04bdb03e8306bb9824014f7be93ebc5cec925fbb23f38ff9e1a7f6d34be31cc9410586af63ff4c7d2503\", \"8d7ff6b9e2e498a0bc887566f868d7ebdd6154853d223a51ec1d6bcb3b99070aa6052e80db8ca3f64253942f580993226455a0422a33f5ebfc793f7f680157a902\", \"562dfbc3025a85f7b70d290a116db3313819037c3aa759dee418102407a1ca826d4ef2cd22d475d9010950098c8c00c2580c4c6e1e1663b436ec9f1c3fbf69e8\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"d7d817c444d4f9a99cc4fd65778b6ef903c638c1a65b1063e300b0788fc7463b630267ed35936aa7c9f8f88e411005027c5da42dcd44fd3d3593b6cffca2b09902\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"3888fd54b1fdfa67850bd05facdee5c0a2af50ce4dc30caf7b85c42a7060c7e98c9a56a90d17e054068a2af58662cfcd89248e2435a36fea86988313390d8a8a02\", \"eb35f11990d515fba653c01a97e84eae7807e6ccb3273c67e0a6d84240f08f0a179233199a68afb3d725baea3fb4c06613d662d82e302516b382049c63904f5903\", \"1dfeb80554f47279f289ac27361bdc23e312f6d8089c84c6be5dd84e1f32ce0eedaf872d1e3046f8a441f6a4606511941e5fe17d6f847d1f52bf8113081eafcb83\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"dc033aeee4753843ad351837490d11b08c226ad729ebb8d121d090505f12db441a7b20095e87c27e546b7a11e9966265d6bdb7fcf52aba54b9975a642822f39f03\", \"3db38abf922e8e6178f25415486ceffadf0b8b194d853d15900421b4214f23f42a9f9d27331671906cd675425f9ff843219b43144f9d2f672a96c8fe52e94b6602\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"13af116f5a52e5aefa0bb5c817f352170ef68b1dbc3ad10fb3f005c7d9ab5cc3ea57ae411b3ee91dd48fb90557fb87613a744a5b7396717f2acfdefc0596d8dc\", \"b37ba4a02716b8f263b71baea2a773ec72c215ff51bc74a8f8f51ba9b1b449df5b6c366861bc82d501bf2578bfb00b06af668e1e3077dae496376b9df4839d1783\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"bf158ce54f791658ff0ead9c7086b96ff77371149cad4af7cb24563a4c2e6aae16fb20da962ae82d4c1a710bdb70c3855f1a1027a400f5369b234726c597a1c701\", \"3e736c65b269c253d155b63556d771bae49edcd84d763def7230f1c86ec57dec0add1b9167f8cb3bce7cdd9e136531931c1c80c23f7e0c19e19138bea41dd74082\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"1dfeb80554f47279f289ac27361bdc23e312f6d8089c84c6be5dd84e1f32ce0eedaf872d1e3046f8a441f6a4606511941e5fe17d6f847d1f52bf8113081eafcb83\", \"211ab573a260771ca707ec45a680a1f28f254ac091db8e0db8097a128d6252ea21fee7fa211f21c129f0e4e015b781e8a65312cf9f833bbaffde1c2c48a98dcf\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"c93ce6ecf6f91b65e3277c84870442be5c892ad70c4b45d59bf36bf50735d2a1ee22bb411447921910c32546e8a83a04009ec00915d5cd8908fad5b03b7d62a981\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"c60c548a6a2e8099c6fe02ab848cf615810f82696ce1b19e514bb3f09998b7d128120d7d9928169fc01dd9a5cb0b729292be1b434b513f402929a316c9f2c30382\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"3445daf3200cb6a4af0a2753eda75d48c52935b75531b47a63e2edc1aa16e90aab1fea5dce27c7f078c4296555889275f5bd00b374171dee1f5086552aab051b82\", \"a2553b49a4be897d842ee29a899bca3a8ef1dfe04de8c5a8118d0f6503c319921d3427d371c3b8b269bc43c0fc08978a637c5837dd22cff63fd9d6419a0488e082\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"7573cbf96c5dc7fac987ad6c40018b9e77f224f921b22e006dc20620d025a42a4ba500b98492183644b2d24b1910e7c0e54c7fde3833824223b11fa4fdc74439\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"4b9fd28735a855230dd23d770a23bac19fa3a22b3a5e768846564b1a7abb541f8931b7e14a203c2a0a9a588cf24317678e5c5c783d2a6a1c3b55b7a43b2a491982\", \"562dfbc3025a85f7b70d290a116db3313819037c3aa759dee418102407a1ca826d4ef2cd22d475d9010950098c8c00c2580c4c6e1e1663b436ec9f1c3fbf69e8\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"ae9f3e67366138212f01bf7590f86e7bd8504381ee13e6a205fc75b97faa536c0f0edbf2f97b92c6db377129d275920fd19c083725083d31dca655eaf50d4db101\", \"025587d778729c55c07b7b0d8a6fbcabec39bb89e6cbc5f1e3ae4112219442fd9a6e331f201d7da041f5f23d47589debc790ae3fa50b290867a5c533f8c0c9e503\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"cc81ad868b8066b871e6c15808f109447988d0cc7887e350ad1e16c9bdf8532d7340d27e6f108db9231838fff9d57ca7463904c06d5d35fea33e7505d61b73b3\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"eaec74709e1c8cf5c18318d56a56dea46df72c91e1e12d4cab9ff141cb994af291f51b727562585e2443e9d3b841c34e28a1324dad8a578f45d3ae1267c52e9b82\", \"bb304f7e2b46e5770e1bfdf5dfdaee0f8ec27b2ef9eb825e0cee739e2eb1b8df5efe0ea12ecb020b8928063af960fa9a4f9c34f246813b06ed62744afd1595b282\", \"9161a221e0bc0c8faca8664e12f19963c84fd58fbd55cb570ffc7252dd0142cac9741c8914588e481f494fbcc51dd0c267c2f7b2e3a7020ee5884279dc72698281\", \"23bd61c5efe6bf67ccd7cf5c1dd362675a40d533d42a69efd8ccef5966a186c7f23397aaec1ee5367014db2c4b110018f3ec47dace052e46425e7bc065619f8f83\", \"0d2317fbc7c46a318fceeba04c050b4d87ba8f605364ac36be38c988b531ced5e960811b50b597b774555916100f917eaf10e371c7e3e521ca4e3bcc9174156a\", \"580b2255e939b9f07affd7cb53b47a948a653ab8c83ae12a88f058f3961fc88fb78a55cf6962c038960cae1c4c5373ad254fdeb8c0e73b744ed02487f0ddf55302\", \"e5af289f4f72101636927b5cc0b7035664a732486f3b45ecfcf5280c930ef600cb3ba4108768b6039cf9e03d2550317762367114775daed19997b87a0555fe4b82\", \"ca13d66107ee0679c74de376f48c0985af6a6140439ad8ce045e0216d088cd96e8d69473b1e5c1b28b7c6fcf5be1161e0de150cea369b7c81d789705e117143d\", \"d01854415d41b72f0ab7a0a352070569648e92243de5319c4e3d50992e3e4e2edecd21857caa4b1e9e0a421f2683594bebe6feb2ab13e9a256469255602d1e4681\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"5a7a3bc5a6ac62d53cdc3f07e8ea8d7193c33aa8b228480f54ed24927fc2eef017fa7562197c4b22ef711e3e68fd43c89373d690a3bc90fadfdf506e48deb1cd81\", \"e4d23cdccd61b75de065dcc1dee646446ecc15be8e2587026202261f9de6144453b2e3c6c80e2f055934b7a8920bdca6219f5c74bad4e47b15c336ad8af2d97201\", \"99545e67d8a6300d3ea763ff8d4d3592607c863af68d974f7455af9845a7f3e4e56feeec5a6cc651c8a2cd59318514613c4c36d5c677b2dce7509ba04b76144c83\", \"5ff60567289c081d2a2be83ab3cdbf1df04fa611c48761381687deff378c1851cd8c2c690ae64f618989ae809a4697a2795f9382d7b4ab3b0cbc1999e972dba801\", \"f6dbaa4f7e21481177ccbdc20c79a06eddb7f5aef7e8bf2bb15fcda0b626304effef537dba2fb030c5457028cd47620357a36616ebc03c05d0be73e0575655f283\", \"b5649e02ca096577500d9e32ed33cddd06a8e295f50958c62db3797620e3fc68cf8b0a771bb5127adad96117d6b394351d69dc1c326ad06996eb8bbc3120764283\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"33da902da8d5e00c2c3b98c29ac5a5584f42e606186d76b91e2e8b24de9d3bcfd3a6028ca219081f9692fcc1062a1d11d82b874962ee05fa79ddd94053fb7c0081\", \"05a613ef620138483a8a3b22b66e22ae52ae8e93af16b79e594e6d7c646c131b2fadb8132f34a069f541795096726332b7e30efadd567cea475aa7ec92b3932102\", \"d478d7fb5c3c5d7a18685ce12dd5fd9091b539bda120207c3f564468a9e6f741c861a9dc82dc3f30df39bf15bbb3ef5c0b65ac0d73a19a5d68595cd840329a8703\", \"e050d56b7472dad7184b25a873554f8a17b2c1301206441e0c12f3b1e693d1d08ea0f9132b0ed51507e6b02a02ba2b6405afd64fba5dd00db2547e4dc91c083483\", \"20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206a4e69b2d742382fd2d0b1868b4f46c13f517106779a6a84cdb82cc93236c620ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad2024f8eac36f01b445e4e05ccbda5d9837ff02b817111f34eb558803358a912a5cad20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ad20aacac216c65acb65ef3292a5f58cd89c7b776ab275013d8a6787178c9f7d42a9ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad206caf8054a443c5f9bf7801c6777845f7d20ceb354457606c181abd059e61439bad200e3860eda17de017eeda334700d195c3489b9ce431ffc94162f935fd610d2354ad20edcc845d90377d6eb9b1ba687cafa22c44d0f7e8c97287e4e7eb1957a61f9755ad207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369922219aacccb81dde864a3ec40f7c21a3eb8f46c49c9a6994071aadbfa97168c7c64bfdd97d5d3271ab928ae76e5623ba7d07b188d7730ab7eeb107a27c6eb0f8be1a390cc3e305bfbd2465df21ce81c8757e8fd4f919ac1910e9b12e8ace1c156c6aa3bd0fb78611d2427aa9d66c53b6dd1ea581e1e02aa0fcf225d9954e28b54c96f697a7bb32d3344724c289f975baf6fb6a610298cf3ab7b48bc1a572854ef455f8f94906872fcdddbd9c69123ba3e37df0d5957477116d3e27701e750ab6bf49c94f22272e9428faf1bd5cd40ce646d682c490f2c884fe432ef578e6f0312a05072c8ded55048a84110539f7afbcf82c40e617d46c3e4d1fc146955518e3c1d75bee0a7f6e2696c22018a172015efca0c777be1921fc7ae15904975690bdf2e6d377467ec6d797eaddb36a951f6c721d32620e2a3c0d329704dcd15b7f71e451376176e2f55c3c2221a739607450191971d5992e750ad1451d6be82b7f6cf6936e6b1a3a12a398c2d5b5c2ecacf11b1e8a5face090fdc96f6614bd953dadc618cf7f3a0d639ba509d355272eadbcb76778d4d1d605237c1cf557850c008acfa6a9da80a755a207eb5a3ad02b1a2cff248af93ddec122a727b43b9e8dbb8b2911ad5a3c4781fcdc9458446cd8039a7a21ad2b04a0c05bedfec6a225c83df68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f6840c641bb58cad923fc4f9c092164413ff4ce6",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4e01000000192acd32dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cbd000000000851923c0387ee7a00000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a632000000\", \"prevouts\": [\"a0f6280000000000225120371978f5545190cd02a51377bbff85a41bb9eff83258c615791f81074881249a\", \"d6ad540000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"804c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ef50ce65e1ce97b405f0b78362b0983814277331f92d6e6fe48e5fe1e54fcd63d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51b44d35a0b3fc5d8cdca17f6fd766b3b7f076a7a891ad519d38c56688c70ff9dbd0313c1abdf0fb4e55d9b6d58af17743a20615f5654a8f167dbe9f4cf3a09059\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5280\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368815cfc997b4033dd639313db9a5ccb74d87c30d58988500dc693d33d8197cd820e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e16014c92f678e181bf1dc3c918b3709f7d7746b7ca1ad43207ed3c2b1249c00bdd0313c1abdf0fb4e55d9b6d58af17743a20615f5654a8f167dbe9f4cf3a09059\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f6907b785c509927b03981052c87de1c9ae5f772",
    "content": "{\"tx\": \"bfeaf70b038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41d02000000f8f102f060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270de010000002f563892dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2d00000000c1b137a404a710660000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac34000000\", \"prevouts\": [\"f4c73700000000002251209c711009ff170e3e5e8c60ed867f1e7c5df59ef27f30fd46ce0613d7fdb82b23\", \"a13c0e0000000000225120703c36fe53a423407a1cf4f4b00ea153b2ec4ec02148a4b96436a11f0ee0e0e9\", \"0f2d22000000000022512022abfe1c27b62198bb616e4483022cc980778bee956a61d21a3456cf5e2e41f8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"f5\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93648f8d343e45b2a3fbb17d68cee821227f9a1b53be93535e58c68639dc86e84fc4b6f5261b409d682c30910e7df322d9859114aeb60c7168b8885bdaa0165cc6510b3b87e8b9d8544644738d4851bae032b2bf37d3a4aa6541b936ff18c715610c711f738010c3c65afa09c620b919c88f85303c8a6c3749257da2d218fa6976b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c7e8952e748deb89d7f1315439c5970ec42920b4cab4cfb00d3d1dcb758e23bdbdcbe75f074483e48d717af2cfa8ab1bbef1c35fc84f016c108dd10256d535ae10b3b87e8b9d8544644738d4851bae032b2bf37d3a4aa6541b936ff18c715610c711f738010c3c65afa09c620b919c88f85303c8a6c3749257da2d218fa6976b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f69458974b285f9c2ac48a1bd10b3dff2d042a8d",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4100000000055c6482dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfa00000000f46499b502d29a9d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8767d58622\", \"prevouts\": [\"f8df48000000000017a9144370350f30aa8f875e3d2a13be81f25f19bf1a6387\", \"14b556000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/disabled_checkmultisig\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"aed9d1017c0dd38a96d1e076c25f1e3d396e1e569f80f4dca4d688d65ac11e828bc6af326eaad2a1f9a4625c2278c8209f1bd3c12e9c3a733342c6323d88d76d\", \"20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365cd2d09394ee01f4cbf453b8e43120c6bca0157ff833036c4a91161ae8d6db3dd3595e47f783dea9cd898c640c1ccf4b7d0ff5bfa4236f535dc6b4728299c1d69fb9e9eefbd8dee3e5857c0a5c3742d0e58764b1e6eec73b89290af63b7ef8123f752582a11afed87b1aeeab00a91ac5167325e0fc3825def3a8307d2082c1acae8c13f957496bd85a8bfb196b41115877f1c292877d449cb5d56eb109a1f8e695176267bbd1b7867e2eebc439e9f1978d6a17134b75a8bbf0107687388ddeb5ca20cf31e30816ef7bffd0e43d4efa6c46d11185474d89ac75f693a7c477baa289311c864108ea260dd739a7c927abea94bbd3ef2fa436b5348a12a03476bb9e451f31f95136dbefe9a42f2bb6868f993acae25cfce8fc0d73b984508d267a487b041864f4ad19f6b2782b89895068e96969bc0c0cb50b64c3b84612df4c73208c4bcf6cb070e67449ea1a036232a8155856b27be4c634558db013e06b79c26858824757e3ab18b9476867ac69e63e36877af9fee4aeb519472ff5a504bc7e1bb8a70b57e599289922abee7f7cb3f5c4b4e0126255c9af59ddd6c8d572a0551d9a0b10fc29ed9ec9ba811a78159d56d191855f20d80384a7f598d54defaeda75074e07476023602dfde1c8d0d124f96edbab4af8198f97e6bceba6cad7de517a8f5d6ef56d49b8ba11f647b86ee2428967481742dac54c1b1db96e16689b33190eb95b56bdead0c1a3e523ddf7bef5f6922dc6a17860d350d0b88526962aa6ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"310c75ef236fb8a50f79dee81581f474d0f8d39b2916f41991bdc08b1b780ead780e8c9f8fb115ef6d378b02de75443baabaadc650ac39cb7851392eec0635b1\", \"007c5120871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2051ae\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936292edf0afd686b76454ac87df521bc1c20693b4cbf4ff29ba5f26b82aeaaa557bb511d41255530c42c2dc7568891b0d4b6b428c113fd1f437f7663a920fae46b0695b1973a2559bc98006a7e217715863e999230b7b20484f04307e013c080eef35b474f97b8f06ea4e4e04f1e5d63321171a362b4f33b759b3e933f71931b5f724d1f762b37e5b1fff0421819b284e552d24d26eee84e6ec01115c5d0f886b3832c6aa2a8b18e93eb8bf2f5c97352e53451353dbac83899f0e369de8412999b8da44e477b0203d3bbaa363dadfbc71173258c4fb1f25bd6c995929d401498b15cdc7b86143259203add30582e3161638396fc272dbcd8b6a4efe6b4969c5cdb375f270f52c7be2d12ffd3fb62aa84f7ad164a11de5eefbe5a620438d35e655d5ba471096a5b3a3357976911e74f87b4ef980a685ede1cf19d01f46ed9b6e0b39b0cb365e6bcc032bc02d2b91a16da658905aec2c93de3186efdb1d567fbc8d5464e05bf50edce7b1f5ca81822687132cf7d30ed84f6dc8ca7e183a338d302e00ae160e990742032df386ec8547eb181c0d102fa876c1cd80d9ef530fa1c065d2e5262a94fc3ddd3fb5606be458b593782b16d00ce4762d13e98a6ec8488c560f68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f6a06f14f3641278ceae3733db1a7eff71fb3629",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c413000000006d7c0687bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0c02000000532d33930418b6b700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc996e2420\", \"prevouts\": [\"69f4340000000000225120ae011602bde14b63ddf579d7a3b02b5b10535576fec511bc89b313092adfef76\", \"b9e8840000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e36be21c1648e42ff0cc711472cd6fa783cd04cc1a12cd7af689e55d54a52071fc4c1d6826bb0f1d5981ad6014666f42c52f676caf3c2187a661492d3fafafed82e1a580356f2c3a1a179b7cef7b39b49972988463d10195305286c35b7ad54df1cceb82e3f641483b8c3c9f963194b5c8793d1673c4a40b8a1867297fafa77b7ff7278efb9d558c925fd26f9c98693943bc15a755d11f35835b301e80e48e9b2d480c9b6960c4f0347f08f63e0f781f33cd4bf4d3173f90438b58be65d784abcc8900f529dc1959b4efc92adfc954bcb0cc77cf775752798608ff7c25a74ab7f1621b238565bf9a84b5b69659e6fea49cb7b424bd76857bcd207c307c3c2495bfe976eb42421217602baff585fd0cf0f73fd3d12c7f60fe223e29d9e77da2323963462de7ecd65c1faae9c8a01007736b9eaccac9e3c2009c7aed6a0f7d5abc32d161db66575b2ec12ab9e3f7b928558827ab45565d2ccfe5f4c9713dc5c25be16cd36b640be42de607238d50ee5e8177691c96f106b0bc902c3d31863dac864d4518f0477e02f4d0094d255241732967ebf938e88001e42a47baadb3c59d0a68f447a28884229864d6739812e320509271e17eb73d075a58fcdd1caa882482f3692a526e3c72f415383940741acd814b29d0503dfed2a892a8718f25ee76851e96790cf593939abe4e9ce44dd4a5fc80f2b3966d5cda20296e6fb95c61576a081424d628d5f6e07775\", \"e97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369671c715ab747f188f78ea32a93d5e14629a692e3e2d5c6a647d72992224b4dd6b9e5e4bd2cefcda110a5bf613694738c198174b403d264db4691720c8f18fc7b8321554bafe286e6661652cf416d3db0b455024b23404eea069d656c79e4f25\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902298d3654df85d1808fa4010a2758851d10cadb7c379115188a2388efa55be047d32340f236402d8e23cc9df254834bcdf632e60ef3858c051388dd3c8c023efca9373f968e3fa3d04454509135b46595d593ed1ba378371ebfa3ce86a5be46967f6c2db967e8f8291a4670427597d2e7a038025116060540c1b3ccfa4e428e17b0743d32ca427518d519e455bf8d647594f741aefb3f5335814d4bab0350883beb8cbc8aadf04e404a1baf6e8c7de7a8048867f72960d8253178bb587fa3fbf2fd13e13a160f463eebe3e888f574630d1c377be77e2b191871ad70db5bcb1f28e0cd4a0ddd43b39bb13350250be38c77a295448f71b243af03fae6ba0661c4071bfd8a67df2112a90f938cc36918f96c12e7dca1ee67b42796853bb2c096ce474a494326d4eac9dd52631716af52d4b9bef9d8f79126d032374baa5b9e17d75b557e26156378e2424d9605afaafaf26bd0ff7bfcef1aeabf504ac544cdea7760977ca008e4f66ac3cc8d036094956ed9133caab023655569902bd4a67e84310797aca194586d0f26762bad409ce4c26a9fe9a5cdbcb918e905e25f8caca4aec17dfb249f66bd1cf8d459adac779cab51c7db717a8ea39d659b5d469bafd99e0fa1170bf35d84b79befd1ce1de8f5c72b30613f3cd0f46a39b2e9430376ff969b8d40890eba045b9ede56b33cf5ff845cad7a3ce54182cd4d3831194fbbfe4a39e08c61719f075de1ea75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082a602e473c0179dfd44294f4ddb50d827cec9d4b4e0c6eae7f68c0301f0fdfe7e6b9e5e4bd2cefcda110a5bf613694738c198174b403d264db4691720c8f18fc7b8321554bafe286e6661652cf416d3db0b455024b23404eea069d656c79e4f25\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f6c823a2b3203faddc06a15a61e6f0e3f3e7fe8e",
    "content": "{\"tx\": \"f912fae802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0902000000bd0732c4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5c01000000dba8b4d3014d37660000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7966d030000\", \"prevouts\": [\"836c7c00000000002251206a4d91ff9a31e9c489593487b5cb005a27e6a3c932fea2fea0a301cdd0cfcec5\", \"b5d1240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_58\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"d8b0e4d224996352ba73ef996183b9955d073f1ec60363c33c9b3611957f30c16f4f4dfe36456bec60864ff270df7d30a37ada20b2507c92ef3e1f8b5c274aa501\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8272257499a041d5be190b5af3f96ca07c354a873b1e4ad8a69c466b0d3b9d43cb5a14514c1b74762c9bb7b8ae5543e96d291e2c61767de540d8f4cd217b2d8858\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f6d3771166a0c4e00527b2be21466030fb499521",
    "content": "{\"tx\": \"72ce730f02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bbb01000000937aa8c7bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd400000000e0a2bed102189b98000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787660da74c\", \"prevouts\": [\"89f4240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e849750000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_26\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f6389311b4cb31cdf1ec12d0c4c39eec5db5b2c7de54a20afd089d6665dc93ab1086ceb2918a717616a0ae0a21da80696cf7d7b3abd8f9e1ea8f05ea3082b67f83\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d366f265a60c2caf049c130814921283978a9e885bba37faa953b7189b62ae62d2a1341debcfe6a8ba82269c181e9958a3dfb04f99fe8dbed5f54a999a6a3dab26\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f6d618ef7f588f9fc237b18f4ad42a84337ec67e",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1501000000e3ee7de3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c32010000003f2fec4a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b8010000006499adc6032e11bf00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc77d690e25\", \"prevouts\": [\"38975c0000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\", \"cb9154000000000022512096d49a663447a0304343e0ca844d9bda5a7da8dbda233b650dfa03e219f7bd31\", \"eee1100000000000225120ef3d9168d15fec7bf262c68665e35843469e387edd931854cfe5c2fa2f3223f0\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c0beb567ca3cf5eec8f2b4fea5c0d7ede6fbc0bbc7906d90d754244e5b426617\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6aa3616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f6e85bce5c033f269bbb51eb480ff58e9d814ed5",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8701000000bf8067dedff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565ca100000000d2a15cb9029568c300000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47876b040000\", \"prevouts\": [\"d3fe700000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e24b550000000000165e142540f27e90740933c99d4f17ab2dfc6c82951cfb\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"77294239263c63cefaee8399c5c256965186c29241155919927710f05cfc7ab085a3c7586e312813f4daf6b24586e46458d0c39ec1aa96a749e9e0c8388113fc\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f6f146c32b1b724af896fdd11df580e1dc8f0e35",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4be700000000d5ae6cd9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c040200000082777c9703cb766a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79656000000\", \"prevouts\": [\"4bf723000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"ef46480000000000225120ed261f3c61e168679c7f8a74453f2ce25dbf3ff98d002ebf2f6af0aeed189847\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/unkpk/checksigverify\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"9052e2b91c7f9ae1f160eb25db4ec360f7c239e15cca9ef5cb5d4358e1a3ee40d22f10a082e8b4ddcb79ab7f09810a157961849e76c255316cd6a56dc79a2a8d\", \"51ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bbc3da94060df099fde0d42b14bc2e005dd93c33495760511801ba15172f1f8d32782ebac08ee6855f863e78330cad81cc31684ecb08218331c6703e74d17ccdefb59a23293ea293fbf595ca4a3e5e00978c3fc1dcebbd125cbee91d2f1baea984f7f489c7d362405973d36f4ddc9c75260e31c037739aed91636c98efe375e5a4bb5a7c059035c2e1c5c045ea9950eb94ee0ec4463d646d9ffda84a02686f9fc4dcc13930ebf47f3b4a6b88080c0c6eb26d453af90a7fa4d8ab4db56eb36af7e0957f1affba45cff2900ae03ba8247c0570ad2c8e23a25e0e08aff668b2d11ff3cd9a7cdd1a85d506666c817a8f8dbdeadcbb31e576859629344cf4897025483c91c79f084c70ab4e7b7949b54a5e17ec2df6fc4020f94f5331e2d487fe252cedbd71523ec723318df75e8be30db5a3e2d050e114f6b0a5a9d375f5e1fbe58bece622d42e15d9a09f8ac238b01a6949cb9ab79b540250a90b3fc35ed3b857ba67cba4445e9cd0a613a5e6e514eea7a9da662a1fb003dc0b1555d407474a0fa29f0302a595cadbe6f0743d5ef50dc2b0826f0f2e0e84d35ce4b31a2be87bad075dfde575d48d1eaafa8343c63d6f5425984d2425aca274be02e47a5142e089ba2e5262a94fc3ddd3fb5606be458b593782b16d00ce4762d13e98a6ec8488c560f68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"b77469896fbf3afeddec7e54649c6d0e986504ed0008e67814744deea8a6e70d8bed50e6e42f9b29ccd3b9a09f71629b9c92c84dbe343a0150e3e60aa2c2ee03\", \"00ad51\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367b37f9cba90643389dcb84f8bb3d7354cace0c9189961587fd423479e33fe4bca7f7bc4310acf33ff6106d71eeafb5e618c06787526c83b3a4f243d9848205cbcd98a80529c2a931358c54a01926483afd2817144d11587481c84348a7a5d142851dee7e8956e7989ef1b2310726d24273d46cfad50082ad927e9fc98f9c143d160fce98e5a349b93a878297fe66e998ee720c75d1643072843d75bdb4b18b12adcdd58f284ab1c59b498a19651ff144478d4b0b5a2922bd70cb075f336fe9f4b68777d0bbd7b6c4a577c7fea562e9f4fea2126efe76f3d0ad98be5dbd6871c94c0000d45126f851620d2066634add2abef2580dc803514e3ba652e78e482b6135b10babe6957670b3c4aa2c76f4112b74affc1af435c8383e13a10ccc3e8ee7052652d5467ddd2e384b678ffc365e66fbacf63a4fbd01922cf714b18ee68a4e383d323036182d3162529448348339fc9acae0372091043e56911cb51e390ea725dd19e02d4685ba017b89767b5c8376f6b66370e3202d9e807c9c5b06b99c098acfa6a9da80a755a207eb5a3ad02b1a2cff248af93ddec122a727b43b9e8dbb8b2911ad5a3c4781fcdc9458446cd8039a7a21ad2b04a0c05bedfec6a225c83df68f68735c6d9c5f75ce1cd0826710bb7023c4213b88fb8cd1791f3b2383bd77612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f70b704bb277d70481b756371e4d92b9dadb2d85",
    "content": "{\"tx\": \"55f3a2c603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5b010000003b874fecdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c0b01000000e740bcee8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4580100000096508f98011c849e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac56000000\", \"prevouts\": [\"4ff72300000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\", \"9d0f53000000000022512081f3e2c470dc60fc961d81e2d216f02fa45ed4c5eaf6bbbfbde0597598d4a1a0\", \"b9943e0000000000225120beebf2e29d62b55aba368e7e892512e69e2ef37d942bd7f6bc768a8958380305\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_4\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"036270b0fc922629af9d63df0a2ab1f46f62774a4d49b9604e7bbf7db065c708d5d745623ba42c6c792c3d243151db0298b9ed05baabc80c066f3b0b63c54bbd\", \"0ed26051fdfc5ff86fe6bada6ea9bd8841a38f63540bbe26b6dfafbd64a6a36eabf6c8b1a72e44f91b0ffcae2817f0f1bdbee6e5942b36dc3d892c176b779780953b03d354a3c15990cac2633355c6742c12b017553d672a6f944d38fdc50fbd186aba36577d09\", \"75000442c44132ac91690442c441326eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93697dbf8400667a0dd303fd91e8013ba1d04386425162936fe2029a8afb99ef7630000000000000000000000000000000000000000000000000000000000000000f9494ae9ab3a13b399d1a99414c0dbfe988d321676a1369253d0947894d0e537ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b49ecd98b5550e84a046a1812fb9d2c8d6182b88714d81ba4f60a0f5c6786604cf596788c84aa55abe532dd5d9848325503b324a4448506244ab0beefa59afcd34a47132b9344dce2c6ac0e777413d180d953c5a5875c046e5c0ad7653d19ea4142929a8ed6adb2a42e6b452112251116eebf7d902ca69fb0131f05456491eec1ef250b54f3081b3d98c96b290bfe3c2982c7741c64c8c68fbb05418f3ee34a3ef1dea874d6c44b1cfe017cc6acefa04d2e78ced15f458d79c76a693371216777f9a9632bef7a9fb6626fa7757897a30bd0829794b033b9be37803c1522ab52520c20b03ecd6549ff484e2d4ad57d2cb9e9ea0f8bdc15e86afe888f74cd5f9820ee3f1256cafcdd30219e28a6f3bf0f5c0ebe5f8ab689ca043c8c5a0494889b8d16091b4146e242203bca30779b8d23639a61b9a51eca2138b5bf777b7f662700000000000000000000000000000000000000000000000000000000000000002ec568c67ae88fbd52b9b91de3017124822d2ce5bb02f6c60aac9ebdf845cce052a47df41371558bb4153c50ba007885a09b762513b138bdec543facbb1e6a0f0a93e1a29012bb0cf497e58f1abf75ed87247377d54c33b2ca4c1eb2b248ab040000000000000000000000000000000000000000000000000000000000000000\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"036270b0fc922629af9d63df0a2ab1f46f62774a4d49b9604e7bbf7db065c708d5d745623ba42c6c792c3d243151db0298b9ed05baabc80c066f3b0b63c54bbd\", \"ea74b91e0b130c5b1cea451c5593b7ac2e850d2862493ccbfe16fea3bb6fed5e9b84f21b014ecc9f8e0bbf5a9a945f89f44e173ee98681093dcb2173f950fa7921c314dba5e763c534bb35063aa8eb427d8bbdab9e4ef8c502392eb1c24a121c9bb0922b818d\", \"75000442c44132ac91690442c441326eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac696eac69ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93697dbf8400667a0dd303fd91e8013ba1d04386425162936fe2029a8afb99ef7630000000000000000000000000000000000000000000000000000000000000000f9494ae9ab3a13b399d1a99414c0dbfe988d321676a1369253d0947894d0e537ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b49ecd98b5550e84a046a1812fb9d2c8d6182b88714d81ba4f60a0f5c6786604cf596788c84aa55abe532dd5d9848325503b324a4448506244ab0beefa59afcd34a47132b9344dce2c6ac0e777413d180d953c5a5875c046e5c0ad7653d19ea4142929a8ed6adb2a42e6b452112251116eebf7d902ca69fb0131f05456491eec1ef250b54f3081b3d98c96b290bfe3c2982c7741c64c8c68fbb05418f3ee34a3ef1dea874d6c44b1cfe017cc6acefa04d2e78ced15f458d79c76a693371216777f9a9632bef7a9fb6626fa7757897a30bd0829794b033b9be37803c1522ab52520c20b03ecd6549ff484e2d4ad57d2cb9e9ea0f8bdc15e86afe888f74cd5f9820ee3f1256cafcdd30219e28a6f3bf0f5c0ebe5f8ab689ca043c8c5a0494889b8d16091b4146e242203bca30779b8d23639a61b9a51eca2138b5bf777b7f662700000000000000000000000000000000000000000000000000000000000000002ec568c67ae88fbd52b9b91de3017124822d2ce5bb02f6c60aac9ebdf845cce052a47df41371558bb4153c50ba007885a09b762513b138bdec543facbb1e6a0f0a93e1a29012bb0cf497e58f1abf75ed87247377d54c33b2ca4c1eb2b248ab040000000000000000000000000000000000000000000000000000000000000000\", \"50d75b87fd561093bd1edd2d0501486fd64623253e0326c9df75ae6d8122d03b0dbf5ac7d883a45caab5f1f88fe684f21edeb8e93d9c7f031ff5e6c076e355ebe44b3d6910f92de91b4af4de773b65ede2767a7a68132ad63f3b140ef72cc1b2d4ecd05b709c31e84caba9ef44410127462d55c90b1f5b987dfa5ffd882da2aaf36e082aa548e3f29cf6a272be3ce0059aa5852a462670c31f0cb3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f747e1181b2e9303715bc0aea1cfca3babf00705",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2601000000813b7ae6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc100000000e9fc16df02e0e58e000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac31c5cb4e\", \"prevouts\": [\"c5496a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c351270000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_12\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"480b7d8154a08c33eb6752cd1a4ef32b3449233137562497e14b1ea02883727605cc99492a3a1a1f9be0448e7cb795486db3b2b5de7fb79c823984c76175eb9681\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7226559f0c7bcb20d2085b483fb75f2cbf4bdc32a89eed872dbe51ef1883c8adf6738c3855456940aebc36d087905349230a1db61ce23a0f35e1bda75a7dee9c12\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f75c71bf10464658e79f72142b2c327cd6ca3347",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2901000000e28d14cabcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf02010000006dad27f30176a80c000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478703010000\", \"prevouts\": [\"44a84d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9959750000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_d6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f1b9973e470f973281d092e638a52fb208bad47e7949649360975f9c67c743a27fa0694e11f98cdc86fafbe22e1d62fa622aa836c23b8f276907b7ce14610a99\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d301dabe5979a7e1d10219111f780ebabb52e9b37e1a33bc89020f5796dcefc60d1f8decc3378350da498359bcd57b8f1ae6fae1b2a714688b49b80ae0ab191ed6\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f77abd655150de8bda3b775fd291d5b2bf27a1e6",
    "content": "{\"tx\": \"fb4d73380260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700b020000008922b8d1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b10020000009e066ca8014bde00000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87e8020000\", \"prevouts\": [\"02ba0f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"5647260000000000225120d09696ea45889505661e270865d17ca69a086fe0d8b7bd5ea027866d2c9b9156\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_36\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3061bc88d1f8fb9ae3acd15cb6480b37fb1ecb8e164513fecce8772ee4492c1226124378f7a795307872588d406361d758367f77217177fae8a2dcb16a90a63f03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3f5ab886cd9f588668f98639c13ac441a1bb186252f21c08f8a809612be7d5341d21a2a144267fe311dbc39c8e5f09c491584a4398cf3dbc1f170ef6d41311d436\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f77e7d751660a7149e80488c8245aeb9be6eeb1d",
    "content": "{\"tx\": \"30e73289018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b300000000a96cda9602f2983300000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc1c010000\", \"prevouts\": [\"255a36000000000022512063eb770f298cfb14c87c6cff1e0541dd7cbc30bdbab4472c0f37d52bd55ad696\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"ba7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8a0ef97ab7ee9fc1eac24be41bfdadcbb7c9625a4e882ca5abbd81147d09c0527a47630aaed9dd66550bfcb0f3b3ec2bd830a8a42bcee9dbdef471b4e5cf2e89f5668d978bcc8d3ac0b8aded42d2a4a1c5e69a5396581e310868cb48ff813edbf\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93654dfb6f6b9a2b04f4592afe6e08b27d0dfb1567237811ea996f2ccf3ff1cd1054a7888d88a49f036a686b85959429d2c21b5cc7c31f53deb0eff848be794e4af5668d978bcc8d3ac0b8aded42d2a4a1c5e69a5396581e310868cb48ff813edbf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f796e5b0c5ce67017c553a21907fd6a51a1058eb",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fe0000000085a123a1dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb8010000002f037acc0296cc62000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcf7000000\", \"prevouts\": [\"d9ef3d00000000002251206830c8b1ebe925261a77111fca109651f909c8747b4715cea67841710683246d\", \"f66a270000000000225120a91988f47123ec31105f67d71740ec744dd8d7d897f95cb0546a10e5e456f756\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"a47d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdea84c8431ee0615517346b97932410ca977012a316263f78a9edf0a452e478a09da521cfc521edd35405d6ff7b10120e980b699014de05f8e600b437ffa9c347\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e1a56f6cf7d9f4db4b4e32634d67c1bdca6b80e06b787823c0e4d06c57c1163a2ec4f69e5cd9a0f0c1fda8eb2f54297e33bc5edab35b299e65e2653a923d6ca55\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f798f952feda25e6fc4b37a429dc368f73d0d158",
    "content": "{\"tx\": \"e714d45702bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf73000000005e8f3194dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1b000000008732789101f288010000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e798010000\", \"prevouts\": [\"9d317d00000000002251208f0cd91064976d8c425b1144e179a495d561ff85b6a95fed9a42cd95fa3d7aa3\", \"c26c240000000000225120396e1e3d37873693c049a0e141d36811f0051f76fd306cc6c1f2259368cdf0eb\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a2191cad4ac12fc03830217686fec87e60d095f1111907bb3fc06c0d6cb47e9809d042e702d6585841677c1d14763cb36c9cf9f668493ce4cd15571f69d2f697179cdb4aab317c820c41a985d9eea9953d9e4054f3c25b68c5ebac916139b8e40c29d98022d8ab7081822017ab0809762cd4a4f5b1d33d82e2d2d0187700ca3d79c3fdcdb40df1ebba49aecd234c8cd212a69165fff9957698ab22410ebd0e5c41342876b1d991ecd30526be45b908ba6ad7b0ff90eb7d39eeb2ef6176312bafd71c9d0d6046c2e69d0c5e59626d682d1730ba38a4f43dde27c6f2a00ee503599021c0100103e0ca94d893e93a9449d267c72f0394e3fd1671b99cea4f9590f442a99db365d7ddb2d50e4bee950b3a3802bf61a3f1ff7cbbb657ceec9858e9f7290270d3910323915e903d7800ce1f94345ff1a598ac38a9a5f0e27ad9b92d540dd86a17c8e0e0a48bf009378f99188b2e3df63f3820b5c86cecaf4360aff5abcf14b6fe19f45c795d61a3e2ab3b8547e90fb962bfe370585e9bdf7a2a5216e0b4371f3f8fc1d0533da33906017e2ef2a1283a4a52405c3eaa3cce9b937579c9cbc767e0253d4b81120cca717360c57d25292afb7cc281035dfc8d36f964a55507ddb17f8d55e913f364bad11bbece123c3ff1c87a5e5e4eee264117eaa03595bf3d5d4a7d462db97e5f1571d046ca94ffd6e6a6f63c20062c81e55f0ae7ed8b00b2865e8250c7b77d75\", \"de7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e093a387cbf4f722495a20cca4e5071672ad9cff48cf2966de7657b6ee347f57da05e4a06b32de803bd9a925f4d86502b21cf2d106a73f15ada31e997750cbc80\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902feb5b4d617c72000c837d6307c9a30d8365d505597ec5ff3f4f32e6f589eb00bdf835db950509d560d0e40d3b94de30edcea7a2a5260ca56ddc0e1222b280a0edb9d6d583f25d177bd2e55443bce9f60368b6cedc5cf2f25e6d9a43e06c47d62e8b10f312baea422b66c701fe376b3c5d8b92e32011119fd7426df10add06d81944dc34da46e699aec2de5d305356cdcffc247a383df4414223860679cf4b308ec7c3e7628e1553f7c4503725c2a6538a6668b733b29471b00469f98e44b660ce5e7f73a60161df48f9fbde9ff86b8ae17e3d10fd5ae3d4fe2f6b79ff0b84f81368560a10d2a0c0ad6426d893254a030e6083ff84a37f32dd2f1604142d67e592b8c492212eab69b51546d79b805152c900dca19749ca760ad199a1e7b66d8677fd14b0f20474a91e0bef5e80788d714116b33bfcc3c61195e2e39c8686dfe0828696b4802fe6da812add1835f79fcadc8d5d9bbee1a51af5f51f354fda784e165e420613a9a0c08b315420c375f2f99f158fbb498d5313c89ba219294d2498e8511ccbaade19b35e2565d713da355e1b084a697327b8903efa56e50ac96199b29e357950c047b2bf7ba9e7b56624cdf649aa3f85dacb6df9ceaa924662e8ab5455af556e5c5ee729e2c525856bce73ff55d299daefcd1986720cb6a8b8a9c81af3b63dc652cf16f0be06631add05120349cd6a2a7c345161a41f5ffacbe5a67e00b2daad959da092a75\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93634583728296d6d19ab926bb0bc1431ae6daddd06bee0d19ae3ca41fbe739f4c746c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa827b55d11351c6fed41de6d200bca95500243dcc7874125f5161f5be208848f0ac1d0874bb493d5b277fe586a1908760dedf191b70e37bd9b06448d9d8257f0a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f7a5375d5d273e7eda804ac9335745a3fcc568ae",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5d000000006fb370c1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfa501000000e51bbcae03ddc2c000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc7ee3e34d\", \"prevouts\": [\"52205d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"6c5565000000000017a914ca8d66b8079fd8386ff3ae1d10b869f5605e693b87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"1651142540f27e90740933c99d4f17ab2dfc6c82951cfb\", \"witness\": [\"0a3bb896097a419e1dd2142d15ca29cdce58ca25683519d007c0375247923e3e112da8695311c8ace1290f454cdf8fa643597d91a8702a4515891dc6f5689f73\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f7ab44a4e73a9b24bfff6a263c608abce5696639",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdc01000000f1553faf8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41f020000004d967d93dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b20000000009c7a29f501e4bd6e00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac9946af3a\", \"prevouts\": [\"8fa24e0000000000225120979ac728ddd945fd0096bd7ed70641d6c3e965c9318f95ca3c406aaae5bf23bb\", \"07ca3b000000000017a914a7d99db8790799e567017bcc9951f7f968dba70f87\", \"48721e000000000017a914a1b035f555fd87548264c3580a1f62a42acf027e87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2356212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"witness\": [\"55baa3c845ae5d2061ade5b7acf02ee43b6459a09322cee75fc9544b65c15945e7153e11411e1425e2d5cdf0d108160eb1d096c1608a71c38aa93f5f50781ba3\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f7b76430a96ffa6355eaf12167d0ef405e2669d8",
    "content": "{\"tx\": \"561ea52603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6001000000363305b7dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd501000000b8f01b8d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c442010000002b7372e904bd41b000000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748703000000\", \"prevouts\": [\"f0d7250000000000225120a633ee2ffb44c3c8f2264048054482ed19487fd868fbe840370e2c32dd11b85f\", \"3f614c00000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"cdc840000000000017a9148462ed29696925d7688e1db8e76ef9e6667f05b287\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"d97d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08246c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa2d5942624d66fc39e30c2a996d85a0dad9a6418b79db996452744438b84f9614682a6e83df749f265180f93fd54e474915a8abfc6fef0a760c06d61a0bf42967\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93660530ff30bd14645256530cc55287fd1e806d6d3c7680a3fb3225b836d58fc798cfdf3dc4b41074e6d5bb67bf9f12a242211e880ee715069382ad177c5f1aa2ff72d95b601af8434dcd53e2a5d08dfad1c07e45b1031877afc5b1801af7debef3d33b10ff9eee8ff434f7c79f826d5967b94922da2ad2ccade1cbab3a3658011\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f7bc805d350c55cd8e24def5b79ca3b2fe88ae80",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b5701000000bcb31209dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7301000000fa266ec5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd8010000005d4ca570010206ad000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d3a8b624\", \"prevouts\": [\"82e721000000000017a914fd6ce7566239793444b7f37a40ec4d7b008f5d0c87\", \"d0211f000000000017a914a5f28fe5532719f979169bfa3a31d5746f69452187\", \"fa38720000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_52\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"451c3a5a4904f7bd93ca0073da15e6622e91aa9d593f4a255a29a10d136f3d39108bcf11a3df9953645eec387ca67209671f1858729072f2757a9a7e8eea0b4b02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f4cdefefb6a7bd12030fecb11bd4f83c94cd80777841abdc54f2f8ee1446b5f35388fe861c0f97ec7cd9e5fd29fdd36bfa29ebb009159d7bd11235fc299525a152\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f7c02de0b4f89c043a3ebcb28bcb0e1396fe0e23",
    "content": "{\"tx\": \"0200000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bfc000000001e5111c0bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf720000000083aefab460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270490000000053752fdd0376fea8000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987cb000000\", \"prevouts\": [\"de10240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"8c427700000000002251200b5dd6f00fbd30bf243b0d8b333be0f43818e467cea4a7bf1010683a4a4290b8\", \"5ba60f000000000017a914a2a8d85df2f20a0aaff7224012fc4cee13e29cb987\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"86\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366c9ccce34c09bc03bb8aaff06a11df09f3692c1f74f2178409984d1ab3c04f3715c685a6e20a464c0638846c4feb0cc1ab19a0a1d3cef03660e119c827d202a5d33ab5c29645e0220ea4ffd8cb7e67404885cb8b0cf94872336c7b06d59c3124\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b05e9ad3756e137278ae6e6e7c10c62cfba95395c884b707ca96162ed87516a80d99f698065a0710b414a8468dfa99ef083756205b6b6c9922dcca3ca4b3dec3b4167115de6998fecfb714975bc270adc7a6998f06c7ef8576e15f157ca8963750636431b24706e8b1111073dac761b2ba654f4832b7b9ae2a348c6845c1d327\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f7c0db2c2ed3c1e6f19acace4e10c0a99df88018",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb9000000001e948b94dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b63010000003a5b129a014d5c680000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc10000000\", \"prevouts\": [\"2162530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"da65220000000000225120e57a7d71b34e22305b9beadfd5a56c380e33d3960d06bf6fd3c82fe378d7b10f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"ea\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045538b2525e5ad3e6ab2346b1907a9f51d3650fdbb6911031be2b995911891caa483976a7e8bc20bfa4c53f64ff2df47d867849c8cbf6df51014735817968d498535c6739a4d626ca1df00777eecd105a7e72aeb1be910a44c9d3be4aa00e70c25\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb4e4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0df322cf06423056ff4efb147ba4330d28398a4f05a11ad98b1121aa54f60b594336f2bcd90a4462875ebc34531696f5fa5671e0fb7e46050530a773670978687e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f7dad92963bb917f67c0a5d9a11c7a623157603e",
    "content": "{\"tx\": \"5bee4af203bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2200000000c005eba660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ed0100000060fdda93bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf65010000000bf347b903f07aea000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914719f78084af863e000acd618ba76df9797223689872898922a\", \"prevouts\": [\"c7c87a0000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\", \"d53a0f00000000002251208be5967f09a51b19904ca66f1d269a3e717a290858b79a423744c21b4f0dcdb2\", \"1e11630000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_50\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"eb5cdf47dfbec4dcdaeaef35da079ac77acd725f50587ecca7066e0927852259a577946b7050f0849503df0416626c9926a787150e48edcc897a7c1234c3d82703\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"07310b3746196baaf0cca9a43862c3752c063b2834466b1b8b7e6695aa9ce37a50f891b00d69260f454a33f88bc50d9e5dc1d06e1d03ebedbbd338d53eaa1fe750\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f7e399c76d4ec4bad55a5e054f90aaefbbefd54a",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6f00000000469d4db760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ca010000008269a1ba0146b74100000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5d010000\", \"prevouts\": [\"31f95a000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\", \"7c1d0e0000000000225120bb20e6409e7fbcbcf1a8716a3f89f05af40f970979e4b2f45be7c2d2ab8f00b7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"81\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0824d4a172c841d8bdf967229e1606322d36b03ac644f3c557c1b9d417f1b2a2a789823c6bcc0c06b1ccedd8f3302fb965778bf11fdbd4830d29cbc62f32a77240ccdb938e1cb9dba9647cc0512f82c526c8f6107930613b31200f04f80acff8889\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362abad23705572fa5091822077faf7723b4aee0fe16a98731801378aa56415cd84d4a172c841d8bdf967229e1606322d36b03ac644f3c557c1b9d417f1b2a2a789823c6bcc0c06b1ccedd8f3302fb965778bf11fdbd4830d29cbc62f32a77240ccdb938e1cb9dba9647cc0512f82c526c8f6107930613b31200f04f80acff8889\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f7eb97d1c42b9d53be75b54f5a30490ace43fa77",
    "content": "{\"tx\": \"0200000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9c01000000ddd5aec9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6b01000000ae192cbfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cdc00000000b552f5a70148b11f000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a69aa3133b\", \"prevouts\": [\"dd388500000000002251207c2a27667caa5d47bc631b21441672d615738889d76e34100e2309c093e91351\", \"3ddc6b00000000001600141cc39a492a6f67587324888ae674f2f534a7639e\", \"1416560000000000225120e177c8d99167d2320778fe30cbe0b2c4ee01065c7b6db09c8aca7c8181e3cf6e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902ab15cafd2ede5df0b79eefab811fb7bf23d150773a2005e95993362dfa0181807d9096773c6cefd6a561c60f1f6ed2d9adba322870f78770d1035077543ce908c3c989d6c2838566e2e0c77c69ebc361c6082778a287a71e13db7019492cb240a7924bc8d20844a965bdcb598be942d1d8e3bf0357828998e34da2d97492f4d9d21f48f4b251a3081001332750ddae2bde2f2acacab391691b74dbbed9a58f72b9ca8017635d948198c2d75f7ecb38ac53b02c7c9d3f162df98cd5389000689129a69b0029d0213ebada0b524d31623669e74791e417841162cac2f5a829cf1c54ccdfa831551a7ff1fe847e981a29323ba89f569dd6e63217f0e41fa778f3946ef506fc4429b56d6c3a6e12617b6fba094948c0c9cd4e11140f5f7adb474e21621380de6c217dc4917ed51d1b5d2faefcc9b0094104d0be7317e48abf0a0d42610da0065ed1c7b4c33f086ee5062d1ee85f809db222b25a4cd04d43feb366a138f45478b782d88267e9a496427d97004c6a47db70fe80643b79cf9eb6cb86072f8523f4ab9c843af629cd1eab91c2c3402983e2930345b21badf98f22498d183adb240a80f6eaf3bd9d13060fa63839c0a00ef15ac0daaf3ddd2f59eede0753b90aa03755ee970676868112f46dcf6def6d8f2191ad46fbc4c04f181e948e5ee1c848c9ff113e92ae8ba80cc5bcc480592edb2132ff572817f5867cc452e4511eb7971489426ef8dd75\", \"b17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8d9568d9f877f6ca0cee9df3d4970d26d0e286b65747316dde3c995de6e71d9f55bc912f5bf4aa2c9ddbc9747d59c78f40d0a0aa0a8a4f22dc70e3f9cdb9b6ae3\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d090237b3b33c6813b46332eba5415ef25009b0be4a356886f771175d6965c9e606364d6e8814308b372830242b4414c1930593f1d8fb8ddcbcbaa4d04f4f2f915416ada3ba16e05c9c637d2e80f9898a78eaaa2e8a08895a658cdfde0fa81692942e778b47b93f7b1ee5f878910f25aba6d16eb0864f7ddf6b3a224c8834eb93d31abeaee611db48e5777ed2f59ec1b298c7aa18fb3ba3659ffc21cdb2f844e734b653ad70613e27345af77fcde0c0013daa0ea60ea8c2faf44e37c150d5dd378fa0d03a2972eea13f92ae4e010deb0c3a0ad0ad04bca0e0875a7b53c327e78abc2cdbb1ef0ca1eda61189f415a92fb5858ffdfa7e9af466f8dc23e1e3f4e5d9fdeb5f456374f9edd0ab0327d1c8854fceaebbcc8f57efaa01b6a07dff5912ffa9350ad06c2b6f9fb810980bb373e0ce6959ccbd6291ce428190e871056b279ee087193ef48b2cd103d4773f981ad407c50006927103a142bff4d5b6e95252b61977fa5ed251eeb01de3e9c2d0d4e461cf3e78c68d080454926d010657ec8824134483d1e4746fa53e27e31ebe36a6c065e80d4aae50811b4f62fe97b2b88232c3f7e906132aa1a1cd8d7a1423b7a49ad555d8f30b94cb6d8d79f28432e3e6d0a92083cc341c0ecb674e79fa18d3918345a117e2fe68719445aeaca5e778ee3738ec3f3d8df273ff76cc72cc7d6ebfc61fcde4db69e29ac1bc172abde56ee3e31f27fd49af471071830d7075\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e7965eeee556c39a9ca7aea66d0df3ed5bb1c1b5d1b815eb2ab41d6c7fc5721f63804e0ef706f1ca5c8b2fa38155abc6bb5e2265734815bc03afdad0836bb7f05989f510e73a03c44610e5cde856f75a0d7582565d561698089d126c5e7f66809\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f7f77a67d9bea0dcf7942ed62f29985930122ff0",
    "content": "{\"tx\": \"c022df1101bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acff4000000009ae69ab7048e3c67000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48733020000\", \"prevouts\": [\"28066a0000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"217d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e4f67f6e69cf51b25bdfcad90ab02b519823ccb2f4612df68d1a9a4df99984c88f488f9b2dd04714e2920653c1afab7d010d81355bbe53edbfcaebea15ff1da48\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fe391bfd09479964276dd59b1d58dc35d2e52175d5fee5e0ea28559bd14655b056da9396880b08a11a17662bac4a7b382e749572eea29fa5ac5793c70e2d18ea5bb5ed745f7425de3873ba37c460c85acd2f4f50490d9d3680fc958bb85bfda6f488f9b2dd04714e2920653c1afab7d010d81355bbe53edbfcaebea15ff1da48\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f803ece8ba109526994448413d0b5389e89fec0b",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c452010000004e24b6b360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127082010000008e6c8db2045a9741000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7965802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914719f78084af863e000acd618ba76df97972236898755010000\", \"prevouts\": [\"2c1f340000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"c8200f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_be\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"2a4e4d2690b383f6bf7d76118dc9b47a989676a8aa38c26587f9f3c1545e7c29b510fe6adc84ca6d4a92fb29af735684c01b8268c0bd2a40d6eb6fa3df15072d83\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"af77173d64c354a97cc4aff2aad7d33623f6d31a2ec2a595d5a535ede13602789ecb36a77b0a03d3dae4f13b6cf6c124afb14ba6d6f33b30d86dad64faf88538be\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f808813d157995b8d10c3cffd1f2616528fdad1f",
    "content": "{\"tx\": \"f8e59ec202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b020200000080e71b9e60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701d01000000ff9dfcfa024f03350000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787b5000000\", \"prevouts\": [\"2b8d260000000000225120eeb645229ded9c683f00135b937b2e4e86df68d251777aa040a582f59863bb1e\", \"b21a100000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e24c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93605be3ea16000e1e5d0cd0f286bdd228006eef88980c7cd756b0c9f357e0882437c6ac6071aeb5642f86cbd8c403a36f49b1ae971c310fa0b2c6d23cdcc52f9ae3b30ae9fa149c8f8e298eb730b57bfc5eb02dfdad9864c9ec3129b8b9775e615\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52e2\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d51ab4aa5d5e3dbd00e7a6b81724e903c1ca482dc7bc8339f552afc52b4f38fc6a5b77966166a359aa5541e77c34a58fd9dcb7d88ef6e7e0cd0e140e1adf959d28b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f8136e4e492396052082b2d3eb7f45ce735b580e",
    "content": "{\"tx\": \"21283431028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49b000000002471ef9560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701502000000ffca41f901f4dc31000000000017a914719f78084af863e000acd618ba76df979722368987c191064a\", \"prevouts\": [\"4e9736000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"2315120000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"db4c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361eadd57732c956dfe38750ac99bf9f6a185a50e2b535aa6e427b8b7d9ced3e4c3f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082a04823906532712c3d4cb334ae6c7c41a1294a824a25b5277d43f47953a1da33e053a85c36f8a6bbb26ecc461a581c33f0f0e79993e29030d20b8bcc8871f830\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936387e64f87645be2ecaf6d33cdf9f0facef33dfa6a290eb8ddb5654788a0f6944ba0f4accdd80d494e1b95824e4feb55c95caee559d90e25fbf6396e2b6be61303dda2dfca806ccc9c3ad62846e64b9ac16121de5d926db5bebf2e82f8dec8d2a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f82150120ceb9a7b6d24c8144a2fc40fca6c7ded",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7400000000ed794b8ddff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2200000000422cea9001bc295b00000000001976a914c629d61df58baceae110d15eb5b55e144268615388acaf970346\", \"prevouts\": [\"1f3653000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\", \"fdbc5a0000000000225120469ff3412c89f5805e53fbb9303c790a98dd32093d40e3b7dfe22bb05f85f37f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_hashtype_82\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"96d64d818258c976c7920c0e8a7797d90fe7f62e090f4bdd61ec908801679506f89e5e41d15e0f24bab418a194ca5f9758a9dc13316239c5cad2fe229fc6f9b782\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50d3e09a20f2e8779831cb302d568c9425c209cb5b98a5ac88437b4b6666b13231624513d6aef0e03758f91deb751c2a3dbf203ac10049a5e6ee2a65b38f3f8c511254096298cedd5acf1630fe965b59d887030edb7060defe9daef5930ada70174ab0f22fce103aa046d86ea2274aa25f89def91e7c46d789623a231447612dae1eef9e01f79acce2e62dbf005feaf6acea63a5ce268397cb04a1e7e0e9a156a7d1cb0a60b94ceb314ccf884d21fdc56e4a24db35c759200c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"8950174d5d07f79d86a9641569535ddc0ccc9f2a952766d99565519120b22115aa910d6923993976405cc3feef2e8094d5d1a9a9d49f5486e2bf03ee27ad17c982\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936\", \"50bf4d1fe99c8a8d15a60f1705e2c91cd7af\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f846835025106a0f7d7d18630b87f4321e626835",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf92010000002d7002b0dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cb100000000c01dcced048b91e100000000001600149d38710eb90e420b159c7a9263994c88e6810bc75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79628eed841\", \"prevouts\": [\"b3f9850000000000235e212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"aa485e0000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"6c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ec8a01b0e4032a423e99f1c4d6ecd2d2b88eecc51e0791d65e631b79e0d29889c3000b960c1063a40dfb5dc510671dff140eefb73aa6757bc42ddda0d13c6b661\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367eba9119756d434ff44abdee5a94e7585a9a57670d5d24b9bc15dfbf2b5caf57c8a01b0e4032a423e99f1c4d6ecd2d2b88eecc51e0791d65e631b79e0d29889c3000b960c1063a40dfb5dc510671dff140eefb73aa6757bc42ddda0d13c6b661\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f84d4edb22fee2109b5e00fd5ac471e49c15e25c",
    "content": "{\"tx\": \"3ba8d6ed03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1d01000000e3bae3a4bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8c0000000072f053efdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0e01000000551026e5037abdec0000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb7963948d921\", \"prevouts\": [\"75f85e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"74c36b0000000000225120901d00c5a53f44ff53918b171e70ab2bbbfff6b107bf8ab5ecdbe45602efd01d\", \"26ba240000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_85\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"85ba65144ec5de235f0845c21c253aa1f236daf1721ec5ce560cf0947c9254f4819f6f6d146c485d92203e4d2665a7f7363fbd13dfbe16419a9e9abc6957189081\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"be6919a15e50ec80ba8b991c63f887f1d1ba2309d4801d573d3f335490584d69a3c8957c26bbf4258eb00d5939d2e8a6a5e560b66fcc72c12d58e58bf7dec71d85\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f86da2aa3ec8718d5308b84e38864225dfeb6819",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9501000000a8b3eea4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6601000000cc72cc87043cc19900000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e71b040000\", \"prevouts\": [\"60ae7b0000000000225120ab4625f49c703a23e189ede82045800566d41c1fd8d57f05292e3c6cc685d2ae\", \"2cba2000000000002251205ab8b22cfa491307edea11ffaf6a065b7e494e63cc66e0c2b2743a26e3a8b68a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364811c32104c8163ae86eee8111aeb1d0c2a95f553393d749299f51992bd2412b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a34616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f880da185f238333598d20ee2e139229db739f94",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd20000000060f33779dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b70000000001ed470278bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ab00000000c60fe4de03dd71ba000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914719f78084af863e000acd618ba76df979722368987a6000000\", \"prevouts\": [\"e3725e000000000022512058d9157fc9d952418a25b425d32bdf0bd8b0c43f9b89a53f52a9ce592c2bbecb\", \"5044260000000000225120af0a79bea452506df006e72c75367a56e4c5bc681991443c0d3eb6d09440377f\", \"2a20380000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"e3\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e17387e8fdb6e1953b8492ce494f93b549856be52be3e0b2251aade3a72c8c2c0db79b88164a8f67b1298a482dda9483af1363bdf02371c7e121a2c285843f3f1e449280c515e7ef393424f0dc01282cb8b28e26e76822dbd41f29cf7fcf3ef3a2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c8b4938871a8e43bb69010d25957b1b3dd5e0f775cf541eef5db4a9b76fa4cf4c71af5165e16a75a4d38ea496516a466796a1cbb48ef44578cf258de537130fb0277e21fac1036469cce09bee47dd6f35fd38d265061a05632a5c9d8280907c6449280c515e7ef393424f0dc01282cb8b28e26e76822dbd41f29cf7fcf3ef3a2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f881895a273c1bb8b76313a9f0ff65520ad27975",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf090100000080c5ae2e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c408010000006b50ec9a8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46f01000000809ae9ca023333d50000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e78c000000\", \"prevouts\": [\"8b6969000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\", \"5187380000000000225c202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"971f3600000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"677d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362ed6d007bbf77981b2b4b9d56de334ccb7bea90f2e4de65bf3c704c80b3ea05cda584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e577a14a6eded01e2af38af60eef18c742302cceec7e721187e3fa159b8f76816fa195b9f6f39c732eb35859a6bf094cf148e251ed4d8a79570f47a225cba2c42\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936db89d69a983556104bdeaa20c3c7cf6c5eadccf0658711338de1f7551c0feea7577a14a6eded01e2af38af60eef18c742302cceec7e721187e3fa159b8f76816fa195b9f6f39c732eb35859a6bf094cf148e251ed4d8a79570f47a225cba2c42\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f8835febdb55dca918a36795f2203f4ee4a6b841",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270df010000000d2d46bf60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704500000000609e4da760f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a601000000c24588ea01641b0d000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87260bfd52\", \"prevouts\": [\"9707110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"bde20e000000000022512009aaafe5c25742bc31707a3d3e67825093b9287fcffecedf6a81328faea09126\", \"f260120000000000225120f52aac6d1851a3bcc3e02eab41e79301b2d0925e53812529fe85f9ade1401e4d\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902473cc65bfcdebfd82df412219de8bd13e6e17501aab721e02ae8ce645099ae0ceac3ad75b7b2e8da66ca599e3ec3079f034c51582f9904a0f4224e2b815e1a6be94a99dc1b3fbdf1fb155dca74cdb089ae0f782fc880a053987dc17b39be8a397abc573e43d15576dcbd4ec120705d4c89e928857e55195a0b263459b592069b25441c6e7f0a949d561f81bd864dd28a81461621fb802b7b3defb9d161cf5f292fea358382c405594fe46c5d7655e8f7473392626b6b883e97bebf21d217694720946d6c686a5d862c488f725be6a7986d982738d7eda987b568ca4ad627302bf6a22b042116e3498e69595046eb99b41cff7684ada77246142d19c7e4ff36d33ccfbc976d26f9d4d088dc3a0643b4e2a314ea145f82c97310d956fce8620466f08965c2a9337c8622558794fc766875506cd90bfcafee9f2f10b4a7aa2fba964296b71d469e1bfc45a25db6b5edb965d93140f03b3680a5931d9e361b8d27334e4c03b026a342fa5cbe675233f1bcd63c083c021921d68cae2c6b88a0e64795f53fe02812591f10ac604c9de783dbd7afdf487e58c57f4d16a5af509d93358b3cfd4e4efbd45254d95102136dd0878fe8409d7469d45ff157614f9e214ef13dfe4a8d6b44ae96e674844e20d3fd03b00a8ed5f79b319a20ef4399d0c11771065179d7901d6086b29fbe3e66117313c6385629c6a9ee003db61cf77258f6d950020fb5ea0cf187760d75\", \"9a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4bc06d4332bb52a2dcbc7a55bc4ae6946dddd938636e5b51064f41569d763ab36d8f87b1e85da432696d33eb6b4e5e78e6d1d086344ff9567d72236d13448237e56d08eecb8b548a03ce82dd22dc92a64f1be159e88ba8944ed4666490b777c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902012a9cd2f836f86aa506364424c28ef20cfce5502d236349bbb68136664f73482ff3cb957fe78bb3ed6e3c6a31eb5108e3dc23a4a60071a2dd99b9e1dad6ba60e351372f2d653dafe72efc7240b1cc4d30429db8d1492e3a046490880b4987bf517d5ef4f2fd6ded9786f539e2f2fc6a2c7f4563d0e03e59c1d5632ad313b561b8512b3a2a100899e3714244be3332ecc07a8f697f2a54b2eb871f1d52ea2fd55f65354d40eb8e765b6b9dcdb537cbeef1117a2c4f6d6f2f86ed7ec5e6edbd5d032b21b8384e1e231769646d556ce4456559dd4c68f732963d31b694f5b591c9108656b8a9cd1ab1a201752faa2de6e570b559689f4b47dc70cb250e49f2a20f719486d4cfd13965ec83f45b18719ec00cf2fbe8f487d26146c0bd16db7175200542eed3489556568bc23f3d41eb456e9956a501e2688fec080afd0a401cf288e1d7f8ec0e9ab679d5a7f4a1035caf7223047034cbaa27711159681e5d74d0aef443a2a88c74f1caea4cbf38a51cc8305018e81899c4d9d84c67b46a44e8ee0f6f339968726a93900409ddd8979ad042f623e954e7eb51bf9d3b62af636b2b5f1ef637e0546d97c6ee48591a4121bd4111de9ac98f0bc18555f234372637cd25e7f95bf04eea85268add7ef395f6689abb7bbd94b5ed5f870af2fc7a98f6ab15c7b86e5d36e1cc9ebce6a35059ba1934df4ecc832b15890717198148e20a00b9dc7143f4ac999028e775\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361423b2e0fb5322b254cab9d769b8e25c52cf91cc54a09a7894a482d3fd1e988536d8f87b1e85da432696d33eb6b4e5e78e6d1d086344ff9567d72236d13448237e56d08eecb8b548a03ce82dd22dc92a64f1be159e88ba8944ed4666490b777c\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f8930f55c55efa927ccec4a3a273d7af679fe190",
    "content": "{\"tx\": \"3b690b7c02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bd20100000061e238addceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1f020000001b923abc018b9d0600000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac8a000000\", \"prevouts\": [\"180323000000000022512027f9b2b57f7a44e5bf8532a7eee0efe01d123524baab13824442034531d1453d\", \"ffde2200000000002251202bcd1037a7ead4d36c79b4ba9602283e849258826382b8d227fb6c37d295c423\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"c0\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360b0630a14fdba5198d2cd32fc4420c8a8ab4ff45908222cfc645bf4223ff04bdf827dd3f971806aab342b51fb6c2519c5b3aa410ee2eacb06207a66da829722129de37322ddf566a2356077a247b666bf816d75bd62d8842c555909c8a1545e03de843256fc2f72424a897ba91cb5d3893aa03eaf52af3ae765db300c5c19165\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f54907a8d380556c8a330e16c78ee3af2c39f1cd46f776ecc20664efdc303ae9784ae775de15fa9e8fc81d7676ee4bb7b8b5e55729a9bd981757787c0c2477c76fd75cc9ac1e6f185878d252db6c7bbd874f5ae03fa9961d4f4a0208503b0750f17ad4bbf375bb62f626ec8048d4347cc1eef977780228a6d2fc47294088d561\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f8d8d11d95153ea9449df09e90a108d0d46dd36a",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf10010000001f3f7932dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3401000000f67932efdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b2102000000826b9d0304a1acf2000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688accafa8b37\", \"prevouts\": [\"0a62760000000000225120a1fcba824e09608ce0e4adebb5c0144bd444bc623da6b47f88c86cb859b1d13a\", \"ff685e0000000000225120d40d9fd470af8cb0d93055b906564b331441f52449b6053adb5dc55560c180a5\", \"64a1200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"4e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08230e8cb56a1cc46a8845ca28d4847c7375475f2f7976a44b43884e49f27807546ab153920b849b6028620ffd2b7e486a6f5e2411aa058dab621c72a45f67f5d8e\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936323ef28f4e99bb17bfac2f1234bc4bec8e02dbcd7bd8742e9803ed76c3e6ec8530e8cb56a1cc46a8845ca28d4847c7375475f2f7976a44b43884e49f27807546ab153920b849b6028620ffd2b7e486a6f5e2411aa058dab621c72a45f67f5d8e\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f8e2668d6408cd99bb9b4144dccc869b5b5c3995",
    "content": "{\"tx\": \"0200000001dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cad000000007467c8bd039cbb4500000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914719f78084af863e000acd618ba76df9797223689878589b224\", \"prevouts\": [\"454b480000000000225120ea4dd4fdddeb85910d968a8720de3e26cfa946a55a30f257fee5a4b92ccf36fe\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"ec\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0828ed780475d4e357c95738577784a2a9ab12c45b3a32d4ee82ce9965ecaf5f6bbb17c496824b626c02ab547b0eab6d99cf720fc5f5950d9f56a4e0f1a7586e075a9cfc1055a4268af502090450271f6d102883ab16be8e011ae292d6da52fbee7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368fc8101a1f14b662558c0e8593c88d9d486003e9c8266cbc14341013234749228ed780475d4e357c95738577784a2a9ab12c45b3a32d4ee82ce9965ecaf5f6bbb17c496824b626c02ab547b0eab6d99cf720fc5f5950d9f56a4e0f1a7586e075a9cfc1055a4268af502090450271f6d102883ab16be8e011ae292d6da52fbee7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f8f8928329f1f5ae3c966fb5ec2113e076eafcfe",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c40000000009d51e232dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c42000000001c11fa30025f6fa30000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48730f47c39\", \"prevouts\": [\"9532570000000000225f202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"3d794e0000000000215a1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"549e585f569f0029b8ad233f810536bcc592cd03bafd9d4c76138b19f70f397e613e6db527ac4442db3e49e1f760d605b74d5c253e16ced5f48ac06e5c47c8bf\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f8f9451ddef15046ebb34b8ada8344e100e77c6b",
    "content": "{\"tx\": \"0200000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf500100000025b6048bdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf0010000009bc157c302da139300000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787d8000000\", \"prevouts\": [\"923e720000000000225120279eabb29e123e29b3e35f5f3a43ff6342d7d66d04195fa790bd9d720ea8f0a0\", \"4a6f230000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93656e70bccfe8a05e4278ed37056f198005b9b7c7170c1af3ea92479ba6ee8fbde\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6ab7616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f90c809fa2d5593e55f0033ebff4eb6de3bf7a4d",
    "content": "{\"tx\": \"8dbcaa8f0260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704e000000001f96ee99bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb900000000f13ab3910248cb8c00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac4f13664b\", \"prevouts\": [\"cc920f00000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\", \"1dc97f0000000000220020e1b76f9b72221fc6d0b005cf598043f1c9baebcf6357c47a6fd2c54d470c73b1\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"304402200dec731c63b4cb576ed1aa0d68b96931c6ebefabde27dedf1c0cb0edb933a87602206432d636c7234f2784526d52b6ef0e7614915c1987b2906cf5fb26ddd4d85e6003\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100ebc3c78555a75d15e19905be089a7086d4f3283446cc7f3eece805376c6a5245022041074126509f962778c6435c65cdb55abc66f4f8258f933a257e6ec784b80ef803\", \"4104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f92ae6d39d23d890f0a4bbb1700628cf97bfd5a6",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf090100000080c5ae2e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c408010000006b50ec9a8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46f01000000809ae9ca023333d50000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e78c000000\", \"prevouts\": [\"8b6969000000000022512027fec823148be86509eead145c0fc284438e34535639d609cff1daade835bbe3\", \"5187380000000000225c202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"971f3600000000001976a9141cc39a492a6f67587324888ae674f2f534a7639e88ac\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"47304402206b0d26fc7d5aa03514d2525b7b97e2b089f28244da8583a4545ced8f2d8489a9022050e337d5704d85948d1f3fbd3cca389036727bb1e08426e0b98fc16ba695e765014104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}, \"failure\": {\"scriptSig\": \"483045022100ed726120bec6c442a1f463d10affb9f04e8109102d21d2c3f2624e467f08e00402200294ba13cfbdfea82f4684cfb62e3091546d98f0f60dc501ac811c25bbd428bd014104d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\", \"witness\": []}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f92ff19d417dd30243bf0048d8947d33b4bf7064",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1800000000ba47f20abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5b010000002d1ad987014ca42b00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac74b5bf31\", \"prevouts\": [\"d8116500000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"264d63000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902966530f152f3a446ee34537de1160c2c45522243c0aacf231686b36dc6b021273dc7698a8d3b96111f78979242a46c68076259ea722690fa2ed13b3bff3641576f66f2aa864515ae45a22c4e21628fd49b651dd942127d16de21c5cb84b73459a693871f7b74062fc5fe28f5f8fff510e8645a1f22a3ec507e87aca9179b72dd904440b0d41d13e13bff62907721a864040ffc87078c3c77bbd04c04b3f1e3a9c4d10186a80667274e75d1343f16b7c8494fefe947640b49d50a1034b0a6e407759e6065849f9d3ffc429fa8759d27b51f5ea04764fa94495845b1b7e14e546f423404724e5ef223bdf918b1e9e7dff7ceb6f94a5d6816d3e61424f41dc027e65bab6dc12bc40a444b0dd4f73899fa31e6b2899b0eda4bae05fbf173340037084e50562d3ac3efc4ca44e17e9e71e75b7a4bac44cd42427a6eaa44a07b51ff579f0888c304a93b86445a6262a3d1a6bec4174d8e1c3242407697c7307eca2659419f331762bd4a5f511f8f5809216722d8e3101fba876ad03379e3982eaf309c4795f11636695fb9bb6e5f5b8e214eee9a832018fa4d93a8b761ee148b28b5e5f7a6ffc590e64cc8e4a790696448167ec8ad24ec09ef2aad174975aebf311b9c37bfc157f639d81eb5e883ce4beec79f03d77841d94d571ef99bfac17b88173672e19bcf5431ab8a4bffb9f86408af0a661726d5aea4198f2f101c3a8466a1594efd3323159965f77775\", \"557d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365570074ba5d6534b1acd7012ede0bb8dc645b9846f6493ec98be18925bfc342d2d0ae3a8a51f8512ed3183c6b189898e3d13807be8720838a97bd7135cdf46e7da77d1c2cfbe9569ee5db2c51580a9857624040db9177af617be0771cc5b8a1b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d09025bda3b7d42ec465570f9a1c8b32a3b73052df58358a4cfb6d9144b73c58e42d1010bf3e26186d3eb501d05d8a7d394489cee54773e5787e3cf22abaf8d98dadac3f3de0a9e95a2a696a005176e8624565f027e42122cb5586da3a5138d9e27efb1450dfa3e56171f2d51e23674f82a5019f67b66e1e210cdd0e06134a94c0c92598f9c3437ae9e6a0b6afe889095f88b7833360f2d7674623cc0d0e24050459a8d19ac7749cf48eecd0e7656c1aea5f44f39d13e659d448fc3fb600d111e0de1ed7c04f747140118e4a638bd23ba4209d0ea9274e7fc363247904674f583df80fc6cab3e1a57f0a0f3d554afd3f02b023e7183f073dc04bfeb85cf0a3da04575d7bce0e3c9d106bf30d0a6b5b69744327765e2ff4b8e9d9bfaf2ace4645a0ad8cffb947799efe998f9bd2536d1c506bb06d44b8eda4303adafa63dbd61e9b42b8cf59188957679e185bb700be07de7e67ac158bc48bcf5ce1ccea48c55feeccd37c2356fe36a1c765300b60dc5b8b6a4eea659a1d124fc25f251d54e8405e0d63a1077fbe62fe8ac7cbaedb1f958422fba811740949c91c9b3c627e014b140dc33a320729194a0e7114f39a843204f930f537f0ecb5a9d33c58a9fb5f4659d6fe7f1a123a4eaa0118ad71f1855e33bccb1d2b8a06b1e386761a1acc02648d709df78a7ee4635529fbca5bfe3d9d43dbcf9831ad49a3efeb2bfd36c97bec30c1c3fc74bc0a4d446b50d75\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362e27c3ef10f9d2f55b89f870bb007bb039d5dbcdd8b8a07f79103695c3c109fdf33eaf0e0e2046a2b327db0183a88d397c5be0a86c812e98815a20f9da9843a2a4c5d50721208c85113b157b4dd4688510f63bd33d4c90ece0d9e0afcb8224b1\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f950057a3fe68206273e224b1a0c92d75bf4cffd",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf1800000000ba47f20abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf5b010000002d1ad987014ca42b00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac74b5bf31\", \"prevouts\": [\"d8116500000000002251204cd7ec6ae4f2b0a3444c5804c92054f57c943d1375da0f99d43cad136a94d2df\", \"264d63000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"3045022100ce090b0be1e63db11f84335f97a38a7878541f5f012bf3b904fcc0f6c840444a0220381008f21e1f710b2966444f8b7c78b5d2881f4c20cf6ae2d426a3f332112d4482\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"3045022100b6a94089c242da02f6d05ff53cabf59b77eea81481b11ec61c32c10570f20a6202204ddedc993527bc0d85e31aa1e8b9cc49fdf5ba326ccd4c3782a00e9f4d80333682\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f9527f53e0c01295c939d322769c4900690eac47",
    "content": "{\"tx\": \"84a1e22002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6700000000d31a558abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3e00000000a47f97e303c77edb00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7b8821e39\", \"prevouts\": [\"fe68600000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"69857d00000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"89\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ea0237369b8fe49ed1b05e21155f7ffba4fa029aaf0d531232d0302472e08390b90b3e537e0a498718b42d83f823725a04b39327b9237d74ba7af037a7c89be8bd8f71710e2f4773b226617f0b144a9d046788db13e8347a383f909c13421323cf46474fab8e7e9306b35224640e271c3ad2c01a28b74e8035b5ea3da4b2d4b1\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e15f4861bfb2a6452ac4a4804b2c6a2c641047e4f139d9501cd1bf471f8e5b3ea6913d98effacbdfffd2adbbf71932929e08e9cbcb7e06a345b8d84d9192524cd99d8f9ebf09b0c450213ac35faa1ca38fcf1ad0a46ee35414da06dc92335be8b4\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f953c76798af4534303b789774638f6750bf064f",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf2b0100000003d33c9abcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acffd0100000038eb109e031793e40000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e75802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc01802d38\", \"prevouts\": [\"08d775000000000017a914613e66961ccf40c7c83ed07cc80b2528cfe51edb87\", \"e447710000000000225120e477b1c5b341d71bb24c39a2320bc0d86da52fdae37edac491a92c571a2df14a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364b234f7ec6a8dd17a567955d51e11bb1a7dcaabf34b2b14b63e8c8f172f77efa\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a58616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f95a0a2fc49acea853b2fa634e154189153c8e19",
    "content": "{\"tx\": \"d07c79b8038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41f0100000018502eebdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9a000000002d3f28d1dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c170100000063ffc498030747e700000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47874de2e530\", \"prevouts\": [\"a595390000000000225120c4289f295f2323e1a679e2ac23fa4ce9cef8c78af5f55473b4c272e984282d2e\", \"51a15800000000002251209907b2e5a8727f92d01ee9564efd2935f4d16cad3aca9531ec5054e94bf8eff6\", \"dec15700000000002251204c67bfe7b8ea24990d5c0ded805d67c336776f2a51059014263e3e0b5e292bd1\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902fc7bd4820f0eeae1572d9e91bf2bbbae9c08eb147bfb0969fecdb800d1aa84f10d7cd1713c107a0409705d93a596bdc07570c89add51ad52f005d502d8d02076e311eb89b5ad01844cc78dce05165ac3b3e7c979e5f44f9b0503f61ae72489f477f78beea5d696cd0d9c9686de99c5ba07f5f32243fcdbdfe771ff0582bc4e10b3277da13b0f1bfb40cf081c1578a2b2b1d73820e0fba0d8a49d8a414cc558b34e3ee6f260416a8313bb2c3970c033f58c7141da5adf81443d77748a56f1f871f8225ca5aa05d9efe31fef73e8a22a975d4a3eef3fd317171573ce0b1b2718f69d7030f0f1598974917249bddd6d6a13759e6145be40175a8ebad77131d7b8a7223c3710df0500f54f379ca19315ab7be8fd997d9e186d28107d1fbc882ef296b866dda790e3731b74b114485b8aa39af6297da11c073d0bcb31b92b2a21dc777e7063a642a5580678c51b8df973bc21f7987df2daf361a1478f9f4e8e04640eeb255fbee93fcd9b6e7a2f7985d48d68642107ffe409cc41d2d0ff585e8c4c9ae7266cc8c2232407435323d7b5fa4266264a71f265ac69ad4b7913396229684758a9a9bdaa5815f519d0f5371536b4a48a62894cc295fc7c7a5d81b8a85099d608391275776bd6c73b22a4123a59fc3a627608b111f389889df3ada0f361ebdb50c17a98cc6ab879b70470689d0da13a47063da79a3aae254304c25e7c6f687dc94ce84c598546b5f275dc\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d5183faa9f1fb55f2c754174031ab88b9fb2c4d1471ac070ceb12091a666ed99e827470af5f469e43c444817efa23ad8740a4ec3822d36804e7973b39d521bdef59faeb7b84c883e27227adf79edca80c57b026715ff0da0f52c5e2d2aa306e3b89\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902a01aa5c6a07e8b63c4b5caf6d935f8ced78752f84f4158b07970df28f8ac85848b2abfaeeb6f641e3dda2e01db7e678d4f0260f192616d0109a787dcdb71e6a00224cd795be015ce50c3afe419ce3392569ffa15d852421e4119bc357ddb8857dc0ff19e06d5aeffdcfd30c62f5549a3559789de15c841eab2c65dcc5a43503e63938f62daa8509b8430afbd2e4745445f84a8500d84dd7dd60b7c21120a16869919b097568deda20d7280777fc93de59d3fbb664b4474857f327b6425d62bcc4c61fd1758a0892761d5b29b5f757a383bb464ccaef225797aa00539ed641e0cb76a4c86cd2706ce1584583adc27d8f0004f8bc753459728ab820869a2be6fc35c75229093e0e22defcf9c83915a871fbbea227c8a83d8f0eca091e5f0f3abc0115d6c2b64870a4e7f1cee49b34e39ad9eb8335ca38bfbf886f75f1b899a0c8f3b7c83db0d8206cdfc7e36cc0b8916a30c087d8aa7cee72529c32ebeace7e6fd2e0994b7aac8d4a8151c35538d95e5b63dfa2b26c0fef794c85b8872a52c3cabbe936dba05ab2a262f853cdb05428677557721b5f72567d86fef1df45d77fe08fb1ae78f10fac539e7902de09b10cf00c5395ccb2e7911fd8d51b82f1c16c205db3e3353d19a686f3b49e9651941858c8d3fe44b8da718e05189938534bfe2aac7a9710a872bff685f65a6e25a682c4141259b772f7703b460c715d53c9706341ff283c941d0d899507561\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93688348219a84d53835cacb5e278792a361bab3f99c1b38c46419f6f84c91a9bff6950266b78c1c1a06b0abf9d183417cba91a47bb46abdc469d8aa6f91cbf6a3fa39f866618102a4b08e1c83cadbbeb41bf3ed62f238c8432fccdf019ac45545bfaeb7b84c883e27227adf79edca80c57b026715ff0da0f52c5e2d2aa306e3b89\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f9ae968bede9072e9913f275110691863b21d704",
    "content": "{\"tx\": \"4de70a2202dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1402000000fa3ce6a6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf401000000b6192cae031df747000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47875802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374872a010000\", \"prevouts\": [\"52c025000000000022512081fe6bd81c93a76bc00ce825f56a69a98e925b76c72731e1070d37ac4d963490\", \"e47b24000000000017a91477661b6925aaf216859ba3f511d1eeb98029e4cd87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"success\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"304402207d868a2f53f800e4387c8261971bbcbf2a44766462a25438f0a0ba5d3640c332022042097a752da9ee4dcda57407ed551f21cbfce9a2e9934a00351d1c001519a6ff01\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}, \"failure\": {\"scriptSig\": \"1600141cc39a492a6f67587324888ae674f2f534a7639e\", \"witness\": [\"3045022100893ccf09d5a720800608a90705862cce4f26c9fbe9623b1d730ffe9e3d9ec93602205df4ecdca8b974423986f87124e1f8f9110147e52543bac90cf527d3ca1eb75501\", \"04d70500cb6c337bb15b9d342f75e4aef8fc44c2aeae92cf1059813b79463bc0773f9cb2f3e3ebd960820440fa2837455c997c4f35da4ba1c196cb51427fd21893\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f9e9604adf8a8fa70a8a2d8699243ba825c4c268",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b500000000011604128bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49200000000a36624610468c3470000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac78010000\", \"prevouts\": [\"c58410000000000022512041c21a039e22b4c62c3aba6b6aeaf308dac861e9dfa80f1544cfdbe544b0d99b\", \"78f438000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"f4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a4f83673b9228ad584e3c758d3a7ef913b0130d95503994689e6b12c1cc0f2a2ca477f7eac6c013e182e33a949b526b028f901138401b50189d2a4f50cede7d4a6f8b9af6548d116d93931f99bf1698fdad997ce51263e0555061e012c5780fd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364a27ab33ad30c866663b6aaa2ec98e71770b4a6226bfe80c47bff7f69f5996db8ef0ecf285bc5470eddb41e1019d9d697e32571bfa8271cd432e6dc81a28355aef31942b1858214ae33105eca3f0b2cf78e8df05a3972acf71e40f309e975162b655a633384d647dfd447ac375ea9b2c02c16d8a17436cec940ed1871036c5ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f9f75f9ba55d66c16536a85bc2406112ffaef2ff",
    "content": "{\"tx\": \"26717be901bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfad01000000ca211f9e02ebb77c0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487a6020000\", \"prevouts\": [\"f3837f000000000022512056841eb16851a8254dd440f9b87fb50fd6caa3d6a42582cdb16ba84fde29c407\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6af4\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9368938b1de1479bd29eea6cd3e0abeaefd74a04968d0ad5778826ab6e5abe10907ebf10485a7565da4888b0296454aba30a39a8416dd3eaaebe7fea4a18750e931ca477f7eac6c013e182e33a949b526b028f901138401b50189d2a4f50cede7d4a6f8b9af6548d116d93931f99bf1698fdad997ce51263e0555061e012c5780fd\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936082ca7a5cfe1a9e0b80c54adc09274a6801d747ad511d5fafa337d754a1e0573ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b270b4d2addc31b8421907b0cff80194a5513593e3802bd921239c9c6063ea806bb655a633384d647dfd447ac375ea9b2c02c16d8a17436cec940ed1871036c5ed\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f9fc9e2a4f2af623fc883937402f30bb39d7194c",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270240100000016d9ce96dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b740100000085d2d2f90174352f00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388acc1040000\", \"prevouts\": [\"3fde11000000000017a9149d4bcb1ed806c9beed692a78614f8b90a68c708187\", \"7903270000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063bd68\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364beac8453c08a82879ff5e72e60d02b43bb4030aabb448d6315e82d153ff340281cd61fd18311004a5536d1440b72b537197adb3a0d17581cb4a1679e89097edb5843f54915b2c97abdf26ed2d562b36c2375ce95d63af6aa508e6368a687449\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d0820cffa7efd13876b56a4fb6d16fe87f2b3bb25d39f5e6fb1dfb5ce04c0283c8690e634e19498d3396bfa452af2ece499faa564dc4b58fae514f4ede8dd179fb909e9ba325ae7de51b47d98058ae5f9889bb6f52223c96865cd06dfd05531cc8a0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/f9fe421cb9a3952dc45c8d26a7ddd2f53b952533",
    "content": "{\"tx\": \"865915d603dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b4200000000458456e0dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9d00000000e0cafcf560f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707a000000000805b2d203a5255300000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac4a000000\", \"prevouts\": [\"ed2920000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"3f51250000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"e9fa0f0000000000225120398f9b6183163c03ad23a14c61a29f1667ce990766f9351cc380767011c973dd\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/no10000limit\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"269886b1e345109252e6f614d6637275d1af89f5e7fc3d31083c65a51898fa10ed42fc5eb18ccfee52739c3c519aa55766dfeaa266355ec1c9e850633a81a508\", \"00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d00006d20871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ac\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c4bd634f33c5ecdc824e032f7f6505e1a79908414cd9cb4904e5be53af7e276009aa0844af634d6a88942fc07e09cac01273a53719e9c7d657ab3dca82f27dff7476f30639288ee83f7e586fbe3eebf95392294d770910004bf988ac20d733d0689898eaa54a64e338f0d6f587db8967e9a32da3cd142bbda1995bbc1041216c07e8ceacce0cc704ff4253cad15b4bad56fa12d498e75acea888835d93f185996410acc12bc4c5dedac1c586862bc30c8c8c35c43f931a88b1e66ce87253be2d9fa8e1ab3eda915843deee8f6933962b6489afb9525529b0503d03bfa76215bd5c68195c04b797f18bb2cfea1a746c9cd9f9f26f7d097f82c81888e43ac3d6d788b3e61c662dc0c68cf1e428de0b3881159a8984908386c22cbf6cc6c3f2d9481e07e856e8b93123b7d28bc5ec1dae7bc0c0785a4b348cb95c92daf9b4a1a6d2b65cbfaa9ed654ade91c00c9fe4f57391c241e95cfd60b1f44f495a05086ba006260268f3fa4d832afae96ff672bd19d7e928d42bc878143589bed193337fe656f28feb26558d4d064770c2eb738b0251c60e0a639239140ddba0ceb61ff7c3e738a88f45b76d7bc9f694c0e4e272f5d4f15822286d483919ad24a64a55c6aea77b92a17291ccc674c2e3ccdda7238c0844a935fb5296ae650389c65e5133f0a612c82056373d0e95f592d1bc3cf4aac0fb3e0b8245a80d6d0d3bc3eab472fda\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa167d1943fe2df543ef85cf25a11984cbd5a5a2",
    "content": "{\"tx\": \"010000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270dc0100000041fe47ba01f3b30c000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487053d2e30\", \"prevouts\": [\"40d11100000000002251207a2f20e860cda556c5e91362c7f67d77fa79d70cce9558dd8fd8d88940237552\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bigpush\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4d0902e03f7d21d2b8b3e12ffd2f14d707486ff62bc31943c6b68eeceb6a6b3fef9d3493ce630b2b2a0663bab7a8067a372d46e196e4494d793481fc12488197d1622713e1eb72dd6cbe73a0f991c2e4a766adc7c3ffac77bbff9ba0a54cb3f1014915f638d82f07c2fd5d99ddc2273334f94b57b93cb8f6d22c796a8e33a6c5eee77ead76ab35ad4821740bcef67899f7c4969a749c27a073e4bda0108870e26e12b308af144ff9928cb2ae246ddf046fa82bf55d6da59100dc52334c56b59693b6cdcd073499deb245170d9e745ea845b1dd02fec310edc94d1599c90ba7ceb4bfb9b14072f6eb1e7a95a3e02916b246f87e71e6d0592afd5c93db66c7c1b12af4cb11bb733385f627495ba5ee6906620beaa8e13d2ca7f39a88b48e14ab31bab1b5273bd53f7134d84e7bbdc05bedf80ef01a9ada58734a1d03237d38aef755fa54cb1a20836611729b44293899a469d9a9b0816ea1f638eecec06268a42f743df127fa80a5fcc162a9152c25caafa1c6459f483b29a13119e28d25f947ecc83865e0170086b64192b40a3e483059301333ca6a83a0f8f421c1728080f67017dd5db6c1fe50b9aee076e16b3d10ca9240ef7b8cf0cb0ed00ac120759704b0f73814c45c3dd4c34e65b0919edc85c05c3650b2b4046726edd43af2032349fba6f037a302d25513fc800a0973c2cb0dbc742e0e866f8a2d892aedaeb617be122907e6136d36fa2e7d58a51875\", \"537d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9369e56f8367801e6cb4b8a091b8158ac933c3bc0e4e5c9ffc0637287cd390f6356c1fcc94e870ec95c088fd37f5daf805336fc0aa07ac91d9d5a0c770a5a47ed76aee97a7dfb8acbc78fdce4694f8ba1e1e3bf612a81f34559c93e6dfd336d600fd892d02e0db2d70aca72db86bdb1e35d04291625c81ec0b3d884b10be9f787fb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4d0902094499413ccbdfb4c4c84178ca8e55e80b1c1ffe32e6be62459c17bfaa45e901bfd28210d71039246543dae4a04606f80beeba3cd68ed7aa3c7c027d3906b6094a30c79f513337d15a663a7e794ec1752cbf29f9f8f6fecd79ab8aaabc85c20a098a5f51dac2a4bc8b913e5e338bb859c5bdccf31ff0f31938776300e71b1be51ca66bec8707648a429e27004e4bbcbe404e6589b8dfa5cdedae589d70d88f06f0c342c2a2c4f0397367075f0933f113d12a04ccb82bb187fd815d79e919858ce39358cc83dd6755bf64abc7fcfe94db82d2967b98bbc2684e0fdee54fe642a54dd214ee6b30721a5a294abccdcb4dbfdd4f28d17a328a1fd1bc7d2471b86b2bcf92eaa08c3818dc0dfe0943029b312692bc4068cc7487554ec6d5bf7dfb57578ab4683bca02c20ee432a46ba031d439e2e5331d757e8c115fda7308c8f76db70a53d208a07ede01fbd5e51a4df26dea35af2d397046bea173ab97bdbd4c406006b1536ebcafe074fbc183a89001bdcf79633b5b910bb648e1cbaca45e06c27e34359e6bd4fa4f95843030558b4a3752fa11d355232f1d91b164b755e5335d5a204b9ac04c14bf73d2165f3e3931f270a3984a57aedec4e4ed57131ec1168c00a2cdc8801d4051e01303d4e13f86d4e3adc71bf40b74d69383702c2922d9203852eb7497f68acbb267c2dabbb193a60e16bd0abd55e78254d99cc3a028f85c9624b5c1151a072ab60475\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa1d38f649aceaf83ba76018e55a1207707882be6904852f7ab0998fc8ad53a321d892d02e0db2d70aca72db86bdb1e35d04291625c81ec0b3d884b10be9f787fb\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa18264203439b69d71bc0bf47eb42c09a0276b5",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4be000000007e34d8a360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704c000000009d55639704a6b64b000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6f14dd35d\", \"prevouts\": [\"34853e00000000002359212540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b8900\", \"86520f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"7e6d39cf53a6e18ed0d941a7377d313afcdb97dda6f3349e2246f7b995ddb3951d82f4e74bc0ac5e599dbe27a1645d2d26358c876b70e9cd431e6e277197cbdf\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa2f957cce50a9e152ca7a429346901042de9fc5",
    "content": "{\"tx\": \"b8a0e6aa02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7401000000992304cfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b58010000007f10f6d10409577100000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a65802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7abce484b\", \"prevouts\": [\"81ea510000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"74d5210000000000215b1f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"badc8b1e93286f5cf5bb033f2b9660d704d1f7e6d4208b141e049bd781d7a0c41e1dda72e7ea98c1acc7d2125d2ec1142afbff8f8bd1473a60d6114908dcce48\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa49e364b5b789a639515d469e423d52b4437393",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c483010000004b90d992bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf690100000046acbee704b8599500000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487b8040000\", \"prevouts\": [\"a0413100000000002251202b3b427270f2ca619ae178ac9705b497d3b6bfee82eb9aa7db09432365097408\", \"cd9e650000000000225120444987fec3a0729a80d98404b6d5826620ad219568baea49ec5499ba522f466c\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"4c7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082126001c6c44c6d65a09c6d1b267ed4323a5b88ec68ff3dda19058d2d3d94a32d819d45740b1e9d6e416a8a4978331345395bf058ef0b936b66c7755017d83c65\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d840fd1b4336118158b49a207c7c1265147fcdb5164c3ca7c69b8b407af04dfd126001c6c44c6d65a09c6d1b267ed4323a5b88ec68ff3dda19058d2d3d94a32d819d45740b1e9d6e416a8a4978331345395bf058ef0b936b66c7755017d83c65\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa4c5cdf26645ea0534a498e6eed0980cfb7a7c8",
    "content": "{\"tx\": \"fdc7ce4202bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf0900000000f49ff5b1bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfbb01000000249669d202c284cc000000000017a914719f78084af863e000acd618ba76df9797223689875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e77d020000\", \"prevouts\": [\"f3566600000000002251209bc793d7c3b05f6eda9a2c26b213a9e100dca8f4a7f94360c5b61ae9a4f972e8\", \"cd22690000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_5c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9d69121c64aa823ae8029931fc63dc21a790a754effeedd0b99dd749f199a43b78578697e126f0e825ec8a34ee98dfd9662e0076aaa67f6733f937c1c2bef7e401\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"cd8961769bf3fe148f6d4d3437a9fd04af879c70323c770e7368a04f57fad871add4cd367cdd856d6d72dda471bc287778b07010e63d118d04461f1f4201a22f5c\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa597ee663f096b76cd93b293bc4d7f7aaefc262",
    "content": "{\"tx\": \"fa183ec302dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b530000000029438bd260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709d01000000a26a9cc804691a39000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7b8b82732\", \"prevouts\": [\"2b15280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"acb41200000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063bb68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93620e1233246ac9a23fcb5b3ba301349c9efee22ef31ffea4e16f8e5d228bda7e14052bd780e62e78eddfa6319e1e9b5f2922c9c635f126e8f8471707cb2f26f8c7017bb5ae96064d7d19e957b5258c9c864deb4239d29676eb164d7ecbdb9fd5a354ad806189ae64381d3b11a94f516f6d81b0c787d08b0f0aee4f0e917017ea5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93690dba15435832e62db4273c7c8000a302670526f3381315f96b1fa3e28a433b54c3d251f378473e49463283b18fa00944324abf75c7e60d6956acdb0e7ed03a7354ad806189ae64381d3b11a94f516f6d81b0c787d08b0f0aee4f0e917017ea5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa5f468e5077c7552905d4b235d938ba656a8956",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf21000000004676830d8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41702000000bbb7591260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707600000000094760f703733ebe000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcc56f0646\", \"prevouts\": [\"044877000000000017a914b1a54d09172ecbb89289f2a670acc3fe14ced9ee87\", \"4656390000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\", \"ea96100000000000225120c72d052844e54654bf1b4ba7d482e0a32ceacfdb2b793a896c2e00e5d00b606a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"ac7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e32d0ccdc2029b00ec7048abf887bee187f4acce1681536a58b887d4e93139fe875006811b549bdf6e8160f30212dc3199b386e615ec459cd6a9a101291e049b6126490c72a5b15e8927e2896ebf8102d665fc08f8a92e888d3aee8fbb5026d2b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e6183f419ce491b450889838cb0d7f10895831b7ec092cc5b3df9912c86be24377e3df24c23560dc7d916d43eb4e055d70ba52495a1ba5531ef20ccccb2bc5f4126490c72a5b15e8927e2896ebf8102d665fc08f8a92e888d3aee8fbb5026d2b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa6ab5df5a5d808c4d736244d69510fa6e17f904",
    "content": "{\"tx\": \"671d5a89028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46a000000006a1175f18bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c41701000000b71cd6f70163c15100000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac85010000\", \"prevouts\": [\"96443e00000000002251205c592164d59d166201a2e20d3b054756549dd213ab6179e4cd71f1fda3a90111\", \"82ac3200000000002251207a2f20e860cda556c5e91362c7f67d77fa79d70cce9558dd8fd8d88940237552\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6ad7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045908709641cf32dc4788f906f7e3621a0528df09509ddf1e9982e4479aa4b5d9a2d50ee9aa3de1fe988255b0d8b9f34dc2cecc4a96432b9f704e90359a06b468476e3192190387ccfa53649887be3b08a6a0e7169a64b02c3bbfb054cf523373b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ea06acabd314b946ab482c02917c0ab57ee7a12ea5d3f66acc20e49152ededa94c1a4ef98c473095d2df256e4c96a081ff076f8ed25b9a6c5f4dacfc5de1b1d157a61376c510bdd1fc860151a3b261939fa407ec1a2d0490cf2efc4278abc783\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa7d0a81564418a5df2eae24548c51be6486a4aa",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912700001000000f3c0e6a660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707d0100000038f3cdae03080d1e000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f875802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc63000000\", \"prevouts\": [\"aeae0e00000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"dbf0110000000000225120c5b78d1c72b60a56d77dd9836e8bbc3efbf1d0cca20448403458031ceee22a71\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"087d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b67972f0806ad83b266cea94fe60bccfb9dd1aa3e3a25c977f11b54b402f72177a9c5848e7797e88ab157cf3f92cb1e084ad7139395a6330a6d0efe4ec0158f0520a79ac573d08fada6e0a495a70546abebfe2eb256837e38d30334686ccae33\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93641c9464980f97737135f85384f09f0e2a54d854eba07e7e38719fe827040e76bbc0204111bf7e5d13e3ecd3b1c8f71c6ecf5827e1a757374a2d5a102d95777fd392ef61cba24ca089522adfb015944d93e6e298b3bdb8572d6b7e61874c3a207520a79ac573d08fada6e0a495a70546abebfe2eb256837e38d30334686ccae33\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa862d772ea0c551e8a2b2e955c3a314343a9249",
    "content": "{\"tx\": \"ec16b2e503bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf71010000001e2984c9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cff01000000d37921d6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b9d010000006e9e6c8f0155bb16000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8796000000\", \"prevouts\": [\"55bd6700000000002251201b1a5025b4fe9992b0e02773e7f35e6be2fc0ec95e56c0e62f01a84c1b9caac2\", \"4966600000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"2317250000000000225120103e7c2917eb37935b19ad951dd63925690af67710d97c5b32ba23098190dae6\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"4a7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364758c64267c751cdb3a7d0ad4e97f82b7320c0de5dc96a77478bcc9a1aac62dfb1956d2c402f72d86d9128969f4c9ed8db93dfb826b4075483e7d557b0e234b512efaba1d06903f148d2465ca4e4c6639d336576fa6993c6ca48823372648a44\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e696e0a39b8006d5c38246735bc900624bc412e796f8d634640137370e1472505749e2a390543356cdb3691ba8d54627dfb45f7f1132e94c1a4e909f84f1614c2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa8814b8ee8c8c0b59933c5df3e62bc70882f43c",
    "content": "{\"tx\": \"ea6657fb02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7c000000006ca5e1b2dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c82010000009c4ddacd0182ae3b000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487178c3054\", \"prevouts\": [\"08b54b000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"d0105400000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b221c730e6687b91edd1d82ce458a1670f1f5c408c9b3edae12af622fd1823f6afd27be809d0458ddf0db95e5817368170188425ca115f37ef512065bd7b173a4b5563559956b4521d685614895115ff3b761ab3fb4dd1d8def3bf310bb092b594c58b1e468d5c742a8cec262986ad36b584a802070024df25b549bdc05f9a8a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9365a5f4ba5a5870b42b6e90a30a8f8a9ba693ad2a3207303cea806cfbc5b598730390e5640971602922d6b073671c4e08980ecd1f17d1da07e150f68606efdd1f96e2c0067d6235544c969c57bb6383bc4dfe8083fe3443e336f29d85bd1c9f087\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fa90b9f27b4ef61835f27c23a72f15ab0bc2f8d4",
    "content": "{\"tx\": \"7647552a02dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfc01000000b71eb1cb8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c489010000005bb7d7a804ae458a00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac4dab3f4e\", \"prevouts\": [\"3c0e530000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"85f03900000000002251201e1e43c91fff99f096580082345e8b6c592108fedec9f6a82472097138f3a147\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_af\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"772396c83c3adfdfb4159e115ccd019751496615d9a86bf5ed75f0f6f6782ed43c6b3366d510c7b7b429087032f6518a4e40277126ab74c18e274e7fd89b97be01\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7e3b230549998be0e83e84993439922c5871fa7e8d0fca56b406287a8b167be462f1067da339b2298cc161acc2659ee0dccf2944fc0991a82004fc5323f4bf44af\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fab23300d1e8e0ac77217a22517738b6de5afead",
    "content": "{\"tx\": \"02000000018bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4380100000066bbaa8b02fe733a00000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875bc22d35\", \"prevouts\": [\"2d6e3c00000000002251203066114b40f5bd33eccc7991d35f41784b4d14ee4746b37c559802b9f69c1e67\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"cf4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936576dcfbd45e3fc8427f121d4200b68bae14bb12011fb1b2bbae78ffacf19fef2e4a15251ce914d64550800735eadc470245b559e7958aa5fe88058750f8ecc0decf70b79dd1be85a38988f8929e7263abb01bba95965800009381ed351eddb0fa653bf1dd2d82b0dcbd644d98f066b9fc3e48690fe18b2084515352f558033ba\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c52cf\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045cf32df52f44331c723f7b513b476c9aa41e2dab3be9ace9864b6dc0f919492d46a7a52674f359a7dbed67a49e09732132053a9cde77eaa564fdce3cafe7738b9f4a62e14d7fc4acbfb0196ec29a60565ac2b3043dda4cedec8cb1ff291b90d41\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fac25d9ab05e1c85b45aa41798674daebf462237",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e900000000852477de60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912704301000000434e8635dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bab01000000ef552e5e0380634000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875e020000\", \"prevouts\": [\"f4eb1000000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\", \"4b251000000000002251206c72b3037c076bc24cb037d18e3d205b716c1618de062091033c827bbd6cacd2\", \"e5f4200000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"047d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4d71d423df8d84b17d708d44fb85f057f10e7a19067ae82c5093f6b2e5d73dc0d3ad511cf44769b6705694216a5b431b28318b130ebf832e7f6887216fa315d1a343680beaae3fbea53ecc49afe7cbe880992a117d636f336d7d159be7b446d\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c98631dd6d757e946b35f133dbe1fc758574142a05432a88a9c9ab5699e20b5a3af26a389e120e94680e27477caee46163f2ffed4e6499d7dcb61a15b1d76a7c8460181b685601280cbfaae0e90478ea5ae6fea73a2d03f5a79a14a3e0c6d503\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fad3ceab7d42e3ad2e07e8e88420e42ecf4dd0b8",
    "content": "{\"tx\": \"020000000206f5bd527bde63f7c45daff54c390a64a59dabeafc8078a9bd0a050f54db6b44000000000096e4218fd15657a619affff084fc6b1bc2cdf5e85e399bb207d84ace710aa8effb82232f0100000000d0187eb30492422a51220000001600146d764276c66fec1127e5074db5bff3aa6c5255335802000000000000160014a4c1279efe108bfac1a01a2fe5d5c45b8fa18363580200000000000017a9143f5d8a006e43f5509420a4ea1e0b36ae11579f4487580200000000000017a9143f5d8a006e43f5509420a4ea1e0b36ae11579f4487a529293a\", \"prevouts\": [\"22cbf72c10000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\", \"ddc7342412000000225120b3c1b5eb7ad8055b17188a846c986bb22e20c96017f7532122d5f2784100a664\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"inactive/scriptpath_valid_unkleaf\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"927f78d725339a9988bb82916001c2fe87cdbe2f22625c6e57a38b67b3a1e9cec429468441f91a498d977c0cfbb981493a854cadfbe774133a9c0875c07d3d79\", \"20159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717ac\", \"c2159f9373f8b28a67627a464ae370e1e712479726144a1a48958863033f16f717c320986550a60a376b2d6a26894b932a0140931c95b78be03572545c726a283e7902b78fc59ae74800241e9b7a2e0578a35ace37791478c3e04a51e81e708c61\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fae57409d88f4b4a8521c3bbd0560991c2a8986b",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a901000000929372e9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c190100000046ba7ae502e2b28d00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748795000000\", \"prevouts\": [\"d018370000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"22c3580000000000225120dd69e0acb4456a75559641628e54f237a5bfa27624d5103e01688d193a4ffbc6\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_7d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"9b6b0b5e56df64ced40030513c996573d84ba715e04642611b2663e910925c6f4bb9811b7d90c53f38bd997d37193d541ba12fafe02ca029d260cea17267e6b202\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"718f09d59653ff2e9def5e1d294c31803d32b6394e8a400a74d6f2d4e1f94ded7e19d26d48aa2bf80c27192453c89a8f9f490c588c5d2c871cc988da5c3352297d\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb0c60f40b98f2127746a9a359165bc8d41dcb8c",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cb00000000e2137298bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4b010000003490f9c1dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5901000000e9b952fd0237c4c2000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000017a914719f78084af863e000acd618ba76df97972236898757020000\", \"prevouts\": [\"30081100000000002251204ebf7559d8ece5a24eb4557ad9651ea9e540f660a3b9ceeb85b1a057c0cbe335\", \"bc186b00000000002251204ae1ababcab221c9b79fd61156e6b377c6d7a0004ca7d6810cc3f2d6a7149040\", \"22bd48000000000022512095cedeef0cb7aea3c0bd06d7fb572f0efff66b1d28013a778af1acfd69604efe\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"937d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71ef65737139d8cb51b826e6105ecbce8352aa10f0d50686f2268ca6d7900ff7d4462d371a9b01f30ea116c30e8195d2d6eb7c97c8692c0c95de95a904f83b96ad4\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e88b73eb14a8afa044a1a6f0495df635bb2745ae30a5fce84d6222f661b17136fd6f60e166ab3c31d6fe53c0e4c47c333102fdf48f7428a1dab907384d3ec09a32\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb18611c9ee4a416896469762bdeb28572310087",
    "content": "{\"tx\": \"020000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703300000000690e42c28bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c42102000000816bc2b260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270f701000000b4d361eb03c83c6000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcad010000\", \"prevouts\": [\"3f56100000000000225120b874b1e22d211de93cb73e099e487e9eba0bad15702159b3571f2da29e9ccdb9\", \"e9274300000000002251201d9d7b8068d804e3524a88462f1a480f3f4200cc7b90f0ee3c3216cc2f53f488\", \"35100f0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_6\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"8c7b47569d187d9fb6d3209bddb5ab3e7bcbd6ffeb3a8b88b82ec3df5e38f5ce3014d70ff93e31690e6e7a9cd0991db7a6ae4548fca0e4395b82d91cc67f4a0782\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7bc8cc7487cf84f6a0956d7c87b1d000eb1bd650ce6c4f9ee0974ef72428586e3fd1c4c2da9533a80705c394d952ff6decaa6e5f40b16875e0d6d9aa287a03c606\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb193ee81245f14d9b19cacbf56cbcb01dec02be",
    "content": "{\"tx\": \"4c754ce802dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c9700000000926720a3dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c80010000001f7d298004572a9800000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87b7128437\", \"prevouts\": [\"effc4c0000000000225120e181fd7d5a5189f175c5e112edc7401a8c528393c340dac4325961e6f48db1a9\", \"631e4d0000000000225120a283e1ea0142d34d03fade4b28902cd262d82bab6ae3891658a9596d967dbc43\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"617d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e460f3bb33adb38a0b939502b6e7259f92f13a6469935cb372eb38500268af6f1b0e931380661372836164f4a50b3ffb46f1fe83bc177b7c1bf309591800c178bdd304186c0a2faa80f59261766b0cb9b0760b78eb1f31f166a6f091ab62e6898\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9362d1264c87f4fd59154372454f3974cb0401499307bfe3672aaf1c84c6b5643ec460f3bb33adb38a0b939502b6e7259f92f13a6469935cb372eb38500268af6f1b0e931380661372836164f4a50b3ffb46f1fe83bc177b7c1bf309591800c178bdd304186c0a2faa80f59261766b0cb9b0760b78eb1f31f166a6f091ab62e6898\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb3a40b01dd182dc32fd94d86be6aeec9cfda7dc",
    "content": "{\"tx\": \"1addd65a01dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c6d01000000c90a7298021f0149000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88aca6000000\", \"prevouts\": [\"4bb74b0000000000225120d632d9c3807cee2f3b07918ef684335c8e7823a1a0eb476eaf46267e076b018f\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"147d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ab0e9d9a4858a0e69605fe9c5a42d739fbe26fa79650e7074f462b02645f7ea7d9d0ef68974064b15682d7a9aede6e3fda6769a3db9d22f26322e1baaf4532e568dbaf979cca58396dcf271ee6fc736edd00965a3b0ecce9c87347ff88ab08a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ab120007c9d6e5438fb32187fc2295f6e0f6d7a9b61cc04930744a089d58d965ad1099cc9bb3a5e2066786e30d0fff4359b3ce527e140b44a0b5c89c6b4383919a07a456edaef7c148906e899606040bd539df7c8cc4ad6955d406f95fd3100efb63111b06c7a0ce3f44d9f6906db8fc60057b72694cfd58ed25db88d188e5fc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb3feed4650211ed4fd84c29e022288219979e4a",
    "content": "{\"tx\": \"020000000160f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b401000000391043c902e2fa0d00000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478776010000\", \"prevouts\": [\"1591100000000000225120703a27ee37b547411791bd0e189100b9b1aab12509c8c95d384d172c3abbca5e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"bd4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f8a7004a68fdc05e100340c712f74a3d62667ca0b5d0eafc5e716949571fe18725432b67bf7a212872373c5ea5ac6512ad650fe3d5c26e1d584bcbdba0083b9a9e9ba325ae7de51b47d98058ae5f9889bb6f52223c96865cd06dfd05531cc8a0\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93617cd6ee4f8b94dcd19f57a756bcb8a90fe2911c96cfd4cc653cd06b0f9d9556a5bc79ec207f4553f17b4d8afbf0e47b02e8cf3ab2b0172732171fcb0f92ff87125432b67bf7a212872373c5ea5ac6512ad650fe3d5c26e1d584bcbdba0083b9a9e9ba325ae7de51b47d98058ae5f9889bb6f52223c96865cd06dfd05531cc8a0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb47b82833fbb82a6a9844bcfa75012bfc49c9cf",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bc9010000008d41693360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fe01000000b3acba1101460a090000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc89e64f5d\", \"prevouts\": [\"b00c260000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"90ae0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_7d\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"905259ed3a6600c70020cdb0b7411726f739bbd391413e8854b27206a8eeee859c2ceb63b692a5be63c475329c63dfd927d8be177fe715e97de4324edb0b240381\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"625e61820c26157f79553e1b70a3a0f7e031893951c5b1a7f610ec9931a50b7d876d9e6986e773543d16a700b5fccbfb11ffa771e1e20157444aafecfe014b427d\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb56305966435f548db004e141dd614dcb71150d",
    "content": "{\"tx\": \"020000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701602000000869bf9f460f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701402000000ab8972f801e82b1100000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac09010000\", \"prevouts\": [\"a0941100000000002251205fb82515a803bc66e22805d16c9967a9f99675502991462318dd4d89658b7382\", \"2266120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_4\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c6d85fabb6cfea1892b3bc9dbed3194c971f18589af0585b597a745f07d3f63a1052b7ccb4b08be1505ead737f1870985337cd9f60c5f16d62a0c583a7dfa1ca\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"cc3dd89d7aa5a798699cd36c6630645657e8266ca54dda89aa335d7930a33605acfb27d771d8ecac702a66250281e9105b3968196010e0abb52dbf97879081c204\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb6bbbb8192f592ebde7d1bb37924cade63c96c8",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3500000000f75e818ddceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bdf01000000a0889ad4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b87010000002757f8a404a146990000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4875dfe903c\", \"prevouts\": [\"79b65900000000001976a914bb1edec93acb47abb0cd0078cfdb77063cd446c888ac\", \"221d220000000000225120086c5a8f8e6906e62f6d85a81f1ec942fa4d0768e046e2c41c1e8b8749778d7d\", \"80fb1e0000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063de68\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d7b27a3c30fa3f74fcb2fb63df4fd439cfb75b063c79b31cc96700ee0514110802b5f712fb146ffe69ff220cec8aeafe04d8a9d43d299b22043a34551aa1e56e09208a3d5cb0b20fec302022af702ea090b934668d0752a16a75cba2aae8c677\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936cdde2ff9e08044486741f25be80bacc73799296fd9f200381e6c31b1185faea4591d3592ddb0f56a18929886f1890713028f922113494349427ddaa1ea39184e02b5f712fb146ffe69ff220cec8aeafe04d8a9d43d299b22043a34551aa1e56e09208a3d5cb0b20fec302022af702ea090b934668d0752a16a75cba2aae8c677\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb803c7f3034af611f6dd19c6cd55245f319dd86",
    "content": "{\"tx\": \"9ca1b5ad038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c46400000000a64e37f060f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e001000000fa4a59c660f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912703701000000d0973dde03647656000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688acd90b845f\", \"prevouts\": [\"ae4139000000000021511f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"4d750e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"7465110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_10\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"3c098e408d58f71373567968cbca1b560e822ca3b24fcd98666b0c4d6a47f9e466c8a6d753121ed9497a6eda066ab59673423d343ae08f31966e5c6a5b84b8bc81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"34b2e9db76efd5bbce32a47f6a93610de3874fda52b060e6a7cfbedeaa76c85a7062626222eca22018b62b1ecaef7f9d85064b9c18dcf00a19a1fe7ebee5faaf10\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb84f0eaf5bbab71df0de66b8e502f2e52604fac",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cca01000000beed76a9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cfa01000000006e98b98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4b701000000b215db96035f51d900000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7f08c9e1f\", \"prevouts\": [\"f6c5510000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"2aaa4900000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"ab2940000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"c74c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93670b862a9e953c5158d35cb69a591b350b4931a459f6811c437cb72d14d86572024cf807c4b041deab506320299ff116921971164ef72b2742896e58a89a98f91cdb1729650f5e7315a74782ce14a5f1169946bc7ff3758bb098f0ad0a25b2b7f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"614c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d082aede7f6feac32430a03a6fb4ca18c03b66145006034584e3a19904465ea1e66424cf807c4b041deab506320299ff116921971164ef72b2742896e58a89a98f91cdb1729650f5e7315a74782ce14a5f1169946bc7ff3758bb098f0ad0a25b2b7f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb964d7fe5e195fa98766d8c4058c8258646e95a",
    "content": "{\"tx\": \"f608de5102dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1c01000000234b88da8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4e200000000afc6ffcb04a1565700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7bcb4062d\", \"prevouts\": [\"be01210000000000225120d632d9c3807cee2f3b07918ef684335c8e7823a1a0eb476eaf46267e076b018f\", \"4c44380000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"147d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936f78d8e6fb6c853fdc672d488ae32f4e909f7a3793ceb1fbacf52fce604b8b07d7d9d0ef68974064b15682d7a9aede6e3fda6769a3db9d22f26322e1baaf4532e568dbaf979cca58396dcf271ee6fc736edd00965a3b0ecce9c87347ff88ab08a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936da584e7d32612381cf88edc1c02e28a296e807c16ad22f591ee113946e48a71e7a317a052512b66d9c0a593db192e28ab9b1379143982fc432aa6f278435f8ccfb63111b06c7a0ce3f44d9f6906db8fc60057b72694cfd58ed25db88d188e5fc\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fb9e6ec52fad74ca4a775818f110ba219adaadbb",
    "content": "{\"tx\": \"9a528aa802bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf76010000007a3820ef8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4a80000000038f526ba02ce2c980000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acd87ed42c\", \"prevouts\": [\"60e1680000000000232102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\", \"5ef9310000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_79\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"47f6ec7e814a5acc4a2d30b2298879c35acbc0daa00962c7a9c41f87d614c802b3b0a55a51bea2d093bbe22be426d8f21eb878200b526824e44af1955ddfa4eb81\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"001c07a63e03f4d4bf7b73fbf2f480044f0b54c11e24ad0c6ea4b00241ec5f85e91dfce4780a8d7f8e0cbbea0ee27f34426f89c017cb5a8faa515f91ed0890c779\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fba8bb171f6333a2f8f8099ed7061ca7507012bc",
    "content": "{\"tx\": \"2b467a1e03dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3d01000000139453f3dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b81000000002569e0acdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4c01000000b62770a0012fe80c0000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc33010000\", \"prevouts\": [\"8f265c000000000022512035205488698c55c3e7035f1484d2f513744eb9d8b6fb6f0df083f7669ef0bfda\", \"7d6a1f0000000000225120cae2bb06a958c067dd1208634cfec6f24075b217020915696a25607be87b4540\", \"d6c05300000000002251205e4247b509e7d8a6d6f324d155ac6817eba62ef7261a7c3067f7c871658806c5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364ad853b43a90b24cf1df821e2e638dfd9c14c3d8474f8af4a5aef1878bd54085\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a53616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fbae541afc8fd2842b660a15ba61db2dbd26dca5",
    "content": "{\"tx\": \"0200000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4901000000213507c5dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c5300000000f92f4bb6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf150100000091782beb0145d3670000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fcc4eafb2e\", \"prevouts\": [\"6e315000000000002251203d78fd2bb4b62ef0589e0f6d3292b9d4b4f73a96f936b719c8327103cb45d1ec\", \"96f25c0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"60086b0000000000225120f31e3a320eea15b969f8b18ed69a6dfb33cc054a2307ba2bd3877db1ef9fdc39\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_73\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"a0d981aa2f946ce124668f185fc5f8e7cc4b0dea59feceee0365603b1577a0e23ada5bb27e48debfa96504a531e975513e3eef10ea7ab753c817b2932d405b4d82\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"968228efe5e280d21ca3d7c033c93d5da349f23d3120ccfc0c93c44228f536b2fd71ab923813d356412d93a515bc7fb8e0386238f9a898314cae0d7a5798925372\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fbd1df6484bc96485135c2b29c3b125355c62848",
    "content": "{\"tx\": \"0100000003dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1a020000005f503664bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf3a01000000af22f6838bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45a01000000ec72071c0131d9410000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc7bf29061\", \"prevouts\": [\"8127570000000000225120679c204dddfbbd298129e4670a621c532ae6353c600a37c86662e442bb91ded5\", \"5719770000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4e193e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/hashtype0to1_keypath\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0465f5807019e300f51eac08f5272990f1ca970cb0e1deaadf44250141d44de331a90434d535b49c339120ca7893dd5a3f879937e563104eace1e31ef490db52\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0465f5807019e300f51eac08f5272990f1ca970cb0e1deaadf44250141d44de331a90434d535b49c339120ca7893dd5a3f879937e563104eace1e31ef490db5201\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fbeb89304a55a7ab8a338b807ad02b8dd2ab9c28",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127072000000003a6d923adff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c2301000000ec825d2b0388966900000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc7a76d4227\", \"prevouts\": [\"e98711000000000022512009ca3b7467d9dea91d906b1b0e7a427b6496d4aab6be2799f71c47ade6ce7f57\", \"583e5a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_d8\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"524beb9f61e89a1f59df769d68a1ccacfd26cab78398d52646483d8fdfa733a0b4571b776590cb1b8f43aacffd20be68473133a0c1a32d813e29b0889572d32e81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"c7785dcbb83d524a33cb932d8431188cc233d9c90416f996d3e19bfb5b8d9b45453906088269089c39c113b26a0464256b97f53da86a144d2d9647f908ffac72d8\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fc1908d2145aa6f1cf830f6aeb9bf24470454805",
    "content": "{\"tx\": \"a16810340360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270320100000001d67dfb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912701a00000000ce8a8e9e8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40601000000d70e389401384e260000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79622030000\", \"prevouts\": [\"40320f00000000002251208fa17604bea1a2fa3728b697c38b10509b65e0ce8e421d974d98824035b3dbb8\", \"2701120000000000225d202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"41d2360000000000225120469b0d5af3b652b8630a1c8a749c6ca969e84c67dc08b1fae26a9cf0bb3b6587\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"25ef58eb18e36d98d017aca2a5e61c3f3a073e2ce9fd7caaa909ebd761ca6f8f521440ee2c3e95cc0a6698708ea3a447ab3649da8ecf6d13d543db378c15f690\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fc6ad6441d0d3ba1260efa94e68b4af0576bf63f",
    "content": "{\"tx\": \"4431cfc6028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c40701000000be5f58b98bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bf000000000206778f03fb9a7700000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f871feb932f\", \"prevouts\": [\"fede3f000000000022512012b975b505febce3d90537f513ce86dc778c6aa76aa4c7c143b3b99f1662d22e\", \"5c57390000000000225120b5fac7f9d1efa21092b4bbfea1ca41fe5694dd20d67936ab2b478b1ec4aee588\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_2\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"c98207f6e7e605a3700ebff3688f2b4769adf8b0d5ca1032dde96a951df98a8e0d478d3835bf3b542e9237d546024a898fc4cb8780c754bf7f55cc5d2d7ac8bb02\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"f8f17060fc893a7aaa17959d793c734978e744c5b5293f0e109255a8bbf4939b85c1d02dc1af34a0497e2a4553d37d05c3750e735523ab90a49b3a0ce0aa252702\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fc6e7fbd1048ad4d4f9eadb18d79a7ddaddee244",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfd6000000006b1f0cfb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270fe000000009f41f51201fadd4e00000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac43020000\", \"prevouts\": [\"70e7780000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"88ef0e0000000000225120eb71a13199b51ac9b0ace6bcee525494dad4a8780bc850f36224b177f5d9dc5a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"5e7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08259bd71c400ab2f54869740392a5675e37e70879689c9d1a6bcb33863a193d8cf0c8cbc16505271ed8ce1a03d67d2c4a35529bcf4a25ace24696315022c27c9cf\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93601f485ab8dab36fc4237cf32204629d23ab8b7a9b8c57b9fb58bb07cc298c65859bd71c400ab2f54869740392a5675e37e70879689c9d1a6bcb33863a193d8cf0c8cbc16505271ed8ce1a03d67d2c4a35529bcf4a25ace24696315022c27c9cf\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fc72b1ff88ff0bb9a8e7a27d860b1e727bc825b0",
    "content": "{\"tx\": \"0100000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c13000000007dd53f9260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b5010000000b3d637101b5bf3d000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6d1010000\", \"prevouts\": [\"ba5b49000000000022512085bbaf732586004b91d5e29af7be3965e4cbd4294c3dd4aad30280f6dcbe0145\", \"a090120000000000225120473417efae73fd5e93fcc212950b9b19ee652cc977c17e6edd4b3172c741ca78\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"217d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa9505bf473a3597e826ed191951239b12c364d282b43e59333c5c9d2effa4a8821a54b706cb1ffe8cdd8302265f43043d8c7f0cfca18957505a6e0d7d2690f95c84bdfafc9427bbc75e549436fc0749ee4f6acf063a9661c81b3024fc653ae79a\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936612f59f79f08a8dcd41fba0e90fc36d30e7d0e0028aa30a51161912fee70ec039505bf473a3597e826ed191951239b12c364d282b43e59333c5c9d2effa4a8821a54b706cb1ffe8cdd8302265f43043d8c7f0cfca18957505a6e0d7d2690f95c84bdfafc9427bbc75e549436fc0749ee4f6acf063a9661c81b3024fc653ae79a\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fc833899bb452572fe6f3e84efd6737cca4eb786",
    "content": "{\"tx\": \"1aeda83f03bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf9900000000a9e71ddadff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c1601000000c1e722ec8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4bb01000000a0e9adf902bb0efd000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88acdf000000\", \"prevouts\": [\"6cae7f0000000000225120ac005ce4773d3aee0620b129ba36f72cd2ee645537f63f3488482809f788413d\", \"02fc470000000000225120cdee1b260cf2a57b2a4f41467ca1d526e01a2fabdcb63f8ae4942bbd063c3ae7\", \"ca9e3700000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b81e5f8184480151a33ea2ef90622481c324d5b0da017369a2ae7e89125987bb4ecdbff3eecb3f5fa90fd3ed1bb4a8c0c36fc15f71a4102bd4f372c5f95e5c7d5941b26b476c022edf868776977d31e53e85212ba204fe552062798c457a392dc1a6e987e7baaf45cc4656191a1a193c7abe05aba02d24b24cf2747f96e1d33b\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363cfa0f25e80db82d1df7d31067deb7f7ffba540dee916ca5c0f9f286a347a1270ec0b51bfc4485592d1a8fc32a0105404420a8dd2ba09b048dd208f3df546c127e5a3ad1358e4c8217aebfca59af3ae3bc6dd2d33fcb7e66f52e86370eeb61bbcdb1729650f5e7315a74782ce14a5f1169946bc7ff3758bb098f0ad0a25b2b7f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fc9c2ac36745e20f981008bf5f85f146b9c9dbb1",
    "content": "{\"tx\": \"0100000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b440100000090a859b3bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf91010000003771e53e030b83950000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87d8030000\", \"prevouts\": [\"0817280000000000225120325bb8bd692aa21257fa568f0567c628c6e8ab7924eed74b5d76df030defb001\", \"86656f0000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"62\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d8b553b0a6fa8101b21fae89df5dd09b18d30a3ef06025a3f9cb6b07028f8b60ad339194ab8214f981edb9ff4477fbcef7a6ea6cf7b4eddf16a8a4e2aa6ff5b2a28c39ce330a19a0d6c22ddc640bc3609271e6194de475fecd1ad84a88d361935a9a81b6bc4d13af192f1d19d1915de95ad8d42e49add8bb4e9a9400ca460b05\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93608efc3524da3cce9064a39cd829c421044a59a48c5000df9ec45b645663b2d3865d6469ded31e8361d538153e3993104db0c9d480dfc3dcfe9dd6d2fbda5f8f6abc42ab3738335b78a2a7135de763706b017ef32cb75bc24ca1210f74f6e5b7b3fd119d5a804161d41189f11d8f3e11243ae602674c5e73f1686492aa1f485fe\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fcc3f72c08a026d3c0f4cc50227793a26fc3efeb",
    "content": "{\"tx\": \"acbf9f810260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270cc000000000eb572d4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b920100000084c9bc8602e0ab2e000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388acb0633037\", \"prevouts\": [\"2dff0e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"f34f210000000000225120eec26bd33d4c7b88cfedb1ec4d1edaf2070bd273924a77ba1006105de9dd5258\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_48\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"154f4a7affa81c867d749fd1b19a4a69ce000dee1ca40bf935972f02c3a587f28d6b11986c09b73e0714491915a3b082f28a89c3b5450194ccde0964e2936e0881\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"d5d3799e272d242fb0a696ce31aab9ada4d1feda51a108c8e0dcee97b7917d1dfe24f37583dadebde02c01505e0189d8f4f46bd1d9ca2a252209746171faf17d48\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fcd03d953e3452f116e4035d2029de953e62334d",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a900000000bab6199360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912702000000000ac5597b703f23b1c000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48752d1432e\", \"prevouts\": [\"fa6510000000000022512066e06b662ecb6981e0f3917eb0b6248b84ec5cd53a7a521c7d24c865c53918b4\", \"febe0e0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"907d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936a54b43c188a8877a2a3a86a1fc429fffab130c683e7f6d5ea2708892288e828358fa50c6d7a3057541347f50382af7d86a4158110d747d8a87c6e51bda235e7807d6dd053b835b300872a79bbaa392d17bbe19548a92a63c5948e9fc7e63dbc8\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361773499d4b7734b9d17b8063bb26023932d8136237a2a4376fdf258dbd3041e4ccc0d92396a6e5b4e10ed573234ead163b054b024f08ace7ccde70990779f457ba4f11ff80ca9181e3d85997fa959accb8f97af45a52bfd0df916797673441f5\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fcd91aa7ad2c0011f8f2516f5687f9e91aa76b71",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b550000000085442cebdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8301000000993071c6049f014a0000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487580200000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f87c8000000\", \"prevouts\": [\"9ec324000000000017a914f5a65ca4534ef3ca5833434c0dd44a3e128f499587\", \"f67527000000000022512068810aef011b819679577c24f008f8785d9903d2c43eb118d09024962a03144e\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/scriptpath\", \"success\": {\"scriptSig\": \"2259202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"715c4c8f8e8b3ed1787fc9df753dd65839bbb5842ed20e1c32139ea87d240b5694bd3b9318237b306aacb4ddd25830c6ea683312f30219e2522c1694eb888217\", \"207d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ac\", \"c0871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e2046c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fcda2ec36cb7652d368098a0c2ac64665164601f",
    "content": "{\"tx\": \"4817304a02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8b0100000004f694a9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7b01000000216ddf84044aeae6000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6fe1c4f2f\", \"prevouts\": [\"c95b7a0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"d8d96e0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_2c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"e860e3cdae548610f7dad2b1a4136b1635e0bb85a0f9315b93d16ad48e40c7f773241ce115d1663ab5c4746630764df389f967dce8621e24a38532460c94abe981\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"ebfce58453b0036ebb933e6816f5aac009ddf80d14115ebf6664464fc5e31f36a92fcc6c7ab2c8b3f6891f5f4deea77b318bd6deaf59ba2d0172089d4de347fb2c\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fd03276208dbd6219a958f47d888d22fa303e89e",
    "content": "{\"tx\": \"28a354820260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270ff00000000be3b46b4dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1a020000000e78c7d001ff502400000000001600149d38710eb90e420b159c7a9263994c88e6810bc79c000000\", \"prevouts\": [\"1ea6100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9e2f22000000000022512061049d3bf8d8628387c6dd15fd6aa94597135d2428743d9f5049ba6d570084f3\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_3c\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"42740861859d08047fed4c9e32fdcfe049ac0cbd2db6bb0a9647b99dee8028c3ac59a5800d0796927a475ffd468cc0311b86e0034313f57941102410c85720bf01\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"711608cd1a51181983c5fe9bbe7491c3a0cb0daea2b35bfde8ac0b6a5f52f7d377ac459d82ecfa93a62be7244c55ac45b75bb94dc86c6f30dca7dd609bfe485f3c\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fd14286e8c496b3f62dea79de42d57a7b02b22fc",
    "content": "{\"tx\": \"e0ed141303dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b93000000001fcf05f6dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b7a0100000091bd69b9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfc8000000009a4857d5047746c200000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa93083937487bf000000\", \"prevouts\": [\"bec22800000000002251207e677ee6e0a9f5a7b76d32fc490de736680fedcc1b5666802b0cdd6035d1f989\", \"73802000000000002251208e3aff7c578d941c4c0ef50f0a58a5ae91118406955ace5ac0e7cb917f87f0e8\", \"8c967a00000000002251208560e60ff9f5f50e17abe0faa94b8704db3bcecc7cb6f74a11a752b4bbc814f5\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/bare\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"967d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e889b1afbd82754ccbdb229e33ad6472305abc54dae2fa9ac3a68b58b93ca8c8390ad15d5ff3e747c4643a2e7779e2cae74c1db700bc0de7d47935e7ffa6ea968f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936393d3666f153f5444bbde9f12a33ca18bffeb96af6c3b3812e1be180585532ecbf86d7708a8015fd8c392d5dfda539be3c55b3d42b83ba5bec57bef080407e280ad15d5ff3e747c4643a2e7779e2cae74c1db700bc0de7d47935e7ffa6ea968f\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fd1a057fd69f2113eeeafc133d9d51c7cded9125",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270c700000000f132150a60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270af000000009c88c48704e0582000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc5802000000000000160014deb4696df95e4685eae8f9ff2e77fc7edabbe2fc580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374876daaae5e\", \"prevouts\": [\"e225100000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"19be1100000000002251204e92f58f07bd1c983dce937cb6ff2655b495f5bbe642bc389d13f2d55749a90b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"a87d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936783a3bc7d79cabcbcc0867fb5538daddb7c00a7193bf5b1437e698397aa24b0d5480c0b3df47fa838c1e54894d9f77b7e2e8bb4e3c514b095e8a55995fa5d8569e26d26d9f798657ab1642d8194f1f5dc9158412142f65824f82701f20125ac7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936438d090c2a648f11c3897ecefe41fdc11118ed9b1c4529cbb2ee4038fc727b19159738ff2c4f90cd16c07bb852218b8a19eccf086ed61d505eed94e2770983c2cd165f299bdaaa06ccf8947d9b12e815a5b39fc50068532880492a3446c423d89e26d26d9f798657ab1642d8194f1f5dc9158412142f65824f82701f20125ac7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fd1c6cdb67bcc23e0920c0b2724591695d7e88b1",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c491000000007392a7f260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912707500000000579abf8d03798c4b000000000017a914719f78084af863e000acd618ba76df979722368987580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e4876b000000\", \"prevouts\": [\"f7dc3e000000000021581f2540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b\", \"ee930f000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pkh-sighashflip\", \"final\": true, \"success\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"30450221008e336def7ebe3e190b6ca7af316f7560a09ac6567f419ac68fe49abf806ff95a02200e9c0495f41c9ba589242c52e30d41f796752cd58aa61bab0ebca7adf24d811b03\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}, \"failure\": {\"scriptSig\": \"160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"witness\": [\"304402205d3080ceb411b4ef46aef3fd3e2ab493b5e005b33ed0423fad0589e5334a6a840220070143503584eab6d74eba4d0bef2b4823d0f6797e946f5b60f11217ff587b4a03\", \"02972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fd1d4fb758440d51c0db63f8a401ad4f7dd1ba6d",
    "content": "{\"tx\": \"a5db689303dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8e00000000ee83d8e88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49d010000003a8b0fcadceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b6e01000000d40773fa021b25830000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb79658020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ace0020000\", \"prevouts\": [\"24a5260000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\", \"e8e73c0000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\", \"4909220000000000225120acc511cd55079365da76d18a33af3ae7411f3879a9caec918e9264c8959f5dac\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"alwaysvalid/notsuccessx\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a50\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9367ac1a66615b2aaa170e13c634fe4adc8e21579cd2ad4b0e05677ccecae701899\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a30616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936fa0cedfc8c4c5a04ac3787009b16f69cf342d2af09b40867d2c29ecd108727e2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fd1f6bb68c1a0317e7fb3e9c65ce2b765717f38f",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709a01000000adafb548bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf8201000000cf248c1a03e0558a000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac05010000\", \"prevouts\": [\"bd9b110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"4ea27b000000000022512039db30de33ea15b8f8fd0a316b7175d66e0ba7a162f794600ae9aaebda3948b7\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_90\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"31fb061ded3aa06aeead8cef95af3f5ab33eaf6af75fb1c2c8068eeafc6a374453f6fa96ecabb51ed47a2e44780cb75ddc6744d295ebe3e8574c8a415afee6a883\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"84654a7a4cf578f1918dc1d48048039bd30ae9ec1adc37bd1fe9378e377c2c6211b7ae7b0c96c997a4b5a60d39c1b8890eb1ede443ec626fe4b3ea6ce85a442590\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fd275d920066468018b3ec78708e01bbf4634f89",
    "content": "{\"tx\": \"0100000003bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf6b000000005c19b047dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c4300000000fa054f9360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d9127072010000002e2b715c0281e4d10000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000016001428425a8aab0a57cd9398c2c78c3d097fe1a397a6940e7f4d\", \"prevouts\": [\"ab4c790000000000225120a57586f77f9f96f121f5205525f023e067d8d4ffab15aca94e058cc3473eae5a\", \"48984900000000002251202361d91ff13391fd25020ba7e60c60643b5255f5adbfbdf7f0353592847fec4a\", \"4c73110000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001inputs\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"f7\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936dbc4082c88742c64e777227e559cc787fa79f9ad49b3844bdd2aa78bdd53ae153e2d335f383706a312226510c4ca5ed297e59b2981bccad977d4984b4ab81a7bbe0beccf8b53a38f7a20d51eb008bdc60f78fac094fdd23935202ece673d8622376e34112ab1bc736956b41978cebed690ad16294afa2ba0e9d8b5fa7e9f6f2f\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"61\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9366d95f1ea0a1fd23653d05da4ad0eda243001c7a04351d1c2a22e8a2afb82411fc18d13f23505bf80401329c8d1a0bac5ffbe219ba0d96925c38e985a7086f175ac8db205c7d3bb0390b2e22910f5d1cbad00807eee3325f4c4e7f4412ed3064a1c25c837ec0a1f852472f3f26e6d49055bb98717b7b68c46cae1e5f9804f9145\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fd30d1fabe3c70d63ebf6eb08fcc889f2062dd96",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c43c00000000668a0bdfdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cc300000000031806d602a2158800000000001600149d38710eb90e420b159c7a9263994c88e6810bc758020000000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac11cba52a\", \"prevouts\": [\"b5fc3f0000000000225120e32017a134852f161f6cfbdc82f7fe66db755e2ed5bb55497d5cae1e53c5c006\", \"d02e4a000000000022512019bef84f9e846c1fdc0e0b6c8a2e8cd0934b4588f64b20133ad72602ae6fe529\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/unexecif\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0063d368\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93699c890f1cb77bd1e07e1591340b8ea7c636a6b93a8dd025cb092d0253a3c2a4496525fdd0eb5f3c5c39bf5b04d78b37703e3d3b538b36e17fa0ddbdeb236a5daa4337ae81428241101d56ff91a1822e405405037c9afab8da6ba5df5d84918ed\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"00636168\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364c6a87e468bc2f4636d01a06f33fa62a820a91bb3fa58159484fa6a6e3a3321f8f435ba6abdf70be4dec7b2a0789d26eb9361219ce4916c9f3e2c2146b2213509dff863108f68b54d204f4b43b2fddebfd69630b8c1a20ba8be96c4e7e2557a5003e045cb689fe4fc6de332c618eb0cdce02c2dd8aae7c6dd6f70bdbaede2814\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fd4b486776c7fc4e964a57db37f46b6fb893446f",
    "content": "{\"tx\": \"62db20530260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270b30000000059a62bffdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c8d0100000072c0dded011a3b5000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac4c2e7253\", \"prevouts\": [\"f1091000000000002251209807c6fa5fbdf8b77e6e8a9ff33ccee8e5ba6f6b181d807daf9039f015b3a190\", \"c7f15f00000000002251208acf7a61bb45458dd86d3c9f45a9fce258820fbbf84c7164c88d41367f6e76b9\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93634d7d9bf32378ef7c35504ad126f5933fce7000c51c0cb771db02273ac9ce3ce99aaf103cceb41d9bc37ec231aca89b984b5fd3c65977ce764d51033ac65adb45d26c3c7079b274e62542512e39807ee92511541c708e3b51bc61366b8def992ef429df53f77997a088ac7849be23d2367c05dc96029904e93835fc046c3c5b9\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9361ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d90045d300bab14a59e521ba24782c2f2145d4a7429c0cdd6ce75f9b04f76a9e5b4d519d9c6e51540aa9a09fa82ae61189b3f4badb16bfd2877ff7bde730e5687247de05f27aeb1527a9572d42a0ad2bcfbe2bc67b36cc3101a74fc3488cf03d6f1bd0\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fde4e348195fef4158d57bce09b8132261e53404",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfcf00000000b38236dfdceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8a010000005a24c55301f9287000000000001600149d38710eb90e420b159c7a9263994c88e6810bc78fb4e75d\", \"prevouts\": [\"e7bd7500000000002251208ae894af2a9600386c37dee4cfaf898fd39bd624f9812efea0f89b144f5e3b3c\", \"1d6a230000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_d1\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b812a9eccfdee570ea0932c50b747c18f9efb7d24bc86523f8013c60d6e2c9330faa5b6502762fdf009c7b2f67d233b7de4b49377639d2f0208da94d3dd7300e81\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5db5f597ecf51d78218b825845253793121754d6c4298eea9bd02cc8cfce48a7717b3cc912d223589d9e45812bb8c60d0ba478149802626104f5a169f7406d7ad1\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fe3a254545ba65877f7f12c1957e6983a9540725",
    "content": "{\"tx\": \"02000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4fa00000000486720d6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb200000000fa9d4aef03b15daa000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac24ac6649\", \"prevouts\": [\"0aaf3d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"804b6e0000000000225120f46c27e4be4b28b9a4817d4bb21e6d76e9bff45d28c4e23d061d7fc56326d512\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_76\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"b34b78c0f4f93e8146e965541e2435fa7f87a26ca202cb0ca98dc2f2fd9f1171ec37a43174416403df31a5b17997fc8638d297220e5fe3f386bf3aab32b89ccf03\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"85b963bc8b6543e0415f70d92974aacf0a9e26dc91540e7f3f31d85ed46a53a54fc1041d4a1f34e94701747d3bbc467ad670f92261992740ef3312fdcadf6d4c76\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fe4991f96a4078203ed82f3dc9d57b0f5c8d7c31",
    "content": "{\"tx\": \"01000000028bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4c5000000006242d66edff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565cd601000000ddd1212b04e58899000000000017a914f017945d4d088c7d42ab3bcbc1adce51d74fbd9f8758020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a914c629d61df58baceae110d15eb5b55e144268615388ac58020000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88acb2000000\", \"prevouts\": [\"26f83d0000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"36595e000000000017a914856f7c6a5a6a1ac0e553b769a4c35bcb9fb6f50287\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_87\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0d1ffaeeda23e31038e5a484758074dca0089f8b9381b15cc25283479e2840fad7f770b4f5decef5df5f22a16e045da1a2faeed7c103e10eed6daa193cd4b95703\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"5f524706c16a3a58297c7c107996d87e2cd25bc1f7d07eb761eb950dfbbd67007af96d52608ba90f24a6d035f47578079744da1e6c4829739e7015d3fcad5f0187\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fe5a94896e814e80a5d4f0d17825ea303d136807",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270a4010000007ffa04c8dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b250100000082473360dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b0b00000000b573fe37040fb04f00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e48758020000000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e790c8515b\", \"prevouts\": [\"d2ef120000000000225120ea663cdaedbff64137eb6e6df4db9508c973045e9b4d61d7f67dd2d12ed5b278\", \"8cf01f00000000002251209ae0f9a30bb32466818047220431a71836305abdffa7870d853c3e44af672d80\", \"df861e0000000000225120dff7f04a1648925acb0c2995e1633664c97ab25bb4c317b29fea48d8a2c27a17\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"ae7d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363f7be6f8848b5bddf332c4d7bd83077f73701e2479f70e02b5730e841234d08231f1765c4043c65869fc44409698468cef1d88a3aab3981df946f88d25a1c2d5c67b1d078674a4d97323398e107b13ccefe9299bb9116e21f935c64f37bba24f619c7e3fc3d0f43b284295c7c76b7ff66dfc7bbdbc495ce3e8e20608c97360e5\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936252d0fde16f88d3d71135f2afb7fd13a00ae20e347d34ef21ddf868171a0f5b8b92d0c8bb72b9935581697fe84ef0173536b04207acfd5de8a2df8889a2a895490189ee9b6b94816743a58868693b6f0ba58cb07e4c6d5ed2ce590077e887d5b\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fe754dfb4207b538736ac33f4d6d3a8b39ed7eb8",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d912709800000000daf956298bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45e00000000b3893e6902e64243000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa930839374875802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e740010000\", \"prevouts\": [\"4038110000000000225120b77a4d3965d24a3fad7e13b4b8f89b1c642ad197d3735fb97eb5af1aa4db0ae8\", \"f0bd340000000000225120fa8a9eda5cf5b8cdf600ff6d95d78a3e3ba730f4e5093bedd0b749c08f958e88\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"017d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f93646c7eccffefd2d573ec014130e508f0c9963ccebd7830409f7b1b1301725e9fa54ce7cc5f439b597f56fd9de2c1657ae9d64eb6e71f5398fcdfdc60a0bc251e633479914332f6e309839a0f3b0f115e1019ec5f6a2a9189a2d7ee13d1c4f5f4ae05873438be84f92d1402d5d55e9fb409fe52800aaeb5db180b239b834bc1ca2\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e4f09646afdeac9857da657a09b8018dcf81d67c29f0281da7afdb83ec8526e8e4e5ee47dc19cce5f5bcfbe17d15c6a925997647a0a2c3c32d22380bb5e59a56e05873438be84f92d1402d5d55e9fb409fe52800aaeb5db180b239b834bc1ca2\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fe8a403b551fce23551c1a364c5d7a9bdf4082b4",
    "content": "{\"tx\": \"010000000260f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d60100000045a55a8fdff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c760000000073f099380186396800000000001976a91490770ceff2b1c32e9dbf952fbe65b04a54d1949388ac2586664f\", \"prevouts\": [\"f629120000000000225120b4ca0199f2c1b4fe89ded0fec9677a159da93a40f23df8c7f92820e897b82544\", \"06e05a0000000000225120d05281144396364d925ea6b3a1aef63a9288a440d2428aed5ab1312e751c56f8\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"opsuccess/undecodable_bypass\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"834c\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bf852205919db101e7100c264881cf502d3d2e764ba6b83faae2c86d526b113f2b9d1447cbfb5d72d5da72ac5ad193469eaa6b44c038aa23e2a9d2dd480586adaf3b292550aa3dd1beea84cf7009fb6c6992543e64edf52f25a9194aed3bcd7c\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c5283\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936ff698adfda0327f188e2ee35f7aecc0f90c9138a350d450648d968c2b5dd7ef91ef6944ca9eae19b43c4423072484bbc3f643e0e770f53f8e7474c81f5d900458e881bd6493e98dc576a1c76b7dda488b188d283086ec2219562e3f5b97e3fb63f980255362d30444bd4a09dfd60422f4fe5b70b7cde78729ca8cd52cb50aace\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fead4cb9efe769ed34fc79a6f7f7c301fa44b950",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b8801000000c8c8d8b88bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4ad010000004c9346de03c1f76000000000001976a91401f109af244d8c7f2563284ac2d2ba7d6323a75e88ac580200000000000017a914719f78084af863e000acd618ba76df97972236898758020000000000001600149d38710eb90e420b159c7a9263994c88e6810bc731010000\", \"prevouts\": [\"4b5d270000000000225120795828cbdd13db8bfd99175dd96610ae8d272a9240d5c9e537830514248aeee7\", \"c51a3c000000000017a9146f2d26adc5ad58653becfc45ce03a0b1167b1b7e87\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"applic/keypath\", \"success\": {\"scriptSig\": \"225f202540f27e90740933c99d4f17ab2dfc6c82951cfb0b8674c83ad179cfbc247b89\", \"witness\": [\"73d8d5d8ed532f0f53c3e0f5a4fd64ce0dd9b9af52c8ee51179644ed0386a7e56acd541b49bef09466b789571a82c78c95f3dd46bd51b44f513d4a8f7cf182af\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fec0428a7d5b4dd2f894abbef22a4fd55b125e79",
    "content": "{\"tx\": \"0100000002bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf7c000000006ccee4d5bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf550100000006f9c30c016ca90a00000000001976a914f9cfef42654b8e1307276f4274b9e35435f17e8d88ac1b9c1b47\", \"prevouts\": [\"66cc700000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"9fee7e0000000000225120b5fac7f9d1efa21092b4bbfea1ca41fe5694dd20d67936ab2b478b1ec4aee588\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_unk_hashtype_a7\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"0dee6e0544a085c8a15febbd719b6e253db589d68487212f4ce2c93d742bc535830cca84f845d1506fbedebf02f9768a6ef5d1e4dbad8f878701309f199eff1681\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"7e9a4442076322941c3512c0d70ff676e7f84fce1c13ccbc11dabed4705c8d2d1bb4ad1d0cb0b44b13dce392c77e728d7baefa05c2d60847d9743f4ecd129df2a7\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/fed7b4e8b0ffa8ba7ee920409e365993f8f23423",
    "content": "{\"tx\": \"0100000003dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bf101000000673c277b8bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c4370100000035cb6dc58bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c45d0000000023dea660014dee30000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df47879c010000\", \"prevouts\": [\"f5ff280000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"0bce3600000000002200204d9fa7499ad409ec9ec48eb45241c17306a16ea85aa9131c6c693d5ac440e116\", \"67f0410000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY\", \"comment\": \"legacy/pk-wrongkey\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"304402200eed20c923d2ec7fd6fd0412758ca0fd74be8a2b42e716a369b732d4b1812a3f0220749423388300602ad44c525c88e6a2f8b3364efc9ada5bd241f50da4f878f57901\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"3045022100e120bcd0c42112150a93961039df1f5282548ffb791bebbf2063fc0ce3880b790220577f0761154e3f35545b6eaabd84153a6ce7e0b666805531e1647844d822c8b101\", \"2102972df56c6f8e97bfcc0f442f93cfc00fc91f37d7ee3708f904ad9af3abc29404ac\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ff02cab52406b52d736534063539b815a83e9ec9",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270130100000004782a72dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1e010000004a150c568bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48d01000000dfbafbcc0153c12000000000001600149d38710eb90e420b159c7a9263994c88e6810bc776010000\", \"prevouts\": [\"053e120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1850210000000000225120bf7c0652824d65f4682a3056a4ee7d3427d5bd09fcf8c412b9591353033138ae\", \"3e9d3b00000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\"], \"index\": 2, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/1001push\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"447d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936b929eb7e8ad4e073db170590e53035ad212210bb9f64e5a212e35f16cad1d1a0da290f4428e3e675f4a51c1ca36b5af7f0162ea7962d369252b53cfa5e2a91134f357c04ffd5ab4b0848fd0bc62a9916d6f879ccec8b8201b6b82c9f83bee932\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936473b52d2f86e55a148378d231c070b8b3f2682e3af8489ef4b5e89a9ad3d421046ff9fefe634101043d8ca11d5a4647687c0df4bd98e414158186cc8065d9a91f7b6e2c095a2b9a1b3d0ba71ae2a36fa91117ca9fadc253f03c0f98f0de350244f357c04ffd5ab4b0848fd0bc62a9916d6f879ccec8b8201b6b82c9f83bee932\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ff0c9a3fa047cac34488cf6902e39ceb0b31a1f2",
    "content": "{\"tx\": \"2cc56a15038bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c49a00000000ec9501e6dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c7b0000000043261ee960f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270e100000000823f43cc013ca96b000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487b5010000\", \"prevouts\": [\"c1243f0000000000225120036cd49b0a5a8928de04f8e04bd3da02711fbb4d9053aeba12a20cf11cba05b5\", \"bb6f4700000000002251200106699296107db4ccd4290b8d3cc7be3754a2d9979743f64d14b4c3e7741f8d\", \"cd9e10000000000022512014168556a36ebb5fc7069983062b713ccfb69f91c25af78f116f616f92a54679\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"tapscript/sigopsratio_5\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"9a5c10aefbfe506270d18f51e3be8b44d93730a589604d3e1927f1a51d003c71429665b47fdf8bf1de06d0a417b9db74d9d56685b35ad6e57f11deee7d5177e9\", \"96e22827d237bafcee6a73a75c6a0e801dd9792f0b1f30f99cebac9452a0c866b29bbe5a422a3a3a108e60151df9d07fa61bb2fb824875f19faf5e0e\", \"75005a29dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b3250ba5a8829dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b32506e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364f8548ac9430c378b802a76bf4e30330b029db06562270d6dfa552c82f7ad828e4624988dbf1a8e05379085fe4f1d6daf4c052cf4e31fa12e77ebff59a6d1354000000000000000000000000000000000000000000000000000000000000000081eb60ecb145257b9a19aaa8c28dcc18c09e8a27d8f71ac28dee91a3117f6396ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc40e504b0102296de467c96da7e93b9174579d48da6397918b442a10bcba6549ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d04f1eb9ef398401490690d5d07e06cff4af8360fe27af9a63bc5f407a83ca8a5241e263d8c98cebbf362e2f0177af6696af7ee410e6642fbe91e0e216320689b6c2f432398bccd3202a6fddea1631b0c72129de51fa4a0b5b8cdbbaefc8b37ea04bf92e580dc3c05cd14080d8c1d5af39f5dba79470b5c86f67841386278ef0000000000000000000000000000000000000000000000000000000000000000057ad767594cbafa2ef386a7d859e365266f1c6028473d451552269018c152754d35c1deee4ec7deaeaa831940ac201271b6ff776017bb50a44bcbd42a0c164b511cfe55e11095d26e1ccbc0bcc0f69c673f0a76d41cefac9551a860b225dc38ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff31f8c6befe27f7d412413acf38cbeb58b24a7961476c2b373b6ae26a6f114a1f49d18c9b7c39eaed314f293ff206f53e67992e1dba3e6c10d0cfb9c6f5c55874ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11bdf10d236531c096bed1430c3f73887f20c7a94898c8c08832c27fe2e7ae420000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe53f0c91c28ad9fb56769cb7f6852de91427d2cecd613e78323eb1647c287d4fe45daf562ed92d3f70d93d776c50cd7104170022f9714c22c0eb2a60e62e93d11d00987f263adad68f084a3fa19f55f577c12c00242e3df2afd487d4a9be407a77057648493ff83a64b83763581afc73f88546e4c8c65a1a183ac99fbe86254399cc5d7346b555c2da780d05477850ba4a1c8cf3e0174889ab50bd917dddbaa48b1465b1783e37520bae6833f5c1eb425b398b379bea622d9299e67dfa74fe46652a9c4d9d09dbe4efb9c134356818b8f370bd01045ad70aa4166a29cd56160c75f1ed36289f63eeeff2b9bc390022ca828a1e325f7db8790bae25846d92f384f331588ae8361ce48197c4fa3d84e917b7b094596a42c9fba9ff70a2df18d998ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5698d2f1e8d99f280adcafd85c48e656006e47b8f0eb554b25fad29f38026015c658a33b444cfb8855d6c8c6b7ee7831149e19a91fc7e7c36563558e288347a6dc14210dbdee7b1ee2afe12374313fc9e90f7d54bc72ca8c9728bd18f27a992f13cc42831ead5b3c2231edb7dbd5b41fa74b5183081618dcfbe43f899ca3a223501baa00eeec5d37da5a1c6973c6685eb86690a2196e95b6372c40f81163bc5534963657b2fad15ce0772d0f30ba336255a26afc2cdf1eb26984cb6e47e0c32f25e33a7a8681fee80b544addbffe10ec28fa79b05f0dbeee61dce9c221bd4db6\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"9a5c10aefbfe506270d18f51e3be8b44d93730a589604d3e1927f1a51d003c71429665b47fdf8bf1de06d0a417b9db74d9d56685b35ad6e57f11deee7d5177e9\", \"b2a8004ce53e9ffdda644b661b18374f7b878a6d1c36733009cdd3ce5a69b2d783d72e6902bc31b3c3dccf2bf3aa8665128354ad1b8de05fbe8f23\", \"75005a29dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b3250ba5a8829dd0239d45c6ebc84fce483cb108c20da66a09760f11ee5126885a304919e89dccaa3bc1d22786b32506e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba0111886e607cba011188ac\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9364f8548ac9430c378b802a76bf4e30330b029db06562270d6dfa552c82f7ad828e4624988dbf1a8e05379085fe4f1d6daf4c052cf4e31fa12e77ebff59a6d1354000000000000000000000000000000000000000000000000000000000000000081eb60ecb145257b9a19aaa8c28dcc18c09e8a27d8f71ac28dee91a3117f6396ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc40e504b0102296de467c96da7e93b9174579d48da6397918b442a10bcba6549ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d04f1eb9ef398401490690d5d07e06cff4af8360fe27af9a63bc5f407a83ca8a5241e263d8c98cebbf362e2f0177af6696af7ee410e6642fbe91e0e216320689b6c2f432398bccd3202a6fddea1631b0c72129de51fa4a0b5b8cdbbaefc8b37ea04bf92e580dc3c05cd14080d8c1d5af39f5dba79470b5c86f67841386278ef0000000000000000000000000000000000000000000000000000000000000000057ad767594cbafa2ef386a7d859e365266f1c6028473d451552269018c152754d35c1deee4ec7deaeaa831940ac201271b6ff776017bb50a44bcbd42a0c164b511cfe55e11095d26e1ccbc0bcc0f69c673f0a76d41cefac9551a860b225dc38ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff31f8c6befe27f7d412413acf38cbeb58b24a7961476c2b373b6ae26a6f114a1f49d18c9b7c39eaed314f293ff206f53e67992e1dba3e6c10d0cfb9c6f5c55874ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11bdf10d236531c096bed1430c3f73887f20c7a94898c8c08832c27fe2e7ae420000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe53f0c91c28ad9fb56769cb7f6852de91427d2cecd613e78323eb1647c287d4fe45daf562ed92d3f70d93d776c50cd7104170022f9714c22c0eb2a60e62e93d11d00987f263adad68f084a3fa19f55f577c12c00242e3df2afd487d4a9be407a77057648493ff83a64b83763581afc73f88546e4c8c65a1a183ac99fbe86254399cc5d7346b555c2da780d05477850ba4a1c8cf3e0174889ab50bd917dddbaa48b1465b1783e37520bae6833f5c1eb425b398b379bea622d9299e67dfa74fe46652a9c4d9d09dbe4efb9c134356818b8f370bd01045ad70aa4166a29cd56160c75f1ed36289f63eeeff2b9bc390022ca828a1e325f7db8790bae25846d92f384f331588ae8361ce48197c4fa3d84e917b7b094596a42c9fba9ff70a2df18d998ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5698d2f1e8d99f280adcafd85c48e656006e47b8f0eb554b25fad29f38026015c658a33b444cfb8855d6c8c6b7ee7831149e19a91fc7e7c36563558e288347a6dc14210dbdee7b1ee2afe12374313fc9e90f7d54bc72ca8c9728bd18f27a992f13cc42831ead5b3c2231edb7dbd5b41fa74b5183081618dcfbe43f899ca3a223501baa00eeec5d37da5a1c6973c6685eb86690a2196e95b6372c40f81163bc5534963657b2fad15ce0772d0f30ba336255a26afc2cdf1eb26984cb6e47e0c32f25e33a7a8681fee80b544addbffe10ec28fa79b05f0dbeee61dce9c221bd4db6\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ff0ecc250f060fadb2dfbc788f027f6c46ef6c40",
    "content": "{\"tx\": \"c1eba3db02bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf4f00000000e94ce9b9bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acf40000000000bf6ebc6028687db00000000001976a91497b8b6d3828f12a792c9de6df78e0b1514b7967688ac5802000000000000160014f19f1969da9e474444a7b8fc50ae71f46e1eb796bb000000\", \"prevouts\": [\"0e8d74000000000022512056830ed1745d06f5c865a011820a618c1aa3c70bd00028049bf30f33c5c664cc\", \"cf0d690000000000225120469ff3412c89f5805e53fbb9303c790a98dd32093d40e3b7dfe22bb05f85f37f\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/keypath_hashtype_82\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"b2b1f387b9825b810412ce3419971c4ee5c35106a558c6faba67d6b82e228086ccb09a4cb73dd2e73ed6f9ced1e170e78aa8e29f47da6669cc424c6b8ced7e9d82\", \"50174d347af8ea2207120d07506725832b840dddf73f1573701a23084184426fbe18911e046a0533fd933b5b49f4886da199bf25550f53a1472cebe9e24e66298054be5d5301c3834510ed84198e654f3c8ca3a7e36114f8818c395e16c529419271a7c5ba205a3158e12afa1ac3446d681c5e51d94c308df2c33fc9c171bffb836429a9841d6d2710c26b80c6e227548562af49e67bc02b486214149e86e30321157d1289b382577c22fca76c52df489eacd2f933a225f2e03e47add671d2921b90c3b3f0dcf6badb0bc8ad21384a13ec63c85b6481357fddb63b2efda345\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"bf64ecef48e9d5122211f7261b14a8fafed77649f7108a8c7f59a971722f50d0a7a21de1757c1deea12605a4de9fe961abc481200bcfdd36d1529f5f4a563cc882\", \"500cf653630e8d24a23667e26672a6cd044ac9ea916488d508863d2daef6177d00f03161f89a8d001d917167eec87c6ae8022f1afb02785ee38d82c6c95f22761059b6f68605\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ff269c4192d92ee1330ca6cb368ffaf3dec65d44",
    "content": "{\"tx\": \"010000000360f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270130100000004782a72dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b1e010000004a150c568bd9b9012d1e9d0bc9c34df9d487a1d5663f1b37dbd4a857a2bddcbe25f0d0c48d01000000dfbafbcc0153c12000000000001600149d38710eb90e420b159c7a9263994c88e6810bc776010000\", \"prevouts\": [\"053e120000000000225120860597d3b29a47949c68e53703a7c358236fede9036ee1439f49b54ea72cb70b\", \"1850210000000000225120bf7c0652824d65f4682a3056a4ee7d3427d5bd09fcf8c412b9591353033138ae\", \"3e9d3b00000000002251200fa149a1be921b54e78f55c020f385d43ef2042352395c285ad3c0f835b7f327\"], \"index\": 0, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"sighash/scriptpath_unk_hashtype_54\", \"final\": true, \"success\": {\"scriptSig\": \"\", \"witness\": [\"f46c55fd5a01d67b7b26b7208fbb53d9c3587c277f716f62b7030122f999b17401be49a0d19888c8fd110aedd4c0fbe5a162ec1b6b7da66f151ddb36d637776602\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"55b094ae001890588580a9c3fa4c6d045ef5398d50b35f60e470f9b2749624677b457298f433856679c5aa0bd0184271256ad3b8135b037048375850e8807d7b54\", \"0020871bf677dcc1eeea213f60505c1c9f1695f8b7d2ee8bbacb3ba246e9f1e57e20ba5187ab\", \"c17d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9363ca46e263a260b65760ba16fc7221d8949b643b52b6000a40fc66cf5b479cf31754943580dc1bd6713260228477cc107c802e16d4edc27befd908a8bf6eb3629\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ffba9a51f35e6cfeb9726e3eb3551989a55a2ab6",
    "content": "{\"tx\": \"0200000002dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4b910000000007b8c7cb60f8b8616e71e7ed05613145ce7cda782ac9861e64f9ce24e333ca1e91d91270d2010000006a6039d303ae933100000000001976a9145dabd582fbdb106f3f7460c03ce83bc27d461d0f88ac5802000000000000160014619b982e9f6832d2edb1a1ee4e7656a8d72c65e7580200000000000017a9148f07d0f98cfe0d6aff29ca20bcda3fa9308393748784110e48\", \"prevouts\": [\"759f24000000000022512040610cb8e3decd88d4c59cdbdfeb76bec671852dd837e2ccede76befc391039a\", \"1a8a0f000000000022512003f4235cf93ae95226c79f4ac7e76f24996218ade11a16913609a6e39f31ad9a\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"247d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936eebc95ded88fb8050094e8dfa958c3be0894eaff0fafae678206b26918d8d7ac2f1db23017f271ba09e9de40cbf6bd4b292cb969b1168724d03b4425efd5cf153506420e788c3ffd3d8d88ddb9154e82106737a8dd2b5d0940daf68f275cd0d7\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936d34b659cf09d8349f11874dab6e59e9cab85ba068159b5d193f4bbbdcc88f75d5e7553debb7d46df339c30c507d2c3e528ab4da6adeae898375a123e3f0f1c20ee08d5698d988fd8465309aa10a601f39a775c4be89f69280a5de9411e45585f440784f6f41cc1ae323b623cf5dcb000da45020704fab66b6b5f2ff7d67a93a3\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ffbfc4371313a95615a944ca1fb473bf2569d7aa",
    "content": "{\"tx\": \"cc2e403e02dceb5f5568f8ada45d428630f512fb8efacd46682b4367b4edaf1985c5e4af4bb10100000091ff68d6bcb2054607a921b3c6df992a9486776863b28485e731a805931b6feb14221acfb901000000bd8eaca701a18f31000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df478795736527\", \"prevouts\": [\"94a2240000000000160014bb1edec93acb47abb0cd0078cfdb77063cd446c8\", \"ca7d660000000000225120618acdfff396d05c4f42f34a54f40947ed380d009b19743557014bb4ecd5d247\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/return\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"847d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936e7e370719e3d30fbc2ea4d983b233608f68df319a16a215567d8496b6d2fdfa7cc3b36ccc81fe4912a925ea2b1eb99a41bced4468215b0c94e7bf4feca6759c79f31796df107fae040796e44aea27c7a7d41418cdc7206378fd34089f9daf951\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"6a\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f9360641e660d1e5392fb79d64838c2b84faf04b7f5f283c9d8bf83e39e177b64372ff78d21b135ee37de5fb006beb46b85f4aedf8bacb6598da1f15171cdf92c209c568c76d6b344a062dd798f6575db1f1731d6a7ca3f2682e7e1b801cd94d3826\"]}},\n"
  },
  {
    "path": "txscript/data/taproot-ref/ffc6076c34629ad5d440389f97bac8efcd2db5b7",
    "content": "{\"tx\": \"0200000002dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c3a00000000e20d6af9dff9d694a434b13abfbbd618e2ece4460f24b4821cf47d5afc481a386c59565c56010000002af908f40301a1b1000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487580200000000000017a914472b5d2e0c04ba5495728dd81d0885af2587df4787580200000000000017a9141d5a2c690c3e2dacb3cead240f0ce4a273b9d0e487363aad34\", \"prevouts\": [\"c6e55a000000000017a914c9840c38196e75dd475876fc1e51c080e92b574c87\", \"0950590000000000225120c3ede40be7fa2b5d36872db3a22bce0eb482f16144c003b683cf5791052fa029\"], \"index\": 1, \"flags\": \"P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT\", \"comment\": \"unkver/undecodable\", \"success\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"287d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936c89a90bd6ee635b9a469d0d01d0c15436cff095a2a8e7aa2387b3d6b61c337a118f8625f860d8689a2679aa71112fac717f40bee978e3269b215b9f9d8467661efcb4d33820b2e80b50b7a60cab20b6261c566fe48480267b41ad585cde9a4bb\"]}, \"failure\": {\"scriptSig\": \"\", \"witness\": [\"4c\", \"c07d732801de7e0c866f2462f29c14b63e555159b62ba93a5d5963d1c04795f936bf7d06d12d9f93c68b7270a0e92986b9529219a8b1f03a05e07750c355db869496153d9d0825641ad9dc2862c4b07cae929842b36229bdcb06007f7d47362644efcb4d33820b2e80b50b7a60cab20b6261c566fe48480267b41ad585cde9a4bb\"]}},\n"
  },
  {
    "path": "txscript/data/tx_invalid.json",
    "content": "[\n[\"The following are deserialized transactions which are invalid.\"],\n[\"They are in the form\"],\n[\"[[[prevout hash, prevout index, prevout scriptPubKey, amount?], [input 2], ...],\"],\n[\"serializedTransaction, verifyFlags]\"],\n[\"Objects that are only a single string (like this one) are ignored\"],\n\n[\"0e1b5688cf179cd9f7cbda1fac0090f6e684bbf8cd946660120197c3f3681809 but with extra junk appended to the end of the scriptPubKey\"],\n[[[\"6ca7ec7b1847f6bdbd737176050e6a08d66ccd55bb94ad24f4018024107a5827\", 0, \"0x41 0x043b640e983c9690a14c039a2037ecc3467b27a0dcd58f19d76c7bc118d09fec45adc5370a1c5bf8067ca9f5557a4cf885fdb0fe0dcc9c3a7137226106fbc779a5 CHECKSIG VERIFY 1\"]],\n\"010000000127587a10248001f424ad94bb55cd6cd6086a0e05767173bdbdf647187beca76c000000004948304502201b822ad10d6adc1a341ae8835be3f70a25201bbff31f59cbb9c5353a5f0eca18022100ea7b2f7074e9aa9cf70aa8d0ffee13e6b45dddabf1ab961bda378bcdb778fa4701ffffffff0100f2052a010000001976a914fc50c5907d86fed474ba5ce8b12a66e0a4c139d888ac00000000\", \"P2SH\"],\n\n[\"This is the nearly-standard transaction with CHECKSIGVERIFY 1 instead of CHECKSIG from tx_valid.json\"],\n[\"but with the signature duplicated in the scriptPubKey with a non-standard pushdata prefix\"],\n[\"See FindAndDelete, which will only remove if it uses the same pushdata prefix as is standard\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1 0x4c 0x47 0x3044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a01\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000006a473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000\", \"P2SH\"],\n\n[\"Same as above, but with the sig in the scriptSig also pushed with the same non-standard OP_PUSHDATA\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1 0x4c 0x47 0x3044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a01\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000006b4c473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000\", \"P2SH\"],\n\n[\"This is the nearly-standard transaction with CHECKSIGVERIFY 1 instead of CHECKSIG from tx_valid.json\"],\n[\"but with the signature duplicated in the scriptPubKey with a different hashtype suffix\"],\n[\"See FindAndDelete, which will only remove if the signature, including the hash type, matches\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1 0x47 0x3044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a81\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000006a473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000\", \"P2SH\"],\n\n[\"An invalid P2SH Transaction\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0x7a052c840ba73af26755de42cf01cc9e0a49fef0 EQUAL\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000009085768617420697320ffffffff010000000000000000015100000000\", \"P2SH\"],\n\n[\"Tests for CheckTransaction()\"],\n[\"No inputs\"],\n[\"Skipped because this is not checked by btcscript, this is a problem for chain.\"],\n\n[\"No outputs\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0x05ab9e14d983742513f0f451e105ffb4198d1dd4 EQUAL\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000006d483045022100f16703104aab4e4088317c862daec83440242411b039d14280e03dd33b487ab802201318a7be236672c5c56083eb7a5a195bc57a40af7923ff8545016cd3b571e2a601232103c40e5d339df3f30bf753e7e04450ae4ef76c9e45587d1d993bdc4cd06f0651c7acffffffff0000000000\", \"P2SH\"],\n\n[\"Negative output\"],\n[\"Removed because btcscript doesn't do tx sanity checking.\"],\n\n[\"MAX_MONEY + 1 output\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0x32afac281462b822adbec5094b8d4d337dd5bd6a EQUAL\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000006e493046022100e1eadba00d9296c743cb6ecc703fd9ddc9b3cd12906176a226ae4c18d6b00796022100a71aef7d2874deff681ba6080f1b278bac7bb99c61b08a85f4311970ffe7f63f012321030c0588dc44d92bdcbf8e72093466766fdc265ead8db64517b0c542275b70fffbacffffffff010140075af0750700015100000000\", \"P2SH\"],\n\n[\"MAX_MONEY output + 1 output\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0xb558cbf4930954aa6a344363a15668d7477ae716 EQUAL\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000006d483045022027deccc14aa6668e78a8c9da3484fbcd4f9dcc9bb7d1b85146314b21b9ae4d86022100d0b43dece8cfb07348de0ca8bc5b86276fa88f7f2138381128b7c36ab2e42264012321029bb13463ddd5d2cc05da6e84e37536cb9525703cfd8f43afdb414988987a92f6acffffffff020040075af075070001510001000000000000015100000000\", \"P2SH\"],\n\n[\"Duplicate inputs\"],\n[\"Removed because btcscript doesn't check input duplication, btcchain does\"],\n\n[\"Coinbase of size 1\"],\n[\"Note the input is just required to make the tester happy\"],\n[\"Removed because btcscript doesn't handle coinbase checking, btcchain does\"],\n\n[\"Coinbase of size 101\"],\n[\"Note the input is just required to make the tester happy\"],\n[\"Removed because btcscript doesn't handle coinbase checking, btcchain does\"],\n\n[\"Null txin\"],\n[\"Removed because btcscript doesn't do tx sanity checking.\"],\n\n[\"Same as the transactions in valid with one input SIGHASH_ALL and one SIGHASH_ANYONECANPAY, but we set the _ANYONECANPAY sequence number, invalidating the SIGHASH_ALL signature\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x21 0x035e7f0d4d0841bcd56c39337ed086b1a633ee770c1ffdd94ac552a95ac2ce0efc CHECKSIG\"],\n  [\"0000000000000000000000000000000000000000000000000000000000000200\", 0, \"0x21 0x035e7f0d4d0841bcd56c39337ed086b1a633ee770c1ffdd94ac552a95ac2ce0efc CHECKSIG\"]],\n \"01000000020001000000000000000000000000000000000000000000000000000000000000000000004948304502203a0f5f0e1f2bdbcd04db3061d18f3af70e07f4f467cbc1b8116f267025f5360b022100c792b6e215afc5afc721a351ec413e714305cb749aae3d7fee76621313418df10101000000000200000000000000000000000000000000000000000000000000000000000000000000484730440220201dc2d030e380e8f9cfb41b442d930fa5a685bb2c8db5906671f865507d0670022018d9e7a8d4c8d86a73c2a724ee38ef983ec249827e0e464841735955c707ece98101000000010100000000000000015100000000\", \"P2SH\"],\n\n[\"CHECKMULTISIG with incorrect signature order\"],\n[\"Note the input is just required to make the tester happy\"],\n[[[\"b3da01dd4aae683c7aee4d5d8b52a540a508e1115f77cd7fa9a291243f501223\", 0, \"HASH160 0x14 0xb1ce99298d5f07364b57b1e5c9cc00be0b04a954 EQUAL\"]],\n\"01000000012312503f2491a2a97fcd775f11e108a540a5528b5d4dee7a3c68ae4add01dab300000000fdfe000048304502207aacee820e08b0b174e248abd8d7a34ed63b5da3abedb99934df9fddd65c05c4022100dfe87896ab5ee3df476c2655f9fbe5bd089dccbef3e4ea05b5d121169fe7f5f401483045022100f6649b0eddfdfd4ad55426663385090d51ee86c3481bdc6b0c18ea6c0ece2c0b0220561c315b07cffa6f7dd9df96dbae9200c2dee09bf93cc35ca05e6cdf613340aa014c695221031d11db38972b712a9fe1fc023577c7ae3ddb4a3004187d41c45121eecfdbb5b7210207ec36911b6ad2382860d32989c7b8728e9489d7bbc94a6b5509ef0029be128821024ea9fac06f666a4adc3fc1357b7bec1fd0bdece2b9d08579226a8ebde53058e453aeffffffff0180380100000000001976a914c9b99cddf847d10685a4fabaa0baf505f7c3dfab88ac00000000\", \"P2SH\"],\n\n\n[\"The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63\"],\n[\"It is an OP_CHECKMULTISIG with the dummy value missing\"],\n[[[\"60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1\", 0, \"1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG\"]],\n\"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004847304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000\", \"P2SH\"],\n\n\n[\"CHECKMULTISIG SCRIPT_VERIFY_NULLDUMMY tests:\"],\n\n[\"The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63\"],\n[\"It is an OP_CHECKMULTISIG with the dummy value set to something other than an empty string\"],\n[[[\"60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1\", 0, \"1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG\"]],\n\"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a010047304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000\", \"P2SH,NULLDUMMY\"],\n\n[\"As above, but using a OP_1\"],\n[[[\"60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1\", 0, \"1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG\"]],\n\"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000495147304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000\", \"P2SH,NULLDUMMY\"],\n\n[\"As above, but using a OP_1NEGATE\"],\n[[[\"60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1\", 0, \"1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG\"]],\n\"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000494f47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000\", \"P2SH,NULLDUMMY\"],\n\n[\"As above, but with the dummy byte missing\"],\n[[[\"60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1\", 0, \"1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG\"]],\n\"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004847304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000\", \"P2SH,NULLDUMMY\"],\n\n\n[\"Empty stack when we try to run CHECKSIG\"],\n[[[\"ad503f72c18df5801ee64d76090afe4c607fb2b822e9b7b63c5826c50e22fc3b\", 0, \"0x21 0x027c3a97665bf283a102a587a62a30a0c102d4d3b141015e2cae6f64e2543113e5 CHECKSIG NOT\"]],\n\"01000000013bfc220ec526583cb6b7e922b8b27f604cfe0a09764de61e80f58dc1723f50ad0000000000ffffffff0101000000000000002321027c3a97665bf283a102a587a62a30a0c102d4d3b141015e2cae6f64e2543113e5ac00000000\", \"P2SH\"],\n\n\n[\"Inverted versions of tx_valid CODESEPARATOR IF block tests\"],\n\n[\"CODESEPARATOR in an unexecuted IF block does not change what is hashed\"],\n[[[\"a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944\", 0, \"IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1\"]],\n\"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a48304502207a6974a77c591fa13dff60cabbb85a0de9e025c09c65a4b2285e47ce8e22f761022100f0efaac9ff8ac36b10721e0aae1fb975c90500b50c56e8a0cc52b0403f0425dd0151ffffffff010000000000000000016a00000000\", \"P2SH\"],\n\n[\"As above, with the IF block executed\"],\n[[[\"a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944\", 0, \"IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1\"]],\n\"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a483045022100fa4a74ba9fd59c59f46c3960cf90cbe0d2b743c471d24a3d5d6db6002af5eebb02204d70ec490fd0f7055a7c45f86514336e3a7f03503dacecabb247fc23f15c83510100ffffffff010000000000000000016a00000000\", \"P2SH\"],\n\n[\"CHECKLOCKTIMEVERIFY tests\"],\n\n[\"By-height locks, with argument just beyond tx nLockTime\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"1 CHECKLOCKTIMEVERIFY 1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"499999999 CHECKLOCKTIMEVERIFY 1\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000fe64cd1d\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"By-time locks, with argument just beyond tx nLockTime (but within numerical boundaries)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"500000001 CHECKLOCKTIMEVERIFY 1\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4294967295 CHECKLOCKTIMEVERIFY 1\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000feffffff\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Argument missing\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"CHECKLOCKTIMEVERIFY 1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000001b1010000000100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Argument negative with by-blockheight nLockTime=0\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"-1 CHECKLOCKTIMEVERIFY 1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Argument negative with by-blocktime nLockTime=500,000,000\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"-1 CHECKLOCKTIMEVERIFY 1\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000004005194b1010000000100000000000000000002000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Input locked\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0 CHECKLOCKTIMEVERIFY 1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000000251b1ffffffff0100000000000000000002000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Another input being unlocked isn't sufficient; the CHECKLOCKTIMEVERIFY-using input must be unlocked\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0 CHECKLOCKTIMEVERIFY 1\"] ,\n  [\"0000000000000000000000000000000000000000000000000000000000000200\", 1, \"1\"]],\n\"010000000200010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00020000000000000000000000000000000000000000000000000000000000000100000000000000000100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Argument/tx height/time mismatch, both versions\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0 CHECKLOCKTIMEVERIFY 1\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000000251b100000000010000000000000000000065cd1d\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"499999999 CHECKLOCKTIMEVERIFY 1\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"500000000 CHECKLOCKTIMEVERIFY 1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"500000000 CHECKLOCKTIMEVERIFY 1\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ff64cd1d\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Argument 2^32 with nLockTime=2^32-1\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4294967296 CHECKLOCKTIMEVERIFY 1\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffffff\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Same, but with nLockTime=2^31-1\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"2147483648 CHECKLOCKTIMEVERIFY 1\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffff7f\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"6 byte non-minimally-encoded arguments are invalid even if their contents are valid\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x06 0x000000000000 CHECKLOCKTIMEVERIFY 1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Failure due to failing CHECKLOCKTIMEVERIFY in scriptSig\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"1\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000000251b1000000000100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Failure due to failing CHECKLOCKTIMEVERIFY in redeemScript\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0xc5b93064159b3b2d6ab506a41b1f50463771b988 EQUAL\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000030251b1000000000100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"A transaction with a non-standard DER signature.\"],\n[[[\"b1dbc81696c8a9c0fccd0693ab66d7c368dbc38c0def4e800685560ddd1b2132\", 0, \"DUP HASH160 0x14 0x4b3bd7eba3bc0284fd3007be7f3be275e94f5826 EQUALVERIFY CHECKSIG\"]],\n\"010000000132211bdd0d568506804eef0d8cc3db68c3d766ab9306cdfcc0a9c89616c8dbb1000000006c493045022100c7bb0faea0522e74ff220c20c022d2cb6033f8d167fb89e75a50e237a35fd6d202203064713491b1f8ad5f79e623d0219ad32510bfaa1009ab30cbee77b59317d6e30001210237af13eb2d84e4545af287b919c2282019c9691cc509e78e196a9d8274ed1be0ffffffff0100000000000000001976a914f1b3ed2eda9a2ebe5a9374f692877cdf87c0f95b88ac00000000\", \"P2SH,DERSIG\"],\n\n[\"CHECKSEQUENCEVERIFY tests\"],\n\n[\"By-height locks, with argument just beyond txin.nSequence\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"1 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4259839 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000feff40000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"By-time locks, with argument just beyond txin.nSequence (but within numerical boundaries)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4194305 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4259839 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000feff40000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Argument missing\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Argument negative with by-blockheight txin.nSequence=0\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"-1 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Argument negative with by-blocktime txin.nSequence=CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"-1 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Argument/tx height/time mismatch, both versions\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"65535 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4194304 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4259839 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"6 byte non-minimally-encoded arguments are invalid even if their contents are valid\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x06 0x000000000000 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff00000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Failure due to failing CHECKSEQUENCEVERIFY in scriptSig\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"1\"]],\n\"02000000010001000000000000000000000000000000000000000000000000000000000000000000000251b2000000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Failure due to failing CHECKSEQUENCEVERIFY in redeemScript\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0x7c17aff532f22beb54069942f9bf567a66133eaf EQUAL\"]],\n\"0200000001000100000000000000000000000000000000000000000000000000000000000000000000030251b2000000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Failure due to insufficient tx.nVersion (<2)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0 CHECKSEQUENCEVERIFY 1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4194304 CHECKSEQUENCEVERIFY 1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Unknown witness program version (with DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x60 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b00000000000001510002483045022100a3cec69b52cba2d2de623ffffffffff1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM\"],\n\n[\"Unknown length for witness program v0\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x15 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3fff\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff04b60300000000000001519e070000000000000151860b0000000000000100960000000000000001510002473044022022fceb54f62f8feea77faac7083c3b56c4676a78f93745adc8a35800bc36adfa022026927df9abcf0a8777829bcfcce3ff0a385fa54c3f9df577405e3ef24ee56479022103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash Single|AnyoneCanPay (same index output value changed)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e80300000000000001516c070000000000000151b80b0000000000000151000248304502210092f4777a0f17bf5aeb8ae768dec5f2c14feabf9d1fe2c89c78dfed0f13fdb86902206da90a86042e252bcd1e80a168c719e4a1ddcc3cebea24b9812c5453c79107e9832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash None|AnyoneCanPay (input sequence changed)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff000100000000000000000000000000000000000000000000000000000000000001000000000100000000010000000000000000000000000000000000000000000000000000000000000200000000ffffffff00000248304502210091b32274295c2a3fa02f5bce92fb2789e3fc6ea947fbe1a76e52ea3f4ef2381a022079ad72aefa3837a2e0c033a8652a59731da05fa4a813f4fc48e87c075037256b822103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash All|AnyoneCanPay (third output value changed)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151540b00000000000001510002483045022100a3cec69b52cba2d2de623eeef89e0ba1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with a push of 521 bytes\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x00 0x20 0x33198a9bfef674ebddb9ffaa52928017b8472791e54c609cb95f278ac6b1e349\", 1000]],\n\"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff010000000000000000015102fd0902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002755100000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with unknown version which push false on the stack should be invalid (even without DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x60 0x02 0x0000\", 2000]],\n\"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff010000000000000000015101010100000000\", \"P2SH,WITNESS\"],\n\n[\"Witness program should leave clean stack\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x00 0x20 0x2f04a3aa051f1f60d695f6c44c0c3d383973dfd446ace8962664a76bb10e31a8\", 2000]],\n\"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01000000000000000001510102515100000000\", \"P2SH,WITNESS\"],\n\n[\"Witness v0 with a push of 2 bytes\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x00 0x02 0x0001\", 2000]],\n\"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff010000000000000000015101040002000100000000\", \"P2SH,WITNESS\"],\n\n[\"Unknown witness version with non empty scriptSig\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x60 0x02 0x0001\", 2000]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000000151ffffffff010000000000000000015100000000\", \"P2SH,WITNESS\"],\n\n[\"Non witness Single|AnyoneCanPay hash input's position (permutation)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x21 0x03596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71 CHECKSIG\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x21 0x03596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71 CHECKSIG\", 1001]],\n\"010000000200010000000000000000000000000000000000000000000000000000000000000100000049483045022100acb96cfdbda6dc94b489fd06f2d720983b5f350e31ba906cdbd800773e80b21c02200d74ea5bdf114212b4bbe9ed82c36d2e369e302dff57cb60d01c428f0bd3daab83ffffffff0001000000000000000000000000000000000000000000000000000000000000000000004847304402202a0b4b1294d70540235ae033d78e64b4897ec859c7b6f1b2b1d8a02e1d46006702201445e756d2254b0f1dfda9ab8e1e1bc26df9668077403204f32d16a49a36eb6983ffffffff02e9030000000000000151e803000000000000015100000000\", \"P2SH,WITNESS\"],\n\n[\"P2WSH with a redeem representing a witness scriptPubKey should fail\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x00 0x20 0x34b6c399093e06cf9f0f7f660a1abcfe78fcf7b576f43993208edd9518a0ae9b\", 1000]],\n\"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0001045102010100000000\", \"P2SH,WITNESS\"],\n\n[\"33 bytes push should be considered a witness scriptPubKey\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x60 0x21 0xff25429251b5a84f452230a3c75fd886b7fc5a7865ce4a7bb7a9d7c5be6da3dbff\", 1000]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000\", \"P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM\"],\n\n[\"FindAndDelete tests\"],\n[\"This is a test of FindAndDelete. The first tx is a spend of normal scriptPubKey and the second tx is a spend of bare P2WSH.\"],\n[\"The redeemScript/witnessScript is CHECKSIGVERIFY <0x30450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01>.\"],\n[\"The signature is <0x30450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01> <pubkey>,\"],\n[\"where the pubkey is obtained through key recovery with sig and the wrong sighash.\"],\n[\"This is to show that FindAndDelete is applied only to non-segwit scripts\"],\n[\"To show that the tests are 'correctly wrong', they should pass by modifying OP_CHECKSIG under interpreter.cpp\"],\n[\"by replacing (sigversion == SIGVERSION_BASE) with (sigversion != SIGVERSION_BASE)\"],\n[\"Non-segwit: wrong sighash (without FindAndDelete) = 1ba1fe3bc90c5d1265460e684ce6774e324f0fabdf67619eda729e64e8b6bc08\"],\n[[[\"f18783ace138abac5d3a7a5cf08e88fe6912f267ef936452e0c27d090621c169\", 7000, \"HASH160 0x14 0x0c746489e2d83cdbb5b90b432773342ba809c134 EQUAL\", 200000]],\n\"010000000169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f1581b0000b64830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e012103b12a1ec8428fc74166926318c15e17408fea82dbb157575e16a8c365f546248f4aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01ffffffff0101000000000000000000000000\", \"P2SH,WITNESS\"],\n[\"BIP143: wrong sighash (with FindAndDelete) = 71c9cd9b2869b9c70b01b1f0360c148f42dee72297db312638df136f43311f23\"],\n[[[\"f18783ace138abac5d3a7a5cf08e88fe6912f267ef936452e0c27d090621c169\", 7500, \"0x00 0x20 0x9e1be07558ea5cc8e02ed1d80c0911048afad949affa36d5c3951e3159dbea19\", 200000]],\n\"0100000000010169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f14c1d000000ffffffff01010000000000000000034830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e012102a9d7ed6e161f0e255c10bbfcca0128a9e2035c2c8da58899c54d22d3a31afdef4aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0100000000\", \"P2SH,WITNESS\"],\n[\"This is multisig version of the FindAndDelete tests\"],\n[\"Script is 2 CHECKMULTISIGVERIFY <sig1> <sig2> DROP\"],\n[\"52af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960175\"],\n[\"Signature is 0 <sig1> <sig2> 2 <key1> <key2>\"],\n[\"Should pass by replacing (sigversion == SIGVERSION_BASE) with (sigversion != SIGVERSION_BASE) under OP_CHECKMULTISIG\"],\n[\"Non-segwit: wrong sighash (without FindAndDelete) = 4bc6a53e8e16ef508c19e38bba08831daba85228b0211f323d4cb0999cf2a5e8\"],\n[[[\"9628667ad48219a169b41b020800162287d2c0f713c04157e95c484a8dcb7592\", 7000, \"HASH160 0x14 0x5748407f5ca5cdca53ba30b79040260770c9ee1b EQUAL\", 200000]],\n\"01000000019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a662896581b0000fd6f01004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c039596015221023fd5dd42b44769c5653cbc5947ff30ab8871f240ad0c0e7432aefe84b5b4ff3421039d52178dbde360b83f19cf348deb04fa8360e1bf5634577be8e50fafc2b0e4ef4c9552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960175ffffffff0101000000000000000000000000\", \"P2SH,WITNESS\"],\n[\"BIP143: wrong sighash (with FindAndDelete) = 17c50ec2181ecdfdc85ca081174b248199ba81fff730794d4f69b8ec031f2dce\"],\n[[[\"9628667ad48219a169b41b020800162287d2c0f713c04157e95c484a8dcb7592\", 7500, \"0x00 0x20 0x9b66c15b4e0b4eb49fa877982cafded24859fe5b0e2dbfbe4f0df1de7743fd52\", 200000]],\n\"010000000001019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a6628964c1d000000ffffffff0101000000000000000007004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c03959601010221023cb6055f4b57a1580c5a753e19610cafaedf7e0ff377731c77837fd666eae1712102c1b1db303ac232ffa8e5e7cc2cf5f96c6e40d3e6914061204c0541cb2043a0969552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c039596017500000000\", \"P2SH,WITNESS\"],\n[[[\"bc7fd132fcf817918334822ee6d9bd95c889099c96e07ca2c1eb2cc70db63224\", 0, \"CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIG\"]],\n\"01000000012432b60dc72cebc1a27ce0969c0989c895bdd9e62e8234839117f8fc32d17fbc000000004a493046022100a576b52051962c25e642c0fd3d77ee6c92487048e5d90818bcf5b51abaccd7900221008204f8fb121be4ec3b24483b1f92d89b1b0548513a134e345c5442e86e8617a501ffffffff010000000000000000016a00000000\", \"P2SH,CONST_SCRIPTCODE\"],\n[[[\"83e194f90b6ef21fa2e3a365b63794fb5daa844bdc9b25de30899fcfe7b01047\", 0, \"CODESEPARATOR CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIG\"]],\n\"01000000014710b0e7cf9f8930de259bdc4b84aa5dfb9437b665a3e3a21ff26e0bf994e183000000004a493046022100a166121a61b4eeb19d8f922b978ff6ab58ead8a5a5552bf9be73dc9c156873ea02210092ad9bc43ee647da4f6652c320800debcf08ec20a094a0aaf085f63ecb37a17201ffffffff010000000000000000016a00000000\", \"P2SH,CONST_SCRIPTCODE\"],\n[[[\"326882a7f22b5191f1a0cc9962ca4b878cd969cf3b3a70887aece4d801a0ba5e\", 0, \"0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CODESEPARATOR CHECKSIG\"]],\n\"01000000015ebaa001d8e4ec7a88703a3bcf69d98c874bca6299cca0f191512bf2a7826832000000004948304502203bf754d1c6732fbf87c5dcd81258aefd30f2060d7bd8ac4a5696f7927091dad1022100f5bcb726c4cf5ed0ed34cc13dadeedf628ae1045b7cb34421bc60b89f4cecae701ffffffff010000000000000000016a00000000\", \"P2SH,CONST_SCRIPTCODE\"],\n[[[\"a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944\", 0, \"0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIGVERIFY CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIGVERIFY CODESEPARATOR 1\"]],\n\"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a900000000924830450221009c0a27f886a1d8cb87f6f595fbc3163d28f7a81ec3c4b252ee7f3ac77fd13ffa02203caa8dfa09713c8c4d7ef575c75ed97812072405d932bd11e6a1593a98b679370148304502201e3861ef39a526406bad1e20ecad06be7375ad40ddb582c9be42d26c3a0d7b240221009d0a3985e96522e59635d19cc4448547477396ce0ef17a58e7d74c3ef464292301ffffffff010000000000000000016a00000000\", \"P2SH,CONST_SCRIPTCODE\"],\n[[[\"a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944\", 0, \"IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1\"]],\n\"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a48304502207a6974a77c591fa13dff60cabbb85a0de9e025c09c65a4b2285e47ce8e22f761022100f0efaac9ff8ac36b10721e0aae1fb975c90500b50c56e8a0cc52b0403f0425dd0100ffffffff010000000000000000016a00000000\", \"P2SH,CONST_SCRIPTCODE\"],\n[[[\"a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944\", 0, \"IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1\"]],\n\"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a483045022100fa4a74ba9fd59c59f46c3960cf90cbe0d2b743c471d24a3d5d6db6002af5eebb02204d70ec490fd0f7055a7c45f86514336e3a7f03503dacecabb247fc23f15c83510151ffffffff010000000000000000016a00000000\", \"P2SH,CONST_SCRIPTCODE\"],\n[[[\"ccf7f4053a02e653c36ac75c891b7496d0dc5ce5214f6c913d9cf8f1329ebee0\", 0, \"DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG\"]],\n\"0100000001e0be9e32f1f89c3d916c4f21e55cdcd096741b895cc76ac353e6023a05f4f7cc00000000d86149304602210086e5f736a2c3622ebb62bd9d93d8e5d76508b98be922b97160edc3dcca6d8c47022100b23c312ac232a4473f19d2aeb95ab7bdf2b65518911a0d72d50e38b5dd31dc820121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac4730440220508fa761865c8abd81244a168392876ee1d94e8ed83897066b5e2df2400dad24022043f5ee7538e87e9c6aef7ef55133d3e51da7cc522830a9c4d736977a76ef755c0121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000\", \"P2SH,CONST_SCRIPTCODE\"],\n[[[\"10c9f0effe83e97f80f067de2b11c6a00c3088a4bce42c5ae761519af9306f3c\", 1, \"DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG\"]],\n\"01000000013c6f30f99a5161e75a2ce4bca488300ca0c6112bde67f0807fe983feeff0c91001000000e608646561646265656675ab61493046022100ce18d384221a731c993939015e3d1bcebafb16e8c0b5b5d14097ec8177ae6f28022100bcab227af90bab33c3fe0a9abfee03ba976ee25dc6ce542526e9b2e56e14b7f10121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac493046022100c3b93edcc0fd6250eb32f2dd8a0bba1754b0f6c3be8ed4100ed582f3db73eba2022100bf75b5bd2eff4d6bf2bda2e34a40fcc07d4aa3cf862ceaa77b47b81eff829f9a01ab21038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000\", \"P2SH,CONST_SCRIPTCODE\"],\n[[[\"6056ebd549003b10cbbd915cea0d82209fe40b8617104be917a26fa92cbe3d6f\", 0, \"DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG\"]],\n\"01000000016f3dbe2ca96fa217e94b1017860be49f20820dea5c91bdcb103b0049d5eb566000000000fd1d0147304402203989ac8f9ad36b5d0919d97fa0a7f70c5272abee3b14477dc646288a8b976df5022027d19da84a066af9053ad3d1d7459d171b7e3a80bc6c4ef7a330677a6be548140147304402203989ac8f9ad36b5d0919d97fa0a7f70c5272abee3b14477dc646288a8b976df5022027d19da84a066af9053ad3d1d7459d171b7e3a80bc6c4ef7a330677a6be548140121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac47304402203757e937ba807e4a5da8534c17f9d121176056406a6465054bdd260457515c1a02200f02eccf1bec0f3a0d65df37889143c2e88ab7acec61a7b6f5aa264139141a2b0121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000\", \"P2SH,CONST_SCRIPTCODE\"],\n[[[\"5a6b0021a6042a686b6b94abc36b387bef9109847774e8b1e51eb8cc55c53921\", 1, \"DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG\"]],\n\"01000000012139c555ccb81ee5b1e87477840991ef7b386bc3ab946b6b682a04a621006b5a01000000fdb40148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f2204148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390175ac4830450220646b72c35beeec51f4d5bc1cbae01863825750d7f490864af354e6ea4f625e9c022100f04b98432df3a9641719dbced53393022e7249fb59db993af1118539830aab870148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a580039017521038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000\", \"P2SH,CONST_SCRIPTCODE\"],\n[[[\"b5b598de91787439afd5938116654e0b16b7a0d0f82742ba37564219c5afcbf9\", 0, \"DUP HASH160 0x14 0xf6f365c40f0739b61de827a44751e5e99032ed8f EQUALVERIFY CHECKSIG\"],\n[\"ab9805c6d57d7070d9a42c5176e47bb705023e6b67249fb6760880548298e742\", 0, \"HASH160 0x14 0xd8dacdadb7462ae15cd906f1878706d0da8660e6 EQUAL\"]],\n\"0100000002f9cbafc519425637ba4227f8d0a0b7160b4e65168193d5af39747891de98b5b5000000006b4830450221008dd619c563e527c47d9bd53534a770b102e40faa87f61433580e04e271ef2f960220029886434e18122b53d5decd25f1f4acb2480659fea20aabd856987ba3c3907e0121022b78b756e2258af13779c1a1f37ea6800259716ca4b7f0b87610e0bf3ab52a01ffffffff42e7988254800876b69f24676b3e0205b77be476512ca4d970707dd5c60598ab00000000fd260100483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a53034930460221008431bdfa72bc67f9d41fe72e94c88fb8f359ffa30b33c72c121c5a877d922e1002210089ef5fc22dd8bfc6bf9ffdb01a9862d27687d424d1fefbab9e9c7176844a187a014c9052483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c7153aeffffffff01a08601000000000017a914d8dacdadb7462ae15cd906f1878706d0da8660e68700000000\", \"P2SH,CONST_SCRIPTCODE\"],\n[[[\"ceafe58e0f6e7d67c0409fbbf673c84c166e3c5d3c24af58f7175b18df3bb3db\", 0, \"DUP HASH160 0x14 0xf6f365c40f0739b61de827a44751e5e99032ed8f EQUALVERIFY CHECKSIG\"],\n[\"ceafe58e0f6e7d67c0409fbbf673c84c166e3c5d3c24af58f7175b18df3bb3db\", 1, \"2 0x48 0x3045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 3 CHECKMULTISIG\"]],\n\"0100000002dbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce000000006b4830450221009627444320dc5ef8d7f68f35010b4c050a6ed0d96b67a84db99fda9c9de58b1e02203e4b4aaa019e012e65d69b487fdf8719df72f488fa91506a80c49a33929f1fd50121022b78b756e2258af13779c1a1f37ea6800259716ca4b7f0b87610e0bf3ab52a01ffffffffdbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce010000009300483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303ffffffff01a0860100000000001976a9149bc0bbdd3024da4d0c38ed1aecf5c68dd1d3fa1288ac00000000\", \"P2SH,CONST_SCRIPTCODE\"],\n\n[\"Make diffs cleaner by leaving a comment here without comma at the end\"]\n]\n"
  },
  {
    "path": "txscript/data/tx_valid.json",
    "content": "[\n[\"The following are deserialized transactions which are valid.\"],\n[\"They are in the form\"],\n[\"[[[prevout hash, prevout index, prevout scriptPubKey, amount?], [input 2], ...],\"],\n[\"serializedTransaction, verifyFlags]\"],\n[\"Objects that are only a single string (like this one) are ignored\"],\n\n[\"The following is 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63\"],\n[\"It is of particular interest because it contains an invalidly-encoded signature which OpenSSL accepts\"],\n[\"See http://r6.ca/blog/20111119T211504Z.html\"],\n[\"It is also the first OP_CHECKMULTISIG transaction in standard form\"],\n[[[\"60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1\", 0, \"1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG\"]],\n\"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000490047304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000\", \"P2SH\"],\n\n[\"The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63\"],\n[\"It is an OP_CHECKMULTISIG with an arbitrary extra byte stuffed into the signature at pos length - 2\"],\n[\"The dummy byte is fine however, so the NULLDUMMY flag should be happy\"],\n[[[\"60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1\", 0, \"1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG\"]],\n\"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a0048304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2bab01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000\", \"P2SH,NULLDUMMY\"],\n\n[\"The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63\"],\n[\"It is an OP_CHECKMULTISIG with the dummy value set to something other than an empty string\"],\n[[[\"60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1\", 0, \"1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG\"]],\n\"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a01ff47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000\", \"P2SH\"],\n\n[\"As above, but using a OP_1\"],\n[[[\"60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1\", 0, \"1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG\"]],\n\"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000495147304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000\", \"P2SH\"],\n\n[\"As above, but using a OP_1NEGATE\"],\n[[[\"60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1\", 0, \"1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG\"]],\n\"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000494f47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000\", \"P2SH\"],\n\n[\"The following is c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73\"],\n[\"It is of interest because it contains a 0-sequence as well as a signature of SIGHASH type 0 (which is not a real type)\"],\n[[[\"406b2b06bcd34d3c8733e6b79f7a394c8a431fbf4ff5ac705c93f4076bb77602\", 0, \"DUP HASH160 0x14 0xdc44b1164188067c3a32d4780f5996fa14a4f2d9 EQUALVERIFY CHECKSIG\"]],\n\"01000000010276b76b07f4935c70acf54fbf1f438a4c397a9fb7e633873c4dd3bc062b6b40000000008c493046022100d23459d03ed7e9511a47d13292d3430a04627de6235b6e51a40f9cd386f2abe3022100e7d25b080f0bb8d8d5f878bba7d54ad2fda650ea8d158a33ee3cbd11768191fd004104b0e2c879e4daf7b9ab68350228c159766676a14f5815084ba166432aab46198d4cca98fa3e9981d0a90b2effc514b76279476550ba3663fdcaff94c38420e9d5000000000100093d00000000001976a9149a7b0f3b80c6baaeedce0a0842553800f832ba1f88ac00000000\", \"P2SH\"],\n\n[\"A nearly-standard transaction with CHECKSIGVERIFY 1 instead of CHECKSIG\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000006a473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000\", \"P2SH\"],\n\n[\"Same as above, but with the signature duplicated in the scriptPubKey with the proper pushdata prefix\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1 0x47 0x3044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a01\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000006a473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000\", \"P2SH\"],\n\n[\"The following is f7fdd091fa6d8f5e7a8c2458f5c38faffff2d3f1406b6e4fe2c99dcc0d2d1cbb\"],\n[\"It caught a bug in the workaround for 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63 in an overly simple implementation\"],\n[[[\"b464e85df2a238416f8bdae11d120add610380ea07f4ef19c5f9dfd472f96c3d\", 0, \"DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG\"],\n[\"b7978cc96e59a8b13e0865d3f95657561a7f725be952438637475920bac9eb21\", 1, \"DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG\"]],\n\"01000000023d6cf972d4dff9c519eff407ea800361dd0a121de1da8b6f4138a2f25de864b4000000008a4730440220ffda47bfc776bcd269da4832626ac332adfca6dd835e8ecd83cd1ebe7d709b0e022049cffa1cdc102a0b56e0e04913606c70af702a1149dc3b305ab9439288fee090014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff21ebc9ba20594737864352e95b727f1a565756f9d365083eb1a8596ec98c97b7010000008a4730440220503ff10e9f1e0de731407a4a245531c9ff17676eda461f8ceeb8c06049fa2c810220c008ac34694510298fa60b3f000df01caa244f165b727d4896eb84f81e46bcc4014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff01f0da5200000000001976a914857ccd42dded6df32949d4646dfa10a92458cfaa88ac00000000\", \"P2SH\"],\n\n[\"The following tests for the presence of a bug in the handling of SIGHASH_SINGLE\"],\n[\"It results in signing the constant 1, instead of something generated based on the transaction,\"],\n[\"when the input doing the signing has an index greater than the maximum output index\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000200\", 0, \"1\"], [\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"DUP HASH160 0x14 0xe52b482f2faa8ecbf0db344f93c84ac908557f33 EQUALVERIFY CHECKSIG\"]],\n\"01000000020002000000000000000000000000000000000000000000000000000000000000000000000151ffffffff0001000000000000000000000000000000000000000000000000000000000000000000006b483045022100c9cdd08798a28af9d1baf44a6c77bcc7e279f47dc487c8c899911bc48feaffcc0220503c5c50ae3998a733263c5c0f7061b483e2b56c4c41b456e7d2f5a78a74c077032102d5c25adb51b61339d2b05315791e21bbe80ea470a49db0135720983c905aace0ffffffff010000000000000000015100000000\", \"P2SH\"],\n\n[\"An invalid P2SH Transaction\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0x7a052c840ba73af26755de42cf01cc9e0a49fef0 EQUAL\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000009085768617420697320ffffffff010000000000000000015100000000\", \"NONE\"],\n\n[\"A valid P2SH Transaction using the standard transaction type put forth in BIP 16\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0x8febbed40483661de6958d957412f82deed8e2f7 EQUAL\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000006e493046022100c66c9cdf4c43609586d15424c54707156e316d88b0a1534c9e6b0d4f311406310221009c0fe51dbc9c4ab7cc25d3fdbeccf6679fe6827f08edf2b4a9f16ee3eb0e438a0123210338e8034509af564c62644c07691942e0c056752008a173c89f60ab2a88ac2ebfacffffffff010000000000000000015100000000\", \"P2SH\"],\n\n[\"Tests for CheckTransaction()\"],\n[\"MAX_MONEY output\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0x32afac281462b822adbec5094b8d4d337dd5bd6a EQUAL\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000006e493046022100e1eadba00d9296c743cb6ecc703fd9ddc9b3cd12906176a226ae4c18d6b00796022100a71aef7d2874deff681ba6080f1b278bac7bb99c61b08a85f4311970ffe7f63f012321030c0588dc44d92bdcbf8e72093466766fdc265ead8db64517b0c542275b70fffbacffffffff010040075af0750700015100000000\", \"P2SH\"],\n\n[\"MAX_MONEY output + 0 output\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0xb558cbf4930954aa6a344363a15668d7477ae716 EQUAL\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000006d483045022027deccc14aa6668e78a8c9da3484fbcd4f9dcc9bb7d1b85146314b21b9ae4d86022100d0b43dece8cfb07348de0ca8bc5b86276fa88f7f2138381128b7c36ab2e42264012321029bb13463ddd5d2cc05da6e84e37536cb9525703cfd8f43afdb414988987a92f6acffffffff020040075af075070001510000000000000000015100000000\", \"P2SH\"],\n\n[\"Coinbase of size 2\"],\n[\"Note the input is just required to make the tester happy\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000000\", -1, \"1\"]],\n\"01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025151ffffffff010000000000000000015100000000\", \"P2SH\"],\n\n[\"Coinbase of size 100\"],\n[\"Note the input is just required to make the tester happy\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000000\", -1, \"1\"]],\n\"01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff6451515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151ffffffff010000000000000000015100000000\", \"P2SH\"],\n\n[\"Simple transaction with first input is signed with SIGHASH_ALL, second with SIGHASH_ANYONECANPAY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x21 0x035e7f0d4d0841bcd56c39337ed086b1a633ee770c1ffdd94ac552a95ac2ce0efc CHECKSIG\"],\n  [\"0000000000000000000000000000000000000000000000000000000000000200\", 0, \"0x21 0x035e7f0d4d0841bcd56c39337ed086b1a633ee770c1ffdd94ac552a95ac2ce0efc CHECKSIG\"]],\n \"010000000200010000000000000000000000000000000000000000000000000000000000000000000049483045022100d180fd2eb9140aeb4210c9204d3f358766eb53842b2a9473db687fa24b12a3cc022079781799cd4f038b85135bbe49ec2b57f306b2bb17101b17f71f000fcab2b6fb01ffffffff0002000000000000000000000000000000000000000000000000000000000000000000004847304402205f7530653eea9b38699e476320ab135b74771e1c48b81a5d041e2ca84b9be7a802200ac8d1f40fb026674fe5a5edd3dea715c27baa9baca51ed45ea750ac9dc0a55e81ffffffff010100000000000000015100000000\", \"P2SH\"],\n\n[\"Same as above, but we change the sequence number of the first input to check that SIGHASH_ANYONECANPAY is being followed\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x21 0x035e7f0d4d0841bcd56c39337ed086b1a633ee770c1ffdd94ac552a95ac2ce0efc CHECKSIG\"],\n  [\"0000000000000000000000000000000000000000000000000000000000000200\", 0, \"0x21 0x035e7f0d4d0841bcd56c39337ed086b1a633ee770c1ffdd94ac552a95ac2ce0efc CHECKSIG\"]],\n \"01000000020001000000000000000000000000000000000000000000000000000000000000000000004948304502203a0f5f0e1f2bdbcd04db3061d18f3af70e07f4f467cbc1b8116f267025f5360b022100c792b6e215afc5afc721a351ec413e714305cb749aae3d7fee76621313418df101010000000002000000000000000000000000000000000000000000000000000000000000000000004847304402205f7530653eea9b38699e476320ab135b74771e1c48b81a5d041e2ca84b9be7a802200ac8d1f40fb026674fe5a5edd3dea715c27baa9baca51ed45ea750ac9dc0a55e81ffffffff010100000000000000015100000000\", \"P2SH\"],\n\n[\"afd9c17f8913577ec3509520bd6e5d63e9c0fd2a5f70c787993b097ba6ca9fae which has several SIGHASH_SINGLE signatures\"],\n[[[\"63cfa5a09dc540bf63e53713b82d9ea3692ca97cd608c384f2aa88e51a0aac70\", 0, \"DUP HASH160 0x14 0xdcf72c4fd02f5a987cf9b02f2fabfcac3341a87d EQUALVERIFY CHECKSIG\"],\n [\"04e8d0fcf3846c6734477b98f0f3d4badfb78f020ee097a0be5fe347645b817d\", 1, \"DUP HASH160 0x14 0xdcf72c4fd02f5a987cf9b02f2fabfcac3341a87d EQUALVERIFY CHECKSIG\"],\n [\"ee1377aff5d0579909e11782e1d2f5f7b84d26537be7f5516dd4e43373091f3f\", 1, \"DUP HASH160 0x14 0xdcf72c4fd02f5a987cf9b02f2fabfcac3341a87d EQUALVERIFY CHECKSIG\"]],\n \"010000000370ac0a1ae588aaf284c308d67ca92c69a39e2db81337e563bf40c59da0a5cf63000000006a4730440220360d20baff382059040ba9be98947fd678fb08aab2bb0c172efa996fd8ece9b702201b4fb0de67f015c90e7ac8a193aeab486a1f587e0f54d0fb9552ef7f5ce6caec032103579ca2e6d107522f012cd00b52b9a65fb46f0c57b9b8b6e377c48f526a44741affffffff7d815b6447e35fbea097e00e028fb7dfbad4f3f0987b4734676c84f3fcd0e804010000006b483045022100c714310be1e3a9ff1c5f7cacc65c2d8e781fc3a88ceb063c6153bf950650802102200b2d0979c76e12bb480da635f192cc8dc6f905380dd4ac1ff35a4f68f462fffd032103579ca2e6d107522f012cd00b52b9a65fb46f0c57b9b8b6e377c48f526a44741affffffff3f1f097333e4d46d51f5e77b53264db8f7f5d2e18217e1099957d0f5af7713ee010000006c493046022100b663499ef73273a3788dea342717c2640ac43c5a1cf862c9e09b206fcb3f6bb8022100b09972e75972d9148f2bdd462e5cb69b57c1214b88fc55ca638676c07cfc10d8032103579ca2e6d107522f012cd00b52b9a65fb46f0c57b9b8b6e377c48f526a44741affffffff0380841e00000000001976a914bfb282c70c4191f45b5a6665cad1682f2c9cfdfb88ac80841e00000000001976a9149857cc07bed33a5cf12b9c5e0500b675d500c81188ace0fd1c00000000001976a91443c52850606c872403c0601e69fa34b26f62db4a88ac00000000\", \"P2SH\"],\n\n [\"ddc454a1c0c35c188c98976b17670f69e586d9c0f3593ea879928332f0a069e7, which spends an input that pushes using a PUSHDATA1 that is negative when read as signed\"],\n [[[\"c5510a5dd97a25f43175af1fe649b707b1df8e1a41489bac33a23087027a2f48\", 0, \"0x4c 0xae 0x606563686f2022553246736447566b58312b5a536e587574356542793066794778625456415675534a6c376a6a334878416945325364667657734f53474f36633338584d7439435c6e543249584967306a486956304f376e775236644546673d3d22203e20743b206f70656e73736c20656e63202d7061737320706173733a5b314a564d7751432d707269766b65792d6865785d202d64202d6165732d3235362d636263202d61202d696e207460 DROP DUP HASH160 0x14 0xbfd7436b6265aa9de506f8a994f881ff08cc2872 EQUALVERIFY CHECKSIG\"]],\n \"0100000001482f7a028730a233ac9b48411a8edfb107b749e61faf7531f4257ad95d0a51c5000000008b483045022100bf0bbae9bde51ad2b222e87fbf67530fbafc25c903519a1e5dcc52a32ff5844e022028c4d9ad49b006dd59974372a54291d5764be541574bb0c4dc208ec51f80b7190141049dd4aad62741dc27d5f267f7b70682eee22e7e9c1923b9c0957bdae0b96374569b460eb8d5b40d972e8c7c0ad441de3d94c4a29864b212d56050acb980b72b2bffffffff0180969800000000001976a914e336d0017a9d28de99d16472f6ca6d5a3a8ebc9988ac00000000\", \"P2SH\"],\n\n[\"Correct signature order\"],\n[\"Note the input is just required to make the tester happy\"],\n[[[\"b3da01dd4aae683c7aee4d5d8b52a540a508e1115f77cd7fa9a291243f501223\", 0, \"HASH160 0x14 0xb1ce99298d5f07364b57b1e5c9cc00be0b04a954 EQUAL\"]],\n\"01000000012312503f2491a2a97fcd775f11e108a540a5528b5d4dee7a3c68ae4add01dab300000000fdfe0000483045022100f6649b0eddfdfd4ad55426663385090d51ee86c3481bdc6b0c18ea6c0ece2c0b0220561c315b07cffa6f7dd9df96dbae9200c2dee09bf93cc35ca05e6cdf613340aa0148304502207aacee820e08b0b174e248abd8d7a34ed63b5da3abedb99934df9fddd65c05c4022100dfe87896ab5ee3df476c2655f9fbe5bd089dccbef3e4ea05b5d121169fe7f5f4014c695221031d11db38972b712a9fe1fc023577c7ae3ddb4a3004187d41c45121eecfdbb5b7210207ec36911b6ad2382860d32989c7b8728e9489d7bbc94a6b5509ef0029be128821024ea9fac06f666a4adc3fc1357b7bec1fd0bdece2b9d08579226a8ebde53058e453aeffffffff0180380100000000001976a914c9b99cddf847d10685a4fabaa0baf505f7c3dfab88ac00000000\", \"P2SH\"],\n\n[\"cc60b1f899ec0a69b7c3f25ddf32c4524096a9c5b01cbd84c6d0312a0c478984, which is a fairly strange transaction which relies on OP_CHECKSIG returning 0 when checking a completely invalid sig of length 0\"],\n[[[\"cbebc4da731e8995fe97f6fadcd731b36ad40e5ecb31e38e904f6e5982fa09f7\", 0, \"0x2102085c6600657566acc2d6382a47bc3f324008d2aa10940dd7705a48aa2a5a5e33ac7c2103f5d0fb955f95dd6be6115ce85661db412ec6a08abcbfce7da0ba8297c6cc0ec4ac7c5379a820d68df9e32a147cffa36193c6f7c43a1c8c69cda530e1c6db354bfabdcfefaf3c875379a820f531f3041d3136701ea09067c53e7159c8f9b2746a56c3d82966c54bbc553226879a5479827701200122a59a5379827701200122a59a6353798277537982778779679a68\"]],\n\"0100000001f709fa82596e4f908ee331cb5e0ed46ab331d7dcfaf697fe95891e73dac4ebcb000000008c20ca42095840735e89283fec298e62ac2ddea9b5f34a8cbb7097ad965b87568100201b1b01dc829177da4a14551d2fc96a9db00c6501edfa12f22cd9cefd335c227f483045022100a9df60536df5733dd0de6bc921fab0b3eee6426501b43a228afa2c90072eb5ca02201c78b74266fac7d1db5deff080d8a403743203f109fbcabf6d5a760bf87386d20100ffffffff01c075790000000000232103611f9a45c18f28f06f19076ad571c344c82ce8fcfe34464cf8085217a2d294a6ac00000000\", \"P2SH\"],\n\n[\"Empty pubkey\"],\n[[[\"229257c295e7f555421c1bfec8538dd30a4b5c37c1c8810bbe83cafa7811652c\", 0, \"0x00 CHECKSIG NOT\"]],\n\"01000000012c651178faca83be0b81c8c1375c4b0ad38d53c8fe1b1c4255f5e795c25792220000000049483045022100d6044562284ac76c985018fc4a90127847708c9edb280996c507b28babdc4b2a02203d74eca3f1a4d1eea7ff77b528fde6d5dc324ec2dbfdb964ba885f643b9704cd01ffffffff010100000000000000232102c2410f8891ae918cab4ffc4bb4a3b0881be67c7a1e7faa8b5acf9ab8932ec30cac00000000\", \"P2SH\"],\n\n[\"Empty signature\"],\n[[[\"9ca93cfd8e3806b9d9e2ba1cf64e3cc6946ee0119670b1796a09928d14ea25f7\", 0, \"0x21 0x028a1d66975dbdf97897e3a4aef450ebeb5b5293e4a0b4a6d3a2daaa0b2b110e02 CHECKSIG NOT\"]],\n\"0100000001f725ea148d92096a79b1709611e06e94c63c4ef61cbae2d9b906388efd3ca99c000000000100ffffffff0101000000000000002321028a1d66975dbdf97897e3a4aef450ebeb5b5293e4a0b4a6d3a2daaa0b2b110e02ac00000000\", \"P2SH\"],\n\n[[[\"444e00ed7840d41f20ecd9c11d3f91982326c731a02f3c05748414a4fa9e59be\", 0, \"1 0x00 0x21 0x02136b04758b0b6e363e7a6fbe83aaf527a153db2b060d36cc29f7f8309ba6e458 2 CHECKMULTISIG\"]],\n\"0100000001be599efaa4148474053c2fa031c7262398913f1dc1d9ec201fd44078ed004e44000000004900473044022022b29706cb2ed9ef0cb3c97b72677ca2dfd7b4160f7b4beb3ba806aa856c401502202d1e52582412eba2ed474f1f437a427640306fd3838725fab173ade7fe4eae4a01ffffffff010100000000000000232103ac4bba7e7ca3e873eea49e08132ad30c7f03640b6539e9b59903cf14fd016bbbac00000000\", \"P2SH\"],\n\n[[[\"e16abbe80bf30c080f63830c8dbf669deaef08957446e95940227d8c5e6db612\", 0, \"1 0x21 0x03905380c7013e36e6e19d305311c1b81fce6581f5ee1c86ef0627c68c9362fc9f 0x00 2 CHECKMULTISIG\"]],\n\"010000000112b66d5e8c7d224059e946749508efea9d66bf8d0c83630f080cf30be8bb6ae100000000490047304402206ffe3f14caf38ad5c1544428e99da76ffa5455675ec8d9780fac215ca17953520220779502985e194d84baa36b9bd40a0dbd981163fa191eb884ae83fc5bd1c86b1101ffffffff010100000000000000232103905380c7013e36e6e19d305311c1b81fce6581f5ee1c86ef0627c68c9362fc9fac00000000\", \"P2SH\"],\n\n[[[\"ebbcf4bfce13292bd791d6a65a2a858d59adbf737e387e40370d4e64cc70efb0\", 0, \"2 0x21 0x033bcaa0a602f0d44cc9d5637c6e515b0471db514c020883830b7cefd73af04194 0x21 0x03a88b326f8767f4f192ce252afe33c94d25ab1d24f27f159b3cb3aa691ffe1423 2 CHECKMULTISIG NOT\"]],\n\"0100000001b0ef70cc644e0d37407e387e73bfad598d852a5aa6d691d72b2913cebff4bceb000000004a00473044022068cd4851fc7f9a892ab910df7a24e616f293bcb5c5fbdfbc304a194b26b60fba022078e6da13d8cb881a22939b952c24f88b97afd06b4c47a47d7f804c9a352a6d6d0100ffffffff0101000000000000002321033bcaa0a602f0d44cc9d5637c6e515b0471db514c020883830b7cefd73af04194ac00000000\", \"P2SH\"],\n\n[[[\"ba4cd7ae2ad4d4d13ebfc8ab1d93a63e4a6563f25089a18bf0fc68f282aa88c1\", 0, \"2 0x21 0x037c615d761e71d38903609bf4f46847266edc2fb37532047d747ba47eaae5ffe1 0x21 0x02edc823cd634f2c4033d94f5755207cb6b60c4b1f1f056ad7471c47de5f2e4d50 2 CHECKMULTISIG NOT\"]],\n\"0100000001c188aa82f268fcf08ba18950f263654a3ea6931dabc8bf3ed1d4d42aaed74cba000000004b0000483045022100940378576e069aca261a6b26fb38344e4497ca6751bb10905c76bb689f4222b002204833806b014c26fd801727b792b1260003c55710f87c5adbd7a9cb57446dbc9801ffffffff0101000000000000002321037c615d761e71d38903609bf4f46847266edc2fb37532047d747ba47eaae5ffe1ac00000000\", \"P2SH\"],\n\n\n[\"OP_CODESEPARATOR tests\"],\n\n[\"Test that SignatureHash() removes OP_CODESEPARATOR with FindAndDelete()\"],\n[[[\"bc7fd132fcf817918334822ee6d9bd95c889099c96e07ca2c1eb2cc70db63224\", 0, \"CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIG\"]],\n\"01000000012432b60dc72cebc1a27ce0969c0989c895bdd9e62e8234839117f8fc32d17fbc000000004a493046022100a576b52051962c25e642c0fd3d77ee6c92487048e5d90818bcf5b51abaccd7900221008204f8fb121be4ec3b24483b1f92d89b1b0548513a134e345c5442e86e8617a501ffffffff010000000000000000016a00000000\", \"P2SH\"],\n[[[\"83e194f90b6ef21fa2e3a365b63794fb5daa844bdc9b25de30899fcfe7b01047\", 0, \"CODESEPARATOR CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIG\"]],\n\"01000000014710b0e7cf9f8930de259bdc4b84aa5dfb9437b665a3e3a21ff26e0bf994e183000000004a493046022100a166121a61b4eeb19d8f922b978ff6ab58ead8a5a5552bf9be73dc9c156873ea02210092ad9bc43ee647da4f6652c320800debcf08ec20a094a0aaf085f63ecb37a17201ffffffff010000000000000000016a00000000\", \"P2SH\"],\n\n[\"Hashed data starts at the CODESEPARATOR\"],\n[[[\"326882a7f22b5191f1a0cc9962ca4b878cd969cf3b3a70887aece4d801a0ba5e\", 0, \"0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CODESEPARATOR CHECKSIG\"]],\n\"01000000015ebaa001d8e4ec7a88703a3bcf69d98c874bca6299cca0f191512bf2a7826832000000004948304502203bf754d1c6732fbf87c5dcd81258aefd30f2060d7bd8ac4a5696f7927091dad1022100f5bcb726c4cf5ed0ed34cc13dadeedf628ae1045b7cb34421bc60b89f4cecae701ffffffff010000000000000000016a00000000\", \"P2SH\"],\n\n[\"But only if execution has reached it\"],\n[[[\"a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944\", 0, \"0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIGVERIFY CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIGVERIFY CODESEPARATOR 1\"]],\n\"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a900000000924830450221009c0a27f886a1d8cb87f6f595fbc3163d28f7a81ec3c4b252ee7f3ac77fd13ffa02203caa8dfa09713c8c4d7ef575c75ed97812072405d932bd11e6a1593a98b679370148304502201e3861ef39a526406bad1e20ecad06be7375ad40ddb582c9be42d26c3a0d7b240221009d0a3985e96522e59635d19cc4448547477396ce0ef17a58e7d74c3ef464292301ffffffff010000000000000000016a00000000\", \"P2SH\"],\n\n[\"CODESEPARATOR in an unexecuted IF block does not change what is hashed\"],\n[[[\"a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944\", 0, \"IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1\"]],\n\"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a48304502207a6974a77c591fa13dff60cabbb85a0de9e025c09c65a4b2285e47ce8e22f761022100f0efaac9ff8ac36b10721e0aae1fb975c90500b50c56e8a0cc52b0403f0425dd0100ffffffff010000000000000000016a00000000\", \"P2SH\"],\n\n[\"As above, with the IF block executed\"],\n[[[\"a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944\", 0, \"IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1\"]],\n\"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a483045022100fa4a74ba9fd59c59f46c3960cf90cbe0d2b743c471d24a3d5d6db6002af5eebb02204d70ec490fd0f7055a7c45f86514336e3a7f03503dacecabb247fc23f15c83510151ffffffff010000000000000000016a00000000\", \"P2SH\"],\n\n\n[\"CHECKSIG is legal in scriptSigs\"],\n[[[\"ccf7f4053a02e653c36ac75c891b7496d0dc5ce5214f6c913d9cf8f1329ebee0\", 0, \"DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG\"]],\n\"0100000001e0be9e32f1f89c3d916c4f21e55cdcd096741b895cc76ac353e6023a05f4f7cc00000000d86149304602210086e5f736a2c3622ebb62bd9d93d8e5d76508b98be922b97160edc3dcca6d8c47022100b23c312ac232a4473f19d2aeb95ab7bdf2b65518911a0d72d50e38b5dd31dc820121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac4730440220508fa761865c8abd81244a168392876ee1d94e8ed83897066b5e2df2400dad24022043f5ee7538e87e9c6aef7ef55133d3e51da7cc522830a9c4d736977a76ef755c0121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000\", \"P2SH\"],\n\n[\"Same semantics for OP_CODESEPARATOR\"],\n[[[\"10c9f0effe83e97f80f067de2b11c6a00c3088a4bce42c5ae761519af9306f3c\", 1, \"DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG\"]],\n\"01000000013c6f30f99a5161e75a2ce4bca488300ca0c6112bde67f0807fe983feeff0c91001000000e608646561646265656675ab61493046022100ce18d384221a731c993939015e3d1bcebafb16e8c0b5b5d14097ec8177ae6f28022100bcab227af90bab33c3fe0a9abfee03ba976ee25dc6ce542526e9b2e56e14b7f10121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac493046022100c3b93edcc0fd6250eb32f2dd8a0bba1754b0f6c3be8ed4100ed582f3db73eba2022100bf75b5bd2eff4d6bf2bda2e34a40fcc07d4aa3cf862ceaa77b47b81eff829f9a01ab21038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000\", \"P2SH\"],\n\n[\"Signatures are removed from the script they are in by FindAndDelete() in the CHECKSIG code; even multiple instances of one signature can be removed.\"],\n[[[\"6056ebd549003b10cbbd915cea0d82209fe40b8617104be917a26fa92cbe3d6f\", 0, \"DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG\"]],\n\"01000000016f3dbe2ca96fa217e94b1017860be49f20820dea5c91bdcb103b0049d5eb566000000000fd1d0147304402203989ac8f9ad36b5d0919d97fa0a7f70c5272abee3b14477dc646288a8b976df5022027d19da84a066af9053ad3d1d7459d171b7e3a80bc6c4ef7a330677a6be548140147304402203989ac8f9ad36b5d0919d97fa0a7f70c5272abee3b14477dc646288a8b976df5022027d19da84a066af9053ad3d1d7459d171b7e3a80bc6c4ef7a330677a6be548140121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac47304402203757e937ba807e4a5da8534c17f9d121176056406a6465054bdd260457515c1a02200f02eccf1bec0f3a0d65df37889143c2e88ab7acec61a7b6f5aa264139141a2b0121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000\", \"P2SH\"],\n\n[\"That also includes ahead of the opcode being executed.\"],\n[[[\"5a6b0021a6042a686b6b94abc36b387bef9109847774e8b1e51eb8cc55c53921\", 1, \"DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG\"]],\n\"01000000012139c555ccb81ee5b1e87477840991ef7b386bc3ab946b6b682a04a621006b5a01000000fdb40148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f2204148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390175ac4830450220646b72c35beeec51f4d5bc1cbae01863825750d7f490864af354e6ea4f625e9c022100f04b98432df3a9641719dbced53393022e7249fb59db993af1118539830aab870148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a580039017521038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000\", \"P2SH\"],\n\n[\"Finally CHECKMULTISIG removes all signatures prior to hashing the script containing those signatures. In conjunction with the SIGHASH_SINGLE bug this lets us test whether or not FindAndDelete() is actually present in scriptPubKey/redeemScript evaluation by including a signature of the digest 0x01 We can compute in advance for our pubkey, embed it it in the scriptPubKey, and then also using a normal SIGHASH_ALL signature. If FindAndDelete() wasn't run, the 'bugged' signature would still be in the hashed script, and the normal signature would fail.\"],\n\n[\"Here's an example on mainnet within a P2SH redeemScript. Remarkably it's a standard transaction in <0.9\"],\n[[[\"b5b598de91787439afd5938116654e0b16b7a0d0f82742ba37564219c5afcbf9\", 0, \"DUP HASH160 0x14 0xf6f365c40f0739b61de827a44751e5e99032ed8f EQUALVERIFY CHECKSIG\"],\n  [\"ab9805c6d57d7070d9a42c5176e47bb705023e6b67249fb6760880548298e742\", 0, \"HASH160 0x14 0xd8dacdadb7462ae15cd906f1878706d0da8660e6 EQUAL\"]],\n\"0100000002f9cbafc519425637ba4227f8d0a0b7160b4e65168193d5af39747891de98b5b5000000006b4830450221008dd619c563e527c47d9bd53534a770b102e40faa87f61433580e04e271ef2f960220029886434e18122b53d5decd25f1f4acb2480659fea20aabd856987ba3c3907e0121022b78b756e2258af13779c1a1f37ea6800259716ca4b7f0b87610e0bf3ab52a01ffffffff42e7988254800876b69f24676b3e0205b77be476512ca4d970707dd5c60598ab00000000fd260100483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a53034930460221008431bdfa72bc67f9d41fe72e94c88fb8f359ffa30b33c72c121c5a877d922e1002210089ef5fc22dd8bfc6bf9ffdb01a9862d27687d424d1fefbab9e9c7176844a187a014c9052483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c7153aeffffffff01a08601000000000017a914d8dacdadb7462ae15cd906f1878706d0da8660e68700000000\", \"P2SH\"],\n\n[\"Same idea, but with bare CHECKMULTISIG\"],\n[[[\"ceafe58e0f6e7d67c0409fbbf673c84c166e3c5d3c24af58f7175b18df3bb3db\", 0, \"DUP HASH160 0x14 0xf6f365c40f0739b61de827a44751e5e99032ed8f EQUALVERIFY CHECKSIG\"],\n  [\"ceafe58e0f6e7d67c0409fbbf673c84c166e3c5d3c24af58f7175b18df3bb3db\", 1, \"2 0x48 0x3045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 3 CHECKMULTISIG\"]],\n\"0100000002dbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce000000006b4830450221009627444320dc5ef8d7f68f35010b4c050a6ed0d96b67a84db99fda9c9de58b1e02203e4b4aaa019e012e65d69b487fdf8719df72f488fa91506a80c49a33929f1fd50121022b78b756e2258af13779c1a1f37ea6800259716ca4b7f0b87610e0bf3ab52a01ffffffffdbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce010000009300483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303ffffffff01a0860100000000001976a9149bc0bbdd3024da4d0c38ed1aecf5c68dd1d3fa1288ac00000000\", \"P2SH\"],\n\n\n[\"CHECKLOCKTIMEVERIFY tests\"],\n\n[\"By-height locks, with argument == 0 and == tx nLockTime\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0 CHECKLOCKTIMEVERIFY 1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"499999999 CHECKLOCKTIMEVERIFY 1\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ff64cd1d\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0 CHECKLOCKTIMEVERIFY 1\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ff64cd1d\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"By-time locks, with argument just beyond tx nLockTime (but within numerical boundaries)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"500000000 CHECKLOCKTIMEVERIFY 1\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4294967295 CHECKLOCKTIMEVERIFY 1\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffffff\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"500000000 CHECKLOCKTIMEVERIFY 1\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffffff\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Any non-maxint nSequence is fine\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0 CHECKLOCKTIMEVERIFY 1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"The argument can be calculated rather than created directly by a PUSHDATA\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"499999999 1ADD CHECKLOCKTIMEVERIFY 1\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Perhaps even by an ADD producing a 5-byte result that is out of bounds for other opcodes\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"2147483647 2147483647 ADD CHECKLOCKTIMEVERIFY 1\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000feffffff\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"5 byte non-minimally-encoded arguments are valid\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x05 0x0000000000 CHECKLOCKTIMEVERIFY 1\"]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Valid CHECKLOCKTIMEVERIFY in scriptSig\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"1\"]],\n\"01000000010001000000000000000000000000000000000000000000000000000000000000000000000251b1000000000100000000000000000001000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"Valid CHECKLOCKTIMEVERIFY in redeemScript\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0xc5b93064159b3b2d6ab506a41b1f50463771b988 EQUAL\"]],\n\"0100000001000100000000000000000000000000000000000000000000000000000000000000000000030251b1000000000100000000000000000001000000\", \"P2SH,CHECKLOCKTIMEVERIFY\"],\n\n[\"A transaction with a non-standard DER signature.\"],\n[[[\"b1dbc81696c8a9c0fccd0693ab66d7c368dbc38c0def4e800685560ddd1b2132\", 0, \"DUP HASH160 0x14 0x4b3bd7eba3bc0284fd3007be7f3be275e94f5826 EQUALVERIFY CHECKSIG\"]],\n\"010000000132211bdd0d568506804eef0d8cc3db68c3d766ab9306cdfcc0a9c89616c8dbb1000000006c493045022100c7bb0faea0522e74ff220c20c022d2cb6033f8d167fb89e75a50e237a35fd6d202203064713491b1f8ad5f79e623d0219ad32510bfaa1009ab30cbee77b59317d6e30001210237af13eb2d84e4545af287b919c2282019c9691cc509e78e196a9d8274ed1be0ffffffff0100000000000000001976a914f1b3ed2eda9a2ebe5a9374f692877cdf87c0f95b88ac00000000\", \"P2SH\"],\n\n[\"CHECKSEQUENCEVERIFY tests\"],\n\n[\"By-height locks, with argument == 0 and == txin.nSequence\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"65535 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff00000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"65535 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"By-time locks, with argument == 0 and == txin.nSequence\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4194304 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4259839 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff40000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4259839 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4194304 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Upper sequence with upper sequence is fine\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"2147483648 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000800100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4294967295 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000800100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"2147483648 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4294967295 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"2147483648 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4294967295 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Argument 2^31 with various nSequence\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"2147483648 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"2147483648 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"2147483648 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Argument 2^32-1 with various nSequence\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4294967295 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4294967295 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4294967295 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Argument 3<<31 with various nSequence\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"6442450944 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"6442450944 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"6442450944 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"5 byte non-minimally-encoded operandss are valid\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x05 0x0000000000 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"The argument can be calculated rather than created directly by a PUSHDATA\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4194303 1ADD CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"4194304 1SUB CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff00000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"An ADD producing a 5-byte result that sets CTxIn::SEQUENCE_LOCKTIME_DISABLE_FLAG\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"2147483647 65536 CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"2147483647 4259840 ADD CHECKSEQUENCEVERIFY 1\"]],\n\"020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Valid CHECKSEQUENCEVERIFY in scriptSig\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"1\"]],\n\"02000000010001000000000000000000000000000000000000000000000000000000000000000000000251b2010000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Valid CHECKSEQUENCEVERIFY in redeemScript\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0x7c17aff532f22beb54069942f9bf567a66133eaf EQUAL\"]],\n\"0200000001000100000000000000000000000000000000000000000000000000000000000000000000030251b2010000000100000000000000000000000000\", \"P2SH,CHECKSEQUENCEVERIFY\"],\n\n[\"Valid P2WPKH (Private key of segwit tests is L5AQtV2HDm4xGsseLokK2VAT2EtYKcTm3c7HwqnJBFt9LdaQULsM)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1000]],\n\"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100cfb07164b36ba64c1b1e8c7720a56ad64d96f6ef332d3d37f9cb3c96477dc44502200a464cd7a9cf94cd70f66ce4f4f0625ef650052c7afcfe29d7d7e01830ff91ed012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000\", \"P2SH,WITNESS\"],\n\n[\"Valid P2WSH\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x00 0x20 0xff25429251b5a84f452230a3c75fd886b7fc5a7865ce4a7bb7a9d7c5be6da3db\", 1000]],\n\"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100aa5d8aa40a90f23ce2c3d11bc845ca4a12acd99cbea37de6b9f6d86edebba8cb022022dedc2aa0a255f74d04c0b76ece2d7c691f9dd11a64a8ac49f62a99c3a05f9d01232103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ac00000000\", \"P2SH,WITNESS\"],\n\n[\"Valid P2SH(P2WPKH)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0xfe9c7dacc9fcfbf7e3b7d5ad06aa2b28c5a7b7e3 EQUAL\", 1000]],\n\"01000000000101000100000000000000000000000000000000000000000000000000000000000000000000171600144c9c3dfac4207d5d8cb89df5722cb3d712385e3fffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100cfb07164b36ba64c1b1e8c7720a56ad64d96f6ef332d3d37f9cb3c96477dc44502200a464cd7a9cf94cd70f66ce4f4f0625ef650052c7afcfe29d7d7e01830ff91ed012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000\", \"P2SH,WITNESS\"],\n\n[\"Valid P2SH(P2WSH)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"HASH160 0x14 0x2135ab4f0981830311e35600eebc7376dce3a914 EQUAL\", 1000]],\n\"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000023220020ff25429251b5a84f452230a3c75fd886b7fc5a7865ce4a7bb7a9d7c5be6da3dbffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100aa5d8aa40a90f23ce2c3d11bc845ca4a12acd99cbea37de6b9f6d86edebba8cb022022dedc2aa0a255f74d04c0b76ece2d7c691f9dd11a64a8ac49f62a99c3a05f9d01232103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ac00000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash Single|AnyoneCanPay\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3100],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1100],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 3, \"0x51\", 4100]],\n\"0100000000010400010000000000000000000000000000000000000000000000000000000000000200000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000300000000ffffffff05540b0000000000000151d0070000000000000151840300000000000001513c0f00000000000001512c010000000000000151000248304502210092f4777a0f17bf5aeb8ae768dec5f2c14feabf9d1fe2c89c78dfed0f13fdb86902206da90a86042e252bcd1e80a168c719e4a1ddcc3cebea24b9812c5453c79107e9832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71000000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash Single|AnyoneCanPay (same signature as previous)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b0000000000000151000248304502210092f4777a0f17bf5aeb8ae768dec5f2c14feabf9d1fe2c89c78dfed0f13fdb86902206da90a86042e252bcd1e80a168c719e4a1ddcc3cebea24b9812c5453c79107e9832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash Single\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff0484030000000000000151d0070000000000000151540b0000000000000151c800000000000000015100024730440220699e6b0cfe015b64ca3283e6551440a34f901ba62dd4c72fe1cb815afb2e6761022021cc5e84db498b1479de14efda49093219441adc6c543e5534979605e273d80b032103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash Single (same signature as previous)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b000000000000015100024730440220699e6b0cfe015b64ca3283e6551440a34f901ba62dd4c72fe1cb815afb2e6761022021cc5e84db498b1479de14efda49093219441adc6c543e5534979605e273d80b032103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash None|AnyoneCanPay\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3100],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1100],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 3, \"0x51\", 4100]],\n\"0100000000010400010000000000000000000000000000000000000000000000000000000000000200000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000300000000ffffffff04b60300000000000001519e070000000000000151860b00000000000001009600000000000000015100000248304502210091b32274295c2a3fa02f5bce92fb2789e3fc6ea947fbe1a76e52ea3f4ef2381a022079ad72aefa3837a2e0c033a8652a59731da05fa4a813f4fc48e87c075037256b822103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash None|AnyoneCanPay (same signature as previous)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b0000000000000151000248304502210091b32274295c2a3fa02f5bce92fb2789e3fc6ea947fbe1a76e52ea3f4ef2381a022079ad72aefa3837a2e0c033a8652a59731da05fa4a813f4fc48e87c075037256b822103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash None\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff04b60300000000000001519e070000000000000151860b0000000000000100960000000000000001510002473044022022fceb54f62f8feea77faac7083c3b56c4676a78f93745adc8a35800bc36adfa022026927df9abcf0a8777829bcfcce3ff0a385fa54c3f9df577405e3ef24ee56479022103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash None (same signature as previous)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b00000000000001510002473044022022fceb54f62f8feea77faac7083c3b56c4676a78f93745adc8a35800bc36adfa022026927df9abcf0a8777829bcfcce3ff0a385fa54c3f9df577405e3ef24ee56479022103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash None (same signature, only sequences changed)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"01000000000103000100000000000000000000000000000000000000000000000000000000000000000000000200000000010000000000000000000000000000000000000000000000000000000000000100000000ffffffff000100000000000000000000000000000000000000000000000000000000000002000000000200000003e8030000000000000151d0070000000000000151b80b00000000000001510002473044022022fceb54f62f8feea77faac7083c3b56c4676a78f93745adc8a35800bc36adfa022026927df9abcf0a8777829bcfcce3ff0a385fa54c3f9df577405e3ef24ee56479022103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash All|AnyoneCanPay\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3100],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1100],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 3, \"0x51\", 4100]],\n\"0100000000010400010000000000000000000000000000000000000000000000000000000000000200000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000300000000ffffffff03e8030000000000000151d0070000000000000151b80b0000000000000151000002483045022100a3cec69b52cba2d2de623eeef89e0ba1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with SigHash All|AnyoneCanPay (same signature as previous)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b00000000000001510002483045022100a3cec69b52cba2d2de623eeef89e0ba1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Unknown witness program version  (without DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x60 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 2000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"0x51\", 3000]],\n\"0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b00000000000001510002483045022100a3cec69b52cba2d2de623ffffffffff1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Witness with a push of 520 bytes\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x00 0x20 0x33198a9bfef674ebddb9ffaa52928017b8472791e54c609cb95f278ac6b1e349\", 1000]],\n\"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff010000000000000000015102fd08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002755100000000\", \"P2SH,WITNESS\"],\n\n[\"Transaction mixing all SigHash, segwit and normal inputs\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1001],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 2, \"DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG\", 1002],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 3, \"DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG\", 1003],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 4, \"DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG\", 1004],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 5, \"DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG\", 1005],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 6, \"DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG\", 1006],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 7, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1007],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 8, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1008],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 9, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1009],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 10, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1010],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 11, \"DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG\", 1011]],\n\"0100000000010c00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff0001000000000000000000000000000000000000000000000000000000000000020000006a473044022026c2e65b33fcd03b2a3b0f25030f0244bd23cc45ae4dec0f48ae62255b1998a00220463aa3982b718d593a6b9e0044513fd67a5009c2fdccc59992cffc2b167889f4012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000030000006a4730440220008bd8382911218dcb4c9f2e75bf5c5c3635f2f2df49b36994fde85b0be21a1a02205a539ef10fb4c778b522c1be852352ea06c67ab74200977c722b0bc68972575a012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000040000006b483045022100d9436c32ff065127d71e1a20e319e4fe0a103ba0272743dbd8580be4659ab5d302203fd62571ee1fe790b182d078ecfd092a509eac112bea558d122974ef9cc012c7012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000050000006a47304402200e2c149b114ec546015c13b2b464bbcb0cdc5872e6775787527af6cbc4830b6c02207e9396c6979fb15a9a2b96ca08a633866eaf20dc0ff3c03e512c1d5a1654f148012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000060000006b483045022100b20e70d897dc15420bccb5e0d3e208d27bdd676af109abbd3f88dbdb7721e6d6022005836e663173fbdfe069f54cde3c2decd3d0ea84378092a5d9d85ec8642e8a41012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff00010000000000000000000000000000000000000000000000000000000000000700000000ffffffff00010000000000000000000000000000000000000000000000000000000000000800000000ffffffff00010000000000000000000000000000000000000000000000000000000000000900000000ffffffff00010000000000000000000000000000000000000000000000000000000000000a00000000ffffffff00010000000000000000000000000000000000000000000000000000000000000b0000006a47304402206639c6e05e3b9d2675a7f3876286bdf7584fe2bbd15e0ce52dd4e02c0092cdc60220757d60b0a61fc95ada79d23746744c72bac1545a75ff6c2c7cdb6ae04e7e9592012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0ce8030000000000000151e9030000000000000151ea030000000000000151eb030000000000000151ec030000000000000151ed030000000000000151ee030000000000000151ef030000000000000151f0030000000000000151f1030000000000000151f2030000000000000151f30300000000000001510248304502210082219a54f61bf126bfc3fa068c6e33831222d1d7138c6faa9d33ca87fd4202d6022063f9902519624254d7c2c8ea7ba2d66ae975e4e229ae38043973ec707d5d4a83012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7102473044022017fb58502475848c1b09f162cb1688d0920ff7f142bed0ef904da2ccc88b168f02201798afa61850c65e77889cbcd648a5703b487895517c88f85cdd18b021ee246a012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000000247304402202830b7926e488da75782c81a54cd281720890d1af064629ebf2e31bf9f5435f30220089afaa8b455bbeb7d9b9c3fe1ed37d07685ade8455c76472cda424d93e4074a012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7102473044022026326fcdae9207b596c2b05921dbac11d81040c4d40378513670f19d9f4af893022034ecd7a282c0163b89aaa62c22ec202cef4736c58cd251649bad0d8139bcbf55012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71024730440220214978daeb2f38cd426ee6e2f44131a33d6b191af1c216247f1dd7d74c16d84a02205fdc05529b0bc0c430b4d5987264d9d075351c4f4484c16e91662e90a72aab24012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710247304402204a6e9f199dc9672cf2ff8094aaa784363be1eb62b679f7ff2df361124f1dca3302205eeb11f70fab5355c9c8ad1a0700ea355d315e334822fa182227e9815308ee8f012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000\", \"P2SH,WITNESS\"],\n\n[\"Unknown version witness program with empty witness\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x60 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1000]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000\", \"P2SH,WITNESS\"],\n\n[\"Witness SIGHASH_SINGLE with output out of bound\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x51\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x20 0x4d6c2a32c87821d68fc016fca70797abdb80df6cd84651d40a9300c6bad79e62\", 1000]],\n\"0100000000010200010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff01d00700000000000001510003483045022100e078de4e96a0e05dcdc0a414124dd8475782b5f3f0ed3f607919e9a5eeeb22bf02201de309b3a3109adb3de8074b3610d4cf454c49b61247a2779a0bcbf31c889333032103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc711976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac00000000\", \"P2SH,WITNESS\"],\n\n[\"1 byte push should not be considered a witness scriptPubKey\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x60 0x01 0x01\", 1000]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000\", \"P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM\"],\n\n[\"41 bytes push should not be considered a witness scriptPubKey\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x60 0x29 0xff25429251b5a84f452230a3c75fd886b7fc5a7865ce4a7bb7a9d7c5be6da3dbff0000000000000000\", 1000]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000\", \"P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM\"],\n\n[\"The witness version must use OP_1 to OP_16 only\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x01 0x10 0x02 0x0001\", 1000]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000\", \"P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM\"],\n\n[\"The witness program push must be canonical\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x60 0x4c02 0x0001\", 1000]],\n\"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000\", \"P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM\"],\n\n[\"Witness Single|AnyoneCanPay does not hash input's position\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1001]],\n\"0100000000010200010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff02e8030000000000000151e90300000000000001510247304402206d59682663faab5e4cb733c562e22cdae59294895929ec38d7c016621ff90da0022063ef0af5f970afe8a45ea836e3509b8847ed39463253106ac17d19c437d3d56b832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710248304502210085001a820bfcbc9f9de0298af714493f8a37b3b354bfd21a7097c3e009f2018c022050a8b4dbc8155d4d04da2f5cdd575dcf8dd0108de8bec759bd897ea01ecb3af7832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000\", \"P2SH,WITNESS\"],\n\n[\"Witness Single|AnyoneCanPay does not hash input's position (permutation)\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1001],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f\", 1000]],\n\"0100000000010200010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff02e9030000000000000151e80300000000000001510248304502210085001a820bfcbc9f9de0298af714493f8a37b3b354bfd21a7097c3e009f2018c022050a8b4dbc8155d4d04da2f5cdd575dcf8dd0108de8bec759bd897ea01ecb3af7832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710247304402206d59682663faab5e4cb733c562e22cdae59294895929ec38d7c016621ff90da0022063ef0af5f970afe8a45ea836e3509b8847ed39463253106ac17d19c437d3d56b832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000\", \"P2SH,WITNESS\"],\n\n[\"Non witness Single|AnyoneCanPay hash input's position\"],\n[[[\"0000000000000000000000000000000000000000000000000000000000000100\", 0, \"0x21 0x03596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71 CHECKSIG\", 1000],\n[\"0000000000000000000000000000000000000000000000000000000000000100\", 1, \"0x21 0x03596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71 CHECKSIG\", 1001]],\n\"01000000020001000000000000000000000000000000000000000000000000000000000000000000004847304402202a0b4b1294d70540235ae033d78e64b4897ec859c7b6f1b2b1d8a02e1d46006702201445e756d2254b0f1dfda9ab8e1e1bc26df9668077403204f32d16a49a36eb6983ffffffff00010000000000000000000000000000000000000000000000000000000000000100000049483045022100acb96cfdbda6dc94b489fd06f2d720983b5f350e31ba906cdbd800773e80b21c02200d74ea5bdf114212b4bbe9ed82c36d2e369e302dff57cb60d01c428f0bd3daab83ffffffff02e8030000000000000151e903000000000000015100000000\", \"P2SH,WITNESS\"],\n\n[\"BIP143 examples: details and private keys are available in BIP143\"],\n[\"BIP143 example: P2WSH with OP_CODESEPARATOR and out-of-range SIGHASH_SINGLE.\"],\n[[[\"6eb316926b1c5d567cd6f5e6a84fec606fc53d7b474526d1fff3948020c93dfe\", 0, \"0x21 0x036d5c20fa14fb2f635474c1dc4ef5909d4568e5569b79fc94d3448486e14685f8 CHECKSIG\", 156250000],\n[\"f825690aee1b3dc247da796cacb12687a5e802429fd291cfd63e010f02cf1508\", 0, \"0x00 0x20 0x5d1b56b63d714eebe542309525f484b7e9d6f686b3781b6f61ef925d66d6f6a0\", 4900000000]],\n\"01000000000102fe3dc9208094f3ffd12645477b3dc56f60ec4fa8e6f5d67c565d1c6b9216b36e000000004847304402200af4e47c9b9629dbecc21f73af989bdaa911f7e6f6c2e9394588a3aa68f81e9902204f3fcf6ade7e5abb1295b6774c8e0abd94ae62217367096bc02ee5e435b67da201ffffffff0815cf020f013ed6cf91d29f4202e8a58726b1ac6c79da47c23d1bee0a6925f80000000000ffffffff0100f2052a010000001976a914a30741f8145e5acadf23f751864167f32e0963f788ac000347304402200de66acf4527789bfda55fc5459e214fa6083f936b430a762c629656216805ac0220396f550692cd347171cbc1ef1f51e15282e837bb2b30860dc77c8f78bc8501e503473044022027dc95ad6b740fe5129e7e62a75dd00f291a2aeb1200b84b09d9e3789406b6c002201a9ecd315dd6a0e632ab20bbb98948bc0c6fb204f2c286963bb48517a7058e27034721026dccc749adc2a9d0d89497ac511f760f45c47dc5ed9cf352a58ac706453880aeadab210255a9626aebf5e29c0e6538428ba0d1dcf6ca98ffdf086aa8ced5e0d0215ea465ac00000000\", \"P2SH,WITNESS,CONST_SCRIPTCODE\"],\n\n[\"BIP143 example: P2WSH with unexecuted OP_CODESEPARATOR and SINGLE|ANYONECANPAY\"],\n[[[\"01c0cf7fba650638e55eb91261b183251fbb466f90dff17f10086817c542b5e9\", 0, \"0x00 0x20 0xba468eea561b26301e4cf69fa34bde4ad60c81e70f059f045ca9a79931004a4d\", 16777215],\n[\"1b2a9a426ba603ba357ce7773cb5805cb9c7c2b386d100d1fc9263513188e680\", 0, \"0x00 0x20 0xd9bbfbe56af7c4b7f960a70d7ea107156913d9e5a26b0a71429df5e097ca6537\", 16777215]],\n\"01000000000102e9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff80e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffff0280969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac80969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000\", \"P2SH,WITNESS,CONST_SCRIPTCODE\"],\n\n[\"BIP143 example: Same as the previous example with input-output pairs swapped\"],\n[[[\"1b2a9a426ba603ba357ce7773cb5805cb9c7c2b386d100d1fc9263513188e680\", 0, \"0x00 0x20 0xd9bbfbe56af7c4b7f960a70d7ea107156913d9e5a26b0a71429df5e097ca6537\", 16777215],\n[\"01c0cf7fba650638e55eb91261b183251fbb466f90dff17f10086817c542b5e9\", 0, \"0x00 0x20 0xba468eea561b26301e4cf69fa34bde4ad60c81e70f059f045ca9a79931004a4d\", 16777215]],\n\"0100000000010280e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffffe9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff0280969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac80969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000\", \"P2SH,WITNESS,CONST_SCRIPTCODE\"],\n\n[\"BIP143 example: P2SH-P2WSH 6-of-6 multisig signed with 6 different SIGHASH types\"],\n[[[\"6eb98797a21c6c10aa74edf29d618be109f48a8e94c694f3701e08ca69186436\", 1, \"HASH160 0x14 0x9993a429037b5d912407a71c252019287b8d27a5 EQUAL\", 987654321]],\n\"0100000000010136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e0100000023220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac080047304402206ac44d672dac41f9b00e28f4df20c52eeb087207e8d758d76d92c6fab3b73e2b0220367750dbbe19290069cba53d096f44530e4f98acaa594810388cf7409a1870ce01473044022068c7946a43232757cbdf9176f009a928e1cd9a1a8c212f15c1e11ac9f2925d9002205b75f937ff2f9f3c1246e547e54f62e027f64eefa2695578cc6432cdabce271502473044022059ebf56d98010a932cf8ecfec54c48e6139ed6adb0728c09cbe1e4fa0915302e022007cd986c8fa870ff5d2b3a89139c9fe7e499259875357e20fcbb15571c76795403483045022100fbefd94bd0a488d50b79102b5dad4ab6ced30c4069f1eaa69a4b5a763414067e02203156c6a5c9cf88f91265f5a942e96213afae16d83321c8b31bb342142a14d16381483045022100a5263ea0553ba89221984bd7f0b13613db16e7a70c549a86de0cc0444141a407022005c360ef0ae5a5d4f9f2f87a56c1546cc8268cab08c73501d6b3be2e1e1a8a08824730440220525406a1482936d5a21888260dc165497a90a15669636d8edca6b9fe490d309c022032af0c646a34a44d1f4576bf6a4a74b67940f8faa84c7df9abe12a01a11e2b4783cf56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae00000000\", \"P2SH,WITNESS\"],\n\n[\"FindAndDelete tests\"],\n[\"This is a test of FindAndDelete. The first tx is a spend of normal P2SH and the second tx is a spend of bare P2WSH.\"],\n[\"The redeemScript/witnessScript is CHECKSIGVERIFY <0x30450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01>.\"],\n[\"The signature is <0x30450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01> <pubkey>,\"],\n[\"where the pubkey is obtained through key recovery with sig and correct sighash.\"],\n[\"This is to show that FindAndDelete is applied only to non-segwit scripts\"],\n[\"Non-segwit: correct sighash (with FindAndDelete) = 1ba1fe3bc90c5d1265460e684ce6774e324f0fabdf67619eda729e64e8b6bc08\"],\n[[[\"f18783ace138abac5d3a7a5cf08e88fe6912f267ef936452e0c27d090621c169\", 7000, \"HASH160 0x14 0x0c746489e2d83cdbb5b90b432773342ba809c134 EQUAL\", 200000]],\n\"010000000169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f1581b0000b64830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0121037a3fb04bcdb09eba90f69961ba1692a3528e45e67c85b200df820212d7594d334aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01ffffffff0101000000000000000000000000\", \"P2SH,WITNESS\"],\n[\"BIP143: correct sighash (without FindAndDelete) = 71c9cd9b2869b9c70b01b1f0360c148f42dee72297db312638df136f43311f23\"],\n[[[\"f18783ace138abac5d3a7a5cf08e88fe6912f267ef936452e0c27d090621c169\", 7500, \"0x00 0x20 0x9e1be07558ea5cc8e02ed1d80c0911048afad949affa36d5c3951e3159dbea19\", 200000]],\n\"0100000000010169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f14c1d000000ffffffff01010000000000000000034830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e012102a9781d66b61fb5a7ef00ac5ad5bc6ffc78be7b44a566e3c87870e1079368df4c4aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0100000000\", \"P2SH,WITNESS,CONST_SCRIPTCODE\"],\n[\"This is multisig version of the FindAndDelete tests\"],\n[\"Script is 2 CHECKMULTISIGVERIFY <sig1> <sig2> DROP\"],\n[\"52af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960175\"],\n[\"Signature is 0 <sig1> <sig2> 2 <key1> <key2>\"],\n[\"Non-segwit: correct sighash (with FindAndDelete) = 1d50f00ba4db2917b903b0ec5002e017343bb38876398c9510570f5dce099295\"],\n[[[\"9628667ad48219a169b41b020800162287d2c0f713c04157e95c484a8dcb7592\", 7000, \"HASH160 0x14 0x5748407f5ca5cdca53ba30b79040260770c9ee1b EQUAL\", 200000]],\n\"01000000019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a662896581b0000fd6f01004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c03959601522102cd74a2809ffeeed0092bc124fd79836706e41f048db3f6ae9df8708cefb83a1c2102e615999372426e46fd107b76eaf007156a507584aa2cc21de9eee3bdbd26d36c4c9552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960175ffffffff0101000000000000000000000000\", \"P2SH,WITNESS\"],\n[\"BIP143: correct sighash (without FindAndDelete) = c1628a1e7c67f14ca0c27c06e4fdeec2e6d1a73c7a91d7c046ff83e835aebb72\"],\n[[[\"9628667ad48219a169b41b020800162287d2c0f713c04157e95c484a8dcb7592\", 7500, \"0x00 0x20 0x9b66c15b4e0b4eb49fa877982cafded24859fe5b0e2dbfbe4f0df1de7743fd52\", 200000]],\n\"010000000001019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a6628964c1d000000ffffffff0101000000000000000007004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960101022102966f109c54e85d3aee8321301136cedeb9fc710fdef58a9de8a73942f8e567c021034ffc99dd9a79dd3cb31e2ab3e0b09e0e67db41ac068c625cd1f491576016c84e9552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c039596017500000000\", \"P2SH,WITNESS,CONST_SCRIPTCODE\"],\n[[[\"7a554c397846f025738965683b8448d79458c54b869f6391ece95145c962e65f\", 0, \"OP_HASH160 0x149512447916448e4193c321f2d599dff2538973f3 OP_EQUAL\", 0]],\n\"02000000015fe662c94551e9ec91639f864bc55894d748843b6865897325f04678394c557a0000000039093006020101020101012103f0665be3ccc59a592608790e84bcf117349fc76c77d06cd3fb323548c310ff340cad0a09300602010102010101ffffffff010000000000000000015100000000\", \"CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,CLEANSTACK,DERSIG,DISCOURAGE_UPGRADABLE_NOPS,LOW_S,MINIMALDATA,NULLDUMMY,NULLFAIL,P2SH,SIGPUSHONLY,STRICTENC,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM,MINIMALIF,WITNESS_PUBKEYTYPE,TAPROOT\"],\n\n[\"Make diffs cleaner by leaving a comment here without comma at the end\"]\n]\n"
  },
  {
    "path": "txscript/doc.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage txscript implements the bitcoin transaction script language.\n\nA complete description of the script language used by bitcoin can be found at\nhttps://en.bitcoin.it/wiki/Script.  The following only serves as a quick\noverview to provide information on how to use the package.\n\nThis package provides data structures and functions to parse and execute\nbitcoin transaction scripts.\n\n# Script Overview\n\nBitcoin transaction scripts are written in a stack-base, FORTH-like language.\n\nThe bitcoin script language consists of a number of opcodes which fall into\nseveral categories such as pushing and popping data to and from the stack,\nperforming basic and bitwise arithmetic, conditional branching, comparing\nhashes, and checking cryptographic signatures.  Scripts are processed from left\nto right and intentionally do not provide loops.\n\nThe vast majority of Bitcoin scripts at the time of this writing are of several\nstandard forms which consist of a spender providing a public key and a signature\nwhich proves the spender owns the associated private key.  This information\nis used to prove the spender is authorized to perform the transaction.\n\nOne benefit of using a scripting language is added flexibility in specifying\nwhat conditions must be met in order to spend bitcoins.\n\n# Errors\n\nErrors returned by this package are of type txscript.Error.  This allows the\ncaller to programmatically determine the specific error by examining the\nErrorCode field of the type asserted txscript.Error while still providing rich\nerror messages with contextual information.  A convenience function named\nIsErrorCode is also provided to allow callers to easily check for a specific\nerror code.  See ErrorCode in the package documentation for a full list.\n*/\npackage txscript\n"
  },
  {
    "path": "txscript/engine.go",
    "content": "// Copyright (c) 2013-2018 The btcsuite developers\n// Copyright (c) 2015-2018 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"strings\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// ScriptFlags is a bitmask defining additional operations or tests that will be\n// done when executing a script pair.\ntype ScriptFlags uint32\n\nconst (\n\t// ScriptBip16 defines whether the bip16 threshold has passed and thus\n\t// pay-to-script hash transactions will be fully validated.\n\tScriptBip16 ScriptFlags = 1 << iota\n\n\t// ScriptStrictMultiSig defines whether to verify the stack item\n\t// used by CHECKMULTISIG is zero length.\n\tScriptStrictMultiSig\n\n\t// ScriptDiscourageUpgradableNops defines whether to verify that\n\t// NOP1 through NOP10 are reserved for future soft-fork upgrades.  This\n\t// flag must not be used for consensus critical code nor applied to\n\t// blocks as this flag is only for stricter standard transaction\n\t// checks.  This flag is only applied when the above opcodes are\n\t// executed.\n\tScriptDiscourageUpgradableNops\n\n\t// ScriptVerifyCheckLockTimeVerify defines whether to verify that\n\t// a transaction output is spendable based on the locktime.\n\t// This is BIP0065.\n\tScriptVerifyCheckLockTimeVerify\n\n\t// ScriptVerifyCheckSequenceVerify defines whether to allow execution\n\t// pathways of a script to be restricted based on the age of the output\n\t// being spent.  This is BIP0112.\n\tScriptVerifyCheckSequenceVerify\n\n\t// ScriptVerifyCleanStack defines that the stack must contain only\n\t// one stack element after evaluation and that the element must be\n\t// true if interpreted as a boolean.  This is rule 6 of BIP0062.\n\t// This flag should never be used without the ScriptBip16 flag nor the\n\t// ScriptVerifyWitness flag.\n\tScriptVerifyCleanStack\n\n\t// ScriptVerifyDERSignatures defines that signatures are required\n\t// to compily with the DER format.\n\tScriptVerifyDERSignatures\n\n\t// ScriptVerifyLowS defines that signtures are required to comply with\n\t// the DER format and whose S value is <= order / 2.  This is rule 5\n\t// of BIP0062.\n\tScriptVerifyLowS\n\n\t// ScriptVerifyMinimalData defines that signatures must use the smallest\n\t// push operator. This is both rules 3 and 4 of BIP0062.\n\tScriptVerifyMinimalData\n\n\t// ScriptVerifyNullFail defines that signatures must be empty if\n\t// a CHECKSIG or CHECKMULTISIG operation fails.\n\tScriptVerifyNullFail\n\n\t// ScriptVerifySigPushOnly defines that signature scripts must contain\n\t// only pushed data.  This is rule 2 of BIP0062.\n\tScriptVerifySigPushOnly\n\n\t// ScriptVerifyStrictEncoding defines that signature scripts and\n\t// public keys must follow the strict encoding requirements.\n\tScriptVerifyStrictEncoding\n\n\t// ScriptVerifyWitness defines whether or not to verify a transaction\n\t// output using a witness program template.\n\tScriptVerifyWitness\n\n\t// ScriptVerifyDiscourageUpgradeableWitnessProgram makes witness\n\t// program with versions 2-16 non-standard.\n\tScriptVerifyDiscourageUpgradeableWitnessProgram\n\n\t// ScriptVerifyMinimalIf makes a script with an OP_IF/OP_NOTIF whose\n\t// operand is anything other than empty vector or [0x01] non-standard.\n\tScriptVerifyMinimalIf\n\n\t// ScriptVerifyWitnessPubKeyType makes a script within a check-sig\n\t// operation whose public key isn't serialized in a compressed format\n\t// non-standard.\n\tScriptVerifyWitnessPubKeyType\n\n\t// ScriptVerifyTaproot defines whether or not to verify a transaction\n\t// output using the new taproot validation rules.\n\tScriptVerifyTaproot\n\n\t// ScriptVerifyDiscourageUpgradeableWitnessProgram defines whether or\n\t// not to consider any new/unknown taproot leaf versions as\n\t// non-standard.\n\tScriptVerifyDiscourageUpgradeableTaprootVersion\n\n\t// ScriptVerifyDiscourageOpSuccess defines whether or not to consider\n\t// usage of OP_SUCCESS op codes during tapscript execution as\n\t// non-standard.\n\tScriptVerifyDiscourageOpSuccess\n\n\t// ScriptVerifyDiscourageUpgradeablePubkeyType defines if unknown\n\t// public key versions (during tapscript execution) is non-standard.\n\tScriptVerifyDiscourageUpgradeablePubkeyType\n\n\t// ScriptVerifyConstScriptCode fails non-segwit scripts if a signature\n\t// match is found in the script code or if OP_CODESEPARATOR is used.\n\tScriptVerifyConstScriptCode\n)\n\nconst (\n\t// MaxStackSize is the maximum combined height of stack and alt stack\n\t// during execution.\n\tMaxStackSize = 1000\n\n\t// MaxScriptSize is the maximum allowed length of a raw script.\n\tMaxScriptSize = 10000\n\n\t// payToWitnessPubKeyHashDataSize is the size of the witness program's\n\t// data push for a pay-to-witness-pub-key-hash output.\n\tpayToWitnessPubKeyHashDataSize = 20\n\n\t// payToWitnessScriptHashDataSize is the size of the witness program's\n\t// data push for a pay-to-witness-script-hash output.\n\tpayToWitnessScriptHashDataSize = 32\n\n\t// payToTaprootDataSize is the size of the witness program push for\n\t// taproot spends. This will be the serialized x-coordinate of the\n\t// top-level taproot output public key.\n\tpayToTaprootDataSize = 32\n)\n\nconst (\n\t// BaseSegwitWitnessVersion is the original witness version that defines\n\t// the initial set of segwit validation logic.\n\tBaseSegwitWitnessVersion = 0\n\n\t// TaprootWitnessVersion is the witness version that defines the new\n\t// taproot verification logic.\n\tTaprootWitnessVersion = 1\n)\n\n// halforder is used to tame ECDSA malleability (see BIP0062).\nvar halfOrder = new(big.Int).Rsh(btcec.S256().N, 1)\n\n// taprootExecutionCtx houses the special context-specific information we need\n// to validate a taproot script spend. This includes the annex, the running sig\n// op count tally, and other relevant information.\ntype taprootExecutionCtx struct {\n\tannex []byte\n\n\tcodeSepPos uint32\n\n\ttapLeafHash chainhash.Hash\n\n\tsigOpsBudget int32\n\n\tmustSucceed bool\n}\n\n// sigOpsDelta is both the starting budget for sig ops for tapscript\n// verification, as well as the decrease in the total budget when we encounter\n// a signature.\nconst sigOpsDelta = 50\n\n// tallysigOp attempts to decrease the current sig ops budget by sigOpsDelta.\n// An error is returned if after subtracting the delta, the budget is below\n// zero.\nfunc (t *taprootExecutionCtx) tallysigOp() error {\n\tt.sigOpsBudget -= sigOpsDelta\n\n\tif t.sigOpsBudget < 0 {\n\t\treturn scriptError(ErrTaprootMaxSigOps, \"\")\n\t}\n\n\treturn nil\n}\n\n// newTaprootExecutionCtx returns a fresh instance of the taproot execution\n// context.\nfunc newTaprootExecutionCtx(inputWitnessSize int32) *taprootExecutionCtx {\n\treturn &taprootExecutionCtx{\n\t\tcodeSepPos:   blankCodeSepValue,\n\t\tsigOpsBudget: sigOpsDelta + inputWitnessSize,\n\t}\n}\n\n// Engine is the virtual machine that executes scripts.\ntype Engine struct {\n\t// The following fields are set when the engine is created and must not be\n\t// changed afterwards.  The entries of the signature cache are mutated\n\t// during execution, however, the cache pointer itself is not changed.\n\t//\n\t// flags specifies the additional flags which modify the execution behavior\n\t// of the engine.\n\t//\n\t// tx identifies the transaction that contains the input which in turn\n\t// contains the signature script being executed.\n\t//\n\t// txIdx identifies the input index within the transaction that contains\n\t// the signature script being executed.\n\t//\n\t// version specifies the version of the public key script to execute.  Since\n\t// signature scripts redeem public keys scripts, this means the same version\n\t// also extends to signature scripts and redeem scripts in the case of\n\t// pay-to-script-hash.\n\t//\n\t// bip16 specifies that the public key script is of a special form that\n\t// indicates it is a BIP16 pay-to-script-hash and therefore the\n\t// execution must be treated as such.\n\t//\n\t// sigCache caches the results of signature verifications.  This is useful\n\t// since transaction scripts are often executed more than once from various\n\t// contexts (e.g. new block templates, when transactions are first seen\n\t// prior to being mined, part of full block verification, etc).\n\t//\n\t// hashCache caches the midstate of segwit v0 and v1 sighashes to\n\t// optimize worst-case hashing complexity.\n\t//\n\t// prevOutFetcher is used to look up all the previous output of\n\t// taproot transactions, as that information is hashed into the\n\t// sighash digest for such inputs.\n\tflags          ScriptFlags\n\ttx             wire.MsgTx\n\ttxIdx          int\n\tversion        uint16\n\tbip16          bool\n\tsigCache       *SigCache\n\thashCache      *TxSigHashes\n\tprevOutFetcher PrevOutputFetcher\n\n\t// The following fields handle keeping track of the current execution state\n\t// of the engine.\n\t//\n\t// scripts houses the raw scripts that are executed by the engine.  This\n\t// includes the signature script as well as the public key script.  It also\n\t// includes the redeem script in the case of pay-to-script-hash.\n\t//\n\t// scriptIdx tracks the index into the scripts array for the current program\n\t// counter.\n\t//\n\t// opcodeIdx tracks the number of the opcode within the current script for\n\t// the current program counter.  Note that it differs from the actual byte\n\t// index into the script and is really only used for disassembly purposes.\n\t//\n\t// lastCodeSep specifies the position within the current script of the last\n\t// OP_CODESEPARATOR.\n\t//\n\t// tokenizer provides the token stream of the current script being executed\n\t// and doubles as state tracking for the program counter within the script.\n\t//\n\t// savedFirstStack keeps a copy of the stack from the first script when\n\t// performing pay-to-script-hash execution.\n\t//\n\t// dstack is the primary data stack the various opcodes push and pop data\n\t// to and from during execution.\n\t//\n\t// astack is the alternate data stack the various opcodes push and pop data\n\t// to and from during execution.\n\t//\n\t// condStack tracks the conditional execution state with support for\n\t// multiple nested conditional execution opcodes.\n\t//\n\t// numOps tracks the total number of non-push operations in a script and is\n\t// primarily used to enforce maximum limits.\n\tscripts         [][]byte\n\tscriptIdx       int\n\topcodeIdx       int\n\tlastCodeSep     int\n\ttokenizer       ScriptTokenizer\n\tsavedFirstStack [][]byte\n\tdstack          stack\n\tastack          stack\n\tcondStack       []int\n\tnumOps          int\n\twitnessVersion  int\n\twitnessProgram  []byte\n\tinputAmount     int64\n\ttaprootCtx      *taprootExecutionCtx\n\n\t// stepCallback is an optional function that will be called every time\n\t// a step has been performed during script execution.\n\t//\n\t// NOTE: This is only meant to be used in debugging, and SHOULD NOT BE\n\t// USED during regular operation.\n\tstepCallback func(*StepInfo) error\n}\n\n// StepInfo houses the current VM state information that is passed back to the\n// stepCallback during script execution.\ntype StepInfo struct {\n\t// ScriptIndex is the index of the script currently being executed by\n\t// the Engine.\n\tScriptIndex int\n\n\t// OpcodeIndex is the index of the next opcode that will be executed.\n\t// In case the execution has completed, the opcode index will be\n\t// incrementet beyond the number of the current script's opcodes. This\n\t// indicates no new script is being executed, and execution is done.\n\tOpcodeIndex int\n\n\t// Stack is the Engine's current content on the stack:\n\tStack [][]byte\n\n\t// AltStack is the Engine's current content on the alt stack.\n\tAltStack [][]byte\n}\n\n// hasFlag returns whether the script engine instance has the passed flag set.\nfunc (vm *Engine) hasFlag(flag ScriptFlags) bool {\n\treturn vm.flags&flag == flag\n}\n\n// isBranchExecuting returns whether or not the current conditional branch is\n// actively executing.  For example, when the data stack has an OP_FALSE on it\n// and an OP_IF is encountered, the branch is inactive until an OP_ELSE or\n// OP_ENDIF is encountered.  It properly handles nested conditionals.\nfunc (vm *Engine) isBranchExecuting() bool {\n\tif len(vm.condStack) == 0 {\n\t\treturn true\n\t}\n\treturn vm.condStack[len(vm.condStack)-1] == OpCondTrue\n}\n\n// isOpcodeDisabled returns whether or not the opcode is disabled and thus is\n// always bad to see in the instruction stream (even if turned off by a\n// conditional).\nfunc isOpcodeDisabled(opcode byte) bool {\n\tswitch opcode {\n\tcase OP_CAT:\n\t\treturn true\n\tcase OP_SUBSTR:\n\t\treturn true\n\tcase OP_LEFT:\n\t\treturn true\n\tcase OP_RIGHT:\n\t\treturn true\n\tcase OP_INVERT:\n\t\treturn true\n\tcase OP_AND:\n\t\treturn true\n\tcase OP_OR:\n\t\treturn true\n\tcase OP_XOR:\n\t\treturn true\n\tcase OP_2MUL:\n\t\treturn true\n\tcase OP_2DIV:\n\t\treturn true\n\tcase OP_MUL:\n\t\treturn true\n\tcase OP_DIV:\n\t\treturn true\n\tcase OP_MOD:\n\t\treturn true\n\tcase OP_LSHIFT:\n\t\treturn true\n\tcase OP_RSHIFT:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// isOpcodeAlwaysIllegal returns whether or not the opcode is always illegal\n// when passed over by the program counter even if in a non-executed branch (it\n// isn't a coincidence that they are conditionals).\nfunc isOpcodeAlwaysIllegal(opcode byte) bool {\n\tswitch opcode {\n\tcase OP_VERIF:\n\t\treturn true\n\tcase OP_VERNOTIF:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// isOpcodeConditional returns whether or not the opcode is a conditional opcode\n// which changes the conditional execution stack when executed.\nfunc isOpcodeConditional(opcode byte) bool {\n\tswitch opcode {\n\tcase OP_IF:\n\t\treturn true\n\tcase OP_NOTIF:\n\t\treturn true\n\tcase OP_ELSE:\n\t\treturn true\n\tcase OP_ENDIF:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// checkMinimalDataPush returns whether or not the provided opcode is the\n// smallest possible way to represent the given data.  For example, the value 15\n// could be pushed with OP_DATA_1 15 (among other variations); however, OP_15 is\n// a single opcode that represents the same value and is only a single byte\n// versus two bytes.\nfunc checkMinimalDataPush(op *opcode, data []byte) error {\n\topcodeVal := op.value\n\tdataLen := len(data)\n\tswitch {\n\tcase dataLen == 0 && opcodeVal != OP_0:\n\t\tstr := fmt.Sprintf(\"zero length data push is encoded with opcode %s \"+\n\t\t\t\"instead of OP_0\", op.name)\n\t\treturn scriptError(ErrMinimalData, str)\n\tcase dataLen == 1 && data[0] >= 1 && data[0] <= 16:\n\t\tif opcodeVal != OP_1+data[0]-1 {\n\t\t\t// Should have used OP_1 .. OP_16\n\t\t\tstr := fmt.Sprintf(\"data push of the value %d encoded with opcode \"+\n\t\t\t\t\"%s instead of OP_%d\", data[0], op.name, data[0])\n\t\t\treturn scriptError(ErrMinimalData, str)\n\t\t}\n\tcase dataLen == 1 && data[0] == 0x81:\n\t\tif opcodeVal != OP_1NEGATE {\n\t\t\tstr := fmt.Sprintf(\"data push of the value -1 encoded with opcode \"+\n\t\t\t\t\"%s instead of OP_1NEGATE\", op.name)\n\t\t\treturn scriptError(ErrMinimalData, str)\n\t\t}\n\tcase dataLen <= 75:\n\t\tif int(opcodeVal) != dataLen {\n\t\t\t// Should have used a direct push\n\t\t\tstr := fmt.Sprintf(\"data push of %d bytes encoded with opcode %s \"+\n\t\t\t\t\"instead of OP_DATA_%d\", dataLen, op.name, dataLen)\n\t\t\treturn scriptError(ErrMinimalData, str)\n\t\t}\n\tcase dataLen <= 255:\n\t\tif opcodeVal != OP_PUSHDATA1 {\n\t\t\tstr := fmt.Sprintf(\"data push of %d bytes encoded with opcode %s \"+\n\t\t\t\t\"instead of OP_PUSHDATA1\", dataLen, op.name)\n\t\t\treturn scriptError(ErrMinimalData, str)\n\t\t}\n\tcase dataLen <= 65535:\n\t\tif opcodeVal != OP_PUSHDATA2 {\n\t\t\tstr := fmt.Sprintf(\"data push of %d bytes encoded with opcode %s \"+\n\t\t\t\t\"instead of OP_PUSHDATA2\", dataLen, op.name)\n\t\t\treturn scriptError(ErrMinimalData, str)\n\t\t}\n\t}\n\treturn nil\n}\n\n// executeOpcode performs execution on the passed opcode.  It takes into account\n// whether or not it is hidden by conditionals, but some rules still must be\n// tested in this case.\nfunc (vm *Engine) executeOpcode(op *opcode, data []byte) error {\n\t// Disabled opcodes are fail on program counter.\n\tif isOpcodeDisabled(op.value) {\n\t\tstr := fmt.Sprintf(\"attempt to execute disabled opcode %s\", op.name)\n\t\treturn scriptError(ErrDisabledOpcode, str)\n\t}\n\n\t// Always-illegal opcodes are fail on program counter.\n\tif isOpcodeAlwaysIllegal(op.value) {\n\t\tstr := fmt.Sprintf(\"attempt to execute reserved opcode %s\", op.name)\n\t\treturn scriptError(ErrReservedOpcode, str)\n\t}\n\n\t// Note that this includes OP_RESERVED which counts as a push operation.\n\tif vm.taprootCtx == nil && op.value > OP_16 {\n\t\tvm.numOps++\n\t\tif vm.numOps > MaxOpsPerScript {\n\t\t\tstr := fmt.Sprintf(\"exceeded max operation limit of %d\",\n\t\t\t\tMaxOpsPerScript)\n\t\t\treturn scriptError(ErrTooManyOperations, str)\n\t\t}\n\n\t} else if len(data) > MaxScriptElementSize {\n\t\tstr := fmt.Sprintf(\"element size %d exceeds max allowed size %d\",\n\t\t\tlen(data), MaxScriptElementSize)\n\t\treturn scriptError(ErrElementTooBig, str)\n\t}\n\n\t// Nothing left to do when this is not a conditional opcode and it is\n\t// not in an executing branch.\n\tif !vm.isBranchExecuting() && !isOpcodeConditional(op.value) {\n\t\treturn nil\n\t}\n\n\t// Ensure all executed data push opcodes use the minimal encoding when\n\t// the minimal data verification flag is set.\n\tif vm.dstack.verifyMinimalData && vm.isBranchExecuting() &&\n\t\top.value >= 0 && op.value <= OP_PUSHDATA4 {\n\n\t\tif err := checkMinimalDataPush(op, data); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn op.opfunc(op, data, vm)\n}\n\n// checkValidPC returns an error if the current script position is not valid for\n// execution.\nfunc (vm *Engine) checkValidPC() error {\n\tif vm.scriptIdx >= len(vm.scripts) {\n\t\tstr := fmt.Sprintf(\"script index %d beyond total scripts %d\",\n\t\t\tvm.scriptIdx, len(vm.scripts))\n\t\treturn scriptError(ErrInvalidProgramCounter, str)\n\t}\n\treturn nil\n}\n\n// isWitnessVersionActive returns true if a witness program was extracted\n// during the initialization of the Engine, and the program's version matches\n// the specified version.\nfunc (vm *Engine) isWitnessVersionActive(version uint) bool {\n\treturn vm.witnessProgram != nil && uint(vm.witnessVersion) == version\n}\n\n// verifyWitnessProgram validates the stored witness program using the passed\n// witness as input.\nfunc (vm *Engine) verifyWitnessProgram(witness wire.TxWitness) error {\n\tswitch {\n\n\t// We're attempting to verify a base (witness version 0) segwit output,\n\t// so we'll be looking for either a p2wsh or a p2wkh spend.\n\tcase vm.isWitnessVersionActive(BaseSegwitWitnessVersion):\n\t\tswitch len(vm.witnessProgram) {\n\t\tcase payToWitnessPubKeyHashDataSize: // P2WKH\n\t\t\t// The witness stack should consist of exactly two\n\t\t\t// items: the signature, and the pubkey.\n\t\t\tif len(witness) != 2 {\n\t\t\t\terr := fmt.Sprintf(\"should have exactly two \"+\n\t\t\t\t\t\"items in witness, instead have %v\", len(witness))\n\t\t\t\treturn scriptError(ErrWitnessProgramMismatch, err)\n\t\t\t}\n\n\t\t\t// Now we'll resume execution as if it were a regular\n\t\t\t// p2pkh transaction.\n\t\t\tpkScript, err := payToPubKeyHashScript(vm.witnessProgram)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tconst scriptVersion = 0\n\t\t\terr = checkScriptParses(vm.version, pkScript)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Set the stack to the provided witness stack, then\n\t\t\t// append the pkScript generated above as the next\n\t\t\t// script to execute.\n\t\t\tvm.scripts = append(vm.scripts, pkScript)\n\t\t\tvm.SetStack(witness)\n\n\t\tcase payToWitnessScriptHashDataSize: // P2WSH\n\t\t\t// Additionally, The witness stack MUST NOT be empty at\n\t\t\t// this point.\n\t\t\tif len(witness) == 0 {\n\t\t\t\treturn scriptError(ErrWitnessProgramEmpty, \"witness \"+\n\t\t\t\t\t\"program empty passed empty witness\")\n\t\t\t}\n\n\t\t\t// Obtain the witness script which should be the last\n\t\t\t// element in the passed stack. The size of the script\n\t\t\t// MUST NOT exceed the max script size.\n\t\t\twitnessScript := witness[len(witness)-1]\n\t\t\tif len(witnessScript) > MaxScriptSize {\n\t\t\t\tstr := fmt.Sprintf(\"witnessScript size %d \"+\n\t\t\t\t\t\"is larger than max allowed size %d\",\n\t\t\t\t\tlen(witnessScript), MaxScriptSize)\n\t\t\t\treturn scriptError(ErrScriptTooBig, str)\n\t\t\t}\n\n\t\t\t// Ensure that the serialized pkScript at the end of\n\t\t\t// the witness stack matches the witness program.\n\t\t\twitnessHash := sha256.Sum256(witnessScript)\n\t\t\tif !bytes.Equal(witnessHash[:], vm.witnessProgram) {\n\t\t\t\treturn scriptError(ErrWitnessProgramMismatch,\n\t\t\t\t\t\"witness program hash mismatch\")\n\t\t\t}\n\n\t\t\t// With all the validity checks passed, assert that the\n\t\t\t// script parses without failure.\n\t\t\tconst scriptVersion = 0\n\t\t\terr := checkScriptParses(vm.version, witnessScript)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// The hash matched successfully, so use the witness as\n\t\t\t// the stack, and set the witnessScript to be the next\n\t\t\t// script executed.\n\t\t\tvm.scripts = append(vm.scripts, witnessScript)\n\t\t\tvm.SetStack(witness[:len(witness)-1])\n\n\t\tdefault:\n\t\t\terrStr := fmt.Sprintf(\"length of witness program \"+\n\t\t\t\t\"must either be %v or %v bytes, instead is %v bytes\",\n\t\t\t\tpayToWitnessPubKeyHashDataSize,\n\t\t\t\tpayToWitnessScriptHashDataSize,\n\t\t\t\tlen(vm.witnessProgram))\n\t\t\treturn scriptError(ErrWitnessProgramWrongLength, errStr)\n\t\t}\n\n\t// We're attempting to verify a taproot input, and the witness\n\t// program data push is of the expected size, so we'll be looking for a\n\t// normal key-path spend, or a merkle proof for a tapscript with\n\t// execution afterwards.\n\tcase vm.isWitnessVersionActive(TaprootWitnessVersion) &&\n\t\tlen(vm.witnessProgram) == payToTaprootDataSize && !vm.bip16:\n\n\t\t// If taproot isn't currently active, then we'll return a\n\t\t// success here in place as we don't apply the new rules unless\n\t\t// the flag flips, as governed by the version bits deployment.\n\t\tif !vm.hasFlag(ScriptVerifyTaproot) {\n\t\t\treturn nil\n\t\t}\n\n\t\t// If there're no stack elements at all, then this is an\n\t\t// invalid spend.\n\t\tif len(witness) == 0 {\n\t\t\treturn scriptError(ErrWitnessProgramEmpty, \"witness \"+\n\t\t\t\t\"program empty passed empty witness\")\n\t\t}\n\n\t\t// At this point, we know taproot is active, so we'll populate\n\t\t// the taproot execution context.\n\t\tvm.taprootCtx = newTaprootExecutionCtx(\n\t\t\tint32(witness.SerializeSize()),\n\t\t)\n\n\t\t// If we can detect the annex, then drop that off the stack,\n\t\t// we'll only need it to compute the sighash later.\n\t\tif isAnnexedWitness(witness) {\n\t\t\tvm.taprootCtx.annex, _ = extractAnnex(witness)\n\n\t\t\t// Snip the annex off the end of the witness stack.\n\t\t\twitness = witness[:len(witness)-1]\n\t\t}\n\n\t\t// From here, we'll either be validating a normal key spend, or\n\t\t// a spend from the tap script leaf using a committed leaf.\n\t\tswitch {\n\t\t// If there's only a single element left on the stack (the\n\t\t// signature), then we'll apply the normal top-level schnorr\n\t\t// signature verification.\n\t\tcase len(witness) == 1:\n\t\t\t// As we only have a single element left (after maybe\n\t\t\t// removing the annex), we'll do normal taproot\n\t\t\t// keyspend validation.\n\t\t\trawSig := witness[0]\n\t\t\terr := VerifyTaprootKeySpend(\n\t\t\t\tvm.witnessProgram, rawSig, &vm.tx, vm.txIdx,\n\t\t\t\tvm.prevOutFetcher, vm.hashCache, vm.sigCache,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\t// TODO(roasbeef): proper error\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// TODO(roasbeef): or remove the other items from the stack?\n\t\t\tvm.taprootCtx.mustSucceed = true\n\t\t\treturn nil\n\n\t\t// Otherwise, we need to attempt full tapscript leaf\n\t\t// verification in place.\n\t\tdefault:\n\t\t\t// First, attempt to parse the control block, if this\n\t\t\t// isn't formatted properly, then we'll end execution\n\t\t\t// right here.\n\t\t\tcontrolBlock, err := ParseControlBlock(\n\t\t\t\twitness[len(witness)-1],\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Now that we know the control block is valid, we'll\n\t\t\t// verify the top-level taproot commitment, which\n\t\t\t// proves that the specified script was committed to in\n\t\t\t// the merkle tree.\n\t\t\twitnessScript := witness[len(witness)-2]\n\t\t\terr = VerifyTaprootLeafCommitment(\n\t\t\t\tcontrolBlock, vm.witnessProgram, witnessScript,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Now that we know the commitment is valid, we'll\n\t\t\t// check to see if OP_SUCCESS op codes are found in the\n\t\t\t// script. If so, then we'll return here early as we\n\t\t\t// skip proper validation.\n\t\t\tif ScriptHasOpSuccess(witnessScript) {\n\t\t\t\t// An op success op code has been found, however if\n\t\t\t\t// the policy flag forbidding them is active, then\n\t\t\t\t// we'll return an error.\n\t\t\t\tif vm.hasFlag(ScriptVerifyDiscourageOpSuccess) {\n\t\t\t\t\terrStr := fmt.Sprintf(\"script contains \" +\n\t\t\t\t\t\t\"OP_SUCCESS op code\")\n\t\t\t\t\treturn scriptError(ErrDiscourageOpSuccess, errStr)\n\t\t\t\t}\n\n\t\t\t\t// Otherwise, the script passes scott free.\n\t\t\t\tvm.taprootCtx.mustSucceed = true\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\t// Before we proceed with normal execution, check the\n\t\t\t// leaf version of the script, as if the policy flag is\n\t\t\t// active, then we should only allow the base leaf\n\t\t\t// version.\n\t\t\tif controlBlock.LeafVersion != BaseLeafVersion {\n\t\t\t\tswitch {\n\t\t\t\tcase vm.hasFlag(ScriptVerifyDiscourageUpgradeableTaprootVersion):\n\t\t\t\t\terrStr := fmt.Sprintf(\"tapscript is attempting \"+\n\t\t\t\t\t\t\"to use version: %v\", controlBlock.LeafVersion)\n\t\t\t\t\treturn scriptError(\n\t\t\t\t\t\tErrDiscourageUpgradeableTaprootVersion, errStr,\n\t\t\t\t\t)\n\t\t\t\tdefault:\n\t\t\t\t\t// If the policy flag isn't active,\n\t\t\t\t\t// then execution succeeds here as we\n\t\t\t\t\t// don't know the rules of the future\n\t\t\t\t\t// leaf versions.\n\t\t\t\t\tvm.taprootCtx.mustSucceed = true\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Now that we know we don't have any op success\n\t\t\t// fields, ensure that the script parses properly.\n\t\t\t//\n\t\t\t// TODO(roasbeef): combine w/ the above?\n\t\t\terr = checkScriptParses(vm.version, witnessScript)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Now that we know the script parses, and we have a\n\t\t\t// valid leaf version, we'll save the tapscript hash of\n\t\t\t// the leaf, as we need that for signature validation\n\t\t\t// later.\n\t\t\tvm.taprootCtx.tapLeafHash = NewBaseTapLeaf(\n\t\t\t\twitnessScript,\n\t\t\t).TapHash()\n\n\t\t\t// Otherwise, we'll now \"recurse\" one level deeper, and\n\t\t\t// set the remaining witness (leaving off the annex and\n\t\t\t// the witness script) as the execution stack, and\n\t\t\t// enter further execution.\n\t\t\tvm.scripts = append(vm.scripts, witnessScript)\n\t\t\tvm.SetStack(witness[:len(witness)-2])\n\t\t}\n\n\tcase vm.hasFlag(ScriptVerifyDiscourageUpgradeableWitnessProgram):\n\t\terrStr := fmt.Sprintf(\"new witness program versions \"+\n\t\t\t\"invalid: %v\", vm.witnessProgram)\n\n\t\treturn scriptError(ErrDiscourageUpgradableWitnessProgram, errStr)\n\tdefault:\n\t\t// If we encounter an unknown witness program version and we\n\t\t// aren't discouraging future unknown witness based soft-forks,\n\t\t// then we de-activate the segwit behavior within the VM for\n\t\t// the remainder of execution.\n\t\tvm.witnessProgram = nil\n\t}\n\n\t// TODO(roasbeef): other sanity checks here\n\tswitch {\n\n\t// In addition to the normal script element size limits, taproot also\n\t// enforces a limit on the max _starting_ stack size.\n\tcase vm.isWitnessVersionActive(TaprootWitnessVersion):\n\t\tif vm.dstack.Depth() > MaxStackSize {\n\t\t\tstr := fmt.Sprintf(\"tapscript stack size %d > max allowed %d\",\n\t\t\t\tvm.dstack.Depth(), MaxStackSize)\n\t\t\treturn scriptError(ErrStackOverflow, str)\n\t\t}\n\n\t\tfallthrough\n\tcase vm.isWitnessVersionActive(BaseSegwitWitnessVersion):\n\t\t// All elements within the witness stack must not be greater\n\t\t// than the maximum bytes which are allowed to be pushed onto\n\t\t// the stack.\n\t\tfor _, witElement := range vm.GetStack() {\n\t\t\tif len(witElement) > MaxScriptElementSize {\n\t\t\t\tstr := fmt.Sprintf(\"element size %d exceeds \"+\n\t\t\t\t\t\"max allowed size %d\", len(witElement),\n\t\t\t\t\tMaxScriptElementSize)\n\t\t\t\treturn scriptError(ErrElementTooBig, str)\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t}\n\n\treturn nil\n}\n\n// DisasmPC returns the string for the disassembly of the opcode that will be\n// next to execute when Step is called.\nfunc (vm *Engine) DisasmPC() (string, error) {\n\tif err := vm.checkValidPC(); err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Create a copy of the current tokenizer and parse the next opcode in the\n\t// copy to avoid mutating the current one.\n\tpeekTokenizer := vm.tokenizer\n\tif !peekTokenizer.Next() {\n\t\t// Note that due to the fact that all scripts are checked for parse\n\t\t// failures before this code ever runs, there should never be an error\n\t\t// here, but check again to be safe in case a refactor breaks that\n\t\t// assumption or new script versions are introduced with different\n\t\t// semantics.\n\t\tif err := peekTokenizer.Err(); err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\t// Note that this should be impossible to hit in practice because the\n\t\t// only way it could happen would be for the final opcode of a script to\n\t\t// already be parsed without the script index having been updated, which\n\t\t// is not the case since stepping the script always increments the\n\t\t// script index when parsing and executing the final opcode of a script.\n\t\t//\n\t\t// However, check again to be safe in case a refactor breaks that\n\t\t// assumption or new script versions are introduced with different\n\t\t// semantics.\n\t\tstr := fmt.Sprintf(\"program counter beyond script index %d (bytes %x)\",\n\t\t\tvm.scriptIdx, vm.scripts[vm.scriptIdx])\n\t\treturn \"\", scriptError(ErrInvalidProgramCounter, str)\n\t}\n\n\tvar buf strings.Builder\n\tdisasmOpcode(&buf, peekTokenizer.op, peekTokenizer.Data(), false)\n\treturn fmt.Sprintf(\"%02x:%04x: %s\", vm.scriptIdx, vm.opcodeIdx,\n\t\tbuf.String()), nil\n}\n\n// DisasmScript returns the disassembly string for the script at the requested\n// offset index.  Index 0 is the signature script and 1 is the public key\n// script.  In the case of pay-to-script-hash, index 2 is the redeem script once\n// the execution has progressed far enough to have successfully verified script\n// hash and thus add the script to the scripts to execute.\nfunc (vm *Engine) DisasmScript(idx int) (string, error) {\n\tif idx >= len(vm.scripts) {\n\t\tstr := fmt.Sprintf(\"script index %d >= total scripts %d\", idx,\n\t\t\tlen(vm.scripts))\n\t\treturn \"\", scriptError(ErrInvalidIndex, str)\n\t}\n\n\tvar disbuf strings.Builder\n\tscript := vm.scripts[idx]\n\ttokenizer := MakeScriptTokenizer(vm.version, script)\n\tvar opcodeIdx int\n\tfor tokenizer.Next() {\n\t\tdisbuf.WriteString(fmt.Sprintf(\"%02x:%04x: \", idx, opcodeIdx))\n\t\tdisasmOpcode(&disbuf, tokenizer.op, tokenizer.Data(), false)\n\t\tdisbuf.WriteByte('\\n')\n\t\topcodeIdx++\n\t}\n\treturn disbuf.String(), tokenizer.Err()\n}\n\n// CheckErrorCondition returns nil if the running script has ended and was\n// successful, leaving a a true boolean on the stack.  An error otherwise,\n// including if the script has not finished.\nfunc (vm *Engine) CheckErrorCondition(finalScript bool) error {\n\tif vm.taprootCtx != nil && vm.taprootCtx.mustSucceed {\n\t\treturn nil\n\t}\n\n\t// Check execution is actually done by ensuring the script index is after\n\t// the final script in the array script.\n\tif vm.scriptIdx < len(vm.scripts) {\n\t\treturn scriptError(ErrScriptUnfinished,\n\t\t\t\"error check when script unfinished\")\n\t}\n\n\t// If we're in version zero witness execution mode, and this was the\n\t// final script, then the stack MUST be clean in order to maintain\n\t// compatibility with BIP16.\n\tif finalScript && vm.isWitnessVersionActive(BaseSegwitWitnessVersion) &&\n\t\tvm.dstack.Depth() != 1 {\n\t\treturn scriptError(ErrEvalFalse, \"witness program must \"+\n\t\t\t\"have clean stack\")\n\t}\n\n\t// The final script must end with exactly one data stack item when the\n\t// verify clean stack flag is set.  Otherwise, there must be at least one\n\t// data stack item in order to interpret it as a boolean.\n\tcleanStackActive := vm.hasFlag(ScriptVerifyCleanStack) || vm.taprootCtx != nil\n\tif finalScript && cleanStackActive && vm.dstack.Depth() != 1 {\n\n\t\tstr := fmt.Sprintf(\"stack must contain exactly one item (contains %d)\",\n\t\t\tvm.dstack.Depth())\n\t\treturn scriptError(ErrCleanStack, str)\n\t} else if vm.dstack.Depth() < 1 {\n\t\treturn scriptError(ErrEmptyStack,\n\t\t\t\"stack empty at end of script execution\")\n\t}\n\n\tv, err := vm.dstack.PopBool()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !v {\n\t\t// Log interesting data.\n\t\tlog.Tracef(\"%v\", newLogClosure(func() string {\n\t\t\tvar buf strings.Builder\n\t\t\tbuf.WriteString(\"scripts failed:\\n\")\n\t\t\tfor i := range vm.scripts {\n\t\t\t\tdis, _ := vm.DisasmScript(i)\n\t\t\t\tbuf.WriteString(fmt.Sprintf(\"script%d:\\n\", i))\n\t\t\t\tbuf.WriteString(dis)\n\t\t\t}\n\t\t\treturn buf.String()\n\t\t}))\n\t\treturn scriptError(ErrEvalFalse,\n\t\t\t\"false stack entry at end of script execution\")\n\t}\n\treturn nil\n}\n\n// Step executes the next instruction and moves the program counter to the next\n// opcode in the script, or the next script if the current has ended.  Step will\n// return true in the case that the last opcode was successfully executed.\n//\n// The result of calling Step or any other method is undefined if an error is\n// returned.\nfunc (vm *Engine) Step() (done bool, err error) {\n\t// Verify the engine is pointing to a valid program counter.\n\tif err := vm.checkValidPC(); err != nil {\n\t\treturn true, err\n\t}\n\n\t// Attempt to parse the next opcode from the current script.\n\tif !vm.tokenizer.Next() {\n\t\t// Note that due to the fact that all scripts are checked for parse\n\t\t// failures before this code ever runs, there should never be an error\n\t\t// here, but check again to be safe in case a refactor breaks that\n\t\t// assumption or new script versions are introduced with different\n\t\t// semantics.\n\t\tif err := vm.tokenizer.Err(); err != nil {\n\t\t\treturn false, err\n\t\t}\n\n\t\tstr := fmt.Sprintf(\"attempt to step beyond script index %d (bytes %x)\",\n\t\t\tvm.scriptIdx, vm.scripts[vm.scriptIdx])\n\t\treturn true, scriptError(ErrInvalidProgramCounter, str)\n\t}\n\n\t// Execute the opcode while taking into account several things such as\n\t// disabled opcodes, illegal opcodes, maximum allowed operations per script,\n\t// maximum script element sizes, and conditionals.\n\terr = vm.executeOpcode(vm.tokenizer.op, vm.tokenizer.Data())\n\tif err != nil {\n\t\treturn true, err\n\t}\n\n\t// The number of elements in the combination of the data and alt stacks\n\t// must not exceed the maximum number of stack elements allowed.\n\tcombinedStackSize := vm.dstack.Depth() + vm.astack.Depth()\n\tif combinedStackSize > MaxStackSize {\n\t\tstr := fmt.Sprintf(\"combined stack size %d > max allowed %d\",\n\t\t\tcombinedStackSize, MaxStackSize)\n\t\treturn false, scriptError(ErrStackOverflow, str)\n\t}\n\n\t// Prepare for next instruction.\n\tvm.opcodeIdx++\n\tif vm.tokenizer.Done() {\n\t\t// Illegal to have a conditional that straddles two scripts.\n\t\tif len(vm.condStack) != 0 {\n\t\t\treturn false, scriptError(ErrUnbalancedConditional,\n\t\t\t\t\"end of script reached in conditional execution\")\n\t\t}\n\n\t\t// Alt stack doesn't persist between scripts.\n\t\t_ = vm.astack.DropN(vm.astack.Depth())\n\n\t\t// The number of operations is per script.\n\t\tvm.numOps = 0\n\n\t\t// Reset the opcode index for the next script.\n\t\tvm.opcodeIdx = 0\n\n\t\t// Advance to the next script as needed.\n\t\tswitch {\n\t\tcase vm.scriptIdx == 0 && vm.bip16:\n\t\t\tvm.scriptIdx++\n\t\t\tvm.savedFirstStack = vm.GetStack()\n\n\t\tcase vm.scriptIdx == 1 && vm.bip16:\n\t\t\t// Put us past the end for CheckErrorCondition()\n\t\t\tvm.scriptIdx++\n\n\t\t\t// Check script ran successfully.\n\t\t\terr := vm.CheckErrorCondition(false)\n\t\t\tif err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\n\t\t\t// Obtain the redeem script from the first stack and ensure it\n\t\t\t// parses.\n\t\t\tscript := vm.savedFirstStack[len(vm.savedFirstStack)-1]\n\t\t\tif err := checkScriptParses(vm.version, script); err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t\tvm.scripts = append(vm.scripts, script)\n\n\t\t\t// Set stack to be the stack from first script minus the redeem\n\t\t\t// script itself\n\t\t\tvm.SetStack(vm.savedFirstStack[:len(vm.savedFirstStack)-1])\n\n\t\tcase vm.scriptIdx == 1 && vm.witnessProgram != nil,\n\t\t\tvm.scriptIdx == 2 && vm.witnessProgram != nil && vm.bip16: // np2sh\n\n\t\t\tvm.scriptIdx++\n\n\t\t\twitness := vm.tx.TxIn[vm.txIdx].Witness\n\t\t\tif err := vm.verifyWitnessProgram(witness); err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\n\t\tdefault:\n\t\t\tvm.scriptIdx++\n\t\t}\n\n\t\t// Skip empty scripts.\n\t\tif vm.scriptIdx < len(vm.scripts) && len(vm.scripts[vm.scriptIdx]) == 0 {\n\t\t\tvm.scriptIdx++\n\t\t}\n\n\t\tvm.lastCodeSep = 0\n\t\tif vm.scriptIdx >= len(vm.scripts) {\n\t\t\treturn true, nil\n\t\t}\n\n\t\t// Finally, update the current tokenizer used to parse through scripts\n\t\t// one opcode at a time to start from the beginning of the new script\n\t\t// associated with the program counter.\n\t\tvm.tokenizer = MakeScriptTokenizer(vm.version, vm.scripts[vm.scriptIdx])\n\t}\n\n\treturn false, nil\n}\n\n// copyStack makes a deep copy of the provided slice.\nfunc copyStack(stk [][]byte) [][]byte {\n\tc := make([][]byte, len(stk))\n\tfor i := range stk {\n\t\tc[i] = make([]byte, len(stk[i]))\n\t\tcopy(c[i][:], stk[i][:])\n\t}\n\n\treturn c\n}\n\n// Execute will execute all scripts in the script engine and return either nil\n// for successful validation or an error if one occurred.\nfunc (vm *Engine) Execute() (err error) {\n\t// All script versions other than 0 currently execute without issue,\n\t// making all outputs to them anyone can pay. In the future this\n\t// will allow for the addition of new scripting languages.\n\tif vm.version != 0 {\n\t\treturn nil\n\t}\n\n\t// If the stepCallback is set, we start by making a call back with the\n\t// initial engine state.\n\tvar stepInfo *StepInfo\n\tif vm.stepCallback != nil {\n\t\tstepInfo = &StepInfo{\n\t\t\tScriptIndex: vm.scriptIdx,\n\t\t\tOpcodeIndex: vm.opcodeIdx,\n\t\t\tStack:       copyStack(vm.dstack.stk),\n\t\t\tAltStack:    copyStack(vm.astack.stk),\n\t\t}\n\t\terr := vm.stepCallback(stepInfo)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tdone := false\n\tfor !done {\n\t\tlog.Tracef(\"%v\", newLogClosure(func() string {\n\t\t\tdis, err := vm.DisasmPC()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Sprintf(\"stepping - failed to disasm pc: %v\", err)\n\t\t\t}\n\t\t\treturn fmt.Sprintf(\"stepping %v\", dis)\n\t\t}))\n\n\t\tdone, err = vm.Step()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlog.Tracef(\"%v\", newLogClosure(func() string {\n\t\t\tvar dstr, astr string\n\n\t\t\t// Log the non-empty stacks when tracing.\n\t\t\tif vm.dstack.Depth() != 0 {\n\t\t\t\tdstr = \"Stack:\\n\" + vm.dstack.String()\n\t\t\t}\n\t\t\tif vm.astack.Depth() != 0 {\n\t\t\t\tastr = \"AltStack:\\n\" + vm.astack.String()\n\t\t\t}\n\n\t\t\treturn dstr + astr\n\t\t}))\n\n\t\tif vm.stepCallback != nil {\n\t\t\tscriptIdx := vm.scriptIdx\n\t\t\topcodeIdx := vm.opcodeIdx\n\n\t\t\t// In case the execution has completed, we keep the\n\t\t\t// current script index while increasing the opcode\n\t\t\t// index. This is to indicate that no new script is\n\t\t\t// being executed.\n\t\t\tif done {\n\t\t\t\tscriptIdx = stepInfo.ScriptIndex\n\t\t\t\topcodeIdx = stepInfo.OpcodeIndex + 1\n\t\t\t}\n\n\t\t\tstepInfo = &StepInfo{\n\t\t\t\tScriptIndex: scriptIdx,\n\t\t\t\tOpcodeIndex: opcodeIdx,\n\t\t\t\tStack:       copyStack(vm.dstack.stk),\n\t\t\t\tAltStack:    copyStack(vm.astack.stk),\n\t\t\t}\n\t\t\terr := vm.stepCallback(stepInfo)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn vm.CheckErrorCondition(true)\n}\n\n// subScript returns the script since the last OP_CODESEPARATOR.\nfunc (vm *Engine) subScript() []byte {\n\treturn vm.scripts[vm.scriptIdx][vm.lastCodeSep:]\n}\n\n// checkHashTypeEncoding returns whether or not the passed hashtype adheres to\n// the strict encoding requirements if enabled.\nfunc (vm *Engine) checkHashTypeEncoding(hashType SigHashType) error {\n\tif !vm.hasFlag(ScriptVerifyStrictEncoding) {\n\t\treturn nil\n\t}\n\n\tsigHashType := hashType & ^SigHashAnyOneCanPay\n\tif sigHashType < SigHashAll || sigHashType > SigHashSingle {\n\t\tstr := fmt.Sprintf(\"invalid hash type 0x%x\", hashType)\n\t\treturn scriptError(ErrInvalidSigHashType, str)\n\t}\n\treturn nil\n}\n\n// isStrictPubKeyEncoding returns whether or not the passed public key adheres\n// to the strict encoding requirements.\nfunc isStrictPubKeyEncoding(pubKey []byte) bool {\n\tif len(pubKey) == 33 && (pubKey[0] == 0x02 || pubKey[0] == 0x03) {\n\t\t// Compressed\n\t\treturn true\n\t}\n\tif len(pubKey) == 65 {\n\t\tswitch pubKey[0] {\n\t\tcase 0x04:\n\t\t\t// Uncompressed\n\t\t\treturn true\n\n\t\tcase 0x06, 0x07:\n\t\t\t// Hybrid\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// checkPubKeyEncoding returns whether or not the passed public key adheres to\n// the strict encoding requirements if enabled.\nfunc (vm *Engine) checkPubKeyEncoding(pubKey []byte) error {\n\tif vm.hasFlag(ScriptVerifyWitnessPubKeyType) &&\n\t\tvm.isWitnessVersionActive(BaseSegwitWitnessVersion) &&\n\t\t!btcec.IsCompressedPubKey(pubKey) {\n\n\t\tstr := \"only compressed keys are accepted post-segwit\"\n\t\treturn scriptError(ErrWitnessPubKeyType, str)\n\t}\n\n\tif !vm.hasFlag(ScriptVerifyStrictEncoding) {\n\t\treturn nil\n\t}\n\n\tif len(pubKey) == 33 && (pubKey[0] == 0x02 || pubKey[0] == 0x03) {\n\t\t// Compressed\n\t\treturn nil\n\t}\n\tif len(pubKey) == 65 && pubKey[0] == 0x04 {\n\t\t// Uncompressed\n\t\treturn nil\n\t}\n\n\treturn scriptError(ErrPubKeyType, \"unsupported public key type\")\n}\n\n// checkSignatureEncoding returns whether or not the passed signature adheres to\n// the strict encoding requirements if enabled.\nfunc (vm *Engine) checkSignatureEncoding(sig []byte) error {\n\tif !vm.hasFlag(ScriptVerifyDERSignatures) &&\n\t\t!vm.hasFlag(ScriptVerifyLowS) &&\n\t\t!vm.hasFlag(ScriptVerifyStrictEncoding) {\n\n\t\treturn nil\n\t}\n\n\t// The format of a DER encoded signature is as follows:\n\t//\n\t// 0x30 <total length> 0x02 <length of R> <R> 0x02 <length of S> <S>\n\t//   - 0x30 is the ASN.1 identifier for a sequence\n\t//   - Total length is 1 byte and specifies length of all remaining data\n\t//   - 0x02 is the ASN.1 identifier that specifies an integer follows\n\t//   - Length of R is 1 byte and specifies how many bytes R occupies\n\t//   - R is the arbitrary length big-endian encoded number which\n\t//     represents the R value of the signature.  DER encoding dictates\n\t//     that the value must be encoded using the minimum possible number\n\t//     of bytes.  This implies the first byte can only be null if the\n\t//     highest bit of the next byte is set in order to prevent it from\n\t//     being interpreted as a negative number.\n\t//   - 0x02 is once again the ASN.1 integer identifier\n\t//   - Length of S is 1 byte and specifies how many bytes S occupies\n\t//   - S is the arbitrary length big-endian encoded number which\n\t//     represents the S value of the signature.  The encoding rules are\n\t//     identical as those for R.\n\tconst (\n\t\tasn1SequenceID = 0x30\n\t\tasn1IntegerID  = 0x02\n\n\t\t// minSigLen is the minimum length of a DER encoded signature and is\n\t\t// when both R and S are 1 byte each.\n\t\t//\n\t\t// 0x30 + <1-byte> + 0x02 + 0x01 + <byte> + 0x2 + 0x01 + <byte>\n\t\tminSigLen = 8\n\n\t\t// maxSigLen is the maximum length of a DER encoded signature and is\n\t\t// when both R and S are 33 bytes each.  It is 33 bytes because a\n\t\t// 256-bit integer requires 32 bytes and an additional leading null byte\n\t\t// might required if the high bit is set in the value.\n\t\t//\n\t\t// 0x30 + <1-byte> + 0x02 + 0x21 + <33 bytes> + 0x2 + 0x21 + <33 bytes>\n\t\tmaxSigLen = 72\n\n\t\t// sequenceOffset is the byte offset within the signature of the\n\t\t// expected ASN.1 sequence identifier.\n\t\tsequenceOffset = 0\n\n\t\t// dataLenOffset is the byte offset within the signature of the expected\n\t\t// total length of all remaining data in the signature.\n\t\tdataLenOffset = 1\n\n\t\t// rTypeOffset is the byte offset within the signature of the ASN.1\n\t\t// identifier for R and is expected to indicate an ASN.1 integer.\n\t\trTypeOffset = 2\n\n\t\t// rLenOffset is the byte offset within the signature of the length of\n\t\t// R.\n\t\trLenOffset = 3\n\n\t\t// rOffset is the byte offset within the signature of R.\n\t\trOffset = 4\n\t)\n\n\t// The signature must adhere to the minimum and maximum allowed length.\n\tsigLen := len(sig)\n\tif sigLen < minSigLen {\n\t\tstr := fmt.Sprintf(\"malformed signature: too short: %d < %d\", sigLen,\n\t\t\tminSigLen)\n\t\treturn scriptError(ErrSigTooShort, str)\n\t}\n\tif sigLen > maxSigLen {\n\t\tstr := fmt.Sprintf(\"malformed signature: too long: %d > %d\", sigLen,\n\t\t\tmaxSigLen)\n\t\treturn scriptError(ErrSigTooLong, str)\n\t}\n\n\t// The signature must start with the ASN.1 sequence identifier.\n\tif sig[sequenceOffset] != asn1SequenceID {\n\t\tstr := fmt.Sprintf(\"malformed signature: format has wrong type: %#x\",\n\t\t\tsig[sequenceOffset])\n\t\treturn scriptError(ErrSigInvalidSeqID, str)\n\t}\n\n\t// The signature must indicate the correct amount of data for all elements\n\t// related to R and S.\n\tif int(sig[dataLenOffset]) != sigLen-2 {\n\t\tstr := fmt.Sprintf(\"malformed signature: bad length: %d != %d\",\n\t\t\tsig[dataLenOffset], sigLen-2)\n\t\treturn scriptError(ErrSigInvalidDataLen, str)\n\t}\n\n\t// Calculate the offsets of the elements related to S and ensure S is inside\n\t// the signature.\n\t//\n\t// rLen specifies the length of the big-endian encoded number which\n\t// represents the R value of the signature.\n\t//\n\t// sTypeOffset is the offset of the ASN.1 identifier for S and, like its R\n\t// counterpart, is expected to indicate an ASN.1 integer.\n\t//\n\t// sLenOffset and sOffset are the byte offsets within the signature of the\n\t// length of S and S itself, respectively.\n\trLen := int(sig[rLenOffset])\n\tsTypeOffset := rOffset + rLen\n\tsLenOffset := sTypeOffset + 1\n\tif sTypeOffset >= sigLen {\n\t\tstr := \"malformed signature: S type indicator missing\"\n\t\treturn scriptError(ErrSigMissingSTypeID, str)\n\t}\n\tif sLenOffset >= sigLen {\n\t\tstr := \"malformed signature: S length missing\"\n\t\treturn scriptError(ErrSigMissingSLen, str)\n\t}\n\n\t// The lengths of R and S must match the overall length of the signature.\n\t//\n\t// sLen specifies the length of the big-endian encoded number which\n\t// represents the S value of the signature.\n\tsOffset := sLenOffset + 1\n\tsLen := int(sig[sLenOffset])\n\tif sOffset+sLen != sigLen {\n\t\tstr := \"malformed signature: invalid S length\"\n\t\treturn scriptError(ErrSigInvalidSLen, str)\n\t}\n\n\t// R elements must be ASN.1 integers.\n\tif sig[rTypeOffset] != asn1IntegerID {\n\t\tstr := fmt.Sprintf(\"malformed signature: R integer marker: %#x != %#x\",\n\t\t\tsig[rTypeOffset], asn1IntegerID)\n\t\treturn scriptError(ErrSigInvalidRIntID, str)\n\t}\n\n\t// Zero-length integers are not allowed for R.\n\tif rLen == 0 {\n\t\tstr := \"malformed signature: R length is zero\"\n\t\treturn scriptError(ErrSigZeroRLen, str)\n\t}\n\n\t// R must not be negative.\n\tif sig[rOffset]&0x80 != 0 {\n\t\tstr := \"malformed signature: R is negative\"\n\t\treturn scriptError(ErrSigNegativeR, str)\n\t}\n\n\t// Null bytes at the start of R are not allowed, unless R would otherwise be\n\t// interpreted as a negative number.\n\tif rLen > 1 && sig[rOffset] == 0x00 && sig[rOffset+1]&0x80 == 0 {\n\t\tstr := \"malformed signature: R value has too much padding\"\n\t\treturn scriptError(ErrSigTooMuchRPadding, str)\n\t}\n\n\t// S elements must be ASN.1 integers.\n\tif sig[sTypeOffset] != asn1IntegerID {\n\t\tstr := fmt.Sprintf(\"malformed signature: S integer marker: %#x != %#x\",\n\t\t\tsig[sTypeOffset], asn1IntegerID)\n\t\treturn scriptError(ErrSigInvalidSIntID, str)\n\t}\n\n\t// Zero-length integers are not allowed for S.\n\tif sLen == 0 {\n\t\tstr := \"malformed signature: S length is zero\"\n\t\treturn scriptError(ErrSigZeroSLen, str)\n\t}\n\n\t// S must not be negative.\n\tif sig[sOffset]&0x80 != 0 {\n\t\tstr := \"malformed signature: S is negative\"\n\t\treturn scriptError(ErrSigNegativeS, str)\n\t}\n\n\t// Null bytes at the start of S are not allowed, unless S would otherwise be\n\t// interpreted as a negative number.\n\tif sLen > 1 && sig[sOffset] == 0x00 && sig[sOffset+1]&0x80 == 0 {\n\t\tstr := \"malformed signature: S value has too much padding\"\n\t\treturn scriptError(ErrSigTooMuchSPadding, str)\n\t}\n\n\t// Verify the S value is <= half the order of the curve.  This check is done\n\t// because when it is higher, the complement modulo the order can be used\n\t// instead which is a shorter encoding by 1 byte.  Further, without\n\t// enforcing this, it is possible to replace a signature in a valid\n\t// transaction with the complement while still being a valid signature that\n\t// verifies.  This would result in changing the transaction hash and thus is\n\t// a source of malleability.\n\tif vm.hasFlag(ScriptVerifyLowS) {\n\t\tsValue := new(big.Int).SetBytes(sig[sOffset : sOffset+sLen])\n\t\tif sValue.Cmp(halfOrder) > 0 {\n\t\t\treturn scriptError(ErrSigHighS, \"signature is not canonical due \"+\n\t\t\t\t\"to unnecessarily high S value\")\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// getStack returns the contents of stack as a byte array bottom up\nfunc getStack(stack *stack) [][]byte {\n\tarray := make([][]byte, stack.Depth())\n\tfor i := range array {\n\t\t// PeekByteArray can't fail due to overflow, already checked\n\t\tarray[len(array)-i-1], _ = stack.PeekByteArray(int32(i))\n\t}\n\treturn array\n}\n\n// setStack sets the stack to the contents of the array where the last item in\n// the array is the top item in the stack.\nfunc setStack(stack *stack, data [][]byte) {\n\t// This can not error. Only errors are for invalid arguments.\n\t_ = stack.DropN(stack.Depth())\n\n\tfor i := range data {\n\t\tstack.PushByteArray(data[i])\n\t}\n}\n\n// GetStack returns the contents of the primary stack as an array. where the\n// last item in the array is the top of the stack.\nfunc (vm *Engine) GetStack() [][]byte {\n\treturn getStack(&vm.dstack)\n}\n\n// SetStack sets the contents of the primary stack to the contents of the\n// provided array where the last item in the array will be the top of the stack.\nfunc (vm *Engine) SetStack(data [][]byte) {\n\tsetStack(&vm.dstack, data)\n}\n\n// GetAltStack returns the contents of the alternate stack as an array where the\n// last item in the array is the top of the stack.\nfunc (vm *Engine) GetAltStack() [][]byte {\n\treturn getStack(&vm.astack)\n}\n\n// SetAltStack sets the contents of the alternate stack to the contents of the\n// provided array where the last item in the array will be the top of the stack.\nfunc (vm *Engine) SetAltStack(data [][]byte) {\n\tsetStack(&vm.astack, data)\n}\n\n// NewEngine returns a new script engine for the provided public key script,\n// transaction, and input index.  The flags modify the behavior of the script\n// engine according to the description provided by each flag.\nfunc NewEngine(scriptPubKey []byte, tx *wire.MsgTx, txIdx int, flags ScriptFlags,\n\tsigCache *SigCache, hashCache *TxSigHashes, inputAmount int64,\n\tprevOutFetcher PrevOutputFetcher) (*Engine, error) {\n\n\tconst scriptVersion = 0\n\n\t// The provided transaction input index must refer to a valid input.\n\tif txIdx < 0 || txIdx >= len(tx.TxIn) {\n\t\tstr := fmt.Sprintf(\"transaction input index %d is negative or \"+\n\t\t\t\">= %d\", txIdx, len(tx.TxIn))\n\t\treturn nil, scriptError(ErrInvalidIndex, str)\n\t}\n\tscriptSig := tx.TxIn[txIdx].SignatureScript\n\n\t// When both the signature script and public key script are empty the result\n\t// is necessarily an error since the stack would end up being empty which is\n\t// equivalent to a false top element.  Thus, just return the relevant error\n\t// now as an optimization.\n\tif len(scriptSig) == 0 && len(scriptPubKey) == 0 {\n\t\treturn nil, scriptError(ErrEvalFalse,\n\t\t\t\"false stack entry at end of script execution\")\n\t}\n\n\t// The clean stack flag (ScriptVerifyCleanStack) is not allowed without\n\t// either the pay-to-script-hash (P2SH) evaluation (ScriptBip16)\n\t// flag or the Segregated Witness (ScriptVerifyWitness) flag.\n\t//\n\t// Recall that evaluating a P2SH script without the flag set results in\n\t// non-P2SH evaluation which leaves the P2SH inputs on the stack.\n\t// Thus, allowing the clean stack flag without the P2SH flag would make\n\t// it possible to have a situation where P2SH would not be a soft fork\n\t// when it should be. The same goes for segwit which will pull in\n\t// additional scripts for execution from the witness stack.\n\tvm := Engine{\n\t\tflags:          flags,\n\t\tsigCache:       sigCache,\n\t\thashCache:      hashCache,\n\t\tinputAmount:    inputAmount,\n\t\tprevOutFetcher: prevOutFetcher,\n\t}\n\tif vm.hasFlag(ScriptVerifyCleanStack) && (!vm.hasFlag(ScriptBip16) &&\n\t\t!vm.hasFlag(ScriptVerifyWitness)) {\n\t\treturn nil, scriptError(ErrInvalidFlags,\n\t\t\t\"invalid flags combination\")\n\t}\n\n\t// The signature script must only contain data pushes when the\n\t// associated flag is set.\n\tif vm.hasFlag(ScriptVerifySigPushOnly) && !IsPushOnlyScript(scriptSig) {\n\t\treturn nil, scriptError(ErrNotPushOnly,\n\t\t\t\"signature script is not push only\")\n\t}\n\n\t// The signature script must only contain data pushes for PS2H which is\n\t// determined based on the form of the public key script.\n\tif vm.hasFlag(ScriptBip16) && isScriptHashScript(scriptPubKey) {\n\t\t// Only accept input scripts that push data for P2SH.\n\t\t// Notice that the push only checks have already been done when\n\t\t// the flag to verify signature scripts are push only is set\n\t\t// above, so avoid checking again.\n\t\talreadyChecked := vm.hasFlag(ScriptVerifySigPushOnly)\n\t\tif !alreadyChecked && !IsPushOnlyScript(scriptSig) {\n\t\t\treturn nil, scriptError(ErrNotPushOnly,\n\t\t\t\t\"pay to script hash is not push only\")\n\t\t}\n\t\tvm.bip16 = true\n\t}\n\n\t// The engine stores the scripts using a slice.  This allows multiple\n\t// scripts to be executed in sequence.  For example, with a\n\t// pay-to-script-hash transaction, there will be ultimately be a third\n\t// script to execute.\n\tscripts := [][]byte{scriptSig, scriptPubKey}\n\tfor _, scr := range scripts {\n\t\tif len(scr) > MaxScriptSize {\n\t\t\tstr := fmt.Sprintf(\"script size %d is larger than max allowed \"+\n\t\t\t\t\"size %d\", len(scr), MaxScriptSize)\n\t\t\treturn nil, scriptError(ErrScriptTooBig, str)\n\t\t}\n\n\t\tconst scriptVersion = 0\n\t\tif err := checkScriptParses(scriptVersion, scr); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\tvm.scripts = scripts\n\n\t// Advance the program counter to the public key script if the signature\n\t// script is empty since there is nothing to execute for it in that case.\n\tif len(scriptSig) == 0 {\n\t\tvm.scriptIdx++\n\t}\n\tif vm.hasFlag(ScriptVerifyMinimalData) {\n\t\tvm.dstack.verifyMinimalData = true\n\t\tvm.astack.verifyMinimalData = true\n\t}\n\n\t// Check to see if we should execute in witness verification mode\n\t// according to the set flags. We check both the pkScript, and sigScript\n\t// here since in the case of nested p2sh, the scriptSig will be a valid\n\t// witness program. For nested p2sh, all the bytes after the first data\n\t// push should *exactly* match the witness program template.\n\tif vm.hasFlag(ScriptVerifyWitness) {\n\t\t// If witness evaluation is enabled, then P2SH MUST also be\n\t\t// active.\n\t\tif !vm.hasFlag(ScriptBip16) {\n\t\t\terrStr := \"P2SH must be enabled to do witness verification\"\n\t\t\treturn nil, scriptError(ErrInvalidFlags, errStr)\n\t\t}\n\n\t\tvar witProgram []byte\n\n\t\tswitch {\n\t\tcase IsWitnessProgram(vm.scripts[1]):\n\t\t\t// The scriptSig must be *empty* for all native witness\n\t\t\t// programs, otherwise we introduce malleability.\n\t\t\tif len(scriptSig) != 0 {\n\t\t\t\terrStr := \"native witness program cannot \" +\n\t\t\t\t\t\"also have a signature script\"\n\t\t\t\treturn nil, scriptError(ErrWitnessMalleated, errStr)\n\t\t\t}\n\n\t\t\twitProgram = scriptPubKey\n\t\tcase len(tx.TxIn[txIdx].Witness) != 0 && vm.bip16:\n\t\t\t// The sigScript MUST be *exactly* a single canonical\n\t\t\t// data push of the witness program, otherwise we\n\t\t\t// reintroduce malleability.\n\t\t\tsigPops := vm.scripts[0]\n\t\t\tif len(sigPops) > 2 &&\n\t\t\t\tisCanonicalPush(sigPops[0], sigPops[1:]) &&\n\t\t\t\tIsWitnessProgram(sigPops[1:]) {\n\n\t\t\t\twitProgram = sigPops[1:]\n\t\t\t} else {\n\t\t\t\terrStr := \"signature script for witness \" +\n\t\t\t\t\t\"nested p2sh is not canonical\"\n\t\t\t\treturn nil, scriptError(ErrWitnessMalleatedP2SH, errStr)\n\t\t\t}\n\t\t}\n\n\t\tif witProgram != nil {\n\t\t\tvar err error\n\t\t\tvm.witnessVersion, vm.witnessProgram, err = ExtractWitnessProgramInfo(\n\t\t\t\twitProgram,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t} else {\n\t\t\t// If we didn't find a witness program in either the\n\t\t\t// pkScript or as a datapush within the sigScript, then\n\t\t\t// there MUST NOT be any witness data associated with\n\t\t\t// the input being validated.\n\t\t\tif vm.witnessProgram == nil && len(tx.TxIn[txIdx].Witness) != 0 {\n\t\t\t\terrStr := \"non-witness inputs cannot have a witness\"\n\t\t\t\treturn nil, scriptError(ErrWitnessUnexpected, errStr)\n\t\t\t}\n\t\t}\n\n\t}\n\n\t// Setup the current tokenizer used to parse through the script one opcode\n\t// at a time with the script associated with the program counter.\n\tvm.tokenizer = MakeScriptTokenizer(scriptVersion, scripts[vm.scriptIdx])\n\n\tvm.tx = *tx\n\tvm.txIdx = txIdx\n\n\treturn &vm, nil\n}\n\n// NewEngine returns a new script engine with a script execution callback set.\n// This is useful for debugging script execution.\nfunc NewDebugEngine(scriptPubKey []byte, tx *wire.MsgTx, txIdx int,\n\tflags ScriptFlags, sigCache *SigCache, hashCache *TxSigHashes,\n\tinputAmount int64, prevOutFetcher PrevOutputFetcher,\n\tstepCallback func(*StepInfo) error) (*Engine, error) {\n\n\tvm, err := NewEngine(\n\t\tscriptPubKey, tx, txIdx, flags, sigCache, hashCache,\n\t\tinputAmount, prevOutFetcher,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvm.stepCallback = stepCallback\n\treturn vm, nil\n}\n"
  },
  {
    "path": "txscript/engine_debug_test.go",
    "content": "// Copyright (c) 2013-2023 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestDebugEngine checks that the StepCallback called during debug script\n// execution contains the expected data.\nfunc TestDebugEngine(t *testing.T) {\n\tt.Parallel()\n\n\t// We'll generate a private key and a signature for the tx.\n\tprivKey, err := btcec.NewPrivateKey()\n\trequire.NoError(t, err)\n\n\tinternalKey := privKey.PubKey()\n\n\t// We use a simple script that will utilize both the stack and alt\n\t// stack in order to test the step callback, and wrap it in a taproot\n\t// witness script.\n\tbuilder := NewScriptBuilder()\n\tbuilder.AddData([]byte{0xab})\n\tbuilder.AddOp(OP_TOALTSTACK)\n\tbuilder.AddData(schnorr.SerializePubKey(internalKey))\n\tbuilder.AddOp(OP_CHECKSIG)\n\tbuilder.AddOp(OP_VERIFY)\n\tbuilder.AddOp(OP_1)\n\tpkScript, err := builder.Script()\n\trequire.NoError(t, err)\n\n\ttapLeaf := NewBaseTapLeaf(pkScript)\n\ttapScriptTree := AssembleTaprootScriptTree(tapLeaf)\n\n\tctrlBlock := tapScriptTree.LeafMerkleProofs[0].ToControlBlock(\n\t\tinternalKey,\n\t)\n\n\ttapScriptRootHash := tapScriptTree.RootNode.TapHash()\n\toutputKey := ComputeTaprootOutputKey(\n\t\tinternalKey, tapScriptRootHash[:],\n\t)\n\tp2trScript, err := PayToTaprootScript(outputKey)\n\trequire.NoError(t, err)\n\n\ttestTx := wire.NewMsgTx(2)\n\ttestTx.AddTxIn(&wire.TxIn{\n\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\tIndex: 1,\n\t\t},\n\t})\n\ttxOut := &wire.TxOut{\n\t\tValue: 1e8, PkScript: p2trScript,\n\t}\n\ttestTx.AddTxOut(txOut)\n\n\tprevFetcher := NewCannedPrevOutputFetcher(\n\t\ttxOut.PkScript, txOut.Value,\n\t)\n\tsigHashes := NewTxSigHashes(testTx, prevFetcher)\n\n\tsig, err := RawTxInTapscriptSignature(\n\t\ttestTx, sigHashes, 0, txOut.Value,\n\t\ttxOut.PkScript, tapLeaf,\n\t\tSigHashDefault, privKey,\n\t)\n\trequire.NoError(t, err)\n\n\t// Now that we have the sig, we'll make a valid witness\n\t// including the control block.\n\tctrlBlockBytes, err := ctrlBlock.ToBytes()\n\trequire.NoError(t, err)\n\ttxCopy := testTx.Copy()\n\ttxCopy.TxIn[0].Witness = wire.TxWitness{\n\t\tsig, pkScript, ctrlBlockBytes,\n\t}\n\n\texpCallback := []StepInfo{\n\t\t// First callback is looking at the OP_1 witness version.\n\t\t{\n\t\t\tScriptIndex: 1,\n\t\t\tOpcodeIndex: 0,\n\t\t\tStack:       [][]byte{},\n\t\t\tAltStack:    [][]byte{},\n\t\t},\n\t\t// The OP_1 witness version is pushed to stack,\n\t\t{\n\t\t\tScriptIndex: 1,\n\t\t\tOpcodeIndex: 1,\n\t\t\tStack:       [][]byte{{0x01}},\n\t\t\tAltStack:    [][]byte{},\n\t\t},\n\t\t// Then the taproot script is being executed, starting with\n\t\t// only the signature on the stacks.\n\t\t{\n\t\t\tScriptIndex: 2,\n\t\t\tOpcodeIndex: 0,\n\t\t\tStack:       [][]byte{sig},\n\t\t\tAltStack:    [][]byte{},\n\t\t},\n\t\t// 0xab is pushed to the stack.\n\t\t{\n\t\t\tScriptIndex: 2,\n\t\t\tOpcodeIndex: 1,\n\t\t\tStack:       [][]byte{sig, {0xab}},\n\t\t\tAltStack:    [][]byte{},\n\t\t},\n\t\t// 0xab is moved to the alt stack.\n\t\t{\n\t\t\tScriptIndex: 2,\n\t\t\tOpcodeIndex: 2,\n\t\t\tStack:       [][]byte{sig},\n\t\t\tAltStack:    [][]byte{{0xab}},\n\t\t},\n\t\t// The public key is pushed to the stack.\n\t\t{\n\t\t\tScriptIndex: 2,\n\t\t\tOpcodeIndex: 3,\n\t\t\tStack: [][]byte{\n\t\t\t\tsig,\n\t\t\t\tschnorr.SerializePubKey(internalKey),\n\t\t\t},\n\t\t\tAltStack: [][]byte{{0xab}},\n\t\t},\n\t\t// OP_CHECKSIG is executed, resulting in 0x01 on the stack.\n\t\t{\n\t\t\tScriptIndex: 2,\n\t\t\tOpcodeIndex: 4,\n\t\t\tStack: [][]byte{\n\t\t\t\t{0x01},\n\t\t\t},\n\t\t\tAltStack: [][]byte{{0xab}},\n\t\t},\n\t\t// OP_VERIFY pops and checks the top stack element.\n\t\t{\n\t\t\tScriptIndex: 2,\n\t\t\tOpcodeIndex: 5,\n\t\t\tStack:       [][]byte{},\n\t\t\tAltStack:    [][]byte{{0xab}},\n\t\t},\n\t\t// A single OP_1 push completes the script execution (note that\n\t\t// the alt stack is cleared when the script is \"done\").\n\t\t{\n\t\t\tScriptIndex: 2,\n\t\t\tOpcodeIndex: 6,\n\t\t\tStack:       [][]byte{{0x01}},\n\t\t\tAltStack:    [][]byte{},\n\t\t},\n\t}\n\n\tstepIndex := 0\n\tcallback := func(s *StepInfo) error {\n\t\trequire.Less(\n\t\t\tt, stepIndex, len(expCallback), \"unexpected callback\",\n\t\t)\n\n\t\trequire.Equal(t, &expCallback[stepIndex], s)\n\t\tstepIndex++\n\t\treturn nil\n\t}\n\n\t// Run the debug engine.\n\tvm, err := NewDebugEngine(\n\t\ttxOut.PkScript, txCopy, 0, StandardVerifyFlags,\n\t\tnil, sigHashes, txOut.Value, prevFetcher,\n\t\tcallback,\n\t)\n\trequire.NoError(t, err)\n\trequire.NoError(t, vm.Execute())\n}\n"
  },
  {
    "path": "txscript/engine_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TestBadPC sets the pc to a deliberately bad result then confirms that Step\n// and Disasm fail correctly.\nfunc TestBadPC(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tscriptIdx int\n\t}{\n\t\t{scriptIdx: 2},\n\t\t{scriptIdx: 3},\n\t}\n\n\t// tx with almost empty scripts.\n\ttx := &wire.MsgTx{\n\t\tVersion: 1,\n\t\tTxIn: []*wire.TxIn{\n\t\t\t{\n\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\tHash: chainhash.Hash([32]byte{\n\t\t\t\t\t\t0xc9, 0x97, 0xa5, 0xe5,\n\t\t\t\t\t\t0x6e, 0x10, 0x41, 0x02,\n\t\t\t\t\t\t0xfa, 0x20, 0x9c, 0x6a,\n\t\t\t\t\t\t0x85, 0x2d, 0xd9, 0x06,\n\t\t\t\t\t\t0x60, 0xa2, 0x0b, 0x2d,\n\t\t\t\t\t\t0x9c, 0x35, 0x24, 0x23,\n\t\t\t\t\t\t0xed, 0xce, 0x25, 0x85,\n\t\t\t\t\t\t0x7f, 0xcd, 0x37, 0x04,\n\t\t\t\t\t}),\n\t\t\t\t\tIndex: 0,\n\t\t\t\t},\n\t\t\t\tSignatureScript: mustParseShortForm(\"NOP\"),\n\t\t\t\tSequence:        4294967295,\n\t\t\t},\n\t\t},\n\t\tTxOut: []*wire.TxOut{{\n\t\t\tValue:    1000000000,\n\t\t\tPkScript: nil,\n\t\t}},\n\t\tLockTime: 0,\n\t}\n\tpkScript := mustParseShortForm(\"NOP\")\n\n\tfor _, test := range tests {\n\t\tvm, err := NewEngine(pkScript, tx, 0, 0, nil, nil, -1, nil)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to create script: %v\", err)\n\t\t}\n\n\t\t// Set to after all scripts.\n\t\tvm.scriptIdx = test.scriptIdx\n\n\t\t// Ensure attempting to step fails.\n\t\t_, err = vm.Step()\n\t\tif err == nil {\n\t\t\tt.Errorf(\"Step with invalid pc (%v) succeeds!\", test)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure attempting to disassemble the current program counter fails.\n\t\t_, err = vm.DisasmPC()\n\t\tif err == nil {\n\t\t\tt.Errorf(\"DisasmPC with invalid pc (%v) succeeds!\", test)\n\t\t}\n\t}\n}\n\n// TestCheckErrorCondition tests the execute early test in CheckErrorCondition()\n// since most code paths are tested elsewhere.\nfunc TestCheckErrorCondition(t *testing.T) {\n\tt.Parallel()\n\n\t// tx with almost empty scripts.\n\ttx := &wire.MsgTx{\n\t\tVersion: 1,\n\t\tTxIn: []*wire.TxIn{{\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tHash: chainhash.Hash([32]byte{\n\t\t\t\t\t0xc9, 0x97, 0xa5, 0xe5,\n\t\t\t\t\t0x6e, 0x10, 0x41, 0x02,\n\t\t\t\t\t0xfa, 0x20, 0x9c, 0x6a,\n\t\t\t\t\t0x85, 0x2d, 0xd9, 0x06,\n\t\t\t\t\t0x60, 0xa2, 0x0b, 0x2d,\n\t\t\t\t\t0x9c, 0x35, 0x24, 0x23,\n\t\t\t\t\t0xed, 0xce, 0x25, 0x85,\n\t\t\t\t\t0x7f, 0xcd, 0x37, 0x04,\n\t\t\t\t}),\n\t\t\t\tIndex: 0,\n\t\t\t},\n\t\t\tSignatureScript: nil,\n\t\t\tSequence:        4294967295,\n\t\t}},\n\t\tTxOut: []*wire.TxOut{{\n\t\t\tValue:    1000000000,\n\t\t\tPkScript: nil,\n\t\t}},\n\t\tLockTime: 0,\n\t}\n\tpkScript := mustParseShortForm(\"NOP NOP NOP NOP NOP NOP NOP NOP NOP\" +\n\t\t\" NOP TRUE\")\n\n\tvm, err := NewEngine(pkScript, tx, 0, 0, nil, nil, 0, nil)\n\tif err != nil {\n\t\tt.Errorf(\"failed to create script: %v\", err)\n\t}\n\n\tfor i := 0; i < len(pkScript)-1; i++ {\n\t\tdone, err := vm.Step()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to step %dth time: %v\", i, err)\n\t\t}\n\t\tif done {\n\t\t\tt.Fatalf(\"finished early on %dth time\", i)\n\t\t}\n\n\t\terr = vm.CheckErrorCondition(false)\n\t\tif !IsErrorCode(err, ErrScriptUnfinished) {\n\t\t\tt.Fatalf(\"got unexpected error %v on %dth iteration\",\n\t\t\t\terr, i)\n\t\t}\n\t}\n\tdone, err := vm.Step()\n\tif err != nil {\n\t\tt.Fatalf(\"final step failed %v\", err)\n\t}\n\tif !done {\n\t\tt.Fatalf(\"final step isn't done!\")\n\t}\n\n\terr = vm.CheckErrorCondition(false)\n\tif err != nil {\n\t\tt.Errorf(\"unexpected error %v on final check\", err)\n\t}\n}\n\n// TestInvalidFlagCombinations ensures the script engine returns the expected\n// error when disallowed flag combinations are specified.\nfunc TestInvalidFlagCombinations(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []ScriptFlags{\n\t\tScriptVerifyCleanStack,\n\t}\n\n\t// tx with almost empty scripts.\n\ttx := &wire.MsgTx{\n\t\tVersion: 1,\n\t\tTxIn: []*wire.TxIn{\n\t\t\t{\n\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\tHash: chainhash.Hash([32]byte{\n\t\t\t\t\t\t0xc9, 0x97, 0xa5, 0xe5,\n\t\t\t\t\t\t0x6e, 0x10, 0x41, 0x02,\n\t\t\t\t\t\t0xfa, 0x20, 0x9c, 0x6a,\n\t\t\t\t\t\t0x85, 0x2d, 0xd9, 0x06,\n\t\t\t\t\t\t0x60, 0xa2, 0x0b, 0x2d,\n\t\t\t\t\t\t0x9c, 0x35, 0x24, 0x23,\n\t\t\t\t\t\t0xed, 0xce, 0x25, 0x85,\n\t\t\t\t\t\t0x7f, 0xcd, 0x37, 0x04,\n\t\t\t\t\t}),\n\t\t\t\t\tIndex: 0,\n\t\t\t\t},\n\t\t\t\tSignatureScript: []uint8{OP_NOP},\n\t\t\t\tSequence:        4294967295,\n\t\t\t},\n\t\t},\n\t\tTxOut: []*wire.TxOut{\n\t\t\t{\n\t\t\t\tValue:    1000000000,\n\t\t\t\tPkScript: nil,\n\t\t\t},\n\t\t},\n\t\tLockTime: 0,\n\t}\n\tpkScript := []byte{OP_NOP}\n\n\tfor i, test := range tests {\n\t\t_, err := NewEngine(pkScript, tx, 0, test, nil, nil, -1, nil)\n\t\tif !IsErrorCode(err, ErrInvalidFlags) {\n\t\t\tt.Fatalf(\"TestInvalidFlagCombinations #%d unexpected \"+\n\t\t\t\t\"error: %v\", i, err)\n\t\t}\n\t}\n}\n\n// TestCheckPubKeyEncoding ensures the internal checkPubKeyEncoding function\n// works as expected.\nfunc TestCheckPubKeyEncoding(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname    string\n\t\tkey     []byte\n\t\tisValid bool\n\t}{\n\t\t{\n\t\t\tname: \"uncompressed ok\",\n\t\t\tkey: hexToBytes(\"0411db93e1dcdb8a016b49840f8c53bc1eb68\" +\n\t\t\t\t\"a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf\" +\n\t\t\t\t\"9744464f82e160bfa9b8b64f9d4c03f999b8643f656b\" +\n\t\t\t\t\"412a3\"),\n\t\t\tisValid: true,\n\t\t},\n\t\t{\n\t\t\tname: \"compressed ok\",\n\t\t\tkey: hexToBytes(\"02ce0b14fb842b1ba549fdd675c98075f12e9\" +\n\t\t\t\t\"c510f8ef52bd021a9a1f4809d3b4d\"),\n\t\t\tisValid: true,\n\t\t},\n\t\t{\n\t\t\tname: \"compressed ok\",\n\t\t\tkey: hexToBytes(\"032689c7c2dab13309fb143e0e8fe39634252\" +\n\t\t\t\t\"1887e976690b6b47f5b2a4b7d448e\"),\n\t\t\tisValid: true,\n\t\t},\n\t\t{\n\t\t\tname: \"hybrid\",\n\t\t\tkey: hexToBytes(\"0679be667ef9dcbbac55a06295ce870b07029\" +\n\t\t\t\t\"bfcdb2dce28d959f2815b16f81798483ada7726a3c46\" +\n\t\t\t\t\"55da4fbfc0e1108a8fd17b448a68554199c47d08ffb1\" +\n\t\t\t\t\"0d4b8\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname:    \"empty\",\n\t\t\tkey:     nil,\n\t\t\tisValid: false,\n\t\t},\n\t}\n\n\tvm := Engine{flags: ScriptVerifyStrictEncoding}\n\tfor _, test := range tests {\n\t\terr := vm.checkPubKeyEncoding(test.key)\n\t\tif err != nil && test.isValid {\n\t\t\tt.Errorf(\"checkSignatureEncoding test '%s' failed \"+\n\t\t\t\t\"when it should have succeeded: %v\", test.name,\n\t\t\t\terr)\n\t\t} else if err == nil && !test.isValid {\n\t\t\tt.Errorf(\"checkSignatureEncooding test '%s' succeeded \"+\n\t\t\t\t\"when it should have failed\", test.name)\n\t\t}\n\t}\n\n}\n\n// TestCheckSignatureEncoding ensures the internal checkSignatureEncoding\n// function works as expected.\nfunc TestCheckSignatureEncoding(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname    string\n\t\tsig     []byte\n\t\tisValid bool\n\t}{\n\t\t{\n\t\t\tname: \"valid signature\",\n\t\t\tsig: hexToBytes(\"304402204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd41022018152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d09\"),\n\t\t\tisValid: true,\n\t\t},\n\t\t{\n\t\t\tname:    \"empty.\",\n\t\t\tsig:     nil,\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"bad magic\",\n\t\t\tsig: hexToBytes(\"314402204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd41022018152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"bad 1st int marker magic\",\n\t\t\tsig: hexToBytes(\"304403204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd41022018152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"bad 2nd int marker\",\n\t\t\tsig: hexToBytes(\"304402204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd41032018152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"short len\",\n\t\t\tsig: hexToBytes(\"304302204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd41022018152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"long len\",\n\t\t\tsig: hexToBytes(\"304502204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd41022018152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"long X\",\n\t\t\tsig: hexToBytes(\"304402424e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd41022018152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"long Y\",\n\t\t\tsig: hexToBytes(\"304402204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd41022118152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"short Y\",\n\t\t\tsig: hexToBytes(\"304402204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd41021918152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"trailing crap\",\n\t\t\tsig: hexToBytes(\"304402204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd41022018152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d0901\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"X == N \",\n\t\t\tsig: hexToBytes(\"30440220fffffffffffffffffffffffffffff\" +\n\t\t\t\t\"ffebaaedce6af48a03bbfd25e8cd0364141022018152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"X == N \",\n\t\t\tsig: hexToBytes(\"30440220fffffffffffffffffffffffffffff\" +\n\t\t\t\t\"ffebaaedce6af48a03bbfd25e8cd0364142022018152\" +\n\t\t\t\t\"2ec8eca07de4860a4acdd12909d831cc56cbbac46220\" +\n\t\t\t\t\"82221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Y == N\",\n\t\t\tsig: hexToBytes(\"304402204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd410220fffff\" +\n\t\t\t\t\"ffffffffffffffffffffffffffebaaedce6af48a03bb\" +\n\t\t\t\t\"fd25e8cd0364141\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Y > N\",\n\t\t\tsig: hexToBytes(\"304402204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd410220fffff\" +\n\t\t\t\t\"ffffffffffffffffffffffffffebaaedce6af48a03bb\" +\n\t\t\t\t\"fd25e8cd0364142\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"0 len X\",\n\t\t\tsig: hexToBytes(\"302402000220181522ec8eca07de4860a4acd\" +\n\t\t\t\t\"d12909d831cc56cbbac4622082221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"0 len Y\",\n\t\t\tsig: hexToBytes(\"302402204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd410200\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"extra R padding\",\n\t\t\tsig: hexToBytes(\"30450221004e45e16932b8af514961a1d3a1a\" +\n\t\t\t\t\"25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181\" +\n\t\t\t\t\"522ec8eca07de4860a4acdd12909d831cc56cbbac462\" +\n\t\t\t\t\"2082221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"extra S padding\",\n\t\t\tsig: hexToBytes(\"304502204e45e16932b8af514961a1d3a1a25\" +\n\t\t\t\t\"fdf3f4f7732e9d624c6c61548ab5fb8cd41022100181\" +\n\t\t\t\t\"522ec8eca07de4860a4acdd12909d831cc56cbbac462\" +\n\t\t\t\t\"2082221a8768d1d09\"),\n\t\t\tisValid: false,\n\t\t},\n\t}\n\n\tvm := Engine{flags: ScriptVerifyStrictEncoding}\n\tfor _, test := range tests {\n\t\terr := vm.checkSignatureEncoding(test.sig)\n\t\tif err != nil && test.isValid {\n\t\t\tt.Errorf(\"checkSignatureEncoding test '%s' failed \"+\n\t\t\t\t\"when it should have succeeded: %v\", test.name,\n\t\t\t\terr)\n\t\t} else if err == nil && !test.isValid {\n\t\t\tt.Errorf(\"checkSignatureEncooding test '%s' succeeded \"+\n\t\t\t\t\"when it should have failed\", test.name)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "txscript/error.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"fmt\"\n)\n\n// ErrorCode identifies a kind of script error.\ntype ErrorCode int\n\n// These constants are used to identify a specific Error.\nconst (\n\t// ErrInternal is returned if internal consistency checks fail.  In\n\t// practice this error should never be seen as it would mean there is an\n\t// error in the engine logic.\n\tErrInternal ErrorCode = iota\n\n\t// ---------------------------------------\n\t// Failures related to improper API usage.\n\t// ---------------------------------------\n\n\t// ErrInvalidFlags is returned when the passed flags to NewEngine\n\t// contain an invalid combination.\n\tErrInvalidFlags\n\n\t// ErrInvalidIndex is returned when an out-of-bounds index is passed to\n\t// a function.\n\tErrInvalidIndex\n\n\t// ErrUnsupportedAddress is returned when a concrete type that\n\t// implements a btcutil.Address is not a supported type.\n\tErrUnsupportedAddress\n\n\t// ErrNotMultisigScript is returned from CalcMultiSigStats when the\n\t// provided script is not a multisig script.\n\tErrNotMultisigScript\n\n\t// ErrTooManyRequiredSigs is returned from MultiSigScript when the\n\t// specified number of required signatures is larger than the number of\n\t// provided public keys.\n\tErrTooManyRequiredSigs\n\n\t// ErrTooMuchNullData is returned from NullDataScript when the length of\n\t// the provided data exceeds MaxDataCarrierSize.\n\tErrTooMuchNullData\n\n\t// ErrUnsupportedScriptVersion is returned when an unsupported script\n\t// version is passed to a function which deals with script analysis.\n\tErrUnsupportedScriptVersion\n\n\t// ------------------------------------------\n\t// Failures related to final execution state.\n\t// ------------------------------------------\n\n\t// ErrEarlyReturn is returned when OP_RETURN is executed in the script.\n\tErrEarlyReturn\n\n\t// ErrEmptyStack is returned when the script evaluated without error,\n\t// but terminated with an empty top stack element.\n\tErrEmptyStack\n\n\t// ErrEvalFalse is returned when the script evaluated without error but\n\t// terminated with a false top stack element.\n\tErrEvalFalse\n\n\t// ErrScriptUnfinished is returned when CheckErrorCondition is called on\n\t// a script that has not finished executing.\n\tErrScriptUnfinished\n\n\t// ErrScriptDone is returned when an attempt to execute an opcode is\n\t// made once all of them have already been executed.  This can happen\n\t// due to things such as a second call to Execute or calling Step after\n\t// all opcodes have already been executed.\n\tErrInvalidProgramCounter\n\n\t// -----------------------------------------------------\n\t// Failures related to exceeding maximum allowed limits.\n\t// -----------------------------------------------------\n\n\t// ErrScriptTooBig is returned if a script is larger than MaxScriptSize.\n\tErrScriptTooBig\n\n\t// ErrElementTooBig is returned if the size of an element to be pushed\n\t// to the stack is over MaxScriptElementSize.\n\tErrElementTooBig\n\n\t// ErrTooManyOperations is returned if a script has more than\n\t// MaxOpsPerScript opcodes that do not push data.\n\tErrTooManyOperations\n\n\t// ErrStackOverflow is returned when stack and altstack combined depth\n\t// is over the limit.\n\tErrStackOverflow\n\n\t// ErrInvalidPubKeyCount is returned when the number of public keys\n\t// specified for a multsig is either negative or greater than\n\t// MaxPubKeysPerMultiSig.\n\tErrInvalidPubKeyCount\n\n\t// ErrInvalidSignatureCount is returned when the number of signatures\n\t// specified for a multisig is either negative or greater than the\n\t// number of public keys.\n\tErrInvalidSignatureCount\n\n\t// ErrNumberTooBig is returned when the argument for an opcode that\n\t// expects numeric input is larger than the expected maximum number of\n\t// bytes.  For the most part, opcodes that deal with stack manipulation\n\t// via offsets, arithmetic, numeric comparison, and boolean logic are\n\t// those that this applies to.  However, any opcode that expects numeric\n\t// input may fail with this code.\n\tErrNumberTooBig\n\n\t// --------------------------------------------\n\t// Failures related to verification operations.\n\t// --------------------------------------------\n\n\t// ErrVerify is returned when OP_VERIFY is encountered in a script and\n\t// the top item on the data stack does not evaluate to true.\n\tErrVerify\n\n\t// ErrEqualVerify is returned when OP_EQUALVERIFY is encountered in a\n\t// script and the top item on the data stack does not evaluate to true.\n\tErrEqualVerify\n\n\t// ErrNumEqualVerify is returned when OP_NUMEQUALVERIFY is encountered\n\t// in a script and the top item on the data stack does not evaluate to\n\t// true.\n\tErrNumEqualVerify\n\n\t// ErrCheckSigVerify is returned when OP_CHECKSIGVERIFY is encountered\n\t// in a script and the top item on the data stack does not evaluate to\n\t// true.\n\tErrCheckSigVerify\n\n\t// ErrCheckSigVerify is returned when OP_CHECKMULTISIGVERIFY is\n\t// encountered in a script and the top item on the data stack does not\n\t// evaluate to true.\n\tErrCheckMultiSigVerify\n\n\t// --------------------------------------------\n\t// Failures related to improper use of opcodes.\n\t// --------------------------------------------\n\n\t// ErrDisabledOpcode is returned when a disabled opcode is encountered\n\t// in a script.\n\tErrDisabledOpcode\n\n\t// ErrReservedOpcode is returned when an opcode marked as reserved\n\t// is encountered in a script.\n\tErrReservedOpcode\n\n\t// ErrMalformedPush is returned when a data push opcode tries to push\n\t// more bytes than are left in the script.\n\tErrMalformedPush\n\n\t// ErrInvalidStackOperation is returned when a stack operation is\n\t// attempted with a number that is invalid for the current stack size.\n\tErrInvalidStackOperation\n\n\t// ErrUnbalancedConditional is returned when an OP_ELSE or OP_ENDIF is\n\t// encountered in a script without first having an OP_IF or OP_NOTIF or\n\t// the end of script is reached without encountering an OP_ENDIF when\n\t// an OP_IF or OP_NOTIF was previously encountered.\n\tErrUnbalancedConditional\n\n\t// ---------------------------------\n\t// Failures related to malleability.\n\t// ---------------------------------\n\n\t// ErrMinimalData is returned when the ScriptVerifyMinimalData flag\n\t// is set and the script contains push operations that do not use\n\t// the minimal opcode required.\n\tErrMinimalData\n\n\t// ErrInvalidSigHashType is returned when a signature hash type is not\n\t// one of the supported types.\n\tErrInvalidSigHashType\n\n\t// ErrSigTooShort is returned when a signature that should be a\n\t// canonically-encoded DER signature is too short.\n\tErrSigTooShort\n\n\t// ErrSigTooLong is returned when a signature that should be a\n\t// canonically-encoded DER signature is too long.\n\tErrSigTooLong\n\n\t// ErrSigInvalidSeqID is returned when a signature that should be a\n\t// canonically-encoded DER signature does not have the expected ASN.1\n\t// sequence ID.\n\tErrSigInvalidSeqID\n\n\t// ErrSigInvalidDataLen is returned a signature that should be a\n\t// canonically-encoded DER signature does not specify the correct number\n\t// of remaining bytes for the R and S portions.\n\tErrSigInvalidDataLen\n\n\t// ErrSigMissingSTypeID is returned a signature that should be a\n\t// canonically-encoded DER signature does not provide the ASN.1 type ID\n\t// for S.\n\tErrSigMissingSTypeID\n\n\t// ErrSigMissingSLen is returned when a signature that should be a\n\t// canonically-encoded DER signature does not provide the length of S.\n\tErrSigMissingSLen\n\n\t// ErrSigInvalidSLen is returned a signature that should be a\n\t// canonically-encoded DER signature does not specify the correct number\n\t// of bytes for the S portion.\n\tErrSigInvalidSLen\n\n\t// ErrSigInvalidRIntID is returned when a signature that should be a\n\t// canonically-encoded DER signature does not have the expected ASN.1\n\t// integer ID for R.\n\tErrSigInvalidRIntID\n\n\t// ErrSigZeroRLen is returned when a signature that should be a\n\t// canonically-encoded DER signature has an R length of zero.\n\tErrSigZeroRLen\n\n\t// ErrSigNegativeR is returned when a signature that should be a\n\t// canonically-encoded DER signature has a negative value for R.\n\tErrSigNegativeR\n\n\t// ErrSigTooMuchRPadding is returned when a signature that should be a\n\t// canonically-encoded DER signature has too much padding for R.\n\tErrSigTooMuchRPadding\n\n\t// ErrSigInvalidSIntID is returned when a signature that should be a\n\t// canonically-encoded DER signature does not have the expected ASN.1\n\t// integer ID for S.\n\tErrSigInvalidSIntID\n\n\t// ErrSigZeroSLen is returned when a signature that should be a\n\t// canonically-encoded DER signature has an S length of zero.\n\tErrSigZeroSLen\n\n\t// ErrSigNegativeS is returned when a signature that should be a\n\t// canonically-encoded DER signature has a negative value for S.\n\tErrSigNegativeS\n\n\t// ErrSigTooMuchSPadding is returned when a signature that should be a\n\t// canonically-encoded DER signature has too much padding for S.\n\tErrSigTooMuchSPadding\n\n\t// ErrSigHighS is returned when the ScriptVerifyLowS flag is set and the\n\t// script contains any signatures whose S values are higher than the\n\t// half order.\n\tErrSigHighS\n\n\t// ErrNotPushOnly is returned when a script that is required to only\n\t// push data to the stack performs other operations.  A couple of cases\n\t// where this applies is for a pay-to-script-hash signature script when\n\t// bip16 is active and when the ScriptVerifySigPushOnly flag is set.\n\tErrNotPushOnly\n\n\t// ErrSigNullDummy is returned when the ScriptStrictMultiSig flag is set\n\t// and a multisig script has anything other than 0 for the extra dummy\n\t// argument.\n\tErrSigNullDummy\n\n\t// ErrPubKeyType is returned when the ScriptVerifyStrictEncoding\n\t// flag is set and the script contains invalid public keys.\n\tErrPubKeyType\n\n\t// ErrCleanStack is returned when the ScriptVerifyCleanStack flag\n\t// is set, and after evaluation, the stack does not contain only a\n\t// single element.\n\tErrCleanStack\n\n\t// ErrNullFail is returned when the ScriptVerifyNullFail flag is\n\t// set and signatures are not empty on failed checksig or checkmultisig\n\t// operations.\n\tErrNullFail\n\n\t// ErrWitnessMalleated is returned if ScriptVerifyWitness is set and a\n\t// native p2wsh program is encountered which has a non-empty sigScript.\n\tErrWitnessMalleated\n\n\t// ErrWitnessMalleatedP2SH is returned if ScriptVerifyWitness if set\n\t// and the validation logic for nested p2sh encounters a sigScript\n\t// which isn't *exactyl* a datapush of the witness program.\n\tErrWitnessMalleatedP2SH\n\n\t// -------------------------------\n\t// Failures related to soft forks.\n\t// -------------------------------\n\n\t// ErrDiscourageUpgradableNOPs is returned when the\n\t// ScriptDiscourageUpgradableNops flag is set and a NOP opcode is\n\t// encountered in a script.\n\tErrDiscourageUpgradableNOPs\n\n\t// ErrNegativeLockTime is returned when a script contains an opcode that\n\t// interprets a negative lock time.\n\tErrNegativeLockTime\n\n\t// ErrUnsatisfiedLockTime is returned when a script contains an opcode\n\t// that involves a lock time and the required lock time has not been\n\t// reached.\n\tErrUnsatisfiedLockTime\n\n\t// ErrMinimalIf is returned if ScriptVerifyWitness is set and the\n\t// operand of an OP_IF/OP_NOF_IF are not either an empty vector or\n\t// [0x01].\n\tErrMinimalIf\n\n\t// ErrDiscourageUpgradableWitnessProgram is returned if\n\t// ScriptVerifyWitness is set and the version of an executing witness\n\t// program is outside the set of currently defined witness program\n\t// versions.\n\tErrDiscourageUpgradableWitnessProgram\n\n\t// ----------------------------------------\n\t// Failures related to segregated witness.\n\t// ----------------------------------------\n\n\t// ErrWitnessProgramEmpty is returned if ScriptVerifyWitness is set and\n\t// the witness stack itself is empty.\n\tErrWitnessProgramEmpty\n\n\t// ErrWitnessProgramMismatch is returned if ScriptVerifyWitness is set\n\t// and the witness itself for a p2wkh witness program isn't *exactly* 2\n\t// items or if the witness for a p2wsh isn't the sha255 of the witness\n\t// script.\n\tErrWitnessProgramMismatch\n\n\t// ErrWitnessProgramWrongLength is returned if ScriptVerifyWitness is\n\t// set and the length of the witness program violates the length as\n\t// dictated by the current witness version.\n\tErrWitnessProgramWrongLength\n\n\t// ErrWitnessUnexpected is returned if ScriptVerifyWitness is set and a\n\t// transaction includes witness data but doesn't spend an which is a\n\t// witness program (nested or native).\n\tErrWitnessUnexpected\n\n\t// ErrWitnessPubKeyType is returned if ScriptVerifyWitness is set and\n\t// the public key used in either a check-sig or check-multi-sig isn't\n\t// serialized in a compressed format.\n\tErrWitnessPubKeyType\n\n\t// ----------------------------\n\t// Failures related to taproot.\n\t// ----------------------------\n\n\t// ErrDiscourageOpSuccess is returned if\n\t// ScriptVerifyDiscourageOpSuccess is active, and a OP_SUCCESS op code\n\t// is encountered during tapscript validation.\n\tErrDiscourageOpSuccess\n\n\t// ErrDiscourageUpgradeableTaprootVersion is returned if\n\t// ScriptVerifyDiscourageUpgradeableTaprootVersion is active and a leaf\n\t// version encountered isn't the base leaf version.\n\tErrDiscourageUpgradeableTaprootVersion\n\n\t// ErrTapscriptCheckMultisig is returned if a script attempts to use\n\t// OP_CHECKMULTISIGVERIFY or OP_CHECKMULTISIG during tapscript\n\t// execution.\n\tErrTapscriptCheckMultisig\n\n\t// ErrDiscourageUpgradeableTaprootVersion is returned if during\n\t// tapscript execution, we encounter a public key that isn't 0 or 32\n\t// bytes.\n\tErrDiscourageUpgradeablePubKeyType\n\n\t// ErrTaprootSigInvalid is returned when an invalid taproot key spend\n\t// signature is encountered.\n\tErrTaprootSigInvalid\n\n\t// ErrTaprootMerkleProofInvalid is returned when the revealed script\n\t// merkle proof for a taproot spend is found to be invalid.\n\tErrTaprootMerkleProofInvalid\n\n\t// ErrTaprootOutputKeyParityMismatch is returned when the control block\n\t// proof is valid, but the parity of the y-coordinate of the derived\n\t// key doesn't match the value encoded in the control block.\n\tErrTaprootOutputKeyParityMismatch\n\n\t// ErrControlBlockTooSmall is returned when a parsed control block is\n\t// less than 33 bytes.\n\tErrControlBlockTooSmall\n\n\t// ErrControlBlockTooLarge is returned when the control block is larger\n\t// than the largest possible proof for a merkle script tree.\n\tErrControlBlockTooLarge\n\n\t// ErrControlBlockInvalidLength is returned when the control block,\n\t// without the public key isn't a multiple of 32.\n\tErrControlBlockInvalidLength\n\n\t// ErrWitnessHasNoAnnex is returned when a caller attempts to extract\n\t// an annex, but the witness has no annex present.\n\tErrWitnessHasNoAnnex\n\n\t// ErrInvalidTaprootSigLen is returned when taproot signature isn't 64\n\t// or 65 bytes.\n\tErrInvalidTaprootSigLen\n\n\t// ErrTaprootPubkeyIsEmpty is returned when a signature checking op\n\t// code encounters an empty public key.\n\tErrTaprootPubkeyIsEmpty\n\n\t// ErrTaprootMaxSigOps is returned when the number of allotted sig ops\n\t// is exceeded during taproot execution.\n\tErrTaprootMaxSigOps\n\n\t// ErrNonConstScriptCode is returned when a signature match is found when\n\t// calling removeOpcodeByData in a non-segwit script.\n\tErrNonConstScriptCode\n\n\t// ErrCodeSeparator is returned when OP_CODESEPARATOR is used in a\n\t// non-segwit script.\n\tErrCodeSeparator\n\n\t// numErrorCodes is the maximum error code number used in tests.  This\n\t// entry MUST be the last entry in the enum.\n\tnumErrorCodes\n)\n\n// Map of ErrorCode values back to their constant names for pretty printing.\nvar errorCodeStrings = map[ErrorCode]string{\n\tErrInternal:                            \"ErrInternal\",\n\tErrInvalidFlags:                        \"ErrInvalidFlags\",\n\tErrInvalidIndex:                        \"ErrInvalidIndex\",\n\tErrUnsupportedAddress:                  \"ErrUnsupportedAddress\",\n\tErrNotMultisigScript:                   \"ErrNotMultisigScript\",\n\tErrTooManyRequiredSigs:                 \"ErrTooManyRequiredSigs\",\n\tErrTooMuchNullData:                     \"ErrTooMuchNullData\",\n\tErrUnsupportedScriptVersion:            \"ErrUnsupportedScriptVersion\",\n\tErrEarlyReturn:                         \"ErrEarlyReturn\",\n\tErrEmptyStack:                          \"ErrEmptyStack\",\n\tErrEvalFalse:                           \"ErrEvalFalse\",\n\tErrScriptUnfinished:                    \"ErrScriptUnfinished\",\n\tErrInvalidProgramCounter:               \"ErrInvalidProgramCounter\",\n\tErrScriptTooBig:                        \"ErrScriptTooBig\",\n\tErrElementTooBig:                       \"ErrElementTooBig\",\n\tErrTooManyOperations:                   \"ErrTooManyOperations\",\n\tErrStackOverflow:                       \"ErrStackOverflow\",\n\tErrInvalidPubKeyCount:                  \"ErrInvalidPubKeyCount\",\n\tErrInvalidSignatureCount:               \"ErrInvalidSignatureCount\",\n\tErrNumberTooBig:                        \"ErrNumberTooBig\",\n\tErrVerify:                              \"ErrVerify\",\n\tErrEqualVerify:                         \"ErrEqualVerify\",\n\tErrNumEqualVerify:                      \"ErrNumEqualVerify\",\n\tErrCheckSigVerify:                      \"ErrCheckSigVerify\",\n\tErrCheckMultiSigVerify:                 \"ErrCheckMultiSigVerify\",\n\tErrDisabledOpcode:                      \"ErrDisabledOpcode\",\n\tErrReservedOpcode:                      \"ErrReservedOpcode\",\n\tErrMalformedPush:                       \"ErrMalformedPush\",\n\tErrInvalidStackOperation:               \"ErrInvalidStackOperation\",\n\tErrUnbalancedConditional:               \"ErrUnbalancedConditional\",\n\tErrMinimalData:                         \"ErrMinimalData\",\n\tErrInvalidSigHashType:                  \"ErrInvalidSigHashType\",\n\tErrSigTooShort:                         \"ErrSigTooShort\",\n\tErrSigTooLong:                          \"ErrSigTooLong\",\n\tErrSigInvalidSeqID:                     \"ErrSigInvalidSeqID\",\n\tErrSigInvalidDataLen:                   \"ErrSigInvalidDataLen\",\n\tErrSigMissingSTypeID:                   \"ErrSigMissingSTypeID\",\n\tErrSigMissingSLen:                      \"ErrSigMissingSLen\",\n\tErrSigInvalidSLen:                      \"ErrSigInvalidSLen\",\n\tErrSigInvalidRIntID:                    \"ErrSigInvalidRIntID\",\n\tErrSigZeroRLen:                         \"ErrSigZeroRLen\",\n\tErrSigNegativeR:                        \"ErrSigNegativeR\",\n\tErrSigTooMuchRPadding:                  \"ErrSigTooMuchRPadding\",\n\tErrSigInvalidSIntID:                    \"ErrSigInvalidSIntID\",\n\tErrSigZeroSLen:                         \"ErrSigZeroSLen\",\n\tErrSigNegativeS:                        \"ErrSigNegativeS\",\n\tErrSigTooMuchSPadding:                  \"ErrSigTooMuchSPadding\",\n\tErrSigHighS:                            \"ErrSigHighS\",\n\tErrNotPushOnly:                         \"ErrNotPushOnly\",\n\tErrSigNullDummy:                        \"ErrSigNullDummy\",\n\tErrPubKeyType:                          \"ErrPubKeyType\",\n\tErrCleanStack:                          \"ErrCleanStack\",\n\tErrNullFail:                            \"ErrNullFail\",\n\tErrDiscourageUpgradableNOPs:            \"ErrDiscourageUpgradableNOPs\",\n\tErrNegativeLockTime:                    \"ErrNegativeLockTime\",\n\tErrUnsatisfiedLockTime:                 \"ErrUnsatisfiedLockTime\",\n\tErrWitnessProgramEmpty:                 \"ErrWitnessProgramEmpty\",\n\tErrWitnessProgramMismatch:              \"ErrWitnessProgramMismatch\",\n\tErrWitnessProgramWrongLength:           \"ErrWitnessProgramWrongLength\",\n\tErrWitnessMalleated:                    \"ErrWitnessMalleated\",\n\tErrWitnessMalleatedP2SH:                \"ErrWitnessMalleatedP2SH\",\n\tErrWitnessUnexpected:                   \"ErrWitnessUnexpected\",\n\tErrMinimalIf:                           \"ErrMinimalIf\",\n\tErrWitnessPubKeyType:                   \"ErrWitnessPubKeyType\",\n\tErrDiscourageUpgradableWitnessProgram:  \"ErrDiscourageUpgradableWitnessProgram\",\n\tErrDiscourageOpSuccess:                 \"ErrDiscourageOpSuccess\",\n\tErrDiscourageUpgradeableTaprootVersion: \"ErrDiscourageUpgradeableTaprootVersion\",\n\tErrTapscriptCheckMultisig:              \"ErrTapscriptCheckMultisig\",\n\tErrDiscourageUpgradeablePubKeyType:     \"ErrDiscourageUpgradeablePubKeyType\",\n\tErrTaprootSigInvalid:                   \"ErrTaprootSigInvalid\",\n\tErrTaprootMerkleProofInvalid:           \"ErrTaprootMerkleProofInvalid\",\n\tErrTaprootOutputKeyParityMismatch:      \"ErrTaprootOutputKeyParityMismatch\",\n\tErrControlBlockTooSmall:                \"ErrControlBlockTooSmall\",\n\tErrControlBlockTooLarge:                \"ErrControlBlockTooLarge\",\n\tErrControlBlockInvalidLength:           \"ErrControlBlockInvalidLength\",\n\tErrWitnessHasNoAnnex:                   \"ErrWitnessHasNoAnnex\",\n\tErrInvalidTaprootSigLen:                \"ErrInvalidTaprootSigLen\",\n\tErrTaprootPubkeyIsEmpty:                \"ErrTaprootPubkeyIsEmpty\",\n\tErrTaprootMaxSigOps:                    \"ErrTaprootMaxSigOps\",\n\tErrNonConstScriptCode:                  \"ErrNonConstScriptCode\",\n\tErrCodeSeparator:                       \"ErrCodeSeparator\",\n}\n\n// String returns the ErrorCode as a human-readable name.\nfunc (e ErrorCode) String() string {\n\tif s := errorCodeStrings[e]; s != \"\" {\n\t\treturn s\n\t}\n\treturn fmt.Sprintf(\"Unknown ErrorCode (%d)\", int(e))\n}\n\n// Error identifies a script-related error.  It is used to indicate three\n// classes of errors:\n//  1. Script execution failures due to violating one of the many requirements\n//     imposed by the script engine or evaluating to false\n//  2. Improper API usage by callers\n//  3. Internal consistency check failures\n//\n// The caller can use type assertions on the returned errors to access the\n// ErrorCode field to ascertain the specific reason for the error.  As an\n// additional convenience, the caller may make use of the IsErrorCode function\n// to check for a specific error code.\ntype Error struct {\n\tErrorCode   ErrorCode\n\tDescription string\n}\n\n// Error satisfies the error interface and prints human-readable errors.\nfunc (e Error) Error() string {\n\treturn e.Description\n}\n\n// scriptError creates an Error given a set of arguments.\nfunc scriptError(c ErrorCode, desc string) Error {\n\treturn Error{ErrorCode: c, Description: desc}\n}\n\n// IsErrorCode returns whether or not the provided error is a script error with\n// the provided error code.\nfunc IsErrorCode(err error, c ErrorCode) bool {\n\tserr, ok := err.(Error)\n\treturn ok && serr.ErrorCode == c\n}\n"
  },
  {
    "path": "txscript/error_test.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Copyright (c) 2015-2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"testing\"\n)\n\n// TestErrorCodeStringer tests the stringized output for the ErrorCode type.\nfunc TestErrorCodeStringer(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tin   ErrorCode\n\t\twant string\n\t}{\n\t\t{ErrInternal, \"ErrInternal\"},\n\t\t{ErrInvalidFlags, \"ErrInvalidFlags\"},\n\t\t{ErrInvalidIndex, \"ErrInvalidIndex\"},\n\t\t{ErrUnsupportedAddress, \"ErrUnsupportedAddress\"},\n\t\t{ErrTooManyRequiredSigs, \"ErrTooManyRequiredSigs\"},\n\t\t{ErrTooMuchNullData, \"ErrTooMuchNullData\"},\n\t\t{ErrUnsupportedScriptVersion, \"ErrUnsupportedScriptVersion\"},\n\t\t{ErrNotMultisigScript, \"ErrNotMultisigScript\"},\n\t\t{ErrEarlyReturn, \"ErrEarlyReturn\"},\n\t\t{ErrEmptyStack, \"ErrEmptyStack\"},\n\t\t{ErrEvalFalse, \"ErrEvalFalse\"},\n\t\t{ErrScriptUnfinished, \"ErrScriptUnfinished\"},\n\t\t{ErrInvalidProgramCounter, \"ErrInvalidProgramCounter\"},\n\t\t{ErrScriptTooBig, \"ErrScriptTooBig\"},\n\t\t{ErrElementTooBig, \"ErrElementTooBig\"},\n\t\t{ErrTooManyOperations, \"ErrTooManyOperations\"},\n\t\t{ErrStackOverflow, \"ErrStackOverflow\"},\n\t\t{ErrInvalidPubKeyCount, \"ErrInvalidPubKeyCount\"},\n\t\t{ErrInvalidSignatureCount, \"ErrInvalidSignatureCount\"},\n\t\t{ErrNumberTooBig, \"ErrNumberTooBig\"},\n\t\t{ErrVerify, \"ErrVerify\"},\n\t\t{ErrEqualVerify, \"ErrEqualVerify\"},\n\t\t{ErrNumEqualVerify, \"ErrNumEqualVerify\"},\n\t\t{ErrCheckSigVerify, \"ErrCheckSigVerify\"},\n\t\t{ErrCheckMultiSigVerify, \"ErrCheckMultiSigVerify\"},\n\t\t{ErrDisabledOpcode, \"ErrDisabledOpcode\"},\n\t\t{ErrReservedOpcode, \"ErrReservedOpcode\"},\n\t\t{ErrMalformedPush, \"ErrMalformedPush\"},\n\t\t{ErrInvalidStackOperation, \"ErrInvalidStackOperation\"},\n\t\t{ErrUnbalancedConditional, \"ErrUnbalancedConditional\"},\n\t\t{ErrMinimalData, \"ErrMinimalData\"},\n\t\t{ErrInvalidSigHashType, \"ErrInvalidSigHashType\"},\n\t\t{ErrSigTooShort, \"ErrSigTooShort\"},\n\t\t{ErrSigTooLong, \"ErrSigTooLong\"},\n\t\t{ErrSigInvalidSeqID, \"ErrSigInvalidSeqID\"},\n\t\t{ErrSigInvalidDataLen, \"ErrSigInvalidDataLen\"},\n\t\t{ErrSigMissingSTypeID, \"ErrSigMissingSTypeID\"},\n\t\t{ErrSigMissingSLen, \"ErrSigMissingSLen\"},\n\t\t{ErrSigInvalidSLen, \"ErrSigInvalidSLen\"},\n\t\t{ErrSigInvalidRIntID, \"ErrSigInvalidRIntID\"},\n\t\t{ErrSigZeroRLen, \"ErrSigZeroRLen\"},\n\t\t{ErrSigNegativeR, \"ErrSigNegativeR\"},\n\t\t{ErrSigTooMuchRPadding, \"ErrSigTooMuchRPadding\"},\n\t\t{ErrSigInvalidSIntID, \"ErrSigInvalidSIntID\"},\n\t\t{ErrSigZeroSLen, \"ErrSigZeroSLen\"},\n\t\t{ErrSigNegativeS, \"ErrSigNegativeS\"},\n\t\t{ErrSigTooMuchSPadding, \"ErrSigTooMuchSPadding\"},\n\t\t{ErrSigHighS, \"ErrSigHighS\"},\n\t\t{ErrNotPushOnly, \"ErrNotPushOnly\"},\n\t\t{ErrSigNullDummy, \"ErrSigNullDummy\"},\n\t\t{ErrPubKeyType, \"ErrPubKeyType\"},\n\t\t{ErrCleanStack, \"ErrCleanStack\"},\n\t\t{ErrNullFail, \"ErrNullFail\"},\n\t\t{ErrDiscourageUpgradableNOPs, \"ErrDiscourageUpgradableNOPs\"},\n\t\t{ErrNegativeLockTime, \"ErrNegativeLockTime\"},\n\t\t{ErrUnsatisfiedLockTime, \"ErrUnsatisfiedLockTime\"},\n\t\t{ErrWitnessProgramEmpty, \"ErrWitnessProgramEmpty\"},\n\t\t{ErrWitnessProgramMismatch, \"ErrWitnessProgramMismatch\"},\n\t\t{ErrWitnessProgramWrongLength, \"ErrWitnessProgramWrongLength\"},\n\t\t{ErrWitnessMalleated, \"ErrWitnessMalleated\"},\n\t\t{ErrWitnessMalleatedP2SH, \"ErrWitnessMalleatedP2SH\"},\n\t\t{ErrWitnessUnexpected, \"ErrWitnessUnexpected\"},\n\t\t{ErrMinimalIf, \"ErrMinimalIf\"},\n\t\t{ErrWitnessPubKeyType, \"ErrWitnessPubKeyType\"},\n\t\t{ErrDiscourageOpSuccess, \"ErrDiscourageOpSuccess\"},\n\t\t{ErrDiscourageUpgradeableTaprootVersion, \"ErrDiscourageUpgradeableTaprootVersion\"},\n\t\t{ErrTapscriptCheckMultisig, \"ErrTapscriptCheckMultisig\"},\n\t\t{ErrDiscourageUpgradableWitnessProgram, \"ErrDiscourageUpgradableWitnessProgram\"},\n\t\t{ErrDiscourageUpgradeablePubKeyType, \"ErrDiscourageUpgradeablePubKeyType\"},\n\t\t{ErrTaprootSigInvalid, \"ErrTaprootSigInvalid\"},\n\t\t{ErrTaprootMerkleProofInvalid, \"ErrTaprootMerkleProofInvalid\"},\n\t\t{ErrTaprootOutputKeyParityMismatch, \"ErrTaprootOutputKeyParityMismatch\"},\n\t\t{ErrControlBlockTooSmall, \"ErrControlBlockTooSmall\"},\n\t\t{ErrControlBlockTooLarge, \"ErrControlBlockTooLarge\"},\n\t\t{ErrControlBlockInvalidLength, \"ErrControlBlockInvalidLength\"},\n\t\t{ErrWitnessHasNoAnnex, \"ErrWitnessHasNoAnnex\"},\n\t\t{ErrInvalidTaprootSigLen, \"ErrInvalidTaprootSigLen\"},\n\t\t{ErrTaprootPubkeyIsEmpty, \"ErrTaprootPubkeyIsEmpty\"},\n\t\t{ErrTaprootMaxSigOps, \"ErrTaprootMaxSigOps\"},\n\t\t{ErrNonConstScriptCode, \"ErrNonConstScriptCode\"},\n\t\t{ErrCodeSeparator, \"ErrCodeSeparator\"},\n\t\t{0xffff, \"Unknown ErrorCode (65535)\"},\n\t}\n\n\t// Detect additional error codes that don't have the stringer added.\n\tif len(tests)-1 != int(numErrorCodes) {\n\t\tt.Errorf(\"It appears an error code was added without adding an \" +\n\t\t\t\"associated stringer test\")\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.String()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"String #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestError tests the error output for the Error type.\nfunc TestError(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tin   Error\n\t\twant string\n\t}{\n\t\t{\n\t\t\tError{Description: \"some error\"},\n\t\t\t\"some error\",\n\t\t},\n\t\t{\n\t\t\tError{Description: \"human-readable error\"},\n\t\t\t\"human-readable error\",\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.Error()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"Error #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "txscript/example_test.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Copyright (c) 2015-2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript_test\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/txscript\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// This example demonstrates creating a script which pays to a bitcoin address.\n// It also prints the created script hex and uses the DisasmString function to\n// display the disassembled script.\nfunc ExamplePayToAddrScript() {\n\t// Parse the address to send the coins to into a btcutil.Address\n\t// which is useful to ensure the accuracy of the address and determine\n\t// the address type.  It is also required for the upcoming call to\n\t// PayToAddrScript.\n\taddressStr := \"12gpXQVcCL2qhTNQgyLVdCFG2Qs2px98nV\"\n\taddress, err := btcutil.DecodeAddress(addressStr, &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Create a public key script that pays to the address.\n\tscript, err := txscript.PayToAddrScript(address)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Printf(\"Script Hex: %x\\n\", script)\n\n\tdisasm, err := txscript.DisasmString(script)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Println(\"Script Disassembly:\", disasm)\n\n\t// Output:\n\t// Script Hex: 76a914128004ff2fcaf13b2b91eb654b1dc2b674f7ec6188ac\n\t// Script Disassembly: OP_DUP OP_HASH160 128004ff2fcaf13b2b91eb654b1dc2b674f7ec61 OP_EQUALVERIFY OP_CHECKSIG\n}\n\n// This example demonstrates extracting information from a standard public key\n// script.\nfunc ExampleExtractPkScriptAddrs() {\n\t// Start with a standard pay-to-pubkey-hash script.\n\tscriptHex := \"76a914128004ff2fcaf13b2b91eb654b1dc2b674f7ec6188ac\"\n\tscript, err := hex.DecodeString(scriptHex)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// Extract and print details from the script.\n\tscriptClass, addresses, reqSigs, err := txscript.ExtractPkScriptAddrs(\n\t\tscript, &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Println(\"Script Class:\", scriptClass)\n\tfmt.Println(\"Addresses:\", addresses)\n\tfmt.Println(\"Required Signatures:\", reqSigs)\n\n\t// Output:\n\t// Script Class: pubkeyhash\n\t// Addresses: [12gpXQVcCL2qhTNQgyLVdCFG2Qs2px98nV]\n\t// Required Signatures: 1\n}\n\n// This example demonstrates manually creating and signing a redeem transaction.\nfunc ExampleSignTxOutput() {\n\t// Ordinarily the private key would come from whatever storage mechanism\n\t// is being used, but for this example just hard code it.\n\tprivKeyBytes, err := hex.DecodeString(\"22a47fa09a223f2aa079edf85a7c2\" +\n\t\t\"d4f8720ee63e502ee2869afab7de234b80c\")\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tprivKey, pubKey := btcec.PrivKeyFromBytes(privKeyBytes)\n\tpubKeyHash := btcutil.Hash160(pubKey.SerializeCompressed())\n\taddr, err := btcutil.NewAddressPubKeyHash(pubKeyHash,\n\t\t&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// For this example, create a fake transaction that represents what\n\t// would ordinarily be the real transaction that is being spent.  It\n\t// contains a single output that pays to address in the amount of 1 BTC.\n\toriginTx := wire.NewMsgTx(wire.TxVersion)\n\tprevOut := wire.NewOutPoint(&chainhash.Hash{}, ^uint32(0))\n\ttxIn := wire.NewTxIn(prevOut, []byte{txscript.OP_0, txscript.OP_0}, nil)\n\toriginTx.AddTxIn(txIn)\n\tpkScript, err := txscript.PayToAddrScript(addr)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\ttxOut := wire.NewTxOut(100000000, pkScript)\n\toriginTx.AddTxOut(txOut)\n\toriginTxHash := originTx.TxHash()\n\n\t// Create the transaction to redeem the fake transaction.\n\tredeemTx := wire.NewMsgTx(wire.TxVersion)\n\n\t// Add the input(s) the redeeming transaction will spend.  There is no\n\t// signature script at this point since it hasn't been created or signed\n\t// yet, hence nil is provided for it.\n\tprevOut = wire.NewOutPoint(&originTxHash, 0)\n\ttxIn = wire.NewTxIn(prevOut, nil, nil)\n\tredeemTx.AddTxIn(txIn)\n\n\t// Ordinarily this would contain that actual destination of the funds,\n\t// but for this example don't bother.\n\ttxOut = wire.NewTxOut(0, nil)\n\tredeemTx.AddTxOut(txOut)\n\n\t// Sign the redeeming transaction.\n\tlookupKey := func(a btcutil.Address) (*btcec.PrivateKey, bool, error) {\n\t\t// Ordinarily this function would involve looking up the private\n\t\t// key for the provided address, but since the only thing being\n\t\t// signed in this example uses the address associated with the\n\t\t// private key from above, simply return it with the compressed\n\t\t// flag set since the address is using the associated compressed\n\t\t// public key.\n\t\t//\n\t\t// NOTE: If you want to prove the code is actually signing the\n\t\t// transaction properly, uncomment the following line which\n\t\t// intentionally returns an invalid key to sign with, which in\n\t\t// turn will result in a failure during the script execution\n\t\t// when verifying the signature.\n\t\t//\n\t\t// privKey.D.SetInt64(12345)\n\t\t//\n\t\treturn privKey, true, nil\n\t}\n\t// Notice that the script database parameter is nil here since it isn't\n\t// used.  It must be specified when pay-to-script-hash transactions are\n\t// being signed.\n\tsigScript, err := txscript.SignTxOutput(&chaincfg.MainNetParams,\n\t\tredeemTx, 0, originTx.TxOut[0].PkScript, txscript.SigHashAll,\n\t\ttxscript.KeyClosure(lookupKey), nil, nil)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tredeemTx.TxIn[0].SignatureScript = sigScript\n\n\t// Prove that the transaction has been validly signed by executing the\n\t// script pair.\n\tflags := txscript.ScriptBip16 | txscript.ScriptVerifyDERSignatures |\n\t\ttxscript.ScriptStrictMultiSig |\n\t\ttxscript.ScriptDiscourageUpgradableNops\n\tvm, err := txscript.NewEngine(originTx.TxOut[0].PkScript, redeemTx, 0,\n\t\tflags, nil, nil, -1, nil)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tif err := vm.Execute(); err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Println(\"Transaction successfully signed\")\n\n\t// Output:\n\t// Transaction successfully signed\n}\n\n// This example demonstrates creating a script tokenizer instance and using it\n// to count the number of opcodes a script contains.\nfunc ExampleScriptTokenizer() {\n\t// Create a script to use in the example.  Ordinarily this would come from\n\t// some other source.\n\thash160 := btcutil.Hash160([]byte(\"example\"))\n\tscript, err := txscript.NewScriptBuilder().AddOp(txscript.OP_DUP).\n\t\tAddOp(txscript.OP_HASH160).AddData(hash160).\n\t\tAddOp(txscript.OP_EQUALVERIFY).AddOp(txscript.OP_CHECKSIG).Script()\n\tif err != nil {\n\t\tfmt.Printf(\"failed to build script: %v\\n\", err)\n\t\treturn\n\t}\n\n\t// Create a tokenizer to iterate the script and count the number of opcodes.\n\tconst scriptVersion = 0\n\tvar numOpcodes int\n\ttokenizer := txscript.MakeScriptTokenizer(scriptVersion, script)\n\tfor tokenizer.Next() {\n\t\tnumOpcodes++\n\t}\n\tif tokenizer.Err() != nil {\n\t\tfmt.Printf(\"script failed to parse: %v\\n\", err)\n\t} else {\n\t\tfmt.Printf(\"script contains %d opcode(s)\\n\", numOpcodes)\n\t}\n\n\t// Output:\n\t// script contains 5 opcode(s)\n}\n"
  },
  {
    "path": "txscript/hashcache.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"maps\"\n\t\"math\"\n\t\"sync\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// calcHashPrevOuts calculates a single hash of all the previous outputs\n// (txid:index) referenced within the passed transaction. This calculated hash\n// can be re-used when validating all inputs spending segwit outputs, with a\n// signature hash type of SigHashAll. This allows validation to re-use previous\n// hashing computation, reducing the complexity of validating SigHashAll inputs\n// from  O(N^2) to O(N).\nfunc calcHashPrevOuts(tx *wire.MsgTx) chainhash.Hash {\n\tvar b bytes.Buffer\n\tfor _, in := range tx.TxIn {\n\t\t// First write out the 32-byte transaction ID one of whose\n\t\t// outputs are being referenced by this input.\n\t\tb.Write(in.PreviousOutPoint.Hash[:])\n\n\t\t// Next, we'll encode the index of the referenced output as a\n\t\t// little endian integer.\n\t\tvar buf [4]byte\n\t\tbinary.LittleEndian.PutUint32(buf[:], in.PreviousOutPoint.Index)\n\t\tb.Write(buf[:])\n\t}\n\n\treturn chainhash.HashH(b.Bytes())\n}\n\n// calcHashSequence computes an aggregated hash of each of the sequence numbers\n// within the inputs of the passed transaction. This single hash can be re-used\n// when validating all inputs spending segwit outputs, which include signatures\n// using the SigHashAll sighash type. This allows validation to re-use previous\n// hashing computation, reducing the complexity of validating SigHashAll inputs\n// from O(N^2) to O(N).\nfunc calcHashSequence(tx *wire.MsgTx) chainhash.Hash {\n\tvar b bytes.Buffer\n\tfor _, in := range tx.TxIn {\n\t\tvar buf [4]byte\n\t\tbinary.LittleEndian.PutUint32(buf[:], in.Sequence)\n\t\tb.Write(buf[:])\n\t}\n\n\treturn chainhash.HashH(b.Bytes())\n}\n\n// calcHashOutputs computes a hash digest of all outputs created by the\n// transaction encoded using the wire format. This single hash can be re-used\n// when validating all inputs spending witness programs, which include\n// signatures using the SigHashAll sighash type. This allows computation to be\n// cached, reducing the total hashing complexity from O(N^2) to O(N).\nfunc calcHashOutputs(tx *wire.MsgTx) chainhash.Hash {\n\tvar b bytes.Buffer\n\tfor _, out := range tx.TxOut {\n\t\twire.WriteTxOut(&b, 0, 0, out)\n\t}\n\n\treturn chainhash.HashH(b.Bytes())\n}\n\n// PrevOutputFetcher is an interface used to supply the sighash cache with the\n// previous output information needed to calculate the pre-computed sighash\n// midstate for taproot transactions.\ntype PrevOutputFetcher interface {\n\t// FetchPrevOutput attempts to fetch the previous output referenced by\n\t// the passed outpoint. A nil value will be returned if the passed\n\t// outpoint doesn't exist.\n\tFetchPrevOutput(wire.OutPoint) *wire.TxOut\n}\n\n// CannedPrevOutputFetcher is an implementation of PrevOutputFetcher that only\n// is able to return information for a single previous output.\ntype CannedPrevOutputFetcher struct {\n\tpkScript []byte\n\tamt      int64\n}\n\n// NewCannedPrevOutputFetcher returns an instance of a CannedPrevOutputFetcher\n// that can only return the TxOut defined by the passed script and amount.\nfunc NewCannedPrevOutputFetcher(script []byte, amt int64) *CannedPrevOutputFetcher {\n\treturn &CannedPrevOutputFetcher{\n\t\tpkScript: script,\n\t\tamt:      amt,\n\t}\n}\n\n// FetchPrevOutput attempts to fetch the previous output referenced by the\n// passed outpoint.\n//\n// NOTE: This is a part of the PrevOutputFetcher interface.\nfunc (c *CannedPrevOutputFetcher) FetchPrevOutput(wire.OutPoint) *wire.TxOut {\n\treturn &wire.TxOut{\n\t\tPkScript: c.pkScript,\n\t\tValue:    c.amt,\n\t}\n}\n\n// A compile-time assertion to ensure that CannedPrevOutputFetcher matches the\n// PrevOutputFetcher interface.\nvar _ PrevOutputFetcher = (*CannedPrevOutputFetcher)(nil)\n\n// MultiPrevOutFetcher is a custom implementation of the PrevOutputFetcher\n// backed by a key-value map of prevouts to outputs.\ntype MultiPrevOutFetcher struct {\n\tprevOuts map[wire.OutPoint]*wire.TxOut\n}\n\n// NewMultiPrevOutFetcher returns an instance of a PrevOutputFetcher that's\n// backed by an optional map which is used as an input source. The\nfunc NewMultiPrevOutFetcher(prevOuts map[wire.OutPoint]*wire.TxOut) *MultiPrevOutFetcher {\n\tif prevOuts == nil {\n\t\tprevOuts = make(map[wire.OutPoint]*wire.TxOut)\n\t}\n\n\treturn &MultiPrevOutFetcher{\n\t\tprevOuts: prevOuts,\n\t}\n}\n\n// FetchPrevOutput attempts to fetch the previous output referenced by the\n// passed outpoint.\n//\n// NOTE: This is a part of the CannedPrevOutputFetcher interface.\nfunc (m *MultiPrevOutFetcher) FetchPrevOutput(op wire.OutPoint) *wire.TxOut {\n\treturn m.prevOuts[op]\n}\n\n// AddPrevOut adds a new prev out, tx out pair to the backing map.\nfunc (m *MultiPrevOutFetcher) AddPrevOut(op wire.OutPoint, txOut *wire.TxOut) {\n\tm.prevOuts[op] = txOut\n}\n\n// Merge merges two instances of a MultiPrevOutFetcher into a single source.\nfunc (m *MultiPrevOutFetcher) Merge(other *MultiPrevOutFetcher) {\n\tmaps.Copy(m.prevOuts, other.prevOuts)\n}\n\n// A compile-time assertion to ensure that MultiPrevOutFetcher matches the\n// PrevOutputFetcher interface.\nvar _ PrevOutputFetcher = (*MultiPrevOutFetcher)(nil)\n\n// calcHashInputAmounts computes a hash digest of the input amounts of all\n// inputs referenced in the passed transaction. This hash pre computation is only\n// used for validating taproot inputs.\nfunc calcHashInputAmounts(tx *wire.MsgTx, inputFetcher PrevOutputFetcher) chainhash.Hash {\n\tvar b bytes.Buffer\n\tfor _, txIn := range tx.TxIn {\n\t\tprevOut := inputFetcher.FetchPrevOutput(txIn.PreviousOutPoint)\n\n\t\t_ = binary.Write(&b, binary.LittleEndian, prevOut.Value)\n\t}\n\n\treturn chainhash.HashH(b.Bytes())\n}\n\n// calcHashInputAmts computes the hash digest of all the previous input scripts\n// referenced by the passed transaction. This hash pre computation is only used\n// for validating taproot inputs.\nfunc calcHashInputScripts(tx *wire.MsgTx, inputFetcher PrevOutputFetcher) chainhash.Hash {\n\tvar b bytes.Buffer\n\tfor _, txIn := range tx.TxIn {\n\t\tprevOut := inputFetcher.FetchPrevOutput(txIn.PreviousOutPoint)\n\n\t\t_ = wire.WriteVarBytes(&b, 0, prevOut.PkScript)\n\t}\n\n\treturn chainhash.HashH(b.Bytes())\n}\n\n// SegwitSigHashMidstate is the sighash midstate used in the base segwit\n// sighash calculation as defined in BIP 143.\ntype SegwitSigHashMidstate struct {\n\tHashPrevOutsV0 chainhash.Hash\n\tHashSequenceV0 chainhash.Hash\n\tHashOutputsV0  chainhash.Hash\n}\n\n// TaprootSigHashMidState is the sighash midstate used to compute taproot and\n// tapscript signatures as defined in BIP 341.\ntype TaprootSigHashMidState struct {\n\tHashPrevOutsV1     chainhash.Hash\n\tHashSequenceV1     chainhash.Hash\n\tHashOutputsV1      chainhash.Hash\n\tHashInputScriptsV1 chainhash.Hash\n\tHashInputAmountsV1 chainhash.Hash\n}\n\n// TxSigHashes houses the partial set of sighashes introduced within BIP0143.\n// This partial set of sighashes may be re-used within each input across a\n// transaction when validating all inputs. As a result, validation complexity\n// for SigHashAll can be reduced by a polynomial factor.\ntype TxSigHashes struct {\n\tSegwitSigHashMidstate\n\n\tTaprootSigHashMidState\n}\n\n// NewTxSigHashes computes, and returns the cached sighashes of the given\n// transaction.\nfunc NewTxSigHashes(tx *wire.MsgTx,\n\tinputFetcher PrevOutputFetcher) *TxSigHashes {\n\n\tvar (\n\t\tsigHashes TxSigHashes\n\t\tzeroHash  chainhash.Hash\n\t)\n\n\t// Base segwit (witness version v0), and taproot (witness version v1)\n\t// differ in how the set of pre-computed cached sighash midstate is\n\t// computed. For taproot, the prevouts, sequence, and outputs are\n\t// computed as normal, but a single sha256 hash invocation is used. In\n\t// addition, the hashes of all the previous input amounts and scripts\n\t// are included as well.\n\t//\n\t// Based on the above distinction, we'll run through all the referenced\n\t// inputs to determine what we need to compute.\n\tvar hasV0Inputs, hasV1Inputs bool\n\tfor _, txIn := range tx.TxIn {\n\t\t// If this is a coinbase input, then we know that we only need\n\t\t// the v0 midstate (though it won't be used) in this instance.\n\t\toutpoint := txIn.PreviousOutPoint\n\t\tif outpoint.Index == math.MaxUint32 && outpoint.Hash == zeroHash {\n\t\t\thasV0Inputs = true\n\t\t\tcontinue\n\t\t}\n\n\t\tprevOut := inputFetcher.FetchPrevOutput(outpoint)\n\n\t\t// If this is spending a script that looks like a taproot output,\n\t\t// then we'll need to pre-compute the extra taproot data.\n\t\tif IsPayToTaproot(prevOut.PkScript) {\n\t\t\thasV1Inputs = true\n\t\t} else {\n\t\t\t// Otherwise, we'll assume we need the v0 sighash midstate.\n\t\t\thasV0Inputs = true\n\t\t}\n\n\t\t// If the transaction has _both_ v0 and v1 inputs, then we can stop\n\t\t// here.\n\t\tif hasV0Inputs && hasV1Inputs {\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// Now that we know which cached midstate we need to calculate, we can\n\t// go ahead and do so.\n\t//\n\t// First, we can calculate the information that both segwit v0 and v1\n\t// need: the prevout, sequence and output hashes. For v1 the only\n\t// difference is that this is a single instead of a double hash.\n\t//\n\t// Both v0 and v1 share this base data computed using a sha256 single\n\t// hash.\n\tsigHashes.HashPrevOutsV1 = calcHashPrevOuts(tx)\n\tsigHashes.HashSequenceV1 = calcHashSequence(tx)\n\tsigHashes.HashOutputsV1 = calcHashOutputs(tx)\n\n\t// The v0 data is the same as the v1 (newer data) but it uses a double\n\t// hash instead.\n\tif hasV0Inputs {\n\t\tsigHashes.HashPrevOutsV0 = chainhash.HashH(\n\t\t\tsigHashes.HashPrevOutsV1[:],\n\t\t)\n\t\tsigHashes.HashSequenceV0 = chainhash.HashH(\n\t\t\tsigHashes.HashSequenceV1[:],\n\t\t)\n\t\tsigHashes.HashOutputsV0 = chainhash.HashH(\n\t\t\tsigHashes.HashOutputsV1[:],\n\t\t)\n\t}\n\n\t// Finally, we'll compute the taproot specific data if needed.\n\tif hasV1Inputs {\n\t\tsigHashes.HashInputAmountsV1 = calcHashInputAmounts(\n\t\t\ttx, inputFetcher,\n\t\t)\n\t\tsigHashes.HashInputScriptsV1 = calcHashInputScripts(\n\t\t\ttx, inputFetcher,\n\t\t)\n\t}\n\n\treturn &sigHashes\n}\n\n// HashCache houses a set of partial sighashes keyed by txid. The set of partial\n// sighashes are those introduced within BIP0143 by the new more efficient\n// sighash digest calculation algorithm. Using this threadsafe shared cache,\n// multiple goroutines can safely re-use the pre-computed partial sighashes\n// speeding up validation time amongst all inputs found within a block.\ntype HashCache struct {\n\tsigHashes map[chainhash.Hash]*TxSigHashes\n\n\tsync.RWMutex\n}\n\n// NewHashCache returns a new instance of the HashCache given a maximum number\n// of entries which may exist within it at anytime.\nfunc NewHashCache(maxSize uint) *HashCache {\n\treturn &HashCache{\n\t\tsigHashes: make(map[chainhash.Hash]*TxSigHashes, maxSize),\n\t}\n}\n\n// AddSigHashes computes, then adds the partial sighashes for the passed\n// transaction.\nfunc (h *HashCache) AddSigHashes(tx *wire.MsgTx,\n\tinputFetcher PrevOutputFetcher) {\n\n\th.Lock()\n\th.sigHashes[tx.TxHash()] = NewTxSigHashes(tx, inputFetcher)\n\th.Unlock()\n}\n\n// ContainsHashes returns true if the partial sighashes for the passed\n// transaction currently exist within the HashCache, and false otherwise.\nfunc (h *HashCache) ContainsHashes(txid *chainhash.Hash) bool {\n\th.RLock()\n\t_, found := h.sigHashes[*txid]\n\th.RUnlock()\n\n\treturn found\n}\n\n// GetSigHashes possibly returns the previously cached partial sighashes for\n// the passed transaction. This function also returns an additional boolean\n// value indicating if the sighashes for the passed transaction were found to\n// be present within the HashCache.\nfunc (h *HashCache) GetSigHashes(txid *chainhash.Hash) (*TxSigHashes, bool) {\n\th.RLock()\n\titem, found := h.sigHashes[*txid]\n\th.RUnlock()\n\n\treturn item, found\n}\n\n// PurgeSigHashes removes all partial sighashes from the HashCache belonging to\n// the passed transaction.\nfunc (h *HashCache) PurgeSigHashes(txid *chainhash.Hash) {\n\th.Lock()\n\tdelete(h.sigHashes, *txid)\n\th.Unlock()\n}\n"
  },
  {
    "path": "txscript/hashcache_test.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"math/rand\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\nfunc init() {\n\trand.Seed(time.Now().Unix())\n}\n\n// genTestTx creates a random transaction for uses within test cases.\nfunc genTestTx() (*wire.MsgTx, *MultiPrevOutFetcher, error) {\n\ttx := wire.NewMsgTx(2)\n\ttx.Version = rand.Int31()\n\n\tprevOuts := NewMultiPrevOutFetcher(nil)\n\n\tnumTxins := 1 + rand.Intn(11)\n\tfor i := 0; i < numTxins; i++ {\n\t\trandTxIn := wire.TxIn{\n\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\tIndex: uint32(rand.Int31()),\n\t\t\t},\n\t\t\tSequence: uint32(rand.Int31()),\n\t\t}\n\t\t_, err := rand.Read(randTxIn.PreviousOutPoint.Hash[:])\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\ttx.TxIn = append(tx.TxIn, &randTxIn)\n\n\t\tprevOuts.AddPrevOut(\n\t\t\trandTxIn.PreviousOutPoint, &wire.TxOut{},\n\t\t)\n\t}\n\n\tnumTxouts := 1 + rand.Intn(11)\n\tfor i := 0; i < numTxouts; i++ {\n\t\trandTxOut := wire.TxOut{\n\t\t\tValue:    rand.Int63(),\n\t\t\tPkScript: make([]byte, rand.Intn(30)),\n\t\t}\n\t\tif _, err := rand.Read(randTxOut.PkScript); err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t\ttx.TxOut = append(tx.TxOut, &randTxOut)\n\t}\n\n\treturn tx, prevOuts, nil\n}\n\n// TestHashCacheAddContainsHashes tests that after items have been added to the\n// hash cache, the ContainsHashes method returns true for all the items\n// inserted.  Conversely, ContainsHashes should return false for any items\n// _not_ in the hash cache.\nfunc TestHashCacheAddContainsHashes(t *testing.T) {\n\tt.Parallel()\n\n\tcache := NewHashCache(10)\n\n\tvar (\n\t\terr          error\n\t\trandPrevOuts *MultiPrevOutFetcher\n\t)\n\tprevOuts := NewMultiPrevOutFetcher(nil)\n\n\t// First, we'll generate 10 random transactions for use within our\n\t// tests.\n\tconst numTxns = 10\n\ttxns := make([]*wire.MsgTx, numTxns)\n\tfor i := 0; i < numTxns; i++ {\n\t\ttxns[i], randPrevOuts, err = genTestTx()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to generate test tx: %v\", err)\n\t\t}\n\n\t\tprevOuts.Merge(randPrevOuts)\n\t}\n\n\t// With the transactions generated, we'll add each of them to the hash\n\t// cache.\n\tfor _, tx := range txns {\n\t\tcache.AddSigHashes(tx, prevOuts)\n\t}\n\n\t// Next, we'll ensure that each of the transactions inserted into the\n\t// cache are properly located by the ContainsHashes method.\n\tfor _, tx := range txns {\n\t\ttxid := tx.TxHash()\n\t\tif ok := cache.ContainsHashes(&txid); !ok {\n\t\t\tt.Fatalf(\"txid %v not found in cache but should be: \",\n\t\t\t\ttxid)\n\t\t}\n\t}\n\n\trandTx, _, err := genTestTx()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate tx: %v\", err)\n\t}\n\n\t// Finally, we'll assert that a transaction that wasn't added to the\n\t// cache won't be reported as being present by the ContainsHashes\n\t// method.\n\trandTxid := randTx.TxHash()\n\tif ok := cache.ContainsHashes(&randTxid); ok {\n\t\tt.Fatalf(\"txid %v wasn't inserted into cache but was found\",\n\t\t\trandTxid)\n\t}\n}\n\n// TestHashCacheAddGet tests that the sighashes for a particular transaction\n// are properly retrieved by the GetSigHashes function.\nfunc TestHashCacheAddGet(t *testing.T) {\n\tt.Parallel()\n\n\tcache := NewHashCache(10)\n\n\t// To start, we'll generate a random transaction and compute the set of\n\t// sighashes for the transaction.\n\trandTx, prevOuts, err := genTestTx()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate tx: %v\", err)\n\t}\n\tsigHashes := NewTxSigHashes(randTx, prevOuts)\n\n\t// Next, add the transaction to the hash cache.\n\tcache.AddSigHashes(randTx, prevOuts)\n\n\t// The transaction inserted into the cache above should be found.\n\ttxid := randTx.TxHash()\n\tcacheHashes, ok := cache.GetSigHashes(&txid)\n\tif !ok {\n\t\tt.Fatalf(\"tx %v wasn't found in cache\", txid)\n\t}\n\n\t// Finally, the sighashes retrieved should exactly match the sighash\n\t// originally inserted into the cache.\n\tif *sigHashes != *cacheHashes {\n\t\tt.Fatalf(\"sighashes don't match: expected %v, got %v\",\n\t\t\tspew.Sdump(sigHashes), spew.Sdump(cacheHashes))\n\t}\n}\n\n// TestHashCachePurge tests that items are able to be properly removed from the\n// hash cache.\nfunc TestHashCachePurge(t *testing.T) {\n\tt.Parallel()\n\n\tcache := NewHashCache(10)\n\n\tvar (\n\t\terr          error\n\t\trandPrevOuts *MultiPrevOutFetcher\n\t)\n\tprevOuts := NewMultiPrevOutFetcher(nil)\n\n\t// First we'll start by inserting numTxns transactions into the hash cache.\n\tconst numTxns = 10\n\ttxns := make([]*wire.MsgTx, numTxns)\n\tfor i := 0; i < numTxns; i++ {\n\t\ttxns[i], randPrevOuts, err = genTestTx()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to generate test tx: %v\", err)\n\t\t}\n\n\t\tprevOuts.Merge(randPrevOuts)\n\t}\n\tfor _, tx := range txns {\n\t\tcache.AddSigHashes(tx, prevOuts)\n\t}\n\n\t// Once all the transactions have been inserted, we'll purge them from\n\t// the hash cache.\n\tfor _, tx := range txns {\n\t\ttxid := tx.TxHash()\n\t\tcache.PurgeSigHashes(&txid)\n\t}\n\n\t// At this point, none of the transactions inserted into the hash cache\n\t// should be found within the cache.\n\tfor _, tx := range txns {\n\t\ttxid := tx.TxHash()\n\t\tif ok := cache.ContainsHashes(&txid); ok {\n\t\t\tt.Fatalf(\"tx %v found in cache but should have \"+\n\t\t\t\t\"been purged: \", txid)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "txscript/log.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"github.com/btcsuite/btclog\"\n)\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until UseLogger is called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n\n// LogClosure is a closure that can be printed with %v to be used to\n// generate expensive-to-create data for a detailed log level and avoid doing\n// the work if the data isn't printed.\ntype logClosure func() string\n\nfunc (c logClosure) String() string {\n\treturn c()\n}\n\nfunc newLogClosure(c func() string) logClosure {\n\treturn logClosure(c)\n}\n"
  },
  {
    "path": "txscript/opcode.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha1\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash\"\n\t\"strings\"\n\n\t\"golang.org/x/crypto/ripemd160\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/ecdsa\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// An opcode defines the information related to a txscript opcode.  opfunc, if\n// present, is the function to call to perform the opcode on the script.  The\n// current script is passed in as a slice with the first member being the opcode\n// itself.\ntype opcode struct {\n\tvalue  byte\n\tname   string\n\tlength int\n\topfunc func(*opcode, []byte, *Engine) error\n}\n\n// These constants are the values of the official opcodes used on the btc wiki,\n// in bitcoin core and in most if not all other references and software related\n// to handling BTC scripts.\nconst (\n\tOP_0                   = 0x00 // 0\n\tOP_FALSE               = 0x00 // 0 - AKA OP_0\n\tOP_DATA_1              = 0x01 // 1\n\tOP_DATA_2              = 0x02 // 2\n\tOP_DATA_3              = 0x03 // 3\n\tOP_DATA_4              = 0x04 // 4\n\tOP_DATA_5              = 0x05 // 5\n\tOP_DATA_6              = 0x06 // 6\n\tOP_DATA_7              = 0x07 // 7\n\tOP_DATA_8              = 0x08 // 8\n\tOP_DATA_9              = 0x09 // 9\n\tOP_DATA_10             = 0x0a // 10\n\tOP_DATA_11             = 0x0b // 11\n\tOP_DATA_12             = 0x0c // 12\n\tOP_DATA_13             = 0x0d // 13\n\tOP_DATA_14             = 0x0e // 14\n\tOP_DATA_15             = 0x0f // 15\n\tOP_DATA_16             = 0x10 // 16\n\tOP_DATA_17             = 0x11 // 17\n\tOP_DATA_18             = 0x12 // 18\n\tOP_DATA_19             = 0x13 // 19\n\tOP_DATA_20             = 0x14 // 20\n\tOP_DATA_21             = 0x15 // 21\n\tOP_DATA_22             = 0x16 // 22\n\tOP_DATA_23             = 0x17 // 23\n\tOP_DATA_24             = 0x18 // 24\n\tOP_DATA_25             = 0x19 // 25\n\tOP_DATA_26             = 0x1a // 26\n\tOP_DATA_27             = 0x1b // 27\n\tOP_DATA_28             = 0x1c // 28\n\tOP_DATA_29             = 0x1d // 29\n\tOP_DATA_30             = 0x1e // 30\n\tOP_DATA_31             = 0x1f // 31\n\tOP_DATA_32             = 0x20 // 32\n\tOP_DATA_33             = 0x21 // 33\n\tOP_DATA_34             = 0x22 // 34\n\tOP_DATA_35             = 0x23 // 35\n\tOP_DATA_36             = 0x24 // 36\n\tOP_DATA_37             = 0x25 // 37\n\tOP_DATA_38             = 0x26 // 38\n\tOP_DATA_39             = 0x27 // 39\n\tOP_DATA_40             = 0x28 // 40\n\tOP_DATA_41             = 0x29 // 41\n\tOP_DATA_42             = 0x2a // 42\n\tOP_DATA_43             = 0x2b // 43\n\tOP_DATA_44             = 0x2c // 44\n\tOP_DATA_45             = 0x2d // 45\n\tOP_DATA_46             = 0x2e // 46\n\tOP_DATA_47             = 0x2f // 47\n\tOP_DATA_48             = 0x30 // 48\n\tOP_DATA_49             = 0x31 // 49\n\tOP_DATA_50             = 0x32 // 50\n\tOP_DATA_51             = 0x33 // 51\n\tOP_DATA_52             = 0x34 // 52\n\tOP_DATA_53             = 0x35 // 53\n\tOP_DATA_54             = 0x36 // 54\n\tOP_DATA_55             = 0x37 // 55\n\tOP_DATA_56             = 0x38 // 56\n\tOP_DATA_57             = 0x39 // 57\n\tOP_DATA_58             = 0x3a // 58\n\tOP_DATA_59             = 0x3b // 59\n\tOP_DATA_60             = 0x3c // 60\n\tOP_DATA_61             = 0x3d // 61\n\tOP_DATA_62             = 0x3e // 62\n\tOP_DATA_63             = 0x3f // 63\n\tOP_DATA_64             = 0x40 // 64\n\tOP_DATA_65             = 0x41 // 65\n\tOP_DATA_66             = 0x42 // 66\n\tOP_DATA_67             = 0x43 // 67\n\tOP_DATA_68             = 0x44 // 68\n\tOP_DATA_69             = 0x45 // 69\n\tOP_DATA_70             = 0x46 // 70\n\tOP_DATA_71             = 0x47 // 71\n\tOP_DATA_72             = 0x48 // 72\n\tOP_DATA_73             = 0x49 // 73\n\tOP_DATA_74             = 0x4a // 74\n\tOP_DATA_75             = 0x4b // 75\n\tOP_PUSHDATA1           = 0x4c // 76\n\tOP_PUSHDATA2           = 0x4d // 77\n\tOP_PUSHDATA4           = 0x4e // 78\n\tOP_1NEGATE             = 0x4f // 79\n\tOP_RESERVED            = 0x50 // 80\n\tOP_1                   = 0x51 // 81 - AKA OP_TRUE\n\tOP_TRUE                = 0x51 // 81\n\tOP_2                   = 0x52 // 82\n\tOP_3                   = 0x53 // 83\n\tOP_4                   = 0x54 // 84\n\tOP_5                   = 0x55 // 85\n\tOP_6                   = 0x56 // 86\n\tOP_7                   = 0x57 // 87\n\tOP_8                   = 0x58 // 88\n\tOP_9                   = 0x59 // 89\n\tOP_10                  = 0x5a // 90\n\tOP_11                  = 0x5b // 91\n\tOP_12                  = 0x5c // 92\n\tOP_13                  = 0x5d // 93\n\tOP_14                  = 0x5e // 94\n\tOP_15                  = 0x5f // 95\n\tOP_16                  = 0x60 // 96\n\tOP_NOP                 = 0x61 // 97\n\tOP_VER                 = 0x62 // 98\n\tOP_IF                  = 0x63 // 99\n\tOP_NOTIF               = 0x64 // 100\n\tOP_VERIF               = 0x65 // 101\n\tOP_VERNOTIF            = 0x66 // 102\n\tOP_ELSE                = 0x67 // 103\n\tOP_ENDIF               = 0x68 // 104\n\tOP_VERIFY              = 0x69 // 105\n\tOP_RETURN              = 0x6a // 106\n\tOP_TOALTSTACK          = 0x6b // 107\n\tOP_FROMALTSTACK        = 0x6c // 108\n\tOP_2DROP               = 0x6d // 109\n\tOP_2DUP                = 0x6e // 110\n\tOP_3DUP                = 0x6f // 111\n\tOP_2OVER               = 0x70 // 112\n\tOP_2ROT                = 0x71 // 113\n\tOP_2SWAP               = 0x72 // 114\n\tOP_IFDUP               = 0x73 // 115\n\tOP_DEPTH               = 0x74 // 116\n\tOP_DROP                = 0x75 // 117\n\tOP_DUP                 = 0x76 // 118\n\tOP_NIP                 = 0x77 // 119\n\tOP_OVER                = 0x78 // 120\n\tOP_PICK                = 0x79 // 121\n\tOP_ROLL                = 0x7a // 122\n\tOP_ROT                 = 0x7b // 123\n\tOP_SWAP                = 0x7c // 124\n\tOP_TUCK                = 0x7d // 125\n\tOP_CAT                 = 0x7e // 126\n\tOP_SUBSTR              = 0x7f // 127\n\tOP_LEFT                = 0x80 // 128\n\tOP_RIGHT               = 0x81 // 129\n\tOP_SIZE                = 0x82 // 130\n\tOP_INVERT              = 0x83 // 131\n\tOP_AND                 = 0x84 // 132\n\tOP_OR                  = 0x85 // 133\n\tOP_XOR                 = 0x86 // 134\n\tOP_EQUAL               = 0x87 // 135\n\tOP_EQUALVERIFY         = 0x88 // 136\n\tOP_RESERVED1           = 0x89 // 137\n\tOP_RESERVED2           = 0x8a // 138\n\tOP_1ADD                = 0x8b // 139\n\tOP_1SUB                = 0x8c // 140\n\tOP_2MUL                = 0x8d // 141\n\tOP_2DIV                = 0x8e // 142\n\tOP_NEGATE              = 0x8f // 143\n\tOP_ABS                 = 0x90 // 144\n\tOP_NOT                 = 0x91 // 145\n\tOP_0NOTEQUAL           = 0x92 // 146\n\tOP_ADD                 = 0x93 // 147\n\tOP_SUB                 = 0x94 // 148\n\tOP_MUL                 = 0x95 // 149\n\tOP_DIV                 = 0x96 // 150\n\tOP_MOD                 = 0x97 // 151\n\tOP_LSHIFT              = 0x98 // 152\n\tOP_RSHIFT              = 0x99 // 153\n\tOP_BOOLAND             = 0x9a // 154\n\tOP_BOOLOR              = 0x9b // 155\n\tOP_NUMEQUAL            = 0x9c // 156\n\tOP_NUMEQUALVERIFY      = 0x9d // 157\n\tOP_NUMNOTEQUAL         = 0x9e // 158\n\tOP_LESSTHAN            = 0x9f // 159\n\tOP_GREATERTHAN         = 0xa0 // 160\n\tOP_LESSTHANOREQUAL     = 0xa1 // 161\n\tOP_GREATERTHANOREQUAL  = 0xa2 // 162\n\tOP_MIN                 = 0xa3 // 163\n\tOP_MAX                 = 0xa4 // 164\n\tOP_WITHIN              = 0xa5 // 165\n\tOP_RIPEMD160           = 0xa6 // 166\n\tOP_SHA1                = 0xa7 // 167\n\tOP_SHA256              = 0xa8 // 168\n\tOP_HASH160             = 0xa9 // 169\n\tOP_HASH256             = 0xaa // 170\n\tOP_CODESEPARATOR       = 0xab // 171\n\tOP_CHECKSIG            = 0xac // 172\n\tOP_CHECKSIGVERIFY      = 0xad // 173\n\tOP_CHECKMULTISIG       = 0xae // 174\n\tOP_CHECKMULTISIGVERIFY = 0xaf // 175\n\tOP_NOP1                = 0xb0 // 176\n\tOP_NOP2                = 0xb1 // 177\n\tOP_CHECKLOCKTIMEVERIFY = 0xb1 // 177 - AKA OP_NOP2\n\tOP_NOP3                = 0xb2 // 178\n\tOP_CHECKSEQUENCEVERIFY = 0xb2 // 178 - AKA OP_NOP3\n\tOP_NOP4                = 0xb3 // 179\n\tOP_NOP5                = 0xb4 // 180\n\tOP_NOP6                = 0xb5 // 181\n\tOP_NOP7                = 0xb6 // 182\n\tOP_NOP8                = 0xb7 // 183\n\tOP_NOP9                = 0xb8 // 184\n\tOP_NOP10               = 0xb9 // 185\n\tOP_CHECKSIGADD         = 0xba // 186\n\tOP_UNKNOWN187          = 0xbb // 187\n\tOP_UNKNOWN188          = 0xbc // 188\n\tOP_UNKNOWN189          = 0xbd // 189\n\tOP_UNKNOWN190          = 0xbe // 190\n\tOP_UNKNOWN191          = 0xbf // 191\n\tOP_UNKNOWN192          = 0xc0 // 192\n\tOP_UNKNOWN193          = 0xc1 // 193\n\tOP_UNKNOWN194          = 0xc2 // 194\n\tOP_UNKNOWN195          = 0xc3 // 195\n\tOP_UNKNOWN196          = 0xc4 // 196\n\tOP_UNKNOWN197          = 0xc5 // 197\n\tOP_UNKNOWN198          = 0xc6 // 198\n\tOP_UNKNOWN199          = 0xc7 // 199\n\tOP_UNKNOWN200          = 0xc8 // 200\n\tOP_UNKNOWN201          = 0xc9 // 201\n\tOP_UNKNOWN202          = 0xca // 202\n\tOP_UNKNOWN203          = 0xcb // 203\n\tOP_UNKNOWN204          = 0xcc // 204\n\tOP_UNKNOWN205          = 0xcd // 205\n\tOP_UNKNOWN206          = 0xce // 206\n\tOP_UNKNOWN207          = 0xcf // 207\n\tOP_UNKNOWN208          = 0xd0 // 208\n\tOP_UNKNOWN209          = 0xd1 // 209\n\tOP_UNKNOWN210          = 0xd2 // 210\n\tOP_UNKNOWN211          = 0xd3 // 211\n\tOP_UNKNOWN212          = 0xd4 // 212\n\tOP_UNKNOWN213          = 0xd5 // 213\n\tOP_UNKNOWN214          = 0xd6 // 214\n\tOP_UNKNOWN215          = 0xd7 // 215\n\tOP_UNKNOWN216          = 0xd8 // 216\n\tOP_UNKNOWN217          = 0xd9 // 217\n\tOP_UNKNOWN218          = 0xda // 218\n\tOP_UNKNOWN219          = 0xdb // 219\n\tOP_UNKNOWN220          = 0xdc // 220\n\tOP_UNKNOWN221          = 0xdd // 221\n\tOP_UNKNOWN222          = 0xde // 222\n\tOP_UNKNOWN223          = 0xdf // 223\n\tOP_UNKNOWN224          = 0xe0 // 224\n\tOP_UNKNOWN225          = 0xe1 // 225\n\tOP_UNKNOWN226          = 0xe2 // 226\n\tOP_UNKNOWN227          = 0xe3 // 227\n\tOP_UNKNOWN228          = 0xe4 // 228\n\tOP_UNKNOWN229          = 0xe5 // 229\n\tOP_UNKNOWN230          = 0xe6 // 230\n\tOP_UNKNOWN231          = 0xe7 // 231\n\tOP_UNKNOWN232          = 0xe8 // 232\n\tOP_UNKNOWN233          = 0xe9 // 233\n\tOP_UNKNOWN234          = 0xea // 234\n\tOP_UNKNOWN235          = 0xeb // 235\n\tOP_UNKNOWN236          = 0xec // 236\n\tOP_UNKNOWN237          = 0xed // 237\n\tOP_UNKNOWN238          = 0xee // 238\n\tOP_UNKNOWN239          = 0xef // 239\n\tOP_UNKNOWN240          = 0xf0 // 240\n\tOP_UNKNOWN241          = 0xf1 // 241\n\tOP_UNKNOWN242          = 0xf2 // 242\n\tOP_UNKNOWN243          = 0xf3 // 243\n\tOP_UNKNOWN244          = 0xf4 // 244\n\tOP_UNKNOWN245          = 0xf5 // 245\n\tOP_UNKNOWN246          = 0xf6 // 246\n\tOP_UNKNOWN247          = 0xf7 // 247\n\tOP_UNKNOWN248          = 0xf8 // 248\n\tOP_UNKNOWN249          = 0xf9 // 249\n\tOP_SMALLINTEGER        = 0xfa // 250 - bitcoin core internal\n\tOP_PUBKEYS             = 0xfb // 251 - bitcoin core internal\n\tOP_UNKNOWN252          = 0xfc // 252\n\tOP_PUBKEYHASH          = 0xfd // 253 - bitcoin core internal\n\tOP_PUBKEY              = 0xfe // 254 - bitcoin core internal\n\tOP_INVALIDOPCODE       = 0xff // 255 - bitcoin core internal\n)\n\n// Conditional execution constants.\nconst (\n\tOpCondFalse = 0\n\tOpCondTrue  = 1\n\tOpCondSkip  = 2\n)\n\n// opcodeArray holds details about all possible opcodes such as how many bytes\n// the opcode and any associated data should take, its human-readable name, and\n// the handler function.\nvar opcodeArray = [256]opcode{\n\t// Data push opcodes.\n\tOP_FALSE:     {OP_FALSE, \"OP_0\", 1, opcodeFalse},\n\tOP_DATA_1:    {OP_DATA_1, \"OP_DATA_1\", 2, opcodePushData},\n\tOP_DATA_2:    {OP_DATA_2, \"OP_DATA_2\", 3, opcodePushData},\n\tOP_DATA_3:    {OP_DATA_3, \"OP_DATA_3\", 4, opcodePushData},\n\tOP_DATA_4:    {OP_DATA_4, \"OP_DATA_4\", 5, opcodePushData},\n\tOP_DATA_5:    {OP_DATA_5, \"OP_DATA_5\", 6, opcodePushData},\n\tOP_DATA_6:    {OP_DATA_6, \"OP_DATA_6\", 7, opcodePushData},\n\tOP_DATA_7:    {OP_DATA_7, \"OP_DATA_7\", 8, opcodePushData},\n\tOP_DATA_8:    {OP_DATA_8, \"OP_DATA_8\", 9, opcodePushData},\n\tOP_DATA_9:    {OP_DATA_9, \"OP_DATA_9\", 10, opcodePushData},\n\tOP_DATA_10:   {OP_DATA_10, \"OP_DATA_10\", 11, opcodePushData},\n\tOP_DATA_11:   {OP_DATA_11, \"OP_DATA_11\", 12, opcodePushData},\n\tOP_DATA_12:   {OP_DATA_12, \"OP_DATA_12\", 13, opcodePushData},\n\tOP_DATA_13:   {OP_DATA_13, \"OP_DATA_13\", 14, opcodePushData},\n\tOP_DATA_14:   {OP_DATA_14, \"OP_DATA_14\", 15, opcodePushData},\n\tOP_DATA_15:   {OP_DATA_15, \"OP_DATA_15\", 16, opcodePushData},\n\tOP_DATA_16:   {OP_DATA_16, \"OP_DATA_16\", 17, opcodePushData},\n\tOP_DATA_17:   {OP_DATA_17, \"OP_DATA_17\", 18, opcodePushData},\n\tOP_DATA_18:   {OP_DATA_18, \"OP_DATA_18\", 19, opcodePushData},\n\tOP_DATA_19:   {OP_DATA_19, \"OP_DATA_19\", 20, opcodePushData},\n\tOP_DATA_20:   {OP_DATA_20, \"OP_DATA_20\", 21, opcodePushData},\n\tOP_DATA_21:   {OP_DATA_21, \"OP_DATA_21\", 22, opcodePushData},\n\tOP_DATA_22:   {OP_DATA_22, \"OP_DATA_22\", 23, opcodePushData},\n\tOP_DATA_23:   {OP_DATA_23, \"OP_DATA_23\", 24, opcodePushData},\n\tOP_DATA_24:   {OP_DATA_24, \"OP_DATA_24\", 25, opcodePushData},\n\tOP_DATA_25:   {OP_DATA_25, \"OP_DATA_25\", 26, opcodePushData},\n\tOP_DATA_26:   {OP_DATA_26, \"OP_DATA_26\", 27, opcodePushData},\n\tOP_DATA_27:   {OP_DATA_27, \"OP_DATA_27\", 28, opcodePushData},\n\tOP_DATA_28:   {OP_DATA_28, \"OP_DATA_28\", 29, opcodePushData},\n\tOP_DATA_29:   {OP_DATA_29, \"OP_DATA_29\", 30, opcodePushData},\n\tOP_DATA_30:   {OP_DATA_30, \"OP_DATA_30\", 31, opcodePushData},\n\tOP_DATA_31:   {OP_DATA_31, \"OP_DATA_31\", 32, opcodePushData},\n\tOP_DATA_32:   {OP_DATA_32, \"OP_DATA_32\", 33, opcodePushData},\n\tOP_DATA_33:   {OP_DATA_33, \"OP_DATA_33\", 34, opcodePushData},\n\tOP_DATA_34:   {OP_DATA_34, \"OP_DATA_34\", 35, opcodePushData},\n\tOP_DATA_35:   {OP_DATA_35, \"OP_DATA_35\", 36, opcodePushData},\n\tOP_DATA_36:   {OP_DATA_36, \"OP_DATA_36\", 37, opcodePushData},\n\tOP_DATA_37:   {OP_DATA_37, \"OP_DATA_37\", 38, opcodePushData},\n\tOP_DATA_38:   {OP_DATA_38, \"OP_DATA_38\", 39, opcodePushData},\n\tOP_DATA_39:   {OP_DATA_39, \"OP_DATA_39\", 40, opcodePushData},\n\tOP_DATA_40:   {OP_DATA_40, \"OP_DATA_40\", 41, opcodePushData},\n\tOP_DATA_41:   {OP_DATA_41, \"OP_DATA_41\", 42, opcodePushData},\n\tOP_DATA_42:   {OP_DATA_42, \"OP_DATA_42\", 43, opcodePushData},\n\tOP_DATA_43:   {OP_DATA_43, \"OP_DATA_43\", 44, opcodePushData},\n\tOP_DATA_44:   {OP_DATA_44, \"OP_DATA_44\", 45, opcodePushData},\n\tOP_DATA_45:   {OP_DATA_45, \"OP_DATA_45\", 46, opcodePushData},\n\tOP_DATA_46:   {OP_DATA_46, \"OP_DATA_46\", 47, opcodePushData},\n\tOP_DATA_47:   {OP_DATA_47, \"OP_DATA_47\", 48, opcodePushData},\n\tOP_DATA_48:   {OP_DATA_48, \"OP_DATA_48\", 49, opcodePushData},\n\tOP_DATA_49:   {OP_DATA_49, \"OP_DATA_49\", 50, opcodePushData},\n\tOP_DATA_50:   {OP_DATA_50, \"OP_DATA_50\", 51, opcodePushData},\n\tOP_DATA_51:   {OP_DATA_51, \"OP_DATA_51\", 52, opcodePushData},\n\tOP_DATA_52:   {OP_DATA_52, \"OP_DATA_52\", 53, opcodePushData},\n\tOP_DATA_53:   {OP_DATA_53, \"OP_DATA_53\", 54, opcodePushData},\n\tOP_DATA_54:   {OP_DATA_54, \"OP_DATA_54\", 55, opcodePushData},\n\tOP_DATA_55:   {OP_DATA_55, \"OP_DATA_55\", 56, opcodePushData},\n\tOP_DATA_56:   {OP_DATA_56, \"OP_DATA_56\", 57, opcodePushData},\n\tOP_DATA_57:   {OP_DATA_57, \"OP_DATA_57\", 58, opcodePushData},\n\tOP_DATA_58:   {OP_DATA_58, \"OP_DATA_58\", 59, opcodePushData},\n\tOP_DATA_59:   {OP_DATA_59, \"OP_DATA_59\", 60, opcodePushData},\n\tOP_DATA_60:   {OP_DATA_60, \"OP_DATA_60\", 61, opcodePushData},\n\tOP_DATA_61:   {OP_DATA_61, \"OP_DATA_61\", 62, opcodePushData},\n\tOP_DATA_62:   {OP_DATA_62, \"OP_DATA_62\", 63, opcodePushData},\n\tOP_DATA_63:   {OP_DATA_63, \"OP_DATA_63\", 64, opcodePushData},\n\tOP_DATA_64:   {OP_DATA_64, \"OP_DATA_64\", 65, opcodePushData},\n\tOP_DATA_65:   {OP_DATA_65, \"OP_DATA_65\", 66, opcodePushData},\n\tOP_DATA_66:   {OP_DATA_66, \"OP_DATA_66\", 67, opcodePushData},\n\tOP_DATA_67:   {OP_DATA_67, \"OP_DATA_67\", 68, opcodePushData},\n\tOP_DATA_68:   {OP_DATA_68, \"OP_DATA_68\", 69, opcodePushData},\n\tOP_DATA_69:   {OP_DATA_69, \"OP_DATA_69\", 70, opcodePushData},\n\tOP_DATA_70:   {OP_DATA_70, \"OP_DATA_70\", 71, opcodePushData},\n\tOP_DATA_71:   {OP_DATA_71, \"OP_DATA_71\", 72, opcodePushData},\n\tOP_DATA_72:   {OP_DATA_72, \"OP_DATA_72\", 73, opcodePushData},\n\tOP_DATA_73:   {OP_DATA_73, \"OP_DATA_73\", 74, opcodePushData},\n\tOP_DATA_74:   {OP_DATA_74, \"OP_DATA_74\", 75, opcodePushData},\n\tOP_DATA_75:   {OP_DATA_75, \"OP_DATA_75\", 76, opcodePushData},\n\tOP_PUSHDATA1: {OP_PUSHDATA1, \"OP_PUSHDATA1\", -1, opcodePushData},\n\tOP_PUSHDATA2: {OP_PUSHDATA2, \"OP_PUSHDATA2\", -2, opcodePushData},\n\tOP_PUSHDATA4: {OP_PUSHDATA4, \"OP_PUSHDATA4\", -4, opcodePushData},\n\tOP_1NEGATE:   {OP_1NEGATE, \"OP_1NEGATE\", 1, opcode1Negate},\n\tOP_RESERVED:  {OP_RESERVED, \"OP_RESERVED\", 1, opcodeReserved},\n\tOP_TRUE:      {OP_TRUE, \"OP_1\", 1, opcodeN},\n\tOP_2:         {OP_2, \"OP_2\", 1, opcodeN},\n\tOP_3:         {OP_3, \"OP_3\", 1, opcodeN},\n\tOP_4:         {OP_4, \"OP_4\", 1, opcodeN},\n\tOP_5:         {OP_5, \"OP_5\", 1, opcodeN},\n\tOP_6:         {OP_6, \"OP_6\", 1, opcodeN},\n\tOP_7:         {OP_7, \"OP_7\", 1, opcodeN},\n\tOP_8:         {OP_8, \"OP_8\", 1, opcodeN},\n\tOP_9:         {OP_9, \"OP_9\", 1, opcodeN},\n\tOP_10:        {OP_10, \"OP_10\", 1, opcodeN},\n\tOP_11:        {OP_11, \"OP_11\", 1, opcodeN},\n\tOP_12:        {OP_12, \"OP_12\", 1, opcodeN},\n\tOP_13:        {OP_13, \"OP_13\", 1, opcodeN},\n\tOP_14:        {OP_14, \"OP_14\", 1, opcodeN},\n\tOP_15:        {OP_15, \"OP_15\", 1, opcodeN},\n\tOP_16:        {OP_16, \"OP_16\", 1, opcodeN},\n\n\t// Control opcodes.\n\tOP_NOP:                 {OP_NOP, \"OP_NOP\", 1, opcodeNop},\n\tOP_VER:                 {OP_VER, \"OP_VER\", 1, opcodeReserved},\n\tOP_IF:                  {OP_IF, \"OP_IF\", 1, opcodeIf},\n\tOP_NOTIF:               {OP_NOTIF, \"OP_NOTIF\", 1, opcodeNotIf},\n\tOP_VERIF:               {OP_VERIF, \"OP_VERIF\", 1, opcodeReserved},\n\tOP_VERNOTIF:            {OP_VERNOTIF, \"OP_VERNOTIF\", 1, opcodeReserved},\n\tOP_ELSE:                {OP_ELSE, \"OP_ELSE\", 1, opcodeElse},\n\tOP_ENDIF:               {OP_ENDIF, \"OP_ENDIF\", 1, opcodeEndif},\n\tOP_VERIFY:              {OP_VERIFY, \"OP_VERIFY\", 1, opcodeVerify},\n\tOP_RETURN:              {OP_RETURN, \"OP_RETURN\", 1, opcodeReturn},\n\tOP_CHECKLOCKTIMEVERIFY: {OP_CHECKLOCKTIMEVERIFY, \"OP_CHECKLOCKTIMEVERIFY\", 1, opcodeCheckLockTimeVerify},\n\tOP_CHECKSEQUENCEVERIFY: {OP_CHECKSEQUENCEVERIFY, \"OP_CHECKSEQUENCEVERIFY\", 1, opcodeCheckSequenceVerify},\n\n\t// Stack opcodes.\n\tOP_TOALTSTACK:   {OP_TOALTSTACK, \"OP_TOALTSTACK\", 1, opcodeToAltStack},\n\tOP_FROMALTSTACK: {OP_FROMALTSTACK, \"OP_FROMALTSTACK\", 1, opcodeFromAltStack},\n\tOP_2DROP:        {OP_2DROP, \"OP_2DROP\", 1, opcode2Drop},\n\tOP_2DUP:         {OP_2DUP, \"OP_2DUP\", 1, opcode2Dup},\n\tOP_3DUP:         {OP_3DUP, \"OP_3DUP\", 1, opcode3Dup},\n\tOP_2OVER:        {OP_2OVER, \"OP_2OVER\", 1, opcode2Over},\n\tOP_2ROT:         {OP_2ROT, \"OP_2ROT\", 1, opcode2Rot},\n\tOP_2SWAP:        {OP_2SWAP, \"OP_2SWAP\", 1, opcode2Swap},\n\tOP_IFDUP:        {OP_IFDUP, \"OP_IFDUP\", 1, opcodeIfDup},\n\tOP_DEPTH:        {OP_DEPTH, \"OP_DEPTH\", 1, opcodeDepth},\n\tOP_DROP:         {OP_DROP, \"OP_DROP\", 1, opcodeDrop},\n\tOP_DUP:          {OP_DUP, \"OP_DUP\", 1, opcodeDup},\n\tOP_NIP:          {OP_NIP, \"OP_NIP\", 1, opcodeNip},\n\tOP_OVER:         {OP_OVER, \"OP_OVER\", 1, opcodeOver},\n\tOP_PICK:         {OP_PICK, \"OP_PICK\", 1, opcodePick},\n\tOP_ROLL:         {OP_ROLL, \"OP_ROLL\", 1, opcodeRoll},\n\tOP_ROT:          {OP_ROT, \"OP_ROT\", 1, opcodeRot},\n\tOP_SWAP:         {OP_SWAP, \"OP_SWAP\", 1, opcodeSwap},\n\tOP_TUCK:         {OP_TUCK, \"OP_TUCK\", 1, opcodeTuck},\n\n\t// Splice opcodes.\n\tOP_CAT:    {OP_CAT, \"OP_CAT\", 1, opcodeDisabled},\n\tOP_SUBSTR: {OP_SUBSTR, \"OP_SUBSTR\", 1, opcodeDisabled},\n\tOP_LEFT:   {OP_LEFT, \"OP_LEFT\", 1, opcodeDisabled},\n\tOP_RIGHT:  {OP_RIGHT, \"OP_RIGHT\", 1, opcodeDisabled},\n\tOP_SIZE:   {OP_SIZE, \"OP_SIZE\", 1, opcodeSize},\n\n\t// Bitwise logic opcodes.\n\tOP_INVERT:      {OP_INVERT, \"OP_INVERT\", 1, opcodeDisabled},\n\tOP_AND:         {OP_AND, \"OP_AND\", 1, opcodeDisabled},\n\tOP_OR:          {OP_OR, \"OP_OR\", 1, opcodeDisabled},\n\tOP_XOR:         {OP_XOR, \"OP_XOR\", 1, opcodeDisabled},\n\tOP_EQUAL:       {OP_EQUAL, \"OP_EQUAL\", 1, opcodeEqual},\n\tOP_EQUALVERIFY: {OP_EQUALVERIFY, \"OP_EQUALVERIFY\", 1, opcodeEqualVerify},\n\tOP_RESERVED1:   {OP_RESERVED1, \"OP_RESERVED1\", 1, opcodeReserved},\n\tOP_RESERVED2:   {OP_RESERVED2, \"OP_RESERVED2\", 1, opcodeReserved},\n\n\t// Numeric related opcodes.\n\tOP_1ADD:               {OP_1ADD, \"OP_1ADD\", 1, opcode1Add},\n\tOP_1SUB:               {OP_1SUB, \"OP_1SUB\", 1, opcode1Sub},\n\tOP_2MUL:               {OP_2MUL, \"OP_2MUL\", 1, opcodeDisabled},\n\tOP_2DIV:               {OP_2DIV, \"OP_2DIV\", 1, opcodeDisabled},\n\tOP_NEGATE:             {OP_NEGATE, \"OP_NEGATE\", 1, opcodeNegate},\n\tOP_ABS:                {OP_ABS, \"OP_ABS\", 1, opcodeAbs},\n\tOP_NOT:                {OP_NOT, \"OP_NOT\", 1, opcodeNot},\n\tOP_0NOTEQUAL:          {OP_0NOTEQUAL, \"OP_0NOTEQUAL\", 1, opcode0NotEqual},\n\tOP_ADD:                {OP_ADD, \"OP_ADD\", 1, opcodeAdd},\n\tOP_SUB:                {OP_SUB, \"OP_SUB\", 1, opcodeSub},\n\tOP_MUL:                {OP_MUL, \"OP_MUL\", 1, opcodeDisabled},\n\tOP_DIV:                {OP_DIV, \"OP_DIV\", 1, opcodeDisabled},\n\tOP_MOD:                {OP_MOD, \"OP_MOD\", 1, opcodeDisabled},\n\tOP_LSHIFT:             {OP_LSHIFT, \"OP_LSHIFT\", 1, opcodeDisabled},\n\tOP_RSHIFT:             {OP_RSHIFT, \"OP_RSHIFT\", 1, opcodeDisabled},\n\tOP_BOOLAND:            {OP_BOOLAND, \"OP_BOOLAND\", 1, opcodeBoolAnd},\n\tOP_BOOLOR:             {OP_BOOLOR, \"OP_BOOLOR\", 1, opcodeBoolOr},\n\tOP_NUMEQUAL:           {OP_NUMEQUAL, \"OP_NUMEQUAL\", 1, opcodeNumEqual},\n\tOP_NUMEQUALVERIFY:     {OP_NUMEQUALVERIFY, \"OP_NUMEQUALVERIFY\", 1, opcodeNumEqualVerify},\n\tOP_NUMNOTEQUAL:        {OP_NUMNOTEQUAL, \"OP_NUMNOTEQUAL\", 1, opcodeNumNotEqual},\n\tOP_LESSTHAN:           {OP_LESSTHAN, \"OP_LESSTHAN\", 1, opcodeLessThan},\n\tOP_GREATERTHAN:        {OP_GREATERTHAN, \"OP_GREATERTHAN\", 1, opcodeGreaterThan},\n\tOP_LESSTHANOREQUAL:    {OP_LESSTHANOREQUAL, \"OP_LESSTHANOREQUAL\", 1, opcodeLessThanOrEqual},\n\tOP_GREATERTHANOREQUAL: {OP_GREATERTHANOREQUAL, \"OP_GREATERTHANOREQUAL\", 1, opcodeGreaterThanOrEqual},\n\tOP_MIN:                {OP_MIN, \"OP_MIN\", 1, opcodeMin},\n\tOP_MAX:                {OP_MAX, \"OP_MAX\", 1, opcodeMax},\n\tOP_WITHIN:             {OP_WITHIN, \"OP_WITHIN\", 1, opcodeWithin},\n\n\t// Crypto opcodes.\n\tOP_RIPEMD160:           {OP_RIPEMD160, \"OP_RIPEMD160\", 1, opcodeRipemd160},\n\tOP_SHA1:                {OP_SHA1, \"OP_SHA1\", 1, opcodeSha1},\n\tOP_SHA256:              {OP_SHA256, \"OP_SHA256\", 1, opcodeSha256},\n\tOP_HASH160:             {OP_HASH160, \"OP_HASH160\", 1, opcodeHash160},\n\tOP_HASH256:             {OP_HASH256, \"OP_HASH256\", 1, opcodeHash256},\n\tOP_CODESEPARATOR:       {OP_CODESEPARATOR, \"OP_CODESEPARATOR\", 1, opcodeCodeSeparator},\n\tOP_CHECKSIG:            {OP_CHECKSIG, \"OP_CHECKSIG\", 1, opcodeCheckSig},\n\tOP_CHECKSIGVERIFY:      {OP_CHECKSIGVERIFY, \"OP_CHECKSIGVERIFY\", 1, opcodeCheckSigVerify},\n\tOP_CHECKMULTISIG:       {OP_CHECKMULTISIG, \"OP_CHECKMULTISIG\", 1, opcodeCheckMultiSig},\n\tOP_CHECKMULTISIGVERIFY: {OP_CHECKMULTISIGVERIFY, \"OP_CHECKMULTISIGVERIFY\", 1, opcodeCheckMultiSigVerify},\n\tOP_CHECKSIGADD:         {OP_CHECKSIGADD, \"OP_CHECKSIGADD\", 1, opcodeCheckSigAdd},\n\n\t// Reserved opcodes.\n\tOP_NOP1:  {OP_NOP1, \"OP_NOP1\", 1, opcodeNop},\n\tOP_NOP4:  {OP_NOP4, \"OP_NOP4\", 1, opcodeNop},\n\tOP_NOP5:  {OP_NOP5, \"OP_NOP5\", 1, opcodeNop},\n\tOP_NOP6:  {OP_NOP6, \"OP_NOP6\", 1, opcodeNop},\n\tOP_NOP7:  {OP_NOP7, \"OP_NOP7\", 1, opcodeNop},\n\tOP_NOP8:  {OP_NOP8, \"OP_NOP8\", 1, opcodeNop},\n\tOP_NOP9:  {OP_NOP9, \"OP_NOP9\", 1, opcodeNop},\n\tOP_NOP10: {OP_NOP10, \"OP_NOP10\", 1, opcodeNop},\n\n\t// Undefined opcodes.\n\tOP_UNKNOWN187: {OP_UNKNOWN187, \"OP_UNKNOWN187\", 1, opcodeInvalid},\n\tOP_UNKNOWN188: {OP_UNKNOWN188, \"OP_UNKNOWN188\", 1, opcodeInvalid},\n\tOP_UNKNOWN189: {OP_UNKNOWN189, \"OP_UNKNOWN189\", 1, opcodeInvalid},\n\tOP_UNKNOWN190: {OP_UNKNOWN190, \"OP_UNKNOWN190\", 1, opcodeInvalid},\n\tOP_UNKNOWN191: {OP_UNKNOWN191, \"OP_UNKNOWN191\", 1, opcodeInvalid},\n\tOP_UNKNOWN192: {OP_UNKNOWN192, \"OP_UNKNOWN192\", 1, opcodeInvalid},\n\tOP_UNKNOWN193: {OP_UNKNOWN193, \"OP_UNKNOWN193\", 1, opcodeInvalid},\n\tOP_UNKNOWN194: {OP_UNKNOWN194, \"OP_UNKNOWN194\", 1, opcodeInvalid},\n\tOP_UNKNOWN195: {OP_UNKNOWN195, \"OP_UNKNOWN195\", 1, opcodeInvalid},\n\tOP_UNKNOWN196: {OP_UNKNOWN196, \"OP_UNKNOWN196\", 1, opcodeInvalid},\n\tOP_UNKNOWN197: {OP_UNKNOWN197, \"OP_UNKNOWN197\", 1, opcodeInvalid},\n\tOP_UNKNOWN198: {OP_UNKNOWN198, \"OP_UNKNOWN198\", 1, opcodeInvalid},\n\tOP_UNKNOWN199: {OP_UNKNOWN199, \"OP_UNKNOWN199\", 1, opcodeInvalid},\n\tOP_UNKNOWN200: {OP_UNKNOWN200, \"OP_UNKNOWN200\", 1, opcodeInvalid},\n\tOP_UNKNOWN201: {OP_UNKNOWN201, \"OP_UNKNOWN201\", 1, opcodeInvalid},\n\tOP_UNKNOWN202: {OP_UNKNOWN202, \"OP_UNKNOWN202\", 1, opcodeInvalid},\n\tOP_UNKNOWN203: {OP_UNKNOWN203, \"OP_UNKNOWN203\", 1, opcodeInvalid},\n\tOP_UNKNOWN204: {OP_UNKNOWN204, \"OP_UNKNOWN204\", 1, opcodeInvalid},\n\tOP_UNKNOWN205: {OP_UNKNOWN205, \"OP_UNKNOWN205\", 1, opcodeInvalid},\n\tOP_UNKNOWN206: {OP_UNKNOWN206, \"OP_UNKNOWN206\", 1, opcodeInvalid},\n\tOP_UNKNOWN207: {OP_UNKNOWN207, \"OP_UNKNOWN207\", 1, opcodeInvalid},\n\tOP_UNKNOWN208: {OP_UNKNOWN208, \"OP_UNKNOWN208\", 1, opcodeInvalid},\n\tOP_UNKNOWN209: {OP_UNKNOWN209, \"OP_UNKNOWN209\", 1, opcodeInvalid},\n\tOP_UNKNOWN210: {OP_UNKNOWN210, \"OP_UNKNOWN210\", 1, opcodeInvalid},\n\tOP_UNKNOWN211: {OP_UNKNOWN211, \"OP_UNKNOWN211\", 1, opcodeInvalid},\n\tOP_UNKNOWN212: {OP_UNKNOWN212, \"OP_UNKNOWN212\", 1, opcodeInvalid},\n\tOP_UNKNOWN213: {OP_UNKNOWN213, \"OP_UNKNOWN213\", 1, opcodeInvalid},\n\tOP_UNKNOWN214: {OP_UNKNOWN214, \"OP_UNKNOWN214\", 1, opcodeInvalid},\n\tOP_UNKNOWN215: {OP_UNKNOWN215, \"OP_UNKNOWN215\", 1, opcodeInvalid},\n\tOP_UNKNOWN216: {OP_UNKNOWN216, \"OP_UNKNOWN216\", 1, opcodeInvalid},\n\tOP_UNKNOWN217: {OP_UNKNOWN217, \"OP_UNKNOWN217\", 1, opcodeInvalid},\n\tOP_UNKNOWN218: {OP_UNKNOWN218, \"OP_UNKNOWN218\", 1, opcodeInvalid},\n\tOP_UNKNOWN219: {OP_UNKNOWN219, \"OP_UNKNOWN219\", 1, opcodeInvalid},\n\tOP_UNKNOWN220: {OP_UNKNOWN220, \"OP_UNKNOWN220\", 1, opcodeInvalid},\n\tOP_UNKNOWN221: {OP_UNKNOWN221, \"OP_UNKNOWN221\", 1, opcodeInvalid},\n\tOP_UNKNOWN222: {OP_UNKNOWN222, \"OP_UNKNOWN222\", 1, opcodeInvalid},\n\tOP_UNKNOWN223: {OP_UNKNOWN223, \"OP_UNKNOWN223\", 1, opcodeInvalid},\n\tOP_UNKNOWN224: {OP_UNKNOWN224, \"OP_UNKNOWN224\", 1, opcodeInvalid},\n\tOP_UNKNOWN225: {OP_UNKNOWN225, \"OP_UNKNOWN225\", 1, opcodeInvalid},\n\tOP_UNKNOWN226: {OP_UNKNOWN226, \"OP_UNKNOWN226\", 1, opcodeInvalid},\n\tOP_UNKNOWN227: {OP_UNKNOWN227, \"OP_UNKNOWN227\", 1, opcodeInvalid},\n\tOP_UNKNOWN228: {OP_UNKNOWN228, \"OP_UNKNOWN228\", 1, opcodeInvalid},\n\tOP_UNKNOWN229: {OP_UNKNOWN229, \"OP_UNKNOWN229\", 1, opcodeInvalid},\n\tOP_UNKNOWN230: {OP_UNKNOWN230, \"OP_UNKNOWN230\", 1, opcodeInvalid},\n\tOP_UNKNOWN231: {OP_UNKNOWN231, \"OP_UNKNOWN231\", 1, opcodeInvalid},\n\tOP_UNKNOWN232: {OP_UNKNOWN232, \"OP_UNKNOWN232\", 1, opcodeInvalid},\n\tOP_UNKNOWN233: {OP_UNKNOWN233, \"OP_UNKNOWN233\", 1, opcodeInvalid},\n\tOP_UNKNOWN234: {OP_UNKNOWN234, \"OP_UNKNOWN234\", 1, opcodeInvalid},\n\tOP_UNKNOWN235: {OP_UNKNOWN235, \"OP_UNKNOWN235\", 1, opcodeInvalid},\n\tOP_UNKNOWN236: {OP_UNKNOWN236, \"OP_UNKNOWN236\", 1, opcodeInvalid},\n\tOP_UNKNOWN237: {OP_UNKNOWN237, \"OP_UNKNOWN237\", 1, opcodeInvalid},\n\tOP_UNKNOWN238: {OP_UNKNOWN238, \"OP_UNKNOWN238\", 1, opcodeInvalid},\n\tOP_UNKNOWN239: {OP_UNKNOWN239, \"OP_UNKNOWN239\", 1, opcodeInvalid},\n\tOP_UNKNOWN240: {OP_UNKNOWN240, \"OP_UNKNOWN240\", 1, opcodeInvalid},\n\tOP_UNKNOWN241: {OP_UNKNOWN241, \"OP_UNKNOWN241\", 1, opcodeInvalid},\n\tOP_UNKNOWN242: {OP_UNKNOWN242, \"OP_UNKNOWN242\", 1, opcodeInvalid},\n\tOP_UNKNOWN243: {OP_UNKNOWN243, \"OP_UNKNOWN243\", 1, opcodeInvalid},\n\tOP_UNKNOWN244: {OP_UNKNOWN244, \"OP_UNKNOWN244\", 1, opcodeInvalid},\n\tOP_UNKNOWN245: {OP_UNKNOWN245, \"OP_UNKNOWN245\", 1, opcodeInvalid},\n\tOP_UNKNOWN246: {OP_UNKNOWN246, \"OP_UNKNOWN246\", 1, opcodeInvalid},\n\tOP_UNKNOWN247: {OP_UNKNOWN247, \"OP_UNKNOWN247\", 1, opcodeInvalid},\n\tOP_UNKNOWN248: {OP_UNKNOWN248, \"OP_UNKNOWN248\", 1, opcodeInvalid},\n\tOP_UNKNOWN249: {OP_UNKNOWN249, \"OP_UNKNOWN249\", 1, opcodeInvalid},\n\n\t// Bitcoin Core internal use opcode.  Defined here for completeness.\n\tOP_SMALLINTEGER: {OP_SMALLINTEGER, \"OP_SMALLINTEGER\", 1, opcodeInvalid},\n\tOP_PUBKEYS:      {OP_PUBKEYS, \"OP_PUBKEYS\", 1, opcodeInvalid},\n\tOP_UNKNOWN252:   {OP_UNKNOWN252, \"OP_UNKNOWN252\", 1, opcodeInvalid},\n\tOP_PUBKEYHASH:   {OP_PUBKEYHASH, \"OP_PUBKEYHASH\", 1, opcodeInvalid},\n\tOP_PUBKEY:       {OP_PUBKEY, \"OP_PUBKEY\", 1, opcodeInvalid},\n\n\tOP_INVALIDOPCODE: {OP_INVALIDOPCODE, \"OP_INVALIDOPCODE\", 1, opcodeInvalid},\n}\n\n// opcodeOnelineRepls defines opcode names which are replaced when doing a\n// one-line disassembly.  This is done to match the output of the reference\n// implementation while not changing the opcode names in the nicer full\n// disassembly.\nvar opcodeOnelineRepls = map[string]string{\n\t\"OP_1NEGATE\": \"-1\",\n\t\"OP_0\":       \"0\",\n\t\"OP_1\":       \"1\",\n\t\"OP_2\":       \"2\",\n\t\"OP_3\":       \"3\",\n\t\"OP_4\":       \"4\",\n\t\"OP_5\":       \"5\",\n\t\"OP_6\":       \"6\",\n\t\"OP_7\":       \"7\",\n\t\"OP_8\":       \"8\",\n\t\"OP_9\":       \"9\",\n\t\"OP_10\":      \"10\",\n\t\"OP_11\":      \"11\",\n\t\"OP_12\":      \"12\",\n\t\"OP_13\":      \"13\",\n\t\"OP_14\":      \"14\",\n\t\"OP_15\":      \"15\",\n\t\"OP_16\":      \"16\",\n}\n\n// successOpcodes tracks the set of op codes that are to be interpreted as op\n// codes that cause execution to automatically succeed. This map is used to\n// quickly look up the op codes during script pre-processing.\nvar successOpcodes = map[byte]struct{}{\n\tOP_RESERVED:     {}, // 80\n\tOP_VER:          {}, // 98\n\tOP_CAT:          {}, // 126\n\tOP_SUBSTR:       {}, // 127\n\tOP_LEFT:         {}, // 128\n\tOP_RIGHT:        {}, // 129\n\tOP_INVERT:       {}, // 131\n\tOP_AND:          {}, // 132\n\tOP_OR:           {}, // 133\n\tOP_XOR:          {}, // 134\n\tOP_RESERVED1:    {}, // 137\n\tOP_RESERVED2:    {}, // 138\n\tOP_2MUL:         {}, // 141\n\tOP_2DIV:         {}, // 142\n\tOP_MUL:          {}, // 149\n\tOP_DIV:          {}, // 150\n\tOP_MOD:          {}, // 151\n\tOP_LSHIFT:       {}, // 152\n\tOP_RSHIFT:       {}, // 153\n\tOP_UNKNOWN187:   {}, // 187\n\tOP_UNKNOWN188:   {}, // 188\n\tOP_UNKNOWN189:   {}, // 189\n\tOP_UNKNOWN190:   {}, // 190\n\tOP_UNKNOWN191:   {}, // 191\n\tOP_UNKNOWN192:   {}, // 192\n\tOP_UNKNOWN193:   {}, // 193\n\tOP_UNKNOWN194:   {}, // 194\n\tOP_UNKNOWN195:   {}, // 195\n\tOP_UNKNOWN196:   {}, // 196\n\tOP_UNKNOWN197:   {}, // 197\n\tOP_UNKNOWN198:   {}, // 198\n\tOP_UNKNOWN199:   {}, // 199\n\tOP_UNKNOWN200:   {}, // 200\n\tOP_UNKNOWN201:   {}, // 201\n\tOP_UNKNOWN202:   {}, // 202\n\tOP_UNKNOWN203:   {}, // 203\n\tOP_UNKNOWN204:   {}, // 204\n\tOP_UNKNOWN205:   {}, // 205\n\tOP_UNKNOWN206:   {}, // 206\n\tOP_UNKNOWN207:   {}, // 207\n\tOP_UNKNOWN208:   {}, // 208\n\tOP_UNKNOWN209:   {}, // 209\n\tOP_UNKNOWN210:   {}, // 210\n\tOP_UNKNOWN211:   {}, // 211\n\tOP_UNKNOWN212:   {}, // 212\n\tOP_UNKNOWN213:   {}, // 213\n\tOP_UNKNOWN214:   {}, // 214\n\tOP_UNKNOWN215:   {}, // 215\n\tOP_UNKNOWN216:   {}, // 216\n\tOP_UNKNOWN217:   {}, // 217\n\tOP_UNKNOWN218:   {}, // 218\n\tOP_UNKNOWN219:   {}, // 219\n\tOP_UNKNOWN220:   {}, // 220\n\tOP_UNKNOWN221:   {}, // 221\n\tOP_UNKNOWN222:   {}, // 222\n\tOP_UNKNOWN223:   {}, // 223\n\tOP_UNKNOWN224:   {}, // 224\n\tOP_UNKNOWN225:   {}, // 225\n\tOP_UNKNOWN226:   {}, // 226\n\tOP_UNKNOWN227:   {}, // 227\n\tOP_UNKNOWN228:   {}, // 228\n\tOP_UNKNOWN229:   {}, // 229\n\tOP_UNKNOWN230:   {}, // 230\n\tOP_UNKNOWN231:   {}, // 231\n\tOP_UNKNOWN232:   {}, // 232\n\tOP_UNKNOWN233:   {}, // 233\n\tOP_UNKNOWN234:   {}, // 234\n\tOP_UNKNOWN235:   {}, // 235\n\tOP_UNKNOWN236:   {}, // 236\n\tOP_UNKNOWN237:   {}, // 237\n\tOP_UNKNOWN238:   {}, // 238\n\tOP_UNKNOWN239:   {}, // 239\n\tOP_UNKNOWN240:   {}, // 240\n\tOP_UNKNOWN241:   {}, // 241\n\tOP_UNKNOWN242:   {}, // 242\n\tOP_UNKNOWN243:   {}, // 243\n\tOP_UNKNOWN244:   {}, // 244\n\tOP_UNKNOWN245:   {}, // 245\n\tOP_UNKNOWN246:   {}, // 246\n\tOP_UNKNOWN247:   {}, // 247\n\tOP_UNKNOWN248:   {}, // 248\n\tOP_UNKNOWN249:   {}, // 249\n\tOP_SMALLINTEGER: {}, // 250\n\tOP_PUBKEYS:      {}, // 251\n\tOP_UNKNOWN252:   {}, // 252\n\tOP_PUBKEYHASH:   {}, // 253\n\tOP_PUBKEY:       {}, // 254\n}\n\n// disasmOpcode writes a human-readable disassembly of the provided opcode and\n// data into the provided buffer.  The compact flag indicates the disassembly\n// should print a more compact representation of data-carrying and small integer\n// opcodes.  For example, OP_0 through OP_16 are replaced with the numeric value\n// and data pushes are printed as only the hex representation of the data as\n// opposed to including the opcode that specifies the amount of data to push as\n// well.\nfunc disasmOpcode(buf *strings.Builder, op *opcode, data []byte, compact bool) {\n\t// Replace opcode which represent values (e.g. OP_0 through OP_16 and\n\t// OP_1NEGATE) with the raw value when performing a compact disassembly.\n\topcodeName := op.name\n\tif compact {\n\t\tif replName, ok := opcodeOnelineRepls[opcodeName]; ok {\n\t\t\topcodeName = replName\n\t\t}\n\n\t\t// Either write the human-readable opcode or the parsed data in hex for\n\t\t// data-carrying opcodes.\n\t\tswitch {\n\t\tcase op.length == 1:\n\t\t\tbuf.WriteString(opcodeName)\n\n\t\tdefault:\n\t\t\tbuf.WriteString(hex.EncodeToString(data))\n\t\t}\n\n\t\treturn\n\t}\n\n\tbuf.WriteString(opcodeName)\n\n\tswitch op.length {\n\t// Only write the opcode name for non-data push opcodes.\n\tcase 1:\n\t\treturn\n\n\t// Add length for the OP_PUSHDATA# opcodes.\n\tcase -1:\n\t\tbuf.WriteString(fmt.Sprintf(\" 0x%02x\", len(data)))\n\tcase -2:\n\t\tbuf.WriteString(fmt.Sprintf(\" 0x%04x\", len(data)))\n\tcase -4:\n\t\tbuf.WriteString(fmt.Sprintf(\" 0x%08x\", len(data)))\n\t}\n\n\tbuf.WriteString(fmt.Sprintf(\" 0x%02x\", data))\n}\n\n// *******************************************\n// Opcode implementation functions start here.\n// *******************************************\n\n// opcodeDisabled is a common handler for disabled opcodes.  It returns an\n// appropriate error indicating the opcode is disabled.  While it would\n// ordinarily make more sense to detect if the script contains any disabled\n// opcodes before executing in an initial parse step, the consensus rules\n// dictate the script doesn't fail until the program counter passes over a\n// disabled opcode (even when they appear in a branch that is not executed).\nfunc opcodeDisabled(op *opcode, data []byte, vm *Engine) error {\n\tstr := fmt.Sprintf(\"attempt to execute disabled opcode %s\", op.name)\n\treturn scriptError(ErrDisabledOpcode, str)\n}\n\n// opcodeReserved is a common handler for all reserved opcodes.  It returns an\n// appropriate error indicating the opcode is reserved.\nfunc opcodeReserved(op *opcode, data []byte, vm *Engine) error {\n\tstr := fmt.Sprintf(\"attempt to execute reserved opcode %s\", op.name)\n\treturn scriptError(ErrReservedOpcode, str)\n}\n\n// opcodeInvalid is a common handler for all invalid opcodes.  It returns an\n// appropriate error indicating the opcode is invalid.\nfunc opcodeInvalid(op *opcode, data []byte, vm *Engine) error {\n\tstr := fmt.Sprintf(\"attempt to execute invalid opcode %s\", op.name)\n\treturn scriptError(ErrReservedOpcode, str)\n}\n\n// opcodeFalse pushes an empty array to the data stack to represent false.  Note\n// that 0, when encoded as a number according to the numeric encoding consensus\n// rules, is an empty array.\nfunc opcodeFalse(op *opcode, data []byte, vm *Engine) error {\n\tvm.dstack.PushByteArray(nil)\n\treturn nil\n}\n\n// opcodePushData is a common handler for the vast majority of opcodes that push\n// raw data (bytes) to the data stack.\nfunc opcodePushData(op *opcode, data []byte, vm *Engine) error {\n\tvm.dstack.PushByteArray(data)\n\treturn nil\n}\n\n// opcode1Negate pushes -1, encoded as a number, to the data stack.\nfunc opcode1Negate(op *opcode, data []byte, vm *Engine) error {\n\tvm.dstack.PushInt(scriptNum(-1))\n\treturn nil\n}\n\n// opcodeN is a common handler for the small integer data push opcodes.  It\n// pushes the numeric value the opcode represents (which will be from 1 to 16)\n// onto the data stack.\nfunc opcodeN(op *opcode, data []byte, vm *Engine) error {\n\t// The opcodes are all defined consecutively, so the numeric value is\n\t// the difference.\n\tvm.dstack.PushInt(scriptNum((op.value - (OP_1 - 1))))\n\treturn nil\n}\n\n// opcodeNop is a common handler for the NOP family of opcodes.  As the name\n// implies it generally does nothing, however, it will return an error when\n// the flag to discourage use of NOPs is set for select opcodes.\nfunc opcodeNop(op *opcode, data []byte, vm *Engine) error {\n\tswitch op.value {\n\tcase OP_NOP1, OP_NOP4, OP_NOP5,\n\t\tOP_NOP6, OP_NOP7, OP_NOP8, OP_NOP9, OP_NOP10:\n\n\t\tif vm.hasFlag(ScriptDiscourageUpgradableNops) {\n\t\t\tstr := fmt.Sprintf(\"%v reserved for soft-fork \"+\n\t\t\t\t\"upgrades\", op.name)\n\t\t\treturn scriptError(ErrDiscourageUpgradableNOPs, str)\n\t\t}\n\t}\n\treturn nil\n}\n\n// popIfBool enforces the \"minimal if\" policy during script execution if the\n// particular flag is set.  If so, in order to eliminate an additional source\n// of nuisance malleability, post-segwit for version 0 witness programs, we now\n// require the following: for OP_IF and OP_NOT_IF, the top stack item MUST\n// either be an empty byte slice, or [0x01]. Otherwise, the item at the top of\n// the stack will be popped and interpreted as a boolean.\nfunc popIfBool(vm *Engine) (bool, error) {\n\t// When not in witness execution mode, not executing a v0 witness\n\t// program, or not doing tapscript execution, or the minimal if flag\n\t// isn't set pop the top stack item as a normal bool.\n\tswitch {\n\t// Minimal if is always on for taproot execution.\n\tcase vm.isWitnessVersionActive(TaprootWitnessVersion):\n\t\tbreak\n\n\t// If this isn't the base segwit version, then we'll coerce the stack\n\t// element as a bool as normal.\n\tcase !vm.isWitnessVersionActive(BaseSegwitWitnessVersion):\n\t\tfallthrough\n\n\t// If the minimal if flag isn't set, then we don't need any extra\n\t// checks here.\n\tcase !vm.hasFlag(ScriptVerifyMinimalIf):\n\t\treturn vm.dstack.PopBool()\n\t}\n\n\t// At this point, a v0 or v1 witness program is being executed and the\n\t// minimal if flag is set, so enforce additional constraints on the top\n\t// stack item.\n\tso, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// The top element MUST have a length of at least one.\n\tif len(so) > 1 {\n\t\tstr := fmt.Sprintf(\"minimal if is active, top element MUST \"+\n\t\t\t\"have a length of at least, instead length is %v\",\n\t\t\tlen(so))\n\t\treturn false, scriptError(ErrMinimalIf, str)\n\t}\n\n\t// Additionally, if the length is one, then the value MUST be 0x01.\n\tif len(so) == 1 && so[0] != 0x01 {\n\t\tstr := fmt.Sprintf(\"minimal if is active, top stack item MUST \"+\n\t\t\t\"be an empty byte array or 0x01, is instead: %v\",\n\t\t\tso[0])\n\t\treturn false, scriptError(ErrMinimalIf, str)\n\t}\n\n\treturn asBool(so), nil\n}\n\n// opcodeIf treats the top item on the data stack as a boolean and removes it.\n//\n// An appropriate entry is added to the conditional stack depending on whether\n// the boolean is true and whether this if is on an executing branch in order\n// to allow proper execution of further opcodes depending on the conditional\n// logic.  When the boolean is true, the first branch will be executed (unless\n// this opcode is nested in a non-executed branch).\n//\n// <expression> if [statements] [else [statements]] endif\n//\n// Note that, unlike for all non-conditional opcodes, this is executed even when\n// it is on a non-executing branch so proper nesting is maintained.\n//\n// Data stack transformation: [... bool] -> [...]\n// Conditional stack transformation: [...] -> [... OpCondValue]\nfunc opcodeIf(op *opcode, data []byte, vm *Engine) error {\n\tcondVal := OpCondFalse\n\tif vm.isBranchExecuting() {\n\t\tok, err := popIfBool(vm)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif ok {\n\t\t\tcondVal = OpCondTrue\n\t\t}\n\t} else {\n\t\tcondVal = OpCondSkip\n\t}\n\tvm.condStack = append(vm.condStack, condVal)\n\treturn nil\n}\n\n// opcodeNotIf treats the top item on the data stack as a boolean and removes\n// it.\n//\n// An appropriate entry is added to the conditional stack depending on whether\n// the boolean is true and whether this if is on an executing branch in order\n// to allow proper execution of further opcodes depending on the conditional\n// logic.  When the boolean is false, the first branch will be executed (unless\n// this opcode is nested in a non-executed branch).\n//\n// <expression> notif [statements] [else [statements]] endif\n//\n// Note that, unlike for all non-conditional opcodes, this is executed even when\n// it is on a non-executing branch so proper nesting is maintained.\n//\n// Data stack transformation: [... bool] -> [...]\n// Conditional stack transformation: [...] -> [... OpCondValue]\nfunc opcodeNotIf(op *opcode, data []byte, vm *Engine) error {\n\tcondVal := OpCondFalse\n\tif vm.isBranchExecuting() {\n\t\tok, err := popIfBool(vm)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif !ok {\n\t\t\tcondVal = OpCondTrue\n\t\t}\n\t} else {\n\t\tcondVal = OpCondSkip\n\t}\n\tvm.condStack = append(vm.condStack, condVal)\n\treturn nil\n}\n\n// opcodeElse inverts conditional execution for other half of if/else/endif.\n//\n// An error is returned if there has not already been a matching OP_IF.\n//\n// Conditional stack transformation: [... OpCondValue] -> [... !OpCondValue]\nfunc opcodeElse(op *opcode, data []byte, vm *Engine) error {\n\tif len(vm.condStack) == 0 {\n\t\tstr := fmt.Sprintf(\"encountered opcode %s with no matching \"+\n\t\t\t\"opcode to begin conditional execution\", op.name)\n\t\treturn scriptError(ErrUnbalancedConditional, str)\n\t}\n\n\tconditionalIdx := len(vm.condStack) - 1\n\tswitch vm.condStack[conditionalIdx] {\n\tcase OpCondTrue:\n\t\tvm.condStack[conditionalIdx] = OpCondFalse\n\tcase OpCondFalse:\n\t\tvm.condStack[conditionalIdx] = OpCondTrue\n\tcase OpCondSkip:\n\t\t// Value doesn't change in skip since it indicates this opcode\n\t\t// is nested in a non-executed branch.\n\t}\n\treturn nil\n}\n\n// opcodeEndif terminates a conditional block, removing the value from the\n// conditional execution stack.\n//\n// An error is returned if there has not already been a matching OP_IF.\n//\n// Conditional stack transformation: [... OpCondValue] -> [...]\nfunc opcodeEndif(op *opcode, data []byte, vm *Engine) error {\n\tif len(vm.condStack) == 0 {\n\t\tstr := fmt.Sprintf(\"encountered opcode %s with no matching \"+\n\t\t\t\"opcode to begin conditional execution\", op.name)\n\t\treturn scriptError(ErrUnbalancedConditional, str)\n\t}\n\n\tvm.condStack = vm.condStack[:len(vm.condStack)-1]\n\treturn nil\n}\n\n// abstractVerify examines the top item on the data stack as a boolean value and\n// verifies it evaluates to true.  An error is returned either when there is no\n// item on the stack or when that item evaluates to false.  In the latter case\n// where the verification fails specifically due to the top item evaluating\n// to false, the returned error will use the passed error code.\nfunc abstractVerify(op *opcode, vm *Engine, c ErrorCode) error {\n\tverified, err := vm.dstack.PopBool()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !verified {\n\t\tstr := fmt.Sprintf(\"%s failed\", op.name)\n\t\treturn scriptError(c, str)\n\t}\n\treturn nil\n}\n\n// opcodeVerify examines the top item on the data stack as a boolean value and\n// verifies it evaluates to true.  An error is returned if it does not.\nfunc opcodeVerify(op *opcode, data []byte, vm *Engine) error {\n\treturn abstractVerify(op, vm, ErrVerify)\n}\n\n// opcodeReturn returns an appropriate error since it is always an error to\n// return early from a script.\nfunc opcodeReturn(op *opcode, data []byte, vm *Engine) error {\n\treturn scriptError(ErrEarlyReturn, \"script returned early\")\n}\n\n// verifyLockTime is a helper function used to validate locktimes.\nfunc verifyLockTime(txLockTime, threshold, lockTime int64) error {\n\t// The lockTimes in both the script and transaction must be of the same\n\t// type.\n\tif !((txLockTime < threshold && lockTime < threshold) ||\n\t\t(txLockTime >= threshold && lockTime >= threshold)) {\n\t\tstr := fmt.Sprintf(\"mismatched locktime types -- tx locktime \"+\n\t\t\t\"%d, stack locktime %d\", txLockTime, lockTime)\n\t\treturn scriptError(ErrUnsatisfiedLockTime, str)\n\t}\n\n\tif lockTime > txLockTime {\n\t\tstr := fmt.Sprintf(\"locktime requirement not satisfied -- \"+\n\t\t\t\"locktime is greater than the transaction locktime: \"+\n\t\t\t\"%d > %d\", lockTime, txLockTime)\n\t\treturn scriptError(ErrUnsatisfiedLockTime, str)\n\t}\n\n\treturn nil\n}\n\n// opcodeCheckLockTimeVerify compares the top item on the data stack to the\n// LockTime field of the transaction containing the script signature\n// validating if the transaction outputs are spendable yet.  If flag\n// ScriptVerifyCheckLockTimeVerify is not set, the code continues as if OP_NOP2\n// were executed.\nfunc opcodeCheckLockTimeVerify(op *opcode, data []byte, vm *Engine) error {\n\t// If the ScriptVerifyCheckLockTimeVerify script flag is not set, treat\n\t// opcode as OP_NOP2 instead.\n\tif !vm.hasFlag(ScriptVerifyCheckLockTimeVerify) {\n\t\tif vm.hasFlag(ScriptDiscourageUpgradableNops) {\n\t\t\treturn scriptError(ErrDiscourageUpgradableNOPs,\n\t\t\t\t\"OP_NOP2 reserved for soft-fork upgrades\")\n\t\t}\n\t\treturn nil\n\t}\n\n\t// The current transaction locktime is a uint32 resulting in a maximum\n\t// locktime of 2^32-1 (the year 2106).  However, scriptNums are signed\n\t// and therefore a standard 4-byte scriptNum would only support up to a\n\t// maximum of 2^31-1 (the year 2038).  Thus, a 5-byte scriptNum is used\n\t// here since it will support up to 2^39-1 which allows dates beyond the\n\t// current locktime limit.\n\t//\n\t// PeekByteArray is used here instead of PeekInt because we do not want\n\t// to be limited to a 4-byte integer for reasons specified above.\n\tso, err := vm.dstack.PeekByteArray(0)\n\tif err != nil {\n\t\treturn err\n\t}\n\tlockTime, err := MakeScriptNum(so, vm.dstack.verifyMinimalData, 5)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// In the rare event that the argument needs to be < 0 due to some\n\t// arithmetic being done first, you can always use\n\t// 0 OP_MAX OP_CHECKLOCKTIMEVERIFY.\n\tif lockTime < 0 {\n\t\tstr := fmt.Sprintf(\"negative lock time: %d\", lockTime)\n\t\treturn scriptError(ErrNegativeLockTime, str)\n\t}\n\n\t// The lock time field of a transaction is either a block height at\n\t// which the transaction is finalized or a timestamp depending on if the\n\t// value is before the txscript.LockTimeThreshold.  When it is under the\n\t// threshold it is a block height.\n\terr = verifyLockTime(int64(vm.tx.LockTime), LockTimeThreshold,\n\t\tint64(lockTime))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// The lock time feature can also be disabled, thereby bypassing\n\t// OP_CHECKLOCKTIMEVERIFY, if every transaction input has been finalized by\n\t// setting its sequence to the maximum value (wire.MaxTxInSequenceNum).  This\n\t// condition would result in the transaction being allowed into the blockchain\n\t// making the opcode ineffective.\n\t//\n\t// This condition is prevented by enforcing that the input being used by\n\t// the opcode is unlocked (its sequence number is less than the max\n\t// value).  This is sufficient to prove correctness without having to\n\t// check every input.\n\t//\n\t// NOTE: This implies that even if the transaction is not finalized due to\n\t// another input being unlocked, the opcode execution will still fail when the\n\t// input being used by the opcode is locked.\n\tif vm.tx.TxIn[vm.txIdx].Sequence == wire.MaxTxInSequenceNum {\n\t\treturn scriptError(ErrUnsatisfiedLockTime,\n\t\t\t\"transaction input is finalized\")\n\t}\n\n\treturn nil\n}\n\n// opcodeCheckSequenceVerify compares the top item on the data stack to the\n// LockTime field of the transaction containing the script signature\n// validating if the transaction outputs are spendable yet.  If flag\n// ScriptVerifyCheckSequenceVerify is not set, the code continues as if OP_NOP3\n// were executed.\nfunc opcodeCheckSequenceVerify(op *opcode, data []byte, vm *Engine) error {\n\t// If the ScriptVerifyCheckSequenceVerify script flag is not set, treat\n\t// opcode as OP_NOP3 instead.\n\tif !vm.hasFlag(ScriptVerifyCheckSequenceVerify) {\n\t\tif vm.hasFlag(ScriptDiscourageUpgradableNops) {\n\t\t\treturn scriptError(ErrDiscourageUpgradableNOPs,\n\t\t\t\t\"OP_NOP3 reserved for soft-fork upgrades\")\n\t\t}\n\t\treturn nil\n\t}\n\n\t// The current transaction sequence is a uint32 resulting in a maximum\n\t// sequence of 2^32-1.  However, scriptNums are signed and therefore a\n\t// standard 4-byte scriptNum would only support up to a maximum of\n\t// 2^31-1.  Thus, a 5-byte scriptNum is used here since it will support\n\t// up to 2^39-1 which allows sequences beyond the current sequence\n\t// limit.\n\t//\n\t// PeekByteArray is used here instead of PeekInt because we do not want\n\t// to be limited to a 4-byte integer for reasons specified above.\n\tso, err := vm.dstack.PeekByteArray(0)\n\tif err != nil {\n\t\treturn err\n\t}\n\tstackSequence, err := MakeScriptNum(so, vm.dstack.verifyMinimalData, 5)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// In the rare event that the argument needs to be < 0 due to some\n\t// arithmetic being done first, you can always use\n\t// 0 OP_MAX OP_CHECKSEQUENCEVERIFY.\n\tif stackSequence < 0 {\n\t\tstr := fmt.Sprintf(\"negative sequence: %d\", stackSequence)\n\t\treturn scriptError(ErrNegativeLockTime, str)\n\t}\n\n\tsequence := int64(stackSequence)\n\n\t// To provide for future soft-fork extensibility, if the\n\t// operand has the disabled lock-time flag set,\n\t// CHECKSEQUENCEVERIFY behaves as a NOP.\n\tif sequence&int64(wire.SequenceLockTimeDisabled) != 0 {\n\t\treturn nil\n\t}\n\n\t// Transaction version numbers not high enough to trigger CSV rules must\n\t// fail.\n\tif uint32(vm.tx.Version) < 2 {\n\t\tstr := fmt.Sprintf(\"invalid transaction version: %d\",\n\t\t\tvm.tx.Version)\n\t\treturn scriptError(ErrUnsatisfiedLockTime, str)\n\t}\n\n\t// Sequence numbers with their most significant bit set are not\n\t// consensus constrained. Testing that the transaction's sequence\n\t// number does not have this bit set prevents using this property\n\t// to get around a CHECKSEQUENCEVERIFY check.\n\ttxSequence := int64(vm.tx.TxIn[vm.txIdx].Sequence)\n\tif txSequence&int64(wire.SequenceLockTimeDisabled) != 0 {\n\t\tstr := fmt.Sprintf(\"transaction sequence has sequence \"+\n\t\t\t\"locktime disabled bit set: 0x%x\", txSequence)\n\t\treturn scriptError(ErrUnsatisfiedLockTime, str)\n\t}\n\n\t// Mask off non-consensus bits before doing comparisons.\n\tlockTimeMask := int64(wire.SequenceLockTimeIsSeconds |\n\t\twire.SequenceLockTimeMask)\n\treturn verifyLockTime(txSequence&lockTimeMask,\n\t\twire.SequenceLockTimeIsSeconds, sequence&lockTimeMask)\n}\n\n// opcodeToAltStack removes the top item from the main data stack and pushes it\n// onto the alternate data stack.\n//\n// Main data stack transformation: [... x1 x2 x3] -> [... x1 x2]\n// Alt data stack transformation:  [... y1 y2 y3] -> [... y1 y2 y3 x3]\nfunc opcodeToAltStack(op *opcode, data []byte, vm *Engine) error {\n\tso, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\tvm.astack.PushByteArray(so)\n\n\treturn nil\n}\n\n// opcodeFromAltStack removes the top item from the alternate data stack and\n// pushes it onto the main data stack.\n//\n// Main data stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 y3]\n// Alt data stack transformation:  [... y1 y2 y3] -> [... y1 y2]\nfunc opcodeFromAltStack(op *opcode, data []byte, vm *Engine) error {\n\tso, err := vm.astack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\tvm.dstack.PushByteArray(so)\n\n\treturn nil\n}\n\n// opcode2Drop removes the top 2 items from the data stack.\n//\n// Stack transformation: [... x1 x2 x3] -> [... x1]\nfunc opcode2Drop(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.DropN(2)\n}\n\n// opcode2Dup duplicates the top 2 items on the data stack.\n//\n// Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x2 x3]\nfunc opcode2Dup(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.DupN(2)\n}\n\n// opcode3Dup duplicates the top 3 items on the data stack.\n//\n// Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x1 x2 x3]\nfunc opcode3Dup(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.DupN(3)\n}\n\n// opcode2Over duplicates the 2 items before the top 2 items on the data stack.\n//\n// Stack transformation: [... x1 x2 x3 x4] -> [... x1 x2 x3 x4 x1 x2]\nfunc opcode2Over(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.OverN(2)\n}\n\n// opcode2Rot rotates the top 6 items on the data stack to the left twice.\n//\n// Stack transformation: [... x1 x2 x3 x4 x5 x6] -> [... x3 x4 x5 x6 x1 x2]\nfunc opcode2Rot(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.RotN(2)\n}\n\n// opcode2Swap swaps the top 2 items on the data stack with the 2 that come\n// before them.\n//\n// Stack transformation: [... x1 x2 x3 x4] -> [... x3 x4 x1 x2]\nfunc opcode2Swap(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.SwapN(2)\n}\n\n// opcodeIfDup duplicates the top item of the stack if it is not zero.\n//\n// Stack transformation (x1==0): [... x1] -> [... x1]\n// Stack transformation (x1!=0): [... x1] -> [... x1 x1]\nfunc opcodeIfDup(op *opcode, data []byte, vm *Engine) error {\n\tso, err := vm.dstack.PeekByteArray(0)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Push copy of data iff it isn't zero\n\tif asBool(so) {\n\t\tvm.dstack.PushByteArray(so)\n\t}\n\n\treturn nil\n}\n\n// opcodeDepth pushes the depth of the data stack prior to executing this\n// opcode, encoded as a number, onto the data stack.\n//\n// Stack transformation: [...] -> [... <num of items on the stack>]\n// Example with 2 items: [x1 x2] -> [x1 x2 2]\n// Example with 3 items: [x1 x2 x3] -> [x1 x2 x3 3]\nfunc opcodeDepth(op *opcode, data []byte, vm *Engine) error {\n\tvm.dstack.PushInt(scriptNum(vm.dstack.Depth()))\n\treturn nil\n}\n\n// opcodeDrop removes the top item from the data stack.\n//\n// Stack transformation: [... x1 x2 x3] -> [... x1 x2]\nfunc opcodeDrop(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.DropN(1)\n}\n\n// opcodeDup duplicates the top item on the data stack.\n//\n// Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x3]\nfunc opcodeDup(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.DupN(1)\n}\n\n// opcodeNip removes the item before the top item on the data stack.\n//\n// Stack transformation: [... x1 x2 x3] -> [... x1 x3]\nfunc opcodeNip(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.NipN(1)\n}\n\n// opcodeOver duplicates the item before the top item on the data stack.\n//\n// Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x2]\nfunc opcodeOver(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.OverN(1)\n}\n\n// opcodePick treats the top item on the data stack as an integer and duplicates\n// the item on the stack that number of items back to the top.\n//\n// Stack transformation: [xn ... x2 x1 x0 n] -> [xn ... x2 x1 x0 xn]\n// Example with n=1: [x2 x1 x0 1] -> [x2 x1 x0 x1]\n// Example with n=2: [x2 x1 x0 2] -> [x2 x1 x0 x2]\nfunc opcodePick(op *opcode, data []byte, vm *Engine) error {\n\tval, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn vm.dstack.PickN(val.Int32())\n}\n\n// opcodeRoll treats the top item on the data stack as an integer and moves\n// the item on the stack that number of items back to the top.\n//\n// Stack transformation: [xn ... x2 x1 x0 n] -> [... x2 x1 x0 xn]\n// Example with n=1: [x2 x1 x0 1] -> [x2 x0 x1]\n// Example with n=2: [x2 x1 x0 2] -> [x1 x0 x2]\nfunc opcodeRoll(op *opcode, data []byte, vm *Engine) error {\n\tval, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn vm.dstack.RollN(val.Int32())\n}\n\n// opcodeRot rotates the top 3 items on the data stack to the left.\n//\n// Stack transformation: [... x1 x2 x3] -> [... x2 x3 x1]\nfunc opcodeRot(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.RotN(1)\n}\n\n// opcodeSwap swaps the top two items on the stack.\n//\n// Stack transformation: [... x1 x2] -> [... x2 x1]\nfunc opcodeSwap(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.SwapN(1)\n}\n\n// opcodeTuck inserts a duplicate of the top item of the data stack before the\n// second-to-top item.\n//\n// Stack transformation: [... x1 x2] -> [... x2 x1 x2]\nfunc opcodeTuck(op *opcode, data []byte, vm *Engine) error {\n\treturn vm.dstack.Tuck()\n}\n\n// opcodeSize pushes the size of the top item of the data stack onto the data\n// stack.\n//\n// Stack transformation: [... x1] -> [... x1 len(x1)]\nfunc opcodeSize(op *opcode, data []byte, vm *Engine) error {\n\tso, err := vm.dstack.PeekByteArray(0)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvm.dstack.PushInt(scriptNum(len(so)))\n\treturn nil\n}\n\n// opcodeEqual removes the top 2 items of the data stack, compares them as raw\n// bytes, and pushes the result, encoded as a boolean, back to the stack.\n//\n// Stack transformation: [... x1 x2] -> [... bool]\nfunc opcodeEqual(op *opcode, data []byte, vm *Engine) error {\n\ta, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\tb, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvm.dstack.PushBool(bytes.Equal(a, b))\n\treturn nil\n}\n\n// opcodeEqualVerify is a combination of opcodeEqual and opcodeVerify.\n// Specifically, it removes the top 2 items of the data stack, compares them,\n// and pushes the result, encoded as a boolean, back to the stack.  Then, it\n// examines the top item on the data stack as a boolean value and verifies it\n// evaluates to true.  An error is returned if it does not.\n//\n// Stack transformation: [... x1 x2] -> [... bool] -> [...]\nfunc opcodeEqualVerify(op *opcode, data []byte, vm *Engine) error {\n\terr := opcodeEqual(op, data, vm)\n\tif err == nil {\n\t\terr = abstractVerify(op, vm, ErrEqualVerify)\n\t}\n\treturn err\n}\n\n// opcode1Add treats the top item on the data stack as an integer and replaces\n// it with its incremented value (plus 1).\n//\n// Stack transformation: [... x1 x2] -> [... x1 x2+1]\nfunc opcode1Add(op *opcode, data []byte, vm *Engine) error {\n\tm, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvm.dstack.PushInt(m + 1)\n\treturn nil\n}\n\n// opcode1Sub treats the top item on the data stack as an integer and replaces\n// it with its decremented value (minus 1).\n//\n// Stack transformation: [... x1 x2] -> [... x1 x2-1]\nfunc opcode1Sub(op *opcode, data []byte, vm *Engine) error {\n\tm, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\tvm.dstack.PushInt(m - 1)\n\n\treturn nil\n}\n\n// opcodeNegate treats the top item on the data stack as an integer and replaces\n// it with its negation.\n//\n// Stack transformation: [... x1 x2] -> [... x1 -x2]\nfunc opcodeNegate(op *opcode, data []byte, vm *Engine) error {\n\tm, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvm.dstack.PushInt(-m)\n\treturn nil\n}\n\n// opcodeAbs treats the top item on the data stack as an integer and replaces it\n// it with its absolute value.\n//\n// Stack transformation: [... x1 x2] -> [... x1 abs(x2)]\nfunc opcodeAbs(op *opcode, data []byte, vm *Engine) error {\n\tm, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif m < 0 {\n\t\tm = -m\n\t}\n\tvm.dstack.PushInt(m)\n\treturn nil\n}\n\n// opcodeNot treats the top item on the data stack as an integer and replaces\n// it with its \"inverted\" value (0 becomes 1, non-zero becomes 0).\n//\n// NOTE: While it would probably make more sense to treat the top item as a\n// boolean, and push the opposite, which is really what the intention of this\n// opcode is, it is extremely important that is not done because integers are\n// interpreted differently than booleans and the consensus rules for this opcode\n// dictate the item is interpreted as an integer.\n//\n// Stack transformation (x2==0): [... x1 0] -> [... x1 1]\n// Stack transformation (x2!=0): [... x1 1] -> [... x1 0]\n// Stack transformation (x2!=0): [... x1 17] -> [... x1 0]\nfunc opcodeNot(op *opcode, data []byte, vm *Engine) error {\n\tm, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif m == 0 {\n\t\tvm.dstack.PushInt(scriptNum(1))\n\t} else {\n\t\tvm.dstack.PushInt(scriptNum(0))\n\t}\n\treturn nil\n}\n\n// opcode0NotEqual treats the top item on the data stack as an integer and\n// replaces it with either a 0 if it is zero, or a 1 if it is not zero.\n//\n// Stack transformation (x2==0): [... x1 0] -> [... x1 0]\n// Stack transformation (x2!=0): [... x1 1] -> [... x1 1]\n// Stack transformation (x2!=0): [... x1 17] -> [... x1 1]\nfunc opcode0NotEqual(op *opcode, data []byte, vm *Engine) error {\n\tm, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif m != 0 {\n\t\tm = 1\n\t}\n\tvm.dstack.PushInt(m)\n\treturn nil\n}\n\n// opcodeAdd treats the top two items on the data stack as integers and replaces\n// them with their sum.\n//\n// Stack transformation: [... x1 x2] -> [... x1+x2]\nfunc opcodeAdd(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvm.dstack.PushInt(v0 + v1)\n\treturn nil\n}\n\n// opcodeSub treats the top two items on the data stack as integers and replaces\n// them with the result of subtracting the top entry from the second-to-top\n// entry.\n//\n// Stack transformation: [... x1 x2] -> [... x1-x2]\nfunc opcodeSub(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvm.dstack.PushInt(v1 - v0)\n\treturn nil\n}\n\n// opcodeBoolAnd treats the top two items on the data stack as integers.  When\n// both of them are not zero, they are replaced with a 1, otherwise a 0.\n//\n// Stack transformation (x1==0, x2==0): [... 0 0] -> [... 0]\n// Stack transformation (x1!=0, x2==0): [... 5 0] -> [... 0]\n// Stack transformation (x1==0, x2!=0): [... 0 7] -> [... 0]\n// Stack transformation (x1!=0, x2!=0): [... 4 8] -> [... 1]\nfunc opcodeBoolAnd(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif v0 != 0 && v1 != 0 {\n\t\tvm.dstack.PushInt(scriptNum(1))\n\t} else {\n\t\tvm.dstack.PushInt(scriptNum(0))\n\t}\n\n\treturn nil\n}\n\n// opcodeBoolOr treats the top two items on the data stack as integers.  When\n// either of them are not zero, they are replaced with a 1, otherwise a 0.\n//\n// Stack transformation (x1==0, x2==0): [... 0 0] -> [... 0]\n// Stack transformation (x1!=0, x2==0): [... 5 0] -> [... 1]\n// Stack transformation (x1==0, x2!=0): [... 0 7] -> [... 1]\n// Stack transformation (x1!=0, x2!=0): [... 4 8] -> [... 1]\nfunc opcodeBoolOr(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif v0 != 0 || v1 != 0 {\n\t\tvm.dstack.PushInt(scriptNum(1))\n\t} else {\n\t\tvm.dstack.PushInt(scriptNum(0))\n\t}\n\n\treturn nil\n}\n\n// opcodeNumEqual treats the top two items on the data stack as integers.  When\n// they are equal, they are replaced with a 1, otherwise a 0.\n//\n// Stack transformation (x1==x2): [... 5 5] -> [... 1]\n// Stack transformation (x1!=x2): [... 5 7] -> [... 0]\nfunc opcodeNumEqual(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif v0 == v1 {\n\t\tvm.dstack.PushInt(scriptNum(1))\n\t} else {\n\t\tvm.dstack.PushInt(scriptNum(0))\n\t}\n\n\treturn nil\n}\n\n// opcodeNumEqualVerify is a combination of opcodeNumEqual and opcodeVerify.\n//\n// Specifically, treats the top two items on the data stack as integers.  When\n// they are equal, they are replaced with a 1, otherwise a 0.  Then, it examines\n// the top item on the data stack as a boolean value and verifies it evaluates\n// to true.  An error is returned if it does not.\n//\n// Stack transformation: [... x1 x2] -> [... bool] -> [...]\nfunc opcodeNumEqualVerify(op *opcode, data []byte, vm *Engine) error {\n\terr := opcodeNumEqual(op, data, vm)\n\tif err == nil {\n\t\terr = abstractVerify(op, vm, ErrNumEqualVerify)\n\t}\n\treturn err\n}\n\n// opcodeNumNotEqual treats the top two items on the data stack as integers.\n// When they are NOT equal, they are replaced with a 1, otherwise a 0.\n//\n// Stack transformation (x1==x2): [... 5 5] -> [... 0]\n// Stack transformation (x1!=x2): [... 5 7] -> [... 1]\nfunc opcodeNumNotEqual(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif v0 != v1 {\n\t\tvm.dstack.PushInt(scriptNum(1))\n\t} else {\n\t\tvm.dstack.PushInt(scriptNum(0))\n\t}\n\n\treturn nil\n}\n\n// opcodeLessThan treats the top two items on the data stack as integers.  When\n// the second-to-top item is less than the top item, they are replaced with a 1,\n// otherwise a 0.\n//\n// Stack transformation: [... x1 x2] -> [... bool]\nfunc opcodeLessThan(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif v1 < v0 {\n\t\tvm.dstack.PushInt(scriptNum(1))\n\t} else {\n\t\tvm.dstack.PushInt(scriptNum(0))\n\t}\n\n\treturn nil\n}\n\n// opcodeGreaterThan treats the top two items on the data stack as integers.\n// When the second-to-top item is greater than the top item, they are replaced\n// with a 1, otherwise a 0.\n//\n// Stack transformation: [... x1 x2] -> [... bool]\nfunc opcodeGreaterThan(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif v1 > v0 {\n\t\tvm.dstack.PushInt(scriptNum(1))\n\t} else {\n\t\tvm.dstack.PushInt(scriptNum(0))\n\t}\n\treturn nil\n}\n\n// opcodeLessThanOrEqual treats the top two items on the data stack as integers.\n// When the second-to-top item is less than or equal to the top item, they are\n// replaced with a 1, otherwise a 0.\n//\n// Stack transformation: [... x1 x2] -> [... bool]\nfunc opcodeLessThanOrEqual(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif v1 <= v0 {\n\t\tvm.dstack.PushInt(scriptNum(1))\n\t} else {\n\t\tvm.dstack.PushInt(scriptNum(0))\n\t}\n\treturn nil\n}\n\n// opcodeGreaterThanOrEqual treats the top two items on the data stack as\n// integers.  When the second-to-top item is greater than or equal to the top\n// item, they are replaced with a 1, otherwise a 0.\n//\n// Stack transformation: [... x1 x2] -> [... bool]\nfunc opcodeGreaterThanOrEqual(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif v1 >= v0 {\n\t\tvm.dstack.PushInt(scriptNum(1))\n\t} else {\n\t\tvm.dstack.PushInt(scriptNum(0))\n\t}\n\n\treturn nil\n}\n\n// opcodeMin treats the top two items on the data stack as integers and replaces\n// them with the minimum of the two.\n//\n// Stack transformation: [... x1 x2] -> [... min(x1, x2)]\nfunc opcodeMin(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif v1 < v0 {\n\t\tvm.dstack.PushInt(v1)\n\t} else {\n\t\tvm.dstack.PushInt(v0)\n\t}\n\n\treturn nil\n}\n\n// opcodeMax treats the top two items on the data stack as integers and replaces\n// them with the maximum of the two.\n//\n// Stack transformation: [... x1 x2] -> [... max(x1, x2)]\nfunc opcodeMax(op *opcode, data []byte, vm *Engine) error {\n\tv0, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tv1, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif v1 > v0 {\n\t\tvm.dstack.PushInt(v1)\n\t} else {\n\t\tvm.dstack.PushInt(v0)\n\t}\n\n\treturn nil\n}\n\n// opcodeWithin treats the top 3 items on the data stack as integers.  When the\n// value to test is within the specified range (left inclusive), they are\n// replaced with a 1, otherwise a 0.\n//\n// The top item is the max value, the second-top-item is the minimum value, and\n// the third-to-top item is the value to test.\n//\n// Stack transformation: [... x1 min max] -> [... bool]\nfunc opcodeWithin(op *opcode, data []byte, vm *Engine) error {\n\tmaxVal, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tminVal, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tx, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif x >= minVal && x < maxVal {\n\t\tvm.dstack.PushInt(scriptNum(1))\n\t} else {\n\t\tvm.dstack.PushInt(scriptNum(0))\n\t}\n\treturn nil\n}\n\n// calcHash calculates the hash of hasher over buf.\nfunc calcHash(buf []byte, hasher hash.Hash) []byte {\n\thasher.Write(buf)\n\treturn hasher.Sum(nil)\n}\n\n// opcodeRipemd160 treats the top item of the data stack as raw bytes and\n// replaces it with ripemd160(data).\n//\n// Stack transformation: [... x1] -> [... ripemd160(x1)]\nfunc opcodeRipemd160(op *opcode, data []byte, vm *Engine) error {\n\tbuf, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvm.dstack.PushByteArray(calcHash(buf, ripemd160.New()))\n\treturn nil\n}\n\n// opcodeSha1 treats the top item of the data stack as raw bytes and replaces it\n// with sha1(data).\n//\n// Stack transformation: [... x1] -> [... sha1(x1)]\nfunc opcodeSha1(op *opcode, data []byte, vm *Engine) error {\n\tbuf, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\thash := sha1.Sum(buf)\n\tvm.dstack.PushByteArray(hash[:])\n\treturn nil\n}\n\n// opcodeSha256 treats the top item of the data stack as raw bytes and replaces\n// it with sha256(data).\n//\n// Stack transformation: [... x1] -> [... sha256(x1)]\nfunc opcodeSha256(op *opcode, data []byte, vm *Engine) error {\n\tbuf, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\thash := sha256.Sum256(buf)\n\tvm.dstack.PushByteArray(hash[:])\n\treturn nil\n}\n\n// opcodeHash160 treats the top item of the data stack as raw bytes and replaces\n// it with ripemd160(sha256(data)).\n//\n// Stack transformation: [... x1] -> [... ripemd160(sha256(x1))]\nfunc opcodeHash160(op *opcode, data []byte, vm *Engine) error {\n\tbuf, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\thash := sha256.Sum256(buf)\n\tvm.dstack.PushByteArray(calcHash(hash[:], ripemd160.New()))\n\treturn nil\n}\n\n// opcodeHash256 treats the top item of the data stack as raw bytes and replaces\n// it with sha256(sha256(data)).\n//\n// Stack transformation: [... x1] -> [... sha256(sha256(x1))]\nfunc opcodeHash256(op *opcode, data []byte, vm *Engine) error {\n\tbuf, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvm.dstack.PushByteArray(chainhash.DoubleHashB(buf))\n\treturn nil\n}\n\n// opcodeCodeSeparator stores the current script offset as the most recently\n// seen OP_CODESEPARATOR which is used during signature checking.\n//\n// This opcode does not change the contents of the data stack.\nfunc opcodeCodeSeparator(op *opcode, data []byte, vm *Engine) error {\n\tvm.lastCodeSep = int(vm.tokenizer.ByteIndex())\n\n\tif vm.taprootCtx != nil {\n\t\tvm.taprootCtx.codeSepPos = uint32(vm.tokenizer.OpcodePosition())\n\t} else if vm.witnessProgram == nil &&\n\t\tvm.hasFlag(ScriptVerifyConstScriptCode) {\n\n\t\t// Disable OP_CODESEPARATOR for non-segwit scripts.\n\t\tstr := \"OP_CODESEPARATOR used in non-segwit script\"\n\t\treturn scriptError(ErrCodeSeparator, str)\n\t}\n\n\treturn nil\n}\n\n// opcodeCheckSig treats the top 2 items on the stack as a public key and a\n// signature and replaces them with a bool which indicates if the signature was\n// successfully verified.\n//\n// The process of verifying a signature requires calculating a signature hash in\n// the same way the transaction signer did.  It involves hashing portions of the\n// transaction based on the hash type byte (which is the final byte of the\n// signature) and the portion of the script starting from the most recent\n// OP_CODESEPARATOR (or the beginning of the script if there are none) to the\n// end of the script (with any other OP_CODESEPARATORs removed).  Once this\n// \"script hash\" is calculated, the signature is checked using standard\n// cryptographic methods against the provided public key.\n//\n// Stack transformation: [... signature pubkey] -> [... bool]\nfunc opcodeCheckSig(op *opcode, data []byte, vm *Engine) error {\n\tpkBytes, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfullSigBytes, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// The signature actually needs to be longer than this, but at\n\t// least 1 byte is needed for the hash type below.  The full length is\n\t// checked depending on the script flags and upon parsing the signature.\n\t//\n\t// This only applies if tapscript verification isn't active, as this\n\t// check is done within the sighash itself.\n\tif vm.taprootCtx == nil && len(fullSigBytes) < 1 {\n\t\tvm.dstack.PushBool(false)\n\t\treturn nil\n\t}\n\n\tvar sigVerifier signatureVerifier\n\tswitch {\n\t// If no witness program is active, then we're verifying under the\n\t// base consensus rules.\n\tcase vm.witnessProgram == nil:\n\t\tsigVerifier, err = newBaseSigVerifier(\n\t\t\tpkBytes, fullSigBytes, vm,\n\t\t)\n\t\tif err != nil {\n\t\t\tvar scriptErr Error\n\t\t\tif errors.As(err, &scriptErr) {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tvm.dstack.PushBool(false)\n\t\t\treturn nil\n\t\t}\n\n\t// If the base segwit version is active, then we'll create the verifier\n\t// that factors in those new consensus rules.\n\tcase vm.isWitnessVersionActive(BaseSegwitWitnessVersion):\n\t\tsigVerifier, err = newBaseSegwitSigVerifier(\n\t\t\tpkBytes, fullSigBytes, vm,\n\t\t)\n\t\tif err != nil {\n\t\t\tvar scriptErr Error\n\t\t\tif errors.As(err, &scriptErr) {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tvm.dstack.PushBool(false)\n\t\t\treturn nil\n\t\t}\n\n\t// Otherwise, this is routine tapscript execution.\n\tcase vm.taprootCtx != nil:\n\t\t// Account for changes in the sig ops budget after this\n\t\t// execution, but only for non-empty signatures.\n\t\tif len(fullSigBytes) > 0 {\n\t\t\tif err := vm.taprootCtx.tallysigOp(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// Empty public keys immediately cause execution to fail.\n\t\tif len(pkBytes) == 0 {\n\t\t\treturn scriptError(ErrTaprootPubkeyIsEmpty, \"\")\n\t\t}\n\n\t\t// If this is tapscript execution, and the signature was\n\t\t// actually an empty vector, then we push on an empty vector\n\t\t// and continue execution from there, but only if the pubkey\n\t\t// isn't empty.\n\t\tif len(fullSigBytes) == 0 {\n\t\t\tvm.dstack.PushByteArray([]byte{})\n\t\t\treturn nil\n\t\t}\n\n\t\t// If the constructor fails immediately, then it's because\n\t\t// the public key size is zero, so we'll fail all script\n\t\t// execution.\n\t\tsigVerifier, err = newBaseTapscriptSigVerifier(\n\t\t\tpkBytes, fullSigBytes, vm,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\tdefault:\n\t\t// We skip segwit v1 in isolation here, as the v1 rules aren't\n\t\t// used in script execution (for sig verification) and are only\n\t\t// part of the top-level key-spend verification which we\n\t\t// already skipped.\n\t\t//\n\t\t// In other words, this path shouldn't ever be reached\n\t\t//\n\t\t// TODO(roasbeef): return an error?\n\t}\n\n\tresult := sigVerifier.Verify()\n\tvalid := result.sigValid\n\n\tif vm.hasFlag(ScriptVerifyConstScriptCode) && result.sigMatch {\n\t\tstr := \"non-const script code\"\n\t\treturn scriptError(ErrNonConstScriptCode, str)\n\t}\n\n\tswitch {\n\t// For tapscript, and prior execution with null fail active, if the\n\t// signature is invalid, then this MUST be an empty signature.\n\tcase !valid && vm.taprootCtx != nil && len(fullSigBytes) != 0:\n\t\tfallthrough\n\tcase !valid && vm.hasFlag(ScriptVerifyNullFail) && len(fullSigBytes) > 0:\n\t\tstr := \"signature not empty on failed checksig\"\n\t\treturn scriptError(ErrNullFail, str)\n\t}\n\n\tvm.dstack.PushBool(valid)\n\treturn nil\n}\n\n// opcodeCheckSigVerify is a combination of opcodeCheckSig and opcodeVerify.\n// The opcodeCheckSig function is invoked followed by opcodeVerify.  See the\n// documentation for each of those opcodes for more details.\n//\n// Stack transformation: [... signature pubkey] -> [... bool] -> [...]\nfunc opcodeCheckSigVerify(op *opcode, data []byte, vm *Engine) error {\n\terr := opcodeCheckSig(op, data, vm)\n\tif err == nil {\n\t\terr = abstractVerify(op, vm, ErrCheckSigVerify)\n\t}\n\treturn err\n}\n\n// opcodeCheckSigAdd implements the OP_CHECKSIGADD operation defined in BIP\n// 342. This is a replacement for OP_CHECKMULTISIGVERIFY and OP_CHECKMULTISIG\n// that lends better to batch sig validation, as well as a possible future of\n// signature aggregation across inputs.\n//\n// The op code takes a public key, an integer (N) and a signature, and returns\n// N if the signature was the empty vector, and n+1 otherwise.\n//\n// Stack transformation: [... pubkey n signature] -> [... n | n+1 ] -> [...]\nfunc opcodeCheckSigAdd(op *opcode, data []byte, vm *Engine) error {\n\t// This op code can only be used if tapsript execution is active.\n\t// Before the soft fork, this opcode was marked as an invalid reserved\n\t// op code.\n\tif vm.taprootCtx == nil {\n\t\tstr := fmt.Sprintf(\"attempt to execute invalid opcode %s\", op.name)\n\t\treturn scriptError(ErrReservedOpcode, str)\n\t}\n\n\t// Pop the signature, integer n, and public key off the stack.\n\tpubKeyBytes, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\taccumulatorInt, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\tsigBytes, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Only non-empty signatures count towards the total tapscript sig op\n\t// limit.\n\tif len(sigBytes) != 0 {\n\t\t// Account for changes in the sig ops budget after this execution.\n\t\tif err := vm.taprootCtx.tallysigOp(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Empty public keys immediately cause execution to fail.\n\tif len(pubKeyBytes) == 0 {\n\t\treturn scriptError(ErrTaprootPubkeyIsEmpty, \"\")\n\t}\n\n\t// If the signature is empty, then we'll just push the value N back\n\t// onto the stack and continue from here.\n\tif len(sigBytes) == 0 {\n\t\tvm.dstack.PushInt(accumulatorInt)\n\t\treturn nil\n\t}\n\n\t// Otherwise, we'll attempt to validate the signature as normal.\n\t//\n\t// If the constructor fails immediately, then it's because the public\n\t// key size is zero, so we'll fail all script execution.\n\tsigVerifier, err := newBaseTapscriptSigVerifier(\n\t\tpubKeyBytes, sigBytes, vm,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tresult := sigVerifier.Verify()\n\n\t// If the signature is invalid, this we fail execution, as it should\n\t// have been an empty signature.\n\tif !result.sigValid {\n\t\tstr := \"signature not empty on failed checksig\"\n\t\treturn scriptError(ErrNullFail, str)\n\t}\n\n\t// Otherwise, we increment the accumulatorInt by one, and push that\n\t// back onto the stack.\n\tvm.dstack.PushInt(accumulatorInt + 1)\n\n\treturn nil\n}\n\n// parsedSigInfo houses a raw signature along with its parsed form and a flag\n// for whether or not it has already been parsed.  It is used to prevent parsing\n// the same signature multiple times when verifying a multisig.\ntype parsedSigInfo struct {\n\tsignature       []byte\n\tparsedSignature *ecdsa.Signature\n\tparsed          bool\n}\n\n// opcodeCheckMultiSig treats the top item on the stack as an integer number of\n// public keys, followed by that many entries as raw data representing the public\n// keys, followed by the integer number of signatures, followed by that many\n// entries as raw data representing the signatures.\n//\n// Due to a bug in the original Satoshi client implementation, an additional\n// dummy argument is also required by the consensus rules, although it is not\n// used.  The dummy value SHOULD be an OP_0, although that is not required by\n// the consensus rules.  When the ScriptStrictMultiSig flag is set, it must be\n// OP_0.\n//\n// All of the aforementioned stack items are replaced with a bool which\n// indicates if the requisite number of signatures were successfully verified.\n//\n// See the opcodeCheckSigVerify documentation for more details about the process\n// for verifying each signature.\n//\n// Stack transformation:\n// [... dummy [sig ...] numsigs [pubkey ...] numpubkeys] -> [... bool]\nfunc opcodeCheckMultiSig(op *opcode, data []byte, vm *Engine) error {\n\t// If we're doing tapscript execution, then this op code is disabled.\n\tif vm.taprootCtx != nil {\n\t\tstr := fmt.Sprintf(\"OP_CHECKMULTISIG and \" +\n\t\t\t\"OP_CHECKMULTISIGVERIFY are disabled during \" +\n\t\t\t\"tapscript execution\")\n\t\treturn scriptError(ErrTapscriptCheckMultisig, str)\n\t}\n\n\tnumKeys, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tnumPubKeys := int(numKeys.Int32())\n\tif numPubKeys < 0 {\n\t\tstr := fmt.Sprintf(\"number of pubkeys %d is negative\",\n\t\t\tnumPubKeys)\n\t\treturn scriptError(ErrInvalidPubKeyCount, str)\n\t}\n\tif numPubKeys > MaxPubKeysPerMultiSig {\n\t\tstr := fmt.Sprintf(\"too many pubkeys: %d > %d\",\n\t\t\tnumPubKeys, MaxPubKeysPerMultiSig)\n\t\treturn scriptError(ErrInvalidPubKeyCount, str)\n\t}\n\tvm.numOps += numPubKeys\n\tif vm.numOps > MaxOpsPerScript {\n\t\tstr := fmt.Sprintf(\"exceeded max operation limit of %d\",\n\t\t\tMaxOpsPerScript)\n\t\treturn scriptError(ErrTooManyOperations, str)\n\t}\n\n\tpubKeys := make([][]byte, 0, numPubKeys)\n\tfor i := 0; i < numPubKeys; i++ {\n\t\tpubKey, err := vm.dstack.PopByteArray()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tpubKeys = append(pubKeys, pubKey)\n\t}\n\n\tnumSigs, err := vm.dstack.PopInt()\n\tif err != nil {\n\t\treturn err\n\t}\n\tnumSignatures := int(numSigs.Int32())\n\tif numSignatures < 0 {\n\t\tstr := fmt.Sprintf(\"number of signatures %d is negative\",\n\t\t\tnumSignatures)\n\t\treturn scriptError(ErrInvalidSignatureCount, str)\n\n\t}\n\tif numSignatures > numPubKeys {\n\t\tstr := fmt.Sprintf(\"more signatures than pubkeys: %d > %d\",\n\t\t\tnumSignatures, numPubKeys)\n\t\treturn scriptError(ErrInvalidSignatureCount, str)\n\t}\n\n\tsignatures := make([]*parsedSigInfo, 0, numSignatures)\n\tfor i := 0; i < numSignatures; i++ {\n\t\tsignature, err := vm.dstack.PopByteArray()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tsigInfo := &parsedSigInfo{signature: signature}\n\t\tsignatures = append(signatures, sigInfo)\n\t}\n\n\t// A bug in the original Satoshi client implementation means one more\n\t// stack value than should be used must be popped.  Unfortunately, this\n\t// buggy behavior is now part of the consensus and a hard fork would be\n\t// required to fix it.\n\tdummy, err := vm.dstack.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Since the dummy argument is otherwise not checked, it could be any\n\t// value which unfortunately provides a source of malleability.  Thus,\n\t// there is a script flag to force an error when the value is NOT 0.\n\tif vm.hasFlag(ScriptStrictMultiSig) && len(dummy) != 0 {\n\t\tstr := fmt.Sprintf(\"multisig dummy argument has length %d \"+\n\t\t\t\"instead of 0\", len(dummy))\n\t\treturn scriptError(ErrSigNullDummy, str)\n\t}\n\n\t// Get script starting from the most recent OP_CODESEPARATOR.\n\tscript := vm.subScript()\n\n\t// Remove the signature in pre version 0 segwit scripts since there is\n\t// no way for a signature to sign itself.\n\tif !vm.isWitnessVersionActive(0) {\n\t\tfor _, sigInfo := range signatures {\n\t\t\tvar match bool\n\t\t\tscript, match = removeOpcodeByData(script, sigInfo.signature)\n\t\t\tif vm.hasFlag(ScriptVerifyConstScriptCode) && match {\n\t\t\t\tstr := fmt.Sprintf(\"got match of %v in %v\", sigInfo.signature,\n\t\t\t\t\tscript)\n\t\t\t\treturn scriptError(ErrNonConstScriptCode, str)\n\t\t\t}\n\t\t}\n\t}\n\n\tsuccess := true\n\tnumPubKeys++\n\tpubKeyIdx := -1\n\tsignatureIdx := 0\n\tfor numSignatures > 0 {\n\t\t// When there are more signatures than public keys remaining,\n\t\t// there is no way to succeed since too many signatures are\n\t\t// invalid, so exit early.\n\t\tpubKeyIdx++\n\t\tnumPubKeys--\n\t\tif numSignatures > numPubKeys {\n\t\t\tsuccess = false\n\t\t\tbreak\n\t\t}\n\n\t\tsigInfo := signatures[signatureIdx]\n\t\tpubKey := pubKeys[pubKeyIdx]\n\n\t\t// The order of the signature and public key evaluation is\n\t\t// important here since it can be distinguished by an\n\t\t// OP_CHECKMULTISIG NOT when the strict encoding flag is set.\n\n\t\trawSig := sigInfo.signature\n\t\tif len(rawSig) == 0 {\n\t\t\t// Skip to the next pubkey if signature is empty.\n\t\t\tcontinue\n\t\t}\n\n\t\t// Split the signature into hash type and signature components.\n\t\thashType := SigHashType(rawSig[len(rawSig)-1])\n\t\tsignature := rawSig[:len(rawSig)-1]\n\n\t\t// Only parse and check the signature encoding once.\n\t\tvar parsedSig *ecdsa.Signature\n\t\tif !sigInfo.parsed {\n\t\t\tif err := vm.checkHashTypeEncoding(hashType); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif err := vm.checkSignatureEncoding(signature); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Parse the signature.\n\t\t\tvar err error\n\t\t\tif vm.hasFlag(ScriptVerifyStrictEncoding) ||\n\t\t\t\tvm.hasFlag(ScriptVerifyDERSignatures) {\n\n\t\t\t\tparsedSig, err = ecdsa.ParseDERSignature(signature)\n\t\t\t} else {\n\t\t\t\tparsedSig, err = ecdsa.ParseSignature(signature)\n\t\t\t}\n\t\t\tsigInfo.parsed = true\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tsigInfo.parsedSignature = parsedSig\n\t\t} else {\n\t\t\t// Skip to the next pubkey if the signature is invalid.\n\t\t\tif sigInfo.parsedSignature == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Use the already parsed signature.\n\t\t\tparsedSig = sigInfo.parsedSignature\n\t\t}\n\n\t\tif err := vm.checkPubKeyEncoding(pubKey); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Parse the pubkey.\n\t\tparsedPubKey, err := btcec.ParsePubKey(pubKey)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Generate the signature hash based on the signature hash type.\n\t\tvar hash []byte\n\t\tif vm.isWitnessVersionActive(0) {\n\t\t\tvar sigHashes *TxSigHashes\n\t\t\tif vm.hashCache != nil {\n\t\t\t\tsigHashes = vm.hashCache\n\t\t\t} else {\n\t\t\t\tsigHashes = NewTxSigHashes(\n\t\t\t\t\t&vm.tx, vm.prevOutFetcher,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\thash, err = calcWitnessSignatureHashRaw(script, sigHashes, hashType,\n\t\t\t\t&vm.tx, vm.txIdx, vm.inputAmount)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\thash = calcSignatureHash(script, hashType, &vm.tx, vm.txIdx)\n\t\t}\n\n\t\tvar valid bool\n\t\tif vm.sigCache != nil {\n\t\t\tvar sigHash chainhash.Hash\n\t\t\tcopy(sigHash[:], hash)\n\n\t\t\tvalid = vm.sigCache.Exists(sigHash, signature, pubKey)\n\t\t\tif !valid && parsedSig.Verify(hash, parsedPubKey) {\n\t\t\t\tvm.sigCache.Add(sigHash, signature, pubKey)\n\t\t\t\tvalid = true\n\t\t\t}\n\t\t} else {\n\t\t\tvalid = parsedSig.Verify(hash, parsedPubKey)\n\t\t}\n\n\t\tif valid {\n\t\t\t// PubKey verified, move on to the next signature.\n\t\t\tsignatureIdx++\n\t\t\tnumSignatures--\n\t\t}\n\t}\n\n\tif !success && vm.hasFlag(ScriptVerifyNullFail) {\n\t\tfor _, sig := range signatures {\n\t\t\tif len(sig.signature) > 0 {\n\t\t\t\tstr := \"not all signatures empty on failed checkmultisig\"\n\t\t\t\treturn scriptError(ErrNullFail, str)\n\t\t\t}\n\t\t}\n\t}\n\n\tvm.dstack.PushBool(success)\n\treturn nil\n}\n\n// opcodeCheckMultiSigVerify is a combination of opcodeCheckMultiSig and\n// opcodeVerify.  The opcodeCheckMultiSig is invoked followed by opcodeVerify.\n// See the documentation for each of those opcodes for more details.\n//\n// Stack transformation:\n// [... dummy [sig ...] numsigs [pubkey ...] numpubkeys] -> [... bool] -> [...]\nfunc opcodeCheckMultiSigVerify(op *opcode, data []byte, vm *Engine) error {\n\terr := opcodeCheckMultiSig(op, data, vm)\n\tif err == nil {\n\t\terr = abstractVerify(op, vm, ErrCheckMultiSigVerify)\n\t}\n\treturn err\n}\n\n// OpcodeByName is a map that can be used to lookup an opcode by its\n// human-readable name (OP_CHECKMULTISIG, OP_CHECKSIG, etc).\nvar OpcodeByName = make(map[string]byte)\n\nfunc init() {\n\t// Initialize the opcode name to value map using the contents of the\n\t// opcode array.  Also add entries for \"OP_FALSE\", \"OP_TRUE\", and\n\t// \"OP_NOP2\" since they are aliases for \"OP_0\", \"OP_1\",\n\t// and \"OP_CHECKLOCKTIMEVERIFY\" respectively.\n\tfor _, op := range opcodeArray {\n\t\tOpcodeByName[op.name] = op.value\n\t}\n\tOpcodeByName[\"OP_FALSE\"] = OP_FALSE\n\tOpcodeByName[\"OP_TRUE\"] = OP_TRUE\n\tOpcodeByName[\"OP_NOP2\"] = OP_CHECKLOCKTIMEVERIFY\n\tOpcodeByName[\"OP_NOP3\"] = OP_CHECKSEQUENCEVERIFY\n}\n"
  },
  {
    "path": "txscript/opcode_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n)\n\n// TestOpcodeDisabled tests the opcodeDisabled function manually because all\n// disabled opcodes result in a script execution failure when executed normally,\n// so the function is not called under normal circumstances.\nfunc TestOpcodeDisabled(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []byte{OP_CAT, OP_SUBSTR, OP_LEFT, OP_RIGHT, OP_INVERT,\n\t\tOP_AND, OP_OR, OP_2MUL, OP_2DIV, OP_MUL, OP_DIV, OP_MOD,\n\t\tOP_LSHIFT, OP_RSHIFT,\n\t}\n\tfor _, opcodeVal := range tests {\n\t\top := &opcodeArray[opcodeVal]\n\t\terr := opcodeDisabled(op, nil, nil)\n\t\tif !IsErrorCode(err, ErrDisabledOpcode) {\n\t\t\tt.Errorf(\"opcodeDisabled: unexpected error - got %v, \"+\n\t\t\t\t\"want %v\", err, ErrDisabledOpcode)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestOpcodeDisasm tests the print function for all opcodes in both the oneline\n// and full modes to ensure it provides the expected disassembly.\nfunc TestOpcodeDisasm(t *testing.T) {\n\tt.Parallel()\n\n\t// First, test the oneline disassembly.\n\n\t// The expected strings for the data push opcodes are replaced in the\n\t// test loops below since they involve repeating bytes.  Also, the\n\t// OP_NOP# and OP_UNKNOWN# are replaced below too, since it's easier\n\t// than manually listing them here.\n\toneBytes := []byte{0x01}\n\toneStr := \"01\"\n\texpectedStrings := [256]string{0x00: \"0\", 0x4f: \"-1\",\n\t\t0x50: \"OP_RESERVED\", 0x61: \"OP_NOP\", 0x62: \"OP_VER\",\n\t\t0x63: \"OP_IF\", 0x64: \"OP_NOTIF\", 0x65: \"OP_VERIF\",\n\t\t0x66: \"OP_VERNOTIF\", 0x67: \"OP_ELSE\", 0x68: \"OP_ENDIF\",\n\t\t0x69: \"OP_VERIFY\", 0x6a: \"OP_RETURN\", 0x6b: \"OP_TOALTSTACK\",\n\t\t0x6c: \"OP_FROMALTSTACK\", 0x6d: \"OP_2DROP\", 0x6e: \"OP_2DUP\",\n\t\t0x6f: \"OP_3DUP\", 0x70: \"OP_2OVER\", 0x71: \"OP_2ROT\",\n\t\t0x72: \"OP_2SWAP\", 0x73: \"OP_IFDUP\", 0x74: \"OP_DEPTH\",\n\t\t0x75: \"OP_DROP\", 0x76: \"OP_DUP\", 0x77: \"OP_NIP\",\n\t\t0x78: \"OP_OVER\", 0x79: \"OP_PICK\", 0x7a: \"OP_ROLL\",\n\t\t0x7b: \"OP_ROT\", 0x7c: \"OP_SWAP\", 0x7d: \"OP_TUCK\",\n\t\t0x7e: \"OP_CAT\", 0x7f: \"OP_SUBSTR\", 0x80: \"OP_LEFT\",\n\t\t0x81: \"OP_RIGHT\", 0x82: \"OP_SIZE\", 0x83: \"OP_INVERT\",\n\t\t0x84: \"OP_AND\", 0x85: \"OP_OR\", 0x86: \"OP_XOR\",\n\t\t0x87: \"OP_EQUAL\", 0x88: \"OP_EQUALVERIFY\", 0x89: \"OP_RESERVED1\",\n\t\t0x8a: \"OP_RESERVED2\", 0x8b: \"OP_1ADD\", 0x8c: \"OP_1SUB\",\n\t\t0x8d: \"OP_2MUL\", 0x8e: \"OP_2DIV\", 0x8f: \"OP_NEGATE\",\n\t\t0x90: \"OP_ABS\", 0x91: \"OP_NOT\", 0x92: \"OP_0NOTEQUAL\",\n\t\t0x93: \"OP_ADD\", 0x94: \"OP_SUB\", 0x95: \"OP_MUL\", 0x96: \"OP_DIV\",\n\t\t0x97: \"OP_MOD\", 0x98: \"OP_LSHIFT\", 0x99: \"OP_RSHIFT\",\n\t\t0x9a: \"OP_BOOLAND\", 0x9b: \"OP_BOOLOR\", 0x9c: \"OP_NUMEQUAL\",\n\t\t0x9d: \"OP_NUMEQUALVERIFY\", 0x9e: \"OP_NUMNOTEQUAL\",\n\t\t0x9f: \"OP_LESSTHAN\", 0xa0: \"OP_GREATERTHAN\",\n\t\t0xa1: \"OP_LESSTHANOREQUAL\", 0xa2: \"OP_GREATERTHANOREQUAL\",\n\t\t0xa3: \"OP_MIN\", 0xa4: \"OP_MAX\", 0xa5: \"OP_WITHIN\",\n\t\t0xa6: \"OP_RIPEMD160\", 0xa7: \"OP_SHA1\", 0xa8: \"OP_SHA256\",\n\t\t0xa9: \"OP_HASH160\", 0xaa: \"OP_HASH256\", 0xab: \"OP_CODESEPARATOR\",\n\t\t0xac: \"OP_CHECKSIG\", 0xad: \"OP_CHECKSIGVERIFY\",\n\t\t0xae: \"OP_CHECKMULTISIG\", 0xaf: \"OP_CHECKMULTISIGVERIFY\",\n\t\t0xfa: \"OP_SMALLINTEGER\", 0xfb: \"OP_PUBKEYS\",\n\t\t0xfd: \"OP_PUBKEYHASH\", 0xfe: \"OP_PUBKEY\",\n\t\t0xff: \"OP_INVALIDOPCODE\", 0xba: \"OP_CHECKSIGADD\",\n\t}\n\tfor opcodeVal, expectedStr := range expectedStrings {\n\t\tvar data []byte\n\t\tswitch {\n\t\t// OP_DATA_1 through OP_DATA_65 display the pushed data.\n\t\tcase opcodeVal >= 0x01 && opcodeVal < 0x4c:\n\t\t\tdata = bytes.Repeat(oneBytes, opcodeVal)\n\t\t\texpectedStr = strings.Repeat(oneStr, opcodeVal)\n\n\t\t// OP_PUSHDATA1.\n\t\tcase opcodeVal == 0x4c:\n\t\t\tdata = bytes.Repeat(oneBytes, 1)\n\t\t\texpectedStr = strings.Repeat(oneStr, 1)\n\n\t\t// OP_PUSHDATA2.\n\t\tcase opcodeVal == 0x4d:\n\t\t\tdata = bytes.Repeat(oneBytes, 2)\n\t\t\texpectedStr = strings.Repeat(oneStr, 2)\n\n\t\t// OP_PUSHDATA4.\n\t\tcase opcodeVal == 0x4e:\n\t\t\tdata = bytes.Repeat(oneBytes, 3)\n\t\t\texpectedStr = strings.Repeat(oneStr, 3)\n\n\t\t// OP_1 through OP_16 display the numbers themselves.\n\t\tcase opcodeVal >= 0x51 && opcodeVal <= 0x60:\n\t\t\tval := byte(opcodeVal - (0x51 - 1))\n\t\t\tdata = []byte{val}\n\t\t\texpectedStr = strconv.Itoa(int(val))\n\n\t\t// OP_NOP1 through OP_NOP10.\n\t\tcase opcodeVal >= 0xb0 && opcodeVal <= 0xb9:\n\t\t\tswitch opcodeVal {\n\t\t\tcase 0xb1:\n\t\t\t\t// OP_NOP2 is an alias of OP_CHECKLOCKTIMEVERIFY\n\t\t\t\texpectedStr = \"OP_CHECKLOCKTIMEVERIFY\"\n\t\t\tcase 0xb2:\n\t\t\t\t// OP_NOP3 is an alias of OP_CHECKSEQUENCEVERIFY\n\t\t\t\texpectedStr = \"OP_CHECKSEQUENCEVERIFY\"\n\t\t\tdefault:\n\t\t\t\tval := byte(opcodeVal - (0xb0 - 1))\n\t\t\t\texpectedStr = \"OP_NOP\" + strconv.Itoa(int(val))\n\t\t\t}\n\n\t\t// OP_UNKNOWN#.\n\t\tcase opcodeVal >= 0xbb && opcodeVal <= 0xf9 || opcodeVal == 0xfc:\n\t\t\texpectedStr = \"OP_UNKNOWN\" + strconv.Itoa(opcodeVal)\n\t\t}\n\n\t\tvar buf strings.Builder\n\t\tdisasmOpcode(&buf, &opcodeArray[opcodeVal], data, true)\n\t\tgotStr := buf.String()\n\t\tif gotStr != expectedStr {\n\t\t\tt.Errorf(\"pop.print (opcode %x): Unexpected disasm \"+\n\t\t\t\t\"string - got %v, want %v\", opcodeVal, gotStr,\n\t\t\t\texpectedStr)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// Now, replace the relevant fields and test the full disassembly.\n\texpectedStrings[0x00] = \"OP_0\"\n\texpectedStrings[0x4f] = \"OP_1NEGATE\"\n\tfor opcodeVal, expectedStr := range expectedStrings {\n\t\tvar data []byte\n\t\tswitch {\n\t\t// OP_DATA_1 through OP_DATA_65 display the opcode followed by\n\t\t// the pushed data.\n\t\tcase opcodeVal >= 0x01 && opcodeVal < 0x4c:\n\t\t\tdata = bytes.Repeat(oneBytes, opcodeVal)\n\t\t\texpectedStr = fmt.Sprintf(\"OP_DATA_%d 0x%s\", opcodeVal,\n\t\t\t\tstrings.Repeat(oneStr, opcodeVal))\n\n\t\t// OP_PUSHDATA1.\n\t\tcase opcodeVal == 0x4c:\n\t\t\tdata = bytes.Repeat(oneBytes, 1)\n\t\t\texpectedStr = fmt.Sprintf(\"OP_PUSHDATA1 0x%02x 0x%s\",\n\t\t\t\tlen(data), strings.Repeat(oneStr, 1))\n\n\t\t// OP_PUSHDATA2.\n\t\tcase opcodeVal == 0x4d:\n\t\t\tdata = bytes.Repeat(oneBytes, 2)\n\t\t\texpectedStr = fmt.Sprintf(\"OP_PUSHDATA2 0x%04x 0x%s\",\n\t\t\t\tlen(data), strings.Repeat(oneStr, 2))\n\n\t\t// OP_PUSHDATA4.\n\t\tcase opcodeVal == 0x4e:\n\t\t\tdata = bytes.Repeat(oneBytes, 3)\n\t\t\texpectedStr = fmt.Sprintf(\"OP_PUSHDATA4 0x%08x 0x%s\",\n\t\t\t\tlen(data), strings.Repeat(oneStr, 3))\n\n\t\t// OP_1 through OP_16.\n\t\tcase opcodeVal >= 0x51 && opcodeVal <= 0x60:\n\t\t\tval := byte(opcodeVal - (0x51 - 1))\n\t\t\tdata = []byte{val}\n\t\t\texpectedStr = \"OP_\" + strconv.Itoa(int(val))\n\n\t\t// OP_NOP1 through OP_NOP10.\n\t\tcase opcodeVal >= 0xb0 && opcodeVal <= 0xb9:\n\t\t\tswitch opcodeVal {\n\t\t\tcase 0xb1:\n\t\t\t\t// OP_NOP2 is an alias of OP_CHECKLOCKTIMEVERIFY\n\t\t\t\texpectedStr = \"OP_CHECKLOCKTIMEVERIFY\"\n\t\t\tcase 0xb2:\n\t\t\t\t// OP_NOP3 is an alias of OP_CHECKSEQUENCEVERIFY\n\t\t\t\texpectedStr = \"OP_CHECKSEQUENCEVERIFY\"\n\t\t\tdefault:\n\t\t\t\tval := byte(opcodeVal - (0xb0 - 1))\n\t\t\t\texpectedStr = \"OP_NOP\" + strconv.Itoa(int(val))\n\t\t\t}\n\n\t\t// OP_UNKNOWN#.\n\t\tcase opcodeVal >= 0xba && opcodeVal <= 0xf9 || opcodeVal == 0xfc:\n\t\t\tswitch opcodeVal {\n\t\t\t// OP_UNKNOWN186 a.k.a 0xba is now OP_CHECKSIGADD.\n\t\t\tcase 0xba:\n\t\t\t\texpectedStr = \"OP_CHECKSIGADD\"\n\t\t\tdefault:\n\t\t\t\texpectedStr = \"OP_UNKNOWN\" + strconv.Itoa(opcodeVal)\n\t\t\t}\n\t\t}\n\n\t\tvar buf strings.Builder\n\t\tdisasmOpcode(&buf, &opcodeArray[opcodeVal], data, false)\n\t\tgotStr := buf.String()\n\t\tif gotStr != expectedStr {\n\t\t\tt.Errorf(\"pop.print (opcode %x): Unexpected disasm \"+\n\t\t\t\t\"string - got %v, want %v\", opcodeVal, gotStr,\n\t\t\t\texpectedStr)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "txscript/pkscript.go",
    "content": "package txscript\n\nimport (\n\t\"crypto/sha256\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/ecdsa\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"golang.org/x/crypto/ripemd160\"\n)\n\nconst (\n\t// minPubKeyHashSigScriptLen is the minimum length of a signature script\n\t// that spends a P2PKH output. The length is composed of the following:\n\t//   Signature length (1 byte)\n\t//   Signature (min 8 bytes)\n\t//   Signature hash type (1 byte)\n\t//   Public key length (1 byte)\n\t//   Public key (33 byte)\n\tminPubKeyHashSigScriptLen = 1 + ecdsa.MinSigLen + 1 + 1 + 33\n\n\t// maxPubKeyHashSigScriptLen is the maximum length of a signature script\n\t// that spends a P2PKH output. The length is composed of the following:\n\t//   Signature length (1 byte)\n\t//   Signature (max 72 bytes)\n\t//   Signature hash type (1 byte)\n\t//   Public key length (1 byte)\n\t//   Public key (33 byte)\n\tmaxPubKeyHashSigScriptLen = 1 + 72 + 1 + 1 + 33\n\n\t// compressedPubKeyLen is the length in bytes of a compressed public\n\t// key.\n\tcompressedPubKeyLen = 33\n\n\t// pubKeyHashLen is the length of a P2PKH script.\n\tpubKeyHashLen = 25\n\n\t// witnessV0PubKeyHashLen is the length of a P2WPKH script.\n\twitnessV0PubKeyHashLen = 22\n\n\t// scriptHashLen is the length of a P2SH script.\n\tscriptHashLen = 23\n\n\t// witnessV0ScriptHashLen is the length of a P2WSH script.\n\twitnessV0ScriptHashLen = 34\n\n\t// witnessV1TaprootLen is the length of a P2TR script.\n\twitnessV1TaprootLen = 34\n\n\t// maxLen is the maximum script length supported by ParsePkScript.\n\tmaxLen = witnessV0ScriptHashLen\n)\n\nvar (\n\t// ErrUnsupportedScriptType is an error returned when we attempt to\n\t// parse/re-compute an output script into a PkScript struct.\n\tErrUnsupportedScriptType = errors.New(\"unsupported script type\")\n)\n\n// PkScript is a wrapper struct around a byte array, allowing it to be used\n// as a map index.\ntype PkScript struct {\n\t// class is the type of the script encoded within the byte array. This\n\t// is used to determine the correct length of the script within the byte\n\t// array.\n\tclass ScriptClass\n\n\t// script is the script contained within a byte array. If the script is\n\t// smaller than the length of the byte array, it will be padded with 0s\n\t// at the end.\n\tscript [maxLen]byte\n}\n\n// ParsePkScript parses an output script into the PkScript struct.\n// ErrUnsupportedScriptType is returned when attempting to parse an unsupported\n// script type.\nfunc ParsePkScript(pkScript []byte) (PkScript, error) {\n\tvar outputScript PkScript\n\tscriptClass, _, _, err := ExtractPkScriptAddrs(\n\t\tpkScript, &chaincfg.MainNetParams,\n\t)\n\tif err != nil {\n\t\treturn outputScript, fmt.Errorf(\"unable to parse script type: \"+\n\t\t\t\"%v\", err)\n\t}\n\n\tif !isSupportedScriptType(scriptClass) {\n\t\treturn outputScript, ErrUnsupportedScriptType\n\t}\n\n\toutputScript.class = scriptClass\n\tcopy(outputScript.script[:], pkScript)\n\n\treturn outputScript, nil\n}\n\n// isSupportedScriptType determines whether the script type is supported by the\n// PkScript struct.\nfunc isSupportedScriptType(class ScriptClass) bool {\n\tswitch class {\n\tcase PubKeyHashTy, WitnessV0PubKeyHashTy, ScriptHashTy,\n\t\tWitnessV0ScriptHashTy, WitnessV1TaprootTy:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// Class returns the script type.\nfunc (s PkScript) Class() ScriptClass {\n\treturn s.class\n}\n\n// Script returns the script as a byte slice without any padding.\nfunc (s PkScript) Script() []byte {\n\tvar script []byte\n\n\tswitch s.class {\n\tcase PubKeyHashTy:\n\t\tscript = make([]byte, pubKeyHashLen)\n\t\tcopy(script, s.script[:pubKeyHashLen])\n\n\tcase WitnessV0PubKeyHashTy:\n\t\tscript = make([]byte, witnessV0PubKeyHashLen)\n\t\tcopy(script, s.script[:witnessV0PubKeyHashLen])\n\n\tcase ScriptHashTy:\n\t\tscript = make([]byte, scriptHashLen)\n\t\tcopy(script, s.script[:scriptHashLen])\n\n\tcase WitnessV0ScriptHashTy:\n\t\tscript = make([]byte, witnessV0ScriptHashLen)\n\t\tcopy(script, s.script[:witnessV0ScriptHashLen])\n\n\tcase WitnessV1TaprootTy:\n\t\tscript = make([]byte, witnessV1TaprootLen)\n\t\tcopy(script, s.script[:witnessV1TaprootLen])\n\n\tdefault:\n\t\t// Unsupported script type.\n\t\treturn nil\n\t}\n\n\treturn script\n}\n\n// Address encodes the script into an address for the given chain.\nfunc (s PkScript) Address(chainParams *chaincfg.Params) (btcutil.Address, error) {\n\t_, addrs, _, err := ExtractPkScriptAddrs(s.Script(), chainParams)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to parse address: %v\", err)\n\t}\n\n\treturn addrs[0], nil\n}\n\n// String returns a hex-encoded string representation of the script.\nfunc (s PkScript) String() string {\n\tstr, _ := DisasmString(s.Script())\n\treturn str\n}\n\n// ComputePkScript computes the script of an output by looking at the spending\n// input's signature script or witness.\n//\n// NOTE: Only P2PKH, P2SH, P2WSH, and P2WPKH redeem scripts are supported.\nfunc ComputePkScript(sigScript []byte, witness wire.TxWitness) (PkScript, error) {\n\tswitch {\n\tcase len(sigScript) > 0:\n\t\treturn computeNonWitnessPkScript(sigScript)\n\tcase len(witness) > 0:\n\t\treturn computeWitnessPkScript(witness)\n\tdefault:\n\t\treturn PkScript{}, ErrUnsupportedScriptType\n\t}\n}\n\n// computeNonWitnessPkScript computes the script of an output by looking at the\n// spending input's signature script.\nfunc computeNonWitnessPkScript(sigScript []byte) (PkScript, error) {\n\tswitch {\n\t// Since we only support P2PKH and P2SH scripts as the only non-witness\n\t// script types, we should expect to see a push only script.\n\tcase !IsPushOnlyScript(sigScript):\n\t\treturn PkScript{}, ErrUnsupportedScriptType\n\n\t// If a signature script is provided with a length long enough to\n\t// represent a P2PKH script, then we'll attempt to parse the compressed\n\t// public key from it.\n\tcase len(sigScript) >= minPubKeyHashSigScriptLen &&\n\t\tlen(sigScript) <= maxPubKeyHashSigScriptLen:\n\n\t\t// The public key should be found as the last part of the\n\t\t// signature script. We'll attempt to parse it to ensure this is\n\t\t// a P2PKH redeem script.\n\t\tpubKey := sigScript[len(sigScript)-compressedPubKeyLen:]\n\t\tif btcec.IsCompressedPubKey(pubKey) {\n\t\t\tpubKeyHash := hash160(pubKey)\n\t\t\tscript, err := payToPubKeyHashScript(pubKeyHash)\n\t\t\tif err != nil {\n\t\t\t\treturn PkScript{}, err\n\t\t\t}\n\n\t\t\tpkScript := PkScript{class: PubKeyHashTy}\n\t\t\tcopy(pkScript.script[:], script)\n\t\t\treturn pkScript, nil\n\t\t}\n\n\t\tfallthrough\n\n\t// If we failed to parse a compressed public key from the script in the\n\t// case above, or if the script length is not that of a P2PKH one, we\n\t// can assume it's a P2SH signature script.\n\tdefault:\n\t\t// The redeem script will always be the last data push of the\n\t\t// signature script, so we'll parse the script into opcodes to\n\t\t// obtain it.\n\t\tconst scriptVersion = 0\n\t\terr := checkScriptParses(scriptVersion, sigScript)\n\t\tif err != nil {\n\t\t\treturn PkScript{}, err\n\t\t}\n\t\tredeemScript := finalOpcodeData(scriptVersion, sigScript)\n\n\t\tscriptHash := hash160(redeemScript)\n\t\tscript, err := payToScriptHashScript(scriptHash)\n\t\tif err != nil {\n\t\t\treturn PkScript{}, err\n\t\t}\n\n\t\tpkScript := PkScript{class: ScriptHashTy}\n\t\tcopy(pkScript.script[:], script)\n\t\treturn pkScript, nil\n\t}\n}\n\n// computeWitnessPkScript computes the script of an output by looking at the\n// spending input's witness.\nfunc computeWitnessPkScript(witness wire.TxWitness) (PkScript, error) {\n\t// We'll use the last item of the witness stack to determine the proper\n\t// witness type.\n\tlastWitnessItem := witness[len(witness)-1]\n\n\tvar pkScript PkScript\n\tswitch {\n\t// If the witness stack has a size of 2 and its last item is a\n\t// compressed public key, then this is a P2WPKH witness.\n\tcase len(witness) == 2 && len(lastWitnessItem) == compressedPubKeyLen:\n\t\tpubKeyHash := hash160(lastWitnessItem)\n\t\tscript, err := payToWitnessPubKeyHashScript(pubKeyHash)\n\t\tif err != nil {\n\t\t\treturn pkScript, err\n\t\t}\n\n\t\tpkScript.class = WitnessV0PubKeyHashTy\n\t\tcopy(pkScript.script[:], script)\n\n\t// For any other witnesses, we'll assume it's a P2WSH witness.\n\tdefault:\n\t\tscriptHash := sha256.Sum256(lastWitnessItem)\n\t\tscript, err := payToWitnessScriptHashScript(scriptHash[:])\n\t\tif err != nil {\n\t\t\treturn pkScript, err\n\t\t}\n\n\t\tpkScript.class = WitnessV0ScriptHashTy\n\t\tcopy(pkScript.script[:], script)\n\t}\n\n\treturn pkScript, nil\n}\n\n// hash160 returns the RIPEMD160 hash of the SHA-256 HASH of the given data.\nfunc hash160(data []byte) []byte {\n\th := sha256.Sum256(data)\n\treturn ripemd160h(h[:])\n}\n\n// ripemd160h returns the RIPEMD160 hash of the given data.\nfunc ripemd160h(data []byte) []byte {\n\th := ripemd160.New()\n\th.Write(data)\n\treturn h.Sum(nil)\n}\n"
  },
  {
    "path": "txscript/pkscript_test.go",
    "content": "package txscript\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TestParsePkScript ensures that the supported script types can be parsed\n// correctly and re-derived into its raw byte representation.\nfunc TestParsePkScript(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tpkScript []byte\n\t\tvalid    bool\n\t}{\n\t\t{\n\t\t\tname:     \"empty output script\",\n\t\t\tpkScript: []byte{},\n\t\t\tvalid:    false,\n\t\t},\n\t\t{\n\t\t\tname: \"valid P2PKH\",\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_DUP\n\t\t\t\t0x76,\n\t\t\t\t// OP_HASH160\n\t\t\t\t0xa9,\n\t\t\t\t// OP_DATA_20\n\t\t\t\t0x14,\n\t\t\t\t// <20-byte pubkey hash>\n\t\t\t\t0xf0, 0x7a, 0xb8, 0xce, 0x72, 0xda, 0x4e, 0x76,\n\t\t\t\t0x0b, 0x74, 0x7d, 0x48, 0xd6, 0x65, 0xec, 0x96,\n\t\t\t\t0xad, 0xf0, 0x24, 0xf5,\n\t\t\t\t// OP_EQUALVERIFY\n\t\t\t\t0x88,\n\t\t\t\t// OP_CHECKSIG\n\t\t\t\t0xac,\n\t\t\t},\n\t\t\tvalid: true,\n\t\t},\n\t\t// Invalid P2PKH - same as above but replaced OP_CHECKSIG with\n\t\t// OP_CHECKSIGVERIFY.\n\t\t{\n\t\t\tname: \"invalid P2PKH\",\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_DUP\n\t\t\t\t0x76,\n\t\t\t\t// OP_HASH160\n\t\t\t\t0xa9,\n\t\t\t\t// OP_DATA_20\n\t\t\t\t0x14,\n\t\t\t\t// <20-byte pubkey hash>\n\t\t\t\t0xf0, 0x7a, 0xb8, 0xce, 0x72, 0xda, 0x4e, 0x76,\n\t\t\t\t0x0b, 0x74, 0x7d, 0x48, 0xd6, 0x65, 0xec, 0x96,\n\t\t\t\t0xad, 0xf0, 0x24, 0xf5,\n\t\t\t\t// OP_EQUALVERIFY\n\t\t\t\t0x88,\n\t\t\t\t// OP_CHECKSIGVERIFY\n\t\t\t\t0xad,\n\t\t\t},\n\t\t\tvalid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"valid P2SH\",\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_HASH160\n\t\t\t\t0xA9,\n\t\t\t\t// OP_DATA_20\n\t\t\t\t0x14,\n\t\t\t\t// <20-byte script hash>\n\t\t\t\t0xec, 0x6f, 0x7a, 0x5a, 0xa8, 0xf2, 0xb1, 0x0c,\n\t\t\t\t0xa5, 0x15, 0x04, 0x52, 0x3a, 0x60, 0xd4, 0x03,\n\t\t\t\t0x06, 0xf6, 0x96, 0xcd,\n\t\t\t\t// OP_EQUAL\n\t\t\t\t0x87,\n\t\t\t},\n\t\t\tvalid: true,\n\t\t},\n\t\t// Invalid P2SH - same as above but replaced OP_EQUAL with\n\t\t// OP_EQUALVERIFY.\n\t\t{\n\t\t\tname: \"invalid P2SH\",\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_HASH160\n\t\t\t\t0xA9,\n\t\t\t\t// OP_DATA_20\n\t\t\t\t0x14,\n\t\t\t\t// <20-byte script hash>\n\t\t\t\t0xec, 0x6f, 0x7a, 0x5a, 0xa8, 0xf2, 0xb1, 0x0c,\n\t\t\t\t0xa5, 0x15, 0x04, 0x52, 0x3a, 0x60, 0xd4, 0x03,\n\t\t\t\t0x06, 0xf6, 0x96, 0xcd,\n\t\t\t\t// OP_EQUALVERIFY\n\t\t\t\t0x88,\n\t\t\t},\n\t\t\tvalid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"valid v0 P2WSH\",\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_0\n\t\t\t\t0x00,\n\t\t\t\t// OP_DATA_32\n\t\t\t\t0x20,\n\t\t\t\t// <32-byte script hash>\n\t\t\t\t0xec, 0x6f, 0x7a, 0x5a, 0xa8, 0xf2, 0xb1, 0x0c,\n\t\t\t\t0xa5, 0x15, 0x04, 0x52, 0x3a, 0x60, 0xd4, 0x03,\n\t\t\t\t0x06, 0xf6, 0x96, 0xcd, 0x06, 0xf6, 0x96, 0xcd,\n\t\t\t\t0x06, 0xf6, 0x96, 0xcd, 0x06, 0xf6, 0x96, 0xcd,\n\t\t\t},\n\t\t\tvalid: true,\n\t\t},\n\t\t// Invalid v0 P2WSH - same as above but missing one byte.\n\t\t{\n\t\t\tname: \"invalid v0 P2WSH\",\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_0\n\t\t\t\t0x00,\n\t\t\t\t// OP_DATA_32\n\t\t\t\t0x20,\n\t\t\t\t// <32-byte script hash>\n\t\t\t\t0xec, 0x6f, 0x7a, 0x5a, 0xa8, 0xf2, 0xb1, 0x0c,\n\t\t\t\t0xa5, 0x15, 0x04, 0x52, 0x3a, 0x60, 0xd4, 0x03,\n\t\t\t\t0x06, 0xf6, 0x96, 0xcd, 0x06, 0xf6, 0x96, 0xcd,\n\t\t\t\t0x06, 0xf6, 0x96, 0xcd, 0x06, 0xf6, 0x96,\n\t\t\t},\n\t\t\tvalid: false,\n\t\t},\n\t\t{\n\t\t\tname: \"valid v0 P2WPKH\",\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_0\n\t\t\t\t0x00,\n\t\t\t\t// OP_DATA_20\n\t\t\t\t0x14,\n\t\t\t\t// <20-byte pubkey hash>\n\t\t\t\t0xec, 0x6f, 0x7a, 0x5a, 0xa8, 0xf2, 0xb1, 0x0c,\n\t\t\t\t0xa5, 0x15, 0x04, 0x52, 0x3a, 0x60, 0xd4, 0x03,\n\t\t\t\t0x06, 0xf6, 0x96, 0xcd,\n\t\t\t},\n\t\t\tvalid: true,\n\t\t},\n\t\t// Invalid v0 P2WPKH - same as above but missing one byte.\n\t\t{\n\t\t\tname: \"invalid v0 P2WPKH\",\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_0\n\t\t\t\t0x00,\n\t\t\t\t// OP_DATA_20\n\t\t\t\t0x14,\n\t\t\t\t// <20-byte pubkey hash>\n\t\t\t\t0xec, 0x6f, 0x7a, 0x5a, 0xa8, 0xf2, 0xb1, 0x0c,\n\t\t\t\t0xa5, 0x15, 0x04, 0x52, 0x3a, 0x60, 0xd4, 0x03,\n\t\t\t\t0x06, 0xf6, 0x96,\n\t\t\t},\n\t\t\tvalid: false,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tpkScript, err := ParsePkScript(test.pkScript)\n\t\t\tswitch {\n\t\t\tcase err != nil && test.valid:\n\t\t\t\tt.Fatalf(\"unable to parse valid pkScript=%x: %v\",\n\t\t\t\t\ttest.pkScript, err)\n\t\t\tcase err == nil && !test.valid:\n\t\t\t\tt.Fatalf(\"successfully parsed invalid pkScript=%x\",\n\t\t\t\t\ttest.pkScript)\n\t\t\t}\n\n\t\t\tif !test.valid {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif !bytes.Equal(pkScript.Script(), test.pkScript) {\n\t\t\t\tt.Fatalf(\"expected to re-derive pkScript=%x, \"+\n\t\t\t\t\t\"got pkScript=%x\", test.pkScript,\n\t\t\t\t\tpkScript.Script())\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestComputePkScript ensures that we can correctly re-derive an output's\n// pkScript by looking at the input's signature script/witness attempting to\n// spend it.\nfunc TestComputePkScript(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname      string\n\t\tsigScript []byte\n\t\twitness   wire.TxWitness\n\t\tclass     ScriptClass\n\t\tpkScript  []byte\n\t}{\n\t\t{\n\t\t\tname:      \"empty sigScript and witness\",\n\t\t\tsigScript: nil,\n\t\t\twitness:   nil,\n\t\t\tclass:     NonStandardTy,\n\t\t\tpkScript:  nil,\n\t\t},\n\t\t{\n\t\t\tname: \"P2PKH sigScript\",\n\t\t\tsigScript: []byte{\n\t\t\t\t// OP_DATA_73,\n\t\t\t\t0x49,\n\t\t\t\t// <73-byte sig>\n\t\t\t\t0x30, 0x44, 0x02, 0x20, 0x65, 0x92, 0xd8, 0x8e,\n\t\t\t\t0x1d, 0x0a, 0x4a, 0x3c, 0xc5, 0x9f, 0x92, 0xae,\n\t\t\t\t0xfe, 0x62, 0x54, 0x74, 0xa9, 0x4d, 0x13, 0xa5,\n\t\t\t\t0x9f, 0x84, 0x97, 0x78, 0xfc, 0xe7, 0xdf, 0x4b,\n\t\t\t\t0xe0, 0xc2, 0x28, 0xd8, 0x02, 0x20, 0x2d, 0xea,\n\t\t\t\t0x36, 0x96, 0x19, 0x1f, 0xb7, 0x00, 0xc5, 0xa7,\n\t\t\t\t0x7e, 0x22, 0xd9, 0xfb, 0x6b, 0x42, 0x67, 0x42,\n\t\t\t\t0xa4, 0x2c, 0xac, 0xdb, 0x74, 0xa2, 0x7c, 0x43,\n\t\t\t\t0xcd, 0x89, 0xa0, 0xf9, 0x44, 0x54, 0x12, 0x74,\n\t\t\t\t0x01,\n\t\t\t\t// OP_DATA_33\n\t\t\t\t0x21,\n\t\t\t\t// <33-byte compressed pubkey>\n\t\t\t\t0x02, 0x7d, 0x56, 0x12, 0x09, 0x75, 0x31, 0xc2,\n\t\t\t\t0x17, 0xfd, 0xd4, 0xd2, 0xe1, 0x7a, 0x35, 0x4b,\n\t\t\t\t0x17, 0xf2, 0x7a, 0xef, 0x30, 0x9f, 0xb2, 0x7f,\n\t\t\t\t0x1f, 0x1f, 0x7b, 0x73, 0x7d, 0x9a, 0x24, 0x49,\n\t\t\t\t0x90,\n\t\t\t},\n\t\t\twitness: nil,\n\t\t\tclass:   PubKeyHashTy,\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_DUP\n\t\t\t\t0x76,\n\t\t\t\t// OP_HASH160\n\t\t\t\t0xa9,\n\t\t\t\t// OP_DATA_20\n\t\t\t\t0x14,\n\t\t\t\t// <20-byte pubkey hash>\n\t\t\t\t0xf0, 0x7a, 0xb8, 0xce, 0x72, 0xda, 0x4e, 0x76,\n\t\t\t\t0x0b, 0x74, 0x7d, 0x48, 0xd6, 0x65, 0xec, 0x96,\n\t\t\t\t0xad, 0xf0, 0x24, 0xf5,\n\t\t\t\t// OP_EQUALVERIFY\n\t\t\t\t0x88,\n\t\t\t\t// OP_CHECKSIG\n\t\t\t\t0xac,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"NP2WPKH sigScript\",\n\t\t\t// Since this is a NP2PKH output, the sigScript is a\n\t\t\t// data push of a serialized v0 P2WPKH script.\n\t\t\tsigScript: []byte{\n\t\t\t\t// OP_DATA_16\n\t\t\t\t0x16,\n\t\t\t\t// <22-byte redeem script>\n\t\t\t\t0x00, 0x14, 0x1d, 0x7c, 0xd6, 0xc7, 0x5c, 0x2e,\n\t\t\t\t0x86, 0xf4, 0xcb, 0xf9, 0x8e, 0xae, 0xd2, 0x21,\n\t\t\t\t0xb3, 0x0b, 0xd9, 0xa0, 0xb9, 0x28,\n\t\t\t},\n\t\t\t// NP2PKH outputs include a witness, but it is not\n\t\t\t// needed to reconstruct the pkScript.\n\t\t\twitness: nil,\n\t\t\tclass:   ScriptHashTy,\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_HASH160\n\t\t\t\t0xa9,\n\t\t\t\t// OP_DATA_20\n\t\t\t\t0x14,\n\t\t\t\t// <20-byte script hash>\n\t\t\t\t0x90, 0x1c, 0x86, 0x94, 0xc0, 0x3f, 0xaf, 0xd5,\n\t\t\t\t0x52, 0x28, 0x10, 0xe0, 0x33, 0x0f, 0x26, 0xe6,\n\t\t\t\t0x7a, 0x85, 0x33, 0xcd,\n\t\t\t\t// OP_EQUAL\n\t\t\t\t0x87,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"P2SH sigScript\",\n\t\t\tsigScript: []byte{\n\t\t\t\t0x00, 0x49, 0x30, 0x46, 0x02, 0x21, 0x00, 0xda,\n\t\t\t\t0xe6, 0xb6, 0x14, 0x1b, 0xa7, 0x24, 0x4f, 0x54,\n\t\t\t\t0x62, 0xb6, 0x2a, 0x3b, 0x27, 0x59, 0xde, 0xe4,\n\t\t\t\t0x46, 0x76, 0x19, 0x4e, 0x6c, 0x56, 0x8d, 0x5b,\n\t\t\t\t0x1c, 0xda, 0x96, 0x2d, 0x4f, 0x6d, 0x79, 0x02,\n\t\t\t\t0x21, 0x00, 0xa6, 0x6f, 0x60, 0x34, 0x46, 0x09,\n\t\t\t\t0x0a, 0x22, 0x3c, 0xec, 0x30, 0x33, 0xd9, 0x86,\n\t\t\t\t0x24, 0xd2, 0x73, 0xa8, 0x91, 0x55, 0xa5, 0xe6,\n\t\t\t\t0x96, 0x66, 0x0b, 0x6a, 0x50, 0xa3, 0x46, 0x45,\n\t\t\t\t0xbb, 0x67, 0x01, 0x48, 0x30, 0x45, 0x02, 0x21,\n\t\t\t\t0x00, 0xe2, 0x73, 0x49, 0xdb, 0x93, 0x82, 0xe1,\n\t\t\t\t0xf8, 0x8d, 0xae, 0x97, 0x5c, 0x71, 0x19, 0xb7,\n\t\t\t\t0x79, 0xb6, 0xda, 0x43, 0xa8, 0x4f, 0x16, 0x05,\n\t\t\t\t0x87, 0x11, 0x9f, 0xe8, 0x12, 0x1d, 0x85, 0xae,\n\t\t\t\t0xee, 0x02, 0x20, 0x6f, 0x23, 0x2d, 0x0a, 0x7b,\n\t\t\t\t0x4b, 0xfa, 0xcd, 0x56, 0xa0, 0x72, 0xcc, 0x2a,\n\t\t\t\t0x44, 0x81, 0x31, 0xd1, 0x0d, 0x73, 0x35, 0xf9,\n\t\t\t\t0xa7, 0x54, 0x8b, 0xee, 0x1f, 0x70, 0xc5, 0x71,\n\t\t\t\t0x0b, 0x37, 0x9e, 0x01, 0x47, 0x52, 0x21, 0x03,\n\t\t\t\t0xab, 0x11, 0x5d, 0xa6, 0xdf, 0x4f, 0x54, 0x0b,\n\t\t\t\t0xd6, 0xc9, 0xc4, 0xbe, 0x5f, 0xdd, 0xcc, 0x24,\n\t\t\t\t0x58, 0x8e, 0x7c, 0x2c, 0xaf, 0x13, 0x82, 0x28,\n\t\t\t\t0xdd, 0x0f, 0xce, 0x29, 0xfd, 0x65, 0xb8, 0x7c,\n\t\t\t\t0x21, 0x02, 0x15, 0xe8, 0xb7, 0xbf, 0xfe, 0x8d,\n\t\t\t\t0x9b, 0xbd, 0x45, 0x81, 0xf9, 0xc3, 0xb6, 0xf1,\n\t\t\t\t0x6d, 0x67, 0x08, 0x36, 0xc3, 0x0b, 0xb2, 0xe0,\n\t\t\t\t0x3e, 0xfd, 0x9d, 0x41, 0x03, 0xb5, 0x59, 0xeb,\n\t\t\t\t0x67, 0xcd, 0x52, 0xae,\n\t\t\t},\n\t\t\twitness: nil,\n\t\t\tclass:   ScriptHashTy,\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_HASH160\n\t\t\t\t0xA9,\n\t\t\t\t// OP_DATA_20\n\t\t\t\t0x14,\n\t\t\t\t// <20-byte script hash>\n\t\t\t\t0x12, 0xd6, 0x9c, 0xd3, 0x38, 0xa3, 0x8d, 0x0d,\n\t\t\t\t0x77, 0x83, 0xcf, 0x22, 0x64, 0x97, 0x63, 0x3d,\n\t\t\t\t0x3c, 0x20, 0x79, 0xea,\n\t\t\t\t// OP_EQUAL\n\t\t\t\t0x87,\n\t\t\t},\n\t\t},\n\t\t// Invalid P2SH (non push-data only script).\n\t\t{\n\t\t\tname:      \"invalid P2SH sigScript\",\n\t\t\tsigScript: []byte{0x6b, 0x65, 0x6b}, // kek\n\t\t\twitness:   nil,\n\t\t\tclass:     NonStandardTy,\n\t\t\tpkScript:  nil,\n\t\t},\n\t\t{\n\t\t\tname:      \"P2WSH witness\",\n\t\t\tsigScript: nil,\n\t\t\twitness: [][]byte{\n\t\t\t\t{},\n\t\t\t\t// Witness script.\n\t\t\t\t{\n\t\t\t\t\t0x21, 0x03, 0x82, 0x62, 0xa6, 0xc6,\n\t\t\t\t\t0xce, 0xc9, 0x3c, 0x2d, 0x3e, 0xcd,\n\t\t\t\t\t0x6c, 0x60, 0x72, 0xef, 0xea, 0x86,\n\t\t\t\t\t0xd0, 0x2f, 0xf8, 0xe3, 0x32, 0x8b,\n\t\t\t\t\t0xbd, 0x02, 0x42, 0xb2, 0x0a, 0xf3,\n\t\t\t\t\t0x42, 0x59, 0x90, 0xac, 0xac,\n\t\t\t\t},\n\t\t\t},\n\t\t\tclass: WitnessV0ScriptHashTy,\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_0\n\t\t\t\t0x00,\n\t\t\t\t// OP_DATA_32\n\t\t\t\t0x20,\n\t\t\t\t// <32-byte script hash>\n\t\t\t\t0x01, 0xd5, 0xd9, 0x2e, 0xff, 0xa6, 0xff, 0xba,\n\t\t\t\t0x3e, 0xfa, 0x37, 0x9f, 0x98, 0x30, 0xd0, 0xf7,\n\t\t\t\t0x56, 0x18, 0xb1, 0x33, 0x93, 0x82, 0x71, 0x52,\n\t\t\t\t0xd2, 0x6e, 0x43, 0x09, 0x00, 0x0e, 0x88, 0xb1,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:      \"P2WPKH witness\",\n\t\t\tsigScript: nil,\n\t\t\twitness: [][]byte{\n\t\t\t\t// Signature is not needed to re-derive the\n\t\t\t\t// pkScript.\n\t\t\t\t{},\n\t\t\t\t// Compressed pubkey.\n\t\t\t\t{\n\t\t\t\t\t0x03, 0x82, 0x62, 0xa6, 0xc6, 0xce,\n\t\t\t\t\t0xc9, 0x3c, 0x2d, 0x3e, 0xcd, 0x6c,\n\t\t\t\t\t0x60, 0x72, 0xef, 0xea, 0x86, 0xd0,\n\t\t\t\t\t0x2f, 0xf8, 0xe3, 0x32, 0x8b, 0xbd,\n\t\t\t\t\t0x02, 0x42, 0xb2, 0x0a, 0xf3, 0x42,\n\t\t\t\t\t0x59, 0x90, 0xac,\n\t\t\t\t},\n\t\t\t},\n\t\t\tclass: WitnessV0PubKeyHashTy,\n\t\t\tpkScript: []byte{\n\t\t\t\t// OP_0\n\t\t\t\t0x00,\n\t\t\t\t// OP_DATA_20\n\t\t\t\t0x14,\n\t\t\t\t// <20-byte pubkey hash>\n\t\t\t\t0x1d, 0x7c, 0xd6, 0xc7, 0x5c, 0x2e, 0x86, 0xf4,\n\t\t\t\t0xcb, 0xf9, 0x8e, 0xae, 0xd2, 0x21, 0xb3, 0x0b,\n\t\t\t\t0xd9, 0xa0, 0xb9, 0x28,\n\t\t\t},\n\t\t},\n\t\t// Invalid v0 P2WPKH - same as above but missing a byte on the\n\t\t// public key.\n\t\t{\n\t\t\tname:      \"invalid P2WPKH witness\",\n\t\t\tsigScript: nil,\n\t\t\twitness: [][]byte{\n\t\t\t\t// Signature is not needed to re-derive the\n\t\t\t\t// pkScript.\n\t\t\t\t{},\n\t\t\t\t// Malformed compressed pubkey.\n\t\t\t\t{\n\t\t\t\t\t0x03, 0x82, 0x62, 0xa6, 0xc6, 0xce,\n\t\t\t\t\t0xc9, 0x3c, 0x2d, 0x3e, 0xcd, 0x6c,\n\t\t\t\t\t0x60, 0x72, 0xef, 0xea, 0x86, 0xd0,\n\t\t\t\t\t0x2f, 0xf8, 0xe3, 0x32, 0x8b, 0xbd,\n\t\t\t\t\t0x02, 0x42, 0xb2, 0x0a, 0xf3, 0x42,\n\t\t\t\t\t0x59, 0x90,\n\t\t\t\t},\n\t\t\t},\n\t\t\tclass:    WitnessV0PubKeyHashTy,\n\t\t\tpkScript: nil,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tvalid := test.pkScript != nil\n\t\t\tpkScript, err := ComputePkScript(\n\t\t\t\ttest.sigScript, test.witness,\n\t\t\t)\n\t\t\tif err != nil && valid {\n\t\t\t\tt.Fatalf(\"unable to compute pkScript: %v\", err)\n\t\t\t}\n\n\t\t\tif !valid {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif pkScript.Class() != test.class {\n\t\t\t\tt.Fatalf(\"%s: expected pkScript of type %v, got %v\",\n\t\t\t\t\ttest.name, test.class, pkScript.Class())\n\t\t\t}\n\t\t\tif !bytes.Equal(pkScript.Script(), test.pkScript) {\n\t\t\t\tt.Fatalf(\"%s: expected pkScript=%x, got pkScript=%x\",\n\t\t\t\t\ttest.name, test.pkScript, pkScript.Script())\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "txscript/reference_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// scriptTestName returns a descriptive test name for the given reference script\n// test data.\nfunc scriptTestName(test []interface{}) (string, error) {\n\t// Account for any optional leading witness data.\n\tvar witnessOffset int\n\tif _, ok := test[0].([]interface{}); ok {\n\t\twitnessOffset++\n\t}\n\n\t// In addition to the optional leading witness data, the test must\n\t// consist of at least a signature script, public key script, flags,\n\t// and expected error.  Finally, it may optionally contain a comment.\n\tif len(test) < witnessOffset+4 || len(test) > witnessOffset+5 {\n\t\treturn \"\", fmt.Errorf(\"invalid test length %d\", len(test))\n\t}\n\n\t// Use the comment for the test name if one is specified, otherwise,\n\t// construct the name based on the signature script, public key script,\n\t// and flags.\n\tvar name string\n\tif len(test) == witnessOffset+5 {\n\t\tname = fmt.Sprintf(\"test (%s)\", test[witnessOffset+4])\n\t} else {\n\t\tname = fmt.Sprintf(\"test ([%s, %s, %s])\", test[witnessOffset],\n\t\t\ttest[witnessOffset+1], test[witnessOffset+2])\n\t}\n\treturn name, nil\n}\n\n// parse hex string into a []byte.\nfunc parseHex(tok string) ([]byte, error) {\n\tif !strings.HasPrefix(tok, \"0x\") {\n\t\treturn nil, errors.New(\"not a hex number\")\n\t}\n\treturn hex.DecodeString(tok[2:])\n}\n\n// parseWitnessStack parses a json array of witness items encoded as hex into a\n// slice of witness elements.\nfunc parseWitnessStack(elements []interface{}) ([][]byte, error) {\n\twitness := make([][]byte, len(elements))\n\tfor i, e := range elements {\n\t\twitElement, err := hex.DecodeString(e.(string))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\twitness[i] = witElement\n\t}\n\n\treturn witness, nil\n}\n\n// shortFormOps holds a map of opcode names to values for use in short form\n// parsing.  It is declared here so it only needs to be created once.\nvar shortFormOps map[string]byte\n\n// parseShortForm parses a string as as used in the Bitcoin Core reference tests\n// into the script it came from.\n//\n// The format used for these tests is pretty simple if ad-hoc:\n//   - Opcodes other than the push opcodes and unknown are present as\n//     either OP_NAME or just NAME\n//   - Plain numbers are made into push operations\n//   - Numbers beginning with 0x are inserted into the []byte as-is (so\n//     0x14 is OP_DATA_20)\n//   - Single quoted strings are pushed as data\n//   - Anything else is an error\nfunc parseShortForm(script string) ([]byte, error) {\n\t// Only create the short form opcode map once.\n\tif shortFormOps == nil {\n\t\tops := make(map[string]byte)\n\t\tfor opcodeName, opcodeValue := range OpcodeByName {\n\t\t\tif strings.Contains(opcodeName, \"OP_UNKNOWN\") {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tops[opcodeName] = opcodeValue\n\n\t\t\t// The opcodes named OP_# can't have the OP_ prefix\n\t\t\t// stripped or they would conflict with the plain\n\t\t\t// numbers.  Also, since OP_FALSE and OP_TRUE are\n\t\t\t// aliases for the OP_0, and OP_1, respectively, they\n\t\t\t// have the same value, so detect those by name and\n\t\t\t// allow them.\n\t\t\tif (opcodeName == \"OP_FALSE\" || opcodeName == \"OP_TRUE\") ||\n\t\t\t\t(opcodeValue != OP_0 && (opcodeValue < OP_1 ||\n\t\t\t\t\topcodeValue > OP_16)) {\n\n\t\t\t\tops[strings.TrimPrefix(opcodeName, \"OP_\")] = opcodeValue\n\t\t\t}\n\t\t}\n\t\tshortFormOps = ops\n\t}\n\n\t// Split only does one separator so convert all \\n and tab into  space.\n\tscript = strings.Replace(script, \"\\n\", \" \", -1)\n\tscript = strings.Replace(script, \"\\t\", \" \", -1)\n\ttokens := strings.Split(script, \" \")\n\tbuilder := NewScriptBuilder()\n\n\tfor _, tok := range tokens {\n\t\tif len(tok) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\t// if parses as a plain number\n\t\tif num, err := strconv.ParseInt(tok, 10, 64); err == nil {\n\t\t\tbuilder.AddInt64(num)\n\t\t\tcontinue\n\t\t} else if bts, err := parseHex(tok); err == nil {\n\t\t\t// Concatenate the bytes manually since the test code\n\t\t\t// intentionally creates scripts that are too large and\n\t\t\t// would cause the builder to error otherwise.\n\t\t\tif builder.err == nil {\n\t\t\t\tbuilder.script = append(builder.script, bts...)\n\t\t\t}\n\t\t} else if len(tok) >= 2 &&\n\t\t\ttok[0] == '\\'' && tok[len(tok)-1] == '\\'' {\n\t\t\tbuilder.AddFullData([]byte(tok[1 : len(tok)-1]))\n\t\t} else if opcode, ok := shortFormOps[tok]; ok {\n\t\t\tbuilder.AddOp(opcode)\n\t\t} else {\n\t\t\treturn nil, fmt.Errorf(\"bad token %q\", tok)\n\t\t}\n\n\t}\n\treturn builder.Script()\n}\n\n// parseScriptFlags parses the provided flags string from the format used in the\n// reference tests into ScriptFlags suitable for use in the script engine.\nfunc parseScriptFlags(flagStr string) (ScriptFlags, error) {\n\tvar flags ScriptFlags\n\n\tsFlags := strings.Split(flagStr, \",\")\n\tfor _, flag := range sFlags {\n\t\tswitch flag {\n\t\tcase \"\":\n\t\t\t// Nothing.\n\t\tcase \"CHECKLOCKTIMEVERIFY\":\n\t\t\tflags |= ScriptVerifyCheckLockTimeVerify\n\t\tcase \"CHECKSEQUENCEVERIFY\":\n\t\t\tflags |= ScriptVerifyCheckSequenceVerify\n\t\tcase \"CLEANSTACK\":\n\t\t\tflags |= ScriptVerifyCleanStack\n\t\tcase \"DERSIG\":\n\t\t\tflags |= ScriptVerifyDERSignatures\n\t\tcase \"DISCOURAGE_UPGRADABLE_NOPS\":\n\t\t\tflags |= ScriptDiscourageUpgradableNops\n\t\tcase \"LOW_S\":\n\t\t\tflags |= ScriptVerifyLowS\n\t\tcase \"MINIMALDATA\":\n\t\t\tflags |= ScriptVerifyMinimalData\n\t\tcase \"NONE\":\n\t\t\t// Nothing.\n\t\tcase \"NULLDUMMY\":\n\t\t\tflags |= ScriptStrictMultiSig\n\t\tcase \"NULLFAIL\":\n\t\t\tflags |= ScriptVerifyNullFail\n\t\tcase \"P2SH\":\n\t\t\tflags |= ScriptBip16\n\t\tcase \"SIGPUSHONLY\":\n\t\t\tflags |= ScriptVerifySigPushOnly\n\t\tcase \"STRICTENC\":\n\t\t\tflags |= ScriptVerifyStrictEncoding\n\t\tcase \"WITNESS\":\n\t\t\tflags |= ScriptVerifyWitness\n\t\tcase \"DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM\":\n\t\t\tflags |= ScriptVerifyDiscourageUpgradeableWitnessProgram\n\t\tcase \"MINIMALIF\":\n\t\t\tflags |= ScriptVerifyMinimalIf\n\t\tcase \"WITNESS_PUBKEYTYPE\":\n\t\t\tflags |= ScriptVerifyWitnessPubKeyType\n\t\tcase \"TAPROOT\":\n\t\t\tflags |= ScriptVerifyTaproot\n\t\tcase \"CONST_SCRIPTCODE\":\n\t\t\tflags |= ScriptVerifyConstScriptCode\n\t\tdefault:\n\t\t\treturn flags, fmt.Errorf(\"invalid flag: %s\", flag)\n\t\t}\n\t}\n\treturn flags, nil\n}\n\n// parseExpectedResult parses the provided expected result string into allowed\n// script error codes.  An error is returned if the expected result string is\n// not supported.\nfunc parseExpectedResult(expected string) ([]ErrorCode, error) {\n\tswitch expected {\n\tcase \"OK\":\n\t\treturn nil, nil\n\tcase \"UNKNOWN_ERROR\":\n\t\treturn []ErrorCode{ErrNumberTooBig, ErrMinimalData}, nil\n\tcase \"PUBKEYTYPE\":\n\t\treturn []ErrorCode{ErrPubKeyType}, nil\n\tcase \"SIG_DER\":\n\t\treturn []ErrorCode{ErrSigTooShort, ErrSigTooLong,\n\t\t\tErrSigInvalidSeqID, ErrSigInvalidDataLen, ErrSigMissingSTypeID,\n\t\t\tErrSigMissingSLen, ErrSigInvalidSLen,\n\t\t\tErrSigInvalidRIntID, ErrSigZeroRLen, ErrSigNegativeR,\n\t\t\tErrSigTooMuchRPadding, ErrSigInvalidSIntID,\n\t\t\tErrSigZeroSLen, ErrSigNegativeS, ErrSigTooMuchSPadding,\n\t\t\tErrInvalidSigHashType}, nil\n\tcase \"EVAL_FALSE\":\n\t\treturn []ErrorCode{ErrEvalFalse, ErrEmptyStack}, nil\n\tcase \"EQUALVERIFY\":\n\t\treturn []ErrorCode{ErrEqualVerify}, nil\n\tcase \"NULLFAIL\":\n\t\treturn []ErrorCode{ErrNullFail}, nil\n\tcase \"SIG_HIGH_S\":\n\t\treturn []ErrorCode{ErrSigHighS}, nil\n\tcase \"SIG_HASHTYPE\":\n\t\treturn []ErrorCode{ErrInvalidSigHashType}, nil\n\tcase \"SIG_NULLDUMMY\":\n\t\treturn []ErrorCode{ErrSigNullDummy}, nil\n\tcase \"SIG_PUSHONLY\":\n\t\treturn []ErrorCode{ErrNotPushOnly}, nil\n\tcase \"CLEANSTACK\":\n\t\treturn []ErrorCode{ErrCleanStack}, nil\n\tcase \"BAD_OPCODE\":\n\t\treturn []ErrorCode{ErrReservedOpcode, ErrMalformedPush}, nil\n\tcase \"UNBALANCED_CONDITIONAL\":\n\t\treturn []ErrorCode{ErrUnbalancedConditional,\n\t\t\tErrInvalidStackOperation}, nil\n\tcase \"OP_RETURN\":\n\t\treturn []ErrorCode{ErrEarlyReturn}, nil\n\tcase \"VERIFY\":\n\t\treturn []ErrorCode{ErrVerify}, nil\n\tcase \"INVALID_STACK_OPERATION\", \"INVALID_ALTSTACK_OPERATION\":\n\t\treturn []ErrorCode{ErrInvalidStackOperation}, nil\n\tcase \"DISABLED_OPCODE\":\n\t\treturn []ErrorCode{ErrDisabledOpcode}, nil\n\tcase \"DISCOURAGE_UPGRADABLE_NOPS\":\n\t\treturn []ErrorCode{ErrDiscourageUpgradableNOPs}, nil\n\tcase \"PUSH_SIZE\":\n\t\treturn []ErrorCode{ErrElementTooBig}, nil\n\tcase \"OP_COUNT\":\n\t\treturn []ErrorCode{ErrTooManyOperations}, nil\n\tcase \"STACK_SIZE\":\n\t\treturn []ErrorCode{ErrStackOverflow}, nil\n\tcase \"SCRIPT_SIZE\":\n\t\treturn []ErrorCode{ErrScriptTooBig}, nil\n\tcase \"PUBKEY_COUNT\":\n\t\treturn []ErrorCode{ErrInvalidPubKeyCount}, nil\n\tcase \"SIG_COUNT\":\n\t\treturn []ErrorCode{ErrInvalidSignatureCount}, nil\n\tcase \"MINIMALDATA\":\n\t\treturn []ErrorCode{ErrMinimalData}, nil\n\tcase \"NEGATIVE_LOCKTIME\":\n\t\treturn []ErrorCode{ErrNegativeLockTime}, nil\n\tcase \"UNSATISFIED_LOCKTIME\":\n\t\treturn []ErrorCode{ErrUnsatisfiedLockTime}, nil\n\tcase \"MINIMALIF\":\n\t\treturn []ErrorCode{ErrMinimalIf}, nil\n\tcase \"DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM\":\n\t\treturn []ErrorCode{ErrDiscourageUpgradableWitnessProgram}, nil\n\tcase \"WITNESS_PROGRAM_WRONG_LENGTH\":\n\t\treturn []ErrorCode{ErrWitnessProgramWrongLength}, nil\n\tcase \"WITNESS_PROGRAM_WITNESS_EMPTY\":\n\t\treturn []ErrorCode{ErrWitnessProgramEmpty}, nil\n\tcase \"WITNESS_PROGRAM_MISMATCH\":\n\t\treturn []ErrorCode{ErrWitnessProgramMismatch}, nil\n\tcase \"WITNESS_MALLEATED\":\n\t\treturn []ErrorCode{ErrWitnessMalleated}, nil\n\tcase \"WITNESS_MALLEATED_P2SH\":\n\t\treturn []ErrorCode{ErrWitnessMalleatedP2SH}, nil\n\tcase \"WITNESS_UNEXPECTED\":\n\t\treturn []ErrorCode{ErrWitnessUnexpected}, nil\n\tcase \"WITNESS_PUBKEYTYPE\":\n\t\treturn []ErrorCode{ErrWitnessPubKeyType}, nil\n\t}\n\n\treturn nil, fmt.Errorf(\"unrecognized expected result in test data: %v\",\n\t\texpected)\n}\n\n// createSpendTx generates a basic spending transaction given the passed\n// signature, witness and public key scripts.\nfunc createSpendingTx(witness [][]byte, sigScript, pkScript []byte,\n\toutputValue int64) *wire.MsgTx {\n\n\tcoinbaseTx := wire.NewMsgTx(wire.TxVersion)\n\n\toutPoint := wire.NewOutPoint(&chainhash.Hash{}, ^uint32(0))\n\ttxIn := wire.NewTxIn(outPoint, []byte{OP_0, OP_0}, nil)\n\ttxOut := wire.NewTxOut(outputValue, pkScript)\n\tcoinbaseTx.AddTxIn(txIn)\n\tcoinbaseTx.AddTxOut(txOut)\n\n\tspendingTx := wire.NewMsgTx(wire.TxVersion)\n\tcoinbaseTxSha := coinbaseTx.TxHash()\n\toutPoint = wire.NewOutPoint(&coinbaseTxSha, 0)\n\ttxIn = wire.NewTxIn(outPoint, sigScript, witness)\n\ttxOut = wire.NewTxOut(outputValue, nil)\n\n\tspendingTx.AddTxIn(txIn)\n\tspendingTx.AddTxOut(txOut)\n\n\treturn spendingTx\n}\n\n// scriptWithInputVal wraps a target pkScript with the value of the output in\n// which it is contained. The inputVal is necessary in order to properly\n// validate inputs which spend nested, or native witness programs.\ntype scriptWithInputVal struct {\n\tinputVal int64\n\tpkScript []byte\n}\n\n// testScripts ensures all of the passed script tests execute with the expected\n// results with or without using a signature cache, as specified by the\n// parameter.\nfunc testScripts(t *testing.T, tests [][]interface{}, useSigCache bool) {\n\t// Create a signature cache to use only if requested.\n\tvar sigCache *SigCache\n\tif useSigCache {\n\t\tsigCache = NewSigCache(10)\n\t}\n\n\tfor i, test := range tests {\n\t\t// \"Format is: [[wit..., amount]?, scriptSig, scriptPubKey,\n\t\t//    flags, expected_scripterror, ... comments]\"\n\n\t\t// Skip single line comments.\n\t\tif len(test) == 1 {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Construct a name for the test based on the comment and test\n\t\t// data.\n\t\tname, err := scriptTestName(test)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"TestScripts: invalid test #%d: %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar (\n\t\t\twitness  wire.TxWitness\n\t\t\tinputAmt btcutil.Amount\n\t\t)\n\n\t\t// When the first field of the test data is a slice it contains\n\t\t// witness data and everything else is offset by 1 as a result.\n\t\twitnessOffset := 0\n\t\tif witnessData, ok := test[0].([]interface{}); ok {\n\t\t\twitnessOffset++\n\n\t\t\t// If this is a witness test, then the final element\n\t\t\t// within the slice is the input amount, so we ignore\n\t\t\t// all but the last element in order to parse the\n\t\t\t// witness stack.\n\t\t\tstrWitnesses := witnessData[:len(witnessData)-1]\n\t\t\twitness, err = parseWitnessStack(strWitnesses)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"%s: can't parse witness; %v\", name, err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tinputAmt, err = btcutil.NewAmount(witnessData[len(witnessData)-1].(float64))\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"%s: can't parse input amt: %v\",\n\t\t\t\t\tname, err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t}\n\n\t\t// Extract and parse the signature script from the test fields.\n\t\tscriptSigStr, ok := test[witnessOffset].(string)\n\t\tif !ok {\n\t\t\tt.Errorf(\"%s: signature script is not a string\", name)\n\t\t\tcontinue\n\t\t}\n\t\tscriptSig, err := parseShortForm(scriptSigStr)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%s: can't parse signature script: %v\", name,\n\t\t\t\terr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Extract and parse the public key script from the test fields.\n\t\tscriptPubKeyStr, ok := test[witnessOffset+1].(string)\n\t\tif !ok {\n\t\t\tt.Errorf(\"%s: public key script is not a string\", name)\n\t\t\tcontinue\n\t\t}\n\t\tscriptPubKey, err := parseShortForm(scriptPubKeyStr)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%s: can't parse public key script: %v\", name,\n\t\t\t\terr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Extract and parse the script flags from the test fields.\n\t\tflagsStr, ok := test[witnessOffset+2].(string)\n\t\tif !ok {\n\t\t\tt.Errorf(\"%s: flags field is not a string\", name)\n\t\t\tcontinue\n\t\t}\n\t\tflags, err := parseScriptFlags(flagsStr)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%s: %v\", name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Extract and parse the expected result from the test fields.\n\t\t//\n\t\t// Convert the expected result string into the allowed script\n\t\t// error codes.  This is necessary because txscript is more\n\t\t// fine grained with its errors than the reference test data, so\n\t\t// some of the reference test data errors map to more than one\n\t\t// possibility.\n\t\tresultStr, ok := test[witnessOffset+3].(string)\n\t\tif !ok {\n\t\t\tt.Errorf(\"%s: result field is not a string\", name)\n\t\t\tcontinue\n\t\t}\n\t\tallowedErrorCodes, err := parseExpectedResult(resultStr)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%s: %v\", name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Generate a transaction pair such that one spends from the\n\t\t// other and the provided signature and public key scripts are\n\t\t// used, then create a new engine to execute the scripts.\n\t\ttx := createSpendingTx(\n\t\t\twitness, scriptSig, scriptPubKey, int64(inputAmt),\n\t\t)\n\t\tprevOuts := NewCannedPrevOutputFetcher(scriptPubKey, int64(inputAmt))\n\t\tvm, err := NewEngine(\n\t\t\tscriptPubKey, tx, 0, flags, sigCache, nil,\n\t\t\tint64(inputAmt), prevOuts,\n\t\t)\n\t\tif err == nil {\n\t\t\terr = vm.Execute()\n\t\t}\n\n\t\t// Ensure there were no errors when the expected result is OK.\n\t\tif resultStr == \"OK\" {\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"%s failed to execute: %v\", name, err)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// At this point an error was expected so ensure the result of\n\t\t// the execution matches it.\n\t\tsuccess := false\n\t\tfor _, code := range allowedErrorCodes {\n\t\t\tif IsErrorCode(err, code) {\n\t\t\t\tsuccess = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !success {\n\t\t\tif serr, ok := err.(Error); ok {\n\t\t\t\tt.Errorf(\"%s: want error codes %v, got %v\", name,\n\t\t\t\t\tallowedErrorCodes, serr.ErrorCode)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tt.Errorf(\"%s: want error codes %v, got err: %v (%T)\",\n\t\t\t\tname, allowedErrorCodes, err, err)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestScripts ensures all of the tests in script_tests.json execute with the\n// expected results as defined in the test data.\nfunc TestScripts(t *testing.T) {\n\tfile, err := os.ReadFile(\"data/script_tests.json\")\n\tif err != nil {\n\t\tt.Fatalf(\"TestScripts: %v\\n\", err)\n\t}\n\n\tvar tests [][]interface{}\n\terr = json.Unmarshal(file, &tests)\n\tif err != nil {\n\t\tt.Fatalf(\"TestScripts couldn't Unmarshal: %v\", err)\n\t}\n\n\t// Run all script tests with and without the signature cache.\n\ttestScripts(t, tests, true)\n\ttestScripts(t, tests, false)\n}\n\n// testVecF64ToUint32 properly handles conversion of float64s read from the JSON\n// test data to unsigned 32-bit integers.  This is necessary because some of the\n// test data uses -1 as a shortcut to mean max uint32 and direct conversion of a\n// negative float to an unsigned int is implementation dependent and therefore\n// doesn't result in the expected value on all platforms.  This function woks\n// around that limitation by converting to a 32-bit signed integer first and\n// then to a 32-bit unsigned integer which results in the expected behavior on\n// all platforms.\nfunc testVecF64ToUint32(f float64) uint32 {\n\treturn uint32(int32(f))\n}\n\n// TestTxInvalidTests ensures all of the tests in tx_invalid.json fail as\n// expected.\nfunc TestTxInvalidTests(t *testing.T) {\n\tfile, err := os.ReadFile(\"data/tx_invalid.json\")\n\tif err != nil {\n\t\tt.Fatalf(\"TestTxInvalidTests: %v\\n\", err)\n\t}\n\n\tvar tests [][]interface{}\n\terr = json.Unmarshal(file, &tests)\n\tif err != nil {\n\t\tt.Fatalf(\"TestTxInvalidTests couldn't Unmarshal: %v\\n\", err)\n\t}\n\n\t// form is either:\n\t//   [\"this is a comment \"]\n\t// or:\n\t//   [[[previous hash, previous index, previous scriptPubKey]...,]\n\t//\tserializedTransaction, verifyFlags]\ntestloop:\n\tfor i, test := range tests {\n\t\tinputs, ok := test[0].([]interface{})\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tif len(test) != 3 {\n\t\t\tt.Errorf(\"bad test (bad length) %d: %v\", i, test)\n\t\t\tcontinue\n\n\t\t}\n\t\tserializedhex, ok := test[1].(string)\n\t\tif !ok {\n\t\t\tt.Errorf(\"bad test (arg 2 not string) %d: %v\", i, test)\n\t\t\tcontinue\n\t\t}\n\t\tserializedTx, err := hex.DecodeString(serializedhex)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"bad test (arg 2 not hex %v) %d: %v\", err, i,\n\t\t\t\ttest)\n\t\t\tcontinue\n\t\t}\n\n\t\ttx, err := btcutil.NewTxFromBytes(serializedTx)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"bad test (arg 2 not msgtx %v) %d: %v\", err,\n\t\t\t\ti, test)\n\t\t\tcontinue\n\t\t}\n\n\t\tverifyFlags, ok := test[2].(string)\n\t\tif !ok {\n\t\t\tt.Errorf(\"bad test (arg 3 not string) %d: %v\", i, test)\n\t\t\tcontinue\n\t\t}\n\n\t\tflags, err := parseScriptFlags(verifyFlags)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"bad test %d: %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tprevOutFetcher := NewMultiPrevOutFetcher(nil)\n\t\tfor j, iinput := range inputs {\n\t\t\tinput, ok := iinput.([]interface{})\n\t\t\tif !ok {\n\t\t\t\tt.Errorf(\"bad test (%dth input not array)\"+\n\t\t\t\t\t\"%d: %v\", j, i, test)\n\t\t\t\tcontinue testloop\n\t\t\t}\n\n\t\t\tif len(input) < 3 || len(input) > 4 {\n\t\t\t\tt.Errorf(\"bad test (%dth input wrong length)\"+\n\t\t\t\t\t\"%d: %v\", j, i, test)\n\t\t\t\tcontinue testloop\n\t\t\t}\n\n\t\t\tprevioustx, ok := input[0].(string)\n\t\t\tif !ok {\n\t\t\t\tt.Errorf(\"bad test (%dth input hash not string)\"+\n\t\t\t\t\t\"%d: %v\", j, i, test)\n\t\t\t\tcontinue testloop\n\t\t\t}\n\n\t\t\tprevhash, err := chainhash.NewHashFromStr(previoustx)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"bad test (%dth input hash not hash %v)\"+\n\t\t\t\t\t\"%d: %v\", j, err, i, test)\n\t\t\t\tcontinue testloop\n\t\t\t}\n\n\t\t\tidxf, ok := input[1].(float64)\n\t\t\tif !ok {\n\t\t\t\tt.Errorf(\"bad test (%dth input idx not number)\"+\n\t\t\t\t\t\"%d: %v\", j, i, test)\n\t\t\t\tcontinue testloop\n\t\t\t}\n\t\t\tidx := testVecF64ToUint32(idxf)\n\n\t\t\toscript, ok := input[2].(string)\n\t\t\tif !ok {\n\t\t\t\tt.Errorf(\"bad test (%dth input script not \"+\n\t\t\t\t\t\"string) %d: %v\", j, i, test)\n\t\t\t\tcontinue testloop\n\t\t\t}\n\n\t\t\tscript, err := parseShortForm(oscript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"bad test (%dth input script doesn't \"+\n\t\t\t\t\t\"parse %v) %d: %v\", j, err, i, test)\n\t\t\t\tcontinue testloop\n\t\t\t}\n\n\t\t\tvar inputValue float64\n\t\t\tif len(input) == 4 {\n\t\t\t\tinputValue, ok = input[3].(float64)\n\t\t\t\tif !ok {\n\t\t\t\t\tt.Errorf(\"bad test (%dth input value not int) \"+\n\t\t\t\t\t\t\"%d: %v\", j, i, test)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\top := wire.NewOutPoint(prevhash, idx)\n\t\t\tprevOutFetcher.AddPrevOut(*op, &wire.TxOut{\n\t\t\t\tValue:    int64(inputValue),\n\t\t\t\tPkScript: script,\n\t\t\t})\n\t\t}\n\n\t\tfor k, txin := range tx.MsgTx().TxIn {\n\t\t\tprevOut := prevOutFetcher.FetchPrevOutput(\n\t\t\t\ttxin.PreviousOutPoint,\n\t\t\t)\n\t\t\tif prevOut == nil {\n\t\t\t\tt.Errorf(\"bad test (missing %dth input) %d:%v\",\n\t\t\t\t\tk, i, test)\n\t\t\t\tcontinue testloop\n\t\t\t}\n\t\t\t// These are meant to fail, so as soon as the first\n\t\t\t// input fails the transaction has failed. (some of the\n\t\t\t// test txns have good inputs, too..\n\t\t\tvm, err := NewEngine(prevOut.PkScript, tx.MsgTx(), k,\n\t\t\t\tflags, nil, nil, prevOut.Value, prevOutFetcher)\n\t\t\tif err != nil {\n\t\t\t\tcontinue testloop\n\t\t\t}\n\n\t\t\terr = vm.Execute()\n\t\t\tif err != nil {\n\t\t\t\tcontinue testloop\n\t\t\t}\n\n\t\t}\n\t\tt.Errorf(\"test (%d:%v) succeeded when should fail\",\n\t\t\ti, test)\n\t}\n}\n\n// TestTxValidTests ensures all of the tests in tx_valid.json pass as expected.\nfunc TestTxValidTests(t *testing.T) {\n\tfile, err := os.ReadFile(\"data/tx_valid.json\")\n\tif err != nil {\n\t\tt.Fatalf(\"TestTxValidTests: %v\\n\", err)\n\t}\n\n\tvar tests [][]interface{}\n\terr = json.Unmarshal(file, &tests)\n\tif err != nil {\n\t\tt.Fatalf(\"TestTxValidTests couldn't Unmarshal: %v\\n\", err)\n\t}\n\n\t// form is either:\n\t//   [\"this is a comment \"]\n\t// or:\n\t//   [[[previous hash, previous index, previous scriptPubKey, input value]...,]\n\t//\tserializedTransaction, verifyFlags]\ntestloop:\n\tfor i, test := range tests {\n\t\tinputs, ok := test[0].([]interface{})\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tif len(test) != 3 {\n\t\t\tt.Errorf(\"bad test (bad length) %d: %v\", i, test)\n\t\t\tcontinue\n\t\t}\n\t\tserializedhex, ok := test[1].(string)\n\t\tif !ok {\n\t\t\tt.Errorf(\"bad test (arg 2 not string) %d: %v\", i, test)\n\t\t\tcontinue\n\t\t}\n\t\tserializedTx, err := hex.DecodeString(serializedhex)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"bad test (arg 2 not hex %v) %d: %v\", err, i,\n\t\t\t\ttest)\n\t\t\tcontinue\n\t\t}\n\n\t\ttx, err := btcutil.NewTxFromBytes(serializedTx)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"bad test (arg 2 not msgtx %v) %d: %v\", err,\n\t\t\t\ti, test)\n\t\t\tcontinue\n\t\t}\n\n\t\tverifyFlags, ok := test[2].(string)\n\t\tif !ok {\n\t\t\tt.Errorf(\"bad test (arg 3 not string) %d: %v\", i, test)\n\t\t\tcontinue\n\t\t}\n\n\t\tflags, err := parseScriptFlags(verifyFlags)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"bad test %d: %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tprevOutFetcher := NewMultiPrevOutFetcher(nil)\n\t\tfor j, iinput := range inputs {\n\t\t\tinput, ok := iinput.([]interface{})\n\t\t\tif !ok {\n\t\t\t\tt.Errorf(\"bad test (%dth input not array)\"+\n\t\t\t\t\t\"%d: %v\", j, i, test)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif len(input) < 3 || len(input) > 4 {\n\t\t\t\tt.Errorf(\"bad test (%dth input wrong length)\"+\n\t\t\t\t\t\"%d: %v\", j, i, test)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tprevioustx, ok := input[0].(string)\n\t\t\tif !ok {\n\t\t\t\tt.Errorf(\"bad test (%dth input hash not string)\"+\n\t\t\t\t\t\"%d: %v\", j, i, test)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tprevhash, err := chainhash.NewHashFromStr(previoustx)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"bad test (%dth input hash not hash %v)\"+\n\t\t\t\t\t\"%d: %v\", j, err, i, test)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tidxf, ok := input[1].(float64)\n\t\t\tif !ok {\n\t\t\t\tt.Errorf(\"bad test (%dth input idx not number)\"+\n\t\t\t\t\t\"%d: %v\", j, i, test)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tidx := testVecF64ToUint32(idxf)\n\n\t\t\toscript, ok := input[2].(string)\n\t\t\tif !ok {\n\t\t\t\tt.Errorf(\"bad test (%dth input script not \"+\n\t\t\t\t\t\"string) %d: %v\", j, i, test)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tscript, err := parseShortForm(oscript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"bad test (%dth input script doesn't \"+\n\t\t\t\t\t\"parse %v) %d: %v\", j, err, i, test)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tvar inputValue float64\n\t\t\tif len(input) == 4 {\n\t\t\t\tinputValue, ok = input[3].(float64)\n\t\t\t\tif !ok {\n\t\t\t\t\tt.Errorf(\"bad test (%dth input value not int) \"+\n\t\t\t\t\t\t\"%d: %v\", j, i, test)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\top := wire.NewOutPoint(prevhash, idx)\n\t\t\tprevOutFetcher.AddPrevOut(*op, &wire.TxOut{\n\t\t\t\tValue:    int64(inputValue),\n\t\t\t\tPkScript: script,\n\t\t\t})\n\t\t}\n\n\t\tfor k, txin := range tx.MsgTx().TxIn {\n\t\t\tprevOut := prevOutFetcher.FetchPrevOutput(\n\t\t\t\ttxin.PreviousOutPoint,\n\t\t\t)\n\t\t\tif prevOut == nil {\n\t\t\t\tt.Errorf(\"bad test (missing %dth input) %d:%v\",\n\t\t\t\t\tk, i, test)\n\t\t\t\tcontinue testloop\n\t\t\t}\n\t\t\tvm, err := NewEngine(prevOut.PkScript, tx.MsgTx(), k,\n\t\t\t\tflags, nil, nil, prevOut.Value, prevOutFetcher)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"test (%d:%v:%d) failed to create \"+\n\t\t\t\t\t\"script: %v\", i, test, k, err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\terr = vm.Execute()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"test (%d:%v:%d) failed to execute: \"+\n\t\t\t\t\t\"%v\", i, test, k, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestCalcSignatureHash runs the Bitcoin Core signature hash calculation tests\n// in sighash.json.\n// https://github.com/bitcoin/bitcoin/blob/master/src/test/data/sighash.json\nfunc TestCalcSignatureHash(t *testing.T) {\n\tfile, err := os.ReadFile(\"data/sighash.json\")\n\tif err != nil {\n\t\tt.Fatalf(\"TestCalcSignatureHash: %v\\n\", err)\n\t}\n\n\tvar tests [][]interface{}\n\terr = json.Unmarshal(file, &tests)\n\tif err != nil {\n\t\tt.Fatalf(\"TestCalcSignatureHash couldn't Unmarshal: %v\\n\",\n\t\t\terr)\n\t}\n\n\tconst scriptVersion = 0\n\tfor i, test := range tests {\n\t\tif i == 0 {\n\t\t\t// Skip first line -- contains comments only.\n\t\t\tcontinue\n\t\t}\n\t\tif len(test) != 5 {\n\t\t\tt.Fatalf(\"TestCalcSignatureHash: Test #%d has \"+\n\t\t\t\t\"wrong length.\", i)\n\t\t}\n\t\tvar tx wire.MsgTx\n\t\trawTx, _ := hex.DecodeString(test[0].(string))\n\t\terr := tx.Deserialize(bytes.NewReader(rawTx))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"TestCalcSignatureHash failed test #%d: \"+\n\t\t\t\t\"Failed to parse transaction: %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tsubScript, _ := hex.DecodeString(test[1].(string))\n\t\tif err := checkScriptParses(scriptVersion, subScript); err != nil {\n\t\t\tt.Errorf(\"TestCalcSignatureHash failed test #%d: \"+\n\t\t\t\t\"Failed to parse sub-script: %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\n\t\thashType := SigHashType(testVecF64ToUint32(test[3].(float64)))\n\t\thash, err := CalcSignatureHash(subScript, hashType, &tx,\n\t\t\tint(test[2].(float64)))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"TestCalcSignatureHash failed test #%d: \"+\n\t\t\t\t\"Failed to compute sighash: %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\n\t\texpectedHash, _ := chainhash.NewHashFromStr(test[4].(string))\n\t\tif !bytes.Equal(hash, expectedHash[:]) {\n\t\t\tt.Errorf(\"TestCalcSignatureHash failed test #%d: \"+\n\t\t\t\t\"Signature hash mismatch.\", i)\n\t\t}\n\t}\n}\n\ntype inputWitness struct {\n\tScriptSig string   `json:\"scriptSig\"`\n\tWitness   []string `json:\"witness\"`\n}\n\ntype taprootJsonTest struct {\n\tTx       string   `json:\"tx\"`\n\tPrevouts []string `json:\"prevouts\"`\n\tIndex    int      `json:\"index\"`\n\tFlags    string   `json:\"flags\"`\n\n\tComment string `json:\"comment\"`\n\n\tSuccess *inputWitness `json:\"success\"`\n\n\tFailure *inputWitness `json:\"failure\"`\n}\n\nfunc executeTaprootRefTest(t *testing.T, testCase taprootJsonTest) {\n\tt.Helper()\n\n\ttxHex, err := hex.DecodeString(testCase.Tx)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to decode hex: %v\", err)\n\t}\n\ttx, err := btcutil.NewTxFromBytes(txHex)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to decode hex: %v\", err)\n\t}\n\n\tvar prevOut wire.TxOut\n\n\tprevOutFetcher := NewMultiPrevOutFetcher(nil)\n\tfor i, prevOutString := range testCase.Prevouts {\n\t\tprevOutBytes, err := hex.DecodeString(prevOutString)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to decode hex: %v\", err)\n\t\t}\n\n\t\tvar txOut wire.TxOut\n\t\terr = wire.ReadTxOut(\n\t\t\tbytes.NewReader(prevOutBytes), 0, 0, &txOut,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to read utxo: %v\", err)\n\t\t}\n\n\t\tprevOutFetcher.AddPrevOut(\n\t\t\ttx.MsgTx().TxIn[i].PreviousOutPoint, &txOut,\n\t\t)\n\n\t\tif i == testCase.Index {\n\t\t\tprevOut = txOut\n\t\t}\n\t}\n\n\tflags, err := parseScriptFlags(testCase.Flags)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to parse flags: %v\", err)\n\t}\n\n\tmakeVM := func() *Engine {\n\t\thashCache := NewTxSigHashes(tx.MsgTx(), prevOutFetcher)\n\n\t\tvm, err := NewEngine(\n\t\t\tprevOut.PkScript, tx.MsgTx(), testCase.Index,\n\t\t\tflags, nil, hashCache, prevOut.Value, prevOutFetcher,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to create vm: %v\", err)\n\t\t}\n\n\t\treturn vm\n\t}\n\n\tif testCase.Success != nil {\n\t\ttx.MsgTx().TxIn[testCase.Index].SignatureScript, err = hex.DecodeString(\n\t\t\ttestCase.Success.ScriptSig,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to parse sig script: %v\", err)\n\t\t}\n\n\t\tvar witness [][]byte\n\t\tfor _, witnessStr := range testCase.Success.Witness {\n\t\t\twitElem, err := hex.DecodeString(witnessStr)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unable to parse witness stack: %v\", err)\n\t\t\t}\n\n\t\t\twitness = append(witness, witElem)\n\t\t}\n\n\t\ttx.MsgTx().TxIn[testCase.Index].Witness = witness\n\n\t\tvm := makeVM()\n\n\t\terr = vm.Execute()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"test (%v) failed to execute: \"+\n\t\t\t\t\"%v\", testCase.Comment, err)\n\t\t}\n\t}\n\n\tif testCase.Failure != nil {\n\t\ttx.MsgTx().TxIn[testCase.Index].SignatureScript, err = hex.DecodeString(\n\t\t\ttestCase.Failure.ScriptSig,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to parse sig script: %v\", err)\n\t\t}\n\n\t\tvar witness [][]byte\n\t\tfor _, witnessStr := range testCase.Failure.Witness {\n\t\t\twitElem, err := hex.DecodeString(witnessStr)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unable to parse witness stack: %v\", err)\n\t\t\t}\n\n\t\t\twitness = append(witness, witElem)\n\t\t}\n\n\t\ttx.MsgTx().TxIn[testCase.Index].Witness = witness\n\n\t\tvm := makeVM()\n\n\t\terr = vm.Execute()\n\t\tif err == nil {\n\t\t\tt.Fatalf(\"test (%v) succeeded, should fail: \"+\n\t\t\t\t\"%v\", testCase.Comment, err)\n\t\t}\n\t}\n}\n\n// TestTaprootReferenceTests test that we're able to properly validate (success\n// and failure paths for each test) the set of functional generative tests\n// created by the bitcoind project for taproot at:\n// https://github.com/bitcoin/bitcoin/blob/master/test/functional/feature_taproot.py.\nfunc TestTaprootReferenceTests(t *testing.T) {\n\tt.Parallel()\n\n\tfilePath := \"data/taproot-ref\"\n\n\ttestFunc := func(path string, info fs.FileInfo, walkErr error) error {\n\t\tif walkErr != nil {\n\t\t\treturn walkErr\n\t\t}\n\n\t\tif info.IsDir() {\n\t\t\tt.Logf(\"skipping dir: %v\", info.Name())\n\t\t\treturn nil\n\t\t}\n\n\t\ttestJson, err := os.ReadFile(path)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"unable to read file: %v\", err)\n\t\t}\n\n\t\t// All the JSON files have a trailing comma and a new line\n\t\t// character, so we'll remove that here before attempting to\n\t\t// parse it.\n\t\ttestJson = bytes.TrimSuffix(testJson, []byte(\",\\n\"))\n\n\t\tvar testCase taprootJsonTest\n\t\tif err := json.Unmarshal(testJson, &testCase); err != nil {\n\t\t\treturn fmt.Errorf(\"unable to decode json: %v\", err)\n\t\t}\n\n\t\ttestName := fmt.Sprintf(\n\t\t\t\"%v:%v\", testCase.Comment, filepath.Base(path),\n\t\t)\n\t\t_ = t.Run(testName, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\texecuteTaprootRefTest(t, testCase)\n\t\t})\n\n\t\treturn nil\n\t}\n\n\terr := filepath.Walk(filePath, testFunc)\n\tif err != nil {\n\t\tt.Fatalf(\"unable to execute taproot test vectors: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "txscript/script.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// Bip16Activation is the timestamp where BIP0016 is valid to use in the\n// blockchain.  To be used to determine if BIP0016 should be called for or not.\n// This timestamp corresponds to Sun Apr 1 00:00:00 UTC 2012.\nvar Bip16Activation = time.Unix(1333238400, 0)\n\nconst (\n\t// TaprootAnnexTag is the tag for an annex. This value is used to\n\t// identify the annex during tapscript spends. If there're at least two\n\t// elements in the taproot witness stack, and the first byte of the\n\t// last element matches this tag, then we'll extract this as a distinct\n\t// item.\n\tTaprootAnnexTag = 0x50\n\n\t// TaprootLeafMask is the mask applied to the control block to extract\n\t// the leaf version and parity of the y-coordinate of the output key if\n\t// the taproot script leaf being spent.\n\tTaprootLeafMask = 0xfe\n)\n\n// These are the constants specified for maximums in individual scripts.\nconst (\n\tMaxOpsPerScript       = 201 // Max number of non-push operations.\n\tMaxPubKeysPerMultiSig = 20  // Multisig can't have more sigs than this.\n\tMaxScriptElementSize  = 520 // Max bytes pushable to the stack.\n)\n\n// IsSmallInt returns whether or not the opcode is considered a small integer,\n// which is an OP_0, or OP_1 through OP_16.\n//\n// NOTE: This function is only valid for version 0 opcodes.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc IsSmallInt(op byte) bool {\n\treturn op == OP_0 || (op >= OP_1 && op <= OP_16)\n}\n\n// IsPayToPubKey returns true if the script is in the standard pay-to-pubkey\n// (P2PK) format, false otherwise.\nfunc IsPayToPubKey(script []byte) bool {\n\treturn isPubKeyScript(script)\n}\n\n// IsPayToPubKeyHash returns true if the script is in the standard\n// pay-to-pubkey-hash (P2PKH) format, false otherwise.\nfunc IsPayToPubKeyHash(script []byte) bool {\n\treturn isPubKeyHashScript(script)\n}\n\n// IsPayToScriptHash returns true if the script is in the standard\n// pay-to-script-hash (P2SH) format, false otherwise.\n//\n// WARNING: This function always treats the passed script as version 0.  Great\n// care must be taken if introducing a new script version because it is used in\n// consensus which, unfortunately as of the time of this writing, does not check\n// script versions before determining if the script is a P2SH which means nodes\n// on existing rules will analyze new version scripts as if they were version 0.\nfunc IsPayToScriptHash(script []byte) bool {\n\treturn isScriptHashScript(script)\n}\n\n// IsPayToWitnessScriptHash returns true if the script is in the standard\n// pay-to-witness-script-hash (P2WSH) format, false otherwise.\nfunc IsPayToWitnessScriptHash(script []byte) bool {\n\treturn isWitnessScriptHashScript(script)\n}\n\n// IsPayToWitnessPubKeyHash returns true if the script is in the standard\n// pay-to-witness-pubkey-hash (P2WKH) format, false otherwise.\nfunc IsPayToWitnessPubKeyHash(script []byte) bool {\n\treturn isWitnessPubKeyHashScript(script)\n}\n\n// IsPayToTaproot returns true if the passed script is a standard\n// pay-to-taproot (PTTR) scripts, and false otherwise.\nfunc IsPayToTaproot(script []byte) bool {\n\treturn isWitnessTaprootScript(script)\n}\n\n// IsWitnessProgram returns true if the passed script is a valid witness\n// program which is encoded according to the passed witness program version. A\n// witness program must be a small integer (from 0-16), followed by 2-40 bytes\n// of pushed data.\nfunc IsWitnessProgram(script []byte) bool {\n\treturn isWitnessProgramScript(script)\n}\n\n// IsNullData returns true if the passed script is a null data script, false\n// otherwise.\nfunc IsNullData(script []byte) bool {\n\tconst scriptVersion = 0\n\treturn isNullDataScript(scriptVersion, script)\n}\n\n// ExtractWitnessProgramInfo attempts to extract the witness program version,\n// as well as the witness program itself from the passed script.\nfunc ExtractWitnessProgramInfo(script []byte) (int, []byte, error) {\n\t// If at this point, the scripts doesn't resemble a witness program,\n\t// then we'll exit early as there isn't a valid version or program to\n\t// extract.\n\tversion, program, valid := extractWitnessProgramInfo(script)\n\tif !valid {\n\t\treturn 0, nil, fmt.Errorf(\"script is not a witness program, \" +\n\t\t\t\"unable to extract version or witness program\")\n\t}\n\n\treturn version, program, nil\n}\n\n// IsPushOnlyScript returns whether or not the passed script only pushes data\n// according to the consensus definition of pushing data.\n//\n// WARNING: This function always treats the passed script as version 0.  Great\n// care must be taken if introducing a new script version because it is used in\n// consensus which, unfortunately as of the time of this writing, does not check\n// script versions before checking if it is a push only script which means nodes\n// on existing rules will treat new version scripts as if they were version 0.\nfunc IsPushOnlyScript(script []byte) bool {\n\tconst scriptVersion = 0\n\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\tfor tokenizer.Next() {\n\t\t// All opcodes up to OP_16 are data push instructions.\n\t\t// NOTE: This does consider OP_RESERVED to be a data push instruction,\n\t\t// but execution of OP_RESERVED will fail anyway and matches the\n\t\t// behavior required by consensus.\n\t\tif tokenizer.Opcode() > OP_16 {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn tokenizer.Err() == nil\n}\n\n// DisasmString formats a disassembled script for one line printing.  When the\n// script fails to parse, the returned string will contain the disassembled\n// script up to the point the failure occurred along with the string '[error]'\n// appended.  In addition, the reason the script failed to parse is returned\n// if the caller wants more information about the failure.\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc DisasmString(script []byte) (string, error) {\n\tconst scriptVersion = 0\n\n\tvar disbuf strings.Builder\n\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\tif tokenizer.Next() {\n\t\tdisasmOpcode(&disbuf, tokenizer.op, tokenizer.Data(), true)\n\t}\n\tfor tokenizer.Next() {\n\t\tdisbuf.WriteByte(' ')\n\t\tdisasmOpcode(&disbuf, tokenizer.op, tokenizer.Data(), true)\n\t}\n\tif tokenizer.Err() != nil {\n\t\tif tokenizer.ByteIndex() != 0 {\n\t\t\tdisbuf.WriteByte(' ')\n\t\t}\n\t\tdisbuf.WriteString(\"[error]\")\n\t}\n\treturn disbuf.String(), tokenizer.Err()\n}\n\n// removeOpcodeRaw will return the script after removing any opcodes that match\n// `opcode`. If the opcode does not appear in script, the original script will\n// be returned unmodified. Otherwise, a new script will be allocated to contain\n// the filtered script. This method assumes that the script parses\n// successfully.\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc removeOpcodeRaw(script []byte, opcode byte) []byte {\n\t// Avoid work when possible.\n\tif len(script) == 0 {\n\t\treturn script\n\t}\n\n\tconst scriptVersion = 0\n\tvar result []byte\n\tvar prevOffset int32\n\n\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\tfor tokenizer.Next() {\n\t\tif tokenizer.Opcode() == opcode {\n\t\t\tif result == nil {\n\t\t\t\tresult = make([]byte, 0, len(script))\n\t\t\t\tresult = append(result, script[:prevOffset]...)\n\t\t\t}\n\t\t} else if result != nil {\n\t\t\tresult = append(result, script[prevOffset:tokenizer.ByteIndex()]...)\n\t\t}\n\t\tprevOffset = tokenizer.ByteIndex()\n\t}\n\tif result == nil {\n\t\treturn script\n\t}\n\treturn result\n}\n\n// isCanonicalPush returns true if the opcode is either not a push instruction\n// or the data associated with the push instruction uses the smallest\n// instruction to do the job.  False otherwise.\n//\n// For example, it is possible to push a value of 1 to the stack as \"OP_1\",\n// \"OP_DATA_1 0x01\", \"OP_PUSHDATA1 0x01 0x01\", and others, however, the first\n// only takes a single byte, while the rest take more.  Only the first is\n// considered canonical.\nfunc isCanonicalPush(opcode byte, data []byte) bool {\n\tdataLen := len(data)\n\tif opcode > OP_16 {\n\t\treturn true\n\t}\n\n\tif opcode < OP_PUSHDATA1 && opcode > OP_0 && (dataLen == 1 && data[0] <= 16) {\n\t\treturn false\n\t}\n\tif opcode == OP_PUSHDATA1 && dataLen < OP_PUSHDATA1 {\n\t\treturn false\n\t}\n\tif opcode == OP_PUSHDATA2 && dataLen <= 0xff {\n\t\treturn false\n\t}\n\tif opcode == OP_PUSHDATA4 && dataLen <= 0xffff {\n\t\treturn false\n\t}\n\treturn true\n}\n\n// removeOpcodeByData will return the script minus any opcodes that perform a\n// canonical push of data that contains the passed data to remove.  This\n// function assumes it is provided a version 0 script as any future version of\n// script should avoid this functionality since it is unnecessary due to the\n// signature scripts not being part of the witness-free transaction hash.\n//\n// WARNING: This will return the passed script unmodified unless a modification\n// is necessary in which case the modified script is returned.  This implies\n// callers may NOT rely on being able to safely mutate either the passed or\n// returned script without potentially modifying the same data.\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc removeOpcodeByData(script []byte, dataToRemove []byte) ([]byte, bool) {\n\t// Avoid work when possible.\n\tif len(script) == 0 || len(dataToRemove) == 0 {\n\t\treturn script, false\n\t}\n\n\t// Parse through the script looking for a canonical data push that contains\n\t// the data to remove.\n\tconst scriptVersion = 0\n\tvar result []byte\n\tvar prevOffset int32\n\tvar match bool\n\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\tfor tokenizer.Next() {\n\t\tvar found bool\n\t\tresult, prevOffset, found = removeOpcodeCanonical(\n\t\t\t&tokenizer, script, dataToRemove, prevOffset, result,\n\t\t)\n\t\tif found {\n\t\t\tmatch = true\n\t\t}\n\t}\n\tif result == nil {\n\t\tresult = script\n\t}\n\treturn result, match\n}\n\nfunc removeOpcodeCanonical(t *ScriptTokenizer, script, dataToRemove []byte,\n\tprevOffset int32, result []byte) ([]byte, int32, bool) {\n\n\tvar found bool\n\n\t// In practice, the script will basically never actually contain the\n\t// data since this function is only used during signature verification\n\t// to remove the signature itself which would require some incredibly\n\t// non-standard code to create.\n\t//\n\t// Thus, as an optimization, avoid allocating a new script unless there\n\t// is actually a match that needs to be removed.\n\top, data := t.Opcode(), t.Data()\n\tif isCanonicalPush(op, data) && bytes.Equal(data, dataToRemove) {\n\t\tif result == nil {\n\t\t\tfullPushLen := t.ByteIndex() - prevOffset\n\t\t\tresult = make([]byte, 0, int32(len(script))-fullPushLen)\n\t\t\tresult = append(result, script[0:prevOffset]...)\n\t\t}\n\t\tfound = true\n\t} else if result != nil {\n\t\tresult = append(result, script[prevOffset:t.ByteIndex()]...)\n\t}\n\n\treturn result, t.ByteIndex(), found\n}\n\n// AsSmallInt returns the passed opcode, which must be true according to\n// IsSmallInt(), as an integer.\nfunc AsSmallInt(op byte) int {\n\tif op == OP_0 {\n\t\treturn 0\n\t}\n\n\treturn int(op - (OP_1 - 1))\n}\n\n// countSigOpsV0 returns the number of signature operations in the provided\n// script up to the point of the first parse failure or the entire script when\n// there are no parse failures.  The precise flag attempts to accurately count\n// the number of operations for a multisig operation versus using the maximum\n// allowed.\n//\n// WARNING: This function always treats the passed script as version 0.  Great\n// care must be taken if introducing a new script version because it is used in\n// consensus which, unfortunately as of the time of this writing, does not check\n// script versions before counting their signature operations which means nodes\n// on existing rules will count new version scripts as if they were version 0.\nfunc countSigOpsV0(script []byte, precise bool) int {\n\tconst scriptVersion = 0\n\n\tnumSigOps := 0\n\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\tprevOp := byte(OP_INVALIDOPCODE)\n\tfor tokenizer.Next() {\n\t\tswitch tokenizer.Opcode() {\n\t\tcase OP_CHECKSIG, OP_CHECKSIGVERIFY:\n\t\t\tnumSigOps++\n\n\t\tcase OP_CHECKMULTISIG, OP_CHECKMULTISIGVERIFY:\n\t\t\t// Note that OP_0 is treated as the max number of sigops here in\n\t\t\t// precise mode despite it being a valid small integer in order to\n\t\t\t// highly discourage multisigs with zero pubkeys.\n\t\t\t//\n\t\t\t// Also, even though this is referred to as \"precise\" counting, it's\n\t\t\t// not really precise at all due to the small int opcodes only\n\t\t\t// covering 1 through 16 pubkeys, which means this will count any\n\t\t\t// more than that value (e.g. 17, 18 19) as the maximum number of\n\t\t\t// allowed pubkeys. This is, unfortunately, now part of\n\t\t\t// the Bitcoin consensus rules, due to historical\n\t\t\t// reasons. This could be made more correct with a new\n\t\t\t// script version, however, ideally all multisignaure\n\t\t\t// operations in new script versions should move to\n\t\t\t// aggregated schemes such as Schnorr instead.\n\t\t\tif precise && prevOp >= OP_1 && prevOp <= OP_16 {\n\t\t\t\tnumSigOps += AsSmallInt(prevOp)\n\t\t\t} else {\n\t\t\t\tnumSigOps += MaxPubKeysPerMultiSig\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Not a sigop.\n\t\t}\n\n\t\tprevOp = tokenizer.Opcode()\n\t}\n\n\treturn numSigOps\n}\n\n// GetSigOpCount provides a quick count of the number of signature operations\n// in a script. a CHECKSIG operations counts for 1, and a CHECK_MULTISIG for 20.\n// If the script fails to parse, then the count up to the point of failure is\n// returned.\n//\n// WARNING: This function always treats the passed script as version 0.  Great\n// care must be taken if introducing a new script version because it is used in\n// consensus which, unfortunately as of the time of this writing, does not check\n// script versions before counting their signature operations which means nodes\n// on existing rules will count new version scripts as if they were version 0.\nfunc GetSigOpCount(script []byte) int {\n\treturn countSigOpsV0(script, false)\n}\n\n// finalOpcodeData returns the data associated with the final opcode in the\n// script.  It will return nil if the script fails to parse.\nfunc finalOpcodeData(scriptVersion uint16, script []byte) []byte {\n\t// Avoid unnecessary work.\n\tif len(script) == 0 {\n\t\treturn nil\n\t}\n\n\tvar data []byte\n\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\tfor tokenizer.Next() {\n\t\tdata = tokenizer.Data()\n\t}\n\tif tokenizer.Err() != nil {\n\t\treturn nil\n\t}\n\treturn data\n}\n\n// GetPreciseSigOpCount returns the number of signature operations in\n// scriptPubKey.  If bip16 is true then scriptSig may be searched for the\n// Pay-To-Script-Hash script in order to find the precise number of signature\n// operations in the transaction.  If the script fails to parse, then the count\n// up to the point of failure is returned.\n//\n// WARNING: This function always treats the passed script as version 0.  Great\n// care must be taken if introducing a new script version because it is used in\n// consensus which, unfortunately as of the time of this writing, does not check\n// script versions before counting their signature operations which means nodes\n// on existing rules will count new version scripts as if they were version 0.\n//\n// The third parameter is DEPRECATED and is unused.\nfunc GetPreciseSigOpCount(scriptSig, scriptPubKey []byte, _ bool) int {\n\tconst scriptVersion = 0\n\n\t// Treat non P2SH transactions as normal.  Note that signature operation\n\t// counting includes all operations up to the first parse failure.\n\tif !isScriptHashScript(scriptPubKey) {\n\t\treturn countSigOpsV0(scriptPubKey, true)\n\t}\n\n\t// The signature script must only push data to the stack for P2SH to be\n\t// a valid pair, so the signature operation count is 0 when that is not\n\t// the case.\n\tif len(scriptSig) == 0 || !IsPushOnlyScript(scriptSig) {\n\t\treturn 0\n\t}\n\n\t// The P2SH script is the last item the signature script pushes to the\n\t// stack.  When the script is empty, there are no signature operations.\n\t//\n\t// Notice that signature scripts that fail to fully parse count as 0\n\t// signature operations unlike public key and redeem scripts.\n\tredeemScript := finalOpcodeData(scriptVersion, scriptSig)\n\tif len(redeemScript) == 0 {\n\t\treturn 0\n\t}\n\n\t// Return the more precise sigops count for the redeem script.  Note that\n\t// signature operation counting includes all operations up to the first\n\t// parse failure.\n\treturn countSigOpsV0(redeemScript, true)\n}\n\n// GetWitnessSigOpCount returns the number of signature operations generated by\n// spending the passed pkScript with the specified witness, or sigScript.\n// Unlike GetPreciseSigOpCount, this function is able to accurately count the\n// number of signature operations generated by spending witness programs, and\n// nested p2sh witness programs. If the script fails to parse, then the count\n// up to the point of failure is returned.\nfunc GetWitnessSigOpCount(sigScript, pkScript []byte, witness wire.TxWitness) int {\n\t// If this is a regular witness program, then we can proceed directly\n\t// to counting its signature operations without any further processing.\n\tif isWitnessProgramScript(pkScript) {\n\t\treturn getWitnessSigOps(pkScript, witness)\n\t}\n\n\t// Next, we'll check the sigScript to see if this is a nested p2sh\n\t// witness program. This is a case wherein the sigScript is actually a\n\t// datapush of a p2wsh witness program.\n\tif isScriptHashScript(pkScript) && IsPushOnlyScript(sigScript) &&\n\t\tlen(sigScript) > 0 && isWitnessProgramScript(sigScript[1:]) {\n\t\treturn getWitnessSigOps(sigScript[1:], witness)\n\t}\n\n\treturn 0\n}\n\n// getWitnessSigOps returns the number of signature operations generated by\n// spending the passed witness program wit the passed witness. The exact\n// signature counting heuristic is modified by the version of the passed\n// witness program. If the version of the witness program is unable to be\n// extracted, then 0 is returned for the sig op count.\nfunc getWitnessSigOps(pkScript []byte, witness wire.TxWitness) int {\n\t// Attempt to extract the witness program version.\n\twitnessVersion, witnessProgram, err := ExtractWitnessProgramInfo(\n\t\tpkScript,\n\t)\n\tif err != nil {\n\t\treturn 0\n\t}\n\n\tswitch witnessVersion {\n\tcase BaseSegwitWitnessVersion:\n\t\tswitch {\n\t\tcase len(witnessProgram) == payToWitnessPubKeyHashDataSize:\n\t\t\treturn 1\n\t\tcase len(witnessProgram) == payToWitnessScriptHashDataSize &&\n\t\t\tlen(witness) > 0:\n\n\t\t\twitnessScript := witness[len(witness)-1]\n\t\t\treturn countSigOpsV0(witnessScript, true)\n\t\t}\n\n\t// Taproot signature operations don't count towards the block-wide sig\n\t// op limit, instead a distinct weight-based accounting method is used.\n\tcase TaprootWitnessVersion:\n\t\treturn 0\n\t}\n\n\treturn 0\n}\n\n// checkScriptParses returns an error if the provided script fails to parse.\nfunc checkScriptParses(scriptVersion uint16, script []byte) error {\n\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\tfor tokenizer.Next() {\n\t\t// Nothing to do.\n\t}\n\treturn tokenizer.Err()\n}\n\n// IsUnspendable returns whether the passed public key script is unspendable, or\n// guaranteed to fail at execution.  This allows outputs to be pruned instantly\n// when entering the UTXO set.\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc IsUnspendable(pkScript []byte) bool {\n\t// The script is unspendable if starts with OP_RETURN or is guaranteed\n\t// to fail at execution due to being larger than the max allowed script\n\t// size.\n\tswitch {\n\tcase len(pkScript) > 0 && pkScript[0] == OP_RETURN:\n\t\treturn true\n\tcase len(pkScript) > MaxScriptSize:\n\t\treturn true\n\t}\n\n\t// The script is unspendable if it is guaranteed to fail at execution.\n\tconst scriptVersion = 0\n\treturn checkScriptParses(scriptVersion, pkScript) != nil\n}\n\n// ScriptHasOpSuccess returns true if any op codes in the script contain an\n// OP_SUCCESS op code.\nfunc ScriptHasOpSuccess(witnessScript []byte) bool {\n\t// First, create a new script tokenizer so we can run through all the\n\t// elements.\n\ttokenizer := MakeScriptTokenizer(0, witnessScript)\n\n\t// Run through all the op codes, returning true if we find anything\n\t// that is marked as a new op success.\n\tfor tokenizer.Next() {\n\t\tif _, ok := successOpcodes[tokenizer.Opcode()]; ok {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "txscript/script_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TestPushedData ensured the PushedData function extracts the expected data out\n// of various scripts.\nfunc TestPushedData(t *testing.T) {\n\tt.Parallel()\n\n\tvar tests = []struct {\n\t\tscript string\n\t\tout    [][]byte\n\t\tvalid  bool\n\t}{\n\t\t{\n\t\t\t\"0 IF 0 ELSE 2 ENDIF\",\n\t\t\t[][]byte{nil, nil},\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"16777216 10000000\",\n\t\t\t[][]byte{\n\t\t\t\t{0x00, 0x00, 0x00, 0x01}, // 16777216\n\t\t\t\t{0x80, 0x96, 0x98, 0x00}, // 10000000\n\t\t\t},\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"DUP HASH160 '17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem' EQUALVERIFY CHECKSIG\",\n\t\t\t[][]byte{\n\t\t\t\t// 17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem\n\t\t\t\t{\n\t\t\t\t\t0x31, 0x37, 0x56, 0x5a, 0x4e, 0x58, 0x31, 0x53, 0x4e, 0x35,\n\t\t\t\t\t0x4e, 0x74, 0x4b, 0x61, 0x38, 0x55, 0x51, 0x46, 0x78, 0x77,\n\t\t\t\t\t0x51, 0x62, 0x46, 0x65, 0x46, 0x63, 0x33, 0x69, 0x71, 0x52,\n\t\t\t\t\t0x59, 0x68, 0x65, 0x6d,\n\t\t\t\t},\n\t\t\t},\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"PUSHDATA4 1000 EQUAL\",\n\t\t\tnil,\n\t\t\tfalse,\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\tscript := mustParseShortForm(test.script)\n\t\tdata, err := PushedData(script)\n\t\tif test.valid && err != nil {\n\t\t\tt.Errorf(\"TestPushedData failed test #%d: %v\\n\", i, err)\n\t\t\tcontinue\n\t\t} else if !test.valid && err == nil {\n\t\t\tt.Errorf(\"TestPushedData failed test #%d: test should \"+\n\t\t\t\t\"be invalid\\n\", i)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(data, test.out) {\n\t\t\tt.Errorf(\"TestPushedData failed test #%d: want: %x \"+\n\t\t\t\t\"got: %x\\n\", i, test.out, data)\n\t\t}\n\t}\n}\n\n// TestHasCanonicalPush ensures the isCanonicalPush function works as expected.\nfunc TestHasCanonicalPush(t *testing.T) {\n\tt.Parallel()\n\n\tconst scriptVersion = 0\n\tfor i := 0; i < 65535; i++ {\n\t\tscript, err := NewScriptBuilder().AddInt64(int64(i)).Script()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Script: test #%d unexpected error: %v\\n\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !IsPushOnlyScript(script) {\n\t\t\tt.Errorf(\"IsPushOnlyScript: test #%d failed: %x\\n\", i, script)\n\t\t\tcontinue\n\t\t}\n\t\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\t\tfor tokenizer.Next() {\n\t\t\tif !isCanonicalPush(tokenizer.Opcode(), tokenizer.Data()) {\n\t\t\t\tt.Errorf(\"isCanonicalPush: test #%d failed: %x\\n\", i, script)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tfor i := 0; i <= MaxScriptElementSize; i++ {\n\t\tbuilder := NewScriptBuilder()\n\t\tbuilder.AddData(bytes.Repeat([]byte{0x49}, i))\n\t\tscript, err := builder.Script()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Script: test #%d unexpected error: %v\\n\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !IsPushOnlyScript(script) {\n\t\t\tt.Errorf(\"IsPushOnlyScript: test #%d failed: %x\\n\", i, script)\n\t\t\tcontinue\n\t\t}\n\t\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\t\tfor tokenizer.Next() {\n\t\t\tif !isCanonicalPush(tokenizer.Opcode(), tokenizer.Data()) {\n\t\t\t\tt.Errorf(\"isCanonicalPush: test #%d failed: %x\\n\", i, script)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestGetPreciseSigOps ensures the more precise signature operation counting\n// mechanism which includes signatures in P2SH scripts works as expected.\nfunc TestGetPreciseSigOps(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname      string\n\t\tscriptSig []byte\n\t\tnSigOps   int\n\t}{\n\t\t{\n\t\t\tname:      \"scriptSig doesn't parse\",\n\t\t\tscriptSig: mustParseShortForm(\"PUSHDATA1 0x02\"),\n\t\t},\n\t\t{\n\t\t\tname:      \"scriptSig isn't push only\",\n\t\t\tscriptSig: mustParseShortForm(\"1 DUP\"),\n\t\t\tnSigOps:   0,\n\t\t},\n\t\t{\n\t\t\tname:      \"scriptSig length 0\",\n\t\t\tscriptSig: nil,\n\t\t\tnSigOps:   0,\n\t\t},\n\t\t{\n\t\t\tname: \"No script at the end\",\n\t\t\t// No script at end but still push only.\n\t\t\tscriptSig: mustParseShortForm(\"1 1\"),\n\t\t\tnSigOps:   0,\n\t\t},\n\t\t{\n\t\t\tname:      \"pushed script doesn't parse\",\n\t\t\tscriptSig: mustParseShortForm(\"DATA_2 PUSHDATA1 0x02\"),\n\t\t},\n\t}\n\n\t// The signature in the p2sh script is nonsensical for the tests since\n\t// this script will never be executed.  What matters is that it matches\n\t// the right pattern.\n\tpkScript := mustParseShortForm(\"HASH160 DATA_20 0x433ec2ac1ffa1b7b7d0\" +\n\t\t\"27f564529c57197f9ae88 EQUAL\")\n\tfor _, test := range tests {\n\t\tcount := GetPreciseSigOpCount(test.scriptSig, pkScript, true)\n\t\tif count != test.nSigOps {\n\t\t\tt.Errorf(\"%s: expected count of %d, got %d\", test.name,\n\t\t\t\ttest.nSigOps, count)\n\n\t\t}\n\t}\n}\n\n// TestGetWitnessSigOpCount tests that the sig op counting for p2wkh, p2wsh,\n// nested p2sh, and invalid variants are counted properly.\nfunc TestGetWitnessSigOpCount(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname string\n\n\t\tsigScript []byte\n\t\tpkScript  []byte\n\t\twitness   wire.TxWitness\n\n\t\tnumSigOps int\n\t}{\n\t\t// A regular p2wkh witness program. The output being spent\n\t\t// should only have a single sig-op counted.\n\t\t{\n\t\t\tname: \"p2wkh\",\n\t\t\tpkScript: mustParseShortForm(\"OP_0 DATA_20 \" +\n\t\t\t\t\"0x365ab47888e150ff46f8d51bce36dcd680f1283f\"),\n\t\t\twitness: wire.TxWitness{\n\t\t\t\thexToBytes(\"3045022100ee9fe8f9487afa977\" +\n\t\t\t\t\t\"6647ebcf0883ce0cd37454d7ce19889d34ba2c9\" +\n\t\t\t\t\t\"9ce5a9f402200341cb469d0efd3955acb9e46\" +\n\t\t\t\t\t\"f568d7e2cc10f9084aaff94ced6dc50a59134ad01\"),\n\t\t\t\thexToBytes(\"03f0000d0639a22bfaf217e4c9428\" +\n\t\t\t\t\t\"9c2b0cc7fa1036f7fd5d9f61a9d6ec153100e\"),\n\t\t\t},\n\t\t\tnumSigOps: 1,\n\t\t},\n\t\t// A p2wkh witness program nested within a p2sh output script.\n\t\t// The pattern should be recognized properly and attribute only\n\t\t// a single sig op.\n\t\t{\n\t\t\tname: \"nested p2sh\",\n\t\t\tsigScript: hexToBytes(\"160014ad0ffa2e387f07\" +\n\t\t\t\t\"e7ead14dc56d5a97dbd6ff5a23\"),\n\t\t\tpkScript: mustParseShortForm(\"HASH160 DATA_20 \" +\n\t\t\t\t\"0xb3a84b564602a9d68b4c9f19c2ea61458ff7826c EQUAL\"),\n\t\t\twitness: wire.TxWitness{\n\t\t\t\thexToBytes(\"3045022100cb1c2ac1ff1d57d\" +\n\t\t\t\t\t\"db98f7bdead905f8bf5bcc8641b029ce8eef25\" +\n\t\t\t\t\t\"c75a9e22a4702203be621b5c86b771288706be5\" +\n\t\t\t\t\t\"a7eee1db4fceabf9afb7583c1cc6ee3f8297b21201\"),\n\t\t\t\thexToBytes(\"03f0000d0639a22bfaf217e4c9\" +\n\t\t\t\t\t\"4289c2b0cc7fa1036f7fd5d9f61a9d6ec153100e\"),\n\t\t\t},\n\t\t\tnumSigOps: 1,\n\t\t},\n\t\t// A p2sh script that spends a 2-of-2 multi-sig output.\n\t\t{\n\t\t\tname:      \"p2wsh multi-sig spend\",\n\t\t\tnumSigOps: 2,\n\t\t\tpkScript: hexToBytes(\"0020e112b88a0cd87ba387f\" +\n\t\t\t\t\"449d443ee2596eb353beb1f0351ab2cba8909d875db23\"),\n\t\t\twitness: wire.TxWitness{\n\t\t\t\thexToBytes(\"522103b05faca7ceda92b493\" +\n\t\t\t\t\t\"3f7acdf874a93de0dc7edc461832031cd69cbb1d1e\" +\n\t\t\t\t\t\"6fae2102e39092e031c1621c902e3704424e8d8\" +\n\t\t\t\t\t\"3ca481d4d4eeae1b7970f51c78231207e52ae\"),\n\t\t\t},\n\t\t},\n\t\t// A p2wsh witness program. However, the witness script fails\n\t\t// to parse after the valid portion of the script. As a result,\n\t\t// the valid portion of the script should still be counted.\n\t\t{\n\t\t\tname:      \"witness script doesn't parse\",\n\t\t\tnumSigOps: 1,\n\t\t\tpkScript: hexToBytes(\"0020e112b88a0cd87ba387f44\" +\n\t\t\t\t\"9d443ee2596eb353beb1f0351ab2cba8909d875db23\"),\n\t\t\twitness: wire.TxWitness{\n\t\t\t\tmustParseShortForm(\"DUP HASH160 \" +\n\t\t\t\t\t\"'17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem'\" +\n\t\t\t\t\t\" EQUALVERIFY CHECKSIG DATA_20 0x91\"),\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tcount := GetWitnessSigOpCount(test.sigScript, test.pkScript,\n\t\t\ttest.witness)\n\t\tif count != test.numSigOps {\n\t\t\tt.Errorf(\"%s: expected count of %d, got %d\", test.name,\n\t\t\t\ttest.numSigOps, count)\n\n\t\t}\n\t}\n}\n\n// TestRemoveOpcodes ensures that removing opcodes from scripts behaves as\n// expected.\nfunc TestRemoveOpcodes(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname   string\n\t\tbefore string\n\t\tremove byte\n\t\terr    error\n\t\tafter  string\n\t}{\n\t\t{\n\t\t\t// Nothing to remove.\n\t\t\tname:   \"nothing to remove\",\n\t\t\tbefore: \"NOP\",\n\t\t\tremove: OP_CODESEPARATOR,\n\t\t\tafter:  \"NOP\",\n\t\t},\n\t\t{\n\t\t\t// Test basic opcode removal.\n\t\t\tname:   \"codeseparator 1\",\n\t\t\tbefore: \"NOP CODESEPARATOR TRUE\",\n\t\t\tremove: OP_CODESEPARATOR,\n\t\t\tafter:  \"NOP TRUE\",\n\t\t},\n\t\t{\n\t\t\t// The opcode in question is actually part of the data\n\t\t\t// in a previous opcode.\n\t\t\tname:   \"codeseparator by coincidence\",\n\t\t\tbefore: \"NOP DATA_1 CODESEPARATOR TRUE\",\n\t\t\tremove: OP_CODESEPARATOR,\n\t\t\tafter:  \"NOP DATA_1 CODESEPARATOR TRUE\",\n\t\t},\n\t\t{\n\t\t\tname:   \"invalid opcode\",\n\t\t\tbefore: \"CAT\",\n\t\t\tremove: OP_CODESEPARATOR,\n\t\t\tafter:  \"CAT\",\n\t\t},\n\t\t{\n\t\t\tname:   \"invalid length (instruction)\",\n\t\t\tbefore: \"PUSHDATA1\",\n\t\t\tremove: OP_CODESEPARATOR,\n\t\t\terr:    scriptError(ErrMalformedPush, \"\"),\n\t\t},\n\t\t{\n\t\t\tname:   \"invalid length (data)\",\n\t\t\tbefore: \"PUSHDATA1 0xff 0xfe\",\n\t\t\tremove: OP_CODESEPARATOR,\n\t\t\terr:    scriptError(ErrMalformedPush, \"\"),\n\t\t},\n\t}\n\n\t// tstRemoveOpcode is a convenience function to parse the provided\n\t// raw script, remove the passed opcode, then unparse the result back\n\t// into a raw script.\n\tconst scriptVersion = 0\n\ttstRemoveOpcode := func(script []byte, opcode byte) ([]byte, error) {\n\t\tif err := checkScriptParses(scriptVersion, script); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn removeOpcodeRaw(script, opcode), nil\n\t}\n\n\tfor _, test := range tests {\n\t\tbefore := mustParseShortForm(test.before)\n\t\tafter := mustParseShortForm(test.after)\n\t\tresult, err := tstRemoveOpcode(before, test.remove)\n\t\tif e := tstCheckScriptError(err, test.err); e != nil {\n\t\t\tt.Errorf(\"%s: %v\", test.name, e)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(after, result) {\n\t\t\tt.Errorf(\"%s: value does not equal expected: exp: %q\"+\n\t\t\t\t\" got: %q\", test.name, after, result)\n\t\t}\n\t}\n}\n\n// TestRemoveOpcodeByData ensures that removing data carrying opcodes based on\n// the data they contain works as expected.\nfunc TestRemoveOpcodeByData(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname   string\n\t\tbefore []byte\n\t\tremove []byte\n\t\terr    error\n\t\tafter  []byte\n\t}{\n\t\t{\n\t\t\tname:   \"nothing to do\",\n\t\t\tbefore: []byte{OP_NOP},\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\tafter:  []byte{OP_NOP},\n\t\t},\n\t\t{\n\t\t\tname:   \"\",\n\t\t\tbefore: []byte{OP_NOP, OP_DATA_8, 1, 2, 3, 4, 5, 6, 7, 8, OP_DATA_4, 1, 2, 3, 4},\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\tafter:  []byte{OP_NOP, OP_DATA_8, 1, 2, 3, 4, 5, 6, 7, 8},\n\t\t},\n\t\t{\n\t\t\tname:   \"simple case\",\n\t\t\tbefore: []byte{OP_DATA_4, 1, 2, 3, 4},\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\tafter:  nil,\n\t\t},\n\t\t{\n\t\t\tname:   \"simple case (miss)\",\n\t\t\tbefore: []byte{OP_DATA_4, 1, 2, 3, 4},\n\t\t\tremove: []byte{1, 2, 3, 5},\n\t\t\tafter:  []byte{OP_DATA_4, 1, 2, 3, 4},\n\t\t},\n\t\t{\n\t\t\t// padded to keep it canonical.\n\t\t\tname: \"simple case (pushdata1)\",\n\t\t\tbefore: append(append([]byte{OP_PUSHDATA1, 76},\n\t\t\t\tbytes.Repeat([]byte{0}, 72)...),\n\t\t\t\t[]byte{1, 2, 3, 4}...),\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\tafter: append(append([]byte{OP_PUSHDATA1, 76},\n\t\t\t\tbytes.Repeat([]byte{0}, 72)...),\n\t\t\t\t[]byte{1, 2, 3, 4}...),\n\t\t},\n\t\t{\n\t\t\tname: \"simple case (pushdata1 miss)\",\n\t\t\tbefore: append(append([]byte{OP_PUSHDATA1, 76},\n\t\t\t\tbytes.Repeat([]byte{0}, 72)...),\n\t\t\t\t[]byte{1, 2, 3, 4}...),\n\t\t\tremove: []byte{1, 2, 3, 5},\n\t\t\tafter: append(append([]byte{OP_PUSHDATA1, 76},\n\t\t\t\tbytes.Repeat([]byte{0}, 72)...),\n\t\t\t\t[]byte{1, 2, 3, 4}...),\n\t\t},\n\t\t{\n\t\t\tname:   \"simple case (pushdata1 miss noncanonical)\",\n\t\t\tbefore: []byte{OP_PUSHDATA1, 4, 1, 2, 3, 4},\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\tafter:  []byte{OP_PUSHDATA1, 4, 1, 2, 3, 4},\n\t\t},\n\t\t{\n\t\t\tname: \"simple case (pushdata2)\",\n\t\t\tbefore: append(append([]byte{OP_PUSHDATA2, 0, 1},\n\t\t\t\tbytes.Repeat([]byte{0}, 252)...),\n\t\t\t\t[]byte{1, 2, 3, 4}...),\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\tafter: append(append([]byte{OP_PUSHDATA2, 0, 1},\n\t\t\t\tbytes.Repeat([]byte{0}, 252)...),\n\t\t\t\t[]byte{1, 2, 3, 4}...),\n\t\t},\n\t\t{\n\t\t\tname: \"simple case (pushdata2 miss)\",\n\t\t\tbefore: append(append([]byte{OP_PUSHDATA2, 0, 1},\n\t\t\t\tbytes.Repeat([]byte{0}, 252)...),\n\t\t\t\t[]byte{1, 2, 3, 4}...),\n\t\t\tremove: []byte{1, 2, 3, 4, 5},\n\t\t\tafter: append(append([]byte{OP_PUSHDATA2, 0, 1},\n\t\t\t\tbytes.Repeat([]byte{0}, 252)...),\n\t\t\t\t[]byte{1, 2, 3, 4}...),\n\t\t},\n\t\t{\n\t\t\tname:   \"simple case (pushdata2 miss noncanonical)\",\n\t\t\tbefore: []byte{OP_PUSHDATA2, 4, 0, 1, 2, 3, 4},\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\tafter:  []byte{OP_PUSHDATA2, 4, 0, 1, 2, 3, 4},\n\t\t},\n\t\t{\n\t\t\t// This is padded to make the push canonical.\n\t\t\tname: \"simple case (pushdata4)\",\n\t\t\tbefore: append(append([]byte{OP_PUSHDATA4, 0, 0, 1, 0},\n\t\t\t\tbytes.Repeat([]byte{0}, 65532)...),\n\t\t\t\t[]byte{1, 2, 3, 4}...),\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\tafter: append(append([]byte{OP_PUSHDATA4, 0, 0, 1, 0},\n\t\t\t\tbytes.Repeat([]byte{0}, 65532)...),\n\t\t\t\t[]byte{1, 2, 3, 4}...),\n\t\t},\n\t\t{\n\t\t\tname:   \"simple case (pushdata4 miss noncanonical)\",\n\t\t\tbefore: []byte{OP_PUSHDATA4, 4, 0, 0, 0, 1, 2, 3, 4},\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\tafter:  []byte{OP_PUSHDATA4, 4, 0, 0, 0, 1, 2, 3, 4},\n\t\t},\n\t\t{\n\t\t\t// This is padded to make the push canonical.\n\t\t\tname: \"simple case (pushdata4 miss)\",\n\t\t\tbefore: append(append([]byte{OP_PUSHDATA4, 0, 0, 1, 0},\n\t\t\t\tbytes.Repeat([]byte{0}, 65532)...), []byte{1, 2, 3, 4}...),\n\t\t\tremove: []byte{1, 2, 3, 4, 5},\n\t\t\tafter: append(append([]byte{OP_PUSHDATA4, 0, 0, 1, 0},\n\t\t\t\tbytes.Repeat([]byte{0}, 65532)...), []byte{1, 2, 3, 4}...),\n\t\t},\n\t\t{\n\t\t\tname:   \"invalid opcode \",\n\t\t\tbefore: []byte{OP_UNKNOWN187},\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\tafter:  []byte{OP_UNKNOWN187},\n\t\t},\n\t\t{\n\t\t\tname:   \"invalid length (instruction)\",\n\t\t\tbefore: []byte{OP_PUSHDATA1},\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\terr:    scriptError(ErrMalformedPush, \"\"),\n\t\t},\n\t\t{\n\t\t\tname:   \"invalid length (data)\",\n\t\t\tbefore: []byte{OP_PUSHDATA1, 255, 254},\n\t\t\tremove: []byte{1, 2, 3, 4},\n\t\t\terr:    scriptError(ErrMalformedPush, \"\"),\n\t\t},\n\t}\n\n\t// tstRemoveOpcodeByData is a convenience function to ensure the provided\n\t// script parses before attempting to remove the passed data.\n\tconst scriptVersion = 0\n\ttstRemoveOpcodeByData := func(script []byte, data []byte) ([]byte, bool, error) {\n\t\tif err := checkScriptParses(scriptVersion, script); err != nil {\n\t\t\treturn nil, false, err\n\t\t}\n\n\t\tresult, match := removeOpcodeByData(script, data)\n\t\treturn result, match, nil\n\t}\n\n\tfor _, test := range tests {\n\t\tresult, _, err := tstRemoveOpcodeByData(test.before, test.remove)\n\t\tif e := tstCheckScriptError(err, test.err); e != nil {\n\t\t\tt.Errorf(\"%s: %v\", test.name, e)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !bytes.Equal(test.after, result) {\n\t\t\tt.Errorf(\"%s: value does not equal expected: exp: %q\"+\n\t\t\t\t\" got: %q\", test.name, test.after, result)\n\t\t}\n\t}\n}\n\n// TestIsPayToScriptHash ensures the IsPayToScriptHash function returns the\n// expected results for all the scripts in scriptClassTests.\nfunc TestIsPayToScriptHash(t *testing.T) {\n\tt.Parallel()\n\n\tfor _, test := range scriptClassTests {\n\t\tscript := mustParseShortForm(test.script)\n\t\tshouldBe := (test.class == ScriptHashTy)\n\t\tp2sh := IsPayToScriptHash(script)\n\t\tif p2sh != shouldBe {\n\t\t\tt.Errorf(\"%s: expected p2sh %v, got %v\", test.name,\n\t\t\t\tshouldBe, p2sh)\n\t\t}\n\t}\n}\n\n// TestIsPayToWitnessScriptHash ensures the IsPayToWitnessScriptHash function\n// returns the expected results for all the scripts in scriptClassTests.\nfunc TestIsPayToWitnessScriptHash(t *testing.T) {\n\tt.Parallel()\n\n\tfor _, test := range scriptClassTests {\n\t\tscript := mustParseShortForm(test.script)\n\t\tshouldBe := (test.class == WitnessV0ScriptHashTy)\n\t\tp2wsh := IsPayToWitnessScriptHash(script)\n\t\tif p2wsh != shouldBe {\n\t\t\tt.Errorf(\"%s: expected p2wsh %v, got %v\", test.name,\n\t\t\t\tshouldBe, p2wsh)\n\t\t}\n\t}\n}\n\n// TestIsPayToWitnessPubKeyHash ensures the IsPayToWitnessPubKeyHash function\n// returns the expected results for all the scripts in scriptClassTests.\nfunc TestIsPayToWitnessPubKeyHash(t *testing.T) {\n\tt.Parallel()\n\n\tfor _, test := range scriptClassTests {\n\t\tscript := mustParseShortForm(test.script)\n\t\tshouldBe := (test.class == WitnessV0PubKeyHashTy)\n\t\tp2wkh := IsPayToWitnessPubKeyHash(script)\n\t\tif p2wkh != shouldBe {\n\t\t\tt.Errorf(\"%s: expected p2wkh %v, got %v\", test.name,\n\t\t\t\tshouldBe, p2wkh)\n\t\t}\n\t}\n}\n\n// TestHasCanonicalPushes ensures the isCanonicalPush function properly\n// determines what is considered a canonical push for the purposes of\n// removeOpcodeByData.\nfunc TestHasCanonicalPushes(t *testing.T) {\n\tt.Parallel()\n\n\tconst scriptVersion = 0\n\ttests := []struct {\n\t\tname     string\n\t\tscript   string\n\t\texpected bool\n\t}{\n\t\t{\n\t\t\tname: \"does not parse\",\n\t\t\tscript: \"0x046708afdb0fe5548271967f1a67130b7105cd6a82\" +\n\t\t\t\t\"8e03909a67962e0ea1f61d\",\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"non-canonical push\",\n\t\t\tscript:   \"PUSHDATA1 0x04 0x01020304\",\n\t\t\texpected: false,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tscript := mustParseShortForm(test.script)\n\t\tif err := checkScriptParses(scriptVersion, script); err != nil {\n\t\t\tif test.expected {\n\t\t\t\tt.Errorf(\"%q: script parse failed: %v\", test.name, err)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\t\tfor tokenizer.Next() {\n\t\t\tresult := isCanonicalPush(tokenizer.Opcode(), tokenizer.Data())\n\t\t\tif result != test.expected {\n\t\t\t\tt.Errorf(\"%q: isCanonicalPush wrong result\\ngot: %v\\nwant: %v\",\n\t\t\t\t\ttest.name, result, test.expected)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestIsPushOnlyScript ensures the IsPushOnlyScript function returns the\n// expected results.\nfunc TestIsPushOnlyScript(t *testing.T) {\n\tt.Parallel()\n\n\ttest := struct {\n\t\tname     string\n\t\tscript   []byte\n\t\texpected bool\n\t}{\n\t\tname: \"does not parse\",\n\t\tscript: mustParseShortForm(\"0x046708afdb0fe5548271967f1a67130\" +\n\t\t\t\"b7105cd6a828e03909a67962e0ea1f61d\"),\n\t\texpected: false,\n\t}\n\n\tif IsPushOnlyScript(test.script) != test.expected {\n\t\tt.Errorf(\"IsPushOnlyScript (%s) wrong result\\ngot: %v\\nwant: \"+\n\t\t\t\"%v\", test.name, true, test.expected)\n\t}\n}\n\n// TestIsUnspendable ensures the IsUnspendable function returns the expected\n// results.\nfunc TestIsUnspendable(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tpkScript []byte\n\t\texpected bool\n\t}{\n\t\t{\n\t\t\t// Unspendable\n\t\t\tpkScript: []byte{0x6a, 0x04, 0x74, 0x65, 0x73, 0x74},\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\t// Spendable\n\t\t\tpkScript: []byte{0x76, 0xa9, 0x14, 0x29, 0x95, 0xa0,\n\t\t\t\t0xfe, 0x68, 0x43, 0xfa, 0x9b, 0x95, 0x45,\n\t\t\t\t0x97, 0xf0, 0xdc, 0xa7, 0xa4, 0x4d, 0xf6,\n\t\t\t\t0xfa, 0x0b, 0x5c, 0x88, 0xac},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\t// Spendable\n\t\t\tpkScript: []byte{0xa9, 0x14, 0x82, 0x1d, 0xba, 0x94, 0xbc, 0xfb,\n\t\t\t\t0xa2, 0x57, 0x36, 0xa3, 0x9e, 0x5d, 0x14, 0x5d, 0x69, 0x75,\n\t\t\t\t0xba, 0x8c, 0x0b, 0x42, 0x87},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\t// Not Necessarily Unspendable\n\t\t\tpkScript: []byte{},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\t// Spendable\n\t\t\tpkScript: []byte{OP_TRUE},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\t// Unspendable\n\t\t\tpkScript: []byte{OP_RETURN},\n\t\t\texpected: true,\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\tres := IsUnspendable(test.pkScript)\n\t\tif res != test.expected {\n\t\t\tt.Errorf(\"TestIsUnspendable #%d failed: got %v want %v\",\n\t\t\t\ti, res, test.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "txscript/scriptbuilder.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n)\n\nconst (\n\t// defaultScriptAlloc is the default size used for the backing array\n\t// for a script being built by the ScriptBuilder.  The array will\n\t// dynamically grow as needed, but this figure is intended to provide\n\t// enough space for the vast majority of scripts without needing to grow\n\t// the backing array multiple times. Can be overwritten with the\n\t// WithScriptAllocSize functional option where expected script sizes are\n\t// known.\n\tdefaultScriptAlloc = 500\n)\n\n// scriptBuilderConfig is a configuration struct that can be used to modify the\n// initialization of a ScriptBuilder.\ntype scriptBuilderConfig struct {\n\t// allocSize specifies the initial size of the backing array for the\n\t// script builder.\n\tallocSize int\n}\n\n// defaultScriptBuilderConfig returns a new scriptBuilderConfig with the\n// default values set.\nfunc defaultScriptBuilderConfig() *scriptBuilderConfig {\n\treturn &scriptBuilderConfig{\n\t\tallocSize: defaultScriptAlloc,\n\t}\n}\n\n// ScriptBuilderOpt is a functional option type which is used to modify the\n// initialization of a ScriptBuilder.\ntype ScriptBuilderOpt func(*scriptBuilderConfig)\n\n// WithScriptAllocSize specifies the initial size of the backing array for the\n// script builder.\nfunc WithScriptAllocSize(size int) ScriptBuilderOpt {\n\treturn func(cfg *scriptBuilderConfig) {\n\t\tcfg.allocSize = size\n\t}\n}\n\n// ErrScriptNotCanonical identifies a non-canonical script.  The caller can use\n// a type assertion to detect this error type.\ntype ErrScriptNotCanonical string\n\n// Error implements the error interface.\nfunc (e ErrScriptNotCanonical) Error() string {\n\treturn string(e)\n}\n\n// ScriptBuilder provides a facility for building custom scripts.  It allows\n// you to push opcodes, ints, and data while respecting canonical encoding.  In\n// general it does not ensure the script will execute correctly, however any\n// data pushes which would exceed the maximum allowed script engine limits and\n// are therefore guaranteed not to execute will not be pushed and will result in\n// the Script function returning an error.\n//\n// For example, the following would build a 2-of-3 multisig script for usage in\n// a pay-to-script-hash (although in this situation MultiSigScript() would be a\n// better choice to generate the script):\n//\n//\tbuilder := txscript.NewScriptBuilder()\n//\tbuilder.AddOp(txscript.OP_2).AddData(pubKey1).AddData(pubKey2)\n//\tbuilder.AddData(pubKey3).AddOp(txscript.OP_3)\n//\tbuilder.AddOp(txscript.OP_CHECKMULTISIG)\n//\tscript, err := builder.Script()\n//\tif err != nil {\n//\t\t// Handle the error.\n//\t\treturn\n//\t}\n//\tfmt.Printf(\"Final multi-sig script: %x\\n\", script)\ntype ScriptBuilder struct {\n\tscript []byte\n\terr    error\n}\n\n// AddOp pushes the passed opcode to the end of the script.  The script will not\n// be modified if pushing the opcode would cause the script to exceed the\n// maximum allowed script engine size.\nfunc (b *ScriptBuilder) AddOp(opcode byte) *ScriptBuilder {\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\t// Pushes that would cause the script to exceed the largest allowed\n\t// script size would result in a non-canonical script.\n\tif len(b.script)+1 > MaxScriptSize {\n\t\tstr := fmt.Sprintf(\"adding an opcode would exceed the maximum \"+\n\t\t\t\"allowed canonical script length of %d\", MaxScriptSize)\n\t\tb.err = ErrScriptNotCanonical(str)\n\t\treturn b\n\t}\n\n\tb.script = append(b.script, opcode)\n\treturn b\n}\n\n// AddOps pushes the passed opcodes to the end of the script.  The script will\n// not be modified if pushing the opcodes would cause the script to exceed the\n// maximum allowed script engine size.\nfunc (b *ScriptBuilder) AddOps(opcodes []byte) *ScriptBuilder {\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\t// Pushes that would cause the script to exceed the largest allowed\n\t// script size would result in a non-canonical script.\n\tif len(b.script)+len(opcodes) > MaxScriptSize {\n\t\tstr := fmt.Sprintf(\"adding opcodes would exceed the maximum \"+\n\t\t\t\"allowed canonical script length of %d\", MaxScriptSize)\n\t\tb.err = ErrScriptNotCanonical(str)\n\t\treturn b\n\t}\n\n\tb.script = append(b.script, opcodes...)\n\treturn b\n}\n\n// canonicalDataSize returns the number of bytes the canonical encoding of the\n// data will take.\nfunc canonicalDataSize(data []byte) int {\n\tdataLen := len(data)\n\n\t// When the data consists of a single number that can be represented\n\t// by one of the \"small integer\" opcodes, that opcode will be instead\n\t// of a data push opcode followed by the number.\n\tif dataLen == 0 {\n\t\treturn 1\n\t} else if dataLen == 1 && data[0] <= 16 {\n\t\treturn 1\n\t} else if dataLen == 1 && data[0] == 0x81 {\n\t\treturn 1\n\t}\n\n\tif dataLen < OP_PUSHDATA1 {\n\t\treturn 1 + dataLen\n\t} else if dataLen <= 0xff {\n\t\treturn 2 + dataLen\n\t} else if dataLen <= 0xffff {\n\t\treturn 3 + dataLen\n\t}\n\n\treturn 5 + dataLen\n}\n\n// addData is the internal function that actually pushes the passed data to the\n// end of the script.  It automatically chooses canonical opcodes depending on\n// the length of the data.  A zero length buffer will lead to a push of empty\n// data onto the stack (OP_0).  No data limits are enforced with this function.\nfunc (b *ScriptBuilder) addData(data []byte) *ScriptBuilder {\n\tdataLen := len(data)\n\n\t// When the data consists of a single number that can be represented\n\t// by one of the \"small integer\" opcodes, use that opcode instead of\n\t// a data push opcode followed by the number.\n\tif dataLen == 0 || dataLen == 1 && data[0] == 0 {\n\t\tb.script = append(b.script, OP_0)\n\t\treturn b\n\t} else if dataLen == 1 && data[0] <= 16 {\n\t\tb.script = append(b.script, (OP_1-1)+data[0])\n\t\treturn b\n\t} else if dataLen == 1 && data[0] == 0x81 {\n\t\tb.script = append(b.script, byte(OP_1NEGATE))\n\t\treturn b\n\t}\n\n\t// Use one of the OP_DATA_# opcodes if the length of the data is small\n\t// enough so the data push instruction is only a single byte.\n\t// Otherwise, choose the smallest possible OP_PUSHDATA# opcode that\n\t// can represent the length of the data.\n\tif dataLen < OP_PUSHDATA1 {\n\t\tb.script = append(b.script, byte((OP_DATA_1-1)+dataLen))\n\t} else if dataLen <= 0xff {\n\t\tb.script = append(b.script, OP_PUSHDATA1, byte(dataLen))\n\t} else if dataLen <= 0xffff {\n\t\tbuf := make([]byte, 2)\n\t\tbinary.LittleEndian.PutUint16(buf, uint16(dataLen))\n\t\tb.script = append(b.script, OP_PUSHDATA2)\n\t\tb.script = append(b.script, buf...)\n\t} else {\n\t\tbuf := make([]byte, 4)\n\t\tbinary.LittleEndian.PutUint32(buf, uint32(dataLen))\n\t\tb.script = append(b.script, OP_PUSHDATA4)\n\t\tb.script = append(b.script, buf...)\n\t}\n\n\t// Append the actual data.\n\tb.script = append(b.script, data...)\n\n\treturn b\n}\n\n// AddFullData should not typically be used by ordinary users as it does not\n// include the checks which prevent data pushes larger than the maximum allowed\n// sizes which leads to scripts that can't be executed.  This is provided for\n// testing purposes such as regression tests where sizes are intentionally made\n// larger than allowed.\n//\n// Use AddData instead.\nfunc (b *ScriptBuilder) AddFullData(data []byte) *ScriptBuilder {\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\treturn b.addData(data)\n}\n\n// AddData pushes the passed data to the end of the script.  It automatically\n// chooses canonical opcodes depending on the length of the data.  A zero length\n// buffer will lead to a push of empty data onto the stack (OP_0) and any push\n// of data greater than MaxScriptElementSize will not modify the script since\n// that is not allowed by the script engine.  Also, the script will not be\n// modified if pushing the data would cause the script to exceed the maximum\n// allowed script engine size.\nfunc (b *ScriptBuilder) AddData(data []byte) *ScriptBuilder {\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\t// Pushes that would cause the script to exceed the largest allowed\n\t// script size would result in a non-canonical script.\n\tdataSize := canonicalDataSize(data)\n\tif len(b.script)+dataSize > MaxScriptSize {\n\t\tstr := fmt.Sprintf(\"adding %d bytes of data would exceed the \"+\n\t\t\t\"maximum allowed canonical script length of %d\",\n\t\t\tdataSize, MaxScriptSize)\n\t\tb.err = ErrScriptNotCanonical(str)\n\t\treturn b\n\t}\n\n\t// Pushes larger than the max script element size would result in a\n\t// script that is not canonical.\n\tdataLen := len(data)\n\tif dataLen > MaxScriptElementSize {\n\t\tstr := fmt.Sprintf(\"adding a data element of %d bytes would \"+\n\t\t\t\"exceed the maximum allowed script element size of %d\",\n\t\t\tdataLen, MaxScriptElementSize)\n\t\tb.err = ErrScriptNotCanonical(str)\n\t\treturn b\n\t}\n\n\treturn b.addData(data)\n}\n\n// AddInt64 pushes the passed integer to the end of the script.  The script will\n// not be modified if pushing the data would cause the script to exceed the\n// maximum allowed script engine size.\nfunc (b *ScriptBuilder) AddInt64(val int64) *ScriptBuilder {\n\tif b.err != nil {\n\t\treturn b\n\t}\n\n\t// Pushes that would cause the script to exceed the largest allowed\n\t// script size would result in a non-canonical script.\n\tif len(b.script)+1 > MaxScriptSize {\n\t\tstr := fmt.Sprintf(\"adding an integer would exceed the \"+\n\t\t\t\"maximum allow canonical script length of %d\",\n\t\t\tMaxScriptSize)\n\t\tb.err = ErrScriptNotCanonical(str)\n\t\treturn b\n\t}\n\n\t// Fast path for small integers and OP_1NEGATE.\n\tif val == 0 {\n\t\tb.script = append(b.script, OP_0)\n\t\treturn b\n\t}\n\tif val == -1 || (val >= 1 && val <= 16) {\n\t\tb.script = append(b.script, byte((OP_1-1)+val))\n\t\treturn b\n\t}\n\n\treturn b.AddData(scriptNum(val).Bytes())\n}\n\n// Reset resets the script so it has no content.\nfunc (b *ScriptBuilder) Reset() *ScriptBuilder {\n\tb.script = b.script[0:0]\n\tb.err = nil\n\treturn b\n}\n\n// Script returns the currently built script.  When any errors occurred while\n// building the script, the script will be returned up the point of the first\n// error along with the error.\nfunc (b *ScriptBuilder) Script() ([]byte, error) {\n\treturn b.script, b.err\n}\n\n// NewScriptBuilder returns a new instance of a script builder.  See\n// ScriptBuilder for details.\nfunc NewScriptBuilder(opts ...ScriptBuilderOpt) *ScriptBuilder {\n\tcfg := defaultScriptBuilderConfig()\n\tfor _, opt := range opts {\n\t\topt(cfg)\n\t}\n\n\treturn &ScriptBuilder{\n\t\tscript: make([]byte, 0, cfg.allocSize),\n\t}\n}\n"
  },
  {
    "path": "txscript/scriptbuilder_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestScriptBuilderAlloc tests that the pre-allocation for a script via the\n// NewScriptBuilder function works as expected.\nfunc TestScriptBuilderAlloc(t *testing.T) {\n\t// Using the default value, we should get a script with a capacity of\n\t// 500 bytes, which is quite large for most scripts.\n\tdefaultBuilder := NewScriptBuilder()\n\trequire.EqualValues(t, defaultScriptAlloc, cap(defaultBuilder.script))\n\n\tconst allocSize = 23\n\tbuilder := NewScriptBuilder(WithScriptAllocSize(allocSize))\n\n\t// The initial capacity of the script should be set to the explicit\n\t// value.\n\trequire.EqualValues(t, allocSize, cap(builder.script))\n\n\tbuilder.AddOp(OP_HASH160)\n\tbuilder.AddData(make([]byte, 20))\n\tbuilder.AddOp(OP_EQUAL)\n\tscript, err := builder.Script()\n\trequire.NoError(t, err)\n\n\trequire.Len(t, script, allocSize)\n\n\t// The capacity shouldn't have changed, as the script should've fit just\n\t// fine.\n\trequire.EqualValues(t, allocSize, cap(builder.script))\n}\n\n// TestScriptBuilderAddOp tests that pushing opcodes to a script via the\n// ScriptBuilder API works as expected.\nfunc TestScriptBuilderAddOp(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\topcodes  []byte\n\t\texpected []byte\n\t}{\n\t\t{\n\t\t\tname:     \"push OP_0\",\n\t\t\topcodes:  []byte{OP_0},\n\t\t\texpected: []byte{OP_0},\n\t\t},\n\t\t{\n\t\t\tname:     \"push OP_1 OP_2\",\n\t\t\topcodes:  []byte{OP_1, OP_2},\n\t\t\texpected: []byte{OP_1, OP_2},\n\t\t},\n\t\t{\n\t\t\tname:     \"push OP_HASH160 OP_EQUAL\",\n\t\t\topcodes:  []byte{OP_HASH160, OP_EQUAL},\n\t\t\texpected: []byte{OP_HASH160, OP_EQUAL},\n\t\t},\n\t}\n\n\t// Run tests and individually add each op via AddOp.\n\tbuilder := NewScriptBuilder()\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tbuilder.Reset()\n\t\tfor _, opcode := range test.opcodes {\n\t\t\tbuilder.AddOp(opcode)\n\t\t}\n\t\tresult, err := builder.Script()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"ScriptBuilder.AddOp #%d (%s) unexpected \"+\n\t\t\t\t\"error: %v\", i, test.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(result, test.expected) {\n\t\t\tt.Errorf(\"ScriptBuilder.AddOp #%d (%s) wrong result\\n\"+\n\t\t\t\t\"got: %x\\nwant: %x\", i, test.name, result,\n\t\t\t\ttest.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// Run tests and bulk add ops via AddOps.\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tbuilder.Reset()\n\t\tresult, err := builder.AddOps(test.opcodes).Script()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"ScriptBuilder.AddOps #%d (%s) unexpected \"+\n\t\t\t\t\"error: %v\", i, test.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(result, test.expected) {\n\t\t\tt.Errorf(\"ScriptBuilder.AddOps #%d (%s) wrong result\\n\"+\n\t\t\t\t\"got: %x\\nwant: %x\", i, test.name, result,\n\t\t\t\ttest.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n\n}\n\n// TestScriptBuilderAddInt64 tests that pushing signed integers to a script via\n// the ScriptBuilder API works as expected.\nfunc TestScriptBuilderAddInt64(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tval      int64\n\t\texpected []byte\n\t}{\n\t\t{name: \"push -1\", val: -1, expected: []byte{OP_1NEGATE}},\n\t\t{name: \"push small int 0\", val: 0, expected: []byte{OP_0}},\n\t\t{name: \"push small int 1\", val: 1, expected: []byte{OP_1}},\n\t\t{name: \"push small int 2\", val: 2, expected: []byte{OP_2}},\n\t\t{name: \"push small int 3\", val: 3, expected: []byte{OP_3}},\n\t\t{name: \"push small int 4\", val: 4, expected: []byte{OP_4}},\n\t\t{name: \"push small int 5\", val: 5, expected: []byte{OP_5}},\n\t\t{name: \"push small int 6\", val: 6, expected: []byte{OP_6}},\n\t\t{name: \"push small int 7\", val: 7, expected: []byte{OP_7}},\n\t\t{name: \"push small int 8\", val: 8, expected: []byte{OP_8}},\n\t\t{name: \"push small int 9\", val: 9, expected: []byte{OP_9}},\n\t\t{name: \"push small int 10\", val: 10, expected: []byte{OP_10}},\n\t\t{name: \"push small int 11\", val: 11, expected: []byte{OP_11}},\n\t\t{name: \"push small int 12\", val: 12, expected: []byte{OP_12}},\n\t\t{name: \"push small int 13\", val: 13, expected: []byte{OP_13}},\n\t\t{name: \"push small int 14\", val: 14, expected: []byte{OP_14}},\n\t\t{name: \"push small int 15\", val: 15, expected: []byte{OP_15}},\n\t\t{name: \"push small int 16\", val: 16, expected: []byte{OP_16}},\n\t\t{name: \"push 17\", val: 17, expected: []byte{OP_DATA_1, 0x11}},\n\t\t{name: \"push 65\", val: 65, expected: []byte{OP_DATA_1, 0x41}},\n\t\t{name: \"push 127\", val: 127, expected: []byte{OP_DATA_1, 0x7f}},\n\t\t{name: \"push 128\", val: 128, expected: []byte{OP_DATA_2, 0x80, 0}},\n\t\t{name: \"push 255\", val: 255, expected: []byte{OP_DATA_2, 0xff, 0}},\n\t\t{name: \"push 256\", val: 256, expected: []byte{OP_DATA_2, 0, 0x01}},\n\t\t{name: \"push 32767\", val: 32767, expected: []byte{OP_DATA_2, 0xff, 0x7f}},\n\t\t{name: \"push 32768\", val: 32768, expected: []byte{OP_DATA_3, 0, 0x80, 0}},\n\t\t{name: \"push -2\", val: -2, expected: []byte{OP_DATA_1, 0x82}},\n\t\t{name: \"push -3\", val: -3, expected: []byte{OP_DATA_1, 0x83}},\n\t\t{name: \"push -4\", val: -4, expected: []byte{OP_DATA_1, 0x84}},\n\t\t{name: \"push -5\", val: -5, expected: []byte{OP_DATA_1, 0x85}},\n\t\t{name: \"push -17\", val: -17, expected: []byte{OP_DATA_1, 0x91}},\n\t\t{name: \"push -65\", val: -65, expected: []byte{OP_DATA_1, 0xc1}},\n\t\t{name: \"push -127\", val: -127, expected: []byte{OP_DATA_1, 0xff}},\n\t\t{name: \"push -128\", val: -128, expected: []byte{OP_DATA_2, 0x80, 0x80}},\n\t\t{name: \"push -255\", val: -255, expected: []byte{OP_DATA_2, 0xff, 0x80}},\n\t\t{name: \"push -256\", val: -256, expected: []byte{OP_DATA_2, 0x00, 0x81}},\n\t\t{name: \"push -32767\", val: -32767, expected: []byte{OP_DATA_2, 0xff, 0xff}},\n\t\t{name: \"push -32768\", val: -32768, expected: []byte{OP_DATA_3, 0x00, 0x80, 0x80}},\n\t}\n\n\tbuilder := NewScriptBuilder()\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tbuilder.Reset().AddInt64(test.val)\n\t\tresult, err := builder.Script()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"ScriptBuilder.AddInt64 #%d (%s) unexpected \"+\n\t\t\t\t\"error: %v\", i, test.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(result, test.expected) {\n\t\t\tt.Errorf(\"ScriptBuilder.AddInt64 #%d (%s) wrong result\\n\"+\n\t\t\t\t\"got: %x\\nwant: %x\", i, test.name, result,\n\t\t\t\ttest.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestScriptBuilderAddData tests that pushing data to a script via the\n// ScriptBuilder API works as expected and conforms to BIP0062.\nfunc TestScriptBuilderAddData(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tdata     []byte\n\t\texpected []byte\n\t\tuseFull  bool // use AddFullData instead of AddData.\n\t}{\n\t\t// BIP0062: Pushing an empty byte sequence must use OP_0.\n\t\t{name: \"push empty byte sequence\", data: nil, expected: []byte{OP_0}},\n\t\t{name: \"push 1 byte 0x00\", data: []byte{0x00}, expected: []byte{OP_0}},\n\n\t\t// BIP0062: Pushing a 1-byte sequence of byte 0x01 through 0x10 must use OP_n.\n\t\t{name: \"push 1 byte 0x01\", data: []byte{0x01}, expected: []byte{OP_1}},\n\t\t{name: \"push 1 byte 0x02\", data: []byte{0x02}, expected: []byte{OP_2}},\n\t\t{name: \"push 1 byte 0x03\", data: []byte{0x03}, expected: []byte{OP_3}},\n\t\t{name: \"push 1 byte 0x04\", data: []byte{0x04}, expected: []byte{OP_4}},\n\t\t{name: \"push 1 byte 0x05\", data: []byte{0x05}, expected: []byte{OP_5}},\n\t\t{name: \"push 1 byte 0x06\", data: []byte{0x06}, expected: []byte{OP_6}},\n\t\t{name: \"push 1 byte 0x07\", data: []byte{0x07}, expected: []byte{OP_7}},\n\t\t{name: \"push 1 byte 0x08\", data: []byte{0x08}, expected: []byte{OP_8}},\n\t\t{name: \"push 1 byte 0x09\", data: []byte{0x09}, expected: []byte{OP_9}},\n\t\t{name: \"push 1 byte 0x0a\", data: []byte{0x0a}, expected: []byte{OP_10}},\n\t\t{name: \"push 1 byte 0x0b\", data: []byte{0x0b}, expected: []byte{OP_11}},\n\t\t{name: \"push 1 byte 0x0c\", data: []byte{0x0c}, expected: []byte{OP_12}},\n\t\t{name: \"push 1 byte 0x0d\", data: []byte{0x0d}, expected: []byte{OP_13}},\n\t\t{name: \"push 1 byte 0x0e\", data: []byte{0x0e}, expected: []byte{OP_14}},\n\t\t{name: \"push 1 byte 0x0f\", data: []byte{0x0f}, expected: []byte{OP_15}},\n\t\t{name: \"push 1 byte 0x10\", data: []byte{0x10}, expected: []byte{OP_16}},\n\n\t\t// BIP0062: Pushing the byte 0x81 must use OP_1NEGATE.\n\t\t{name: \"push 1 byte 0x81\", data: []byte{0x81}, expected: []byte{OP_1NEGATE}},\n\n\t\t// BIP0062: Pushing any other byte sequence up to 75 bytes must\n\t\t// use the normal data push (opcode byte n, with n the number of\n\t\t// bytes, followed n bytes of data being pushed).\n\t\t{name: \"push 1 byte 0x11\", data: []byte{0x11}, expected: []byte{OP_DATA_1, 0x11}},\n\t\t{name: \"push 1 byte 0x80\", data: []byte{0x80}, expected: []byte{OP_DATA_1, 0x80}},\n\t\t{name: \"push 1 byte 0x82\", data: []byte{0x82}, expected: []byte{OP_DATA_1, 0x82}},\n\t\t{name: \"push 1 byte 0xff\", data: []byte{0xff}, expected: []byte{OP_DATA_1, 0xff}},\n\t\t{\n\t\t\tname:     \"push data len 17\",\n\t\t\tdata:     bytes.Repeat([]byte{0x49}, 17),\n\t\t\texpected: append([]byte{OP_DATA_17}, bytes.Repeat([]byte{0x49}, 17)...),\n\t\t},\n\t\t{\n\t\t\tname:     \"push data len 75\",\n\t\t\tdata:     bytes.Repeat([]byte{0x49}, 75),\n\t\t\texpected: append([]byte{OP_DATA_75}, bytes.Repeat([]byte{0x49}, 75)...),\n\t\t},\n\n\t\t// BIP0062: Pushing 76 to 255 bytes must use OP_PUSHDATA1.\n\t\t{\n\t\t\tname:     \"push data len 76\",\n\t\t\tdata:     bytes.Repeat([]byte{0x49}, 76),\n\t\t\texpected: append([]byte{OP_PUSHDATA1, 76}, bytes.Repeat([]byte{0x49}, 76)...),\n\t\t},\n\t\t{\n\t\t\tname:     \"push data len 255\",\n\t\t\tdata:     bytes.Repeat([]byte{0x49}, 255),\n\t\t\texpected: append([]byte{OP_PUSHDATA1, 255}, bytes.Repeat([]byte{0x49}, 255)...),\n\t\t},\n\n\t\t// BIP0062: Pushing 256 to 520 bytes must use OP_PUSHDATA2.\n\t\t{\n\t\t\tname:     \"push data len 256\",\n\t\t\tdata:     bytes.Repeat([]byte{0x49}, 256),\n\t\t\texpected: append([]byte{OP_PUSHDATA2, 0, 1}, bytes.Repeat([]byte{0x49}, 256)...),\n\t\t},\n\t\t{\n\t\t\tname:     \"push data len 520\",\n\t\t\tdata:     bytes.Repeat([]byte{0x49}, 520),\n\t\t\texpected: append([]byte{OP_PUSHDATA2, 0x08, 0x02}, bytes.Repeat([]byte{0x49}, 520)...),\n\t\t},\n\n\t\t// BIP0062: OP_PUSHDATA4 can never be used, as pushes over 520\n\t\t// bytes are not allowed, and those below can be done using\n\t\t// other operators.\n\t\t{\n\t\t\tname:     \"push data len 521\",\n\t\t\tdata:     bytes.Repeat([]byte{0x49}, 521),\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tname:     \"push data len 32767 (canonical)\",\n\t\t\tdata:     bytes.Repeat([]byte{0x49}, 32767),\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tname:     \"push data len 65536 (canonical)\",\n\t\t\tdata:     bytes.Repeat([]byte{0x49}, 65536),\n\t\t\texpected: nil,\n\t\t},\n\n\t\t// Additional tests for the PushFullData function that\n\t\t// intentionally allows data pushes to exceed the limit for\n\t\t// regression testing purposes.\n\n\t\t// 3-byte data push via OP_PUSHDATA_2.\n\t\t{\n\t\t\tname:     \"push data len 32767 (non-canonical)\",\n\t\t\tdata:     bytes.Repeat([]byte{0x49}, 32767),\n\t\t\texpected: append([]byte{OP_PUSHDATA2, 255, 127}, bytes.Repeat([]byte{0x49}, 32767)...),\n\t\t\tuseFull:  true,\n\t\t},\n\n\t\t// 5-byte data push via OP_PUSHDATA_4.\n\t\t{\n\t\t\tname:     \"push data len 65536 (non-canonical)\",\n\t\t\tdata:     bytes.Repeat([]byte{0x49}, 65536),\n\t\t\texpected: append([]byte{OP_PUSHDATA4, 0, 0, 1, 0}, bytes.Repeat([]byte{0x49}, 65536)...),\n\t\t\tuseFull:  true,\n\t\t},\n\t}\n\n\tbuilder := NewScriptBuilder()\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tif !test.useFull {\n\t\t\tbuilder.Reset().AddData(test.data)\n\t\t} else {\n\t\t\tbuilder.Reset().AddFullData(test.data)\n\t\t}\n\t\tresult, _ := builder.Script()\n\t\tif !bytes.Equal(result, test.expected) {\n\t\t\tt.Errorf(\"ScriptBuilder.AddData #%d (%s) wrong result\\n\"+\n\t\t\t\t\"got: %x\\nwant: %x\", i, test.name, result,\n\t\t\t\ttest.expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestExceedMaxScriptSize ensures that all of the functions that can be used\n// to add data to a script don't allow the script to exceed the max allowed\n// size.\nfunc TestExceedMaxScriptSize(t *testing.T) {\n\tt.Parallel()\n\n\t// Start off by constructing a max size script.\n\tbuilder := NewScriptBuilder()\n\tbuilder.Reset().AddFullData(make([]byte, MaxScriptSize-3))\n\torigScript, err := builder.Script()\n\tif err != nil {\n\t\tt.Fatalf(\"Unexpected error for max size script: %v\", err)\n\t}\n\n\t// Ensure adding data that would exceed the maximum size of the script\n\t// does not add the data.\n\tscript, err := builder.AddData([]byte{0x00}).Script()\n\tif _, ok := err.(ErrScriptNotCanonical); !ok || err == nil {\n\t\tt.Fatalf(\"ScriptBuilder.AddData allowed exceeding max script \"+\n\t\t\t\"size: %v\", len(script))\n\t}\n\tif !bytes.Equal(script, origScript) {\n\t\tt.Fatalf(\"ScriptBuilder.AddData unexpected modified script - \"+\n\t\t\t\"got len %d, want len %d\", len(script), len(origScript))\n\t}\n\n\t// Ensure adding an opcode that would exceed the maximum size of the\n\t// script does not add the data.\n\tbuilder.Reset().AddFullData(make([]byte, MaxScriptSize-3))\n\tscript, err = builder.AddOp(OP_0).Script()\n\tif _, ok := err.(ErrScriptNotCanonical); !ok || err == nil {\n\t\tt.Fatalf(\"ScriptBuilder.AddOp unexpected modified script - \"+\n\t\t\t\"got len %d, want len %d\", len(script), len(origScript))\n\t}\n\tif !bytes.Equal(script, origScript) {\n\t\tt.Fatalf(\"ScriptBuilder.AddOp unexpected modified script - \"+\n\t\t\t\"got len %d, want len %d\", len(script), len(origScript))\n\t}\n\n\t// Ensure adding an integer that would exceed the maximum size of the\n\t// script does not add the data.\n\tbuilder.Reset().AddFullData(make([]byte, MaxScriptSize-3))\n\tscript, err = builder.AddInt64(0).Script()\n\tif _, ok := err.(ErrScriptNotCanonical); !ok || err == nil {\n\t\tt.Fatalf(\"ScriptBuilder.AddInt64 unexpected modified script - \"+\n\t\t\t\"got len %d, want len %d\", len(script), len(origScript))\n\t}\n\tif !bytes.Equal(script, origScript) {\n\t\tt.Fatalf(\"ScriptBuilder.AddInt64 unexpected modified script - \"+\n\t\t\t\"got len %d, want len %d\", len(script), len(origScript))\n\t}\n}\n\n// TestErroredScript ensures that all of the functions that can be used to add\n// data to a script don't modify the script once an error has happened.\nfunc TestErroredScript(t *testing.T) {\n\tt.Parallel()\n\n\t// Start off by constructing a near max size script that has enough\n\t// space left to add each data type without an error and force an\n\t// initial error condition.\n\tbuilder := NewScriptBuilder()\n\tbuilder.Reset().AddFullData(make([]byte, MaxScriptSize-8))\n\torigScript, err := builder.Script()\n\tif err != nil {\n\t\tt.Fatalf(\"ScriptBuilder.AddFullData unexpected error: %v\", err)\n\t}\n\tscript, err := builder.AddData([]byte{0x00, 0x00, 0x00, 0x00, 0x00}).Script()\n\tif _, ok := err.(ErrScriptNotCanonical); !ok || err == nil {\n\t\tt.Fatalf(\"ScriptBuilder.AddData allowed exceeding max script \"+\n\t\t\t\"size: %v\", len(script))\n\t}\n\tif !bytes.Equal(script, origScript) {\n\t\tt.Fatalf(\"ScriptBuilder.AddData unexpected modified script - \"+\n\t\t\t\"got len %d, want len %d\", len(script), len(origScript))\n\t}\n\n\t// Ensure adding data, even using the non-canonical path, to a script\n\t// that has errored doesn't succeed.\n\tscript, err = builder.AddFullData([]byte{0x00}).Script()\n\tif _, ok := err.(ErrScriptNotCanonical); !ok || err == nil {\n\t\tt.Fatal(\"ScriptBuilder.AddFullData succeeded on errored script\")\n\t}\n\tif !bytes.Equal(script, origScript) {\n\t\tt.Fatalf(\"ScriptBuilder.AddFullData unexpected modified \"+\n\t\t\t\"script - got len %d, want len %d\", len(script),\n\t\t\tlen(origScript))\n\t}\n\n\t// Ensure adding data to a script that has errored doesn't succeed.\n\tscript, err = builder.AddData([]byte{0x00}).Script()\n\tif _, ok := err.(ErrScriptNotCanonical); !ok || err == nil {\n\t\tt.Fatal(\"ScriptBuilder.AddData succeeded on errored script\")\n\t}\n\tif !bytes.Equal(script, origScript) {\n\t\tt.Fatalf(\"ScriptBuilder.AddData unexpected modified \"+\n\t\t\t\"script - got len %d, want len %d\", len(script),\n\t\t\tlen(origScript))\n\t}\n\n\t// Ensure adding an opcode to a script that has errored doesn't succeed.\n\tscript, err = builder.AddOp(OP_0).Script()\n\tif _, ok := err.(ErrScriptNotCanonical); !ok || err == nil {\n\t\tt.Fatal(\"ScriptBuilder.AddOp succeeded on errored script\")\n\t}\n\tif !bytes.Equal(script, origScript) {\n\t\tt.Fatalf(\"ScriptBuilder.AddOp unexpected modified script - \"+\n\t\t\t\"got len %d, want len %d\", len(script), len(origScript))\n\t}\n\n\t// Ensure adding an integer to a script that has errored doesn't\n\t// succeed.\n\tscript, err = builder.AddInt64(0).Script()\n\tif _, ok := err.(ErrScriptNotCanonical); !ok || err == nil {\n\t\tt.Fatal(\"ScriptBuilder.AddInt64 succeeded on errored script\")\n\t}\n\tif !bytes.Equal(script, origScript) {\n\t\tt.Fatalf(\"ScriptBuilder.AddInt64 unexpected modified script - \"+\n\t\t\t\"got len %d, want len %d\", len(script), len(origScript))\n\t}\n\n\t// Ensure the error has a message set.\n\tif err.Error() == \"\" {\n\t\tt.Fatal(\"ErrScriptNotCanonical.Error does not have any text\")\n\t}\n}\n"
  },
  {
    "path": "txscript/scriptnum.go",
    "content": "// Copyright (c) 2015-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"fmt\"\n)\n\nconst (\n\tmaxInt32 = 1<<31 - 1\n\tminInt32 = -1 << 31\n\n\t// maxScriptNumLen is the maximum number of bytes data being interpreted\n\t// as an integer may be for the majority of op codes.\n\tmaxScriptNumLen = 4\n\n\t// cltvMaxScriptNumLen is the maximum number of bytes data being interpreted\n\t// as an integer may be for by-time and by-height locks as interpreted by\n\t// CHECKLOCKTIMEVERIFY.\n\t//\n\t// The value comes from the fact that the current transaction locktime\n\t// is a uint32 resulting in a maximum locktime of 2^32-1 (the year\n\t// 2106).  However, scriptNums are signed and therefore a standard\n\t// 4-byte scriptNum would only support up to a maximum of 2^31-1 (the\n\t// year 2038).  Thus, a 5-byte scriptNum is needed since it will support\n\t// up to 2^39-1 which allows dates beyond the current locktime limit.\n\tcltvMaxScriptNumLen = 5\n)\n\n// scriptNum represents a numeric value used in the scripting engine with\n// special handling to deal with the subtle semantics required by consensus.\n//\n// All numbers are stored on the data and alternate stacks encoded as little\n// endian with a sign bit.  All numeric opcodes such as OP_ADD, OP_SUB,\n// and OP_MUL, are only allowed to operate on 4-byte integers in the range\n// [-2^31 + 1, 2^31 - 1], however the results of numeric operations may overflow\n// and remain valid so long as they are not used as inputs to other numeric\n// operations or otherwise interpreted as an integer.\n//\n// For example, it is possible for OP_ADD to have 2^31 - 1 for its two operands\n// resulting 2^32 - 2, which overflows, but is still pushed to the stack as the\n// result of the addition.  That value can then be used as input to OP_VERIFY\n// which will succeed because the data is being interpreted as a boolean.\n// However, if that same value were to be used as input to another numeric\n// opcode, such as OP_SUB, it must fail.\n//\n// This type handles the aforementioned requirements by storing all numeric\n// operation results as an int64 to handle overflow and provides the Bytes\n// method to get the serialized representation (including values that overflow).\n//\n// Then, whenever data is interpreted as an integer, it is converted to this\n// type by using the MakeScriptNum function which will return an error if the\n// number is out of range or not minimally encoded depending on parameters.\n// Since all numeric opcodes involve pulling data from the stack and\n// interpreting it as an integer, it provides the required behavior.\ntype scriptNum int64\n\n// checkMinimalDataEncoding returns whether or not the passed byte array adheres\n// to the minimal encoding requirements.\nfunc checkMinimalDataEncoding(v []byte) error {\n\tif len(v) == 0 {\n\t\treturn nil\n\t}\n\n\t// Check that the number is encoded with the minimum possible\n\t// number of bytes.\n\t//\n\t// If the most-significant-byte - excluding the sign bit - is zero\n\t// then we're not minimal.  Note how this test also rejects the\n\t// negative-zero encoding, [0x80].\n\tif v[len(v)-1]&0x7f == 0 {\n\t\t// One exception: if there's more than one byte and the most\n\t\t// significant bit of the second-most-significant-byte is set\n\t\t// it would conflict with the sign bit.  An example of this case\n\t\t// is +-255, which encode to 0xff00 and 0xff80 respectively.\n\t\t// (big-endian).\n\t\tif len(v) == 1 || v[len(v)-2]&0x80 == 0 {\n\t\t\tstr := fmt.Sprintf(\"numeric value encoded as %x is \"+\n\t\t\t\t\"not minimally encoded\", v)\n\t\t\treturn scriptError(ErrMinimalData, str)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Bytes returns the number serialized as a little endian with a sign bit.\n//\n// Example encodings:\n//\n//\t   127 -> [0x7f]\n//\t  -127 -> [0xff]\n//\t   128 -> [0x80 0x00]\n//\t  -128 -> [0x80 0x80]\n//\t   129 -> [0x81 0x00]\n//\t  -129 -> [0x81 0x80]\n//\t   256 -> [0x00 0x01]\n//\t  -256 -> [0x00 0x81]\n//\t 32767 -> [0xff 0x7f]\n//\t-32767 -> [0xff 0xff]\n//\t 32768 -> [0x00 0x80 0x00]\n//\t-32768 -> [0x00 0x80 0x80]\nfunc (n scriptNum) Bytes() []byte {\n\t// Zero encodes as an empty byte slice.\n\tif n == 0 {\n\t\treturn nil\n\t}\n\n\t// Take the absolute value and keep track of whether it was originally\n\t// negative.\n\tisNegative := n < 0\n\tif isNegative {\n\t\tn = -n\n\t}\n\n\t// Encode to little endian.  The maximum number of encoded bytes is 9\n\t// (8 bytes for max int64 plus a potential byte for sign extension).\n\tresult := make([]byte, 0, 9)\n\tfor n > 0 {\n\t\tresult = append(result, byte(n&0xff))\n\t\tn >>= 8\n\t}\n\n\t// When the most significant byte already has the high bit set, an\n\t// additional high byte is required to indicate whether the number is\n\t// negative or positive.  The additional byte is removed when converting\n\t// back to an integral and its high bit is used to denote the sign.\n\t//\n\t// Otherwise, when the most significant byte does not already have the\n\t// high bit set, use it to indicate the value is negative, if needed.\n\tif result[len(result)-1]&0x80 != 0 {\n\t\textraByte := byte(0x00)\n\t\tif isNegative {\n\t\t\textraByte = 0x80\n\t\t}\n\t\tresult = append(result, extraByte)\n\n\t} else if isNegative {\n\t\tresult[len(result)-1] |= 0x80\n\t}\n\n\treturn result\n}\n\n// Int32 returns the script number clamped to a valid int32.  That is to say\n// when the script number is higher than the max allowed int32, the max int32\n// value is returned and vice versa for the minimum value.  Note that this\n// behavior is different from a simple int32 cast because that truncates\n// and the consensus rules dictate numbers which are directly cast to ints\n// provide this behavior.\n//\n// In practice, for most opcodes, the number should never be out of range since\n// it will have been created with MakeScriptNum using the defaultScriptLen\n// value, which rejects them.  In case something in the future ends up calling\n// this function against the result of some arithmetic, which IS allowed to be\n// out of range before being reinterpreted as an integer, this will provide the\n// correct behavior.\nfunc (n scriptNum) Int32() int32 {\n\tif n > maxInt32 {\n\t\treturn maxInt32\n\t}\n\n\tif n < minInt32 {\n\t\treturn minInt32\n\t}\n\n\treturn int32(n)\n}\n\n// MakeScriptNum interprets the passed serialized bytes as an encoded integer\n// and returns the result as a script number.\n//\n// Since the consensus rules dictate that serialized bytes interpreted as ints\n// are only allowed to be in the range determined by a maximum number of bytes,\n// on a per opcode basis, an error will be returned when the provided bytes\n// would result in a number outside of that range.  In particular, the range for\n// the vast majority of opcodes dealing with numeric values are limited to 4\n// bytes and therefore will pass that value to this function resulting in an\n// allowed range of [-2^31 + 1, 2^31 - 1].\n//\n// The requireMinimal flag causes an error to be returned if additional checks\n// on the encoding determine it is not represented with the smallest possible\n// number of bytes or is the negative 0 encoding, [0x80].  For example, consider\n// the number 127.  It could be encoded as [0x7f], [0x7f 0x00],\n// [0x7f 0x00 0x00 ...], etc.  All forms except [0x7f] will return an error with\n// requireMinimal enabled.\n//\n// The scriptNumLen is the maximum number of bytes the encoded value can be\n// before an ErrStackNumberTooBig is returned.  This effectively limits the\n// range of allowed values.\n// WARNING:  Great care should be taken if passing a value larger than\n// maxScriptNumLen, which could lead to addition and multiplication\n// overflows.\n//\n// See the Bytes function documentation for example encodings.\nfunc MakeScriptNum(v []byte, requireMinimal bool, scriptNumLen int) (scriptNum, error) {\n\t// Interpreting data requires that it is not larger than\n\t// the passed scriptNumLen value.\n\tif len(v) > scriptNumLen {\n\t\tstr := fmt.Sprintf(\"numeric value encoded as %x is %d bytes \"+\n\t\t\t\"which exceeds the max allowed of %d\", v, len(v),\n\t\t\tscriptNumLen)\n\t\treturn 0, scriptError(ErrNumberTooBig, str)\n\t}\n\n\t// Enforce minimal encoded if requested.\n\tif requireMinimal {\n\t\tif err := checkMinimalDataEncoding(v); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\n\t// Zero is encoded as an empty byte slice.\n\tif len(v) == 0 {\n\t\treturn 0, nil\n\t}\n\n\t// Decode from little endian.\n\tvar result int64\n\tfor i, val := range v {\n\t\tresult |= int64(val) << uint8(8*i)\n\t}\n\n\t// When the most significant byte of the input bytes has the sign bit\n\t// set, the result is negative.  So, remove the sign bit from the result\n\t// and make it negative.\n\tif v[len(v)-1]&0x80 != 0 {\n\t\t// The maximum length of v has already been determined to be 4\n\t\t// above, so uint8 is enough to cover the max possible shift\n\t\t// value of 24.\n\t\tresult &= ^(int64(0x80) << uint8(8*(len(v)-1)))\n\t\treturn scriptNum(-result), nil\n\t}\n\n\treturn scriptNum(result), nil\n}\n"
  },
  {
    "path": "txscript/scriptnum_test.go",
    "content": "// Copyright (c) 2015-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"testing\"\n)\n\n// hexToBytes converts the passed hex string into bytes and will panic if there\n// is an error.  This is only provided for the hard-coded constants so errors in\n// the source code can be detected. It will only (and must only) be called with\n// hard-coded values.\nfunc hexToBytes(s string) []byte {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(\"invalid hex in source file: \" + s)\n\t}\n\treturn b\n}\n\n// TestScriptNumBytes ensures that converting from integral script numbers to\n// byte representations works as expected.\nfunc TestScriptNumBytes(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tnum        scriptNum\n\t\tserialized []byte\n\t}{\n\t\t{0, nil},\n\t\t{1, hexToBytes(\"01\")},\n\t\t{-1, hexToBytes(\"81\")},\n\t\t{127, hexToBytes(\"7f\")},\n\t\t{-127, hexToBytes(\"ff\")},\n\t\t{128, hexToBytes(\"8000\")},\n\t\t{-128, hexToBytes(\"8080\")},\n\t\t{129, hexToBytes(\"8100\")},\n\t\t{-129, hexToBytes(\"8180\")},\n\t\t{256, hexToBytes(\"0001\")},\n\t\t{-256, hexToBytes(\"0081\")},\n\t\t{32767, hexToBytes(\"ff7f\")},\n\t\t{-32767, hexToBytes(\"ffff\")},\n\t\t{32768, hexToBytes(\"008000\")},\n\t\t{-32768, hexToBytes(\"008080\")},\n\t\t{65535, hexToBytes(\"ffff00\")},\n\t\t{-65535, hexToBytes(\"ffff80\")},\n\t\t{524288, hexToBytes(\"000008\")},\n\t\t{-524288, hexToBytes(\"000088\")},\n\t\t{7340032, hexToBytes(\"000070\")},\n\t\t{-7340032, hexToBytes(\"0000f0\")},\n\t\t{8388608, hexToBytes(\"00008000\")},\n\t\t{-8388608, hexToBytes(\"00008080\")},\n\t\t{2147483647, hexToBytes(\"ffffff7f\")},\n\t\t{-2147483647, hexToBytes(\"ffffffff\")},\n\n\t\t// Values that are out of range for data that is interpreted as\n\t\t// numbers, but are allowed as the result of numeric operations.\n\t\t{2147483648, hexToBytes(\"0000008000\")},\n\t\t{-2147483648, hexToBytes(\"0000008080\")},\n\t\t{2415919104, hexToBytes(\"0000009000\")},\n\t\t{-2415919104, hexToBytes(\"0000009080\")},\n\t\t{4294967295, hexToBytes(\"ffffffff00\")},\n\t\t{-4294967295, hexToBytes(\"ffffffff80\")},\n\t\t{4294967296, hexToBytes(\"0000000001\")},\n\t\t{-4294967296, hexToBytes(\"0000000081\")},\n\t\t{281474976710655, hexToBytes(\"ffffffffffff00\")},\n\t\t{-281474976710655, hexToBytes(\"ffffffffffff80\")},\n\t\t{72057594037927935, hexToBytes(\"ffffffffffffff00\")},\n\t\t{-72057594037927935, hexToBytes(\"ffffffffffffff80\")},\n\t\t{9223372036854775807, hexToBytes(\"ffffffffffffff7f\")},\n\t\t{-9223372036854775807, hexToBytes(\"ffffffffffffffff\")},\n\t}\n\n\tfor _, test := range tests {\n\t\tgotBytes := test.num.Bytes()\n\t\tif !bytes.Equal(gotBytes, test.serialized) {\n\t\t\tt.Errorf(\"Bytes: did not get expected bytes for %d - \"+\n\t\t\t\t\"got %x, want %x\", test.num, gotBytes,\n\t\t\t\ttest.serialized)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMakeScriptNum ensures that converting from byte representations to\n// integral script numbers works as expected.\nfunc TestMakeScriptNum(t *testing.T) {\n\tt.Parallel()\n\n\t// Errors used in the tests below defined here for convenience and to\n\t// keep the horizontal test size shorter.\n\terrNumTooBig := scriptError(ErrNumberTooBig, \"\")\n\terrMinimalData := scriptError(ErrMinimalData, \"\")\n\n\ttests := []struct {\n\t\tserialized      []byte\n\t\tnum             scriptNum\n\t\tnumLen          int\n\t\tminimalEncoding bool\n\t\terr             error\n\t}{\n\t\t// Minimal encoding must reject negative 0.\n\t\t{hexToBytes(\"80\"), 0, maxScriptNumLen, true, errMinimalData},\n\n\t\t// Minimally encoded valid values with minimal encoding flag.\n\t\t// Should not error and return expected integral number.\n\t\t{nil, 0, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"01\"), 1, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"81\"), -1, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"7f\"), 127, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"ff\"), -127, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"8000\"), 128, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"8080\"), -128, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"8100\"), 129, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"8180\"), -129, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"0001\"), 256, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"0081\"), -256, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"ff7f\"), 32767, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"ffff\"), -32767, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"008000\"), 32768, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"008080\"), -32768, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"ffff00\"), 65535, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"ffff80\"), -65535, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"000008\"), 524288, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"000088\"), -524288, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"000070\"), 7340032, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"0000f0\"), -7340032, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"00008000\"), 8388608, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"00008080\"), -8388608, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"ffffff7f\"), 2147483647, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"ffffffff\"), -2147483647, maxScriptNumLen, true, nil},\n\t\t{hexToBytes(\"ffffffff7f\"), 549755813887, 5, true, nil},\n\t\t{hexToBytes(\"ffffffffff\"), -549755813887, 5, true, nil},\n\t\t{hexToBytes(\"ffffffffffffff7f\"), 9223372036854775807, 8, true, nil},\n\t\t{hexToBytes(\"ffffffffffffffff\"), -9223372036854775807, 8, true, nil},\n\t\t{hexToBytes(\"ffffffffffffffff7f\"), -1, 9, true, nil},\n\t\t{hexToBytes(\"ffffffffffffffffff\"), 1, 9, true, nil},\n\t\t{hexToBytes(\"ffffffffffffffffff7f\"), -1, 10, true, nil},\n\t\t{hexToBytes(\"ffffffffffffffffffff\"), 1, 10, true, nil},\n\n\t\t// Minimally encoded values that are out of range for data that\n\t\t// is interpreted as script numbers with the minimal encoding\n\t\t// flag set.  Should error and return 0.\n\t\t{hexToBytes(\"0000008000\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"0000008080\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"0000009000\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"0000009080\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"ffffffff00\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"ffffffff80\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"0000000001\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"0000000081\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"ffffffffffff00\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"ffffffffffff80\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"ffffffffffffff00\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"ffffffffffffff80\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"ffffffffffffff7f\"), 0, maxScriptNumLen, true, errNumTooBig},\n\t\t{hexToBytes(\"ffffffffffffffff\"), 0, maxScriptNumLen, true, errNumTooBig},\n\n\t\t// Non-minimally encoded, but otherwise valid values with\n\t\t// minimal encoding flag.  Should error and return 0.\n\t\t{hexToBytes(\"00\"), 0, maxScriptNumLen, true, errMinimalData},       // 0\n\t\t{hexToBytes(\"0100\"), 0, maxScriptNumLen, true, errMinimalData},     // 1\n\t\t{hexToBytes(\"7f00\"), 0, maxScriptNumLen, true, errMinimalData},     // 127\n\t\t{hexToBytes(\"800000\"), 0, maxScriptNumLen, true, errMinimalData},   // 128\n\t\t{hexToBytes(\"810000\"), 0, maxScriptNumLen, true, errMinimalData},   // 129\n\t\t{hexToBytes(\"000100\"), 0, maxScriptNumLen, true, errMinimalData},   // 256\n\t\t{hexToBytes(\"ff7f00\"), 0, maxScriptNumLen, true, errMinimalData},   // 32767\n\t\t{hexToBytes(\"00800000\"), 0, maxScriptNumLen, true, errMinimalData}, // 32768\n\t\t{hexToBytes(\"ffff0000\"), 0, maxScriptNumLen, true, errMinimalData}, // 65535\n\t\t{hexToBytes(\"00000800\"), 0, maxScriptNumLen, true, errMinimalData}, // 524288\n\t\t{hexToBytes(\"00007000\"), 0, maxScriptNumLen, true, errMinimalData}, // 7340032\n\t\t{hexToBytes(\"0009000100\"), 0, 5, true, errMinimalData},             // 16779520\n\n\t\t// Non-minimally encoded, but otherwise valid values without\n\t\t// minimal encoding flag.  Should not error and return expected\n\t\t// integral number.\n\t\t{hexToBytes(\"00\"), 0, maxScriptNumLen, false, nil},\n\t\t{hexToBytes(\"0100\"), 1, maxScriptNumLen, false, nil},\n\t\t{hexToBytes(\"7f00\"), 127, maxScriptNumLen, false, nil},\n\t\t{hexToBytes(\"800000\"), 128, maxScriptNumLen, false, nil},\n\t\t{hexToBytes(\"810000\"), 129, maxScriptNumLen, false, nil},\n\t\t{hexToBytes(\"000100\"), 256, maxScriptNumLen, false, nil},\n\t\t{hexToBytes(\"ff7f00\"), 32767, maxScriptNumLen, false, nil},\n\t\t{hexToBytes(\"00800000\"), 32768, maxScriptNumLen, false, nil},\n\t\t{hexToBytes(\"ffff0000\"), 65535, maxScriptNumLen, false, nil},\n\t\t{hexToBytes(\"00000800\"), 524288, maxScriptNumLen, false, nil},\n\t\t{hexToBytes(\"00007000\"), 7340032, maxScriptNumLen, false, nil},\n\t\t{hexToBytes(\"0009000100\"), 16779520, 5, false, nil},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Ensure the error code is of the expected type and the error\n\t\t// code matches the value specified in the test instance.\n\t\tgotNum, err := MakeScriptNum(test.serialized, test.minimalEncoding,\n\t\t\ttest.numLen)\n\t\tif e := tstCheckScriptError(err, test.err); e != nil {\n\t\t\tt.Errorf(\"MakeScriptNum(%#x): %v\", test.serialized, e)\n\t\t\tcontinue\n\t\t}\n\n\t\tif gotNum != test.num {\n\t\t\tt.Errorf(\"MakeScriptNum(%#x): did not get expected \"+\n\t\t\t\t\"number - got %d, want %d\", test.serialized,\n\t\t\t\tgotNum, test.num)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestScriptNumInt32 ensures that the Int32 function on script number behaves\n// as expected.\nfunc TestScriptNumInt32(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tin   scriptNum\n\t\twant int32\n\t}{\n\t\t// Values inside the valid int32 range are just the values\n\t\t// themselves cast to an int32.\n\t\t{0, 0},\n\t\t{1, 1},\n\t\t{-1, -1},\n\t\t{127, 127},\n\t\t{-127, -127},\n\t\t{128, 128},\n\t\t{-128, -128},\n\t\t{129, 129},\n\t\t{-129, -129},\n\t\t{256, 256},\n\t\t{-256, -256},\n\t\t{32767, 32767},\n\t\t{-32767, -32767},\n\t\t{32768, 32768},\n\t\t{-32768, -32768},\n\t\t{65535, 65535},\n\t\t{-65535, -65535},\n\t\t{524288, 524288},\n\t\t{-524288, -524288},\n\t\t{7340032, 7340032},\n\t\t{-7340032, -7340032},\n\t\t{8388608, 8388608},\n\t\t{-8388608, -8388608},\n\t\t{2147483647, 2147483647},\n\t\t{-2147483647, -2147483647},\n\t\t{-2147483648, -2147483648},\n\n\t\t// Values outside of the valid int32 range are limited to int32.\n\t\t{2147483648, 2147483647},\n\t\t{-2147483649, -2147483648},\n\t\t{1152921504606846975, 2147483647},\n\t\t{-1152921504606846975, -2147483648},\n\t\t{2305843009213693951, 2147483647},\n\t\t{-2305843009213693951, -2147483648},\n\t\t{4611686018427387903, 2147483647},\n\t\t{-4611686018427387903, -2147483648},\n\t\t{9223372036854775807, 2147483647},\n\t\t{-9223372036854775808, -2147483648},\n\t}\n\n\tfor _, test := range tests {\n\t\tgot := test.in.Int32()\n\t\tif got != test.want {\n\t\t\tt.Errorf(\"Int32: did not get expected value for %d - \"+\n\t\t\t\t\"got %d, want %d\", test.in, got, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "txscript/sigcache.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"sync\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// sigCacheEntry represents an entry in the SigCache. Entries within the\n// SigCache are keyed according to the sigHash of the signature. In the\n// scenario of a cache-hit (according to the sigHash), an additional comparison\n// of the signature, and public key will be executed in order to ensure a complete\n// match. In the occasion that two sigHashes collide, the newer sigHash will\n// simply overwrite the existing entry.\ntype sigCacheEntry struct {\n\tsig    []byte\n\tpubKey []byte\n}\n\n// SigCache implements an Schnorr+ECDSA signature verification cache with a\n// randomized entry eviction policy. Only valid signatures will be added to the\n// cache. The benefits of SigCache are two fold. Firstly, usage of SigCache\n// mitigates a DoS attack wherein an attack causes a victim's client to hang\n// due to worst-case behavior triggered while processing attacker crafted\n// invalid transactions. A detailed description of the mitigated DoS attack can\n// be found here:\n// https://bitslog.wordpress.com/2013/01/23/fixed-bitcoin-vulnerability-explanation-why-the-signature-cache-is-a-dos-protection/.\n// Secondly, usage of the SigCache introduces a signature verification\n// optimization which speeds up the validation of transactions within a block,\n// if they've already been seen and verified within the mempool.\n//\n// TODO(roasbeef): use type params here after Go 1.18\ntype SigCache struct {\n\tsync.RWMutex\n\tvalidSigs  map[chainhash.Hash]sigCacheEntry\n\tmaxEntries uint\n}\n\n// NewSigCache creates and initializes a new instance of SigCache. Its sole\n// parameter 'maxEntries' represents the maximum number of entries allowed to\n// exist in the SigCache at any particular moment. Random entries are evicted\n// to make room for new entries that would cause the number of entries in the\n// cache to exceed the max.\nfunc NewSigCache(maxEntries uint) *SigCache {\n\treturn &SigCache{\n\t\tvalidSigs:  make(map[chainhash.Hash]sigCacheEntry, maxEntries),\n\t\tmaxEntries: maxEntries,\n\t}\n}\n\n// Exists returns true if an existing entry of 'sig' over 'sigHash' for public\n// key 'pubKey' is found within the SigCache. Otherwise, false is returned.\n//\n// NOTE: This function is safe for concurrent access. Readers won't be blocked\n// unless there exists a writer, adding an entry to the SigCache.\nfunc (s *SigCache) Exists(sigHash chainhash.Hash, sig []byte, pubKey []byte) bool {\n\ts.RLock()\n\tentry, ok := s.validSigs[sigHash]\n\ts.RUnlock()\n\n\treturn ok && bytes.Equal(entry.pubKey, pubKey) && bytes.Equal(entry.sig, sig)\n}\n\n// Add adds an entry for a signature over 'sigHash' under public key 'pubKey'\n// to the signature cache. In the event that the SigCache is 'full', an\n// existing entry is randomly chosen to be evicted in order to make space for\n// the new entry.\n//\n// NOTE: This function is safe for concurrent access. Writers will block\n// simultaneous readers until function execution has concluded.\nfunc (s *SigCache) Add(sigHash chainhash.Hash, sig []byte, pubKey []byte) {\n\ts.Lock()\n\tdefer s.Unlock()\n\n\tif s.maxEntries <= 0 {\n\t\treturn\n\t}\n\n\t// If adding this new entry will put us over the max number of allowed\n\t// entries, then evict an entry.\n\tif uint(len(s.validSigs)+1) > s.maxEntries {\n\t\t// Remove a random entry from the map. Relying on the random\n\t\t// starting point of Go's map iteration. It's worth noting that\n\t\t// the random iteration starting point is not 100% guaranteed\n\t\t// by the spec, however most Go compilers support it.\n\t\t// Ultimately, the iteration order isn't important here because\n\t\t// in order to manipulate which items are evicted, an adversary\n\t\t// would need to be able to execute preimage attacks on the\n\t\t// hashing function in order to start eviction at a specific\n\t\t// entry.\n\t\tfor sigEntry := range s.validSigs {\n\t\t\tdelete(s.validSigs, sigEntry)\n\t\t\tbreak\n\t\t}\n\t}\n\ts.validSigs[sigHash] = sigCacheEntry{sig, pubKey}\n}\n"
  },
  {
    "path": "txscript/sigcache_test.go",
    "content": "// Copyright (c) 2015-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"crypto/rand\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/ecdsa\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// genRandomSig returns a random message, a signature of the message under the\n// public key and the public key. This function is used to generate randomized\n// test data.\nfunc genRandomSig() (*chainhash.Hash, *ecdsa.Signature, *btcec.PublicKey, error) {\n\tprivKey, err := btcec.NewPrivateKey()\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\n\tvar msgHash chainhash.Hash\n\tif _, err := rand.Read(msgHash[:]); err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\n\tsig := ecdsa.Sign(privKey, msgHash[:])\n\n\treturn &msgHash, sig, privKey.PubKey(), nil\n}\n\n// TestSigCacheAddExists tests the ability to add, and later check the\n// existence of a signature triplet in the signature cache.\nfunc TestSigCacheAddExists(t *testing.T) {\n\tsigCache := NewSigCache(200)\n\n\t// Generate a random sigCache entry triplet.\n\tmsg1, sig1, key1, err := genRandomSig()\n\tif err != nil {\n\t\tt.Errorf(\"unable to generate random signature test data\")\n\t}\n\n\t// Add the triplet to the signature cache.\n\tsigCache.Add(*msg1, sig1.Serialize(), key1.SerializeCompressed())\n\n\t// The previously added triplet should now be found within the sigcache.\n\tsig1Copy, _ := ecdsa.ParseSignature(sig1.Serialize())\n\tkey1Copy, _ := btcec.ParsePubKey(key1.SerializeCompressed())\n\tif !sigCache.Exists(*msg1, sig1Copy.Serialize(), key1Copy.SerializeCompressed()) {\n\t\tt.Errorf(\"previously added item not found in signature cache\")\n\t}\n}\n\n// TestSigCacheAddEvictEntry tests the eviction case where a new signature\n// triplet is added to a full signature cache which should trigger randomized\n// eviction, followed by adding the new element to the cache.\nfunc TestSigCacheAddEvictEntry(t *testing.T) {\n\t// Create a sigcache that can hold up to 100 entries.\n\tsigCacheSize := uint(100)\n\tsigCache := NewSigCache(sigCacheSize)\n\n\t// Fill the sigcache up with some random sig triplets.\n\tfor i := uint(0); i < sigCacheSize; i++ {\n\t\tmsg, sig, key, err := genRandomSig()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to generate random signature test data\")\n\t\t}\n\n\t\tsigCache.Add(*msg, sig.Serialize(), key.SerializeCompressed())\n\n\t\tsigCopy, err := ecdsa.ParseSignature(sig.Serialize())\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to parse sig: %v\", err)\n\t\t}\n\t\tkeyCopy, err := btcec.ParsePubKey(key.SerializeCompressed())\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unable to parse key: %v\", err)\n\t\t}\n\t\tif !sigCache.Exists(*msg, sigCopy.Serialize(), keyCopy.SerializeCompressed()) {\n\t\t\tt.Errorf(\"previously added item not found in signature\" +\n\t\t\t\t\"cache\")\n\t\t}\n\t}\n\n\t// The sigcache should now have sigCacheSize entries within it.\n\tif uint(len(sigCache.validSigs)) != sigCacheSize {\n\t\tt.Fatalf(\"sigcache should now have %v entries, instead it has %v\",\n\t\t\tsigCacheSize, len(sigCache.validSigs))\n\t}\n\n\t// Add a new entry, this should cause eviction of a randomly chosen\n\t// previous entry.\n\tmsgNew, sigNew, keyNew, err := genRandomSig()\n\tif err != nil {\n\t\tt.Fatalf(\"unable to generate random signature test data\")\n\t}\n\tsigCache.Add(*msgNew, sigNew.Serialize(), keyNew.SerializeCompressed())\n\n\t// The sigcache should still have sigCache entries.\n\tif uint(len(sigCache.validSigs)) != sigCacheSize {\n\t\tt.Fatalf(\"sigcache should now have %v entries, instead it has %v\",\n\t\t\tsigCacheSize, len(sigCache.validSigs))\n\t}\n\n\t// The entry added above should be found within the sigcache.\n\tsigNewCopy, _ := ecdsa.ParseSignature(sigNew.Serialize())\n\tkeyNewCopy, _ := btcec.ParsePubKey(keyNew.SerializeCompressed())\n\tif !sigCache.Exists(*msgNew, sigNewCopy.Serialize(), keyNewCopy.SerializeCompressed()) {\n\t\tt.Fatalf(\"previously added item not found in signature cache\")\n\t}\n}\n\n// TestSigCacheAddMaxEntriesZeroOrNegative tests that if a sigCache is created\n// with a max size <= 0, then no entries are added to the sigcache at all.\nfunc TestSigCacheAddMaxEntriesZeroOrNegative(t *testing.T) {\n\t// Create a sigcache that can hold up to 0 entries.\n\tsigCache := NewSigCache(0)\n\n\t// Generate a random sigCache entry triplet.\n\tmsg1, sig1, key1, err := genRandomSig()\n\tif err != nil {\n\t\tt.Errorf(\"unable to generate random signature test data\")\n\t}\n\n\t// Add the triplet to the signature cache.\n\tsigCache.Add(*msg1, sig1.Serialize(), key1.SerializeCompressed())\n\n\t// The generated triplet should not be found.\n\tsig1Copy, _ := ecdsa.ParseSignature(sig1.Serialize())\n\tkey1Copy, _ := btcec.ParsePubKey(key1.SerializeCompressed())\n\tif sigCache.Exists(*msg1, sig1Copy.Serialize(), key1Copy.SerializeCompressed()) {\n\t\tt.Errorf(\"previously added signature found in sigcache, but\" +\n\t\t\t\"shouldn't have been\")\n\t}\n\n\t// There shouldn't be any entries in the sigCache.\n\tif len(sigCache.validSigs) != 0 {\n\t\tt.Errorf(\"%v items found in sigcache, no items should have\"+\n\t\t\t\"been added\", len(sigCache.validSigs))\n\t}\n}\n"
  },
  {
    "path": "txscript/sighash.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Copyright (c) 2015-2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha256\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// SigHashType represents hash type bits at the end of a signature.\ntype SigHashType uint32\n\n// Hash type bits from the end of a signature.\nconst (\n\tSigHashDefault      SigHashType = 0x00\n\tSigHashOld          SigHashType = 0x0\n\tSigHashAll          SigHashType = 0x1\n\tSigHashNone         SigHashType = 0x2\n\tSigHashSingle       SigHashType = 0x3\n\tSigHashAnyOneCanPay SigHashType = 0x80\n\n\t// sigHashMask defines the number of bits of the hash type which is used\n\t// to identify which outputs are signed.\n\tsigHashMask = 0x1f\n)\n\nconst (\n\t// blankCodeSepValue is the value of the code separator position in the\n\t// tapscript sighash when no code separator was found in the script.\n\tblankCodeSepValue = math.MaxUint32\n)\n\n// shallowCopyTx creates a shallow copy of the transaction for use when\n// calculating the signature hash.  It is used over the Copy method on the\n// transaction itself since that is a deep copy and therefore does more work and\n// allocates much more space than needed.\nfunc shallowCopyTx(tx *wire.MsgTx) wire.MsgTx {\n\t// As an additional memory optimization, use contiguous backing arrays\n\t// for the copied inputs and outputs and point the final slice of\n\t// pointers into the contiguous arrays.  This avoids a lot of small\n\t// allocations.\n\ttxCopy := wire.MsgTx{\n\t\tVersion:  tx.Version,\n\t\tTxIn:     make([]*wire.TxIn, len(tx.TxIn)),\n\t\tTxOut:    make([]*wire.TxOut, len(tx.TxOut)),\n\t\tLockTime: tx.LockTime,\n\t}\n\ttxIns := make([]wire.TxIn, len(tx.TxIn))\n\tfor i, oldTxIn := range tx.TxIn {\n\t\ttxIns[i] = *oldTxIn\n\t\ttxCopy.TxIn[i] = &txIns[i]\n\t}\n\ttxOuts := make([]wire.TxOut, len(tx.TxOut))\n\tfor i, oldTxOut := range tx.TxOut {\n\t\ttxOuts[i] = *oldTxOut\n\t\ttxCopy.TxOut[i] = &txOuts[i]\n\t}\n\treturn txCopy\n}\n\n// CalcSignatureHash will, given a script and hash type for the current script\n// engine instance, calculate the signature hash to be used for signing and\n// verification.\n//\n// NOTE: This function is only valid for version 0 scripts. Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc CalcSignatureHash(script []byte, hashType SigHashType, tx *wire.MsgTx, idx int) ([]byte, error) {\n\tconst scriptVersion = 0\n\tif err := checkScriptParses(scriptVersion, script); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn calcSignatureHash(script, hashType, tx, idx), nil\n}\n\n// calcSignatureHash computes the signature hash for the specified input of the\n// target transaction observing the desired signature hash type.\nfunc calcSignatureHash(sigScript []byte, hashType SigHashType, tx *wire.MsgTx, idx int) []byte {\n\t// The SigHashSingle signature type signs only the corresponding input\n\t// and output (the output with the same index number as the input).\n\t//\n\t// Since transactions can have more inputs than outputs, this means it\n\t// is improper to use SigHashSingle on input indices that don't have a\n\t// corresponding output.\n\t//\n\t// A bug in the original Satoshi client implementation means specifying\n\t// an index that is out of range results in a signature hash of 1 (as a\n\t// uint256 little endian).  The original intent appeared to be to\n\t// indicate failure, but unfortunately, it was never checked and thus is\n\t// treated as the actual signature hash.  This buggy behavior is now\n\t// part of the consensus and a hard fork would be required to fix it.\n\t//\n\t// Due to this, care must be taken by software that creates transactions\n\t// which make use of SigHashSingle because it can lead to an extremely\n\t// dangerous situation where the invalid inputs will end up signing a\n\t// hash of 1.  This in turn presents an opportunity for attackers to\n\t// cleverly construct transactions which can steal those coins provided\n\t// they can reuse signatures.\n\tif hashType&sigHashMask == SigHashSingle && idx >= len(tx.TxOut) {\n\t\tvar hash chainhash.Hash\n\t\thash[0] = 0x01\n\t\treturn hash[:]\n\t}\n\n\t// Remove all instances of OP_CODESEPARATOR from the script.\n\tsigScript = removeOpcodeRaw(sigScript, OP_CODESEPARATOR)\n\n\t// Make a shallow copy of the transaction, zeroing out the script for\n\t// all inputs that are not currently being processed.\n\ttxCopy := shallowCopyTx(tx)\n\tfor i := range txCopy.TxIn {\n\t\tif i == idx {\n\t\t\ttxCopy.TxIn[idx].SignatureScript = sigScript\n\t\t} else {\n\t\t\ttxCopy.TxIn[i].SignatureScript = nil\n\t\t}\n\t}\n\n\tswitch hashType & sigHashMask {\n\tcase SigHashNone:\n\t\ttxCopy.TxOut = txCopy.TxOut[0:0] // Empty slice.\n\t\tfor i := range txCopy.TxIn {\n\t\t\tif i != idx {\n\t\t\t\ttxCopy.TxIn[i].Sequence = 0\n\t\t\t}\n\t\t}\n\n\tcase SigHashSingle:\n\t\t// Resize output array to up to and including requested index.\n\t\ttxCopy.TxOut = txCopy.TxOut[:idx+1]\n\n\t\t// All but current output get zeroed out.\n\t\tfor i := 0; i < idx; i++ {\n\t\t\ttxCopy.TxOut[i].Value = -1\n\t\t\ttxCopy.TxOut[i].PkScript = nil\n\t\t}\n\n\t\t// Sequence on all other inputs is 0, too.\n\t\tfor i := range txCopy.TxIn {\n\t\t\tif i != idx {\n\t\t\t\ttxCopy.TxIn[i].Sequence = 0\n\t\t\t}\n\t\t}\n\n\tdefault:\n\t\t// Consensus treats undefined hashtypes like normal SigHashAll\n\t\t// for purposes of hash generation.\n\t\tfallthrough\n\tcase SigHashOld:\n\t\tfallthrough\n\tcase SigHashAll:\n\t\t// Nothing special here.\n\t}\n\tif hashType&SigHashAnyOneCanPay != 0 {\n\t\ttxCopy.TxIn = txCopy.TxIn[idx : idx+1]\n\t}\n\n\t// The final hash is the double sha256 of both the serialized modified\n\t// transaction and the hash type (encoded as a 4-byte little-endian\n\t// value) appended.\n\tsigHashBytes := chainhash.DoubleHashRaw(func(w io.Writer) error {\n\t\tif err := txCopy.SerializeNoWitness(w); err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr := binary.Write(w, binary.LittleEndian, hashType)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n\n\treturn sigHashBytes[:]\n}\n\n// calcWitnessSignatureHashRaw computes the sighash digest of a transaction's\n// segwit input using the new, optimized digest calculation algorithm defined\n// in BIP0143: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki.\n// This function makes use of pre-calculated sighash fragments stored within\n// the passed HashCache to eliminate duplicate hashing computations when\n// calculating the final digest, reducing the complexity from O(N^2) to O(N).\n// Additionally, signatures now cover the input value of the referenced unspent\n// output. This allows offline, or hardware wallets to compute the exact amount\n// being spent, in addition to the final transaction fee. In the case the\n// wallet if fed an invalid input amount, the real sighash will differ causing\n// the produced signature to be invalid.\nfunc calcWitnessSignatureHashRaw(subScript []byte, sigHashes *TxSigHashes,\n\thashType SigHashType, tx *wire.MsgTx, idx int, amt int64) ([]byte, error) {\n\n\t// As a sanity check, ensure the passed input index for the transaction\n\t// is valid.\n\t//\n\t// TODO(roasbeef): check needs to be lifted elsewhere?\n\tif idx > len(tx.TxIn)-1 {\n\t\treturn nil, fmt.Errorf(\"idx %d but %d txins\", idx, len(tx.TxIn))\n\t}\n\n\tsigHashBytes := chainhash.DoubleHashRaw(func(w io.Writer) error {\n\t\tvar scratch [8]byte\n\n\t\t// First write out, then encode the transaction's version\n\t\t// number.\n\t\tbinary.LittleEndian.PutUint32(scratch[:], uint32(tx.Version))\n\t\tw.Write(scratch[:4])\n\n\t\t// Next write out the possibly pre-calculated hashes for the\n\t\t// sequence numbers of all inputs, and the hashes of the\n\t\t// previous outs for all outputs.\n\t\tvar zeroHash chainhash.Hash\n\n\t\t// If anyone can pay isn't active, then we can use the cached\n\t\t// hashPrevOuts, otherwise we just write zeroes for the prev\n\t\t// outs.\n\t\tif hashType&SigHashAnyOneCanPay == 0 {\n\t\t\tw.Write(sigHashes.HashPrevOutsV0[:])\n\t\t} else {\n\t\t\tw.Write(zeroHash[:])\n\t\t}\n\n\t\t// If the sighash isn't anyone can pay, single, or none, the\n\t\t// use the cached hash sequences, otherwise write all zeroes\n\t\t// for the hashSequence.\n\t\tif hashType&SigHashAnyOneCanPay == 0 &&\n\t\t\thashType&sigHashMask != SigHashSingle &&\n\t\t\thashType&sigHashMask != SigHashNone {\n\n\t\t\tw.Write(sigHashes.HashSequenceV0[:])\n\t\t} else {\n\t\t\tw.Write(zeroHash[:])\n\t\t}\n\n\t\ttxIn := tx.TxIn[idx]\n\n\t\t// Next, write the outpoint being spent.\n\t\tw.Write(txIn.PreviousOutPoint.Hash[:])\n\t\tvar bIndex [4]byte\n\t\tbinary.LittleEndian.PutUint32(\n\t\t\tbIndex[:], txIn.PreviousOutPoint.Index,\n\t\t)\n\t\tw.Write(bIndex[:])\n\n\t\tif isWitnessPubKeyHashScript(subScript) {\n\t\t\t// The script code for a p2wkh is a length prefix\n\t\t\t// varint for the next 25 bytes, followed by a\n\t\t\t// re-creation of the original p2pkh pk script.\n\t\t\tw.Write([]byte{0x19})\n\t\t\tw.Write([]byte{OP_DUP})\n\t\t\tw.Write([]byte{OP_HASH160})\n\t\t\tw.Write([]byte{OP_DATA_20})\n\t\t\tw.Write(extractWitnessPubKeyHash(subScript))\n\t\t\tw.Write([]byte{OP_EQUALVERIFY})\n\t\t\tw.Write([]byte{OP_CHECKSIG})\n\t\t} else {\n\t\t\t// For p2wsh outputs, and future outputs, the script\n\t\t\t// code is the original script, with all code\n\t\t\t// separators removed, serialized with a var int length\n\t\t\t// prefix.\n\t\t\twire.WriteVarBytes(w, 0, subScript)\n\t\t}\n\n\t\t// Next, add the input amount, and sequence number of the input\n\t\t// being signed.\n\t\tbinary.LittleEndian.PutUint64(scratch[:], uint64(amt))\n\t\tw.Write(scratch[:])\n\t\tbinary.LittleEndian.PutUint32(scratch[:], txIn.Sequence)\n\t\tw.Write(scratch[:4])\n\n\t\t// If the current signature mode isn't single, or none, then we\n\t\t// can re-use the pre-generated hashoutputs sighash fragment.\n\t\t// Otherwise, we'll serialize and add only the target output\n\t\t// index to the signature pre-image.\n\t\tif hashType&sigHashMask != SigHashSingle &&\n\t\t\thashType&sigHashMask != SigHashNone {\n\n\t\t\tw.Write(sigHashes.HashOutputsV0[:])\n\t\t} else if hashType&sigHashMask == SigHashSingle &&\n\t\t\tidx < len(tx.TxOut) {\n\n\t\t\th := chainhash.DoubleHashRaw(func(tw io.Writer) error {\n\t\t\t\twire.WriteTxOut(tw, 0, 0, tx.TxOut[idx])\n\t\t\t\treturn nil\n\t\t\t})\n\t\t\tw.Write(h[:])\n\t\t} else {\n\t\t\tw.Write(zeroHash[:])\n\t\t}\n\n\t\t// Finally, write out the transaction's locktime, and the sig\n\t\t// hash type.\n\t\tbinary.LittleEndian.PutUint32(scratch[:], tx.LockTime)\n\t\tw.Write(scratch[:4])\n\t\tbinary.LittleEndian.PutUint32(scratch[:], uint32(hashType))\n\t\tw.Write(scratch[:4])\n\n\t\treturn nil\n\t})\n\n\treturn sigHashBytes[:], nil\n}\n\n// CalcWitnessSigHash computes the sighash digest for the specified input of\n// the target transaction observing the desired sig hash type.\nfunc CalcWitnessSigHash(script []byte, sigHashes *TxSigHashes, hType SigHashType,\n\ttx *wire.MsgTx, idx int, amt int64) ([]byte, error) {\n\n\tconst scriptVersion = 0\n\tif err := checkScriptParses(scriptVersion, script); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn calcWitnessSignatureHashRaw(script, sigHashes, hType, tx, idx, amt)\n}\n\n// sigHashExtFlag represents the sig hash extension flag as defined in BIP 341.\n// Extensions to the base sighash algorithm will be appended to the base\n// sighash digest.\ntype sigHashExtFlag uint8\n\nconst (\n\t// baseSigHashExtFlag is the base extension flag. This adds no changes\n\t// to the sighash digest message. This is used for segwit v1 spends,\n\t// a.k.a the tapscript keyspend path.\n\tbaseSigHashExtFlag sigHashExtFlag = 0\n\n\t// tapscriptSighashExtFlag is the extension flag defined by tapscript\n\t// base leaf version spend define din BIP 342. This augments the base\n\t// sighash by including the tapscript leaf hash, the key version, and\n\t// the code separator position.\n\ttapscriptSighashExtFlag sigHashExtFlag = 1\n)\n\n// taprootSigHashOptions houses a set of functional options that may optionally\n// modify how the taproot/script sighash digest algorithm is implemented.\ntype taprootSigHashOptions struct {\n\t// extFlag denotes the current message digest extension being used. For\n\t// top-level script spends use a value of zero, while each tapscript\n\t// version can define its own values as well.\n\textFlag sigHashExtFlag\n\n\t// annexHash is the sha256 hash of the annex with a compact size length\n\t// prefix: sha256(sizeOf(annex) || annex).\n\tannexHash []byte\n\n\t// tapLeafHash is the hash of the tapscript leaf as defined in BIP 341.\n\t// This should be h_tapleaf(version || compactSizeOf(script) || script).\n\ttapLeafHash []byte\n\n\t// keyVersion is the key version as defined in BIP 341. This is always\n\t// 0x00 for all currently defined leaf versions.\n\tkeyVersion byte\n\n\t// codeSepPos is the op code position of the last code separator. This\n\t// is used for the BIP 342 sighash message extension.\n\tcodeSepPos uint32\n}\n\n// writeDigestExtensions writes out the sighash message extension defined by the\n// current active sigHashExtFlags.\nfunc (t *taprootSigHashOptions) writeDigestExtensions(w io.Writer) error {\n\tswitch t.extFlag {\n\t// The base extension, used for tapscript keypath spends doesn't modify\n\t// the digest at all.\n\tcase baseSigHashExtFlag:\n\t\treturn nil\n\n\t// The tapscript base leaf version extension adds the leaf hash, key\n\t// version, and code separator position to the final digest.\n\tcase tapscriptSighashExtFlag:\n\t\tif _, err := w.Write(t.tapLeafHash); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif _, err := w.Write([]byte{t.keyVersion}); err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr := binary.Write(w, binary.LittleEndian, t.codeSepPos)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// defaultTaprootSighashOptions returns the set of default sighash options for\n// taproot execution.\nfunc defaultTaprootSighashOptions() *taprootSigHashOptions {\n\treturn &taprootSigHashOptions{}\n}\n\n// TaprootSigHashOption defines a set of functional param options that can be\n// used to modify the base sighash message with optional extensions.\ntype TaprootSigHashOption func(*taprootSigHashOptions)\n\n// WithAnnex is a functional option that allows the caller to specify the\n// existence of an annex in the final witness stack for the taproot/tapscript\n// spends.\nfunc WithAnnex(annex []byte) TaprootSigHashOption {\n\treturn func(o *taprootSigHashOptions) {\n\t\t// It's just a bytes.Buffer which never returns an error on\n\t\t// write.\n\t\tvar b bytes.Buffer\n\t\t_ = wire.WriteVarBytes(&b, 0, annex)\n\n\t\to.annexHash = chainhash.HashB(b.Bytes())\n\t}\n}\n\n// WithBaseTapscriptVersion is a functional option that specifies that the\n// sighash digest should include the extra information included as part of the\n// base tapscript version.\nfunc WithBaseTapscriptVersion(codeSepPos uint32,\n\ttapLeafHash []byte) TaprootSigHashOption {\n\n\treturn func(o *taprootSigHashOptions) {\n\t\to.extFlag = tapscriptSighashExtFlag\n\t\to.tapLeafHash = tapLeafHash\n\t\to.keyVersion = 0\n\t\to.codeSepPos = codeSepPos\n\t}\n}\n\n// isValidTaprootSigHash returns true if the passed sighash is a valid taproot\n// sighash.\nfunc isValidTaprootSigHash(hashType SigHashType) bool {\n\tswitch hashType {\n\tcase SigHashDefault, SigHashAll, SigHashNone, SigHashSingle:\n\t\tfallthrough\n\tcase 0x81, 0x82, 0x83:\n\t\treturn true\n\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// calcTaprootSignatureHashRaw computes the sighash as specified in BIP 143.\n// If an invalid sighash type is passed in, an error is returned.\nfunc calcTaprootSignatureHashRaw(sigHashes *TxSigHashes, hType SigHashType,\n\ttx *wire.MsgTx, idx int,\n\tprevOutFetcher PrevOutputFetcher,\n\tsigHashOpts ...TaprootSigHashOption) ([]byte, error) {\n\n\topts := defaultTaprootSighashOptions()\n\tfor _, sigHashOpt := range sigHashOpts {\n\t\tsigHashOpt(opts)\n\t}\n\n\t// If a valid sighash type isn't passed in, then we'll exit early.\n\tif !isValidTaprootSigHash(hType) {\n\t\t// TODO(roasbeef): use actual errr here\n\t\treturn nil, fmt.Errorf(\"invalid taproot sighash type: %v\", hType)\n\t}\n\n\t// As a sanity check, ensure the passed input index for the transaction\n\t// is valid.\n\tif idx > len(tx.TxIn)-1 {\n\t\treturn nil, fmt.Errorf(\"idx %d but %d txins\", idx, len(tx.TxIn))\n\t}\n\n\t// We'll utilize this buffer throughout to incrementally calculate\n\t// the signature hash for this transaction.\n\tvar sigMsg bytes.Buffer\n\n\t// The final sighash always has a value of 0x00 prepended to it, which\n\t// is called the sighash epoch.\n\tsigMsg.WriteByte(0x00)\n\n\t// First, we write the hash type encoded as a single byte.\n\tif err := sigMsg.WriteByte(byte(hType)); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Next we'll write out the transaction specific data which binds the\n\t// outer context of the sighash.\n\terr := binary.Write(&sigMsg, binary.LittleEndian, tx.Version)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = binary.Write(&sigMsg, binary.LittleEndian, tx.LockTime)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// If sighash isn't anyone can pay, then we'll include all the\n\t// pre-computed midstate digests in the sighash.\n\tif hType&SigHashAnyOneCanPay != SigHashAnyOneCanPay {\n\t\tsigMsg.Write(sigHashes.HashPrevOutsV1[:])\n\t\tsigMsg.Write(sigHashes.HashInputAmountsV1[:])\n\t\tsigMsg.Write(sigHashes.HashInputScriptsV1[:])\n\t\tsigMsg.Write(sigHashes.HashSequenceV1[:])\n\t}\n\n\t// If this is sighash all, or its taproot alias (sighash default),\n\t// then we'll also include the pre-computed digest of all the outputs\n\t// of the transaction.\n\tif hType&SigHashSingle != SigHashSingle &&\n\t\thType&SigHashSingle != SigHashNone {\n\n\t\tsigMsg.Write(sigHashes.HashOutputsV1[:])\n\t}\n\n\t// Next, we'll write out the relevant information for this specific\n\t// input.\n\t//\n\t// The spend type is computed as the (ext_flag*2) + annex_present. We\n\t// use this to bind the extension flag (that BIP 342 uses), as well as\n\t// the annex if its present.\n\tinput := tx.TxIn[idx]\n\twitnessHasAnnex := opts.annexHash != nil\n\tspendType := byte(opts.extFlag) * 2\n\tif witnessHasAnnex {\n\t\tspendType += 1\n\t}\n\n\tif err := sigMsg.WriteByte(spendType); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// If anyone can pay is active, then we'll write out just the specific\n\t// information about this input, given we skipped writing all the\n\t// information of all the inputs above.\n\tif hType&SigHashAnyOneCanPay == SigHashAnyOneCanPay {\n\t\t// We'll start out with writing this input specific information by\n\t\t// first writing the entire previous output.\n\t\terr = wire.WriteOutPoint(&sigMsg, 0, 0, &input.PreviousOutPoint)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Next, we'll write out the previous output (amt+script) being\n\t\t// spent itself.\n\t\tprevOut := prevOutFetcher.FetchPrevOutput(input.PreviousOutPoint)\n\t\tif err := wire.WriteTxOut(&sigMsg, 0, 0, prevOut); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Finally, we'll write out the input sequence itself.\n\t\terr = binary.Write(&sigMsg, binary.LittleEndian, input.Sequence)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\terr := binary.Write(&sigMsg, binary.LittleEndian, uint32(idx))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Now that we have the input specific information written, we'll\n\t// include the anex, if we have it.\n\tif witnessHasAnnex {\n\t\tsigMsg.Write(opts.annexHash)\n\t}\n\n\t// Finally, if this is sighash single, then we'll write out the\n\t// information for this given output.\n\tif hType&sigHashMask == SigHashSingle {\n\t\t// If this output doesn't exist, then we'll return with an error\n\t\t// here as this is an invalid sighash type for this input.\n\t\tif idx >= len(tx.TxOut) {\n\t\t\t// TODO(roasbeef): real error here\n\t\t\treturn nil, fmt.Errorf(\"invalid sighash type for input\")\n\t\t}\n\n\t\t// Now that we know this is a valid sighash input combination,\n\t\t// we'll write out the information specific to this input.\n\t\t// We'll write the wire serialization of the output and compute\n\t\t// the sha256 in a single step.\n\t\tshaWriter := sha256.New()\n\t\ttxOut := tx.TxOut[idx]\n\t\tif err := wire.WriteTxOut(shaWriter, 0, 0, txOut); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// With the digest obtained, we'll write this out into our\n\t\t// signature message.\n\t\tif _, err := sigMsg.Write(shaWriter.Sum(nil)); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Now that we've written out all the base information, we'll write any\n\t// message extensions (if they exist).\n\tif err := opts.writeDigestExtensions(&sigMsg); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// The final sighash is computed as: hash_TagSigHash(0x00 || sigMsg).\n\t// We wrote the 0x00 above so we don't need to append here and incur\n\t// extra allocations.\n\tsigHash := chainhash.TaggedHash(chainhash.TagTapSighash, sigMsg.Bytes())\n\treturn sigHash[:], nil\n}\n\n// CalcTaprootSignatureHash computes the sighash digest of a transaction's\n// taproot-spending input using the new sighash digest algorithm described in\n// BIP 341. As the new digest algorithms may require the digest to commit to the\n// entire prev output, a PrevOutputFetcher argument is required to obtain the\n// needed information. The TxSigHashes pre-computed sighash midstate MUST be\n// specified.\nfunc CalcTaprootSignatureHash(sigHashes *TxSigHashes, hType SigHashType,\n\ttx *wire.MsgTx, idx int,\n\tprevOutFetcher PrevOutputFetcher) ([]byte, error) {\n\n\treturn calcTaprootSignatureHashRaw(\n\t\tsigHashes, hType, tx, idx, prevOutFetcher,\n\t)\n}\n\n// CalcTaprootSignatureHash is similar to CalcTaprootSignatureHash but for\n// _tapscript_ spends instead. A proper TapLeaf instance (the script leaf being\n// signed) must be passed in. The functional options can be used to specify an\n// annex if the signature was bound to that context.\n//\n// NOTE: This function is able to compute the sighash of scripts that contain a\n// code separator if the caller passes in an instance of\n// WithBaseTapscriptVersion with the valid position.\nfunc CalcTapscriptSignaturehash(sigHashes *TxSigHashes, hType SigHashType,\n\ttx *wire.MsgTx, idx int, prevOutFetcher PrevOutputFetcher,\n\ttapLeaf TapLeaf,\n\tsigHashOpts ...TaprootSigHashOption) ([]byte, error) {\n\n\ttapLeafHash := tapLeaf.TapHash()\n\n\tvar opts []TaprootSigHashOption\n\topts = append(\n\t\topts, WithBaseTapscriptVersion(blankCodeSepValue, tapLeafHash[:]),\n\t)\n\topts = append(opts, sigHashOpts...)\n\n\treturn calcTaprootSignatureHashRaw(\n\t\tsigHashes, hType, tx, idx, prevOutFetcher, opts...,\n\t)\n}\n"
  },
  {
    "path": "txscript/sign.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"errors\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2/ecdsa\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// RawTxInWitnessSignature returns the serialized ECDA signature for the input\n// idx of the given transaction, with the hashType appended to it. This\n// function is identical to RawTxInSignature, however the signature generated\n// signs a new sighash digest defined in BIP0143.\nfunc RawTxInWitnessSignature(tx *wire.MsgTx, sigHashes *TxSigHashes, idx int,\n\tamt int64, subScript []byte, hashType SigHashType,\n\tkey *btcec.PrivateKey) ([]byte, error) {\n\n\thash, err := calcWitnessSignatureHashRaw(subScript, sigHashes, hashType, tx,\n\t\tidx, amt)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsignature := ecdsa.Sign(key, hash)\n\n\treturn append(signature.Serialize(), byte(hashType)), nil\n}\n\n// WitnessSignature creates an input witness stack for tx to spend BTC sent\n// from a previous output to the owner of privKey using the p2wkh script\n// template. The passed transaction must contain all the inputs and outputs as\n// dictated by the passed hashType. The signature generated observes the new\n// transaction digest algorithm defined within BIP0143.\nfunc WitnessSignature(tx *wire.MsgTx, sigHashes *TxSigHashes, idx int, amt int64,\n\tsubscript []byte, hashType SigHashType, privKey *btcec.PrivateKey,\n\tcompress bool) (wire.TxWitness, error) {\n\n\tsig, err := RawTxInWitnessSignature(tx, sigHashes, idx, amt, subscript,\n\t\thashType, privKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tpk := privKey.PubKey()\n\tvar pkData []byte\n\tif compress {\n\t\tpkData = pk.SerializeCompressed()\n\t} else {\n\t\tpkData = pk.SerializeUncompressed()\n\t}\n\n\t// A witness script is actually a stack, so we return an array of byte\n\t// slices here, rather than a single byte slice.\n\treturn wire.TxWitness{sig, pkData}, nil\n}\n\n// RawTxInTaprootSignature returns a valid schnorr signature required to\n// perform a taproot key-spend of the specified input. If SigHashDefault was\n// specified, then the returned signature is 64-byte in length, as it omits the\n// additional byte to denote the sighash type.\nfunc RawTxInTaprootSignature(tx *wire.MsgTx, sigHashes *TxSigHashes, idx int,\n\tamt int64, pkScript []byte, tapScriptRootHash []byte, hashType SigHashType,\n\tkey *btcec.PrivateKey) ([]byte, error) {\n\n\t// First, we'll start by compute the top-level taproot sighash.\n\tsigHash, err := calcTaprootSignatureHashRaw(\n\t\tsigHashes, hashType, tx, idx,\n\t\tNewCannedPrevOutputFetcher(pkScript, amt),\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Before we sign the sighash, we'll need to apply the taptweak to the\n\t// private key based on the tapScriptRootHash.\n\tprivKeyTweak := TweakTaprootPrivKey(*key, tapScriptRootHash)\n\n\t// With the sighash constructed, we can sign it with the specified\n\t// private key.\n\tsignature, err := schnorr.Sign(privKeyTweak, sigHash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsig := signature.Serialize()\n\n\t// If this is sighash default, then we can just return the signature\n\t// directly.\n\tif hashType == SigHashDefault {\n\t\treturn sig, nil\n\t}\n\n\t// Otherwise, append the sighash type to the final sig.\n\treturn append(sig, byte(hashType)), nil\n}\n\n// TaprootWitnessSignature returns a valid witness stack that can be used to\n// spend the key-spend path of a taproot input as specified in BIP 342 and BIP\n// 86. This method assumes that the public key included in pkScript was\n// generated using ComputeTaprootKeyNoScript that commits to a fake root\n// tapscript hash. If not, then RawTxInTaprootSignature should be used with the\n// actual committed contents.\n//\n// TODO(roasbeef): add support for annex even tho it's non-standard?\nfunc TaprootWitnessSignature(tx *wire.MsgTx, sigHashes *TxSigHashes, idx int,\n\tamt int64, pkScript []byte, hashType SigHashType,\n\tkey *btcec.PrivateKey) (wire.TxWitness, error) {\n\n\t// As we're assuming this was a BIP 86 key, we use an empty root hash\n\t// which means output key commits to just the public key.\n\tfakeTapscriptRootHash := []byte{}\n\n\tsig, err := RawTxInTaprootSignature(\n\t\ttx, sigHashes, idx, amt, pkScript, fakeTapscriptRootHash,\n\t\thashType, key,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// The witness script to spend a taproot input using the key-spend path\n\t// is just the signature itself, given the public key is\n\t// embedded in the previous output script.\n\treturn wire.TxWitness{sig}, nil\n}\n\n// RawTxInTapscriptSignature computes a raw schnorr signature for a signature\n// generated from a tapscript leaf. This differs from the\n// RawTxInTaprootSignature which is used to generate signatures for top-level\n// taproot key spends.\n//\n// TODO(roasbeef): actually add code-sep to interface? not really used\n// anywhere....\nfunc RawTxInTapscriptSignature(tx *wire.MsgTx, sigHashes *TxSigHashes, idx int,\n\tamt int64, pkScript []byte, tapLeaf TapLeaf, hashType SigHashType,\n\tprivKey *btcec.PrivateKey) ([]byte, error) {\n\n\t// First, we'll start by compute the top-level taproot sighash.\n\ttapLeafHash := tapLeaf.TapHash()\n\tsigHash, err := calcTaprootSignatureHashRaw(\n\t\tsigHashes, hashType, tx, idx,\n\t\tNewCannedPrevOutputFetcher(pkScript, amt),\n\t\tWithBaseTapscriptVersion(blankCodeSepValue, tapLeafHash[:]),\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// With the sighash constructed, we can sign it with the specified\n\t// private key.\n\tsignature, err := schnorr.Sign(privKey, sigHash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Finally, append the sighash type to the final sig if it's not the\n\t// default sighash value (in which case appending it is disallowed).\n\tif hashType != SigHashDefault {\n\t\treturn append(signature.Serialize(), byte(hashType)), nil\n\t}\n\n\t// The default sighash case where we'll return _just_ the signature.\n\treturn signature.Serialize(), nil\n}\n\n// RawTxInSignature returns the serialized ECDSA signature for the input idx of\n// the given transaction, with hashType appended to it.\nfunc RawTxInSignature(tx *wire.MsgTx, idx int, subScript []byte,\n\thashType SigHashType, key *btcec.PrivateKey) ([]byte, error) {\n\n\thash, err := CalcSignatureHash(subScript, hashType, tx, idx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsignature := ecdsa.Sign(key, hash)\n\n\treturn append(signature.Serialize(), byte(hashType)), nil\n}\n\n// SignatureScript creates an input signature script for tx to spend BTC sent\n// from a previous output to the owner of privKey. tx must include all\n// transaction inputs and outputs, however txin scripts are allowed to be filled\n// or empty. The returned script is calculated to be used as the idx'th txin\n// sigscript for tx. subscript is the PkScript of the previous output being used\n// as the idx'th input. privKey is serialized in either a compressed or\n// uncompressed format based on compress. This format must match the same format\n// used to generate the payment address, or the script validation will fail.\nfunc SignatureScript(tx *wire.MsgTx, idx int, subscript []byte, hashType SigHashType, privKey *btcec.PrivateKey, compress bool) ([]byte, error) {\n\tsig, err := RawTxInSignature(tx, idx, subscript, hashType, privKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tpk := privKey.PubKey()\n\tvar pkData []byte\n\tif compress {\n\t\tpkData = pk.SerializeCompressed()\n\t} else {\n\t\tpkData = pk.SerializeUncompressed()\n\t}\n\n\treturn NewScriptBuilder().AddData(sig).AddData(pkData).Script()\n}\n\nfunc p2pkSignatureScript(tx *wire.MsgTx, idx int, subScript []byte, hashType SigHashType, privKey *btcec.PrivateKey) ([]byte, error) {\n\tsig, err := RawTxInSignature(tx, idx, subScript, hashType, privKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn NewScriptBuilder().AddData(sig).Script()\n}\n\n// signMultiSig signs as many of the outputs in the provided multisig script as\n// possible. It returns the generated script and a boolean if the script fulfils\n// the contract (i.e. nrequired signatures are provided).  Since it is arguably\n// legal to not be able to sign any of the outputs, no error is returned.\nfunc signMultiSig(tx *wire.MsgTx, idx int, subScript []byte, hashType SigHashType,\n\taddresses []btcutil.Address, nRequired int, kdb KeyDB) ([]byte, bool) {\n\t// We start with a single OP_FALSE to work around the (now standard)\n\t// but in the reference implementation that causes a spurious pop at\n\t// the end of OP_CHECKMULTISIG.\n\tbuilder := NewScriptBuilder().AddOp(OP_FALSE)\n\tsigned := 0\n\tfor _, addr := range addresses {\n\t\tkey, _, err := kdb.GetKey(addr)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tsig, err := RawTxInSignature(tx, idx, subScript, hashType, key)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tbuilder.AddData(sig)\n\t\tsigned++\n\t\tif signed == nRequired {\n\t\t\tbreak\n\t\t}\n\n\t}\n\n\tscript, _ := builder.Script()\n\treturn script, signed == nRequired\n}\n\nfunc sign(chainParams *chaincfg.Params, tx *wire.MsgTx, idx int,\n\tsubScript []byte, hashType SigHashType, kdb KeyDB, sdb ScriptDB) ([]byte,\n\tScriptClass, []btcutil.Address, int, error) {\n\n\tclass, addresses, nrequired, err := ExtractPkScriptAddrs(subScript,\n\t\tchainParams)\n\tif err != nil {\n\t\treturn nil, NonStandardTy, nil, 0, err\n\t}\n\n\tswitch class {\n\tcase PubKeyTy:\n\t\t// look up key for address\n\t\tkey, _, err := kdb.GetKey(addresses[0])\n\t\tif err != nil {\n\t\t\treturn nil, class, nil, 0, err\n\t\t}\n\n\t\tscript, err := p2pkSignatureScript(tx, idx, subScript, hashType,\n\t\t\tkey)\n\t\tif err != nil {\n\t\t\treturn nil, class, nil, 0, err\n\t\t}\n\n\t\treturn script, class, addresses, nrequired, nil\n\tcase PubKeyHashTy:\n\t\t// look up key for address\n\t\tkey, compressed, err := kdb.GetKey(addresses[0])\n\t\tif err != nil {\n\t\t\treturn nil, class, nil, 0, err\n\t\t}\n\n\t\tscript, err := SignatureScript(tx, idx, subScript, hashType,\n\t\t\tkey, compressed)\n\t\tif err != nil {\n\t\t\treturn nil, class, nil, 0, err\n\t\t}\n\n\t\treturn script, class, addresses, nrequired, nil\n\tcase ScriptHashTy:\n\t\tscript, err := sdb.GetScript(addresses[0])\n\t\tif err != nil {\n\t\t\treturn nil, class, nil, 0, err\n\t\t}\n\n\t\treturn script, class, addresses, nrequired, nil\n\tcase MultiSigTy:\n\t\tscript, _ := signMultiSig(tx, idx, subScript, hashType,\n\t\t\taddresses, nrequired, kdb)\n\t\treturn script, class, addresses, nrequired, nil\n\tcase NullDataTy:\n\t\treturn nil, class, nil, 0,\n\t\t\terrors.New(\"can't sign NULLDATA transactions\")\n\tdefault:\n\t\treturn nil, class, nil, 0,\n\t\t\terrors.New(\"can't sign unknown transactions\")\n\t}\n}\n\n// mergeMultiSig combines the two signature scripts sigScript and prevScript\n// that both provide signatures for pkScript in output idx of tx. addresses\n// and nRequired should be the results from extracting the addresses from\n// pkScript. Since this function is internal only we assume that the arguments\n// have come from other functions internally and thus are all consistent with\n// each other, behaviour is undefined if this contract is broken.\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc mergeMultiSig(tx *wire.MsgTx, idx int, addresses []btcutil.Address,\n\tnRequired int, pkScript, sigScript, prevScript []byte) []byte {\n\n\t// Nothing to merge if either the new or previous signature scripts are\n\t// empty.\n\tif len(sigScript) == 0 {\n\t\treturn prevScript\n\t}\n\tif len(prevScript) == 0 {\n\t\treturn sigScript\n\t}\n\n\t// Convenience function to avoid duplication.\n\tvar possibleSigs [][]byte\n\textractSigs := func(script []byte) error {\n\t\tconst scriptVersion = 0\n\t\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\t\tfor tokenizer.Next() {\n\t\t\tif data := tokenizer.Data(); len(data) != 0 {\n\t\t\t\tpossibleSigs = append(possibleSigs, data)\n\t\t\t}\n\t\t}\n\t\treturn tokenizer.Err()\n\t}\n\n\t// Attempt to extract signatures from the two scripts.  Return the other\n\t// script that is intended to be merged in the case signature extraction\n\t// fails for some reason.\n\tif err := extractSigs(sigScript); err != nil {\n\t\treturn prevScript\n\t}\n\tif err := extractSigs(prevScript); err != nil {\n\t\treturn sigScript\n\t}\n\n\t// Now we need to match the signatures to pubkeys, the only real way to\n\t// do that is to try to verify them all and match it to the pubkey\n\t// that verifies it. we then can go through the addresses in order\n\t// to build our script. Anything that doesn't parse or doesn't verify we\n\t// throw away.\n\taddrToSig := make(map[string][]byte)\nsigLoop:\n\tfor _, sig := range possibleSigs {\n\n\t\t// can't have a valid signature that doesn't at least have a\n\t\t// hashtype, in practise it is even longer than this. but\n\t\t// that'll be checked next.\n\t\tif len(sig) < 1 {\n\t\t\tcontinue\n\t\t}\n\t\ttSig := sig[:len(sig)-1]\n\t\thashType := SigHashType(sig[len(sig)-1])\n\n\t\tpSig, err := ecdsa.ParseDERSignature(tSig)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\t// We have to do this each round since hash types may vary\n\t\t// between signatures and so the hash will vary. We can,\n\t\t// however, assume no sigs etc are in the script since that\n\t\t// would make the transaction nonstandard and thus not\n\t\t// MultiSigTy, so we just need to hash the full thing.\n\t\thash := calcSignatureHash(pkScript, hashType, tx, idx)\n\n\t\tfor _, addr := range addresses {\n\t\t\t// All multisig addresses should be pubkey addresses\n\t\t\t// it is an error to call this internal function with\n\t\t\t// bad input.\n\t\t\tpkaddr := addr.(*btcutil.AddressPubKey)\n\n\t\t\tpubKey := pkaddr.PubKey()\n\n\t\t\t// If it matches we put it in the map. We only\n\t\t\t// can take one signature per public key so if we\n\t\t\t// already have one, we can throw this away.\n\t\t\tif pSig.Verify(hash, pubKey) {\n\t\t\t\taStr := addr.EncodeAddress()\n\t\t\t\tif _, ok := addrToSig[aStr]; !ok {\n\t\t\t\t\taddrToSig[aStr] = sig\n\t\t\t\t}\n\t\t\t\tcontinue sigLoop\n\t\t\t}\n\t\t}\n\t}\n\n\t// Extra opcode to handle the extra arg consumed (due to previous bugs\n\t// in the reference implementation).\n\tbuilder := NewScriptBuilder().AddOp(OP_FALSE)\n\tdoneSigs := 0\n\t// This assumes that addresses are in the same order as in the script.\n\tfor _, addr := range addresses {\n\t\tsig, ok := addrToSig[addr.EncodeAddress()]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tbuilder.AddData(sig)\n\t\tdoneSigs++\n\t\tif doneSigs == nRequired {\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// padding for missing ones.\n\tfor i := doneSigs; i < nRequired; i++ {\n\t\tbuilder.AddOp(OP_0)\n\t}\n\n\tscript, _ := builder.Script()\n\treturn script\n}\n\n// mergeScripts merges sigScript and prevScript assuming they are both\n// partial solutions for pkScript spending output idx of tx. class, addresses\n// and nrequired are the result of extracting the addresses from pkscript.\n// The return value is the best effort merging of the two scripts. Calling this\n// function with addresses, class and nrequired that do not match pkScript is\n// an error and results in undefined behaviour.\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc mergeScripts(chainParams *chaincfg.Params, tx *wire.MsgTx, idx int,\n\tpkScript []byte, class ScriptClass, addresses []btcutil.Address,\n\tnRequired int, sigScript, prevScript []byte) []byte {\n\n\t// TODO(oga) the scripthash and multisig paths here are overly\n\t// inefficient in that they will recompute already known data.\n\t// some internal refactoring could probably make this avoid needless\n\t// extra calculations.\n\tconst scriptVersion = 0\n\tswitch class {\n\tcase ScriptHashTy:\n\t\t// Nothing to merge if either the new or previous signature\n\t\t// scripts are empty or fail to parse.\n\t\tif len(sigScript) == 0 ||\n\t\t\tcheckScriptParses(scriptVersion, sigScript) != nil {\n\n\t\t\treturn prevScript\n\t\t}\n\t\tif len(prevScript) == 0 ||\n\t\t\tcheckScriptParses(scriptVersion, prevScript) != nil {\n\n\t\t\treturn sigScript\n\t\t}\n\n\t\t// Remove the last push in the script and then recurse.\n\t\t// this could be a lot less inefficient.\n\t\t//\n\t\t// Assume that final script is the correct one since it was just\n\t\t// made and it is a pay-to-script-hash.\n\t\tscript := finalOpcodeData(scriptVersion, sigScript)\n\n\t\t// We already know this information somewhere up the stack,\n\t\t// therefore the error is ignored.\n\t\tclass, addresses, nrequired, _ :=\n\t\t\tExtractPkScriptAddrs(script, chainParams)\n\n\t\t// Merge\n\t\tmergedScript := mergeScripts(chainParams, tx, idx, script,\n\t\t\tclass, addresses, nrequired, sigScript, prevScript)\n\n\t\t// Reappend the script and return the result.\n\t\tbuilder := NewScriptBuilder()\n\t\tbuilder.AddOps(mergedScript)\n\t\tbuilder.AddData(script)\n\t\tfinalScript, _ := builder.Script()\n\t\treturn finalScript\n\n\tcase MultiSigTy:\n\t\treturn mergeMultiSig(tx, idx, addresses, nRequired, pkScript,\n\t\t\tsigScript, prevScript)\n\n\t// It doesn't actually make sense to merge anything other than multiig\n\t// and scripthash (because it could contain multisig). Everything else\n\t// has either zero signature, can't be spent, or has a single signature\n\t// which is either present or not. The other two cases are handled\n\t// above. In the conflict case here we just assume the longest is\n\t// correct (this matches behaviour of the reference implementation).\n\tdefault:\n\t\tif len(sigScript) > len(prevScript) {\n\t\t\treturn sigScript\n\t\t}\n\t\treturn prevScript\n\t}\n}\n\n// KeyDB is an interface type provided to SignTxOutput, it encapsulates\n// any user state required to get the private keys for an address.\ntype KeyDB interface {\n\tGetKey(btcutil.Address) (*btcec.PrivateKey, bool, error)\n}\n\n// KeyClosure implements KeyDB with a closure.\ntype KeyClosure func(btcutil.Address) (*btcec.PrivateKey, bool, error)\n\n// GetKey implements KeyDB by returning the result of calling the closure.\nfunc (kc KeyClosure) GetKey(address btcutil.Address) (*btcec.PrivateKey, bool, error) {\n\treturn kc(address)\n}\n\n// ScriptDB is an interface type provided to SignTxOutput, it encapsulates any\n// user state required to get the scripts for an pay-to-script-hash address.\ntype ScriptDB interface {\n\tGetScript(btcutil.Address) ([]byte, error)\n}\n\n// ScriptClosure implements ScriptDB with a closure.\ntype ScriptClosure func(btcutil.Address) ([]byte, error)\n\n// GetScript implements ScriptDB by returning the result of calling the closure.\nfunc (sc ScriptClosure) GetScript(address btcutil.Address) ([]byte, error) {\n\treturn sc(address)\n}\n\n// SignTxOutput signs output idx of the given tx to resolve the script given in\n// pkScript with a signature type of hashType. Any keys required will be\n// looked up by calling getKey() with the string of the given address.\n// Any pay-to-script-hash signatures will be similarly looked up by calling\n// getScript. If previousScript is provided then the results in previousScript\n// will be merged in a type-dependent manner with the newly generated.\n// signature script.\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc SignTxOutput(chainParams *chaincfg.Params, tx *wire.MsgTx, idx int,\n\tpkScript []byte, hashType SigHashType, kdb KeyDB, sdb ScriptDB,\n\tpreviousScript []byte) ([]byte, error) {\n\n\tsigScript, class, addresses, nrequired, err := sign(chainParams, tx,\n\t\tidx, pkScript, hashType, kdb, sdb)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif class == ScriptHashTy {\n\t\t// TODO keep the sub addressed and pass down to merge.\n\t\trealSigScript, _, _, _, err := sign(chainParams, tx, idx,\n\t\t\tsigScript, hashType, kdb, sdb)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Append the p2sh script as the last push in the script.\n\t\tbuilder := NewScriptBuilder()\n\t\tbuilder.AddOps(realSigScript)\n\t\tbuilder.AddData(sigScript)\n\n\t\tsigScript, _ = builder.Script()\n\t\t// TODO keep a copy of the script for merging.\n\t}\n\n\t// Merge scripts. with any previous data, if any.\n\tmergedScript := mergeScripts(chainParams, tx, idx, pkScript, class,\n\t\taddresses, nrequired, sigScript, previousScript)\n\treturn mergedScript, nil\n}\n"
  },
  {
    "path": "txscript/sign_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n\t\"github.com/stretchr/testify/require\"\n)\n\ntype addressToKey struct {\n\tkey        *btcec.PrivateKey\n\tcompressed bool\n}\n\nfunc mkGetKey(keys map[string]addressToKey) KeyDB {\n\tif keys == nil {\n\t\treturn KeyClosure(func(addr btcutil.Address) (*btcec.PrivateKey,\n\t\t\tbool, error) {\n\t\t\treturn nil, false, errors.New(\"nope\")\n\t\t})\n\t}\n\treturn KeyClosure(func(addr btcutil.Address) (*btcec.PrivateKey,\n\t\tbool, error) {\n\t\ta2k, ok := keys[addr.EncodeAddress()]\n\t\tif !ok {\n\t\t\treturn nil, false, errors.New(\"nope\")\n\t\t}\n\t\treturn a2k.key, a2k.compressed, nil\n\t})\n}\n\nfunc mkGetScript(scripts map[string][]byte) ScriptDB {\n\tif scripts == nil {\n\t\treturn ScriptClosure(func(addr btcutil.Address) ([]byte, error) {\n\t\t\treturn nil, errors.New(\"nope\")\n\t\t})\n\t}\n\treturn ScriptClosure(func(addr btcutil.Address) ([]byte, error) {\n\t\tscript, ok := scripts[addr.EncodeAddress()]\n\t\tif !ok {\n\t\t\treturn nil, errors.New(\"nope\")\n\t\t}\n\t\treturn script, nil\n\t})\n}\n\nfunc checkScripts(msg string, tx *wire.MsgTx, idx int, inputAmt int64, sigScript, pkScript []byte) error {\n\ttx.TxIn[idx].SignatureScript = sigScript\n\tvm, err := NewEngine(pkScript, tx, idx,\n\t\tScriptBip16|ScriptVerifyDERSignatures, nil, nil, inputAmt, nil)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to make script engine for %s: %v\",\n\t\t\tmsg, err)\n\t}\n\n\terr = vm.Execute()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid script signature for %s: %v\", msg,\n\t\t\terr)\n\t}\n\n\treturn nil\n}\n\nfunc signAndCheck(msg string, tx *wire.MsgTx, idx int, inputAmt int64, pkScript []byte,\n\thashType SigHashType, kdb KeyDB, sdb ScriptDB,\n\tpreviousScript []byte) error {\n\n\tsigScript, err := SignTxOutput(&chaincfg.TestNet3Params, tx, idx,\n\t\tpkScript, hashType, kdb, sdb, nil)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to sign output %s: %v\", msg, err)\n\t}\n\n\treturn checkScripts(msg, tx, idx, inputAmt, sigScript, pkScript)\n}\n\nfunc TestSignTxOutput(t *testing.T) {\n\tt.Parallel()\n\n\t// make key\n\t// make script based on key.\n\t// sign with magic pixie dust.\n\thashTypes := []SigHashType{\n\t\tSigHashOld, // no longer used but should act like all\n\t\tSigHashAll,\n\t\tSigHashNone,\n\t\tSigHashSingle,\n\t\tSigHashAll | SigHashAnyOneCanPay,\n\t\tSigHashNone | SigHashAnyOneCanPay,\n\t\tSigHashSingle | SigHashAnyOneCanPay,\n\t}\n\tinputAmounts := []int64{5, 10, 15}\n\ttx := &wire.MsgTx{\n\t\tVersion: 1,\n\t\tTxIn: []*wire.TxIn{\n\t\t\t{\n\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\t\tIndex: 0,\n\t\t\t\t},\n\t\t\t\tSequence: 4294967295,\n\t\t\t},\n\t\t\t{\n\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\t\tIndex: 1,\n\t\t\t\t},\n\t\t\t\tSequence: 4294967295,\n\t\t\t},\n\t\t\t{\n\t\t\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\t\tIndex: 2,\n\t\t\t\t},\n\t\t\t\tSequence: 4294967295,\n\t\t\t},\n\t\t},\n\t\tTxOut: []*wire.TxOut{\n\t\t\t{\n\t\t\t\tValue: 1,\n\t\t\t},\n\t\t\t{\n\t\t\t\tValue: 2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tValue: 3,\n\t\t\t},\n\t\t},\n\t\tLockTime: 0,\n\t}\n\n\t// Pay to Pubkey Hash (uncompressed)\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeUncompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKeyHash(\n\t\t\t\tbtcutil.Hash160(pk), &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tif err := signAndCheck(msg, tx, i, inputAmounts[i], pkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(nil), nil); err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to Pubkey Hash (uncompressed) (merging with correct)\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeUncompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKeyHash(\n\t\t\t\tbtcutil.Hash160(pk), &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tsigScript, err := SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, pkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(nil), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg,\n\t\t\t\t\terr)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// by the above loop, this should be valid, now sign\n\t\t\t// again and merge.\n\t\t\tsigScript, err = SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, pkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(nil), sigScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s a \"+\n\t\t\t\t\t\"second time: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\terr = checkScripts(msg, tx, i, inputAmounts[i], sigScript, pkScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"twice signed script invalid for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to Pubkey Hash (compressed)\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeCompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKeyHash(\n\t\t\t\tbtcutil.Hash160(pk), &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tif err := signAndCheck(msg, tx, i, inputAmounts[i],\n\t\t\t\tpkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(nil), nil); err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to Pubkey Hash (compressed) with duplicate merge\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeCompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKeyHash(\n\t\t\t\tbtcutil.Hash160(pk), &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tsigScript, err := SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, pkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(nil), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg,\n\t\t\t\t\terr)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// by the above loop, this should be valid, now sign\n\t\t\t// again and merge.\n\t\t\tsigScript, err = SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, pkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(nil), sigScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s a \"+\n\t\t\t\t\t\"second time: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\terr = checkScripts(msg, tx, i, inputAmounts[i],\n\t\t\t\tsigScript, pkScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"twice signed script invalid for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to PubKey (uncompressed)\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeUncompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKey(pk,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tif err := signAndCheck(msg, tx, i, inputAmounts[i],\n\t\t\t\tpkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(nil), nil); err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to PubKey (uncompressed)\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeUncompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKey(pk,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tsigScript, err := SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, pkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(nil), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg,\n\t\t\t\t\terr)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// by the above loop, this should be valid, now sign\n\t\t\t// again and merge.\n\t\t\tsigScript, err = SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, pkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(nil), sigScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s a \"+\n\t\t\t\t\t\"second time: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\terr = checkScripts(msg, tx, i, inputAmounts[i], sigScript, pkScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"twice signed script invalid for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to PubKey (compressed)\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeCompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKey(pk,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tif err := signAndCheck(msg, tx, i, inputAmounts[i],\n\t\t\t\tpkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(nil), nil); err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to PubKey (compressed) with duplicate merge\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeCompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKey(pk,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tsigScript, err := SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, pkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(nil), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg,\n\t\t\t\t\terr)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// by the above loop, this should be valid, now sign\n\t\t\t// again and merge.\n\t\t\tsigScript, err = SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, pkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(nil), sigScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s a \"+\n\t\t\t\t\t\"second time: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\terr = checkScripts(msg, tx, i, inputAmounts[i],\n\t\t\t\tsigScript, pkScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"twice signed script invalid for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// As before, but with p2sh now.\n\t// Pay to Pubkey Hash (uncompressed)\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeUncompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKeyHash(\n\t\t\t\tbtcutil.Hash160(pk), &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptAddr, err := btcutil.NewAddressScriptHash(\n\t\t\t\tpkScript, &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make p2sh addr for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptPkScript, err := PayToAddrScript(\n\t\t\t\tscriptAddr)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make script pkscript for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif err := signAndCheck(msg, tx, i, inputAmounts[i],\n\t\t\t\tscriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil); err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to Pubkey Hash (uncompressed) with duplicate merge\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeUncompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKeyHash(\n\t\t\t\tbtcutil.Hash160(pk), &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptAddr, err := btcutil.NewAddressScriptHash(\n\t\t\t\tpkScript, &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make p2sh addr for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptPkScript, err := PayToAddrScript(\n\t\t\t\tscriptAddr)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make script pkscript for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tsigScript, err := SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg,\n\t\t\t\t\terr)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// by the above loop, this should be valid, now sign\n\t\t\t// again and merge.\n\t\t\tsigScript, err = SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s a \"+\n\t\t\t\t\t\"second time: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\terr = checkScripts(msg, tx, i, inputAmounts[i],\n\t\t\t\tsigScript, scriptPkScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"twice signed script invalid for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to Pubkey Hash (compressed)\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeCompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKeyHash(\n\t\t\t\tbtcutil.Hash160(pk), &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tscriptAddr, err := btcutil.NewAddressScriptHash(\n\t\t\t\tpkScript, &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make p2sh addr for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptPkScript, err := PayToAddrScript(\n\t\t\t\tscriptAddr)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make script pkscript for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif err := signAndCheck(msg, tx, i, inputAmounts[i],\n\t\t\t\tscriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil); err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to Pubkey Hash (compressed) with duplicate merge\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeCompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKeyHash(\n\t\t\t\tbtcutil.Hash160(pk), &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tscriptAddr, err := btcutil.NewAddressScriptHash(\n\t\t\t\tpkScript, &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make p2sh addr for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptPkScript, err := PayToAddrScript(\n\t\t\t\tscriptAddr)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make script pkscript for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tsigScript, err := SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg,\n\t\t\t\t\terr)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// by the above loop, this should be valid, now sign\n\t\t\t// again and merge.\n\t\t\tsigScript, err = SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s a \"+\n\t\t\t\t\t\"second time: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\terr = checkScripts(msg, tx, i, inputAmounts[i],\n\t\t\t\tsigScript, scriptPkScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"twice signed script invalid for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to PubKey (uncompressed)\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeUncompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKey(pk,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tscriptAddr, err := btcutil.NewAddressScriptHash(\n\t\t\t\tpkScript, &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make p2sh addr for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptPkScript, err := PayToAddrScript(\n\t\t\t\tscriptAddr)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make script pkscript for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif err := signAndCheck(msg, tx, i, inputAmounts[i],\n\t\t\t\tscriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil); err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to PubKey (uncompressed) with duplicate merge\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeUncompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKey(pk,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tscriptAddr, err := btcutil.NewAddressScriptHash(\n\t\t\t\tpkScript, &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make p2sh addr for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptPkScript, err := PayToAddrScript(scriptAddr)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make script pkscript for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tsigScript, err := SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg,\n\t\t\t\t\terr)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// by the above loop, this should be valid, now sign\n\t\t\t// again and merge.\n\t\t\tsigScript, err = SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, false},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s a \"+\n\t\t\t\t\t\"second time: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\terr = checkScripts(msg, tx, i, inputAmounts[i],\n\t\t\t\tsigScript, scriptPkScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"twice signed script invalid for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to PubKey (compressed)\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeCompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKey(pk,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tscriptAddr, err := btcutil.NewAddressScriptHash(\n\t\t\t\tpkScript, &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make p2sh addr for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptPkScript, err := PayToAddrScript(scriptAddr)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make script pkscript for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif err := signAndCheck(msg, tx, i, inputAmounts[i],\n\t\t\t\tscriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil); err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Pay to PubKey (compressed)\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk := key.PubKey().SerializeCompressed()\n\t\t\taddress, err := btcutil.NewAddressPubKey(pk,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := PayToAddrScript(address)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tscriptAddr, err := btcutil.NewAddressScriptHash(\n\t\t\t\tpkScript, &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make p2sh addr for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptPkScript, err := PayToAddrScript(scriptAddr)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make script pkscript for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tsigScript, err := SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg,\n\t\t\t\t\terr)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// by the above loop, this should be valid, now sign\n\t\t\t// again and merge.\n\t\t\tsigScript, err = SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress.EncodeAddress(): {key, true},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s a \"+\n\t\t\t\t\t\"second time: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\terr = checkScripts(msg, tx, i, inputAmounts[i],\n\t\t\t\tsigScript, scriptPkScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"twice signed script invalid for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Basic Multisig\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey1, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk1 := key1.PubKey().SerializeCompressed()\n\t\t\taddress1, err := btcutil.NewAddressPubKey(pk1,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tkey2, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey 2 for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk2 := key2.PubKey().SerializeCompressed()\n\t\t\taddress2, err := btcutil.NewAddressPubKey(pk2,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address 2 for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := MultiSigScript(\n\t\t\t\t[]*btcutil.AddressPubKey{address1, address2},\n\t\t\t\t2)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tscriptAddr, err := btcutil.NewAddressScriptHash(\n\t\t\t\tpkScript, &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make p2sh addr for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptPkScript, err := PayToAddrScript(scriptAddr)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make script pkscript for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif err := signAndCheck(msg, tx, i, inputAmounts[i],\n\t\t\t\tscriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress1.EncodeAddress(): {key1, true},\n\t\t\t\t\taddress2.EncodeAddress(): {key2, true},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil); err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Two part multisig, sign with one key then the other.\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey1, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk1 := key1.PubKey().SerializeCompressed()\n\t\t\taddress1, err := btcutil.NewAddressPubKey(pk1,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tkey2, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey 2 for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk2 := key2.PubKey().SerializeCompressed()\n\t\t\taddress2, err := btcutil.NewAddressPubKey(pk2,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address 2 for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := MultiSigScript(\n\t\t\t\t[]*btcutil.AddressPubKey{address1, address2},\n\t\t\t\t2)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tscriptAddr, err := btcutil.NewAddressScriptHash(\n\t\t\t\tpkScript, &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make p2sh addr for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptPkScript, err := PayToAddrScript(scriptAddr)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make script pkscript for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tsigScript, err := SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress1.EncodeAddress(): {key1, true},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg,\n\t\t\t\t\terr)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Only 1 out of 2 signed, this *should* fail.\n\t\t\tif checkScripts(msg, tx, i, inputAmounts[i], sigScript,\n\t\t\t\tscriptPkScript) == nil {\n\t\t\t\tt.Errorf(\"part signed script valid for %s\", msg)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Sign with the other key and merge\n\t\t\tsigScript, err = SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress2.EncodeAddress(): {key2, true},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), sigScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\terr = checkScripts(msg, tx, i, inputAmounts[i], sigScript,\n\t\t\t\tscriptPkScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"fully signed script invalid for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Two part multisig, sign with one key then both, check key dedup\n\t// correctly.\n\tfor _, hashType := range hashTypes {\n\t\tfor i := range tx.TxIn {\n\t\t\tmsg := fmt.Sprintf(\"%d:%d\", hashType, i)\n\n\t\t\tkey1, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk1 := key1.PubKey().SerializeCompressed()\n\t\t\taddress1, err := btcutil.NewAddressPubKey(pk1,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tkey2, err := btcec.NewPrivateKey()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make privKey 2 for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpk2 := key2.PubKey().SerializeCompressed()\n\t\t\taddress2, err := btcutil.NewAddressPubKey(pk2,\n\t\t\t\t&chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make address 2 for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpkScript, err := MultiSigScript(\n\t\t\t\t[]*btcutil.AddressPubKey{address1, address2},\n\t\t\t\t2)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make pkscript \"+\n\t\t\t\t\t\"for %s: %v\", msg, err)\n\t\t\t}\n\n\t\t\tscriptAddr, err := btcutil.NewAddressScriptHash(\n\t\t\t\tpkScript, &chaincfg.TestNet3Params)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make p2sh addr for %s: %v\",\n\t\t\t\t\tmsg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tscriptPkScript, err := PayToAddrScript(scriptAddr)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to make script pkscript for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tsigScript, err := SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress1.EncodeAddress(): {key1, true},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg,\n\t\t\t\t\terr)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Only 1 out of 2 signed, this *should* fail.\n\t\t\tif checkScripts(msg, tx, i, inputAmounts[i], sigScript,\n\t\t\t\tscriptPkScript) == nil {\n\t\t\t\tt.Errorf(\"part signed script valid for %s\", msg)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Sign with the other key and merge\n\t\t\tsigScript, err = SignTxOutput(&chaincfg.TestNet3Params,\n\t\t\t\ttx, i, scriptPkScript, hashType,\n\t\t\t\tmkGetKey(map[string]addressToKey{\n\t\t\t\t\taddress1.EncodeAddress(): {key1, true},\n\t\t\t\t\taddress2.EncodeAddress(): {key2, true},\n\t\t\t\t}), mkGetScript(map[string][]byte{\n\t\t\t\t\tscriptAddr.EncodeAddress(): pkScript,\n\t\t\t\t}), sigScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"failed to sign output %s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Now we should pass.\n\t\t\terr = checkScripts(msg, tx, i, inputAmounts[i],\n\t\t\t\tsigScript, scriptPkScript)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"fully signed script invalid for \"+\n\t\t\t\t\t\"%s: %v\", msg, err)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype tstInput struct {\n\ttxout              *wire.TxOut\n\tsigscriptGenerates bool\n\tinputValidates     bool\n\tindexOutOfRange    bool\n}\n\ntype tstSigScript struct {\n\tname               string\n\tinputs             []tstInput\n\thashType           SigHashType\n\tcompress           bool\n\tscriptAtWrongIndex bool\n}\n\nvar coinbaseOutPoint = &wire.OutPoint{\n\tIndex: (1 << 32) - 1,\n}\n\n// Pregenerated private key, with associated public key and pkScripts\n// for the uncompressed and compressed hash160.\nvar (\n\tprivKeyD = []byte{0x6b, 0x0f, 0xd8, 0xda, 0x54, 0x22, 0xd0, 0xb7,\n\t\t0xb4, 0xfc, 0x4e, 0x55, 0xd4, 0x88, 0x42, 0xb3, 0xa1, 0x65,\n\t\t0xac, 0x70, 0x7f, 0x3d, 0xa4, 0x39, 0x5e, 0xcb, 0x3b, 0xb0,\n\t\t0xd6, 0x0e, 0x06, 0x92}\n\tpubkeyX = []byte{0xb2, 0x52, 0xf0, 0x49, 0x85, 0x78, 0x03, 0x03, 0xc8,\n\t\t0x7d, 0xce, 0x51, 0x7f, 0xa8, 0x69, 0x0b, 0x91, 0x95, 0xf4,\n\t\t0xf3, 0x5c, 0x26, 0x73, 0x05, 0x05, 0xa2, 0xee, 0xbc, 0x09,\n\t\t0x38, 0x34, 0x3a}\n\tpubkeyY = []byte{0xb7, 0xc6, 0x7d, 0xb2, 0xe1, 0xff, 0xc8, 0x43, 0x1f,\n\t\t0x63, 0x32, 0x62, 0xaa, 0x60, 0xc6, 0x83, 0x30, 0xbd, 0x24,\n\t\t0x7e, 0xef, 0xdb, 0x6f, 0x2e, 0x8d, 0x56, 0xf0, 0x3c, 0x9f,\n\t\t0x6d, 0xb6, 0xf8}\n\tuncompressedPkScript = []byte{0x76, 0xa9, 0x14, 0xd1, 0x7c, 0xb5,\n\t\t0xeb, 0xa4, 0x02, 0xcb, 0x68, 0xe0, 0x69, 0x56, 0xbf, 0x32,\n\t\t0x53, 0x90, 0x0e, 0x0a, 0x86, 0xc9, 0xfa, 0x88, 0xac}\n\tcompressedPkScript = []byte{0x76, 0xa9, 0x14, 0x27, 0x4d, 0x9f, 0x7f,\n\t\t0x61, 0x7e, 0x7c, 0x7a, 0x1c, 0x1f, 0xb2, 0x75, 0x79, 0x10,\n\t\t0x43, 0x65, 0x68, 0x27, 0x9d, 0x86, 0x88, 0xac}\n\tshortPkScript = []byte{0x76, 0xa9, 0x14, 0xd1, 0x7c, 0xb5,\n\t\t0xeb, 0xa4, 0x02, 0xcb, 0x68, 0xe0, 0x69, 0x56, 0xbf, 0x32,\n\t\t0x53, 0x90, 0x0e, 0x0a, 0x88, 0xac}\n\tuncompressedAddrStr = \"1L6fd93zGmtzkK6CsZFVVoCwzZV3MUtJ4F\"\n\tcompressedAddrStr   = \"14apLppt9zTq6cNw8SDfiJhk9PhkZrQtYZ\"\n)\n\n// Pretend output amounts.\nconst coinbaseVal = 2500000000\nconst fee = 5000000\n\nvar sigScriptTests = []tstSigScript{\n\t{\n\t\tname: \"one input uncompressed\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           SigHashAll,\n\t\tcompress:           false,\n\t\tscriptAtWrongIndex: false,\n\t},\n\t{\n\t\tname: \"two inputs uncompressed\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal+fee, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           SigHashAll,\n\t\tcompress:           false,\n\t\tscriptAtWrongIndex: false,\n\t},\n\t{\n\t\tname: \"one input compressed\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, compressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           SigHashAll,\n\t\tcompress:           true,\n\t\tscriptAtWrongIndex: false,\n\t},\n\t{\n\t\tname: \"two inputs compressed\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, compressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal+fee, compressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           SigHashAll,\n\t\tcompress:           true,\n\t\tscriptAtWrongIndex: false,\n\t},\n\t{\n\t\tname: \"hashType SigHashNone\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           SigHashNone,\n\t\tcompress:           false,\n\t\tscriptAtWrongIndex: false,\n\t},\n\t{\n\t\tname: \"hashType SigHashSingle\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           SigHashSingle,\n\t\tcompress:           false,\n\t\tscriptAtWrongIndex: false,\n\t},\n\t{\n\t\tname: \"hashType SigHashAnyoneCanPay\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           SigHashAnyOneCanPay,\n\t\tcompress:           false,\n\t\tscriptAtWrongIndex: false,\n\t},\n\t{\n\t\tname: \"hashType non-standard\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           0x04,\n\t\tcompress:           false,\n\t\tscriptAtWrongIndex: false,\n\t},\n\t{\n\t\tname: \"invalid compression\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     false,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           SigHashAll,\n\t\tcompress:           true,\n\t\tscriptAtWrongIndex: false,\n\t},\n\t{\n\t\tname: \"short PkScript\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, shortPkScript),\n\t\t\t\tsigscriptGenerates: false,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           SigHashAll,\n\t\tcompress:           false,\n\t\tscriptAtWrongIndex: false,\n\t},\n\t{\n\t\tname: \"valid script at wrong index\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal+fee, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           SigHashAll,\n\t\tcompress:           false,\n\t\tscriptAtWrongIndex: true,\n\t},\n\t{\n\t\tname: \"index out of range\",\n\t\tinputs: []tstInput{\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttxout:              wire.NewTxOut(coinbaseVal+fee, uncompressedPkScript),\n\t\t\t\tsigscriptGenerates: true,\n\t\t\t\tinputValidates:     true,\n\t\t\t\tindexOutOfRange:    false,\n\t\t\t},\n\t\t},\n\t\thashType:           SigHashAll,\n\t\tcompress:           false,\n\t\tscriptAtWrongIndex: true,\n\t},\n}\n\n// Test the sigscript generation for valid and invalid inputs, all\n// hashTypes, and with and without compression.  This test creates\n// sigscripts to spend fake coinbase inputs, as sigscripts cannot be\n// created for the MsgTxs in txTests, since they come from the blockchain\n// and we don't have the private keys.\nfunc TestSignatureScript(t *testing.T) {\n\tt.Parallel()\n\n\tprivKey, _ := btcec.PrivKeyFromBytes(privKeyD)\n\nnexttest:\n\tfor i := range sigScriptTests {\n\t\ttx := wire.NewMsgTx(wire.TxVersion)\n\n\t\toutput := wire.NewTxOut(500, []byte{OP_RETURN})\n\t\ttx.AddTxOut(output)\n\n\t\tfor range sigScriptTests[i].inputs {\n\t\t\ttxin := wire.NewTxIn(coinbaseOutPoint, nil, nil)\n\t\t\ttx.AddTxIn(txin)\n\t\t}\n\n\t\tvar script []byte\n\t\tvar err error\n\t\tfor j := range tx.TxIn {\n\t\t\tvar idx int\n\t\t\tif sigScriptTests[i].inputs[j].indexOutOfRange {\n\t\t\t\tt.Errorf(\"at test %v\", sigScriptTests[i].name)\n\t\t\t\tidx = len(sigScriptTests[i].inputs)\n\t\t\t} else {\n\t\t\t\tidx = j\n\t\t\t}\n\t\t\tscript, err = SignatureScript(tx, idx,\n\t\t\t\tsigScriptTests[i].inputs[j].txout.PkScript,\n\t\t\t\tsigScriptTests[i].hashType, privKey,\n\t\t\t\tsigScriptTests[i].compress)\n\n\t\t\tif (err == nil) != sigScriptTests[i].inputs[j].sigscriptGenerates {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"passed test '%v' incorrectly\",\n\t\t\t\t\t\tsigScriptTests[i].name)\n\t\t\t\t} else {\n\t\t\t\t\tt.Errorf(\"failed test '%v': %v\",\n\t\t\t\t\t\tsigScriptTests[i].name, err)\n\t\t\t\t}\n\t\t\t\tcontinue nexttest\n\t\t\t}\n\t\t\tif !sigScriptTests[i].inputs[j].sigscriptGenerates {\n\t\t\t\t// done with this test\n\t\t\t\tcontinue nexttest\n\t\t\t}\n\n\t\t\ttx.TxIn[j].SignatureScript = script\n\t\t}\n\n\t\t// If testing using a correct sigscript but for an incorrect\n\t\t// index, use last input script for first input.  Requires > 0\n\t\t// inputs for test.\n\t\tif sigScriptTests[i].scriptAtWrongIndex {\n\t\t\ttx.TxIn[0].SignatureScript = script\n\t\t\tsigScriptTests[i].inputs[0].inputValidates = false\n\t\t}\n\n\t\t// Validate tx input scripts\n\t\tscriptFlags := ScriptBip16 | ScriptVerifyDERSignatures\n\t\tfor j := range tx.TxIn {\n\t\t\tvm, err := NewEngine(sigScriptTests[i].\n\t\t\t\tinputs[j].txout.PkScript, tx, j, scriptFlags, nil, nil, 0, nil)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"cannot create script vm for test %v: %v\",\n\t\t\t\t\tsigScriptTests[i].name, err)\n\t\t\t\tcontinue nexttest\n\t\t\t}\n\t\t\terr = vm.Execute()\n\t\t\tif (err == nil) != sigScriptTests[i].inputs[j].inputValidates {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"passed test '%v' validation incorrectly: %v\",\n\t\t\t\t\t\tsigScriptTests[i].name, err)\n\t\t\t\t} else {\n\t\t\t\t\tt.Errorf(\"failed test '%v' validation: %v\",\n\t\t\t\t\t\tsigScriptTests[i].name, err)\n\t\t\t\t}\n\t\t\t\tcontinue nexttest\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestRawTxInTaprootSignature tests that the RawTxInTaprootSignature function\n// generates valid signatures for all relevant sighash types.\nfunc TestRawTxInTaprootSignature(t *testing.T) {\n\tt.Parallel()\n\n\tprivKey, err := btcec.NewPrivateKey()\n\trequire.NoError(t, err)\n\n\tpubKey := ComputeTaprootKeyNoScript(privKey.PubKey())\n\n\tpkScript, err := PayToTaprootScript(pubKey)\n\trequire.NoError(t, err)\n\n\t// We'll reuse this simple transaction for the tests below. It ends up\n\t// spending from a bip86 P2TR output.\n\ttestTx := wire.NewMsgTx(2)\n\ttestTx.AddTxIn(&wire.TxIn{\n\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\tIndex: 1,\n\t\t},\n\t})\n\ttxOut := &wire.TxOut{\n\t\tValue: 1e8, PkScript: pkScript,\n\t}\n\ttestTx.AddTxOut(txOut)\n\n\ttests := []struct {\n\t\tsigHashType SigHashType\n\t}{\n\t\t{\n\t\t\tsigHashType: SigHashDefault,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashAll,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashNone,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashSingle,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashSingle | SigHashAnyOneCanPay,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashNone | SigHashAnyOneCanPay,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashAll | SigHashAnyOneCanPay,\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tname := fmt.Sprintf(\"sighash=%v\", test.sigHashType)\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\tprevFetcher := NewCannedPrevOutputFetcher(\n\t\t\t\ttxOut.PkScript, txOut.Value,\n\t\t\t)\n\t\t\tsigHashes := NewTxSigHashes(testTx, prevFetcher)\n\n\t\t\tsig, err := RawTxInTaprootSignature(\n\t\t\t\ttestTx, sigHashes, 0, txOut.Value, txOut.PkScript,\n\t\t\t\tnil, test.sigHashType, privKey,\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\t// If this isn't sighash default, then a sighash should be\n\t\t\t// applied. Otherwise, it should be a normal sig.\n\t\t\texpectedLen := schnorr.SignatureSize\n\t\t\tif test.sigHashType != SigHashDefault {\n\t\t\t\texpectedLen += 1\n\t\t\t}\n\t\t\trequire.Len(t, sig, expectedLen)\n\n\t\t\t// Finally, ensure that the signature produced is valid.\n\t\t\ttxCopy := testTx.Copy()\n\t\t\ttxCopy.TxIn[0].Witness = wire.TxWitness{sig}\n\t\t\tvm, err := NewEngine(\n\t\t\t\ttxOut.PkScript, txCopy, 0, StandardVerifyFlags,\n\t\t\t\tnil, sigHashes, txOut.Value, prevFetcher,\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\trequire.NoError(t, vm.Execute())\n\t\t})\n\t}\n}\n\n// TestRawTxInTapscriptSignature thats that we're able to produce valid schnorr\n// signatures for a simple tapscript spend, for various sighash types.\nfunc TestRawTxInTapscriptSignature(t *testing.T) {\n\tt.Parallel()\n\n\tprivKey, err := btcec.NewPrivateKey()\n\trequire.NoError(t, err)\n\n\tinternalKey := privKey.PubKey()\n\n\t// Our script will be a simple OP_CHECKSIG as the sole leaf of a\n\t// tapscript tree. We'll also re-use the internal key as the key in the\n\t// leaf.\n\tbuilder := NewScriptBuilder()\n\tbuilder.AddData(schnorr.SerializePubKey(internalKey))\n\tbuilder.AddOp(OP_CHECKSIG)\n\tpkScript, err := builder.Script()\n\trequire.NoError(t, err)\n\n\ttapLeaf := NewBaseTapLeaf(pkScript)\n\ttapScriptTree := AssembleTaprootScriptTree(tapLeaf)\n\n\tctrlBlock := tapScriptTree.LeafMerkleProofs[0].ToControlBlock(\n\t\tinternalKey,\n\t)\n\n\ttapScriptRootHash := tapScriptTree.RootNode.TapHash()\n\toutputKey := ComputeTaprootOutputKey(\n\t\tinternalKey, tapScriptRootHash[:],\n\t)\n\tp2trScript, err := PayToTaprootScript(outputKey)\n\trequire.NoError(t, err)\n\n\t// We'll reuse this simple transaction for the tests below. It ends up\n\t// spending from a bip86 P2TR output.\n\ttestTx := wire.NewMsgTx(2)\n\ttestTx.AddTxIn(&wire.TxIn{\n\t\tPreviousOutPoint: wire.OutPoint{\n\t\t\tIndex: 1,\n\t\t},\n\t})\n\ttxOut := &wire.TxOut{\n\t\tValue: 1e8, PkScript: p2trScript,\n\t}\n\ttestTx.AddTxOut(txOut)\n\n\ttests := []struct {\n\t\tsigHashType SigHashType\n\t}{\n\t\t{\n\t\t\tsigHashType: SigHashDefault,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashAll,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashNone,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashSingle,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashSingle | SigHashAnyOneCanPay,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashNone | SigHashAnyOneCanPay,\n\t\t},\n\t\t{\n\t\t\tsigHashType: SigHashAll | SigHashAnyOneCanPay,\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tname := fmt.Sprintf(\"sighash=%v\", test.sigHashType)\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\tprevFetcher := NewCannedPrevOutputFetcher(\n\t\t\t\ttxOut.PkScript, txOut.Value,\n\t\t\t)\n\t\t\tsigHashes := NewTxSigHashes(testTx, prevFetcher)\n\n\t\t\tsig, err := RawTxInTapscriptSignature(\n\t\t\t\ttestTx, sigHashes, 0, txOut.Value,\n\t\t\t\ttxOut.PkScript, tapLeaf, test.sigHashType,\n\t\t\t\tprivKey,\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\t// If this isn't sighash default, then a sighash should\n\t\t\t// be applied. Otherwise, it should be a normal sig.\n\t\t\texpectedLen := schnorr.SignatureSize\n\t\t\tif test.sigHashType != SigHashDefault {\n\t\t\t\texpectedLen += 1\n\t\t\t}\n\t\t\trequire.Len(t, sig, expectedLen)\n\n\t\t\t// Now that we have the sig, we'll make a valid witness\n\t\t\t// including the control block.\n\t\t\tctrlBlockBytes, err := ctrlBlock.ToBytes()\n\t\t\trequire.NoError(t, err)\n\t\t\ttxCopy := testTx.Copy()\n\t\t\ttxCopy.TxIn[0].Witness = wire.TxWitness{\n\t\t\t\tsig, pkScript, ctrlBlockBytes,\n\t\t\t}\n\n\t\t\t// Finally, ensure that the signature produced is valid.\n\t\t\tvm, err := NewEngine(\n\t\t\t\ttxOut.PkScript, txCopy, 0, StandardVerifyFlags,\n\t\t\t\tnil, sigHashes, txOut.Value, prevFetcher,\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\trequire.NoError(t, vm.Execute())\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "txscript/sigvalidate.go",
    "content": "// Copyright (c) 2013-2022 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/ecdsa\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// signatureVerifier is an abstract interface that allows the op code execution\n// to abstract over the _type_ of signature validation being executed. At this\n// point in Bitcoin's history, there're four possible sig validation contexts:\n// pre-segwit, segwit v0, segwit v1 (taproot key spend validation), and the\n// base tapscript verification.\ntype signatureVerifier interface {\n\t// Verify returns whether or not the signature verifier context deems the\n\t// signature to be valid for the given context.\n\tVerify() verifyResult\n}\n\ntype verifyResult struct {\n\tsigValid bool\n\tsigMatch bool\n}\n\n// baseSigVerifier is used to verify signatures for the _base_ system, meaning\n// ECDSA signatures encoded in DER or BER encoding.\ntype baseSigVerifier struct {\n\tvm *Engine\n\n\tpubKey *btcec.PublicKey\n\n\tsig *ecdsa.Signature\n\n\tfullSigBytes []byte\n\n\tsigBytes []byte\n\tpkBytes  []byte\n\n\tsubScript []byte\n\n\thashType SigHashType\n}\n\n// parseBaseSigAndPubkey attempts to parse a signature and public key according\n// to the base consensus rules, which expect an 33-byte public key and DER or\n// BER encoded signature.\nfunc parseBaseSigAndPubkey(pkBytes, fullSigBytes []byte,\n\tvm *Engine) (*btcec.PublicKey, *ecdsa.Signature, SigHashType, error) {\n\n\tstrictEncoding := vm.hasFlag(ScriptVerifyStrictEncoding) ||\n\t\tvm.hasFlag(ScriptVerifyDERSignatures)\n\n\t// Trim off hashtype from the signature string and check if the\n\t// signature and pubkey conform to the strict encoding requirements\n\t// depending on the flags.\n\t//\n\t// NOTE: When the strict encoding flags are set, any errors in the\n\t// signature or public encoding here result in an immediate script error\n\t// (and thus no result bool is pushed to the data stack).  This differs\n\t// from the logic below where any errors in parsing the signature is\n\t// treated as the signature failure resulting in false being pushed to\n\t// the data stack.  This is required because the more general script\n\t// validation consensus rules do not have the new strict encoding\n\t// requirements enabled by the flags.\n\thashType := SigHashType(fullSigBytes[len(fullSigBytes)-1])\n\tsigBytes := fullSigBytes[:len(fullSigBytes)-1]\n\tif err := vm.checkHashTypeEncoding(hashType); err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\tif err := vm.checkSignatureEncoding(sigBytes); err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\tif err := vm.checkPubKeyEncoding(pkBytes); err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\n\t// First, parse the public key, which we expect to be in the proper\n\t// encoding.\n\tpubKey, err := btcec.ParsePubKey(pkBytes)\n\tif err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\n\t// Next, parse the signature which should be in DER or BER depending on\n\t// the active script flags.\n\tvar signature *ecdsa.Signature\n\tif strictEncoding {\n\t\tsignature, err = ecdsa.ParseDERSignature(sigBytes)\n\t} else {\n\t\tsignature, err = ecdsa.ParseSignature(sigBytes)\n\t}\n\tif err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\n\treturn pubKey, signature, hashType, nil\n}\n\n// newBaseSigVerifier returns a new instance of the base signature verifier. An\n// error is returned if the signature, sighash, or public key aren't correctly\n// encoded.\nfunc newBaseSigVerifier(pkBytes, fullSigBytes []byte,\n\tvm *Engine) (*baseSigVerifier, error) {\n\n\tpubKey, sig, hashType, err := parseBaseSigAndPubkey(\n\t\tpkBytes, fullSigBytes, vm,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Get script starting from the most recent OP_CODESEPARATOR.\n\tsubScript := vm.subScript()\n\n\treturn &baseSigVerifier{\n\t\tvm:           vm,\n\t\tpubKey:       pubKey,\n\t\tpkBytes:      pkBytes,\n\t\tsig:          sig,\n\t\tsigBytes:     fullSigBytes[:len(fullSigBytes)-1],\n\t\tsubScript:    subScript,\n\t\thashType:     hashType,\n\t\tfullSigBytes: fullSigBytes,\n\t}, nil\n}\n\n// verifySig attempts to verify the signature given the computed sighash. A nil\n// error is returned if the signature is valid.\nfunc (b *baseSigVerifier) verifySig(sigHash []byte) bool {\n\tvar valid bool\n\tif b.vm.sigCache != nil {\n\t\tvar sigHashBytes chainhash.Hash\n\t\tcopy(sigHashBytes[:], sigHash[:])\n\n\t\tvalid = b.vm.sigCache.Exists(sigHashBytes, b.sigBytes, b.pkBytes)\n\t\tif !valid && b.sig.Verify(sigHash, b.pubKey) {\n\t\t\tb.vm.sigCache.Add(sigHashBytes, b.sigBytes, b.pkBytes)\n\t\t\tvalid = true\n\t\t}\n\t} else {\n\t\tvalid = b.sig.Verify(sigHash, b.pubKey)\n\t}\n\n\treturn valid\n}\n\n// Verify returns whether or not the signature verifier context deems the\n// signature to be valid for the given context.\n//\n// NOTE: This is part of the baseSigVerifier interface.\nfunc (b *baseSigVerifier) Verify() verifyResult {\n\t// Remove the signature since there is no way for a signature\n\t// to sign itself.\n\tsubScript, match := removeOpcodeByData(b.subScript, b.fullSigBytes)\n\n\tsigHash := calcSignatureHash(\n\t\tsubScript, b.hashType, &b.vm.tx, b.vm.txIdx,\n\t)\n\n\treturn verifyResult{\n\t\tsigValid: b.verifySig(sigHash),\n\t\tsigMatch: match,\n\t}\n}\n\n// A compile-time assertion to ensure baseSigVerifier implements the\n// signatureVerifier interface.\nvar _ signatureVerifier = (*baseSigVerifier)(nil)\n\n// baseSegwitSigVerifier implements signature verification for segwit v0. The\n// only difference between this and the baseSigVerifier is how the sighash is\n// computed.\ntype baseSegwitSigVerifier struct {\n\t*baseSigVerifier\n}\n\n// newBaseSegwitSigVerifier returns a new instance of the base segwit verifier.\nfunc newBaseSegwitSigVerifier(pkBytes, fullSigBytes []byte,\n\tvm *Engine) (*baseSegwitSigVerifier, error) {\n\n\tsigVerifier, err := newBaseSigVerifier(pkBytes, fullSigBytes, vm)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &baseSegwitSigVerifier{\n\t\tbaseSigVerifier: sigVerifier,\n\t}, nil\n}\n\n// Verify returns true if the signature verifier context deems the signature to\n// be valid for the given context.\n//\n// NOTE: This is part of the baseSigVerifier interface.\nfunc (s *baseSegwitSigVerifier) Verify() verifyResult {\n\tvar sigHashes *TxSigHashes\n\tif s.vm.hashCache != nil {\n\t\tsigHashes = s.vm.hashCache\n\t} else {\n\t\tsigHashes = NewTxSigHashes(&s.vm.tx, s.vm.prevOutFetcher)\n\t}\n\n\tsigHash, err := calcWitnessSignatureHashRaw(\n\t\ts.subScript, sigHashes, s.hashType, &s.vm.tx, s.vm.txIdx,\n\t\ts.vm.inputAmount,\n\t)\n\tif err != nil {\n\t\t// TODO(roasbeef): this doesn't need to return an error, should\n\t\t// instead be further up the stack? this only returns an error\n\t\t// if the input index is greater than the number of inputs\n\t\treturn verifyResult{}\n\t}\n\n\treturn verifyResult{\n\t\tsigValid: s.verifySig(sigHash),\n\t}\n}\n\n// A compile-time assertion to ensure baseSegwitSigVerifier implements the\n// signatureVerifier interface.\nvar _ signatureVerifier = (*baseSegwitSigVerifier)(nil)\n\n// taprootSigVerifier verifies signatures according to the segwit v1 rules,\n// which are described in BIP 341.\ntype taprootSigVerifier struct {\n\tpubKey  *btcec.PublicKey\n\tpkBytes []byte\n\n\tfullSigBytes []byte\n\tsig          *schnorr.Signature\n\n\thashType SigHashType\n\n\tsigCache  *SigCache\n\thashCache *TxSigHashes\n\n\ttx *wire.MsgTx\n\n\tinputIndex int\n\n\tannex []byte\n\n\tprevOuts PrevOutputFetcher\n}\n\n// parseTaprootSigAndPubKey attempts to parse the public key and signature for\n// a taproot spend that may be a keyspend or script path spend. This function\n// returns an error if the pubkey is invalid, or the sig is.\nfunc parseTaprootSigAndPubKey(pkBytes, rawSig []byte,\n) (*btcec.PublicKey, *schnorr.Signature, SigHashType, error) {\n\n\t// Now that we have the raw key, we'll parse it into a schnorr public\n\t// key we can work with.\n\tpubKey, err := schnorr.ParsePubKey(pkBytes)\n\tif err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\n\t// Next, we'll parse the signature, which may or may not be appended\n\t// with the desired sighash flag.\n\tvar (\n\t\tsig         *schnorr.Signature\n\t\tsigHashType SigHashType\n\t)\n\tswitch {\n\t// If the signature is exactly 64 bytes, then we know we're using the\n\t// implicit SIGHASH_DEFAULT sighash type.\n\tcase len(rawSig) == schnorr.SignatureSize:\n\t\t// First, parse out the signature which is just the raw sig itself.\n\t\tsig, err = schnorr.ParseSignature(rawSig)\n\t\tif err != nil {\n\t\t\treturn nil, nil, 0, err\n\t\t}\n\n\t\t// If the sig is 64 bytes, then we'll assume that it's the\n\t\t// default sighash type, which is actually an alias for\n\t\t// SIGHASH_ALL.\n\t\tsigHashType = SigHashDefault\n\n\t// Otherwise, if this is a signature, with a sighash looking byte\n\t// appended that isn't all zero, then we'll extract the sighash from\n\t// the end of the signature.\n\tcase len(rawSig) == schnorr.SignatureSize+1 && rawSig[64] != 0:\n\t\t// Extract the sighash type, then snip off the last byte so we can\n\t\t// parse the signature.\n\t\tsigHashType = SigHashType(rawSig[schnorr.SignatureSize])\n\n\t\trawSig = rawSig[:schnorr.SignatureSize]\n\t\tsig, err = schnorr.ParseSignature(rawSig)\n\t\tif err != nil {\n\t\t\treturn nil, nil, 0, err\n\t\t}\n\n\t// Otherwise, this is an invalid signature, so we need to bail out.\n\tdefault:\n\t\tstr := fmt.Sprintf(\"invalid sig len: %v\", len(rawSig))\n\t\treturn nil, nil, 0, scriptError(ErrInvalidTaprootSigLen, str)\n\t}\n\n\treturn pubKey, sig, sigHashType, nil\n}\n\n// newTaprootSigVerifier returns a new instance of a taproot sig verifier given\n// the necessary contextual information.\nfunc newTaprootSigVerifier(pkBytes []byte, fullSigBytes []byte,\n\ttx *wire.MsgTx, inputIndex int, prevOuts PrevOutputFetcher,\n\tsigCache *SigCache, hashCache *TxSigHashes,\n\tannex []byte) (*taprootSigVerifier, error) {\n\n\tpubKey, sig, sigHashType, err := parseTaprootSigAndPubKey(\n\t\tpkBytes, fullSigBytes,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &taprootSigVerifier{\n\t\tpubKey:       pubKey,\n\t\tpkBytes:      pkBytes,\n\t\tsig:          sig,\n\t\tfullSigBytes: fullSigBytes,\n\t\thashType:     sigHashType,\n\t\ttx:           tx,\n\t\tinputIndex:   inputIndex,\n\t\tprevOuts:     prevOuts,\n\t\tsigCache:     sigCache,\n\t\thashCache:    hashCache,\n\t\tannex:        annex,\n\t}, nil\n}\n\n// verifySig attempts to verify a BIP 340 signature using the internal public\n// key and signature, and the passed sigHash as the message digest.\nfunc (t *taprootSigVerifier) verifySig(sigHash []byte) bool {\n\t// At this point, we can check to see if this signature is already\n\t// included in the sigCache and is valid or not (if one was passed in).\n\tcacheKey, _ := chainhash.NewHash(sigHash)\n\tif t.sigCache != nil {\n\t\tif t.sigCache.Exists(*cacheKey, t.fullSigBytes, t.pkBytes) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// If we didn't find the entry in the cache, then we'll perform full\n\t// verification as normal, adding the entry to the cache if it's found\n\t// to be valid.\n\tsigValid := t.sig.Verify(sigHash, t.pubKey)\n\tif sigValid {\n\t\tif t.sigCache != nil {\n\t\t\t// The sig is valid, so we'll add it to the cache.\n\t\t\tt.sigCache.Add(*cacheKey, t.fullSigBytes, t.pkBytes)\n\t\t}\n\n\t\treturn true\n\t}\n\n\t// Otherwise the sig is invalid if we get to this point.\n\treturn false\n}\n\n// Verify returns whether or not the signature verifier context deems the\n// signature to be valid for the given context.\n//\n// NOTE: This is part of the baseSigVerifier interface.\nfunc (t *taprootSigVerifier) Verify() verifyResult {\n\tvar opts []TaprootSigHashOption\n\tif t.annex != nil {\n\t\topts = append(opts, WithAnnex(t.annex))\n\t}\n\n\t// Before we attempt to verify the signature, we'll need to first\n\t// compute the sighash based on the input and tx information.\n\tsigHash, err := calcTaprootSignatureHashRaw(\n\t\tt.hashCache, t.hashType, t.tx, t.inputIndex, t.prevOuts,\n\t\topts...,\n\t)\n\tif err != nil {\n\t\t// TODO(roasbeef): propagate the error here?\n\t\treturn verifyResult{}\n\t}\n\n\treturn verifyResult{\n\t\tsigValid: t.verifySig(sigHash),\n\t}\n}\n\n// A compile-time assertion to ensure taprootSigVerifier implements the\n// signatureVerifier interface.\nvar _ signatureVerifier = (*taprootSigVerifier)(nil)\n\n// baseTapscriptSigVerifier verifies a signature for an input spending a\n// tapscript leaf from the previous output.\ntype baseTapscriptSigVerifier struct {\n\t*taprootSigVerifier\n\n\tvm *Engine\n}\n\n// newBaseTapscriptSigVerifier returns a new sig verifier for tapscript input\n// spends. If the public key or signature aren't correctly formatted, an error\n// is returned.\nfunc newBaseTapscriptSigVerifier(pkBytes, rawSig []byte,\n\tvm *Engine) (*baseTapscriptSigVerifier, error) {\n\n\tswitch len(pkBytes) {\n\t// If the public key is zero bytes, then this is invalid, and will fail\n\t// immediately.\n\tcase 0:\n\t\treturn nil, scriptError(ErrTaprootPubkeyIsEmpty, \"\")\n\n\t// If the public key is 32 byte as we expect, then we'll parse things\n\t// as normal.\n\tcase 32:\n\t\tbaseTaprootVerifier, err := newTaprootSigVerifier(\n\t\t\tpkBytes, rawSig, &vm.tx, vm.txIdx, vm.prevOutFetcher,\n\t\t\tvm.sigCache, vm.hashCache, vm.taprootCtx.annex,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\treturn &baseTapscriptSigVerifier{\n\t\t\ttaprootSigVerifier: baseTaprootVerifier,\n\t\t\tvm:                 vm,\n\t\t}, nil\n\n\t// Otherwise, we consider this to be an unknown public key, which means\n\t// that we'll just assume the sig to be valid.\n\tdefault:\n\t\t// However, if the flag preventing usage of unknown key types\n\t\t// is active, then we'll return that error.\n\t\tif vm.hasFlag(ScriptVerifyDiscourageUpgradeablePubkeyType) {\n\t\t\tstr := fmt.Sprintf(\"pubkey of length %v was used\",\n\t\t\t\tlen(pkBytes))\n\t\t\treturn nil, scriptError(\n\t\t\t\tErrDiscourageUpgradeablePubKeyType, str,\n\t\t\t)\n\t\t}\n\n\t\treturn &baseTapscriptSigVerifier{\n\t\t\ttaprootSigVerifier: &taprootSigVerifier{},\n\t\t}, nil\n\t}\n}\n\n// Verify returns whether or not the signature verifier context deems the\n// signature to be valid for the given context.\n//\n// NOTE: This is part of the baseSigVerifier interface.\nfunc (b *baseTapscriptSigVerifier) Verify() verifyResult {\n\t// If the public key is blank, then that means it wasn't 0 or 32 bytes,\n\t// so we'll treat this as an unknown public key version and return\n\t// that it's valid.\n\tif b.pubKey == nil {\n\t\treturn verifyResult{\n\t\t\tsigValid: true,\n\t\t}\n\t}\n\n\tvar opts []TaprootSigHashOption\n\topts = append(opts, WithBaseTapscriptVersion(\n\t\tb.vm.taprootCtx.codeSepPos, b.vm.taprootCtx.tapLeafHash[:],\n\t))\n\n\tif b.vm.taprootCtx.annex != nil {\n\t\topts = append(opts, WithAnnex(b.vm.taprootCtx.annex))\n\t}\n\n\t// Otherwise, we'll compute the sighash using the tapscript message\n\t// extensions and return the outcome.\n\tsigHash, err := calcTaprootSignatureHashRaw(\n\t\tb.hashCache, b.hashType, b.tx, b.inputIndex, b.prevOuts,\n\t\topts...,\n\t)\n\tif err != nil {\n\t\t// TODO(roasbeef): propagate the error here?\n\t\treturn verifyResult{}\n\t}\n\n\treturn verifyResult{\n\t\tsigValid: b.verifySig(sigHash),\n\t}\n}\n\n// A compile-time assertion to ensure baseTapscriptSigVerifier implements the\n// signatureVerifier interface.\nvar _ signatureVerifier = (*baseTapscriptSigVerifier)(nil)\n"
  },
  {
    "path": "txscript/stack.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n)\n\n// asBool gets the boolean value of the byte array.\nfunc asBool(t []byte) bool {\n\tfor i := range t {\n\t\tif t[i] != 0 {\n\t\t\t// Negative 0 is also considered false.\n\t\t\tif i == len(t)-1 && t[i] == 0x80 {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// fromBool converts a boolean into the appropriate byte array.\nfunc fromBool(v bool) []byte {\n\tif v {\n\t\treturn []byte{1}\n\t}\n\treturn nil\n}\n\n// stack represents a stack of immutable objects to be used with bitcoin\n// scripts.  Objects may be shared, therefore in usage if a value is to be\n// changed it *must* be deep-copied first to avoid changing other values on the\n// stack.\ntype stack struct {\n\tstk               [][]byte\n\tverifyMinimalData bool\n}\n\n// Depth returns the number of items on the stack.\nfunc (s *stack) Depth() int32 {\n\treturn int32(len(s.stk))\n}\n\n// PushByteArray adds the given back array to the top of the stack.\n//\n// Stack transformation: [... x1 x2] -> [... x1 x2 data]\nfunc (s *stack) PushByteArray(so []byte) {\n\ts.stk = append(s.stk, so)\n}\n\n// PushInt converts the provided scriptNum to a suitable byte array then pushes\n// it onto the top of the stack.\n//\n// Stack transformation: [... x1 x2] -> [... x1 x2 int]\nfunc (s *stack) PushInt(val scriptNum) {\n\ts.PushByteArray(val.Bytes())\n}\n\n// PushBool converts the provided boolean to a suitable byte array then pushes\n// it onto the top of the stack.\n//\n// Stack transformation: [... x1 x2] -> [... x1 x2 bool]\nfunc (s *stack) PushBool(val bool) {\n\ts.PushByteArray(fromBool(val))\n}\n\n// PopByteArray pops the value off the top of the stack and returns it.\n//\n// Stack transformation: [... x1 x2 x3] -> [... x1 x2]\nfunc (s *stack) PopByteArray() ([]byte, error) {\n\treturn s.nipN(0)\n}\n\n// PopInt pops the value off the top of the stack, converts it into a script\n// num, and returns it.  The act of converting to a script num enforces the\n// consensus rules imposed on data interpreted as numbers.\n//\n// Stack transformation: [... x1 x2 x3] -> [... x1 x2]\nfunc (s *stack) PopInt() (scriptNum, error) {\n\tso, err := s.PopByteArray()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn MakeScriptNum(so, s.verifyMinimalData, maxScriptNumLen)\n}\n\n// PopBool pops the value off the top of the stack, converts it into a bool, and\n// returns it.\n//\n// Stack transformation: [... x1 x2 x3] -> [... x1 x2]\nfunc (s *stack) PopBool() (bool, error) {\n\tso, err := s.PopByteArray()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn asBool(so), nil\n}\n\n// PeekByteArray returns the Nth item on the stack without removing it.\nfunc (s *stack) PeekByteArray(idx int32) ([]byte, error) {\n\tsz := int32(len(s.stk))\n\tif idx < 0 || idx >= sz {\n\t\tstr := fmt.Sprintf(\"index %d is invalid for stack size %d\", idx,\n\t\t\tsz)\n\t\treturn nil, scriptError(ErrInvalidStackOperation, str)\n\t}\n\n\treturn s.stk[sz-idx-1], nil\n}\n\n// PeekInt returns the Nth item on the stack as a script num without removing\n// it.  The act of converting to a script num enforces the consensus rules\n// imposed on data interpreted as numbers.\nfunc (s *stack) PeekInt(idx int32) (scriptNum, error) {\n\tso, err := s.PeekByteArray(idx)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn MakeScriptNum(so, s.verifyMinimalData, maxScriptNumLen)\n}\n\n// PeekBool returns the Nth item on the stack as a bool without removing it.\nfunc (s *stack) PeekBool(idx int32) (bool, error) {\n\tso, err := s.PeekByteArray(idx)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn asBool(so), nil\n}\n\n// nipN is an internal function that removes the nth item on the stack and\n// returns it.\n//\n// Stack transformation:\n// nipN(0): [... x1 x2 x3] -> [... x1 x2]\n// nipN(1): [... x1 x2 x3] -> [... x1 x3]\n// nipN(2): [... x1 x2 x3] -> [... x2 x3]\nfunc (s *stack) nipN(idx int32) ([]byte, error) {\n\tsz := int32(len(s.stk))\n\tif idx < 0 || idx > sz-1 {\n\t\tstr := fmt.Sprintf(\"index %d is invalid for stack size %d\", idx,\n\t\t\tsz)\n\t\treturn nil, scriptError(ErrInvalidStackOperation, str)\n\t}\n\n\tso := s.stk[sz-idx-1]\n\tif idx == 0 {\n\t\ts.stk = s.stk[:sz-1]\n\t} else if idx == sz-1 {\n\t\ts1 := make([][]byte, sz-1)\n\t\tcopy(s1, s.stk[1:])\n\t\ts.stk = s1\n\t} else {\n\t\ts1 := s.stk[sz-idx : sz]\n\t\ts.stk = s.stk[:sz-idx-1]\n\t\ts.stk = append(s.stk, s1...)\n\t}\n\treturn so, nil\n}\n\n// NipN removes the Nth object on the stack\n//\n// Stack transformation:\n// NipN(0): [... x1 x2 x3] -> [... x1 x2]\n// NipN(1): [... x1 x2 x3] -> [... x1 x3]\n// NipN(2): [... x1 x2 x3] -> [... x2 x3]\nfunc (s *stack) NipN(idx int32) error {\n\t_, err := s.nipN(idx)\n\treturn err\n}\n\n// Tuck copies the item at the top of the stack and inserts it before the 2nd\n// to top item.\n//\n// Stack transformation: [... x1 x2] -> [... x2 x1 x2]\nfunc (s *stack) Tuck() error {\n\tso2, err := s.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\tso1, err := s.PopByteArray()\n\tif err != nil {\n\t\treturn err\n\t}\n\ts.PushByteArray(so2) // stack [... x2]\n\ts.PushByteArray(so1) // stack [... x2 x1]\n\ts.PushByteArray(so2) // stack [... x2 x1 x2]\n\n\treturn nil\n}\n\n// DropN removes the top N items from the stack.\n//\n// Stack transformation:\n// DropN(1): [... x1 x2] -> [... x1]\n// DropN(2): [... x1 x2] -> [...]\nfunc (s *stack) DropN(n int32) error {\n\tif n < 1 {\n\t\tstr := fmt.Sprintf(\"attempt to drop %d items from stack\", n)\n\t\treturn scriptError(ErrInvalidStackOperation, str)\n\t}\n\n\tfor ; n > 0; n-- {\n\t\t_, err := s.PopByteArray()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// DupN duplicates the top N items on the stack.\n//\n// Stack transformation:\n// DupN(1): [... x1 x2] -> [... x1 x2 x2]\n// DupN(2): [... x1 x2] -> [... x1 x2 x1 x2]\nfunc (s *stack) DupN(n int32) error {\n\tif n < 1 {\n\t\tstr := fmt.Sprintf(\"attempt to dup %d stack items\", n)\n\t\treturn scriptError(ErrInvalidStackOperation, str)\n\t}\n\n\t// Iteratively duplicate the value n-1 down the stack n times.\n\t// This leaves an in-order duplicate of the top n items on the stack.\n\tfor i := n; i > 0; i-- {\n\t\tso, err := s.PeekByteArray(n - 1)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ts.PushByteArray(so)\n\t}\n\treturn nil\n}\n\n// RotN rotates the top 3N items on the stack to the left N times.\n//\n// Stack transformation:\n// RotN(1): [... x1 x2 x3] -> [... x2 x3 x1]\n// RotN(2): [... x1 x2 x3 x4 x5 x6] -> [... x3 x4 x5 x6 x1 x2]\nfunc (s *stack) RotN(n int32) error {\n\tif n < 1 {\n\t\tstr := fmt.Sprintf(\"attempt to rotate %d stack items\", n)\n\t\treturn scriptError(ErrInvalidStackOperation, str)\n\t}\n\n\t// Nip the 3n-1th item from the stack to the top n times to rotate\n\t// them up to the head of the stack.\n\tentry := 3*n - 1\n\tfor i := n; i > 0; i-- {\n\t\tso, err := s.nipN(entry)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\ts.PushByteArray(so)\n\t}\n\treturn nil\n}\n\n// SwapN swaps the top N items on the stack with those below them.\n//\n// Stack transformation:\n// SwapN(1): [... x1 x2] -> [... x2 x1]\n// SwapN(2): [... x1 x2 x3 x4] -> [... x3 x4 x1 x2]\nfunc (s *stack) SwapN(n int32) error {\n\tif n < 1 {\n\t\tstr := fmt.Sprintf(\"attempt to swap %d stack items\", n)\n\t\treturn scriptError(ErrInvalidStackOperation, str)\n\t}\n\n\tentry := 2*n - 1\n\tfor i := n; i > 0; i-- {\n\t\t// Swap 2n-1th entry to top.\n\t\tso, err := s.nipN(entry)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\ts.PushByteArray(so)\n\t}\n\treturn nil\n}\n\n// OverN copies N items N items back to the top of the stack.\n//\n// Stack transformation:\n// OverN(1): [... x1 x2 x3] -> [... x1 x2 x3 x2]\n// OverN(2): [... x1 x2 x3 x4] -> [... x1 x2 x3 x4 x1 x2]\nfunc (s *stack) OverN(n int32) error {\n\tif n < 1 {\n\t\tstr := fmt.Sprintf(\"attempt to perform over on %d stack items\",\n\t\t\tn)\n\t\treturn scriptError(ErrInvalidStackOperation, str)\n\t}\n\n\t// Copy 2n-1th entry to top of the stack.\n\tentry := 2*n - 1\n\tfor ; n > 0; n-- {\n\t\tso, err := s.PeekByteArray(entry)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ts.PushByteArray(so)\n\t}\n\n\treturn nil\n}\n\n// PickN copies the item N items back in the stack to the top.\n//\n// Stack transformation:\n// PickN(0): [x1 x2 x3] -> [x1 x2 x3 x3]\n// PickN(1): [x1 x2 x3] -> [x1 x2 x3 x2]\n// PickN(2): [x1 x2 x3] -> [x1 x2 x3 x1]\nfunc (s *stack) PickN(n int32) error {\n\tso, err := s.PeekByteArray(n)\n\tif err != nil {\n\t\treturn err\n\t}\n\ts.PushByteArray(so)\n\n\treturn nil\n}\n\n// RollN moves the item N items back in the stack to the top.\n//\n// Stack transformation:\n// RollN(0): [x1 x2 x3] -> [x1 x2 x3]\n// RollN(1): [x1 x2 x3] -> [x1 x3 x2]\n// RollN(2): [x1 x2 x3] -> [x2 x3 x1]\nfunc (s *stack) RollN(n int32) error {\n\tso, err := s.nipN(n)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ts.PushByteArray(so)\n\n\treturn nil\n}\n\n// String returns the stack in a readable format.\nfunc (s *stack) String() string {\n\tvar result string\n\tfor _, stack := range s.stk {\n\t\tif len(stack) == 0 {\n\t\t\tresult += \"00000000  <empty>\\n\"\n\t\t}\n\t\tresult += hex.Dump(stack)\n\t}\n\n\treturn result\n}\n"
  },
  {
    "path": "txscript/stack_test.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n)\n\n// tstCheckScriptError ensures the type of the two passed errors are of the\n// same type (either both nil or both of type Error) and their error codes\n// match when not nil.\nfunc tstCheckScriptError(gotErr, wantErr error) error {\n\t// Ensure the error code is of the expected type and the error\n\t// code matches the value specified in the test instance.\n\tif reflect.TypeOf(gotErr) != reflect.TypeOf(wantErr) {\n\t\treturn fmt.Errorf(\"wrong error - got %T (%[1]v), want %T\",\n\t\t\tgotErr, wantErr)\n\t}\n\tif gotErr == nil {\n\t\treturn nil\n\t}\n\n\t// Ensure the want error type is a script error.\n\twerr, ok := wantErr.(Error)\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected test error type %T\", wantErr)\n\t}\n\n\t// Ensure the error codes match.  It's safe to use a raw type assert\n\t// here since the code above already proved they are the same type and\n\t// the want error is a script error.\n\tgotErrorCode := gotErr.(Error).ErrorCode\n\tif gotErrorCode != werr.ErrorCode {\n\t\treturn fmt.Errorf(\"mismatched error code - got %v (%v), want %v\",\n\t\t\tgotErrorCode, gotErr, werr.ErrorCode)\n\t}\n\n\treturn nil\n}\n\n// TestStack tests that all of the stack operations work as expected.\nfunc TestStack(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname      string\n\t\tbefore    [][]byte\n\t\toperation func(*stack) error\n\t\terr       error\n\t\tafter     [][]byte\n\t}{\n\t\t{\n\t\t\t\"noop\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {5}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {5}},\n\t\t},\n\t\t{\n\t\t\t\"peek underflow (byte)\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {5}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\t_, err := s.PeekByteArray(5)\n\t\t\t\treturn err\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"peek underflow (int)\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {5}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\t_, err := s.PeekInt(5)\n\t\t\t\treturn err\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"peek underflow (bool)\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {5}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\t_, err := s.PeekBool(5)\n\t\t\t\treturn err\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"pop\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {5}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tval, err := s.PopByteArray()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif !bytes.Equal(val, []byte{5}) {\n\t\t\t\t\treturn errors.New(\"not equal\")\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t},\n\t\t{\n\t\t\t\"pop everything\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {5}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tfor i := 0; i < 5; i++ {\n\t\t\t\t\t_, err := s.PopByteArray()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"pop underflow\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {5}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tfor i := 0; i < 6; i++ {\n\t\t\t\t\t_, err := s.PopByteArray()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"pop bool\",\n\t\t\t[][]byte{nil},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tval, err := s.PopBool()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\tif val {\n\t\t\t\t\treturn errors.New(\"unexpected value\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"pop bool\",\n\t\t\t[][]byte{{1}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tval, err := s.PopBool()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\tif !val {\n\t\t\t\t\treturn errors.New(\"unexpected value\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"pop bool\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\t_, err := s.PopBool()\n\t\t\t\treturn err\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"popInt 0\",\n\t\t\t[][]byte{{0x0}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tv, err := s.PopInt()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif v != 0 {\n\t\t\t\t\treturn errors.New(\"0 != 0 on popInt\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"popInt -0\",\n\t\t\t[][]byte{{0x80}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tv, err := s.PopInt()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif v != 0 {\n\t\t\t\t\treturn errors.New(\"-0 != 0 on popInt\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"popInt 1\",\n\t\t\t[][]byte{{0x01}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tv, err := s.PopInt()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif v != 1 {\n\t\t\t\t\treturn errors.New(\"1 != 1 on popInt\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"popInt 1 leading 0\",\n\t\t\t[][]byte{{0x01, 0x00, 0x00, 0x00}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tv, err := s.PopInt()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif v != 1 {\n\t\t\t\t\tfmt.Printf(\"%v != %v\\n\", v, 1)\n\t\t\t\t\treturn errors.New(\"1 != 1 on popInt\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"popInt -1\",\n\t\t\t[][]byte{{0x81}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tv, err := s.PopInt()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif v != -1 {\n\t\t\t\t\treturn errors.New(\"-1 != -1 on popInt\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"popInt -1 leading 0\",\n\t\t\t[][]byte{{0x01, 0x00, 0x00, 0x80}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tv, err := s.PopInt()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif v != -1 {\n\t\t\t\t\tfmt.Printf(\"%v != %v\\n\", v, -1)\n\t\t\t\t\treturn errors.New(\"-1 != -1 on popInt\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t// Triggers the multibyte case in asInt\n\t\t{\n\t\t\t\"popInt -513\",\n\t\t\t[][]byte{{0x1, 0x82}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tv, err := s.PopInt()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif v != -513 {\n\t\t\t\t\tfmt.Printf(\"%v != %v\\n\", v, -513)\n\t\t\t\t\treturn errors.New(\"1 != 1 on popInt\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t// Confirm that the asInt code doesn't modify the base data.\n\t\t{\n\t\t\t\"peekint nomodify -1\",\n\t\t\t[][]byte{{0x01, 0x00, 0x00, 0x80}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\tv, err := s.PeekInt(0)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif v != -1 {\n\t\t\t\t\tfmt.Printf(\"%v != %v\\n\", v, -1)\n\t\t\t\t\treturn errors.New(\"-1 != -1 on popInt\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{0x01, 0x00, 0x00, 0x80}},\n\t\t},\n\t\t{\n\t\t\t\"PushInt 0\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\ts.PushInt(scriptNum(0))\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{}},\n\t\t},\n\t\t{\n\t\t\t\"PushInt 1\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\ts.PushInt(scriptNum(1))\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{0x1}},\n\t\t},\n\t\t{\n\t\t\t\"PushInt -1\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\ts.PushInt(scriptNum(-1))\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{0x81}},\n\t\t},\n\t\t{\n\t\t\t\"PushInt two bytes\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\ts.PushInt(scriptNum(256))\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t// little endian.. *sigh*\n\t\t\t[][]byte{{0x00, 0x01}},\n\t\t},\n\t\t{\n\t\t\t\"PushInt leading zeros\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\t// this will have the highbit set\n\t\t\t\ts.PushInt(scriptNum(128))\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{0x80, 0x00}},\n\t\t},\n\t\t{\n\t\t\t\"dup\",\n\t\t\t[][]byte{{1}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DupN(1)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {1}},\n\t\t},\n\t\t{\n\t\t\t\"dup2\",\n\t\t\t[][]byte{{1}, {2}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DupN(2)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}, {1}, {2}},\n\t\t},\n\t\t{\n\t\t\t\"dup3\",\n\t\t\t[][]byte{{1}, {2}, {3}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DupN(3)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}, {3}, {1}, {2}, {3}},\n\t\t},\n\t\t{\n\t\t\t\"dup0\",\n\t\t\t[][]byte{{1}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DupN(0)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"dup-1\",\n\t\t\t[][]byte{{1}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DupN(-1)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"dup too much\",\n\t\t\t[][]byte{{1}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DupN(2)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"PushBool true\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\ts.PushBool(true)\n\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}},\n\t\t},\n\t\t{\n\t\t\t\"PushBool false\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\ts.PushBool(false)\n\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{nil},\n\t\t},\n\t\t{\n\t\t\t\"PushBool PopBool\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\ts.PushBool(true)\n\t\t\t\tval, err := s.PopBool()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif !val {\n\t\t\t\t\treturn errors.New(\"unexpected value\")\n\t\t\t\t}\n\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"PushBool PopBool 2\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\ts.PushBool(false)\n\t\t\t\tval, err := s.PopBool()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif val {\n\t\t\t\t\treturn errors.New(\"unexpected value\")\n\t\t\t\t}\n\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"PushInt PopBool\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\ts.PushInt(scriptNum(1))\n\t\t\t\tval, err := s.PopBool()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif !val {\n\t\t\t\t\treturn errors.New(\"unexpected value\")\n\t\t\t\t}\n\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"PushInt PopBool 2\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\ts.PushInt(scriptNum(0))\n\t\t\t\tval, err := s.PopBool()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif val {\n\t\t\t\t\treturn errors.New(\"unexpected value\")\n\t\t\t\t}\n\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"Nip top\",\n\t\t\t[][]byte{{1}, {2}, {3}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.NipN(0)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}},\n\t\t},\n\t\t{\n\t\t\t\"Nip middle\",\n\t\t\t[][]byte{{1}, {2}, {3}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.NipN(1)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {3}},\n\t\t},\n\t\t{\n\t\t\t\"Nip low\",\n\t\t\t[][]byte{{1}, {2}, {3}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.NipN(2)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{2}, {3}},\n\t\t},\n\t\t{\n\t\t\t\"Nip too much\",\n\t\t\t[][]byte{{1}, {2}, {3}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\t// bite off more than we can chew\n\t\t\t\treturn s.NipN(3)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\t[][]byte{{2}, {3}},\n\t\t},\n\t\t{\n\t\t\t\"keep on tucking\",\n\t\t\t[][]byte{{1}, {2}, {3}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.Tuck()\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {3}, {2}, {3}},\n\t\t},\n\t\t{\n\t\t\t\"a little tucked up\",\n\t\t\t[][]byte{{1}}, // too few arguments for tuck\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.Tuck()\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"all tucked up\",\n\t\t\tnil, // too few arguments  for tuck\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.Tuck()\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"drop 1\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DropN(1)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}, {3}},\n\t\t},\n\t\t{\n\t\t\t\"drop 2\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DropN(2)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}},\n\t\t},\n\t\t{\n\t\t\t\"drop 3\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DropN(3)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}},\n\t\t},\n\t\t{\n\t\t\t\"drop 4\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DropN(4)\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"drop 4/5\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DropN(5)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"drop invalid\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.DropN(0)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"Rot1\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.RotN(1)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {3}, {4}, {2}},\n\t\t},\n\t\t{\n\t\t\t\"Rot2\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {5}, {6}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.RotN(2)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{3}, {4}, {5}, {6}, {1}, {2}},\n\t\t},\n\t\t{\n\t\t\t\"Rot too little\",\n\t\t\t[][]byte{{1}, {2}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.RotN(1)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"Rot0\",\n\t\t\t[][]byte{{1}, {2}, {3}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.RotN(0)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"Swap1\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.SwapN(1)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}, {4}, {3}},\n\t\t},\n\t\t{\n\t\t\t\"Swap2\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.SwapN(2)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{3}, {4}, {1}, {2}},\n\t\t},\n\t\t{\n\t\t\t\"Swap too little\",\n\t\t\t[][]byte{{1}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.SwapN(1)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"Swap0\",\n\t\t\t[][]byte{{1}, {2}, {3}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.SwapN(0)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"Over1\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.OverN(1)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {3}},\n\t\t},\n\t\t{\n\t\t\t\"Over2\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.OverN(2)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {1}, {2}},\n\t\t},\n\t\t{\n\t\t\t\"Over too little\",\n\t\t\t[][]byte{{1}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.OverN(1)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"Over0\",\n\t\t\t[][]byte{{1}, {2}, {3}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.OverN(0)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"Pick1\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.PickN(1)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {3}},\n\t\t},\n\t\t{\n\t\t\t\"Pick2\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.PickN(2)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}, {3}, {4}, {2}},\n\t\t},\n\t\t{\n\t\t\t\"Pick too little\",\n\t\t\t[][]byte{{1}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.PickN(1)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"Roll1\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.RollN(1)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {2}, {4}, {3}},\n\t\t},\n\t\t{\n\t\t\t\"Roll2\",\n\t\t\t[][]byte{{1}, {2}, {3}, {4}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.RollN(2)\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}, {3}, {4}, {2}},\n\t\t},\n\t\t{\n\t\t\t\"Roll too little\",\n\t\t\t[][]byte{{1}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\treturn s.RollN(1)\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"Peek bool\",\n\t\t\t[][]byte{{1}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\t// Peek bool is otherwise pretty well tested,\n\t\t\t\t// just check it works.\n\t\t\t\tval, err := s.PeekBool(0)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif !val {\n\t\t\t\t\treturn errors.New(\"invalid result\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}},\n\t\t},\n\t\t{\n\t\t\t\"Peek bool 2\",\n\t\t\t[][]byte{nil},\n\t\t\tfunc(s *stack) error {\n\t\t\t\t// Peek bool is otherwise pretty well tested,\n\t\t\t\t// just check it works.\n\t\t\t\tval, err := s.PeekBool(0)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif val {\n\t\t\t\t\treturn errors.New(\"invalid result\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{nil},\n\t\t},\n\t\t{\n\t\t\t\"Peek int\",\n\t\t\t[][]byte{{1}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\t// Peek int is otherwise pretty well tested,\n\t\t\t\t// just check it works.\n\t\t\t\tval, err := s.PeekInt(0)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif val != 1 {\n\t\t\t\t\treturn errors.New(\"invalid result\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{1}},\n\t\t},\n\t\t{\n\t\t\t\"Peek int 2\",\n\t\t\t[][]byte{{0}},\n\t\t\tfunc(s *stack) error {\n\t\t\t\t// Peek int is otherwise pretty well tested,\n\t\t\t\t// just check it works.\n\t\t\t\tval, err := s.PeekInt(0)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif val != 0 {\n\t\t\t\t\treturn errors.New(\"invalid result\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\t[][]byte{{0}},\n\t\t},\n\t\t{\n\t\t\t\"pop int\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\ts.PushInt(scriptNum(1))\n\t\t\t\t// Peek int is otherwise pretty well tested,\n\t\t\t\t// just check it works.\n\t\t\t\tval, err := s.PopInt()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif val != 1 {\n\t\t\t\t\treturn errors.New(\"invalid result\")\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t\tnil,\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t\"pop empty\",\n\t\t\tnil,\n\t\t\tfunc(s *stack) error {\n\t\t\t\t// Peek int is otherwise pretty well tested,\n\t\t\t\t// just check it works.\n\t\t\t\t_, err := s.PopInt()\n\t\t\t\treturn err\n\t\t\t},\n\t\t\tscriptError(ErrInvalidStackOperation, \"\"),\n\t\t\tnil,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\t// Setup the initial stack state and perform the test operation.\n\t\ts := stack{}\n\t\tfor i := range test.before {\n\t\t\ts.PushByteArray(test.before[i])\n\t\t}\n\t\terr := test.operation(&s)\n\n\t\t// Ensure the error code is of the expected type and the error\n\t\t// code matches the value specified in the test instance.\n\t\tif e := tstCheckScriptError(err, test.err); e != nil {\n\t\t\tt.Errorf(\"%s: %v\", test.name, e)\n\t\t\tcontinue\n\t\t}\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the resulting stack is the expected length.\n\t\tif int32(len(test.after)) != s.Depth() {\n\t\t\tt.Errorf(\"%s: stack depth doesn't match expected: %v \"+\n\t\t\t\t\"vs %v\", test.name, len(test.after),\n\t\t\t\ts.Depth())\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure all items of the resulting stack are the expected\n\t\t// values.\n\t\tfor i := range test.after {\n\t\t\tval, err := s.PeekByteArray(s.Depth() - int32(i) - 1)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"%s: can't peek %dth stack entry: %v\",\n\t\t\t\t\ttest.name, i, err)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif !bytes.Equal(val, test.after[i]) {\n\t\t\t\tt.Errorf(\"%s: %dth stack entry doesn't match \"+\n\t\t\t\t\t\"expected: %v vs %v\", test.name, i, val,\n\t\t\t\t\ttest.after[i])\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "txscript/standard.go",
    "content": "// Copyright (c) 2013-2020 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\nconst (\n\t// MaxDataCarrierSize is the maximum number of bytes allowed in pushed\n\t// data to be considered a nulldata transaction\n\tMaxDataCarrierSize = 80\n\n\t// StandardVerifyFlags are the script flags which are used when\n\t// executing transaction scripts to enforce additional checks which\n\t// are required for the script to be considered standard.  These checks\n\t// help reduce issues related to transaction malleability as well as\n\t// allow pay-to-script hash transactions.  Note these flags are\n\t// different than what is required for the consensus rules in that they\n\t// are more strict.\n\t//\n\t// TODO: This definition does not belong here.  It belongs in a policy\n\t// package.\n\tStandardVerifyFlags = ScriptBip16 |\n\t\tScriptVerifyDERSignatures |\n\t\tScriptVerifyStrictEncoding |\n\t\tScriptVerifyMinimalData |\n\t\tScriptStrictMultiSig |\n\t\tScriptDiscourageUpgradableNops |\n\t\tScriptVerifyCleanStack |\n\t\tScriptVerifyNullFail |\n\t\tScriptVerifyCheckLockTimeVerify |\n\t\tScriptVerifyCheckSequenceVerify |\n\t\tScriptVerifyLowS |\n\t\tScriptStrictMultiSig |\n\t\tScriptVerifyWitness |\n\t\tScriptVerifyDiscourageUpgradeableWitnessProgram |\n\t\tScriptVerifyMinimalIf |\n\t\tScriptVerifyWitnessPubKeyType |\n\t\tScriptVerifyTaproot |\n\t\tScriptVerifyDiscourageUpgradeableTaprootVersion |\n\t\tScriptVerifyDiscourageOpSuccess |\n\t\tScriptVerifyDiscourageUpgradeablePubkeyType |\n\t\tScriptVerifyConstScriptCode\n)\n\n// ScriptClass is an enumeration for the list of standard types of script.\ntype ScriptClass byte\n\n// Classes of script payment known about in the blockchain.\nconst (\n\tNonStandardTy         ScriptClass = iota // None of the recognized forms.\n\tPubKeyTy                                 // Pay pubkey.\n\tPubKeyHashTy                             // Pay pubkey hash.\n\tWitnessV0PubKeyHashTy                    // Pay witness pubkey hash.\n\tScriptHashTy                             // Pay to script hash.\n\tWitnessV0ScriptHashTy                    // Pay to witness script hash.\n\tMultiSigTy                               // Multi signature.\n\tNullDataTy                               // Empty data-only (provably prunable).\n\tWitnessV1TaprootTy                       // Taproot output\n\tWitnessUnknownTy                         // Witness unknown\n)\n\n// scriptClassToName houses the human-readable strings which describe each\n// script class.\nvar scriptClassToName = []string{\n\tNonStandardTy:         \"nonstandard\",\n\tPubKeyTy:              \"pubkey\",\n\tPubKeyHashTy:          \"pubkeyhash\",\n\tWitnessV0PubKeyHashTy: \"witness_v0_keyhash\",\n\tScriptHashTy:          \"scripthash\",\n\tWitnessV0ScriptHashTy: \"witness_v0_scripthash\",\n\tMultiSigTy:            \"multisig\",\n\tNullDataTy:            \"nulldata\",\n\tWitnessV1TaprootTy:    \"witness_v1_taproot\",\n\tWitnessUnknownTy:      \"witness_unknown\",\n}\n\n// String implements the Stringer interface by returning the name of\n// the enum script class. If the enum is invalid then \"Invalid\" will be\n// returned.\nfunc (t ScriptClass) String() string {\n\tif int(t) > len(scriptClassToName) || int(t) < 0 {\n\t\treturn \"Invalid\"\n\t}\n\treturn scriptClassToName[t]\n}\n\n// extractCompressedPubKey extracts a compressed public key from the passed\n// script if it is a standard pay-to-compressed-secp256k1-pubkey script.  It\n// will return nil otherwise.\nfunc extractCompressedPubKey(script []byte) []byte {\n\t// A pay-to-compressed-pubkey script is of the form:\n\t//  OP_DATA_33 <33-byte compressed pubkey> OP_CHECKSIG\n\n\t// All compressed secp256k1 public keys must start with 0x02 or 0x03.\n\tif len(script) == 35 &&\n\t\tscript[34] == OP_CHECKSIG &&\n\t\tscript[0] == OP_DATA_33 &&\n\t\t(script[1] == 0x02 || script[1] == 0x03) {\n\n\t\treturn script[1:34]\n\t}\n\n\treturn nil\n}\n\n// extractUncompressedPubKey extracts an uncompressed public key from the\n// passed script if it is a standard pay-to-uncompressed-secp256k1-pubkey\n// script.  It will return nil otherwise.\nfunc extractUncompressedPubKey(script []byte) []byte {\n\t// A pay-to-uncompressed-pubkey script is of the form:\n\t//   OP_DATA_65 <65-byte uncompressed pubkey> OP_CHECKSIG\n\t//\n\t// All non-hybrid uncompressed secp256k1 public keys must start with 0x04.\n\t// Hybrid uncompressed secp256k1 public keys start with 0x06 or 0x07:\n\t//   - 0x06 => hybrid format for even Y coords\n\t//   - 0x07 => hybrid format for odd Y coords\n\tif len(script) == 67 &&\n\t\tscript[66] == OP_CHECKSIG &&\n\t\tscript[0] == OP_DATA_65 &&\n\t\t(script[1] == 0x04 || script[1] == 0x06 || script[1] == 0x07) {\n\n\t\treturn script[1:66]\n\t}\n\treturn nil\n}\n\n// extractPubKey extracts either compressed or uncompressed public key from the\n// passed script if it is a either a standard pay-to-compressed-secp256k1-pubkey\n// or pay-to-uncompressed-secp256k1-pubkey script, respectively.  It will return\n// nil otherwise.\nfunc extractPubKey(script []byte) []byte {\n\tif pubKey := extractCompressedPubKey(script); pubKey != nil {\n\t\treturn pubKey\n\t}\n\treturn extractUncompressedPubKey(script)\n}\n\n// isPubKeyScript returns whether or not the passed script is either a standard\n// pay-to-compressed-secp256k1-pubkey or pay-to-uncompressed-secp256k1-pubkey\n// script.\nfunc isPubKeyScript(script []byte) bool {\n\treturn extractPubKey(script) != nil\n}\n\n// extractPubKeyHash extracts the public key hash from the passed script if it\n// is a standard pay-to-pubkey-hash script.  It will return nil otherwise.\nfunc extractPubKeyHash(script []byte) []byte {\n\t// A pay-to-pubkey-hash script is of the form:\n\t//  OP_DUP OP_HASH160 OP_DATA_20 <20-byte hash> OP_EQUALVERIFY OP_CHECKSIG\n\tif len(script) == 25 &&\n\t\tscript[0] == OP_DUP &&\n\t\tscript[1] == OP_HASH160 &&\n\t\tscript[2] == OP_DATA_20 &&\n\t\tscript[23] == OP_EQUALVERIFY &&\n\t\tscript[24] == OP_CHECKSIG {\n\n\t\treturn script[3:23]\n\t}\n\n\treturn nil\n}\n\n// isPubKeyHashScript returns whether or not the passed script is a standard\n// pay-to-pubkey-hash script.\nfunc isPubKeyHashScript(script []byte) bool {\n\treturn extractPubKeyHash(script) != nil\n}\n\n// extractScriptHash extracts the script hash from the passed script if it is a\n// standard pay-to-script-hash script.  It will return nil otherwise.\n//\n// NOTE: This function is only valid for version 0 opcodes.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc extractScriptHash(script []byte) []byte {\n\t// A pay-to-script-hash script is of the form:\n\t//  OP_HASH160 OP_DATA_20 <20-byte scripthash> OP_EQUAL\n\tif len(script) == 23 &&\n\t\tscript[0] == OP_HASH160 &&\n\t\tscript[1] == OP_DATA_20 &&\n\t\tscript[22] == OP_EQUAL {\n\n\t\treturn script[2:22]\n\t}\n\n\treturn nil\n}\n\n// isScriptHashScript returns whether or not the passed script is a standard\n// pay-to-script-hash script.\nfunc isScriptHashScript(script []byte) bool {\n\treturn extractScriptHash(script) != nil\n}\n\n// multiSigDetails houses details extracted from a standard multisig script.\ntype multiSigDetails struct {\n\trequiredSigs int\n\tnumPubKeys   int\n\tpubKeys      [][]byte\n\tvalid        bool\n}\n\n// extractMultisigScriptDetails attempts to extract details from the passed\n// script if it is a standard multisig script.  The returned details struct will\n// have the valid flag set to false otherwise.\n//\n// The extract pubkeys flag indicates whether or not the pubkeys themselves\n// should also be extracted and is provided because extracting them results in\n// an allocation that the caller might wish to avoid.  The pubKeys member of\n// the returned details struct will be nil when the flag is false.\n//\n// NOTE: This function is only valid for version 0 scripts.  The returned\n// details struct will always be empty and have the valid flag set to false for\n// other script versions.\nfunc extractMultisigScriptDetails(scriptVersion uint16, script []byte, extractPubKeys bool) multiSigDetails {\n\t// The only currently supported script version is 0.\n\tif scriptVersion != 0 {\n\t\treturn multiSigDetails{}\n\t}\n\n\t// A multi-signature script is of the form:\n\t//  NUM_SIGS PUBKEY PUBKEY PUBKEY ... NUM_PUBKEYS OP_CHECKMULTISIG\n\n\t// The script can't possibly be a multisig script if it doesn't end with\n\t// OP_CHECKMULTISIG or have at least two small integer pushes preceding it.\n\t// Fail fast to avoid more work below.\n\tif len(script) < 3 || script[len(script)-1] != OP_CHECKMULTISIG {\n\t\treturn multiSigDetails{}\n\t}\n\n\t// The first opcode must be a small integer specifying the number of\n\t// signatures required.\n\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\tif !tokenizer.Next() || !IsSmallInt(tokenizer.Opcode()) {\n\t\treturn multiSigDetails{}\n\t}\n\trequiredSigs := AsSmallInt(tokenizer.Opcode())\n\n\t// The next series of opcodes must either push public keys or be a small\n\t// integer specifying the number of public keys.\n\tvar numPubKeys int\n\tvar pubKeys [][]byte\n\tif extractPubKeys {\n\t\tpubKeys = make([][]byte, 0, MaxPubKeysPerMultiSig)\n\t}\n\tfor tokenizer.Next() {\n\t\tif IsSmallInt(tokenizer.Opcode()) {\n\t\t\tbreak\n\t\t}\n\n\t\tdata := tokenizer.Data()\n\t\tnumPubKeys++\n\t\tif !isStrictPubKeyEncoding(data) {\n\t\t\tcontinue\n\t\t}\n\t\tif extractPubKeys {\n\t\t\tpubKeys = append(pubKeys, data)\n\t\t}\n\t}\n\tif tokenizer.Done() {\n\t\treturn multiSigDetails{}\n\t}\n\n\t// The next opcode must be a small integer specifying the number of public\n\t// keys required.\n\top := tokenizer.Opcode()\n\tif !IsSmallInt(op) || AsSmallInt(op) != numPubKeys {\n\t\treturn multiSigDetails{}\n\t}\n\n\t// There must only be a single opcode left unparsed which will be\n\t// OP_CHECKMULTISIG per the check above.\n\tif int32(len(tokenizer.Script()))-tokenizer.ByteIndex() != 1 {\n\t\treturn multiSigDetails{}\n\t}\n\n\treturn multiSigDetails{\n\t\trequiredSigs: requiredSigs,\n\t\tnumPubKeys:   numPubKeys,\n\t\tpubKeys:      pubKeys,\n\t\tvalid:        true,\n\t}\n}\n\n// isMultisigScript returns whether or not the passed script is a standard\n// multisig script.\n//\n// NOTE: This function is only valid for version 0 scripts.  It will always\n// return false for other script versions.\nfunc isMultisigScript(scriptVersion uint16, script []byte) bool {\n\t// Since this is only checking the form of the script, don't extract the\n\t// public keys to avoid the allocation.\n\tdetails := extractMultisigScriptDetails(scriptVersion, script, false)\n\treturn details.valid\n}\n\n// IsMultisigScript returns whether or not the passed script is a standard\n// multisignature script.\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\n//\n// The error is DEPRECATED and will be removed in the major version bump.\nfunc IsMultisigScript(script []byte) (bool, error) {\n\tconst scriptVersion = 0\n\treturn isMultisigScript(scriptVersion, script), nil\n}\n\n// IsMultisigSigScript returns whether or not the passed script appears to be a\n// signature script which consists of a pay-to-script-hash multi-signature\n// redeem script.  Determining if a signature script is actually a redemption of\n// pay-to-script-hash requires the associated public key script which is often\n// expensive to obtain.  Therefore, this makes a fast best effort guess that has\n// a high probability of being correct by checking if the signature script ends\n// with a data push and treating that data push as if it were a p2sh redeem\n// script\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc IsMultisigSigScript(script []byte) bool {\n\tconst scriptVersion = 0\n\n\t// The script can't possibly be a multisig signature script if it doesn't\n\t// end with OP_CHECKMULTISIG in the redeem script or have at least two small\n\t// integers preceding it, and the redeem script itself must be preceded by\n\t// at least a data push opcode.  Fail fast to avoid more work below.\n\tif len(script) < 4 || script[len(script)-1] != OP_CHECKMULTISIG {\n\t\treturn false\n\t}\n\n\t// Parse through the script to find the last opcode and any data it might\n\t// push and treat it as a p2sh redeem script even though it might not\n\t// actually be one.\n\tpossibleRedeemScript := finalOpcodeData(scriptVersion, script)\n\tif possibleRedeemScript == nil {\n\t\treturn false\n\t}\n\n\t// Finally, return if that possible redeem script is a multisig script.\n\treturn isMultisigScript(scriptVersion, possibleRedeemScript)\n}\n\n// extractWitnessPubKeyHash extracts the witness public key hash from the passed\n// script if it is a standard pay-to-witness-pubkey-hash script. It will return\n// nil otherwise.\nfunc extractWitnessPubKeyHash(script []byte) []byte {\n\t// A pay-to-witness-pubkey-hash script is of the form:\n\t//   OP_0 OP_DATA_20 <20-byte-hash>\n\tif len(script) == witnessV0PubKeyHashLen &&\n\t\tscript[0] == OP_0 &&\n\t\tscript[1] == OP_DATA_20 {\n\n\t\treturn script[2:witnessV0PubKeyHashLen]\n\t}\n\n\treturn nil\n}\n\n// isWitnessPubKeyHashScript returns whether or not the passed script is a\n// standard pay-to-witness-pubkey-hash script.\nfunc isWitnessPubKeyHashScript(script []byte) bool {\n\treturn extractWitnessPubKeyHash(script) != nil\n}\n\n// extractWitnessV0ScriptHash extracts the witness script hash from the passed\n// script if it is standard pay-to-witness-script-hash script. It will return\n// nil otherwise.\nfunc extractWitnessV0ScriptHash(script []byte) []byte {\n\t// A pay-to-witness-script-hash script is of the form:\n\t//   OP_0 OP_DATA_32 <32-byte-hash>\n\tif len(script) == witnessV0ScriptHashLen &&\n\t\tscript[0] == OP_0 &&\n\t\tscript[1] == OP_DATA_32 {\n\n\t\treturn script[2:34]\n\t}\n\n\treturn nil\n}\n\n// extractWitnessV1KeyBytes extracts the raw public key bytes script if it is\n// standard pay-to-witness-script-hash v1 script. It will return nil otherwise.\nfunc extractWitnessV1KeyBytes(script []byte) []byte {\n\t// A pay-to-witness-script-hash script is of the form:\n\t//   OP_1 OP_DATA_32 <32-byte-hash>\n\tif len(script) == witnessV1TaprootLen &&\n\t\tscript[0] == OP_1 &&\n\t\tscript[1] == OP_DATA_32 {\n\n\t\treturn script[2:34]\n\t}\n\n\treturn nil\n}\n\n// isWitnessScriptHashScript returns whether or not the passed script is a\n// standard pay-to-witness-script-hash script.\nfunc isWitnessScriptHashScript(script []byte) bool {\n\treturn extractWitnessV0ScriptHash(script) != nil\n}\n\n// extractWitnessProgramInfo returns the version and program if the passed\n// script constitutes a valid witness program. The last return value indicates\n// whether or not the script is a valid witness program.\nfunc extractWitnessProgramInfo(script []byte) (int, []byte, bool) {\n\t// Skip parsing if we know the program is invalid based on size.\n\tif len(script) < 4 || len(script) > 42 {\n\t\treturn 0, nil, false\n\t}\n\n\tconst scriptVersion = 0\n\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\n\t// The first opcode must be a small int.\n\tif !tokenizer.Next() ||\n\t\t!IsSmallInt(tokenizer.Opcode()) {\n\n\t\treturn 0, nil, false\n\t}\n\tversion := AsSmallInt(tokenizer.Opcode())\n\n\t// The second opcode must be a canonical data push, the length of the\n\t// data push is bounded to 40 by the initial check on overall script\n\t// length.\n\tif !tokenizer.Next() ||\n\t\t!isCanonicalPush(tokenizer.Opcode(), tokenizer.Data()) {\n\n\t\treturn 0, nil, false\n\t}\n\tprogram := tokenizer.Data()\n\n\t// The witness program is valid if there are no more opcodes, and we\n\t// terminated without a parsing error.\n\tvalid := tokenizer.Done() && tokenizer.Err() == nil\n\n\treturn version, program, valid\n}\n\n// isWitnessProgramScript returns true if the passed script is a witness\n// program, and false otherwise. A witness program MUST adhere to the following\n// constraints: there must be exactly two pops (program version and the program\n// itself), the first opcode MUST be a small integer (0-16), the push data MUST\n// be canonical, and finally the size of the push data must be between 2 and 40\n// bytes.\n//\n// The length of the script must be between 4 and 42 bytes. The\n// smallest program is the witness version, followed by a data push of\n// 2 bytes.  The largest allowed witness program has a data push of\n// 40-bytes.\nfunc isWitnessProgramScript(script []byte) bool {\n\t_, _, valid := extractWitnessProgramInfo(script)\n\treturn valid\n}\n\n// isWitnessTaprootScript returns true if the passed script is for a\n// pay-to-witness-taproot output, false otherwise.\nfunc isWitnessTaprootScript(script []byte) bool {\n\treturn extractWitnessV1KeyBytes(script) != nil\n}\n\n// isAnnexedWitness returns true if the passed witness has a final push\n// that is a witness annex.\nfunc isAnnexedWitness(witness wire.TxWitness) bool {\n\tif len(witness) < 2 {\n\t\treturn false\n\t}\n\n\tlastElement := witness[len(witness)-1]\n\treturn len(lastElement) > 0 && lastElement[0] == TaprootAnnexTag\n}\n\n// extractAnnex attempts to extract the annex from the passed witness. If the\n// witness doesn't contain an annex, then an error is returned.\nfunc extractAnnex(witness [][]byte) ([]byte, error) {\n\tif !isAnnexedWitness(witness) {\n\t\treturn nil, scriptError(ErrWitnessHasNoAnnex, \"\")\n\t}\n\n\tlastElement := witness[len(witness)-1]\n\treturn lastElement, nil\n}\n\n// isNullDataScript returns whether or not the passed script is a standard\n// null data script.\n//\n// NOTE: This function is only valid for version 0 scripts.  It will always\n// return false for other script versions.\nfunc isNullDataScript(scriptVersion uint16, script []byte) bool {\n\t// The only currently supported script version is 0.\n\tif scriptVersion != 0 {\n\t\treturn false\n\t}\n\n\t// A null script is of the form:\n\t//  OP_RETURN <optional data>\n\t//\n\t// Thus, it can either be a single OP_RETURN or an OP_RETURN followed by a\n\t// data push up to MaxDataCarrierSize bytes.\n\n\t// The script can't possibly be a null data script if it doesn't start\n\t// with OP_RETURN.  Fail fast to avoid more work below.\n\tif len(script) < 1 || script[0] != OP_RETURN {\n\t\treturn false\n\t}\n\n\t// Single OP_RETURN.\n\tif len(script) == 1 {\n\t\treturn true\n\t}\n\n\t// OP_RETURN followed by data push up to MaxDataCarrierSize bytes.\n\ttokenizer := MakeScriptTokenizer(scriptVersion, script[1:])\n\treturn tokenizer.Next() && tokenizer.Done() &&\n\t\t(IsSmallInt(tokenizer.Opcode()) || tokenizer.Opcode() <= OP_PUSHDATA4) &&\n\t\tlen(tokenizer.Data()) <= MaxDataCarrierSize\n}\n\n// scriptType returns the type of the script being inspected from the known\n// standard types. The version version should be 0 if the script is segwit v0\n// or prior, and 1 for segwit v1 (taproot) scripts.\nfunc typeOfScript(scriptVersion uint16, script []byte) ScriptClass {\n\tswitch scriptVersion {\n\tcase BaseSegwitWitnessVersion:\n\t\tswitch {\n\t\tcase isPubKeyScript(script):\n\t\t\treturn PubKeyTy\n\t\tcase isPubKeyHashScript(script):\n\t\t\treturn PubKeyHashTy\n\t\tcase isScriptHashScript(script):\n\t\t\treturn ScriptHashTy\n\t\tcase isWitnessPubKeyHashScript(script):\n\t\t\treturn WitnessV0PubKeyHashTy\n\t\tcase isWitnessScriptHashScript(script):\n\t\t\treturn WitnessV0ScriptHashTy\n\t\tcase isMultisigScript(scriptVersion, script):\n\t\t\treturn MultiSigTy\n\t\tcase isNullDataScript(scriptVersion, script):\n\t\t\treturn NullDataTy\n\t\t}\n\tcase TaprootWitnessVersion:\n\t\tswitch {\n\t\tcase isWitnessTaprootScript(script):\n\t\t\treturn WitnessV1TaprootTy\n\t\t}\n\t}\n\n\treturn NonStandardTy\n}\n\n// GetScriptClass returns the class of the script passed.\n//\n// NonStandardTy will be returned when the script does not parse.\nfunc GetScriptClass(script []byte) ScriptClass {\n\tconst scriptVersionSegWit = 0\n\tclassSegWit := typeOfScript(scriptVersionSegWit, script)\n\n\tif classSegWit != NonStandardTy {\n\t\treturn classSegWit\n\t}\n\n\tconst scriptVersionTaproot = 1\n\treturn typeOfScript(scriptVersionTaproot, script)\n}\n\n// NewScriptClass returns the ScriptClass corresponding to the string name\n// provided as argument. ErrUnsupportedScriptType error is returned if the\n// name doesn't correspond to any known ScriptClass.\n//\n// Not to be confused with GetScriptClass.\nfunc NewScriptClass(name string) (*ScriptClass, error) {\n\tfor i, n := range scriptClassToName {\n\t\tif n == name {\n\t\t\tvalue := ScriptClass(i)\n\t\t\treturn &value, nil\n\t\t}\n\t}\n\n\treturn nil, fmt.Errorf(\"%w: %s\", ErrUnsupportedScriptType, name)\n}\n\n// expectedInputs returns the number of arguments required by a script.\n// If the script is of unknown type such that the number can not be determined\n// then -1 is returned. We are an internal function and thus assume that class\n// is the real class of pops (and we can thus assume things that were determined\n// while finding out the type).\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc expectedInputs(script []byte, class ScriptClass) int {\n\tswitch class {\n\tcase PubKeyTy:\n\t\treturn 1\n\n\tcase PubKeyHashTy:\n\t\treturn 2\n\n\tcase WitnessV0PubKeyHashTy:\n\t\treturn 2\n\n\tcase ScriptHashTy:\n\t\t// Not including script.  That is handled by the caller.\n\t\treturn 1\n\n\tcase WitnessV0ScriptHashTy:\n\t\t// Not including script.  That is handled by the caller.\n\t\treturn 1\n\n\tcase WitnessV1TaprootTy:\n\t\t// Not including script.  That is handled by the caller.\n\t\treturn 1\n\n\tcase MultiSigTy:\n\t\t// Standard multisig has a push a small number for the number\n\t\t// of sigs and number of keys.  Check the first push instruction\n\t\t// to see how many arguments are expected. typeOfScript already\n\t\t// checked this so we know it'll be a small int.  Also, due to\n\t\t// the original bitcoind bug where OP_CHECKMULTISIG pops an\n\t\t// additional item from the stack, add an extra expected input\n\t\t// for the extra push that is required to compensate.\n\t\treturn AsSmallInt(script[0]) + 1\n\n\tcase NullDataTy:\n\t\tfallthrough\n\tdefault:\n\t\treturn -1\n\t}\n}\n\n// ScriptInfo houses information about a script pair that is determined by\n// CalcScriptInfo.\ntype ScriptInfo struct {\n\t// PkScriptClass is the class of the public key script and is equivalent\n\t// to calling GetScriptClass on it.\n\tPkScriptClass ScriptClass\n\n\t// NumInputs is the number of inputs provided by the public key script.\n\tNumInputs int\n\n\t// ExpectedInputs is the number of outputs required by the signature\n\t// script and any pay-to-script-hash scripts. The number will be -1 if\n\t// unknown.\n\tExpectedInputs int\n\n\t// SigOps is the number of signature operations in the script pair.\n\tSigOps int\n}\n\n// CalcScriptInfo returns a structure providing data about the provided script\n// pair.  It will error if the pair is in someway invalid such that they can not\n// be analysed, i.e. if they do not parse or the pkScript is not a push-only\n// script\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\n//\n// DEPRECATED.  This will be removed in the next major version bump.\nfunc CalcScriptInfo(sigScript, pkScript []byte, witness wire.TxWitness,\n\tbip16, segwit bool) (*ScriptInfo, error) {\n\n\t// Count the number of opcodes in the signature script while also ensuring\n\t// that successfully parses.  Since there is a check below to ensure the\n\t// script is push only, this equates to the number of inputs to the public\n\t// key script.\n\tconst scriptVersion = 0\n\tvar numInputs int\n\ttokenizer := MakeScriptTokenizer(scriptVersion, sigScript)\n\tfor tokenizer.Next() {\n\t\tnumInputs++\n\t}\n\tif err := tokenizer.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err := checkScriptParses(scriptVersion, pkScript); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Can't have a signature script that doesn't just push data.\n\tif !IsPushOnlyScript(sigScript) {\n\t\treturn nil, scriptError(ErrNotPushOnly,\n\t\t\t\"signature script is not push only\")\n\t}\n\n\tsi := new(ScriptInfo)\n\tsi.PkScriptClass = typeOfScript(scriptVersion, pkScript)\n\n\tsi.ExpectedInputs = expectedInputs(pkScript, si.PkScriptClass)\n\n\tswitch {\n\t// Count sigops taking into account pay-to-script-hash.\n\tcase si.PkScriptClass == ScriptHashTy && bip16 && !segwit:\n\t\t// The redeem script is the final data push of the signature script.\n\t\tredeemScript := finalOpcodeData(scriptVersion, sigScript)\n\t\treedeemClass := typeOfScript(scriptVersion, redeemScript)\n\t\trsInputs := expectedInputs(redeemScript, reedeemClass)\n\t\tif rsInputs == -1 {\n\t\t\tsi.ExpectedInputs = -1\n\t\t} else {\n\t\t\tsi.ExpectedInputs += rsInputs\n\t\t}\n\t\tsi.SigOps = countSigOpsV0(redeemScript, true)\n\n\t\t// All entries pushed to stack (or are OP_RESERVED and exec\n\t\t// will fail).\n\t\tsi.NumInputs = numInputs\n\n\t// If segwit is active, and this is a regular p2wkh output, then we'll\n\t// treat the script as a p2pkh output in essence.\n\tcase si.PkScriptClass == WitnessV0PubKeyHashTy && segwit:\n\n\t\tsi.SigOps = GetWitnessSigOpCount(sigScript, pkScript, witness)\n\t\tsi.NumInputs = len(witness)\n\n\t// We'll attempt to detect the nested p2sh case so we can accurately\n\t// count the signature operations involved.\n\tcase si.PkScriptClass == ScriptHashTy &&\n\t\tIsWitnessProgram(sigScript[1:]) && bip16 && segwit:\n\n\t\t// Extract the pushed witness program from the sigScript so we\n\t\t// can determine the number of expected inputs.\n\t\tredeemClass := typeOfScript(scriptVersion, sigScript[1:])\n\t\tshInputs := expectedInputs(sigScript[1:], redeemClass)\n\t\tif shInputs == -1 {\n\t\t\tsi.ExpectedInputs = -1\n\t\t} else {\n\t\t\tsi.ExpectedInputs += shInputs\n\t\t}\n\n\t\tsi.SigOps = GetWitnessSigOpCount(sigScript, pkScript, witness)\n\n\t\tsi.NumInputs = len(witness)\n\t\tsi.NumInputs += numInputs\n\n\t// If segwit is active, and this is a p2wsh output, then we'll need to\n\t// examine the witness script to generate accurate script info.\n\tcase si.PkScriptClass == WitnessV0ScriptHashTy && segwit:\n\t\twitnessScript := witness[len(witness)-1]\n\t\tredeemClass := typeOfScript(scriptVersion, witnessScript)\n\t\tshInputs := expectedInputs(witnessScript, redeemClass)\n\t\tif shInputs == -1 {\n\t\t\tsi.ExpectedInputs = -1\n\t\t} else {\n\t\t\tsi.ExpectedInputs += shInputs\n\t\t}\n\n\t\tsi.SigOps = GetWitnessSigOpCount(sigScript, pkScript, witness)\n\t\tsi.NumInputs = len(witness)\n\n\tdefault:\n\t\tsi.SigOps = countSigOpsV0(pkScript, true)\n\n\t\t// All entries pushed to stack (or are OP_RESERVED and exec\n\t\t// will fail).\n\t\tsi.NumInputs = numInputs\n\t}\n\n\treturn si, nil\n}\n\n// CalcMultiSigStats returns the number of public keys and signatures from\n// a multi-signature transaction script.  The passed script MUST already be\n// known to be a multi-signature script.\n//\n// NOTE: This function is only valid for version 0 scripts.  Since the function\n// does not accept a script version, the results are undefined for other script\n// versions.\nfunc CalcMultiSigStats(script []byte) (int, int, error) {\n\t// The public keys are not needed here, so pass false to avoid the extra\n\t// allocation.\n\tconst scriptVersion = 0\n\tdetails := extractMultisigScriptDetails(scriptVersion, script, false)\n\tif !details.valid {\n\t\tstr := fmt.Sprintf(\"script %x is not a multisig script\", script)\n\t\treturn 0, 0, scriptError(ErrNotMultisigScript, str)\n\t}\n\n\treturn details.numPubKeys, details.requiredSigs, nil\n}\n\n// payToPubKeyHashScript creates a new script to pay a transaction\n// output to a 20-byte pubkey hash. It is expected that the input is a valid\n// hash.\nfunc payToPubKeyHashScript(pubKeyHash []byte) ([]byte, error) {\n\treturn NewScriptBuilder().AddOp(OP_DUP).AddOp(OP_HASH160).\n\t\tAddData(pubKeyHash).AddOp(OP_EQUALVERIFY).AddOp(OP_CHECKSIG).\n\t\tScript()\n}\n\n// payToWitnessPubKeyHashScript creates a new script to pay to a version 0\n// pubkey hash witness program. The passed hash is expected to be valid.\nfunc payToWitnessPubKeyHashScript(pubKeyHash []byte) ([]byte, error) {\n\treturn NewScriptBuilder().AddOp(OP_0).AddData(pubKeyHash).Script()\n}\n\n// payToScriptHashScript creates a new script to pay a transaction output to a\n// script hash. It is expected that the input is a valid hash.\nfunc payToScriptHashScript(scriptHash []byte) ([]byte, error) {\n\treturn NewScriptBuilder().AddOp(OP_HASH160).AddData(scriptHash).\n\t\tAddOp(OP_EQUAL).Script()\n}\n\n// payToWitnessPubKeyHashScript creates a new script to pay to a version 0\n// script hash witness program. The passed hash is expected to be valid.\nfunc payToWitnessScriptHashScript(scriptHash []byte) ([]byte, error) {\n\treturn NewScriptBuilder().AddOp(OP_0).AddData(scriptHash).Script()\n}\n\n// payToWitnessTaprootScript creates a new script to pay to a version 1\n// (taproot) witness program. The passed hash is expected to be valid.\nfunc payToWitnessTaprootScript(rawKey []byte) ([]byte, error) {\n\treturn NewScriptBuilder().AddOp(OP_1).AddData(rawKey).Script()\n}\n\n// payToPubkeyScript creates a new script to pay a transaction output to a\n// public key. It is expected that the input is a valid pubkey.\nfunc payToPubKeyScript(serializedPubKey []byte) ([]byte, error) {\n\treturn NewScriptBuilder().AddData(serializedPubKey).\n\t\tAddOp(OP_CHECKSIG).Script()\n}\n\n// PayToAddrScript creates a new script to pay a transaction output to a the\n// specified address.\nfunc PayToAddrScript(addr btcutil.Address) ([]byte, error) {\n\tconst nilAddrErrStr = \"unable to generate payment script for nil address\"\n\n\tswitch addr := addr.(type) {\n\tcase *btcutil.AddressPubKeyHash:\n\t\tif addr == nil {\n\t\t\treturn nil, scriptError(ErrUnsupportedAddress,\n\t\t\t\tnilAddrErrStr)\n\t\t}\n\t\treturn payToPubKeyHashScript(addr.ScriptAddress())\n\n\tcase *btcutil.AddressScriptHash:\n\t\tif addr == nil {\n\t\t\treturn nil, scriptError(ErrUnsupportedAddress,\n\t\t\t\tnilAddrErrStr)\n\t\t}\n\t\treturn payToScriptHashScript(addr.ScriptAddress())\n\n\tcase *btcutil.AddressPubKey:\n\t\tif addr == nil {\n\t\t\treturn nil, scriptError(ErrUnsupportedAddress,\n\t\t\t\tnilAddrErrStr)\n\t\t}\n\t\treturn payToPubKeyScript(addr.ScriptAddress())\n\n\tcase *btcutil.AddressWitnessPubKeyHash:\n\t\tif addr == nil {\n\t\t\treturn nil, scriptError(ErrUnsupportedAddress,\n\t\t\t\tnilAddrErrStr)\n\t\t}\n\t\treturn payToWitnessPubKeyHashScript(addr.ScriptAddress())\n\tcase *btcutil.AddressWitnessScriptHash:\n\t\tif addr == nil {\n\t\t\treturn nil, scriptError(ErrUnsupportedAddress,\n\t\t\t\tnilAddrErrStr)\n\t\t}\n\t\treturn payToWitnessScriptHashScript(addr.ScriptAddress())\n\tcase *btcutil.AddressTaproot:\n\t\tif addr == nil {\n\t\t\treturn nil, scriptError(ErrUnsupportedAddress,\n\t\t\t\tnilAddrErrStr)\n\t\t}\n\t\treturn payToWitnessTaprootScript(addr.ScriptAddress())\n\t}\n\n\tstr := fmt.Sprintf(\"unable to generate payment script for unsupported \"+\n\t\t\"address type %T\", addr)\n\treturn nil, scriptError(ErrUnsupportedAddress, str)\n}\n\n// NullDataScript creates a provably-prunable script containing OP_RETURN\n// followed by the passed data.  An Error with the error code ErrTooMuchNullData\n// will be returned if the length of the passed data exceeds MaxDataCarrierSize.\nfunc NullDataScript(data []byte) ([]byte, error) {\n\tif len(data) > MaxDataCarrierSize {\n\t\tstr := fmt.Sprintf(\"data size %d is larger than max \"+\n\t\t\t\"allowed size %d\", len(data), MaxDataCarrierSize)\n\t\treturn nil, scriptError(ErrTooMuchNullData, str)\n\t}\n\n\treturn NewScriptBuilder().AddOp(OP_RETURN).AddData(data).Script()\n}\n\n// MultiSigScript returns a valid script for a multisignature redemption where\n// nrequired of the keys in pubkeys are required to have signed the transaction\n// for success.  An Error with the error code ErrTooManyRequiredSigs will be\n// returned if nrequired is larger than the number of keys provided.\nfunc MultiSigScript(pubkeys []*btcutil.AddressPubKey, nrequired int) ([]byte, error) {\n\tif len(pubkeys) < nrequired {\n\t\tstr := fmt.Sprintf(\"unable to generate multisig script with \"+\n\t\t\t\"%d required signatures when there are only %d public \"+\n\t\t\t\"keys available\", nrequired, len(pubkeys))\n\t\treturn nil, scriptError(ErrTooManyRequiredSigs, str)\n\t}\n\n\tbuilder := NewScriptBuilder().AddInt64(int64(nrequired))\n\tfor _, key := range pubkeys {\n\t\tbuilder.AddData(key.ScriptAddress())\n\t}\n\tbuilder.AddInt64(int64(len(pubkeys)))\n\tbuilder.AddOp(OP_CHECKMULTISIG)\n\n\treturn builder.Script()\n}\n\n// PushedData returns an array of byte slices containing any pushed data found\n// in the passed script.  This includes OP_0, but not OP_1 - OP_16.\nfunc PushedData(script []byte) ([][]byte, error) {\n\tconst scriptVersion = 0\n\n\tvar data [][]byte\n\ttokenizer := MakeScriptTokenizer(scriptVersion, script)\n\tfor tokenizer.Next() {\n\t\tif tokenizer.Data() != nil {\n\t\t\tdata = append(data, tokenizer.Data())\n\t\t} else if tokenizer.Opcode() == OP_0 {\n\t\t\tdata = append(data, nil)\n\t\t}\n\t}\n\tif err := tokenizer.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn data, nil\n}\n\n// pubKeyHashToAddrs is a convenience function to attempt to convert the\n// passed hash to a pay-to-pubkey-hash address housed within an address\n// slice.  It is used to consolidate common code.\nfunc pubKeyHashToAddrs(hash []byte, params *chaincfg.Params) []btcutil.Address {\n\t// Skip the pubkey hash if it's invalid for some reason.\n\tvar addrs []btcutil.Address\n\taddr, err := btcutil.NewAddressPubKeyHash(hash, params)\n\tif err == nil {\n\t\taddrs = append(addrs, addr)\n\t}\n\treturn addrs\n}\n\n// scriptHashToAddrs is a convenience function to attempt to convert the passed\n// hash to a pay-to-script-hash address housed within an address slice.  It is\n// used to consolidate common code.\nfunc scriptHashToAddrs(hash []byte, params *chaincfg.Params) []btcutil.Address {\n\t// Skip the hash if it's invalid for some reason.\n\tvar addrs []btcutil.Address\n\taddr, err := btcutil.NewAddressScriptHashFromHash(hash, params)\n\tif err == nil {\n\t\taddrs = append(addrs, addr)\n\t}\n\treturn addrs\n}\n\n// ExtractPkScriptAddrs returns the type of script, addresses and required\n// signatures associated with the passed PkScript.  Note that it only works for\n// 'standard' transaction script types.  Any data such as public keys which are\n// invalid are omitted from the results.\nfunc ExtractPkScriptAddrs(pkScript []byte,\n\tchainParams *chaincfg.Params) (ScriptClass, []btcutil.Address, int, error) {\n\n\t// Check for pay-to-pubkey-hash script.\n\tif hash := extractPubKeyHash(pkScript); hash != nil {\n\t\treturn PubKeyHashTy, pubKeyHashToAddrs(hash, chainParams), 1, nil\n\t}\n\n\t// Check for pay-to-script-hash.\n\tif hash := extractScriptHash(pkScript); hash != nil {\n\t\treturn ScriptHashTy, scriptHashToAddrs(hash, chainParams), 1, nil\n\t}\n\n\t// Check for pay-to-pubkey script.\n\tif data := extractPubKey(pkScript); data != nil {\n\t\tvar addrs []btcutil.Address\n\t\taddr, err := btcutil.NewAddressPubKey(data, chainParams)\n\t\tif err == nil {\n\t\t\taddrs = append(addrs, addr)\n\t\t}\n\t\treturn PubKeyTy, addrs, 1, nil\n\t}\n\n\t// Check for multi-signature script.\n\tconst scriptVersion = 0\n\tdetails := extractMultisigScriptDetails(scriptVersion, pkScript, true)\n\tif details.valid {\n\t\t// Convert the public keys while skipping any that are invalid.\n\t\taddrs := make([]btcutil.Address, 0, len(details.pubKeys))\n\t\tfor _, pubkey := range details.pubKeys {\n\t\t\taddr, err := btcutil.NewAddressPubKey(pubkey, chainParams)\n\t\t\tif err == nil {\n\t\t\t\taddrs = append(addrs, addr)\n\t\t\t}\n\t\t}\n\t\treturn MultiSigTy, addrs, details.requiredSigs, nil\n\t}\n\n\t// Check for null data script.\n\tif isNullDataScript(scriptVersion, pkScript) {\n\t\t// Null data transactions have no addresses or required signatures.\n\t\treturn NullDataTy, nil, 0, nil\n\t}\n\n\tif hash := extractWitnessPubKeyHash(pkScript); hash != nil {\n\t\tvar addrs []btcutil.Address\n\t\taddr, err := btcutil.NewAddressWitnessPubKeyHash(hash, chainParams)\n\t\tif err == nil {\n\t\t\taddrs = append(addrs, addr)\n\t\t}\n\t\treturn WitnessV0PubKeyHashTy, addrs, 1, nil\n\t}\n\n\tif hash := extractWitnessV0ScriptHash(pkScript); hash != nil {\n\t\tvar addrs []btcutil.Address\n\t\taddr, err := btcutil.NewAddressWitnessScriptHash(hash, chainParams)\n\t\tif err == nil {\n\t\t\taddrs = append(addrs, addr)\n\t\t}\n\t\treturn WitnessV0ScriptHashTy, addrs, 1, nil\n\t}\n\n\tif rawKey := extractWitnessV1KeyBytes(pkScript); rawKey != nil {\n\t\tvar addrs []btcutil.Address\n\t\taddr, err := btcutil.NewAddressTaproot(rawKey, chainParams)\n\t\tif err == nil {\n\t\t\taddrs = append(addrs, addr)\n\t\t}\n\t\treturn WitnessV1TaprootTy, addrs, 1, nil\n\t}\n\n\t// If none of the above passed, then the address must be non-standard.\n\treturn NonStandardTy, nil, 0, nil\n}\n\n// AtomicSwapDataPushes houses the data pushes found in atomic swap contracts.\ntype AtomicSwapDataPushes struct {\n\tRecipientHash160 [20]byte\n\tRefundHash160    [20]byte\n\tSecretHash       [32]byte\n\tSecretSize       int64\n\tLockTime         int64\n}\n\n// ExtractAtomicSwapDataPushes returns the data pushes from an atomic swap\n// contract.  If the script is not an atomic swap contract,\n// ExtractAtomicSwapDataPushes returns (nil, nil).  Non-nil errors are returned\n// for unparsable scripts.\n//\n// NOTE: Atomic swaps are not considered standard script types by the dcrd\n// mempool policy and should be used with P2SH.  The atomic swap format is also\n// expected to change to use a more secure hash function in the future.\n//\n// This function is only defined in the txscript package due to API limitations\n// which prevent callers using txscript to parse nonstandard scripts.\n//\n// DEPRECATED.  This will be removed in the next major version bump.  The error\n// should also likely be removed if the code is reimplemented by any callers\n// since any errors result in a nil result anyway.\nfunc ExtractAtomicSwapDataPushes(version uint16, pkScript []byte) (*AtomicSwapDataPushes, error) {\n\t// An atomic swap is of the form:\n\t//  IF\n\t//   SIZE <secret size> EQUALVERIFY SHA256 <32-byte secret> EQUALVERIFY DUP\n\t//   HASH160 <20-byte recipient hash>\n\t//  ELSE\n\t//   <locktime> CHECKLOCKTIMEVERIFY DROP DUP HASH160 <20-byte refund hash>\n\t//  ENDIF\n\t//  EQUALVERIFY CHECKSIG\n\ttype templateMatch struct {\n\t\texpectCanonicalInt bool\n\t\tmaxIntBytes        int\n\t\topcode             byte\n\t\textractedInt       int64\n\t\textractedData      []byte\n\t}\n\tvar template = [20]templateMatch{\n\t\t{opcode: OP_IF},\n\t\t{opcode: OP_SIZE},\n\t\t{expectCanonicalInt: true, maxIntBytes: maxScriptNumLen},\n\t\t{opcode: OP_EQUALVERIFY},\n\t\t{opcode: OP_SHA256},\n\t\t{opcode: OP_DATA_32},\n\t\t{opcode: OP_EQUALVERIFY},\n\t\t{opcode: OP_DUP},\n\t\t{opcode: OP_HASH160},\n\t\t{opcode: OP_DATA_20},\n\t\t{opcode: OP_ELSE},\n\t\t{expectCanonicalInt: true, maxIntBytes: cltvMaxScriptNumLen},\n\t\t{opcode: OP_CHECKLOCKTIMEVERIFY},\n\t\t{opcode: OP_DROP},\n\t\t{opcode: OP_DUP},\n\t\t{opcode: OP_HASH160},\n\t\t{opcode: OP_DATA_20},\n\t\t{opcode: OP_ENDIF},\n\t\t{opcode: OP_EQUALVERIFY},\n\t\t{opcode: OP_CHECKSIG},\n\t}\n\n\tvar templateOffset int\n\ttokenizer := MakeScriptTokenizer(version, pkScript)\n\tfor tokenizer.Next() {\n\t\t// Not an atomic swap script if it has more opcodes than expected in the\n\t\t// template.\n\t\tif templateOffset >= len(template) {\n\t\t\treturn nil, nil\n\t\t}\n\n\t\top := tokenizer.Opcode()\n\t\tdata := tokenizer.Data()\n\t\ttplEntry := &template[templateOffset]\n\t\tif tplEntry.expectCanonicalInt {\n\t\t\tswitch {\n\t\t\tcase data != nil:\n\t\t\t\tval, err := MakeScriptNum(data, true, tplEntry.maxIntBytes)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\ttplEntry.extractedInt = int64(val)\n\n\t\t\tcase IsSmallInt(op):\n\t\t\t\ttplEntry.extractedInt = int64(AsSmallInt(op))\n\n\t\t\t// Not an atomic swap script if the opcode does not push an int.\n\t\t\tdefault:\n\t\t\t\treturn nil, nil\n\t\t\t}\n\t\t} else {\n\t\t\tif op != tplEntry.opcode {\n\t\t\t\treturn nil, nil\n\t\t\t}\n\n\t\t\ttplEntry.extractedData = data\n\t\t}\n\n\t\ttemplateOffset++\n\t}\n\tif err := tokenizer.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\tif !tokenizer.Done() || templateOffset != len(template) {\n\t\treturn nil, nil\n\t}\n\n\t// At this point, the script appears to be an atomic swap, so populate and\n\t// return the extacted data.\n\tpushes := AtomicSwapDataPushes{\n\t\tSecretSize: template[2].extractedInt,\n\t\tLockTime:   template[11].extractedInt,\n\t}\n\tcopy(pushes.SecretHash[:], template[5].extractedData)\n\tcopy(pushes.RecipientHash160[:], template[9].extractedData)\n\tcopy(pushes.RefundHash160[:], template[16].extractedData)\n\treturn &pushes, nil\n}\n"
  },
  {
    "path": "txscript/standard_test.go",
    "content": "// Copyright (c) 2013-2020 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// mustParseShortForm parses the passed short form script and returns the\n// resulting bytes.  It panics if an error occurs.  This is only used in the\n// tests as a helper since the only way it can fail is if there is an error in\n// the test source code.\nfunc mustParseShortForm(script string) []byte {\n\ts, err := parseShortForm(script)\n\tif err != nil {\n\t\tpanic(\"invalid short form script in test source: err \" +\n\t\t\terr.Error() + \", script: \" + script)\n\t}\n\n\treturn s\n}\n\n// newAddressPubKey returns a new btcutil.AddressPubKey from the provided\n// serialized public key.  It panics if an error occurs.  This is only used in\n// the tests as a helper since the only way it can fail is if there is an error\n// in the test source code.\nfunc newAddressPubKey(serializedPubKey []byte) btcutil.Address {\n\taddr, err := btcutil.NewAddressPubKey(serializedPubKey,\n\t\t&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tpanic(\"invalid public key in test source\")\n\t}\n\n\treturn addr\n}\n\n// newAddressPubKeyHash returns a new btcutil.AddressPubKeyHash from the\n// provided hash.  It panics if an error occurs.  This is only used in the tests\n// as a helper since the only way it can fail is if there is an error in the\n// test source code.\nfunc newAddressPubKeyHash(pkHash []byte) btcutil.Address {\n\taddr, err := btcutil.NewAddressPubKeyHash(pkHash, &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tpanic(\"invalid public key hash in test source\")\n\t}\n\n\treturn addr\n}\n\n// newAddressScriptHash returns a new btcutil.AddressScriptHash from the\n// provided hash.  It panics if an error occurs.  This is only used in the tests\n// as a helper since the only way it can fail is if there is an error in the\n// test source code.\nfunc newAddressScriptHash(scriptHash []byte) btcutil.Address {\n\taddr, err := btcutil.NewAddressScriptHashFromHash(scriptHash,\n\t\t&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tpanic(\"invalid script hash in test source\")\n\t}\n\n\treturn addr\n}\n\n// newAddressTaproot returns a new btcutil.AddressTaproot from the\n// provided hash.  It panics if an error occurs.  This is only used in the tests\n// as a helper since the only way it can fail is if there is an error in the\n// test source code.\nfunc newAddressTaproot(scriptHash []byte) btcutil.Address {\n\taddr, err := btcutil.NewAddressTaproot(scriptHash,\n\t\t&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tpanic(\"invalid script hash in test source\")\n\t}\n\n\treturn addr\n}\n\n// TestExtractPkScriptAddrs ensures that extracting the type, addresses, and\n// number of required signatures from PkScripts works as intended.\nfunc TestExtractPkScriptAddrs(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname    string\n\t\tscript  []byte\n\t\taddrs   []btcutil.Address\n\t\treqSigs int\n\t\tclass   ScriptClass\n\t}{\n\t\t{\n\t\t\tname: \"standard p2pk with compressed pubkey (0x02)\",\n\t\t\tscript: hexToBytes(\"2102192d74d0cb94344c9569c2e779015\" +\n\t\t\t\t\"73d8d7903c3ebec3a957724895dca52c6b4ac\"),\n\t\t\taddrs: []btcutil.Address{\n\t\t\t\tnewAddressPubKey(hexToBytes(\"02192d74d0cb9434\" +\n\t\t\t\t\t\"4c9569c2e77901573d8d7903c3ebec3a9577\" +\n\t\t\t\t\t\"24895dca52c6b4\")),\n\t\t\t},\n\t\t\treqSigs: 1,\n\t\t\tclass:   PubKeyTy,\n\t\t},\n\t\t{\n\t\t\tname: \"standard p2pk with uncompressed pubkey (0x04)\",\n\t\t\tscript: hexToBytes(\"410411db93e1dcdb8a016b49840f8c53b\" +\n\t\t\t\t\"c1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddf\" +\n\t\t\t\t\"b84ccf9744464f82e160bfa9b8b64f9d4c03f999b864\" +\n\t\t\t\t\"3f656b412a3ac\"),\n\t\t\taddrs: []btcutil.Address{\n\t\t\t\tnewAddressPubKey(hexToBytes(\"0411db93e1dcdb8a\" +\n\t\t\t\t\t\"016b49840f8c53bc1eb68a382e97b1482eca\" +\n\t\t\t\t\t\"d7b148a6909a5cb2e0eaddfb84ccf9744464\" +\n\t\t\t\t\t\"f82e160bfa9b8b64f9d4c03f999b8643f656\" +\n\t\t\t\t\t\"b412a3\")),\n\t\t\t},\n\t\t\treqSigs: 1,\n\t\t\tclass:   PubKeyTy,\n\t\t},\n\t\t{\n\t\t\tname: \"standard p2pk with hybrid pubkey (0x06)\",\n\t\t\tscript: hexToBytes(\"4106192d74d0cb94344c9569c2e779015\" +\n\t\t\t\t\"73d8d7903c3ebec3a957724895dca52c6b40d4526483\" +\n\t\t\t\t\"8c0bd96852662ce6a847b197376830160c6d2eb5e6a4\" +\n\t\t\t\t\"c44d33f453eac\"),\n\t\t\taddrs: []btcutil.Address{\n\t\t\t\tnewAddressPubKey(hexToBytes(\"06192d74d0cb9434\" +\n\t\t\t\t\t\"4c9569c2e77901573d8d7903c3ebec3a9577\" +\n\t\t\t\t\t\"24895dca52c6b40d45264838c0bd96852662\" +\n\t\t\t\t\t\"ce6a847b197376830160c6d2eb5e6a4c44d3\" +\n\t\t\t\t\t\"3f453e\")),\n\t\t\t},\n\t\t\treqSigs: 1,\n\t\t\tclass:   PubKeyTy,\n\t\t},\n\t\t{\n\t\t\tname: \"standard p2pk with compressed pubkey (0x03)\",\n\t\t\tscript: hexToBytes(\"2103b0bd634234abbb1ba1e986e884185\" +\n\t\t\t\t\"c61cf43e001f9137f23c2c409273eb16e65ac\"),\n\t\t\taddrs: []btcutil.Address{\n\t\t\t\tnewAddressPubKey(hexToBytes(\"03b0bd634234abbb\" +\n\t\t\t\t\t\"1ba1e986e884185c61cf43e001f9137f23c2\" +\n\t\t\t\t\t\"c409273eb16e65\")),\n\t\t\t},\n\t\t\treqSigs: 1,\n\t\t\tclass:   PubKeyTy,\n\t\t},\n\t\t{\n\t\t\tname: \"2nd standard p2pk with uncompressed pubkey (0x04)\",\n\t\t\tscript: hexToBytes(\"4104b0bd634234abbb1ba1e986e884185\" +\n\t\t\t\t\"c61cf43e001f9137f23c2c409273eb16e6537a576782\" +\n\t\t\t\t\"eba668a7ef8bd3b3cfb1edb7117ab65129b8a2e681f3\" +\n\t\t\t\t\"c1e0908ef7bac\"),\n\t\t\taddrs: []btcutil.Address{\n\t\t\t\tnewAddressPubKey(hexToBytes(\"04b0bd634234abbb\" +\n\t\t\t\t\t\"1ba1e986e884185c61cf43e001f9137f23c2\" +\n\t\t\t\t\t\"c409273eb16e6537a576782eba668a7ef8bd\" +\n\t\t\t\t\t\"3b3cfb1edb7117ab65129b8a2e681f3c1e09\" +\n\t\t\t\t\t\"08ef7b\")),\n\t\t\t},\n\t\t\treqSigs: 1,\n\t\t\tclass:   PubKeyTy,\n\t\t},\n\t\t{\n\t\t\tname: \"standard p2pk with hybrid pubkey (0x07)\",\n\t\t\tscript: hexToBytes(\"4107b0bd634234abbb1ba1e986e884185\" +\n\t\t\t\t\"c61cf43e001f9137f23c2c409273eb16e6537a576782\" +\n\t\t\t\t\"eba668a7ef8bd3b3cfb1edb7117ab65129b8a2e681f3\" +\n\t\t\t\t\"c1e0908ef7bac\"),\n\t\t\taddrs: []btcutil.Address{\n\t\t\t\tnewAddressPubKey(hexToBytes(\"07b0bd634234abbb\" +\n\t\t\t\t\t\"1ba1e986e884185c61cf43e001f9137f23c2\" +\n\t\t\t\t\t\"c409273eb16e6537a576782eba668a7ef8bd\" +\n\t\t\t\t\t\"3b3cfb1edb7117ab65129b8a2e681f3c1e09\" +\n\t\t\t\t\t\"08ef7b\")),\n\t\t\t},\n\t\t\treqSigs: 1,\n\t\t\tclass:   PubKeyTy,\n\t\t},\n\t\t{\n\t\t\tname: \"standard p2pkh\",\n\t\t\tscript: hexToBytes(\"76a914ad06dd6ddee55cbca9a9e3713bd\" +\n\t\t\t\t\"7587509a3056488ac\"),\n\t\t\taddrs: []btcutil.Address{\n\t\t\t\tnewAddressPubKeyHash(hexToBytes(\"ad06dd6ddee5\" +\n\t\t\t\t\t\"5cbca9a9e3713bd7587509a30564\")),\n\t\t\t},\n\t\t\treqSigs: 1,\n\t\t\tclass:   PubKeyHashTy,\n\t\t},\n\t\t{\n\t\t\tname: \"standard p2sh\",\n\t\t\tscript: hexToBytes(\"a91463bcc565f9e68ee0189dd5cc67f1b\" +\n\t\t\t\t\"0e5f02f45cb87\"),\n\t\t\taddrs: []btcutil.Address{\n\t\t\t\tnewAddressScriptHash(hexToBytes(\"63bcc565f9e6\" +\n\t\t\t\t\t\"8ee0189dd5cc67f1b0e5f02f45cb\")),\n\t\t\t},\n\t\t\treqSigs: 1,\n\t\t\tclass:   ScriptHashTy,\n\t\t},\n\t\t// from real tx 60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1, vout 0\n\t\t{\n\t\t\tname: \"standard 1 of 2 multisig\",\n\t\t\tscript: hexToBytes(\"514104cc71eb30d653c0c3163990c47b9\" +\n\t\t\t\t\"76f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a47\" +\n\t\t\t\t\"3e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d1\" +\n\t\t\t\t\"1fcdd0d348ac4410461cbdcc5409fb4b4d42b51d3338\" +\n\t\t\t\t\"1354d80e550078cb532a34bfa2fcfdeb7d76519aecc6\" +\n\t\t\t\t\"2770f5b0e4ef8551946d8a540911abe3e7854a26f39f\" +\n\t\t\t\t\"58b25c15342af52ae\"),\n\t\t\taddrs: []btcutil.Address{\n\t\t\t\tnewAddressPubKey(hexToBytes(\"04cc71eb30d653c0\" +\n\t\t\t\t\t\"c3163990c47b976f3fb3f37cccdcbedb169a\" +\n\t\t\t\t\t\"1dfef58bbfbfaff7d8a473e7e2e6d317b87b\" +\n\t\t\t\t\t\"afe8bde97e3cf8f065dec022b51d11fcdd0d\" +\n\t\t\t\t\t\"348ac4\")),\n\t\t\t\tnewAddressPubKey(hexToBytes(\"0461cbdcc5409fb4\" +\n\t\t\t\t\t\"b4d42b51d33381354d80e550078cb532a34b\" +\n\t\t\t\t\t\"fa2fcfdeb7d76519aecc62770f5b0e4ef855\" +\n\t\t\t\t\t\"1946d8a540911abe3e7854a26f39f58b25c1\" +\n\t\t\t\t\t\"5342af\")),\n\t\t\t},\n\t\t\treqSigs: 1,\n\t\t\tclass:   MultiSigTy,\n\t\t},\n\t\t// from real tx d646f82bd5fbdb94a36872ce460f97662b80c3050ad3209bef9d1e398ea277ab, vin 1\n\t\t{\n\t\t\tname: \"standard 2 of 3 multisig\",\n\t\t\tscript: hexToBytes(\"524104cb9c3c222c5f7a7d3b9bd152f36\" +\n\t\t\t\t\"3a0b6d54c9eb312c4d4f9af1e8551b6c421a6a4ab0e2\" +\n\t\t\t\t\"9105f24de20ff463c1c91fcf3bf662cdde4783d4799f\" +\n\t\t\t\t\"787cb7c08869b4104ccc588420deeebea22a7e900cc8\" +\n\t\t\t\t\"b68620d2212c374604e3487ca08f1ff3ae12bdc63951\" +\n\t\t\t\t\"4d0ec8612a2d3c519f084d9a00cbbe3b53d071e9b09e\" +\n\t\t\t\t\"71e610b036aa24104ab47ad1939edcb3db65f7fedea6\" +\n\t\t\t\t\"2bbf781c5410d3f22a7a3a56ffefb2238af8627363bd\" +\n\t\t\t\t\"f2ed97c1f89784a1aecdb43384f11d2acc64443c7fc2\" +\n\t\t\t\t\"99cef0400421a53ae\"),\n\t\t\taddrs: []btcutil.Address{\n\t\t\t\tnewAddressPubKey(hexToBytes(\"04cb9c3c222c5f7a\" +\n\t\t\t\t\t\"7d3b9bd152f363a0b6d54c9eb312c4d4f9af\" +\n\t\t\t\t\t\"1e8551b6c421a6a4ab0e29105f24de20ff46\" +\n\t\t\t\t\t\"3c1c91fcf3bf662cdde4783d4799f787cb7c\" +\n\t\t\t\t\t\"08869b\")),\n\t\t\t\tnewAddressPubKey(hexToBytes(\"04ccc588420deeeb\" +\n\t\t\t\t\t\"ea22a7e900cc8b68620d2212c374604e3487\" +\n\t\t\t\t\t\"ca08f1ff3ae12bdc639514d0ec8612a2d3c5\" +\n\t\t\t\t\t\"19f084d9a00cbbe3b53d071e9b09e71e610b\" +\n\t\t\t\t\t\"036aa2\")),\n\t\t\t\tnewAddressPubKey(hexToBytes(\"04ab47ad1939edcb\" +\n\t\t\t\t\t\"3db65f7fedea62bbf781c5410d3f22a7a3a5\" +\n\t\t\t\t\t\"6ffefb2238af8627363bdf2ed97c1f89784a\" +\n\t\t\t\t\t\"1aecdb43384f11d2acc64443c7fc299cef04\" +\n\t\t\t\t\t\"00421a\")),\n\t\t\t},\n\t\t\treqSigs: 2,\n\t\t\tclass:   MultiSigTy,\n\t\t},\n\n\t\t// The below are nonstandard script due to things such as\n\t\t// invalid pubkeys, failure to parse, and not being of a\n\t\t// standard form.\n\n\t\t{\n\t\t\tname: \"p2pk with uncompressed pk missing OP_CHECKSIG\",\n\t\t\tscript: hexToBytes(\"410411db93e1dcdb8a016b49840f8c53b\" +\n\t\t\t\t\"c1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddf\" +\n\t\t\t\t\"b84ccf9744464f82e160bfa9b8b64f9d4c03f999b864\" +\n\t\t\t\t\"3f656b412a3\"),\n\t\t\taddrs:   nil,\n\t\t\treqSigs: 0,\n\t\t\tclass:   NonStandardTy,\n\t\t},\n\t\t{\n\t\t\tname: \"valid signature from a sigscript - no addresses\",\n\t\t\tscript: hexToBytes(\"47304402204e45e16932b8af514961a1d\" +\n\t\t\t\t\"3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd41022\" +\n\t\t\t\t\"0181522ec8eca07de4860a4acdd12909d831cc56cbba\" +\n\t\t\t\t\"c4622082221a8768d1d0901\"),\n\t\t\taddrs:   nil,\n\t\t\treqSigs: 0,\n\t\t\tclass:   NonStandardTy,\n\t\t},\n\t\t// Note the technically the pubkey is the second item on the\n\t\t// stack, but since the address extraction intentionally only\n\t\t// works with standard PkScripts, this should not return any\n\t\t// addresses.\n\t\t{\n\t\t\tname: \"valid sigscript to reedeem p2pk - no addresses\",\n\t\t\tscript: hexToBytes(\"493046022100ddc69738bf2336318e4e0\" +\n\t\t\t\t\"41a5a77f305da87428ab1606f023260017854350ddc0\" +\n\t\t\t\t\"22100817af09d2eec36862d16009852b7e3a0f6dd765\" +\n\t\t\t\t\"98290b7834e1453660367e07a014104cd4240c198e12\" +\n\t\t\t\t\"523b6f9cb9f5bed06de1ba37e96a1bbd13745fcf9d11\" +\n\t\t\t\t\"c25b1dff9a519675d198804ba9962d3eca2d5937d58e\" +\n\t\t\t\t\"5a75a71042d40388a4d307f887d\"),\n\t\t\taddrs:   nil,\n\t\t\treqSigs: 0,\n\t\t\tclass:   NonStandardTy,\n\t\t},\n\t\t// from real tx 691dd277dc0e90a462a3d652a1171686de49cf19067cd33c7df0392833fb986a, vout 0\n\t\t// invalid public keys\n\t\t{\n\t\t\tname: \"1 of 3 multisig with invalid pubkeys\",\n\t\t\tscript: hexToBytes(\"51411c2200007353455857696b696c656\" +\n\t\t\t\t\"16b73204361626c6567617465204261636b75700a0a6\" +\n\t\t\t\t\"361626c65676174652d3230313031323034313831312\" +\n\t\t\t\t\"e377a0a0a446f41776e6c6f61642074686520666f6c6\" +\n\t\t\t\t\"c6f77696e67207472616e73616374696f6e732077697\" +\n\t\t\t\t\"468205361746f736869204e616b616d6f746f2773206\" +\n\t\t\t\t\"46f776e6c6f61416420746f6f6c2077686963680a636\" +\n\t\t\t\t\"16e20626520666f756e6420696e207472616e7361637\" +\n\t\t\t\t\"4696f6e2036633533636439383731313965663739376\" +\n\t\t\t\t\"435616463636453ae\"),\n\t\t\taddrs:   []btcutil.Address{},\n\t\t\treqSigs: 1,\n\t\t\tclass:   MultiSigTy,\n\t\t},\n\t\t{\n\t\t\tname: \"v1 p2tr witness-script-hash\",\n\t\t\tscript: hexToBytes(\"51201a82f7457a9ba6ab1074e9f50\" +\n\t\t\t\t\"053eefc637f8b046e389b636766bdc7d1f676f8\"),\n\t\t\taddrs: []btcutil.Address{newAddressTaproot(\n\t\t\t\thexToBytes(\"1a82f7457a9ba6ab1074e9f50053eefc6\" +\n\t\t\t\t\t\"37f8b046e389b636766bdc7d1f676f8\"))},\n\t\t\treqSigs: 1,\n\t\t\tclass:   WitnessV1TaprootTy,\n\t\t},\n\t\t{\n\t\t\tname: \"1 of 3 multisig with invalid pubkeys 2\",\n\t\t\tscript: hexToBytes(\"514134633365633235396337346461636\" +\n\t\t\t\t\"536666430383862343463656638630a6336366263313\" +\n\t\t\t\t\"93936633862393461333831316233363536313866653\" +\n\t\t\t\t\"16539623162354136636163636539393361333938386\" +\n\t\t\t\t\"134363966636336643664616266640a3236363363666\" +\n\t\t\t\t\"13963663463303363363039633539336333653931666\" +\n\t\t\t\t\"56465373032392131323364643432643235363339643\" +\n\t\t\t\t\"338613663663530616234636434340a00000053ae\"),\n\t\t\taddrs:   []btcutil.Address{},\n\t\t\treqSigs: 1,\n\t\t\tclass:   MultiSigTy,\n\t\t},\n\t\t{\n\t\t\tname:    \"empty script\",\n\t\t\tscript:  []byte{},\n\t\t\taddrs:   nil,\n\t\t\treqSigs: 0,\n\t\t\tclass:   NonStandardTy,\n\t\t},\n\t\t{\n\t\t\tname:    \"script that does not parse\",\n\t\t\tscript:  []byte{OP_DATA_45},\n\t\t\taddrs:   nil,\n\t\t\treqSigs: 0,\n\t\t\tclass:   NonStandardTy,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests.\", len(tests))\n\tfor i, test := range tests {\n\t\tclass, addrs, reqSigs, err := ExtractPkScriptAddrs(\n\t\t\ttest.script, &chaincfg.MainNetParams)\n\t\tif err != nil {\n\t\t}\n\n\t\tif !reflect.DeepEqual(addrs, test.addrs) {\n\t\t\tt.Errorf(\"ExtractPkScriptAddrs #%d (%s) unexpected \"+\n\t\t\t\t\"addresses\\ngot  %v\\nwant %v\", i, test.name,\n\t\t\t\taddrs, test.addrs)\n\t\t\tcontinue\n\t\t}\n\n\t\tif reqSigs != test.reqSigs {\n\t\t\tt.Errorf(\"ExtractPkScriptAddrs #%d (%s) unexpected \"+\n\t\t\t\t\"number of required signatures - got %d, \"+\n\t\t\t\t\"want %d\", i, test.name, reqSigs, test.reqSigs)\n\t\t\tcontinue\n\t\t}\n\n\t\tif class != test.class {\n\t\t\tt.Errorf(\"ExtractPkScriptAddrs #%d (%s) unexpected \"+\n\t\t\t\t\"script type - got %s, want %s\", i, test.name,\n\t\t\t\tclass, test.class)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestCalcScriptInfo ensures the CalcScriptInfo provides the expected results\n// for various valid and invalid script pairs.\nfunc TestCalcScriptInfo(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname      string\n\t\tsigScript string\n\t\tpkScript  string\n\t\twitness   []string\n\n\t\tbip16  bool\n\t\tsegwit bool\n\n\t\tscriptInfo    ScriptInfo\n\t\tscriptInfoErr error\n\t}{\n\t\t{\n\t\t\t// Invented scripts, the hashes do not match\n\t\t\t// Truncated version of test below:\n\t\t\tname: \"pkscript doesn't parse\",\n\t\t\tsigScript: \"1 81 DATA_8 2DUP EQUAL NOT VERIFY ABS \" +\n\t\t\t\t\"SWAP ABS EQUAL\",\n\t\t\tpkScript: \"HASH160 DATA_20 0xfe441065b6532231de2fac56\" +\n\t\t\t\t\"3152205ec4f59c\",\n\t\t\tbip16:         true,\n\t\t\tscriptInfoErr: scriptError(ErrMalformedPush, \"\"),\n\t\t},\n\t\t{\n\t\t\tname: \"sigScript doesn't parse\",\n\t\t\t// Truncated version of p2sh script below.\n\t\t\tsigScript: \"1 81 DATA_8 2DUP EQUAL NOT VERIFY ABS \" +\n\t\t\t\t\"SWAP ABS\",\n\t\t\tpkScript: \"HASH160 DATA_20 0xfe441065b6532231de2fac56\" +\n\t\t\t\t\"3152205ec4f59c74 EQUAL\",\n\t\t\tbip16:         true,\n\t\t\tscriptInfoErr: scriptError(ErrMalformedPush, \"\"),\n\t\t},\n\t\t{\n\t\t\t// Invented scripts, the hashes do not match\n\t\t\tname: \"p2sh standard script\",\n\t\t\tsigScript: \"1 81 DATA_25 DUP HASH160 DATA_20 0x010203\" +\n\t\t\t\t\"0405060708090a0b0c0d0e0f1011121314 EQUALVERIFY \" +\n\t\t\t\t\"CHECKSIG\",\n\t\t\tpkScript: \"HASH160 DATA_20 0xfe441065b6532231de2fac56\" +\n\t\t\t\t\"3152205ec4f59c74 EQUAL\",\n\t\t\tbip16: true,\n\t\t\tscriptInfo: ScriptInfo{\n\t\t\t\tPkScriptClass:  ScriptHashTy,\n\t\t\t\tNumInputs:      3,\n\t\t\t\tExpectedInputs: 3, // nonstandard p2sh.\n\t\t\t\tSigOps:         1,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// from 567a53d1ce19ce3d07711885168484439965501536d0d0294c5d46d46c10e53b\n\t\t\t// from the blockchain.\n\t\t\tname: \"p2sh nonstandard script\",\n\t\t\tsigScript: \"1 81 DATA_8 2DUP EQUAL NOT VERIFY ABS \" +\n\t\t\t\t\"SWAP ABS EQUAL\",\n\t\t\tpkScript: \"HASH160 DATA_20 0xfe441065b6532231de2fac56\" +\n\t\t\t\t\"3152205ec4f59c74 EQUAL\",\n\t\t\tbip16: true,\n\t\t\tscriptInfo: ScriptInfo{\n\t\t\t\tPkScriptClass:  ScriptHashTy,\n\t\t\t\tNumInputs:      3,\n\t\t\t\tExpectedInputs: -1, // nonstandard p2sh.\n\t\t\t\tSigOps:         0,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Script is invented, numbers all fake.\n\t\t\tname: \"multisig script\",\n\t\t\t// Extra 0 arg on the end for OP_CHECKMULTISIG bug.\n\t\t\tsigScript: \"1 1 1 0\",\n\t\t\tpkScript: \"3 \" +\n\t\t\t\t\"DATA_33 0x0102030405060708090a0b0c0d0e0f1011\" +\n\t\t\t\t\"12131415161718191a1b1c1d1e1f2021 DATA_33 \" +\n\t\t\t\t\"0x0102030405060708090a0b0c0d0e0f101112131415\" +\n\t\t\t\t\"161718191a1b1c1d1e1f2021 DATA_33 0x010203040\" +\n\t\t\t\t\"5060708090a0b0c0d0e0f101112131415161718191a1\" +\n\t\t\t\t\"b1c1d1e1f2021 3 CHECKMULTISIG\",\n\t\t\tbip16: true,\n\t\t\tscriptInfo: ScriptInfo{\n\t\t\t\tPkScriptClass:  MultiSigTy,\n\t\t\t\tNumInputs:      4,\n\t\t\t\tExpectedInputs: 4,\n\t\t\t\tSigOps:         3,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// A v0 p2wkh spend.\n\t\t\tname:     \"p2wkh script\",\n\t\t\tpkScript: \"OP_0 DATA_20 0x365ab47888e150ff46f8d51bce36dcd680f1283f\",\n\t\t\twitness: []string{\n\t\t\t\t\"3045022100ee9fe8f9487afa977\" +\n\t\t\t\t\t\"6647ebcf0883ce0cd37454d7ce19889d34ba2c9\" +\n\t\t\t\t\t\"9ce5a9f402200341cb469d0efd3955acb9e46\" +\n\t\t\t\t\t\"f568d7e2cc10f9084aaff94ced6dc50a59134ad01\",\n\t\t\t\t\"03f0000d0639a22bfaf217e4c9428\" +\n\t\t\t\t\t\"9c2b0cc7fa1036f7fd5d9f61a9d6ec153100e\",\n\t\t\t},\n\t\t\tsegwit: true,\n\t\t\tscriptInfo: ScriptInfo{\n\t\t\t\tPkScriptClass:  WitnessV0PubKeyHashTy,\n\t\t\t\tNumInputs:      2,\n\t\t\t\tExpectedInputs: 2,\n\t\t\t\tSigOps:         1,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Nested p2sh v0\n\t\t\tname: \"p2wkh nested inside p2sh\",\n\t\t\tpkScript: \"HASH160 DATA_20 \" +\n\t\t\t\t\"0xb3a84b564602a9d68b4c9f19c2ea61458ff7826c EQUAL\",\n\t\t\tsigScript: \"DATA_22 0x0014ad0ffa2e387f07e7ead14dc56d5a97dbd6ff5a23\",\n\t\t\twitness: []string{\n\t\t\t\t\"3045022100cb1c2ac1ff1d57d\" +\n\t\t\t\t\t\"db98f7bdead905f8bf5bcc8641b029ce8eef25\" +\n\t\t\t\t\t\"c75a9e22a4702203be621b5c86b771288706be5\" +\n\t\t\t\t\t\"a7eee1db4fceabf9afb7583c1cc6ee3f8297b21201\",\n\t\t\t\t\"03f0000d0639a22bfaf217e4c9\" +\n\t\t\t\t\t\"4289c2b0cc7fa1036f7fd5d9f61a9d6ec153100e\",\n\t\t\t},\n\t\t\tsegwit: true,\n\t\t\tbip16:  true,\n\t\t\tscriptInfo: ScriptInfo{\n\t\t\t\tPkScriptClass:  ScriptHashTy,\n\t\t\t\tNumInputs:      3,\n\t\t\t\tExpectedInputs: 3,\n\t\t\t\tSigOps:         1,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// A v0 p2wsh spend.\n\t\t\tname: \"p2wsh spend of a p2wkh witness script\",\n\t\t\tpkScript: \"0 DATA_32 0xe112b88a0cd87ba387f44\" +\n\t\t\t\t\"9d443ee2596eb353beb1f0351ab2cba8909d875db23\",\n\t\t\twitness: []string{\n\t\t\t\t\"3045022100cb1c2ac1ff1d57d\" +\n\t\t\t\t\t\"db98f7bdead905f8bf5bcc8641b029ce8eef25\" +\n\t\t\t\t\t\"c75a9e22a4702203be621b5c86b771288706be5\" +\n\t\t\t\t\t\"a7eee1db4fceabf9afb7583c1cc6ee3f8297b21201\",\n\t\t\t\t\"03f0000d0639a22bfaf217e4c9\" +\n\t\t\t\t\t\"4289c2b0cc7fa1036f7fd5d9f61a9d6ec153100e\",\n\t\t\t\t\"76a914064977cb7b4a2e0c9680df0ef696e9e0e296b39988ac\",\n\t\t\t},\n\t\t\tsegwit: true,\n\t\t\tscriptInfo: ScriptInfo{\n\t\t\t\tPkScriptClass:  WitnessV0ScriptHashTy,\n\t\t\t\tNumInputs:      3,\n\t\t\t\tExpectedInputs: 3,\n\t\t\t\tSigOps:         1,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tsigScript := mustParseShortForm(test.sigScript)\n\t\tpkScript := mustParseShortForm(test.pkScript)\n\n\t\tvar witness wire.TxWitness\n\n\t\tfor _, witElement := range test.witness {\n\t\t\twit, err := hex.DecodeString(witElement)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unable to decode witness \"+\n\t\t\t\t\t\"element: %v\", err)\n\t\t\t}\n\n\t\t\twitness = append(witness, wit)\n\t\t}\n\n\t\tsi, err := CalcScriptInfo(sigScript, pkScript, witness,\n\t\t\ttest.bip16, test.segwit)\n\t\tif e := tstCheckScriptError(err, test.scriptInfoErr); e != nil {\n\t\t\tt.Errorf(\"scriptinfo test %q: %v\", test.name, e)\n\t\t\tcontinue\n\t\t}\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tif *si != test.scriptInfo {\n\t\t\tt.Errorf(\"%s: scriptinfo doesn't match expected. \"+\n\t\t\t\t\"got: %q expected %q\", test.name, *si,\n\t\t\t\ttest.scriptInfo)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// bogusAddress implements the btcutil.Address interface so the tests can ensure\n// unsupported address types are handled properly.\ntype bogusAddress struct{}\n\n// EncodeAddress simply returns an empty string.  It exists to satisfy the\n// btcutil.Address interface.\nfunc (b *bogusAddress) EncodeAddress() string {\n\treturn \"\"\n}\n\n// ScriptAddress simply returns an empty byte slice.  It exists to satisfy the\n// btcutil.Address interface.\nfunc (b *bogusAddress) ScriptAddress() []byte {\n\treturn nil\n}\n\n// IsForNet lies blatantly to satisfy the btcutil.Address interface.\nfunc (b *bogusAddress) IsForNet(chainParams *chaincfg.Params) bool {\n\treturn true // why not?\n}\n\n// String simply returns an empty string.  It exists to satisfy the\n// btcutil.Address interface.\nfunc (b *bogusAddress) String() string {\n\treturn \"\"\n}\n\n// TestPayToAddrScript ensures the PayToAddrScript function generates the\n// correct scripts for the various types of addresses.\nfunc TestPayToAddrScript(t *testing.T) {\n\tt.Parallel()\n\n\t// 1MirQ9bwyQcGVJPwKUgapu5ouK2E2Ey4gX\n\tp2pkhMain, err := btcutil.NewAddressPubKeyHash(hexToBytes(\"e34cce70c86\"+\n\t\t\"373273efcc54ce7d2a491bb4a0e84\"), &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create public key hash address: %v\", err)\n\t}\n\n\t// Taken from transaction:\n\t// b0539a45de13b3e0403909b8bd1a555b8cbe45fd4e3f3fda76f3a5f52835c29d\n\tp2shMain, _ := btcutil.NewAddressScriptHashFromHash(hexToBytes(\"e8c300\"+\n\t\t\"c87986efa84c37c0519929019ef86eb5b4\"), &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create script hash address: %v\", err)\n\t}\n\n\t//  mainnet p2pk 13CG6SJ3yHUXo4Cr2RY4THLLJrNFuG3gUg\n\tp2pkCompressedMain, err := btcutil.NewAddressPubKey(hexToBytes(\"02192d\"+\n\t\t\"74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4\"),\n\t\t&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create pubkey address (compressed): %v\",\n\t\t\terr)\n\t}\n\tp2pkCompressed2Main, err := btcutil.NewAddressPubKey(hexToBytes(\"03b0b\"+\n\t\t\"d634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e65\"),\n\t\t&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create pubkey address (compressed 2): %v\",\n\t\t\terr)\n\t}\n\n\tp2pkUncompressedMain, err := btcutil.NewAddressPubKey(hexToBytes(\"0411\"+\n\t\t\"db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5\"+\n\t\t\"cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b4\"+\n\t\t\"12a3\"), &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create pubkey address (uncompressed): %v\",\n\t\t\terr)\n\t}\n\n\tp2wsh, err := btcutil.NewAddressWitnessScriptHash(hexToBytes(\"e981bd992a43650657\"+\n\t\t\"d705ef7a30b2adc75a927ed42a4cf6b3da0f865a475fb4\"), &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create p2wsh address: %v\",\n\t\t\terr)\n\t}\n\n\tp2tr, err := btcutil.NewAddressTaproot(hexToBytes(\"3a8e170b546c3b122ab9c175e\"+\n\t\t\"ff36fb344db2684fe96497eb51b440e75232709\"), &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create p2tr address: %v\",\n\t\t\terr)\n\t}\n\n\tp2wpkh, err := btcutil.NewAddressWitnessPubKeyHash(hexToBytes(\"748e50366adb8\"+\n\t\t\"ae4b0255e406a28f99d24b73cbc\"), &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create p2wpkh address: %v\",\n\t\t\terr)\n\t}\n\n\t// Errors used in the tests below defined here for convenience and to\n\t// keep the horizontal test size shorter.\n\terrUnsupportedAddress := scriptError(ErrUnsupportedAddress, \"\")\n\n\ttests := []struct {\n\t\tin       btcutil.Address\n\t\texpected string\n\t\terr      error\n\t}{\n\t\t// pay-to-pubkey-hash address on mainnet\n\t\t{\n\t\t\tp2pkhMain,\n\t\t\t\"DUP HASH160 DATA_20 0xe34cce70c86373273efcc54ce7d2a4\" +\n\t\t\t\t\"91bb4a0e8488 CHECKSIG\",\n\t\t\tnil,\n\t\t},\n\t\t// pay-to-script-hash address on mainnet\n\t\t{\n\t\t\tp2shMain,\n\t\t\t\"HASH160 DATA_20 0xe8c300c87986efa84c37c0519929019ef8\" +\n\t\t\t\t\"6eb5b4 EQUAL\",\n\t\t\tnil,\n\t\t},\n\t\t// pay-to-pubkey address on mainnet. compressed key.\n\t\t{\n\t\t\tp2pkCompressedMain,\n\t\t\t\"DATA_33 0x02192d74d0cb94344c9569c2e77901573d8d7903c3\" +\n\t\t\t\t\"ebec3a957724895dca52c6b4 CHECKSIG\",\n\t\t\tnil,\n\t\t},\n\t\t// pay-to-pubkey address on mainnet. compressed key (other way).\n\t\t{\n\t\t\tp2pkCompressed2Main,\n\t\t\t\"DATA_33 0x03b0bd634234abbb1ba1e986e884185c61cf43e001\" +\n\t\t\t\t\"f9137f23c2c409273eb16e65 CHECKSIG\",\n\t\t\tnil,\n\t\t},\n\t\t// pay-to-pubkey address on mainnet. uncompressed key.\n\t\t{\n\t\t\tp2pkUncompressedMain,\n\t\t\t\"DATA_65 0x0411db93e1dcdb8a016b49840f8c53bc1eb68a382e\" +\n\t\t\t\t\"97b1482ecad7b148a6909a5cb2e0eaddfb84ccf97444\" +\n\t\t\t\t\"64f82e160bfa9b8b64f9d4c03f999b8643f656b412a3 \" +\n\t\t\t\t\"CHECKSIG\",\n\t\t\tnil,\n\t\t},\n\t\t// pay-to-witness-script-hash address on mainnet.\n\t\t{\n\t\t\tp2wsh,\n\t\t\t\"OP_0 DATA_32 0xe981bd992a43650657d705ef7a30b2adc75a927ed\" +\n\t\t\t\t\"42a4cf6b3da0f865a475fb4\",\n\t\t\tnil,\n\t\t},\n\t\t// pay-to-taproot address on mainnet.\n\t\t{\n\t\t\tp2tr,\n\t\t\t\"OP_1 DATA_32 0x3a8e170b546c3b122ab9c175eff36fb344db2684\" +\n\t\t\t\t\"fe96497eb51b440e75232709\",\n\t\t\tnil,\n\t\t},\n\t\t// pay-to-witness-pubkey-hash address on mainnet.\n\t\t{\n\t\t\tp2wpkh,\n\t\t\t\"OP_0 DATA_20 0x748e50366adb8ae4b0255e406a28f99d24b73cbc\",\n\t\t\tnil,\n\t\t},\n\n\t\t// Supported address types with nil pointers.\n\t\t{(*btcutil.AddressPubKeyHash)(nil), \"\", errUnsupportedAddress},\n\t\t{(*btcutil.AddressScriptHash)(nil), \"\", errUnsupportedAddress},\n\t\t{(*btcutil.AddressPubKey)(nil), \"\", errUnsupportedAddress},\n\t\t{(*btcutil.AddressWitnessPubKeyHash)(nil), \"\", errUnsupportedAddress},\n\t\t{(*btcutil.AddressWitnessScriptHash)(nil), \"\", errUnsupportedAddress},\n\t\t{(*btcutil.AddressTaproot)(nil), \"\", errUnsupportedAddress},\n\n\t\t// Unsupported address type.\n\t\t{&bogusAddress{}, \"\", errUnsupportedAddress},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tpkScript, err := PayToAddrScript(test.in)\n\t\tif e := tstCheckScriptError(err, test.err); e != nil {\n\t\t\tt.Errorf(\"PayToAddrScript #%d unexpected error - \"+\n\t\t\t\t\"got %v, want %v\", i, err, test.err)\n\t\t\tcontinue\n\t\t}\n\n\t\texpected := mustParseShortForm(test.expected)\n\t\tif !bytes.Equal(pkScript, expected) {\n\t\t\tt.Errorf(\"PayToAddrScript #%d got: %x\\nwant: %x\",\n\t\t\t\ti, pkScript, expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMultiSigScript ensures the MultiSigScript function returns the expected\n// scripts and errors.\nfunc TestMultiSigScript(t *testing.T) {\n\tt.Parallel()\n\n\t//  mainnet p2pk 13CG6SJ3yHUXo4Cr2RY4THLLJrNFuG3gUg\n\tp2pkCompressedMain, err := btcutil.NewAddressPubKey(hexToBytes(\"02192d\"+\n\t\t\"74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4\"),\n\t\t&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create pubkey address (compressed): %v\",\n\t\t\terr)\n\t}\n\tp2pkCompressed2Main, err := btcutil.NewAddressPubKey(hexToBytes(\"03b0b\"+\n\t\t\"d634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e65\"),\n\t\t&chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create pubkey address (compressed 2): %v\",\n\t\t\terr)\n\t}\n\n\tp2pkUncompressedMain, err := btcutil.NewAddressPubKey(hexToBytes(\"0411\"+\n\t\t\"db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5\"+\n\t\t\"cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b4\"+\n\t\t\"12a3\"), &chaincfg.MainNetParams)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to create pubkey address (uncompressed): %v\",\n\t\t\terr)\n\t}\n\n\ttests := []struct {\n\t\tkeys      []*btcutil.AddressPubKey\n\t\tnrequired int\n\t\texpected  string\n\t\terr       error\n\t}{\n\t\t{\n\t\t\t[]*btcutil.AddressPubKey{\n\t\t\t\tp2pkCompressedMain,\n\t\t\t\tp2pkCompressed2Main,\n\t\t\t},\n\t\t\t1,\n\t\t\t\"1 DATA_33 0x02192d74d0cb94344c9569c2e77901573d8d7903c\" +\n\t\t\t\t\"3ebec3a957724895dca52c6b4 DATA_33 0x03b0bd634\" +\n\t\t\t\t\"234abbb1ba1e986e884185c61cf43e001f9137f23c2c4\" +\n\t\t\t\t\"09273eb16e65 2 CHECKMULTISIG\",\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t[]*btcutil.AddressPubKey{\n\t\t\t\tp2pkCompressedMain,\n\t\t\t\tp2pkCompressed2Main,\n\t\t\t},\n\t\t\t2,\n\t\t\t\"2 DATA_33 0x02192d74d0cb94344c9569c2e77901573d8d7903c\" +\n\t\t\t\t\"3ebec3a957724895dca52c6b4 DATA_33 0x03b0bd634\" +\n\t\t\t\t\"234abbb1ba1e986e884185c61cf43e001f9137f23c2c4\" +\n\t\t\t\t\"09273eb16e65 2 CHECKMULTISIG\",\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t[]*btcutil.AddressPubKey{\n\t\t\t\tp2pkCompressedMain,\n\t\t\t\tp2pkCompressed2Main,\n\t\t\t},\n\t\t\t3,\n\t\t\t\"\",\n\t\t\tscriptError(ErrTooManyRequiredSigs, \"\"),\n\t\t},\n\t\t{\n\t\t\t[]*btcutil.AddressPubKey{\n\t\t\t\tp2pkUncompressedMain,\n\t\t\t},\n\t\t\t1,\n\t\t\t\"1 DATA_65 0x0411db93e1dcdb8a016b49840f8c53bc1eb68a382\" +\n\t\t\t\t\"e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf97444\" +\n\t\t\t\t\"64f82e160bfa9b8b64f9d4c03f999b8643f656b412a3 \" +\n\t\t\t\t\"1 CHECKMULTISIG\",\n\t\t\tnil,\n\t\t},\n\t\t{\n\t\t\t[]*btcutil.AddressPubKey{\n\t\t\t\tp2pkUncompressedMain,\n\t\t\t},\n\t\t\t2,\n\t\t\t\"\",\n\t\t\tscriptError(ErrTooManyRequiredSigs, \"\"),\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tscript, err := MultiSigScript(test.keys, test.nrequired)\n\t\tif e := tstCheckScriptError(err, test.err); e != nil {\n\t\t\tt.Errorf(\"MultiSigScript #%d: %v\", i, e)\n\t\t\tcontinue\n\t\t}\n\n\t\texpected := mustParseShortForm(test.expected)\n\t\tif !bytes.Equal(script, expected) {\n\t\t\tt.Errorf(\"MultiSigScript #%d got: %x\\nwant: %x\",\n\t\t\t\ti, script, expected)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestCalcMultiSigStats ensures the CalcMultiSigStats function returns the\n// expected errors.\nfunc TestCalcMultiSigStats(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname   string\n\t\tscript string\n\t\terr    error\n\t}{\n\t\t{\n\t\t\tname: \"short script\",\n\t\t\tscript: \"0x046708afdb0fe5548271967f1a67130b7105cd6a828\" +\n\t\t\t\t\"e03909a67962e0ea1f61d\",\n\t\t\terr: scriptError(ErrNotMultisigScript, \"\"),\n\t\t},\n\t\t{\n\t\t\tname: \"stack underflow\",\n\t\t\tscript: \"RETURN DATA_41 0x046708afdb0fe5548271967f1a\" +\n\t\t\t\t\"67130b7105cd6a828e03909a67962e0ea1f61deb649f6\" +\n\t\t\t\t\"bc3f4cef308\",\n\t\t\terr: scriptError(ErrNotMultisigScript, \"\"),\n\t\t},\n\t\t{\n\t\t\tname: \"multisig script\",\n\t\t\tscript: \"1 DATA_33 0x0232abdc893e7f0631364d7fd01cb33d24da45329a0\" +\n\t\t\t\t\"0357b3a7886211ab414d55a 1 CHECKMULTISIG\",\n\t\t\terr: nil,\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\tscript := mustParseShortForm(test.script)\n\t\t_, _, err := CalcMultiSigStats(script)\n\t\tif e := tstCheckScriptError(err, test.err); e != nil {\n\t\t\tt.Errorf(\"CalcMultiSigStats #%d (%s): %v\", i, test.name,\n\t\t\t\te)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// scriptClassTests houses several test scripts used to ensure various class\n// determination is working as expected.  It's defined as a test global versus\n// inside a function scope since this spans both the standard tests and the\n// consensus tests (pay-to-script-hash is part of consensus).\nvar scriptClassTests = []struct {\n\tname   string\n\tscript string\n\tclass  ScriptClass\n}{\n\t{\n\t\tname: \"Pay Pubkey\",\n\t\tscript: \"DATA_65 0x0411db93e1dcdb8a016b49840f8c53bc1eb68a382e\" +\n\t\t\t\"97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e16\" +\n\t\t\t\"0bfa9b8b64f9d4c03f999b8643f656b412a3 CHECKSIG\",\n\t\tclass: PubKeyTy,\n\t},\n\t// tx 599e47a8114fe098103663029548811d2651991b62397e057f0c863c2bc9f9ea\n\t{\n\t\tname: \"Pay PubkeyHash\",\n\t\tscript: \"DUP HASH160 DATA_20 0x660d4ef3a743e3e696ad990364e555\" +\n\t\t\t\"c271ad504b EQUALVERIFY CHECKSIG\",\n\t\tclass: PubKeyHashTy,\n\t},\n\t// part of tx 6d36bc17e947ce00bb6f12f8e7a56a1585c5a36188ffa2b05e10b4743273a74b\n\t// codeseparator parts have been elided. (bitcoin core's checks for\n\t// multisig type doesn't have codesep either).\n\t{\n\t\tname: \"multisig\",\n\t\tscript: \"1 DATA_33 0x0232abdc893e7f0631364d7fd01cb33d24da4\" +\n\t\t\t\"5329a00357b3a7886211ab414d55a 1 CHECKMULTISIG\",\n\t\tclass: MultiSigTy,\n\t},\n\t// tx e5779b9e78f9650debc2893fd9636d827b26b4ddfa6a8172fe8708c924f5c39d\n\t{\n\t\tname: \"P2SH\",\n\t\tscript: \"HASH160 DATA_20 0x433ec2ac1ffa1b7b7d027f564529c57197f\" +\n\t\t\t\"9ae88 EQUAL\",\n\t\tclass: ScriptHashTy,\n\t},\n\n\t{\n\t\t// Nulldata with no data at all.\n\t\tname:   \"nulldata no data\",\n\t\tscript: \"RETURN\",\n\t\tclass:  NullDataTy,\n\t},\n\t{\n\t\t// Nulldata with single zero push.\n\t\tname:   \"nulldata zero\",\n\t\tscript: \"RETURN 0\",\n\t\tclass:  NullDataTy,\n\t},\n\t{\n\t\t// Nulldata with small integer push.\n\t\tname:   \"nulldata small int\",\n\t\tscript: \"RETURN 1\",\n\t\tclass:  NullDataTy,\n\t},\n\t{\n\t\t// Nulldata with max small integer push.\n\t\tname:   \"nulldata max small int\",\n\t\tscript: \"RETURN 16\",\n\t\tclass:  NullDataTy,\n\t},\n\t{\n\t\t// Nulldata with small data push.\n\t\tname:   \"nulldata small data\",\n\t\tscript: \"RETURN DATA_8 0x046708afdb0fe554\",\n\t\tclass:  NullDataTy,\n\t},\n\t{\n\t\t// Canonical nulldata with 60-byte data push.\n\t\tname: \"canonical nulldata 60-byte push\",\n\t\tscript: \"RETURN 0x3c 0x046708afdb0fe5548271967f1a67130b7105cd\" +\n\t\t\t\"6a828e03909a67962e0ea1f61deb649f6bc3f4cef3046708afdb\" +\n\t\t\t\"0fe5548271967f1a67130b7105cd6a\",\n\t\tclass: NullDataTy,\n\t},\n\t{\n\t\t// Non-canonical nulldata with 60-byte data push.\n\t\tname: \"non-canonical nulldata 60-byte push\",\n\t\tscript: \"RETURN PUSHDATA1 0x3c 0x046708afdb0fe5548271967f1a67\" +\n\t\t\t\"130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3\" +\n\t\t\t\"046708afdb0fe5548271967f1a67130b7105cd6a\",\n\t\tclass: NullDataTy,\n\t},\n\t{\n\t\t// Nulldata with max allowed data to be considered standard.\n\t\tname: \"nulldata max standard push\",\n\t\tscript: \"RETURN PUSHDATA1 0x50 0x046708afdb0fe5548271967f1a67\" +\n\t\t\t\"130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3\" +\n\t\t\t\"046708afdb0fe5548271967f1a67130b7105cd6a828e03909a67\" +\n\t\t\t\"962e0ea1f61deb649f6bc3f4cef3\",\n\t\tclass: NullDataTy,\n\t},\n\t{\n\t\t// Nulldata with more than max allowed data to be considered\n\t\t// standard (so therefore nonstandard)\n\t\tname: \"nulldata exceed max standard push\",\n\t\tscript: \"RETURN PUSHDATA1 0x51 0x046708afdb0fe5548271967f1a67\" +\n\t\t\t\"130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef3\" +\n\t\t\t\"046708afdb0fe5548271967f1a67130b7105cd6a828e03909a67\" +\n\t\t\t\"962e0ea1f61deb649f6bc3f4cef308\",\n\t\tclass: NonStandardTy,\n\t},\n\t{\n\t\t// Almost nulldata, but add an additional opcode after the data\n\t\t// to make it nonstandard.\n\t\tname:   \"almost nulldata\",\n\t\tscript: \"RETURN 4 TRUE\",\n\t\tclass:  NonStandardTy,\n\t},\n\n\t// The next few are almost multisig (it is the more complex script type)\n\t// but with various changes to make it fail.\n\t{\n\t\t// Multisig but invalid nsigs.\n\t\tname: \"strange 1\",\n\t\tscript: \"DUP DATA_33 0x0232abdc893e7f0631364d7fd01cb33d24da45\" +\n\t\t\t\"329a00357b3a7886211ab414d55a 1 CHECKMULTISIG\",\n\t\tclass: NonStandardTy,\n\t},\n\t{\n\t\t// Multisig but invalid pubkey.\n\t\tname:   \"strange 2\",\n\t\tscript: \"1 1 1 CHECKMULTISIG\",\n\t\tclass:  NonStandardTy,\n\t},\n\t{\n\t\t// Multisig but no matching npubkeys opcode.\n\t\tname: \"strange 3\",\n\t\tscript: \"1 DATA_33 0x0232abdc893e7f0631364d7fd01cb33d24da4532\" +\n\t\t\t\"9a00357b3a7886211ab414d55a DATA_33 0x0232abdc893e7f0\" +\n\t\t\t\"631364d7fd01cb33d24da45329a00357b3a7886211ab414d55a \" +\n\t\t\t\"CHECKMULTISIG\",\n\t\tclass: NonStandardTy,\n\t},\n\t{\n\t\t// Multisig but with multisigverify.\n\t\tname: \"strange 4\",\n\t\tscript: \"1 DATA_33 0x0232abdc893e7f0631364d7fd01cb33d24da4532\" +\n\t\t\t\"9a00357b3a7886211ab414d55a 1 CHECKMULTISIGVERIFY\",\n\t\tclass: NonStandardTy,\n\t},\n\t{\n\t\t// Multisig but wrong length.\n\t\tname:   \"strange 5\",\n\t\tscript: \"1 CHECKMULTISIG\",\n\t\tclass:  NonStandardTy,\n\t},\n\t{\n\t\tname:   \"doesn't parse\",\n\t\tscript: \"DATA_5 0x01020304\",\n\t\tclass:  NonStandardTy,\n\t},\n\t{\n\t\tname: \"multisig script with wrong number of pubkeys\",\n\t\tscript: \"2 \" +\n\t\t\t\"DATA_33 \" +\n\t\t\t\"0x027adf5df7c965a2d46203c781bd4dd8\" +\n\t\t\t\"21f11844136f6673af7cc5a4a05cd29380 \" +\n\t\t\t\"DATA_33 \" +\n\t\t\t\"0x02c08f3de8ee2de9be7bd770f4c10eb0\" +\n\t\t\t\"d6ff1dd81ee96eedd3a9d4aeaf86695e80 \" +\n\t\t\t\"3 CHECKMULTISIG\",\n\t\tclass: NonStandardTy,\n\t},\n\n\t// New standard segwit script templates.\n\t{\n\t\t// A pay to witness pub key hash pk script.\n\t\tname:   \"Pay To Witness PubkeyHash\",\n\t\tscript: \"0 DATA_20 0x1d0f172a0ecb48aee1be1f2687d2963ae33f71a1\",\n\t\tclass:  WitnessV0PubKeyHashTy,\n\t},\n\t{\n\t\t// A pay to witness scripthash pk script.\n\t\tname:   \"Pay To Witness Scripthash\",\n\t\tscript: \"0 DATA_32 0x9f96ade4b41d5433f4eda31e1738ec2b36f6e7d1420d94a6af99801a88f7f7ff\",\n\t\tclass:  WitnessV0ScriptHashTy,\n\t},\n}\n\n// TestScriptClass ensures all the scripts in scriptClassTests have the expected\n// class.\nfunc TestScriptClass(t *testing.T) {\n\tt.Parallel()\n\n\tfor _, test := range scriptClassTests {\n\t\tscript := mustParseShortForm(test.script)\n\t\tclass := GetScriptClass(script)\n\t\tif class != test.class {\n\t\t\tt.Errorf(\"%s: expected %s got %s (script %x)\", test.name,\n\t\t\t\ttest.class, class, script)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestStringifyClass ensures the script class string returns the expected\n// string for each script class.\nfunc TestStringifyClass(t *testing.T) {\n\tt.Parallel()\n\n\ttests := []struct {\n\t\tname     string\n\t\tclass    ScriptClass\n\t\tstringed string\n\t}{\n\t\t{\n\t\t\tname:     \"nonstandardty\",\n\t\t\tclass:    NonStandardTy,\n\t\t\tstringed: \"nonstandard\",\n\t\t},\n\t\t{\n\t\t\tname:     \"pubkey\",\n\t\t\tclass:    PubKeyTy,\n\t\t\tstringed: \"pubkey\",\n\t\t},\n\t\t{\n\t\t\tname:     \"pubkeyhash\",\n\t\t\tclass:    PubKeyHashTy,\n\t\t\tstringed: \"pubkeyhash\",\n\t\t},\n\t\t{\n\t\t\tname:     \"witnesspubkeyhash\",\n\t\t\tclass:    WitnessV0PubKeyHashTy,\n\t\t\tstringed: \"witness_v0_keyhash\",\n\t\t},\n\t\t{\n\t\t\tname:     \"scripthash\",\n\t\t\tclass:    ScriptHashTy,\n\t\t\tstringed: \"scripthash\",\n\t\t},\n\t\t{\n\t\t\tname:     \"witnessscripthash\",\n\t\t\tclass:    WitnessV0ScriptHashTy,\n\t\t\tstringed: \"witness_v0_scripthash\",\n\t\t},\n\t\t{\n\t\t\tname:     \"multisigty\",\n\t\t\tclass:    MultiSigTy,\n\t\t\tstringed: \"multisig\",\n\t\t},\n\t\t{\n\t\t\tname:     \"nulldataty\",\n\t\t\tclass:    NullDataTy,\n\t\t\tstringed: \"nulldata\",\n\t\t},\n\t\t{\n\t\t\tname:     \"broken\",\n\t\t\tclass:    ScriptClass(255),\n\t\t\tstringed: \"Invalid\",\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\ttypeString := test.class.String()\n\t\tif typeString != test.stringed {\n\t\t\tt.Errorf(\"%s: got %#q, want %#q\", test.name,\n\t\t\t\ttypeString, test.stringed)\n\t\t}\n\t}\n}\n\n// TestNullDataScript tests whether NullDataScript returns a valid script.\nfunc TestNullDataScript(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tdata     []byte\n\t\texpected []byte\n\t\terr      error\n\t\tclass    ScriptClass\n\t}{\n\t\t{\n\t\t\tname:     \"small int\",\n\t\t\tdata:     hexToBytes(\"01\"),\n\t\t\texpected: mustParseShortForm(\"RETURN 1\"),\n\t\t\terr:      nil,\n\t\t\tclass:    NullDataTy,\n\t\t},\n\t\t{\n\t\t\tname:     \"max small int\",\n\t\t\tdata:     hexToBytes(\"10\"),\n\t\t\texpected: mustParseShortForm(\"RETURN 16\"),\n\t\t\terr:      nil,\n\t\t\tclass:    NullDataTy,\n\t\t},\n\t\t{\n\t\t\tname: \"data of size before OP_PUSHDATA1 is needed\",\n\t\t\tdata: hexToBytes(\"0102030405060708090a0b0c0d0e0f10111\" +\n\t\t\t\t\"2131415161718\"),\n\t\t\texpected: mustParseShortForm(\"RETURN 0x18 0x01020304\" +\n\t\t\t\t\"05060708090a0b0c0d0e0f101112131415161718\"),\n\t\t\terr:   nil,\n\t\t\tclass: NullDataTy,\n\t\t},\n\t\t{\n\t\t\tname: \"just right\",\n\t\t\tdata: hexToBytes(\"000102030405060708090a0b0c0d0e0f101\" +\n\t\t\t\t\"112131415161718191a1b1c1d1e1f202122232425262\" +\n\t\t\t\t\"728292a2b2c2d2e2f303132333435363738393a3b3c3\" +\n\t\t\t\t\"d3e3f404142434445464748494a4b4c4d4e4f\"),\n\t\t\texpected: mustParseShortForm(\"RETURN PUSHDATA1 0x50 \" +\n\t\t\t\t\"0x000102030405060708090a0b0c0d0e0f101112131\" +\n\t\t\t\t\"415161718191a1b1c1d1e1f20212223242526272829\" +\n\t\t\t\t\"2a2b2c2d2e2f303132333435363738393a3b3c3d3e3\" +\n\t\t\t\t\"f404142434445464748494a4b4c4d4e4f\"),\n\t\t\terr:   nil,\n\t\t\tclass: NullDataTy,\n\t\t},\n\t\t{\n\t\t\tname: \"too big\",\n\t\t\tdata: hexToBytes(\"000102030405060708090a0b0c0d0e0f101\" +\n\t\t\t\t\"112131415161718191a1b1c1d1e1f202122232425262\" +\n\t\t\t\t\"728292a2b2c2d2e2f303132333435363738393a3b3c3\" +\n\t\t\t\t\"d3e3f404142434445464748494a4b4c4d4e4f50\"),\n\t\t\texpected: nil,\n\t\t\terr:      scriptError(ErrTooMuchNullData, \"\"),\n\t\t\tclass:    NonStandardTy,\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\tscript, err := NullDataScript(test.data)\n\t\tif e := tstCheckScriptError(err, test.err); e != nil {\n\t\t\tt.Errorf(\"NullDataScript: #%d (%s): %v\", i, test.name,\n\t\t\t\te)\n\t\t\tcontinue\n\n\t\t}\n\n\t\t// Check that the expected result was returned.\n\t\tif !bytes.Equal(script, test.expected) {\n\t\t\tt.Errorf(\"NullDataScript: #%d (%s) wrong result\\n\"+\n\t\t\t\t\"got: %x\\nwant: %x\", i, test.name, script,\n\t\t\t\ttest.expected)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check that the script has the correct type.\n\t\tscriptType := GetScriptClass(script)\n\t\tif scriptType != test.class {\n\t\t\tt.Errorf(\"GetScriptClass: #%d (%s) wrong result -- \"+\n\t\t\t\t\"got: %v, want: %v\", i, test.name, scriptType,\n\t\t\t\ttest.class)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestNewScriptClass tests whether NewScriptClass returns a valid ScriptClass.\nfunc TestNewScriptClass(t *testing.T) {\n\ttests := []struct {\n\t\tname       string\n\t\tscriptName string\n\t\twant       *ScriptClass\n\t\twantErr    error\n\t}{\n\t\t{\n\t\t\tname:       \"NewScriptClass - ok\",\n\t\t\tscriptName: NullDataTy.String(),\n\t\t\twant: func() *ScriptClass {\n\t\t\t\ts := NullDataTy\n\t\t\t\treturn &s\n\t\t\t}(),\n\t\t},\n\t\t{\n\t\t\tname:       \"NewScriptClass - invalid\",\n\t\t\tscriptName: \"foo\",\n\t\t\twantErr:    ErrUnsupportedScriptType,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot, err := NewScriptClass(tt.scriptName)\n\t\t\tif err != nil && !errors.Is(err, tt.wantErr) {\n\t\t\t\tt.Errorf(\"NewScriptClass() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif !reflect.DeepEqual(got, tt.want) {\n\t\t\t\tt.Errorf(\"NewScriptClass() got = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "txscript/taproot.go",
    "content": "// Copyright (c) 2013-2022 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n)\n\n// TapscriptLeafVersion represents the various possible versions of a tapscript\n// leaf version. Leaf versions are used to define, or introduce new script\n// semantics, under the base taproot execution model.\n//\n// TODO(roasbeef): add validation here as well re proper prefix, etc?\ntype TapscriptLeafVersion uint8\n\nconst (\n\t// BaseLeafVersion is the base tapscript leaf version. The semantics of\n\t// this version are defined in BIP 342.\n\tBaseLeafVersion TapscriptLeafVersion = 0xc0\n)\n\nconst (\n\t// ControlBlockBaseSize is the base size of a control block. This\n\t// includes the initial byte for the leaf version, and then serialized\n\t// schnorr public key.\n\tControlBlockBaseSize = 33\n\n\t// ControlBlockNodeSize is the size of a given merkle branch hash in\n\t// the control block.\n\tControlBlockNodeSize = 32\n\n\t// ControlBlockMaxNodeCount is the max number of nodes that can be\n\t// included in a control block. This value represents a merkle tree of\n\t// depth 2^128.\n\tControlBlockMaxNodeCount = 128\n\n\t// ControlBlockMaxSize is the max possible size of a control block.\n\t// This simulates revealing a leaf from the largest possible tapscript\n\t// tree.\n\tControlBlockMaxSize = ControlBlockBaseSize + (ControlBlockNodeSize *\n\t\tControlBlockMaxNodeCount)\n)\n\n// VerifyTaprootKeySpend attempts to verify a top-level taproot key spend,\n// returning a non-nil error if the passed signature is invalid.  If a sigCache\n// is passed in, then the sig cache will be consulted to skip full verification\n// of a signature that has already been seen. Witness program here should be\n// the 32-byte x-only schnorr output public key.\n//\n// NOTE: The TxSigHashes MUST be passed in and fully populated.\nfunc VerifyTaprootKeySpend(witnessProgram []byte, rawSig []byte, tx *wire.MsgTx,\n\tinputIndex int, prevOuts PrevOutputFetcher, hashCache *TxSigHashes,\n\tsigCache *SigCache) error {\n\n\t// First, we'll need to extract the public key from the witness\n\t// program.\n\trawKey := witnessProgram\n\n\t// Extract the annex if it exists, so we can compute the proper\n\t// sighash below.\n\tvar annex []byte\n\twitness := tx.TxIn[inputIndex].Witness\n\tif isAnnexedWitness(witness) {\n\t\tannex, _ = extractAnnex(witness)\n\t}\n\n\t// Now that we have the public key, we can create a new top-level\n\t// keyspend verifier that'll handle all the sighash and schnorr\n\t// specifics for us.\n\tkeySpendVerifier, err := newTaprootSigVerifier(\n\t\trawKey, rawSig, tx, inputIndex, prevOuts, sigCache,\n\t\thashCache, annex,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tresult := keySpendVerifier.Verify()\n\tif result.sigValid {\n\t\treturn nil\n\t}\n\n\treturn scriptError(ErrTaprootSigInvalid, \"\")\n}\n\n// ControlBlock houses the structured witness input for a taproot spend. This\n// includes the internal taproot key, the leaf version, and finally a nearly\n// complete merkle inclusion proof for the main taproot commitment.\n//\n// TODO(roasbeef): method to serialize control block that commits to even\n// y-bit, which pops up everywhere even tho 32 byte keys\ntype ControlBlock struct {\n\t// InternalKey is the internal public key in the taproot commitment.\n\tInternalKey *btcec.PublicKey\n\n\t// OutputKeyYIsOdd denotes if the y coordinate of the output key (the\n\t// key placed in the actual taproot output is odd.\n\tOutputKeyYIsOdd bool\n\n\t// LeafVersion is the specified leaf version of the tapscript leaf that\n\t// the InclusionProof below is based off of.\n\tLeafVersion TapscriptLeafVersion\n\n\t// InclusionProof is a series of merkle branches that when hashed\n\t// pairwise, starting with the revealed script, will yield the taproot\n\t// commitment root.\n\tInclusionProof []byte\n}\n\n// ToBytes returns the control block in a format suitable for using as part of\n// a witness spending a tapscript output.\nfunc (c *ControlBlock) ToBytes() ([]byte, error) {\n\tvar b bytes.Buffer\n\n\t// The first byte of the control block is the leaf version byte XOR'd with\n\t// the parity of the y coordinate of the public key.\n\tyParity := byte(0)\n\tif c.OutputKeyYIsOdd {\n\t\tyParity = 1\n\t}\n\n\t// The first byte is a combination of the leaf version, using the lowest\n\t// bit to encode the single bit that denotes if the yo coordinate if odd or\n\t// even.\n\tleafVersionAndParity := byte(c.LeafVersion) | yParity\n\tif err := b.WriteByte(leafVersionAndParity); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Next, we encode the raw 32 byte schnorr public key\n\tif _, err := b.Write(schnorr.SerializePubKey(c.InternalKey)); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Finally, we'll write out the inclusion proof as is, without any length\n\t// prefix.\n\tif _, err := b.Write(c.InclusionProof); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn b.Bytes(), nil\n}\n\n// RootHash calculates the root hash of a tapscript given the revealed script.\nfunc (c *ControlBlock) RootHash(revealedScript []byte) []byte {\n\t// We'll start by creating a new tapleaf from the revealed script,\n\t// this'll serve as the initial hash we'll use to incrementally\n\t// reconstruct the merkle root using the control block elements.\n\tmerkleAccumulator := NewTapLeaf(c.LeafVersion, revealedScript).TapHash()\n\n\t// Now that we have our initial hash, we'll parse the control block one\n\t// node at a time to build up our merkle accumulator into the taproot\n\t// commitment.\n\t//\n\t// The control block is a series of nodes that serve as an inclusion\n\t// proof as we can start hashing with our leaf, with each internal\n\t// branch, until we reach the root.\n\tnumNodes := len(c.InclusionProof) / ControlBlockNodeSize\n\tfor nodeOffset := 0; nodeOffset < numNodes; nodeOffset++ {\n\t\t// Extract the new node using our index to serve as a 32-byte\n\t\t// offset.\n\t\tleafOffset := 32 * nodeOffset\n\t\tnextNode := c.InclusionProof[leafOffset : leafOffset+32]\n\n\t\tmerkleAccumulator = tapBranchHash(merkleAccumulator[:], nextNode)\n\t}\n\n\treturn merkleAccumulator[:]\n}\n\n// ParseControlBlock attempts to parse the raw bytes of a control block. An\n// error is returned if the control block isn't well formed, or can't be\n// parsed.\nfunc ParseControlBlock(ctrlBlock []byte) (*ControlBlock, error) {\n\t// The control block minimally must contain 33 bytes (for the leaf\n\t// version and internal key) along with at least a single value\n\t// comprising the merkle proof. If not, then it's invalid.\n\tswitch {\n\t// The control block must minimally have 33 bytes for the internal\n\t// public key and script leaf version.\n\tcase len(ctrlBlock) < ControlBlockBaseSize:\n\t\tstr := fmt.Sprintf(\"min size is %v bytes, control block \"+\n\t\t\t\"is %v bytes\", ControlBlockBaseSize, len(ctrlBlock))\n\t\treturn nil, scriptError(ErrControlBlockTooSmall, str)\n\n\t// The control block can't be larger than a proof for the largest\n\t// possible tapscript merkle tree with 2^128 leaves.\n\tcase len(ctrlBlock) > ControlBlockMaxSize:\n\t\tstr := fmt.Sprintf(\"max size is %v, control block is %v bytes\",\n\t\t\tControlBlockMaxSize, len(ctrlBlock))\n\t\treturn nil, scriptError(ErrControlBlockTooLarge, str)\n\n\t// Ignoring the fixed sized portion, we expect the total number of\n\t// remaining bytes to be a multiple of the node size, which is 32\n\t// bytes.\n\tcase (len(ctrlBlock)-ControlBlockBaseSize)%ControlBlockNodeSize != 0:\n\t\tstr := fmt.Sprintf(\"control block proof is not a multiple \"+\n\t\t\t\"of 32: %v\", len(ctrlBlock)-ControlBlockBaseSize)\n\t\treturn nil, scriptError(ErrControlBlockInvalidLength, str)\n\t}\n\n\t// With the basic sanity checking complete, we can now parse the\n\t// control block.\n\tleafVersion := TapscriptLeafVersion(ctrlBlock[0] & TaprootLeafMask)\n\n\t// Extract the parity of the y coordinate of the internal key.\n\tvar yIsOdd bool\n\tif ctrlBlock[0]&0x01 == 0x01 {\n\t\tyIsOdd = true\n\t}\n\n\t// Next, we'll parse the public key, which is the 32 bytes following\n\t// the leaf version.\n\trawKey := ctrlBlock[1:33]\n\tpubKey, err := schnorr.ParsePubKey(rawKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// The rest of the bytes are the control block itself, which encodes a\n\t// merkle proof of inclusion.\n\tproofBytes := ctrlBlock[33:]\n\n\treturn &ControlBlock{\n\t\tInternalKey:     pubKey,\n\t\tOutputKeyYIsOdd: yIsOdd,\n\t\tLeafVersion:     leafVersion,\n\t\tInclusionProof:  proofBytes,\n\t}, nil\n}\n\n// ComputeTaprootOutputKey calculates a top-level taproot output key given an\n// internal key, and tapscript merkle root. The final key is derived as:\n// taprootKey = internalKey + (h_tapTweak(internalKey || merkleRoot)*G).\nfunc ComputeTaprootOutputKey(pubKey *btcec.PublicKey,\n\tscriptRoot []byte) *btcec.PublicKey {\n\n\t// This routine only operates on x-only public keys where the public\n\t// key always has an even y coordinate, so we'll re-parse it as such.\n\tinternalKey, _ := schnorr.ParsePubKey(schnorr.SerializePubKey(pubKey))\n\n\t// First, we'll compute the tap tweak hash that commits to the internal\n\t// key and the merkle script root.\n\ttapTweakHash := chainhash.TaggedHash(\n\t\tchainhash.TagTapTweak, schnorr.SerializePubKey(internalKey),\n\t\tscriptRoot,\n\t)\n\n\t// With the tap tweak computed,  we'll need to convert the merkle root\n\t// into something in the domain we can manipulate: a scalar value mod\n\t// N.\n\tvar tweakScalar btcec.ModNScalar\n\ttweakScalar.SetBytes((*[32]byte)(tapTweakHash))\n\n\t// Next, we'll need to convert the internal key to jacobian coordinates\n\t// as the routines we need only operate on this type.\n\tvar internalPoint btcec.JacobianPoint\n\tinternalKey.AsJacobian(&internalPoint)\n\n\t// With our intermediate data obtained, we'll now compute:\n\t//\n\t// taprootKey = internalPoint + (tapTweak*G).\n\tvar tPoint, taprootKey btcec.JacobianPoint\n\tbtcec.ScalarBaseMultNonConst(&tweakScalar, &tPoint)\n\tbtcec.AddNonConst(&internalPoint, &tPoint, &taprootKey)\n\n\t// Finally, we'll convert the key back to affine coordinates so we can\n\t// return the format of public key we usually use.\n\ttaprootKey.ToAffine()\n\n\treturn btcec.NewPublicKey(&taprootKey.X, &taprootKey.Y)\n}\n\n// ComputeTaprootKeyNoScript calculates the top-level taproot output key given\n// an internal key, and a desire that the only way an output can be spent is\n// with the keyspend path. This is useful for normal wallet operations that\n// don't need any other additional spending conditions.\nfunc ComputeTaprootKeyNoScript(internalKey *btcec.PublicKey) *btcec.PublicKey {\n\t// We'll compute a custom tap tweak hash that just commits to the key,\n\t// rather than an actual root hash.\n\tfakeScriptroot := []byte{}\n\n\treturn ComputeTaprootOutputKey(internalKey, fakeScriptroot)\n}\n\n// TweakTaprootPrivKey applies the same operation as ComputeTaprootOutputKey,\n// but on the private key instead. The final key is derived as: privKey +\n// h_tapTweak(internalKey || merkleRoot) % N, where N is the order of the\n// secp256k1 curve, and merkleRoot is the root hash of the tapscript tree.\nfunc TweakTaprootPrivKey(privKey btcec.PrivateKey,\n\tscriptRoot []byte) *btcec.PrivateKey {\n\n\t// If the corresponding public key has an odd y coordinate, then we'll\n\t// negate the private key as specified in BIP 341.\n\tprivKeyScalar := privKey.Key\n\tpubKeyBytes := privKey.PubKey().SerializeCompressed()\n\tif pubKeyBytes[0] == secp.PubKeyFormatCompressedOdd {\n\t\tprivKeyScalar.Negate()\n\t}\n\n\t// Next, we'll compute the tap tweak hash that commits to the internal\n\t// key and the merkle script root. We'll snip off the extra parity byte\n\t// from the compressed serialization and use that directly.\n\tschnorrKeyBytes := pubKeyBytes[1:]\n\ttapTweakHash := chainhash.TaggedHash(\n\t\tchainhash.TagTapTweak, schnorrKeyBytes, scriptRoot,\n\t)\n\n\t// Map the private key to a ModNScalar which is needed to perform\n\t// operation mod the curve order.\n\tvar tweakScalar btcec.ModNScalar\n\ttweakScalar.SetBytes((*[32]byte)(tapTweakHash))\n\n\t// Now that we have the private key in its may negated form, we'll add\n\t// the script root as a tweak. As we're using a ModNScalar all\n\t// operations are already normalized mod the curve order.\n\tprivTweak := privKeyScalar.Add(&tweakScalar)\n\n\treturn btcec.PrivKeyFromScalar(privTweak)\n}\n\n// VerifyTaprootLeafCommitment attempts to verify a taproot commitment of the\n// revealed script within the taprootWitnessProgram (a schnorr public key)\n// given the required information included in the control block. An error is\n// returned if the reconstructed taproot commitment (a function of the merkle\n// root and the internal key) doesn't match the passed witness program.\nfunc VerifyTaprootLeafCommitment(controlBlock *ControlBlock,\n\ttaprootWitnessProgram []byte, revealedScript []byte) error {\n\n\t// First, we'll calculate the root hash from the given proof and\n\t// revealed script.\n\trootHash := controlBlock.RootHash(revealedScript)\n\n\t// Next, we'll construct the final commitment (creating the external or\n\t// taproot output key) as a function of this commitment and the\n\t// included internal key: taprootKey = internalKey + (tPoint*G).\n\ttaprootKey := ComputeTaprootOutputKey(\n\t\tcontrolBlock.InternalKey, rootHash,\n\t)\n\n\t// If we convert the taproot key to a witness program (we just need to\n\t// serialize the public key), then it should exactly match the witness\n\t// program passed in.\n\texpectedWitnessProgram := schnorr.SerializePubKey(taprootKey)\n\tif !bytes.Equal(expectedWitnessProgram, taprootWitnessProgram) {\n\n\t\tstr := fmt.Sprintf(\"derived witness program: %x, expected: \"+\n\t\t\t\"%x, using tapscript_root: %x\", expectedWitnessProgram,\n\t\t\ttaprootWitnessProgram, rootHash)\n\t\treturn scriptError(ErrTaprootMerkleProofInvalid, str)\n\t}\n\n\t// Finally, we'll verify that the parity of the y coordinate of the\n\t// public key we've derived matches the control block.\n\tderivedYIsOdd := (taprootKey.SerializeCompressed()[0] ==\n\t\tsecp.PubKeyFormatCompressedOdd)\n\tif controlBlock.OutputKeyYIsOdd != derivedYIsOdd {\n\t\tstr := fmt.Sprintf(\"control block y is odd: %v, derived \"+\n\t\t\t\"parity is odd: %v\", controlBlock.OutputKeyYIsOdd,\n\t\t\tderivedYIsOdd)\n\t\treturn scriptError(ErrTaprootOutputKeyParityMismatch, str)\n\t}\n\n\t// Otherwise, if we reach here, the commitment opening is valid and\n\t// execution can continue.\n\treturn nil\n}\n\n// TapNode represents an abstract node in a tapscript merkle tree. A node is\n// either a branch or a leaf.\ntype TapNode interface {\n\t// TapHash returns the hash of the node. This will either be a tagged\n\t// hash derived from a branch, or a leaf.\n\tTapHash() chainhash.Hash\n\n\t// Left returns the left node. If this is a leaf node, this may be nil.\n\tLeft() TapNode\n\n\t// Right returns the right node. If this is a leaf node, this may be\n\t// nil.\n\tRight() TapNode\n}\n\n// TapLeaf represents a leaf in a tapscript tree. A leaf has two components:\n// the leaf version, and the script associated with that leaf version.\ntype TapLeaf struct {\n\t// LeafVersion is the leaf version of this leaf.\n\tLeafVersion TapscriptLeafVersion\n\n\t// Script is the script to be validated based on the specified leaf\n\t// version.\n\tScript []byte\n}\n\n// Left rights the left node for this leaf. As this is a leaf the left node is\n// nil.\nfunc (t TapLeaf) Left() TapNode {\n\treturn nil\n}\n\n// Right rights the right node for this leaf. As this is a leaf the right node\n// is nil.\nfunc (t TapLeaf) Right() TapNode {\n\treturn nil\n}\n\n// NewBaseTapLeaf returns a new TapLeaf for the specified script, using the\n// current base leaf version (BIP 342).\nfunc NewBaseTapLeaf(script []byte) TapLeaf {\n\treturn TapLeaf{\n\t\tScript:      script,\n\t\tLeafVersion: BaseLeafVersion,\n\t}\n}\n\n// NewTapLeaf returns a new TapLeaf with the given leaf version and script to\n// be committed to.\nfunc NewTapLeaf(leafVersion TapscriptLeafVersion, script []byte) TapLeaf {\n\treturn TapLeaf{\n\t\tLeafVersion: leafVersion,\n\t\tScript:      script,\n\t}\n}\n\n// TapHash returns the hash digest of the target taproot script leaf. The\n// digest is computed as: h_tapleaf(leafVersion || compactSizeof(script) ||\n// script).\nfunc (t TapLeaf) TapHash() chainhash.Hash {\n\t// TODO(roasbeef): cache these and the branch due to the recursive\n\t// call, so memoize\n\n\t// The leaf encoding is: leafVersion || compactSizeof(script) ||\n\t// script, where compactSizeof returns the compact size needed to\n\t// encode the value.\n\tvar leafEncoding bytes.Buffer\n\n\t_ = leafEncoding.WriteByte(byte(t.LeafVersion))\n\t_ = wire.WriteVarBytes(&leafEncoding, 0, t.Script)\n\n\treturn *chainhash.TaggedHash(chainhash.TagTapLeaf, leafEncoding.Bytes())\n}\n\n// TapBranch represents an internal branch in the tapscript tree. The left or\n// right nodes may either be another branch, leaves, or a combination of both.\ntype TapBranch struct {\n\t// leftNode is the left node, this cannot be nil.\n\tleftNode TapNode\n\n\t// rightNode is the right node, this cannot be nil.\n\trightNode TapNode\n}\n\n// NewTapBranch creates a new internal branch from a left and right node.\nfunc NewTapBranch(l, r TapNode) TapBranch {\n\n\treturn TapBranch{\n\t\tleftNode:  l,\n\t\trightNode: r,\n\t}\n}\n\n// Left is the left node of the branch, this might be a leaf or another\n// branch.\nfunc (t TapBranch) Left() TapNode {\n\treturn t.leftNode\n}\n\n// Right is the right node of a branch, this might be a leaf or another branch.\nfunc (t TapBranch) Right() TapNode {\n\treturn t.rightNode\n}\n\n// TapHash returns the hash digest of the taproot internal branch given a left\n// and right node. The final hash digest is: h_tapbranch(leftNode ||\n// rightNode), where leftNode is the lexicographically smaller of the two nodes.\nfunc (t TapBranch) TapHash() chainhash.Hash {\n\tleftHash := t.leftNode.TapHash()\n\trightHash := t.rightNode.TapHash()\n\treturn tapBranchHash(leftHash[:], rightHash[:])\n}\n\n// tapBranchHash takes the raw tap hashes of the right and left nodes and\n// hashes them into a branch. See The TapBranch method for the specifics.\nfunc tapBranchHash(l, r []byte) chainhash.Hash {\n\tif bytes.Compare(l[:], r[:]) > 0 {\n\t\tl, r = r, l\n\t}\n\n\treturn *chainhash.TaggedHash(\n\t\tchainhash.TagTapBranch, l[:], r[:],\n\t)\n}\n\n// TapscriptProof is a proof of inclusion that a given leaf (a script and leaf\n// version) is included within a top-level taproot output commitment.\ntype TapscriptProof struct {\n\t// TapLeaf is the leaf that we want to prove inclusion for.\n\tTapLeaf\n\n\t// RootNode is the root of the tapscript tree, this will be used to\n\t// compute what the final output key looks like.\n\tRootNode TapNode\n\n\t// InclusionProof is the tail end of the control block that contains\n\t// the series of hashes (the sibling hashes up the tree), that when\n\t// hashed together allow us to re-derive the top level taproot output.\n\tInclusionProof []byte\n}\n\n// ToControlBlock maps the tapscript proof into a fully valid control block\n// that can be used as a witness item for a tapscript spend.\nfunc (t *TapscriptProof) ToControlBlock(internalKey *btcec.PublicKey) ControlBlock {\n\t// Compute the total level output commitment based on the populated\n\t// root node.\n\trootHash := t.RootNode.TapHash()\n\ttaprootKey := ComputeTaprootOutputKey(\n\t\tinternalKey, rootHash[:],\n\t)\n\n\t// With the commitment computed we can obtain the bit that denotes if\n\t// the resulting key has an odd y coordinate or not.\n\tvar outputKeyYIsOdd bool\n\tif taprootKey.SerializeCompressed()[0] ==\n\t\tsecp.PubKeyFormatCompressedOdd {\n\n\t\toutputKeyYIsOdd = true\n\t}\n\n\treturn ControlBlock{\n\t\tInternalKey:     internalKey,\n\t\tOutputKeyYIsOdd: outputKeyYIsOdd,\n\t\tLeafVersion:     t.TapLeaf.LeafVersion,\n\t\tInclusionProof:  t.InclusionProof,\n\t}\n}\n\n// IndexedTapScriptTree reprints a fully contracted tapscript tree. The\n// RootNode can be used to traverse down the full tree. In addition, complete\n// inclusion proofs for each leaf are included as well, with an index into the\n// slice of proof based on the tap leaf hash of a given leaf.\ntype IndexedTapScriptTree struct {\n\t// RootNode is the root of the tapscript tree. RootNode.TapHash() can\n\t// be used to extract the hash needed to derive the taptweak committed\n\t// to in the taproot output.\n\tRootNode TapNode\n\n\t// LeafMerkleProofs is a slice that houses the series of merkle\n\t// inclusion proofs for each leaf based on the input order of the\n\t// leaves.\n\tLeafMerkleProofs []TapscriptProof\n\n\t// LeafProofIndex maps the TapHash() of a given leaf node to the index\n\t// within the LeafMerkleProofs array above. This can be used to\n\t// retrieve the inclusion proof for a given script when constructing\n\t// the witness stack and control block for spending a tapscript path.\n\tLeafProofIndex map[chainhash.Hash]int\n}\n\n// NewIndexedTapScriptTree creates a new empty tapscript tree that has enough\n// space to hold information for the specified amount of leaves.\nfunc NewIndexedTapScriptTree(numLeaves int) *IndexedTapScriptTree {\n\treturn &IndexedTapScriptTree{\n\t\tLeafMerkleProofs: make([]TapscriptProof, numLeaves),\n\t\tLeafProofIndex:   make(map[chainhash.Hash]int, numLeaves),\n\t}\n}\n\n// hashTapNodes takes a left and right now, and returns the left and right tap\n// hashes, along with the new combined node. If both nodes are nil, nil\n// pointers are returned. If the right now is nil, then the left node is passed\n// in, which effectively will \"lift\" the node up in the tree as long as it\n// doesn't have any siblings.\nfunc hashTapNodes(left, right TapNode) (*chainhash.Hash, *chainhash.Hash, TapNode) {\n\tswitch {\n\t// If there's no left child, then this is a \"nil\" portion of the array\n\t// tree, so well thread thru nil.\n\tcase left == nil:\n\t\treturn nil, nil, nil\n\n\t// If there's no right child, then this is a single node that'll be\n\t// passed all the way up the tree as it has no children.\n\tcase right == nil:\n\t\treturn nil, nil, left\n\t}\n\n\t// The result of hashing two nodes will always be a branch, so we start\n\t// with that.\n\tleftHash := left.TapHash()\n\trightHash := right.TapHash()\n\n\treturn &leftHash, &rightHash, NewTapBranch(left, right)\n}\n\n// leafDescendants is a recursive algorithm that returns all the leaf nodes\n// that are a decedents of this tree. This is used to collect the series of\n// nodes we need to extend the inclusion proof of each time we go up in the\n// tree.\nfunc leafDescendants(node TapNode) []TapNode {\n\t// A leaf node has no decedents, so we just return it directly.\n\tif node.Left() == nil && node.Right() == nil {\n\t\treturn []TapNode{node}\n\t}\n\n\t// Otherwise, get the descendants of the left and right sub-trees to\n\t// return.\n\tleftLeaves := leafDescendants(node.Left())\n\trightLeaves := leafDescendants(node.Right())\n\n\treturn append(leftLeaves, rightLeaves...)\n}\n\n// AssembleTaprootScriptTree constructs a new fully indexed tapscript tree\n// given a series of leaf nodes. A combination of a recursive data structure,\n// and an array-based representation are used to both generate the tree and\n// also accumulate all the necessary inclusion proofs in the same path. See the\n// comment of blockchain.BuildMerkleTreeStore for further details.\nfunc AssembleTaprootScriptTree(leaves ...TapLeaf) *IndexedTapScriptTree {\n\t// If there's only a single leaf, then that becomes our root.\n\tif len(leaves) == 1 {\n\t\t// A lone leaf has no additional inclusion proof, as a verifier\n\t\t// will just hash the leaf as the sole branch.\n\t\tleaf := leaves[0]\n\t\treturn &IndexedTapScriptTree{\n\t\t\tRootNode: leaf,\n\t\t\tLeafProofIndex: map[chainhash.Hash]int{\n\t\t\t\tleaf.TapHash(): 0,\n\t\t\t},\n\t\t\tLeafMerkleProofs: []TapscriptProof{\n\t\t\t\t{\n\t\t\t\t\tTapLeaf:        leaf,\n\t\t\t\t\tRootNode:       leaf,\n\t\t\t\t\tInclusionProof: nil,\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t}\n\n\t// We'll start out by populating the leaf index which maps a leave's\n\t// taphash to its index within the tree.\n\tscriptTree := NewIndexedTapScriptTree(len(leaves))\n\tfor i, leaf := range leaves {\n\t\tleafHash := leaf.TapHash()\n\t\tscriptTree.LeafProofIndex[leafHash] = i\n\t}\n\n\tvar branches []TapBranch\n\tfor i := 0; i < len(leaves); i += 2 {\n\t\t// If there's only a single leaf left, then we'll merge this\n\t\t// with the last branch we have.\n\t\tif i == len(leaves)-1 {\n\t\t\tbranchToMerge := branches[len(branches)-1]\n\t\t\tleaf := leaves[i]\n\t\t\tnewBranch := NewTapBranch(branchToMerge, leaf)\n\n\t\t\tbranches[len(branches)-1] = newBranch\n\n\t\t\t// The leaf includes the existing branch within its\n\t\t\t// inclusion proof.\n\t\t\tbranchHash := branchToMerge.TapHash()\n\n\t\t\tscriptTree.LeafMerkleProofs[i].TapLeaf = leaf\n\t\t\tscriptTree.LeafMerkleProofs[i].InclusionProof = append(\n\t\t\t\tscriptTree.LeafMerkleProofs[i].InclusionProof,\n\t\t\t\tbranchHash[:]...,\n\t\t\t)\n\n\t\t\t// We'll also add this right hash to the inclusion of\n\t\t\t// the left and right nodes of the branch.\n\t\t\tlastLeafHash := leaf.TapHash()\n\n\t\t\tleftLeafHash := branchToMerge.Left().TapHash()\n\t\t\tleftLeafIndex := scriptTree.LeafProofIndex[leftLeafHash]\n\t\t\tscriptTree.LeafMerkleProofs[leftLeafIndex].InclusionProof = append(\n\t\t\t\tscriptTree.LeafMerkleProofs[leftLeafIndex].InclusionProof,\n\t\t\t\tlastLeafHash[:]...,\n\t\t\t)\n\n\t\t\trightLeafHash := branchToMerge.Right().TapHash()\n\t\t\trightLeafIndex := scriptTree.LeafProofIndex[rightLeafHash]\n\t\t\tscriptTree.LeafMerkleProofs[rightLeafIndex].InclusionProof = append(\n\t\t\t\tscriptTree.LeafMerkleProofs[rightLeafIndex].InclusionProof,\n\t\t\t\tlastLeafHash[:]...,\n\t\t\t)\n\n\t\t\tcontinue\n\t\t}\n\n\t\t// While we still have leaves left, we'll combine two of them\n\t\t// into a new branch node.\n\t\tleft, right := leaves[i], leaves[i+1]\n\t\tnextBranch := NewTapBranch(left, right)\n\t\tbranches = append(branches, nextBranch)\n\n\t\t// The left node will use the right node as part of its\n\t\t// inclusion proof, and vice versa.\n\t\tleftHash := left.TapHash()\n\t\trightHash := right.TapHash()\n\n\t\tscriptTree.LeafMerkleProofs[i].TapLeaf = left\n\t\tscriptTree.LeafMerkleProofs[i].InclusionProof = append(\n\t\t\tscriptTree.LeafMerkleProofs[i].InclusionProof,\n\t\t\trightHash[:]...,\n\t\t)\n\n\t\tscriptTree.LeafMerkleProofs[i+1].TapLeaf = right\n\t\tscriptTree.LeafMerkleProofs[i+1].InclusionProof = append(\n\t\t\tscriptTree.LeafMerkleProofs[i+1].InclusionProof,\n\t\t\tleftHash[:]...,\n\t\t)\n\t}\n\n\t// In this second phase, we'll merge all the leaf branches we have one\n\t// by one until we have our final root.\n\tvar rootNode TapNode\n\tfor len(branches) != 0 {\n\t\t// When we only have a single branch left, then that becomes\n\t\t// our root.\n\t\tif len(branches) == 1 {\n\t\t\trootNode = branches[0]\n\t\t\tbreak\n\t\t}\n\n\t\tleft, right := branches[0], branches[1]\n\n\t\tnewBranch := NewTapBranch(left, right)\n\n\t\tbranches = branches[2:]\n\n\t\tbranches = append(branches, newBranch)\n\n\t\t// Accumulate the sibling hash of this new branch for all the\n\t\t// leaves that are its children.\n\t\tleftLeafDescendants := leafDescendants(left)\n\t\trightLeafDescendants := leafDescendants(right)\n\n\t\tleftHash, rightHash := left.TapHash(), right.TapHash()\n\n\t\t// For each left hash that's a leaf descendants, well add the\n\t\t// right sibling as that sibling is needed to construct the new\n\t\t// internal branch we just created. We also do the same for the\n\t\t// siblings of the right node.\n\t\tfor _, leftLeaf := range leftLeafDescendants {\n\t\t\tleafHash := leftLeaf.TapHash()\n\t\t\tleafIndex := scriptTree.LeafProofIndex[leafHash]\n\n\t\t\tscriptTree.LeafMerkleProofs[leafIndex].InclusionProof = append(\n\t\t\t\tscriptTree.LeafMerkleProofs[leafIndex].InclusionProof,\n\t\t\t\trightHash[:]...,\n\t\t\t)\n\t\t}\n\t\tfor _, rightLeaf := range rightLeafDescendants {\n\t\t\tleafHash := rightLeaf.TapHash()\n\t\t\tleafIndex := scriptTree.LeafProofIndex[leafHash]\n\n\t\t\tscriptTree.LeafMerkleProofs[leafIndex].InclusionProof = append(\n\t\t\t\tscriptTree.LeafMerkleProofs[leafIndex].InclusionProof,\n\t\t\t\tleftHash[:]...,\n\t\t\t)\n\t\t}\n\t}\n\n\t// Populate the top level root node pointer, as well as the pointer in\n\t// each proof.\n\tscriptTree.RootNode = rootNode\n\tfor i := range scriptTree.LeafMerkleProofs {\n\t\tscriptTree.LeafMerkleProofs[i].RootNode = rootNode\n\t}\n\n\treturn scriptTree\n}\n\n// PayToTaprootScript creates a pk script for a pay-to-taproot output key.\nfunc PayToTaprootScript(taprootKey *btcec.PublicKey) ([]byte, error) {\n\treturn NewScriptBuilder().\n\t\tAddOp(OP_1).\n\t\tAddData(schnorr.SerializePubKey(taprootKey)).\n\t\tScript()\n}\n"
  },
  {
    "path": "txscript/taproot_test.go",
    "content": "// Copyright (c) 2013-2022 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\tprand \"math/rand\"\n\t\"testing\"\n\t\"testing/quick\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/schnorr\"\n\t\"github.com/btcsuite/btcd/btcutil\"\n\t\"github.com/btcsuite/btcd/btcutil/hdkeychain\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\tsecp \"github.com/decred/dcrd/dcrec/secp256k1/v4\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nvar (\n\ttestPubBytes, _ = hex.DecodeString(\"F9308A019258C31049344F85F89D5229B\" +\n\t\t\"531C845836F99B08601F113BCE036F9\")\n\n\t// rootKey is the test root key defined in the test vectors:\n\t// https://github.com/bitcoin/bips/blob/master/bip-0086.mediawiki\n\trootKey, _ = hdkeychain.NewKeyFromString(\n\t\t\"xprv9s21ZrQH143K3GJpoapnV8SFfukcVBSfeCficPSGfubmSFDxo1kuHnLi\" +\n\t\t\t\"sriDvSnRRuL2Qrg5ggqHKNVpxR86QEC8w35uxmGoggxtQTPvfUu\",\n\t)\n\n\t// accountPath is the base path for BIP86 (m/86'/0'/0').\n\taccountPath = []uint32{\n\t\t86 + hdkeychain.HardenedKeyStart, hdkeychain.HardenedKeyStart,\n\t\thdkeychain.HardenedKeyStart,\n\t}\n\texpectedExternalAddresses = []string{\n\t\t\"bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr\",\n\t\t\"bc1p4qhjn9zdvkux4e44uhx8tc55attvtyu358kutcqkudyccelu0was9fqzwh\",\n\t}\n\texpectedInternalAddresses = []string{\n\t\t\"bc1p3qkhfews2uk44qtvauqyr2ttdsw7svhkl9nkm9s9c3x4ax5h60wqwruhk7\",\n\t}\n)\n\n// TestControlBlockParsing tests that we're able to generate and parse a valid\n// control block.\nfunc TestControlBlockParsing(t *testing.T) {\n\tt.Parallel()\n\n\tvar testCases = []struct {\n\t\tcontrolBlockGen func() []byte\n\t\tvalid           bool\n\t}{\n\t\t// An invalid control block, it's only 5 bytes and needs to be\n\t\t// at least 33 bytes.\n\t\t{\n\t\t\tcontrolBlockGen: func() []byte {\n\t\t\t\treturn bytes.Repeat([]byte{0x00}, 5)\n\t\t\t},\n\t\t\tvalid: false,\n\t\t},\n\n\t\t// An invalid control block, it's greater than the largest\n\t\t// accepted control block.\n\t\t{\n\t\t\tcontrolBlockGen: func() []byte {\n\t\t\t\treturn bytes.Repeat([]byte{0x00}, ControlBlockMaxSize+1)\n\t\t\t},\n\t\t\tvalid: false,\n\t\t},\n\n\t\t// An invalid control block, it isn't a multiple of 32 bytes\n\t\t// enough though it has a valid starting byte length.\n\t\t{\n\t\t\tcontrolBlockGen: func() []byte {\n\t\t\t\treturn bytes.Repeat([]byte{0x00}, ControlBlockBaseSize+34)\n\t\t\t},\n\t\t\tvalid: false,\n\t\t},\n\n\t\t// A valid control block, of the largest possible size.\n\t\t{\n\t\t\tcontrolBlockGen: func() []byte {\n\t\t\t\tprivKey, _ := btcec.NewPrivateKey()\n\t\t\t\tpubKey := privKey.PubKey()\n\n\t\t\t\tyIsOdd := (pubKey.SerializeCompressed()[0] ==\n\t\t\t\t\tsecp.PubKeyFormatCompressedOdd)\n\n\t\t\t\tctrl := ControlBlock{\n\t\t\t\t\tInternalKey:     pubKey,\n\t\t\t\t\tOutputKeyYIsOdd: yIsOdd,\n\t\t\t\t\tLeafVersion:     BaseLeafVersion,\n\t\t\t\t\tInclusionProof: bytes.Repeat(\n\t\t\t\t\t\t[]byte{0x00},\n\t\t\t\t\t\tControlBlockMaxSize-ControlBlockBaseSize,\n\t\t\t\t\t),\n\t\t\t\t}\n\n\t\t\t\tctrlBytes, _ := ctrl.ToBytes()\n\t\t\t\treturn ctrlBytes\n\t\t\t},\n\t\t\tvalid: true,\n\t\t},\n\n\t\t// A valid control block, only has a single element in the\n\t\t// proof as the tree only has a single element.\n\t\t{\n\t\t\tcontrolBlockGen: func() []byte {\n\t\t\t\tprivKey, _ := btcec.NewPrivateKey()\n\t\t\t\tpubKey := privKey.PubKey()\n\n\t\t\t\tyIsOdd := (pubKey.SerializeCompressed()[0] ==\n\t\t\t\t\tsecp.PubKeyFormatCompressedOdd)\n\n\t\t\t\tctrl := ControlBlock{\n\t\t\t\t\tInternalKey:     pubKey,\n\t\t\t\t\tOutputKeyYIsOdd: yIsOdd,\n\t\t\t\t\tLeafVersion:     BaseLeafVersion,\n\t\t\t\t\tInclusionProof: bytes.Repeat(\n\t\t\t\t\t\t[]byte{0x00}, ControlBlockNodeSize,\n\t\t\t\t\t),\n\t\t\t\t}\n\n\t\t\t\tctrlBytes, _ := ctrl.ToBytes()\n\t\t\t\treturn ctrlBytes\n\t\t\t},\n\t\t\tvalid: true,\n\t\t},\n\t}\n\tfor i, testCase := range testCases {\n\t\tctrlBlockBytes := testCase.controlBlockGen()\n\n\t\tctrlBlock, err := ParseControlBlock(ctrlBlockBytes)\n\t\tswitch {\n\t\tcase testCase.valid && err != nil:\n\t\t\tt.Fatalf(\"#%v: unable to parse valid control block: %v\", i, err)\n\n\t\tcase !testCase.valid && err == nil:\n\t\t\tt.Fatalf(\"#%v: invalid control block should have failed: %v\", i, err)\n\t\t}\n\n\t\tif !testCase.valid {\n\t\t\tcontinue\n\t\t}\n\n\t\t// If we serialize the control block, we should get the exact same\n\t\t// set of bytes as the input.\n\t\tctrlBytes, err := ctrlBlock.ToBytes()\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"#%v: unable to encode bytes: %v\", i, err)\n\t\t}\n\t\tif !bytes.Equal(ctrlBytes, ctrlBlockBytes) {\n\t\t\tt.Fatalf(\"#%v: encoding mismatch: expected %x, \"+\n\t\t\t\t\"got %x\", i, ctrlBlockBytes, ctrlBytes)\n\t\t}\n\t}\n}\n\n// TestTaprootScriptSpendTweak tests that for any 32-byte hypothetical script\n// root, the resulting tweaked public key is the same as tweaking the private\n// key, then generating a public key from that. This test a quickcheck test to\n// assert the following invariant:\n//\n//   - taproot_tweak_pubkey(pubkey_gen(seckey), h)[1] ==\n//     pubkey_gen(taproot_tweak_seckey(seckey, h))\nfunc TestTaprootScriptSpendTweak(t *testing.T) {\n\tt.Parallel()\n\n\t// Assert that if we use this x value as the hash of the script root,\n\t// then if we generate a tweaked public key, it's the same key as if we\n\t// used that key to generate the tweaked\n\t// private key, and then generated the public key from that.\n\tf := func(x [32]byte) bool {\n\t\tprivKey, err := btcec.NewPrivateKey()\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\n\t\t// Generate the tweaked public key using the x value as the\n\t\t// script root.\n\t\ttweakedPub := ComputeTaprootOutputKey(privKey.PubKey(), x[:])\n\n\t\t// Now we'll generate the corresponding tweaked private key.\n\t\ttweakedPriv := TweakTaprootPrivKey(*privKey, x[:])\n\n\t\t// The public key for this private key should be the same as\n\t\t// the tweaked public key we generate above.\n\t\treturn tweakedPub.IsEqual(tweakedPriv.PubKey()) &&\n\t\t\tbytes.Equal(\n\t\t\t\tschnorr.SerializePubKey(tweakedPub),\n\t\t\t\tschnorr.SerializePubKey(tweakedPriv.PubKey()),\n\t\t\t)\n\t}\n\n\tif err := quick.Check(f, nil); err != nil {\n\t\tt.Fatalf(\"tweaked public/private key mapping is \"+\n\t\t\t\"incorrect: %v\", err)\n\t}\n\n}\n\n// TestTaprootTweakNoMutation tests that the underlying private key passed into\n// TweakTaprootPrivKey is never mutated.\nfunc TestTaprootTweakNoMutation(t *testing.T) {\n\tt.Parallel()\n\n\t// Assert that given a random tweak, and a random private key, that if\n\t// we tweak the private key it remains unaffected.\n\tf := func(privBytes, tweak [32]byte) bool {\n\t\tprivKey, _ := btcec.PrivKeyFromBytes(privBytes[:])\n\n\t\t// Now we'll generate the corresponding tweaked private key.\n\t\ttweakedPriv := TweakTaprootPrivKey(*privKey, tweak[:])\n\n\t\t// The tweaked private key and the original private key should\n\t\t// NOT be the same.\n\t\tif *privKey == *tweakedPriv {\n\t\t\tt.Logf(\"private key was mutated\")\n\t\t\treturn false\n\t\t}\n\n\t\t// We should be able to re-derive the private key from raw\n\t\t// bytes and have that match up again.\n\t\tprivKeyCopy, _ := btcec.PrivKeyFromBytes(privBytes[:])\n\t\tif *privKey != *privKeyCopy {\n\t\t\tt.Logf(\"private doesn't match\")\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}\n\n\tif err := quick.Check(f, nil); err != nil {\n\t\tt.Fatalf(\"private key modified: %v\", err)\n\t}\n}\n\n// TestTaprootConstructKeyPath tests the key spend only taproot construction.\nfunc TestTaprootConstructKeyPath(t *testing.T) {\n\tcheckPath := func(branch uint32, expectedAddresses []string) {\n\t\tpath, err := derivePath(rootKey, append(accountPath, branch))\n\t\trequire.NoError(t, err)\n\n\t\tfor index, expectedAddr := range expectedAddresses {\n\t\t\textendedKey, err := path.Derive(uint32(index))\n\t\t\trequire.NoError(t, err)\n\n\t\t\tpubKey, err := extendedKey.ECPubKey()\n\t\t\trequire.NoError(t, err)\n\n\t\t\ttapKey := ComputeTaprootKeyNoScript(pubKey)\n\n\t\t\taddr, err := btcutil.NewAddressTaproot(\n\t\t\t\tschnorr.SerializePubKey(tapKey),\n\t\t\t\t&chaincfg.MainNetParams,\n\t\t\t)\n\t\t\trequire.NoError(t, err)\n\n\t\t\trequire.Equal(t, expectedAddr, addr.String())\n\t\t}\n\t}\n\tcheckPath(0, expectedExternalAddresses)\n\tcheckPath(1, expectedInternalAddresses)\n}\n\nfunc derivePath(key *hdkeychain.ExtendedKey, path []uint32) (\n\t*hdkeychain.ExtendedKey, error) {\n\n\tvar (\n\t\tcurrentKey = key\n\t\terr        error\n\t)\n\tfor _, pathPart := range path {\n\t\tcurrentKey, err = currentKey.Derive(pathPart)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn currentKey, nil\n}\n\n// TestTapscriptCommitmentVerification that given a valid control block, proof\n// we're able to both generate and validate validate script tree leaf inclusion\n// proofs.\nfunc TestTapscriptCommitmentVerification(t *testing.T) {\n\tt.Parallel()\n\n\t// make from 0 to 1 leaf\n\t// ensure verifies properly\n\ttestCases := []struct {\n\t\ttreeMutateFunc func(*IndexedTapScriptTree)\n\n\t\tctrlBlockMutateFunc func(*ControlBlock)\n\n\t\tnumLeaves int\n\n\t\tvalid bool\n\n\t\texpectedErr ErrorCode\n\t}{\n\t\t// A valid merkle proof of a single leaf.\n\t\t{\n\t\t\tnumLeaves: 1,\n\t\t\tvalid:     true,\n\t\t},\n\n\t\t// A valid series of merkle proofs with an odd number of leaves.\n\t\t{\n\t\t\tnumLeaves: 3,\n\t\t\tvalid:     true,\n\t\t},\n\n\t\t// A valid series of merkle proofs with an even number of leaves.\n\t\t{\n\t\t\tnumLeaves: 4,\n\t\t\tvalid:     true,\n\t\t},\n\n\t\t// An invalid merkle proof, we modify the last byte of one of\n\t\t// the leaves.\n\t\t{\n\t\t\tnumLeaves:   4,\n\t\t\tvalid:       false,\n\t\t\texpectedErr: ErrTaprootMerkleProofInvalid,\n\t\t\ttreeMutateFunc: func(t *IndexedTapScriptTree) {\n\t\t\t\tfor _, leafProof := range t.LeafMerkleProofs {\n\t\t\t\t\tproofLen := len(leafProof.InclusionProof)\n\t\t\t\t\tleafProof.InclusionProof[proofLen-1] ^= 1\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\n\t\t{\n\t\t\t// An invalid series of proofs, we modify the control\n\t\t\t// block to not match the parity of the final output\n\t\t\t// key commitment.\n\t\t\tnumLeaves:   2,\n\t\t\tvalid:       false,\n\t\t\texpectedErr: ErrTaprootOutputKeyParityMismatch,\n\t\t\tctrlBlockMutateFunc: func(c *ControlBlock) {\n\t\t\t\tc.OutputKeyYIsOdd = !c.OutputKeyYIsOdd\n\t\t\t},\n\t\t},\n\t}\n\tfor _, testCase := range testCases {\n\t\ttestName := fmt.Sprintf(\"num_leaves=%v, valid=%v, treeMutate=%v, \"+\n\t\t\t\"ctrlBlockMutate=%v\", testCase.numLeaves, testCase.valid,\n\t\t\ttestCase.treeMutateFunc == nil, testCase.ctrlBlockMutateFunc == nil)\n\n\t\tt.Run(testName, func(t *testing.T) {\n\t\t\ttapScriptLeaves := make([]TapLeaf, testCase.numLeaves)\n\t\t\tfor i := 0; i < len(tapScriptLeaves); i++ {\n\t\t\t\tnumLeafBytes := prand.Intn(1000)\n\t\t\t\tscriptBytes := make([]byte, numLeafBytes)\n\t\t\t\tif _, err := prand.Read(scriptBytes[:]); err != nil {\n\t\t\t\t\tt.Fatalf(\"unable to read rand bytes: %v\", err)\n\t\t\t\t}\n\t\t\t\ttapScriptLeaves[i] = NewBaseTapLeaf(scriptBytes)\n\t\t\t}\n\n\t\t\tscriptTree := AssembleTaprootScriptTree(tapScriptLeaves...)\n\n\t\t\tif testCase.treeMutateFunc != nil {\n\t\t\t\ttestCase.treeMutateFunc(scriptTree)\n\t\t\t}\n\n\t\t\tinternalKey, _ := btcec.NewPrivateKey()\n\n\t\t\trootHash := scriptTree.RootNode.TapHash()\n\t\t\toutputKey := ComputeTaprootOutputKey(\n\t\t\t\tinternalKey.PubKey(), rootHash[:],\n\t\t\t)\n\n\t\t\tfor _, leafProof := range scriptTree.LeafMerkleProofs {\n\t\t\t\tctrlBlock := leafProof.ToControlBlock(\n\t\t\t\t\tinternalKey.PubKey(),\n\t\t\t\t)\n\n\t\t\t\tif testCase.ctrlBlockMutateFunc != nil {\n\t\t\t\t\ttestCase.ctrlBlockMutateFunc(&ctrlBlock)\n\t\t\t\t}\n\n\t\t\t\terr := VerifyTaprootLeafCommitment(\n\t\t\t\t\t&ctrlBlock, schnorr.SerializePubKey(outputKey),\n\t\t\t\t\tleafProof.TapLeaf.Script,\n\t\t\t\t)\n\t\t\t\tvalid := err == nil\n\n\t\t\t\tif valid != testCase.valid {\n\t\t\t\t\tt.Fatalf(\"test case mismatch: expected \"+\n\t\t\t\t\t\t\"valid=%v, got valid=%v\", testCase.valid,\n\t\t\t\t\t\tvalid)\n\t\t\t\t}\n\n\t\t\t\tif !valid {\n\t\t\t\t\tif !IsErrorCode(err, testCase.expectedErr) {\n\t\t\t\t\t\tt.Fatalf(\"expected error \"+\n\t\t\t\t\t\t\t\"code %v, got %v\",\n\t\t\t\t\t\t\ttestCase.expectedErr,\n\t\t\t\t\t\t\terr)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// TODO(roasbeef): index correctness\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "txscript/template.go",
    "content": "package txscript\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"text/template\"\n)\n\n// ScriptTemplateOpt is a function type for configuring the script template.\ntype ScriptTemplateOption func(*templateConfig)\n\n// templateConfig holds the configuration for the script template.\ntype templateConfig struct {\n\tparams map[string]interface{}\n\n\tcustomFuncs template.FuncMap\n}\n\n// WithScriptTemplateParams adds parameters to the script template.\nfunc WithScriptTemplateParams(params map[string]interface{}) ScriptTemplateOption {\n\treturn func(cfg *templateConfig) {\n\t\tfor k, v := range params {\n\t\t\tcfg.params[k] = v\n\t\t}\n\t}\n}\n\n// WithCustomTemplateFunc adds a custom function to the template.\nfunc WithCustomTemplateFunc(name string, fn interface{}) ScriptTemplateOption {\n\treturn func(cfg *templateConfig) {\n\t\tcfg.customFuncs[name] = fn\n\t}\n}\n\n// ScriptTemplate processes a script template with parameters and returns the\n// corresponding script bytes. This functions allows Bitcoin scripts to be\n// created using a DSL-like syntax, based on Go's templating system.\n//\n// An example of a simple p2pkh template would be:\n//\n//\t`OP_DUP OP_HASH160 0x14e8948c7afa71b6e6fad621256474b5959e0305 OP_EQUALVERIFY OP_CHECKSIG`\n//\n// Strings that have the `0x` prefix are assumed to byte strings to be pushed\n// ontop of the stack. Integers can be passed as normal. If a value can't be\n// parsed as an integer, then it's assume that it's a byte slice without the 0x\n// prefix.\n//\n// Normal go template operations can be used as well. The params argument\n// houses paramters to pass into the script, for example a local variable\n// storing a computed public key.\nfunc ScriptTemplate(scriptTmpl string, opts ...ScriptTemplateOption) ([]byte, error) {\n\tcfg := &templateConfig{\n\t\tparams:      make(map[string]interface{}),\n\t\tcustomFuncs: make(template.FuncMap),\n\t}\n\n\tfor _, opt := range opts {\n\t\topt(cfg)\n\t}\n\n\tfuncMap := template.FuncMap{\n\t\t\"hex\":        hexEncode,\n\t\t\"hex_str\":    hexStr,\n\t\t\"unhex\":      hexDecode,\n\t\t\"range_iter\": rangeIter,\n\t}\n\n\tfor k, v := range cfg.customFuncs {\n\t\tfuncMap[k] = v\n\t}\n\n\ttmpl, err := template.New(\"script\").Funcs(funcMap).Parse(scriptTmpl)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse template: %w\", err)\n\t}\n\n\tvar buf bytes.Buffer\n\tif err := tmpl.Execute(&buf, cfg.params); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to execute template: %w\", err)\n\t}\n\n\treturn processScript(buf.String())\n}\n\n// looksLikeInt checks if a string looks like an integer.\nfunc looksLikeInt(s string) bool {\n\t// Check if the string starts with an optional sign.\n\tif len(s) > 0 && (s[0] == '+' || s[0] == '-') {\n\t\ts = s[1:]\n\t}\n\n\t// Check if the remaining string contains only digits.\n\tfor _, c := range s {\n\t\tif c < '0' || c > '9' {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn len(s) > 0\n}\n\n// processScript converts the template output to actual script bytes. We scan\n// each line, then go through each element one by one, deciding to either add a\n// normal op code, a push data, or an integer value.\nfunc processScript(script string) ([]byte, error) {\n\tvar builder ScriptBuilder\n\n\t// We'll a bufio scanner to take care of some of the parsing for us.\n\t// bufio.ScanWords will split on word boundaries, based on unicode\n\t// characters.\n\tscanner := bufio.NewScanner(strings.NewReader(script))\n\tscanner.Split(bufio.ScanWords)\n\n\t// Run through each word, deciding if we should add an op code, a push\n\t// data, or an integer value.\n\tfor scanner.Scan() {\n\t\ttoken := scanner.Text()\n\t\tswitch {\n\t\t// If it starts with OP_, then we'll try to parse out the op\n\t\t// code.\n\t\tcase strings.HasPrefix(token, \"OP_\"):\n\t\t\topcode, ok := OpcodeByName[token]\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"unknown opcode: \"+\n\t\t\t\t\t\"%s\", token)\n\t\t\t}\n\n\t\t\tbuilder.AddOp(opcode)\n\n\t\t// If it has an 0x prefix, then we'll try to decode it as a hex\n\t\t// string to push data.\n\t\tcase strings.HasPrefix(token, \"0x\"):\n\t\t\tdata, err := hex.DecodeString(\n\t\t\t\tstrings.TrimPrefix(token, \"0x\"),\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid hex \"+\n\t\t\t\t\t\"data: %s\", token)\n\t\t\t}\n\n\t\t\tbuilder.AddData(data)\n\n\t\t// Next, we'll try to parse ints for the integer op code.\n\t\tcase looksLikeInt(token):\n\t\t\tval, err := strconv.ParseInt(token, 10, 64)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid \"+\n\t\t\t\t\t\"integer: %s\", token)\n\t\t\t}\n\n\t\t\tbuilder.AddInt64(val)\n\n\t\t// Otherwise, we assume it's a byte string without the 0x\n\t\t// prefix.\n\t\tdefault:\n\t\t\tdata, err := hex.DecodeString(token)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid token: %s\",\n\t\t\t\t\ttoken)\n\t\t\t}\n\n\t\t\tbuilder.AddData(data)\n\t\t}\n\t}\n\n\tif err := scanner.Err(); err != nil {\n\t\treturn nil, fmt.Errorf(\"error reading script: %w\", err)\n\t}\n\n\treturn builder.Script()\n}\n\n// rangeIter is useful for being able to execute a bounded for loop.\nfunc rangeIter(start, end int) []int {\n\tvar result []int\n\n\tfor i := start; i < end; i++ {\n\t\tresult = append(result, i)\n\t}\n\n\treturn result\n}\n\n// hexEncode is a helper function to encode bytes to hex in templates.\n// It adds the \"0x\" prefix to ensure the output is processed as hex data\n// and not misinterpreted as an integer.\nfunc hexEncode(data []byte) string {\n\treturn \"0x\" + hex.EncodeToString(data)\n}\n\n// hexStr is a helper function to encode bytes to a raw hex string in templates\n// without the \"0x\" prefix.\nfunc hexStr(data []byte) string {\n\treturn hex.EncodeToString(data)\n}\n\n// hexDecode is a helper function to decode hex to bytes in templates\nfunc hexDecode(s string) ([]byte, error) {\n\treturn hex.DecodeString(strings.TrimPrefix(s, \"0x\"))\n}\n\n// Example usage:\nfunc ExampleScriptTemplate() {\n\tlocalPubkey, _ := hex.DecodeString(\"14e8948c7afa71b6e6fad621256474b5959e0305\")\n\n\tscriptBytes, err := ScriptTemplate(`\n\t\tOP_DUP OP_HASH160 0x14e8948c7afa71b6e6fad621256474b5959e0305 OP_EQUALVERIFY OP_CHECKSIG\n\t\tOP_DUP OP_HASH160 {{ hex .LocalPubkeyHash }} OP_EQUALVERIFY OP_CHECKSIG\n\t\t{{ .Timeout }} OP_CHECKLOCKTIMEVERIFY OP_DROP\n\t\t\n\t\t{{- range $i := range_iter 0 3 }}\n\t\t\t{{ add 10 $i }} OP_ADD\n\t\t{{- end }}`,\n\t\tWithScriptTemplateParams(map[string]interface{}{\n\t\t\t\"LocalPubkeyHash\": localPubkey,\n\t\t\t\"Timeout\":         1,\n\t\t}),\n\t)\n\tif err != nil {\n\t\tfmt.Printf(\"Error: %v\\n\", err)\n\t\treturn\n\t}\n\n\tasmScript, err := DisasmString(scriptBytes)\n\tif err != nil {\n\t\tfmt.Printf(\"Error converting to ASM: %v\\n\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"Script ASM:\\n%s\\n\", asmScript)\n}\n"
  },
  {
    "path": "txscript/template_test.go",
    "content": "package txscript\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestScriptTemplateLooksLikeInt tests the looksLikeInt function.\nfunc TestScriptTemplateLooksLikeInt(t *testing.T) {\n\ttests := []struct {\n\t\tinput    string\n\t\texpected bool\n\t}{\n\t\t{\"123\", true},\n\t\t{\"-123\", true},\n\t\t{\"+123\", true},\n\t\t{\"0\", true},\n\t\t{\"+0\", true},\n\t\t{\"-0\", true},\n\t\t{\"abc\", false},\n\t\t{\"12a\", false},\n\t\t{\"\", false},\n\t\t{\"+\", false},\n\t\t{\"-\", false},\n\t\t{\"++123\", false},\n\t\t{\"--123\", false},\n\t\t{\"+-123\", false},\n\t\t{\"1.23\", false},\n\t}\n\n\tfor _, test := range tests {\n\t\tresult := looksLikeInt(test.input)\n\t\trequire.Equal(\n\t\t\tt, test.expected, result,\n\t\t\t\"looksLikeInt(%q) = %v, want %v\",\n\t\t\ttest.input, result, test.expected,\n\t\t)\n\t}\n}\n\n// TestScriptTemplate tests the ScriptTemplate function.\nfunc TestScriptTemplate(t *testing.T) {\n\ttests := []struct {\n\t\tname       string\n\t\ttemplate   string\n\t\tparams     map[string]interface{}\n\t\tcustomFunc map[string]interface{}\n\t\texpected   string\n\t\twantErr    bool\n\t}{\n\t\t{\n\t\t\tname: \"simple P2PKH\",\n\t\t\ttemplate: \"OP_DUP OP_HASH160 \" +\n\t\t\t\t\"0x14e8948c7afa71b6e6fad621256474b5959e0305 \" +\n\t\t\t\t\"OP_EQUALVERIFY OP_CHECKSIG\",\n\t\t\tparams: nil,\n\t\t\texpected: \"OP_DUP OP_HASH160 \" +\n\t\t\t\t\"14e8948c7afa71b6e6fad621256474b5959e0305 \" +\n\t\t\t\t\"OP_EQUALVERIFY OP_CHECKSIG\",\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"with positive integer\",\n\t\t\ttemplate: \"123 OP_ADD\",\n\t\t\tparams:   nil,\n\t\t\texpected: \"7b OP_ADD\",\n\t\t\twantErr:  false,\n\t\t},\n\t\t{\n\t\t\tname:     \"with negative integer\",\n\t\t\ttemplate: \"-42 OP_ADD\",\n\t\t\tparams:   nil,\n\t\t\texpected: \"aa OP_ADD\",\n\t\t\twantErr:  false,\n\t\t},\n\t\t{\n\t\t\tname:     \"with zero bytes for OP_CHECKSIG\",\n\t\t\ttemplate: \"0x0000000000000000000000000000000000000000000000000000000000000000 OP_CHECKSIG\",\n\t\t\tparams:   nil,\n\t\t\texpected: \"0000000000000000000000000000000000000000000000000000000000000000 OP_CHECKSIG\",\n\t\t\twantErr:  false,\n\t\t},\n\t\t{\n\t\t\tname:     \"with hex template function for zero bytes\",\n\t\t\ttemplate: \"{{ hex .ZeroSig }} OP_CHECKSIG\",\n\t\t\tparams: map[string]interface{}{\n\t\t\t\t\"ZeroSig\": make([]byte, 32),\n\t\t\t},\n\t\t\texpected: \"0000000000000000000000000000000000000000000000000000000000000000 OP_CHECKSIG\",\n\t\t\twantErr:  false,\n\t\t},\n\t\t{\n\t\t\tname:     \"with hex data without 0x prefix\",\n\t\t\ttemplate: \"abcdef OP_ADD\",\n\t\t\tparams:   nil,\n\t\t\texpected: \"abcdef OP_ADD\",\n\t\t\twantErr:  false,\n\t\t},\n\t\t{\n\t\t\tname: \"with template parameter\",\n\t\t\ttemplate: \"OP_DUP OP_HASH160 {{ hex .Pubkey }} \" +\n\t\t\t\t\"OP_EQUALVERIFY OP_CHECKSIG\",\n\t\t\tparams: map[string]interface{}{\n\t\t\t\t\"Pubkey\": []byte{\n\t\t\t\t\t0x14, 0xe8, 0x94, 0x8c, 0x7a, 0xfa,\n\t\t\t\t\t0x71, 0xb6, 0xe6, 0xfa, 0xd6, 0x21,\n\t\t\t\t\t0x25, 0x64, 0x74, 0xb5, 0x95, 0x9e,\n\t\t\t\t\t0x03, 0x05,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"OP_DUP OP_HASH160 \" +\n\t\t\t\t\"14e8948c7afa71b6e6fad621256474b5959e0305 \" +\n\t\t\t\t\"OP_EQUALVERIFY OP_CHECKSIG\",\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"with range iteration\",\n\t\t\ttemplate: `\n\t\t\t{{ range $i := range_iter 1 4 }}\n\t\t\tOP_DUP OP_HASH160\n\t\t\t{{ if eq $i 1 }}\n\t\t\t    0x01\n\t\t\t{{ else if eq $i 2 }}\n\t\t\t    0x02\n\t\t\t{{ else }}\n\t\t\t   0x03\n\t\t\t{{ end }}\n\t\t\tOP_EQUALVERIFY {{ end }}\n\t\t\tOP_CHECKSIG`,\n\t\t\tparams: nil,\n\t\t\texpected: \"OP_DUP OP_HASH160 1 OP_EQUALVERIFY \" +\n\t\t\t\t\"OP_DUP OP_HASH160 2 OP_EQUALVERIFY \" +\n\t\t\t\t\"OP_DUP OP_HASH160 3 OP_EQUALVERIFY \" +\n\t\t\t\t\"OP_CHECKSIG\",\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"with custom function\",\n\t\t\ttemplate: \"{{ add 10 5 }} OP_DROP\",\n\t\t\tparams:   nil,\n\t\t\tcustomFunc: map[string]interface{}{\n\t\t\t\t\"add\": func(a, b int) int {\n\t\t\t\t\treturn a + b\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: \"15 OP_DROP\",\n\t\t\twantErr:  false,\n\t\t},\n\t\t{\n\t\t\tname:     \"invalid opcode\",\n\t\t\ttemplate: \"OP_UNKNOWN\",\n\t\t\tparams:   nil,\n\t\t\twantErr:  true,\n\t\t},\n\t\t{\n\t\t\tname:     \"invalid hex\",\n\t\t\ttemplate: \"0xZZ\",\n\t\t\tparams:   nil,\n\t\t\twantErr:  true,\n\t\t},\n\t\t{\n\t\t\tname:     \"invalid integer\",\n\t\t\ttemplate: \"9999999999999999999999999999\",\n\t\t\tparams:   nil,\n\t\t\twantErr:  true,\n\t\t},\n\t\t{\n\t\t\tname:     \"invalid token\",\n\t\t\ttemplate: \"not_hex_or_op\",\n\t\t\tparams:   nil,\n\t\t\twantErr:  true,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tvar opts []ScriptTemplateOption\n\t\t\tif test.params != nil {\n\t\t\t\topts = append(\n\t\t\t\t\topts,\n\t\t\t\t\tWithScriptTemplateParams(test.params),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Add custom functions if specified.\n\t\t\tfor name, fn := range test.customFunc {\n\t\t\t\topts = append(\n\t\t\t\t\topts, WithCustomTemplateFunc(name, fn),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tscript, err := ScriptTemplate(test.template, opts...)\n\n\t\t\tif test.wantErr {\n\t\t\t\trequire.Error(\n\t\t\t\t\tt, err,\n\t\t\t\t\t\"ScriptTemplate(%q) expected error, got nil\",\n\t\t\t\t\ttest.template,\n\t\t\t\t)\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\trequire.NoError(\n\t\t\t\tt, err,\n\t\t\t\t\"ScriptTemplate(%q) unexpected error\",\n\t\t\t\ttest.template,\n\t\t\t)\n\n\t\t\t// Disassemble the script and compare the string\n\t\t\t// representation.\n\t\t\tdisasm, err := DisasmString(script)\n\t\t\trequire.NoError(t, err, \"Failed to disassemble script\")\n\n\t\t\trequire.Equal(\n\t\t\t\tt, test.expected, disasm,\n\t\t\t\t\"ScriptTemplate(%q):\\ngot:  %s\\nwant: %s\",\n\t\t\t\ttest.template, disasm, test.expected,\n\t\t\t)\n\t\t})\n\t}\n}\n\n// TestScriptTemplateOptions tests the ScriptTemplate option functions.\nfunc TestScriptTemplateOptions(t *testing.T) {\n\tt.Run(\"WithScriptTemplateParams\", func(t *testing.T) {\n\t\ttemplate := \"{{ .Value }} OP_DROP\"\n\t\tparams := map[string]interface{}{\n\t\t\t\"Value\": 42,\n\t\t}\n\n\t\tscript, err := ScriptTemplate(\n\t\t\ttemplate, WithScriptTemplateParams(params),\n\t\t)\n\t\trequire.NoError(t, err, \"unexpected error\")\n\n\t\tdisasm, err := DisasmString(script)\n\t\trequire.NoError(t, err, \"Failed to disassemble script\")\n\n\t\texpected := \"2a OP_DROP\"\n\t\trequire.Equal(\n\t\t\tt, expected, disasm,\n\t\t\t\"ScriptTemplate(%q):\\ngot:  %s\\nwant: %s\",\n\t\t\ttemplate, disasm, expected,\n\t\t)\n\t})\n\n\tt.Run(\"WithCustomTemplateFunc\", func(t *testing.T) {\n\t\ttemplate := \"{{ multiply 6 7 }} OP_DROP\"\n\t\tscript, err := ScriptTemplate(\n\t\t\ttemplate,\n\t\t\tWithCustomTemplateFunc(\"multiply\", func(a, b int) int {\n\t\t\t\treturn a * b\n\t\t\t}),\n\t\t)\n\t\trequire.NoError(t, err, \"Unexpected error\")\n\n\t\tdisasm, err := DisasmString(script)\n\t\trequire.NoError(t, err, \"Failed to disassemble script\")\n\n\t\texpected := \"2a OP_DROP\"\n\t\trequire.Equal(\n\t\t\tt, expected, disasm,\n\t\t\t\"ScriptTemplate(%q):\\ngot:  %s\\nwant: %s\",\n\t\t\ttemplate, disasm, expected,\n\t\t)\n\t})\n}\n\n// TestScriptTemplateHelperFunctions tests the helper functions used in\n// templates.\nfunc TestScriptTemplateHelperFunctions(t *testing.T) {\n\tt.Run(\"rangeIter\", func(t *testing.T) {\n\t\tresult := rangeIter(2, 5)\n\t\texpected := []int{2, 3, 4}\n\n\t\trequire.Equal(\n\t\t\tt, expected, result,\n\t\t\t\"rangeIter(2, 5) returned unexpected result\",\n\t\t)\n\t})\n\n\tt.Run(\"hexEncode\", func(t *testing.T) {\n\t\tinput := []byte{0x12, 0x34, 0x56}\n\t\tresult := hexEncode(input)\n\t\texpected := \"0x123456\"\n\n\t\trequire.Equal(\n\t\t\tt, expected, result,\n\t\t\t\"hexEncode(%v) = %q, want %q\",\n\t\t\tinput, result, expected,\n\t\t)\n\t})\n\n\tt.Run(\"hexStr\", func(t *testing.T) {\n\t\tinput := []byte{0x12, 0x34, 0x56}\n\t\tresult := hexStr(input)\n\t\texpected := \"123456\"\n\n\t\trequire.Equal(\n\t\t\tt, expected, result,\n\t\t\t\"hexStr(%v) = %q, want %q\",\n\t\t\tinput, result, expected,\n\t\t)\n\t})\n\n\tt.Run(\"hexDecode\", func(t *testing.T) {\n\t\ttests := []struct {\n\t\t\tinput    string\n\t\t\texpected []byte\n\t\t\twantErr  bool\n\t\t}{\n\t\t\t{\"123456\", []byte{0x12, 0x34, 0x56}, false},\n\t\t\t{\"0x123456\", []byte{0x12, 0x34, 0x56}, false},\n\t\t\t{\"zz\", nil, true},\n\t\t}\n\n\t\tfor _, test := range tests {\n\t\t\tresult, err := hexDecode(test.input)\n\n\t\t\tif test.wantErr {\n\t\t\t\trequire.Error(\n\t\t\t\t\tt, err,\n\t\t\t\t\t\"hexDecode(%q) expected error, got nil\",\n\t\t\t\t\ttest.input,\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\trequire.NoError(\n\t\t\t\tt, err,\n\t\t\t\t\"hexDecode(%q) unexpected error\",\n\t\t\t\ttest.input,\n\t\t\t)\n\n\t\t\trequire.Equal(\n\t\t\t\tt, test.expected, result,\n\t\t\t\t\"hexDecode(%q) = %v, want %v\",\n\t\t\t\ttest.input, result, test.expected,\n\t\t\t)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "txscript/tokenizer.go",
    "content": "// Copyright (c) 2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n)\n\n// opcodeArrayRef is used to break initialization cycles.\nvar opcodeArrayRef *[256]opcode\n\nfunc init() {\n\topcodeArrayRef = &opcodeArray\n}\n\n// ScriptTokenizer provides a facility for easily and efficiently tokenizing\n// transaction scripts without creating allocations.  Each successive opcode is\n// parsed with the Next function, which returns false when iteration is\n// complete, either due to successfully tokenizing the entire script or\n// encountering a parse error.  In the case of failure, the Err function may be\n// used to obtain the specific parse error.\n//\n// Upon successfully parsing an opcode, the opcode and data associated with it\n// may be obtained via the Opcode and Data functions, respectively.\n//\n// The ByteIndex function may be used to obtain the tokenizer's current offset\n// into the raw script.\ntype ScriptTokenizer struct {\n\tscript    []byte\n\tversion   uint16\n\toffset    int32\n\topcodePos int32\n\top        *opcode\n\tdata      []byte\n\terr       error\n}\n\n// Done returns true when either all opcodes have been exhausted or a parse\n// failure was encountered and therefore the state has an associated error.\nfunc (t *ScriptTokenizer) Done() bool {\n\treturn t.err != nil || t.offset >= int32(len(t.script))\n}\n\n// Next attempts to parse the next opcode and returns whether or not it was\n// successful.  It will not be successful if invoked when already at the end of\n// the script, a parse failure is encountered, or an associated error already\n// exists due to a previous parse failure.\n//\n// In the case of a true return, the parsed opcode and data can be obtained with\n// the associated functions and the offset into the script will either point to\n// the next opcode or the end of the script if the final opcode was parsed.\n//\n// In the case of a false return, the parsed opcode and data will be the last\n// successfully parsed values (if any) and the offset into the script will\n// either point to the failing opcode or the end of the script if the function\n// was invoked when already at the end of the script.\n//\n// Invoking this function when already at the end of the script is not\n// considered an error and will simply return false.\nfunc (t *ScriptTokenizer) Next() bool {\n\tif t.Done() {\n\t\treturn false\n\t}\n\n\t// Increment the op code position each time we attempt to parse the\n\t// next op code. Note that since the starting value is -1 (no op codes\n\t// parsed), by incrementing here, we start at 0, then 1, and so on for\n\t// the other op codes.\n\tt.opcodePos++\n\n\top := &opcodeArrayRef[t.script[t.offset]]\n\tswitch {\n\t// No additional data.  Note that some of the opcodes, notably OP_1NEGATE,\n\t// OP_0, and OP_[1-16] represent the data themselves.\n\tcase op.length == 1:\n\t\tt.offset++\n\t\tt.op = op\n\t\tt.data = nil\n\t\treturn true\n\n\t// Data pushes of specific lengths -- OP_DATA_[1-75].\n\tcase op.length > 1:\n\t\tscript := t.script[t.offset:]\n\t\tif len(script) < op.length {\n\t\t\tstr := fmt.Sprintf(\"opcode %s requires %d bytes, but script only \"+\n\t\t\t\t\"has %d remaining\", op.name, op.length, len(script))\n\t\t\tt.err = scriptError(ErrMalformedPush, str)\n\t\t\treturn false\n\t\t}\n\n\t\t// Move the offset forward and set the opcode and data accordingly.\n\t\tt.offset += int32(op.length)\n\t\tt.op = op\n\t\tt.data = script[1:op.length]\n\t\treturn true\n\n\t// Data pushes with parsed lengths -- OP_PUSHDATA{1,2,4}.\n\tcase op.length < 0:\n\t\tscript := t.script[t.offset+1:]\n\t\tif len(script) < -op.length {\n\t\t\tstr := fmt.Sprintf(\"opcode %s requires %d bytes, but script only \"+\n\t\t\t\t\"has %d remaining\", op.name, -op.length, len(script))\n\t\t\tt.err = scriptError(ErrMalformedPush, str)\n\t\t\treturn false\n\t\t}\n\n\t\t// Next -length bytes are little endian length of data.\n\t\tvar dataLen int32\n\t\tswitch op.length {\n\t\tcase -1:\n\t\t\tdataLen = int32(script[0])\n\t\tcase -2:\n\t\t\tdataLen = int32(binary.LittleEndian.Uint16(script[:2]))\n\t\tcase -4:\n\t\t\tdataLen = int32(binary.LittleEndian.Uint32(script[:4]))\n\t\tdefault:\n\t\t\t// In practice it should be impossible to hit this\n\t\t\t// check as each op code is predefined, and only uses\n\t\t\t// the specified lengths.\n\t\t\tstr := fmt.Sprintf(\"invalid opcode length %d\", op.length)\n\t\t\tt.err = scriptError(ErrMalformedPush, str)\n\t\t\treturn false\n\t\t}\n\n\t\t// Move to the beginning of the data.\n\t\tscript = script[-op.length:]\n\n\t\t// Disallow entries that do not fit script or were sign extended.\n\t\tif dataLen > int32(len(script)) || dataLen < 0 {\n\t\t\tstr := fmt.Sprintf(\"opcode %s pushes %d bytes, but script only \"+\n\t\t\t\t\"has %d remaining\", op.name, dataLen, len(script))\n\t\t\tt.err = scriptError(ErrMalformedPush, str)\n\t\t\treturn false\n\t\t}\n\n\t\t// Move the offset forward and set the opcode and data accordingly.\n\t\tt.offset += 1 + int32(-op.length) + dataLen\n\t\tt.op = op\n\t\tt.data = script[:dataLen]\n\t\treturn true\n\t}\n\n\t// The only remaining case is an opcode with length zero which is\n\t// impossible.\n\tpanic(\"unreachable\")\n}\n\n// Script returns the full script associated with the tokenizer.\nfunc (t *ScriptTokenizer) Script() []byte {\n\treturn t.script\n}\n\n// ByteIndex returns the current offset into the full script that will be parsed\n// next and therefore also implies everything before it has already been parsed.\nfunc (t *ScriptTokenizer) ByteIndex() int32 {\n\treturn t.offset\n}\n\n// OpcodePosition returns the current op code counter. Unlike the ByteIndex\n// above (referred to as the program counter or pc at times), this is\n// incremented with each node op code, and isn't incremented more than once for\n// push datas.\n//\n// NOTE: If no op codes have been parsed, this returns -1.\nfunc (t *ScriptTokenizer) OpcodePosition() int32 {\n\treturn t.opcodePos\n}\n\n// Opcode returns the current opcode associated with the tokenizer.\nfunc (t *ScriptTokenizer) Opcode() byte {\n\treturn t.op.value\n}\n\n// Data returns the data associated with the most recently successfully parsed\n// opcode.\nfunc (t *ScriptTokenizer) Data() []byte {\n\treturn t.data\n}\n\n// Err returns any errors currently associated with the tokenizer.  This will\n// only be non-nil in the case a parsing error was encountered.\nfunc (t *ScriptTokenizer) Err() error {\n\treturn t.err\n}\n\n// MakeScriptTokenizer returns a new instance of a script tokenizer.  Passing\n// an unsupported script version will result in the returned tokenizer\n// immediately having an err set accordingly.\n//\n// See the docs for ScriptTokenizer for more details.\nfunc MakeScriptTokenizer(scriptVersion uint16, script []byte) ScriptTokenizer {\n\t// Only version 0 scripts are currently supported.\n\tvar err error\n\tif scriptVersion != 0 {\n\t\tstr := fmt.Sprintf(\"script version %d is not supported\", scriptVersion)\n\t\terr = scriptError(ErrUnsupportedScriptVersion, str)\n\n\t}\n\treturn ScriptTokenizer{\n\t\tversion: scriptVersion,\n\t\tscript:  script,\n\t\terr:     err,\n\t\t// We use a value of negative 1 here so the first op code has a value of 0.\n\t\topcodePos: -1,\n\t}\n}\n"
  },
  {
    "path": "txscript/tokenizer_test.go",
    "content": "// Copyright (c) 2019 The Decred developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage txscript\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"testing\"\n)\n\n// TestScriptTokenizer ensures a wide variety of behavior provided by the script\n// tokenizer performs as expected.\nfunc TestScriptTokenizer(t *testing.T) {\n\tt.Skip()\n\n\ttype expectedResult struct {\n\t\top    byte   // expected parsed opcode\n\t\tdata  []byte // expected parsed data\n\t\tindex int32  // expected index into raw script after parsing token\n\t}\n\n\ttype tokenizerTest struct {\n\t\tname     string           // test description\n\t\tscript   []byte           // the script to tokenize\n\t\texpected []expectedResult // the expected info after parsing each token\n\t\tfinalIdx int32            // the expected final byte index\n\t\terr      error            // expected error\n\t}\n\n\t// Add both positive and negative tests for OP_DATA_1 through OP_DATA_75.\n\tconst numTestsHint = 100 // Make prealloc linter happy.\n\ttests := make([]tokenizerTest, 0, numTestsHint)\n\tfor op := byte(OP_DATA_1); op < OP_DATA_75; op++ {\n\t\tdata := bytes.Repeat([]byte{0x01}, int(op))\n\t\ttests = append(tests, tokenizerTest{\n\t\t\tname:     fmt.Sprintf(\"OP_DATA_%d\", op),\n\t\t\tscript:   append([]byte{op}, data...),\n\t\t\texpected: []expectedResult{{op, data, 1 + int32(op)}},\n\t\t\tfinalIdx: 1 + int32(op),\n\t\t\terr:      nil,\n\t\t})\n\n\t\t// Create test that provides one less byte than the data push requires.\n\t\ttests = append(tests, tokenizerTest{\n\t\t\tname:     fmt.Sprintf(\"short OP_DATA_%d\", op),\n\t\t\tscript:   append([]byte{op}, data[1:]...),\n\t\t\texpected: nil,\n\t\t\tfinalIdx: 0,\n\t\t\terr:      scriptError(ErrMalformedPush, \"\"),\n\t\t})\n\t}\n\n\t// Add both positive and negative tests for OP_PUSHDATA{1,2,4}.\n\tdata := mustParseShortForm(\"0x01{76}\")\n\ttests = append(tests, []tokenizerTest{{\n\t\tname:     \"OP_PUSHDATA1\",\n\t\tscript:   mustParseShortForm(\"OP_PUSHDATA1 0x4c 0x01{76}\"),\n\t\texpected: []expectedResult{{OP_PUSHDATA1, data, 2 + int32(len(data))}},\n\t\tfinalIdx: 2 + int32(len(data)),\n\t\terr:      nil,\n\t}, {\n\t\tname:     \"OP_PUSHDATA1 no data length\",\n\t\tscript:   mustParseShortForm(\"OP_PUSHDATA1\"),\n\t\texpected: nil,\n\t\tfinalIdx: 0,\n\t\terr:      scriptError(ErrMalformedPush, \"\"),\n\t}, {\n\t\tname:     \"OP_PUSHDATA1 short data by 1 byte\",\n\t\tscript:   mustParseShortForm(\"OP_PUSHDATA1 0x4c 0x01{75}\"),\n\t\texpected: nil,\n\t\tfinalIdx: 0,\n\t\terr:      scriptError(ErrMalformedPush, \"\"),\n\t}, {\n\t\tname:     \"OP_PUSHDATA2\",\n\t\tscript:   mustParseShortForm(\"OP_PUSHDATA2 0x4c00 0x01{76}\"),\n\t\texpected: []expectedResult{{OP_PUSHDATA2, data, 3 + int32(len(data))}},\n\t\tfinalIdx: 3 + int32(len(data)),\n\t\terr:      nil,\n\t}, {\n\t\tname:     \"OP_PUSHDATA2 no data length\",\n\t\tscript:   mustParseShortForm(\"OP_PUSHDATA2\"),\n\t\texpected: nil,\n\t\tfinalIdx: 0,\n\t\terr:      scriptError(ErrMalformedPush, \"\"),\n\t}, {\n\t\tname:     \"OP_PUSHDATA2 short data by 1 byte\",\n\t\tscript:   mustParseShortForm(\"OP_PUSHDATA2 0x4c00 0x01{75}\"),\n\t\texpected: nil,\n\t\tfinalIdx: 0,\n\t\terr:      scriptError(ErrMalformedPush, \"\"),\n\t}, {\n\t\tname:     \"OP_PUSHDATA4\",\n\t\tscript:   mustParseShortForm(\"OP_PUSHDATA4 0x4c000000 0x01{76}\"),\n\t\texpected: []expectedResult{{OP_PUSHDATA4, data, 5 + int32(len(data))}},\n\t\tfinalIdx: 5 + int32(len(data)),\n\t\terr:      nil,\n\t}, {\n\t\tname:     \"OP_PUSHDATA4 no data length\",\n\t\tscript:   mustParseShortForm(\"OP_PUSHDATA4\"),\n\t\texpected: nil,\n\t\tfinalIdx: 0,\n\t\terr:      scriptError(ErrMalformedPush, \"\"),\n\t}, {\n\t\tname:     \"OP_PUSHDATA4 short data by 1 byte\",\n\t\tscript:   mustParseShortForm(\"OP_PUSHDATA4 0x4c000000 0x01{75}\"),\n\t\texpected: nil,\n\t\tfinalIdx: 0,\n\t\terr:      scriptError(ErrMalformedPush, \"\"),\n\t}}...)\n\n\t// Add tests for OP_0, and OP_1 through OP_16 (small integers/true/false).\n\topcodes := []byte{OP_0}\n\tfor op := byte(OP_1); op < OP_16; op++ {\n\t\topcodes = append(opcodes, op)\n\t}\n\tfor _, op := range opcodes {\n\t\ttests = append(tests, tokenizerTest{\n\t\t\tname:     fmt.Sprintf(\"OP_%d\", op),\n\t\t\tscript:   []byte{op},\n\t\t\texpected: []expectedResult{{op, nil, 1}},\n\t\t\tfinalIdx: 1,\n\t\t\terr:      nil,\n\t\t})\n\t}\n\n\t// Add various positive and negative tests for multi-opcode scripts.\n\ttests = append(tests, []tokenizerTest{{\n\t\tname:   \"pay-to-pubkey-hash\",\n\t\tscript: mustParseShortForm(\"DUP HASH160 DATA_20 0x01{20} EQUAL CHECKSIG\"),\n\t\texpected: []expectedResult{\n\t\t\t{OP_DUP, nil, 1}, {OP_HASH160, nil, 2},\n\t\t\t{OP_DATA_20, mustParseShortForm(\"0x01{20}\"), 23},\n\t\t\t{OP_EQUAL, nil, 24}, {OP_CHECKSIG, nil, 25},\n\t\t},\n\t\tfinalIdx: 25,\n\t\terr:      nil,\n\t}, {\n\t\tname:   \"almost pay-to-pubkey-hash (short data)\",\n\t\tscript: mustParseShortForm(\"DUP HASH160 DATA_20 0x01{17} EQUAL CHECKSIG\"),\n\t\texpected: []expectedResult{\n\t\t\t{OP_DUP, nil, 1}, {OP_HASH160, nil, 2},\n\t\t},\n\t\tfinalIdx: 2,\n\t\terr:      scriptError(ErrMalformedPush, \"\"),\n\t}, {\n\t\tname:   \"almost pay-to-pubkey-hash (overlapped data)\",\n\t\tscript: mustParseShortForm(\"DUP HASH160 DATA_20 0x01{19} EQUAL CHECKSIG\"),\n\t\texpected: []expectedResult{\n\t\t\t{OP_DUP, nil, 1}, {OP_HASH160, nil, 2},\n\t\t\t{OP_DATA_20, mustParseShortForm(\"0x01{19} EQUAL\"), 23},\n\t\t\t{OP_CHECKSIG, nil, 24},\n\t\t},\n\t\tfinalIdx: 24,\n\t\terr:      nil,\n\t}, {\n\t\tname:   \"pay-to-script-hash\",\n\t\tscript: mustParseShortForm(\"HASH160 DATA_20 0x01{20} EQUAL\"),\n\t\texpected: []expectedResult{\n\t\t\t{OP_HASH160, nil, 1},\n\t\t\t{OP_DATA_20, mustParseShortForm(\"0x01{20}\"), 22},\n\t\t\t{OP_EQUAL, nil, 23},\n\t\t},\n\t\tfinalIdx: 23,\n\t\terr:      nil,\n\t}, {\n\t\tname:   \"almost pay-to-script-hash (short data)\",\n\t\tscript: mustParseShortForm(\"HASH160 DATA_20 0x01{18} EQUAL\"),\n\t\texpected: []expectedResult{\n\t\t\t{OP_HASH160, nil, 1},\n\t\t},\n\t\tfinalIdx: 1,\n\t\terr:      scriptError(ErrMalformedPush, \"\"),\n\t}, {\n\t\tname:   \"almost pay-to-script-hash (overlapped data)\",\n\t\tscript: mustParseShortForm(\"HASH160 DATA_20 0x01{19} EQUAL\"),\n\t\texpected: []expectedResult{\n\t\t\t{OP_HASH160, nil, 1},\n\t\t\t{OP_DATA_20, mustParseShortForm(\"0x01{19} EQUAL\"), 22},\n\t\t},\n\t\tfinalIdx: 22,\n\t\terr:      nil,\n\t}}...)\n\n\tconst scriptVersion = 0\n\tfor _, test := range tests {\n\t\ttokenizer := MakeScriptTokenizer(scriptVersion, test.script)\n\t\tvar opcodeNum int\n\t\tfor tokenizer.Next() {\n\t\t\t// Ensure Next never returns true when there is an error set.\n\t\t\tif err := tokenizer.Err(); err != nil {\n\t\t\t\tt.Fatalf(\"%q: Next returned true when tokenizer has err: %v\",\n\t\t\t\t\ttest.name, err)\n\t\t\t}\n\n\t\t\t// Ensure the test data expects a token to be parsed.\n\t\t\top := tokenizer.Opcode()\n\t\t\tdata := tokenizer.Data()\n\t\t\tif opcodeNum >= len(test.expected) {\n\t\t\t\tt.Fatalf(\"%q: unexpected token '%d' (data: '%x')\", test.name,\n\t\t\t\t\top, data)\n\t\t\t}\n\t\t\texpected := &test.expected[opcodeNum]\n\n\t\t\t// Ensure the opcode and data are the expected values.\n\t\t\tif op != expected.op {\n\t\t\t\tt.Fatalf(\"%q: unexpected opcode -- got %v, want %v\", test.name,\n\t\t\t\t\top, expected.op)\n\t\t\t}\n\t\t\tif !bytes.Equal(data, expected.data) {\n\t\t\t\tt.Fatalf(\"%q: unexpected data -- got %x, want %x\", test.name,\n\t\t\t\t\tdata, expected.data)\n\t\t\t}\n\n\t\t\ttokenizerIdx := tokenizer.ByteIndex()\n\t\t\tif tokenizerIdx != expected.index {\n\t\t\t\tt.Fatalf(\"%q: unexpected byte index -- got %d, want %d\",\n\t\t\t\t\ttest.name, tokenizerIdx, expected.index)\n\t\t\t}\n\n\t\t\topcodeNum++\n\t\t}\n\n\t\t// Ensure the tokenizer claims it is done.  This should be the case\n\t\t// regardless of whether or not there was a parse error.\n\t\tif !tokenizer.Done() {\n\t\t\tt.Fatalf(\"%q: tokenizer claims it is not done\", test.name)\n\t\t}\n\n\t\t// Ensure the error is as expected.\n\t\tif test.err == nil && tokenizer.Err() != nil {\n\t\t\tt.Fatalf(\"%q: unexpected tokenizer err -- got %v, want nil\",\n\t\t\t\ttest.name, tokenizer.Err())\n\t\t} else if test.err != nil {\n\t\t\tif !IsErrorCode(tokenizer.Err(), test.err.(Error).ErrorCode) {\n\t\t\t\tt.Fatalf(\"%q: unexpected tokenizer err -- got %v, want %v\",\n\t\t\t\t\ttest.name, tokenizer.Err(), test.err.(Error).ErrorCode)\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the final index is the expected value.\n\t\ttokenizerIdx := tokenizer.ByteIndex()\n\t\tif tokenizerIdx != test.finalIdx {\n\t\t\tt.Fatalf(\"%q: unexpected final byte index -- got %d, want %d\",\n\t\t\t\ttest.name, tokenizerIdx, test.finalIdx)\n\t\t}\n\t}\n}\n\n// TestScriptTokenizerUnsupportedVersion ensures the tokenizer fails immediately\n// with an unsupported script version.\nfunc TestScriptTokenizerUnsupportedVersion(t *testing.T) {\n\tconst scriptVersion = 65535\n\ttokenizer := MakeScriptTokenizer(scriptVersion, nil)\n\tif !IsErrorCode(tokenizer.Err(), ErrUnsupportedScriptVersion) {\n\t\tt.Fatalf(\"script tokenizer did not error with unsupported version\")\n\t}\n}\n"
  },
  {
    "path": "upgrade.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\n// dirEmpty returns whether or not the specified directory path is empty.\nfunc dirEmpty(dirPath string) (bool, error) {\n\tf, err := os.Open(dirPath)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tdefer f.Close()\n\n\t// Read the names of a max of one entry from the directory.  When the\n\t// directory is empty, an io.EOF error will be returned, so allow it.\n\tnames, err := f.Readdirnames(1)\n\tif err != nil && err != io.EOF {\n\t\treturn false, err\n\t}\n\n\treturn len(names) == 0, nil\n}\n\n// oldBtcdHomeDir returns the OS specific home directory btcd used prior to\n// version 0.3.3.  This has since been replaced with btcutil.AppDataDir, but\n// this function is still provided for the automatic upgrade path.\nfunc oldBtcdHomeDir() string {\n\t// Search for Windows APPDATA first.  This won't exist on POSIX OSes.\n\tappData := os.Getenv(\"APPDATA\")\n\tif appData != \"\" {\n\t\treturn filepath.Join(appData, \"btcd\")\n\t}\n\n\t// Fall back to standard HOME directory that works for most POSIX OSes.\n\thome := os.Getenv(\"HOME\")\n\tif home != \"\" {\n\t\treturn filepath.Join(home, \".btcd\")\n\t}\n\n\t// In the worst case, use the current directory.\n\treturn \".\"\n}\n\n// upgradeDBPathNet moves the database for a specific network from its\n// location prior to btcd version 0.2.0 and uses heuristics to ascertain the old\n// database type to rename to the new format.\nfunc upgradeDBPathNet(oldDbPath, netName string) error {\n\t// Prior to version 0.2.0, the database was named the same thing for\n\t// both sqlite and leveldb.  Use heuristics to figure out the type\n\t// of the database and move it to the new path and name introduced with\n\t// version 0.2.0 accordingly.\n\tfi, err := os.Stat(oldDbPath)\n\tif err == nil {\n\t\toldDbType := \"sqlite\"\n\t\tif fi.IsDir() {\n\t\t\toldDbType = \"leveldb\"\n\t\t}\n\n\t\t// The new database name is based on the database type and\n\t\t// resides in a directory named after the network type.\n\t\tnewDbRoot := filepath.Join(filepath.Dir(cfg.DataDir), netName)\n\t\tnewDbName := blockDbNamePrefix + \"_\" + oldDbType\n\t\tif oldDbType == \"sqlite\" {\n\t\t\tnewDbName = newDbName + \".db\"\n\t\t}\n\t\tnewDbPath := filepath.Join(newDbRoot, newDbName)\n\n\t\t// Create the new path if needed.\n\t\terr = os.MkdirAll(newDbRoot, 0700)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Move and rename the old database.\n\t\terr := os.Rename(oldDbPath, newDbPath)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// upgradeDBPaths moves the databases from their locations prior to btcd\n// version 0.2.0 to their new locations.\nfunc upgradeDBPaths() error {\n\t// Prior to version 0.2.0, the databases were in the \"db\" directory and\n\t// their names were suffixed by \"testnet\" and \"regtest\" for their\n\t// respective networks.  Check for the old database and update it to the\n\t// new path introduced with version 0.2.0 accordingly.\n\toldDbRoot := filepath.Join(oldBtcdHomeDir(), \"db\")\n\tupgradeDBPathNet(filepath.Join(oldDbRoot, \"btcd.db\"), \"mainnet\")\n\tupgradeDBPathNet(filepath.Join(oldDbRoot, \"btcd_testnet.db\"), \"testnet\")\n\tupgradeDBPathNet(filepath.Join(oldDbRoot, \"btcd_regtest.db\"), \"regtest\")\n\n\t// Remove the old db directory.\n\treturn os.RemoveAll(oldDbRoot)\n}\n\n// upgradeDataPaths moves the application data from its location prior to btcd\n// version 0.3.3 to its new location.\nfunc upgradeDataPaths() error {\n\t// No need to migrate if the old and new home paths are the same.\n\toldHomePath := oldBtcdHomeDir()\n\tnewHomePath := defaultHomeDir\n\tif oldHomePath == newHomePath {\n\t\treturn nil\n\t}\n\n\t// Only migrate if the old path exists and the new one doesn't.\n\tif fileExists(oldHomePath) && !fileExists(newHomePath) {\n\t\t// Create the new path.\n\t\tbtcdLog.Infof(\"Migrating application home path from '%s' to '%s'\",\n\t\t\toldHomePath, newHomePath)\n\t\terr := os.MkdirAll(newHomePath, 0700)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Move old btcd.conf into new location if needed.\n\t\toldConfPath := filepath.Join(oldHomePath, defaultConfigFilename)\n\t\tnewConfPath := filepath.Join(newHomePath, defaultConfigFilename)\n\t\tif fileExists(oldConfPath) && !fileExists(newConfPath) {\n\t\t\terr := os.Rename(oldConfPath, newConfPath)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// Move old data directory into new location if needed.\n\t\toldDataPath := filepath.Join(oldHomePath, defaultDataDirname)\n\t\tnewDataPath := filepath.Join(newHomePath, defaultDataDirname)\n\t\tif fileExists(oldDataPath) && !fileExists(newDataPath) {\n\t\t\terr := os.Rename(oldDataPath, newDataPath)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// Remove the old home if it is empty or show a warning if not.\n\t\tohpEmpty, err := dirEmpty(oldHomePath)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif ohpEmpty {\n\t\t\terr := os.Remove(oldHomePath)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tbtcdLog.Warnf(\"Not removing '%s' since it contains files \"+\n\t\t\t\t\"not created by this application.  You may \"+\n\t\t\t\t\"want to manually move them or delete them.\",\n\t\t\t\toldHomePath)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// doUpgrades performs upgrades to btcd as new versions require it.\nfunc doUpgrades() error {\n\terr := upgradeDBPaths()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn upgradeDataPaths()\n}\n"
  },
  {
    "path": "upnp.go",
    "content": "package main\n\n// Upnp code taken from Taipei Torrent license is below:\n// Copyright (c) 2010 Jack Palevich. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//    * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//    * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Just enough UPnP to be able to forward ports\n//\n\nimport (\n\t\"bytes\"\n\t\"encoding/xml\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// NAT is an interface representing a NAT traversal options for example UPNP or\n// NAT-PMP. It provides methods to query and manipulate this traversal to allow\n// access to services.\ntype NAT interface {\n\t// Get the external address from outside the NAT.\n\tGetExternalAddress() (addr net.IP, err error)\n\t// Add a port mapping for protocol (\"udp\" or \"tcp\") from external port to\n\t// internal port with description lasting for timeout.\n\tAddPortMapping(protocol string, externalPort, internalPort int, description string, timeout int) (mappedExternalPort int, err error)\n\t// Remove a previously added port mapping from external port to\n\t// internal port.\n\tDeletePortMapping(protocol string, externalPort, internalPort int) (err error)\n}\n\ntype upnpNAT struct {\n\tserviceURL string\n\tourIP      string\n}\n\n// Discover searches the local network for a UPnP router returning a NAT\n// for the network if so, nil if not.\nfunc Discover() (nat NAT, err error) {\n\tssdp, err := net.ResolveUDPAddr(\"udp4\", \"239.255.255.250:1900\")\n\tif err != nil {\n\t\treturn\n\t}\n\tconn, err := net.ListenPacket(\"udp4\", \":0\")\n\tif err != nil {\n\t\treturn\n\t}\n\tsocket := conn.(*net.UDPConn)\n\tdefer socket.Close()\n\n\terr = socket.SetDeadline(time.Now().Add(3 * time.Second))\n\tif err != nil {\n\t\treturn\n\t}\n\n\tst := \"ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\\r\\n\"\n\tbuf := bytes.NewBufferString(\n\t\t\"M-SEARCH * HTTP/1.1\\r\\n\" +\n\t\t\t\"HOST: 239.255.255.250:1900\\r\\n\" +\n\t\t\tst +\n\t\t\t\"MAN: \\\"ssdp:discover\\\"\\r\\n\" +\n\t\t\t\"MX: 2\\r\\n\\r\\n\")\n\tmessage := buf.Bytes()\n\tanswerBytes := make([]byte, 1024)\n\tfor i := 0; i < 3; i++ {\n\t\t_, err = socket.WriteToUDP(message, ssdp)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tvar n int\n\t\tn, _, err = socket.ReadFromUDP(answerBytes)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t\t// socket.Close()\n\t\t\t// return\n\t\t}\n\t\tanswer := string(answerBytes[0:n])\n\t\tif !strings.Contains(answer, \"\\r\\n\"+st) {\n\t\t\tcontinue\n\t\t}\n\t\t// HTTP header field names are case-insensitive.\n\t\t// http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2\n\t\tlocString := \"\\r\\nlocation: \"\n\t\tlocIndex := strings.Index(strings.ToLower(answer), locString)\n\t\tif locIndex < 0 {\n\t\t\tcontinue\n\t\t}\n\t\tloc := answer[locIndex+len(locString):]\n\t\tendIndex := strings.Index(loc, \"\\r\\n\")\n\t\tif endIndex < 0 {\n\t\t\tcontinue\n\t\t}\n\t\tlocURL := loc[0:endIndex]\n\t\tvar serviceURL string\n\t\tserviceURL, err = getServiceURL(locURL)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tvar ourIP string\n\t\tourIP, err = getOurIP()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tnat = &upnpNAT{serviceURL: serviceURL, ourIP: ourIP}\n\t\treturn\n\t}\n\terr = errors.New(\"UPnP port discovery failed\")\n\treturn\n}\n\n// service represents the Service type in an UPnP xml description.\n// Only the parts we care about are present and thus the xml may have more\n// fields than present in the structure.\ntype service struct {\n\tServiceType string `xml:\"serviceType\"`\n\tControlURL  string `xml:\"controlURL\"`\n}\n\n// deviceList represents the deviceList type in an UPnP xml description.\n// Only the parts we care about are present and thus the xml may have more\n// fields than present in the structure.\ntype deviceList struct {\n\tXMLName xml.Name `xml:\"deviceList\"`\n\tDevice  []device `xml:\"device\"`\n}\n\n// serviceList represents the serviceList type in an UPnP xml description.\n// Only the parts we care about are present and thus the xml may have more\n// fields than present in the structure.\ntype serviceList struct {\n\tXMLName xml.Name  `xml:\"serviceList\"`\n\tService []service `xml:\"service\"`\n}\n\n// device represents the device type in an UPnP xml description.\n// Only the parts we care about are present and thus the xml may have more\n// fields than present in the structure.\ntype device struct {\n\tXMLName     xml.Name    `xml:\"device\"`\n\tDeviceType  string      `xml:\"deviceType\"`\n\tDeviceList  deviceList  `xml:\"deviceList\"`\n\tServiceList serviceList `xml:\"serviceList\"`\n}\n\n// specVersion represents the specVersion in a UPnP xml description.\n// Only the parts we care about are present and thus the xml may have more\n// fields than present in the structure.\ntype specVersion struct {\n\tXMLName xml.Name `xml:\"specVersion\"`\n\tMajor   int      `xml:\"major\"`\n\tMinor   int      `xml:\"minor\"`\n}\n\n// root represents the Root document for a UPnP xml description.\n// Only the parts we care about are present and thus the xml may have more\n// fields than present in the structure.\ntype root struct {\n\tXMLName     xml.Name `xml:\"root\"`\n\tSpecVersion specVersion\n\tDevice      device\n}\n\n// getChildDevice searches the children of device for a device with the given\n// type.\nfunc getChildDevice(d *device, deviceType string) *device {\n\tfor i := range d.DeviceList.Device {\n\t\tif d.DeviceList.Device[i].DeviceType == deviceType {\n\t\t\treturn &d.DeviceList.Device[i]\n\t\t}\n\t}\n\treturn nil\n}\n\n// getChildService searches the service list of device for a service with the\n// given type.\nfunc getChildService(d *device, serviceType string) *service {\n\tfor i := range d.ServiceList.Service {\n\t\tif d.ServiceList.Service[i].ServiceType == serviceType {\n\t\t\treturn &d.ServiceList.Service[i]\n\t\t}\n\t}\n\treturn nil\n}\n\n// getOurIP returns a best guess at what the local IP is.\nfunc getOurIP() (ip string, err error) {\n\thostname, err := os.Hostname()\n\tif err != nil {\n\t\treturn\n\t}\n\treturn net.LookupCNAME(hostname)\n}\n\n// getServiceURL parses the xml description at the given root url to find the\n// url for the WANIPConnection service to be used for port forwarding.\nfunc getServiceURL(rootURL string) (url string, err error) {\n\tr, err := http.Get(rootURL)\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer r.Body.Close()\n\tif r.StatusCode >= 400 {\n\t\terr = errors.New(fmt.Sprint(r.StatusCode))\n\t\treturn\n\t}\n\tvar root root\n\terr = xml.NewDecoder(r.Body).Decode(&root)\n\tif err != nil {\n\t\treturn\n\t}\n\ta := &root.Device\n\tif a.DeviceType != \"urn:schemas-upnp-org:device:InternetGatewayDevice:1\" {\n\t\terr = errors.New(\"no InternetGatewayDevice\")\n\t\treturn\n\t}\n\tb := getChildDevice(a, \"urn:schemas-upnp-org:device:WANDevice:1\")\n\tif b == nil {\n\t\terr = errors.New(\"no WANDevice\")\n\t\treturn\n\t}\n\tc := getChildDevice(b, \"urn:schemas-upnp-org:device:WANConnectionDevice:1\")\n\tif c == nil {\n\t\terr = errors.New(\"no WANConnectionDevice\")\n\t\treturn\n\t}\n\td := getChildService(c, \"urn:schemas-upnp-org:service:WANIPConnection:1\")\n\tif d == nil {\n\t\terr = errors.New(\"no WANIPConnection\")\n\t\treturn\n\t}\n\turl = combineURL(rootURL, d.ControlURL)\n\treturn\n}\n\n// combineURL appends subURL onto rootURL.\nfunc combineURL(rootURL, subURL string) string {\n\tprotocolEnd := \"://\"\n\tprotoEndIndex := strings.Index(rootURL, protocolEnd)\n\ta := rootURL[protoEndIndex+len(protocolEnd):]\n\trootIndex := strings.Index(a, \"/\")\n\treturn rootURL[0:protoEndIndex+len(protocolEnd)+rootIndex] + subURL\n}\n\n// soapBody represents the <s:Body> element in a SOAP reply.\n// fields we don't care about are elided.\ntype soapBody struct {\n\tXMLName xml.Name `xml:\"Body\"`\n\tData    []byte   `xml:\",innerxml\"`\n}\n\n// soapEnvelope represents the <s:Envelope> element in a SOAP reply.\n// fields we don't care about are elided.\ntype soapEnvelope struct {\n\tXMLName xml.Name `xml:\"Envelope\"`\n\tBody    soapBody `xml:\"Body\"`\n}\n\n// soapRequests performs a soap request with the given parameters and returns\n// the xml replied stripped of the soap headers. in the case that the request is\n// unsuccessful the an error is returned.\nfunc soapRequest(url, function, message string) (replyXML []byte, err error) {\n\tfullMessage := \"<?xml version=\\\"1.0\\\" ?>\" +\n\t\t\"<s:Envelope xmlns:s=\\\"http://schemas.xmlsoap.org/soap/envelope/\\\" s:encodingStyle=\\\"http://schemas.xmlsoap.org/soap/encoding/\\\">\\r\\n\" +\n\t\t\"<s:Body>\" + message + \"</s:Body></s:Envelope>\"\n\n\treq, err := http.NewRequest(\"POST\", url, strings.NewReader(fullMessage))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Content-Type\", \"text/xml ; charset=\\\"utf-8\\\"\")\n\treq.Header.Set(\"User-Agent\", \"Darwin/10.0.0, UPnP/1.0, MiniUPnPc/1.3\")\n\treq.Header.Set(\"SOAPAction\", \"\\\"urn:schemas-upnp-org:service:WANIPConnection:1#\"+function+\"\\\"\")\n\treq.Header.Set(\"Connection\", \"Close\")\n\treq.Header.Set(\"Cache-Control\", \"no-cache\")\n\treq.Header.Set(\"Pragma\", \"no-cache\")\n\n\tr, err := http.DefaultClient.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif r.Body != nil {\n\t\tdefer r.Body.Close()\n\t}\n\n\tif r.StatusCode >= 400 {\n\t\terr = errors.New(\"Error \" + strconv.Itoa(r.StatusCode) + \" for \" + function)\n\t\tr = nil\n\t\treturn\n\t}\n\tvar reply soapEnvelope\n\terr = xml.NewDecoder(r.Body).Decode(&reply)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn reply.Body.Data, nil\n}\n\n// getExternalIPAddressResponse represents the XML response to a\n// GetExternalIPAddress SOAP request.\ntype getExternalIPAddressResponse struct {\n\tXMLName           xml.Name `xml:\"GetExternalIPAddressResponse\"`\n\tExternalIPAddress string   `xml:\"NewExternalIPAddress\"`\n}\n\n// GetExternalAddress implements the NAT interface by fetching the external IP\n// from the UPnP router.\nfunc (n *upnpNAT) GetExternalAddress() (addr net.IP, err error) {\n\tmessage := \"<u:GetExternalIPAddress xmlns:u=\\\"urn:schemas-upnp-org:service:WANIPConnection:1\\\"/>\\r\\n\"\n\tresponse, err := soapRequest(n.serviceURL, \"GetExternalIPAddress\", message)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar reply getExternalIPAddressResponse\n\terr = xml.Unmarshal(response, &reply)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\taddr = net.ParseIP(reply.ExternalIPAddress)\n\tif addr == nil {\n\t\treturn nil, errors.New(\"unable to parse ip address\")\n\t}\n\treturn addr, nil\n}\n\n// AddPortMapping implements the NAT interface by setting up a port forwarding\n// from the UPnP router to the local machine with the given ports and protocol.\nfunc (n *upnpNAT) AddPortMapping(protocol string, externalPort, internalPort int, description string, timeout int) (mappedExternalPort int, err error) {\n\t// A single concatenation would break ARM compilation.\n\tmessage := \"<u:AddPortMapping xmlns:u=\\\"urn:schemas-upnp-org:service:WANIPConnection:1\\\">\\r\\n\" +\n\t\t\"<NewRemoteHost></NewRemoteHost><NewExternalPort>\" + strconv.Itoa(externalPort)\n\tmessage += \"</NewExternalPort><NewProtocol>\" + strings.ToUpper(protocol) + \"</NewProtocol>\"\n\tmessage += \"<NewInternalPort>\" + strconv.Itoa(internalPort) + \"</NewInternalPort>\" +\n\t\t\"<NewInternalClient>\" + n.ourIP + \"</NewInternalClient>\" +\n\t\t\"<NewEnabled>1</NewEnabled><NewPortMappingDescription>\"\n\tmessage += description +\n\t\t\"</NewPortMappingDescription><NewLeaseDuration>\" + strconv.Itoa(timeout) +\n\t\t\"</NewLeaseDuration></u:AddPortMapping>\"\n\n\tresponse, err := soapRequest(n.serviceURL, \"AddPortMapping\", message)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t// TODO: check response to see if the port was forwarded\n\t// If the port was not wildcard we don't get an reply with the port in\n\t// it. Not sure about wildcard yet. miniupnpc just checks for error\n\t// codes here.\n\tmappedExternalPort = externalPort\n\t_ = response\n\treturn\n}\n\n// DeletePortMapping implements the NAT interface by removing up a port forwarding\n// from the UPnP router to the local machine with the given ports and.\nfunc (n *upnpNAT) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) {\n\n\tmessage := \"<u:DeletePortMapping xmlns:u=\\\"urn:schemas-upnp-org:service:WANIPConnection:1\\\">\\r\\n\" +\n\t\t\"<NewRemoteHost></NewRemoteHost><NewExternalPort>\" + strconv.Itoa(externalPort) +\n\t\t\"</NewExternalPort><NewProtocol>\" + strings.ToUpper(protocol) + \"</NewProtocol>\" +\n\t\t\"</u:DeletePortMapping>\"\n\n\tresponse, err := soapRequest(n.serviceURL, \"DeletePortMapping\", message)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t// TODO: check response to see if the port was deleted\n\t// log.Println(message, response)\n\t_ = response\n\treturn\n}\n"
  },
  {
    "path": "v2transport/chacha.go",
    "content": "package v2transport\n\nimport (\n\t\"crypto/cipher\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\n\t\"golang.org/x/crypto/chacha20\"\n\t\"golang.org/x/crypto/chacha20poly1305\"\n)\n\nconst (\n\t// rekeyInterval is the number of messages that can be encrypted or\n\t// decrypted with a single key before we rotate keys.\n\trekeyInterval = 224\n\n\t// keySize is the size of the keys used.\n\tkeySize = 32\n)\n\n// FSChaCha20Poly1305 is a wrapper around ChaCha20Poly1305 that changes its\n// nonce after every message and is rekeyed after every rekeying interval.\ntype FSChaCha20Poly1305 struct {\n\tkey       []byte\n\tpacketCtr uint64\n\tcipher    cipher.AEAD\n}\n\n// NewFSChaCha20Poly1305 creates a new instance of FSChaCha20Poly1305.\nfunc NewFSChaCha20Poly1305(initialKey []byte) (*FSChaCha20Poly1305, error) {\n\tcipher, err := chacha20poly1305.New(initialKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tf := &FSChaCha20Poly1305{\n\t\tkey:       initialKey,\n\t\tpacketCtr: 0,\n\t\tcipher:    cipher,\n\t}\n\n\treturn f, nil\n}\n\n// Encrypt encrypts the plaintext using the associated data, returning the\n// ciphertext or an error.\nfunc (f *FSChaCha20Poly1305) Encrypt(aad, plaintext []byte) ([]byte, error) {\n\treturn f.crypt(aad, plaintext, false)\n}\n\n// Decrypt decrypts the ciphertext using the assosicated data, returning the\n// plaintext or an error.\nfunc (f *FSChaCha20Poly1305) Decrypt(aad, ciphertext []byte) ([]byte, error) {\n\treturn f.crypt(aad, ciphertext, true)\n}\n\n// crypt takes the aad and plaintext/ciphertext and either encrypts or decrypts\n// `text` and returns the result. If a failure was encountered, an error will\n// be returned.\nfunc (f *FSChaCha20Poly1305) crypt(aad, text []byte,\n\tdecrypt bool) ([]byte, error) {\n\n\t// The nonce is constructed as the 4-byte little-endian encoding of the\n\t// number of messages crypted with the current key followed by the\n\t// 8-byte little-endian encoding of the number of re-keying performed.\n\tvar nonce [12]byte\n\tnumMsgs := uint32(f.packetCtr % rekeyInterval)\n\tnumRekeys := uint64(f.packetCtr / rekeyInterval)\n\tbinary.LittleEndian.PutUint32(nonce[0:4], numMsgs)\n\tbinary.LittleEndian.PutUint64(nonce[4:12], numRekeys)\n\n\tvar result []byte\n\tif decrypt {\n\t\t// Decrypt using the nonce, ciphertext, and aad.\n\t\tvar err error\n\t\tresult, err = f.cipher.Open(nil, nonce[:], text, aad)\n\t\tif err != nil {\n\t\t\t// It is ok to error here without incrementing\n\t\t\t// packetCtr because we will no longer be decrypting\n\t\t\t// any more messages.\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\t// Encrypt using the nonce, plaintext, and aad.\n\t\tresult = f.cipher.Seal(nil, nonce[:], text, aad)\n\t}\n\n\tf.packetCtr++\n\n\t// Rekey if we are at the rekeying interval.\n\tif f.packetCtr%rekeyInterval == 0 {\n\t\tvar rekeyNonce [12]byte\n\t\trekeyNonce[0] = 0xff\n\t\trekeyNonce[1] = 0xff\n\t\trekeyNonce[2] = 0xff\n\t\trekeyNonce[3] = 0xff\n\n\t\tcopy(rekeyNonce[4:], nonce[4:])\n\n\t\tvar dummyPlaintext [32]byte\n\t\tf.key = f.cipher.Seal(\n\t\t\tnil, rekeyNonce[:], dummyPlaintext[:], nil,\n\t\t)[:keySize]\n\t\tcipher, err := chacha20poly1305.New(f.key)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t\treturn nil, err\n\t\t}\n\t\tf.cipher = cipher\n\t}\n\n\treturn result, nil\n}\n\n// FSChaCha20 is a stream cipher that is used to encrypt the length of the\n// packets. This cipher is rekeyed when chunkCtr reaches a multiple of\n// rekeyInterval.\ntype FSChaCha20 struct {\n\tkey      []byte\n\tchunkCtr uint64\n\tcipher   *chacha20.Cipher\n}\n\n// NewFSChaCha20 initializes a new FSChaCha20 cipher instance.\nfunc NewFSChaCha20(initialKey []byte) (*FSChaCha20, error) {\n\tvar initialNonce [12]byte\n\tbinary.LittleEndian.PutUint64(initialNonce[4:12], 0)\n\n\tcipher, err := chacha20.NewUnauthenticatedCipher(\n\t\tinitialKey, initialNonce[:],\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &FSChaCha20{\n\t\tkey:      initialKey,\n\t\tchunkCtr: 0,\n\t\tcipher:   cipher,\n\t}, nil\n}\n\n// Crypt is used to either encrypt or decrypt text. This function is used for\n// both encryption and decryption as the two operations are identical.\nfunc (f *FSChaCha20) Crypt(text []byte) ([]byte, error) {\n\t// XOR the text with the keystream to get either the cipher or\n\t// plaintext.\n\ttextLen := len(text)\n\tdst := make([]byte, textLen)\n\tf.cipher.XORKeyStream(dst, text)\n\n\t// Increment the chunkCtr every time this function is called.\n\tf.chunkCtr++\n\n\t// Check if we need to rekey.\n\tif f.chunkCtr%rekeyInterval == 0 {\n\t\t// Get the new key by getting 32 bytes from the keystream. Use\n\t\t// all 0's so that we can get the actual bytes from\n\t\t// XORKeyStream since the chacha20 library doesn't supply us\n\t\t// with the keystream's bytes directly.\n\t\tvar (\n\t\t\tdummyXor [32]byte\n\t\t\tnewKey   [32]byte\n\t\t)\n\t\tf.cipher.XORKeyStream(newKey[:], dummyXor[:])\n\t\tf.key = newKey[:]\n\n\t\tvar nonce [12]byte\n\t\tnumRekeys := f.chunkCtr / rekeyInterval\n\t\tbinary.LittleEndian.PutUint64(nonce[4:12], numRekeys)\n\n\t\tcipher, err := chacha20.NewUnauthenticatedCipher(\n\t\t\tf.key, nonce[:],\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tf.cipher = cipher\n\t}\n\n\treturn dst, nil\n}\n"
  },
  {
    "path": "v2transport/go.mod",
    "content": "module github.com/btcsuite/btcd/v2transport\n\ngo 1.23.2\n\nrequire (\n\tgithub.com/btcsuite/btcd/btcec/v2 v2.3.5\n\tgithub.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f\n\tgolang.org/x/crypto v0.25.0\n)\n\nrequire (\n\tgithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect\n\tgithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect\n\tgolang.org/x/sys v0.22.0 // indirect\n)\n"
  },
  {
    "path": "v2transport/go.sum",
    "content": "github.com/btcsuite/btcd/btcec/v2 v2.3.5 h1:dpAlnAwmT1yIBm3exhT1/8iUSD98RDJM5vqJVQDQLiU=\ngithub.com/btcsuite/btcd/btcec/v2 v2.3.5/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ=\ngithub.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=\ngithub.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=\ngithub.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=\ngithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=\ngithub.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=\ngolang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=\ngolang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=\ngolang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=\ngolang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\n"
  },
  {
    "path": "v2transport/log.go",
    "content": "// Copyright (c) 2025 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage v2transport\n\nimport (\n\t\"github.com/btcsuite/btclog\"\n)\n\nconst Subsystem = \"V2TR\"\n\n// log is a logger that is initialized with no output filters.  This\n// means the package will not perform any logging by default until the caller\n// requests it.\nvar log btclog.Logger\n\n// The default amount of logging is none.\nfunc init() {\n\tDisableLog()\n}\n\n// DisableLog disables all library log output.  Logging output is disabled\n// by default until UseLogger is called.\nfunc DisableLog() {\n\tlog = btclog.Disabled\n}\n\n// UseLogger uses a specified Logger to output package logging info.\nfunc UseLogger(logger btclog.Logger) {\n\tlog = logger\n}\n"
  },
  {
    "path": "v2transport/transport.go",
    "content": "package v2transport\n\nimport (\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"crypto/sha256\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"sync/atomic\"\n\n\t\"golang.org/x/crypto/hkdf\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/ellswift\"\n)\n\n// packetBit is a type used to represent the bits in the packet's header.\ntype packetBit uint8\n\nconst (\n\t// ignoreBitPos is the position of the ignore bit in the packet's\n\t// header.\n\tignoreBitPos packetBit = 7\n)\n\n// BitcoinNet is a type used to represent the Bitcoin network that we're\n// connecting to.\n//\n// NOTE: This is identical to the wire.BitcoinNet type, but allows us to shed a\n// large module dependency.\ntype BitcoinNet uint32\n\nconst (\n\t// garbageSize is the length in bytes of the garbage terminator that\n\t// each party sends.\n\tgarbageSize = 16\n\n\t// MaxGarbageLen is the maximum size of garbage that either peer is\n\t// allowed to send.\n\tMaxGarbageLen = 4095\n\n\t// maxContentLen is the maximum length of content that can be encrypted\n\t// or decrypted.\n\t//\n\t// TODO: This should be revisited. For some reason, the test vectors\n\t// want us to encrypt 16777215 bytes even though bitcoind will only\n\t// decrypt up to 1 + 12 + 4_000_000 bytes by default.\n\tmaxContentLen = 1<<24 - 1\n\n\t// lengthFieldLen is the length of the length field when encrypting the\n\t// content's length.\n\tlengthFieldLen = 3\n\n\t// headerLen is the length of the header field. It is composed of a\n\t// single byte with only the ignoreBitPos having any meaning.\n\theaderLen = 1\n\n\t// chachapoly1305Expansion is the difference in bytes between the\n\t// plaintext and ciphertext when using chachapoly1305. The ciphertext\n\t// is larger because of the authentication tag.\n\tchachapoly1305Expansion = 16\n)\n\nvar (\n\t// transportVersion is the transport version we are currently using.\n\ttransportVersion = []byte{}\n\n\t// errInsufficientBytes is returned when we haven't received enough\n\t// bytes to populate their ElligatorSwift encoded public key.\n\terrInsufficientBytes = fmt.Errorf(\"insufficient bytes received\")\n\n\t// ErrUseV1Protocol is returned when the initiating peer is attempting\n\t// to use the V1 protocol.\n\tErrUseV1Protocol = fmt.Errorf(\"use v1 protocol instead\")\n\n\t// errWrongNetV1Peer is returned when a v1 peer is using the wrong\n\t// network.\n\terrWrongNetV1Peer = fmt.Errorf(\"peer is v1 and using the wrong network\")\n\n\t// errGarbageTermNotRecv is returned when a v2 peer never sends us their\n\t// garbage terminator.\n\terrGarbageTermNotRecv = fmt.Errorf(\"no garbage term received\")\n\n\t// errContentLengthExceeded is returned when trying to encrypt or decrypt\n\t// more than the maximum content length.\n\terrContentLengthExceeded = fmt.Errorf(\"maximum content length exceeded\")\n\n\t// errFailedToRecv is returned when a Read call fails.\n\terrFailedToRecv = fmt.Errorf(\"failed to recv data\")\n\n\t// errPrefixTooLarge is returned if receivedPrefix is ever too large.\n\t// This shouldn't happen unless the API is mis-used.\n\terrPrefixTooLarge = fmt.Errorf(\"prefix too large - internal error\")\n\n\t// errGarbageTooLarge is returned if a caller attempts to send garbage\n\t// larger than normal.\n\terrGarbageTooLarge = fmt.Errorf(\"garbage too large\")\n\n\t// ErrShouldDowngradeToV1 is returned when we send the peer our\n\t// ellswift key and they immediately hang up. This indicates that they\n\t// don't understand v2 transport and interpreted the 64-byte key as a\n\t// v1 message header + message. This will (always?) decode to an\n\t// invalid command and checksum. The caller should try connecting to\n\t// the peer with the OG v1 transport.\n\tErrShouldDowngradeToV1 = fmt.Errorf(\"should downgrade to v1\")\n)\n\n// Peer defines the components necessary for sending/receiving data over the v2\n// transport.\ntype Peer struct {\n\t// privkeyOurs is our private key\n\tprivkeyOurs *btcec.PrivateKey\n\n\t// ellswiftOurs is our ElligatorSwift-encoded public key.\n\tellswiftOurs [64]byte\n\n\t// sentGarbage is the garbage sent after the public key. This may be up\n\t// to\n\t// 4095 bytes.\n\tsentGarbage []byte\n\n\t// receivedPrefix is used to determine which transport protocol we're\n\t// using.\n\treceivedPrefix []byte\n\n\t// sendL is the cipher used to send encrypted packet lengths.\n\tsendL *FSChaCha20\n\n\t// sendP is the cipher used to send encrypted packets.\n\tsendP *FSChaCha20Poly1305\n\n\t// sendGarbageTerm is the garbage terminator that we send.\n\tsendGarbageTerm [garbageSize]byte\n\n\t// recvL is the cipher used to receive encrypted packet lengths.\n\trecvL *FSChaCha20\n\n\t// recvP is the cipher used to receive encrypted packets.\n\trecvP *FSChaCha20Poly1305\n\n\t// recvGarbageTerm is the garbage terminator our peer sends.\n\trecvGarbageTerm []byte\n\n\t// initiatorL is the key used to seed the sendL cipher.\n\tinitiatorL []byte\n\n\t// initiatorP is the key used to seed the sendP cipher.\n\tinitiatorP []byte\n\n\t// responderL is the key used to seed the recvL cipher.\n\tresponderL []byte\n\n\t// responderP is the key used to seed the recvP cipher.\n\tresponderP []byte\n\n\t// sessionID uniquely identifies this encrypted channel. It is\n\t// currently only used in the test vectors.\n\tsessionID []byte\n\n\t// shouldDowngradeToV1 is true if the handshake failed in a way that\n\t// indicates the peer does not support v2, and a v1 attempt should be\n\t// made.\n\tshouldDowngradeToV1 atomic.Bool\n\n\t// rw is the underlying object that will be read from / written to in\n\t// calls to V2EncPacket and V2ReceivePacket.\n\trw io.ReadWriter\n}\n\n// NewPeer returns a new instance of Peer.\nfunc NewPeer() *Peer {\n\t// The keys (initiatorL, initiatorP, responderL, responderP) as well as\n\t// the sessionID must have space for the hkdf Expand-derived Reader to\n\t// work.\n\treturn &Peer{\n\t\treceivedPrefix: make([]byte, 0),\n\t\tinitiatorL:     make([]byte, 32),\n\t\tinitiatorP:     make([]byte, 32),\n\t\tresponderL:     make([]byte, 32),\n\t\tresponderP:     make([]byte, 32),\n\t\tsessionID:      make([]byte, 32),\n\t}\n}\n\n// createV2Ciphers constructs the packet-length and packet encryption ciphers.\nfunc (p *Peer) createV2Ciphers(ecdhSecret []byte, initiating bool,\n\tnet BitcoinNet) error {\n\n\tlog.Debugf(\"Creating v2 ciphers (initiating=%v, net=%v)\", initiating,\n\t\tnet)\n\n\t// Define the salt as the string \"bitcoin_v2_shared_secret\" followed by\n\t// the BitcoinNet's \"magic\" bytes.\n\tsalt := []byte(\"bitcoin_v2_shared_secret\")\n\n\tvar magic [4]byte\n\tbinary.LittleEndian.PutUint32(magic[:], uint32(net))\n\tsalt = append(salt, magic[:]...)\n\n\t// Use the hkdf Extract function to generate a pseudo-random key.\n\tprk := hkdf.Extract(sha256.New, ecdhSecret, salt)\n\n\tlog.Tracef(\"Using salt=%x for HKDF-Extract\", salt)\n\n\t// Use the hkdf Expand function with info set to \"session_id\" to generate a\n\t// unique sessionID.\n\tsessionInfo := []byte(\"session_id\")\n\tsessionReader := hkdf.Expand(sha256.New, prk, sessionInfo)\n\t_, err := sessionReader.Read(p.sessionID)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to derive session_id: %v\", err)\n\t\treturn err\n\t}\n\n\tlog.Tracef(\"Using prk=%x for HKDF-Expand\", prk)\n\n\tlog.Tracef(\"Derived session_id=%x\", p.sessionID)\n\n\t// Use the Expand operation to generate packet and packet-length encryption\n\t// ciphers.\n\tinitiatorLInfo := []byte(\"initiator_L\")\n\tinitiatorLReader := hkdf.Expand(sha256.New, prk, initiatorLInfo)\n\t_, err = initiatorLReader.Read(p.initiatorL)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to derive initiator_L: %v\", err)\n\t\treturn err\n\t}\n\n\tlog.Tracef(\"Derived initiator_L=%x\", p.initiatorL)\n\n\tinitiatorPInfo := []byte(\"initiator_P\")\n\tinitiatorPReader := hkdf.Expand(sha256.New, prk, initiatorPInfo)\n\t_, err = initiatorPReader.Read(p.initiatorP)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to derive initiator_P: %v\", err)\n\t\treturn err\n\t}\n\n\tlog.Tracef(\"Derived initiator_P=%x\", p.initiatorP)\n\n\tresponderLInfo := []byte(\"responder_L\")\n\tresponderLReader := hkdf.Expand(sha256.New, prk, responderLInfo)\n\t_, err = responderLReader.Read(p.responderL)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to derive responder_L: %v\", err)\n\t\treturn err\n\t}\n\n\tlog.Tracef(\"Derived responder_L=%x\", p.responderL)\n\n\tresponderPInfo := []byte(\"responder_P\")\n\tresponderPReader := hkdf.Expand(sha256.New, prk, responderPInfo)\n\t_, err = responderPReader.Read(p.responderP)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to derive responder_P: %v\", err)\n\t\treturn err\n\t}\n\n\tlog.Tracef(\"Derived responder_P=%x\", p.responderP)\n\n\t// Create the garbage terminators that each side will use.\n\tgarbageInfo := []byte(\"garbage_terminators\")\n\tgarbageReader := hkdf.Expand(sha256.New, prk, garbageInfo)\n\tgarbageTerminators := make([]byte, 32)\n\t_, err = garbageReader.Read(garbageTerminators)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to derive garbage terminators: %v\", err)\n\t\treturn err\n\t}\n\n\tinitiatorGarbageTerminator := garbageTerminators[:garbageSize]\n\tresponderGarbageTerminator := garbageTerminators[garbageSize:]\n\n\tlog.Tracef(\"Derived initiator garbage terminator=%x\",\n\t\tinitiatorGarbageTerminator)\n\n\tlog.Tracef(\"Derived responder garbage terminator=%x\",\n\t\tresponderGarbageTerminator)\n\n\tif initiating {\n\t\tp.sendL, err = NewFSChaCha20(p.initiatorL)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to create sendL cipher: %v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\tp.sendP, err = NewFSChaCha20Poly1305(p.initiatorP)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to create sendP cipher: %v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\tcopy(p.sendGarbageTerm[:], initiatorGarbageTerminator)\n\n\t\tp.recvL, err = NewFSChaCha20(p.responderL)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to create recvL cipher: %v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\tp.recvP, err = NewFSChaCha20Poly1305(p.responderP)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to create recvP cipher: %v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\tp.recvGarbageTerm = responderGarbageTerminator\n\n\t\tlog.Debugf(\"Initiator ciphers created (sendL, sendP, \" +\n\t\t\t\"recvL, recvP)\")\n\n\t} else {\n\t\tp.sendL, err = NewFSChaCha20(p.responderL)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to create sendL cipher: %v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\tp.sendP, err = NewFSChaCha20Poly1305(p.responderP)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to create sendP cipher: %v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\tcopy(p.sendGarbageTerm[:], responderGarbageTerminator)\n\n\t\tp.recvL, err = NewFSChaCha20(p.initiatorL)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to create recvL cipher: %v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\tp.recvP, err = NewFSChaCha20Poly1305(p.initiatorP)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to create recvP cipher: %v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\tp.recvGarbageTerm = initiatorGarbageTerminator\n\n\t\tlog.Debugf(\"Responder ciphers created (sendL, sendP, \" +\n\t\t\t\"recvL, recvP)\")\n\t}\n\n\t// TODO:\n\t//     To achieve forward secrecy we must wipe the key material used to initialize the ciphers:\n\t//     memory_cleanse(ecdhSecret, prk, initiator_L, initiator_P, responder_L, responder_K)\n\t// - golang analogue?\n\n\treturn nil\n}\n\n// InitiateV2Handshake generates our private key and sends our public key as\n// well as garbage data to our peer.\nfunc (p *Peer) InitiateV2Handshake(garbageLen int) error {\n\tlog.Debugf(\"Initiating v2 handshake (garbageLen=%d)\", garbageLen)\n\n\tvar err error\n\tp.privkeyOurs, p.ellswiftOurs, err = ellswift.EllswiftCreate()\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to create ellswift keypair: %v\", err)\n\t\treturn err\n\t}\n\n\tlog.Tracef(\"Created ellswift keypair, pubkey=%x\", p.ellswiftOurs)\n\n\tdata, err := p.generateKeyAndGarbage(garbageLen)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tlog.Debugf(\"Sending ellswift pubkey and garbage (total_len=%d)\",\n\t\tlen(data))\n\n\tp.Send(data)\n\n\treturn nil\n}\n\n// RespondV2Handshake responds to the initiator, determines if the initiator\n// wants to use the v2 protocol and if so returns our ElligatorSwift-encoded\n// public key followed by our garbage data over. If the initiator does not want\n// to use the v2 protocol, we'll instead revert to the v1 protocol.\nfunc (p *Peer) RespondV2Handshake(garbageLen int, net BitcoinNet) error {\n\tv1Prefix := createV1Prefix(net)\n\n\tlog.Debugf(\"Responding to v2 handshake (garbageLen=%d, net=%v)\",\n\t\tgarbageLen, net)\n\n\tlog.Tracef(\"Expecting v1 prefix: %x\", v1Prefix)\n\n\tvar err error\n\n\t// Check and see if the received bytes match the v1 protocol's message\n\t// prefix. If it does, we'll revert to the v1 protocol. If it doesn't,\n\t// we'll treat this as a v2 peer.\n\tfor len(p.receivedPrefix) < len(v1Prefix) {\n\t\tlog.Tracef(\"Received prefix len=%d, need=%d\",\n\t\t\tlen(p.receivedPrefix), len(v1Prefix))\n\n\t\tvar receiveBytes []byte\n\t\treceiveBytes, _, err = p.Receive(1)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to receive byte for v1 prefix \"+\n\t\t\t\t\"check: %v\", err)\n\t\t\treturn err\n\t\t}\n\n\t\tlog.Tracef(\"Current received prefix: %x\", p.receivedPrefix)\n\n\t\tp.receivedPrefix = append(p.receivedPrefix, receiveBytes...)\n\n\t\tlastIdx := len(p.receivedPrefix) - 1\n\n\t\tif p.receivedPrefix[lastIdx] != v1Prefix[lastIdx] {\n\t\t\tlog.Debugf(\"Received byte %x does not match v1 \"+\n\t\t\t\t\"prefix at index %d, assuming v2 peer\",\n\t\t\t\tp.receivedPrefix[lastIdx], lastIdx)\n\n\t\t\tp.privkeyOurs, p.ellswiftOurs, err = ellswift.EllswiftCreate()\n\t\t\tif err != nil {\n\t\t\t\tlog.Errorf(\"Failed to create ellswift \"+\n\t\t\t\t\t\"keypair: %v\", err)\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tlog.Tracef(\"Created ellswift keypair, pubkey=%x\",\n\t\t\t\tp.ellswiftOurs)\n\n\t\t\tdata, err := p.generateKeyAndGarbage(garbageLen)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Send over our ElligatorSwift-encoded pubkey followed\n\t\t\t// by our randomly generated garbage.\n\t\t\tlog.Debugf(\"Sending ellswift pubkey and garbage \"+\n\t\t\t\t\"(total_len=%d)\", len(data))\n\t\t\tp.Send(data)\n\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tlog.Infof(\"Received full v1 prefix match, reverting to v1 protocol\")\n\n\treturn ErrUseV1Protocol\n}\n\n// generateKeyAndGarbage returns a byte slice containing our ellswift-encoded\n// public key followed by the garbage we'll send over.\nfunc (p *Peer) generateKeyAndGarbage(garbageLen int) ([]byte, error) {\n\tlog.Tracef(\"Generating key and garbage (garbageLen=%d)\", garbageLen)\n\n\tif garbageLen > MaxGarbageLen {\n\t\tlog.Errorf(\"Requested garbage length %d exceeds max %d\",\n\t\t\tgarbageLen, MaxGarbageLen)\n\n\t\treturn nil, errGarbageTooLarge\n\t}\n\n\tp.sentGarbage = make([]byte, garbageLen)\n\t_, err := rand.Read(p.sentGarbage)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to read random bytes for garbage: %v\", err)\n\t\treturn nil, err\n\t}\n\n\tlog.Tracef(\"Generated %d bytes of garbage\", garbageLen)\n\n\tdata := make([]byte, 0, 64+garbageLen)\n\tdata = append(data, p.ellswiftOurs[:]...)\n\tdata = append(data, p.sentGarbage...)\n\n\tlog.Tracef(\"Generated key and garbage data (total_len=%d)\", len(data))\n\n\treturn data, nil\n}\n\n// createV1Prefix is a helper function that returns the first 16 bytes of the\n// version message's header.\nfunc createV1Prefix(net BitcoinNet) []byte {\n\tv1Prefix := make([]byte, 0, 4+12)\n\n\t// The v1 transport protocol uses the network's 4 magic bytes followed by\n\t// \"version\" followed by 5 bytes of 0.\n\tvar magic [4]byte\n\tbinary.LittleEndian.PutUint32(magic[:], uint32(net))\n\n\tversionBytes := []byte(\"version\\x00\\x00\\x00\\x00\\x00\")\n\n\tv1Prefix = append(v1Prefix, magic[:]...)\n\tv1Prefix = append(v1Prefix, versionBytes...)\n\n\treturn v1Prefix\n}\n\n// CompleteHandshake finishes the v2 protocol negotiation and optionally sends\n// decoy packets after sending the garbage terminator.\nfunc (p *Peer) CompleteHandshake(initiating bool, decoyContentLens []int,\n\tbtcnet BitcoinNet) error {\n\n\tlog.Debugf(\"Completing v2 handshake (initiating=%v, \"+\n\t\t\"num_decoys=%d, net=%v)\", initiating, len(decoyContentLens),\n\t\tbtcnet)\n\n\tvar receivedPrefix []byte\n\tif initiating {\n\t\tlog.Trace(\"Initiator expecting 64 bytes for peer's \" +\n\t\t\t\"ellswift key\")\n\n\t\treceivedPrefix = make([]byte, 0, 16)\n\t} else {\n\t\t// If we are the responder, we have already received bytes to\n\t\t// compare against the v1 transport protocol's starting bytes.\n\t\t// We have to account for these when reading the rest of the 64\n\t\t// bytes off the wire to properly parse the remote's\n\t\t// ellswift-encoded public key.\n\t\treceivedPrefix = p.receivedPrefix\n\n\t\tlog.Tracef(\"Responder already has prefix_len=%d, expecting %d \"+\n\t\t\t\"more bytes for peer's ellswift key\",\n\t\t\tlen(receivedPrefix), 64-len(receivedPrefix))\n\t}\n\n\trecvData, numRead, err := p.Receive(64 - len(receivedPrefix))\n\tif err != nil {\n\t\t// If we receive an error when reading off the wire and we read\n\t\t// zero bytes, then we will reconnect to the peer using v1.\n\t\t// There are several different errors that Receive can return\n\t\t// that indicate we should reconnect. Instead of special-casing\n\t\t// them all, just perform these checks if any error was\n\t\t// returned.\n\t\tif numRead == 0 && initiating {\n\t\t\t// The peer most likely attempted to parse our 64-byte\n\t\t\t// elligator-swift key as a version message and failed\n\t\t\t// when trying to parse the message header into\n\t\t\t// something valid. In this case, return a special\n\t\t\t// error that signals to the server that we can\n\t\t\t// reconnect with the OG v1 scheme.\n\t\t\tlog.Debugf(\"Received transport error during \" +\n\t\t\t\t\"v2 handshake, retying downgraded v1 \" +\n\t\t\t\t\"connection.\")\n\n\t\t\tp.shouldDowngradeToV1.Store(true)\n\n\t\t\treturn ErrShouldDowngradeToV1\n\t\t}\n\n\t\t// If we are the recipient, we can fail.\n\t\tlog.Errorf(\"Failed to receive peer's ellswift key data: %v\",\n\t\t\terr)\n\t\treturn err\n\t}\n\n\tlog.Tracef(\"Received %d bytes for peer's ellswift key\", len(recvData))\n\n\tvar ellswiftTheirs [64]byte\n\n\tif initiating {\n\t\t// If we are initiating, read all 64 bytes into ellswiftTheirs.\n\t\tcopy(ellswiftTheirs[:], recvData)\n\t} else {\n\t\t// If we are the responder, then we need to account for the\n\t\t// bytes already received as part of matching against the\n\t\t// starting v1 transport bytes. We sanity check receivedPrefix\n\t\t// in case it is too large for some reason.\n\t\tprefixLen := len(receivedPrefix)\n\t\tif prefixLen > 16 {\n\t\t\tlog.Errorf(\"Responder's received prefix length %d is \"+\n\t\t\t\t\"too large (> 16)\", prefixLen)\n\n\t\t\treturn errPrefixTooLarge\n\t\t}\n\n\t\tcopy(ellswiftTheirs[:], receivedPrefix)\n\t\tcopy(ellswiftTheirs[prefixLen:], recvData)\n\t}\n\n\tlog.Tracef(\"Assembled peer's ellswift key: %x\", ellswiftTheirs)\n\n\t// Calculate the v1 protocol's message prefix and see if the bytes read\n\t// read into ellswiftTheirs matches it.\n\tv1Prefix := createV1Prefix(btcnet)\n\n\t// ellswiftTheirs should be at least 16 bytes if receive succeeded, but\n\t// just in case, check the size.\n\tif len(ellswiftTheirs) < 16 {\n\t\tlog.Errorf(\"Received insufficient bytes (%d) for \"+\n\n\t\t\t\"ellswift key\", len(ellswiftTheirs))\n\t\treturn errInsufficientBytes\n\t}\n\n\tif !initiating && bytes.Equal(ellswiftTheirs[4:16], v1Prefix[4:16]) {\n\t\tlog.Warnf(\"Peer sent v1 version message for wrong network \"+\n\t\t\t\"(expected %v)\", btcnet)\n\t\treturn errWrongNetV1Peer\n\t}\n\n\tlog.Debug(\"Calculating ECDH shared secret\")\n\n\t// Calculate the shared secret to be used in creating the packet\n\t// ciphers.\n\tecdhSecret, err := ellswift.V2Ecdh(\n\t\tp.privkeyOurs, ellswiftTheirs, p.ellswiftOurs, initiating,\n\t)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to calculate ECDH shared secret: %v\", err)\n\t\treturn err\n\t}\n\n\tlog.Tracef(\"Calculated ECDH shared secret: %x\", ecdhSecret)\n\n\terr = p.createV2Ciphers(ecdhSecret[:], initiating, btcnet)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Send garbage terminator.\n\tlog.Debugf(\"Sending garbage terminator: %x\", p.sendGarbageTerm)\n\tp.Send(p.sendGarbageTerm[:])\n\n\t// Optionally send decoy packets after garbage terminator.\n\taad := p.sentGarbage\n\tfor i := 0; i < len(decoyContentLens); i++ {\n\t\tlog.Tracef(\"Sending decoy packet %d (content_len=%d)\",\n\t\t\ti+1, decoyContentLens[i])\n\n\t\tdecoyContent := make([]byte, decoyContentLens[i])\n\n\t\tencPacket, _, err := p.V2EncPacket(decoyContent, aad, true)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to encrypt/send decoy \"+\n\t\t\t\t\"packet %d: %v\", i+1, err)\n\t\t\treturn err\n\t\t}\n\n\t\tp.Send(encPacket)\n\n\t\t// AAD is only used for the first packet after the handshake.\n\t\taad = nil\n\t}\n\n\t// Send version packet.\n\tlog.Debug(\"Sending version packet\")\n\t_, _, err = p.V2EncPacket(transportVersion, aad, false)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to encrypt/send version packet: %v\", err)\n\t\treturn err\n\t}\n\n\tlog.Debugf(\"Receiving garbage, looking for terminator: %x\",\n\t\tp.recvGarbageTerm)\n\n\t// Skip garbage until encountering garbage terminator.\n\trecvGarbage, _, err := p.Receive(16)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to receive initial 16 bytes of \"+\n\t\t\t\"garbage: %v\", err)\n\t\treturn err\n\t}\n\n\tlog.Tracef(\"Received initial garbage chunk: %x\", recvGarbage)\n\n\t// The BIP text states that we can read up to 4111 bytes. We've already\n\t// read 16 bytes for the garbage terminator, so we need to read up to\n\t// maxGarbageLen more bytes.\n\tfor i := 0; i < MaxGarbageLen; i++ {\n\t\trecvGarbageLen := len(recvGarbage)\n\n\t\tif bytes.Equal(recvGarbage[recvGarbageLen-16:],\n\t\t\tp.recvGarbageTerm) {\n\n\t\t\tlog.Debugf(\"Found garbage terminator after %d total \"+\n\t\t\t\t\"bytes\", recvGarbageLen)\n\n\t\t\tlog.Tracef(\"Processing %d bytes preceding garbage \"+\n\t\t\t\t\"terminator\", recvGarbageLen-16)\n\n\t\t\t// Process any potential packet data sent before the\n\t\t\t// terminator.\n\t\t\t_, err = p.V2ReceivePacket(\n\t\t\t\trecvGarbage[:recvGarbageLen-16],\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\tlog.Errorf(\"Error processing packet data \"+\n\t\t\t\t\t\"before garbage terminator: %v\", err)\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\n\t\tlog.Tracef(\"Garbage terminator not found, receiving 1 more \"+\n\t\t\t\"byte (total_received=%d)\", recvGarbageLen)\n\n\t\trecvData, _, err := p.Receive(1)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to receive garbage \"+\n\t\t\t\t\"byte %d: %v\", recvGarbageLen+1, err)\n\t\t\treturn err\n\t\t}\n\n\t\trecvGarbage = append(recvGarbage, recvData...)\n\t}\n\n\tlog.Warnf(\"Garbage terminator not received after %d \"+\n\t\t\"bytes\", len(recvGarbage))\n\n\treturn errGarbageTermNotRecv\n}\n\n// V2EncPacket takes the contents and aad and returns a ciphertext.\nfunc (p *Peer) V2EncPacket(contents []byte, aad []byte, ignore bool) ([]byte,\n\tint, error) {\n\n\tlog.Tracef(\"Encrypting packet (content_len=%d, aad_len=%d, ignore=%v)\",\n\t\tlen(contents), len(aad), ignore)\n\n\tcontentLen := len(contents)\n\n\tif contentLen > maxContentLen {\n\t\tlog.Errorf(\"Content length %d exceeds max %d\",\n\t\t\tcontentLen, maxContentLen)\n\n\t\treturn nil, 0, errContentLengthExceeded\n\t}\n\n\t// Construct the packet's header based on whether or not the peer\n\t// should ignore this packet (i.e. if this is a decoy packet).\n\tignoreNum := 0\n\tif ignore {\n\t\tignoreNum = 1\n\t}\n\n\tignoreNum <<= ignoreBitPos\n\n\theader := []byte{byte(ignoreNum)}\n\n\tlog.Tracef(\"Packet header: %x\", header)\n\n\tplaintext := make([]byte, 0, contentLen+1)\n\tplaintext = append(plaintext, header...)\n\tplaintext = append(plaintext, contents...)\n\n\tlog.Tracef(\"Plaintext (header + content): %x\", plaintext)\n\n\taeadCiphertext, err := p.sendP.Encrypt(aad, plaintext)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to encrypt packet content: %v\", err)\n\t\treturn nil, 0, err\n\t}\n\n\tlog.Tracef(\"AEAD ciphertext: %x\", aeadCiphertext)\n\n\t// We cut off a byte when feeding to Crypt.\n\tcontentsLE := make([]byte, 4)\n\tbinary.LittleEndian.PutUint32(contentsLE, uint32(contentLen))\n\n\tlog.Tracef(\"Encrypting content length %d (%x)\",\n\t\tcontentLen, contentsLE[:lengthFieldLen])\n\n\tencContentsLen, err := p.sendL.Crypt(contentsLE[:lengthFieldLen])\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to encrypt content length: %v\", err)\n\t\treturn nil, 0, err\n\t}\n\n\tlog.Tracef(\"Encrypted content length: %x\", encContentsLen)\n\n\tencPacket := make([]byte, 0, len(encContentsLen)+len(aeadCiphertext))\n\tencPacket = append(encPacket, encContentsLen...)\n\tencPacket = append(encPacket, aeadCiphertext...)\n\n\tlog.Tracef(\"Full encrypted packet: %x\", encPacket)\n\n\ttotalBytes, err := p.Send(encPacket)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to send encrypted packet: %v\", err)\n\n\t\t// Return the packet anyway, as some might have been sent.\n\t\treturn encPacket, totalBytes, err\n\t}\n\n\tlog.Tracef(\"Sent %d bytes for encrypted packet\", totalBytes)\n\n\treturn encPacket, totalBytes, err\n}\n\n// V2ReceivePacket takes the aad and decrypts a received packet.\nfunc (p *Peer) V2ReceivePacket(aad []byte) ([]byte, error) {\n\tlog.Tracef(\"Attempting to receive packet (aad_len=%d)\", len(aad))\n\n\tfor {\n\t\tlog.Tracef(\"Receiving %d bytes for encrypted length\",\n\t\t\tlengthFieldLen)\n\n\t\t// Decrypt the length field so we know how many more bytes to receive.\n\t\tencContentsLen, _, err := p.Receive(lengthFieldLen)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to receive encrypted length: %v\",\n\t\t\t\terr)\n\t\t\treturn nil, err\n\t\t}\n\n\t\tlog.Tracef(\"Received encrypted length: %x\", encContentsLen)\n\n\t\tcontentsLenBytes, err := p.recvL.Crypt(encContentsLen)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to decrypt content length: %v\", err)\n\t\t\treturn nil, err\n\t\t}\n\n\t\tlog.Tracef(\"Decrypted content length bytes: %x\",\n\t\t\tcontentsLenBytes)\n\n\t\tvar contentsLenLE [4]byte\n\t\tcopy(contentsLenLE[:], contentsLenBytes)\n\n\t\tcontentsLen := binary.LittleEndian.Uint32(contentsLenLE[:])\n\n\t\tlog.Tracef(\"Decrypted content length=%d\", contentsLen)\n\n\t\tif contentsLen > maxContentLen {\n\t\t\tlog.Errorf(\"Decrypted content length %d exceeds \"+\n\t\t\t\t\"max %d\", contentsLen, maxContentLen)\n\n\t\t\treturn nil, errContentLengthExceeded\n\t\t}\n\n\t\t// Decrypt the remainder of the packet.\n\t\tnumBytes := headerLen + int(contentsLen) + chachapoly1305Expansion\n\n\t\tlog.Tracef(\"Receiving %d bytes for encrypted packet body\",\n\t\t\tnumBytes)\n\n\t\taeadCiphertext, _, err := p.Receive(numBytes)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to receive encrypted \"+\n\t\t\t\t\"packet body: %v\", err)\n\t\t\treturn nil, err\n\t\t}\n\n\t\tlog.Tracef(\"Received encrypted packet body: %x\", aeadCiphertext)\n\n\t\tplaintext, err := p.recvP.Decrypt(aad, aeadCiphertext)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to decrypt packet body: %v\", err)\n\t\t\treturn nil, err\n\t\t}\n\n\t\tlog.Tracef(\"Decrypted plaintext (header + content): %x\",\n\t\t\tplaintext)\n\n\t\t// Only the first packet is expected to have non-empty AAD. If\n\t\t// the ignore bit is set, ignore the packet.\n\t\t//\n\t\t// TODO: will this cause anything to leak?\n\t\t// AAD is only used for the first packet after the handshake.\n\t\taad = nil\n\t\theader := plaintext[:headerLen]\n\t\tlog.Tracef(\"Packet header: %x\", header)\n\t\tif (header[0] & (1 << ignoreBitPos)) == 0 {\n\t\t\tlog.Tracef(\"Ignore bit not set, returning content \"+\n\t\t\t\t\"(len=%d)\", len(plaintext[headerLen:]))\n\n\t\t\treturn plaintext[headerLen:], nil\n\t\t}\n\n\t\tlog.Debugf(\"Ignore bit set, discarding packet \"+\n\t\t\t\"(content_len=%d)\", contentsLen)\n\t}\n}\n\n// ReceivedPrefix returns the partial header bytes we've already received.\nfunc (p *Peer) ReceivedPrefix() []byte {\n\treturn p.receivedPrefix\n}\n\n// ShouldDowngradeToV1 returns true if the v2 handshake failed in a way that\n// suggests the peer does not support v2 and a v1 connection should be\n// attempted.\nfunc (p *Peer) ShouldDowngradeToV1() bool {\n\treturn p.shouldDowngradeToV1.Load()\n}\n\n// UseWriterReader uses the passed-in ReadWriter to Send/Receive to/from.\nfunc (p *Peer) UseReadWriter(rw io.ReadWriter) {\n\tp.rw = rw\n}\n\n// Send sends data to the underlying connection. It returns the number of bytes\n// sent or an error.\nfunc (p *Peer) Send(data []byte) (int, error) {\n\tlog.Tracef(\"Sending %d bytes\", len(data))\n\tn, err := p.rw.Write(data)\n\tif err != nil {\n\t\tlog.Errorf(\"Send failed after %d bytes: %v\", n, err)\n\t} else {\n\t\tlog.Tracef(\"Sent %d bytes successfully\", n)\n\t}\n\treturn n, err\n}\n\n// Receive receives numBytes bytes from the underlying connection.\nfunc (p *Peer) Receive(numBytes int) ([]byte, int, error) {\n\tb := make([]byte, numBytes)\n\tindex := 0\n\ttotal := 0\n\n\tlog.Tracef(\"Attempting to receive %d bytes\", numBytes)\n\n\tfor {\n\t\t// TODO: Use something that inherently prevents going over?\n\t\tif total > numBytes {\n\t\t\t// This should be logically impossible with io.ReadFull\n\t\t\t// semantics used implicitly by the loop structure.\n\t\t\tlog.Criticalf(\"Receive logic error: total=%d > \"+\n\t\t\t\t\"numBytes=%d\", total, numBytes)\n\t\t\treturn nil, total, errFailedToRecv\n\t\t}\n\n\t\tif total == numBytes {\n\t\t\tlog.Tracef(\"Successfully received %d bytes\", total)\n\t\t\treturn b, total, nil\n\t\t}\n\n\t\tlog.Tracef(\"Calling Read (need %d bytes, have \"+\n\t\t\t\"%d)\", numBytes-total, total)\n\n\t\tn, err := p.rw.Read(b[index:])\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Receive failed after reading %d bytes \"+\n\t\t\t\t\"(target %d): %v\", total+n, numBytes, err)\n\t\t\treturn nil, total, err\n\t\t}\n\n\t\tlog.Tracef(\"Read returned %d bytes\", n)\n\n\t\ttotal += n\n\t\tindex += n\n\t}\n}\n"
  },
  {
    "path": "v2transport/transport_test.go",
    "content": "package v2transport\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/btcec/v2\"\n\t\"github.com/btcsuite/btcd/btcec/v2/ellswift\"\n)\n\nfunc setHex(hexString string) *btcec.FieldVal {\n\tif len(hexString)%2 != 0 {\n\t\thexString = \"0\" + hexString\n\t}\n\tbytes, _ := hex.DecodeString(hexString)\n\n\tvar f btcec.FieldVal\n\tf.SetByteSlice(bytes)\n\n\treturn &f\n}\n\nconst (\n\tmainNet = 0xd9b4bef9\n)\n\nfunc TestPacketEncodingVectors(t *testing.T) {\n\ttests := []struct {\n\t\tinIdx                 int\n\t\tinPrivOurs            string\n\t\tinEllswiftOurs        string\n\t\tinEllswiftTheirs      string\n\t\tinInitiating          bool\n\t\tinContents            string\n\t\tinMultiply            int\n\t\tinAad                 string\n\t\tinIgnore              bool\n\t\tmidXOurs              string\n\t\tmidXTheirs            string\n\t\tmidXShared            string\n\t\tmidSharedSecret       string\n\t\tmidInitiatorL         string\n\t\tmidInitiatorP         string\n\t\tmidResponderL         string\n\t\tmidResponderP         string\n\t\tmidSendGarbageTerm    string\n\t\tmidRecvGarbageTerm    string\n\t\toutSessionID          string\n\t\toutCiphertext         string\n\t\toutCiphertextEndsWith string\n\t}{\n\t\t{\n\t\t\tinIdx:                 1,\n\t\t\tinPrivOurs:            \"61062ea5071d800bbfd59e2e8b53d47d194b095ae5a4df04936b49772ef0d4d7\",\n\t\t\tinEllswiftOurs:        \"ec0adff257bbfe500c188c80b4fdd640f6b45a482bbc15fc7cef5931deff0aa186f6eb9bba7b85dc4dcc28b28722de1e3d9108b985e2967045668f66098e475b\",\n\t\t\tinEllswiftTheirs:      \"a4a94dfce69b4a2a0a099313d10f9f7e7d649d60501c9e1d274c300e0d89aafaffffffffffffffffffffffffffffffffffffffffffffffffffffffff8faf88d5\",\n\t\t\tinInitiating:          true,\n\t\t\tinContents:            \"8e\",\n\t\t\tinMultiply:            1,\n\t\t\tinAad:                 \"\",\n\t\t\tinIgnore:              false,\n\t\t\tmidXOurs:              \"19e965bc20fc40614e33f2f82d4eeff81b5e7516b12a5c6c0d6053527eba0923\",\n\t\t\tmidXTheirs:            \"0c71defa3fafd74cb835102acd81490963f6b72d889495e06561375bd65f6ffc\",\n\t\t\tmidXShared:            \"4eb2bf85bd00939468ea2abb25b63bc642e3d1eb8b967fb90caa2d89e716050e\",\n\t\t\tmidSharedSecret:       \"c6992a117f5edbea70c3f511d32d26b9798be4b81a62eaee1a5acaa8459a3592\",\n\t\t\tmidInitiatorL:         \"9a6478b5fbab1f4dd2f78994b774c03211c78312786e602da75a0d1767fb55cf\",\n\t\t\tmidInitiatorP:         \"7d0c7820ba6a4d29ce40baf2caa6035e04f1e1cefd59f3e7e59e9e5af84f1f51\",\n\t\t\tmidResponderL:         \"17bc726421e4054ac6a1d54915085aaa766f4d3cf67bbd168e6080eac289d15e\",\n\t\t\tmidResponderP:         \"9f0fc1c0e85fd9a8eee07e6fc41dba2ff54c7729068a239ac97c37c524cca1c0\",\n\t\t\tmidSendGarbageTerm:    \"faef555dfcdb936425d84aba524758f3\",\n\t\t\tmidRecvGarbageTerm:    \"02cb8ff24307a6e27de3b4e7ea3fa65b\",\n\t\t\toutSessionID:          \"ce72dffb015da62b0d0f5474cab8bc72605225b0cee3f62312ec680ec5f41ba5\",\n\t\t\toutCiphertext:         \"7530d2a18720162ac09c25329a60d75adf36eda3c3\",\n\t\t\toutCiphertextEndsWith: \"\",\n\t\t},\n\t\t{\n\t\t\tinIdx:                 999,\n\t\t\tinPrivOurs:            \"1f9c581b35231838f0f17cf0c979835baccb7f3abbbb96ffcc318ab71e6e126f\",\n\t\t\tinEllswiftOurs:        \"a1855e10e94e00baa23041d916e259f7044e491da6171269694763f018c7e63693d29575dcb464ac816baa1be353ba12e3876cba7628bd0bd8e755e721eb0140\",\n\t\t\tinEllswiftTheirs:      \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\tinInitiating:          false,\n\t\t\tinContents:            \"3eb1d4e98035cfd8eeb29bac969ed3824a\",\n\t\t\tinMultiply:            1,\n\t\t\tinAad:                 \"\",\n\t\t\tinIgnore:              false,\n\t\t\tmidXOurs:              \"45b6f1f684fd9f2b16e2651ddc47156c0695c8c5cd2c0c9df6d79a1056c61120\",\n\t\t\tmidXTheirs:            \"edd1fd3e327ce90cc7a3542614289aee9682003e9cf7dcc9cf2ca9743be5aa0c\",\n\t\t\tmidXShared:            \"c40eb6190caf399c9007254ad5e5fa20d64af2b41696599c59b2191d16992955\",\n\t\t\tmidSharedSecret:       \"a0138f564f74d0ad70bc337dacc9d0bf1d2349364caf1188a1e6e8ddb3b7b184\",\n\t\t\tmidInitiatorL:         \"b82a0a7ce7219777f914d2ab873c5c487c56bd7b68622594d67fe029a8fa7def\",\n\t\t\tmidInitiatorP:         \"d760ba8f62dd3d29d7d5584e310caf2540285edc6b51c640f9497e99c3536fd2\",\n\t\t\tmidResponderL:         \"9db0c6f9a903cbab5d7b3c58273a3421eec0001814ec53236bd405131a0d8e90\",\n\t\t\tmidResponderP:         \"23d2b5e653e6a3a8db160a2ca03d11cb5a79983babba861fcb57c38413323c0c\",\n\t\t\tmidSendGarbageTerm:    \"efb64fd80acd3825ac9bc2a67216535a\",\n\t\t\tmidRecvGarbageTerm:    \"b3cb553453bceb002897e751ff7588bf\",\n\t\t\toutSessionID:          \"9267c54560607de73f18c563b76a2442718879c52dd39852885d4a3c9912c9ea\",\n\t\t\toutCiphertext:         \"1da1bcf589f9b61872f45b7fa5371dd3f8bdf5d515b0c5f9fe9f0044afb8dc0aa1cd39a8c4\",\n\t\t\toutCiphertextEndsWith: \"\",\n\t\t},\n\t\t{\n\t\t\tinIdx:                 0,\n\t\t\tinPrivOurs:            \"0286c41cd30913db0fdff7a64ebda5c8e3e7cef10f2aebc00a7650443cf4c60d\",\n\t\t\tinEllswiftOurs:        \"d1ee8a93a01130cbf299249a258f94feb5f469e7d0f2f28f69ee5e9aa8f9b54a60f2c3ff2d023634ec7f4127a96cc11662e402894cf1f694fb9a7eaa5f1d9244\",\n\t\t\tinEllswiftTheirs:      \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff22d5e441524d571a52b3def126189d3f416890a99d4da6ede2b0cde1760ce2c3f98457ae\",\n\t\t\tinInitiating:          true,\n\t\t\tinContents:            \"054290a6c6ba8d80478172e89d32bf690913ae9835de6dcf206ff1f4d652286fe0ddf74deba41d55de3edc77c42a32af79bbea2c00bae7492264c60866ae5a\",\n\t\t\tinMultiply:            1,\n\t\t\tinAad:                 \"84932a55aac22b51e7b128d31d9f0550da28e6a3f394224707d878603386b2f9d0c6bcd8046679bfed7b68c517e7431e75d9dd34605727d2ef1c2babbf680ecc8d68d2c4886e9953a4034abde6da4189cd47c6bb3192242cf714d502ca6103ee84e08bc2ca4fd370d5ad4e7d06c7fbf496c6c7cc7eb19c40c61fb33df2a9ba48497a96c98d7b10c1f91098a6b7b16b4bab9687f27585ade1491ae0dba6a79e1e2d85dd9d9d45c5135ca5fca3f0f99a60ea39edbc9efc7923111c937913f225d67788d5f7e8852b697e26b92ec7bfcaa334a1665511c2b4c0a42d06f7ab98a9719516c8fd17f73804555ee84ab3b7d1762f6096b778d3cb9c799cbd49a9e4a325197b4e6cc4a5c4651f8b41ff88a92ec428354531f970263b467c77ed11312e2617d0d53fe9a8707f51f9f57a77bfb49afe3d89d85ec05ee17b9186f360c94ab8bb2926b65ca99dae1d6ee1af96cad09de70b6767e949023e4b380e66669914a741ed0fa420a48dbc7bfae5ef2019af36d1022283dd90655f25eec7151d471265d22a6d3f91dc700ba749bb67c0fe4bc0888593fbaf59d3c6fff1bf756a125910a63b9682b597c20f560ecb99c11a92c8c8c3f7fbfaa103146083a0ccaecf7a5f5e735a784a8820155914a289d57d8141870ffcaf588882332e0bcd8779efa931aa108dab6c3cce76691e345df4a91a03b71074d66333fd3591bff071ea099360f787bbe43b7b3dff2a59c41c7642eb79870222ad1c6f2e5a191ed5acea51134679587c9cf71c7d8ee290be6bf465c4ee47897a125708704ad610d8d00252d01959209d7cd04d5ecbbb1419a7e84037a55fefa13dee464b48a35c96bcb9a53e7ed461c3a1607ee00c3c302fd47cd73fda7493e947c9834a92d63dcfbd65aa7c38c3e3a2748bb5d9a58e7495d243d6b741078c8f7ee9c8813e473a323375702702b0afae1550c8341eedf5247627343a95240cb02e3e17d5dca16f8d8d3b2228e19c06399f8ec5c5e9dbe4caef6a0ea3ffb1d3c7eac03ae030e791fa12e537c80d56b55b764cadf27a8701052df1282ba8b5e3eb62b5dc7973ac40160e00722fa958d95102fc25c549d8c0e84bed95b7acb61ba65700c4de4feebf78d13b9682c52e937d23026fb4c6193e6644e2d3c99f91f4f39a8b9fc6d013f89c3793ef703987954dc0412b550652c01d922f525704d32d70d6d4079bc3551b563fb29577b3aecdc9505011701dddfd94830431e7a4918927ee44fb3831ce8c4513839e2deea1287f3fa1ab9b61a256c09637dbc7b4f0f8fbb783840f9c24526da883b0df0c473cf231656bd7bc1aaba7f321fec0971c8c2c3444bff2f55e1df7fea66ec3e440a612db9aa87bb505163a59e06b96d46f50d8120b92814ac5ab146bc78dbbf91065af26107815678ce6e33812e6bf3285d4ef3b7b04b076f21e7820dcbfdb4ad5218cf4ff6a65812d8fcb98ecc1e95e2fa58e3efe4ce26cd0bd400d6036ab2ad4f6c713082b5e3f1e04eb9e3b6c8f63f57953894b9e220e0130308e1fd91f72d398c1e7962ca2c31be83f31d6157633581a0a6910496de8d55d3d07090b6aa087159e388b7e7dec60f5d8a60d93ca2ae91296bd484d916bfaaa17c8f45ea4b1a91b37c82821199a2b7596672c37156d8701e7352aa48671d3b1bbbd2bd5f0a2268894a25b0cb2514af39c8743f8cce8ab4b523053739fd8a522222a09acf51ac704489cf17e4b7125455cb8f125b4d31af1eba1f8cf7f81a5a100a141a7ee72e8083e065616649c241f233645c5fc865d17f0285f5c52d9f45312c979bfb3ce5f2a1b951deddf280ffb3f370410cffd1583bfa90077835aa201a0712d1dcd1293ee177738b14e6b5e2a496d05220c3253bb6578d6aff774be91946a614dd7e879fb3dcf7451e0b9adb6a8c44f53c2c464bcc0019e9fad89cac7791a0a3f2974f759a9856351d4d2d7c5612c17cfc50f8479945df57716767b120a590f4bf656f4645029a525694d8a238446c5f5c2c1c995c09c1405b8b1eb9e0352ffdf766cc964f8dcf9f8f043dfab6d102cf4b298021abd78f1d9025fa1f8e1d710b38d9d1652f2d88d1305874ec41609b6617b65c5adb19b6295dc5c5da5fdf69f28144ea12f17c3c6fcce6b9b5157b3dfc969d6725fa5b098a4d9b1d31547ed4c9187452d281d0a5d456008caf1aa251fac8f950ca561982dc2dc908d3691ee3b6ad3ae3d22d002577264ca8e49c523bd51c4846be0d198ad9407bf6f7b82c79893eb2c05fe9981f687a97a4f01fe45ff8c8b7ecc551135cd960a0d6001ad35020be07ffb53cb9e731522ca8ae9364628914b9b8e8cc2f37f03393263603cc2b45295767eb0aac29b0930390eb89587ab2779d2e3decb8042acece725ba42eda650863f418f8d0d50d104e44fbbe5aa7389a4a144a8cecf00f45fb14c39112f9bfb56c0acbd44fa3ff261f5ce4acaa5134c2c1d0cca447040820c81ab1bcdc16aa075b7c68b10d06bbb7ce08b5b805e0238f24402cf24a4b4e00701935a0c68add3de090903f9b85b153cb179a582f57113bfc21c2093803f0cfa4d9d4672c2b05a24f7e4c34a8e9101b70303a7378b9c50b6cddd46814ef7fd73ef6923feceab8fc5aa8b0d185f2e83c7a99dcb1077c0ab5c1f5d5f01ba2f0420443f75c4417db9ebf1665efbb33dca224989920a64b44dc26f682cc77b4632c8454d49135e52503da855bc0f6ff8edc1145451a9772c06891f41064036b66c3119a0fc6e80dffeb65dc456108b7ca0296f4175fff3ed2b0f842cd46bd7e86f4c62dfaf1ddbf836263c00b34803de164983d0811cebfac86e7720c726d3048934c36c23189b02386a722ca9f0fe00233ab50db928d3bccea355cc681144b8b7edcaae4884d5a8f04425c0890ae2c74326e138066d8c05f4c82b29df99b034ea727afde590a1f2177ace3af99cfb1729d6539ce7f7f7314b046aab74497e63dd399e1f7d5f16517c23bd830d1fdee810f3c3b77573dd69c4b97d80d71fb5a632e00acdfa4f8e829faf3580d6a72c40b28a82172f8dcd4627663ebf6069736f21735fd84a226f427cd06bb055f94e7c92f31c48075a2955d82a5b9d2d0198ce0d4e131a112570a8ee40fb80462a81436a58e7db4e34b6e2c422e82f934ecda9949893da5730fc5c23c7c920f363f85ab28cc6a4206713c3152669b47efa8238fa826735f17b4e78750276162024ec85458cd5808e06f40dd9fd43775a456a3ff6cae90550d76d8b2899e0762ad9a371482b3e38083b1274708301d6346c22fea9bb4b73db490ff3ab05b2f7f9e187adef139a7794454b7300b8cc64d3ad76c0e4bc54e08833a4419251550655380d675bc91855aeb82585220bb97f03e976579c08f321b5f8f70988d3061f41465517d53ac571dbf1b24b94443d2e9a8e8a79b392b3d6a4ecdd7f626925c365ef6221305105ce9b5f5b6ecc5bed3d702bd4b7f5008aa8eb8c7aa3ade8ecf6251516fbefeea4e1082aa0e1848eddb31ffe44b04792d296054402826e4bd054e671f223e5557e4c94f89ca01c25c44f1a2ff2c05a70b43408250705e1b858bf0670679fdcd379203e36be3500dd981b1a6422c3cf15224f7fefdef0a5f225c5a09d15767598ecd9e262460bb33a4b5d09a64591efabc57c923d3be406979032ae0bc0997b65336a06dd75b253332ad6a8b63ef043f780a1b3fb6d0b6cad98b1ef4a02535eb39e14a866cfc5fc3a9c5deb2261300d71280ebe66a0776a151469551c3c5fa308757f956655278ec6330ae9e3625468c5f87e02cd9a6489910d4143c1f4ee13aa21a6859d907b788e28572fecee273d44e4a900fa0aa668dd861a60fb6b6b12c2c5ef3c8df1bd7ef5d4b0d1cdb8c15fffbb365b9784bd94abd001c6966216b9b67554ad7cb7f958b70092514f7800fc40244003e0fd1133a9b850fb17f4fcafde07fc87b07fb510670654a5d2d6fc9876ac74728ea41593beef003d6858786a52d3a40af7529596767c17000bfaf8dc52e871359f4ad8bf6e7b2853e5229bdf39657e213580294a5317c5df172865e1e17fe37093b585e04613f5f078f761b2b1752eb32983afda24b523af8851df9a02b37e77f543f18888a782a994a50563334282bf9cdfccc183fdf4fcd75ad86ee0d94f91ee2300a5befbccd14e03a77fc031a8cfe4f01e4c5290f5ac1da0d58ea054bd4837cfd93e5e34fc0eb16e48044ba76131f228d16cde9b0bb978ca7cdcd10653c358bdb26fdb723a530232c32ae0a4cecc06082f46e1c1d596bfe60621ad1e354e01e07b040cc7347c016653f44d926d13ca74e6cbc9d4ab4c99f4491c95c76fff5076b3936eb9d0a286b97c035ca88a3c6309f5febfd4cdaac869e4f58ed409b1e9eb4192fb2f9c2f12176d460fd98286c9d6df84598f260119fd29c63f800c07d8df83d5cc95f8c2fea2812e7890e8a0718bb1e031ecbebc0436dcf3e3b9a58bcc06b4c17f711f80fe1dffc3326a6eb6e00283055c6dabe20d311bfd5019591b7954f8163c9afad9ef8390a38f3582e0a79cdf0353de8eeb6b5f9f27b16ffdef7dd62869b4840ee226ccdce95e02c4545eb981b60571cd83f03dc5eaf8c97a0829a4318a9b3dc06c0e003db700b2260ff1fa8fee66890e637b109abb03ec901b05ca599775f48af50154c0e67d82bf0f558d7d3e0778dc38bea1eb5f74dc8d7f90abdf5511a424be66bf8b6a3cacb477d2e7ef4db68d2eba4d5289122d851f9501ba7e9c4957d8eba3be3fc8e785c4265a1d65c46f2809b70846c693864b169c9dcb78be26ea14b8613f145b01887222979a9e67aee5f800caa6f5c4229bdeefc901232ace6143c9865e4d9c07f51aa200afaf7e48a7d1d8faf366023beab12906ffcb3eaf72c0eb68075e4daf3c080e0c31911befc16f0cc4a09908bb7c1e26abab38bd7b788e1a09c0edf1a35a38d2ff1d3ed47fcdaae2f0934224694f5b56705b9409b6d3d64f3833b686f7576ec64bbdd6ff174e56c2d1edac0011f904681a73face26573fbba4e34652f7ae84acfb2fa5a5b3046f98178cd0831df7477de70e06a4c00e305f31aafc026ef064dd68fd3e4252b1b91d617b26c6d09b6891a00df68f105b5962e7f9d82da101dd595d286da721443b72b2aba2377f6e7772e33b3a5e3753da9c2578c5d1daab80187f55518c72a64ee150a7cb5649823c08c9f62cd7d020b45ec2cba8310db1a7785a46ab24785b4d54ff1660b5ca78e05a9a55edba9c60bf044737bc468101c4e8bd1480d749be5024adefca1d998abe33eaeb6b11fbb39da5d905fdd3f611b2e51517ccee4b8af72c2d948573505590d61a6783ab7278fc43fe55b1fcc0e7216444d3c8039bb8145ef1ce01c50e95a3f3feab0aee883fdb94cc13ee4d21c542aa795e18932228981690f4d4c57ca4db6eb5c092e29d8a05139d509a8aeb48baa1eb97a76e597a32b280b5e9d6c36859064c98ff96ef5126130264fa8d2f49213870d9fb036cff95da51f270311d9976208554e48ffd486470d0ecdb4e619ccbd8226147204baf8e235f54d8b1cba8fa34a9a4d055de515cdf180d2bb6739a175183c472e30b5c914d09eeb1b7dafd6872b38b48c6afc146101200e6e6a44fe5684e220adc11f5c403ddb15df8051e6bdef09117a3a5349938513776286473a3cf1d2788bb875052a2e6459fa7926da33380149c7f98d7700528a60c954e6f5ecb65842fde69d614be69eaa2040a4819ae6e756accf936e14c1e894489744a79c1f2c1eb295d13e2d767c09964b61f9cfe497649f712\",\n\t\t\tinIgnore:              false,\n\t\t\tmidXOurs:              \"33a32d10066fa3963a9518a14d1bd1cb5ccaceaeaaeddb4d7aead90c08395bfd\",\n\t\t\tmidXTheirs:            \"568146140669e69646a6ffeb3793e8010e2732209b4c34ec13e209a070109183\",\n\t\t\tmidXShared:            \"a1017beaa8784f283dee185cd847ae3a327a981e62ae21e8c5face175fc97e9b\",\n\t\t\tmidSharedSecret:       \"250b93570d411149105ab8cb0bc5079914906306368c23e9d77c2a33265b994c\",\n\t\t\tmidInitiatorL:         \"4ec7daf7294a4a2c717442dd21cf2f052a3bfe9d535b55da0f66fecf87a27534\",\n\t\t\tmidInitiatorP:         \"52ab4db9c4b06621f8ded3405691eb32465b1360d15a6b127ded4d15f9cde466\",\n\t\t\tmidResponderL:         \"ba9906da802407ddedf6733e29f3996c62425e79d3cbfeebbd6ec4cdc7c976a8\",\n\t\t\tmidResponderP:         \"ee661e18c97319ad071106bf35fe1085034832f70718d92f887932128b6100c7\",\n\t\t\tmidSendGarbageTerm:    \"d4e3f18ac2e2095edb5c3b94236118ad\",\n\t\t\tmidRecvGarbageTerm:    \"4faa6c4233d9fd53d170ede4172142a8\",\n\t\t\toutSessionID:          \"23f154ac43cfc59c4243e9fc68aeec8f19ad3942d74108e833b36f0dd3dcd357\",\n\t\t\toutCiphertext:         \"8da7de6ea7bf2a81a396a42880ba1f5756734c4821309ac9aeffa2a26ce86873b9dc4935a772de6ec5162c6d075b14536800fb174841153511bfb597e992e2fe8a450c4bce102cc550bb37fd564c4d60bf884e\",\n\t\t\toutCiphertextEndsWith: \"\",\n\t\t},\n\t\t{\n\t\t\tinIdx:                 223,\n\t\t\tinPrivOurs:            \"6c77432d1fda31e9f942f8af44607e10f3ad38a65f8a4bddae823e5eff90dc38\",\n\t\t\tinEllswiftOurs:        \"d2685070c1e6376e633e825296634fd461fa9e5bdf2109bcebd735e5a91f3e587c5cb782abb797fbf6bb5074fd1542a474f2a45b673763ec2db7fb99b737bbb9\",\n\t\t\tinEllswiftTheirs:      \"56bd0c06f10352c3a1a9f4b4c92f6fa2b26df124b57878353c1fc691c51abea77c8817daeeb9fa546b77c8daf79d89b22b0e1b87574ece42371f00237aa9d83a\",\n\t\t\tinInitiating:          false,\n\t\t\tinContents:            \"7e0e78eb6990b059e6cf0ded66ea93ef82e72aa2f18ac24f2fc6ebab561ae557420729da103f64cecfa20527e15f9fb669a49bbbf274ef0389b3e43c8c44e5f60bf2ac38e2b55e7ec4273dba15ba41d21f8f5b3ee1688b3c29951218caf847a97fb50d75a86515d445699497d968164bf740012679b8962de573be941c62b7ef\",\n\t\t\tinMultiply:            1,\n\t\t\tinAad:                 \"\",\n\t\t\tinIgnore:              true,\n\t\t\tmidXOurs:              \"193d019db571162e52567e0cfdf9dd6964394f32769ae2edc4933b03b502d771\",\n\t\t\tmidXTheirs:            \"2dd7b9cc85524f8670f695c3143ac26b45cebcabb2782a85e0fe15aee3956535\",\n\t\t\tmidXShared:            \"5e35f94adfd57976833bffec48ef6dde983d18a55501154191ea352ef06732ee\",\n\t\t\tmidSharedSecret:       \"1918b741ef5f9d1d7670b050c152b4a4ead2c31be9aecb0681c0cd4324150853\",\n\t\t\tmidInitiatorL:         \"97124c56236425d792b1ec85e34b846e8d88c9b9f1d4f23ac6cdcc4c177055a0\",\n\t\t\tmidInitiatorP:         \"8c71b468c61119415e3c1dfdd184134211951e2f623199629a46bff9673611f2\",\n\t\t\tmidResponderL:         \"b43b8791b51ed682f56d64351601be28e478264411dcf963b14ee60b9ae427fa\",\n\t\t\tmidResponderP:         \"794dde4b38ef04250c534a7fa638f2e8cc8b6d2c6110ec290ab0171fdf277d51\",\n\t\t\tmidSendGarbageTerm:    \"cf2e25f23501399f30738d7eee652b90\",\n\t\t\tmidRecvGarbageTerm:    \"225a477a28a54ea7671d2b217a9c29db\",\n\t\t\toutSessionID:          \"7ec02fea8c1484e3d0875f978c5f36d63545e2e4acf56311394422f4b66af612\",\n\t\t\toutCiphertext:         \"\",\n\t\t\toutCiphertextEndsWith: \"729847a3e9eba7a5bff454b5de3b393431ee360736b6c030d7a5bd01d1203d2e98f528543fd2bf886ccaa1ada5e215a730a36b3f4abfc4e252c89eb01d9512f94916dae8a76bf16e4da28986ffe159090fe5267ee3394300b7ccf4dfad389a26321b3a3423e4594a82ccfbad16d6561ecb8772b0cb040280ff999a29e3d9d4fd\",\n\t\t},\n\t\t{\n\t\t\tinIdx:                 448,\n\t\t\tinPrivOurs:            \"a6ec25127ca1aa4cf16b20084ba1e6516baae4d32422288e9b36d8bddd2de35a\",\n\t\t\tinEllswiftOurs:        \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff053d7ecca53e33e185a8b9be4e7699a97c6ff4c795522e5918ab7cd6b6884f67e683f3dc\",\n\t\t\tinEllswiftTheirs:      \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa7730be30000000000000000000000000000000000000000000000000000000000000000\",\n\t\t\tinInitiating:          true,\n\t\t\tinContents:            \"00cf68f8f7ac49ffaa02c4864fdf6dfe7bbf2c740b88d98c50ebafe32c92f3427f57601ffcb21a3435979287db8fee6c302926741f9d5e464c647eeb9b7acaeda46e00abd7506fc9a719847e9a7328215801e96198dac141a15c7c2f68e0690dd1176292a0dded04d1f548aad88f1aebdc0a8f87da4bb22df32dd7c160c225b843e83f6525d6d484f502f16d923124fc538794e21da2eb689d18d87406ecced5b9f92137239ed1d37bcfa7836641a83cf5e0a1cf63f51b06f158e499a459ede41c\",\n\t\t\tinMultiply:            1,\n\t\t\tinAad:                 \"\",\n\t\t\tinIgnore:              false,\n\t\t\tmidXOurs:              \"02b225089255f7b02b20276cfe9779144df8fb1957b477bff3239d802d1256e9\",\n\t\t\tmidXTheirs:            \"5232c4b6bde9d3d45d7b763ebd7495399bb825cc21de51011761cd81a51bdc84\",\n\t\t\tmidXShared:            \"379223d2f1ea7f8a22043c4ce4122623098309e15b1ce58286ebe3d3bf40f4e1\",\n\t\t\tmidSharedSecret:       \"dd210aa6629f20bb328e5d89daa6eb2ac3d1c658a725536ff154f31b536c23b2\",\n\t\t\tmidInitiatorL:         \"393472f85a5cc6b0f02c4bd466db7a2dc5b91fc9dcb15c0dd6dc21116ece8bca\",\n\t\t\tmidInitiatorP:         \"c80b87b793db47320b2795db66d331bd3021cc24e360d59d0fa8974f54687e0c\",\n\t\t\tmidResponderL:         \"ef16a43d77e2b270b0a145ee1618d35f3c943cc7877d6cfcff2287d41692be39\",\n\t\t\tmidResponderP:         \"20d4b62e2d982c61bb0cc39a93283d98af36530ef12331d44b2477b0e521b490\",\n\t\t\tmidSendGarbageTerm:    \"fead69be77825a23daec377c362aa560\",\n\t\t\tmidRecvGarbageTerm:    \"511d4980526c5e64aa7187462faeafdd\",\n\t\t\toutSessionID:          \"acb8f084ea763ddd1b92ac4ed23bf44de20b84ab677d4e4e6666a6090d40353d\",\n\t\t\toutCiphertext:         \"\",\n\t\t\toutCiphertextEndsWith: \"77b4656934a82de1a593d8481f020194ddafd8cac441f9d72aeb8721e6a14f49698ca6d9b2b6d59d07a01aa552fd4d5b68d0d1617574c77dea10bfadbaa31b83885b7ceac2fd45e3e4a331c51a74e7b1698d81b64c87c73c5b9258b4d83297f9debc2e9aa07f8572ff434dc792b83ecf07b3197de8dc9cf7be56acb59c66cff5\",\n\t\t},\n\t\t{\n\t\t\tinIdx:                 673,\n\t\t\tinPrivOurs:            \"0af952659ed76f80f585966b95ab6e6fd68654672827878684c8b547b1b94f5a\",\n\t\t\tinEllswiftOurs:        \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc81017fd92fd31637c26c906b42092e11cc0d3afae8d9019d2578af22735ce7bc469c72d\",\n\t\t\tinEllswiftTheirs:      \"9652d78baefc028cd37a6a92625b8b8f85fde1e4c944ad3f20e198bef8c02f19fffffffffffffffffffffffffffffffffffffffffffffffffffffffff2e91870\",\n\t\t\tinInitiating:          false,\n\t\t\tinContents:            \"5c6272ee55da855bbbf7b1246d9885aa7aa601a715ab86fa46c50da533badf82b97597c968293ae04e\",\n\t\t\tinMultiply:            97561,\n\t\t\tinAad:                 \"\",\n\t\t\tinIgnore:              false,\n\t\t\tmidXOurs:              \"4b1767466fe2fb8deddf2dc52cc19c7e2032007e19bfb420b30a80152d0f22d6\",\n\t\t\tmidXTheirs:            \"64c383e0e78ac99476ddff2061683eeefa505e3666673a1371342c3e6c26981d\",\n\t\t\tmidXShared:            \"5bcfeac98d87e87e158bf839f1269705429f7af2a25b566a25811b5f9aef9560\",\n\t\t\tmidSharedSecret:       \"3568f2aea2e14ef4ee4a3c2a8b8d31bc5e3187ba86db10739b4ff8ec92ff6655\",\n\t\t\tmidInitiatorL:         \"c7df866a62b7d404eb530b2be245a7aece0fb4791402a1de8f33530cbf777cc1\",\n\t\t\tmidInitiatorP:         \"8f732e4aae2ba9314e0982492fa47954de9c189d92fbc549763b27b1b47642ce\",\n\t\t\tmidResponderL:         \"992085edfecb92c62a3a7f96ea416f853f34d0dfe065b966b6968b8b87a83081\",\n\t\t\tmidResponderP:         \"c5ba5eaf9e1c807154ebab3ea472499e815a7be56dfaf0c201cf6e91ffeca8e6\",\n\t\t\tmidSendGarbageTerm:    \"5e2375ac629b8df1e4ff3617c6255a70\",\n\t\t\tmidRecvGarbageTerm:    \"70bcbffcb62e4d29d2605d30bceef137\",\n\t\t\toutSessionID:          \"7332e92a3f9d2792c4d444fac5ed888c39a073043a65eefb626318fd649328f8\",\n\t\t\toutCiphertext:         \"\",\n\t\t\toutCiphertextEndsWith: \"657a4a19711ce593c3844cb391b224f60124aba7e04266233bc50cafb971e26c7716b76e98376448f7d214dd11e629ef9a974d60e3770a695810a61c4ba66d78b936ee7892b98f0b48ddae9fcd8b599dca1c9b43e9b95e0226cf8d4459b8a7c2c4e6db80f1d58c7b20dd7208fa5c1057fb78734223ee801dbd851db601fee61e\",\n\t\t},\n\t\t{\n\t\t\tinIdx:                 1024,\n\t\t\tinPrivOurs:            \"f90e080c64b05824c5a24b2501d5aeaf08af3872ee860aa80bdcd430f7b63494\",\n\t\t\tinEllswiftOurs:        \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff115173765dc202cf029ad3f15479735d57697af12b0131dd21430d5772e4ef11474d58b9\",\n\t\t\tinEllswiftTheirs:      \"12a50f3fafea7c1eeada4cf8d33777704b77361453afc83bda91eef349ae044d20126c6200547ea5a6911776c05dee2a7f1a9ba7dfbabbbd273c3ef29ef46e46\",\n\t\t\tinInitiating:          true,\n\t\t\tinContents:            \"5f67d15d22ca9b2804eeab0a66f7f8e3a10fa5de5809a046084348cbc5304e843ef96f59a59c7d7fdfe5946489f3ea297d941bac326225df316a25fc90f0e65b0d31a9c497e960fdbf8c482516bc8a9c1c77b7f6d0e1143810c737f76f9224e6f2c9af5186b4f7259c7e8d165b6e4fe3d38a60bdbdd4d06ecdcaaf62086070dbb68686b802d53dfd7db14b18743832605f5461ad81e2af4b7e8ff0eff0867a25b93cec7becf15c43131895fed09a83bf1ee4a87d44dd0f02a837bf5a1232e201cb882734eb9643dc2dc4d4e8b5690840766212c7ac8f38ad8a9ec47c7a9b3e022ae3eb6a32522128b518bd0d0085dd81c5\",\n\t\t\tinMultiply:            69615,\n\t\t\tinAad:                 \"\",\n\t\t\tinIgnore:              true,\n\t\t\tmidXOurs:              \"8b8de966150bf872b4b695c9983df519c909811954d5d76e99ed0d5f1860247b\",\n\t\t\tmidXTheirs:            \"eef379db9bd4b1aa90fc347fad33f7d53083389e22e971036f59f4e29d325ac2\",\n\t\t\tmidXShared:            \"0a402d812314646ccc2565c315d1429ec1ed130ff92ff3f48d948f29c3762cf1\",\n\t\t\tmidSharedSecret:       \"e25461fb0e4c162e18123ecde88342d54d449631e9b75a266fd9260c2bb2f41d\",\n\t\t\tmidInitiatorL:         \"97771ce2ce17a25c3d65bf9f8e4acb830dce8d41392be3e4b8ed902a3106681a\",\n\t\t\tmidInitiatorP:         \"2e7022b4eae9152942f68160a93e25d3e197a557385594aa587cb5e431bb470d\",\n\t\t\tmidResponderL:         \"613f85a82d783ce450cfd7e91a027fcc4ad5610872f83e4dbe9e2202184c6d6e\",\n\t\t\tmidResponderP:         \"cb5de4ed1083222e381401cf88e3167796bc9ab5b8aa1f27b718f39d1e6c0e87\",\n\t\t\tmidSendGarbageTerm:    \"b709dea25e0be287c50e3603482c2e98\",\n\t\t\tmidRecvGarbageTerm:    \"1f677e9d7392ebe3633fd82c9efb0f16\",\n\t\t\toutSessionID:          \"889f339285564fd868401fac8380bb9887925122ec8f31c8ae51ce067def103b\",\n\t\t\toutCiphertext:         \"\",\n\t\t\toutCiphertextEndsWith: \"7c4b9e1e6c1ce69da7b01513cdc4588fd93b04dafefaf87f31561763d906c672bac3dfceb751ebd126728ac017d4d580e931b8e5c7d5dfe0123be4dc9b2d2238b655c8a7fadaf8082c31e310909b5b731efc12f0a56e849eae6bfeedcc86dd27ef9b91d159256aa8e8d2b71a311f73350863d70f18d0d7302cf551e4303c7733\",\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tinInitiating := test.inInitiating\n\n\t\t// We need to convert the FieldVal into a ModNScalar so that we\n\t\t// can use the ScalarBaseMultNonConst.\n\t\tinPrivOurs := setHex(test.inPrivOurs)\n\t\tinPrivOursBytes := inPrivOurs.Bytes()\n\n\t\tvar inPrivOursScalar btcec.ModNScalar\n\t\toverflow := inPrivOursScalar.SetBytes(inPrivOursBytes)\n\t\tif overflow == 1 {\n\t\t\tt.Fatalf(\"unexpected reduction\")\n\t\t}\n\n\t\tvar inPubOurs btcec.JacobianPoint\n\t\tbtcec.ScalarBaseMultNonConst(&inPrivOursScalar, &inPubOurs)\n\t\tinPubOurs.ToAffine()\n\n\t\tmidXOurs := setHex(test.midXOurs)\n\t\tif !midXOurs.Equals(&inPubOurs.X) {\n\t\t\tt.Fatalf(\"expected mid-state to match our public key\")\n\t\t}\n\n\t\t// ellswift_decode takes in ellswift_bytes and returns a proper key.\n\t\t// 1. convert from hex to bytes\n\t\tbytesEllswiftOurs, err := hex.DecodeString(test.inEllswiftOurs)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error decoding string\")\n\t\t}\n\n\t\tuEllswiftOurs := bytesEllswiftOurs[:32]\n\t\ttEllswiftOurs := bytesEllswiftOurs[32:]\n\n\t\tvar (\n\t\t\tuEllswiftOursFV btcec.FieldVal\n\t\t\ttEllswiftOursFV btcec.FieldVal\n\t\t)\n\n\t\ttruncated := uEllswiftOursFV.SetByteSlice(uEllswiftOurs)\n\t\tif truncated {\n\t\t\tuEllswiftOursFV.Normalize()\n\t\t}\n\n\t\ttruncated = tEllswiftOursFV.SetByteSlice(tEllswiftOurs)\n\t\tif truncated {\n\t\t\ttEllswiftOursFV.Normalize()\n\t\t}\n\n\t\txEllswiftOurs, err := ellswift.XSwiftEC(\n\t\t\t&uEllswiftOursFV, &tEllswiftOursFV,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error during XSwiftEC\")\n\t\t}\n\n\t\tif !midXOurs.Equals(xEllswiftOurs) {\n\t\t\tt.Fatalf(\"expected mid-state to match decoded \" +\n\t\t\t\t\"ellswift key\")\n\t\t}\n\n\t\tbytesEllswiftTheirs, err := hex.DecodeString(\n\t\t\ttest.inEllswiftTheirs,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error decoding string\")\n\t\t}\n\n\t\tuEllswiftTheirs := bytesEllswiftTheirs[:32]\n\t\ttEllswiftTheirs := bytesEllswiftTheirs[32:]\n\n\t\tvar (\n\t\t\tuEllswiftTheirsFV btcec.FieldVal\n\t\t\ttEllswiftTheirsFV btcec.FieldVal\n\t\t)\n\n\t\ttruncated = uEllswiftTheirsFV.SetByteSlice(uEllswiftTheirs)\n\t\tif truncated {\n\t\t\tuEllswiftTheirsFV.Normalize()\n\t\t}\n\n\t\ttruncated = tEllswiftTheirsFV.SetByteSlice(tEllswiftTheirs)\n\t\tif truncated {\n\t\t\ttEllswiftTheirsFV.Normalize()\n\t\t}\n\n\t\txEllswiftTheirs, err := ellswift.XSwiftEC(\n\t\t\t&uEllswiftTheirsFV, &tEllswiftTheirsFV,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error during XSwiftEC\")\n\t\t}\n\n\t\tmidXTheirs := setHex(test.midXTheirs)\n\t\tif !midXTheirs.Equals(xEllswiftTheirs) {\n\t\t\tt.Fatalf(\"expected mid-state to match decoded \" +\n\t\t\t\t\"ellswift key\")\n\t\t}\n\n\t\tprivKeyOurs, _ := btcec.PrivKeyFromBytes((*inPrivOursBytes)[:])\n\n\t\tvar bytesEllswiftTheirs64 [64]byte\n\t\tcopy(bytesEllswiftTheirs64[:], bytesEllswiftTheirs)\n\n\t\txShared, err := ellswift.EllswiftECDHXOnly(\n\t\t\tbytesEllswiftTheirs64, privKeyOurs,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error when computing shared x\")\n\t\t}\n\n\t\tvar xSharedFV btcec.FieldVal\n\t\toverflow = xSharedFV.SetBytes(&xShared)\n\t\tif overflow == 1 {\n\t\t\tt.Fatalf(\"unexpected truncation\")\n\t\t}\n\n\t\tmidXShared := setHex(test.midXShared)\n\n\t\tif !midXShared.Equals(&xSharedFV) {\n\t\t\tt.Fatalf(\"expected mid-state x shared\")\n\t\t}\n\n\t\tvar bytesEllswiftOurs64 [64]byte\n\t\tcopy(bytesEllswiftOurs64[:], bytesEllswiftOurs)\n\n\t\tsharedSecret, err := ellswift.V2Ecdh(\n\t\t\tprivKeyOurs, bytesEllswiftTheirs64,\n\t\t\tbytesEllswiftOurs64, inInitiating,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error when calculating \" +\n\t\t\t\t\"shared secret\")\n\t\t}\n\n\t\tmidShared, err := hex.DecodeString(test.midSharedSecret)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected hex decode failure\")\n\t\t}\n\n\t\tif !bytes.Equal(midShared, sharedSecret[:]) {\n\t\t\tt.Fatalf(\"expected mid shared secret\")\n\t\t}\n\n\t\tp := NewPeer()\n\n\t\tbuf := bytes.NewBuffer(nil)\n\t\tp.UseReadWriter(buf)\n\n\t\terr = p.createV2Ciphers(midShared, inInitiating, mainNet)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"error initiating v2 transport\")\n\t\t}\n\n\t\tmidInitiatorL, err := hex.DecodeString(test.midInitiatorL)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error decoding midInitiatorL\")\n\t\t}\n\n\t\tif !bytes.Equal(midInitiatorL, p.initiatorL) {\n\t\t\tt.Fatalf(\"expected mid-state initiatorL to \" +\n\t\t\t\t\"match computed value\")\n\t\t}\n\n\t\tmidInitiatorP, err := hex.DecodeString(test.midInitiatorP)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error decoding midInitiatorP\")\n\t\t}\n\n\t\tif !bytes.Equal(midInitiatorP, p.initiatorP) {\n\t\t\tt.Fatalf(\"expected mid-state initiatorP to \" +\n\t\t\t\t\"match computed value\")\n\t\t}\n\n\t\tmidResponderL, err := hex.DecodeString(test.midResponderL)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error decoding midResponderL\")\n\t\t}\n\n\t\tif !bytes.Equal(midResponderL, p.responderL) {\n\t\t\tt.Fatalf(\"expected mid-state responderL to \" +\n\t\t\t\t\"match computed value\")\n\t\t}\n\n\t\tmidResponderP, err := hex.DecodeString(test.midResponderP)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error decoding midResponderP\")\n\t\t}\n\n\t\tif !bytes.Equal(midResponderP, p.responderP) {\n\t\t\tt.Fatalf(\"expected mid-state responderP to \" +\n\t\t\t\t\"match computed value\")\n\t\t}\n\n\t\tmidSendGarbageTerm, err := hex.DecodeString(\n\t\t\ttest.midSendGarbageTerm,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error decoding midSendGarbageTerm\")\n\t\t}\n\n\t\tif !bytes.Equal(midSendGarbageTerm, p.sendGarbageTerm[:]) {\n\t\t\tt.Fatalf(\"expected mid-state sendGarbageTerm \" +\n\t\t\t\t\"to match computed value\")\n\t\t}\n\n\t\tmidRecvGarbageTerm, err := hex.DecodeString(\n\t\t\ttest.midRecvGarbageTerm,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error decoding midRecvGarbageTerm\")\n\t\t}\n\n\t\tif !bytes.Equal(midRecvGarbageTerm, p.recvGarbageTerm) {\n\t\t\tt.Fatalf(\"expected mid-state recvGarbageTerm to \" +\n\t\t\t\t\"match computed value\")\n\t\t}\n\n\t\toutSessionID, err := hex.DecodeString(test.outSessionID)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error decoding outSessionID\")\n\t\t}\n\n\t\tif !bytes.Equal(outSessionID, p.sessionID) {\n\t\t\tt.Fatalf(\"expected sessionID to match computed value\")\n\t\t}\n\n\t\tfor i := 0; i < test.inIdx; i++ {\n\t\t\t_, _, err = p.V2EncPacket([]byte{}, []byte{}, false)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unexpected error while encrypting packet\")\n\t\t\t}\n\t\t}\n\n\t\tinitialContents, err := hex.DecodeString(test.inContents)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error decoding contents\")\n\t\t}\n\n\t\taad, err := hex.DecodeString(test.inAad)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error decoding aad\")\n\t\t}\n\n\t\tvar contents []byte\n\n\t\tcopy(contents, initialContents)\n\n\t\tfor i := 0; i < test.inMultiply; i++ {\n\t\t\tcontents = append(contents, initialContents...)\n\t\t}\n\n\t\tciphertext, _, err := p.V2EncPacket(contents, aad, test.inIgnore)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"unexpected error when encrypting packet: %v\", err)\n\t\t}\n\n\t\tif len(test.outCiphertext) != 0 {\n\t\t\toutCiphertextBytes, err := hex.DecodeString(test.outCiphertext)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unexpected error decoding outCiphertext: %v\", err)\n\t\t\t}\n\n\t\t\tif !bytes.Equal(outCiphertextBytes, ciphertext) {\n\t\t\t\tt.Fatalf(\"ciphertext mismatch\")\n\t\t\t}\n\t\t}\n\n\t\tif len(test.outCiphertextEndsWith) != 0 {\n\t\t\tciphertextHex := hex.EncodeToString(ciphertext)\n\t\t\tif !strings.HasSuffix(ciphertextHex, test.outCiphertextEndsWith) {\n\t\t\t\tt.Fatalf(\"suffix mismatch\")\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "version.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"strings\"\n)\n\n// semanticAlphabet\nconst semanticAlphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-\"\n\n// These constants define the application version and follow the semantic\n// versioning 2.0.0 spec (http://semver.org/).\nconst (\n\tappMajor uint = 0\n\tappMinor uint = 25\n\tappPatch uint = 0\n\n\t// appPreRelease MUST only contain characters from semanticAlphabet\n\t// per the semantic versioning spec.\n\tappPreRelease = \"beta\"\n)\n\n// appBuild is defined as a variable so it can be overridden during the build\n// process with '-ldflags \"-X main.appBuild foo' if needed.  It MUST only\n// contain characters from semanticAlphabet per the semantic versioning spec.\nvar appBuild string\n\n// version returns the application version as a properly formed string per the\n// semantic versioning 2.0.0 spec (http://semver.org/).\nfunc version() string {\n\t// Start with the major, minor, and patch versions.\n\tversion := fmt.Sprintf(\"%d.%d.%d\", appMajor, appMinor, appPatch)\n\n\t// Append pre-release version if there is one.  The hyphen called for\n\t// by the semantic versioning spec is automatically appended and should\n\t// not be contained in the pre-release string.  The pre-release version\n\t// is not appended if it contains invalid characters.\n\tpreRelease := normalizeVerString(appPreRelease)\n\tif preRelease != \"\" {\n\t\tversion = fmt.Sprintf(\"%s-%s\", version, preRelease)\n\t}\n\n\t// Append build metadata if there is any.  The plus called for\n\t// by the semantic versioning spec is automatically appended and should\n\t// not be contained in the build metadata string.  The build metadata\n\t// string is not appended if it contains invalid characters.\n\tbuild := normalizeVerString(appBuild)\n\tif build != \"\" {\n\t\tversion = fmt.Sprintf(\"%s+%s\", version, build)\n\t}\n\n\treturn version\n}\n\n// normalizeVerString returns the passed string stripped of all characters which\n// are not valid according to the semantic versioning guidelines for pre-release\n// version and build metadata strings.  In particular they MUST only contain\n// characters in semanticAlphabet.\nfunc normalizeVerString(str string) string {\n\tvar result bytes.Buffer\n\tfor _, r := range str {\n\t\tif strings.ContainsRune(semanticAlphabet, r) {\n\t\t\tresult.WriteRune(r)\n\t\t}\n\t}\n\treturn result.String()\n}\n"
  },
  {
    "path": "wire/README.md",
    "content": "wire\n====\n\n[![Build Status](https://github.com/btcsuite/btcd/workflows/Build%20and%20Test/badge.svg)](https://github.com/btcsuite/btcd/actions)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/btcsuite/btcd/wire)\n=======\n\nPackage wire implements the bitcoin wire protocol.  A comprehensive suite of\ntests with 100% test coverage is provided to ensure proper functionality.\n\nThere is an associated blog post about the release of this package\n[here](https://blog.conformal.com/btcwire-the-bitcoin-wire-protocol-package-from-btcd/).\n\nThis package has intentionally been designed so it can be used as a standalone\npackage for any projects needing to interface with bitcoin peers at the wire\nprotocol level.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcd/wire\n```\n\n## Bitcoin Message Overview\n\nThe bitcoin protocol consists of exchanging messages between peers. Each message\nis preceded by a header which identifies information about it such as which\nbitcoin network it is a part of, its type, how big it is, and a checksum to\nverify validity. All encoding and decoding of message headers is handled by this\npackage.\n\nTo accomplish this, there is a generic interface for bitcoin messages named\n`Message` which allows messages of any type to be read, written, or passed\naround through channels, functions, etc. In addition, concrete implementations\nof most of the currently supported bitcoin messages are provided. For these\nsupported messages, all of the details of marshalling and unmarshalling to and\nfrom the wire using bitcoin encoding are handled so the caller doesn't have to\nconcern themselves with the specifics.\n\n## Reading Messages Example\n\nIn order to unmarshal bitcoin messages from the wire, use the `ReadMessage`\nfunction. It accepts any `io.Reader`, but typically this will be a `net.Conn`\nto a remote node running a bitcoin peer.  Example syntax is:\n\n```Go\n\t// Use the most recent protocol version supported by the package and the\n\t// main bitcoin network.\n\tpver := wire.ProtocolVersion\n\tbtcnet := wire.MainNet\n\n\t// Reads and validates the next bitcoin message from conn using the\n\t// protocol version pver and the bitcoin network btcnet.  The returns\n\t// are a wire.Message, a []byte which contains the unmarshalled\n\t// raw payload, and a possible error.\n\tmsg, rawPayload, err := wire.ReadMessage(conn, pver, btcnet)\n\tif err != nil {\n\t\t// Log and handle the error\n\t}\n```\n\nSee the package documentation for details on determining the message type.\n\n## Writing Messages Example\n\nIn order to marshal bitcoin messages to the wire, use the `WriteMessage`\nfunction. It accepts any `io.Writer`, but typically this will be a `net.Conn`\nto a remote node running a bitcoin peer. Example syntax to request addresses\nfrom a remote peer is:\n\n```Go\n\t// Use the most recent protocol version supported by the package and the\n\t// main bitcoin network.\n\tpver := wire.ProtocolVersion\n\tbtcnet := wire.MainNet\n\n\t// Create a new getaddr bitcoin message.\n\tmsg := wire.NewMsgGetAddr()\n\n\t// Writes a bitcoin message msg to conn using the protocol version\n\t// pver, and the bitcoin network btcnet.  The return is a possible\n\t// error.\n\terr := wire.WriteMessage(conn, msg, pver, btcnet)\n\tif err != nil {\n\t\t// Log and handle the error\n\t}\n```\n\n## GPG Verification Key\n\nAll official release tags are signed by Conformal so users can ensure the code\nhas not been tampered with and is coming from the btcsuite developers.  To\nverify the signature perform the following:\n\n- Download the public key from the Conformal website at\n  https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt\n\n- Import the public key into your GPG keyring:\n  ```bash\n  gpg --import GIT-GPG-KEY-conformal.txt\n  ```\n\n- Verify the release tag with the following command where `TAG_NAME` is a\n  placeholder for the specific tag:\n  ```bash\n  git tag -v TAG_NAME\n  ```\n\n## License\n\nPackage wire is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "wire/bench_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"compress/bzip2\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// genesisCoinbaseTx is the coinbase transaction for the genesis blocks for\n// the main network, regression test network, and test network (version 3).\nvar genesisCoinbaseTx = MsgTx{\n\tVersion: 1,\n\tTxIn: []*TxIn{\n\t\t{\n\t\t\tPreviousOutPoint: OutPoint{\n\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\tIndex: 0xffffffff,\n\t\t\t},\n\t\t\tSignatureScript: []byte{\n\t\t\t\t0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04, 0x45, /* |.......E| */\n\t\t\t\t0x54, 0x68, 0x65, 0x20, 0x54, 0x69, 0x6d, 0x65, /* |The Time| */\n\t\t\t\t0x73, 0x20, 0x30, 0x33, 0x2f, 0x4a, 0x61, 0x6e, /* |s 03/Jan| */\n\t\t\t\t0x2f, 0x32, 0x30, 0x30, 0x39, 0x20, 0x43, 0x68, /* |/2009 Ch| */\n\t\t\t\t0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x6f, 0x72, /* |ancellor| */\n\t\t\t\t0x20, 0x6f, 0x6e, 0x20, 0x62, 0x72, 0x69, 0x6e, /* | on brin| */\n\t\t\t\t0x6b, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x63, /* |k of sec|*/\n\t\t\t\t0x6f, 0x6e, 0x64, 0x20, 0x62, 0x61, 0x69, 0x6c, /* |ond bail| */\n\t\t\t\t0x6f, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, /* |out for |*/\n\t\t\t\t0x62, 0x61, 0x6e, 0x6b, 0x73, /* |banks| */\n\t\t\t},\n\t\t\tSequence: 0xffffffff,\n\t\t},\n\t},\n\tTxOut: []*TxOut{\n\t\t{\n\t\t\tValue: 0x12a05f200,\n\t\t\tPkScript: []byte{\n\t\t\t\t0x41, 0x04, 0x67, 0x8a, 0xfd, 0xb0, 0xfe, 0x55, /* |A.g....U| */\n\t\t\t\t0x48, 0x27, 0x19, 0x67, 0xf1, 0xa6, 0x71, 0x30, /* |H'.g..q0| */\n\t\t\t\t0xb7, 0x10, 0x5c, 0xd6, 0xa8, 0x28, 0xe0, 0x39, /* |..\\..(.9| */\n\t\t\t\t0x09, 0xa6, 0x79, 0x62, 0xe0, 0xea, 0x1f, 0x61, /* |..yb...a| */\n\t\t\t\t0xde, 0xb6, 0x49, 0xf6, 0xbc, 0x3f, 0x4c, 0xef, /* |..I..?L.| */\n\t\t\t\t0x38, 0xc4, 0xf3, 0x55, 0x04, 0xe5, 0x1e, 0xc1, /* |8..U....| */\n\t\t\t\t0x12, 0xde, 0x5c, 0x38, 0x4d, 0xf7, 0xba, 0x0b, /* |..\\8M...| */\n\t\t\t\t0x8d, 0x57, 0x8a, 0x4c, 0x70, 0x2b, 0x6b, 0xf1, /* |.W.Lp+k.| */\n\t\t\t\t0x1d, 0x5f, 0xac, /* |._.| */\n\t\t\t},\n\t\t},\n\t},\n\tLockTime: 0,\n}\n\n// BenchmarkWriteVarInt1 performs a benchmark on how long it takes to write\n// a single byte variable length integer.\nfunc BenchmarkWriteVarInt1(b *testing.B) {\n\tb.ReportAllocs()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteVarInt(io.Discard, 0, 1)\n\t}\n}\n\n// BenchmarkWriteVarInt3 performs a benchmark on how long it takes to write\n// a three byte variable length integer.\nfunc BenchmarkWriteVarInt3(b *testing.B) {\n\tb.ReportAllocs()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteVarInt(io.Discard, 0, 65535)\n\t}\n}\n\n// BenchmarkWriteVarInt5 performs a benchmark on how long it takes to write\n// a five byte variable length integer.\nfunc BenchmarkWriteVarInt5(b *testing.B) {\n\tb.ReportAllocs()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteVarInt(io.Discard, 0, 4294967295)\n\t}\n}\n\n// BenchmarkWriteVarInt9 performs a benchmark on how long it takes to write\n// a nine byte variable length integer.\nfunc BenchmarkWriteVarInt9(b *testing.B) {\n\tb.ReportAllocs()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteVarInt(io.Discard, 0, 18446744073709551615)\n\t}\n}\n\n// BenchmarkReadVarInt1 performs a benchmark on how long it takes to read\n// a single byte variable length integer.\nfunc BenchmarkReadVarInt1(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := []byte{0x01}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tReadVarInt(r, 0)\n\t}\n}\n\n// BenchmarkReadVarInt3 performs a benchmark on how long it takes to read\n// a three byte variable length integer.\nfunc BenchmarkReadVarInt3(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := []byte{0x0fd, 0xff, 0xff}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tReadVarInt(r, 0)\n\t}\n}\n\n// BenchmarkReadVarInt5 performs a benchmark on how long it takes to read\n// a five byte variable length integer.\nfunc BenchmarkReadVarInt5(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := []byte{0xfe, 0xff, 0xff, 0xff, 0xff}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tReadVarInt(r, 0)\n\t}\n}\n\n// BenchmarkReadVarInt9 performs a benchmark on how long it takes to read\n// a nine byte variable length integer.\nfunc BenchmarkReadVarInt9(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tReadVarInt(r, 0)\n\t}\n}\n\n// BenchmarkWriteVarIntBuf1 performs a benchmark on how long it takes to write\n// a single byte variable length integer.\nfunc BenchmarkWriteVarIntBuf1(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteVarIntBuf(io.Discard, 0, 1, buffer)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkWriteVarIntBuf3 performs a benchmark on how long it takes to write\n// a three byte variable length integer.\nfunc BenchmarkWriteVarIntBuf3(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteVarIntBuf(io.Discard, 0, 65535, buffer)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkWriteVarIntBuf5 performs a benchmark on how long it takes to write\n// a five byte variable length integer.\nfunc BenchmarkWriteVarIntBuf5(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteVarIntBuf(io.Discard, 0, 4294967295, buffer)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkWriteVarIntBuf9 performs a benchmark on how long it takes to write\n// a nine byte variable length integer.\nfunc BenchmarkWriteVarIntBuf9(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteVarIntBuf(io.Discard, 0, 18446744073709551615, buffer)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkReadVarIntBuf1 performs a benchmark on how long it takes to read\n// a single byte variable length integer.\nfunc BenchmarkReadVarIntBuf1(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tbuf := []byte{0x01}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tReadVarIntBuf(r, 0, buffer)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkReadVarIntBuf3 performs a benchmark on how long it takes to read\n// a three byte variable length integer.\nfunc BenchmarkReadVarIntBuf3(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tbuf := []byte{0x0fd, 0xff, 0xff}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tReadVarIntBuf(r, 0, buffer)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkReadVarIntBuf5 performs a benchmark on how long it takes to read\n// a five byte variable length integer.\nfunc BenchmarkReadVarIntBuf5(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tbuf := []byte{0xfe, 0xff, 0xff, 0xff, 0xff}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tReadVarIntBuf(r, 0, buffer)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkReadVarIntBuf9 performs a benchmark on how long it takes to read\n// a nine byte variable length integer.\nfunc BenchmarkReadVarIntBuf9(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tbuf := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tReadVarIntBuf(r, 0, buffer)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkReadVarStr4 performs a benchmark on how long it takes to read a\n// four byte variable length string.\nfunc BenchmarkReadVarStr4(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := []byte{0x04, 't', 'e', 's', 't'}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tReadVarString(r, 0)\n\t}\n}\n\n// BenchmarkReadVarStr10 performs a benchmark on how long it takes to read a\n// ten byte variable length string.\nfunc BenchmarkReadVarStr10(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := []byte{0x0a, 't', 'e', 's', 't', '0', '1', '2', '3', '4', '5'}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tReadVarString(r, 0)\n\t}\n}\n\n// BenchmarkWriteVarStr4 performs a benchmark on how long it takes to write a\n// four byte variable length string.\nfunc BenchmarkWriteVarStr4(b *testing.B) {\n\tb.ReportAllocs()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteVarString(io.Discard, 0, \"test\")\n\t}\n}\n\n// BenchmarkWriteVarStr10 performs a benchmark on how long it takes to write a\n// ten byte variable length string.\nfunc BenchmarkWriteVarStr10(b *testing.B) {\n\tb.ReportAllocs()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteVarString(io.Discard, 0, \"test012345\")\n\t}\n}\n\n// BenchmarkReadVarStrBuf4 performs a benchmark on how long it takes to read a\n// four byte variable length string.\nfunc BenchmarkReadVarStrBuf4(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tbuf := []byte{0x04, 't', 'e', 's', 't'}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\treadVarStringBuf(r, 0, buffer)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkReadVarStrBuf10 performs a benchmark on how long it takes to read a\n// ten byte variable length string.\nfunc BenchmarkReadVarStrBuf10(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tbuf := []byte{0x0a, 't', 'e', 's', 't', '0', '1', '2', '3', '4', '5'}\n\tr := bytes.NewReader(buf)\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\treadVarStringBuf(r, 0, buf)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkWriteVarStrBuf4 performs a benchmark on how long it takes to write a\n// four byte variable length string.\nfunc BenchmarkWriteVarStrBuf4(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := binarySerializer.Borrow()\n\tfor i := 0; i < b.N; i++ {\n\t\twriteVarStringBuf(io.Discard, 0, \"test\", buf)\n\t}\n\tbinarySerializer.Return(buf)\n}\n\n// BenchmarkWriteVarStrBuf10 performs a benchmark on how long it takes to write\n// a ten byte variable length string.\nfunc BenchmarkWriteVarStrBuf10(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := binarySerializer.Borrow()\n\tfor i := 0; i < b.N; i++ {\n\t\twriteVarStringBuf(io.Discard, 0, \"test012345\", buf)\n\t}\n\tbinarySerializer.Return(buf)\n}\n\n// BenchmarkReadOutPoint performs a benchmark on how long it takes to read a\n// transaction output point.\nfunc BenchmarkReadOutPoint(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tbuf := []byte{\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash\n\t\t0xff, 0xff, 0xff, 0xff, // Previous output index\n\t}\n\tr := bytes.NewReader(buf)\n\tvar op OutPoint\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\treadOutPointBuf(r, 0, 0, &op, buffer)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkWriteOutPoint performs a benchmark on how long it takes to write a\n// transaction output point.\nfunc BenchmarkWriteOutPoint(b *testing.B) {\n\tb.ReportAllocs()\n\n\top := &OutPoint{\n\t\tHash:  chainhash.Hash{},\n\t\tIndex: 0,\n\t}\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteOutPoint(io.Discard, 0, 0, op)\n\t}\n}\n\n// BenchmarkWriteOutPointBuf performs a benchmark on how long it takes to write a\n// transaction output point.\nfunc BenchmarkWriteOutPointBuf(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := binarySerializer.Borrow()\n\top := &OutPoint{\n\t\tHash:  chainhash.Hash{},\n\t\tIndex: 0,\n\t}\n\tfor i := 0; i < b.N; i++ {\n\t\twriteOutPointBuf(io.Discard, 0, 0, op, buf)\n\t}\n\tbinarySerializer.Return(buf)\n}\n\n// BenchmarkReadTxOut performs a benchmark on how long it takes to read a\n// transaction output.\nfunc BenchmarkReadTxOut(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := []byte{\n\t\t0x00, 0xf2, 0x05, 0x2a, 0x01, 0x00, 0x00, 0x00, // Transaction amount\n\t\t0x43, // Varint for length of pk script\n\t\t0x41, // OP_DATA_65\n\t\t0x04, 0x96, 0xb5, 0x38, 0xe8, 0x53, 0x51, 0x9c,\n\t\t0x72, 0x6a, 0x2c, 0x91, 0xe6, 0x1e, 0xc1, 0x16,\n\t\t0x00, 0xae, 0x13, 0x90, 0x81, 0x3a, 0x62, 0x7c,\n\t\t0x66, 0xfb, 0x8b, 0xe7, 0x94, 0x7b, 0xe6, 0x3c,\n\t\t0x52, 0xda, 0x75, 0x89, 0x37, 0x95, 0x15, 0xd4,\n\t\t0xe0, 0xa6, 0x04, 0xf8, 0x14, 0x17, 0x81, 0xe6,\n\t\t0x22, 0x94, 0x72, 0x11, 0x66, 0xbf, 0x62, 0x1e,\n\t\t0x73, 0xa8, 0x2c, 0xbf, 0x23, 0x42, 0xc8, 0x58,\n\t\t0xee, // 65-byte signature\n\t\t0xac, // OP_CHECKSIG\n\t}\n\tr := bytes.NewReader(buf)\n\tvar txOut TxOut\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tReadTxOut(r, 0, 0, &txOut)\n\t}\n}\n\n// BenchmarkReadTxOutBuf performs a benchmark on how long it takes to read a\n// transaction output.\nfunc BenchmarkReadTxOutBuf(b *testing.B) {\n\tb.ReportAllocs()\n\n\tscriptBuffer := scriptPool.Borrow()\n\tsbuf := scriptBuffer[:]\n\tbuffer := binarySerializer.Borrow()\n\tbuf := []byte{\n\t\t0x00, 0xf2, 0x05, 0x2a, 0x01, 0x00, 0x00, 0x00, // Transaction amount\n\t\t0x43, // Varint for length of pk script\n\t\t0x41, // OP_DATA_65\n\t\t0x04, 0x96, 0xb5, 0x38, 0xe8, 0x53, 0x51, 0x9c,\n\t\t0x72, 0x6a, 0x2c, 0x91, 0xe6, 0x1e, 0xc1, 0x16,\n\t\t0x00, 0xae, 0x13, 0x90, 0x81, 0x3a, 0x62, 0x7c,\n\t\t0x66, 0xfb, 0x8b, 0xe7, 0x94, 0x7b, 0xe6, 0x3c,\n\t\t0x52, 0xda, 0x75, 0x89, 0x37, 0x95, 0x15, 0xd4,\n\t\t0xe0, 0xa6, 0x04, 0xf8, 0x14, 0x17, 0x81, 0xe6,\n\t\t0x22, 0x94, 0x72, 0x11, 0x66, 0xbf, 0x62, 0x1e,\n\t\t0x73, 0xa8, 0x2c, 0xbf, 0x23, 0x42, 0xc8, 0x58,\n\t\t0xee, // 65-byte signature\n\t\t0xac, // OP_CHECKSIG\n\t}\n\tr := bytes.NewReader(buf)\n\tvar txOut TxOut\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\treadTxOutBuf(r, 0, 0, &txOut, buffer, sbuf)\n\t}\n\tbinarySerializer.Return(buffer)\n\tscriptPool.Return(scriptBuffer)\n}\n\n// BenchmarkWriteTxOut performs a benchmark on how long it takes to write\n// a transaction output.\nfunc BenchmarkWriteTxOut(b *testing.B) {\n\tb.ReportAllocs()\n\n\ttxOut := blockOne.Transactions[0].TxOut[0]\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteTxOut(io.Discard, 0, 0, txOut)\n\t}\n}\n\n// BenchmarkWriteTxOutBuf performs a benchmark on how long it takes to write\n// a transaction output.\nfunc BenchmarkWriteTxOutBuf(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := binarySerializer.Borrow()\n\ttxOut := blockOne.Transactions[0].TxOut[0]\n\tfor i := 0; i < b.N; i++ {\n\t\tWriteTxOutBuf(io.Discard, 0, 0, txOut, buf)\n\t}\n\tbinarySerializer.Return(buf)\n}\n\n// BenchmarkReadTxIn performs a benchmark on how long it takes to read a\n// transaction input.\nfunc BenchmarkReadTxIn(b *testing.B) {\n\tb.ReportAllocs()\n\n\tscriptBuffer := scriptPool.Borrow()\n\tsbuf := scriptBuffer[:]\n\tbuffer := binarySerializer.Borrow()\n\tbuf := []byte{\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash\n\t\t0xff, 0xff, 0xff, 0xff, // Previous output index\n\t\t0x07,                                     // Varint for length of signature script\n\t\t0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04, // Signature script\n\t\t0xff, 0xff, 0xff, 0xff, // Sequence\n\t}\n\tr := bytes.NewReader(buf)\n\tvar txIn TxIn\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\treadTxInBuf(r, 0, 0, &txIn, buffer, sbuf)\n\t}\n\tbinarySerializer.Return(buffer)\n\tscriptPool.Return(scriptBuffer)\n}\n\n// BenchmarkWriteTxIn performs a benchmark on how long it takes to write\n// a transaction input.\nfunc BenchmarkWriteTxIn(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := binarySerializer.Borrow()\n\ttxIn := blockOne.Transactions[0].TxIn[0]\n\tfor i := 0; i < b.N; i++ {\n\t\twriteTxInBuf(io.Discard, 0, 0, txIn, buf)\n\t}\n\tbinarySerializer.Return(buf)\n}\n\n// BenchmarkDeserializeTx performs a benchmark on how long it takes to\n// deserialize a small transaction.\nfunc BenchmarkDeserializeTxSmall(b *testing.B) {\n\tbuf := []byte{\n\t\t0x01, 0x00, 0x00, 0x00, // Version\n\t\t0x01, // Varint for number of input transactions\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //  // Previous output hash\n\t\t0xff, 0xff, 0xff, 0xff, // Previous output index\n\t\t0x07,                                     // Varint for length of signature script\n\t\t0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04, // Signature script\n\t\t0xff, 0xff, 0xff, 0xff, // Sequence\n\t\t0x01,                                           // Varint for number of output transactions\n\t\t0x00, 0xf2, 0x05, 0x2a, 0x01, 0x00, 0x00, 0x00, // Transaction amount\n\t\t0x43, // Varint for length of pk script\n\t\t0x41, // OP_DATA_65\n\t\t0x04, 0x96, 0xb5, 0x38, 0xe8, 0x53, 0x51, 0x9c,\n\t\t0x72, 0x6a, 0x2c, 0x91, 0xe6, 0x1e, 0xc1, 0x16,\n\t\t0x00, 0xae, 0x13, 0x90, 0x81, 0x3a, 0x62, 0x7c,\n\t\t0x66, 0xfb, 0x8b, 0xe7, 0x94, 0x7b, 0xe6, 0x3c,\n\t\t0x52, 0xda, 0x75, 0x89, 0x37, 0x95, 0x15, 0xd4,\n\t\t0xe0, 0xa6, 0x04, 0xf8, 0x14, 0x17, 0x81, 0xe6,\n\t\t0x22, 0x94, 0x72, 0x11, 0x66, 0xbf, 0x62, 0x1e,\n\t\t0x73, 0xa8, 0x2c, 0xbf, 0x23, 0x42, 0xc8, 0x58,\n\t\t0xee,                   // 65-byte signature\n\t\t0xac,                   // OP_CHECKSIG\n\t\t0x00, 0x00, 0x00, 0x00, // Lock time\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\n\tr := bytes.NewReader(buf)\n\tvar tx MsgTx\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\ttx.Deserialize(r)\n\t}\n}\n\n// BenchmarkDeserializeTxLarge performs a benchmark on how long it takes to\n// deserialize a very large transaction.\nfunc BenchmarkDeserializeTxLarge(b *testing.B) {\n\n\t// tx bb41a757f405890fb0f5856228e23b715702d714d59bf2b1feb70d8b2b4e3e08\n\t// from the main block chain.\n\tfi, err := os.Open(\"testdata/megatx.bin.bz2\")\n\tif err != nil {\n\t\tb.Fatalf(\"Failed to read transaction data: %v\", err)\n\t}\n\tdefer fi.Close()\n\tbuf, err := io.ReadAll(bzip2.NewReader(fi))\n\tif err != nil {\n\t\tb.Fatalf(\"Failed to read transaction data: %v\", err)\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\n\tr := bytes.NewReader(buf)\n\tvar tx MsgTx\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\ttx.Deserialize(r)\n\t}\n}\n\nfunc BenchmarkDeserializeBlock(b *testing.B) {\n\tbuf, err := os.ReadFile(\n\t\t\"testdata/block-00000000000000000021868c2cefc52a480d173c849412fe81c4e5ab806f94ab.blk\",\n\t)\n\tif err != nil {\n\t\tb.Fatalf(\"Failed to read block data: %v\", err)\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\n\tr := bytes.NewReader(buf)\n\tvar block MsgBlock\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tblock.Deserialize(r)\n\t}\n}\n\nfunc BenchmarkSerializeBlock(b *testing.B) {\n\tbuf, err := os.ReadFile(\n\t\t\"testdata/block-00000000000000000021868c2cefc52a480d173c849412fe81c4e5ab806f94ab.blk\",\n\t)\n\tif err != nil {\n\t\tb.Fatalf(\"Failed to read block data: %v\", err)\n\t}\n\n\tvar block MsgBlock\n\terr = block.Deserialize(bytes.NewReader(buf))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tblock.Serialize(io.Discard)\n\t}\n}\n\n// BenchmarkSerializeTx performs a benchmark on how long it takes to serialize\n// a transaction.\nfunc BenchmarkSerializeTx(b *testing.B) {\n\tb.ReportAllocs()\n\n\ttx := blockOne.Transactions[0]\n\tfor i := 0; i < b.N; i++ {\n\t\ttx.Serialize(io.Discard)\n\n\t}\n}\n\n// BenchmarkSerializeTxSmall performs a benchmark on how long it takes to\n// serialize a transaction.\nfunc BenchmarkSerializeTxSmall(b *testing.B) {\n\tbuf := []byte{\n\t\t0x01, 0x00, 0x00, 0x00, // Version\n\t\t0x01, // Varint for number of input transactions\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //  // Previous output hash\n\t\t0xff, 0xff, 0xff, 0xff, // Previous output index\n\t\t0x07,                                     // Varint for length of signature script\n\t\t0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04, // Signature script\n\t\t0xff, 0xff, 0xff, 0xff, // Sequence\n\t\t0x01,                                           // Varint for number of output transactions\n\t\t0x00, 0xf2, 0x05, 0x2a, 0x01, 0x00, 0x00, 0x00, // Transaction amount\n\t\t0x43, // Varint for length of pk script\n\t\t0x41, // OP_DATA_65\n\t\t0x04, 0x96, 0xb5, 0x38, 0xe8, 0x53, 0x51, 0x9c,\n\t\t0x72, 0x6a, 0x2c, 0x91, 0xe6, 0x1e, 0xc1, 0x16,\n\t\t0x00, 0xae, 0x13, 0x90, 0x81, 0x3a, 0x62, 0x7c,\n\t\t0x66, 0xfb, 0x8b, 0xe7, 0x94, 0x7b, 0xe6, 0x3c,\n\t\t0x52, 0xda, 0x75, 0x89, 0x37, 0x95, 0x15, 0xd4,\n\t\t0xe0, 0xa6, 0x04, 0xf8, 0x14, 0x17, 0x81, 0xe6,\n\t\t0x22, 0x94, 0x72, 0x11, 0x66, 0xbf, 0x62, 0x1e,\n\t\t0x73, 0xa8, 0x2c, 0xbf, 0x23, 0x42, 0xc8, 0x58,\n\t\t0xee,                   // 65-byte signature\n\t\t0xac,                   // OP_CHECKSIG\n\t\t0x00, 0x00, 0x00, 0x00, // Lock time\n\t}\n\n\tvar tx MsgTx\n\ttx.Deserialize(bytes.NewReader(buf))\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\n\tfor i := 0; i < b.N; i++ {\n\t\ttx.Serialize(io.Discard)\n\t}\n}\n\n// BenchmarkSerializeTxLarge performs a benchmark on how long it takes to\n// serialize a transaction.\nfunc BenchmarkSerializeTxLarge(b *testing.B) {\n\t// tx bb41a757f405890fb0f5856228e23b715702d714d59bf2b1feb70d8b2b4e3e08\n\t// from the main block chain.\n\tfi, err := os.Open(\"testdata/megatx.bin.bz2\")\n\tif err != nil {\n\t\tb.Fatalf(\"Failed to read transaction data: %v\", err)\n\t}\n\tdefer fi.Close()\n\tbuf, err := io.ReadAll(bzip2.NewReader(fi))\n\tif err != nil {\n\t\tb.Fatalf(\"Failed to read transaction data: %v\", err)\n\t}\n\n\tvar tx MsgTx\n\ttx.Deserialize(bytes.NewReader(buf))\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\n\tfor i := 0; i < b.N; i++ {\n\t\ttx.Serialize(io.Discard)\n\t}\n}\n\n// BenchmarkReadBlockHeader performs a benchmark on how long it takes to\n// deserialize a block header.\nfunc BenchmarkReadBlockHeader(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := []byte{\n\t\t0x01, 0x00, 0x00, 0x00, // Version 1\n\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock\n\t\t0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2,\n\t\t0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61,\n\t\t0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32,\n\t\t0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, // MerkleRoot\n\t\t0x29, 0xab, 0x5f, 0x49, // Timestamp\n\t\t0xff, 0xff, 0x00, 0x1d, // Bits\n\t\t0xf3, 0xe0, 0x01, 0x00, // Nonce\n\t\t0x00, // TxnCount Varint\n\t}\n\tr := bytes.NewReader(buf)\n\tvar header BlockHeader\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\treadBlockHeader(r, 0, &header)\n\t}\n}\n\n// BenchmarkReadBlockHeaderBuf performs a benchmark on how long it takes to\n// deserialize a block header.\nfunc BenchmarkReadBlockHeaderBuf(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuffer := binarySerializer.Borrow()\n\tbuf := []byte{\n\t\t0x01, 0x00, 0x00, 0x00, // Version 1\n\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock\n\t\t0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2,\n\t\t0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61,\n\t\t0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32,\n\t\t0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, // MerkleRoot\n\t\t0x29, 0xab, 0x5f, 0x49, // Timestamp\n\t\t0xff, 0xff, 0x00, 0x1d, // Bits\n\t\t0xf3, 0xe0, 0x01, 0x00, // Nonce\n\t\t0x00, // TxnCount Varint\n\t}\n\tr := bytes.NewReader(buf)\n\tvar header BlockHeader\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\treadBlockHeaderBuf(r, 0, &header, buffer)\n\t}\n\tbinarySerializer.Return(buffer)\n}\n\n// BenchmarkWriteBlockHeader performs a benchmark on how long it takes to\n// serialize a block header.\nfunc BenchmarkWriteBlockHeader(b *testing.B) {\n\tb.ReportAllocs()\n\n\theader := blockOne.Header\n\tfor i := 0; i < b.N; i++ {\n\t\twriteBlockHeader(io.Discard, 0, &header)\n\t}\n}\n\n// BenchmarkWriteBlockHeaderBuf performs a benchmark on how long it takes to\n// serialize a block header.\nfunc BenchmarkWriteBlockHeaderBuf(b *testing.B) {\n\tb.ReportAllocs()\n\n\tbuf := binarySerializer.Borrow()\n\theader := blockOne.Header\n\tfor i := 0; i < b.N; i++ {\n\t\twriteBlockHeaderBuf(io.Discard, 0, &header, buf)\n\t}\n\tbinarySerializer.Return(buf)\n}\n\n// BenchmarkDecodeGetHeaders performs a benchmark on how long it takes to\n// decode a getheaders message with the maximum number of block locator hashes.\nfunc BenchmarkDecodeGetHeaders(b *testing.B) {\n\tb.ReportAllocs()\n\n\t// Create a message with the maximum number of block locators.\n\tpver := ProtocolVersion\n\tvar m MsgGetHeaders\n\tfor i := 0; i < MaxBlockLocatorsPerMsg; i++ {\n\t\thash, err := chainhash.NewHashFromStr(fmt.Sprintf(\"%x\", i))\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"NewHashFromStr: unexpected error: %v\", err)\n\t\t}\n\t\tm.AddBlockLocatorHash(hash)\n\t}\n\n\t// Serialize it so the bytes are available to test the decode below.\n\tvar bb bytes.Buffer\n\tif err := m.BtcEncode(&bb, pver, LatestEncoding); err != nil {\n\t\tb.Fatalf(\"MsgGetHeaders.BtcEncode: unexpected error: %v\", err)\n\t}\n\tbuf := bb.Bytes()\n\n\tr := bytes.NewReader(buf)\n\tvar msg MsgGetHeaders\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tmsg.BtcDecode(r, pver, LatestEncoding)\n\t}\n}\n\n// BenchmarkDecodeHeaders performs a benchmark on how long it takes to\n// decode a headers message with the maximum number of headers.\nfunc BenchmarkDecodeHeaders(b *testing.B) {\n\tb.ReportAllocs()\n\n\t// Create a message with the maximum number of headers.\n\tpver := ProtocolVersion\n\tvar m MsgHeaders\n\tfor i := 0; i < MaxBlockHeadersPerMsg; i++ {\n\t\thash, err := chainhash.NewHashFromStr(fmt.Sprintf(\"%x\", i))\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"NewHashFromStr: unexpected error: %v\", err)\n\t\t}\n\t\tm.AddBlockHeader(NewBlockHeader(1, hash, hash, 0, uint32(i)))\n\t}\n\n\t// Serialize it so the bytes are available to test the decode below.\n\tvar bb bytes.Buffer\n\tif err := m.BtcEncode(&bb, pver, LatestEncoding); err != nil {\n\t\tb.Fatalf(\"MsgHeaders.BtcEncode: unexpected error: %v\", err)\n\t}\n\tbuf := bb.Bytes()\n\n\tr := bytes.NewReader(buf)\n\tvar msg MsgHeaders\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tmsg.BtcDecode(r, pver, LatestEncoding)\n\t}\n}\n\n// BenchmarkDecodeGetBlocks performs a benchmark on how long it takes to\n// decode a getblocks message with the maximum number of block locator hashes.\nfunc BenchmarkDecodeGetBlocks(b *testing.B) {\n\tb.ReportAllocs()\n\n\t// Create a message with the maximum number of block locators.\n\tpver := ProtocolVersion\n\tvar m MsgGetBlocks\n\tfor i := 0; i < MaxBlockLocatorsPerMsg; i++ {\n\t\thash, err := chainhash.NewHashFromStr(fmt.Sprintf(\"%x\", i))\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"NewHashFromStr: unexpected error: %v\", err)\n\t\t}\n\t\tm.AddBlockLocatorHash(hash)\n\t}\n\n\t// Serialize it so the bytes are available to test the decode below.\n\tvar bb bytes.Buffer\n\tif err := m.BtcEncode(&bb, pver, LatestEncoding); err != nil {\n\t\tb.Fatalf(\"MsgGetBlocks.BtcEncode: unexpected error: %v\", err)\n\t}\n\tbuf := bb.Bytes()\n\n\tr := bytes.NewReader(buf)\n\tvar msg MsgGetBlocks\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tmsg.BtcDecode(r, pver, LatestEncoding)\n\t}\n}\n\n// BenchmarkDecodeAddr performs a benchmark on how long it takes to decode an\n// addr message with the maximum number of addresses.\nfunc BenchmarkDecodeAddr(b *testing.B) {\n\tb.ReportAllocs()\n\n\t// Create a message with the maximum number of addresses.\n\tpver := ProtocolVersion\n\tip := net.ParseIP(\"127.0.0.1\")\n\tma := NewMsgAddr()\n\tfor port := uint16(0); port < MaxAddrPerMsg; port++ {\n\t\tma.AddAddress(NewNetAddressIPPort(ip, port, SFNodeNetwork))\n\t}\n\n\t// Serialize it so the bytes are available to test the decode below.\n\tvar bb bytes.Buffer\n\tif err := ma.BtcEncode(&bb, pver, LatestEncoding); err != nil {\n\t\tb.Fatalf(\"MsgAddr.BtcEncode: unexpected error: %v\", err)\n\t}\n\tbuf := bb.Bytes()\n\n\tr := bytes.NewReader(buf)\n\tvar msg MsgAddr\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tmsg.BtcDecode(r, pver, LatestEncoding)\n\t}\n}\n\n// BenchmarkDecodeInv performs a benchmark on how long it takes to decode an inv\n// message with the maximum number of entries.\nfunc BenchmarkDecodeInv(b *testing.B) {\n\t// Create a message with the maximum number of entries.\n\tpver := ProtocolVersion\n\tvar m MsgInv\n\tfor i := 0; i < MaxInvPerMsg; i++ {\n\t\thash, err := chainhash.NewHashFromStr(fmt.Sprintf(\"%x\", i))\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"NewHashFromStr: unexpected error: %v\", err)\n\t\t}\n\t\tm.AddInvVect(NewInvVect(InvTypeBlock, hash))\n\t}\n\n\t// Serialize it so the bytes are available to test the decode below.\n\tvar bb bytes.Buffer\n\tif err := m.BtcEncode(&bb, pver, LatestEncoding); err != nil {\n\t\tb.Fatalf(\"MsgInv.BtcEncode: unexpected error: %v\", err)\n\t}\n\tbuf := bb.Bytes()\n\n\tb.ReportAllocs()\n\tb.ResetTimer()\n\n\tr := bytes.NewReader(buf)\n\tvar msg MsgInv\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tmsg.BtcDecode(r, pver, LatestEncoding)\n\t}\n}\n\n// BenchmarkDecodeNotFound performs a benchmark on how long it takes to decode\n// a notfound message with the maximum number of entries.\nfunc BenchmarkDecodeNotFound(b *testing.B) {\n\tb.ReportAllocs()\n\n\t// Create a message with the maximum number of entries.\n\tpver := ProtocolVersion\n\tvar m MsgNotFound\n\tfor i := 0; i < MaxInvPerMsg; i++ {\n\t\thash, err := chainhash.NewHashFromStr(fmt.Sprintf(\"%x\", i))\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"NewHashFromStr: unexpected error: %v\", err)\n\t\t}\n\t\tm.AddInvVect(NewInvVect(InvTypeBlock, hash))\n\t}\n\n\t// Serialize it so the bytes are available to test the decode below.\n\tvar bb bytes.Buffer\n\tif err := m.BtcEncode(&bb, pver, LatestEncoding); err != nil {\n\t\tb.Fatalf(\"MsgNotFound.BtcEncode: unexpected error: %v\", err)\n\t}\n\tbuf := bb.Bytes()\n\n\tr := bytes.NewReader(buf)\n\tvar msg MsgNotFound\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tmsg.BtcDecode(r, pver, LatestEncoding)\n\t}\n}\n\n// BenchmarkDecodeMerkleBlock performs a benchmark on how long it takes to\n// decode a reasonably sized merkleblock message.\nfunc BenchmarkDecodeMerkleBlock(b *testing.B) {\n\tb.ReportAllocs()\n\n\t// Create a message with random data.\n\tpver := ProtocolVersion\n\tvar m MsgMerkleBlock\n\thash, err := chainhash.NewHashFromStr(fmt.Sprintf(\"%x\", 10000))\n\tif err != nil {\n\t\tb.Fatalf(\"NewHashFromStr: unexpected error: %v\", err)\n\t}\n\tm.Header = *NewBlockHeader(1, hash, hash, 0, uint32(10000))\n\tfor i := 0; i < 105; i++ {\n\t\thash, err := chainhash.NewHashFromStr(fmt.Sprintf(\"%x\", i))\n\t\tif err != nil {\n\t\t\tb.Fatalf(\"NewHashFromStr: unexpected error: %v\", err)\n\t\t}\n\t\tm.AddTxHash(hash)\n\t\tif i%8 == 0 {\n\t\t\tm.Flags = append(m.Flags, uint8(i))\n\t\t}\n\t}\n\n\t// Serialize it so the bytes are available to test the decode below.\n\tvar bb bytes.Buffer\n\tif err := m.BtcEncode(&bb, pver, LatestEncoding); err != nil {\n\t\tb.Fatalf(\"MsgMerkleBlock.BtcEncode: unexpected error: %v\", err)\n\t}\n\tbuf := bb.Bytes()\n\n\tr := bytes.NewReader(buf)\n\tvar msg MsgMerkleBlock\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tr.Seek(0, 0)\n\t\tmsg.BtcDecode(r, pver, LatestEncoding)\n\t}\n}\n\n// BenchmarkTxHash performs a benchmark on how long it takes to hash a\n// transaction.\nfunc BenchmarkTxHash(b *testing.B) {\n\tb.ReportAllocs()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tgenesisCoinbaseTx.TxHash()\n\t}\n}\n\n// BenchmarkDoubleHashB performs a benchmark on how long it takes to perform a\n// double hash returning a byte slice.\nfunc BenchmarkDoubleHashB(b *testing.B) {\n\tb.ReportAllocs()\n\n\tvar buf bytes.Buffer\n\tif err := genesisCoinbaseTx.Serialize(&buf); err != nil {\n\t\tb.Errorf(\"Serialize: unexpected error: %v\", err)\n\t\treturn\n\t}\n\ttxBytes := buf.Bytes()\n\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = chainhash.DoubleHashB(txBytes)\n\t}\n}\n\n// BenchmarkDoubleHashH performs a benchmark on how long it takes to perform\n// a double hash returning a chainhash.Hash.\nfunc BenchmarkDoubleHashH(b *testing.B) {\n\tb.ReportAllocs()\n\n\tvar buf bytes.Buffer\n\tif err := genesisCoinbaseTx.Serialize(&buf); err != nil {\n\t\tb.Errorf(\"Serialize: unexpected error: %v\", err)\n\t\treturn\n\t}\n\ttxBytes := buf.Bytes()\n\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = chainhash.DoubleHashH(txBytes)\n\t}\n}\n"
  },
  {
    "path": "wire/blockheader.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"io\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// MaxBlockHeaderPayload is the maximum number of bytes a block header can be.\n// Version 4 bytes + Timestamp 4 bytes + Bits 4 bytes + Nonce 4 bytes +\n// PrevBlock and MerkleRoot hashes.\nconst MaxBlockHeaderPayload = 16 + (chainhash.HashSize * 2)\n\n// BlockHeader defines information about a block and is used in the bitcoin\n// block (MsgBlock) and headers (MsgHeaders) messages.\ntype BlockHeader struct {\n\t// Version of the block.  This is not the same as the protocol version.\n\tVersion int32\n\n\t// Hash of the previous block header in the block chain.\n\tPrevBlock chainhash.Hash\n\n\t// Merkle tree reference to hash of all transactions for the block.\n\tMerkleRoot chainhash.Hash\n\n\t// Time the block was created.  This is, unfortunately, encoded as a\n\t// uint32 on the wire and therefore is limited to 2106.\n\tTimestamp time.Time\n\n\t// Difficulty target for the block.\n\tBits uint32\n\n\t// Nonce used to generate the block.\n\tNonce uint32\n}\n\n// blockHeaderLen is a constant that represents the number of bytes for a block\n// header.\nconst blockHeaderLen = 80\n\n// BlockHash computes the block identifier hash for the given block header.\nfunc (h *BlockHeader) BlockHash() chainhash.Hash {\n\treturn chainhash.DoubleHashRaw(func(w io.Writer) error {\n\t\treturn writeBlockHeader(w, 0, h)\n\t})\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\n// See Deserialize for decoding block headers stored to disk, such as in a\n// database, as opposed to decoding block headers from the wire.\nfunc (h *BlockHeader) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\treturn readBlockHeader(r, pver, h)\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\n// See Serialize for encoding block headers to be stored to disk, such as in a\n// database, as opposed to encoding block headers for the wire.\nfunc (h *BlockHeader) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\treturn writeBlockHeader(w, pver, h)\n}\n\n// Deserialize decodes a block header from r into the receiver using a format\n// that is suitable for long-term storage such as a database while respecting\n// the Version field.\nfunc (h *BlockHeader) Deserialize(r io.Reader) error {\n\t// At the current time, there is no difference between the wire encoding\n\t// at protocol version 0 and the stable long-term storage format.  As\n\t// a result, make use of readBlockHeader.\n\treturn readBlockHeader(r, 0, h)\n}\n\n// Serialize encodes a block header from r into the receiver using a format\n// that is suitable for long-term storage such as a database while respecting\n// the Version field.\nfunc (h *BlockHeader) Serialize(w io.Writer) error {\n\t// At the current time, there is no difference between the wire encoding\n\t// at protocol version 0 and the stable long-term storage format.  As\n\t// a result, make use of writeBlockHeader.\n\treturn writeBlockHeader(w, 0, h)\n}\n\n// NewBlockHeader returns a new BlockHeader using the provided version, previous\n// block hash, merkle root hash, difficulty bits, and nonce used to generate the\n// block with defaults for the remaining fields.\nfunc NewBlockHeader(version int32, prevHash, merkleRootHash *chainhash.Hash,\n\tbits uint32, nonce uint32) *BlockHeader {\n\n\t// Limit the timestamp to one second precision since the protocol\n\t// doesn't support better.\n\treturn &BlockHeader{\n\t\tVersion:    version,\n\t\tPrevBlock:  *prevHash,\n\t\tMerkleRoot: *merkleRootHash,\n\t\tTimestamp:  time.Unix(time.Now().Unix(), 0),\n\t\tBits:       bits,\n\t\tNonce:      nonce,\n\t}\n}\n\n// readBlockHeader reads a bitcoin block header from r.  See Deserialize for\n// decoding block headers stored to disk, such as in a database, as opposed to\n// decoding from the wire.\n//\n// DEPRECATED: Use readBlockHeaderBuf instead.\nfunc readBlockHeader(r io.Reader, pver uint32, bh *BlockHeader) error {\n\tbuf := binarySerializer.Borrow()\n\terr := readBlockHeaderBuf(r, pver, bh, buf)\n\tbinarySerializer.Return(buf)\n\treturn err\n}\n\n// readBlockHeaderBuf reads a bitcoin block header from r.  See Deserialize for\n// decoding block headers stored to disk, such as in a database, as opposed to\n// decoding from the wire.\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc readBlockHeaderBuf(r io.Reader, pver uint32, bh *BlockHeader,\n\tbuf []byte) error {\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tbh.Version = int32(littleEndian.Uint32(buf[:4]))\n\n\tif _, err := io.ReadFull(r, bh.PrevBlock[:]); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := io.ReadFull(r, bh.MerkleRoot[:]); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tbh.Timestamp = time.Unix(int64(littleEndian.Uint32(buf[:4])), 0)\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tbh.Bits = littleEndian.Uint32(buf[:4])\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tbh.Nonce = littleEndian.Uint32(buf[:4])\n\n\treturn nil\n}\n\n// writeBlockHeader writes a bitcoin block header to w.  See Serialize for\n// encoding block headers to be stored to disk, such as in a database, as\n// opposed to encoding for the wire.\n//\n// DEPRECATED: Use writeBlockHeaderBuf instead.\nfunc writeBlockHeader(w io.Writer, pver uint32, bh *BlockHeader) error {\n\tbuf := binarySerializer.Borrow()\n\terr := writeBlockHeaderBuf(w, pver, bh, buf)\n\tbinarySerializer.Return(buf)\n\treturn err\n}\n\n// writeBlockHeaderBuf writes a bitcoin block header to w.  See Serialize for\n// encoding block headers to be stored to disk, such as in a database, as\n// opposed to encoding for the wire.\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc writeBlockHeaderBuf(w io.Writer, pver uint32, bh *BlockHeader,\n\tbuf []byte) error {\n\n\tlittleEndian.PutUint32(buf[:4], uint32(bh.Version))\n\tif _, err := w.Write(buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := w.Write(bh.PrevBlock[:]); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := w.Write(bh.MerkleRoot[:]); err != nil {\n\t\treturn err\n\t}\n\n\tlittleEndian.PutUint32(buf[:4], uint32(bh.Timestamp.Unix()))\n\tif _, err := w.Write(buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\tlittleEndian.PutUint32(buf[:4], bh.Bits)\n\tif _, err := w.Write(buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\tlittleEndian.PutUint32(buf[:4], bh.Nonce)\n\tif _, err := w.Write(buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "wire/blockheader_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestBlockHeader tests the BlockHeader API.\nfunc TestBlockHeader(t *testing.T) {\n\tnonce64, err := RandomUint64()\n\tif err != nil {\n\t\tt.Errorf(\"RandomUint64: Error generating nonce: %v\", err)\n\t}\n\tnonce := uint32(nonce64)\n\n\thash := mainNetGenesisHash\n\tmerkleHash := mainNetGenesisMerkleRoot\n\tbits := uint32(0x1d00ffff)\n\tbh := NewBlockHeader(1, &hash, &merkleHash, bits, nonce)\n\n\t// Ensure we get the same data back out.\n\tif !bh.PrevBlock.IsEqual(&hash) {\n\t\tt.Errorf(\"NewBlockHeader: wrong prev hash - got %v, want %v\",\n\t\t\tspew.Sprint(bh.PrevBlock), spew.Sprint(hash))\n\t}\n\tif !bh.MerkleRoot.IsEqual(&merkleHash) {\n\t\tt.Errorf(\"NewBlockHeader: wrong merkle root - got %v, want %v\",\n\t\t\tspew.Sprint(bh.MerkleRoot), spew.Sprint(merkleHash))\n\t}\n\tif bh.Bits != bits {\n\t\tt.Errorf(\"NewBlockHeader: wrong bits - got %v, want %v\",\n\t\t\tbh.Bits, bits)\n\t}\n\tif bh.Nonce != nonce {\n\t\tt.Errorf(\"NewBlockHeader: wrong nonce - got %v, want %v\",\n\t\t\tbh.Nonce, nonce)\n\t}\n}\n\n// TestBlockHeaderWire tests the BlockHeader wire encode and decode for various\n// protocol versions.\nfunc TestBlockHeaderWire(t *testing.T) {\n\tnonce := uint32(123123) // 0x1e0f3\n\tpver := uint32(70001)\n\n\t// baseBlockHdr is used in the various tests as a baseline BlockHeader.\n\tbits := uint32(0x1d00ffff)\n\tbaseBlockHdr := &BlockHeader{\n\t\tVersion:    1,\n\t\tPrevBlock:  mainNetGenesisHash,\n\t\tMerkleRoot: mainNetGenesisMerkleRoot,\n\t\tTimestamp:  time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST\n\t\tBits:       bits,\n\t\tNonce:      nonce,\n\t}\n\n\t// baseBlockHdrEncoded is the wire encoded bytes of baseBlockHdr.\n\tbaseBlockHdrEncoded := []byte{\n\t\t0x01, 0x00, 0x00, 0x00, // Version 1\n\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock\n\t\t0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2,\n\t\t0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61,\n\t\t0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32,\n\t\t0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, // MerkleRoot\n\t\t0x29, 0xab, 0x5f, 0x49, // Timestamp\n\t\t0xff, 0xff, 0x00, 0x1d, // Bits\n\t\t0xf3, 0xe0, 0x01, 0x00, // Nonce\n\t}\n\n\ttests := []struct {\n\t\tin   *BlockHeader    // Data to encode\n\t\tout  *BlockHeader    // Expected decoded data\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding variant to use\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdrEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version.\n\t\t{\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdrEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version.\n\t\t{\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdrEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion.\n\t\t{\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdrEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion.\n\t\t{\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdrEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := writeBlockHeader(&buf, test.pver, test.in)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"writeBlockHeader #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"writeBlockHeader #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\tbuf.Reset()\n\t\terr = test.in.BtcEncode(&buf, pver, 0)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the block header from wire format.\n\t\tvar bh BlockHeader\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = readBlockHeader(rbuf, test.pver, &bh)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"readBlockHeader #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&bh, test.out) {\n\t\t\tt.Errorf(\"readBlockHeader #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&bh), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\n\t\trbuf = bytes.NewReader(test.buf)\n\t\terr = bh.BtcDecode(rbuf, pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&bh, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&bh), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestBlockHeaderSerialize tests BlockHeader serialize and deserialize.\nfunc TestBlockHeaderSerialize(t *testing.T) {\n\tnonce := uint32(123123) // 0x1e0f3\n\n\t// baseBlockHdr is used in the various tests as a baseline BlockHeader.\n\tbits := uint32(0x1d00ffff)\n\tbaseBlockHdr := &BlockHeader{\n\t\tVersion:    1,\n\t\tPrevBlock:  mainNetGenesisHash,\n\t\tMerkleRoot: mainNetGenesisMerkleRoot,\n\t\tTimestamp:  time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST\n\t\tBits:       bits,\n\t\tNonce:      nonce,\n\t}\n\n\t// baseBlockHdrEncoded is the wire encoded bytes of baseBlockHdr.\n\tbaseBlockHdrEncoded := []byte{\n\t\t0x01, 0x00, 0x00, 0x00, // Version 1\n\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock\n\t\t0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2,\n\t\t0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61,\n\t\t0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32,\n\t\t0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, // MerkleRoot\n\t\t0x29, 0xab, 0x5f, 0x49, // Timestamp\n\t\t0xff, 0xff, 0x00, 0x1d, // Bits\n\t\t0xf3, 0xe0, 0x01, 0x00, // Nonce\n\t}\n\n\ttests := []struct {\n\t\tin  *BlockHeader // Data to encode\n\t\tout *BlockHeader // Expected decoded data\n\t\tbuf []byte       // Serialized data\n\t}{\n\t\t{\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdr,\n\t\t\tbaseBlockHdrEncoded,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Serialize the block header.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.Serialize(&buf)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Serialize #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"Serialize #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Deserialize the block header.\n\t\tvar bh BlockHeader\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = bh.Deserialize(rbuf)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Deserialize #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&bh, test.out) {\n\t\t\tt.Errorf(\"Deserialize #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&bh), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/common.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"crypto/rand\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nconst (\n\t// MaxVarIntPayload is the maximum payload size for a variable length integer.\n\tMaxVarIntPayload = 9\n\n\t// binaryFreeListMaxItems is the number of buffers to keep in the free\n\t// list to use for binary serialization and deserialization.\n\tbinaryFreeListMaxItems = 1024\n)\n\nvar (\n\t// littleEndian is a convenience variable since binary.LittleEndian is\n\t// quite long.\n\tlittleEndian = binary.LittleEndian\n\n\t// bigEndian is a convenience variable since binary.BigEndian is quite\n\t// long.\n\tbigEndian = binary.BigEndian\n)\n\n// binaryFreeList defines a concurrent safe free list of byte slices (up to the\n// maximum number defined by the binaryFreeListMaxItems constant) that have a\n// cap of 8 (thus it supports up to a uint64).  It is used to provide temporary\n// buffers for serializing and deserializing primitive numbers to and from their\n// binary encoding in order to greatly reduce the number of allocations\n// required.\n//\n// For convenience, functions are provided for each of the primitive unsigned\n// integers that automatically obtain a buffer from the free list, perform the\n// necessary binary conversion, read from or write to the given io.Reader or\n// io.Writer, and return the buffer to the free list.\ntype binaryFreeList chan []byte\n\n// Borrow returns a byte slice from the free list with a length of 8.  A new\n// buffer is allocated if there are not any available on the free list.\nfunc (l binaryFreeList) Borrow() []byte {\n\tvar buf []byte\n\tselect {\n\tcase buf = <-l:\n\tdefault:\n\t\tbuf = make([]byte, 8)\n\t}\n\treturn buf[:8]\n}\n\n// Return puts the provided byte slice back on the free list.  The buffer MUST\n// have been obtained via the Borrow function and therefore have a cap of 8.\nfunc (l binaryFreeList) Return(buf []byte) {\n\tselect {\n\tcase l <- buf:\n\tdefault:\n\t\t// Let it go to the garbage collector.\n\t}\n}\n\n// Uint8 reads a single byte from the provided reader using a buffer from the\n// free list and returns it as a uint8.\nfunc (l binaryFreeList) Uint8(r io.Reader) (uint8, error) {\n\tbuf := l.Borrow()[:1]\n\tdefer l.Return(buf)\n\n\tif _, err := io.ReadFull(r, buf); err != nil {\n\t\treturn 0, err\n\t}\n\trv := buf[0]\n\n\treturn rv, nil\n}\n\n// Uint16 reads two bytes from the provided reader using a buffer from the\n// free list, converts it to a number using the provided byte order, and returns\n// the resulting uint16.\nfunc (l binaryFreeList) Uint16(r io.Reader, byteOrder binary.ByteOrder) (uint16, error) {\n\tbuf := l.Borrow()[:2]\n\tdefer l.Return(buf)\n\n\tif _, err := io.ReadFull(r, buf); err != nil {\n\t\treturn 0, err\n\t}\n\trv := byteOrder.Uint16(buf)\n\n\treturn rv, nil\n}\n\n// Uint32 reads four bytes from the provided reader using a buffer from the\n// free list, converts it to a number using the provided byte order, and returns\n// the resulting uint32.\nfunc (l binaryFreeList) Uint32(r io.Reader, byteOrder binary.ByteOrder) (uint32, error) {\n\tbuf := l.Borrow()[:4]\n\tdefer l.Return(buf)\n\n\tif _, err := io.ReadFull(r, buf); err != nil {\n\t\treturn 0, err\n\t}\n\trv := byteOrder.Uint32(buf)\n\n\treturn rv, nil\n}\n\n// Uint64 reads eight bytes from the provided reader using a buffer from the\n// free list, converts it to a number using the provided byte order, and returns\n// the resulting uint64.\nfunc (l binaryFreeList) Uint64(r io.Reader, byteOrder binary.ByteOrder) (uint64, error) {\n\tbuf := l.Borrow()[:8]\n\tdefer l.Return(buf)\n\n\tif _, err := io.ReadFull(r, buf); err != nil {\n\t\treturn 0, err\n\t}\n\trv := byteOrder.Uint64(buf)\n\n\treturn rv, nil\n}\n\n// PutUint8 copies the provided uint8 into a buffer from the free list and\n// writes the resulting byte to the given writer.\nfunc (l binaryFreeList) PutUint8(w io.Writer, val uint8) error {\n\tbuf := l.Borrow()[:1]\n\tdefer l.Return(buf)\n\n\tbuf[0] = val\n\t_, err := w.Write(buf)\n\n\treturn err\n}\n\n// PutUint16 serializes the provided uint16 using the given byte order into a\n// buffer from the free list and writes the resulting two bytes to the given\n// writer.\nfunc (l binaryFreeList) PutUint16(w io.Writer, byteOrder binary.ByteOrder, val uint16) error {\n\tbuf := l.Borrow()[:2]\n\tdefer l.Return(buf)\n\n\tbyteOrder.PutUint16(buf, val)\n\t_, err := w.Write(buf)\n\n\treturn err\n}\n\n// PutUint32 serializes the provided uint32 using the given byte order into a\n// buffer from the free list and writes the resulting four bytes to the given\n// writer.\nfunc (l binaryFreeList) PutUint32(w io.Writer, byteOrder binary.ByteOrder, val uint32) error {\n\tbuf := l.Borrow()[:4]\n\tdefer l.Return(buf)\n\n\tbyteOrder.PutUint32(buf, val)\n\t_, err := w.Write(buf)\n\n\treturn err\n}\n\n// PutUint64 serializes the provided uint64 using the given byte order into a\n// buffer from the free list and writes the resulting eight bytes to the given\n// writer.\nfunc (l binaryFreeList) PutUint64(w io.Writer, byteOrder binary.ByteOrder, val uint64) error {\n\tbuf := l.Borrow()[:8]\n\tdefer l.Return(buf)\n\n\tbyteOrder.PutUint64(buf, val)\n\t_, err := w.Write(buf)\n\n\treturn err\n}\n\n// binarySerializer provides a free list of buffers to use for serializing and\n// deserializing primitive integer values to and from io.Readers and io.Writers.\nvar binarySerializer binaryFreeList = make(chan []byte, binaryFreeListMaxItems)\n\n// errNonCanonicalVarInt is the common format string used for non-canonically\n// encoded variable length integer errors.\nvar errNonCanonicalVarInt = \"non-canonical varint %x - discriminant %x must \" +\n\t\"encode a value greater than %x\"\n\n// uint32Time represents a unix timestamp encoded with a uint32.  It is used as\n// a way to signal the readElement function how to decode a timestamp into a Go\n// time.Time since it is otherwise ambiguous.\ntype uint32Time time.Time\n\n// int64Time represents a unix timestamp encoded with an int64.  It is used as\n// a way to signal the readElement function how to decode a timestamp into a Go\n// time.Time since it is otherwise ambiguous.\ntype int64Time time.Time\n\n// readElement reads the next sequence of bytes from r using little endian\n// depending on the concrete type of element pointed to.\nfunc readElement(r io.Reader, element interface{}) error {\n\t// Attempt to read the element based on the concrete type via fast\n\t// type assertions first.\n\tswitch e := element.(type) {\n\tcase *int32:\n\t\trv, err := binarySerializer.Uint32(r, littleEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*e = int32(rv)\n\t\treturn nil\n\n\tcase *uint32:\n\t\trv, err := binarySerializer.Uint32(r, littleEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*e = rv\n\t\treturn nil\n\n\tcase *int64:\n\t\trv, err := binarySerializer.Uint64(r, littleEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*e = int64(rv)\n\t\treturn nil\n\n\tcase *uint64:\n\t\trv, err := binarySerializer.Uint64(r, littleEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*e = rv\n\t\treturn nil\n\n\tcase *bool:\n\t\trv, err := binarySerializer.Uint8(r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif rv == 0x00 {\n\t\t\t*e = false\n\t\t} else {\n\t\t\t*e = true\n\t\t}\n\t\treturn nil\n\n\t// Unix timestamp encoded as a uint32.\n\tcase *uint32Time:\n\t\trv, err := binarySerializer.Uint32(r, binary.LittleEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*e = uint32Time(time.Unix(int64(rv), 0))\n\t\treturn nil\n\n\t// Unix timestamp encoded as an int64.\n\tcase *int64Time:\n\t\trv, err := binarySerializer.Uint64(r, binary.LittleEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*e = int64Time(time.Unix(int64(rv), 0))\n\t\treturn nil\n\n\t// Message header checksum.\n\tcase *[4]byte:\n\t\t_, err := io.ReadFull(r, e[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\t// Message header command.\n\tcase *[CommandSize]uint8:\n\t\t_, err := io.ReadFull(r, e[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\t// IP address.\n\tcase *[16]byte:\n\t\t_, err := io.ReadFull(r, e[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase *chainhash.Hash:\n\t\t_, err := io.ReadFull(r, e[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase *ServiceFlag:\n\t\trv, err := binarySerializer.Uint64(r, littleEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*e = ServiceFlag(rv)\n\t\treturn nil\n\n\tcase *InvType:\n\t\trv, err := binarySerializer.Uint32(r, littleEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*e = InvType(rv)\n\t\treturn nil\n\n\tcase *BitcoinNet:\n\t\trv, err := binarySerializer.Uint32(r, littleEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*e = BitcoinNet(rv)\n\t\treturn nil\n\n\tcase *BloomUpdateType:\n\t\trv, err := binarySerializer.Uint8(r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*e = BloomUpdateType(rv)\n\t\treturn nil\n\n\tcase *RejectCode:\n\t\trv, err := binarySerializer.Uint8(r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*e = RejectCode(rv)\n\t\treturn nil\n\t}\n\n\t// Fall back to the slower binary.Read if a fast path was not available\n\t// above.\n\treturn binary.Read(r, littleEndian, element)\n}\n\n// readElements reads multiple items from r.  It is equivalent to multiple\n// calls to readElement.\nfunc readElements(r io.Reader, elements ...interface{}) error {\n\tfor _, element := range elements {\n\t\terr := readElement(r, element)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// writeElement writes the little endian representation of element to w.\nfunc writeElement(w io.Writer, element interface{}) error {\n\t// Attempt to write the element based on the concrete type via fast\n\t// type assertions first.\n\tswitch e := element.(type) {\n\tcase int32:\n\t\terr := binarySerializer.PutUint32(w, littleEndian, uint32(e))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase uint32:\n\t\terr := binarySerializer.PutUint32(w, littleEndian, e)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase int64:\n\t\terr := binarySerializer.PutUint64(w, littleEndian, uint64(e))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase uint64:\n\t\terr := binarySerializer.PutUint64(w, littleEndian, e)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase bool:\n\t\tvar err error\n\t\tif e {\n\t\t\terr = binarySerializer.PutUint8(w, 0x01)\n\t\t} else {\n\t\t\terr = binarySerializer.PutUint8(w, 0x00)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\t// Message header checksum.\n\tcase [4]byte:\n\t\t_, err := w.Write(e[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\t// Message header command.\n\tcase [CommandSize]uint8:\n\t\t_, err := w.Write(e[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\t// IP address.\n\tcase [16]byte:\n\t\t_, err := w.Write(e[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase *chainhash.Hash:\n\t\t_, err := w.Write(e[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase ServiceFlag:\n\t\terr := binarySerializer.PutUint64(w, littleEndian, uint64(e))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase InvType:\n\t\terr := binarySerializer.PutUint32(w, littleEndian, uint32(e))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase BitcoinNet:\n\t\terr := binarySerializer.PutUint32(w, littleEndian, uint32(e))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase BloomUpdateType:\n\t\terr := binarySerializer.PutUint8(w, uint8(e))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\n\tcase RejectCode:\n\t\terr := binarySerializer.PutUint8(w, uint8(e))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n\n\t// Fall back to the slower binary.Write if a fast path was not available\n\t// above.\n\treturn binary.Write(w, littleEndian, element)\n}\n\n// writeElements writes multiple items to w.  It is equivalent to multiple\n// calls to writeElement.\nfunc writeElements(w io.Writer, elements ...interface{}) error {\n\tfor _, element := range elements {\n\t\terr := writeElement(w, element)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// ReadVarInt reads a variable length integer from r and returns it as a uint64.\nfunc ReadVarInt(r io.Reader, pver uint32) (uint64, error) {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tn, err := ReadVarIntBuf(r, pver, buf)\n\treturn n, err\n}\n\n// ReadVarIntBuf reads a variable length integer from r using a preallocated\n// scratch buffer and returns it as a uint64.\n//\n// NOTE: buf MUST at least an 8-byte slice.\nfunc ReadVarIntBuf(r io.Reader, pver uint32, buf []byte) (uint64, error) {\n\tif _, err := io.ReadFull(r, buf[:1]); err != nil {\n\t\treturn 0, err\n\t}\n\tdiscriminant := buf[0]\n\n\tvar rv uint64\n\tswitch discriminant {\n\tcase 0xff:\n\t\tif _, err := io.ReadFull(r, buf); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\trv = littleEndian.Uint64(buf)\n\n\t\t// The encoding is not canonical if the value could have been\n\t\t// encoded using fewer bytes.\n\t\tmin := uint64(0x100000000)\n\t\tif rv < min {\n\t\t\treturn 0, messageError(\"ReadVarInt\", fmt.Sprintf(\n\t\t\t\terrNonCanonicalVarInt, rv, discriminant, min))\n\t\t}\n\n\tcase 0xfe:\n\t\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\trv = uint64(littleEndian.Uint32(buf[:4]))\n\n\t\t// The encoding is not canonical if the value could have been\n\t\t// encoded using fewer bytes.\n\t\tmin := uint64(0x10000)\n\t\tif rv < min {\n\t\t\treturn 0, messageError(\"ReadVarInt\", fmt.Sprintf(\n\t\t\t\terrNonCanonicalVarInt, rv, discriminant, min))\n\t\t}\n\n\tcase 0xfd:\n\t\tif _, err := io.ReadFull(r, buf[:2]); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\trv = uint64(littleEndian.Uint16(buf[:2]))\n\n\t\t// The encoding is not canonical if the value could have been\n\t\t// encoded using fewer bytes.\n\t\tmin := uint64(0xfd)\n\t\tif rv < min {\n\t\t\treturn 0, messageError(\"ReadVarInt\", fmt.Sprintf(\n\t\t\t\terrNonCanonicalVarInt, rv, discriminant, min))\n\t\t}\n\n\tdefault:\n\t\trv = uint64(discriminant)\n\t}\n\n\treturn rv, nil\n}\n\n// WriteVarInt serializes val to w using a variable number of bytes depending\n// on its value.\nfunc WriteVarInt(w io.Writer, pver uint32, val uint64) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := WriteVarIntBuf(w, pver, val, buf)\n\treturn err\n}\n\n// WriteVarIntBuf serializes val to w using a variable number of bytes depending\n// on its value using a preallocated scratch buffer.\n//\n// NOTE: buf MUST at least an 8-byte slice.\nfunc WriteVarIntBuf(w io.Writer, pver uint32, val uint64, buf []byte) error {\n\tswitch {\n\tcase val < 0xfd:\n\t\tbuf[0] = uint8(val)\n\t\t_, err := w.Write(buf[:1])\n\t\treturn err\n\n\tcase val <= math.MaxUint16:\n\t\tbuf[0] = 0xfd\n\t\tlittleEndian.PutUint16(buf[1:3], uint16(val))\n\t\t_, err := w.Write(buf[:3])\n\t\treturn err\n\n\tcase val <= math.MaxUint32:\n\t\tbuf[0] = 0xfe\n\t\tlittleEndian.PutUint32(buf[1:5], uint32(val))\n\t\t_, err := w.Write(buf[:5])\n\t\treturn err\n\n\tdefault:\n\t\tbuf[0] = 0xff\n\t\tif _, err := w.Write(buf[:1]); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tlittleEndian.PutUint64(buf, val)\n\t\t_, err := w.Write(buf)\n\t\treturn err\n\t}\n}\n\n// VarIntSerializeSize returns the number of bytes it would take to serialize\n// val as a variable length integer.\nfunc VarIntSerializeSize(val uint64) int {\n\t// The value is small enough to be represented by itself, so it's\n\t// just 1 byte.\n\tif val < 0xfd {\n\t\treturn 1\n\t}\n\n\t// Discriminant 1 byte plus 2 bytes for the uint16.\n\tif val <= math.MaxUint16 {\n\t\treturn 3\n\t}\n\n\t// Discriminant 1 byte plus 4 bytes for the uint32.\n\tif val <= math.MaxUint32 {\n\t\treturn 5\n\t}\n\n\t// Discriminant 1 byte plus 8 bytes for the uint64.\n\treturn 9\n}\n\n// ReadVarString reads a variable length string from r and returns it as a Go\n// string.  A variable length string is encoded as a variable length integer\n// containing the length of the string followed by the bytes that represent the\n// string itself.  An error is returned if the length is greater than the\n// maximum block payload size since it helps protect against memory exhaustion\n// attacks and forced panics through malformed messages.\nfunc ReadVarString(r io.Reader, pver uint32) (string, error) {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tstr, err := readVarStringBuf(r, pver, buf)\n\treturn str, err\n}\n\n// readVarStringBuf reads a variable length string from r and returns it as a Go\n// string.  A variable length string is encoded as a variable length integer\n// containing the length of the string followed by the bytes that represent the\n// string itself.  An error is returned if the length is greater than the\n// maximum block payload size since it helps protect against memory exhaustion\n// attacks and forced panics through malformed messages.\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc readVarStringBuf(r io.Reader, pver uint32, buf []byte) (string, error) {\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Prevent variable length strings that are larger than the maximum\n\t// message size.  It would be possible to cause memory exhaustion and\n\t// panics without a sane upper bound on this count.\n\tif count > MaxMessagePayload {\n\t\tstr := fmt.Sprintf(\"variable length string is too long \"+\n\t\t\t\"[count %d, max %d]\", count, MaxMessagePayload)\n\t\treturn \"\", messageError(\"ReadVarString\", str)\n\t}\n\n\tstr := make([]byte, count)\n\t_, err = io.ReadFull(r, str)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(str), nil\n}\n\n// WriteVarString serializes str to w as a variable length integer containing\n// the length of the string followed by the bytes that represent the string\n// itself.\nfunc WriteVarString(w io.Writer, pver uint32, str string) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := writeVarStringBuf(w, pver, str, buf)\n\treturn err\n}\n\n// writeVarStringBuf serializes str to w as a variable length integer containing\n// the length of the string followed by the bytes that represent the string\n// itself.\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc writeVarStringBuf(w io.Writer, pver uint32, str string, buf []byte) error {\n\terr := WriteVarIntBuf(w, pver, uint64(len(str)), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = w.Write([]byte(str))\n\treturn err\n}\n\n// ReadVarBytes reads a variable length byte array.  A byte array is encoded\n// as a varInt containing the length of the array followed by the bytes\n// themselves.  An error is returned if the length is greater than the\n// passed maxAllowed parameter which helps protect against memory exhaustion\n// attacks and forced panics through malformed messages.  The fieldName\n// parameter is only used for the error message so it provides more context in\n// the error.\nfunc ReadVarBytes(r io.Reader, pver uint32, maxAllowed uint32,\n\tfieldName string) ([]byte, error) {\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tb, err := ReadVarBytesBuf(r, pver, buf, maxAllowed, fieldName)\n\treturn b, err\n}\n\n// ReadVarBytesBuf reads a variable length byte array.  A byte array is encoded\n// as a varInt containing the length of the array followed by the bytes\n// themselves.  An error is returned if the length is greater than the\n// passed maxAllowed parameter which helps protect against memory exhaustion\n// attacks and forced panics through malformed messages.  The fieldName\n// parameter is only used for the error message so it provides more context in\n// the error. If b is non-nil, the provided buffer will be used for serializing\n// small values. Otherwise a buffer will be drawn from the binarySerializer's\n// pool and return when the method finishes.\nfunc ReadVarBytesBuf(r io.Reader, pver uint32, buf []byte, maxAllowed uint32,\n\tfieldName string) ([]byte, error) {\n\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Prevent byte array larger than the max message size.  It would\n\t// be possible to cause memory exhaustion and panics without a sane\n\t// upper bound on this count.\n\tif count > uint64(maxAllowed) {\n\t\tstr := fmt.Sprintf(\"%s is larger than the max allowed size \"+\n\t\t\t\"[count %d, max %d]\", fieldName, count, maxAllowed)\n\t\treturn nil, messageError(\"ReadVarBytes\", str)\n\t}\n\n\tbytes := make([]byte, count)\n\t_, err = io.ReadFull(r, bytes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn bytes, nil\n}\n\n// WriteVarBytes serializes a variable length byte array to w as a varInt\n// containing the number of bytes, followed by the bytes themselves.\nfunc WriteVarBytes(w io.Writer, pver uint32, bytes []byte) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := WriteVarBytesBuf(w, pver, bytes, buf)\n\treturn err\n}\n\n// WriteVarBytesBuf serializes a variable length byte array to w as a varInt\n// containing the number of bytes, followed by the bytes themselves. If b is\n// non-nil, the provided buffer will be used for serializing small values.\n// Otherwise a buffer will be drawn from the binarySerializer's pool and return\n// when the method finishes.\nfunc WriteVarBytesBuf(w io.Writer, pver uint32, bytes, buf []byte) error {\n\tslen := uint64(len(bytes))\n\n\terr := WriteVarIntBuf(w, pver, slen, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = w.Write(bytes)\n\treturn err\n}\n\n// randomUint64 returns a cryptographically random uint64 value.  This\n// unexported version takes a reader primarily to ensure the error paths\n// can be properly tested by passing a fake reader in the tests.\nfunc randomUint64(r io.Reader) (uint64, error) {\n\trv, err := binarySerializer.Uint64(r, bigEndian)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn rv, nil\n}\n\n// RandomUint64 returns a cryptographically random uint64 value.\nfunc RandomUint64() (uint64, error) {\n\treturn randomUint64(rand.Reader)\n}\n"
  },
  {
    "path": "wire/common_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// mainNetGenesisHash is the hash of the first block in the block chain for the\n// main network (genesis block).\nvar mainNetGenesisHash = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,\n})\n\n// mainNetGenesisMerkleRoot is the hash of the first transaction in the genesis\n// block for the main network.\nvar mainNetGenesisMerkleRoot = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2,\n\t0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61,\n\t0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32,\n\t0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a,\n})\n\n// fakeRandReader implements the io.Reader interface and is used to force\n// errors in the RandomUint64 function.\ntype fakeRandReader struct {\n\tn   int\n\terr error\n}\n\n// Read returns the fake reader error and the lesser of the fake reader value\n// and the length of p.\nfunc (r *fakeRandReader) Read(p []byte) (int, error) {\n\tn := r.n\n\tif n > len(p) {\n\t\tn = len(p)\n\t}\n\treturn n, r.err\n}\n\n// TestElementWire tests wire encode and decode for various element types.  This\n// is mainly to test the \"fast\" paths in readElement and writeElement which use\n// type assertions to avoid reflection when possible.\nfunc TestElementWire(t *testing.T) {\n\ttype writeElementReflect int32\n\n\ttests := []struct {\n\t\tin  interface{} // Value to encode\n\t\tbuf []byte      // Wire encoding\n\t}{\n\t\t{int32(1), []byte{0x01, 0x00, 0x00, 0x00}},\n\t\t{uint32(256), []byte{0x00, 0x01, 0x00, 0x00}},\n\t\t{\n\t\t\tint64(65536),\n\t\t\t[]byte{0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00},\n\t\t},\n\t\t{\n\t\t\tuint64(4294967296),\n\t\t\t[]byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00},\n\t\t},\n\t\t{\n\t\t\ttrue,\n\t\t\t[]byte{0x01},\n\t\t},\n\t\t{\n\t\t\tfalse,\n\t\t\t[]byte{0x00},\n\t\t},\n\t\t{\n\t\t\t[4]byte{0x01, 0x02, 0x03, 0x04},\n\t\t\t[]byte{0x01, 0x02, 0x03, 0x04},\n\t\t},\n\t\t{\n\t\t\t[CommandSize]byte{\n\t\t\t\t0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,\n\t\t\t\t0x09, 0x0a, 0x0b, 0x0c,\n\t\t\t},\n\t\t\t[]byte{\n\t\t\t\t0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,\n\t\t\t\t0x09, 0x0a, 0x0b, 0x0c,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t[16]byte{\n\t\t\t\t0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,\n\t\t\t\t0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,\n\t\t\t},\n\t\t\t[]byte{\n\t\t\t\t0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,\n\t\t\t\t0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t(*chainhash.Hash)(&[chainhash.HashSize]byte{ // Make go vet happy.\n\t\t\t\t0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,\n\t\t\t\t0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,\n\t\t\t\t0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,\n\t\t\t\t0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,\n\t\t\t}),\n\t\t\t[]byte{\n\t\t\t\t0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,\n\t\t\t\t0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,\n\t\t\t\t0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,\n\t\t\t\t0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tSFNodeNetwork,\n\t\t\t[]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},\n\t\t},\n\t\t{\n\t\t\tInvTypeTx,\n\t\t\t[]byte{0x01, 0x00, 0x00, 0x00},\n\t\t},\n\t\t{\n\t\t\tMainNet,\n\t\t\t[]byte{0xf9, 0xbe, 0xb4, 0xd9},\n\t\t},\n\t\t// Type not supported by the \"fast\" path and requires reflection.\n\t\t{\n\t\t\twriteElementReflect(1),\n\t\t\t[]byte{0x01, 0x00, 0x00, 0x00},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Write to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := writeElement(&buf, test.in)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"writeElement #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"writeElement #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Read from wire format.\n\t\trbuf := bytes.NewReader(test.buf)\n\t\tval := test.in\n\t\tif reflect.ValueOf(test.in).Kind() != reflect.Ptr {\n\t\t\tval = reflect.New(reflect.TypeOf(test.in)).Interface()\n\t\t}\n\t\terr = readElement(rbuf, val)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"readElement #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tival := val\n\t\tif reflect.ValueOf(test.in).Kind() != reflect.Ptr {\n\t\t\tival = reflect.Indirect(reflect.ValueOf(val)).Interface()\n\t\t}\n\t\tif !reflect.DeepEqual(ival, test.in) {\n\t\t\tt.Errorf(\"readElement #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(ival), spew.Sdump(test.in))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestElementWireErrors performs negative tests against wire encode and decode\n// of various element types to confirm error paths work correctly.\nfunc TestElementWireErrors(t *testing.T) {\n\ttests := []struct {\n\t\tin       interface{} // Value to encode\n\t\tmax      int         // Max size of fixed buffer to induce errors\n\t\twriteErr error       // Expected write error\n\t\treadErr  error       // Expected read error\n\t}{\n\t\t{int32(1), 0, io.ErrShortWrite, io.EOF},\n\t\t{uint32(256), 0, io.ErrShortWrite, io.EOF},\n\t\t{int64(65536), 0, io.ErrShortWrite, io.EOF},\n\t\t{true, 0, io.ErrShortWrite, io.EOF},\n\t\t{[4]byte{0x01, 0x02, 0x03, 0x04}, 0, io.ErrShortWrite, io.EOF},\n\t\t{\n\t\t\t[CommandSize]byte{\n\t\t\t\t0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,\n\t\t\t\t0x09, 0x0a, 0x0b, 0x0c,\n\t\t\t},\n\t\t\t0, io.ErrShortWrite, io.EOF,\n\t\t},\n\t\t{\n\t\t\t[16]byte{\n\t\t\t\t0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,\n\t\t\t\t0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,\n\t\t\t},\n\t\t\t0, io.ErrShortWrite, io.EOF,\n\t\t},\n\t\t{\n\t\t\t(*chainhash.Hash)(&[chainhash.HashSize]byte{ // Make go vet happy.\n\t\t\t\t0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,\n\t\t\t\t0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,\n\t\t\t\t0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,\n\t\t\t\t0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,\n\t\t\t}),\n\t\t\t0, io.ErrShortWrite, io.EOF,\n\t\t},\n\t\t{SFNodeNetwork, 0, io.ErrShortWrite, io.EOF},\n\t\t{InvTypeTx, 0, io.ErrShortWrite, io.EOF},\n\t\t{MainNet, 0, io.ErrShortWrite, io.EOF},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := writeElement(w, test.in)\n\t\tif err != test.writeErr {\n\t\t\tt.Errorf(\"writeElement #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tr := newFixedReader(test.max, nil)\n\t\tval := test.in\n\t\tif reflect.ValueOf(test.in).Kind() != reflect.Ptr {\n\t\t\tval = reflect.New(reflect.TypeOf(test.in)).Interface()\n\t\t}\n\t\terr = readElement(r, val)\n\t\tif err != test.readErr {\n\t\t\tt.Errorf(\"readElement #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestVarIntWire tests wire encode and decode for variable length integers.\nfunc TestVarIntWire(t *testing.T) {\n\tpver := ProtocolVersion\n\n\ttests := []struct {\n\t\tin   uint64 // Value to encode\n\t\tout  uint64 // Expected decoded value\n\t\tbuf  []byte // Wire encoding\n\t\tpver uint32 // Protocol version for wire encoding\n\t}{\n\t\t// Latest protocol version.\n\t\t// Single byte\n\t\t{0, 0, []byte{0x00}, pver},\n\t\t// Max single byte\n\t\t{0xfc, 0xfc, []byte{0xfc}, pver},\n\t\t// Min 2-byte\n\t\t{0xfd, 0xfd, []byte{0xfd, 0x0fd, 0x00}, pver},\n\t\t// Max 2-byte\n\t\t{0xffff, 0xffff, []byte{0xfd, 0xff, 0xff}, pver},\n\t\t// Min 4-byte\n\t\t{0x10000, 0x10000, []byte{0xfe, 0x00, 0x00, 0x01, 0x00}, pver},\n\t\t// Max 4-byte\n\t\t{0xffffffff, 0xffffffff, []byte{0xfe, 0xff, 0xff, 0xff, 0xff}, pver},\n\t\t// Min 8-byte\n\t\t{\n\t\t\t0x100000000, 0x100000000,\n\t\t\t[]byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00},\n\t\t\tpver,\n\t\t},\n\t\t// Max 8-byte\n\t\t{\n\t\t\t0xffffffffffffffff, 0xffffffffffffffff,\n\t\t\t[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},\n\t\t\tpver,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := WriteVarInt(&buf, test.pver, test.in)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"WriteVarInt #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"WriteVarInt #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\trbuf := bytes.NewReader(test.buf)\n\t\tval, err := ReadVarInt(rbuf, test.pver)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"ReadVarInt #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif val != test.out {\n\t\t\tt.Errorf(\"ReadVarInt #%d\\n got: %d want: %d\", i,\n\t\t\t\tval, test.out)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestVarIntWireErrors performs negative tests against wire encode and decode\n// of variable length integers to confirm error paths work correctly.\nfunc TestVarIntWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\n\ttests := []struct {\n\t\tin       uint64 // Value to encode\n\t\tbuf      []byte // Wire encoding\n\t\tpver     uint32 // Protocol version for wire encoding\n\t\tmax      int    // Max size of fixed buffer to induce errors\n\t\twriteErr error  // Expected write error\n\t\treadErr  error  // Expected read error\n\t}{\n\t\t// Force errors on discriminant.\n\t\t{0, []byte{0x00}, pver, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force errors on 2-byte read/write.\n\t\t{0xfd, []byte{0xfd}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},\n\t\t// Force errors on 4-byte read/write.\n\t\t{0x10000, []byte{0xfe}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},\n\t\t// Force errors on 8-byte read/write.\n\t\t{0x100000000, []byte{0xff}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := WriteVarInt(w, test.pver, test.in)\n\t\tif err != test.writeErr {\n\t\t\tt.Errorf(\"WriteVarInt #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tr := newFixedReader(test.max, test.buf)\n\t\t_, err = ReadVarInt(r, test.pver)\n\t\tif err != test.readErr {\n\t\t\tt.Errorf(\"ReadVarInt #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestVarIntNonCanonical ensures variable length integers that are not encoded\n// canonically return the expected error.\nfunc TestVarIntNonCanonical(t *testing.T) {\n\tpver := ProtocolVersion\n\n\ttests := []struct {\n\t\tname string // Test name for easier identification\n\t\tin   []byte // Value to decode\n\t\tpver uint32 // Protocol version for wire encoding\n\t}{\n\t\t{\n\t\t\t\"0 encoded with 3 bytes\", []byte{0xfd, 0x00, 0x00},\n\t\t\tpver,\n\t\t},\n\t\t{\n\t\t\t\"max single-byte value encoded with 3 bytes\",\n\t\t\t[]byte{0xfd, 0xfc, 0x00}, pver,\n\t\t},\n\t\t{\n\t\t\t\"0 encoded with 5 bytes\",\n\t\t\t[]byte{0xfe, 0x00, 0x00, 0x00, 0x00}, pver,\n\t\t},\n\t\t{\n\t\t\t\"max three-byte value encoded with 5 bytes\",\n\t\t\t[]byte{0xfe, 0xff, 0xff, 0x00, 0x00}, pver,\n\t\t},\n\t\t{\n\t\t\t\"0 encoded with 9 bytes\",\n\t\t\t[]byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},\n\t\t\tpver,\n\t\t},\n\t\t{\n\t\t\t\"max five-byte value encoded with 9 bytes\",\n\t\t\t[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00},\n\t\t\tpver,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Decode from wire format.\n\t\trbuf := bytes.NewReader(test.in)\n\t\tval, err := ReadVarInt(rbuf, test.pver)\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tt.Errorf(\"ReadVarInt #%d (%s) unexpected error %v\", i,\n\t\t\t\ttest.name, err)\n\t\t\tcontinue\n\t\t}\n\t\tif val != 0 {\n\t\t\tt.Errorf(\"ReadVarInt #%d (%s)\\n got: %d want: 0\", i,\n\t\t\t\ttest.name, val)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestVarIntWire tests the serialize size for variable length integers.\nfunc TestVarIntSerializeSize(t *testing.T) {\n\ttests := []struct {\n\t\tval  uint64 // Value to get the serialized size for\n\t\tsize int    // Expected serialized size\n\t}{\n\t\t// Single byte\n\t\t{0, 1},\n\t\t// Max single byte\n\t\t{0xfc, 1},\n\t\t// Min 2-byte\n\t\t{0xfd, 3},\n\t\t// Max 2-byte\n\t\t{0xffff, 3},\n\t\t// Min 4-byte\n\t\t{0x10000, 5},\n\t\t// Max 4-byte\n\t\t{0xffffffff, 5},\n\t\t// Min 8-byte\n\t\t{0x100000000, 9},\n\t\t// Max 8-byte\n\t\t{0xffffffffffffffff, 9},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tserializedSize := VarIntSerializeSize(test.val)\n\t\tif serializedSize != test.size {\n\t\t\tt.Errorf(\"VarIntSerializeSize #%d got: %d, want: %d\", i,\n\t\t\t\tserializedSize, test.size)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestVarStringWire tests wire encode and decode for variable length strings.\nfunc TestVarStringWire(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// str256 is a string that takes a 2-byte varint to encode.\n\tstr256 := strings.Repeat(\"test\", 64)\n\n\ttests := []struct {\n\t\tin   string // String to encode\n\t\tout  string // String to decoded value\n\t\tbuf  []byte // Wire encoding\n\t\tpver uint32 // Protocol version for wire encoding\n\t}{\n\t\t// Latest protocol version.\n\t\t// Empty string\n\t\t{\"\", \"\", []byte{0x00}, pver},\n\t\t// Single byte varint + string\n\t\t{\"Test\", \"Test\", append([]byte{0x04}, []byte(\"Test\")...), pver},\n\t\t// 2-byte varint + string\n\t\t{str256, str256, append([]byte{0xfd, 0x00, 0x01}, []byte(str256)...), pver},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := WriteVarString(&buf, test.pver, test.in)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"WriteVarString #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"WriteVarString #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\trbuf := bytes.NewReader(test.buf)\n\t\tval, err := ReadVarString(rbuf, test.pver)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"ReadVarString #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif val != test.out {\n\t\t\tt.Errorf(\"ReadVarString #%d\\n got: %s want: %s\", i,\n\t\t\t\tval, test.out)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestVarStringWireErrors performs negative tests against wire encode and\n// decode of variable length strings to confirm error paths work correctly.\nfunc TestVarStringWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// str256 is a string that takes a 2-byte varint to encode.\n\tstr256 := strings.Repeat(\"test\", 64)\n\n\ttests := []struct {\n\t\tin       string // Value to encode\n\t\tbuf      []byte // Wire encoding\n\t\tpver     uint32 // Protocol version for wire encoding\n\t\tmax      int    // Max size of fixed buffer to induce errors\n\t\twriteErr error  // Expected write error\n\t\treadErr  error  // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t// Force errors on empty string.\n\t\t{\"\", []byte{0x00}, pver, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error on single byte varint + string.\n\t\t{\"Test\", []byte{0x04}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},\n\t\t// Force errors on 2-byte varint + string.\n\t\t{str256, []byte{0xfd}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := WriteVarString(w, test.pver, test.in)\n\t\tif err != test.writeErr {\n\t\t\tt.Errorf(\"WriteVarString #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tr := newFixedReader(test.max, test.buf)\n\t\t_, err = ReadVarString(r, test.pver)\n\t\tif err != test.readErr {\n\t\t\tt.Errorf(\"ReadVarString #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestVarStringOverflowErrors performs tests to ensure deserializing variable\n// length strings intentionally crafted to use large values for the string\n// length are handled properly.  This could otherwise potentially be used as an\n// attack vector.\nfunc TestVarStringOverflowErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\n\ttests := []struct {\n\t\tbuf  []byte // Wire encoding\n\t\tpver uint32 // Protocol version for wire encoding\n\t\terr  error  // Expected error\n\t}{\n\t\t{[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},\n\t\t\tpver, &MessageError{}},\n\t\t{[]byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},\n\t\t\tpver, &MessageError{}},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Decode from wire format.\n\t\trbuf := bytes.NewReader(test.buf)\n\t\t_, err := ReadVarString(rbuf, test.pver)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"ReadVarString #%d wrong error got: %v, \"+\n\t\t\t\t\"want: %v\", i, err, reflect.TypeOf(test.err))\n\t\t\tcontinue\n\t\t}\n\t}\n\n}\n\n// TestVarBytesWire tests wire encode and decode for variable length byte array.\nfunc TestVarBytesWire(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// bytes256 is a byte array that takes a 2-byte varint to encode.\n\tbytes256 := bytes.Repeat([]byte{0x01}, 256)\n\n\ttests := []struct {\n\t\tin   []byte // Byte Array to write\n\t\tbuf  []byte // Wire encoding\n\t\tpver uint32 // Protocol version for wire encoding\n\t}{\n\t\t// Latest protocol version.\n\t\t// Empty byte array\n\t\t{[]byte{}, []byte{0x00}, pver},\n\t\t// Single byte varint + byte array\n\t\t{[]byte{0x01}, []byte{0x01, 0x01}, pver},\n\t\t// 2-byte varint + byte array\n\t\t{bytes256, append([]byte{0xfd, 0x00, 0x01}, bytes256...), pver},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := WriteVarBytes(&buf, test.pver, test.in)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"WriteVarBytes #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"WriteVarBytes #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\trbuf := bytes.NewReader(test.buf)\n\t\tval, err := ReadVarBytes(rbuf, test.pver, MaxMessagePayload,\n\t\t\t\"test payload\")\n\t\tif err != nil {\n\t\t\tt.Errorf(\"ReadVarBytes #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"ReadVarBytes #%d\\n got: %s want: %s\", i,\n\t\t\t\tval, test.buf)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestVarBytesWireErrors performs negative tests against wire encode and\n// decode of variable length byte arrays to confirm error paths work correctly.\nfunc TestVarBytesWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// bytes256 is a byte array that takes a 2-byte varint to encode.\n\tbytes256 := bytes.Repeat([]byte{0x01}, 256)\n\n\ttests := []struct {\n\t\tin       []byte // Byte Array to write\n\t\tbuf      []byte // Wire encoding\n\t\tpver     uint32 // Protocol version for wire encoding\n\t\tmax      int    // Max size of fixed buffer to induce errors\n\t\twriteErr error  // Expected write error\n\t\treadErr  error  // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t// Force errors on empty byte array.\n\t\t{[]byte{}, []byte{0x00}, pver, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error on single byte varint + byte array.\n\t\t{[]byte{0x01, 0x02, 0x03}, []byte{0x04}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},\n\t\t// Force errors on 2-byte varint + byte array.\n\t\t{bytes256, []byte{0xfd}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := WriteVarBytes(w, test.pver, test.in)\n\t\tif err != test.writeErr {\n\t\t\tt.Errorf(\"WriteVarBytes #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tr := newFixedReader(test.max, test.buf)\n\t\t_, err = ReadVarBytes(r, test.pver, MaxMessagePayload,\n\t\t\t\"test payload\")\n\t\tif err != test.readErr {\n\t\t\tt.Errorf(\"ReadVarBytes #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestVarBytesOverflowErrors performs tests to ensure deserializing variable\n// length byte arrays intentionally crafted to use large values for the array\n// length are handled properly.  This could otherwise potentially be used as an\n// attack vector.\nfunc TestVarBytesOverflowErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\n\ttests := []struct {\n\t\tbuf  []byte // Wire encoding\n\t\tpver uint32 // Protocol version for wire encoding\n\t\terr  error  // Expected error\n\t}{\n\t\t{[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},\n\t\t\tpver, &MessageError{}},\n\t\t{[]byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},\n\t\t\tpver, &MessageError{}},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Decode from wire format.\n\t\trbuf := bytes.NewReader(test.buf)\n\t\t_, err := ReadVarBytes(rbuf, test.pver, MaxMessagePayload,\n\t\t\t\"test payload\")\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"ReadVarBytes #%d wrong error got: %v, \"+\n\t\t\t\t\"want: %v\", i, err, reflect.TypeOf(test.err))\n\t\t\tcontinue\n\t\t}\n\t}\n\n}\n\n// TestRandomUint64 exercises the randomness of the random number generator on\n// the system by ensuring the probability of the generated numbers.  If the RNG\n// is evenly distributed as a proper cryptographic RNG should be, there really\n// should only be 1 number < 2^56 in 2^8 tries for a 64-bit number.  However,\n// use a higher number of 5 to really ensure the test doesn't fail unless the\n// RNG is just horrendous.\nfunc TestRandomUint64(t *testing.T) {\n\ttries := 1 << 8              // 2^8\n\twatermark := uint64(1 << 56) // 2^56\n\tmaxHits := 5\n\tbadRNG := \"The random number generator on this system is clearly \" +\n\t\t\"terrible since we got %d values less than %d in %d runs \" +\n\t\t\"when only %d was expected\"\n\n\tnumHits := 0\n\tfor i := 0; i < tries; i++ {\n\t\tnonce, err := RandomUint64()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"RandomUint64 iteration %d failed - err %v\",\n\t\t\t\ti, err)\n\t\t\treturn\n\t\t}\n\t\tif nonce < watermark {\n\t\t\tnumHits++\n\t\t}\n\t\tif numHits > maxHits {\n\t\t\tstr := fmt.Sprintf(badRNG, numHits, watermark, tries, maxHits)\n\t\t\tt.Errorf(\"Random Uint64 iteration %d failed - %v %v\", i,\n\t\t\t\tstr, numHits)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// TestRandomUint64Errors uses a fake reader to force error paths to be executed\n// and checks the results accordingly.\nfunc TestRandomUint64Errors(t *testing.T) {\n\t// Test short reads.\n\tfr := &fakeRandReader{n: 2, err: io.EOF}\n\tnonce, err := randomUint64(fr)\n\tif err != io.ErrUnexpectedEOF {\n\t\tt.Errorf(\"Error not expected value of %v [%v]\",\n\t\t\tio.ErrUnexpectedEOF, err)\n\t}\n\tif nonce != 0 {\n\t\tt.Errorf(\"Nonce is not 0 [%v]\", nonce)\n\t}\n}\n"
  },
  {
    "path": "wire/doc.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage wire implements the bitcoin wire protocol.\n\nFor the complete details of the bitcoin protocol, see the official wiki entry\nat https://en.bitcoin.it/wiki/Protocol_specification.  The following only serves\nas a quick overview to provide information on how to use the package.\n\nAt a high level, this package provides support for marshalling and unmarshalling\nsupported bitcoin messages to and from the wire.  This package does not deal\nwith the specifics of message handling such as what to do when a message is\nreceived.  This provides the caller with a high level of flexibility.\n\n# Bitcoin Message Overview\n\nThe bitcoin protocol consists of exchanging messages between peers.  Each\nmessage is preceded by a header which identifies information about it such as\nwhich bitcoin network it is a part of, its type, how big it is, and a checksum\nto verify validity.  All encoding and decoding of message headers is handled by\nthis package.\n\nTo accomplish this, there is a generic interface for bitcoin messages named\nMessage which allows messages of any type to be read, written, or passed around\nthrough channels, functions, etc.  In addition, concrete implementations of most\nof the currently supported bitcoin messages are provided.  For these supported\nmessages, all of the details of marshalling and unmarshalling to and from the\nwire using bitcoin encoding are handled so the caller doesn't have to concern\nthemselves with the specifics.\n\n# Message Interaction\n\nThe following provides a quick summary of how the bitcoin messages are intended\nto interact with one another.  As stated above, these interactions are not\ndirectly handled by this package.  For more in-depth details about the\nappropriate interactions, see the official bitcoin protocol wiki entry at\nhttps://en.bitcoin.it/wiki/Protocol_specification.\n\nThe initial handshake consists of two peers sending each other a version message\n(MsgVersion) followed by responding with a verack message (MsgVerAck).  Both\npeers use the information in the version message (MsgVersion) to negotiate\nthings such as protocol version and supported services with each other.  Once\nthe initial handshake is complete, the following chart indicates message\ninteractions in no particular order.\n\n\tPeer A Sends                          Peer B Responds\n\t----------------------------------------------------------------------------\n\tgetaddr message (MsgGetAddr)          addr message (MsgAddr)\n\tgetblocks message (MsgGetBlocks)      inv message (MsgInv)\n\tinv message (MsgInv)                  getdata message (MsgGetData)\n\tgetdata message (MsgGetData)          block message (MsgBlock) -or-\n\t                                      tx message (MsgTx) -or-\n\t                                      notfound message (MsgNotFound)\n\tgetheaders message (MsgGetHeaders)    headers message (MsgHeaders)\n\tping message (MsgPing)                pong message (MsgHeaders)* -or-\n\t                                      (none -- Ability to send message is enough)\n\n\tNOTES:\n\t* The pong message was not added until later protocol versions as defined\n\t  in BIP0031.  The BIP0031Version constant can be used to detect a recent\n\t  enough protocol version for this purpose (version > BIP0031Version).\n\n# Common Parameters\n\nThere are several common parameters that arise when using this package to read\nand write bitcoin messages.  The following sections provide a quick overview of\nthese parameters so the next sections can build on them.\n\n# Protocol Version\n\nThe protocol version should be negotiated with the remote peer at a higher\nlevel than this package via the version (MsgVersion) message exchange, however,\nthis package provides the wire.ProtocolVersion constant which indicates the\nlatest protocol version this package supports and is typically the value to use\nfor all outbound connections before a potentially lower protocol version is\nnegotiated.\n\n# Bitcoin Network\n\nThe bitcoin network is a magic number which is used to identify the start of a\nmessage and which bitcoin network the message applies to.  This package provides\nthe following constants:\n\n\twire.MainNet\n\twire.TestNet  (Regression test network)\n\twire.TestNet3 (Test network version 3)\n\twire.SigNet   (Signet, default)\n\twire.SimNet   (Simulation test network)\n\n# Determining Message Type\n\nAs discussed in the bitcoin message overview section, this package reads\nand writes bitcoin messages using a generic interface named Message.  In\norder to determine the actual concrete type of the message, use a type\nswitch or type assertion.  An example of a type switch follows:\n\n\t// Assumes msg is already a valid concrete message such as one created\n\t// via NewMsgVersion or read via ReadMessage.\n\tswitch msg := msg.(type) {\n\tcase *wire.MsgVersion:\n\t\t// The message is a pointer to a MsgVersion struct.\n\t\tfmt.Printf(\"Protocol version: %v\", msg.ProtocolVersion)\n\tcase *wire.MsgBlock:\n\t\t// The message is a pointer to a MsgBlock struct.\n\t\tfmt.Printf(\"Number of tx in block: %v\", msg.Header.TxnCount)\n\t}\n\n# Reading Messages\n\nIn order to unmarshall bitcoin messages from the wire, use the ReadMessage\nfunction.  It accepts any io.Reader, but typically this will be a net.Conn to\na remote node running a bitcoin peer.  Example syntax is:\n\n\t// Reads and validates the next bitcoin message from conn using the\n\t// protocol version pver and the bitcoin network btcnet.  The returns\n\t// are a wire.Message, a []byte which contains the unmarshalled\n\t// raw payload, and a possible error.\n\tmsg, rawPayload, err := wire.ReadMessage(conn, pver, btcnet)\n\tif err != nil {\n\t\t// Log and handle the error\n\t}\n\n# Writing Messages\n\nIn order to marshall bitcoin messages to the wire, use the WriteMessage\nfunction.  It accepts any io.Writer, but typically this will be a net.Conn to\na remote node running a bitcoin peer.  Example syntax to request addresses\nfrom a remote peer is:\n\n\t// Create a new getaddr bitcoin message.\n\tmsg := wire.NewMsgGetAddr()\n\n\t// Writes a bitcoin message msg to conn using the protocol version\n\t// pver, and the bitcoin network btcnet.  The return is a possible\n\t// error.\n\terr := wire.WriteMessage(conn, msg, pver, btcnet)\n\tif err != nil {\n\t\t// Log and handle the error\n\t}\n\n# Errors\n\nErrors returned by this package are either the raw errors provided by underlying\ncalls to read/write from streams such as io.EOF, io.ErrUnexpectedEOF, and\nio.ErrShortWrite, or of type wire.MessageError.  This allows the caller to\ndifferentiate between general IO errors and malformed messages through type\nassertions.\n\n# Bitcoin Improvement Proposals\n\nThis package includes spec changes outlined by the following BIPs:\n\n\tBIP0014 (https://github.com/bitcoin/bips/blob/master/bip-0014.mediawiki)\n\tBIP0031 (https://github.com/bitcoin/bips/blob/master/bip-0031.mediawiki)\n\tBIP0035 (https://github.com/bitcoin/bips/blob/master/bip-0035.mediawiki)\n\tBIP0037 (https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki)\n\tBIP0111\t(https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki)\n\tBIP0130 (https://github.com/bitcoin/bips/blob/master/bip-0130.mediawiki)\n\tBIP0133 (https://github.com/bitcoin/bips/blob/master/bip-0133.mediawiki)\n*/\npackage wire\n"
  },
  {
    "path": "wire/error.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n)\n\n// MessageError describes an issue with a message.\n// An example of some potential issues are messages from the wrong bitcoin\n// network, invalid commands, mismatched checksums, and exceeding max payloads.\n//\n// This provides a mechanism for the caller to type assert the error to\n// differentiate between general io errors such as io.EOF and issues that\n// resulted from malformed messages.\ntype MessageError struct {\n\tFunc        string // Function name\n\tDescription string // Human readable description of the issue\n}\n\n// Error satisfies the error interface and prints human-readable errors.\nfunc (e *MessageError) Error() string {\n\tif e.Func != \"\" {\n\t\treturn fmt.Sprintf(\"%v: %v\", e.Func, e.Description)\n\t}\n\treturn e.Description\n}\n\n// messageError creates an error for the given function and description.\nfunc messageError(f string, desc string) *MessageError {\n\treturn &MessageError{Func: f, Description: desc}\n}\n"
  },
  {
    "path": "wire/fakemessage_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport \"io\"\n\n// fakeMessage implements the Message interface and is used to force encode\n// errors in messages.\ntype fakeMessage struct {\n\tcommand        string\n\tpayload        []byte\n\tforceEncodeErr bool\n\tforceLenErr    bool\n}\n\n// BtcDecode doesn't do anything.  It just satisfies the wire.Message\n// interface.\nfunc (msg *fakeMessage) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\treturn nil\n}\n\n// BtcEncode writes the payload field of the fake message or forces an error\n// if the forceEncodeErr flag of the fake message is set.  It also satisfies the\n// wire.Message interface.\nfunc (msg *fakeMessage) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tif msg.forceEncodeErr {\n\t\terr := &MessageError{\n\t\t\tFunc:        \"fakeMessage.BtcEncode\",\n\t\t\tDescription: \"intentional error\",\n\t\t}\n\t\treturn err\n\t}\n\n\t_, err := w.Write(msg.payload)\n\treturn err\n}\n\n// Command returns the command field of the fake message and satisfies the\n// Message interface.\nfunc (msg *fakeMessage) Command() string {\n\treturn msg.command\n}\n\n// MaxPayloadLength returns the length of the payload field of fake message\n// or a smaller value if the forceLenErr flag of the fake message is set.  It\n// satisfies the Message interface.\nfunc (msg *fakeMessage) MaxPayloadLength(pver uint32) uint32 {\n\tlenp := uint32(len(msg.payload))\n\tif msg.forceLenErr {\n\t\treturn lenp - 1\n\t}\n\n\treturn lenp\n}\n"
  },
  {
    "path": "wire/fixedIO_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n)\n\n// fixedWriter implements the io.Writer interface and intentionally allows\n// testing of error paths by forcing short writes.\ntype fixedWriter struct {\n\tb   []byte\n\tpos int\n}\n\n// Write writes the contents of p to w.  When the contents of p would cause\n// the writer to exceed the maximum allowed size of the fixed writer,\n// io.ErrShortWrite is returned and the writer is left unchanged.\n//\n// This satisfies the io.Writer interface.\nfunc (w *fixedWriter) Write(p []byte) (n int, err error) {\n\tlenp := len(p)\n\tif w.pos+lenp > cap(w.b) {\n\t\treturn 0, io.ErrShortWrite\n\t}\n\tn = lenp\n\tw.pos += copy(w.b[w.pos:], p)\n\treturn\n}\n\n// Bytes returns the bytes already written to the fixed writer.\nfunc (w *fixedWriter) Bytes() []byte {\n\treturn w.b\n}\n\n// newFixedWriter returns a new io.Writer that will error once more bytes than\n// the specified max have been written.\nfunc newFixedWriter(max int) io.Writer {\n\tb := make([]byte, max)\n\tfw := fixedWriter{b, 0}\n\treturn &fw\n}\n\n// fixedReader implements the io.Reader interface and intentionally allows\n// testing of error paths by forcing short reads.\ntype fixedReader struct {\n\tbuf   []byte\n\tpos   int\n\tiobuf *bytes.Buffer\n}\n\n// Read reads the next len(p) bytes from the fixed reader.  When the number of\n// bytes read would exceed the maximum number of allowed bytes to be read from\n// the fixed writer, an error is returned.\n//\n// This satisfies the io.Reader interface.\nfunc (fr *fixedReader) Read(p []byte) (n int, err error) {\n\tn, err = fr.iobuf.Read(p)\n\tfr.pos += n\n\treturn\n}\n\n// newFixedReader returns a new io.Reader that will error once more bytes than\n// the specified max have been read.\nfunc newFixedReader(max int, buf []byte) io.Reader {\n\tb := make([]byte, max)\n\tif buf != nil {\n\t\tcopy(b, buf)\n\t}\n\n\tiobuf := bytes.NewBuffer(b)\n\tfr := fixedReader{b, 0, iobuf}\n\treturn &fr\n}\n"
  },
  {
    "path": "wire/invvect.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nconst (\n\t// MaxInvPerMsg is the maximum number of inventory vectors that can be in a\n\t// single bitcoin inv message.\n\tMaxInvPerMsg = 50000\n\n\t// Maximum payload size for an inventory vector.\n\tmaxInvVectPayload = 4 + chainhash.HashSize\n\n\t// InvWitnessFlag denotes that the inventory vector type is requesting,\n\t// or sending a version which includes witness data.\n\tInvWitnessFlag = 1 << 30\n)\n\n// InvType represents the allowed types of inventory vectors.  See InvVect.\ntype InvType uint32\n\n// These constants define the various supported inventory vector types.\nconst (\n\tInvTypeError                InvType = 0\n\tInvTypeTx                   InvType = 1\n\tInvTypeBlock                InvType = 2\n\tInvTypeFilteredBlock        InvType = 3\n\tInvTypeWitnessBlock         InvType = InvTypeBlock | InvWitnessFlag\n\tInvTypeWitnessTx            InvType = InvTypeTx | InvWitnessFlag\n\tInvTypeFilteredWitnessBlock InvType = InvTypeFilteredBlock | InvWitnessFlag\n)\n\n// Map of service flags back to their constant names for pretty printing.\nvar ivStrings = map[InvType]string{\n\tInvTypeError:                \"ERROR\",\n\tInvTypeTx:                   \"MSG_TX\",\n\tInvTypeBlock:                \"MSG_BLOCK\",\n\tInvTypeFilteredBlock:        \"MSG_FILTERED_BLOCK\",\n\tInvTypeWitnessBlock:         \"MSG_WITNESS_BLOCK\",\n\tInvTypeWitnessTx:            \"MSG_WITNESS_TX\",\n\tInvTypeFilteredWitnessBlock: \"MSG_FILTERED_WITNESS_BLOCK\",\n}\n\n// String returns the InvType in human-readable form.\nfunc (invtype InvType) String() string {\n\tif s, ok := ivStrings[invtype]; ok {\n\t\treturn s\n\t}\n\n\treturn fmt.Sprintf(\"Unknown InvType (%d)\", uint32(invtype))\n}\n\n// InvVect defines a bitcoin inventory vector which is used to describe data,\n// as specified by the Type field, that a peer wants, has, or does not have to\n// another peer.\ntype InvVect struct {\n\tType InvType        // Type of data\n\tHash chainhash.Hash // Hash of the data\n}\n\n// NewInvVect returns a new InvVect using the provided type and hash.\nfunc NewInvVect(typ InvType, hash *chainhash.Hash) *InvVect {\n\treturn &InvVect{\n\t\tType: typ,\n\t\tHash: *hash,\n\t}\n}\n\n// readInvVectBuf reads an encoded InvVect from r depending on the protocol\n// version.\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc readInvVectBuf(r io.Reader, pver uint32, iv *InvVect, buf []byte) error {\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tiv.Type = InvType(littleEndian.Uint32(buf[:4]))\n\n\t_, err := io.ReadFull(r, iv.Hash[:])\n\treturn err\n}\n\n// writeInvVectBuf serializes an InvVect to w depending on the protocol version.\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc writeInvVectBuf(w io.Writer, pver uint32, iv *InvVect, buf []byte) error {\n\tlittleEndian.PutUint32(buf[:4], uint32(iv.Type))\n\tif _, err := w.Write(buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := w.Write(iv.Hash[:])\n\treturn err\n}\n"
  },
  {
    "path": "wire/invvect_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestInvVectStringer tests the stringized output for inventory vector types.\nfunc TestInvTypeStringer(t *testing.T) {\n\ttests := []struct {\n\t\tin   InvType\n\t\twant string\n\t}{\n\t\t{InvTypeError, \"ERROR\"},\n\t\t{InvTypeTx, \"MSG_TX\"},\n\t\t{InvTypeBlock, \"MSG_BLOCK\"},\n\t\t{0xffffffff, \"Unknown InvType (4294967295)\"},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.String()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"String #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n\n}\n\n// TestInvVect tests the InvVect API.\nfunc TestInvVect(t *testing.T) {\n\tivType := InvTypeBlock\n\thash := chainhash.Hash{}\n\n\t// Ensure we get the same payload and signature back out.\n\tiv := NewInvVect(ivType, &hash)\n\tif iv.Type != ivType {\n\t\tt.Errorf(\"NewInvVect: wrong type - got %v, want %v\",\n\t\t\tiv.Type, ivType)\n\t}\n\tif !iv.Hash.IsEqual(&hash) {\n\t\tt.Errorf(\"NewInvVect: wrong hash - got %v, want %v\",\n\t\t\tspew.Sdump(iv.Hash), spew.Sdump(hash))\n\t}\n\n}\n\n// TestInvVectWire tests the InvVect wire encode and decode for various\n// protocol versions and supported inventory vector types.\nfunc TestInvVectWire(t *testing.T) {\n\t// Block 203707 hash.\n\thashStr := \"3264bc2ac36a60840790ba1d475d01367e7c723da941069e9dc\"\n\tbaseHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// errInvVect is an inventory vector with an error.\n\terrInvVect := InvVect{\n\t\tType: InvTypeError,\n\t\tHash: chainhash.Hash{},\n\t}\n\n\t// errInvVectEncoded is the wire encoded bytes of errInvVect.\n\terrInvVectEncoded := []byte{\n\t\t0x00, 0x00, 0x00, 0x00, // InvTypeError\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // No hash\n\t}\n\n\t// txInvVect is an inventory vector representing a transaction.\n\ttxInvVect := InvVect{\n\t\tType: InvTypeTx,\n\t\tHash: *baseHash,\n\t}\n\n\t// txInvVectEncoded is the wire encoded bytes of txInvVect.\n\ttxInvVectEncoded := []byte{\n\t\t0x01, 0x00, 0x00, 0x00, // InvTypeTx\n\t\t0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7,\n\t\t0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b,\n\t\t0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b,\n\t\t0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 203707 hash\n\t}\n\n\t// blockInvVect is an inventory vector representing a block.\n\tblockInvVect := InvVect{\n\t\tType: InvTypeBlock,\n\t\tHash: *baseHash,\n\t}\n\n\t// blockInvVectEncoded is the wire encoded bytes of blockInvVect.\n\tblockInvVectEncoded := []byte{\n\t\t0x02, 0x00, 0x00, 0x00, // InvTypeBlock\n\t\t0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7,\n\t\t0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b,\n\t\t0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b,\n\t\t0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 203707 hash\n\t}\n\n\ttests := []struct {\n\t\tin   InvVect // NetAddress to encode\n\t\tout  InvVect // Expected decoded NetAddress\n\t\tbuf  []byte  // Wire encoding\n\t\tpver uint32  // Protocol version for wire encoding\n\t}{\n\t\t// Latest protocol version error inventory vector.\n\t\t{\n\t\t\terrInvVect,\n\t\t\terrInvVect,\n\t\t\terrInvVectEncoded,\n\t\t\tProtocolVersion,\n\t\t},\n\n\t\t// Latest protocol version tx inventory vector.\n\t\t{\n\t\t\ttxInvVect,\n\t\t\ttxInvVect,\n\t\t\ttxInvVectEncoded,\n\t\t\tProtocolVersion,\n\t\t},\n\n\t\t// Latest protocol version block inventory vector.\n\t\t{\n\t\t\tblockInvVect,\n\t\t\tblockInvVect,\n\t\t\tblockInvVectEncoded,\n\t\t\tProtocolVersion,\n\t\t},\n\n\t\t// Protocol version BIP0035Version error inventory vector.\n\t\t{\n\t\t\terrInvVect,\n\t\t\terrInvVect,\n\t\t\terrInvVectEncoded,\n\t\t\tBIP0035Version,\n\t\t},\n\n\t\t// Protocol version BIP0035Version tx inventory vector.\n\t\t{\n\t\t\ttxInvVect,\n\t\t\ttxInvVect,\n\t\t\ttxInvVectEncoded,\n\t\t\tBIP0035Version,\n\t\t},\n\n\t\t// Protocol version BIP0035Version block inventory vector.\n\t\t{\n\t\t\tblockInvVect,\n\t\t\tblockInvVect,\n\t\t\tblockInvVectEncoded,\n\t\t\tBIP0035Version,\n\t\t},\n\n\t\t// Protocol version BIP0031Version error inventory vector.\n\t\t{\n\t\t\terrInvVect,\n\t\t\terrInvVect,\n\t\t\terrInvVectEncoded,\n\t\t\tBIP0031Version,\n\t\t},\n\n\t\t// Protocol version BIP0031Version tx inventory vector.\n\t\t{\n\t\t\ttxInvVect,\n\t\t\ttxInvVect,\n\t\t\ttxInvVectEncoded,\n\t\t\tBIP0031Version,\n\t\t},\n\n\t\t// Protocol version BIP0031Version block inventory vector.\n\t\t{\n\t\t\tblockInvVect,\n\t\t\tblockInvVect,\n\t\t\tblockInvVectEncoded,\n\t\t\tBIP0031Version,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion error inventory vector.\n\t\t{\n\t\t\terrInvVect,\n\t\t\terrInvVect,\n\t\t\terrInvVectEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion tx inventory vector.\n\t\t{\n\t\t\ttxInvVect,\n\t\t\ttxInvVect,\n\t\t\ttxInvVectEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion block inventory vector.\n\t\t{\n\t\t\tblockInvVect,\n\t\t\tblockInvVect,\n\t\t\tblockInvVectEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion error inventory vector.\n\t\t{\n\t\t\terrInvVect,\n\t\t\terrInvVect,\n\t\t\terrInvVectEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion tx inventory vector.\n\t\t{\n\t\t\ttxInvVect,\n\t\t\ttxInvVect,\n\t\t\ttxInvVectEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion block inventory vector.\n\t\t{\n\t\t\tblockInvVect,\n\t\t\tblockInvVect,\n\t\t\tblockInvVectEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tvar b [8]byte\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := writeInvVectBuf(&buf, test.pver, &test.in, b[:])\n\t\tif err != nil {\n\t\t\tt.Errorf(\"writeInvVect #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"writeInvVect #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar iv InvVect\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = readInvVectBuf(rbuf, test.pver, &iv, b[:])\n\t\tif err != nil {\n\t\t\tt.Errorf(\"readInvVect #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(iv, test.out) {\n\t\t\tt.Errorf(\"readInvVect #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(iv), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/message.go",
    "content": "// Copyright (c) 2013-2024 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"unicode/utf8\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// MessageHeaderSize is the number of bytes in a bitcoin message header.\n// Bitcoin network (magic) 4 bytes + command 12 bytes + payload length 4 bytes +\n// checksum 4 bytes.\nconst MessageHeaderSize = 24\n\n// CommandSize is the fixed size of all commands in the common bitcoin message\n// header.  Shorter commands must be zero padded.\nconst CommandSize = 12\n\n// MaxMessagePayload is the maximum bytes a message can be regardless of other\n// individual limits imposed by messages themselves.\nconst MaxMessagePayload = (1024 * 1024 * 4) // 4MB\n\n// Commands used in bitcoin message headers which describe the type of message.\nconst (\n\tCmdVersion      = \"version\"\n\tCmdVerAck       = \"verack\"\n\tCmdGetAddr      = \"getaddr\"\n\tCmdAddr         = \"addr\"\n\tCmdAddrV2       = \"addrv2\"\n\tCmdGetBlocks    = \"getblocks\"\n\tCmdInv          = \"inv\"\n\tCmdGetData      = \"getdata\"\n\tCmdNotFound     = \"notfound\"\n\tCmdBlock        = \"block\"\n\tCmdTx           = \"tx\"\n\tCmdGetHeaders   = \"getheaders\"\n\tCmdHeaders      = \"headers\"\n\tCmdPing         = \"ping\"\n\tCmdPong         = \"pong\"\n\tCmdMemPool      = \"mempool\"\n\tCmdFilterAdd    = \"filteradd\"\n\tCmdFilterClear  = \"filterclear\"\n\tCmdFilterLoad   = \"filterload\"\n\tCmdMerkleBlock  = \"merkleblock\"\n\tCmdReject       = \"reject\"\n\tCmdSendHeaders  = \"sendheaders\"\n\tCmdFeeFilter    = \"feefilter\"\n\tCmdGetCFilters  = \"getcfilters\"\n\tCmdGetCFHeaders = \"getcfheaders\"\n\tCmdGetCFCheckpt = \"getcfcheckpt\"\n\tCmdCFilter      = \"cfilter\"\n\tCmdCFHeaders    = \"cfheaders\"\n\tCmdCFCheckpt    = \"cfcheckpt\"\n\tCmdSendAddrV2   = \"sendaddrv2\"\n\tCmdWTxIdRelay   = \"wtxidrelay\"\n)\n\nvar (\n\tv2MessageIDs = map[uint8]string{\n\t\t1:  CmdAddr,\n\t\t2:  CmdBlock,\n\t\t5:  CmdFeeFilter,\n\t\t6:  CmdFilterAdd,\n\t\t7:  CmdFilterClear,\n\t\t8:  CmdFilterLoad,\n\t\t9:  CmdGetBlocks,\n\t\t11: CmdGetData,\n\t\t12: CmdGetHeaders,\n\t\t13: CmdHeaders,\n\t\t14: CmdInv,\n\t\t15: CmdMemPool,\n\t\t16: CmdMerkleBlock,\n\t\t17: CmdNotFound,\n\t\t18: CmdPing,\n\t\t19: CmdPong,\n\t\t21: CmdTx,\n\t\t22: CmdGetCFilters,\n\t\t23: CmdCFilter,\n\t\t24: CmdGetCFHeaders,\n\t\t25: CmdCFHeaders,\n\t\t26: CmdGetCFCheckpt,\n\t\t27: CmdCFCheckpt,\n\t\t28: CmdAddrV2,\n\t}\n\n\tv2Messages = map[string]uint8{\n\t\tCmdAddr:         1,\n\t\tCmdBlock:        2,\n\t\tCmdFeeFilter:    5,\n\t\tCmdFilterAdd:    6,\n\t\tCmdFilterClear:  7,\n\t\tCmdFilterLoad:   8,\n\t\tCmdGetBlocks:    9,\n\t\tCmdGetData:      11,\n\t\tCmdGetHeaders:   12,\n\t\tCmdHeaders:      13,\n\t\tCmdInv:          14,\n\t\tCmdMemPool:      15,\n\t\tCmdMerkleBlock:  16,\n\t\tCmdNotFound:     17,\n\t\tCmdPing:         18,\n\t\tCmdPong:         19,\n\t\tCmdTx:           21,\n\t\tCmdGetCFilters:  22,\n\t\tCmdCFilter:      23,\n\t\tCmdGetCFHeaders: 24,\n\t\tCmdCFHeaders:    25,\n\t\tCmdGetCFCheckpt: 26,\n\t\tCmdCFCheckpt:    27,\n\t\tCmdAddrV2:       28,\n\t}\n)\n\n// MessageEncoding represents the wire message encoding format to be used.\ntype MessageEncoding uint32\n\nconst (\n\t// BaseEncoding encodes all messages in the default format specified\n\t// for the Bitcoin wire protocol.\n\tBaseEncoding MessageEncoding = 1 << iota\n\n\t// WitnessEncoding encodes all messages other than transaction messages\n\t// using the default Bitcoin wire protocol specification. For transaction\n\t// messages, the new encoding format detailed in BIP0144 will be used.\n\tWitnessEncoding\n)\n\n// LatestEncoding is the most recently specified encoding for the Bitcoin wire\n// protocol.\nvar LatestEncoding = WitnessEncoding\n\n// ErrUnknownMessage is the error returned when decoding an unknown message.\nvar ErrUnknownMessage = fmt.Errorf(\"received unknown message\")\n\n// ErrInvalidHandshake is the error returned when a peer sends us a known\n// message that does not belong in the version-verack handshake.\nvar ErrInvalidHandshake = fmt.Errorf(\"invalid message during handshake\")\n\n// Message is an interface that describes a bitcoin message.  A type that\n// implements Message has complete control over the representation of its data\n// and may therefore contain additional or fewer fields than those which\n// are used directly in the protocol encoded message.\ntype Message interface {\n\tBtcDecode(io.Reader, uint32, MessageEncoding) error\n\tBtcEncode(io.Writer, uint32, MessageEncoding) error\n\tCommand() string\n\tMaxPayloadLength(uint32) uint32\n}\n\n// makeEmptyMessage creates a message of the appropriate concrete type based\n// on the command.\nfunc makeEmptyMessage(command string) (Message, error) {\n\tvar msg Message\n\tswitch command {\n\tcase CmdVersion:\n\t\tmsg = &MsgVersion{}\n\n\tcase CmdVerAck:\n\t\tmsg = &MsgVerAck{}\n\n\tcase CmdSendAddrV2:\n\t\tmsg = &MsgSendAddrV2{}\n\n\tcase CmdGetAddr:\n\t\tmsg = &MsgGetAddr{}\n\n\tcase CmdAddr:\n\t\tmsg = &MsgAddr{}\n\n\tcase CmdAddrV2:\n\t\tmsg = &MsgAddrV2{}\n\n\tcase CmdGetBlocks:\n\t\tmsg = &MsgGetBlocks{}\n\n\tcase CmdBlock:\n\t\tmsg = &MsgBlock{}\n\n\tcase CmdInv:\n\t\tmsg = &MsgInv{}\n\n\tcase CmdGetData:\n\t\tmsg = &MsgGetData{}\n\n\tcase CmdNotFound:\n\t\tmsg = &MsgNotFound{}\n\n\tcase CmdTx:\n\t\tmsg = &MsgTx{}\n\n\tcase CmdPing:\n\t\tmsg = &MsgPing{}\n\n\tcase CmdPong:\n\t\tmsg = &MsgPong{}\n\n\tcase CmdGetHeaders:\n\t\tmsg = &MsgGetHeaders{}\n\n\tcase CmdHeaders:\n\t\tmsg = &MsgHeaders{}\n\n\tcase CmdMemPool:\n\t\tmsg = &MsgMemPool{}\n\n\tcase CmdFilterAdd:\n\t\tmsg = &MsgFilterAdd{}\n\n\tcase CmdFilterClear:\n\t\tmsg = &MsgFilterClear{}\n\n\tcase CmdFilterLoad:\n\t\tmsg = &MsgFilterLoad{}\n\n\tcase CmdMerkleBlock:\n\t\tmsg = &MsgMerkleBlock{}\n\n\tcase CmdReject:\n\t\tmsg = &MsgReject{}\n\n\tcase CmdSendHeaders:\n\t\tmsg = &MsgSendHeaders{}\n\n\tcase CmdFeeFilter:\n\t\tmsg = &MsgFeeFilter{}\n\n\tcase CmdGetCFilters:\n\t\tmsg = &MsgGetCFilters{}\n\n\tcase CmdGetCFHeaders:\n\t\tmsg = &MsgGetCFHeaders{}\n\n\tcase CmdGetCFCheckpt:\n\t\tmsg = &MsgGetCFCheckpt{}\n\n\tcase CmdCFilter:\n\t\tmsg = &MsgCFilter{}\n\n\tcase CmdCFHeaders:\n\t\tmsg = &MsgCFHeaders{}\n\n\tcase CmdCFCheckpt:\n\t\tmsg = &MsgCFCheckpt{}\n\n\tdefault:\n\t\treturn nil, ErrUnknownMessage\n\t}\n\treturn msg, nil\n}\n\n// messageHeader defines the header structure for all bitcoin protocol messages.\ntype messageHeader struct {\n\tmagic    BitcoinNet // 4 bytes\n\tcommand  string     // 12 bytes\n\tlength   uint32     // 4 bytes\n\tchecksum [4]byte    // 4 bytes\n}\n\n// readMessageHeader reads a bitcoin message header from r.\nfunc readMessageHeader(r io.Reader) (int, *messageHeader, error) {\n\t// Since readElements doesn't return the amount of bytes read, attempt\n\t// to read the entire header into a buffer first in case there is a\n\t// short read so the proper amount of read bytes are known.  This works\n\t// since the header is a fixed size.\n\tvar headerBytes [MessageHeaderSize]byte\n\tn, err := io.ReadFull(r, headerBytes[:])\n\tif err != nil {\n\t\treturn n, nil, err\n\t}\n\thr := bytes.NewReader(headerBytes[:])\n\n\t// Create and populate a messageHeader struct from the raw header bytes.\n\thdr := messageHeader{}\n\tvar command [CommandSize]byte\n\treadElements(hr, &hdr.magic, &command, &hdr.length, &hdr.checksum)\n\n\t// Strip trailing zeros from command string.\n\thdr.command = string(bytes.TrimRight(command[:], \"\\x00\"))\n\n\treturn n, &hdr, nil\n}\n\n// readPartialHeader reads a partial bitcon message header from r. It takes a\n// prefix that contains the already-parsed bytes. This is needed in the case of\n// a downgraded v2->v1 transport connection since we have already started\n// parsing the header bytes when calling into this function.\nfunc readPartialHeader(prefix []byte, r io.Reader) (int, *messageHeader,\n\terror) {\n\n\t// Fill out the messageHeader with the network magic from the prefix.\n\thdr := messageHeader{}\n\n\tvar command [CommandSize]byte\n\tprefixReader := bytes.NewReader(prefix[:])\n\tif err := readElements(prefixReader, &hdr.magic, &command); err != nil {\n\t\treturn 0, nil, err\n\t}\n\n\t// Strip trailing zeros from command string.\n\thdr.command = string(bytes.TrimRight(command[:], \"\\x00\"))\n\n\t// Read the rest of the message header from the passed-in reader.\n\tif err := readElements(r, &hdr.length, &hdr.checksum); err != nil {\n\t\treturn 0, nil, err\n\t}\n\n\treturn MessageHeaderSize, &hdr, nil\n}\n\n// discardInput reads n bytes from reader r in chunks and discards the read\n// bytes.  This is used to skip payloads when various errors occur and helps\n// prevent rogue nodes from causing massive memory allocation through forging\n// header length.\nfunc discardInput(r io.Reader, n uint32) {\n\tmaxSize := uint32(10 * 1024) // 10k at a time\n\tnumReads := n / maxSize\n\tbytesRemaining := n % maxSize\n\tif n > 0 {\n\t\tbuf := make([]byte, maxSize)\n\t\tfor i := uint32(0); i < numReads; i++ {\n\t\t\tio.ReadFull(r, buf)\n\t\t}\n\t}\n\tif bytesRemaining > 0 {\n\t\tbuf := make([]byte, bytesRemaining)\n\t\tio.ReadFull(r, buf)\n\t}\n}\n\n// WriteMessageN writes a bitcoin Message to w including the necessary header\n// information and returns the number of bytes written.    This function is the\n// same as WriteMessage except it also returns the number of bytes written.\nfunc WriteMessageN(w io.Writer, msg Message, pver uint32, btcnet BitcoinNet) (int, error) {\n\treturn WriteMessageWithEncodingN(w, msg, pver, btcnet, BaseEncoding)\n}\n\n// WriteMessage writes a bitcoin Message to w including the necessary header\n// information.  This function is the same as WriteMessageN except it doesn't\n// doesn't return the number of bytes written.  This function is mainly provided\n// for backwards compatibility with the original API, but it's also useful for\n// callers that don't care about byte counts.\nfunc WriteMessage(w io.Writer, msg Message, pver uint32, btcnet BitcoinNet) error {\n\t_, err := WriteMessageN(w, msg, pver, btcnet)\n\treturn err\n}\n\n// WriteV2MessageN writes a Message to the passed Writer using the bip324\n// v2 encoding.\nfunc WriteV2MessageN(w io.Writer, msg Message, pver uint32,\n\tencoding MessageEncoding) (int, error) {\n\n\tvar totalBytes int\n\n\tcmd := msg.Command()\n\tif len(cmd) > CommandSize {\n\t\tstr := fmt.Sprintf(\"command [%s] is too long [max %v]\",\n\t\t\tcmd, CommandSize)\n\t\treturn totalBytes, messageError(\"WriteMessage\", str)\n\t}\n\n\tindex, exists := v2Messages[cmd]\n\tif !exists {\n\t\tvar command [CommandSize]byte\n\t\tcopy(command[:], cmd)\n\t\thw := bytes.NewBuffer(make([]byte, 0, CommandSize+1))\n\t\twriteElements(hw, byte(0x00), command)\n\n\t\tn, err := w.Write(hw.Bytes())\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\ttotalBytes += n\n\t} else {\n\t\thw := bytes.NewBuffer(make([]byte, 0, 1))\n\t\twriteElement(hw, index)\n\n\t\tn, err := w.Write(hw.Bytes())\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\ttotalBytes += n\n\t}\n\n\tvar bw bytes.Buffer\n\terr := msg.BtcEncode(&bw, pver, encoding)\n\tif err != nil {\n\t\treturn totalBytes, err\n\t}\n\n\tpayload := bw.Bytes()\n\tlenp := len(payload)\n\n\t// Enforce maximum overall message payload.\n\tif lenp > MaxMessagePayload {\n\t\tstr := fmt.Sprintf(\"message payload is too large - encoded \"+\n\t\t\t\"%d bytes, but maximum message payload is %d bytes\",\n\t\t\tlenp, MaxMessagePayload)\n\t\treturn totalBytes, messageError(\"WriteMessage\", str)\n\t}\n\n\tmpl := msg.MaxPayloadLength(pver)\n\tif uint32(lenp) > mpl {\n\t\tstr := fmt.Sprintf(\"message payload is too large - encoded \"+\n\t\t\t\"%d bytes, but maximum message payload size for \"+\n\t\t\t\"messages of type [%s] is %d.\", lenp, cmd, mpl)\n\t\treturn totalBytes, messageError(\"WriteMessage\", str)\n\t}\n\n\tif len(payload) > 0 {\n\t\tn, err := w.Write(payload)\n\t\ttotalBytes += n\n\n\t\treturn totalBytes, err\n\t}\n\n\treturn totalBytes, nil\n}\n\n// WriteMessageWithEncodingN writes a bitcoin Message to w including the\n// necessary header information and returns the number of bytes written.\n// This function is the same as WriteMessageN except it also allows the caller\n// to specify the message encoding format to be used when serializing wire\n// messages.\nfunc WriteMessageWithEncodingN(w io.Writer, msg Message, pver uint32,\n\tbtcnet BitcoinNet, encoding MessageEncoding) (int, error) {\n\n\ttotalBytes := 0\n\n\t// Enforce max command size.\n\tvar command [CommandSize]byte\n\tcmd := msg.Command()\n\tif len(cmd) > CommandSize {\n\t\tstr := fmt.Sprintf(\"command [%s] is too long [max %v]\",\n\t\t\tcmd, CommandSize)\n\t\treturn totalBytes, messageError(\"WriteMessage\", str)\n\t}\n\tcopy(command[:], []byte(cmd))\n\n\t// Encode the message payload.\n\tvar bw bytes.Buffer\n\terr := msg.BtcEncode(&bw, pver, encoding)\n\tif err != nil {\n\t\treturn totalBytes, err\n\t}\n\tpayload := bw.Bytes()\n\tlenp := len(payload)\n\n\t// Enforce maximum overall message payload.\n\tif lenp > MaxMessagePayload {\n\t\tstr := fmt.Sprintf(\"message payload is too large - encoded \"+\n\t\t\t\"%d bytes, but maximum message payload is %d bytes\",\n\t\t\tlenp, MaxMessagePayload)\n\t\treturn totalBytes, messageError(\"WriteMessage\", str)\n\t}\n\n\t// Enforce maximum message payload based on the message type.\n\tmpl := msg.MaxPayloadLength(pver)\n\tif uint32(lenp) > mpl {\n\t\tstr := fmt.Sprintf(\"message payload is too large - encoded \"+\n\t\t\t\"%d bytes, but maximum message payload size for \"+\n\t\t\t\"messages of type [%s] is %d.\", lenp, cmd, mpl)\n\t\treturn totalBytes, messageError(\"WriteMessage\", str)\n\t}\n\n\t// Create header for the message.\n\thdr := messageHeader{}\n\thdr.magic = btcnet\n\thdr.command = cmd\n\thdr.length = uint32(lenp)\n\tcopy(hdr.checksum[:], chainhash.DoubleHashB(payload)[0:4])\n\n\t// Encode the header for the message.  This is done to a buffer\n\t// rather than directly to the writer since writeElements doesn't\n\t// return the number of bytes written.\n\thw := bytes.NewBuffer(make([]byte, 0, MessageHeaderSize))\n\twriteElements(hw, hdr.magic, command, hdr.length, hdr.checksum)\n\n\t// Write header.\n\tn, err := w.Write(hw.Bytes())\n\ttotalBytes += n\n\tif err != nil {\n\t\treturn totalBytes, err\n\t}\n\n\t// Only write the payload if there is one, e.g., verack messages don't\n\t// have one.\n\tif len(payload) > 0 {\n\t\tn, err = w.Write(payload)\n\t\ttotalBytes += n\n\t}\n\n\treturn totalBytes, err\n}\n\n// ReadV2MessageN takes the passed plaintext and attempts to construct a\n// Message from the bytes using the bip324 v2 encoding.\nfunc ReadV2MessageN(plaintext []byte, pver uint32, enc MessageEncoding) (\n\tMessage, []byte, error) {\n\n\tif len(plaintext) == 0 {\n\t\treturn nil, nil, fmt.Errorf(\"invalid plaintext length\")\n\t}\n\n\tvar msgCmd string\n\n\t// If the first byte is 0x00, read the next 12 bytes to determine what\n\t// message this is.\n\tif plaintext[0] == 0x00 {\n\t\tif len(plaintext) < CommandSize+1 {\n\t\t\treturn nil, nil, fmt.Errorf(\"invalid plaintext length\")\n\t\t}\n\n\t\t// Slice off the first 0x00 and the trailing 0x00 bytes.\n\t\tvar command [CommandSize]byte\n\t\tcopy(command[:], plaintext[1:CommandSize+1])\n\n\t\tmsgCmd = string(bytes.TrimRight(command[:], \"\\x00\"))\n\n\t\tplaintext = plaintext[CommandSize+1:]\n\t} else {\n\t\t// The first byte denotes what message this is.\n\t\tmsgCmd = v2MessageIDs[plaintext[0]]\n\n\t\tplaintext = plaintext[1:]\n\t}\n\n\tmsg, err := makeEmptyMessage(msgCmd)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tmpl := msg.MaxPayloadLength(pver)\n\tif len(plaintext) > int(mpl) {\n\t\treturn nil, nil, fmt.Errorf(\"payload exceeds max length\")\n\t}\n\n\tbuf := bytes.NewBuffer(plaintext)\n\terr = msg.BtcDecode(buf, pver, enc)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn msg, plaintext, nil\n}\n\n// ReadMessageWithEncodingN reads, validates, and parses the next bitcoin Message\n// from r for the provided protocol version and bitcoin network.  It returns the\n// number of bytes read in addition to the parsed Message and raw bytes which\n// comprise the message.  This function is the same as ReadMessageN except it\n// allows the caller to specify which message encoding is to to consult when\n// decoding wire messages.\nfunc ReadMessageWithEncodingN(r io.Reader, pver uint32, btcnet BitcoinNet,\n\tenc MessageEncoding) (int, Message, []byte, error) {\n\n\ttotalBytes := 0\n\tn, hdr, err := readMessageHeader(r)\n\ttotalBytes += n\n\tif err != nil {\n\t\treturn totalBytes, nil, nil, err\n\t}\n\n\treturn readMessageWithEncodingNInternal(\n\t\tr, pver, hdr, btcnet, enc, totalBytes,\n\t)\n}\n\n// ReadPartialMessageWithEncodingN is used in the case that we are expecting a\n// v2 connection and then receive a v1 version header. In this case, we\n// downgrade the implicit v2 connection to a v1 connection and must parse the\n// rest of the version bytes and check it properly.\nfunc ReadPartialMessageWithEncodingN(r io.Reader, pver uint32,\n\tbtcnet BitcoinNet, enc MessageEncoding, prefix []byte) (int, Message,\n\t[]byte, error) {\n\n\ttotalBytes := 0\n\tn, hdr, err := readPartialHeader(prefix, r)\n\ttotalBytes += n\n\tif err != nil {\n\t\treturn totalBytes, nil, nil, err\n\t}\n\n\treturn readMessageWithEncodingNInternal(\n\t\tr, pver, hdr, btcnet, enc, totalBytes,\n\t)\n}\n\n// readMessageWithEncodingNInternal is used to deduplicate the code because we\n// typically parse messages and headers all at once except in the case of a\n// downgraded v2->v1 conncection.\nfunc readMessageWithEncodingNInternal(r io.Reader, pver uint32,\n\thdr *messageHeader, btcnet BitcoinNet, enc MessageEncoding,\n\ttotalBytes int) (int, Message, []byte, error) {\n\n\t// Enforce maximum message payload.\n\tif hdr.length > MaxMessagePayload {\n\t\tstr := fmt.Sprintf(\"message payload is too large - header \"+\n\t\t\t\"indicates %d bytes, but max message payload is %d \"+\n\t\t\t\"bytes.\", hdr.length, MaxMessagePayload)\n\t\treturn totalBytes, nil, nil, messageError(\"ReadMessage\", str)\n\n\t}\n\n\t// Check for messages from the wrong bitcoin network.\n\tif hdr.magic != btcnet {\n\t\tdiscardInput(r, hdr.length)\n\t\tstr := fmt.Sprintf(\"message from other network [%v]\", hdr.magic)\n\t\treturn totalBytes, nil, nil, messageError(\"ReadMessage\", str)\n\t}\n\n\t// Check for malformed commands.\n\tcommand := hdr.command\n\tif !utf8.ValidString(command) {\n\t\tdiscardInput(r, hdr.length)\n\t\tstr := fmt.Sprintf(\"invalid command %v\", []byte(command))\n\t\treturn totalBytes, nil, nil, messageError(\"ReadMessage\", str)\n\t}\n\n\t// Create struct of appropriate message type based on the command.\n\tmsg, err := makeEmptyMessage(command)\n\tif err != nil {\n\t\t// makeEmptyMessage can only return ErrUnknownMessage and it is\n\t\t// important that we bubble it up to the caller.\n\t\tdiscardInput(r, hdr.length)\n\t\treturn totalBytes, nil, nil, err\n\t}\n\n\t// Check for maximum length based on the message type as a malicious client\n\t// could otherwise create a well-formed header and set the length to max\n\t// numbers in order to exhaust the machine's memory.\n\tmpl := msg.MaxPayloadLength(pver)\n\tif hdr.length > mpl {\n\t\tdiscardInput(r, hdr.length)\n\t\tstr := fmt.Sprintf(\"payload exceeds max length - header \"+\n\t\t\t\"indicates %v bytes, but max payload size for \"+\n\t\t\t\"messages of type [%v] is %v.\", hdr.length, command, mpl)\n\t\treturn totalBytes, nil, nil, messageError(\"ReadMessage\", str)\n\t}\n\n\t// Read payload.\n\tpayload := make([]byte, hdr.length)\n\tn, err := io.ReadFull(r, payload)\n\ttotalBytes += n\n\tif err != nil {\n\t\treturn totalBytes, nil, nil, err\n\t}\n\n\t// Test checksum.\n\tchecksum := chainhash.DoubleHashB(payload)[0:4]\n\tif !bytes.Equal(checksum, hdr.checksum[:]) {\n\t\tstr := fmt.Sprintf(\"payload checksum failed - header \"+\n\t\t\t\"indicates %v, but actual checksum is %v.\",\n\t\t\thdr.checksum, checksum)\n\t\treturn totalBytes, nil, nil, messageError(\"ReadMessage\", str)\n\t}\n\n\t// Unmarshal message.  NOTE: This must be a *bytes.Buffer since the\n\t// MsgVersion BtcDecode function requires it.\n\tpr := bytes.NewBuffer(payload)\n\terr = msg.BtcDecode(pr, pver, enc)\n\tif err != nil {\n\t\treturn totalBytes, nil, nil, err\n\t}\n\n\treturn totalBytes, msg, payload, nil\n}\n\n// ReadMessageN reads, validates, and parses the next bitcoin Message from r for\n// the provided protocol version and bitcoin network.  It returns the number of\n// bytes read in addition to the parsed Message and raw bytes which comprise the\n// message.  This function is the same as ReadMessage except it also returns the\n// number of bytes read.\nfunc ReadMessageN(r io.Reader, pver uint32, btcnet BitcoinNet) (int, Message, []byte, error) {\n\treturn ReadMessageWithEncodingN(r, pver, btcnet, BaseEncoding)\n}\n\n// ReadMessage reads, validates, and parses the next bitcoin Message from r for\n// the provided protocol version and bitcoin network.  It returns the parsed\n// Message and raw bytes which comprise the message.  This function only differs\n// from ReadMessageN in that it doesn't return the number of bytes read.  This\n// function is mainly provided for backwards compatibility with the original\n// API, but it's also useful for callers that don't care about byte counts.\nfunc ReadMessage(r io.Reader, pver uint32, btcnet BitcoinNet) (Message, []byte, error) {\n\t_, msg, buf, err := ReadMessageN(r, pver, btcnet)\n\treturn msg, buf, err\n}\n"
  },
  {
    "path": "wire/message_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"io\"\n\t\"net\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// makeHeader is a convenience function to make a message header in the form of\n// a byte slice.  It is used to force errors when reading messages.\nfunc makeHeader(btcnet BitcoinNet, command string,\n\tpayloadLen uint32, checksum uint32) []byte {\n\n\t// The length of a bitcoin message header is 24 bytes.\n\t// 4 byte magic number of the bitcoin network + 12 byte command + 4 byte\n\t// payload length + 4 byte checksum.\n\tbuf := make([]byte, 24)\n\tbinary.LittleEndian.PutUint32(buf, uint32(btcnet))\n\tcopy(buf[4:], []byte(command))\n\tbinary.LittleEndian.PutUint32(buf[16:], payloadLen)\n\tbinary.LittleEndian.PutUint32(buf[20:], checksum)\n\treturn buf\n}\n\n// TestMessage tests the Read/WriteMessage and Read/WriteMessageN API.\nfunc TestMessage(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Create the various types of messages to test.\n\n\t// MsgVersion.\n\taddrYou := &net.TCPAddr{IP: net.ParseIP(\"192.168.0.1\"), Port: 8333}\n\tyou := NewNetAddress(addrYou, SFNodeNetwork)\n\tyou.Timestamp = time.Time{} // Version message has zero value timestamp.\n\taddrMe := &net.TCPAddr{IP: net.ParseIP(\"127.0.0.1\"), Port: 8333}\n\tme := NewNetAddress(addrMe, SFNodeNetwork)\n\tme.Timestamp = time.Time{} // Version message has zero value timestamp.\n\tmsgVersion := NewMsgVersion(me, you, 123123, 0)\n\n\tmsgVerack := NewMsgVerAck()\n\tmsgGetAddr := NewMsgGetAddr()\n\tmsgAddr := NewMsgAddr()\n\tmsgGetBlocks := NewMsgGetBlocks(&chainhash.Hash{})\n\tmsgBlock := &blockOne\n\tmsgInv := NewMsgInv()\n\tmsgGetData := NewMsgGetData()\n\tmsgNotFound := NewMsgNotFound()\n\tmsgTx := NewMsgTx(1)\n\tmsgPing := NewMsgPing(123123)\n\tmsgPong := NewMsgPong(123123)\n\tmsgGetHeaders := NewMsgGetHeaders()\n\tmsgHeaders := NewMsgHeaders()\n\tmsgMemPool := NewMsgMemPool()\n\tmsgFilterAdd := NewMsgFilterAdd([]byte{0x01})\n\tmsgFilterClear := NewMsgFilterClear()\n\tmsgFilterLoad := NewMsgFilterLoad([]byte{0x01}, 10, 0, BloomUpdateNone)\n\tbh := NewBlockHeader(1, &chainhash.Hash{}, &chainhash.Hash{}, 0, 0)\n\tmsgMerkleBlock := NewMsgMerkleBlock(bh)\n\tmsgReject := NewMsgReject(\"block\", RejectDuplicate, \"duplicate block\")\n\tmsgGetCFilters := NewMsgGetCFilters(GCSFilterRegular, 0, &chainhash.Hash{})\n\tmsgGetCFHeaders := NewMsgGetCFHeaders(GCSFilterRegular, 0, &chainhash.Hash{})\n\tmsgGetCFCheckpt := NewMsgGetCFCheckpt(GCSFilterRegular, &chainhash.Hash{})\n\tmsgCFilter := NewMsgCFilter(GCSFilterRegular, &chainhash.Hash{},\n\t\t[]byte(\"payload\"))\n\tmsgCFHeaders := NewMsgCFHeaders()\n\tmsgCFCheckpt := NewMsgCFCheckpt(GCSFilterRegular, &chainhash.Hash{}, 0)\n\n\ttests := []struct {\n\t\tin     Message    // Value to encode\n\t\tout    Message    // Expected decoded value\n\t\tpver   uint32     // Protocol version for wire encoding\n\t\tbtcnet BitcoinNet // Network to use for wire encoding\n\t\tbytes  int        // Expected num bytes read/written\n\t}{\n\t\t{msgVersion, msgVersion, pver, MainNet, 125},\n\t\t{msgVerack, msgVerack, pver, MainNet, 24},\n\t\t{msgGetAddr, msgGetAddr, pver, MainNet, 24},\n\t\t{msgAddr, msgAddr, pver, MainNet, 25},\n\t\t{msgGetBlocks, msgGetBlocks, pver, MainNet, 61},\n\t\t{msgBlock, msgBlock, pver, MainNet, 239},\n\t\t{msgInv, msgInv, pver, MainNet, 25},\n\t\t{msgGetData, msgGetData, pver, MainNet, 25},\n\t\t{msgNotFound, msgNotFound, pver, MainNet, 25},\n\t\t{msgTx, msgTx, pver, MainNet, 34},\n\t\t{msgPing, msgPing, pver, MainNet, 32},\n\t\t{msgPong, msgPong, pver, MainNet, 32},\n\t\t{msgGetHeaders, msgGetHeaders, pver, MainNet, 61},\n\t\t{msgHeaders, msgHeaders, pver, MainNet, 25},\n\t\t{msgMemPool, msgMemPool, pver, MainNet, 24},\n\t\t{msgFilterAdd, msgFilterAdd, pver, MainNet, 26},\n\t\t{msgFilterClear, msgFilterClear, pver, MainNet, 24},\n\t\t{msgFilterLoad, msgFilterLoad, pver, MainNet, 35},\n\t\t{msgMerkleBlock, msgMerkleBlock, pver, MainNet, 110},\n\t\t{msgReject, msgReject, pver, MainNet, 79},\n\t\t{msgGetCFilters, msgGetCFilters, pver, MainNet, 61},\n\t\t{msgGetCFHeaders, msgGetCFHeaders, pver, MainNet, 61},\n\t\t{msgGetCFCheckpt, msgGetCFCheckpt, pver, MainNet, 57},\n\t\t{msgCFilter, msgCFilter, pver, MainNet, 65},\n\t\t{msgCFHeaders, msgCFHeaders, pver, MainNet, 90},\n\t\t{msgCFCheckpt, msgCFCheckpt, pver, MainNet, 58},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tvar buf bytes.Buffer\n\t\tnw, err := WriteMessageN(&buf, test.in, test.pver, test.btcnet)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"WriteMessage #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the number of bytes written match the expected value.\n\t\tif nw != test.bytes {\n\t\t\tt.Errorf(\"WriteMessage #%d unexpected num bytes \"+\n\t\t\t\t\"written - got %d, want %d\", i, nw, test.bytes)\n\t\t}\n\n\t\t// Decode from wire format.\n\t\trbuf := bytes.NewReader(buf.Bytes())\n\t\tnr, msg, _, err := ReadMessageN(rbuf, test.pver, test.btcnet)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"ReadMessage #%d error %v, msg %v\", i, err,\n\t\t\t\tspew.Sdump(msg))\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(msg, test.out) {\n\t\t\tt.Errorf(\"ReadMessage #%d\\n got: %v want: %v\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the number of bytes read match the expected value.\n\t\tif nr != test.bytes {\n\t\t\tt.Errorf(\"ReadMessage #%d unexpected num bytes read - \"+\n\t\t\t\t\"got %d, want %d\", i, nr, test.bytes)\n\t\t}\n\t}\n\n\t// Do the same thing for Read/WriteMessage, but ignore the bytes since\n\t// they don't return them.\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := WriteMessage(&buf, test.in, test.pver, test.btcnet)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"WriteMessage #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\trbuf := bytes.NewReader(buf.Bytes())\n\t\tmsg, _, err := ReadMessage(rbuf, test.pver, test.btcnet)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"ReadMessage #%d error %v, msg %v\", i, err,\n\t\t\t\tspew.Sdump(msg))\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(msg, test.out) {\n\t\t\tt.Errorf(\"ReadMessage #%d\\n got: %v want: %v\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestReadMessageWireErrors performs negative tests against wire decoding into\n// concrete messages to confirm error paths work correctly.\nfunc TestReadMessageWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\tbtcnet := MainNet\n\n\t// Ensure message errors are as expected with no function specified.\n\twantErr := \"something bad happened\"\n\ttestErr := MessageError{Description: wantErr}\n\tif testErr.Error() != wantErr {\n\t\tt.Errorf(\"MessageError: wrong error - got %v, want %v\",\n\t\t\ttestErr.Error(), wantErr)\n\t}\n\n\t// Ensure message errors are as expected with a function specified.\n\twantFunc := \"foo\"\n\ttestErr = MessageError{Func: wantFunc, Description: wantErr}\n\tif testErr.Error() != wantFunc+\": \"+wantErr {\n\t\tt.Errorf(\"MessageError: wrong error - got %v, want %v\",\n\t\t\ttestErr.Error(), wantErr)\n\t}\n\n\t// Wire encoded bytes for main and testnet3 networks magic identifiers.\n\ttestNet3Bytes := makeHeader(TestNet3, \"\", 0, 0)\n\n\t// Wire encoded bytes for a message that exceeds max overall message\n\t// length.\n\tmpl := uint32(MaxMessagePayload)\n\texceedMaxPayloadBytes := makeHeader(btcnet, \"getaddr\", mpl+1, 0)\n\n\t// Wire encoded bytes for a command which is invalid utf-8.\n\tbadCommandBytes := makeHeader(btcnet, \"bogus\", 0, 0)\n\tbadCommandBytes[4] = 0x81\n\n\t// Wire encoded bytes for a command which is valid, but not supported.\n\tunsupportedCommandBytes := makeHeader(btcnet, \"bogus\", 0, 0)\n\n\t// Wire encoded bytes for a message which exceeds the max payload for\n\t// a specific message type.\n\texceedTypePayloadBytes := makeHeader(btcnet, \"getaddr\", 1, 0)\n\n\t// Wire encoded bytes for a message which does not deliver the full\n\t// payload according to the header length.\n\tshortPayloadBytes := makeHeader(btcnet, \"version\", 115, 0)\n\n\t// Wire encoded bytes for a message with a bad checksum.\n\tbadChecksumBytes := makeHeader(btcnet, \"version\", 2, 0xbeef)\n\tbadChecksumBytes = append(badChecksumBytes, []byte{0x0, 0x0}...)\n\n\t// Wire encoded bytes for a message which has a valid header, but is\n\t// the wrong format.  An addr starts with a varint of the number of\n\t// contained in the message.  Claim there is two, but don't provide\n\t// them.  At the same time, forge the header fields so the message is\n\t// otherwise accurate.\n\tbadMessageBytes := makeHeader(btcnet, \"addr\", 1, 0xeaadc31c)\n\tbadMessageBytes = append(badMessageBytes, 0x2)\n\n\t// Wire encoded bytes for a message which the header claims has 15k\n\t// bytes of data to discard.\n\tdiscardBytes := makeHeader(btcnet, \"bogus\", 15*1024, 0)\n\n\ttests := []struct {\n\t\tbuf     []byte     // Wire encoding\n\t\tpver    uint32     // Protocol version for wire encoding\n\t\tbtcnet  BitcoinNet // Bitcoin network for wire encoding\n\t\tmax     int        // Max size of fixed buffer to induce errors\n\t\treadErr error      // Expected read error\n\t\tbytes   int        // Expected num bytes read\n\t}{\n\t\t// Latest protocol version with intentional read errors.\n\n\t\t// Short header.\n\t\t{\n\t\t\t[]byte{},\n\t\t\tpver,\n\t\t\tbtcnet,\n\t\t\t0,\n\t\t\tio.EOF,\n\t\t\t0,\n\t\t},\n\n\t\t// Wrong network.  Want MainNet, but giving TestNet3.\n\t\t{\n\t\t\ttestNet3Bytes,\n\t\t\tpver,\n\t\t\tbtcnet,\n\t\t\tlen(testNet3Bytes),\n\t\t\t&MessageError{},\n\t\t\t24,\n\t\t},\n\n\t\t// Exceed max overall message payload length.\n\t\t{\n\t\t\texceedMaxPayloadBytes,\n\t\t\tpver,\n\t\t\tbtcnet,\n\t\t\tlen(exceedMaxPayloadBytes),\n\t\t\t&MessageError{},\n\t\t\t24,\n\t\t},\n\n\t\t// Invalid UTF-8 command.\n\t\t{\n\t\t\tbadCommandBytes,\n\t\t\tpver,\n\t\t\tbtcnet,\n\t\t\tlen(badCommandBytes),\n\t\t\t&MessageError{},\n\t\t\t24,\n\t\t},\n\n\t\t// Valid, but unsupported command.\n\t\t{\n\t\t\tunsupportedCommandBytes,\n\t\t\tpver,\n\t\t\tbtcnet,\n\t\t\tlen(unsupportedCommandBytes),\n\t\t\tErrUnknownMessage,\n\t\t\t24,\n\t\t},\n\n\t\t// Exceed max allowed payload for a message of a specific type.\n\t\t{\n\t\t\texceedTypePayloadBytes,\n\t\t\tpver,\n\t\t\tbtcnet,\n\t\t\tlen(exceedTypePayloadBytes),\n\t\t\t&MessageError{},\n\t\t\t24,\n\t\t},\n\n\t\t// Message with a payload shorter than the header indicates.\n\t\t{\n\t\t\tshortPayloadBytes,\n\t\t\tpver,\n\t\t\tbtcnet,\n\t\t\tlen(shortPayloadBytes),\n\t\t\tio.EOF,\n\t\t\t24,\n\t\t},\n\n\t\t// Message with a bad checksum.\n\t\t{\n\t\t\tbadChecksumBytes,\n\t\t\tpver,\n\t\t\tbtcnet,\n\t\t\tlen(badChecksumBytes),\n\t\t\t&MessageError{},\n\t\t\t26,\n\t\t},\n\n\t\t// Message with a valid header, but wrong format.\n\t\t{\n\t\t\tbadMessageBytes,\n\t\t\tpver,\n\t\t\tbtcnet,\n\t\t\tlen(badMessageBytes),\n\t\t\tio.EOF,\n\t\t\t25,\n\t\t},\n\n\t\t// 15k bytes of data to discard.\n\t\t{\n\t\t\tdiscardBytes,\n\t\t\tpver,\n\t\t\tbtcnet,\n\t\t\tlen(discardBytes),\n\t\t\tErrUnknownMessage,\n\t\t\t24,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Decode from wire format.\n\t\tr := newFixedReader(test.max, test.buf)\n\t\tnr, _, _, err := ReadMessageN(r, test.pver, test.btcnet)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"ReadMessage #%d wrong error got: %v <%T>, \"+\n\t\t\t\t\"want: %T\", i, err, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the number of bytes written match the expected value.\n\t\tif nr != test.bytes {\n\t\t\tt.Errorf(\"ReadMessage #%d unexpected num bytes read - \"+\n\t\t\t\t\"got %d, want %d\", i, nr, test.bytes)\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"ReadMessage #%d wrong error got: %v <%T>, \"+\n\t\t\t\t\t\"want: %v <%T>\", i, err, err,\n\t\t\t\t\ttest.readErr, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestWriteMessageWireErrors performs negative tests against wire encoding from\n// concrete messages to confirm error paths work correctly.\nfunc TestWriteMessageWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\tbtcnet := MainNet\n\twireErr := &MessageError{}\n\n\t// Fake message with a command that is too long.\n\tbadCommandMsg := &fakeMessage{command: \"somethingtoolong\"}\n\n\t// Fake message with a problem during encoding\n\tencodeErrMsg := &fakeMessage{forceEncodeErr: true}\n\n\t// Fake message that has payload which exceeds max overall message size.\n\texceedOverallPayload := make([]byte, MaxMessagePayload+1)\n\texceedOverallPayloadErrMsg := &fakeMessage{payload: exceedOverallPayload}\n\n\t// Fake message that has payload which exceeds max allowed per message.\n\texceedPayload := make([]byte, 1)\n\texceedPayloadErrMsg := &fakeMessage{payload: exceedPayload, forceLenErr: true}\n\n\t// Fake message that is used to force errors in the header and payload\n\t// writes.\n\tbogusPayload := []byte{0x01, 0x02, 0x03, 0x04}\n\tbogusMsg := &fakeMessage{command: \"bogus\", payload: bogusPayload}\n\n\ttests := []struct {\n\t\tmsg    Message    // Message to encode\n\t\tpver   uint32     // Protocol version for wire encoding\n\t\tbtcnet BitcoinNet // Bitcoin network for wire encoding\n\t\tmax    int        // Max size of fixed buffer to induce errors\n\t\terr    error      // Expected error\n\t\tbytes  int        // Expected num bytes written\n\t}{\n\t\t// Command too long.\n\t\t{badCommandMsg, pver, btcnet, 0, wireErr, 0},\n\t\t// Force error in payload encode.\n\t\t{encodeErrMsg, pver, btcnet, 0, wireErr, 0},\n\t\t// Force error due to exceeding max overall message payload size.\n\t\t{exceedOverallPayloadErrMsg, pver, btcnet, 0, wireErr, 0},\n\t\t// Force error due to exceeding max payload for message type.\n\t\t{exceedPayloadErrMsg, pver, btcnet, 0, wireErr, 0},\n\t\t// Force error in header write.\n\t\t{bogusMsg, pver, btcnet, 0, io.ErrShortWrite, 0},\n\t\t// Force error in payload write.\n\t\t{bogusMsg, pver, btcnet, 24, io.ErrShortWrite, 24},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode wire format.\n\t\tw := newFixedWriter(test.max)\n\t\tnw, err := WriteMessageN(w, test.msg, test.pver, test.btcnet)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"WriteMessage #%d wrong error got: %v <%T>, \"+\n\t\t\t\t\"want: %T\", i, err, err, test.err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the number of bytes written match the expected value.\n\t\tif nw != test.bytes {\n\t\t\tt.Errorf(\"WriteMessage #%d unexpected num bytes \"+\n\t\t\t\t\"written - got %d, want %d\", i, nw, test.bytes)\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.err {\n\t\t\t\tt.Errorf(\"ReadMessage #%d wrong error got: %v <%T>, \"+\n\t\t\t\t\t\"want: %v <%T>\", i, err, err,\n\t\t\t\t\ttest.err, test.err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msgaddr.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MaxAddrPerMsg is the maximum number of addresses that can be in a single\n// bitcoin addr message (MsgAddr).\nconst MaxAddrPerMsg = 1000\n\n// MsgAddr implements the Message interface and represents a bitcoin\n// addr message.  It is used to provide a list of known active peers on the\n// network.  An active peer is considered one that has transmitted a message\n// within the last 3 hours.  Nodes which have not transmitted in that time\n// frame should be forgotten.  Each message is limited to a maximum number of\n// addresses, which is currently 1000.  As a result, multiple messages must\n// be used to relay the full list.\n//\n// Use the AddAddress function to build up the list of known addresses when\n// sending an addr message to another peer.\ntype MsgAddr struct {\n\tAddrList []*NetAddress\n}\n\n// AddAddress adds a known active peer to the message.\nfunc (msg *MsgAddr) AddAddress(na *NetAddress) error {\n\tif len(msg.AddrList)+1 > MaxAddrPerMsg {\n\t\tstr := fmt.Sprintf(\"too many addresses in message [max %v]\",\n\t\t\tMaxAddrPerMsg)\n\t\treturn messageError(\"MsgAddr.AddAddress\", str)\n\t}\n\n\tmsg.AddrList = append(msg.AddrList, na)\n\treturn nil\n}\n\n// AddAddresses adds multiple known active peers to the message.\nfunc (msg *MsgAddr) AddAddresses(netAddrs ...*NetAddress) error {\n\tfor _, na := range netAddrs {\n\t\terr := msg.AddAddress(na)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// ClearAddresses removes all addresses from the message.\nfunc (msg *MsgAddr) ClearAddresses() {\n\tmsg.AddrList = []*NetAddress{}\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgAddr) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tcount, err := ReadVarInt(r, pver)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Limit to max addresses per message.\n\tif count > MaxAddrPerMsg {\n\t\tstr := fmt.Sprintf(\"too many addresses for message \"+\n\t\t\t\"[count %v, max %v]\", count, MaxAddrPerMsg)\n\t\treturn messageError(\"MsgAddr.BtcDecode\", str)\n\t}\n\n\taddrList := make([]NetAddress, count)\n\tmsg.AddrList = make([]*NetAddress, 0, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\tna := &addrList[i]\n\t\terr := readNetAddress(r, pver, na, true)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.AddAddress(na)\n\t}\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgAddr) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\t// Protocol versions before MultipleAddressVersion only allowed 1 address\n\t// per message.\n\tcount := len(msg.AddrList)\n\tif pver < MultipleAddressVersion && count > 1 {\n\t\tstr := fmt.Sprintf(\"too many addresses for message of \"+\n\t\t\t\"protocol version %v [count %v, max 1]\", pver, count)\n\t\treturn messageError(\"MsgAddr.BtcEncode\", str)\n\n\t}\n\tif count > MaxAddrPerMsg {\n\t\tstr := fmt.Sprintf(\"too many addresses for message \"+\n\t\t\t\"[count %v, max %v]\", count, MaxAddrPerMsg)\n\t\treturn messageError(\"MsgAddr.BtcEncode\", str)\n\t}\n\n\terr := WriteVarInt(w, pver, uint64(count))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, na := range msg.AddrList {\n\t\terr = writeNetAddress(w, pver, na, true)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgAddr) Command() string {\n\treturn CmdAddr\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgAddr) MaxPayloadLength(pver uint32) uint32 {\n\tif pver < MultipleAddressVersion {\n\t\t// Num addresses (varInt) + a single net addresses.\n\t\treturn MaxVarIntPayload + maxNetAddressPayload(pver)\n\t}\n\n\t// Num addresses (varInt) + max allowed addresses.\n\treturn MaxVarIntPayload + (MaxAddrPerMsg * maxNetAddressPayload(pver))\n}\n\n// NewMsgAddr returns a new bitcoin addr message that conforms to the\n// Message interface.  See MsgAddr for details.\nfunc NewMsgAddr() *MsgAddr {\n\treturn &MsgAddr{\n\t\tAddrList: make([]*NetAddress, 0, MaxAddrPerMsg),\n\t}\n}\n"
  },
  {
    "path": "wire/msgaddr_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"net\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestAddr tests the MsgAddr API.\nfunc TestAddr(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Ensure the command is expected value.\n\twantCmd := \"addr\"\n\tmsg := NewMsgAddr()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgAddr: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\t// Num addresses (varInt) + max allowed addresses.\n\twantPayload := uint32(30009)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Ensure NetAddresses are added properly.\n\ttcpAddr := &net.TCPAddr{IP: net.ParseIP(\"127.0.0.1\"), Port: 8333}\n\tna := NewNetAddress(tcpAddr, SFNodeNetwork)\n\terr := msg.AddAddress(na)\n\tif err != nil {\n\t\tt.Errorf(\"AddAddress: %v\", err)\n\t}\n\tif msg.AddrList[0] != na {\n\t\tt.Errorf(\"AddAddress: wrong address added - got %v, want %v\",\n\t\t\tspew.Sprint(msg.AddrList[0]), spew.Sprint(na))\n\t}\n\n\t// Ensure the address list is cleared properly.\n\tmsg.ClearAddresses()\n\tif len(msg.AddrList) != 0 {\n\t\tt.Errorf(\"ClearAddresses: address list is not empty - \"+\n\t\t\t\"got %v [%v], want %v\", len(msg.AddrList),\n\t\t\tspew.Sprint(msg.AddrList[0]), 0)\n\t}\n\n\t// Ensure adding more than the max allowed addresses per message returns\n\t// error.\n\tfor i := 0; i < MaxAddrPerMsg+1; i++ {\n\t\terr = msg.AddAddress(na)\n\t}\n\tif err == nil {\n\t\tt.Errorf(\"AddAddress: expected error on too many addresses \" +\n\t\t\t\"not received\")\n\t}\n\terr = msg.AddAddresses(na)\n\tif err == nil {\n\t\tt.Errorf(\"AddAddresses: expected error on too many addresses \" +\n\t\t\t\"not received\")\n\t}\n\n\t// Ensure max payload is expected value for protocol versions before\n\t// timestamp was added to NetAddress.\n\t// Num addresses (varInt) + max allowed addresses.\n\tpver = NetAddressTimeVersion - 1\n\twantPayload = uint32(26009)\n\tmaxPayload = msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Ensure max payload is expected value for protocol versions before\n\t// multiple addresses were allowed.\n\t// Num addresses (varInt) + a single net addresses.\n\tpver = MultipleAddressVersion - 1\n\twantPayload = uint32(35)\n\tmaxPayload = msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n}\n\n// TestAddrWire tests the MsgAddr wire encode and decode for various numbers\n// of addresses and protocol versions.\nfunc TestAddrWire(t *testing.T) {\n\t// A couple of NetAddresses to use for testing.\n\tna := &NetAddress{\n\t\tTimestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST\n\t\tServices:  SFNodeNetwork,\n\t\tIP:        net.ParseIP(\"127.0.0.1\"),\n\t\tPort:      8333,\n\t}\n\tna2 := &NetAddress{\n\t\tTimestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST\n\t\tServices:  SFNodeNetwork,\n\t\tIP:        net.ParseIP(\"192.168.0.1\"),\n\t\tPort:      8334,\n\t}\n\n\t// Empty address message.\n\tnoAddr := NewMsgAddr()\n\tnoAddrEncoded := []byte{\n\t\t0x00, // Varint for number of addresses\n\t}\n\n\t// Address message with multiple addresses.\n\tmultiAddr := NewMsgAddr()\n\tmultiAddr.AddAddresses(na, na2)\n\tmultiAddrEncoded := []byte{\n\t\t0x02,                   // Varint for number of addresses\n\t\t0x29, 0xab, 0x5f, 0x49, // Timestamp\n\t\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01, // IP 127.0.0.1\n\t\t0x20, 0x8d, // Port 8333 in big-endian\n\t\t0x29, 0xab, 0x5f, 0x49, // Timestamp\n\t\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0xff, 0xff, 0xc0, 0xa8, 0x00, 0x01, // IP 192.168.0.1\n\t\t0x20, 0x8e, // Port 8334 in big-endian\n\n\t}\n\n\ttests := []struct {\n\t\tin   *MsgAddr        // Message to encode\n\t\tout  *MsgAddr        // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version with no addresses.\n\t\t{\n\t\t\tnoAddr,\n\t\t\tnoAddr,\n\t\t\tnoAddrEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Latest protocol version with multiple addresses.\n\t\t{\n\t\t\tmultiAddr,\n\t\t\tmultiAddr,\n\t\t\tmultiAddrEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion-1 with no addresses.\n\t\t{\n\t\t\tnoAddr,\n\t\t\tnoAddr,\n\t\t\tnoAddrEncoded,\n\t\t\tMultipleAddressVersion - 1,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgAddr\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestAddrWireErrors performs negative tests against wire encode and decode\n// of MsgAddr to confirm error paths work correctly.\nfunc TestAddrWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\tpverMA := MultipleAddressVersion\n\twireErr := &MessageError{}\n\n\t// A couple of NetAddresses to use for testing.\n\tna := &NetAddress{\n\t\tTimestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST\n\t\tServices:  SFNodeNetwork,\n\t\tIP:        net.ParseIP(\"127.0.0.1\"),\n\t\tPort:      8333,\n\t}\n\tna2 := &NetAddress{\n\t\tTimestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST\n\t\tServices:  SFNodeNetwork,\n\t\tIP:        net.ParseIP(\"192.168.0.1\"),\n\t\tPort:      8334,\n\t}\n\n\t// Address message with multiple addresses.\n\tbaseAddr := NewMsgAddr()\n\tbaseAddr.AddAddresses(na, na2)\n\tbaseAddrEncoded := []byte{\n\t\t0x02,                   // Varint for number of addresses\n\t\t0x29, 0xab, 0x5f, 0x49, // Timestamp\n\t\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01, // IP 127.0.0.1\n\t\t0x20, 0x8d, // Port 8333 in big-endian\n\t\t0x29, 0xab, 0x5f, 0x49, // Timestamp\n\t\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0xff, 0xff, 0xc0, 0xa8, 0x00, 0x01, // IP 192.168.0.1\n\t\t0x20, 0x8e, // Port 8334 in big-endian\n\n\t}\n\n\t// Message that forces an error by having more than the max allowed\n\t// addresses.\n\tmaxAddr := NewMsgAddr()\n\tfor i := 0; i < MaxAddrPerMsg; i++ {\n\t\tmaxAddr.AddAddress(na)\n\t}\n\tmaxAddr.AddrList = append(maxAddr.AddrList, na)\n\tmaxAddrEncoded := []byte{\n\t\t0xfd, 0x03, 0xe9, // Varint for number of addresses (1001)\n\t}\n\n\ttests := []struct {\n\t\tin       *MsgAddr        // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t// Force error in addresses count\n\t\t{baseAddr, baseAddrEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in address list.\n\t\t{baseAddr, baseAddrEncoded, pver, BaseEncoding, 1, io.ErrShortWrite, io.EOF},\n\t\t// Force error with greater than max inventory vectors.\n\t\t{maxAddr, maxAddrEncoded, pver, BaseEncoding, 3, wireErr, wireErr},\n\t\t// Force error with greater than max inventory vectors for\n\t\t// protocol versions before multiple addresses were allowed.\n\t\t{maxAddr, maxAddrEncoded, pverMA - 1, BaseEncoding, 3, wireErr, wireErr},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgAddr\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "wire/msgaddrv2.go",
    "content": "package wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MaxV2AddrPerMsg is the maximum number of version 2 addresses that will exist\n// in a single addrv2 message (MsgAddrV2).\nconst MaxV2AddrPerMsg = 1000\n\n// MsgAddrV2 implements the Message interface and represents a bitcoin addrv2\n// message that can support longer-length addresses like torv3, cjdns, and i2p.\n// It is used to gossip addresses on the network. Each message is limited to\n// MaxV2AddrPerMsg addresses. This is the same limit as MsgAddr.\ntype MsgAddrV2 struct {\n\tAddrList []*NetAddressV2\n}\n\n// BtcDecode decodes r using the bitcoin protocol into a MsgAddrV2.\nfunc (m *MsgAddrV2) BtcDecode(r io.Reader, pver uint32,\n\tenc MessageEncoding) error {\n\n\tcount, err := ReadVarInt(r, pver)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Limit to max addresses per message.\n\tif count > MaxV2AddrPerMsg {\n\t\tstr := fmt.Sprintf(\"too many addresses for message [count %v,\"+\n\t\t\t\" max %v]\", count, MaxV2AddrPerMsg)\n\t\treturn messageError(\"MsgAddrV2.BtcDecode\", str)\n\t}\n\n\taddrList := make([]NetAddressV2, count)\n\tm.AddrList = make([]*NetAddressV2, 0, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\tna := &addrList[i]\n\t\terr := readNetAddressV2(r, pver, na)\n\t\tif err != nil {\n\t\t\t// A network address of a type we don't know of may be\n\t\t\t// safely skipped. All other errors mean we should stop\n\t\t\t// processing the message.\n\t\t\tif err == ErrSkippedNetworkID {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\treturn err\n\t\t}\n\n\t\tm.AddrList = append(m.AddrList, na)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the MsgAddrV2 into a writer w.\nfunc (m *MsgAddrV2) BtcEncode(w io.Writer, pver uint32,\n\tenc MessageEncoding) error {\n\n\tcount := len(m.AddrList)\n\tif count > MaxV2AddrPerMsg {\n\t\tstr := fmt.Sprintf(\"too many addresses for message: \"+\n\t\t\t\"got %v, max %v\", count, MaxV2AddrPerMsg)\n\t\treturn messageError(\"MsgAddrV2.BtcEncode\", str)\n\t}\n\n\terr := WriteVarInt(w, pver, uint64(count))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, na := range m.AddrList {\n\t\terr = writeNetAddressV2(w, pver, na)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for MsgAddrV2.\nfunc (m *MsgAddrV2) Command() string {\n\treturn CmdAddrV2\n}\n\n// MaxPayloadLength returns the maximum length payload possible for MsgAddrV2.\nfunc (m *MsgAddrV2) MaxPayloadLength(pver uint32) uint32 {\n\t// The varint that can store the maximum number of addresses is 3 bytes\n\t// long. The maximum payload is then 3 + 1000 * maxNetAddressV2Payload.\n\treturn 3 + (MaxV2AddrPerMsg * maxNetAddressV2Payload())\n}\n\n// NewMsgAddrV2 returns a new bitcoin addrv2 message that conforms to the\n// Message interface.\nfunc NewMsgAddrV2() *MsgAddrV2 {\n\treturn &MsgAddrV2{\n\t\tAddrList: make([]*NetAddressV2, 0, MaxV2AddrPerMsg),\n\t}\n}\n"
  },
  {
    "path": "wire/msgaddrv2_test.go",
    "content": "package wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"testing\"\n)\n\n// TestAddrV2Decode checks that decoding an addrv2 message off the wire behaves\n// as expected. This means ignoring certain addresses, and failing in certain\n// failure scenarios.\nfunc TestAddrV2Decode(t *testing.T) {\n\ttests := []struct {\n\t\tbuf           []byte\n\t\texpectedError bool\n\t\texpectedAddrs int\n\t}{\n\t\t// Exceeding max addresses.\n\t\t{\n\t\t\t[]byte{0xfd, 0xff, 0xff},\n\t\t\ttrue,\n\t\t\t0,\n\t\t},\n\n\t\t// Invalid address size.\n\t\t{\n\t\t\t[]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05},\n\t\t\ttrue,\n\t\t\t0,\n\t\t},\n\n\t\t// One valid address and one skipped address\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04,\n\t\t\t\t0x7f, 0x00, 0x00, 0x01, 0x22, 0x22, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0x00, 0x02, 0x10, 0xfd, 0x87, 0xd8,\n\t\t\t\t0x7e, 0xeb, 0x43, 0xff, 0xfe, 0xcc, 0x39, 0xa8,\n\t\t\t\t0x73, 0x69, 0x15, 0xff, 0xff, 0x22, 0x22,\n\t\t\t},\n\t\t\tfalse,\n\t\t\t1,\n\t\t},\n\t\t// Truncated address.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04,\n\t\t\t\t0x7f, 0x00, 0x00,\n\t\t\t},\n\t\t\ttrue,\n\t\t\t0,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tr := bytes.NewReader(test.buf)\n\t\tm := &MsgAddrV2{}\n\n\t\terr := m.BtcDecode(r, 0, LatestEncoding)\n\t\tif test.expectedError {\n\t\t\tif err == nil {\n\t\t\t\tt.Errorf(\"Test #%d expected error\", i)\n\t\t\t}\n\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\tt.Errorf(\"Test #%d unexpected error %v\", i, err)\n\t\t}\n\n\t\t// Trying to read more should give EOF.\n\t\tvar b [1]byte\n\t\tif _, err := r.Read(b[:]); err != io.EOF {\n\t\t\tt.Errorf(\"Test #%d did not cleanly finish reading\", i)\n\t\t}\n\n\t\tif len(m.AddrList) != test.expectedAddrs {\n\t\t\tt.Errorf(\"Test #%d expected %d addrs, instead of %d\",\n\t\t\t\ti, test.expectedAddrs, len(m.AddrList))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msgblock.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// defaultTransactionAlloc is the default size used for the backing array\n// for transactions.  The transaction array will dynamically grow as needed, but\n// this figure is intended to provide enough space for the number of\n// transactions in the vast majority of blocks without needing to grow the\n// backing array multiple times.\nconst defaultTransactionAlloc = 2048\n\n// MaxBlocksPerMsg is the maximum number of blocks allowed per message.\nconst MaxBlocksPerMsg = 500\n\n// MaxBlockPayload is the maximum bytes a block message can be in bytes.\n// After Segregated Witness, the max block payload has been raised to 4MB.\nconst MaxBlockPayload = 4000000\n\n// maxTxPerBlock is the maximum number of transactions that could\n// possibly fit into a block.\nconst maxTxPerBlock = (MaxBlockPayload / minTxPayload) + 1\n\n// TxLoc holds locator data for the offset and length of where a transaction is\n// located within a MsgBlock data buffer.\ntype TxLoc struct {\n\tTxStart int\n\tTxLen   int\n}\n\n// MsgBlock implements the Message interface and represents a bitcoin\n// block message.  It is used to deliver block and transaction information in\n// response to a getdata message (MsgGetData) for a given block hash.\ntype MsgBlock struct {\n\tHeader       BlockHeader\n\tTransactions []*MsgTx\n}\n\n// Copy creates a deep copy of MsgBlock.\nfunc (msg *MsgBlock) Copy() *MsgBlock {\n\tblock := &MsgBlock{\n\t\tHeader:       msg.Header,\n\t\tTransactions: make([]*MsgTx, len(msg.Transactions)),\n\t}\n\n\tfor i, tx := range msg.Transactions {\n\t\tblock.Transactions[i] = tx.Copy()\n\t}\n\n\treturn block\n}\n\n// AddTransaction adds a transaction to the message.\nfunc (msg *MsgBlock) AddTransaction(tx *MsgTx) error {\n\tmsg.Transactions = append(msg.Transactions, tx)\n\treturn nil\n\n}\n\n// ClearTransactions removes all transactions from the message.\nfunc (msg *MsgBlock) ClearTransactions() {\n\tmsg.Transactions = make([]*MsgTx, 0, defaultTransactionAlloc)\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\n// See Deserialize for decoding blocks stored to disk, such as in a database, as\n// opposed to decoding blocks from the wire.\nfunc (msg *MsgBlock) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := readBlockHeaderBuf(r, pver, &msg.Header, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttxCount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Prevent more transactions than could possibly fit into a block.\n\t// It would be possible to cause memory exhaustion and panics without\n\t// a sane upper bound on this count.\n\tif txCount > maxTxPerBlock {\n\t\tstr := fmt.Sprintf(\"too many transactions to fit into a block \"+\n\t\t\t\"[count %d, max %d]\", txCount, maxTxPerBlock)\n\t\treturn messageError(\"MsgBlock.BtcDecode\", str)\n\t}\n\n\tscriptBuf := scriptPool.Borrow()\n\tdefer scriptPool.Return(scriptBuf)\n\n\tmsg.Transactions = make([]*MsgTx, 0, txCount)\n\tfor i := uint64(0); i < txCount; i++ {\n\t\ttx := MsgTx{}\n\t\terr := tx.btcDecode(r, pver, enc, buf, scriptBuf[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.Transactions = append(msg.Transactions, &tx)\n\t}\n\n\treturn nil\n}\n\n// Deserialize decodes a block from r into the receiver using a format that is\n// suitable for long-term storage such as a database while respecting the\n// Version field in the block.  This function differs from BtcDecode in that\n// BtcDecode decodes from the bitcoin wire protocol as it was sent across the\n// network.  The wire encoding can technically differ depending on the protocol\n// version and doesn't even really need to match the format of a stored block at\n// all.  As of the time this comment was written, the encoded block is the same\n// in both instances, but there is a distinct difference and separating the two\n// allows the API to be flexible enough to deal with changes.\nfunc (msg *MsgBlock) Deserialize(r io.Reader) error {\n\t// At the current time, there is no difference between the wire encoding\n\t// at protocol version 0 and the stable long-term storage format.  As\n\t// a result, make use of BtcDecode.\n\t//\n\t// Passing an encoding type of WitnessEncoding to BtcEncode for the\n\t// MessageEncoding parameter indicates that the transactions within the\n\t// block are expected to be serialized according to the new\n\t// serialization structure defined in BIP0141.\n\treturn msg.BtcDecode(r, 0, WitnessEncoding)\n}\n\n// DeserializeNoWitness decodes a block from r into the receiver similar to\n// Deserialize, however DeserializeWitness strips all (if any) witness data\n// from the transactions within the block before encoding them.\nfunc (msg *MsgBlock) DeserializeNoWitness(r io.Reader) error {\n\treturn msg.BtcDecode(r, 0, BaseEncoding)\n}\n\n// DeserializeTxLoc decodes r in the same manner Deserialize does, but it takes\n// a byte buffer instead of a generic reader and returns a slice containing the\n// start and length of each transaction within the raw data that is being\n// deserialized.\nfunc (msg *MsgBlock) DeserializeTxLoc(r *bytes.Buffer) ([]TxLoc, error) {\n\tfullLen := r.Len()\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\t// At the current time, there is no difference between the wire encoding\n\t// at protocol version 0 and the stable long-term storage format.  As\n\t// a result, make use of existing wire protocol functions.\n\terr := readBlockHeaderBuf(r, 0, &msg.Header, buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttxCount, err := ReadVarIntBuf(r, 0, buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Prevent more transactions than could possibly fit into a block.\n\t// It would be possible to cause memory exhaustion and panics without\n\t// a sane upper bound on this count.\n\tif txCount > maxTxPerBlock {\n\t\tstr := fmt.Sprintf(\"too many transactions to fit into a block \"+\n\t\t\t\"[count %d, max %d]\", txCount, maxTxPerBlock)\n\t\treturn nil, messageError(\"MsgBlock.DeserializeTxLoc\", str)\n\t}\n\n\tscriptBuf := scriptPool.Borrow()\n\tdefer scriptPool.Return(scriptBuf)\n\n\t// Deserialize each transaction while keeping track of its location\n\t// within the byte stream.\n\tmsg.Transactions = make([]*MsgTx, 0, txCount)\n\ttxLocs := make([]TxLoc, txCount)\n\tfor i := uint64(0); i < txCount; i++ {\n\t\ttxLocs[i].TxStart = fullLen - r.Len()\n\t\ttx := MsgTx{}\n\t\terr := tx.btcDecode(r, 0, WitnessEncoding, buf, scriptBuf[:])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tmsg.Transactions = append(msg.Transactions, &tx)\n\t\ttxLocs[i].TxLen = (fullLen - r.Len()) - txLocs[i].TxStart\n\t}\n\n\treturn txLocs, nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\n// See Serialize for encoding blocks to be stored to disk, such as in a\n// database, as opposed to encoding blocks for the wire.\nfunc (msg *MsgBlock) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := writeBlockHeaderBuf(w, pver, &msg.Header, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = WriteVarIntBuf(w, pver, uint64(len(msg.Transactions)), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, tx := range msg.Transactions {\n\t\terr = tx.btcEncode(w, pver, enc, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Serialize encodes the block to w using a format that suitable for long-term\n// storage such as a database while respecting the Version field in the block.\n// This function differs from BtcEncode in that BtcEncode encodes the block to\n// the bitcoin wire protocol in order to be sent across the network.  The wire\n// encoding can technically differ depending on the protocol version and doesn't\n// even really need to match the format of a stored block at all.  As of the\n// time this comment was written, the encoded block is the same in both\n// instances, but there is a distinct difference and separating the two allows\n// the API to be flexible enough to deal with changes.\nfunc (msg *MsgBlock) Serialize(w io.Writer) error {\n\t// At the current time, there is no difference between the wire encoding\n\t// at protocol version 0 and the stable long-term storage format.  As\n\t// a result, make use of BtcEncode.\n\t//\n\t// Passing WitnessEncoding as the encoding type here indicates that\n\t// each of the transactions should be serialized using the witness\n\t// serialization structure defined in BIP0141.\n\treturn msg.BtcEncode(w, 0, WitnessEncoding)\n}\n\n// SerializeNoWitness encodes a block to w using an identical format to\n// Serialize, with all (if any) witness data stripped from all transactions.\n// This method is provided in addition to the regular Serialize, in order to\n// allow one to selectively encode transaction witness data to non-upgraded\n// peers which are unaware of the new encoding.\nfunc (msg *MsgBlock) SerializeNoWitness(w io.Writer) error {\n\treturn msg.BtcEncode(w, 0, BaseEncoding)\n}\n\n// SerializeSize returns the number of bytes it would take to serialize the\n// block, factoring in any witness data within transaction.\nfunc (msg *MsgBlock) SerializeSize() int {\n\t// Block header bytes + Serialized varint size for the number of\n\t// transactions.\n\tn := blockHeaderLen + VarIntSerializeSize(uint64(len(msg.Transactions)))\n\n\tfor _, tx := range msg.Transactions {\n\t\tn += tx.SerializeSize()\n\t}\n\n\treturn n\n}\n\n// SerializeSizeStripped returns the number of bytes it would take to serialize\n// the block, excluding any witness data (if any).\nfunc (msg *MsgBlock) SerializeSizeStripped() int {\n\t// Block header bytes + Serialized varint size for the number of\n\t// transactions.\n\tn := blockHeaderLen + VarIntSerializeSize(uint64(len(msg.Transactions)))\n\n\tfor _, tx := range msg.Transactions {\n\t\tn += tx.SerializeSizeStripped()\n\t}\n\n\treturn n\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgBlock) Command() string {\n\treturn CmdBlock\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgBlock) MaxPayloadLength(pver uint32) uint32 {\n\t// Block header at 80 bytes + transaction count + max transactions\n\t// which can vary up to the MaxBlockPayload (including the block header\n\t// and transaction count).\n\treturn MaxBlockPayload\n}\n\n// BlockHash computes the block identifier hash for this block.\nfunc (msg *MsgBlock) BlockHash() chainhash.Hash {\n\treturn msg.Header.BlockHash()\n}\n\n// TxHashes returns a slice of hashes of all of transactions in this block.\nfunc (msg *MsgBlock) TxHashes() ([]chainhash.Hash, error) {\n\thashList := make([]chainhash.Hash, 0, len(msg.Transactions))\n\tfor _, tx := range msg.Transactions {\n\t\thashList = append(hashList, tx.TxHash())\n\t}\n\treturn hashList, nil\n}\n\n// NewMsgBlock returns a new bitcoin block message that conforms to the\n// Message interface.  See MsgBlock for details.\nfunc NewMsgBlock(blockHeader *BlockHeader) *MsgBlock {\n\treturn &MsgBlock{\n\t\tHeader:       *blockHeader,\n\t\tTransactions: make([]*MsgTx, 0, defaultTransactionAlloc),\n\t}\n}\n"
  },
  {
    "path": "wire/msgblock_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestBlock tests the MsgBlock API.\nfunc TestBlock(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Block 1 header.\n\tprevHash := &blockOne.Header.PrevBlock\n\tmerkleHash := &blockOne.Header.MerkleRoot\n\tbits := blockOne.Header.Bits\n\tnonce := blockOne.Header.Nonce\n\tbh := NewBlockHeader(1, prevHash, merkleHash, bits, nonce)\n\n\t// Ensure the command is expected value.\n\twantCmd := \"block\"\n\tmsg := NewMsgBlock(bh)\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgBlock: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\t// Num addresses (varInt) + max allowed addresses.\n\twantPayload := uint32(4000000)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Ensure we get the same block header data back out.\n\tif !reflect.DeepEqual(&msg.Header, bh) {\n\t\tt.Errorf(\"NewMsgBlock: wrong block header - got %v, want %v\",\n\t\t\tspew.Sdump(&msg.Header), spew.Sdump(bh))\n\t}\n\n\t// Ensure transactions are added properly.\n\ttx := blockOne.Transactions[0].Copy()\n\tmsg.AddTransaction(tx)\n\tif !reflect.DeepEqual(msg.Transactions, blockOne.Transactions) {\n\t\tt.Errorf(\"AddTransaction: wrong transactions - got %v, want %v\",\n\t\t\tspew.Sdump(msg.Transactions),\n\t\t\tspew.Sdump(blockOne.Transactions))\n\t}\n\n\t// Ensure transactions are properly cleared.\n\tmsg.ClearTransactions()\n\tif len(msg.Transactions) != 0 {\n\t\tt.Errorf(\"ClearTransactions: wrong transactions - got %v, want %v\",\n\t\t\tlen(msg.Transactions), 0)\n\t}\n}\n\n// TestBlockTxHashes tests the ability to generate a slice of all transaction\n// hashes from a block accurately.\nfunc TestBlockTxHashes(t *testing.T) {\n\t// Block 1, transaction 1 hash.\n\thashStr := \"0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098\"\n\twantHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t\treturn\n\t}\n\n\twantHashes := []chainhash.Hash{*wantHash}\n\thashes, err := blockOne.TxHashes()\n\tif err != nil {\n\t\tt.Errorf(\"TxHashes: %v\", err)\n\t}\n\tif !reflect.DeepEqual(hashes, wantHashes) {\n\t\tt.Errorf(\"TxHashes: wrong transaction hashes - got %v, want %v\",\n\t\t\tspew.Sdump(hashes), spew.Sdump(wantHashes))\n\t}\n}\n\n// TestBlockHash tests the ability to generate the hash of a block accurately.\nfunc TestBlockHash(t *testing.T) {\n\t// Block 1 hash.\n\thashStr := \"839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048\"\n\twantHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Ensure the hash produced is expected.\n\tblockHash := blockOne.BlockHash()\n\tif !blockHash.IsEqual(wantHash) {\n\t\tt.Errorf(\"BlockHash: wrong hash - got %v, want %v\",\n\t\t\tspew.Sprint(blockHash), spew.Sprint(wantHash))\n\t}\n}\n\n// TestBlockWire tests the MsgBlock wire encode and decode for various numbers\n// of transaction inputs and outputs and protocol versions.\nfunc TestBlockWire(t *testing.T) {\n\ttests := []struct {\n\t\tin     *MsgBlock       // Message to encode\n\t\tout    *MsgBlock       // Expected decoded message\n\t\tbuf    []byte          // Wire encoding\n\t\ttxLocs []TxLoc         // Expected transaction locations\n\t\tpver   uint32          // Protocol version for wire encoding\n\t\tenc    MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\t&blockOne,\n\t\t\t&blockOne,\n\t\t\tblockOneBytes,\n\t\t\tblockOneTxLocs,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version.\n\t\t{\n\t\t\t&blockOne,\n\t\t\t&blockOne,\n\t\t\tblockOneBytes,\n\t\t\tblockOneTxLocs,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version.\n\t\t{\n\t\t\t&blockOne,\n\t\t\t&blockOne,\n\t\t\tblockOneBytes,\n\t\t\tblockOneTxLocs,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion.\n\t\t{\n\t\t\t&blockOne,\n\t\t\t&blockOne,\n\t\t\tblockOneBytes,\n\t\t\tblockOneTxLocs,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion.\n\t\t{\n\t\t\t&blockOne,\n\t\t\t&blockOne,\n\t\t\tblockOneBytes,\n\t\t\tblockOneTxLocs,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t\t// TODO(roasbeef): add case for witnessy block\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgBlock\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestBlockWireErrors performs negative tests against wire encode and decode\n// of MsgBlock to confirm error paths work correctly.\nfunc TestBlockWireErrors(t *testing.T) {\n\t// Use protocol version 60002 specifically here instead of the latest\n\t// because the test data is using bytes encoded with that protocol\n\t// version.\n\tpver := uint32(60002)\n\n\ttests := []struct {\n\t\tin       *MsgBlock       // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Force error in version.\n\t\t{&blockOne, blockOneBytes, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in prev block hash.\n\t\t{&blockOne, blockOneBytes, pver, BaseEncoding, 4, io.ErrShortWrite, io.EOF},\n\t\t// Force error in merkle root.\n\t\t{&blockOne, blockOneBytes, pver, BaseEncoding, 36, io.ErrShortWrite, io.EOF},\n\t\t// Force error in timestamp.\n\t\t{&blockOne, blockOneBytes, pver, BaseEncoding, 68, io.ErrShortWrite, io.EOF},\n\t\t// Force error in difficulty bits.\n\t\t{&blockOne, blockOneBytes, pver, BaseEncoding, 72, io.ErrShortWrite, io.EOF},\n\t\t// Force error in header nonce.\n\t\t{&blockOne, blockOneBytes, pver, BaseEncoding, 76, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction count.\n\t\t{&blockOne, blockOneBytes, pver, BaseEncoding, 80, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transactions.\n\t\t{&blockOne, blockOneBytes, pver, BaseEncoding, 81, io.ErrShortWrite, io.EOF},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif err != test.writeErr {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgBlock\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif err != test.readErr {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestBlockSerialize tests MsgBlock serialize and deserialize.\nfunc TestBlockSerialize(t *testing.T) {\n\ttests := []struct {\n\t\tin     *MsgBlock // Message to encode\n\t\tout    *MsgBlock // Expected decoded message\n\t\tbuf    []byte    // Serialized data\n\t\ttxLocs []TxLoc   // Expected transaction locations\n\t}{\n\t\t{\n\t\t\t&blockOne,\n\t\t\t&blockOne,\n\t\t\tblockOneBytes,\n\t\t\tblockOneTxLocs,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Serialize the block.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.Serialize(&buf)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Serialize #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"Serialize #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Deserialize the block.\n\t\tvar block MsgBlock\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = block.Deserialize(rbuf)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Deserialize #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&block, test.out) {\n\t\t\tt.Errorf(\"Deserialize #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&block), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Deserialize the block while gathering transaction location\n\t\t// information.\n\t\tvar txLocBlock MsgBlock\n\t\tbr := bytes.NewBuffer(test.buf)\n\t\ttxLocs, err := txLocBlock.DeserializeTxLoc(br)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"DeserializeTxLoc #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&txLocBlock, test.out) {\n\t\t\tt.Errorf(\"DeserializeTxLoc #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&txLocBlock), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(txLocs, test.txLocs) {\n\t\t\tt.Errorf(\"DeserializeTxLoc #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(txLocs), spew.Sdump(test.txLocs))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestBlockSerializeErrors performs negative tests against wire encode and\n// decode of MsgBlock to confirm error paths work correctly.\nfunc TestBlockSerializeErrors(t *testing.T) {\n\ttests := []struct {\n\t\tin       *MsgBlock // Value to encode\n\t\tbuf      []byte    // Serialized data\n\t\tmax      int       // Max size of fixed buffer to induce errors\n\t\twriteErr error     // Expected write error\n\t\treadErr  error     // Expected read error\n\t}{\n\t\t// Force error in version.\n\t\t{&blockOne, blockOneBytes, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in prev block hash.\n\t\t{&blockOne, blockOneBytes, 4, io.ErrShortWrite, io.EOF},\n\t\t// Force error in merkle root.\n\t\t{&blockOne, blockOneBytes, 36, io.ErrShortWrite, io.EOF},\n\t\t// Force error in timestamp.\n\t\t{&blockOne, blockOneBytes, 68, io.ErrShortWrite, io.EOF},\n\t\t// Force error in difficulty bits.\n\t\t{&blockOne, blockOneBytes, 72, io.ErrShortWrite, io.EOF},\n\t\t// Force error in header nonce.\n\t\t{&blockOne, blockOneBytes, 76, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction count.\n\t\t{&blockOne, blockOneBytes, 80, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transactions.\n\t\t{&blockOne, blockOneBytes, 81, io.ErrShortWrite, io.EOF},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Serialize the block.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.Serialize(w)\n\t\tif err != test.writeErr {\n\t\t\tt.Errorf(\"Serialize #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Deserialize the block.\n\t\tvar block MsgBlock\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = block.Deserialize(r)\n\t\tif err != test.readErr {\n\t\t\tt.Errorf(\"Deserialize #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar txLocBlock MsgBlock\n\t\tbr := bytes.NewBuffer(test.buf[0:test.max])\n\t\t_, err = txLocBlock.DeserializeTxLoc(br)\n\t\tif err != test.readErr {\n\t\t\tt.Errorf(\"DeserializeTxLoc #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestBlockOverflowErrors  performs tests to ensure deserializing blocks which\n// are intentionally crafted to use large values for the number of transactions\n// are handled properly.  This could otherwise potentially be used as an attack\n// vector.\nfunc TestBlockOverflowErrors(t *testing.T) {\n\t// Use protocol version 70001 specifically here instead of the latest\n\t// protocol version because the test data is using bytes encoded with\n\t// that version.\n\tpver := uint32(70001)\n\n\ttests := []struct {\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t\terr  error           // Expected error\n\t}{\n\t\t// Block that claims to have ~uint64(0) transactions.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x01, 0x00, 0x00, 0x00, // Version 1\n\t\t\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock\n\t\t\t\t0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44,\n\t\t\t\t0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67,\n\t\t\t\t0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1,\n\t\t\t\t0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, // MerkleRoot\n\t\t\t\t0x61, 0xbc, 0x66, 0x49, // Timestamp\n\t\t\t\t0xff, 0xff, 0x00, 0x1d, // Bits\n\t\t\t\t0x01, 0xe3, 0x62, 0x99, // Nonce\n\t\t\t\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t\t\t\t0xff, // TxnCount\n\t\t\t}, pver, BaseEncoding, &MessageError{},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Decode from wire format.\n\t\tvar msg MsgBlock\n\t\tr := bytes.NewReader(test.buf)\n\t\terr := msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, reflect.TypeOf(test.err))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Deserialize from wire format.\n\t\tr = bytes.NewReader(test.buf)\n\t\terr = msg.Deserialize(r)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Deserialize #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, reflect.TypeOf(test.err))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Deserialize with transaction location info from wire format.\n\t\tbr := bytes.NewBuffer(test.buf)\n\t\t_, err = msg.DeserializeTxLoc(br)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"DeserializeTxLoc #%d wrong error got: %v, \"+\n\t\t\t\t\"want: %v\", i, err, reflect.TypeOf(test.err))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestBlockSerializeSize performs tests to ensure the serialize size for\n// various blocks is accurate.\nfunc TestBlockSerializeSize(t *testing.T) {\n\t// Block with no transactions.\n\tnoTxBlock := NewMsgBlock(&blockOne.Header)\n\n\ttests := []struct {\n\t\tin   *MsgBlock // Block to encode\n\t\tsize int       // Expected serialized size\n\t}{\n\t\t// Block with no transactions.\n\t\t{noTxBlock, 81},\n\n\t\t// First block in the mainnet block chain.\n\t\t{&blockOne, len(blockOneBytes)},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tserializedSize := test.in.SerializeSize()\n\t\tif serializedSize != test.size {\n\t\t\tt.Errorf(\"MsgBlock.SerializeSize: #%d got: %d, want: \"+\n\t\t\t\t\"%d\", i, serializedSize, test.size)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// blockOne is the first block in the mainnet block chain.\nvar blockOne = MsgBlock{\n\tHeader: BlockHeader{\n\t\tVersion: 1,\n\t\tPrevBlock: chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t}),\n\t\tMerkleRoot: chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t\t\t0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44,\n\t\t\t0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67,\n\t\t\t0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1,\n\t\t\t0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e,\n\t\t}),\n\n\t\tTimestamp: time.Unix(0x4966bc61, 0), // 2009-01-08 20:54:25 -0600 CST\n\t\tBits:      0x1d00ffff,               // 486604799\n\t\tNonce:     0x9962e301,               // 2573394689\n\t},\n\tTransactions: []*MsgTx{\n\t\t{\n\t\t\tVersion: 1,\n\t\t\tTxIn: []*TxIn{\n\t\t\t\t{\n\t\t\t\t\tPreviousOutPoint: OutPoint{\n\t\t\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\t\t\tIndex: 0xffffffff,\n\t\t\t\t\t},\n\t\t\t\t\tSignatureScript: []byte{\n\t\t\t\t\t\t0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04,\n\t\t\t\t\t},\n\t\t\t\t\tSequence: 0xffffffff,\n\t\t\t\t},\n\t\t\t},\n\t\t\tTxOut: []*TxOut{\n\t\t\t\t{\n\t\t\t\t\tValue: 0x12a05f200,\n\t\t\t\t\tPkScript: []byte{\n\t\t\t\t\t\t0x41, // OP_DATA_65\n\t\t\t\t\t\t0x04, 0x96, 0xb5, 0x38, 0xe8, 0x53, 0x51, 0x9c,\n\t\t\t\t\t\t0x72, 0x6a, 0x2c, 0x91, 0xe6, 0x1e, 0xc1, 0x16,\n\t\t\t\t\t\t0x00, 0xae, 0x13, 0x90, 0x81, 0x3a, 0x62, 0x7c,\n\t\t\t\t\t\t0x66, 0xfb, 0x8b, 0xe7, 0x94, 0x7b, 0xe6, 0x3c,\n\t\t\t\t\t\t0x52, 0xda, 0x75, 0x89, 0x37, 0x95, 0x15, 0xd4,\n\t\t\t\t\t\t0xe0, 0xa6, 0x04, 0xf8, 0x14, 0x17, 0x81, 0xe6,\n\t\t\t\t\t\t0x22, 0x94, 0x72, 0x11, 0x66, 0xbf, 0x62, 0x1e,\n\t\t\t\t\t\t0x73, 0xa8, 0x2c, 0xbf, 0x23, 0x42, 0xc8, 0x58,\n\t\t\t\t\t\t0xee, // 65-byte signature\n\t\t\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tLockTime: 0,\n\t\t},\n\t},\n}\n\n// Block one serialized bytes.\nvar blockOneBytes = []byte{\n\t0x01, 0x00, 0x00, 0x00, // Version 1\n\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock\n\t0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44,\n\t0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67,\n\t0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1,\n\t0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, // MerkleRoot\n\t0x61, 0xbc, 0x66, 0x49, // Timestamp\n\t0xff, 0xff, 0x00, 0x1d, // Bits\n\t0x01, 0xe3, 0x62, 0x99, // Nonce\n\t0x01,                   // TxnCount\n\t0x01, 0x00, 0x00, 0x00, // Version\n\t0x01, // Varint for number of transaction inputs\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash\n\t0xff, 0xff, 0xff, 0xff, // Previous output index\n\t0x07,                                     // Varint for length of signature script\n\t0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04, // Signature script (coinbase)\n\t0xff, 0xff, 0xff, 0xff, // Sequence\n\t0x01,                                           // Varint for number of transaction outputs\n\t0x00, 0xf2, 0x05, 0x2a, 0x01, 0x00, 0x00, 0x00, // Transaction amount\n\t0x43, // Varint for length of pk script\n\t0x41, // OP_DATA_65\n\t0x04, 0x96, 0xb5, 0x38, 0xe8, 0x53, 0x51, 0x9c,\n\t0x72, 0x6a, 0x2c, 0x91, 0xe6, 0x1e, 0xc1, 0x16,\n\t0x00, 0xae, 0x13, 0x90, 0x81, 0x3a, 0x62, 0x7c,\n\t0x66, 0xfb, 0x8b, 0xe7, 0x94, 0x7b, 0xe6, 0x3c,\n\t0x52, 0xda, 0x75, 0x89, 0x37, 0x95, 0x15, 0xd4,\n\t0xe0, 0xa6, 0x04, 0xf8, 0x14, 0x17, 0x81, 0xe6,\n\t0x22, 0x94, 0x72, 0x11, 0x66, 0xbf, 0x62, 0x1e,\n\t0x73, 0xa8, 0x2c, 0xbf, 0x23, 0x42, 0xc8, 0x58,\n\t0xee,                   // 65-byte uncompressed public key\n\t0xac,                   // OP_CHECKSIG\n\t0x00, 0x00, 0x00, 0x00, // Lock time\n}\n\n// Transaction location information for block one transactions.\nvar blockOneTxLocs = []TxLoc{\n\t{TxStart: 81, TxLen: 134},\n}\n"
  },
  {
    "path": "wire/msgcfcheckpt.go",
    "content": "// Copyright (c) 2018 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nconst (\n\t// CFCheckptInterval is the gap (in number of blocks) between each\n\t// filter header checkpoint.\n\tCFCheckptInterval = 1000\n\n\t// maxCFHeadersLen is the max number of filter headers we will attempt\n\t// to decode.\n\tmaxCFHeadersLen = 100000\n\n\t// maxCFCheckptPayload calculates the maximum reasonable payload size\n\t// for CF checkpoint messages.\n\t//\n\t// Calculation: 1 byte (filter type) + 32 bytes (stop hash) +\n\t// 5 bytes (max varint) + (maxCFHeadersLen * 32 bytes per hash)\n\tmaxCFCheckptPayload = 1 + 32 + 5 + (maxCFHeadersLen * 32)\n)\n\n// ErrInsaneCFHeaderCount signals that we were asked to decode an\n// unreasonable number of cfilter headers.\nvar ErrInsaneCFHeaderCount = errors.New(\n\t\"refusing to decode unreasonable number of filter headers\")\n\n// MsgCFCheckpt implements the Message interface and represents a bitcoin\n// cfcheckpt message.  It is used to deliver committed filter header information\n// in response to a getcfcheckpt message (MsgGetCFCheckpt). See MsgGetCFCheckpt\n// for details on requesting the headers.\ntype MsgCFCheckpt struct {\n\tFilterType    FilterType\n\tStopHash      chainhash.Hash\n\tFilterHeaders []*chainhash.Hash\n}\n\n// AddCFHeader adds a new committed filter header to the message.\nfunc (msg *MsgCFCheckpt) AddCFHeader(header *chainhash.Hash) error {\n\tif len(msg.FilterHeaders) == cap(msg.FilterHeaders) {\n\t\tstr := fmt.Sprintf(\"FilterHeaders has insufficient capacity for \"+\n\t\t\t\"additional header: len = %d\", len(msg.FilterHeaders))\n\t\treturn messageError(\"MsgCFCheckpt.AddCFHeader\", str)\n\t}\n\n\tmsg.FilterHeaders = append(msg.FilterHeaders, header)\n\treturn nil\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgCFCheckpt) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\t// Read filter type\n\tif _, err := io.ReadFull(r, buf[:1]); err != nil {\n\t\treturn err\n\t}\n\tmsg.FilterType = FilterType(buf[0])\n\n\t// Read stop hash\n\tif _, err := io.ReadFull(r, msg.StopHash[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Read number of filter headers\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Refuse to decode an insane number of cfheaders.\n\tif count > maxCFHeadersLen {\n\t\treturn ErrInsaneCFHeaderCount\n\t}\n\n\tif count == 0 {\n\t\tmsg.FilterHeaders = make([]*chainhash.Hash, 0)\n\t\treturn nil\n\t}\n\n\t// Optimize memory allocation by creating a single backing array for\n\t// all hashes. This reduces GC pressure and improves cache locality.\n\thashes := make([]chainhash.Hash, count)\n\tmsg.FilterHeaders = make([]*chainhash.Hash, count)\n\n\t// Now we'll read all the hashes directly into the backing array we've\n\t// created above. We'll then point the underlying filter header hashes\n\t// into this backing array.\n\tfor i := uint64(0); i < count; i++ {\n\t\tif _, err := io.ReadFull(r, hashes[i][:]); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.FilterHeaders[i] = &hashes[i]\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgCFCheckpt) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\t// Write filter type\n\tbuf[0] = byte(msg.FilterType)\n\tif _, err := w.Write(buf[:1]); err != nil {\n\t\treturn err\n\t}\n\n\t// Write stop hash\n\tif _, err := w.Write(msg.StopHash[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Write length of FilterHeaders slice\n\tcount := len(msg.FilterHeaders)\n\terr := WriteVarIntBuf(w, pver, uint64(count), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, cfh := range msg.FilterHeaders {\n\t\t_, err := w.Write(cfh[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Deserialize decodes a filter header from r into the receiver using a format\n// that is suitable for long-term storage such as a database. This function\n// differs from BtcDecode in that BtcDecode decodes from the bitcoin wire\n// protocol as it was sent across the network.  The wire encoding can\n// technically differ depending on the protocol version and doesn't even really\n// need to match the format of a stored filter header at all. As of the time\n// this comment was written, the encoded filter header is the same in both\n// instances, but there is a distinct difference and separating the two allows\n// the API to be flexible enough to deal with changes.\nfunc (msg *MsgCFCheckpt) Deserialize(r io.Reader) error {\n\t// At the current time, there is no difference between the wire encoding\n\t// and the stable long-term storage format.  As a result, make use of\n\t// BtcDecode.\n\treturn msg.BtcDecode(r, 0, BaseEncoding)\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgCFCheckpt) Command() string {\n\treturn CmdCFCheckpt\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver. This is part of the Message interface implementation.\nfunc (msg *MsgCFCheckpt) MaxPayloadLength(pver uint32) uint32 {\n\t// Use a more precise calculation based on the maximum number of\n\t// filter headers we support. No no reason to read more than we'll\n\t// process in BtcDecode.\n\treturn maxCFCheckptPayload\n}\n\n// NewMsgCFCheckpt returns a new bitcoin cfheaders message that conforms to the\n// Message interface. See MsgCFCheckpt for details.\nfunc NewMsgCFCheckpt(filterType FilterType, stopHash *chainhash.Hash,\n\theadersCount int) *MsgCFCheckpt {\n\n\t// We pre-allocate with an exact capacity when count is known to avoid\n\t// slice growth during message construction.\n\treturn &MsgCFCheckpt{\n\t\tFilterType:    filterType,\n\t\tStopHash:      *stopHash,\n\t\tFilterHeaders: make([]*chainhash.Hash, 0, headersCount),\n\t}\n}\n"
  },
  {
    "path": "wire/msgcfcheckpt_bench_test.go",
    "content": "// Copyright (c) 2018 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"math/rand\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// BenchmarkMsgCFCheckptDecode benchmarks decoding of MsgCFCheckpt messages\n// to measure the performance improvements from optimized memory allocation.\nfunc BenchmarkMsgCFCheckptDecode(b *testing.B) {\n\tpver := ProtocolVersion\n\n\t// Test with varying number of headers: 1k, 10k, 100k.\n\theaderCounts := []int{1000, 10000, 100000}\n\n\tfor _, numHeaders := range headerCounts {\n\t\tb.Run(fmt.Sprintf(\"headers_%d\", numHeaders), func(b *testing.B) {\n\t\t\tvar buf bytes.Buffer\n\t\t\tmsg := NewMsgCFCheckpt(\n\t\t\t\tGCSFilterRegular, &chainhash.Hash{}, numHeaders,\n\t\t\t)\n\n\t\t\trng := rand.New(rand.NewSource(12345))\n\t\t\tfor i := 0; i < numHeaders; i++ {\n\t\t\t\thash := chainhash.Hash{}\n\t\t\t\trng.Read(hash[:])\n\t\t\t\tmsg.AddCFHeader(&hash)\n\t\t\t}\n\n\t\t\terr := msg.BtcEncode(&buf, pver, BaseEncoding)\n\t\t\tif err != nil {\n\t\t\t\tb.Fatal(err)\n\t\t\t}\n\n\t\t\tencodedMsg := buf.Bytes()\n\n\t\t\tb.ResetTimer()\n\t\t\tb.ReportAllocs()\n\n\t\t\tfor i := 0; i < b.N; i++ {\n\t\t\t\tr := bytes.NewReader(encodedMsg)\n\n\t\t\t\tvar msg MsgCFCheckpt\n\t\t\t\terr := msg.BtcDecode(r, pver, BaseEncoding)\n\t\t\t\tif err != nil {\n\t\t\t\t\tb.Fatal(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\n// BenchmarkMsgCFCheckptEncode benchmarks encoding of MsgCFCheckpt messages.\nfunc BenchmarkMsgCFCheckptEncode(b *testing.B) {\n\tpver := ProtocolVersion\n\n\t// Test with varying number of headers: 1k, 10k, 100k.\n\theaderCounts := []int{1000, 10000, 100000}\n\n\tfor _, numHeaders := range headerCounts {\n\t\tb.Run(fmt.Sprintf(\"headers_%d\", numHeaders), func(b *testing.B) {\n\t\t\tmsg := NewMsgCFCheckpt(\n\t\t\t\tGCSFilterRegular, &chainhash.Hash{}, numHeaders,\n\t\t\t)\n\n\t\t\trng := rand.New(rand.NewSource(12345))\n\t\t\tfor i := 0; i < numHeaders; i++ {\n\t\t\t\thash := chainhash.Hash{}\n\t\t\t\trng.Read(hash[:])\n\t\t\t\tmsg.AddCFHeader(&hash)\n\t\t\t}\n\n\t\t\tb.ResetTimer()\n\t\t\tb.ReportAllocs()\n\n\t\t\tfor i := 0; i < b.N; i++ {\n\t\t\t\tvar buf bytes.Buffer\n\t\t\t\terr := msg.BtcEncode(&buf, pver, BaseEncoding)\n\t\t\t\tif err != nil {\n\t\t\t\t\tb.Fatal(err)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\n// BenchmarkMsgCFCheckptDecodeEmpty benchmarks decoding empty checkpoint\n// messages to ensure edge cases are handled efficiently.\nfunc BenchmarkMsgCFCheckptDecodeEmpty(b *testing.B) {\n\tpver := ProtocolVersion\n\n\tvar buf bytes.Buffer\n\tmsg := NewMsgCFCheckpt(GCSFilterRegular, &chainhash.Hash{}, 0)\n\tif err := msg.BtcEncode(&buf, pver, BaseEncoding); err != nil {\n\t\tb.Fatal(err)\n\t}\n\tencodedMsg := buf.Bytes()\n\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\n\tfor i := 0; i < b.N; i++ {\n\t\tr := bytes.NewReader(encodedMsg)\n\t\tvar msg MsgCFCheckpt\n\t\tif err := msg.BtcDecode(r, pver, BaseEncoding); err != nil {\n\t\t\tb.Fatal(err)\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "wire/msgcfheaders.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nconst (\n\t// MaxCFHeaderPayload is the maximum byte size of a committed\n\t// filter header.\n\tMaxCFHeaderPayload = chainhash.HashSize\n\n\t// MaxCFHeadersPerMsg is the maximum number of committed filter headers\n\t// that can be in a single bitcoin cfheaders message.\n\tMaxCFHeadersPerMsg = 2000\n)\n\n// MsgCFHeaders implements the Message interface and represents a bitcoin\n// cfheaders message.  It is used to deliver committed filter header information\n// in response to a getcfheaders message (MsgGetCFHeaders). The maximum number\n// of committed filter headers per message is currently 2000. See\n// MsgGetCFHeaders for details on requesting the headers.\ntype MsgCFHeaders struct {\n\tFilterType       FilterType\n\tStopHash         chainhash.Hash\n\tPrevFilterHeader chainhash.Hash\n\tFilterHashes     []*chainhash.Hash\n}\n\n// AddCFHash adds a new filter hash to the message.\nfunc (msg *MsgCFHeaders) AddCFHash(hash *chainhash.Hash) error {\n\tif len(msg.FilterHashes)+1 > MaxCFHeadersPerMsg {\n\t\tstr := fmt.Sprintf(\"too many block headers in message [max %v]\",\n\t\t\tMaxBlockHeadersPerMsg)\n\t\treturn messageError(\"MsgCFHeaders.AddCFHash\", str)\n\t}\n\n\tmsg.FilterHashes = append(msg.FilterHashes, hash)\n\treturn nil\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgCFHeaders) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\t// Read filter type\n\tif _, err := io.ReadFull(r, buf[:1]); err != nil {\n\t\treturn err\n\t}\n\tmsg.FilterType = FilterType(buf[0])\n\n\t// Read stop hash\n\tif _, err := io.ReadFull(r, msg.StopHash[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Read prev filter header\n\tif _, err := io.ReadFull(r, msg.PrevFilterHeader[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Read number of filter headers\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Limit to max committed filter headers per message.\n\tif count > MaxCFHeadersPerMsg {\n\t\tstr := fmt.Sprintf(\"too many committed filter headers for \"+\n\t\t\t\"message [count %v, max %v]\", count,\n\t\t\tMaxBlockHeadersPerMsg)\n\t\treturn messageError(\"MsgCFHeaders.BtcDecode\", str)\n\t}\n\n\t// Create a contiguous slice of hashes to deserialize into in order to\n\t// reduce the number of allocations.\n\tmsg.FilterHashes = make([]*chainhash.Hash, 0, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\tvar cfh chainhash.Hash\n\t\t_, err := io.ReadFull(r, cfh[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.AddCFHash(&cfh)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgCFHeaders) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error {\n\tcount := len(msg.FilterHashes)\n\tif count > MaxCFHeadersPerMsg {\n\t\tstr := fmt.Sprintf(\"too many committed filter headers for \"+\n\t\t\t\"message [count %v, max %v]\", count,\n\t\t\tMaxBlockHeadersPerMsg)\n\t\treturn messageError(\"MsgCFHeaders.BtcEncode\", str)\n\t}\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\t// Write filter type\n\tbuf[0] = byte(msg.FilterType)\n\tif _, err := w.Write(buf[:1]); err != nil {\n\t\treturn err\n\t}\n\n\t// Write stop hash\n\tif _, err := w.Write(msg.StopHash[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Write prev filter header\n\tif _, err := w.Write(msg.PrevFilterHeader[:]); err != nil {\n\t\treturn err\n\t}\n\n\terr := WriteVarIntBuf(w, pver, uint64(count), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, cfh := range msg.FilterHashes {\n\t\t_, err := w.Write(cfh[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Deserialize decodes a filter header from r into the receiver using a format\n// that is suitable for long-term storage such as a database. This function\n// differs from BtcDecode in that BtcDecode decodes from the bitcoin wire\n// protocol as it was sent across the network.  The wire encoding can\n// technically differ depending on the protocol version and doesn't even really\n// need to match the format of a stored filter header at all. As of the time\n// this comment was written, the encoded filter header is the same in both\n// instances, but there is a distinct difference and separating the two allows\n// the API to be flexible enough to deal with changes.\nfunc (msg *MsgCFHeaders) Deserialize(r io.Reader) error {\n\t// At the current time, there is no difference between the wire encoding\n\t// and the stable long-term storage format.  As a result, make use of\n\t// BtcDecode.\n\treturn msg.BtcDecode(r, 0, BaseEncoding)\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgCFHeaders) Command() string {\n\treturn CmdCFHeaders\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver. This is part of the Message interface implementation.\nfunc (msg *MsgCFHeaders) MaxPayloadLength(pver uint32) uint32 {\n\t// Hash size + filter type + num headers (varInt) +\n\t// (header size * max headers).\n\treturn 1 + chainhash.HashSize + chainhash.HashSize + MaxVarIntPayload +\n\t\t(MaxCFHeaderPayload * MaxCFHeadersPerMsg)\n}\n\n// NewMsgCFHeaders returns a new bitcoin cfheaders message that conforms to\n// the Message interface. See MsgCFHeaders for details.\nfunc NewMsgCFHeaders() *MsgCFHeaders {\n\treturn &MsgCFHeaders{\n\t\tFilterHashes: make([]*chainhash.Hash, 0, MaxCFHeadersPerMsg),\n\t}\n}\n"
  },
  {
    "path": "wire/msgcfilter.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// FilterType is used to represent a filter type.\ntype FilterType uint8\n\nconst (\n\t// GCSFilterRegular is the regular filter type.\n\tGCSFilterRegular FilterType = iota\n)\n\nconst (\n\t// MaxCFilterDataSize is the maximum byte size of a committed filter.\n\t// The maximum size is currently defined as 256KiB.\n\tMaxCFilterDataSize = 256 * 1024\n)\n\n// MsgCFilter implements the Message interface and represents a bitcoin cfilter\n// message. It is used to deliver a committed filter in response to a\n// getcfilters (MsgGetCFilters) message.\ntype MsgCFilter struct {\n\tFilterType FilterType\n\tBlockHash  chainhash.Hash\n\tData       []byte\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgCFilter) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error {\n\t// Read filter type\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tif _, err := io.ReadFull(r, buf[:1]); err != nil {\n\t\treturn err\n\t}\n\tmsg.FilterType = FilterType(buf[0])\n\n\t// Read the hash of the filter's block\n\tif _, err := io.ReadFull(r, msg.BlockHash[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Read filter data\n\tvar err error\n\tmsg.Data, err = ReadVarBytesBuf(r, pver, buf, MaxCFilterDataSize,\n\t\t\"cfilter data\")\n\treturn err\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgCFilter) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error {\n\tsize := len(msg.Data)\n\tif size > MaxCFilterDataSize {\n\t\tstr := fmt.Sprintf(\"cfilter size too large for message \"+\n\t\t\t\"[size %v, max %v]\", size, MaxCFilterDataSize)\n\t\treturn messageError(\"MsgCFilter.BtcEncode\", str)\n\t}\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tbuf[0] = byte(msg.FilterType)\n\tif _, err := w.Write(buf[:1]); err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := w.Write(msg.BlockHash[:]); err != nil {\n\t\treturn err\n\t}\n\n\terr := WriteVarBytesBuf(w, pver, msg.Data, buf)\n\treturn err\n}\n\n// Deserialize decodes a filter from r into the receiver using a format that is\n// suitable for long-term storage such as a database. This function differs\n// from BtcDecode in that BtcDecode decodes from the bitcoin wire protocol as\n// it was sent across the network.  The wire encoding can technically differ\n// depending on the protocol version and doesn't even really need to match the\n// format of a stored filter at all. As of the time this comment was written,\n// the encoded filter is the same in both instances, but there is a distinct\n// difference and separating the two allows the API to be flexible enough to\n// deal with changes.\nfunc (msg *MsgCFilter) Deserialize(r io.Reader) error {\n\t// At the current time, there is no difference between the wire encoding\n\t// and the stable long-term storage format.  As a result, make use of\n\t// BtcDecode.\n\treturn msg.BtcDecode(r, 0, BaseEncoding)\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgCFilter) Command() string {\n\treturn CmdCFilter\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgCFilter) MaxPayloadLength(pver uint32) uint32 {\n\treturn uint32(VarIntSerializeSize(MaxCFilterDataSize)) +\n\t\tMaxCFilterDataSize + chainhash.HashSize + 1\n}\n\n// NewMsgCFilter returns a new bitcoin cfilter message that conforms to the\n// Message interface. See MsgCFilter for details.\nfunc NewMsgCFilter(filterType FilterType, blockHash *chainhash.Hash,\n\tdata []byte) *MsgCFilter {\n\treturn &MsgCFilter{\n\t\tFilterType: filterType,\n\t\tBlockHash:  *blockHash,\n\t\tData:       data,\n\t}\n}\n"
  },
  {
    "path": "wire/msgfeefilter.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MsgFeeFilter implements the Message interface and represents a bitcoin\n// feefilter message.  It is used to request the receiving peer does not\n// announce any transactions below the specified minimum fee rate.\n//\n// This message was not added until protocol versions starting with\n// FeeFilterVersion.\ntype MsgFeeFilter struct {\n\tMinFee int64\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgFeeFilter) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tif pver < FeeFilterVersion {\n\t\tstr := fmt.Sprintf(\"feefilter message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgFeeFilter.BtcDecode\", str)\n\t}\n\n\treturn readElement(r, &msg.MinFee)\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgFeeFilter) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tif pver < FeeFilterVersion {\n\t\tstr := fmt.Sprintf(\"feefilter message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgFeeFilter.BtcEncode\", str)\n\t}\n\n\treturn writeElement(w, msg.MinFee)\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgFeeFilter) Command() string {\n\treturn CmdFeeFilter\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgFeeFilter) MaxPayloadLength(pver uint32) uint32 {\n\treturn 8\n}\n\n// NewMsgFeeFilter returns a new bitcoin feefilter message that conforms to\n// the Message interface.  See MsgFeeFilter for details.\nfunc NewMsgFeeFilter(minfee int64) *MsgFeeFilter {\n\treturn &MsgFeeFilter{\n\t\tMinFee: minfee,\n\t}\n}\n"
  },
  {
    "path": "wire/msgfeefilter_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"math/rand\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestFeeFilterLatest tests the MsgFeeFilter API against the latest protocol version.\nfunc TestFeeFilterLatest(t *testing.T) {\n\tpver := ProtocolVersion\n\n\tminfee := rand.Int63()\n\tmsg := NewMsgFeeFilter(minfee)\n\tif msg.MinFee != minfee {\n\t\tt.Errorf(\"NewMsgFeeFilter: wrong minfee - got %v, want %v\",\n\t\t\tmsg.MinFee, minfee)\n\t}\n\n\t// Ensure the command is expected value.\n\twantCmd := \"feefilter\"\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgFeeFilter: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\twantPayload := uint32(8)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Test encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, BaseEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgFeeFilter failed %v err <%v>\", msg, err)\n\t}\n\n\t// Test decode with latest protocol version.\n\treadmsg := NewMsgFeeFilter(0)\n\terr = readmsg.BtcDecode(&buf, pver, BaseEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgFeeFilter failed [%v] err <%v>\", buf, err)\n\t}\n\n\t// Ensure minfee is the same.\n\tif msg.MinFee != readmsg.MinFee {\n\t\tt.Errorf(\"Should get same minfee for protocol version %d\", pver)\n\t}\n}\n\n// TestFeeFilterWire tests the MsgFeeFilter wire encode and decode for various protocol\n// versions.\nfunc TestFeeFilterWire(t *testing.T) {\n\ttests := []struct {\n\t\tin   MsgFeeFilter // Message to encode\n\t\tout  MsgFeeFilter // Expected decoded message\n\t\tbuf  []byte       // Wire encoding\n\t\tpver uint32       // Protocol version for wire encoding\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\tMsgFeeFilter{MinFee: 123123}, // 0x1e0f3\n\t\t\tMsgFeeFilter{MinFee: 123123}, // 0x1e0f3\n\t\t\t[]byte{0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00},\n\t\t\tProtocolVersion,\n\t\t},\n\n\t\t// Protocol version FeeFilterVersion\n\t\t{\n\t\t\tMsgFeeFilter{MinFee: 456456}, // 0x6f708\n\t\t\tMsgFeeFilter{MinFee: 456456}, // 0x6f708\n\t\t\t[]byte{0x08, 0xf7, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00},\n\t\t\tFeeFilterVersion,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, BaseEncoding)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgFeeFilter\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, BaseEncoding)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestFeeFilterWireErrors performs negative tests against wire encode and decode\n// of MsgFeeFilter to confirm error paths work correctly.\nfunc TestFeeFilterWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\tpverNoFeeFilter := FeeFilterVersion - 1\n\twireErr := &MessageError{}\n\n\tbaseFeeFilter := NewMsgFeeFilter(123123) // 0x1e0f3\n\tbaseFeeFilterEncoded := []byte{\n\t\t0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t}\n\n\ttests := []struct {\n\t\tin       *MsgFeeFilter // Value to encode\n\t\tbuf      []byte        // Wire encoding\n\t\tpver     uint32        // Protocol version for wire encoding\n\t\tmax      int           // Max size of fixed buffer to induce errors\n\t\twriteErr error         // Expected write error\n\t\treadErr  error         // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t// Force error in minfee.\n\t\t{baseFeeFilter, baseFeeFilterEncoded, pver, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error due to unsupported protocol version.\n\t\t{baseFeeFilter, baseFeeFilterEncoded, pverNoFeeFilter, 4, wireErr, wireErr},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, BaseEncoding)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgFeeFilter\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, BaseEncoding)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "wire/msgfilteradd.go",
    "content": "// Copyright (c) 2014-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\nconst (\n\t// MaxFilterAddDataSize is the maximum byte size of a data\n\t// element to add to the Bloom filter.  It is equal to the\n\t// maximum element size of a script.\n\tMaxFilterAddDataSize = 520\n)\n\n// MsgFilterAdd implements the Message interface and represents a bitcoin\n// filteradd message.  It is used to add a data element to an existing Bloom\n// filter.\n//\n// This message was not added until protocol version BIP0037Version.\ntype MsgFilterAdd struct {\n\tData []byte\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgFilterAdd) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tif pver < BIP0037Version {\n\t\tstr := fmt.Sprintf(\"filteradd message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgFilterAdd.BtcDecode\", str)\n\t}\n\n\tvar err error\n\tmsg.Data, err = ReadVarBytes(r, pver, MaxFilterAddDataSize,\n\t\t\"filteradd data\")\n\treturn err\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgFilterAdd) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tif pver < BIP0037Version {\n\t\tstr := fmt.Sprintf(\"filteradd message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgFilterAdd.BtcEncode\", str)\n\t}\n\n\tsize := len(msg.Data)\n\tif size > MaxFilterAddDataSize {\n\t\tstr := fmt.Sprintf(\"filteradd size too large for message \"+\n\t\t\t\"[size %v, max %v]\", size, MaxFilterAddDataSize)\n\t\treturn messageError(\"MsgFilterAdd.BtcEncode\", str)\n\t}\n\n\treturn WriteVarBytes(w, pver, msg.Data)\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgFilterAdd) Command() string {\n\treturn CmdFilterAdd\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgFilterAdd) MaxPayloadLength(pver uint32) uint32 {\n\treturn uint32(VarIntSerializeSize(MaxFilterAddDataSize)) +\n\t\tMaxFilterAddDataSize\n}\n\n// NewMsgFilterAdd returns a new bitcoin filteradd message that conforms to the\n// Message interface.  See MsgFilterAdd for details.\nfunc NewMsgFilterAdd(data []byte) *MsgFilterAdd {\n\treturn &MsgFilterAdd{\n\t\tData: data,\n\t}\n}\n"
  },
  {
    "path": "wire/msgfilteradd_test.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n)\n\n// TestFilterAddLatest tests the MsgFilterAdd API against the latest protocol\n// version.\nfunc TestFilterAddLatest(t *testing.T) {\n\tenc := BaseEncoding\n\tpver := ProtocolVersion\n\n\tdata := []byte{0x01, 0x02}\n\tmsg := NewMsgFilterAdd(data)\n\n\t// Ensure the command is expected value.\n\twantCmd := \"filteradd\"\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgFilterAdd: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\twantPayload := uint32(523)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Test encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgFilterAdd failed %v err <%v>\", msg, err)\n\t}\n\n\t// Test decode with latest protocol version.\n\tvar readmsg MsgFilterAdd\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgFilterAdd failed [%v] err <%v>\", buf, err)\n\t}\n}\n\n// TestFilterAddCrossProtocol tests the MsgFilterAdd API when encoding with the\n// latest protocol version and decoding with BIP0031Version.\nfunc TestFilterAddCrossProtocol(t *testing.T) {\n\tdata := []byte{0x01, 0x02}\n\tmsg := NewMsgFilterAdd(data)\n\tif !bytes.Equal(msg.Data, data) {\n\t\tt.Errorf(\"should get same data back out\")\n\t}\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, ProtocolVersion, LatestEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgFilterAdd failed %v err <%v>\", msg, err)\n\t}\n\n\t// Decode with old protocol version.\n\tvar readmsg MsgFilterAdd\n\terr = readmsg.BtcDecode(&buf, BIP0031Version, LatestEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgFilterAdd succeeded when it shouldn't \"+\n\t\t\t\"have %v\", msg)\n\t}\n\n\t// Since one of the protocol versions doesn't support the filteradd\n\t// message, make sure the data didn't get encoded and decoded back out.\n\tif bytes.Equal(msg.Data, readmsg.Data) {\n\t\tt.Error(\"should not get same data for cross protocol\")\n\t}\n\n}\n\n// TestFilterAddMaxDataSize tests the MsgFilterAdd API maximum data size.\nfunc TestFilterAddMaxDataSize(t *testing.T) {\n\tdata := bytes.Repeat([]byte{0xff}, 521)\n\tmsg := NewMsgFilterAdd(data)\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, ProtocolVersion, LatestEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgFilterAdd succeeded when it shouldn't \"+\n\t\t\t\"have %v\", msg)\n\t}\n\n\t// Decode with latest protocol version.\n\treadbuf := bytes.NewReader(data)\n\terr = msg.BtcDecode(readbuf, ProtocolVersion, LatestEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgFilterAdd succeeded when it shouldn't \"+\n\t\t\t\"have %v\", msg)\n\t}\n}\n\n// TestFilterAddWireErrors performs negative tests against wire encode and decode\n// of MsgFilterAdd to confirm error paths work correctly.\nfunc TestFilterAddWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\tpverNoFilterAdd := BIP0037Version - 1\n\twireErr := &MessageError{}\n\n\tbaseData := []byte{0x01, 0x02, 0x03, 0x04}\n\tbaseFilterAdd := NewMsgFilterAdd(baseData)\n\tbaseFilterAddEncoded := append([]byte{0x04}, baseData...)\n\n\ttests := []struct {\n\t\tin       *MsgFilterAdd   // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t// Force error in data size.\n\t\t{\n\t\t\tbaseFilterAdd, baseFilterAddEncoded, pver, BaseEncoding, 0,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in data.\n\t\t{\n\t\t\tbaseFilterAdd, baseFilterAddEncoded, pver, BaseEncoding, 1,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error due to unsupported protocol version.\n\t\t{\n\t\t\tbaseFilterAdd, baseFilterAddEncoded, pverNoFilterAdd, BaseEncoding, 5,\n\t\t\twireErr, wireErr,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgFilterAdd\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msgfilterclear.go",
    "content": "// Copyright (c) 2014-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MsgFilterClear implements the Message interface and represents a bitcoin\n// filterclear message which is used to reset a Bloom filter.\n//\n// This message was not added until protocol version BIP0037Version and has\n// no payload.\ntype MsgFilterClear struct{}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgFilterClear) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tif pver < BIP0037Version {\n\t\tstr := fmt.Sprintf(\"filterclear message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgFilterClear.BtcDecode\", str)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgFilterClear) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tif pver < BIP0037Version {\n\t\tstr := fmt.Sprintf(\"filterclear message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgFilterClear.BtcEncode\", str)\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgFilterClear) Command() string {\n\treturn CmdFilterClear\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgFilterClear) MaxPayloadLength(pver uint32) uint32 {\n\treturn 0\n}\n\n// NewMsgFilterClear returns a new bitcoin filterclear message that conforms to the Message\n// interface.  See MsgFilterClear for details.\nfunc NewMsgFilterClear() *MsgFilterClear {\n\treturn &MsgFilterClear{}\n}\n"
  },
  {
    "path": "wire/msgfilterclear_test.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestFilterCLearLatest tests the MsgFilterClear API against the latest\n// protocol version.\nfunc TestFilterClearLatest(t *testing.T) {\n\tpver := ProtocolVersion\n\n\tmsg := NewMsgFilterClear()\n\n\t// Ensure the command is expected value.\n\twantCmd := \"filterclear\"\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgFilterClear: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\twantPayload := uint32(0)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n}\n\n// TestFilterClearCrossProtocol tests the MsgFilterClear API when encoding with\n// the latest protocol version and decoding with BIP0031Version.\nfunc TestFilterClearCrossProtocol(t *testing.T) {\n\tmsg := NewMsgFilterClear()\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, ProtocolVersion, LatestEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgFilterClear failed %v err <%v>\", msg, err)\n\t}\n\n\t// Decode with old protocol version.\n\tvar readmsg MsgFilterClear\n\terr = readmsg.BtcDecode(&buf, BIP0031Version, LatestEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgFilterClear succeeded when it \"+\n\t\t\t\"shouldn't have %v\", msg)\n\t}\n}\n\n// TestFilterClearWire tests the MsgFilterClear wire encode and decode for\n// various protocol versions.\nfunc TestFilterClearWire(t *testing.T) {\n\tmsgFilterClear := NewMsgFilterClear()\n\tmsgFilterClearEncoded := []byte{}\n\n\ttests := []struct {\n\t\tin   *MsgFilterClear // Message to encode\n\t\tout  *MsgFilterClear // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\tmsgFilterClear,\n\t\t\tmsgFilterClear,\n\t\t\tmsgFilterClearEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0037Version + 1.\n\t\t{\n\t\t\tmsgFilterClear,\n\t\t\tmsgFilterClear,\n\t\t\tmsgFilterClearEncoded,\n\t\t\tBIP0037Version + 1,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0037Version.\n\t\t{\n\t\t\tmsgFilterClear,\n\t\t\tmsgFilterClear,\n\t\t\tmsgFilterClearEncoded,\n\t\t\tBIP0037Version,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgFilterClear\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestFilterClearWireErrors performs negative tests against wire encode and\n// decode of MsgFilterClear to confirm error paths work correctly.\nfunc TestFilterClearWireErrors(t *testing.T) {\n\tpverNoFilterClear := BIP0037Version - 1\n\twireErr := &MessageError{}\n\n\tbaseFilterClear := NewMsgFilterClear()\n\tbaseFilterClearEncoded := []byte{}\n\n\ttests := []struct {\n\t\tin       *MsgFilterClear // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Force error due to unsupported protocol version.\n\t\t{\n\t\t\tbaseFilterClear, baseFilterClearEncoded,\n\t\t\tpverNoFilterClear, BaseEncoding, 4, wireErr, wireErr,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgFilterClear\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "wire/msgfilterload.go",
    "content": "// Copyright (c) 2014-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// BloomUpdateType specifies how the filter is updated when a match is found\ntype BloomUpdateType uint8\n\nconst (\n\t// BloomUpdateNone indicates the filter is not adjusted when a match is\n\t// found.\n\tBloomUpdateNone BloomUpdateType = 0\n\n\t// BloomUpdateAll indicates if the filter matches any data element in a\n\t// public key script, the outpoint is serialized and inserted into the\n\t// filter.\n\tBloomUpdateAll BloomUpdateType = 1\n\n\t// BloomUpdateP2PubkeyOnly indicates if the filter matches a data\n\t// element in a public key script and the script is of the standard\n\t// pay-to-pubkey or multisig, the outpoint is serialized and inserted\n\t// into the filter.\n\tBloomUpdateP2PubkeyOnly BloomUpdateType = 2\n)\n\nconst (\n\t// MaxFilterLoadHashFuncs is the maximum number of hash functions to\n\t// load into the Bloom filter.\n\tMaxFilterLoadHashFuncs = 50\n\n\t// MaxFilterLoadFilterSize is the maximum size in bytes a filter may be.\n\tMaxFilterLoadFilterSize = 36000\n)\n\n// MsgFilterLoad implements the Message interface and represents a bitcoin\n// filterload message which is used to reset a Bloom filter.\n//\n// This message was not added until protocol version BIP0037Version.\ntype MsgFilterLoad struct {\n\tFilter    []byte\n\tHashFuncs uint32\n\tTweak     uint32\n\tFlags     BloomUpdateType\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgFilterLoad) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tif pver < BIP0037Version {\n\t\tstr := fmt.Sprintf(\"filterload message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgFilterLoad.BtcDecode\", str)\n\t}\n\n\tvar err error\n\tmsg.Filter, err = ReadVarBytes(r, pver, MaxFilterLoadFilterSize,\n\t\t\"filterload filter size\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = readElements(r, &msg.HashFuncs, &msg.Tweak, &msg.Flags)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif msg.HashFuncs > MaxFilterLoadHashFuncs {\n\t\tstr := fmt.Sprintf(\"too many filter hash functions for message \"+\n\t\t\t\"[count %v, max %v]\", msg.HashFuncs, MaxFilterLoadHashFuncs)\n\t\treturn messageError(\"MsgFilterLoad.BtcDecode\", str)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgFilterLoad) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tif pver < BIP0037Version {\n\t\tstr := fmt.Sprintf(\"filterload message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgFilterLoad.BtcEncode\", str)\n\t}\n\n\tsize := len(msg.Filter)\n\tif size > MaxFilterLoadFilterSize {\n\t\tstr := fmt.Sprintf(\"filterload filter size too large for message \"+\n\t\t\t\"[size %v, max %v]\", size, MaxFilterLoadFilterSize)\n\t\treturn messageError(\"MsgFilterLoad.BtcEncode\", str)\n\t}\n\n\tif msg.HashFuncs > MaxFilterLoadHashFuncs {\n\t\tstr := fmt.Sprintf(\"too many filter hash functions for message \"+\n\t\t\t\"[count %v, max %v]\", msg.HashFuncs, MaxFilterLoadHashFuncs)\n\t\treturn messageError(\"MsgFilterLoad.BtcEncode\", str)\n\t}\n\n\terr := WriteVarBytes(w, pver, msg.Filter)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn writeElements(w, msg.HashFuncs, msg.Tweak, msg.Flags)\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgFilterLoad) Command() string {\n\treturn CmdFilterLoad\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgFilterLoad) MaxPayloadLength(pver uint32) uint32 {\n\t// Num filter bytes (varInt) + filter + 4 bytes hash funcs +\n\t// 4 bytes tweak + 1 byte flags.\n\treturn uint32(VarIntSerializeSize(MaxFilterLoadFilterSize)) +\n\t\tMaxFilterLoadFilterSize + 9\n}\n\n// NewMsgFilterLoad returns a new bitcoin filterload message that conforms to\n// the Message interface.  See MsgFilterLoad for details.\nfunc NewMsgFilterLoad(filter []byte, hashFuncs uint32, tweak uint32, flags BloomUpdateType) *MsgFilterLoad {\n\treturn &MsgFilterLoad{\n\t\tFilter:    filter,\n\t\tHashFuncs: hashFuncs,\n\t\tTweak:     tweak,\n\t\tFlags:     flags,\n\t}\n}\n"
  },
  {
    "path": "wire/msgfilterload_test.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n)\n\n// TestFilterCLearLatest tests the MsgFilterLoad API against the latest protocol\n// version.\nfunc TestFilterLoadLatest(t *testing.T) {\n\tpver := ProtocolVersion\n\tenc := BaseEncoding\n\n\tdata := []byte{0x01, 0x02}\n\tmsg := NewMsgFilterLoad(data, 10, 0, 0)\n\n\t// Ensure the command is expected value.\n\twantCmd := \"filterload\"\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgFilterLoad: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\twantPayload := uint32(36012)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayLoadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Test encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgFilterLoad failed %v err <%v>\", msg, err)\n\t}\n\n\t// Test decode with latest protocol version.\n\treadmsg := MsgFilterLoad{}\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgFilterLoad failed [%v] err <%v>\", buf, err)\n\t}\n}\n\n// TestFilterLoadCrossProtocol tests the MsgFilterLoad API when encoding with\n// the latest protocol version and decoding with BIP0031Version.\nfunc TestFilterLoadCrossProtocol(t *testing.T) {\n\tdata := []byte{0x01, 0x02}\n\tmsg := NewMsgFilterLoad(data, 10, 0, 0)\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, ProtocolVersion, BaseEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"encode of NewMsgFilterLoad failed %v err <%v>\", msg,\n\t\t\terr)\n\t}\n\n\t// Decode with old protocol version.\n\tvar readmsg MsgFilterLoad\n\terr = readmsg.BtcDecode(&buf, BIP0031Version, BaseEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgFilterLoad succeeded when it shouldn't have %v\",\n\t\t\tmsg)\n\t}\n}\n\n// TestFilterLoadMaxFilterSize tests the MsgFilterLoad API maximum filter size.\nfunc TestFilterLoadMaxFilterSize(t *testing.T) {\n\tdata := bytes.Repeat([]byte{0xff}, 36001)\n\tmsg := NewMsgFilterLoad(data, 10, 0, 0)\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, ProtocolVersion, BaseEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgFilterLoad succeeded when it shouldn't \"+\n\t\t\t\"have %v\", msg)\n\t}\n\n\t// Decode with latest protocol version.\n\treadbuf := bytes.NewReader(data)\n\terr = msg.BtcDecode(readbuf, ProtocolVersion, BaseEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgFilterLoad succeeded when it shouldn't \"+\n\t\t\t\"have %v\", msg)\n\t}\n}\n\n// TestFilterLoadMaxHashFuncsSize tests the MsgFilterLoad API maximum hash functions.\nfunc TestFilterLoadMaxHashFuncsSize(t *testing.T) {\n\tdata := bytes.Repeat([]byte{0xff}, 10)\n\tmsg := NewMsgFilterLoad(data, 61, 0, 0)\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, ProtocolVersion, BaseEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgFilterLoad succeeded when it shouldn't have %v\",\n\t\t\tmsg)\n\t}\n\n\tnewBuf := []byte{\n\t\t0x0a,                                                       // filter size\n\t\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // filter\n\t\t0x3d, 0x00, 0x00, 0x00, // max hash funcs\n\t\t0x00, 0x00, 0x00, 0x00, // tweak\n\t\t0x00, // update Type\n\t}\n\t// Decode with latest protocol version.\n\treadbuf := bytes.NewReader(newBuf)\n\terr = msg.BtcDecode(readbuf, ProtocolVersion, BaseEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgFilterLoad succeeded when it shouldn't have %v\",\n\t\t\tmsg)\n\t}\n}\n\n// TestFilterLoadWireErrors performs negative tests against wire encode and decode\n// of MsgFilterLoad to confirm error paths work correctly.\nfunc TestFilterLoadWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\tpverNoFilterLoad := BIP0037Version - 1\n\twireErr := &MessageError{}\n\n\tbaseFilter := []byte{0x01, 0x02, 0x03, 0x04}\n\tbaseFilterLoad := NewMsgFilterLoad(baseFilter, 10, 0, BloomUpdateNone)\n\tbaseFilterLoadEncoded := append([]byte{0x04}, baseFilter...)\n\tbaseFilterLoadEncoded = append(baseFilterLoadEncoded,\n\t\t0x00, 0x00, 0x00, 0x0a, // HashFuncs\n\t\t0x00, 0x00, 0x00, 0x00, // Tweak\n\t\t0x00) // Flags\n\n\ttests := []struct {\n\t\tin       *MsgFilterLoad  // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t// Force error in filter size.\n\t\t{\n\t\t\tbaseFilterLoad, baseFilterLoadEncoded, pver, BaseEncoding, 0,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in filter.\n\t\t{\n\t\t\tbaseFilterLoad, baseFilterLoadEncoded, pver, BaseEncoding, 1,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in hash funcs.\n\t\t{\n\t\t\tbaseFilterLoad, baseFilterLoadEncoded, pver, BaseEncoding, 5,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in tweak.\n\t\t{\n\t\t\tbaseFilterLoad, baseFilterLoadEncoded, pver, BaseEncoding, 9,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in flags.\n\t\t{\n\t\t\tbaseFilterLoad, baseFilterLoadEncoded, pver, BaseEncoding, 13,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error due to unsupported protocol version.\n\t\t{\n\t\t\tbaseFilterLoad, baseFilterLoadEncoded, pverNoFilterLoad, BaseEncoding,\n\t\t\t10, wireErr, wireErr,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgFilterLoad\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "wire/msggetaddr.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"io\"\n)\n\n// MsgGetAddr implements the Message interface and represents a bitcoin\n// getaddr message.  It is used to request a list of known active peers on the\n// network from a peer to help identify potential nodes.  The list is returned\n// via one or more addr messages (MsgAddr).\n//\n// This message has no payload.\ntype MsgGetAddr struct{}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetAddr) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetAddr) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgGetAddr) Command() string {\n\treturn CmdGetAddr\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgGetAddr) MaxPayloadLength(pver uint32) uint32 {\n\treturn 0\n}\n\n// NewMsgGetAddr returns a new bitcoin getaddr message that conforms to the\n// Message interface.  See MsgGetAddr for details.\nfunc NewMsgGetAddr() *MsgGetAddr {\n\treturn &MsgGetAddr{}\n}\n"
  },
  {
    "path": "wire/msggetaddr_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestGetAddr tests the MsgGetAddr API.\nfunc TestGetAddr(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Ensure the command is expected value.\n\twantCmd := \"getaddr\"\n\tmsg := NewMsgGetAddr()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgGetAddr: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\t// Num addresses (varInt) + max allowed addresses.\n\twantPayload := uint32(0)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n}\n\n// TestGetAddrWire tests the MsgGetAddr wire encode and decode for various\n// protocol versions.\nfunc TestGetAddrWire(t *testing.T) {\n\tmsgGetAddr := NewMsgGetAddr()\n\tmsgGetAddrEncoded := []byte{}\n\n\ttests := []struct {\n\t\tin   *MsgGetAddr     // Message to encode\n\t\tout  *MsgGetAddr     // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding variant.\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\tmsgGetAddr,\n\t\t\tmsgGetAddr,\n\t\t\tmsgGetAddrEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version.\n\t\t{\n\t\t\tmsgGetAddr,\n\t\t\tmsgGetAddr,\n\t\t\tmsgGetAddrEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version.\n\t\t{\n\t\t\tmsgGetAddr,\n\t\t\tmsgGetAddr,\n\t\t\tmsgGetAddrEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion.\n\t\t{\n\t\t\tmsgGetAddr,\n\t\t\tmsgGetAddr,\n\t\t\tmsgGetAddrEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion.\n\t\t{\n\t\t\tmsgGetAddr,\n\t\t\tmsgGetAddr,\n\t\t\tmsgGetAddrEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgGetAddr\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msggetblocks.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// MaxBlockLocatorsPerMsg is the maximum number of block locator hashes allowed\n// per message.\nconst MaxBlockLocatorsPerMsg = 500\n\n// MsgGetBlocks implements the Message interface and represents a bitcoin\n// getblocks message.  It is used to request a list of blocks starting after the\n// last known hash in the slice of block locator hashes.  The list is returned\n// via an inv message (MsgInv) and is limited by a specific hash to stop at or\n// the maximum number of blocks per message, which is currently 500.\n//\n// Set the HashStop field to the hash at which to stop and use\n// AddBlockLocatorHash to build up the list of block locator hashes.\n//\n// The algorithm for building the block locator hashes should be to add the\n// hashes in reverse order until you reach the genesis block.  In order to keep\n// the list of locator hashes to a reasonable number of entries, first add the\n// most recent 10 block hashes, then double the step each loop iteration to\n// exponentially decrease the number of hashes the further away from head and\n// closer to the genesis block you get.\ntype MsgGetBlocks struct {\n\tProtocolVersion    uint32\n\tBlockLocatorHashes []*chainhash.Hash\n\tHashStop           chainhash.Hash\n}\n\n// AddBlockLocatorHash adds a new block locator hash to the message.\nfunc (msg *MsgGetBlocks) AddBlockLocatorHash(hash *chainhash.Hash) error {\n\tif len(msg.BlockLocatorHashes)+1 > MaxBlockLocatorsPerMsg {\n\t\tstr := fmt.Sprintf(\"too many block locator hashes for message [max %v]\",\n\t\t\tMaxBlockLocatorsPerMsg)\n\t\treturn messageError(\"MsgGetBlocks.AddBlockLocatorHash\", str)\n\t}\n\n\tmsg.BlockLocatorHashes = append(msg.BlockLocatorHashes, hash)\n\treturn nil\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetBlocks) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tmsg.ProtocolVersion = littleEndian.Uint32(buf[:4])\n\n\t// Read num block locator hashes and limit to max.\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif count > MaxBlockLocatorsPerMsg {\n\t\tstr := fmt.Sprintf(\"too many block locator hashes for message \"+\n\t\t\t\"[count %v, max %v]\", count, MaxBlockLocatorsPerMsg)\n\t\treturn messageError(\"MsgGetBlocks.BtcDecode\", str)\n\t}\n\n\t// Create a contiguous slice of hashes to deserialize into in order to\n\t// reduce the number of allocations.\n\tlocatorHashes := make([]chainhash.Hash, count)\n\tmsg.BlockLocatorHashes = make([]*chainhash.Hash, 0, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\thash := &locatorHashes[i]\n\t\t_, err := io.ReadFull(r, hash[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.AddBlockLocatorHash(hash)\n\t}\n\n\t_, err = io.ReadFull(r, msg.HashStop[:])\n\treturn err\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetBlocks) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tcount := len(msg.BlockLocatorHashes)\n\tif count > MaxBlockLocatorsPerMsg {\n\t\tstr := fmt.Sprintf(\"too many block locator hashes for message \"+\n\t\t\t\"[count %v, max %v]\", count, MaxBlockLocatorsPerMsg)\n\t\treturn messageError(\"MsgGetBlocks.BtcEncode\", str)\n\t}\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tlittleEndian.PutUint32(buf[:4], msg.ProtocolVersion)\n\tif _, err := w.Write(buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\terr := WriteVarIntBuf(w, pver, uint64(count), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, hash := range msg.BlockLocatorHashes {\n\t\t_, err := w.Write(hash[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t_, err = w.Write(msg.HashStop[:])\n\treturn err\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgGetBlocks) Command() string {\n\treturn CmdGetBlocks\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgGetBlocks) MaxPayloadLength(pver uint32) uint32 {\n\t// Protocol version 4 bytes + num hashes (varInt) + max block locator\n\t// hashes + hash stop.\n\treturn 4 + MaxVarIntPayload + (MaxBlockLocatorsPerMsg * chainhash.HashSize) + chainhash.HashSize\n}\n\n// NewMsgGetBlocks returns a new bitcoin getblocks message that conforms to the\n// Message interface using the passed parameters and defaults for the remaining\n// fields.\nfunc NewMsgGetBlocks(hashStop *chainhash.Hash) *MsgGetBlocks {\n\treturn &MsgGetBlocks{\n\t\tProtocolVersion:    ProtocolVersion,\n\t\tBlockLocatorHashes: make([]*chainhash.Hash, 0, MaxBlockLocatorsPerMsg),\n\t\tHashStop:           *hashStop,\n\t}\n}\n"
  },
  {
    "path": "wire/msggetblocks_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestGetBlocks tests the MsgGetBlocks API.\nfunc TestGetBlocks(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Block 99500 hash.\n\thashStr := \"000000000002e7ad7b9eef9479e4aabc65cb831269cc20d2632c13684406dee0\"\n\tlocatorHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Block 100000 hash.\n\thashStr = \"3ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506\"\n\thashStop, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Ensure we get the same data back out.\n\tmsg := NewMsgGetBlocks(hashStop)\n\tif !msg.HashStop.IsEqual(hashStop) {\n\t\tt.Errorf(\"NewMsgGetBlocks: wrong stop hash - got %v, want %v\",\n\t\t\tmsg.HashStop, hashStop)\n\t}\n\n\t// Ensure the command is expected value.\n\twantCmd := \"getblocks\"\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgGetBlocks: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\t// Protocol version 4 bytes + num hashes (varInt) + max block locator\n\t// hashes + hash stop.\n\twantPayload := uint32(16045)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Ensure block locator hashes are added properly.\n\terr = msg.AddBlockLocatorHash(locatorHash)\n\tif err != nil {\n\t\tt.Errorf(\"AddBlockLocatorHash: %v\", err)\n\t}\n\tif msg.BlockLocatorHashes[0] != locatorHash {\n\t\tt.Errorf(\"AddBlockLocatorHash: wrong block locator added - \"+\n\t\t\t\"got %v, want %v\",\n\t\t\tspew.Sprint(msg.BlockLocatorHashes[0]),\n\t\t\tspew.Sprint(locatorHash))\n\t}\n\n\t// Ensure adding more than the max allowed block locator hashes per\n\t// message returns an error.\n\tfor i := 0; i < MaxBlockLocatorsPerMsg; i++ {\n\t\terr = msg.AddBlockLocatorHash(locatorHash)\n\t}\n\tif err == nil {\n\t\tt.Errorf(\"AddBlockLocatorHash: expected error on too many \" +\n\t\t\t\"block locator hashes not received\")\n\t}\n}\n\n// TestGetBlocksWire tests the MsgGetBlocks wire encode and decode for various\n// numbers of block locator hashes and protocol versions.\nfunc TestGetBlocksWire(t *testing.T) {\n\t// Set protocol inside getblocks message.\n\tpver := uint32(60002)\n\n\t// Block 99499 hash.\n\thashStr := \"2710f40c87ec93d010a6fd95f42c59a2cbacc60b18cf6b7957535\"\n\thashLocator, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Block 99500 hash.\n\thashStr = \"2e7ad7b9eef9479e4aabc65cb831269cc20d2632c13684406dee0\"\n\thashLocator2, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Block 100000 hash.\n\thashStr = \"3ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506\"\n\thashStop, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// MsgGetBlocks message with no block locators or stop hash.\n\tnoLocators := NewMsgGetBlocks(&chainhash.Hash{})\n\tnoLocators.ProtocolVersion = pver\n\tnoLocatorsEncoded := []byte{\n\t\t0x62, 0xea, 0x00, 0x00, // Protocol version 60002\n\t\t0x00, // Varint for number of block locator hashes\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Hash stop\n\t}\n\n\t// MsgGetBlocks message with multiple block locators and a stop hash.\n\tmultiLocators := NewMsgGetBlocks(hashStop)\n\tmultiLocators.AddBlockLocatorHash(hashLocator2)\n\tmultiLocators.AddBlockLocatorHash(hashLocator)\n\tmultiLocators.ProtocolVersion = pver\n\tmultiLocatorsEncoded := []byte{\n\t\t0x62, 0xea, 0x00, 0x00, // Protocol version 60002\n\t\t0x02, // Varint for number of block locator hashes\n\t\t0xe0, 0xde, 0x06, 0x44, 0x68, 0x13, 0x2c, 0x63,\n\t\t0xd2, 0x20, 0xcc, 0x69, 0x12, 0x83, 0xcb, 0x65,\n\t\t0xbc, 0xaa, 0xe4, 0x79, 0x94, 0xef, 0x9e, 0x7b,\n\t\t0xad, 0xe7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 99500 hash\n\t\t0x35, 0x75, 0x95, 0xb7, 0xf6, 0x8c, 0xb1, 0x60,\n\t\t0xcc, 0xba, 0x2c, 0x9a, 0xc5, 0x42, 0x5f, 0xd9,\n\t\t0x6f, 0x0a, 0x01, 0x3d, 0xc9, 0x7e, 0xc8, 0x40,\n\t\t0x0f, 0x71, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 99499 hash\n\t\t0x06, 0xe5, 0x33, 0xfd, 0x1a, 0xda, 0x86, 0x39,\n\t\t0x1f, 0x3f, 0x6c, 0x34, 0x32, 0x04, 0xb0, 0xd2,\n\t\t0x78, 0xd4, 0xaa, 0xec, 0x1c, 0x0b, 0x20, 0xaa,\n\t\t0x27, 0xba, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, // Hash stop\n\t}\n\n\ttests := []struct {\n\t\tin   *MsgGetBlocks   // Message to encode\n\t\tout  *MsgGetBlocks   // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version with no block locators.\n\t\t{\n\t\t\tnoLocators,\n\t\t\tnoLocators,\n\t\t\tnoLocatorsEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Latest protocol version with multiple block locators.\n\t\t{\n\t\t\tmultiLocators,\n\t\t\tmultiLocators,\n\t\t\tmultiLocatorsEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version with no block locators.\n\t\t{\n\t\t\tnoLocators,\n\t\t\tnoLocators,\n\t\t\tnoLocatorsEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version with multiple block locators.\n\t\t{\n\t\t\tmultiLocators,\n\t\t\tmultiLocators,\n\t\t\tmultiLocatorsEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version with no block locators.\n\t\t{\n\t\t\tnoLocators,\n\t\t\tnoLocators,\n\t\t\tnoLocatorsEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Versionwith multiple block locators.\n\t\t{\n\t\t\tmultiLocators,\n\t\t\tmultiLocators,\n\t\t\tmultiLocatorsEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion with no block locators.\n\t\t{\n\t\t\tnoLocators,\n\t\t\tnoLocators,\n\t\t\tnoLocatorsEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion multiple block locators.\n\t\t{\n\t\t\tmultiLocators,\n\t\t\tmultiLocators,\n\t\t\tmultiLocatorsEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion with no block locators.\n\t\t{\n\t\t\tnoLocators,\n\t\t\tnoLocators,\n\t\t\tnoLocatorsEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion multiple block locators.\n\t\t{\n\t\t\tmultiLocators,\n\t\t\tmultiLocators,\n\t\t\tmultiLocatorsEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgGetBlocks\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestGetBlocksWireErrors performs negative tests against wire encode and\n// decode of MsgGetBlocks to confirm error paths work correctly.\nfunc TestGetBlocksWireErrors(t *testing.T) {\n\t// Set protocol inside getheaders message.  Use protocol version 60002\n\t// specifically here instead of the latest because the test data is\n\t// using bytes encoded with that protocol version.\n\tpver := uint32(60002)\n\twireErr := &MessageError{}\n\n\t// Block 99499 hash.\n\thashStr := \"2710f40c87ec93d010a6fd95f42c59a2cbacc60b18cf6b7957535\"\n\thashLocator, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Block 99500 hash.\n\thashStr = \"2e7ad7b9eef9479e4aabc65cb831269cc20d2632c13684406dee0\"\n\thashLocator2, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Block 100000 hash.\n\thashStr = \"3ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506\"\n\thashStop, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// MsgGetBlocks message with multiple block locators and a stop hash.\n\tbaseGetBlocks := NewMsgGetBlocks(hashStop)\n\tbaseGetBlocks.ProtocolVersion = pver\n\tbaseGetBlocks.AddBlockLocatorHash(hashLocator2)\n\tbaseGetBlocks.AddBlockLocatorHash(hashLocator)\n\tbaseGetBlocksEncoded := []byte{\n\t\t0x62, 0xea, 0x00, 0x00, // Protocol version 60002\n\t\t0x02, // Varint for number of block locator hashes\n\t\t0xe0, 0xde, 0x06, 0x44, 0x68, 0x13, 0x2c, 0x63,\n\t\t0xd2, 0x20, 0xcc, 0x69, 0x12, 0x83, 0xcb, 0x65,\n\t\t0xbc, 0xaa, 0xe4, 0x79, 0x94, 0xef, 0x9e, 0x7b,\n\t\t0xad, 0xe7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 99500 hash\n\t\t0x35, 0x75, 0x95, 0xb7, 0xf6, 0x8c, 0xb1, 0x60,\n\t\t0xcc, 0xba, 0x2c, 0x9a, 0xc5, 0x42, 0x5f, 0xd9,\n\t\t0x6f, 0x0a, 0x01, 0x3d, 0xc9, 0x7e, 0xc8, 0x40,\n\t\t0x0f, 0x71, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 99499 hash\n\t\t0x06, 0xe5, 0x33, 0xfd, 0x1a, 0xda, 0x86, 0x39,\n\t\t0x1f, 0x3f, 0x6c, 0x34, 0x32, 0x04, 0xb0, 0xd2,\n\t\t0x78, 0xd4, 0xaa, 0xec, 0x1c, 0x0b, 0x20, 0xaa,\n\t\t0x27, 0xba, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, // Hash stop\n\t}\n\n\t// Message that forces an error by having more than the max allowed\n\t// block locator hashes.\n\tmaxGetBlocks := NewMsgGetBlocks(hashStop)\n\tfor i := 0; i < MaxBlockLocatorsPerMsg; i++ {\n\t\tmaxGetBlocks.AddBlockLocatorHash(&mainNetGenesisHash)\n\t}\n\tmaxGetBlocks.BlockLocatorHashes = append(maxGetBlocks.BlockLocatorHashes,\n\t\t&mainNetGenesisHash)\n\tmaxGetBlocksEncoded := []byte{\n\t\t0x62, 0xea, 0x00, 0x00, // Protocol version 60002\n\t\t0xfd, 0xf5, 0x01, // Varint for number of block loc hashes (501)\n\t}\n\n\ttests := []struct {\n\t\tin       *MsgGetBlocks   // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Force error in protocol version.\n\t\t{baseGetBlocks, baseGetBlocksEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in block locator hash count.\n\t\t{baseGetBlocks, baseGetBlocksEncoded, pver, BaseEncoding, 4, io.ErrShortWrite, io.EOF},\n\t\t// Force error in block locator hashes.\n\t\t{baseGetBlocks, baseGetBlocksEncoded, pver, BaseEncoding, 5, io.ErrShortWrite, io.EOF},\n\t\t// Force error in stop hash.\n\t\t{baseGetBlocks, baseGetBlocksEncoded, pver, BaseEncoding, 69, io.ErrShortWrite, io.EOF},\n\t\t// Force error with greater than max block locator hashes.\n\t\t{maxGetBlocks, maxGetBlocksEncoded, pver, BaseEncoding, 7, wireErr, wireErr},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgGetBlocks\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msggetcfcheckpt.go",
    "content": "// Copyright (c) 2018 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// MsgGetCFCheckpt is a request for filter headers at evenly spaced intervals\n// throughout the blockchain history. It allows to set the FilterType field to\n// get headers in the chain of basic (0x00) or extended (0x01) headers.\ntype MsgGetCFCheckpt struct {\n\tFilterType FilterType\n\tStopHash   chainhash.Hash\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetCFCheckpt) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tif _, err := io.ReadFull(r, buf[:1]); err != nil {\n\t\treturn err\n\t}\n\tmsg.FilterType = FilterType(buf[0])\n\n\t_, err := io.ReadFull(r, msg.StopHash[:])\n\treturn err\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetCFCheckpt) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tbuf[0] = byte(msg.FilterType)\n\tif _, err := w.Write(buf[:1]); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := w.Write(msg.StopHash[:])\n\treturn err\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgGetCFCheckpt) Command() string {\n\treturn CmdGetCFCheckpt\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgGetCFCheckpt) MaxPayloadLength(pver uint32) uint32 {\n\t// Filter type + uint32 + block hash\n\treturn 1 + chainhash.HashSize\n}\n\n// NewMsgGetCFCheckpt returns a new bitcoin getcfcheckpt message that conforms\n// to the Message interface using the passed parameters and defaults for the\n// remaining fields.\nfunc NewMsgGetCFCheckpt(filterType FilterType, stopHash *chainhash.Hash) *MsgGetCFCheckpt {\n\treturn &MsgGetCFCheckpt{\n\t\tFilterType: filterType,\n\t\tStopHash:   *stopHash,\n\t}\n}\n"
  },
  {
    "path": "wire/msggetcfheaders.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// MsgGetCFHeaders is a message similar to MsgGetHeaders, but for committed\n// filter headers. It allows to set the FilterType field to get headers in the\n// chain of basic (0x00) or extended (0x01) headers.\ntype MsgGetCFHeaders struct {\n\tFilterType  FilterType\n\tStartHeight uint32\n\tStopHash    chainhash.Hash\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetCFHeaders) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tif _, err := io.ReadFull(r, buf[:1]); err != nil {\n\t\treturn err\n\t}\n\tmsg.FilterType = FilterType(buf[0])\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tmsg.StartHeight = littleEndian.Uint32(buf[:4])\n\n\t_, err := io.ReadFull(r, msg.StopHash[:])\n\treturn err\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetCFHeaders) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tbuf[0] = byte(msg.FilterType)\n\tif _, err := w.Write(buf[:1]); err != nil {\n\t\treturn err\n\t}\n\n\tlittleEndian.PutUint32(buf[:4], msg.StartHeight)\n\tif _, err := w.Write(buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := w.Write(msg.StopHash[:])\n\treturn err\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgGetCFHeaders) Command() string {\n\treturn CmdGetCFHeaders\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgGetCFHeaders) MaxPayloadLength(pver uint32) uint32 {\n\t// Filter type + uint32 + block hash\n\treturn 1 + 4 + chainhash.HashSize\n}\n\n// NewMsgGetCFHeaders returns a new bitcoin getcfheader message that conforms to\n// the Message interface using the passed parameters and defaults for the\n// remaining fields.\nfunc NewMsgGetCFHeaders(filterType FilterType, startHeight uint32,\n\tstopHash *chainhash.Hash) *MsgGetCFHeaders {\n\treturn &MsgGetCFHeaders{\n\t\tFilterType:  filterType,\n\t\tStartHeight: startHeight,\n\t\tStopHash:    *stopHash,\n\t}\n}\n"
  },
  {
    "path": "wire/msggetcfilters.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// MaxGetCFiltersReqRange the maximum number of filters that may be requested in\n// a getcfheaders message.\nconst MaxGetCFiltersReqRange = 1000\n\n// MsgGetCFilters implements the Message interface and represents a bitcoin\n// getcfilters message. It is used to request committed filters for a range of\n// blocks.\ntype MsgGetCFilters struct {\n\tFilterType  FilterType\n\tStartHeight uint32\n\tStopHash    chainhash.Hash\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetCFilters) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tif _, err := io.ReadFull(r, buf[:1]); err != nil {\n\t\treturn err\n\t}\n\tmsg.FilterType = FilterType(buf[0])\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tmsg.StartHeight = littleEndian.Uint32(buf[:4])\n\n\t_, err := io.ReadFull(r, msg.StopHash[:])\n\treturn err\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetCFilters) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tbuf[0] = byte(msg.FilterType)\n\tif _, err := w.Write(buf[:1]); err != nil {\n\t\treturn err\n\t}\n\n\tlittleEndian.PutUint32(buf[:4], msg.StartHeight)\n\tif _, err := w.Write(buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := w.Write(msg.StopHash[:])\n\treturn err\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgGetCFilters) Command() string {\n\treturn CmdGetCFilters\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgGetCFilters) MaxPayloadLength(pver uint32) uint32 {\n\t// Filter type + uint32 + block hash\n\treturn 1 + 4 + chainhash.HashSize\n}\n\n// NewMsgGetCFilters returns a new bitcoin getcfilters message that conforms to\n// the Message interface using the passed parameters and defaults for the\n// remaining fields.\nfunc NewMsgGetCFilters(filterType FilterType, startHeight uint32,\n\tstopHash *chainhash.Hash) *MsgGetCFilters {\n\treturn &MsgGetCFilters{\n\t\tFilterType:  filterType,\n\t\tStartHeight: startHeight,\n\t\tStopHash:    *stopHash,\n\t}\n}\n"
  },
  {
    "path": "wire/msggetdata.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MsgGetData implements the Message interface and represents a bitcoin\n// getdata message.  It is used to request data such as blocks and transactions\n// from another peer.  It should be used in response to the inv (MsgInv) message\n// to request the actual data referenced by each inventory vector the receiving\n// peer doesn't already have.  Each message is limited to a maximum number of\n// inventory vectors, which is currently 50,000.  As a result, multiple messages\n// must be used to request larger amounts of data.\n//\n// Use the AddInvVect function to build up the list of inventory vectors when\n// sending a getdata message to another peer.\ntype MsgGetData struct {\n\tInvList []*InvVect\n}\n\n// AddInvVect adds an inventory vector to the message.\nfunc (msg *MsgGetData) AddInvVect(iv *InvVect) error {\n\tif len(msg.InvList)+1 > MaxInvPerMsg {\n\t\tstr := fmt.Sprintf(\"too many invvect in message [max %v]\",\n\t\t\tMaxInvPerMsg)\n\t\treturn messageError(\"MsgGetData.AddInvVect\", str)\n\t}\n\n\tmsg.InvList = append(msg.InvList, iv)\n\treturn nil\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetData) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Limit to max inventory vectors per message.\n\tif count > MaxInvPerMsg {\n\t\tstr := fmt.Sprintf(\"too many invvect in message [%v]\", count)\n\t\treturn messageError(\"MsgGetData.BtcDecode\", str)\n\t}\n\n\t// Create a contiguous slice of inventory vectors to deserialize into in\n\t// order to reduce the number of allocations.\n\tinvList := make([]InvVect, count)\n\tmsg.InvList = make([]*InvVect, 0, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\tiv := &invList[i]\n\t\terr := readInvVectBuf(r, pver, iv, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.AddInvVect(iv)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetData) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\t// Limit to max inventory vectors per message.\n\tcount := len(msg.InvList)\n\tif count > MaxInvPerMsg {\n\t\tstr := fmt.Sprintf(\"too many invvect in message [%v]\", count)\n\t\treturn messageError(\"MsgGetData.BtcEncode\", str)\n\t}\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := WriteVarIntBuf(w, pver, uint64(count), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, iv := range msg.InvList {\n\t\terr := writeInvVectBuf(w, pver, iv, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgGetData) Command() string {\n\treturn CmdGetData\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgGetData) MaxPayloadLength(pver uint32) uint32 {\n\t// Num inventory vectors (varInt) + max allowed inventory vectors.\n\treturn MaxVarIntPayload + (MaxInvPerMsg * maxInvVectPayload)\n}\n\n// NewMsgGetData returns a new bitcoin getdata message that conforms to the\n// Message interface.  See MsgGetData for details.\nfunc NewMsgGetData() *MsgGetData {\n\treturn &MsgGetData{\n\t\tInvList: make([]*InvVect, 0, defaultInvListAlloc),\n\t}\n}\n\n// NewMsgGetDataSizeHint returns a new bitcoin getdata message that conforms to\n// the Message interface.  See MsgGetData for details.  This function differs\n// from NewMsgGetData in that it allows a default allocation size for the\n// backing array which houses the inventory vector list.  This allows callers\n// who know in advance how large the inventory list will grow to avoid the\n// overhead of growing the internal backing array several times when appending\n// large amounts of inventory vectors with AddInvVect.  Note that the specified\n// hint is just that - a hint that is used for the default allocation size.\n// Adding more (or less) inventory vectors will still work properly.  The size\n// hint is limited to MaxInvPerMsg.\nfunc NewMsgGetDataSizeHint(sizeHint uint) *MsgGetData {\n\t// Limit the specified hint to the maximum allow per message.\n\tif sizeHint > MaxInvPerMsg {\n\t\tsizeHint = MaxInvPerMsg\n\t}\n\n\treturn &MsgGetData{\n\t\tInvList: make([]*InvVect, 0, sizeHint),\n\t}\n}\n"
  },
  {
    "path": "wire/msggetdata_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestGetData tests the MsgGetData API.\nfunc TestGetData(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Ensure the command is expected value.\n\twantCmd := \"getdata\"\n\tmsg := NewMsgGetData()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgGetData: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\t// Num inventory vectors (varInt) + max allowed inventory vectors.\n\twantPayload := uint32(1800009)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Ensure inventory vectors are added properly.\n\thash := chainhash.Hash{}\n\tiv := NewInvVect(InvTypeBlock, &hash)\n\terr := msg.AddInvVect(iv)\n\tif err != nil {\n\t\tt.Errorf(\"AddInvVect: %v\", err)\n\t}\n\tif msg.InvList[0] != iv {\n\t\tt.Errorf(\"AddInvVect: wrong invvect added - got %v, want %v\",\n\t\t\tspew.Sprint(msg.InvList[0]), spew.Sprint(iv))\n\t}\n\n\t// Ensure adding more than the max allowed inventory vectors per\n\t// message returns an error.\n\tfor i := 0; i < MaxInvPerMsg; i++ {\n\t\terr = msg.AddInvVect(iv)\n\t}\n\tif err == nil {\n\t\tt.Errorf(\"AddInvVect: expected error on too many inventory \" +\n\t\t\t\"vectors not received\")\n\t}\n\n\t// Ensure creating the message with a size hint larger than the max\n\t// works as expected.\n\tmsg = NewMsgGetDataSizeHint(MaxInvPerMsg + 1)\n\twantCap := MaxInvPerMsg\n\tif cap(msg.InvList) != wantCap {\n\t\tt.Errorf(\"NewMsgGetDataSizeHint: wrong cap for size hint - \"+\n\t\t\t\"got %v, want %v\", cap(msg.InvList), wantCap)\n\t}\n}\n\n// TestGetDataWire tests the MsgGetData wire encode and decode for various\n// numbers of inventory vectors and protocol versions.\nfunc TestGetDataWire(t *testing.T) {\n\t// Block 203707 hash.\n\thashStr := \"3264bc2ac36a60840790ba1d475d01367e7c723da941069e9dc\"\n\tblockHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Transaction 1 of Block 203707 hash.\n\thashStr = \"d28a3dc7392bf00a9855ee93dd9a81eff82a2c4fe57fbd42cfe71b487accfaf0\"\n\ttxHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\tiv := NewInvVect(InvTypeBlock, blockHash)\n\tiv2 := NewInvVect(InvTypeTx, txHash)\n\n\t// Empty MsgGetData message.\n\tNoInv := NewMsgGetData()\n\tNoInvEncoded := []byte{\n\t\t0x00, // Varint for number of inventory vectors\n\t}\n\n\t// MsgGetData message with multiple inventory vectors.\n\tMultiInv := NewMsgGetData()\n\tMultiInv.AddInvVect(iv)\n\tMultiInv.AddInvVect(iv2)\n\tMultiInvEncoded := []byte{\n\t\t0x02,                   // Varint for number of inv vectors\n\t\t0x02, 0x00, 0x00, 0x00, // InvTypeBlock\n\t\t0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7,\n\t\t0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b,\n\t\t0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b,\n\t\t0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 203707 hash\n\t\t0x01, 0x00, 0x00, 0x00, // InvTypeTx\n\t\t0xf0, 0xfa, 0xcc, 0x7a, 0x48, 0x1b, 0xe7, 0xcf,\n\t\t0x42, 0xbd, 0x7f, 0xe5, 0x4f, 0x2c, 0x2a, 0xf8,\n\t\t0xef, 0x81, 0x9a, 0xdd, 0x93, 0xee, 0x55, 0x98,\n\t\t0x0a, 0xf0, 0x2b, 0x39, 0xc7, 0x3d, 0x8a, 0xd2, // Tx 1 of block 203707 hash\n\t}\n\n\ttests := []struct {\n\t\tin   *MsgGetData     // Message to encode\n\t\tout  *MsgGetData     // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version with no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Latest protocol version with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgGetData\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestGetDataWireErrors performs negative tests against wire encode and decode\n// of MsgGetData to confirm error paths work correctly.\nfunc TestGetDataWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\twireErr := &MessageError{}\n\n\t// Block 203707 hash.\n\thashStr := \"3264bc2ac36a60840790ba1d475d01367e7c723da941069e9dc\"\n\tblockHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\tiv := NewInvVect(InvTypeBlock, blockHash)\n\n\t// Base message used to induce errors.\n\tbaseGetData := NewMsgGetData()\n\tbaseGetData.AddInvVect(iv)\n\tbaseGetDataEncoded := []byte{\n\t\t0x02,                   // Varint for number of inv vectors\n\t\t0x02, 0x00, 0x00, 0x00, // InvTypeBlock\n\t\t0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7,\n\t\t0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b,\n\t\t0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b,\n\t\t0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 203707 hash\n\t}\n\n\t// Message that forces an error by having more than the max allowed inv\n\t// vectors.\n\tmaxGetData := NewMsgGetData()\n\tfor i := 0; i < MaxInvPerMsg; i++ {\n\t\tmaxGetData.AddInvVect(iv)\n\t}\n\tmaxGetData.InvList = append(maxGetData.InvList, iv)\n\tmaxGetDataEncoded := []byte{\n\t\t0xfd, 0x51, 0xc3, // Varint for number of inv vectors (50001)\n\t}\n\n\ttests := []struct {\n\t\tin       *MsgGetData     // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t// Force error in inventory vector count\n\t\t{baseGetData, baseGetDataEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in inventory list.\n\t\t{baseGetData, baseGetDataEncoded, pver, BaseEncoding, 1, io.ErrShortWrite, io.EOF},\n\t\t// Force error with greater than max inventory vectors.\n\t\t{maxGetData, maxGetDataEncoded, pver, BaseEncoding, 3, wireErr, wireErr},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgGetData\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msggetheaders.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// MsgGetHeaders implements the Message interface and represents a bitcoin\n// getheaders message.  It is used to request a list of block headers for\n// blocks starting after the last known hash in the slice of block locator\n// hashes.  The list is returned via a headers message (MsgHeaders) and is\n// limited by a specific hash to stop at or the maximum number of block headers\n// per message, which is currently 2000.\n//\n// Set the HashStop field to the hash at which to stop and use\n// AddBlockLocatorHash to build up the list of block locator hashes.\n//\n// The algorithm for building the block locator hashes should be to add the\n// hashes in reverse order until you reach the genesis block.  In order to keep\n// the list of locator hashes to a reasonable number of entries, first add the\n// most recent 10 block hashes, then double the step each loop iteration to\n// exponentially decrease the number of hashes the further away from head and\n// closer to the genesis block you get.\ntype MsgGetHeaders struct {\n\tProtocolVersion    uint32\n\tBlockLocatorHashes []*chainhash.Hash\n\tHashStop           chainhash.Hash\n}\n\n// AddBlockLocatorHash adds a new block locator hash to the message.\nfunc (msg *MsgGetHeaders) AddBlockLocatorHash(hash *chainhash.Hash) error {\n\tif len(msg.BlockLocatorHashes)+1 > MaxBlockLocatorsPerMsg {\n\t\tstr := fmt.Sprintf(\"too many block locator hashes for message [max %v]\",\n\t\t\tMaxBlockLocatorsPerMsg)\n\t\treturn messageError(\"MsgGetHeaders.AddBlockLocatorHash\", str)\n\t}\n\n\tmsg.BlockLocatorHashes = append(msg.BlockLocatorHashes, hash)\n\treturn nil\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetHeaders) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tmsg.ProtocolVersion = littleEndian.Uint32(buf[:4])\n\n\t// Read num block locator hashes and limit to max.\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif count > MaxBlockLocatorsPerMsg {\n\t\tstr := fmt.Sprintf(\"too many block locator hashes for message \"+\n\t\t\t\"[count %v, max %v]\", count, MaxBlockLocatorsPerMsg)\n\t\treturn messageError(\"MsgGetHeaders.BtcDecode\", str)\n\t}\n\n\t// Create a contiguous slice of hashes to deserialize into in order to\n\t// reduce the number of allocations.\n\tlocatorHashes := make([]chainhash.Hash, count)\n\tmsg.BlockLocatorHashes = make([]*chainhash.Hash, 0, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\thash := &locatorHashes[i]\n\t\t_, err := io.ReadFull(r, hash[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.AddBlockLocatorHash(hash)\n\t}\n\n\t_, err = io.ReadFull(r, msg.HashStop[:])\n\treturn err\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgGetHeaders) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\t// Limit to max block locator hashes per message.\n\tcount := len(msg.BlockLocatorHashes)\n\tif count > MaxBlockLocatorsPerMsg {\n\t\tstr := fmt.Sprintf(\"too many block locator hashes for message \"+\n\t\t\t\"[count %v, max %v]\", count, MaxBlockLocatorsPerMsg)\n\t\treturn messageError(\"MsgGetHeaders.BtcEncode\", str)\n\t}\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tlittleEndian.PutUint32(buf[:4], msg.ProtocolVersion)\n\tif _, err := w.Write(buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\terr := WriteVarIntBuf(w, pver, uint64(count), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, hash := range msg.BlockLocatorHashes {\n\t\t_, err := w.Write(hash[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t_, err = w.Write(msg.HashStop[:])\n\treturn err\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgGetHeaders) Command() string {\n\treturn CmdGetHeaders\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgGetHeaders) MaxPayloadLength(pver uint32) uint32 {\n\t// Version 4 bytes + num block locator hashes (varInt) + max allowed block\n\t// locators + hash stop.\n\treturn 4 + MaxVarIntPayload + (MaxBlockLocatorsPerMsg *\n\t\tchainhash.HashSize) + chainhash.HashSize\n}\n\n// NewMsgGetHeaders returns a new bitcoin getheaders message that conforms to\n// the Message interface.  See MsgGetHeaders for details.\nfunc NewMsgGetHeaders() *MsgGetHeaders {\n\treturn &MsgGetHeaders{\n\t\tBlockLocatorHashes: make([]*chainhash.Hash, 0,\n\t\t\tMaxBlockLocatorsPerMsg),\n\t}\n}\n"
  },
  {
    "path": "wire/msggetheaders_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestGetHeaders tests the MsgGetHeader API.\nfunc TestGetHeaders(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Block 99500 hash.\n\thashStr := \"000000000002e7ad7b9eef9479e4aabc65cb831269cc20d2632c13684406dee0\"\n\tlocatorHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Ensure the command is expected value.\n\twantCmd := \"getheaders\"\n\tmsg := NewMsgGetHeaders()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgGetHeaders: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\t// Protocol version 4 bytes + num hashes (varInt) + max block locator\n\t// hashes + hash stop.\n\twantPayload := uint32(16045)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Ensure block locator hashes are added properly.\n\terr = msg.AddBlockLocatorHash(locatorHash)\n\tif err != nil {\n\t\tt.Errorf(\"AddBlockLocatorHash: %v\", err)\n\t}\n\tif msg.BlockLocatorHashes[0] != locatorHash {\n\t\tt.Errorf(\"AddBlockLocatorHash: wrong block locator added - \"+\n\t\t\t\"got %v, want %v\",\n\t\t\tspew.Sprint(msg.BlockLocatorHashes[0]),\n\t\t\tspew.Sprint(locatorHash))\n\t}\n\n\t// Ensure adding more than the max allowed block locator hashes per\n\t// message returns an error.\n\tfor i := 0; i < MaxBlockLocatorsPerMsg; i++ {\n\t\terr = msg.AddBlockLocatorHash(locatorHash)\n\t}\n\tif err == nil {\n\t\tt.Errorf(\"AddBlockLocatorHash: expected error on too many \" +\n\t\t\t\"block locator hashes not received\")\n\t}\n}\n\n// TestGetHeadersWire tests the MsgGetHeaders wire encode and decode for various\n// numbers of block locator hashes and protocol versions.\nfunc TestGetHeadersWire(t *testing.T) {\n\t// Set protocol inside getheaders message.  Use protocol version 60002\n\t// specifically here instead of the latest because the test data is\n\t// using bytes encoded with that protocol version.\n\tpver := uint32(60002)\n\n\t// Block 99499 hash.\n\thashStr := \"2710f40c87ec93d010a6fd95f42c59a2cbacc60b18cf6b7957535\"\n\thashLocator, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Block 99500 hash.\n\thashStr = \"2e7ad7b9eef9479e4aabc65cb831269cc20d2632c13684406dee0\"\n\thashLocator2, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Block 100000 hash.\n\thashStr = \"3ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506\"\n\thashStop, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// MsgGetHeaders message with no block locators or stop hash.\n\tnoLocators := NewMsgGetHeaders()\n\tnoLocators.ProtocolVersion = pver\n\tnoLocatorsEncoded := []byte{\n\t\t0x62, 0xea, 0x00, 0x00, // Protocol version 60002\n\t\t0x00, // Varint for number of block locator hashes\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Hash stop\n\t}\n\n\t// MsgGetHeaders message with multiple block locators and a stop hash.\n\tmultiLocators := NewMsgGetHeaders()\n\tmultiLocators.ProtocolVersion = pver\n\tmultiLocators.HashStop = *hashStop\n\tmultiLocators.AddBlockLocatorHash(hashLocator2)\n\tmultiLocators.AddBlockLocatorHash(hashLocator)\n\tmultiLocatorsEncoded := []byte{\n\t\t0x62, 0xea, 0x00, 0x00, // Protocol version 60002\n\t\t0x02, // Varint for number of block locator hashes\n\t\t0xe0, 0xde, 0x06, 0x44, 0x68, 0x13, 0x2c, 0x63,\n\t\t0xd2, 0x20, 0xcc, 0x69, 0x12, 0x83, 0xcb, 0x65,\n\t\t0xbc, 0xaa, 0xe4, 0x79, 0x94, 0xef, 0x9e, 0x7b,\n\t\t0xad, 0xe7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 99500 hash\n\t\t0x35, 0x75, 0x95, 0xb7, 0xf6, 0x8c, 0xb1, 0x60,\n\t\t0xcc, 0xba, 0x2c, 0x9a, 0xc5, 0x42, 0x5f, 0xd9,\n\t\t0x6f, 0x0a, 0x01, 0x3d, 0xc9, 0x7e, 0xc8, 0x40,\n\t\t0x0f, 0x71, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 99499 hash\n\t\t0x06, 0xe5, 0x33, 0xfd, 0x1a, 0xda, 0x86, 0x39,\n\t\t0x1f, 0x3f, 0x6c, 0x34, 0x32, 0x04, 0xb0, 0xd2,\n\t\t0x78, 0xd4, 0xaa, 0xec, 0x1c, 0x0b, 0x20, 0xaa,\n\t\t0x27, 0xba, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, // Hash stop\n\t}\n\n\ttests := []struct {\n\t\tin   *MsgGetHeaders  // Message to encode\n\t\tout  *MsgGetHeaders  // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version with no block locators.\n\t\t{\n\t\t\tnoLocators,\n\t\t\tnoLocators,\n\t\t\tnoLocatorsEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Latest protocol version with multiple block locators.\n\t\t{\n\t\t\tmultiLocators,\n\t\t\tmultiLocators,\n\t\t\tmultiLocatorsEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version with no block locators.\n\t\t{\n\t\t\tnoLocators,\n\t\t\tnoLocators,\n\t\t\tnoLocatorsEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version with multiple block locators.\n\t\t{\n\t\t\tmultiLocators,\n\t\t\tmultiLocators,\n\t\t\tmultiLocatorsEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version with no block locators.\n\t\t{\n\t\t\tnoLocators,\n\t\t\tnoLocators,\n\t\t\tnoLocatorsEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Versionwith multiple block locators.\n\t\t{\n\t\t\tmultiLocators,\n\t\t\tmultiLocators,\n\t\t\tmultiLocatorsEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion with no block locators.\n\t\t{\n\t\t\tnoLocators,\n\t\t\tnoLocators,\n\t\t\tnoLocatorsEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion multiple block locators.\n\t\t{\n\t\t\tmultiLocators,\n\t\t\tmultiLocators,\n\t\t\tmultiLocatorsEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion with no block locators.\n\t\t{\n\t\t\tnoLocators,\n\t\t\tnoLocators,\n\t\t\tnoLocatorsEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion multiple block locators.\n\t\t{\n\t\t\tmultiLocators,\n\t\t\tmultiLocators,\n\t\t\tmultiLocatorsEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgGetHeaders\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestGetHeadersWireErrors performs negative tests against wire encode and\n// decode of MsgGetHeaders to confirm error paths work correctly.\nfunc TestGetHeadersWireErrors(t *testing.T) {\n\t// Set protocol inside getheaders message.  Use protocol version 60002\n\t// specifically here instead of the latest because the test data is\n\t// using bytes encoded with that protocol version.\n\tpver := uint32(60002)\n\twireErr := &MessageError{}\n\n\t// Block 99499 hash.\n\thashStr := \"2710f40c87ec93d010a6fd95f42c59a2cbacc60b18cf6b7957535\"\n\thashLocator, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Block 99500 hash.\n\thashStr = \"2e7ad7b9eef9479e4aabc65cb831269cc20d2632c13684406dee0\"\n\thashLocator2, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Block 100000 hash.\n\thashStr = \"3ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506\"\n\thashStop, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// MsgGetHeaders message with multiple block locators and a stop hash.\n\tbaseGetHeaders := NewMsgGetHeaders()\n\tbaseGetHeaders.ProtocolVersion = pver\n\tbaseGetHeaders.HashStop = *hashStop\n\tbaseGetHeaders.AddBlockLocatorHash(hashLocator2)\n\tbaseGetHeaders.AddBlockLocatorHash(hashLocator)\n\tbaseGetHeadersEncoded := []byte{\n\t\t0x62, 0xea, 0x00, 0x00, // Protocol version 60002\n\t\t0x02, // Varint for number of block locator hashes\n\t\t0xe0, 0xde, 0x06, 0x44, 0x68, 0x13, 0x2c, 0x63,\n\t\t0xd2, 0x20, 0xcc, 0x69, 0x12, 0x83, 0xcb, 0x65,\n\t\t0xbc, 0xaa, 0xe4, 0x79, 0x94, 0xef, 0x9e, 0x7b,\n\t\t0xad, 0xe7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 99500 hash\n\t\t0x35, 0x75, 0x95, 0xb7, 0xf6, 0x8c, 0xb1, 0x60,\n\t\t0xcc, 0xba, 0x2c, 0x9a, 0xc5, 0x42, 0x5f, 0xd9,\n\t\t0x6f, 0x0a, 0x01, 0x3d, 0xc9, 0x7e, 0xc8, 0x40,\n\t\t0x0f, 0x71, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 99499 hash\n\t\t0x06, 0xe5, 0x33, 0xfd, 0x1a, 0xda, 0x86, 0x39,\n\t\t0x1f, 0x3f, 0x6c, 0x34, 0x32, 0x04, 0xb0, 0xd2,\n\t\t0x78, 0xd4, 0xaa, 0xec, 0x1c, 0x0b, 0x20, 0xaa,\n\t\t0x27, 0xba, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, // Hash stop\n\t}\n\n\t// Message that forces an error by having more than the max allowed\n\t// block locator hashes.\n\tmaxGetHeaders := NewMsgGetHeaders()\n\tfor i := 0; i < MaxBlockLocatorsPerMsg; i++ {\n\t\tmaxGetHeaders.AddBlockLocatorHash(&mainNetGenesisHash)\n\t}\n\tmaxGetHeaders.BlockLocatorHashes = append(maxGetHeaders.BlockLocatorHashes,\n\t\t&mainNetGenesisHash)\n\tmaxGetHeadersEncoded := []byte{\n\t\t0x62, 0xea, 0x00, 0x00, // Protocol version 60002\n\t\t0xfd, 0xf5, 0x01, // Varint for number of block loc hashes (501)\n\t}\n\n\ttests := []struct {\n\t\tin       *MsgGetHeaders  // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Force error in protocol version.\n\t\t{baseGetHeaders, baseGetHeadersEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in block locator hash count.\n\t\t{baseGetHeaders, baseGetHeadersEncoded, pver, BaseEncoding, 4, io.ErrShortWrite, io.EOF},\n\t\t// Force error in block locator hashes.\n\t\t{baseGetHeaders, baseGetHeadersEncoded, pver, BaseEncoding, 5, io.ErrShortWrite, io.EOF},\n\t\t// Force error in stop hash.\n\t\t{baseGetHeaders, baseGetHeadersEncoded, pver, BaseEncoding, 69, io.ErrShortWrite, io.EOF},\n\t\t// Force error with greater than max block locator hashes.\n\t\t{maxGetHeaders, maxGetHeadersEncoded, pver, BaseEncoding, 7, wireErr, wireErr},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgGetHeaders\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msgheaders.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MaxBlockHeadersPerMsg is the maximum number of block headers that can be in\n// a single bitcoin headers message.\nconst MaxBlockHeadersPerMsg = 2000\n\n// MsgHeaders implements the Message interface and represents a bitcoin headers\n// message.  It is used to deliver block header information in response\n// to a getheaders message (MsgGetHeaders).  The maximum number of block headers\n// per message is currently 2000.  See MsgGetHeaders for details on requesting\n// the headers.\ntype MsgHeaders struct {\n\tHeaders []*BlockHeader\n}\n\n// AddBlockHeader adds a new block header to the message.\nfunc (msg *MsgHeaders) AddBlockHeader(bh *BlockHeader) error {\n\tif len(msg.Headers)+1 > MaxBlockHeadersPerMsg {\n\t\tstr := fmt.Sprintf(\"too many block headers in message [max %v]\",\n\t\t\tMaxBlockHeadersPerMsg)\n\t\treturn messageError(\"MsgHeaders.AddBlockHeader\", str)\n\t}\n\n\tmsg.Headers = append(msg.Headers, bh)\n\treturn nil\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgHeaders) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Limit to max block headers per message.\n\tif count > MaxBlockHeadersPerMsg {\n\t\tstr := fmt.Sprintf(\"too many block headers for message \"+\n\t\t\t\"[count %v, max %v]\", count, MaxBlockHeadersPerMsg)\n\t\treturn messageError(\"MsgHeaders.BtcDecode\", str)\n\t}\n\n\t// Create a contiguous slice of headers to deserialize into in order to\n\t// reduce the number of allocations.\n\theaders := make([]BlockHeader, count)\n\tmsg.Headers = make([]*BlockHeader, 0, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\tbh := &headers[i]\n\t\terr := readBlockHeaderBuf(r, pver, bh, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\ttxCount, err := ReadVarIntBuf(r, pver, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Ensure the transaction count is zero for headers.\n\t\tif txCount > 0 {\n\t\t\tstr := fmt.Sprintf(\"block headers may not contain \"+\n\t\t\t\t\"transactions [count %v]\", txCount)\n\t\t\treturn messageError(\"MsgHeaders.BtcDecode\", str)\n\t\t}\n\t\tmsg.AddBlockHeader(bh)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgHeaders) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\t// Limit to max block headers per message.\n\tcount := len(msg.Headers)\n\tif count > MaxBlockHeadersPerMsg {\n\t\tstr := fmt.Sprintf(\"too many block headers for message \"+\n\t\t\t\"[count %v, max %v]\", count, MaxBlockHeadersPerMsg)\n\t\treturn messageError(\"MsgHeaders.BtcEncode\", str)\n\t}\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := WriteVarIntBuf(w, pver, uint64(count), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, bh := range msg.Headers {\n\t\terr := writeBlockHeaderBuf(w, pver, bh, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// The wire protocol encoding always includes a 0 for the number\n\t\t// of transactions on header messages.  This is really just an\n\t\t// artifact of the way the original implementation serializes\n\t\t// block headers, but it is required.\n\t\terr = WriteVarIntBuf(w, pver, 0, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgHeaders) Command() string {\n\treturn CmdHeaders\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgHeaders) MaxPayloadLength(pver uint32) uint32 {\n\t// Num headers (varInt) + max allowed headers (header length + 1 byte\n\t// for the number of transactions which is always 0).\n\treturn MaxVarIntPayload + ((MaxBlockHeaderPayload + 1) *\n\t\tMaxBlockHeadersPerMsg)\n}\n\n// NewMsgHeaders returns a new bitcoin headers message that conforms to the\n// Message interface.  See MsgHeaders for details.\nfunc NewMsgHeaders() *MsgHeaders {\n\treturn &MsgHeaders{\n\t\tHeaders: make([]*BlockHeader, 0, MaxBlockHeadersPerMsg),\n\t}\n}\n"
  },
  {
    "path": "wire/msgheaders_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestHeaders tests the MsgHeaders API.\nfunc TestHeaders(t *testing.T) {\n\tpver := uint32(60002)\n\n\t// Ensure the command is expected value.\n\twantCmd := \"headers\"\n\tmsg := NewMsgHeaders()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgHeaders: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\t// Num headers (varInt) + max allowed headers (header length + 1 byte\n\t// for the number of transactions which is always 0).\n\twantPayload := uint32(162009)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Ensure headers are added properly.\n\tbh := &blockOne.Header\n\tmsg.AddBlockHeader(bh)\n\tif !reflect.DeepEqual(msg.Headers[0], bh) {\n\t\tt.Errorf(\"AddHeader: wrong header - got %v, want %v\",\n\t\t\tspew.Sdump(msg.Headers),\n\t\t\tspew.Sdump(bh))\n\t}\n\n\t// Ensure adding more than the max allowed headers per message returns\n\t// error.\n\tvar err error\n\tfor i := 0; i < MaxBlockHeadersPerMsg+1; i++ {\n\t\terr = msg.AddBlockHeader(bh)\n\t}\n\tif reflect.TypeOf(err) != reflect.TypeOf(&MessageError{}) {\n\t\tt.Errorf(\"AddBlockHeader: expected error on too many headers \" +\n\t\t\t\"not received\")\n\t}\n}\n\n// TestHeadersWire tests the MsgHeaders wire encode and decode for various\n// numbers of headers and protocol versions.\nfunc TestHeadersWire(t *testing.T) {\n\thash := mainNetGenesisHash\n\tmerkleHash := blockOne.Header.MerkleRoot\n\tbits := uint32(0x1d00ffff)\n\tnonce := uint32(0x9962e301)\n\tbh := NewBlockHeader(1, &hash, &merkleHash, bits, nonce)\n\tbh.Version = blockOne.Header.Version\n\tbh.Timestamp = blockOne.Header.Timestamp\n\n\t// Empty headers message.\n\tnoHeaders := NewMsgHeaders()\n\tnoHeadersEncoded := []byte{\n\t\t0x00, // Varint for number of headers\n\t}\n\n\t// Headers message with one header.\n\toneHeader := NewMsgHeaders()\n\toneHeader.AddBlockHeader(bh)\n\toneHeaderEncoded := []byte{\n\t\t0x01,                   // VarInt for number of headers.\n\t\t0x01, 0x00, 0x00, 0x00, // Version 1\n\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock\n\t\t0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44,\n\t\t0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67,\n\t\t0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1,\n\t\t0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, // MerkleRoot\n\t\t0x61, 0xbc, 0x66, 0x49, // Timestamp\n\t\t0xff, 0xff, 0x00, 0x1d, // Bits\n\t\t0x01, 0xe3, 0x62, 0x99, // Nonce\n\t\t0x00, // TxnCount (0 for headers message)\n\t}\n\n\ttests := []struct {\n\t\tin   *MsgHeaders     // Message to encode\n\t\tout  *MsgHeaders     // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version with no headers.\n\t\t{\n\t\t\tnoHeaders,\n\t\t\tnoHeaders,\n\t\t\tnoHeadersEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Latest protocol version with one header.\n\t\t{\n\t\t\toneHeader,\n\t\t\toneHeader,\n\t\t\toneHeaderEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version with no headers.\n\t\t{\n\t\t\tnoHeaders,\n\t\t\tnoHeaders,\n\t\t\tnoHeadersEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version with one header.\n\t\t{\n\t\t\toneHeader,\n\t\t\toneHeader,\n\t\t\toneHeaderEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version with no headers.\n\t\t{\n\t\t\tnoHeaders,\n\t\t\tnoHeaders,\n\t\t\tnoHeadersEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version with one header.\n\t\t{\n\t\t\toneHeader,\n\t\t\toneHeader,\n\t\t\toneHeaderEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\t\t// Protocol version NetAddressTimeVersion with no headers.\n\t\t{\n\t\t\tnoHeaders,\n\t\t\tnoHeaders,\n\t\t\tnoHeadersEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion with one header.\n\t\t{\n\t\t\toneHeader,\n\t\t\toneHeader,\n\t\t\toneHeaderEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion with no headers.\n\t\t{\n\t\t\tnoHeaders,\n\t\t\tnoHeaders,\n\t\t\tnoHeadersEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion with one header.\n\t\t{\n\t\t\toneHeader,\n\t\t\toneHeader,\n\t\t\toneHeaderEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgHeaders\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestHeadersWireErrors performs negative tests against wire encode and decode\n// of MsgHeaders to confirm error paths work correctly.\nfunc TestHeadersWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\twireErr := &MessageError{}\n\n\thash := mainNetGenesisHash\n\tmerkleHash := blockOne.Header.MerkleRoot\n\tbits := uint32(0x1d00ffff)\n\tnonce := uint32(0x9962e301)\n\tbh := NewBlockHeader(1, &hash, &merkleHash, bits, nonce)\n\tbh.Version = blockOne.Header.Version\n\tbh.Timestamp = blockOne.Header.Timestamp\n\n\t// Headers message with one header.\n\toneHeader := NewMsgHeaders()\n\toneHeader.AddBlockHeader(bh)\n\toneHeaderEncoded := []byte{\n\t\t0x01,                   // VarInt for number of headers.\n\t\t0x01, 0x00, 0x00, 0x00, // Version 1\n\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock\n\t\t0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44,\n\t\t0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67,\n\t\t0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1,\n\t\t0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, // MerkleRoot\n\t\t0x61, 0xbc, 0x66, 0x49, // Timestamp\n\t\t0xff, 0xff, 0x00, 0x1d, // Bits\n\t\t0x01, 0xe3, 0x62, 0x99, // Nonce\n\t\t0x00, // TxnCount (0 for headers message)\n\t}\n\n\t// Message that forces an error by having more than the max allowed\n\t// headers.\n\tmaxHeaders := NewMsgHeaders()\n\tfor i := 0; i < MaxBlockHeadersPerMsg; i++ {\n\t\tmaxHeaders.AddBlockHeader(bh)\n\t}\n\tmaxHeaders.Headers = append(maxHeaders.Headers, bh)\n\tmaxHeadersEncoded := []byte{\n\t\t0xfd, 0xd1, 0x07, // Varint for number of addresses (2001)7D1\n\t}\n\n\t// Intentionally invalid block header that has a transaction count used\n\t// to force errors.\n\tbhTrans := NewBlockHeader(1, &hash, &merkleHash, bits, nonce)\n\tbhTrans.Version = blockOne.Header.Version\n\tbhTrans.Timestamp = blockOne.Header.Timestamp\n\n\ttransHeader := NewMsgHeaders()\n\ttransHeader.AddBlockHeader(bhTrans)\n\ttransHeaderEncoded := []byte{\n\t\t0x01,                   // VarInt for number of headers.\n\t\t0x01, 0x00, 0x00, 0x00, // Version 1\n\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock\n\t\t0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44,\n\t\t0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67,\n\t\t0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1,\n\t\t0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, // MerkleRoot\n\t\t0x61, 0xbc, 0x66, 0x49, // Timestamp\n\t\t0xff, 0xff, 0x00, 0x1d, // Bits\n\t\t0x01, 0xe3, 0x62, 0x99, // Nonce\n\t\t0x01, // TxnCount (should be 0 for headers message, but 1 to force error)\n\t}\n\n\ttests := []struct {\n\t\tin       *MsgHeaders     // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t// Force error in header count.\n\t\t{oneHeader, oneHeaderEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in block header.\n\t\t{oneHeader, oneHeaderEncoded, pver, BaseEncoding, 5, io.ErrShortWrite, io.EOF},\n\t\t// Force error with greater than max headers.\n\t\t{maxHeaders, maxHeadersEncoded, pver, BaseEncoding, 3, wireErr, wireErr},\n\t\t// Force error with number of transactions.\n\t\t{transHeader, transHeaderEncoded, pver, BaseEncoding, 81, io.ErrShortWrite, io.EOF},\n\t\t// Force error with included transactions.\n\t\t{transHeader, transHeaderEncoded, pver, BaseEncoding, len(transHeaderEncoded), nil, wireErr},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgHeaders\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "wire/msginv.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// defaultInvListAlloc is the default size used for the backing array for an\n// inventory list.  The array will dynamically grow as needed, but this\n// figure is intended to provide enough space for the max number of inventory\n// vectors in a *typical* inventory message without needing to grow the backing\n// array multiple times.  Technically, the list can grow to MaxInvPerMsg, but\n// rather than using that large figure, this figure more accurately reflects the\n// typical case.\nconst defaultInvListAlloc = 1000\n\n// MsgInv implements the Message interface and represents a bitcoin inv message.\n// It is used to advertise a peer's known data such as blocks and transactions\n// through inventory vectors.  It may be sent unsolicited to inform other peers\n// of the data or in response to a getblocks message (MsgGetBlocks).  Each\n// message is limited to a maximum number of inventory vectors, which is\n// currently 50,000.\n//\n// Use the AddInvVect function to build up the list of inventory vectors when\n// sending an inv message to another peer.\ntype MsgInv struct {\n\tInvList []*InvVect\n}\n\n// AddInvVect adds an inventory vector to the message.\nfunc (msg *MsgInv) AddInvVect(iv *InvVect) error {\n\tif len(msg.InvList)+1 > MaxInvPerMsg {\n\t\tstr := fmt.Sprintf(\"too many invvect in message [max %v]\",\n\t\t\tMaxInvPerMsg)\n\t\treturn messageError(\"MsgInv.AddInvVect\", str)\n\t}\n\n\tmsg.InvList = append(msg.InvList, iv)\n\treturn nil\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgInv) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Limit to max inventory vectors per message.\n\tif count > MaxInvPerMsg {\n\t\tstr := fmt.Sprintf(\"too many invvect in message [%v]\", count)\n\t\treturn messageError(\"MsgInv.BtcDecode\", str)\n\t}\n\n\t// Create a contiguous slice of inventory vectors to deserialize into in\n\t// order to reduce the number of allocations.\n\tinvList := make([]InvVect, count)\n\tmsg.InvList = make([]*InvVect, 0, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\tiv := &invList[i]\n\t\terr := readInvVectBuf(r, pver, iv, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.AddInvVect(iv)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgInv) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\t// Limit to max inventory vectors per message.\n\tcount := len(msg.InvList)\n\tif count > MaxInvPerMsg {\n\t\tstr := fmt.Sprintf(\"too many invvect in message [%v]\", count)\n\t\treturn messageError(\"MsgInv.BtcEncode\", str)\n\t}\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := WriteVarIntBuf(w, pver, uint64(count), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, iv := range msg.InvList {\n\t\terr := writeInvVectBuf(w, pver, iv, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgInv) Command() string {\n\treturn CmdInv\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgInv) MaxPayloadLength(pver uint32) uint32 {\n\t// Num inventory vectors (varInt) + max allowed inventory vectors.\n\treturn MaxVarIntPayload + (MaxInvPerMsg * maxInvVectPayload)\n}\n\n// NewMsgInv returns a new bitcoin inv message that conforms to the Message\n// interface.  See MsgInv for details.\nfunc NewMsgInv() *MsgInv {\n\treturn &MsgInv{\n\t\tInvList: make([]*InvVect, 0, defaultInvListAlloc),\n\t}\n}\n\n// NewMsgInvSizeHint returns a new bitcoin inv message that conforms to the\n// Message interface.  See MsgInv for details.  This function differs from\n// NewMsgInv in that it allows a default allocation size for the backing array\n// which houses the inventory vector list.  This allows callers who know in\n// advance how large the inventory list will grow to avoid the overhead of\n// growing the internal backing array several times when appending large amounts\n// of inventory vectors with AddInvVect.  Note that the specified hint is just\n// that - a hint that is used for the default allocation size.  Adding more\n// (or less) inventory vectors will still work properly.  The size hint is\n// limited to MaxInvPerMsg.\nfunc NewMsgInvSizeHint(sizeHint uint) *MsgInv {\n\t// Limit the specified hint to the maximum allow per message.\n\tif sizeHint > MaxInvPerMsg {\n\t\tsizeHint = MaxInvPerMsg\n\t}\n\n\treturn &MsgInv{\n\t\tInvList: make([]*InvVect, 0, sizeHint),\n\t}\n}\n"
  },
  {
    "path": "wire/msginv_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestInv tests the MsgInv API.\nfunc TestInv(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Ensure the command is expected value.\n\twantCmd := \"inv\"\n\tmsg := NewMsgInv()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgInv: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\t// Num inventory vectors (varInt) + max allowed inventory vectors.\n\twantPayload := uint32(1800009)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Ensure inventory vectors are added properly.\n\thash := chainhash.Hash{}\n\tiv := NewInvVect(InvTypeBlock, &hash)\n\terr := msg.AddInvVect(iv)\n\tif err != nil {\n\t\tt.Errorf(\"AddInvVect: %v\", err)\n\t}\n\tif msg.InvList[0] != iv {\n\t\tt.Errorf(\"AddInvVect: wrong invvect added - got %v, want %v\",\n\t\t\tspew.Sprint(msg.InvList[0]), spew.Sprint(iv))\n\t}\n\n\t// Ensure adding more than the max allowed inventory vectors per\n\t// message returns an error.\n\tfor i := 0; i < MaxInvPerMsg; i++ {\n\t\terr = msg.AddInvVect(iv)\n\t}\n\tif err == nil {\n\t\tt.Errorf(\"AddInvVect: expected error on too many inventory \" +\n\t\t\t\"vectors not received\")\n\t}\n\n\t// Ensure creating the message with a size hint larger than the max\n\t// works as expected.\n\tmsg = NewMsgInvSizeHint(MaxInvPerMsg + 1)\n\twantCap := MaxInvPerMsg\n\tif cap(msg.InvList) != wantCap {\n\t\tt.Errorf(\"NewMsgInvSizeHint: wrong cap for size hint - \"+\n\t\t\t\"got %v, want %v\", cap(msg.InvList), wantCap)\n\t}\n}\n\n// TestInvWire tests the MsgInv wire encode and decode for various numbers\n// of inventory vectors and protocol versions.\nfunc TestInvWire(t *testing.T) {\n\t// Block 203707 hash.\n\thashStr := \"3264bc2ac36a60840790ba1d475d01367e7c723da941069e9dc\"\n\tblockHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Transaction 1 of Block 203707 hash.\n\thashStr = \"d28a3dc7392bf00a9855ee93dd9a81eff82a2c4fe57fbd42cfe71b487accfaf0\"\n\ttxHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\tiv := NewInvVect(InvTypeBlock, blockHash)\n\tiv2 := NewInvVect(InvTypeTx, txHash)\n\n\t// Empty inv message.\n\tNoInv := NewMsgInv()\n\tNoInvEncoded := []byte{\n\t\t0x00, // Varint for number of inventory vectors\n\t}\n\n\t// Inv message with multiple inventory vectors.\n\tMultiInv := NewMsgInv()\n\tMultiInv.AddInvVect(iv)\n\tMultiInv.AddInvVect(iv2)\n\tMultiInvEncoded := []byte{\n\t\t0x02,                   // Varint for number of inv vectors\n\t\t0x02, 0x00, 0x00, 0x00, // InvTypeBlock\n\t\t0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7,\n\t\t0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b,\n\t\t0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b,\n\t\t0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 203707 hash\n\t\t0x01, 0x00, 0x00, 0x00, // InvTypeTx\n\t\t0xf0, 0xfa, 0xcc, 0x7a, 0x48, 0x1b, 0xe7, 0xcf,\n\t\t0x42, 0xbd, 0x7f, 0xe5, 0x4f, 0x2c, 0x2a, 0xf8,\n\t\t0xef, 0x81, 0x9a, 0xdd, 0x93, 0xee, 0x55, 0x98,\n\t\t0x0a, 0xf0, 0x2b, 0x39, 0xc7, 0x3d, 0x8a, 0xd2, // Tx 1 of block 203707 hash\n\t}\n\n\ttests := []struct {\n\t\tin   *MsgInv         // Message to encode\n\t\tout  *MsgInv         // Expected decoded message\n\t\tbuf  []byte          // Wire encoding pver uint32\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encodinf format\n\t}{\n\t\t// Latest protocol version with no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Latest protocol version with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgInv\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestInvWireErrors performs negative tests against wire encode and decode\n// of MsgInv to confirm error paths work correctly.\nfunc TestInvWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\twireErr := &MessageError{}\n\n\t// Block 203707 hash.\n\thashStr := \"3264bc2ac36a60840790ba1d475d01367e7c723da941069e9dc\"\n\tblockHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\tiv := NewInvVect(InvTypeBlock, blockHash)\n\n\t// Base inv message used to induce errors.\n\tbaseInv := NewMsgInv()\n\tbaseInv.AddInvVect(iv)\n\tbaseInvEncoded := []byte{\n\t\t0x02,                   // Varint for number of inv vectors\n\t\t0x02, 0x00, 0x00, 0x00, // InvTypeBlock\n\t\t0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7,\n\t\t0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b,\n\t\t0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b,\n\t\t0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 203707 hash\n\t}\n\n\t// Inv message that forces an error by having more than the max allowed\n\t// inv vectors.\n\tmaxInv := NewMsgInv()\n\tfor i := 0; i < MaxInvPerMsg; i++ {\n\t\tmaxInv.AddInvVect(iv)\n\t}\n\tmaxInv.InvList = append(maxInv.InvList, iv)\n\tmaxInvEncoded := []byte{\n\t\t0xfd, 0x51, 0xc3, // Varint for number of inv vectors (50001)\n\t}\n\n\ttests := []struct {\n\t\tin       *MsgInv         // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t// Force error in inventory vector count\n\t\t{baseInv, baseInvEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in inventory list.\n\t\t{baseInv, baseInvEncoded, pver, BaseEncoding, 1, io.ErrShortWrite, io.EOF},\n\t\t// Force error with greater than max inventory vectors.\n\t\t{maxInv, maxInvEncoded, pver, BaseEncoding, 3, wireErr, wireErr},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgInv\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "wire/msgmempool.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MsgMemPool implements the Message interface and represents a bitcoin mempool\n// message.  It is used to request a list of transactions still in the active\n// memory pool of a relay.\n//\n// This message has no payload and was not added until protocol versions\n// starting with BIP0035Version.\ntype MsgMemPool struct{}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgMemPool) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tif pver < BIP0035Version {\n\t\tstr := fmt.Sprintf(\"mempool message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgMemPool.BtcDecode\", str)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgMemPool) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tif pver < BIP0035Version {\n\t\tstr := fmt.Sprintf(\"mempool message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgMemPool.BtcEncode\", str)\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgMemPool) Command() string {\n\treturn CmdMemPool\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgMemPool) MaxPayloadLength(pver uint32) uint32 {\n\treturn 0\n}\n\n// NewMsgMemPool returns a new bitcoin pong message that conforms to the Message\n// interface.  See MsgPong for details.\nfunc NewMsgMemPool() *MsgMemPool {\n\treturn &MsgMemPool{}\n}\n"
  },
  {
    "path": "wire/msgmempool_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n)\n\nfunc TestMemPool(t *testing.T) {\n\tpver := ProtocolVersion\n\tenc := BaseEncoding\n\n\t// Ensure the command is expected value.\n\twantCmd := \"mempool\"\n\tmsg := NewMsgMemPool()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgMemPool: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value.\n\twantPayload := uint32(0)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Test encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgMemPool failed %v err <%v>\", msg, err)\n\t}\n\n\t// Older protocol versions should fail encode since message didn't\n\t// exist yet.\n\toldPver := BIP0035Version - 1\n\terr = msg.BtcEncode(&buf, oldPver, enc)\n\tif err == nil {\n\t\ts := \"encode of MsgMemPool passed for old protocol version %v err <%v>\"\n\t\tt.Errorf(s, msg, err)\n\t}\n\n\t// Test decode with latest protocol version.\n\treadmsg := NewMsgMemPool()\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgMemPool failed [%v] err <%v>\", buf, err)\n\t}\n\n\t// Older protocol versions should fail decode since message didn't\n\t// exist yet.\n\terr = readmsg.BtcDecode(&buf, oldPver, enc)\n\tif err == nil {\n\t\ts := \"decode of MsgMemPool passed for old protocol version %v err <%v>\"\n\t\tt.Errorf(s, msg, err)\n\t}\n}\n"
  },
  {
    "path": "wire/msgmerkleblock.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// maxFlagsPerMerkleBlock is the maximum number of flag bytes that could\n// possibly fit into a merkle block.  Since each transaction is represented by\n// a single bit, this is the max number of transactions per block divided by\n// 8 bits per byte.  Then an extra one to cover partials.\nconst maxFlagsPerMerkleBlock = maxTxPerBlock / 8\n\n// MsgMerkleBlock implements the Message interface and represents a bitcoin\n// merkleblock message which is used to reset a Bloom filter.\n//\n// This message was not added until protocol version BIP0037Version.\ntype MsgMerkleBlock struct {\n\tHeader       BlockHeader\n\tTransactions uint32\n\tHashes       []*chainhash.Hash\n\tFlags        []byte\n}\n\n// AddTxHash adds a new transaction hash to the message.\nfunc (msg *MsgMerkleBlock) AddTxHash(hash *chainhash.Hash) error {\n\tif len(msg.Hashes)+1 > maxTxPerBlock {\n\t\tstr := fmt.Sprintf(\"too many tx hashes for message [max %v]\",\n\t\t\tmaxTxPerBlock)\n\t\treturn messageError(\"MsgMerkleBlock.AddTxHash\", str)\n\t}\n\n\tmsg.Hashes = append(msg.Hashes, hash)\n\treturn nil\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgMerkleBlock) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tif pver < BIP0037Version {\n\t\tstr := fmt.Sprintf(\"merkleblock message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgMerkleBlock.BtcDecode\", str)\n\t}\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := readBlockHeaderBuf(r, pver, &msg.Header, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tmsg.Transactions = littleEndian.Uint32(buf[:4])\n\n\t// Read num block locator hashes and limit to max.\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif count > maxTxPerBlock {\n\t\tstr := fmt.Sprintf(\"too many transaction hashes for message \"+\n\t\t\t\"[count %v, max %v]\", count, maxTxPerBlock)\n\t\treturn messageError(\"MsgMerkleBlock.BtcDecode\", str)\n\t}\n\n\t// Create a contiguous slice of hashes to deserialize into in order to\n\t// reduce the number of allocations.\n\thashes := make([]chainhash.Hash, count)\n\tmsg.Hashes = make([]*chainhash.Hash, 0, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\thash := &hashes[i]\n\t\t_, err := io.ReadFull(r, hash[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.AddTxHash(hash)\n\t}\n\n\tmsg.Flags, err = ReadVarBytesBuf(r, pver, buf, maxFlagsPerMerkleBlock,\n\t\t\"merkle block flags size\")\n\treturn err\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgMerkleBlock) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tif pver < BIP0037Version {\n\t\tstr := fmt.Sprintf(\"merkleblock message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgMerkleBlock.BtcEncode\", str)\n\t}\n\n\t// Read num transaction hashes and limit to max.\n\tnumHashes := len(msg.Hashes)\n\tif numHashes > maxTxPerBlock {\n\t\tstr := fmt.Sprintf(\"too many transaction hashes for message \"+\n\t\t\t\"[count %v, max %v]\", numHashes, maxTxPerBlock)\n\t\treturn messageError(\"MsgMerkleBlock.BtcDecode\", str)\n\t}\n\tnumFlagBytes := len(msg.Flags)\n\tif numFlagBytes > maxFlagsPerMerkleBlock {\n\t\tstr := fmt.Sprintf(\"too many flag bytes for message [count %v, \"+\n\t\t\t\"max %v]\", numFlagBytes, maxFlagsPerMerkleBlock)\n\t\treturn messageError(\"MsgMerkleBlock.BtcDecode\", str)\n\t}\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := writeBlockHeaderBuf(w, pver, &msg.Header, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tlittleEndian.PutUint32(buf[:4], msg.Transactions)\n\tif _, err := w.Write(buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\terr = WriteVarIntBuf(w, pver, uint64(numHashes), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\tfor _, hash := range msg.Hashes {\n\t\t_, err := w.Write(hash[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\terr = WriteVarBytesBuf(w, pver, msg.Flags, buf)\n\treturn err\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgMerkleBlock) Command() string {\n\treturn CmdMerkleBlock\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgMerkleBlock) MaxPayloadLength(pver uint32) uint32 {\n\treturn MaxBlockPayload\n}\n\n// NewMsgMerkleBlock returns a new bitcoin merkleblock message that conforms to\n// the Message interface.  See MsgMerkleBlock for details.\nfunc NewMsgMerkleBlock(bh *BlockHeader) *MsgMerkleBlock {\n\treturn &MsgMerkleBlock{\n\t\tHeader:       *bh,\n\t\tTransactions: 0,\n\t\tHashes:       make([]*chainhash.Hash, 0),\n\t\tFlags:        make([]byte, 0),\n\t}\n}\n"
  },
  {
    "path": "wire/msgmerkleblock_test.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestMerkleBlock tests the MsgMerkleBlock API.\nfunc TestMerkleBlock(t *testing.T) {\n\tpver := ProtocolVersion\n\tenc := BaseEncoding\n\n\t// Block 1 header.\n\tprevHash := &blockOne.Header.PrevBlock\n\tmerkleHash := &blockOne.Header.MerkleRoot\n\tbits := blockOne.Header.Bits\n\tnonce := blockOne.Header.Nonce\n\tbh := NewBlockHeader(1, prevHash, merkleHash, bits, nonce)\n\n\t// Ensure the command is expected value.\n\twantCmd := \"merkleblock\"\n\tmsg := NewMsgMerkleBlock(bh)\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgBlock: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\t// Num addresses (varInt) + max allowed addresses.\n\twantPayload := uint32(4000000)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Load maxTxPerBlock hashes\n\tdata := make([]byte, 32)\n\tfor i := 0; i < maxTxPerBlock; i++ {\n\t\trand.Read(data)\n\t\thash, err := chainhash.NewHash(data)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"NewHash failed: %v\\n\", err)\n\t\t\treturn\n\t\t}\n\n\t\tif err = msg.AddTxHash(hash); err != nil {\n\t\t\tt.Errorf(\"AddTxHash failed: %v\\n\", err)\n\t\t\treturn\n\t\t}\n\t}\n\n\t// Add one more Tx to test failure.\n\trand.Read(data)\n\thash, err := chainhash.NewHash(data)\n\tif err != nil {\n\t\tt.Errorf(\"NewHash failed: %v\\n\", err)\n\t\treturn\n\t}\n\n\tif err = msg.AddTxHash(hash); err == nil {\n\t\tt.Errorf(\"AddTxHash succeeded when it should have failed\")\n\t\treturn\n\t}\n\n\t// Test encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr = msg.BtcEncode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgMerkleBlock failed %v err <%v>\", msg, err)\n\t}\n\n\t// Test decode with latest protocol version.\n\treadmsg := MsgMerkleBlock{}\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgMerkleBlock failed [%v] err <%v>\", buf, err)\n\t}\n\n\t// Force extra hash to test maxTxPerBlock.\n\tmsg.Hashes = append(msg.Hashes, hash)\n\terr = msg.BtcEncode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgMerkleBlock succeeded with too many \" +\n\t\t\t\"tx hashes when it should have failed\")\n\t\treturn\n\t}\n\n\t// Force too many flag bytes to test maxFlagsPerMerkleBlock.\n\t// Reset the number of hashes back to a valid value.\n\tmsg.Hashes = msg.Hashes[len(msg.Hashes)-1:]\n\tmsg.Flags = make([]byte, maxFlagsPerMerkleBlock+1)\n\terr = msg.BtcEncode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgMerkleBlock succeeded with too many \" +\n\t\t\t\"flag bytes when it should have failed\")\n\t\treturn\n\t}\n}\n\n// TestMerkleBlockCrossProtocol tests the MsgMerkleBlock API when encoding with\n// the latest protocol version and decoding with BIP0031Version.\nfunc TestMerkleBlockCrossProtocol(t *testing.T) {\n\t// Block 1 header.\n\tprevHash := &blockOne.Header.PrevBlock\n\tmerkleHash := &blockOne.Header.MerkleRoot\n\tbits := blockOne.Header.Bits\n\tnonce := blockOne.Header.Nonce\n\tbh := NewBlockHeader(1, prevHash, merkleHash, bits, nonce)\n\n\tmsg := NewMsgMerkleBlock(bh)\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, ProtocolVersion, BaseEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"encode of NewMsgFilterLoad failed %v err <%v>\", msg,\n\t\t\terr)\n\t}\n\n\t// Decode with old protocol version.\n\tvar readmsg MsgFilterLoad\n\terr = readmsg.BtcDecode(&buf, BIP0031Version, BaseEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgFilterLoad succeeded when it shouldn't have %v\",\n\t\t\tmsg)\n\t}\n}\n\n// TestMerkleBlockWire tests the MsgMerkleBlock wire encode and decode for\n// various numbers of transaction hashes and protocol versions.\nfunc TestMerkleBlockWire(t *testing.T) {\n\ttests := []struct {\n\t\tin   *MsgMerkleBlock // Message to encode\n\t\tout  *MsgMerkleBlock // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\t&merkleBlockOne, &merkleBlockOne, merkleBlockOneBytes,\n\t\t\tProtocolVersion, BaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0037Version.\n\t\t{\n\t\t\t&merkleBlockOne, &merkleBlockOne, merkleBlockOneBytes,\n\t\t\tBIP0037Version, BaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgMerkleBlock\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestMerkleBlockWireErrors performs negative tests against wire encode and\n// decode of MsgBlock to confirm error paths work correctly.\nfunc TestMerkleBlockWireErrors(t *testing.T) {\n\t// Use protocol version 70001 specifically here instead of the latest\n\t// because the test data is using bytes encoded with that protocol\n\t// version.\n\tpver := uint32(70001)\n\tpverNoMerkleBlock := BIP0037Version - 1\n\twireErr := &MessageError{}\n\n\ttests := []struct {\n\t\tin       *MsgMerkleBlock // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Force error in version.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pver, BaseEncoding, 0,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in prev block hash.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pver, BaseEncoding, 4,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in merkle root.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pver, BaseEncoding, 36,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in timestamp.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pver, BaseEncoding, 68,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in difficulty bits.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pver, BaseEncoding, 72,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in header nonce.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pver, BaseEncoding, 76,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in transaction count.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pver, BaseEncoding, 80,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in num hashes.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pver, BaseEncoding, 84,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in hashes.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pver, BaseEncoding, 85,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in num flag bytes.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pver, BaseEncoding, 117,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error in flag bytes.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pver, BaseEncoding, 118,\n\t\t\tio.ErrShortWrite, io.EOF,\n\t\t},\n\t\t// Force error due to unsupported protocol version.\n\t\t{\n\t\t\t&merkleBlockOne, merkleBlockOneBytes, pverNoMerkleBlock,\n\t\t\tBaseEncoding, 119, wireErr, wireErr,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgMerkleBlock\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestMerkleBlockOverflowErrors performs tests to ensure encoding and decoding\n// merkle blocks that are intentionally crafted to use large values for the\n// number of hashes and flags are handled properly.  This could otherwise\n// potentially be used as an attack vector.\nfunc TestMerkleBlockOverflowErrors(t *testing.T) {\n\t// Use protocol version 70001 specifically here instead of the latest\n\t// protocol version because the test data is using bytes encoded with\n\t// that version.\n\tpver := uint32(70001)\n\n\t// Create bytes for a merkle block that claims to have more than the max\n\t// allowed tx hashes.\n\tvar buf bytes.Buffer\n\tWriteVarInt(&buf, pver, maxTxPerBlock+1)\n\tnumHashesOffset := 84\n\texceedMaxHashes := make([]byte, numHashesOffset)\n\tcopy(exceedMaxHashes, merkleBlockOneBytes[:numHashesOffset])\n\texceedMaxHashes = append(exceedMaxHashes, buf.Bytes()...)\n\n\t// Create bytes for a merkle block that claims to have more than the max\n\t// allowed flag bytes.\n\tbuf.Reset()\n\tWriteVarInt(&buf, pver, maxFlagsPerMerkleBlock+1)\n\tnumFlagBytesOffset := 117\n\texceedMaxFlagBytes := make([]byte, numFlagBytesOffset)\n\tcopy(exceedMaxFlagBytes, merkleBlockOneBytes[:numFlagBytesOffset])\n\texceedMaxFlagBytes = append(exceedMaxFlagBytes, buf.Bytes()...)\n\n\ttests := []struct {\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t\terr  error           // Expected error\n\t}{\n\t\t// Block that claims to have more than max allowed hashes.\n\t\t{exceedMaxHashes, pver, BaseEncoding, &MessageError{}},\n\t\t// Block that claims to have more than max allowed flag bytes.\n\t\t{exceedMaxFlagBytes, pver, BaseEncoding, &MessageError{}},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Decode from wire format.\n\t\tvar msg MsgMerkleBlock\n\t\tr := bytes.NewReader(test.buf)\n\t\terr := msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, reflect.TypeOf(test.err))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// merkleBlockOne is a merkle block created from block one of the block chain\n// where the first transaction matches.\nvar merkleBlockOne = MsgMerkleBlock{\n\tHeader: BlockHeader{\n\t\tVersion: 1,\n\t\tPrevBlock: chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t}),\n\t\tMerkleRoot: chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy.\n\t\t\t0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44,\n\t\t\t0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67,\n\t\t\t0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1,\n\t\t\t0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e,\n\t\t}),\n\t\tTimestamp: time.Unix(0x4966bc61, 0), // 2009-01-08 20:54:25 -0600 CST\n\t\tBits:      0x1d00ffff,               // 486604799\n\t\tNonce:     0x9962e301,               // 2573394689\n\t},\n\tTransactions: 1,\n\tHashes: []*chainhash.Hash{\n\t\t(*chainhash.Hash)(&[chainhash.HashSize]byte{ // Make go vet happy.\n\t\t\t0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44,\n\t\t\t0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67,\n\t\t\t0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1,\n\t\t\t0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e,\n\t\t}),\n\t},\n\tFlags: []byte{0x80},\n}\n\n// merkleBlockOneBytes is the serialized bytes for a merkle block created from\n// block one of the block chain where the first transaction matches.\nvar merkleBlockOneBytes = []byte{\n\t0x01, 0x00, 0x00, 0x00, // Version 1\n\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // PrevBlock\n\t0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44,\n\t0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67,\n\t0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1,\n\t0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, // MerkleRoot\n\t0x61, 0xbc, 0x66, 0x49, // Timestamp\n\t0xff, 0xff, 0x00, 0x1d, // Bits\n\t0x01, 0xe3, 0x62, 0x99, // Nonce\n\t0x01, 0x00, 0x00, 0x00, // TxnCount\n\t0x01, // Num hashes\n\t0x98, 0x20, 0x51, 0xfd, 0x1e, 0x4b, 0xa7, 0x44,\n\t0xbb, 0xbe, 0x68, 0x0e, 0x1f, 0xee, 0x14, 0x67,\n\t0x7b, 0xa1, 0xa3, 0xc3, 0x54, 0x0b, 0xf7, 0xb1,\n\t0xcd, 0xb6, 0x06, 0xe8, 0x57, 0x23, 0x3e, 0x0e, // Hash\n\t0x01, // Num flag bytes\n\t0x80, // Flags\n}\n"
  },
  {
    "path": "wire/msgnotfound.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MsgNotFound defines a bitcoin notfound message which is sent in response to\n// a getdata message if any of the requested data in not available on the peer.\n// Each message is limited to a maximum number of inventory vectors, which is\n// currently 50,000.\n//\n// Use the AddInvVect function to build up the list of inventory vectors when\n// sending a notfound message to another peer.\ntype MsgNotFound struct {\n\tInvList []*InvVect\n}\n\n// AddInvVect adds an inventory vector to the message.\nfunc (msg *MsgNotFound) AddInvVect(iv *InvVect) error {\n\tif len(msg.InvList)+1 > MaxInvPerMsg {\n\t\tstr := fmt.Sprintf(\"too many invvect in message [max %v]\",\n\t\t\tMaxInvPerMsg)\n\t\treturn messageError(\"MsgNotFound.AddInvVect\", str)\n\t}\n\n\tmsg.InvList = append(msg.InvList, iv)\n\treturn nil\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgNotFound) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Limit to max inventory vectors per message.\n\tif count > MaxInvPerMsg {\n\t\tstr := fmt.Sprintf(\"too many invvect in message [%v]\", count)\n\t\treturn messageError(\"MsgNotFound.BtcDecode\", str)\n\t}\n\n\t// Create a contiguous slice of inventory vectors to deserialize into in\n\t// order to reduce the number of allocations.\n\tinvList := make([]InvVect, count)\n\tmsg.InvList = make([]*InvVect, 0, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\tiv := &invList[i]\n\t\terr := readInvVectBuf(r, pver, iv, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.AddInvVect(iv)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgNotFound) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\t// Limit to max inventory vectors per message.\n\tcount := len(msg.InvList)\n\tif count > MaxInvPerMsg {\n\t\tstr := fmt.Sprintf(\"too many invvect in message [%v]\", count)\n\t\treturn messageError(\"MsgNotFound.BtcEncode\", str)\n\t}\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := WriteVarIntBuf(w, pver, uint64(count), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, iv := range msg.InvList {\n\t\terr := writeInvVectBuf(w, pver, iv, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgNotFound) Command() string {\n\treturn CmdNotFound\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgNotFound) MaxPayloadLength(pver uint32) uint32 {\n\t// Max var int 9 bytes + max InvVects at 36 bytes each.\n\t// Num inventory vectors (varInt) + max allowed inventory vectors.\n\treturn MaxVarIntPayload + (MaxInvPerMsg * maxInvVectPayload)\n}\n\n// NewMsgNotFound returns a new bitcoin notfound message that conforms to the\n// Message interface.  See MsgNotFound for details.\nfunc NewMsgNotFound() *MsgNotFound {\n\treturn &MsgNotFound{\n\t\tInvList: make([]*InvVect, 0, defaultInvListAlloc),\n\t}\n}\n"
  },
  {
    "path": "wire/msgnotfound_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestNotFound tests the MsgNotFound API.\nfunc TestNotFound(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Ensure the command is expected value.\n\twantCmd := \"notfound\"\n\tmsg := NewMsgNotFound()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgNotFound: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\t// Num inventory vectors (varInt) + max allowed inventory vectors.\n\twantPayload := uint32(1800009)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Ensure inventory vectors are added properly.\n\thash := chainhash.Hash{}\n\tiv := NewInvVect(InvTypeBlock, &hash)\n\terr := msg.AddInvVect(iv)\n\tif err != nil {\n\t\tt.Errorf(\"AddInvVect: %v\", err)\n\t}\n\tif msg.InvList[0] != iv {\n\t\tt.Errorf(\"AddInvVect: wrong invvect added - got %v, want %v\",\n\t\t\tspew.Sprint(msg.InvList[0]), spew.Sprint(iv))\n\t}\n\n\t// Ensure adding more than the max allowed inventory vectors per\n\t// message returns an error.\n\tfor i := 0; i < MaxInvPerMsg; i++ {\n\t\terr = msg.AddInvVect(iv)\n\t}\n\tif err == nil {\n\t\tt.Errorf(\"AddInvVect: expected error on too many inventory \" +\n\t\t\t\"vectors not received\")\n\t}\n}\n\n// TestNotFoundWire tests the MsgNotFound wire encode and decode for various\n// numbers of inventory vectors and protocol versions.\nfunc TestNotFoundWire(t *testing.T) {\n\t// Block 203707 hash.\n\thashStr := \"3264bc2ac36a60840790ba1d475d01367e7c723da941069e9dc\"\n\tblockHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Transaction 1 of Block 203707 hash.\n\thashStr = \"d28a3dc7392bf00a9855ee93dd9a81eff82a2c4fe57fbd42cfe71b487accfaf0\"\n\ttxHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\tiv := NewInvVect(InvTypeBlock, blockHash)\n\tiv2 := NewInvVect(InvTypeTx, txHash)\n\n\t// Empty notfound message.\n\tNoInv := NewMsgNotFound()\n\tNoInvEncoded := []byte{\n\t\t0x00, // Varint for number of inventory vectors\n\t}\n\n\t// NotFound message with multiple inventory vectors.\n\tMultiInv := NewMsgNotFound()\n\tMultiInv.AddInvVect(iv)\n\tMultiInv.AddInvVect(iv2)\n\tMultiInvEncoded := []byte{\n\t\t0x02,                   // Varint for number of inv vectors\n\t\t0x02, 0x00, 0x00, 0x00, // InvTypeBlock\n\t\t0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7,\n\t\t0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b,\n\t\t0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b,\n\t\t0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 203707 hash\n\t\t0x01, 0x00, 0x00, 0x00, // InvTypeTx\n\t\t0xf0, 0xfa, 0xcc, 0x7a, 0x48, 0x1b, 0xe7, 0xcf,\n\t\t0x42, 0xbd, 0x7f, 0xe5, 0x4f, 0x2c, 0x2a, 0xf8,\n\t\t0xef, 0x81, 0x9a, 0xdd, 0x93, 0xee, 0x55, 0x98,\n\t\t0x0a, 0xf0, 0x2b, 0x39, 0xc7, 0x3d, 0x8a, 0xd2, // Tx 1 of block 203707 hash\n\t}\n\n\ttests := []struct {\n\t\tin   *MsgNotFound    // Message to encode\n\t\tout  *MsgNotFound    // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version with no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Latest protocol version with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion no inv vectors.\n\t\t{\n\t\t\tNoInv,\n\t\t\tNoInv,\n\t\t\tNoInvEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion with multiple inv vectors.\n\t\t{\n\t\t\tMultiInv,\n\t\t\tMultiInv,\n\t\t\tMultiInvEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgNotFound\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestNotFoundWireErrors performs negative tests against wire encode and decode\n// of MsgNotFound to confirm error paths work correctly.\nfunc TestNotFoundWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\twireErr := &MessageError{}\n\n\t// Block 203707 hash.\n\thashStr := \"3264bc2ac36a60840790ba1d475d01367e7c723da941069e9dc\"\n\tblockHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\tiv := NewInvVect(InvTypeBlock, blockHash)\n\n\t// Base message used to induce errors.\n\tbaseNotFound := NewMsgNotFound()\n\tbaseNotFound.AddInvVect(iv)\n\tbaseNotFoundEncoded := []byte{\n\t\t0x02,                   // Varint for number of inv vectors\n\t\t0x02, 0x00, 0x00, 0x00, // InvTypeBlock\n\t\t0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7,\n\t\t0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b,\n\t\t0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b,\n\t\t0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block 203707 hash\n\t}\n\n\t// Message that forces an error by having more than the max allowed inv\n\t// vectors.\n\tmaxNotFound := NewMsgNotFound()\n\tfor i := 0; i < MaxInvPerMsg; i++ {\n\t\tmaxNotFound.AddInvVect(iv)\n\t}\n\tmaxNotFound.InvList = append(maxNotFound.InvList, iv)\n\tmaxNotFoundEncoded := []byte{\n\t\t0xfd, 0x51, 0xc3, // Varint for number of inv vectors (50001)\n\t}\n\n\ttests := []struct {\n\t\tin       *MsgNotFound    // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Force error in inventory vector count\n\t\t{baseNotFound, baseNotFoundEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in inventory list.\n\t\t{baseNotFound, baseNotFoundEncoded, pver, BaseEncoding, 1, io.ErrShortWrite, io.EOF},\n\t\t// Force error with greater than max inventory vectors.\n\t\t{maxNotFound, maxNotFoundEncoded, pver, BaseEncoding, 3, wireErr, wireErr},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgNotFound\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msgping.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"io\"\n)\n\n// MsgPing implements the Message interface and represents a bitcoin ping\n// message.\n//\n// For versions BIP0031Version and earlier, it is used primarily to confirm\n// that a connection is still valid.  A transmission error is typically\n// interpreted as a closed connection and that the peer should be removed.\n// For versions AFTER BIP0031Version it contains an identifier which can be\n// returned in the pong message to determine network timing.\n//\n// The payload for this message just consists of a nonce used for identifying\n// it later.\ntype MsgPing struct {\n\t// Unique value associated with message that is used to identify\n\t// specific ping message.\n\tNonce uint64\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgPing) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\t// There was no nonce for BIP0031Version and earlier.\n\t// NOTE: > is not a mistake here.  The BIP0031 was defined as AFTER\n\t// the version unlike most others.\n\tif pver > BIP0031Version {\n\t\tnonce, err := binarySerializer.Uint64(r, littleEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.Nonce = nonce\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgPing) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\t// There was no nonce for BIP0031Version and earlier.\n\t// NOTE: > is not a mistake here.  The BIP0031 was defined as AFTER\n\t// the version unlike most others.\n\tif pver > BIP0031Version {\n\t\terr := binarySerializer.PutUint64(w, littleEndian, msg.Nonce)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgPing) Command() string {\n\treturn CmdPing\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgPing) MaxPayloadLength(pver uint32) uint32 {\n\tplen := uint32(0)\n\t// There was no nonce for BIP0031Version and earlier.\n\t// NOTE: > is not a mistake here.  The BIP0031 was defined as AFTER\n\t// the version unlike most others.\n\tif pver > BIP0031Version {\n\t\t// Nonce 8 bytes.\n\t\tplen += 8\n\t}\n\n\treturn plen\n}\n\n// NewMsgPing returns a new bitcoin ping message that conforms to the Message\n// interface.  See MsgPing for details.\nfunc NewMsgPing(nonce uint64) *MsgPing {\n\treturn &MsgPing{\n\t\tNonce: nonce,\n\t}\n}\n"
  },
  {
    "path": "wire/msgping_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestPing tests the MsgPing API against the latest protocol version.\nfunc TestPing(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Ensure we get the same nonce back out.\n\tnonce, err := RandomUint64()\n\tif err != nil {\n\t\tt.Errorf(\"RandomUint64: Error generating nonce: %v\", err)\n\t}\n\tmsg := NewMsgPing(nonce)\n\tif msg.Nonce != nonce {\n\t\tt.Errorf(\"NewMsgPing: wrong nonce - got %v, want %v\",\n\t\t\tmsg.Nonce, nonce)\n\t}\n\n\t// Ensure the command is expected value.\n\twantCmd := \"ping\"\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgPing: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\twantPayload := uint32(8)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n}\n\n// TestPingBIP0031 tests the MsgPing API against the protocol version\n// BIP0031Version.\nfunc TestPingBIP0031(t *testing.T) {\n\t// Use the protocol version just prior to BIP0031Version changes.\n\tpver := BIP0031Version\n\tenc := BaseEncoding\n\n\tnonce, err := RandomUint64()\n\tif err != nil {\n\t\tt.Errorf(\"RandomUint64: Error generating nonce: %v\", err)\n\t}\n\tmsg := NewMsgPing(nonce)\n\tif msg.Nonce != nonce {\n\t\tt.Errorf(\"NewMsgPing: wrong nonce - got %v, want %v\",\n\t\t\tmsg.Nonce, nonce)\n\t}\n\n\t// Ensure max payload is expected value for old protocol version.\n\twantPayload := uint32(0)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Test encode with old protocol version.\n\tvar buf bytes.Buffer\n\terr = msg.BtcEncode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgPing failed %v err <%v>\", msg, err)\n\t}\n\n\t// Test decode with old protocol version.\n\treadmsg := NewMsgPing(0)\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgPing failed [%v] err <%v>\", buf, err)\n\t}\n\n\t// Since this protocol version doesn't support the nonce, make sure\n\t// it didn't get encoded and decoded back out.\n\tif msg.Nonce == readmsg.Nonce {\n\t\tt.Errorf(\"Should not get same nonce for protocol version %d\", pver)\n\t}\n}\n\n// TestPingCrossProtocol tests the MsgPing API when encoding with the latest\n// protocol version and decoding with BIP0031Version.\nfunc TestPingCrossProtocol(t *testing.T) {\n\tnonce, err := RandomUint64()\n\tif err != nil {\n\t\tt.Errorf(\"RandomUint64: Error generating nonce: %v\", err)\n\t}\n\tmsg := NewMsgPing(nonce)\n\tif msg.Nonce != nonce {\n\t\tt.Errorf(\"NewMsgPing: wrong nonce - got %v, want %v\",\n\t\t\tmsg.Nonce, nonce)\n\t}\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr = msg.BtcEncode(&buf, ProtocolVersion, BaseEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgPing failed %v err <%v>\", msg, err)\n\t}\n\n\t// Decode with old protocol version.\n\treadmsg := NewMsgPing(0)\n\terr = readmsg.BtcDecode(&buf, BIP0031Version, BaseEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgPing failed [%v] err <%v>\", buf, err)\n\t}\n\n\t// Since one of the protocol versions doesn't support the nonce, make\n\t// sure it didn't get encoded and decoded back out.\n\tif msg.Nonce == readmsg.Nonce {\n\t\tt.Error(\"Should not get same nonce for cross protocol\")\n\t}\n}\n\n// TestPingWire tests the MsgPing wire encode and decode for various protocol\n// versions.\nfunc TestPingWire(t *testing.T) {\n\ttests := []struct {\n\t\tin   MsgPing         // Message to encode\n\t\tout  MsgPing         // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\tMsgPing{Nonce: 123123}, // 0x1e0f3\n\t\t\tMsgPing{Nonce: 123123}, // 0x1e0f3\n\t\t\t[]byte{0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00},\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version+1\n\t\t{\n\t\t\tMsgPing{Nonce: 456456}, // 0x6f708\n\t\t\tMsgPing{Nonce: 456456}, // 0x6f708\n\t\t\t[]byte{0x08, 0xf7, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00},\n\t\t\tBIP0031Version + 1,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version\n\t\t{\n\t\t\tMsgPing{Nonce: 789789}, // 0xc0d1d\n\t\t\tMsgPing{Nonce: 0},      // No nonce for pver\n\t\t\t[]byte{},               // No nonce for pver\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgPing\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestPingWireErrors performs negative tests against wire encode and decode\n// of MsgPing to confirm error paths work correctly.\nfunc TestPingWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\n\ttests := []struct {\n\t\tin       *MsgPing        // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t{\n\t\t\t&MsgPing{Nonce: 123123}, // 0x1e0f3\n\t\t\t[]byte{0xf3, 0xe0, 0x01, 0x00},\n\t\t\tpver,\n\t\t\tBaseEncoding,\n\t\t\t2,\n\t\t\tio.ErrShortWrite,\n\t\t\tio.ErrUnexpectedEOF,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif err != test.writeErr {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgPing\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif err != test.readErr {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msgpong.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MsgPong implements the Message interface and represents a bitcoin pong\n// message which is used primarily to confirm that a connection is still valid\n// in response to a bitcoin ping message (MsgPing).\n//\n// This message was not added until protocol versions AFTER BIP0031Version.\ntype MsgPong struct {\n\t// Unique value associated with message that is used to identify\n\t// specific ping message.\n\tNonce uint64\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgPong) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\t// NOTE: <= is not a mistake here.  The BIP0031 was defined as AFTER\n\t// the version unlike most others.\n\tif pver <= BIP0031Version {\n\t\tstr := fmt.Sprintf(\"pong message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgPong.BtcDecode\", str)\n\t}\n\n\tnonce, err := binarySerializer.Uint64(r, littleEndian)\n\tif err != nil {\n\t\treturn err\n\t}\n\tmsg.Nonce = nonce\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgPong) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\t// NOTE: <= is not a mistake here.  The BIP0031 was defined as AFTER\n\t// the version unlike most others.\n\tif pver <= BIP0031Version {\n\t\tstr := fmt.Sprintf(\"pong message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgPong.BtcEncode\", str)\n\t}\n\n\treturn binarySerializer.PutUint64(w, littleEndian, msg.Nonce)\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgPong) Command() string {\n\treturn CmdPong\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgPong) MaxPayloadLength(pver uint32) uint32 {\n\tplen := uint32(0)\n\t// The pong message did not exist for BIP0031Version and earlier.\n\t// NOTE: > is not a mistake here.  The BIP0031 was defined as AFTER\n\t// the version unlike most others.\n\tif pver > BIP0031Version {\n\t\t// Nonce 8 bytes.\n\t\tplen += 8\n\t}\n\n\treturn plen\n}\n\n// NewMsgPong returns a new bitcoin pong message that conforms to the Message\n// interface.  See MsgPong for details.\nfunc NewMsgPong(nonce uint64) *MsgPong {\n\treturn &MsgPong{\n\t\tNonce: nonce,\n\t}\n}\n"
  },
  {
    "path": "wire/msgpong_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestPongLatest tests the MsgPong API against the latest protocol version.\nfunc TestPongLatest(t *testing.T) {\n\tenc := BaseEncoding\n\tpver := ProtocolVersion\n\n\tnonce, err := RandomUint64()\n\tif err != nil {\n\t\tt.Errorf(\"RandomUint64: error generating nonce: %v\", err)\n\t}\n\tmsg := NewMsgPong(nonce)\n\tif msg.Nonce != nonce {\n\t\tt.Errorf(\"NewMsgPong: wrong nonce - got %v, want %v\",\n\t\t\tmsg.Nonce, nonce)\n\t}\n\n\t// Ensure the command is expected value.\n\twantCmd := \"pong\"\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgPong: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\twantPayload := uint32(8)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Test encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr = msg.BtcEncode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgPong failed %v err <%v>\", msg, err)\n\t}\n\n\t// Test decode with latest protocol version.\n\treadmsg := NewMsgPong(0)\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgPong failed [%v] err <%v>\", buf, err)\n\t}\n\n\t// Ensure nonce is the same.\n\tif msg.Nonce != readmsg.Nonce {\n\t\tt.Errorf(\"Should get same nonce for protocol version %d\", pver)\n\t}\n}\n\n// TestPongBIP0031 tests the MsgPong API against the protocol version\n// BIP0031Version.\nfunc TestPongBIP0031(t *testing.T) {\n\t// Use the protocol version just prior to BIP0031Version changes.\n\tpver := BIP0031Version\n\tenc := BaseEncoding\n\n\tnonce, err := RandomUint64()\n\tif err != nil {\n\t\tt.Errorf(\"Error generating nonce: %v\", err)\n\t}\n\tmsg := NewMsgPong(nonce)\n\tif msg.Nonce != nonce {\n\t\tt.Errorf(\"Should get same nonce back out.\")\n\t}\n\n\t// Ensure max payload is expected value for old protocol version.\n\tsize := msg.MaxPayloadLength(pver)\n\tif size != 0 {\n\t\tt.Errorf(\"Max length should be 0 for pong protocol version %d.\",\n\t\t\tpver)\n\t}\n\n\t// Test encode with old protocol version.\n\tvar buf bytes.Buffer\n\terr = msg.BtcEncode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgPong succeeded when it shouldn't have %v\",\n\t\t\tmsg)\n\t}\n\n\t// Test decode with old protocol version.\n\treadmsg := NewMsgPong(0)\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgPong succeeded when it shouldn't have %v\",\n\t\t\tspew.Sdump(buf))\n\t}\n\n\t// Since this protocol version doesn't support pong, make sure the\n\t// nonce didn't get encoded and decoded back out.\n\tif msg.Nonce == readmsg.Nonce {\n\t\tt.Errorf(\"Should not get same nonce for protocol version %d\", pver)\n\t}\n}\n\n// TestPongCrossProtocol tests the MsgPong API when encoding with the latest\n// protocol version and decoding with BIP0031Version.\nfunc TestPongCrossProtocol(t *testing.T) {\n\tnonce, err := RandomUint64()\n\tif err != nil {\n\t\tt.Errorf(\"Error generating nonce: %v\", err)\n\t}\n\tmsg := NewMsgPong(nonce)\n\tif msg.Nonce != nonce {\n\t\tt.Errorf(\"Should get same nonce back out.\")\n\t}\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr = msg.BtcEncode(&buf, ProtocolVersion, BaseEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgPong failed %v err <%v>\", msg, err)\n\t}\n\n\t// Decode with old protocol version.\n\treadmsg := NewMsgPong(0)\n\terr = readmsg.BtcDecode(&buf, BIP0031Version, BaseEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgPong succeeded when it shouldn't have %v\",\n\t\t\tmsg)\n\t}\n\n\t// Since one of the protocol versions doesn't support the pong message,\n\t// make sure the nonce didn't get encoded and decoded back out.\n\tif msg.Nonce == readmsg.Nonce {\n\t\tt.Error(\"Should not get same nonce for cross protocol\")\n\t}\n}\n\n// TestPongWire tests the MsgPong wire encode and decode for various protocol\n// versions.\nfunc TestPongWire(t *testing.T) {\n\ttests := []struct {\n\t\tin   MsgPong         // Message to encode\n\t\tout  MsgPong         // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\tMsgPong{Nonce: 123123}, // 0x1e0f3\n\t\t\tMsgPong{Nonce: 123123}, // 0x1e0f3\n\t\t\t[]byte{0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00},\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version+1\n\t\t{\n\t\t\tMsgPong{Nonce: 456456}, // 0x6f708\n\t\t\tMsgPong{Nonce: 456456}, // 0x6f708\n\t\t\t[]byte{0x08, 0xf7, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00},\n\t\t\tBIP0031Version + 1,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgPong\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestPongWireErrors performs negative tests against wire encode and decode\n// of MsgPong to confirm error paths work correctly.\nfunc TestPongWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\tpverNoPong := BIP0031Version\n\twireErr := &MessageError{}\n\n\tbasePong := NewMsgPong(123123) // 0x1e0f3\n\tbasePongEncoded := []byte{\n\t\t0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t}\n\n\ttests := []struct {\n\t\tin       *MsgPong        // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t// Force error in nonce.\n\t\t{basePong, basePongEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error due to unsupported protocol version.\n\t\t{basePong, basePongEncoded, pverNoPong, BaseEncoding, 4, wireErr, wireErr},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgPong\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "wire/msgreject.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\n// RejectCode represents a numeric value by which a remote peer indicates\n// why a message was rejected.\ntype RejectCode uint8\n\n// These constants define the various supported reject codes.\nconst (\n\tRejectMalformed       RejectCode = 0x01\n\tRejectInvalid         RejectCode = 0x10\n\tRejectObsolete        RejectCode = 0x11\n\tRejectDuplicate       RejectCode = 0x12\n\tRejectNonstandard     RejectCode = 0x40\n\tRejectDust            RejectCode = 0x41\n\tRejectInsufficientFee RejectCode = 0x42\n\tRejectCheckpoint      RejectCode = 0x43\n)\n\n// Map of reject codes back strings for pretty printing.\nvar rejectCodeStrings = map[RejectCode]string{\n\tRejectMalformed:       \"REJECT_MALFORMED\",\n\tRejectInvalid:         \"REJECT_INVALID\",\n\tRejectObsolete:        \"REJECT_OBSOLETE\",\n\tRejectDuplicate:       \"REJECT_DUPLICATE\",\n\tRejectNonstandard:     \"REJECT_NONSTANDARD\",\n\tRejectDust:            \"REJECT_DUST\",\n\tRejectInsufficientFee: \"REJECT_INSUFFICIENTFEE\",\n\tRejectCheckpoint:      \"REJECT_CHECKPOINT\",\n}\n\n// String returns the RejectCode in human-readable form.\nfunc (code RejectCode) String() string {\n\tif s, ok := rejectCodeStrings[code]; ok {\n\t\treturn s\n\t}\n\n\treturn fmt.Sprintf(\"Unknown RejectCode (%d)\", uint8(code))\n}\n\n// MsgReject implements the Message interface and represents a bitcoin reject\n// message.\n//\n// This message was not added until protocol version RejectVersion.\ntype MsgReject struct {\n\t// Cmd is the command for the message which was rejected such as\n\t// as CmdBlock or CmdTx.  This can be obtained from the Command function\n\t// of a Message.\n\tCmd string\n\n\t// RejectCode is a code indicating why the command was rejected.  It\n\t// is encoded as a uint8 on the wire.\n\tCode RejectCode\n\n\t// Reason is a human-readable string with specific details (over and\n\t// above the reject code) about why the command was rejected.\n\tReason string\n\n\t// Hash identifies a specific block or transaction that was rejected\n\t// and therefore only applies the MsgBlock and MsgTx messages.\n\tHash chainhash.Hash\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgReject) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tif pver < RejectVersion {\n\t\tstr := fmt.Sprintf(\"reject message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgReject.BtcDecode\", str)\n\t}\n\n\t// Command that was rejected.\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tcmd, err := readVarStringBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\tmsg.Cmd = cmd\n\n\t// Code indicating why the command was rejected.\n\tif _, err := io.ReadFull(r, buf[:1]); err != nil {\n\t\treturn err\n\t}\n\tmsg.Code = RejectCode(buf[0])\n\n\t// Human readable string with specific details (over and above the\n\t// reject code above) about why the command was rejected.\n\treason, err := readVarStringBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\tmsg.Reason = reason\n\n\t// CmdBlock and CmdTx messages have an additional hash field that\n\t// identifies the specific block or transaction.\n\tif msg.Cmd == CmdBlock || msg.Cmd == CmdTx {\n\t\t_, err := io.ReadFull(r, msg.Hash[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgReject) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tif pver < RejectVersion {\n\t\tstr := fmt.Sprintf(\"reject message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgReject.BtcEncode\", str)\n\t}\n\n\t// Command that was rejected.\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := writeVarStringBuf(w, pver, msg.Cmd, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Code indicating why the command was rejected.\n\tbuf[0] = byte(msg.Code)\n\tif _, err := w.Write(buf[:1]); err != nil {\n\t\treturn err\n\t}\n\n\t// Human readable string with specific details (over and above the\n\t// reject code above) about why the command was rejected.\n\terr = writeVarStringBuf(w, pver, msg.Reason, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// CmdBlock and CmdTx messages have an additional hash field that\n\t// identifies the specific block or transaction.\n\tif msg.Cmd == CmdBlock || msg.Cmd == CmdTx {\n\t\t_, err := w.Write(msg.Hash[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgReject) Command() string {\n\treturn CmdReject\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgReject) MaxPayloadLength(pver uint32) uint32 {\n\tplen := uint32(0)\n\t// The reject message did not exist before protocol version\n\t// RejectVersion.\n\tif pver >= RejectVersion {\n\t\t// Unfortunately the bitcoin protocol does not enforce a sane\n\t\t// limit on the length of the reason, so the max payload is the\n\t\t// overall maximum message payload.\n\t\tplen = MaxMessagePayload\n\t}\n\n\treturn plen\n}\n\n// NewMsgReject returns a new bitcoin reject message that conforms to the\n// Message interface.  See MsgReject for details.\nfunc NewMsgReject(command string, code RejectCode, reason string) *MsgReject {\n\treturn &MsgReject{\n\t\tCmd:    command,\n\t\tCode:   code,\n\t\tReason: reason,\n\t}\n}\n"
  },
  {
    "path": "wire/msgreject_test.go",
    "content": "// Copyright (c) 2014-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestRejectCodeStringer tests the stringized output for the reject code type.\nfunc TestRejectCodeStringer(t *testing.T) {\n\ttests := []struct {\n\t\tin   RejectCode\n\t\twant string\n\t}{\n\t\t{RejectMalformed, \"REJECT_MALFORMED\"},\n\t\t{RejectInvalid, \"REJECT_INVALID\"},\n\t\t{RejectObsolete, \"REJECT_OBSOLETE\"},\n\t\t{RejectDuplicate, \"REJECT_DUPLICATE\"},\n\t\t{RejectNonstandard, \"REJECT_NONSTANDARD\"},\n\t\t{RejectDust, \"REJECT_DUST\"},\n\t\t{RejectInsufficientFee, \"REJECT_INSUFFICIENTFEE\"},\n\t\t{RejectCheckpoint, \"REJECT_CHECKPOINT\"},\n\t\t{0xff, \"Unknown RejectCode (255)\"},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.String()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"String #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n\n}\n\n// TestRejectLatest tests the MsgPong API against the latest protocol version.\nfunc TestRejectLatest(t *testing.T) {\n\tpver := ProtocolVersion\n\tenc := BaseEncoding\n\n\t// Create reject message data.\n\trejCommand := (&MsgBlock{}).Command()\n\trejCode := RejectDuplicate\n\trejReason := \"duplicate block\"\n\trejHash := mainNetGenesisHash\n\n\t// Ensure we get the correct data back out.\n\tmsg := NewMsgReject(rejCommand, rejCode, rejReason)\n\tmsg.Hash = rejHash\n\tif msg.Cmd != rejCommand {\n\t\tt.Errorf(\"NewMsgReject: wrong rejected command - got %v, \"+\n\t\t\t\"want %v\", msg.Cmd, rejCommand)\n\t}\n\tif msg.Code != rejCode {\n\t\tt.Errorf(\"NewMsgReject: wrong rejected code - got %v, \"+\n\t\t\t\"want %v\", msg.Code, rejCode)\n\t}\n\tif msg.Reason != rejReason {\n\t\tt.Errorf(\"NewMsgReject: wrong rejected reason - got %v, \"+\n\t\t\t\"want %v\", msg.Reason, rejReason)\n\t}\n\n\t// Ensure the command is expected value.\n\twantCmd := \"reject\"\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgReject: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\twantPayload := uint32(MaxMessagePayload)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Test encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgReject failed %v err <%v>\", msg, err)\n\t}\n\n\t// Test decode with latest protocol version.\n\treadMsg := MsgReject{}\n\terr = readMsg.BtcDecode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgReject failed %v err <%v>\", buf.Bytes(),\n\t\t\terr)\n\t}\n\n\t// Ensure decoded data is the same.\n\tif msg.Cmd != readMsg.Cmd {\n\t\tt.Errorf(\"Should get same reject command - got %v, want %v\",\n\t\t\treadMsg.Cmd, msg.Cmd)\n\t}\n\tif msg.Code != readMsg.Code {\n\t\tt.Errorf(\"Should get same reject code - got %v, want %v\",\n\t\t\treadMsg.Code, msg.Code)\n\t}\n\tif msg.Reason != readMsg.Reason {\n\t\tt.Errorf(\"Should get same reject reason - got %v, want %v\",\n\t\t\treadMsg.Reason, msg.Reason)\n\t}\n\tif msg.Hash != readMsg.Hash {\n\t\tt.Errorf(\"Should get same reject hash - got %v, want %v\",\n\t\t\treadMsg.Hash, msg.Hash)\n\t}\n}\n\n// TestRejectBeforeAdded tests the MsgReject API against a protocol version\n// before the version which introduced it (RejectVersion).\nfunc TestRejectBeforeAdded(t *testing.T) {\n\t// Use the protocol version just prior to RejectVersion.\n\tpver := RejectVersion - 1\n\tenc := BaseEncoding\n\n\t// Create reject message data.\n\trejCommand := (&MsgBlock{}).Command()\n\trejCode := RejectDuplicate\n\trejReason := \"duplicate block\"\n\trejHash := mainNetGenesisHash\n\n\tmsg := NewMsgReject(rejCommand, rejCode, rejReason)\n\tmsg.Hash = rejHash\n\n\t// Ensure max payload is expected value for old protocol version.\n\tsize := msg.MaxPayloadLength(pver)\n\tif size != 0 {\n\t\tt.Errorf(\"Max length should be 0 for reject protocol version %d.\",\n\t\t\tpver)\n\t}\n\n\t// Test encode with old protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgReject succeeded when it shouldn't \"+\n\t\t\t\"have %v\", msg)\n\t}\n\n\t//\t// Test decode with old protocol version.\n\treadMsg := MsgReject{}\n\terr = readMsg.BtcDecode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgReject succeeded when it shouldn't \"+\n\t\t\t\"have %v\", spew.Sdump(buf.Bytes()))\n\t}\n\n\t// Since this protocol version doesn't support reject, make sure various\n\t// fields didn't get encoded and decoded back out.\n\tif msg.Cmd == readMsg.Cmd {\n\t\tt.Errorf(\"Should not get same reject command for protocol \"+\n\t\t\t\"version %d\", pver)\n\t}\n\tif msg.Code == readMsg.Code {\n\t\tt.Errorf(\"Should not get same reject code for protocol \"+\n\t\t\t\"version %d\", pver)\n\t}\n\tif msg.Reason == readMsg.Reason {\n\t\tt.Errorf(\"Should not get same reject reason for protocol \"+\n\t\t\t\"version %d\", pver)\n\t}\n\tif msg.Hash == readMsg.Hash {\n\t\tt.Errorf(\"Should not get same reject hash for protocol \"+\n\t\t\t\"version %d\", pver)\n\t}\n}\n\n// TestRejectCrossProtocol tests the MsgReject API when encoding with the latest\n// protocol version and decoded with a version before the version which\n// introduced it (RejectVersion).\nfunc TestRejectCrossProtocol(t *testing.T) {\n\t// Create reject message data.\n\trejCommand := (&MsgBlock{}).Command()\n\trejCode := RejectDuplicate\n\trejReason := \"duplicate block\"\n\trejHash := mainNetGenesisHash\n\n\tmsg := NewMsgReject(rejCommand, rejCode, rejReason)\n\tmsg.Hash = rejHash\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, ProtocolVersion, BaseEncoding)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgReject failed %v err <%v>\", msg, err)\n\t}\n\n\t// Decode with old protocol version.\n\treadMsg := MsgReject{}\n\terr = readMsg.BtcDecode(&buf, RejectVersion-1, BaseEncoding)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgReject succeeded when it shouldn't \"+\n\t\t\t\"have %v\", msg)\n\t}\n\n\t// Since one of the protocol versions doesn't support the reject\n\t// message, make sure the various fields didn't get encoded and decoded\n\t// back out.\n\tif msg.Cmd == readMsg.Cmd {\n\t\tt.Errorf(\"Should not get same reject command for cross protocol\")\n\t}\n\tif msg.Code == readMsg.Code {\n\t\tt.Errorf(\"Should not get same reject code for cross protocol\")\n\t}\n\tif msg.Reason == readMsg.Reason {\n\t\tt.Errorf(\"Should not get same reject reason for cross protocol\")\n\t}\n\tif msg.Hash == readMsg.Hash {\n\t\tt.Errorf(\"Should not get same reject hash for cross protocol\")\n\t}\n}\n\n// TestRejectWire tests the MsgReject wire encode and decode for various\n// protocol versions.\nfunc TestRejectWire(t *testing.T) {\n\ttests := []struct {\n\t\tmsg  MsgReject       // Message to encode\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version rejected command version (no hash).\n\t\t{\n\t\t\tMsgReject{\n\t\t\t\tCmd:    \"version\",\n\t\t\t\tCode:   RejectDuplicate,\n\t\t\t\tReason: \"duplicate version\",\n\t\t\t},\n\t\t\t[]byte{\n\t\t\t\t0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, // \"version\"\n\t\t\t\t0x12, // RejectDuplicate\n\t\t\t\t0x11, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61,\n\t\t\t\t0x74, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69,\n\t\t\t\t0x6f, 0x6e, // \"duplicate version\"\n\t\t\t},\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t\t// Latest protocol version rejected command block (has hash).\n\t\t{\n\t\t\tMsgReject{\n\t\t\t\tCmd:    \"block\",\n\t\t\t\tCode:   RejectDuplicate,\n\t\t\t\tReason: \"duplicate block\",\n\t\t\t\tHash:   mainNetGenesisHash,\n\t\t\t},\n\t\t\t[]byte{\n\t\t\t\t0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, // \"block\"\n\t\t\t\t0x12, // RejectDuplicate\n\t\t\t\t0x0f, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61,\n\t\t\t\t0x74, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, // \"duplicate block\"\n\t\t\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // mainNetGenesisHash\n\t\t\t},\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.msg.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgReject\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(msg, test.msg) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.msg))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestRejectWireErrors performs negative tests against wire encode and decode\n// of MsgReject to confirm error paths work correctly.\nfunc TestRejectWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\tpverNoReject := RejectVersion - 1\n\twireErr := &MessageError{}\n\n\tbaseReject := NewMsgReject(\"block\", RejectDuplicate, \"duplicate block\")\n\tbaseReject.Hash = mainNetGenesisHash\n\tbaseRejectEncoded := []byte{\n\t\t0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, // \"block\"\n\t\t0x12, // RejectDuplicate\n\t\t0x0f, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61,\n\t\t0x74, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, // \"duplicate block\"\n\t\t0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72,\n\t\t0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f,\n\t\t0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c,\n\t\t0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, // mainNetGenesisHash\n\t}\n\n\ttests := []struct {\n\t\tin       *MsgReject      // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Latest protocol version with intentional read/write errors.\n\t\t// Force error in reject command.\n\t\t{baseReject, baseRejectEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in reject code.\n\t\t{baseReject, baseRejectEncoded, pver, BaseEncoding, 6, io.ErrShortWrite, io.EOF},\n\t\t// Force error in reject reason.\n\t\t{baseReject, baseRejectEncoded, pver, BaseEncoding, 7, io.ErrShortWrite, io.EOF},\n\t\t// Force error in reject hash.\n\t\t{baseReject, baseRejectEncoded, pver, BaseEncoding, 23, io.ErrShortWrite, io.EOF},\n\t\t// Force error due to unsupported protocol version.\n\t\t{baseReject, baseRejectEncoded, pverNoReject, BaseEncoding, 6, wireErr, wireErr},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgReject\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msgsendaddrv2.go",
    "content": "package wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MsgSendAddrV2 defines a bitcoin sendaddrv2 message which is used for a peer\n// to signal support for receiving ADDRV2 messages (BIP155). It implements the\n// Message interface.\n//\n// This message has no payload.\ntype MsgSendAddrV2 struct{}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgSendAddrV2) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tif pver < AddrV2Version {\n\t\tstr := fmt.Sprintf(\"sendaddrv2 message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgSendAddrV2.BtcDecode\", str)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgSendAddrV2) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tif pver < AddrV2Version {\n\t\tstr := fmt.Sprintf(\"sendaddrv2 message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgSendAddrV2.BtcEncode\", str)\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgSendAddrV2) Command() string {\n\treturn CmdSendAddrV2\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgSendAddrV2) MaxPayloadLength(pver uint32) uint32 {\n\treturn 0\n}\n\n// NewMsgSendAddrV2 returns a new bitcoin sendaddrv2 message that conforms to the\n// Message interface.\nfunc NewMsgSendAddrV2() *MsgSendAddrV2 {\n\treturn &MsgSendAddrV2{}\n}\n"
  },
  {
    "path": "wire/msgsendaddrv2_test.go",
    "content": "// Copyright (c) 2024 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestSendAddrV2 tests the MsgSendAddrV2 API against the latest protocol\n// version.\nfunc TestSendAddrV2(t *testing.T) {\n\tpver := ProtocolVersion\n\tenc := BaseEncoding\n\n\t// Ensure the command is expected value.\n\twantCmd := \"sendaddrv2\"\n\tmsg := NewMsgSendAddrV2()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgSendAddrV2: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value.\n\twantPayload := uint32(0)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Test encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgSendAddrV2 failed %v err <%v>\", msg,\n\t\t\terr)\n\t}\n\n\t// Older protocol versions should fail encode since message didn't\n\t// exist yet.\n\toldPver := AddrV2Version - 1\n\terr = msg.BtcEncode(&buf, oldPver, enc)\n\tif err == nil {\n\t\ts := \"encode of MsgSendAddrV2 passed for old protocol \" +\n\t\t\t\"version %v err <%v>\"\n\t\tt.Errorf(s, msg, err)\n\t}\n\n\t// Test decode with latest protocol version.\n\treadmsg := NewMsgSendAddrV2()\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgSendAddrV2 failed [%v] err <%v>\", buf,\n\t\t\terr)\n\t}\n\n\t// Older protocol versions should fail decode since message didn't\n\t// exist yet.\n\terr = readmsg.BtcDecode(&buf, oldPver, enc)\n\tif err == nil {\n\t\ts := \"decode of MsgSendAddrV2 passed for old protocol \" +\n\t\t\t\"version %v err <%v>\"\n\t\tt.Errorf(s, msg, err)\n\t}\n}\n\n// TestSendAddrV2BIP0130 tests the MsgSendAddrV2 API against the protocol\n// prior to version AddrV2Version.\nfunc TestSendAddrV2BIP0130(t *testing.T) {\n\t// Use the protocol version just prior to AddrV2Version changes.\n\tpver := AddrV2Version - 1\n\tenc := BaseEncoding\n\n\tmsg := NewMsgSendAddrV2()\n\n\t// Test encode with old protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgSendAddrV2 succeeded when it should \" +\n\t\t\t\"have failed\")\n\t}\n\n\t// Test decode with old protocol version.\n\treadmsg := NewMsgSendAddrV2()\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgSendAddrV2 succeeded when it should \" +\n\t\t\t\"have failed\")\n\t}\n}\n\n// TestSendAddrV2CrossProtocol tests the MsgSendAddrV2 API when encoding with\n// the latest protocol version and decoding with AddrV2Version.\nfunc TestSendAddrV2CrossProtocol(t *testing.T) {\n\tenc := BaseEncoding\n\tmsg := NewMsgSendAddrV2()\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, ProtocolVersion, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgSendAddrV2 failed %v err <%v>\", msg,\n\t\t\terr)\n\t}\n\n\t// Decode with old protocol version.\n\treadmsg := NewMsgSendAddrV2()\n\terr = readmsg.BtcDecode(&buf, AddrV2Version, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgSendAddrV2 failed [%v] err <%v>\", buf,\n\t\t\terr)\n\t}\n}\n\n// TestSendAddrV2Wire tests the MsgSendAddrV2 wire encode and decode for\n// various protocol versions.\nfunc TestSendAddrV2Wire(t *testing.T) {\n\tmsgSendAddrV2 := NewMsgSendAddrV2()\n\tmsgSendAddrV2Encoded := []byte{}\n\n\ttests := []struct {\n\t\tin   *MsgSendAddrV2  // Message to encode\n\t\tout  *MsgSendAddrV2  // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\tmsgSendAddrV2,\n\t\t\tmsgSendAddrV2,\n\t\t\tmsgSendAddrV2Encoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version AddrV2Version+1\n\t\t{\n\t\t\tmsgSendAddrV2,\n\t\t\tmsgSendAddrV2,\n\t\t\tmsgSendAddrV2Encoded,\n\t\t\tAddrV2Version + 1,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version AddrV2Version\n\t\t{\n\t\t\tmsgSendAddrV2,\n\t\t\tmsgSendAddrV2,\n\t\t\tmsgSendAddrV2Encoded,\n\t\t\tAddrV2Version,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgSendAddrV2\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msgsendheaders.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MsgSendHeaders implements the Message interface and represents a bitcoin\n// sendheaders message.  It is used to request the peer send block headers\n// rather than inventory vectors.\n//\n// This message has no payload and was not added until protocol versions\n// starting with SendHeadersVersion.\ntype MsgSendHeaders struct{}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgSendHeaders) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tif pver < SendHeadersVersion {\n\t\tstr := fmt.Sprintf(\"sendheaders message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgSendHeaders.BtcDecode\", str)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgSendHeaders) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tif pver < SendHeadersVersion {\n\t\tstr := fmt.Sprintf(\"sendheaders message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgSendHeaders.BtcEncode\", str)\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgSendHeaders) Command() string {\n\treturn CmdSendHeaders\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgSendHeaders) MaxPayloadLength(pver uint32) uint32 {\n\treturn 0\n}\n\n// NewMsgSendHeaders returns a new bitcoin sendheaders message that conforms to\n// the Message interface.  See MsgSendHeaders for details.\nfunc NewMsgSendHeaders() *MsgSendHeaders {\n\treturn &MsgSendHeaders{}\n}\n"
  },
  {
    "path": "wire/msgsendheaders_test.go",
    "content": "// Copyright (c) 2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestSendHeaders tests the MsgSendHeaders API against the latest protocol\n// version.\nfunc TestSendHeaders(t *testing.T) {\n\tpver := ProtocolVersion\n\tenc := BaseEncoding\n\n\t// Ensure the command is expected value.\n\twantCmd := \"sendheaders\"\n\tmsg := NewMsgSendHeaders()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgSendHeaders: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value.\n\twantPayload := uint32(0)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Test encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgSendHeaders failed %v err <%v>\", msg,\n\t\t\terr)\n\t}\n\n\t// Older protocol versions should fail encode since message didn't\n\t// exist yet.\n\toldPver := SendHeadersVersion - 1\n\terr = msg.BtcEncode(&buf, oldPver, enc)\n\tif err == nil {\n\t\ts := \"encode of MsgSendHeaders passed for old protocol \" +\n\t\t\t\"version %v err <%v>\"\n\t\tt.Errorf(s, msg, err)\n\t}\n\n\t// Test decode with latest protocol version.\n\treadmsg := NewMsgSendHeaders()\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgSendHeaders failed [%v] err <%v>\", buf,\n\t\t\terr)\n\t}\n\n\t// Older protocol versions should fail decode since message didn't\n\t// exist yet.\n\terr = readmsg.BtcDecode(&buf, oldPver, enc)\n\tif err == nil {\n\t\ts := \"decode of MsgSendHeaders passed for old protocol \" +\n\t\t\t\"version %v err <%v>\"\n\t\tt.Errorf(s, msg, err)\n\t}\n}\n\n// TestSendHeadersBIP0130 tests the MsgSendHeaders API against the protocol\n// prior to version SendHeadersVersion.\nfunc TestSendHeadersBIP0130(t *testing.T) {\n\t// Use the protocol version just prior to SendHeadersVersion changes.\n\tpver := SendHeadersVersion - 1\n\tenc := BaseEncoding\n\n\tmsg := NewMsgSendHeaders()\n\n\t// Test encode with old protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgSendHeaders succeeded when it should \" +\n\t\t\t\"have failed\")\n\t}\n\n\t// Test decode with old protocol version.\n\treadmsg := NewMsgSendHeaders()\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgSendHeaders succeeded when it should \" +\n\t\t\t\"have failed\")\n\t}\n}\n\n// TestSendHeadersCrossProtocol tests the MsgSendHeaders API when encoding with\n// the latest protocol version and decoding with SendHeadersVersion.\nfunc TestSendHeadersCrossProtocol(t *testing.T) {\n\tenc := BaseEncoding\n\tmsg := NewMsgSendHeaders()\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, ProtocolVersion, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgSendHeaders failed %v err <%v>\", msg,\n\t\t\terr)\n\t}\n\n\t// Decode with old protocol version.\n\treadmsg := NewMsgSendHeaders()\n\terr = readmsg.BtcDecode(&buf, SendHeadersVersion, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgSendHeaders failed [%v] err <%v>\", buf,\n\t\t\terr)\n\t}\n}\n\n// TestSendHeadersWire tests the MsgSendHeaders wire encode and decode for\n// various protocol versions.\nfunc TestSendHeadersWire(t *testing.T) {\n\tmsgSendHeaders := NewMsgSendHeaders()\n\tmsgSendHeadersEncoded := []byte{}\n\n\ttests := []struct {\n\t\tin   *MsgSendHeaders // Message to encode\n\t\tout  *MsgSendHeaders // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\tmsgSendHeaders,\n\t\t\tmsgSendHeaders,\n\t\t\tmsgSendHeadersEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version SendHeadersVersion+1\n\t\t{\n\t\t\tmsgSendHeaders,\n\t\t\tmsgSendHeaders,\n\t\t\tmsgSendHeadersEncoded,\n\t\t\tSendHeadersVersion + 1,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version SendHeadersVersion\n\t\t{\n\t\t\tmsgSendHeaders,\n\t\t\tmsgSendHeaders,\n\t\t\tmsgSendHeadersEncoded,\n\t\t\tSendHeadersVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgSendHeaders\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msgtx.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n)\n\nconst (\n\t// TxVersion is the current latest supported transaction version.\n\tTxVersion = 1\n\n\t// MaxTxInSequenceNum is the maximum sequence number the sequence field\n\t// of a transaction input can be.\n\tMaxTxInSequenceNum uint32 = 0xffffffff\n\n\t// MaxPrevOutIndex is the maximum index the index field of a previous\n\t// outpoint can be.\n\tMaxPrevOutIndex uint32 = 0xffffffff\n\n\t// SequenceLockTimeDisabled is a flag that if set on a transaction\n\t// input's sequence number, the sequence number will not be interpreted\n\t// as a relative locktime.\n\tSequenceLockTimeDisabled = 1 << 31\n\n\t// SequenceLockTimeIsSeconds is a flag that if set on a transaction\n\t// input's sequence number, the relative locktime has units of 512\n\t// seconds.\n\tSequenceLockTimeIsSeconds = 1 << 22\n\n\t// SequenceLockTimeMask is a mask that extracts the relative locktime\n\t// when masked against the transaction input sequence number.\n\tSequenceLockTimeMask = 0x0000ffff\n\n\t// SequenceLockTimeGranularity is the defined time based granularity\n\t// for seconds-based relative time locks. When converting from seconds\n\t// to a sequence number, the value is right shifted by this amount,\n\t// therefore the granularity of relative time locks in 512 or 2^9\n\t// seconds. Enforced relative lock times are multiples of 512 seconds.\n\tSequenceLockTimeGranularity = 9\n\n\t// defaultTxInOutAlloc is the default size used for the backing array for\n\t// transaction inputs and outputs.  The array will dynamically grow as needed,\n\t// but this figure is intended to provide enough space for the number of\n\t// inputs and outputs in a typical transaction without needing to grow the\n\t// backing array multiple times.\n\tdefaultTxInOutAlloc = 15\n\n\t// minTxInPayload is the minimum payload size for a transaction input.\n\t// PreviousOutPoint.Hash + PreviousOutPoint.Index 4 bytes + Varint for\n\t// SignatureScript length 1 byte + Sequence 4 bytes.\n\tminTxInPayload = 9 + chainhash.HashSize\n\n\t// maxTxInPerMessage is the maximum number of transactions inputs that\n\t// a transaction which fits into a message could possibly have.\n\tmaxTxInPerMessage = (MaxMessagePayload / minTxInPayload) + 1\n\n\t// MinTxOutPayload is the minimum payload size for a transaction output.\n\t// Value 8 bytes + Varint for PkScript length 1 byte.\n\tMinTxOutPayload = 9\n\n\t// maxTxOutPerMessage is the maximum number of transactions outputs that\n\t// a transaction which fits into a message could possibly have.\n\tmaxTxOutPerMessage = (MaxMessagePayload / MinTxOutPayload) + 1\n\n\t// minTxPayload is the minimum payload size for a transaction.  Note\n\t// that any realistically usable transaction must have at least one\n\t// input or output, but that is a rule enforced at a higher layer, so\n\t// it is intentionally not included here.\n\t// Version 4 bytes + Varint number of transaction inputs 1 byte + Varint\n\t// number of transaction outputs 1 byte + LockTime 4 bytes + min input\n\t// payload + min output payload.\n\tminTxPayload = 10\n\n\t// freeListMaxScriptSize is the size of each buffer in the free list\n\t// that\tis used for deserializing scripts from the wire before they are\n\t// concatenated into a single contiguous buffers.  This value was chosen\n\t// because it is slightly more than twice the size of the vast majority\n\t// of all \"standard\" scripts.  Larger scripts are still deserialized\n\t// properly as the free list will simply be bypassed for them.\n\tfreeListMaxScriptSize = 512\n\n\t// freeListMaxItems is the number of buffers to keep in the free list\n\t// to use for script deserialization.  This value allows up to 100\n\t// scripts per transaction being simultaneously deserialized by 125\n\t// peers.  Thus, the peak usage of the free list is 12,500 * 512 =\n\t// 6,400,000 bytes.\n\tfreeListMaxItems = 125\n\n\t// maxWitnessItemsPerInput is the maximum number of witness items to\n\t// be read for the witness data for a single TxIn. This number is\n\t// derived using a possible lower bound for the encoding of a witness\n\t// item: 1 byte for length + 1 byte for the witness item itself, or two\n\t// bytes. This value is then divided by the currently allowed maximum\n\t// \"cost\" for a transaction. We use this for an upper bound for the\n\t// buffer and consensus makes sure that the weight of a transaction\n\t// cannot be more than 4000000.\n\tmaxWitnessItemsPerInput = 4_000_000\n\n\t// maxWitnessItemSize is the maximum allowed size for an item within\n\t// an input's witness data. This value is bounded by the largest\n\t// possible block size, post segwit v1 (taproot).\n\tmaxWitnessItemSize = 4_000_000\n)\n\nvar (\n\t// errSuperfluousWitnessRecord is returned during tx deserialization when\n\t// a tx has the witness marker flag set but has no witnesses.\n\terrSuperfluousWitnessRecord = fmt.Errorf(\n\t\t\"witness flag set but tx has no witnesses\",\n\t)\n)\n\n// TxFlagMarker is the first byte of the FLAG field in a bitcoin tx\n// message. It allows decoders to distinguish a regular serialized\n// transaction from one that would require a different parsing logic.\n//\n// Position of FLAG in a bitcoin tx message:\n//\n//\t┌─────────┬────────────────────┬─────────────┬─────┐\n//\t│ VERSION │ FLAG               │ TX-IN-COUNT │ ... │\n//\t│ 4 bytes │ 2 bytes (optional) │ varint      │     │\n//\t└─────────┴────────────────────┴─────────────┴─────┘\n//\n// Zooming into the FLAG field:\n//\n//\t┌── FLAG ─────────────┬────────┐\n//\t│ TxFlagMarker (0x00) │ TxFlag │\n//\t│ 1 byte              │ 1 byte │\n//\t└─────────────────────┴────────┘\nconst TxFlagMarker = 0x00\n\n// TxFlag is the second byte of the FLAG field in a bitcoin tx message.\n// It indicates the decoding logic to use in the transaction parser, if\n// TxFlagMarker is detected in the tx message.\n//\n// As of writing this, only the witness flag (0x01) is supported, but may be\n// extended in the future to accommodate auxiliary non-committed fields.\ntype TxFlag = byte\n\nconst (\n\t// WitnessFlag is a flag specific to witness encoding. If the TxFlagMarker\n\t// is encountered followed by the WitnessFlag, then it indicates a\n\t// transaction has witness data. This allows decoders to distinguish a\n\t// serialized transaction with witnesses from a legacy one.\n\tWitnessFlag TxFlag = 0x01\n)\n\nconst scriptSlabSize = 1 << 22\n\ntype scriptSlab [scriptSlabSize]byte\n\n// scriptFreeList defines a free list of byte slices (up to the maximum number\n// defined by the freeListMaxItems constant) that have a cap according to the\n// freeListMaxScriptSize constant.  It is used to provide temporary buffers for\n// deserializing scripts in order to greatly reduce the number of allocations\n// required.\n//\n// The caller can obtain a buffer from the free list by calling the Borrow\n// function and should return it via the Return function when done using it.\ntype scriptFreeList chan *scriptSlab\n\n// Borrow returns a byte slice from the free list with a length according the\n// provided size.  A new buffer is allocated if there are any items available.\n//\n// When the size is larger than the max size allowed for items on the free list\n// a new buffer of the appropriate size is allocated and returned.  It is safe\n// to attempt to return said buffer via the Return function as it will be\n// ignored and allowed to go the garbage collector.\nfunc (c scriptFreeList) Borrow() *scriptSlab {\n\tvar buf *scriptSlab\n\tselect {\n\tcase buf = <-c:\n\tdefault:\n\t\tbuf = new(scriptSlab)\n\t}\n\treturn buf\n}\n\n// Return puts the provided byte slice back on the free list when it has a cap\n// of the expected length.  The buffer is expected to have been obtained via\n// the Borrow function.  Any slices that are not of the appropriate size, such\n// as those whose size is greater than the largest allowed free list item size\n// are simply ignored so they can go to the garbage collector.\nfunc (c scriptFreeList) Return(buf *scriptSlab) {\n\t// Return the buffer to the free list when it's not full.  Otherwise let\n\t// it be garbage collected.\n\tselect {\n\tcase c <- buf:\n\tdefault:\n\t\t// Let it go to the garbage collector.\n\t}\n}\n\n// Create the concurrent safe free list to use for script deserialization.  As\n// previously described, this free list is maintained to significantly reduce\n// the number of allocations.\nvar scriptPool = make(scriptFreeList, freeListMaxItems)\n\n// OutPoint defines a bitcoin data type that is used to track previous\n// transaction outputs.\ntype OutPoint struct {\n\tHash  chainhash.Hash\n\tIndex uint32\n}\n\n// NewOutPoint returns a new bitcoin transaction outpoint point with the\n// provided hash and index.\nfunc NewOutPoint(hash *chainhash.Hash, index uint32) *OutPoint {\n\treturn &OutPoint{\n\t\tHash:  *hash,\n\t\tIndex: index,\n\t}\n}\n\n// NewOutPointFromString returns a new bitcoin transaction outpoint parsed from\n// the provided string, which should be in the format \"hash:index\".\nfunc NewOutPointFromString(outpoint string) (*OutPoint, error) {\n\tparts := strings.Split(outpoint, \":\")\n\tif len(parts) != 2 {\n\t\treturn nil, errors.New(\"outpoint should be of the form txid:index\")\n\t}\n\n\tif len(parts[0]) != chainhash.MaxHashStringSize {\n\t\treturn nil, errors.New(\"outpoint txid should be 64 hex chars\")\n\t}\n\n\thash, err := chainhash.NewHashFromStr(parts[0])\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\toutputIndex, err := strconv.ParseUint(parts[1], 10, 32)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid output index: %v\", err)\n\t}\n\n\treturn &OutPoint{\n\t\tHash:  *hash,\n\t\tIndex: uint32(outputIndex),\n\t}, nil\n}\n\n// String returns the OutPoint in the human-readable form \"hash:index\".\nfunc (o OutPoint) String() string {\n\t// Allocate enough for hash string, colon, and 10 digits.  Although\n\t// at the time of writing, the number of digits can be no greater than\n\t// the length of the decimal representation of maxTxOutPerMessage, the\n\t// maximum message payload may increase in the future and this\n\t// optimization may go unnoticed, so allocate space for 10 decimal\n\t// digits, which will fit any uint32.\n\tbuf := make([]byte, 2*chainhash.HashSize+1, 2*chainhash.HashSize+1+10)\n\tcopy(buf, o.Hash.String())\n\tbuf[2*chainhash.HashSize] = ':'\n\tbuf = strconv.AppendUint(buf, uint64(o.Index), 10)\n\treturn string(buf)\n}\n\n// TxIn defines a bitcoin transaction input.\ntype TxIn struct {\n\tPreviousOutPoint OutPoint\n\tSignatureScript  []byte\n\tWitness          TxWitness\n\tSequence         uint32\n}\n\n// SerializeSize returns the number of bytes it would take to serialize the\n// the transaction input.\nfunc (t *TxIn) SerializeSize() int {\n\t// Outpoint Hash 32 bytes + Outpoint Index 4 bytes + Sequence 4 bytes +\n\t// serialized varint size for the length of SignatureScript +\n\t// SignatureScript bytes.\n\treturn 40 + VarIntSerializeSize(uint64(len(t.SignatureScript))) +\n\t\tlen(t.SignatureScript)\n}\n\n// NewTxIn returns a new bitcoin transaction input with the provided\n// previous outpoint point and signature script with a default sequence of\n// MaxTxInSequenceNum.\nfunc NewTxIn(prevOut *OutPoint, signatureScript []byte, witness [][]byte) *TxIn {\n\treturn &TxIn{\n\t\tPreviousOutPoint: *prevOut,\n\t\tSignatureScript:  signatureScript,\n\t\tWitness:          witness,\n\t\tSequence:         MaxTxInSequenceNum,\n\t}\n}\n\n// TxWitness defines the witness for a TxIn. A witness is to be interpreted as\n// a slice of byte slices, or a stack with one or many elements.\ntype TxWitness [][]byte\n\n// SerializeSize returns the number of bytes it would take to serialize the\n// transaction input's witness.\nfunc (t TxWitness) SerializeSize() int {\n\t// A varint to signal the number of elements the witness has.\n\tn := VarIntSerializeSize(uint64(len(t)))\n\n\t// For each element in the witness, we'll need a varint to signal the\n\t// size of the element, then finally the number of bytes the element\n\t// itself comprises.\n\tfor _, witItem := range t {\n\t\tn += VarIntSerializeSize(uint64(len(witItem)))\n\t\tn += len(witItem)\n\t}\n\n\treturn n\n}\n\n// ToHexStrings formats the witness stack as a slice of hex-encoded strings.\nfunc (t TxWitness) ToHexStrings() []string {\n\t// Ensure nil is returned when there are no entries versus an empty\n\t// slice so it can properly be omitted as necessary.\n\tif len(t) == 0 {\n\t\treturn nil\n\t}\n\n\tresult := make([]string, len(t))\n\tfor idx, wit := range t {\n\t\tresult[idx] = hex.EncodeToString(wit)\n\t}\n\n\treturn result\n}\n\n// TxOut defines a bitcoin transaction output.\ntype TxOut struct {\n\tValue    int64\n\tPkScript []byte\n}\n\n// SerializeSize returns the number of bytes it would take to serialize the\n// the transaction output.\nfunc (t *TxOut) SerializeSize() int {\n\t// Value 8 bytes + serialized varint size for the length of PkScript +\n\t// PkScript bytes.\n\treturn 8 + VarIntSerializeSize(uint64(len(t.PkScript))) + len(t.PkScript)\n}\n\n// NewTxOut returns a new bitcoin transaction output with the provided\n// transaction value and public key script.\nfunc NewTxOut(value int64, pkScript []byte) *TxOut {\n\treturn &TxOut{\n\t\tValue:    value,\n\t\tPkScript: pkScript,\n\t}\n}\n\n// MsgTx implements the Message interface and represents a bitcoin tx message.\n// It is used to deliver transaction information in response to a getdata\n// message (MsgGetData) for a given transaction.\n//\n// Use the AddTxIn and AddTxOut functions to build up the list of transaction\n// inputs and outputs.\ntype MsgTx struct {\n\tVersion  int32\n\tTxIn     []*TxIn\n\tTxOut    []*TxOut\n\tLockTime uint32\n}\n\n// AddTxIn adds a transaction input to the message.\nfunc (msg *MsgTx) AddTxIn(ti *TxIn) {\n\tmsg.TxIn = append(msg.TxIn, ti)\n}\n\n// AddTxOut adds a transaction output to the message.\nfunc (msg *MsgTx) AddTxOut(to *TxOut) {\n\tmsg.TxOut = append(msg.TxOut, to)\n}\n\n// TxHash generates the Hash for the transaction.\nfunc (msg *MsgTx) TxHash() chainhash.Hash {\n\treturn chainhash.DoubleHashRaw(msg.SerializeNoWitness)\n}\n\n// TxID generates the transaction ID of the transaction.\nfunc (msg *MsgTx) TxID() string {\n\treturn msg.TxHash().String()\n}\n\n// WitnessHash generates the hash of the transaction serialized according to\n// the new witness serialization defined in BIP0141 and BIP0144. The final\n// output is used within the Segregated Witness commitment of all the witnesses\n// within a block. If a transaction has no witness data, then the witness hash,\n// is the same as its txid.\nfunc (msg *MsgTx) WitnessHash() chainhash.Hash {\n\tif msg.HasWitness() {\n\t\treturn chainhash.DoubleHashRaw(msg.Serialize)\n\t}\n\n\treturn msg.TxHash()\n}\n\n// Copy creates a deep copy of a transaction so that the original does not get\n// modified when the copy is manipulated.\nfunc (msg *MsgTx) Copy() *MsgTx {\n\t// Create new tx and start by copying primitive values and making space\n\t// for the transaction inputs and outputs.\n\tnewTx := MsgTx{\n\t\tVersion:  msg.Version,\n\t\tTxIn:     make([]*TxIn, 0, len(msg.TxIn)),\n\t\tTxOut:    make([]*TxOut, 0, len(msg.TxOut)),\n\t\tLockTime: msg.LockTime,\n\t}\n\n\t// Deep copy the old TxIn data.\n\tfor _, oldTxIn := range msg.TxIn {\n\t\t// Deep copy the old previous outpoint.\n\t\toldOutPoint := oldTxIn.PreviousOutPoint\n\t\tnewOutPoint := OutPoint{}\n\t\tnewOutPoint.Hash.SetBytes(oldOutPoint.Hash[:])\n\t\tnewOutPoint.Index = oldOutPoint.Index\n\n\t\t// Deep copy the old signature script.\n\t\tvar newScript []byte\n\t\toldScript := oldTxIn.SignatureScript\n\t\toldScriptLen := len(oldScript)\n\t\tif oldScriptLen > 0 {\n\t\t\tnewScript = make([]byte, oldScriptLen)\n\t\t\tcopy(newScript, oldScript[:oldScriptLen])\n\t\t}\n\n\t\t// Create new txIn with the deep copied data.\n\t\tnewTxIn := TxIn{\n\t\t\tPreviousOutPoint: newOutPoint,\n\t\t\tSignatureScript:  newScript,\n\t\t\tSequence:         oldTxIn.Sequence,\n\t\t}\n\n\t\t// If the transaction is witnessy, then also copy the\n\t\t// witnesses.\n\t\tif len(oldTxIn.Witness) != 0 {\n\t\t\t// Deep copy the old witness data.\n\t\t\tnewTxIn.Witness = make([][]byte, len(oldTxIn.Witness))\n\t\t\tfor i, oldItem := range oldTxIn.Witness {\n\t\t\t\tnewItem := make([]byte, len(oldItem))\n\t\t\t\tcopy(newItem, oldItem)\n\t\t\t\tnewTxIn.Witness[i] = newItem\n\t\t\t}\n\t\t}\n\n\t\t// Finally, append this fully copied txin.\n\t\tnewTx.TxIn = append(newTx.TxIn, &newTxIn)\n\t}\n\n\t// Deep copy the old TxOut data.\n\tfor _, oldTxOut := range msg.TxOut {\n\t\t// Deep copy the old PkScript\n\t\tvar newScript []byte\n\t\toldScript := oldTxOut.PkScript\n\t\toldScriptLen := len(oldScript)\n\t\tif oldScriptLen > 0 {\n\t\t\tnewScript = make([]byte, oldScriptLen)\n\t\t\tcopy(newScript, oldScript[:oldScriptLen])\n\t\t}\n\n\t\t// Create new txOut with the deep copied data and append it to\n\t\t// new Tx.\n\t\tnewTxOut := TxOut{\n\t\t\tValue:    oldTxOut.Value,\n\t\t\tPkScript: newScript,\n\t\t}\n\t\tnewTx.TxOut = append(newTx.TxOut, &newTxOut)\n\t}\n\n\treturn &newTx\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\n// See Deserialize for decoding transactions stored to disk, such as in a\n// database, as opposed to decoding transactions from the wire.\nfunc (msg *MsgTx) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\tsbuf := scriptPool.Borrow()\n\tdefer scriptPool.Return(sbuf)\n\n\terr := msg.btcDecode(r, pver, enc, buf, sbuf[:])\n\treturn err\n}\n\nfunc (msg *MsgTx) btcDecode(r io.Reader, pver uint32, enc MessageEncoding,\n\tbuf, sbuf []byte) error {\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tmsg.Version = int32(littleEndian.Uint32(buf[:4]))\n\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// A count of zero (meaning no TxIn's to the uninitiated) means that the\n\t// value is a TxFlagMarker, and hence indicates the presence of a flag.\n\tvar flag [1]TxFlag\n\tif count == TxFlagMarker && enc == WitnessEncoding {\n\t\t// The count varint was in fact the flag marker byte. Next, we need to\n\t\t// read the flag value, which is a single byte.\n\t\tif _, err = io.ReadFull(r, flag[:]); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// At the moment, the flag MUST be WitnessFlag (0x01). In the future\n\t\t// other flag types may be supported.\n\t\tif flag[0] != WitnessFlag {\n\t\t\tstr := fmt.Sprintf(\"witness tx but flag byte is %x\", flag)\n\t\t\treturn messageError(\"MsgTx.BtcDecode\", str)\n\t\t}\n\n\t\t// With the Segregated Witness specific fields decoded, we can\n\t\t// now read in the actual txin count.\n\t\tcount, err = ReadVarIntBuf(r, pver, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Prevent more input transactions than could possibly fit into a\n\t// message.  It would be possible to cause memory exhaustion and panics\n\t// without a sane upper bound on this count.\n\tif count > uint64(maxTxInPerMessage) {\n\t\tstr := fmt.Sprintf(\"too many input transactions to fit into \"+\n\t\t\t\"max message size [count %d, max %d]\", count,\n\t\t\tmaxTxInPerMessage)\n\t\treturn messageError(\"MsgTx.BtcDecode\", str)\n\t}\n\n\t// Deserialize the inputs.\n\tvar totalScriptSize uint64\n\ttxIns := make([]TxIn, count)\n\tmsg.TxIn = make([]*TxIn, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\t// The pointer is set now in case a script buffer is borrowed\n\t\t// and needs to be returned to the pool on error.\n\t\tti := &txIns[i]\n\t\tmsg.TxIn[i] = ti\n\t\terr = readTxInBuf(r, pver, msg.Version, ti, buf, sbuf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttotalScriptSize += uint64(len(ti.SignatureScript))\n\t\tsbuf = sbuf[len(ti.SignatureScript):]\n\t}\n\n\tcount, err = ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Prevent more output transactions than could possibly fit into a\n\t// message.  It would be possible to cause memory exhaustion and panics\n\t// without a sane upper bound on this count.\n\tif count > uint64(maxTxOutPerMessage) {\n\t\tstr := fmt.Sprintf(\"too many output transactions to fit into \"+\n\t\t\t\"max message size [count %d, max %d]\", count,\n\t\t\tmaxTxOutPerMessage)\n\t\treturn messageError(\"MsgTx.BtcDecode\", str)\n\t}\n\n\t// Deserialize the outputs.\n\ttxOuts := make([]TxOut, count)\n\tmsg.TxOut = make([]*TxOut, count)\n\tfor i := uint64(0); i < count; i++ {\n\t\t// The pointer is set now in case a script buffer is borrowed\n\t\t// and needs to be returned to the pool on error.\n\t\tto := &txOuts[i]\n\t\tmsg.TxOut[i] = to\n\t\terr = readTxOutBuf(r, pver, msg.Version, to, buf, sbuf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttotalScriptSize += uint64(len(to.PkScript))\n\t\tsbuf = sbuf[len(to.PkScript):]\n\t}\n\n\t// If the transaction's flag byte isn't 0x00 at this point, then one or\n\t// more of its inputs has accompanying witness data.\n\tif flag[0] != 0 && enc == WitnessEncoding {\n\t\tfor _, txin := range msg.TxIn {\n\t\t\t// For each input, the witness is encoded as a stack\n\t\t\t// with one or more items. Therefore, we first read a\n\t\t\t// varint which encodes the number of stack items.\n\t\t\twitCount, err := ReadVarIntBuf(r, pver, buf)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Prevent a possible memory exhaustion attack by\n\t\t\t// limiting the witCount value to a sane upper bound.\n\t\t\tif witCount > maxWitnessItemsPerInput {\n\t\t\t\tstr := fmt.Sprintf(\"too many witness items to fit \"+\n\t\t\t\t\t\"into max message size [count %d, max %d]\",\n\t\t\t\t\twitCount, maxWitnessItemsPerInput)\n\t\t\t\treturn messageError(\"MsgTx.BtcDecode\", str)\n\t\t\t}\n\n\t\t\t// Then for witCount number of stack items, each item\n\t\t\t// has a varint length prefix, followed by the witness\n\t\t\t// item itself.\n\t\t\ttxin.Witness = make([][]byte, witCount)\n\t\t\tfor j := uint64(0); j < witCount; j++ {\n\t\t\t\ttxin.Witness[j], err = readScriptBuf(\n\t\t\t\t\tr, pver, buf, sbuf, \"script witness item\",\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ttotalScriptSize += uint64(len(txin.Witness[j]))\n\t\t\t\tsbuf = sbuf[len(txin.Witness[j]):]\n\t\t\t}\n\t\t}\n\n\t\t// Check that if the witness flag is set that we actually have\n\t\t// witnesses. This check is also done by bitcoind.\n\t\tif !msg.HasWitness() {\n\t\t\treturn errSuperfluousWitnessRecord\n\t\t}\n\t}\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\tmsg.LockTime = littleEndian.Uint32(buf[:4])\n\n\t// Create a single allocation to house all of the scripts and set each\n\t// input signature script and output public key script to the\n\t// appropriate subslice of the overall contiguous buffer.  Then, return\n\t// each individual script buffer back to the pool so they can be reused\n\t// for future deserializations.  This is done because it significantly\n\t// reduces the number of allocations the garbage collector needs to\n\t// track, which in turn improves performance and drastically reduces the\n\t// amount of runtime overhead that would otherwise be needed to keep\n\t// track of millions of small allocations.\n\t//\n\t// NOTE: It is no longer valid to call the returnScriptBuffers closure\n\t// after these blocks of code run because it is already done and the\n\t// scripts in the transaction inputs and outputs no longer point to the\n\t// buffers.\n\tvar offset uint64\n\tscripts := make([]byte, totalScriptSize)\n\tfor i := 0; i < len(msg.TxIn); i++ {\n\t\t// Copy the signature script into the contiguous buffer at the\n\t\t// appropriate offset.\n\t\tsignatureScript := msg.TxIn[i].SignatureScript\n\t\tcopy(scripts[offset:], signatureScript)\n\n\t\t// Reset the signature script of the transaction input to the\n\t\t// slice of the contiguous buffer where the script lives.\n\t\tscriptSize := uint64(len(signatureScript))\n\t\tend := offset + scriptSize\n\t\tmsg.TxIn[i].SignatureScript = scripts[offset:end:end]\n\t\toffset += scriptSize\n\n\t\tfor j := 0; j < len(msg.TxIn[i].Witness); j++ {\n\t\t\t// Copy each item within the witness stack for this\n\t\t\t// input into the contiguous buffer at the appropriate\n\t\t\t// offset.\n\t\t\twitnessElem := msg.TxIn[i].Witness[j]\n\t\t\tcopy(scripts[offset:], witnessElem)\n\n\t\t\t// Reset the witness item within the stack to the slice\n\t\t\t// of the contiguous buffer where the witness lives.\n\t\t\twitnessElemSize := uint64(len(witnessElem))\n\t\t\tend := offset + witnessElemSize\n\t\t\tmsg.TxIn[i].Witness[j] = scripts[offset:end:end]\n\t\t\toffset += witnessElemSize\n\t\t}\n\t}\n\tfor i := 0; i < len(msg.TxOut); i++ {\n\t\t// Copy the public key script into the contiguous buffer at the\n\t\t// appropriate offset.\n\t\tpkScript := msg.TxOut[i].PkScript\n\t\tcopy(scripts[offset:], pkScript)\n\n\t\t// Reset the public key script of the transaction output to the\n\t\t// slice of the contiguous buffer where the script lives.\n\t\tscriptSize := uint64(len(pkScript))\n\t\tend := offset + scriptSize\n\t\tmsg.TxOut[i].PkScript = scripts[offset:end:end]\n\t\toffset += scriptSize\n\t}\n\n\treturn nil\n}\n\n// Deserialize decodes a transaction from r into the receiver using a format\n// that is suitable for long-term storage such as a database while respecting\n// the Version field in the transaction.  This function differs from BtcDecode\n// in that BtcDecode decodes from the bitcoin wire protocol as it was sent\n// across the network.  The wire encoding can technically differ depending on\n// the protocol version and doesn't even really need to match the format of a\n// stored transaction at all.  As of the time this comment was written, the\n// encoded transaction is the same in both instances, but there is a distinct\n// difference and separating the two allows the API to be flexible enough to\n// deal with changes.\nfunc (msg *MsgTx) Deserialize(r io.Reader) error {\n\t// At the current time, there is no difference between the wire encoding\n\t// at protocol version 0 and the stable long-term storage format.  As\n\t// a result, make use of BtcDecode.\n\treturn msg.BtcDecode(r, 0, WitnessEncoding)\n}\n\n// DeserializeNoWitness decodes a transaction from r into the receiver, where\n// the transaction encoding format within r MUST NOT utilize the new\n// serialization format created to encode transaction bearing witness data\n// within inputs.\nfunc (msg *MsgTx) DeserializeNoWitness(r io.Reader) error {\n\treturn msg.BtcDecode(r, 0, BaseEncoding)\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\n// See Serialize for encoding transactions to be stored to disk, such as in a\n// database, as opposed to encoding transactions for the wire.\nfunc (msg *MsgTx) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := msg.btcEncode(w, pver, enc, buf)\n\treturn err\n}\n\nfunc (msg *MsgTx) btcEncode(w io.Writer, pver uint32, enc MessageEncoding,\n\tbuf []byte) error {\n\n\tlittleEndian.PutUint32(buf[:4], uint32(msg.Version))\n\tif _, err := w.Write(buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\t// If the encoding version is set to WitnessEncoding, and the Flags\n\t// field for the MsgTx aren't 0x00, then this indicates the transaction\n\t// is to be encoded using the new witness inclusionary structure\n\t// defined in BIP0144.\n\tdoWitness := enc == WitnessEncoding && msg.HasWitness()\n\tif doWitness {\n\t\t// After the transaction's Version field, we include two additional\n\t\t// bytes specific to the witness encoding. This byte sequence is known\n\t\t// as a flag. The first byte is a marker byte (TxFlagMarker) and the\n\t\t// second one is the flag value to indicate presence of witness data.\n\t\tif _, err := w.Write([]byte{TxFlagMarker, WitnessFlag}); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tcount := uint64(len(msg.TxIn))\n\terr := WriteVarIntBuf(w, pver, count, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, ti := range msg.TxIn {\n\t\terr = writeTxInBuf(w, pver, msg.Version, ti, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tcount = uint64(len(msg.TxOut))\n\terr = WriteVarIntBuf(w, pver, count, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, to := range msg.TxOut {\n\t\terr = WriteTxOutBuf(w, pver, msg.Version, to, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// If this transaction is a witness transaction, and the witness\n\t// encoded is desired, then encode the witness for each of the inputs\n\t// within the transaction.\n\tif doWitness {\n\t\tfor _, ti := range msg.TxIn {\n\t\t\terr = writeTxWitnessBuf(w, pver, msg.Version, ti.Witness, buf)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\tlittleEndian.PutUint32(buf[:4], msg.LockTime)\n\t_, err = w.Write(buf[:4])\n\treturn err\n}\n\n// HasWitness returns false if none of the inputs within the transaction\n// contain witness data, true false otherwise.\nfunc (msg *MsgTx) HasWitness() bool {\n\tfor _, txIn := range msg.TxIn {\n\t\tif len(txIn.Witness) != 0 {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// Serialize encodes the transaction to w using a format that suitable for\n// long-term storage such as a database while respecting the Version field in\n// the transaction.  This function differs from BtcEncode in that BtcEncode\n// encodes the transaction to the bitcoin wire protocol in order to be sent\n// across the network.  The wire encoding can technically differ depending on\n// the protocol version and doesn't even really need to match the format of a\n// stored transaction at all.  As of the time this comment was written, the\n// encoded transaction is the same in both instances, but there is a distinct\n// difference and separating the two allows the API to be flexible enough to\n// deal with changes.\nfunc (msg *MsgTx) Serialize(w io.Writer) error {\n\t// At the current time, there is no difference between the wire encoding\n\t// at protocol version 0 and the stable long-term storage format.  As\n\t// a result, make use of BtcEncode.\n\t//\n\t// Passing a encoding type of WitnessEncoding to BtcEncode for MsgTx\n\t// indicates that the transaction's witnesses (if any) should be\n\t// serialized according to the new serialization structure defined in\n\t// BIP0144.\n\treturn msg.BtcEncode(w, 0, WitnessEncoding)\n}\n\n// SerializeNoWitness encodes the transaction to w in an identical manner to\n// Serialize, however even if the source transaction has inputs with witness\n// data, the old serialization format will still be used.\nfunc (msg *MsgTx) SerializeNoWitness(w io.Writer) error {\n\treturn msg.BtcEncode(w, 0, BaseEncoding)\n}\n\n// baseSize returns the serialized size of the transaction without accounting\n// for any witness data.\nfunc (msg *MsgTx) baseSize() int {\n\t// Version 4 bytes + LockTime 4 bytes + Serialized varint size for the\n\t// number of transaction inputs and outputs.\n\tn := 8 + VarIntSerializeSize(uint64(len(msg.TxIn))) +\n\t\tVarIntSerializeSize(uint64(len(msg.TxOut)))\n\n\tfor _, txIn := range msg.TxIn {\n\t\tn += txIn.SerializeSize()\n\t}\n\n\tfor _, txOut := range msg.TxOut {\n\t\tn += txOut.SerializeSize()\n\t}\n\n\treturn n\n}\n\n// SerializeSize returns the number of bytes it would take to serialize the\n// the transaction.\nfunc (msg *MsgTx) SerializeSize() int {\n\tn := msg.baseSize()\n\n\tif msg.HasWitness() {\n\t\t// The marker, and flag fields take up two additional bytes.\n\t\tn += 2\n\n\t\t// Additionally, factor in the serialized size of each of the\n\t\t// witnesses for each txin.\n\t\tfor _, txin := range msg.TxIn {\n\t\t\tn += txin.Witness.SerializeSize()\n\t\t}\n\t}\n\n\treturn n\n}\n\n// SerializeSizeStripped returns the number of bytes it would take to serialize\n// the transaction, excluding any included witness data.\nfunc (msg *MsgTx) SerializeSizeStripped() int {\n\treturn msg.baseSize()\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgTx) Command() string {\n\treturn CmdTx\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgTx) MaxPayloadLength(pver uint32) uint32 {\n\treturn MaxBlockPayload\n}\n\n// PkScriptLocs returns a slice containing the start of each public key script\n// within the raw serialized transaction.  The caller can easily obtain the\n// length of each script by using len on the script available via the\n// appropriate transaction output entry.\nfunc (msg *MsgTx) PkScriptLocs() []int {\n\tnumTxOut := len(msg.TxOut)\n\tif numTxOut == 0 {\n\t\treturn nil\n\t}\n\n\t// The starting offset in the serialized transaction of the first\n\t// transaction output is:\n\t//\n\t// Version 4 bytes + serialized varint size for the number of\n\t// transaction inputs and outputs + serialized size of each transaction\n\t// input.\n\tn := 4 + VarIntSerializeSize(uint64(len(msg.TxIn))) +\n\t\tVarIntSerializeSize(uint64(numTxOut))\n\n\t// If this transaction has a witness input, the an additional two bytes\n\t// for the marker, and flag byte need to be taken into account.\n\tif len(msg.TxIn) > 0 && msg.TxIn[0].Witness != nil {\n\t\tn += 2\n\t}\n\n\tfor _, txIn := range msg.TxIn {\n\t\tn += txIn.SerializeSize()\n\t}\n\n\t// Calculate and set the appropriate offset for each public key script.\n\tpkScriptLocs := make([]int, numTxOut)\n\tfor i, txOut := range msg.TxOut {\n\t\t// The offset of the script in the transaction output is:\n\t\t//\n\t\t// Value 8 bytes + serialized varint size for the length of\n\t\t// PkScript.\n\t\tn += 8 + VarIntSerializeSize(uint64(len(txOut.PkScript)))\n\t\tpkScriptLocs[i] = n\n\t\tn += len(txOut.PkScript)\n\t}\n\n\treturn pkScriptLocs\n}\n\n// NewMsgTx returns a new bitcoin tx message that conforms to the Message\n// interface.  The return instance has a default version of TxVersion and there\n// are no transaction inputs or outputs.  Also, the lock time is set to zero\n// to indicate the transaction is valid immediately as opposed to some time in\n// future.\nfunc NewMsgTx(version int32) *MsgTx {\n\treturn &MsgTx{\n\t\tVersion: version,\n\t\tTxIn:    make([]*TxIn, 0, defaultTxInOutAlloc),\n\t\tTxOut:   make([]*TxOut, 0, defaultTxInOutAlloc),\n\t}\n}\n\n// readOutPointBuf reads the next sequence of bytes from r as an OutPoint.\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc readOutPointBuf(r io.Reader, pver uint32, version int32, op *OutPoint,\n\tbuf []byte) error {\n\n\t_, err := io.ReadFull(r, op.Hash[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\top.Index = littleEndian.Uint32(buf[:4])\n\n\treturn nil\n}\n\n// WriteOutPoint encodes op to the bitcoin protocol encoding for an OutPoint to\n// w.\nfunc WriteOutPoint(w io.Writer, pver uint32, version int32, op *OutPoint) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := writeOutPointBuf(w, pver, version, op, buf)\n\treturn err\n}\n\n// writeOutPointBuf encodes op to the bitcoin protocol encoding for an OutPoint\n// to w.\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc writeOutPointBuf(w io.Writer, pver uint32, version int32, op *OutPoint,\n\tbuf []byte) error {\n\n\t_, err := w.Write(op.Hash[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tlittleEndian.PutUint32(buf[:4], op.Index)\n\t_, err = w.Write(buf[:4])\n\treturn err\n}\n\n// readScript reads a variable length byte array that represents a transaction\n// script.  It is encoded as a varInt containing the length of the array\n// followed by the bytes themselves.  An error is returned if the length is\n// greater than the passed maxAllowed parameter which helps protect against\n// memory exhaustion attacks and forced panics through malformed messages.  The\n// fieldName parameter is only used for the error message so it provides more\n// context in the error.\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc readScriptBuf(r io.Reader, pver uint32, buf, s []byte,\n\tfieldName string) ([]byte, error) {\n\n\tcount, err := ReadVarIntBuf(r, pver, buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Prevent byte array larger than the max message size.  It would\n\t// be possible to cause memory exhaustion and panics without a sane\n\t// upper bound on this count.\n\tif count > maxWitnessItemSize {\n\t\tstr := fmt.Sprintf(\"%s is larger than the max allowed size \"+\n\t\t\t\"[count %d, max %d]\", fieldName, count,\n\t\t\tmaxWitnessItemSize)\n\t\treturn nil, messageError(\"readScript\", str)\n\t}\n\n\t// Ensure the claimed script length fits in the remaining\n\t// decode slab.\n\tif count > uint64(len(s)) {\n\t\tstr := fmt.Sprintf(\"%s exceeds remaining buffer \"+\n\t\t\t\"capacity [count %d, remaining %d]\",\n\t\t\tfieldName, count, len(s))\n\t\treturn nil, messageError(\"readScript\", str)\n\t}\n\n\t_, err = io.ReadFull(r, s[:count])\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn s[:count], nil\n}\n\n// readTxInBuf reads the next sequence of bytes from r as a transaction input\n// (TxIn).\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc readTxInBuf(r io.Reader, pver uint32, version int32, ti *TxIn,\n\tbuf, s []byte) error {\n\n\terr := readOutPointBuf(r, pver, version, &ti.PreviousOutPoint, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tti.SignatureScript, err = readScriptBuf(\n\t\tr, pver, buf, s, \"transaction input signature script\",\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\treturn err\n\t}\n\n\tti.Sequence = littleEndian.Uint32(buf[:4])\n\n\treturn nil\n}\n\n// writeTxInBuf encodes ti to the bitcoin protocol encoding for a transaction\n// input (TxIn) to w. If b is non-nil, the provided buffer will be used for\n// serializing small values. Otherwise a buffer will be drawn from the\n// binarySerializer's pool and return when the method finishes.\nfunc writeTxInBuf(w io.Writer, pver uint32, version int32, ti *TxIn,\n\tbuf []byte) error {\n\n\terr := writeOutPointBuf(w, pver, version, &ti.PreviousOutPoint, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = WriteVarBytesBuf(w, pver, ti.SignatureScript, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tlittleEndian.PutUint32(buf[:4], ti.Sequence)\n\t_, err = w.Write(buf[:4])\n\n\treturn err\n}\n\n// ReadTxOut reads the next sequence of bytes from r as a transaction output\n// (TxOut).\nfunc ReadTxOut(r io.Reader, pver uint32, version int32, to *TxOut) error {\n\tvar s scriptSlab\n\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := readTxOutBuf(r, pver, version, to, buf, s[:])\n\treturn err\n}\n\n// readTxOutBuf reads the next sequence of bytes from r as a transaction output\n// (TxOut). If b is non-nil, the provided buffer will be used for serializing\n// small values. Otherwise a buffer will be drawn from the binarySerializer's\n// pool and return when the method finishes.\nfunc readTxOutBuf(r io.Reader, pver uint32, version int32, to *TxOut,\n\tbuf, s []byte) error {\n\n\t_, err := io.ReadFull(r, buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\tto.Value = int64(littleEndian.Uint64(buf))\n\n\tto.PkScript, err = readScriptBuf(\n\t\tr, pver, buf, s, \"transaction output public key script\",\n\t)\n\treturn err\n}\n\n// WriteTxOut encodes to into the bitcoin protocol encoding for a transaction\n// output (TxOut) to w.\n//\n// NOTE: This function is exported in order to allow txscript to compute the\n// new sighashes for witness transactions (BIP0143).\nfunc WriteTxOut(w io.Writer, pver uint32, version int32, to *TxOut) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := WriteTxOutBuf(w, pver, version, to, buf)\n\treturn err\n}\n\n// WriteTxOutBuf encodes to into the bitcoin protocol encoding for a transaction\n// output (TxOut) to w. If b is non-nil, the provided buffer will be used for\n// serializing small values. Otherwise a buffer will be drawn from the\n// binarySerializer's pool and return when the method finishes.\n//\n// NOTE: This function is exported in order to allow txscript to compute the\n// new sighashes for witness transactions (BIP0143).\nfunc WriteTxOutBuf(w io.Writer, pver uint32, version int32, to *TxOut,\n\tbuf []byte) error {\n\n\tlittleEndian.PutUint64(buf, uint64(to.Value))\n\t_, err := w.Write(buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn WriteVarBytesBuf(w, pver, to.PkScript, buf)\n}\n\n// writeTxWitnessBuf encodes the bitcoin protocol encoding for a transaction\n// input's witness into to w. If b is non-nil, the provided buffer will be used\n// for serializing small values. Otherwise a buffer will be drawn from the\n// binarySerializer's pool and return when the method finishes.\nfunc writeTxWitnessBuf(w io.Writer, pver uint32, version int32, wit [][]byte,\n\tbuf []byte) error {\n\n\terr := WriteVarIntBuf(w, pver, uint64(len(wit)), buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\tfor _, item := range wit {\n\t\terr = WriteVarBytesBuf(w, pver, item, buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "wire/msgtx_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/davecgh/go-spew/spew\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestTx tests the MsgTx API.\nfunc TestTx(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Block 100000 hash.\n\thashStr := \"3ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506\"\n\thash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t}\n\n\t// Ensure the command is expected value.\n\twantCmd := \"tx\"\n\tmsg := NewMsgTx(1)\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgAddr: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\twantPayload := uint32(1000 * 4000)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Ensure we get the same transaction output point data back out.\n\t// NOTE: This is a block hash and made up index, but we're only\n\t// testing package functionality.\n\tprevOutIndex := uint32(1)\n\tprevOut := NewOutPoint(hash, prevOutIndex)\n\tif !prevOut.Hash.IsEqual(hash) {\n\t\tt.Errorf(\"NewOutPoint: wrong hash - got %v, want %v\",\n\t\t\tspew.Sprint(&prevOut.Hash), spew.Sprint(hash))\n\t}\n\tif prevOut.Index != prevOutIndex {\n\t\tt.Errorf(\"NewOutPoint: wrong index - got %v, want %v\",\n\t\t\tprevOut.Index, prevOutIndex)\n\t}\n\tprevOutStr := fmt.Sprintf(\"%s:%d\", hash.String(), prevOutIndex)\n\tif s := prevOut.String(); s != prevOutStr {\n\t\tt.Errorf(\"OutPoint.String: unexpected result - got %v, \"+\n\t\t\t\"want %v\", s, prevOutStr)\n\t}\n\n\t// Ensure we get the same transaction input back out.\n\tsigScript := []byte{0x04, 0x31, 0xdc, 0x00, 0x1b, 0x01, 0x62}\n\twitnessData := [][]byte{\n\t\t{0x04, 0x31},\n\t\t{0x01, 0x43},\n\t}\n\ttxIn := NewTxIn(prevOut, sigScript, witnessData)\n\tif !reflect.DeepEqual(&txIn.PreviousOutPoint, prevOut) {\n\t\tt.Errorf(\"NewTxIn: wrong prev outpoint - got %v, want %v\",\n\t\t\tspew.Sprint(&txIn.PreviousOutPoint),\n\t\t\tspew.Sprint(prevOut))\n\t}\n\tif !bytes.Equal(txIn.SignatureScript, sigScript) {\n\t\tt.Errorf(\"NewTxIn: wrong signature script - got %v, want %v\",\n\t\t\tspew.Sdump(txIn.SignatureScript),\n\t\t\tspew.Sdump(sigScript))\n\t}\n\tif !reflect.DeepEqual(txIn.Witness, TxWitness(witnessData)) {\n\t\tt.Errorf(\"NewTxIn: wrong witness data - got %v, want %v\",\n\t\t\tspew.Sdump(txIn.Witness),\n\t\t\tspew.Sdump(witnessData))\n\t}\n\n\t// Ensure we get the same transaction output back out.\n\ttxValue := int64(5000000000)\n\tpkScript := []byte{\n\t\t0x41, // OP_DATA_65\n\t\t0x04, 0xd6, 0x4b, 0xdf, 0xd0, 0x9e, 0xb1, 0xc5,\n\t\t0xfe, 0x29, 0x5a, 0xbd, 0xeb, 0x1d, 0xca, 0x42,\n\t\t0x81, 0xbe, 0x98, 0x8e, 0x2d, 0xa0, 0xb6, 0xc1,\n\t\t0xc6, 0xa5, 0x9d, 0xc2, 0x26, 0xc2, 0x86, 0x24,\n\t\t0xe1, 0x81, 0x75, 0xe8, 0x51, 0xc9, 0x6b, 0x97,\n\t\t0x3d, 0x81, 0xb0, 0x1c, 0xc3, 0x1f, 0x04, 0x78,\n\t\t0x34, 0xbc, 0x06, 0xd6, 0xd6, 0xed, 0xf6, 0x20,\n\t\t0xd1, 0x84, 0x24, 0x1a, 0x6a, 0xed, 0x8b, 0x63,\n\t\t0xa6, // 65-byte signature\n\t\t0xac, // OP_CHECKSIG\n\t}\n\ttxOut := NewTxOut(txValue, pkScript)\n\tif txOut.Value != txValue {\n\t\tt.Errorf(\"NewTxOut: wrong pk script - got %v, want %v\",\n\t\t\ttxOut.Value, txValue)\n\n\t}\n\tif !bytes.Equal(txOut.PkScript, pkScript) {\n\t\tt.Errorf(\"NewTxOut: wrong pk script - got %v, want %v\",\n\t\t\tspew.Sdump(txOut.PkScript),\n\t\t\tspew.Sdump(pkScript))\n\t}\n\n\t// Ensure transaction inputs are added properly.\n\tmsg.AddTxIn(txIn)\n\tif !reflect.DeepEqual(msg.TxIn[0], txIn) {\n\t\tt.Errorf(\"AddTxIn: wrong transaction input added - got %v, want %v\",\n\t\t\tspew.Sprint(msg.TxIn[0]), spew.Sprint(txIn))\n\t}\n\n\t// Ensure transaction outputs are added properly.\n\tmsg.AddTxOut(txOut)\n\tif !reflect.DeepEqual(msg.TxOut[0], txOut) {\n\t\tt.Errorf(\"AddTxIn: wrong transaction output added - got %v, want %v\",\n\t\t\tspew.Sprint(msg.TxOut[0]), spew.Sprint(txOut))\n\t}\n\n\t// Ensure the copy produced an identical transaction message.\n\tnewMsg := msg.Copy()\n\tif !reflect.DeepEqual(newMsg, msg) {\n\t\tt.Errorf(\"Copy: mismatched tx messages - got %v, want %v\",\n\t\t\tspew.Sdump(newMsg), spew.Sdump(msg))\n\t}\n}\n\n// TestTxHash tests the ability to generate the hash of a transaction accurately.\nfunc TestTxHash(t *testing.T) {\n\t// Hash of first transaction from block 113875.\n\thashStr := \"f051e59b5e2503ac626d03aaeac8ab7be2d72ba4b7e97119c5852d70d52dcb86\"\n\twantHash, err := chainhash.NewHashFromStr(hashStr)\n\tif err != nil {\n\t\tt.Errorf(\"NewHashFromStr: %v\", err)\n\t\treturn\n\t}\n\n\t// First transaction from block 113875.\n\tmsgTx := NewMsgTx(1)\n\ttxIn := TxIn{\n\t\tPreviousOutPoint: OutPoint{\n\t\t\tHash:  chainhash.Hash{},\n\t\t\tIndex: 0xffffffff,\n\t\t},\n\t\tSignatureScript: []byte{0x04, 0x31, 0xdc, 0x00, 0x1b, 0x01, 0x62},\n\t\tSequence:        0xffffffff,\n\t}\n\ttxOut := TxOut{\n\t\tValue: 5000000000,\n\t\tPkScript: []byte{\n\t\t\t0x41, // OP_DATA_65\n\t\t\t0x04, 0xd6, 0x4b, 0xdf, 0xd0, 0x9e, 0xb1, 0xc5,\n\t\t\t0xfe, 0x29, 0x5a, 0xbd, 0xeb, 0x1d, 0xca, 0x42,\n\t\t\t0x81, 0xbe, 0x98, 0x8e, 0x2d, 0xa0, 0xb6, 0xc1,\n\t\t\t0xc6, 0xa5, 0x9d, 0xc2, 0x26, 0xc2, 0x86, 0x24,\n\t\t\t0xe1, 0x81, 0x75, 0xe8, 0x51, 0xc9, 0x6b, 0x97,\n\t\t\t0x3d, 0x81, 0xb0, 0x1c, 0xc3, 0x1f, 0x04, 0x78,\n\t\t\t0x34, 0xbc, 0x06, 0xd6, 0xd6, 0xed, 0xf6, 0x20,\n\t\t\t0xd1, 0x84, 0x24, 0x1a, 0x6a, 0xed, 0x8b, 0x63,\n\t\t\t0xa6, // 65-byte signature\n\t\t\t0xac, // OP_CHECKSIG\n\t\t},\n\t}\n\tmsgTx.AddTxIn(&txIn)\n\tmsgTx.AddTxOut(&txOut)\n\tmsgTx.LockTime = 0\n\n\t// Ensure the hash produced is expected.\n\ttxHash := msgTx.TxHash()\n\tif !txHash.IsEqual(wantHash) {\n\t\tt.Errorf(\"TxHash: wrong hash - got %v, want %v\",\n\t\t\tspew.Sprint(txHash), spew.Sprint(wantHash))\n\t}\n}\n\n// TestTxSha tests the ability to generate the wtxid, and txid of a transaction\n// with witness inputs accurately.\nfunc TestWTxSha(t *testing.T) {\n\thashStrTxid := \"0f167d1385a84d1518cfee208b653fc9163b605ccf1b75347e2850b3e2eb19f3\"\n\twantHashTxid, err := chainhash.NewHashFromStr(hashStrTxid)\n\tif err != nil {\n\t\tt.Errorf(\"NewShaHashFromStr: %v\", err)\n\t\treturn\n\t}\n\thashStrWTxid := \"0858eab78e77b6b033da30f46699996396cf48fcf625a783c85a51403e175e74\"\n\twantHashWTxid, err := chainhash.NewHashFromStr(hashStrWTxid)\n\tif err != nil {\n\t\tt.Errorf(\"NewShaHashFromStr: %v\", err)\n\t\treturn\n\t}\n\n\t// From block 23157 in a past version of segnet.\n\tmsgTx := NewMsgTx(1)\n\ttxIn := TxIn{\n\t\tPreviousOutPoint: OutPoint{\n\t\t\tHash: chainhash.Hash{\n\t\t\t\t0xa5, 0x33, 0x52, 0xd5, 0x13, 0x57, 0x66, 0xf0,\n\t\t\t\t0x30, 0x76, 0x59, 0x74, 0x18, 0x26, 0x3d, 0xa2,\n\t\t\t\t0xd9, 0xc9, 0x58, 0x31, 0x59, 0x68, 0xfe, 0xa8,\n\t\t\t\t0x23, 0x52, 0x94, 0x67, 0x48, 0x1f, 0xf9, 0xcd,\n\t\t\t},\n\t\t\tIndex: 19,\n\t\t},\n\t\tWitness: [][]byte{\n\t\t\t{ // 70-byte signature\n\t\t\t\t0x30, 0x43, 0x02, 0x1f, 0x4d, 0x23, 0x81, 0xdc,\n\t\t\t\t0x97, 0xf1, 0x82, 0xab, 0xd8, 0x18, 0x5f, 0x51,\n\t\t\t\t0x75, 0x30, 0x18, 0x52, 0x32, 0x12, 0xf5, 0xdd,\n\t\t\t\t0xc0, 0x7c, 0xc4, 0xe6, 0x3a, 0x8d, 0xc0, 0x36,\n\t\t\t\t0x58, 0xda, 0x19, 0x02, 0x20, 0x60, 0x8b, 0x5c,\n\t\t\t\t0x4d, 0x92, 0xb8, 0x6b, 0x6d, 0xe7, 0xd7, 0x8e,\n\t\t\t\t0xf2, 0x3a, 0x2f, 0xa7, 0x35, 0xbc, 0xb5, 0x9b,\n\t\t\t\t0x91, 0x4a, 0x48, 0xb0, 0xe1, 0x87, 0xc5, 0xe7,\n\t\t\t\t0x56, 0x9a, 0x18, 0x19, 0x70, 0x01,\n\t\t\t},\n\t\t\t{ // 33-byte serialize pub key\n\t\t\t\t0x03, 0x07, 0xea, 0xd0, 0x84, 0x80, 0x7e, 0xb7,\n\t\t\t\t0x63, 0x46, 0xdf, 0x69, 0x77, 0x00, 0x0c, 0x89,\n\t\t\t\t0x39, 0x2f, 0x45, 0xc7, 0x64, 0x25, 0xb2, 0x61,\n\t\t\t\t0x81, 0xf5, 0x21, 0xd7, 0xf3, 0x70, 0x06, 0x6a,\n\t\t\t\t0x8f,\n\t\t\t},\n\t\t},\n\t\tSequence: 0xffffffff,\n\t}\n\ttxOut := TxOut{\n\t\tValue: 395019,\n\t\tPkScript: []byte{\n\t\t\t0x00, // Version 0 witness program\n\t\t\t0x14, // OP_DATA_20\n\t\t\t0x9d, 0xda, 0xc6, 0xf3, 0x9d, 0x51, 0xe0, 0x39,\n\t\t\t0x8e, 0x53, 0x2a, 0x22, 0xc4, 0x1b, 0xa1, 0x89,\n\t\t\t0x40, 0x6a, 0x85, 0x23, // 20-byte pub key hash\n\t\t},\n\t}\n\tmsgTx.AddTxIn(&txIn)\n\tmsgTx.AddTxOut(&txOut)\n\tmsgTx.LockTime = 0\n\n\t// Ensure the correct txid, and wtxid is produced as expected.\n\ttxid := msgTx.TxHash()\n\tif !txid.IsEqual(wantHashTxid) {\n\t\tt.Errorf(\"TxSha: wrong hash - got %v, want %v\",\n\t\t\tspew.Sprint(txid), spew.Sprint(wantHashTxid))\n\t}\n\twtxid := msgTx.WitnessHash()\n\tif !wtxid.IsEqual(wantHashWTxid) {\n\t\tt.Errorf(\"WTxSha: wrong hash - got %v, want %v\",\n\t\t\tspew.Sprint(wtxid), spew.Sprint(wantHashWTxid))\n\t}\n}\n\n// TestTxWire tests the MsgTx wire encode and decode for various numbers\n// of transaction inputs and outputs and protocol versions.\nfunc TestTxWire(t *testing.T) {\n\t// Empty tx message.\n\tnoTx := NewMsgTx(1)\n\tnoTx.Version = 1\n\tnoTxEncoded := []byte{\n\t\t0x01, 0x00, 0x00, 0x00, // Version\n\t\t0x00,                   // Varint for number of input transactions\n\t\t0x00,                   // Varint for number of output transactions\n\t\t0x00, 0x00, 0x00, 0x00, // Lock time\n\t}\n\n\ttests := []struct {\n\t\tin   *MsgTx          // Message to encode\n\t\tout  *MsgTx          // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version with no transactions.\n\t\t{\n\t\t\tnoTx,\n\t\t\tnoTx, noTxEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Latest protocol version with multiple transactions.\n\t\t{\n\t\t\tmultiTx,\n\t\t\tmultiTx,\n\t\t\tmultiTxEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version with no transactions.\n\t\t{\n\t\t\tnoTx,\n\t\t\tnoTx,\n\t\t\tnoTxEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version with multiple transactions.\n\t\t{\n\t\t\tmultiTx,\n\t\t\tmultiTx,\n\t\t\tmultiTxEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version with no transactions.\n\t\t{\n\t\t\tnoTx,\n\t\t\tnoTx,\n\t\t\tnoTxEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version with multiple transactions.\n\t\t{\n\t\t\tmultiTx,\n\t\t\tmultiTx,\n\t\t\tmultiTxEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion with no transactions.\n\t\t{\n\t\t\tnoTx,\n\t\t\tnoTx,\n\t\t\tnoTxEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion with multiple transactions.\n\t\t{\n\t\t\tmultiTx,\n\t\t\tmultiTx,\n\t\t\tmultiTxEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion with no transactions.\n\t\t{\n\t\t\tnoTx,\n\t\t\tnoTx,\n\t\t\tnoTxEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion with multiple transactions.\n\t\t{\n\t\t\tmultiTx,\n\t\t\tmultiTx,\n\t\t\tmultiTxEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgTx\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestTxWireErrors performs negative tests against wire encode and decode\n// of MsgTx to confirm error paths work correctly.\nfunc TestTxWireErrors(t *testing.T) {\n\t// Use protocol version 60002 specifically here instead of the latest\n\t// because the test data is using bytes encoded with that protocol\n\t// version.\n\tpver := uint32(60002)\n\n\ttests := []struct {\n\t\tin       *MsgTx          // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Force error in version.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in number of transaction inputs.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 4, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction input previous block hash.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 5, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction input previous block output index.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 37, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction input signature script length.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 41, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction input signature script.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 42, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction input sequence.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 49, io.ErrShortWrite, io.EOF},\n\t\t// Force error in number of transaction outputs.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 53, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction output value.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 54, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction output pk script length.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 62, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction output pk script.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 63, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction output lock time.\n\t\t{multiTx, multiTxEncoded, pver, BaseEncoding, 206, io.ErrShortWrite, io.EOF},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif err != test.writeErr {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgTx\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = msg.BtcDecode(r, test.pver, test.enc)\n\t\tif err != test.readErr {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestTxSerialize tests MsgTx serialize and deserialize.\nfunc TestTxSerialize(t *testing.T) {\n\tnoTx := NewMsgTx(1)\n\tnoTx.Version = 1\n\tnoTxEncoded := []byte{\n\t\t0x01, 0x00, 0x00, 0x00, // Version\n\t\t0x00,                   // Varint for number of input transactions\n\t\t0x00,                   // Varint for number of output transactions\n\t\t0x00, 0x00, 0x00, 0x00, // Lock time\n\t}\n\n\ttests := []struct {\n\t\tin           *MsgTx // Message to encode\n\t\tout          *MsgTx // Expected decoded message\n\t\tbuf          []byte // Serialized data\n\t\tpkScriptLocs []int  // Expected output script locations\n\t\twitness      bool   // Serialize using the witness encoding\n\t}{\n\t\t// No transactions.\n\t\t{\n\t\t\tnoTx,\n\t\t\tnoTx,\n\t\t\tnoTxEncoded,\n\t\t\tnil,\n\t\t\tfalse,\n\t\t},\n\n\t\t// Multiple transactions.\n\t\t{\n\t\t\tmultiTx,\n\t\t\tmultiTx,\n\t\t\tmultiTxEncoded,\n\t\t\tmultiTxPkScriptLocs,\n\t\t\tfalse,\n\t\t},\n\t\t// Multiple outputs witness transaction.\n\t\t{\n\t\t\tmultiWitnessTx,\n\t\t\tmultiWitnessTx,\n\t\t\tmultiWitnessTxEncoded,\n\t\t\tmultiWitnessTxPkScriptLocs,\n\t\t\ttrue,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Serialize the transaction.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.Serialize(&buf)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Serialize #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"Serialize #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Deserialize the transaction.\n\t\tvar tx MsgTx\n\t\trbuf := bytes.NewReader(test.buf)\n\t\tif test.witness {\n\t\t\terr = tx.Deserialize(rbuf)\n\t\t} else {\n\t\t\terr = tx.DeserializeNoWitness(rbuf)\n\t\t}\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Deserialize #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&tx, test.out) {\n\t\t\tt.Errorf(\"Deserialize #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(&tx), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Ensure the public key script locations are accurate.\n\t\tpkScriptLocs := test.in.PkScriptLocs()\n\t\tif !reflect.DeepEqual(pkScriptLocs, test.pkScriptLocs) {\n\t\t\tt.Errorf(\"PkScriptLocs #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(pkScriptLocs),\n\t\t\t\tspew.Sdump(test.pkScriptLocs))\n\t\t\tcontinue\n\t\t}\n\t\tfor j, loc := range pkScriptLocs {\n\t\t\twantPkScript := test.in.TxOut[j].PkScript\n\t\t\tgotPkScript := test.buf[loc : loc+len(wantPkScript)]\n\t\t\tif !bytes.Equal(gotPkScript, wantPkScript) {\n\t\t\t\tt.Errorf(\"PkScriptLocs #%d:%d\\n unexpected \"+\n\t\t\t\t\t\"script got: %s want: %s\", i, j,\n\t\t\t\t\tspew.Sdump(gotPkScript),\n\t\t\t\t\tspew.Sdump(wantPkScript))\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestTxSerializeErrors performs negative tests against wire encode and decode\n// of MsgTx to confirm error paths work correctly.\nfunc TestTxSerializeErrors(t *testing.T) {\n\ttests := []struct {\n\t\tin       *MsgTx // Value to encode\n\t\tbuf      []byte // Serialized data\n\t\tmax      int    // Max size of fixed buffer to induce errors\n\t\twriteErr error  // Expected write error\n\t\treadErr  error  // Expected read error\n\t}{\n\t\t// Force error in version.\n\t\t{multiTx, multiTxEncoded, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in number of transaction inputs.\n\t\t{multiTx, multiTxEncoded, 4, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction input previous block hash.\n\t\t{multiTx, multiTxEncoded, 5, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction input previous block output index.\n\t\t{multiTx, multiTxEncoded, 37, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction input signature script length.\n\t\t{multiTx, multiTxEncoded, 41, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction input signature script.\n\t\t{multiTx, multiTxEncoded, 42, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction input sequence.\n\t\t{multiTx, multiTxEncoded, 49, io.ErrShortWrite, io.EOF},\n\t\t// Force error in number of transaction outputs.\n\t\t{multiTx, multiTxEncoded, 53, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction output value.\n\t\t{multiTx, multiTxEncoded, 54, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction output pk script length.\n\t\t{multiTx, multiTxEncoded, 62, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction output pk script.\n\t\t{multiTx, multiTxEncoded, 63, io.ErrShortWrite, io.EOF},\n\t\t// Force error in transaction output lock time.\n\t\t{multiTx, multiTxEncoded, 206, io.ErrShortWrite, io.EOF},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Serialize the transaction.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.Serialize(w)\n\t\tif err != test.writeErr {\n\t\t\tt.Errorf(\"Serialize #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Deserialize the transaction.\n\t\tvar tx MsgTx\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = tx.Deserialize(r)\n\t\tif err != test.readErr {\n\t\t\tt.Errorf(\"Deserialize #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestTxOverflowErrors performs tests to ensure deserializing transactions\n// which are intentionally crafted to use large values for the variable number\n// of inputs and outputs are handled properly.  This could otherwise potentially\n// be used as an attack vector.\nfunc TestTxOverflowErrors(t *testing.T) {\n\t// Use protocol version 70001 and transaction version 1 specifically\n\t// here instead of the latest values because the test data is using\n\t// bytes encoded with those versions.\n\tpver := uint32(70001)\n\ttxVer := uint32(1)\n\n\ttests := []struct {\n\t\tbuf     []byte          // Wire encoding\n\t\tpver    uint32          // Protocol version for wire encoding\n\t\tenc     MessageEncoding // Message encoding format\n\t\tversion uint32          // Transaction version\n\t\terr     error           // Expected error\n\t}{\n\t\t// Transaction that claims to have ~uint64(0) inputs.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x01, // Version\n\t\t\t\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t\t\t\t0xff, // Varint for number of input transactions\n\t\t\t}, pver, BaseEncoding, txVer, &MessageError{},\n\t\t},\n\n\t\t// Transaction that claims to have ~uint64(0) outputs.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x01, // Version\n\t\t\t\t0x00, // Varint for number of input transactions\n\t\t\t\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t\t\t\t0xff, // Varint for number of output transactions\n\t\t\t}, pver, BaseEncoding, txVer, &MessageError{},\n\t\t},\n\n\t\t// Transaction that has an input with a signature script that\n\t\t// claims to have ~uint64(0) length.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x01, // Version\n\t\t\t\t0x01, // Varint for number of input transactions\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash\n\t\t\t\t0xff, 0xff, 0xff, 0xff, // Previous output index\n\t\t\t\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t\t\t\t0xff, // Varint for length of signature script\n\t\t\t}, pver, BaseEncoding, txVer, &MessageError{},\n\t\t},\n\n\t\t// Transaction that has an output with a public key script\n\t\t// that claims to have ~uint64(0) length.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x01, // Version\n\t\t\t\t0x01, // Varint for number of input transactions\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash\n\t\t\t\t0xff, 0xff, 0xff, 0xff, // Previous output index\n\t\t\t\t0x00,                   // Varint for length of signature script\n\t\t\t\t0xff, 0xff, 0xff, 0xff, // Sequence\n\t\t\t\t0x01,                                           // Varint for number of output transactions\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Transaction amount\n\t\t\t\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t\t\t\t0xff, // Varint for length of public key script\n\t\t\t}, pver, BaseEncoding, txVer, &MessageError{},\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Decode from wire format.\n\t\tvar msg MsgTx\n\t\tr := bytes.NewReader(test.buf)\n\t\terr := msg.BtcDecode(r, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, reflect.TypeOf(test.err))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tr = bytes.NewReader(test.buf)\n\t\terr = msg.Deserialize(r)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.err) {\n\t\t\tt.Errorf(\"Deserialize #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, reflect.TypeOf(test.err))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestTxSerializeSizeStripped performs tests to ensure the serialize size for\n// various transactions is accurate.\nfunc TestTxSerializeSizeStripped(t *testing.T) {\n\t// Empty tx message.\n\tnoTx := NewMsgTx(1)\n\tnoTx.Version = 1\n\n\ttests := []struct {\n\t\tin   *MsgTx // Tx to encode\n\t\tsize int    // Expected serialized size\n\t}{\n\t\t// No inputs or outputs.\n\t\t{noTx, 10},\n\n\t\t// Transcaction with an input and an output.\n\t\t{multiTx, 210},\n\n\t\t// Transaction with an input which includes witness data, and\n\t\t// one output. Note that this uses SerializeSizeStripped which\n\t\t// excludes the additional bytes due to witness data encoding.\n\t\t{multiWitnessTx, 82},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tserializedSize := test.in.SerializeSizeStripped()\n\t\tif serializedSize != test.size {\n\t\t\tt.Errorf(\"MsgTx.SerializeSizeStripped: #%d got: %d, want: %d\", i,\n\t\t\t\tserializedSize, test.size)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestTxID performs tests to ensure the serialize size for various transactions\n// is accurate.\nfunc TestTxID(t *testing.T) {\n\t// Empty tx message.\n\tnoTx := NewMsgTx(1)\n\tnoTx.Version = 1\n\n\ttests := []struct {\n\t\tin   *MsgTx // Tx to encode.\n\t\ttxid string // Expected transaction ID.\n\t}{\n\t\t// No inputs or outputs.\n\t\t{noTx, \"d21633ba23f70118185227be58a63527675641ad37967e2aa461559f577aec43\"},\n\n\t\t// Transaction with an input and an output.\n\t\t{multiTx, \"0100d15a522ff38de05c164ca0a56379a1b77dd1e4805a6534dc9b3d88290e9d\"},\n\n\t\t// Transaction with an input which includes witness data, and\n\t\t// one output.\n\t\t{multiWitnessTx, \"0f167d1385a84d1518cfee208b653fc9163b605ccf1b75347e2850b3e2eb19f3\"},\n\t}\n\n\tfor i, test := range tests {\n\t\ttxid := test.in.TxID()\n\t\trequire.Equal(t, test.txid, txid, \"test #%d\", i)\n\t}\n}\n\n// TestTxWitnessSize performs tests to ensure that the serialized size for\n// various types of transactions that include witness data is accurate.\nfunc TestTxWitnessSize(t *testing.T) {\n\ttests := []struct {\n\t\tin   *MsgTx // Tx to encode\n\t\tsize int    // Expected serialized size w/ witnesses\n\t}{\n\t\t// Transaction with an input which includes witness data, and\n\t\t// one output.\n\t\t{multiWitnessTx, 190},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tserializedSize := test.in.SerializeSize()\n\t\tif serializedSize != test.size {\n\t\t\tt.Errorf(\"MsgTx.SerializeSize: #%d got: %d, want: %d\", i,\n\t\t\t\tserializedSize, test.size)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestTxOutPointFromString performs tests to ensure that the outpoint string\n// parser works as expected.\nfunc TestTxOutPointFromString(t *testing.T) {\n\thashFromStr := func(hash string) chainhash.Hash {\n\t\th, _ := chainhash.NewHashFromStr(hash)\n\t\treturn *h\n\t}\n\n\ttests := []struct {\n\t\tname   string\n\t\tinput  string\n\t\tresult *OutPoint\n\t\terr    bool\n\t}{\n\t\t{\n\t\t\tname:  \"normal outpoint 1\",\n\t\t\tinput: \"2ebd15a7e758d5f4c7c74181b99e5b8586f88e0682dc13e09d92612a2b2bb0a2:1\",\n\t\t\tresult: &OutPoint{\n\t\t\t\tHash:  hashFromStr(\"2ebd15a7e758d5f4c7c74181b99e5b8586f88e0682dc13e09d92612a2b2bb0a2\"),\n\t\t\t\tIndex: 1,\n\t\t\t},\n\t\t\terr: false,\n\t\t},\n\t\t{\n\t\t\tname:  \"normal outpoint 2\",\n\t\t\tinput: \"94c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55:42\",\n\t\t\tresult: &OutPoint{\n\t\t\t\tHash:  hashFromStr(\"94c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55\"),\n\t\t\t\tIndex: 42,\n\t\t\t},\n\t\t\terr: false,\n\t\t},\n\t\t{\n\t\t\tname:  \"big index outpoint\",\n\t\t\tinput: \"94c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55:2147484242\",\n\t\t\tresult: &OutPoint{\n\t\t\t\tHash:  hashFromStr(\"94c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55\"),\n\t\t\t\tIndex: 2147484242,\n\t\t\t},\n\t\t\terr: false,\n\t\t},\n\t\t{\n\t\t\tname:  \"normal outpoint 2 with 31-byte txid\",\n\t\t\tinput: \"c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55:42\",\n\t\t\tresult: &OutPoint{\n\t\t\t\tHash:  hashFromStr(\"c7762a68ff164352bd31fd95fa875204e811c09acef40ba781787eb28e3b55\"),\n\t\t\t\tIndex: 42,\n\t\t\t},\n\t\t\terr: true,\n\t\t},\n\t\t{\n\t\t\tname:   \"bad string\",\n\t\t\tinput:  \"not_outpoint_not_outpoint_not_outpoint\",\n\t\t\tresult: nil,\n\t\t\terr:    true,\n\t\t},\n\t\t{\n\t\t\tname:   \"empty string\",\n\t\t\tinput:  \"\",\n\t\t\tresult: nil,\n\t\t\terr:    true,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\toutpoint, err := NewOutPointFromString(test.input)\n\n\t\t\tisErr := (err != nil)\n\t\t\trequire.Equal(t, isErr, test.err)\n\n\t\t\tif !isErr {\n\t\t\t\trequire.Equal(t, test.result, outpoint)\n\t\t\t}\n\t\t})\n\n\t}\n}\n\n// TestTxSuperfluousWitnessRecord ensures that btcd fails to parse a tx with\n// the witness marker flag set but without any actual witnesses.\nfunc TestTxSuperfluousWitnessRecord(t *testing.T) {\n\tm := &MsgTx{}\n\trbuf := bytes.NewReader(multiWitnessFlagNoWitness)\n\terr := m.BtcDecode(rbuf, ProtocolVersion, WitnessEncoding)\n\tif !errors.Is(err, errSuperfluousWitnessRecord) {\n\t\tt.Fatalf(\"should have failed with %v\", errSuperfluousWitnessRecord)\n\t}\n}\n\n// multiTx is a MsgTx with an input and output and used in various tests.\nvar multiTx = &MsgTx{\n\tVersion: 1,\n\tTxIn: []*TxIn{\n\t\t{\n\t\t\tPreviousOutPoint: OutPoint{\n\t\t\t\tHash:  chainhash.Hash{},\n\t\t\t\tIndex: 0xffffffff,\n\t\t\t},\n\t\t\tSignatureScript: []byte{\n\t\t\t\t0x04, 0x31, 0xdc, 0x00, 0x1b, 0x01, 0x62,\n\t\t\t},\n\t\t\tSequence: 0xffffffff,\n\t\t},\n\t},\n\tTxOut: []*TxOut{\n\t\t{\n\t\t\tValue: 0x12a05f200,\n\t\t\tPkScript: []byte{\n\t\t\t\t0x41, // OP_DATA_65\n\t\t\t\t0x04, 0xd6, 0x4b, 0xdf, 0xd0, 0x9e, 0xb1, 0xc5,\n\t\t\t\t0xfe, 0x29, 0x5a, 0xbd, 0xeb, 0x1d, 0xca, 0x42,\n\t\t\t\t0x81, 0xbe, 0x98, 0x8e, 0x2d, 0xa0, 0xb6, 0xc1,\n\t\t\t\t0xc6, 0xa5, 0x9d, 0xc2, 0x26, 0xc2, 0x86, 0x24,\n\t\t\t\t0xe1, 0x81, 0x75, 0xe8, 0x51, 0xc9, 0x6b, 0x97,\n\t\t\t\t0x3d, 0x81, 0xb0, 0x1c, 0xc3, 0x1f, 0x04, 0x78,\n\t\t\t\t0x34, 0xbc, 0x06, 0xd6, 0xd6, 0xed, 0xf6, 0x20,\n\t\t\t\t0xd1, 0x84, 0x24, 0x1a, 0x6a, 0xed, 0x8b, 0x63,\n\t\t\t\t0xa6, // 65-byte signature\n\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tValue: 0x5f5e100,\n\t\t\tPkScript: []byte{\n\t\t\t\t0x41, // OP_DATA_65\n\t\t\t\t0x04, 0xd6, 0x4b, 0xdf, 0xd0, 0x9e, 0xb1, 0xc5,\n\t\t\t\t0xfe, 0x29, 0x5a, 0xbd, 0xeb, 0x1d, 0xca, 0x42,\n\t\t\t\t0x81, 0xbe, 0x98, 0x8e, 0x2d, 0xa0, 0xb6, 0xc1,\n\t\t\t\t0xc6, 0xa5, 0x9d, 0xc2, 0x26, 0xc2, 0x86, 0x24,\n\t\t\t\t0xe1, 0x81, 0x75, 0xe8, 0x51, 0xc9, 0x6b, 0x97,\n\t\t\t\t0x3d, 0x81, 0xb0, 0x1c, 0xc3, 0x1f, 0x04, 0x78,\n\t\t\t\t0x34, 0xbc, 0x06, 0xd6, 0xd6, 0xed, 0xf6, 0x20,\n\t\t\t\t0xd1, 0x84, 0x24, 0x1a, 0x6a, 0xed, 0x8b, 0x63,\n\t\t\t\t0xa6, // 65-byte signature\n\t\t\t\t0xac, // OP_CHECKSIG\n\t\t\t},\n\t\t},\n\t},\n\tLockTime: 0,\n}\n\n// multiTxEncoded is the wire encoded bytes for multiTx using protocol version\n// 60002 and is used in the various tests.\nvar multiTxEncoded = []byte{\n\t0x01, 0x00, 0x00, 0x00, // Version\n\t0x01, // Varint for number of input transactions\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash\n\t0xff, 0xff, 0xff, 0xff, // Previous output index\n\t0x07,                                     // Varint for length of signature script\n\t0x04, 0x31, 0xdc, 0x00, 0x1b, 0x01, 0x62, // Signature script\n\t0xff, 0xff, 0xff, 0xff, // Sequence\n\t0x02,                                           // Varint for number of output transactions\n\t0x00, 0xf2, 0x05, 0x2a, 0x01, 0x00, 0x00, 0x00, // Transaction amount\n\t0x43, // Varint for length of pk script\n\t0x41, // OP_DATA_65\n\t0x04, 0xd6, 0x4b, 0xdf, 0xd0, 0x9e, 0xb1, 0xc5,\n\t0xfe, 0x29, 0x5a, 0xbd, 0xeb, 0x1d, 0xca, 0x42,\n\t0x81, 0xbe, 0x98, 0x8e, 0x2d, 0xa0, 0xb6, 0xc1,\n\t0xc6, 0xa5, 0x9d, 0xc2, 0x26, 0xc2, 0x86, 0x24,\n\t0xe1, 0x81, 0x75, 0xe8, 0x51, 0xc9, 0x6b, 0x97,\n\t0x3d, 0x81, 0xb0, 0x1c, 0xc3, 0x1f, 0x04, 0x78,\n\t0x34, 0xbc, 0x06, 0xd6, 0xd6, 0xed, 0xf6, 0x20,\n\t0xd1, 0x84, 0x24, 0x1a, 0x6a, 0xed, 0x8b, 0x63,\n\t0xa6,                                           // 65-byte signature\n\t0xac,                                           // OP_CHECKSIG\n\t0x00, 0xe1, 0xf5, 0x05, 0x00, 0x00, 0x00, 0x00, // Transaction amount\n\t0x43, // Varint for length of pk script\n\t0x41, // OP_DATA_65\n\t0x04, 0xd6, 0x4b, 0xdf, 0xd0, 0x9e, 0xb1, 0xc5,\n\t0xfe, 0x29, 0x5a, 0xbd, 0xeb, 0x1d, 0xca, 0x42,\n\t0x81, 0xbe, 0x98, 0x8e, 0x2d, 0xa0, 0xb6, 0xc1,\n\t0xc6, 0xa5, 0x9d, 0xc2, 0x26, 0xc2, 0x86, 0x24,\n\t0xe1, 0x81, 0x75, 0xe8, 0x51, 0xc9, 0x6b, 0x97,\n\t0x3d, 0x81, 0xb0, 0x1c, 0xc3, 0x1f, 0x04, 0x78,\n\t0x34, 0xbc, 0x06, 0xd6, 0xd6, 0xed, 0xf6, 0x20,\n\t0xd1, 0x84, 0x24, 0x1a, 0x6a, 0xed, 0x8b, 0x63,\n\t0xa6,                   // 65-byte signature\n\t0xac,                   // OP_CHECKSIG\n\t0x00, 0x00, 0x00, 0x00, // Lock time\n}\n\n// multiTxPkScriptLocs is the location information for the public key scripts\n// located in multiTx.\nvar multiTxPkScriptLocs = []int{63, 139}\n\n// multiWitnessTx is a MsgTx with an input with witness data, and an\n// output used in various tests.\nvar multiWitnessTx = &MsgTx{\n\tVersion: 1,\n\tTxIn: []*TxIn{\n\t\t{\n\t\t\tPreviousOutPoint: OutPoint{\n\t\t\t\tHash: chainhash.Hash{\n\t\t\t\t\t0xa5, 0x33, 0x52, 0xd5, 0x13, 0x57, 0x66, 0xf0,\n\t\t\t\t\t0x30, 0x76, 0x59, 0x74, 0x18, 0x26, 0x3d, 0xa2,\n\t\t\t\t\t0xd9, 0xc9, 0x58, 0x31, 0x59, 0x68, 0xfe, 0xa8,\n\t\t\t\t\t0x23, 0x52, 0x94, 0x67, 0x48, 0x1f, 0xf9, 0xcd,\n\t\t\t\t},\n\t\t\t\tIndex: 19,\n\t\t\t},\n\t\t\tSignatureScript: []byte{},\n\t\t\tWitness: [][]byte{\n\t\t\t\t{ // 70-byte signature\n\t\t\t\t\t0x30, 0x43, 0x02, 0x1f, 0x4d, 0x23, 0x81, 0xdc,\n\t\t\t\t\t0x97, 0xf1, 0x82, 0xab, 0xd8, 0x18, 0x5f, 0x51,\n\t\t\t\t\t0x75, 0x30, 0x18, 0x52, 0x32, 0x12, 0xf5, 0xdd,\n\t\t\t\t\t0xc0, 0x7c, 0xc4, 0xe6, 0x3a, 0x8d, 0xc0, 0x36,\n\t\t\t\t\t0x58, 0xda, 0x19, 0x02, 0x20, 0x60, 0x8b, 0x5c,\n\t\t\t\t\t0x4d, 0x92, 0xb8, 0x6b, 0x6d, 0xe7, 0xd7, 0x8e,\n\t\t\t\t\t0xf2, 0x3a, 0x2f, 0xa7, 0x35, 0xbc, 0xb5, 0x9b,\n\t\t\t\t\t0x91, 0x4a, 0x48, 0xb0, 0xe1, 0x87, 0xc5, 0xe7,\n\t\t\t\t\t0x56, 0x9a, 0x18, 0x19, 0x70, 0x01,\n\t\t\t\t},\n\t\t\t\t{ // 33-byte serialize pub key\n\t\t\t\t\t0x03, 0x07, 0xea, 0xd0, 0x84, 0x80, 0x7e, 0xb7,\n\t\t\t\t\t0x63, 0x46, 0xdf, 0x69, 0x77, 0x00, 0x0c, 0x89,\n\t\t\t\t\t0x39, 0x2f, 0x45, 0xc7, 0x64, 0x25, 0xb2, 0x61,\n\t\t\t\t\t0x81, 0xf5, 0x21, 0xd7, 0xf3, 0x70, 0x06, 0x6a,\n\t\t\t\t\t0x8f,\n\t\t\t\t},\n\t\t\t},\n\t\t\tSequence: 0xffffffff,\n\t\t},\n\t},\n\tTxOut: []*TxOut{\n\t\t{\n\t\t\tValue: 395019,\n\t\t\tPkScript: []byte{ // p2wkh output\n\t\t\t\t0x00, // Version 0 witness program\n\t\t\t\t0x14, // OP_DATA_20\n\t\t\t\t0x9d, 0xda, 0xc6, 0xf3, 0x9d, 0x51, 0xe0, 0x39,\n\t\t\t\t0x8e, 0x53, 0x2a, 0x22, 0xc4, 0x1b, 0xa1, 0x89,\n\t\t\t\t0x40, 0x6a, 0x85, 0x23, // 20-byte pub key hash\n\t\t\t},\n\t\t},\n\t},\n}\n\n// multiWitnessFlagNoWitness is the wire encoded bytes for multiWitnessTx with\n// the witness flag set but with witnesses omitted.\nvar multiWitnessFlagNoWitness = []byte{\n\t0x1, 0x0, 0x0, 0x0, // Version\n\tTxFlagMarker, // Marker byte indicating 0 inputs, or a segwit encoded tx\n\tWitnessFlag,  // Flag byte\n\t0x1,          // Varint for number of inputs\n\t0xa5, 0x33, 0x52, 0xd5, 0x13, 0x57, 0x66, 0xf0,\n\t0x30, 0x76, 0x59, 0x74, 0x18, 0x26, 0x3d, 0xa2,\n\t0xd9, 0xc9, 0x58, 0x31, 0x59, 0x68, 0xfe, 0xa8,\n\t0x23, 0x52, 0x94, 0x67, 0x48, 0x1f, 0xf9, 0xcd, // Previous output hash\n\t0x13, 0x0, 0x0, 0x0, // Little endian previous output index\n\t0x0,                    // No sig script (this is a witness input)\n\t0xff, 0xff, 0xff, 0xff, // Sequence\n\t0x1,                                    // Varint for number of outputs\n\t0xb, 0x7, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, // Output amount\n\t0x16, // Varint for length of pk script\n\t0x0,  // Version 0 witness program\n\t0x14, // OP_DATA_20\n\t0x9d, 0xda, 0xc6, 0xf3, 0x9d, 0x51, 0xe0, 0x39,\n\t0x8e, 0x53, 0x2a, 0x22, 0xc4, 0x1b, 0xa1, 0x89,\n\t0x40, 0x6a, 0x85, 0x23, // 20-byte pub key hash\n\t0x00,               // No item on the witness stack for the first input\n\t0x00,               // No item on the witness stack for the second input\n\t0x0, 0x0, 0x0, 0x0, // Lock time\n}\n\n// multiWitnessTxEncoded is the wire encoded bytes for multiWitnessTx including inputs\n// with witness data using protocol version 70012 and is used in the various\n// tests.\nvar multiWitnessTxEncoded = []byte{\n\t0x1, 0x0, 0x0, 0x0, // Version\n\tTxFlagMarker, // Marker byte indicating 0 inputs, or a segwit encoded tx\n\tWitnessFlag,  // Flag byte\n\t0x1,          // Varint for number of inputs\n\t0xa5, 0x33, 0x52, 0xd5, 0x13, 0x57, 0x66, 0xf0,\n\t0x30, 0x76, 0x59, 0x74, 0x18, 0x26, 0x3d, 0xa2,\n\t0xd9, 0xc9, 0x58, 0x31, 0x59, 0x68, 0xfe, 0xa8,\n\t0x23, 0x52, 0x94, 0x67, 0x48, 0x1f, 0xf9, 0xcd, // Previous output hash\n\t0x13, 0x0, 0x0, 0x0, // Little endian previous output index\n\t0x0,                    // No sig script (this is a witness input)\n\t0xff, 0xff, 0xff, 0xff, // Sequence\n\t0x1,                                    // Varint for number of outputs\n\t0xb, 0x7, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, // Output amount\n\t0x16, // Varint for length of pk script\n\t0x0,  // Version 0 witness program\n\t0x14, // OP_DATA_20\n\t0x9d, 0xda, 0xc6, 0xf3, 0x9d, 0x51, 0xe0, 0x39,\n\t0x8e, 0x53, 0x2a, 0x22, 0xc4, 0x1b, 0xa1, 0x89,\n\t0x40, 0x6a, 0x85, 0x23, // 20-byte pub key hash\n\t0x2,  // Two items on the witness stack\n\t0x46, // 70 byte stack item\n\t0x30, 0x43, 0x2, 0x1f, 0x4d, 0x23, 0x81, 0xdc,\n\t0x97, 0xf1, 0x82, 0xab, 0xd8, 0x18, 0x5f, 0x51,\n\t0x75, 0x30, 0x18, 0x52, 0x32, 0x12, 0xf5, 0xdd,\n\t0xc0, 0x7c, 0xc4, 0xe6, 0x3a, 0x8d, 0xc0, 0x36,\n\t0x58, 0xda, 0x19, 0x2, 0x20, 0x60, 0x8b, 0x5c,\n\t0x4d, 0x92, 0xb8, 0x6b, 0x6d, 0xe7, 0xd7, 0x8e,\n\t0xf2, 0x3a, 0x2f, 0xa7, 0x35, 0xbc, 0xb5, 0x9b,\n\t0x91, 0x4a, 0x48, 0xb0, 0xe1, 0x87, 0xc5, 0xe7,\n\t0x56, 0x9a, 0x18, 0x19, 0x70, 0x1,\n\t0x21, // 33 byte stack item\n\t0x3, 0x7, 0xea, 0xd0, 0x84, 0x80, 0x7e, 0xb7,\n\t0x63, 0x46, 0xdf, 0x69, 0x77, 0x0, 0xc, 0x89,\n\t0x39, 0x2f, 0x45, 0xc7, 0x64, 0x25, 0xb2, 0x61,\n\t0x81, 0xf5, 0x21, 0xd7, 0xf3, 0x70, 0x6, 0x6a,\n\t0x8f,\n\t0x0, 0x0, 0x0, 0x0, // Lock time\n}\n\n// multiWitnessTxEncodedNonZeroFlag is an incorrect wire encoded bytes for\n// multiWitnessTx including inputs with witness data. Instead of the flag byte\n// being set to 0x01, the flag is 0x00, which should trigger a decoding error.\nvar multiWitnessTxEncodedNonZeroFlag = []byte{\n\t0x1, 0x0, 0x0, 0x0, // Version\n\tTxFlagMarker, // Marker byte indicating 0 inputs, or a segwit encoded tx\n\t0x0,          // Incorrect flag byte (should be 0x01)\n\t0x1,          // Varint for number of inputs\n\t0xa5, 0x33, 0x52, 0xd5, 0x13, 0x57, 0x66, 0xf0,\n\t0x30, 0x76, 0x59, 0x74, 0x18, 0x26, 0x3d, 0xa2,\n\t0xd9, 0xc9, 0x58, 0x31, 0x59, 0x68, 0xfe, 0xa8,\n\t0x23, 0x52, 0x94, 0x67, 0x48, 0x1f, 0xf9, 0xcd, // Previous output hash\n\t0x13, 0x0, 0x0, 0x0, // Little endian previous output index\n\t0x0,                    // No sig script (this is a witness input)\n\t0xff, 0xff, 0xff, 0xff, // Sequence\n\t0x1,                                    // Varint for number of outputs\n\t0xb, 0x7, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, // Output amount\n\t0x16, // Varint for length of pk script\n\t0x0,  // Version 0 witness program\n\t0x14, // OP_DATA_20\n\t0x9d, 0xda, 0xc6, 0xf3, 0x9d, 0x51, 0xe0, 0x39,\n\t0x8e, 0x53, 0x2a, 0x22, 0xc4, 0x1b, 0xa1, 0x89,\n\t0x40, 0x6a, 0x85, 0x23, // 20-byte pub key hash\n\t0x2,  // Two items on the witness stack\n\t0x46, // 70 byte stack item\n\t0x30, 0x43, 0x2, 0x1f, 0x4d, 0x23, 0x81, 0xdc,\n\t0x97, 0xf1, 0x82, 0xab, 0xd8, 0x18, 0x5f, 0x51,\n\t0x75, 0x30, 0x18, 0x52, 0x32, 0x12, 0xf5, 0xdd,\n\t0xc0, 0x7c, 0xc4, 0xe6, 0x3a, 0x8d, 0xc0, 0x36,\n\t0x58, 0xda, 0x19, 0x2, 0x20, 0x60, 0x8b, 0x5c,\n\t0x4d, 0x92, 0xb8, 0x6b, 0x6d, 0xe7, 0xd7, 0x8e,\n\t0xf2, 0x3a, 0x2f, 0xa7, 0x35, 0xbc, 0xb5, 0x9b,\n\t0x91, 0x4a, 0x48, 0xb0, 0xe1, 0x87, 0xc5, 0xe7,\n\t0x56, 0x9a, 0x18, 0x19, 0x70, 0x1,\n\t0x21, // 33 byte stack item\n\t0x3, 0x7, 0xea, 0xd0, 0x84, 0x80, 0x7e, 0xb7,\n\t0x63, 0x46, 0xdf, 0x69, 0x77, 0x0, 0xc, 0x89,\n\t0x39, 0x2f, 0x45, 0xc7, 0x64, 0x25, 0xb2, 0x61,\n\t0x81, 0xf5, 0x21, 0xd7, 0xf3, 0x70, 0x6, 0x6a,\n\t0x8f,\n\t0x0, 0x0, 0x0, 0x0, // Lock time\n}\n\n// multiTxPkScriptLocs is the location information for the public key scripts\n// located in multiWitnessTx.\nvar multiWitnessTxPkScriptLocs = []int{58}\n\n// TestTxWitnessOverflowPanic ensures that decoding a witness tx where\n// cumulative witness item lengths exceed the script slab capacity\n// returns a decode error instead of panicking on an out-of-bounds\n// slice.\nfunc TestTxWitnessOverflowPanic(t *testing.T) {\n\t// Build a minimal witness tx with one input, zero outputs,\n\t// and two witness items whose combined claimed lengths\n\t// exceed the scriptSlabSize (4 MiB) decode buffer.\n\t//\n\t// Item 1: 3 000 000 bytes  (fits in slab, < maxWitnessItemSize)\n\t// Item 2: 2 000 000 bytes  (passes maxWitnessItemSize but\n\t//         overflows remaining slab capacity of ~1.19 MiB)\n\tconst (\n\t\tfirstLen  = 3_000_000\n\t\tsecondLen = 2_000_000\n\t)\n\n\tvar buf bytes.Buffer\n\n\t// tx version = 2\n\tbuf.Write([]byte{0x02, 0x00, 0x00, 0x00})\n\n\t// Segwit marker + flag\n\tbuf.WriteByte(TxFlagMarker)\n\tbuf.WriteByte(byte(WitnessFlag))\n\n\t// 1 input\n\tWriteVarInt(&buf, 0, 1)\n\n\t// Previous outpoint: 32-byte zero hash + index 0\n\tbuf.Write(make([]byte, 32))\n\tbuf.Write([]byte{0x00, 0x00, 0x00, 0x00})\n\n\t// Empty signature script\n\tWriteVarInt(&buf, 0, 0)\n\n\t// Sequence\n\tbuf.Write([]byte{0x00, 0x00, 0x00, 0x00})\n\n\t// 0 outputs\n\tWriteVarInt(&buf, 0, 0)\n\n\t// Witness: 2 stack items for the single input\n\tWriteVarInt(&buf, 0, 2)\n\n\t// First witness item: firstLen bytes of zeros.\n\tWriteVarInt(&buf, 0, firstLen)\n\tbuf.Write(make([]byte, firstLen))\n\n\t// Second witness item: only write the varint claiming\n\t// secondLen bytes. The actual data is irrelevant because\n\t// the bounds check must reject before reading it.\n\tWriteVarInt(&buf, 0, secondLen)\n\n\t// No locktime needed; decoding should fail before that.\n\n\tvar msg MsgTx\n\tr := bytes.NewReader(buf.Bytes())\n\terr := msg.BtcDecode(r, ProtocolVersion, WitnessEncoding)\n\trequire.Error(t, err)\n\n\tvar msgErr *MessageError\n\trequire.ErrorAs(t, err, &msgErr)\n}\n"
  },
  {
    "path": "wire/msgverack.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"io\"\n)\n\n// MsgVerAck defines a bitcoin verack message which is used for a peer to\n// acknowledge a version message (MsgVersion) after it has used the information\n// to negotiate parameters.  It implements the Message interface.\n//\n// This message has no payload.\ntype MsgVerAck struct{}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgVerAck) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgVerAck) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgVerAck) Command() string {\n\treturn CmdVerAck\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgVerAck) MaxPayloadLength(pver uint32) uint32 {\n\treturn 0\n}\n\n// NewMsgVerAck returns a new bitcoin verack message that conforms to the\n// Message interface.\nfunc NewMsgVerAck() *MsgVerAck {\n\treturn &MsgVerAck{}\n}\n"
  },
  {
    "path": "wire/msgverack_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestVerAck tests the MsgVerAck API.\nfunc TestVerAck(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Ensure the command is expected value.\n\twantCmd := \"verack\"\n\tmsg := NewMsgVerAck()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgVerAck: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value.\n\twantPayload := uint32(0)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n}\n\n// TestVerAckWire tests the MsgVerAck wire encode and decode for various\n// protocol versions.\nfunc TestVerAckWire(t *testing.T) {\n\tmsgVerAck := NewMsgVerAck()\n\tmsgVerAckEncoded := []byte{}\n\n\ttests := []struct {\n\t\tin   *MsgVerAck      // Message to encode\n\t\tout  *MsgVerAck      // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\tmsgVerAck,\n\t\t\tmsgVerAck,\n\t\t\tmsgVerAckEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version.\n\t\t{\n\t\t\tmsgVerAck,\n\t\t\tmsgVerAck,\n\t\t\tmsgVerAckEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version.\n\t\t{\n\t\t\tmsgVerAck,\n\t\t\tmsgVerAck,\n\t\t\tmsgVerAckEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion.\n\t\t{\n\t\t\tmsgVerAck,\n\t\t\tmsgVerAck,\n\t\t\tmsgVerAckEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion.\n\t\t{\n\t\t\tmsgVerAck,\n\t\t\tmsgVerAck,\n\t\t\tmsgVerAckEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgVerAck\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/msgversion.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"time\"\n)\n\n// MaxUserAgentLen is the maximum allowed length for the user agent field in a\n// version message (MsgVersion).\nconst MaxUserAgentLen = 256\n\n// DefaultUserAgent for wire in the stack\nconst DefaultUserAgent = \"/btcwire:0.5.0/\"\n\n// MsgVersion implements the Message interface and represents a bitcoin version\n// message.  It is used for a peer to advertise itself as soon as an outbound\n// connection is made.  The remote peer then uses this information along with\n// its own to negotiate.  The remote peer must then respond with a version\n// message of its own containing the negotiated values followed by a verack\n// message (MsgVerAck).  This exchange must take place before any further\n// communication is allowed to proceed.\ntype MsgVersion struct {\n\t// Version of the protocol the node is using.\n\tProtocolVersion int32\n\n\t// Bitfield which identifies the enabled services.\n\tServices ServiceFlag\n\n\t// Time the message was generated.  This is encoded as an int64 on the wire.\n\tTimestamp time.Time\n\n\t// Address of the remote peer.\n\tAddrYou NetAddress\n\n\t// Address of the local peer.\n\tAddrMe NetAddress\n\n\t// Unique value associated with message that is used to detect self\n\t// connections.\n\tNonce uint64\n\n\t// The user agent that generated message.  This is a encoded as a varString\n\t// on the wire.  This has a max length of MaxUserAgentLen.\n\tUserAgent string\n\n\t// Last block seen by the generator of the version message.\n\tLastBlock int32\n\n\t// Don't announce transactions to peer.\n\tDisableRelayTx bool\n}\n\n// HasService returns whether the specified service is supported by the peer\n// that generated the message.\nfunc (msg *MsgVersion) HasService(service ServiceFlag) bool {\n\treturn msg.Services&service == service\n}\n\n// AddService adds service as a supported service by the peer generating the\n// message.\nfunc (msg *MsgVersion) AddService(service ServiceFlag) {\n\tmsg.Services |= service\n}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// The version message is special in that the protocol version hasn't been\n// negotiated yet.  As a result, the pver field is ignored and any fields which\n// are added in new versions are optional.  This also mean that r must be a\n// *bytes.Buffer so the number of remaining bytes can be ascertained.\n//\n// This is part of the Message interface implementation.\nfunc (msg *MsgVersion) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tbuf, ok := r.(*bytes.Buffer)\n\tif !ok {\n\t\treturn fmt.Errorf(\"MsgVersion.BtcDecode reader is not a \" +\n\t\t\t\"*bytes.Buffer\")\n\t}\n\n\terr := readElements(buf, &msg.ProtocolVersion, &msg.Services,\n\t\t(*int64Time)(&msg.Timestamp))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = readNetAddress(buf, pver, &msg.AddrYou, false)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Protocol versions >= 106 added a from address, nonce, and user agent\n\t// field and they are only considered present if there are bytes\n\t// remaining in the message.\n\tif buf.Len() > 0 {\n\t\terr = readNetAddress(buf, pver, &msg.AddrMe, false)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif buf.Len() > 0 {\n\t\terr = readElement(buf, &msg.Nonce)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif buf.Len() > 0 {\n\t\tuserAgent, err := ReadVarString(buf, pver)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = validateUserAgent(userAgent)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsg.UserAgent = userAgent\n\t}\n\n\t// Protocol versions >= 209 added a last known block field.  It is only\n\t// considered present if there are bytes remaining in the message.\n\tif buf.Len() > 0 {\n\t\terr = readElement(buf, &msg.LastBlock)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// There was no relay transactions field before BIP0037Version, but\n\t// the default behavior prior to the addition of the field was to always\n\t// relay transactions.\n\tif buf.Len() > 0 {\n\t\t// It's safe to ignore the error here since the buffer has at\n\t\t// least one byte and that byte will result in a boolean value\n\t\t// regardless of its value.  Also, the wire encoding for the\n\t\t// field is true when transactions should be relayed, so reverse\n\t\t// it for the DisableRelayTx field.\n\t\tvar relayTx bool\n\t\treadElement(r, &relayTx)\n\t\tmsg.DisableRelayTx = !relayTx\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgVersion) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\terr := validateUserAgent(msg.UserAgent)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = writeElements(w, msg.ProtocolVersion, msg.Services,\n\t\tmsg.Timestamp.Unix())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = writeNetAddress(w, pver, &msg.AddrYou, false)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = writeNetAddress(w, pver, &msg.AddrMe, false)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = writeElement(w, msg.Nonce)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = WriteVarString(w, pver, msg.UserAgent)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = writeElement(w, msg.LastBlock)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// There was no relay transactions field before BIP0037Version.  Also,\n\t// the wire encoding for the field is true when transactions should be\n\t// relayed, so reverse it from the DisableRelayTx field.\n\tif pver >= BIP0037Version {\n\t\terr = writeElement(w, !msg.DisableRelayTx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgVersion) Command() string {\n\treturn CmdVersion\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgVersion) MaxPayloadLength(pver uint32) uint32 {\n\t// XXX: <= 106 different\n\n\t// Protocol version 4 bytes + services 8 bytes + timestamp 8 bytes +\n\t// remote and local net addresses + nonce 8 bytes + length of user\n\t// agent (varInt) + max allowed useragent length + last block 4 bytes +\n\t// relay transactions flag 1 byte.\n\treturn 33 + (maxNetAddressPayload(pver) * 2) + MaxVarIntPayload +\n\t\tMaxUserAgentLen\n}\n\n// NewMsgVersion returns a new bitcoin version message that conforms to the\n// Message interface using the passed parameters and defaults for the remaining\n// fields.\nfunc NewMsgVersion(me *NetAddress, you *NetAddress, nonce uint64,\n\tlastBlock int32) *MsgVersion {\n\n\t// Limit the timestamp to one second precision since the protocol\n\t// doesn't support better.\n\treturn &MsgVersion{\n\t\tProtocolVersion: int32(ProtocolVersion),\n\t\tServices:        0,\n\t\tTimestamp:       time.Unix(time.Now().Unix(), 0),\n\t\tAddrYou:         *you,\n\t\tAddrMe:          *me,\n\t\tNonce:           nonce,\n\t\tUserAgent:       DefaultUserAgent,\n\t\tLastBlock:       lastBlock,\n\t\tDisableRelayTx:  false,\n\t}\n}\n\n// validateUserAgent checks userAgent length against MaxUserAgentLen\nfunc validateUserAgent(userAgent string) error {\n\tif len(userAgent) > MaxUserAgentLen {\n\t\tstr := fmt.Sprintf(\"user agent too long [len %v, max %v]\",\n\t\t\tlen(userAgent), MaxUserAgentLen)\n\t\treturn messageError(\"MsgVersion\", str)\n\t}\n\treturn nil\n}\n\n// AddUserAgent adds a user agent to the user agent string for the version\n// message.  The version string is not defined to any strict format, although\n// it is recommended to use the form \"major.minor.revision\" e.g. \"2.6.41\".\nfunc (msg *MsgVersion) AddUserAgent(name string, version string,\n\tcomments ...string) error {\n\n\tnewUserAgent := fmt.Sprintf(\"%s:%s\", name, version)\n\tif len(comments) != 0 {\n\t\tnewUserAgent = fmt.Sprintf(\"%s(%s)\", newUserAgent,\n\t\t\tstrings.Join(comments, \"; \"))\n\t}\n\tnewUserAgent = fmt.Sprintf(\"%s%s/\", msg.UserAgent, newUserAgent)\n\terr := validateUserAgent(newUserAgent)\n\tif err != nil {\n\t\treturn err\n\t}\n\tmsg.UserAgent = newUserAgent\n\treturn nil\n}\n"
  },
  {
    "path": "wire/msgversion_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"net\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestVersion tests the MsgVersion API.\nfunc TestVersion(t *testing.T) {\n\tpver := ProtocolVersion\n\n\t// Create version message data.\n\tlastBlock := int32(234234)\n\ttcpAddrMe := &net.TCPAddr{IP: net.ParseIP(\"127.0.0.1\"), Port: 8333}\n\tme := NewNetAddress(tcpAddrMe, SFNodeNetwork)\n\ttcpAddrYou := &net.TCPAddr{IP: net.ParseIP(\"192.168.0.1\"), Port: 8333}\n\tyou := NewNetAddress(tcpAddrYou, SFNodeNetwork)\n\tnonce, err := RandomUint64()\n\tif err != nil {\n\t\tt.Errorf(\"RandomUint64: error generating nonce: %v\", err)\n\t}\n\n\t// Ensure we get the correct data back out.\n\tmsg := NewMsgVersion(me, you, nonce, lastBlock)\n\tif msg.ProtocolVersion != int32(pver) {\n\t\tt.Errorf(\"NewMsgVersion: wrong protocol version - got %v, want %v\",\n\t\t\tmsg.ProtocolVersion, pver)\n\t}\n\tif !reflect.DeepEqual(&msg.AddrMe, me) {\n\t\tt.Errorf(\"NewMsgVersion: wrong me address - got %v, want %v\",\n\t\t\tspew.Sdump(&msg.AddrMe), spew.Sdump(me))\n\t}\n\tif !reflect.DeepEqual(&msg.AddrYou, you) {\n\t\tt.Errorf(\"NewMsgVersion: wrong you address - got %v, want %v\",\n\t\t\tspew.Sdump(&msg.AddrYou), spew.Sdump(you))\n\t}\n\tif msg.Nonce != nonce {\n\t\tt.Errorf(\"NewMsgVersion: wrong nonce - got %v, want %v\",\n\t\t\tmsg.Nonce, nonce)\n\t}\n\tif msg.UserAgent != DefaultUserAgent {\n\t\tt.Errorf(\"NewMsgVersion: wrong user agent - got %v, want %v\",\n\t\t\tmsg.UserAgent, DefaultUserAgent)\n\t}\n\tif msg.LastBlock != lastBlock {\n\t\tt.Errorf(\"NewMsgVersion: wrong last block - got %v, want %v\",\n\t\t\tmsg.LastBlock, lastBlock)\n\t}\n\tif msg.DisableRelayTx {\n\t\tt.Errorf(\"NewMsgVersion: disable relay tx is not false by \"+\n\t\t\t\"default - got %v, want %v\", msg.DisableRelayTx, false)\n\t}\n\n\tmsg.AddUserAgent(\"myclient\", \"1.2.3\", \"optional\", \"comments\")\n\tcustomUserAgent := DefaultUserAgent + \"myclient:1.2.3(optional; comments)/\"\n\tif msg.UserAgent != customUserAgent {\n\t\tt.Errorf(\"AddUserAgent: wrong user agent - got %s, want %s\",\n\t\t\tmsg.UserAgent, customUserAgent)\n\t}\n\n\tmsg.AddUserAgent(\"mygui\", \"3.4.5\")\n\tcustomUserAgent += \"mygui:3.4.5/\"\n\tif msg.UserAgent != customUserAgent {\n\t\tt.Errorf(\"AddUserAgent: wrong user agent - got %s, want %s\",\n\t\t\tmsg.UserAgent, customUserAgent)\n\t}\n\n\t// accounting for \":\", \"/\"\n\terr = msg.AddUserAgent(strings.Repeat(\"t\",\n\t\tMaxUserAgentLen-len(customUserAgent)-2+1), \"\")\n\tif _, ok := err.(*MessageError); !ok {\n\t\tt.Errorf(\"AddUserAgent: expected error not received \"+\n\t\t\t\"- got %v, want %T\", err, MessageError{})\n\n\t}\n\n\t// Version message should not have any services set by default.\n\tif msg.Services != 0 {\n\t\tt.Errorf(\"NewMsgVersion: wrong default services - got %v, want %v\",\n\t\t\tmsg.Services, 0)\n\n\t}\n\tif msg.HasService(SFNodeNetwork) {\n\t\tt.Errorf(\"HasService: SFNodeNetwork service is set\")\n\t}\n\n\t// Ensure the command is expected value.\n\twantCmd := \"version\"\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgVersion: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value.\n\t// Protocol version 4 bytes + services 8 bytes + timestamp 8 bytes +\n\t// remote and local net addresses + nonce 8 bytes + length of user agent\n\t// (varInt) + max allowed user agent length + last block 4 bytes +\n\t// relay transactions flag 1 byte.\n\twantPayload := uint32(358)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Ensure adding the full service node flag works.\n\tmsg.AddService(SFNodeNetwork)\n\tif msg.Services != SFNodeNetwork {\n\t\tt.Errorf(\"AddService: wrong services - got %v, want %v\",\n\t\t\tmsg.Services, SFNodeNetwork)\n\t}\n\tif !msg.HasService(SFNodeNetwork) {\n\t\tt.Errorf(\"HasService: SFNodeNetwork service not set\")\n\t}\n}\n\n// TestVersionWire tests the MsgVersion wire encode and decode for various\n// protocol versions.\nfunc TestVersionWire(t *testing.T) {\n\t// verRelayTxFalse and verRelayTxFalseEncoded is a version message as of\n\t// BIP0037Version with the transaction relay disabled.\n\tbaseVersionBIP0037Copy := *baseVersionBIP0037\n\tverRelayTxFalse := &baseVersionBIP0037Copy\n\tverRelayTxFalse.DisableRelayTx = true\n\tverRelayTxFalseEncoded := make([]byte, len(baseVersionBIP0037Encoded))\n\tcopy(verRelayTxFalseEncoded, baseVersionBIP0037Encoded)\n\tverRelayTxFalseEncoded[len(verRelayTxFalseEncoded)-1] = 0\n\n\ttests := []struct {\n\t\tin   *MsgVersion     // Message to encode\n\t\tout  *MsgVersion     // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\tbaseVersionBIP0037,\n\t\t\tbaseVersionBIP0037,\n\t\t\tbaseVersionBIP0037Encoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0037Version with relay transactions field\n\t\t// true.\n\t\t{\n\t\t\tbaseVersionBIP0037,\n\t\t\tbaseVersionBIP0037,\n\t\t\tbaseVersionBIP0037Encoded,\n\t\t\tBIP0037Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0037Version with relay transactions field\n\t\t// false.\n\t\t{\n\t\t\tverRelayTxFalse,\n\t\t\tverRelayTxFalse,\n\t\t\tverRelayTxFalseEncoded,\n\t\t\tBIP0037Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0035Version.\n\t\t{\n\t\t\tbaseVersion,\n\t\t\tbaseVersion,\n\t\t\tbaseVersionEncoded,\n\t\t\tBIP0035Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version BIP0031Version.\n\t\t{\n\t\t\tbaseVersion,\n\t\t\tbaseVersion,\n\t\t\tbaseVersionEncoded,\n\t\t\tBIP0031Version,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion.\n\t\t{\n\t\t\tbaseVersion,\n\t\t\tbaseVersion,\n\t\t\tbaseVersionEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version MultipleAddressVersion.\n\t\t{\n\t\t\tbaseVersion,\n\t\t\tbaseVersion,\n\t\t\tbaseVersionEncoded,\n\t\t\tMultipleAddressVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgVersion\n\t\trbuf := bytes.NewBuffer(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestVersionWireErrors performs negative tests against wire encode and\n// decode of MsgGetHeaders to confirm error paths work correctly.\nfunc TestVersionWireErrors(t *testing.T) {\n\t// Use protocol version 60002 specifically here instead of the latest\n\t// because the test data is using bytes encoded with that protocol\n\t// version.\n\tpver := uint32(60002)\n\tenc := BaseEncoding\n\twireErr := &MessageError{}\n\n\t// Ensure calling MsgVersion.BtcDecode with a non *bytes.Buffer returns\n\t// error.\n\tfr := newFixedReader(0, []byte{})\n\tif err := baseVersion.BtcDecode(fr, pver, enc); err == nil {\n\t\tt.Errorf(\"Did not received error when calling \" +\n\t\t\t\"MsgVersion.BtcDecode with non *bytes.Buffer\")\n\t}\n\n\t// Copy the base version and change the user agent to exceed max limits.\n\tbvc := *baseVersion\n\texceedUAVer := &bvc\n\tnewUA := \"/\" + strings.Repeat(\"t\", MaxUserAgentLen-8+1) + \":0.0.1/\"\n\texceedUAVer.UserAgent = newUA\n\n\t// Encode the new UA length as a varint.\n\tvar newUAVarIntBuf bytes.Buffer\n\terr := WriteVarInt(&newUAVarIntBuf, pver, uint64(len(newUA)))\n\tif err != nil {\n\t\tt.Errorf(\"WriteVarInt: error %v\", err)\n\t}\n\n\t// Make a new buffer big enough to hold the base version plus the new\n\t// bytes for the bigger varint to hold the new size of the user agent\n\t// and the new user agent string.  Then stich it all together.\n\tnewLen := len(baseVersionEncoded) - len(baseVersion.UserAgent)\n\tnewLen = newLen + len(newUAVarIntBuf.Bytes()) - 1 + len(newUA)\n\texceedUAVerEncoded := make([]byte, newLen)\n\tcopy(exceedUAVerEncoded, baseVersionEncoded[0:80])\n\tcopy(exceedUAVerEncoded[80:], newUAVarIntBuf.Bytes())\n\tcopy(exceedUAVerEncoded[83:], []byte(newUA))\n\tcopy(exceedUAVerEncoded[83+len(newUA):], baseVersionEncoded[97:100])\n\n\ttests := []struct {\n\t\tin       *MsgVersion     // Value to encode\n\t\tbuf      []byte          // Wire encoding\n\t\tpver     uint32          // Protocol version for wire encoding\n\t\tenc      MessageEncoding // Message encoding format\n\t\tmax      int             // Max size of fixed buffer to induce errors\n\t\twriteErr error           // Expected write error\n\t\treadErr  error           // Expected read error\n\t}{\n\t\t// Force error in protocol version.\n\t\t{baseVersion, baseVersionEncoded, pver, BaseEncoding, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force error in services.\n\t\t{baseVersion, baseVersionEncoded, pver, BaseEncoding, 4, io.ErrShortWrite, io.EOF},\n\t\t// Force error in timestamp.\n\t\t{baseVersion, baseVersionEncoded, pver, BaseEncoding, 12, io.ErrShortWrite, io.EOF},\n\t\t// Force error in remote address.\n\t\t{baseVersion, baseVersionEncoded, pver, BaseEncoding, 20, io.ErrShortWrite, io.EOF},\n\t\t// Force error in local address.\n\t\t{baseVersion, baseVersionEncoded, pver, BaseEncoding, 47, io.ErrShortWrite, io.ErrUnexpectedEOF},\n\t\t// Force error in nonce.\n\t\t{baseVersion, baseVersionEncoded, pver, BaseEncoding, 73, io.ErrShortWrite, io.ErrUnexpectedEOF},\n\t\t// Force error in user agent length.\n\t\t{baseVersion, baseVersionEncoded, pver, BaseEncoding, 81, io.ErrShortWrite, io.EOF},\n\t\t// Force error in user agent.\n\t\t{baseVersion, baseVersionEncoded, pver, BaseEncoding, 82, io.ErrShortWrite, io.ErrUnexpectedEOF},\n\t\t// Force error in last block.\n\t\t{baseVersion, baseVersionEncoded, pver, BaseEncoding, 98, io.ErrShortWrite, io.ErrUnexpectedEOF},\n\t\t// Force error in relay tx - no read error should happen since\n\t\t// it's optional.\n\t\t{\n\t\t\tbaseVersionBIP0037, baseVersionBIP0037Encoded,\n\t\t\tBIP0037Version, BaseEncoding, 101, io.ErrShortWrite, nil,\n\t\t},\n\t\t// Force error due to user agent too big\n\t\t{exceedUAVer, exceedUAVerEncoded, pver, BaseEncoding, newLen, wireErr, wireErr},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := test.in.BtcEncode(w, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.writeErr) {\n\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.writeErr {\n\t\t\t\tt.Errorf(\"BtcEncode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.writeErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar msg MsgVersion\n\t\tbuf := bytes.NewBuffer(test.buf[0:test.max])\n\t\terr = msg.BtcDecode(buf, test.pver, test.enc)\n\t\tif reflect.TypeOf(err) != reflect.TypeOf(test.readErr) {\n\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// For errors which are not of type MessageError, check them for\n\t\t// equality.\n\t\tif _, ok := err.(*MessageError); !ok {\n\t\t\tif err != test.readErr {\n\t\t\t\tt.Errorf(\"BtcDecode #%d wrong error got: %v, \"+\n\t\t\t\t\t\"want: %v\", i, err, test.readErr)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TestVersionOptionalFields performs tests to ensure that an encoded version\n// messages that omit optional fields are handled correctly.\nfunc TestVersionOptionalFields(t *testing.T) {\n\t// onlyRequiredVersion is a version message that only contains the\n\t// required versions and all other values set to their default values.\n\tonlyRequiredVersion := MsgVersion{\n\t\tProtocolVersion: 60002,\n\t\tServices:        SFNodeNetwork,\n\t\tTimestamp:       time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST)\n\t\tAddrYou: NetAddress{\n\t\t\tTimestamp: time.Time{}, // Zero value -- no timestamp in version\n\t\t\tServices:  SFNodeNetwork,\n\t\t\tIP:        net.ParseIP(\"192.168.0.1\"),\n\t\t\tPort:      8333,\n\t\t},\n\t}\n\tonlyRequiredVersionEncoded := make([]byte, len(baseVersionEncoded)-55)\n\tcopy(onlyRequiredVersionEncoded, baseVersionEncoded)\n\n\t// addrMeVersion is a version message that contains all fields through\n\t// the AddrMe field.\n\taddrMeVersion := onlyRequiredVersion\n\taddrMeVersion.AddrMe = NetAddress{\n\t\tTimestamp: time.Time{}, // Zero value -- no timestamp in version\n\t\tServices:  SFNodeNetwork,\n\t\tIP:        net.ParseIP(\"127.0.0.1\"),\n\t\tPort:      8333,\n\t}\n\taddrMeVersionEncoded := make([]byte, len(baseVersionEncoded)-29)\n\tcopy(addrMeVersionEncoded, baseVersionEncoded)\n\n\t// nonceVersion is a version message that contains all fields through\n\t// the Nonce field.\n\tnonceVersion := addrMeVersion\n\tnonceVersion.Nonce = 123123 // 0x1e0f3\n\tnonceVersionEncoded := make([]byte, len(baseVersionEncoded)-21)\n\tcopy(nonceVersionEncoded, baseVersionEncoded)\n\n\t// uaVersion is a version message that contains all fields through\n\t// the UserAgent field.\n\tuaVersion := nonceVersion\n\tuaVersion.UserAgent = \"/btcdtest:0.0.1/\"\n\tuaVersionEncoded := make([]byte, len(baseVersionEncoded)-4)\n\tcopy(uaVersionEncoded, baseVersionEncoded)\n\n\t// lastBlockVersion is a version message that contains all fields\n\t// through the LastBlock field.\n\tlastBlockVersion := uaVersion\n\tlastBlockVersion.LastBlock = 234234 // 0x392fa\n\tlastBlockVersionEncoded := make([]byte, len(baseVersionEncoded))\n\tcopy(lastBlockVersionEncoded, baseVersionEncoded)\n\n\ttests := []struct {\n\t\tmsg  *MsgVersion     // Expected message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t{\n\t\t\t&onlyRequiredVersion,\n\t\t\tonlyRequiredVersionEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t\t{\n\t\t\t&addrMeVersion,\n\t\t\taddrMeVersionEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t\t{\n\t\t\t&nonceVersion,\n\t\t\tnonceVersionEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t\t{\n\t\t\t&uaVersion,\n\t\t\tuaVersionEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t\t{\n\t\t\t&lastBlockVersion,\n\t\t\tlastBlockVersionEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tfor i, test := range tests {\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgVersion\n\t\trbuf := bytes.NewBuffer(test.buf)\n\t\terr := msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.msg) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.msg))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// baseVersion is used in the various tests as a baseline MsgVersion.\nvar baseVersion = &MsgVersion{\n\tProtocolVersion: 60002,\n\tServices:        SFNodeNetwork,\n\tTimestamp:       time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST)\n\tAddrYou: NetAddress{\n\t\tTimestamp: time.Time{}, // Zero value -- no timestamp in version\n\t\tServices:  SFNodeNetwork,\n\t\tIP:        net.ParseIP(\"192.168.0.1\"),\n\t\tPort:      8333,\n\t},\n\tAddrMe: NetAddress{\n\t\tTimestamp: time.Time{}, // Zero value -- no timestamp in version\n\t\tServices:  SFNodeNetwork,\n\t\tIP:        net.ParseIP(\"127.0.0.1\"),\n\t\tPort:      8333,\n\t},\n\tNonce:     123123, // 0x1e0f3\n\tUserAgent: \"/btcdtest:0.0.1/\",\n\tLastBlock: 234234, // 0x392fa\n}\n\n// baseVersionEncoded is the wire encoded bytes for baseVersion using protocol\n// version 60002 and is used in the various tests.\nvar baseVersionEncoded = []byte{\n\t0x62, 0xea, 0x00, 0x00, // Protocol version 60002\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t0x29, 0xab, 0x5f, 0x49, 0x00, 0x00, 0x00, 0x00, // 64-bit Timestamp\n\t// AddrYou -- No timestamp for NetAddress in version message\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0xff, 0xff, 0xc0, 0xa8, 0x00, 0x01, // IP 192.168.0.1\n\t0x20, 0x8d, // Port 8333 in big-endian\n\t// AddrMe -- No timestamp for NetAddress in version message\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01, // IP 127.0.0.1\n\t0x20, 0x8d, // Port 8333 in big-endian\n\t0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // Nonce\n\t0x10, // Varint for user agent length\n\t0x2f, 0x62, 0x74, 0x63, 0x64, 0x74, 0x65, 0x73,\n\t0x74, 0x3a, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x2f, // User agent\n\t0xfa, 0x92, 0x03, 0x00, // Last block\n}\n\n// baseVersionBIP0037 is used in the various tests as a baseline MsgVersion for\n// BIP0037.\nvar baseVersionBIP0037 = &MsgVersion{\n\tProtocolVersion: 70001,\n\tServices:        SFNodeNetwork,\n\tTimestamp:       time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST)\n\tAddrYou: NetAddress{\n\t\tTimestamp: time.Time{}, // Zero value -- no timestamp in version\n\t\tServices:  SFNodeNetwork,\n\t\tIP:        net.ParseIP(\"192.168.0.1\"),\n\t\tPort:      8333,\n\t},\n\tAddrMe: NetAddress{\n\t\tTimestamp: time.Time{}, // Zero value -- no timestamp in version\n\t\tServices:  SFNodeNetwork,\n\t\tIP:        net.ParseIP(\"127.0.0.1\"),\n\t\tPort:      8333,\n\t},\n\tNonce:     123123, // 0x1e0f3\n\tUserAgent: \"/btcdtest:0.0.1/\",\n\tLastBlock: 234234, // 0x392fa\n}\n\n// baseVersionBIP0037Encoded is the wire encoded bytes for baseVersionBIP0037\n// using protocol version BIP0037Version and is used in the various tests.\nvar baseVersionBIP0037Encoded = []byte{\n\t0x71, 0x11, 0x01, 0x00, // Protocol version 70001\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t0x29, 0xab, 0x5f, 0x49, 0x00, 0x00, 0x00, 0x00, // 64-bit Timestamp\n\t// AddrYou -- No timestamp for NetAddress in version message\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0xff, 0xff, 0xc0, 0xa8, 0x00, 0x01, // IP 192.168.0.1\n\t0x20, 0x8d, // Port 8333 in big-endian\n\t// AddrMe -- No timestamp for NetAddress in version message\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01, // IP 127.0.0.1\n\t0x20, 0x8d, // Port 8333 in big-endian\n\t0xf3, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, // Nonce\n\t0x10, // Varint for user agent length\n\t0x2f, 0x62, 0x74, 0x63, 0x64, 0x74, 0x65, 0x73,\n\t0x74, 0x3a, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x2f, // User agent\n\t0xfa, 0x92, 0x03, 0x00, // Last block\n\t0x01, // Relay tx\n}\n"
  },
  {
    "path": "wire/msgwtxidrelay.go",
    "content": "// Copyright (c) 2024 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// MsgWTxIdRelay defines a bitcoin wtxidrelay message which is used for a peer\n// to signal support for relaying witness transaction id (BIP141). It\n// implements the Message interface.\n//\n// This message has no payload.\ntype MsgWTxIdRelay struct{}\n\n// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.\n// This is part of the Message interface implementation.\nfunc (msg *MsgWTxIdRelay) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {\n\tif pver < AddrV2Version {\n\t\tstr := fmt.Sprintf(\"wtxidrelay message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgWTxIdRelay.BtcDecode\", str)\n\t}\n\n\treturn nil\n}\n\n// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.\n// This is part of the Message interface implementation.\nfunc (msg *MsgWTxIdRelay) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {\n\tif pver < AddrV2Version {\n\t\tstr := fmt.Sprintf(\"wtxidrelay message invalid for protocol \"+\n\t\t\t\"version %d\", pver)\n\t\treturn messageError(\"MsgWTxIdRelay.BtcEncode\", str)\n\t}\n\n\treturn nil\n}\n\n// Command returns the protocol command string for the message.  This is part\n// of the Message interface implementation.\nfunc (msg *MsgWTxIdRelay) Command() string {\n\treturn CmdWTxIdRelay\n}\n\n// MaxPayloadLength returns the maximum length the payload can be for the\n// receiver.  This is part of the Message interface implementation.\nfunc (msg *MsgWTxIdRelay) MaxPayloadLength(pver uint32) uint32 {\n\treturn 0\n}\n\n// NewMsgWTxIdRelay returns a new bitcoin wtxidrelay message that conforms\n// to the Message interface.\nfunc NewMsgWTxIdRelay() *MsgWTxIdRelay {\n\treturn &MsgWTxIdRelay{}\n}\n"
  },
  {
    "path": "wire/msgwtxidrelay_test.go",
    "content": "// Copyright (c) 2024 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestWTxIdRelay tests the MsgWTxIdRelay API against the latest protocol\n// version.\nfunc TestWTxIdRelay(t *testing.T) {\n\tpver := ProtocolVersion\n\tenc := BaseEncoding\n\n\t// Ensure the command is expected value.\n\twantCmd := \"wtxidrelay\"\n\tmsg := NewMsgWTxIdRelay()\n\tif cmd := msg.Command(); cmd != wantCmd {\n\t\tt.Errorf(\"NewMsgWTxIdRelay: wrong command - got %v want %v\",\n\t\t\tcmd, wantCmd)\n\t}\n\n\t// Ensure max payload is expected value.\n\twantPayload := uint32(0)\n\tmaxPayload := msg.MaxPayloadLength(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"MaxPayloadLength: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Test encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgWTxIdRelay failed %v err <%v>\", msg,\n\t\t\terr)\n\t}\n\n\t// Older protocol versions should fail encode since message didn't\n\t// exist yet.\n\toldPver := AddrV2Version - 1\n\terr = msg.BtcEncode(&buf, oldPver, enc)\n\tif err == nil {\n\t\ts := \"encode of MsgWTxIdRelay passed for old protocol \" +\n\t\t\t\"version %v err <%v>\"\n\t\tt.Errorf(s, msg, err)\n\t}\n\n\t// Test decode with latest protocol version.\n\treadmsg := NewMsgWTxIdRelay()\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgWTxIdRelay failed [%v] err <%v>\", buf,\n\t\t\terr)\n\t}\n\n\t// Older protocol versions should fail decode since message didn't\n\t// exist yet.\n\terr = readmsg.BtcDecode(&buf, oldPver, enc)\n\tif err == nil {\n\t\ts := \"decode of MsgWTxIdRelay passed for old protocol \" +\n\t\t\t\"version %v err <%v>\"\n\t\tt.Errorf(s, msg, err)\n\t}\n}\n\n// TestWTxIdRelayBIP0130 tests the MsgWTxIdRelay API against the protocol\n// prior to version AddrV2Version.\nfunc TestWTxIdRelayBIP0130(t *testing.T) {\n\t// Use the protocol version just prior to AddrV2Version changes.\n\tpver := AddrV2Version - 1\n\tenc := BaseEncoding\n\n\tmsg := NewMsgWTxIdRelay()\n\n\t// Test encode with old protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"encode of MsgWTxIdRelay succeeded when it should \" +\n\t\t\t\"have failed\")\n\t}\n\n\t// Test decode with old protocol version.\n\treadmsg := NewMsgWTxIdRelay()\n\terr = readmsg.BtcDecode(&buf, pver, enc)\n\tif err == nil {\n\t\tt.Errorf(\"decode of MsgWTxIdRelay succeeded when it should \" +\n\t\t\t\"have failed\")\n\t}\n}\n\n// TestWTxIdRelayCrossProtocol tests the MsgWTxIdRelay API when encoding with\n// the latest protocol version and decoding with AddrV2Version.\nfunc TestWTxIdRelayCrossProtocol(t *testing.T) {\n\tenc := BaseEncoding\n\tmsg := NewMsgWTxIdRelay()\n\n\t// Encode with latest protocol version.\n\tvar buf bytes.Buffer\n\terr := msg.BtcEncode(&buf, ProtocolVersion, enc)\n\tif err != nil {\n\t\tt.Errorf(\"encode of MsgWTxIdRelay failed %v err <%v>\", msg,\n\t\t\terr)\n\t}\n\n\t// Decode with old protocol version.\n\treadmsg := NewMsgWTxIdRelay()\n\terr = readmsg.BtcDecode(&buf, AddrV2Version, enc)\n\tif err != nil {\n\t\tt.Errorf(\"decode of MsgWTxIdRelay failed [%v] err <%v>\", buf,\n\t\t\terr)\n\t}\n}\n\n// TestWTxIdRelayWire tests the MsgWTxIdRelay wire encode and decode for\n// various protocol versions.\nfunc TestWTxIdRelayWire(t *testing.T) {\n\tmsgWTxIdRelay := NewMsgWTxIdRelay()\n\tmsgWTxIdRelayEncoded := []byte{}\n\n\ttests := []struct {\n\t\tin   *MsgWTxIdRelay  // Message to encode\n\t\tout  *MsgWTxIdRelay  // Expected decoded message\n\t\tbuf  []byte          // Wire encoding\n\t\tpver uint32          // Protocol version for wire encoding\n\t\tenc  MessageEncoding // Message encoding format\n\t}{\n\t\t// Latest protocol version.\n\t\t{\n\t\t\tmsgWTxIdRelay,\n\t\t\tmsgWTxIdRelay,\n\t\t\tmsgWTxIdRelayEncoded,\n\t\t\tProtocolVersion,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version AddrV2Version+1\n\t\t{\n\t\t\tmsgWTxIdRelay,\n\t\t\tmsgWTxIdRelay,\n\t\t\tmsgWTxIdRelayEncoded,\n\t\t\tAddrV2Version + 1,\n\t\t\tBaseEncoding,\n\t\t},\n\n\t\t// Protocol version AddrV2Version\n\t\t{\n\t\t\tmsgWTxIdRelay,\n\t\t\tmsgWTxIdRelay,\n\t\t\tmsgWTxIdRelayEncoded,\n\t\t\tAddrV2Version,\n\t\t\tBaseEncoding,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode the message to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := test.in.BtcEncode(&buf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcEncode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"BtcEncode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar msg MsgWTxIdRelay\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = msg.BtcDecode(rbuf, test.pver, test.enc)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"BtcDecode #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(&msg, test.out) {\n\t\t\tt.Errorf(\"BtcDecode #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(msg), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/netaddress.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"io\"\n\t\"net\"\n\t\"time\"\n)\n\n// maxNetAddressPayload returns the max payload size for a bitcoin NetAddress\n// based on the protocol version.\nfunc maxNetAddressPayload(pver uint32) uint32 {\n\t// Services 8 bytes + ip 16 bytes + port 2 bytes.\n\tplen := uint32(26)\n\n\t// NetAddressTimeVersion added a timestamp field.\n\tif pver >= NetAddressTimeVersion {\n\t\t// Timestamp 4 bytes.\n\t\tplen += 4\n\t}\n\n\treturn plen\n}\n\n// NetAddress defines information about a peer on the network including the time\n// it was last seen, the services it supports, its IP address, and port.\ntype NetAddress struct {\n\t// Last time the address was seen.  This is, unfortunately, encoded as a\n\t// uint32 on the wire and therefore is limited to 2106.  This field is\n\t// not present in the bitcoin version message (MsgVersion) nor was it\n\t// added until protocol version >= NetAddressTimeVersion.\n\tTimestamp time.Time\n\n\t// Bitfield which identifies the services supported by the address.\n\tServices ServiceFlag\n\n\t// IP address of the peer.\n\tIP net.IP\n\n\t// Port the peer is using.  This is encoded in big endian on the wire\n\t// which differs from most everything else.\n\tPort uint16\n}\n\n// HasService returns whether the specified service is supported by the address.\nfunc (na *NetAddress) HasService(service ServiceFlag) bool {\n\treturn na.Services&service == service\n}\n\n// AddService adds service as a supported service by the peer generating the\n// message.\nfunc (na *NetAddress) AddService(service ServiceFlag) {\n\tna.Services |= service\n}\n\n// NewNetAddressIPPort returns a new NetAddress using the provided IP, port, and\n// supported services with defaults for the remaining fields.\nfunc NewNetAddressIPPort(ip net.IP, port uint16, services ServiceFlag) *NetAddress {\n\treturn NewNetAddressTimestamp(time.Now(), services, ip, port)\n}\n\n// NewNetAddressTimestamp returns a new NetAddress using the provided\n// timestamp, IP, port, and supported services. The timestamp is rounded to\n// single second precision.\nfunc NewNetAddressTimestamp(\n\ttimestamp time.Time, services ServiceFlag, ip net.IP, port uint16) *NetAddress {\n\t// Limit the timestamp to one second precision since the protocol\n\t// doesn't support better.\n\tna := NetAddress{\n\t\tTimestamp: time.Unix(timestamp.Unix(), 0),\n\t\tServices:  services,\n\t\tIP:        ip,\n\t\tPort:      port,\n\t}\n\treturn &na\n}\n\n// NewNetAddress returns a new NetAddress using the provided TCP address and\n// supported services with defaults for the remaining fields.\nfunc NewNetAddress(addr *net.TCPAddr, services ServiceFlag) *NetAddress {\n\treturn NewNetAddressIPPort(addr.IP, uint16(addr.Port), services)\n}\n\n// readNetAddress reads an encoded NetAddress from r depending on the protocol\n// version and whether or not the timestamp is included per ts.  Some messages\n// like version do not include the timestamp.\nfunc readNetAddress(r io.Reader, pver uint32, na *NetAddress, ts bool) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\n\terr := readNetAddressBuf(r, pver, na, ts, buf)\n\treturn err\n}\n\n// readNetAddressBuf reads an encoded NetAddress from r depending on the\n// protocol version and whether or not the timestamp is included per ts.  Some\n// messages like version do not include the timestamp.\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc readNetAddressBuf(r io.Reader, pver uint32, na *NetAddress, ts bool,\n\tbuf []byte) error {\n\n\tvar (\n\t\ttimestamp time.Time\n\t\tservices  ServiceFlag\n\t\tip        [16]byte\n\t\tport      uint16\n\t)\n\n\t// NOTE: The bitcoin protocol uses a uint32 for the timestamp so it will\n\t// stop working somewhere around 2106.  Also timestamp wasn't added until\n\t// protocol version >= NetAddressTimeVersion\n\tif ts && pver >= NetAddressTimeVersion {\n\t\tif _, err := io.ReadFull(r, buf[:4]); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttimestamp = time.Unix(int64(littleEndian.Uint32(buf[:4])), 0)\n\t}\n\n\tif _, err := io.ReadFull(r, buf); err != nil {\n\t\treturn err\n\t}\n\tservices = ServiceFlag(littleEndian.Uint64(buf))\n\n\tif _, err := io.ReadFull(r, ip[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Sigh.  Bitcoin protocol mixes little and big endian.\n\tif _, err := io.ReadFull(r, buf[:2]); err != nil {\n\t\treturn err\n\t}\n\tport = bigEndian.Uint16(buf[:2])\n\n\t*na = NetAddress{\n\t\tTimestamp: timestamp,\n\t\tServices:  services,\n\t\tIP:        net.IP(ip[:]),\n\t\tPort:      port,\n\t}\n\treturn nil\n}\n\n// writeNetAddress serializes a NetAddress to w depending on the protocol\n// version and whether or not the timestamp is included per ts.  Some messages\n// like version do not include the timestamp.\nfunc writeNetAddress(w io.Writer, pver uint32, na *NetAddress, ts bool) error {\n\tbuf := binarySerializer.Borrow()\n\tdefer binarySerializer.Return(buf)\n\terr := writeNetAddressBuf(w, pver, na, ts, buf)\n\n\treturn err\n}\n\n// writeNetAddressBuf serializes a NetAddress to w depending on the protocol\n// version and whether or not the timestamp is included per ts.  Some messages\n// like version do not include the timestamp.\n//\n// If b is non-nil, the provided buffer will be used for serializing small\n// values.  Otherwise a buffer will be drawn from the binarySerializer's pool\n// and return when the method finishes.\n//\n// NOTE: b MUST either be nil or at least an 8-byte slice.\nfunc writeNetAddressBuf(w io.Writer, pver uint32, na *NetAddress, ts bool, buf []byte) error {\n\t// NOTE: The bitcoin protocol uses a uint32 for the timestamp so it will\n\t// stop working somewhere around 2106.  Also timestamp wasn't added until\n\t// until protocol version >= NetAddressTimeVersion.\n\tif ts && pver >= NetAddressTimeVersion {\n\t\tlittleEndian.PutUint32(buf[:4], uint32(na.Timestamp.Unix()))\n\t\tif _, err := w.Write(buf[:4]); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tlittleEndian.PutUint64(buf, uint64(na.Services))\n\tif _, err := w.Write(buf); err != nil {\n\t\treturn err\n\t}\n\n\t// Ensure to always write 16 bytes even if the ip is nil.\n\tvar ip [16]byte\n\tif na.IP != nil {\n\t\tcopy(ip[:], na.IP.To16())\n\t}\n\tif _, err := w.Write(ip[:]); err != nil {\n\t\treturn err\n\t}\n\n\t// Sigh.  Bitcoin protocol mixes little and big endian.\n\tbigEndian.PutUint16(buf[:2], na.Port)\n\t_, err := w.Write(buf[:2])\n\n\treturn err\n}\n"
  },
  {
    "path": "wire/netaddress_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"net\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n)\n\n// TestNetAddress tests the NetAddress API.\nfunc TestNetAddress(t *testing.T) {\n\tip := net.ParseIP(\"127.0.0.1\")\n\tport := 8333\n\n\t// Test NewNetAddress.\n\tna := NewNetAddress(&net.TCPAddr{IP: ip, Port: port}, 0)\n\n\t// Ensure we get the same ip, port, and services back out.\n\tif !na.IP.Equal(ip) {\n\t\tt.Errorf(\"NetNetAddress: wrong ip - got %v, want %v\", na.IP, ip)\n\t}\n\tif na.Port != uint16(port) {\n\t\tt.Errorf(\"NetNetAddress: wrong port - got %v, want %v\", na.Port,\n\t\t\tport)\n\t}\n\tif na.Services != 0 {\n\t\tt.Errorf(\"NetNetAddress: wrong services - got %v, want %v\",\n\t\t\tna.Services, 0)\n\t}\n\tif na.HasService(SFNodeNetwork) {\n\t\tt.Errorf(\"HasService: SFNodeNetwork service is set\")\n\t}\n\n\t// Ensure adding the full service node flag works.\n\tna.AddService(SFNodeNetwork)\n\tif na.Services != SFNodeNetwork {\n\t\tt.Errorf(\"AddService: wrong services - got %v, want %v\",\n\t\t\tna.Services, SFNodeNetwork)\n\t}\n\tif !na.HasService(SFNodeNetwork) {\n\t\tt.Errorf(\"HasService: SFNodeNetwork service not set\")\n\t}\n\n\t// Ensure max payload is expected value for latest protocol version.\n\tpver := ProtocolVersion\n\twantPayload := uint32(30)\n\tmaxPayload := maxNetAddressPayload(ProtocolVersion)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"maxNetAddressPayload: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n\n\t// Protocol version before NetAddressTimeVersion when timestamp was\n\t// added.  Ensure max payload is expected value for it.\n\tpver = NetAddressTimeVersion - 1\n\twantPayload = 26\n\tmaxPayload = maxNetAddressPayload(pver)\n\tif maxPayload != wantPayload {\n\t\tt.Errorf(\"maxNetAddressPayload: wrong max payload length for \"+\n\t\t\t\"protocol version %d - got %v, want %v\", pver,\n\t\t\tmaxPayload, wantPayload)\n\t}\n}\n\n// TestNetAddressWire tests the NetAddress wire encode and decode for various\n// protocol versions and timestamp flag combinations.\nfunc TestNetAddressWire(t *testing.T) {\n\t// baseNetAddr is used in the various tests as a baseline NetAddress.\n\tbaseNetAddr := NetAddress{\n\t\tTimestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST\n\t\tServices:  SFNodeNetwork,\n\t\tIP:        net.ParseIP(\"127.0.0.1\"),\n\t\tPort:      8333,\n\t}\n\n\t// baseNetAddrNoTS is baseNetAddr with a zero value for the timestamp.\n\tbaseNetAddrNoTS := baseNetAddr\n\tbaseNetAddrNoTS.Timestamp = time.Time{}\n\n\t// baseNetAddrEncoded is the wire encoded bytes of baseNetAddr.\n\tbaseNetAddrEncoded := []byte{\n\t\t0x29, 0xab, 0x5f, 0x49, // Timestamp\n\t\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01, // IP 127.0.0.1\n\t\t0x20, 0x8d, // Port 8333 in big-endian\n\t}\n\n\t// baseNetAddrNoTSEncoded is the wire encoded bytes of baseNetAddrNoTS.\n\tbaseNetAddrNoTSEncoded := []byte{\n\t\t// No timestamp\n\t\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SFNodeNetwork\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01, // IP 127.0.0.1\n\t\t0x20, 0x8d, // Port 8333 in big-endian\n\t}\n\n\ttests := []struct {\n\t\tin   NetAddress // NetAddress to encode\n\t\tout  NetAddress // Expected decoded NetAddress\n\t\tts   bool       // Include timestamp?\n\t\tbuf  []byte     // Wire encoding\n\t\tpver uint32     // Protocol version for wire encoding\n\t}{\n\t\t// Latest protocol version without ts flag.\n\t\t{\n\t\t\tbaseNetAddr,\n\t\t\tbaseNetAddrNoTS,\n\t\t\tfalse,\n\t\t\tbaseNetAddrNoTSEncoded,\n\t\t\tProtocolVersion,\n\t\t},\n\n\t\t// Latest protocol version with ts flag.\n\t\t{\n\t\t\tbaseNetAddr,\n\t\t\tbaseNetAddr,\n\t\t\ttrue,\n\t\t\tbaseNetAddrEncoded,\n\t\t\tProtocolVersion,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion without ts flag.\n\t\t{\n\t\t\tbaseNetAddr,\n\t\t\tbaseNetAddrNoTS,\n\t\t\tfalse,\n\t\t\tbaseNetAddrNoTSEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion with ts flag.\n\t\t{\n\t\t\tbaseNetAddr,\n\t\t\tbaseNetAddr,\n\t\t\ttrue,\n\t\t\tbaseNetAddrEncoded,\n\t\t\tNetAddressTimeVersion,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion-1 without ts flag.\n\t\t{\n\t\t\tbaseNetAddr,\n\t\t\tbaseNetAddrNoTS,\n\t\t\tfalse,\n\t\t\tbaseNetAddrNoTSEncoded,\n\t\t\tNetAddressTimeVersion - 1,\n\t\t},\n\n\t\t// Protocol version NetAddressTimeVersion-1 with timestamp.\n\t\t// Even though the timestamp flag is set, this shouldn't have a\n\t\t// timestamp since it is a protocol version before it was\n\t\t// added.\n\t\t{\n\t\t\tbaseNetAddr,\n\t\t\tbaseNetAddrNoTS,\n\t\t\ttrue,\n\t\t\tbaseNetAddrNoTSEncoded,\n\t\t\tNetAddressTimeVersion - 1,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tvar buf bytes.Buffer\n\t\terr := writeNetAddress(&buf, test.pver, &test.in, test.ts)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"writeNetAddress #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(buf.Bytes(), test.buf) {\n\t\t\tt.Errorf(\"writeNetAddress #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(buf.Bytes()), spew.Sdump(test.buf))\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode the message from wire format.\n\t\tvar na NetAddress\n\t\trbuf := bytes.NewReader(test.buf)\n\t\terr = readNetAddress(rbuf, test.pver, &na, test.ts)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"readNetAddress #%d error %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !reflect.DeepEqual(na, test.out) {\n\t\t\tt.Errorf(\"readNetAddress #%d\\n got: %s want: %s\", i,\n\t\t\t\tspew.Sdump(na), spew.Sdump(test.out))\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestNetAddressWireErrors performs negative tests against wire encode and\n// decode NetAddress to confirm error paths work correctly.\nfunc TestNetAddressWireErrors(t *testing.T) {\n\tpver := ProtocolVersion\n\tpverNAT := NetAddressTimeVersion - 1\n\n\t// baseNetAddr is used in the various tests as a baseline NetAddress.\n\tbaseNetAddr := NetAddress{\n\t\tTimestamp: time.Unix(0x495fab29, 0), // 2009-01-03 12:15:05 -0600 CST\n\t\tServices:  SFNodeNetwork,\n\t\tIP:        net.ParseIP(\"127.0.0.1\"),\n\t\tPort:      8333,\n\t}\n\n\ttests := []struct {\n\t\tin       *NetAddress // Value to encode\n\t\tbuf      []byte      // Wire encoding\n\t\tpver     uint32      // Protocol version for wire encoding\n\t\tts       bool        // Include timestamp flag\n\t\tmax      int         // Max size of fixed buffer to induce errors\n\t\twriteErr error       // Expected write error\n\t\treadErr  error       // Expected read error\n\t}{\n\t\t// Latest protocol version with timestamp and intentional\n\t\t// read/write errors.\n\t\t// Force errors on timestamp.\n\t\t{&baseNetAddr, []byte{}, pver, true, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force errors on services.\n\t\t{&baseNetAddr, []byte{}, pver, true, 4, io.ErrShortWrite, io.EOF},\n\t\t// Force errors on ip.\n\t\t{&baseNetAddr, []byte{}, pver, true, 12, io.ErrShortWrite, io.EOF},\n\t\t// Force errors on port.\n\t\t{&baseNetAddr, []byte{}, pver, true, 28, io.ErrShortWrite, io.EOF},\n\n\t\t// Latest protocol version with no timestamp and intentional\n\t\t// read/write errors.\n\t\t// Force errors on services.\n\t\t{&baseNetAddr, []byte{}, pver, false, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force errors on ip.\n\t\t{&baseNetAddr, []byte{}, pver, false, 8, io.ErrShortWrite, io.EOF},\n\t\t// Force errors on port.\n\t\t{&baseNetAddr, []byte{}, pver, false, 24, io.ErrShortWrite, io.EOF},\n\n\t\t// Protocol version before NetAddressTimeVersion with timestamp\n\t\t// flag set (should not have timestamp due to old protocol\n\t\t// version) and  intentional read/write errors.\n\t\t// Force errors on services.\n\t\t{&baseNetAddr, []byte{}, pverNAT, true, 0, io.ErrShortWrite, io.EOF},\n\t\t// Force errors on ip.\n\t\t{&baseNetAddr, []byte{}, pverNAT, true, 8, io.ErrShortWrite, io.EOF},\n\t\t// Force errors on port.\n\t\t{&baseNetAddr, []byte{}, pverNAT, true, 24, io.ErrShortWrite, io.EOF},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\t// Encode to wire format.\n\t\tw := newFixedWriter(test.max)\n\t\terr := writeNetAddress(w, test.pver, test.in, test.ts)\n\t\tif err != test.writeErr {\n\t\t\tt.Errorf(\"writeNetAddress #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.writeErr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Decode from wire format.\n\t\tvar na NetAddress\n\t\tr := newFixedReader(test.max, test.buf)\n\t\terr = readNetAddress(r, test.pver, &na, test.ts)\n\t\tif err != test.readErr {\n\t\t\tt.Errorf(\"readNetAddress #%d wrong error got: %v, want: %v\",\n\t\t\t\ti, err, test.readErr)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/netaddressv2.go",
    "content": "package wire\n\nimport (\n\t\"bytes\"\n\t\"encoding/base32\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"strings\"\n\t\"time\"\n\n\t\"golang.org/x/crypto/sha3\"\n)\n\nconst (\n\t// maxAddrV2Size is the maximum size an address may be in the addrv2\n\t// message.\n\tmaxAddrV2Size = 512\n)\n\nvar (\n\t// ErrInvalidAddressSize is an error that means an incorrect address\n\t// size was decoded for a networkID or that the address exceeded the\n\t// maximum size for an unknown networkID.\n\tErrInvalidAddressSize = fmt.Errorf(\"invalid address size\")\n\n\t// ErrSkippedNetworkID is returned when the cjdns, i2p, or unknown\n\t// networks are encountered during decoding. btcd does not support i2p\n\t// or cjdns addresses. In the case of an unknown networkID, this is so\n\t// that a future BIP reserving a new networkID does not cause older\n\t// addrv2-supporting btcd software to disconnect upon receiving the new\n\t// addresses. This error can also be returned when an OnionCat-encoded\n\t// torv2 address is received with the ipv6 networkID. This error\n\t// signals to the caller to continue reading.\n\tErrSkippedNetworkID = fmt.Errorf(\"skipped networkID\")\n)\n\n// maxNetAddressV2Payload returns the max payload size for an address used in\n// the addrv2 message.\nfunc maxNetAddressV2Payload() uint32 {\n\t// The timestamp takes up four bytes.\n\tplen := uint32(4)\n\n\t// The ServiceFlag is a varint and its maximum size is 9 bytes.\n\tplen += 9\n\n\t// The netID is a single byte.\n\tplen += 1\n\n\t// The largest address is 512 bytes. Even though it will not be a valid\n\t// address, we should read and ignore it. The preceding varint to\n\t// store 512 bytes is 3 bytes long. This gives us a total of 515 bytes.\n\tplen += 515\n\n\t// The port is 2 bytes.\n\tplen += 2\n\n\treturn plen\n}\n\n// isOnionCatTor returns whether a given ip address is actually an encoded tor\n// v2 address. The wire package is unable to use the addrmgr's IsOnionCatTor as\n// doing so would give an import cycle.\nfunc isOnionCatTor(ip net.IP) bool {\n\tonionCatNet := net.IPNet{\n\t\tIP:   net.ParseIP(\"fd87:d87e:eb43::\"),\n\t\tMask: net.CIDRMask(48, 128),\n\t}\n\treturn onionCatNet.Contains(ip)\n}\n\n// ipv4MappedPrefix is the prefix for IPv4-mapped IPv6 addresses (::ffff:0:0/96)\n// as defined by RFC 4291.\nvar ipv4MappedPrefix = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}\n\n// isIPv4Mapped returns whether a given 16-byte IPv6 address is actually an\n// IPv4-mapped IPv6 address (::ffff:0:0/96).\nfunc isIPv4Mapped(addr []byte) bool {\n\treturn bytes.HasPrefix(addr, ipv4MappedPrefix)\n}\n\n// NetAddressV2 defines information about a peer on the network including the\n// last time it was seen, the services it supports, its address, and port. This\n// struct is used in the addrv2 message (MsgAddrV2) and can contain larger\n// addresses, like Tor. Additionally, it can contain any NetAddress address.\ntype NetAddressV2 struct {\n\t// Last time the address was seen. This is, unfortunately, encoded as a\n\t// uint32 on the wire and therefore is limited to 2106. This field is\n\t// not present in the bitcoin version message (MsgVersion) nor was it\n\t// added until protocol version >= NetAddressTimeVersion.\n\tTimestamp time.Time\n\n\t// Services is a bitfield which identifies the services supported by\n\t// the address. This is encoded in CompactSize.\n\tServices ServiceFlag\n\n\t// Addr is the network address of the peer. This is a variable-length\n\t// address. Network() returns the BIP-155 networkID which is a uint8\n\t// encoded as a string. String() returns the address as a string.\n\tAddr net.Addr\n\n\t// Port is the port of the address. This is 0 if the network doesn't\n\t// use ports.\n\tPort uint16\n}\n\n// HasService returns whether the specified service is supported by the\n// address.\nfunc (na *NetAddressV2) HasService(service ServiceFlag) bool {\n\treturn na.Services&service == service\n}\n\n// AddService adds a service to the Services bitfield.\nfunc (na *NetAddressV2) AddService(service ServiceFlag) {\n\tna.Services |= service\n}\n\n// ToLegacy attempts to convert a NetAddressV2 to a legacy NetAddress. This\n// only works for ipv4, ipv6, or torv2 addresses as they can be encoded with\n// the OnionCat encoding. If this method is called on a torv3 address, nil will\n// be returned.\nfunc (na *NetAddressV2) ToLegacy() *NetAddress {\n\tlegacyNa := &NetAddress{\n\t\tTimestamp: na.Timestamp,\n\t\tServices:  na.Services,\n\t\tPort:      na.Port,\n\t}\n\n\tswitch a := na.Addr.(type) {\n\tcase *ipv4Addr:\n\t\tlegacyNa.IP = a.addr[:]\n\tcase *ipv6Addr:\n\t\tlegacyNa.IP = a.addr[:]\n\tcase *torv2Addr:\n\t\tlegacyNa.IP = a.onionCatEncoding()\n\tcase *torv3Addr:\n\t\treturn nil\n\t}\n\n\treturn legacyNa\n}\n\n// IsTorV3 returns a bool that signals to the caller whether or not this is a\n// torv3 address.\nfunc (na *NetAddressV2) IsTorV3() bool {\n\t_, ok := na.Addr.(*torv3Addr)\n\treturn ok\n}\n\n// TorV3Key returns the first byte of the v3 public key. This is used in the\n// addrmgr to calculate a key from a network group.\nfunc (na *NetAddressV2) TorV3Key() byte {\n\t// This should never be called on a non-torv3 address.\n\taddr, ok := na.Addr.(*torv3Addr)\n\tif !ok {\n\t\tpanic(\"unexpected TorV3Key call on non-torv3 address\")\n\t}\n\n\treturn addr.addr[0]\n}\n\n// NetAddressV2FromBytes creates a NetAddressV2 from a byte slice. It will\n// also handle a torv2 address using the OnionCat encoding.\nfunc NetAddressV2FromBytes(timestamp time.Time, services ServiceFlag,\n\taddrBytes []byte, port uint16) *NetAddressV2 {\n\n\tvar netAddr net.Addr\n\tswitch len(addrBytes) {\n\tcase ipv4Size:\n\t\taddr := &ipv4Addr{}\n\t\taddr.netID = ipv4\n\t\tcopy(addr.addr[:], addrBytes)\n\t\tnetAddr = addr\n\tcase ipv6Size:\n\t\tif isOnionCatTor(addrBytes) {\n\t\t\taddr := &torv2Addr{}\n\t\t\taddr.netID = torv2\n\t\t\tcopy(addr.addr[:], addrBytes[6:])\n\t\t\tnetAddr = addr\n\t\t\tbreak\n\t\t}\n\n\t\taddr := &ipv6Addr{}\n\t\taddr.netID = ipv6\n\t\tcopy(addr.addr[:], addrBytes)\n\t\tnetAddr = addr\n\tcase torv2Size:\n\t\taddr := &torv2Addr{}\n\t\taddr.netID = torv2\n\t\tcopy(addr.addr[:], addrBytes)\n\t\tnetAddr = addr\n\tcase TorV3Size:\n\t\taddr := &torv3Addr{}\n\t\taddr.netID = torv3\n\t\tcopy(addr.addr[:], addrBytes)\n\t\tnetAddr = addr\n\t}\n\n\treturn &NetAddressV2{\n\t\tTimestamp: timestamp,\n\t\tServices:  services,\n\t\tAddr:      netAddr,\n\t\tPort:      port,\n\t}\n}\n\n// writeNetAddressV2 writes a NetAddressV2 to a writer.\nfunc writeNetAddressV2(w io.Writer, pver uint32, na *NetAddressV2) error {\n\terr := writeElement(w, uint32(na.Timestamp.Unix()))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := WriteVarInt(w, pver, uint64(na.Services)); err != nil {\n\t\treturn err\n\t}\n\n\tvar (\n\t\tnetID   networkID\n\t\taddress []byte\n\t)\n\n\tswitch a := na.Addr.(type) {\n\tcase *ipv4Addr:\n\t\tnetID = a.netID\n\t\taddress = a.addr[:]\n\tcase *ipv6Addr:\n\t\tnetID = a.netID\n\t\taddress = a.addr[:]\n\tcase *torv2Addr:\n\t\tnetID = a.netID\n\t\taddress = a.addr[:]\n\tcase *torv3Addr:\n\t\tnetID = a.netID\n\t\taddress = a.addr[:]\n\tdefault:\n\t\t// This should not occur.\n\t\treturn fmt.Errorf(\"unexpected address type\")\n\t}\n\n\tif err := writeElement(w, netID); err != nil {\n\t\treturn err\n\t}\n\n\taddressSize := uint64(len(address))\n\tif err := WriteVarInt(w, pver, addressSize); err != nil {\n\t\treturn err\n\t}\n\n\tif err := writeElement(w, address); err != nil {\n\t\treturn err\n\t}\n\n\treturn binary.Write(w, bigEndian, na.Port)\n}\n\n// readNetAddressV2 reads a NetAddressV2 from a reader. This function has\n// checks that the corresponding write function doesn't. This is because\n// reading from the peer is untrusted whereas writing assumes we have already\n// validated the NetAddressV2.\nfunc readNetAddressV2(r io.Reader, pver uint32, na *NetAddressV2) error {\n\terr := readElement(r, (*uint32Time)(&na.Timestamp))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Services is encoded as a variable length integer in addrv2.\n\tservices, err := ReadVarInt(r, pver)\n\tif err != nil {\n\t\treturn err\n\t}\n\tna.Services = ServiceFlag(services)\n\n\tvar netID uint8\n\tif err := readElement(r, &netID); err != nil {\n\t\treturn err\n\t}\n\n\tdecodedSize, err := ReadVarInt(r, pver)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !isKnownNetworkID(netID) {\n\t\t// In the case of an unknown networkID, we'll read the address\n\t\t// size and error with ErrInvalidAddressSize if it's greater\n\t\t// than maxAddrV2Size. If the address size is within the valid\n\t\t// range, we'll just read and discard the address. In this\n\t\t// case, ErrSkippedNetworkID will be returned to signal to the\n\t\t// caller to continue reading.\n\t\tif decodedSize > maxAddrV2Size {\n\t\t\treturn ErrInvalidAddressSize\n\t\t}\n\n\t\t// The +2 is the port field.\n\t\tdiscardedAddrPort := make([]byte, decodedSize+2)\n\t\tif err := readElement(r, &discardedAddrPort); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn ErrSkippedNetworkID\n\t}\n\n\t// If the netID is an i2p or cjdns address, we'll advance the reader\n\t// and return a special error to signal to the caller to not use the\n\t// passed NetAddressV2 struct. Otherwise, we'll just read the address\n\t// and port without returning an error.\n\tswitch networkID(netID) {\n\tcase ipv4:\n\t\taddr := &ipv4Addr{}\n\t\taddr.netID = ipv4\n\t\tif decodedSize != uint64(ipv4Size) {\n\t\t\treturn ErrInvalidAddressSize\n\t\t}\n\n\t\tif err := readElement(r, &addr.addr); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tna.Port, err = binarySerializer.Uint16(r, bigEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tna.Addr = addr\n\tcase ipv6:\n\t\taddr := &ipv6Addr{}\n\t\taddr.netID = ipv6\n\t\tif decodedSize != uint64(ipv6Size) {\n\t\t\treturn ErrInvalidAddressSize\n\t\t}\n\n\t\tif err := readElement(r, &addr.addr); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tna.Port, err = binarySerializer.Uint16(r, bigEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tna.Addr = addr\n\n\t\t// BIP-155 says to ignore OnionCat addresses in addrv2\n\t\t// messages.\n\t\tif isOnionCatTor(addr.addr[:]) {\n\t\t\treturn ErrSkippedNetworkID\n\t\t}\n\n\t\t// Skip IPv4-mapped IPv6 addresses (RFC 4291). These addresses\n\t\t// should use networkID 0x01 (IPv4), not 0x02 (IPv6).\n\t\tif isIPv4Mapped(addr.addr[:]) {\n\t\t\treturn ErrSkippedNetworkID\n\t\t}\n\tcase torv2:\n\t\taddr := &torv2Addr{}\n\t\taddr.netID = torv2\n\t\tif decodedSize != uint64(torv2Size) {\n\t\t\treturn ErrInvalidAddressSize\n\t\t}\n\n\t\tif err := readElement(r, &addr.addr); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tna.Port, err = binarySerializer.Uint16(r, bigEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tna.Addr = addr\n\tcase torv3:\n\t\taddr := &torv3Addr{}\n\t\taddr.netID = torv3\n\t\tif decodedSize != uint64(TorV3Size) {\n\t\t\treturn ErrInvalidAddressSize\n\t\t}\n\n\t\tif err := readElement(r, &addr.addr); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tna.Port, err = binarySerializer.Uint16(r, bigEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// BIP-155 does not specify to validate the public key here.\n\t\t// bitcoind does not validate the ed25519 pubkey.\n\t\tna.Addr = addr\n\tcase i2p:\n\t\taddr := &i2pAddr{}\n\t\taddr.netID = i2p\n\t\tif decodedSize != uint64(i2pSize) {\n\t\t\treturn ErrInvalidAddressSize\n\t\t}\n\n\t\tif err := readElement(r, &addr.addr); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tna.Port, err = binarySerializer.Uint16(r, bigEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn ErrSkippedNetworkID\n\tcase cjdns:\n\t\taddr := &cjdnsAddr{}\n\t\taddr.netID = cjdns\n\t\tif decodedSize != uint64(cjdnsSize) {\n\t\t\treturn ErrInvalidAddressSize\n\t\t}\n\n\t\tif err := readElement(r, &addr.addr); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tna.Port, err = binarySerializer.Uint16(r, bigEndian)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn ErrSkippedNetworkID\n\t}\n\n\treturn nil\n}\n\n// networkID represents the network that a given address is in. CJDNS and I2P\n// addresses are not included.\ntype networkID uint8\n\nconst (\n\t// ipv4 means the following address is ipv4.\n\tipv4 networkID = iota + 1\n\n\t// ipv6 means the following address is ipv6.\n\tipv6\n\n\t// torv2 means the following address is a torv2 hidden service address.\n\ttorv2\n\n\t// torv3 means the following address is a torv3 hidden service address.\n\ttorv3\n\n\t// i2p means the following address is an i2p address.\n\ti2p\n\n\t// cjdns means the following address is a cjdns address.\n\tcjdns\n)\n\nconst (\n\t// ipv4Size is the size of an ipv4 address.\n\tipv4Size = 4\n\n\t// ipv6Size is the size of an ipv6 address.\n\tipv6Size = 16\n\n\t// torv2Size is the size of a torv2 address.\n\ttorv2Size = 10\n\n\t// TorV3Size is the size of a torv3 address in bytes.\n\tTorV3Size = 32\n\n\t// i2pSize is the size of an i2p address.\n\ti2pSize = 32\n\n\t// cjdnsSize is the size of a cjdns address.\n\tcjdnsSize = 16\n)\n\nconst (\n\t// TorV2EncodedSize is the size of a torv2 address encoded in base32\n\t// with the \".onion\" suffix.\n\tTorV2EncodedSize = 22\n\n\t// TorV3EncodedSize is the size of a torv3 address encoded in base32\n\t// with the \".onion\" suffix.\n\tTorV3EncodedSize = 62\n)\n\n// isKnownNetworkID returns true if the networkID is one listed above and false\n// otherwise.\nfunc isKnownNetworkID(netID uint8) bool {\n\treturn uint8(ipv4) <= netID && netID <= uint8(cjdns)\n}\n\ntype ipv4Addr struct {\n\taddr  [ipv4Size]byte\n\tnetID networkID\n}\n\n// Part of the net.Addr interface.\nfunc (a *ipv4Addr) String() string {\n\treturn net.IP(a.addr[:]).String()\n}\n\n// Part of the net.Addr interface.\nfunc (a *ipv4Addr) Network() string {\n\treturn string(a.netID)\n}\n\n// Compile-time constraints to check that ipv4Addr meets the net.Addr\n// interface.\nvar _ net.Addr = (*ipv4Addr)(nil)\n\ntype ipv6Addr struct {\n\taddr  [ipv6Size]byte\n\tnetID networkID\n}\n\n// Part of the net.Addr interface.\nfunc (a *ipv6Addr) String() string {\n\treturn net.IP(a.addr[:]).String()\n}\n\n// Part of the net.Addr interface.\nfunc (a *ipv6Addr) Network() string {\n\treturn string(a.netID)\n}\n\n// Compile-time constraints to check that ipv6Addr meets the net.Addr\n// interface.\nvar _ net.Addr = (*ipv4Addr)(nil)\n\ntype torv2Addr struct {\n\taddr  [torv2Size]byte\n\tnetID networkID\n}\n\n// Part of the net.Addr interface.\nfunc (a *torv2Addr) String() string {\n\tbase32Hash := base32.StdEncoding.EncodeToString(a.addr[:])\n\treturn strings.ToLower(base32Hash) + \".onion\"\n}\n\n// Part of the net.Addr interface.\nfunc (a *torv2Addr) Network() string {\n\treturn string(a.netID)\n}\n\n// onionCatEncoding returns a torv2 address as an ipv6 address.\nfunc (a *torv2Addr) onionCatEncoding() net.IP {\n\tprefix := []byte{0xfd, 0x87, 0xd8, 0x7e, 0xeb, 0x43}\n\treturn net.IP(append(prefix, a.addr[:]...))\n}\n\n// Compile-time constraints to check that torv2Addr meets the net.Addr\n// interface.\nvar _ net.Addr = (*torv2Addr)(nil)\n\ntype torv3Addr struct {\n\taddr  [TorV3Size]byte\n\tnetID networkID\n}\n\n// Part of the net.Addr interface.\nfunc (a *torv3Addr) String() string {\n\t// BIP-155 describes the torv3 address format:\n\t// onion_address = base32(PUBKEY | CHECKSUM | VERSION) + \".onion\"\n\t// CHECKSUM = H(\".onion checksum\" | PUBKEY | VERSION)[:2]\n\t// PUBKEY = addr, which is the ed25519 pubkey of the hidden service.\n\t// VERSION = '\\x03'\n\t// H() is the SHA3-256 cryptographic hash function.\n\n\ttorV3Version := []byte(\"\\x03\")\n\tchecksumConst := []byte(\".onion checksum\")\n\n\t// Write never returns an error so there is no need to handle it.\n\th := sha3.New256()\n\th.Write(checksumConst)\n\th.Write(a.addr[:])\n\th.Write(torV3Version)\n\ttruncatedChecksum := h.Sum(nil)[:2]\n\n\tvar base32Input [35]byte\n\tcopy(base32Input[:32], a.addr[:])\n\tcopy(base32Input[32:34], truncatedChecksum)\n\tcopy(base32Input[34:], torV3Version)\n\n\tbase32Hash := base32.StdEncoding.EncodeToString(base32Input[:])\n\treturn strings.ToLower(base32Hash) + \".onion\"\n}\n\n// Part of the net.Addr interface.\nfunc (a *torv3Addr) Network() string {\n\treturn string(a.netID)\n}\n\n// Compile-time constraints to check that torv3Addr meets the net.Addr\n// interface.\nvar _ net.Addr = (*torv3Addr)(nil)\n\ntype i2pAddr struct {\n\taddr  [i2pSize]byte\n\tnetID networkID\n}\n\ntype cjdnsAddr struct {\n\taddr  [cjdnsSize]byte\n\tnetID networkID\n}\n"
  },
  {
    "path": "wire/netaddressv2_test.go",
    "content": "package wire\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"testing\"\n\t\"time\"\n)\n\n// TestIsIPv4Mapped tests that isIPv4Mapped correctly identifies IPv4-mapped\n// IPv6 addresses.\nfunc TestIsIPv4Mapped(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\taddr     []byte\n\t\texpected bool\n\t}{\n\t\t{\n\t\t\tname: \"IPv4-mapped ::ffff:192.0.2.1\",\n\t\t\taddr: []byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x02, 0x01,\n\t\t\t},\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname: \"IPv4-mapped ::ffff:127.0.0.1\",\n\t\t\taddr: []byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01,\n\t\t\t},\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname: \"Regular IPv6\",\n\t\t\taddr: []byte{\n\t\t\t\t0x20, 0x01, 0x09, 0xe8, 0x26, 0x15, 0x73, 0x00,\n\t\t\t\t0x09, 0x54, 0x12, 0x63, 0xef, 0xc8, 0x2e, 0x34,\n\t\t\t},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname: \"OnionCat Tor address\",\n\t\t\taddr: []byte{\n\t\t\t\t0xfd, 0x87, 0xd8, 0x7e, 0xeb, 0x43, 0xff, 0xfe,\n\t\t\t\t0xcc, 0x39, 0xa8, 0x73, 0x69, 0x15, 0xff, 0xff,\n\t\t\t},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"Short address (IPv4)\",\n\t\t\taddr:     []byte{0x7f, 0x00, 0x00, 0x01},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"Empty address\",\n\t\t\taddr:     []byte{},\n\t\t\texpected: false,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tresult := isIPv4Mapped(test.addr)\n\t\t\tif result != test.expected {\n\t\t\t\tt.Errorf(\"isIPv4Mapped(%v) = %v, want %v\",\n\t\t\t\t\ttest.addr, result, test.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestNetAddressV2FromBytes tests that NetAddressV2FromBytes works as\n// expected.\nfunc TestNetAddressV2FromBytes(t *testing.T) {\n\ttests := []struct {\n\t\taddrBytes       []byte\n\t\texpectedString  string\n\t\texpectedNetwork string\n\t}{\n\t\t// Ipv4 encoding\n\t\t{\n\t\t\t[]byte{0x7f, 0x00, 0x00, 0x01},\n\t\t\t\"127.0.0.1\",\n\t\t\tstring(ipv4),\n\t\t},\n\n\t\t// Ipv6 encoding\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x20, 0x01, 0x09, 0xe8, 0x26, 0x15, 0x73, 0x00,\n\t\t\t\t0x09, 0x54, 0x12, 0x63, 0xef, 0xc8, 0x2e, 0x34,\n\t\t\t},\n\t\t\t\"2001:9e8:2615:7300:954:1263:efc8:2e34\",\n\t\t\tstring(ipv6),\n\t\t},\n\n\t\t// OnionCat encoding\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0xfd, 0x87, 0xd8, 0x7e, 0xeb, 0x43, 0xff, 0xfe,\n\t\t\t\t0xcc, 0x39, 0xa8, 0x73, 0x69, 0x15, 0xff, 0xff,\n\t\t\t},\n\t\t\t\"777myonionurl777.onion\",\n\t\t\tstring(torv2),\n\t\t},\n\n\t\t// Torv2 encoding\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0xff, 0xfe, 0xcc, 0x39, 0xa8, 0x73, 0x69, 0x15,\n\t\t\t\t0xff, 0xff,\n\t\t\t},\n\t\t\t\"777myonionurl777.onion\",\n\t\t\tstring(torv2),\n\t\t},\n\n\t\t// Torv3 encoding\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0xca, 0xd2, 0xd3, 0xc8, 0xdc, 0x9c, 0xc4, 0xd3,\n\t\t\t\t0x70, 0x33, 0x30, 0xc5, 0x23, 0xaf, 0x02, 0xed,\n\t\t\t\t0xc4, 0x9d, 0xf8, 0xc6, 0xb0, 0x4e, 0x74, 0x6d,\n\t\t\t\t0x3b, 0x51, 0x57, 0xa7, 0x15, 0xfe, 0x98, 0x35,\n\t\t\t},\n\t\t\t\"zljnhsg4ttcng4btgdcshlyc5xcj36ggwbhhi3j3kfl2ofp6ta26jlid.onion\",\n\t\t\tstring(torv3),\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tna := NetAddressV2FromBytes(time.Time{}, 0, test.addrBytes, 0)\n\n\t\tif test.expectedNetwork != string(torv3) {\n\t\t\tif na.ToLegacy() == nil {\n\t\t\t\tt.Errorf(\"Test #%d has nil legacy encoding\", i)\n\t\t\t}\n\t\t} else {\n\t\t\tif !na.IsTorV3() {\n\t\t\t\tt.Errorf(\"Test #%d is not torv3 address\", i)\n\t\t\t}\n\t\t}\n\n\t\tif na.Addr.String() != test.expectedString {\n\t\t\tt.Errorf(\"Test #%d did not match expected string\", i)\n\t\t}\n\n\t\tif na.Addr.Network() != test.expectedNetwork {\n\t\t\tt.Errorf(\"Test #%d did not match expected network\", i)\n\t\t}\n\n\t\tvar b bytes.Buffer\n\t\tif err := writeNetAddressV2(&b, 0, na); err != nil {\n\t\t\tt.Errorf(\"Test #%d failed writing address %v\", i, err)\n\t\t}\n\n\t\t// Assert that the written netID is equivalent to the above.\n\t\tif string(b.Bytes()[5]) != test.expectedNetwork {\n\t\t\tt.Errorf(\"Test #%d did not match expected network\", i)\n\t\t}\n\t}\n}\n\n// TestReadNetAddressV2 tests that readNetAddressV2 behaves as expected in\n// different scenarios.\nfunc TestReadNetAddressV2(t *testing.T) {\n\ttests := []struct {\n\t\tbuf             []byte\n\t\texpectedNetwork string\n\t\texpectedError   error\n\t}{\n\t\t// Invalid address size for unknown netID.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfd, 0xff,\n\t\t\t\t0xff,\n\t\t\t},\n\t\t\t\"\",\n\t\t\tErrInvalidAddressSize,\n\t\t},\n\n\t\t// Valid address size for unknown netID.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x20, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x22,\n\t\t\t\t0x22,\n\t\t\t},\n\t\t\t\"\",\n\t\t\tErrSkippedNetworkID,\n\t\t},\n\n\t\t// Invalid ipv4 size.\n\t\t{\n\t\t\t[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05},\n\t\t\t\"\",\n\t\t\tErrInvalidAddressSize,\n\t\t},\n\n\t\t// Valid ipv4 encoding.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x7f,\n\t\t\t\t0x00, 0x00, 0x01, 0x22, 0x22,\n\t\t\t},\n\t\t\tstring(ipv4),\n\t\t\tnil,\n\t\t},\n\n\t\t// Invalid ipv6 size.\n\t\t{\n\t\t\t[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfc},\n\t\t\t\"\",\n\t\t\tErrInvalidAddressSize,\n\t\t},\n\n\t\t// OnionCat encoding is skipped.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0xfd,\n\t\t\t\t0x87, 0xd8, 0x7e, 0xeb, 0x43, 0xff, 0xfe, 0xcc,\n\t\t\t\t0x39, 0xa8, 0x73, 0x69, 0x15, 0xff, 0xff, 0x22,\n\t\t\t\t0x22,\n\t\t\t},\n\t\t\t\"\",\n\t\t\tErrSkippedNetworkID,\n\t\t},\n\n\t\t// IPv4-mapped IPv6 encoding is skipped (::ffff:192.0.2.1).\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00,\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t\t\t0x00, 0xff, 0xff, 0xc0, 0x00, 0x02, 0x01, 0x22,\n\t\t\t\t0x22,\n\t\t\t},\n\t\t\t\"\",\n\t\t\tErrSkippedNetworkID,\n\t\t},\n\n\t\t// Valid ipv6 encoding.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0xff,\n\t\t\t\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t\t\t\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x22,\n\t\t\t\t0x22,\n\t\t\t},\n\t\t\tstring(ipv6),\n\t\t\tnil,\n\t\t},\n\n\t\t// Invalid torv2 size.\n\t\t{\n\t\t\t[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02},\n\t\t\t\"\",\n\t\t\tErrInvalidAddressSize,\n\t\t},\n\n\t\t// Valid torv2 encoding.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0a, 0x20,\n\t\t\t\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n\t\t\t\t0x20, 0x22, 0x22,\n\t\t\t},\n\t\t\tstring(torv2),\n\t\t\tnil,\n\t\t},\n\n\t\t// Invalid torv3 size.\n\t\t{\n\t\t\t[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02},\n\t\t\t\"\",\n\t\t\tErrInvalidAddressSize,\n\t\t},\n\n\t\t// Valid torv3 encoding.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x22,\n\t\t\t\t0x22,\n\t\t\t},\n\t\t\tstring(torv3),\n\t\t\tnil,\n\t\t},\n\n\t\t// Invalid i2p size.\n\t\t{\n\t\t\t[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02},\n\t\t\t\"\",\n\t\t\tErrInvalidAddressSize,\n\t\t},\n\n\t\t// Valid i2p encoding.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\n\t\t\t\t0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x22,\n\t\t\t\t0x22,\n\t\t\t},\n\t\t\tstring(i2p),\n\t\t\tErrSkippedNetworkID,\n\t\t},\n\n\t\t// Invalid cjdns size.\n\t\t{\n\t\t\t[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02},\n\t\t\t\"\",\n\t\t\tErrInvalidAddressSize,\n\t\t},\n\n\t\t// Valid cjdns encoding.\n\t\t{\n\t\t\t[]byte{\n\t\t\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x20,\n\t\t\t\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n\t\t\t\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,\n\t\t\t\t0x22,\n\t\t\t},\n\t\t\tstring(cjdns),\n\t\t\tErrSkippedNetworkID,\n\t\t},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tr := bytes.NewReader(test.buf)\n\t\tna := &NetAddressV2{}\n\n\t\terr := readNetAddressV2(r, 0, na)\n\t\tif err != test.expectedError {\n\t\t\tt.Errorf(\"Test #%d had unexpected error %v\", i, err)\n\t\t} else if err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Trying to read more should give EOF.\n\t\tvar b [1]byte\n\t\tif _, err := r.Read(b[:]); err != io.EOF {\n\t\t\tt.Errorf(\"Test #%d did not cleanly finish reading\", i)\n\t\t}\n\n\t\tif na.Addr.Network() != test.expectedNetwork {\n\t\t\tt.Errorf(\"Test #%d had unexpected network %v\", i,\n\t\t\t\tna.Addr.Network())\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "wire/protocol.go",
    "content": "// Copyright (c) 2013-2024 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// XXX pedro: we will probably need to bump this.\nconst (\n\t// ProtocolVersion is the latest protocol version this package supports.\n\tProtocolVersion uint32 = 70016\n\n\t// MultipleAddressVersion is the protocol version which added multiple\n\t// addresses per message (pver >= MultipleAddressVersion).\n\tMultipleAddressVersion uint32 = 209\n\n\t// NetAddressTimeVersion is the protocol version which added the\n\t// timestamp field (pver >= NetAddressTimeVersion).\n\tNetAddressTimeVersion uint32 = 31402\n\n\t// BIP0031Version is the protocol version AFTER which a pong message\n\t// and nonce field in ping were added (pver > BIP0031Version).\n\tBIP0031Version uint32 = 60000\n\n\t// BIP0035Version is the protocol version which added the mempool\n\t// message (pver >= BIP0035Version).\n\tBIP0035Version uint32 = 60002\n\n\t// BIP0037Version is the protocol version which added new connection\n\t// bloom filtering related messages and extended the version message\n\t// with a relay flag (pver >= BIP0037Version).\n\tBIP0037Version uint32 = 70001\n\n\t// RejectVersion is the protocol version which added a new reject\n\t// message.\n\tRejectVersion uint32 = 70002\n\n\t// BIP0111Version is the protocol version which added the SFNodeBloom\n\t// service flag.\n\tBIP0111Version uint32 = 70011\n\n\t// SendHeadersVersion is the protocol version which added a new\n\t// sendheaders message.\n\tSendHeadersVersion uint32 = 70012\n\n\t// FeeFilterVersion is the protocol version which added a new\n\t// feefilter message.\n\tFeeFilterVersion uint32 = 70013\n\n\t// AddrV2Version is the protocol version which added two new messages.\n\t// sendaddrv2 is sent during the version-verack handshake and signals\n\t// support for sending and receiving the addrv2 message. In the future,\n\t// new messages that occur during the version-verack handshake will not\n\t// come with a protocol version bump.\n\tAddrV2Version uint32 = 70016\n)\n\nconst (\n\t// NodeNetworkLimitedBlockThreshold is the number of blocks that a node\n\t// broadcasting SFNodeNetworkLimited MUST be able to serve from the tip.\n\tNodeNetworkLimitedBlockThreshold = 288\n)\n\n// ServiceFlag identifies services supported by a bitcoin peer.\ntype ServiceFlag uint64\n\nconst (\n\t// SFNodeNetwork is a flag used to indicate a peer is a full node.\n\tSFNodeNetwork ServiceFlag = 1 << iota\n\n\t// SFNodeGetUTXO is a flag used to indicate a peer supports the\n\t// getutxos and utxos commands (BIP0064).\n\tSFNodeGetUTXO\n\n\t// SFNodeBloom is a flag used to indicate a peer supports bloom\n\t// filtering.\n\tSFNodeBloom\n\n\t// SFNodeWitness is a flag used to indicate a peer supports blocks\n\t// and transactions including witness data (BIP0144).\n\tSFNodeWitness\n\n\t// SFNodeXthin is a flag used to indicate a peer supports xthin blocks.\n\tSFNodeXthin\n\n\t// SFNodeBit5 is a flag used to indicate a peer supports a service\n\t// defined by bit 5.\n\tSFNodeBit5\n\n\t// SFNodeCF is a flag used to indicate a peer supports committed\n\t// filters (CFs).\n\tSFNodeCF\n\n\t// SFNode2X is a flag used to indicate a peer is running the Segwit2X\n\t// software.\n\tSFNode2X\n\n\t// SFNodeNetWorkLimited is a flag used to indicate a peer supports serving\n\t// the last 288 blocks.\n\tSFNodeNetworkLimited = 1 << 10\n\n\t// SFNodeP2PV2 is a flag used to indicate a peer supports BIP324 v2\n\t// connections.\n\tSFNodeP2PV2 = 1 << 11\n)\n\n// Map of service flags back to their constant names for pretty printing.\nvar sfStrings = map[ServiceFlag]string{\n\tSFNodeNetwork:        \"SFNodeNetwork\",\n\tSFNodeGetUTXO:        \"SFNodeGetUTXO\",\n\tSFNodeBloom:          \"SFNodeBloom\",\n\tSFNodeWitness:        \"SFNodeWitness\",\n\tSFNodeXthin:          \"SFNodeXthin\",\n\tSFNodeBit5:           \"SFNodeBit5\",\n\tSFNodeCF:             \"SFNodeCF\",\n\tSFNode2X:             \"SFNode2X\",\n\tSFNodeNetworkLimited: \"SFNodeNetworkLimited\",\n\tSFNodeP2PV2:          \"SFNodeP2PV2\",\n}\n\n// orderedSFStrings is an ordered list of service flags from highest to\n// lowest.\nvar orderedSFStrings = []ServiceFlag{\n\tSFNodeNetwork,\n\tSFNodeGetUTXO,\n\tSFNodeBloom,\n\tSFNodeWitness,\n\tSFNodeXthin,\n\tSFNodeBit5,\n\tSFNodeCF,\n\tSFNode2X,\n\tSFNodeNetworkLimited,\n\tSFNodeP2PV2,\n}\n\n// HasFlag returns a bool indicating if the service has the given flag.\nfunc (f ServiceFlag) HasFlag(s ServiceFlag) bool {\n\treturn f&s == s\n}\n\n// String returns the ServiceFlag in human-readable form.\nfunc (f ServiceFlag) String() string {\n\t// No flags are set.\n\tif f == 0 {\n\t\treturn \"0x0\"\n\t}\n\n\t// Add individual bit flags.\n\ts := \"\"\n\tfor _, flag := range orderedSFStrings {\n\t\tif f&flag == flag {\n\t\t\ts += sfStrings[flag] + \"|\"\n\t\t\tf -= flag\n\t\t}\n\t}\n\n\t// Add any remaining flags which aren't accounted for as hex.\n\ts = strings.TrimRight(s, \"|\")\n\tif f != 0 {\n\t\ts += \"|0x\" + strconv.FormatUint(uint64(f), 16)\n\t}\n\ts = strings.TrimLeft(s, \"|\")\n\treturn s\n}\n\n// BitcoinNet represents which bitcoin network a message belongs to.\ntype BitcoinNet uint32\n\n// Constants used to indicate the message bitcoin network. They can also be\n// used to seek to the next message when a stream's state is unknown, but\n// this package does not provide that functionality since it's generally a\n// better idea to simply disconnect clients that are misbehaving over TCP.\nconst (\n\t// MainNet represents the main bitcoin network.\n\tMainNet BitcoinNet = 0xd9b4bef9\n\n\t// TestNet represents the regression test network.\n\tTestNet BitcoinNet = 0xdab5bffa\n\n\t// TestNet3 represents the test network (version 3).\n\tTestNet3 BitcoinNet = 0x0709110b\n\n\t// TestNet4 represents the test network (version 4).\n\tTestNet4 BitcoinNet = 0x283f161c\n\n\t// SigNet represents the public default SigNet. For custom signets,\n\t// see CustomSignetParams.\n\tSigNet BitcoinNet = 0x40CF030A\n\n\t// SimNet represents the simulation test network.\n\tSimNet BitcoinNet = 0x12141c16\n)\n\n// bnStrings is a map of bitcoin networks back to their constant names for\n// pretty printing.\nvar bnStrings = map[BitcoinNet]string{\n\tMainNet:  \"MainNet\",\n\tTestNet:  \"TestNet\",\n\tTestNet3: \"TestNet3\",\n\tTestNet4: \"TestNet4\",\n\tSigNet:   \"SigNet\",\n\tSimNet:   \"SimNet\",\n}\n\n// String returns the BitcoinNet in human-readable form.\nfunc (n BitcoinNet) String() string {\n\tif s, ok := bnStrings[n]; ok {\n\t\treturn s\n\t}\n\n\treturn fmt.Sprintf(\"Unknown BitcoinNet (%d)\", uint32(n))\n}\n"
  },
  {
    "path": "wire/protocol_test.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage wire\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\n// TestServiceFlagStringer tests the stringized output for service flag types.\nfunc TestServiceFlagStringer(t *testing.T) {\n\ttests := []struct {\n\t\tin   ServiceFlag\n\t\twant string\n\t}{\n\t\t{0, \"0x0\"},\n\t\t{SFNodeNetwork, \"SFNodeNetwork\"},\n\t\t{SFNodeGetUTXO, \"SFNodeGetUTXO\"},\n\t\t{SFNodeBloom, \"SFNodeBloom\"},\n\t\t{SFNodeWitness, \"SFNodeWitness\"},\n\t\t{SFNodeXthin, \"SFNodeXthin\"},\n\t\t{SFNodeBit5, \"SFNodeBit5\"},\n\t\t{SFNodeCF, \"SFNodeCF\"},\n\t\t{SFNode2X, \"SFNode2X\"},\n\t\t{SFNodeNetworkLimited, \"SFNodeNetworkLimited\"},\n\t\t{0xffffffff, \"SFNodeNetwork|SFNodeGetUTXO|SFNodeBloom|SFNodeWitness|SFNodeXthin|SFNodeBit5|SFNodeCF|SFNode2X|SFNodeNetworkLimited|SFNodeP2PV2|0xfffff300\"},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.String()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"String #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// TestBitcoinNetStringer tests the stringized output for bitcoin net types.\nfunc TestBitcoinNetStringer(t *testing.T) {\n\ttests := []struct {\n\t\tin   BitcoinNet\n\t\twant string\n\t}{\n\t\t{MainNet, \"MainNet\"},\n\t\t{TestNet, \"TestNet\"},\n\t\t{TestNet3, \"TestNet3\"},\n\t\t{TestNet4, \"TestNet4\"},\n\t\t{SigNet, \"SigNet\"},\n\t\t{SimNet, \"SimNet\"},\n\t\t{0xffffffff, \"Unknown BitcoinNet (4294967295)\"},\n\t}\n\n\tt.Logf(\"Running %d tests\", len(tests))\n\tfor i, test := range tests {\n\t\tresult := test.in.String()\n\t\tif result != test.want {\n\t\t\tt.Errorf(\"String #%d\\n got: %s want: %s\", i, result,\n\t\t\t\ttest.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc TestHasFlag(t *testing.T) {\n\ttests := []struct {\n\t\tin    ServiceFlag\n\t\tcheck ServiceFlag\n\t\twant  bool\n\t}{\n\t\t{0, SFNodeNetwork, false},\n\t\t{SFNodeNetwork | SFNodeNetworkLimited | SFNodeWitness, SFNodeBloom, false},\n\t\t{SFNodeNetwork | SFNodeNetworkLimited | SFNodeWitness, SFNodeNetworkLimited, true},\n\t}\n\n\tfor _, test := range tests {\n\t\trequire.Equal(t, test.want, test.in.HasFlag(test.check))\n\t}\n}\n"
  }
]